diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index 45ce81c2caf..70e1997a82e 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -58,13 +58,8 @@ jobs: test_name: Style check runner_type: style-checker-aarch64 run_command: | - python3 style_check.py + python3 style_check.py --no-push data: ${{ needs.RunConfig.outputs.data }} - secrets: - secret_envs: | - ROBOT_CLICKHOUSE_SSH_KEY<> "$GITHUB_ENV" << 'EOF' ${{inputs.additional_envs}} - ${{secrets.secret_envs}} DOCKER_TAG<> "$GITHUB_ENV" - name: Apply sparse checkout for contrib # in order to check that it doesn't break build diff --git a/.github/workflows/reusable_build_stage.yml b/.github/workflows/reusable_build_stage.yml index fbb6f8cbae9..77b63ccc283 100644 --- a/.github/workflows/reusable_build_stage.yml +++ b/.github/workflows/reusable_build_stage.yml @@ -18,8 +18,11 @@ name: BuildStageWF type: string required: true secrets: - secret_envs: - description: if given, it's passed to the environments + robot_git_token: + required: false + ci_db_url: + required: false + ci_db_password: required: false jobs: @@ -39,4 +42,6 @@ jobs: checkout_depth: 0 data: ${{ inputs.data }} secrets: - secret_envs: ${{ secrets.secret_envs }} + robot_git_token: ${{ secrets.robot_git_token }} + ci_db_url: ${{ secrets.ci_db_url }} + ci_db_password: ${{ secrets.ci_db_password }} diff --git a/.github/workflows/reusable_simple_job.yml b/.github/workflows/reusable_simple_job.yml index 7df98d96f79..247569c4f52 100644 --- a/.github/workflows/reusable_simple_job.yml +++ b/.github/workflows/reusable_simple_job.yml @@ -45,8 +45,11 @@ name: Simple job type: boolean default: false secrets: - secret_envs: - description: if given, it's passed to the environments + robot_git_token: + required: false + ci_db_url: + required: false + ci_db_password: required: false @@ -77,7 +80,15 @@ jobs: cat >> "$GITHUB_ENV" << 'EOF' CHECK_NAME=${{ inputs.test_name }} ${{inputs.additional_envs}} - ${{secrets.secret_envs}} + ROBOT_CLICKHOUSE_SSH_KEY<> "$GITHUB_ENV" << 'EOF' CHECK_NAME=${{ inputs.test_name }} ${{inputs.additional_envs}} - ${{secrets.secret_envs}} DOCKER_TAG< 0; } diff --git a/base/poco/Net/src/HTTPServerParams.cpp b/base/poco/Net/src/HTTPServerParams.cpp index cc871611111..e47417d4b64 100644 --- a/base/poco/Net/src/HTTPServerParams.cpp +++ b/base/poco/Net/src/HTTPServerParams.cpp @@ -22,7 +22,7 @@ namespace Net { HTTPServerParams::HTTPServerParams(): _timeout(60000000), _keepAlive(true), - _maxKeepAliveRequests(0), + _maxKeepAliveRequests(100), _keepAliveTimeout(15000000) { } @@ -32,12 +32,12 @@ HTTPServerParams::~HTTPServerParams() { } - + void HTTPServerParams::setServerName(const std::string& serverName) { _serverName = serverName; } - + void HTTPServerParams::setSoftwareVersion(const std::string& softwareVersion) { @@ -50,24 +50,24 @@ void HTTPServerParams::setTimeout(const Poco::Timespan& timeout) _timeout = timeout; } - + void HTTPServerParams::setKeepAlive(bool keepAlive) { _keepAlive = keepAlive; } - + void HTTPServerParams::setKeepAliveTimeout(const Poco::Timespan& timeout) { _keepAliveTimeout = timeout; } - -void HTTPServerParams::setMaxKeepAliveRequests(int maxKeepAliveRequests) + +void HTTPServerParams::setMaxKeepAliveRequests(size_t maxKeepAliveRequests) { poco_assert (maxKeepAliveRequests >= 0); _maxKeepAliveRequests = maxKeepAliveRequests; } - + } } // namespace Poco::Net diff --git a/base/poco/Net/src/HTTPServerSession.cpp b/base/poco/Net/src/HTTPServerSession.cpp index 8eec3e14872..5227c15ebc2 100644 --- a/base/poco/Net/src/HTTPServerSession.cpp +++ b/base/poco/Net/src/HTTPServerSession.cpp @@ -50,14 +50,14 @@ bool HTTPServerSession::hasMoreRequests() --_maxKeepAliveRequests; return socket().poll(getTimeout(), Socket::SELECT_READ); } - else if (_maxKeepAliveRequests != 0 && getKeepAlive()) + else if (canKeepAlive()) { if (_maxKeepAliveRequests > 0) --_maxKeepAliveRequests; return buffered() > 0 || socket().poll(_keepAliveTimeout, Socket::SELECT_READ); } - else - return false; + else + return false; } diff --git a/base/poco/Net/src/TCPServerConnection.cpp b/base/poco/Net/src/TCPServerConnection.cpp index 1072b182c23..2148af4267b 100644 --- a/base/poco/Net/src/TCPServerConnection.cpp +++ b/base/poco/Net/src/TCPServerConnection.cpp @@ -18,7 +18,6 @@ using Poco::Exception; -using Poco::ErrorHandler; namespace Poco { @@ -31,9 +30,7 @@ TCPServerConnection::TCPServerConnection(const StreamSocket& socket): } -TCPServerConnection::~TCPServerConnection() -{ -} +TCPServerConnection::~TCPServerConnection() = default; void TCPServerConnection::start() diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index fa0f95245f2..f9c57dc7fa1 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -217,7 +217,9 @@ add_contrib (libssh-cmake libssh) add_contrib (prometheus-protobufs-cmake prometheus-protobufs prometheus-protobufs-gogo) -add_contrib(numactl-cmake numactl) +add_contrib (numactl-cmake numactl) + +add_contrib (jwt-cpp-cmake jwt-cpp) # Put all targets defined here and in subdirectories under "contrib/" folders in GUI-based IDEs. # Some of third-party projects may override CMAKE_FOLDER or FOLDER property of their targets, so they would not appear diff --git a/contrib/jwt-cpp b/contrib/jwt-cpp new file mode 160000 index 00000000000..a6927cb8140 --- /dev/null +++ b/contrib/jwt-cpp @@ -0,0 +1 @@ +Subproject commit a6927cb8140858c34e05d1a954626b9849fbcdfc diff --git a/contrib/jwt-cpp-cmake/CMakeLists.txt b/contrib/jwt-cpp-cmake/CMakeLists.txt new file mode 100644 index 00000000000..4cb8716bc68 --- /dev/null +++ b/contrib/jwt-cpp-cmake/CMakeLists.txt @@ -0,0 +1,23 @@ +set(ENABLE_JWT_CPP_DEFAULT OFF) +if(ENABLE_LIBRARIES AND CLICKHOUSE_CLOUD) + set(ENABLE_JWT_CPP_DEFAULT ON) +endif() + +option(ENABLE_JWT_CPP "Enable jwt-cpp library" ${ENABLE_JWT_CPP_DEFAULT}) + +if (NOT ENABLE_JWT_CPP) + message(STATUS "Not using jwt-cpp") + return() +endif() + +if(ENABLE_JWT_CPP) + if(NOT TARGET OpenSSL::Crypto) + message (${RECONFIGURE_MESSAGE_LEVEL} "Can't use jwt-cpp without OpenSSL") + endif() +endif() + +set (JWT_CPP_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/jwt-cpp/include") + +add_library (_jwt-cpp INTERFACE) +target_include_directories(_jwt-cpp SYSTEM BEFORE INTERFACE ${JWT_CPP_INCLUDE_DIR}) +add_library(ch_contrib::jwt-cpp ALIAS _jwt-cpp) diff --git a/docker/keeper/Dockerfile b/docker/keeper/Dockerfile index 4ecc087afb4..0d75c0bd225 100644 --- a/docker/keeper/Dockerfile +++ b/docker/keeper/Dockerfile @@ -31,14 +31,14 @@ COPY entrypoint.sh /entrypoint.sh ARG TARGETARCH RUN arch=${TARGETARCH:-amd64} \ && case $arch in \ - amd64) mkdir -p /lib64 && ln -sf /lib/ld-2.31.so /lib64/ld-linux-x86-64.so.2 ;; \ - arm64) ln -sf /lib/ld-2.31.so /lib/ld-linux-aarch64.so.1 ;; \ + amd64) mkdir -p /lib64 && ln -sf /lib/ld-2.35.so /lib64/ld-linux-x86-64.so.2 ;; \ + arm64) ln -sf /lib/ld-2.35.so /lib/ld-linux-aarch64.so.1 ;; \ esac # lts / testing / prestable / etc ARG REPO_CHANNEL="stable" ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}" -ARG VERSION="24.10.1.2812" +ARG VERSION="24.10.2.80" ARG PACKAGES="clickhouse-keeper" ARG DIRECT_DOWNLOAD_URLS="" @@ -86,7 +86,8 @@ RUN arch=${TARGETARCH:-amd64} \ ARG DEFAULT_CONFIG_DIR="/etc/clickhouse-keeper" ARG DEFAULT_DATA_DIR="/var/lib/clickhouse-keeper" ARG DEFAULT_LOG_DIR="/var/log/clickhouse-keeper" -RUN mkdir -p "${DEFAULT_DATA_DIR}" "${DEFAULT_LOG_DIR}" "${DEFAULT_CONFIG_DIR}" \ +RUN clickhouse-keeper --version \ + && mkdir -p "${DEFAULT_DATA_DIR}" "${DEFAULT_LOG_DIR}" "${DEFAULT_CONFIG_DIR}" \ && chown clickhouse:clickhouse "${DEFAULT_DATA_DIR}" \ && chown root:clickhouse "${DEFAULT_LOG_DIR}" \ && chmod ugo+Xrw -R "${DEFAULT_DATA_DIR}" "${DEFAULT_LOG_DIR}" "${DEFAULT_CONFIG_DIR}" diff --git a/docker/server/Dockerfile.alpine b/docker/server/Dockerfile.alpine index 93acf1a5773..5b3d86ca3e6 100644 --- a/docker/server/Dockerfile.alpine +++ b/docker/server/Dockerfile.alpine @@ -35,7 +35,7 @@ RUN arch=${TARGETARCH:-amd64} \ # lts / testing / prestable / etc ARG REPO_CHANNEL="stable" ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}" -ARG VERSION="24.10.1.2812" +ARG VERSION="24.10.2.80" ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static" ARG DIRECT_DOWNLOAD_URLS="" diff --git a/docker/server/Dockerfile.ubuntu b/docker/server/Dockerfile.ubuntu index e6bde845c4e..2e56f676cbc 100644 --- a/docker/server/Dockerfile.ubuntu +++ b/docker/server/Dockerfile.ubuntu @@ -28,7 +28,7 @@ RUN sed -i "s|http://archive.ubuntu.com|${apt_archive}|g" /etc/apt/sources.list ARG REPO_CHANNEL="stable" ARG REPOSITORY="deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb ${REPO_CHANNEL} main" -ARG VERSION="24.10.1.2812" +ARG VERSION="24.10.2.80" ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static" #docker-official-library:off diff --git a/docs/changelogs/v24.10.2.80-stable.md b/docs/changelogs/v24.10.2.80-stable.md new file mode 100644 index 00000000000..18b11df41ef --- /dev/null +++ b/docs/changelogs/v24.10.2.80-stable.md @@ -0,0 +1,61 @@ +--- +sidebar_position: 1 +sidebar_label: 2024 +--- + +# 2024 Changelog + +### ClickHouse release v24.10.2.80-stable (96b80057159) FIXME as compared to v24.10.1.2812-stable (9cd0a3738d5) + +#### Backward Incompatible Change +* Backported in [#71363](https://github.com/ClickHouse/ClickHouse/issues/71363): Fix possible error `No such file or directory` due to unescaped special symbols in files for JSON subcolumns. [#71182](https://github.com/ClickHouse/ClickHouse/pull/71182) ([Pavel Kruglov](https://github.com/Avogar)). + +#### Performance Improvement +* Backported in [#71852](https://github.com/ClickHouse/ClickHouse/issues/71852): Improve the performance and accuracy of system.query_metric_log collection interval by reducing the critical region. [#71473](https://github.com/ClickHouse/ClickHouse/pull/71473) ([Pablo Marcos](https://github.com/pamarcos)). + +#### Improvement +* Backported in [#71495](https://github.com/ClickHouse/ClickHouse/issues/71495): Enable `parallel_replicas_local_plan` by default. Building a full-fledged local plan on the query initiator improves parallel replicas performance with less resource consumption, provides opportunities to apply more query optimizations. [#70171](https://github.com/ClickHouse/ClickHouse/pull/70171) ([Igor Nikonov](https://github.com/devcrafter)). +* Backported in [#71985](https://github.com/ClickHouse/ClickHouse/issues/71985): Fixes RIGHT / FULL joins in queries with parallel replicas. Now, RIGHT joins can be executed with parallel replicas (right table reading is distributed). FULL joins can't be parallelized among nodes, - executed locally. [#71162](https://github.com/ClickHouse/ClickHouse/pull/71162) ([Igor Nikonov](https://github.com/devcrafter)). +* Backported in [#71670](https://github.com/ClickHouse/ClickHouse/issues/71670): When user/group is given as ID, the `clickhouse su` fails. This patch fixes it to accept `UID:GID` as well. ### Documentation entry for user-facing changes. [#71626](https://github.com/ClickHouse/ClickHouse/pull/71626) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71940](https://github.com/ClickHouse/ClickHouse/issues/71940): Update `HostResolver` 3 times in a `history` period. [#71863](https://github.com/ClickHouse/ClickHouse/pull/71863) ([Sema Checherinda](https://github.com/CheSema)). +* Backported in [#71922](https://github.com/ClickHouse/ClickHouse/issues/71922): Allow_reorder_prewhere_conditions is on by default with old compatibility settings. [#71867](https://github.com/ClickHouse/ClickHouse/pull/71867) ([Raúl Marín](https://github.com/Algunenano)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Backported in [#71588](https://github.com/ClickHouse/ClickHouse/issues/71588): Fix mismatched aggreage function name of quantileExactWeightedInterpolated. The bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/69619. cc @Algunenano. [#71168](https://github.com/ClickHouse/ClickHouse/pull/71168) ([李扬](https://github.com/taiyang-li)). +* Backported in [#71357](https://github.com/ClickHouse/ClickHouse/issues/71357): Fix bad_weak_ptr exception with Dynamic in functions comparison. [#71183](https://github.com/ClickHouse/ClickHouse/pull/71183) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71467](https://github.com/ClickHouse/ClickHouse/issues/71467): Fix bug of memory usage increase if enable_filesystem_cache=1, but disk in storage configuration did not have any cache configuration. [#71261](https://github.com/ClickHouse/ClickHouse/pull/71261) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Backported in [#71355](https://github.com/ClickHouse/ClickHouse/issues/71355): Fix possible error "Cannot read all data" erros during deserialization of LowCardinality dictionary from Dynamic column. [#71299](https://github.com/ClickHouse/ClickHouse/pull/71299) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71324](https://github.com/ClickHouse/ClickHouse/issues/71324): Fix incomplete cleanup of parallel output format in the client. [#71304](https://github.com/ClickHouse/ClickHouse/pull/71304) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71466](https://github.com/ClickHouse/ClickHouse/issues/71466): Added missing unescaping in named collections. Without fix clickhouse-server can't start. [#71308](https://github.com/ClickHouse/ClickHouse/pull/71308) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Backported in [#71393](https://github.com/ClickHouse/ClickHouse/issues/71393): Fix inconsistent AST formatting when granting wrong wildcard grants [#71309](https://github.com/ClickHouse/ClickHouse/issues/71309). [#71332](https://github.com/ClickHouse/ClickHouse/pull/71332) ([pufit](https://github.com/pufit)). +* Backported in [#71379](https://github.com/ClickHouse/ClickHouse/issues/71379): Add try/catch to data parts destructors to avoid terminate. [#71364](https://github.com/ClickHouse/ClickHouse/pull/71364) ([alesapin](https://github.com/alesapin)). +* Backported in [#71751](https://github.com/ClickHouse/ClickHouse/issues/71751): Check suspicious and experimental types in JSON type hints. [#71369](https://github.com/ClickHouse/ClickHouse/pull/71369) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71451](https://github.com/ClickHouse/ClickHouse/issues/71451): Start memory worker thread on non-Linux OS too (fixes [#71051](https://github.com/ClickHouse/ClickHouse/issues/71051)). [#71384](https://github.com/ClickHouse/ClickHouse/pull/71384) ([Alexandre Snarskii](https://github.com/snar)). +* Backported in [#71608](https://github.com/ClickHouse/ClickHouse/issues/71608): Fix error Invalid number of rows in Chunk with Variant column. [#71388](https://github.com/ClickHouse/ClickHouse/pull/71388) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71493](https://github.com/ClickHouse/ClickHouse/issues/71493): Fix crash in `mongodb` table function when passing wrong arguments (e.g. `NULL`). [#71426](https://github.com/ClickHouse/ClickHouse/pull/71426) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Backported in [#71815](https://github.com/ClickHouse/ClickHouse/issues/71815): Fix crash with optimize_rewrite_array_exists_to_has. [#71432](https://github.com/ClickHouse/ClickHouse/pull/71432) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71521](https://github.com/ClickHouse/ClickHouse/issues/71521): Fix possible error `Argument for function must be constant` (old analyzer) in case when arrayJoin can apparently appear in `WHERE` condition. Regression after https://github.com/ClickHouse/ClickHouse/pull/65414. [#71476](https://github.com/ClickHouse/ClickHouse/pull/71476) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Backported in [#71555](https://github.com/ClickHouse/ClickHouse/issues/71555): Prevent crash in SortCursor with 0 columns (old analyzer). [#71494](https://github.com/ClickHouse/ClickHouse/pull/71494) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71618](https://github.com/ClickHouse/ClickHouse/issues/71618): Analyzer fix when query inside materialized view uses IN with CTE. Closes [#65598](https://github.com/ClickHouse/ClickHouse/issues/65598). [#71538](https://github.com/ClickHouse/ClickHouse/pull/71538) ([Maksim Kita](https://github.com/kitaisreal)). +* Backported in [#71570](https://github.com/ClickHouse/ClickHouse/issues/71570): Avoid crash when using a UDF in a constraint. [#71541](https://github.com/ClickHouse/ClickHouse/pull/71541) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71646](https://github.com/ClickHouse/ClickHouse/issues/71646): Return 0 or default char instead of throwing an error in bitShift functions in case of out of bounds. [#71580](https://github.com/ClickHouse/ClickHouse/pull/71580) ([Pablo Marcos](https://github.com/pamarcos)). +* Backported in [#71880](https://github.com/ClickHouse/ClickHouse/issues/71880): Fix LOGICAL_ERROR when doing ALTER with empty tuple. This fixes [#71647](https://github.com/ClickHouse/ClickHouse/issues/71647). [#71679](https://github.com/ClickHouse/ClickHouse/pull/71679) ([Amos Bird](https://github.com/amosbird)). +* Backported in [#71741](https://github.com/ClickHouse/ClickHouse/issues/71741): Don't transform constant set in predicates over partition columns in case of NOT IN operator. [#71695](https://github.com/ClickHouse/ClickHouse/pull/71695) ([Eduard Karacharov](https://github.com/korowa)). +* Backported in [#72012](https://github.com/ClickHouse/ClickHouse/issues/72012): Fix exception for toDayOfWeek on WHERE condition with primary key of DateTime64 type. [#71849](https://github.com/ClickHouse/ClickHouse/pull/71849) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Backported in [#71897](https://github.com/ClickHouse/ClickHouse/issues/71897): Fixed filling of defaults after parsing into sparse columns. [#71854](https://github.com/ClickHouse/ClickHouse/pull/71854) ([Anton Popov](https://github.com/CurtizJ)). +* Backported in [#71955](https://github.com/ClickHouse/ClickHouse/issues/71955): Fix data race between the progress indicator and the progress table in clickhouse-client. This issue is visible when FROM INFILE is used. Intercept keystrokes during INSERT queries to toggle progress table display. [#71901](https://github.com/ClickHouse/ClickHouse/pull/71901) ([Julia Kartseva](https://github.com/jkartseva)). +* Backported in [#72006](https://github.com/ClickHouse/ClickHouse/issues/72006): Fix a crash in clickhouse-client syntax highlighting. Closes [#71864](https://github.com/ClickHouse/ClickHouse/issues/71864). [#71949](https://github.com/ClickHouse/ClickHouse/pull/71949) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Build/Testing/Packaging Improvement +* Backported in [#71692](https://github.com/ClickHouse/ClickHouse/issues/71692): Improve clickhouse-server Dockerfile.ubuntu. Deprecate `CLICKHOUSE_UID/CLICKHOUSE_GID` envs. Remove `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` processing to complien requirements. Consistent `clickhouse/clickhouse-server/clickhouse-keeper` execution to not have it plain in one place and `/usr/bin/clickhouse*` in another. [#71573](https://github.com/ClickHouse/ClickHouse/pull/71573) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* Backported in [#71387](https://github.com/ClickHouse/ClickHouse/issues/71387): Remove bad test `test_system_replicated_fetches`. [#71071](https://github.com/ClickHouse/ClickHouse/pull/71071) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Backported in [#71586](https://github.com/ClickHouse/ClickHouse/issues/71586): Fix `WITH TOTALS` in subquery with parallel replicas. [#71224](https://github.com/ClickHouse/ClickHouse/pull/71224) ([Nikita Taranov](https://github.com/nickitat)). +* Backported in [#71437](https://github.com/ClickHouse/ClickHouse/issues/71437): Ignore `No such key` exceptions in some cases. [#71236](https://github.com/ClickHouse/ClickHouse/pull/71236) ([Antonio Andelic](https://github.com/antonio2368)). +* Backported in [#71629](https://github.com/ClickHouse/ClickHouse/issues/71629): Fix compatibility with refreshable materialized views created by old clickhouse servers. [#71556](https://github.com/ClickHouse/ClickHouse/pull/71556) ([Michael Kolupaev](https://github.com/al13n321)). +* Backported in [#71805](https://github.com/ClickHouse/ClickHouse/issues/71805): Fix issues we face on orphane backport branches and closed release PRs, when fake-master events are sent to the check DB. [#71782](https://github.com/ClickHouse/ClickHouse/pull/71782) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71832](https://github.com/ClickHouse/ClickHouse/issues/71832): Closes [#71780](https://github.com/ClickHouse/ClickHouse/issues/71780). [#71818](https://github.com/ClickHouse/ClickHouse/pull/71818) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Backported in [#71840](https://github.com/ClickHouse/ClickHouse/issues/71840): The change has already been applied to https://github.com/docker-library/official-images/pull/17876. Backport it to every branch to have a proper `Dockerfile.ubuntu` there. [#71825](https://github.com/ClickHouse/ClickHouse/pull/71825) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + diff --git a/docs/changelogs/v24.3.14.35-lts.md b/docs/changelogs/v24.3.14.35-lts.md new file mode 100644 index 00000000000..5106c14a0c2 --- /dev/null +++ b/docs/changelogs/v24.3.14.35-lts.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 1 +sidebar_label: 2024 +--- + +# 2024 Changelog + +### ClickHouse release v24.3.14.35-lts (cfa4e62b775) FIXME as compared to v24.3.13.40-lts (7acabd77389) + +#### Improvement +* Backported in [#71711](https://github.com/ClickHouse/ClickHouse/issues/71711): CLICKHOUSE_PASSWORD is escaped for XML in clickhouse image's entrypoint. [#69301](https://github.com/ClickHouse/ClickHouse/pull/69301) ([aohoyd](https://github.com/aohoyd)). +* Backported in [#71662](https://github.com/ClickHouse/ClickHouse/issues/71662): When user/group is given as ID, the `clickhouse su` fails. This patch fixes it to accept `UID:GID` as well. ### Documentation entry for user-facing changes. [#71626](https://github.com/ClickHouse/ClickHouse/pull/71626) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Backported in [#65755](https://github.com/ClickHouse/ClickHouse/issues/65755): Fix the `Expression nodes list expected 1 projection names` and `Unknown expression or identifier` errors for queries with aliases to `GLOBAL IN.`. [#64517](https://github.com/ClickHouse/ClickHouse/pull/64517) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Backported in [#71600](https://github.com/ClickHouse/ClickHouse/issues/71600): Fix error Invalid number of rows in Chunk with Variant column. [#71388](https://github.com/ClickHouse/ClickHouse/pull/71388) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71842](https://github.com/ClickHouse/ClickHouse/issues/71842): Fix crash with optimize_rewrite_array_exists_to_has. [#71432](https://github.com/ClickHouse/ClickHouse/pull/71432) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71562](https://github.com/ClickHouse/ClickHouse/issues/71562): Avoid crash when using a UDF in a constraint. [#71541](https://github.com/ClickHouse/ClickHouse/pull/71541) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71731](https://github.com/ClickHouse/ClickHouse/issues/71731): Return 0 or default char instead of throwing an error in bitShift functions in case of out of bounds. [#71580](https://github.com/ClickHouse/ClickHouse/pull/71580) ([Pablo Marcos](https://github.com/pamarcos)). + +#### Build/Testing/Packaging Improvement +* Backported in [#71697](https://github.com/ClickHouse/ClickHouse/issues/71697): Vendor in rust dependencies. [#62297](https://github.com/ClickHouse/ClickHouse/pull/62297) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71688](https://github.com/ClickHouse/ClickHouse/issues/71688): Improve clickhouse-server Dockerfile.ubuntu. Deprecate `CLICKHOUSE_UID/CLICKHOUSE_GID` envs. Remove `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` processing to complien requirements. Consistent `clickhouse/clickhouse-server/clickhouse-keeper` execution to not have it plain in one place and `/usr/bin/clickhouse*` in another. [#71573](https://github.com/ClickHouse/ClickHouse/pull/71573) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* Backported in [#71808](https://github.com/ClickHouse/ClickHouse/issues/71808): Fix issues we face on orphane backport branches and closed release PRs, when fake-master events are sent to the check DB. [#71782](https://github.com/ClickHouse/ClickHouse/pull/71782) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71834](https://github.com/ClickHouse/ClickHouse/issues/71834): The change has already been applied to https://github.com/docker-library/official-images/pull/17876. Backport it to every branch to have a proper `Dockerfile.ubuntu` there. [#71825](https://github.com/ClickHouse/ClickHouse/pull/71825) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix bitShift test after backport. [#71861](https://github.com/ClickHouse/ClickHouse/pull/71861) ([Pablo Marcos](https://github.com/pamarcos)). +* Revert "Merge pull request [#71861](https://github.com/ClickHouse/ClickHouse/issues/71861) from pamarcos/fix-bitshift-test". [#71871](https://github.com/ClickHouse/ClickHouse/pull/71871) ([Pablo Marcos](https://github.com/pamarcos)). + diff --git a/docs/changelogs/v24.8.7.41-lts.md b/docs/changelogs/v24.8.7.41-lts.md new file mode 100644 index 00000000000..b736c2e97fb --- /dev/null +++ b/docs/changelogs/v24.8.7.41-lts.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 1 +sidebar_label: 2024 +--- + +# 2024 Changelog + +### ClickHouse release v24.8.7.41-lts (e28553d4f2b) FIXME as compared to v24.8.6.70-lts (ddb8c219771) + +#### Improvement +* Backported in [#71713](https://github.com/ClickHouse/ClickHouse/issues/71713): CLICKHOUSE_PASSWORD is escaped for XML in clickhouse image's entrypoint. [#69301](https://github.com/ClickHouse/ClickHouse/pull/69301) ([aohoyd](https://github.com/aohoyd)). +* Backported in [#71666](https://github.com/ClickHouse/ClickHouse/issues/71666): When user/group is given as ID, the `clickhouse su` fails. This patch fixes it to accept `UID:GID` as well. ### Documentation entry for user-facing changes. [#71626](https://github.com/ClickHouse/ClickHouse/pull/71626) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71936](https://github.com/ClickHouse/ClickHouse/issues/71936): Update `HostResolver` 3 times in a `history` period. [#71863](https://github.com/ClickHouse/ClickHouse/pull/71863) ([Sema Checherinda](https://github.com/CheSema)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Backported in [#71486](https://github.com/ClickHouse/ClickHouse/issues/71486): Fix `Content-Encoding` not sent in some compressed responses. [#64802](https://github.com/ClickHouse/ClickHouse/issues/64802). [#68975](https://github.com/ClickHouse/ClickHouse/pull/68975) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Backported in [#71462](https://github.com/ClickHouse/ClickHouse/issues/71462): Added missing unescaping in named collections. Without fix clickhouse-server can't start. [#71308](https://github.com/ClickHouse/ClickHouse/pull/71308) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Backported in [#71747](https://github.com/ClickHouse/ClickHouse/issues/71747): Check suspicious and experimental types in JSON type hints. [#71369](https://github.com/ClickHouse/ClickHouse/pull/71369) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71604](https://github.com/ClickHouse/ClickHouse/issues/71604): Fix error Invalid number of rows in Chunk with Variant column. [#71388](https://github.com/ClickHouse/ClickHouse/pull/71388) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71826](https://github.com/ClickHouse/ClickHouse/issues/71826): Fix crash with optimize_rewrite_array_exists_to_has. [#71432](https://github.com/ClickHouse/ClickHouse/pull/71432) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71517](https://github.com/ClickHouse/ClickHouse/issues/71517): Fix possible error `Argument for function must be constant` (old analyzer) in case when arrayJoin can apparently appear in `WHERE` condition. Regression after https://github.com/ClickHouse/ClickHouse/pull/65414. [#71476](https://github.com/ClickHouse/ClickHouse/pull/71476) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Backported in [#71551](https://github.com/ClickHouse/ClickHouse/issues/71551): Prevent crash in SortCursor with 0 columns (old analyzer). [#71494](https://github.com/ClickHouse/ClickHouse/pull/71494) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71614](https://github.com/ClickHouse/ClickHouse/issues/71614): Analyzer fix when query inside materialized view uses IN with CTE. Closes [#65598](https://github.com/ClickHouse/ClickHouse/issues/65598). [#71538](https://github.com/ClickHouse/ClickHouse/pull/71538) ([Maksim Kita](https://github.com/kitaisreal)). +* Backported in [#71566](https://github.com/ClickHouse/ClickHouse/issues/71566): Avoid crash when using a UDF in a constraint. [#71541](https://github.com/ClickHouse/ClickHouse/pull/71541) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71727](https://github.com/ClickHouse/ClickHouse/issues/71727): Return 0 or default char instead of throwing an error in bitShift functions in case of out of bounds. [#71580](https://github.com/ClickHouse/ClickHouse/pull/71580) ([Pablo Marcos](https://github.com/pamarcos)). +* Backported in [#71876](https://github.com/ClickHouse/ClickHouse/issues/71876): Fix LOGICAL_ERROR when doing ALTER with empty tuple. This fixes [#71647](https://github.com/ClickHouse/ClickHouse/issues/71647). [#71679](https://github.com/ClickHouse/ClickHouse/pull/71679) ([Amos Bird](https://github.com/amosbird)). +* Backported in [#71737](https://github.com/ClickHouse/ClickHouse/issues/71737): Don't transform constant set in predicates over partition columns in case of NOT IN operator. [#71695](https://github.com/ClickHouse/ClickHouse/pull/71695) ([Eduard Karacharov](https://github.com/korowa)). +* Backported in [#72002](https://github.com/ClickHouse/ClickHouse/issues/72002): Fix a crash in clickhouse-client syntax highlighting. Closes [#71864](https://github.com/ClickHouse/ClickHouse/issues/71864). [#71949](https://github.com/ClickHouse/ClickHouse/pull/71949) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Build/Testing/Packaging Improvement +* Backported in [#71690](https://github.com/ClickHouse/ClickHouse/issues/71690): Improve clickhouse-server Dockerfile.ubuntu. Deprecate `CLICKHOUSE_UID/CLICKHOUSE_GID` envs. Remove `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` processing to complien requirements. Consistent `clickhouse/clickhouse-server/clickhouse-keeper` execution to not have it plain in one place and `/usr/bin/clickhouse*` in another. [#71573](https://github.com/ClickHouse/ClickHouse/pull/71573) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* Backported in [#71801](https://github.com/ClickHouse/ClickHouse/issues/71801): Fix issues we face on orphane backport branches and closed release PRs, when fake-master events are sent to the check DB. [#71782](https://github.com/ClickHouse/ClickHouse/pull/71782) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71836](https://github.com/ClickHouse/ClickHouse/issues/71836): The change has already been applied to https://github.com/docker-library/official-images/pull/17876. Backport it to every branch to have a proper `Dockerfile.ubuntu` there. [#71825](https://github.com/ClickHouse/ClickHouse/pull/71825) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + diff --git a/docs/changelogs/v24.9.3.128-stable.md b/docs/changelogs/v24.9.3.128-stable.md new file mode 100644 index 00000000000..f6caf7ad74c --- /dev/null +++ b/docs/changelogs/v24.9.3.128-stable.md @@ -0,0 +1,88 @@ +--- +sidebar_position: 1 +sidebar_label: 2024 +--- + +# 2024 Changelog + +### ClickHouse release v24.9.3.128-stable (9a816c73dd4) FIXME as compared to v24.9.2.42-stable (de7c791a2ea) + +#### Backward Incompatible Change +* Backported in [#71361](https://github.com/ClickHouse/ClickHouse/issues/71361): Fix possible error `No such file or directory` due to unescaped special symbols in files for JSON subcolumns. [#71182](https://github.com/ClickHouse/ClickHouse/pull/71182) ([Pavel Kruglov](https://github.com/Avogar)). + +#### New Feature +* Backported in [#71318](https://github.com/ClickHouse/ClickHouse/issues/71318): Allow each authentication method to have its own expiration date, remove from user entity. [#70090](https://github.com/ClickHouse/ClickHouse/pull/70090) ([Arthur Passos](https://github.com/arthurpassos)). + +#### Improvement +* Backported in [#70681](https://github.com/ClickHouse/ClickHouse/issues/70681): Don't do validation when synchronizing user_directories from keeper. [#70644](https://github.com/ClickHouse/ClickHouse/pull/70644) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71668](https://github.com/ClickHouse/ClickHouse/issues/71668): When user/group is given as ID, the `clickhouse su` fails. This patch fixes it to accept `UID:GID` as well. ### Documentation entry for user-facing changes. [#71626](https://github.com/ClickHouse/ClickHouse/pull/71626) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71938](https://github.com/ClickHouse/ClickHouse/issues/71938): Update `HostResolver` 3 times in a `history` period. [#71863](https://github.com/ClickHouse/ClickHouse/pull/71863) ([Sema Checherinda](https://github.com/CheSema)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Backported in [#70936](https://github.com/ClickHouse/ClickHouse/issues/70936): Fix incorrect JOIN ON section optimization in case of `IS NULL` check under any other function (like `NOT`) that may lead to wrong results. Closes [#67915](https://github.com/ClickHouse/ClickHouse/issues/67915). [#68049](https://github.com/ClickHouse/ClickHouse/pull/68049) ([Vladimir Cherkasov](https://github.com/vdimir)). +* Backported in [#70441](https://github.com/ClickHouse/ClickHouse/issues/70441): Fix vrash during insertion into FixedString column in PostgreSQL engine. [#69584](https://github.com/ClickHouse/ClickHouse/pull/69584) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#70563](https://github.com/ClickHouse/ClickHouse/issues/70563): Fix `getSubcolumn` with `LowCardinality` columns by overriding `useDefaultImplementationForLowCardinalityColumns` to return `true`. [#69831](https://github.com/ClickHouse/ClickHouse/pull/69831) ([Miсhael Stetsyuk](https://github.com/mstetsyuk)). +* Backported in [#70871](https://github.com/ClickHouse/ClickHouse/issues/70871): Avoid reusing columns among different named tuples when evaluating `tuple` functions. This fixes [#70022](https://github.com/ClickHouse/ClickHouse/issues/70022). [#70103](https://github.com/ClickHouse/ClickHouse/pull/70103) ([Amos Bird](https://github.com/amosbird)). +* Backported in [#70434](https://github.com/ClickHouse/ClickHouse/issues/70434): Fix possible crash in JSON column. [#70172](https://github.com/ClickHouse/ClickHouse/pull/70172) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#70309](https://github.com/ClickHouse/ClickHouse/issues/70309): Fix multiple issues with arrayMin and arrayMax. [#70207](https://github.com/ClickHouse/ClickHouse/pull/70207) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70625](https://github.com/ClickHouse/ClickHouse/issues/70625): Fix server segfault on creating a materialized view with two selects and an `INTERSECT`, e.g. `CREATE MATERIALIZED VIEW v0 AS (SELECT 1) INTERSECT (SELECT 1);`. [#70264](https://github.com/ClickHouse/ClickHouse/pull/70264) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Backported in [#70347](https://github.com/ClickHouse/ClickHouse/issues/70347): Don't modify global settings with startup scripts. Previously, changing a setting in a startup script would change it globally. [#70310](https://github.com/ClickHouse/ClickHouse/pull/70310) ([Antonio Andelic](https://github.com/antonio2368)). +* Backported in [#70428](https://github.com/ClickHouse/ClickHouse/issues/70428): Fix ALTER of Dynamic type with reducing max_types parameter that could lead to server crash. [#70328](https://github.com/ClickHouse/ClickHouse/pull/70328) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#70373](https://github.com/ClickHouse/ClickHouse/issues/70373): Fix crash when using WITH FILL incorrectly. [#70338](https://github.com/ClickHouse/ClickHouse/pull/70338) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70690](https://github.com/ClickHouse/ClickHouse/issues/70690): Fix possible use-after-free in `SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf`. [#70358](https://github.com/ClickHouse/ClickHouse/pull/70358) ([Azat Khuzhin](https://github.com/azat)). +* Backported in [#70496](https://github.com/ClickHouse/ClickHouse/issues/70496): Fix crash during GROUP BY JSON sub-object subcolumn. [#70374](https://github.com/ClickHouse/ClickHouse/pull/70374) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#70484](https://github.com/ClickHouse/ClickHouse/issues/70484): Don't prefetch parts for vertical merges if part has no rows. [#70452](https://github.com/ClickHouse/ClickHouse/pull/70452) ([Antonio Andelic](https://github.com/antonio2368)). +* Backported in [#70558](https://github.com/ClickHouse/ClickHouse/issues/70558): Fix crash in WHERE with lambda functions. [#70464](https://github.com/ClickHouse/ClickHouse/pull/70464) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70922](https://github.com/ClickHouse/ClickHouse/issues/70922): Fix table creation with `CREATE ... AS table_function()` with database `Replicated` and unavailable table function source on secondary replica. [#70511](https://github.com/ClickHouse/ClickHouse/pull/70511) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Backported in [#70577](https://github.com/ClickHouse/ClickHouse/issues/70577): Ignore all output on async insert with `wait_for_async_insert=1`. Closes [#62644](https://github.com/ClickHouse/ClickHouse/issues/62644). [#70530](https://github.com/ClickHouse/ClickHouse/pull/70530) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Backported in [#71062](https://github.com/ClickHouse/ClickHouse/issues/71062): Ignore frozen_metadata.txt while traversing shadow directory from system.remote_data_paths. [#70590](https://github.com/ClickHouse/ClickHouse/pull/70590) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Backported in [#70653](https://github.com/ClickHouse/ClickHouse/issues/70653): Fix creation of stateful window functions on misaligned memory. [#70631](https://github.com/ClickHouse/ClickHouse/pull/70631) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70759](https://github.com/ClickHouse/ClickHouse/issues/70759): Fixed rare crashes in `SELECT`-s and merges after adding a column of `Array` type with non-empty default expression. [#70695](https://github.com/ClickHouse/ClickHouse/pull/70695) ([Anton Popov](https://github.com/CurtizJ)). +* Backported in [#70764](https://github.com/ClickHouse/ClickHouse/issues/70764): Fix infinite recursion when infering a proto schema with skip unsupported fields enabled. [#70697](https://github.com/ClickHouse/ClickHouse/pull/70697) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71120](https://github.com/ClickHouse/ClickHouse/issues/71120): `GroupArraySortedData` uses a PODArray with non-POD elements, manually calling constructors and destructors for the elements as needed. But it wasn't careful enough: in two places it forgot to call destructor, in one place it left elements uninitialized if an exception is thrown when deserializing previous elements. Then `GroupArraySortedData`'s destructor called destructors on uninitialized elements and crashed: ``` 2024.10.17 22:58:23.523790 [ 5233 ] {} BaseDaemon: ########## Short fault info ############ 2024.10.17 22:58:23.523834 [ 5233 ] {} BaseDaemon: (version 24.6.1.4609 (official build), build id: 5423339A6571004018D55BBE05D464AFA35E6718, git hash: fa6cdfda8a94890eb19bc7f22f8b0b56292f7a26) (from thread 682) Received signal 11 2024.10.17 22:58:23.523862 [ 5233 ] {} BaseDaemon: Signal description: Segmentation fault 2024.10.17 22:58:23.523883 [ 5233 ] {} BaseDaemon: Address: 0x8f. Access: . Address not mapped to object. 2024.10.17 22:58:23.523908 [ 5233 ] {} BaseDaemon: Stack trace: 0x0000aaaac4b78308 0x0000ffffb7701850 0x0000aaaac0104855 0x0000aaaac01048a0 0x0000aaaac501e84c 0x0000aaaac7c510d0 0x0000aaaac7c4ba20 0x0000aaaac968bbfc 0x0000aaaac968fab0 0x0000aaaac969bf50 0x0000aaaac9b7520c 0x0000aaaac9b74c74 0x0000aaaac9b8a150 0x0000aaaac9b809f0 0x0000aaaac9b80574 0x0000aaaac9b8e364 0x0000aaaac9b8e4fc 0x0000aaaac94f4328 0x0000aaaac94f428c 0x0000aaaac94f7df0 0x0000aaaac98b5a3c 0x0000aaaac950b234 0x0000aaaac49ae264 0x0000aaaac49b1dd0 0x0000aaaac49b0a80 0x0000ffffb755d5c8 0x0000ffffb75c5edc 2024.10.17 22:58:23.523936 [ 5233 ] {} BaseDaemon: ######################################## 2024.10.17 22:58:23.523959 [ 5233 ] {} BaseDaemon: (version 24.6.1.4609 (official build), build id: 5423339A6571004018D55BBE05D464AFA35E6718, git hash: fa6cdfda8a94890eb19bc7f22f8b0b56292f7a26) (from thread 682) (query_id: 6c8a33a2-f45a-4a3b-bd71-ded6a1c9ccd3::202410_534066_534078_2) (query: ) Received signal Segmentation fault (11) 2024.10.17 22:58:23.523977 [ 5233 ] {} BaseDaemon: Address: 0x8f. Access: . Address not mapped to object. 2024.10.17 22:58:23.523993 [ 5233 ] {} BaseDaemon: Stack trace: 0x0000aaaac4b78308 0x0000ffffb7701850 0x0000aaaac0104855 0x0000aaaac01048a0 0x0000aaaac501e84c 0x0000aaaac7c510d0 0x0000aaaac7c4ba20 0x0000aaaac968bbfc 0x0000aaaac968fab0 0x0000aaaac969bf50 0x0000aaaac9b7520c 0x0000aaaac9b74c74 0x0000aaaac9b8a150 0x0000aaaac9b809f0 0x0000aaaac9b80574 0x0000aaaac9b8e364 0x0000aaaac9b8e4fc 0x0000aaaac94f4328 0x0000aaaac94f428c 0x0000aaaac94f7df0 0x0000aaaac98b5a3c 0x0000aaaac950b234 0x0000aaaac49ae264 0x0000aaaac49b1dd0 0x0000aaaac49b0a80 0x0000ffffb755d5c8 0x0000ffffb75c5edc 2024.10.17 22:58:23.524817 [ 5233 ] {} BaseDaemon: 0. signalHandler(int, siginfo_t*, void*) @ 0x000000000c6f8308 2024.10.17 22:58:23.524917 [ 5233 ] {} BaseDaemon: 1. ? @ 0x0000ffffb7701850 2024.10.17 22:58:23.524962 [ 5233 ] {} BaseDaemon: 2. DB::Field::~Field() @ 0x0000000007c84855 2024.10.17 22:58:23.525012 [ 5233 ] {} BaseDaemon: 3. DB::Field::~Field() @ 0x0000000007c848a0 2024.10.17 22:58:23.526626 [ 5233 ] {} BaseDaemon: 4. DB::IAggregateFunctionDataHelper, DB::(anonymous namespace)::GroupArraySorted, DB::Field>>::destroy(char*) const (.5a6a451027f732f9fd91c13f4a13200c) @ 0x000000000cb9e84c 2024.10.17 22:58:23.527322 [ 5233 ] {} BaseDaemon: 5. DB::SerializationAggregateFunction::deserializeBinaryBulk(DB::IColumn&, DB::ReadBuffer&, unsigned long, double) const @ 0x000000000f7d10d0 2024.10.17 22:58:23.528470 [ 5233 ] {} BaseDaemon: 6. DB::ISerialization::deserializeBinaryBulkWithMultipleStreams(COW::immutable_ptr&, unsigned long, DB::ISerialization::DeserializeBinaryBulkSettings&, std::shared_ptr&, std::unordered_map::immutable_ptr, std::hash, std::equal_to, std::allocator::immutable_ptr>>>*) const @ 0x000000000f7cba20 2024.10.17 22:58:23.529213 [ 5233 ] {} BaseDaemon: 7. DB::MergeTreeReaderCompact::readData(DB::NameAndTypePair const&, COW::immutable_ptr&, unsigned long, std::function const&) @ 0x000000001120bbfc 2024.10.17 22:58:23.529277 [ 5233 ] {} BaseDaemon: 8. DB::MergeTreeReaderCompactSingleBuffer::readRows(unsigned long, unsigned long, bool, unsigned long, std::vector::immutable_ptr, std::allocator::immutable_ptr>>&) @ 0x000000001120fab0 2024.10.17 22:58:23.529319 [ 5233 ] {} BaseDaemon: 9. DB::MergeTreeSequentialSource::generate() @ 0x000000001121bf50 2024.10.17 22:58:23.529346 [ 5233 ] {} BaseDaemon: 10. DB::ISource::tryGenerate() @ 0x00000000116f520c 2024.10.17 22:58:23.529653 [ 5233 ] {} BaseDaemon: 11. DB::ISource::work() @ 0x00000000116f4c74 2024.10.17 22:58:23.529679 [ 5233 ] {} BaseDaemon: 12. DB::ExecutionThreadContext::executeTask() @ 0x000000001170a150 2024.10.17 22:58:23.529733 [ 5233 ] {} BaseDaemon: 13. DB::PipelineExecutor::executeStepImpl(unsigned long, std::atomic*) @ 0x00000000117009f0 2024.10.17 22:58:23.529763 [ 5233 ] {} BaseDaemon: 14. DB::PipelineExecutor::executeStep(std::atomic*) @ 0x0000000011700574 2024.10.17 22:58:23.530089 [ 5233 ] {} BaseDaemon: 15. DB::PullingPipelineExecutor::pull(DB::Chunk&) @ 0x000000001170e364 2024.10.17 22:58:23.530277 [ 5233 ] {} BaseDaemon: 16. DB::PullingPipelineExecutor::pull(DB::Block&) @ 0x000000001170e4fc 2024.10.17 22:58:23.530295 [ 5233 ] {} BaseDaemon: 17. DB::MergeTask::ExecuteAndFinalizeHorizontalPart::executeImpl() @ 0x0000000011074328 2024.10.17 22:58:23.530318 [ 5233 ] {} BaseDaemon: 18. DB::MergeTask::ExecuteAndFinalizeHorizontalPart::execute() @ 0x000000001107428c 2024.10.17 22:58:23.530339 [ 5233 ] {} BaseDaemon: 19. DB::MergeTask::execute() @ 0x0000000011077df0 2024.10.17 22:58:23.530362 [ 5233 ] {} BaseDaemon: 20. DB::SharedMergeMutateTaskBase::executeStep() @ 0x0000000011435a3c 2024.10.17 22:58:23.530384 [ 5233 ] {} BaseDaemon: 21. DB::MergeTreeBackgroundExecutor::threadFunction() @ 0x000000001108b234 2024.10.17 22:58:23.530410 [ 5233 ] {} BaseDaemon: 22. ThreadPoolImpl>::worker(std::__list_iterator, void*>) @ 0x000000000c52e264 2024.10.17 22:58:23.530448 [ 5233 ] {} BaseDaemon: 23. void std::__function::__policy_invoker::__call_impl::ThreadFromGlobalPoolImpl>::scheduleImpl(std::function, Priority, std::optional, bool)::'lambda0'()>(void&&)::'lambda'(), void ()>>(std::__function::__policy_storage const*) @ 0x000000000c531dd0 2024.10.17 22:58:23.530476 [ 5233 ] {} BaseDaemon: 24. void* std::__thread_proxy[abi:v15000]>, void ThreadPoolImpl::scheduleImpl(std::function, Priority, std::optional, bool)::'lambda0'()>>(void*) @ 0x000000000c530a80 2024.10.17 22:58:23.530514 [ 5233 ] {} BaseDaemon: 25. ? @ 0x000000000007d5c8 2024.10.17 22:58:23.530534 [ 5233 ] {} BaseDaemon: 26. ? @ 0x00000000000e5edc 2024.10.17 22:58:23.530551 [ 5233 ] {} BaseDaemon: Integrity check of the executable skipped because the reference checksum could not be read. 2024.10.17 22:58:23.531083 [ 5233 ] {} BaseDaemon: Report this error to https://github.com/ClickHouse/ClickHouse/issues 2024.10.17 22:58:23.531294 [ 5233 ] {} BaseDaemon: Changed settings: max_insert_threads = 4, max_threads = 42, use_hedged_requests = false, distributed_foreground_insert = true, alter_sync = 0, enable_memory_bound_merging_of_aggregation_results = true, cluster_for_parallel_replicas = 'default', do_not_merge_across_partitions_select_final = false, log_queries = true, log_queries_probability = 1., max_http_get_redirects = 10, enable_deflate_qpl_codec = false, enable_zstd_qat_codec = false, query_profiler_real_time_period_ns = 0, query_profiler_cpu_time_period_ns = 0, max_bytes_before_external_group_by = 90194313216, max_bytes_before_external_sort = 90194313216, max_memory_usage = 180388626432, backup_restore_keeper_retry_max_backoff_ms = 60000, cancel_http_readonly_queries_on_client_close = true, max_table_size_to_drop = 1000000000000, max_partition_size_to_drop = 1000000000000, default_table_engine = 'ReplicatedMergeTree', mutations_sync = 0, optimize_trivial_insert_select = false, database_replicated_allow_only_replicated_engine = true, cloud_mode = true, cloud_mode_engine = 2, distributed_ddl_output_mode = 'none_only_active', distributed_ddl_entry_format_version = 6, async_insert_max_data_size = 10485760, async_insert_busy_timeout_max_ms = 1000, enable_filesystem_cache_on_write_operations = true, load_marks_asynchronously = true, allow_prefetched_read_pool_for_remote_filesystem = true, filesystem_prefetch_max_memory_usage = 18038862643, filesystem_prefetches_limit = 200, compatibility = '24.6', insert_keeper_max_retries = 20, allow_experimental_materialized_postgresql_table = false, date_time_input_format = 'best_effort' ```. [#70820](https://github.com/ClickHouse/ClickHouse/pull/70820) ([Michael Kolupaev](https://github.com/al13n321)). +* Backported in [#70897](https://github.com/ClickHouse/ClickHouse/issues/70897): Disable enable_named_columns_in_function_tuple by default. [#70833](https://github.com/ClickHouse/ClickHouse/pull/70833) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70996](https://github.com/ClickHouse/ClickHouse/issues/70996): Fix a logical error due to negative zeros in the two-level hash table. This closes [#70973](https://github.com/ClickHouse/ClickHouse/issues/70973). [#70979](https://github.com/ClickHouse/ClickHouse/pull/70979) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Backported in [#71212](https://github.com/ClickHouse/ClickHouse/issues/71212): Fix logical error in `StorageS3Queue` "Cannot create a persistent node in /processed since it already exists". [#70984](https://github.com/ClickHouse/ClickHouse/pull/70984) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Backported in [#71249](https://github.com/ClickHouse/ClickHouse/issues/71249): Fixed named sessions not being closed and hanging on forever under certain circumstances. [#70998](https://github.com/ClickHouse/ClickHouse/pull/70998) ([Márcio Martins](https://github.com/marcio-absmartly)). +* Backported in [#71155](https://github.com/ClickHouse/ClickHouse/issues/71155): Fix the bug that didn't consider _row_exists column in rebuild option of projection lightweight delete. [#71089](https://github.com/ClickHouse/ClickHouse/pull/71089) ([Shichao Jin](https://github.com/jsc0218)). +* Backported in [#71353](https://github.com/ClickHouse/ClickHouse/issues/71353): Fix possible error "Cannot read all data" erros during deserialization of LowCardinality dictionary from Dynamic column. [#71299](https://github.com/ClickHouse/ClickHouse/pull/71299) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71464](https://github.com/ClickHouse/ClickHouse/issues/71464): Added missing unescaping in named collections. Without fix clickhouse-server can't start. [#71308](https://github.com/ClickHouse/ClickHouse/pull/71308) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Backported in [#71329](https://github.com/ClickHouse/ClickHouse/issues/71329): Fix async inserts with empty blocks via native protocol. [#71312](https://github.com/ClickHouse/ClickHouse/pull/71312) ([Anton Popov](https://github.com/CurtizJ)). +* Backported in [#71377](https://github.com/ClickHouse/ClickHouse/issues/71377): Add try/catch to data parts destructors to avoid terminate. [#71364](https://github.com/ClickHouse/ClickHouse/pull/71364) ([alesapin](https://github.com/alesapin)). +* Backported in [#71749](https://github.com/ClickHouse/ClickHouse/issues/71749): Check suspicious and experimental types in JSON type hints. [#71369](https://github.com/ClickHouse/ClickHouse/pull/71369) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71449](https://github.com/ClickHouse/ClickHouse/issues/71449): Start memory worker thread on non-Linux OS too (fixes [#71051](https://github.com/ClickHouse/ClickHouse/issues/71051)). [#71384](https://github.com/ClickHouse/ClickHouse/pull/71384) ([Alexandre Snarskii](https://github.com/snar)). +* Backported in [#71606](https://github.com/ClickHouse/ClickHouse/issues/71606): Fix error Invalid number of rows in Chunk with Variant column. [#71388](https://github.com/ClickHouse/ClickHouse/pull/71388) ([Pavel Kruglov](https://github.com/Avogar)). +* Backported in [#71823](https://github.com/ClickHouse/ClickHouse/issues/71823): Fix crash with optimize_rewrite_array_exists_to_has. [#71432](https://github.com/ClickHouse/ClickHouse/pull/71432) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71519](https://github.com/ClickHouse/ClickHouse/issues/71519): Fix possible error `Argument for function must be constant` (old analyzer) in case when arrayJoin can apparently appear in `WHERE` condition. Regression after https://github.com/ClickHouse/ClickHouse/pull/65414. [#71476](https://github.com/ClickHouse/ClickHouse/pull/71476) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Backported in [#71553](https://github.com/ClickHouse/ClickHouse/issues/71553): Prevent crash in SortCursor with 0 columns (old analyzer). [#71494](https://github.com/ClickHouse/ClickHouse/pull/71494) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71568](https://github.com/ClickHouse/ClickHouse/issues/71568): Avoid crash when using a UDF in a constraint. [#71541](https://github.com/ClickHouse/ClickHouse/pull/71541) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#71728](https://github.com/ClickHouse/ClickHouse/issues/71728): Return 0 or default char instead of throwing an error in bitShift functions in case of out of bounds. [#71580](https://github.com/ClickHouse/ClickHouse/pull/71580) ([Pablo Marcos](https://github.com/pamarcos)). +* Backported in [#71878](https://github.com/ClickHouse/ClickHouse/issues/71878): Fix LOGICAL_ERROR when doing ALTER with empty tuple. This fixes [#71647](https://github.com/ClickHouse/ClickHouse/issues/71647). [#71679](https://github.com/ClickHouse/ClickHouse/pull/71679) ([Amos Bird](https://github.com/amosbird)). +* Backported in [#71739](https://github.com/ClickHouse/ClickHouse/issues/71739): Don't transform constant set in predicates over partition columns in case of NOT IN operator. [#71695](https://github.com/ClickHouse/ClickHouse/pull/71695) ([Eduard Karacharov](https://github.com/korowa)). +* Backported in [#72004](https://github.com/ClickHouse/ClickHouse/issues/72004): Fix a crash in clickhouse-client syntax highlighting. Closes [#71864](https://github.com/ClickHouse/ClickHouse/issues/71864). [#71949](https://github.com/ClickHouse/ClickHouse/pull/71949) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Build/Testing/Packaging Improvement +* Backported in [#71691](https://github.com/ClickHouse/ClickHouse/issues/71691): Improve clickhouse-server Dockerfile.ubuntu. Deprecate `CLICKHOUSE_UID/CLICKHOUSE_GID` envs. Remove `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` processing to complien requirements. Consistent `clickhouse/clickhouse-server/clickhouse-keeper` execution to not have it plain in one place and `/usr/bin/clickhouse*` in another. [#71573](https://github.com/ClickHouse/ClickHouse/pull/71573) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### NO CL ENTRY + +* NO CL ENTRY: 'Revert "Backport [#70146](https://github.com/ClickHouse/ClickHouse/issues/70146) to 24.9: Upgrade integration-runner image"'. [#70321](https://github.com/ClickHouse/ClickHouse/pull/70321) ([Max Kainov](https://github.com/maxknv)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* Backported in [#70316](https://github.com/ClickHouse/ClickHouse/issues/70316): CI: Remove await feature from release branches. [#70294](https://github.com/ClickHouse/ClickHouse/pull/70294) ([Max Kainov](https://github.com/maxknv)). +* Backported in [#70390](https://github.com/ClickHouse/ClickHouse/issues/70390): CI: Enable Integration Tests for backport PRs. [#70329](https://github.com/ClickHouse/ClickHouse/pull/70329) ([Max Kainov](https://github.com/maxknv)). +* Backported in [#70705](https://github.com/ClickHouse/ClickHouse/issues/70705): Don't fail the stateless check script if we can't collect minio logs. [#70350](https://github.com/ClickHouse/ClickHouse/pull/70350) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70382](https://github.com/ClickHouse/ClickHouse/issues/70382): Fix tiny mistake, responsible for some of kafka test flaps. Example [report](https://s3.amazonaws.com/clickhouse-test-reports/0/3198aafac59c368993e7b5f49d95674cc1b1be18/integration_tests__release__[2_4].html). [#70352](https://github.com/ClickHouse/ClickHouse/pull/70352) ([filimonov](https://github.com/filimonov)). +* Backported in [#70407](https://github.com/ClickHouse/ClickHouse/issues/70407): Closes [#69634](https://github.com/ClickHouse/ClickHouse/issues/69634). [#70354](https://github.com/ClickHouse/ClickHouse/pull/70354) ([pufit](https://github.com/pufit)). +* Backported in [#70703](https://github.com/ClickHouse/ClickHouse/issues/70703): Fix order in 03249_dynamic_alter_consistency. [#70453](https://github.com/ClickHouse/ClickHouse/pull/70453) ([Alexander Gololobov](https://github.com/davenger)). +* Backported in [#70544](https://github.com/ClickHouse/ClickHouse/issues/70544): Remove slow poll() logs in keeper. [#70508](https://github.com/ClickHouse/ClickHouse/pull/70508) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70692](https://github.com/ClickHouse/ClickHouse/issues/70692): Fix 24.9 setting compatibility `database_replicated_allow_explicit_uuid`. [#70565](https://github.com/ClickHouse/ClickHouse/pull/70565) ([Nikita Fomichev](https://github.com/fm4v)). +* Backported in [#70683](https://github.com/ClickHouse/ClickHouse/issues/70683): Increase max_rows_to_read limit in some tests. [#70617](https://github.com/ClickHouse/ClickHouse/pull/70617) ([Raúl Marín](https://github.com/Algunenano)). +* Backported in [#70805](https://github.com/ClickHouse/ClickHouse/issues/70805): When the `PR Check` status is set, it's a valid RunConfig job failure. [#70643](https://github.com/ClickHouse/ClickHouse/pull/70643) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71762](https://github.com/ClickHouse/ClickHouse/issues/71762): Remove bad test `test_system_replicated_fetches`. [#71071](https://github.com/ClickHouse/ClickHouse/pull/71071) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Backported in [#71230](https://github.com/ClickHouse/ClickHouse/issues/71230): Maybe not GWPAsan by default. [#71174](https://github.com/ClickHouse/ClickHouse/pull/71174) ([Antonio Andelic](https://github.com/antonio2368)). +* Backported in [#71435](https://github.com/ClickHouse/ClickHouse/issues/71435): Ignore `No such key` exceptions in some cases. [#71236](https://github.com/ClickHouse/ClickHouse/pull/71236) ([Antonio Andelic](https://github.com/antonio2368)). +* Backported in [#71803](https://github.com/ClickHouse/ClickHouse/issues/71803): Fix issues we face on orphane backport branches and closed release PRs, when fake-master events are sent to the check DB. [#71782](https://github.com/ClickHouse/ClickHouse/pull/71782) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Backported in [#71838](https://github.com/ClickHouse/ClickHouse/issues/71838): The change has already been applied to https://github.com/docker-library/official-images/pull/17876. Backport it to every branch to have a proper `Dockerfile.ubuntu` there. [#71825](https://github.com/ClickHouse/ClickHouse/pull/71825) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + diff --git a/docs/en/engines/table-engines/mergetree-family/mergetree.md b/docs/en/engines/table-engines/mergetree-family/mergetree.md index cd2fc69c236..2ca25a044b1 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -684,8 +684,7 @@ If you perform the `SELECT` query between merges, you may get expired data. To a **See Also** -- [ttl_only_drop_parts](/docs/en/operations/settings/settings.md/#ttl_only_drop_parts) setting - +- [ttl_only_drop_parts](/docs/en/operations/settings/merge-tree-settings#ttl_only_drop_parts) setting ## Disk types diff --git a/docs/en/operations/settings/merge-tree-settings.md b/docs/en/operations/settings/merge-tree-settings.md index 45c4cdf9458..8eebaf20617 100644 --- a/docs/en/operations/settings/merge-tree-settings.md +++ b/docs/en/operations/settings/merge-tree-settings.md @@ -78,6 +78,16 @@ If `min_merge_bytes_to_use_direct_io = 0`, then direct I/O is disabled. Default value: `10 * 1024 * 1024 * 1024` bytes. +## ttl_only_drop_parts + +Controls whether data parts are fully dropped in MergeTree tables when all rows in that part have expired according to their `TTL` settings. + +When `ttl_only_drop_parts` is disabled (by default), only the rows that have expired based on their TTL settings are removed. + +When `ttl_only_drop_parts` is enabled, the entire part is dropped if all rows in that part have expired according to their `TTL` settings. + +Default value: 0. + ## merge_with_ttl_timeout Minimum delay in seconds before repeating a merge with delete TTL. @@ -1095,3 +1105,13 @@ Possible values: Default value: 0.0 Note that if both `min_free_disk_ratio_to_perform_insert` and `min_free_disk_bytes_to_perform_insert` are specified, ClickHouse will count on the value that will allow to perform inserts on a bigger amount of free memory. + +## cache_populated_by_fetch + +A Cloud only setting. + +When `cache_populated_by_fetch` is disabled (the default setting), new data parts are loaded into the cache only when a query is run that requires those parts. + +If enabled, `cache_populated_by_fetch` will instead cause all nodes to load new data parts from storage into their cache without requiring a query to trigger such an action. + +Default value: 0. \ No newline at end of file diff --git a/docs/en/sql-reference/statements/check-grant.md b/docs/en/sql-reference/statements/check-grant.md new file mode 100644 index 00000000000..7dc78b66bf7 --- /dev/null +++ b/docs/en/sql-reference/statements/check-grant.md @@ -0,0 +1,46 @@ +--- +slug: /en/sql-reference/statements/check-grant +sidebar_position: 56 +sidebar_label: CHECK GRANT +title: "CHECK GRANT Statement" +--- + +The `CHECK GRANT` query is used to check whether the current user/role has been granted a specific privilege. + +## Syntax + +The basic syntax of the query is as follows: + +```sql +CHECK GRANT privilege[(column_name [,...])] [,...] ON {db.table[*]|db[*].*|*.*|table[*]|*} +``` + +- `privilege` — Type of privilege. + +## Examples + +If the user used to be granted the privilege, the response`check_grant` will be `1`. Otherwise, the response `check_grant` will be `0`. + +If `table_1.col1` exists and current user is granted by privilege `SELECT`/`SELECT(con)` or role(with privilege), the response is `1`. +```sql +CHECK GRANT SELECT(col1) ON table_1; +``` + +```text +┌─result─┐ +│ 1 │ +└────────┘ +``` +If `table_2.col2` doesn't exists, or current user is not granted by privilege `SELECT`/`SELECT(con)` or role(with privilege), the response is `0`. +```sql +CHECK GRANT SELECT(col2) ON table_2; +``` + +```text +┌─result─┐ +│ 0 │ +└────────┘ +``` + +## Wildcard +Specifying privileges you can use asterisk (`*`) instead of a table or a database name. Please check [WILDCARD GRANTS](../../sql-reference/statements/grant.md#wildcard-grants) for wildcard rules. diff --git a/docs/ja/_placeholders/api/_invitations-api-reference.md b/docs/ja/_placeholders/api/_invitations-api-reference.md new file mode 100644 index 00000000000..1ad8058f5d9 --- /dev/null +++ b/docs/ja/_placeholders/api/_invitations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 招待 +title: 招待 +--- + +## すべての招待を一覧表示 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_keys-api-reference.md b/docs/ja/_placeholders/api/_keys-api-reference.md new file mode 100644 index 00000000000..7e58a2195d9 --- /dev/null +++ b/docs/ja/_placeholders/api/_keys-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: キー +title: キー +--- + +## すべてのキーのリストを取得する + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_members-api-reference.md b/docs/ja/_placeholders/api/_members-api-reference.md new file mode 100644 index 00000000000..c274b9f5849 --- /dev/null +++ b/docs/ja/_placeholders/api/_members-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: メンバー +title: メンバー +--- + +## 組織メンバーの一覧 + +このファイルはビルドプロセス中に`clickhouseapi.js`によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/_placeholders/api/_organizations-api-reference.md b/docs/ja/_placeholders/api/_organizations-api-reference.md new file mode 100644 index 00000000000..ec127f4cb9d --- /dev/null +++ b/docs/ja/_placeholders/api/_organizations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 組織 +title: 組織 +--- + +## 組織の詳細を取得する + +このファイルはビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_services-api-reference.md b/docs/ja/_placeholders/api/_services-api-reference.md new file mode 100644 index 00000000000..6eec8e9c637 --- /dev/null +++ b/docs/ja/_placeholders/api/_services-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: サービス +title: サービス +--- + +## 組織サービスの一覧 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/changelog/_index.md b/docs/ja/_placeholders/changelog/_index.md new file mode 100644 index 00000000000..ac44d7637ff --- /dev/null +++ b/docs/ja/_placeholders/changelog/_index.md @@ -0,0 +1,8 @@ +--- +slug: /ja/whats-new/changelog/ +sidebar_position: 2 +sidebar_label: 2024 +title: 2024 Changelog +note: このファイルは `yarn new-build` によって自動生成されます。 +--- + diff --git a/docs/ja/_snippets/_GCS_authentication_and_bucket.md b/docs/ja/_snippets/_GCS_authentication_and_bucket.md new file mode 100644 index 00000000000..5e16e8bbb47 --- /dev/null +++ b/docs/ja/_snippets/_GCS_authentication_and_bucket.md @@ -0,0 +1,41 @@ +
GCS バケットと HMAC キーを作成する + +### ch_bucket_us_east1 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png) + +### ch_bucket_us_east4 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png) + +### アクセスキーを生成する + +### サービスアカウントの HMAC キーとシークレットを作成する + +**Cloud Storage > Settings > Interoperability** を開き、既存の **Access key** を選択するか、**CREATE A KEY FOR A SERVICE ACCOUNT** を選択します。このガイドでは、新しいサービスアカウントの新しいキーを作成する手順を説明します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png) + +### 新しいサービスアカウントを追加する + +すでにサービスアカウントが存在しないプロジェクトの場合は、**CREATE NEW ACCOUNT** をクリックします。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png) + +サービスアカウントを作成するには3つのステップがあります。最初のステップでは、アカウントに意味のある名前、ID、説明を付けます。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png) + +Interoperability 設定ダイアログでは、IAM ロールとして **Storage Object Admin** ロールが推奨されます。ステップ2でそのロールを選択します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png) + +ステップ3はオプションであり、このガイドでは使用しません。ポリシーに基づいて、ユーザーにこれらの特権を与えることができます。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png) + +サービスアカウントの HMAC キーが表示されます。この情報を保存してください。ClickHouse の設定で使用します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png) + +
diff --git a/docs/ja/_snippets/_S3_authentication_and_bucket.md b/docs/ja/_snippets/_S3_authentication_and_bucket.md new file mode 100644 index 00000000000..3603786c5f9 --- /dev/null +++ b/docs/ja/_snippets/_S3_authentication_and_bucket.md @@ -0,0 +1,132 @@ +
S3バケットとIAMユーザーの作成 + +この記事では、AWS IAMユーザーを設定し、S3バケットを作成し、ClickHouseをそのバケットをS3ディスクとして使用するように設定する基本を説明しています。使用する権限を決定するためにセキュリティチームと協力し、これらを出発点として考えてください。 + +### AWS IAMユーザーの作成 +この手順では、ログインユーザーではなくサービスアカウントユーザーを作成します。 +1. AWS IAM 管理コンソールにログインします。 + +2. 「ユーザー」で、**ユーザーを追加** を選択します。 + + ![create_iam_user_0](@site/docs/ja/_snippets/images/s3/s3-1.png) + +3. ユーザー名を入力し、資格情報の種類を **アクセスキー - プログラムによるアクセス** に設定し、**次: 権限** を選択します。 + + ![create_iam_user_1](@site/docs/ja/_snippets/images/s3/s3-2.png) + +4. ユーザーをグループに追加せず、**次: タグ** を選択します。 + + ![create_iam_user_2](@site/docs/ja/_snippets/images/s3/s3-3.png) + +5. タグを追加する必要がなければ、**次: 確認** を選択します。 + + ![create_iam_user_3](@site/docs/ja/_snippets/images/s3/s3-4.png) + +6. **ユーザーを作成** を選択します。 + + :::note + ユーザーに権限がないという警告メッセージは無視できます。次のセクションでバケットに対してユーザーに権限が付与されます。 + ::: + + ![create_iam_user_4](@site/docs/ja/_snippets/images/s3/s3-5.png) + +7. ユーザーが作成されました。**表示** をクリックし、アクセスキーとシークレットキーをコピーします。 +:::note +これがシークレットアクセスキーが利用可能な唯一のタイミングですので、キーを別の場所に保存してください。 +::: + + ![create_iam_user_5](@site/docs/ja/_snippets/images/s3/s3-6.png) + +8. 閉じるをクリックし、ユーザー画面でそのユーザーを見つけます。 + + ![create_iam_user_6](@site/docs/ja/_snippets/images/s3/s3-7.png) + +9. ARN(Amazon Resource Name)をコピーし、バケットのアクセスポリシーを設定する際に使用するために保存します。 + + ![create_iam_user_7](@site/docs/ja/_snippets/images/s3/s3-8.png) + +### S3バケットの作成 +1. S3バケットセクションで、**バケットの作成** を選択します。 + + ![create_s3_bucket_0](@site/docs/ja/_snippets/images/s3/s3-9.png) + +2. バケット名を入力し、他のオプションはデフォルトのままにします。 +:::note +バケット名はAWS全体で一意である必要があります。組織内だけでなく、一意でない場合はエラーが発生します。 +::: +3. `すべてのパブリックアクセスをブロック` を有効のままにします。パブリックアクセスは必要ありません。 + + ![create_s3_bucket_2](@site/docs/ja/_snippets/images/s3/s3-a.png) + +4. ページの下部にある **バケットの作成** を選択します。 + + ![create_s3_bucket_3](@site/docs/ja/_snippets/images/s3/s3-b.png) + +5. リンクを選択し、ARNをコピーして、バケットのアクセスポリシーを設定するときに使用するために保存します。 + +6. バケットが作成されたら、S3バケットリストで新しいS3バケットを見つけ、リンクを選択します。 + + ![create_s3_bucket_4](@site/docs/ja/_snippets/images/s3/s3-c.png) + +7. **フォルダを作成** を選択します。 + + ![create_s3_bucket_5](@site/docs/ja/_snippets/images/s3/s3-d.png) + +8. ClickHouse S3ディスクのターゲットとなるフォルダ名を入力し、**フォルダを作成** を選択します。 + + ![create_s3_bucket_6](@site/docs/ja/_snippets/images/s3/s3-e.png) + +9. フォルダがバケットリストに表示されるはずです。 + + ![create_s3_bucket_7](@site/docs/ja/_snippets/images/s3/s3-f.png) + +10. 新しいフォルダのチェックボックスを選択し、**URLをコピー** をクリックします。コピーしたURLは、次のセクションでのClickHouseストレージ設定で使用します。 + + ![create_s3_bucket_8](@site/docs/ja/_snippets/images/s3/s3-g.png) + +11. **権限** タブを選択し、**バケットポリシー** セクションの **編集** ボタンをクリックします。 + + ![create_s3_bucket_9](@site/docs/ja/_snippets/images/s3/s3-h.png) + +12. 以下の例のようにバケットポリシーを追加します: +```json +{ + "Version": "2012-10-17", + "Id": "Policy123456", + "Statement": [ + { + "Sid": "abc123", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::921234567898:user/mars-s3-user" + }, + "Action": "s3:*", + "Resource": [ + "arn:aws:s3:::mars-doc-test", + "arn:aws:s3:::mars-doc-test/*" + ] + } + ] +} +``` + +```response +|パラメータ | 説明 | 例 | +|----------|-------------|----------------| +|Version | ポリシーインタープリタのバージョン、そのままにしておく | 2012-10-17 | +|Sid | ユーザー定義のポリシーID | abc123 | +|Effect | ユーザー要求が許可されるか拒否されるか | Allow | +|Principal | 許可されるアカウントまたはユーザー | arn:aws:iam::921234567898:user/mars-s3-user | +|Action | バケット上で許可される操作| s3:*| +|Resource | バケット内で操作が許可されるリソース | "arn:aws:s3:::mars-doc-test", "arn:aws:s3:::mars-doc-test/*" | +``` + +:::note +使用する権限を決定するためにセキュリティチームと協力し、これらを出発点として考えてください。 +ポリシーと設定の詳細については、AWSドキュメントをご参照ください: +https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html +::: + +13. ポリシー設定を保存します。 + +
diff --git a/docs/ja/_snippets/_add_remote_ip_access_list_detail.md b/docs/ja/_snippets/_add_remote_ip_access_list_detail.md new file mode 100644 index 00000000000..a9ebd19b7bd --- /dev/null +++ b/docs/ja/_snippets/_add_remote_ip_access_list_detail.md @@ -0,0 +1,11 @@ +
IPアクセスリストを管理する + +ClickHouse Cloudのサービスリストから作業するサービスを選択し、**セキュリティ**に切り替えます。IPアクセスリストに、ClickHouse Cloudサービスに接続する必要があるリモートシステムのIPアドレスや範囲が含まれていない場合は、**エントリを追加**して問題を解決できます。 + +![サービスがトラフィックを許可しているか確認](@site/docs/ja/_snippets/images/ip-allow-list-check-list.png) + +ClickHouse Cloudサービスに接続する必要がある個別のIPアドレス、またはアドレスの範囲を追加します。フォームを適宜修正し、**エントリを追加**し、**エントリを送信**します。 + +![現在のIPアドレスを追加](@site/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png) + +
diff --git a/docs/ja/_snippets/_add_superset_detail.md b/docs/ja/_snippets/_add_superset_detail.md new file mode 100644 index 00000000000..98f5dad317c --- /dev/null +++ b/docs/ja/_snippets/_add_superset_detail.md @@ -0,0 +1,45 @@ +
DockerでApache Supersetを起動 + +Supersetは、[Docker Composeを使用してローカルにSupersetをインストールする](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/)手順を提供しています。GitHubからApache Supersetリポジトリをチェックアウトした後、最新の開発コードや特定のタグを実行することができます。`pre-release`としてマークされていない最新のリリースである2.0.0をお勧めします。 + +`docker compose`を実行する前にいくつかのタスクを行う必要があります: + +1. 公式のClickHouse Connectドライバーを追加 +2. MapBox APIキーを取得し、それを環境変数として追加(任意) +3. 実行するSupersetのバージョンを指定 + +:::tip +以下のコマンドはGitHubリポジトリのトップレベル、`superset`から実行してください。 +::: + +## 公式ClickHouse Connectドライバー + +SupersetデプロイメントでClickHouse Connectドライバーを利用可能にするために、ローカルのrequirementsファイルに追加します: + +```bash +echo "clickhouse-connect" >> ./docker/requirements-local.txt +``` + +## MapBox + +これは任意です。MapBox APIキーなしでSupersetで位置データをプロットできますが、キーを追加するべきというメッセージが表示され、地図の背景画像が欠けます(データポイントのみが表示され、地図の背景は表示されません)。MapBoxは無料のティアを提供していますので、利用したい場合はぜひご利用ください。 + +ガイドが作成するサンプルの可視化の一部は、例えば経度や緯度データなどの位置情報を使用します。SupersetはMapBoxマップのサポートを含んでいます。MapBoxの可視化を使用するには、MapBox APIキーが必要です。[MapBoxの無料ティア](https://account.mapbox.com/auth/signup/)にサインアップし、APIキーを生成してください。 + +APIキーをSupersetで利用可能にします: + +```bash +echo "MAPBOX_API_KEY=pk.SAMPLE-Use-your-key-instead" >> docker/.env-non-dev +``` + +## Supersetバージョン2.0.0をデプロイ + +リリース2.0.0をデプロイするには、以下を実行します: + +```bash +git checkout 2.0.0 +TAG=2.0.0 docker-compose -f docker-compose-non-dev.yml pull +TAG=2.0.0 docker-compose -f docker-compose-non-dev.yml up +``` + +
diff --git a/docs/ja/_snippets/_aws_regions.md b/docs/ja/_snippets/_aws_regions.md new file mode 100644 index 00000000000..d6cacd43369 --- /dev/null +++ b/docs/ja/_snippets/_aws_regions.md @@ -0,0 +1,11 @@ +| 地域 | VPC サービス名 | アベイラビリティーゾーン ID | +|------------------|--------------------------------------------------------------------|------------------------------| +|ap-south-1 | com.amazonaws.vpce.ap-south-1.vpce-svc-0a786406c7ddc3a1b | aps1-az1 aps1-az2 aps1-az3 | +|ap-southeast-1 | com.amazonaws.vpce.ap-southeast-1.vpce-svc-0a8b096ec9d2acb01 | apse1-az1 apse1-az2 apse1-az3| +|ap-southeast-2 | com.amazonaws.vpce.ap-southeast-2.vpce-svc-0ca446409b23f0c01 | apse2-az1 apse2-az2 apse2-az3| +|eu-central-1 | com.amazonaws.vpce.eu-central-1.vpce-svc-0536fc4b80a82b8ed | euc1-az2 euc1-az3 euc1-az1 | +|eu-west-1 | com.amazonaws.vpce.eu-west-1.vpce-svc-066b03c9b5f61c6fc | euw1-az2 euw1-az3 euw1-az1 | +|us-east-1 c0 | com.amazonaws.vpce.us-east-1.vpce-svc-0a0218fa75c646d81 | use1-az6 use1-az1 use1-az2 | +|us-east-1 c1 | com.amazonaws.vpce.us-east-1.vpce-svc-096c118db1ff20ea4 | use1-az6 use1-az4 use1-az2 | +|us-east-2 | com.amazonaws.vpce.us-east-2.vpce-svc-0b99748bf269a86b4 | use2-az1 use2-az2 use2-az3 | +|us-west-2 | com.amazonaws.vpce.us-west-2.vpce-svc-049bbd33f61271781 | usw2-az2 usw2-az1 usw2-az3 | diff --git a/docs/ja/_snippets/_check_ip_access_list_detail.md b/docs/ja/_snippets/_check_ip_access_list_detail.md new file mode 100644 index 00000000000..926a0dc8624 --- /dev/null +++ b/docs/ja/_snippets/_check_ip_access_list_detail.md @@ -0,0 +1,15 @@ +
IPアクセスリストを管理する + +ClickHouse Cloudのサービスリストから作業するサービスを選び、**設定**に切り替えます。 + +![サービスの設定](@site/docs/ja/_snippets/images/cloud-service-settings.png) + +IPアクセスリストが**現在、このサービスにアクセスできるトラフィックはありません**と表示される場合は、**エントリを追加**して問題を解決できます。 + +![サービスがトラフィックを許可しているか確認する](@site/docs/ja/_snippets/images/ip-allow-list-check-list.png) + +クイックスタートのために、ローカルのセキュリティポリシーが許可する場合は、現在のIPアドレスのみを追加することができます。これを行うには、**現在のIPを追加**を使用し、現在のIPと説明「ホームIP」でフォームを自動入力します。必要に応じてフォームを修正し、**エントリを追加**し**エントリを送信**します。 + +![現在のIPアドレスを追加する](@site/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png) + +
diff --git a/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx b/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx new file mode 100644 index 00000000000..e5a68056176 --- /dev/null +++ b/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx @@ -0,0 +1,61 @@ +1. ClickHouse Cloud Serviceを作成した後、認証情報画面でMySQLタブを選択します。 +![Credentials screen - Prompt](./images/mysql1.png) +2. この特定のサービスに対してMySQLインターフェースを有効にするためにスイッチを切り替えます。これにより、そのサービスでポート`3306`が公開され、ユニークなMySQLユーザー名を含むMySQL接続画面が表示されます。パスワードはサービスのデフォルトユーザーのパスワードと同じになります。 +![Credentials screen - Enabled MySQL](./images/mysql2.png) +代わりに、既存のサービスに対してMySQLインターフェースを有効にするには: +3. サービスが`Running`状態であることを確認し、MySQLインターフェースを有効にするサービスの「接続文字列を表示」ボタンをクリックします。 +![Connection screen - Prompt MySQL](./images/mysql3.png) +4. この特定のサービスに対してMySQLインターフェースを有効にするためにスイッチを切り替えます。これにより、デフォルトのパスワードを入力するよう求められます。 +![Connection screen - Prompt MySQL](./images/mysql4.png) +5. パスワードを入力すると、このサービスのMySQL接続文字列が表示されます。 +![Connection screen - MySQL Enabled](./images/mysql5.png) + +## ClickHouse Cloudで複数のMySQLユーザーを作成する + +デフォルトでは、`mysql4`という組み込みユーザーがあり、これは`default`ユーザーと同じパスワードを使用します。``部分はあなたのClickHouse Cloudホスト名の最初のセグメントです。このフォーマットは、安全な接続を実装しているが[TLSハンドシェイクでSNI情報を提供しない](https://www.cloudflare.com/learning/ssl/what-is-sni)ツール(MySQLコンソールクライアントがその一例)で作業するために必要です。この場合、ユーザー名に追加のヒントを含めずには内部ルーティングを行うことができません。 + +これにより、MySQLインターフェースで使用する新しいユーザーを作成する際には、`mysql4_`のフォーマットを使用することを_強くお勧めします_。ここで、``はあなたのCloudサービスを識別するためのヒントであり、``は選択した任意のサフィックスです。 + +:::tip +ClickHouse Cloudホスト名が`foobar.us-east1.aws.clickhouse.cloud`の場合、``部分は`foobar`に相当し、カスタムMySQLユーザー名は`mysql4foobar_team1`のようになります。 +::: + +MySQLインターフェースを使用するために追加のユーザーを作成することができます。例えば、追加の設定を適用する必要がある場合などです。 + +1. オプション - カスタムユーザーに適用する[設定プロフィール](https://clickhouse.com/docs/ja/sql-reference/statements/create/settings-profile)を作成します。たとえば、後で作成するユーザーで接続するときにデフォルトで適用される追加設定を持つ`my_custom_profile`: + + ```sql + CREATE SETTINGS PROFILE my_custom_profile SETTINGS prefer_column_name_to_alias=1; + ``` + + `prefer_column_name_to_alias`は単なる例として使用されます。ここに他の設定を使用することもできます。 +2. 以下のフォーマットを使用して[ユーザーを作成](https://clickhouse.com/docs/ja/sql-reference/statements/create/user)します: `mysql4_` ([上記参照](#creating-multiple-mysql-users-in-clickhouse-cloud))。パスワードはダブルSHA1形式である必要があります。例: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$'; + ``` + + または、このユーザーにカスタムプロフィールを使用したい場合: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$' SETTINGS PROFILE 'my_custom_profile'; + ``` + + ここで、`my_custom_profile`は前に作成したプロフィールの名前です。 +3. 新しいユーザーに必要なアクセス権を付与して、目的のテーブルまたはデータベースと対話できるようにします。[権限を付与](https://clickhouse.com/docs/ja/sql-reference/statements/grant)する例として、たとえば`system.query_log`のみのアクセスを付与したい場合: + + ```sql + GRANT SELECT ON system.query_log TO mysql4foobar_team1; + ``` + +4. 作成したユーザーを使用して、MySQLインターフェースでClickHouse Cloudサービスに接続します。 + +### ClickHouse Cloudでの複数のMySQLユーザーのトラブルシューティング + +新しいMySQLユーザーを作成し、MySQL CLIクライアントで接続しているときに以下のエラーが表示された場合: + +``` +ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 54 +``` + +この場合、ユーザー名が`mysql4_`形式に従っていることを確認してください。[上記](#creating-multiple-mysql-users-in-clickhouse-cloud)で説明されています。 diff --git a/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx b/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx new file mode 100644 index 00000000000..f728ab4e46b --- /dev/null +++ b/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx @@ -0,0 +1,87 @@ +ClickHouseサーバーにMySQLインターフェースを有効にする方法については[公式ドキュメント](https://clickhouse.com/docs/ja/interfaces/mysql)を参照してください。 + +サーバーの `config.xml` にエントリを追加することに加えて、 + +```xml + + 9004 + +``` + +MySQLインターフェースを利用するユーザーには、[二重SHA1パスワード暗号化](https://clickhouse.com/docs/ja/operations/settings/settings-users#user-namepassword)を使用することが**必要**です。 + +シェルから二重SHA1で暗号化されたランダムパスワードを生成するには以下を実行してください: + +```shell +PASSWORD=$(base64 < /dev/urandom | head -c16); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' +``` + +出力は以下のようになります: + +``` +LZOQYnqQN4L/T6L0 +fbc958cc745a82188a51f30de69eebfc67c40ee4 +``` + +最初の行は生成されたパスワードで、2行目はClickHouseの設定に使用するハッシュです。 + +以下は生成されたハッシュを使用する`mysql_user`の設定例です: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + fbc958cc745a82188a51f30de69eebfc67c40ee4 + + ::/0 + + default + default + + +``` + +`password_double_sha1_hex` エントリを自分で生成した二重SHA1ハッシュに置き換えてください。 + +さらに、BIツールがMySQLコネクタを使用する際にデータベーススキーマを適切に調査できるように、`SHOW [FULL] COLUMNS` クエリの結果でMySQLネイティブタイプを表示するために、`use_mysql_types_in_show_columns`を使用することを推奨します。 + +例えば: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + 1 + + +``` + +または、デフォルト以外の異なるプロファイルに割り当てることもできます。 + +`mysql` バイナリが利用可能であれば、コマンドラインから接続をテストできます。以下は、サンプルのユーザー名 (`mysql_user`) とパスワード (`LZOQYnqQN4L/T6L0`) を使用したコマンドです: + +```bash +mysql --protocol tcp -h localhost -u mysql_user -P 9004 --password=LZOQYnqQN4L/T6L0 +``` + +``` +mysql> show databases; ++--------------------+ +| name | ++--------------------+ +| INFORMATION_SCHEMA | +| default | +| information_schema | +| system | ++--------------------+ +4行取得しました (0.00 sec) +4行読み込み、603.00 B、0.00156秒で、2564行/秒、377.48 KiB/秒 +``` + +最後に、ClickHouseサーバーを希望するIPアドレスでリッスンするように設定します。例えば、`config.xml` の中で、すべてのアドレスでリッスンするために以下をアンコメントしてください: + +```bash +:: +``` diff --git a/docs/ja/_snippets/_cloud_backup.md b/docs/ja/_snippets/_cloud_backup.md new file mode 100644 index 00000000000..8cd341f7a0a --- /dev/null +++ b/docs/ja/_snippets/_cloud_backup.md @@ -0,0 +1,19 @@ +## クラウドのバックアップとリストア + +各サービスは毎日バックアップされています。サービスの**バックアップ**タブで、サービスのバックアップリストを見ることができます。そこからバックアップをリストアしたり、バックアップを削除することができます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-list.png) + +**バックアップをリストア**アイコンをクリックすると、新しく作成されるサービスの**サービス名**を指定して、**このバックアップをリストア**できます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-restore.png) + +新しいサービスは、準備が整うまでサービスリストに**プロビジョニング**として表示されます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-new-service.png) + +新しいサービスのプロビジョニングが完了すると、接続できます。その後… + +:::note +ClickHouse Cloud サービスを利用する際に、SQL クライアントで `BACKUP` および `RESTORE` コマンドを使用しないでください。クラウドのバックアップは UI から管理する必要があります。 +::: diff --git a/docs/ja/_snippets/_config-files.md b/docs/ja/_snippets/_config-files.md new file mode 100644 index 00000000000..cd40c778dc9 --- /dev/null +++ b/docs/ja/_snippets/_config-files.md @@ -0,0 +1,7 @@ +:::important best practices +ClickHouse Server を設定する際、設定ファイルを追加または編集するときは次のようにしてください: +- ファイルを `/etc/clickhouse-server/config.d/` ディレクトリに追加する +- ファイルを `/etc/clickhouse-server/users.d/` ディレクトリに追加する +- `/etc/clickhouse-server/config.xml` ファイルはそのままにしておく +- `/etc/clickhouse-server/users.xml` ファイルはそのままにしておく +::: diff --git a/docs/ja/_snippets/_gather_your_details_http.mdx b/docs/ja/_snippets/_gather_your_details_http.mdx new file mode 100644 index 00000000000..e466ee3c30e --- /dev/null +++ b/docs/ja/_snippets/_gather_your_details_http.mdx @@ -0,0 +1,17 @@ +HTTP(S) を使用して ClickHouse に接続するには、以下の情報が必要です: + +- **HOST と PORT**: 通常、TLS を使用する場合のポートは 8443、TLS を使用しない場合は 8123 です。 + +- **データベース名**: デフォルトで `default` という名前のデータベースがありますが、接続したいデータベースの名前を使用してください。 + +- **ユーザー名とパスワード**: デフォルトでユーザー名は `default` です。使用ケースに適したユーザー名を使用してください。 + +ClickHouse Cloud サービスの詳細は、ClickHouse Cloud コンソールで確認できます。 接続するサービスを選択し、**接続** をクリックします: + +![ClickHouse Cloud service connect button](@site/docs/ja/_snippets/images/cloud-connect-button.png) + +**HTTPS** を選択すると、サンプルの `curl` コマンドで詳細が確認できます。 + +![ClickHouse Cloud HTTPS connection details](@site/docs/ja/_snippets/images/connection-details-https.png) + +セルフマネージドの ClickHouse を使用している場合、接続の詳細は ClickHouse 管理者によって設定されます。 diff --git a/docs/ja/_snippets/_gather_your_details_native.md b/docs/ja/_snippets/_gather_your_details_native.md new file mode 100644 index 00000000000..757a2df37c7 --- /dev/null +++ b/docs/ja/_snippets/_gather_your_details_native.md @@ -0,0 +1,17 @@ +ClickHouseにネイティブTCPで接続するには、次の情報が必要です。 + +- **HOSTとPORT**: 通常、TLSを使用している場合はポートは9440、TLSを使用していない場合は9000です。 + +- **データベース名**: デフォルトでは、`default`という名前のデータベースがあります。接続したいデータベースの名前を使用してください。 + +- **ユーザー名とパスワード**: デフォルトのユーザー名は`default`です。使用するケースに適したユーザー名を利用してください。 + +ClickHouse Cloudサービスの詳細は、ClickHouse Cloudコンソールで確認できます。接続するサービスを選択し、**Connect**をクリックします。 + +![ClickHouse Cloud service connect button](@site/docs/ja/_snippets/images/cloud-connect-button.png) + +**Native** を選択すると、例として `clickhouse-client` コマンドで使用可能な詳細が表示されます。 + +![ClickHouse Cloud Native TCP connection details](@site/docs/ja/_snippets/images/connection-details-native.png) + +セルフマネージドのClickHouseを使用している場合、接続の詳細はClickHouse管理者によって設定されます。 diff --git a/docs/ja/_snippets/_gcp_regions.md b/docs/ja/_snippets/_gcp_regions.md new file mode 100644 index 00000000000..61207f0d01b --- /dev/null +++ b/docs/ja/_snippets/_gcp_regions.md @@ -0,0 +1,6 @@ +| リージョン | サービスアタッチメント | プライベートDNSドメイン | +|--------------|-------------------------------------------------------------|------------------------------| +|asia-southeast1| projects/dataplane-production/regions/asia-southeast1/serviceAttachments/production-asia-southeast1-clickhouse-cloud| asia-southeast1.p.gcp.clickhouse.cloud| +|europe-west4| projects/dataplane-production/regions/europe-west4/serviceAttachments/production-europe-west4-clickhouse-cloud| europe-west4.p.gcp.clickhouse.cloud| +|us-central1| projects/dataplane-production/regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud| us-central1.p.gcp.clickhouse.cloud| +|us-east1| projects/dataplane-production/regions/us-east1/serviceAttachments/production-us-east1-clickhouse-cloud| us-east1.p.gcp.clickhouse.cloud| diff --git a/docs/ja/_snippets/_keeper-config-files.md b/docs/ja/_snippets/_keeper-config-files.md new file mode 100644 index 00000000000..393445edb1d --- /dev/null +++ b/docs/ja/_snippets/_keeper-config-files.md @@ -0,0 +1,5 @@ +:::important ベストプラクティス +ClickHouse Keeperを構成するために設定ファイルを編集する際には、以下を行うべきです: +- `/etc/clickhouse-keeper/keeper_config.xml` をバックアップする +- `/etc/clickhouse-keeper/keeper_config.xml` ファイルを編集する +::: diff --git a/docs/ja/_snippets/_launch_sql_console.md b/docs/ja/_snippets/_launch_sql_console.md new file mode 100644 index 00000000000..7ab292d93a1 --- /dev/null +++ b/docs/ja/_snippets/_launch_sql_console.md @@ -0,0 +1,11 @@ +:::tip SQL コンソール +SQL クライアント接続が必要な場合、ClickHouse Cloud サービスには関連付けられたウェブベースの SQL コンソールがあります。詳細については、以下の **SQL コンソールに接続** を展開してください。 +::: + +
SQL コンソールに接続 + +ClickHouse Cloud サービス一覧から、作業するサービスを選択し、**接続** をクリックします。ここから **SQL コンソールを開く** ことができます: + +![SQL コンソールに接続](@site/docs/ja/_snippets/images/cloud-connect-to-sql-console.png) + +
diff --git a/docs/ja/_snippets/_replication-sharding-terminology.md b/docs/ja/_snippets/_replication-sharding-terminology.md new file mode 100644 index 00000000000..5a32af3c52c --- /dev/null +++ b/docs/ja/_snippets/_replication-sharding-terminology.md @@ -0,0 +1,9 @@ +## 用語集 +### レプリカ +データのコピー。ClickHouseは常にデータの少なくとも1つのコピーを持っているため、**レプリカ**の最小数は1です。これは重要なポイントで、元のデータをレプリカとして数えることに慣れていないかもしれませんが、ClickHouseのコードとドキュメントではその用語が使用されています。データの2番目のレプリカを追加することで、フォールトトレランスを提供できます。 + +### シャード +データのサブセット。ClickHouseは常にデータの少なくとも1つのシャードを持っているので、データを複数のサーバーに分散しない場合、データは1つのシャードに格納されます。データを複数のサーバーに分散してシャーディングすることは、単一サーバーの容量を超えた場合に負荷を分散するために利用できます。宛先サーバーは**シャーディングキー**によって決まり、分散テーブルを作成する際に定義されます。シャーディングキーはランダムなものか、[ハッシュ関数](https://clickhouse.com/docs/ja/sql-reference/functions/hash-functions)の出力として定義することができます。シャーディングを含むデプロイメント例では、シャーディングキーとして`rand()`を使用し、いつどのようにして異なるシャーディングキーを選択するかについてのさらなる情報を提供します。 + +### 分散調整 +ClickHouse Keeperは、データのレプリケーションと分散DDLクエリの実行のための調整システムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。 diff --git a/docs/ja/_snippets/_self_managed_only_automated.md b/docs/ja/_snippets/_self_managed_only_automated.md new file mode 100644 index 00000000000..a13a937cc5d --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_automated.md @@ -0,0 +1,3 @@ +:::note +このページは [ClickHouse Cloud](https://clickhouse.com/cloud) には適用されません。ここで記載されている手順は、ClickHouse Cloud サービスで自動化されています。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_no_roadmap.md b/docs/ja/_snippets/_self_managed_only_no_roadmap.md new file mode 100644 index 00000000000..1a5a90f3861 --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_no_roadmap.md @@ -0,0 +1,4 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここで文書化されている機能は、ClickHouse Cloudサービスでは利用できません。 +詳細は、ClickHouseの[Cloud Compatibility](/docs/ja/whats-new/cloud-compatibility)ガイドをご覧ください。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_not_applicable.md b/docs/ja/_snippets/_self_managed_only_not_applicable.md new file mode 100644 index 00000000000..e80de64fd8c --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_not_applicable.md @@ -0,0 +1,3 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここに記載されている手順は、セルフマネージドのClickHouseデプロイメントでのみ必要です。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_roadmap.md b/docs/ja/_snippets/_self_managed_only_roadmap.md new file mode 100644 index 00000000000..35c88e62051 --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_roadmap.md @@ -0,0 +1,3 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここで文書化されている機能は、ClickHouse Cloudサービスではまだ利用できません。詳しくは、ClickHouseの[Cloud互換性](/docs/ja/whats-new/cloud-compatibility#roadmap)ガイドを参照してください。 +::: diff --git a/docs/ja/_snippets/_service_actions_menu.md b/docs/ja/_snippets/_service_actions_menu.md new file mode 100644 index 00000000000..84d24343d1a --- /dev/null +++ b/docs/ja/_snippets/_service_actions_menu.md @@ -0,0 +1,3 @@ +

ClickHouse Cloudサービスのアクションメニューを開き、{props.menu}を選択します:

+ +![Cloud service Actions menu](@site/docs/ja/_snippets/images/cloud-service-actions-menu.png) diff --git a/docs/ja/_snippets/_sign_in_or_trial.md b/docs/ja/_snippets/_sign_in_or_trial.md new file mode 100644 index 00000000000..1040f9b31f5 --- /dev/null +++ b/docs/ja/_snippets/_sign_in_or_trial.md @@ -0,0 +1,3 @@ +[ClickHouse.cloud](https://clickhouse.cloud)でアカウントを作成するか、サインインしてください。 + +![Cloud sign in prompt](@site/docs/ja/_snippets/images/cloud-sign-in-or-trial.png) diff --git a/docs/ja/_snippets/_tabs.md b/docs/ja/_snippets/_tabs.md new file mode 100644 index 00000000000..68aa6b4529b --- /dev/null +++ b/docs/ja/_snippets/_tabs.md @@ -0,0 +1,22 @@ +--- +sidebar_label: タブサンプル +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +## ステップ 1 + + + + +クラウド + + + + +セルフマネージド + + + diff --git a/docs/ja/_snippets/_users-and-roles-common.md b/docs/ja/_snippets/_users-and-roles-common.md new file mode 100644 index 00000000000..b7965705fed --- /dev/null +++ b/docs/ja/_snippets/_users-and-roles-common.md @@ -0,0 +1,447 @@ +## 管理者権限のテスト + +ユーザー `default` からログアウトし、ユーザー `clickhouse_admin` としてログインし直してください。 + +これらすべてが成功するはずです: + +```sql +SHOW GRANTS FOR clickhouse_admin; +``` + +```sql +CREATE DATABASE db1 +``` + +```sql +CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id; +``` + +```sql +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +```sql +SELECT * FROM db1.table1; +``` + +```sql +DROP TABLE db1.table1; +``` + +```sql +DROP DATABASE db1; +``` + +## 非管理者ユーザー + +ユーザーは必要な権限を持ち、全員が管理者であるべきではありません。このドキュメントの残りの部分では、例のシナリオと必要な役割を提供します。 + +### 準備 + +例で使用されるテーブルとユーザーを作成します。 + +#### サンプルデータベース、テーブル、および行の作成 + +1. テストデータベースを作成 + + ```sql + CREATE DATABASE db1; + ``` + +2. テーブルを作成 + + ```sql + CREATE TABLE db1.table1 ( + id UInt64, + column1 String, + column2 String + ) + ENGINE MergeTree + ORDER BY id; + ``` + +3. サンプル行でテーブルを埋める + + ```sql + INSERT INTO db1.table1 + (id, column1, column2) + VALUES + (1, 'A', 'abc'), + (2, 'A', 'def'), + (3, 'B', 'abc'), + (4, 'B', 'def'); + ``` + +4. テーブルを確認する: + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49 + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + │ 3 │ B │ abc │ + │ 4 │ B │ def │ + └────┴─────────┴─────────┘ + ``` + +5. 特定のカラムへのアクセスを制限することを示すために使用される通常のユーザーを作成: + + ```sql + CREATE USER column_user IDENTIFIED BY 'password'; + ``` + +6. 特定の値を持つ行へのアクセスを制限することを示すために使用される通常のユーザーを作成: + ```sql + CREATE USER row_user IDENTIFIED BY 'password'; + ``` + +#### 役割の作成 + +この例を使って: + +- カラムや行、異なる権限のための役割を作成します +- 役割に権限を付与します +- ユーザーを各役割に割り当てます + +役割は、各ユーザーを個別に管理する代わりに、特定の権限を持つユーザーのグループを定義するために使用されます。 + +1. `db1` データベースおよび `table1` において、`column1` のみを閲覧できるユーザーの役割を作成: + + ```sql + CREATE ROLE column1_users; + ``` + +2. `column1` のみが閲覧可能な権限を設定 + + ```sql + GRANT SELECT(id, column1) ON db1.table1 TO column1_users; + ``` + +3. `column_user` ユーザーを `column1_users` 役割に追加 + + ```sql + GRANT column1_users TO column_user; + ``` + +4. `column1` に `A` を含む行のみを閲覧できるユーザーの役割を作成 + + ```sql + CREATE ROLE A_rows_users; + ``` + +5. `row_user` を `A_rows_users` 役割に追加 + + ```sql + GRANT A_rows_users TO row_user; + ``` + +6. `column1` が `A` の値を持つ行のみを閲覧可能とするポリシーを作成 + + ```sql + CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users; + ``` + +7. データベースとテーブルへの権限を設定 + + ```sql + GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users; + ``` + +8. 他の役割に対してもすべての行にアクセスできるように明示的な権限を付与 + + ```sql + CREATE ROW POLICY allow_other_users_filter + ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users; + ``` + + :::note + テーブルにポリシーをアタッチすると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがそのテーブルでの操作を行うことができます。その他のユーザーは操作を拒否されます。制限された行ポリシーが他のユーザーに適用されないようにするため、他のユーザーと役割が通常または他のタイプのアクセスを持つことを許可する別のポリシーを定義する必要があります。 + ::: + +## 検証 + +### カラム制限ユーザーでの役割の権限テスト + +1. `clickhouse_admin` ユーザーでClickHouseクライアントにログイン + + ``` + clickhouse-client --user clickhouse_admin --password password + ``` + +2. 管理者ユーザーを使用して、データベース、テーブル、およびすべての行のアクセスを確認。 + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: f5e906ea-10c6-45b0-b649-36334902d31d + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + │ 3 │ B │ abc │ + │ 4 │ B │ def │ + └────┴─────────┴─────────┘ + ``` + +3. `column_user` ユーザーでClickHouseクライアントにログイン + + ``` + clickhouse-client --user column_user --password password + ``` + +4. すべてのカラムを使用した `SELECT` + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23 + + 0 rows in set. Elapsed: 0.006 sec. + + Received exception from server (version 22.3.2): + Code: 497. DB::Exception: Received from localhost:9000. + DB::Exception: column_user: Not enough privileges. + To execute this query it's necessary to have grant + SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED) + ``` + + :::note + すべてのカラムが指定されたためアクセスが拒否されました。ユーザーは `id` と `column1` のみへのアクセス権を持っています + ::: + +5. 指定されたカラムのみを用いた `SELECT` クエリを確認: + + ```sql + SELECT + id, + column1 + FROM db1.table1 + ``` + + ```response + Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9 + + ┌─id─┬─column1─┐ + │ 1 │ A │ + │ 2 │ A │ + │ 3 │ B │ + │ 4 │ B │ + └────┴─────────┘ + ``` + +### 行制限ユーザーでの役割の権限テスト + +1. `row_user` でClickHouseクライアントにログイン + + ``` + clickhouse-client --user row_user --password password + ``` + +2. 利用可能な行を表示 + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + └────┴─────────┴─────────┘ + ``` + + :::note + 上記の2行のみが返されることを確認し、`column1` に `B` の値を持つ行は除外されるべきです。 + ::: + +## ユーザーと役割の変更 + +ユーザーは必要な権限の組み合わせに対して複数の役割を割り当てることができます。複数の役割を使用する場合、システムは役割を組み合わせて権限を決定し、その結果、役割の権限が累積されます。 + +例えば、1つの `role1` が `column1` のみの選択を許可し、`role2` が `column1` と `column2` の選択を許可する場合、ユーザーは両方のカラムにアクセスできます。 + +1. 管理者アカウントを使用して、デフォルトの役割で行とカラムの両方を制限する新しいユーザーを作成 + + ```sql + CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users; + ``` + +2. `A_rows_users` 役割に対する以前の権限を削除 + + ```sql + REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users; + ``` + +3. `A_row_users` 役割に `column1` のみの選択を許可 + + ```sql + GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users; + ``` + +4. `row_and_column_user` でClickHouseクライアントにログイン + + ``` + clickhouse-client --user row_and_column_user --password password; + ``` + +5. すべてのカラムでテスト: + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4 + + 0 rows in set. Elapsed: 0.005 sec. + + Received exception from server (version 22.3.2): + Code: 497. DB::Exception: Received from localhost:9000. + DB::Exception: row_and_column_user: Not enough privileges. + To execute this query it's necessary to have grant + SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED) + ``` + +6. 制限されたカラムでテスト: + + ```sql + SELECT + id, + column1 + FROM db1.table1 + ``` + + ```response + Query id: 5e30b490-507a-49e9-9778-8159799a6ed0 + + ┌─id─┬─column1─┐ + │ 1 │ A │ + │ 2 │ A │ + └────┴─────────┘ + ``` + +## トラブルシューティング + +権限が交差または結合して予期しない結果を生む場合があります。次のコマンドを使用して管理者アカウントを使用して問題を絞り込むことができます。 + +### ユーザーの権限と役割のリスト + +```sql +SHOW GRANTS FOR row_and_column_user +``` + +```response +Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b + +┌─GRANTS FOR row_and_column_user───────────────────────────┐ +│ GRANT A_rows_users, column1_users TO row_and_column_user │ +└──────────────────────────────────────────────────────────┘ +``` + +### ClickHouse の役割のリスト + +```sql +SHOW ROLES +``` + +```response +Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a + +┌─name────────────┐ +│ A_rows_users │ +│ column1_users │ +└─────────────────┘ +``` + +### ポリシーの表示 + +```sql +SHOW ROW POLICIES +``` + +```response +Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc + +┌─name───────────────────────────────────┐ +│ A_row_filter ON db1.table1 │ +│ allow_other_users_filter ON db1.table1 │ +└────────────────────────────────────────┘ +``` + +### ポリシーがどのように定義されているかと現在の権限を表示 + +```sql +SHOW CREATE ROW POLICY A_row_filter ON db1.table1 +``` + +```response +Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b + +┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐ +│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │ +└─────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## ロール、ポリシー、およびユーザーを管理するためのコマンドの例 + +次のコマンドを使用して: + +- 権限の削除 +- ポリシーの削除 +- ユーザーを役割から解除 +- ユーザーと役割の削除 +
+ +:::tip +これらのコマンドは管理者ユーザーまたは `default` ユーザーとして実行してください +::: + +### 役割からの権限を削除 + +```sql +REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users; +``` + +### ポリシーを削除 + +```sql +DROP ROW POLICY A_row_filter ON db1.table1; +``` + +### ユーザーを役割から解除 + +```sql +REVOKE A_rows_users FROM row_user; +``` + +### 役割を削除 + +```sql +DROP ROLE A_rows_users; +``` + +### ユーザーを削除 + +```sql +DROP USER row_user; +``` + +## 要約 + +このドキュメントでは、SQLユーザーと役割の作成の基本を示し、ユーザーおよび役割の権限を設定および変更する手順を提供しました。それぞれの詳細情報については、ユーザーガイドおよびリファレンスドキュメントを参照してください。 diff --git a/docs/ja/_snippets/images/aws-rds-mysql.png b/docs/ja/_snippets/images/aws-rds-mysql.png new file mode 100644 index 00000000000..5e4456fbed5 Binary files /dev/null and b/docs/ja/_snippets/images/aws-rds-mysql.png differ diff --git a/docs/ja/_snippets/images/cloud-advanced-scaling.png b/docs/ja/_snippets/images/cloud-advanced-scaling.png new file mode 100644 index 00000000000..787f81f4bb5 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-advanced-scaling.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-list.png b/docs/ja/_snippets/images/cloud-backup-list.png new file mode 100644 index 00000000000..fca809ae6d7 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-list.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-new-service.png b/docs/ja/_snippets/images/cloud-backup-new-service.png new file mode 100644 index 00000000000..eeff5a0d2c0 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-new-service.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-restore.png b/docs/ja/_snippets/images/cloud-backup-restore.png new file mode 100644 index 00000000000..922c640ee8d Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-restore.png differ diff --git a/docs/ja/_snippets/images/cloud-connect-button.png b/docs/ja/_snippets/images/cloud-connect-button.png new file mode 100644 index 00000000000..c61e2f3605f Binary files /dev/null and b/docs/ja/_snippets/images/cloud-connect-button.png differ diff --git a/docs/ja/_snippets/images/cloud-connect-to-sql-console.png b/docs/ja/_snippets/images/cloud-connect-to-sql-console.png new file mode 100644 index 00000000000..5037f4c0591 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-connect-to-sql-console.png differ diff --git a/docs/ja/_snippets/images/cloud-load-data-sample.png b/docs/ja/_snippets/images/cloud-load-data-sample.png new file mode 100644 index 00000000000..1abd3f4f4af Binary files /dev/null and b/docs/ja/_snippets/images/cloud-load-data-sample.png differ diff --git a/docs/ja/_snippets/images/cloud-select-a-service.png b/docs/ja/_snippets/images/cloud-select-a-service.png new file mode 100644 index 00000000000..8eb530404bf Binary files /dev/null and b/docs/ja/_snippets/images/cloud-select-a-service.png differ diff --git a/docs/ja/_snippets/images/cloud-service-actions-menu.png b/docs/ja/_snippets/images/cloud-service-actions-menu.png new file mode 100644 index 00000000000..d56c183fd4d Binary files /dev/null and b/docs/ja/_snippets/images/cloud-service-actions-menu.png differ diff --git a/docs/ja/_snippets/images/cloud-service-settings.png b/docs/ja/_snippets/images/cloud-service-settings.png new file mode 100644 index 00000000000..4fa16435508 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-service-settings.png differ diff --git a/docs/ja/_snippets/images/cloud-sign-in-or-trial.png b/docs/ja/_snippets/images/cloud-sign-in-or-trial.png new file mode 100644 index 00000000000..824836d5080 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-sign-in-or-trial.png differ diff --git a/docs/ja/_snippets/images/cmek-performance.png b/docs/ja/_snippets/images/cmek-performance.png new file mode 100644 index 00000000000..c8726203179 Binary files /dev/null and b/docs/ja/_snippets/images/cmek-performance.png differ diff --git a/docs/ja/_snippets/images/cmek1.png b/docs/ja/_snippets/images/cmek1.png new file mode 100644 index 00000000000..5b1f4bbe6f3 Binary files /dev/null and b/docs/ja/_snippets/images/cmek1.png differ diff --git a/docs/ja/_snippets/images/cmek2.png b/docs/ja/_snippets/images/cmek2.png new file mode 100644 index 00000000000..770e6774da9 Binary files /dev/null and b/docs/ja/_snippets/images/cmek2.png differ diff --git a/docs/ja/_snippets/images/cmek3.png b/docs/ja/_snippets/images/cmek3.png new file mode 100644 index 00000000000..27b2183f44b Binary files /dev/null and b/docs/ja/_snippets/images/cmek3.png differ diff --git a/docs/ja/_snippets/images/connect1.png b/docs/ja/_snippets/images/connect1.png new file mode 100644 index 00000000000..e534d7da388 Binary files /dev/null and b/docs/ja/_snippets/images/connect1.png differ diff --git a/docs/ja/_snippets/images/connect2.png b/docs/ja/_snippets/images/connect2.png new file mode 100644 index 00000000000..5e02ec95970 Binary files /dev/null and b/docs/ja/_snippets/images/connect2.png differ diff --git a/docs/ja/_snippets/images/connect3.png b/docs/ja/_snippets/images/connect3.png new file mode 100644 index 00000000000..ea769fe176a Binary files /dev/null and b/docs/ja/_snippets/images/connect3.png differ diff --git a/docs/ja/_snippets/images/connect4.png b/docs/ja/_snippets/images/connect4.png new file mode 100644 index 00000000000..ccdbaf94427 Binary files /dev/null and b/docs/ja/_snippets/images/connect4.png differ diff --git a/docs/ja/_snippets/images/connection-details-https.png b/docs/ja/_snippets/images/connection-details-https.png new file mode 100644 index 00000000000..cdd70b179e6 Binary files /dev/null and b/docs/ja/_snippets/images/connection-details-https.png differ diff --git a/docs/ja/_snippets/images/connection-details-native.png b/docs/ja/_snippets/images/connection-details-native.png new file mode 100644 index 00000000000..9eb043b564d Binary files /dev/null and b/docs/ja/_snippets/images/connection-details-native.png differ diff --git a/docs/ja/_snippets/images/createservice1.png b/docs/ja/_snippets/images/createservice1.png new file mode 100644 index 00000000000..c1e7b131a59 Binary files /dev/null and b/docs/ja/_snippets/images/createservice1.png differ diff --git a/docs/ja/_snippets/images/createservice2.png b/docs/ja/_snippets/images/createservice2.png new file mode 100644 index 00000000000..a79b51eebf9 Binary files /dev/null and b/docs/ja/_snippets/images/createservice2.png differ diff --git a/docs/ja/_snippets/images/createservice3.png b/docs/ja/_snippets/images/createservice3.png new file mode 100644 index 00000000000..422af55a832 Binary files /dev/null and b/docs/ja/_snippets/images/createservice3.png differ diff --git a/docs/ja/_snippets/images/createservice4.png b/docs/ja/_snippets/images/createservice4.png new file mode 100644 index 00000000000..5cf0113cd04 Binary files /dev/null and b/docs/ja/_snippets/images/createservice4.png differ diff --git a/docs/ja/_snippets/images/gcp-authorized-network.png b/docs/ja/_snippets/images/gcp-authorized-network.png new file mode 100644 index 00000000000..3fdd4d18a4f Binary files /dev/null and b/docs/ja/_snippets/images/gcp-authorized-network.png differ diff --git a/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png b/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png new file mode 100644 index 00000000000..f24612707c1 Binary files /dev/null and b/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png differ diff --git a/docs/ja/_snippets/images/ip-allow-list-check-list.png b/docs/ja/_snippets/images/ip-allow-list-check-list.png new file mode 100644 index 00000000000..ed415f0828d Binary files /dev/null and b/docs/ja/_snippets/images/ip-allow-list-check-list.png differ diff --git a/docs/ja/_snippets/images/mysql1.png b/docs/ja/_snippets/images/mysql1.png new file mode 100644 index 00000000000..0f30799f701 Binary files /dev/null and b/docs/ja/_snippets/images/mysql1.png differ diff --git a/docs/ja/_snippets/images/mysql2.png b/docs/ja/_snippets/images/mysql2.png new file mode 100644 index 00000000000..105031eafca Binary files /dev/null and b/docs/ja/_snippets/images/mysql2.png differ diff --git a/docs/ja/_snippets/images/mysql3.png b/docs/ja/_snippets/images/mysql3.png new file mode 100644 index 00000000000..9a8a24814dc Binary files /dev/null and b/docs/ja/_snippets/images/mysql3.png differ diff --git a/docs/ja/_snippets/images/mysql4.png b/docs/ja/_snippets/images/mysql4.png new file mode 100644 index 00000000000..9f1a3876a3a Binary files /dev/null and b/docs/ja/_snippets/images/mysql4.png differ diff --git a/docs/ja/_snippets/images/mysql5.png b/docs/ja/_snippets/images/mysql5.png new file mode 100644 index 00000000000..5bccdfa31b1 Binary files /dev/null and b/docs/ja/_snippets/images/mysql5.png differ diff --git a/docs/ja/_snippets/images/openapi1.png b/docs/ja/_snippets/images/openapi1.png new file mode 100644 index 00000000000..2009f085cc7 Binary files /dev/null and b/docs/ja/_snippets/images/openapi1.png differ diff --git a/docs/ja/_snippets/images/openapi2.png b/docs/ja/_snippets/images/openapi2.png new file mode 100644 index 00000000000..b182d12faaf Binary files /dev/null and b/docs/ja/_snippets/images/openapi2.png differ diff --git a/docs/ja/_snippets/images/openapi3.png b/docs/ja/_snippets/images/openapi3.png new file mode 100644 index 00000000000..92b517546a0 Binary files /dev/null and b/docs/ja/_snippets/images/openapi3.png differ diff --git a/docs/ja/_snippets/images/openapi4.png b/docs/ja/_snippets/images/openapi4.png new file mode 100644 index 00000000000..f2e0490ee37 Binary files /dev/null and b/docs/ja/_snippets/images/openapi4.png differ diff --git a/docs/ja/_snippets/images/openapi5.png b/docs/ja/_snippets/images/openapi5.png new file mode 100644 index 00000000000..0333cd56b23 Binary files /dev/null and b/docs/ja/_snippets/images/openapi5.png differ diff --git a/docs/ja/_snippets/images/s3/s3-1.png b/docs/ja/_snippets/images/s3/s3-1.png new file mode 100644 index 00000000000..23d93874fbb Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-1.png differ diff --git a/docs/ja/_snippets/images/s3/s3-2.png b/docs/ja/_snippets/images/s3/s3-2.png new file mode 100644 index 00000000000..64c09710bc3 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-2.png differ diff --git a/docs/ja/_snippets/images/s3/s3-3.png b/docs/ja/_snippets/images/s3/s3-3.png new file mode 100644 index 00000000000..32617f3002e Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-3.png differ diff --git a/docs/ja/_snippets/images/s3/s3-4.png b/docs/ja/_snippets/images/s3/s3-4.png new file mode 100644 index 00000000000..efedf267d62 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-4.png differ diff --git a/docs/ja/_snippets/images/s3/s3-5.png b/docs/ja/_snippets/images/s3/s3-5.png new file mode 100644 index 00000000000..12286c41e2f Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-5.png differ diff --git a/docs/ja/_snippets/images/s3/s3-6.png b/docs/ja/_snippets/images/s3/s3-6.png new file mode 100644 index 00000000000..0b39a26a340 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-6.png differ diff --git a/docs/ja/_snippets/images/s3/s3-7.png b/docs/ja/_snippets/images/s3/s3-7.png new file mode 100644 index 00000000000..7b869d71711 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-7.png differ diff --git a/docs/ja/_snippets/images/s3/s3-8.png b/docs/ja/_snippets/images/s3/s3-8.png new file mode 100644 index 00000000000..329c9e70ca1 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-8.png differ diff --git a/docs/ja/_snippets/images/s3/s3-9.png b/docs/ja/_snippets/images/s3/s3-9.png new file mode 100644 index 00000000000..5a08e26dea5 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-9.png differ diff --git a/docs/ja/_snippets/images/s3/s3-a.png b/docs/ja/_snippets/images/s3/s3-a.png new file mode 100644 index 00000000000..6dbe8745747 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-a.png differ diff --git a/docs/ja/_snippets/images/s3/s3-b.png b/docs/ja/_snippets/images/s3/s3-b.png new file mode 100644 index 00000000000..8625bdc4b29 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-b.png differ diff --git a/docs/ja/_snippets/images/s3/s3-c.png b/docs/ja/_snippets/images/s3/s3-c.png new file mode 100644 index 00000000000..aa0bd4e798c Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-c.png differ diff --git a/docs/ja/_snippets/images/s3/s3-d.png b/docs/ja/_snippets/images/s3/s3-d.png new file mode 100644 index 00000000000..404f2a3f565 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-d.png differ diff --git a/docs/ja/_snippets/images/s3/s3-e.png b/docs/ja/_snippets/images/s3/s3-e.png new file mode 100644 index 00000000000..878eb6a3e3c Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-e.png differ diff --git a/docs/ja/_snippets/images/s3/s3-f.png b/docs/ja/_snippets/images/s3/s3-f.png new file mode 100644 index 00000000000..3bad9361172 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-f.png differ diff --git a/docs/ja/_snippets/images/s3/s3-g.png b/docs/ja/_snippets/images/s3/s3-g.png new file mode 100644 index 00000000000..a1cfe53ef9e Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-g.png differ diff --git a/docs/ja/_snippets/images/s3/s3-h.png b/docs/ja/_snippets/images/s3/s3-h.png new file mode 100644 index 00000000000..6d08a3b059b Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-h.png differ diff --git a/docs/ja/about-us/_category_.yml b/docs/ja/about-us/_category_.yml new file mode 100644 index 00000000000..dfa8c8a3912 --- /dev/null +++ b/docs/ja/about-us/_category_.yml @@ -0,0 +1,6 @@ +label: 'About Us' +collapsible: true +collapsed: true +link: + type: generated-index + title: About Us diff --git a/docs/ja/about-us/adopters.md b/docs/ja/about-us/adopters.md new file mode 100644 index 00000000000..c28d11106e2 --- /dev/null +++ b/docs/ja/about-us/adopters.md @@ -0,0 +1,512 @@ +--- +slug: /ja/about-us/adopters +sidebar_label: 導入企業 +title: ClickHouse 導入企業 +sidebar_position: 60 +description: ClickHouse を導入している企業とその成功事例の一覧 +--- + +以下は、ClickHouse を導入している企業とその成功事例の一覧です。これらの情報は公開されている資料から収集されたものであり、現在の状況と異なる場合があります。貴社での ClickHouse 導入事例を共有し、[リストに追加](https://github.com/ClickHouse/clickhouse-docs/blob/main/docs/en/about-us/adopters.md)していただけると幸いです。ただし、共有に際しては NDA(秘密保持契約)に抵触しないことをご確認ください。他社の公開情報の更新も有益です。 + +
+ +| Company | Industry | Usecase | Cluster Size | (Un)Compressed Data Size\* | Reference | +|---------|----------|---------|--------------|------------------------------------------------------------------------------|-----------| +| [1Flow](https://1flow.ai/) | Feedback automation | - | — | — | ClickHouse Cloud user | +| [2gis](https://2gis.ru) | Maps | Monitoring | — | — | [Talk in Russian, July 2019](https://youtu.be/58sPkXfq6nw) | +| [3xpl](https://3xpl.com/) | Software & Technology | Blockchain Explorer | — | — | [Reddit, February 2023](https://www.reddit.com/r/ethereum/comments/1159pdg/new_ethereum_explorer_by_3xpl_no_ads_super_fast/) | +| [5CNetwork](https://www.5cnetwork.com/) | Software | Analytics | — | — | [Community Slack](https://clickhouse.com/slack) | +| [ASO.dev](https://aso.dev/) | Software & Technology | App store optimisation | — | — | [Twitter, April 2023](https://twitter.com/gorniv/status/1642847791226445828) | +| [AdGreetz](https://www.adgreetz.com/) | Software & Technology | AdTech & MarTech | — | — | [Blog, April 2023](https://clickhouse.com/blog/adgreetz-processes-millions-of-daily-ad-impressions) | +| [AdGuard](https://adguard.com/) | Anti-Ads | AdGuard DNS | — | 1,000,000 DNS requests per second from over 50 million users | [Official Website, August 2022](https://adguard.com/en/blog/adguard-dns-2-0-goes-open-source.html) | +| [AdScribe](http://www.adscribe.tv/) | Ads | TV Analytics | — | — | [A quote from CTO](https://altinity.com/24x7-support/) | +| [Adapty](https://adapty.io/) | Subscription Analytics | Main product | — | — | [Twitter, November 2021](https://twitter.com/iwitaly/status/1462698148061659139) | +| [Adevinta](https://www.adevinta.com/) | Software & Technology | Online Classifieds | — | — | [Blog, April 2023](https://clickhouse.com/blog/serving-real-time-analytics-across-marketplaces-at-adevinta) | +| [Admiral](https://getadmiral.com/) | Martech | Engagement Management | — | — | [Webinar Slides, June 2020](https://altinity.com/presentations/2020/06/16/big-data-in-real-time-how-clickhouse-powers-admirals-visitor-relationships-for-publishers) | +| [Admixer](https://admixer.com/) | Media & Entertainment | Ad Analytics | — | — | [Blog Post](https://clickhouse.com/blog/admixer-aggregates-over-1-billion-unique-users-a-day-using-clickhouse) | +| [Aggregations.io](https://aggregations.io/) | Real-time analytics | Main product | - | - | [Twitter](https://twitter.com/jsneedles/status/1734606200199889282) | +| [Ahrefs](https://ahrefs.com/) | SEO | Analytics | Main cluster is 100k+ CPU cores, 800TB RAM. | 110PB nvme storage, uncompressed data size on main cluster is 1EB. | [Job listing](https://ahrefs.com/jobs/data-scientist-search) | +| [Airfold](https://www.airfold.co/) | API platform | Main Product | - | - | [Documentation](https://docs.airfold.co/workspace/pipes) | +| [Aiven](https://aiven.io/) | Cloud data platform | Managed Service | - | - | [Blog post](https://aiven.io/blog/introduction-to-clickhouse) | +| [Akamai](https://www.akamai.com/) | Software & Technology | CDN | — | — | [LinkedIn](https://www.linkedin.com/in/david-piatek-bb27368/) | +| [Akvorado](https://demo.akvorado.net/) | Network Monitoring | Main Product | — | — | [Documentation](https://demo.akvorado.net/docs/intro) | +| [AlgoNode](https://algonode.io/) | Software & Technology | Algorand Hosting | — | — | [Twitter, April 2023](https://twitter.com/AlgoNode_io/status/1650594948998213632) | +| [Alibaba Cloud](https://cn.aliyun.com/) | Cloud | E-MapReduce | — | — | [Official Website](https://help.aliyun.com/document_detail/212195.html) | +| [Alibaba Cloud](https://cn.aliyun.com/) | Cloud | Managed Service | — | — | [Official Website](https://help.aliyun.com/product/144466.html) | +| [Aloha Browser](https://alohabrowser.com/) | Mobile App | Browser backend | — | — | [Slides in Russian, May 2019](https://presentations.clickhouse.com/meetup22/aloha.pdf) | +| [Altinity](https://altinity.com/) | Cloud, SaaS | Main product | — | — | [Official Website](https://altinity.com/) | +| [Amadeus](https://amadeus.com/) | Travel | Analytics | — | — | [Press Release, April 2018](https://www.altinity.com/blog/2018/4/5/amadeus-technologies-launches-investment-and-insights-tool-based-on-machine-learning-and-strategy-algorithms) | +| [AMP](https://useamp.com/) | Software & Technology | e-Commerce Metrics | — | — | [Twitter Post, May 2024](https://x.com/pc_barnes/status/1793846059724357832) [Meetup Slides](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup122/Talk%20Track%201%20-%20AMP's%20data%20journey%20from%20OSS%20to%20ClickHouse%20Cloud%20-%20Chris%20Lawrence%20.pdf) | +| [Android Hub](https://bestforandroid.com/) | Blogging, Analytics, Advertising data | — | — | — | [Official Website](https://bestforandroid.com/)| +| [AnswerAI](https://www.answerai.co.uk/) | Software & Technology | AI Customer Support | — | — | [Twitter, May 2024](https://twitter.com/TomAnswerAi/status/1791062219678998880) | +| [Anton](https://anton.tools/) | Software & Technology | Blockchain Indexer | — | — | [GitHub](https://github.com/tonindexer/anton) | +| [Antrea](https://antrea.io/) | Software & Technology | Kubernets Network Security | — | — | [Documentation](https://antrea.io/docs/main/docs/network-flow-visibility/) | +| [ApiRoad](https://apiroad.net/) | API marketplace | Analytics | — | — | [Blog post, November 2018, March 2020](https://pixeljets.com/blog/clickhouse-vs-elasticsearch/) | +| [Apitally](https://apitally.io/) | Software & Technology | API Monitoring | — | — | [Twitter, March 2024](https://twitter.com/simongurcke/status/1766005582971170926) | +| [Appsflyer](https://www.appsflyer.com) | Mobile analytics | Main product | — | — | [Talk in Russian, July 2019](https://www.youtube.com/watch?v=M3wbRlcpBbY) | +| [Aptabase](https://aptabase.com/) | Analytics | Privacy-first / open-source Firebase Analytics alternative | — | — | [GitHub Repository](https://github.com/aptabase/aptabase/tree/main/etc/clickhouse) | +| [ArenaData](https://arenadata.tech/) | Data Platform | Main product | — | — | [Slides in Russian, December 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup38/indexes.pdf) | +| [Argedor](https://www.argedor.com/en/clickhouse/) | ClickHouse support | — | — | — | [Official website](https://www.argedor.com/en/clickhouse/) | +| [Atani](https://atani.com/en/) | Software & Technology | Crypto Platform | — | — | [CTO LinkedIn](https://www.linkedin.com/in/fbadiola/) | +| [Autoblocks](https://autoblocks.ai) | Software & Technology | LLM Monitoring & Deployment | — | — | [Twitter, August 2023](https://twitter.com/nolte_adam/status/1690722237953794048) | +| [Aviso](https://www.aviso.com/) | AI Platform | Reporting | — | — | ClickHouse Cloud user | +| [Avito](https://avito.ru/) | Classifieds | Monitoring | — | — | [Meetup, April 2020](https://www.youtube.com/watch?v=n1tm4j4W8ZQ) | +| [Axis Communications](https://www.axis.com/en-ca) | Video surveillance | Main product | - | - | [Blog post](https://engineeringat.axis.com/schema-changes-clickhouse/) | +| [AzurePrice](https://azureprice.net/) | Analytics | Main Product | — | — | [Blog, November 2022](https://blog.devgenius.io/how-i-migrate-to-clickhouse-and-speedup-my-backend-7x-and-decrease-cost-by-6x-part-1-2553251a9059) | +| [AzurGames](https://azurgames.com/) | Gaming | Analytics | — | — | [AWS Blog, Aug 2024](https://aws.amazon.com/blogs/gametech/azur-games-migrates-all-game-analytics-data-to-clickhouse-cloud-on-aws/) | +| [B2Metric](https://b2metric.com/) | Marketing | Analytics | — | — | [ProductHunt, July 2023](https://www.producthunt.com/posts/b2metric-decision-intelligence?bc=1) | +| [Backpack Exchange](https://backpack.exchange/) | FinTech | Analytics | — | — | [Meetup, June 2024](https://clickhouse.com/videos/tokyo-meetup-orchestrating-multibillion-row-database-migration-to-clickhouse) | +| [BIGO](https://www.bigo.sg/) | Video | Computing Platform | — | — | [Blog Article, August 2020](https://www.programmersought.com/article/44544895251/) | +| [Badoo](https://badoo.com) | Dating | Timeseries | — | 1.6 mln events/sec (2018) | [Slides in Russian, December 2019](https://presentations.clickhouse.com/meetup38/forecast.pdf) | +| [Baidu](https://www.baidu.com/) | Internet services | Data warehousing | - | - | [GitHub](https://github.com/ClickHouse/ClickHouse/pull/60361) | +| [Baselime](https://baselime.io/) | Software & Technology | Observability for Serverless | — | — | [Official website](https://baselime.io/) | +| [Basic RUM](https://www.basicrum.com/) | Software & Technology | Real User Monitoring | — | — | [Official website](https://www.basicrum.com/) | +| [Beehiiv](https://www.beehiiv.com/) | Marketing | Analytics | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/data-hive-the-story-of-beehiivs-journey-from-postgres-to-clickhouse) | +| [Beeline](https://beeline.ru/) | Telecom | Data Platform | — | — | [Blog post, July 2021](https://habr.com/en/company/beeline/blog/567508/) | +| [Beetested](https://www.beetested.com/) | Software & Technology | Game Testing | — | — | [Case Study, June 2023](https://double.cloud/resources/case-studies/beetested-analyze-millions-of-gamers-emotions-with-doublecloud/) | +| [Benocs](https://www.benocs.com/) | Network Telemetry and Analytics | Main Product | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=48pAVShkeCY&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=12) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup66/Self%20repairing%20processing%20using%20ClickHouse.pdf) [Blog Post, March 2022](https://clickhouse.com/blog/-indexing-for-data-streams-benocs-telco/) [Slides in English, October 2017](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup9/lpm.pdf) | +| [Bento](https://bento.me/en/home) | Software & Technology | Personal Portfolio | — | — | [Twitter, May 2023](https://twitter.com/gubmee/status/1653405962542219264) | +| [Better Stack](https://betterstack.com/) | Cloud, SaaS | Log Management | - | - | [Official Website](https://betterstack.com/logtail) | +| [BiliBili](https://www.bilibili.com/) | Video sharing | — | — | — | [Blog post, June 2021](https://chowdera.com/2021/06/20210622012241476b.html) | +| [Binom](https://binom.org/) | Analytics | Website analytics | — | — | [Twitter, 2023](https://twitter.com/BinomTracker/status/1722948130948206940) | +| [Bitquery](https://bitquery.io/) | Software & Technology | Blockchain Data Company | — | — | [HackerNews, December 2020](https://bitquery.io/blog/blockchain-intelligence-system) | +| [Bloomberg](https://www.bloomberg.com/) | Finance, Media | Monitoring | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=HmJTIrGyVls&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=9) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/ClickHouse%20for%20Financial%20Analytics%20-%20Bloomberg.pdf) | +| [Bloxy](https://bloxy.info) | Blockchain | Analytics | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/4_bloxy.pptx) | +| [Bonree](https://www.bonree.com/) | Software & Technology | Performance Monitoring & Observability | — | — | ClickHouse Meetup in Hangzhou, May 2024 | +| [Bonside](https://www.bonside.com/) | FinTech | - | — | — | [HackerNews, July 2023](https://news.ycombinator.com/item?id=36619722) | +| [Botify](https://www.botify.com/) | SaaS | SEO | — | — | [Blog Article, September 2022](https://tech.marksblogg.com/billion-taxi-rides-doublecloud-clickhouse.html) | +| [Braintrust](https://www.usebraintrust.com/) | Software & Technology | Real-time Analytics | — | — | [Written Blog from Meetup Video, July 2024](https://clickhouse.com/blog/building-better-ai-products-faster-how-braintrust-uses-clickhouse-for-real-time-data-analysis) | +| [ByConity](https://byconity.github.io/)| Software & Technology | Big Data Analysis Engine | — | — | [GitHub](https://github.com/ByConity/ByConity) | +| [Bytedance](https://www.bytedance.com) | Social platforms | — | — | — | [The ClickHouse Meetup East, October 2020](https://www.youtube.com/watch?v=ckChUkC3Pns) | +| [CARTO](https://carto.com/) | Business Intelligence | Geo analytics | — | — | [Geospatial processing with ClickHouse](https://carto.com/blog/geospatial-processing-with-clickhouse/) | +| [CERN](http://public.web.cern.ch/public/) | Research | Experiment | — | — | [Press release, April 2012](https://www.yandex.com/company/press_center/press_releases/2012/2012-04-10/) | +| [CHEQ](https://cheq.ai/) | Software & Technology | GTM Security | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=rxIO6w4er3k&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=7) [Slides, January 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup68/ClickHouse%20Meetup%20-%20CHEQ.pptx.pdf) | +| [Campaign Deputy](https://campaigndeputy.com/) | SaaS | Analytics, Logs | — | — | [Twitter, February 2023](https://twitter.com/joshabartley/status/1627669208074014721), [Tweet, July 2023](https://twitter.com/joshabartley/status/1677008728711651331) | +| [Canopus Networks](https://canopusnetworks.com/) | AI for telcos | Real-time analytics | - | - | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup126/Talk%20Track%201%20-%20Canopus%20Networks.pdf) | +| [Capgo.app](https://capgo.app/) | App development | Real-time statistics | - | - | [Twitter](https://twitter.com/martindonadieu/status/1735728943406219736) | +| [CardsMobile](https://cardsmobile.ru/) | Finance | Analytics | — | — | [VC.ru](https://vc.ru/s/cardsmobile/143449-rukovoditel-gruppy-analiza-dannyh) | +| [Castle](https://castle.io/) | Fraud Detection | Main product | — | — | [Community Slack](https://clickhouse.com/slack) | +| [Cato Networks](https://www.catonetworks.com/) | Network Security | Security event analytics | — | 8B (4TB) new events per day | [Full Stack Developers Israel, Jan 2023](https://www.youtube.com/watch?v=Is4TC2gf5EM) | +| [CDN77](https://www.cdn77.com/) | Software & Technology | Content Delivery Network | — | — | [GitHub Comment, April 2024](https://github.com/ClickHouse/ClickHouse/issues/61093#issuecomment-2070150654) | +| [Chainbase](https://chainbase.online/) | Blockchain | Main product | — | — | [Documentation](https://docs.chainbase.online/r/data-cloud-studio/data-cloud-api) | +| [ChatLayer](https://chatlayer.ai/) | AI virtual assistants | Analytics | — | — | [Press Release, December 2021](https://aiven.io/blog/aiven-for-clickhouse-now-generally-available) | +| [Checkly](https://www.checklyhq.com/) | Software Development | Analytics | — | — | [Twitter, October 2021](https://twitter.com/tim_nolet/status/1445810665743081474?s=20) | +| [ChelPipe Group](https://chelpipegroup.com/) | Analytics | — | — | — | [Blog post, June 2021](https://vc.ru/trade/253172-tyazhelomu-proizvodstvu-user-friendly-sayt-internet-magazin-trub-dlya-chtpz) | +| [Chroma](https://www.trychroma.com/) | Software & Technology | AI-native embedded database | — | — | [GitHub Repository](https://github.com/chroma-core/chroma) [Twitter, February 2023](https://twitter.com/atroyn/status/1625605732644298752) | +| [CipherStash](https://cipherstash.com/) | Software & Technology | Analytics | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup126/Talk%20Track%203%20-%20CipherStash.pdf) | +| [Cisco](http://cisco.com/) | Networking | Traffic analysis | — | — | [Lightning talk, October 2019](https://youtu.be/-hI1vDR2oPY?t=5057) | +| [Citadel Securities](https://www.citadelsecurities.com/) | Finance | — | — | — | [Contribution, March 2019](https://github.com/ClickHouse/ClickHouse/pull/4774) | +| [Citymobil](https://city-mobil.ru) | Taxi | Analytics | — | — | [Blog Post in Russian, March 2020](https://habr.com/en/company/citymobil/blog/490660/) | +| [Clearbit](https://clearbit.com/) | AI | Product usage | — | — | ClickHouse Cloud user | +| [ClickFunnels](https://www.clickfunnels.com/) | Website Builder | | — | — | ClickHouse Cloud user | +| [ClickVisual](https://clickvisual.net/) | Software | Logging Platform | — | — | [Blog Post, May 2022](https://golangexample.com/a-light-weight-log-visual-analytic-platform-for-clickhouse/) | +| [Clog](https://www.hybridlogic.co.uk/) | Software & Technology | Logging | — | — | [Blog, February 2023](https://www.hybridlogic.co.uk/2023/02/clog/) | +| [Cloudflare](https://cloudflare.com) | CDN | Traffic analysis | 36 servers | — | [Blog post, May 2017](https://blog.cloudflare.com/how-cloudflare-analyzes-1m-dns-queries-per-second/), [Blog post, March 2018](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/) | +| [CloudRaft](https://www.cloudraft.io/) | Software & Technology | Consulting Services | — | — | [Twitter, May 2024](https://x.com/anjuls/status/1792048331805606156) | +| [Codegiant](https://codegiant.io/) | Security | Main product | — | — | [Blog, December 2023](https://blog.codegiant.io/clickhouse-in-codegiant-observability-ecosystem/) | +| [Cognitiv](https://cognitiv.ai/) | AdTech | Offline Feature Store | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/transforming-ad-tech-how-cognitiv-uses-clickhouse-to-build-better-machine-learning-models) | +| [Coinhall](https://coinhall.org/) | Web3 | Blockchain Data Platform | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/trade-secrets-how-coinhall-uses-clickhouse-to-power-its-blockchain-data-platform) | +| [Coinpaprika](https://coinpaprika.com/) | Software & Technology | Cryptocurrency Market Data Analysis | — | — | [Blog, May 2023](https://clickhouse.com/blog/coinpaprika-aggregates-pricing-data) | +| [Comcast](https://corporate.comcast.com/) | Media | CDN Traffic Analysis | — | — | [ApacheCon 2019 Talk](https://www.youtube.com/watch?v=e9TZ6gFDjNg) | +| [Common Room](https://www.commonroom.io/) | Marketing SaaS | Real-Time Analytics | — | — | [Seattle Meetup, March 2024](https://www.youtube.com/watch?v=liTgGiTuhJE) | +| [Constructor](https://constructor.io/) | E-commerce Search | E-commerce Search | — | — | ClickHouse Cloud user | +| [Contentsquare](https://contentsquare.com) | Web analytics | Main product | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=zvuCBAl2T0Q&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=5) [Blog Post, October 2022](https://clickhouse.com/blog/contentsquare-migration-from-elasticsearch-to-clickhouse) [Blog post in French, November 2018](http://souslecapot.net/2018/11/21/patrick-chatain-vp-engineering-chez-contentsquare-penser-davantage-amelioration-continue-que-revolution-constante/) | +| [Coroot](https://coroot.com/) | Software & Technology | Observability | — | — | [Twitter, July 2023](https://twitter.com/coroot_com/status/1680993372385804288?s=20) | +| [Corsearch](https://corsearch.com/) | Marketing SaaS (Brand Protection) | Main Datastore | — | — | [Seattle Meetup, March 2023](https://www.youtube.com/watch?v=BuS8jFL9cvw&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) | +| [Corunet](https://coru.net/) | Analytics | Main product | — | — | [Slides in English, April 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup21/predictive_models.pdf) | +| [Covalent](https://www.covalenthq.com/) | Financial - Crypto | Blockchain analysis | — | — | ClickHouse Cloud user | +| [CraiditX 氪信](https://www.creditx.com) | Finance AI | Analysis | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/udf.pptx) | +| [Craigslist](https://sfbay.craigslist.org/) | Classifieds | Rate limiting (Redis replacement) | — | — | [SF Meetup, March 2024](https://www.youtube.com/watch?v=wRwqrbUjRe4&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=9) | +| [Crazypanda](https://crazypanda.ru/en/) | Games | | — | — | Live session on ClickHouse meetup | +| [Criteo](https://www.criteo.com/) | Retail | Main product | — | — | [Slides in English, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/3_storetail.pptx) | +| [Cryptology](https://cryptology.com/) | Digital Assets Trading Platform | — | — | — | [Job advertisement, March 2021](https://career.habr.com/companies/cryptology/vacancies) | +| [Culver Max Entertainment/Sony Pictures](https://www.sonypicturesnetworks.com/overview) | Television/Entertainment | Media streaming analytics | — | — | ClickHouse Cloud user | +| [Cumul.io](https://www.cumul.io) | Software & Technology | Customer Analytics | — | — | [Blog Post, June 2022](https://clickhouse.com/blog/optimizing-your-customer-facing-analytics-experience-with-cumul-io-and-clickhouse) | +| [DB Pilot](https://www.dbpilot.io/)| Software & Technology | Database GUI | — | — | [Twitter, August 2023](https://twitter.com/dennis_hellweg/status/1701349566354686143) | +| [DENIC](https://www.denic.de/) | Software & Technology | Data Science Analytics | — | — | [Blog Post, May 2022](https://clickhouse.com/blog/denic-improves-query-times-by-10x-with-clickhouse) | +| [DNSMonster](https://dnsmonster.dev/) | Software & Technology | DNS Monitoring | — | — | [GitHub Repository](https://github.com/mosajjal/dnsmonster) | +| [Darwinium](https://www.darwinium.com/) | Software & Technology | Security and Fraud Analytics | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/fast-feature-rich-and-mutable-clickhouse-powers-darwiniums-security-and-fraud-analytics-use-cases) | +| [Dashdive](https://www.dashdive.com/) | Infrastructure management | Analytics | — | — | [Hackernews, 2024](https://news.ycombinator.com/item?id=39178753) | +| [Dassana](https://lake.dassana.io/) | Cloud data platform | Main product | - | - | [Blog Post, Jan 2023](https://clickhouse.com/blog/clickhouse-powers-dassanas-security-data-lake) [Direct reference, April 2022](https://news.ycombinator.com/item?id=31111432) | +| [Datafold](https://www.datafold.com/) | Data Reliability Platform | — | — | — | [Job advertisement, April 2022](https://www.datafold.com/careers) | +| [Dataliance for China Telecom](https://www.chinatelecomglobal.com/) | Telecom | Analytics | — | — | [Slides in Chinese, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/telecom.pdf) | +| [DeepFlow](https://deepflow.io) | Software & Technology | Observability | — | — | [GitHub](https://github.com/deepflowio/deepflow) | +| [DeepL](https://www.deepl.com/) | Machine Learning | — | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/deepls-journey-with-clickhouse) [Video, October 2021](https://www.youtube.com/watch?v=WIYJiPwxXdM&t=1182s) | +| [Deepglint 格灵深瞳](https://www.deepglint.com/) | AI, Computer Vision | OLAP | — | — | [Official Website](https://www.deepglint.com/) | +| [Deeplay](https://deeplay.io/eng/) | Gaming Analytics | — | — | — | [Job advertisement, 2020](https://career.habr.com/vacancies/1000062568) | +| [Depot](https://depot.dev/) | Software & Technology | CI & Build Acceleration | — | — | [Twitter, April 2024](https://twitter.com/jacobwgillespie/status/1778463642150695048) | +| [Deutsche Bank](https://db.com) | Finance | BI Analytics | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=O3GJ6jag3Hc&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=11) [Slides in English, October 2019](https://bigdatadays.ru/wp-content/uploads/2019/10/D2-H3-3_Yakunin-Goihburg.pdf) | +| [DevHubStack](http://devhubstack.com/) | Software & Technology | Community Management | — | — | [Twitter, May 2024](https://twitter.com/thedevhubstack/status/1790655455229771789) | +| [Didi](https://web.didiglobal.com/) | Transportation & Ride Sharing | Observability | 400+ logging, 40 tracing | PBs/day / 40GB/s write throughput, 15M queries/day, 200 QPS peak | [Blog, Apr 2024](https://clickhouse.com/blog/didi-migrates-from-elasticsearch-to-clickHouse-for-a-new-generation-log-storage-system) | +| [DigiCert](https://www.digicert.com) | Network Security | DNS Platform | — | over 35 billion events per day | [Job posting, Aug 2022](https://www.indeed.com/viewjob?t=Senior+Principal+Software+Engineer+Architect&c=DigiCert&l=Lehi,+UT&jk=403c35f96c46cf37&rtk=1g9mnof7qk7dv800) | +| [Disney+](https://www.disneyplus.com/) | Video Streaming | Analytics | — | 395 TiB | [Meetup Video, December 2022](https://www.youtube.com/watch?v=CVVp6N8Xeoc&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=8) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/Disney%20plus%20ClickHouse.pdf) | +| [Dittofeed](https://dittofeed.com/) | Software & Technology | Open Source Customer Engagement | — | — | [Hackernews, June 2023](https://news.ycombinator.com/item?id=36061344) | +| [Diva-e](https://www.diva-e.com) | Digital consulting | Main Product | — | — | [Slides in English, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup29/ClickHouse-MeetUp-Unusual-Applications-sd-2019-09-17.pdf) | +| [Dolphin Emulator](https://dolphin-emu.org/) | Games | Analytics | — | — | [Twitter, Sept 2022](https://twitter.com/delroth_/status/1567300096160665601) | +| [DotSentry](https://forum.polkadot.network/t/dotsentry-ecosystem-wide-monitoring-solution/8210) | Software & Technology | Monitoring for Polkadot Ecosystem | — | — | [Forum Post, May 2024](https://forum.polkadot.network/t/dotsentry-ecosystem-wide-monitoring-solution/8210) | +| [DrDroid](https://www.drdroid.io/)| Software & Technology | Monitoring | — | — | [Slack, August 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1694151014185729) | +| [Duckbill Group](https://www.duckbillgroup.com/)| Software & Technology | — | — | — | [Twitter, May 2024](https://twitter.com/mike_julian/status/1789737184192315876) | +| [eBay](https://www.ebay.com/) | E-commerce | Logs, Metrics and Events | — | — | [Official website, Sep 2020](https://tech.ebayinc.com/engineering/ou-online-analytical-processing/) | +| [Ecommpay](https://ecommpay.com/) | Payment Processing | Logs | — | — | [Video, Nov 2019](https://www.youtube.com/watch?v=d3GdZTOWGLk) | +| [Ecwid](https://www.ecwid.com/) | E-commerce SaaS | Metrics, Logging | — | — | [Slides in Russian, April 2019](https://nastachku.ru/var/files/1/presentation/backend/2_Backend_6.pdf) | +| [Effodio](https://www.effodio.com/) | Observability, Root cause analysis | Event storage | - | - | [Blog, 2024](https://peng.fyi/post/factorial-growth-of-clickhouse-with-clause/)| +| [Egg](https://github.com/ducc/egg) | Error Aggregation | Main Product | — | — | [GitHub repository](https://github.com/ducc/egg) | +| [Engage](https://engage.so/) | Software & Technology | Customer Engagement | — | — | [Twitter Post, May 2024](https://x.com/kehers/status/1793935987778724038) | +| [Ensemble](https://ensembleanalytics.io/) | Analytics | Analytics | — | — | [Official website, Sep 2020](https://ensembleanalytics.io/blog/why-we-went-all-in-clickhouse) | +| [EventBunker.io](https://www.eventbunker.io/) | Serverless Data Processing | — | — | — | [Twitter, April 2021](https://twitter.com/Halil_D_/status/1379839133472985091) | +| [ExitLag](http://www.exitlag.com/) | Software & Technology | Gaming Data Routing | — | — | [Blog, June 2023](https://clickhouse.com/blog/boosting-game-performance-exitlag-quest-for-a-better-data-management-system) | +| [ExitLag](https://www.exitlag.com/) | Software & Technology | Optimized Gaming Experience | — | — | [ClickHouse Blog, June 2023](https://clickhouse.com/blog/boosting-game-performance-exitlag-quest-for-a-better-data-management-system) | +| [Exness](https://www.exness.com/) | Trading | Metrics, Logging | — | — | [Talk in Russian, May 2019](https://youtu.be/_rpU-TvSfZ8?t=3215) | +| [Explo](https://www.explo.co/) | Analytics | - | — | — | [Integrations Page, August 2022](https://www.explo.co/integrations/clickhouse) | +| [Fastly](https://www.fastly.com/) | Internet Services | Metrics (Graphite replacement) | — | — | [Boston Meetup, Dec 2023](https://clickhouse.com/videos/scaling-graphite-with-clickhouse) | +| [FastNetMon](https://fastnetmon.com/) | DDoS Protection | Main Product | | — | [Official website](https://fastnetmon.com/docs-fnm-advanced/fastnetmon-advanced-traffic-persistency/) | +| [Fastnear](https://fastnear.com/) | Infrastructure | Main product | — | — | [Twitter, 2024](https://twitter.com/ekuzyakov/status/1762500731154698421) | +| [FeatBit](https://www.featbit.co/) | Software & Technology | Feature Flag Management | — | — | [GitHub, August 2023](https://github.com/featbit/featbit) | +| [FinBox](https://finbox.in/)| Software & Technology | Financial Services | — | — | [Slack](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1688198501884219) | +| [Fingerprint](https://fingerprint.com/) | Fraud detection | Fraud detection | — | — | [Meetup](https://www.linkedin.com/posts/system29a_clickhouse-meetup-in-berlin-tue-may-16-activity-7063805876570050561-UE-n/) | +| [Firebolt](https://www.firebolt.io/) | Analytics | Main product | - | - | [VLDB 2022 paper](https://www.firebolt.io/content/firebolt-vldb-cdms-2022), [VLDB 2022 slides](https://cdmsworkshop.github.io/2022/Slides/Fri_C2.5_MoshaPasumansky.pdf) | +| [Fl0](https://www.fl0.com/) | Cloud | Server management | - | - | [Meetup presentation](https://presentations.clickhouse.com/?path=meetup94) | +| [Flipkart](https://www.flipkart.com/) | e-Commerce | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=239) | +| [Flipt](https://www.flipt.io/) | Software | Software development management | - | - | [Blog, 2024](https://www.flipt.io/blog/analytics-with-clickhouse) | +| [FortiSIEM](https://www.fortinet.com/) | Information Security | Supervisor and Worker | — | — | [Documentation](https://help.fortinet.com/fsiem/6-6-0/Online-Help/HTML5_Help/clickhouse_config.htm) | +| [Fortis Games](https://fortisgames.com/) | Game studio | Online data analytics | - | — | [Blog post, July 2023](https://thenewstack.io/a-real-time-data-platform-for-player-driven-game-experiences/) | +| [Foxway](https://www.foxway.com/en/) | Software & Technology | e-Commerce | — | — | [ClickHouse Meetup, April 2024](https://twitter.com/ClickHouseDB/status/1782833838886121492) | +| [Friendly Captcha](https://friendlycaptcha.com) | Bot Protection | — | — | — | [Job Posting, Aug 2022](https://news.ycombinator.com/item?id=32311825) | +| [FunCorp](https://fun.co/rp) | Games | | — | 14 bn records/day as of Jan 2021 | [Article](https://www.altinity.com/blog/migrating-from-redshift-to-clickhouse) | +| [Futurra Group](https://futurragroup.com/) | Analytics | — | — | — | [Article in Russian, December 2021](https://dou.ua/forums/topic/35587/) | +| [G-Core Labs](https://gcorelabs.com/) | Security | Main product | — | — | [Job posting, May 2022](https://careers.gcorelabs.com/jobs/Careers) | +| [Galaxy-Future](https://www.galaxy-future.com/en/home) | Software & Technology | Metric Monitoring & Measurement | — | — | [CudgX GitHub Repository](https://github.com/galaxy-future/cudgx) | +| [Geniee](https://geniee.co.jp) | Ad network | Main product | — | — | [Blog post in Japanese, July 2017](https://tech.geniee.co.jp/entry/2017/07/20/160100) | +| [Genotek](https://www.genotek.ru/) | Bioinformatics | Main product | — | — | [Video, August 2020](https://youtu.be/v3KyZbz9lEE) | +| [Gigapipe](https://gigapipe.com/) | Managed ClickHouse | Main product | — | — | [Official website](https://gigapipe.com/) | +| [Gigasheet](https://gigasheet.co/) | Analytics | Main product | — | — | Direct Reference, February 2022| +| [GitLab](https://gitlab.com/) | Code and DevOps | APM | — | — | [Official website](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm) | +| [Glaber](https://glaber.io/) | Monitoring | Main product | — | — | [Website](https://glaber.io/) | +| [Glenrose Group](https://www.glenrosegroup.com/) | Expense management | — | — | — | [Twitter](https://twitter.com/EncodedRose/status/1706145758897180783) | +| [Gluten](https://github.com/oap-project/gluten) | Software & Technology | Spark performance | — | — | [Github, July 2023](https://github.com/oap-project/gluten) | +| [Goldsky](https://goldsky.com/) | Software & Technology | Blockchain data analytics | - | — | [Documentation, July 2023](https://docs.goldsky.com/) | +| [Good Job Games](https://goodjobgames.com/) | Games | Event Processing | — | — | [Job Posting, Aug 2022](https://news.ycombinator.com/item?id=32313170) | +| [Goodpeople](https://twitter.com/_suzychoi/status/1702113350258180245) | Human Resources | OLAP | — | — | [Twitter, 2023](https://twitter.com/_suzychoi/status/1702113350258180245) | +| [Gorgias](https://www.gorgias.com/) | Software & Technology | eCommerce Helpdesk Analytics | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1682502827729909) | +| [Grafbase](https://grafbase.com/) | Software & Technology | GraphQL API Management | — | — | [Blog, June 2023](https://grafbase.com/blog/how-to-build-your-own-realtime-analytics-dashboards) | +| [GraphCDN](https://graphcdn.io/) | CDN | Traffic Analytics | — | — | [Blog Post in English, August 2021](https://altinity.com/blog/delivering-insight-on-graphql-apis-with-clickhouse-at-graphcdn/) | +| [GraphJSON](https://www.graphjson.com) | Cloud analytics platform | Main product | - | - | [Official Website, November 2021](https://www.graphjson.com/guides/about) | +| [GraphQL Hive](https://graphql-hive.com/) | Software Development | Traffic analysis | — | — | [Source code](https://github.com/kamilkisiela/graphql-hive) | +| [Groundcover](https://groundcover.com/) | Observability | Kubernetes Observability | - | — | [Documentation, July 2023](https://docs.groundcover.com/docs/learn-more/architecture) | +| [Grouparoo](https://www.grouparoo.com) | Data Warehouse Integrations | Main product | — | — | [Official Website, August 2021](https://www.grouparoo.com/integrations) | +| [Growthbook](https://www.growthbook.io) | Open Source Feature Flagging | Integration | — | — | [Official Website, July 2022](https://www.growthbook.io) | +| [Gumlet](https://www.gumlet.com/) | CDN | Analytics | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup133/Talk%20Track%202%20-%20Gumlet.pdf) | +| [HUYA](https://www.huya.com/) | Video Streaming | Analytics | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/7.%20ClickHouse万亿数据分析实践%20李本旺(sundy-li)%20虎牙.pdf) | +| [Haibo 海博科技](https://www.botech.com.cn/) | Big Data | OLAP | — | — | [Personal reference](https://github.com/ClickHouse/clickhouse-docs/pull/279) | +| [Helicone](https://helicone.ai) | Software & Technology | LLM monitoring | — | — | [Meetup, August 2023](https://clickhouse.com/blog/helicones-migration-from-postgres-to-clickhouse-for-advanced-llm-monitoring) | +| [Hewlett-Packard](https://www.hp.com) | Software & Technology | - | — | — | [LinkedIn post, November 2023](https://www.indeed.com/viewjob?t=Machine+Learning+Engineer&c=Hewlett-Packard+CDS+GmbH&l=Houston,+TX&jk=109385f349350746&rtk=1hg3128s9kkf6800) | +| [Hi-Fi](https://hi.fi/) | Software & Technology | Music Industry Analytics | — | — | [Blog Post, January 2023](https://clickhouse.com/blog/hifis-migration-from-bigquery-to-clickhouse) | +| [Highlight](https://www.highlight.io/) | Software & Technology | Monitoring | — | — | [Hacker News, February 2023](https://news.ycombinator.com/item?id=34897645), [GitHub](https://github.com/highlight/highlight/tree/87f7e3882b88e9019d690847a134231e943890fe/backend/clickhouse) | +| [HockeyStack](https://hockeystack.com/) | Analytics platform | OLAP | — | — | [Blog](https://hockeystack.com/blog/a-new-database/) | +| [Honeybadger](https://www.honeybadger.io/) | Software | Error tracking | - | - | [Mastadon 2024](https://hachyderm.io/@wood/111904268945097226) | +| [Hookdeck](https://hookdeck.com/) | Software & Technology | Webhook | — | — | [Twitter, June 2023](https://twitter.com/mkherlakian/status/1666214460824997889) | +| [Hopsteiner](https://www.hopsteiner.com/) | Agriculture | - | — | — | [Job post, July 2023](https://www.indeed.com/viewjob?t=Systems+Administrator&c=S+S+STEINER&l=Yakima,+WA&jk=5b9b7336de0577d5&rtk=1h45ruu32j30q800&from=rss) | +| [Horizon](https://horizon.io/)| Software & Technology | Gaming Analytics | — | — | [Twitter, July 2023](https://twitter.com/peterk/status/1677099027110805504) | +| [Hubalz](https://hubalz.com) | Web analytics | Main product | — | — | [Twitter, July 2023](https://twitter.com/Derinilkcan/status/1676197439152312321) | +| [Hydrolix](https://www.hydrolix.io/) | Cloud data platform | Main product | — | — | [Documentation](https://docs.hydrolix.io/guide/query) | +| [HyperDx](https://www.hyperdx.io/) | Software & Technology | Open Telemetry | — | — | [HackerNews, May 2023](https://news.ycombinator.com/item?id=35881942) | +| [Hystax](https://hystax.com) | Cloud Operations | Observability Analytics | - | - | [Blog](https://hystax.com/clickhouse-for-real-time-cost-saving-analytics-how-to-stop-hammering-screws-and-use-an-electric-screwdriver/) | +| [IBM](https://www.ibm.com) | APM Platform | Ex-Instana | — | — | See Instana | +| [IBM QRadar](https://www.ibm.com) | IBM QRadar Log Insights | Main Product | — | — | [IBM Blog](https://www.ibm.com/blog/closing-breach-window-from-data-to-action/) | +| [ICA](https://www.the-ica.com/) | FinTech | Risk Management | — | — | [Blog Post in English, Sep 2020](https://altinity.com/blog/clickhouse-vs-redshift-performance-for-fintech-risk-management?utm_campaign=ClickHouse%20vs%20RedShift&utm_content=143520807&utm_medium=social&utm_source=twitter&hss_channel=tw-3894792263) | +| [Idealista](https://www.idealista.com) | Real Estate | Analytics | — | — | [Blog Post in English, April 2019](https://clickhouse.com/blog/en/clickhouse-meetup-in-madrid-on-april-2-2019) | +| [Improvado](https://improvado.io/) | Revenue Operations | Data Stack | — | — | [Blog Post, December 2021](https://improvado.io/blog/clickhouse-warehousing-pricing) | +| [INCREFF](https://www.increff.com/) | Retail Technology | Business Intelligence | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup133/Talk%20Track%203%20-%20Scaling%20BI%20at%20Increff%20with%20Clickhouse.pdf) | +| [Inigo](https://inigo.io/) | Software & Technology | GraphQL Gateway | — | — | [Blog, March 2023](https://inigo.io/blog/materialized_views_and_clickhouse) [Blog, June 2023](https://clickhouse.com/blog/harnessing-the-power-of-materialized-views-and-clickhouse-for-high-performance-analytics-at-inigo) | +| [Infobaleen](https://infobaleen.com) | AI markting tool | Analytics | — | — | [Official site](https://infobaleen.com) | +| [Infovista](https://www.infovista.com/) | Networks | Analytics | — | — | [Slides in English, October 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup30/infovista.pdf) | +| [Inngest](https://www.inngest.com/) | Software & Technology | Serverless queues and jobs | — | — | [TechCrunch, July 2023](https://techcrunch.com/2023/07/12/inngest-helps-developers-build-their-backend-workflows-raises-3m/) | +| [InnoGames](https://www.innogames.com) | Games | Metrics, Logging | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/graphite_and_clickHouse.pdf) | +| [Instabug](https://instabug.com/) | APM Platform | Main product | — | — | [Blog Post, May 2022](https://clickhouse.com/blog/10x-improved-response-times-cheaper-to-operate-and-30-storage-reduction-why-instabug-chose-clickhouse-for-apm) | +| [Instacart](https://instacart.com/) | Delivery | Data Engineering and Infrastructure | — | — | [Blog Post, May 2022](https://www.instacart.com/company/how-its-made/data-engineering-and-infrastructure-at-instacart-with-engineering-manager-abhi-kalakuntla/) | +| [Instana](https://www.instana.com) | APM Platform | Main product | — | — | [Twitter post](https://twitter.com/mieldonkers/status/1248884119158882304) | +| [Integros](https://integros.com) | Platform for video services | Analytics | — | — | [Slides in Russian, May 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [inwt](https://www.inwt-statistics.com/) | Software & Technology | Data Science | — | — | [Blog Post, December 2023](https://www.inwt-statistics.com/blog/business_case_air_pollution_forecast) | +| [Ippon Technologies](https://ippon.tech) | Technology Consulting | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=205) | +| [Ivi](https://www.ivi.ru/) | Online Cinema | Analytics, Monitoring | — | — | [Article in Russian, Jan 2018](https://habr.com/en/company/ivi/blog/347408/) | +| [Jerry](https://getjerry.com/) | Automotive SaaS | Analytics (Migrate from Redshift) | — | — | [Blog, May 2024](https://juicefs.com/en/blog/user-stories/read-write-separation) | +| [Jinshuju 金数据](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) | +| [Jitsu](https://jitsu.com) | Cloud Software | Data Pipeline | — | — | [Documentation](https://jitsu.com/docs/destinations-configuration/clickhouse-destination), [Hacker News post](https://news.ycombinator.com/item?id=29106082) | +| [JuiceFS](https://juicefs.com/) | Storage | Shopping Cart | - | - | [Blog](https://juicefs.com/blog/en/posts/shopee-clickhouse-with-juicefs/) | +| [June](https://www.june.so/) | Product analytics | Main product | - | - | [Job post](https://www.ycombinator.com/companies/june/jobs/SHd7fFLYG-founding-engineer) | +| [Juspay](https://juspay.in/) | Software & Technology | Payments | — | — | [Blog, March 2023](https://clickhouse.com/blog/juspay-analyzes-payment-transactions-in-real-time-with-clickhouse) | +| [KGK Global](https://www.kgk-global.com/en/) | Vehicle monitoring | — | — | — | [Press release, June 2021](https://zoom.cnews.ru/news/item/530921) | +| [KMK Online](https://www.kmkonline.co.id/) | Digital Services | Streaming analytics | — | — | ClickHouse Cloud user | +| [Kaiko](https://www.kaiko.com/) | Digital Assets Data Provider | — | — | — | [Job advertisement, April 2022](https://kaiko.talentlyft.com/) | +| [Kakaocorp](https://www.kakaocorp.com/) | Internet company | — | — | — | [if(kakao)2020](https://tv.kakao.com/channel/3693125/cliplink/414129353), [if(kakao)2021](https://if.kakao.com/session/24) | +| [Klaviyo](https://www.klaviyo.com/) | E-Commerce Marketing Automation Platform| — | 128 nodes | — | [Klaviyo Engineering Blog, Jan 2023](https://klaviyo.tech/adaptive-concurrency-control-for-mixed-analytical-workloads-51350439aeec) , [Klaviyo Engineering Blog, July 2023](https://klaviyo.tech/taking-the-first-sip-an-overview-of-klaviyos-segmentation-improvement-project-7db997f36b39) | +| [Knock.app](https://knock.app/) | Software | Notifications management | - | - | [Twitter, 2024](https://twitter.com/cjbell_/status/1759989849577181356)| +| [Kodiak Data](https://www.kodiakdata.com/) | Clouds | Main product | — | — | [Slides in Engish, April 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup13/kodiak_data.pdf) | +| [Kontur](https://kontur.ru) | Software Development | Metrics | — | — | [Talk in Russian, November 2018](https://www.youtube.com/watch?v=U4u4Bd0FtrY) | +| [Kopo Kopo](https://kopokopo.co.ke/) | FinTech | Metrics | — | — | ClickHouse Cloud user | +| [Kuaishou](https://www.kuaishou.com/) | Video | — | — | — | [ClickHouse Meetup, October 2018](https://clickhouse.com/blog/en/2018/clickhouse-community-meetup-in-beijing-on-october-28-2018/) | +| [Kujiale 酷家乐](https://www.kujiale.com/) | VR smart interior design platform. | Use in log monitoring platform. | Main cluster is 800+ CPU cores, 4000+ GB RAM. | SSD 140+ TB, HDD 280+ TB. | [Blog, July 2023](https://juejin.cn/post/7251786922615111740/) | +| [Kyligence](https://kyligence.io/) | Managed Service | Main Product | — | — | [Website](https://kyligence.io/all-inclusive-olap/) | +| [LANCOM Systems](https://www.lancom-systems.com/) | Network Solutions | Traffic analysis | - | - | [ClickHouse Operator for Kubernetes](https://www.lancom-systems.com/), [Hacker News post](https://news.ycombinator.com/item?id=29413660) | +| [Langchain](https://www.langchain.com/) | Software & Technology | LLM Monitoring | - | - | [Blog, Apr 2024](https://clickhouse.com/blog/langchain-why-we-choose-clickhouse-to-power-langchain) | +| [Langtrace AI](https://www.langtrace.ai/) | Software & Technology | LLM Monitoring | - | - | [Twitter, May 2024](https://x.com/karthikkalyan90/status/1790483625743716703) | +| [Lago](https://www.getlago.com/) | Billing automation | - | — | — | [GitHub Wiki post](https://github.com/getlago/lago/wiki/How-ClickHouse-saved-our-events-engine-problem) | +| [Lagon](https://lagon.app/) | Software Development | Serverless Functions | — | — | [Twitter, 2023](https://twitter.com/tomlienard/status/1702759256909394010) | +| [Laudspeaker](https://laudspeaker.com/) | Software & Technology | Open Source Messaging | — | — | [GitHub](https://github.com/laudspeaker/laudspeaker) | +| [Lawrence Berkeley National Laboratory](https://www.lbl.gov) | Research | Traffic analysis | 5 servers | 55 TiB | [Slides in English, April 2019](https://www.smitasin.com/presentations/2019-04-17_DOE-NSM.pdf) | +| [Lever](https://www.lever.co/) | Talent Management | Recruiting | - | - | [Hacker News post](https://news.ycombinator.com/item?id=29558544) | +| [LifeStreet](https://lifestreet.com/) | Ad network | Main product | 75 servers (3 replicas) | 5.27 PiB | [Blog post in Russian, February 2017](https://habr.com/en/post/322620/) | +| [LimeChat](https://www.limechat.ai/) | Mobile chat | Whatsapp Commerce | - | - | [LinkedIn 2024](https://www.linkedin.com/pulse/scaling-analytics-clickhouse-story-nikhil-gupta-gezcc/)| +| [LiteLLM](https://github.com/BerriAI/litellm) | Software | API management | | - | [GitHub](https://github.com/BerriAI/litellm/blob/e7b88c2134a013f527304de29358238a5593f91f/cookbook/misc/clickhouse_insert_logs.py#L4) | +| [Little Red Book (Xiaohongshu)](http://www.xiaohongshu.com/) | Social Media | Data warehouse | — | — | [Presentation, March 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup71/LittleRedBook.pdf) | +| [LogfireAI](https://logfire.ai/) | Software & Technology | Monitoring & Observability | — | — | [Twitter, March 2024](https://twitter.com/logfire_ai/status/1765947119200841883) | +| [LogSnag](https://logsnag.com/) | Software & Technology | Realtime Monitoring | — | — | [Interview, December 2022](https://founderbeats.com/shayan-on-building-and-growing-logsnag-as-a-solo-founder) | +| [Logtail](https://betterstack.com/logtail) | Cloud, SaaS | Log Management | - | - | [Official Website](https://betterstack.com/logtail) | +| [Loja Integrada](https://lojaintegrada.com.br/) | E-Commerce | — | — | — | [Case Study, March 2023](https://double.cloud/resources/case-studies/lojaintegrada-and-pagali-switch-to-doublecloud-to-make-running-clickhouse-easier) | +| [Lookforsale](https://lookforsale.ru/) | E-Commerce | — | — | — | [Job Posting, December 2021](https://telegram.me/javascript_jobs/587318) | +| [Loopme](https://loopme.com/) | AdTech | Analytics | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/measuring-brand-impact-how-loopme-uses-clickhouse-to-deliver-better-brand-advertising-outcomes) | +| [Luabase](https://luabase.com/) | Software | Analytics | — | — | [Hacker News, April 2022](https://news.ycombinator.com/item?id=31040190) | +| [Lyft](https://lyft.com) | Rideshare | - | — | — | [Twitter, July 2023](https://twitter.com/riteshvaryani/status/1685160430606639104) | +| [MAXILECT](https://maxilect.com/) | Ad Tech, Blockchain, ML, AI | — | — | — | [Job advertisement, 2021](https://www.linkedin.com/feed/update/urn:li:activity:6780842017229430784/) | +| [MGID](https://www.mgid.com/) | Ad network | Web-analytics | — | — | [Blog post in Russian, April 2020](http://gs-studio.com/news-about-it/32777----clickhouse---c) | +| [MUX](https://mux.com/) | Online Video | Video Analytics | — | — | [Talk in English, August 2019](https://altinity.com/presentations/2019/8/13/how-clickhouse-became-the-default-analytics-database-for-mux/) | +| [Mail.ru Cloud Solutions](https://mcs.mail.ru/) | Cloud services | Main product | — | — | [Article in Russian](https://mcs.mail.ru/help/db-create/clickhouse#) | +| [Marfeel](https://www.marfeel.com/) | Mobile SaaS | — | — | — | Job offer, Apr 2022 | +| [Marilyn](https://tech.mymarilyn.ru) | Advertising | Statistics | — | — | [Talk in Russian, June 2017](https://www.youtube.com/watch?v=iXlIgx2khwc) | +| [MasMovil](https://www.masmovil.es/) | Telecom | Telecom services | - | - | [Blog](https://clickhouse.com/blog/how-grupo-masmovil-monitors-radio-access-networks-with-clickhouse) | +| [Match Systems](https://matchsystems.com/) | Software & Technology | Blockchain Intelligence & AML | — | — | [Job Posting, March 2024](https://telegra-ph.translate.goog/Senior-Database-Administrator-11-28?_x_tr_sl=ru&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) | +| [Mello](https://mellodesign.ru/) | Marketing | Analytics | 1 server | — | [Article, October 2020](https://vc.ru/marketing/166180-razrabotka-tipovogo-otcheta-skvoznoy-analitiki) | +| [Memfault](https://https://memfault.com/) | Software & Technology | IOT Monitoring | — | — | [Job Listing, August 2023](https://www.ycombinator.com/companies/memfault/jobs/zALzwIe-backend-engineer-systems-data) | +| [cBioPortal](https://www.cbioportal.org/) | Healthcare | Datstore backing portal for cancer genomics | — | — | [NYC Meetup, Dec 2023](https://clickhouse.com/videos/fast-answers-in-cancer-research) | +| [MessageBird](https://www.messagebird.com) | Telecommunications | Statistics | — | — | [Slides in English, November 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup20/messagebird.pdf) | +| [Metoda](https://metoda.com/) | Software & Technology | Advertisting | — | — | [ClickHouse Meetup, September 2022](https://www.youtube.com/watch?v=uS5uA-aZSlQ&t=1770s) | +| [MetricFire](https://www.metricfire.com) | Managed Service | Monitoring | — | — | [Blog, November 2022](https://www.metricfire.com/blog/using-clickhouse-with-metricfire) | +| [Microsoft - Clarity](https://clarity.microsoft.com/) | Web Analytics | Clarity (Main Product) | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=rUVZlquVGw0&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=2) [A question on GitHub](https://github.com/ClickHouse/ClickHouse/issues/21556) | +| [Microsoft - Titan](https://www.microsoft.com/) | Software & Technology | Internal Data Analytics (Titan) | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=r1ZqjU8ZbNs&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=2) | +| [Middleware](https://middleware.io/) | Software | Cloud management | - | - | [SF Meetup, March 2024](https://www.youtube.com/watch?v=xCLMuXJWx80&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) | +| [MindsDB](https://www.mindsdb.com/) | Machine Learning | Main Product | — | — | [Official Website](https://www.mindsdb.com/blog/machine-learning-models-as-tables-in-ch) | +| [Modeo](https://modeo.ai/) | Software & Technology | Data Engineering | — | — | [Blog, June 2023](https://clickhouse.com/blog/driving-sustainable-data-management-with-clickhouse-introducing-stash-by-modeo) | +| [moosejs](https://www.moosejs.com/) | Software & Technology | Open-source developer framework | — | — | [Blog Post, May 2024](https://www.fiveonefour.com/blog/product-update-2) | +| [Motodata](https://www.motadata.com/) | Monitoring | Main Product | — | — | [Official Website](https://www.motadata.com/docs) | +| [Muse Group](https://mu.se/) | Music Software | Performance Monitoring | — | — | [Blog post in Russian, January 2021](https://habr.com/en/post/647079/) | +| [MyScale](https://myscale.com/) | Software & Technology | AI Database | — | — | [Docs](https://docs.myscale.com/en/overview/) | +| [NANO Corp](https://nanocorp.fr/en/) | Software & Technology | NOC as a Service | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/from-experimentation-to-production-the-journey-to-supercolumn) | +| [NGINX](https://nginx.com/) | Application Delivery Network | NGINX Management Suite | — | — | [Documentation](https://docs.nginx.com/nginx-management-suite/admin-guides/getting-started/prerequisites/configure-clickhouse/) | +| [NIC Labs](https://niclabs.cl/) | Network Monitoring | RaTA-DNS | — | — | [Blog post, March 2021](https://niclabs.cl/ratadns/2021/03/Clickhouse) | +| [Nixys](https://nixys.io/) | Software & Technology | DevOps, SRE and DevSecOps | — | — | [Blog Post, March 2024](https://habr-com.translate.goog/ru/companies/nixys/articles/801029/?_x_tr_hist=true/ru/companies/nixys/articles/801029/?_x_tr_sl=ru&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp&_x_tr_hist=true) | +| [NLMK](https://nlmk.com/en/) | Steel | Monitoring | — | — | [Article in Russian, Jan 2022](https://habr.com/en/company/nlmk/blog/645943/) | +| [NOC Project](https://getnoc.com/) | Network Monitoring | Analytics | Main Product | — | [Official Website](https://getnoc.com/features/big-data/) | +| [Nansen](https://www.nansen.ai/) | Finance - Crypto | Analytics | — | — | [Press release](https://clickhouse.com/blog/clickhouse-cloud-on-google-cloud-platform-gcp-is-generally-available) | +| [Narrative](https://www.trynarrative.com/) | Software & Technology | AI Automation | — | — | [Hacker News, May 2024](https://news.ycombinator.com/item?id=40225998) | +| [Nationale Databank Wegverkeers](https://www.ndw.nu/) | Software & Technology | Road Traffic Monitoring | — | — | [Presentation at Foss4G, August 2019](https://av.tib.eu/media/43434) | +| [Nebius](https://nebius.com/il/docs/managed-clickhouse/) | SaaS | Main product | — | — | [Official website](https://nebius.com/il/docs/managed-clickhouse/) | +| [Neocom](https://www.neocom.ai/) | AI SaaS | Main product | - | - | [Job listing](https://news.ycombinator.com/item?id=38497724) | +| [Neocom](https://www.neocom.ai/) | Software & Technology | Sales Platform | — | — | [Hacker News, September 2023](https://news.ycombinator.com/item?id=37359122) | +| [NeonDB](https://neon.tech/) | Cloud | Postgres management | - | - | [Blog, 2024](https://double.cloud/resources/case-studies/neon-increases-data-granularity-with-managed-clickhouse/) | +| [NetMeta](https://github.com/monogon-dev/NetMeta/blob/main/README.md) | Observability | Main Product | — | — | [Twitter, December 2022](https://twitter.com/leolukde/status/1605643470239977475) | +| [Netflix](https://www.netflix.com/) | Software & Technology | Video Streaming | — | — | [Twitter, June 2023](https://twitter.com/clickhousedb/status/1673803621220360193) | +| [Netskope](https://www.netskope.com/) | Network Security | — | — | — | [Job advertisement, March 2021](https://www.mendeley.com/careers/job/senior-software-developer-backend-developer-1346348) | +| [Nexpath Networks](https://www.nexpath.net/) | Software & Technology | Network Analysis | — | — | [Slides, September 2021](https://opensips.org/events/Summit-2021Distributed/assets/presentations/2021-jon-abrams-big-telco-data-with-clickhouse.pdf) [Video, September 2021](https://www.youtube.com/watch?v=kyu_wDcO0S4&t=3840s) | +| [NineData](https://www.ninedata.cloud/) | Software & Technology | DMaaS | — | — | ClickHouse Meetup in Hangzhou, May 2024 | +| [Noction](https://www.noction.com) | Network Technology | Main Product | — | — | [Official Website](https://www.noction.com/news/irp-3-11-remote-triggered-blackholing-capability) | +| [Notionlytics](https://notionlytics.com/) | Software & Technology | Page analytics for Notion | — | — | [Twitter, July 2023](https://twitter.com/MaxPrilutskiy/status/1675428469403004928) | +| [Ntop](https://www.ntop.org/) | Network Monitoning | Monitoring | — | — | [Official website, January 2022](https://www.ntop.org/ntop/historical-traffic-analysis-at-scale-using-clickhouse-with-ntopng/) | +| [Nuna Inc.](https://www.nuna.com/) | Health Data Analytics | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=170) | +| [Nutanix](https://www.nutanix.com/) | Software & Technology | Main Product | — | — | [Slides, March 2024](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup102/2-Unified_data_platform_with_clickhouse_by_Sachidanad_Gaurav_Nutanix.pdf) | +| [Oden](https://oden.io/) | Software & Technology | Manufacturing | — | — | [Meetup, April 2023](https://www.youtube.com/watch?v=pAKGJDOO6lo) | +| [Odoscope](https://www.odoscope.com/) | Software & Technology | Customer Engagement Platform | — | — | [Awards Submission, February 2023](https://ecommercegermanyawards.com/vote/164051) | +| [Ok.ru](https://ok.ru) | Social Network | — | 72 servers | 810 TB compressed, 50bn rows/day, 1.5 TB/day | [SmartData conference, October 2021](https://assets.ctfassets.net/oxjq45e8ilak/4JPHkbJenLgZhBGGyyonFP/57472ec6987003ec4078d0941740703b/____________________ClickHouse_______________________.pdf) | +| [Omnicomm](https://omnicomm.ru/) | Transportation Monitoring | — | — | — | [Facebook post, October 2021](https://www.facebook.com/OmnicommTeam/posts/2824479777774500) | +| [OneAPM](https://www.oneapm.com/) | Monitoring and Data Analysis | Main product | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/8.%20clickhouse在OneAPM的应用%20杜龙.pdf) | +| [OneUptime](https://oneuptime.com/) | Observability platform | Analytics | — | — | [GitHub repository](https://github.com/OneUptime/oneuptime) | +| [Onepixel.link](https://onepixel.link/) | Software | URL shorterner | - | - | [Twitter, 2024](https://twitter.com/championswimmer/status/1759195487134220415) | +| [Ongage](https://www.ongage.com/) | Marketing | Analytics | — | — | [Blog](https://clickhouse.com/blog/ongages-strategic-shift-to-clickhouse-for-real-time-email-marketing) | +| [Ookla](https://www.ookla.com/) | Software & Technology | Network Intelligence | — | — | [Presentation at J on the Beach, June 2023](https://www.youtube.com/watch?v=OZ0XpfDM8J0) | +| [OONI](https://ooni.org/) | Open Observatory of Network Interference (OONI) | Main product | — | — | [Blog, May 2023]( https://clickhouse.com/blog/ooni-analyzes-internet-censorship-data-with-clickhouse)[Twitter August 2022](https://twitter.com/OpenObservatory/status/1558014810746265600?s=20&t=hvcDU-LIrgCApP0rZCzuoA) | +| [Open Targets](https://www.opentargets.org/) | Genome Research | Genome Search | — | — | [Twitter, October 2021](https://twitter.com/OpenTargets/status/1452570865342758913?s=20), [Blog](https://blog.opentargets.org/graphql/) | +| [OpenLIT](https://openlit.io/) | Software & Technology | OTEL Monitoring with AI | — | — | [GitHub](https://github.com/openlit/openlit) | +| [OpenMeter](https://openmeter.io) | Expense Management | Main product | — | — | [Offical blog post, 2023](https://openmeter.io/blog/how-openmeter-uses-clickhouse-for-usage-metering#heading-querying-historical-usage) | +| [OpenReplay](https://openreplay.com/) | Product Analytics | Session Replay | — | — | [Docs](https://docs.openreplay.com/en/deployment/openreplay-admin/) | +| [Opensee](https://opensee.io/) | Financial Analytics | Main product | - | - | [Blog Post, February 2022](https://clickhouse.com/blog/opensee-analyzing-terabytes-of-financial-data-a-day-with-clickhouse/) [Blog Post, December 2021](https://opensee.io/news/from-moscow-to-wall-street-the-remarkable-journey-of-clickhouse/) | +| [Oppo](https://www.oppo.com/cn/) | Hardware | Consumer Electronics Company | — | — | ClickHouse Meetup in Chengdu, April 2024 | +| [OpsVerse](https://opsverse.io/) | Observability | — | — | — | [Twitter, 2022](https://twitter.com/OpsVerse/status/1584548242100219904) | +| [Opstrace](https://opstrace.com/) | Observability | — | — | — | [Source code](https://gitlab.com/gitlab-org/opstrace/jaeger-clickhouse/-/blob/main/README.md) | +| [Oxide](https://oxide.computer/) | Hardware & Software | Server Control Plane | — | — | [GitHub Repository](https://github.com/oxidecomputer/omicron) | +| [OZON](https://corp.ozon.com/) | E-commerce | — | — | — | [Official website](https://job.ozon.ru/vacancy/razrabotchik-clickhouse-ekspluatatsiya-40991870/) | +| [PITS Globale Datenrettungsdienste](https://www.pitsdatenrettung.de/) | Data Recovery | Analytics | — | — | | +| [PRANA](https://prana-system.com/en/) | Industrial predictive analytics | Main product | — | — | [News (russian), Feb 2021](https://habr.com/en/news/t/541392/) | +| [Pace](https://www.paceapp.com/) | Marketing & Sales | Internal app | — | — | ClickHouse Cloud user | +| [Panelbear](https://panelbear.com/) | Analytics | Monitoring and Analytics | — | — | [Tech Stack, November 2020](https://panelbear.com/blog/tech-stack/) | +| [Papermark](https://www.papermark.io/) | Software & Technology | Document Sharing & Analytics | — | — | [Twitter, September 2023](https://twitter.com/mfts0/status/1698670144367567263) | +| [Percent 百分点](https://www.percent.cn/) | Analytics | Main Product | — | — | [Slides in Chinese, June 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/4.%20ClickHouse万亿数据双中心的设计与实践%20.pdf) | +| [Percona](https://www.percona.com/) | Performance analysis | Percona Monitoring and Management | — | — | [Official website, Mar 2020](https://www.percona.com/blog/2020/03/30/advanced-query-analysis-in-percona-monitoring-and-management-with-direct-clickhouse-access/) | +| [Phare](https://phare.io/) | Uptime Monitoring | Main Product | — | — | [Official website, Aug 2023](https://phare.io/changelog/monthly-changelog-13) | +| [PheLiGe](https://phelige.com/about) | Software & Technology | Genetic Studies | — | — | [Academic Paper, November 2020](https://academic.oup.com/nar/article/49/D1/D1347/6007654?login=false) | +| [PingCAP](https://pingcap.com/) | Analytics | Real-Time Transactional and Analytical Processing | - | - | [GitHub, TiFlash/TiDB](https://github.com/pingcap/tiflash) | +| [Pirsch](https://pirsch.io/) | Software & Technology | Web Analytics | — | — | [Hacker News, April 2023](https://news.ycombinator.com/item?id=35692201) | +| [Piwik PRO](https://piwik.pro/) | Web Analytics | — | — | — | [Official website, Dec 2018](https://piwik.pro/blog/piwik-pro-clickhouse-faster-efficient-reports/) | +| [Plane](https://plane.so/)| Software & Technology | Project Management | — | — | [Twitter, September 2023](https://twitter.com/vamsi_kurama/status/1699593472704176441) | +| [Plausible](https://plausible.io/) | Analytics | Main Product | — | — | [Blog Post, December 2021](https://clickhouse.com/blog/plausible-analytics-uses-click-house-to-power-their-privacy-friendly-google-analytics-alternative) [Twitter, June 2020](https://twitter.com/PlausibleHQ/status/1273889629087969280) | +| [PoeticMetric](https://www.poeticmetric.com/) | Metrics | Main Product | — | — | Community Slack, April 2022 | +| [Portkey AI](https://portkey.ai/) | LLMOps | Main Product | — | — | [LinkedIn post, August 2023](https://www.linkedin.com/feed/update/urn:li:activity:7094676373826330626/) | +| [PostHog](https://posthog.com/) | Product Analytics | Main Product | — | — | [Release Notes, October 2020](https://posthog.com/blog/the-posthog-array-1-15-0), [Blog, November 2021](https://posthog.com/blog/how-we-turned-clickhouse-into-our-eventmansion) | +| [Postmates](https://postmates.com/) | Delivery | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=188) | +| [Pragma Innovation](http://www.pragma-innovation.fr/) | Telemetry and Big Data Analysis | Main product | — | — | [Slides in English, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/4_pragma_innovation.pdf) | +| [Prefect](https://www.prefect.io/) | Software & Technology | Main Product | — | — | [Blog, May 2024](https://clickhouse.com/blog/prefect-event-driven-workflow-orchestration-powered-by-clickhouse) | +| [Propel](https://www.propeldata.com/) | Analytics | Main product | — | — | [Blog, January 2024](https://www.propeldata.com/blog/how-to-store-json-in-clickhouse-the-right-way) | +| [Property Finder](https://www.propertyfinder.com/) | Real Estate | - | — | — | ClickHouse Cloud user | +| [QINGCLOUD](https://www.qingcloud.com/) | Cloud services | Main product | — | — | [Slides in Chinese, October 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 protection | Main product | — | — | [Blog Post, March 2019](https://blog.qrator.net/en/clickhouse-ddos-mitigation_37/) | +| [Qualified](https://www.qualified.com/) | Sales Pipeline Management | Data and Messaging layers | — | — | [Job posting, Nov 2022](https://news.ycombinator.com/item?id=33425109) | +| [Qube Research & Technologies](https://www.qube-rt.com/) | FinTech | Analysis | — | — | ClickHouse Cloud user | +| [QuickCheck](https://quickcheck.ng/) | FinTech | Analytics | — | — | [Blog post, May 2022](https://clickhouse.com/blog/how-quickcheck-uses-clickhouse-to-bring-banking-to-the-unbanked/) | +| [R-Vision](https://rvision.pro/en/) | Information Security | — | — | — | [Article in Russian, December 2021](https://www.anti-malware.ru/reviews/R-Vision-SENSE-15) | +| [RELEX](https://relexsolutions.com) | Supply Chain Planning | Forecasting | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=wyOSMR8l-DI&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=16) [Slides, December 2022](https://presentations.clickhouse.com/meetup65/CRUDy%20OLAP.pdf) | +| [Raiffeisenbank](https://www.rbinternational.com/) | Banking | Analytics | — | — | [Lecture in Russian, December 2020](https://cs.hse.ru/announcements/421965599.html) | +| [Railway](https://railway.app/) | Software & Technology | PaaS Software Tools | — | — | [Changelog, May 2023](https://railway.app/changelog/2023-05-19-horizontal-scaling#logs-are-getting-faster) | +| [Rambler](https://rambler.ru) | Internet services | Analytics | — | — | [Talk in Russian, April 2018](https://medium.com/@ramblertop/разработка-api-clickhouse-для-рамблер-топ-100-f4c7e56f3141) | +| [Ramp](https://ramp.com/) | Financial Services | Real-Time Analytics, Fraud Detection | — | — | [NYC Meetup, March 2024](https://www.youtube.com/watch?v=7BtUgUb4gCs) | +| [Rapid Delivery Analytics](https://rda.team/) | Retail | Analytics | — | — | ClickHouse Cloud user | +| [Releem](https://releem.com/) | Databases | MySQL management| - | - | [Blog 2024](https://releem.com/blog/whats-new-at-releem-june-2023) | +| [Replica](https://replicahq.com) | Urban Planning | Analytics | — | — | [Job advertisement](https://boards.greenhouse.io/replica/jobs/5547732002?gh_jid=5547732002) | +| [Request Metrics](https://requestmetrics.com/) | Software & Technology | Observability | — | — | [Hacker News, May 2023](https://news.ycombinator.com/item?id=35982281) | +| [Resmo](https://replicahq.com) | Software & Technology | Cloud Security & Asset Management | 1 c7g.xlarge node, +| [Retell](https://retell.cc/) | Speech synthesis | Analytics | — | — | [Blog Article, August 2020](https://vc.ru/services/153732-kak-sozdat-audiostati-na-vashem-sayte-i-zachem-eto-nuzhno) | +| [Rivet](https://rivet.gg/) | Software & Technology | Gamer Server Scaling | — | — | [HackerNews, August 2023](https://news.ycombinator.com/item?id=37188659) | +| [Rokt](https://www.rokt.com/) | Software & Technology | eCommerce | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=BEP07Edor-0&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/Building%20the%20future%20of%20reporting%20at%20Rokt.pdf) | +| [Rollbar](https://www.rollbar.com) | Software Development | Main Product | — | — | [Official Website](https://www.rollbar.com) | +| [Rspamd](https://rspamd.com/) | Antispam | Analytics | — | — | [Official Website](https://rspamd.com/doc/modules/clickhouse.html) | +| [RuSIEM](https://rusiem.com/en) | SIEM | Main Product | — | — | [Official Website](https://rusiem.com/en/products/architecture) | +| [RunReveal](https://runreveal.com/) | SIEM | Main Product | — | — | [SF Meetup, Nov 2023](https://www.youtube.com/watch?v=rVZ9JnbzHTQ&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=25) | +| [S7 Airlines](https://www.s7.ru) | Airlines | Metrics, Logging | — | — | [Talk in Russian, March 2019](https://www.youtube.com/watch?v=nwG68klRpPg&t=15s) | +| [SEMrush](https://www.semrush.com/) | Marketing | Main product | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/5_semrush.pdf) | +| [SESCO Trading](https://www.sescotrading.com/) | Financial | Analysis | — | — | ClickHouse Cloud user | +| [SGK](http://www.sgk.gov.tr/wps/portal/sgk/tr) | Government Social Security | Analytics | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/ClickHouse%20Meetup-Ramazan%20POLAT.pdf) | +| [SMI2](https://smi2.ru/) | News | Analytics | — | — | [Blog Post in Russian, November 2017](https://habr.com/ru/company/smi2/blog/314558/) | +| [SQLPad](https://getsqlpad.com/en/introduction/) | Software & Technology | Web-based SQL editor. | — | — | [GitHub, March 2023](https://github.com/sqlpad/sqlpad/blob/master/server/package.json#L43) | +| [Santiment](https://www.santiment.net) | Behavioral analytics for the crypto market | Main Product | — | — | [Github repo](https://github.com/santiment/sanbase2) | +| [Sber](https://www.sberbank.com/index) | Banking, Fintech, Retail, Cloud, Media | — | 128 servers | >1 PB | [Job advertisement, March 2021](https://career.habr.com/vacancies/1000073536) | +| [Scale8](https://scale8.com) | Tag Management and Analytics | Main product | - | - | [Source Code](https://github.com/scale8/scale8) | +| [Scarf](https://about.scarf.sh/) | Open source analytics | Main product | - | - | [Tweet](https://x.com/avi_press/status/1803954179179974747) | +| [Scireum GmbH](https://www.scireum.de/) | e-Commerce | Main product | — | — | [Talk in German, February 2020](https://www.youtube.com/watch?v=7QWAn5RbyR4) | +| [ScrapingBee](https://www.scrapingbee.com/) | Software & Technology | Web scraping API | — | — | [Twitter, January 2024](https://twitter.com/PierreDeWulf/status/1745464855723986989) | +| [ScratchDB](https://scratchdb.com/) | Software & Technology | Serverless Analytics | — | — | [GitHub](https://github.com/scratchdata/ScratchDB) | +| [Segment](https://segment.com/) | Data processing | Main product | 9 * i3en.3xlarge nodes 7.5TB NVME SSDs, 96GB Memory, 12 vCPUs | — | [Slides, 2019](https://slides.com/abraithwaite/segment-clickhouse) | +| [sembot.io](https://sembot.io/) | Shopping Ads | — | — | — | A comment on LinkedIn, 2020 | +| [Sendinblue](https://www.sendinblue.com/) | Software & Technology | Segmentation | 100 nodes | — | [Blog, February 2023](https://engineering.sendinblue.com/segmentation-to-target-the-right-audience/) | +| [Sentio](https://www.sentio.xyz/) | Software & Technology | Observability | — | — | [Twitter, April 2023](https://twitter.com/qiaokan/status/1650736518955438083) | +| [Sentry](https://sentry.io/) | Software Development | Main product | — | — | [Blog Post in English, May 2019](https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure) | +| [seo.do](https://seo.do/) | Analytics | Main product | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/CH%20Presentation-%20Metehan%20Çetinkaya.pdf) | +| [Serverless](https://www.serverless.com/) | Serverless Apps | Metrics | — | — | ClickHouse Cloud user | +| [ServiceNow](https://www.servicenow.com/) | Managed Services | Qualitative Mobile Analytics | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=b4Pmpx3iRK4&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=6) [Slides, January 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup68/Appsee%20Remodeling%20-%20ClickHouse.pdf) | +| [Sewer AI](https://www.sewerai.com/) | Software & Technology | - | — | — | ClickHouse Cloud user | +| [Shopee](https://www.shopee.com/) | E-Commerce | Distributed Tracing | - | - | [Meetup Video, April 2024](https://youtu.be/_BVy-V2wy9s?feature=shared) [Slides, April 2024](https://github.com/ClickHouse/clickhouse-presentations/blob/2b0ef2914ff594c0a0f8800d5150e5b31323be98/meetup105/Shopee%20-%20Distributed%20Tracing%20in%20ClickHouse.pdf) [Blog Post, June 2024](https://clickhouse.com/blog/seeing-the-big-picture-shopees-journey-to-distributed-tracing-with-clickhouse) | +| [SigNoz](https://signoz.io/) | Observability Platform | Main Product | — | — | [Source code](https://github.com/SigNoz/signoz) | +| [Sina](http://english.sina.com/index.html) | News | — | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/6.%20ClickHouse最佳实践%20高鹏_新浪.pdf) | +| [Sinch](https://www.sinch.com/) | Software & Technology | Customer Communications Cloud | — | — | [HackerNews, May 2023](https://news.ycombinator.com/item?id=36042104) | +| [Sipfront](https://www.sipfront.com/) | Software Development | Analytics | — | — | [Twitter, October 2021](https://twitter.com/andreasgranig/status/1446404332337913895?s=20) | +| [SiteBehaviour Analytics](https://www.sitebehaviour.com/) | Software| Analytics | - | - | [Twitter, 2024](https://twitter.com/developer_jass/status/1763023792970883322)| +| [slido](https://www.slido.com/) | Software & Technology | Q&A and Polling | — | — | [Meetup, April 2023](https://www.linkedin.com/events/datameetup-3-spotlightondataeng7048914766324473856/about/) | +| [Solarwinds](https://www.solarwinds.com/) | Software & Technology | Main product | — | — | [Talk in English, March 2018](https://www.youtube.com/watch?v=w8eTlqGEkkw) | +| [Sonrai Security](https://sonraisecurity.com/) | Cloud Security | - | — | — | Slack comments | +| [Spark New Zealand](https://www.spark.co.nz/) | Telecommunications | Security Operations | — | — | [Blog Post, Feb 2020](https://blog.n0p.me/2020/02/2020-02-05-dnsmonster/) | +| [Spec](https://www.specprotected.com/) | Software & Technology | Online Fraud Detection | — | — | [HackerNews, August 2023](https://news.ycombinator.com/item?id=36965317) +| [spectate](https://spectate.net/)| Software & Technology | Monitoring & Incident Management | — | — | [Twitter, August 2023](https://twitter.com/BjarnBronsveld/status/1700458569861112110) | +| [Splio](https://splio.com/en/) | Software & Technology | Individuation Marketing | — | — | [Slack, September 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1693995069023669) | +| [Splitbee](https://splitbee.io) | Analytics | Main Product | — | — | [Blog Post, Mai 2021](https://splitbee.io/blog/new-pricing) | +| [Splunk](https://www.splunk.com/) | Business Analytics | Main product | — | — | [Slides in English, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | +| [Spotify](https://www.spotify.com) | Music | Experimentation | — | — | [Slides, July 2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | +| [Staffbase](https://staffbase.com/en/) | Software & Technology | Internal Communications | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1682781081062859) | +| [Staffcop](https://www.staffcop.ru/) | Information Security | Main Product | — | — | [Official website, Documentation](https://www.staffcop.ru/sce43) | +| [Statsig](https://statsig.com/) | Software & Technology | Real-time analytics | — | — | [Video](https://clickhouse.com/videos/statsig) | +| [Streamkap](https://streamkap.com/) | Data Platform | - | — | — | [Video](https://clickhouse.com/videos/switching-from-elasticsearch-to-clickhouse) | +| [Suning](https://www.suning.com/) | E-Commerce | User behaviour analytics | — | — | [Blog article](https://www.sohu.com/a/434152235_411876) | +| [Superology](https://superology.com/) | Software & Technology | Customer Analytics | — | — | [Blog Post, June 2022](https://clickhouse.com/blog/collecting-semi-structured-data-from-kafka-topics-using-clickhouse-kafka-engine) | +| [Superwall](https://superwall.me/) | Monetization Tooling | Main product | — | — | [Word of mouth, Jan 2022](https://github.com/ClickHouse/ClickHouse/pull/33573) | +| [SwarmFarm Robotics](https://www.swarmfarm.com/) | Agriculture & Technology | Main Product | — | — | [Meetup Slides](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup122/Talk%20Track%202%20-%20Harvesting%20Big%20Data%20at%20SwarmFarm%20Robotics%20-%20Angus%20Ross.pdf) | +| [Swetrix](https://swetrix.com) | Analytics | Main Product | — | — | [Source code](https://github.com/swetrix/swetrix-api) | +| [Swift Navigation](https://www.swiftnav.com/) | Geo Positioning | Data Pipelines | — | — | [Job posting, Nov 2022](https://news.ycombinator.com/item?id=33426590) | +| [Synerise](https://synerise.com/) | ML&AI | Feature Store | - | - | [Presentation, April 2020](https://www.slideshare.net/AndrzejMichaowski/feature-store-solving-antipatterns-in-mlsystems-232829863) | +| [Synpse](https://synpse.net/) | Application Management | Main Product | - | - | [Twitter, January 2022](https://twitter.com/KRusenas/status/1483571168363880455) | +| [Synq](https://www.synq.io) | Software & Technology | Main Product | — | — | [Blog Post, July 2023](https://clickhouse.com/blog/building-a-unified-data-platform-with-clickhouse) | +| [sumsub](https://sumsub.com/) | Software & Technology | Verification platform | — | — | [Meetup, July 2022](https://www.youtube.com/watch?v=F74bBGSMwGo) | +| [TURBOARD](https://www.turboard.com/) | BI Analytics | — | — | — | [Official website](https://www.turboard.com/blogs/clickhouse) | +| [TeamApt](https://www.teamapt.com/) | FinTech | Data Processing | — | — | [Official Website](https://www.teamapt.com/) | +| [Teamtailor](https://www.teamtailor.com/en/) | Recruitment Software | - | — | — | ClickHouse Cloud user | +| [Tekion](https://tekion.com/) | Automotive Retail | Clickstream Analytics | — | — | [Blog Post, June 2024](https://clickhouse.com/blog/tekion-adopts-clickhouse-cloud-to-power-application-performance-and-metrics-monitoring) | +| [Tencent Music Entertainment (TME)](https://www.tencentmusic.com/) | BigData | Data processing | — | — | [Blog in Chinese, June 2020](https://cloud.tencent.com/developer/article/1637840) | +| [Tencent](https://www.tencent.com) | Big Data | Data processing | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) | +| [Tencent](https://www.tencent.com) | Messaging | Logging | — | — | [Talk in Chinese, November 2019](https://youtu.be/T-iVQRuw-QY?t=5050) | +| [Teralytics](https://www.teralytics.net/) | Mobility | Analytics | — | — | [Tech blog](https://www.teralytics.net/knowledge-hub/visualizing-mobility-data-the-scalability-challenge) | +| [Tesla](https://www.tesla.com/) | Electric vehicle and clean energy company | — | — | — | [Vacancy description, March 2021](https://news.ycombinator.com/item?id=26306170) | +| [The Guild](https://the-guild.dev/) | API Platform | Monitoring | — | — | [Blog Post, November 2022](https://clickhouse.com/blog/100x-faster-graphql-hive-migration-from-elasticsearch-to-clickhouse) [Blog](https://the-guild.dev/blog/graphql-hive-and-clickhouse) | +| [Theia](https://theia.so/) | Software & Technology | Threat Intelligence | — | — | [Twitter, July 2023](https://twitter.com/jreynoldsdev/status/1680639586999980033) | +| [ThirdWeb](https://thirdweb.com/) | Software & Technology | Blockchain analysis | — | — | ClickHouse Cloud user | +| [Timeflow](https://timeflow.systems) | Software | Analytics | — | — | [Blog](https://timeflow.systems/why-we-moved-from-druid-to-clickhouse/ ) | +| [Timeplus](https://www.timeplus.com/) | Software & Technology | Streaming Analytics | — | — | [Meetup, August 2023](https://www.meetup.com/clickhouse-silicon-valley-meetup-group/events/294472987/) | +| [Tinybird](https://www.tinybird.co/) | Real-time Data Products | Data processing | — | — | [Official website](https://www.tinybird.co/) | +| [TrackingPlan](https://www.trackingplan.com/) | Marketing & Sales | Monitoring | — | — | ClickHouse Cloud user | +| [Traffic Stars](https://trafficstars.com/) | AD network | — | 300 servers in Europe/US | 1.8 PiB, 700 000 insert rps (as of 2021) | [Slides in Russian, May 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup15/lightning/ninja.pdf) | +| [Trillabit](https://www.trillabit.com/home) | Software & Technology | Business Intelligence | — | — | [Blog, January 2023](https://clickhouse.com/blog/trillabit-utilizes-the-power-of-clickhouse-for-fast-scalable-results-within-their-self-service-search-driven-analytics-offering) | +| [Trip.com](https://trip.com/) | Travel Services | Logging | — | — | [Meetup, March 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup71/Trip.com.pdf) | +| [Turkcell](https://www.turkcell.com.tr/) | Telecom | BI Analytics | 2 nodes | 2TB per day, 100TB in total | [YouTube Video](https://www.youtube.com/watch?v=ckvPBgXl82Q) | +| [Tweeq](https://tweeq.sa/en) | Fintech | Spending Account | - | - | [Engineering Blog, May 2024](https://engineering.tweeq.sa/tweeq-data-platform-journey-and-lessons-learned-clickhouse-dbt-dagster-and-superset-fa27a4a61904) | +| [URLsLab](https://www.urlslab.com/) | Software & Technology | WordPress Plugin | — | — | [Twitter, July 2023](https://twitter.com/Yasha_br/status/1680224776302784514) , [Twitter, September 2023](https://twitter.com/Yasha_br/status/1698724654339215812) | +| [UTMSTAT](https://hello.utmstat.com/) | Analytics | Main product | — | — | [Blog post, June 2020](https://vc.ru/tribuna/133956-striming-dannyh-iz-servisa-skvoznoy-analitiki-v-clickhouse) | +| [Uber](https://www.uber.com) | Taxi | Logging | — | — | [Slides, February 2020](https://presentations.clickhouse.com/meetup40/uber.pdf) | +| [Uptrace](https://uptrace.dev/) | Software | Tracing Solution | — | — | [Official website, March 2021](https://uptrace.dev/open-source/) | +| [UseTech](https://usetech.com/) | Software Development | — | — | — | [Job Posting, December 2021](https://vk.com/wall136266658_2418) | +| [Usermaven](https://usermaven.com/) | Product Analytics | Main Product | — | — | [HackerNews, January 2023](https://news.ycombinator.com/item?id=34404706) | +| [VKontakte](https://vk.com) | Social Network | Statistics, Logging | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/3_vk.pdf) | +| [VKontech](https://vkontech.com/) | Distributed Systems | Migrating from MongoDB | - | - | [Blog, January 2022](https://vkontech.com/migrating-your-reporting-queries-from-a-general-purpose-db-mongodb-to-a-data-warehouse-clickhouse-performance-overview/) | +| [VMware](https://www.vmware.com/) | Cloud | VeloCloud, SDN | — | — | [Product documentation](https://docs.vmware.com/en/vRealize-Operations-Manager/8.3/com.vmware.vcom.metrics.doc/GUID-A9AD72E1-C948-4CA2-971B-919385AB3CA8.html) | +| [Valueleaf Services Pvt.Ltd](http://valueleaf.com/) | Software & Technology | Martech platform, Ads platform and Loan aggregator platform | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1681122299263959) | +| [Vantage](https://www.vantage.sh/) | Software & Technology | Cloud Cost Management | — | — | [Meetup, April 2023](https://www.youtube.com/watch?v=gBgXcHM_ldc) , [ClickHouse Blog, June 2023](https://clickhouse.com/blog/nyc-meetup-report-vantages-journey-from-redshift-and-postgres-to-clickhouse) | +| [Velvet](https://www.usevelvet.com/) | Database management | Main product | - | - | [Job listing](https://news.ycombinator.com/item?id=38492272) | +| [Vercel](https://vercel.com/) | Traffic and Performance Analytics | — | — | — | Direct reference, October 2021 | +| [Vexo](https://www.vexo.co/) | App development | Analytics | — | — | [Twitter, December 2023](https://twitter.com/FalcoAgustin/status/1737161334213546279) | +| [Vidazoo](https://www.vidazoo.com/) | Advertising | Analytics | — | — | ClickHouse Cloud user | +| [Vimeo](https://vimeo.com/) | Video hosting | Analytics | - | - | [Blog post](https://medium.com/vimeo-engineering-blog/clickhouse-is-in-the-house-413862c8ac28) | +| [Visiology](https://visiology.com/) | Business intelligence | Analytics | - | - | [Company website](https://visiology.com/) | +| [Voltmetrix](https://voltmetrix.com/) | Database management | Main product | - | - | [Blog post](https://voltmetrix.com/blog/voltmetrix-iot-manufacturing-use-case/) | +| [Voltus](https://www.voltus.co/) | Energy | — | — | — | [Blog Post, Aug 2022](https://medium.com/voltus-engineering/migrating-kafka-to-amazon-msk-1f3a7d45b5f2) | +| [W3 Analytics](https://w3analytics.hottoshotto.com/) | Blockchain | Dashboards for NFT analytics | — | — | [Community Slack, July 2023](https://clickhousedb.slack.com/archives/CU170QE9H/p1689907164648339) | +| [WSPR Live](https://wspr.live/) | Software & Technology | WSPR Spot Data | — | — | [Twitter, April 2023](https://twitter.com/HB9VQQ/status/1652723207475015680) | +| [Waitlyst](https://waitlyst.co/) | Software & Technology | AI Customer Journey Management | — | — | [Twitter, June 2023](https://twitter.com/aaronkazah/status/1668261900554051585) | +| [Walmart Labs](https://www.walmartlabs.com/) | Internet, Retail | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=144) | +| [WanShanData](http://wanshandata.com/home) | Software & Technology | Main Product | — | — | [Meetup Slides in Chinese](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup56/wanshandata.pdf) | +| [Wargaming](https://wargaming.com/en/) | Games | | — | — | [Interview](https://habr.com/en/post/496954/) | +| [WebGazer](https://www.webgazer.io/) | Uptime Monitoring | Main Product | — | — | Community Slack, April 2022 | +| [Weights & Biases](https://wandb.ai/site) | Software & Technology | LLM Monitoring | — | — | [Twitter, April 2024](https://x.com/ClickHouseDB/status/1780264997228011986) | +| [Wildberries](https://www.wildberries.ru/) | E-commerce | | — | — | [Official website](https://it.wildberries.ru/) | +| [Wisebits](https://wisebits.com/) | IT Solutions | Analytics | — | — | [Slides in Russian, May 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [Workato](https://www.workato.com/) | Automation Software | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=334) | +| [Wowza](https://www.wowza.com/) | Video Platform | Streaming Analytics | — | — | ClickHouse Cloud user | +| [Wundergraph](https://wundergraph.com/) | Software & Technology | API Platform | — | — | [Twitter, February 2023](https://twitter.com/dustindeus/status/1628757807913750531) | +| [Xata](https://xata.io/) | Software & Technology | SaaS observability dashboard | — | — | [Twitter, March 2024](https://x.com/tudor_g/status/1770517054971318656) | +| [Xenoss](https://xenoss.io/) | Martech, Adtech development | — | — | — | [Official website](https://xenoss.io/big-data-solution-development)| +| [Xiaoxin Tech](http://www.xiaoxintech.cn/) | Education | Common purpose | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/sync-clickhouse-with-mysql-mongodb.pptx) | +| [Ximalaya](https://www.ximalaya.com/) | Audio sharing | OLAP | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/ximalaya.pdf) | +| [YTsaurus](https://ytsaurus.tech/) | Distributed Storage and Processing | Main product | - | - | [Main website](https://ytsaurus.tech/) | +| [Yandex Cloud](https://cloud.yandex.ru/services/managed-clickhouse) | Public Cloud | Main product | — | — | [Talk in Russian, December 2019](https://www.youtube.com/watch?v=pgnak9e_E0o) | +| [Yandex DataLens](https://cloud.yandex.ru/services/datalens) | Business Intelligence | Main product | — | — | [Slides in Russian, December 2019](https://presentations.clickhouse.com/meetup38/datalens.pdf) | +| [Yandex Market](https://market.yandex.ru/) | e-Commerce | Metrics, Logging | — | — | [Talk in Russian, January 2019](https://youtu.be/_l1qP0DyBcA?t=478) | +| [Yandex Metrica](https://metrica.yandex.com) | Web analytics | Main product | 630 servers in one cluster, 360 servers in another cluster, 1862 servers in one department | 133 PiB / 8.31 PiB / 120 trillion records | [Slides, February 2020](https://presentations.clickhouse.com/meetup40/introduction/#13) | +| [Yellowfin](https://www.yellowfinbi.com) | Analytics | Main product | - | - | [Integration](https://www.yellowfinbi.com/campaign/yellowfin-9-whats-new#el-30219e0e) | +| [Yotascale](https://www.yotascale.com/) | Cloud | Data pipeline | — | 2 bn records/day | [LinkedIn (Accomplishments)](https://www.linkedin.com/in/adilsaleem/) | +| [Your Analytics](https://www.your-analytics.org/) | Product Analytics | Main Product | — | - | [Twitter, November 2021](https://twitter.com/mikenikles/status/1459737241165565953) | +| [Zagrava Trading](https://zagravagames.com/en/) | — | — | — | — | [Job offer, May 2021](https://twitter.com/datastackjobs/status/1394707267082063874) | +| [Zappi](https://www.zappi.io/web/) | Software & Technology | Market Research | — | — | [Twitter Post, June 2024](https://x.com/HermanLangner/status/1805870318218580004)) | +| [Zerodha](https://zerodha.tech/) | Stock Broker | Logging | — | — | [Blog, March 2023](https://zerodha.tech/blog/logging-at-zerodha/) | +| [Zing Data](https://getzingdata.com/) | Software & Technology | Business Intelligence | — | — | [Blog, May 2023](https://clickhouse.com/blog/querying-clickhouse-on-your-phone-with-zing-data) | +| [Zipy](https://www.zipy.ai/) | Software & Technology | User session debug | — | — | [Blog, April 2023](https://www.zipy.ai/blog/deep-dive-into-clickhouse) | +| [Zomato](https://www.zomato.com/) | Online food ordering | Logging | — | — | [Blog, July 2023](https://www.zomato.com/blog/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) | +| [Zomato](https://www.zomato.com/ncr/golf-course-order-online) | Food & Beverage| Food Delivery | - | - | [Blog 2024](https://blog.zomato.com/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) | +| [АС "Стрела"](https://magenta-technology.ru/sistema-upravleniya-marshrutami-inkassacii-as-strela/) | Transportation | — | — | — | [Job posting, Jan 2022](https://vk.com/topic-111905078_35689124?post=3553) | +| [ДомКлик](https://domclick.ru/) | Real Estate | — | — | — | [Article in Russian, October 2021](https://habr.com/ru/company/domclick/blog/585936/) | +| [МКБ](https://mkb.ru/) | Bank | Web-system monitoring | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/mkb.pdf) | +| [ООО «МПЗ Богородский»](https://shop.okraina.ru/) | Agriculture | — | — | — | [Article in Russian, November 2020](https://cloud.yandex.ru/cases/okraina) | +| [ЦВТ](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://cft.ru/) | Banking, Financial products, Payments | — | — | — | [Meetup in Russian, April 2020](https://team.cft.ru/events/162) | +| [Цифровой Рабочий](https://promo.croc.ru/digitalworker) | Industrial IoT, Analytics | — | — | — | [Blog post in Russian, March 2021](https://habr.com/en/company/croc/blog/548018/) | +
diff --git a/docs/ja/about-us/cloud.md b/docs/ja/about-us/cloud.md new file mode 100644 index 00000000000..4ba0960e608 --- /dev/null +++ b/docs/ja/about-us/cloud.md @@ -0,0 +1,38 @@ +--- +slug: /ja/about-us/cloud +sidebar_label: クラウドサービス +sidebar_position: 10 +description: ClickHouse Cloud +--- + +# ClickHouse Cloud + +ClickHouse Cloudは、人気のオープンソースOLAPデータベースであるClickHouseの元開発者によって作成されたクラウドオファリングです。 +[無料トライアルを開始する](https://clickhouse.cloud/signUp)ことで、ClickHouse Cloudを体験できます。 + +### ClickHouse Cloudの利点: + +ClickHouse Cloudを使用する利点のいくつかを以下に示します: + +- **迅速な価値実現**: クラスターのサイズを調整することなく、すぐに構築を開始できます。 +- **シームレスなスケーリング**: 自動スケーリングにより、ピーク時に過剰なプロビジョニングをしなくても、多様なワークロードに対応します。 +- **サーバーレスオペレーション**: サイズ調整、スケーリング、セキュリティ、信頼性、アップグレードを私たちに任せてください。 +- **透明な価格設定**: 使用した分だけを支払い、リソースの予約とスケーリングコントロールを利用できます。 +- **所有コストの総額**: 最高の価格/パフォーマンス比と低管理オーバーヘッド。 +- **広範なエコシステム**: お気に入りのデータコネクター、ビジュアライゼーションツール、SQL、および言語クライアントを持ち込むことができます。 + +以下のビデオで、始め方のウォークスルーをご覧いただけます: + +
+ + + +
+ +### ClickHouse CloudはどのバージョンのClickHouseを使用しますか? + +Clickhouse Cloudは、サービスを継続的に新しいバージョンにアップグレードします。コアデータベースバージョンをオープンソースで公開した後、クラウドステージング環境で追加の検証を行い、通常6〜8週間で本番環境に展開します。展開はクラウドサービスプロバイダー、サービスタイプ、地域ごとに段階的に行われます。 + +定期的なリリーススケジュールに先立ち、更新を受け取るための「高速」リリースチャネルを提供しています。早期のアップグレードへのアクセスは、非本番環境でのみ推奨され、サポートチケットをログしてリクエストできます。 + +以前のバージョンの機能に依存している場合、サービスの互換性設定を使用して、元の動作に戻すことが可能な場合があります。 diff --git a/docs/ja/about-us/distinctive-features.md b/docs/ja/about-us/distinctive-features.md new file mode 100644 index 00000000000..c61c5d58e08 --- /dev/null +++ b/docs/ja/about-us/distinctive-features.md @@ -0,0 +1,96 @@ +--- +slug: /ja/about-us/distinctive-features +sidebar_label: ClickHouseはなぜユニークなのか? +sidebar_position: 50 +description: 他のデータベース管理システムとは異なるClickHouseの特徴を理解する +--- + +# ClickHouseの特徴 + +## 真の列指向データベース管理システム + +真の列指向DBMSでは、値に余分なデータが保存されません。これは、値の長さをその隣に「数値」として保存することを避けるために、固定長の値をサポートする必要があることを意味します。たとえば、10億個のUInt8型の値は圧縮されていないときに約1GBを消費するべきであり、これはCPUの使用に強く影響します。データを圧縮されずに(「ゴミ」がなく)コンパクトに保存することが重要で、というのも、データの解凍速度(CPU使用量)は圧縮されていないデータのボリュームに主に依存するからです。 + +これは、異なるカラムの値を別々に保存できるが、分析クエリを効果的に処理できないシステム、例えばHBase、BigTable、Cassandra、HyperTableなどとは対照的です。これらのシステムでは、1秒間に約10万行のスループットは得られますが、数億行は得られません。 + +最終的に、ClickHouseはデータベース管理システムであり、単一のデータベースではありません。実行時にテーブルやデータベースを作成し、データをロードし、サーバーを再構成せずにクエリを実行できます。 + +## データ圧縮 {#data-compression} + +一部の列指向DBMSはデータ圧縮を使用しません。しかし、データ圧縮は優れたパフォーマンスを達成するための重要な要素です。 + +ディスクスペースとCPU消費の間のトレードオフを考慮した効率的な汎用圧縮コーデックに加え、ClickHouseは特定のデータ型に特化した[コーデック](/docs/ja/sql-reference/statements/create/table.md#specialized-codecs)を提供し、ClickHouseはタイムシリーズ型のような特定の用途に優れたデータベースと競争し、さらに優れます。 + +## データのディスクストレージ {#disk-storage-of-data} + +データを主キーで物理的にソートして保持すると、特定の値または値の範囲に基づいてデータを数十ミリ秒未満の低遅延で抽出することが可能になります。SAP HANAやGoogle PowerDrillのような一部の列指向DBMSはRAMでのみ動作します。このアプローチではリアルタイム分析に必要以上のハードウェア予算を確保する必要があります。 + +ClickHouseは通常のハードドライブで動作するように設計されており、これはデータストレージあたりのGB単位のコストが低いことを意味しますが、利用可能な場合はSSDや追加のRAMも完全に使用します。 + +## 複数コアでの並列処理 {#parallel-processing-on-multiple-cores} + +大きなクエリは自然に並列化され、現在のサーバーで利用可能なすべてのリソースを利用します。 + +## 複数サーバーでの分散処理 {#distributed-processing-on-multiple-servers} + +上記の列指向DBMSのほとんどに分散クエリ処理のサポートはありません。 + +ClickHouseでは、データは異なるシャードに存在できます。各シャードは耐障害性のために使用されるレプリカのグループであることができます。すべてのシャードは、ユーザーにとって透明に並列でクエリを実行するために使用されます。 + +## SQLサポート {#sql-support} + +ClickHouseは、ANSI SQL標準とほぼ互換性のある[SQL言語](/ja/sql-reference/)をサポートしています。 + +サポートされているクエリには、[GROUP BY](../sql-reference/statements/select/group-by.md)、[ORDER BY](../sql-reference/statements/select/order-by.md)、[FROM](../sql-reference/statements/select/from.md)でのサブクエリ、[JOIN](../sql-reference/statements/select/join.md)句、[IN](../sql-reference/operators/in.md)演算子、[ウィンドウ関数](../sql-reference/window-functions/index.md)やスカラーサブクエリが含まれます。 + +相関(依存)サブクエリは執筆時点ではサポートされていませんが、将来的には利用可能になる可能性があります。 + +## ベクター計算エンジン {#vector-engine} + +データはカラムで保存されるだけでなく、ベクター(カラムの一部)によって処理され、高いCPU効率が達成されます。 + +## リアルタイムデータ挿入 {#real-time-data-updates} + +ClickHouseは主キーを持つテーブルをサポートしています。主キーの範囲でクエリを迅速に実行するために、データはインクリメンタルにMergeTreeを使用してソートされます。これにより、データを継続的にテーブルに追加することができます。新しいデータが取り込まれた際にロックは取得されません。 + +## 主インデックス {#primary-index} + +データが主キーで物理的にソートされていることで、特定の値または値の範囲に基づいてデータを数十ミリ秒未満の低遅延で抽出することが可能になります。 + +## 二次インデックス {#secondary-indexes} + +他のデータベース管理システムとは異なり、ClickHouseの二次インデックスは特定の行や行範囲を指しません。代わりに、クエリのフィルタリング条件に一致しないすべての行があるデータ部分でそれを読み込まないようにデータベースに事前に知らせるため、[データスキッピングインデックス](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-data_skipping-indexes)と呼ばれます。 + +## オンラインクエリへの適合性 {#suitable-for-online-queries} + +ほとんどのOLAPデータベース管理システムは、1秒未満のレイテンシーでのオンラインクエリを目指していません。代替システムでは、数十秒から数分間のレポート生成時間が許容されることが多く、時にはさらに時間がかかり、オフラインでレポートを準備することを強いられることがあります(事前に、または「後で来てください」という形で)。 + +ClickHouseでは、「低遅延」とは、ユーザーインターフェースページが読み込まれるのと同時に、遅延なく、事前に回答を準備しようとせずにクエリを処理できることを意味します。言い換えれば、オンラインで。 + +## 近似計算のサポート {#support-for-approximated-calculations} + +ClickHouseは、性能を犠牲にして精度をトレードオフする様々な方法を提供しています: + +1. 異なる値の数、中央値、および分位数を近似計算するための集計関数。 +2. データの一部(サンプル)に基づいてクエリを実行し、近似結果を得る。この場合、ディスクから取得されるデータの量は比例して少なくなります。 +3. すべてのキーではなく、ランダムなキーの制限された数の集計を実行する。データ内のキー分布の条件によっては、少ないリソースで合理的に正確な結果を提供します。 + +## アダプティブジョインアルゴリズム {#adaptive-join-algorithm} + +ClickHouseは、複数のテーブルを[JOIN](../sql-reference/statements/select/join.md)する際に、主にハッシュジョインアルゴリズムを選択し、複数の大きなテーブルがある場合にはマージジョインアルゴリズムにフォールバックします。 + +## データレプリケーションとデータ整合性のサポート {#data-replication-and-data-integrity-support} + +ClickHouseは非同期マルチマスターレプリケーションを使用します。利用可能なレプリカに書き込まれた後、残りのすべてのレプリカがバックグラウンドでそのコピーを取得します。システムは異なるレプリカに同一のデータを保持します。ほとんどの障害からの回復は自動または複雑な場合には半自動で行われます。 + +詳細については、[データレプリケーション](../engines/table-engines/mergetree-family/replication.md)のセクションを参照してください。 + +## ロールベースのアクセス制御 {#role-based-access-control} + +ClickHouseはSQLクエリを使用したユーザーアカウント管理を実装し、ANSI SQL標準および一般的なリレーショナルデータベース管理システムで見られる[ロールベースのアクセス制御の構成](/docs/ja/guides/sre/user-management/index.md)を可能にします。 + +## 欠点と考えられる機能 {#clickhouse-features-that-can-be-considered-disadvantages} + +1. 本格的なトランザクションなし。 +2. 高速かつ低遅延で既に挿入されたデータを修正または削除する能力の欠如。データを整理したり変更したりするためにバッチ削除や更新は利用可能ですが、例えば[GDPR](https://gdpr-info.eu)に準拠するために別の方法があります。 +3. スパースなインデックスがClickHouseをポイントクエリでシングル行をキーによって取得するのにあまり効率的ではないようにします。 diff --git a/docs/ja/about-us/history.md b/docs/ja/about-us/history.md new file mode 100644 index 00000000000..c851c8e07a5 --- /dev/null +++ b/docs/ja/about-us/history.md @@ -0,0 +1,51 @@ +--- +slug: /ja/about-us/history +sidebar_label: ClickHouseの歴史 +sidebar_position: 40 +description: それが始まった場所... +--- + +# ClickHouseの歴史 {#clickhouse-history} + +ClickHouseは当初、[世界で2番目に大きなウェブ解析プラットフォーム](http://w3techs.com/technologies/overview/traffic_analysis/all)である[Yandex.Metrica](https://metrica.yandex.com/)を支えるために開発され、そのシステムのコアコンポーネントとして今も使われています。データベースには13兆を超えるレコードがあり、1日あたり200億件以上のイベントが発生しています。ClickHouseは、非集約データから直接カスタムレポートをその場で生成することを可能にします。この記事では、ClickHouseの開発初期段階での目標について簡単に説明します。 + +Yandex.Metricaは、ヒット数やセッション数に基づいてカスタマイズされたレポートをその場で作成し、ユーザーによって定義された任意のセグメントを使用します。このためには、しばしばユニークユーザー数などの複雑な集約を構築する必要があります。レポート作成のための新しいデータはリアルタイムで到着します。 + +2014年4月時点で、Yandex.Metricaは1日あたり約120億件のイベント(ページビューやクリック)を追跡していました。これらすべてのイベントはカスタムレポートを構築するために保存されなければなりません。単一のクエリでは数百万行を数百ミリ秒以内でスキャンしなければならないこともあれば、数億行を数秒でスキャンすることもあります。 + +## Yandex.Metricaとその他のYandexサービスでの使用 {#usage-in-yandex-metrica-and-other-yandex-services} + +ClickHouseは、Yandex.Metricaにおいて多目的に利用されています。 主なタスクは、非集約データを使用してオンラインモードでレポートを作成することです。それは374台のサーバークラスターを使用し、データベースに20.3兆行以上を保存します。圧縮データのボリュームは約2 PBで、重複とレプリカを考慮しない場合のことです。圧縮されていないデータ(TSV形式)のボリュームは約17 PBになります。 + +ClickHouseはまた、以下のプロセスにおいて重要な役割を果たしています: + +- Yandex.Metricaからのセッション再生データの保存。 +- 中間データの処理。 +- Analyticsを使用したグローバルレポートの作成。 +- Yandex.Metricaエンジンのデバッグのためにクエリを実行。 +- APIとユーザーインターフェースからのログの解析。 + +現在、他のYandexサービスや部門の検索バーティカル、eコマース、広告、ビジネス分析、モバイル開発、パーソナルサービスなどで、数十件のClickHouseのインストールが見られます。 + +## 集約データと非集約データ {#aggregated-and-non-aggregated-data} + +統計を効果的に計算するためには、データを集約しなければならないという意見が広まりつつあります。なぜなら、これによりデータの量が削減されるからです。 + +しかし、データ集約には多くの制約があります: + +- 必要なレポートの事前定義リストが必要です。 +- ユーザーはカスタムレポートを作成できません。 +- 多数の異なるキーに対して集約する場合、データ量はほとんど削減されないため、集約は無意味です。 +- 多数のレポートに対して、集約のバリエーションが多すぎる(組み合わせの爆発)。 +- 高いカーディナリティ(たとえばURL)のキーを集約する場合、データ量はあまり削減されません(2倍未満)。 +- このため、集約されたデータ量が縮小するどころか増加することがあります。 +- ユーザーは我々が生成するすべてのレポートを閲覧するわけではありません。大部分の計算は無駄になります。 +- さまざまな集約に対してデータの論理的一貫性が損なわれることがあります。 + +何も集約せず、非集約データとともに作業する場合、このアプローチにより計算量が削減されることがあります。 + +しかし、集約では作業の大部分がオフラインで比較的落ち着いて完了します。それに対照的に、オンライン計算ではユーザーが結果を待っているため、できるだけ早く計算する必要があります。 + +Yandex.Metricaには、Metrageというデータを集約するための専門システムがあり、大多数のレポートで使用されていました。 2009年から、Yandex.Metricaでは、レポートビルダーに以前使用されていたOLAPServerという非集約データのための専門的なOLAPデータベースも使用していました。OLAPServerは非集約データにはうまく機能しましたが、望ましいすべてのレポートで使用できない多くの制約がありました。これにはデータ型のサポート(数値のみ)がないことや、データをリアルタイムで増分更新できないこと(データを毎日書き換えることのみ可能)が含まれます。OLAPServerはDBMSではなく、専門的なDBです。 + +ClickHouseの初期目標は、OLAPServerの制約を撤廃し、すべてのレポートで非集約データを用いた作業の問題を解決することでしたが、長年にわたって成長を続け、広範囲の分析タスクに適した汎用データベース管理システムに成長しました。 diff --git a/docs/ja/about-us/intro.mdx b/docs/ja/about-us/intro.mdx new file mode 100644 index 00000000000..63c6b64de13 --- /dev/null +++ b/docs/ja/about-us/intro.mdx @@ -0,0 +1,9 @@ +--- +slug: /ja/about-clickhouse +sidebar_label: 入出力フォーマット +title: ClickHouseとは? +--- + +import Content from '@site/docs/ja/intro.md'; + + diff --git a/docs/ja/about-us/support.md b/docs/ja/about-us/support.md new file mode 100644 index 00000000000..9e8917f45e6 --- /dev/null +++ b/docs/ja/about-us/support.md @@ -0,0 +1,19 @@ +--- +slug: /ja/about-us/support +sidebar_label: サポート +title: ClickHouse Cloud サポートサービス +sidebar_position: 30 +--- + +ClickHouseでは、ClickHouse Cloudのユーザーと顧客向けにサポートサービスを提供しています。我々の目標は、ClickHouse製品を体現するサポートサービスチームを構築することです。それは、比類ないパフォーマンス、使いやすさ、および例外的に迅速で高品質な結果を提供することを意味します。詳細については、[サポートサービスページ](https://clickhouse.com/support/program/)をご覧ください。 + +[クラウドコンソールにログイン](https://clickhouse.cloud/support)して、メニューオプションから **ヘルプ -> サポート** を選択すると、新しいサポートケースを開いて、送信したケースのステータスを確認できます。 + +また、[ステータスページ](https://status.clickhouse.com)に登録して、プラットフォームに影響を与えるインシデントについて迅速に通知を受け取ることができます。 + +:::note +サポートインシデントに関するサービスレベルアグリーメントは、サブスクリプション顧客のみが対象です。現在ClickHouse Cloudのユーザーでない場合は、質問にはお答えしますが、代わりに以下のコミュニティリソースをご活用いただくことをお勧めします: + +- [ClickHouseコミュニティSlackチャンネル](https://clickhouse.com/slack) +- [その他のコミュニティオプション](https://github.com/ClickHouse/ClickHouse/blob/master/README.md#useful-links) +::: diff --git a/docs/ja/architecture/cluster-deployment.md b/docs/ja/architecture/cluster-deployment.md new file mode 100644 index 00000000000..e18df9c2c06 --- /dev/null +++ b/docs/ja/architecture/cluster-deployment.md @@ -0,0 +1,152 @@ +--- +slug: /ja/architecture/cluster-deployment +sidebar_label: クラスターデプロイ +sidebar_position: 100 +title: クラスターデプロイ +--- + +このチュートリアルでは、すでに[ローカルの ClickHouse サーバー](../getting-started/install.md)をセットアップしていることを前提としています。 + +このチュートリアルを通じて、シンプルな ClickHouse クラスターのセットアップ方法を学びます。小規模ですが、フォールトトレラントでスケーラブルです。その後、例のデータセットの1つを使用してデータを充填し、デモクエリを実行します。 + +## クラスターデプロイ {#cluster-deployment} + +この ClickHouse クラスターは同質クラスターになります。以下の手順に従ってください: + +1. クラスターのすべてのマシンに ClickHouse サーバーをインストールする +2. 設定ファイルにクラスターのコンフィグを設定する +3. 各インスタンスにローカルテーブルを作成する +4. [分散テーブル](../engines/table-engines/special/distributed.md)を作成する + +[分散テーブル](../engines/table-engines/special/distributed.md)は、ClickHouse クラスター内のローカルテーブルへの「ビュー」の一種です。分散テーブルからの SELECT クエリは、クラスターのすべてのシャードのリソースを使用して実行されます。複数のクラスターに対して設定を指定し、それに応じて異なるクラスターにビューを提供するために複数の分散テーブルを作成できます。 + +以下は、3つのシャードとそれぞれ1つのレプリカを持つクラスターのコンフィグ例です: + +```xml + + + + + example-perftest01j.clickhouse.com + 9000 + + + + + example-perftest02j.clickhouse.com + 9000 + + + + + example-perftest03j.clickhouse.com + 9000 + + + + +``` + +さらなるデモンストレーションのために、単一ノードデプロイメントチュートリアルで使用した `hits_v1` の `CREATE TABLE` クエリと同じクエリを使用して、新しいローカルテーブルを作成しますが、異なるテーブル名にします: + +```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()); +``` + +一般的な方法として、クラスターのすべてのマシンに同様の分散テーブルを作成します。これにより、クラスターの任意のマシンで分散クエリを実行できます。また、[remote](../sql-reference/table-functions/remote.md) テーブル関数を使用して、特定の SELECT クエリに対する一時的な分散テーブルを作成するオプションもあります。 + +分散テーブルに対して [INSERT SELECT](../sql-reference/statements/insert-into.md) を実行し、テーブルを複数のサーバーに分散させてみましょう。 + +```sql +INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1; +``` + +予想通り、計算量の多いクエリは1台のサーバーを使用するよりも3台のサーバーを使用することでN倍速く実行されます。 + +この場合、3つのシャードを持つクラスターを使用し、各シャードには1つのレプリカがあります。 + +本番環境での回復力を提供するために、各シャードには複数の可用性ゾーンまたはデータセンター(または少なくともラック)に広がる2〜3のレプリカを含めることをお勧めします。 ClickHouse は無制限の数のレプリカをサポートしていることに注意してください。 + +以下は、1つのシャードに3つのレプリカを含むクラスターのコンフィグ例です: + +```xml + + ... + + + + example-perftest01j.clickhouse.com + 9000 + + + example-perftest02j.clickhouse.com + 9000 + + + example-perftest03j.clickhouse.com + 9000 + + + + +``` + +ネイティブなレプリケーションを有効にするには、[ZooKeeper](http://zookeeper.apache.org/) が必要です。ClickHouse はすべてのレプリカのデータ整合性を保証し、障害後自動的に復元手続きを実行します。ZooKeeper クラスターを他のプロセス(ClickHouse を含む)が実行されていない別のサーバーにデプロイすることをお勧めします。 + +:::note Note +ZooKeeper は厳密には必須ではありません: 一部の簡単なケースでは、アプリケーションコードからすべてのレプリカにデータを書き込むことでデータを複製できます。このアプローチは**推奨されません**。なぜなら、この場合、ClickHouse はすべてのレプリカでのデータ整合性を保証できません。このため、データ整合性の責任はアプリケーションにあります。 +::: + +ZooKeeper の場所は設定ファイルで指定されます: + +```xml + + + zoo01.clickhouse.com + 2181 + + + zoo02.clickhouse.com + 2181 + + + zoo03.clickhouse.com + 2181 + + +``` + +また、テーブル作成時に使用されるシャードとレプリカを識別するためのマクロを設定する必要があります: + +```xml + + 01 + 01 + +``` + +レプリケートされたテーブルの作成時にレプリカが存在しない場合、新しい最初のレプリカがインスタンス化されます。すでにライブレプリカがある場合、新しいレプリカは既存のものからデータをクローンします。すべてのレプリケートされたテーブルを先に作成してからデータを挿入するか、あるいはデータ挿入中または後に他のレプリカを追加するかのいずれかのオプションがあります。 + +```sql +CREATE TABLE tutorial.hits_replica (...) +ENGINE = ReplicatedMergeTree( + '/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; +``` + +レプリケーションはマルチマスターモードで動作します。データは任意のレプリカにロードでき、システムは他のインスタンスと自動的に同期します。レプリケーションは非同期であるため、ある時点で、すべてのレプリカが最近挿入されたデータを含むとは限りません。ただし、データのインゲストを許可するには、少なくとも1つのレプリカが稼働している必要があります。その他のレプリカは再アクティブ化するとデータを同期し、一貫性を修復します。この方法により、最近挿入されたデータが失われる可能性が低いという利点があります。 diff --git a/docs/ja/chdb/data-formats.md b/docs/ja/chdb/data-formats.md new file mode 100644 index 00000000000..dd6a9fff7cb --- /dev/null +++ b/docs/ja/chdb/data-formats.md @@ -0,0 +1,98 @@ +--- +title: データ形式 +sidebar_label: データ形式 +slug: /ja/chdb/data-formats +description: chDBのデータ形式 +keywords: [chdb, データ形式] +--- + +データ形式について言えば、chDBはClickHouseと100%機能互換です。 + +入力形式は、`File`、`URL`、または`S3`のようなファイル対応テーブルへの`INSERT`および`SELECT`に提供されるデータを解析するために使用されます。出力形式は、`SELECT`の結果を整理し、ファイル対応テーブルへの`INSERT`を実行するために使用されます。ClickHouseがサポートするデータ形式に加えて、chDBも以下をサポートしています: + +- 出力形式としての`ArrowTable`、タイプはPythonの`pyarrow.Table` +- 入力および出力形式としての`DataFrame`、タイプはPythonの`pandas.DataFrame`。例については、[test_joindf.py](https://github.com/chdb-io/chdb/blob/main/tests/test_joindf.py)をご参照ください。 +- 出力としての`Debug`(`CSV`のエイリアスとして)、ただしClickHouseからのデバッグ冗長出力を有効にしています。 + +ClickHouseがサポートするデータ形式は以下の通りです: + +| Format | Input | Output | +|---------------------------------|-------|--------| +| TabSeparated | ✔ | ✔ | +| TabSeparatedRaw | ✔ | ✔ | +| TabSeparatedWithNames | ✔ | ✔ | +| TabSeparatedWithNamesAndTypes | ✔ | ✔ | +| TabSeparatedRawWithNames | ✔ | ✔ | +| TabSeparatedRawWithNamesAndTypes| ✔ | ✔ | +| Template | ✔ | ✔ | +| TemplateIgnoreSpaces | ✔ | ✗ | +| CSV | ✔ | ✔ | +| CSVWithNames | ✔ | ✔ | +| CSVWithNamesAndTypes | ✔ | ✔ | +| CustomSeparated | ✔ | ✔ | +| CustomSeparatedWithNames | ✔ | ✔ | +| CustomSeparatedWithNamesAndTypes| ✔ | ✔ | +| SQLInsert | ✗ | ✔ | +| Values | ✔ | ✔ | +| Vertical | ✗ | ✔ | +| JSON | ✔ | ✔ | +| JSONAsString | ✔ | ✗ | +| JSONStrings | ✔ | ✔ | +| JSONColumns | ✔ | ✔ | +| JSONColumnsWithMetadata | ✔ | ✔ | +| JSONCompact | ✔ | ✔ | +| JSONCompactStrings | ✗ | ✔ | +| JSONCompactColumns | ✔ | ✔ | +| JSONEachRow | ✔ | ✔ | +| PrettyJSONEachRow | ✗ | ✔ | +| JSONEachRowWithProgress | ✗ | ✔ | +| JSONStringsEachRow | ✔ | ✔ | +| JSONStringsEachRowWithProgress | ✗ | ✔ | +| JSONCompactEachRow | ✔ | ✔ | +| JSONCompactEachRowWithNames | ✔ | ✔ | +| JSONCompactEachRowWithNamesAndTypes | ✔ | ✔ | +| JSONCompactStringsEachRow | ✔ | ✔ | +| JSONCompactStringsEachRowWithNames | ✔ | ✔ | +| JSONCompactStringsEachRowWithNamesAndTypes | ✔ | ✔ | +| JSONObjectEachRow | ✔ | ✔ | +| BSONEachRow | ✔ | ✔ | +| TSKV | ✔ | ✔ | +| Pretty | ✗ | ✔ | +| PrettyNoEscapes | ✗ | ✔ | +| PrettyMonoBlock | ✗ | ✔ | +| PrettyNoEscapesMonoBlock | ✗ | ✔ | +| PrettyCompact | ✗ | ✔ | +| PrettyCompactNoEscapes | ✗ | ✔ | +| PrettyCompactMonoBlock | ✗ | ✔ | +| PrettyCompactNoEscapesMonoBlock | ✗ | ✔ | +| PrettySpace | ✗ | ✔ | +| PrettySpaceNoEscapes | ✗ | ✔ | +| PrettySpaceMonoBlock | ✗ | ✔ | +| PrettySpaceNoEscapesMonoBlock | ✗ | ✔ | +| Prometheus | ✗ | ✔ | +| Protobuf | ✔ | ✔ | +| ProtobufSingle | ✔ | ✔ | +| Avro | ✔ | ✔ | +| AvroConfluent | ✔ | ✗ | +| Parquet | ✔ | ✔ | +| ParquetMetadata | ✔ | ✗ | +| Arrow | ✔ | ✔ | +| ArrowStream | ✔ | ✔ | +| ORC | ✔ | ✔ | +| One | ✔ | ✗ | +| RowBinary | ✔ | ✔ | +| RowBinaryWithNames | ✔ | ✔ | +| RowBinaryWithNamesAndTypes | ✔ | ✔ | +| RowBinaryWithDefaults | ✔ | ✔ | +| Native | ✔ | ✔ | +| Null | ✗ | ✔ | +| XML | ✗ | ✔ | +| CapnProto | ✔ | ✔ | +| LineAsString | ✔ | ✔ | +| Regexp | ✔ | ✗ | +| RawBLOB | ✔ | ✔ | +| MsgPack | ✔ | ✔ | +| MySQLDump | ✔ | ✗ | +| Markdown | ✗ | ✔ | + +詳細および例については、[ClickHouseの入力および出力データ形式](/docs/ja/interfaces/formats)をご覧ください。 diff --git a/docs/ja/chdb/getting-started.md b/docs/ja/chdb/getting-started.md new file mode 100644 index 00000000000..1d957bb91ad --- /dev/null +++ b/docs/ja/chdb/getting-started.md @@ -0,0 +1,367 @@ +--- +title: chDBの使い始め +sidebar_label: 使い始め +slug: /ja/chdb/getting-started +description: chDBはClickHouseによってパワードされたプロセス内SQL OLAPエンジンです +keywords: [chdb, embedded, clickhouse-lite, in-process, in process] +--- + +# chDBの使い始め + +このガイドでは、chDBのPythonバリアントをセットアップしていきます。まず、S3上のJSONファイルにクエリを実行し、それを基にchDBでテーブルを作成し、データに対するクエリを行います。さらに、クエリ結果をApache ArrowやPandasなど異なるフォーマットで取得する方法を学び、最終的にはPandas DataFrameに対してクエリを実行する方法を紹介します。 + +## セットアップ + +まずは仮想環境を作成します: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。バージョン2.0.3以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +そして[ipython](https://ipython.org/)をインストールします: + +```bash +pip install ipython +``` + +このガイドの残りでは`ipython`を使ってコマンドを実行します。以下のコマンドで`ipython`を起動できます: + +```bash +ipython +``` + +さらに、PandasとApache Arrowを使用するので、それらのライブラリもインストールします: + +```bash +pip install pandas pyarrow +``` + +## S3上にあるJSONファイルにクエリ + +次に、S3バケットに保存されているJSONファイルに対してクエリを行う方法を見てみましょう。[YouTubeの非表示データセット](https://clickhouse.com/docs/ja/getting-started/example-datasets/youtube-dislikes)には、2021年までのYouTube動画の非表示数が4億以上含まれています。このデータセットのJSONファイルの1つを使っていきます。 + +chdbをインポートします: + +```python +import chdb +``` + +次のクエリで、JSONファイルの構造を調べることができます: + +```python +chdb.query( + """ + DESCRIBE s3( + 's3://clickhouse-public-datasets/youtube/original/files/' || + 'youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst', + 'JSONLines' + ) + SETTINGS describe_compact_output=1 + """ +) +``` + +```text +"id","Nullable(String)" +"fetch_date","Nullable(String)" +"upload_date","Nullable(String)" +"title","Nullable(String)" +"uploader_id","Nullable(String)" +"uploader","Nullable(String)" +"uploader_sub_count","Nullable(Int64)" +"is_age_limit","Nullable(Bool)" +"view_count","Nullable(Int64)" +"like_count","Nullable(Int64)" +"dislike_count","Nullable(Int64)" +"is_crawlable","Nullable(Bool)" +"is_live_content","Nullable(Bool)" +"has_subtitles","Nullable(Bool)" +"is_ads_enabled","Nullable(Bool)" +"is_comments_enabled","Nullable(Bool)" +"description","Nullable(String)" +"rich_metadata","Array(Tuple( + call Nullable(String), + content Nullable(String), + subtitle Nullable(String), + title Nullable(String), + url Nullable(String)))" +"super_titles","Array(Tuple( + text Nullable(String), + url Nullable(String)))" +"uploader_badges","Nullable(String)" +"video_badges","Nullable(String)" +``` + +また、そのファイル内の行数をカウントすることもできます: + +```python +chdb.query( + """ + SELECT count() + FROM s3( + 's3://clickhouse-public-datasets/youtube/original/files/' || + 'youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst', + 'JSONLines' + )""" +) +``` + +```text +336432 +``` + +このファイルには30万以上のレコードが含まれています。 + +chDBはまだクエリパラメータの受け渡しをサポートしていませんが、パスを取り出してf-Stringを使って渡すことができます。 + +```python +path = 's3://clickhouse-public-datasets/youtube/original/files/youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst' +``` + +```python +chdb.query( + f""" + SELECT count() + FROM s3('{path}','JSONLines') + """ +) +``` + +:::warning +これはプログラム内で定義された変数を使用する限りでは問題ありませんが、ユーザーから提供された入力で行うと、クエリがSQLインジェクションに対して脆弱になります。 +::: + +## 出力フォーマットの設定 + +デフォルトの出力フォーマットは`CSV`ですが、`output_format`パラメータを使って変更できます。chDBはClickHouseのデータフォーマットに加え、`DataFrame`など[chDB独自のフォーマット](data-formats.md)をサポートしており、Pandas DataFrameを返します: + +```python +result = chdb.query( + f""" + SELECT is_ads_enabled, count() + FROM s3('{path}','JSONLines') + GROUP BY ALL + """, + output_format="DataFrame" +) + +print(type(result)) +print(result) +``` + +```text + + is_ads_enabled count() +0 False 301125 +1 True 35307 +``` + +また、Apache Arrowテーブルを取得したい場合は: + +```python +result = chdb.query( + f""" + SELECT is_live_content, count() + FROM s3('{path}','JSONLines') + GROUP BY ALL + """, + output_format="ArrowTable" +) + +print(type(result)) +print(result) +``` + +```text + +pyarrow.Table +is_live_content: bool +count(): uint64 not null +---- +is_live_content: [[false,true]] +count(): [[315746,20686]] +``` + +## JSONファイルからテーブルの作成 + +次に、chDBでテーブルを作成する方法を見てみましょう。これを行うには、異なるAPIを使用する必要がありますので、まずそれをインポートします: + +```python +from chdb import session as chs +``` + +次に、セッションを初期化します。セッションをディスクに保存したい場合は、ディレクトリ名を指定する必要があります。これを空にすると、データベースはメモリ上に配置され、Pythonのプロセスを終了すると消去されます。 + +```python +sess = chs.Session("gettingStarted.chdb") +``` + +次に、データベースを作成します: + +```python +sess.query("CREATE DATABASE IF NOT EXISTS youtube") +``` + +次に、JSONファイルのスキーマに基づいて`dislikes`テーブルを`CREATE...EMPTY AS`技法を使って作成します。カラムの型をすべて`Nullable`にしないように[`schema_inference_make_columns_nullable`](/docs/ja/operations/settings/formats/#schema_inference_make_columns_nullable)設定を使用します。 + +```python +sess.query(f""" + CREATE TABLE youtube.dislikes + ORDER BY fetch_date + EMPTY AS + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +その後、`DESCRIBE`句を使ってスキーマを確認できます: + +```python +sess.query(f""" + DESCRIBE youtube.dislikes + SETTINGS describe_compact_output=1 + """ +) +``` + +```text +"id","String" +"fetch_date","String" +"upload_date","String" +"title","String" +"uploader_id","String" +"uploader","String" +"uploader_sub_count","Int64" +"is_age_limit","Bool" +"view_count","Int64" +"like_count","Int64" +"dislike_count","Int64" +"is_crawlable","Bool" +"is_live_content","Bool" +"has_subtitles","Bool" +"is_ads_enabled","Bool" +"is_comments_enabled","Bool" +"description","String" +"rich_metadata","Array(Tuple( + call String, + content String, + subtitle String, + title String, + url String))" +"super_titles","Array(Tuple( + text String, + url String))" +"uploader_badges","String" +"video_badges","String" +``` + +次に、そのテーブルにデータを挿入します: + +```python +sess.query(f""" + INSERT INTO youtube.dislikes + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +これらのステップを1回の操作で行うこともできます。`CREATE...AS`技法を使って異なるテーブルを作成してみます: + +```python +sess.query(f""" + CREATE TABLE youtube.dislikes2 + ORDER BY fetch_date + AS + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +## テーブルへのクエリ + +最後に、テーブルにクエリを実行します: + +```sql +df = sess.query(""" + SELECT uploader, sum(view_count) AS viewCount, sum(like_count) AS likeCount, sum(dislike_count) AS dislikeCount + FROM youtube.dislikes + GROUP BY ALL + ORDER BY viewCount DESC + LIMIT 10 + """, + "DataFrame" +) +df +``` + +```text + uploader viewCount likeCount dislikeCount +0 Jeremih 139066569 812602 37842 +1 TheKillersMusic 109313116 529361 11931 +2 LetsGoMartin- Canciones Infantiles 104747788 236615 141467 +3 Xiaoying Cuisine 54458335 1031525 37049 +4 Adri 47404537 279033 36583 +5 Diana and Roma IND 43829341 182334 148740 +6 ChuChuTV Tamil 39244854 244614 213772 +7 Cheez-It 35342270 108 27 +8 Anime Uz 33375618 1270673 60013 +9 RC Cars OFF Road 31952962 101503 49489 +``` + +例えば、次にDataFrameにlikesとdislikesの比率を計算するカラムを追加する場合、次のコードを書くことができます: + +```python +df["likeDislikeRatio"] = df["likeCount"] / df["dislikeCount"] +``` + +## Pandas DataFrameへのクエリ + +次に、そのDataFrameに対してchDBからクエリを実行できます: + +```python +chdb.query( + """ + SELECT uploader, likeDislikeRatio + FROM Python(df) + """, + output_format="DataFrame" +) +``` + +```text + uploader likeDislikeRatio +0 Jeremih 21.473548 +1 TheKillersMusic 44.368536 +2 LetsGoMartin- Canciones Infantiles 1.672581 +3 Xiaoying Cuisine 27.842182 +4 Adri 7.627395 +5 Diana and Roma IND 1.225857 +6 ChuChuTV Tamil 1.144275 +7 Cheez-It 4.000000 +8 Anime Uz 21.173296 +9 RC Cars OFF Road 2.051021 +``` + +Pandas DataFrameへのクエリについての詳細は[Querying Pandas developer guide](guides/querying-pandas.md)で詳しく説明されています。 + +## 次のステップ + +このガイドでchDBの概要が理解できたでしょうか。さらなる学習には、以下のデベロッパーガイドをご参照ください: + +* [Pandas DataFrameへのクエリ](guides/querying-pandas.md) +* [Apache Arrowへのクエリ](guides/querying-apache-arrow.md) +* [JupySQLでのchDBの使用](guides/jupysql.md) +* [既存のclickhouse-localデータベースでのchDBの使用](guides/clickhouse-local.md) diff --git a/docs/ja/chdb/guides/clickhouse-local.md b/docs/ja/chdb/guides/clickhouse-local.md new file mode 100644 index 00000000000..850e4802656 --- /dev/null +++ b/docs/ja/chdb/guides/clickhouse-local.md @@ -0,0 +1,127 @@ +--- +title: clickhouse-localデータベースの使用方法 +sidebar_label: clickhouse-localデータベースの使用方法 +slug: /ja/chdb/guides/clickhouse-local +description: chDBでclickhouse-localデータベースを使用する方法を学びます。 +keywords: [chdb, clickhouse-local] +--- + +[clickhouse-local](/ja/operations/utilities/clickhouse-local) は、ClickHouseの埋め込みバージョンを使用するCLIであり、サーバーをインストールすることなくClickHouseの機能を利用できるようにします。このガイドでは、chDBからclickhouse-localデータベースを使用する方法を学びます。 + +## セットアップ + +最初に仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。 +バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +続いて[ipython](https://ipython.org/)をインストールします: + +```bash +pip install ipython +``` + +このガイドの残りのコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +## clickhouse-localのインストール + +clickhouse-localのダウンロードとインストールは、[ClickHouseのダウンロードとインストール](https://clickhouse.com/docs/ja/install)と同じです。以下のコマンドを実行します: + +```bash +curl https://clickhouse.com/ | sh +``` + +データをディレクトリに保存してclickhouse-localを起動するには、`--path`を指定する必要があります: + +```bash +./clickhouse -m --path demo.chdb +``` + +## clickhouse-localにデータを取り込む + +デフォルトのデータベースはメモリにデータを保存するだけなので、ディスクにデータを保持するには名前付きデータベースを作成する必要があります。 + +```sql +CREATE DATABASE foo; +``` + +次にテーブルを作成し、ランダムな数値を挿入します: + +```sql +CREATE TABLE foo.randomNumbers +ORDER BY number AS +SELECT rand() AS number +FROM numbers(10_000_000); +``` + +データを確認するためにクエリを実行してみましょう: + +```sql +SELECT quantilesExact(0, 0.5, 0.75, 0.99)(number) AS quants +FROM foo.randomNumbers + +┌─quants────────────────────────────────┐ +│ [69,2147776478,3221525118,4252096960] │ +└───────────────────────────────────────┘ +``` + +その後、CLIから`exit;`することを忘れないでください。ディレクトリに対するロックを保持できるのは一つのプロセスだけです。この操作を怠ると、chDBからデータベースに接続しようとしたときに次のエラーが発生します: + +```text +ChdbError: Code: 76. DB::Exception: Cannot lock file demo.chdb/status. Another server instance in same directory is already running. (CANNOT_OPEN_FILE) +``` + +## clickhouse-localデータベースへの接続 + +`ipython`シェルに戻り、chDBから`session`モジュールをインポートします: + +```python +from chdb import session as chs +``` + +`demo.chdb`を指すセッションを初期化します: + +``` +sess = chs.Session("demo.chdb") +``` + +次に、数値の分位を返す同じクエリを実行できます: + +```python +sess.query(""" +SELECT quantilesExact(0, 0.5, 0.75, 0.99)(number) AS quants +FROM foo.randomNumbers +""", "Vertical") + +Row 1: +────── +quants: [0,9976599,2147776478,4209286886] +``` + +chDBからこのデータベースにデータを挿入することもできます: + +```python +sess.query(""" +INSERT INTO foo.randomNumbers +SELECT rand() AS number FROM numbers(10_000_000) +""") + +Row 1: +────── +quants: [0,9976599,2147776478,4209286886] +``` + +その後、chDBまたはclickhouse-localから分位数クエリを再実行できます。 diff --git a/docs/ja/chdb/guides/images/players_per_rank.png b/docs/ja/chdb/guides/images/players_per_rank.png new file mode 100644 index 00000000000..16ca6da241d Binary files /dev/null and b/docs/ja/chdb/guides/images/players_per_rank.png differ diff --git a/docs/ja/chdb/guides/jupysql.md b/docs/ja/chdb/guides/jupysql.md new file mode 100644 index 00000000000..281ffbcff18 --- /dev/null +++ b/docs/ja/chdb/guides/jupysql.md @@ -0,0 +1,420 @@ +--- +title: JupySQLとchDB +sidebar_label: JupySQL +slug: /ja/chdb/guides/jupysql +description: BunのためのchDBのインストール方法 +keywords: [chdb, jupysql] +--- + +[JupySQL](https://jupysql.ploomber.io/en/latest/quick-start.html) は、JupyterノートブックやiPythonシェルでSQLを実行するためのPythonライブラリです。 +このガイドでは、chDBとJupySQLを使ってデータをクエリする方法を学びます。 + +
+ +
+ +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、JupySQL、iPython、およびJupyter Labをインストールします: + +```bash +pip install jupysql ipython jupyterlab +``` + +iPythonでJupySQLを使用できるように、以下を実行して起動します: + +```bash +ipython +``` + +あるいは、Jupyter Labで以下を実行して起動できます: + +```bash +jupyter lab +``` + +:::note +Jupyter Labを使用している場合、ガイドの続きを行う前にノートブックを作成する必要があります。 +::: + +## データセットのダウンロード + +[Jeff Sackmannのtennis_atp](https://github.com/JeffSackmann/tennis_atp) データセットを使用します。このデータセットは、選手とそのランキングに関するメタデータを含んでいます。 +最初にランキングファイルをダウンロードしましょう: + +```python +from urllib.request import urlretrieve +``` + +```python +files = ['00s', '10s', '20s', '70s', '80s', '90s', 'current'] +base = "https://raw.githubusercontent.com/JeffSackmann/tennis_atp/master" +for file in files: + _ = urlretrieve( + f"{base}/atp_rankings_{file}.csv", + f"atp_rankings_{file}.csv", + ) +``` + +## chDBとJupySQLの設定 + +次に、chDBの`dbapi`モジュールをインポートします: + +```python +from chdb import dbapi +``` + +そして、chDB接続を作成します。 +保存したデータはすべて`atp.chdb`ディレクトリに保存されます: + +```python +conn = dbapi.connect(path="atp.chdb") +``` + +次に、`sql`マジックをロードし、chDBへの接続を作成します: + +```python +%load_ext sql +%sql conn --alias chdb +``` + +次に、クエリの結果が切り捨てられないように表示制限を設定します: + +```python +%config SqlMagic.displaylimit = None +``` + +## CSVファイルのデータクエリ + +`atp_rankings`プレフィックスのついた複数のファイルをダウンロードしました。 +`DESCRIBE`句を使ってスキーマを理解しましょう: + +```python +%%sql +DESCRIBE file('atp_rankings*.csv') +SETTINGS describe_compact_output=1, + schema_inference_make_columns_nullable=0 +``` + +```text ++--------------+-------+ +| name | type | ++--------------+-------+ +| ranking_date | Int64 | +| rank | Int64 | +| player | Int64 | +| points | Int64 | ++--------------+-------+ +``` + +また、ファイルに対して直接`SELECT`クエリを書いてデータの内容を確認することもできます: + +```python +%sql SELECT * FROM file('atp_rankings*.csv') LIMIT 1 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 20000110 | 1 | 101736 | 4135 | ++--------------+------+--------+--------+ +``` + +データのフォーマットが少し不思議です。 +この日付をきれいにし、`REPLACE`句を使ってクリーンな`ranking_date`を返します: + +```python +%%sql +SELECT * REPLACE ( + toDate(parseDateTime32BestEffort(toString(ranking_date))) AS ranking_date +) +FROM file('atp_rankings*.csv') +LIMIT 10 +SETTINGS schema_inference_make_columns_nullable=0 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 2000-01-10 | 1 | 101736 | 4135 | +| 2000-01-10 | 2 | 102338 | 2915 | +| 2000-01-10 | 3 | 101948 | 2419 | +| 2000-01-10 | 4 | 103017 | 2184 | +| 2000-01-10 | 5 | 102856 | 2169 | +| 2000-01-10 | 6 | 102358 | 2107 | +| 2000-01-10 | 7 | 102839 | 1966 | +| 2000-01-10 | 8 | 101774 | 1929 | +| 2000-01-10 | 9 | 102701 | 1846 | +| 2000-01-10 | 10 | 101990 | 1739 | ++--------------+------+--------+--------+ +``` + +## CSVファイルをchDBにインポート + +これでこれらCSVファイルからのデータをテーブルに保存します。 +デフォルトのデータベースではデータがディスクに保存されないので、最初に別のデータベースを作成する必要があります: + +```python +%sql CREATE DATABASE atp +``` + +次に、CSVファイルのデータ構造から派生するスキーマを持つ`rankings`というテーブルを作成します: + +```python +%%sql +CREATE TABLE atp.rankings +ENGINE=MergeTree +ORDER BY ranking_date AS +SELECT * REPLACE ( + toDate(parseDateTime32BestEffort(toString(ranking_date))) AS ranking_date +) +FROM file('atp_rankings*.csv') +SETTINGS schema_inference_make_columns_nullable=0 +``` + +テーブル内のデータを簡単に確認しましょう: + +```python +%sql SELECT * FROM atp.rankings LIMIT 10 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 2000-01-10 | 1 | 101736 | 4135 | +| 2000-01-10 | 2 | 102338 | 2915 | +| 2000-01-10 | 3 | 101948 | 2419 | +| 2000-01-10 | 4 | 103017 | 2184 | +| 2000-01-10 | 5 | 102856 | 2169 | +| 2000-01-10 | 6 | 102358 | 2107 | +| 2000-01-10 | 7 | 102839 | 1966 | +| 2000-01-10 | 8 | 101774 | 1929 | +| 2000-01-10 | 9 | 102701 | 1846 | +| 2000-01-10 | 10 | 101990 | 1739 | ++--------------+------+--------+--------+ +``` + +見た目は良さそうです。予想通り、CSVファイルを直接クエリしたときと同じ出力です。 + +選手のメタデータについても同じプロセスに従います。 +今回はデータがすべて単一のCSVファイル内にあるので、そのファイルをダウンロードしましょう: + +```python +_ = urlretrieve( + f"{base}/atp_players.csv", + "atp_players.csv", +) +``` + +次に、CSVファイルの内容に基づいて`players`というテーブルを作成します。 +また、`dob`フィールドを`Date32`型にしてきれいにします。 + +> ClickHouseでは、`Date`型は1970年以降の日付のみをサポートしています。`dob`カラムが1970年以前の日付を含むため、代わりに`Date32`型を使用します。 + +```python +%%sql +CREATE TABLE atp.players +Engine=MergeTree +ORDER BY player_id AS +SELECT * REPLACE ( + makeDate32( + toInt32OrNull(substring(toString(dob), 1, 4)), + toInt32OrNull(substring(toString(dob), 5, 2)), + toInt32OrNull(substring(toString(dob), 7, 2)) + )::Nullable(Date32) AS dob +) +FROM file('atp_players.csv') +SETTINGS schema_inference_make_columns_nullable=0 +``` + +実行が完了したら、取り込んだデータを確認してみましょう: + +```python +%sql SELECT * FROM atp.players LIMIT 10 +``` + +```text ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +| player_id | name_first | name_last | hand | dob | ioc | height | wikidata_id | ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +| 100001 | Gardnar | Mulloy | R | 1913-11-22 | USA | 185 | Q54544 | +| 100002 | Pancho | Segura | R | 1921-06-20 | ECU | 168 | Q54581 | +| 100003 | Frank | Sedgman | R | 1927-10-02 | AUS | 180 | Q962049 | +| 100004 | Giuseppe | Merlo | R | 1927-10-11 | ITA | 0 | Q1258752 | +| 100005 | Richard | Gonzalez | R | 1928-05-09 | USA | 188 | Q53554 | +| 100006 | Grant | Golden | R | 1929-08-21 | USA | 175 | Q3115390 | +| 100007 | Abe | Segal | L | 1930-10-23 | RSA | 0 | Q1258527 | +| 100008 | Kurt | Nielsen | R | 1930-11-19 | DEN | 0 | Q552261 | +| 100009 | Istvan | Gulyas | R | 1931-10-14 | HUN | 0 | Q51066 | +| 100010 | Luis | Ayala | R | 1932-09-18 | CHI | 170 | Q1275397 | ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +``` + +## chDBでのクエリ + +データの取り込みが完了したので、いよいよ楽しい部分です - データをクエリしましょう! + +テニス選手は、参戦したトーナメントでの成績に基づいてポイントを獲得します。 +ポイントは52週間のローリング期間で各選手に対して評価されます。 +各選手が獲得した最大ポイントとその時のランキングを見つけるクエリを書きます: + +```python +%%sql +SELECT name_first, name_last, + max(points) as maxPoints, + argMax(rank, points) as rank, + argMax(ranking_date, points) as date +FROM atp.players +JOIN atp.rankings ON rankings.player = players.player_id +GROUP BY ALL +ORDER BY maxPoints DESC +LIMIT 10 +``` + +```text ++------------+-----------+-----------+------+------------+ +| name_first | name_last | maxPoints | rank | date | ++------------+-----------+-----------+------+------------+ +| Novak | Djokovic | 16950 | 1 | 2016-06-06 | +| Rafael | Nadal | 15390 | 1 | 2009-04-20 | +| Andy | Murray | 12685 | 1 | 2016-11-21 | +| Roger | Federer | 12315 | 1 | 2012-10-29 | +| Daniil | Medvedev | 10780 | 2 | 2021-09-13 | +| Carlos | Alcaraz | 9815 | 1 | 2023-08-21 | +| Dominic | Thiem | 9125 | 3 | 2021-01-18 | +| Jannik | Sinner | 8860 | 2 | 2024-05-06 | +| Stefanos | Tsitsipas | 8350 | 3 | 2021-09-20 | +| Alexander | Zverev | 8240 | 4 | 2021-08-23 | ++------------+-----------+-----------+------+------------+ +``` + +このリストにある選手の中には、非常に多くのポイントを獲得しながらも1位にならなかった選手がいるのが興味深いです。 + +## クエリの保存 + +クエリは`%%sql`マジックの同じ行で`--save`パラメータを使用して保存できます。 +`--no-execute`パラメータにより、クエリの実行はスキップされます。 + +```python +%%sql --save best_points --no-execute +SELECT name_first, name_last, + max(points) as maxPoints, + argMax(rank, points) as rank, + argMax(ranking_date, points) as date +FROM atp.players +JOIN atp.rankings ON rankings.player = players.player_id +GROUP BY ALL +ORDER BY maxPoints DESC +``` + +保存されたクエリを実行すると、実行前に共通テーブル式(CTE)に変換されます。 +次のクエリでは、1位にランクインしたときにプレーヤーが達成した最大ポイントを計算します: + +```python +%sql select * FROM best_points WHERE rank=1 +``` + +```text ++-------------+-----------+-----------+------+------------+ +| name_first | name_last | maxPoints | rank | date | ++-------------+-----------+-----------+------+------------+ +| Novak | Djokovic | 16950 | 1 | 2016-06-06 | +| Rafael | Nadal | 15390 | 1 | 2009-04-20 | +| Andy | Murray | 12685 | 1 | 2016-11-21 | +| Roger | Federer | 12315 | 1 | 2012-10-29 | +| Carlos | Alcaraz | 9815 | 1 | 2023-08-21 | +| Pete | Sampras | 5792 | 1 | 1997-08-11 | +| Andre | Agassi | 5652 | 1 | 1995-08-21 | +| Lleyton | Hewitt | 5205 | 1 | 2002-08-12 | +| Gustavo | Kuerten | 4750 | 1 | 2001-09-10 | +| Juan Carlos | Ferrero | 4570 | 1 | 2003-10-20 | +| Stefan | Edberg | 3997 | 1 | 1991-02-25 | +| Jim | Courier | 3973 | 1 | 1993-08-23 | +| Ivan | Lendl | 3420 | 1 | 1990-02-26 | +| Ilie | Nastase | 0 | 1 | 1973-08-27 | ++-------------+-----------+-----------+------+------------+ +``` + +## パラメータを使用したクエリ + +クエリ内でパラメータを使用することもできます。 +パラメータは通常の変数です: + +```python +rank = 10 +``` + +次に`{{variable}}`構文をクエリ内で使用できます。 +以下のクエリでは、プレーヤーがトップ10にランクインした初日と最終日との間の日数が最短のプレーヤーを見つけます: + +```python +%%sql +SELECT name_first, name_last, + MIN(ranking_date) AS earliest_date, + MAX(ranking_date) AS most_recent_date, + most_recent_date - earliest_date AS days, + 1 + (days/7) AS weeks +FROM atp.rankings +JOIN atp.players ON players.player_id = rankings.player +WHERE rank <= {{rank}} +GROUP BY ALL +ORDER BY days +LIMIT 10 +``` + +```text ++------------+-----------+---------------+------------------+------+-------+ +| name_first | name_last | earliest_date | most_recent_date | days | weeks | ++------------+-----------+---------------+------------------+------+-------+ +| Alex | Metreveli | 1974-06-03 | 1974-06-03 | 0 | 1 | +| Mikael | Pernfors | 1986-09-22 | 1986-09-22 | 0 | 1 | +| Felix | Mantilla | 1998-06-08 | 1998-06-08 | 0 | 1 | +| Wojtek | Fibak | 1977-07-25 | 1977-07-25 | 0 | 1 | +| Thierry | Tulasne | 1986-08-04 | 1986-08-04 | 0 | 1 | +| Lucas | Pouille | 2018-03-19 | 2018-03-19 | 0 | 1 | +| John | Alexander | 1975-12-15 | 1975-12-15 | 0 | 1 | +| Nicolas | Massu | 2004-09-13 | 2004-09-20 | 7 | 2 | +| Arnaud | Clement | 2001-04-02 | 2001-04-09 | 7 | 2 | +| Ernests | Gulbis | 2014-06-09 | 2014-06-23 | 14 | 3 | ++------------+-----------+---------------+------------------+------+-------+ +``` + +## ヒストグラムのプロット + +JupySQLには限定的なチャート機能もあります。 +ボックスプロットやヒストグラムを作成できます。 + +ここでは、100位以内にランクインしたそれぞれのレンキングを達成した選手の数をカウントするヒストグラムを作成しますが、その前にプレーヤーが達成したランクを計算するクエリを書いて保存しましょう: + +```python +%%sql --save players_per_rank --no-execute +select distinct player, rank +FROM atp.rankings +WHERE rank <= 100 +``` + +次に、次の手順でヒストグラムを作成できます: + +```python +from sql.ggplot import ggplot, geom_histogram, aes + +plot = ( + ggplot( + table="players_per_rank", + with_="players_per_rank", + mapping=aes(x="rank", fill="#69f0ae", color="#fff"), + ) + geom_histogram(bins=100) +) +``` + +Self-managed ClickHouseからの移行 diff --git a/docs/ja/chdb/guides/query-remote-clickhouse.md b/docs/ja/chdb/guides/query-remote-clickhouse.md new file mode 100644 index 00000000000..7e95ce025fb --- /dev/null +++ b/docs/ja/chdb/guides/query-remote-clickhouse.md @@ -0,0 +1,186 @@ +--- +title: リモートClickHouseサーバーへのクエリ方法 +sidebar_label: リモートClickHouseへのクエリ +slug: /ja/chdb/guides/query-remote-clickhouse +description: このガイドでは、chDBからリモートClickHouseサーバーにクエリを実行する方法を学習します。 +keywords: [chdb, clickhouse] +--- + +このガイドでは、chDBからリモートClickHouseサーバーにクエリを実行する方法を学習します。 + +## セットアップ + +まず仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。 +バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次にpandasとipythonをインストールします: + +```bash +pip install pandas ipython +``` + +このガイドの残りの部分でコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +また、このコードをPythonスクリプトやお好みのノートブックで使用することもできます。 + +## ClickPyの紹介 + +これからクエリを実行するリモートClickHouseサーバーは[ClickPy](https://clickpy.clickhouse.com)です。 +ClickPyはPyPiパッケージのダウンロード数を追跡し、UIを通じてパッケージの統計情報を探ることができます。基礎となるデータベースは`play`ユーザーを使用してクエリを実行できます。 + +ClickPyの詳細は[そのGitHubリポジトリ](https://github.com/ClickHouse/clickpy)で確認できます。 + +## ClickPy ClickHouseサービスへのクエリ + +chDBをインポートしましょう: + +```python +import chdb +``` + +`remoteSecure`関数を使用してClickPyにクエリを実行します。この関数には少なくともホスト名、テーブル名、ユーザー名が必要です。 + +[`openai`パッケージ](https://clickpy.clickhouse.com/dashboard/openai)の1日ごとのダウンロード数をPandas DataFrameとして取得するためのクエリは以下の通りです: + +```python +query = """ +SELECT + toStartOfDay(date)::Date32 AS x, + sum(count) AS y +FROM remoteSecure( + 'clickpy-clickhouse.clickhouse.com', + 'pypi.pypi_downloads_per_day', + 'play' +) +WHERE project = 'openai' +GROUP BY x +ORDER BY x ASC +""" + +openai_df = chdb.query(query, "DataFrame") +openai_df.sort_values(by=["x"], ascending=False).head(n=10) +``` + +```text + x y +2392 2024-10-02 1793502 +2391 2024-10-01 1924901 +2390 2024-09-30 1749045 +2389 2024-09-29 1177131 +2388 2024-09-28 1157323 +2387 2024-09-27 1688094 +2386 2024-09-26 1862712 +2385 2024-09-25 2032923 +2384 2024-09-24 1901965 +2383 2024-09-23 1777554 +``` + +次に[`scikit-learn`](https://clickpy.clickhouse.com/dashboard/scikit-learn)のダウンロード数を取得するために同じことを行ってみましょう: + +```python +query = """ +SELECT + toStartOfDay(date)::Date32 AS x, + sum(count) AS y +FROM remoteSecure( + 'clickpy-clickhouse.clickhouse.com', + 'pypi.pypi_downloads_per_day', + 'play' +) +WHERE project = 'scikit-learn' +GROUP BY x +ORDER BY x ASC +""" + +sklearn_df = chdb.query(query, "DataFrame") +sklearn_df.sort_values(by=["x"], ascending=False).head(n=10) +``` + +```text + x y +2392 2024-10-02 1793502 +2391 2024-10-01 1924901 +2390 2024-09-30 1749045 +2389 2024-09-29 1177131 +2388 2024-09-28 1157323 +2387 2024-09-27 1688094 +2386 2024-09-26 1862712 +2385 2024-09-25 2032923 +2384 2024-09-24 1901965 +2383 2024-09-23 1777554 +``` + +## Pandas DataFrameのマージ + +現在、2つのDataFrameを持っています。これを日付(`x`カラム)を基にしてマージすることができます: + +```python +df = openai_df.merge( + sklearn_df, + on="x", + suffixes=("_openai", "_sklearn") +) +df.head(n=5) +``` + +```text + x y_openai y_sklearn +0 2018-02-26 83 33971 +1 2018-02-27 31 25211 +2 2018-02-28 8 26023 +3 2018-03-01 8 20912 +4 2018-03-02 5 23842 +``` + +次に、このようにしてOpenAIのダウンロード数とscikit-learnのダウンロード数の比率を計算することができます: + +```python +df['ratio'] = df['y_openai'] / df['y_sklearn'] +df.head(n=5) +``` + +```text + x y_openai y_sklearn ratio +0 2018-02-26 83 33971 0.002443 +1 2018-02-27 31 25211 0.001230 +2 2018-02-28 8 26023 0.000307 +3 2018-03-01 8 20912 0.000383 +4 2018-03-02 5 23842 0.000210 +``` + +## Pandas DataFrameのクエリ + +次に、最も良い比率と最悪の比率の日付を探したいとします。 +chDBに戻ってこれらの値を計算します: + +```python +chdb.query(""" +SELECT max(ratio) AS bestRatio, + argMax(x, ratio) AS bestDate, + min(ratio) AS worstRatio, + argMin(x, ratio) AS worstDate +FROM Python(df) +""", "DataFrame") +``` + +```text + bestRatio bestDate worstRatio worstDate +0 0.693855 2024-09-19 0.000003 2020-02-09 +``` + +Pandas DataFrameへのクエリについてさらに学びたい場合は、[Pandas DataFrames 開発者ガイド](querying-pandas.md)をご覧ください。 diff --git a/docs/ja/chdb/guides/querying-apache-arrow.md b/docs/ja/chdb/guides/querying-apache-arrow.md new file mode 100644 index 00000000000..af3e1f0a6e0 --- /dev/null +++ b/docs/ja/chdb/guides/querying-apache-arrow.md @@ -0,0 +1,169 @@ +--- +title: chDBでApache Arrowをクエリする方法 +sidebar_label: Apache Arrowをクエリする +slug: /ja/chdb/guides/apache-arrow +description: このガイドでは、chDBを使用してApache Arrowテーブルをクエリする方法を学びます。 +keywords: [chdb, apache-arrow] +--- + +[Apache Arrow](https://arrow.apache.org/) は、データコミュニティで人気を博している標準化された列指向メモリフォーマットです。このガイドでは、`Python`テーブル関数を使用してApache Arrowをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成します: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、pyarrow、pandas、ipythonをインストールします: + +```bash +pip install pyarrow pandas ipython +``` + +この後のガイドで使用するコマンドを実行するために、`ipython`を使用します。起動するには以下を実行してください: + +```bash +ipython +``` + +また、Pythonスクリプトや好きなノートブックでもコードを使用できます。 + +## ファイルからApache Arrowテーブルを作成する + +まず、[AWS CLIツール](https://aws.amazon.com/cli/)を使用して、[Ooklaデータセット](https://github.com/teamookla/ookla-open-data)のParquetファイルの1つをダウンロードします: + +```bash +aws s3 cp \ + --no-sign \ + s3://ookla-open-data/parquet/performance/type=mobile/year=2023/quarter=2/2023-04-01_performance_mobile_tiles.parquet . +``` + +:::note +ファイルをもっとダウンロードしたい場合は、`aws s3 ls`を使ってすべてのファイルのリストを取得し、上記のコマンドを更新してください。 +::: + +次に、pyarrowパッケージからParquetモジュールをインポートします: + +```python +import pyarrow.parquet as pq +``` + +そして、ParquetファイルをApache Arrowテーブルに読み込むことができます: + +```python +arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet") +``` + +スキーマは以下の通りです: + +```python +arrow_table.schema +``` + +```text +quadkey: string +tile: string +tile_x: double +tile_y: double +avg_d_kbps: int64 +avg_u_kbps: int64 +avg_lat_ms: int64 +avg_lat_down_ms: int32 +avg_lat_up_ms: int32 +tests: int64 +devices: int64 +``` + +`shape`属性を呼び出すことで行とカラムの数を取得できます: + +```python +arrow_table.shape +``` + +```text +(3864546, 11) +``` + +## Apache Arrowをクエリする + +次に、chDBからArrowテーブルをクエリしましょう。まず、chDBをインポートします: + +```python +import chdb +``` + +そして、テーブルを記述します: + +```python +chdb.query(""" +DESCRIBE Python(arrow_table) +SETTINGS describe_compact_output=1 +""", "DataFrame") +``` + +```text + name type +0 quadkey String +1 tile String +2 tile_x Float64 +3 tile_y Float64 +4 avg_d_kbps Int64 +5 avg_u_kbps Int64 +6 avg_lat_ms Int64 +7 avg_lat_down_ms Int32 +8 avg_lat_up_ms Int32 +9 tests Int64 +10 devices Int64 +``` + +行の数もカウントできます: + +```python +chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame") +``` + +```text + count() +0 3864546 +``` + +では、もう少し興味深いことをしましょう。以下のクエリは、`quadkey`および`tile.*`カラムを除外し、残りのすべてのカラムの平均と最大値を計算します: + +```python +chdb.query(""" +WITH numericColumns AS ( + SELECT * EXCEPT ('tile.*') EXCEPT(quadkey) + FROM Python(arrow_table) +) +SELECT * APPLY(max), * APPLY(avg) APPLY(x -> round(x, 2)) +FROM numericColumns +""", "Vertical") +``` + +```text +Row 1: +────── +max(avg_d_kbps): 4155282 +max(avg_u_kbps): 1036628 +max(avg_lat_ms): 2911 +max(avg_lat_down_ms): 2146959360 +max(avg_lat_up_ms): 2146959360 +max(tests): 111266 +max(devices): 1226 +round(avg(avg_d_kbps), 2): 84393.52 +round(avg(avg_u_kbps), 2): 15540.4 +round(avg(avg_lat_ms), 2): 41.25 +round(avg(avg_lat_down_ms), 2): 554355225.76 +round(avg(avg_lat_up_ms), 2): 552843178.3 +round(avg(tests), 2): 6.31 +round(avg(devices), 2): 2.88 +``` diff --git a/docs/ja/chdb/guides/querying-pandas.md b/docs/ja/chdb/guides/querying-pandas.md new file mode 100644 index 00000000000..60d6cf3ce2a --- /dev/null +++ b/docs/ja/chdb/guides/querying-pandas.md @@ -0,0 +1,398 @@ +--- +title: chDBでPandas DataFrameをクエリする方法 +sidebar_label: Pandasへのクエリ +slug: /ja/chdb/guides/pandas +description: chDBでPandas DataFrameをクエリする方法を学びます +keywords: [chdb, pandas] +--- + +[Pandas](https://pandas.pydata.org/)は、Pythonでのデータ操作と分析のための人気のあるライブラリです。 +chDBのバージョン2では、Pandas DataFrameへのクエリのパフォーマンスを向上し、新しい`Python`テーブル関数を導入しました。 +このガイドでは、`Python`テーブル関数を使用してPandasをクエリする方法を学びます。 + +## セットアップ + +まずは仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。バージョン2.0.2以上が必要です: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、Pandasとその他のライブラリをインストールします: + +```bash +pip install pandas requests ipython +``` + +このガイドで使用するコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +または、Pythonスクリプトやお気に入りのノートブックでコードを使用できます。 + +## URLからPandas DataFrameを作成する + +[StatsBomb GitHubリポジトリ](https://github.com/statsbomb/open-data/tree/master?tab=readme-ov-file)からデータをクエリします。 +まずはrequestsとpandasをインポートします: + +```python +import requests +import pandas as pd +``` + +次に、ある試合のJSONファイルをDataFrameにロードします: + +```python +response = requests.get( + "https://raw.githubusercontent.com/statsbomb/open-data/master/data/matches/223/282.json" +) +matches_df = pd.json_normalize(response.json(), sep='_') +``` + +扱うデータを確認しましょう: + +```python +matches_df.iloc[0] +``` + +```text +match_id 3943077 +match_date 2024-07-15 +kick_off 04:15:00.000 +home_score 1 +away_score 0 +match_status available +match_status_360 unscheduled +last_updated 2024-07-15T15:50:08.671355 +last_updated_360 None +match_week 6 +competition_competition_id 223 +competition_country_name South America +competition_competition_name Copa America +season_season_id 282 +season_season_name 2024 +home_team_home_team_id 779 +home_team_home_team_name Argentina +home_team_home_team_gender male +home_team_home_team_group None +home_team_country_id 11 +home_team_country_name Argentina +home_team_managers [{'id': 5677, 'name': 'Lionel Sebastián Scalon... +away_team_away_team_id 769 +away_team_away_team_name Colombia +away_team_away_team_gender male +away_team_away_team_group None +away_team_country_id 49 +away_team_country_name Colombia +away_team_managers [{'id': 5905, 'name': 'Néstor Gabriel Lorenzo'... +metadata_data_version 1.1.0 +metadata_shot_fidelity_version 2 +metadata_xy_fidelity_version 2 +competition_stage_id 26 +competition_stage_name Final +stadium_id 5337 +stadium_name Hard Rock Stadium +stadium_country_id 241 +stadium_country_name United States of America +referee_id 2638 +referee_name Raphael Claus +referee_country_id 31 +referee_country_name Brazil +Name: 0, dtype: object +``` + +次に、もう一つのイベントJSONファイルをロードし、そのDataFrameに`match_id`カラムを追加します: + +```python +response = requests.get( + "https://raw.githubusercontent.com/statsbomb/open-data/master/data/events/3943077.json" +) +events_df = pd.json_normalize(response.json(), sep='_') +events_df["match_id"] = 3943077 +``` + +そして、最初の行を確認しましょう: + +```python +with pd.option_context("display.max_rows", None): + first_row = events_df.iloc[0] + non_nan_columns = first_row[first_row.notna()].T + display(non_nan_columns) +``` + +```text +id 279b7d66-92b5-4daa-8ff6-cba8fce271d9 +index 1 +period 1 +timestamp 00:00:00.000 +minute 0 +second 0 +possession 1 +duration 0.0 +type_id 35 +type_name Starting XI +possession_team_id 779 +possession_team_name Argentina +play_pattern_id 1 +play_pattern_name Regular Play +team_id 779 +team_name Argentina +tactics_formation 442.0 +tactics_lineup [{'player': {'id': 6909, 'name': 'Damián Emili... +match_id 3943077 +Name: 0, dtype: object +``` + +## Pandas DataFrameへのクエリ + +次に、chDBを使ってこれらのDataFrameにクエリを実行する方法を見てみましょう。 +ライブラリをインポートします: + +```python +import chdb +``` + +`Python`テーブル関数を使用してPandas DataFrameにクエリを実行できます: + +```sql +SELECT * +FROM Python() +``` + +したがって、`matches_df`のカラムを列挙する場合は、以下のように記述できます: + +```python +chdb.query(""" +DESCRIBE Python(matches_df) +SETTINGS describe_compact_output=1 +""", "DataFrame") +``` + +```text + name type +0 match_id Int64 +1 match_date String +2 kick_off String +3 home_score Int64 +4 away_score Int64 +5 match_status String +6 match_status_360 String +7 last_updated String +8 last_updated_360 String +9 match_week Int64 +10 competition_competition_id Int64 +11 competition_country_name String +12 competition_competition_name String +13 season_season_id Int64 +14 season_season_name String +15 home_team_home_team_id Int64 +16 home_team_home_team_name String +17 home_team_home_team_gender String +18 home_team_home_team_group String +19 home_team_country_id Int64 +20 home_team_country_name String +21 home_team_managers String +22 away_team_away_team_id Int64 +23 away_team_away_team_name String +24 away_team_away_team_gender String +25 away_team_away_team_group String +26 away_team_country_id Int64 +27 away_team_country_name String +28 away_team_managers String +29 metadata_data_version String +30 metadata_shot_fidelity_version String +31 metadata_xy_fidelity_version String +32 competition_stage_id Int64 +33 competition_stage_name String +34 stadium_id Int64 +35 stadium_name String +36 stadium_country_id Int64 +37 stadium_country_name String +38 referee_id Int64 +39 referee_name String +40 referee_country_id Int64 +41 referee_country_name String +``` + +次に、どの審判が2回以上の試合を担当したかを確認するために、次のクエリを記述できます: + +```python +chdb.query(""" +SELECT referee_name, count() AS count +FROM Python(matches_df) +GROUP BY ALL +HAVING count > 1 +ORDER BY count DESC +""", "DataFrame") +``` + +```text + referee_name count +0 César Arturo Ramos Palazuelos 3 +1 Maurizio Mariani 3 +2 Piero Maza Gomez 3 +3 Mario Alberto Escobar Toca 2 +4 Wilmar Alexander Roldán Pérez 2 +5 Jesús Valenzuela Sáez 2 +6 Wilton Pereira Sampaio 2 +7 Darío Herrera 2 +8 Andrés Matonte 2 +9 Raphael Claus 2 +``` + +次に、`events_df`を探索しましょう。 + +```python +chdb.query(""" +SELECT pass_recipient_name, count() +FROM Python(events_df) +WHERE type_name = 'Pass' AND pass_recipient_name <> '' +GROUP BY ALL +ORDER BY count() DESC +LIMIT 10 +""", "DataFrame") +``` + +```text + pass_recipient_name count() +0 Davinson Sánchez Mina 76 +1 Ángel Fabián Di María Hernández 64 +2 Alexis Mac Allister 62 +3 Enzo Fernandez 57 +4 James David Rodríguez Rubio 56 +5 Johan Andrés Mojica Palacio 55 +6 Rodrigo Javier De Paul 54 +7 Jefferson Andrés Lerma Solís 53 +8 Jhon Adolfo Arias Andrade 52 +9 Carlos Eccehomo Cuesta Figueroa 50 +``` + +## Pandas DataFrameの結合 + +また、クエリ内でDataFrameを結合することもできます。 +例えば、試合の概要を取得するために次のクエリを書くことができます: + +```python +chdb.query(""" +SELECT home_team_home_team_name, away_team_away_team_name, home_score, away_score, + countIf(type_name = 'Pass' AND possession_team_id=home_team_home_team_id) AS home_passes, + countIf(type_name = 'Pass' AND possession_team_id=away_team_away_team_id) AS away_passes, + countIf(type_name = 'Shot' AND possession_team_id=home_team_home_team_id) AS home_shots, + countIf(type_name = 'Shot' AND possession_team_id=away_team_away_team_id) AS away_shots +FROM Python(matches_df) AS matches +JOIN Python(events_df) AS events ON events.match_id = matches.match_id +GROUP BY ALL +LIMIT 5 +""", "DataFrame").iloc[0] +``` + +```text +home_team_home_team_name Argentina +away_team_away_team_name Colombia +home_score 1 +away_score 0 +home_passes 527 +away_passes 669 +home_shots 11 +away_shots 19 +Name: 0, dtype: object +``` + +## DataFrameからテーブルへのデータの投入 + +また、DataFrameからClickHouseのテーブルを作成し、データを投入することもできます。 +chDBでテーブルを作成する場合、Stateful Session APIを使用する必要があります。 + +セッションモジュールをインポートしましょう: + +```python +from chdb import session as chs +``` + +セッションを初期化します: + +``` +sess = chs.Session() +``` + +次に、データベースを作成します: + +```python +sess.query("CREATE DATABASE statsbomb") +``` + +続いて、`events_df`に基づいて`events`テーブルを作成します: + +```python +sess.query(""" +CREATE TABLE statsbomb.events ORDER BY id AS +SELECT * +FROM Python(events_df) +""") +``` + +最も多くのパスを受けた選手を返すクエリを実行できます: + +```python +sess.query(""" +SELECT pass_recipient_name, count() +FROM statsbomb.events +WHERE type_name = 'Pass' AND pass_recipient_name <> '' +GROUP BY ALL +ORDER BY count() DESC +LIMIT 10 +""", "DataFrame") +``` + +```text + pass_recipient_name count() +0 Davinson Sánchez Mina 76 +1 Ángel Fabián Di María Hernández 64 +2 Alexis Mac Allister 62 +3 Enzo Fernandez 57 +4 James David Rodríguez Rubio 56 +5 Johan Andrés Mojica Palacio 55 +6 Rodrigo Javier De Paul 54 +7 Jefferson Andrés Lerma Solís 53 +8 Jhon Adolfo Arias Andrade 52 +9 Carlos Eccehomo Cuesta Figueroa 50 +``` + +## Pandas DataFrameとテーブルの結合 + +最後に、`matches_df` DataFrameと`statsbomb.events`テーブルを結合するために、結合クエリを更新することもできます: + +```python +sess.query(""" +SELECT home_team_home_team_name, away_team_away_team_name, home_score, away_score, + countIf(type_name = 'Pass' AND possession_team_id=home_team_home_team_id) AS home_passes, + countIf(type_name = 'Pass' AND possession_team_id=away_team_away_team_id) AS away_passes, + countIf(type_name = 'Shot' AND possession_team_id=home_team_home_team_id) AS home_shots, + countIf(type_name = 'Shot' AND possession_team_id=away_team_away_team_id) AS away_shots +FROM Python(matches_df) AS matches +JOIN statsbomb.events AS events ON events.match_id = matches.match_id +GROUP BY ALL +LIMIT 5 +""", "DataFrame").iloc[0] +``` + +```text +home_team_home_team_name Argentina +away_team_away_team_name Colombia +home_score 1 +away_score 0 +home_passes 527 +away_passes 669 +home_shots 11 +away_shots 19 +Name: 0, dtype: object +``` diff --git a/docs/ja/chdb/guides/querying-parquet.md b/docs/ja/chdb/guides/querying-parquet.md new file mode 100644 index 00000000000..3ab1f8abaf6 --- /dev/null +++ b/docs/ja/chdb/guides/querying-parquet.md @@ -0,0 +1,171 @@ +--- +title: Parquetファイルをクエリする方法 +sidebar_label: Parquetファイルのクエリ +slug: /ja/chdb/guides/querying-parquet +description: chDBを使用してParquetファイルをクエリする方法を学びます。 +keywords: [chdb, parquet] +--- + +世界中のデータの多くはAmazon S3バケットに存在しています。このガイドでは、chDBを使用してそのデータをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、iPythonをインストールします: + +```bash +pip install ipython +``` + +`ipython`を使用してこのガイドのコマンドを実行します。起動するには以下を実行します: + +```bash +ipython +``` + +また、Pythonスクリプトやお好みのノートブックでコードを使用することもできます。 + +## Parquetメタデータの探索 + +これから、[Amazonレビュー](/docs/ja/getting-started/example-datasets/amazon-reviews)データセットのParquetファイルを探索します。まず、`chDB`をインストールしましょう: + +```python +import chdb +``` + +Parquetファイルをクエリする際に、[`ParquetMetadata`](/docs/ja/interfaces/formats#parquetmetadata-data-format-parquet-metadata)入力フォーマットを使用して、ファイルの内容ではなくParquetメタデータを返すことができます。このフォーマットを使用する際に返されるフィールドを`DESCRIBE`句を使って確認しましょう: + +```python +query = """ +DESCRIBE s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata +) +SETTINGS describe_compact_output=1 +""" + +chdb.query(query, 'TabSeparated') +``` + +```text +num_columns UInt64 +num_rows UInt64 +num_row_groups UInt64 +format_version String +metadata_size UInt64 +total_uncompressed_size UInt64 +total_compressed_size UInt64 +columns Array(Tuple(name String, path String, max_definition_level UInt64, max_repetition_level UInt64, physical_type String, logical_type String, compression String, total_uncompressed_size UInt64, total_compressed_size UInt64, space_saved String, encodings Array(String))) +row_groups Array(Tuple(num_columns UInt64, num_rows UInt64, total_uncompressed_size UInt64, total_compressed_size UInt64, columns Array(Tuple(name String, path String, total_compressed_size UInt64, total_uncompressed_size UInt64, have_statistics Bool, statistics Tuple(num_values Nullable(UInt64), null_count Nullable(UInt64), distinct_count Nullable(UInt64), min Nullable(String), max Nullable(String)))))) +``` + +現在、このファイルのメタデータを見てみましょう。`columns`と`row_groups`は多くのプロパティを含むタプルの配列なので、今回はそれらを除外します。 + +```python +query = """ +SELECT * EXCEPT(columns, row_groups) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata +) +""" + +chdb.query(query, 'Vertical') +``` + +```text +Row 1: +────── +num_columns: 15 +num_rows: 41905631 +num_row_groups: 42 +format_version: 2.6 +metadata_size: 79730 +total_uncompressed_size: 14615827169 +total_compressed_size: 9272262304 +``` + +この出力から、このParquetファイルには40百万行以上の行があり、42の行グループに分割され、各行に15のカラムが含まれていることがわかります。行グループはデータを論理的に水平に分割したものです。各行グループには関連するメタデータがあり、クエリツールはそのメタデータを使用してファイルを効率的にクエリできます。 + +行グループの1つを見てみましょう: + +```python +query = """ +WITH rowGroups AS ( + SELECT rg + FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata + ) + ARRAY JOIN row_groups AS rg + LIMIT 1 +) +SELECT tupleElement(c, 'name') AS name, tupleElement(c, 'total_compressed_size') AS total_compressed_size, + tupleElement(c, 'total_uncompressed_size') AS total_uncompressed_size, + tupleElement(tupleElement(c, 'statistics'), 'min') AS min, + tupleElement(tupleElement(c, 'statistics'), 'max') AS max +FROM rowGroups +ARRAY JOIN tupleElement(rg, 'columns') AS c +""" + +chdb.query(query, 'DataFrame') +``` + +```text + name total_compressed_size total_uncompressed_size min max +0 review_date 493 646 16455 16472 +1 marketplace 66 64 US US +2 customer_id 5207967 7997207 10049 53096413 +3 review_id 14748425 17991290 R10004U8OQDOGE RZZZUTBAV1RYI +4 product_id 8003456 13969668 0000032050 BT00DDVMVQ +5 product_parent 5758251 7974737 645 999999730 +6 product_title 41068525 63355320 ! Small S 1pc Black 1pc Navy (Blue) Replacemen... 🌴 Vacation On The Beach +7 product_category 1726 1815 Apparel Pet Products +8 star_rating 369036 374046 1 5 +9 helpful_votes 538940 1022990 0 3440 +10 total_votes 610902 1080520 0 3619 +11 vine 11426 125999 0 1 +12 verified_purchase 102634 125999 0 1 +13 review_headline 16538189 27634740 🤹🏽‍♂️🎤Great product. Practice makes perfect. D... +14 review_body 145886383 232457911 🚅 +🐧=💥 😀 +``` + +## Parquetファイルのクエリ + +次に、ファイルの内容をクエリします。上記のクエリを調整して、`ParquetMetadata`を削除し、すべてのレビューで最も人気のある`star_rating`を計算してみましょう: + +```python +query = """ +SELECT star_rating, count() AS count, formatReadableQuantity(count) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet' +) +GROUP BY ALL +ORDER BY star_rating +""" + +chdb.query(query, 'DataFrame') +``` + +```text + star_rating count formatReadableQuantity(count()) +0 1 3253070 3.25 million +1 2 1865322 1.87 million +2 3 3130345 3.13 million +3 4 6578230 6.58 million +4 5 27078664 27.08 million +``` + +興味深いことに、5つ星レビューは他のすべての評価を合わせたものよりも多いことがわかります。Amazonの商品が好まれているように見えますが、もし気に入らない場合は評価を付けないことが多いようです。 diff --git a/docs/ja/chdb/guides/querying-s3-bucket.md b/docs/ja/chdb/guides/querying-s3-bucket.md new file mode 100644 index 00000000000..43bb53b1ab6 --- /dev/null +++ b/docs/ja/chdb/guides/querying-s3-bucket.md @@ -0,0 +1,192 @@ +--- +title: S3バケット内のデータをクエリする方法 +sidebar_label: S3でのクエリ +slug: /ja/chdb/guides/querying-s3 +description: chDBを使用してS3バケット内のデータをクエリする方法を学びます。 +keywords: [chdb, s3] +--- + +世界中の多くのデータはAmazon S3バケットに保存されています。 このガイドでは、chDBを使用してそのデータをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。 バージョン2.0.2以上を確実に使用してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、iPythonをインストールします: + +```bash +pip install ipython +``` + +このガイドの残りのコマンドを実行するために`ipython`を使用します。起動するには次のコマンドを実行します: + +```bash +ipython +``` + +また、Pythonスクリプトやお好みのノートブックでもコードを使用できます。 + +## S3バケット内のファイルを一覧表示 + +まずはじめに、[Amazonレビューを含むS3バケット](/docs/ja/getting-started/example-datasets/amazon-reviews)内のすべてのファイルを一覧表示しましょう。 これを行うために、[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用し、ファイルへのパスまたは一連のファイルへのワイルドカードを渡します。 + +:::tip +バケット名のみを渡すと例外が発生します。 +::: + +また、ファイルが解析されず、ファイルごとに一行のみが返され、`_file`バーチャルカラムと`_path`バーチャルカラム経由でファイルとパスにアクセスできるようにするために、[`One`](/docs/ja/interfaces/formats#data-format-one)入力フォーマットを使用します。 + +```python +import chdb + +chdb.query(""" +SELECT + _file, + _path +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One) +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +```text +┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐ +│ amazon_reviews_2010.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet │ +│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │ +│ amazon_reviews_2013.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet │ +│ amazon_reviews_2015.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet │ +│ amazon_reviews_2014.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet │ +│ amazon_reviews_2012.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet │ +│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │ +│ amazon_reviews_2011.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet │ +└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘ +``` + +このバケットにはParquetファイルのみが含まれています。 + +## S3バケット内のファイルのクエリ + +次に、これらのファイルにクエリを実行する方法を学びましょう。 各ファイルの行数をカウントしたい場合は、次のクエリを実行できます: + +```python +chdb.query(""" +SELECT + _file, + count() AS count, + formatReadableQuantity(count) AS readableCount +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet') +GROUP BY ALL +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +```text +┌─_file───────────────────────────────┬────count─┬─readableCount───┐ +│ amazon_reviews_2013.snappy.parquet │ 28034255 │ 28.03 million │ +│ amazon_reviews_1990s.snappy.parquet │ 639532 │ 639.53 thousand │ +│ amazon_reviews_2011.snappy.parquet │ 6112495 │ 6.11 million │ +│ amazon_reviews_2015.snappy.parquet │ 41905631 │ 41.91 million │ +│ amazon_reviews_2012.snappy.parquet │ 11541011 │ 11.54 million │ +│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million │ +│ amazon_reviews_2014.snappy.parquet │ 44127569 │ 44.13 million │ +│ amazon_reviews_2010.snappy.parquet │ 3868472 │ 3.87 million │ +└─────────────────────────────────────┴──────────┴─────────────────┘ +``` + +また、S3バケットのHTTP URIを渡すことでも同じ結果を得ることができます: + +```python +chdb.query(""" +SELECT + _file, + count() AS count, + formatReadableQuantity(count) AS readableCount +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet') +GROUP BY ALL +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +では、`DESCRIBE`句を使用してこれらのParquetファイルのスキーマを見てみましょう: + +```python +chdb.query(""" +DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet') +SETTINGS describe_compact_output=1 +""", 'PrettyCompact') +``` + +```text + ┌─name──────────────┬─type─────────────┐ + 1. │ review_date │ Nullable(UInt16) │ + 2. │ marketplace │ Nullable(String) │ + 3. │ customer_id │ Nullable(UInt64) │ + 4. │ review_id │ Nullable(String) │ + 5. │ product_id │ Nullable(String) │ + 6. │ product_parent │ Nullable(UInt64) │ + 7. │ product_title │ Nullable(String) │ + 8. │ product_category │ Nullable(String) │ + 9. │ star_rating │ Nullable(UInt8) │ +10. │ helpful_votes │ Nullable(UInt32) │ +11. │ total_votes │ Nullable(UInt32) │ +12. │ vine │ Nullable(Bool) │ +13. │ verified_purchase │ Nullable(Bool) │ +14. │ review_headline │ Nullable(String) │ +15. │ review_body │ Nullable(String) │ + └───────────────────┴──────────────────┘ +``` + +次に、レビューの数に基づいてトップの製品カテゴリーを計算し、平均の星評価も計算してみましょう: + +```python +chdb.query(""" +SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet') +GROUP BY ALL +LIMIT 10 +""", 'PrettyCompact') +``` + +```text + ┌─product_category─┬──reviews─┬──avg─┐ + 1. │ Toys │ 4864056 │ 4.21 │ + 2. │ Apparel │ 5906085 │ 4.11 │ + 3. │ Luggage │ 348644 │ 4.22 │ + 4. │ Kitchen │ 4880297 │ 4.21 │ + 5. │ Books │ 19530930 │ 4.34 │ + 6. │ Outdoors │ 2302327 │ 4.24 │ + 7. │ Video │ 380596 │ 4.19 │ + 8. │ Grocery │ 2402365 │ 4.31 │ + 9. │ Shoes │ 4366757 │ 4.24 │ +10. │ Jewelry │ 1767667 │ 4.14 │ + └──────────────────┴──────────┴──────┘ +``` + +## プライベートなS3バケット内のファイルにクエリする + +プライベートなS3バケット内のファイルにクエリを実行する場合には、アクセスキーとシークレットを渡す必要があります。これらの資格情報を`s3`テーブル関数に渡すことができます: + +```python +chdb.query(""" +SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret') +GROUP BY ALL +LIMIT 10 +""", 'PrettyCompact') +``` + +:::note +このクエリはパブリックバケットなので動作しません! +::: + +別の方法として、[名前付きコレクション](/docs/ja/operations/named-collections)を使用することもできますが、このアプローチはまだchDBでサポートされていません。 diff --git a/docs/ja/chdb/index.md b/docs/ja/chdb/index.md new file mode 100644 index 00000000000..3393b34c594 --- /dev/null +++ b/docs/ja/chdb/index.md @@ -0,0 +1,61 @@ +--- +title: chDB +sidebar_label: Overview +slug: /ja/chdb +description: chDBはClickHouseによって駆動されるインプロセスSQL OLAPエンジンです +keywords: [chdb, embedded, clickhouse-lite, in-process, in process] +--- + +# chDB + +chDBは、[ClickHouse](https://github.com/clickhouse/clickhouse)によって駆動される高速なインプロセスSQL OLAPエンジンです。ClickHouseサーバーに接続することなく、プログラミング言語でClickHouseの力を得たい場合に使用できます。 + +## chDBはどの言語をサポートしていますか? + +chDBは以下の言語バインディングを提供しています: + +* [Python](install/python.md) +* [Go](install/go.md) +* [Rust](install/rust.md) +* [NodeJS](install/nodejs.md) +* [Bun](install/bun.md) + +## どの入力および出力フォーマットがサポートされていますか? + +chDBはParquet、CSV、JSON、Apache Arrow、ORC、[60以上のフォーマット](https://clickhouse.com/docs/ja/interfaces/formats)をサポートしています。 + +## どのように開始しますか? + +* [Go](install/go.md)、[Rust](install/rust.md)、[NodeJS](install/nodejs.md)、または[Bun](install/bun.md)を使用している場合は、対応する言語ページをご覧ください。 +* Pythonを使用している場合は、[開発者向けの開始ガイド](getting-started.md)を参照してください。以下のような一般的なタスクを行うためのガイドも用意されています: + * [JupySQL](guides/jupysql.md) + * [Pandasのクエリ](guides/querying-pandas.md) + * [Apache Arrowへのクエリ](guides/querying-apache-arrow.md) + * [S3内のデータへのクエリ](guides/querying-s3-bucket.md) + * [Parquetファイルへのクエリ](guides/querying-parquet.md) + * [リモートClickHouseへのクエリ](guides/query-remote-clickhouse.md) + * [clickhouse-localデータベースの使用](guides/clickhouse-local.md) + + + +## 紹介ビデオ + +ClickHouseのオリジナル作成者、Alexey MilovidovによるchDBの簡潔なプロジェクト紹介をお聞きください: + +
+ +
+ +## chDBについて + +- [Auxtenのブログ](https://clickhouse.com/blog/chdb-embedded-clickhouse-rocket-engine-on-a-bicycle)でchDBプロジェクト誕生の全過程を読む +- [公式ClickHouseブログ](https://clickhouse.com/blog/welcome-chdb-to-clickhouse)でchDBとその使用事例について読む +- [codapiの例](https://antonz.org/trying-chdb/)を使用してブラウザでchDBを発見する + +## どのライセンスが使用されていますか? + +chDBはApache License, Version 2.0のもとで利用可能です。 diff --git a/docs/ja/chdb/install/bun.md b/docs/ja/chdb/install/bun.md new file mode 100644 index 00000000000..1598e8e08ee --- /dev/null +++ b/docs/ja/chdb/install/bun.md @@ -0,0 +1,55 @@ +--- +title: Installing chDB for Bun +sidebar_label: Bun +slug: /ja/chdb/install/bun +description: How to install chDB for Bun +keywords: [chdb, embedded, clickhouse-lite, bun, install] +--- + +# Bun用のchDBをインストールする + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +参考: [chdb-bun](https://github.com/chdb-io/chdb-bun) + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは [chdb-io/chdb-bun](https://github.com/chdb-io/chdb-bun) にあります。 + +## 使用方法 + +### Query(query, *format) (一時的) + +```javascript +import { query } from 'chdb-bun'; + +// クエリ(一時的) +var result = query("SELECT version()", "CSV"); +console.log(result); // 23.10.1.1 +``` + +### Session.Query(query, *format) + +```javascript +import { Session } from 'chdb-bun'; +const sess = new Session('./chdb-bun-tmp'); + +// セッションでクエリ(永続化) +sess.query("CREATE FUNCTION IF NOT EXISTS hello AS () -> 'Hello chDB'", "CSV"); +var result = sess.query("SELECT hello()", "CSV"); +console.log(result); + +// クリーンアップ前に、データベースファイルを`./chdb-bun-tmp`に見つけることができます + +sess.cleanup(); // セッションをクリーンアップ、これによりデータベースが削除されます +``` + + diff --git a/docs/ja/chdb/install/c.md b/docs/ja/chdb/install/c.md new file mode 100644 index 00000000000..5ef158ac164 --- /dev/null +++ b/docs/ja/chdb/install/c.md @@ -0,0 +1,45 @@ +--- +title: CとC++向けのchDBのインストール +sidebar_label: CとC++ +slug: /ja/chdb/install/c +description: CとC++向けのchDBをインストールする方法 +keywords: [chdb, 組み込み, clickhouse-lite, インストール] +--- + +# CとC++向けのchDBのインストール + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb)をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + + +## 使用方法 + +[libchdb](https://github.com/chdb-io/chdb/blob/main/bindings.md)の手順に従って開始してください。 + +`chdb.h` + +```c +#pragma once +#include +#include + +extern "C" { +struct local_result +{ + char * buf; + size_t len; + void * _vec; // std::vector *の解放用 + double elapsed; + uint64_t rows_read; + uint64_t bytes_read; +}; + +local_result * query_stable(int argc, char ** argv); +void free_result(local_result * result); +} +``` diff --git a/docs/ja/chdb/install/go.md b/docs/ja/chdb/install/go.md new file mode 100644 index 00000000000..e02248aa7f3 --- /dev/null +++ b/docs/ja/chdb/install/go.md @@ -0,0 +1,30 @@ +--- +title: Go 用 chDB のインストール +sidebar_label: Go +slug: /ja/chdb/install/go +description: Go 用 chDB のインストール方法 +keywords: [chdb, embedded, clickhouse-lite, go, install] +--- + +# Go 用 chDB のインストール + +## 必要条件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +参照: [chdb-go](https://github.com/chdb-io/chdb-go) + +## GitHub リポジトリ + +プロジェクトの GitHub リポジトリは [chdb-io/chdb-go](https://github.com/chdb-io/chdb-go) で見つけることができます。 + +## 使用法 + +- API ドキュメント: [高レベル API](https://github.com/chdb-io/chdb-go/blob/main/chdb.md) +- 低レベル API ドキュメント: [低レベル API](https://github.com/chdb-io/chdb-go/blob/main/lowApi.md) diff --git a/docs/ja/chdb/install/nodejs.md b/docs/ja/chdb/install/nodejs.md new file mode 100644 index 00000000000..7331596eb9e --- /dev/null +++ b/docs/ja/chdb/install/nodejs.md @@ -0,0 +1,65 @@ +--- +title: NodeJS 用 chDB のインストール +sidebar_label: NodeJS +slug: /ja/chdb/install/nodejs +description: NodeJS 用 chDB のインストール方法 +keywords: [chdb, embedded, clickhouse-lite, nodejs, install] +--- + +# NodeJS 用 chDB のインストール + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +```bash +npm i chdb +``` + +## GitHub リポジトリ + +プロジェクトの GitHub リポジトリは [chdb-io/chdb-node](https://github.com/chdb-io/chdb-node) で確認できます。 + +## 使用法 + +NodeJS アプリケーションで chdb-node モジュールをインポートし、その強力な機能を活用できます: + +```javascript +const { query, Session } = require("chdb"); + +var ret; + +// スタンドアローンのクエリをテスト +ret = query("SELECT version(), 'Hello chDB', chdb()", "CSV"); +console.log("Standalone Query Result:", ret); + +// セッションのクエリをテスト +// 新しいセッションインスタンスを作成 +const session = new Session("./chdb-node-tmp"); +ret = session.query("SELECT 123", "CSV") +console.log("Session Query Result:", ret); +ret = session.query("CREATE DATABASE IF NOT EXISTS testdb;" + + "CREATE TABLE IF NOT EXISTS testdb.testtable (id UInt32) ENGINE = MergeTree() ORDER BY id;"); + +session.query("USE testdb; INSERT INTO testtable VALUES (1), (2), (3);") + +ret = session.query("SELECT * FROM testtable;") +console.log("Session Query Result:", ret); + +// セッションのクリーンアップ +session.cleanup(); +``` + +## ソースからビルド + +```bash +npm run libchdb +npm install +npm run test +``` diff --git a/docs/ja/chdb/install/python.md b/docs/ja/chdb/install/python.md new file mode 100644 index 00000000000..3f9a7b77922 --- /dev/null +++ b/docs/ja/chdb/install/python.md @@ -0,0 +1,257 @@ +--- +title: Python向けのchDBのインストール +sidebar_label: Python +slug: /ja/chdb/install/python +description: Python向けのchDBのインストール方法 +keywords: [chdb, embedded, clickhouse-lite, python, install] +--- + +# Python向けのchDBのインストール + +## 必要条件 + +macOSとLinux(x86_64およびARM64)上のPython 3.8+ + +## インストール + +```bash +pip install chdb +``` + +## 使用法 + +CLI例: + +```python +python3 -m chdb [SQL] [OutputFormat] +``` + +```python +python3 -m chdb "SELECT 1, 'abc'" Pretty +``` + +Pythonファイル例: + +```python +import chdb + +res = chdb.query("SELECT 1, 'abc'", "CSV") +print(res, end="") +``` + +クエリは、`Dataframe`や`Debug`を含む[サポート形式](/docs/ja/interfaces/formats)のいずれかを使用してデータを返すことができます。 + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは[chdb-io/chdb](https://github.com/chdb-io/chdb)にあります。 + +## データ入力 + +以下のメソッドを使用して、オンディスクおよびインメモリのデータフォーマットにアクセス可能です。 + +### ファイル上でのクエリ (Parquet, CSV, JSON, Arrow, ORC など60+) + +SQLを実行し、希望の形式でデータを返せます。 + +```python +import chdb +res = chdb.query('select version()', 'Pretty'); print(res) +``` + +**ParquetまたはCSVでの操作** + +```python +# データ型の詳細は tests/format_output.py を参照 +res = chdb.query('select * from file("data.parquet", Parquet)', 'JSON'); print(res) +res = chdb.query('select * from file("data.csv", CSV)', 'CSV'); print(res) +print(f"SQL read {res.rows_read()} rows, {res.bytes_read()} bytes, elapsed {res.elapsed()} seconds") +``` + +**Pandas dataframe出力** +```python +# 詳細はhttps://clickhouse.com/docs/ja/interfaces/formatsを参照 +chdb.query('select * from file("data.parquet", Parquet)', 'Dataframe') +``` + +### テーブル上でのクエリ (Pandas DataFrame, Parquet file/bytes, Arrow bytes) + +**Pandas DataFrame上でのクエリ** + +```python +import chdb.dataframe as cdf +import pandas as pd +# 2つのDataFrameを結合 +df1 = pd.DataFrame({'a': [1, 2, 3], 'b': ["one", "two", "three"]}) +df2 = pd.DataFrame({'c': [1, 2, 3], 'd': ["①", "②", "③"]}) +ret_tbl = cdf.query(sql="select * from __tbl1__ t1 join __tbl2__ t2 on t1.a = t2.c", + tbl1=df1, tbl2=df2) +print(ret_tbl) +# DataFrameテーブルでのクエリ +print(ret_tbl.query('select b, sum(a) from __table__ group by b')) +``` + +### 状態を持つセッションでのクエリ + +セッションはクエリの状態を保持します。すべてのDDLおよびDMLの状態はディレクトリに保持されます。ディレクトリパスは引数として渡すことができます。指定されない場合、一時ディレクトリが作成されます。 + +パスが指定されない場合、セッションオブジェクトが削除されるときに一時ディレクトリが削除されます。そうでない場合、パスは保持されます。 + +デフォルトのデータベースは`_local`で、デフォルトのエンジンは`Memory`であるため、すべてのデータはメモリに保存されます。ディスクにデータを保存したい場合は、別のデータベースを作成する必要があります。 + +```python +from chdb import session as chs + +## 一時セッションでDB、テーブル、ビューを作成し、セッションが削除されると自動的にクリーンアップします。 +sess = chs.Session() +sess.query("CREATE DATABASE IF NOT EXISTS db_xxx ENGINE = Atomic") +sess.query("CREATE TABLE IF NOT EXISTS db_xxx.log_table_xxx (x String, y Int) ENGINE = Log;") +sess.query("INSERT INTO db_xxx.log_table_xxx VALUES ('a', 1), ('b', 3), ('c', 2), ('d', 5);") +sess.query( + "CREATE VIEW db_xxx.view_xxx AS SELECT * FROM db_xxx.log_table_xxx LIMIT 4;" +) +print("ビューから選択:\n") +print(sess.query("SELECT * FROM db_xxx.view_xxx", "Pretty")) +``` + +関連情報: [test_stateful.py](https://github.com/chdb-io/chdb/blob/main/tests/test_stateful.py). + +### Python DB-API 2.0でのクエリ + +```python +import chdb.dbapi as dbapi +print("chdbドライバーバージョン: {0}".format(dbapi.get_client_info())) + +conn1 = dbapi.connect() +cur1 = conn1.cursor() +cur1.execute('select version()') +print("説明: ", cur1.description) +print("データ: ", cur1.fetchone()) +cur1.close() +conn1.close() +``` + +### UDF(ユーザー定義関数)でのクエリ + +```python +from chdb.udf import chdb_udf +from chdb import query + +@chdb_udf() +def sum_udf(lhs, rhs): + return int(lhs) + int(rhs) + +print(query("select sum_udf(12,22)")) +``` + +chDBのPython UDF(ユーザー定義関数)デコレーターに関する注意点。 +1. 関数はステートレスであるべきです。UDF(ユーザー定義関数)のみがサポートされており、UDAF(ユーザー定義集約関数)はサポートされていません。 +2. デフォルトの戻り値の型はStringです。戻り値の型を変更したい場合は、引数として渡すことができます。戻り値の型は[次のいずれか](/ja/sql-reference/data-types)である必要があります。 +3. 関数はString型の引数を受け取るべきです。入力がタブ区切りであるため、すべての引数は文字列です。 +4. 関数は入力の各行ごとに呼び出されるでしょう。例: + ```python + def sum_udf(lhs, rhs): + return int(lhs) + int(rhs) + + for line in sys.stdin: + args = line.strip().split('\t') + lhs = args[0] + rhs = args[1] + print(sum_udf(lhs, rhs)) + sys.stdout.flush() + ``` +5. 関数は純粋なPython関数であるべきです。関数内で使用するすべてのPythonモジュールをインポートする必要があります。 + ```python + def func_use_json(arg): + import json + ... + ``` +6. 使用されるPythonインタープリタは、スクリプトを実行しているものと同じです。`sys.executable`から取得できます。 + +関連情報: [test_udf.py](https://github.com/chdb-io/chdb/blob/main/tests/test_udf.py). + +### Pythonテーブルエンジン + +### Pandas DataFrameでのクエリ + +```python +import chdb +import pandas as pd +df = pd.DataFrame( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query("SELECT b, sum(a) FROM Python(df) GROUP BY b ORDER BY b").show() +``` + +### Arrowテーブルでのクエリ + +```python +import chdb +import pyarrow as pa +arrow_table = pa.table( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query( + "SELECT b, sum(a) FROM Python(arrow_table) GROUP BY b ORDER BY b", "debug" +).show() +``` + +### chdb.PyReaderクラスのインスタンスでのクエリ + +1. chdb.PyReaderクラスを継承し、`read`メソッドを実装する必要があります。 +2. `read`メソッドは以下を行う必要があります: + 1. リストのリストを返すこと。第一次元はカラム、第二次元は行です。カラムの順序は、`read`の最初の引数`col_names`と同じであるべきです。 + 1. 読み疲れた時に空のリストを返すこと。 + 1. 状態を持ち、カーソルは`read`メソッド内で更新されるべきです。 +3. オプションで`get_schema`メソッドを実装してテーブルのスキーマを返すことができます。プロトタイプは`def get_schema(self) -> List[Tuple[str, str]]:`です。返り値はタプルのリストで、各タプルはカラム名とカラムの型を含みます。カラム型は[次のいずれか](/ja/sql-reference/data-types)である必要があります。 + +
+ +```python +import chdb + +class myReader(chdb.PyReader): + def __init__(self, data): + self.data = data + self.cursor = 0 + super().__init__(data) + + def read(self, col_names, count): + print("Python func read", col_names, count, self.cursor) + if self.cursor >= len(self.data["a"]): + return [] + block = [self.data[col] for col in col_names] + self.cursor += len(block[0]) + return block + +reader = myReader( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query( + "SELECT b, sum(a) FROM Python(reader) GROUP BY b ORDER BY b" +).show() +``` + +関連情報: [test_query_py.py](https://github.com/chdb-io/chdb/blob/main/tests/test_query_py.py). + +## 制限事項 + +1. サポートされているカラム型: pandas.Series, pyarrow.array, chdb.PyReader +1. サポートされているデータ型: Int, UInt, Float, String, Date, DateTime, Decimal +1. Pythonオブジェクト型はStringに変換される +1. Pandas DataFrameのパフォーマンスは最高で、Arrow TableはPyReaderよりも優れています。 + +
+ +より多くの例については、[examples](https://github.com/chdb-io/chdb/tree/main/examples)および[tests](https://github.com/chdb-io/chdb/tree/main/tests)を参照してください。 diff --git a/docs/ja/chdb/install/rust.md b/docs/ja/chdb/install/rust.md new file mode 100644 index 00000000000..9d482064027 --- /dev/null +++ b/docs/ja/chdb/install/rust.md @@ -0,0 +1,23 @@ +--- +title: Rust用chDBのインストール +sidebar_label: Rust +slug: /ja/chdb/install/rust +description: Rust用chDBのインストール方法 +keywords: [chdb, 組み込み, clickhouse-lite, bun, インストール] +--- + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb)をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## 使用法 + +このバインディングは現在開発中です。[chdb-rust](https://github.com/chdb-io/chdb-rust)の指示に従って始めてください。 + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは[chdb-io/chdb-rust](https://github.com/chdb-io/chdb-rust)で確認できます。 diff --git a/docs/ja/chdb/sql-reference.md b/docs/ja/chdb/sql-reference.md new file mode 100644 index 00000000000..eb6aa03397e --- /dev/null +++ b/docs/ja/chdb/sql-reference.md @@ -0,0 +1,20 @@ +--- +title: SQLリファレンス +sidebar_label: SQLリファレンス +slug: /ja/chdb/sql-reference +description: chDBのSQLリファレンス +keywords: [chdb, sql リファレンス] +--- + +chDBは、ClickHouseと同じSQL構文、ステートメント、エンジン、および関数をサポートしています: + +- [SQL構文](/docs/ja/sql-reference/syntax) +- [ステートメント](/docs/ja/sql-reference/statements) +- [テーブルエンジン](/docs/ja/engines/table-engines) +- [データベースエンジン](/docs/ja/engines/database-engines) +- [通常の関数](/docs/ja/sql-reference/functions) +- [集計関数](/docs/ja/sql-reference/aggregate-functions) +- [テーブル関数](/docs/ja/sql-reference/table-functions) +- [ウィンドウ関数](/docs/ja/sql-reference/window-functions) + +詳細情報や例については、[ClickHouse SQLリファレンス](/docs/ja/sql-reference)をご覧ください。 diff --git a/docs/ja/cloud-index.md b/docs/ja/cloud-index.md new file mode 100644 index 00000000000..db456a2dcaf --- /dev/null +++ b/docs/ja/cloud-index.md @@ -0,0 +1,9 @@ +--- +slug: /ja/cloud/overview +keywords: [AWS, Cloud, serverless] +title: 概要 +hide_title: true +--- +import Content from '@site/docs/ja/about-us/cloud.md'; + + diff --git a/docs/ja/cloud/_category_.yml b/docs/ja/cloud/_category_.yml new file mode 100644 index 00000000000..4fcbe452846 --- /dev/null +++ b/docs/ja/cloud/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'Benefits' +collapsible: true +collapsed: true +link: + type: doc + id: en/cloud/index diff --git a/docs/ja/cloud/bestpractices/_category_.yml b/docs/ja/cloud/bestpractices/_category_.yml new file mode 100644 index 00000000000..0477dadedc4 --- /dev/null +++ b/docs/ja/cloud/bestpractices/_category_.yml @@ -0,0 +1,7 @@ +label: 'Best Practices' +collapsible: true +collapsed: true +link: + type: generated-index + title: Best Practices + slug: /ja/cloud/bestpractices/ diff --git a/docs/ja/cloud/bestpractices/asyncinserts.md b/docs/ja/cloud/bestpractices/asyncinserts.md new file mode 100644 index 00000000000..a47745cbe24 --- /dev/null +++ b/docs/ja/cloud/bestpractices/asyncinserts.md @@ -0,0 +1,58 @@ +--- +slug: /ja/cloud/bestpractices/asynchronous-inserts +sidebar_label: 非同期インサート +title: 非同期インサート (async_insert) +--- + +ClickHouseにデータを大規模なバッチで挿入することはベストプラクティスです。これによりコンピュータの演算サイクルとディスクI/Oが節約され、結果的にコストも削減されます。ClickHouse外部でバッチ処理を行うことが可能であれば、それも一つの選択肢ですが、ClickHouseにバッチを作成させたい場合は、ここで説明する非同期INSERTモードを使用できます。 + +非同期インサートは、クライアント側でデータをバッチ処理し、挿入率を毎秒一つのインサートクエリ程度に維持する代替手段として、[async_insert](/docs/ja/operations/settings/settings.md/#async_insert)設定を有効にして使用します。これにより、ClickHouseがサーバー側でバッチ処理を行います。 + +デフォルトでは、ClickHouseはデータを同期的に書き込んでいます。ClickHouseに送信された各インサートは、即座にそのデータを含むパートを作成します。これは、async_insert設定がデフォルト値の0に設定されているときのデフォルトの動作です: + +![compression block diagram](images/async-01.png) + +async_insertを1に設定すると、ClickHouseはまず受信したインサートをメモリ内バッファに保存し、それを定期的にディスクにフラッシュします。 + +ClickHouseがバッファをディスクにフラッシュする原因となる可能性がある条件は次の二つです: +- バッファサイズがNバイトに達した(Nは[async_insert_max_data_size](/docs/ja/operations/settings/settings.md/#async-insert-max-data-size)で設定可能) +- 最後のバッファフラッシュからNミリ秒以上が経過した(Nは[async_insert_busy_timeout_ms](/docs/ja/operations/settings/settings.md/#async-insert-busy-timeout-ms)で設定可能) + +上記の条件が満たされるたびに、ClickHouseはメモリ内バッファをディスクにフラッシュします。 + +:::note +データが記憶装置のパートに書き込まれると、読み取りクエリのためにデータが利用可能になります。このことは、`async_insert_busy_timeout_ms`(デフォルトでは1秒に設定)や`async_insert_max_data_size`(デフォルトでは10 MiBに設定)設定を変更する際に考慮してください。 +::: + +[wait_for_async_insert](/docs/ja/operations/settings/settings.md/#wait-for-async-insert)設定を使うことで、インサートステートメントがバッファにデータを挿入後すぐに応答を返すか(wait_for_async_insert = 0)、あるいは、デフォルトで、バッファからフラッシュしてパートにデータが書き込まれた後で応答を返すか(wait_for_async_insert = 1)を設定できます。 + +以下の二つの図は、async_insertとwait_for_async_insertの二つの設定を示しています: + +![compression block diagram](images/async-02.png) + +![compression block diagram](images/async-03.png) + + +### 非同期インサートの有効化 + +非同期インサートは特定のユーザー、または特定のクエリに対して有効化できます: + +- ユーザーレベルでの非同期インサートの有効化。この例ではユーザー`default`を使用していますが、別のユーザーを作成した場合はそのユーザー名に置き換えてください: + ```sql + ALTER USER default SETTINGS async_insert = 1 + ``` +- インサートクエリのSETTINGS句を使用して非同期インサートの設定を指定できます: + ```sql + INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...) + ``` +- また、ClickHouseプログラミング言語クライアントを使用する際に接続パラメータとして非同期インサートの設定を指定することも可能です。 + + 例として、ClickHouse Cloudに接続するためにClickHouse Java JDBCドライバーを使用する場合、JDBC接続文字列内で次のように指定できます: + ```bash + "jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1" + ``` +非同期インサートを使用する場合、async_insert=1,wait_for_async_insert=1を使用することを強く推奨します。wait_for_async_insert=0を使用することは非常にリスクが高く、INSERTクライアントがエラーを認識できない可能性があり、また、ClickHouseサーバーが書き込み速度を減速させてバックプレッシャーを作成する必要がある状況で、クライアントが高速で書き込みを続けると潜在的なオーバーロードが発生する可能性があるためです。 + +:::note 非同期インサートを使用する場合、自動重複排除はデフォルトで無効になっています。 +手動のバッチ処理([上記セクション](#ingest-data-in-bulk)参照)は、(正確に)同じインサートステートメントが一時的なネットワーク接続問題によるクライアントソフトウェアでの自動再試行のためClickHouse Cloudに複数回送信される場合に、テーブルデータの[built-in automatic deduplication](/docs/ja/engines/table-engines/mergetree-family/replication.md)をサポートする利点があります。 +::: diff --git a/docs/ja/cloud/bestpractices/avoidmutations.md b/docs/ja/cloud/bestpractices/avoidmutations.md new file mode 100644 index 00000000000..6790f1fd091 --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidmutations.md @@ -0,0 +1,13 @@ +--- +slug: /ja/cloud/bestpractices/avoid-mutations +sidebar_label: ミューテーションを避ける +title: ミューテーションを避ける +--- + +ミューテーションとは、テーブルデータを削除または更新する [ALTER](/docs/ja/sql-reference/statements/alter/) クエリのことを指します。主に ALTER TABLE … DELETE, UPDATE などのクエリがこれに該当します。このようなクエリを実行すると、データパーツの新しい変異バージョンが生成されます。つまり、このようなステートメントはミューテーションの前に挿入されたすべてのデータに対してデータパーツの全体を書き直すことを引き起こし、大量の書き込み要求に繋がります。 + +更新に関しては、デフォルトの MergeTree のテーブルエンジンの代わりに、[ReplacingMergeTree](/docs/ja/engines/table-engines/mergetree-family/replacingmergetree.md) または [CollapsingMergeTree](/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md) などの専用のテーブルエンジンを使用することで、この大量の書き込み要求を回避できます。 + +## 関連コンテンツ + +- ブログ: [ClickHouseでの更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/cloud/bestpractices/avoidnullablecolumns.md b/docs/ja/cloud/bestpractices/avoidnullablecolumns.md new file mode 100644 index 00000000000..8a782f756cd --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidnullablecolumns.md @@ -0,0 +1,36 @@ +--- +slug: /ja/cloud/bestpractices/avoid-nullable-columns +sidebar_label: Nullableカラムを避ける +title: Nullableカラムを避ける +--- + +[`Nullable`カラム](/docs/ja/sql-reference/data-types/nullable/)(例: `Nullable(String)`)は`UInt8`型の別カラムを作成します。この追加のカラムは、ユーザーがNullableカラムを操作するたびに処理される必要があります。これにより、追加のストレージスペースが必要になり、ほとんどの場合、パフォーマンスに悪影響を及ぼします。 + +`Nullable`カラムを避けるには、そのカラムにデフォルト値を設定することを検討してください。例えば、以下のようにする代わりに: + +```sql +CREATE TABLE default.sample +( + `x` Int8, + # highlight-next-line + `y` Nullable(Int8) +) +ENGINE = MergeTree +ORDER BY x +``` +次のように使用します + +```sql +CREATE TABLE default.sample2 +( + `x` Int8, + # highlight-next-line + `y` Int8 DEFAULT 0 +) +ENGINE = MergeTree +ORDER BY x +``` + +:::note +ユースケースを考慮し、デフォルト値が不適切である可能性もあります。 +::: diff --git a/docs/ja/cloud/bestpractices/avoidoptimizefinal.md b/docs/ja/cloud/bestpractices/avoidoptimizefinal.md new file mode 100644 index 00000000000..9fdc7a5a6f1 --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidoptimizefinal.md @@ -0,0 +1,9 @@ +--- +slug: /ja/cloud/bestpractices/avoid-optimize-final +sidebar_label: Optimize Finalを避ける +title: Optimize Finalを避ける +--- + +[`OPTIMIZE TABLE ... FINAL`](/docs/ja/sql-reference/statements/optimize/) クエリを使用すると、特定のテーブルのデータパーツを1つにマージする予定外のマージが開始されます。このプロセス中、ClickHouseはすべてのデータパーツを読み込み、それらを解凍し、マージし、1つのパートに圧縮し直し、オブジェクトストアに書き戻します。これにより、多大なCPUおよびIOリソースが消費されます。 + +この最適化では、すでに1つのパーツにマージされている場合でも、その1つのパーツを書き換えることに注意が必要です。また、「1つのパーツ」の範囲についても重要です - これは、設定値 [`max_bytes_to_merge_at_max_space_in_pool`](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool) が無視されることを示します。例えば、[`max_bytes_to_merge_at_max_space_in_pool`](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool) はデフォルトで150 GBに設定されています。OPTIMIZE TABLE ... FINALを実行すると、残りの1つのパーツがこのサイズを超える可能性があります。150 GBの多数のパーツを1つにマージすることは、大量の時間やメモリを要する可能性があるため、このコマンドを一般的に使用しないもう一つの重要な考慮点です。 diff --git a/docs/ja/cloud/bestpractices/bulkinserts.md b/docs/ja/cloud/bestpractices/bulkinserts.md new file mode 100644 index 00000000000..f81d7127ca0 --- /dev/null +++ b/docs/ja/cloud/bestpractices/bulkinserts.md @@ -0,0 +1,13 @@ +--- +slug: /ja/cloud/bestpractices/bulk-inserts +sidebar_position: 63 +sidebar_label: バルクインサートを使用する +title: バルクインサート +--- + +## データを一括で取り込む +デフォルトでは、ClickHouseに送信された各インサートは、インサートされたデータと一緒に保存する必要がある他のメタデータを含むストレージ上のパートを即座に作成します。そのため、少ない数のインサートで各インサートに多くのデータを含める方が、多くの数のインサートで各インサートに少ないデータを含めるよりも、必要な書き込みの数が減ります。一般的に、1回のインサートで少なくとも1,000行、理想的には10,000から100,000行の大きなバッチでデータをインサートすることをお勧めします。そのためには、[Bufferテーブルエンジン](/docs/ja/engines/table-engines/special/buffer.md)を使用してバッチインサートを可能にするバッファメカニズムを実装するか、非同期インサートを利用することを検討してください([非同期インサート](/docs/ja/cloud/bestpractices/asyncinserts.md)を参照)。 + +:::tip +インサートのサイズに関係なく、インサートクエリの数を1秒に1回程度に保つことをお勧めします。この推奨の理由は、作成されたパートがバックグラウンドで大容量のパートにマージされ、読み取りクエリの最適化を行うためです。1秒間に多くのインサートクエリを送信すると、バックグラウンドのマージが多数の新しいパートに追いつけなくなる状況を引き起こす可能性があります。ただし、非同期インサートを使用する場合は、1秒間により多くのインサートクエリを使用することが可能です([非同期インサート](/docs/ja/cloud/bestpractices/asyncinserts.md)を参照)。 +::: diff --git a/docs/ja/cloud/bestpractices/images/async-01.png b/docs/ja/cloud/bestpractices/images/async-01.png new file mode 100644 index 00000000000..5ac0f7cd712 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-01.png differ diff --git a/docs/ja/cloud/bestpractices/images/async-02.png b/docs/ja/cloud/bestpractices/images/async-02.png new file mode 100644 index 00000000000..30446e4f73d Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-02.png differ diff --git a/docs/ja/cloud/bestpractices/images/async-03.png b/docs/ja/cloud/bestpractices/images/async-03.png new file mode 100644 index 00000000000..ecd82e950a7 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-03.png differ diff --git a/docs/ja/cloud/bestpractices/images/async.excalidraw b/docs/ja/cloud/bestpractices/images/async.excalidraw new file mode 100644 index 00000000000..a310e8e73ec --- /dev/null +++ b/docs/ja/cloud/bestpractices/images/async.excalidraw @@ -0,0 +1,8682 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 9191, + "versionNonce": 647165293, + "isDeleted": false, + "id": "z7b22yE8RBNw-dJti7WVw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11713.625100217656, + "y": -362.5020983032264, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1493.1072881078205, + "seed": 77762255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "veotS3i5mtgTncfBapy56", + "type": "arrow" + }, + { + "id": "kt7o2EcGvutAPunnwRp85", + "type": "arrow" + }, + { + "id": "0wAEvWjfkReYdnXnKEP-h", + "type": "arrow" + }, + { + "id": "HQHHlxtTUMpxfg5tg2cgp", + "type": "arrow" + }, + { + "id": "QcBHPr75biqSQUSeenF-n", + "type": "arrow" + }, + { + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "type": "arrow" + } + ], + "updated": 1664526042739, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9406, + "versionNonce": 2018714595, + "isDeleted": false, + "id": "0kqbthpF2BiBxnmmuryaa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 70, + "angle": 0, + "x": 11789.731349070416, + "y": -220.98991573643434, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 1138.870180087369, + "seed": 1270704335, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "zWRCMAu8b-b3yhe5MqdXu", + "type": "arrow" + }, + { + "id": "_GH5FCHHFjL8ucTQMTU2M", + "type": "arrow" + }, + { + "id": "Lvf51imWTee_5K2D3NesT", + "type": "arrow" + }, + { + "id": "MHgyHI7AE34K9ew6I8yKE", + "type": "arrow" + } + ], + "updated": 1664526042739, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8358, + "versionNonce": 1480017389, + "isDeleted": false, + "id": "bC-MZJnsb_BfYPNP8wLol", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12653.566657908705, + "y": -3253.871411737997, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 810810465, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + }, + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + }, + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 640, + "versionNonce": 1580866403, + "isDeleted": false, + "id": "d4vLH9jcWs8UgK72bcfg3", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12686.881791728685, + "y": -3218.149529222761, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 742471215, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7072, + "versionNonce": 1318191181, + "isDeleted": false, + "id": "8_SkgbVKhlR-i00bKx4GO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12770.276081935259, + "y": -2966.5796372067907, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 473417793, + "groupIds": [ + "_o2D4Ff754LPiJ3lANnSl" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 625, + "versionNonce": 466007811, + "isDeleted": false, + "id": "dF8SSKrHtIz-FHa6Xtnzg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12846.17314606392, + "y": -2926.513937048745, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 976787535, + "groupIds": [ + "_o2D4Ff754LPiJ3lANnSl" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 7201, + "versionNonce": 1919315629, + "isDeleted": false, + "id": "TRbPz9TYXzrkV2ImWH0Q6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12778.69576288221, + "y": -2629.001616539861, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 360126497, + "groupIds": [ + "UK_p7ZURolHsxzKbESJfP" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 779, + "versionNonce": 545185443, + "isDeleted": false, + "id": "ZnThar1RbW3QRqk_PHGdz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12851.583200290752, + "y": -2582.7230820505692, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 1933489775, + "groupIds": [ + "UK_p7ZURolHsxzKbESJfP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 7280, + "versionNonce": 1381896461, + "isDeleted": false, + "id": "e7TqDGRkXzcjPEEyP5vcS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12787.749619364122, + "y": -2305.301487900526, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1845586945, + "groupIds": [ + "eYxxul4F4EQgO40CK_jWL" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 864, + "versionNonce": 386994755, + "isDeleted": false, + "id": "ZUb7SBz2Tb-ELWFc663jz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12861.177245411945, + "y": -2256.9089129349886, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 2115768463, + "groupIds": [ + "eYxxul4F4EQgO40CK_jWL" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 1811048301, + "isDeleted": false, + "id": "r4asxMHx9AF_CwQuXL5fr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11717.33779159477, + "y": -3251.8698951545557, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 232145889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "gBlSD1bJsqWNZiq5ArccA", + "type": "arrow" + }, + { + "id": "_LoAwX3tpSgnbaB7aSy5P", + "type": "arrow" + }, + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + }, + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + }, + { + "id": "oM06BNl4jMhDCQawN0zMG", + "type": "arrow" + }, + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + }, + { + "id": "CNm4GJJ-rnwmdgPRGLvid", + "type": "arrow" + }, + { + "id": "7DX8HA8axopnXqPbjokVE", + "type": "arrow" + }, + { + "id": "6PEFg4n0JDF3pzWvnf30o", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 783, + "versionNonce": 1348194787, + "isDeleted": false, + "id": "7m-mbZyIVyy569uTn4tBd", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11772.853936454947, + "y": -3217.188579668402, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 344532655, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7612, + "versionNonce": 1366094285, + "isDeleted": false, + "id": "2x--W-ZvY7ju0oGWOTVyT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12173.67001282949, + "y": -3219.1902669673636, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 822419393, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 8618, + "versionNonce": 2104335747, + "isDeleted": false, + "id": "w3eLzAqXtWGhH7PGEgS30", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10923.404910249546, + "y": -3064.805232181765, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 623802575, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7215, + "versionNonce": 266809389, + "isDeleted": false, + "id": "yyBPzm_6f5xE0byBRF1rD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.419143009847, + "y": -3050.3868957032555, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1705869217, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1249, + "versionNonce": 1430954637, + "isDeleted": false, + "id": "86JAnse64Kf1MqKWhOdCo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2974.834601195555, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1241441153, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1422, + "versionNonce": 1947228355, + "isDeleted": false, + "id": "eZcTl0fr3lgHxYeTJeIbl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2965.320276036416, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 74699023, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1318, + "versionNonce": 1448134893, + "isDeleted": false, + "id": "-8pzVLkx5sWZfu5BrM1xQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2955.805950877277, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 171494241, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1321, + "versionNonce": 1954751309, + "isDeleted": false, + "id": "g7iFjimxwzRqo-hVVsMtx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11051.450247834839, + "y": -3051.063348010731, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 514504513, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8633, + "versionNonce": 898354083, + "isDeleted": false, + "id": "14um3uuD-lJpKFHhdHqFV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10932.414242905656, + "y": -2412.763441454721, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 618041871, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8664, + "versionNonce": 1114187203, + "isDeleted": false, + "id": "1Q4k4j8GjWiWN_1lKHWFI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10927.65208851143, + "y": -2740.7145584258697, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 2019432303, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 1604, + "versionNonce": 1795828707, + "isDeleted": false, + "id": "gBlSD1bJsqWNZiq5ArccA", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10594.324968228852, + "y": -2851.518633431533, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1113.9555986959022, + "height": 2.7898041151352118, + "seed": 1972267183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.40524785955330467, + "gap": 9.057224670014875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1113.9555986959022, + -2.7898041151352118 + ] + ] + }, + { + "type": "arrow", + "version": 1845, + "versionNonce": 1122580429, + "isDeleted": false, + "id": "_LoAwX3tpSgnbaB7aSy5P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10595.202639827345, + "y": -2526.7935270425287, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1109.8649363564746, + "height": 1.4805954349831154, + "seed": 1064107457, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.08308029355720341, + "gap": 12.270215410949277 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1109.8649363564746, + -1.4805954349831154 + ] + ] + }, + { + "type": "arrow", + "version": 1483, + "versionNonce": 624998275, + "isDeleted": false, + "id": "oM06BNl4jMhDCQawN0zMG", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10602.4096126515, + "y": -2190.2900278869147, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1109.2581114153727, + "height": 5.8104704563475025, + "seed": 2017163983, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "v0VPu-dOzqZnKb6oWmVs8", + "focus": -1.8456662495571472, + "gap": 15.409080937494991 + }, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.5776284899645453, + "gap": 5.670067527896208 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1109.2581114153727, + -5.8104704563475025 + ] + ] + }, + { + "type": "text", + "version": 1524, + "versionNonce": 1441445421, + "isDeleted": false, + "id": "wzVySREK89VXORifFN-n9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2151.5439128164917, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 1466539425, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1688, + "versionNonce": 1541721891, + "isDeleted": false, + "id": "MPwhakWq6HiTskDXqVC7k", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2094.1637864092327, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 1673611503, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1600, + "versionNonce": 1559062669, + "isDeleted": false, + "id": "BwdLyi1-L2RUYXy9xHXDo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2036.7836600019737, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 713507201, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1382, + "versionNonce": 1097134787, + "isDeleted": false, + "id": "Z28owIXwt3E5af-gPVQxO", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2153.7487984083537, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 363352847, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1546, + "versionNonce": 699059949, + "isDeleted": false, + "id": "EHzBoQcSe594ZnDZZB330", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2096.3686720010946, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 906324321, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1458, + "versionNonce": 912237155, + "isDeleted": false, + "id": "A-KLwRYqMrBpalqDDXAWH", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2038.9885455938356, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 644421935, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1168, + "versionNonce": 447506765, + "isDeleted": false, + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12296.561868915402, + "y": -2865.0059960429708, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 462.7328840911905, + "height": 0.516881397756606, + "seed": 590583105, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.4208841931785951, + "gap": 6.181103876019733 + }, + "endBinding": { + "elementId": "8_SkgbVKhlR-i00bKx4GO", + "focus": -0.09070770920808076, + "gap": 10.981328928668518 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 462.7328840911905, + 0.516881397756606 + ] + ] + }, + { + "type": "arrow", + "version": 1533, + "versionNonce": 61038083, + "isDeleted": false, + "id": "YPI_35Zw_AwduFo1kpFcA", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12302.170083829382, + "y": -2542.438861037297, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 459.3807302084424, + "height": 3.0096084426559173, + "seed": 191634255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.05941742942559109, + "gap": 11.789318789999925 + }, + "endBinding": { + "elementId": "TRbPz9TYXzrkV2ImWH0Q6", + "focus": 0.03157068329610485, + "gap": 17.144948844385 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 459.3807302084424, + 3.0096084426559173 + ] + ] + }, + { + "type": "arrow", + "version": 1700, + "versionNonce": 21739437, + "isDeleted": false, + "id": "f9HEnxVOpTBviKw8tXThY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12300.222597391738, + "y": -2200.9445397735844, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 468.09049532253266, + "height": 1.2695973711279294, + "seed": 1165051169, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.5744992460351734, + "gap": 9.841832352355596 + }, + "endBinding": { + "elementId": "e7TqDGRkXzcjPEEyP5vcS", + "focus": -0.09360166648365265, + "gap": 19.436526649851658 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 468.09049532253266, + -1.2695973711279294 + ] + ] + }, + { + "type": "text", + "version": 1210, + "versionNonce": 1412343203, + "isDeleted": false, + "id": "tWvUA7xEsE36cUtoFfqnY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10926.030907155478, + "y": -3218.297896217668, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 2030688623, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 1048, + "versionNonce": 1202862605, + "isDeleted": false, + "id": "NqjEpSR_dJCttOCntuu_V", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10711.25765719908, + "y": -3407.8988617918803, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 7.589343086200643, + "height": 1643.9036701963516, + "seed": 1479407873, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 7.589343086200643, + 1643.9036701963516 + ] + ] + }, + { + "type": "text", + "version": 1526, + "versionNonce": 1865414979, + "isDeleted": false, + "id": "X5mm-BFXTFimTtdsX49P2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10668.784552386063, + "y": -1705.5793083778499, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 76206991, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "arrow", + "version": 2204, + "versionNonce": 1457090669, + "isDeleted": false, + "id": "CNm4GJJ-rnwmdgPRGLvid", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11707.428256649255, + "y": -2816.1450649511416, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1053.9157014066477, + "height": 1.088799603037387, + "seed": 2095657185, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.3477221783787709, + "gap": 9.90953494551377 + }, + "endBinding": { + "elementId": "OKueZSKQ2ETJEZPzWvtfg", + "focus": 0.01912997293608503, + "gap": 11.687067524372651 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1053.9157014066477, + 1.088799603037387 + ] + ] + }, + { + "type": "arrow", + "version": 2320, + "versionNonce": 839244003, + "isDeleted": false, + "id": "7DX8HA8axopnXqPbjokVE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11704.118186549878, + "y": -2490.0246239209296, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1048.317345240992, + "height": 2.6603627831809717, + "seed": 103254447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.14199550169923875, + "gap": 13.219605044890159 + }, + "endBinding": { + "elementId": "xE19T5e9Wysn8zoUG985g", + "focus": -0.05287449867237143, + "gap": 11.259228929836354 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1048.317345240992, + -2.6603627831809717 + ] + ] + }, + { + "type": "arrow", + "version": 2296, + "versionNonce": 1015732941, + "isDeleted": false, + "id": "6PEFg4n0JDF3pzWvnf30o", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11709.515568986542, + "y": -2160.8492028620435, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1047.0984069373608, + "height": 4.357566102021792, + "seed": 2033347777, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.6310532427810328, + "gap": 7.822222608226184 + }, + "endBinding": { + "elementId": "v0VPu-dOzqZnKb6oWmVs8", + "focus": 0.026668879454902896, + "gap": 8.517975295454562 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1047.0984069373608, + 4.357566102021792 + ] + ] + }, + { + "type": "text", + "version": 1734, + "versionNonce": 1245627523, + "isDeleted": false, + "id": "OKueZSKQ2ETJEZPzWvtfg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10586.743002549409, + "y": -2833.4164856067873, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 990411727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "16_ypIlxoTp2M1Dk710RX", + "type": "arrow" + }, + { + "id": "eEfVfgGYmCShzGgSTsASX", + "type": "arrow" + }, + { + "id": "CNm4GJJ-rnwmdgPRGLvid", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1888, + "versionNonce": 291502381, + "isDeleted": false, + "id": "xE19T5e9Wysn8zoUG985g", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10589.459127210226, + "y": -2509.87993220553, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 883502241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7DX8HA8axopnXqPbjokVE", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1858, + "versionNonce": 798571555, + "isDeleted": false, + "id": "v0VPu-dOzqZnKb6oWmVs8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10598.816701584903, + "y": -2174.88094694942, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 658909679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "W7YDiu09-OR0Tvc8g-7Jc", + "type": "arrow" + }, + { + "id": "oM06BNl4jMhDCQawN0zMG", + "type": "arrow" + }, + { + "id": "6PEFg4n0JDF3pzWvnf30o", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 987, + "versionNonce": 516049805, + "isDeleted": false, + "id": "wGlVn0CphcZySt9Az-yK1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10707.799612223622, + "y": -3622.7366339723703, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 883.1604826321716, + "height": 113.30422280648524, + "seed": 1996288129, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 0", + "baseline": 91.30422280648524, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 0" + }, + { + "type": "rectangle", + "version": 7416, + "versionNonce": 1577304003, + "isDeleted": false, + "id": "Xl8BQ7srbKrePLFbE4SMU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.043282909015, + "y": -2999.083422964102, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 68103183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7493, + "versionNonce": 1156272621, + "isDeleted": false, + "id": "gof0jujEL7V0RU2-OMofS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10934.88593975075, + "y": -2912.657600075194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 988612129, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1432, + "versionNonce": 1335676771, + "isDeleted": false, + "id": "wR_KU6UfVZ7MXN3S-2vIf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11051.074387734008, + "y": -3000.2993183406566, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 64613057, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1502, + "versionNonce": 551849037, + "isDeleted": false, + "id": "YdX5glsCRgrBKx-sdZZxb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11053.649724186334, + "y": -2915.3126642838592, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 38451983, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7326, + "versionNonce": 917695235, + "isDeleted": false, + "id": "_gMJ3F4wObYW0YE904ube", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10942.865710780368, + "y": -2725.47459735298, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 15769665, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1359, + "versionNonce": 1921481389, + "isDeleted": false, + "id": "5UKdvAcS_JRJz2Ts4MjtV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2649.92230284528, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1008287823, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1532, + "versionNonce": 2009371299, + "isDeleted": false, + "id": "tmOOB6qKUgyVhYl1ayWL2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2640.407977686141, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 492105761, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1428, + "versionNonce": 1115528461, + "isDeleted": false, + "id": "aP3ZitQYd7dZFdDhVMoF9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2630.893652527002, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1120558703, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1431, + "versionNonce": 1669350979, + "isDeleted": false, + "id": "nelC_MSr6sa8ochhSpqLX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11057.896815605358, + "y": -2726.151049660456, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1818510337, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7528, + "versionNonce": 1212183405, + "isDeleted": false, + "id": "7HORGwMmckivbaMESZS8T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10942.682298282823, + "y": -2673.978677010538, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 770881679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7604, + "versionNonce": 818185699, + "isDeleted": false, + "id": "jJkQz8kHAKT63YuDxjQn8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10941.332507521269, + "y": -2587.745301724918, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1780358113, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1542, + "versionNonce": 270106061, + "isDeleted": false, + "id": "KvP2hjBcsmNlV1YU2dY17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11057.520955504528, + "y": -2675.3870199903813, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1665846959, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1612, + "versionNonce": 916443523, + "isDeleted": false, + "id": "XrActUzzlVbNq1YqaOOrb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11060.096291956854, + "y": -2590.400365933584, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1720842177, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7290, + "versionNonce": 1629633581, + "isDeleted": false, + "id": "yBrqnOHauqTiYzo-koLn2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.290542613031, + "y": -2401.50628656556, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 200568559, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1323, + "versionNonce": 1716562211, + "isDeleted": false, + "id": "lOp4e9Assx2rdxXWmmDNf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2325.95399205786, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 788626305, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1496, + "versionNonce": 1665412749, + "isDeleted": false, + "id": "ZiytRED6G1DfjCEUe5Tgx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2316.43966689872, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1485224207, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1392, + "versionNonce": 88444099, + "isDeleted": false, + "id": "V3Z5_GgCKKDRZl86yTysp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2306.925341739582, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1663591265, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1395, + "versionNonce": 87610605, + "isDeleted": false, + "id": "ysDzDodoBlYWx0JNoVRKz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.32164743802, + "y": -2402.1827388730353, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 210419503, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7492, + "versionNonce": 656211043, + "isDeleted": false, + "id": "DnkgM_S5MqjruI9CcnD-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10947.914682512197, + "y": -2350.202813826406, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1709657921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7568, + "versionNonce": 579448653, + "isDeleted": false, + "id": "SBWRJK-TvopNXwt72IjkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.757339353931, + "y": -2263.7769909374983, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1248395599, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1506, + "versionNonce": 1738897411, + "isDeleted": false, + "id": "-A2HLwAuj10deyHVG8xPR", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11062.94578733719, + "y": -2351.4187092029615, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 765312801, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1577, + "versionNonce": 1771060653, + "isDeleted": false, + "id": "PHVvYTFt-Tu8Q95XcKSkf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11065.521123789516, + "y": -2266.4320551461633, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1400504175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8837, + "versionNonce": 1692237731, + "isDeleted": false, + "id": "awUEWAA8CLP17LpYHvH6P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12648.405314950462, + "y": -364.49402835267574, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1494.474639367547, + "seed": 642251951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "UGSRJmN3MsDMsRVN5QR7B", + "type": "arrow" + }, + { + "id": "PwlCoKb42UzW0NYlczmWr", + "type": "arrow" + }, + { + "id": "wBMhNAE5SnGg_sE0i_bOK", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8045, + "versionNonce": 1882486381, + "isDeleted": false, + "id": "0Y0mlivbwuVpvOyf4i_lH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12168.508669871244, + "y": -329.6339005635946, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 2049301743, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 9051, + "versionNonce": 877015779, + "isDeleted": false, + "id": "uJ3Qd7btEme-7LxdKsay7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10918.243567291298, + "y": -175.24886577799566, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 157674881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9094, + "versionNonce": 1132135683, + "isDeleted": false, + "id": "1t0QMqrqIxrfcoGgOfXia", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10922.740670054958, + "y": 148.84180797789918, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 1595694305, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9066, + "versionNonce": 818447139, + "isDeleted": false, + "id": "3-nEIP9R4LmFUQOcEORys", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10927.252899947409, + "y": 476.7929249490485, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 67186753, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 3234, + "versionNonce": 994258243, + "isDeleted": false, + "id": "veotS3i5mtgTncfBapy56", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10585.180157747885, + "y": 40.859038939258426, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1125.8776942209497, + "height": 1.2625051858872212, + "seed": 982902689, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "G_cjG9NGUMqeUkqehWFVW", + "focus": -1.7951399188514814, + "gap": 14.384573043244245 + }, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.4616290704639783, + "gap": 2.567248248819851 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1125.8776942209497, + -1.2625051858872212 + ] + ] + }, + { + "type": "arrow", + "version": 2845, + "versionNonce": 1875082349, + "isDeleted": false, + "id": "kt7o2EcGvutAPunnwRp85", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10585.223726389402, + "y": 363.68658303561233, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1116.2054327063452, + "height": 0.17707567252489298, + "seed": 1339465455, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.027577621242712277, + "gap": 12.195941121907708 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1116.2054327063452, + -0.17707567252489298 + ] + ] + }, + { + "type": "arrow", + "version": 2417, + "versionNonce": 2106756323, + "isDeleted": false, + "id": "0wAEvWjfkReYdnXnKEP-h", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10596.763967093577, + "y": 701.5290982506217, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1111.7174391889857, + "height": 1.2681875196597048, + "seed": 899304321, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.4272148747293711, + "gap": 5.143693935092415 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1111.7174391889857, + 1.2681875196597048 + ] + ] + }, + { + "type": "text", + "version": 1641, + "versionNonce": 1146316493, + "isDeleted": false, + "id": "bC9SsYY-nMMJaLxOwA8uq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10920.72556093747, + "y": -328.59316281899237, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 1084418319, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "text", + "version": 1563, + "versionNonce": 674694445, + "isDeleted": false, + "id": "SizfOxTHDWIgtEcHg8XQY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11797.422041457132, + "y": -213.31559077092766, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 92.45010600653902, + "height": 38.412367988632404, + "seed": 27324207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 30.38771497908792, + "fontFamily": 1, + "text": "buffer", + "baseline": 26.412367988632404, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "buffer" + }, + { + "type": "rectangle", + "version": 8206, + "versionNonce": 1837531757, + "isDeleted": false, + "id": "43VjTFhKz7zS5KS6W6hIM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12788.992867861649, + "y": 857.1898514414802, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1254318319, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8303, + "versionNonce": 1978328803, + "isDeleted": false, + "id": "uGohHPKAhjZroszXJ1HQM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12788.49645007739, + "y": 781.549592369844, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1045604737, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8389, + "versionNonce": 1606790349, + "isDeleted": false, + "id": "0yU25xOLabv_GmVIIjKWQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12790.162349148173, + "y": 708.7057069267507, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 78080783, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2223, + "versionNonce": 710021763, + "isDeleted": false, + "id": "-A14N5H_8zguTVEKam-Ws", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12806.55951702084, + "y": 723.5286297668713, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 308.2869528801066, + "height": 166.83764508805757, + "seed": 203673953, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 130.56859180804503, + "fontFamily": 1, + "text": "Part", + "baseline": 117.83764508805757, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "arrow", + "version": 2489, + "versionNonce": 1768983341, + "isDeleted": false, + "id": "MHgyHI7AE34K9ew6I8yKE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12233.050567512346, + "y": 821.3452400154339, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 535.859357916067, + "height": 0.06534604596265581, + "seed": 365244719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "0kqbthpF2BiBxnmmuryaa", + "focus": 0.8304810387070579, + "gap": 3.5584119912728056 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 535.859357916067, + -0.06534604596265581 + ] + ] + }, + { + "type": "arrow", + "version": 3548, + "versionNonce": 202557987, + "isDeleted": false, + "id": "HQHHlxtTUMpxfg5tg2cgp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11703.93290592633, + "y": 73.07819509761953, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1055.3643529877809, + "height": 0.7398101402201291, + "seed": 2034564417, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.41671124609872856, + "gap": 9.692194291325904 + }, + "endBinding": { + "elementId": "G_cjG9NGUMqeUkqehWFVW", + "focus": 0.03027275457975293, + "gap": 11.795086622790222 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1055.3643529877809, + 0.7398101402201291 + ] + ] + }, + { + "type": "arrow", + "version": 3000, + "versionNonce": 183541133, + "isDeleted": false, + "id": "QcBHPr75biqSQUSeenF-n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11700.87286745263, + "y": 395.7151579146706, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1049.7659968221255, + "height": 2.5139289048910314, + "seed": 1736782671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.01656803953296109, + "gap": 12.752232765024928 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1049.7659968221255, + -2.5139289048910314 + ] + ] + }, + { + "type": "arrow", + "version": 3651, + "versionNonce": 1343983043, + "isDeleted": false, + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11702.52803898585, + "y": 738.0648827446084, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1048.547058518494, + "height": 4.493016513437169, + "seed": 622177569, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.47171278936871536, + "gap": 11.097061231804219 + }, + "endBinding": { + "elementId": "STPsN7OleYbzTtI1M9_1-", + "focus": 0.06296681167862889, + "gap": 13.903084420416235 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1048.547058518494, + 4.493016513437169 + ] + ] + }, + { + "type": "arrow", + "version": 1403, + "versionNonce": 2071946221, + "isDeleted": false, + "id": "FRemx_DRYWXJhWJZ7KHKo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10698.525446260344, + "y": -401.118879155345, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 7.589343086200643, + "height": 1643.9036701963516, + "seed": 574615919, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 7.589343086200643, + 1643.9036701963516 + ] + ] + }, + { + "type": "text", + "version": 1920, + "versionNonce": 160095587, + "isDeleted": false, + "id": "6320NDc33yTz5Sv0IRTA2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10657.106588296567, + "y": 1271.317266339392, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 386228481, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "text", + "version": 2047, + "versionNonce": 1327914573, + "isDeleted": false, + "id": "G_cjG9NGUMqeUkqehWFVW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10581.690981146934, + "y": 55.24361198250267, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1329458063, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "HQHHlxtTUMpxfg5tg2cgp", + "type": "arrow" + }, + { + "id": "veotS3i5mtgTncfBapy56", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2199, + "versionNonce": 1672427779, + "isDeleted": false, + "id": "Q8pPOj73Aj2Wi5lsQGe8O", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10577.598920219556, + "y": 381.07072283767593, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1016305889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2192, + "versionNonce": 1556024493, + "isDeleted": false, + "id": "STPsN7OleYbzTtI1M9_1-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10584.995410878117, + "y": 723.5363882379029, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 985113007, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2110, + "versionNonce": 470229155, + "isDeleted": false, + "id": "BU_OIQXM7fVXdcf65bMhn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10492.550278189203, + "y": 6.870146264230243, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 28, + "height": 56, + "seed": 659543233, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t" + }, + { + "type": "arrow", + "version": 2502, + "versionNonce": 1676865293, + "isDeleted": false, + "id": "rvBS-i9vxpvnrZyITMkMn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10579.376449067948, + "y": 825.4320721280069, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1623.7136677156018, + "height": 1.9093365596636431, + "seed": 366318543, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1623.7136677156018, + -1.9093365596636431 + ] + ] + }, + { + "type": "text", + "version": 2189, + "versionNonce": 1933280621, + "isDeleted": false, + "id": "qg3LJ1Z2_KBSk1KVC1v20", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 9677.080137272706, + "y": 795.4488267744159, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 903, + "height": 56, + "seed": 1487946223, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "tf4f5Ttd3vc2bvxc1uMXA", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t + async_insert_busy_timeout_ms ", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t + async_insert_busy_timeout_ms " + }, + { + "type": "text", + "version": 1452, + "versionNonce": 339448803, + "isDeleted": false, + "id": "HTKKa4w7JMH6KIb4s0H1P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10729.150882897164, + "y": -766.9086906142543, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 884, + "height": 113, + "seed": 2061523073, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 1" + }, + { + "type": "text", + "version": 1575, + "versionNonce": 232935373, + "isDeleted": false, + "id": "xy4zXW3-DJNw6qjK-ICLf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10731.029806058092, + "y": -625.932343140094, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1380, + "height": 113, + "seed": 1682975759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "wait_for_async_insert = 0", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "wait_for_async_insert = 0" + }, + { + "type": "rectangle", + "version": 8940, + "versionNonce": 1946492803, + "isDeleted": false, + "id": "lTG-8QtXaYksBy1xibPuJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10915.494547140497, + "y": 155.17015197481192, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 451595425, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7601, + "versionNonce": 302042669, + "isDeleted": false, + "id": "st2P9a8klcShYP2PY-sR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10930.708169409438, + "y": 170.41011304770177, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2003732975, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1634, + "versionNonce": 635189027, + "isDeleted": false, + "id": "1tXEudKHe-zdZjmPKvz7F", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 245.9624075554018, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1678413953, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1807, + "versionNonce": 1585479821, + "isDeleted": false, + "id": "u_B-oAXydFUBM40i3DVKY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 255.47673271454073, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 604337167, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1703, + "versionNonce": 674192067, + "isDeleted": false, + "id": "f0FHVNQ171mhmzueoD9N8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 264.99105787367967, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 541513825, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1706, + "versionNonce": 958064365, + "isDeleted": false, + "id": "Oy0vu1Ud9lem8FozjQvEI", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11045.739274234424, + "y": 169.73366074022556, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 242883119, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7803, + "versionNonce": 664603235, + "isDeleted": false, + "id": "VI8vFlMwoKX5HprA0nXXb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10930.524756911891, + "y": 221.9060333901441, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1097802817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7879, + "versionNonce": 1952022861, + "isDeleted": false, + "id": "0aaB4qQ_8f_0vicGJNMVv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10929.174966150335, + "y": 308.13940867576343, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 733281359, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1817, + "versionNonce": 955500035, + "isDeleted": false, + "id": "lbp7pzODv2KPFBtlq_zPV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11045.363414133593, + "y": 220.49769041030027, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1398993953, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1887, + "versionNonce": 1435881389, + "isDeleted": false, + "id": "v55jU8UjTDppudrTge9hV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.93875058592, + "y": 305.48434446709757, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1066310255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7430, + "versionNonce": 1395789219, + "isDeleted": false, + "id": "3WG85fNKmNshZUroQX5FM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10932.631584221082, + "y": -159.67267227329876, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1729037473, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1464, + "versionNonce": 989417997, + "isDeleted": false, + "id": "vcyHYwDLe9WwOzrtxN3JT", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -84.12037776559828, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 415879663, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1637, + "versionNonce": 159801667, + "isDeleted": false, + "id": "HHizHG17ix82VUUJV04Rw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -74.60605260645934, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 250071169, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1533, + "versionNonce": 25004141, + "isDeleted": false, + "id": "doozI8AKUrwVFjkTcPFQ4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -65.09172744732041, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 179813391, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1536, + "versionNonce": 89080035, + "isDeleted": false, + "id": "wCyO7RWIuIJgWYqOgj_pS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.662689046076, + "y": -160.34912458077406, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1790775393, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7631, + "versionNonce": 720106189, + "isDeleted": false, + "id": "pimrBrFug0s_5JxRkfZ4H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10932.255724120252, + "y": -108.36919953414508, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2007196207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7708, + "versionNonce": 1075522691, + "isDeleted": false, + "id": "B1phD7w2CvvQ0tcUn93lq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10931.098380961987, + "y": -21.943376645237095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1348361281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1647, + "versionNonce": 1138626861, + "isDeleted": false, + "id": "uRq_dTrNr-07Dp1uOEM3S", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.286828945245, + "y": -109.58509491069981, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 812991567, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1717, + "versionNonce": 2108204067, + "isDeleted": false, + "id": "LSAK1peaoCVSNpUDZYhQo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11049.862165397572, + "y": -24.598440853902503, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 799747105, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7586, + "versionNonce": 163406733, + "isDeleted": false, + "id": "GIK2xnh3xjVoH2mNgXJgJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10938.167335942951, + "y": 492.6610330784283, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1834457153, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1619, + "versionNonce": 98969539, + "isDeleted": false, + "id": "ty_23HO_RT9IwAFtzP-Tm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 568.2133275861283, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1740490831, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1792, + "versionNonce": 1354983917, + "isDeleted": false, + "id": "FMYyXedAzwG0rs0AMArOn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 577.7276527452682, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1377626145, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1688, + "versionNonce": 519190371, + "isDeleted": false, + "id": "VeP44CoINcBxdlooIZprg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 587.2419779044062, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 413001327, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1691, + "versionNonce": 704226381, + "isDeleted": false, + "id": "VLsqQ39mYA485LtqqUGXp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11053.198440767941, + "y": 491.984580770953, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 896351233, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7788, + "versionNonce": 1192973059, + "isDeleted": false, + "id": "yrIAuCc6PANbGI_p2hCjK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10937.791475842118, + "y": 543.9645058175824, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 269828239, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7864, + "versionNonce": 1228509869, + "isDeleted": false, + "id": "hKLE0HIHfe15WnCdNwZ61", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.634132683852, + "y": 630.39032870649, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 390599649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1802, + "versionNonce": 786430627, + "isDeleted": false, + "id": "Ns5IsS-4cSyV1v9yX-oAF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11052.82258066711, + "y": 542.7486104410268, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1876711087, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1873, + "versionNonce": 724350221, + "isDeleted": false, + "id": "M430CtOqQcBFAh-Idslo-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11055.397917119437, + "y": 627.735264497825, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1270673345, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7789, + "versionNonce": 1928244803, + "isDeleted": false, + "id": "fJI4KGFfz5fIAGJ2ar8m0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.593530459948, + "y": 170.27465419642976, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 39594191, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1822, + "versionNonce": 2068613997, + "isDeleted": false, + "id": "L3QIoulxLeLgfAneabny_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 245.8269487041298, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2138230689, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1995, + "versionNonce": 371584483, + "isDeleted": false, + "id": "jmi8wXf8oByCKj5zwJQrV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 255.34127386326873, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 27014895, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1891, + "versionNonce": 971150797, + "isDeleted": false, + "id": "mHV27wpghy6wGwJySxi-R", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 264.85559902240766, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 513422209, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1894, + "versionNonce": 999569795, + "isDeleted": false, + "id": "iDcdx6J7TsZAYtk721XVj", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.624635284934, + "y": 169.59820188895355, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1442152719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7991, + "versionNonce": 570971181, + "isDeleted": false, + "id": "_tohoIGOJyx7I3YyQrOl-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.410117962401, + "y": 221.7705745388721, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1323965281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8067, + "versionNonce": 544739619, + "isDeleted": false, + "id": "8wu7Rh5P2H97hyWd-oUQt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.060327200845, + "y": 308.00394982449143, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 14714671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2005, + "versionNonce": 1336362637, + "isDeleted": false, + "id": "jB6lodUtI_6Aec1ro7KM2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.248775184104, + "y": 220.36223155902826, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1622280001, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2075, + "versionNonce": 1447032003, + "isDeleted": false, + "id": "PjpfBY_pPlkRtVcVk-GVZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.82411163643, + "y": 305.34888561582557, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1086703951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7618, + "versionNonce": 628681965, + "isDeleted": false, + "id": "q7tN7khLnuThoxptNGme7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11804.516945271593, + "y": -159.80813112457076, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1850832673, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1652, + "versionNonce": 1015702627, + "isDeleted": false, + "id": "d6ERGGBwjCqxCYBvK-s-Q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -84.25583661687028, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1929234287, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1825, + "versionNonce": 1929824077, + "isDeleted": false, + "id": "6-r6-zLERnCs1T424R6Wv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -74.74151145773135, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 439872257, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1721, + "versionNonce": 992337923, + "isDeleted": false, + "id": "xqlODkL6jeqVQ4RF0YgtE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -65.22718629859241, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 902889871, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1724, + "versionNonce": 1521112493, + "isDeleted": false, + "id": "HqoC90JqkvTgArlp3bcEq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.548050096586, + "y": -160.48458343204607, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 216326881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7819, + "versionNonce": 1007740835, + "isDeleted": false, + "id": "wBs5xU2Ypww9eKDisJBjJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11804.141085170762, + "y": -108.50465838541709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1249376175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7896, + "versionNonce": 2005735437, + "isDeleted": false, + "id": "hI0nlmUp8gxFMcIFD9ed3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.983742012497, + "y": -22.0788354965091, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 854056641, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1835, + "versionNonce": 1702492995, + "isDeleted": false, + "id": "ahj_JCsl_bgmKiBBIf-8c", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.172189995756, + "y": -109.72055376197181, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 924527055, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1905, + "versionNonce": 1135119981, + "isDeleted": false, + "id": "QWbQDk1jXsuCEYXARV7ga", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11921.747526448082, + "y": -24.733899705174508, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 987782817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7774, + "versionNonce": 331324131, + "isDeleted": false, + "id": "81Xym2Ei4mixHPJO_a8tp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11810.052696993462, + "y": 492.5255742271563, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 684922863, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1807, + "versionNonce": 1036400845, + "isDeleted": false, + "id": "CZjGCbM2W7MjicflG3y93", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 568.0778687348563, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1400758913, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1980, + "versionNonce": 326125187, + "isDeleted": false, + "id": "x_S5tPlu6ol9a3lsse9EY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 577.5921938939962, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 363348495, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1876, + "versionNonce": 1333761837, + "isDeleted": false, + "id": "8_cNNQ2X-EPzDrde0dTXe", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 587.1065190531342, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 696248929, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1879, + "versionNonce": 457866787, + "isDeleted": false, + "id": "eCZRcUYfKOGZ5CFt8YBr8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11925.083801818451, + "y": 491.849121919681, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 512960559, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7976, + "versionNonce": 1933453709, + "isDeleted": false, + "id": "TwlNxmXGHUH8Y72e2g-M1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11809.676836892628, + "y": 543.8290469663104, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 632682049, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8052, + "versionNonce": 104645059, + "isDeleted": false, + "id": "WYABx-odVUAWdjvyhwilr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.519493734362, + "y": 630.254869855218, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 830229071, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1990, + "versionNonce": 440102893, + "isDeleted": false, + "id": "0RZuZQp2fIzg-DrN3WmFq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11924.707941717621, + "y": 542.6131515897548, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1795130913, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1298501987, + "isDeleted": false, + "id": "5yUiLONIflckY6ODlMoZO", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11927.283278169947, + "y": 627.599805646553, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1799104623, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "arrow", + "version": 1432, + "versionNonce": 1384180301, + "isDeleted": false, + "id": "p_mujapNK1HLZFLfWV-Mz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10704.109137958572, + "y": 2773.8210159356904, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 2.5207489314871054, + "height": 1616.867889645605, + "seed": 2053011503, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5207489314871054, + 1616.867889645605 + ] + ] + }, + { + "type": "rectangle", + "version": 9224, + "versionNonce": 1108569347, + "isDeleted": false, + "id": "_S1VsQeCe9jmCVzltaNiq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12665.741083768607, + "y": 2829.781771902455, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1494.474639367547, + "seed": 990357057, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "UGSRJmN3MsDMsRVN5QR7B", + "type": "arrow" + }, + { + "id": "PwlCoKb42UzW0NYlczmWr", + "type": "arrow" + }, + { + "id": "wBMhNAE5SnGg_sE0i_bOK", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9576, + "versionNonce": 130340003, + "isDeleted": false, + "id": "yeWaxa45GzF-9jIgCsb1L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11730.481174921983, + "y": 2832.224937774474, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1493.1072881078205, + "seed": 1251685921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "E0USEpWMl2ARgev0503M4", + "type": "arrow" + }, + { + "id": "SymoFzBsIWLDxRI5vaxAl", + "type": "arrow" + }, + { + "id": "1RNOM6dFYkRgYxvim7D4z", + "type": "arrow" + }, + { + "id": "FTHurF4qeJGBxvj8o5fpQ", + "type": "arrow" + }, + { + "id": "nmnzK2jrZye5qir7thmrP", + "type": "arrow" + }, + { + "id": "cUji-Br17Nea8XRPh-Tdx", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8433, + "versionNonce": 1311262787, + "isDeleted": false, + "id": "1Vdo7vOfKL16u6y5-VU-G", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12185.844438689384, + "y": 2864.904565961666, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 1693567489, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 9440, + "versionNonce": 1032950125, + "isDeleted": false, + "id": "CykemVIDRFm_2ZKrr3jqH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10935.579336109446, + "y": 3019.2896007472655, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 1936233103, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9483, + "versionNonce": 1265110349, + "isDeleted": false, + "id": "cbuTOKVr20FDKIkgA4GIy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10940.076438873106, + "y": 3343.38027450316, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 911218991, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9454, + "versionNonce": 609557805, + "isDeleted": false, + "id": "io_CdIt9rtIAJ8p1B4f_s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10944.588668765557, + "y": 3671.3313914743085, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 2056223695, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 3381, + "versionNonce": 599539981, + "isDeleted": false, + "id": "E0USEpWMl2ARgev0503M4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10624.61016191806, + "y": 3237.7806316767555, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1103.303764755099, + "height": 3.4156117718298447, + "seed": 566049391, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": 0.4619878782807352, + "gap": 2.56724824882167 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1103.303764755099, + -3.4156117718298447 + ] + ] + }, + { + "type": "arrow", + "version": 3562, + "versionNonce": 904782403, + "isDeleted": false, + "id": "SymoFzBsIWLDxRI5vaxAl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10634.460843708423, + "y": 3558.2368459784275, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1084.2764893954172, + "height": 0.3618028454022806, + "seed": 1335699457, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": 0.026894030096862375, + "gap": 11.743841818141846 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1084.2764893954172, + 0.3618028454022806 + ] + ] + }, + { + "type": "arrow", + "version": 3175, + "versionNonce": 1376425837, + "isDeleted": false, + "id": "1RNOM6dFYkRgYxvim7D4z", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10634.483945443835, + "y": 3896.0675647758826, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1090.8535355430568, + "height": 1.4317591920334962, + "seed": 1646924943, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.42722033057796605, + "gap": 5.143693935090596 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1090.8535355430568, + 1.4317591920334962 + ] + ] + }, + { + "type": "text", + "version": 2028, + "versionNonce": 454992355, + "isDeleted": false, + "id": "9VJJNqw6p5GTpzOi0i0R4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10938.061329755617, + "y": 2865.9453037062685, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 1016758241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "rectangle", + "version": 9783, + "versionNonce": 620700109, + "isDeleted": false, + "id": "sYKGvj4ZYFGztvmWLWbC7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 70, + "angle": 0, + "x": 11794.329063970248, + "y": 2964.41449903395, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 1138.870180087369, + "seed": 1345759919, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "zWRCMAu8b-b3yhe5MqdXu", + "type": "arrow" + }, + { + "id": "_GH5FCHHFjL8ucTQMTU2M", + "type": "arrow" + }, + { + "id": "Z1c6cYExM1G6PzJDzZsKg", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1942, + "versionNonce": 123104643, + "isDeleted": false, + "id": "d6dmPkhgAN5kOZ4hRC3fu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11806.75781027528, + "y": 2981.2228757543335, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 92.45010600653902, + "height": 38.412367988632404, + "seed": 1944181697, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 30.38771497908792, + "fontFamily": 1, + "text": "buffer", + "baseline": 26.412367988632404, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "buffer" + }, + { + "type": "rectangle", + "version": 8594, + "versionNonce": 306150467, + "isDeleted": false, + "id": "t0Lm7jv4Uqovyoh3gdifz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12806.328636679795, + "y": 4051.728317966744, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1221363201, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8691, + "versionNonce": 1354210669, + "isDeleted": false, + "id": "91oVB3IrvKFXhHwP1biGW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12805.832218895532, + "y": 3976.0880588951086, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1554486927, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8777, + "versionNonce": 1848441827, + "isDeleted": false, + "id": "7QkYFrJhQcTM3nhBUz0XN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12807.49811796632, + "y": 3903.2441734520135, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1412308449, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2610, + "versionNonce": 337340365, + "isDeleted": false, + "id": "w201R2yI0d1xjhmRe1NRL", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12823.895285838986, + "y": 3918.067096292135, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 308.2869528801066, + "height": 166.83764508805757, + "seed": 1672735919, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 130.56859180804503, + "fontFamily": 1, + "text": "Part", + "baseline": 117.83764508805757, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "arrow", + "version": 3265, + "versionNonce": 1535739779, + "isDeleted": false, + "id": "Z1c6cYExM1G6PzJDzZsKg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12246.386336330486, + "y": 4015.883740840124, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 539.859357916067, + "height": 0.06538034538743887, + "seed": 1397864897, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sYKGvj4ZYFGztvmWLWbC7", + "focus": 0.8465226964412093, + "gap": 12.296465909581457 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 539.859357916067, + -0.06538034538743887 + ] + ] + }, + { + "type": "arrow", + "version": 3755, + "versionNonce": 559343149, + "isDeleted": false, + "id": "FTHurF4qeJGBxvj8o5fpQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11721.516926577138, + "y": 4053.4068377157064, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1088.0919143642882, + "height": 2.0576826928454466, + "seed": 252739279, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.6345500353195794, + "gap": 8.964248344843327 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1088.0919143642882, + 2.0576826928454466 + ] + ] + }, + { + "type": "arrow", + "version": 3995, + "versionNonce": 1888722723, + "isDeleted": false, + "id": "nmnzK2jrZye5qir7thmrP", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11718.979084065571, + "y": 4079.250110135018, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1085.8857366791058, + "height": 4.3606847360542815, + "seed": 123132321, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.6677435996583445, + "gap": 11.502090856410177 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1085.8857366791058, + 4.3606847360542815 + ] + ] + }, + { + "type": "arrow", + "version": 3984, + "versionNonce": 1263769741, + "isDeleted": false, + "id": "cUji-Br17Nea8XRPh-Tdx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11722.28484108962, + "y": 4104.806050024824, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1083.6525604448043, + "height": 5.3380759152805695, + "seed": 1633012975, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.7013371646566656, + "gap": 8.196333832361233 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1083.6525604448043, + 5.3380759152805695 + ] + ] + }, + { + "type": "text", + "version": 2125, + "versionNonce": 2008662723, + "isDeleted": false, + "id": "kpx6D1BZgInUySlMmcKMk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10662.876379519015, + "y": 4435.489757261454, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 1634532737, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "text", + "version": 2234, + "versionNonce": 1271594733, + "isDeleted": false, + "id": "oORPywmtzEdDIA38uLsmV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10508.040178570109, + "y": 3208.8911580020595, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 28, + "height": 56, + "seed": 1980520207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 471170691, + "isDeleted": false, + "id": "JejiZv2Lhs1BQDFDgWZbn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12334.981048376341, + "y": 3855.2843238079936, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 311, + "height": 59, + "seed": 13870433, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526058444, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "(buffer flush)", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(buffer flush)" + }, + { + "type": "arrow", + "version": 3552, + "versionNonce": 1766234445, + "isDeleted": false, + "id": "Oa17vadiLj-ZBcDq-DqIk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10593.318463100519, + "y": 4017.0103647230762, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1623.7136677156018, + "height": 1.5859618770700763, + "seed": 1672256815, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "hm31v-0wN6ou-nmHxIPH0", + "focus": 0.1492379286659515, + "gap": 6.042136718009715 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1623.7136677156018, + -1.5859618770700763 + ] + ] + }, + { + "type": "text", + "version": 2358, + "versionNonce": 654585347, + "isDeleted": false, + "id": "hm31v-0wN6ou-nmHxIPH0", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 9684.276326382509, + "y": 3985.212792576559, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 903, + "height": 56, + "seed": 1893355841, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Oa17vadiLj-ZBcDq-DqIk", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t + async_insert_busy_timeout_ms ", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t + async_insert_busy_timeout_ms " + }, + { + "type": "text", + "version": 2219, + "versionNonce": 1562372013, + "isDeleted": false, + "id": "KpOYZoUP4SClVKsdPAHxq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10550.943919991476, + "y": 4036.405356736873, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1570709327, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2280, + "versionNonce": 1928689059, + "isDeleted": false, + "id": "-X43xJfW7Yf_FgejE1zeg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10549.61384360674, + "y": 4066.434251750293, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 652247329, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2332, + "versionNonce": 2038458893, + "isDeleted": false, + "id": "9f_kAYbnsT2Vh1dMfEQsP", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10551.240741578482, + "y": 4095.052602904413, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 373054831, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1802, + "versionNonce": 748472643, + "isDeleted": false, + "id": "qZLys518MSHE9KFozhw9P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10764.549728213735, + "y": 2413.58935629607, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 884, + "height": 113, + "seed": 1079358721, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 1" + }, + { + "type": "text", + "version": 1926, + "versionNonce": 258056301, + "isDeleted": false, + "id": "FN_7uUXENg-Zb2CTwTub9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10766.428651374665, + "y": 2554.5657037702304, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1380, + "height": 113, + "seed": 1624037263, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "wait_for_async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "wait_for_async_insert = 1" + }, + { + "type": "rectangle", + "version": 8025, + "versionNonce": 1142325347, + "isDeleted": false, + "id": "IYdOW9I1xTMKTJosj30GX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.687808089993, + "y": 3360.0748238687197, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1130789857, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2058, + "versionNonce": 249195341, + "isDeleted": false, + "id": "_FbyIQaFzC0WBOSCXcGwb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3435.6271183764197, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1765306031, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2231, + "versionNonce": 852392963, + "isDeleted": false, + "id": "2aiIoEHfH-YeyGBsQfSIL", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3445.1414435355587, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 936269761, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2127, + "versionNonce": 74021293, + "isDeleted": false, + "id": "aV7bDtVPAiTMOI9XdIW4C", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3454.6557686946976, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 884261071, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2130, + "versionNonce": 1816527779, + "isDeleted": false, + "id": "Rh29BPVpHZ5EbvkDrW6oV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11061.71891291498, + "y": 3359.3983715612435, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 781170593, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8227, + "versionNonce": 1707588621, + "isDeleted": false, + "id": "MumMrQClgIVTc_aeyit88", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.50439559245, + "y": 3411.570744211162, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 220319471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8303, + "versionNonce": 145463107, + "isDeleted": false, + "id": "B6yh7mf8KW5M3SAqUO4RU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10945.15460483089, + "y": 3497.8041194967814, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 702159745, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2241, + "versionNonce": 1525592685, + "isDeleted": false, + "id": "AxR63i3op5_Z0lr3SxcMI", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11061.343052814149, + "y": 3410.162401231318, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 218634511, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2311, + "versionNonce": 375240419, + "isDeleted": false, + "id": "jXSzypt57Z6MwfD2r4UNC", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.918389266475, + "y": 3495.1490552881155, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 971834209, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7854, + "versionNonce": 1353178317, + "isDeleted": false, + "id": "viN28jDwCZLRzxbPm8qYD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.611222901638, + "y": 3029.992038547719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1776295727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1888, + "versionNonce": 1407902339, + "isDeleted": false, + "id": "7Bynw_FOhmEDYNADUePwl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3105.54433305542, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 991424321, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1586281261, + "isDeleted": false, + "id": "eoOIvMh_KtX2QVo1rqEwh", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3115.058658214559, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 370303311, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1957, + "versionNonce": 705796643, + "isDeleted": false, + "id": "bar4rLJDqgN6x_yIAMFd7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3124.5729833736978, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1404722977, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1960, + "versionNonce": 1829162381, + "isDeleted": false, + "id": "J3Q335dN1YkNLoV15xyBg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.642327726631, + "y": 3029.3155862402436, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 586637167, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8055, + "versionNonce": 1707105731, + "isDeleted": false, + "id": "pZTV2Gis7cMCK-GhVqRkb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.235362800808, + "y": 3081.295511286873, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 843305729, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8132, + "versionNonce": 458200045, + "isDeleted": false, + "id": "7dTfotbVGv3ZLMWMDnKgL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10947.078019642542, + "y": 3167.7213341757806, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1658296719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2071, + "versionNonce": 840281443, + "isDeleted": false, + "id": "_sP0J4vAk4xFfi2xu-BKa", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.266467625801, + "y": 3080.0796159103184, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 187943649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2141, + "versionNonce": 1701875277, + "isDeleted": false, + "id": "gNV6gfYyyn_VbrnMX7wMY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11065.841804078127, + "y": 3165.0662699671157, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1256951727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8010, + "versionNonce": 1382025475, + "isDeleted": false, + "id": "vcwOCQwmDPJLycZmVeU4j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10954.14697462351, + "y": 3682.325743899446, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1461307073, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 172178605, + "isDeleted": false, + "id": "0nQNxLhAsQg5dNDliiSX7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3757.878038407146, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 358334927, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2216, + "versionNonce": 471724195, + "isDeleted": false, + "id": "lmVGruSF5NaGuBSdM4d17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3767.392363566286, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1351960225, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 829497101, + "isDeleted": false, + "id": "G6ykDBV-0ILG6ml87D1Rt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3776.906688725424, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 591441903, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2115, + "versionNonce": 821945411, + "isDeleted": false, + "id": "USHW4L2bxJUTINt6JYu6p", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11069.178079448497, + "y": 3681.6492915919707, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 844483201, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8212, + "versionNonce": 1366537581, + "isDeleted": false, + "id": "iXptNufhM6VXOZpXhWL0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10953.771114522673, + "y": 3733.6292166386, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 513989135, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8288, + "versionNonce": 2027840483, + "isDeleted": false, + "id": "U_WUE9BHj3jgpyrUJ49Mu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10952.613771364408, + "y": 3820.0550395275077, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 890950241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2226, + "versionNonce": 1435795405, + "isDeleted": false, + "id": "ut74Ykqn19rhyLruk1o1n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11068.802219347666, + "y": 3732.4133212620445, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1551548463, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2297, + "versionNonce": 1540222851, + "isDeleted": false, + "id": "vuYuvrTMziW5dlYvcjNjn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11071.377555799992, + "y": 3817.3999753188427, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1303633473, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8180, + "versionNonce": 1007355683, + "isDeleted": false, + "id": "ziz5U4AHNE05XNxEUV_RN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.142829149712, + "y": 3357.0968931548437, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 855708961, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2213, + "versionNonce": 593932429, + "isDeleted": false, + "id": "c1PwyUB-GOq8A6H1AINUl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3432.6491876625437, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1226770799, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2386, + "versionNonce": 805579459, + "isDeleted": false, + "id": "8QoIeYrd9Biqt4x6cVhxo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3442.1635128216826, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 591644929, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2282, + "versionNonce": 1639651053, + "isDeleted": false, + "id": "_kFMFYBZspxagDHEo83ZH", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3451.6778379808216, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2054816655, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2285, + "versionNonce": 2086132323, + "isDeleted": false, + "id": "7kU808MNImIHGuzKzfLvf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11916.173933974698, + "y": 3356.4204408473674, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 80019681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8382, + "versionNonce": 2037625165, + "isDeleted": false, + "id": "9r7NcOrR4aNLUvURSOWbS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11800.959416652166, + "y": 3408.592813497286, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1454422447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8458, + "versionNonce": 1305777667, + "isDeleted": false, + "id": "ubWP0wfyZ5QsVrvlIqa4I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11799.60962589061, + "y": 3494.8261887829053, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 890518721, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2396, + "versionNonce": 401211309, + "isDeleted": false, + "id": "LL82mbBZKNEX7E97g3N9F", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11915.798073873868, + "y": 3407.184470517442, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 48999375, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2466, + "versionNonce": 863559075, + "isDeleted": false, + "id": "NTNR1x7Hz2_jl6dCQ4Dva", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11918.373410326194, + "y": 3492.1711245742395, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 869334177, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8009, + "versionNonce": 55017997, + "isDeleted": false, + "id": "BPbI-pzlVJWzz0VKmiSGn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11803.066243961357, + "y": 3027.014107833843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1799576047, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 1483944259, + "isDeleted": false, + "id": "zsHl9mSslN3hICr_if6yK", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3102.5664023415434, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1621803137, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2216, + "versionNonce": 8763501, + "isDeleted": false, + "id": "vpkaRXh35Dqj7WK7tnapD", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3112.0807275006823, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1690321935, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 2116161763, + "isDeleted": false, + "id": "7yfg7aL65VWc06PJnVieq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3121.5950526598212, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2036402273, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2115, + "versionNonce": 2037261005, + "isDeleted": false, + "id": "-PONHZbeWcaSELx-4w7xz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11918.09734878635, + "y": 3026.3376555263676, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 257616431, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8210, + "versionNonce": 907279491, + "isDeleted": false, + "id": "Ta2DTCNo-H7H5hyFrozJC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.690383860527, + "y": 3078.3175805729966, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1472418881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8287, + "versionNonce": 1654276397, + "isDeleted": false, + "id": "Z0ZmqhoY_08H9xoijWIqt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.533040702261, + "y": 3164.7434034619046, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2012990543, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2226, + "versionNonce": 1543992355, + "isDeleted": false, + "id": "xatSANBjvVijniigEF9OF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.72148868552, + "y": 3077.101685196442, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1873880097, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2296, + "versionNonce": 1634964365, + "isDeleted": false, + "id": "fQqghPsYUR6hAjb8Ut7uU", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11920.296825137846, + "y": 3162.088339253239, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 2054908527, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8165, + "versionNonce": 1340798915, + "isDeleted": false, + "id": "TN0S4WRgv9ljtxPoVxfMe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.601995683226, + "y": 3679.34781318557, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 219805697, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2198, + "versionNonce": 842242541, + "isDeleted": false, + "id": "pSHdUmsJdsopwlwDcoHfG", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3754.90010769327, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1671578767, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2371, + "versionNonce": 1876756323, + "isDeleted": false, + "id": "MJImwjrzupofDn03QZLzS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3764.41443285241, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1375555553, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2267, + "versionNonce": 1306776653, + "isDeleted": false, + "id": "hTQVLdlZDB3yRAD5ZuXJq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3773.928758011548, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1395186351, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2270, + "versionNonce": 1378624259, + "isDeleted": false, + "id": "CfA9T6orB6dHSYaWt0x7d", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11923.633100508216, + "y": 3678.6713608780947, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1953147841, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8367, + "versionNonce": 1348321965, + "isDeleted": false, + "id": "aPjHudTPMcgtXIrW6c3pI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.226135582392, + "y": 3730.651285924724, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1572318415, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8443, + "versionNonce": 1062652579, + "isDeleted": false, + "id": "PSVCS5G7PGQG0iPPypxQL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11807.068792424127, + "y": 3817.0771088136316, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1015122849, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2381, + "versionNonce": 508224781, + "isDeleted": false, + "id": "NTw2RdcN_QV6vazLQUA0d", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11923.257240407385, + "y": 3729.4353905481685, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1860647663, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2452, + "versionNonce": 1812692547, + "isDeleted": false, + "id": "ZOtFdqAWvj2Jc45Dh-hoQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11925.832576859711, + "y": 3814.4220446049667, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1114730369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 830, + "versionNonce": 1932049891, + "isDeleted": false, + "id": "qj6hv-WOiJhA9USWOHQ9p", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11771.021756865077, + "y": -323.41194902328493, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 979582115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "text", + "version": 833, + "versionNonce": 1060423117, + "isDeleted": false, + "id": "AXuo8IqvL5-2aw3co9o7t", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11790.304811255894, + "y": 2867.8935130919144, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1999681251, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "text", + "version": 717, + "versionNonce": 264046979, + "isDeleted": false, + "id": "btddqkw1cZS62_THR2GYh", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12683.94961784368, + "y": -325.0135316138835, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 1377695565, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "text", + "version": 678, + "versionNonce": 496272429, + "isDeleted": false, + "id": "VNX0MVuuZ5Kl2GuOrpQxt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12701.094559476043, + "y": 2872.2978652160627, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 1674277123, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "text", + "version": 1380, + "versionNonce": 386326819, + "isDeleted": false, + "id": "g7-WS88S7JoAMr2mrsptm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12326.288227843892, + "y": -2940.675759076498, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1678436461, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1503, + "versionNonce": 1781364365, + "isDeleted": false, + "id": "6fyUyh2YBG2MD71WbAfGC", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12323.509990871042, + "y": -2619.5338150727944, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1540880717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1559, + "versionNonce": 846513347, + "isDeleted": false, + "id": "8eDBGTeemF7ORaQbQcCC7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12324.015643259972, + "y": -2270.6228942437424, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1831670019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1572, + "versionNonce": 1874402541, + "isDeleted": false, + "id": "x_eolzVi2Mg95cM0UuSxk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12315.293707918483, + "y": 739.602421190865, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1566931203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1559, + "versionNonce": 134090573, + "isDeleted": false, + "id": "s37cDZFs6IJmoX27kEN36", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12338.720101626945, + "y": 3939.5894787966467, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 402576397, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526049982, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 2303, + "versionNonce": 509947331, + "isDeleted": false, + "id": "sjwBpE5-_ikOWdPUq0yP6", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12315.032301894369, + "y": 664.1448671068708, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 311, + "height": 59, + "seed": 1250473507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526062894, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "(buffer flush)", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(buffer flush)" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/bestpractices/images/partitioning-01.png b/docs/ja/cloud/bestpractices/images/partitioning-01.png new file mode 100644 index 00000000000..9e247f9a624 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/partitioning-01.png differ diff --git a/docs/ja/cloud/bestpractices/images/partitioning-02.png b/docs/ja/cloud/bestpractices/images/partitioning-02.png new file mode 100644 index 00000000000..d950418eb18 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/partitioning-02.png differ diff --git a/docs/ja/cloud/bestpractices/images/partitioning.excalidraw b/docs/ja/cloud/bestpractices/images/partitioning.excalidraw new file mode 100644 index 00000000000..7f9a2d7d2ad --- /dev/null +++ b/docs/ja/cloud/bestpractices/images/partitioning.excalidraw @@ -0,0 +1,2143 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 8392, + "versionNonce": 1227065807, + "isDeleted": false, + "id": "ytCCGuuNAl5mXEevQ2lnb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 1146.2109714243088, + "y": 513.407612987312, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 1187087823, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + }, + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + }, + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 648, + "versionNonce": 2054765857, + "isDeleted": false, + "id": "2U1NfEIC2koZguRQyXHWo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1178.209094859074, + "y": 549.6215312910845, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 610124449, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7474, + "versionNonce": 1947074209, + "isDeleted": false, + "id": "gNVuw3A600BXCoHv3EC7c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1265.417474754835, + "y": 994.6497055136697, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 726529007, + "groupIds": [ + "eDtfL_Sgf5F8PSFREEFF-" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1147, + "versionNonce": 309156751, + "isDeleted": false, + "id": "i5zJoABS_6-sDiT1QdU2G", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1282.616099027975, + "y": 1043.2616824546585, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 295.8908110752025, + "height": 93.15081089404521, + "seed": 1873725057, + "groupIds": [ + "eDtfL_Sgf5F8PSFREEFF-" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 73.12153761678803, + "fontFamily": 1, + "text": "p2 Part", + "baseline": 65.15081089404521, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p2 Part" + }, + { + "type": "rectangle", + "version": 7542, + "versionNonce": 449804271, + "isDeleted": false, + "id": "HBQehfo4MHRh5w3tvalRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1270.3958273975732, + "y": 1231.9362684673142, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1013423631, + "groupIds": [ + "uFV2oeSZ1fgqwbQx4K8SQ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1219, + "versionNonce": 1184720065, + "isDeleted": false, + "id": "YdUFQp_xcMayIzqoiOO6m", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1288.516377154232, + "y": 1284.2083456618957, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 287.042075503265, + "height": 91.20963146832715, + "seed": 1442074209, + "groupIds": [ + "uFV2oeSZ1fgqwbQx4K8SQ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 71.59775029774868, + "fontFamily": 1, + "text": "p3 Part", + "baseline": 64.20963146832715, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p3 Part" + }, + { + "type": "rectangle", + "version": 7251, + "versionNonce": 1442284161, + "isDeleted": false, + "id": "liaaaHSb5LS68aKA8ueyk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1263.1816070109999, + "y": 754.7917901459059, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1829176367, + "groupIds": [ + "2-WexmjQimmSUbUglwKwC" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 909, + "versionNonce": 383103471, + "isDeleted": false, + "id": "tp7k4CGVLbyjHzwDqa9tV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1286.8524369793122, + "y": 794.1194366211439, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 288, + "height": 102, + "seed": 234740289, + "groupIds": [ + "2-WexmjQimmSUbUglwKwC" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "p1 Part", + "baseline": 71, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p1 Part" + }, + { + "type": "rectangle", + "version": 8603, + "versionNonce": 1226351119, + "isDeleted": false, + "id": "6BrYz5A_65JCBILSCP-Rb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 208.66509472515827, + "y": 515.9011653592916, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 1024763471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + }, + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + }, + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 808, + "versionNonce": 1735949377, + "isDeleted": false, + "id": "SU1wj2by1cKenGjLc1kbu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 264.5118131009185, + "y": 552.8911457395243, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1219160609, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7622, + "versionNonce": 1808108129, + "isDeleted": false, + "id": "z4xzMa6CG3-iUpwM8j5t8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 664.9973159598812, + "y": 548.5807935464818, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 459867247, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1618, + "versionNonce": 1819369871, + "isDeleted": false, + "id": "nvI7iaZJc_sIHmKpMgIRb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 793.4982581488621, + "y": 1066.5072897775426, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 456.004113499861, + "height": 206.85168414643067, + "seed": 1860894209, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": 0.022857239875283614, + "gap": 11.790189979089519, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": 0.41625427260255443, + "gap": 13.679235362276813, + "elementId": "liaaaHSb5LS68aKA8ueyk" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 456.004113499861, + -206.85168414643067 + ] + ] + }, + { + "type": "arrow", + "version": 2357, + "versionNonce": 1459258081, + "isDeleted": false, + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 790.5542163049286, + "y": 1102.5390659111563, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 457.71830960552325, + "height": 0.7691905232532008, + "seed": 130850447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.12056576898605727, + "gap": 8.846148135156, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": -0.13872800851895606, + "gap": 17.144948844385, + "elementId": "gNVuw3A600BXCoHv3EC7c" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 457.71830960552325, + -0.7691905232532008 + ] + ] + }, + { + "type": "arrow", + "version": 2415, + "versionNonce": 235689903, + "isDeleted": false, + "id": "ZOS1J46buP8mtNNhrfw0Z", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 792.3176841712157, + "y": 1136.7878431507952, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 464.8585314017764, + "height": 188.7879937583566, + "seed": 532518369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.2136039098150314, + "gap": 10.6096160014431, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": -0.4506101730849665, + "gap": 13.219611824582898, + "elementId": "HBQehfo4MHRh5w3tvalRT" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 464.8585314017764, + 188.7879937583566 + ] + ] + }, + { + "type": "text", + "version": 1737, + "versionNonce": 2106011599, + "isDeleted": false, + "id": "IMMDHmEFDIX4XiDFJvLl1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -575.8442671654957, + "y": 448.52679181050735, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 511, + "height": 177, + "seed": 1962407087, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "One insert statement\nto a table \nwith a partitioning key", + "baseline": 160, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "One insert statement\nto a table \nwith a partitioning key" + }, + { + "type": "text", + "version": 1837, + "versionNonce": 1491302369, + "isDeleted": false, + "id": "Tcrvvv55VlBbr7vVgffEp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 836.67647335332, + "y": 1044.8510036585758, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1848783297, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 857289391, + "isDeleted": false, + "id": "YjlyyRnrt7Ylre3oOEZw_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 5.878136486069045, + "x": 805.6496778206056, + "y": 916.008548841548, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1788053199, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 9601, + "versionNonce": 1157072943, + "isDeleted": false, + "id": "jhBuDNqZYlJjCRfKQIRjZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": -612.5562085513739, + "y": 647.6077528341903, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 632.8936334499986, + "height": 443.819296284645, + "seed": 1600672161, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8105, + "versionNonce": 232588495, + "isDeleted": false, + "id": "rGimYRCmNzXs601Y-_DRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -596.7125836977539, + "y": 660.2425398916548, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1731712239, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2346, + "versionNonce": 234730401, + "isDeleted": false, + "id": "7e3Suymps2XLBcuGnqe2u", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -586.9085938875069, + "y": 661.6909858169511, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 680490369, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "rectangle", + "version": 8287, + "versionNonce": 547459823, + "isDeleted": false, + "id": "uN2cLElqqsu7q_mg4YUDG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.2104803172842, + "y": 720.1080842102838, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 40722191, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2528, + "versionNonce": 1646827393, + "isDeleted": false, + "id": "1YbCbJqKQ8agLm9B9SB17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -587.4064905070336, + "y": 721.55653013558, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 753343841, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "rectangle", + "version": 8398, + "versionNonce": 602889487, + "isDeleted": false, + "id": "8KwJxRA3hSvwXtSmoxXvk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -595.6929856487986, + "y": 780.327410341537, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1319937327, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2702, + "versionNonce": 1527512929, + "isDeleted": false, + "id": "zPAR13QXWuo3KVyIVbkvJ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -584.888995838548, + "y": 782.6591494062359, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 573.1653197288124, + "height": 42.96298819091612, + "seed": 1002359105, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.41208789220834, + "fontFamily": 1, + "text": "row with partitioning key value p2", + "baseline": 29.96298819091612, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p2" + }, + { + "type": "rectangle", + "version": 8506, + "versionNonce": 725541679, + "isDeleted": false, + "id": "9LIQNrk4yjEzIk4tvFO51", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -596.0797616563832, + "y": 841.8644648811187, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 2069768015, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2789, + "versionNonce": 1459055425, + "isDeleted": false, + "id": "o2FgNu9pmx50HxL9ZeUgi", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -585.7757718461326, + "y": 844.1454760331981, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 572.864491742517, + "height": 43.01371610353369, + "seed": 242612513, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.45271945581906, + "fontFamily": 1, + "text": "row with partitioning key value p3", + "baseline": 30.01371610353369, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p3" + }, + { + "type": "rectangle", + "version": 8583, + "versionNonce": 1190700367, + "isDeleted": false, + "id": "nSMnYrc18ZX6n28zgbjdM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.3075751356955, + "y": 905.2758954574438, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 920282479, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2872, + "versionNonce": 1045060385, + "isDeleted": false, + "id": "Q6BeQetN84MzgOOphoMT-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -587.1741158735385, + "y": 907.5806845167008, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 574.5950664431072, + "height": 43.14365686603535, + "seed": 108801281, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.556798178651775, + "fontFamily": 1, + "text": "row with partitioning key value p3", + "baseline": 30.14365686603535, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p3" + }, + { + "type": "rectangle", + "version": 8684, + "versionNonce": 1718952815, + "isDeleted": false, + "id": "080dLIBHN4iyHp-90Mhu3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.2995936802945, + "y": 967.1898086710771, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1349115791, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2950, + "versionNonce": 1098141441, + "isDeleted": false, + "id": "GoGIR65l13G0boADpkaiZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -588.4956038700439, + "y": 968.9469168193446, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 580.8314185457511, + "height": 43.537619107347616, + "seed": 726721761, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.872350328190464, + "fontFamily": 1, + "text": "row with partitioning key value p2", + "baseline": 30.537619107347616, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p2" + }, + { + "type": "rectangle", + "version": 8847, + "versionNonce": 2046614927, + "isDeleted": false, + "id": "BhascU_S-8OKk8c9oVSEU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -599.640084392835, + "y": 1031.7764432704407, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 440735151, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3088, + "versionNonce": 1458882273, + "isDeleted": false, + "id": "_44rpKtL53AtsvgYAPjla", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -589.8360945825843, + "y": 1033.2248891957333, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 1753456833, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "arrow", + "version": 2232, + "versionNonce": 1422414767, + "isDeleted": false, + "id": "5chJcUtzPG7EIT7tbAgEQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -667.2743215585033, + "y": 1106.5483905154306, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 839.4409531609472, + "height": 0.049243034357004944, + "seed": 194283471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 839.4409531609472, + -0.049243034357004944 + ] + ] + }, + { + "type": "text", + "version": 2047, + "versionNonce": 2036024001, + "isDeleted": false, + "id": "PaH1GTDE9O9k8-ruU5SJS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0.35292370782435256, + "x": 803.7652428088804, + "y": 1220.5199159714066, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 196337825, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 8692, + "versionNonce": 1313314369, + "isDeleted": false, + "id": "tY0lEpRAtvwvYaLCWr6rH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 1134.231348113888, + "y": -1043.3382565332922, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 577811951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "mkx18XmSxEj5Vcu4Arum6", + "type": "arrow" + }, + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + }, + { + "id": "zRPoWxUngFL8GlzLlat0E", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 947, + "versionNonce": 652897487, + "isDeleted": false, + "id": "k3bIG421DCIliNMg3xCR7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1166.2294715486532, + "y": -1007.1243382295197, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 43066497, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7776, + "versionNonce": 1280617039, + "isDeleted": false, + "id": "odJGlE-0FJvpHrIQ0RkOM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1253.437851444418, + "y": -562.0961640069345, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 98705423, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1450, + "versionNonce": 228765569, + "isDeleted": false, + "id": "QKg4x_DVd1UVUPqXrzKUZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1333.2808458953805, + "y": -513.4841870659457, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 171, + "height": 93, + "seed": 1490742369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 73.12153761678803, + "fontFamily": 1, + "text": "Part", + "baseline": 65, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 8905, + "versionNonce": 1348281889, + "isDeleted": false, + "id": "3_yFoyRHAuHMrV5fXruVD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 196.68547141473755, + "y": -1040.8447041613126, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 1742816815, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1107, + "versionNonce": 1063602991, + "isDeleted": false, + "id": "5gukj8EzYoTsYPfJxgSHB", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 252.5321897904978, + "y": -1003.8547237810799, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1986050113, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7922, + "versionNonce": 1275627631, + "isDeleted": false, + "id": "zYmWY1RWdJgQ5PzPmB-k-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 653.0176926494605, + "y": -1008.1650759741224, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 659990607, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 3259, + "versionNonce": 1766424257, + "isDeleted": false, + "id": "6mbk2of81QqkwqeCTJHEw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 778.5745929945078, + "y": -454.2068036094479, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 457.71830960552325, + "height": 0.7691905232532008, + "seed": 486672417, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.12056576898605588, + "gap": 8.846148135156, + "elementId": "3_yFoyRHAuHMrV5fXruVD" + }, + "endBinding": { + "focus": -0.1387280085189851, + "gap": 17.144948844386818, + "elementId": "odJGlE-0FJvpHrIQ0RkOM" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 457.71830960552325, + -0.7691905232532008 + ] + ] + }, + { + "type": "text", + "version": 2038, + "versionNonce": 299594529, + "isDeleted": false, + "id": "JkleSkvUtz1cgLpuEFlLW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -595.8238904759164, + "y": -1108.0194340251674, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 527, + "height": 177, + "seed": 840615535, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "One insert statement\nto a table \nwith no partitioning key", + "baseline": 160, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "One insert statement\nto a table \nwith no partitioning key" + }, + { + "type": "text", + "version": 2136, + "versionNonce": 572623727, + "isDeleted": false, + "id": "q8IymnOBsiDPsKuJ_iBLn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 824.6968500428993, + "y": -511.8948658620302, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 648961025, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 9903, + "versionNonce": 1022736897, + "isDeleted": false, + "id": "Sz1E7l4chxIw_8w_1bqa8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": -624.5358318617946, + "y": -909.2859706537874, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 632.8936334499986, + "height": 443.819296284645, + "seed": 653664399, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8406, + "versionNonce": 1406944655, + "isDeleted": false, + "id": "fOMUBMRGRcnjdpazp7psn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -608.692207008171, + "y": -896.6511835963229, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 56964065, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2648, + "versionNonce": 455073505, + "isDeleted": false, + "id": "gdhALTIy442Ipa0DWa4wQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -350.8882171979276, + "y": -895.2027376710266, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 933312175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 242924463, + "isDeleted": false, + "id": "OIjrC_2jIZyGjoZedd4Is", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.190103627705, + "y": -836.7856392776939, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 2000031681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8700, + "versionNonce": 946035393, + "isDeleted": false, + "id": "PaBqBdJZsQvP9YxksSM-G", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -607.6726089592194, + "y": -776.5663131464407, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1254394063, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8808, + "versionNonce": 1982164431, + "isDeleted": false, + "id": "wq776HHlWhs-_oxx39OOD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -608.0593849668003, + "y": -715.029258606859, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 406876065, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8885, + "versionNonce": 2072795809, + "isDeleted": false, + "id": "j2w7ND7W09iLpxz-rXGz1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.2871984461162, + "y": -651.6178280305339, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1576572655, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8986, + "versionNonce": 368368623, + "isDeleted": false, + "id": "oShdRrQzd2oRbBtnVD3yI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.2792169907152, + "y": -589.7039148169006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 213111681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9148, + "versionNonce": 357195393, + "isDeleted": false, + "id": "BP_YtM86AN_kYWrmX4ElW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -611.6197077032557, + "y": -525.117280217537, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 667279631, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 2531, + "versionNonce": 32605711, + "isDeleted": false, + "id": "XhekCJTItof9UkArjLoLv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -679.2539448689204, + "y": -450.1974790051736, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 839.4409531609472, + "height": 0.049243034357004944, + "seed": 147831649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 839.4409531609472, + -0.049243034357004944 + ] + ] + }, + { + "type": "text", + "version": 2718, + "versionNonce": 1952245345, + "isDeleted": false, + "id": "bURwFMyU6EGVRTpVpNt9e", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -355.8928036015204, + "y": -833.8691935706102, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 2040850223, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2783, + "versionNonce": 957606959, + "isDeleted": false, + "id": "c8j0IrT_RH-FBPWFVopf0", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -354.0435519338971, + "y": -772.4449061587493, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 216246081, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2865, + "versionNonce": 59994689, + "isDeleted": false, + "id": "KXf8lrRU_PcdBLk21aCfX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -355.51282038214777, + "y": -711.7679190783219, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1644046671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2938, + "versionNonce": 1195675215, + "isDeleted": false, + "id": "GktA0qQQ5YeSySgXCr8l_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -353.89789169980577, + "y": -651.8635645439626, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1666127649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 3036, + "versionNonce": 667779617, + "isDeleted": false, + "id": "ieCANeOQpEEdVo4agRv90", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -354.32853934842933, + "y": -586.8041043334179, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 237643631, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 3110, + "versionNonce": 660335727, + "isDeleted": false, + "id": "b2rV3wYSFJovt1VvCL4Qt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -353.48624321215175, + "y": -522.6312716347547, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1585548033, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/bestpractices/partitioningkey.md b/docs/ja/cloud/bestpractices/partitioningkey.md new file mode 100644 index 00000000000..99ce06be220 --- /dev/null +++ b/docs/ja/cloud/bestpractices/partitioningkey.md @@ -0,0 +1,18 @@ +--- +slug: /ja/cloud/bestpractices/low-cardinality-partitioning-key +sidebar_label: 低カーディナリティのパーティションキーを選択 +title: 低カーディナリティのパーティションキーを選択 +--- + +大量の行を含むべき[前のセクション](#ingest-data-in-bulk)で述べたインサートステートメントをClickHouse Cloudのテーブルに送信し、そのテーブルが[パーティションキー](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md)を使用していない場合、そのインサートからのすべての行データはストレージの新しいパートに書き込まれます。 + +![compression block diagram](images/partitioning-01.png) + +しかし、ClickHouse Cloudのテーブルにインサートステートメントを送信し、そのテーブルがパーティションキーを持っている場合、ClickHouseは次の処理を行います: +- インサートに含まれる行のパーティションキーの値を確認します +- 異なるパーティションキーの値ごとにストレージに新しいパートを作成します +- パーティションキーの値によって対応するパートに行を配置します + +![compression block diagram](images/partitioning-02.png) + +したがって、ClickHouse Cloudオブジェクトストレージへの書き込み要求の数を最小限に抑えるためには、低カーディナリティのパーティションキーを使用するか、テーブルにパーティションキーを使用しないようにすることをお勧めします。 diff --git a/docs/ja/cloud/changelogs/changelog-24-5.md b/docs/ja/cloud/changelogs/changelog-24-5.md new file mode 100644 index 00000000000..4e2f2fb3ac5 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-5.md @@ -0,0 +1,181 @@ +--- +slug: /ja/changelogs/24.5 +title: v24.5 Changelog for Cloud +description: Fast release changelog for v24.5 +keywords: [chaneglog, cloud] +--- + +# v24.5 Changelog for Cloud + +Relevant changes for ClickHouse Cloud services based on the v24.5 release. + +## Breaking Changes + +* Change the column name from duration_ms to duration_microseconds in the system.zookeeper table to reflect the reality that the duration is in the microsecond resolution. [#60774](https://github.com/ClickHouse/ClickHouse/pull/60774) (Duc Canh Le). + +* Don't allow to set max_parallel_replicas to 0 as it doesn't make sense. Setting it to 0 could lead to unexpected logical errors. Closes #60140. [#61201](https://github.com/ClickHouse/ClickHouse/pull/61201) (Kruglov Pavel). + +* Remove support for INSERT WATCH query (part of the experimental LIVE VIEW feature). [#62382](https://github.com/ClickHouse/ClickHouse/pull/62382) (Alexey Milovidov). + +* Usage of functions neighbor, runningAccumulate, runningDifferenceStartingWithFirstValue, runningDifference deprecated (because it is error-prone). Proper window functions should be used instead. To enable them back, set allow_deprecated_error_prone_window_functions=1. [#63132](https://github.com/ClickHouse/ClickHouse/pull/63132) (Nikita Taranov). + + +## Backward Incompatible Changes + +* In the new ClickHouse version, the functions geoDistance, greatCircleDistance, and greatCircleAngle will use 64-bit double precision floating point data type for internal calculations and return type if all the arguments are Float64. This closes #58476. In previous versions, the function always used Float32. You can switch to the old behavior by setting geo_distance_returns_float64_on_float64_arguments to false or setting compatibility to 24.2 or earlier. [#61848](https://github.com/ClickHouse/ClickHouse/pull/61848) (Alexey Milovidov). + +* Queries from system.columns will work faster if there is a large number of columns, but many databases or tables are not granted for SHOW TABLES. Note that in previous versions, if you grant SHOW COLUMNS to individual columns without granting SHOW TABLES to the corresponding tables, the system.columns table will show these columns, but in a new version, it will skip the table entirely. Remove trace log messages "Access granted" and "Access denied" that slowed down queries. [#63439](https://github.com/ClickHouse/ClickHouse/pull/63439) (Alexey Milovidov). + +* Fix crash in largestTriangleThreeBuckets. This changes the behaviour of this function and makes it to ignore NaNs in the series provided. Thus the resultset might differ from previous versions. [#62646](https://github.com/ClickHouse/ClickHouse/pull/62646) (Raúl Marín). + +## New Features + +* The new analyzer is enabled by default on new services. + +* Supports dropping multiple tables at the same time like drop table a,b,c;. [#58705](https://github.com/ClickHouse/ClickHouse/pull/58705) (zhongyuankai). + +* User can now parse CRLF with TSV format using a setting input_format_tsv_crlf_end_of_line. Closes #56257. [#59747](https://github.com/ClickHouse/ClickHouse/pull/59747) (Shaun Struwig). + +* Table engine is grantable now, and it won't affect existing users behavior. [#60117](https://github.com/ClickHouse/ClickHouse/pull/60117) (jsc0218). + +* Adds the Form Format to read/write a single record in the application/x-www-form-urlencoded format. [#60199](https://github.com/ClickHouse/ClickHouse/pull/60199) (Shaun Struwig). + +* Added possibility to compress in CROSS JOIN. [#60459](https://github.com/ClickHouse/ClickHouse/pull/60459) (p1rattttt). + +* New setting input_format_force_null_for_omitted_fields that forces NULL values for omitted fields. [#60887](https://github.com/ClickHouse/ClickHouse/pull/60887) (Constantine Peresypkin). + +* Support join with inequal conditions which involve columns from both left and right table. e.g. `t1.y < t2.y`. To enable, SET allow_experimental_join_condition = 1. [#60920](https://github.com/ClickHouse/ClickHouse/pull/60920) (lgbo). + +* Add a new function, getClientHTTPHeader. This closes #54665. Co-authored with @lingtaolf. [#61820](https://github.com/ClickHouse/ClickHouse/pull/61820) (Alexey Milovidov). + +* For convenience purpose, SELECT * FROM numbers() will work in the same way as SELECT * FROM system.numbers - without a limit. [#61969](https://github.com/ClickHouse/ClickHouse/pull/61969) (YenchangChan). + +* Modifying memory table settings through ALTER MODIFY SETTING is now supported. ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;. [#62039](https://github.com/ClickHouse/ClickHouse/pull/62039) (zhongyuankai). + +* Analyzer support recursive CTEs. [#62074](https://github.com/ClickHouse/ClickHouse/pull/62074) (Maksim Kita). + +* Earlier our s3 storage and s3 table function didn't support selecting from archive files. I created a solution that allows to iterate over files inside archives in S3. [#62259](https://github.com/ClickHouse/ClickHouse/pull/62259) (Daniil Ivanik). + +* Support for conditional function clamp. [#62377](https://github.com/ClickHouse/ClickHouse/pull/62377) (skyoct). + +* Add npy output format. [#62430](https://github.com/ClickHouse/ClickHouse/pull/62430) (豪肥肥). + +* Analyzer support QUALIFY clause. Closes #47819. [#62619](https://github.com/ClickHouse/ClickHouse/pull/62619) (Maksim Kita). + +* Added role query parameter to the HTTP interface. It works similarly to SET ROLE x, applying the role before the statement is executed. This allows for overcoming the limitation of the HTTP interface, as multiple statements are not allowed, and it is not possible to send both SET ROLE x and the statement itself at the same time. It is possible to set multiple roles that way, e.g., ?role=x&role=y, which will be an equivalent of SET ROLE x, y. [#62669](https://github.com/ClickHouse/ClickHouse/pull/62669) (Serge Klochkov). + +* Add SYSTEM UNLOAD PRIMARY KEY. [#62738](https://github.com/ClickHouse/ClickHouse/pull/62738) (Pablo Marcos). + +* Added SQL functions generateUUIDv7, generateUUIDv7ThreadMonotonic, generateUUIDv7NonMonotonic (with different monotonicity/performance trade-offs) to generate version 7 UUIDs aka. timestamp-based UUIDs with random component. Also added a new function UUIDToNum to extract bytes from a UUID and a new function UUIDv7ToDateTime to extract timestamp component from a UUID version 7. [#62852](https://github.com/ClickHouse/ClickHouse/pull/62852) (Alexey Petrunyaka). + +* Raw as a synonym for TSVRaw. [#63394](https://github.com/ClickHouse/ClickHouse/pull/63394) (Unalian). + +* Added possibility to do cross join in temporary file if size exceeds limits. [#63432](https://github.com/ClickHouse/ClickHouse/pull/63432) (p1rattttt). + +## Performance Improvements + +* Skip merging of newly created projection blocks during INSERT-s. [#59405](https://github.com/ClickHouse/ClickHouse/pull/59405) (Nikita Taranov). + +* Reduce overhead of the mutations for SELECTs (v2). [#60856](https://github.com/ClickHouse/ClickHouse/pull/60856) (Azat Khuzhin). + +* JOIN filter push down improvements using equivalent sets. [#61216](https://github.com/ClickHouse/ClickHouse/pull/61216) (Maksim Kita). + +* Add a new analyzer pass to optimize in single value. [#61564](https://github.com/ClickHouse/ClickHouse/pull/61564) (LiuNeng). + +* Process string functions XXXUTF8 'asciily' if input strings are all ASCII chars. Inspired by apache/doris#29799. Overall speed up by 1.07x~1.62x. Notice that peak memory usage had been decreased in some cases. [#61632](https://github.com/ClickHouse/ClickHouse/pull/61632) (李扬). + +* Enabled fast Parquet encoder by default (output_format_parquet_use_custom_encoder). [#62088](https://github.com/ClickHouse/ClickHouse/pull/62088) (Michael Kolupaev). + +* Improve JSONEachRowRowInputFormat by skipping all remaining fields when all required fields are read. [#62210](https://github.com/ClickHouse/ClickHouse/pull/62210) (lgbo). + +* Functions splitByChar and splitByRegexp were speed up significantly. [#62392](https://github.com/ClickHouse/ClickHouse/pull/62392) (李扬). + +* Improve trivial insert select from files in file/s3/hdfs/url/... table functions. Add separate max_parsing_threads setting to control the number of threads used in parallel parsing. [#62404](https://github.com/ClickHouse/ClickHouse/pull/62404) (Kruglov Pavel). + +* Support parallel write buffer for AzureBlobStorage managed by setting azure_allow_parallel_part_upload. [#62534](https://github.com/ClickHouse/ClickHouse/pull/62534) (SmitaRKulkarni). + +* Functions to_utc_timestamp and from_utc_timestamp are now about 2x faster. [#62583](https://github.com/ClickHouse/ClickHouse/pull/62583) (KevinyhZou). + +* Functions parseDateTimeOrNull, parseDateTimeOrZero, parseDateTimeInJodaSyntaxOrNull and parseDateTimeInJodaSyntaxOrZero now run significantly faster (10x - 1000x) when the input contains mostly non-parseable values. [#62634](https://github.com/ClickHouse/ClickHouse/pull/62634) (LiuNeng). + +* Change HostResolver behavior on fail to keep only one record per IP [#62652](https://github.com/ClickHouse/ClickHouse/pull/62652) (Anton Ivashkin). + +* Add a new configurationprefer_merge_sort_block_bytes to control the memory usage and speed up sorting 2 times when merging when there are many columns. [#62904](https://github.com/ClickHouse/ClickHouse/pull/62904) (LiuNeng). + +* QueryPlan convert OUTER JOIN to INNER JOIN optimization if filter after JOIN always filters default values. Optimization can be controlled with setting query_plan_convert_outer_join_to_inner_join, enabled by default. [#62907](https://github.com/ClickHouse/ClickHouse/pull/62907) (Maksim Kita). + +* Enable optimize_rewrite_sum_if_to_count_if by default. [#62929](https://github.com/ClickHouse/ClickHouse/pull/62929) (Raúl Marín). + +* Micro-optimizations for the new analyzer. [#63429](https://github.com/ClickHouse/ClickHouse/pull/63429) (Raúl Marín). + +* Index analysis will work if DateTime is compared to DateTime64. This closes #63441. [#63443](https://github.com/ClickHouse/ClickHouse/pull/63443) (Alexey Milovidov). + +* Speed up indices of type set a little (around 1.5 times) by removing garbage. [#64098](https://github.com/ClickHouse/ClickHouse/pull/64098) (Alexey Milovidov). + +# Improvements + +* Remove optimize_monotonous_functions_in_order_by setting this is becoming a no-op. [#63004](https://github.com/ClickHouse/ClickHouse/pull/63004) (Raúl Marín). + +* Maps can now have Float32, Float64, Array(T), Map(K,V) and Tuple(T1, T2, ...) as keys. Closes #54537. [#59318](https://github.com/ClickHouse/ClickHouse/pull/59318) (李扬). + +* Add asynchronous WriteBuffer for AzureBlobStorage similar to S3. [#59929](https://github.com/ClickHouse/ClickHouse/pull/59929) (SmitaRKulkarni). + +* Multiline strings with border preservation and column width change. [#59940](https://github.com/ClickHouse/ClickHouse/pull/59940) (Volodyachan). + +* Make RabbitMQ nack broken messages. Closes #45350. [#60312](https://github.com/ClickHouse/ClickHouse/pull/60312) (Kseniia Sumarokova). + +* Add a setting first_day_of_week which affects the first day of the week considered by functions toStartOfInterval(..., INTERVAL ... WEEK). This allows for consistency with function toStartOfWeek which defaults to Sunday as the first day of the week. [#60598](https://github.com/ClickHouse/ClickHouse/pull/60598) (Jordi Villar). + +* Added persistent virtual column _block_offset which stores original number of row in block that was assigned at insert. Persistence of column _block_offset can be enabled by setting enable_block_offset_column. Added virtual column_part_data_version which contains either min block number or mutation version of part. Persistent virtual column _block_number is not considered experimental anymore. [#60676](https://github.com/ClickHouse/ClickHouse/pull/60676) (Anton Popov). + +* Functions date_diff and age now calculate their result at nanosecond instead of microsecond precision. They now also offer nanosecond (or nanoseconds or ns) as a possible value for the unit parameter. [#61409](https://github.com/ClickHouse/ClickHouse/pull/61409) (Austin Kothig). + +* Now marks are not loaded for wide parts during merges. [#61551](https://github.com/ClickHouse/ClickHouse/pull/61551) (Anton Popov). + +* Enable output_format_pretty_row_numbers by default. It is better for usability. [#61791](https://github.com/ClickHouse/ClickHouse/pull/61791) (Alexey Milovidov). + +* The progress bar will work for trivial queries with LIMIT from system.zeros, system.zeros_mt (it already works for system.numbers and system.numbers_mt), and the generateRandom table function. As a bonus, if the total number of records is greater than the max_rows_to_read limit, it will throw an exception earlier. This closes #58183. [#61823](https://github.com/ClickHouse/ClickHouse/pull/61823) (Alexey Milovidov). + +* Add TRUNCATE ALL TABLES. [#61862](https://github.com/ClickHouse/ClickHouse/pull/61862) (豪肥肥). + +* Add a setting input_format_json_throw_on_bad_escape_sequence, disabling it allows saving bad escape sequences in JSON input formats. [#61889](https://github.com/ClickHouse/ClickHouse/pull/61889) (Kruglov Pavel). + +* Fixed grammar from "a" to "the" in the warning message. There is only one Atomic engine, so it should be "to the new Atomic engine" instead of "to a new Atomic engine". [#61952](https://github.com/ClickHouse/ClickHouse/pull/61952) (shabroo). + +* Fix logical-error when undoing quorum insert transaction. [#61953](https://github.com/ClickHouse/ClickHouse/pull/61953) (Han Fei). + +* Automatically infer Nullable column types from Apache Arrow schema. [#61984](https://github.com/ClickHouse/ClickHouse/pull/61984) (Maksim Kita). + +* Allow to cancel parallel merge of aggregate states during aggregation. Example: uniqExact. [#61992](https://github.com/ClickHouse/ClickHouse/pull/61992) (Maksim Kita). + +* Dictionary source with INVALIDATE_QUERY is not reloaded twice on startup. [#62050](https://github.com/ClickHouse/ClickHouse/pull/62050) (vdimir). + +* OPTIMIZE FINAL for ReplicatedMergeTree now will wait for currently active merges to finish and then reattempt to schedule a final merge. This will put it more in line with ordinary MergeTree behaviour. [#62067](https://github.com/ClickHouse/ClickHouse/pull/62067) (Nikita Taranov). + +* While read data from a hive text file, it would use the first line of hive text file to resize of number of input fields, and sometimes the fields number of first line is not matched with the hive table defined , such as the hive table is defined to have 3 columns, like test_tbl(a Int32, b Int32, c Int32), but the first line of text file only has 2 fields, and in this suitation, the input fields will be resized to 2, and if the next line of the text file has 3 fields, then the third field can not be read but set a default value 0, which is not right. [#62086](https://github.com/ClickHouse/ClickHouse/pull/62086) (KevinyhZou). + +* The syntax highlighting while typing in the client will work on the syntax level (previously, it worked on the lexer level). [#62123](https://github.com/ClickHouse/ClickHouse/pull/62123) (Alexey Milovidov). + +* Fix an issue where when a redundant = 1 or = 0 is added after a boolean expression involving the primary key, the primary index is not used. For example, both `SELECT * FROM WHERE IN () = 1` and `SELECT * FROM
WHERE NOT IN () = 0` will both perform a full table scan, when the primary index can be used. [#62142](https://github.com/ClickHouse/ClickHouse/pull/62142) (josh-hildred). + +* Added setting lightweight_deletes_sync (default value: 2 - wait all replicas synchronously). It is similar to setting mutations_sync but affects only behaviour of lightweight deletes. [#62195](https://github.com/ClickHouse/ClickHouse/pull/62195) (Anton Popov). + +* Distinguish booleans and integers while parsing values for custom settings: SET custom_a = true; SET custom_b = 1;. [#62206](https://github.com/ClickHouse/ClickHouse/pull/62206) (Vitaly Baranov). + +* Support S3 access through AWS Private Link Interface endpoints. Closes #60021, #31074 and #53761. [#62208](https://github.com/ClickHouse/ClickHouse/pull/62208) (Arthur Passos). + +* Client has to send header 'Keep-Alive: timeout=X' to the server. If a client receives a response from the server with that header, client has to use the value from the server. Also for a client it is better not to use a connection which is nearly expired in order to avoid connection close race. [#62249](https://github.com/ClickHouse/ClickHouse/pull/62249) (Sema Checherinda). + +* Added nano- micro- milliseconds unit for date_trunc. [#62335](https://github.com/ClickHouse/ClickHouse/pull/62335) (Misz606). + +* The query cache now no longer caches results of queries against system tables (system.*, information_schema.*, INFORMATION_SCHEMA.*). [#62376](https://github.com/ClickHouse/ClickHouse/pull/62376) (Robert Schulze). + +* MOVE PARTITION TO TABLE query can be delayed or can throw TOO_MANY_PARTS exception to avoid exceeding limits on the part count. The same settings and limits are applied as for theINSERT query (see max_parts_in_total, parts_to_delay_insert, parts_to_throw_insert, inactive_parts_to_throw_insert, inactive_parts_to_delay_insert, max_avg_part_size_for_too_many_parts, min_delay_to_insert_ms and max_delay_to_insert settings). [#62420](https://github.com/ClickHouse/ClickHouse/pull/62420) (Sergei Trifonov). + +* Make transform always return the first match. [#62518](https://github.com/ClickHouse/ClickHouse/pull/62518) (Raúl Marín). + +* Avoid evaluating table DEFAULT expressions while executing RESTORE. [#62601](https://github.com/ClickHouse/ClickHouse/pull/62601) (Vitaly Baranov). + +* Allow quota key with different auth scheme in HTTP requests. [#62842](https://github.com/ClickHouse/ClickHouse/pull/62842) (Kseniia Sumarokova). + +* Close session if user's valid_until is reached. [#63046](https://github.com/ClickHouse/ClickHouse/pull/63046) (Konstantin Bogdanov). diff --git a/docs/ja/cloud/changelogs/changelog-24-6.md b/docs/ja/cloud/changelogs/changelog-24-6.md new file mode 100644 index 00000000000..bcfc4158869 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-6.md @@ -0,0 +1,139 @@ +--- +slug: /ja/changelogs/24.6 +title: v24.6 Changelog for Cloud +description: Fast release changelog for v24.6 +keywords: [chaneglog, cloud] +--- + +# v24.6 Changelog for Cloud + +Relevant changes for ClickHouse Cloud services based on the v24.6 release. + +## Backward Incompatible Change +* Rework parallel processing in `Ordered` mode of storage `S3Queue`. This PR is backward incompatible for Ordered mode if you used settings `s3queue_processing_threads_num` or `s3queue_total_shards_num`. Setting `s3queue_total_shards_num` is deleted, previously it was allowed to use only under `s3queue_allow_experimental_sharded_mode`, which is now deprecated. A new setting is added - `s3queue_buckets`. [#64349](https://github.com/ClickHouse/ClickHouse/pull/64349) ([Kseniia Sumarokova](https://github.com/kssenii)). +* New functions `snowflakeIDToDateTime`, `snowflakeIDToDateTime64`, `dateTimeToSnowflakeID`, and `dateTime64ToSnowflakeID` were added. Unlike the existing functions `snowflakeToDateTime`, `snowflakeToDateTime64`, `dateTimeToSnowflake`, and `dateTime64ToSnowflake`, the new functions are compatible with function `generateSnowflakeID`, i.e. they accept the snowflake IDs generated by `generateSnowflakeID` and produce snowflake IDs of the same type as `generateSnowflakeID` (i.e. `UInt64`). Furthermore, the new functions default to the UNIX epoch (aka. 1970-01-01), just like `generateSnowflakeID`. If necessary, a different epoch, e.g. Twitter's/X's epoch 2010-11-04 aka. 1288834974657 msec since UNIX epoch, can be passed. The old conversion functions are deprecated and will be removed after a transition period: to use them regardless, enable setting `allow_deprecated_snowflake_conversion_functions`. [#64948](https://github.com/ClickHouse/ClickHouse/pull/64948) ([Robert Schulze](https://github.com/rschu1ze)). + +## New Feature + +* Support empty tuples. [#55061](https://github.com/ClickHouse/ClickHouse/pull/55061) ([Amos Bird](https://github.com/amosbird)). +* Add Hilbert Curve encode and decode functions. [#60156](https://github.com/ClickHouse/ClickHouse/pull/60156) ([Artem Mustafin](https://github.com/Artemmm91)). +* Add support for index analysis over `hilbertEncode`. [#64662](https://github.com/ClickHouse/ClickHouse/pull/64662) ([Artem Mustafin](https://github.com/Artemmm91)). +* Added support for reading `LINESTRING` geometry in the WKT format using function `readWKTLineString`. [#62519](https://github.com/ClickHouse/ClickHouse/pull/62519) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added new SQL functions `generateSnowflakeID` for generating Twitter-style Snowflake IDs. [#63577](https://github.com/ClickHouse/ClickHouse/pull/63577) ([Danila Puzov](https://github.com/kazalika)). +* Add support for comparing `IPv4` and `IPv6` types using the `=` operator. [#64292](https://github.com/ClickHouse/ClickHouse/pull/64292) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Support decimal arguments in binary math functions (pow, atan2, max2, min2, hypot). [#64582](https://github.com/ClickHouse/ClickHouse/pull/64582) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Added SQL functions `parseReadableSize` (along with `OrNull` and `OrZero` variants). [#64742](https://github.com/ClickHouse/ClickHouse/pull/64742) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Add `_time` virtual column to file alike storages (s3/file/hdfs/url/azureBlobStorage). [#64947](https://github.com/ClickHouse/ClickHouse/pull/64947) ([Ilya Golshtein](https://github.com/ilejn)). +* Introduced new functions `base64URLEncode`, `base64URLDecode` and `tryBase64URLDecode`. [#64991](https://github.com/ClickHouse/ClickHouse/pull/64991) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Add new function `editDistanceUTF8`, which calculates the [edit distance](https://en.wikipedia.org/wiki/Edit_distance) between two UTF8 strings. [#65269](https://github.com/ClickHouse/ClickHouse/pull/65269) ([LiuNeng](https://github.com/liuneng1994)). +* Add `http_response_headers` configuration to support custom response headers in custom HTTP handlers. [#63562](https://github.com/ClickHouse/ClickHouse/pull/63562) ([Grigorii](https://github.com/GSokol)). +* Added a new table function `loop` to support returning query results in an infinite loop. [#63452](https://github.com/ClickHouse/ClickHouse/pull/63452) ([Sariel](https://github.com/sarielwxm)). This is useful for testing. +* Introduced two additional columns in the `system.query_log`: `used_privileges` and `missing_privileges`. `used_privileges` is populated with the privileges that were checked during query execution, and `missing_privileges` contains required privileges that are missing. [#64597](https://github.com/ClickHouse/ClickHouse/pull/64597) ([Alexey Katsman](https://github.com/alexkats)). +* Added a setting `output_format_pretty_display_footer_column_names` which when enabled displays column names at the end of the table for long tables (50 rows by default), with the threshold value for minimum number of rows controlled by `output_format_pretty_display_footer_column_names_min_rows`. [#65144](https://github.com/ClickHouse/ClickHouse/pull/65144) ([Shaun Struwig](https://github.com/Blargian)). + +## Performance Improvement + +* Fix performance regression in cross join introduced in #60459 (24.5). #65243 (Nikita Taranov). +* Improve io_uring resubmits visibility. Rename profile event IOUringSQEsResubmits -> IOUringSQEsResubmitsAsync and add a new one IOUringSQEsResubmitsSync. #63699 (Tomer Shafir). +* Introduce assertions to verify all functions are called with columns of the right size. #63723 (Raúl Marín). +* Add the ability to reshuffle rows during insert to optimize for size without violating the order set by `PRIMARY KEY`. It's controlled by the setting `optimize_row_order` (off by default). [#63578](https://github.com/ClickHouse/ClickHouse/pull/63578) ([Igor Markelov](https://github.com/ElderlyPassionFruit)). +* Add a native parquet reader, which can read parquet binary to ClickHouse Columns directly. It's controlled by the setting `input_format_parquet_use_native_reader` (disabled by default). [#60361](https://github.com/ClickHouse/ClickHouse/pull/60361) ([ZhiHong Zhang](https://github.com/copperybean)). +* Support partial trivial count optimization when the query filter is able to select exact ranges from merge tree tables. [#60463](https://github.com/ClickHouse/ClickHouse/pull/60463) ([Amos Bird](https://github.com/amosbird)). +* Reduce max memory usage of multithreaded `INSERT`s by collecting chunks of multiple threads in a single transform. [#61047](https://github.com/ClickHouse/ClickHouse/pull/61047) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Reduce the memory usage when using Azure object storage by using fixed memory allocation, avoiding the allocation of an extra buffer. [#63160](https://github.com/ClickHouse/ClickHouse/pull/63160) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Reduce the number of virtual function calls in `ColumnNullable::size`. [#60556](https://github.com/ClickHouse/ClickHouse/pull/60556) ([HappenLee](https://github.com/HappenLee)). +* Speedup `splitByRegexp` when the regular expression argument is a single-character. [#62696](https://github.com/ClickHouse/ClickHouse/pull/62696) ([Robert Schulze](https://github.com/rschu1ze)). +* Speed up aggregation by 8-bit and 16-bit keys by keeping track of the min and max keys used. This allows to reduce the number of cells that need to be verified. [#62746](https://github.com/ClickHouse/ClickHouse/pull/62746) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize operator IN when the left hand side is `LowCardinality` and the right is a set of constants. [#64060](https://github.com/ClickHouse/ClickHouse/pull/64060) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Use a thread pool to initialize and destroy hash tables inside `ConcurrentHashJoin`. [#64241](https://github.com/ClickHouse/ClickHouse/pull/64241) ([Nikita Taranov](https://github.com/nickitat)). +* Optimized vertical merges in tables with sparse columns. [#64311](https://github.com/ClickHouse/ClickHouse/pull/64311) ([Anton Popov](https://github.com/CurtizJ)). +* Enabled prefetches of data from remote filesystem during vertical merges. It improves latency of vertical merges in tables with data stored on remote filesystem. [#64314](https://github.com/ClickHouse/ClickHouse/pull/64314) ([Anton Popov](https://github.com/CurtizJ)). +* Reduce redundant calls to `isDefault` of `ColumnSparse::filter` to improve performance. [#64426](https://github.com/ClickHouse/ClickHouse/pull/64426) ([Jiebin Sun](https://github.com/jiebinn)). +* Speedup `find_super_nodes` and `find_big_family` keeper-client commands by making multiple asynchronous getChildren requests. [#64628](https://github.com/ClickHouse/ClickHouse/pull/64628) ([Alexander Gololobov](https://github.com/davenger)). +* Improve function `least`/`greatest` for nullable numberic type arguments. [#64668](https://github.com/ClickHouse/ClickHouse/pull/64668) ([KevinyhZou](https://github.com/KevinyhZou)). +* Allow merging two consequent filtering steps of a query plan. This improves filter-push-down optimization if the filter condition can be pushed down from the parent step. [#64760](https://github.com/ClickHouse/ClickHouse/pull/64760) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove bad optimization in the vertical final implementation and re-enable vertical final algorithm by default. [#64783](https://github.com/ClickHouse/ClickHouse/pull/64783) ([Duc Canh Le](https://github.com/canhld94)). +* Remove ALIAS nodes from the filter expression. This slightly improves performance for queries with `PREWHERE` (with the new analyzer). [#64793](https://github.com/ClickHouse/ClickHouse/pull/64793) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Re-enable OpenSSL session caching. [#65111](https://github.com/ClickHouse/ClickHouse/pull/65111) ([Robert Schulze](https://github.com/rschu1ze)). +* Added settings to disable materialization of skip indexes and statistics on inserts (`materialize_skip_indexes_on_insert` and `materialize_statistics_on_insert`). [#64391](https://github.com/ClickHouse/ClickHouse/pull/64391) ([Anton Popov](https://github.com/CurtizJ)). +* Use the allocated memory size to calculate the row group size and reduce the peak memory of the parquet writer in the single-threaded mode. [#64424](https://github.com/ClickHouse/ClickHouse/pull/64424) ([LiuNeng](https://github.com/liuneng1994)). +* Improve the iterator of sparse column to reduce call of `size`. [#64497](https://github.com/ClickHouse/ClickHouse/pull/64497) ([Jiebin Sun](https://github.com/jiebinn)). +* Update condition to use server-side copy for backups to Azure blob storage. [#64518](https://github.com/ClickHouse/ClickHouse/pull/64518) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Optimized memory usage of vertical merges for tables with high number of skip indexes. [#64580](https://github.com/ClickHouse/ClickHouse/pull/64580) ([Anton Popov](https://github.com/CurtizJ)). + +## Improvement + +* Returned back the behaviour of how ClickHouse works and interprets Tuples in CSV format. This change effectively reverts ClickHouse/ClickHouse#60994 and makes it available only under a few settings: output_format_csv_serialize_tuple_into_separate_columns, input_format_csv_deserialize_separate_columns_into_tuple and input_format_csv_try_infer_strings_from_quoted_tuples. #65170 (Nikita Mikhaylov). +* `SHOW CREATE TABLE` executed on top of system tables will now show the super handy comment unique for each table which will explain why this table is needed. [#63788](https://github.com/ClickHouse/ClickHouse/pull/63788) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* The second argument (scale) of functions `round()`, `roundBankers()`, `floor()`, `ceil()` and `trunc()` can now be non-const. [#64798](https://github.com/ClickHouse/ClickHouse/pull/64798) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Avoid possible deadlock during MergeTree index analysis when scheduling threads in a saturated service. [#59427](https://github.com/ClickHouse/ClickHouse/pull/59427) ([Sean Haynes](https://github.com/seandhaynes)). +* Several minor corner case fixes to S3 proxy support & tunneling. [#63427](https://github.com/ClickHouse/ClickHouse/pull/63427) ([Arthur Passos](https://github.com/arthurpassos)). +* Add metrics to track the number of directories created and removed by the `plain_rewritable` metadata storage, and the number of entries in the local-to-remote in-memory map. [#64175](https://github.com/ClickHouse/ClickHouse/pull/64175) ([Julia Kartseva](https://github.com/jkartseva)). +* The query cache now considers identical queries with different settings as different. This increases robustness in cases where different settings (e.g. `limit` or `additional_table_filters`) would affect the query result. [#64205](https://github.com/ClickHouse/ClickHouse/pull/64205) ([Robert Schulze](https://github.com/rschu1ze)). +* Support the non standard error code `QpsLimitExceeded` in object storage as a retryable error. [#64225](https://github.com/ClickHouse/ClickHouse/pull/64225) ([Sema Checherinda](https://github.com/CheSema)). +* Added a new setting `input_format_parquet_prefer_block_bytes` to control the average output block bytes, and modified the default value of `input_format_parquet_max_block_size` to 65409. [#64427](https://github.com/ClickHouse/ClickHouse/pull/64427) ([LiuNeng](https://github.com/liuneng1994)). +* Settings from the user's config don't affect merges and mutations for `MergeTree` on top of object storage. [#64456](https://github.com/ClickHouse/ClickHouse/pull/64456) ([alesapin](https://github.com/alesapin)). +* Support the non standard error code `TotalQpsLimitExceeded` in object storage as a retryable error. [#64520](https://github.com/ClickHouse/ClickHouse/pull/64520) ([Sema Checherinda](https://github.com/CheSema)). +* Updated Advanced Dashboard for both open-source and ClickHouse Cloud versions to include a chart for 'Maximum concurrent network connections'. [#64610](https://github.com/ClickHouse/ClickHouse/pull/64610) ([Thom O'Connor](https://github.com/thomoco)). +* Improve progress report on `zeros_mt` and `generateRandom`. [#64804](https://github.com/ClickHouse/ClickHouse/pull/64804) ([Raúl Marín](https://github.com/Algunenano)). +* Add an asynchronous metric `jemalloc.profile.active` to show whether sampling is currently active. This is an activation mechanism in addition to prof.active; both must be active for the calling thread to sample. [#64842](https://github.com/ClickHouse/ClickHouse/pull/64842) ([Unalian](https://github.com/Unalian)). +* Remove mark of `allow_experimental_join_condition` as important. This mark may have prevented distributed queries in a mixed versions cluster from being executed successfully. [#65008](https://github.com/ClickHouse/ClickHouse/pull/65008) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added server Asynchronous metrics `DiskGetObjectThrottler*` and `DiskGetObjectThrottler*` reflecting request per second rate limit defined with `s3_max_get_rps` and `s3_max_put_rps` disk settings and currently available number of requests that could be sent without hitting throttling limit on the disk. Metrics are defined for every disk that has a configured limit. [#65050](https://github.com/ClickHouse/ClickHouse/pull/65050) ([Sergei Trifonov](https://github.com/serxa)). +* Add a validation when creating a user with `bcrypt_hash`. [#65242](https://github.com/ClickHouse/ClickHouse/pull/65242) ([Raúl Marín](https://github.com/Algunenano)). +* Add profile events for number of rows read during/after `PREWHERE`. [#64198](https://github.com/ClickHouse/ClickHouse/pull/64198) ([Nikita Taranov](https://github.com/nickitat)). +* Print query in `EXPLAIN PLAN` with parallel replicas. [#64298](https://github.com/ClickHouse/ClickHouse/pull/64298) ([vdimir](https://github.com/vdimir)). +* Rename `allow_deprecated_functions` to `allow_deprecated_error_prone_window_functions`. [#64358](https://github.com/ClickHouse/ClickHouse/pull/64358) ([Raúl Marín](https://github.com/Algunenano)). +* Respect `max_read_buffer_size` setting for file descriptors as well in the `file` table function. [#64532](https://github.com/ClickHouse/ClickHouse/pull/64532) ([Azat Khuzhin](https://github.com/azat)). +* Disable transactions for unsupported storages even for materialized views. [#64918](https://github.com/ClickHouse/ClickHouse/pull/64918) ([alesapin](https://github.com/alesapin)). +* Forbid `QUALIFY` clause in the old analyzer. The old analyzer ignored `QUALIFY`, so it could lead to unexpected data removal in mutations. [#65356](https://github.com/ClickHouse/ClickHouse/pull/65356) ([Dmitry Novik](https://github.com/novikd)). + +## Bug Fix (user-visible misbehavior in an official stable release) +* Fixed 'set' skip index not working with IN and indexHint(). #62083 (Michael Kolupaev). +* Fix queries with FINAL give wrong result when table does not use adaptive granularity. #62432 (Duc Canh Le). +* Support executing function during assignment of parameterized view value. #63502 (SmitaRKulkarni). +* Fixed parquet memory tracking. #63584 (Michael Kolupaev). +* Fix rare case with missing data in the result of distributed query. #63691 (vdimir). +* Fixed reading of columns of type Tuple(Map(LowCardinality(String), String), ...). #63956 (Anton Popov). +* Fix resolve of unqualified COLUMNS matcher. Preserve the input columns order and forbid usage of unknown identifiers. #63962 (Dmitry Novik). +* Fix an Cyclic aliases error for cyclic aliases of different type (expression and function). #63993 (Nikolai Kochetov). +* This fix will use a proper redefined context with the correct definer for each individual view in the query pipeline. #64079 (pufit). +* Fix analyzer: "Not found column" error is fixed when using INTERPOLATE. #64096 (Yakov Olkhovskiy). +* Prevent LOGICAL_ERROR on CREATE TABLE as MaterializedView. #64174 (Raúl Marín). +* The query cache now considers two identical queries against different databases as different. The previous behavior could be used to bypass missing privileges to read from a table. #64199 (Robert Schulze). +* Fix possible abort on uncaught exception in ~WriteBufferFromFileDescriptor in StatusFile. #64206 (Kruglov Pavel). +* Fix duplicate alias error for distributed queries with ARRAY JOIN. #64226 (Nikolai Kochetov). +* Fix unexpected accurateCast from string to integer. #64255 (wudidapaopao). +* Fixed CNF simplification, in case any OR group contains mutually exclusive atoms. #64256 (Eduard Karacharov). +* Fix Query Tree size validation. #64377 (Dmitry Novik). +* Fix Logical error: Bad cast for Buffer table with PREWHERE. #64388 (Nikolai Kochetov). +* Fixed CREATE TABLE AS queries for tables with default expressions. #64455 (Anton Popov). +* Fixed optimize_read_in_order behaviour for ORDER BY ... NULLS FIRST / LAST on tables with nullable keys. #64483 (Eduard Karacharov). +* Fix the Expression nodes list expected 1 projection names and Unknown expression or identifier errors for queries with aliases to GLOBAL IN.. #64517 (Nikolai Kochetov). +* Fix an error Cannot find column in distributed queries with constant CTE in the GROUP BY key. #64519 (Nikolai Kochetov). +* Fix the output of function formatDateTimeInJodaSyntax when a formatter generates an uneven number of characters and the last character is 0. For example, SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D') now correctly returns 150 instead of previously 15. #64614 (LiuNeng). +* Do not rewrite aggregation if -If combinator is already used. #64638 (Dmitry Novik). +* Fix type inference for float (in case of small buffer, i.e. --max_read_buffer_size 1). #64641 (Azat Khuzhin). +* Fix bug which could lead to non-working TTLs with expressions. #64694 (alesapin). +* Fix removing the WHERE and PREWHERE expressions, which are always true (for the new analyzer). #64695 (Nikolai Kochetov). +* Fixed excessive part elimination by token-based text indexes (ngrambf , full_text) when filtering by result of startsWith, endsWith, match, multiSearchAny. #64720 (Eduard Karacharov). +* Fixes incorrect behaviour of ANSI CSI escaping in the UTF8::computeWidth function. #64756 (Shaun Struwig). +* Fix a case of incorrect removal of ORDER BY / LIMIT BY across subqueries. #64766 (Raúl Marín). +* Fix (experimental) unequal join with subqueries for sets which are in the mixed join conditions. #64775 (lgbo). +* Fix crash in a local cache over plain_rewritable disk. #64778 (Julia Kartseva). +* Fix Cannot find column in distributed query with ARRAY JOIN by Nested column. Fixes #64755. #64801 (Nikolai Kochetov). +* Fix memory leak in slru cache policy. #64803 (Kseniia Sumarokova). +* Fixed possible incorrect memory tracking in several kinds of queries: queries that read any data from S3, queries via http protocol, asynchronous inserts. #64844 (Anton Popov). +* Fix the Block structure mismatch error for queries reading with PREWHERE from the materialized view when the materialized view has columns of different types than the source table. Fixes #64611. #64855 (Nikolai Kochetov). +* Fix rare crash when table has TTL with subquery + database replicated + parallel replicas + analyzer. It's really rare, but please don't use TTLs with subqueries. #64858 (alesapin). +* Fix ALTER MODIFY COMMENT query that was broken for parameterized VIEWs in ClickHouse/ClickHouse#54211. #65031 (Nikolay Degterinsky). +* Fix host_id in DatabaseReplicated when cluster_secure_connection parameter is enabled. Previously all the connections within the cluster created by DatabaseReplicated were not secure, even if the parameter was enabled. #65054 (Nikolay Degterinsky). +* Fixing the Not-ready Set error after the PREWHERE optimization for StorageMerge. #65057 (Nikolai Kochetov). +* Avoid writing to finalized buffer in File-like storages. #65063 (Kruglov Pavel). +* Fix possible infinite query duration in case of cyclic aliases. Fixes #64849. #65081 (Nikolai Kochetov). +* Fix the Unknown expression identifier error for remote queries with INTERPOLATE (alias) (new analyzer). Fixes #64636. #65090 (Nikolai Kochetov). +* Fix pushing arithmetic operations out of aggregation. In the new analyzer, optimization was applied only once. #65104 (Dmitry Novik). +* Fix aggregate function name rewriting in the new analyzer. #65110 (Dmitry Novik). +* Respond with 5xx instead of 200 OK in case of receive timeout while reading (parts of) the request body from the client socket. #65118 (Julian Maicher). +* Fix possible crash for hedged requests. #65206 (Azat Khuzhin). +* Fix the bug in Hashed and Hashed_Array dictionary short circuit evaluation, which may read uninitialized number, leading to various errors. #65256 (jsc0218). +* This PR ensures that the type of the constant(IN operator's second parameter) is always visible during the IN operator's type conversion process. Otherwise, losing type information may cause some conversions to fail, such as the conversion from DateTime to Date. fix (#64487). #65315 (pn). \ No newline at end of file diff --git a/docs/ja/cloud/changelogs/changelog-24-8.md b/docs/ja/cloud/changelogs/changelog-24-8.md new file mode 100644 index 00000000000..e1b53785d38 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-8.md @@ -0,0 +1,65 @@ +--- +slug: /ja/changelogs/24.8 +title: v24.8 Changelog for Cloud +description: Fast release changelog for v24.8 +keywords: [chaneglog, cloud] +--- + +Relevant changes for ClickHouse Cloud services based on the v24.8 release. + +## Backward Incompatible Change + +- Change binary serialization of Variant data type: add compact mode to avoid writing the same discriminator multiple times for granules with single variant or with only NULL values. Add MergeTree setting use_compact_variant_discriminators_serialization that is enabled by default. Note that Variant type is still experimental and backward-incompatible change in serialization should not impact you unless you have been working with support to get this feature enabled earlier. [#62774](https://github.com/ClickHouse/ClickHouse/pull/62774) (Kruglov Pavel). + +- Forbid CREATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ... with Replicated databases. This specific PR is only applicable to users still using, ReplicatedMergeTree. [#63963](https://github.com/ClickHouse/ClickHouse/pull/63963) (vdimir). + +- Metric KeeperOutstandingRequets was renamed to KeeperOutstandingRequests. This fixes a typo reported in [#66179](https://github.com/ClickHouse/ClickHouse/issues/66179). [#66206](https://github.com/ClickHouse/ClickHouse/pull/66206) (Robert Schulze). + +- clickhouse-client and clickhouse-local now default to multi-query mode (instead single-query mode). As an example, clickhouse-client -q "SELECT 1; SELECT 2" now works, whereas users previously had to add --multiquery (or -n). The --multiquery/-n switch became obsolete. INSERT queries in multi-query statements are treated specially based on their FORMAT clause: If the FORMAT is VALUES (the most common case), the end of the INSERT statement is represented by a trailing semicolon ; at the end of the query. For all other FORMATs (e.g. CSV or JSONEachRow), the end of the INSERT statement is represented by two newlines \n\n at the end of the query. [#63898](https://github.com/ClickHouse/ClickHouse/pull/63898) (wxybear). + +- In previous versions, it was possible to use an alternative syntax for LowCardinality data types by appending WithDictionary to the name of the data type. It was an initial working implementation, and it was never documented or exposed to the public. Now, it is deprecated. If you have used this syntax, you have to ALTER your tables and rename the data types to LowCardinality. [#66842](https://github.com/ClickHouse/ClickHouse/pull/66842)(Alexey Milovidov). + +- Fix logical errors with storage Buffer used with distributed destination table. It's a backward incompatible change: queries using Buffer with a distributed destination table may stop working if the table appears more than once in the query (e.g., in a self-join). [#67015](https://github.com/vdimir) (vdimir). + +- In previous versions, calling functions for random distributions based on the Gamma function (such as Chi-Squared, Student, Fisher) with negative arguments close to zero led to a long computation or an infinite loop. In the new version, calling these functions with zero or negative arguments will produce an exception. This closes [#67297](https://github.com/ClickHouse/ClickHouse/issues/67297). [#67326](https://github.com/ClickHouse/ClickHouse/pull/67326) (Alexey Milovidov). + +- In previous versions, arrayWithConstant can be slow if asked to generate very large arrays. In the new version, it is limited to 1 GB per array. This closes [#32754](https://github.com/ClickHouse/ClickHouse/issues/32754). [#67741](https://github.com/ClickHouse/ClickHouse/pull/67741) (Alexey Milovidov). + +- Fix REPLACE modifier formatting (forbid omitting brackets). [#67774](https://github.com/ClickHouse/ClickHouse/pull/67774) (Azat Khuzhin). + + +## New Feature + +- Extend function tuple to construct named tuples in query. Introduce function tupleNames to extract names from tuples. [#54881](https://github.com/ClickHouse/ClickHouse/pull/54881) (Amos Bird). + +- ASOF JOIN support for full_sorting_join algorithm Close [#54493](https://github.com/ClickHouse/ClickHouse/issues/54493). [#55051](https://github.com/ClickHouse/ClickHouse/pull/55051) (vdimir). + +- A new table function, fuzzQuery, was added. This function allows you to modify a given query string with random variations. Example: SELECT query FROM fuzzQuery('SELECT 1');. [#62103](https://github.com/ClickHouse/ClickHouse/pull/62103) (pufit). + +- Add new window function percent_rank. [#62747](https://github.com/ClickHouse/ClickHouse/pull/62747) (lgbo). + +- Support JWT authentication in clickhouse-client. [#62829](https://github.com/ClickHouse/ClickHouse/pull/62829) (Konstantin Bogdanov). + +- Add SQL functions changeYear, changeMonth, changeDay, changeHour, changeMinute, changeSecond. For example, SELECT changeMonth(toDate('2024-06-14'), 7) returns date 2024-07-14. [#63186](https://github.com/ClickHouse/ClickHouse/pull/63186) (cucumber95). + +- Add system.error_log which contains history of error values from table system.errors, periodically flushed to disk. [#65381](https://github.com/ClickHouse/ClickHouse/pull/65381) (Pablo Marcos). + +- Add aggregate function groupConcat. About the same as arrayStringConcat( groupArray(column), ',') Can receive 2 parameters: a string delimiter and the number of elements to be processed. [#65451](https://github.com/ClickHouse/ClickHouse/pull/65451) (Yarik Briukhovetskyi). + +- Add AzureQueue storage. [#65458](https://github.com/ClickHouse/ClickHouse/pull/65458) (Kseniia Sumarokova). + +- Add a new setting to disable/enable writing page index into parquet files. [#65475](https://github.com/ClickHouse/ClickHouse/pull/65475) (lgbo). + +- Automatically append a wildcard * to the end of a directory path with table function file. [#66019](https://github.com/ClickHouse/ClickHouse/pull/66019) (Zhidong (David) Guo). + +- Add --memory-usage option to client in non interactive mode. [#66393](https://github.com/ClickHouse/ClickHouse/pull/66393) (vdimir). + +- Add _etag virtual column for S3 table engine. Fixes [#65312](https://github.com/ClickHouse/ClickHouse/issues/65312). [#65386](https://github.com/ClickHouse/ClickHouse/pull/65386) (skyoct) + +- This pull request introduces Hive-style partitioning for different engines (File, URL, S3, AzureBlobStorage, HDFS). Hive-style partitioning organizes data into partitioned sub-directories, making it efficient to query and manage large datasets. Currently, it only creates virtual columns with the appropriate name and data. The follow-up PR will introduce the appropriate data filtering (performance speedup). [#65997](https://github.com/ClickHouse/ClickHouse/pull/65997) (Yarik Briukhovetskyi). + +- Add function printf for spark compatiability. [#66257](https://github.com/ClickHouse/ClickHouse/pull/66257) (李扬). + +- Added support for reading MULTILINESTRING geometry in WKT format using function readWKTLineString. [#67647](https://github.com/ClickHouse/ClickHouse/pull/67647) (Jacob Reckhard). + +- Added a tagging (namespace) mechanism for the query cache. The same queries with different tags are considered different by the query cache. Example: SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc' and SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def' now create different query cache entries. [#68235](https://github.com/ClickHouse/ClickHouse/pull/68235)(sakulali). \ No newline at end of file diff --git a/docs/ja/cloud/images/sqlconsole/abc.png b/docs/ja/cloud/images/sqlconsole/abc.png new file mode 100644 index 00000000000..be7ecb98e26 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/abc.png differ diff --git a/docs/ja/cloud/images/sqlconsole/add-more-filters.png b/docs/ja/cloud/images/sqlconsole/add-more-filters.png new file mode 100644 index 00000000000..ed228d9cfe6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/add-more-filters.png differ diff --git a/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png b/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png new file mode 100644 index 00000000000..185c7484471 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png differ diff --git a/docs/ja/cloud/images/sqlconsole/authentication-success.png b/docs/ja/cloud/images/sqlconsole/authentication-success.png new file mode 100644 index 00000000000..183e90d5367 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/authentication-success.png differ diff --git a/docs/ja/cloud/images/sqlconsole/bar-chart.png b/docs/ja/cloud/images/sqlconsole/bar-chart.png new file mode 100644 index 00000000000..10c251cb76d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/bar-chart.png differ diff --git a/docs/ja/cloud/images/sqlconsole/cancel-a-query.png b/docs/ja/cloud/images/sqlconsole/cancel-a-query.png new file mode 100644 index 00000000000..97f01a60f40 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/cancel-a-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png b/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png new file mode 100644 index 00000000000..574e12cbf4b Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png differ diff --git a/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png b/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png new file mode 100644 index 00000000000..19ef230145b Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png differ diff --git a/docs/ja/cloud/images/sqlconsole/creating-a-query.png b/docs/ja/cloud/images/sqlconsole/creating-a-query.png new file mode 100644 index 00000000000..eae12583eeb Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/creating-a-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/download-as-csv.png b/docs/ja/cloud/images/sqlconsole/download-as-csv.png new file mode 100644 index 00000000000..5910d502524 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/download-as-csv.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-completed.png b/docs/ja/cloud/images/sqlconsole/endpoints-completed.png new file mode 100644 index 00000000000..55f3c5dd1fb Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-completed.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-configure.png b/docs/ja/cloud/images/sqlconsole/endpoints-configure.png new file mode 100644 index 00000000000..75c4f934187 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-configure.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png b/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png new file mode 100644 index 00000000000..ae91e705ce5 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png b/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png new file mode 100644 index 00000000000..44917ae8f69 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png b/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png new file mode 100644 index 00000000000..1ad8cdb79ea Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png b/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png new file mode 100644 index 00000000000..ffa80de31f6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png b/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png new file mode 100644 index 00000000000..f51f86e50bf Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png differ diff --git a/docs/ja/cloud/images/sqlconsole/enter-credentials.png b/docs/ja/cloud/images/sqlconsole/enter-credentials.png new file mode 100644 index 00000000000..0da62a82d16 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/enter-credentials.png differ diff --git a/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png b/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png new file mode 100644 index 00000000000..966fa17306d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png differ diff --git a/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png b/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png new file mode 100644 index 00000000000..323ea9d8073 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png differ diff --git a/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png b/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png new file mode 100644 index 00000000000..3cb64dca734 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_drilldown.png b/docs/ja/cloud/images/sqlconsole/insights_drilldown.png new file mode 100644 index 00000000000..3063dc50aef Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_drilldown.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_latency.png b/docs/ja/cloud/images/sqlconsole/insights_latency.png new file mode 100644 index 00000000000..34e768dc013 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_latency.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_overview.png b/docs/ja/cloud/images/sqlconsole/insights_overview.png new file mode 100644 index 00000000000..12f5221a896 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_overview.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_query_info.png b/docs/ja/cloud/images/sqlconsole/insights_query_info.png new file mode 100644 index 00000000000..adbb15624c9 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_query_info.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_recent.png b/docs/ja/cloud/images/sqlconsole/insights_recent.png new file mode 100644 index 00000000000..35ec081553e Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_recent.png differ diff --git a/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png b/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png new file mode 100644 index 00000000000..63116ec7a7e Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png differ diff --git a/docs/ja/cloud/images/sqlconsole/match-in-body.png b/docs/ja/cloud/images/sqlconsole/match-in-body.png new file mode 100644 index 00000000000..936a24cc80a Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/match-in-body.png differ diff --git a/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png b/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png new file mode 100644 index 00000000000..f236cf96bee Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png differ diff --git a/docs/ja/cloud/images/sqlconsole/pagination-nav.png b/docs/ja/cloud/images/sqlconsole/pagination-nav.png new file mode 100644 index 00000000000..ccb488d4541 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/pagination-nav.png differ diff --git a/docs/ja/cloud/images/sqlconsole/pagination.png b/docs/ja/cloud/images/sqlconsole/pagination.png new file mode 100644 index 00000000000..6bfe15f50f8 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/pagination.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png b/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png new file mode 100644 index 00000000000..d1ad23258a0 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-at-cursor.png b/docs/ja/cloud/images/sqlconsole/run-at-cursor.png new file mode 100644 index 00000000000..54aed6713b8 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-at-cursor.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-selected-query.png b/docs/ja/cloud/images/sqlconsole/run-selected-query.png new file mode 100644 index 00000000000..7c986647088 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-selected-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/save-the-query.png b/docs/ja/cloud/images/sqlconsole/save-the-query.png new file mode 100644 index 00000000000..41ee8ba62fd Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/save-the-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/search-github.png b/docs/ja/cloud/images/sqlconsole/search-github.png new file mode 100644 index 00000000000..0359429b05d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/search-github.png differ diff --git a/docs/ja/cloud/images/sqlconsole/select-a-service.png b/docs/ja/cloud/images/sqlconsole/select-a-service.png new file mode 100644 index 00000000000..408a5167cae Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/select-a-service.png differ diff --git a/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png b/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png new file mode 100644 index 00000000000..58d47f8740d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png differ diff --git a/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png b/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png new file mode 100644 index 00000000000..d8f23e4d2ec Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png differ diff --git a/docs/ja/cloud/images/sqlconsole/switch-services.png b/docs/ja/cloud/images/sqlconsole/switch-services.png new file mode 100644 index 00000000000..9ca0834e0cd Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/switch-services.png differ diff --git a/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png b/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png new file mode 100644 index 00000000000..533bf98b6e6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png differ diff --git a/docs/ja/cloud/images/sqlconsole/tabular-query-results.png b/docs/ja/cloud/images/sqlconsole/tabular-query-results.png new file mode 100644 index 00000000000..429db85a22d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/tabular-query-results.png differ diff --git a/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png b/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png new file mode 100644 index 00000000000..6cc38b441e1 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png differ diff --git a/docs/ja/cloud/images/sqlconsole/update-query-name.png b/docs/ja/cloud/images/sqlconsole/update-query-name.png new file mode 100644 index 00000000000..0501e03c50d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/update-query-name.png differ diff --git a/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png b/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png new file mode 100644 index 00000000000..f6e11642e74 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png differ diff --git a/docs/ja/cloud/images/sqlconsole/view-columns.png b/docs/ja/cloud/images/sqlconsole/view-columns.png new file mode 100644 index 00000000000..fd7d2eeb449 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/view-columns.png differ diff --git a/docs/ja/cloud/manage/_category_.yml b/docs/ja/cloud/manage/_category_.yml new file mode 100644 index 00000000000..59089856c86 --- /dev/null +++ b/docs/ja/cloud/manage/_category_.yml @@ -0,0 +1,6 @@ +label: 'Manage Cloud' +collapsible: true +collapsed: true +link: + type: generated-index + title: Manage ClickHouse Cloud diff --git a/docs/ja/cloud/manage/account-close.md b/docs/ja/cloud/manage/account-close.md new file mode 100644 index 00000000000..e36a627365c --- /dev/null +++ b/docs/ja/cloud/manage/account-close.md @@ -0,0 +1,53 @@ +--- +sidebar_label: アカウント削除 +slug: /ja/cloud/manage/close_account +title: アカウントクローズと削除 +--- + +## アカウントクローズと削除 + +私たちの目標は、あなたのプロジェクトが成功することです。このサイトで回答されていない質問や特定のユースケースの評価が必要な場合は、[support@clickhouse.com](mailto:support@clickhouse.com)までお問い合わせください。 + +時にはアカウントクローズが必要となる状況があることも理解しています。このガイドは、そのプロセスを支援するためのものです。 + +## クローズと削除の違い + +顧客はクローズされたアカウントに再ログインして、使用状況、請求、アカウントレベルのアクティビティログを確認できます。これにより、ユースケースの文書化から年末の税金用の請求書のダウンロードにいたるまで、さまざまな目的に役立つ詳細に簡単にアクセスできます。また、クローズされたアカウントは新しいサービスを開始するためにいつでも再開することができます。 + +個人データの削除を要求する顧客は、このプロセスが不可逆であることを認識してください。アカウントおよび関連情報は利用できなくなります。製品の更新情報は受け取れず、アカウントを再開することもできません。これはニュースレターの購読には影響しません。 + +ニュースレターの購読者は、アカウントをクローズしたり情報を削除したりせずに、ニュースレターのメール末尾の購読解除リンクを使用していつでも購読解除できます。 + +## クローズの準備 + +アカウントクローズを要求する前に、次の手順を実行してアカウントを準備してください。 + +1. 保存が必要なサービスからデータをエクスポートします。 +2. サービスを停止し削除します。これにより、アカウントで追加の料金が発生することを防げます。 +3. クローズを要求する管理者以外のすべてのユーザーを削除します。これにより、プロセスが完了する間に新しいサービスが作成されることを防ぐことができます。 +4. コントロールパネルの 'Usage'(使用状況) と'Billing'(請求) タブを確認し、すべての料金が支払われていることを確認します。未払い残高のあるアカウントはクローズできません。 + +## アカウントクローズを要求 + +クローズと削除の要求を認証することが求められます。要求が迅速に処理されるように、以下の手順に従ってください。 + +1. clickhouse.cloudアカウントにサインインします。 +2. 上記の _クローズの準備_ セクションの残りの手順を完了します。 +3. 画面右上のヘルプボタン(質問マーク)をクリックします。 +4. 'Support'(サポート) の下で 'Create case.'(ケース作成) をクリックします。 +5. 'Create new case'(新しいケースの作成) 画面で次の情報を入力します。 +``` +Priority: Severity 3 +Subject: Please close my ClickHouse account +Description: We would appreciate it if you would share a brief note about why you are cancelling. +``` +1. 'Create new case'(新しいケースの作成) をクリックします。 +2. アカウントをクローズし、完了時に確認メールを送信します。 + +## 個人データ削除の要求 + +ClickHouseから個人データ削除を要求できるのはアカウント管理者のみです。アカウント管理者でない場合は、ClickHouseアカウント管理者に連絡してアカウントからの削除を要求してください。 + +データ削除を要求するには、上記の「アカウントクローズの要求」の手順に従ってください。ケース情報を入力する際に、件名を 'Please close my ClickHouse account and delete my personal data.'(私のClickHouseアカウントをクローズし、個人データを削除してください) に変更してください。 + +個人データ削除の要求は30日以内に完了します。 diff --git a/docs/ja/cloud/manage/api/api-overview.md b/docs/ja/cloud/manage/api/api-overview.md new file mode 100644 index 00000000000..71133cd3324 --- /dev/null +++ b/docs/ja/cloud/manage/api/api-overview.md @@ -0,0 +1,32 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +--- + +# ClickHouse Cloud API + +## 概要 + +ClickHouse Cloud APIは、ClickHouse Cloud上の組織やサービスを簡単に管理できるように設計されたREST APIです。このCloud APIを使用すると、サービスの作成や管理、APIキーのプロビジョニング、組織内のメンバーの追加または削除などが可能です。 + +[最初のAPIキーを作成してClickHouse Cloud APIの使用を開始する方法を学びましょう。](/docs/ja/cloud/manage/openapi.md) + +## レート制限 + +開発者は、1つの組織につき100個のAPIキーに制限されています。各APIキーは、10秒間のウィンドウ内で10回のリクエストに制限されています。組織のためにAPIキーや10秒ごとのリクエスト数を増やしたい場合は、support@clickhouse.comまでご連絡ください。 + +## Terraformプロバイダー + +公式のClickHouse Terraformプロバイダーを利用すると、[コードとしてのインフラストラクチャ](https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac)を使用して、予測可能でバージョン管理された設定を作成し、デプロイメントのエラー発生を大幅に減らすことができます。 + +Terraformプロバイダーのドキュメントは、[Terraformレジストリ](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)で閲覧できます。 + +ClickHouse Terraformプロバイダーに貢献したい場合は、[GitHubリポジトリ](https://github.com/ClickHouse/terraform-provider-clickhouse)でソースを確認できます。 + +## Swagger(OpenAPI)エンドポイントとUI + +ClickHouse Cloud APIはオープンソースの[OpenAPI仕様](https://www.openapis.org/)に基づいて構築されており、クライアント側での予測可能な利用を可能にします。ClickHouse Cloud APIドキュメントをプログラムで利用する必要がある場合は、https://api.clickhouse.cloud/v1を通してJSONベースのSwaggerエンドポイントを提供しています。当社のAPIリファレンスドキュメントは、同じエンドポイントから自動生成されています。Swagger UIを通してAPIドキュメントを閲覧したい場合は、[こちら](https://clickhouse.com/docs/ja/cloud/manage/api/swagger)をクリックしてください。 + +## サポート + +迅速なサポートを得るには、まず[当社のSlackチャネル](https://clickhouse.com/slack)を訪れることをお勧めします。APIやその機能に関して追加のヘルプや詳細情報が必要な場合は、https://clickhouse.cloud/supportでClickHouseサポートにお問い合わせください。 diff --git a/docs/ja/cloud/manage/api/invitations-api-reference.md b/docs/ja/cloud/manage/api/invitations-api-reference.md new file mode 100644 index 00000000000..edd820393c3 --- /dev/null +++ b/docs/ja/cloud/manage/api/invitations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 招待 +title: 招待 +--- + +## すべての招待を一覧表示する + +このファイルは、ビルドプロセス中に`clickhouseapi.js`によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/cloud/manage/api/keys-api-reference.md b/docs/ja/cloud/manage/api/keys-api-reference.md new file mode 100644 index 00000000000..56d3f4d0629 --- /dev/null +++ b/docs/ja/cloud/manage/api/keys-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: キー +title: キー +--- + +## すべてのキーの一覧を取得 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/api/members-api-reference.md b/docs/ja/cloud/manage/api/members-api-reference.md new file mode 100644 index 00000000000..95b06578377 --- /dev/null +++ b/docs/ja/cloud/manage/api/members-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: メンバー +title: メンバー +--- + +## メンバー一覧 + +このファイルはビルドプロセス中に`clickhouseapi.js`によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/cloud/manage/api/organizations-api-reference.md b/docs/ja/cloud/manage/api/organizations-api-reference.md new file mode 100644 index 00000000000..a78d4757fc9 --- /dev/null +++ b/docs/ja/cloud/manage/api/organizations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 組織 +title: 組織 +--- + +## 組織の詳細を取得する + +このファイルはビルドプロセス中に `clickhouseapi.js` で生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/api/services-api-reference.md b/docs/ja/cloud/manage/api/services-api-reference.md new file mode 100644 index 00000000000..44160dc0f33 --- /dev/null +++ b/docs/ja/cloud/manage/api/services-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: サービス +title: サービス +--- + +## 組織サービスの一覧 + +このファイルはビルドプロセス中に `clickhouseapi.js` によって生成されます。 内容を変更する必要がある場合は、 `clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/backups.md b/docs/ja/cloud/manage/backups.md new file mode 100644 index 00000000000..6f68b97c418 --- /dev/null +++ b/docs/ja/cloud/manage/backups.md @@ -0,0 +1,191 @@ +--- +sidebar_label: バックアップ +slug: /ja/cloud/manage/backups +description: ClickHouse Cloudでのバックアップ管理 +keywords: [バックアップ, クラウドバックアップ, 復元] +--- + +# バックアップ + +:::note +ClickHouse Cloudのサービスで`BACKUP`と`RESTORE`コマンドを使用しないでください。クラウドバックアップはUIから管理する必要があります。 +::: + +データベースのバックアップは、安全な方法を提供し、予期しない理由でデータが失われた場合でも、サービスを以前の正常なバックアップ状態に復元することができます。これにより、ダウンタイムを最小限に抑え、ビジネスに重要なデータが永久に失われることを防ぎます。このガイドでは、ClickHouse Cloudでのバックアップの動作、サービスのバックアップを構成するためのオプション、およびバックアップからの復元方法について説明します。 + +## ClickHouse Cloudでのバックアップの動作 + +ClickHouse Cloudのバックアップは、バックアップチェーンを構成する「フル」と「増分」のバックアップの組み合わせです。チェーンはフルバックアップから始まり、その後のスケジュールされた時間に増分バックアップが行われ、バックアップのシーケンスが作成されます。バックアップチェーンが一定の長さに達すると、新しいチェーンが開始されます。このバックアップの全体のチェーンは、必要に応じて新しいサービスにデータを復元するために利用されます。サービスの保持期間(後述)を過ぎると、特定のチェーンに含まれるすべてのバックアップは破棄されます。 + +以下のスクリーンショットでは、実線の四角形がフルバックアップを示し、点線の四角形が増分バックアップを示しています。実線の四角形で囲まれた領域は保持期間を示し、エンドユーザーに表示されるバックアップを示します。以下のシナリオでは、バックアップは24時間ごとに実行され、2日間保持されます。 + +Day 1にはバックアップチェーンを開始するためにフルバックアップが行われます。Day 2には増分バックアップが行われ、現在復元可能なフルバックアップと増分バックアップが存在します。Day 7までには、チェーン内に1つのフルバックアップと6つの増分バックアップがあります。ユーザーには最新の2つの増分バックアップが表示されます。Day 8には新しいフルバックアップが行われ、Day 9には新しいチェーンに2つのバックアップがある時点で、以前のチェーンは破棄されます。 + +![バックアップチェーン](./images/backup-chain.png) + +*ClickHouse Cloudの**Production**層のデフォルトバックアップポリシーと保持* + +## デフォルトバックアップポリシー + +ClickHouse Cloudは、サービスのバックアップを毎24時間ごとに作成します。**Production**サービスのバックアップは2日間保持され、**Development**サービスのバックアップは1日間保持されます。以下で説明するようにバックアップスケジュールをカスタマイズしない場合、これがサービスのバックアップスケジュールと保持ポリシーです。ClickHouse Cloudでのデフォルトバックアップには費用はかかりません。 + +## カスタマイズ可能なバックアップ + +ClickHouse Cloudでは、**Production**および**Dedicated**層サービスのバックアップスケジュールを構成することができます。バックアップはビジネスニーズに基づいて次のディメンションに沿って構成できます。 + +- **保持**: 各バックアップが保持される日数。保持期間は最小で1日から、最大で30日まで指定可能です。 +- **頻度**: 次回のバックアップまでの時間を指定することができます。「12時間ごと」の頻度の場合、バックアップは12時間ごとに行われます。頻度は「6時間ごと」から「48時間ごと」まで、次の時間単位で指定できます: 6, 8, 12, 16, 20, 24, 36, 48。 +- **開始時刻**: 毎日バックアップをスケジュールしたい開始時刻を指定します。開始時刻を指定すると、バックアップの「頻度」は24時間ごとに1回にデフォルト設定されます。ClickHouse Cloudは指定された開始時刻の1時間以内にバックアップを開始します。 + +:::note +カスタムスケジュールは、指定されたサービスに対するClickHouse Cloudのデフォルトバックアップポリシーを上書きします。 +::: + +サービスのバックアップスケジュールを構成するには、コンソールの**設定**タブに移動し、**バックアップ構成の変更**をクリックします。 + +バックアップ設定の構成 + +これにより、保持期間、頻度、および開始時刻の値を選択できる別のウィンドウが開きます。選択した設定を保存する必要があります。 + +バックアップの保持期間と頻度の選択 + +:::note +開始時刻と頻度は互いに排他的です。開始時刻が優先されます。 +::: + +:::note +バックアップスケジュールの変更は、サービスのデフォルトバックアップにカバーされないバックアップがある場合、ストレージに対する月次料金が上昇する可能性があります。「バックアップコストの理解」セクションを参照してください。 +::: + +## バックアップステータスリスト + +サービスの設定したスケジュールに基づいてバックアップが行われます。これはデフォルトの日次スケジュールか、または自分で選んだカスタムスケジュールのいずれかです。利用可能なすべてのバックアップは、サービスの**バックアップ**タブで表示することができます。ここから、バックアップのステータス、期間、サイズを確認できます。また、**操作**列から特定のバックアップを復元することもできます。 + +![バックアップステータスリスト](./images/backup-status-list.png) + +## バックアップコストの理解 + +ClickHouse Cloudは無料で2つのバックアップが含まれていますが、より多くのデータの保持やより頻繁なバックアップを必要とするスケジュールを選択すると、バックアップのストレージに対して追加の料金が発生する可能性があります。デフォルト設定を変更しなければ、バックアップコストは発生しません。 + +バックアップコストを理解するためには、使用画面からサービスごとのバックアップコストを確認できます(以下に示すように)。カスタマイズしたスケジュールで数日間バックアップが実行された後、コストの見積もりを得て、月次コストを推測することができます。 + +![バックアップ使用量チャート](./images/backup-usage.png) + +バックアップの総コストを推定するには、スケジュールを設定する必要があります。また、スケジュールを設定する前に[料金計算機](https://clickhouse.com/pricing)を更新し、月次のコストの見積もりを得るための作業も行っています。コストを見積もるには、以下の入力が必要です: +- フルバックアップと増分バックアップのサイズ +- 希望する頻度 +- 希望する保持 +- クラウドプロバイダーと地域 + +:::note +バックアップの推定コストは、サービス内のデータサイズが時間とともに変化(増加)するにつれて変わることを念頭に置いてください。 +::: + + +## バックアップを復元する + +バックアップは、元のサービスからバックアップが取られた既存のサービスではなく、新しいClickHouse Cloudサービスに復元されます。 + +**復元**のバックアップアイコンをクリックした後、新しく作成されるサービスのサービス名を指定し、このバックアップを復元できます: + +![バックアップの復元](./images/backup-restore.png) + +新しいサービスは`Provisioning`というステータスでサービスリストに表示されます。準備が整うまで: + +サービスのプロビジョニング中 + +## 復元されたサービスの利用 + +バックアップが復元されると、現在の**元のサービス**と、バックアップから復元された新しい**復元されたサービス**の2つの類似したサービスが表示されます。 + +バックアップの復元が完了したら、次のいずれかを行うべきです: +- 新しい復元されたサービスを使用し、元のサービスを削除します。 +- 新しい復元されたサービスから元のサービスにデータを移行し、新しい復元されたサービスを削除します。 + +### **新しい復元されたサービス**を使用する + +新しいサービスを使用するには、次の手順を実行します: + +1. 新しいサービスが、利用ケースに必要なIPアクセスリストのエントリを持っていることを確認します。 +1. 新しいサービスが必要なデータを含んでいることを確認します。 +1. 元のサービスを削除します。 + +### **新しい復元されたサービス**から**元のサービス**へデータを移行する + +新しく復元されたサービスを使用できない理由がある場合(たとえば、既存のサービスに接続するユーザーやアプリケーションがある場合)、新しく復元されたデータを元のサービスに移行することを選択するかもしれません。この移行は次の手順で行うことができます: + +**新しく復元されたサービスへのリモートアクセスを許可する** + +新しいサービスは通常、元のサービスと同じIPアクセスリストからのバックアップとして復元されます。他のClickHouse Cloudサービスへの接続は許可されていない、またはアクセスが**Anywhere**として許可されていない限り、接続は許可されません。一時的にどこからでもアクセスを許可するために許可リストを変更します。詳細は[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントを参照してください。 + +**新しく復元されたClickHouseサービスで(復元されたデータをホストしているシステム)** + +:::note +新しいサービスにアクセスするためには、パスワードをリセットする必要があります。サービスリストの**設定**タブから行えます。 +::: + +ソーステーブル(この例では`db.table`)を読み取り可能なユーザーを追加します: + + ```sql + CREATE USER exporter + IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' + SETTINGS readonly = 1; + ``` + + ```sql + GRANT SELECT ON db.table TO exporter; + ``` + +テーブル定義をコピーします: + + ```sql + select create_table_query + from system.tables + where database = 'db' and table = 'table' + ``` + +**送信先のClickHouse Cloudシステム上で(破損したテーブルがある所)** + +送信先データベースを作成します: + ```sql + CREATE DATABASE db + ``` + +ソースからの`CREATE TABLE`ステートメントを使用し、送信先を作成します: + +:::tip +`CREATE`ステートメントを実行した際に、`ENGINE`を`ReplicatedMergeTree`に変更し、パラメータを省略します。ClickHouse Cloudは常にテーブルを複数コピーし、正しいパラメータを提供します。 +::: + + ```sql + CREATE TABLE db.table ... + # highlight-next-line + ENGINE = ReplicatedMergeTree + ORDER BY ... + ``` + +`remoteSecure`関数を使用して、新しく復元されたClickHouse Cloudサービスからデータを元のサービスに取り込みます: + + ```sql + INSERT INTO db.table SELECT * FROM + remoteSecure('source-hostname', db, table, 'exporter', 'password-here') + ``` + +データを元のサービスに正常に挿入した後、サービス内のデータを確認してください。データが確認後、新しいサービスは削除するべきです。 + +## テーブルの削除解除または削除取り消し + +ClickHouse Cloudは`UNDROP`コマンドをサポートしていません。テーブルを誤って`DROP`した場合、最適な対策は最後のバックアップから復元し、そのバックアップからテーブルを再作成することです。 + +ユーザーがテーブルを誤って削除することを防ぐために、[`GRANT`文](/docs/ja/sql-reference/statements/grant)を使用して、特定のユーザーまたはロールの[`DROP TABLE`コマンド](/docs/ja/sql-reference/statements/drop#drop-table)の権限を取り消すことができます。 + +さらに、データの誤削除を防ぐために、ClickHouse Cloudでは>`1TB`を超えるテーブルを削除することはできません。テーブルをこの閾値を超えて削除したい場合は、support@clickhouse.comにお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing.md b/docs/ja/cloud/manage/billing.md new file mode 100644 index 00000000000..68ef68673d4 --- /dev/null +++ b/docs/ja/cloud/manage/billing.md @@ -0,0 +1,200 @@ +--- +sidebar_label: 概要 +slug: /ja/manage/billing +title: 課金 +--- + +## 料金 + +料金情報については、[ClickHouse Cloud 料金](https://clickhouse.com/pricing)のページをご覧ください。請求額に影響する要因や、支出を管理する方法について知りたい方は、引き続きお読みください。 + +## Amazon Web Services (AWS) の例 + +:::note +価格は AWS `us-east-1` の料金を反映しています。 +::: + +### 開発: 月額 $51 から + +適用に最適: 初期プロジェクト・ステージング +- 開発サービス +- 16 GiB RAM, 2 vCPU +- 1 TB データ + +#### この例の料金内訳: + + | | 活動率 10% | 活動率 50% | 常時稼働 | + |---------|-----------:|-----------:|----------:| + | コンピュート | $16 | $79 | $158 | + | ストレージ | $35 | $35 | $35 | + | 合計 | $51 | $114 | $193 | + +:::note +使用ディスクが 1TB 未満の場合、消費はさらに低く抑えられます。 +::: + +### 本番 (アイドリング、自動スケーリング): 月額 $172 から + +#### 適用に最適: コストに敏感なアドホック分析アプリケーション +- 本番サービス +- 活動ワークロード約 25% 時間 +- デフォルト設定でのアイドリング +- 暴走請求を防ぐための自動スケーリング最大値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|--------------------------------:|---------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$125 | 192 GiB RAM, 48 vCPU
$1000 | 720 GiB RAM, 180 vCPU
$3750 | + | ストレージ | 1 TB データ
$47 | 5 TB データ
$235 | 10 TB データ
$470 | + | 合計 | $172 | $1,235 | $4,220 | + +### 本番 (常時稼働、予約容量): 月額 $550 から​ + +適用に最適: レイテンシーに敏感なアプリケーション + +- 本番サービス +- 活動ワークロード約 100% 時間 +- 容量予約のための自動スケーリング最小値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$503 | 96 GiB RAM, 24 vCPU
$2,012 | 360 GiB RAM, 90 vCPU
$7,545 | + | ストレージ | 1 TB データ
$47 | 4 TB データ
$188 | 8 TB データ
$376 | + | 合計 | $550 | $2,200 | $7,921 | + +さらなる見積もりの支援が必要な場合、すでに ClickHouse Cloud ユーザーであれば [サポート](https://clickhouse.cloud/support)に問い合わせるか、または [sales@clickhouse.com](mailto:sales@clickhouse.com) までご連絡ください。 + +## Google Cloud Platform (GCP) の例 + +:::note +価格は GCP `us-central-1` の料金を反映しています。 +::: + +### 開発: 月額 $46 から + +適用に最適: 初期プロジェクト・ステージング +- 開発サービス +- 16 GiB RAM, 2 vCPU +- 1 TB データ + +#### この例の料金内訳: + + | | 活動率 10% | 活動率 50% | 常時稼働 | + |---------|-----------:|-----------:|----------:| + | コンピュート | $15 | $74 | $147 | + | ストレージ | $31 | $31 | $31 | + | 合計 | $46 | $105 | $178 | + +:::note +使用ディスクが 1TB 未満の場合、消費はさらに低く抑えられます。 +::: + +### 本番 (アイドリング、自動スケーリング): 月額 $146 から + +#### 適用に最適: コストに敏感なアドホック分析アプリケーション +- 本番サービス +- 活動ワークロード約 25% 時間 +- デフォルト設定でのアイドリング +- 暴走請求を防ぐための自動スケーリング最大値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$105 | 192 GiB RAM, 48 vCPU
$843 | 720 GiB RAM, 180 vCPU
$3162 | + | ストレージ | 1 TB データ
$41 | 5 TB データ
$205 | 10 TB データ
$410 | + | 合計 | $146 | $1,048 | $3,572 | + +### 本番 (常時稼働、予約容量): 月額 $463 から​ + +適用に最適: レイテンシーに敏感なアプリケーション + +- 本番サービス +- 活動ワークロード約 100% 時間 +- 容量予約のための自動スケーリング最小値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$422 | 96 GiB RAM, 24 vCPU
$1,686 | 360 GiB RAM, 90 vCPU
$6,342 | + | ストレージ | 1 TB データ
$41 | 4 TB データ
$164 | 8 TB データ
$328 | + | 合計 | $463 | $1,850 | $6,652 | + +さらなる見積もりの支援が必要な場合、すでに ClickHouse Cloud ユーザーであれば [サポート](https://clickhouse.cloud/support)に問い合わせるか、または [sales@clickhouse.com](mailto:sales@clickhouse.com) までご連絡ください。 + +## FAQ + +### 計算リソースの測定方法は? + +ClickHouse Cloud は、8G RAM ごとの単位で、1 分あたりの基準で計算リソースを測定します。 + +### ディスク上のストレージはどのように計算されますか? + +ClickHouse Cloud はクラウドオブジェクトストレージを使用し、ClickHouse テーブルに保存されているデータの圧縮サイズで測定されます。 + +### バックアップは合計ストレージに含まれますか? + +ClickHouse Cloud は、本番サービスには 2 つ、開発サービスには 1 つの無料バックアップを提供しており、バックアップはストレージに含まれません。 + +### 圧縮の見積もりをどう行うのですか? + +圧縮率はデータセットによって大きく変わる可能性があります。データがどれだけ圧縮可能であるか(高/低カーディナリティフィールドの数)や、ユーザーがスキーマをどのように設定するか(オプションのコーデックを使用するかどうかなど)によって異なります。一般的な分析データのタイプでは 10 倍程度ですが、はるかに低くなる場合も高くなる場合もあります。ガイダンスについては[最適化](/docs/ja/guides/best-practices/asyncinserts.md)ドキュメントを参照してください。データセットを ClickHouse に取り込み、ClickHouse に格納されたサイズと比較することが唯一の実用的な方法です。 + +クエリ `SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = ` を使用できます。 + +### セルフマネージドのデプロイメントがある場合、クラウドでのサービス運営コストを見積もるためのツールを ClickHouse は提供していますか? + +ClickHouse クエリログは、ClickHouse Cloud でのワークロード運営コストの見積もりに使用できる[主要メトリクス](/docs/ja/operations/system-tables/query_log.md)を記録します。セルフマネージドから ClickHouse Cloud への移行の詳細については、[移行ドキュメント](/docs/ja/integrations/migration/clickhouse-to-cloud.md)を参照し、さらなる質問があれば[ClickHouse Cloud サポート](https://clickhouse.cloud/support)に連絡してください。 + +### ClickHouse Cloud の課金オプションはどのようなものですか? + +ClickHouse Cloud は次の課金オプションに対応しています: +- セルフサービスによる月ごとの支払い(USD、クレジットカード経由) +- 直接販売による年次/複数年契約(前払 "ClickHouse クレジット" 経由、USD、追加支払いオプションあり) + +### 課金サイクルの期間はどのくらいですか? + +課金は月次課金サイクルに従い、ClickHouse Cloud の組織が作成された日付が開始日として追跡されます。 + +### 本番サービスのコスト管理に対し、ClickHouse Cloud はどのようなコントロールを提供していますか? + +- トライアルと年間コミット顧客には、消費が一定の閾値に達したときに自動メールで通知されます(50%、75%、90%)。 +- ClickHouse Cloud は、計算リソースの[高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md)を通じて最大自動スケーリング制限を設定できるようにし、分析ワークロードの重要なコスト要因に対処します。 +- [高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md) では、メモリ制限を設定し、非アクティブ時の一時停止/アイドリングの動作を制御するオプションがあります。 + +### 開発者向けサービスのコスト管理に対し、ClickHouse Cloud はどのようなコントロールを提供していますか? + +- [高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md) では、非アクティブ時の一時停止/アイドリングの動作を制御できます。開発者向けサービスではメモリ割り当ての調整はサポートされていません。 +- デフォルト設定では非アクティブな期間後にサービスが一時停止します。 + +### 複数のサービスがある場合、サービスごとに請求書が発行されるのか、それとも合算された請求書が発行されるのか? + +課金期間における特定の組織内のすべてのサービスに対して、合算された請求書が発行されます。 + +### クレジットカードを追加し、トライアル期間とクレジットが終了する前にアップグレードした場合、課金はどうなりますか? + +ユーザーが 30 日間のトライアル期間が終了する前にトライアルから有料に変換した場合、トライアルクレジットの残額がある場合は、初回の 30 日間のトライアル期間中はトライアルクレジットから引き落としを続け、その後クレジットカードへの請求が発生します。 + +### 支出を管理するにはどうすれば良いですか? + +ClickHouse Cloud コンソールには、「使用量」表示があり、計算およびストレージごとに各サービスの使用量に関する詳細情報を提供します。これにより、メーター単位でのコスト内訳を理解することができます。 + +### ClickHouse Cloud サービスの AWS マーケットプレース購読についての請求書はどのようにアクセスしますか? + +すべてのマーケットプレース購読は AWS によって課金および請求されます。請求書は AWS 請求ダッシュボードからダウンロードできます。 + +### 使用量ステートメントの日付が AWS マーケットプレース請求書の日付と一致しないのはなぜですか? + +AWS マーケットプレースの請求は暦月のサイクルに従います。たとえば、使用期間が 2022 年 12 月 1 日から 2023 年 1 月 1 日までの場合、請求書は 2023 年 1 月 3 日から 5 日の間に生成されます。 + +ClickHouse Cloud の使用量ステートメントは異なる課金サイクルに従い、サインアップの日から 30 日間にわたって使用量が測定および報告されます。 + +使用量と請求書の日付が異なる場合、これらの日付が一致していない可能性があります。使用量ステートメントは特定のサービスに対する日ごとの使用量を記録するため、ユーザーはステートメントに依存してコスト内訳を確認できます。 + +### 前払いクレジットの使用に関して制限はありますか? + +ClickHouse Cloud の前払いクレジット(ClickHouse 直接またはクラウドプロバイダーのマーケットプレース経由)については、契約の条件のためにのみ利用できます。これは、受け入れ日または将来の日付に適用され、過去の期間には適用されません。前払いクレジットでカバーされない超過分はクレジットカード支払い、またはマーケットプレースの月次請求でカバーする必要があります。 diff --git a/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md new file mode 100644 index 00000000000..18a1b49314e --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md @@ -0,0 +1,114 @@ +--- +slug: /ja/cloud/billing/marketplace/aws-marketplace-committed-contract +title: AWS Marketplace コミットメント契約 +description: AWS Marketplace (コミットメント契約) 経由で ClickHouse Cloud に登録する方法 +keywords: [aws, amazon, marketplace, billing, committed, committed contract] +--- + +[AWS Marketplace](https://aws.amazon.com/marketplace) を通じてコミットメント契約で ClickHouse Cloud を始めましょう。コミットメント契約、またはプライベートオファーとも呼ばれるものは、顧客が特定の期間にわたり ClickHouse Cloud に一定の金額を支払うことを約束できる契約です。 + +## 前提条件 + +- 特定の契約条件に基づく ClickHouse からのプライベートオファー。 + +## サインアップの手順 + +1. プライベートオファーを確認して受理するリンクが記載されたメールを受け取るはずです。 + +
+ +AWS Marketplace プライベートオファーメール + +
+ +2. メールの **Review Offer** リンクをクリックしてください。これにより、プライベートオファーの詳細が記載された AWS Marketplace ページに移動します。プライベートオファーを受け入れる際には、契約オプションのプルダウンでユニット数を1に設定してください。 + +3. AWS ポータルでの購読手続きを完了し、**Set up your account** をクリックします。この時点で ClickHouse Cloud にリダイレクトし、新規アカウントを登録するか既存アカウントでサインインしてください。このステップを完了しないと、AWS Marketplace サブスクリプションを ClickHouse Cloud とリンクすることができません。 + +4. ClickHouse Cloud にリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントを登録してください。このステップは、ClickHouse Cloud オーガニゼーションを AWS Marketplace の請求設定に接続するため非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しい ClickHouse Cloud ユーザーの場合は、ページ下部の **Register** をクリックします。新しいユーザーを作成し、メールを確認するように求められます。メールを確認した後は、ClickHouse Cloud ログインページを離れ、新しいユーザー名を使用して [https://clickhouse.cloud](https://clickhouse.cloud) にログインできます。 + +
+ +ClickHouse Cloud 新規登録ページ + +
+ +新規ユーザーの場合は、ビジネスの基本情報も提供する必要があることに注意してください。以下のスクリーンショットをご覧ください。 + +
+ +ClickHouse Cloud 新規登録情報フォーム + +
+ +
+ +ClickHouse Cloud 新規登録情報フォーム 2 + +
+ +既存の ClickHouse Cloud ユーザーの場合は、単に資格情報を使用してログインしてください。 + +5. ログインが成功すると、新しい ClickHouse Cloud オーガニゼーションが作成されます。このオーガニゼーションは AWS の請求アカウントに接続され、すべての利用が AWS アカウントを通じて請求されます。 + +6. ログイン後、請求が AWS Marketplace に結びついていることを確認し、ClickHouse Cloud リソースのセットアップを開始できます。 + +
+ +AWS Marketplace の請求を表示する ClickHouse Cloud + +
+ +ClickHouse Cloud 新サービスページ + +
+ +6. サインアップ確認メールを受け取るはずです: + +
+ +AWS Marketplace 確認メール + +
+ +何か問題が発生した場合は、お気軽に[サポートチーム](https://clickhouse.com/support/program) にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md new file mode 100644 index 00000000000..bc3df0d1b8a --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md @@ -0,0 +1,169 @@ +--- +slug: /ja/cloud/billing/marketplace/aws-marketplace-payg +title: AWS Marketplace PAYG +description: AWS Marketplace(PAYG)を介してClickHouse Cloudにサブスクライブします。 +keywords: [aws, marketplace, 請求, payg] +--- + +[AWS Marketplace](https://aws.amazon.com/marketplace)でのPAYG(従量課金制)パブリックオファーを通じてClickHouse Cloudを始めましょう。 + +## 前提条件 + +- 購入権限が請求管理者によって有効化されているAWSアカウント。 +- 購入するには、このアカウントでAWS Marketplaceにログインする必要があります。 + +## サインアップの手順 + +1. [AWS Marketplace](https://aws.amazon.com/marketplace)にアクセスし、ClickHouse Cloudを検索します。 + +
+ +AWS Marketplace ホームページ + +
+ +2. [リスティング](https://aws.amazon.com/marketplace/pp/prodview-jettukeanwrfc)をクリックし、**購入オプションの表示**を選択します。 + +
+ +AWS Marketplace ClickHouse 検索 + +
+ +3. 次の画面で契約を設定します: +- **契約の期間** - PAYG契約は月単位で実行されます。 +- **更新設定** - 契約の自動更新を設定することができます。 自動更新を有効にしない場合、組織は請求サイクルの終了時に自動的に猶予期間に入り、その後停止されます。 + +- **契約オプション** - このテキストボックスに任意の数(または1)を入力できます。これらの単位の価格はパブリックオファーの場合$0であるため、価格には影響しません。これらの単位は通常、ClickHouse Cloudからのプライベートオファーを受け入れる際に使用されます。 + +- **発注書** - これは任意なので、無視しても問題ありません。 + +
+ +AWS Marketplace 契約設定 + +
+ +上記の情報を入力したら、**契約を作成**をクリックします。 契約価格が0ドルで表示されていることを確認できますが、これは支払いがないことを意味し、使用に基づいて請求が発生することになります。 + +
+ +AWS Marketplace 契約確認 + +
+ +4. **契約を作成**をクリックすると、確認して支払うためのモーダルが表示されます($0の支払い予定)。 + +5. **今すぐ支払う**をクリックすると、ClickHouse CloudのAWS Marketplaceオファリングを購読していることの確認が表示されます。 + +
+ +AWS Marketplace 支払い確認 + +
+ +6. この時点で、設定はまだ完了していません。**アカウントを設定する**をクリックしてClickHouse Cloudにリダイレクトし、そこでサインアップする必要があります。 + +7. ClickHouse Cloudにリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントを登録できます。このステップは、AWS Marketplaceの請求にClickHouse Cloudの組織を結びつけるために非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しいClickHouse Cloudユーザーである場合は、ページの下部にある**登録**をクリックします。新しいユーザーを作成してメールを確認するように求められます。メールを確認した後、ClickHouse Cloudのログインページから離れ、新しいユーザー名を使用して[https://clickhouse.cloud](https://clickhouse.cloud)でログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新しいユーザーである場合は、ビジネスに関する基本的な情報も提供する必要があります。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム2 + +
+ +既存のClickHouse Cloudユーザーである場合は、資格情報を使用してログインするだけです。 + +8. ログインに成功すると、新しいClickHouse Cloud組織が作成されます。この組織はAWSの請求アカウントに接続され、すべての使用がAWSアカウントを通じて請求されます。 + +9. ログインすると、請求がAWS Marketplaceに結びついていることを確認し、ClickHouse Cloudリソースのセットアップを開始できます。 + +
+ +ClickHouse Cloud AWS Marketplace 請求確認 + +
+ +ClickHouse Cloud 新しいサービスページ + +
+ +10. サインアップ確認のメールを受け取るはずです: + +
+ +AWS Marketplace 確認メール + +
+ +問題が発生した場合は、[サポートチーム](https://clickhouse.com/support/program)にお気軽にご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md new file mode 100644 index 00000000000..555daacca51 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md @@ -0,0 +1,174 @@ +--- +slug: /ja/cloud/billing/marketplace/azure-marketplace-committed-contract +title: Azure Marketplace コミットメント契約 +description: コミットメント契約を通じて Azure Marketplace で ClickHouse Cloud に登録 +keywords: [Microsoft, Azure, Marketplace, 請求, コミットメント, コミットメント契約] +--- + +[Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps)でコミットメント契約を通じてClickHouse Cloudを始めましょう。コミットメント契約、またはプライベートオファーとも呼ばれるこの契約では、一定期間中にClickHouse Cloud に一定額を支払うことをお客様が約束します。 + +## 前提条件 + +- 特定の契約条件に基づくClickHouseからのプライベートオファー。 + +## 登録手順 + +1. プライベートオファーを確認して受け入れるためのリンクが記載されたメールを受け取っているはずです。 + +
+ +Azure Marketplace プライベートオファーのメール + +
+ +2. メール内の**プライベートオファーを確認**リンクをクリックします。これにより、プライベートオファーの詳細が表示されたGCP Marketplaceのページに移動します。 + +
+ +Azure Marketplace プライベートオファーの詳細 + +
+ +3. オファーを受け入れると、**プライベートオファー管理**画面に移動します。Azureは購入準備に少し時間がかかる場合があります。 + +
+ +Azure Marketplace プライベートオファー管理ページ + +
+ +Azure Marketplace プライベートオファー管理ページの読み込み中 + +
+ +4. 数分後にページをリフレッシュします。オファーが**購入**可能になっているはずです。 + +
+ +Azure Marketplace プライベートオファー管理ページ 購入可 + +
+ +5. **購入**をクリックすると、フライアウトが開きます。次のことを完了してください: + +
+ +- サブスクリプションとリソースグループ +- SaaSサブスクリプションの名前を提供 +- プライベートオファーが設定された課金プランを選択します。プライベートオファーが作成された期間のみ(金額が表示されます(例: 1年)。他の課金期間オプションには$0の金額が表示されます)。 +- 定期課金の有無を選択します。定期課金が選択されていない場合、契約は請求期間の終わりに終了し、リソースは廃止予定となります。 +- **レビューしてサブスクライブ**をクリックします。 + +
+ +Azure Marketplace サブスクリプションフォーム + +
+ +6. 次の画面で、すべての詳細を確認し、**サブスクライブ**を押します。 + +
+ +Azure Marketplace サブスクリプション確認 + +
+ +7. 次の画面では、**SaaSサブスクリプションは進行中です**というメッセージが表示されます。 + +
+ +Azure Marketplace サブスクリプション送信ページ + +
+ +8. 準備が整ったら、**今すぐアカウントを構成**をクリックします。このステップは重要です。Azureのサブスクリプションをお客様のClickHouse Cloud組織に結びつける役割を果たします。このステップがないと、Marketplaceのサブスクリプションは完了しません。 + +
+ +Azure Marketplace アカウント構成今すぐボタン + +
+ +9. ClickHouse Cloudのサインアップまたはサインインページにリダイレクトされます。新しいアカウントを使用してサインアップするか、既存のアカウントを使用してサインインできます。サインインが完了すると、Azure Marketplaceを通じて請求され、使用可能な新しい組織が作成されます。 + +10. いくつかの質問に答える必要があります。次のステップに進む前に、住所や会社の詳細を入力してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +11. **サインアップを完了**をクリックすると、ClickHouse Cloud内の組織に移動し、Azure Marketplaceを通じて課金されることを確認でき、サービスを作成できるようになります。 + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +問題が発生した場合は、[サポートチーム](https://clickhouse.com/support/program) にお気軽にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md new file mode 100644 index 00000000000..c396b699bd1 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md @@ -0,0 +1,187 @@ +--- +slug: /ja/cloud/billing/marketplace/azure-marketplace-payg +title: Azure Marketplace PAYG +description: Azure Marketplace (PAYG) を通じて ClickHouse Cloud に登録する方法。 +keywords: [azure, marketplace, 課金, payg] +--- + +[Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps) で「PAYG (Pay-as-you-go)」のパブリックオファーを利用して ClickHouse Cloud を始めましょう。 + +## 前提条件 + +- あなたの課金管理者によって購入権限が有効になっている Azure プロジェクト。 +- Azure Marketplace で ClickHouse Cloud を購読するには、購入権限のあるアカウントでログインし、適切なプロジェクトを選択する必要があります。 + +1. [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps) にアクセスし、ClickHouse Cloud を検索してください。マーケットプレースでオファーを購入できるようにログインしていることを確認してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +2. 製品リストページで、**Get It Now** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +3. 次の画面で、名前、メール、所在地の情報を提供する必要があります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +4. 次の画面で、**Subscribe** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +5. 次の画面で、サブスクリプション、リソースグループ、およびリソースグループの場所を選択します。リソースグループの場所は、ClickHouse Cloud でサービスを起動する予定の場所と同じである必要はありません。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +6. サブスクリプションの名前を提供する必要があり、利用可能なオプションから課金条件を選択します。**Recurring billing** をオンまたはオフに設定できます。オフに設定すると、課金条件が終了した時点で契約が終了し、リソースが廃止されます。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +7. **"Review + subscribe"** をクリックします。 + +8. 次の画面で、すべてが正しいことを確認し、**Subscribe** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +9. この時点で、ClickHouse Cloud の Azure サブスクリプションに登録されていますが、ClickHouse Cloud アカウントのセットアップはまだ行われていません。この次のステップは、ClickHouse Cloud が Azure サブスクリプションにバインドするために必要であり、Azure マーケットプレイスを通じて正しく課金されるために重要です。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +10. Azure のセットアップが完了すると、**Configure account now** ボタンがアクティブになります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +11. **Configure account now** をクリックします。 + +
+ +アカウントの設定に関する詳細を記載した以下のようなメールを受け取ります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +12. ClickHouse Cloud のサインアップまたはサインインページにリダイレクトされます。新しいアカウントを使用してサインアップするか、既存のアカウントを使用してサインインすることができます。サインインが完了すると、Azure Marketplace を介して請求される準備が整った新しい組織が作成されます。 + +13. 続行する前に、住所や会社の詳細に関するいくつかの質問に答える必要があります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +14. **Complete sign up** をクリックすると、ClickHouse Cloud 内の組織に移動し、Azure Marketplace 経由で請求されることを確認し、サービスを作成できる請求画面を表示できます。 + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +15. もし問題が発生した場合は、遠慮なく[サポートチーム](https://clickhouse.com/support/program)までご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md new file mode 100644 index 00000000000..f253a2206e4 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md @@ -0,0 +1,179 @@ +--- +slug: /ja/cloud/billing/marketplace/gcp-marketplace-committed-contract +title: GCP Marketplace コミット契約 +description: GCP Marketplaceを通じてClickHouse Cloudにサブスクライブする(コミット契約) +keywords: [gcp, google, marketplace, billing, committed, committed contract] +--- + +[GCP Marketplace](https://console.cloud.google.com/marketplace)を通じてClickHouse Cloudを利用するには、コミット契約を行います。コミット契約はプライベートオファーとも呼ばれ、一定期間、ClickHouse Cloudに対して一定額を支出することをコミットする契約です。 + +## 前提条件 + +- 特定の契約条件に基づくClickHouseからのプライベートオファー。 + +## 登録手順 + +1. プライベートオファーのレビューと承認を求められるメールを受信しているはずです。 + +
+ +GCP Marketplace プライベートオファーのメール + +
+ +2. メール内の**オファーをレビュー**リンクをクリックします。これにより、プライベートオファーの詳細を含むGCP Marketplaceページに遷移します。 + +
+ +GCP Marketplace オファーの概要 + +
+ +GCP Marketplace 価格の概要 + +
+ +3. プライベートオファーの詳細をレビューし、問題がなければ**承認**をクリックします。 + +
+ +GCP Marketplace 承認ページ + +
+ +4. **製品ページに移動**をクリックします。 + +
+ +GCP Marketplace 承認確認 + +
+ +5. **プロバイダで管理**をクリックします。 + +
+ +GCP Marketplace ClickHouse Cloudページ + +
+ +ここでClickHouse Cloudにリダイレクトし、サインアップまたはサインインを行うことが不可欠です。このステップを完了しないと、GCP MarketplaceのサブスクリプションをClickHouse Cloudにリンクすることができません。 + +
+ +GCP Marketplace サイト離脱確認モーダル + +
+ +6. ClickHouse Cloudにリダイレクトされると、既存のアカウントでログインするか、新しいアカウントを登録できます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しいClickHouse Cloudユーザーの場合は、ページ下部の**登録**をクリックしてください。新しいユーザーを作成し、メールを確認するように促されます。メールを確認した後、ClickHouse Cloudのログインページを離れ、新しいユーザー名を使用して[https://clickhouse.cloud](https://clickhouse.cloud)でログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新しいユーザーの場合、ビジネスに関する基本情報も提供する必要があります。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +既存のClickHouse Cloudユーザーの場合は、資格情報を使用してログインするだけです。 + +7. ログインに成功すると、新しいClickHouse Cloud組織が作成されます。この組織はGCP課金アカウントと接続され、すべての使用量がGCPアカウントを通じて課金されます。 + +8. ログイン後、課金がGCP Marketplaceに確実に結び付けられていることを確認し、ClickHouse Cloudリソースの設定を開始できます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +ClickHouse Cloud 新サービスページ + +
+ +9. サインアップの確認メールが送信されるはずです: + +
+
+ +GCP Marketplace 確認メール + +
+ +
+ +問題がある場合は、[サポートチーム](https://clickhouse.com/support/program)にお気軽にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md new file mode 100644 index 00000000000..5232e1b69fd --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md @@ -0,0 +1,155 @@ +--- +slug: /ja/cloud/billing/marketplace/gcp-marketplace-payg +title: GCP Marketplace PAYG +description: GCP Marketplace で ClickHouse Cloud に PAYG 形式でサブスクライブする。 +keywords: [gcp, marketplace, billing, payg] +--- + +[GCP Marketplace](https://console.cloud.google.com/marketplace) を通じて、PAYG(従量課金制)公開オファーで ClickHouse Cloud を始めましょう。 + +## 前提条件 + +- 請求管理者によって購入権限が有効化された GCP プロジェクト。 +- GCP Marketplace で ClickHouse Cloud にサブスクライブするには、購入権限を持ったアカウントでログインし、適切なプロジェクトを選択する必要があります。 + +## 申し込み手順 + +1. [GCP Marketplace](https://cloud.google.com/marketplace) にアクセスし、ClickHouse Cloud を検索します。適切なプロジェクトが選択されていることを確認してください。 + +
+ +GCP Marketplace ホームページ + +
+ +2. [リスト](https://console.cloud.google.com/marketplace/product/clickhouse-public/clickhouse-cloud)をクリックし、**購読** ボタンを押します。 + +
+ +GCP Marketplace の ClickHouse Cloud + +
+ +3. 次の画面でサブスクリプションを設定します: + +- プランはデフォルトで "ClickHouse Cloud" になります +- サブスクリプション期間は "月次" +- 適切な課金アカウントを選択 +- 利用条件を確認し、**購読** ボタンをクリック + +
+ +GCP Marketplace でのサブスクリプション設定 + +
+ +4. **購読** をクリックすると、**ClickHouse へのサインアップ** というモーダルが表示されます。 + +
+ +GCP Marketplace サインアップモーダル + +
+ +5. ここで設定はまだ完了していません。**アカウントを設定** をクリックして ClickHouse Cloud にリダイレクトし、サインアップを完了してください。 + +6. ClickHouse Cloud にリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントで登録します。このステップは、ClickHouse Cloud の組織を GCP Marketplace の請求に紐付けるために非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しい ClickHouse Cloud ユーザーの場合は、ページ下部の **登録** をクリックします。新しいユーザーを作成し、メールを確認するように促されます。メールを確認した後は、ClickHouse Cloud のログインページを閉じ、[https://clickhouse.cloud](https://clickhouse.cloud) で新しいユーザー名を使用してログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新規ユーザーの場合、事業に関する基本的な情報を提供する必要があることに注意してください。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +既存の ClickHouse Cloud ユーザーであれば、単に認証情報を使用してログインします。 + +7. ログインが成功すると、新しい ClickHouse Cloud の組織が作成されます。この組織は GCP の請求アカウントに接続され、すべての使用量が GCP アカウントを通じて請求されます。 + +8. ログイン後に、請求が GCP Marketplace に紐付けられていることを確認し、ClickHouse Cloud のリソースを設定し始めることができます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +ClickHouse Cloud 新しいサービスページ + +
+ +9. サインアップを確認するメールを受け取るはずです: + +
+
+ +GCP Marketplace 確認メール + +
+ +
+ +問題が発生した場合は、どうぞ [サポートチーム](https://clickhouse.com/support/program) までご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png new file mode 100644 index 00000000000..85bb249999e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png new file mode 100644 index 00000000000..e66938a4032 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png new file mode 100644 index 00000000000..5ffa405fa97 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png new file mode 100644 index 00000000000..a35707d9553 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png new file mode 100644 index 00000000000..5444fc098dd Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png new file mode 100644 index 00000000000..53331473a2c Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png new file mode 100644 index 00000000000..fae6dfde6fd Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png new file mode 100644 index 00000000000..270e8416a28 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png new file mode 100644 index 00000000000..a78f24ed126 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png new file mode 100644 index 00000000000..83da15ef569 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png new file mode 100644 index 00000000000..eed74cc64da Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png new file mode 100644 index 00000000000..6b344256b9a Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png new file mode 100644 index 00000000000..d31fe6cab73 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png new file mode 100644 index 00000000000..ecb8b673fff Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png new file mode 100644 index 00000000000..01d5d8af8ca Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png new file mode 100644 index 00000000000..2db001f79e9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png new file mode 100644 index 00000000000..2d2b30fa3af Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png new file mode 100644 index 00000000000..dfaf3887e1e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png new file mode 100644 index 00000000000..bb091fcb35a Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png new file mode 100644 index 00000000000..ed3527f2fe5 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png new file mode 100644 index 00000000000..a5ee3c6fdcb Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png new file mode 100644 index 00000000000..8d0e32998f8 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png new file mode 100644 index 00000000000..b01014470cc Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png new file mode 100644 index 00000000000..067161e54da Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png new file mode 100644 index 00000000000..c0375474cc2 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png new file mode 100644 index 00000000000..f1fb00ee790 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png new file mode 100644 index 00000000000..24cebeb8bf5 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png new file mode 100644 index 00000000000..abf8fccfcb8 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png new file mode 100644 index 00000000000..993270f861c Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png new file mode 100644 index 00000000000..1410ba80ee1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png new file mode 100644 index 00000000000..c96297ed13f Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png new file mode 100644 index 00000000000..db13f7e369e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png new file mode 100644 index 00000000000..04961189abe Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png new file mode 100644 index 00000000000..2c2926b51e1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png new file mode 100644 index 00000000000..8a33fe48e06 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png new file mode 100644 index 00000000000..a29bc20bc71 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png new file mode 100644 index 00000000000..122609794eb Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png new file mode 100644 index 00000000000..1502dc6fd5e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png new file mode 100644 index 00000000000..f6558cc919d Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png new file mode 100644 index 00000000000..72786e05bd1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png new file mode 100644 index 00000000000..c592e055fbf Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png new file mode 100644 index 00000000000..8d0041f565b Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png new file mode 100644 index 00000000000..3906d1181d4 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png new file mode 100644 index 00000000000..6e0623e11d9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png new file mode 100644 index 00000000000..5069638cef9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png new file mode 100644 index 00000000000..2d20a49f45f Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png new file mode 100644 index 00000000000..7bbcd75c23b Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/index.md b/docs/ja/cloud/manage/billing/marketplace/index.md new file mode 100644 index 00000000000..69fe86c5cef --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/index.md @@ -0,0 +1,69 @@ +--- +slug: /ja/cloud/marketplace +title: Marketplaceの支払い +description: AWS、GCP、Azure Marketplaceを通じてClickHouse Cloudにサブスクライブ。 +keywords: [aws, azure, gcp, google cloud, marketplace, billing] +--- + +ClickHouse Cloudにサブスクライブするには、AWS、GCP、Azureの各マーケットプレイスを通じて行うことができます。これにより、既存のクラウドプロバイダーの請求を通じてClickHouse Cloudの支払いが可能になります。 + +**従量課金制**(PAYG)を利用するか、市場を通じてClickHouse Cloudとの契約を締結することができます。請求はクラウドプロバイダーによって処理され、すべてのクラウドサービスに対して単一の請求書を受取ります。 + +- [AWS Marketplace PAYG](/ja/cloud/billing/marketplace/aws-marketplace-payg) +- [AWS Marketplace Committed Contract](/ja/cloud/billing/marketplace/aws-marketplace-committed-contract) +- [GCP Marketplace PAYG](/ja/cloud/billing/marketplace/gcp-marketplace-payg) +- [GCP Marketplace Committed Contract](/ja/cloud/billing/marketplace/gcp-marketplace-committed-contract) +- [Azure Marketplace PAYG](/ja/cloud/billing/marketplace/azure-marketplace-payg) +- [Azure Marketplace Committed Contract](/ja/cloud/billing/marketplace/azure-marketplace-committed-contract) + +## よくある質問(FAQ) + +**自分の組織がマーケットプレイス請求に接続されていることをどのように確認できますか?** + +ClickHouse Cloudコンソールで、**Billing** に移動します。**Payment details** セクションにマーケットプレイスの名前とリンクが表示されるはずです。 + +**既存のClickHouse Cloudユーザーです。AWS / GCP / Azureマーケットプレイスを介してClickHouse Cloudにサブスクライブした場合、どうなりますか?** + +クラウドプロバイダーマーケットプレイスからClickHouse Cloudに登録するには、以下の2ステップが必要です: +1. 最初に、クラウドプロバイダーのマーケットプレースポータルでClickHouse Cloudに「サブスクライブ」します。サブスクライブを完了したら、「Pay Now」または「Manage on Provider」(マーケットプレイスによって異なる)をクリックします。これで、ClickHouse Cloudにリダイレクトされます。 +2. ClickHouse Cloudで新しいアカウントに登録するか、既存のアカウントでサインインします。どちらの場合も、マーケットプレイス請求に紐付けられた新しいClickHouse Cloud組織が作成されます。 + +**注**:以前のClickHouse Cloudサインアップで作成された既存のサービスと組織は残り、マーケットプレイス請求には接続されません。ClickHouse Cloudでは、同一アカウントで異なる請求方法を持つ複数の組織を管理できます。 + +ClickHouse Cloudコンソールの左下のメニューから組織を切り替えることができます。 + +**既存のClickHouse Cloudユーザーです。既存のサービスをマーケットプレイス経由で請求したい場合はどうすれば良いですか?** + +その場合は、[ClickHouse Cloudサポート](https://clickhouse.com/support/program)にお問い合わせください。マーケットプレイスを通じてClickHouse Cloudにサブスクライブする必要があり、リソースへの組織のリンクを切り替えて、請求がマーケットプレイスを通じて行われるようにします。 + +**マーケットプレイスユーザーとしてClickHouse Cloudにサブスクライブしました。どのようにして購読を解除できますか?** + +ClickHouse Cloudの使用を停止して、既存のすべてのClickHouse Cloudサービスを削除するだけでも問題ありません。サブスクリプションは引き続き有効ですが、再発料金はないため、料金は発生しません。 + +もしサブスクリプションの解除を希望する場合は、クラウドプロバイダーコンソールに移動し、そこでサブスクリプションの更新をキャンセルしてください。サブスクリプションが終了すると、すべての既存サービスは停止され、クレジットカードの登録が求められます。カードが追加されていない場合、2週間後にすべての既存サービスが削除されます。 + +**マーケットプレイスユーザーとしてClickHouse Cloudにサブスクライブしてから、サブスクリプションを解除しました。再度サブスクライブするにはどうすれば良いですか?** + +その場合は、通常通りClickHouse Cloudにサブスクライブしてください(マーケットプレイス経由でのサブスクライブに関するセクションを参照)。 + +- AWSマーケットプレイスの場合、新しいClickHouse Cloud組織が作成され、マーケットプレイスに接続されます。 +- GCPマーケットプレイスの場合は、古い組織が再有効化されます。 + +マーケットプレイスを利用した組織の再活性化に問題がある場合は、[ClickHouse Cloudサポート](https://clickhouse.com/support/program)にお問い合わせください。 + +**ClickHouse Cloudサービスのマーケットプレイスサブスクリプションの請求書にはどこでアクセスできますか?** + +- [AWS請求コンソール](https://us-east-1.console.aws.amazon.com/billing/home) +- [GCPマーケットプレースオーダー](https://console.cloud.google.com/marketplace/orders)(サブスクリプションに使用した請求アカウントを選択) + +**なぜ使用状況のステートメントの日付がマーケットプレイス請求書と一致しないのですか?** + +マーケットプレイスの請求はカレンダー月のサイクルに従います。たとえば、12月1日から1月1日までの使用について、1月3日から5日の間に請求書が発行されます。 + +ClickHouse Cloudの使用状況ステートメントは、サインアップ日から始まる30日間のサイクルに従ってメーターされ、報告されます。 + +これらの日付が同じでない場合は、使用状況と請求書の日付が異なることがあります。使用状況ステートメントは、特定のサービスの一日の使用を追跡するため、ユーザーはその費用の内訳を確認する際にステートメントに頼ることができます。 + +**一般的な請求情報はどこで確認できますか?** + +[Billing overview page](http://localhost:3000/docs/en/manage/billing)をご覧ください。 diff --git a/docs/ja/cloud/manage/billing/payment-thresholds.md b/docs/ja/cloud/manage/billing/payment-thresholds.md new file mode 100644 index 00000000000..a72ee142202 --- /dev/null +++ b/docs/ja/cloud/manage/billing/payment-thresholds.md @@ -0,0 +1,15 @@ +--- +sidebar_label: 支払い限度額 +slug: /ja/cloud/billing/payment-thresholds +title: 支払い限度額 +description: ClickHouse Cloud の支払い限度額と自動請求。 +keywords: [請求, 支払い限度額, 自動請求書, 請求書] +--- + +# 支払い限度額 + +ClickHouse Cloudの請求期間中の支払い金額が10,000米ドルまたはそれに相当する金額に達した場合、登録されているお支払い方法で自動的に決済されます課金の失敗は、猶予期間後にサービスの停止または終了を招く可能性があります。この支払い限度額は、ClickHouseとのコミットメント契約または他の交渉済み契約を持っているお客様には適用されません。 + +組織が支払い限度額の90%に到達し、期間中にその限度を超える見込みがある場合、組織に関連付けられた請求メールに通知が送信されます。また、支払い限度額を超えた際には、請求書と共にメール通知が送信されます。 + +これらの支払い限度額は調整可能です。ご質問がある場合は、詳細についてsupport@clickhouse.comまでご連絡ください。 diff --git a/docs/ja/cloud/manage/images/AutoScaling.png b/docs/ja/cloud/manage/images/AutoScaling.png new file mode 100644 index 00000000000..0d76dcbafaf Binary files /dev/null and b/docs/ja/cloud/manage/images/AutoScaling.png differ diff --git a/docs/ja/cloud/manage/images/backup-chain.png b/docs/ja/cloud/manage/images/backup-chain.png new file mode 100644 index 00000000000..1b11ec88df6 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-chain.png differ diff --git a/docs/ja/cloud/manage/images/backup-configuration-form.png b/docs/ja/cloud/manage/images/backup-configuration-form.png new file mode 100644 index 00000000000..c8401383d68 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-configuration-form.png differ diff --git a/docs/ja/cloud/manage/images/backup-restore.png b/docs/ja/cloud/manage/images/backup-restore.png new file mode 100644 index 00000000000..6b36ecbb03a Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-restore.png differ diff --git a/docs/ja/cloud/manage/images/backup-service-provisioning.png b/docs/ja/cloud/manage/images/backup-service-provisioning.png new file mode 100644 index 00000000000..45f16a912c9 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-service-provisioning.png differ diff --git a/docs/ja/cloud/manage/images/backup-settings.png b/docs/ja/cloud/manage/images/backup-settings.png new file mode 100644 index 00000000000..74e45fef84a Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-settings.png differ diff --git a/docs/ja/cloud/manage/images/backup-status-list.png b/docs/ja/cloud/manage/images/backup-status-list.png new file mode 100644 index 00000000000..d38aca20669 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-status-list.png differ diff --git a/docs/ja/cloud/manage/images/backup-usage.png b/docs/ja/cloud/manage/images/backup-usage.png new file mode 100644 index 00000000000..3471ec931b7 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-usage.png differ diff --git a/docs/ja/cloud/manage/images/cloud-settings-sidebar.png b/docs/ja/cloud/manage/images/cloud-settings-sidebar.png new file mode 100644 index 00000000000..b15ab174422 Binary files /dev/null and b/docs/ja/cloud/manage/images/cloud-settings-sidebar.png differ diff --git a/docs/ja/cloud/manage/images/notifications-1.png b/docs/ja/cloud/manage/images/notifications-1.png new file mode 100644 index 00000000000..39a48f4eea8 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-1.png differ diff --git a/docs/ja/cloud/manage/images/notifications-2.png b/docs/ja/cloud/manage/images/notifications-2.png new file mode 100644 index 00000000000..288017bfed0 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-2.png differ diff --git a/docs/ja/cloud/manage/images/notifications-3.png b/docs/ja/cloud/manage/images/notifications-3.png new file mode 100644 index 00000000000..454c9830f45 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-3.png differ diff --git a/docs/ja/cloud/manage/images/notifications-4.png b/docs/ja/cloud/manage/images/notifications-4.png new file mode 100644 index 00000000000..3a8103f9be3 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-4.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman1.png b/docs/ja/cloud/manage/images/postman/postman1.png new file mode 100644 index 00000000000..7798ce24b81 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman1.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman10.png b/docs/ja/cloud/manage/images/postman/postman10.png new file mode 100644 index 00000000000..283f17311f6 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman10.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman11.png b/docs/ja/cloud/manage/images/postman/postman11.png new file mode 100644 index 00000000000..80cfcc7e031 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman11.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman12.png b/docs/ja/cloud/manage/images/postman/postman12.png new file mode 100644 index 00000000000..c5d7f750ebe Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman12.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman13.png b/docs/ja/cloud/manage/images/postman/postman13.png new file mode 100644 index 00000000000..7b31505bc23 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman13.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman14.png b/docs/ja/cloud/manage/images/postman/postman14.png new file mode 100644 index 00000000000..bc14279548c Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman14.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman15.png b/docs/ja/cloud/manage/images/postman/postman15.png new file mode 100644 index 00000000000..affc6156d14 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman15.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman16.png b/docs/ja/cloud/manage/images/postman/postman16.png new file mode 100644 index 00000000000..e6e89872c2c Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman16.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman17.png b/docs/ja/cloud/manage/images/postman/postman17.png new file mode 100644 index 00000000000..668d7260027 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman17.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman2.png b/docs/ja/cloud/manage/images/postman/postman2.png new file mode 100644 index 00000000000..43601b1600f Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman2.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman3.png b/docs/ja/cloud/manage/images/postman/postman3.png new file mode 100644 index 00000000000..4b5ad18d1fe Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman3.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman4.png b/docs/ja/cloud/manage/images/postman/postman4.png new file mode 100644 index 00000000000..b329c17e433 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman4.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman5.png b/docs/ja/cloud/manage/images/postman/postman5.png new file mode 100644 index 00000000000..b1309e3f445 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman5.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman6.png b/docs/ja/cloud/manage/images/postman/postman6.png new file mode 100644 index 00000000000..bd240b7be72 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman6.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman7.png b/docs/ja/cloud/manage/images/postman/postman7.png new file mode 100644 index 00000000000..77c3bbb5134 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman7.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman8.png b/docs/ja/cloud/manage/images/postman/postman8.png new file mode 100644 index 00000000000..5fe4241d5c6 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman8.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman9.png b/docs/ja/cloud/manage/images/postman/postman9.png new file mode 100644 index 00000000000..1a71845869b Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman9.png differ diff --git a/docs/ja/cloud/manage/images/scaling-configure.png b/docs/ja/cloud/manage/images/scaling-configure.png new file mode 100644 index 00000000000..eff7dc9ef0b Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-configure.png differ diff --git a/docs/ja/cloud/manage/images/scaling-memory-allocation.png b/docs/ja/cloud/manage/images/scaling-memory-allocation.png new file mode 100644 index 00000000000..fe11ac96a8f Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-memory-allocation.png differ diff --git a/docs/ja/cloud/manage/images/scaling-patch-request.png b/docs/ja/cloud/manage/images/scaling-patch-request.png new file mode 100644 index 00000000000..eab877a75cf Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-patch-request.png differ diff --git a/docs/ja/cloud/manage/images/scaling-patch-response.png b/docs/ja/cloud/manage/images/scaling-patch-response.png new file mode 100644 index 00000000000..47b1e2b5d8b Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-patch-response.png differ diff --git a/docs/ja/cloud/manage/images/trial-expired.png b/docs/ja/cloud/manage/images/trial-expired.png new file mode 100644 index 00000000000..91eb3ea9484 Binary files /dev/null and b/docs/ja/cloud/manage/images/trial-expired.png differ diff --git a/docs/ja/cloud/manage/integrations.md b/docs/ja/cloud/manage/integrations.md new file mode 100644 index 00000000000..3a9b5909ade --- /dev/null +++ b/docs/ja/cloud/manage/integrations.md @@ -0,0 +1,32 @@ +--- +sidebar_label: インテグレーション +slug: /ja/manage/integrations +title: インテグレーション +--- + +ClickHouseのインテグレーションの全リストを見るには、[こちらのページ](/ja/integrations)をご覧ください。 + +## ClickHouse Cloudの専用インテグレーション + +ClickHouseには多数のインテグレーションが用意されていますが、ClickHouse Cloudにのみ利用可能な専用インテグレーションも存在します。 + +### ClickPipes + +[ClickPipes](/ja/integrations/clickpipes)は、単純なウェブベースUIを使用して、ClickHouse Cloudにデータを取り込むための管理されたインテグレーションプラットフォームです。現在、Apache Kafka、S3、GCS、Amazon Kinesisをサポートしており、さらに多くのインテグレーションが近日中に追加予定です。 + +### ClickHouse Cloud用Looker Studio + +[Looker Studio](https://lookerstudio.google.com/)は、Googleが提供する人気のビジネスインテリジェンスツールです。Looker Studioは現在、ClickHouseコネクタをサポートしておらず、代わりにMySQLワイヤープロトコルを使用してClickHouseに接続しています。 + +Looker StudioをClickHouse Cloudに接続するには、[MySQLインターフェース](/ja/interfaces/mysql)を有効にする必要があります。Looker StudioをClickHouse Cloudに接続する方法の詳細については、[こちらのページ](/ja/interfaces/mysql#enabling-the-mysql-interface-on-clickhouse-cloud)をご覧ください。 + +### MySQLインターフェース + +一部のアプリケーションは、現在ClickHouseワイヤープロトコルをサポートしていません。これらのアプリケーションでClickHouse Cloudを使用するには、Cloud Consoleを通じてMySQLワイヤープロトコルを有効にすることができます。Cloud Consoleを通じてMySQLワイヤープロトコルを有効にする方法の詳細については、[こちらのページ](/ja/interfaces/mysql#enabling-the-mysql-interface-on-clickhouse-cloud)をご覧ください。 + +## 未対応のインテグレーション + +以下のインテグレーション機能は現在、ClickHouse Cloudでは利用できません。これらはエクスペリメンタルな機能であるため、アプリケーションでこれらの機能をサポートする必要がある場合は、support@clickhouse.comまでご連絡ください。 + +- [MaterializedPostgreSQL](/ja/engines/database-engines/materialized-mysql) +- [MaterializedMySQL](/ja/engines/table-engines/integrations/materialized-postgresql) diff --git a/docs/ja/cloud/manage/notifications.md b/docs/ja/cloud/manage/notifications.md new file mode 100644 index 00000000000..5fbf5f5c841 --- /dev/null +++ b/docs/ja/cloud/manage/notifications.md @@ -0,0 +1,60 @@ +--- +title: 通知 +slug: /ja/cloud/notifications +description: あなたのClickHouse Cloudサービスの通知 +keywords: [cloud, notifications] +--- + +ClickHouse Cloudは、あなたのサービスや組織に関連する重要なイベントについての通知を送信します。通知が送信され、設定される方法を理解するために、いくつかの概念を覚えておく必要があります: + +1. **通知カテゴリ**: 請求通知やサービス関連通知などの通知のグループを指します。各カテゴリ内には、配信モードを設定できる複数の通知があります。 +2. **通知の重大度**: 通知の重要度に応じて、通知の重大度は`情報`、`警告`、または`クリティカル`です。これは設定できません。 +3. **通知チャンネル**: チャンネルは、UI、メール、Slackなど、通知が受信される方法を指します。これはほとんどの通知で設定可能です。 + +## 通知の受信 + +通知はさまざまなチャンネルを通じて受信できます。現在、ClickHouse CloudはメールおよびClickHouse Cloud UIを通じて通知を受信できます。左上のメニューでベルのアイコンをクリックすると現在の通知が表示されるフライアウトが開きます。フライアウトの下にある**すべて表示**ボタンをクリックすると、すべての通知の活動ログを表示するページに移動します。 + +
+ +バックアップ設定の構成 + +
+ +バックアップ設定の構成 + +## 通知のカスタマイズ + +各通知について、通知を受信する方法をカスタマイズできます。通知フライアウトまたは通知活動ログの2番目のタブから設定画面にアクセスできます。 + +特定の通知の配信を設定するには、鉛筆アイコンをクリックして通知配信チャンネルを変更します。 + +
+ +バックアップ設定の構成 + +
+ +バックアップ設定の構成 + +
+ +:::note +**支払い失敗**などの**必須**通知は設定できません。 +::: + +## サポートされている通知 + +現在、請求関連の通知(支払い失敗、使用量が一定のしきい値を超えた場合など)やスケーリングイベントに関連する通知(スケーリング完了、スケーリングブロックなど)を送信しています。今後、バックアップ、ClickPipes、その他関連するカテゴリの通知を追加する予定です。 diff --git a/docs/ja/cloud/manage/openapi.md b/docs/ja/cloud/manage/openapi.md new file mode 100644 index 00000000000..b72ceade3bf --- /dev/null +++ b/docs/ja/cloud/manage/openapi.md @@ -0,0 +1,50 @@ +--- +sidebar_label: APIキーの管理 +slug: /ja/cloud/manage/openapi +title: APIキーの管理 +--- + +ClickHouse Cloudは、OpenAPIを利用したAPIを提供しており、アカウントおよびサービスの各種要素をプログラムで管理することができます。 + +# APIキーの管理 + +:::note +このドキュメントは、ClickHouse Cloud APIについて説明しています。データベースAPIのエンドポイントについては、[Cloud Endpoints API](/docs/ja/cloud/security/cloud-endpoints-api.md)をご覧ください。 +::: + +1. 左側のメニューの**API Keys**タブを使用して、APIキーの作成と管理ができます。 + + ![ClickHouse Cloud API Keys Tab](@site/docs/ja/_snippets/images/openapi1.png) + +2. **API Keys**ページは、最初にAPIキーを作成するためのプロンプトを表示します。最初のキーを作成した後は、画面右上に表示される `New API Key` ボタンを使用して新しいキーを作成できます。 + + ![Initial API Screen](@site/docs/ja/_snippets/images/openapi2.png) + +3. APIキーを作成するには、キー名、キーの権限、および有効期限を指定し、`Generate API Key` をクリックします。 + + ![Create API Key](@site/docs/ja/_snippets/images/openapi3.png) + +4. 次の画面では、Key ID と Key secret が表示されます。この値をコピーして、金庫などの安全な場所に保管してください。この画面を離れた後は、これらの値は表示されません。 + + ![API Key ID and Key Secret](@site/docs/ja/_snippets/images/openapi4.png) + +5. ClickHouse Cloud APIは、[HTTP Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)を使用してAPIキーの有効性を確認します。以下は、`curl`を使用してClickHouse Cloud APIにリクエストを送信する例です: + +```bash +$ KEY_ID=mykeyid +$ KEY_SECRET=mykeysecret + +$ curl --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations +``` + +6. **API Keys**ページに戻ると、キーの名前、Key IDの最後の4文字、権限、ステータス、満期日、および作成者が表示されます。この画面からキー名、権限、および有効期限を編集することができます。キーはこの画面から無効化または削除することもできます。 + +:::note +APIキーを削除すると、この操作は取り消すことができません。このキーを使用しているサービスは、すぐにClickHouse Cloudへのアクセスができなくなります。 +::: + + ![API Key Management](@site/docs/ja/_snippets/images/openapi5.png) + +## エンドポイント + +[エンドポイントドキュメントはこちら](/docs/ja/cloud/manage/api/invitations-api-reference.md)。API Key と API Secret を利用して、ベースURL `https://api.clickhouse.cloud/v1` を使用してください。 diff --git a/docs/ja/cloud/manage/postman.md b/docs/ja/cloud/manage/postman.md new file mode 100644 index 00000000000..66639d7a9af --- /dev/null +++ b/docs/ja/cloud/manage/postman.md @@ -0,0 +1,74 @@ +--- +slug: /ja/cloud/manage/postman +sidebar_label: Postmanを使用したプログラムによるAPIアクセス +title: Postmanを使用したプログラムによるAPIアクセス +--- + +このガイドでは、[Postman](https://www.postman.com/product/what-is-postman/)を使用してClickHouse Cloud APIをテストする方法を紹介します。Postmanアプリケーションは、Webブラウザ内で使用するか、デスクトップにダウンロードして使用できます。 + +### アカウントを作成 +* 無料のアカウントは[https://www.postman.com](https://www.postman.com)で利用できます。 +![Postmanサイト](@site/docs/ja/cloud/manage/images/postman/postman1.png) + +### ワークスペースを作成 +* ワークスペースに名前を付け、表示レベルを設定します。 +![ワークスペースを作成](@site/docs/ja/cloud/manage/images/postman/postman2.png) + +### コレクションを作成 +* 左上のメニューの「Explore」以下で「Import」をクリックします。 +![Explore > Import](@site/docs/ja/cloud/manage/images/postman/postman3.png) + +* モーダルが表示されます。 +![API URLの入力](@site/docs/ja/cloud/manage/images/postman/postman4.png) + +* APIアドレス「https://api.clickhouse.cloud/v1」を入力し、'Enter'を押します。 +![インポート](@site/docs/ja/cloud/manage/images/postman/postman5.png) + +* 「Import」ボタンをクリックして「Postman Collection」を選択します。 +![コレクション > Import](@site/docs/ja/cloud/manage/images/postman/postman6.png) + +### ClickHouse Cloud API仕様とインターフェース +* 「ClickHouse CloudのAPI仕様」が「Collections」内に表示されます(左ナビゲーション)。 +![APIのインポート](@site/docs/ja/cloud/manage/images/postman/postman7.png) + +* 「ClickHouse CloudのAPI仕様」をクリックします。中央のウィンドウから「Authorization」タブを選択します。 +![インポート完了](@site/docs/ja/cloud/manage/images/postman/postman8.png) + +### 認証を設定 +* ドロップダウンメニューを切り替えて「Basic Auth」を選択します。 +![Basic auth](@site/docs/ja/cloud/manage/images/postman/postman9.png) + +* ClickHouse Cloud APIキーを設定したときに受け取ったユーザー名とパスワードを入力します。 +![クレデンシャル](@site/docs/ja/cloud/manage/images/postman/postman10.png) + +### 変数を有効化 +* [変数](https://learning.postman.com/docs/sending-requests/variables/)を利用すると、Postmanで値を保存して再利用でき、APIテストが容易になります。 +#### 組織IDとサービスIDを設定 +* 「Collection」内で、中央のペインにある「Variable」タブをクリックします(ベースURLは先ほどのAPIインポートによって設定されています)。 +* 「baseURL」以下で「Add new value」と書かれたフィールドを開き、組織IDとサービスIDを代入します。 +![組織IDとサービスID](@site/docs/ja/cloud/manage/images/postman/postman11.png) + +## ClickHouse Cloud API機能のテスト +### "GET list of available organizations"のテスト +* 「OpenAPI spec for ClickHouse Cloud」以下でフォルダを展開し、> V1 > organizationsを選択します。 +* 「GET list of available organizations」をクリックし、右の青い「Send」ボタンを押します。 +![組織の取得テスト](@site/docs/ja/cloud/manage/images/postman/postman12.png) +* 戻り結果は「status: 200」とともに組織の詳細を返すべきです。(組織情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 +![ステータス](@site/docs/ja/cloud/manage/images/postman/postman13.png) + +### "GET organizational details"のテスト +* organizationidフォルダ以下で「GET organizational details」に移動します。 +* 中央フレームのメニューでParamsの下に、organizationidが必要です。 +![組織詳細の取得テスト](@site/docs/ja/cloud/manage/images/postman/postman14.png) +* この値を中括弧で囲まれた"{{orgid}}"に編集します(この値を以前に設定したため、値が表示されるメニューが現れます)。 +![テストの提出](@site/docs/ja/cloud/manage/images/postman/postman15.png) +* 「Save」ボタンを押した後、画面右上の青い「Send」ボタンを押します。 +![返り値](@site/docs/ja/cloud/manage/images/postman/postman16.png) +* 戻り結果は「status: 200」とともに組織の詳細を返すべきです。(組織情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 + +### "GET service details"のテスト +* 「GET service details」をクリックします。 +* organizationidおよびserviceidの値をそれぞれ{{orgid}}と{{serviceid}}に編集します。 +* 「Save」を押し、その後右の青い「Send」ボタンを押します。 +![サービスのリスト](@site/docs/ja/cloud/manage/images/postman/postman17.png) +* 戻り結果は「status: 200」とともにサービスの一覧とその詳細を返すべきです。(サービス情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 diff --git a/docs/ja/cloud/manage/scaling.md b/docs/ja/cloud/manage/scaling.md new file mode 100644 index 00000000000..e92a50a193a --- /dev/null +++ b/docs/ja/cloud/manage/scaling.md @@ -0,0 +1,105 @@ +--- +sidebar_position: 1 +sidebar_label: 自動スケーリング +slug: /ja/manage/scaling +description: ClickHouse Cloudの自動スケーリング設定 +keywords: [autoscaling, auto scaling, scaling, horizontal, vertical, bursts] +--- + +# 自動スケーリング + +スケーリングとは、クライアントの需要に応じて使用可能なリソースを調整する能力のことです。サービスはAPIをプログラム的に呼び出したり、UIでシステムリソースを調整する設定を変更することで手動でスケーリングできます。代わりに、サービスはアプリケーションの要求に合わせて**自動スケーリング**することも可能です。 + +:::note +スケーリングは**Production**ティアのサービスにのみ適用されます。**Development**ティアのサービスはスケーリングしません。スケーリングするためには、**Development**ティアから**Production**ティアにサービスを**アップグレード**する必要があります。一度**Development**サービスがアップグレードされると、ダウングレードすることはできません。 +::: + +## ClickHouse Cloudにおけるスケーリングの仕組み +**Production**サービスは、(より大きなレプリカに切り替えることで)垂直にスケーリングしたり、(同じサイズのレプリカを追加することで)水平にスケーリングしたりできます。デフォルトでは、ClickHouse Cloudの**Production**サービスは3つの異なる可用性ゾーンに3つのレプリカで運用されます。垂直スケーリングは、長時間の挿入や読み取りに多くのメモリを必要とするクエリに役立ち、水平スケーリングは並列化によって同時実行クエリをサポートするのに役立ちます。 + +現在、ClickHouse Cloudはサービスを垂直にのみ自動スケーリングします。水平にスケーリングするには(現在プライベートプレビュー中)、ClickHouse CloudコンソールまたはCloud APIを使用する必要があります。サービスで水平スケーリングを有効にするには、support@clickhouse.comにお問い合わせのうえ、[セルフサーブ水平スケーリング](#self-serve-horizontal-scaling)のセクションをご覧ください。 + +### 垂直自動スケーリング +**Production**サービスは、CPUとメモリの使用量に基づいて自動スケーリングされます。過去30時間のルックバックウィンドウにわたってサービスの使用履歴を常に監視し、スケーリングの判断を行います。使用量が特定の閾値を上回ったり下回ったりした場合、需要に応じてサービスを適切にスケーリングします。 + +CPUベースの自動スケーリングは、CPU使用率が50-75%の範囲の上限閾値を超えたときに始動します。この時点で、クラスタへのCPU割り当てが倍増されます。CPU使用率が上限閾値の半分を下回った場合(たとえば、上限閾値が50%の場合、25%)、CPU割り当てが半減されます。 + +メモリベースの自動スケーリングでは、クラスタは最大メモリ使用量の125%、またはメモリ不足エラー(OOM)が発生した場合は最大150%までスケーリングされます。 + +CPUまたはメモリの推奨値で**より大きい方**が選ばれ、サービスに割り当てられるCPUとメモリは`1` CPUと`4 GiB`メモリの同期インクリメントでスケーリングされます。 + +注意: 現在の実装では、垂直自動スケーリングはメモリとCPUのニーズが緩やかに増加する場面ではうまく機能し、保守的になる傾向があります。ワークロードの急増に対応できるよう、より動的にし、スケーリングのためにより積極的なCPU/メモリ閾値を使用し、適切なルックバックウィンドウを使用して垂直スケーリングの意思決定を行うよう改善を進めています。 + +### 垂直自動スケーリングの設定 +ClickHouse Cloud Productionサービスのスケーリングは、**Admin**ロールを持つ組織のメンバーによって調整できます。垂直自動スケーリングを設定するには、サービス詳細ページの**設定**タブに移動し、最小および最大メモリ、及びCPU設定を調整します。 + +スケーリング設定ページ + +**最大メモリ**を**最小メモリ**よりも高く設定してください。すると、必要に応じてその範囲内でサービスがスケールします。これらの設定は、初期のサービス作成フローでも利用可能です。サービス内の各レプリカには、同じメモリとCPUリソースが割り当てられます。 + +これらの値を同じに設定することも選択でき、その場合、特定の設定にサービスを固定します。そうすることで、選択したサイズにすぐにスケーリングが強制されます。これは、クラスタでの任意の自動スケーリングを無効にし、この設定を超えたCPUまたはメモリ使用量の増加からサービスを保護しなくなることに注意してください。 + +## セルフサービスによる水平スケーリング {#self-serve-horizontal-scaling} + +ClickHouse Cloudの水平スケーリングは現在**プライベートプレビュー**中です。一旦水平スケーリングがサービスで有効になると、ClickHouse Cloud [公開API](https://clickhouse.com/docs/ja/cloud/manage/api/swagger#/paths/~1v1~1organizations~1:organizationId~1services~1:serviceId~1scaling/patch)を使用して、サービスのスケーリング設定を更新することでサービスをスケールできます。 + +- 機能がサービスで有効になっていない場合、リクエストは`BAD_REQUEST: Adjusting number of replicas is not enabled for your instance"というエラーで拒否されます。このエラーが表示され、スケーリングが既に有効になっていると考える場合は、ClickHouse Cloudサポートにお問い合わせください。 +- **Production** ClickHouseサービスは最低でも`3`つのレプリカが必要です。現在、**Production**サービスがスケールアウト可能な最大レプリカ数は`20`です。これらの制限は時間とともに増加します。現在、より高い制限が必要な場合は、ClickHouse Cloudサポートチームにご連絡ください。 +- 現在、スケールイン操作中に削除されるレプリカのシステムテーブルデータは保持されません。これは、システムテーブルデータを利用しているダッシュボードや他の機能に影響を与える可能性があります。 + +### APIを介した水平スケーリング + +クラスタを水平スケーリングするには、APIを通じて`PATCH`リクエストを発行し、レプリカ数を調整します。以下のスクリーンショットは、`3`レプリカのクラスタを`6`レプリカにスケールアウトするAPIコールと、その対応するレスポンスを示しています。 + +スケーリング設定ページ + +*レプリカ数を更新する`PATCH`リクエスト* + +スケーリング設定ページ + +*`PATCH`リクエストからのレスポンス* + +新しいスケーリングリクエストや複数のリクエストを連続して発行すると、そのうち1つが進行中の場合、スケーリングサービスは中間状態を無視し、最終的なレプリカ数に収束します。 + +### UIを介した水平スケーリング + +UIからサービスを水平スケーリングするには、**設定**ページでサービスのノード数を調整します。 + +スケーリング設定ページ + +*ClickHouse Cloudコンソールからのサービススケーリング設定* + +サービスのスケールが完了すると、クラウドコンソールのメトリックダッシュボードに正しい割り当てが表示されるはずです。以下のスクリーンショットは、クラスタが`96 GiB`の総メモリにスケールしていることを示しており、これは`6`レプリカ、各レプリカにGiBのメモリが割り当てられています。 + +スケーリング設定ページ + +## 自動アイドリング +**設定**ページでは、サービスが非アクティブ時に自動アイドリングが許可されるかどうかを選択できます(すなわち、サービスがユーザー提出のクエリを実行していないとき)。自動アイドリングにより、サービスのコストを削減でき、サービスが一時停止中はコンピューティングリソースに対して請求が発生しません。 + +:::danger 自動アイドリングを使用しない場合 +自動アイドリングは、クエリに応答する前に遅延を許容できる場合のみ使用してください。サービスが一時停止されると、その間の接続がタイムアウトします。自動アイドリングは、使用頻度が少なく、遅延が許容できるサービスに理想的です。頻繁に使用される顧客向け機能を動かすサービスには推奨されません。 +::: + +## 突発的なワークロードの取り扱い +予想されるワークロードのスパイクがある場合は、[ClickHouse Cloud API](/docs/ja/cloud/manage/api/services-api-reference.md)を使用して、あらかじめサービスを拡張し、スパイクを処理した後に需要が落ち着いたらスケールダウンすることができます。各レプリカの現在のCPUコアとメモリリソースを理解するために、以下のクエリを実行できます: + +```sql +SELECT * +FROM clusterAllReplicas('default', view( + SELECT + hostname() AS server, + anyIf(value, metric = 'CGroupMaxCPU') AS cpu_cores, + formatReadableSize(anyIf(value, metric = 'CGroupMemoryTotal')) AS memory + FROM system.asynchronous_metrics +)) +ORDER BY server ASC +SETTINGS skip_unavailable_shards = 1 +``` diff --git a/docs/ja/cloud/manage/service-types.md b/docs/ja/cloud/manage/service-types.md new file mode 100644 index 00000000000..717cce7a216 --- /dev/null +++ b/docs/ja/cloud/manage/service-types.md @@ -0,0 +1,61 @@ +--- +sidebar_label: サービスタイプ +slug: /ja/cloud/manage/service-types +title: サービスタイプ +--- + +# サービスタイプ + +ClickHouse Cloud では、いくつかのサービスタイプが利用可能です。このページでは、特定のユースケースに最適なサービスタイプについて説明します。ClickHouse Cloud 組織内で異なるサービスを持つことが可能で、それぞれに指定されたサービスタイプがあります。 + +**サービスタイプの概要:** + +| | 開発 | 本番 | 専用 | +|:---------|:-----|:---------|:---------| +|**ユースケース**|小規模ワークロード、プロトタイプ|中規模ワークロード、顧客向けアプリケーション|厳しい待ち時間と分離要件があり、カスタマイズが必要なアプリケーション| +|**ストレージ**|最大 1TB|無制限|無制限| +|**メモリ**|16 GiB|24GiB+|無制限| +|**計算**|バースト可能なCPU|専用CPU|カスタム計算オプション| +|**バックアップ**|24時間ごと、1日保持|24時間ごと、2日保持|カスタムバックアップ保持| +|**アップグレード**|自動|自動|スケジュール可能| +|**SLAとサポート**|24時間の応答時間|1時間の応答時間|カスタムSLA、専任のサポートエンジニア| + +## 開発 + +`開発`サービスは、小規模なワークロードやスタートプロジェクト向けに設計されています。ClickHouse Cloud で最も低コストのオプションです。他のサービスタイプよりも低価格ですが、`開発`サービスは高い信頼性を持ち、2つの可用性ゾーンにわたってレプリケートされています。 + +**制限事項** + +`開発`サービスは自動スケーリングをサポートしていません。`開発`サービスは、内部プロジェクトやプロトタイプ、ClickHouse を試す開発者に最適です。 + +`開発`サービスの基盤ストレージはシステムの過負荷を防ぐために制限される場合があります。継続的な挿入を伴うワークロードは、ノードあたり1秒あたり4回の挿入に制限されます。高い頻度の一時的な挿入は許可されます。 + +[**エクスペリメンタル**](/docs/ja/beta-and-experimental-features#experimental-features)な機能は、不安定であったり、サービスの異常動作やクラッシュを引き起こす可能性があるため、ClickHouse Cloud では許可されていません。ClickHouse Cloud ではいくつかの[**ベータ**](/docs/ja/beta-and-experimental-features)機能が利用可能です - **ベータ**は、その機能が**一般公開("GA")**に向かって積極的に進行していることを示します。 + +:::note +`開発`サービスは Azure ではサポートされていません。 +::: + +## 本番 + +`本番`サービスは、顧客向けアプリケーションや中規模ワークロード向けに設計されています。自動スケーリング、AWS Private Link サポート、S3 ロールベースのアクセスなど、`開発`サービスよりも高度な機能を提供します。 + +`本番`サービスは、ワークロードとトラフィックの変動に対処するために自動的にスケールします。`本番`サービスは、ほとんどのスタートアップやエンタープライズのユースケースにおいて最も一般的なサービスタイプです。 + +## 専用 + +`専用`サービスは、厳しい分離と待ち時間要件があるエンタープライズワークロード向けに設計されています。計算とメモリの設定が高度にカスタマイズ可能で、これらのサービスはアプリケーションのニーズに正確に合わせられます。 + +`専用`サービスは、高トラフィックの顧客向けアプリケーションをサポートするワークロードや、重要な社内使用に対応するエンタープライズに最適です。 + +## 別のティアへのアップグレード + +`開発`から`本番`や、`本番`から`専用`へアップグレードできます。 [サポートケース](https://console.clickhouse.cloud/support)を作成してください。 + +`専用`サービスは、厳しい分離と待ち時間要件があるエンタープライズワークロード向けに設計されています。計算とメモリの設定が高度にカスタマイズ可能で、これらのサービスはアプリケーションのニーズに正確に合わせられます。 + +`専用`サービスは、高トラフィックの顧客向けアプリケーションをサポートするワークロードや、重要な社内使用に対応するエンタープライズに最適です。 + +--- + +サービスタイプに関する質問があれば、[価格ページ](https://clickhouse.com/pricing)を確認するか、support@clickhouse.com までお問い合わせください。 diff --git a/docs/ja/cloud/manage/service-uptime.md b/docs/ja/cloud/manage/service-uptime.md new file mode 100644 index 00000000000..8f29f6d24bf --- /dev/null +++ b/docs/ja/cloud/manage/service-uptime.md @@ -0,0 +1,13 @@ +--- +sidebar_label: サービス稼働時間とSLA +slug: /ja/cloud/manage/service-uptime +title: サービス稼働時間 +--- + +## 稼働時間アラート + +ユーザーは現在、[ステータスページ](https://status.clickhouse.com/)で地域ごとの稼働時間を確認し、サービスの中断に関するアラートを購読することができます。 + +## SLA + +私たちは、プロダクションインスタンスに対してサービスレベルアグリーメント(SLA)も提供しています。SLAポリシーの詳細については、[sales@clickhouse.com](mailto:sales@clickhouse.com)までお問い合わせください。 diff --git a/docs/ja/cloud/manage/settings.md b/docs/ja/cloud/manage/settings.md new file mode 100644 index 00000000000..6f673a4815d --- /dev/null +++ b/docs/ja/cloud/manage/settings.md @@ -0,0 +1,14 @@ +--- +sidebar_label: 設定の構成 +slug: /ja/manage/settings +--- + +# 設定の構成 + +特定の[ユーザー](/docs/ja/operations/access-rights#user-account-management)または[ロール](/docs/ja/operations/access-rights#role-management)に対してClickHouse Cloudサービスの設定を指定するには、[SQL主導の設定プロファイル](/docs/ja/operations/access-rights#settings-profiles-management)を使用する必要があります。設定プロファイルを適用することで、サービスが停止、待機、アップグレードした場合でも構成した設定が持続されます。設定プロファイルについて詳しくは、[こちらのページ](/docs/ja/operations/settings/settings-profiles.md)をご覧ください。 + +現在、ClickHouse CloudではXMLベースの設定プロファイルおよび[構成ファイル](/docs/ja/operations/configuration-files.md)はサポートされていないことにご注意ください。 + +ClickHouse Cloudサービスに対して指定できる設定について詳しくは、[こちらのドキュメント](/docs/ja/operations/settings)でカテゴリ毎にすべての可能な設定をご覧ください。 + + diff --git a/docs/ja/cloud/manage/troubleshooting-billing-issues.md b/docs/ja/cloud/manage/troubleshooting-billing-issues.md new file mode 100644 index 00000000000..caee3bdcd07 --- /dev/null +++ b/docs/ja/cloud/manage/troubleshooting-billing-issues.md @@ -0,0 +1,20 @@ +--- +sidebar_label: 請求問題のトラブルシューティング +slug: /ja/manage/troubleshooting-billing-issues +title: 請求問題のトラブルシューティング +--- + +# 請求問題のトラブルシューティング + +## 機能しない支払い情報の修正 + +ClickHouse Cloud の利用には、有効で正常に機能するクレジットカードが必要です。試用期間の終了後、または最後の支払いが成功した後から30日間、サービスは継続して実行されます。しかし、有効なクレジットカードに課金できない場合、クラウドコンソールの機能は組織に対して制限されます。 + +**試用期間終了後または最後の支払い成功から30日以内に有効なクレジットカードが追加されない場合、データは削除されます。** + +支払い情報に問題がある、またはクレジットカードを追加できない場合は、[サポートチーム](https://clickhouse.com/support/program)にお問い合わせください。 + +
+ +試用期間の終了 + diff --git a/docs/ja/cloud/manage/upgrades.md b/docs/ja/cloud/manage/upgrades.md new file mode 100644 index 00000000000..89e15ecb14e --- /dev/null +++ b/docs/ja/cloud/manage/upgrades.md @@ -0,0 +1,54 @@ +--- +sidebar_label: アップグレード +slug: /ja/manage/updates +--- + +# アップグレード + +ClickHouse Cloud では、パッチ適用やアップグレードについて心配する必要がありません。修正、新機能、性能改善を含むアップグレードを定期的に展開しています。ClickHouse の新機能の詳細については、[Cloud の変更履歴](/docs/ja/cloud/reference/changelog.md)をご覧ください。 + +## バージョン互換性 + +サービスを作成するとき、[`compatibility` 設定](/docs/ja/operations/settings/settings#compatibility)は、サービスが最初にプロビジョニングされた時点で ClickHouse Cloud によって提供されている最新の ClickHouse バージョンに設定されます。 + +`compatibility` 設定により、以前のバージョンの設定のデフォルト値を使用できます。サービスが新しいバージョンにアップグレードされても、`compatibility` 設定に指定されたバージョンは変更されません。これは、サービスを作成したときに存在していた設定のデフォルト値が変更されないことを意味します(ただし、既にそれらのデフォルト値を上書きしている場合、それらはアップグレード後も持続します)。 + +サービスの `compatibility` 設定は管理できません。`compatibility` 設定に指定されているバージョンを変更したい場合は、[サポートに連絡](https://clickhouse.com/support/program)する必要があります。 + +## メンテナンスモード + +場合によっては、サービスを更新する必要があり、スケーリングやアイドリングなどの特定の機能を無効にする必要があることがあります。まれに、問題が発生しているサービスに対して何らかの措置を講じ、正常な状態に戻す必要が生じることがあります。このようなメンテナンス中は、サービスページに「メンテナンスが進行中」と書かれたバナーが表示されます。この間でもクエリのためにサービスを利用できる場合があります。 + +メンテナンス中の時間に対しては料金が課されません。_メンテナンスモード_ はまれな出来事であり、通常のサービスアップグレードと混同しないでください。 + +## リリースチャネル(アップグレードスケジュール) + +ClickHouse Cloud サービスのアップグレードスケジュールを特定のリリースチャネルに登録することで指定できます。通常のアップグレードスケジュールに加え、通常のリリーススケジュールの前にサービスを更新したい場合、**Fast release** チャネルを提供しています。早期のアップグレードのための **Fast release** チャネルへの登録は、本番環境以外での利用を推奨しており、サポートチケットを記録することでリクエストできます。 + +### Fast release チャネル(早期アップグレード) + +- 最新の ClickHouse リリースを受け取る +- 新しいリリースがテストされるため、アップグレード頻度がより高い +- 現在**Production** サービスで構成可能 +- 重要でない環境での新機能のテストに適しています。厳しい稼働時間と信頼性要件がある本番ワークロードには推奨されません。 + サービスのリリーススケジュールは、Cloud コンソールで変更できます。構成は、サービスの設定タブにあります。 + +Configure backup settings + +Configure backup settings + +:::note +開発サービスは、Fast release チャネルの直後にアップグレードされます。 +::: + +### 通常リリースチャネル + +- 本番環境に推奨 +- 新しいマイナーバージョンは **Fast release** チャネルの少なくとも 2 週間後にリリースされます +- 新しいパッチバージョンは **Fast release** チャネルの少なくとも 2 日後にリリースされます diff --git a/docs/ja/cloud/reference/_category_.yml b/docs/ja/cloud/reference/_category_.yml new file mode 100644 index 00000000000..79520c71142 --- /dev/null +++ b/docs/ja/cloud/reference/_category_.yml @@ -0,0 +1,7 @@ +label: 'Cloud Reference' +position: 1 +collapsible: true +collapsed: true +link: + type: generated-index + title: Cloud Reference diff --git a/docs/ja/cloud/reference/architecture.md b/docs/ja/cloud/reference/architecture.md new file mode 100644 index 00000000000..7b3d3d63736 --- /dev/null +++ b/docs/ja/cloud/reference/architecture.md @@ -0,0 +1,46 @@ +--- +sidebar_label: アーキテクチャ +slug: /ja/cloud/reference/architecture +--- + +# ClickHouse Cloud アーキテクチャ + +![ClickHouse Cloud architecture](@site/docs/ja/cloud/reference/images/architecture.svg) + +## オブジェクトストアに支えられたストレージ +- 事実上無制限のストレージ +- データを手動で共有する必要なし +- 特にあまり頻繁にアクセスされないデータを保存する際のコストが大幅に低減 + +## コンピュート +- 自動スケーリングとアイドリング:事前にサイズを決定する必要がなく、ピーク使用に合わせて過剰プロビジョンする必要もなし +- 自動アイドリングと再開:誰も使っていないときに未使用のコンピュートを走らせる必要がない +- デフォルトで安全で高可用性 + +## 管理 +- セットアップ、監視、バックアップ、および請求は自動的に行われます。 +- コストコントロールはデフォルトで有効であり、Cloud コンソールを通じて調整できます。 + +## サービスのアイソレーション + +### ネットワークのアイソレーション + +すべてのサービスはネットワーク層でアイソレーションされています。 + +### コンピュートのアイソレーション + +`Production` および `Development` サービスは、それぞれの Kubernetes スペース内で別々のポッドにデプロイされ、ネットワークレベルでアイソレーションされています。`Dedicated` サービスは専用の VM 上で自身の Kubernetes オペレーターと共に実行されます。 + +### ストレージのアイソレーション + +すべてのサービスは、共有バケット(AWS, GCP)またはストレージコンテナ(Azure)の別々のサブパスを使用します。 + +AWS では、ストレージへのアクセスは AWS IAM を介して制御され、各 IAM ロールはサービスごとにユニークです。**Production** および **Dedicated** サービスについては、[CMEK](/docs/ja/cloud/security/cmek)が有効化されて使用停止時の高度なデータアイソレーションを提供します。CMEK は現在、AWS サービスのみでサポートされています。 + +GCP および Azure では、サービスはオブジェクトストレージのアイソレーションが確保されており(すべてのサービスが自身のバケットまたはストレージコンテナを持っています)。 + +## 同時実行制限 + +ClickHouse Cloud サービスでは、秒あたりのクエリ数 (QPS) に制限はありません。ただし、1 レプリカあたり1000 の同時クエリ制限があります。QPS は最終的に、平均クエリ実行時間とサービス内のレプリカ数による関数となります。 + +セルフマネージドの ClickHouse インスタンスや他のデータベース/データウェアハウスと比較した ClickHouse Cloud の主な利点は、[レプリカを追加する(水平スケーリング)](/docs/ja/manage/scaling#self-serve-horizontal-scaling)ことで簡単に同時実行数を増やせることです。 diff --git a/docs/ja/cloud/reference/byoc.md b/docs/ja/cloud/reference/byoc.md new file mode 100644 index 00000000000..bc3d21d9a7b --- /dev/null +++ b/docs/ja/cloud/reference/byoc.md @@ -0,0 +1,322 @@ +--- +title: AWS用BYOC (Bring Your Own Cloud) - プライベートプレビュー +slug: /ja/cloud/reference/byoc +sidebar_label: BYOC (Bring Your Own Cloud) +keywords: [byoc, cloud, bring your own cloud] +description: 独自のクラウドインフラにClickHouseをデプロイ +--- + +## 概要 + +BYOC (Bring Your Own Cloud) を使用すると、自身のクラウドインフラにClickHouse Cloudをデプロイできます。これは、ClickHouse Cloudの管理サービスを使用することができない具体的な要件や制約がある場合に役立ちます。 + +**BYOCは現在プライベートプレビュー中です。アクセスを希望される場合は、[サポート](https://clickhouse.com/support/program)までお問い合わせください。** プライベートプレビューに関する追加情報は、[利用規約](https://clickhouse.com/legal/agreements/terms-of-service) を参照してください。 + +BYOCは現在、AWSのみサポートされており、GCPおよびMicrosoft Azureは開発中です。 + +:::note +BYOCは大規模なデプロイメント専用に設計されています。 +::: + +## 用語集 + +- **ClickHouse VPC:** ClickHouse Cloudが所有するVPC。 +- **Customer BYOC VPC:** ClickHouse Cloudによってプロビジョニングおよび管理され、ClickHouse Cloud BYOCのデプロイメントに専念する顧客クラウドアカウントのVPC。 +- **Customer VPC** 顧客クラウドアカウントが所有する他のVPCで、Customer BYOC VPCに接続する必要があるアプリケーション用に使用されます。 + +## アーキテクチャ + +メトリクスとログは顧客のBYOC VPC内に保存されます。ログは現在、ローカルのEBSに保存されています。次のアップデートで、ログはLogHouse(顧客のBYOC VPCにあるClickHouseサービス)に保存されるようになります。メトリクスはPrometheusとThanosスタックを介して顧客のBYOC VPC内にローカルに保存されます。 + +
+ +BYOC Architecture + +
+ +## オンボーディングプロセス + +プライベートプレビュー中は、ClickHouse [サポート](https://clickhouse.com/support/program) に連絡することでオンボーディングプロセスを開始します。顧客は専用のAWSアカウントを持っている必要があり、使用するリージョンを知っている必要があります。現時点では、ClickHouse Cloudをサポートしている地域でのみBYOCサービスの起動を許可しています。 + +BYOCのセットアップはCloudFormationスタックを通じて管理されます。このCloudFormationスタックは、ClickHouse CloudのBYOCコントローラーがインフラを設定および管理するための役割を作成するのみです。ClickHouseを実行するために使用されるS3、VPC、およびコンピュートリソースはCloudFormationスタックの一部ではありません。 + +## アップグレードプロセス + +定期的にソフトウェアをアップグレードします。これには、ClickHouseデータベースのバージョンアップグレード、ClickHouse Operator、EKS、およびその他のコンポーネントが含まれます。 + +アップグレードをできるだけシームレスにするよう努めています(例: ローリングアップグレードと再起動)が、ClickHouseバージョンの変更やEKSノードのアップグレードなど、一部のアップグレードはサービスに影響を与える可能性があります。その場合、顧客はメンテナンスウィンドウ(例: 毎週火曜日の午前1時PDT)を指定できます。そのようなアップグレードは、スケジュールされたメンテナンスウィンドウ中にのみ実行されることを保証します。 + +メンテナンスウィンドウは、セキュリティおよび脆弱性修正には適用されないことに注意してください。これらはオフサイクルアップグレードとして処理され、顧客と迅速にコミュニケーションを取り、必要なアクションを実行し、操作への影響を最小限に抑えるための適切な時間を調整します。 + +## CloudFormation IAM Roles + +### Bootstrap IAMロール + +bootstrap IAMロールにはこれらの権限があります: + +- VPCとEKSクラスターのセットアップに必要なEC2およびVPC操作。 +- バケットを作成するために必要な`s3:CreateBucket`などのS3操作が必要です。 +- 外部DNSにおけるroute53のレコード設定のために`route53:*`が必要です。 +- コントローラーが追加の役割を作成するために`iam:CreatePolicy`などのIAM関連の操作が必要です。詳細は次のセクションを参照してください。 +- `ClickHouse-cloud`プリフィックスで始まるリソースに限定されたeks:xx操作。 + +### コントローラーによって作成される追加のIAMロール + +CloudFormationを通じて作成された`ClickHouseManagementRole`に加えて、コントローラーは他にいくつかの役割を作成します。 + +これらの役割は、顧客のEKSクラスターで実行されるアプリケーションによって引き受けられることを意図しています。 +- **State exporter role** + - ClickHouseコンポーネントがサービスの健康情報をClickHouse Cloudに報告するもの。 + - ClickHouse Cloudが所有するSQSに書き込み権限が必要 +- **Load-balancer-controller** + - 標準的なAWSロードバランサーコントローラー + - ClickHouseサービスに必要なボリュームを管理するためのEBS CSIコントローラー +- **External-dns**、route53にDNS設定を伝搬するため +- **Cert-manager**、BYOCサービスドメイン用にTLS証明書をプロビジョニングするため +- **Cluster autoscaler**、ノードグループを適宜スケールするため + +**K8s-control-plane**と**k8s-worker**ロールはAWS EKSサービスによって引き受けられることを意図しています。 + +最後に、**data-plane-mgmt**はカスタムリソースの`ClickHouseCluster`やIstio Virtual Service/Gatewayなどを調整するためのClickHouseクラウドコントロールプレーンコンポーネントに許可するためのものです。 + +## ネットワーク境界 + +このセクションは、顧客のBYOC VPCへのおよびからのさまざまなネットワークトラフィックに焦点を当てています。 + +- **インバウンド**: 顧客のBYOC VPCに送られるトラフィック。 +- **アウトバウンド**: 顧客のBYOC VPCから発信され、そのVPC外の宛先に送信されるトラフィック +- **パブリック**: 公共のインターネットに公開されているネットワークエンドポイントアドレス +- **プライベート**: VPCピアリング、VPCプライベートリンク、Tailscaleなどを通じてのみアクセス可能なプライベートなネットワークエンドポイントアドレス + +**Istio ingressはAWS NLBの背後にデプロイされ、ClickHouseクライアントトラフィックを受け入れます** + +*インバウンド、パブリック(プライベートにすることができます)* + +Istio ingress gatewayはTLSを終了します。証明書はLet's EncryptでCertManagerによってプロビジョニングされ、EKSクラスター内にシークレットとして保存されます。IstioとClickHouse間のトラフィックは[AWSによって暗号化](https://docs.aws.amazon.com/whitepapers/latest/logical-separation/encrypting-data-at-rest-and--in-transit.html#:~:text=All%20network%20traffic%20between%20AWS,supported%20Amazon%20EC2%20instance%20types)されます。デフォルトでは、インテ入はIP許可リストフィルタリングでパブリックインターネットに利用可能です。顧客はVPCピアリングを設定してプライベートにしてパブリック接続を無効にするオプションがあります。アクセスを制限するに[IPフィルター](/ja/cloud/security/setting-ip-filters)を設定することを強くお勧めします。 + +**トラブルシューティングアクセス** + +ClickHouseクラウドエンジニアはトラブルシューティングアクセスにTailscaleを必要とします。BYOCデプロイメントへの証明書ベースの認証を求め、タイムリーに提供されます。 + +*インバウンド、パブリック(プライベートにすることができます)* + +**課金スクレイパー** + +*アウトバウンド、プライベート* + +課金スクレイパーは、ClickHouseから課金データを収集し、ClickHouseクラウドが所有するS3バケットに送信します。スクレイパーは、ClickHouseサーバーコンテナの横でサイドカートして働くコンポーネントです。定期的にClickHouseのCPUとメモリのメトリクスをスクレイプします。同じリージョンへのリクエストはVPCゲートウェイサービスのエンドポイントを介して行われます。 + +**アラート** + +*アウトバウンド、パブリック* + +AlertManagerは、顧客のClickHouseクラスターが健康ではないときにアラートをClickHouseクラウドに送信するように構成されています。メトリクスとログは顧客のBYOC VPC内に保存されます。ログは現在、ローカルのEBSに保存されています。次のアップデートで、ログはLogHouse(顧客のBYOC VPCにあるClickHouseサービス)に保存されるようになります。メトリクスはPrometheusとThanosスタックを介して顧客のBYOC VPC内にローカルに保存されます。 + +**サービス状態** + +*アウトバウンド* + +State ExporterはClickHouseのサービス状態情報をClickHouseクラウド所有のSQSに送信します。 + +## 機能 + +### サポートされている機能 + +- SharedMergeTree: ClickHouse CloudとBYOCは同じバイナリおよび設定を使用 +- サービス状態を管理するためのコンソールアクセス + - サポートされる操作には開始、停止、終了が含まれます + - サービスと状態を表示 +- バックアップとリストア +- 手動による垂直および水平スケーリング +- Falcoによるランタイムセキュリティ監視とアラート(falco-metrics) +- Tailscaleによるゼロトラストネットワーク +- 監視: クラウドコンソールにはサービスの健康を監視するための組み込みのダッシュボードがあります +- 中央ダッシュボードを使用したユーザーによる監視を選択するためのPrometheusのスクレイピング。今日、Prometheus、Grafana、Datadogをサポートしています。セットアップの詳細な手順については、[Prometheusドキュメント](/ja/integrations/prometheus) を参照してください +- VPCピアリング +- [このページ](/ja/integrations) にリストされている統合 +- セキュアなS3 + +### 計画された機能(現在サポートされていません) + +- [AWS PrivateLink](https://aws.amazon.com/privatelink/) +- [AWS KMS](https://aws.amazon.com/kms/) 別名CMEK(顧客管理型暗号化キー) +- インジェスト用のClickPipes +- 自動スケーリング +- イドル化 +- MySQLインターフェース + +## FAQ + +### コンピュート + +**この単一のEKSクラスターに複数のサービスを作成できますか?** + +はい。インフラストラクチャは、AWSアカウントとリージョンの組み合わせごとに一度プロビジョニングするだけです。 + +**BYOCをサポートしている地域はどこですか?** + +BYOCはClickHouse Cloudと同じ[リージョン](/ja/cloud/reference/supported-regions#aws-regions )セットをサポートしています。 + +**リソースオーバーヘッドはありますか?ClickHouseインスタンス以外のサービスを実行するために必要なリソースは何ですか?** + +Clickhouseインスタンス(ClickHouseサーバーおよびClickHouse Keeper)の他に、clickhouse-operator、aws-cluster-autoscaler、Istioなどなどのサービスや監視スタックを実行しています。 + +現在、それらのワークロードを実行するために専用のノードグループに3つのm5.xlargeノード(各AZに1つずつ)があります。 + +### ネットワークとセキュリティ + +**セットアップが完了した後にセットアップ中に設定された権限を取り消すことができますか?** + +現時点では不可能です。 + +**ClickHouseエンジニアがトラブルシューティングのために顧客のインフラにアクセスする際の将来のセキュリティコントロールを検討していますか?** + +はい。顧客がエンジニアのクラスターへのアクセスを承認できるようにする顧客制御のメカニズムの実装は、我々のロードマップに含まれています。現時点では、エンジニアは、クラスターへのタイムリーなアクセスを取得するために、内部のエスカレーションプロセスを経る必要があります。これは記録され、当社のセキュリティチームによって監査されます。 + +**VPCピアリングをどのようにセットアップしますか?** + +VPCピアリングの作成と削除は、サポートエスカレーションを通じて行うことができます。前提条件として、ピアリングされたVPC間でCIDR範囲が重複していない必要があります。 + +ClickHouseサポートによってVPCピアリングの構成が完了したら、ユーザーが完了する必要があるいくつかの操作があります。 + +1. ピアリングされたVPCのAWSアカウントでVPCピアリングリクエストを受け取り、受け入れる必要があります。**VPC -> Peering connections -> Actions -> Accept request**に移動してください。 + + +2. ピアリングされたVPCのルートテーブルを調整します。ClickHouseインスタンスに接続する必要があるピアリングされたVPCのサブネットを見つけます。このサブネットのルートテーブルを編集し、次の構成で1つのルートを追加します: +- 送信先: ClickHouse BYOC VPC CIDR (例: 10.0.0.0/16) +- ターゲット: ピアリング接続、pcx-12345678(ドロップダウンリストで実際のIDが表示される) + +
+ +BYOC network configuration + +
+ +3. 既存のセキュリティグループを確認し、BYOC VPCへのアクセスをブロックしないルールがあることを確認してください。 + +ピアリングされたVPCからClickHouseサービスにアクセスできるようになります。 + +ClickHouseサービスにプライベートにアクセスするには、プライベートロードバランサーとエンドポイントがプロビジョニングされ、ユーザーのピアVPCからプライベートに接続できます。エンドポイントは`-private`のサフィックスで、パブリックエンドポイントと同様です。例: +もし公開エンドポイントが `h5ju65kv87.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud`であるなら、プライベートエンドポイントは`h5ju65kv87-private.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud`になります。 + +**EKSクラスター用に作成されるVPC IP範囲を選択できますか?** + +VPC CIDR範囲を選択できます。これはVPCピアリング機能に影響を与えるためです。オンボーディング時にサポートチケットに記載してください。 + +**作成されるVPC IP範囲のサイズはどれくらいですか?** + +将来の拡張を考慮して少なくとも/22を予約することをお勧めしますが、縮小を希望する場合は/23を使用して、30のサーバーポッドに制限される可能性がある場合は可能です。 + +**メンテナンスの頻度を決めることができますか?** + +サポートに連絡してメンテナンスウィンドウをスケジュールしてください。少なくとも隔週のアップデートスケジュールの予定です。 + +## 観測可能性 + +### 組み込みの監視ツール + +#### 観測可能性のダッシュボード + +ClickHouse Cloudには、メモリ使用率、クエリレート、I/Oなどのメトリクスを表示する高度な観測可能性のダッシュボードが含まれています。これはClickHouse Cloudのウェブコンソールインターフェースの**監視**セクションでアクセスできます。 + +
+ +Observability dashboard + +
+ +#### 高度なダッシュボード + +`system.metrics`、`system.events`、`system.asynchronous_metrics`などのシステムテーブルからのメトリクスを使用して、サーバーのパフォーマンスとリソース使用状況を詳細に監視するためのダッシュボードをカスタマイズすることができます。 + +
+ +Advanced dashboard + +
+ +#### Prometheus統合 + +ClickHouse Cloudは監視のためにメトリクスをスクレイプするために使用できるPrometheusエンドポイントを提供しています。これにより、GrafanaやDatadogなどのツールとの統合が可能です。 + +**/metrics_allのhttpsエンドポイントを介したサンプルリクエスト** + +```bash +curl --user : https://i6ro4qarho.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud:8443/metrics_all +``` + +**サンプルレスポンス** + +```bash +# HELP ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes The amount of bytes stored on disk `s3disk` in system database +# TYPE ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes gauge +ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes{hostname="c-jet-ax-16-server-43d5baj-0"} 62660929 +# HELP ClickHouse_CustomMetric_NumberOfBrokenDetachedParts The number of broken detached parts +# TYPE ClickHouse_CustomMetric_NumberOfBrokenDetachedParts gauge +ClickHouse_CustomMetric_NumberOfBrokenDetachedParts{hostname="c-jet-ax-16-server-43d5baj-0"} 0 +# HELP ClickHouse_CustomMetric_LostPartCount The age of the oldest mutation (in seconds) +# TYPE ClickHouse_CustomMetric_LostPartCount gauge +ClickHouse_CustomMetric_LostPartCount{hostname="c-jet-ax-16-server-43d5baj-0"} 0 +# HELP ClickHouse_CustomMetric_NumberOfWarnings The number of warnings issued by the server. It usually indicates about possible misconfiguration +# TYPE ClickHouse_CustomMetric_NumberOfWarnings gauge +ClickHouse_CustomMetric_NumberOfWarnings{hostname="c-jet-ax-16-server-43d5baj-0"} 2 +# HELP ClickHouseErrorMetric_FILE_DOESNT_EXIST FILE_DOESNT_EXIST +# TYPE ClickHouseErrorMetric_FILE_DOESNT_EXIST counter +ClickHouseErrorMetric_FILE_DOESNT_EXIST{hostname="c-jet-ax-16-server-43d5baj-0",table="system.errors"} 1 +# HELP ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE UNKNOWN_ACCESS_TYPE +# TYPE ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE counter +ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE{hostname="c-jet-ax-16-server-43d5baj-0",table="system.errors"} 8 +# HELP ClickHouse_CustomMetric_TotalNumberOfErrors The total number of errors on server since the last restart +# TYPE ClickHouse_CustomMetric_TotalNumberOfErrors gauge +ClickHouse_CustomMetric_TotalNumberOfErrors{hostname="c-jet-ax-16-server-43d5baj-0"} 9 +``` + +**認証** + +ClickHouseのユーザー名とパスワードのペアを使用して認証を行います。メトリクスをスクレイプするために最小限の権限で専用のユーザーを作成することをお勧めします。少なくとも、レプリカ間で`system.custom_metrics`テーブルへの`READ`権限が必要です。例: + +```sql +GRANT REMOTE ON *.* TO scraping_user +GRANT SELECT ON system.custom_metrics TO scraping_user +``` + +**Prometheusの設定** + +以下は設定例です。`targets`エンドポイントはClickHouseサービスにアクセスするために使用されるものと同じです。 + +```bash +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "clickhouse" + static_configs: + - targets: ["..aws.byoc.clickhouse.cloud:8443"] + scheme: https + metrics_path: "/metrics_all" + basic_auth: + username: + password: + honor_labels: true +``` + +また[このブログ記事](https://clickhouse.com/blog/clickhouse-cloud-now-supports-prometheus-monitoring) および [ClickHouse用のPrometheusセットアップドキュメント](/ja/integrations/prometheus)も参照してください。 diff --git a/docs/ja/cloud/reference/changelog.md b/docs/ja/cloud/reference/changelog.md new file mode 100644 index 00000000000..64a33bfd759 --- /dev/null +++ b/docs/ja/cloud/reference/changelog.md @@ -0,0 +1,1048 @@ +--- + +slug: /ja/whats-new/cloud +sidebar_label: Cloud Changelog +title: Cloud Changelog + +--- + +このClickHouse Cloudの変更ログに加え、[Cloud Compatibility](/docs/ja/cloud/reference/cloud-compatibility.md)のページもご覧ください。 + +## 2024年10月4日 + +### ClickHouse Cloud が GCPでのベータ版HIPAA対応サービスを提供開始 + +保護された健康情報(PHI)のセキュリティを強化したいと考えているお客様は、[Google Cloud Platform (GCP)](https://cloud.google.com/)上でClickHouse Cloudにオンボードできます。ClickHouseは[HIPAAセキュリティルール](https://www.hhs.gov/hipaa/for-professionals/security/index.html)に基づく管理的、物理的、および技術的な保護策を実施し、用途やワークロードに応じて実装可能なセキュリティ設定が用意されています。利用可能なセキュリティ設定についての詳細は、[Security Shared Responsibility Model](/docs/ja/cloud/security/shared-responsibility-model)をご参照ください。 + +サービスはGCPの`us-central-1`で、**Dedicated**サービスタイプのお客様向けに提供され、業務協力契約(BAA)が必要です。この機能へのアクセスをリクエストするか、追加のGCP、AWS、Azureのリージョンの待機リストに参加するには、[sales](mailto:sales@clickhouse.com)または[support](https://clickhouse.com/support/program)までお問い合わせください。 + +### Compute-Compute分離がGCPとAzureでプライベートプレビュー開始 + +最近、AWSでのCompute-Compute分離のプライベートプレビューを発表しましたが、今回、GCPとAzureでも利用可能になりました。 + +Compute-Compute分離は、特定のサービスを読み書きまたは読み取り専用のサービスとして指定することができ、アプリケーションに最適なコンピュート構成を設計してコストとパフォーマンスを最適化します。詳細については[ドキュメントをお読みください](/docs/ja/cloud/reference/compute-compute-separation)。 + +### セルフサービスによるMFAリカバリーコード + +多要素認証を使用しているお客様は、携帯電話を紛失した場合やトークンを誤って削除した場合に使用できるリカバリーコードを取得できるようになりました。初めてMFAに登録するお客様には設定時にコードが提供されます。既存のMFAを持つお客様は、既存のMFAトークンを削除して新しいものを追加することでリカバリーコードを取得できます。 + +### ClickPipesのアップデート: カスタム証明書、レイテンシーインサイトなど! + +ClickPipesの最新アップデートをご紹介できることを嬉しく思います。ClickPipesは、ClickHouseサービスにデータを取り込む最も簡単な方法です!これらの新機能は、データ取り込みの制御を強化し、パフォーマンスメトリクスへの可視性を高めるように設計されています。 + +*Kafka用カスタム認証証明書* + +ClickPipes for Kafkaは、SASL&公開のSSL/TLSを使用するKafkaブローカー用のカスタム認証証明書をサポートします。ClickPipeの設定中にSSL証明書セクションに簡単に自分自身の証明書をアップロードし、Kafkaへのより安全な接続を確保できます。 + +*KafkaおよびKinesisのレイテンシーメトリクス導入* + +パフォーマンスの可視性は重要です。ClickPipesは現在、メッセージプロダクション(KafkaトピックまたはKinesisストリームから)からClickHouse Cloudへの取り込みまでの時間に関するインサイトを提供するレイテンシーグラフを特徴としています。この新しいメトリクスを使用して、データパイプラインのパフォーマンスをより注意深く監視し、それに応じて最適化できます。 + +Latency Metrics graph + +
+ +*KafkaおよびKinesisのスケーリングコントロール(プライベートベータ)* + +高スループットは、データ量とレイテンシーのニーズを満たすために追加のリソースを要求することがあります。クリックだけでスケーリングリソースをより効果的に調整できる水平スケーリングをClickPipesで紹介しています。この機能は現在プライベートベータで、要件に基づいてリソースを拡張できます。[support](https://clickhouse.com/support/program)に連絡してベータ版に参加してください。 + +*KafkaおよびKinesisの生メッセージ取り込み* + +KafkaまたはKinesisのメッセージ全体をパースせずに取り込むことが可能になりました。ClickPipesは、完全なメッセージを単一のStringカラムにマッピングできる`_raw_message`[仮想カラム](/docs/ja/integrations/clickpipes/kafka#kafka-virtual-columns)のサポートを提供しており、生データを必要に応じて操作する柔軟性を提供します。 + +## 2024年8月29日 + +### 新しいTerraformプロバイダー バージョン - v1.0.0 + +Terrafromを使用すると、ClickHouse Cloudサービスをプログラムで制御し、構成をコードとして保存できます。私たちのTerraformプロバイダーは20万以上のダウンロードがあり、公式にバージョンv1.0.0になりました!この新しいバージョンは、リトライロジックの改善や、ClickHouse Cloudサービスにプライベートエンドポイントを追加する新しいリソースなどの改良を含んでいます。 [Terraform provider here](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest)および[完全な変更ログはこちら](https://github.com/ClickHouse/terraform-provider-clickhouse/releases/tag/v1.0.0)ダウンロードできます。 + +### 2024年のSOC 2 Type IIレポートと更新されたISO 27001認証書 + +Azureで新たに開始されたサービスだけでなく、AWSとGCPでのサービスを含む、2024年のSOC 2 Type IIレポートと更新されたISO 27001認証書の利用開始の発表を誇らしく思います。 + +SOC 2 Type IIは、ClickHouseユーザーに提供するサービスのセキュリティ、可用性、処理の完全性、および機密性の確保に向けた継続的な取り組みを示しています。詳細については、アメリカ公認会計士協会(AICPA)が発行する[SOC 2 - サービス組織用SOC: 信頼サービス基準](https://www.aicpa-cima.com/resources/landing/system-and-organization-controls-soc-suite-of-services)および国際標準化機構(ISO)の[ISO/IEC 27001について](https://www.iso.org/standard/27001)をご確認ください。 + +また、当社のセキュリティおよびコンプライアンス文書とレポートについては、当社の [Trust Center](https://trust.clickhouse.com/) もご覧ください。 + +## 2024年8月15日 + +### Compute-compute分離がAWSでプライベートプレビュー開始 + +既存のClickHouse Cloudサービスでは、レプリカが読み取りと書き込みの両方を処理し、特定のレプリカが特定の操作のみを処理するように設定する方法がありませんでした。読み書き可能または読み取り専用のサービスとして特定のサービスを指定でき、アプリケーションの最適なコンピュート構成を設計して、コストとパフォーマンスを最適化する新しい機能であるCompute-compute分離が登場します。 + +新しいCompute-compute分離機能を使用すると、複数のオブジェクトストレージフォルダと、同じテーブル、ビューなどを使用している各々のエンドポイントを持つ複数のコンピュートノードグループを作成できます。[Compute-compute分離の詳細はこちら](/ja/cloud/reference/compute-compute-separation)。この機能にプライベートプレビューでアクセスしたい場合は、[サポートへの連絡](https://clickhouse.com/support/program)をしてください。 + +Compute-compute分離の例のアーキテクチャ + +### ClickPipes for S3とGCSがGA(一般提供)に移行、継続モードのサポート + +ClickPipesは、ClickHouse Cloudへのデータ取り込みを最も簡単に行う方法です。[ClickPipes](https://clickhouse.com/cloud/clickpipes)がS3およびGCS用として**一般提供**されることを嬉しく思います。ClickPipesは一度限りのバッチ導入と「継続モード」の両方をサポートしています。取り込みタスクは特定のリモートバケットからパターンに一致するすべてのファイルをClickHouse宛先テーブルにロードします。「継続モード」では、ClickPipesジョブは常に実行され、リモートオブジェクトストレージバケットに追加されるマッチするファイルを取り込んでいきます。これにより、任意のオブジェクトストレージ バケットをClickHouse Cloudへのデータ取り込み用の完全なステージングエリアに変えることができます。[関連ドキュメント](/ja/integrations/clickpipes)をお読みください。 + +## 2024年7月18日 + +### Prometheusのメトリクスエンドポイントが一般提供に + +前回のクラウド変更ログで、ClickHouse Cloudから[Prometheus](https://prometheus.io/)メトリクスをエクスポートするためのプライベートプレビューを発表しました。この機能により、[Grafana](https://grafana.com/)や[Datadog](https://www.datadoghq.com/)などのツールで可視化するために、[ClickHouse Cloud API](/ja/cloud/manage/api/api-overview)からメトリクスを取得することができます。この機能が**一般提供**されることを嬉しく思います。この機能の詳細は[ドキュメント](/ja/integrations/prometheus)をご参照ください。 + +### クラウドコンソールのテーブルインスペクター + +ClickHouseには、テーブルを調査してスキーマを確認するために[`DESCRIBE`](/ja/sql-reference/statements/describe-table)などのコマンドがあります。これらのコマンドはコンソールに出力されますが、テーブルとカラムに関するすべての関連データを取得するためには複数のクエリを組み合わせる必要があるため、しばしば便利ではありません。 + +クラウドコンソールに**テーブル インスペクター**を新たに導入しました。これにより、SQLを書く必要なくUI上で重要なテーブルとカラム情報を取得できます。クラウドコンソールでテーブルインスペクターを試してみてください。スキーマ、ストレージ、圧縮、その他の情報を一つの統一されたインターフェースで提供します。 + +テーブルインスペクターUI + +### 新しいJavaクライアントAPI + +[Java Client](https://github.com/ClickHouse/clickhouse-java)は、ClickHouseに接続するために最も人気のあるクライアントの一つです。これをさらに簡単で直感的に使用できるようにしたいと考えており、新しいAPI設計とさまざまなパフォーマンス最適化を含む変更を行いました。これにより、JavaアプリケーションからClickHouseへの接続が大幅に容易になります。[こちらのブログ投稿](https://clickhouse.com/blog/java-client-sequel)で、更新されたJavaクライアントの使用方法について詳しくお読みいただけます。 + +### 新しいアナライザーがデフォルトで有効化 + +過去数年にわたり、クエリアナリシスと最適化のための新しいアナライザーに取り組んでいます。このアナライザーはクエリ性能を向上させ、さらなる最適化を可能にします。これには、より高速かつ効率的な`JOIN`を含みます。以前は、この機能を有効にするために新しいユーザーは`allow_experimental_analyzer`設定を使用する必要がありました。この改良されたアナライザーは新しいClickHouse Cloudサービスでデフォルトで利用できます。 + +さらなる最適化を計画しており、アナライザーの改善が続くことをお楽しみください! + +## 2024年6月28日 + +### ClickHouse CloudがMicrosoft Azureで一般提供開始! + +[今年の5月](https://clickhouse.com/blog/clickhouse-cloud-is-now-on-azure-in-public-beta)にベータ版でMicrosoft Azureサポートを最初に発表しました。最新のクラウドリリースでは、Azureのサポートがベータから一般提供へ移行します。ClickHouse CloudはAWS、Google Cloud Platform、そしてMicrosoft Azureという三大クラウドプラットフォームのすべてで利用可能です。 + +このリリースには、[Microsoft Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/clickhouse.clickhouse_cloud)を通じてサブスクリプションをサポートすることも含まれています。このサービスは最初に以下のリージョンでサポートされます: +- 米国:West US 3(アリゾナ) +- 米国:East US 2(バージニア) +- ヨーロッパ:Germany West Central(フランクフルト) + +特定のリージョンでのサポートをご希望の場合は、[こちらからご連絡ください](https://clickhouse.com/support/program)。 + +### クエリログインサイト + +新しいクエリインサイトUI in ClickHouse Cloudのコンソールは、ClickHouse内蔵のクエリログの使用を大幅に簡単にします。ClickHouseの`system.query_log`テーブルは、クエリ最適化、デバッグ、およびクラスタ全体の健全性と性能の監視にとって重要な情報源です。ただし、70以上のフィールドとクエリごとに複数のレコードがあるため、クエリログを理解することは急な学習曲線を伴います。クエリインサイトのこの初期バージョンは、クエリデバッグと最適化パターンの簡素化のためのブループリントを提供します。この機能をさらに発展させていく中でのフィードバックをお待ちしています、ぜひご意見をお寄せください! + +クエリインサイトUI + +### Prometheusのメトリクスエンドポイント(プライベートプレビュー) + +おそらく最も求められている機能の一つ:ClickHouse Cloudから[Prometheus](https://prometheus.io/)メトリクスを[Grafana](https://grafana.com/)や[Datadog](https://www.datadoghq.com/)にエクスポートして可視化できるようになりました。Prometheusは、ClickHouseを監視し、カスタムアラートを設定するためのオープンソースソリューションを提供します。ClickHouse Cloudサービス用のPrometheusメトリクスへのアクセスは[ClickHouse Cloud API](https://clickhouse.com/docs/ja/integrations/prometheus)を介して利用可能です。この機能は現在プライベートプレビューです。組織用にこの機能を有効にするには、[サポートチーム](https://clickhouse.com/support/program)までご連絡ください。 + +GrafanaとのPrometheusメトリクス + +### その他の機能: +- [カスタマイズ可能なバックアップ](/ja/cloud/manage/backups#configurable-backups)で、頻度、保持、スケジュールなどのカスタムバックアップポリシーを設定可能です。 + +## 2024年6月13日 + +### Kafka ClickPipesコネクタ用のオフセットの設定可能性(ベータ版) + +これまで、新しい[Kafkaコネクタ用ClickPipes](/docs/ja/integrations/clickpipes/kafka)をセットアップするたびに、常にKafkaトピックの最初からデータを消費していました。この状況では、歴史的データの再処理が必要な場合、または新しい着信データを監視する場合、または特定のポイントから再開する場合に特定のユースケースに十分に柔軟ではない可能性があります。 + +ClickPipes for Kafkaには、Kafkaトピックからのデータ消費に対する柔軟性と制御を強化する新機能が追加されました。データの消費を開始するオフセットを設定できます。 + +選択可能なオプションは以下の通りです: +- 最初から: Kafkaトピックの非常に開始からデータの消費を開始します。このオプションは、すべての歴史的データを再処理する必要があるユーザーに理想的です。 +- 最新から: 最新のオフセットからデータの消費を始めます。これは、新しいメッセージにのみ関心のあるユーザーにとって便利です。 +- タイムスタンプから: 特定のタイムスタンプで生成されたまたはその後のメッセージからデータの消費を開始します。この機能により、より正確な制御が可能となり、ユーザーは正確な時点からの処理再開が可能になります。 + +Kafkaコネクタ用オフセットの設定 + +### 高速リリースチャンネルへのサービス登録 + +高速リリースチャンネルにより、従来のリリーススケジュールよりも早くサービスの更新を受け取ることが可能になります。この機能を有効にするためにはサポートチームの支援が必要でしたが、現在ではClickHouse Cloudコンソールを使用してこの機能をサービスに直接有効化できます。**設定**に移動し、**高速リリースに登録**をクリックするだけです。これで、更新ができ次第その都度受け取ります! + +高速リリースに登録 + +### Terraformによる水平スケーリングのサポート + +ClickHouse Cloudは[水平スケーリング](/docs/ja/manage/scaling#vertical-and-horizontal-scaling)、すなわち同じサイズのレプリカをサービスに追加する能力をサポートしています。水平スケーリングは、パフォーマンスと並行性を向上させて並行クエリをサポートします。以前は、ClickHouse CloudコンソールやAPIを使用して他のレプリカを追加する必要がありましたが、現在ではTerraformを使用してサービスからレプリカを追加または削除でき、必要に応じてClickHouseサービスをプログラムでスケーリングできます。 + +詳細については、[ClickHouse Terraformプロバイダ](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)をご覧ください。 + +## 2024年5月30日 + +### チームメイトとクエリを共有 + +SQLクエリを書いた場合、そのクエリがあなたのチームの他のメンバーにも役立つ可能性があります。以前は、クエリをSlackやメールで送信する必要があり、あなたが変更を加えた場合に自動でそのクエリを受け取る方法がありませんでした。 + +ClickHouse Cloudコンソールを通じてクエリを簡単に共有できることをうれしく思います。クエリエディタから、クエリをチーム全体または特定のメンバーと直接共有できます。また、読み取りまたは書き込み専用アクセスとして指定することもできます。クエリエディタの**共有**ボタンをクリックして、新しい共有クエリ機能をお試しください。 + +クエリを共有 + +### ClickHouse CloudがMicrosoft Azureでベータ版提供開始 + +Microsoft AzureでClickHouse Cloudサービスを作成する機能をついに開始しました!すでに多くの顧客がプライベートプレビュー プログラムの一環としてAzure上でClickHouse Cloudを本番で使用しています。今後、任意のユーザーがAzureに自身のサービスを作成できます。AWSおよびGCPでサポートされているすべてのClickHouse機能はAzureでも動作します。 + +ClickHouse Cloud for Azureは次の数週間以内に一般提供に向けた準備を進めています。[このブログ投稿をお読みください](https://clickhouse.com/blog/clickhouse-cloud-is-now-on-azure-in-public-beta) またはClickHouse Cloudコンソールを通じてAzureを使用して新しいサービスを作成してください。 + +注意: 現時点ではAzureの**開発**サービスはサポートされていません。 + +### クラウドコンソールによるプライベートリンクのセットアップ + +私たちのプライベートリンク機能は、ClickHouse Cloudサービスを自分のクラウドプロバイダアカウント内の内部サービスに接続し、パブリックインターネットにトラフィックを送信することなくコスト削減とセキュリティを強化します。以前は、設定が難しく、ClickHouse Cloud APIの使用が必要でした。 + +現在では、ClickHouse Cloudコンソールからボタンを数回クリックするだけでプライベートエンドポイントを設定できます。サービスの **設定** に移動し、**セキュリティ** セクションで **プライベートエンドポイントの設定** をクリックするだけです。 + +![プライベートエンドポイントの設定](./images/may-30-private-endpoints.png) + +## 2024年5月17日 + +### Amazon Kinesisを使用したClickPipesによるデータ取り込み(Beta) + +ClickPipesはクリックハウスクラウドによるコード不要のデータ取り込み独自サービスです。Amazon KinesisはAWSのフルマネージドストリーミングサービスで、データストリームを受信し保存し、処理するために用いられます。最もリクエストのある統合の一つであるAmazon KinesisのClickPipes betaを開始しました。私たちはClickPipesにさらに多くの統合を追加していく予定ですので、どのデータソースをサポートしてほしいか教えてください!この機能の詳細については[こちら](https://clickhouse.com/blog/clickpipes-amazon-kinesis)をお読みください。 + +クラウドコンソールで新しいAmazon Kinesis統合をClickPipesで試してみてください: + +![Amazon Kinesis on ClickPipes](./images/may-17-kinesis.png) + +### カスタマイズ可能なバックアップ (プライベート プレビュー) + +バックアップは任意のデータベース(こむ論じることなく)にとって重要です。ClickHouse Cloudのデータベースバックアップは初日から非常に重視しています。今週、より多くの柔軟性を持たせるためのサービスのバックアップを可能にするカスタマイズ可能なバックアップを開始しました。開始時刻、保持、および頻度の制御が可能になりました。この機能は**本番用**および**専用**サービス向けに提供されており、**開発**サービスには対応していません。この機能はプライベートプレビューであるため、この機能をサービス用に有効にするにはsupport@clickhouse.comまでお問い合わせください。[カスタマイズ可能なバックアップの詳細はこちら](https://clickhouse.com/blog/configurable-backups-in-clickhouse-cloud). + +### SQLクエリからAPIを作成(ベータ版) + +ClickHouse用にSQLクエリを書くと、アプリケーションへのクエリ公開のためにClickHouseに接続するためのドライバーが必要です。これにより、**クエリエンドポイント**機能を使って、任意の設定を行わずにAPIからSQLクエリを直接実行できます。クエリエンドポイントはJSON、CSV、またはTSVを返すことができます。クラウドコンソール内の **共有** ボタンをクリックして、この新しいクエリ機能を試してみてください。[クエリエンドポイントの詳細はこちら](https://clickhouse.com/blog/automatic-query-endpoints). + +クエリエンドポイントを設定 + +### 公式ClickHouse認定が利用可能に + +ClickHouse Developトレーニングコースには12の無料トレーニングモジュールがあります。今週まで、ClickHouseの公式の習熟度を証明する方法がありませんでした。現在、**ClickHouse認定開発者**となるための公式試験を開始しました。この試験を完了することで、現在および将来の雇用主に対して、データ取り込み、モデリング、分析、パフォーマンス最適化などのトピックにおけるClickHouseの習熟度を共有することができます。[こちらで試験を受ける](https://clickhouse.com/learn/certification)ことができ、ClickHouse認定について[ブログ投稿を読む](https://clickhouse.com/blog/first-official-clickhouse-certification)こともできます。 + +## 2024年4月25日 + +### S3およびGCSからClickPipesを使用してデータをロード + +新しくリリースされたクラウドコンソールでは、”データソース”と呼ばれる新しいセクションがあります。この”データソース”ページは、ClickPipesによって動作し、ClickHouse Cloudにさまざまなソースから簡単にデータを挿入できます。 + +最新のClickPipesの更新では、Amazon S3およびGoogle Cloud Storageからデータを直接アップロードする機能が追加されました。組み込みのテーブル関数を引き続き使用できますが、ClickPipesはUIを通じた完全に管理されたサービスで、S3およびGCSから数クリックでデータを取り込むことができます。この機能はまだプライベートプレビューですが、クラウドコンソールで試してみることができます。 + +![ClickPipes S3 and GCS](./images/clickpipes-s3-gcs.png) + +### Fivetranを使用して500以上のソースからClickHouse Cloudにデータをロード + +ClickHouseは大規模データセットを迅速にクエリできますが、もちろん最初にデータをClickHouseに挿入する必要があります。Fivetranの包括的なコネクタ範囲を利用すれば、ZendeskやSlackなどのお気に入りのアプリケーションからデータを素早くロードできるようになります。Fivetranの新しいClickHouse宛先を使用して、アプリケーションデータのターゲットデータベースとしてClickHouseを指定できるようになります。 + +これは私たちのインテグレーションチームが多くの努力を重ねて構築したオープンソースの統合です。私たちの[リリースブログ投稿](https://clickhouse.com/blog/fivetran-destination-clickhouse-cloud)および[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-fivetran-destination)を確認できます。 + +### その他の変更 + +**コンソールの変更** +- SQLコンソールでの出力フォーマットサポート + +**インテグレーションの変更** +- ClickPipes Kafkaコネクタは複数のブローカー設定をサポートします +- ODBCドライバーの構成オプションを指定するPowerBIコネクタのサポート + +## 2024年4月18日 + +### AWS東京リージョンがClickHouse Cloudに対応 + +このリリースで、ClickHouse Cloud用の新しいAWS東京リージョン(`ap-northeast-1`)を導入しました。ClickHouseを最速のデータベースにしたいと考えているため、レイテンシーを可能な限り短くするために全てのクラウドにおけるリージョンの追加を続けています。更新されたクラウドコンソールで東京に新しいサービスを作成することができます。 + +![東京サービスの作成](./images/create-tokyo-service.png) + +その他の変更: + +### コンソールの変更 +- ClickPipes用KafkaへのAvroフォーマットサポートが一般提供 +- Terraformプロバイダのサービスとプライベートエンドポイントのリソースインポートの完全なサポートを実装 + +### インテグレーションの変更 +- NodeJSクライアントの主要な安定リリース:query + ResultSet用のアドバンストTypeScriptサポート、URL構成 +- Kafkaコネクタの修正:DLQに書き込む際の例外を無視する問題、Avro Enumタイプのサポートを追加、[MSK](https://www.youtube.com/watch?v=6lKI_WlQ3-s)および[Confluent Cloud](https://www.youtube.com/watch?v=SQAiPVbd3gg)でのコネクタの使用ガイドを公開 +- Grafanaの修正:UIでのNullableタイプサポート、動的OTELトレーステーブル名のサポート +- DBTの修正:カスタムマテリアライゼーション用のモデル設定 +- Javaクライアントの修正:エラーコードの解析の不備 +- Pythonクライアントの修正:数値タイプのパラメータバインディング、クエリバインディングの際のナンバーリストに関するバグ修正、SQLAlchemyポイントサポートを追加 + +## 2024年4月4日 + +### 新しいClickHouse Cloud Consoleのご紹介 + +このリリースでは、新しいクラウドコンソールのプライベートプレビューを導入しています。 + +ClickHouseでは、開発者エクスペリエンスの向上について常に考えています。私たちは、最速のリアルタイムデータウェアハウスを提供するだけでなく、使いやすく管理しやすいものにする必要があることを認識しています。 + +ClickHouse Cloudの何千人ものユーザーが毎月数十億のクエリをSQLコンソールで実行し続けています。そのため、ClickHouse Cloudサービスと相互作用することをさらに簡単にするために、一流のコンソールにさらに投資することを決断しました。今回の新しいクラウドコンソール体験は、スタンドアロンSQLエディタと管理コンソールを一つの直感的なUIに組み合わせています。 + +選ばれた顧客が新しいクラウドコンソール体験のプレビューを受けます - ClickHouseでデータを探索し、管理するための統一された没入的な方法です。優先アクセスを希望する方は、support@clickhouse.comまでご連絡ください。 + +![新しいクラウドコンソール](./images/new-cloud-console.gif) + +## 2024年3月28日 + +このリリースでは、Microsoft Azureのサポート、APIを介した水平スケーリング、プライベートプレビューでのリリースチャネルが導入されています。 + +### 一般的な更新 +- プライベートプレビューでのMicrosoft Azureのサポートを導入。アクセスを得るには、アカウント管理またはサポートにお問い合わせください、または[待機リスト](https://clickhouse.com/cloud/azure-waitlist)に参加してください。 +- リリースチャネルの導入 - 環境タイプに基づいたアップグレードタイミングの指定機能。このリリースでは、非本番環境を本番環境の前にアップグレードするための「快速」リリースチャネルを追加しました(有効にするにはサポートにご連絡ください)。 + +### 管理変更 +- APIを利用した水平スケーリング構成をサポート(プライベートプレビュー、有効化にはサポートへの連絡が必要) +- 起動時にメモリ不足エラーに直面しているサービスのスケールアップを改善 +- AWSのCMEKのTerraformプロバイダーでのサポートを追加 + +### コンソールの変更 +- Microsoftソーシャルログインのサポートを追加 +- SQLコンソールでのクエリ共有機能を追加 +- クエリエディタのパフォーマンスを大幅に改善(EU地域の一部で5秒から1.5秒のレイテンシー) + +### インテグレーションの変更 +- ClickHouse OpenTelemetryエクスポーター:ClickHouseのレプリケーションテーブルエンジンに対する[サポートを追加](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/31920)し[統合テストを追加](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/31896) +- ClickHouse DBTアダプタ:TTL表現サポートに関する[テスト](https://github.com/ClickHouse/dbt-clickhouse/pull/254)と[Dictionaryのマテリアライゼーションマクロサポート](https://github.com/ClickHouse/dbt-clickhouse/pull/255)を追加 +- ClickHouse Kafka Connect Sink:[Kafkaプラグイン検出](https://github.com/ClickHouse/clickhouse-kafka-connect/issues/350)と互換性があります(コミュニティの貢献) +- ClickHouse Javaクライアント:[新しいクライアントAPIパッケージ](https://github.com/ClickHouse/clickhouse-java/pull/1574)を導入し、[クラウドテスト用のテストカバレッジを追加](https://github.com/ClickHouse/clickhouse-java/pull/1575) +- ClickHouse NodeJSクライアント:新しいHTTPキープアライブ動作のテストとドキュメントを拡張。v0.3.0リリース以降利用可能 +- ClickHouse Golangクライアント:MapのキーとしてのEnumに[バグを修正](https://github.com/ClickHouse/clickhouse-go/pull/1236); エラー接続が接続プールに残される[バグを修正](https://github.com/ClickHouse/clickhouse-go/pull/1237)(コミュニティの貢献) +- ClickHouse Pythonクライアント:PyArrow経由でのクエリストリーミングを[サポート](https://github.com/ClickHouse/clickhouse-connect/issues/155) (コミュニティの貢献) + +### セキュリティ更新 +- [「クエリキャッシングが有効な場合、役割ベースのアクセス制御がバイパスされる」](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-45h5-f7g3-gr8r)(CVE-2024-22412)を防ぐためにClickHouse Cloudを更新しました。 + +## 2024年3月14日 + +このリリースは、新しいクラウドコンソール体験、S3およびGCSからのClickPipesのデータ一括ローディングのプレビュー版、およびClickPipesでのKafka用Avroフォーマットのサポートをもたらします。また、ClickHouseデータベースバージョンを24.1にアップグレードし、新しい関数、パフォーマンス、およびリソース使用最適化をサポートします。 + +### コンソールの変更 +- 早期アクセスでの新しいクラウドコンソール体験が利用可能(参加に興味がある方はサポートにお問い合わせください)。 +- S3およびGCSからの一括ローディングのためのClickPipesが早期アクセスで利用可能(参加に興味がある方はサポートにお問い合わせください)。 +- KafkaのClickPipesでのAvroフォーマットサポートが早期アクセスで利用可能(参加に興味がある方はサポートにお問い合わせください)。 + +### ClickHouseバージョンアップグレード +- FINALの最適化、ベクトル化の設計改善、より速い集計 - [23.12リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-12#optimizations-for-final)で詳細を参照 +- Punycode処理、文字列類似性、外れ値検出のための新しい関数、そしてKeeperのメモリー最適化 - [24.1リリースブログ](https://clickhouse.com/blog/clickhouse-release-24-01)および[プレゼンテーション](https://presentations.clickhouse.com/release_24.1/)で詳細情報を参照 +- このClickHouse cloudバージョンは24.1に基づいており、数十の新機能、性能改善、およびバグ修正が含まれています。詳細は[コアデータベース変更ログ](/docs/ja/whats-new/changelog/2023#2312)を参照してください。 + +### インテグレーションの変更 +- Grafana:v4向けのダッシュボード移行修正、アドホックフィルタリングの論理補正 +- Tableau Connector:DATENAME関数と「real」引数の四捨五入処理を修正 +- Kafka Connector:接続初期化時のNPE修正、JDBCドライバーオプション指定機能追加 +- Golang クライアント:レスポンスハンドリングのメモリ使用量削減、Date32極値修正、圧縮が有効な場合のエラー報告改善 +- Python Client:datetimeパラメータのタイムゾーンサポート改善、Pandas DataFrameのパフォーマンス改善 + +## 2024年2月29日 + +このリリースは、SQLコンソールアプリケーションの読み込み時間を改善し、ClickPipesでSCRAM-SHA-256認証のサポートを追加し、Kafka Connectでネストされた構造体のサポートを拡張します。 + +### コンソールの変更 +- SQLコンソールアプリケーションの初期読み込み時間を最適化 +- 'authentication failed'エラーを引き起こすSQLコンソール競合状態を修正 +- 監視ページで最新のメモリアロケーション値が時々不正確であった振る舞いを修正 +- SQLコンソールが時々重複したKILLクエリコマンドを発行する問題を修正 +- SCRAM-SHA-256認証メソッドを使用するKafkaベースのデータソース用ClickPipesのサポートを追加 + +### インテグレーションの変更 +- Kafka Connector:複雑なネストされた構造体(Array、Map)のサポートを拡張;FixedStringタイプのサポートを追加;複数のデータベースへの取り込みサポートを追加 +- Metabase:ClickHouseバージョン23.8より低い場合の非互換性を修正 +- DBT:モデル作成への設定を渡す能力を追加 +- Node.jsクライアント:長時間のクエリ (>1時間) のサポートを追加、空の値を正常に処理する + +## 2024年2月15日 + +このリリースはコアデータベースバージョンの更新、Terraformを使用したプライベートリンクの設定機能を追加し、Kafka Connectを介した非同期挿入に対する正確な一度のセマンティクスをサポートします。 + +### ClickHouseバージョンアップグレード +- S3Queueテーブルエンジンは、S3からの連続かつスケジュールされたデータロードのためのプロダクション対応となります。 - [23.11リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-11) で詳細をご確認ください。 +- FINALの重要なパフォーマンス向上と、SIMD命令用のベクトル化向上の結果としての高速なクエリ - [23.12リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-12#optimizations-for-final) で詳細をご覧ください。 +- このClickHouseクラウドバージョンは23.12に基づいていて、多数の新機能、性能向上、およびバグ修正が行われています。詳細は[コアデータベースの変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog/2023#2312)を参照してください。 + +### コンソールの変更 +- AWS Private LinkとGCP Private Service ConnectをTerraformプロバイダーを通じて設定する機能を追加 +- リモートファイルデータインポートの回復力向上 +- インポートステータスの詳細をすべてのデータインポートへ追加 +- S3データインポートへのキー/秘密鍵資格情報サポートを追加 + +### インテグレーションの変更 +* Kafka Connect + * `async_insert` の正確な一度のサポートが追加されました(デフォルトでは無効) +* Golangクライアント + * DateTimeバインディングを修正 + * バッチ挿入性能を改善 +* Javaクライアント + * リクエスト圧縮の問題を修正 + +### 設定変更 +* `use_mysql_types_in_show_columns` はもはや必須ではありません。MySQLインターフェースを介して接続する際に自動的に有効になります。 +* `async_insert_max_data_size` はデフォルト値が `10 MiB` になりました + +## 2024年2月2日 + +このリリースはClickPipes for Azure Event Hubの利用可能性をもたらし、v4 ClickHouse Grafanaコネクターを用いてログとトレースナビゲーションのワークフローを劇的に改善し、FlywayおよびAtlasデータベーススキーマ管理ツールのサポートを公開しました。 + +### コンソールの変更 +* Azure Event Hubに対するClickPipesのサポートを追加 +* 新しいサービスのデフォルトアイドリング時間は15分です + +### インテグレーションの変更 +* [ClickHouseデータソース for Grafana](https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/) v4リリース + * Table、Logs、Time Series、およびTraces用の専用エディタを備えた完全に再構築されたクエリビルダー + * より複雑で動的なクエリをサポートするための完全に再構築されたSQLジェネレータ + * OpenTelemetryへの優れたサポートをLogとTraceビューに追加 + * LogsとTracesのデフォルトのテーブルと列を指定するための拡張設定 + * カスタムHTTPヘッダを指定する能力を追加 + * その他多くの改善 - 完全な[変更ログ](https://github.com/grafana/clickhouse-datasource/blob/main/CHANGELOG.md#400)を確認してください +* データベーススキーマ管理ツール + * [FlywayがClickHouseサポートを追加](https://github.com/flyway/flyway-community-db-support/packages/2037428) + * [Ariga AtlasがClickHouseサポートを追加](https://atlasgo.io/blog/2023/12/19/atlas-v-0-16#clickhouse-beta-program) +* Kafkaコネクタシンク + * デフォルト値を持つテーブルへの取り込みを最適化 + * DateTime64での文字列ベースの日付をサポート +* Metabase + * 複数データベースへの接続をサポート + +## 2024年1月18日 + +このリリースはAWSの新しい地域(ロンドン / eu-west-2)をもたらし、RedPanda、Upstash、Warpstreamに対するClickPipesのサポートを追加し、[is_deleted](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/replacingmergetree#is_deleted)コアデータベース機能の信頼性を改善しました。 + +### 一般的な変更 +- 新しいAWS地域:ロンドン (eu-west-2) + +### コンソールの変更 +- RedPanda、Upstash、Warpstreamに対するClickPipesのサポートを追加 +- ClickPipesの認証機構をUIにおいて設定可能に + +### インテグレーションの変更 +- Javaクライアント: + - 破壊的変更:ランダムURLハンドルのコールでの指定を削除しました。この機能はClickHouseから削除されました + - 廃止予定機能:Java CLIクライアントとGRPCパッケージ + - エクサビームの要求により、ClickHouseインスタンスのワークロードを減少させるためのRowBinaryWithDefaultsフォーマットのサポートを追加 + - ClickHouseとの互換性のためのDate32とDateTime64範囲境界、Spark Array文字列タイプとの互換性、ノード選択メカニズム +- Kafkaコネクタ:Grafana用のJMXモニタリングダッシュボードを追加 +- PowerBI:ODBCドライバーの設定をUIで指定可能に +- JavaScriptクライアント:クエリの概要情報を公開し、挿入の際の特定列を指定可能に、webクライアント用にkeep_aliveを設定可能に +- Pythonクライアント:SQLAlchemyのNothingタイプサポートを追加 + +### 信頼性の変更 +- ユーザー向けの後方互換性の無い変更:以前、ある条件下で二つの機能([is_deleted](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/replacingmergetree#is_deleted)と``OPTIMIZE CLEANUP``)がClickHouse内のデータの破損を引き起こす可能性がありました。ユーザーのデータの整合性を保持するためにコア機能を維持しながら、これがどのように動作するかを調整しました。具体的には、MergeTree設定``clean_deleted_rows``は非推奨となり、もはや効果を持ちません。``CLEANUP``キーワードはデフォルトでは許可されていません(これを使用するには``allow_experimental_replacing_merge_with_cleanup``を有効にする必要があります)。``CLEANUP``を使用する場合、``OPTIMIZE FINAL CLEANUP``を実行した後で古いバージョンの行が挿入されないことを保証する必要があります。 + +## 2023年12月18日 + +このリリースはGCPの新しい地域(us-east1)、セキュアエンドポイント接続のセルフサービス機能、DBT 1.7を含む追加統合のサポート、数多くのバグ修正とセキュリティ強化をもたらします。 + +### 一般的な変更 +- ClickHouse CloudはGCP us-east1 (サウスカロライナ)地域でご利用いただけます +- AWS Private LinkおよびGCP Private Service Connectの設定能力をOpenAPIで導入 + +### コンソールの変更 +- 開発者ロールのユーザー向けにSQLコンソールへのシームレスログインを有効化 +- オンボーディング中のアイドリングコントロール設定ワークフローを簡素化 + +### インテグレーションの変更 +- DBT コネクタ:DBT v1.7までのサポートを追加 +- Metabase:Metabase v0.48へのサポートを追加 +- PowerBI Connector:PowerBI Cloud 上での実行が可能になりました +- ClickPipes 内部ユーザー設定を設定可能に +- Kafka Connect + - 重複排除ロジックとNullable型の取り込みを改善 + - テキストベースフォーマットの追加サポート (CSV, TSV) +- Apache Beam: BooleanとLowCardinality型をサポート +- Nodejs クライアント: Parquetフォーマットのサポートを追加 + +### セキュリティ発表 +- 3つのセキュリティ脆弱性をパッチ - 詳細は[セキュリティ変更ログ](https://clickhouse.com/docs/ja/whats-new/security-changelog)をご参照ください: + - CVE 2023-47118 (CVSS 7.0) - デフォルトでポート9000/tcpで動作しているネイティブインターフェースに影響を与えるヒープバッファーオーバーフロー脆弱性 + - CVE-2023-48704 (CVSS 7.0) - デフォルトでポート9000/tcpで動作しているネイティブインターフェースに影響を与えるヒープバッファーオーバーフロー脆弱性 + - CVE 2023-48298 (CVSS 5.9) - FPC圧縮コーデックにおける整数アンダーフロー脆弱性 + +## 2023年11月22日 + +このリリースはコアデータベースバージョンをアップグレードし、ログインおよび認証フローの改善、Kafka Connect Sinkにプロキシサポートを追加します。 + +### ClickHouseバージョンアップグレード + +- Parquetファイルの読み取りのパフォーマンスが劇的に改善されました。詳細は[23.8リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-08)をご覧ください。 +- JSON用の型推論サポートを追加しました。詳細は[23.9リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-09)をご覧ください。 +- `ArrayFold`のような強力なアナリスト向け関数を導入しました。詳細は[23.10リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-10)をご覧ください。 +- **ユーザー向け後方互換性ない変更**:サンプルデータが数字に似ている文字列を含む場合の解析エラーを可能性があるため、JSONフォーマットで文字列から数値推論を避けるために、デフォルトで設定`input_format_json_try_infer_numbers_from_strings`を無効化。 +- 新機能、パフォーマンス向上、バグ修正が多数。詳細は[コアデータベースの変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog)をご覧ください。 + +### コンソールの変更 + +- ログインと認証フローを改善しました。 +- 大規模なスキーマをよりよくサポートするためにAIベースのクエリ提案を改善しました。 + +### インテグレーションの変更 + +- Kafka Connect Sink:プロキシサポート、`topic-tablename`マッピング、およびKeeper _exactly-once_ 配信プロパティの設定可能性を追加。 +- Node.js クライアント:Parquetフォーマットのサポートを追加。 +- Metabase:`datetimeDiff`関数のサポートを追加。 +- Pythonクライアント:カラム名に特殊文字のサポートを追加。タイムゾーンパラメータバインディングを修正。 + +## 2023年11月2日 + +このリリースは、アジアでの開発サービスに対する地域サポートを拡張し、顧客管理の暗号化キーに対するキー回転機能、請求コンソールの税設定の詳細度を向上させ、サポートされている言語クライアントのバグ修正を提供します。 + +### 一般的な更新 +- 開発サービスがAWSの`ap-south-1`(ムンバイ) と `ap-southeast-1`(シンガポール) で利用可能になりました +- 顧客管理の暗号化キー (CMEK) にキー回転のサポートを追加 + +### コンソールの変更 +- クレジットカード追加時に細かな税設定を構成する能力を追加 + +### インテグレーションの変更 +- MySQL + - MySQLを介してTableau OnlineとQuickSightのサポートを改善しました +- Kafka コネクタ + - テキストベースフォーマット(CSV、TSV)をサポートする新しいStringConverterを導入 + - バイト数及び小数点数データ型をサポート + - エラー.トレランス=すべての場合でも、再試行可能例外を常に再試行するように調整 +- Node.js クライアント + - 大規模なデータセットのストリームで提供する破損した結果に関する問題を修正 +- Python クライアント + - 大量挿入時のタイムアウトを修正 + - Numpy/PandasのDate32に関する問題を修正 +​​- Golang クライアント + - 空のマップをJSONカラムに挿入する際の問題を修正、圧縮バッファクリーンアップ、クエリエスケープ、IPv4及びIPv6のゼロ/ nilでのパニック + - キャンセルされた挿入を監視するウォッチドッグを追加 +- DBT + - 分散テーブルのサポートをテストで改善 + +## 2023年10月19日 + +このリリースは、SQLコンソールの使いやすさとパフォーマンスの向上、MetabaseコネクタのIPデータタイプ処理の改善、およびJavaとNode.jsクライアントでの新機能をもたらします。 + +### コンソールの変更 +- SQLコンソールの使いやすさを改善(例えば、クエリ実行間の列幅を維持する) +- SQLコンソールのパフォーマンスを改善 + +### インテグレーションの変更 +- Java クライアント: + - オープンコネクションを再利用するためにデフォルトのネットワークライブラリを切り替え、パフォーマンスを向上 + - プロキシサポートを追加 + - Trust Storeを使用した安全な接続のサポートを追加 +- Node.jsクライアント:挿入クエリのkeep-alive動作を修正 +- Metabase:IPv4/IPv6カラムのシリアル化を修正 + +## 2023年9月28日 + +このリリースはKafka、Confluent Cloud、Amazon MSKおよびKafka Connect ClickHouse Sink用のClickPipesの一般提供を可能にし、AWS S3への安全なアクセスの自己サービスワークフロー、およびAI支援クエリ提案(プライベートプレビュー)を提供します。 + +### コンソールの変更 +- [AWS S3への安全なアクセス](/docs/ja/cloud/security/secure-s3)の自己サービスワークフローを追加 +- プライベートプレビューでAI支援によるクエリ提案を導入(試してみたい方は[ClickHouse Cloudサポート](https://clickhouse.cloud/support)までお問い合わせください) + +### インテグレーションの変更 +- Kafka、Confluent Cloud、Amazon MSK用のClickPipesの一般提供を発表([リリースブログ](https://clickhouse.com/blog/clickpipes-is-generally-available)をご参照ください) +- Kafka Connect ClickHouse Sinkの一般提供に到達 + - `clickhouse.settings`プロパティを使用したカスタマイズされたClickHouse設定サポートを拡張 + - 動的フィールドを考慮した重複排除動作を改善 + - ClickHouseからのテーブル変更取得用に`tableRefreshInterval`を追加 +- [PowerBI](/docs/ja/integrations/powerbi)および ClickHouse データ型との間のSSL接続問題と型マッピングを修正 + +## 2023年9月7日 + +このリリースはPowerBI Desktopの公式コネクタのベータリリース、インドでのクレジットカード決済処理の改善、サポートされている言語クライアントでの複数の改善を提供します。 + +### コンソールの変更 +- インドからの請求をサポートするために残高と支払い再試行を追加 + +### インテグレーションの変更 +- Kafka コネクタ: ClickHouse設定を構成するサポートを追加、エラー.tolerance構成オプションを追加 +- PowerBI Desktop: 公式コネクターのベータ版をリリース +- Grafana: ポイントジオタイプのサポートを追加、Data Analystダッシュボードのパネルを修正、timeIntervalマクロを修正 +- Pythonクライアント: Pandas 2.1.0との互換性, Python 3.7のサポートを終了し、nullable JSON型のサポートを追加 +- Node.js クライアント: default_format 設定のサポートを追加 +- Golang クライアント: bool型の取り扱いを修正、文字列の制限を解除 + +## 2023年8月24日 + +このリリースはClickHouseデータベースへのMySQLインターフェースサポート、新しい公式PowerBIコネクタ、クラウドコンソールでの「実行中のクエリ」ビュー、ClickHouseバージョン23.7への更新を追加します。 + +### 一般的な更新 +- [MySQLプロトコル](https://clickhouse.com/docs/ja/interfaces/mysql)へのサポートを追加しました。このサポートにより、多くの既存のBIツールとの互換性が可能です。会社に対するこの機能を有効にするにはサポートまでお問い合わせください。 +- 新しい公式PowerBIコネクタを導入しました + +### コンソールの変更 +- SQLコンソールでの「実行中のクエリ」ビューサポートを追加 + +### ClickHouse 23.7 バージョンアップグレード +- Azureテーブル関数のサポートを追加し、プロダクション対応のジオデータタイプ、ジョインパフォーマンスを改善 - 23.5リリース [ブログ](https://clickhouse.com/blog/clickhouse-release-23-05) で詳細を参照 +- MongoDBの統合をバージョン6.0まで拡張 - 23.6リリース [ブログ](https://clickhouse.com/blog/clickhouse-release-23-06) で詳細を参照 +- Parquet形式への書き込みパフォーマンスを6倍に向上し、PRQLクエリ言語のサポートを追加し、SQL互換性を向上 - 23.7リリース [デック](https://presentations.clickhouse.com/release_23.7/)で詳細を参照 +- 新機能、パフォーマンス向上、およびバグ修正が多数 - 23.5、23.6、23.7の詳細な[変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog)をご参照ください + +### インテグレーションの変更 +- Kafkaコネクタ: Avro日付および時間タイプのサポートを追加 +- JavaScriptクライアント: ウェブベースの環境用に安定版をリリース +- Grafana: フィルターロジック、データベース名処理を改善し、サブ秒精度のTimeIntevalをサポート +- Golangクライアント:複数のバッチおよび非同期データローディングの問題を修正 +- Metabase:v0.47をサポートし、接続に疑似化を追加、データ型マッピングを修正 + +## 2023年7月27日 + +このリリースは、Kafka、ClickHouse用のClickPipesのプライベートプレビュー、新しいデータローディング体験、およびクラウドコンソールを使用してURLからファイルをロードする能力を導入します。 + +### インテグレーションの変更 +- ClickPipes for Kafkaのプライベートプレビューを導入し、カフカとConfluent Cloudからの大規模データを数クリックで取り込むクラウドネイティブの統合エンジン。参加をご希望の方はこちらの[待機リスト](https://clickhouse.com/cloud/clickpipes#joinwaitlist)にサインアップしてください。 +- JavaScriptクライアント:ウェブベースの環境(ブラウザ、Cloudflareワーカー)のサポートをリリース。コミュニティによるカスタム環境向けコネクタ作成を許可するためにコードをリファクタリング。 +- Kafkaコネクタ:Timestamp とTime Kafkaタイプでのインラインスキーマサポートを追加 +- Pythonクライアント:挿入圧縮およびLowCardinality読み取りの問題を修正 + +### コンソールの変更 +- 変更時のテーブル作成設定オプションを多数揃えた新しいデータローディング体験を追加 +- クラウドコンソールを使用したURLからのファイルロード機能を導入 +- 参加フローを改善し、別の組織に参加するための追加オプションと、すべての保留中の参加を表示 + +## 2023年7月14日 + +このリリースは、専用サービスを立ち上げる能力、新しいAWSリージョンオーストラリア、およびディスク上の暗号化データに対する独自のキー持ち込み能力を導入します。 + +### 一般的な更新 +- 新しいAWSオーストラリア地域:シドニー (ap-southeast-2) +- レイテンシーを厳しく監視したワークロード用の専用階層サービス(セットアップには[サポート](https://clickhouse.cloud/support)に連絡してください) +- 磁気ディスク上の暗号化データのための独自のキー持ち込み能力 (設置には[サポート](https://clickhouse.cloud/support)に連絡してください) + +### コンソールの変更 +- 非同期挿入用の観測性メトリクスダッシュボードへの改善 +- サポートとの統合のためのチャットボットの振る舞いを改善 + +### インテグレーションの変更 +- NodeJSクライアント:ソケットタイムアウトによる接続失敗の修正 +- Pythonクライアント:挿入クエリに対するQuerySummaryの追加、データベース名での特殊文字サポート +- Metabase:JDBCドライバーバージョン、DateTime64サポート、パフォーマンス改善を更新 + +### コアデータベースの変更 +- [クエリキャッシュ](https://clickhouse.com/docs/ja/operations/query-cache)はClickHouse Cloudで利用可能です。有効にすると、成功したクエリはデフォルトで1分間キャッシュされ、以降のクエリはキャッシュされた結果を使用します。 + +## 2023年6月20日 + +このリリースはClickHouse Cloud on GCPを一般提供し、Cloud API用のTerraformプロバイダーを提供し、ClickHouseバージョン23.4へ更新します。 + +### 一般的な更新 +- ClickHouse Cloud on GCPはGAで、GCPマーケットプレースの統合、プライベートサービス接続のサポート、および自動バックアップ (詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-on-google-cloud-platform-gcp-is-generally-available)と[プレスリリース](https://clickhouse.com/blog/clickhouse-cloud-expands-choice-with-launch-on-google-cloud-platform)を参照) をもたらします。 +- [Terraformプロバイダー](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)がCloud APIで利用可能になりました + +### コンソールの変更 +- サービスのための新しい統合設定ページを追加 +- ストレージと計算のためのメータリング精度を調整 + +### インテグレーションの変更 +- Pythonクライアント:挿入パフォーマンスを改善し、内部依存をリファクタリングしてマルチプロセッシングをサポート +- Kafkaコネクタ: Confluent Cloudにアップロードおよびインストールでき、臨時の接続問題を再試行、無効なコネクタステートを自動リセット + +### ClickHouse 23.4 バージョンアップグレード +- 並列レプリカのJOINサポートを追加 (設置には[サポート](https://clickhouse.cloud/support)までご連絡ください) +- 論理削除のパフォーマンスを改善 +- 大規模挿入の処理中にキャッシュを改善 + +### 管理変更 +- 非「デフォルト」ユーザーのためのローカルDictionary作成を拡張 + +## 2023年5月30日 +このリリースでは、ClickHouse Cloudの管理プレーン操作向けプログラムAPIの一般公開(詳細は[ブログ](https://clickhouse.com/blog/using-the-new-clickhouse-cloud-api-to-automate-deployments)を参照)、IAMロールを用いたS3アクセス、および追加のスケーリングオプションを提供します。 + +### 一般的な変更 +- ClickHouse Cloud用APIサポート。新しいCloud APIを使用すると、既存のCI/CDパイプラインに管理サービスをシームレスに統合し、サービスをプログラムで管理できます。 +- IAMロールを使用したS3アクセス。IAMロールを活用して、プライベートなAmazon Simple Storage Service (S3) バケットに安全にアクセスできるようになりました(設定するにはサポートにお問い合わせください)。 + +### スケーリングの変更 +- [水平スケーリング](/docs/ja/manage/scaling#adding-more-nodes-horizontal-scaling)。より多くの並列化が必要なワークロードは、最大10のレプリカで構成できるようになりました(設定するにはサポートにお問い合わせください)。 +- [CPUベースの自動スケーリング](/docs/ja/manage/scaling)。CPU負荷の高いワークロードは、自動スケーリングポリシーに追加のトリガーを利用できます。 + +### コンソールの変更 +- DevサービスからProductionサービスへの移行(有効にするにはサポートにお問い合わせください)。 +- インスタンス作成フロー中のスケーリング設定コントロールの追加 +- デフォルトのパスワードがメモリに存在しないときの接続文字列の修正 + +### 統合の変更 +- Golangクライアント:ネイティブプロトコルでの不均衡な接続を引き起こす問題を修正し、ネイティブプロトコルでのカスタム設定のサポートを追加 +- Nodejsクライアント:nodejs v14のサポートを中止し、v20のサポートを追加 +- Kafka Connector:LowCardinality型のサポートを追加 +- Metabase:タイムレンジでのグループ化を修正し、Metabaseに組み込まれた質問での整数サポートを修正 + +### パフォーマンスと信頼性 +- 書き込み負荷の高いワークロードの効率とパフォーマンスを改善 +- バックアップの速度と効率を上げるための増分バックアップ戦略を展開 + +## 2023年5月11日 + +このリリースでは、ClickHouse Cloud on GCPの~~パブリックベータ~~ (現在GA、詳しくは6月20日の項目を参照) を提供し、管理者権限の拡張によりクエリの終了権限を付与し、CloudコンソールでMFAユーザーのステータスの可視性を向上させます。 + +### ClickHouse Cloud on GCP ~~(パブリックベータ)~~ (現在GA、詳しくは6月20日の項目を参照) +- Google ComputeとGoogle Cloud Storage上で動作する、完全に管理されたストレージとコンピュートの分離されたClickHouseオファリングを開始 +- 米国アイオワ(us-central1)、オランダ(ヨーロッパ西部4)、シンガポール(アジア南東部1)のリージョンで利用可能 +- すべての初期リージョンで開発および本番サービスをサポート +- デフォルトで強力なセキュリティを提供:転送中のエンドツーエンド暗号化、静止中のデータ暗号化、IP許可リスト + +### 統合の変更 +- Golangクライアント:プロキシ環境変数のサポートを追加 +- Grafana:GrafanaデータソースセットアップでClickHouseカスタム設定とプロキシ環境変数を指定する機能を追加 +- Kafka Connector:空のレコードの処理を改善 + +### コンソールの変更 +- ユーザーリストに多要素認証(MFA)使用のインジケーターを追加 + +### パフォーマンスと信頼性 +- 管理者向けにクエリ終了権限のより細かい制御を追加 + +## 2023年5月4日 + +このリリースでは、新しいヒートマップチャートタイプを導入し、課金使用ページを改善し、サービスの起動時間を改善します。 + +### コンソールの変更 +- SQLコンソールにヒートマップチャートタイプを追加 +- 各課金ディメンション内で消費されたクレジットを表示するように課金使用ページを改善 + +### 統合の変更 +- Kafkaコネクタ:一時的な接続エラーの再試行メカニズムを追加 +- Pythonクライアント:http接続が永遠に再利用されないようにするmax_connection_age設定を追加。これにより、特定のロードバランシングの問題を解決するのに役立ちます +- Node.jsクライアント:Node.js v20のサポートを追加 +- Javaクライアント:クライアント証明書認証のサポートを改善し、ネストされたタプル、マップ、ネストされたタイプのサポートを追加 + +### パフォーマンスと信頼性 +- 大量のパーツが存在する際のサービスの起動時間を改善 +- SQLコンソールのロングランニングクエリキャンセルのロジックを最適化 + +### バグ修正 +- ‘Cell Towers’サンプルデータセットのインポートが失敗するバグを修正 + +## 2023年4月20日 + +このリリースではClickHouseのバージョンを23.3に更新し、コールドリードの速度を大幅に改善し、サポートとのリアルタイムチャットを提供します。 + +### コンソールの変更 +- サポートとのリアルタイムチャットオプションを追加 + +### 統合の変更 +- Kafka コネクタ:Nullable 型のサポートを追加 +- Golang クライアント:外部テーブルのサポートを追加、ブールとポインタ型のパラメータバインディングをサポート + +### 設定の変更 +- `max_table_size_to_drop` と `max_partition_size_to_drop` の設定をオーバーライドして大きなテーブルを削除する能力を追加 + +### パフォーマンスと信頼性 +- S3 プリフェッチを通じてコールドリードの速度を改善する `allow_prefetched_read_pool_for_remote_filesystem` 設定を導入 + +### ClickHouse 23.3 バージョンアップグレード +- 論理削除が本番対応となり、詳細は23.3リリース[ブログ](https://clickhouse.com/blog/clickhouse-release-23-03)を参照 +- 複数ステージのPREWHEREをサポートに追加、23.2リリース[ブログ](https://clickhouse.com/blog/clickhouse-release-23-03)を参照 +- 新機能、パフォーマンス改善、バグ修正多数 - 詳細な[変更ログ](/docs/ja/whats-new/changelog/index.md)を参照ください + +## 2023年4月6日 + +このリリースでは、クラウドエンドポイントを取得するためのAPI、最小アイドルタイムアウトのための高度なスケーリング制御、およびPythonクライアントクエリメソッドでの外部データのサポートを提供します。 + +### APIの変更 +* [Cloud Endpoints API](/docs/ja/cloud/security/cloud-endpoints-api.md)経由でClickHouse Cloudエンドポイントをプログラムでクエリする能力を追加 + +### コンソールの変更 +- 高度なスケーリング設定に「最小アイドルタイムアウト」設定を追加 +- データロードモーダルでのスキーマ推論に最善努力の日付時刻検出を追加 + +### 統合の変更 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):複数のスキーマサポートを追加 +- [Go client](/docs/ja/integrations/language-clients/go/index.md):TLS接続のアイドル接続ライブネスチェックを修正 +- [Python client](/docs/ja/integrations/language-clients/python/index.md) + - クエリメソッドでの外部データのサポートを追加 + - クエリ結果のタイムゾーンサポートを追加 + - `no_proxy` / `NO_PROXY` 環境変数のサポートを追加 + - Nullable型のNULL値のサーバー側パラメータバインディングを修正 + +### バグ修正 +* SQLコンソールからの `INSERT INTO … SELECT …` 実行時に選択クエリと同じ行制限が誤って適用される問題を修正 + +## 2023年3月23日 + +このリリースでは、データベースのパスワードの複雑さルールを導入し、大規模なバックアップの復元速度を大幅に向上させ、Grafana Trace Viewでのトレース表示サポートを追加します。 + +### セキュリティと信頼性 +- 基幹データベースエンドポイントはパスワードの複雑さルールを施行 +- 大規模バックアップの復元時間を改善 + +### コンソールの変更 +- オンボーディングワークフローを合理化し、新しいデフォルトとよりコンパクトなビューを導入 +- サインアップおよびサインイン遅延を削減 + +### 統合の変更 +- Grafana: + - ClickHouseに保存されたトレースデータのTrace View表示サポートを追加 + - 時間範囲フィルタを改善し、テーブル名に特殊文字サポートを追加 +- Superset:ネイティブClickHouseサポートを追加 +- Kafka Connect Sink:自動日付変換とNullカラム処理を追加 +- Metabase:v0.46との互換性を実装 +- Pythonクライアント:一時テーブルへの挿入を修正し、Pandas Nullサポートを追加 +- Golangクライアント:タイムゾーンでDate型を正規化 +- Javaクライアント + - 圧縮、インファイル、アウトファイルキーワードのSQLパーサーサポートを追加 + - 資格情報の負荷を追加 + - `ON CLUSTER`でのバッチサポートを修正 +- Node.jsクライアント + - JSONStrings, JSONCompact, JSONCompactStrings, JSONColumnsWithMetadata形式のサポートを追加 + - すべての主要なクライアントメソッドに `query_id` を提供可能 + +### バグ修正 +- 新しいサービスの初期プロビジョニングと起動時間の遅延を引き起こすバグを修正 +- キャッシュの誤設定によるクエリ性能の低下を引き起こすバグを修正 + +## 2023年3月9日 + +このリリースでは監視ダッシュボードを改善し、大規模バックアップの作成時間を最適化し、大規模なテーブルやパーティションを削除するために必要な設定を追加します。 + +### コンソールの変更 +- 高度な監視ダッシュボードの追加(プレビュー) +- 監視ダッシュボードにメモリアロケーションチャートを導入 +- SQLコンソールのスプレッドシートビューでのスペースと改行処理を改善 + +### 信頼性とパフォーマンス +- データが変更された場合のみバックアップが実行されるようにバックアップスケジュールを最適化 +- 大規模バックアップの完了時間を改善 + +### 設定の変更 +- クエリまたは接続レベルで設定 `max_table_size_to_drop` と `max_partition_size_to_drop` をオーバーライドすることでテーブルとパーティションを削除するための制限を増やす能力を追加 +- クエリログにソースIPを追加し、ソースIPに基づいたクォータとアクセス制御の施行を可能に + +### 統合 +- [Python client](/docs/ja/integrations/language-clients/python/index.md):Pandasサポートを改善し、タイムゾーン関連の問題を修正 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):Metabase 0.46.xの互換性とSimpleAggregateFunctionのサポート +- [Kafka-Connect](/docs/ja/integrations/data-ingestion/kafka/index.md):暗黙的な日付変換とnullカラムのより良い取り扱い +- [Java Client](https://github.com/ClickHouse/clickhouse-java):Javaマップへのネストされた変換 + +## 2023年2月23日 + +このリリースでは、ClickHouse 23.1コアリリースの機能の一部を有効化し、Amazon Managed Streaming for Apache Kafka(MSK)との相互運用性を提供し、アクティビティログでの高度なスケーリングとアイドリングの調整を公開します。 + +### ClickHouse 23.1 バージョンアップグレード + +ClickHouse 23.1の機能の一部を追加。例: +- Map型とのARRAY JOIN +- SQL標準の16進数とバイナリリテラル +- 新しい関数、`age()`、`quantileInterpolatedWeighted()`、`quantilesInterpolatedWeighted()`など +- `generateRandom` で引数なしで挿入テーブルの構造を使用する能力 +- 過去の名前の再利用を可能にするデータベース作成と名前変更ロジックの改善 +- 詳細は23.1リリース[ウェビナースライド](https://presentations.clickhouse.com/release_23.1/#cover)および[23.1リリース変更ログ](/docs/ja/whats-new/changelog/index.md/#clickhouse-release-231)を参照ください + +### 統合の変更 +- [Kafka-Connect](/docs/ja/integrations/data-ingestion/kafka/index.md):Amazon MSKのサポートを追加 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):1.0.0の初期安定リリース + - 接続が[Metabase Cloud](https://www.metabase.com/start/)で利用可能 + - 利用可能なデータベースをすべて探索する機能を追加 + - AggregationFunction型のデータベースとの同期を修正 +- [DBT-clickhouse](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md):最新のDBTバージョンv1.4.1のサポートを追加 +- [Python client](/docs/ja/integrations/language-clients/python/index.md):プロキシとSSHトンネリングのサポートを改善。Pandasデータフレームのためのいくつかの修正とパフォーマンス最適化を追加 +- [Nodejs client](/docs/ja/integrations/language-clients/js.md):`system.query_log`からクエリメトリクスを取得するために使用可能な`query_id`をクエリ結果に添付する機能をリリース +- [Golang client](/docs/ja/integrations/language-clients/go/index.md):ClickHouse Cloudとのネットワーク接続を最適化 + +### コンソールの変更 +- アクティビティログに高度なスケーリングおよびアイドリング設定の調整を追加 +- パスワードリセットメールにユーザーエージェントとIP情報を追加 +- Google OAuthのサインアップフローメカニクスを改善 + +### 信頼性とパフォーマンス +- 大規模サービスのリジューム時間をスピードアップ +- 大規模なテーブルとパーティションを持つサービスのリード遅延を改善 + +### バグ修正 +- サービスパスワードのリセットがパスワードポリシーに従っていなかった動作を修正 +- 組織招待メールの検証を大文字小文字を区別しないように変更 + +## 2023年2月2日 + +このリリースでは、公式にサポートされたMetabase統合、主要なJavaクライアント/JDBCドライバリリース、およびSQLコンソールでのビューとMaterialized Viewサポートを提供します。 + +### 統合の変更 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md) プラグイン: ClickHouseが保守する公式ソリューションとしての提供 +- [dbt](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md) プラグイン: [複数スレッド](https://github.com/ClickHouse/dbt-clickhouse/blob/main/CHANGELOG.md)のサポートを追加 +- [Grafana](/docs/ja/integrations/data-visualization/grafana/index.md) プラグイン: 接続エラーのより良い処理 +- [Python](/docs/ja/integrations/language-clients/python/index.md) クライアント: 挿入操作の[ストリーミングサポート](/docs/ja/integrations/language-clients/python/index.md#streaming-queries) +- [Go](/docs/ja/integrations/language-clients/go/index.md) クライアント: [バグ修正](https://github.com/ClickHouse/clickhouse-go/blob/main/CHANGELOG.md): キャンセルされた接続のクローズを修正、接続エラーのより良い処理 +- [JS](/docs/ja/integrations/language-clients/js.md) クライアント: [exec/insertの破壊的な変更](https://github.com/ClickHouse/clickhouse-js/releases/tag/0.0.12); 返戻タイプでquery_idを公開 +- [Java](https://github.com/ClickHouse/clickhouse-java#readme) クライアント/JDBCドライバーの大幅なリリース + - [破壊的な変更](https://github.com/ClickHouse/clickhouse-java/releases): 廃止されたメソッド、クラス、およびパッケージが削除 + - R2DBCドライバーとファイル挿入サポートを追加 + +### コンソールの変更 +- SQLコンソールでのビューとMaterialized Viewのサポートを追加 + +### パフォーマンスと信頼性 +- 停止中/アイドリング中のインスタンスのパスワードリセットを高速化 +- より正確なアクティビティトラッキングによるスケールダウン動作の改善 +- SQLコンソールでのCSVエクスポートが切り捨てられたバグを修正 +- サンプルデータのアップロードに断続的な障害が発生するバグを修正 + +## 2023年1月12日 + +このリリースでは、ClickHouseのバージョンを22.12に更新し、多くの新しいソースでDictionaryを有効にし、クエリのパフォーマンスを改善します。 + +### 一般的な変更 +- 外部ClickHouse、Cassandra、MongoDB、MySQL、PostgreSQL、Redisを含む追加のソースのためDictionaryを有効化 + +### ClickHouse 22.12 バージョンアップグレード +- Grace Hash Joinを含むJOINサポートを拡張 +- ファイルを読み取るためのバイナリJSON(BSON)サポートを追加 +- GROUP BY ALLの標準SQL構文をサポート +- 固定精度での小数演算のための新しい数学関数を追加 +- 完全な変更のリストは[22.12 リリースブログ](https://clickhouse.com/blog/clickhouse-release-22-12)と[詳細な 22.12 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2212-2022-12-15)を参照 + +### コンソールの変更 +- SQLコンソールでの自動補完機能を改善 +- デフォルトリージョンが大陸のローカリティを考慮するように +- 課金使用ページを改善し、課金単位とウェブサイト単位の両方を表示 + +### 統合の変更 +- DBTリリース[v1.3.2](https://github.com/ClickHouse/dbt-clickhouse/blob/main/CHANGELOG.md#release-132-2022-12-23) + - delete+insertインクリメンタルストラテジーのエクスペリメンタルサポートを追加 + - 新しいs3sourceマクロ +- Pythonクライアント[v0.4.8](https://github.com/ClickHouse/clickhouse-connect/blob/main/CHANGELOG.md#048-2023-01-02) + - ファイル挿入サポート + - サーバーサイドクエリ[パラメータバインド](/docs/ja/interfaces/cli.md/#cli-queries-with-parameters) +- Goクライアント[v2.5.0](https://github.com/ClickHouse/clickhouse-go/releases/tag/v2.5.0) + - 圧縮のメモリ使用量削減 + - サーバーサイドクエリ[パラメータバインド](/docs/ja/interfaces/cli.md/#cli-queries-with-parameters) + +### 信頼性とパフォーマンス +- オブジェクトストア上で小さなファイルを大量に取得するクエリのリードパフォーマンスを改善 +- 新しく起動されたサービスのデフォルトのClickHouseリリース設定をもとにサービスを起動するときの[互換性](/docs/ja/cloud/manage/upgrades.md/#use-the-default-settings-of-a-clickhouse-release)設定を設定 + +### バグ修正 +高度なスケーリングスライダーを使用してリソースを予約すると、すぐに効果を発揮するようになりました。 + +## 2022年12月20日 + +このリリースでは、管理者がSQLコンソールにシームレスにログインできるようになり、コールドリードの読み取りパフォーマンスを改善し、ClickHouse Cloud用のMetabaseコネクタを改善します。 + +### コンソールの変更 +- 管理者ユーザー向けにSQLコンソールへのシームレスアクセスを有効に +- 新しい招待者のデフォルトロールを「管理者」に変更 +- オンボーディングサーベイを追加 + +### 信頼性とパフォーマンス +- ネットワーク障害時にリカバリするための長時間実行する挿入クエリの再試行ロジックを追加 +- コールドリードのリードパフォーマンスを改善 + +### 統合の変更 +- [Metabaseプラグイン](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md)は、待望のv0.9.1メジャーアップデートを受けました。これにより、最新のMetabaseバージョンとの互換性があり、ClickHouse Cloudに対して徹底的にテストされました。 + +## 2022年12月6日 - 一般提供 + +ClickHouse CloudがSOC2 Type II準拠、稼働率SLA、公共のステータスページを備えた、一般提供対応となりました。このリリースには、AWS Marketplace統合、ClickHouseユーザーのためのデータ探索ワークベンチであるSQLコンソール、ClickHouse Cloudでの自己学習のためのClickHouse Academyといった新たな主要機能が含まれています。詳細はこの[ブログ](https://clickhouse.com/blog/clickhouse-cloud-generally-available)をご覧ください。 + +### 生産準備完了 +- SOC2 Type II準拠(詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-is-now-soc-2-type-ii-compliant)および[Trust Center](https://trust.clickhouse.com/)を参照) +- ClickHouse Cloudの公開[ステータスページ](https://status.clickhouse.com/) +- 稼働率SLAが生産用途に利用可能 +- [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-jettukeanwrfc)上での利用可能 + +### 主要な新機能 +- SQLコンソールの導入、ClickHouseユーザー向けのデータ探索のためのワークベンチ +- 自己学習のための[ClickHouse Academy](https://learn.clickhouse.com/visitor_class_catalog)の開始、ClickHouse Cloudでの学習 + +### 価格とメータリングの変更 +- 試用期間を30日間に延長 +- 初心者向けプロジェクトと開発/ステージング環境に適した固定容量で低月額の開発サービスを導入 +- ClickHouse Cloudの運用とスケーリングを改善するために継続して、新しい生産サービスの低価格を導入 +- コンピュートの計測における粒度と忠実度を改善 + +### 統合の変更 +- ClickHouse Postgres / MySQL統合エンジンのサポートを有効化 +- SQLユーザー定義関数(UDF)のサポートを追加 +- Kafka Connectシンクをベータステータスに昇格 +- 統合UIを改善し、バージョンに関するリッチメタデータ、更新状況などを導入 + +### コンソールの変更 +- クラウドコンソールでの多要素認証サポート +- モバイルデバイス向けにクラウドコンソールナビゲーションを改善 + +### ドキュメントの変更 +- ClickHouse Cloudに専用の[ドキュメント](https://clickhouse.com/docs/ja/cloud/overview)セクションを導入 + +### バグ修正 +- バックアップからの復元が依存関係の解決により常に動作しないことがあるという既知の問題を修正 + +## 2022年11月29日 + +このリリースはSOC2 Type II準拠、ClickHouseのバージョンを22.11に更新し、多数のClickHouseクライアントと統合を改善します。 + +### 一般的な変更 +- SOC2 Type II準拠に達(詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-is-now-soc-2-type-ii-compliant)および[Trust Center](https://trust.clickhouse.com)を参照) + +### コンソールの変更 +- サービスが自動的に一時停止されていることを示す「アイドル」ステータスインジケータを追加 + +### ClickHouse 22.11 バージョンアップグレード + +- HudiとDeltaLakeテーブルエンジンとテーブル関数のサポートを追加 +- S3の再帰的なディレクトリトラバーサルを改善 +- 複合時間間隔構文のサポートを追加 +- 挿入時の信頼性を向上し、挿入時に再試行を行う +- 完全な変更のリストは[detailed 22.11 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2211-2022-11-17)を参照 + +### 統合 +- Pythonクライアント:v3.11のサポート、挿入パフォーマンスを改善 +- Goクライアント:DateTimeおよびInt64 のサポートを修正 +- JSクライアント:相互SSL認証のサポート +- dbt-clickhouse:DBT v1.3のサポート + +### バグ修正 +- アップグレード後に古いClickHouseバージョンを表示するバグを修正 +- "default" アカウントの権限を変更してもセッションが中断されなくなりました +- 新しく作成された非管理アカウントはデフォルトでシステムテーブルへのアクセスを持たなくなりました + +### このリリースの既知の問題 +- バックアップからの復元が依存関係の解決により動作しない可能性がある + +## 2022年11月17日 + +このリリースでは、ローカルClickHouseテーブルおよびHTTPソースからのDictionaryを有効化し、ムンバイリージョンのサポートを導入し、クラウドコンソールのユーザーエクスペリエンスを改善します。 + +### 一般的な変更 +- ローカルClickHouseテーブルおよびHTTPソースからの[Dictionary](/docs/ja/sql-reference/dictionaries/index.md)のサポートを追加 +- ムンバイ[リージョン](/docs/ja/cloud/reference/supported-regions.md)のサポートを導入 + +### コンソールの変更 +- 請求書のフォーマットを改善 +- 支払い方法キャプチャのユーザーインターフェースを合理化 +- バックアップのより細かいアクティビティログを追加 +- ファイルアップロード中のエラーハンドリングを改善 + +### バグ修正 +- 一部パーツ内に単一の大きなファイルが存在する場合にバックアップが失敗するバグを修正 +- アクセスリストの変更が同時に適用された場合にバックアップからの復元が成功しないバグを修正 + +### 既知の問題 +- バックアップからの復元が依存関係の解決により動作しない可能性がある + +## 2022年11月3日 + +このリリースでは、料金から読み取り・書き込み単位を削除し(詳細は[料金ページ](https://clickhouse.com/pricing)を参照)、ClickHouseのバージョンを22.10に更新し、セルフサービスのお客様向けにより高い垂直スケーリングをサポートし、より良いデフォルトを通じて信頼性を向上させます。 + +### 一般的な変更 +- 読み取り/書き込み単位を料金モデルから削除 + +### 設定の変更 +- `allow_suspicious_low_cardinality_types`、`allow_suspicious_fixed_string_types`、および`allow_suspicious_codecs`(デフォルトはfalse)の設定は、安定性のためにユーザーによって変更できなくなりました。 + +### コンソールの変更 +- 有料顧客のために垂直スケーリングのセルフサービス最大を720GBのメモリに引き上げ +- バックアップからの復元ワークフローを改善し、IPアクセスリストルールとパスワードを設定 +- サービス作成ダイアログにGCPとAzureのウェイトリストを導入 +- ファイルアップロード中のエラーハンドリングを改善 +- 課金管理のためのワークフローを改善 + +### ClickHouse 22.10 バージョンアップグレード +- 多くの大きなパーツ(少なくとも10 GiB)が存在する場合、"多すぎるパーツ"のしきい値を緩和することで、オブジェクトストア上での結合を改善。これにより、単一テーブルの単一パーティションで最大ペタバイトのデータを有効に。 +- 一定の時間しきい値を超えた後にマージするための`min_age_to_force_merge_seconds`設定を改善。 +- 設定をリセットするためのMySQL互換の構文を追加`SET setting_name = DEFAULT`。 +- Morton曲線エンコーディング、Java整数ハッシュ、およびランダム数生成のための関数を追加。 +- 完全な変更のリストは[detailed 22.10 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2210-2022-10-25)を参照ください。 + +## 2022年10月25日 + +このリリースでは、小規模なワークロードの計算消費を大幅に削減し、計算料金を引き下げ(詳細は[料金ページ](https://clickhouse.com/pricing)を参照)、より良いデフォルトを通じて安定性を向上させ、ClickHouse Cloudコンソールの課金と使用ビューを強化します。 + +### 一般的な変更 +- 最小サービスメモリアロケーションを24Gに削減 +- サービスアイドルタイムアウトを30分から5分に短縮 + +### 設定の変更 +- max_parts_in_totalを100kから10kに削減。MergeTreeテーブルの`max_parts_in_total`設定のデフォルト値は100,000から10,000に下げられました。この変更の理由は、クラウドでのサービス起動時間が遅くなる可能性があるためです。データパーツの多さは、多くの場合、非常に粒度の細かいパーティションキーの選択を示しており、これは通常誤って行われ、避けるべきです。このデフォルトの変更は、これらのケースをより早く検出することを可能にします。 + +### コンソールの変更 +- トライアルユーザー向けの課金ビューでのクレジット使用の詳細を強化 +- ツールチップとヘルプテキストを改善し、使用ビューに料金ページへのリンクを追加 +- IPフィルタリングのオプションを切り替える際のワークフローを改善 +- クラウドコンソールに再送メール確認ボタンを追加 + +## 2022年10月4日 - Beta + +ClickHouse Cloudは2022年10月4日にパブリックベータを開始しました。詳細はこの[ブログ](https://clickhouse.com/blog/clickhouse-cloud-public-beta)をご覧ください。 + +ClickHouse CloudバージョンはClickHouseコアv22.10に基づいています。互換性のある機能のリストは[Cloud Compatibility](/docs/ja/cloud/reference/cloud-compatibility.md)ガイドを参照ください。 diff --git a/docs/ja/cloud/reference/cloud-compatibility.md b/docs/ja/cloud/reference/cloud-compatibility.md new file mode 100644 index 00000000000..c7dd9af37c6 --- /dev/null +++ b/docs/ja/cloud/reference/cloud-compatibility.md @@ -0,0 +1,136 @@ +--- +slug: /ja/whats-new/cloud-compatibility +sidebar_label: Cloud Compatibility +title: クラウド互換性 +--- + +# ClickHouse Cloud — 互換性ガイド + +このガイドは、ClickHouse Cloudにおける機能的および操作上の期待を概観します。ClickHouse CloudはオープンソースのClickHouseディストリビューションに基づいていますが、アーキテクチャや実装にいくつかの違いがあるかもしれません。[ClickHouse Cloudをどのように構築したか](https://clickhouse.com/blog/building-clickhouse-cloud-from-scratch-in-a-year)についてのブログも背景として興味深いでしょう。 + +## ClickHouse Cloud アーキテクチャ +ClickHouse Cloudは、運用のオーバーヘッドを大幅に簡素化し、大規模にClickHouseを運用するコストを削減します。デプロイメントのサイズを事前に設定したり、高可用性のためにレプリケーションを設定したり、手動でデータをシャードしたり、ワークロードが増えたときにサーバーをスケールアップしたり、使用していないときにスケールダウンしたりする必要はありません。これらはすべて、私たちが処理します。 + +これらの利点は、ClickHouse Cloudの基盤となるアーキテクチャの選択によるものです: +- コンピュートとストレージが分離されており、異なる次元で自動的にスケーリングできるため、静的なインスタンス構成でストレージやコンピュートを過剰にプロビジョンする必要はありません。 +- オブジェクトストアの上にある階層型ストレージと多層キャッシングは、事実上無制限のスケーリングと良好な価格/性能比を提供し、ストレージパーティションを事前に設定する必要や高いストレージコストについて心配する必要はありません。 +- 高可用性はデフォルトでオンになっており、レプリケーションは透過的に管理されているため、アプリケーションの構築やデータの分析に集中できます。 +- 変動する継続的なワークロードのための自動スケーリングはデフォルトでオンになっており、サービスのサイズを事前に設定したり、ワークロードが増えたときにサーバーをスケールアップしたり、アクティビティが減少したときに手動でサーバーをスケールダウンしたりする必要はありません。 +- 断続的なワークロードのためのシームレスなハイバネーションがデフォルトでオンになっており、新しいクエリが到着したときに計算リソースを自動的に一時停止し、透過的に再開するため、アイドルリソースの支払いをする必要はありません。 +- 高度なスケーリング制御を使用して、コスト制御のための自動スケーリング最大値を設定したり、専門的な性能要件を持つアプリケーションのためにコンピュートリソースを予約するための自動スケーリング最小値を設定できます。 + +## 機能 +ClickHouse Cloudは、オープンソースディストリビューションのClickHouseの厳選された機能へのアクセスを提供します。以下のテーブルは、現時点でClickHouse Cloudで無効になっているいくつかの機能を説明しています。 + +### DDL構文 +ClickHouse CloudのDDL構文は、大部分がセルフマネージドインストールで利用可能なものと一致するはずです。一部の顕著な例外: + - 現在利用できない`CREATE AS SELECT`のサポート。代替策として、`CREATE ... EMPTY ... AS SELECT`を使用し、そのテーブルに挿入することをお勧めします(例については[このブログ](https://clickhouse.com/blog/getting-data-into-clickhouse-part-1)を参照してください)。 + - 一部のエクスペリメンタルな構文は無効にされる可能性があり、たとえば`ALTER TABLE … MODIFY QUERY`文です。 + - セキュリティ上の理由から一部のイントロスペクション機能が無効になることがあり、たとえば`addressToLine` SQL関数などです。 + - ClickHouse Cloudで`ON CLUSTER`パラメータを使用しないでください。これらは基本的に無効な関数ですが、[マクロ](https://clickhouse.com/docs/ja/operations/server-configuration-parameters/settings#macros)を使用しようとするとエラーが発生する可能性があります。マクロはClickHouse Cloudでは通常機能しないし、必要でもありません。 + +### データベースおよびテーブルエンジン + +ClickHouse Cloudはデフォルトで高可用性のレプリケートされたサービスを提供します。その結果、すべてのデータベースおよびテーブルエンジンは「Replicated」となります。たとえば、`ReplicatedMergeTree`と`MergeTree`はClickHouse Cloudで使用される場合、同一です。 + +**サポートされているテーブルエンジン** + + - ReplicatedMergeTree (指定がない場合のデフォルト) + - ReplicatedSummingMergeTree + - ReplicatedAggregatingMergeTree + - ReplicatedReplacingMergeTree + - ReplicatedCollapsingMergeTree + - ReplicatedVersionedCollapsingMergeTree + - MergeTree (ReplicatedMergeTreeに変換) + - SummingMergeTree (ReplicatedSummingMergeTreeに変換) + - AggregatingMergeTree (ReplicatedAggregatingMergeTreeに変換) + - ReplacingMergeTree (ReplicatedReplacingMergeTreeに変換) + - CollapsingMergeTree (ReplicatedCollapsingMergeTreeに変換) + - VersionedCollapsingMergeTree (ReplicatedVersionedCollapsingMergeTreeに変換) + - URL + - View + - MaterializedView + - GenerateRandom + - Null + - Buffer + - Memory + - Deltalake + - Hudi + - MySQL + - MongoDB + - NATS + - RabbitMQ + - PostgreSQL + - S3 + +### インターフェース +ClickHouse CloudはHTTPS、ネイティブインターフェース、および[MySQLワイヤプロトコル](/docs/ja/interfaces/mysql)をサポートしています。Postgresのような他のインターフェースのサポートは近日中に予定されています。 + +### Dictionary +Dictionaryは、ClickHouseでルックアップを高速化するための一般的な方法です。ClickHouse Cloudは現在、PostgreSQL、MySQL、リモートおよびローカルClickHouseサーバー、Redis、MongoDB、およびHTTPソースからのDictionaryをサポートしています。 + +### 分散クエリ +クラウド内でのクロスクラスタ通信と外部セルフマネージドClickHouseクラスタとの通信のために、分散ClickHouseクエリをサポートします。ClickHouse Cloudは現在、以下の統合エンジンを使用して分散クエリをサポートしています: + - Deltalake + - Hudi + - MySQL + - MongoDB + - NATS + - RabbitMQ + - PostgreSQL + - S3 + +SQLite、ODBC、JDBC、Redis、HDFS、Hiveのような一部の外部データベースおよびテーブルエンジンとの分散クエリはまだサポートされていません。 + +### ユーザー定義関数 + +ユーザー定義関数は、ClickHouseの最近の機能です。ClickHouse Cloudは現在、SQL UDFのみをサポートしています。 + +### エクスペリメンタル機能 + +エクスペリメンタル機能は、サービスデプロイメントの安定性を確保するためにClickHouse Cloudサービスで無効化されています。 + +### Kafka + +[Kafka テーブルエンジン](/docs/ja/integrations/data-ingestion/kafka/index.md)は、ClickHouse Cloudで一般に利用可能ではありません。代わりに、Kafka接続コンポーネントをClickHouseサービスから分離するアーキテクチャを利用することをお勧めします。Kafkaストリームからデータをプルするためには、[ClickPipes](https://clickhouse.com/cloud/clickpipes)をお勧めいたします。あるいは、プッシュベースの代替案として、[Kafkaユーザーガイド](/docs/ja/integrations/data-ingestion/kafka/index.md)にリストされているオプションを検討してください。 + +### Named collections + +[Named collections](/ja/operations/named-collections)は現在、ClickHouse Cloudでサポートされていません。 + +## 運用上のデフォルトと考慮事項 +以下はClickHouse Cloudサービスのデフォルト設定です。一部の設定はサービスの適切な運用を確保するために固定されており、他の設定は調整可能です。 + +### 運用の制限 + +#### `max_parts_in_total: 10,000` +MergeTreeテーブルの`max_parts_in_total`設定のデフォルト値は、100,000から10,000に引き下げられました。この変更の理由は、大量のデータパーツがクラウドでのサービスの起動時間を遅らせる可能性があることがわかったためです。多数のパーツは、通常はパーティションキーの選定が細かすぎることを示し、これは通常誤って行われるため避けるべきです。このデフォルトの変更により、これらのケースが早期に検出できるようになります。 + +#### `max_concurrent_queries: 1,000` +このサーバー単位の設定をデフォルトの100から1000に増加させ、より多くの同時性を許可しました。これにより、開発サービスでは2,000の同時クエリ、プロダクションでは3,000の同時クエリが可能になります。 + +#### `max_table_size_to_drop: 1,000,000,000,000` +この設定を50GBから1TBまでテーブル/パーティションの削除を許可するために増加しました。 + +### システム設定 +ClickHouse Cloudは可変のワークロードに最適化されており、そのため大多数のシステム設定は現時点で構成可能ではありません。ほとんどのユーザーにとってシステム設定の調整は不要と考えていますが、高度なシステム調整に関する質問がある場合は、ClickHouse Cloudサポートにお問い合わせください。 + +### 高度なセキュリティ管理 +ClickHouseサービスの作成の一環として、デフォルトのデータベースおよびこのデータベースに広範な権限を持つデフォルトユーザーが作成されます。この最初のユーザーは、他のユーザーを作成し、その権限をこのデータベースに割り当てることができます。これを超えて、Kerberos、LDAP、またはSSL X.509証明書認証を用いたデータベース内の以下のセキュリティ機能を有効にする機能は現時点ではサポートされていません。 + +## ロードマップ +以下のテーブルは、上記で説明したいくつかの機能を拡張するための取り組みを要約しています。フィードバックがある場合は、[こちらに提出](mailto:feedback@clickhouse.com)してください。 + +| 機能 | 状況 | +|---------------------------------------------------------------------------------------------|:----------------------------------------| +|Dictionaryサポート:PostgreSQL、MySQL、リモートおよびローカルClickHouseサーバー、Redis、MongoDB、およびHTTPソース | **GAで追加済み** | +|SQLユーザー定義関数(UDF) | **GAで追加済み** | +|MySQLおよびPostgreSQLエンジン | **GAで追加済み** | +|MySQLインターフェース | **GAで追加済み** | +|Postgresインターフェース | 近日公開 | +|SQLite、ODBC、Redis、HDFS、Hive向けエンジン | 近日公開 | +|Protobuf、Cap'n'Protoフォーマット | 近日公開 | +|Kafkaテーブルエンジン | 推奨されません; ※上記の代替案を参照 | +|JDBCテーブルエンジン | 推奨されません | +|EmbeddedRocksDBエンジン | 需要を評価中 | +|実行可能なユーザー定義関数 | 需要を評価中 | diff --git a/docs/ja/cloud/reference/compute-compute-separation.md b/docs/ja/cloud/reference/compute-compute-separation.md new file mode 100644 index 00000000000..87c2dd38cfc --- /dev/null +++ b/docs/ja/cloud/reference/compute-compute-separation.md @@ -0,0 +1,190 @@ +--- +title: ウェアハウス、またはコンピュート・コンピュート分離 +slug: /ja/cloud/reference/compute-compute-separation +keywords: [コンピュート分離, クラウド, アーキテクチャ, コンピュート・コンピュート, ウェアハウス, ウェアハウス] +description: ClickHouse Cloud での複数の、分離されたノードグループの使用方法 + +--- + +# ウェアハウス、またはコンピュート・コンピュート分離(プライベートプレビュー) + +## コンピュート・コンピュート分離とは? + +各ClickHouse Cloudサービスには以下が含まれます: +- ClickHouseノード(またはレプリカ)のグループ - **開発**ティアサービスには2ノード、**本番**ティアサービスには3ノード +- サービスに接続するために使用するエンドポイント(またはClickHouse Cloud UIコンソールで作成された複数のエンドポイント)、これはサービスURLです(例:`https://dv2fzne24g.us-east-1.aws.clickhouse.cloud:8443`) +- サービスがすべてのデータと一部のメタデータを保存するオブジェクトストレージフォルダー: + +
+ +NEEDS ALT + +
+ +_Fig. 1 - 現在のClickHouse Cloudサービス_ + +コンピュート・コンピュート分離により、ユーザーは複数のコンピュートノードグループを作成できます。これらはそれぞれ独自のエンドポイントを持ち、同じオブジェクトストレージフォルダーを使用するため、同じテーブル、ビューなどを持つことが可能です。 + +各コンピュートノードグループは独自のエンドポイントを持つため、どのレプリカセットをワークロードに使用するか選択できます。あるワークロードは小型のレプリカ1つで満足できるかもしれませんし、他のワークロードは高可用性(HA)と何百ギガのメモリを必要とするかもしれません。コンピュート・コンピュート分離により、読み取り操作を書き込み操作から分離し、相互に干渉しないようにすることも可能です。 + +
+ +NEEDS ALT + +
+ +_Fig. 2 - ClickHouse Cloudのコンピュート_ + +このプライベートプレビュープログラムでは、既存のサービスのデータを共有する新しいサービスを作成したり、同じデータを共有する複数のサービスを持つ完全に新しいセットアップを作成することができます。 + +## ウェアハウスとは何ですか? + +ClickHouse Cloudでの_ウェアハウス_は、同じデータを共有するサービスのセットです。 +各ウェアハウスには主要なサービス(最初に作成されたサービス)と副サービスがあります。以下のスクリーンショットでは、同じデータを共有する「DWH Prod」というウェアハウスと2つのサービスが含まれていることが分かります: +- 主要サービス「DWH Prod」 +- 副サービス「DWH Prod Subservice」 + +
+ +NEEDS ALT + +
+ +_Fig. 3 - ウェアハウスの例_ + +ウェアハウス内のすべてのサービスは同じものを共有します: + +- 地域(例:us-east1) +- クラウドサービスプロバイダー(AWS, GCPまたはAzure) +- ClickHouseデータベースのバージョン + +サービスは所属するウェアハウスごとにソートできます。 + +## アクセス制御 + +### データベース資格情報 + +ウェアハウス内のすべてが同じテーブルセットを共有しているため、他のサービスへのアクセス制御も共有します。これは、サービス1で作成されたすべてのデータベースユーザーが、同じ権限(テーブル、ビューへの付与など)を持ってサービス2も使用できることを意味します。ユーザーは各サービスの別のエンドポイントを使用しますが、同じユーザー名とパスワードを使用します。つまり、_ユーザーは同じストレージを使って作業するサービス間で共有されます:_ + +
+ +NEEDS ALT + +
+ +_Fig. 4 - ユーザーAliceはサービス1で作成されましたが、同じ資格情報を使って同じデータを共有するすべてのサービスにアクセスできます_ + +### ネットワークアクセス制御 + +他のアプリケーションやアドホックユーザーによる特定のサービスの使用を制限することはしばしば有用です。これはネットワーク制限を使用して実現できます。現在通常のサービスに設定されているのと同様に設定できます(ClickHouse Cloudコンソールの特定のサービスタブの**設定**に移動)。 + +IPフィルタリング設定を各サービスに別々に適用できるため、どのアプリケーションがどのサービスにアクセスできるかを制御できます。これにより、特定のサービスの利用を制限できます: + +
+ +NEEDS ALT + +
+ +_Fig. 5 - ネットワーク設定によりAliceはサービス2にアクセス不可とされています_ + +### 読み取り vs 読み書き + +特定のサービスの書き込みアクセスを制限し、ウェアハウス内のサービスのサブセットのみが書き込みを許可されるようにすることが有用な場合があります。これを行うには、2番目およびn番目のサービスを作成するときに行えます(最初のサービスは常に読み書き可能であるべきです): + +
+ +NEEDS ALT + +
+ +_Fig. 6 - ウェアハウス内の読み書き可能および読み取り専用のサービス_ + +## スケーリング + +ウェアハウス内の各サービスは以下に対してワークロードに合わせて調整できます: +- ノード(レプリカ)の数。現在、ノード(レプリカ)の最小数は2です。 +- ノード(レプリカ)のサイズ +- サービスが自動的にスケールするかどうか +- サービスが非アクティブ時にアイドル状態にするべきか(グループ内の最初のサービスには適用できません - **制限**セクションを参照してください) + +## 動作の変更 + +サービスでコンピュート・コンピュートが有効になると(少なくとも1つの副サービスが作成された場合)、`clusterAllReplicas()` 関数呼び出しは`default` クラスタ名を使用して、呼び出されたサービスのレプリカのみを活用します。つまり、同じデータセットに接続されている2つのサービスがあり、サービス1から `clusterAllReplicas(default, system, processes)` が呼ばれる場合、サービス1で実行されているプロセスのみが表示されます。必要に応じて、例えば `clusterAllReplicas('all_groups.default', system, processes)` を呼び出してすべてのレプリカに到達することもできます。 + +## 制限事項 + +このコンピュート・コンピュート分離が現在プライベートプレビュー中であるため、この機能を使用する場合にはいくつかの制限事項があります。これらの制限の多くは、機能がGA(一般公開)にリリースされた後に解除されます: + +1. **主要(元の)サービスは最近作成されたか、移行されているべきです。** 残念ながら、すべての既存のサービスが他のサービスとストレージを共有できるわけではありません。昨年中にサービスがサポートする必要があるいくつかの機能(共有Merge Treeエンジンなど)をリリースしたため、未更新のサービスはほとんど他のサービスとデータを共有できません。これはClickHouseバージョンに依存しません。 + + 良いニュースは、我々が古いサービスを新しいエンジンに移行し、追加のサービスを作成できるようにすることができます。ご希望のサービスが移行する必要があるかどうか、サポートにお問い合わせください。 + +2. **主要サービスは常に稼働中であり、アイドル状態になってはならない(GAの数時間後にこの制限は解除されます)。** プライベートプレビュー中およびGA後の数時間は、主要サービス(通常は他のサービスを追加することで拡張したい既存のサービス)は常に稼働しており、アイドル設定が無効化されています。少なくとも1つの副サービスがある場合、主要サービスを停止またはアイドル状態にすることはできません。すべての副サービスが削除されたら、元のサービスを再び停止またはアイドル状態にできます。 + +3. **時にはワークロードを隔離できないことがあります。** データベースワークロードを互いに隔離するオプションを提供することを目的としていますが、1つのサービスのワークロードが同じデータを共有する別のサービスに影響を与えるコーナーケースがあるかもしれません。これは主にOLTPのようなワークロードに関連する非常に稀な状況です。 + +4. **すべての読み書き可能なサービスはバックグラウンドマージ操作を実施します。** ClickHouseにデータを挿入すると、最初にデータベースはデータをステージングパーティションに挿入し、その後バックグラウンドでマージ操作を行います。これらのマージはメモリとCPUリソースを消費します。2つの読み書き可能なサービスが同じストレージを共有している場合、両方ともバックグラウンド操作を実行しています。つまり、サービス1で`INSERT`クエリがありますが、マージ操作がサービス2で完了することがあるかもしれません。読み取り専用のサービスはバックグラウンドマージを実行しないため、この操作にリソースを費やしません。 + +5. **一つの読み書き可能なサービスでの挿入操作が、アイドル状態にした場合のもう一つの読み書き可能なサービスを防ぐことがある。** 前のポイントのため、第二のサービスが最初のサービス用にバックグラウンドマージ操作を行います。これらのバックグラウンド操作は、第二のサービスがアイドル状態になるのを妨げる可能性があります。バックグラウンド操作が完了すると、サービスはアイドル状態になります。読み取り専用サービスは影響を受けず、遅延なくアイドル状態になります。 + +6. **CREATE/RENAME/DROP DATABASEクエリはアイドル/停止状態のサービスによってブロックされる可能性がある(GAの際に制限は解除されます)。** これらのクエリはハングすることがあります。これを回避するには、セッションまたはクエリ単位で `settings distributed_ddl_task_timeout=0` でデータベース管理クエリを実行することができます。例: + +```sql +create database db_test_ddl_single_query_setting +settings distributed_ddl_task_timeout=0 +``` + +## 料金 + +プライベートプレビュー中に作成された追加のサービスは通常どおり請求されます。コンピュート価格はウェアハウス内のすべてのサービス(主および副)で同じです。ストレージは一度だけ請求されます - それは最初の(オリジナルの)サービスに含まれています。 + +## プライベートプレビュー終了後に何が起こるか + +プライベートプレビュープログラムが終了し、コンピュート・コンピュート分離機能がGAにリリースされると、新しく作成されたサービスはコンピュート・コンピュート分離機能の一部としてそのまま残ります。データやサービスが削除されることはありません。 + +## バックアップ + +- 単一ウェアハウス内のすべてのサービスが同じストレージを共有しているため、バックアップは主要(初期)サービス上のみで作成されます。これにより、ウェアハウス内のすべてのサービスのデータがバックアップされます。 +- ウェアハウスの主要サービスのバックアップを復元する場合、既存のウェアハウスと接続されていない完全に新しいサービスに復元されます。復元が完了した直後に新しいサービスに他のサービスを追加できます。 + +## 始める方法 + +組織内でコンピュート・コンピュート分離プライベートプレビューを有効にするには、ClickHouse Cloudサポートチームに連絡してください。チームがこの機能を有効にすると、組織内の既存のサービスに追加のサービスを作成できるようになり、プラス記号をクリックします。 + +
+ +NEEDS ALT + +
+ +_Fig. 7 - ウェアハウス内で新しいサービスを作成するためにプラス記号をクリック_ + diff --git a/docs/ja/cloud/reference/images/architecture.svg b/docs/ja/cloud/reference/images/architecture.svg new file mode 100644 index 00000000000..73043b42179 --- /dev/null +++ b/docs/ja/cloud/reference/images/architecture.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/cloud/reference/images/aug-15-compute-compute.png b/docs/ja/cloud/reference/images/aug-15-compute-compute.png new file mode 100644 index 00000000000..c5dfb2b6c85 Binary files /dev/null and b/docs/ja/cloud/reference/images/aug-15-compute-compute.png differ diff --git a/docs/ja/cloud/reference/images/aug-29-scaling.png b/docs/ja/cloud/reference/images/aug-29-scaling.png new file mode 100644 index 00000000000..e77b0dfcea5 Binary files /dev/null and b/docs/ja/cloud/reference/images/aug-29-scaling.png differ diff --git a/docs/ja/cloud/reference/images/byoc-1.png b/docs/ja/cloud/reference/images/byoc-1.png new file mode 100644 index 00000000000..5702d22a618 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-1.png differ diff --git a/docs/ja/cloud/reference/images/byoc-2.png b/docs/ja/cloud/reference/images/byoc-2.png new file mode 100644 index 00000000000..dcb54f675b6 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-2.png differ diff --git a/docs/ja/cloud/reference/images/byoc-3.png b/docs/ja/cloud/reference/images/byoc-3.png new file mode 100644 index 00000000000..683e63a9ab7 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-3.png differ diff --git a/docs/ja/cloud/reference/images/byoc-4.png b/docs/ja/cloud/reference/images/byoc-4.png new file mode 100644 index 00000000000..f171dbc68bb Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-4.png differ diff --git a/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png b/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png new file mode 100644 index 00000000000..834a5d70016 Binary files /dev/null and b/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-1.png b/docs/ja/cloud/reference/images/compute-compute-1.png new file mode 100644 index 00000000000..8547a3d0efe Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-1.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-2.png b/docs/ja/cloud/reference/images/compute-compute-2.png new file mode 100644 index 00000000000..c5dfb2b6c85 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-2.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-3.png b/docs/ja/cloud/reference/images/compute-compute-3.png new file mode 100644 index 00000000000..1433fc5624e Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-3.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-4.png b/docs/ja/cloud/reference/images/compute-compute-4.png new file mode 100644 index 00000000000..cd7da5b5401 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-4.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-5.png b/docs/ja/cloud/reference/images/compute-compute-5.png new file mode 100644 index 00000000000..a53d8285388 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-5.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-6.png b/docs/ja/cloud/reference/images/compute-compute-6.png new file mode 100644 index 00000000000..80cefbe1013 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-6.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-7.png b/docs/ja/cloud/reference/images/compute-compute-7.png new file mode 100644 index 00000000000..af397e08e0d Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-7.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-8.png b/docs/ja/cloud/reference/images/compute-compute-8.png new file mode 100644 index 00000000000..a4c329474c9 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-8.png differ diff --git a/docs/ja/cloud/reference/images/create-tokyo-service.png b/docs/ja/cloud/reference/images/create-tokyo-service.png new file mode 100644 index 00000000000..edcef59bc63 Binary files /dev/null and b/docs/ja/cloud/reference/images/create-tokyo-service.png differ diff --git a/docs/ja/cloud/reference/images/july-18-table-inspector.png b/docs/ja/cloud/reference/images/july-18-table-inspector.png new file mode 100644 index 00000000000..f2efc2c97a5 Binary files /dev/null and b/docs/ja/cloud/reference/images/july-18-table-inspector.png differ diff --git a/docs/ja/cloud/reference/images/june-13-fast-releases.png b/docs/ja/cloud/reference/images/june-13-fast-releases.png new file mode 100644 index 00000000000..351fb3470e3 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-13-fast-releases.png differ diff --git a/docs/ja/cloud/reference/images/june-13-kafka-config.png b/docs/ja/cloud/reference/images/june-13-kafka-config.png new file mode 100644 index 00000000000..391bc3548d3 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-13-kafka-config.png differ diff --git a/docs/ja/cloud/reference/images/june-28-prometheus.png b/docs/ja/cloud/reference/images/june-28-prometheus.png new file mode 100644 index 00000000000..1e1e1685dbf Binary files /dev/null and b/docs/ja/cloud/reference/images/june-28-prometheus.png differ diff --git a/docs/ja/cloud/reference/images/june-28-query-insights.png b/docs/ja/cloud/reference/images/june-28-query-insights.png new file mode 100644 index 00000000000..e4b9681e232 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-28-query-insights.png differ diff --git a/docs/ja/cloud/reference/images/may-17-kinesis.png b/docs/ja/cloud/reference/images/may-17-kinesis.png new file mode 100644 index 00000000000..97dbec0a753 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-17-kinesis.png differ diff --git a/docs/ja/cloud/reference/images/may-17-query-endpoints.png b/docs/ja/cloud/reference/images/may-17-query-endpoints.png new file mode 100644 index 00000000000..4bc93b357a4 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-17-query-endpoints.png differ diff --git a/docs/ja/cloud/reference/images/may-30-private-endpoints.png b/docs/ja/cloud/reference/images/may-30-private-endpoints.png new file mode 100644 index 00000000000..a2ec543d44e Binary files /dev/null and b/docs/ja/cloud/reference/images/may-30-private-endpoints.png differ diff --git a/docs/ja/cloud/reference/images/may-30-share-queries.png b/docs/ja/cloud/reference/images/may-30-share-queries.png new file mode 100644 index 00000000000..56808712665 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-30-share-queries.png differ diff --git a/docs/ja/cloud/reference/images/new-cloud-console.gif b/docs/ja/cloud/reference/images/new-cloud-console.gif new file mode 100644 index 00000000000..ebc96f10ba3 Binary files /dev/null and b/docs/ja/cloud/reference/images/new-cloud-console.gif differ diff --git a/docs/ja/cloud/reference/images/oct-4-latency-insights.png b/docs/ja/cloud/reference/images/oct-4-latency-insights.png new file mode 100644 index 00000000000..214f8c706b8 Binary files /dev/null and b/docs/ja/cloud/reference/images/oct-4-latency-insights.png differ diff --git a/docs/ja/cloud/reference/images/shared-merge-tree-1.png b/docs/ja/cloud/reference/images/shared-merge-tree-1.png new file mode 100644 index 00000000000..447d00a2712 Binary files /dev/null and b/docs/ja/cloud/reference/images/shared-merge-tree-1.png differ diff --git a/docs/ja/cloud/reference/images/shared-merge-tree-2.png b/docs/ja/cloud/reference/images/shared-merge-tree-2.png new file mode 100644 index 00000000000..3c68e03c743 Binary files /dev/null and b/docs/ja/cloud/reference/images/shared-merge-tree-2.png differ diff --git a/docs/ja/cloud/reference/shared-merge-tree.md b/docs/ja/cloud/reference/shared-merge-tree.md new file mode 100644 index 00000000000..e79b2cffa51 --- /dev/null +++ b/docs/ja/cloud/reference/shared-merge-tree.md @@ -0,0 +1,119 @@ +--- +slug: /ja/cloud/reference/shared-merge-tree +sidebar_label: SharedMergeTree +title: SharedMergeTree +keywords: [shared merge tree sharedmergetree engine] +--- + +# SharedMergeTree テーブルエンジン + +*\* ClickHouse Cloud(および一部のパートナークラウドサービス)でのみ利用可能* + +SharedMergeTree テーブルエンジンファミリーは、ReplicatedMergeTree エンジンのクラウドネイティブな代替品であり、共有ストレージ(例:Amazon S3、Google Cloud Storage、MinIO、Azure Blob Storage)上での動作に最適化されています。特定の MergeTree エンジンタイプごとに SharedMergeTree アナログが存在し、つまり ReplacingSharedMergeTree は ReplacingReplicatedMergeTree を置き換えます。 + +SharedMergeTree テーブルエンジンファミリーは、ClickHouse Cloud の基盤です。エンドユーザーにとって、ReplicatedMergeTree ベースのエンジンを使用する代わりに SharedMergeTree エンジンファミリーを使い始めるために何かを変更する必要はありません。以下の追加の利点を提供します: + +- 高い挿入スループット +- バックグラウンドマージのスループットの向上 +- ミューテーションのスループットの向上 +- スケールアップおよびスケールダウン操作の高速化 +- 選択クエリのより軽量な強整合性 + +SharedMergeTree がもたらす重要な改善点は、ReplicatedMergeTree に比べて計算とストレージのより深い分離を提供することです。以下で ReplicatedMergeTree が計算とストレージをどのように分離するかを確認できます: + +![ReplicatedMergeTree Diagram](./images/shared-merge-tree-1.png) + +ご覧のとおり、ReplicatedMergeTree に保存されたデータはオブジェクトストレージにありますが、メタデータは依然として各 clickhouse-server に存在します。つまり、すべてのレプリケーション操作のために、メタデータもすべてのレプリカにレプリケートされる必要があります。 + +![ReplicatedMergeTree Diagram with Metadata](./images/shared-merge-tree-2.png) + +ReplicatedMergeTree とは異なり、SharedMergeTree はレプリカ同士の通信を必要としません。代わりに、すべての通信は共有ストレージと clickhouse-keeper を通じて行われます。SharedMergeTree は非同期のリーダーレスレプリケーションを実装し、clickhouse-keeper を調整およびメタデータストレージに使用します。これは、サービスのスケールアップおよびスケールダウンに伴ってメタデータをレプリケートする必要がないことを意味します。これにより、レプリケーション、ミューテーション、マージおよびスケールアップの操作が高速化されます。SharedMergeTree は各テーブルに対して何百ものレプリカを可能にし、シャードなしで動的にスケールすることができます。ClickHouse Cloud では、分散クエリ実行アプローチが採用され、より多くのコンピュートリソースがクエリに利用されます。 + +## 内部監視 + +ReplicatedMergeTree の内部監視に使用されるほとんどのシステムテーブルは、SharedMergeTree にも存在しますが、データとメタデータのレプリケーションが発生しないため、`system.replication_queue` と `system.replicated_fetches` は含まれていません。しかし、SharedMergeTree にはこれら2つのテーブルに対応する代替案があります。 + +**system.virtual_parts** + +このテーブルは `system.replication_queue` に対する SharedMergeTree の代替として機能します。現在のパーツの最新セット、ならびにマージ、ミューテーション、および削除されたパーティションなどの進行中の将来のパーツに関する情報を格納します。 + +**system.shared_merge_tree_fetches** + +このテーブルは `system.replicated_fetches` に対する SharedMergeTree の代替です。メモリに読み込まれる主キーとチェックサムの進行中のフェッチに関する情報を含みます。 + +## SharedMergeTree の有効化 + +`SharedMergeTree` はデフォルトで有効になっています。 + +SharedMergeTree テーブルエンジンをサポートするサービスでは、手動で何かを有効にする必要はありません。以前と同様にテーブルを作成すると、CREATE TABLE クエリで指定されたエンジンに対応する SharedMergeTree ベースのテーブルエンジンが自動的に使用されます。 + +```sql +CREATE TABLE my_table( + key UInt64, + value String +) +ENGINE = MergeTree +ORDER BY key +``` + +これにより、SharedMergeTree テーブルエンジンを使用して `my_table` テーブルが作成されます。 + +ClickHouse Cloud では `default_table_engine=MergeTree` として設定されているため、`ENGINE=MergeTree` を指定する必要はありません。以下のクエリは、上記のクエリと同一です。 + +```sql +CREATE TABLE my_table( + key UInt64, + value String +) +ORDER BY key +``` + +もし Replacing, Collapsing, Aggregating, Summing, VersionedCollapsing, または Graphite MergeTree テーブルを使用すると、それに対応する SharedMergeTree ベースのテーブルエンジンに自動的に変換されます。 + +```sql +CREATE TABLE myFirstReplacingMT +( + `key` Int64, + `someCol` String, + `eventTime` DateTime +) +ENGINE = ReplacingMergeTree +ORDER BY key; +``` + +特定のテーブルについて、`CREATE TABLE` ステートメントで使用されたテーブルエンジンを確認するには、`SHOW CREATE TABLE` を使用します。 +``` sql +SHOW CREATE TABLE myFirstReplacingMT; +``` + +```sql +CREATE TABLE default.myFirstReplacingMT +( `key` Int64, `someCol` String, `eventTime` DateTime ) +ENGINE = SharedReplacingMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') +ORDER BY key +SETTINGS index_granularity = 8192 +``` + +## 設定 + +いくつかの設定の挙動が大幅に変更されています: + +- `insert_quorum` -- すべての SharedMergeTree への挿入はクオーラム挿入(共有ストレージに書き込まれる)ですので、この設定は SharedMergeTree テーブルエンジンを使用する際には必要ありません。 +- `insert_quorum_parallel` -- すべての SharedMergeTree への挿入はクオーラム挿入(共有ストレージに書き込まれる)ですので、この設定は SharedMergeTree テーブルエンジンを使用する際には必要ありません。 +- `select_sequential_consistency` -- クオーラム挿入を必要とせず、`SELECT` クエリに追加の負荷を clickhouse-keeper にかけます。 + +## 一貫性 + +SharedMergeTree は、ReplicatedMergeTree よりも軽量な一貫性を提供します。SharedMergeTree に挿入する際には、`insert_quorum` や `insert_quorum_parallel` のような設定を提供する必要はありません。挿入はクオーラム挿入であり、メタデータは ClickHouse-Keeper に保存され、メタデータは少なくとも ClickHouse-keepers のクオーラムに複製されます。クラスター内の各レプリカは、非同期に ClickHouse-Keeper から新しい情報をフェッチします。 + +通常、`select_sequential_consistency` や `SYSTEM SYNC REPLICA LIGHTWEIGHT` を使用する必要はありません。非同期レプリケーションはほとんどのシナリオをカバーし、非常に低いレイテンシーを持っています。どうしても古いデータを読みたくない場合には、以下の推奨事項を優先順位に従って実行してください: + +1. クエリを同じセッションまたは同じノードで読み書きしている場合、`select_sequential_consistency` は必要ありません。すでにレプリカが最新のメタデータを持っているからです。 + +2. 一方のレプリカに書き込み、別のレプリカから読み取る場合、`SYSTEM SYNC REPLICA LIGHTWEIGHT` を使用して、レプリカが ClickHouse-Keeper からメタデータを取得するように強制できます。 + +3. クエリの一部として `select_sequential_consistency` という設定を使用します。 + +## 関連コンテンツ + +- [ClickHouse Cloud が SharedMergeTree と軽量アップデートでパフォーマンスを向上](https://clickhouse.com/blog/clickhouse-cloud-boosts-performance-with-sharedmergetree-and-lightweight-updates) diff --git a/docs/ja/cloud/reference/supported-regions.md b/docs/ja/cloud/reference/supported-regions.md new file mode 100644 index 00000000000..1df725dd921 --- /dev/null +++ b/docs/ja/cloud/reference/supported-regions.md @@ -0,0 +1,49 @@ +--- +title: サポートされているクラウドリージョン +sidebar_label: サポートされているクラウドリージョン +keywords: [aws, gcp, google cloud, azure, クラウド, リージョン] +description: ClickHouse Cloudがサポートするリージョン +--- +# サポートされているクラウドリージョン +## AWSリージョン + +- ap-northeast-1 (東京) +- ap-south-1 (ムンバイ) +- ap-southeast-1 (シンガポール) +- ap-southeast-2 (シドニー) +- eu-central-1 (フランクフルト) +- eu-west-1 (アイルランド) +- eu-west-2 (ロンドン) +- us-east-1 (北バージニア) +- us-east-2 (オハイオ) +- us-west-2 (オレゴン) + +**検討中:** +- ca-central-1 (カナダ) +- me-central-1 (中東) +- af-south-1 (南アフリカ) +- eu-north-1 (ストックホルム) +- sa-east-1 (南アメリカ) + + +## Google Cloudリージョン + +- asia-southeast1 (シンガポール) +- europe-west4 (オランダ) +- us-central1 (アイオワ) +- us-east1 (サウスカロライナ) + +**検討中:** +- australia-southeast1 (シドニー) +- us-west-1 (オレゴン) +- eu-west-1 (ベルギー) + +## Azureリージョン + +- 西 US 3 (アリゾナ) +- 東 US 2 (バージニア) +- ドイツ西中央 (フランクフルト) + +:::note +現在リストされていないリージョンへのデプロイが必要ですか? [リクエストを送信](https://clickhouse.com/pricing?modal=open)してください。 +::: diff --git a/docs/ja/cloud/security/_category_.yml b/docs/ja/cloud/security/_category_.yml new file mode 100644 index 00000000000..b7253753fd5 --- /dev/null +++ b/docs/ja/cloud/security/_category_.yml @@ -0,0 +1,6 @@ +label: 'Cloud Security' +collapsible: true +collapsed: true +link: + type: generated-index + title: Cloud Security diff --git a/docs/ja/cloud/security/accessing-s3-data-securely.md b/docs/ja/cloud/security/accessing-s3-data-securely.md new file mode 100644 index 00000000000..501ce1ebdc1 --- /dev/null +++ b/docs/ja/cloud/security/accessing-s3-data-securely.md @@ -0,0 +1,140 @@ +--- +slug: /ja/cloud/security/secure-s3 +sidebar_label: S3データに安全にアクセスする +title: S3データに安全にアクセスする +--- + +この記事では、ClickHouse Cloudの顧客が役割ベースのアクセスを活用してAmazon Simple Storage Service (S3) に認証し、安全にデータにアクセスする方法を説明します。 + +## はじめに + +安全なS3アクセスのセットアップに進む前に、その仕組みについて理解することが重要です。以下は、ClickHouseサービスが顧客のAWSアカウント内の役割を引き受けてプライベートS3バケットにアクセスする方法の概要です。 + +![secures3](@site/docs/ja/cloud/security/images/secures3.jpg) + +このアプローチにより、顧客は全てのS3バケットへのアクセスを一か所(引き受けた役割のIAMポリシー)で管理することができ、バケットポリシーをすべて見直してアクセスを追加または削除する必要がなくなります。 + +## セットアップ + +### ClickHouseサービスのIAMロールArnを取得 + +1 - ClickHouseクラウドアカウントにログインします。 + +2 - 統合を作成したいClickHouseサービスを選択します。 + +3 - **設定** タブを選択します。 + +4 - ページの下部にある **このサービスについて** セクションまでスクロールします。 + +5 - 下に示されているように、サービスに属する **IAMロール** 値をコピーします。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_arn.jpg) + +### IAM引き受けロールの設定 + +#### オプション1: CloudFormationスタックを使用してデプロイ + +1 - IAMロールの作成と管理の権限を持つIAMユーザーで、ウェブブラウザからAWSアカウントにログインします。 + +2 - [このURL](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/secure-s3.yaml&stackName=ClickHouseSecureS3) にアクセスしてCloudFormationスタックを構成します。 + +3 - ClickHouseサービスに属する **IAMロール** を入力(または貼り付け)します。 + +4 - CloudFormationスタックを設定します。以下は各パラメータについての追加情報です。 + +| パラメータ | デフォルト値 | 説明 | +| :--- | :----: | :---- | +| RoleName | ClickHouseAccess-001 | ClickHouse CloudがあなたのS3バケットにアクセスするのに使用する新しいロールの名前 | +| Role Session Name | * | Role Session Nameは、バケットをさらに保護するための共有シークレットとして使用できます。 | +| ClickHouse Instance Roles | | このSecure S3統合を使用できるClickHouseサービス IAMロールのカンマ区切りリスト。 | +| Bucket Access | Read | 提供されたバケットに対するアクセスレベルを設定します。 | +| Bucket Names | | このロールがアクセス権を持つ**バケット名**のカンマ区切りリスト。 | + +*注意*: フルバケットArnではなく、バケット名のみを入力してください。 + +5 - **AWS CloudFormationがカスタム名付きのIAMリソースを作成する可能性があります。** チェックボックスを選択します。 + +6 - 右下の **スタックを作成** ボタンをクリックします。 + +7 - CloudFormationスタックがエラーなく完了することを確認します。 + +8 - CloudFormationスタックの **Outputs** を選択します。 + +9 - この統合に必要な **RoleArn** 値をコピーします。これにより、S3バケットにアクセスできます。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_output.jpg) + +#### オプション2: IAMロールを手動で作成する + +1 - IAMロールの作成と管理の権限を持つIAMユーザーで、ウェブブラウザからAWSアカウントにログインします。 + +2 - IAMサービスコンソールに移動します。 + +3 - 以下のIAMポリシーと信頼ポリシーを持つ新しいIAMロールを作成します。 + +信頼ポリシー({ClickHouse_IAM_ARN}をClickHouseインスタンスに属するIAMロールのarnに置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "{ClickHouse_IAM_ARN}" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +IAMポリシー({BUCKET_NAME}をあなたのバケット名に置き換えてください): + +``` +{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "s3:GetBucketLocation", + "s3:ListBucket" + ], + "Resource": [ + "arn:aws:s3:::{BUCKET_NAME}" + ], + "Effect": "Allow" + }, + { + "Action": [ + "s3:Get*", + "s3:List*" + ], + "Resource": [ + "arn:aws:s3:::{BUCKET_NAME}/*" + ], + "Effect": "Allow" + } + ] +} +``` + +4 - 作成後の新しい **IAMロールArn** をコピーします。これにより、S3バケットにアクセスできます。 + +## ClickHouseAccessロールでS3バケットにアクセス + +ClickHouse Cloudには、新しく作成したロールを使用して`extra_credentials`をS3テーブル関数の一部として指定できる新機能があります。以下は、新しく作成したロールを使用してクエリを実行する例です。 + +``` +describe table s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001')) +``` + +以下は、`role_session_name`を共有シークレットとして使用してバケットからデータをクエリする例です。`role_session_name`が正しくない場合、この操作は失敗します。 + +``` +describe table s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', role_session_name = 'secret-role-name')) +``` + +:::note +データ転送料を削減するために、ソースS3がClickHouse Cloudサービスと同じ地域にあることをお勧めします。詳細については、[S3料金]( https://aws.amazon.com/s3/pricing/) を参照してください。 +::: diff --git a/docs/ja/cloud/security/audit-logging.md b/docs/ja/cloud/security/audit-logging.md new file mode 100644 index 00000000000..08caa5bbaf3 --- /dev/null +++ b/docs/ja/cloud/security/audit-logging.md @@ -0,0 +1,58 @@ +--- +sidebar_label: 監査ログ +slug: /ja/cloud/security/audit-logging +title: 監査ログ +--- + +ClickHouse Cloud では、左側のメニューにある**アクティビティ**タブを使って、あなたの ClickHouse Cloud オーガニゼーションに対してどのような変更が行われたか、誰が変更を行ったのか、いつ行われたのかを確認することができます。 + +ClickHouse Cloud 活動タブ + +
+ +**アクティビティ**ページでは、オーガニゼーションに関するイベントのリストがログに記録されたテーブルを表示します。デフォルトでは、このリストは逆時系列(最新のイベントが上部)でソートされています。テーブルの順序は、各カラムのヘッダーをクリックすることで変更できます。テーブルの各項目には以下のフィールドが含まれています: + +- **アクティビティ:** イベントを説明するテキストスニペット +- **ユーザー:** イベントを開始したユーザー +- **IP アドレス:** 該当する場合、イベントを開始したユーザーの IP アドレス +- **時間:** イベントのタイムスタンプ + +![ClickHouse Cloud アクティビティテーブル](./images/activity_log2.png) + +
+ +提供されている検索バーを使用して、サービス名や IP アドレスなどの基準に基づいてイベントを絞り込むことができます。また、この情報を CSV 形式でエクスポートして、外部ツールで配布や分析に使用することもできます。 + +
+ +![ClickHouse Cloud アクティビティ CSV エクスポート](./images/activity_log3.png) +
+ +## ログ記録されたイベントの一覧 + +オーガニゼーション用にキャプチャされたさまざまな種類のイベントは、**サービス**、**オーガニゼーション**、および **ユーザー**の3つのカテゴリにグループ化されています。ログ記録されたイベントのリストには次のものが含まれます: + +### サービス + +- サービスが作成されました +- サービスが削除されました +- サービスが停止されました +- サービスが開始されました +- サービス名が変更されました +- サービス IP アクセスリストが変更されました +- サービスのパスワードがリセットされました + +### オーガニゼーション + +- オーガニゼーションが作成されました +- オーガニゼーションが削除されました +- オーガニゼーション名が変更されました + +### ユーザー + +- ユーザーの役割が変更されました +- ユーザーがオーガニゼーションから削除されました +- ユーザーがオーガニゼーションに招待されました +- ユーザーがオーガニゼーションに参加しました +- ユーザー招待が削除されました +- ユーザーがオーガニゼーションから退出しました diff --git a/docs/ja/cloud/security/aws-privatelink.md b/docs/ja/cloud/security/aws-privatelink.md new file mode 100644 index 00000000000..721b9faccd9 --- /dev/null +++ b/docs/ja/cloud/security/aws-privatelink.md @@ -0,0 +1,416 @@ +--- +title: "AWS PrivateLink" +description: "このドキュメントは、AWS PrivateLink を使用して ClickHouse Cloud に接続する方法を説明します。" +slug: /ja/manage/security/aws-privatelink +--- + +# AWS PrivateLink + +[AWS PrivateLink](https://aws.amazon.com/privatelink/) を使用して、VPC、AWS サービス、お客様のオンプレミスシステム、および ClickHouse Cloud との間でインターネットを通さずに接続を提供することができます。このドキュメントは、AWS PrivateLink を使用して ClickHouse Cloud に接続する方法を説明します。AWS PrivateLink アドレス以外のアドレスからの ClickHouse Cloud サービスへのアクセスを無効にするには、ClickHouse Cloud の [IP アクセスリスト](https://clickhouse.com/docs/ja/cloud/security/setting-ip-filters) を使用します。 + +:::note 本番環境でのみ利用可能 +AWS PrivateLink は ClickHouse Cloud 本番サービスでのみ利用可能です。開発サービスはサポートしていません。 +::: + +AWS PrivateLink を有効にするには、以下の手順を完了してください。 +1. エンドポイントサービス名を取得します。 +2. サービスエンドポイントを作成します。 +3. エンドポイント ID を ClickHouse Cloud 組織に追加します。 +4. エンドポイント ID をサービスの許可リストに追加します。 + +AWS PrivateLink の完全な Terraform 例については、[こちら](https://github.com/ClickHouse/terraform-provider-clickhouse/tree/main/examples/PrivateLink)をご参照ください。 + +## 前提条件 + +始める前に必要なもの: + +1. AWS アカウント。 +2. プライベートリンクを作成および管理するための必要な権限を持つ API キー。 + +## 手順 + +以下の手順に従って、ClickHouse Cloud を AWS PrivateLink に接続します。 + +### エンドポイントサービス名の取得 + +#### オプション 1: ClickHouse Cloud コンソール + +ClickHouse Cloud コンソールで、PrivateLink を介して接続したいサービスを開き、**Settings** メニューを開きます。**Set up private endpoint** ボタンをクリックします。Private Link のセットアップに使用する **Service name** をコピーします。 + +![Private Endpoints](./images/aws-privatelink-pe-create.png) + +#### オプション 2: API + +コマンドを実行する前に、以下の環境変数を設定します。 + +```shell +REGION= +PROVIDER=aws +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +SERVICE_NAME= +``` + +リージョン、プロバイダー、およびサービス名でフィルタリングして、目的のインスタンス ID を取得します。 + +```shell +export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services | \ +jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\" and .name==\"${SERVICE_NAME:?}\") | .id " -r) +``` + +Private Link 構成のための AWS Service Name を取得します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | \ +jq .result +``` + +このコマンドを実行すると、次のような結果が返されます。 + +```result +{ + ... + "endpointServiceId": "com.amazonaws.vpce.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx", + ... +} +``` + +`endpointServiceId` をメモして、[手順 2 に進みます](#create-a-service-endpoint)。 + +### サービスエンドポイントの作成 + +次に、前のステップで取得した `endpointServiceId` を使用してサービスポイントを作成します。 + +#### オプション 1: AWS コンソール + +AWS コンソールを開き、**VPC** → **Endpoints** → **Create endpoints** に進みます。 + +**Other endpoint services** を選択し、前のステップで取得した `endpointServiceId` を使用します。完了したら、**Verify service** をクリックします。 + +![](./images/aws-privatelink-endpoint-settings.png) + +次に、VPC とサブネットを選択します。 + +![Select VPC and subnets](./images/aws-privatelink-select-vpc-and-subnets.png) + +オプションとして、セキュリティグループ/タグを割り当てます。 + +:::note ポート +セキュリティグループでポート `8443` と `9440` が許可されていることを確認してください。 +::: + +VPC エンドポイントを作成した後、`Endpoint ID` の値をメモしてください。これは次のステップで必要になります。 + +![VPC endpoint ID](@site/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png) + +#### オプション 2: AWS CloudFormation + +正しいサブネット ID、セキュリティグループ、および VPC ID を使用するようにしてください。 + +```response +Resources: + ClickHouseInterfaceEndpoint: + Type: 'AWS::EC2::VPCEndpoint' + Properties: + VpcEndpointType: Interface + PrivateDnsEnabled: false + ServiceName: + VpcId: vpc-vpc_id + SubnetIds: + - subnet-subnet_id1 + - subnet-subnet_id2 + - subnet-subnet_id3 + SecurityGroupIds: + - sg-security_group_id1 + - sg-security_group_id2 + - sg-security_group_id3 +``` + +#### オプション 3: Terraform + +```json +resource "aws_vpc_endpoint" "this" { + vpc_id = var.vpc_id + service_name = "" + vpc_endpoint_type = "Interface" + security_group_ids = [ + var.security_group_id1,var.security_group_id2, var.security_group_id3, + ] + subnet_ids = [var.subnet_id1,var.subnet_id2,var.subnet_id3] + private_dns_enabled = false +} +``` + +#### エンドポイントのプライベート DNS 名を変更する + +このステップでは、プライベート DNS ゾーン `.vpce.aws.clickhouse.cloud` の構成を AWS VPC に注入します。 + +:::note DNS リゾルバー +独自の DNS リゾルバーを使用している場合は、`.vpce.aws.clickhouse.cloud` の DNS ゾーンを作成し、ワイルドカードレコード `*..vpce.aws.clickhouse.cloud` をエンドポイント ID IP アドレスにポイントします。 +::: + +#### オプション 1: AWS コンソール + +**VPC Endpoints** に移動して、VPC エンドポイントを右クリックし、**Modify private DNS name** を選択します。 + +![Endpoints menu](@site/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png) + +開いたページで、**Enable private DNS names** を選択します。 + +![Modify DNS names](@site/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png) + +#### オプション 2: AWS CloudFormation + +`CloudFormation` テンプレートを更新し、`PrivateDnsEnabled` を `true` に設定します。 + +```json +PrivateDnsEnabled: true +``` + +変更を適用します。 + +#### オプション 3: Terraform + +- Terraform コード内の `aws_vpc_endpoint` リソースを変更し、`private_dns_enabled` を `true` に設定します。 + +```json +private_dns_enabled = true +``` + +変更を適用します。 + +### エンドポイント ID を ClickHouse Cloud 組織に追加 + +#### オプション 1: ClickHouse Cloud コンソール + +組織にエンドポイントを追加するには、[サービスの許可リストにエンドポイント ID を追加](#add-endpoint-id-to-services-allow-list)のステップに進んでください。ClickHouse Cloud コンソールでサービス許可リストに `Endpoint ID` を追加すると、自動的に組織にも追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints** を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/pe-remove-private-endpoint.png) + +#### オプション 2: API + +コマンドを実行する前に、以下の環境変数を設定します。 + +```bash +PROVIDER=aws +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +ENDPOINT_ID=<前のステップからのエンドポイント ID> +REGION=<リージョンコード, AWS フォーマットを使用してください> +``` + +前のステップからのデータを使用して `VPC_ENDPOINT` 環境変数を設定します。 + +エンドポイントを追加するには、次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET=<キー シークレット> +ORG_ID= +ENDPOINT_ID=<前のステップからのエンドポイント ID> +INSTANCE_ID=<インスタンス ID> +``` + +許可リストにエンドポイント ID を追加するには: + +```bash +cat < +KEY_SECRET=<キー シークレット> +ORG_ID= +INSTANCE_ID=<インスタンス ID> +``` + +次のコマンドを実行します: + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | \ +jq .result +``` + +これは次のような出力を返します: + +```result +{ + "endpointServiceId": "com.amazonaws.vpce.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx", + "privateDnsHostname": "xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud" +} +``` + +この例では、ホスト名 `xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud` への接続は PrivateLink へルーティングされますが、`xxxxxxx.yy-xxxx-N.aws.clickhouse.cloud` はインターネットを経由してルーティングされます。 + +## トラブルシューティング + +### 1 つのリージョンに複数の PrivateLink + +同じ AWS リージョン内で 2 つ以上の AWS Private Link を必要とする場合、次の点に注意してください:ClickHouse では、リージョンレベルで VPC エンドポイントサービスを提供しています。1 つの VPC に 2 つ以上の VPC エンドポイントをセットアップすると、AWS VPC の観点からは、1 つの AWS Private Link を使用していることになります。同じリージョン内で 2 つ以上の AWS Private Link を構成する必要がある場合は、1 つの VPC に 1 つの VPC エンドポイントを作成し、ClickHouse に依頼して同じ VPC エンドポイント ID を同じ AWS リージョン内のすべての ClickHouse サービスに設定してください。 + +### プライベートエンドポイントへの接続がタイムアウトする + +- VPC エンドポイントにセキュリティグループをアタッチしてください。 +- エンドポイントにアタッチされたセキュリティグループの `インバウンド` ルールを確認し、ClickHouse のポートを許可してください。 +- 接続テストに使用した VM にアタッチされたセキュリティグループの `アウトバウンド` ルールを確認し、ClickHouse のポートへの接続を許可してください。 + +### プライベートホスト名: ホストのアドレスが見つからない + +- "Private DNS names" オプションが有効になっていることを確認してください。詳細は[ステップ](#modify-private-dns-name-for-endpoint)をご確認ください。 + +### ピアによる接続のリセット + +- エンドポイント ID がサービス許可リストに追加されていない可能性があります。[ステップ](#add-endpoint-id-to-services-allow-list)をご確認ください。 + +### エンドポイントフィルターの確認 + +コマンドを実行する前に、以下の環境変数を設定します。 + +```bash +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +INSTANCE_ID=<インスタンス ID> +``` + +次のコマンドを実行します: + +```shell +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +-X GET -H "Content-Type: application/json" \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} | \ +jq .result.privateEndpointIds +``` + +### リモートデータベースへの接続 + +仮に、ClickHouse Cloud で [MySQL](../../sql-reference/table-functions/mysql.md) や [PostgreSQL](../../sql-reference/table-functions/postgresql.md) テーブル関数を使用して、Amazon Web Services (AWS) VPC にホストされているデータベースに接続しようとしているとします。この接続を安全に有効にするために AWS PrivateLink を使用することはできません。PrivateLink は片方向、一方向の接続です。内部ネットワークまたは Amazon VPC が安全に ClickHouse Cloud に接続することはできますが、ClickHouse Cloud から内部ネットワークに接続することはできません。 + +[AWS PrivateLink ドキュメント](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/aws-privatelink.html)によると: + +> AWS PrivateLink を使用して、クライアント/サーバー設定で、消費者 VPC がプロバイダー VPC にある特定のサービスまたは一連のインスタンスに一方向のアクセスを許可したい場合に使用します。消費者 VPC のクライアントだけが、サービスプロバイダー VPC のサービスに接続を開始できます。 + +これを実現するために、ClickHouse Cloud から内部/プライベートなデータベースサービスへの接続を許可するように AWS セキュリティグループを設定してください。ClickHouse Cloud のリージョンにおける[デフォルトの送信元 IP アドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api)と、[利用可能な静的 IP アドレス](https://api.clickhouse.cloud/static-ips.json)を確認してください。 diff --git a/docs/ja/cloud/security/azure-privatelink.md b/docs/ja/cloud/security/azure-privatelink.md new file mode 100644 index 00000000000..a801e3ea027 --- /dev/null +++ b/docs/ja/cloud/security/azure-privatelink.md @@ -0,0 +1,527 @@ +--- +title: Azure Private Link +sidebar_label: Azure Private Link +slug: /ja/cloud/security/azure-privatelink +description: How to set up Azure Private Link +keywords: [azure, private link, privatelink] +--- + +# Azure Private Link + +:::note +Azure Private LinkはClickHouse Cloudの**Production**サービスでのみ有効にできます。**Development**サービスはサポートされていません。 +::: + +このガイドは、Azure Private Linkを使用して、Azure(顧客所有およびMicrosoftパートナーサービスを含む)とClickHouse Cloudの間に仮想ネットワークを介したプライベート接続を提供する方法を示しています。Azure Private Linkはネットワークアーキテクチャを簡素化し、Azure内のエンドポイント間のデータの公開インターネットへの露出を排除することで接続を保護します。 + +![Overview of PrivateLink](@site/docs/ja/cloud/security/images/azure-pe.png) + +AWSやGCPとは異なり、AzureはPrivate Linkを介したクロスリージョン接続をサポートしています。これにより、複数のリージョンにデプロイされたClickHouseサービス間での接続を確立することができます。 + +:::note +リージョン間トラフィックには追加料金がかかる場合があります。最新のAzureドキュメントをご確認ください。 +::: + +Azure Private Linkを有効にするには、以下の手順を完了してください。 + +1. Private LinkのためのAzure接続エイリアスを取得する +1. Azureでプライベートエンドポイントを作成する +1. ClickHouse Cloud組織にプライベートエンドポイントGUIDを追加する +1. サービスの許可リストにプライベートエンドポイントGUIDを追加する +1. Private Linkを使用してClickHouse Cloudサービスにアクセスする + +Azure Private Linkの完全なTerraform例は[こちら](https://github.com/ClickHouse/terraform-provider-clickhouse/tree/main/examples/PrivateLinkAzure)をご覧ください。 + +## Private Link用のAzure接続エイリアスを取得する + +### オプション 1: ClickHouse Cloudコンソール + +ClickHouse Cloudコンソールで、PrivateLink経由で接続したいサービスを開き、**Settings**メニューを開きます。**Set up private endpoint**ボタンをクリックします。このステップで設定するために使用する**Service name**をコピーします。 + +![Private Endpoints](./images/azure-privatelink-pe-create.png) + +### オプション 2: API + +開始する前に、ClickHouse Cloud APIキーが必要です。[新しいキーを作成](https://clickhouse.com/docs/ja/cloud/manage/openapi)するか、既存のキーを使用してください。Private Link構成を管理するには**Admin**キーが必要になります。 + +APIキーを入手したら、コマンドを実行する前に次の環境変数を設定してください。 + +```bash +REGION= +PROVIDER=azure +KEY_ID= +KEY_SECRET= +ORG_ID= +``` + +リージョンからインスタンスIDを取得します。 + +指定されたリージョンに少なくとも1つのClickHouse Cloudサービスがデプロイされている必要があります。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1 | tee instance_id +``` + +前のステップで受け取ったIDを使用して`INSTANCE_ID`環境変数を作成します。 + +```bash +INSTANCE_ID=$(cat instance_id) +``` + +Azure接続エイリアスとPrivate DNSホスト名を取得します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | jq .result +{ + "endpointServiceId": "production-westus3-0-0.63c890a9-4d32-48cc-a08c-8cd92dfb1ad3.westus3.azure.privatelinkservice", + ... +} +``` + +`endpointServiceId`をメモしておいてください。次のステップで使用します。 + +## Azureでプライベートエンドポイントを作成する {#create-private-endpoint-in-azure} + +このセクションでは、Azureでプライベートエンドポイントを作成します。AzureポータルまたはTerraformのいずれかを使用できます。 + +### オプション 1: Azure Portalを使用してAzureでプライベートエンドポイントを作成 + +Azureポータルで、**Private Link Center → Private Endpoints**を開きます。 + +![Open Azure Private Center](@site/docs/ja/cloud/security/images/azure-private-link-center.png) + +**Create**ボタンをクリックしてプライベートエンドポイント作成ダイアログを開きます。 + +![Create PE](@site/docs/ja/cloud/security/images/azure-private-link-center.png) + +--- + +次の画面で、次のオプションを指定します。 + +- **Subscription** / **Resource Group**: プライベートエンドポイント用にAzureサブスクリプションとリソースグループを選択してください。 +- **Name**: **Private Endpoint**の名前を設定します。 +- **Region**: Private Linkを介してClickHouse Cloudと接続するVNETがデプロイされているリージョンを選択します。 + +上記のステップを完了したら、**Next: Resource**ボタンをクリックします。 + +![Create PE](@site/docs/ja/cloud/security/images/azure-pe-create-basic.png) + +--- + +**Connect to an Azure resource by resource ID or alias**オプションを選択します。 + +**Resource ID or alias**として、[Private Link用のAzure接続エイリアスを取得](#obtain-azure-connection-alias-for-private-link)ステップで取得した**endpointServiceId**を使用します。 + +**Next: Virtual Network**ボタンをクリックします。 + +![PE resource](@site/docs/ja/cloud/security/images/azure-pe-resource.png) + +--- + +- **Virtual network**: Private Linkを使用してClickHouse Cloudと接続したいVNETを選択します。 +- **Subnet**: プライベートエンドポイントが作成されるサブネットを選択します。 + +オプション: + +- **Application security group**: ASGをプライベートエンドポイントにアタッチし、ネットワークセキュリティグループでプライベートエンドポイントへの/からのネットワークトラフィックをフィルタリングするために使用できます。 + +**Next: DNS**ボタンをクリックします。 + +![PE network](@site/docs/ja/cloud/security/images/azure-pe-create-vnet.png) + +**Next: Tags**ボタンをクリックします。 + +--- + +![PE DNS](@site/docs/ja/cloud/security/images/azure-pe-create-dns.png) + +タグをプライベートエンドポイントにアタッチすることができます(任意)。 + +**Next: Review + create**ボタンをクリックします。 + +--- + +![PE tags](@site/docs/ja/cloud/security/images/azure-pe-create-tags.png) + +最後に、**Create**ボタンをクリックします。 + +![PE review](@site/docs/ja/cloud/security/images/azure-pe-create-review.png) + +作成されたプライベートエンドポイントの**Connection status**は**Pending**状態になります。このプライベートエンドポイントをサービス許可リストに追加すると**Approved**状態に変更されます。 + +プライベートエンドポイントに関連したネットワークインターフェースを開き、次のステップで必要になる**Private IPv4 address**(この例では10.0.0.4)をコピーします。 + +![PE IP address](@site/docs/ja/cloud/security/images/azure-pe-ip.png) + +### オプション 2: Terraformを使用してAzureでプライベートエンドポイントを作成する + +Terraformを使用してプライベートエンドポイントを作成するための以下のテンプレートを使用します。 + +```json +resource "azurerm_private_endpoint" "example_clickhouse_cloud" { + name = var.pe_name + location = var.pe_location + resource_group_name = var.pe_resource_group_name + subnet_id = var.pe_subnet_id + + private_service_connection { + name = "test-pl" + private_connection_resource_alias = "" + is_manual_connection = true + } +} +``` + +### プライベートエンドポイントresourceGuidの取得 {#obtaining-private-endpoint-resourceguid} + +Private Linkを使用するためには、プライベートエンドポイント接続GUIDをサービス許可リストに追加する必要があります。 + +プライベートエンドポイントリソースGUIDはAzureポータルでのみ表示されます。前のステップで作成したプライベートエンドポイントを開き、**JSON View**をクリックします。 + +![PE GUID](@site/docs/ja/cloud/security/images/azure-pe-view.png) + +`resourceGuid`フィールドを見つけ、この値をコピーします。 + +![PE GUID](@site/docs/ja/cloud/security/images/azure-pe-resource-guid.png) + +## Private LinkのためのDNSの設定 + +Private Linkを介してリソースにアクセスするために、プライベートDNSゾーン (`${location_code}.privatelink.azure.clickhouse.cloud`) を作成し、それをVNETにアタッチする必要があります。 + +### Private DNSゾーンを作成 + +**オプション 1: Azureポータルを使用** + +[Azure Portalを使用してAzureプライベートDNSゾーンを作成する](https://learn.microsoft.com/en-us/azure/dns/private-dns-getstarted-portal)ためのガイドに従ってください。 + +**オプション 2: Terraformを使用** + +Private DNSゾーンを作成するための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_zone" "clickhouse_cloud_private_link_zone" { + name = "${var.location}.privatelink.azure.clickhouse.cloud" + resource_group_name = var.resource_group_name +} +``` + +### ワイルドカードDNSレコードを作成 + +ワイルドカードレコードを作成し、プライベートエンドポイントにポイントします。 + +**オプション 1: Azureポータルを使用** + +1. MyAzureResourceGroupリソースグループを開き、`${region_code}.privatelink.azure.clickhouse.cloud`プライベートゾーンを選択します。 +2. **+ Record set**を選択します。 +3. **Name**に`*`を入力します。 +4. **IP Address**にプライベートエンドポイントのIPアドレスを入力します。 +5. **OK**を選択します。 + +![PE review](@site/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png) + +**オプション 2: Terraformを使用** + +ワイルドカードDNSレコードを作成するための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_a_record" "example" { + name = "*" + zone_name = var.zone_name + resource_group_name = var.resource_group_name + ttl = 300 + records = ["10.0.0.4"] +} +``` + +### 仮想ネットワークリンクを作成 + +プライベートDNSゾーンを仮想ネットワークにリンクするために、仮想ネットワークリンクを作成する必要があります。 + +**オプション 1: Azureポータルを使用** + +[プライベートDNSゾーンに仮想ネットワークをリンクする](https://learn.microsoft.com/en-us/azure/dns/private-dns-getstarted-portal#link-the-virtual-network)ためのガイドに従ってください。 + +**オプション 2: Terraformを使用** + +仮想ネットワークをプライベートDNSゾーンにリンクするための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_zone_virtual_network_link" "example" { + name = "test" + resource_group_name = var.resource_group_name + private_dns_zone_name = var.zone_name + virtual_network_id = var.virtual_network_id +} +``` + +### DNS設定の検証 + +westus3.privatelink.azure.clickhouse.cloudドメイン内の任意のレコードはプライベートエンドポイントIPにポイントされるべきです(この例では10.0.0.4)。 + +```bash +nslookup instance-id.westus3.privatelink.azure.clickhouse.cloud. +Server: 127.0.0.53 +Address: 127.0.0.53#53 + +Non-authoritative answer: +Name: instance-id.westus3.privatelink.azure.clickhouse.cloud +Address: 10.0.0.4 +``` + +## ClickHouse Cloud組織にプライベートエンドポイントGUIDを追加する + +### オプション 1: ClickHouse Cloudコンソール + +組織にエンドポイントを追加するには、[Add the Private Endpoint GUID to your service(s) allow list](#add-private-endpoint-guid-to-services-allow-list)ステップに進んでください。ClickHouse Cloudコンソールを使用してサービス許可リストに`Private Endpoint GUID`を追加すると、それが組織にも自動的に追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints**を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/azure-pe-remove-private-endpoint.png) + +### オプション 2: API + +コマンドを実行する前に次の環境変数を設定してください。 + +```bash +PROVIDER=azure +KEY_ID= +KEY_SECRET= +ORG_ID= +ENDPOINT_ID= +REGION= +``` + +[プライベートエンドポイントresourceGuidの取得](#obtaining-private-endpoint-resourceguid)ステップからのデータを使用して`VPC_ENDPOINT`環境変数を設定します。 + +プライベートエンドポイントを追加するために次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET= +ORG_ID= +ENDPOINT_ID= +INSTANCE_ID= +``` + +プライベートリンクを使用して利用可能にしたい各サービスで実行します。 + +サービス許可リストにプライベートエンドポイントを追加するために次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET= +ORG_ID= +INSTANCE_ID= +``` + +次のコマンドを実行します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | jq .result +``` + +次のような応答を受けるはずです。 + +```response +{ + ... + "privateDnsHostname": "xxxxxxx..privatelink.azure.clickhouse.cloud" +} +``` + +この例では、`xxxxxxx.region_code.privatelink.azure.clickhouse.cloud`ホスト名への接続はPrivate Linkにルーティングされます。一方、`xxxxxxx.region_code.azure.clickhouse.cloud`はインターネットを介してルーティングされます。 + +`privateDnsHostname`を使用して、プライベートリンクを介してClickHouse Cloudサービスに接続します。 + +## トラブルシューティング + +### DNS設定のテスト + +`${region_code}.privatelink.azure.clickhouse.cloud.`ゾーン内のすべてのDNSレコードは[Azureでプライベートエンドポイントを作成](#create-private-endpoint-in-azure)ステップからの内部IPアドレスにポイントされる必要があります。この例では、リージョンは`westus3`です。 + +次のコマンドを実行します。 + +```bash +nslookup abcd.westus3.privatelink.azure.clickhouse.cloud. +``` + +次のような応答を受けるはずです。 + +```response +Non-authoritative answer: +Name: abcd.westus3.privatelink.azure.clickhouse.cloud +Address: 10.0.0.4 +``` + +### ピアによる接続リセット + +おそらく、プライベートエンドポイントGUIDがサービス許可リストに追加されていません。[サービスの許可リストにプライベートエンドポイントGUIDを追加する](#add-private-endpoint-guid-to-services-allow-list)ステップに再度取り組んでください。 + +### プライベートエンドポイントがPending状態 + +おそらく、プライベートエンドポイントGUIDがサービス許可リストに追加されていません。[サービスの許可リストにプライベートエンドポイントGUIDを追加する](#add-private-endpoint-guid-to-services-allow-list)ステップに再度取り組んでください。 + +### 接続のテスト + +Private Link経由で接続に問題がある場合は、`openssl`を使用して接続を確認します。Private Linkエンドポイントのステータスが`Accepted`であることを確認してください。 + +OpenSSLは接続可能であるはずです(出力にCONNECTEDが表示されます)。`errno=104`は予期されたものです。 + +```bash +openssl s_client -connect abcd.westus3.privatelink.azure.clickhouse.cloud.cloud:9440 +``` + +```response +# highlight-next-line +CONNECTED(00000003) +write:errno=104 +--- +no peer certificate available +--- +No client certificate CA names sent +--- +SSL handshake has read 0 bytes and written 335 bytes +Verification: OK +--- +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +### プライベートエンドポイントフィルターの確認 + +コマンドを実行する前に次の環境変数を設定してください。 + +```bash +KEY_ID= +KEY_SECRET= +ORG_ID= +INSTANCE_ID= +``` + +プライベートエンドポイントフィルターを確認するために次のコマンドを実行します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} | jq .result.privateEndpointIds +[] +``` + +## 詳細情報 + +Azure Private Linkの詳細については、[azure.microsoft.com/en-us/products/private-link](https://azure.microsoft.com/en-us/products/private-link)をご覧ください。 diff --git a/docs/ja/cloud/security/cloud-access-management.md b/docs/ja/cloud/security/cloud-access-management.md new file mode 100644 index 00000000000..6571d2bfb48 --- /dev/null +++ b/docs/ja/cloud/security/cloud-access-management.md @@ -0,0 +1,140 @@ +--- +sidebar_label: 概要 +slug: /ja/cloud/security/cloud-access-management +title: クラウドアクセス管理 +--- + +# ClickHouse Cloudのアクセス制御 +ClickHouseはユーザーアクセスをコンソールとデータベースの2つの場所で制御します。コンソールアクセスはclickhouse.cloudのユーザーインターフェースを介して管理されます。データベースアクセスはデータベースのユーザーアカウントとロールを通じて管理されます。さらに、コンソールユーザーはSQLコンソールを介してデータベースとやり取りできるように、データベース内のロールを付与されることがあります。 + +## ロールの種類 +利用可能なロールの種類は次のとおりです: +- **コンソールロール** clickhouse.cloudコンソールへのアクセスを可能にします +- **データベースロール** 単一のサービス内の権限管理を可能にします +- **SQLコンソールロール** コンソールユーザーがSQLコンソールを介して割り当てられた権限でデータベースにアクセスできるようにする特別に名付けられたデータベースロール。 + +## 定義済みのロール +ClickHouse Cloudは、アクセス管理を可能にするための限られた数の定義済みロールを提供します。追加のカスタムデータベースロールは、データベース内で[CREATE ROLE](/ja/sql-reference/statements/create/role)および[GRANT](/ja/sql-reference/statements/grant)コマンドを使用していつでも作成できます。 + +| コンテキスト | ロール名 | 説明 | +|--------------|-----------------------|------------------------------------------------------------------------------------| +| コンソール | Admin | ClickHouse組織への完全アクセス | +| コンソール | Developer | ClickHouse組織への読み取り専用アクセス | +| SQLコンソール | sql_console_admin | データベースへの管理者アクセス | +| SQLコンソール | sql_console_read_only | データベースへの読み取り専用アクセス | +| データベース | default | データベースへの管理者アクセス。サービス作成時に`default`ユーザーに自動的に付与される | + +## 初期設定 +ClickHouse Cloudアカウントを最初に設定したユーザーは、コンソール内で自動的にAdminロールが割り当てられます。このユーザーは、他のユーザーを組織に招待し、AdminまたはDeveloperロールをユーザーに割り当てることができます。 + +:::note +コンソール内でユーザーのロールを変更するには、左側のユーザーメニューに移動し、ドロップダウンでユーザーのロールを変更してください。 +::: + +データベースには、自動的に追加され、サービス作成時にdefault_roleが付与された`default`というアカウントがあります。サービスが作成されたときに、このアカウントのランダムに生成されたパスワードが使用されたユーザーに表示されます。初期設定後はパスワードは表示されませんが、コンソール内で管理者権限を持つユーザーが後で変更することができます。このアカウントまたはコンソール内で管理者権限を持つアカウントは、いつでも追加のデータベースユーザーとロールを設定することができます。 + +:::note +コンソール内で`default`アカウントに割り当てられたパスワードを変更するには、左側のサービスメニューに移動してサービスにアクセスし、設定タブに移動してパスワードのリセットボタンをクリックしてください。 +::: + +新しいユーザーアカウントを作成し、そのユーザーにdefault_roleを付与することをお勧めします。これは、ユーザーが行った操作が彼らのユーザーIDに関連付けられ、`default`アカウントが緊急時対応操作用に予約されるためです。 + +``` +CREATE USER userID IDENTIFIED WITH sha256_hash by 'hashed_password'; +GRANT default_role to userID; +``` + +ユーザーはSHA256ハッシュジェネレーターまたはPythonのhashlibのようなコード関数を使用して、適切な複雑性を持つ12文字以上のパスワードをSHA256文字列に変換し、システム管理者に提供できます。これにより、管理者がクリアテキストのパスワードを見たり扱ったりすることがなくなります。 + +## コンソールロール +コンソールユーザーにはロールが割り当てられ、AdminまたはDeveloperロールを割り当てることができます。各ロールに関連付けられた権限は以下に含まれています。 + +| コンポーネント | 機能 | Admin | Developer | +|-----------------------------------|-----------------------------|--------|-----------| +| サービスの管理 | サービスを見る | ✅ | ✅ | +| | サービスを作成する | ✅ | ❌ | +| | サービスを削除する | ✅ | ❌ | +| | サービスを停止する | ✅ | ❌ | +| | サービスを再起動する | ✅ | ❌ | +| | サービスパスワードのリセット | ✅ | ❌ | +| | サービスメトリクスを表示 | ✅ | ✅ | +| クラウドAPI | APIキーの記録を見る | ✅ | ✅ | +| | APIキーを作成する | ✅ | Read-Only | +| | APIキーを削除する | ✅ | 自分のキー| +| コンソールユーザーの管理 | ユーザーを見る | ✅ | ✅ | +| | ユーザーを招待する | ✅ | ❌ | +| | ユーザーロールを変更する | ✅ | ❌ | +| | ユーザーを削除する | ✅ | ❌ | +| 請求、組織、サポート | 請求を見る | ✅ | ✅ | +| | 請求を管理する | ✅ | ❌ | +| | 組織活動を見る | ✅ | ❌ | +| | サポートリクエストを提出する| ✅ | ✅ | +| | 統合を見る | ✅ | ✅ | + +## SQLコンソールロール +私たちのコンソールには、パスワード無しの認証でデータベースとやり取りするためのSQLコンソールが含まれています。コンソールで管理者権限が付与されたユーザーは、組織内のすべてのデータベースに対する管理アクセス権を持っています。Developerロールが与えられたユーザーにはデフォルトでアクセス権がありませんが、コンソールから“フルアクセス”または“読み取り専用”のデータベース権限が割り当てられる場合があります。“読み取り専用”ロールは最初に読み取り専用アクセスをアカウントに付与します。しかし、読み取り専用アクセスが付与された後、特定のSQLコンソールユーザーのために新しいカスタムロールを作成し、そのユーザーがSQLコンソールを介してデータベースに接続する際に使用されるようにそのユーザーに関連付けることができます。 + +:::note +コンソール内のDeveloperロールを持つユーザーがSQLコンソールにアクセスできるようにするには、左側のサービスメニューに移動し、サービスにアクセスして設定をクリックし、SQLコンソールアクセスセクションまでスクロールし、“フルアクセス”または“読み取り専用”を選択します。アクセス権が付与されたら、以下の***SQLコンソールロールの作成***で示されているプロセスを使用してカスタムロールを割り当ててください。 +::: + +### パスワードレス認証について +SQLコンソールユーザーは各セッションごとに作成され、自動でローテーションされるX.509証明書を使用して認証されます。セッションが終了するとユーザーは削除されます。監査のためにアクセスリストを生成する場合は、コンソールのサービスの設定タブに移動して、SQLコンソールアクセスとデータベース内に存在するデータベースユーザーを確認してください。カスタムロールが構成されている場合、ユーザーのアクセスはユーザーのユーザー名で終わるロールにリストされます。 + +## SQLコンソールロールの作成 +SQLコンソールユーザーに関連付けられたカスタムロールを作成することができます。SQLコンソールはユーザーが新しいセッションを開くたびに新しいユーザーアカウントを作成するため、システムはロール名の命名規則を使用してカスタムデータベースロールをそのユーザーに関連付けます。これにより、それぞれのユーザーに個別のロールが割り当てられます。個別のロールは、GRANT文を通じて直接アクセス権を割り当てることができるか、一般的な新しいロール(例えばdatabase_developerやsecurity_administrator)を確立し、個別のユーザーロールにその一般的なロールを通じてアクセス権を与えることができます。 + +SQLコンソールユーザー用のカスタムロールを作成し、一般的なロールを付与するには、次のコマンドを実行します。メールアドレスはコンソール内のユーザーのメールアドレスと一致している必要があります。 +1. database_developerロールを作成し、SHOW、CREATE、ALTER、およびDELETE権限を付与します。 + +``` +CREATE ROLE OR REPLACE database_developer; +GRANT SHOW ON * TO database_developer; +GRANT CREATE ON * TO database_developer; +GRANT ALTER ON * TO database_developer; +GRANT DELETE ON * TO database_developer; +``` + +2. SQLコンソールユーザーmy.user@domain.comのためのロールを作成し、database_developerロールをそのロールに割り当てます。 + +``` +CREATE ROLE OR REPLACE `sql-console-role:my.user@domain.com`; +GRANT database_developer TO `sql-console-role:my.user@domain.com`; +``` + +このロールの構成を使用すると、ユーザーが存在しない場合にユーザーアクセスを表示するクエリは、ロール対ロールの付与を含めるために修正される必要があります。 + +``` +SELECT grants.user_name, + grants.role_name, + users.name AS role_member, + grants.access_type, + grants.database, + grants.table +FROM system.grants LEFT OUTER JOIN system.role_grants ON grants.role_name = role_grants.granted_role_name + LEFT OUTER JOIN system.users ON role_grants.user_name = users.name + +UNION ALL + +SELECT grants.user_name, + grants.role_name, + role_grants.role_name AS role_member, + grants.access_type, + grants.database, + grants.table +FROM system.role_grants LEFT OUTER JOIN system.grants ON role_grants.granted_role_name = grants.role_name +WHERE role_grants.user_name is null; +``` + +## データベースロール +ユーザーとカスタムロールは、CREATE User, CREATE Role, GRANTステートメントを使用してデータベース内で直接作成することもできます。SQLコンソール用に作成されたロールを除き、これらのユーザーとロールはコンソールユーザーとロールとは独立しています。 + +データベースロールは加算的です。これはつまり、ユーザーが2つのロールのメンバーである場合、ユーザーはその2つのロールに付与された最も多いアクセス権を持っていることになります。ロールを追加することでアクセス権が失われることはありません。 + +データベースロールは他のロールに付与することができ、階層構造が可能です。ロールは、メンバーであるロールのすべての権限を継承します。 + +データベースロールはサービスごとにユニークであり、同じサービス内の複数のデータベースに適用することができます。 + +以下の図は、ユーザーに権限が付与される可能性のある異なる方法を示しています。 + +![Screenshot 2024-01-18 at 5 14 41 PM](https://github.com/ClickHouse/clickhouse-docs/assets/110556185/94b45f98-48cc-4907-87d8-5eff1ac468e5) diff --git a/docs/ja/cloud/security/cloud-authentication.md b/docs/ja/cloud/security/cloud-authentication.md new file mode 100644 index 00000000000..11296d435ed --- /dev/null +++ b/docs/ja/cloud/security/cloud-authentication.md @@ -0,0 +1,122 @@ +--- +sidebar_label: クラウド認証 +slug: /ja/cloud/security/cloud-authentication +title: クラウド認証 +--- +# クラウド認証 + +ClickHouse Cloudは、認証方法をいくつか提供しています。このガイドでは、認証を構成するための良いプラクティスを説明します。認証方法を選択する際は、必ずセキュリティチームに確認してください。 + +## パスワード設定 + +コンソールとサービス(データベース)の最小パスワード設定は、現在 [NIST 800-63B](https://pages.nist.gov/800-63-3/sp800-63b.html#sec4) 認証器保証レベル1に準拠しています。 +- 最小12文字 +- 次の4項目のうち、3項目を含む: + - 1つの大文字 + - 1つの小文字 + - 1つの数字 + - 1つの特殊文字 + +## メール + パスワード + +ClickHouse Cloudでは、メールアドレスとパスワードで認証することができます。この方法を使用する際、ClickHouseアカウントを保護する最良の方法は強力なパスワードを使用することです。覚えやすいパスワードを考えるためのオンラインリソースはいくつもあります。また、ランダムなパスワード生成器を使用し、パスワードマネージャーにパスワードを保管することでセキュリティを強化できます。 + +## GoogleまたはMicrosoftのソーシャル認証を使用したSSO + +あなたの会社がGoogle WorkspaceまたはMicrosoft 365を使用している場合、現在のシングルサインオン(SSO)のセットアップをClickHouse Cloud内で利用できます。このためには、単に会社のメールアドレスでサインアップし、そのメールアドレスを使用して他のユーザーを招待します。その結果、ユーザーは、ClickHouse Cloudに認証する前に、会社のログインフロー(IDプロバイダー経由または直接GoogleまたはMicrosoft認証を通じて)を使用してログインする必要があります。 + +## 多要素認証 + +メール+パスワードまたはソーシャル認証を持つユーザーは、多要素認証(MFA)を使用して、アカウントの安全性をさらに高めることができます。MFAを設定するには: +1. console.clickhouse.cloudにログイン +2. ClickHouseロゴの隣にある左上のイニシャルをクリック +3. プロフィールを選択 +4. 左側のセキュリティを選択 +5. 認証アプリタイルの「セットアップ」をクリック +6. Authy、1Password、またはGoogle Authenticatorなどの認証アプリを使用してQRコードをスキャン +7. コードを入力して確認 +8. 次の画面で復旧コードをコピーし、安全な場所に保存 +9. `私はこのコードを安全に記録しました`のチェックボックスをオン +10. 続行をクリック + +## アカウントリカバリー + +
+ 復旧コードを取得 + + 以前にMFAに登録し、復旧コードを作成していないか紛失した場合は、新しい復旧コードを取得するために以下の手順に従ってください。 + 1. https://console.clickhouse.cloudにアクセス + 2. 資格情報とMFAでサインイン + 3. 左上のプロフィールに移動 + 4. 左側のセキュリティをクリック + 5. 認証アプリの横にあるゴミ箱をクリック + 6. 認証アプリを削除 + 7. コードを入力して続行をクリック + 8. 認証アプリセクションでセットアップをクリック + 9. QRコードをスキャンして新しいコードを入力 + 10. 復旧コードをコピーして安全な場所に保存 + 11. `私はこのコードを安全に記録しました`のチェックボックスをオン + 12. 続行をクリック + +
+
+ パスワードを忘れた場合 + + パスワードを忘れた場合、自分で回復するための手順は以下の通りです: + 1. https://console.clickhouse.cloudにアクセス + 2. メールアドレスを入力して続行をクリック + 3. パスワードをお忘れですか?をクリック + 4. パスワードリセットリンクを送信をクリック + 5. メールをチェックして、メールからパスワードをリセットをクリック + 6. 新しいパスワードを入力し、パスワードを確認して、パスワードの更新をクリック + 7. サインインに戻るをクリック + 8. 新しいパスワードで通常通りサインイン + +
+
+ MFAデバイスまたはトークンを紛失した場合 + + MFAデバイスを紛失するか、トークンを削除した場合、新しいトークンを作成するための手順は以下の通りです: + 1. https://console.clickhouse.cloudにアクセス + 2. 資格情報を入力して続行をクリック + 3. 多要素認証画面でキャンセルをクリック + 4. 復旧コードをクリック + 5. コードを入力して続行を押す + 6. 新しい復旧コードをコピーして、安全な場所に保管 + 7. `私はこのコードを安全に記録しました`のボックスをチェックし、続行をクリック + 8. サインイン後、左上のプロフィールに移動 + 9. 左上のセキュリティをクリック + 10. 認証アプリの横にあるゴミ箱アイコンをクリックし、古い認証アプリを削除 + 11. 認証アプリを削除をクリック + 12. 多要素認証を求められたらキャンセルをクリック + 13. 復旧コードをクリック + 14. 復旧コード(ステップ7で生成された新しいコード)を入力して続行をクリック + 15. 新しい復旧コードをコピーし、安全な場所に保管 - 削除プロセス中に画面を離れた場合のフェイルセーフです + 16. `私はこのコードを安全に記録しました`のチェックボックスをオンにして続行 + 17. 新しいMFAファクターを設定するための上記の手順に従う + +
+
+ MFAと復旧コードを両方とも紛失した場合 + + MFAデバイスと復旧コードを両方とも紛失した、またはMFAデバイスを紛失し、復旧コードを取得したことがない場合、リセットをリクエストするためには以下の手順に従ってください。 + + **チケットを提出する**: 他の管理ユーザーがいる組織にいる場合、たとえ一人だけのユーザー組織にアクセスしようとしている場合であっても、組織にログインし、あなたに代わってMFAをリセットするようサポートチケットを提出する役割を持つ組織のメンバーに依頼してください。リクエストが認証されたことを確認後、MFAをリセットし、管理者に通知します。通常通りにMFAなしでサインインし、新しいファクターを登録したい場合はプロフィール設定に移動してください。 + + **メールでリセット**: 組織の唯一のユーザーである場合は、アカウントに紐付けられたメールアドレスを使用して、サポートケースをメール(support@clickhouse.com)で提出してください。正しいメールからのリクエストであることを確認後、MFAとパスワードをリセットします。パスワードリセットリンクにアクセスするにはメールを確認してください。新しいパスワードを設定し、新しいファクターを登録したい場合はプロフィール設定に移動します。 + +
+ +## SAML SSO + +ClickHouse Cloudは、セキュリティアサーションマークアップ言語(SAML)シングルサインオン(SSO)もサポートしています。詳細については、[SAML SSOの設定](/docs/ja/cloud/security/saml-setup)を参照してください。 + +## データベースユーザーID + パスワード + +パスワードを保護するために、[ユーザーアカウントを作成する](/docs/ja/sql-reference/statements/create/user.md)際にSHA256_hashメソッドを使用してください。 + +**TIP:** 管理権限のないユーザーは自分でパスワードを設定できないので、ユーザーにパスワードを生成器でハッシュするよう依頼し、[このツール](https://tools.keycdn.com/sha256-online-generator)などを使用してから、それを管理者に提供してアカウントを設定してもらいます。パスワードは上記の[要件](#establish-strong-passwords)に従う必要があります。 + +``` +CREATE USER userName IDENTIFIED WITH sha256_hash BY 'hash'; +``` diff --git a/docs/ja/cloud/security/cloud-endpoints-api.md b/docs/ja/cloud/security/cloud-endpoints-api.md new file mode 100644 index 00000000000..bb86e375d36 --- /dev/null +++ b/docs/ja/cloud/security/cloud-endpoints-api.md @@ -0,0 +1,131 @@ +--- +slug: /ja/manage/security/cloud-endpoints-api +sidebar_label: クラウドIPアドレス +title: クラウドIPアドレス +--- + +## 静的IPの一覧 + +以下の表は、ClickHouse Cloudでサポートされている各クラウドとリージョンにおける静的IPとS3エンドポイントを示しています。 + +### AWS + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `35.73.179.23` `54.248.225.163` `54.65.53.160` | +| ap-south-1 | `15.206.7.77` `3.110.39.68` `3.6.83.17` | +| ap-southeast-1 | `46.137.240.41` `52.74.24.166` `54.254.37.170` | +| ap-southeast-2 | `13.210.79.90` `13.236.190.252` `13.54.63.56` | +| eu-central-1 | `18.197.49.136` `3.64.109.93` `3.74.177.59` | +| eu-west-1 | `108.128.86.193` `34.240.176.195` `54.73.98.215` | +| eu-west-2 | `13.43.228.235` `18.135.36.159` `3.10.239.194` | +| us-east-1 | `18.211.40.49` `35.175.32.241` `44.197.47.227` `44.208.152.165` `52.205.46.187` `52.22.199.32` | +| us-east-2 | `18.117.209.120` `3.135.147.1` `3.21.42.89` | +| us-west-2 | `35.165.97.55` `44.236.63.111` `54.244.160.153` | + +#### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `18.182.162.251` `52.194.58.178` `54.150.231.136` | +| ap-south-1 | `15.206.78.111` `3.6.185.108` `43.204.6.248` | +| ap-southeast-1 | `18.138.54.172` `18.143.38.5` `18.143.51.125` | +| ap-southeast-2 | `3.105.241.252` `3.24.14.253` `3.25.31.112` | +| eu-central-1 | `3.125.141.249` `3.75.55.98` `52.58.240.109` | +| eu-west-1 | `79.125.122.80` `99.80.3.151` `99.81.5.155` | +| eu-west-2 | `18.133.60.223` `18.134.36.146` `18.170.151.77` | +| us-east-1 | `3.224.78.251` `3.217.93.62` `52.4.220.199` `54.166.56.105` `44.210.169.212` `52.206.111.15` | +| us-east-2 | `18.216.18.121` `18.218.245.169` `18.225.29.123` | +| us-west-2 | `35.82.252.60` `35.85.205.122` `44.226.232.172` | + +#### S3エンドポイント + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `vpce-0047c645aecb997e7` | +| ap-south-1 | `vpce-0a975c9130d07276d` | +| ap-southeast-1 | `vpce-04c0b7c7066498854` | +| ap-southeast-2 | `vpce-0b45293a83527b13c` | +| eu-central-1 | `vpce-0c58e8f7ed0f63623` | +| eu-west-1 | `vpce-0c85c2795779d8fb2` | +| eu-west-2 | `vpce-0ecd990a9f380d784` | +| us-east-1 | `vpce-05f1eeb392b983932` `vpce-0b8b558ea42181cf6` | +| us-east-2 | `vpce-09ff616fa76e09734` | +| us-west-2 | `vpce-0bc78cc5e63dfb27c` | + +### GCP + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| europe-west4 | `34.147.18.130` `34.90.110.137` `34.90.16.52` `34.91.142.156` `35.234.163.128` | +| asia-southeast1 | `34.124.237.2` `34.142.232.74` `34.143.238.252` `35.240.251.145` `35.247.141.182` | +| us-central1 | `34.136.25.254` `34.170.139.51` `34.172.174.233` `34.173.64.62` `34.66.234.85` | +| us-east1 | `104.196.202.44` `34.74.136.232` `104.196.211.50` `34.74.115.64` `35.237.218.133` | + +#### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| europe-west4 | `35.201.102.65` | +| asia-southeast1 | `34.160.80.214` | +| us-central1 | `35.186.193.237` | +| us-east1 | `34.36.105.62` | + +### Azure + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| eastus2 | `20.109.60.147` `20.242.123.110` `20.75.77.143` | +| westus3 | `20.14.94.21` `20.150.217.205` `20.38.32.164` | +| germanywestcentral | `20.218.133.244` `20.79.167.238` `51.116.96.61` | + +### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| eastus2 | `4.152.12.124` | +| westus3 | `4.227.34.126` | +| germanywestcentral | `4.182.8.168` | + +## 静的IPのAPI + +静的IPのリストをプログラムで取得する必要がある場合は、以下のClickHouse Cloud APIエンドポイントを使用できます: [`https://api.clickhouse.cloud/static-ips.json`](https://api.clickhouse.cloud/static-ips.json)。このAPIは、リージョンごとおよびクラウドごとのingress/egress IPやS3エンドポイントの情報を提供します。 + +MySQLやPostgreSQLエンジンのような統合を使用している場合、ClickHouse Cloudがインスタンスにアクセスできるように承認する必要があるかもしれません。このAPIを使用して、パブリックIPを取得し、GCPの`firewalls`または`Authorized networks`、AzureやAWSの`Security Groups`、もしくは他の任意のインフラeコネクトストの管理システムで設定することができます。 + +例えば、`ap-south-1`リージョンでホストされているAWSのClickHouse Cloudサービスからのアクセスを許可するには、そのリージョンの`egress_ips`アドレスを追加します: + +``` +❯ curl -s https://api.clickhouse.cloud/static-ips.json | jq '.' +{ + "aws": [ + { + "egress_ips": [ + "3.110.39.68", + "15.206.7.77", + "3.6.83.17" + ], + "ingress_ips": [ + "15.206.78.111", + "3.6.185.108", + "43.204.6.248" + ], + "region": "ap-south-1", + "s3_endpoints": "vpce-0a975c9130d07276d" + }, +... +``` + +例えば、`us-east-2`で稼働しているAWS RDSインスタンスがClickHouse Cloudサービスに接続する必要がある場合、以下のInboundセキュリティグループルールを設定します: + +![AWS Security group rules](@site/docs/ja/_snippets/images/aws-rds-mysql.png) + +同じく`us-east-2`のClickHouse CloudサービスがGCP上のMySQLに接続する場合、`Authorized networks`は次のようになります: + +![GCP Authorized networks](@site/docs/ja/_snippets/images/gcp-authorized-network.png) diff --git a/docs/ja/cloud/security/cmek.md b/docs/ja/cloud/security/cmek.md new file mode 100644 index 00000000000..ee370d78ee0 --- /dev/null +++ b/docs/ja/cloud/security/cmek.md @@ -0,0 +1,132 @@ +--- +sidebar_label: ユーザー管理の暗号化キー +slug: /ja/cloud/security/cmek +title: ユーザー管理の暗号化キー (CMEK) +--- + +# ユーザー管理の暗号化キー (CMEK) + +ClickHouse Cloudは、ユーザー自身のキー管理サービス (KMS) キーを活用してサービスを保護することを可能にします。私たちは、ClickHouseの組み込み機能である[データ暗号化用の仮想ファイルシステム機能](/docs/ja/operations/storing-data#encrypted-virtual-file-system)を利用し、あなたのデータを暗号化・保護します。ClickHouse Cloudサービスで使用されるデータ暗号化キーは、[エンベロープ暗号化](https://docs.aws.amazon.com/wellarchitected/latest/financial-services-industry-lens/use-envelope-encryption-with-customer-master-keys.html)として知られるプロセスを通じて、ユーザーが提供したKMSキーを使用して暗号化・保護されます。この機能を動作させるために必要なのは、ランタイムでデータ暗号化キーを復号・暗号化するためのKMSキーへのアクセスです。 + +この機能は ClickHouse Cloud のプロダクションサービスに限定されており、この機能を有効にするには[support](/docs/ja/cloud/support)にご連絡ください。ユーザー管理の暗号化キーは、サービス作成時に指定する必要があり、既存のサービスではこのオプションを使用できません。[バックアップと復元](#backup-and-restore)を確認して代替オプションをご覧ください。 + +現在サポートされている KMS プロバイダー: + +- AWSにホストされているサービス向けの[AWS Key Management Service](https://aws.amazon.com/kms) + +近日提供予定: + +- Azureにホストされているサービス向けの[Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault) +- GCPにホストされているサービス向けの[GCP Cloud Key Management](https://cloud.google.com/security-key-management) +- AWS、Azure、GCPにホストされているサービス向けの[Hashicorp Vault](https://www.hashicorp.com/products/vault) + +:::warning +ClickHouse Cloud サービスの暗号化に使用されたKMSキーを削除すると、ClickHouseサービスは停止され、データおよび既存のバックアップは取得不可能になります。 +::: + +## 手順1. KMSキーの作成 + +### AWS KMSを使用 + +AWSコンソール、CloudFormation スタック、またはTerraform プロバイダを使用してAWS KMSキーを作成できます。以下にそれぞれの手順を説明します。 + +#### オプション1. AWSコンソールを使用してKMSキーを手動で作成 + +*注意: 既に使用したいKMSキーがある場合は、次のステップに進んでください。* + +1. AWSアカウントにログインし、Key Management Service に移動します。 +2. 左側のメニューから__ユーザー管理キー__を選択します。 +3. 右上の__キーを作成__をクリックします。 +4. __キータイプ__「対称キー」と__キー使用__「暗号化および復号化」を選択し、次へをクリックします。 +5. キーのエイリアス(表示名)を入力し、次へをクリックします。 +6. キー管理者を選択し、次へをクリックします。 +7. (オプション)キーのユーザーを選択し、次へをクリックします。 +8. __キー ポリシー__の下に、以下のコードスニペットを追加します: + + ```json + { + "Sid": "Allow ClickHouse Access", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::576599896960:role/prod-kms-request-role" + }, + "Action": ["kms:GetPublicKey", + "kms:Decrypt", + "kms:GenerateDataKeyPair", + "kms:Encrypt", + "kms:GetKeyRotationStatus", + "kms:GenerateDataKey", + "kms:DescribeKey"], + "Resource": "*" + } + ``` + + ![暗号化キー ポリシー](@site/docs/ja/_snippets/images/cmek1.png) + +9. 完了をクリックします。 +10. 作成したキーのエイリアスをクリックします。 +11. コピー ボタンを使用してARNをコピーします。 + +#### オプション2. CloudFormationスタックを使用してKMSキーを設定または作成 + +ClickHouseは、キーのためのAWSポリシーをデプロイするための簡単なCloudFormationスタックを提供します。この方法は、既存のKMSキーおよびClickHouse Cloud統合のための新しいKMSキーの作成の両方をサポートします。 + +##### 既存のKMSキーを使用 + +1. AWS アカウントにログインします。 +2. [このリンク](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/cmek.yaml&stackName=ClickHouseBYOK¶m_KMSCreate=false¶m_ClickHouseRole=arn:aws:iam::576599896960:role/prod-kms-request-role)を訪問してCloudFormation テンプレートを準備します。 +3. 使用したいKMSキーのARNを入力します(カンマで区切り、スペースを空けないこと)。 +4. 「AWS CloudFormationがカスタム名でIAMリソースを作成する可能性があることを認識しています。」に同意し、__スタックを作成__をクリックします。 +5. 次のステップで必要なスタック出力の`RoleArn`と`KeyArn`を書き留めます。 + +##### 新しいKMSキーを作成 + +1. AWS アカウントにログインします。 +2. [このリンク](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/cmek.yaml&stackName=ClickHouseBYOK¶m_KMSCreate=true¶m_ClickHouseRole=arn:aws:iam::576599896960:role/prod-kms-request-role)を訪問してCloudFormation テンプレートを準備します。 +3. 「AWS CloudFormationがカスタム名でIAMリソースを作成する可能性があることを認識しています。」に同意し、__スタックを作成__をクリックします。 +4. 次のステップで必要なスタック出力の`KeyArn`を書き留めます。 + +#### オプション3. Terraformを通じてKMSキーを作成 + +キーをTerraformを使用してデプロイしたいユーザー向けに、AWSプロバイダのドキュメントは[こちら](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key)をご覧ください。 + +## 手順2. ユーザー管理の暗号化キーを使用してClickHouseサービスを開始 + +1. ClickHouse Cloudアカウントにログインします。 +2. サービス画面に移動します。 +3. __新しいサービス__ をクリックします。 +4. クラウドプロバイダー、リージョンを選択し、サービスに名前を付けます。 +5. __暗号化キーの設定 (CMEK)__をクリックします。例はAWS KMSプロバイダーを使用して示されています。 +6. ウィンドウの右側のフィールドにAWS ARNを貼り付けます。 + + ![暗号化設定](@site/docs/ja/_snippets/images/cmek2.png) + +7. システムは暗号化キーがアクセス可能であることを確認します。 +8. AWS ARNボックスの上に__有効__メッセージが表示されたら__サービスを作成__をクリックします。 +9. サービス画面のサービスタイルの右上隅にキーアイコンが表示され、暗号化されていることを知らせます。 + + ![サービス暗号化済み](@site/docs/ja/_snippets/images/cmek3.png) + +## バックアップと復元 + +バックアップは、関連するサービスと同じキーを使用して暗号化されます。暗号化されたバックアップを復元することで、元のインスタンスと同じKMSキーを使用する暗号化済みインスタンスが作成されます。KMSキーを回転させることも可能です。詳細については[キーの回転](#key-rotation)を参照してください。 + +暗号化済みインスタンスは、非暗号化バックアップを復元し、新しいサービスのために希望するKMSキーを指定することで作成できますので、[support](/docs/ja/cloud/support)にご連絡ください。 + +## KMS キーポーラー + +エンベロープ暗号化を使用する場合、提供されたKMSキーが依然として有効であることを定期的に確認する必要があります。KMSキーのアクセスを10分ごとに確認します。アクセスが無効になった時点でClickHouseサービスを停止します。サービスを再開するには、このガイドの手順に従ってアクセスを復活させ、それからサービスを開始してください。 + +この機能の性質上、KMSキーが削除された後にClickHouse Cloudサービスを復旧することはできません。これを防ぐために、ほとんどのプロバイダーはキーをすぐに削除せず、削除をスケジュールします。プロバイダーのドキュメントを確認するか、このプロセスについて[support](/docs/ja/cloud/support)にお問い合わせください。 + +## キーの回転 + +キー回転は同じKMSプロバイダー内でサポートされています。これは新しいKMSキーを使用してデータ暗号化キーを再暗号化し、このリクエストはClickHouseサービスのダウンタイムなしで即時に処理されます。この操作を実行するには、設定されたKMSキーと新しいKMSキーの両方にアクセスできることを確認し、KMSキー情報を添えて[support](/docs/ja/cloud/support)にご連絡ください。 + +## パフォーマンス + +本ページで指定されているように、私たちはClickHouseの組み込み機能である[データ暗号化用の仮想ファイルシステム機能](/docs/ja/operations/storing-data#encrypted-virtual-file-system)を利用し、データを暗号化・保護しています。 + +この機能で使用されるアルゴリズムは`AES_256_CTR`であり、ワークロードに応じて5-15%のパフォーマンス低下が予想されます: + +![CMEKパフォーマンス低下](@site/docs/ja/_snippets/images/cmek-performance.png) diff --git a/docs/ja/cloud/security/common-access-management-queries.md b/docs/ja/cloud/security/common-access-management-queries.md new file mode 100644 index 00000000000..7dd01461b5c --- /dev/null +++ b/docs/ja/cloud/security/common-access-management-queries.md @@ -0,0 +1,68 @@ +--- +sidebar_label: "一般的なアクセス管理クエリ" +title: "一般的なアクセス管理クエリ" +slug: "/ja/cloud/security/common-access-management-queries" +--- + +import CommonUserRolesContent from '@site/docs/ja/_snippets/_users-and-roles-common.md'; + +# 一般的なアクセス管理クエリ + +:::tip セルフマネージド +セルフマネージドのClickHouseを使用している場合は、[SQLユーザーとロール](/docs/ja/guides/sre/user-management/index.md)をご覧ください。 +::: + +この記事では、SQLユーザーとロールを定義し、それらの特権と権限をデータベース、テーブル、行、カラムに適用する基本的な方法を示します。 + +## 管理ユーザー + +ClickHouse Cloudサービスには、サービス作成時に作成される`default`という管理ユーザーがいます。パスワードはサービス作成時に提供され、**Admin**のロールを持つClickHouse Cloudユーザーによってリセットできます。 + +ClickHouse Cloudサービスに追加のSQLユーザーを追加する場合、そのユーザーにはSQLユーザー名とパスワードが必要です。管理レベルの特権を付与したい場合は、新しいユーザーに`default_role`ロールを割り当ててください。例えば、ユーザー`clickhouse_admin`を追加します: + +```sql +CREATE USER IF NOT EXISTS clickhouse_admin +IDENTIFIED WITH sha256_password BY 'P!@ssword42!'; +``` + +```sql +GRANT default_role TO clickhouse_admin; +``` + +:::note +SQLコンソールを使用する場合、SQLステートメントは`default`ユーザーとして実行されません。代わりに、`sql-console:${cloud_login_email}`という名前のユーザーとして実行され、`cloud_login_email`はクエリを現在実行しているユーザーのメールアドレスです。 + +これらの自動生成されたSQLコンソールユーザーには`default`ロールが付与されています。 +::: + +## パスワードなし認証 + +SQLコンソールには2つのロールが利用可能です: `sql_console_admin`は`default_role`と同じ権限を持ち、`sql_console_read_only`は読み取り専用の権限を持ちます。 + +管理ユーザーにはデフォルトで`sql_console_admin`ロールが割り当てられているため、何も変更はありません。ただし、`sql_console_read_only`ロールを使用すると、管理者でないユーザーでも読み取り専用または完全なアクセス権を任意のインスタンスに割り当てることができます。管理者がこのアクセスを設定する必要があります。これらのロールは`GRANT`または`REVOKE`コマンドを使用してインスタンス固有の要件に合わせて調整できます。これらのロールに対する変更は永続化されます。 + +### 詳細なアクセス制御 + +このアクセス制御機能は、ユーザーレベルの詳細度で手動で設定することもできます。新しい`sql_console_*`ロールをユーザーに割り当てる前に、`sql-console-role:`という名前空間に一致するSQLコンソールユーザー専用のデータベースロールを作成する必要があります。例えば: + +```sql +CREATE ROLE OR REPLACE sql-console-role:; +GRANT TO sql-console-role:; +``` + +一致するロールが検出されると、テンプレートロールではなく、そのユーザーに割り当てられます。より複雑なアクセス制御の設定が可能となり、例えば`sql_console_sa_role`や`sql_console_pm_role`のようなロールを作成し、特定のユーザーに付与することができます。例えば: + +```sql +CREATE ROLE OR REPLACE sql_console_sa_role; +GRANT TO sql_console_sa_role; +CREATE ROLE OR REPLACE sql_console_pm_role; +GRANT TO sql_console_pm_role; +CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`; +CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`; +CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`; +GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`; +GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`; +GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`; +``` + + diff --git a/docs/ja/cloud/security/compliance-overview.md b/docs/ja/cloud/security/compliance-overview.md new file mode 100644 index 00000000000..f8225c8e50b --- /dev/null +++ b/docs/ja/cloud/security/compliance-overview.md @@ -0,0 +1,55 @@ +--- +sidebar_label: セキュリティとコンプライアンス +slug: /ja/cloud/security/security-and-compliance +title: セキュリティとコンプライアンス +--- + +# セキュリティとコンプライアンスレポート +ClickHouse Cloud は常にお客様のセキュリティとコンプライアンスのニーズを評価し、追加のレポートが要求されるたびにプログラムを拡大しています。詳しい情報やレポートのダウンロードについては、当社の[信頼センター](https://trust.clickhouse.com)をご覧ください。 + +### SOC 2 タイプ II(2022年から) + +システムと組織の管理(SOC)2 は、組織のシステムに適用されるトラストサービス基準 (TSC) に含まれるセキュリティ、可用性、機密性、処理の完全性、およびプライバシーの基準に焦点を当てたレポートであり、お客様(依拠する第三者)にこれらのコントロールについての保証を提供することを目的としています。ClickHouse は、独立した外部監査人と協力し、ClickHouse Cloud のセキュリティ、可用性、機密性、および処理の完全性に関する監査を少なくとも年に一度実施しています。 + +### ISO 27001(2023年から) + +国際標準化機構(ISO)27001 は、情報セキュリティの国際標準です。それは、リスクを管理し、ポリシーを作成・伝達し、セキュリティコントロールを実装し、コンポーネントが関連性を持ち有効であり続けることを確認するためのプロセスを含む情報セキュリティマネジメントシステム(ISMS)の実装を企業に求めています。ClickHouse は内部監査を実施し、認証発行後2年間の監査および中間検査を受けるために独立した外部監査人と協力しています。 + +### 米国 DPF(2024年から) + +米国データプライバシーフレームワークは、米国から欧州連合/欧州経済地域、英国、およびスイスへの個人データ転送のための信頼できるメカニズムを米国の組織に提供するために開発されました(EU、英国、スイスの法律と一貫しています)。ClickHouse はこのフレームワークに自己認定され、[データプライバシーフレームワークリスト](https://dataprivacyframework.gov/list) に掲載されています。 + +### HIPAA(ベータ版) + +:::note +HIPAA 対応サービスは GCP のベータ版で、**専用** サービスタイプでのみ利用可能です。オンボーディングにはビジネスアソシエイト契約(BAA)が必要です。 詳細については[サポート](https://clickhouse.com/support/program)にお問い合わせください。 +::: + +1996年の医療保険の携行性と責任に関する法律(HIPAA)は、保護された健康情報(PHI)の管理に焦点を当てた米国のプライバシー法です。HIPAAには、電子的個人健康情報(ePHI)の保護に焦点を当てた[セキュリティルール](https://www.hhs.gov/hipaa/for-professionals/security/index.html)などの要求が含まれています。ClickHouse は、指定されたサービスに保存されている ePHI の機密性、完全性およびセキュリティを保証するために、管理的、物理的および技術的な保護措置を実施しています。私たちは、2025年初めにHIPAAをSOC 2に追加して、私たちのコンプライアンスプログラムの外部保証を提供する予定です。 + +ePHIをサービスにロードすることを希望するお客様は、該当するケースごとに適切なコントロールを確認、選択および実装するために、私たちの[共有責任モデル](/docs/ja/cloud/security/shared-responsibility-model)を確認する必要があります。 + +# プライバシーコンプライアンス + +上記の項目に加えて、ClickHouseは一般データ保護規則(GDPR)、カリフォルニア州消費者プライバシー法(CCPA)およびその他関連するプライバシーフレームワークに対応する内部コンプライアンスプログラムを維持しています。ClickHouseが収集する個人データ、その使用方法、保護方法およびその他プライバシー関連情報の詳細については、以下の場所で確認できます。 + +### 法的文書 + +- [プライバシーポリシー](https://clickhouse.com/legal/privacy-policy) +- [クッキーポリシー](https://clickhouse.com/legal/cookie-policy) +- [データプライバシーフレームワーク通知](https://clickhouse.com/legal/data-privacy-framework) +- [データ処理補遺 (DPA)](https://clickhouse.com/legal/agreements/data-processing-addendum) + +### 処理場所 + +- [サブプロセッサーと関連会社](https://clickhouse.com/legal/agreements/subprocessors) +- [データ処理場所](https://trust.clickhouse.com) + +### 追加手続き + +- [個人データアクセス](/docs/ja/cloud/security/personal-data-access) +- [アカウント削除](/docs/ja/cloud/manage/close_account) + +# 支払いコンプライアンス + +ClickHouseは、[PCI SAQ A v4.0](https://www.pcisecuritystandards.org/document_library/)に準拠したクレジットカードによる安全な支払い方法を提供します。 diff --git a/docs/ja/cloud/security/gcp-private-service-connect.md b/docs/ja/cloud/security/gcp-private-service-connect.md new file mode 100644 index 00000000000..540a6d6b21a --- /dev/null +++ b/docs/ja/cloud/security/gcp-private-service-connect.md @@ -0,0 +1,488 @@ +--- +title: "GCP Private Service Connect" +description: "この文書は、Google Cloud Platform (GCP) の Private Service Connect (PSC) を使用して ClickHouse Cloud に接続する方法、および GCP PSC アドレス以外のアドレスから ClickHouse Cloud サービスへのアクセスを ClickHouse Cloud IP アクセスリストを使用して無効にする方法を説明します。" +sidebar_label: "GCP Private Service Connect" +slug: /ja/manage/security/gcp-private-service-connect +--- + +## Private Service Connect + +Private Service Connect (PSC) は、Google Cloud のネットワーク機能であり、消費者が自分の仮想プライベートクラウド (VPC) ネットワーク内で管理サービスにプライベートにアクセスできるようにします。同様に、管理サービスの提供者は、これらのサービスを独自の別の VPC ネットワークにホストし、消費者にプライベート接続を提供できます。 + +サービス提供者は、Private Service Connect サービスを作成することで、消費者に自分のアプリケーションを公開します。サービス消費者は、これらの Private Service Connect タイプのいずれかを通じて、直接そのサービスにアクセスします。 + +![Overview of PSC](@site/docs/ja/cloud/security/images/gcp-psc-overview.png) + +:::important +デフォルトでは、PSC 接続が承認され確立されていても、ClickHouse サービスは Private Service 接続からは利用できません。インスタンスレベルで PSC ID を許可リストに明示的に追加する必要があります。[ステップ](#add-endpoint-id-to-services-allow-list)を完了してください。 +::: + +:::note +GCP Private Service Connect は ClickHouse Cloud Production サービスでのみ有効にできます。 +::: + +リージョン間の接続はサポートされていません。提供者と消費者のリージョンは同じでなければなりません。PSC レベルでグローバルアクセスを有効にすれば、自分の VPC 内の他のリージョンからでも接続できるようになります(以下を参照)。 + +このプロセスは以下の4つのステップに分かれています: + +1. Private Service Connect用のGCPサービスアタッチメントを取得します。 +1. サービスエンドポイントを作成します。 +1. Endpoint ID を ClickHouse Cloud 組織に追加します。 +1. Endpoint ID をサービスの許可リストに追加します。 + +:::note +以下の例では、次の事項を使用します: + - GCP リージョン: `us-central1` + - GCP プロジェクト (顧客のGCPプロジェクト): `my-gcp-project` + - 顧客のGCPプロジェクト内のGCPプライベートIPアドレス: `10.128.0.2` + - 顧客のGCPプロジェクト内のGCP VPC: `default` + +以下に、ClickHouse Cloud サービス内で Private Service Connect を設定する方法を示すコード例を示します。 +::: + +## はじめに + +ClickHouse Cloud サービスに関する情報を取得する必要があります。ClickHouse Cloud コンソールまたは ClickHouse API を通じてこれを行うことができます。ClickHouse API を使用する場合、以下の環境変数を設定してから進めてください: + +```bash +export REGION=us-central1 +export PROVIDER=gcp +export KEY_ID= +export KEY_SECRET= +export ORG_ID= +export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services" | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1) +``` +:::note + - 自身のOrganization IDはClickHouseコンソール (Organization -> Organization Details)から取得可能です。 + - [新しいキーを作成](https://clickhouse.com/docs/ja/cloud/manage/openapi)するか、既存のものを使用できます。 +::: + +## GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得する + +### オプション 1: ClickHouse Cloud コンソール + +ClickHouse Cloud コンソールで、Private Service Connect 経由で接続したいサービスを開き、**設定** メニューを開きます。**プライベートエンドポイントを設定する** ボタンをクリックします。**サービス名** (`endpointServiceId`) と **DNS 名** (`privateDnsHostname`) をメモしておいてください。次のステップで使用します。 + +![Private Endpoints](./images/gcp-privatelink-pe-create.png) + +### オプション 2: API + +:::note +このステップを実行するために、少なくとも1つのインスタンスがリージョン内でデプロイされている必要があります。 +::: + +GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得します: + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | jq .result +{ + "endpointServiceId": "projects/.../regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud", + "privateDnsHostname": "xb164akwxw.us-central1.p.gcp.clickhouse.cloud" +} +``` + +`endpointServiceId` と `privateDnsHostname` をメモしておいてください。次のステップで使用します。 + +## サービスエンドポイントを作成する + +このセクションでは、サービスエンドポイントを作成します。 + +### Private Service Connection の追加 + +まず最初に、Private Service Connection を作成します。 + +#### オプション 1: Google Cloud コンソールを使用する + +Google Cloud コンソールで、**Network services -> Private Service Connect** に移動します。 + +![Open PSC](@site/docs/ja/cloud/security/images/gcp-psc-open.png) + +**Connect Endpoint** ボタンをクリックして、Private Service Connect 作成ダイアログを開きます。 + +- **Target**: **Published service** を使用してください +- **Target service**: [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップの **endpointServiceId** を使用してください。 +- **Endpoint name**: PSC の **Endpoint name** 名を設定します。 +- **Network/Subnetwork/IP address**: 接続に使用するネットワークを選択してください。Private Service Connect エンドポイントの IP アドレスを新規作成するか既存のものを使用します。例では、名前 **your-ip-address** でIPアドレス `10.128.0.2` を事前に作成して割り当てています。 +- エンドポイントを任意のリージョンから利用可能にするには、**Enable global access** チェックボックスを有効にすることができます。 + +![Enable Global Access](@site/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png) + +**ADD ENDPOINT** ボタンを使って PSC エンドポイントを作成します。 + +接続が承認されると、**Status** 列が **Pending** から **Accepted** に変わります。 + +![Accepted](@site/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png) + +***PSC Connection ID*** をコピーします。この ID を次のステップで ***Endpoint ID*** として使用します。 + +#### オプション 2: Terraform を使用する + +```json +provider "google" { + project = "my-gcp-project" + region = "us-central1" +} + +variable "region" { + type = string + default = "us-central1" +} + +variable "subnetwork" { + type = string + default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/regions/us-central1/subnetworks/default" +} + +variable "network" { + type = string + default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" +} + +resource "google_compute_address" "psc_endpoint_ip" { + address = "10.128.0.2" + address_type = "INTERNAL" + name = "your-ip-address" + purpose = "GCE_ENDPOINT" + region = var.region + subnetwork = var.subnetwork +} + +resource "google_compute_forwarding_rule" "clickhouse_cloud_psc" { + ip_address = google_compute_address.psc_endpoint_ip.self_link + name = "ch-cloud-${var.region}" + network = var.network + region = var.region + load_balancing_scheme = "" + # service attachment + target = "https://www.googleapis.com/compute/v1/$TARGET" # 以下のノートを参照 +} + +output "psc_connection_id" { + value = google_compute_forwarding_rule.clickhouse_cloud_psc.psc_connection_id + description = "インスタンスレベルで許可リストにGCP PSC接続IDを追加します。" +} +``` + +:::note +TARGET - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **endpointServiceId** を使用してください。 +::: + +## DNS の設定 + +Google Cloud コンソールを使用するものと `gcloud` CLI を使用するものの2つのオプションがあります。 + +### オプション 1: Google Cloud コンソールを使用する + +- **Supported regions** からプライベート DNS ゾーンを作成します。 +- **Network services -> Cloud DNS** を開きます。 +- **Create Zone** を選択します: + +![Create Zone](@site/docs/ja/cloud/security/images/gcp-psc-create-zone.png) + +ゾーンタイプダイアログで以下を設定します: + +- ゾーンタイプ: **Private** +- ゾーン名: 適切なゾーン名を入力します。 +- DNS 名: **Supported regions** テーブルの **Private DNS domain** 列をリージョンに合わせて使用します。 +- ネットワーク: ClickHouse Cloud に PSC を使って接続する予定のネットワークに DNS ゾーンをアタッチします。 + +![Zone Type](@site/docs/ja/cloud/security/images/gcp-psc-zone-type.png) + +#### プライベート DNS ゾーンでの DNS レコードの作成 + +[Private Service Connection の追加](#adding-a-private-service-connection) ステップで作成した IP アドレスを指すように設定します。 + +![DNS Record](@site/docs/ja/cloud/security/images/gcp-psc-dns-record.png) + +### オプション 2: `gcloud` CLI を使用する + +#### DNS ゾーンの作成 + +```bash +gcloud dns \ + --project=my-gcp-project \ + managed-zones create ch-cloud-us-central1 \ + --description="Private DNS zone for PSC" \ + --dns-name="us-central1.p.gcp.clickhouse.cloud." \ + --visibility="private" \ + --networks="https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" +``` + +#### DNS レコードの作成 + +```bash +gcloud dns \ + --project=my-gcp-project \ + record-sets create $DNS_RECORD \ + --zone="ch-cloud-us-central1" \ + --type="A" \ + --ttl="300" \ + --rrdatas="10.128.0.2" +``` +:::note +DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 +::: + +### オプション 3: Terraform を使用する + +```json +variable "ch_dns_record" { + type = string + default = "$DNS_NAME" # 以下のノートを参照 +} + +resource "google_dns_managed_zone" "clickhouse_cloud_private_service_connect" { + description = "Private DNS zone for accessing ClickHouse Cloud using Private Service Connect" + dns_name = "${var.region}.p.gcp.clickhouse.cloud." + force_destroy = false + name = "clickhouse-cloud-private-service-connect-${var.region}" + visibility = "private" +} + +resource "google_dns_record_set" "psc_dns_record" { + managed_zone = google_dns_managed_zone.clickhouse_cloud_private_service_connect.name + name = "${var.ch_dns_record}" + type = "A" + rrdatas = [google_compute_address.psc_endpoint_ip.address] +} +``` + +:::note +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 +::: + +## DNS 設定の確認 + +DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +ping $DNS_RECORD +``` + +## Endpoint ID を ClickHouse Cloud 組織に追加する + +### オプション 1: ClickHouse Cloud コンソール + +組織にエンドポイントを追加するには、[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップに進みます。ClickHouse Cloud コンソールを使用して許可リストに `PSC Connection ID` を追加すると、組織にも自動的に追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints** を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/gcp-pe-remove-private-endpoint.png) + +### オプション 2: API + +コマンドを実行する前に次の環境変数を設定します: + +`ENDPOINT_ID` を、[Private Service Connection の追加](#adding-a-private-service-connection) ステップでの **Endpoint ID** の値に置き換えます。 + +エンドポイントを追加するには、以下を実行します: + +```bash +cat <.p.gcp.clickhouse.cloud" +} +``` + +この例では、`xxxxxxx.yy-xxxxN.p.gcp.clickhouse.cloud` ホスト名への接続が Private Service Connect にルーティングされます。一方、`xxxxxxx.yy-xxxxN.gcp.clickhouse.cloud` はインターネット経由でルーティングされます。 + +## トラブルシューティング + +### DNS 設定のテスト + +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +nslookup $DNS_NAME +``` + +```response +Non-authoritative answer: +... +Address: 10.128.0.2 +``` + +### Connection reset by peer + +- 最も可能性が高いのは、サービス許可リストに Endpoint ID が追加されていない場合です。[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップを再確認してください。 + +### 接続テスト + +PSCリンクを使用して接続する際に問題がある場合は、`openssl` を使用して接続をテストしてください。Private Service Connect エンドポイントのステータスが `Accepted` であることを確認してください: + +OpenSSL は接続できるはずです(出力に CONNECTED が表示されます)。`errno=104` は予期されたものです。 + +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +openssl s_client -connect ${DNS_NAME}:9440 +``` + +```response +# highlight-next-line +CONNECTED(00000003) +write:errno=104 +--- +no peer certificate available +--- +No client certificate CA names sent +--- +SSL handshake has read 0 bytes and written 335 bytes +Verification: OK +--- +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +### エンドポイントフィルターの確認 + +#### REST API + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}" | jq .result.privateEndpointIds +[ + "102600141743718403" +] +``` + +### リモートデータベースへの接続 + +MySQL](../../sql-reference/table-functions/mysql.md) または [PostgreSQL](../../sql-reference/table-functions/postgresql.md) テーブル関数を使用して、ClickHouse Cloud からGCPにホストされたデータベースに接続しようとしているとします。GCP PSC はこの接続を安全に有効にするために使用できません。PSC は一方向で、単方向接続です。内部ネットワークやGCP VPCが ClickHouse Cloud に安全に接続できるようにしますが、ClickHouse Cloud から内部ネットワークに接続することはできません。 + +[GCP Private Service Connect ドキュメント](https://cloud.google.com/vpc/docs/private-service-connect) によると: + +> サービス指向の設計: プロデューサーサービスは、消費者VPCネットワークに単一の IP アドレスを公開するロードバランサーを通じて公開されます。プロデューサーサービスにアクセスする消費者トラフィックは単方向であり、ピアリングされたVPCネットワーク全体にアクセスするのではなく、サービスIPアドレスのみにアクセスできます。 + +このためには、ClickHouse Cloud から内部/プライベートデータベースサービスへの接続を許可するように GCP VPC のファイアウォールルールを構成してください。ClickHouse Cloud リージョンの[デフォルトのEgress IPアドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api)と利用可能な[静的 IP アドレス](https://api.clickhouse.cloud/static-ips.json)を確認してください。 + +## 詳細情報 + +詳細な情報については、[cloud.google.com/vpc/docs/configure-private-service-connect-services](https://cloud.google.com/vpc/docs/configure-private-service-connect-services) を参照してください。 diff --git a/docs/ja/cloud/security/images/activity_log1.png b/docs/ja/cloud/security/images/activity_log1.png new file mode 100644 index 00000000000..05790390b9f Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log1.png differ diff --git a/docs/ja/cloud/security/images/activity_log2.png b/docs/ja/cloud/security/images/activity_log2.png new file mode 100644 index 00000000000..4e2f5479789 Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log2.png differ diff --git a/docs/ja/cloud/security/images/activity_log3.png b/docs/ja/cloud/security/images/activity_log3.png new file mode 100644 index 00000000000..bbfe3212310 Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log3.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png b/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png new file mode 100644 index 00000000000..71027ff2a18 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png b/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png new file mode 100644 index 00000000000..52972f33106 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw b/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw new file mode 100644 index 00000000000..7bc215e2013 --- /dev/null +++ b/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw @@ -0,0 +1,611 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 917, + "versionNonce": 94597768, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 676.5, + "y": 710.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662904263610, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 300, + "versionNonce": 2031817484, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 681.5, + "y": 888, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 39, + "seed": 1493094828, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662925920265, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your VPC", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Your VPC" + }, + { + "type": "text", + "version": 576, + "versionNonce": 707762444, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1004, + "y": 1156, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 154, + "height": 36, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662925936896, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "AWS Region", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "AWS Region" + }, + { + "type": "rectangle", + "version": 1132, + "versionNonce": 1757040120, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.5, + "y": 835, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 133, + "seed": 1345975444, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662904088791, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 446, + "versionNonce": 1364438408, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1002.5, + "y": 862.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 78, + "seed": 617182356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904088791, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "AWS \nPrivateLink", + "baseline": 66, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "AWS PrivateLink" + }, + { + "type": "text", + "version": 875, + "versionNonce": 1521914104, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1300.5, + "y": 816, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 180, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904130802, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your \nClickHouse \nservice in \nClickHouse \nCloud", + "baseline": 169, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "Your ClickHouse service in ClickHouse Cloud" + }, + { + "type": "rectangle", + "version": 1363, + "versionNonce": 237698612, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1295.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + } + ], + "updated": 1662925686472, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1147, + "versionNonce": 1732384904, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1315.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662904130803, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1598, + "versionNonce": 1799010552, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 995.217005038814, + "y": 905.5521202608265, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 109.21700503881402, + "height": 2.447879739173459, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662904263610, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 2.282994961186039, + "focus": -0.023096342081524727 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.014599092234048315, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -109.21700503881402, + 2.447879739173459 + ] + ] + }, + { + "type": "arrow", + "version": 2969, + "versionNonce": 937114764, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1293.6396361557422, + "y": 908.2894000233572, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 79.92502428359603, + "height": 1.031792461256714, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662925716768, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 1.860363844257874, + "focus": -0.01860928002735619 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 1.2146118721461183, + "focus": 0.06413755642360305 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -79.92502428359603, + -1.031792461256714 + ] + ] + }, + { + "id": "q6UyjPQniYUq_jNJ9B14G", + "type": "text", + "x": 1376, + "y": 1044, + "width": 108, + "height": 44, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 603208440, + "version": 214, + "versionNonce": 1400458488, + "isDeleted": false, + "boundElements": null, + "updated": 1662904232106, + "link": null, + "locked": false, + "text": "ClickHouse\nAWS account", + "fontSize": 16.923076923076845, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 37, + "containerId": null, + "originalText": "ClickHouse\nAWS account" + }, + { + "type": "text", + "version": 270, + "versionNonce": 1005124344, + "isDeleted": false, + "id": "qXU0J3uJIe9GR7ViB3lOm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 770, + "y": 1045, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 77, + "height": 44, + "seed": 1102179976, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904298533, + "link": null, + "locked": false, + "fontSize": 16.923076923076845, + "fontFamily": 1, + "text": "Your AWS\naccount", + "baseline": 37, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "Your AWS\naccount" + }, + { + "type": "rectangle", + "version": 1281, + "versionNonce": 2136517388, + "isDeleted": false, + "id": "hHi2XvG7fY54sO6ehpQEh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 646.5, + "y": 657, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 893, + "height": 493, + "seed": 823428876, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662925759113, + "link": null, + "locked": false + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/security/images/aws-privatelink-flow.png b/docs/ja/cloud/security/images/aws-privatelink-flow.png new file mode 100644 index 00000000000..9abe122ed1e Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-flow.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png b/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png new file mode 100644 index 00000000000..4ff0798578d Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png b/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png new file mode 100644 index 00000000000..6014e2429be Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png b/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png new file mode 100644 index 00000000000..59586558e87 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-create.png b/docs/ja/cloud/security/images/aws-privatelink-pe-create.png new file mode 100644 index 00000000000..eaca4de0c0a Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png b/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png new file mode 100644 index 00000000000..abb84188886 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png b/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png new file mode 100644 index 00000000000..c21b2e4b367 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png b/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png new file mode 100644 index 00000000000..57c3efd6487 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png b/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png new file mode 100644 index 00000000000..8c974031495 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png b/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png new file mode 100644 index 00000000000..6da8aa8ad74 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-basic.png b/docs/ja/cloud/security/images/azure-pe-create-basic.png new file mode 100644 index 00000000000..a7a0127452f Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-basic.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-dns.png b/docs/ja/cloud/security/images/azure-pe-create-dns.png new file mode 100644 index 00000000000..ca82906065c Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-dns.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-resource.png b/docs/ja/cloud/security/images/azure-pe-create-resource.png new file mode 100644 index 00000000000..b0f9104563d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-resource.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-review.png b/docs/ja/cloud/security/images/azure-pe-create-review.png new file mode 100644 index 00000000000..ed744880b10 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-review.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-tags.png b/docs/ja/cloud/security/images/azure-pe-create-tags.png new file mode 100644 index 00000000000..a99ee794a45 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-tags.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-vnet.png b/docs/ja/cloud/security/images/azure-pe-create-vnet.png new file mode 100644 index 00000000000..fe81428f500 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-vnet.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-ip.png b/docs/ja/cloud/security/images/azure-pe-ip.png new file mode 100644 index 00000000000..144a365eacd Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-ip.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-provate-ip.png b/docs/ja/cloud/security/images/azure-pe-provate-ip.png new file mode 100644 index 00000000000..6c69912ee97 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-provate-ip.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png new file mode 100644 index 00000000000..71034d3e58b Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-resource-guid.png b/docs/ja/cloud/security/images/azure-pe-resource-guid.png new file mode 100644 index 00000000000..cd10a32bb8d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-resource-guid.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-resource.png b/docs/ja/cloud/security/images/azure-pe-resource.png new file mode 100644 index 00000000000..324a312557a Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-resource.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-view.png b/docs/ja/cloud/security/images/azure-pe-view.png new file mode 100644 index 00000000000..24738b814a5 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-view.png differ diff --git a/docs/ja/cloud/security/images/azure-pe.png b/docs/ja/cloud/security/images/azure-pe.png new file mode 100644 index 00000000000..3f4dedd14ae Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe.png differ diff --git a/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png b/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png new file mode 100644 index 00000000000..c20d5904c17 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png differ diff --git a/docs/ja/cloud/security/images/azure-private-link-center.png b/docs/ja/cloud/security/images/azure-private-link-center.png new file mode 100644 index 00000000000..580229a5723 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-private-link-center.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-create.png b/docs/ja/cloud/security/images/azure-privatelink-pe-create.png new file mode 100644 index 00000000000..568da552c0d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png b/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png new file mode 100644 index 00000000000..89cecaf88ac Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png b/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png new file mode 100644 index 00000000000..3c26603f2ed Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png differ diff --git a/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png new file mode 100644 index 00000000000..47a55382cb4 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png new file mode 100644 index 00000000000..615d896ff35 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png new file mode 100644 index 00000000000..4e708b94776 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png new file mode 100644 index 00000000000..5d2126c4eae Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png b/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png new file mode 100644 index 00000000000..f6a781901ca Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-create-zone.png b/docs/ja/cloud/security/images/gcp-psc-create-zone.png new file mode 100644 index 00000000000..359c3efbdaa Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-create-zone.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-dns-record.png b/docs/ja/cloud/security/images/gcp-psc-dns-record.png new file mode 100644 index 00000000000..3a54090a43c Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-dns-record.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png b/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png new file mode 100644 index 00000000000..6044304c50e Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-open.png b/docs/ja/cloud/security/images/gcp-psc-open.png new file mode 100644 index 00000000000..f118fba4026 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-open.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-overview.png b/docs/ja/cloud/security/images/gcp-psc-overview.png new file mode 100644 index 00000000000..f76fe31ef67 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-overview.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-zone-type.png b/docs/ja/cloud/security/images/gcp-psc-zone-type.png new file mode 100644 index 00000000000..91ae67b0ee3 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-zone-type.png differ diff --git a/docs/ja/cloud/security/images/ip-filter-add-single-ip.png b/docs/ja/cloud/security/images/ip-filter-add-single-ip.png new file mode 100644 index 00000000000..25317d64b88 Binary files /dev/null and b/docs/ja/cloud/security/images/ip-filter-add-single-ip.png differ diff --git a/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png b/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png new file mode 100644 index 00000000000..c1788532787 Binary files /dev/null and b/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png differ diff --git a/docs/ja/cloud/security/images/pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/pe-remove-private-endpoint.png new file mode 100644 index 00000000000..840561f4cb5 Binary files /dev/null and b/docs/ja/cloud/security/images/pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/secures3.jpg b/docs/ja/cloud/security/images/secures3.jpg new file mode 100644 index 00000000000..55311413e44 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3.jpg differ diff --git a/docs/ja/cloud/security/images/secures3_arn.jpg b/docs/ja/cloud/security/images/secures3_arn.jpg new file mode 100644 index 00000000000..13bdf7a2fd6 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3_arn.jpg differ diff --git a/docs/ja/cloud/security/images/secures3_output.jpg b/docs/ja/cloud/security/images/secures3_output.jpg new file mode 100644 index 00000000000..329a041b963 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3_output.jpg differ diff --git a/docs/ja/cloud/security/images/support-case-form.png b/docs/ja/cloud/security/images/support-case-form.png new file mode 100644 index 00000000000..7966f13b90d Binary files /dev/null and b/docs/ja/cloud/security/images/support-case-form.png differ diff --git a/docs/ja/cloud/security/personal-data-access.md b/docs/ja/cloud/security/personal-data-access.md new file mode 100644 index 00000000000..e26cf405647 --- /dev/null +++ b/docs/ja/cloud/security/personal-data-access.md @@ -0,0 +1,55 @@ +--- +sidebar_label: 個人データアクセス +slug: /ja/cloud/security/personal-data-access +title: 個人データアクセス +--- + +## はじめに +登録ユーザーであれば、ClickHouseを使用してアカウントの個人データを表示および修正することができます。これには、連絡先情報や、役割に応じて組織内の他のユーザーの連絡先情報、APIキーの詳細情報、その他の情報が含まれることがあります。これらはClickHouseのユーザーインターフェース(UI)から自己管理で行うことができます。 + +**データ主体アクセス要求(DSAR)とは** +あなたの所在地によっては、適用法によりClickHouseが保持するあなたの個人データに関する追加の権利(データ主体の権利)が提供される場合があります。この権利については、ClickHouseのプライバシーポリシーで説明されています。データ主体の権利を行使するためのプロセスは、データ主体アクセス要求(DSAR)として知られています。 + +**個人データの範囲** +ClickHouseが収集する個人データの詳細やその使用方法については、ClickHouseのプライバシーポリシーをご確認ください。 + +## セルフサービス +デフォルトでは、ClickHouseはユーザーが自分の個人データをClickHouseのユーザーインターフェース(UI)から直接表示できるようにします。 + +以下に、アカウントを設定しサービスを使用する際にClickHouseが収集するデータの概要と、特定の個人データをClickHouse UI内で表示できる場所を示します。 + +| 場所/URL | 説明 | 個人データ | +|-------------|----------------|-----------------------------------------| +| https://auth.clickhouse.cloud/u/signup/ | アカウント登録 | メール、パスワード | +| https://clickhouse.cloud/profile | 一般的なユーザープロファイル詳細 | 名前、メール | +| https://clickhouse.cloud/organizations/OrgID/members | 組織内のユーザーリスト | 名前、メール | +| https://clickhouse.cloud/organizations/OrgID/keys | APIキーのリストとそれを作成した人 | メール | +| https://clickhouse.cloud/organizations/OrgID/activity | ユーザーごとの行動ログ | メール | +| https://clickhouse.cloud/organizations/OrgID/admin/billing | 請求情報と請求書 | 請求先住所、メール | +| https://control-plane.clickhouse-dev.com/support | ClickHouseサポートとのやり取り | 名前、メール | + +注意: `OrgID`が含まれるURLは、あなたの特定のアカウントに対応するOrgIDに更新する必要があります。 + +### 既存のお客様 +お客様が私たちのアカウントをお持ちで、上記のセルフサービスオプションで個人データの問題が解決せず、プライバシーポリシーに基づいてデータ主体アクセス要求を行いたい場合は、ClickHouseアカウントにログインし、[サポートケースを開いて](https://clickhouse.cloud/support)ください。これにより、あなたの身元を確認し、リクエストを完了するための手順を減らすことができます。 + +サポートケースには以下の詳細を含めてください: + +| 項目 | リクエストに含めるテキスト | +|-------------|---------------------------------------------------| +| 件名 | データ主体アクセス要求(DSAR) | +| 説明 | ClickHouseに探して、収集して、または提供してほしい情報の詳細な説明。 | + +サポートケースフォーム + +### アカウントをお持ちでない方 +アカウントをお持ちでなく、上記のセルフサービスオプションで個人データの問題が解決しない場合は、プライバシーポリシーに基づいてデータ主体アクセス要求を行うことができます。これらのリクエストは、[privacy@clickhouse.com](mailto:privacy@clickhouse.com)にメールで提出してください。 + +## 身元確認 + +メール経由でデータ主体アクセス要求を提出した場合、リクエストを処理しあなたの身元を確認するために特定の情報をお願いすることがあります。適用法により、リクエストを拒否する義務があったり、許可されることがあります。リクエストを拒否する場合は、法的な制限に従いその理由をお伝えします。 + +詳細については、[ClickHouseプライバシーポリシー](https://clickhouse.com/legal/privacy-policy)をご確認ください。 diff --git a/docs/ja/cloud/security/private-link-overview.md b/docs/ja/cloud/security/private-link-overview.md new file mode 100644 index 00000000000..cc4b2a835a7 --- /dev/null +++ b/docs/ja/cloud/security/private-link-overview.md @@ -0,0 +1,13 @@ +--- +sidebar_label: プライベートリンクの概要 +slug: /ja/cloud/security/private-link-overview +title: プライベートリンクの概要 +--- + +# プライベートリンクの概要 + +ClickHouse Cloud は、あなたのクラウド仮想ネットワークにサービスを接続する機能を提供します。以下のプロバイダー向けのガイドを参照してください: + +- [AWS プライベートリンク](/ja/cloud/security/aws-privatelink.md) +- [GCP プライベートサービスコネクト](/ja/cloud/security/gcp-private-service-connect.md) +- [Azure プライベートリンク](/ja/cloud/security/azure-privatelink.md) diff --git a/docs/ja/cloud/security/saml-sso-setup.md b/docs/ja/cloud/security/saml-sso-setup.md new file mode 100644 index 00000000000..069fb1766d9 --- /dev/null +++ b/docs/ja/cloud/security/saml-sso-setup.md @@ -0,0 +1,276 @@ +--- +sidebar_label: SAML SSO設定 +slug: /ja/cloud/security/saml-setup +title: SAML SSO設定 +description: ClickHouse CloudでのSAML SSOの設定方法 +--- + +# SAML SSO設定 + +:::note +SAML SSOはプライベートプレビュー中です。利用可能かどうか、お問い合わせはsupport@clickhouse.comまでご連絡ください。 +::: + +ClickHouse Cloudは、セキュリティアサーションマークアップ言語(SAML)を介したシングルサインオン(SSO)をサポートしています。これにより、アイデンティティプロバイダー(IdP)を使用して安全にClickHouse Cloudの組織にサインインできます。 + +現在、サービスプロバイダー主導のSSO、別々の接続を使用する複数の組織、およびジャストインタイムプロビジョニングをサポートしています。ドメイン間アイデンティティ管理システム(SCIM)や属性マッピングはまだサポートしていません。 + +## 始める前に + +IdPでの管理権限およびClickHouse Cloud組織での**管理者**ロールが必要です。IdP内での接続設定の後、以下の手順で求められる情報を使用してプロセスを完了するためにご連絡ください。 + +SAML接続に加え、**組織への直接リンク**を設定することをお勧めします。これにより、ログインプロセスが簡単になります。各IdPでの設定は異なるため、お使いのIdPについての情報を以下でお読みください。 + +## IdPの設定方法 + +### 全てのIdPs + +全ての設定には組織IDが必要です。組織IDを取得するには次の手順を行います: +1. [ClickHouse Cloud](https://console.clickhouse.cloud)の組織にサインインしてください。 + + Organization ID + +3. 左下隅で、**組織**の下にある組織名をクリックします。 + +4. ポップアップメニューで、**組織の詳細**を選択します。 + +5. 下記で使うための**組織ID**をメモしておいてください。 + +### Okta SAMLの設定 + +各ClickHouse組織に対して、Oktaで2つのアプリ統合を設定します:1つのSAMLアプリと、直接リンクを格納するためのブックマークです。 + +#### アクセスを管理するためのグループを作成: + +1. **管理者**としてOktaインスタンスにログインします。 + +2. 左側で**グループ**を選択します。 + +3. **グループを追加**をクリックします。 + +4. グループの名前と説明を入力します。このグループはSAMLアプリとその関連ブックマークアプリの間のユーザーを一貫させるために使用されます。 + +5. **保存**をクリックします。 + +6. 作成したグループの名前をクリックします。 + +7. このClickHouse組織にアクセスを許可したいユーザーを割り当てるために**人を割り当てる**をクリックします。 + +#### ユーザーがシームレスにログインできるようにブックマークアプリを作成: + +1. 左側で**アプリケーション**を選択し、次に**アプリケーション**のサブヘディングを選択します。 + +2. **アプリカタログを閲覧**をクリックします。 + +3. **ブックマークアプリ**を検索して選択します。 + +4. **統合を追加**をクリックします。 + +5. アプリのラベルを選択します。 + +6. URLとして`https://console.clickhouse.cloud?connection={organizationid}`を入力します。 + +7. **割り当て**タブに移動し、上記で作成したグループを追加します。 + +#### 接続を可能にするSAMLアプリを作成: + +1. 左側で**アプリケーション**を選択し、次に**アプリケーション**のサブヘディングを選択します。 + +2. **アプリ統合を作成**をクリックします。 + +3. SAML 2.0を選択し、次をクリックします。 + +4. アプリケーションの名前を入力し、**アプリケーションアイコンをユーザーに表示しない**のボックスをチェックし、次をクリックします。 + +5. 以下の値を使用して、SAML設定画面を入力します。 + + | フィールド | 値 | + |-----------------|------------------------------------------| + | シングルサインオンURL | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | オーディエンスURI (SPエンティティID) | urn:auth0:ch-production:{organizationid} | + | デフォルトリレーステート | 空白のまま | + | Name IDフォーマット | 指定なし | + | アプリケーションユーザー名 | Email | + | アプリケーションユーザー名の更新 | 作成および更新 | + +7. 以下の属性ステートメントを入力します。 + + | フィールド | 値 | + |-----------------|------------| + | Name | email | + | Name format | Basic | + | Value | user.email | + +8. **次へ**をクリックします。 + +9. フィードバック画面で求められる情報を入力し、**完了**をクリックします。 + +10. **割り当て**タブに移動し、上記で作成したグループを追加します。 + +11. 新しいアプリの**サインオン**タブで、**SAMLセットアップ手順を見る**ボタンをクリックします。 + + Okta SAML Setup Instructions + +13. 以下の3つのアイテムを集めて、プロセスを完了するために[サポートケースを提出](#submit-a-support-case)してください。 + - Identity Provider Single Sign-On URL + - Identity Provider Issuer + - X.509 Certificate + +### Google SAMLの設定 + +各組織ごとに1つのSAMLアプリをGoogleに設定し、複数組織SSOを使用する場合はユーザーに直接リンク(`https://console.clickhouse.cloud?connection={organizationId}`)をブックマークとして提供する必要があります。 + +1. Google管理コンソール(admin.google.com)に移動します。 + + Google SAML App + +2. **アプリ**をクリックし、左側で**ウェブとモバイルアプリ**を選択します。 + +3. 上部メニューから**アプリを追加**をクリックし、次に**カスタムSAMLアプリを追加**を選択します。 + +4. アプリの名前を入力し、**続行**をクリックします。 + +5. 以下の2つのアイテムを集め、情報を送信するために[サポートケースを提出](#submit-a-support-case)してください。注意:このデータをコピーする前に設定を完了した場合は、アプリのホーム画面から**メタデータをダウンロード**をクリックしてX.509証明書を取得してください。 + - SSO URL + - X.509 Certificate + +7. 以下のACS URLとエンティティIDを入力します。 + + | フィールド | 値 | + |---------------|---------------------------------------------------------------| + | ACS URL | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | エンティティID | urn:auth0:ch-production:{organizationid} | + +8. **署名付き応答**のボックスにチェックを入れます。 + +9. Name IDフォーマットとして**EMAIL**を選択し、Name IDを**基本情報 > プライマリメール**のままにしておきます。 + +10. **続行**をクリックします。 + +11. 以下の属性マッピングを入力します: + + | フィールド | 値 | + |-------------------|---------| + | 基本情報 | プライマリメール | + | アプリ属性 | email | + +13. **完了**をクリックします。 + +14. アプリを有効にするには**オフ**をクリックし、設定を**全員に対してオン**に変更します。左側のオプションを選択して、アクセル制限をグループまたは組織単位へと行うこともできます。 + +### Azure (Microsoft) SAMLの設定 + +Azure (Microsoft) SAMLはAzure Active Directory (AD)やMicrosoft Entraとも呼ばれます。 + +組織ごとに別々のサインオンURLを用意したアプリケーション統合を1つセットアップします。 + +1. Microsoft Entra管理センターにログオンします。 + +2. 左側で**アプリケーション > エンタープライズアプリケーション**に移動します。 + +3. 上部メニューで**新しいアプリケーション**をクリックします。 + +4. 上部メニューで**新しいアプリケーションを作成**をクリックします。 + +5. 名前を入力し、**ギャラリーにない他のアプリケーションを統合する(非ギャラリー)**を選択し、**作成**をクリックします。 + + Azure Non-Gallery App + +6. 左側で**ユーザーとグループ**をクリックしてユーザーを割り当てます。 + +7. 左側で**シングルサインオン**をクリックします。 + +8. **SAML**をクリックします。 + +9. 基本設定SAML構成画面を以下の設定で埋めます。 + + | フィールド | 値 | + |-----------------------------|---------------------------------------------------------------| + | 識別子(エンティティID) | urn:auth0:ch-production:{organizationid} | + | 応答URL(アサーション消費サービスURL) | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | サインオンURL | https://console.clickhouse.cloud?connection={organizationid} | + | リレーステート | 空白 | + | ログアウトURL | 空白 | + +11. 以下を属性とクレームの下に(A)を追加または(U)を更新: + + | クレーム名 | フォーマット | ソース属性 | + |------------------------------------------|---------------|------------------| + | (U) 一意のユーザー識別子(Name ID) | メールアドレス | user.mail | + | (A) email | Basic | user.mail | + | (U) /identity/claims/name | 省略された | user.mail | + + Attributes and Claims + +12. 以下の2つのアイテムを収集し、[サポートケースを提出](#submit-a-support-case)してプロセスを完了させてください: + - ログインURL + - 証明書(Base64) + +### サポートケースを提出 + +1. ClickHouse Cloudコンソールに戻ります。 + +2. 左側で**ヘルプ**を選択し、サポートサブメニューを選択します。 + +3. **新しいケース**をクリックします。 + +4. 件名に「SAML SSO設定」と入力します。 + +5. 説明欄に、上記の手順から集めたリンクを貼り付け、証明書をチケットに添付します。 + +6. どのドメインがこの接続に許可されるべきかもお知らせください(例:domain.com、domain.aiなど)。 + +7. 新しいケースを作成します。 + +8. ClickHouse Cloud内での設定を完了し、テスト準備が整った際にお知らせします。 + +9. 元の認証方法でサインインし、新しいSSOアカウントに管理者ロールを割り当ててください。 + - メール + パスワードアカウントの場合は、`https://clickhouse.cloud/?with=email`を使用してください。 + - ソーシャルログインの場合は、適切なボタン(**Googleで続行**または**Microsoftで続行**)をクリックしてください。 + +## 動作方法 + +### サービスプロバイダー主導のSSO + +私たちはサービスプロバイダー主導のSSOのみを利用しています。これは、ユーザーが`https://console.clickhouse.cloud`にアクセスし、メールアドレスを入力してIdPにリダイレクトされることを意味します。IdP経由で既に認証されているユーザーは、ログインページでメールアドレスを入力せずに、直接リンクを使用して自動的に組織にログインできます。 + +### ユーザーロールの割り当て + +ユーザーは、IdPアプリケーションに割り当てられて初めて、ClickHouse Cloudコンソールに表示されます。組織内で少なくとも1人のSSOユーザーが管理者ロールを持つ必要があります。元の認証方法を使用して、SSOロールを更新するにはソーシャルログインまたは`https://clickhouse.cloud?with=email`を使用してログインしてください。 + +### SSOを利用しないユーザーの削除 + +SSOユーザーを設定し、少なくとも1人のユーザーに管理者ロールを割り当てた後、管理者は他の方法(例:ソーシャル認証またはユーザーID + パスワード)を使用しているユーザーを削除できます。Google認証はSSO設定後も機能し続けます。ユーザーID + パスワードのユーザーは、メールドメインに基づいてSSOへ自動的にリダイレクトされますが、`https://clickhouse.cloud?with=email`を使用するとリダイレクトを回避できます。 + +### ユーザー管理 + +ClickHouse Cloudは現在SSOのためにSAMLを実装していますが、ユーザー管理のためのSCIMはまだ実装していません。つまり、SSOユーザーはClickHouse Cloud組織にアクセスするために、IdP内のアプリケーションに割り当てられる必要があります。ユーザーはClickHouse Cloudに一度ログインすると、組織内の**ユーザー**エリアに表示されます。IdPでユーザーが削除されると、SSOを使用してClickHouse Cloudにログインできなくなりますが、SSOユーザーは管理者が手動で削除するまで組織内に表示され続けます。 + +### マルチオーガナイゼーションSSO + +ClickHouse Cloudは、各組織に別々の接続を提供することで、複数組織のSSOをサポートします。各組織にログインするには、直接リンク(`https://console.clickhouse.cloud?connection={organizationid}`)を使用してください。別の組織にログインする前に一度ログアウトすることを忘れずにしてください。 + +## 追加情報 + +認証の際にセキュリティは最優先事項です。そのため、SSOを実装する際にいくつかの決定を行いましたのでお知らせします。 + +- **サービスプロバイダーによって開始される認証フローのみを処理します。** ユーザーは、`https://console.clickhouse.cloud`に移動してメールアドレスを入力し、IdPにリダイレクトされる必要があります。ブックマークアプリケーションまたはショートカットを追加する手順は、ユーザーがURLを覚える必要がないように便宜上提供されています。 + +- **IdP経由でアプリに割り当てられた全てのユーザーは同じメールドメインを持つ必要があります。** ClickHouseアカウントにアクセスしたいベンダー、契約者、またはコンサルタントがいる場合、彼らは従業員と同じドメインのメールアドレス(例:user@domain.com)を持つ必要があります。 + +- **SSOと非SSOアカウントを自動的にリンクしません。** 同じメールアドレスを使用していても、ClickHouseユーザーリストに複数のアカウントが表示されることがあります。 diff --git a/docs/ja/cloud/security/setting-ip-filters.md b/docs/ja/cloud/security/setting-ip-filters.md new file mode 100644 index 00000000000..6cd70f56485 --- /dev/null +++ b/docs/ja/cloud/security/setting-ip-filters.md @@ -0,0 +1,82 @@ +--- +sidebar_label: IPフィルタの設定 +slug: /ja/cloud/security/setting-ip-filters +title: IPフィルタの設定 +--- + +## IPフィルタの設定 + +IPアクセスリストは、ClickHouseサービスへのトラフィックをフィルタリングし、どの送信元アドレスがClickHouseサービスに接続を許可されているかを指定します。リストは各サービスごとに設定可能です。サービスの展開時、またはその後に設定できます。プロビジョニング中にIPアクセスリストを設定しない場合や、最初のリストを変更したい場合は、サービスを選択し、**Security** タブで変更できます。 + +:::important +ClickHouse Cloudサービスに対するIPアクセスリストの作成をスキップした場合、サービスへのトラフィックは許可されません。 +::: + +## 準備 + +開始する前に、アクセスリストに追加すべきIPアドレスまたは範囲を収集します。リモートワーカー、オンコールの場所、VPNなどを考慮に入れてください。IPアクセスリストのユーザーインターフェースは、個々の住所とCIDR表記を受け付けます。 + +クラスレスドメイン間ルーティング(CIDR)表記を使用すると、従来のクラスA、B、C(8、6、または24)サブネットマスクサイズよりも小さいIPアドレス範囲を指定できます。[ARIN](https://account.arin.net/public/cidrCalculator) などの組織はCIDR電卓を提供しており、CIDR表記の詳細については、[クラスレスドメイン間ルーティング (CIDR)](https://www.rfc-editor.org/rfc/rfc4632.html) RFCをご参照ください。 + +## IPアクセスリストの作成または変更 + +ClickHouse Cloudサービスリストからサービスを選択し、**Settings** を選択します。**Security** セクションの下にIPアクセスリストがあります。テキストにあるリンクをクリックします: *このサービスに接続できる場所* **(どこからでも | 特定のx地点から)** + +サイドバーが表示され、以下のオプションを設定できます: + +- どこからでもサービスに対する着信トラフィックを許可 +- 特定の場所からのサービスへのアクセスを許可 +- サービスへのすべてのアクセスを拒否 + +このスクリーンショットは、「NY Office range」として説明されたIPアドレスの範囲からのトラフィックを許可するアクセスリストを示しています: + + ![既存のアクセスリスト](@site/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png) + +### 可能な操作 + +1. 追加のエントリを追加するには、**+ Add new IP** を使用 + + この例では、`London server` と説明された単一のIPアドレスを追加します: + + ![アクセスリストに単一のIPを追加](@site/docs/ja/cloud/security/images/ip-filter-add-single-ip.png) + +2. 既存のエントリを削除 + + クロス(x)をクリックするとエントリが削除されます + +3. 既存のエントリを編集 + + エントリを直接変更 + +4. **Anywhere** からのアクセスを許可するように切り替える + + これは推奨されませんが、許可されています。ClickHouse上に構築されたアプリケーションを公開し、バックエンドのClickHouse Cloudサービスへのアクセスを制限することをお勧めします。 + +変更を反映させるには、**Save** をクリックする必要があります。 + +## 検証 + +フィルタを作成したら、範囲内からの接続を確認し、許可された範囲外からの接続が拒否されることを確認します。簡単な `curl` コマンドを使用して確認できます: +```bash title="許可リスト外からの接続試行が拒否される" +curl https://.clickhouse.cloud:8443 +``` +```response +curl: (35) error:02FFF036:system library:func(4095):Connection reset by peer +``` +または +```response +curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to HOSTNAME.clickhouse.cloud:8443 +``` + +```bash title="許可リスト内からの接続試行が許可される" +curl https://.clickhouse.cloud:8443 +``` +```response +Ok. +``` + +## 制限事項 + +- 現在、IPアクセスリストはIPv4のみをサポートしています + + diff --git a/docs/ja/cloud/security/shared-responsibility-model.md b/docs/ja/cloud/security/shared-responsibility-model.md new file mode 100644 index 00000000000..27b3c135f5b --- /dev/null +++ b/docs/ja/cloud/security/shared-responsibility-model.md @@ -0,0 +1,110 @@ +--- +sidebar_label: 共有責任モデル +slug: /ja/cloud/security/shared-responsibility-model +title: セキュリティ共有責任モデル +--- + +## サービスタイプ + +ClickHouse Cloud は3つのサービスタイプを提供しています。詳細は、[サービスタイプ](/docs/ja/cloud/manage/service-types)ページをご覧ください。 + +- 開発: 小規模なワークロードや開発環境に最適 +- 本番: 中規模のワークロードや顧客向けアプリケーション向け +- 専用: 厳しいレイテンシや分離要件があるアプリケーション向け + +## クラウドアーキテクチャ + +クラウドアーキテクチャは、コントロールプレーンとデータプレーンで構成されています。コントロールプレーンは、組織の作成、コントロールプレーン内のユーザー管理、サービス管理、APIキー管理、および請求を担当しています。データプレーンは、オーケストレーションと管理のためのツールを実行し、顧客サービスを収容します。詳細は、[ClickHouse Cloudアーキテクチャ](/docs/ja/cloud/reference/architecture)図をご覧ください。 + +## BYOCアーキテクチャ + +自身のクラウド(BYOC:Bring Your Own Cloud)を使用すると、顧客は自分のクラウドアカウントでデータプレーンを実行できます。詳細は、[BYOC(Bring Your Own Cloud)](/docs/ja/cloud/reference/byoc)ページをご覧ください。 + +## ClickHouse Cloudの共有責任モデル + +| コントロール | ClickHouse Cloud | 顧客 - クラウド | 顧客 - BYOC | +|-----------------------------------------------------------------------|-------------------|------------------|-----------------| +| 環境の分離を維持する | ✔️ | | ✔️ | +| ネットワーク設定を管理する | ✔️ | ✔️ | ✔️ | +| ClickHouseシステムへのアクセスを安全に管理する | ✔️ | | | +| コントロールプレーンおよびデータベース内の組織ユーザーを安全に管理 | | ✔️ | ✔️ | +| ユーザー管理と監査 | ✔️ | ✔️ | ✔️ | +| データを転送中および保管中に暗号化する | ✔️ | | | +| 顧客管理の暗号化キーを安全に扱う | | ✔️ | ✔️ | +| 冗長インフラストラクチャを提供する | ✔️ | | ✔️ | +| データのバックアップ | ✔️ | | | +| バックアップリカバリ機能を確認する | ✔️ | | | +| データ保持設定を実装する | | ✔️ | ✔️ | +| セキュリティ構成管理 | ✔️ | | ✔️ | +| ソフトウェアおよびインフラの脆弱性修正 | ✔️ | | | +| ペネトレーションテストを実施する | ✔️ | | | +| 脅威の検出と対応 | ✔️ | | ✔️ | +| セキュリティインシデント対応 | ✔️ | | ✔️ | + +## ClickHouse Cloudの設定可能なセキュリティ機能 + +
+ ネットワーク接続 + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | サービスへの接続を制限する[IPフィルタ](/docs/ja/cloud/security/setting-ip-filters) | Available | AWS, GCP, Azure | All | + | サービスへの安全な接続のための[プライベートリンク](/docs/ja/cloud/security/private-link-overview)| Available | AWS, GCP, Azure | Production or Dedicated | + +
+
+ アクセス管理 + + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | コントロールプレーンでの[標準のロールベースアクセス](/docs/ja/cloud/security/cloud-access-management) | Available | AWS, GCP, Azure | All | + | [多要素認証(MFA)](/docs/ja/cloud/security/cloud-authentication#multi-factor-authhentication)利用可能 | Available | AWS, GCP, Azure | All | + | コントロールプレーンへの[SAMLシングルサインオン](/docs/ja/cloud/security/saml-setup)利用可能 | Preview | AWS, GCP, Azure | Qualified Customers | + | データベースにおける[詳細なロールベースアクセス制御](/docs/ja/cloud/security/cloud-access-management#database-roles) | Available | AWS, GCP, Azure | All | + +
+
+ データセキュリティ + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | [クラウドプロバイダーとリージョン](/docs/ja/cloud/reference/supported-regions)の選択 | Available | AWS, GCP, Azure | All | + | 制限付きの[無料のデイリーバックアップ](/docs/ja/cloud/manage/backups#default-backup-policy) | Available | AWS, GCP, Azure | All | + | [カスタムバックアップ設定](/docs/ja/cloud/manage/backups#configurable-backups)利用可能 | Available | GCP, AWS, Azure | Production or Dedicated | + | 顧客管理の暗号化キー(CMEK)による透過的なデータ暗号化利用可能 | Available | AWS | Production or Dedicated | + | 手動キー管理による[フィールドレベル暗号化](/docs/ja/sql-reference/functions/encryption-functions) | Availablle | GCP, AWS, Azure | All | + + +
+
+ データ保持 + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | [有効期限(TTL)](/docs/ja/sql-reference/statements/alter/ttl)設定による保持管理 | Available | AWS, GCP, Azure | All | + | 大量削除アクションのための[ALTER TABLE DELETE](/docs/ja/sql-reference/statements/alter/delete) | Available | AWS, GCP, Azure | All | + | 測定された削除活動のための[軽量DELETE](/docs/ja/sql-reference/statements/delete) | Available | AWS, GCP, Azure | All | + +
+
+ 監査とロギング + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | コントロールプレーン活動のための[監査ログ](/docs/ja/cloud/security/audit-logging) | Available | AWS, GCP, Azure | All | + | データベース活動のための[セッションログ](/docs/ja/operations/system-tables/session_log) | Available | AWS, GCP, Azure | All | + | データベース活動のための[クエリログ](/docs/ja/operations/system-tables/query_log) | Available | AWS, GCP, Azure | All | + +
+ +## ClickHouse Cloudコンプライアンス + + | フレームワーク | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | ISO 27001コンプライアンス | Available | AWS, GCP, Azure | All | + | SOC 2 Type IIコンプライアンス | Available | AWS, GCP, Azure | All | + | GDPRおよびCCPAコンプライアンス | Available | AWS, GCP, Azure | All | + | HIPAAコンプライアンス | Beta | GCP, `AWSは間もなく対応予定` | Dedicated | + + 対応しているコンプライアンスフレームワークの詳細については、[セキュリティとコンプライアンス](/docs/ja/cloud/security/security-and-compliance)ページをご覧ください。 diff --git a/docs/ja/cloud/support.md b/docs/ja/cloud/support.md new file mode 100644 index 00000000000..c119bce7c23 --- /dev/null +++ b/docs/ja/cloud/support.md @@ -0,0 +1,8 @@ +--- +sidebar_label: クラウドサポート +--- +# クラウドサポート + +import Content from '@site/docs/ja/about-us/support.md'; + + diff --git a/docs/ja/concepts/glossary.md b/docs/ja/concepts/glossary.md new file mode 100644 index 00000000000..929b45dc246 --- /dev/null +++ b/docs/ja/concepts/glossary.md @@ -0,0 +1,34 @@ +--- +sidebar_label: "用語集" +description: "このページには、ClickHouseに関連する一般的に使用される用語とその定義が掲載されています。" +--- + +# 用語集 + +## 完全性(Atomicity) + +完全性は、トランザクション(データベース操作の一連の処理)が単一かつ不可分の単位として処理されることを保証します。つまり、トランザクション内のすべての操作が実行されるか、もしくは全く実行されないかのどちらかです。例えば、ある銀行口座から別の口座への送金は原子トランザクションの一例です。送金のいずれかのステップが失敗した場合、トランザクションは失敗し、送金元の口座にお金が残ります。完全性は、金銭が失われたり、作り出されたりしないことを保証します。 + +## クラスター + +データの保存と処理を共同で行うノード(サーバー)の集合。 + +## CMEK + +顧客管理による暗号化キー(CMEK)を使用すると、顧客はキー管理サービス(KMS)キーを使用してClickHouseディスクデータキーを暗号化し、保存データを保護することができます。 + +## Dictionary + +Dictionaryはキーと値のペアのマッピングで、さまざまな種類の参照リストに便利です。クエリでDictionaryを効率的に使用するための強力な機能であり、参照テーブルとの`JOIN`を使用するよりも効率的であることが多いです。 + +## パーツ + +テーブルデータの一部をディスクに保存する物理ファイルです。これは、パーティションキーを使用して作成される、テーブルデータの論理的な分割であるパーティションとは異なります。 + +## レプリカ + +ClickHouseデータベースに保存されたデータのコピーです。同一データのレプリカは冗長性と信頼性のために任意の数を持つことができます。レプリカは、データを異なるサーバー間で同期させるClickHouseのReplicatedMergeTreeテーブルエンジンと共に使用されます。 + +## シャード + +データの部分集合です。ClickHouseには必ず少なくとも1つのシャードがあります。データを複数のサーバーに分割しない場合、データは1つのシャードに格納されます。データを複数のサーバー間で分割することにより、単一サーバーの容量を超える負荷を分散することができます。 diff --git a/docs/ja/concepts/olap.md b/docs/ja/concepts/olap.md new file mode 100644 index 00000000000..3a71b40e282 --- /dev/null +++ b/docs/ja/concepts/olap.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 2 +sidebar_label: OLAPとは何か? +description: "OLAPはOnline Analytical Processing(オンライン分析処理)の略です。技術的およびビジネス的観点から広範に理解できる用語です。" +--- + +# OLAPとは何か? + + + +[OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing)は、Online Analytical Processing(オンライン分析処理)の略です。技術的およびビジネス的観点から広範に理解できる用語です。最高レベルでは、この言葉を逆に読むことができます: + +Processing(処理) +: いくつかのソースデータが処理され… + +Analytical(分析) +: …分析レポートや洞察を生成するためであり… + +Online(オンライン) +: …リアルタイムで行われます。 + +## ビジネスの観点から見たOLAP {#olap-from-the-business-perspective} + +近年、ビジネスの関係者はデータの価値を認識し始めています。盲目的に意思決定を行う企業は、競争に遅れないことが多いのです。成功している企業のデータ駆動型アプローチは、ビジネス上の意思決定に少しでも有用である可能性のあるすべてのデータを収集しなければならないことを強制し、彼らがこのデータをタイムリーに分析するためのメカニズムを必要とします。ここで、OLAPデータベース管理システム(DBMS)が登場します。 + +ビジネスの観点から言えば、OLAPは企業が運用活動を継続的に計画し、分析し、報告することを可能にし、これにより効率性を最大化し、経費を削減し、最終的に市場シェアを獲得します。これは、社内システムで行うことも、Web/モバイル分析サービス、CRMサービスなどのSaaSプロバイダーに外注することもできます。OLAPは、多くのBIアプリケーション(ビジネスインテリジェンス)の基盤技術です。 + +ClickHouseは、特定のドメインデータを分析するためのこれらのSaaSソリューションのバックエンドとして非常に頻繁に使用されるOLAPデータベース管理システムです。しかし、依然として一部の企業は第三者プロバイダーとデータを共有することに消極的であり、社内データウェアハウスのシナリオも有効です。 + +## 技術的観点から見たOLAP {#olap-from-the-technical-perspective} + +すべてのデータベース管理システムは、OLAP(Online **Analytical** Processing)とOLTP(Online **Transactional** Processing)の2つのグループに分類できます。前者は、各レポートを大量の履歴データに基づいて構築しますが、それを頻繁には行いません。後者は通常、継続的にデータの現在の状態を変更するトランザクションのストリームを処理します。 + +実際には、OLAPとOLTPは二項カテゴリとして見るのではなく、スペクトルとして見るべきです。ほとんどの実際のシステムは、主にこれらのいずれかに焦点を当てていますが、反対の種類のワークロードが望ましい場合に何らかの解決策や回避策を提供しています。この状況は、多くの企業に複数のストレージシステムを統合して運用することを余儀なくします。これはそれほど大した問題ではないかもしれませんが、多くのシステムを持つことはメンテナンスコストを増加させるため、近年のトレンドは単一のデータベース管理システムで両方の種類のワークロードを等しく処理できるHTAP(**Hybrid Transactional/Analytical Processing**)に向かっています。 + +DBMSが純粋なOLAPまたは純粋なOLTPとして始まったとしても、競争に追いつくためにHTAPの方向に進まざるを得ません。ClickHouseも例外ではありません。当初は[可能な限り高速なOLAPシステム](/ja/concepts/why-clickhouse-is-so-fast)として設計されており、今でも本格的なトランザクションサポートはありませんが、データの一貫した読み取り/書き込みや更新/削除のための変異のような機能が追加されています。 + +OLAPとOLTPシステムの間の基本的なトレードオフは次の通りです: + +- 分析レポートを効率的に構築するには、カラムを個別に読み取ることが重要であり、そのため、ほとんどのOLAPデータベースは[列指向](/knowledgebase/columnar-database)です。 +- カラムを個別に保存すると、行の操作、例えばアペンドやインプレースの修正のコストが、カラムの数(特にシステムがイベントのすべての詳細をちょうど一応収集しようとする場合は非常に多くなる可能性がある)に比例して増加します。したがって、ほとんどのOLTPシステムは、行ごとにデータを配置します。 diff --git a/docs/ja/concepts/why-clickhouse-is-so-fast.md b/docs/ja/concepts/why-clickhouse-is-so-fast.md new file mode 100644 index 00000000000..530e3e609c4 --- /dev/null +++ b/docs/ja/concepts/why-clickhouse-is-so-fast.md @@ -0,0 +1,112 @@ +--- +sidebar_position: 1 +sidebar_label: ClickHouseはなぜ速いのか? +description: "高速に設計されていました。クエリ実行のパフォーマンスは常に開発プロセスで最優先されていましたが、ユーザーフレンドリーさ、スケーラビリティ、セキュリティといった他の重要な特性も考慮され、ClickHouseが現実のプロダクションシステムとなることができました。" +--- + +# ClickHouseはなぜ速いのか? {#why-clickhouse-is-so-fast} + +[データの指向性](/docs/ja/intro#row-oriented-vs-column-oriented-storage)の他にも、データベースのパフォーマンスには多くの要因が寄与します。 +これから、ClickHouseが特に他の列指向データベースと比較して速い理由を詳しく説明します。 + +アーキテクチャの観点から見ると、データベースは少なくともストレージ層とクエリ処理層から成り立っています。ストレージ層はテーブルデータの保存、読み込み、管理を担当し、クエリ処理層はユーザークエリの実行を行います。ClickHouseは他のデータベースと比較して、挿入とSelectクエリを極めて高速に行うことを可能にする両層の革新を提供しています。 + +## ストレージ層: 同時挿入は相互に分離される + +ClickHouseでは、各テーブルは複数の「テーブルパーツ」から構成されています。ユーザーがテーブルにデータを挿入するたびに(INSERT文)、パートが作成されます。クエリは、クエリが開始された時点に存在するすべてのテーブルパーツに対して常に実行されます。 + +パーツが多くたまりすぎないようにするために、ClickHouseはバックグラウンドで複数の(小さな)パーツを単一の大きなパーツに継続的に組み合わせる結合操作を実行します。 + +このアプローチにはいくつかの利点があります。一方で、個々の挿入は「ローカル」であり、グローバル、すなわちテーブル全体のデータ構造を更新する必要がないという点です。結果として、複数の同時挿入は相互の同期や既存のテーブルデータとの同期を必要とせず、ディスクI/Oの速度で挿入を行うことが可能です。 + +## ストレージ層: 同時挿入および選択は分離される + +一方で、パーツの結合はユーザーに見えないバックグラウンド操作であり、同時選択クエリには影響を与えません。実際、このアーキテクチャは挿入と選択を非常に効果的に分離しており、多くの他のデータベースで採用されています。 + +## ストレージ層: 結合時の計算 + +他のデータベースとは異なり、ClickHouseは結合操作中に追加のデータ変換も実行できます。この例には以下が含まれます: + +- **Replacing merges**によって、入力パーツの行の最新バージョンのみを保持し、他のすべての行バージョンを破棄します。Replacing mergesは結合時のクリーンアップ操作と考えることができます。 + +- **Aggregating merges**によって、入力パーツの中間集計状態を新しい集計状態に結合します。これは、実際にはインクリメンタル集計を実装するだけです。 + +- **有効期限 (TTL) の結合** により、特定の時間ベースのルールに基づいて行を圧縮、移動、または削除します。 + +これらの変換のポイントは、ユーザークエリの実行時にかかる作業(計算)を結合時にシフトすることです。これが重要な理由は2つあります: + +一方では、クエリが変換後のデータ(例:事前集計データ)を活用できる場合、ユーザークエリは劇的に速くなる可能性があります。時には1000倍以上速くなることもあります。 + +他方では、結合の実行時間の大部分は、入力パーツの読み込みと出力パーツの保存に費やされます。結合中にデータを変換するための追加作業は、通常、結合の実行時間にあまり影響を与えません。これらの魔法は完全に透明であり、クエリの結果に影響を与えません(パフォーマンスを除いて)。 + +## ストレージ層: データのプルーニング + +実際には、多くのクエリは繰り返し可能であり、変更なしまたはわずかな修正(例:異なるパラメータ値)で定期的な間隔で実行されます。同じまたは類似のクエリを何度も実行することで、インデックスを追加したり、データを再編成して頻繁なクエリがデータにより速くアクセスできるようにします。このアプローチは「データプルーニング」としても知られており、ClickHouseはこれに対して3つの技術を提供しています: + +1. [主キーインデックス](https://clickhouse.com/docs/ja/optimize/sparse-primary-indexes) は、テーブルデータのソート順を定義します。適切に選ばれた主キーは、上記のクエリでのWHERE句のようなフィルタを、フルカラムスキャンではなく高速な二分探索で評価できるようにします。より技術的には、スキャンの実行時間はデータサイズに対して線形ではなく対数になります。 + +2. [テーブルのプロジェクション](https://clickhouse.com/docs/ja/sql-reference/statements/alter/projection) は、異なる主キーでソートされた同じデータを格納するテーブルの別の内部バージョンとして役立ちます。プロジェクションは、複数の頻繁なフィルタ条件がある場合に役立ちます。 + +3. [スキッピングインデックス](https://clickhouse.com/docs/ja/optimize/skipping-indexes) は、最小値や最大値、ユニークな値のセットなど、追加のデータ統計をカラムに埋め込みます。スキッピングインデックスは主キーやテーブルプロジェクションとは直交しており、カラム内のデータ分布に応じて、フィルタの評価を大幅に高速化することができます。 + +これら3つの技術はすべて、フルカラムの読み込み時にできるだけ多くの行をスキップすることを目的としており、データを最も速く読み取る方法は、そもそも読み取らないことです。 + +## ストレージ層: データ圧縮 + +さらに、ClickHouseのストレージ層は生のテーブルデータをさまざまなコーデックを使用して(または必要に応じて)圧縮します。 + +列ストアはこのような圧縮に非常に適しており、同じ型とデータ分布の値が一緒に配置されています。 + +ユーザーは、[設定](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) によって、カラムを様々な一般的な圧縮アルゴリズム(ZSTDなど)や特化したコーデック、例えば浮動小数点数用のGorillaとFPC、整数値用のDeltaとGCD、あるいは暗号化コーデックとしてのAESなどで圧縮することができます。 + +データ圧縮は、データベーステーブルのストレージサイズを削減するだけでなく、多くの場合、ローカルディスクやネットワークI/Oが低スループットに制約されているため、クエリパフォーマンスも向上させます。 + +## 最新鋭のクエリ処理層 + +最後に、ClickHouseはベクトル化されたクエリ処理層を採用しており、最大速度と効率を実現するためにリソースを最大限に活用してクエリの実行を並列化しています。 + +「ベクトル化」とは、クエリプランオペレーターが中間結果の行を単一行ではなくバッチで渡すことを意味します。これにより、CPUキャッシュの利用が向上し、オペレーターがSIMD命令を適用して複数の値を一度に処理できるようになります。実際、多くのオペレーターは複数のバージョンを持っており、それぞれのSIMD命令セット世代に対応しています。ClickHouseは、動作するハードウェアの能力に基づいて、最新かつ最速のバージョンを自動的に選択します。 + +現代のシステムには数十のCPUコアがあります。全てのコアを活用するために、ClickHouseはクエリプランを複数のレーンに展開し、通常はコアごとに1つのレーンを作成します。各レーンはテーブルデータの非重複範囲を処理します。この方法により、データベースのパフォーマンスは利用可能なコア数に応じて「垂直に」拡張されます。 + +単一ノードがテーブルデータを保持するには小さすぎる場合、さらにノードを追加してクラスターを形成できます。テーブルを分割して(「シャーディング」して)ノード間に分散することができます。ClickHouseはテーブルデータを格納するすべてのノードでクエリを実行し、これにより利用可能なノード数に応じて「水平に」スケールされます。 + +## 細部への徹底的なこだわり + +> **「ClickHouseは驚異的なシステムです - ハッシュテーブルの20バージョンがあります。通常のシステムが1つのハッシュテーブルを持つところ、ClickHouseは多様なクエリタイプ、データ構造、分布やインデックス設定にわたり、多数の専門的なコンポーネントを持つため、驚異的なパフォーマンスを実現しています。」** [Andy Pavlo, CMUのデータベース教授](https://www.youtube.com/watch?v=Vy2t_wZx4Is&t=3579s) + +ClickHouseを特別な存在にするのは、低レベルの最適化への徹底的なこだわりです。単に動作するデータベースを構築することも一つのことですが、さまざまなクエリタイプ、データ構造、分布、インデックス設定を横断して高速化を実現するためのエンジニアリングこそが「驚異的なシステム」の芸術が輝くところです。 + +**ハッシュテーブル。** ハッシュテーブルを例に取ってみましょう。ハッシュテーブルは、結合や集計で使用される中心的なデータ構造です。プログラマーとしては、以下の設計決定を検討する必要があります: + +* 選択するハッシュ関数、 +* 衝突の解決: [オープンアドレッシング](https://en.wikipedia.org/wiki/Open_addressing) または [チェイニング](https://en.wikipedia.org/wiki/Hash_table#Separate_chaining)、 +* メモリのレイアウト:キーと値のための1つの配列か、それとも別々の配列か? +* フィルファクタ:いつどのようにリサイズするか?リサイズ時に値をどのように移動するか? +* 削除:ハッシュテーブルはエントリーを削除することを許可すべきか? + +サードパーティのライブラリが提供する標準のハッシュテーブルは機能的には動作しますが、高速ではありません。優れたパフォーマンスは、徹底的なベンチマークと実験を必要とします。 + +[ClickHouseにおけるハッシュテーブルの実装](https://clickhouse.com/blog/hash-tables-in-clickhouse-and-zero-cost-abstractions) は、クエリとデータの特性に基づいて**30を超える事前コンパイルされたハッシュテーブルのバリエーション**から選択しています。 + +**アルゴリズム。** アルゴリズムについても同様です。例えば、ソートの場合を考えてみましょう: + +* 何をソートすべきか:数字、タプル、文字列、または構造体か? +* データはRAMにあるか? +* ソートは安定である必要があるか? +* すべてのデータをソートする必要があるか、部分的なソートで十分か? + +データの特徴に依存するアルゴリズムは、その一般的な対応物よりもパフォーマンスが優れていることがよくあります。データの特性が事前に不明な場合、システムはさまざまな実装を試し、実行時に最適なものを選択できます。例えば、ClickHouseにおけるLZ4デコードの実装方法についての[記事](https://habr.com/en/company/yandex/blog/457612/)を参照してください。 + +## VLDB 2024 論文 + +2024年8月に、私たちの最初の研究論文がVLDBに受理され、公開されました。 +VLDBは非常に大きなデータベースに関する国際会議であり、データ管理の分野で最も権威のある会議の一つと広く見なされています。 +数百件の提出物の中で、VLDBの採択率は通常約20%です。 + +ClickHouseがなぜそこまで高性能なのかについてその最も興味深いアーキテクチャおよびシステムデザインコンポーネントを簡潔に説明する[PDFの論文](https://www.vldb.org/pvldb/vol17/p3731-schulze.pdf)を読むことができます。 + +ClickHouseのCTOであり創設者でもあるAlexey Milovidovが、論文を発表し(スライドは[こちら](https://raw.githubusercontent.com/ClickHouse/clickhouse-presentations/master/vldb_2024/VLDB_2024_presentation.pdf)で入手可能)、時間切れとなった質疑応答を行いました。 +記録されたプレゼンテーションはこちらでご覧になれます: + + diff --git a/docs/ja/data-compression/compression-in-clickhouse.md b/docs/ja/data-compression/compression-in-clickhouse.md new file mode 100644 index 00000000000..a953b4ae17b --- /dev/null +++ b/docs/ja/data-compression/compression-in-clickhouse.md @@ -0,0 +1,220 @@ +--- +slug: /ja/data-compression/compression-in-clickhouse +title: ClickHouseにおける圧縮 +description: ClickHouseの圧縮アルゴリズムの選択 +keywords: [圧縮, コーデック, エンコーディング] +--- + +ClickHouseのクエリパフォーマンスの秘密の一つは圧縮です。 + +ディスク上のデータが少なければ、I/Oが減少し、クエリや挿入が速くなります。通常、CPUに関連する任意の圧縮アルゴリズムのオーバーヘッドは、I/Oの削減によって上回ります。そのため、ClickHouseのクエリを高速化するためには、データの圧縮を改善することに最初に注力するべきです。 + +> ClickHouseがデータをうまく圧縮する理由については、[この記事](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)をお勧めします。要約すると、列指向データベースとして、値はカラム順に書き込まれます。これらの値がソートされている場合、同じ値が互いに隣接します。圧縮アルゴリズムは連続するデータパターンを利用します。さらに、ClickHouseにはコーデックや細かなデータ型が存在し、ユーザーが圧縮技術をさらに調整できるようになっています。 + +ClickHouseにおける圧縮は主に以下の3つの要因に影響されます: +- 順序キー +- データ型 +- 使用されるコーデック + +これらはすべてスキーマを通じて設定されます。 + +## 圧縮を最適化するために適切なデータ型を選択 + +Stack Overflowのデータセットを例にしましょう。以下の`posts`テーブルのスキーマについての圧縮統計を比較します: + +- `posts` - 順序キーのないタイプ最適化がされていないスキーマ。 +- `posts_v3` - 各カラムに適切な型とビットサイズを持ち、順序キー`(PostTypeId, toDate(CreationDate), CommentCount)`を備えたタイプ最適化スキーマ。 + +以下のクエリを使用して、各カラムの現在の圧縮済みおよび未圧縮のサイズを測定できます。最初の`posts`の順序キーなしでの最適化スキーマのサイズを調べてみましょう。 + +```sql +SELECT name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table = 'posts' +GROUP BY name + +┌─name──────────────────┬─compressed_size─┬─uncompressed_size─┬───ratio─┐ +│ Body │ 46.14 GiB │ 127.31 GiB │ 2.76 │ +│ Title │ 1.20 GiB │ 2.63 GiB │ 2.19 │ +│ Score │ 84.77 MiB │ 736.45 MiB │ 8.69 │ +│ Tags │ 475.56 MiB │ 1.40 GiB │ 3.02 │ +│ ParentId │ 210.91 MiB │ 696.20 MiB │ 3.3 │ +│ Id │ 111.17 MiB │ 736.45 MiB │ 6.62 │ +│ AcceptedAnswerId │ 81.55 MiB │ 736.45 MiB │ 9.03 │ +│ ClosedDate │ 13.99 MiB │ 517.82 MiB │ 37.02 │ +│ LastActivityDate │ 489.84 MiB │ 964.64 MiB │ 1.97 │ +│ CommentCount │ 37.62 MiB │ 565.30 MiB │ 15.03 │ +│ OwnerUserId │ 368.98 MiB │ 736.45 MiB │ 2 │ +│ AnswerCount │ 21.82 MiB │ 622.35 MiB │ 28.53 │ +│ FavoriteCount │ 280.95 KiB │ 508.40 MiB │ 1853.02 │ +│ ViewCount │ 95.77 MiB │ 736.45 MiB │ 7.69 │ +│ LastEditorUserId │ 179.47 MiB │ 736.45 MiB │ 4.1 │ +│ ContentLicense │ 5.45 MiB │ 847.92 MiB │ 155.5 │ +│ OwnerDisplayName │ 14.30 MiB │ 142.58 MiB │ 9.97 │ +│ PostTypeId │ 20.93 MiB │ 565.30 MiB │ 27 │ +│ CreationDate │ 314.17 MiB │ 964.64 MiB │ 3.07 │ +│ LastEditDate │ 346.32 MiB │ 964.64 MiB │ 2.79 │ +│ LastEditorDisplayName │ 5.46 MiB │ 124.25 MiB │ 22.75 │ +│ CommunityOwnedDate │ 2.21 MiB │ 509.60 MiB │ 230.94 │ +└───────────────────────┴─────────────────┴───────────────────┴─────────┘ +``` + +ここでは圧縮済みサイズと未圧縮サイズの両方を表示しています。どちらも重要です。圧縮済みサイズはディスクから読み取る必要があるものを指し、これはクエリのパフォーマンス(およびストレージコスト)を最小化するために減らしたいものです。このデータは読み取る前に解凍する必要があります。この未圧縮サイズはデータ型に依存します。このサイズを最小化することで、クエリのメモリオーバーヘッドを減少させ、クエリで処理する必要があるデータを削減し、キャッシュの利用効率を向上させ、最終的にクエリ時間を短縮します。 + +> 上記のクエリは、システムデータベースの`columns`テーブルに依存しています。このデータベースはClickHouseによって管理され、クエリのパフォーマンスメトリクスからバックグラウンドクラスターログに至るまで、さまざまな有用な情報の宝庫です。好奇心旺盛な読者には、["System Tables and a Window into the Internals of ClickHouse"](https://clickhouse.com/blog/clickhouse-debugging-issues-with-system-tables)や、関連する記事[[1]](https://clickhouse.com/blog/monitoring-troubleshooting-insert-queries-clickhouse)[[2]](https://clickhouse.com/blog/monitoring-troubleshooting-select-queries-clickhouse)をお勧めします。 + +テーブル全体のサイズを要約するには、以下のクエリを簡素化できます: + +```sql +SELECT formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table = 'posts' + +┌─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ 50.16 GiB │ 143.47 GiB │ 2.86 │ +└─────────────────┴───────────────────┴───────┘ +``` + +最適化された型と順序キーを持つ`posts_v3`テーブルに対してこのクエリを繰り返すことで、未圧縮サイズと圧縮済みサイズが大幅に削減されていることがわかります。 + +```sql +SELECT + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE `table` = 'posts_v3' + +┌─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ 25.15 GiB │ 68.87 GiB │ 2.74 │ +└─────────────────┴───────────────────┴───────┘ +``` + +カラム別の詳細な分析では、データを圧縮前に順序化し、適切な型を使用することで、`Body`、`Title`、`Tags`、`CreationDate`カラムで大きな削減が達成されています。 + +```sql +SELECT + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE `table` = 'posts_v3' +GROUP BY name + +┌─name──────────────────┬─compressed_size─┬─uncompressed_size─┬───ratio─┐ +│ Body │ 23.10 GiB │ 63.63 GiB │ 2.75 │ +│ Title │ 614.65 MiB │ 1.28 GiB │ 2.14 │ +│ Score │ 40.28 MiB │ 227.38 MiB │ 5.65 │ +│ Tags │ 234.05 MiB │ 688.49 MiB │ 2.94 │ +│ ParentId │ 107.78 MiB │ 321.33 MiB │ 2.98 │ +│ Id │ 159.70 MiB │ 227.38 MiB │ 1.42 │ +│ AcceptedAnswerId │ 40.34 MiB │ 227.38 MiB │ 5.64 │ +│ ClosedDate │ 5.93 MiB │ 9.49 MiB │ 1.6 │ +│ LastActivityDate │ 246.55 MiB │ 454.76 MiB │ 1.84 │ +│ CommentCount │ 635.78 KiB │ 56.84 MiB │ 91.55 │ +│ OwnerUserId │ 183.86 MiB │ 227.38 MiB │ 1.24 │ +│ AnswerCount │ 9.67 MiB │ 113.69 MiB │ 11.76 │ +│ FavoriteCount │ 19.77 KiB │ 147.32 KiB │ 7.45 │ +│ ViewCount │ 45.04 MiB │ 227.38 MiB │ 5.05 │ +│ LastEditorUserId │ 86.25 MiB │ 227.38 MiB │ 2.64 │ +│ ContentLicense │ 2.17 MiB │ 57.10 MiB │ 26.37 │ +│ OwnerDisplayName │ 5.95 MiB │ 16.19 MiB │ 2.72 │ +│ PostTypeId │ 39.49 KiB │ 56.84 MiB │ 1474.01 │ +│ CreationDate │ 181.23 MiB │ 454.76 MiB │ 2.51 │ +│ LastEditDate │ 134.07 MiB │ 454.76 MiB │ 3.39 │ +│ LastEditorDisplayName │ 2.15 MiB │ 6.25 MiB │ 2.91 │ +│ CommunityOwnedDate │ 824.60 KiB │ 1.34 MiB │ 1.66 │ +└───────────────────────┴─────────────────┴───────────────────┴─────────┘ +``` + +## 適切なカラムの圧縮コーデックの選択 + +カラム圧縮コーデックを使用すると、各カラムをエンコードおよび圧縮するために使用されるアルゴリズム(およびその設定)を変更できます。 + +エンコーディングと圧縮は若干異なる仕組みで動作しますが、目的は同じです:データサイズを削減することです。エンコーディングは私たちのデータにマッピングを適用し、データ型の特性を利用した関数に基づいて値を変換します。逆に、圧縮はバイトレベルでデータを圧縮する一般的なアルゴリズムを使用します。 + +通常、エンコーディングは圧縮が使用される前に適用されます。異なるエンコーディングと圧縮アルゴリズムは、異なる値の分布に対して有効なので、データを理解する必要があります。 + +ClickHouseは多くのコーデックと圧縮アルゴリズムをサポートしています。以下は重要度の順にいくつかの推奨事項です: + +- **`ZSTD`を基本とする** - `ZSTD`圧縮は最高の圧縮率を提供します。`ZSTD(1)`は、最も一般的な型のデフォルトとして設定されるべきです。圧縮率を高めるために数値を変更することが試みられますが、挿入速度が遅くなるコストを考慮すると、3以上の値を使用することはほとんどないでしょう。 +- **整数や日付のシーケンスには`Delta`を** - `Delta`ベースのコーデックは、単調なシーケンスや連続する値の間で小さなデルタがある場合にうまく機能します。より具体的には、`Delta`コーデックは、微分が小さな数値を生成する場合によく機能します。そうでない場合は、`DoubleDelta`を試す価値があります(これは通常、`Delta`の最初のレベルの導関数がすでに非常に小さい場合にはさほど影響を与えません)。単調な増加が一定のシーケンス、例えば日付時間フィールドはさらによく圧縮されます。 +- **`Delta`は`ZSTD`を改善する** - `ZSTD`はデルタデータにおいて効果的なコーデックです。逆に、デルタエンコーディングは`ZSTD`の圧縮を改善することができます。`ZSTD`が存在する場合、他のコーデックはさらなる改善をほとんど提供しません。 +- **可能であれば`ZSTD`よりも`LZ4`を** - `LZ4`と`ZSTD`が同等の圧縮を提供する場合、後者のほうが高速な解凍を提供し、より少ないCPUを必要とするため、`LZ4`を選ぶほうが良いでしょう。しかし、ほとんどの場合`ZSTD`は`LZ4`を大幅に上回る性能を発揮します。これらのコーデックの一部は、`LZ4`と組み合わせることで、`ZSTD`に匹敵する圧縮を提供しながら高速に動作する場合がありますが、これにはテストが必要です。 +- **スパースデータや小範囲には`T64`を** - `T64`はスパースデータやブロック内の範囲が小さい場合に効果的です。ランダムな数値には`T64`を避けるべきです。 +- **未知のパターンには`Gorilla`と`T64`を試す** - データが未知のパターンを持つ場合、`Gorilla`と`T64`を試す価値があるかもしれません。 +- **ゲージデータには`Gorilla`を** - `Gorilla`は浮動小数点データ、特にゲージ読み取りを表すデータ、すなわちランダムなスパイクに効果的です。 + +さらに詳しいオプションは[こちら](/ja/sql-reference/statements/create/table#column_compression_codec)を参照してください。 + +以下では、`Id`、`ViewCount`、`AnswerCount`に対して`Delta`コーデックを指定します。これらが順序キーと線形に相関していると仮定し、Deltaエンコードから恩恵を受けるはずです。 + +```sql +CREATE TABLE posts_v4 +( + `Id` Int32 CODEC(Delta, ZSTD), + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), + `Score` Int32, + `ViewCount` UInt32 CODEC(Delta, ZSTD), + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime64(3, 'UTC'), + `LastActivityDate` DateTime64(3, 'UTC'), + `Title` String, + `Tags` String, + `AnswerCount` UInt16 CODEC(Delta, ZSTD), + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime64(3, 'UTC'), + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +これらのカラムの圧縮の改善は以下の通りです: + +```sql +SELECT + `table`, + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE (name IN ('Id', 'ViewCount', 'AnswerCount')) AND (`table` IN ('posts_v3', 'posts_v4')) +GROUP BY + `table`, + name +ORDER BY + name ASC, + `table` ASC + +┌─table────┬─name────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ posts_v3 │ AnswerCount │ 9.67 MiB │ 113.69 MiB │ 11.76 │ +│ posts_v4 │ AnswerCount │ 10.39 MiB │ 111.31 MiB │ 10.71 │ +│ posts_v3 │ Id │ 159.70 MiB │ 227.38 MiB │ 1.42 │ +│ posts_v4 │ Id │ 64.91 MiB │ 222.63 MiB │ 3.43 │ +│ posts_v3 │ ViewCount │ 45.04 MiB │ 227.38 MiB │ 5.05 │ +│ posts_v4 │ ViewCount │ 52.72 MiB │ 222.63 MiB │ 4.22 │ +└──────────┴─────────────┴─────────────────┴───────────────────┴───────┘ + +6 rows in set. Elapsed: 0.008 sec +``` + +### ClickHouse Cloudにおける圧縮 + +ClickHouse Cloudでは、デフォルトで`ZSTD`圧縮アルゴリズム(デフォルト値は1)を利用しています。このアルゴリズムの圧縮速度は圧縮レベルによって異なりますが(圧縮レベルが高いほど遅くなる)、解凍が一貫して高速(約20%のばらつき)であり、並列化の恩恵を受ける能力を持っているという利点を持っています。過去のテストでは、このアルゴリズムが非常に効果的であり、`LZ4`とコーデックの組み合わせよりも優れている場合が多いことが示されています。ほとんどのデータ型と情報の分布に対して効果的であるため、一般目的のデフォルトとして理にかなっており、最初の圧縮が最適化されていなくてもすでに優れている理由です。 diff --git a/docs/ja/data-compression/compression-modes.md b/docs/ja/data-compression/compression-modes.md new file mode 100644 index 00000000000..def9e50d8a4 --- /dev/null +++ b/docs/ja/data-compression/compression-modes.md @@ -0,0 +1,51 @@ +--- +slug: /ja/data-compression/compression-modes +sidebar_position: 6 +title: 圧縮モード +description: ClickHouseのカラム圧縮モード +keywords: [圧縮, コーデック, エンコーディング, モード] +--- + +# 圧縮モード + +ClickHouseプロトコルは、チェックサム付きで**データブロック**の圧縮をサポートしています。どのモードを選ぶか迷った場合は、`LZ4`を使用してください。 + +:::tip +使用可能な[カラム圧縮コーデック](/docs/ja/sql-reference/statements/create/table.md/#column-compression-codecs)について詳しく学び、テーブル作成時またはその後に指定してください。 +::: + +## モード + +| 値 | 名前 | 説明 | +|--------|--------------------|----------------------------------------------| +| `0x02` | [None](#none-mode) | 圧縮なし、チェックサムのみ | +| `0x82` | LZ4 | 非常に高速で、良好な圧縮 | +| `0x90` | ZSTD | Zstandard、かなり高速で最良の圧縮 | + +LZ4とZSTDは同じ作者によって作られていますが、異なるトレードオフがあります。 +[Facebookのベンチマーク](https://facebook.github.io/zstd/#benchmarks)からのデータ: + +| 名前 | 比率 | エンコーディング | デコーディング | +|----------------------|-------|------------------|------------------| +| **zstd** 1.4.5 -1 | 2.8 | 500 MB/s | 1660 MB/s | +| **lz4** 1.9.2 | 2.1 | 740 MB/s | 4530 MB/s | + +## ブロック + +| フィールド | 型 | 説明 | +|-------------------|---------|--------------------------------------------------------| +| checksum | uint128 | (ヘッダー + 圧縮データ)の[ハッシュ](../native-protocol/hash.md) | +| raw_size | uint32 | ヘッダーなしの生データサイズ | +| data_size | uint32 | 非圧縮データサイズ | +| mode | byte | 圧縮モード | +| compressed_data | binary | 圧縮データのブロック | + +![圧縮ブロック図](../native-protocol/images/ch_compression_block.drawio.svg) + +ヘッダーは(raw_size + data_size + mode)で構成され、生データサイズは(ヘッダー + 圧縮データ)の長さになります。 + +チェックサムは`hash(header + compressed_data)`で、[ClickHouse CityHash](../native-protocol/hash.md)を使用しています。 + +## Noneモード + +*None*モードが使用されている場合、`compressed_data`は元のデータと同じです。圧縮を行わないモードは、チェックサムによって追加のデータ整合性を確保するのに有用であり、ハッシュ処理のオーバーヘッドはごくわずかです。 diff --git a/docs/ja/data-modeling/denormalization.md b/docs/ja/data-modeling/denormalization.md new file mode 100644 index 00000000000..c135820b382 --- /dev/null +++ b/docs/ja/data-modeling/denormalization.md @@ -0,0 +1,375 @@ +--- +slug: /ja/data-modeling/denormalization +title: データの非正規化 +description: クエリパフォーマンスを向上させるためのデータ非正規化の使用法 +keywords: [データの非正規化, 非正規化, クエリ最適化] +--- + +# データの非正規化 + +データの非正規化は、ClickHouseにおいて、テーブルを平坦化して結合を避けることでクエリ遅延を最小化する技術です。 + +## 正規化されたスキーマ vs. 非正規化されたスキーマの比較 + +データの非正規化は、特定のクエリパターンのためにデータベースパフォーマンスを最適化する目的で、意図的に正規化プロセスを逆にします。正規化されたデータベースでは、冗長性を最小化しデータ整合性を確保するために、データは複数の関連したテーブルに分割されます。非正規化は、テーブルを結合し、データを重複させ、計算されたフィールドを単一または少数のテーブルに組み込むことで冗長性を再導入します - つまり、クエリ時に結合するのではなく挿入時に結合させます。 + +このプロセスはクエリ時の複雑な結合の必要性を削減し、読み取り操作を大幅に高速化できるため、重い読み込み要求と複雑なクエリを持つアプリケーションに最適です。しかし、書き込み操作やメンテナンスの複雑さが増し、重複したデータの変更を全てのインスタンスに伝播して整合性を保つ必要があります。 + +ClickHouseにおける非正規化 + +
+ +NoSQLソリューションが普及した一般的な技術は、`JOIN`サポートがない場合にデータを非正規化して、統計や関連する行を親行にカラムやネストされたオブジェクトとして保存することです。例えば、ブログの例のスキーマでは、全ての`Comments`を該当する投稿のオブジェクトの`Array`として保存できます。 + +## 非正規化を使用するべき時 + +一般的に、以下のケースで非正規化をお勧めします: + +- 頻繁に変更されないテーブル、またはデータが分析クエリに利用可能になるまでの遅延が許容できるテーブルを非正規化します。つまり、データをバッチで完全に再ロードできます。 +- 多対多の関係を非正規化しないようにします。1つの元データ行が変更されると多くの行を更新する必要が生じる可能性があります。 +- カーディナリティが高い関係を非正規化しないようにします。テーブル内の各行が別のテーブルに数千の関連エントリを持つ場合、これらは`Array`として表現される必要があります - プリミティブタイプまたはタプルのどちらかです。通常、1000以上のタプルを持つ配列はお勧めしません。 +- 全てのカラムをネストされたオブジェクトとして非正規化するより、Materialized Viewを使用して統計のみを非正規化することを検討してください(以下参照)。 + +全ての情報を非正規化する必要はなく、頻繁にアクセスされる重要な情報のみを非正規化してください。 + +非正規化の作業はClickHouseまたは上流で処理できます。例えば、Apache Flinkを使用します。 + +## 頻繁に更新されるデータでの非正規化を避ける + +ClickHouseのために、非正規化はクエリパフォーマンスを最適化するためにユーザーが使用できるいくつかのオプションの1つですが、注意して使用する必要があります。データが頻繁に更新され、リアルタイムに近い更新が必要な場合、このアプローチは避けるべきです。メインテーブルが主に追加のみであるか、バッチとして定期的に再ロードできる場合に使用します。 + +アプローチとしては主に、書き込みパフォーマンスとデータの更新という1つの主要な課題を抱えています。具体的には、非正規化はデータの結合の責任をクエリ時からインジェスト時に効果的に移します。これによりクエリパフォーマンスが大幅に向上する一方で、インジェストを複雑にし、データパイプラインが変更された場合に行をClickHouseに再挿入する必要があります。つまり、単一の元データ行の変更は、ClickHouse内の多くの行を更新する必要があるかもしれません。複雑なスキーマで、一連の結合から構成された行がある場合、結合のネストされたコンポーネントの1行の変更は、潜在的に何百万もの行を更新しなければならないかもしれません。 + +リアルタイムでこれを達成するのは現実的でないことが多く、大きな技術的努力が必要です。その理由は2つの課題によります: + +1. テーブル行が変更されたときに適切な結合ステートメントをトリガーすることです。理想的には結合の全てのオブジェクトが更新される原因とならないようにする必要があります - 影響を受けたものだけです。高スループット下で正しい行にフィルタリングするために結合を修正し、この作業を実現するには外部ツールやエンジニアリングが必要です。 +1. ClickHouseでの行の更新には慎重な管理が必要で、追加の複雑さが導入されます。 + +
+ +したがって、すべての非正規化されたオブジェクトを定期的に再ロードするバッチ更新プロセスがより一般的です。 + +## 非正規化の実際的なケース + +非正規化が理にかなっている場合と、他の方法が望ましい場合の実際的な例をいくつか考えてみましょう。 + +既に`AnswerCount`や`CommentCount`などの統計が非正規化されている`Posts`テーブルを考えてみます。ソースデータがこの形で提供されています。実際、これは頻繁に変更される可能性が高いため、実際にはこの情報を正規化したいかもしれません。これらの多くのカラムも他のテーブルから利用可能です 例えば、投稿に対するコメントは`PostId`カラムと`Comments`テーブルを介して利用可能です。例示目的のため、投稿がバッチプロセスで再ロードされると仮定します。 + +また、分析のためのメインテーブルとして`Posts`に他のテーブルを非正規化するだけを考えます。非正規化は、同じ考慮事項が適用されるクエリのために他の方向性にも適しています。 + +*以下の各例では、どちらのテーブルも結合で使用されるクエリが存在すると想定します。* + +### Posts と Votes + +Votesは別のテーブルとして表現されています。この最適化されたスキーマは以下に示されており、データをロードするための挿入コマンドも示されています: + +```sql +CREATE TABLE votes +( + `Id` UInt32, + `PostId` Int32, + `VoteTypeId` UInt8, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `BountyAmount` UInt8 +) +ENGINE = MergeTree +ORDER BY (VoteTypeId, CreationDate, PostId) + +INSERT INTO votes SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes/*.parquet') + +0 rows in set. Elapsed: 26.272 sec. Processed 238.98 million rows, 2.13 GB (9.10 million rows/s., 80.97 MB/s.) +``` + +一見、これらは投稿テーブルで非正規化するための候補かもしれません。しかし、このアプローチにはいくつかの課題があります。 + +投票は頻繁に投稿に追加されます。時間が経つにつれて投稿ごとに減少するかもしれませんが、以下のクエリは、3万件の投稿に対して時間あたり約4万件の投票があることを示しています。 + +```sql +SELECT round(avg(c)) AS avg_votes_per_hr, round(avg(posts)) AS avg_posts_per_hr +FROM +( + SELECT + toStartOfHour(CreationDate) AS hr, + count() AS c, + uniq(PostId) AS posts + FROM votes + GROUP BY hr +) + +┌─avg_votes_per_hr─┬─avg_posts_per_hr─┐ +│ 41759 │ 33322 │ +└──────────────────┴──────────────────┘ +``` + +遅延が許容できる場合はバッチ処理で対策できますが、これでも更新を処理する必要があり、全ての投稿を定期的に再ロードする(望ましいとは限りません)必要があります。 + +さらに問題なのは、いくつかの投稿には非常に多くの投票があることです: + +```sql +SELECT PostId, concat('https://stackoverflow.com/questions/', PostId) AS url, count() AS c +FROM votes +GROUP BY PostId +ORDER BY c DESC +LIMIT 5 + +┌───PostId─┬─url──────────────────────────────────────────┬─────c─┐ +│ 11227902 │ https://stackoverflow.com/questions/11227902 │ 35123 │ +│ 927386 │ https://stackoverflow.com/questions/927386 │ 29090 │ +│ 11227809 │ https://stackoverflow.com/questions/11227809 │ 27475 │ +│ 927358 │ https://stackoverflow.com/questions/927358 │ 26409 │ +│ 2003515 │ https://stackoverflow.com/questions/2003515 │ 25899 │ +└──────────┴──────────────────────────────────────────────┴───────┘ +``` + +ここでの主な観察点は、各投稿の集計された投票統計がほとんどの分析には十分であるということです - 全ての投票情報を非正規化する必要はありません。例えば、現在の`Score`カラムは例えば総アップ票数と総ダウン票数の差という統計を表しています。理想的には、シンプルなルックアップでクエリ時にこれらの統計を取得できる([dictionaries](/ja/dictionary)参照)と良いでしょう。 + +### Users と Badges + +次に`Users`と`Badges`を考えてみましょう: + +UsersとBadgesのスキーマ + +

+まず以下のコマンドを使ってデータを挿入します: +

+ +```sql +CREATE TABLE users +( + `Id` Int32, + `Reputation` LowCardinality(String), + `CreationDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `DisplayName` String, + `LastAccessDate` DateTime64(3, 'UTC'), + `AboutMe` String, + `Views` UInt32, + `UpVotes` UInt32, + `DownVotes` UInt32, + `WebsiteUrl` String, + `Location` LowCardinality(String), + `AccountId` Int32 +) +ENGINE = MergeTree +ORDER BY (Id, CreationDate) +``` + +```sql +CREATE TABLE badges +( + `Id` UInt32, + `UserId` Int32, + `Name` LowCardinality(String), + `Date` DateTime64(3, 'UTC'), + `Class` Enum8('Gold' = 1, 'Silver' = 2, 'Bronze' = 3), + `TagBased` Bool +) +ENGINE = MergeTree +ORDER BY UserId + +INSERT INTO users SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/users.parquet') + +0 rows in set. Elapsed: 26.229 sec. Processed 22.48 million rows, 1.36 GB (857.21 thousand rows/s., 51.99 MB/s.) + +INSERT INTO badges SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/badges.parquet') + +0 rows in set. Elapsed: 18.126 sec. Processed 51.29 million rows, 797.05 MB (2.83 million rows/s., 43.97 MB/s.) +``` + +ユーザーは頻繁にバッジを獲得する可能性がありますが、このデータセットを1日以上にわたって更新する必要はないかもしれません。バッジとユーザーの関係は一対多です。タプルのリストとしてユーザーにバッジを単純に非正規化できないでしょうか? 可能ですが、以下のクエリから確認する、ユーザーごとのバッジの最高数が理想的でないことを示唆しています: + +```sql +SELECT UserId, count() AS c FROM badges GROUP BY UserId ORDER BY c DESC LIMIT 5 + +┌─UserId─┬─────c─┐ +│ 22656 │ 19334 │ +│ 6309 │ 10516 │ +│ 100297 │ 7848 │ +│ 157882 │ 7574 │ +│ 29407 │ 6512 │ +└────────┴───────┘ +``` + +19k以上のオブジェクトを単一行に非正規化するのは現実的ではないかもしれません。 この関係は別テーブルとして残すか、統計を追加するのが良いでしょう。 + +> バッジの統計をユーザーに対して非正規化したいかもしれません。 このデータセットでの挿入時にdictionariesを使用した例を考慮しています。 + +### Posts と PostLinks + +`PostLinks`はユーザーが関連しているまたは重複していると考える`Posts`を接続します。 以下のクエリはスキーマとロードコマンドを示しています: + +```sql +CREATE TABLE postlinks +( + `Id` UInt64, + `CreationDate` DateTime64(3, 'UTC'), + `PostId` Int32, + `RelatedPostId` Int32, + `LinkTypeId` Enum('Linked' = 1, 'Duplicate' = 3) +) +ENGINE = MergeTree +ORDER BY (PostId, RelatedPostId) + +INSERT INTO postlinks SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/postlinks.parquet') + +0 rows in set. Elapsed: 4.726 sec. Processed 6.55 million rows, 129.70 MB (1.39 million rows/s., 27.44 MB/s.) +``` + +非正規化を防ぐ投稿の多くのリンクがないことを確認できます: + +```sql +SELECT PostId, count() AS c +FROM postlinks +GROUP BY PostId +ORDER BY c DESC LIMIT 5 + +┌───PostId─┬───c─┐ +│ 22937618 │ 125 │ +│ 9549780 │ 120 │ +│ 3737139 │ 109 │ +│ 18050071 │ 103 │ +│ 25889234 │ 82 │ +└──────────┴─────┘ +``` + +同様に、これらのリンクは極端に頻繁に発生するイベントではありません: + +```sql +SELECT + round(avg(c)) AS avg_votes_per_hr, + round(avg(posts)) AS avg_posts_per_hr +FROM +( + SELECT + toStartOfHour(CreationDate) AS hr, + count() AS c, + uniq(PostId) AS posts + FROM postlinks + GROUP BY hr +) + +┌─avg_votes_per_hr─┬─avg_posts_per_hr─┐ +│ 54 │ 44 │ +└──────────────────┴──────────────────┘ +``` + +これを以下の非正規化の例として使用します。 + +### シンプルな統計の例 + +ほとんどの場合、非正規化は親行に単一のカラムまたは統計を追加する必要があります。例えば、複製投稿の数で投稿を豊かにしたい場合は、単一のカラムを追加するだけです。 + +```sql +CREATE TABLE posts_with_duplicate_count +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... -other columns + `DuplicatePosts` UInt16 +) ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +このテーブルを埋めるために、重複統計と投稿を結合する`INSERT INTO SELECT`を利用します。 + +```sql +INSERT INTO posts_with_duplicate_count SELECT + posts.*, + DuplicatePosts +FROM posts AS posts +LEFT JOIN +( + SELECT PostId, countIf(LinkTypeId = 'Duplicate') AS DuplicatePosts + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts.Id = postlinks.PostId +``` + +### 多対一の関係に対する複雑な型の活用 + +非正規化を行うためには、複雑な型を活用する必要があることが多いです。一対一の関係が非正規化され、カラムが少ない場合、ユーザーはこれらを元の型のまま行として追加できます。しかし、より大きなオブジェクトや一対多の関係でこれは望ましくないことがあります。 + +複雑なオブジェクトや一対多の関係の場合、ユーザーは以下を使用できます: + +- 名前付きタプル - 複雑な構造を列の集合として表現します。 +- Array(Tuple) または Nested - 名前付きタプルの配列、つまりNested、各エントリがオブジェクトを表現します。一対多の関係に適用されます。 + +例として、`PostLinks`を`Posts`に非正規化する過程を示します。 + +各投稿は他の投稿へのリンクを含むことができます。以前に示した`PostLinks`スキーマとして。ネストされた型として、リンクと重複した投稿を以下のように表現することができます: + +```sql +SET flatten_nested=0 +CREATE TABLE posts_with_links +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... -other columns + `LinkedPosts` Nested(CreationDate DateTime64(3, 'UTC'), PostId Int32), + `DuplicatePosts` Nested(CreationDate DateTime64(3, 'UTC'), PostId Int32), +) ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +> ネストデータのフラット化を無効にする設定 `flatten_nested=0` の使用に注意してください。 ネストデータのフラット化を無効にすることを推奨しています。 + +`OUTER JOIN`クエリを使った`INSERT INTO SELECT`でこの非正規化を実行できます: + +```sql +INSERT INTO posts_with_links +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts.Id = postlinks.PostId + +0 rows in set. Elapsed: 155.372 sec. Processed 66.37 million rows, 76.33 GB (427.18 thousand rows/s., 491.25 MB/s.) +Peak memory usage: 6.98 GiB. +``` + +> ここでの時間に注意してください。約2分で6600万行を非正規化することができました。後で見るように、これはスケジュールできる操作です。 + +`PostId`ごとに`PostLinks`を配列に圧縮するために`groupArray`関数を使用して結合前に行います。次にこの配列を、`LinkedPosts`と`DuplicatePosts`の2つのサブリストにフィルタリングし、外部結合からの空の結果を除外します。 + +新しい非正規化された構造を見るためにいくつかの行を選択できます: + +```sql +SELECT LinkedPosts, DuplicatePosts +FROM posts_with_links +WHERE (length(LinkedPosts) > 2) AND (length(DuplicatePosts) > 0) +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +LinkedPosts: [('2017-04-11 11:53:09.583',3404508),('2017-04-11 11:49:07.680',3922739),('2017-04-11 11:48:33.353',33058004)] +DuplicatePosts: [('2017-04-11 12:18:37.260',3922739),('2017-04-11 12:18:37.260',33058004)] +``` + +## 非正規化のオーケストレーションとスケジューリング + +### バッチ + +非正規化を利用するには、それを実行し、オーケストレーションできる変換プロセスが必要です。 + +上記で示したように、データをロードした後に`INSERT INTO SELECT`を通じてこの変換を実行できます。これは定期的なバッチ変換に適しています。 + +ユーザーは、定期的なバッチロードプロセスが許容されるものとすると、ClickHouseでこれをオーケストレーションするためのいくつかのオプションを持っています: + +- **外部ツール** - [dbt](https://www.getdbt.com/)や[Airflow](https://airflow.apache.org/)などのツールを利用して変換を定期的にスケジュールします。 [ClickHouseのdbt統合](/ja/integrations/dbt)は、ターゲットテーブルの新しいバージョンが作成され、その後原子に関連するバージョンと交換されることを保証します([EXCHANGE](/ja/sql-reference/statements/exchange)コマンドを介して)。 +- **[Refreshable Materialized Views(エクスペリメンタル)](/ja/materialized-view/refreshable-materialized-view)** - 更新可能なマテリアライズドビューは、クエリの結果がターゲットテーブルに送られるように定期的にスケジュールするために使用されます。クエリが実行されると、ビューはターゲットテーブルが原子に更新されることを保証します。これは、ClickHouseネイティブな方法でこの作業をスケジュールするものです。 + +### ストリーミング + +ユーザーは、代わりにストリーミング技術、例えば[Apache Flink](https://flink.apache.org/)を使用して、ClickHouseの外部で挿入前にこれを実行することを希望するかもしれません。代わりに、インクリメンタルな[マテリアライズドビュー](/ja/guides/developer/cascading-materialized-views)を使用して、データが挿入されるとこのプロセスを実行することができます。 diff --git a/docs/ja/data-modeling/images/denormalization-diagram.png b/docs/ja/data-modeling/images/denormalization-diagram.png new file mode 100644 index 00000000000..54e4def8d3e Binary files /dev/null and b/docs/ja/data-modeling/images/denormalization-diagram.png differ diff --git a/docs/ja/data-modeling/images/denormalization-schema.png b/docs/ja/data-modeling/images/denormalization-schema.png new file mode 100644 index 00000000000..6a1ea8703a2 Binary files /dev/null and b/docs/ja/data-modeling/images/denormalization-schema.png differ diff --git a/docs/ja/data-modeling/images/schema-design-indices.png b/docs/ja/data-modeling/images/schema-design-indices.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/data-modeling/images/schema-design-indices.png differ diff --git a/docs/ja/data-modeling/images/schema-design-types.png b/docs/ja/data-modeling/images/schema-design-types.png new file mode 100644 index 00000000000..94b3782b29d Binary files /dev/null and b/docs/ja/data-modeling/images/schema-design-types.png differ diff --git a/docs/ja/data-modeling/images/stackoverflow-schema.png b/docs/ja/data-modeling/images/stackoverflow-schema.png new file mode 100644 index 00000000000..749a2dc0c36 Binary files /dev/null and b/docs/ja/data-modeling/images/stackoverflow-schema.png differ diff --git a/docs/ja/data-modeling/schema-design.md b/docs/ja/data-modeling/schema-design.md new file mode 100644 index 00000000000..360fd0d740a --- /dev/null +++ b/docs/ja/data-modeling/schema-design.md @@ -0,0 +1,334 @@ +--- +slug: /ja/data-modeling/schema-design +title: スキーマ設計 +description: ClickHouse スキーマのクエリパフォーマンス最適化 +keywords: [スキーマ, スキーマ設計, クエリ最適化] +--- + +効果的なスキーマ設計を理解することは、ClickHouse のパフォーマンスを最適化する鍵であり、これは多くの場合トレードオフを伴う選択肢を含みます。最適なアプローチは提供されるクエリやデータの更新頻度、レイテンシ要件、データ量などの要因に依存します。このガイドでは、ClickHouse のパフォーマンスを最適化するためのスキーマ設計のベストプラクティスとデータモデリング技法の概要を提供します。 + +## Stack Overflow データセット + +このガイドの例では、Stack Overflow データセットのサブセットを使用します。これは、2008年から2024年4月まで、Stack Overflow で発生したすべての投稿、投票、ユーザー、コメント、バッジを含んでいます。このデータは、以下のスキーマを使用して Parquet フォーマットで S3 バケット `s3://datasets-documentation/stackoverflow/parquet/` にて公開されています: + +> 指定された主キーとリレーションシップは制約を通じて強制されているものではなく (Parquet はファイルフォーマットでありテーブルフォーマットではないため)、データがどのように関係しており、どのようなユニークキーを持つかを単に示しています。 + +Stack Overflow スキーマ + +
+ +Stack Overflow データセットには、いくつかの関連テーブルが含まれています。いかなるデータモデリングタスクにおいても、ユーザーはまず主テーブルのロードに集中することをお勧めします。それは必ずしも最大のテーブルである必要はありませんが、むしろあなたが最も分析クエリを受け取ると予想しているテーブルです。これにより、特に OLTP 背景から移行する場合、ClickHouse の主な概念と型に慣れることができます。このテーブルは、ClickHouse の機能を完全に活用し最適なパフォーマンスを得るために、追加のテーブルが追加されるにつれて再モデリングが必要になるかもしれません。 + +上記のスキーマは、このガイドの目的のために意図的に最適化されていません。 + +## 初期スキーマの確立 + +`posts` テーブルはほとんどの分析クエリのターゲットとなるため、このテーブルのスキーマを確立することに焦点を当てます。このデータは S3 のパブリックバケット `s3://datasets-documentation/stackoverflow/parquet/posts/*.parquet` にて年毎のファイルで提供されています。 + +> Parquet フォーマットでの S3 からデータをロードすることは、最も一般的で好ましい ClickHouse にデータをロードする方法です。ClickHouse は Parquet の処理に最適化されており、S3 から毎秒何千万もの行を読み込み、挿入することも可能です。 + +ClickHouse は、データセットの型を自動的に識別するスキーマ推論機能を提供しています。これは、Parquet を含むすべてのデータフォーマットでサポートされています。この機能を活用して、s3 テーブル関数および[`DESCRIBE`](/ja/sql-reference/statements/describe-table) コマンドを通じて ClickHouse の型を識別できます。以下では、パターン `*.parquet` を使用して `stackoverflow/parquet/posts` フォルダ内のすべてのファイルを読み取っています。 + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') +SETTINGS describe_compact_output = 1 + +┌─name──────────────────┬─type───────────────────────────┐ +│ Id │ Nullable(Int64) │ +│ PostTypeId │ Nullable(Int64) │ +│ AcceptedAnswerId │ Nullable(Int64) │ +│ CreationDate │ Nullable(DateTime64(3, 'UTC')) │ +│ Score │ Nullable(Int64) │ +│ ViewCount │ Nullable(Int64) │ +│ Body │ Nullable(String) │ +│ OwnerUserId │ Nullable(Int64) │ +│ OwnerDisplayName │ Nullable(String) │ +│ LastEditorUserId │ Nullable(Int64) │ +│ LastEditorDisplayName │ Nullable(String) │ +│ LastEditDate │ Nullable(DateTime64(3, 'UTC')) │ +│ LastActivityDate │ Nullable(DateTime64(3, 'UTC')) │ +│ Title │ Nullable(String) │ +│ Tags │ Nullable(String) │ +│ AnswerCount │ Nullable(Int64) │ +│ CommentCount │ Nullable(Int64) │ +│ FavoriteCount │ Nullable(Int64) │ +│ ContentLicense │ Nullable(String) │ +│ ParentId │ Nullable(String) │ +│ CommunityOwnedDate │ Nullable(DateTime64(3, 'UTC')) │ +│ ClosedDate │ Nullable(DateTime64(3, 'UTC')) │ +└───────────────────────┴────────────────────────────────┘ +``` + +> [s3 テーブル関数](/ja/sql-reference/table-functions/s3)は、ClickHouse から S3 内のデータをそのままクエリすることを可能にします。この関数は、ClickHouse がサポートするすべてのファイルフォーマットと互換性があります。 + +これにより、最初の非最適化スキーマが提供されます。デフォルトでは、ClickHouse はこれらを同等の Nullable 型にマッピングします。この型を使用して、簡単な `CREATE EMPTY AS SELECT` コマンドで ClickHouse テーブルを作成できます。 + +```sql +CREATE TABLE posts +ENGINE = MergeTree +ORDER BY () EMPTY AS +SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') +``` + +いくつかの重要な点: + +このコマンドを実行した後、私たちの posts テーブルは空です。データはロードされていません。 +MergeTree をテーブルエンジンとして指定しています。MergeTree はおそらくあなたが最も使用する ClickHouse テーブルエンジンです。これは、鉅大なデータの処理が可能な ClickHouse ボックス内の万能ツールであり、ほとんどの分析ユースケースに対応します。他のテーブルエンジンは、効率的な更新をサポートする必要がある CDC などのユースケースに存在します。 + +句 `ORDER BY ()` はインデックスがなく、より具体的にはデータに順序がないことを意味します。これについては後ほど詳細に説明しますが、今はすべてのクエリが線形スキャンを必要とすることを知っておいてください。 + +テーブルが作成されたことを確認するには: + +```sql +SHOW CREATE TABLE posts + +CREATE TABLE posts +( + `Id` Nullable(Int64), + `PostTypeId` Nullable(Int64), + `AcceptedAnswerId` Nullable(Int64), + `CreationDate` Nullable(DateTime64(3, 'UTC')), + `Score` Nullable(Int64), + `ViewCount` Nullable(Int64), + `Body` Nullable(String), + `OwnerUserId` Nullable(Int64), + `OwnerDisplayName` Nullable(String), + `LastEditorUserId` Nullable(Int64), + `LastEditorDisplayName` Nullable(String), + `LastEditDate` Nullable(DateTime64(3, 'UTC')), + `LastActivityDate` Nullable(DateTime64(3, 'UTC')), + `Title` Nullable(String), + `Tags` Nullable(String), + `AnswerCount` Nullable(Int64), + `CommentCount` Nullable(Int64), + `FavoriteCount` Nullable(Int64), + `ContentLicense` Nullable(String), + `ParentId` Nullable(String), + `CommunityOwnedDate` Nullable(DateTime64(3, 'UTC')), + `ClosedDate` Nullable(DateTime64(3, 'UTC')) +) +ENGINE = MergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') +ORDER BY tuple() +``` + +初期スキーマが定義されたら、s3 テーブル関数を使用してデータを読み取り、`INSERT INTO SELECT` を使用してデータを投入することができます。以下の例では、8コアの ClickHouse Cloud インスタンスで約2分で `posts` データをロードします。 + +```sql +INSERT INTO posts SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 148.140 sec. Processed 59.82 million rows, 38.07 GB (403.80 thousand rows/s., 257.00 MB/s.) +``` + +> 上記のクエリは 60m 行をロードします。ClickHouse にとって小規模のデータですが、インターネット接続が遅いユーザーはデータのサブセットをロードしたい場合があるでしょう。これはパターン e.g. `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2008.parquet` または `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/{2008, 2009}.parquet` を指定することで実現できます。パターンを使ってターゲットファイルのサブセットを指定する方法については[こちら](/ja/sql-reference/table-functions/file#globs-in-path)を参照してください。 + +## 型の最適化 + +ClickHouse クエリパフォーマンスの秘密のひとつは圧縮です。 + +ディスク上のデータが少ないほど、I/O が減り、クエリや挿入が高速になります。CPU に関しては、いかなる圧縮アルゴリズムのオーバーヘッドも I/O の削減によってほとんどの場合上回るでしょう。そのため、ClickHouse クエリが速いことを保証する際には、最初にデータの圧縮を向上することを第一の課題にすべきです。 + +> ClickHouse がデータを非常に効率よく圧縮する理由については、[こちらの記事](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) をお勧めします。要約すると、列指向データベースであるため、値はカラム順に書き込まれます。これらの値が並べ替えられると、同一の値が隣接して書き込まれ、圧縮アルゴリズムは連続したデータパターンを利用します。これに加えて、ClickHouse にはコーデックや精密なデータ型があり、ユーザーが圧縮技術をさらに調整することが可能です。 + +ClickHouse での圧縮は、3つの主要な要因によって影響を受けます:オーダリングキー、データ型、および使用するコーデック。これらはすべてスキーマを通じて設定されます。 + +最初の大きな圧縮とクエリパフォーマンスの改善は、単純な型最適化のプロセスを通じて得られます。いくつかの簡単なルールを適用することでスキーマを最適化できます: + +- **厳密な型を使用する** - 我々の初期スキーマは多くのカラムで文字列型を使用していますが、これらは明らかに数値です。そのため、適切な型を使用することで、フィルタリングや集計時に期待される意味論を確保できます。同じことが、Parquet ファイルで正しく提供されている日付型にも当てはまります。 +- **Nullable カラムの回避** - 上記のカラムはデフォルトで Null と仮定されています。Nullable 型はクエリが空値と Null 値を区別することを可能にしますが、これにより UInt8 型の別のカラムが作成されます。この追加のカラムは、ユーザーが Nullable カラムを操作するたびに処理される必要があり、追加のストレージが使用され、ほぼ常にクエリパフォーマンスに悪影響を与えます。型のデフォルトの空の値と Null との違いがある場合に限り、Nullable を使用してください。例えば、`ViewCount` カラムの空の値に対して 0 を扱うことは、ほとんどのクエリで問題なく影響を与えない可能性があります。空の値が異なる扱いを必要とする場合、フィルタリングでしばしばクエリから除外することができます。 +- **数値型の最小精度を使用する** - ClickHouse には、異なる数値範囲と精度に合わせた数多くの数値型があります。常にカラムを表すのに使用されるビット数を最小化することを心がけてください。例えば、より小さなビット数の整数など e.g. Int16 に加え、負でないバリアントをサポートし、最小値が 0 の無符号型が存在します。これにより、カラムに使用するビット数を減らすことができます。可能であれば、これらの型を大きな無符号バリアントより優先させるべきです。 +- **日付型の最小精度** - ClickHouse は、いくつかの日付および日時型をサポートしています。Date と Date32 は純粋な日付の保存に使用でき、後者はより大きな日付範囲をサポートしますが、より多くのビットを使用します。DateTime および DateTime64 は日時のサポートを提供します。DateTime は秒単位の精度に制限されており、32 ビットを使用します。DateTime64 はその名の通り 64 ビットを使用しますがナノ秒単位までの精度を提供します。常にクエリに必要な最も粗いバージョンを選び、必要なビット数を最小化してください。 +- **LowCardinality の使用** - 低数のユニーク値を持つ数値、文字列、DateまたはDateTimeカラムは、LowCardinality 型を使用してエンコードできる可能性があります。これは値をディクショナリエンコードしてディスク上のサイズを減少させます。1万未満のユニーク値を持つカラムに対してこれを考慮してください。 +固定長文字列を特別なケースで使用 - 固定長の文字列は FixedString 型でエンコードすることができます、例えば言語や通貨コード。この種のエンコーディングはデータが正確に N バイトの長さを持つ時に効率的です。その他の場合においては、効率を低下させる可能性があり、LowCardinality が推奨されます。 +- **データ検証に対する列挙型の利用** - Enum 型は列挙型を効率的にエンコードするために使用することができます。Enum はユニークな値を格納する必要に応じて 8 ビットまたは 16 ビットになり得ます。この型の利用を検討する際には、登録されていない値を挿入時に拒否する関連検証を必要とする場合や列挙された値に自然な順序があり、クエリのパフォーマンスを向上させる場合などを考慮してください。例として、ユーザーのフィードバックカラムが `Enum(':(' = 1, ':|' = 2, ':)' = 3)` を含む場合が挙げられます。 + +> ヒント: すべてのカラムの範囲およびユニーク値の数を見つけるには、ユーザーは簡単なクエリ `SELECT * APPLY min, * APPLY max, * APPLY uniq FROM table FORMAT Vertical` を使用できます。これはデータの小さなサブセットに対しての実行をお勧めします、というのもこのクエリは高負荷になる可能性があるためです。このクエリが数値を正確に特定するためには、少なくとも定義が必要です。これは文字列でないことを意味します。 + +これらの単純なルールを posts テーブルに適用することにより、各カラムの最適な型を特定することができます: + +Stack Overflow スキーマ + +
+ +上記を元に以下のスキーマが示されます: + +```sql +CREATE TABLE posts_v2 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense`LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT 'Optimized types' +``` + +これは前のテーブルから新しいテーブルへデータを読み込んで、この新しいテーブルに挿入することで埋めることができます: + +```sql +INSERT INTO posts_v2 SELECT * FROM posts + +0 rows in set. Elapsed: 146.471 sec. Processed 59.82 million rows, 83.82 GB (408.40 thousand rows/s., 572.25 MB/s.) +``` + +新しいスキーマでは、もはや null 値を保持しません。上記の挿入では、暗黙のうちにそれぞれの型に対するデフォルトの値に null 値を変換します - 整数の場合は 0、文字列の場合は空の値となります。ClickHouse はまた、あらゆる数値を目的の精度に自動的に変換します。 +ClickHouse における主キー (オーダリングキー) +OLTP データベースから来たユーザーは、ClickHouse にある同等の概念を探すことがよくあります。 + +## オーダリングキーの選択 + +ClickHouse が一般的に使用されるスケールでは、メモリとディスクの効率が非常に重要です。データは ClickHouse テーブルにチャンクとして書き込まれ、このチャンクはパートとして知られ、背景でパートを統合するためのルールが適用されます。ClickHouse では、各パートにはそれ自体の主インデックスがあります。複数のパートが統合されると、統合されたパートの主インデックスも統合されます。パートの主インデックスは、行のグループごとに1つのインデックスエントリを持っています - この技法はスペースインデクシングと呼ばれます。 + +ClickHouse におけるスペースインデクシング + +
+ +ClickHouse で選択されたキーは、インデックスだけでなく、ディスク上にデータが書き込まれる順序を決定します。このため、これはクエリパフォーマンスに影響を与える圧縮レベルに大きな影響を及ぼす可能性があります。ほとんどのカラムの値が連続した順序で書き込まれる注文キーは、選択された圧縮アルゴリズム (およびコーデック) がデータをより効果的に圧縮できるようにします。 + +> テーブル内のすべてのカラムは、オーダリングキーとして指定されたカラムの値に基づいてソートされます。キ自体に含まれているかどうかは問わず、すべてがソートされます。例えば、`CreationDate` がキーとして使用される場合、その他すべてのカラムの値の順序は `CreationDate` カラムの値の順序に対応します。複数のオーダリングキーを指定することが可能です - これは `SELECT` クエリで `ORDER BY` 句を使用する際の同じセマンティクスでソートします。 + +オーダリングキーを選択する際に簡単なルールを適用できます。以下は時には衝突することがありますので、順番に検討してください。これにより、プロセスからいくつかのキーを特定することができ、通常4-5つで十分です: + +- 一般的なフィルタと一致するカラムを選択してください。カラムが `WHERE` 句によく使用される場合、優先順位付けし、使用頻度が少ないものよりもこれをキーに含めてください。 +- フィルタリング時に全体の行の大部分を除外するのに役立つカラムを好んで選択してください、これは読み取る必要のあるデータ量を減少させます。 +- テーブル内の他のカラムと非常に相関するカラムを好んで選択してください。これにより、これらの値が連続して保存されることを保証し、圧縮を改善します。 +`GROUP BY` 及び `ORDER BY` 演算はキー内のカラムに対して行うことでよりメモリ効率を高めることができます。 + +オーダリングキーのサブセットを特定する際には、カラムを特定の順序で宣言してください。この順序はクエリの副次キーにおけるフィルタリングの効率性とテーブルのデータファイルの圧縮比率の両方にかなり影響を与えることがあります。一般的には、カーディナリティの昇順でキーを順序づけるのが最適です。これは、キー内の要素の順序がフィルタリングが効率的であることをバランス良く求めることになります。これらの動作をバランスよく取り入れて、アクセスパターンを考慮し(そしてもっと重要なことに異なる要因をテストしましょう)。 + +### 例 + +上記のガイドラインを `posts` テーブルに適用すると、例えば、利用者が日付および投稿タイプでフィルタリングして分析を行いたいと仮定します: + +「直近3ヶ月で最もコメントされた質問はどれですか」。 + +この質問のクエリは、オーダリングキーを持たない `posts_v2` テーブルで型を最適化したものを使用すると次のようになります: + +``` +SELECT + Id, + Title, + CommentCount +FROM posts_v2 +WHERE (CreationDate >= '2024-01-01') AND (PostTypeId = 'Question') +ORDER BY CommentCount DESC +LIMIT 3 + +┌───────Id─┬─Title─────────────────────────────────────────────────────────────┬─CommentCount─┐ +│ 78203063 │ How to avoid default initialization of objects in std::vector? │ 74 │ +│ 78183948 │ About memory barrier │ 52 │ +│ 77900279 │ Speed Test for Buffer Alignment: IBM's PowerPC results vs. my CPU │ 49 │ +└──────────┴───────────────────────────────────────────────────────────────────┴────────────── + +10 rows in set. Elapsed: 0.070 sec. Processed 59.82 million rows, 569.21 MB (852.55 million rows/s., 8.11 GB/s.) +Peak memory usage: 429.38 MiB. +``` + +> ここではクエリがとても高速です、すべての 60m 行が線形スキャンされているにもかかわらず - ClickHouse はただ速いので :) オーダリングキーが TB や PB スケールで価値があると信じてください! + +`PostTypeId` と `CreationDate` をオーダリングキーとして選択しましょう。 + +おそらく私たちの場合、ユーザーは常に `PostTypeId` でフィルタリングすると予想されます。これはカーディナリティが 8 であり、オーダリングキーの最初のエントリとして論理的な選択肢です。日付の粒度のフィルタリングが十分であると認識されるので (それは依然として datetime フィルターの利益を得ます) `toDate(CreationDate)` をキーの2番目の要素として使用します。これにより小さなインデックスも生成され、日付は16で表されることができ、フィルタリングを高速化します。我々の最終キーエントリは `CommentCount` で、最も多くコメントされた投稿を見つけるのを手助けします (最終ソート)。 + +```sql +CREATE TABLE posts_v3 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +COMMENT 'オーダリングキー' + +--既存のテーブルからテーブルを埋める + +INSERT INTO posts_v3 SELECT * FROM posts_v2 + +0 rows in set. Elapsed: 158.074 sec. Processed 59.82 million rows, 76.21 GB (378.42 thousand rows/s., 482.14 MB/s.) +Peak memory usage: 6.41 GiB. + + +以前のクエリに比べ、クエリ応答時間が3倍以上改善されます: + +SELECT + Id, + Title, + CommentCount +FROM posts_v3 +WHERE (CreationDate >= '2024-01-01') AND (PostTypeId = 'Question') +ORDER BY CommentCount DESC +LIMIT 3 + +10 rows in set. Elapsed: 0.020 sec. Processed 290.09 thousand rows, 21.03 MB (14.65 million rows/s., 1.06 GB/s.) +``` + +特定の型と適切なオーダリングキーを使用することによって達成される圧縮の改善に関心を持つユーザーは、[ClickHouse における圧縮](/ja/data-compression/compression-in-clickhouse) を参照してください。ユーザーが圧縮をさらに改善する必要がある場合、[適切なカラム圧縮コーデックの選択](/ja/data-compression/compression-in-clickhouse#choosing-the-right-column-compression-codec)セクションをお勧めします。 + +## 次へ: データモデリング技法 + +ここまで、私たちは単一のテーブルのみを移行しました。これにより ClickHouse の基本的な概念を紹介することができましたが、残念ながら大半のスキーマはこれほど単純ではありません。 + +以下の一覧の他のガイドでは、最適な ClickHouse クエリのためにスキーマ全体を再構築するためのいくつかの技術を探求します。このプロセスを通じて、`Posts` をほとんどの分析クエリが実行される中心的なテーブルとして維持することを目指します。他のテーブルも独自にクエリすることが可能ですが、我々はほとんどの分析が `posts` を文脈としたものとして実行されることを想定しています。 + +> このセクションを通じて、他のテーブルの最適化されたバリアントを使用します。これらのスキーマは提供しますが、簡潔にするために行われた決定は省略します。これらは前述のルールに基づき、読者に決定を推測することを任せています。 + +次のアプローチはいずれも、読み取りとクエリパフォーマンスを最適化するために JOIN を使用する必要性を最小限に抑えることを目的としています。ClickHouse では JOIN が完全にサポートされていますが、最適なパフォーマンスを達成するためには、JOIN の使用を控えめにすることをお勧めします(JOIN クエリ内で2〜3テーブルにするのが理想です)。 + +> ClickHouse には外部キーの概念がありません。これは結合を禁止するものではありませんが、参照整合性はユーザーがアプリケーションレベルで管理する必要があることを意味します。ClickHouse のような OLAP システムでは、データの整合性は通常、データベース自体ではなくアプリケーションレベルやデータ取り込みプロセスで管理されます。これにより柔軟性が向上し、高速のデータ挿入が可能になります。このアプローチにより、非常に大きなデータセットでの読み取りと挿入クエリの速度とスケーラビリティに重点を置く ClickHouse の利点が最大化されます。 + +ユーザーがクエリ時に JOIN の使用を最小限に抑えるために、以下のツール/アプローチがあります: + +- [**データの非正規化**](/ja/data-modeling/denormalization) - テーブルを組み合わせ、非1:1リレーションシップのために複合型を使用して、データを非正規化します。これには多くの場合、クエリ時間から挿入時間への結合の移動が含まれます。 +- [**ディクショナリ**](/ja/dictionary) - 直接結合およびキー値ルックアップを扱うための ClickHouse 固有の機能。 +- [**インクリメンタルマテリアライズドビュー**](/ja/materialized-view) - 計算のコストをクエリ時間から挿入時間にシフトするための ClickHouse の機能。集計値をインクリメンタルに計算する能力を含みます。 +- [**リフレッシャブルマテリアライズドビュー**](/ja/materialized-view/refreshable-materialized-view) - 他のデータベース製品で使用されるマテリアライズドビューと似ており、クエリの結果を定期的に計算し、結果をキャッシュすることが可能です。 + +これらのアプローチを各ガイドで探求し、Stack Overflow データセットの質問を解決するためにこれを適用する方法を例示する際にどれが適切かを強調します。 diff --git a/docs/ja/deployment-guides/horizontal-scaling.md b/docs/ja/deployment-guides/horizontal-scaling.md new file mode 100644 index 00000000000..f618f5b0be4 --- /dev/null +++ b/docs/ja/deployment-guides/horizontal-scaling.md @@ -0,0 +1,468 @@ +--- +slug: /ja/architecture/horizontal-scaling +sidebar_label: 水平拡張 +sidebar_position: 10 +title: 水平拡張 +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; +import ConfigFileNote from '@site/docs/ja/_snippets/_config-files.md'; + +## 概要 +この例のアーキテクチャは、スケーラビリティを提供するように設計されています。こちらには3つのノードが含まれています:2つのClickHouseとコーディネーション(ClickHouse Keeper)サーバーが組み合わさったもの、およびこのクォーラムを完成させるためのClickHouse Keeperのみを持つ3番目のサーバーです。この例を使用して、データベース、テーブル、および2つのノードの両方でデータをクエリできる分散テーブルを作成します。 + +## レベル: 基本 + + + +## 環境 +### アーキテクチャ図 +![2シャードと1レプリカのアーキテクチャ図](@site/docs/ja/deployment-guides/images/scaling-out-1.png) + +|ノード|説明| +|----|-----------| +|chnode1|データ + ClickHouse Keeper| +|chnode2|データ + ClickHouse Keeper| +|chnode3|ClickHouse Keeperクォーラムに使用| + +:::note +本番環境では、ClickHouse Keeperを専用ホストで実行することを強くお勧めします。この基本構成では、ClickHouse Serverプロセス内でKeeper機能を実行しています。ClickHouse Keeperをスタンドアロンでデプロイする手順は、[インストールドキュメント](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper)で確認できます。 +::: + +## インストール + +3つのサーバーにClickhouseをインストールし、[アーカイブタイプごとの手順](/docs/ja/getting-started/install.md/#available-installation-options) (.deb, .rpm, .tar.gzなど) に従ってください。この例では、3台のマシンすべてにClickHouse ServerとClientのインストール手順に従います。 + +## 設定ファイルの編集 + + + +## chnode1の設定 + +chnode1には、5つの設定ファイルがあります。これらのファイルを1つのファイルにまとめることもできますが、ドキュメント内で個別に見る方が明確かもしれません。設定ファイルを読み進めると、chnode1とchnode2のほとんどの設定が同じであることがわかります。一部の違いは強調されます。 + +### ネットワークとログ設定 + +これらの値は、お好みでカスタマイズできます。この例の設定は、1000Mで3回ロールオーバーするデバッグログを提供します。ClickHouseはIPv4ネットワークでポート8123と9000でリッスンし、インターサーバー通信にポート9009を使用します。 + +```xml title="network-and-logging.xml on chnode1" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +ClickHouse Keeperは、データレプリケーションと分散DDLクエリの実行のためのコーディネーションシステムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定では、ポート9181でClickHouse Keeperを有効にします。強調表示されている行は、Keeperのインスタンスに`server_id`を1としていることを示しています。この`enable-keeper.xml`ファイルの違いは3つのサーバーすべてでこれだけです。`chnode2`では`server_id`は`2`に設定され、`chnode3`では`server_id`は`3`に設定されます。raft構成セクションは3つのサーバーすべてで同じであり、下記に強調されて、`server_id`とraft構成内の`server`インスタンスの関係を示します。 + +:::note +何らかの理由でKeeperノードが交換または再構築された場合、既存の`server_id`を再利用しないでください。例えば、`server_id`が`2`であるKeeperノードが再構築された場合は、`server_id`を`4`以上にしてください。 +::: + +```xml title="enable-keeper.xml on chnode1" + + + 9181 + # highlight-next-line + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + # highlight-start + + 1 + chnode1 + 9234 + + # highlight-end + + 2 + chnode2 + 9234 + + + 3 + chnode3 + 9234 + + + + +``` + +### マクロ設定 + +マクロ`shard`と`replica`により、分散DDLの複雑さが軽減されます。設定された値はDDLクエリ内で自動的に置き換えられるため、DDLを簡素化できます。この設定のマクロは、各ノードのシャードとレプリカ番号を指定します。この2シャード1レプリカの例では、レプリカマクロはchnode1とchnode2の両方で`replica_1`に設定されています。シャードマクロはchnode1では`1`、chnode2では`2`です。 + +```xml title="macros.xml on chnode1" + + + # highlight-next-line + 1 + replica_1 + + +``` + +### レプリケーションとシャーディング設定 + +以下の設定の大まかな概要です: +- XMLの`remote_servers`セクションは、環境内の各クラスターを指定します。属性`replace=true`は、デフォルトのClickHouse設定のサンプル`remote_servers`をこのファイルで指定された`remote_servers`設定で置き換えます。この属性がない場合、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 +- この例では、1つのクラスターが`cluster_2S_1R`という名前で存在します。 +- クラスター`cluster_2S_1R`のためのシークレットが`mysecretphrase`という値で作成されます。環境内のすべてのリモートサーバー間でシークレットが共有され、正しいサーバーが一緒に結合されることを保証します。 +- クラスター`cluster_2S_1R`には2つのシャードがあり、それぞれのシャードに1つのレプリカがあります。文書の冒頭近くのアーキテクチャ図を見て、以下のXMLの2つの`shard`定義と比較してください。各シャード定義には1つのレプリカがあります。レプリカは特定のシャード用です。レプリカのホストとポートが指定されています。最初のシャードの設定のレプリカは`chnode1`に保存され、2番目のシャードの設定のレプリカは`chnode2`に保存されます。 +- シャードの内部レプリケーションはtrueに設定されています。各シャードは設定ファイルで`internal_replication`パラメーターを定義することができ、このパラメーターがtrueに設定されている場合、書き込み操作は最初の正常なレプリカを選択し、データを書き込みます。 + +```xml title="remote-servers.xml on chnode1" + + + + mysecretphrase + + true + + chnode1 + 9000 + + + + true + + chnode2 + 9000 + + + + + +``` + +### Keeperの使用設定 + +上でClickHouse Keeperが設定されました。この設定ファイル`use-keeper.xml`は、レプリケーションと分散DDLのコーディネーションのためにClickHouse ServerがClickHouse Keeperを使用する設定を行っています。このファイルは、ClickHouse Serverがポート9181でchnode1から3のKeeperを使用するように指定しており、ファイルは`chnode1`と`chnode2`で同じです。 + +```xml title="use-keeper.xml on chnode1" + + + + chnode1 + 9181 + + + chnode2 + 9181 + + + chnode3 + 9181 + + + +``` + +## chnode2の設定 + +chnode1とchnode2の設定は非常に似ているため、ここでは違いのみを指摘します。 + +### ネットワークとログ設定 + +```xml title="network-and-logging.xml on chnode2" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +このファイルにはchnode1とchnode2の違いの一つが含まれています。Keeperの設定で`server_id`が`2`に設定されています。 + +```xml title="enable-keeper.xml on chnode2" + + + 9181 + # highlight-next-line + 2 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + chnode1 + 9234 + + # highlight-start + + 2 + chnode2 + 9234 + + # highlight-end + + 3 + chnode3 + 9234 + + + + +``` + +### マクロ設定 + +マクロ設定にはchnode1とchnode2の違いの一つがあります。`shard`はこのノードでは`2`に設定されています。 + +```xml title="macros.xml on chnode2" + + + # highlight-next-line + 2 + replica_1 + + +``` + +### レプリケーションとシャーディング設定 + +```xml title="remote-servers.xml on chnode2" + + + + mysecretphrase + + true + + chnode1 + 9000 + + + + true + + chnode2 + 9000 + + + + + +``` + +### Keeperの使用設定 + +```xml title="use-keeper.xml on chnode2" + + + + chnode1 + 9181 + + + chnode2 + 9181 + + + chnode3 + 9181 + + + +``` + +## chnode3の設定 + +chnode3はデータを保存せず、ClickHouse Keeperがクォーラムの3番目のノードを提供するために使用されているため、chnode3には、ネットワークとログを設定するファイルとClickHouse Keeperを設定するファイルの2つの設定ファイルのみがあります。 + +### ネットワークとログ設定 + +```xml title="network-and-logging.xml on chnode3" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +```xml title="enable-keeper.xml on chnode3" + + + 9181 + # highlight-next-line + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + chnode1 + 9234 + + + 2 + chnode2 + 9234 + + # highlight-start + + 3 + chnode3 + 9234 + + # highlight-end + + + +``` + +## テスト + +1. `chnode1`に接続し、上で設定されたクラスター`cluster_2S_1R`が存在することを確認します。 +```sql +SHOW CLUSTERS +``` +```response +┌─cluster───────┐ +│ cluster_2S_1R │ +└───────────────┘ +``` + +2. クラスター上にデータベースを作成します。 +```sql +CREATE DATABASE db1 ON CLUSTER cluster_2S_1R +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +3. クラスター上にMergeTreeテーブルエンジンを使用したテーブルを作成します。 +:::note +テーブルエンジンのパラメーターを指定する必要はありません。これらはマクロに基づいて自動的に定義されます。 +::: + +```sql +CREATE TABLE db1.table1 ON CLUSTER cluster_2S_1R +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode1 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode2 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +4. `chnode1`に接続して1行を挿入します。 +```sql +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +5. `chnode2`に接続して1行を挿入します。 + +```sql +INSERT INTO db1.table1 (id, column1) VALUES (2, 'def'); +``` + +6. `chnode1`または`chnode2`のどちらかに接続し、そのノードのテーブルに挿入された行のみが表示されることを確認します。 +例えば、`chnode2`で +```sql +SELECT * FROM db1.table1; +``` +```response +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +``` + +7. 両方のノードで両方のシャードをクエリする分散テーブルを作成します。 +(この例では、`rand()`関数をシャーディングキーとして設定し、各挿入をランダムに分散させます) +```sql +CREATE TABLE db1.table1_dist ON CLUSTER cluster_2S_1R +( + `id` UInt64, + `column1` String +) +ENGINE = Distributed('cluster_2S_1R', 'db1', 'table1', rand()) +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +8. `chnode1`または`chnode2`に接続し、両方の行を確認するために分散テーブルをクエリします。 +``` +SELECT * FROM db1.table1_dist; +``` +```reponse +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +``` + +## さらに詳しい情報: + +- [分散テーブルエンジン](/docs/ja/engines/table-engines/special/distributed.md) +- [ClickHouse Keeper](/docs/ja/guides/sre/keeper/index.md) diff --git a/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw new file mode 100644 index 00000000000..0e77b31365f --- /dev/null +++ b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw @@ -0,0 +1,1796 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 1113, + "versionNonce": 1012871836, + "isDeleted": false, + "id": "6bX_E24wLaoVkuQUL49rE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 902.74609375, + "y": 414.8828125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 361.0546875, + "seed": 1554965524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617310939, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1557, + "versionNonce": 1146325476, + "isDeleted": false, + "id": "YNTKiIr_dIR3MH3HkfcRz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.38671875, + "y": 856.23046875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 1654017836, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 367, + "versionNonce": 1127866140, + "isDeleted": false, + "id": "FvPf0x839jBfeRK1Oi7VH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 924.2421875, + "y": 420.765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 120.98332977294922, + "height": 25, + "seed": 892344108, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + } + ], + "updated": 1680617361728, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-01", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-01", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 683, + "versionNonce": 1514646684, + "isDeleted": false, + "id": "ZImh9dDrhSU9bFSj4RyVP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 798.19921875, + "y": 863.02734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.1999969482422, + "height": 25, + "seed": 1947896212, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1680617399915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-01", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-01", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1118, + "versionNonce": 1736358052, + "isDeleted": false, + "id": "KSZ6WPivPmlFfEae7MOmZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 930.76171875, + "y": 462.62890625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 283.26953125, + "seed": 115425684, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1680617289086, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 367, + "versionNonce": 254095524, + "isDeleted": false, + "id": "zJgfnGBoFA0_lAsCwa7ok", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 964.75, + "y": 476.84765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 146.78334045410156, + "height": 25, + "seed": 1140609452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617275111, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_1S_2R", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_1S_2R", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1264, + "versionNonce": 174543772, + "isDeleted": false, + "id": "GJLXUfVbLlM2wK6poU-QC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 948.9453125, + "y": 523.5546875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 205.06249999999994, + "seed": 1173090068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617272029, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 866, + "versionNonce": 1843075100, + "isDeleted": false, + "id": "ftuuNibnMRnfPHFUpjZwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 973.640625, + "y": 574.84375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 130.546875, + "seed": 1381841964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1680617236476, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 835, + "versionNonce": 110602204, + "isDeleted": false, + "id": "f0u6srndZkKL_EodskHfD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 805.7578125, + "y": 910.84765625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 162401964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 640, + "versionNonce": 152748068, + "isDeleted": false, + "id": "mY3bL5nc3pLNDLQ051PJm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 835.640625, + "y": 929.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 989889044, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1680616542430, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 836, + "versionNonce": 39439644, + "isDeleted": false, + "id": "vUZRMf0MD0fkmVVh5EFbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 998.5625, + "y": 637.43359375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 94517780, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "uzhB9dcVibDhLKTA43AqJ", + "type": "arrow" + } + ], + "updated": 1680617100682, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 610, + "versionNonce": 1849252380, + "isDeleted": false, + "id": "8Uy6RO4B05r0YaoY6xozj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1011.875, + "y": 647.30078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 56.41666793823242, + "height": 25, + "seed": 1212490028, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617142629, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 525, + "versionNonce": 867028636, + "isDeleted": false, + "id": "CRUfTbXb5AainVI-px46P", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 964.71484375, + "y": 527.5234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 143.8333282470703, + "height": 25, + "seed": 586798996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617241195, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 588, + "versionNonce": 11332900, + "isDeleted": false, + "id": "jHqW0NK5gsCGvLnYvHCx6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 992.9453125, + "y": 584.51953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.96666717529297, + "height": 25, + "seed": 65018796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617230665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1774, + "versionNonce": 343666332, + "isDeleted": false, + "id": "3TaKvrFaS02XpN5DtDPRI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1135.3515625, + "y": 243.8984375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 131.59375, + "height": 70.859375, + "seed": 4729388, + "groupIds": [ + "q2JYxHDMqBGnppLd-e_zx" + ], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617339653, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 401, + "versionNonce": 1953814820, + "isDeleted": false, + "id": "VL9EHZ6BBa0MzyG_Ul-8O", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1168.78515625, + "y": 263.09375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 51.25, + "height": 25, + "seed": 1746995884, + "groupIds": [ + "q2JYxHDMqBGnppLd-e_zx" + ], + "roundness": null, + "boundElements": [], + "updated": 1680617339653, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "client", + "lineHeight": 1.25 + }, + { + "type": "arrow", + "version": 875, + "versionNonce": 540882972, + "isDeleted": false, + "id": "jbZVPsflGswjF3TO0mtkh", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1155.583501385608, + "y": 318.25390625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 136.72767491982881, + "height": 96.68672591477593, + "seed": 679203860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617327380, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": -0.08180572844618887, + "gap": 3.49609375 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -136.72767491982881, + 96.68672591477593 + ] + ] + }, + { + "type": "rectangle", + "version": 1625, + "versionNonce": 255595612, + "isDeleted": false, + "id": "_NgRKPWWRBMhWmORFbqfG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1074.103515625, + "y": 853.1796875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 549292591, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + }, + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 726, + "versionNonce": 268977692, + "isDeleted": false, + "id": "Pw_o-YfuyZUoUg14Bk9B9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1103.5625, + "y": 875.25, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 199.01666259765625, + "height": 25, + "seed": 304529441, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617409398, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-02", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-02", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 985, + "versionNonce": 834101988, + "isDeleted": false, + "id": "LCD1WmlJ4y-REz1dTpJ9Q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1092.140625, + "y": 912.42578125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1815246127, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 713, + "versionNonce": 1328207388, + "isDeleted": false, + "id": "oVA_VcnjylIcDRkS4Umwt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1111.875, + "y": 934.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 1269328577, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "MJUWDY2EZev-CXvdwbrqg", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1680616542431, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1722, + "versionNonce": 974218852, + "isDeleted": false, + "id": "yu32XFDVxjsltOILQkLVA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1365.177734375, + "y": 855.53515625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 63815567, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 828, + "versionNonce": 126603164, + "isDeleted": false, + "id": "Vx1u3JBG4wFPZTH61H34k", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1394.63671875, + "y": 877.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 198.39999389648438, + "height": 25, + "seed": 949683425, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617418925, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-03", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-03", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1037, + "versionNonce": 1063188964, + "isDeleted": false, + "id": "TkyDDTKdzhCr1PFXHjU_H", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1383.89453125, + "y": 921.984375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1982657967, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 815, + "versionNonce": 1075950236, + "isDeleted": false, + "id": "ZBfU0ngueuYsWz6I8bCKK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1402.94921875, + "y": 937.25390625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 126468289, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1680616542431, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1170, + "versionNonce": 78335780, + "isDeleted": false, + "id": "jhjA6EMo6vpUCUZHQr_mX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.259765625, + "y": 415.166015625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 356.94921874999994, + "seed": 1369749569, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617306431, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 432, + "versionNonce": 1158418724, + "isDeleted": false, + "id": "qNOaN3pVAJBSsMo2IDl3A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1223.572265625, + "y": 418.486328125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129.8000030517578, + "height": 25, + "seed": 1875249185, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617368552, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-02", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-02", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1296, + "versionNonce": 2122700196, + "isDeleted": false, + "id": "rGWPbCPCIaA6wd0vf3cAm", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1236.419921875, + "y": 456.099609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 288.86328125000006, + "seed": 15883265, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617283881, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 476, + "versionNonce": 1412661796, + "isDeleted": false, + "id": "wRq1_meRS7lJ2EKHgKk2W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 6.281358663757188, + "x": 1267.544930397291, + "y": 468.6558154667901, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 146.78334045410156, + "height": 25, + "seed": 1965634529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617278612, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_1S_2R", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_1S_2R", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1216, + "versionNonce": 1943787940, + "isDeleted": false, + "id": "oluxJzMjFfYOyn5-B0dka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1256.251953125, + "y": 515.349609375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 210.81250000000006, + "seed": 276434881, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617267455, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1003, + "versionNonce": 2082700572, + "isDeleted": false, + "id": "Dz6jzUvxO4147RhI8WZFh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1278.189453125, + "y": 574.775390625, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 134.49218750000003, + "seed": 1761898401, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617219354, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 860, + "versionNonce": 150225052, + "isDeleted": false, + "id": "fQkUz2oj2eZkEPDYYWcRA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.408203125, + "y": 644.103515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1680320321, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + }, + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "uzhB9dcVibDhLKTA43AqJ", + "type": "arrow" + } + ], + "updated": 1680617100682, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 735, + "versionNonce": 11259044, + "isDeleted": false, + "id": "WbMJv-HlFhemifDr5ojCi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1317.958984375, + "y": 652.669921875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 56.41666793823242, + "height": 25, + "seed": 840111905, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617149028, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 562, + "versionNonce": 103297316, + "isDeleted": false, + "id": "T_zXJHMRuYqBH6Q5bzK86", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1266.513671875, + "y": 529.224609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 152.64999389648438, + "height": 25, + "seed": 885361409, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617259516, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica2", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica2", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 663, + "versionNonce": 150592668, + "isDeleted": false, + "id": "bLICR7aFNDfOBor8HGukz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1295.689453125, + "y": 594.177734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.96666717529297, + "height": 25, + "seed": 1153336033, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617224609, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 585, + "versionNonce": 2069895836, + "isDeleted": false, + "id": "6XFHR168qyQdZGSSAkdVQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.27734375, + "y": 834.29296875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 927.33984375, + "height": 226.73828125, + "seed": 1140814639, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1680616745288, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 422, + "versionNonce": 152229660, + "isDeleted": false, + "id": "vVIDbj6IOHJZPxahYvtay", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1029.014821415791, + "y": 772.0078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 48.793872493344224, + "height": 57.15797501558586, + "seed": 409206113, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617289086, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KSZ6WPivPmlFfEae7MOmZ", + "gap": 26.109375, + "focus": 0.6647589899269046 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 5.127181234414138, + "focus": -0.053496678221884524 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 48.793872493344224, + 57.15797501558586 + ] + ] + }, + { + "type": "arrow", + "version": 581, + "versionNonce": 477915612, + "isDeleted": false, + "id": "rkre42NcpDm8yTNezH5zh", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1012.7137950088186, + "y": 942.859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 76.44618790627374, + "height": 0.9470375155858619, + "seed": 1085866177, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": -0.04919159442148933, + "gap": 5.073170008818579 + }, + "endBinding": { + "elementId": "LCD1WmlJ4y-REz1dTpJ9Q", + "focus": -0.1910241746788114, + "gap": 2.980642084907686 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.44618790627374, + 0.9470375155858619 + ] + ] + }, + { + "type": "arrow", + "version": 816, + "versionNonce": 1195160036, + "isDeleted": false, + "id": "EN1jjvyD4pydVpNBYGCu1", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.8192637588186, + "y": 955.4648437500002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85.31943709372626, + "height": 2.150618734414138, + "seed": 362368975, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -85.31943709372626, + -2.150618734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1189, + "versionNonce": 1569377884, + "isDeleted": false, + "id": "3ggSRTy32SXrl5tfDxejC", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1476.4091075088186, + "y": 977.5000000000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 546.1514683437263, + "height": 47.83421248441391, + "seed": 1811691279, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -1.1502483311217826, + "gap": 15.246093750000227 + }, + "endBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.7278040192946851, + "gap": 10.16969376558609 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -295.1825450088186, + 35.40234374999977 + ], + [ + -546.1514683437263, + -12.431868734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1379, + "versionNonce": 806671716, + "isDeleted": false, + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 898.9989512588186, + "y": 966.4609375000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 599.6297816562737, + "height": 78.08984374999977, + "seed": 678064929, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.8457577505333682, + "gap": 11.562500000000227 + }, + "endBinding": { + "elementId": "TkyDDTKdzhCr1PFXHjU_H", + "focus": -0.6356670190591646, + "gap": 1.9079750155860893 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 289.9658924911814, + 78.08984374999977 + ], + [ + 599.6297816562737, + 11.939225015585862 + ] + ] + }, + { + "type": "arrow", + "version": 698, + "versionNonce": 676897500, + "isDeleted": false, + "id": "MJUWDY2EZev-CXvdwbrqg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.1825450088186, + "y": 944.21484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 86.67665665627374, + "height": 0.9900062655858619, + "seed": 449797199, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": -0.3219568458920805, + "gap": 15.307545008818579 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 86.67665665627374, + 0.9900062655858619 + ] + ] + }, + { + "type": "arrow", + "version": 873, + "versionNonce": 555518180, + "isDeleted": false, + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1387.1161387588186, + "y": 956.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87.63584334372626, + "height": 1.271256265585862, + "seed": 206368865, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -0.4014460800505109, + "gap": 15.833079991181421 + }, + "endBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": 0.8799195690060025, + "gap": 15.605295415092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -87.63584334372626, + 1.271256265585862 + ] + ] + }, + { + "type": "arrow", + "version": 994, + "versionNonce": 1246018852, + "isDeleted": false, + "id": "hYeY6OHHfBb0xSadzrIUO", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1297.1161387588186, + "y": 656.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 206.63584334372626, + "height": 0.2712562655858619, + "seed": 1937283236, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1680617086016, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": 0.43093221645966545, + "gap": 2.292064366181421 + }, + "endBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": -0.11295173263187792, + "gap": 3.984201665092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -206.63584334372626, + 0.2712562655858619 + ] + ] + }, + { + "type": "arrow", + "version": 1016, + "versionNonce": 1595197860, + "isDeleted": false, + "id": "uzhB9dcVibDhLKTA43AqJ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.397851454096, + "y": 673.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 206.63584334372626, + "height": 0.2712562655858619, + "seed": 879940508, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1680617123754, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": -0.334099379708353, + "gap": 4.292064366181421 + }, + "endBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": 0.6520798635361406, + "gap": 1.9842016650923142 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 206.63584334372626, + 0.2712562655858619 + ] + ] + }, + { + "type": "arrow", + "version": 278, + "versionNonce": 1497562140, + "isDeleted": false, + "id": "b44c5shkNkGvKfI3BvYTr", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1345.1127923846934, + "y": 774.953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 30.47958511315369, + "height": 58.33984375, + "seed": 1409554959, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617306430, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 2.837890625, + "focus": -0.4532829275804875 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 1, + "focus": 0.08784463162487417 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -30.47958511315369, + 58.33984375 + ] + ] + }, + { + "type": "arrow", + "version": 1033, + "versionNonce": 1150801052, + "isDeleted": false, + "id": "tOhL3LAMqpegl6h9MHUJR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1205.19351783071, + "y": 317.2890625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 154.68974224248336, + "height": 96.876953125, + "seed": 301771727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617327380, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "gap": 2.53125, + "focus": 0.46306101005588857 + }, + "endBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 1, + "focus": 0.7410412358955756 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 154.68974224248336, + 96.876953125 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png new file mode 100644 index 00000000000..a8d39ee2436 Binary files /dev/null and b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png differ diff --git a/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw b/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw new file mode 100644 index 00000000000..d99984f9da4 --- /dev/null +++ b/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw @@ -0,0 +1,3484 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 999, + "versionNonce": 1717040740, + "isDeleted": false, + "id": "doz_ZqNC1Q3flhyTKvtq5", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 603.00390625, + "y": 266.80859375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 507.79296875, + "seed": 202448172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1076, + "versionNonce": 1142165980, + "isDeleted": false, + "id": "6bX_E24wLaoVkuQUL49rE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 902.74609375, + "y": 267.8828125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 508.0546875, + "seed": 1554965524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1557, + "versionNonce": 1146325476, + "isDeleted": false, + "id": "YNTKiIr_dIR3MH3HkfcRz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.38671875, + "y": 856.23046875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 1654017836, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1708, + "versionNonce": 65893980, + "isDeleted": false, + "id": "3TaKvrFaS02XpN5DtDPRI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1112.3515625, + "y": 112.8984375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 131.59375, + "height": 70.859375, + "seed": 4729388, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "yo5OoqsCs2uygBiUbUHP4", + "type": "arrow" + }, + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + }, + { + "id": "s-HYeFkwN90Wnid3rJNWl", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 227, + "versionNonce": 1009142492, + "isDeleted": false, + "id": "-FTntIW0fZhWsbhRDx1VV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 623.5390625, + "y": 273.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 97, + "height": 25, + "seed": 1952607148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode1-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode1-dr" + }, + { + "type": "text", + "version": 298, + "versionNonce": 945643748, + "isDeleted": false, + "id": "FvPf0x839jBfeRK1Oi7VH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 923.2421875, + "y": 274.765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 106, + "height": 25, + "seed": 892344108, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode2-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode2-dr" + }, + { + "type": "text", + "version": 662, + "versionNonce": 256937820, + "isDeleted": false, + "id": "ZImh9dDrhSU9bFSj4RyVP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 798.19921875, + "y": 863.02734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87, + "height": 25, + "seed": 1947896212, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper1" + }, + { + "type": "rectangle", + "version": 1035, + "versionNonce": 927442020, + "isDeleted": false, + "id": "AatWa1WT64MRIbtUJHkYx", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 631.01953125, + "y": 329.22265625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 418.41796874999994, + "seed": 579706924, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1078, + "versionNonce": 2109621212, + "isDeleted": false, + "id": "KSZ6WPivPmlFfEae7MOmZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 930.76171875, + "y": 330.62890625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 415.26953125, + "seed": 115425684, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 253, + "versionNonce": 763455580, + "isDeleted": false, + "id": "2lqhMLfXV7dc8MZPEp48A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 646.92578125, + "y": 356.5625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 897234988, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "text", + "version": 334, + "versionNonce": 1944902500, + "isDeleted": false, + "id": "zJgfnGBoFA0_lAsCwa7ok", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 955.75, + "y": 356.84765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 1140609452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "rectangle", + "version": 1044, + "versionNonce": 1606383068, + "isDeleted": false, + "id": "fZfl-1njFTrlC29HslsoW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 650.9375, + "y": 389.72265625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 337.06640625, + "seed": 901892628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1229, + "versionNonce": 377513444, + "isDeleted": false, + "id": "GJLXUfVbLlM2wK6poU-QC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 948.9453125, + "y": 394.5546875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 334.06249999999994, + "seed": 1173090068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 761, + "versionNonce": 1153567076, + "isDeleted": false, + "id": "vVj99ZeKac_jZ9gKhUbVl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 670.64453125, + "y": 439.24609375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 265.8203125, + "seed": 1851706412, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 831, + "versionNonce": 1732816604, + "isDeleted": false, + "id": "ftuuNibnMRnfPHFUpjZwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 973.640625, + "y": 445.84375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 259.546875, + "seed": 1381841964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 835, + "versionNonce": 110602204, + "isDeleted": false, + "id": "f0u6srndZkKL_EodskHfD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 805.7578125, + "y": 910.84765625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 162401964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 639, + "versionNonce": 43005796, + "isDeleted": false, + "id": "mY3bL5nc3pLNDLQ051PJm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 835.640625, + "y": 929.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 989889044, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 742, + "versionNonce": 1010266076, + "isDeleted": false, + "id": "ZuIcO9LuMMsXU2q8TNX4t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 693.16796875, + "y": 629.05078125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1011039508, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "tkW1YXf04V5gI2gykZZWk", + "type": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow" + } + ], + "updated": 1673465857006, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 833, + "versionNonce": 299608804, + "isDeleted": false, + "id": "vUZRMf0MD0fkmVVh5EFbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 998.5625, + "y": 637.43359375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 94517780, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + }, + { + "id": "unoFZopHnWdvFsNWTavXu", + "type": "arrow" + }, + { + "id": "5RUswZgGGqCu9DU8-oSb4", + "type": "arrow" + }, + { + "id": "RvqXzcYlAYrBDtzpvQA7I", + "type": "arrow" + }, + { + "id": "boGY68T7ABd6-pM8vIoq1", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 545, + "versionNonce": 1414703844, + "isDeleted": false, + "id": "nuAmSlrm7esiXAbRY2ndR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 710.46484375, + "y": 643.0234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 1708723372, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + }, + { + "id": "1een57Hw-GyI1s8UmYJ8e", + "type": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow" + } + ], + "updated": 1673465854871, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 607, + "versionNonce": 1780388700, + "isDeleted": false, + "id": "8Uy6RO4B05r0YaoY6xozj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1011.875, + "y": 647.30078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 1212490028, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "1een57Hw-GyI1s8UmYJ8e", + "type": "arrow" + }, + { + "id": "049uSUUbRTCQs9PJO_e9o", + "type": "arrow" + } + ], + "updated": 1673465866531, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 432, + "versionNonce": 311973724, + "isDeleted": false, + "id": "TPjlSolDR9g-3HcygjMeq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 663.671875, + "y": 398.828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 145, + "height": 25, + "seed": 1652917932, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica1" + }, + { + "type": "text", + "version": 482, + "versionNonce": 1128291428, + "isDeleted": false, + "id": "CRUfTbXb5AainVI-px46P", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 962.71484375, + "y": 405.5234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 154, + "height": 25, + "seed": 586798996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica2" + }, + { + "type": "text", + "version": 563, + "versionNonce": 1933520868, + "isDeleted": false, + "id": "HGgdkIwc4LcjNtxr76kvh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.26171875, + "y": 452.109375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1746101396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 531, + "versionNonce": 1198993500, + "isDeleted": false, + "id": "jHqW0NK5gsCGvLnYvHCx6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 989.9453125, + "y": 460.51953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 65018796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 363, + "versionNonce": 648115932, + "isDeleted": false, + "id": "VL9EHZ6BBa0MzyG_Ul-8O", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1150.78515625, + "y": 135.09375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 52, + "height": 25, + "seed": 1746995884, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "client" + }, + { + "type": "arrow", + "version": 416, + "versionNonce": 662369508, + "isDeleted": false, + "id": "yo5OoqsCs2uygBiUbUHP4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1119.9719128948714, + "y": 186.63257168045592, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 385.68675664487137, + "height": 326.43774081954405, + "seed": 972317100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.12000836906439498, + "gap": 2.874759180455925 + }, + "endBinding": { + "elementId": "mfP2BtyKXz42duAKGG1wP", + "focus": -0.41223771360231753, + "gap": 3.87890625 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -385.68675664487137, + 326.43774081954405 + ] + ] + }, + { + "type": "arrow", + "version": 708, + "versionNonce": 1501969244, + "isDeleted": false, + "id": "jbZVPsflGswjF3TO0mtkh", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1161.033824898155, + "y": 187.25390625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 126.17799843237572, + "height": 330.68672591477593, + "seed": 679203860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.02851841252306824, + "gap": 3.49609375 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -126.17799843237572, + 330.68672591477593 + ] + ] + }, + { + "type": "arrow", + "version": 410, + "versionNonce": 361936996, + "isDeleted": false, + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 786.62109375, + "y": 641.2413335655827, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 210.3812421588275, + "height": 3.9088842671210386, + "seed": 769023380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZuIcO9LuMMsXU2q8TNX4t", + "focus": -0.47428717728252356, + "gap": 5.51953125 + }, + "endBinding": { + "elementId": "8Uy6RO4B05r0YaoY6xozj", + "focus": 1.0625631962676507, + "gap": 15.02734375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 210.3812421588275, + 3.9088842671210386 + ] + ] + }, + { + "type": "arrow", + "version": 457, + "versionNonce": 1281257436, + "isDeleted": false, + "id": "AxQowbCdMeLIF6o69yEgK", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.64453125, + "y": 668.4932436399571, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 213.38671875, + "height": 1.9319300322227946, + "seed": 1549785132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": -0.4139713939639972, + "gap": 4.91796875 + }, + "endBinding": { + "elementId": "nuAmSlrm7esiXAbRY2ndR", + "focus": 0.8358676393880391, + "gap": 12.79296875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -213.38671875, + -1.9319300322227946 + ] + ] + }, + { + "type": "rectangle", + "version": 1625, + "versionNonce": 255595612, + "isDeleted": false, + "id": "_NgRKPWWRBMhWmORFbqfG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1074.103515625, + "y": 853.1796875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 549292591, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + }, + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 705, + "versionNonce": 562229092, + "isDeleted": false, + "id": "Pw_o-YfuyZUoUg14Bk9B9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1103.5625, + "y": 875.25, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 96, + "height": 25, + "seed": 304529441, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper2" + }, + { + "type": "rectangle", + "version": 985, + "versionNonce": 834101988, + "isDeleted": false, + "id": "LCD1WmlJ4y-REz1dTpJ9Q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1092.140625, + "y": 912.42578125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1815246127, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 712, + "versionNonce": 1913630044, + "isDeleted": false, + "id": "oVA_VcnjylIcDRkS4Umwt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1111.875, + "y": 934.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 1269328577, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "MJUWDY2EZev-CXvdwbrqg", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 1722, + "versionNonce": 974218852, + "isDeleted": false, + "id": "yu32XFDVxjsltOILQkLVA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1365.177734375, + "y": 855.53515625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 63815567, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 807, + "versionNonce": 921280988, + "isDeleted": false, + "id": "Vx1u3JBG4wFPZTH61H34k", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1394.63671875, + "y": 877.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 96, + "height": 25, + "seed": 949683425, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper3", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper3" + }, + { + "type": "rectangle", + "version": 1037, + "versionNonce": 1063188964, + "isDeleted": false, + "id": "TkyDDTKdzhCr1PFXHjU_H", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1383.89453125, + "y": 921.984375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1982657967, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 814, + "versionNonce": 630261340, + "isDeleted": false, + "id": "ZBfU0ngueuYsWz6I8bCKK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1402.94921875, + "y": 937.25390625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 126468289, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 1122, + "versionNonce": 2091785572, + "isDeleted": false, + "id": "jhjA6EMo6vpUCUZHQr_mX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.259765625, + "y": 266.166015625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 505.94921874999994, + "seed": 1369749569, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1224, + "versionNonce": 47700700, + "isDeleted": false, + "id": "4Sga6YK0N6BhYlnzfY-If", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1507.833984375, + "y": 267.642578125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 505.75, + "seed": 307406927, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 368, + "versionNonce": 458019044, + "isDeleted": false, + "id": "qNOaN3pVAJBSsMo2IDl3A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1223.572265625, + "y": 273.486328125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 105, + "height": 25, + "seed": 1875249185, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode3-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode3-dr" + }, + { + "type": "text", + "version": 421, + "versionNonce": 693116764, + "isDeleted": false, + "id": "FQeMCzI5wpNs4VKgvsRbJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1528.771484375, + "y": 278.841796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 105, + "height": 25, + "seed": 1570162287, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode4-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode4-dr" + }, + { + "type": "rectangle", + "version": 1264, + "versionNonce": 1791562852, + "isDeleted": false, + "id": "rGWPbCPCIaA6wd0vf3cAm", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1236.419921875, + "y": 329.099609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 415.86328125000006, + "seed": 15883265, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1213, + "versionNonce": 1363923932, + "isDeleted": false, + "id": "cy7O-CTpJ-KentMW4VdfJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1536.193359375, + "y": 325.974609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 424.23828125000006, + "seed": 49422479, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 432, + "versionNonce": 418441188, + "isDeleted": false, + "id": "wRq1_meRS7lJ2EKHgKk2W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 6.281358663757188, + "x": 1253.544921875, + "y": 354.646484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 1965634529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "text", + "version": 434, + "versionNonce": 1490876508, + "isDeleted": false, + "id": "ZNj_OF3A8KOYCPIJxemRv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1557.603515625, + "y": 346.330078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 874329775, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "rectangle", + "version": 1172, + "versionNonce": 1775389540, + "isDeleted": false, + "id": "oluxJzMjFfYOyn5-B0dka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1256.251953125, + "y": 390.349609375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 335.81250000000006, + "seed": 276434881, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1189, + "versionNonce": 198544604, + "isDeleted": false, + "id": "ajb0Y-1AIvf3mpC8Gisy9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1555.865234375, + "y": 390.783203125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 337.78125000000006, + "seed": 1472235727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 933, + "versionNonce": 1874542308, + "isDeleted": false, + "id": "Dz6jzUvxO4147RhI8WZFh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1278.189453125, + "y": 445.775390625, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 263.49218749999994, + "seed": 1761898401, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 960, + "versionNonce": 1808240988, + "isDeleted": false, + "id": "7mjktKEHbPcChuXq2eo5m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1578.818359375, + "y": 439.923828125, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 268.22656249999994, + "seed": 1802802927, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 857, + "versionNonce": 958586972, + "isDeleted": false, + "id": "fQkUz2oj2eZkEPDYYWcRA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.408203125, + "y": 644.103515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1680320321, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Tc6pUBn2VamfWcVF02hrZ", + "type": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + } + ], + "updated": 1673465879926, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 905, + "versionNonce": 929709788, + "isDeleted": false, + "id": "OgP2fCzCGSSYc_ZLdu3tr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1607.759765625, + "y": 635.228515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 284830031, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6k5d9f3O3ERrytVDoaHKq", + "type": "arrow" + }, + { + "id": "fqVZi7oKcvz45aVHwi1GP", + "type": "arrow" + }, + { + "id": "fPSg8iqk4AEDCGu9JUbZh", + "type": "arrow" + }, + { + "id": "5KB-9zBxZdK0MPSlVVNg7", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 732, + "versionNonce": 2132948964, + "isDeleted": false, + "id": "WbMJv-HlFhemifDr5ojCi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1317.958984375, + "y": 652.669921875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 840111905, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6k5d9f3O3ERrytVDoaHKq", + "type": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + } + ], + "updated": 1673465881826, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 714, + "versionNonce": 1365349732, + "isDeleted": false, + "id": "oMjTSaM1N58ACMutJDQo3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1622.029296875, + "y": 646.466796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 2108041071, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Tc6pUBn2VamfWcVF02hrZ", + "type": "arrow" + }, + { + "id": "Q2_sAmVp3gwWZ2oKNQ7rL", + "type": "arrow" + } + ], + "updated": 1673465892668, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 529, + "versionNonce": 518221924, + "isDeleted": false, + "id": "T_zXJHMRuYqBH6Q5bzK86", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1265.513671875, + "y": 408.224609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 154, + "height": 25, + "seed": 885361409, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard2_replica1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard2_replica1" + }, + { + "type": "text", + "version": 584, + "versionNonce": 1200961500, + "isDeleted": false, + "id": "gtCtR7kY6nZwt9rq7tTlS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1568.044921875, + "y": 407.763671875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 162, + "height": 25, + "seed": 208494991, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard2_replica2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard2_replica2" + }, + { + "type": "text", + "version": 618, + "versionNonce": 291488740, + "isDeleted": false, + "id": "bLICR7aFNDfOBor8HGukz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1289.689453125, + "y": 457.177734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1153336033, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 658, + "versionNonce": 140106844, + "isDeleted": false, + "id": "pt4oXdVb7fXEfmAyVP0IK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1586.337890625, + "y": 447.916015625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1317558191, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "arrow", + "version": 576, + "versionNonce": 671459172, + "isDeleted": false, + "id": "Tc6pUBn2VamfWcVF02hrZ", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1392.861328125, + "y": 653.3642358962176, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 214.14436429998887, + "height": 7.23265463879045, + "seed": 2123202241, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": -0.47428717728252356, + "gap": 5.51953125 + }, + "endBinding": { + "elementId": "oMjTSaM1N58ACMutJDQo3", + "focus": 1.062590750239405, + "gap": 15.02734375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 214.14436429998887, + -7.23265463879045 + ] + ] + }, + { + "type": "arrow", + "version": 677, + "versionNonce": 34992348, + "isDeleted": false, + "id": "6k5d9f3O3ERrytVDoaHKq", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.841796875, + "y": 668.5903858023075, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 214.08984375, + "height": 6.469282503233785, + "seed": 438274511, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OgP2fCzCGSSYc_ZLdu3tr", + "focus": -0.4139713939639972, + "gap": 4.91796875 + }, + "endBinding": { + "elementId": "WbMJv-HlFhemifDr5ojCi", + "focus": 0.8358333991526675, + "gap": 13.79296875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -214.08984375, + 6.469282503233785 + ] + ] + }, + { + "type": "arrow", + "version": 1313, + "versionNonce": 1193482980, + "isDeleted": false, + "id": "ch2PpBqvlYoVfwfXC0ccU", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.5982475475205, + "y": 771.9687500000001, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 34.99830724046308, + "height": 59.742187499999886, + "seed": 2122204719, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "AatWa1WT64MRIbtUJHkYx", + "gap": 24.328125000000114, + "focus": 0.5593528890074575 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 2.58203125, + "focus": -0.6799372564994136 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 34.99830724046308, + 59.742187499999886 + ] + ] + }, + { + "type": "rectangle", + "version": 583, + "versionNonce": 73102684, + "isDeleted": false, + "id": "6XFHR168qyQdZGSSAkdVQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.27734375, + "y": 834.29296875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 927.33984375, + "height": 226.73828125, + "seed": 1140814639, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 316, + "versionNonce": 424025700, + "isDeleted": false, + "id": "vVIDbj6IOHJZPxahYvtay", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1041.2723887588186, + "y": 772.0078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 44.938375406273735, + "height": 57.15797501558586, + "seed": 409206113, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KSZ6WPivPmlFfEae7MOmZ", + "focus": 0.6647589899269046, + "gap": 26.109375 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "focus": -0.053496678221884524, + "gap": 5.127181234414138 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 44.938375406273735, + 57.15797501558586 + ] + ] + }, + { + "type": "arrow", + "version": 581, + "versionNonce": 477915612, + "isDeleted": false, + "id": "rkre42NcpDm8yTNezH5zh", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1012.7137950088186, + "y": 942.859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 76.44618790627374, + "height": 0.9470375155858619, + "seed": 1085866177, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": -0.04919159442148933, + "gap": 5.073170008818579 + }, + "endBinding": { + "elementId": "LCD1WmlJ4y-REz1dTpJ9Q", + "focus": -0.1910241746788114, + "gap": 2.980642084907686 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.44618790627374, + 0.9470375155858619 + ] + ] + }, + { + "type": "arrow", + "version": 816, + "versionNonce": 1195160036, + "isDeleted": false, + "id": "EN1jjvyD4pydVpNBYGCu1", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.8192637588186, + "y": 955.4648437500002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85.31943709372626, + "height": 2.150618734414138, + "seed": 362368975, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -85.31943709372626, + -2.150618734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1189, + "versionNonce": 1569377884, + "isDeleted": false, + "id": "3ggSRTy32SXrl5tfDxejC", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1476.4091075088186, + "y": 977.5000000000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 546.1514683437263, + "height": 47.83421248441391, + "seed": 1811691279, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -1.1502483311217826, + "gap": 15.246093750000227 + }, + "endBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.7278040192946851, + "gap": 10.16969376558609 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -295.1825450088186, + 35.40234374999977 + ], + [ + -546.1514683437263, + -12.431868734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1379, + "versionNonce": 806671716, + "isDeleted": false, + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 898.9989512588186, + "y": 966.4609375000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 599.6297816562737, + "height": 78.08984374999977, + "seed": 678064929, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.8457577505333682, + "gap": 11.562500000000227 + }, + "endBinding": { + "elementId": "TkyDDTKdzhCr1PFXHjU_H", + "focus": -0.6356670190591646, + "gap": 1.9079750155860893 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 289.9658924911814, + 78.08984374999977 + ], + [ + 599.6297816562737, + 11.939225015585862 + ] + ] + }, + { + "type": "arrow", + "version": 698, + "versionNonce": 676897500, + "isDeleted": false, + "id": "MJUWDY2EZev-CXvdwbrqg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.1825450088186, + "y": 944.21484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 86.67665665627374, + "height": 0.9900062655858619, + "seed": 449797199, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": -0.3219568458920805, + "gap": 15.307545008818579 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 86.67665665627374, + 0.9900062655858619 + ] + ] + }, + { + "type": "arrow", + "version": 873, + "versionNonce": 555518180, + "isDeleted": false, + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1387.1161387588186, + "y": 956.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87.63584334372626, + "height": 1.271256265585862, + "seed": 206368865, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -0.4014460800505109, + "gap": 15.833079991181421 + }, + "endBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": 0.8799195690060025, + "gap": 15.605295415092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -87.63584334372626, + 1.271256265585862 + ] + ] + }, + { + "type": "arrow", + "version": 166, + "versionNonce": 1937237852, + "isDeleted": false, + "id": "b44c5shkNkGvKfI3BvYTr", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1333.1940083568848, + "y": 774.953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.673004044225536, + "height": 58.33984375, + "seed": 1409554959, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 2.837890625, + "focus": -0.4532829275804875 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 1, + "focus": 0.08784463162487417 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -26.673004044225536, + 58.33984375 + ] + ] + }, + { + "type": "arrow", + "version": 118, + "versionNonce": 322608092, + "isDeleted": false, + "id": "2Qvve3RQu79DrGbdGSIoE", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.1379086119434, + "y": 771.7812500000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 32.41041515605525, + "height": 60.64843749999977, + "seed": 1501924399, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "cy7O-CTpJ-KentMW4VdfJ", + "focus": -0.460679729792005, + "gap": 21.568359375 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "focus": 0.5993280341824869, + "gap": 1.86328125 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -32.41041515605525, + 60.64843749999977 + ] + ] + }, + { + "type": "arrow", + "version": 738, + "versionNonce": 1211277284, + "isDeleted": false, + "id": "tOhL3LAMqpegl6h9MHUJR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.8139520877953, + "y": 186.2890625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 164.54126937196384, + "height": 319.25795742166434, + "seed": 301771727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.15345616469956536, + "gap": 2.53125 + }, + "endBinding": { + "elementId": "IyEuh1a9LnHG-JUDXlB-i", + "focus": 0.2722825954194206, + "gap": 6.443214453335656 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 164.54126937196384, + 319.25795742166434 + ] + ] + }, + { + "type": "arrow", + "version": 671, + "versionNonce": 28491868, + "isDeleted": false, + "id": "s-HYeFkwN90Wnid3rJNWl", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.6726151735345, + "y": 185.75, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 421.75279968733844, + "height": 318.4728011716643, + "seed": 127429455, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.08901572298861447, + "gap": 1.9921875 + }, + "endBinding": { + "elementId": "voKu0tXBmEaJrouiIomsC", + "focus": 0.3985151838540141, + "gap": 6.150245703335713 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 421.75279968733844, + 318.4728011716643 + ] + ] + }, + { + "type": "rectangle", + "version": 330, + "versionNonce": 403749220, + "isDeleted": false, + "id": "mfP2BtyKXz42duAKGG1wP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.0859375, + "y": 516.94921875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 973303009, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "oaJS_EqromiKeDyr4nClL" + }, + { + "id": "yo5OoqsCs2uygBiUbUHP4", + "type": "arrow" + }, + { + "id": "MP8lFTuT_14mccQcuYSdA", + "type": "arrow" + } + ], + "updated": 1673465845302, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 18, + "versionNonce": 649221340, + "isDeleted": false, + "id": "oaJS_EqromiKeDyr4nClL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 694.392578125, + "y": 527.013671875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 768116271, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mfP2BtyKXz42duAKGG1wP", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 417, + "versionNonce": 1711377380, + "isDeleted": false, + "id": "Vd91FLWRYUL8pd6YtU7Ig", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 985.517578125, + "y": 514.974609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 768359599, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "Ctzwpzg-cg95BAO7Tv1FS" + }, + { + "id": "GK4Iba9Rr6jxTDbnCF0CO", + "type": "arrow" + } + ], + "updated": 1673465805598, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 110, + "versionNonce": 896268516, + "isDeleted": false, + "id": "Ctzwpzg-cg95BAO7Tv1FS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.82421875, + "y": 525.0390625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 296118721, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Vd91FLWRYUL8pd6YtU7Ig", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 399, + "versionNonce": 1938282844, + "isDeleted": false, + "id": "IyEuh1a9LnHG-JUDXlB-i", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1287.291015625, + "y": 511.990234375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 1249761391, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "2_hYlsGbdDpkQgofRihLh" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + }, + { + "id": "KN4O7IzixCRBlvLndlDry", + "type": "arrow" + } + ], + "updated": 1673465816623, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 91, + "versionNonce": 1187200100, + "isDeleted": false, + "id": "2_hYlsGbdDpkQgofRihLh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.59765625, + "y": 522.0546875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 121465345, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IyEuh1a9LnHG-JUDXlB-i", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 414, + "versionNonce": 1278780772, + "isDeleted": false, + "id": "voKu0tXBmEaJrouiIomsC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1583.408203125, + "y": 510.373046875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 567927759, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "oShiptiUcsFKb5N0Wzg3C" + }, + { + "id": "s-HYeFkwN90Wnid3rJNWl", + "type": "arrow" + }, + { + "id": "3BvHiCA3kPGONkw1BkNH4", + "type": "arrow" + } + ], + "updated": 1673465835890, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 100, + "versionNonce": 1130762212, + "isDeleted": false, + "id": "oShiptiUcsFKb5N0Wzg3C", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1595.71484375, + "y": 520.4375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 1812087969, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "voKu0tXBmEaJrouiIomsC", + "originalText": "table1_dist" + }, + { + "id": "WqsIP0xQf7vNqaQ6aUdmI", + "type": "line", + "x": 726.6935763888889, + "y": 596.2447916666666, + "width": 927.4435763888889, + "height": 1.640625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 688969572, + "version": 136, + "versionNonce": 1318437084, + "isDeleted": false, + "boundElements": null, + "updated": 1673465790669, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 927.4435763888889, + -1.640625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "MP8lFTuT_14mccQcuYSdA", + "type": "arrow", + "x": 729.657986111111, + "y": 596.9869791666666, + "width": 2.569444444444514, + "height": 30.837673611111086, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2137248604, + "version": 176, + "versionNonce": 793877604, + "isDeleted": false, + "boundElements": null, + "updated": 1673465840507, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.569444444444514, + -30.837673611111086 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "mfP2BtyKXz42duAKGG1wP", + "focus": 0.08032629512951014, + "gap": 9.071180555555543 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow", + "x": 729.40625, + "y": 593.8619791666667, + "width": 0.00868055555565661, + "height": 32.8342013888888, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1567607772, + "version": 441, + "versionNonce": 1837770972, + "isDeleted": false, + "boundElements": null, + "updated": 1673465859923, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.00868055555565661, + 32.8342013888888 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "ZuIcO9LuMMsXU2q8TNX4t", + "focus": -0.17541251232267535, + "gap": 2.354600694444457 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "049uSUUbRTCQs9PJO_e9o", + "type": "arrow", + "x": 1040.9774305555559, + "y": 599.7126736111112, + "width": 0.45572916666674246, + "height": 35.954861111111086, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 640574180, + "version": 542, + "versionNonce": 943795164, + "isDeleted": false, + "boundElements": null, + "updated": 1673465873521, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.45572916666674246, + 35.954861111111086 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "8Uy6RO4B05r0YaoY6xozj", + "focus": -0.005554677651451976, + "gap": 11.633246527777715 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow", + "x": 1344.5494791666665, + "y": 594.7647569444445, + "width": 1.1631944444443434, + "height": 47.63020833333326, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1218252772, + "version": 636, + "versionNonce": 492411748, + "isDeleted": false, + "boundElements": null, + "updated": 1673465884314, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1631944444443434, + 47.63020833333326 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "WbMJv-HlFhemifDr5ojCi", + "focus": -0.006600020736089099, + "gap": 10.274956597222285 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "Q2_sAmVp3gwWZ2oKNQ7rL", + "type": "arrow", + "x": 1654.206597222222, + "y": 590.4592013888889, + "width": 1.1631944444443434, + "height": 47.63020833333326, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2095530332, + "version": 719, + "versionNonce": 257035868, + "isDeleted": false, + "boundElements": null, + "updated": 1673465892668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1631944444443434, + 47.63020833333326 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "oMjTSaM1N58ACMutJDQo3", + "focus": 0.18574203708432807, + "gap": 8.377387152777828 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "GK4Iba9Rr6jxTDbnCF0CO", + "type": "arrow", + "x": 1039.675347222222, + "y": 595.4982638888889, + "width": 0.5555555555554861, + "height": 36.25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 62790628, + "version": 279, + "versionNonce": 1248237412, + "isDeleted": false, + "boundElements": null, + "updated": 1673465824931, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.5555555555554861, + -36.25 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "Vd91FLWRYUL8pd6YtU7Ig", + "focus": 0.0707369614114876, + "gap": 4.144748263888914 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "KN4O7IzixCRBlvLndlDry", + "type": "arrow", + "x": 1344.4756944444443, + "y": 592.5859375, + "width": 0.6684027777778851, + "height": 35.3125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 355364708, + "version": 315, + "versionNonce": 1083789156, + "isDeleted": false, + "boundElements": null, + "updated": 1673465828566, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.6684027777778851, + -35.3125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "IyEuh1a9LnHG-JUDXlB-i", + "focus": 0.021975891860499298, + "gap": 5.154296875 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "3BvHiCA3kPGONkw1BkNH4", + "type": "arrow", + "x": 1652.8871527777778, + "y": 593.0069444444445, + "width": 0.6684027777778851, + "height": 35.3125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 737200348, + "version": 416, + "versionNonce": 783416924, + "isDeleted": false, + "boundElements": null, + "updated": 1673465835890, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.6684027777778851, + -35.3125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "voKu0tXBmEaJrouiIomsC", + "focus": -0.1904777562411242, + "gap": 7.192491319444457 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png b/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png new file mode 100644 index 00000000000..e98eb3fc7d0 Binary files /dev/null and b/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png differ diff --git a/docs/ja/deployment-guides/images/scaling-out-1.png b/docs/ja/deployment-guides/images/scaling-out-1.png new file mode 100644 index 00000000000..36696c1c801 Binary files /dev/null and b/docs/ja/deployment-guides/images/scaling-out-1.png differ diff --git a/docs/ja/deployment-guides/replicated.md b/docs/ja/deployment-guides/replicated.md new file mode 100644 index 00000000000..6c7d859ff2d --- /dev/null +++ b/docs/ja/deployment-guides/replicated.md @@ -0,0 +1,557 @@ +--- +slug: /ja/architecture/replication +sidebar_label: 障害耐性のためのレプリケーション +sidebar_position: 10 +title: 障害耐性のためのレプリケーション +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; +import ConfigFileNote from '@site/docs/ja/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/docs/ja/_snippets/_keeper-config-files.md'; + + +## 説明 +このアーキテクチャでは、5台のサーバーが構成されています。2台はデータのコピーをホストするために使われます。残りの3台のサーバーはデータのレプリケーションを調整するために使われます。この例では、ReplicatedMergeTreeテーブルエンジンを使用して、両方のデータノードにわたってレプリケートされるデータベースとテーブルを作成します。 + +## レベル: 基本 + + + +## 環境 +### アーキテクチャ図 +![ReplicatedMergeTreeを使用した1シャードと2レプリカのアーキテクチャ図](@site/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png) + +|Node|説明| +|----|-----------| +|clickhouse-01|データ| +|clickhouse-02|データ| +|clickhouse-keeper-01|分散コーディネーション| +|clickhouse-keeper-02|分散コーディネーション| +|clickhouse-keeper-03|分散コーディネーション| + +:::note +本番環境では、ClickHouse Keeperのために*専用*のホストを使用することを強くお勧めします。テスト環境では、ClickHouse ServerとClickHouse Keeperを同じサーバー上で組み合わせて実行することが許容されます。他の基本的な例、[スケールアウト](/docs/ja/deployment-guides/horizontal-scaling.md)では、この方法を使用しています。この例では、KeeperとClickHouse Serverを分離する推奨される方法を示します。Keeperサーバーは小さくすることができ、ClickHouse Serversが非常に大きくなるまで、各Keeperサーバーには通常4GB RAMがあれば十分です。 +::: + +## インストール + +2台のサーバー`clickhouse-01`と`clickhouse-02`にClickHouse serverとclientをインストールします。[アーカイブタイプに応じた手順](/docs/ja/getting-started/install.md/#available-installation-options) (.deb, .rpm, .tar.gzなど)に従ってください。 + +3台のサーバー`clickhouse-keeper-01`、`clickhouse-keeper-02`、`clickhouse-keeper-03`にClickHouse Keeperをインストールします。[アーカイブタイプに応じた手順に従ってください](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper) (.deb, .rpm, .tar.gzなど)。 + +## 設定ファイルの編集 + + + +## clickhouse-01の設定 + +clickhouse-01には5つの設定ファイルがあります。これらのファイルを1つのファイルにまとめることもできますが、ドキュメントの明確さのために別々に見るほうが簡単かもしれません。設定ファイルを読み進めると、ほとんどの設定がclickhouse-01とclickhouse-02で同じであることがわかり、違いは強調されています。 + +### ネットワークとログの設定 + +これらの値はお好みに応じてカスタマイズできます。この例の設定では、以下を提供します: +- 1000Mのロールオーバーを3回行うデバッグログ +- `clickhouse-client`で接続したときに表示される名前は `cluster_1S_2R node 1`です +- ClickHouseはポート8123と9000でIPV4ネットワークを介してリッスンします。 + +```xml title="/etc/clickhouse-server/config.d/network-and-logging.xml on clickhouse-01" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + cluster_1S_2R node 1 + 0.0.0.0 + 8123 + 9000 + +``` + +### マクロの設定 + +マクロ`shard`と`replica`は分散DDLの複雑さを軽減します。設定された値はDDLクエリで自動的に置き換えられ、DDLを簡単にします。この設定のマクロは、各ノードのシャード番号とレプリカ番号を指定します。 +この1シャード2レプリカの例では、レプリカマクロはclickhouse-01で`replica_1`、clickhouse-02で`replica_2`です。シャードマクロは、1つのシャードしかないため、clickhouse-01とclickhouse-02の両方で`1`です。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml on clickhouse-01" + + + 01 + + 01 + cluster_1S_2R + + +``` + +### レプリケーションとシャーディングの設定 + +上から始めて: +- XMLのremote_serversセクションは環境内の各クラスタを指定します。属性`replace=true`は、デフォルトのClickHouse設定内のサンプルremote_serversを、このファイル内で指定されたremote_server設定で置き換えます。この属性がない場合、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 +- この例では、`cluster_1S_2R`という名前のクラスタが1つあります。 +- `cluster_1S_2R`という名前のクラスタには、値`mysecretphrase`のシークレットが作成されます。このシークレットは、環境内のすべてのリモートサーバー間で共有され、正しいサーバーが一緒に参加することを保証します。 +- `cluster_1S_2R`クラスタには1つのシャードと2つのレプリカがあります。このドキュメントの冒頭にあるアーキテクチャ図と、以下のXMLのシャード定義を比較してください。シャード定義には2つのレプリカが含まれています。各レプリカのホストとポートが指定されています。1つのレプリカは`clickhouse-01`に保存され、もう1つのレプリカは`clickhouse-02`に保存されます。 +- シャードの内部レプリケーションはtrueに設定されています。各シャードは、設定ファイルでinternal_replicationパラメータを定義できます。このパラメータがtrueに設定されている場合、書き込み操作は最初に健康なレプリカを選択してデータを書き込みます。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml on clickhouse-01" + + + + mysecretphrase + + true + + clickhouse-01 + 9000 + + + clickhouse-02 + 9000 + + + + + +``` + +### Keeperの使用を設定する + +この設定ファイル`use-keeper.xml`は、ClickHouse Serverがレプリケーションと分散DDLの調整にClickHouse Keeperを使用するように設定しています。このファイルは、ClickHouse Serverがポート9181でノードclickhouse-keeper-01〜03上のKeeperを使用する必要があることを指定しており、`clickhouse-01`および`clickhouse-02`で同じです。 + +```xml title="/etc/clickhouse-server/config.d/use-keeper.xml on clickhouse-01" + + + + + clickhouse-keeper-01 + 9181 + + + clickhouse-keeper-02 + 9181 + + + clickhouse-keeper-03 + 9181 + + + +``` + +## clickhouse-02の設定 + +設定は、clickhouse-01とclickhouse-02で非常に似ているため、ここでは違いのみを指摘します。 + +### ネットワークとログの設定 + +このファイルは、`display_name`を除き、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/network-and-logging.xml on clickhouse-02" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + + cluster_1S_2R node 2 + 0.0.0.0 + 8123 + 9000 + +``` + +### マクロの設定 + +マクロの設定はclickhouse-01とclickhouse-02で異なります。`replica`はこのノードで`02`に設定されています。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml on clickhouse-02" + + + 01 + + 02 + cluster_1S_2R + + +``` + +### レプリケーションとシャーディングの設定 + +このファイルは、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml on clickhouse-02" + + + + mysecretphrase + + true + + clickhouse-01 + 9000 + + + clickhouse-02 + 9000 + + + + + +``` + +### Keeperの使用を設定する + +このファイルは、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/use-keeper.xml on clickhouse-02" + + + + + clickhouse-keeper-01 + 9181 + + + clickhouse-keeper-02 + 9181 + + + clickhouse-keeper-03 + 9181 + + + +``` + +## clickhouse-keeper-01の設定 + + + +ClickHouse Keeperは、データレプリケーションと分散DDLクエリの実行を調整するシステムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定はポート9181でClickHouse Keeperを有効にします。強調されている行は、このKeeperのインスタンスがserver_id 1を持っていることを指定しています。これは、3つのサーバーすべての`enable-keeper.xml`ファイルで唯一の違いです。`clickhouse-keeper-02`では`server_id`が`2`に設定され、`clickhouse-keeper-03`では`server_id`が`3`に設定されます。raft設定セクションは3台のサーバーすべてで同じであり、`server_id`とraft設定内の`server`インスタンスの関係を示すために以下で強調されています。 + +:::note +なんらかの理由でKeeperノードが置き換えられたり再構築されたりした場合、既存の`server_id`を再利用しないでください。例えば、`server_id`が`2`のKeeperノードが再構築された場合、`server_id`を`4`以上に設定してください。 +::: + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-01" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + + 1 + clickhouse-keeper-01 + 9234 + + + + 2 + clickhouse-keeper-02 + 9234 + + + 3 + clickhouse-keeper-03 + 9234 + + + + +``` + +## clickhouse-keeper-02の設定 + +`clickhouse-keeper-01`と`clickhouse-keeper-02`間には1行の違いしかありません。このノードでは`server_id`が`2`に設定されています。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-02" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 2 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + 1 + clickhouse-keeper-01 + 9234 + + + + 2 + clickhouse-keeper-02 + 9234 + + + + 3 + clickhouse-keeper-03 + 9234 + + + + +``` + +## clickhouse-keeper-03の設定 + +`clickhouse-keeper-01`と`clickhouse-keeper-03`間には1行の違いしかありません。このノードでは`server_id`が`3`に設定されています。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-03" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + 1 + clickhouse-keeper-01 + 9234 + + + 2 + clickhouse-keeper-02 + 9234 + + + + 3 + clickhouse-keeper-03 + 9234 + + + + + +``` + +## テスト + +ReplicatedMergeTreeとClickHouse Keeperの経験を得るために、以下のコマンドを実行してみてください。これにより、以下の操作が行えます: +- 上記で設定されたクラスタにデータベースを作成する +- ReplicatedMergeTreeテーブルエンジンを使用してデータベースにテーブルを作成する +- 1つのノードにデータを挿入し、別のノードでクエリを実行する +- 1つのClickHouseサーバーノードを停止する +- 動作中のノードにさらにデータを挿入する +- 停止したノードを再起動する +- 再起動したノードでクエリを実行して、データが利用可能であることを確認する + +### ClickHouse Keeperが動作していることを確認する + +`mntr`コマンドは、ClickHouse Keeperが動作していることを確認し、3つのKeeperノードの関係に関する状態情報を得るために使用されます。この例で使用されている設定では、3つのノードが一緒に動作します。ノードはリーダーを選出し、残りのノードはフォロワーになります。`mntr`コマンドは、パフォーマンスに関連する情報や、特定のノードがフォロワーかリーダーであるかを示します。 + +:::tip +Keeperに`mntr`コマンドを送信するために`netcat`をインストールする必要があるかもしれません。ダウンロード情報については[nmap.org](https://nmap.org/ncat/)ページをご覧ください。 +::: + +```bash title="clickhouse-keeper-01、clickhouse-keeper-02、およびclickhouse-keeper-03のシェルで実行" +echo mntr | nc localhost 9181 +``` +```response title="フォロワーからのレスポンス" +zk_version v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 0 +zk_packets_sent 0 +zk_num_alive_connections 0 +zk_outstanding_requests 0 +# highlight-next-line +zk_server_state follower +zk_znode_count 6 +zk_watch_count 0 +zk_ephemerals_count 0 +zk_approximate_data_size 1271 +zk_key_arena_size 4096 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 46 +zk_max_file_descriptor_count 18446744073709551615 +``` + +```response title="リーダーからのレスポンス" +zk_version v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 0 +zk_packets_sent 0 +zk_num_alive_connections 0 +zk_outstanding_requests 0 +# highlight-next-line +zk_server_state leader +zk_znode_count 6 +zk_watch_count 0 +zk_ephemerals_count 0 +zk_approximate_data_size 1271 +zk_key_arena_size 4096 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 48 +zk_max_file_descriptor_count 18446744073709551615 +# highlight-start +zk_followers 2 +zk_synced_followers 2 +# highlight-end +``` + +### ClickHouseクラスタの機能を確認する + +1つのシェルで`clickhouse-01`に`clickhouse client`で接続し、もう1つのシェルで`clickhouse-02`に`clickhouse client`で接続します。 + +1. 上記で設定されたクラスタにデータベースを作成する + +```sql title="ノードclickhouse-01またはclickhouse-02のいずれかで実行" +CREATE DATABASE db1 ON CLUSTER cluster_1S_2R +``` +```response +┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ clickhouse-02 │ 9000 │ 0 │ │ 1 │ 0 │ +│ clickhouse-01 │ 9000 │ 0 │ │ 0 │ 0 │ +└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +2. ReplicatedMergeTreeテーブルエンジンを使用してデータベースにテーブルを作成する +```sql title="ノードclickhouse-01またはclickhouse-02のいずれかで実行" +CREATE TABLE db1.table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree +ORDER BY id +``` +```response +┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ clickhouse-02 │ 9000 │ 0 │ │ 1 │ 0 │ +│ clickhouse-01 │ 9000 │ 0 │ │ 0 │ 0 │ +└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` +3. 1つのノードでデータを挿入し、別のノードでクエリを実行する +```sql title="ノードclickhouse-01で実行" +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +4. ノード`clickhouse-02`でテーブルをクエリする +```sql title="ノードclickhouse-02で実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +``` + +5. 他のノードでデータを挿入し、ノード`clickhouse-01`でクエリを実行する +```sql title="ノードclickhouse-02で実行" +INSERT INTO db1.table1 (id, column1) VALUES (2, 'def'); +``` + +```sql title="ノードclickhouse-01で実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +``` + +6. 1台のClickHouseサーバーノードを停止する +1台のClickHouseサーバーノードを停止するには、ノードの起動に使用したものと似たオペレーティングシステムコマンドを実行します。`systemctl start`でノードを起動した場合、`systemctl stop`を使用して停止します。 + +7. 動作中のノードにさらにデータを挿入する +```sql title="動作中のノードで実行" +INSERT INTO db1.table1 (id, column1) VALUES (3, 'ghi'); +``` + +データを選択します: +```sql title="動作中のノードで実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 3 │ ghi │ +└────┴─────────┘ +``` + +8. 停止したノードを再起動し、そこでも選択する + +```sql title="再起動したノードで実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 3 │ ghi │ +└────┴─────────┘ +``` + diff --git a/docs/ja/deployment-guides/terminology.md b/docs/ja/deployment-guides/terminology.md new file mode 100644 index 00000000000..5be89bb6107 --- /dev/null +++ b/docs/ja/deployment-guides/terminology.md @@ -0,0 +1,39 @@ +--- +slug: /ja/architecture/introduction +sidebar_label: はじめに +title: はじめに +sidebar_position: 1 +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; + +これらのデプロイメント例は、ClickHouse Support and Services 組織が ClickHouse ユーザーに提供したアドバイスに基づいています。これらは実際に動作する例であり、ぜひ試してみてからニーズに合わせて調整することをお勧めします。ここで、あなたの要件にぴったり合う例を見つけるかもしれません。あるいは、データが2回ではなく3回レプリケートされる必要がある場合、ここで示されているパターンに従ってもう1つのレプリカを追加することができるでしょう。 + + + +## 例 + +### 基本 + +- [**スケールアウト**](/docs/ja/deployment-guides/horizontal-scaling.md)の例は、データを2つのノードにシャードし、分散テーブルを使用する方法を示しています。これにより、データが2つの ClickHouse ノードに存在することになります。2つの ClickHouse ノードは、分散同期を提供する ClickHouse Keeper も実行します。3つ目のノードは、ClickHouse Keeper クォーラムを完了するために単独で ClickHouse Keeper を実行します。 + +- [**フォルトトレランスのためのレプリケーション**](/docs/ja/deployment-guides/replicated.md)の例は、データを2つのノードにレプリケートし、ReplicatedMergeTree テーブルを使用する方法を示しています。これにより、データが2つの ClickHouse ノードに存在することになります。2つの ClickHouse サーバーノードに加えて、レプリケーションを管理するための3つの ClickHouse Keeper 単独ノードがあります。 + +
+ +
+ +### 中級 + +- 近日公開 + +### 上級 + +- 近日公開 diff --git a/docs/ja/development/_category_.yml b/docs/ja/development/_category_.yml new file mode 100644 index 00000000000..4db6474fff8 --- /dev/null +++ b/docs/ja/development/_category_.yml @@ -0,0 +1,8 @@ +position: 101 +label: 'Building ClickHouse' +collapsible: true +collapsed: true +link: + type: generated-index + title: Building ClickHouse + slug: /ja/development diff --git a/docs/ja/development/adding_test_queries.md b/docs/ja/development/adding_test_queries.md new file mode 100644 index 00000000000..fcb1057674e --- /dev/null +++ b/docs/ja/development/adding_test_queries.md @@ -0,0 +1,152 @@ +--- +slug: /ja/development/adding_test_queries +sidebar_label: テストクエリの追加 +sidebar_position: 63 +title: ClickHouse CIにテストクエリを追加する方法 +description: ClickHouseの継続的インテグレーションにテストケースを追加する手順 +--- + +ClickHouseには何百、何千もの機能があります。すべてのコミットは、何千ものテストケースを含む複雑なテストセットによってチェックされます。 + +コア機能は非常によくテストされていますが、ClickHouse CIによって特異なケースやさまざまな機能の組み合わせが明らかになることがあります。 + +私たちが見てきたバグ/回帰の多くは、テストカバレッジが乏しい「グレーゾーン」で発生しています。 + +私たちは、できる限り多くのシナリオや実際に使われる機能の組み合わせをテストでカバーすることに非常に興味を持っています。 + +## なぜテストを追加するのか + +ClickHouseのコードにテストケースを追加すべき理由/タイミング: +1) 複雑なシナリオや機能の組み合わせを使用する / あまり一般的でない特異なケースがある +2) チェンジログに通知されずにバージョン間で特定の動作が変わったことに気づく +3) ClickHouseの品質向上に貢献し、使用中の機能が将来のリリースで壊れないようにする +4) テストが追加/受入されると、その特異なケースが偶然壊れることはなくなる +5) 素晴らしいオープンソースコミュニティの一員になる +6) `system.contributors`テーブルにあなたの名前が表示される! +7) 世界を少し良くする :) + +### 実施手順 + +#### 前提条件 + +Linuxマシンを使用していると仮定します(他のOSではdocker/仮想マシンを使用できます)。最新のブラウザ/インターネット接続と、基本的なLinux & SQLスキルが必要です。 + +高度な専門知識は必要ありません(C++やClickHouse CIの内部について知る必要はありません)。 + +#### 準備 + +1) [GitHubアカウントを作成](https://github.com/join)(まだ持っていない場合) +2) [gitをセットアップ](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/set-up-git) +```bash +# Ubuntuの場合 +sudo apt-get update +sudo apt-get install git + +git config --global user.name "John Doe" # あなたの名前を記入してください +git config --global user.email "email@example.com" # あなたのメールを記入してください + +``` +3) [ClickHouseプロジェクトをフォーク](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/fork-a-repo) - [https://github.com/ClickHouse/ClickHouse](https://github.com/ClickHouse/ClickHouse) を開き、右上のフォークボタンを押すだけです: +![フォークリポジトリ](https://github-images.s3.amazonaws.com/help/bootcamp/Bootcamp-Fork.png) + +4) 自分のフォークをPCの任意のフォルダにクローン、例: `~/workspace/ClickHouse` +``` +mkdir ~/workspace && cd ~/workspace +git clone https://github.com/<あなたのGitHubユーザ名>/ClickHouse +cd ClickHouse +git remote add upstream https://github.com/ClickHouse/ClickHouse +``` + +#### テスト用の新しいブランチ + +1) 最新のClickHouseマスターから新しいブランチを作成 +``` +cd ~/workspace/ClickHouse +git fetch upstream +git checkout -b name_for_a_branch_with_my_test upstream/master +``` + +#### ClickHouseのインストールと実行 + +1) `clickhouse-server`をインストール([公式ドキュメント](https://clickhouse.com/docs/ja/getting-started/install/) に従う) +2) テスト設定をインストール(Zookeeperのモック実装を使用し、いくつかの設定を調整) +``` +cd ~/workspace/ClickHouse/tests/config +sudo ./install.sh +``` +3) clickhouse-serverを実行 +``` +sudo systemctl restart clickhouse-server +``` + +#### テストファイルの作成 + +1) あなたのテストの番号を見つけます - `tests/queries/0_stateless/`内のファイルで一番大きい番号を見つけます + +```sh +$ cd ~/workspace/ClickHouse +$ ls tests/queries/0_stateless/[0-9]*.reference | tail -n 1 +tests/queries/0_stateless/01520_client_print_query_id.reference +``` +現在のテストの最後の番号は `01520` なので、次の番号として私のテストは `01521` になります。 + +2) 次の番号とテストする機能の名前でSQLファイルを作成 + +```sh +touch tests/queries/0_stateless/01521_dummy_test.sql +``` + +3) 好きなエディタでSQLファイルを編集(テスト作成のヒントを参照) +```sh +vim tests/queries/0_stateless/01521_dummy_test.sql +``` + +4) テストを実行し、その結果をリファレンスファイルに入れます: +``` +clickhouse-client -nm < tests/queries/0_stateless/01521_dummy_test.sql | tee tests/queries/0_stateless/01521_dummy_test.reference +``` + +5) すべてが正しいことを確認し、テスト出力が間違っている場合は(例えばバグによる)、テキストエディタを使用してリファレンスファイルを調整。 + +#### 良いテストを作成する方法 + +- テストは次の要素を持つべきです + - **最小限** - テストする機能に関連するテーブルのみを作成し、関連しないカラムやクエリの部分を除去 + - **高速** - 数秒以内(理想的にはサブセカンド)で終了 + - **正確** - 機能が動作していない場合に失敗 + - **決定的** + - **分離/ステートレス** - 環境に依存しない + - タイミングに頼らない +- 特異なケース(0 / Null / 空のセット / 例外スロー)をカバーするように心がける +- クエリがエラーを返すことをテストするには、クエリの後に特別なコメントを付けることができます:`-- { serverError 60 }` または `-- { clientError 20 }` +- データベースを切り替えない(必要な場合を除く) +- 必要に応じて、同じノードに複数のテーブルレプリカを作成できます +- 必要に応じて、テストクラスター定義の一つを使用することができます(`system.clusters`を参照) +- クエリやデータの初期化には `number` / `numbers_mt` / `zeros` / `zeros_mt` などを使う +- テストの前後に作成したオブジェクトをクリーンアップ(DROP IF EXISTS) - 汚れた状態のケースを考慮 +- 操作の同期モードを優先(ミューテーション、マージなど) +- `0_stateless`フォルダ内の他のSQLファイルを参考に +- テストしようとする機能/機能の組み合わせが既存のテストでカバーされていないことを確認 + +#### テスト命名規則 + +テストを適切に名前付けすることは重要です。こうすることで、clickhouse-test の呼び出し時に特定のテストサブセットをオフにできます。 + +| テスターフラグ | テスト名に含めるべき内容 | フラグを追加すべきとき | +|---|---|---| +| `--[no-]zookeeper`| "zookeeper" または "replica" | テストが`ReplicatedMergeTree`ファミリーのテーブルを使用する場合 | +| `--[no-]shard` | "shard" または "distributed" または "global"| テストが127.0.0.2などへの接続を使用する場合 | +| `--[no-]long` | "long" または "deadlock" または "race" | テストが60秒以上かかる場合 | + +#### コミット / プッシュ / PRの作成 + +1) 変更をコミット & プッシュ +```sh +cd ~/workspace/ClickHouse +git add tests/queries/0_stateless/01521_dummy_test.sql +git add tests/queries/0_stateless/01521_dummy_test.reference +git commit # 可能であれば素敵なコミットメッセージを使用 +git push origin HEAD +``` +2) プッシュ中に表示されたリンクを使用して、メインリポジトリにPRを作成 +3) PRのタイトルと内容を調整し、`Changelog category (leave one)`には `Build/Testing/Packaging Improvement` を保持し、他のフィールドを必要に応じて記入。 diff --git a/docs/ja/development/architecture.md b/docs/ja/development/architecture.md new file mode 100644 index 00000000000..68c599afd9f --- /dev/null +++ b/docs/ja/development/architecture.md @@ -0,0 +1,272 @@ +--- +slug: /ja/development/architecture +sidebar_label: アーキテクチャ概要 +sidebar_position: 62 +--- + +# ClickHouseアーキテクチャの概要 + +ClickHouseは真の列指向DBMSです。データはカラム単位で保存され、配列(ベクトルまたはカラムのチャンク)の実行中に処理されます。 +可能な限り、個々の値ではなく配列に対する操作が行われます。これを「ベクトル化クエリ実行」と呼び、実際のデータ処理のコストを下げるのに役立ちます。 + +> このアイデアは新しいものではありません。`APL`(1957年のプログラミング言語)に遡り、その後継として`A +`(APL方言)、`J`(1990)、`K`(1993)、および`Q`(Kx Systemsのプログラミング言語、2003)があります。配列プログラミングは科学データ処理で使用されています。関係データベースでも新しいアイデアではありません:例えば、`VectorWise`システム(Actian CorporationによるActian Vector Analytical Databaseとしても知られています)で使用されています。 + +クエリ処理を加速するためのアプローチには、ベクトル化クエリ実行と実行時コード生成の2つがあります。後者はすべての間接参照と動的ディスパッチを取り除きます。これらの方法のいずれも、もう一方よりも必ずしも優れているわけではありません。実行時コード生成は多くの操作を融合し、CPUの実行ユニットとパイプラインを完全に活用する場合により効果的です。ベクトル化クエリ実行は一時的なベクトルをキャッシュに書き込み、それを読み戻す必要があるため、実用的でない場合があります。一時データがL2キャッシュに収まらない場合、これが問題になります。しかし、ベクトル化クエリ実行は、CPUのSIMD機能をより簡単に利用できます。[友人による研究論文](http://15721.courses.cs.cmu.edu/spring2016/papers/p5-sompolski.pdf)によれば、両方のアプローチを組み合わせる方が良いと示されています。ClickHouseはベクトル化クエリ実行を使用し、実行時コード生成のための限定的な初期サポートがあります。 + +## カラム {#columns} + +`IColumn`インターフェースは、メモリ内のカラム(実際にはカラムのチャンク)を表すために使用されます。このインターフェースは、さまざまな関係演算子の実装を支援するメソッドを提供します。ほぼすべての操作はイミュータブルです:元のカラムを変更せず、新しいものを作成します。例えば、`IColumn :: filter`メソッドはフィルタバイトマスクを受け取ります。これは`WHERE`と`HAVING`の関係演算子で使用されます。追加の例:`ORDER BY`をサポートするための`IColumn :: permute`メソッド、`LIMIT`をサポートするための`IColumn :: cut`メソッド。 + +さまざまな`IColumn`実装(`ColumnUInt8`、`ColumnString`など)は、カラムのメモリレイアウトを担当します。メモリレイアウトは通常、連続した配列です。カラムの整数型の場合、`std :: vector`のように、ただ1つの連続した配列です。`String`や`Array`カラムの場合、すべての配列要素を連続して配置する1つのベクトルと、各配列の先頭へのオフセットを持つ2番目のベクトルが存在します。また、`ColumnConst`はメモリに1つの値だけを保存し、カラムのように見えます。 + +## フィールド {#field} + +それでも、個々の値を操作することも可能です。個々の値を表すために、`Field`が使用されます。`Field`は`UInt64`、`Int64`、`Float64`、`String`、および`Array`の区別された共用体に過ぎません。`IColumn`には、`n`番目の値を`Field`として取得するための`operator []`メソッドと、`Field`をカラムの末尾に追加するための`insert`メソッドがあります。これらのメソッドは、個々の値を表すテンポラリの`Field`オブジェクトを扱う必要があるため、非常に効率的ではありません。もっと効率的なメソッドとして`insertFrom`や`insertRangeFrom`などがあります。 + +`Field`には、特定のテーブルのデータ型に関する十分な情報はありません。例えば、`UInt8`、`UInt16`、`UInt32`、および`UInt64`はすべて`Field`内では`UInt64`で表されます。 + +## リーキー抽象 {#leaky-abstractions} + +`IColumn`はデータの一般的な関係変換のメソッドを持っていますが、すべてのニーズを満たすわけではありません。例えば、`ColumnUInt64`には2つのカラムを合計するメソッドがなく、`ColumnString`には部分文字列検索を実行するためのメソッドがありません。これらの無数のルーチンは、`IColumn`の外部で実装されています。 + +カラム上のさまざまな関数は、`Field`値を抽出するために`IColumn`メソッドを使用して一般的に非効率的な方法で実装されるか、特定の`IColumn`実装内のデータの内部メモリレイアウトを知っていて特殊な方法で実装されます。これは特定の`IColumn`型にキャスト関数を実装し、内部表現を直接扱うことによって実現されます。例えば、`ColumnUInt64`には内部配列へのリファレンスを返す`getData`メソッドがあり、別のルーチンがその配列を直接読み取ったり埋めたりします。効率的な特殊化を可能にするための「リーキー抽象」があります。 + +## データ型 {#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`は、`IDataType`インターフェースの`serializeTextEscaped`ヘルパーメソッドを共有して使用します。 + +## ブロック {#block} + +`Block`はメモリ内でテーブルのサブセット(チャンク)を表すコンテナです。それは単に3つ組(`IColumn, IDataType, カラム名`)のセットです。クエリ実行中、データは`Block`として処理されます。`Block`を持っている場合、データ(`IColumn`オブジェクト内に)も持ち、タイプに関する情報(`IDataType`内)があり、カラムがどのように処理されるかを教えます。そしてカラム名もあります。それは、もとのテーブルからのカラム名か、計算結果を一時的に取得するために割り当てられた人工的な名前です。 + +ブロック内でカラムに関数を計算する場合、結果を含む別のカラムをブロックに追加し、関数の引数用のカラムには触れません。操作はイミュータブルです。後で不要なカラムはブロックから削除できますが、変更はされません。これは共通部分式の消去に便利です。 + +ブロックは処理されたデータチャンクごとに作成されます。注意すべきは、同じタイプの計算では異なるブロックでもカラム名とタイプが同じであるため、カラムデータだけが変化します。ブロックデータはブロックヘッダーから分離する方が良いです。小さなブロックサイズは、`shared_ptr`のコピーやカラム名の一時文字列のオーバーヘッドが高いです。 + +## プロセッサ + +記述は[https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h)を参照してください。 + +## フォーマット {#formats} + +データフォーマットはプロセッサで実装されています。 + +## I/O {#io} + +バイト指向の入出力には、`ReadBuffer`と`WriteBuffer`の抽象クラスがあります。これらはC++の`iostream`の代わりに使用されます。心配しないでください:成熟したC++プロジェクトは、良い理由で常に`iostream`以外の何かを使用しています。 + +`ReadBuffer`と`WriteBuffer`は、単なる連続したバッファとそのバッファ内の位置を指すカーソルです。実装はバッファのメモリを保持する場合としない場合があります。バッファを次のデータで満たすため(`ReadBuffer`の場合)またはどこかにバッファをフラッシュするため(`WriteBuffer`の場合)の仮想メソッドがあります。仮想メソッドはあまり呼ばれません。 + +`ReadBuffer`/`WriteBuffer`の実装はファイルとファイル記述子、ネットワークソケットで動作するためや、圧縮を実装するために使用されます(`CompressedWriteBuffer`は別のWriteBufferで初期化され、そこにデータを書き込む前に圧縮を行います)他の目的のために使用されます–名前`ConcatReadBuffer`、`LimitReadBuffer`、および`HashingWriteBuffer`はそれ自体を物語っています。 + +Read/WriteBuffersはバイトを扱うだけです。入力/出力のフォーマットを支援するために、`ReadHelpers`および`WriteHelpers`ヘッダーファイルからの関数があります。例えば、小数形式で数値を書くためのヘルパーがあります。 + +結果セットを`JSON`形式で標準出力に書き込むときに何が起こるかを見てみましょう。 +結果セットは、プルクエリパイプラインからフェッチされる準備が整っています。 +まず、標準出力にバイトを書き込むために`WriteBufferFromFileDescriptor(STDOUT_FILENO)`を作成します。 +次に、クエリパイプラインの結果を`JSON`形式で標準出力に行を出力する`JSONRowOutputFormat`に接続します。 +これは`complete`メソッドを介して行うことができ、プルクエリパイプラインを完了したクエリパイプラインに変換します。 +内部的には、`JSONRowOutputFormat`はさまざまなJSONデリミタを書き込み、`IDataType::serializeTextJSON`メソッドを`IColumn`と行番号の参照として呼び出します。したがって、`IDataType::serializeTextJSON`は`WriteHelpers.h`からのメソッドを呼び出します:例えば数値タイプの`writeText`や`DataTypeString`の`writeJSONString`です。 + +## テーブル {#tables} + +`IStorage`インターフェースはテーブルを表します。そのインターフェースの異なる実装は異なるテーブルエンジンです。例としては、`StorageMergeTree`、`StorageMemory`などです。これらのクラスのインスタンスは、ただテーブルを表します。 + +`IStorage`の主要なメソッドは、`read`と`write`です。他にも`alter`、`rename`、`drop`があります。`read`メソッドは次の引数を受け取ります:テーブルから読み取るカラムのセット、考慮する`AST`クエリ、および望ましいストリームの数です。そして`Pipe`を返します。 + +ほとんどの場合、読み取りメソッドはテーブルから指定されたカラムを読むだけの責任があります。それ以外のデータ処理はパイプラインの他の部分で行われ、`IStorage`の責任範囲外です。 + +しかし、顕著な例外があります: + +- ASTクエリは`read`メソッドに渡され、テーブルエンジンがインデックス使用を推論し、テーブルからより少ないデータを読み取るために使用できます。 +- 時には、テーブルエンジンが特定のステージまでデータを自分で処理することができます。例えば、`StorageDistributed`はリモートサーバにクエリを送り、データを処理して異なるリモートサーバからマージできるステージまで要求し、その前処理されたデータを返すことができます。その後、クエリインタプリタがデータ処理を完了します。 + +テーブルの`read`メソッドは、通常は複数の`Processor`で構成される`Pipe`を返します。これらのプロセッサは、並行してテーブルを読むことができます。 +次に、これらのプロセッサをさまざまな他の変換(式の評価やフィルタリングなど)に接続できます。これらは独立して計算されます。 +そして、それらの上に`QueryPipeline`を作成し、`PipelineExecutor`を介して実行します。 + +また、`TableFunction`があります。これらは`FROM`句で使用するために一時的な`IStorage`オブジェクトを返す関数です。 + +テーブルエンジンの実装方法を簡単に知るためには、`StorageMemory`や`StorageTinyLog`のような単純なものを見てください。 + +> `IStorage`の`read`メソッドの結果として、`QueryProcessingStage`—ストレージ内で既に計算されたクエリの部分についての情報を返します。 + +## パーサ {#parsers} + +クエリは手書きの再帰型下降法のパーサによって解析されます。例えば、`ParserSelectQuery`はクエリのさまざまな部分のための基礎的なパーサを再帰的に呼び出します。パーサは`AST`を生成します。`AST`はノードとして表現され、これは`IAST`のインスタンスです。 + +> パーサジェネレータは歴史的な理由から使用されていません。 + +## インタプリタ {#interpreters} + +インタプリタは、ASTからクエリ実行パイプラインを作成する責任があります。単純なインタプリタ(`InterpreterExistsQuery`や`InterpreterDropQuery`)と、より高度な`InterpreterSelectQuery`があります。 + +クエリ実行パイプラインは、特定のタイプの列セットのチャンクを消費し、生成できるプロセッサの組み合わせです。 +プロセッサはポートを介して通信し、複数の入力ポートと複数の出力ポートを持つことがあります。 +詳細な説明は[src/Processors/IProcessor.h](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h)にあります。 + +例えば、`SELECT`クエリのインタプリタの結果は、結果セットから読み取る特別な出力ポートがある「プルクエリパイプライン」です。 +`INSERT`クエリの結果は、挿入用のデータを書き込む入力ポートを持つ「プッシュクエリパイプライン」です。 +`INSERT SELECT`クエリのインタプリタの結果は、入力または出力を持たず、同時に`SELECT`から`INSERT`にデータをコピーする「完了したクエリパイプライン」です。 + +`InterpreterSelectQuery`はクエリアナリシスと変換のために`ExpressionAnalyzer`と`ExpressionActions`の仕組みを使用します。これは、ほとんどのルールベースのクエリ最適化が行われる場所です。`ExpressionAnalyzer`はかなり複雑で、クエリ変換と最適化を個別のクラスに抽出し、クエリのモジュール変換を可能にするために書き直す必要があります。 + +インタプリタに存在する問題を解決するために、新しい`InterpreterSelectQueryAnalyzer`が開発されました。これは`ExpressionAnalyzer`を使用しない`InterpreterSelectQuery`の新しいバージョンであり、`AST`と`QueryPipeline`の間に`QueryTree`という追加の抽象化層を導入します。これはプロダクションでの使用に完全に準備されていますが、念のためその`enable_analyzer`設定を`false`に設定することでオフにすることができます。 + +## 関数 {#functions} + +通常の関数と集約関数があります。集約関数については次のセクションを参照してください。 + +通常の関数は行数を変更しません。各行を独立して処理するように動作します。実際には、関数は個々の行のためではなく、ベクトル化クエリ実行を実現するために`Block`のデータのために呼び出されます。 + +いくつかの雑多な関数があります。[blockSize](../sql-reference/functions/other-functions.md#blocksize-function-blocksize)、[rowNumberInBlock](../sql-reference/functions/other-functions.md#rownumberinblock-function-rownumberinblock)、および[runningAccumulate](../sql-reference/functions/other-functions.md#runningaccumulate-runningaccumulate)などがあり、ブロック処理を利用し、行の独立性に違反します。 + +ClickHouseは強力な型付けを持っているため、暗黙の型変換はありません。関数が特定の型の組み合わせをサポートしていない場合、例外をスローします。しかし、関数は多くの異なる型の組み合わせに対してオーバーロードされて動作することがあります。例えば、`plus`関数(`+`演算子を実装するための)は、任意の数値型の組み合わせで動作します:`UInt8` + `Float32`、`UInt16` + `Int8`など。また、いくつかの可変的な関数は任意の数の引数を受け取ります。例えば`concat`関数です。 + +関数を実装することはやや不便かもしれません。なぜなら、関数はサポートされるデータ型とサポートされる`IColumns`を明示的にディスパッチするためです。例えば、`plus`関数は各数値型の組み合わせと定数または非定数の左および右の引数に対してC++テンプレートのインスタンス化によるコード生成を持っています。 + +ランタイムコード生成を実装してテンプレートコードの肥大化を避けるには優れた場所です。また、乗算加算を融合させた関数や一つのループ反復で複数の比較を行うことが可能になります。 + +ベクトル化クエリ実行のため、関数はショートサーキットされません。例えば、`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`クエリを実行する際に複数の状態を処理するためです。状態には非自明なコンストラクタとデストラクタがある場合があります。例えば、複雑な集約状態は自分自身で追加のメモリを割り当てることができます。これは、状態を作成し破棄する際の注意が必要であり、所有権の適切な引き継ぎと破棄順序が必要です。 + +集約状態は、分散クエリ実行中にネットワークを介して渡したり、RAMが不足してディスクに書き込むためにシリアル化および逆シリアル化することができます。それらは、`DataTypeAggregateFunction`を持つテーブルに保存してデータのインクリメンタル集約を可能にすることもできます。 + +> 集約関数状態のシリアル化されたデータ形式は、現在バージョン管理されていません。集約状態が一時的にしか保持されない場合、これは問題ではありません。しかし、私たちにはインクリメンタル集約のための`AggregatingMergeTree`テーブルエンジンがあり、すでにプロダクションで使用されています。それが、将来的にシリアル化形式を変更する際に、このような形式互換性が必要になる理由です。 + +## サーバ {#server} + +サーバは異なるインターフェースを実装しています: + +- 任意の外部クライアント用のHTTPインターフェース。 +- ネイティブなClickHouseクライアントや分散クエリ実行中のクロスサーバ通信用のTCPインターフェース。 +- レプリケーションのためのデータ転送用のインターフェース。 + +内部的には、ただのプリミティブなマルチスレッドサーバで、コルーチンやファイバーはありません。サーバは単純なクエリを高率に処理するためではなく、比較的少ない量の複雑なクエリを処理し、それぞれが分析のために膨大なデータを処理できるように設計されています。 + +サーバはクエリ実行に必要な環境を持つ`Context`クラスを初期化します:利用可能なデータベースのリスト、ユーザーとアクセス権限、設定、クラスタ、プロセスリスト、クエリログなどです。インタプリタはこの環境を使用します。 + +サーバTCPプロトコルは、後方および前方互換性を完全に維持します:古いクライアントは新しいサーバと通信でき、新しいクライアントは古いサーバと通信できます。しかし、永遠にそれを維持し続けたくはないので、私たちは約1年後に古いバージョンのサポートを削除しています。 + +:::note +ほとんどの外部アプリケーションに対しては、HTTPインターフェースの使用をお勧めします。これはシンプルで使いやすいです。TCPプロトコルは内部データ構造とより厳密にリンクされており、データブロックを渡すために内部形式を使用し、圧縮データの独自のフレームを使用します。このプロトコルのCライブラリをリリースしていません。これはClickHouseのコードベースのほとんどをリンクする必要があるため、実用的ではありません。 +::: + +## 設定 {#configuration} + +ClickHouseサーバはPOCO C++ライブラリをベースにしており、その構成を表すために`Poco::Util::AbstractConfiguration`を使用します。構成は`Poco::Util::ServerApplication`クラスによって保持され、これを`DaemonBase`クラスが継承し、それがさらに`DB::Server`クラスにより継承され、clickhouse-server自体を実装しています。そのため、構成は`ServerApplication::config()`メソッドでアクセスできます。 + +構成は複数のファイルから(XMLまたはYAML形式で)読み取られ、`ConfigProcessor`クラスによって単一の`AbstractConfiguration`にマージされます。構成はサーバの起動時に読み込まれ、その後、構成ファイルの更新、削除または追加がある場合には再読み込みされます。`ConfigReloader`クラスは、これらの変更の定期的な監視と再読み込み手続きを担当します。`SYSTEM RELOAD CONFIG`クエリも構成を再読み込みさせるトリガーになります。 + +`Server`以外のクエリやサブシステムには構成が`Context::getConfigRef()`メソッドを使ってアクセス可能です。サーバを再起動せずに構成をリロードできるサブシステムは、`Server::main()`メソッド内のリロードコールバックに登録する必要があります。新しい構成にエラーがある場合、多くのサブシステムは新しい構成を無視し、警告メッセージをログに記録し、以前に読み込まれた構成で動作を続行します。`AbstractConfiguration`の性質上、特定のセクションへの参照を渡すことはできないため、通常は`String config_prefix`が使用されます。 + +## スレッドとジョブ {#threads-and-jobs} + +クエリを実行し、副作用を行うためにClickHouseは、スレッドプールからスレッドを割り当て、頻繁なスレッドの作成と破棄を避けます。目的とジョブの構造に応じて選ばれるいくつかのスレッドプールがあります: + * クライアントセッションのためのサーバプール。 + * 一般的なジョブ、バックグラウンド活動、スタンドアロンのスレッドのためのグローバルスレッドプール。 + * 主に何らかのIOでブロックされCPU負荷が少ないジョブのためのIOスレッドプール。 + * 定期的なタスクのためのバックグラウンドプール。 + * ステップに分割できるプリエンプタブルなタスクのためのプール。 + +サーバプールは`Server::main()`メソッドで定義された`Poco::ThreadPool`クラスのインスタンスです。最大で`max_connection`スレッドを持つことができます。それぞれのスレッドは1つのアクティブな接続に専念しています。 + +グローバルスレッドプールは`GlobalThreadPool`シングルトンクラスです。これからスレッドを割り当てるには`ThreadFromGlobalPool`を使用します。これは`std::thread`に似たインターフェースを持っており、グローバルプールからスレッドをプルし、必要な初期化をすべて行います。以下の設定で構成されます: + * `max_thread_pool_size` - プール内スレッド数の制限。 + * `max_thread_pool_free_size` - 新しいジョブを待つアイドルスレッド数の制限。 + * `thread_pool_queue_size` - スケジュールされたジョブ数の制限。 + +グローバルプールはユニバーサルであり、以下に説明するすべてのプールはその上に実装されています。これはプールの階層として考えることができます。特定のプールは`ThreadPool`クラスを使用してグローバルプールからそのスレッドを取得します。そのため、特定のプールの主な目的は、同時ジョブの数に制限を適用し、ジョブのスケジュールを行うことです。スレッドプールのスレッド数より多くのジョブがスケジュールされている場合は、`ThreadPool`が優先順位付きのキューにジョブを蓄積します。それぞれのジョブには整数の優先度があります。デフォルトの優先度はゼロです。優先度の値が高いジョブは、優先度の値が低いジョブより先に開始されます。しかし、すでに実行されているジョブの間には違いはなく、そのため優先度は主にプールが過負荷状態であるときに重要です。 + +IOスレッドプールは、`IOThreadPool::get()`メソッドでアクセス可能なプレーンな`ThreadPool`として実装されています。これは、`max_io_thread_pool_size`、`max_io_thread_pool_free_size`、および`io_thread_pool_queue_size`設定と同様に構成されます。IOスレッドプールの主な目的は、グローバルプールをIOジョブで消耗させないようにし、それがクエリのためにCPUを完全に活用できないことを避けることです。S3へのバックアップは多くのIO操作を行うため、インタラクティブなクエリへの影響を避けるために別の`BackupsIOThreadPool`があり、`max_backups_io_thread_pool_size`、`max_backups_io_thread_pool_free_size`、および`backups_io_thread_pool_queue_size`設定で構成されます。 + +定期的なタスク実行のために`BackgroundSchedulePool`クラスがあります。`BackgroundSchedulePool::TaskHolder`オブジェクトを使用してタスクを登録することができ、プールは2つのジョブが同時に実行されないことを保証します。タスク実行を特定の将来の瞬間に延期したり、一時的にタスクを非アクティブ化することもできます。グローバル`Context`はこれを異なる目的でいくつかのインスタンスを提供します。一般的な目的のタスクには`Context::getSchedulePool()`が使用されます。 + +プリエンプタブルなタスクのための特化したスレッドプールもあります。そのような`IExecutableTask`タスクは、ステップと呼ばれるジョブの順序付けられたシーケンスに分割できます。短いタスクが長いタスクより優先されるようにスケジュールするために`MergeTreeBackgroundExecutor`が使用されます。名前が示すように、バックグラウンドでのMergeTree関連の操作、例えばマージやミューテーション、フェッチ、ムーブのために使用されます。プールのインスタンスは`Context::getCommonExecutor()`およびそれに類似するメソッドで使用可能です。 + +どのプールをジョブに使用するかに関係なく、開始時にこのジョブのために`ThreadStatus`インスタンスが作成されます。これにはすべてのスレッド固有の情報(スレッドID、クエリID、パフォーマンスカウンター、リソース消費量など)が含まれます。ジョブはローカルスレッドポインタによって`CurrentThread::get()`呼び出しでこれにアクセスします。そのため、すべての関数にこれを渡す必要はありません。 + +スレッドがクエリ実行に関連している場合、`ThreadStatus`に添付される最も重要なものはクエリコンテキスト`ContextPtr`です。すべてのクエリには、サーバプール内のマスタースレッドがあります。マスタースレッドは`ThreadStatus::QueryScope query_scope(query_context)`オブジェクトを保持することでアタッチメンを行います。マスタースレッドはまた、`ThreadGroupStatus`オブジェクトで表されるスレッドグループを作成します。このクエリ実行中に割り当てられるすべての追加スレッドは`CurrentThread::attachTo(thread_group)`呼び出しでそのスレッドグループに添付されます。スレッドグループはプロファイルイベントカウンタの集約し、単一タスクに専用された全スレッドによるメモリ消費を追跡するのに使用されます(詳細は`MemoryTracker`および`ProfileEvents::Counters`クラスを参照してください)。 + +## 同時実行制御 {#concurrency-control} + +並列実行可能なクエリは、`max_threads`設定を使用して制限されます。この設定のデフォルト値は、単一クエリがすべてのCPUコアを最大限に活用できるように選択されています。しかし、複数の同時実行クエリがあり、それぞれがデフォルトの`max_threads`設定値を使用する場合はどうでしょうか?その場合、クエリはCPUリソースを共有します。OSは、新規スレッドを頻繁に切り替えることで公平性を保証しますが、これにはそれなりのパフォーマンスペナルティがあります。`ConcurrencyControl`はこのペナルティを処理し、多くのスレッドの割り当てを避けることに役立ちます。スロットの概念が導入されています。スロットは同時実行性の単位です:スレッドクエリを実行するためには、事前にスロットを取得し、スレッドを停止したらそれを解放する必要があります。スロットの数はサーバで全体に制限されています。合計スロット数を超えた場合には、複数の同時実行クエリがCPUスロットを競争します。`ConcurrencyControl`は、この競争を公平に解決するためにCPUスロットのスケジューリングを行う責任があります。 + +それぞれのスロットは、以下の状態を持つ独立した状態機械として見ることができます: + * `free`: スロットは任意のクエリが割り当てるために利用可能です。 + * `granted`: スロットは特定のクエリによって`allocated`されますが、まだスレッドに獲得されていません。 + * `acquired`: スロットは特定のクエリによって`allocated`され、スレッドによって獲得されます。 + +注:`allocated`されたスロットは`granted`と`acquired`の2つの異なる状態にあることがあります。前者は移行状態であり、実際にはスロットがクエリに割り当てられた瞬間からそのクエリのいずれかのスレッドによってアップスケーリング手続きが実行される瞬間までの短い状態です。 + +```mermaid +stateDiagram-v2 + direction LR + [*] --> free + free --> allocated: allocate + state allocated { + direction LR + [*] --> granted + granted --> acquired: acquire + acquired --> [*] + } + allocated --> free: release +``` + +`ConcurrencyControl`のAPIは以下の機能で構成されています: +1. クエリのためのリソース割り当てを作成:`auto slots = ConcurrencyControl::instance().allocate(1, max_threads);`。少なくとも1つのスロットを割り当て、最大で`max_threads`のスロットを割り当てます。最初のスロットは即座に許可されますが、残りのスロットは後で許可される場合があります。そのため限度は柔軟です。なぜなら、すべてのクエリは少なくとも1つのスレッドを取得します。 +2. それぞれのスレッドは割り当てからスロットを獲得する必要があります:`while (auto slot = slots->tryAcquire()) spawnThread([slot = std::move(slot)] { ... });`。 +3. スロットの全体数を更新します:`ConcurrencyControl::setMaxConcurrency(concurrent_threads_soft_limit_num)`。サーバ再起動せずに実行中に行うことができます。 + +このAPIにより、クエリは少なくとも1つのスレッドで開始し(CPU圧力がある場合)、その後`max_threads`までスケールアップできます。 + +## 分散クエリ実行 {#distributed-query-execution} + +クラスターセットアップでのサーバーは主に独立しています。クラスターの1つまたはすべてのサーバーに`Distributed`テーブルを作成できます。`Distributed`テーブルはデータ自体を保存せず、クラスター内の複数ノードのすべてのローカルテーブルへの「ビュー」を提供します。`Distributed`テーブルからSELECTすると、そのクエリを再書き込みし、負荷分散設定に応じてリモートノードを選択し、クエリを送信します。`Distributed`テーブルは、リモートサーバにクエリを送信し、異なるサーバからの中間結果をマージできる段階まで処理させ、次に中間結果を受け取り、それをマージします。分散テーブルはできるだけ多くの作業をリモートサーバに分配し、ネットワーク上で中間データをあまり送信しません。 + +INまたはJOIN句内のサブクエリを持ち、それぞれが`Distributed`テーブルを使用する場合、物事はより複雑になります。これらのクエリの実行には異なる戦略があります。 + +分散クエリ実行のためのグローバルクエリプランはありません。各ノードはそのタスクのためのローカルクエリプランのみを持っています。私たちは、リモートノードにクエリを送信し、次に結果をマージするシンプルなワンパス分散クエリ実行のみを持っています。しかし、これだけでは、高カーディナリティの`GROUP BY`を持つ複雑なクエリやJOINのための多量の一時データを持つクエリには実現可能ではありません。そのような場合、サーバー間でデータを「再シャッフル」する必要があり、追加の調整が必要です。ClickHouseはそのようなクエリ実行をサポートしておらず、このための作業が必要です。 + +## MergeTree {#merge-tree} + +`MergeTree`は主キーでインデックスを付けることをサポートするストレージエンジンのファミリーです。主キーはカラムまたは式の任意のタプルにすることができます。`MergeTree`テーブル内のデータは「パーツ」に保存されます。各パーツは主キー順にデータを保存するため、データは主キータプルにより辞書順に整列されています。すべてのテーブルカラムは、これらのパーツの中の個別の`column.bin`ファイルに保存されます。ファイルは圧縮されたブロックで構成されています。各ブロックは、通常、未圧縮データの64 KBから1 MBの範囲で、平均値サイズに依存します。ブロックはカラム値を連続して一つずつ配置されています。カラム値は各カラムで同じ順序にあり(主キーが順序を定義しています)、多くのカラムを反復するときに対応する行の値が得られます。 + +主キー自体は「スパース」です。これは、各行を指すのではなく、データのいくつかの範囲だけを指します。`primary.idx`と呼ばれる別のファイルには、N番目の行ごとに主キーの値が記録されています。ここでNは`index_granularity`(通常、N = 8192)と呼ばれます。また、各カラムには、データファイル内の各N番目の行へのオフセットを持つ`column.mrk`ファイルがあります。各マークはペアであり、ファイル内の圧縮ブロックの先頭へのオフセットと、デコンプレッションされたブロックにおけるデータの最初へのオフセットです。通常、圧縮ブロックはマークと整合されており、デコンプレッションされたブロック内のオフセットはゼロです。`primary.idx`のデータは常にメモリに存在し、`column.mrk`ファイルのデータはキャッシュされます。 + +`MergeTree`内のパーツから何かを読み取ろうとすると、`primary.idx`データを見て、要求されたデータを含む可能性のある範囲を見つけ、次に`column.mrk`データを見て、それらの範囲を読み始める場所のオフセットを計算します。スパースのため、余計なデータが読み取られるかもしれません。ClickHouseは、シンプルなポイントクエリの高負荷に適していません。なぜなら、各キーのために`index_granularity`行を持つ全範囲が読み取られる必要があり、各カラムのために圧縮ブロック全体がデコンプレッションされる必要があるからです。私たちは、単一のサーバで数兆行を管理し、索引のための目立たないメモリ消費を可能にするために索引をスパースにしました。また、主キーがスパースであるため、一意ではありません:テーブルへのINSERT時にはキーが存在するかどうかを確認できません。テーブル内に同じキーを持つ多くの行がある場合があります。 + +`MergeTree`にデータを挿入すると、そのバッチが主キー順に並べ替えられ、新しいパーツを形成します。バックグラウンドスレッドがいくつかのパーツを選び、それらを単一のソートされたパーツに統合する作業を定期的に行い、パーツの数を比較的低く保ちます。これは`MergeTree`と呼ばれる理由です。もちろん、マージは「書き込み増幅」につながります。すべてのパーツは不変であり:作成され、削除されるだけで修正されません。SELECTが実行されるときは、テーブルのスナップショット(パーツのセット)が保持されます。マージ後、障害発生後のリカバリーを容易にするために一時的に古いパーツも保持されており、マージされたパーツが壊れていると見なされる場合は、そのソースパーツで置き換えることができます。 + +`MergeTree`はLSMツリーではありません。なぜなら、MEMTABLEおよびLOGを含まないためです。挿入されたデータはファイルシステムに直接書き込みます。この動作により、MergeTreeはバッチでデータを挿入するのにより適します。したがって、頻繁に少量の行を挿入するのはMergeTreeには理想的ではありません。例えば、数行を1秒ごとに挿入することは可能ですが、1秒に千回行うことはMergeTreeに最適ではありません。しかし、小規模な挿入を克服するための非同期挿入モードがあります。私たちは、私たちのアプリケーションでバッチでデータをすでに挿入しているため、簡潔さのためにこの方法を取りました + +背景合併中に追加作業を行うMergeTreeエンジンもあります。例としては、`CollapsingMergeTree`や`AggregatingMergeTree`があります。これらは特別な更新サポートとして扱うことができます。これらは実際には更新ではなく、ユーザーは通常、背景合併が実行される時間を制御できず、`MergeTree`テーブル内のデータはほとんどの場合、完全に合併された形式ではなく、複数のパーツで保存されています。 + +## レプリケーション {#replication} + +ClickHouseのレプリケーションはテーブルごとに設定できます。単一サーバでいくつかのレプリケートされたテーブルとレプリケートされていないテーブルを持つことができ、異なる方法でレプリケートされたテーブルも持つことができます。例えば、二重レプリケーションを持つテーブルと三重レプリケーションを持つ別のテーブルです。 + +レプリケーションは、`ReplicatedMergeTree`ストレージエンジンで実装されています。`ZooKeeper`内のパスはストレージエンジンのパラメータとして指定されます。同じ`ZooKeeper`パスを持つすべてのテーブルはお互いのレプリカになり、データを同期し、一貫性を保ちます。レプリカはテーブルの作成または削除で動的に追加および削除できます。 + +レプリケーションは、非同期のマルチマスター方式を使用します。`ZooKeeper`とのセッションを持つ任意のレプリカにデータを挿入でき、そのデータは他のすべてのレプリカに非同期でレプリケートされます。ClickHouseはUPDATEをサポートしていないため、レプリケーションは競合しません。デフォルトでは、挿入のクォーラムによる確認がないため、新しく挿入されたデータはノードの障害が発生した場合に失われる可能性があります。挿入クォーラムは、`insert_quorum`設定を使用して有効にできます。 + +レプリケーションのメタデータはZooKeeperに格納されます。実行するアクションのリストレプリケーションログがあります。アクションは、パーツの取得、パーツのマージ、パーティションの削除などです。各レプリカは、レプリケーションログをキューにコピーし、キューからアクションを実行します。例えば、挿入時には「パーツを取得」アクションがログに作成され、すべてのレプリカはそのパーツをダウンロードします。マージは、すべてのレプリカでバイト一致の結果を得るために調整されています。すべてのパーツはすべてのレプリカで同じようにマージされます。リーダーの一つは最初に新しいマージを開始し、「マージパーツ」アクションをログに書き込みます。複数のレプリカ(またはすべて)が同時にリーダーになることができます。レプリカがリーダーにならないように、`merge_tree`設定の`replicated_can_become_leader`を使用して防ぐことができます。リーダーは背景合併のスケジュールを担当します。 + +レプリケーションは物理的です:クエリではなく、圧縮された部分だけがノード間で転送されます。マージは通常、ネットワークコストを削減し、ネットワーク増幅を回避するために各レプリカで独立して処理されます。レプリケーションの遅れが大きい場合に限り、大きくマージされたパーツがネットワーク内で送信されます。 + +また、各レプリカはその状態をZooKeeperにセットされ、それらのチェックサムも含まれる。ローカルファイルシステムでの状態がZooKeeperでの参照状態と異なる場合、そのレプリカは他のレプリカから欠落したり破壊されたパーツをダウンロードして一貫性を回復します。予期しない、もしくは破損したデータがローカルファイルシステム上にある場合、ClickHouseはそれを削除せず、別のディレクトリに移動し忘れます。 + +:::note +ClickHouseクラスターは独立したシャードで構成されており、それぞれのシャードにはレプリカがあります。クラスターは**エラスティック**ではないため、新しいシャードを追加しても、シャード間でデータが自動的に再分散されません。代わりに、クラスターの負荷が均等に調整されると想定されます。小さなクラスター、例えば10ノード程度ではこの実装はコントロールがしやすいですが、プロダクションで使用する数百ノードのクラスターに対して、このアプローチは大きな欠点になります。クラスター全体に広がり、自動的にクラスター間で分割しバランスされる動的にレプリケートされるリージョンを持つテーブルエンジンを実装する必要があります。 +::: diff --git a/docs/ja/development/build-cross-arm.md b/docs/ja/development/build-cross-arm.md new file mode 100644 index 00000000000..df243f8ae96 --- /dev/null +++ b/docs/ja/development/build-cross-arm.md @@ -0,0 +1,10 @@ +--- +slug: /ja/development/build-cross-arm +sidebar_position: 67 +title: Linux上でAARCH64 (ARM64)アーキテクチャ用にClickHouseをビルドする方法 +sidebar_label: AARCH64 (ARM64)用ビルド +--- + +AArch64マシンを使用しており、AArch64用にClickHouseをビルドしたい場合は、通常通りにビルドしてください。 + +x86_64マシンを使用しており、AArch64用にクロスコンパイルしたい場合は、`cmake`に以下のフラグを追加してください: `-DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake` diff --git a/docs/ja/development/build-cross-loongarch.md b/docs/ja/development/build-cross-loongarch.md new file mode 100644 index 00000000000..e58c296ecd6 --- /dev/null +++ b/docs/ja/development/build-cross-loongarch.md @@ -0,0 +1,31 @@ +--- +slug: /ja/development/build-cross-loongarch +sidebar_position: 70 +title: LoongArch64アーキテクチャ向けにLinuxでClickHouseをビルドする方法 +sidebar_label: LoongArch64向けLinuxでのビルド +--- + +執筆時点(2024/03/15)では、loongarch向けのビルドは非常にエクスペリメンタルとされています。すべての機能を有効にできるわけではありません。 + +これは、Linuxマシンを使用して、LoongArch64 CPUアーキテクチャの別のLinuxマシンで実行する`clickhouse`バイナリをビルドしたい場合のガイドです。これは、Linuxサーバー上で実行される継続的インテグレーションチェックを目的としています。 + +LoongArch64向けのクロスビルドは、[ビルド手順](../development/build.md)に基づいています。まずはそれに従ってください。 + +## Clang-18のインストール + +UbuntuまたはDebianのセットアップに対して、https://apt.llvm.org/ の手順に従うか、次のコマンドを実行します。 +``` +sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +``` + +## ClickHouseのビルド {#build-clickhouse} + +ビルドに必要なllvmのバージョンは18.1.0以上でなければなりません。 +``` bash +cd ClickHouse +mkdir build-loongarch64 +CC=clang-18 CXX=clang++-18 cmake . -Bbuild-loongarch64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-loongarch64.cmake +ninja -C build-loongarch64 +``` + +この結果として得られるバイナリは、LoongArch64 CPUアーキテクチャを搭載したLinuxでのみ実行できます。 diff --git a/docs/ja/development/build-cross-osx.md b/docs/ja/development/build-cross-osx.md new file mode 100644 index 00000000000..55e41e2a1a2 --- /dev/null +++ b/docs/ja/development/build-cross-osx.md @@ -0,0 +1,63 @@ +--- +slug: /ja/development/build-cross-osx +sidebar_position: 66 +title: Linux上でmacOS用ClickHouseをビルドする方法 +sidebar_label: Linux上でmacOS用にビルド +--- + +これは、Linuxマシンを使用してOS Xで実行される`clickhouse`バイナリをビルドしたい場合の手順です。 これはLinuxサーバー上で実行される継続的なインテグレーションチェックを目的としています。 macOS上で直接ClickHouseをビルドしたい場合は、[別の手順](../development/build-osx.md)に進んでください。 + +macOS用のクロスビルドは、[ビルド手順](../development/build.md)に基づいていますので、最初にそれに従ってください。 + +以下のセクションでは、`x86_64` macOS用にClickHouseをビルドするための手順を説明します。ARMアーキテクチャを対象とする場合は、すべての`x86_64`を`aarch64`に置き換えてください。たとえば、手順内の`x86_64-apple-darwin`を`aarch64-apple-darwin`に置き換えます。 + +## clang-18をインストールする + +UbuntuまたはDebianセットアップに合ったhttps://apt.llvm.org/の指示に従ってください。 たとえば、Bionicのコマンドは以下のようになります: + +```bash +sudo echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-17 main" >> /etc/apt/sources.list +sudo apt-get install clang-18 +``` + +## クロスコンパイルツールセットをインストールする {#install-cross-compilation-toolset} + +`cctools`をインストールするパスを${CCTOOLS}として記憶しておきましょう + +```bash +mkdir ~/cctools +export CCTOOLS=$(cd ~/cctools && pwd) +cd ${CCTOOLS} + +git clone https://github.com/tpoechtrager/apple-libtapi.git +cd apple-libtapi +git checkout 15dfc2a8c9a2a89d06ff227560a69f5265b692f9 +INSTALLPREFIX=${CCTOOLS} ./build.sh +./install.sh +cd .. + +git clone https://github.com/tpoechtrager/cctools-port.git +cd cctools-port/cctools +git checkout 2a3e1c2a6ff54a30f898b70cfb9ba1692a55fad7 +./configure --prefix=$(readlink -f ${CCTOOLS}) --with-libtapi=$(readlink -f ${CCTOOLS}) --target=x86_64-apple-darwin +make install +``` + +また、macOS X SDKを作業ツリーにダウンロードする必要があります。 + +```bash +cd ClickHouse/cmake/toolchain/darwin-x86_64 +curl -L 'https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.0.sdk.tar.xz' | tar xJ --strip-components=1 +``` + +## ClickHouseをビルドする {#build-clickhouse} + +```bash +cd ClickHouse +mkdir build-darwin +cd build-darwin +CC=clang-18 CXX=clang++-18 cmake -DCMAKE_AR:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ar -DCMAKE_INSTALL_NAME_TOOL=${CCTOOLS}/bin/x86_64-apple-darwin-install_name_tool -DCMAKE_RANLIB:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ranlib -DLINKER_NAME=${CCTOOLS}/bin/x86_64-apple-darwin-ld -DCMAKE_TOOLCHAIN_FILE=cmake/darwin/toolchain-x86_64.cmake .. +ninja +``` + +生成されるバイナリはMach-O実行形式で、Linux上では実行できません。 diff --git a/docs/ja/development/build-cross-riscv.md b/docs/ja/development/build-cross-riscv.md new file mode 100644 index 00000000000..b571b79a3b3 --- /dev/null +++ b/docs/ja/development/build-cross-riscv.md @@ -0,0 +1,30 @@ +--- +slug: /ja/development/build-cross-riscv +sidebar_position: 68 +title: LinuxでRISC-V 64アーキテクチャ用ClickHouseをビルドする方法 +sidebar_label: RISC-V 64用Linuxでのビルド +--- + +執筆時点(2021年11月11日)では、RISC-V用のビルドは非常にエクスペリメンタルと考えられています。すべての機能を有効にすることはできません。 + +これは、Linuxマシンを持っていて、そのマシンでRISC-V 64 CPUアーキテクチャを備えた別のLinuxマシンで実行する`clickhouse`バイナリをビルドしたい場合の手順です。これはLinuxサーバーで実行される継続的インテグレーションチェック用に意図されています。 + +RISC-V 64用のクロスビルドは[ビルド手順](../development/build.md)に基づいているため、まずそれに従ってください。 + +## Clang-18のインストール + +あなたのUbuntuまたはDebian環境に合わせて、https://apt.llvm.org/ の指示に従ってください。または以下のコマンドを実行します。 +``` +sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +``` + +## ClickHouseをビルドする {#build-clickhouse} + +``` bash +cd ClickHouse +mkdir build-riscv64 +CC=clang-18 CXX=clang++-18 cmake . -Bbuild-riscv64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-riscv64.cmake -DGLIBC_COMPATIBILITY=OFF -DENABLE_LDAP=OFF -DOPENSSL_NO_ASM=ON -DENABLE_JEMALLOC=ON -DENABLE_PARQUET=OFF -DENABLE_GRPC=OFF -DENABLE_HDFS=OFF -DENABLE_MYSQL=OFF +ninja -C build-riscv64 +``` + +生成されたバイナリはRISC-V 64 CPUアーキテクチャを持つLinuxでのみ実行可能です。 diff --git a/docs/ja/development/build-cross-s390x.md b/docs/ja/development/build-cross-s390x.md new file mode 100644 index 00000000000..93a541f3e97 --- /dev/null +++ b/docs/ja/development/build-cross-s390x.md @@ -0,0 +1,207 @@ +--- +slug: /ja/development/build-cross-s390x +sidebar_position: 69 +title: LinuxでのClickHouseのビルド、実行、およびデバッグ(s390x用、zLinux) +sidebar_label: Linuxでのs390x(zLinux)用ビルド +--- + +執筆時点(2024年5月)では、s390xプラットフォームのサポートはエクスペリメンタルなものとされており、一部機能はs390xでは無効化または不具合が発生しています。 + +## s390x向けClickHouseのビルド + +s390xには2つのOpenSSL関連のビルドオプションがあります: +- デフォルトでは、OpenSSLはs390x上で共有ライブラリとしてビルドされます。これは他のすべてのプラットフォームと異なり、OpenSSLは静的ライブラリとしてビルドされます。 +- OpenSSLを静的ライブラリとしてビルドするには、CMakeに`-DENABLE_OPENSSL_DYNAMIC=0`を渡します。 + +これらの指示は、ホストマシンがx86_64であり、[ビルド手順](../development/build.md)に基づいてネイティブにビルドするために必要なツールをすべて備えていると想定しています。また、ホストがUbuntu 22.04であることを前提としていますが、以下の指示はUbuntu 20.04でも動作するはずです。 + +ネイティブにビルドするために使用されるツールをインストールすることに加えて、以下の追加パッケージが必要です: + +```bash +apt-get install binutils-s390x-linux-gnu libc6-dev-s390x-cross gcc-s390x-linux-gnu binfmt-support qemu-user-static +``` + +Rustコードをクロスコンパイルしたい場合は、s390x用のRustクロスコンパイルターゲットをインストールします: + +```bash +rustup target add s390x-unknown-linux-gnu +``` + +s390xのビルドにはmoldリンカを使用します。https://github.com/rui314/mold/releases/download/v2.0.0/mold-2.0.0-x86_64-linux.tar.gz からダウンロードし、`$PATH`に配置してください。 + +s390x向けにビルドするには: + +```bash +cmake -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-s390x.cmake .. +ninja +``` + +## 実行 + +ビルドが完了したら、次のコマンドでバイナリを実行できます: + +```bash +qemu-s390x-static -L /usr/s390x-linux-gnu ./clickhouse +``` + +## デバッグ + +LLDBをインストールします: + +```bash +apt-get install lldb-15 +``` + +s390xの実行ファイルをデバッグするには、QEMUのデバッグモードでclickhouseを実行します: + +```bash +qemu-s390x-static -g 31338 -L /usr/s390x-linux-gnu ./clickhouse +``` + +別のシェルでLLDBを実行してアタッチします。``と``を環境に合った値に置き換えてください。 + +```bash +lldb-15 +(lldb) target create ./clickhouse +Current executable set to '//ClickHouse//programs/clickhouse' (s390x). +(lldb) settings set target.source-map //ClickHouse +(lldb) gdb-remote 31338 +Process 1 stopped +* thread #1, stop reason = signal SIGTRAP + frame #0: 0x0000004020e74cd0 +-> 0x4020e74cd0: lgr %r2, %r15 + 0x4020e74cd4: aghi %r15, -160 + 0x4020e74cd8: xc 0(8,%r15), 0(%r15) + 0x4020e74cde: brasl %r14, 275429939040 +(lldb) b main +Breakpoint 1: 9 locations. +(lldb) c +Process 1 resuming +Process 1 stopped +* thread #1, stop reason = breakpoint 1.1 + frame #0: 0x0000004005cd9fc0 clickhouse`main(argc_=1, argv_=0x0000004020e594a8) at main.cpp:450:17 + 447 #if !defined(FUZZING_MODE) + 448 int main(int argc_, char ** argv_) + 449 { +-> 450 inside_main = true; + 451 SCOPE_EXIT({ inside_main = false; }); + 452 + 453 /// PHDR cache is required for query profiler to work reliably +``` + +## Visual Studio Code統合 + +- ビジュアルデバッグには[CodeLLDB](https://github.com/vadimcn/vscode-lldb)拡張機能が必要です。 +- [Command Variable](https://github.com/rioj7/command-variable)拡張機能を使用すると、[CMake Variants](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/variants.md)を使用して動的な起動を助けることができます。 +- LLVMをインストールしているバックエンドを必ず設定してください(例:`"lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-15.so"`)。 +- 起動前に必ずデバッグモードでclickhouse実行ファイルを実行してください。(これを自動化する`preLaunchTask`を作成することも可能です。) + +### 例の設定 +#### cmake-variants.yaml +```yaml +buildType: + default: relwithdebinfo + choices: + debug: + short: Debug + long: Emit debug information + buildType: Debug + release: + short: Release + long: Optimize generated code + buildType: Release + relwithdebinfo: + short: RelWithDebInfo + long: Release with Debug Info + buildType: RelWithDebInfo + tsan: + short: MinSizeRel + long: Minimum Size Release + buildType: MinSizeRel + +toolchain: + default: default + description: Select toolchain + choices: + default: + short: x86_64 + long: x86_64 + s390x: + short: s390x + long: s390x + settings: + CMAKE_TOOLCHAIN_FILE: cmake/linux/toolchain-s390x.cmake +``` + +#### launch.json +```json +{ + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "custom", + "name": "(lldb) Launch s390x with qemu", + "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"], + "processCreateCommands": ["gdb-remote 2159"], + "preLaunchTask": "Run ClickHouse" + } + ] +} +``` + +#### settings.json +異なるビルドを`build`フォルダ内の異なるサブフォルダに配置する設定です。 +```json +{ + "cmake.buildDirectory": "${workspaceFolder}/build/${buildKitVendor}-${buildKitVersion}-${variant:toolchain}-${variant:buildType}", + "lldb.library": "/usr/lib/x86_64-linux-gnu/liblldb-15.so" +} +``` + +#### run-debug.sh +```sh +#! /bin/sh +echo 'Starting debugger session' +cd $1 +qemu-s390x-static -g 2159 -L /usr/s390x-linux-gnu $2 $3 $4 +``` + +#### tasks.json +`tmp`フォルダ内で`server`モードでコンパイルされた実行ファイルを、`programs/server/config.xml`の設定で実行するタスクを定義します。 +```json +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Run ClickHouse", + "type": "shell", + "isBackground": true, + "command": "${workspaceFolder}/.vscode/run-debug.sh", + "args": [ + "${command:cmake.launchTargetDirectory}/tmp", + "${command:cmake.launchTargetPath}", + "server", + "--config-file=${workspaceFolder}/programs/server/config.xml" + ], + "problemMatcher": [ + { + "pattern": [ + { + "regexp": ".", + "file": 1, + "location": 2, + "message": 3 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": "^Starting debugger session", + "endsPattern": ".*" + } + } + ] + } + ] +} +``` diff --git a/docs/ja/development/build-osx.md b/docs/ja/development/build-osx.md new file mode 100644 index 00000000000..f661d8a3b11 --- /dev/null +++ b/docs/ja/development/build-osx.md @@ -0,0 +1,137 @@ +--- +slug: /ja/development/build-osx +sidebar_position: 65 +sidebar_label: macOSでビルド +title: macOSでClickHouseをビルドする方法 +description: macOS向けにClickHouseをビルドする方法 +--- + +:::info ClickHouseを自分でビルドする必要はありません! +[クイックスタート](https://clickhouse.com/#quick-start)に記載されているように、事前にビルドされたClickHouseをインストールできます。**macOS (Intel)** または **macOS (Apple silicon)** のインストール手順に従ってください。 +::: + +このビルドはmacOS 10.15 (Catalina)以降のx86_64 (Intel)およびarm64 (Apple Silicon)で、Homebrewの標準Clangを使用して動作します。 + +:::note +AppleのXCode `apple-clang`でもコンパイルすることが可能ですが、これは強く推奨されません。 +::: + +## Homebrewをインストールする {#install-homebrew} + +まず、[Homebrew](https://brew.sh/)をインストールしてください。 + +## AppleのClangを使用する場合(非推奨):XCodeおよびコマンドラインツールのインストール {#install-xcode-and-command-line-tools} + +App Storeから最新の[XCode](https://apps.apple.com/am/app/xcode/id497799835?mt=12)をインストールします。 + +少なくとも一度開いて、エンドユーザーライセンス契約に同意し、自動的に必要なコンポーネントをインストールします。 + +次に、最新のコマンドラインツールがシステムにインストールされて選択されていることを確認してください: + +``` bash +sudo rm -rf /Library/Developer/CommandLineTools +sudo xcode-select --install +``` + +## 必要なコンパイラ、ツール、およびライブラリのインストール {#install-required-compilers-tools-and-libraries} + +``` bash +brew update +brew install ccache cmake ninja libtool gettext llvm gcc binutils grep findutils nasm +``` + +## ClickHouseソースのチェックアウト {#checkout-clickhouse-sources} + +``` bash +git clone --recursive git@github.com:ClickHouse/ClickHouse.git +# ...または、https://github.com/ClickHouse/ClickHouse.git をリポジトリURLとして使用することもできます。 +``` + +Appleはデフォルトでケースインセンシティブなファイルシステムを使用しています。通常、これはコンパイルに影響はありません(特にスクラッチメイクは問題なく動作します)が、`git mv`のようなファイル操作を混乱させることがあります。macOSで本格的な開発を行う場合、ソースコードがケースセンシティブなディスクボリュームに保存されていることを確認してください。たとえば、[これらの手順](https://brianboyko.medium.com/a-case-sensitive-src-folder-for-mac-programmers-176cc82a3830)を参照してください。 + +## ClickHouseをビルドする {#build-clickhouse} + +Homebrewの標準Clangコンパイラを使用してビルドする場合(唯一の**推奨される**方法): + +``` bash +cd ClickHouse +mkdir build +export PATH=$(brew --prefix llvm)/bin:$PATH +cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix llvm)/bin/clang++ -S . -B build +cmake --build build +# 結果として生成されるバイナリは次の場所に作成されます: build/programs/clickhouse +``` + +XCodeのネイティブAppleClangコンパイラを使用してXCode IDEでビルドする場合(このオプションは開発ビルドとワークフローのみであり、あなたが何をしているかについて理解がある場合を除き、**推奨されません**): + +``` bash +cd ClickHouse +rm -rf build +mkdir build +cd build +XCODE_IDE=1 ALLOW_APPLECLANG=1 cmake -G Xcode -DCMAKE_BUILD_TYPE=Debug -DENABLE_JEMALLOC=OFF .. +cmake --open . +# ...次に、XCode IDEでALL_BUILDスキームを選択し、ビルドプロセスを開始します。 +# 結果として生成されるバイナリは次の場所に作成されます: ./programs/Debug/clickhouse +``` + +## 注意事項 {#caveats} + +`clickhouse-server`を実行する予定がある場合、システムの`maxfiles`変数を増やす必要があります。 + +:::note +`sudo`を使用する必要があります。 +::: + +そのためには、次の内容で`/Library/LaunchDaemons/limit.maxfiles.plist`ファイルを作成します: + +``` xml + + + + + Label + limit.maxfiles + ProgramArguments + + launchctl + limit + maxfiles + 524288 + 524288 + + RunAtLoad + + ServiceIPC + + + +``` + +ファイルに正しい権限を与えます: + +``` bash +sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist +``` + +ファイルが正しいことを確認します: + +``` bash +plutil /Library/LaunchDaemons/limit.maxfiles.plist +``` + +ファイルをロードします(または再起動します): + +``` bash +sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist +``` + +機能しているか確認するには、`ulimit -n`または`launchctl limit maxfiles`コマンドを使用します。 + +## ClickHouseサーバーを実行する + +``` bash +cd ClickHouse +./build/programs/clickhouse-server --config-file ./programs/server/config.xml +``` diff --git a/docs/ja/development/build.md b/docs/ja/development/build.md new file mode 100644 index 00000000000..48d2649fb79 --- /dev/null +++ b/docs/ja/development/build.md @@ -0,0 +1,152 @@ +--- +slug: /ja/development/build +sidebar_position: 64 +sidebar_label: Linux でのビルド +title: Linux での ClickHouse のビルド方法 +description: Linux での ClickHouse のビルド方法 +--- + +対応プラットフォーム: + +- x86_64 +- AArch64 +- PowerPC 64 LE(エクスペリメンタル) +- RISC-V 64(エクスペリメンタル) + +## Ubuntu でのビルド + +以下のチュートリアルは Ubuntu Linux に基づいています。 +適切な変更を加えれば、他の Linux ディストリビューションでも機能するはずです。 +開発に推奨される最小の Ubuntu バージョンは 22.04 LTS です。 + +### 必要条件のインストール {#install-prerequisites} + +``` bash +sudo apt-get update +sudo apt-get install git cmake ccache python3 ninja-build nasm yasm gawk lsb-release wget software-properties-common gnupg +``` + +### Clang コンパイラのインストールと使用 + +Ubuntu/Debian では LLVM の自動インストールスクリプトを使用できます。[こちら](https://apt.llvm.org/)をご覧ください。 + +``` bash +sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +``` + +注意: 問題がある場合は、次の方法も使用できます: + +```bash +sudo apt-get install software-properties-common +sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test +``` + +他の Linux ディストリビューションでは、LLVM の[事前ビルドパッケージ](https://releases.llvm.org/download.html)の利用可能性を確認してください。 + +2024 年 3 月時点で、clang-17 以上が動作します。 +GCC はコンパイラとしてサポートされていません。 +特定の Clang バージョンでビルドするには: + +:::tip +これは任意です。指示に従って Clang をインストールしたばかりの場合は、 +この環境変数を設定する前にインストールされているバージョンを確認してください。 +::: + +``` bash +export CC=clang-18 +export CXX=clang++-18 +``` + +### Rust コンパイラのインストール + +まず、公式の [rust ドキュメント](https://www.rust-lang.org/tools/install)で `rustup` をインストールする手順に従ってください。 + +C++ 依存関係と同様に、ClickHouse はベンダリングを使用してインストールされるものを正確に管理し、サードパーティのサービス(`crates.io` レジストリのような)に依存しないようにしています。 + +リリースモードでは、最新の rustup toolchain のバージョンであれば、この依存関係で動作するはずですが、 +サニタイザを有効にする予定がある場合は、CI で使用されるものと同じ `std` と一致するバージョンを使用する必要があります(crates をベンダリングしています): + +```bash +rustup toolchain install nightly-2024-04-01 +rustup default nightly-2024-04-01 +rustup component add rust-src +``` + +### ClickHouse ソースをチェックアウトする {#checkout-clickhouse-sources} + +``` bash +git clone --recursive --shallow-submodules git@github.com:ClickHouse/ClickHouse.git +``` + +または + +``` bash +git clone --recursive --shallow-submodules https://github.com/ClickHouse/ClickHouse.git +``` + +### ClickHouse をビルドする {#build-clickhouse} + +``` bash +cd ClickHouse +mkdir build +cmake -S . -B build +cmake --build build # または: `cd build; ninja` +``` + +:::tip +`cmake` が利用可能な論理コア数を検出できない場合、ビルドは 1 スレッドで行われます。これを解決するには、`cmake` に `-j` フラグを使用して特定のスレッド数を使うように設定できます。例えば、`cmake --build build -j 16` です。また、フラグを常に設定しなくてもよいように、予め特定のジョブ数でビルドファイルを生成することもできます: `cmake -DPARALLEL_COMPILE_JOBS=16 -S . -B build`、ここで `16` は望むスレッド数です。 +::: + +実行ファイルを作成するには、`cmake --build build --target clickhouse` を実行します(または: `cd build; ninja clickhouse`)。 +これで `build/programs/clickhouse` という実行ファイルが作成され、`client` または `server` 引数とともに使用できます。 + +## どの Linux でもビルドする {#how-to-build-clickhouse-on-any-linux} + +ビルドには次のコンポーネントが必要です: + +- Git(ソースのチェックアウトに使用、ビルドには不要) +- CMake 3.20 以上 +- コンパイラ: clang-18 以上 +- リンカー: lld-17 以上 +- Ninja +- Yasm +- Gawk +- rustc + +すべてのコンポーネントがインストールされている場合、上記の手順と同様にビルドできます。 + +OpenSUSE Tumbleweed の例: + +``` bash +sudo zypper install git cmake ninja clang-c++ python lld nasm yasm gawk +git clone --recursive https://github.com/ClickHouse/ClickHouse.git +mkdir build +cmake -S . -B build +cmake --build build +``` + +Fedora Rawhide の例: + +``` bash +sudo yum update +sudo yum --nogpg install git cmake make clang python3 ccache lld nasm yasm gawk +git clone --recursive https://github.com/ClickHouse/ClickHouse.git +mkdir build +cmake -S . -B build +cmake --build build +``` + +## Docker でのビルド + +CI ビルドには、`clickhouse/binary-builder` という Docker イメージを使用しています。このイメージには、バイナリとパッケージをビルドするために必要なすべてのものが含まれています。イメージの使用を簡略化するために `docker/packager/packager` というスクリプトがあります: + +```bash +# 出力アーティファクト用のディレクトリ定義 +output_dir="build_results" +# シンプルなビルド +./docker/packager/packager --package-type=binary --output-dir "$output_dir" +# debian パッケージのビルド +./docker/packager/packager --package-type=deb --output-dir "$output_dir" +# デフォルトでは、debian パッケージはスリムな LTO を使用するため、ビルドを高速化するためにこれをオーバーライドできます +CMAKE_FLAGS='-DENABLE_THINLTO=' ./docker/packager/packager --package-type=deb --output-dir "./$(git rev-parse --show-cdup)/build_results" +``` diff --git a/docs/ja/development/continuous-integration.md b/docs/ja/development/continuous-integration.md new file mode 100644 index 00000000000..1b910504537 --- /dev/null +++ b/docs/ja/development/continuous-integration.md @@ -0,0 +1,200 @@ +--- +slug: /ja/development/continuous-integration +sidebar_position: 62 +sidebar_label: Continuous Integration Checks +title: Continuous Integration Checks +description: プルリクエストを送信すると、ClickHouseの継続的インテグレーション (CI) システムにより自動化されたチェックがコードに対して実行されます +--- + +プルリクエストを送信すると、ClickHouseの[継続的インテグレーション (CI) システム](tests.md#test-automation)により、自動化されたチェックがコードに対して実行されます。これは、リポジトリの管理者(ClickHouseチームの誰か)がコードを確認し、プルリクエストに`can be tested`ラベルを追加した後に行われます。チェックの結果は、[GitHubチェックのドキュメント](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-status-checks)に記載されているように、GitHubのプルリクエストページに一覧表示されます。チェックが失敗した場合、それを修正する必要があるかもしれません。このページでは、遭遇する可能性のあるチェックの概要と、それを修正するためにできることを説明します。 + +チェックの失敗が変更内容とは関係ないように見える場合、それは一時的な失敗やインフラの問題かもしれません。プルリクエストに空のコミットをプッシュして、CIチェックを再起動してください。 +``` +git reset +git commit --allow-empty +git push +``` + +どうすればよいか分からない場合は、管理者に助けを求めてください。 + + +## Merge With Master + +PRがマスターにマージできることを確認します。できない場合、`Cannot fetch mergecommit`というメッセージで失敗します。このチェックを修正するためには、[GitHubのドキュメント](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github)に記載されているようにコンフリクトを解決するか、gitを使用して`master`ブランチをプルリクエストのブランチにマージします。 + + +## Docs check + +ClickHouseのドキュメントサイトのビルドを試みます。ドキュメントに何か変更を加えた場合に失敗する可能性があります。最も可能性が高い原因は、ドキュメント内のクロスリンクが間違っていることです。チェックレポートに移動し、`ERROR`および`WARNING`メッセージを探してください。 + + +## Description Check + +プルリクエストの説明がテンプレート[PULL_REQUEST_TEMPLATE.md](https://github.com/ClickHouse/ClickHouse/blob/master/.github/PULL_REQUEST_TEMPLATE.md)に準拠しているかチェックします。変更に対する変更ログカテゴリ(例: Bug Fix)を指定し、[CHANGELOG.md](../whats-new/changelog/index.md)に変更を説明するユーザー向けメッセージを書かなければなりません。 + + +## Push To DockerHub + +ビルドやテストに使用されるDockerイメージをビルドし、DockerHubにプッシュします。 + + +## Marker Check + +このチェックはCIシステムがプルリクエストの処理を開始したことを意味します。'pending'ステータスのときは、まだすべてのチェックが開始されていないことを示します。すべてのチェックが開始されると、ステータスは'success'に変更されます。 + + +## Style Check + +[`utils/check-style/check-style`](https://github.com/ClickHouse/ClickHouse/blob/master/utils/check-style/check-style)バイナリを使用して、コードスタイルの単純な正規表現ベースのチェックを行います(ローカルで実行可能です)。失敗の場合は、[コーディングスタイルガイド](style.md)に従ってスタイルエラーを修正してください。 + +#### ローカルでスタイルチェックを実行する: +```sh +mkdir -p /tmp/test_output +# 全てのチェックを実行 +python3 tests/ci/style_check.py --no-push + +# 指定されたチェックスクリプトを実行(例: ./check-mypy) +docker run --rm --volume=.:/ClickHouse --volume=/tmp/test_output:/test_output -u $(id -u ${USER}):$(id -g ${USER}) --cap-add=SYS_PTRACE --entrypoint= -w/ClickHouse/utils/check-style clickhouse/style-test ./check-mypy + +# スタイルチェックスクリプトがあるディレクトリへ移動: +cd ./utils/check-style + +# 重複インクルードをチェック +./check-duplicate-includes.sh + +# C++フォーマットをチェック +./check-style + +# Pythonフォーマットをblackでチェック +./check-black + +# Pythonの型ヒントをmypyでチェック +./check-mypy + +# flake8でPythonをチェック +./check-flake8 + +# codespellでコードをチェック +./check-typos + +# ドキュメントのスペルをチェック +./check-doc-aspell + +# 空白をチェック +./check-whitespaces + +# GitHub Actionsのワークフローをチェック +./check-workflows + +# サブモジュールをチェック +./check-submodules + +# shellcheckでシェルスクリプトをチェック +./shellcheck-run.sh +``` + +## Fast Test + +通常これはPRに対して最初に実行されるチェックです。ClickHouseのビルドと、多くの[ステートレス機能テスト](tests.md#functional-tests)が実行されますが、一部は省略されます。これが失敗すると、それが修正されるまでさらなるチェックは開始されません。どのテストが失敗したかを確認し、それをローカルで再現する方法は[こちら](tests.md#functional-test-locally)にあります。 + +#### ローカルでFast Testを実行する: +```sh +mkdir -p /tmp/test_output +mkdir -p /tmp/fasttest-workspace +cd ClickHouse +# このdockerコマンドは最小限のClickHouseビルドを行い、FastTestsを実行します +docker run --rm --cap-add=SYS_PTRACE -u $(id -u ${USER}):$(id -g ${USER}) --network=host -e FASTTEST_WORKSPACE=/fasttest-workspace -e FASTTEST_OUTPUT=/test_output -e FASTTEST_SOURCE=/ClickHouse --cap-add=SYS_PTRACE -e stage=clone_submodules --volume=/tmp/fasttest-workspace:/fasttest-workspace --volume=.:/ClickHouse --volume=/tmp/test_output:/test_output clickhouse/fasttest +``` + + +#### ステータスページファイル +- `runlog.out.log`はすべての他のログを含む一般的なログです。 +- `test_log.txt` +- `submodule_log.txt`には、必要なサブモジュールのクローン化およびチェックアウトに関するメッセージが含まれます。 +- `stderr.log` +- `stdout.log` +- `clickhouse-server.log` +- `clone_log.txt` +- `install_log.txt` +- `clickhouse-server.err.log` +- `build_log.txt` +- `cmake_log.txt`にはC/C++およびLinuxフラグチェックに関するメッセージが含まれます。 + +#### ステータスページのカラム + +- *Test name*:テストの名前(パスを除く、例えばすべてのタイプのテストは名前に統合されます)。 +- *Test status* -- _Skipped_, _Success_, _Fail_のいずれか。 +- *Test time, sec.* -- このテストでは空白です。 + + +## ビルドチェック {#build-check} + +さまざまな構成でClickHouseをビルドし、さらにステップで使用します。失敗したビルドを修正する必要があります。ビルドログにはエラーを修正するための十分な情報が含まれていることが多いですが、ローカルで失敗を再現する必要があるかもしれません。`cmake`オプションはビルドログで`cmake`を探して見つけることができます。これらのオプションを使用して[一般的なビルドプロセス](../development/build.md)に従ってください。 + +### レポート詳細 + +- **Compiler**: `clang-18`、オプションでターゲットプラットフォームの名前 +- **Build type**: `Debug`または`RelWithDebInfo` (cmake)。 +- **Sanitizer**: `none`(サニタイザーなし)、`address` (ASan)、`memory` (MSan)、`undefined` (UBSan)、または`thread` (TSan)。 +- **Status**: `success`または`fail` +- **Build log**: ビルドおよびファイルコピーのログへのリンク、ビルド失敗時に役立ちます。 +- **Build time**。 +- **Artifacts**: ビルド結果ファイル(`XXX`はサーバーバージョン例: `20.8.1.4344`)。 + - `clickhouse-client_XXX_amd64.deb` + - `clickhouse-common-static-dbg_XXX[+asan, +msan, +ubsan, +tsan]_amd64.deb` + - `clickhouse-common-staticXXX_amd64.deb` + - `clickhouse-server_XXX_amd64.deb` + - `clickhouse`: 主なビルド済みバイナリ。 + - `clickhouse-odbc-bridge` + - `unit_tests_dbms`: ClickHouseのユニットテストを含むGoogleTestバイナリ。 + - `performance.tar.zst`: パフォーマンステスト用の特別パッケージ。 + + +## 特殊ビルドチェック + +`clang-tidy`を使用して静的解析とコードスタイルのチェックを行います。レポートは[ビルドチェック](#build-check)に類似しています。ビルドログの中で見つかったエラーを修正してください。 + +#### ローカルでclang-tidyを実行する: +Dockerでclang-tidyビルドを実行する便利な`packager`スクリプトがあります +```sh +mkdir build_tidy +./docker/packager/packager --output-dir=./build_tidy --package-type=binary --compiler=clang-18 --debug-build --clang-tidy +``` + + +## Stateless 機能テスト + +さまざまな構成でビルドされたClickHouseバイナリに対して、[ステートレス機能テスト](tests.md#functional-tests)を実行します。どのテストが失敗したかを確認し、それをローカルで再現する方法は[こちら](tests.md#functional-test-locally)にあります。正しいビルド構成を使用して再現する必要があることに注意してください。アドレスサニタイザ(AddressSanitizer)で失敗するテストがデバッグで成功する可能性があります。バイナリを[CIビルドチェックページ](../development/build.md#you-dont-have-to-build-clickhouse)からダウンロードするか、ローカルでビルドしてください。 + +## Stateful 機能テスト + +[Stateful 機能テスト](tests.md#functional-tests)を実行します。ステートレス機能テストと同様に扱います。違いは[clickstreamデータセット](../getting-started/example-datasets/metrica.md)から`hits`および`visits`テーブルが必要なことです。 + +## 統合テスト + +[統合テスト](tests.md#integration-tests)を実行します。 + +## バグ修正検証チェック + +新しいテスト(機能または統合)があるか、マスターブランチでビルドされたバイナリで失敗する変更されたテストがあるかをチェックします。プルリクエストに"pr-bugfix"ラベルが付いているとこのチェックがトリガーされます。 + +## ストレステスト + +同時に複数のクライアントからステートレス機能テストを実行し、同時実行性に関連するエラーを検出します。これが失敗した場合: + + * まずすべての他のテストの失敗を修正してください; + * レポートを見て、サーバーログをチェックし、エラーの可能性のある原因を調べてください。 + + + +## 互換性チェック + +`clickhouse`バイナリが古いlibcバージョンのディストリビューションで実行されることを確認します。失敗した場合、管理者に助けを求めてください。 + +## AST ファジング + +プログラムエラーを発見するためにランダムに生成されたクエリを実行します。失敗した場合は、管理者に助けを求めてください。 + +## パフォーマンステスト + +クエリのパフォーマンスの変化を測定します。これは最も長いチェックで、実行には約6時間かかります。パフォーマンステストレポートの詳細は[こちら](https://github.com/ClickHouse/ClickHouse/tree/master/docker/test/performance-comparison#how-to-read-the-report)に記載されています。 diff --git a/docs/ja/development/contrib.md b/docs/ja/development/contrib.md new file mode 100644 index 00000000000..e8c1bff880a --- /dev/null +++ b/docs/ja/development/contrib.md @@ -0,0 +1,38 @@ +--- +slug: /ja/development/contrib +sidebar_position: 73 +sidebar_label: サードパーティライブラリ +description: 使用されているサードパーティライブラリの一覧 +--- + +# 使用されているサードパーティライブラリ + +ClickHouseは、他のデータベースへの接続や、ディスクからデータをロード/保存する際のデコード/エンコード、特定の専門的なSQL関数の実装など、さまざまな目的でサードパーティライブラリを利用しています。ターゲットシステムに存在するライブラリに依存せずに済むように、各サードパーティライブラリはClickHouseのソースツリーにGitサブモジュールとしてインポートされ、ClickHouseと共にコンパイルおよびリンクされます。サードパーティライブラリとそのライセンスの一覧は、以下のクエリで取得できます。 + +``` sql +SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en'; +``` + +この一覧にあるライブラリは、ClickHouseリポジトリの`contrib/`ディレクトリに位置するものです。ビルドオプションによっては、いくつかのライブラリはコンパイルされておらず、その結果、実行時に機能が利用できない場合があります。 + +[例](https://sql.clickhouse.com?query_id=478GCPU7LRTSZJBNY3EJT3) + +## サードパーティライブラリの追加と管理 + +各サードパーティライブラリは、ClickHouseリポジトリの`contrib/`ディレクトリ下の専用ディレクトリに配置される必要があります。外部コードのコピーをライブラリディレクトリに直接投入するのは避けてください。代わりに、Gitサブモジュールを作成して、外部の上流リポジトリからサードパーティコードを取得します。 + +ClickHouseが使用するすべてのサブモジュールは、`.gitmodule`ファイルに一覧されています。 +- ライブラリがそのまま使用できる場合(デフォルトの場合)、直接上流リポジトリを参照できます。 +- ライブラリにパッチを当てる必要がある場合、上流リポジトリを[GitHubのClickHouse組織](https://github.com/ClickHouse)にフォークしてください。 + +後者の場合、カスタムパッチをできるだけ上流のコミットから分離することを目指します。そのため、目的のブランチやタグから`ClickHouse/`というプレフィックス付きのブランチを作成します。例えば、`ClickHouse/2024_2`(ブランチ`2024_2`の場合)または`ClickHouse/release/vX.Y.Z`(タグ`release/vX.Y.Z`の場合)です。上流の開発ブランチ`master`、`main`、`dev`(すなわちフォークリポジトリ内で`ClickHouse/master`、`ClickHouse/main`、`ClickHouse/dev`というプレフィックスが付いたブランチ)を追跡しないでください。これらのブランチは動的であり、適切なバージョン管理が困難です。プレフィックスブランチにより、フォークへの上流リポジトリからのプルはカスタム`ClickHouse/`ブランチに影響を与えません。`contrib/`内のサブモジュールは、フォークされたサードパーティリポジトリの`ClickHouse/`ブランチのみを追跡する必要があります。 + +パッチは外部ライブラリの`ClickHouse/`ブランチに対してのみ適用されます。 + +以下の2つの方法があります: +- サニタイザ修正のような新しい修正をフォークリポジトリの`ClickHouse/`プレフィックスブランチに対して行いたい場合。その場合、修正を`ClickHouse/`プレフィックス付きのブランチとしてプッシュし、カスタム追跡ブランチに対してPRを作成し、マージします。例えば、`ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster`。 +- サブモジュールを更新して、以前のパッチを再適用する必要がある場合。この場合、古いPRを再作成するのは過剰です。代わりに、以前のコミットを新しい`ClickHouse/`ブランチ(新しいバージョンに対応)に単にチェリーピックしてください。複数のコミットがあったPRのコミットをスクワッシュしても構いません。理想的には、カスタムパッチを上流に再貢献し、新しいバージョンでパッチを省略できるようにします。 + +サブモジュールが更新されたら、フォーク内の新しいハッシュを指すようにClickHouse内でサブモジュールを更新します。 + +公式リポジトリを念頭に置いてサードパーティライブラリのパッチを作成し、上流リポジトリへのパッチの再貢献を検討してください。これにより、他のユーザーもパッチの恩恵を受け、ClickHouseチームのメンテナンス負担を軽減できます。 diff --git a/docs/ja/development/developer-instruction.md b/docs/ja/development/developer-instruction.md new file mode 100644 index 00000000000..c04fd628c7a --- /dev/null +++ b/docs/ja/development/developer-instruction.md @@ -0,0 +1,322 @@ +--- +slug: /ja/development/developer-instruction +sidebar_position: 61 +sidebar_label: はじめに +description: ClickHouseのビルド方法の概要と前提条件について +--- + +# ClickHouseビルドのためのガイド + +ClickHouseはLinux、FreeBSD、macOSでビルドできます。Windowsを使用している場合でも、Linuxを実行している仮想マシン(例:Ubuntuを使用した[VirtualBox](https://www.virtualbox.org/))でClickHouseをビルドすることができます。 + +ClickHouseをコンパイルして実行するには64ビットシステムが必要です。32ビットシステムでは動作しません。 + +## GitHubでのリポジトリ作成 {#creating-a-repository-on-github} + +ClickHouseの開発を開始するには、[GitHub](https://www.virtualbox.org/) アカウントが必要です。また、ローカルでSSHキーの生成(未生成の場合)および公開キーをGitHubにアップロードすることも、パッチを提供するための前提条件です。 + +次に、パーソナルアカウントで[ClickHouseリポジトリ](https://github.com/ClickHouse/ClickHouse/)をフォークするには、右上にある"フォーク" ボタンをクリックしてください。 + +たとえば、問題の修正や機能の提供を貢献するには、フォークされたリポジトリのブランチに変更をコミットし、その変更をメインリポジトリに"プルリクエスト"として作成してください。 + +Gitリポジトリを操作するために、`git`をインストールしてください。Ubuntuでは、ターミナルで以下のコマンドを実行します: + +```sh +sudo apt update +sudo apt install git +``` + +Gitの使用に関するチートシートは[こちら](https://education.github.com/git-cheat-sheet-education.pdf)にあります。Gitの詳細なマニュアルは[こちら](https://git-scm.com/book/en/v2)をご覧ください。 + +## 開発マシンへのリポジトリのクローン {#cloning-a-repository-to-your-development-machine} + +まず、作業マシンにソースファイルをダウンロードします。つまり、リポジトリをクローンします: + +```sh +git clone git@github.com:your_github_username/ClickHouse.git # プレースホルダーをあなたのGitHubユーザ名で置き換えてください +cd ClickHouse +``` + +このコマンドは、ClickHouseのソースコードを含むディレクトリ`ClickHouse/`を作成します。URLの後にカスタムチェックアウトディレクトリを指定することもできますが、このパスに空白が含まれていないことが重要です。後でビルドに問題を引き起こす可能性があります。 + +ClickHouseリポジトリには、Gitサブモジュール、つまり、外部リポジトリ(通常、ClickHouseで使用されるサードパーティライブラリ)への参照が使用されています。これらはデフォルトではチェックアウトされません。チェックアウトするには、次のいずれかを実行します: + +- `--recurse-submodules` オプションを付けて`git clone`を実行します。 + +- `git clone`がサブモジュールをチェックアウトしなかった場合、`git submodule update --init --jobs `(例:` = 12`と指定するとチェックアウトの並列化が可能)を実行し、前述のと同様の結果を得ることもできます。 + +- `git clone`がサブモジュールをチェックアウトしなかった場合、不要なファイルや履歴を省いてサブモジュールをチェックアウトするために[sparse](https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/)および[shallow](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/)チェックアウトを使用する場合は、`./contrib/update-submodules.sh`を実行します。一般的には、サブモジュールの操作が不便で遅くなるため、お勧めしません。 + +Gitの状態を確認するためには、以下のコマンドを実行します:`git submodule status`。 + +次のエラーメッセージが表示された場合: + + Permission denied (publickey). + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + +一般に、GitHubに接続するためのSSHキーが不足していることを示しています。これらのキーは通常、`~/.ssh`にあります。SSHキーが受け入れられるためには、GitHubの設定でこれをアップロードする必要があります。 + +httpsプロトコルを介してリポジトリをクローンすることもできます: + + git clone --recursive --shallow-submodules https://github.com/ClickHouse/ClickHouse.git + +しかし、この方法では変更をサーバに送信することはできません。一時的に使用し、SSHキーを追加して、`git remote` コマンドを使用してリポジトリのリモートアドレスを置き換えることができます。 + +作業中のローカルリポジトリにオリジナルのClickHouseリポジトリアドレスを追加して、そこから更新を引き出すこともできます: + + git remote add upstream git@github.com:ClickHouse/ClickHouse.git + +このコマンドが正常に実行された後、`git pull upstream master`を実行することで、メインのClickHouseリポジトリから更新を引き出すことができます。 + +:::note +以下の説明は、Linuxでビルドしていること前提としています。クロスコンパイルやmacOSでのビルドを行う場合、特定のガイドも確認してください。例えば、[macOSでのビルド](build-osx.md)、[LinuxでのmacOS向けビルド](build-cross-osx.md)、[LinuxでのLinux/RISC-V向けビルド](build-cross-riscv.md)、[LinuxでのLinux/LoongArch向けビルド](build-cross-loongarch.md)などです。 +::: + +## ビルドシステム {#build-system} + +ClickHouseはビルドにCMakeとNinjaを使用します。 + +- CMake - Ninjaファイル(ビルドタスク)を生成するメタビルドシステム。 + +- Ninja - それらのcmake生成タスクを実行するためのスピードに焦点を当てた小規模なビルドシステム。 + +- ccache - コンパイラのキャッシュ。以前のコンパイルをキャッシュし、同じコンパイルが再度行われるときにそれを検出して再コンパイルを高速化します。 + +:::tip +ccacheの代替として、[sccache](https://github.com/mozilla/sccache)を使用することもできます。それを使用するには、`-DCOMPILER_CACHE=sccache` CMakeフラグを使用してください。 +::: + +Ubuntu、DebianまたはMintの場合、`sudo apt install cmake ninja-build ccache`を実行してインストールします。 + +CentOS、RedHatの場合、`sudo yum install cmake ninja-build ccache`を実行します。 + +ArchまたはGentooを使用している場合、CMakeおよびその他のインストール方法を知っていますでしょう。 + +## C++コンパイラ {#c-compiler} + +ClickHouseのビルドには、Clangバージョン16からのコンパイラをサポートしています。 + +Clangはgccの代わりに使用されるべきです。ただし、我々の継続的インテグレーション(CI)プラットフォームでは、約12種類のビルドの組み合わせをチェックしています。 + +Ubuntu/Debianでは、(公式ウェブページを確認してください)[公式ウェブページ](https://apt.llvm.org/)の自動インストールスクリプトを使用できます。 + +```bash +sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +``` + +## ビルドプロセス {#the-building-process} + +ClickHouseをビルドする準備ができたら、`ClickHouse`内にビルド成果物をすべて含む別のディレクトリ`build`を作成することをお勧めします: + + mkdir build + cd build + +異なるビルドタイプのために複数のディレクトリを持つことができます(例:build_release、build_debug等)。 + +`build`ディレクトリ内で、最初にコンパイラを指定する環境変数を定義した後、CMakeを実行してビルドを構成します。 + + export CC=clang CXX=clang++ + cmake .. + +上の自動インストールスクリプトを使用してclangをインストールした場合は、最初のコマンド内でインストールされたclangのバージョンも指定してください。例:`export CC=clang-18 CXX=clang++-18`。clangのバージョンはスクリプトの出力に表示されます。 + +`CC`変数はCコンパイラを指定し、`CXX`変数はビルドに使用するC++コンパイラを指定します。 + +より速いビルドのために、最適化なしのデバッグビルドタイプを使用することができます。その場合、以下のパラメータを指定してください:`-D CMAKE_BUILD_TYPE=Debug`: + + cmake -D CMAKE_BUILD_TYPE=Debug .. + +このコマンドを`build`ディレクトリ内で実行することにより、ビルドタイプを変更することができます。 + +ninjaを実行してビルドします: + + ninja clickhouse-server clickhouse-client + +この例では、必要なバイナリのみがビルドされます。 + +すべてのバイナリ(ユーティリティやテスト)をビルドする必要がある場合は、パラメータなしでninjaを実行します: + + ninja + +完全なビルドには約30GBの空きディスクスペースが必要で、メインバイナリをビルドするためには約15GBが必要です。 + +十分な量のRAMがビルドマシンにある場合は、`-j`パラメータで同時に実行されるビルドタスクの数を制限する必要があります: + + ninja -j 1 clickhouse-server clickhouse-client + +4GBのRAMを持つマシンでは、1を指定することが推奨され、8GBのRAMでは`-j 2`を指定することが推奨されます。 + +メッセージ`ninja: error: loading 'build.ninja': No such file or directory`を受けた場合、ビルド構成の生成が失敗していることを意味し、上記のメッセージを確認する必要があります。 + +ビルドプロセスが正常に開始されると、処理されたタスクの数とタスクの総数を示すビルド進行状況が表示されます。 + +ビルド中にLLVMライブラリに関するメッセージが表示されることがあります。これは何も影響せず、安全に無視することができます。 + +ビルドが正常に完了すると、実行可能ファイル`ClickHouse//programs/clickhouse`が得られます: + + ls -l programs/clickhouse + +### 高度なビルドプロセス {#advanced-building-process} + +#### 最小ビルド {#minimal-build} + +サードパーティライブラリによる機能に興味がない場合、ビルドをさらに高速化するために、`cmake`オプションを使用できます。 + +``` +cmake -DENABLE_LIBRARIES=OFF +``` + +開発オプションに関して問題が発生した場合、自己責任です。 + +#### Rustサポート {#rust-support} + +Rustはインターネット接続が必要で、接続がない場合はRustサポートを無効にすることができます: + +``` +cmake -DENABLE_RUST=OFF +``` + +## ClickHouseの実行可能ファイルの実行 {#running-the-built-executable-of-clickhouse} + +現在のユーザーでサーバーを実行するには、`ClickHouse/programs/server/`に移動して実行します(`build`の外にあります): + + ../../build/programs/clickhouse server + +この場合、ClickHouseは現在のディレクトリにある設定ファイルを使用します。任意のディレクトリから実行し、設定ファイルへのパスをコマンドラインパラメータ`--config-file`として指定できます。 + +別のターミナルでclickhouse-clientを使用してClickHouseに接続するには、`ClickHouse/build/programs/`に移動し、`./clickhouse client`を実行します。 + +macOSまたはFreeBSDで`Connection refused`メッセージが表示された場合、ホストアドレス127.0.0.1を指定してみてください: + + clickhouse client --host 127.0.0.1 + +システムにインストールされたClickHouseバイナリを、カスタムビルドしたClickHouseバイナリで置き換えることができます。これを行うには、公式ウェブサイトの指示に従い、マシンにClickHouseをインストールしてください。その後、以下を実行します: + + sudo service clickhouse-server stop + sudo cp ClickHouse/build/programs/clickhouse /usr/bin/ + sudo service clickhouse-server start + +`clickhouse-client`、`clickhouse-server`などは、共通の`clickhouse`バイナリへのシンボリックリンクであることに注意してください。 + +また、システムにインストールされたClickHouseパッケージの設定ファイルを使用してカスタムビルドしたClickHouseバイナリを実行することもできます: + + sudo service clickhouse-server stop + sudo -u clickhouse ClickHouse/build/programs/clickhouse server --config-file /etc/clickhouse-server/config.xml + +## IDE(統合開発環境) {#ide-integrated-development-environment} + +**CLion(推奨)** + +どのIDEを使用するか分からない場合、[CLion](https://www.jetbrains.com/clion/) を使用することをお勧めします。CLionは商用ソフトウェアですが、30日間の無料トライアルを提供しています。また、学生は無料で利用できます。CLionはLinuxとmacOSの両方で使用できます。 + +CLionを使用してClickHouseを開発する際に知っておくべきこと: + +- CLionは独自に`build`パスを作成し、ビルドタイプとして自動的に`debug`を選択します。 +- 使用するCMakeのバージョンは、インストールしたものではなく、CLion内で定義されているものです。 +- CLionは`ninja`ではなく`make`を使用してビルドタスクを実行します(これは通常の動作です)。 + +**その他の代替IDE** + +[QTCreator](https://www.qt.io/product/development-tools) および [KDevelop](https://kdevelop.org/) は、ClickHouse開発のための他の素晴らしい代替IDEです。KDevelopは優れたIDEですが、時々不安定になることがあります。プロジェクトを開く際にKDevelopがクラッシュした場合、プロジェクトのファイルリストが開かれたらすぐに「すべてを停止」ボタンをクリックする必要があります。これを行うと、KDevelopは問題なく動作するはずです。 + +その他のIDEとしては、[Sublime Text](https://www.sublimetext.com/)、[Visual Studio Code](https://code.visualstudio.com/)、または[Kate](https://kate-editor.org/) (いずれもLinuxで利用可能)を使用できます。VS Codeを使用している場合、IntelliSenseよりもパフォーマンスが大幅に向上するため、[clangd拡張](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd)の使用をお勧めします。 + +## コードを書く {#writing-code} + +ClickHouseのためにコードを書く際に役立つクイックリンクを以下に示します: + +- [ClickHouseアーキテクチャの説明](https://clickhouse.com/docs/ja/development/architecture/)。 +- [コードスタイルガイド](https://clickhouse.com/docs/ja/development/style/)。 +- [サードパーティライブラリの追加](https://clickhouse.com/docs/ja/development/contrib/#adding-third-party-libraries)。 +- [テストを書く](https://clickhouse.com/docs/ja/development/tests/)。 +- [オープンな問題のリスト](https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22)。 + +## ドキュメントを書く {#writing-documentation} + +新機能を追加するプルリクエストの一環として、その機能のドキュメントを書く必要があります。ドキュメントの変更をプレビューしたい場合、ローカルでドキュメントページをビルドするための手順が[こちらのREADME.mdファイル](https://github.com/ClickHouse/clickhouse-docs)にあります。ClickHouseに新しい関数を追加する際には、以下のテンプレートをガイドとして使用できます: + +```markdown +# newFunctionName + +ここに関数の簡単な説明を記載します。関数の機能と典型的な使用例について簡単に説明してください。 + +**Syntax** + +\```sql +newFunctionName(arg1, arg2[, arg3]) +\``` + +**Arguments** + +- `arg1` — 引数の説明。[DataType](../data-types/float.md) +- `arg2` — 引数の説明。[DataType](../data-types/float.md) +- `arg3` — オプションの引数の説明(オプション)。[DataType](../data-types/float.md) + +**Implementation Details** + +関連がある場合は、実装の詳細について説明します。 + +**Returned value** + +- {関数が返す内容をここに記載します}。[DataType](../data-types/float.md) + +**Example** + +クエリ: + +\```sql +SELECT 'write your example query here'; +\``` + +レスポンス: + +\```response +┌───────────────────────────────────┐ +│ the result of the query │ +└───────────────────────────────────┘ +\``` +``` + +## テストデータ {#test-data} + +ClickHouseの開発では、現実的なデータセットのロードが頻繁に必要です。これは特にパフォーマンステストに重要です。我々は特別に準備されたWebアナリティクスの匿名データセットを持っています。このデータのロードには追加で約3GBの空きディスクスペースが必要です。このデータはほとんどの開発作業には必須ではありません。 + + sudo apt install wget xz-utils + + wget https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz + wget https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz + + xz -v -d hits_v1.tsv.xz + xz -v -d visits_v1.tsv.xz + + clickhouse-client + + CREATE DATABASE IF NOT EXISTS test + + CREATE TABLE test.hits ( 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.Key1` Array(String), `ParsedParams.Key2` Array(String), `ParsedParams.Key3` Array(String), `ParsedParams.Key4` Array(String), `ParsedParams.Key5` Array(String), `ParsedParams.ValueDouble` Array(Float64), IslandID FixedString(16), RequestNum UInt32, RequestTry UInt8) ENGINE = MergeTree PARTITION BY toYYYYMM(EventDate) SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID), EventTime); + + CREATE TABLE test.visits ( 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.ID` Array(UInt32), `Goals.Serial` Array(UInt32), `Goals.EventTime` Array(DateTime), `Goals.Price` Array(Int64), `Goals.OrderID` Array(String), `Goals.CurrencyID` Array(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.ID` Array(Int8), `TraficSource.SearchEngineID` Array(UInt16), `TraficSource.AdvEngineID` Array(UInt8), `TraficSource.PlaceID` Array(UInt16), `TraficSource.SocialSourceNetworkID` Array(UInt8), `TraficSource.Domain` Array(String), `TraficSource.SearchPhrase` Array(String), `TraficSource.SocialSourcePage` Array(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.Key1` Array(String), `ParsedParams.Key2(Array(String), `ParsedParams.Key3` Array(String), `ParsedParams.Key4` Array(String), `ParsedParams.Key5` Array(String), `ParsedParams.ValueDouble` Array(Float64), `Market.Type` Array(UInt8), `Market.GoalID` Array(UInt32), `Market.OrderID(Array(String), `Market.OrderPrice(Array(Int64), `Market.PP` Array(UInt32), `Market.DirectPlaceID` Array(UInt32), `Market.DirectOrderID(Array(UInt32), `Market.DirectBannerID(Array(UInt32), `Market.GoodID(Array(String), `Market.GoodName(Array(String), `Market.GoodQuantity` Array(Int32), `Market.GoodPrice(Array(Int64), IslandID FixedString(16)) ENGINE = CollapsingMergeTree(Sign) PARTITION BY toYYYYMM(StartDate) SAMPLE BY intHash32(UserID) ORDER BY (CounterID, StartDate, intHash32(UserID), VisitID); + + clickhouse-client --max_insert_block_size 100000 --query "INSERT INTO test.hits FORMAT TSV" < hits_v1.tsv + clickhouse-client --max_insert_block_size 100000 --query "INSERT INTO test.visits FORMAT TSV" < visits_v1.tsv + +## プルリクエストの作成 {#creating-pull-request} + +GitHubのUIでフォークリポジトリに移動します。他のブランチで開発している場合は、そのブランチを選択する必要があります。"プルリクエスト"ボタンが画面にあります。これは本質的に「メインリポジトリへの変更を受け入れるためのリクエストを作成する」という意味です。 + +作業が完了していない場合でも、プルリクエストを作成できます。この場合、タイトルの冒頭に「WIP」(作業中)という単語を置いてください。これは後で変更できます。変更の共同レビューや議論、および利用可能なすべてのテストの実行に役立ちます。変更の簡単な説明を必ず提供してください。これは後でリリースのチェンジログを生成する際に使用されます。 + +ClickHouseの社員がプルリクエストに"テスト可能"のタグを付けるとすぐにテストが開始されます。最初のいくつかのチェックの結果(例:コードスタイル)は数分以内に届きます。ビルドチェック結果は30分以内に届きます。主要なテストセットは1時間以内に報告されます。 + +システムはプルリクエストごとにClickHouseバイナリビルドを個別に準備します。[詳細]リンクをクリックすると、「ビルド」のエントリの横にあるチェックリストが表示されます。そこにはビルトされた.debパッケージの直リンクがあり、必要に応じてプロダクションサーバーにデプロイすることもできます(恐れない場合)。 + +最初の試みでは、因るところ多くのビルドが失敗することがあります。我々はgccとclangの両方でビルドをチェックし、clangではほぼすべての警告(常に`-Werror`フラグ)を有効にしています。その同じページで、すべてのビルドログが見つかるので、全ての可能な方法でClickHouseをビルドする必要はありません。 + +## ClickHouseソースコードを見る {#browse-clickhouse-source-code} + +GitHubの統合コードブラウザを[こちらで](https://github.dev/ClickHouse/ClickHouse)使用することができます。 + +また、通常のように[GitHub](https://github.com/ClickHouse/ClickHouse)でソースを閲覧することもできます。 diff --git a/docs/ja/development/images/concurrency.png b/docs/ja/development/images/concurrency.png new file mode 100644 index 00000000000..ffd344a54fb Binary files /dev/null and b/docs/ja/development/images/concurrency.png differ diff --git a/docs/ja/development/images/find-build-artifact.png b/docs/ja/development/images/find-build-artifact.png new file mode 100644 index 00000000000..dc52e92c319 Binary files /dev/null and b/docs/ja/development/images/find-build-artifact.png differ diff --git a/docs/ja/development/integrating_rust_libraries.md b/docs/ja/development/integrating_rust_libraries.md new file mode 100644 index 00000000000..e1e8f9f5885 --- /dev/null +++ b/docs/ja/development/integrating_rust_libraries.md @@ -0,0 +1,72 @@ +--- +slug: /ja/development/integrating_rust_libraries +--- +# Rustライブラリの統合 + +Rustライブラリの統合は、BLAKE3ハッシュ関数の統合を基に説明します。 + +統合の最初のステップは、ライブラリを/rustフォルダに追加することです。これを行うには、空のRustプロジェクトを作成し、Cargo.tomlに必要なライブラリを含めます。また、新しいライブラリのコンパイルを静的に設定するために、Cargo.tomlに`crate-type = ["staticlib"]`を追加する必要があります。 + +次に、Corrosionライブラリを使用してCMakeにライブラリをリンクする必要があります。最初のステップは、/rustフォルダ内のCMakeLists.txtにライブラリフォルダを追加することです。その後、ライブラリディレクトリにCMakeLists.txtファイルを追加します。この中で、Corrosionのインポート関数を呼び出す必要があります。BLAKE3をインポートするために以下の行が使用されました: + +``` +corrosion_import_crate(MANIFEST_PATH Cargo.toml NO_STD) + +target_include_directories(_ch_rust_blake3 INTERFACE include) +add_library(ch_rust::blake3 ALIAS _ch_rust_blake3) +``` + +このようにして、Corrosionを使用して正しいCMakeターゲットを作成し、その後より便利な名前にリネームします。なお、名前の`_ch_rust_blake3`はCargo.tomlから来ており、プロジェクト名(`name = "_ch_rust_blake3"`)として使用されています。 + +Rustのデータ型はC/C++のデータ型と互換性がないため、データを変換し、ライブラリメソッドを呼び出し、出力データを逆変換するためのShimメソッドを空のライブラリプロジェクトで作成します。例えば、このメソッドはBLAKE3のために書かれました: + +``` +#[no_mangle] +pub unsafe extern "C" fn blake3_apply_shim( + begin: *const c_char, + _size: u32, + out_char_data: *mut u8, +) -> *mut c_char { + if begin.is_null() { + let err_str = CString::new("input was a null pointer").unwrap(); + return err_str.into_raw(); + } + let mut hasher = blake3::Hasher::new(); + let input_bytes = CStr::from_ptr(begin); + let input_res = input_bytes.to_bytes(); + hasher.update(input_res); + let mut reader = hasher.finalize_xof(); + reader.fill(std::slice::from_raw_parts_mut(out_char_data, blake3::OUT_LEN)); + std::ptr::null_mut() +} +``` + +このメソッドはC互換の文字列、そのサイズ、出力文字列ポインタを入力として取得します。それから、C互換の入力を実際のライブラリメソッドで使用される型に変換し、それらを呼び出します。その後、ライブラリメソッドの出力をC互換の型に戻して変換しなければなりません。この特定のケースでは、ライブラリがfill()メソッドによるポインタへの直接書き込みをサポートしていたため、変換は必要ありませんでした。ここでの主なアドバイスは、メソッドを少なく作成することで、各メソッド呼び出しの変換を少なくし、オーバーヘッドをあまり作成しないようにすることです。 + +`#[no_mangle]`属性と`extern "C"`は、すべてのそのようなメソッドに必須です。これらがなければ、正しいC/C++互換のコンパイルを行うことはできません。さらに、それらは統合の次のステップに必要です。 + +Shimメソッドのコードを記述した後、ライブラリのヘッダーファイルを準備する必要があります。これは手動で行うことも、cbindgenライブラリを使用して自動生成することもできます。cbindgenを使用する場合、build.rsビルドスクリプトを書き、cbindgenをビルド依存として含める必要があります。 + +ヘッダーファイルを自動生成できるビルドスクリプトの例: + +``` + let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + + let package_name = env::var("CARGO_PKG_NAME").unwrap(); + let output_file = ("include/".to_owned() + &format!("{}.h", package_name)).to_string(); + + match cbindgen::generate(&crate_dir) { + Ok(header) => { + header.write_to_file(&output_file); + } + Err(err) => { + panic!("{}", err) + } + } +``` + +また、すべてのC互換属性には`#[no_mangle]`および`extern "C"`属性を使用する必要があります。これがないと、ライブラリは誤ってコンパイルされる可能性があり、cbindgenはヘッダーの自動生成を起動しません。 + +これらすべてのステップの後、小さなプロジェクトでライブラリをテストして、互換性やヘッダー生成の問題をすべて見つけることができます。ヘッダー生成中に問題が発生した場合は、cbindgen.tomlファイルで設定を試みることができます(テンプレートはこちら:[https://github.com/eqrion/cbindgen/blob/master/template.toml](https://github.com/eqrion/cbindgen/blob/master/template.toml))。 + +BLAKE3の統合時に発生した問題として、MemorySanitizerがある変数がRustで初期化されているかどうかを確認できないため、偽陽性のレポートを生成することがあることは注意すべきです。これは、変数のより明示的な定義を持つメソッドを記述することで解決されましたが、このメソッドの実装は遅く、MemorySanitizerビルドを修正するためにのみ使用されます。 diff --git a/docs/ja/development/style.md b/docs/ja/development/style.md new file mode 100644 index 00000000000..c038dc2ef61 --- /dev/null +++ b/docs/ja/development/style.md @@ -0,0 +1,870 @@ +--- +slug: /ja/development/style +sidebar_position: 71 +sidebar_label: C++ ガイド +description: コーディングスタイル、命名規則、フォーマットなどに関する推奨事項の一覧 +--- + +# C++ コードの書き方 + +## 一般的な推奨事項 {#general-recommendations} + +**1.** 以下の内容は推奨事項であり、必須ではありません。 + +**2.** コードを編集する場合は、既存のコードのフォーマットに従うのが理にかなっています。 + +**3.** コードスタイルは一貫性のために必要です。一貫性があることでコードを読みやすくし、コード検索も容易になります。 + +**4.** 多くのルールには論理的な理由はありませんが、確立された慣行に従っています。 + +## フォーマット {#formatting} + +**1.** `clang-format` により、ほとんどのフォーマットは自動的に行われます。 + +**2.** インデントは4スペースです。タブで4スペースが追加されるよう開発環境を設定してください。 + +**3.** 開閉中括弧は別行に置かれなければなりません。 + +``` cpp +inline void readBoolText(bool & x, ReadBuffer & buf) +{ + char tmp = '0'; + readChar(tmp, buf); + x = tmp != '0'; +} +``` + +**4.** 関数の本体全体が単一の `statement` である場合、それを単一行に置くことができます。中括弧の周りにスペースを置いてください(行末のスペースを除いて)。 + +``` cpp +inline size_t mask() const { return buf_size() - 1; } +inline size_t place(HashValue x) const { return x & mask(); } +``` + +**5.** 関数の場合、括弧の周りにスペースを入れないでください。 + +``` cpp +void reinsert(const Value & x) +``` + +``` cpp +memcpy(&buf[place_value], &x, sizeof(x)); +``` + +**6.** `if`、`for`、`while` などの式では、開き括弧の前にスペースが挿入されます(関数呼び出しとは対照的に)。 + +``` cpp +for (size_t i = 0; i < rows; i += storage.index_granularity) +``` + +**7.** 二項演算子(`+`、`-`、`*`、`/`、`%`、...)と三項演算子 `?:` の周りにスペースを追加してください。 + +``` cpp +UInt16 year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0'); +UInt8 month = (s[5] - '0') * 10 + (s[6] - '0'); +UInt8 day = (s[8] - '0') * 10 + (s[9] - '0'); +``` + +**8.** 改行が入る場合は、演算子を新しい行に置き、その前にインデントを増やします。 + +``` cpp +if (elapsed_ns) + message << " (" + << rows_read_on_server * 1000000000 / elapsed_ns << " rows/s., " + << bytes_read_on_server * 1000.0 / elapsed_ns << " MB/s.) "; +``` + +**9.** 必要に応じて、行内の整列のためにスペースを使用することができます。 + +``` cpp +dst.ClickLogID = click.LogID; +dst.ClickEventID = click.EventID; +dst.ClickGoodEvent = click.GoodEvent; +``` + +**10.** 演算子 `.`、`->` の周りにスペースを使用しないでください。 + +必要であれば、演算子を次の行に包むことができます。この場合、前にインデントを増やします。 + +**11.** 単項演算子(`--`、`++`、`*`、`&`、...)を引数から分離するためにスペースを使用しないでください。 + +**12.** コンマの後にスペースを入れ、前には入れないでください。同じルールは `for` 式内のセミコロンにも当てはまります。 + +**13.** `[]` 演算子を分離するためのスペースを使用しないでください。 + +**14.** `template <...>` 式では、`template` と `<` の間にスペースを使用し、`<` の直後または `>` の直前にスペースを入れないでください。 + +``` cpp +template +struct AggregatedStatElement +{} +``` + +**15.** クラスや構造体では、`public`、`private`、`protected` を `class/struct` と同じレベルに書き、それ以外のコードはインデントします。 + +``` cpp +template +class MultiVersion +{ +public: + /// Version of object for usage. shared_ptr manage lifetime of version. + using Version = std::shared_ptr; + ... +} +``` + +**16.** ファイル全体で同じ `namespace` が使用され、他に重要なことがなければ、`namespace` 内でのインデントは不要です。 + +**17.** `if`、`for`、`while`、その他の式のブロックが単一の `statement` で構成されている場合、中括弧はオプションです。`statement` を別行に置いてください。このルールはネストされた `if`、`for`、`while` にも適用されます。 + +しかし、内部 `statement` に中括弧や `else` が含まれている場合、外部ブロックは中括弧で書かれるべきです。 + +``` cpp +/// Finish write. +for (auto & stream : streams) + stream.second->finalize(); +``` + +**18.** 行末にスペースを入れないでください。 + +**19.** ソースファイルは UTF-8 エンコードです。 + +**20.** 非ASCII文字は文字列リテラル内で使用できます。 + +``` cpp +<< ", " << (timer.elapsed() / chunks_stats.hits) << " μsec/hit."; +``` + +**21.** 単一行に複数の式を書かないでください。 + +**22.** 関数内のコードをセクションでグループ化し、最大で1つの空行で分離します。 + +**23.** 関数、クラスなどを1行または2行の空行で分離します。 + +**24.** `A const`(値に関連するもの)は型名の前に書かなければなりません。 + +``` cpp +//正しい書き方 +const char * pos +const std::string & s +//誤った書き方 +char const * pos +``` + +**25.** ポインタまたは参照を宣言するとき、`*` および `&` 記号は両側にスペースで分離されなければなりません。 + +``` cpp +//正しい書き方 +const char * pos +//誤った書き方 +const char* pos +const char *pos +``` + +**26.** テンプレート型を使用する場合、(最も簡単な場合を除いて)`using` キーワードでエイリアス化してください。 + +別の言い方をすると、テンプレートパラメータは `using` にのみ指定され、コード内で繰り返されません。 + +`using` は関数内などでローカルに宣言できます。 + +``` cpp +//正しい書き方 +using FileStreams = std::map>; +FileStreams streams; +//誤った書き方 +std::map> streams; +``` + +**27.** 異なる型の複数の変数を一度に宣言しないでください。 + +``` cpp +//誤った書き方 +int x, *y; +``` + +**28.** C スタイルのキャストを使用しないでください。 + +``` cpp +//誤った書き方 +std::cerr << (int)c <<; std::endl; +//正しい書き方 +std::cerr << static_cast(c) << std::endl; +``` + +**29.** クラスや構造体では、メンバーと関数をそれぞれの可視範囲内で別々にグループ化します。 + +**30.** 小さいクラスや構造体では、メソッドの宣言と実装を分ける必要はありません。 + +どのクラスや構造体でも小さなメソッドには同様です。 + +テンプレートクラスや構造体では、メソッドの宣言と実装を分けないでください(そうしないと、同じ翻訳単位に定義されなければなりません)。 + +**31.** 140文字で改行することができます、80文字ではなく。 + +**32.** 後置インクリメント/デクリメント演算子が必要ない場合は、常に前置インクリメント/デクリメント演算子を使用してください。 + +``` cpp +for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) +``` + +## コメント {#comments} + +**1.** 複雑な部分のコードには必ずコメントを追加してください。 + +これは非常に重要です。コメントを書くことで、そのコードが不要であるか、設計が間違っていることに気付く可能性があります。 + +``` cpp +/** 使用できるメモリの部分。 + * 例えば、internal_buffer が 1MB で、読み込みのためにファイルからバッファに 10 バイトしかロードされていない場合、 + * working_buffer は10バイトのサイズを持ちます。 + * (working_buffer.end() は読み取り可能な10バイトの直後の位置を指します)。 + */ +``` + +**2.** コメントは必要に応じて詳細に書くことができます。 + +**3.** コメントは、その説明対象コードの前に置いてください。まれに、同じ行内のコードの後に置くこともできます。 + +``` cpp +/** クエリを解析し、実行します。 +*/ +void executeQuery( + ReadBuffer & istr, /// クエリを(INSERTの場合はデータも)読み込む場所 + WriteBuffer & ostr, /// 結果を書き込む場所 + Context & context, /// DB、テーブル、データ型、エンジン、関数、集計関数... + BlockInputStreamPtr & query_plan, /// クエリがどのように実行されたかの説明がここに書かれる + QueryProcessingStage::Enum stage = QueryProcessingStage::Complete /// SELECT クエリをどの段階まで処理するか + ) +``` + +**4.** コメントは英語でのみ書かれなければなりません。 + +**5.** ライブラリを書いている場合は、メインヘッダーファイルに詳しい説明コメントを含めてください。 + +**6.** 追加情報を提供しないコメントを追加しないでください。特に、以下のような空コメントを残さないでください: + +``` cpp +/* +* Procedure Name: +* Original procedure name: +* Author: +* Date of creation: +* Dates of modification: +* Modification authors: +* Original file name: +* Purpose: +* Intent: +* Designation: +* Classes used: +* Constants: +* Local variables: +* Parameters: +* Date of creation: +* Purpose: +*/ +``` + +例はリソース http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/ から引用されています。 + +**7.** 各ファイルの冒頭には、作成者や作成日などのゴミコメントを書かないでください。 + +**8.** 単一行のコメントは三つのスラッシュ `///` で始まり、複数行のコメントは `/**` で始まります。これらのコメントは「ドキュメンテーション」と見なされます。 + +注意: Doxygen を使ってこれらのコメントからドキュメントを生成することができます。しかし、通常はIDEでコードをナビゲートする方が便利です。 + +**9.** 複数行のコメントは、冒頭と末尾に空行を置かないでください(複数行コメントを閉じる行を除く)。 + +**10.** コードをコメントアウトするためには、基本的なコメントを使用し、「ドキュメンテーション」コメントを使わないでください。 + +**11.** コミット前にはコメントアウトされたコード部分を削除してください。 + +**12.** コメントやコードに不適切な言葉を使わないでください。 + +**13.** 大文字を使用しないでください。過剰な句読点を使わないでください。 + +``` cpp +/// WHAT THE FAIL??? +``` + +**14.** コメントで区切りを作らないでください。 + +``` cpp +///****************************************************** +``` + +**15.** コメント内で議論を始めないでください。 + +``` cpp +/// Why did you do this stuff? +``` + +**16.** ブロックが何であったかを最後に説明するコメントは必要ありません。 + +``` cpp +/// for +``` + +## 名前 {#names} + +**1.** 変数とクラスメンバーの名前には小文字とアンダースコアを使用してください。 + +``` cpp +size_t max_block_size; +``` + +**2.** 関数(メソッド)の名前には、小文字で始まるキャメルケースを使用してください。 + +``` cpp +std::string getName() const override { return "Memory"; } +``` + +**3.** クラス(構造体)の名前には、大文字で始まるキャメルケースを使用してください。インターフェイスには I 以外のプレフィックスは使用しません。 + +``` cpp +class StorageMemory : public IStorage +``` + +**4.** `using` はクラスと同じように名付けられます。 + +**5.** テンプレート型の引数の名前は、簡単な場合には `T`; `T`, `U`; `T1`, `T2`. を使用します。 + +より複雑な場合には、クラス名の規則に従うか、プレフィックス `T` を追加します。 + +``` cpp +template +struct AggregatedStatElement +``` + +**6.** テンプレート定数引数の名前は、変数名の規則に従うか、簡単な場合には `N` を使用します。 + +``` cpp +template +struct ExtractDomain +``` + +**7.** 抽象クラス(インターフェース)の場合、`I` プレフィックスを追加できます。 + +``` cpp +class IProcessor +``` + +**8.** 変数をローカルに使用する場合、短い名前を使用できます。 + +他のすべての場合は意味を説明する名前を使用してください。 + +``` cpp +bool info_successfully_loaded = false; +``` + +**9.** `define` やグローバル定数の名前はアンダースコアを使用した ALL_CAPS を使用します。 + +``` cpp +#define MAX_SRC_TABLE_NAMES_TO_STORE 1000 +``` + +**10.** ファイル名はその内容と同じスタイルを使用します。 + +ファイルが単一のクラスを含む場合、クラスと同じようにファイルを名付けます(CamelCase)。 + +ファイルが単一の関数を含む場合、関数と同じようにファイルを名付けます(camelCase)。 + +**11.** 名前に略語が含まれている場合: + +- 変数名の場合、略語は小文字のまま `mysql_connection`(`mySQL_connection` ではない)で使用します。 +- クラスや関数の名前では、省略語の大文字を維持する `MySQLConnection`(`MySqlConnection` ではない)。 + +**12.** クラスメンバーを初期化するために使用されるコンストラクター引数は、クラスメンバーと同じように名付けますが、末尾にアンダースコアを付けて名付けます。 + +``` cpp +FileQueueProcessor( + const std::string & path_, + const std::string & prefix_, + std::shared_ptr handler_) + : path(path_), + prefix(prefix_), + handler(handler_), + log(&Logger::get("FileQueueProcessor")) +{ +} +``` + +構造体のコンストラクター本体で使用されない場合は、末尾のアンダースコアを省くことができます。 + +**13.** ローカル変数とクラスメンバーには違いがありません(プレフィックスは不要です)。 + +``` cpp +timer(`m_timer` ではなく) +``` + +**14.** `enum` の定数には、大文字から始まる CamelCase を使用します。ALL_CAPS も受け入れられます。`enum` がローカルでない場合は、`enum class` を使用してください。 + +``` cpp +enum class CompressionMethod +{ + QuickLZ = 0, + LZ4 = 1, +}; +``` + +**15.** すべての名前は英語でなければなりません。ヘブライ文字の翻字は許可されません。 + + T_PAAMAYIM_NEKUDOTAYIMではありません + +**16.** よく知られている略語が許容されます(略語の意味をウィキペディアや検索エンジンで簡単に見つけることができる場合)。 + + `AST`、`SQL`。 + + `NVDH`(ランダムな文字の列)ではない + +一般的な使用で短縮された単語は許容されます。 + +略語の意味がコメントで併記されている場合も使用できます。 + +**17.** C++ ソースコードのファイル名には `.cpp` 拡張子を使わなければなりません。ヘッダーファイルには `.h` 拡張子を使わなければなりません。 + +## コードの書き方 {#how-to-write-code} + +**1.** メモリ管理。 + +手動でのメモリの解放(`delete`)はライブラリコードでのみ使用できます。 + +ライブラリコードでは、`delete` 演算子はデストラクタでのみ使用できます。 + +アプリケーションコードでは、メモリはその所有者であるオブジェクトが解放しなければなりません。 + +例: + +- 最も簡単なのは、オブジェクトをスタックに置くか、他のクラスのメンバーにすることです。 +- 小さなオブジェクトの多くを扱うためには、コンテナを使用します。 +- ヒープにある少数のオブジェクトの自動解放のためには、`shared_ptr/unique_ptr` を使用します。 + +**2.** リソース管理。 + +`RAII` を使用し、上記を参照してください。 + +**3.** エラーハンドリング。 + +例外を使ってください。ほとんどの場合、例外を投げるだけでキャッチする必要はありません(`RAII` のため)。 + +オフラインデータ処理アプリケーションでは、例外をキャッチしないことがしばしば許容されます。 + +ユーザーリクエストを処理するサーバーでは、通常、接続ハンドラの最上位レベルで例外をキャッチするだけで十分です。 + +スレッド関数内では、すべての例外をキャッチして保持し、`join` の後にメインスレッドで再スローする必要があります。 + +``` cpp +/// 計算がまだ行われていない場合、最初のブロックを同期的に計算します +if (!started) +{ + calculate(); + started = true; +} +else /// 計算がすでに進行中である場合、結果を待ちます + pool.wait(); + +if (exception) + exception->rethrow(); +``` + +例外を処理せずに無視しないでください。ただ例外をログに出力するだけの行為はしないでください。 + +``` cpp +//正しくありません +catch (...) {} +``` + +一部の例外を無視する必要がある場合は、特定のものに限定し、残りは再スローしてください。 + +``` cpp +catch (const DB::Exception & e) +{ + if (e.code() == ErrorCodes::UNKNOWN_AGGREGATE_FUNCTION) + return nullptr; + else + throw; +} +``` + +応答コードや `errno` を持つ関数を使用する場合、常に結果を確認し、エラーの場合は例外を投げます。 + +``` cpp +if (0 != close(fd)) + throw ErrnoException(ErrorCodes::CANNOT_CLOSE_FILE, "Cannot close file {}", file_name); +``` + +コードの不変条件を確認するには、アサートを使用できます。 + +**4.** 例外の種類。 + +アプリケーションコードでの複雑な例外階層を使用する必要はありません。例外のテキストはシステム管理者に理解できるものであるべきです。 + +**5.** デストラクタからの例外の投げ。 + +これは推奨されませんが、許可されています。 + +次のオプションを使用してください: + +- 例外を引き起こす可能性のあるすべての作業を事前に行う `done()` または `finalize()` という関数を作成します。その関数が呼ばれた場合、後のデストラクタに例外がないはずです。 +- 余りに複雑なタスク(例えば、ネットワーク越しのメッセージの送信)は、クラスユーザーが破壊前に呼び出す必要がある別のメソッドに置くことができます。 +- デストラクタで例外が発生した場合、(ロガーが利用可能であれば)隠すよりもログを残す方が良いです。 +- 単純なアプリケーションでは、例外の処理に `std::terminate` に依存する(C++11のデフォルトの `noexcept` の場合)ことが許容されます。 + +**6.** 匿名コードブロック。 + +単一の関数内に別のコードブロックを作成して、特定の変数をローカルにし、ブロックを抜ける際にデストラクタを呼び出すことができます。 + +``` cpp +Block block = data.in->read(); + +{ + std::lock_guard lock(mutex); + data.ready = true; + data.block = block; +} + +ready_any.set(); +``` + +**7.** マルチスレッド。 + +オフラインデータ処理プログラムでは: + +- 単一の CPU コアで最高のパフォーマンスを得ることを目指してください。必要に応じてコードを並列化できます。 + +サーバーアプリケーションでは: + +- リクエストを処理するためにスレッドプールを使用します。ユーザースペースのコンテキストスイッチを必要とするタスクはまだありません。 + +並列化のためにフォークは使用されていません。 + +**8.** スレッドの同期。 + +多くの場合、異なるスレッドが異なるメモリセルを使用するようにすることができ(さらに良いのは異なるキャッシュライン)、スレッドの同期を使用しないようにします(`joinAll` を除く)。 + +同期が必要な場合、ほとんどの場合、`lock_guard` でミューテックスを使用するだけで十分です。 + +他の場合は、システム同期プリミティブを使用します。ビジーウェイトを使用しないでください。 + +アトミック操作は最も簡単な場合にのみ使用してください。 + +専門的な領域でない限り、ロックフリーのデータ構造を実装しようとしないでください。 + +**9.** ポインタと参照。 + +ほとんどの場合、参照を使用してください。 + +**10.** `const`。 + +定数参照、定数へのポインタ、`const_iterator`、`const` メソッドを使用してください。 + +`const` をデフォルトと考え、必要な場合のみ非 `const` を使用します。 + +値渡しで変数を渡す場合、通常 `const` を使用する意味はありません。 + +**11.** unsigned。 + +必要であれば `unsigned` を使用してください。 + +**12.** 数値型。 + +型 `UInt8`、`UInt16`、`UInt32`、`UInt64`、`Int8`、`Int16`、`Int32`、`Int64` を使用してください。また `size_t`、`ssize_t`、`ptrdiff_t` も使用してください。 + +これらの型を数字には使用しないでください:`signed/unsigned long`、`long long`、`short`、`signed/unsigned char`、`char`。 + +**13.** 引数の渡し方。 + +値が複雑である場合、移動する場合は値渡しをし、`std::move` を使用します。値を更新したい場合は参照渡しをします。 + +ヒープに作成されたオブジェクトの所有権を関数が取得する場合、引数の型を `shared_ptr` または `unique_ptr` にします。 + +**14.** 戻り値。 + +ほとんどの場合、ただ `return` を使用してください。`return std::move(res)` と書かないでください。 + +関数がヒープにオブジェクトを割り当ててそれを返す場合、`shared_ptr` または `unique_ptr` を使用してください。 + +まれに(ループ中に値を更新する場合)、引数を通じて値を返す必要があるかもしれません。この場合、引数は参照であるべきです。 + +``` cpp +using AggregateFunctionPtr = std::shared_ptr; + +/** 名前に基づいて集計関数を作成できるようにします。 + */ +class AggregateFunctionFactory +{ +public: + AggregateFunctionFactory(); + AggregateFunctionPtr get(const String & name, const DataTypes & argument_types) const; +``` + +**15.** `namespace`。 + +アプリケーションコードには個別の `namespace` を使用する必要はありません。 + +小さなライブラリにも必要ありません。 + +中大規模のライブラリはすべてを `namespace` に置きます。 + +ライブラリの `.h` ファイルでは、実装の詳細を隠すために `namespace detail` を使用することができます。 + +`.cpp` ファイルでは、シンボルを隠すために `static` または匿名の `namespace` を使用できます。 + +別途外部 `namespace` に出さないため `enum` に `namespace` を使用することもできます(ただし `enum class` を使用する方が良いです)。 + +**16.** 遅延初期化。 + +初期化に引数が必要な場合、通常デフォルトコンストラクタを書くべきではありません。 + +後で初期化を遅らせる必要がある場合、無効なオブジェクトを作成するデフォルトコンストラクタを追加できます。または、少数のオブジェクトについては `shared_ptr/unique_ptr` を使用することができます。 + +``` cpp +Loader(DB::Connection * connection_, const std::string & query, size_t max_block_size_); + +/// 遅延初期化のために +Loader() {} +``` + +**17.** 仮想関数。 + +クラスがポリモーフィックな使用を意図していなければ、関数を仮想化する必要はありません。これはデストラクタにもあてはまります。 + +**18.** エンコーディング。 + +どこでも UTF-8 を使用してください。`std::string` と `char *` を使用してください。`std::wstring` と `wchar_t` は使用しないでください。 + +**19.** ロギング。 + +コードの至るところにある例を参照してください。 + +コミットする前に、意味のないログ、デバッグログ、その他の種類のデバッグ出力を削除してください。 + +サイクル中のロギングは、トレースレベルでも避けるべきです。 + +ログはどのログレベルでも読みやすくなければなりません。 + +基本的には、アプリケーションコードでのみロギングを行います。 + +ログメッセージは英語で書かれなければなりません。 + +ログはシステム管理者が理解できるものであるべきです。 + +ログに不適切な言葉を使わないでください。 + +ログには UTF-8 エンコードを使用します。まれに、ログに非ASCII文字を使用することが許容されます。 + +**20.** 入出力。 + +アプリケーションの性能にとって重要な内部サイクルでは `iostreams` を使用しないでください(そして `stringstream` は一切使用しないでください)。 + +代わりに `DB/IO` ライブラリを使用してください。 + +**21.** 日付と時刻。 + +`DateLUT` ライブラリを参照してください。 + +**22.** include。 + +インクルードガードの代わりに常に `#pragma once` を使用してください。 + +**23.** using。 + +`using namespace` は使用されません。特定のものについては `using` を使用できます。でもクラスや関数内でローカルにしてください。 + +**24.** 必要でない限り、関数に `trailing return type` を使用しないでください。 + +``` cpp +auto f() -> void +``` + +**25.** 変数の宣言と初期化。 + +``` cpp +//正しい方法 +std::string s = "Hello"; +std::string s{"Hello"}; + +//誤った方法 +auto s = std::string{"Hello"}; +``` + +**26.** 仮想関数の場合、基底クラスで `virtual` を、派生クラスでは `virtual` の代わりに `override` を書いてください。 + +## 未使用の C++ 機能 {#unused-features-of-c} + +**1.** 仮想継承は使用されていません。 + +**2.** 最新の C++ で便利なシンタックスシュガーを持つ構造体、例えば: + +``` +// シンタックスシュガーのない従来の方法 +template ::value, void>> // SFINAE を std::enable_if で使用、 ::value の使用 + +std::pair func(const E & e) // 返り値型を明示指定 +{ + if (elements.count(e)) // .count() メンバーシップテスト + { + // ... + } + + elements.erase( + std::remove_if( + elements.begin(), elements.end(), + [&](const auto x){ + return x == 1; + }), + elements.end()); // remove-erase イディオム + + return std::make_pair(1, 2); // make_pair() でペアを作成 +} + +// シンタックスシュガーを使用した方法 (C++14/17/20) +template +requires std::same_v // SFINAE を C++20 のコンセプトで、C++14 テンプレートエイリアスの使用 +auto func(const E & e) // auto 返り値型 (C++14) +{ + if (elements.contains(e)) // C++20 .contains メンバーシップテスト + { + // ... + } + + elements.erase_if( + elements, + [&](const auto x){ + return x == 1; + }); // C++20 std::erase_if + + return {1, 2}; // または: return std::pair(1, 2); // 初期化リストや値初期化 (C++17) でペアを作成 +} +``` + +## プラットフォーム {#platform} + +**1.** 特定のプラットフォーム用にコードを書いています。 + +しかし、他の条件が同じであれば、クロスプラットフォームまたは移植可能なコードが好まれます。 + +**2.** 言語: C++20(使用可能な [C++20 機能](https://en.cppreference.com/w/cpp/compiler_support#C.2B.2B20_features) のリストを参照してください)。 + +**3.** コンパイラ: `clang`。執筆時(2022年7月現在)、コードはクランバージョン >= 12 を使用してコンパイルされています。(`gcc` でもコンパイルできますが、テストされておらず、本番使用には適していません)。 + +標準ライブラリは「`libc++`」を使用します。 + +**4.**OS: Linux Ubuntu、Precise以降。 + +**5.** コードは x86_64 CPU アーキテクチャ用に書かれています。 + +CPU 命令セットはサーバーの中でサポートされている最小のセットです。現在は SSE 4.2 です。 + +**6.** 許可されているいくつかの例外を除いて `-Wall -Wextra -Werror -Weverything` コンパイルフラグを使用します。 + +**7.** 静的リンクを、静的に接続するのが難しいライブラリを除いて、すべてのライブラリで使用します(`ldd` コマンドの出力を参照してください)。 + +**8.** コードはリリース設定で開発およびデバッグされています。 + +## ツール {#tools} + +**1.** KDevelop は良い IDE です。 + +**2.** デバッグには `gdb`、`valgrind`(`memcheck`)、`strace`、`-fsanitize=...`、`tcmalloc_minimal_debug` を使用します。 + +**3.** プロファイリングには `Linux Perf`、`valgrind`(`callgrind`)、`strace -cf` を使用します。 + +**4.** ソースは Git にあります。 + +**5.** 組み立てには `CMake` を使用します。 + +**6.** プログラムは `deb` パッケージを用いてリリースされます。 + +**7.** マスタへのコミットはビルドを壊してはいけません。 + +ただし、選択されたリビジョンのみが動作可能と見なされます。 + +**8.** コードは完全に準備が整っていなくても、できるだけ頻繁にコミットしてください。 + +この目的のためにブランチを使用します。 + +`master` ブランチでのコードがまだビルド可能でない場合、`push` の前にそれをビルドから除外してください。数日以内に完成させるか、削除する必要があります。 + +**9.** 非自明な変更にはブランチを使用し、サーバーに公開してください。 + +**10.** 使用されていないコードはリポジトリから削除します。 + +## ライブラリ {#libraries} + +**1.** C++20 標準ライブラリ(エクスペリメンタルな拡張を含む)、`boost`、`Poco` フレームワークが使用されています。 + +**2.** OS パッケージからのライブラリの使用は許可されていません。また、事前にインストールされたライブラリの使用も許可されていません。すべてのライブラリは `contrib` ディレクトリにソースコードの形で配置され、ClickHouse と共にビルドされなければなりません。詳細については [新しいサードパーティライブラリの追加に関するガイドライン](contrib.md#adding-third-party-libraries) を参照してください。 + +**3.** 常に既に使用されているライブラリを優先します。 + +## 一般的な推奨事項 {#general-recommendations-1} + +**1.** 可能な限り少ないコードを書くようにします。 + +**2.** 最も簡単な解決策を試みます。 + +**3.** 動作と内部ループの動作がわかるまでコードを書かないでください。 + +**4.** 単純なケースでは `using` を使用してクラスや構造体の代わりにします。 + +**5.** コピコンストラクタ、割り当て演算子、デストラクタ(クラスが少なくとも1つの仮想関数を含む場合の仮想デストラクタを除いて)、ムーブコンストラクタまたはムーブ割り当て演算子を可能な限り書かないでください。言い換えれば、コンパイラが生成する関数が正しく動作するはずです。`default` を使用できます。 + +**6.** コードの簡素化が奨励されます。可能な場合、コードのサイズを縮小します。 + +## 追加の推奨事項 {#additional-recommendations} + +**1.** `stddef.h` からの型に `std::` を明示的に指定することは推奨されません。言い換えれば、`std::size_t` ではなく、短い方の `size_t` と書くことをお勧めします。 + +`std::` を追加することは許容されます。 + +**2.** 標準Cライブラリの関数に `std::` を明示的に指定することは推奨されません。言い換えれば、`memcpy` と書きます(`std::memcpy` ではない)。 + +理由は、標準ではない類似関数、例えば `memmem` が存在するためです。これらの関数は `namespace std` に存在しません。 + +どこにでも `memcpy` の代わりに `std::memcpy` と記述するなら、`memmem` を `std::` なしで記述するのは奇妙に見えるでしょう。 + +それにもかかわらず、`std::` が好まされれば、それを使用できます。 + +**3.** 標準C++ライブラリに同じものがある場合に C の関数を使用すること。 + +これはより効率的である場合には受け入れられます。 + +例えば、大きなメモリチャンクのコピーには `memcpy` を使用します(`std::copy` より)。 + +**4.** 複数行の関数引数。 + +次のような折り返しスタイルが許容されます: + +``` cpp +function( + T1 x1, + T2 x2) +``` + +``` cpp +function( + size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function(size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function(size_t left, size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + +``` cpp +function( + size_t left, + size_t right, + const & RangesInDataParts ranges, + size_t limit) +``` + diff --git a/docs/ja/development/tests.md b/docs/ja/development/tests.md new file mode 100644 index 00000000000..cd3e9e0f62f --- /dev/null +++ b/docs/ja/development/tests.md @@ -0,0 +1,370 @@ +--- +slug: /ja/development/tests +sidebar_position: 72 +sidebar_label: テスト +title: ClickHouseのテスト +description: ほとんどのClickHouseの機能は機能テストでテスト可能であり、ClickHouseコードの変更には必ずこれを使用する必要があります。 +--- + +## 機能テスト + +機能テストは最も簡単で便利に使用できるものです。ほとんどのClickHouseの機能は機能テストでテストすることができ、そのようにテストできるClickHouseコードの変更には必ず使用することが求められます。 + +各機能テストは、実行中のClickHouseサーバーに対して一つまたは複数のクエリを送信し、結果を参照と比較します。 + +テストは `queries` ディレクトリに配置されています。二つのサブディレクトリがあり、それぞれ `stateless` と `stateful` です。Statelessテストは、事前にロードしたテストデータなしでクエリを実行し、テスト内で小さな合成データセットを即席で作成することが多いです。Statefulテストは、ClickHouseから事前にロードされたテストデータを必要とし、一般公開されています。 + +各テストは `.sql` または `.sh` のどちらかの形式であり得ます。`.sql` テストは `clickhouse-client` にパイプされる単純なSQLスクリプトです。`.sh` テストはそれ自体で実行されるスクリプトです。通常、SQLテストは `.sh` テストよりも好まれます。`.sh` テストは通常のSQLでは試せない機能(`clickhouse-client` にデータをパイプしたり、`clickhouse-local` をテストしたりする際など)のテストが必要な場合にのみ使用すべきです。 + +:::note +`DateTime` および `DateTime64` データ型をテストする際の一般的な誤りは、サーバーが特定のタイムゾーン(例:"UTC")を使用していると仮定することです。実際にはそうではなく、CIテスト実行時のタイムゾーンは意図的にランダム化されています。最も簡単な回避策は、テスト値にタイムゾーンを明示的に指定することです。例えば、`toDateTime64(val, 3, 'Europe/Amsterdam')` などです。 +::: + +### ローカルでテストを実行する {#functional-test-locally} + +ClickHouseサーバーをデフォルトのポート(9000)でローカルで起動します。例えば、`01428_hash_set_nan_key` テストを実行するには、リポジトリのフォルダに移動し次のコマンドを実行します: + +``` +PATH=:$PATH tests/clickhouse-test 01428_hash_set_nan_key +``` + +テスト結果(`stderr` および `stdout`)は、テストファイル自体の近くにある `01428_hash_set_nan_key.[stderr|stdout]` というファイルに書き込まれます(つまり `queries/0_stateless/foo.sql` の出力は `queries/0_stateless/foo.stdout` にあります)。 + +詳細なオプションは `tests/clickhouse-test --help` を参照してください。全てのテストを単に実行するか、テスト名に含まれるサブストリングでフィルタリングされたテストのサブセットを実行することができます: `./clickhouse-test substring`。また、テストを並行して実行したり、ランダムな順序で実行したりするオプションもあります。 + +### 新しいテストの追加 + +新しいテストを追加するには、`queries/0_stateless` ディレクトリに `.sql` または `.sh` ファイルを作成し、手動で確認した後で次の方法で `.reference` ファイルを生成します: `clickhouse-client < 00000_test.sql > 00000_test.reference` または `./00000_test.sh > ./00000_test.reference`。 + +テストは、事前に作成されていると仮定される `test` データベース内のテーブル(作成、削除など)を使用するのみで、また一時テーブルを使用することもできます。 + +### テスト実行を制限する + +テストには、テスト実行の制限を指定するために零個またはそれ以上の _テストタグ_ を含めることができます。 + +`.sh` テストのタグは、二行目にコメントとして記述します: + +```bash +#!/usr/bin/env bash +# Tags: no-fasttest +``` + +`.sql` テストのタグは、一行目にSQLコメントとして配置します: + +```sql +-- Tags: no-fasttest +SELECT 1 +``` + +| タグ名 | 内容 | 使用例 | +|---|---|---| +| `disabled`| テストは実行されない || +| `long` | テストの実行時間を1分から10分へ延長 || +| `deadlock` | テストを長時間ループで実行 || +| `race` | `deadlock`と同じ。`deadlock`を優先 || +| `shard` | サーバーが `127.0.0.*` をリッスンする必要があります || +| `distributed` | `shard`と同じ。`shard`を優先 || +| `global` | `shard`と同じ。`shard`を優先 || +| `zookeeper` | テストにはZookeeperまたはClickHouse Keeperが必要 | テストは `ReplicatedMergeTree` を使用 | +| `replica` | `zookeeper`と同じ。`zookeeper`を優先 || +| `no-fasttest`| [高速テスト](continuous-integration.md#fast-test) でテストされない | `MySQL` テーブルエンジンは高速テストで無効化されている | +| `no-[asan, tsan, msan, ubsan]` | [サニタイザ](#sanitizers)を使用するビルドでテストを無効化 | QEMUの下でのテストはサニタイザと動作しない | +| `no-replicated-database` ||| +| `no-ordinary-database` ||| +| `no-parallel` | 他のテストと並行して実行されることを禁止 | テストは `system` テーブルから読み取られ、不変条件が破られる可能性がある | +| `no-parallel-replicas` ||| +| `no-debug` ||| +| `no-stress` ||| +| `no-polymorphic-parts` ||| +| `no-random-settings` ||| +| `no-random-merge-tree-settings` ||| +| `no-backward-compatibility-check` ||| +| `no-cpu-x86_64` ||| +| `no-cpu-aarch64` ||| +| `no-cpu-ppc64le` ||| +| `no-s3-storage` ||| + +上記の設定に加えて、特定のClickHouse機能の使用を定義するために `system.build_options` の `USE_*` フラグを使用できます。 +例えば、テストがMySQLテーブルを使用している場合は、`use-mysql` タグを追加してください。 + +### ランダム設定の限界を指定する + +テストは、実行中にランダム化される設定について、最小および最大許容値を指定することができます。 + +`.sh` テストの場合、限界はタグの次の行またはタグが指定されていない場合は二行目にコメントとして記述します: + +```bash +#!/usr/bin/env bash +# Tags: no-fasttest +# Random settings limits: max_block_size=(1000, 10000); index_granularity=(100, None) +``` + +`.sql` テストの場合、限界はタグの次の行または一行目にSQLコメントとして指定します: + +```sql +-- Tags: no-fasttest +-- Random settings limits: max_block_size=(1000, 10000); index_granularity=(100, None) +SELECT 1 +``` + +一つの限界のみを指定する場合は、もう一方に `None` を使用できます。 + +### テスト名の選び方 + +テスト名は、5桁の接頭辞に続く説明的な名前で開始します(例: `00422_hash_function_constexpr.sql`)。接頭辞を選ぶには、そのディレクトリで既に存在する最大の接頭辞を見つけ、それを1ずつ増やします。その間に、同じ数の接頭辞を持つ他のテストが追加されるかもしれませんが、それは問題ではなく、その後で変更する必要はありません。 + +### 発生すべきエラーの確認 + +時々、サーバーエラーが不正なクエリに対して発生するかテストしたいことがあります。このために、SQLテストで次の形式の特別なアノテーションをサポートしています: +``` +select x; -- { serverError 49 } +``` +このテストは、サーバーが未知のカラム `x` に関するエラーコード49を返すことを保証します。エラーが発生しないか、別のエラーが発生した場合、テストは失敗します。クライアント側でエラーが発生することを確認したい場合は、`clientError` アノテーションを使用してください。 + +エラーメッセージの具体的な表現の確認はしないでください。将来的に変更される可能性があり、テストが不必要に壊れます。エラーコードだけを確認してください。既存のエラーコードがあなたのニーズに十分に厳密でない場合、新しいエラーコードを追加することを検討してください。 + +### 分散クエリのテスト + +機能テストで分散クエリを使用したい場合は、`127.0.0.{1..2}` アドレスを使ってサーバーが自身をクエリする `remote` テーブル関数を活用することができます。または、サーバー設定ファイルで事前に定義されたテストクラスター(例: `test_shard_localhost`)を使用することができます。分散クエリをサポートするためにサーバーが正しく構成されているCI設定で実行されるよう、テスト名に `shard` または `distributed` という単語を追加してください。 + +### 一時ファイルの取り扱い + +時にはシェルテストで、作業用に即席でファイルを作成する必要があるかもしれません。いくつかのCIチェックでは、テストが並行して実行されるため、一意ではない名前のファイルをスクリプト内で作成または削除すると、フレーク状のファイルなどのCIチェックが失敗する可能性があります。この問題を回避するため、環境変数 `$CLICKHOUSE_TEST_UNIQUE_NAME` を使用して、実行中のテストに固有の名前を一時ファイルに付けるべきです。これにより、セットアップ時に作成したりクリーンアップ時に削除したりするファイルが、そのテストのみで使用中のファイルであり、並行して実行される他のテストではないことが確認できます。 + +## 既知のバグ {#known-bugs} + +機能テストによって容易に再現できるバグが見つかっている場合、その準備された機能テストを `tests/queries/bugs` ディレクトリに保存します。バグが修正された際には、これらのテストは `tests/queries/0_stateless` に移動されます。 + +## 統合テスト {#integration-tests} + +統合テストは、ClickHouseのクラスター構成でのテストや、ClickHouseがMySQL、Postgres、MongoDBなどの他のサーバーとどのように連携するかをテストすることを可能にします。これらはネットワーク分割やパケットドロップなどをエミュレートするのに役立ちます。これらのテストはDocker上で実行され、様々なソフトウェアを含む複数のコンテナを作成します。 + +これらのテストを実行する方法は `tests/integration/README.md` を参照してください。 + +ClickHouseとサードパーティドライバの統合はテストされていないことに注意が必要です。また、現在、JDBCおよびODBCドライバとの統合テストはありません。 + +## ユニットテスト {#unit-tests} + +ユニットテストは、ClickHouse全体ではなく、単一の独立したライブラリやクラスをテストしたい場合に役立ちます。CMakeオプションの `ENABLE_TESTS` でテストのビルドを有効または無効にすることができます。ユニットテスト(およびその他のテストプログラム)は、コード全体の `tests` サブディレクトリにあります。ユニットテストを実行するには、`ninja test` と入力します。一部のテストは `gtest` を使用していますが、テストが失敗すると非ゼロの終了コードを返すプログラムもあります。 + +コードが既に機能テストでカバーされている場合、ユニットテストを持つ必要はありません(通常、機能テストは使用が非常に簡単です)。 + +個々のgtestチェックを実行するには、次のように実行ファイルを直接呼び出します: + +```bash +$ ./src/unit_tests_dbms --gtest_filter=LocalAddress* +``` + +## パフォーマンステスト {#performance-tests} + +パフォーマンステストは、ClickHouseのある特定の部分のパフォーマンスを測定し、合成クエリで比較することができます。パフォーマンステストは `tests/performance/` に配置されています。各テストはテストケースの説明を含む `.xml` ファイルで表現されます。テストは `docker/test/performance-comparison` ツールを使用して実行されます。起動方法はReadmeファイルで確認してください。 + +各テストは一つまたは複数のクエリをループで実行します(パラメータの組み合わせを伴う可能性があります)。 + +ClickHouseのパフォーマンスをあるシナリオで改善したい場合、そして改善が単純なクエリで観察されるのであれば、パフォーマンステストを書くことを強くお勧めします。また、比較的孤立しており、あまり複雑でないSQL関数を追加または変更する場合にも、パフォーマンステストを書くことを推奨します。テストの際には常に `perf top` や他の `perf` ツールを使用することが意味があります。 + +## テストツールとスクリプト {#test-tools-and-scripts} + +`tests` ディレクトリ内のいくつかのプログラムは準備されたテストではなく、テストツールです。例えば、`Lexer` のために `src/Parsers/tests/lexer` というツールがあり、これは標準入力のトークン化を行い、標準出力にカラー化された結果を書き出します。これらの種類のツールはコード例として、または検証や手動テストのために使用できます。 + +## その他のテスト {#miscellaneous-tests} + +`tests/external_models` には機械学習モデルのテストがあります。これらのテストは更新されておらず、統合テストに移行する必要があります。 + +クォーラム挿入のための個別のテストがあります。このテストはClickHouseクラスターを別のサーバー上で実行し、いくつかの故障ケースをエミュレートします: ネットワーク分割、パケットドロップ(ClickHouseノード間、ClickHouseとZooKeeper間、ClickHouseサーバーとクライアント間など)、`kill -9`、`kill -STOP`、および`kill -CONT`などを、[Jepsen](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パッケージをインストールすることもできます: ClickHouseリポジトリからの安定版リリースまたは`./release` を使用して自分自身でビルドしたパッケージを入手可能です。サーバーを起動するには `sudo clickhouse start`(またはサーバーを停止するには stop)を実行します。ログは `/etc/clickhouse-server/clickhouse-server.log` にあります。 + +システムにすでにClickHouseがインストールされている場合、新しい `clickhouse` バイナリをビルドし、既存のバイナリを置き換えることができます: + +``` bash +$ sudo clickhouse stop +$ sudo cp ./clickhouse /usr/bin/ +$ sudo clickhouse start +``` + +またシステムのclickhouse-serverを停止し、同じ設定で独自のサーバーをターミナルでログを取りながら実行することもできます: + +``` bash +$ sudo clickhouse 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-serverがすでに実行中であり、それを停止したくない場合、`config.d` ディレクトリ内のファイルで上書きすることにより自分の `config.xml` のポート番号を変更して適切なデータパスを提供し、実行できます。 + +`clickhouse` バイナリはほとんど依存関係がなく、幅広いLinuxディストリビューションで動作します。サーバー上での変更を素早く確認したい場合、ビルドした `clickhouse` バイナリをサーバーに `scp` し、上記の例のようにそれを実行することができます。 + +## ビルドテスト {#build-tests} + +ビルドテストを行うことで、異なる代替構成や一部の外国のシステムでビルドが壊れていないことを確認できます。これらのテストは自動化されています。 + +例: +- Darwin x86_64(macOS)用のクロスコンパイル +- FreeBSD x86_64用のクロスコンパイル +- Linux AArch64用のクロスコンパイル +- システムパッケージからのライブラリでUbuntu上でビルド(推奨されない) +- ライブラリの共有リンクでビルド(推奨されない) + +例えば、システムパッケージからのビルドは悪い慣習です。なぜなら、システムが何のバージョンのパッケージを持つかを保証できないからです。しかし、これはDebianのメンテナによってどうしても必要とされます。このため、少なくともこのビルドのバリエーションをサポートする必要があります。別の例としては、共有リンクは一般的なトラブルの原因となりますが、一部の愛好家には必要です。 + +全てのビルドのバリエーションに全てのテストを実行することはできませんが、少なくとも様々なビルドバリエーションが壊れていないことは確認したいと考えています。この目的でビルドテストを使用します。 + +また、コンパイルするのに時間がかかるか、多くのRAMを必要とする翻訳単位がないこともテストします。 + +また、大きすぎるスタックフレームがないこともテストします。 + +## プロトコル互換性のテスト {#testing-for-protocol-compatibility} + +ClickHouseネットワークプロトコルを拡張する際には、古いclickhouse-clientが新しいclickhouse-serverと動作するか、新しいclickhouse-clientが古いclickhouse-serverと動作するかを手動でテストしています(対応するパッケージからのバイナリを実行することで確認)。 + +また、統合テストでいくつかのケースを自動的にテストしています: +- 古いバージョンのClickHouseによって書かれたデータが新しいバージョンで正しく読み取り可能であるかどうか。 +- 異なるClickHouseバージョンが混在するクラスターで分散クエリが機能するかどうか。 + +## コンパイラの支援 {#help-from-the-compiler} + +メインのClickHouseコード(`dbms` ディレクトリにあるコード)は、`-Wall -Wextra -Werror` およびいくつかの追加の警告が有効になってビルドされます。ただし、これらのオプションはサードパーティのライブラリには適用されていません。 + +Clangにはさらに多くの有用な警告があります - `-Weverything` を使ってそれらを探し、デフォルトビルドに取り入れるものを選ぶことができます。 + +本番ビルドではclangが使用されますが、gccビルドもテストしています。開発では、clangを使用する方が通常は便利です。自分のマシンでデバッグモードでビルドする(ラップトップのバッテリーを節約するため)ことができますが、コンパイラは `-O3` を使ってより良い制御フローおよび手続き間解析を行い、より多くの警告を生成することができることを注意してください。デバッグモードでclangを使用するとき、`libc++` のデバッグバージョンが使用され、実行時により多くのエラーをキャッチできるようになります。 + +## サニタイザ {#sanitizers} + +:::note +ローカルで起動するときにプロセス(ClickHouseサーバーまたはクライアント)がクラッシュする場合は、アドレス空間レイアウトランダム化を無効にする必要があるかもしれません: `sudo sysctl kernel.randomize_va_space=0` +::: + +### アドレスサニタイザ +ASanの下での機能テスト、統合テスト、ストレステスト、およびユニットテストをコミットごとに実行しています。 + +### スレッドサニタイザ +TSanの下での機能テスト、統合テスト、ストレステスト、およびユニットテストをコミットごとに実行しています。 + +### メモリサニタイザ +MSanの下での機能テスト、統合テスト、ストレステスト、およびユニットテストをコミットごとに実行しています。 + +### 不定動作サニタイザ +UBSanの下での機能テスト、統合テスト、ストレステスト、およびユニットテストをコミットごとに実行しています。いくつかのサードパーティライブラリのコードはUBについてのサニタイジングがされていません。 + +### Valgrind(Memcheck) +過去にはValgrindを使って夜間に機能テストを実行していましたが、今は行っていません。数時間かかります。現在、`re2` ライブラリに既知の偽陽性が一つあります。詳細は[この記事](https://research.swtch.com/sparse)を参照してください。 + +## ファジング {#fuzzing} + +ClickHouseのファジングは、[libFuzzer](https://llvm.org/docs/LibFuzzer.html) とランダムSQLクエリの両方を使用して実装されています。 +すべてのファジーテストはサニタイザ(アドレスおよび不定動作)を使用して実行するべきです。 + +LibFuzzerはライブラリコードの孤立したファジーテストに使用されます。ファジーはテストコードの一部として実装され、「_fuzzer」という名前の接尾辞が付けられます。 +ファザーの例は `src/Parsers/fuzzers/lexer_fuzzer.cpp` にあります。LibFuzzer固有の設定、Dictionary、およびコーパスは `tests/fuzz` に保存されています。 +ユーザー入力を処理するすべての機能に対してファジーテストを書くことを奨励します。 + +ファッザーはデフォルトでビルドされません。ファッザーをビルドするには `-DENABLE_FUZZING=1` および `-DENABLE_TESTS=1` オプションを設定する必要があります。 +ジェマロックを無効にしてファジーテストをビルドすることをお勧めします。ClickHouseのファッジングをGoogleのOSS-Fuzzに統合するために使用される構成は `docker/fuzz` にあります。 + +また、サーバーがそれらを実行するときに死なないことを確認するためにランダムSQLクエリを生成する単純なファジーテストも使用します。 +`00746_sql_fuzzy.pl` にあります。これは継続的に(夜間や長時間にわたって)実行されるべきテストです。 + +また、ASTベースの高度なクエリファザーを使用し、多くのコーナーケースを見つけることができます。これはクエリASTでランダムな置換を行います。テストの途中でそれらをランダムな順序で処理する際に、以前のテストからASTノードを記憶し、後続のテストのファジングにそれらを使用します。このファザーについての詳細は[このブログ記事](https://clickhouse.com/blog/fuzzing-click-house)で学ぶことができます。 + +## ストレステスト + +ストレステストはファジングの別のケースです。これは一つのサーバーでランダムな順序で並行してすべての機能テストを実行します。テスト結果は確認されません。 + +確認されること: +- サーバーがクラッシュしないこと、デバッグまたはサニタイザのトラップが発動されないこと +- デッドロックがないこと +- データベース構造が一貫していること +- テスト後にサーバーが正常に停止でき、例外なく再起動できること + +デバッグ、ASan、TSan、MSan、UBSanの五つのバリエーションがあります。 + +## スレッドファザー + +スレッドサニタイザと混同しないでください。スレッドファザーはスレッドの実行順序をランダム化する別の種類のファジングです。それにより、さらに特別なケースを見つけることができます。 + +## セキュリティ監査 + +セキュリティチームはClickHouseの能力について基本的な概要を行いました。 + +## 静的解析 {#static-analyzers} + +`clang-tidy` をコミットごとに実行しています。`clang-static-analyzer` チェックも有効にしています。`clang-tidy` は一部のスタイルチェックにも使用されています。 + +`clang-tidy`、`Coverity`、`cppcheck`、`PVS-Studio`、`tscancode`、`CodeQL` を評価しました。使用方法についての指示は `tests/instructions/` ディレクトリにあります。 + +`CLion` をIDEとして使用している場合、いくつかの `clang-tidy` チェックをそのまま使用することができます。 + +また、`shellcheck` をシェルスクリプトの静的解析に使用しております。 + +## ハードニング {#hardening} + +デバッグビルドでは、ユーザーレベルの割り当てのASLR(アドレス空間レイアウトランダム化)を行うカスタムアロケータを使用しています。 + +また、アロケーション後に読み取り専用であることが期待されるメモリ領域を手動で保護します。 + +デバッグビルドでは、古く、非推奨であるか、セキュリティ上問題があるか、スレッド安全でないとされる関数が呼び出されないことを保証するカスタマイズが施されています。 + +デバッグアサーションが広範に使用されています。 + +デバッグビルドでは、"論理エラー" コード(バグを含意)で例外がスローされる場合、プログラムは直ちに停止されます。これにより、リリースビルドでは例外を使用し、デバッグビルドではアサーションとして扱うことができます。 + +デバッグビルドではジェマロックのデバッグバージョンを使用しています。 +デバッグビルドではlibc++のデバッグバージョンも使用しています。 + +## 実行時整合性チェック + +ディスクに保存されたデータにはチェックサムが付けられています。MergeTreeテーブルのデータは3つの方法で同時にチェックサムされます(圧縮データブロック、非圧縮データブロック、ブロック間の総合チェックサム)。クライアントとサーバー間、またはサーバー間で転送されるデータもチェックサムされています。レプリケーションはレプリカ上のビット単位で同一のデータを保証します。 + +これは、故障したハードウェア(ストレージメディアのビット腐食、サーバーのRAMのビットフリップ、ネットワークコントローラのRAMのビットフリップ、ネットワークスイッチのRAMのビットフリップ、クライアントのRAMのビットフリップ、ワイヤ上のビットフリップ)から保護するために必要です。ビットフリップは一般的であり、ECC RAMでも、TCPチェックサムが存在していても発生する可能性があります(数千のサーバーが毎日ペタバイトのデータを処理すると管理する必要があることもあります)。[動画を参照してください(ロシア語)](https://www.youtube.com/watch?v=ooBAQIe0KlQ). + +ClickHouseはopsエンジニアが故障したハードウェアを見つけるのに役立つ診断を提供します。 + +\* そしてそれは遅くありません。 + +## コードスタイル {#code-style} + +コードスタイルのルールは[ここ](style.md)に記載されています。 + +一般的なスタイル違反をチェックするために、`utils/check-style` スクリプトを使用することができます。 + +コードの適切なスタイルを強制するために、`clang-format` を使用することができます。`.clang-format` ファイルはソースのルートにあります。これは私たちの実際のコードスタイルと主に一致しています。しかし、既存のファイルに `clang-format` を適用することは推奨されません。フォーマットが悪くなるからです。clangソースリポジトリにある `clang-format-diff` ツールを使用することができます。 + +また、`uncrustify` ツールを試してコードを再フォーマットすることができます。設定はソースのルートにある `uncrustify.cfg` にあります。`clang-format` よりもテストされていない部分があります。 + +`CLion` には独自のコードフォーマッタがあり、私たちのコードスタイルに合わせて調整する必要があります。 + +また、`codespell` を使用してコード内のスペルミスを見つけます。これは自動化されています。 + +## テストカバレッジ {#test-coverage} + +機能テストのみでテストカバレッジを追跡していますが、clickhouse-serverのみです。これは日次で実行されます。 + +## テストのためのテスト + +不安定なテスト用の自動チェックがあります。すべての新しいテストを100回(機能テストの場合)または10回(統合テストの場合)実行します。少なくとも一回でもテストが失敗した場合、それはフレーク状とみなされます。 + +## テストの自動化 {#test-automation} + +テストは[GitHub Actions](https://github.com/features/actions)を利用して実行されます。 + +ビルドジョブとテストはコミットごとにSandboxで実行されます。生成されたパッケージとテスト結果はGitHubに公開され、直接リンクでダウンロードすることができます。成果物は数か月間保存されます。GitHubでプルリクエストを送信すると、それは「テスト可能」とタグ付けされ、CIシステムがClickHouseパッケージ(リリース、デバッグ、アドレスサニタイザ付)をビルドしてくれます。 + +時間と計算力に制限があるため、Travis CIは使用していません。 +Jenkinsは使用していません。それはかつて使用されていましたが、現在は使用していないことに満足しています。 diff --git a/docs/ja/dictionary/images/dictionary-left-any-join.png b/docs/ja/dictionary/images/dictionary-left-any-join.png new file mode 100644 index 00000000000..ee121aa073f Binary files /dev/null and b/docs/ja/dictionary/images/dictionary-left-any-join.png differ diff --git a/docs/ja/dictionary/images/dictionary-use-cases.png b/docs/ja/dictionary/images/dictionary-use-cases.png new file mode 100644 index 00000000000..a67ef6271cd Binary files /dev/null and b/docs/ja/dictionary/images/dictionary-use-cases.png differ diff --git a/docs/ja/dictionary/index.md b/docs/ja/dictionary/index.md new file mode 100644 index 00000000000..e04b063cf8c --- /dev/null +++ b/docs/ja/dictionary/index.md @@ -0,0 +1,334 @@ +--- +slug: /ja/dictionary +title: Dictionary +keywords: [dictionary, dictionaries] +description: Dictionaryはデータを高速に検索するためのキー-バリュー表現を提供します。 +--- + +# Dictionary + +ClickHouseのDictionaryは、さまざまな[内部および外部ソース](/ja/sql-reference/dictionaries#dictionary-sources)からデータをインメモリの[キー-バリュー](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)形式で表現し、超低レイテンシーのクエリ検索に最適化します。 + +Dictionaryは以下の用途に役立ちます: +- 特に`JOIN`を使用するクエリのパフォーマンスを向上させる +- インジェストプロセスを遅らせることなく、取り込んだデータをその場で豊かにする + +![Uses cases for Dictionary in ClickHouse](./images/dictionary-use-cases.png) + +## Dictionaryを利用してJOINを高速化する + +Dictionaryは特定の種類の`JOIN`、すなわち結合キーが基底のキー-バリューストレージのキー属性と一致する必要がある[`LEFT ANY`型](/ja/sql-reference/statements/select/join#supported-types-of-join)の速度を向上させるために使用できます。 + +Using Dictionary with LEFT ANY JOIN + +この場合、ClickHouseはDictionaryを利用して[Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join)を実行できます。これはClickHouseの最速のJOINアルゴリズムであり、右テーブルの[テーブルエンジン](/ja/engines/table-engines)が低レイテンシーのキー-バリューリクエストをサポートする場合に適用されます。ClickHouseには3つのこの要件を満たすテーブルエンジンがあります:[Join](/ja/engines/table-engines/special/join)(基本的に事前計算されたハッシュテーブル)、[EmbeddedRocksDB](/ja/engines/table-engines/integrations/embedded-rocksdb)、および[Dictionary](/ja/engines/table-engines/special/dictionary)です。以下ではDictionaryを利用する方法を説明しますが、メカニズムはこれら3つのエンジンで同じです。 + +直接結合アルゴリズムは、右テーブルがDictionaryでサポートされ、結合されるデータがすでに低レイテンシーのキー-バリューデータ構造の形式でメモリに存在していることを要求します。 + +### 例 + +StackOverflowのデータセットを使用して、次の質問に答えます: +*Hacker Newsで最も議論を呼んでいるSQLに関する投稿は何ですか?* + +議論を呼ぶ投稿とは、賛成票と反対票が似た数であるものと定義します。この絶対差を計算し、0に近い値ほど論争の的になっています。投稿には少なくとも10以上の賛成票と反対票がある必要があると仮定します。投票されない投稿はそれほど議論の的になっていません。 + +データが正規化された状態で、このクエリは`posts`と`votes`テーブルを使用した`JOIN`を要求します: + +```sql +WITH PostIds AS +( + SELECT Id + FROM posts + WHERE Title ILIKE '%SQL%' +) +SELECT + Id, + Title, + UpVotes, + DownVotes, + abs(UpVotes - DownVotes) AS Controversial_ratio +FROM posts +INNER JOIN +( + SELECT + PostId, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes + FROM votes + WHERE PostId IN (PostIds) + GROUP BY PostId + HAVING (UpVotes > 10) AND (DownVotes > 10) +) AS votes ON posts.Id = votes.PostId +WHERE Id IN (PostIds) +ORDER BY Controversial_ratio ASC +LIMIT 1 + +Row 1: +────── +Id: 25372161 +Title: How to add exception handling to SqlDataSource.UpdateCommand +UpVotes: 13 +DownVotes: 13 +Controversial_ratio: 0 + +1 rows in set. Elapsed: 1.283 sec. Processed 418.44 million rows, 7.23 GB (326.07 million rows/s., 5.63 GB/s.) +Peak memory usage: 3.18 GiB. +``` + +>**`JOIN`の右側に小さなデータセットを使用する**:このクエリは必要以上に冗長に見えるかもしれませんが、`PostId`でのフィルタリングを外部およびサブクエリの両方で行っています。これはクエリ応答時間を速くするためのパフォーマンス最適化です。最適なパフォーマンスを得るためには、常に`JOIN`の右側が小さなセットであり、可能な限り小さくすることを確認してください。JOINパフォーマンスを最適化し、使用可能なアルゴリズムを理解するためのヒントについては、[このブログ記事シリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をお勧めします。 + +このクエリは速いですが、良好なパフォーマンスを実現するために私たちがJOINを慎重に書くことに依存しています。理想的には、投稿を「SQL」を含むものだけにフィルタリングし、そのサブセットのブログに対して`UpVote`と`DownVote`のカウントを確認し、我々の指標を計算するのが望ましいでしょう。 + +#### Dictionaryの適用 + +これらの概念を説明するために、投票データに対してDictionaryを使用します。Dictionaryは通常メモリ内に保持されます([ssd_cache](/ja/sql-reference/dictionaries#ssd_cache)は例外です)、したがってデータのサイズに注意を払う必要があります。我々の`votes`テーブルサイズを確認します: + +```sql +SELECT table, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table IN ('votes') +GROUP BY table + +┌─table───────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ votes │ 1.25 GiB │ 3.79 GiB │ 3.04 │ +└─────────────────┴─────────────────┴───────────────────┴───────┘ +``` + +Dictionary内にデータを非圧縮で保存するため、すべてのカラムを(しませんが)Dictionaryに保存するならば、少なくとも4GBのメモリが必要です。Dictionaryはクラスタ全体でレプリケートされるため、このメモリ量は*各ノード*ごとに予約する必要があります。 + +> 以下の例では、DictionaryのデータはClickHouseテーブルから取得されています。これがDictionaryの最も一般的なソースを表していますが、[複数のソース](/ja/sql-reference/dictionaries#dictionary-sources)がサポートされています。これにはファイル、http、Postgresを含むデータベースが含まれ、その中には小さなデータセットが完全に更新される理想的な方法として自動的にリフレッシュされ、直接JOINに利用されるものもあります。 + +Dictionaryには、ルックアップが実行される主キーが必要です。これはトランザクションデータベースの主キーと概念的に同一であり、一意である必要があります。先ほどのクエリでは、結合キーである`PostId`でのルックアップが必要です。Dictionaryは`votes`テーブルから`PostId`ごとの賛成票と反対票の合計を含めてオリジナルにする必要があります。このDictionaryデータを取得するためのクエリは次の通りです: + +```sql +SELECT PostId, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY PostId +``` + +Dictionaryを作成するための以下のDDLが必要です - クエリの使用に注意してください: + +```sql +CREATE DICTIONARY votes_dict +( + `PostId` UInt64, + `UpVotes` UInt32, + `DownVotes` UInt32 +) +PRIMARY KEY PostId +SOURCE(CLICKHOUSE(QUERY 'SELECT PostId, countIf(VoteTypeId = 2) AS UpVotes, countIf(VoteTypeId = 3) AS DownVotes FROM votes GROUP BY PostId')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) + +0 rows in set. Elapsed: 36.063 sec. +``` + +> セルフマネージドのOSSでは、上記のコマンドをすべてのノードで実行する必要があります。ClickHouse Cloudでは、Dictionaryは自動的にすべてのノードにレプリケートされます。上記は64GBのRAMを持つClickHouse Cloudノードで実行され、ロードするのに36秒かかります。 + +Dictionaryが消費するメモリを確認する: + +```sql +SELECT formatReadableSize(bytes_allocated) AS size +FROM system.dictionaries +WHERE name = 'votes_dict' + +┌─size─────┐ +│ 4.00 GiB │ +└──────────┘ +``` + +特定の`PostId`の賛成票と反対票を取得するには、単純な`dictGet`関数を使用できます。以下には投稿`11227902`の値を取得します: + +```sql +SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes + +┌─votes──────┐ +│ (34999,32) │ +└────────────┘ +``` + +これを前のクエリで利用して、JOINを削除できます: + +```sql +WITH PostIds AS +( + SELECT Id + FROM posts + WHERE Title ILIKE '%SQL%' +) +SELECT Id, Title, + dictGet('votes_dict', 'UpVotes', Id) AS UpVotes, + dictGet('votes_dict', 'DownVotes', Id) AS DownVotes, + abs(UpVotes - DownVotes) AS Controversial_ratio +FROM posts +WHERE (Id IN (PostIds)) AND (UpVotes > 10) AND (UpVotes > 10) +ORDER BY Controversial_ratio ASC +LIMIT 3 + +3 rows in set. Elapsed: 0.551 sec. Processed 119.64 million rows, 3.29 GB (216.96 million rows/s., 5.97 GB/s.) +Peak memory usage: 552.26 MiB. +``` + +このクエリは単純であるだけでなく、2倍以上速くなりました。更に最適化されたクエリにするために、10票以上の賛成票と反対票を持つ投稿のみをDictionaryにロードし、事前計算された議論値を保存するだけです。 + +## クエリ時のエンリッチメント + +Dictionariesはクエリ時に値をルックアップするために使用できます。これらの値は結果に含めることも、集計に使用することもできます。ユーザーIDをその場所にマッピングするDictionaryを作成したとしましょう: + +```sql +CREATE DICTIONARY users_dict +( + `Id` Int32, + `Location` String +) +PRIMARY KEY Id +SOURCE(CLICKHOUSE(QUERY 'SELECT Id, Location FROM stackoverflow.users')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) +``` + +このDictionaryを使用して投稿の結果を豊かにすることができます: + +```sql +SELECT + Id, + Title, + dictGet('users_dict', 'Location', CAST(OwnerUserId, 'UInt64')) AS location +FROM posts +WHERE Title ILIKE '%clickhouse%' +LIMIT 5 +FORMAT PrettyCompactMonoBlock + +┌───────Id─┬─Title─────────────────────────────────────────────────────────┬─Location──────────────┐ +│ 52296928 │ Comparision between two Strings in ClickHouse │ Spain │ +│ 52345137 │ How to use a file to migrate data from mysql to a clickhouse? │ 中国江苏省Nanjing Shi │ +│ 61452077 │ How to change PARTITION in clickhouse │ Guangzhou, 广东省中国 │ +│ 55608325 │ Clickhouse select last record without max() on all table │ Moscow, Russia │ +│ 55758594 │ ClickHouse create temporary table │ Perm', Russia │ +└──────────┴───────────────────────────────────────────────────────────────┴───────────────────────┘ + +5 rows in set. Elapsed: 0.033 sec. Processed 4.25 million rows, 82.84 MB (130.62 million rows/s., 2.55 GB/s.) +Peak memory usage: 249.32 MiB. +``` + +以前のJOINの例と同様に、同じDictionaryを使ってどこからの投稿が最も多いかを効率的に確認できます: + +```sql +SELECT + dictGet('users_dict', 'Location', CAST(OwnerUserId, 'UInt64')) AS location, + count() AS c +FROM posts +WHERE location != '' +GROUP BY location +ORDER BY c DESC +LIMIT 5 + +┌─location───────────────┬──────c─┐ +│ India │ 787814 │ +│ Germany │ 685347 │ +│ United States │ 595818 │ +│ London, United Kingdom │ 538738 │ +│ United Kingdom │ 537699 │ +└────────────────────────┴────────┘ + +5 rows in set. Elapsed: 0.763 sec. Processed 59.82 million rows, 239.28 MB (78.40 million rows/s., 313.60 MB/s.) +Peak memory usage: 248.84 MiB. +``` + +## インデックス時のエンリッチメント + +上の例では、クエリ時にDictionaryを使用してJOINを削除しましたが、DictionaryはINSERT時に行をエンリッチするためにも使用できます。これは通常、エンリッチメント値が変更されず、Dictionaryを作成するために使用する外部ソースに存在する場合に適しています。この場合、行をINSERT時にエンリッチすることで、クエリ時のDictionaryへのルックアップを回避できます。 + +Stack Overflowのユーザーの`Location`(実際には変わる)は決して変更しないと仮定します - 特に`users`テーブルの`Location`カラムです。投稿テーブルでLocationごとに分析クエリを実行したいと仮定します。投稿テーブルには`UserId`があります。 + +ユーザーIDから場所へのマッピングを提供するDictionaryを作成します。これは`users`テーブルにバックされています: + +```sql +CREATE DICTIONARY users_dict +( + `Id` UInt64, + `Location` String +) +PRIMARY KEY Id +SOURCE(CLICKHOUSE(QUERY 'SELECT Id, Location FROM users WHERE Id >= 0')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) +``` + +> `Id < 0`のユーザーを除外し、`Hashed`字典タイプを使用可能にしています。`Id < 0`のユーザーはシステムユーザーです。 + +投稿テーブルに対してINSERT時にこのDictionaryを利用するには、スキーマを修正する必要があります: + +```sql +CREATE TABLE posts_with_location +( + `Id` UInt32, + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + … + `Location` MATERIALIZED dictGet(users_dict, 'Location', OwnerUserId::'UInt64') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +この例では、`Location`は`MATERIALIZED`カラムとして宣言されています。これは、`INSERT`クエリの一部として値が提供される可能性があり、常に計算されることを意味します。 + +> ClickHouseはまた、[`DEFAULT`カラム](/ja/sql-reference/statements/create/table#default_values)もサポートしています(値は挿入されるか、提供されていない場合は計算されます)。 + +テーブルをポピュレートするために、通常の`INSERT INTO SELECT`をS3から使用できます: + +```sql +INSERT INTO posts_with_location SELECT Id, PostTypeId::UInt8, AcceptedAnswerId, CreationDate, Score, ViewCount, Body, OwnerUserId, OwnerDisplayName, LastEditorUserId, LastEditorDisplayName, LastEditDate, LastActivityDate, Title, Tags, AnswerCount, CommentCount, FavoriteCount, ContentLicense, ParentId, CommunityOwnedDate, ClosedDate FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 36.830 sec. Processed 238.98 million rows, 2.64 GB (6.49 million rows/s., 71.79 MB/s.) +``` + +これで、最も多くの投稿がどの場所から来ているかを確認できます: + +```sql +SELECT Location, count() AS c +FROM posts_with_location +WHERE Location != '' +GROUP BY Location +ORDER BY c DESC +LIMIT 4 + +┌─Location───────────────┬──────c─┐ +│ India │ 787814 │ +│ Germany │ 685347 │ +│ United States │ 595818 │ +│ London, United Kingdom │ 538738 │ +└────────────────────────┘ + +4 rows in set. Elapsed: 0.142 sec. Processed 59.82 million rows, 1.08 GB (420.73 million rows/s., 7.60 GB/s.) +Peak memory usage: 666.82 MiB. +``` + +## 高度なDictionaryトピック + +### Dictionary`LAYOUT`の選択 + +`LAYOUT`句はDictionaryの内部データ構造を制御します。いくつかのオプションが存在し、[こちら](/ja/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)にドキュメント化されています。正しいレイアウトを選ぶためのヒントは[こちら](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)で見つけることができます。 + +### Dictionaryのリフレッシュ + +Dictionaryには`LIFETIME`として`MIN 600 MAX 900`を指定しています。LIFETIMEはDictionaryの更新間隔を指し、ここでの値は600から900秒のランダムな間隔で周期的にリロードされます。このランダムな間隔は、多数のサーバー上で更新する際のDictionaryソースの負荷を分散するために必要です。更新中でも古いバージョンのDictionaryは依然としてクエリ可能で、最初のロードのみがクエリをブロックします。`(LIFETIME(0))`を設定すると、Dictionaryの更新が防止されます。Dictionaryは`SYSTEM RELOAD DICTIONARY`コマンドを使用して強制的にリロードすることができます。 + +ClickHouseやPostgresのようなデータベースソースの場合、Dictionaryが本当に変更された場合のみ(クエリの応答により判断されます)更新するようにクエリを設定することが可能で、周期的な間隔よりも効率的です。詳細は[こちら](/ja/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)で確認できます。 + +### 他のDictionaryタイプ + +ClickHouseは[階層型](/ja/sql-reference/dictionaries#hierarchical-dictionaries)、[ポリゴン型](/ja/sql-reference/dictionaries#polygon-dictionaries)および[正規表現](/ja/sql-reference/dictionaries#regexp-tree-dictionary)Dictionaryもサポートしています。 + +### 詳細な読み物 + +- [クエリを加速するためのDictionaryの使用](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) +- [Dictionaryの高度な設定](/ja/sql-reference/dictionaries) diff --git a/docs/ja/engines/_category_.yml b/docs/ja/engines/_category_.yml new file mode 100644 index 00000000000..4901fe1edb4 --- /dev/null +++ b/docs/ja/engines/_category_.yml @@ -0,0 +1,7 @@ +position: 30 +label: 'Database & Table Engines' +collapsible: true +collapsed: true +link: + type: generated-index + slug: /ja/engines diff --git a/docs/ja/engines/database-engines/atomic.md b/docs/ja/engines/database-engines/atomic.md new file mode 100644 index 00000000000..2a6903122d9 --- /dev/null +++ b/docs/ja/engines/database-engines/atomic.md @@ -0,0 +1,62 @@ +--- +slug: /ja/engines/database-engines/atomic +sidebar_label: Atomic +sidebar_position: 10 +--- + +# Atomic + +非ブロッキングな[DROP TABLE](#drop-detach-table)および[RENAME TABLE](#rename-table)クエリや、アトミックな[EXCHANGE TABLES](#exchange-tables)クエリに対応しています。`Atomic` データベースエンジンはデフォルトで使用されます。 + +## データベースの作成 {#creating-a-database} + +``` sql +CREATE DATABASE test [ENGINE = Atomic]; +``` + +## 特徴と推奨事項 {#specifics-and-recommendations} + +### テーブル UUID {#table-uuid} + +`Atomic` データベース内のすべてのテーブルには永続的な[UUID](../../sql-reference/data-types/uuid.md)があり、データはディレクトリ `/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/` に保存されます。ここで `xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` はテーブルのUUIDです。通常、UUIDは自動的に生成されますが、テーブル作成時にユーザーが明示的にUUIDを指定することも可能です(推奨されません)。 + +例: + +```sql +CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE = ...; +``` + +:::note +`SHOW CREATE` クエリでUUIDを表示するには、[show_table_uuid_in_table_create_query_if_not_nil](../../operations/settings/settings.md#show_table_uuid_in_table_create_query_if_not_nil) 設定を使用できます。 +::: + +### RENAME TABLE {#rename-table} + +[RENAME](../../sql-reference/statements/rename.md) クエリはUUIDを変更したり、テーブルデータを移動することなく実行されます。これらのクエリは、テーブルを使用しているクエリの完了を待つことなく瞬時に実行されます。 + +### DROP/DETACH TABLE {#drop-detach-table} + +`DROP TABLE` の際、データは削除されず、`Atomic` データベースはメタデータを `/clickhouse_path/metadata_dropped/` に移動してテーブルを削除としてマークし、バックグラウンドスレッドに通知します。最終的なテーブルデータ削除までの遅延は、[database_atomic_delay_before_drop_table_sec](../../operations/server-configuration-parameters/settings.md#database_atomic_delay_before_drop_table_sec) 設定で指定されます。`SYNC` 修飾子を使用して同期モードを指定できます。この設定は[database_atomic_wait_for_drop_and_detach_synchronously](../../operations/settings/settings.md#database_atomic_wait_for_drop_and_detach_synchronously)を用いて行います。この場合、`DROP`はテーブルを使用している`SELECT`、`INSERT`およびその他のクエリの終了を待ちます。テーブルは使用されていないときに実際に削除されます。 + +### EXCHANGE TABLES/DICTIONARIES {#exchange-tables} + +[EXCHANGE](../../sql-reference/statements/exchange.md) クエリは、テーブルまたはディクショナリーをアトミックに交換します。例えば、この非アトミックな操作を行う代わりに: + +```sql +RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; +``` + +単一のアトミックなクエリを使用できます: + +``` sql +EXCHANGE TABLES new_table AND old_table; +``` + +### Atomic データベース内の ReplicatedMergeTree {#replicatedmergetree-in-atomic-database} + +[ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication) テーブルに対しては、エンジンパラメータ(ZooKeeperのパスとレプリカ名)を指定しないことをお勧めします。この場合、設定パラメータ [default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path) と [default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name) が使用されます。エンジンパラメータを明示的に指定したい場合は、`{uuid}` マクロを使用することをお勧めします。これにより、ZooKeeper内の各テーブルに対して自動的に一意のパスが生成されます。 + +## 関連項目 + +- [system.databases](../../operations/system-tables/databases.md) システムテーブル + diff --git a/docs/ja/engines/database-engines/index.md b/docs/ja/engines/database-engines/index.md new file mode 100644 index 00000000000..d3ee8718c00 --- /dev/null +++ b/docs/ja/engines/database-engines/index.md @@ -0,0 +1,28 @@ +--- +slug: /ja/engines/database-engines/ +toc_folder_title: データベースエンジン +toc_priority: 27 +toc_title: はじめに +--- + +# データベースエンジン + +データベースエンジンを使用すると、テーブルを操作できます。デフォルトでは、ClickHouse は [Atomic](../../engines/database-engines/atomic.md) データベースエンジンを使用し、これにより設定可能な[テーブルエンジン](../../engines/table-engines/index.md)や[SQL 方言](../../sql-reference/syntax.md)を提供します。 + +以下は利用可能なデータベースエンジンの完全なリストです。詳細はリンク先をご参照ください: + +- [Atomic](../../engines/database-engines/atomic.md) + +- [Lazy](../../engines/database-engines/lazy.md) + +- [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) + +- [MaterializedMySQL](../../engines/database-engines/materialized-mysql.md) + +- [MySQL](../../engines/database-engines/mysql.md) + +- [PostgreSQL](../../engines/database-engines/postgresql.md) + +- [Replicated](../../engines/database-engines/replicated.md) + +- [SQLite](../../engines/database-engines/sqlite.md) diff --git a/docs/ja/engines/database-engines/lazy.md b/docs/ja/engines/database-engines/lazy.md new file mode 100644 index 00000000000..cfb8748a0b4 --- /dev/null +++ b/docs/ja/engines/database-engines/lazy.md @@ -0,0 +1,15 @@ +--- +slug: /ja/engines/database-engines/lazy +sidebar_label: Lazy +sidebar_position: 20 +--- + +# Lazy + +最後にアクセスされてから `expiration_time_in_seconds` 秒間のみテーブルをRAMに保持します。これは、\*Log テーブルのみで使用可能です。 + +アクセス間の時間間隔が長い小さな \*Log テーブルを多数保存するのに最適化されています。 + +## データベースの作成 {#creating-a-database} + + CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds); diff --git a/docs/ja/engines/database-engines/materialized-mysql.md b/docs/ja/engines/database-engines/materialized-mysql.md new file mode 100644 index 00000000000..c32e115e1ac --- /dev/null +++ b/docs/ja/engines/database-engines/materialized-mysql.md @@ -0,0 +1,11 @@ +--- +slug: /ja/engines/database-engines/materialized-mysql +sidebar_label: MaterializedMySQL +sidebar_position: 70 +--- + +# [experimental] MaterializedMySQL + +:::note +このデータベースエンジンは廃止されており、使用できません。 +::: diff --git a/docs/ja/engines/database-engines/materialized-postgresql.md b/docs/ja/engines/database-engines/materialized-postgresql.md new file mode 100644 index 00000000000..a5fce376670 --- /dev/null +++ b/docs/ja/engines/database-engines/materialized-postgresql.md @@ -0,0 +1,283 @@ +--- +slug: /ja/engines/database-engines/materialized-postgresql +sidebar_label: MaterializedPostgreSQL +sidebar_position: 60 +--- + +# [experimental] MaterializedPostgreSQL + +PostgreSQL データベースからテーブルを ClickHouse データベースとして作成します。最初に、`MaterializedPostgreSQL` エンジンを使って PostgreSQL データベースのスナップショットを作成し、必要なテーブルをロードします。必要なテーブルには、指定されたデータベース内の任意のスキーマの任意のサブセットのテーブルを含めることができます。スナップショットの取得と同時に、データベースエンジンは LSN を取得し、テーブルの初期ダンプが行われると、WAL から更新をプルし始めます。データベースが作成されると、PostgreSQL データベースに新しく追加されたテーブルは自動的にレプリケーションに追加されません。それらは `ATTACH TABLE db.table` クエリを使用して手動で追加する必要があります。 + +レプリケーションは PostgreSQL の論理レプリケーションプロトコルで実装されています。これにより、DDL のレプリケートはできませんが、レプリケーションを壊す変更(カラム型の変更、カラムの追加/削除)が発生したかどうかを知ることができます。このような変更が検出されると、該当するテーブルの更新受信が停止します。この場合、テーブルを完全に再読み込みするには `ATTACH`/`DETACH PERMANENTLY` クエリを使用する必要があります。もし DDL がレプリケーションを壊さなければ(例えば、カラムの名前変更)、テーブルは更新を受信し続けます(挿入は位置で行われます)。 + +:::note +このデータベースエンジンはエクスペリメンタルです。使用するには、構成ファイルで `allow_experimental_database_materialized_postgresql` を 1 に設定するか、`SET` コマンドを使用します: +```sql +SET allow_experimental_database_materialized_postgresql=1 +``` +::: + +## データベースの作成 {#creating-a-database} + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] +ENGINE = MaterializedPostgreSQL('host:port', 'database', 'user', 'password') [SETTINGS ...] +``` + +**エンジンパラメータ** + +- `host:port` — PostgreSQL サーバーエンドポイント。 +- `database` — PostgreSQL データベース名。 +- `user` — PostgreSQL ユーザー。 +- `password` — ユーザーパスワード。 + +## 使用例 {#example-of-use} + +``` sql +CREATE DATABASE postgres_db +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password'); + +SHOW TABLES FROM postgres_db; + +┌─name───┐ +│ table1 │ +└────────┘ + +SELECT * FROM postgresql_db.postgres_table; +``` + +## 新しいテーブルを動的にレプリケーションに追加 {#dynamically-adding-table-to-replication} + +`MaterializedPostgreSQL` データベースが作成された後、対応する PostgreSQL データベースの新しいテーブルは自動的に検出されません。これらのテーブルは手動で追加できます: + +``` sql +ATTACH TABLE postgres_database.new_table; +``` + +:::warning +バージョン 22.1 以前では、レプリケーションにテーブルを追加すると、削除されない一時的なレプリケーションスロット(`{db_name}_ch_replication_slot_tmp` と命名)が残ります。22.1 より前の ClickHouse バージョンでテーブルをアタッチする場合は、手動で削除することを確認してください(`SELECT pg_drop_replication_slot('{db_name}_ch_replication_slot_tmp')`)。さもないと、ディスク使用量が増加します。この問題は 22.1 で修正されました。 +::: + +## レプリケーションからのテーブルを動的に削除 {#dynamically-removing-table-from-replication} + +特定のテーブルをレプリケーションから削除することができます: + +``` sql +DETACH TABLE postgres_database.table_to_remove PERMANENTLY; +``` + +## PostgreSQL スキーマ {#schema} + +PostgreSQL [スキーマ](https://www.postgresql.org/docs/9.1/ddl-schemas.html) は 3 つの方法で設定できます(バージョン 21.12 以降)。 + +1. `MaterializedPostgreSQL` データベースエンジンに対して 1 つのスキーマ。設定 `materialized_postgresql_schema` を使用する必要があります。 +テーブルへのアクセスはテーブル名のみを介します: + +``` sql +CREATE DATABASE postgres_database +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') +SETTINGS materialized_postgresql_schema = 'postgres_schema'; + +SELECT * FROM postgres_database.table1; +``` + +2. 任意の数のスキーマと指定されたテーブルセットを持つ `MaterializedPostgreSQL` データベースエンジン。設定 `materialized_postgresql_tables_list` を使用する必要があります。それぞれのテーブルはスキーマと共に書かれます。 +テーブルへのアクセスはスキーマ名とテーブル名を同時に指定して行われます: + +``` sql +CREATE DATABASE database1 +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') +SETTINGS materialized_postgresql_tables_list = 'schema1.table1,schema2.table2,schema1.table3', + materialized_postgresql_tables_list_with_schema = 1; + +SELECT * FROM database1.`schema1.table1`; +SELECT * FROM database1.`schema2.table2`; +``` + +しかし、この場合、`materialized_postgresql_tables_list` にあるすべてのテーブルはスキーマ名と一緒に書かれる必要があります。 +`materialized_postgresql_tables_list_with_schema = 1` が必要です。 + +注意: この場合、テーブル名にドットは許可されません。 + +3. 任意の数のスキーマを持ち、全テーブルを設定する `MaterializedPostgreSQL` データベースエンジン。設定 `materialized_postgresql_schema_list` を使用する必要があります。 + +``` sql +CREATE DATABASE database1 +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') +SETTINGS materialized_postgresql_schema_list = 'schema1,schema2,schema3'; + +SELECT * FROM database1.`schema1.table1`; +SELECT * FROM database1.`schema1.table2`; +SELECT * FROM database1.`schema2.table2`; +``` + +注意: この場合、テーブル名にドットは許可されません。 + +## 必要条件 {#requirements} + +1. [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) 設定は `logical` の値を持ち、`max_replication_slots` パラメータは PostgreSQL 設定ファイルで少なくとも `2` の値を持つ必要があります。 + +2. それぞれのレプリケートされたテーブルは次のいずれかの [レプリカアイデンティティ](https://www.postgresql.org/docs/10/sql-altertable.html#SQL-CREATETABLE-REPLICA-IDENTITY) を持つ必要があります: + +- 主キー(デフォルト) + +- インデックス + +``` bash +postgres# CREATE TABLE postgres_table (a Integer NOT NULL, b Integer, c Integer NOT NULL, d Integer, e Integer NOT NULL); +postgres# CREATE unique INDEX postgres_table_index on postgres_table(a, c, e); +postgres# ALTER TABLE postgres_table REPLICA IDENTITY USING INDEX postgres_table_index; +``` + +主キーは常に最初にチェックされます。存在しない場合、レプリカアイデンティティインデックスとして定義されたインデックスがチェックされます。インデックスはレプリカアイデンティティとして使用される場合、テーブル内に一つだけ存在する必要があります。 +特定のテーブルでどのタイプが使用されるかを確認するには、次のコマンドを使用します: + +``` bash +postgres# SELECT CASE relreplident + WHEN 'd' THEN 'default' + WHEN 'n' THEN 'nothing' + WHEN 'f' THEN 'full' + WHEN 'i' THEN 'index' + END AS replica_identity +FROM pg_class +WHERE oid = 'postgres_table'::regclass; +``` + +:::note +[**TOAST**](https://www.postgresql.org/docs/9.5/storage-toast.html) 値のレプリケーションはサポートされていません。デフォルトではデータ型のデフォルト値が使用されます。 +::: + +## 設定 {#settings} + +### `materialized_postgresql_tables_list` {#materialized-postgresql-tables-list} + + PostgreSQL データベーステーブルのカンマ区切りリストを設定します。これらのテーブルは [MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) データベースエンジンを介してレプリケートされます。 + + 各テーブルは、括弧内にレプリケートされたカラムのサブセットを持つことができます。カラムのサブセットが省略された場合、テーブルのすべてのカラムがレプリケートされます。 + + ``` sql + materialized_postgresql_tables_list = 'table1(co1, col2),table2,table3(co3, col5, col7) + ``` + + デフォルト値: 空のリスト — PostgreSQL データベース全体がレプリケートされることを意味します。 + +### `materialized_postgresql_schema` {#materialized-postgresql-schema} + + デフォルト値: 空の文字列。(デフォルトスキーマが使用されます) + +### `materialized_postgresql_schema_list` {#materialized-postgresql-schema-list} + + デフォルト値: 空のリスト。(デフォルトスキーマが使用されます) + +### `materialized_postgresql_max_block_size` {#materialized-postgresql-max-block-size} + + PostgreSQL データベーステーブルにデータを書き込む前にメモリに収集される行数を設定します。 + + 可能な値: + + - 正の整数。 + + デフォルト値: `65536`. + +### `materialized_postgresql_replication_slot` {#materialized-postgresql-replication-slot} + + ユーザーが作成したレプリケーションスロット。`materialized_postgresql_snapshot` と一緒に使用する必要があります。 + +### `materialized_postgresql_snapshot` {#materialized-postgresql-snapshot} + + 文字列として識別されるスナップショット。これにより、[PostgreSQL テーブルの初期ダンプ](../../engines/database-engines/materialized-postgresql.md)が実行されます。`materialized_postgresql_replication_slot` と一緒に使用する必要があります。 + + ``` sql + CREATE DATABASE database1 + ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') + SETTINGS materialized_postgresql_tables_list = 'table1,table2,table3'; + + SELECT * FROM database1.table1; + ``` + + 設定は DDL クエリを使用して必要に応じて変更できます。ただし、`materialized_postgresql_tables_list` 設定は変更できません。この設定でテーブルのリストを更新するには、`ATTACH TABLE` クエリを使用してください。 + + ``` sql + ALTER DATABASE postgres_database MODIFY SETTING materialized_postgresql_max_block_size = ; + ``` + +### `materialized_postgresql_use_unique_replication_consumer_identifier` {#materialized-postgresql-use-unique-replication-consumer-identifier} + +レプリケーションのためにユニークなレプリケーションコンシューマ識別子を使用します。デフォルト: `0`。 +もし `1` に設定すると、同じ `PostgreSQL` テーブルを指し示す複数の `MaterializedPostgreSQL` テーブルを設定することができます。 + +## 注意事項 {#notes} + +### 論理レプリケーションスロットのフェイルオーバー {#logical-replication-slot-failover} + +プライマリに存在する論理レプリケーションスロットは、スタンバイレプリカでは利用できません。 +したがって、フェイルオーバーが発生した場合、新しいプライマリ(古い物理スタンバイ)は、古いプライマリで存在していたスロットを認識しません。これは PostgreSQL からのレプリケーションを壊すことになります。 +これを解決する方法の一つは、レプリケーションスロットを自分で管理し、永続的なレプリケーションスロットを定義することです(いくつかの情報は[こちら](https://patroni.readthedocs.io/en/latest/SETTINGS.html)で見つけることができます)。`materialized_postgresql_replication_slot` 設定を通じてスロット名を渡す必要があり、`EXPORT SNAPSHOT` オプションでエクスポートされる必要があります。スナップショット識別子は `materialized_postgresql_snapshot` 設定を通じて渡す必要があります。 + +注意すべきは、本当に必要な場合のみこれを使用すべきであるということです。これを行う具体的な必要性や完全な理解がない限り、テーブルエンジンが独自にレプリケーションスロットを作成し管理することを許可した方が良いです。 + +**例([@bchrobot](https://github.com/bchrobot) より)** + +1. PostgreSQL でレプリケーションスロットを設定します。 + + ```yaml + apiVersion: "acid.zalan.do/v1" + kind: postgresql + metadata: + name: acid-demo-cluster + spec: + numberOfInstances: 2 + postgresql: + parameters: + wal_level: logical + patroni: + slots: + clickhouse_sync: + type: logical + database: demodb + plugin: pgoutput + ``` + +2. レプリケーションスロットが準備されるのを待ち、トランザクションを開始し、トランザクションスナップショット識別子をエクスポートします: + + ```sql + BEGIN; + SELECT pg_export_snapshot(); + ``` + +3. ClickHouse でデータベースを作成します: + + ```sql + CREATE DATABASE demodb + ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgres_user', 'postgres_password') + SETTINGS + materialized_postgresql_replication_slot = 'clickhouse_sync', + materialized_postgresql_snapshot = '0000000A-0000023F-3', + materialized_postgresql_tables_list = 'table1,table2,table3'; + ``` + +4. PostgreSQL トランザクションを終了したら、ClickHouse DB へのレプリケーションが確認されます。フェイルオーバー後もレプリケーションが続くことを確認します: + + ```bash + kubectl exec acid-demo-cluster-0 -c postgres -- su postgres -c 'patronictl failover --candidate acid-demo-cluster-1 --force' + ``` + +### 必要な権限 + +1. [CREATE PUBLICATION](https://postgrespro.ru/docs/postgresql/14/sql-createpublication) -- 作成クエリ権限。 + +2. [CREATE_REPLICATION_SLOT](https://postgrespro.ru/docs/postgrespro/10/protocol-replication#PROTOCOL-REPLICATION-CREATE-SLOT) -- レプリケーション権限。 + +3. [pg_drop_replication_slot](https://postgrespro.ru/docs/postgrespro/9.5/functions-admin#functions-replication) -- レプリケーション権限またはスーパーユーザー。 + +4. [DROP PUBLICATION](https://postgrespro.ru/docs/postgresql/10/sql-droppublication) -- パブリケーションの所有者(`MaterializedPostgreSQL` エンジン内の `username`)。 + +`materialized_postgresql_replication_slot` と `materialized_postgresql_snapshot` 設定を使用することで、コマンド `2` および `3` の実行とその権限を避けることが可能です。ただし、非常に注意が必要です。 + +テーブルへのアクセス権: + +1. pg_publication + +2. pg_replication_slots + +3. pg_publication_tables diff --git a/docs/ja/engines/database-engines/mysql.md b/docs/ja/engines/database-engines/mysql.md new file mode 100644 index 00000000000..37e5ace6a16 --- /dev/null +++ b/docs/ja/engines/database-engines/mysql.md @@ -0,0 +1,154 @@ +--- +slug: /ja/engines/database-engines/mysql +sidebar_position: 50 +sidebar_label: MySQL +--- + +import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; + +# MySQL データベースエンジン + + + +リモートの MySQL サーバー上のデータベースに接続し、`INSERT` および `SELECT` クエリを実行して ClickHouse と MySQL 間でデータを交換することができます。 + +`MySQL` データベースエンジンはクエリを MySQL サーバーに翻訳するため、`SHOW TABLES` や `SHOW CREATE TABLE` のような操作を実行することができます。 + +以下のクエリは実行できません: + +- `RENAME` +- `CREATE TABLE` +- `ALTER` + +## データベースの作成 {#creating-a-database} + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] +ENGINE = MySQL('host:port', ['database' | database], 'user', 'password') +``` + +**エンジンパラメータ** + +- `host:port` — MySQL サーバーアドレス。 +- `database` — リモートデータベース名。 +- `user` — MySQL ユーザー。 +- `password` — ユーザーパスワード。 + +## データ型サポート {#data_types-support} + +| MySQL | ClickHouse | +|----------------------------------|--------------------------------------------------------------| +| UNSIGNED TINYINT | [UInt8](../../sql-reference/data-types/int-uint.md) | +| TINYINT | [Int8](../../sql-reference/data-types/int-uint.md) | +| UNSIGNED SMALLINT | [UInt16](../../sql-reference/data-types/int-uint.md) | +| SMALLINT | [Int16](../../sql-reference/data-types/int-uint.md) | +| UNSIGNED INT, UNSIGNED MEDIUMINT | [UInt32](../../sql-reference/data-types/int-uint.md) | +| INT, MEDIUMINT | [Int32](../../sql-reference/data-types/int-uint.md) | +| UNSIGNED BIGINT | [UInt64](../../sql-reference/data-types/int-uint.md) | +| BIGINT | [Int64](../../sql-reference/data-types/int-uint.md) | +| FLOAT | [Float32](../../sql-reference/data-types/float.md) | +| DOUBLE | [Float64](../../sql-reference/data-types/float.md) | +| DATE | [Date](../../sql-reference/data-types/date.md) | +| DATETIME, TIMESTAMP | [DateTime](../../sql-reference/data-types/datetime.md) | +| BINARY | [FixedString](../../sql-reference/data-types/fixedstring.md) | + +その他のすべての MySQL データ型は [String](../../sql-reference/data-types/string.md) に変換されます。 + +[Nullable](../../sql-reference/data-types/nullable.md) がサポートされています。 + +## グローバル変数サポート {#global-variables-support} + +より高い互換性のために、MySQL スタイルで `@@identifier` としてグローバル変数を使用できます。 + +これらの変数がサポートされています: +- `version` +- `max_allowed_packet` + +:::note +現時点では、これらの変数はスタブであり、何かに対応しているわけではありません。 +::: + +例: + +``` sql +SELECT @@version; +``` + +## 使用例 {#examples-of-use} + +MySQL のテーブル: + +``` text +mysql> USE test; +Database changed + +mysql> CREATE TABLE `mysql_table` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `float` FLOAT NOT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from mysql_table; ++------+-----+ +| int_id | value | ++------+-----+ +| 1 | 2 | ++------+-----+ +1 row in set (0,00 sec) +``` + +MySQL サーバーとデータを交換する ClickHouse のデータベース: + +``` sql +CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password') SETTINGS read_write_timeout=10000, connect_timeout=100; +``` + +``` sql +SHOW DATABASES +``` + +``` text +┌─name─────┐ +│ default │ +│ mysql_db │ +│ system │ +└──────────┘ +``` + +``` sql +SHOW TABLES FROM mysql_db +``` + +``` text +┌─name─────────┐ +│ mysql_table │ +└──────────────┘ +``` + +``` sql +SELECT * FROM mysql_db.mysql_table +``` + +``` text +┌─int_id─┬─value─┐ +│ 1 │ 2 │ +└────────┴───────┘ +``` + +``` sql +INSERT INTO mysql_db.mysql_table VALUES (3,4) +``` + +``` sql +SELECT * FROM mysql_db.mysql_table +``` + +``` text +┌─int_id─┬─value─┐ +│ 1 │ 2 │ +│ 3 │ 4 │ +└────────┴───────┘ +``` diff --git a/docs/ja/engines/database-engines/postgresql.md b/docs/ja/engines/database-engines/postgresql.md new file mode 100644 index 00000000000..37b26e8803c --- /dev/null +++ b/docs/ja/engines/database-engines/postgresql.md @@ -0,0 +1,142 @@ +--- +slug: /ja/engines/database-engines/postgresql +sidebar_position: 40 +sidebar_label: PostgreSQL +--- + +# PostgreSQL + +リモートの [PostgreSQL](https://www.postgresql.org) サーバー上のデータベースに接続できるようにします。ClickHouse と PostgreSQL の間でデータを交換するための読み書き操作(`SELECT` と `INSERT` クエリ)をサポートしています。 + +`SHOW TABLES` および `DESCRIBE TABLE` クエリを使用して、リモート PostgreSQL からのテーブルリストとテーブル構造にリアルタイムでアクセスできます。 + +テーブル構造の変更(`ALTER TABLE ... ADD|DROP COLUMN`)をサポートします。`use_table_cache` パラメーター(以下のエンジンパラメーターを参照)が `1` に設定されている場合、テーブル構造はキャッシュされ、変更がチェックされませんが、`DETACH` および `ATTACH` クエリで更新できます。 + +## データベースの作成 {#creating-a-database} + +``` sql +CREATE DATABASE test_database +ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `schema`, `use_table_cache`]); +``` + +**エンジンパラメーター** + +- `host:port` — PostgreSQL サーバーのアドレス。 +- `database` — リモートデータベース名。 +- `user` — PostgreSQL ユーザー。 +- `password` — ユーザーパスワード。 +- `schema` — PostgreSQL スキーマ。 +- `use_table_cache` — データベースのテーブル構造をキャッシュするかどうかを定義します。オプション。デフォルト値: `0`。 + +## データ型のサポート {#data_types-support} + +| PostgreSQL | ClickHouse | +|------------------|--------------------------------------------------------------| +| DATE | [Date](../../sql-reference/data-types/date.md) | +| TIMESTAMP | [DateTime](../../sql-reference/data-types/datetime.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| DOUBLE | [Float64](../../sql-reference/data-types/float.md) | +| DECIMAL, NUMERIC | [Decimal](../../sql-reference/data-types/decimal.md) | +| SMALLINT | [Int16](../../sql-reference/data-types/int-uint.md) | +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| BIGINT | [Int64](../../sql-reference/data-types/int-uint.md) | +| SERIAL | [UInt32](../../sql-reference/data-types/int-uint.md) | +| BIGSERIAL | [UInt64](../../sql-reference/data-types/int-uint.md) | +| TEXT, CHAR | [String](../../sql-reference/data-types/string.md) | +| INTEGER | Nullable([Int32](../../sql-reference/data-types/int-uint.md))| +| ARRAY | [Array](../../sql-reference/data-types/array.md) | + +## 使用例 {#examples-of-use} + +ClickHouse でのデータベースが、PostgreSQL サーバーとデータを交換します: + +``` sql +CREATE DATABASE test_database +ENGINE = PostgreSQL('postgres1:5432', 'test_database', 'postgres', 'mysecretpassword', 'schema_name',1); +``` + +``` sql +SHOW DATABASES; +``` + +``` text +┌─name──────────┐ +│ default │ +│ test_database │ +│ system │ +└───────────────┘ +``` + +``` sql +SHOW TABLES FROM test_database; +``` + +``` text +┌─name───────┐ +│ test_table │ +└────────────┘ +``` + +PostgreSQL テーブルからデータを読み取ります: + +``` sql +SELECT * FROM test_database.test_table; +``` + +``` text +┌─id─┬─value─┐ +│ 1 │ 2 │ +└────┴───────┘ +``` + +PostgreSQL テーブルにデータを書き込みます: + +``` sql +INSERT INTO test_database.test_table VALUES (3,4); +SELECT * FROM test_database.test_table; +``` + +``` text +┌─int_id─┬─value─┐ +│ 1 │ 2 │ +│ 3 │ 4 │ +└────────┴───────┘ +``` + +PostgreSQL でテーブル構造が変更されたとします: + +``` sql +postgre> ALTER TABLE test_table ADD COLUMN data Text +``` + +データベースを作成するときに `use_table_cache` パラメーターが `1` に設定されていたため、ClickHouse のテーブル構造はキャッシュされ、変更されていませんでした: + +``` sql +DESCRIBE TABLE test_database.test_table; +``` +``` text +┌─name───┬─type──────────────┐ +│ id │ Nullable(Integer) │ +│ value │ Nullable(Integer) │ +└────────┴───────────────────┘ +``` + +テーブルをデタッチして再びアタッチした後、構造が更新されました: + +``` sql +DETACH TABLE test_database.test_table; +ATTACH TABLE test_database.test_table; +DESCRIBE TABLE test_database.test_table; +``` +``` text +┌─name───┬─type──────────────┐ +│ id │ Nullable(Integer) │ +│ value │ Nullable(Integer) │ +│ data │ Nullable(String) │ +└────────┴───────────────────┘ +``` + +## 関連コンテンツ + +- ブログ: [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) +- ブログ: [ClickHouse and PostgreSQL - a Match Made in Data Heaven - part 2](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres-part-2) diff --git a/docs/ja/engines/database-engines/replicated.md b/docs/ja/engines/database-engines/replicated.md new file mode 100644 index 00000000000..f3a9c7c4ff3 --- /dev/null +++ b/docs/ja/engines/database-engines/replicated.md @@ -0,0 +1,124 @@ +--- +slug: /ja/engines/database-engines/replicated +sidebar_position: 30 +sidebar_label: Replicated +--- + +# Replicated + +このエンジンは[Atomic](../../engines/database-engines/atomic.md)エンジンに基づいています。ZooKeeperに書き込まれ、特定のデータベースのすべてのレプリカで実行されるDDLログを通じてメタデータのレプリケーションをサポートしています。 + +1つのClickHouseサーバーは複数のレプリケートされたデータベースを同時に実行および更新できます。ただし、同じレプリケートされたデータベースの複数のレプリカを持つことはできません。 + +## データベースの作成 {#creating-a-database} +``` sql +CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] +``` + +**エンジンパラメータ** + +- `zoo_path` — ZooKeeperのパス。同じZooKeeperパスは同じデータベースに対応します。 +- `shard_name` — シャード名。データベースレプリカは`shard_name`によってシャードにグループ化されます。 +- `replica_name` — レプリカ名。同じシャードのすべてのレプリカに対してレプリカ名は異なる必要があります。 + +[ReplicatedMergeTree](../table-engines/mergetree-family/replication.md#table_engines-replication)テーブルの場合、引数が提供されていない場合、デフォルトの引数が使用されます:`/clickhouse/tables/{uuid}/{shard}`および`{replica}`。これらはサーバー設定[default_replica_path](../../operations/server-configuration-parameters/settings.md#default_replica_path)および[default_replica_name](../../operations/server-configuration-parameters/settings.md#default_replica_name)で変更できます。マクロ`{uuid}`はテーブルのUUIDに展開され、`{shard}`および`{replica}`はデータベースエンジンパラメータではなくサーバー設定からの値に展開されます。しかし将来的には、Replicatedデータベースの`shard_name`および`replica_name`を使用できるようになります。 + +## 特徴と推奨事項 {#specifics-and-recommendations} + +`Replicated`データベースを使用したDDLクエリは、[ON CLUSTER](../../sql-reference/distributed-ddl.md)クエリと類似の方法で動作しますが、いくつかの違いがあります。 + +まず、DDLリクエストは起動者(ユーザーからのリクエストを最初に受け取ったホスト)で実行を試みます。リクエストが完了しない場合、ユーザーはすぐにエラーを受け取り、他のホストはそれを実行しようとはしません。リクエストが起動者で正常に完了した場合、他のすべてのホストはそれが完了するまで自動的に再試行します。起動者は他のホストでクエリが完了するのを待とうとし([distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout)を超えることはありません)、各ホストでのクエリ実行ステータスを持つテーブルを返します。 + +エラーの場合の動作は[distributed_ddl_output_mode](../../operations/settings/settings.md#distributed_ddl_output_mode)設定によって規制され、`Replicated`データベースでは`null_status_on_timeout`に設定するのが望ましいです。つまり、あるホストが[distributed_ddl_task_timeout](../../operations/settings/settings.md#distributed_ddl_task_timeout)中にリクエストを実行するのに時間がない場合、例外を投げるのではなく、テーブルに対して`NULL`ステータスを表示します。 + +[system.clusters](../../operations/system-tables/clusters.md)システムテーブルには、データベースのすべてのレプリカで構成される、レプリケートされたデータベースと同じ名前のクラスターが含まれています。このクラスターはレプリカの作成/削除時に自動的に更新され、[分散テーブル](../../engines/table-engines/special/distributed.md#distributed)用に使用できます。 + +新しいデータベースレプリカを作成する際、このレプリカは自分でテーブルを作成します。レプリカが長時間使用できない状態にあり、レプリケーションログから遅れをとった場合、それは自分のローカルメタデータを現在のZooKeeperのメタデータと比較し、余分なテーブルをデータ付きで非レプリケートされた別のデータベースに移動し(余計なものを誤って削除しないように)、欠けているテーブルを作成し、名前が変更された場合にはテーブル名を更新します。データは`ReplicatedMergeTree`レベルでレプリケートされます。つまり、テーブルがレプリケートされていない場合、データはレプリケートされません(データベースはメタデータのみの責任を負います)。 + +[`ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART`](../../sql-reference/statements/alter/partition.md)クエリは許可されていますが、レプリケートされません。データベースエンジンは現在のレプリカにのみパーティション/パートを追加/取得/削除します。ただし、テーブル自体がレプリケートされたテーブルエンジンを使用している場合、`ATTACH`を使用した後にデータがレプリケートされます。 + +テーブルのレプリケーションを維持せずにクラスターを設定するだけが必要な場合は、[クラスターの自動検出](../../operations/cluster-discovery.md)機能を参照してください。 + +## 使用例 {#usage-example} + +3つのホストでクラスターを作成する: + +``` sql +node1 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','replica1'); +node2 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','shard1','other_replica'); +node3 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','{replica}'); +``` + +DDLクエリを実行する: + +``` sql +CREATE TABLE r.rmt (n UInt64) ENGINE=ReplicatedMergeTree ORDER BY n; +``` + +``` text +┌─────hosts────────────┬──status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ shard1|replica1 │ 0 │ │ 2 │ 0 │ +│ shard1|other_replica │ 0 │ │ 1 │ 0 │ +│ other_shard|r1 │ 0 │ │ 0 │ 0 │ +└──────────────────────┴─────────┴───────┴─────────────────────┴──────────────────┘ +``` + +システムテーブルを表示する: + +``` sql +SELECT cluster, shard_num, replica_num, host_name, host_address, port, is_local +FROM system.clusters WHERE cluster='r'; +``` + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +分散テーブルを作成し、データを挿入する: + +``` sql +node2 :) CREATE TABLE r.d (n UInt64) ENGINE=Distributed('r','r','rmt', n % 2); +node3 :) INSERT INTO r.d SELECT * FROM numbers(10); +node1 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +``` text +┌─hosts─┬─groupArray(n)─┐ +│ node3 │ [1,3,5,7,9] │ +│ node2 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` + +もう1つのホストにレプリカを追加する: + +``` sql +node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); +``` + +クラスターの構成は次のようになります: + +``` text +┌─cluster─┬─shard_num─┬─replica_num─┬─host_name─┬─host_address─┬─port─┬─is_local─┐ +│ r │ 1 │ 1 │ node3 │ 127.0.0.1 │ 9002 │ 0 │ +│ r │ 1 │ 2 │ node4 │ 127.0.0.1 │ 9003 │ 0 │ +│ r │ 2 │ 1 │ node2 │ 127.0.0.1 │ 9001 │ 0 │ +│ r │ 2 │ 2 │ node1 │ 127.0.0.1 │ 9000 │ 1 │ +└─────────┴───────────┴─────────────┴───────────┴──────────────┴──────┴──────────┘ +``` + +分散テーブルは新しいホストからもデータを取得します: + +```sql +node2 :) SELECT materialize(hostName()) AS host, groupArray(n) FROM r.d GROUP BY host; +``` + +```text +┌─hosts─┬─groupArray(n)─┐ +│ node2 │ [1,3,5,7,9] │ +│ node4 │ [0,2,4,6,8] │ +└───────┴───────────────┘ +``` diff --git a/docs/ja/engines/database-engines/sqlite.md b/docs/ja/engines/database-engines/sqlite.md new file mode 100644 index 00000000000..b410297be3c --- /dev/null +++ b/docs/ja/engines/database-engines/sqlite.md @@ -0,0 +1,81 @@ +--- +slug: /ja/engines/database-engines/sqlite +sidebar_position: 55 +sidebar_label: SQLite +--- + +# SQLite + +[SQLite](https://www.sqlite.org/index.html) データベースに接続し、ClickHouse と SQLite の間でデータを交換するために `INSERT` と `SELECT` クエリを実行できます。 + +## データベースの作成 {#creating-a-database} + +``` sql + CREATE DATABASE sqlite_database + ENGINE = SQLite('db_path') +``` + +**エンジンパラメータ** + +- `db_path` — SQLite データベースのファイルへのパス。 + +## データ型のサポート {#data_types-support} + +| SQLite | ClickHouse | +|---------------|---------------------------------------------------------| +| INTEGER | [Int32](../../sql-reference/data-types/int-uint.md) | +| REAL | [Float32](../../sql-reference/data-types/float.md) | +| TEXT | [String](../../sql-reference/data-types/string.md) | +| BLOB | [String](../../sql-reference/data-types/string.md) | + +## 特記および推奨事項 {#specifics-and-recommendations} + +SQLite はホストマシン上でデータベース全体(定義、テーブル、インデックス、およびデータ自体)を単一のクロスプラットフォームファイルとして保存します。書き込み中は SQLite がデータベースファイル全体をロックするため、書き込み操作は順次実行されます。読み取り操作はマルチタスク可能です。 +SQLite は(起動スクリプトなどの)サービス管理や `GRANT` やパスワードに基づくアクセス制御を必要としません。アクセス制御は、データベースファイル自体に与えられたファイルシステムパーミッションによって管理されます。 + +## 使用例 {#usage-example} + +ClickHouse で、SQLite に接続されたデータベース: + +``` sql +CREATE DATABASE sqlite_db ENGINE = SQLite('sqlite.db'); +SHOW TABLES FROM sqlite_db; +``` + +``` text +┌──name───┐ +│ table1 │ +│ table2 │ +└─────────┘ +``` + +テーブルを表示: + +``` sql +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` +ClickHouse のテーブルから SQLite テーブルにデータを挿入: + +``` sql +CREATE TABLE clickhouse_table(`col1` String,`col2` Int16) ENGINE = MergeTree() ORDER BY col2; +INSERT INTO clickhouse_table VALUES ('text',10); +INSERT INTO sqlite_db.table1 SELECT * FROM clickhouse_table; +SELECT * FROM sqlite_db.table1; +``` + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +│ text │ 10 │ +└───────┴──────┘ +``` diff --git a/docs/ja/engines/table-engines/index.md b/docs/ja/engines/table-engines/index.md new file mode 100644 index 00000000000..bde707073ab --- /dev/null +++ b/docs/ja/engines/table-engines/index.md @@ -0,0 +1,90 @@ +--- +slug: /ja/engines/table-engines/ +toc_folder_title: テーブルエンジン +toc_priority: 26 +toc_title: はじめに +--- + +# テーブルエンジン + +テーブルエンジン(テーブルの種類)は次の点を決定します: + +- データの保存方法と保存場所、書き込みおよび読み込み先。 +- サポートされているクエリとその方法。 +- 同時データアクセス。 +- インデックスの使用(存在する場合)。 +- マルチスレッドでの要求実行が可能かどうか。 +- データレプリケーションのパラメータ。 + +## エンジンファミリー {#engine-families} + +### MergeTree {#mergetree} + +高負荷タスク向けの最も汎用的かつ機能的なテーブルエンジンです。これらエンジンの共通の特徴は、データの迅速な挿入とその後のバックグラウンドでのデータ処理です。`MergeTree`ファミリーエンジンはデータのレプリケーション(エンジンの[Replicated\*](../../engines/table-engines/mergetree-family/replication.md#table_engines-replication) バージョン)、パーティション、二次データスキッピングインデックスなど、他のエンジンでサポートされていない機能をサポートしています。 + +このファミリーに含まれるエンジン: + +- [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#mergetree) +- [ReplacingMergeTree](../../engines/table-engines/mergetree-family/replacingmergetree.md#replacingmergetree) +- [SummingMergeTree](../../engines/table-engines/mergetree-family/summingmergetree.md#summingmergetree) +- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md#aggregatingmergetree) +- [CollapsingMergeTree](../../engines/table-engines/mergetree-family/collapsingmergetree.md#table_engine-collapsingmergetree) +- [VersionedCollapsingMergeTree](../../engines/table-engines/mergetree-family/versionedcollapsingmergetree.md#versionedcollapsingmergetree) +- [GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md#graphitemergetree) + +### Log {#log} + +最小の機能を持つ軽量な[エンジン](../../engines/table-engines/log-family/index.md)です。小規模なテーブル(最大約100万行)を迅速に書き込み、その後全体を読み取りたい場合に最も効果的です。 + +このファミリーに含まれるエンジン: + +- [TinyLog](../../engines/table-engines/log-family/tinylog.md#tinylog) +- [StripeLog](../../engines/table-engines/log-family/stripelog.md#stripelog) +- [Log](../../engines/table-engines/log-family/log.md#log) + +### インテグレーションエンジン {#integration-engines} + +他のデータストレージおよび処理システムと通信するためのエンジンです。 + +このファミリーに含まれるエンジン: + +- [ODBC](../../engines/table-engines/integrations/odbc.md) +- [JDBC](../../engines/table-engines/integrations/jdbc.md) +- [MySQL](../../engines/table-engines/integrations/mysql.md) +- [MongoDB](../../engines/table-engines/integrations/mongodb.md) +- [Redis](../../engines/table-engines/integrations/redis.md) +- [HDFS](../../engines/table-engines/integrations/hdfs.md) +- [S3](../../engines/table-engines/integrations/s3.md) +- [Kafka](../../engines/table-engines/integrations/kafka.md) +- [EmbeddedRocksDB](../../engines/table-engines/integrations/embedded-rocksdb.md) +- [RabbitMQ](../../engines/table-engines/integrations/rabbitmq.md) +- [PostgreSQL](../../engines/table-engines/integrations/postgresql.md) +- [S3Queue](../../engines/table-engines/integrations/s3queue.md) +- [TimeSeries](../../engines/table-engines/integrations/time-series.md) + +### 特殊エンジン {#special-engines} + +このファミリーに含まれるエンジン: + +- [分散テーブル](../../engines/table-engines/special/distributed.md#distributed) +- [Dictionary](../../engines/table-engines/special/dictionary.md#dictionary) +- [Merge](../../engines/table-engines/special/merge.md#merge) +- [File](../../engines/table-engines/special/file.md#file) +- [Null](../../engines/table-engines/special/null.md#null) +- [Set](../../engines/table-engines/special/set.md#set) +- [Join](../../engines/table-engines/special/join.md#join) +- [URL](../../engines/table-engines/special/url.md#table_engines-url) +- [View](../../engines/table-engines/special/view.md#table_engines-view) +- [Memory](../../engines/table-engines/special/memory.md#memory) +- [Buffer](../../engines/table-engines/special/buffer.md#buffer) +- [KeeperMap](../../engines/table-engines/special/keepermap.md) + +## 仮想カラム {#table_engines-virtual_columns} + +仮想カラムは、エンジンのソースコード内で定義されている統合テーブルエンジンの属性です。 + +`CREATE TABLE` クエリで仮想カラムを指定すべきではなく、`SHOW CREATE TABLE` や `DESCRIBE TABLE` クエリの結果に仮想カラムが表示されることはありません。仮想カラムは読み取り専用のため、仮想カラムにデータを挿入することもできません。 + +仮想カラムからデータを選択するには、`SELECT` クエリでその名前を指定する必要があります。`SELECT *` では仮想カラムの値は返されません。 + +テーブルを作成する際に、仮想カラムと同じ名前のカラムを作成した場合、仮想カラムは使用できなくなります。このようなことはお勧めしません。衝突を避けるために、仮想カラムの名前には通常アンダースコアを接頭辞として付けられています。 diff --git a/docs/ja/engines/table-engines/integrations/ExternalDistributed.md b/docs/ja/engines/table-engines/integrations/ExternalDistributed.md new file mode 100644 index 00000000000..bc6567bc5f4 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/ExternalDistributed.md @@ -0,0 +1,53 @@ +--- +slug: /ja/engines/table-engines/integrations/ExternalDistributed +sidebar_position: 55 +sidebar_label: ExternalDistributed +title: ExternalDistributed +--- + +`ExternalDistributed`エンジンは、リモートサーバーのMySQLまたはPostgreSQLに保存されているデータに対して`SELECT`クエリを実行することを可能にします。引数として[MySQL](../../../engines/table-engines/integrations/mysql.md)または[PostgreSQL](../../../engines/table-engines/integrations/postgresql.md)エンジンを受け入れ、シャードが可能です。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], + ... +) ENGINE = ExternalDistributed('engine', 'host:port', 'database', 'table', 'user', 'password'); +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query)クエリの詳細な説明を参照してください。 + +テーブル構造は元のテーブル構造と異なることがあります: + +- カラム名は元のテーブルと同じでなければなりませんが、これらのカラムの一部のみを任意の順序で利用できます。 +- カラム型は元のテーブルと異なることがあります。ClickHouseは値をClickHouseのデータ型に[キャスト](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast)しようとします。 + +**エンジンパラメータ** + +- `engine` — テーブルエンジン `MySQL` または `PostgreSQL`。 +- `host:port` — MySQLまたはPostgreSQLサーバーアドレス。 +- `database` — リモートデータベース名。 +- `table` — リモートテーブル名。 +- `user` — ユーザー名。 +- `password` — ユーザーパスワード。 + +## 実装の詳細 {#implementation-details} + +複数のレプリカをサポートしており、`|`でリストし、シャードは`,`でリストする必要があります。例: + +```sql +CREATE TABLE test_shards (id UInt32, name String, age UInt32, money UInt32) ENGINE = ExternalDistributed('MySQL', `mysql{1|2}:3306,mysql{3|4}:3306`, 'clickhouse', 'test_replicas', 'root', 'clickhouse'); +``` + +レプリカを指定する際には、読み込み時にシャードごとに利用可能なレプリカの一つが選択されます。接続が失敗した場合、次のレプリカが選択され、この処理はすべてのレプリカに対して行われます。すべてのレプリカで接続試行が失敗した場合、同じ方法で何度か試行が繰り返されます。 + +任意の数のシャードと各シャードに対する任意の数のレプリカを指定できます。 + +**関連項目** + +- [MySQL テーブルエンジン](../../../engines/table-engines/integrations/mysql.md) +- [PostgreSQL テーブルエンジン](../../../engines/table-engines/integrations/postgresql.md) +- [分散テーブルエンジン](../../../engines/table-engines/special/distributed.md) diff --git a/docs/ja/engines/table-engines/integrations/azure-queue.md b/docs/ja/engines/table-engines/integrations/azure-queue.md new file mode 100644 index 00000000000..38adfbe2f20 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/azure-queue.md @@ -0,0 +1,73 @@ +--- +slug: /ja/engines/table-engines/integrations/azure-queue +sidebar_position: 181 +sidebar_label: AzureQueue +--- + +# AzureQueue テーブルエンジン + +このエンジンは、[Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) エコシステムとの統合を提供し、ストリーミングデータのインポートを可能にします。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE test (name String, value UInt32) + ENGINE = AzureQueue(...) + [SETTINGS] + [mode = '',] + [after_processing = 'keep',] + [keeper_path = '',] + ... +``` + +**エンジンパラメータ** + +`AzureQueue` のパラメータは、`AzureBlobStorage` テーブルエンジンがサポートするものと同じです。パラメータの詳細は[こちら](../../../engines/table-engines/integrations/azureBlobStorage.md)をご覧ください。 + +**例** + +```sql +CREATE TABLE azure_queue_engine_table (name String, value UInt32) +ENGINE=AzureQueue('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/data/') +SETTINGS + mode = 'unordered' +``` + +## 設定 {#settings} + +サポートされている設定のセットは、`S3Queue` テーブルエンジンと同じですが、`s3queue_` プレフィックスはありません。設定の完全なリストについては[こちら](../../../engines/table-engines/integrations/s3queue.md#settings)をご覧ください。 +テーブルに設定された設定のリストを取得するには、`system.s3_queue_settings` テーブルを使用します。`24.10` から使用可能です。 + +## 説明 {#description} + +`SELECT` はストリーミングインポートには特に有用ではありません(デバッグを除く)、なぜなら各ファイルは一度しかインポートできないからです。[Materialized View](../../../sql-reference/statements/create/view.md) を使用してリアルタイムスレッドを作成する方が実用的です。手順は次の通りです: + +1. エンジンを使用して、S3 の指定されたパスから消費するためのテーブルを作成し、それをデータストリームとして考慮します。 +2. 必要な構造でテーブルを作成します。 +3. エンジンからデータを変換し、前に作成したテーブルに投入する Materialized View を作成します。 + +`MATERIALIZED VIEW` がエンジンに接続されると、バックグラウンドでデータの収集を開始します。 + +例: + +``` sql + CREATE TABLE azure_queue_engine_table (name String, value UInt32) + ENGINE=AzureQueue('', 'CSV', 'gzip') + SETTINGS + mode = 'unordered'; + + CREATE TABLE stats (name String, value UInt32) + ENGINE = MergeTree() ORDER BY name; + + CREATE MATERIALIZED VIEW consumer TO stats + AS SELECT name, value FROM azure_queue_engine_table; + + SELECT * FROM stats ORDER BY name; +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。 +- `_file` — ファイルの名前。 + +仮想カラムに関する詳細については[こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns)をご覧ください。 diff --git a/docs/ja/engines/table-engines/integrations/azureBlobStorage.md b/docs/ja/engines/table-engines/integrations/azureBlobStorage.md new file mode 100644 index 00000000000..41b2ac5b1a9 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/azureBlobStorage.md @@ -0,0 +1,97 @@ +--- +slug: /ja/engines/table-engines/integrations/azureBlobStorage +sidebar_position: 10 +sidebar_label: Azure Blob Storage +--- + +# AzureBlobStorage テーブルエンジン + +このエンジンは、[Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) エコシステムとの統合を提供します。 + +## テーブル作成 + +``` sql +CREATE TABLE azure_blob_storage_table (name String, value UInt32) + ENGINE = AzureBlobStorage(connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression]) + [PARTITION BY expr] + [SETTINGS ...] +``` + +### エンジンパラメータ + +- `endpoint` — container & prefix を含む AzureBlobStorage のエンドポイント URL。認証方法によっては account_name を含む場合があります。(http://azurite1:{port}/[account_name]{container_name}/{data_prefix}) または、これらのパラメータを別々に提供することもできます(storage_account_url, account_name & container を使用)。prefix を指定するには、エンドポイントを使用してください。 +- `endpoint_contains_account_name` - このフラグは、エンドポイントに account_name が含まれているかどうかを指定するために使用します。これは特定の認証方法でのみ必要です。(デフォルト: true) +- `connection_string|storage_account_url` — connection_string にはアカウント名とキーが含まれます ([Create connection string](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json#configure-a-connection-string-for-an-azure-storage-account)) または、ストレージアカウント URL として提供し、アカウント名とアカウントキーを別々のパラメータとして指定できます(パラメータ account_name & account_key 参照)。 +- `container_name` - コンテナ名 +- `blobpath` - ファイルパス。読み取り専用モードで以下のワイルドカードをサポートします: `*`, `**`, `?`, `{abc,def}` および `{N..M}`、ここで `N`, `M` — 数値, `'abc'`, `'def'` — 文字列。 +- `account_name` - storage_account_url を使用している場合、ここでアカウント名を指定できます。 +- `account_key` - storage_account_url を使用している場合、ここでアカウントキーを指定できます。 +- `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md)。 +- `compression` — サポートされている値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮を自動検出します。(`auto` と設定した場合と同じ動作)。 + +**例** + +``` sql +CREATE TABLE test_table (key UInt64, data String) + ENGINE = AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', + 'test_container', 'test_table', 'CSV'); + +INSERT INTO test_table VALUES (1, 'a'), (2, 'b'), (3, 'c'); + +SELECT * FROM test_table; +``` + +```text +┌─key──┬─data──┐ +│ 1 │ a │ +│ 2 │ b │ +│ 3 │ c │ +└──────┴───────┘ +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。型: `LowCardinalty(String)`。 +- `_file` — ファイル名。型: `LowCardinalty(String)`。 +- `_size` — ファイルのバイト単位でのサイズ。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL`。 +- `_time` — ファイルの最終更新日時。型: `Nullable(DateTime)`。日時が不明な場合、値は `NULL`。 + +## 認証 + +現在、3つの認証方法があります: +- `Managed Identity` - `endpoint`、`connection_string` または `storage_account_url` を提供することで使用できます。 +- `SAS Token` - `endpoint`、`connection_string` または `storage_account_url` を提供することで使用できます。URL に '?' が含まれる場合に識別されます。 +- `Workload Identity` - `endpoint` または `storage_account_url` を提供することで使用できます。config に `use_workload_identity` パラメータが設定されている場合、[workload identity](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-azure-hosted-applications) が認証に使用されます。 + +### データキャッシュ {#data-cache} + +`Azure` テーブルエンジンはローカルディスクへのデータキャッシュをサポートしています。 +ファイルシステムキャッシュの設定オプションと使用法については、この[セクション](/docs/ja/operations/storing-data.md/#using-local-cache)を参照してください。 +キャッシュはパスおよびストレージオブジェクトの ETag に基づいて行われるため、ClickHouse は古いキャッシュバージョンを読み取ることはありません。 + +キャッシュを有効にするには、設定を `filesystem_cache_name = ''` および `enable_filesystem_cache = 1` とします。 + +```sql +SELECT * +FROM azureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'test_container', 'test_table', 'CSV') +SETTINGS filesystem_cache_name = 'cache_for_azure', enable_filesystem_cache = 1; +``` + +1. ClickHouse の設定ファイルに次のセクションを追加してください: + +``` xml + + + + path to cache directory + 10Gi + + + +``` + +2. ClickHouse の `storage_configuration` セクションからキャッシュ設定(およびしたがってキャッシュストレージ)を再利用します。[こちらで説明されています](/docs/ja/operations/storing-data.md/#using-local-cache) + +## 参照 + +[Azure Blob Storage テーブル関数](/docs/ja/sql-reference/table-functions/azureBlobStorage) diff --git a/docs/ja/engines/table-engines/integrations/deltalake.md b/docs/ja/engines/table-engines/integrations/deltalake.md new file mode 100644 index 00000000000..34d25c7cefe --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/deltalake.md @@ -0,0 +1,57 @@ +--- +slug: /ja/engines/table-engines/integrations/deltalake +sidebar_position: 40 +sidebar_label: DeltaLake +--- + +# DeltaLake テーブルエンジン + +このエンジンは、Amazon S3 に存在する既存の [Delta Lake](https://github.com/delta-io/delta) テーブルへの読み取り専用の統合を提供します。 + +## テーブル作成 + +Delta Lake テーブルはすでに S3 に存在している必要があることに注意してください。このコマンドは新しいテーブルを作成するための DDL パラメータを受け取りません。 + +``` sql +CREATE TABLE deltalake + ENGINE = DeltaLake(url, [aws_access_key_id, aws_secret_access_key,]) +``` + +**エンジンパラメータ** + +- `url` — 既存の Delta Lake テーブルへのパスを持つバケットの URL。 +- `aws_access_key_id`, `aws_secret_access_key` - [AWS](https://aws.amazon.com/) アカウントユーザーの長期的な認証情報。これを使用してリクエストを認証できます。このパラメータはオプションです。認証情報が指定されていない場合、設定ファイルから使用されます。 + +エンジンパラメータは、[Named Collections](/docs/ja/operations/named-collections.md) を使用して指定できます。 + +**例** + +```sql +CREATE TABLE deltalake ENGINE=DeltaLake('http://mars-doc-test.s3.amazonaws.com/clickhouse-bucket-3/test_table/', 'ABC123', 'Abc+123') +``` + +Named collections を使用する: + +``` xml + + + + http://mars-doc-test.s3.amazonaws.com/clickhouse-bucket-3/ + ABC123 + Abc+123 + + + +``` + +```sql +CREATE TABLE deltalake ENGINE=DeltaLake(deltalake_conf, filename = 'test_table') +``` + +### データキャッシュ {#data-cache} + +`Iceberg` テーブルエンジンおよびテーブル関数は、`S3`、`AzureBlobStorage`、`HDFS` ストレージと同様にデータキャッシングをサポートします。[こちら](../../../engines/table-engines/integrations/s3.md#data-cache)を参照してください。 + +## 参照 + +- [deltaLake テーブル関数](../../../sql-reference/table-functions/deltalake.md) diff --git a/docs/ja/engines/table-engines/integrations/embedded-rocksdb.md b/docs/ja/engines/table-engines/integrations/embedded-rocksdb.md new file mode 100644 index 00000000000..cc72c502cd8 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/embedded-rocksdb.md @@ -0,0 +1,222 @@ +--- +slug: /ja/engines/table-engines/integrations/embedded-rocksdb +sidebar_position: 50 +sidebar_label: EmbeddedRocksDB +--- + +import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; + +# EmbeddedRocksDB エンジン + + + +このエンジンは、ClickHouseを[RocksDB](http://rocksdb.org/)と統合することを可能にします。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = EmbeddedRocksDB([ttl, rocksdb_dir, read_only]) PRIMARY KEY(primary_key_name) +[ SETTINGS name=value, ... ] +``` + +エンジンパラメータ: + +- `ttl` - 値の有効期限(TTL)。TTLは秒単位で指定されます。TTLが0の場合、通常のRocksDBインスタンスが使用されます(TTLなし)。 +- `rocksdb_dir` - 既存のRocksDBのディレクトリのパス、または作成されたRocksDBの目的地のパス。指定された`rocksdb_dir`でテーブルをオープンします。 +- `read_only` - `read_only`がtrueに設定されている場合、読み取り専用モードが使用されます。TTLのあるストレージでは、手動および自動いずれのコンパクションもトリガーされないため、期限切れのエントリは削除されません。 +- `primary_key_name` – カラムリストの任意のカラム名。 +- `主キー`は必ず指定され、一つのカラムのみをサポートします。主キーはバイナリで`rocksdb key`としてシリアライズされます。 +- 主キー以外のカラムは、対応する順序でバイナリで`rocksdb`値としてシリアライズされます。 +- `equals`または`in`フィルタリングを使用したクエリは、`rocksdb`からのマルチキー検索に最適化されます。 + +エンジン設定: + +- `optimize_for_bulk_insert` – テーブルはバルクインサートに最適化されています(インサートパイプラインはSSTファイルを作成し、memtablesへの書き込みの代わりにrocksdbデータベースにインポートします)。デフォルト値: `1`。 +- `bulk_insert_block_size` - バルクインサートによって作成されるSSTファイルの最小サイズ(行単位);デフォルト値: `1048449`。 + +例: + +``` sql +CREATE TABLE test +( + `key` String, + `v1` UInt32, + `v2` String, + `v3` Float32 +) +ENGINE = EmbeddedRocksDB +PRIMARY KEY key +``` + +## メトリクス + +`system.rocksdb`テーブルも存在し、rocksdbの統計を公開しています: + +```sql +SELECT + name, + value +FROM system.rocksdb + +┌─name──────────────────────┬─value─┐ +│ no.file.opens │ 1 │ +│ number.block.decompressed │ 1 │ +└───────────────────────────┴───────┘ +``` + +## 設定 + +構成を使用して任意の[rocksdbオプション](https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map)を変更することもできます: + +```xml + + + 8 + + + 2 + + +
+ TABLE + + 8 + + + 2 + +
+ + +``` + +デフォルトで簡易近似カウント最適化はオフになっており、`count()`クエリのパフォーマンスに影響を与える可能性があります。この最適化を有効にするには、`optimize_trivial_approximate_count_query = 1`を設定してください。また、この設定はEmbeddedRocksDBエンジンの`system.tables`にも影響を与え、`total_rows`および`total_bytes`の近似値を表示するために設定をオンにしてください。 + +## 対応操作 {#supported-operations} + +### インサート + +新しい行が`EmbeddedRocksDB`に挿入されると、キーが既に存在する場合は値が更新され、そうでなければ新しいキーが作成されます。 + +例: + +```sql +INSERT INTO test VALUES ('some key', 1, 'value', 3.2); +``` + +### 削除 + +`DELETE`クエリや`TRUNCATE`を使用して行を削除できます。 + +```sql +DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1; +``` + +```sql +ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1; +``` + +```sql +TRUNCATE TABLE test; +``` + +### 更新 + +`ALTER TABLE`クエリを使用して値を更新できます。主キーは更新できません。 + +```sql +ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1; +``` + +### ジョイン + +EmbeddedRocksDBテーブルとの特別な`direct`ジョインがサポートされています。このダイレクトジョインは、メモリにハッシュテーブルを形成せず、EmbeddedRocksDBからデータを直接アクセスします。 + +大規模なジョインの場合、ダイレクトジョインによりメモリ使用量が大幅に低減されることがあります。なぜならハッシュテーブルが作成されないからです。 + +ダイレクトジョインを有効にするには: + +```sql +SET join_algorithm = 'direct, hash' +``` + +:::tip +`join_algorithm`が`direct, hash`に設定されている場合、可能な場合はダイレクトジョインが使用され、それ以外はハッシュが使用されます。 +::: + +#### 例 + +##### EmbeddedRocksDBテーブルを作成し、データを挿入する: + +```sql +CREATE TABLE rdb +( + `key` UInt32, + `value` Array(UInt32), + `value2` String +) +ENGINE = EmbeddedRocksDB +PRIMARY KEY key +``` + +```sql +INSERT INTO rdb + SELECT + toUInt32(sipHash64(number) % 10) as key, + [key, key+1] as value, + ('val2' || toString(key)) as value2 + FROM numbers_mt(10); +``` + +##### テーブル`t2`を作成し、`rdb`テーブルとジョインするためにデータを挿入: + +```sql +CREATE TABLE t2 +( + `k` UInt16 +) +ENGINE = TinyLog +``` + +```sql +INSERT INTO t2 SELECT number AS k +FROM numbers_mt(10) +``` + +##### ジョインアルゴリズムを`direct`に設定: + +```sql +SET join_algorithm = 'direct' +``` + +##### INNER JOIN: +```sql +SELECT * +FROM +( + SELECT k AS key + FROM t2 +) AS t2 +INNER JOIN rdb ON rdb.key = t2.key +ORDER BY key ASC +``` +```response +┌─key─┬─rdb.key─┬─value──┬─value2─┐ +│ 0 │ 0 │ [0,1] │ val20 │ +│ 2 │ 2 │ [2,3] │ val22 │ +│ 3 │ 3 │ [3,4] │ val23 │ +│ 6 │ 6 │ [6,7] │ val26 │ +│ 7 │ 7 │ [7,8] │ val27 │ +│ 8 │ 8 │ [8,9] │ val28 │ +│ 9 │ 9 │ [9,10] │ val29 │ +└─────┴─────────┴────────┴────────┘ +``` + +### ジョインに関する詳細情報 +- [`join_algorithm`設定](/docs/ja/operations/settings/settings.md#join_algorithm) +- [JOIN句](/docs/ja/sql-reference/statements/select/join.md) diff --git a/docs/ja/engines/table-engines/integrations/hdfs.md b/docs/ja/engines/table-engines/integrations/hdfs.md new file mode 100644 index 00000000000..76eb9a50132 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/hdfs.md @@ -0,0 +1,243 @@ +--- +slug: /ja/engines/table-engines/integrations/hdfs +sidebar_position: 80 +sidebar_label: HDFS +--- + +# HDFS + +このエンジンは、[Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) エコシステムとの統合を提供し、ClickHouseを通じて [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) 上のデータを管理することを可能にします。このエンジンは [File](../../../engines/table-engines/special/file.md#table_engines-file) や [URL](../../../engines/table-engines/special/url.md#table_engines-url) エンジンに似ていますが、Hadoop特有の機能を提供します。 + +この機能はClickHouseのエンジニアによるサポート対象ではなく、品質が不安定であることが知られています。問題が発生した場合は、自分で修正してプルリクエストを送ってください。 + +## 使用法 {#usage} + +``` sql +ENGINE = HDFS(URI, format) +``` + +**エンジンパラメータ** + +- `URI` - HDFS内の全体のファイルURI。`URI`のパス部分にはグロブを含めることができます。この場合、テーブルは読み取り専用になります。 +- `format` - 利用可能なファイルフォーマットのいずれかを指定します。 +`SELECT` クエリを実行する場合、フォーマットは入力用にサポートされている必要があり、`INSERT` クエリを実行する場合は出力用にサポートされている必要があります。利用可能なフォーマットは [Formats](../../../interfaces/formats.md#formats) セクションにリストされています。 +- [PARTITION BY expr] + +### PARTITION BY + +`PARTITION BY` — オプションです。ほとんどの場合、パーティションキーは必要ありませんが、必要な場合でも通常は月ごとに分けるほど詳細なパーティションキーは必要ありません。パーティショニングはクエリを高速化しません(ORDER BY 式とは対照的に)。非常に詳細なパーティショニングは避けてください。クライアントIDや名前でデータをパーティション分割しないでください(代わりに、クライアントIDや名前をORDER BY 式の最初のカラムにします)。 + +月ごとにパーティションを分ける場合は、`toYYYYMM(date_column)` 式を使用します。ここで、`date_column` は [Date](/docs/ja/sql-reference/data-types/date.md) 型の日付を持つカラムです。ここでのパーティション名は `"YYYYMM"` フォーマットになります。 + +**例:** + +**1.** `hdfs_engine_table` テーブルをセットアップ: + +``` sql +CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV') +``` + +**2.** ファイルを埋める: + +``` sql +INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3) +``` + +**3.** データをクエリ: + +``` sql +SELECT * FROM hdfs_engine_table LIMIT 2 +``` + +``` text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## 実装の詳細 {#implementation-details} + +- 読み取りと書き込みは並列で行われる可能性があります。 +- サポートされていないもの: + - `ALTER` および `SELECT...SAMPLE` 操作。 + - インデックス。 + - [ゼロコピー](../../../operations/storing-data.md#zero-copy) レプリケーションは可能ですが、推奨されません。 + + :::note + ゼロコピーのレプリケーションは本番環境には対応していません + ClickHouseバージョン22.8以降ではデフォルトで無効になっています。この機能は本番環境での使用を推奨しません。 + ::: + +**パス内のグロブ** + +複数のパスコンポーネントがグロブを含むことができます。処理されるためには、ファイルが存在し、全体のパスパターンに一致する必要があります。ファイルのリストは `SELECT` 中に決定されます(`CREATE` 時点ではなく)。 + +- `*` — `/` を除く任意の文字を空文字列として含めた任意の数に置き換えます。 +- `?` — 任意の一文字に置き換えます。 +- `{some_string,another_string,yet_another_one}` — 文字列 `'some_string'`, `'another_string'`, `'yet_another_one'` のいずれかに置き換えます。 +- `{N..M}` — N から M までの範囲の任意の数字に置き換えます(両端を含む)。 + +`{}`を用いた構文は [remote](../../../sql-reference/table-functions/remote.md) テーブル関数に似ています。 + +**例** + +1. TSV形式の数ファイルがHDFSに以下のURIで保存されているとします: + + - 'hdfs://hdfs1:9000/some_dir/some_file_1' + - 'hdfs://hdfs1:9000/some_dir/some_file_2' + - 'hdfs://hdfs1:9000/some_dir/some_file_3' + - 'hdfs://hdfs1:9000/another_dir/some_file_1' + - 'hdfs://hdfs1:9000/another_dir/some_file_2' + - 'hdfs://hdfs1:9000/another_dir/some_file_3' + +1. すべての6つのファイルから成るテーブルを作成する方法はいくつかあります: + +``` sql +CREATE TABLE table_with_range (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV') +``` + +別の方法: + +``` sql +CREATE TABLE table_with_question_mark (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/some_file_?', 'TSV') +``` + +両方のディレクトリのすべてのファイルから構成されるテーブル(クエリで記述されたフォーマットとスキーマに適合するすべてのファイル): + +``` sql +CREATE TABLE table_with_asterisk (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV') +``` + +:::note +ファイルのリストが先頭ゼロ付きの数値範囲を含む場合は、個々の数字に対して中括弧 `{}` を使用するか、`?` を使用してください。 +::: + +**例** + +ファイル名が `file000`, `file001`, ... , `file999` のファイルを持つテーブルを作成: + +``` sql +CREATE TABLE big_table (name String, value UInt32) ENGINE = HDFS('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV') +``` + +## 設定 {#configuration} + +GraphiteMergeTreeと同様に、HDFSエンジンはClickHouseの設定ファイルを使用した拡張設定をサポートしています。使用できる設定キーはグローバル(`hdfs`)とユーザーレベル(`hdfs_*`)の二つです。グローバル設定が最初に適用され、次にユーザーレベルの設定が適用されます(存在する場合)。 + +``` xml + + + /tmp/keytab/clickhouse.keytab + clickuser@TEST.CLICKHOUSE.TECH + kerberos + + + + + root@TEST.CLICKHOUSE.TECH + +``` + +### 設定オプション {#configuration-options} + +#### libhdfs3によってサポートされている設定 {#supported-by-libhdfs3} + +| **パラメータ** | **デフォルト値** | +| - | - | +| rpc\_client\_connect\_tcpnodelay | true | +| dfs\_client\_read\_shortcircuit | true | +| output\_replace-datanode-on-failure | true | +| input\_notretry-another-node | false | +| input\_localread\_mappedfile | true | +| dfs\_client\_use\_legacy\_blockreader\_local | false | +| rpc\_client\_ping\_interval | 10 * 1000 | +| rpc\_client\_connect\_timeout | 600 * 1000 | +| rpc\_client\_read\_timeout | 3600 * 1000 | +| rpc\_client\_write\_timeout | 3600 * 1000 | +| rpc\_client\_socket\_linger\_timeout | -1 | +| rpc\_client\_connect\_retry | 10 | +| rpc\_client\_timeout | 3600 * 1000 | +| dfs\_default\_replica | 3 | +| input\_connect\_timeout | 600 * 1000 | +| input\_read\_timeout | 3600 * 1000 | +| input\_write\_timeout | 3600 * 1000 | +| input\_localread\_default\_buffersize | 1 * 1024 * 1024 | +| dfs\_prefetchsize | 10 | +| input\_read\_getblockinfo\_retry | 3 | +| input\_localread\_blockinfo\_cachesize | 1000 | +| input\_read\_max\_retry | 60 | +| output\_default\_chunksize | 512 | +| output\_default\_packetsize | 64 * 1024 | +| output\_default\_write\_retry | 10 | +| output\_connect\_timeout | 600 * 1000 | +| output\_read\_timeout | 3600 * 1000 | +| output\_write\_timeout | 3600 * 1000 | +| output\_close\_timeout | 3600 * 1000 | +| output\_packetpool\_size | 1024 | +| output\_heartbeat\_interval | 10 * 1000 | +| dfs\_client\_failover\_max\_attempts | 15 | +| dfs\_client\_read\_shortcircuit\_streams\_cache\_size | 256 | +| dfs\_client\_socketcache\_expiryMsec | 3000 | +| dfs\_client\_socketcache\_capacity | 16 | +| dfs\_default\_blocksize | 64 * 1024 * 1024 | +| dfs\_default\_uri | "hdfs://localhost:9000" | +| hadoop\_security\_authentication | "simple" | +| hadoop\_security\_kerberos\_ticket\_cache\_path | "" | +| dfs\_client\_log\_severity | "INFO" | +| dfs\_domain\_socket\_path | "" | + + +[HDFS Configuration Reference](https://hawq.apache.org/docs/userguide/2.3.0.0-incubating/reference/HDFSConfigurationParameterReference.html) はいくつかのパラメータを説明するかもしれません。 + +#### ClickHouseエクストラ {#clickhouse-extras} + +| **パラメータ** | **デフォルト値** | +| - | - | +|hadoop\_kerberos\_keytab | "" | +|hadoop\_kerberos\_principal | "" | +|libhdfs3\_conf | "" | + +### 制限事項 {#limitations} +* `hadoop_security_kerberos_ticket_cache_path` および `libhdfs3_conf` はグローバルのみで、ユーザー固有にはできません + +## Kerberosサポート {#kerberos-support} + +もし `hadoop_security_authentication` パラメータが `kerberos` の値を持つとき、ClickHouseはKerberosを通じて認証します。 +パラメータは [こちら](#clickhouse-extras) で、`hadoop_security_kerberos_ticket_cache_path` が役立つかもしれません。 +libhdfs3の制限により古い方法のみがサポートされており、 +データノードの通信はSASLで保護されていません(`HADOOP_SECURE_DN_USER` はそのようなセキュリティアプローチの信頼できる指標です)。`tests/integration/test_storage_kerberized_hdfs/hdfs_configs/bootstrap.sh` を参照として使用してください。 + +`hadoop_kerberos_keytab`、`hadoop_kerberos_principal` または `hadoop_security_kerberos_ticket_cache_path` が指定されている場合、Kerberos認証が使用されます。この場合、`hadoop_kerberos_keytab` と `hadoop_kerberos_principal` は必須です。 + +## HDFS Namenode HAサポート {#namenode-ha} + +libhdfs3はHDFS namenode HAをサポートします。 + +- `hdfs-site.xml` をHDFSノードから `/etc/clickhouse-server/` にコピーします。 +- ClickHouseの設定ファイルに以下の部分を追加します: + +``` xml + + /etc/clickhouse-server/hdfs-site.xml + +``` + +- その後、HDFS URIでnamenodeアドレスとして `hdfs-site.xml` の `dfs.nameservices` タグ値を使用します。たとえば、`hdfs://appadmin@192.168.101.11:8020/abc/` を `hdfs://appadmin@my_nameservice/abc/` に置き換えます。 + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。型:`LowCardinalty(String)`。 +- `_file` — ファイルの名称。型:`LowCardinalty(String)`。 +- `_size` — ファイルのバイト単位のサイズ。型:`Nullable(UInt64)`。サイズが不明な場合、値は `NULL` です。 +- `_time` — ファイルの最終修正時刻。型:`Nullable(DateTime)`。時刻が不明な場合、値は `NULL` です。 + +## ストレージ設定 {#storage-settings} + +- [hdfs_truncate_on_insert](/docs/ja/operations/settings/settings.md#hdfs_truncate_on_insert) - 挿入時にファイルを切り詰めることを許可します。デフォルトでは無効になっています。 +- [hdfs_create_new_file_on_insert](/docs/ja/operations/settings/settings.md#hdfs_create_new_file_on_insert) - サフィックスを持つフォーマットでは、挿入ごとに新しいファイルを作成することを許可します。デフォルトでは無効になっています。 +- [hdfs_skip_empty_files](/docs/ja/operations/settings/settings.md#hdfs_skip_empty_files) - 読み取り時に空のファイルをスキップすることを許可します。デフォルトでは無効になっています。 + +**関連項目** + +- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/ja/engines/table-engines/integrations/hive.md b/docs/ja/engines/table-engines/integrations/hive.md new file mode 100644 index 00000000000..8b27537d45e --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/hive.md @@ -0,0 +1,408 @@ +--- +slug: /ja/engines/table-engines/integrations/hive +sidebar_position: 84 +sidebar_label: Hive +--- + +# Hive + +Hiveエンジンは、HDFS Hiveテーブルに対する`SELECT`クエリを実行することを可能にします。現在、以下の入力フォーマットをサポートしています: + +- Text: `binary`を除く、単純なスカラーカラムタイプのみをサポート + +- ORC: `char`を除く、単純なスカラーカラムタイプをサポート。`array`のような複雑なタイプのみをサポート + +- Parquet: すべての単純なスカラーカラムタイプをサポート。`array`のような複雑なタイプのみをサポート + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [ALIAS expr1], + name2 [type2] [ALIAS expr2], + ... +) ENGINE = Hive('thrift://host:port', 'database', 'table'); +PARTITION BY expr +``` +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query)クエリの詳細な説明を参照してください。 + +テーブル構造は、元のHiveテーブル構造と異なる場合があります: +- カラム名は元のHiveテーブルと同じでなければなりませんが、これらのカラムの一部のみを任意の順序で使用することができ、他のカラムを元に計算されたエイリアスカラムを使用することも可能です。 +- カラムタイプは、元のHiveテーブルのものと同じでなければなりません。 +- パーティションキーの表現は、元のHiveテーブルと一致させる必要があり、パーティションキーの表現に含まれるカラムはテーブル構造内にある必要があります。 + +**エンジンパラメータ** + +- `thrift://host:port` — Hiveメタストアのアドレス + +- `database` — リモートデータベース名。 + +- `table` — リモートテーブル名。 + +## 使用例 {#usage-example} + +### HDFSファイルシステム用のローカルキャッシュを使用する方法 +リモートファイルシステム用のローカルキャッシュを有効にすることを強くお勧めします。ベンチマークでは、キャッシュを使用すると約2倍速くなります。 + +キャッシュを使用する前に、`config.xml`に以下を追加してください。 +``` xml + + true + local_cache + 559096952 + 1048576 + +``` + +- enable: trueの場合、ClickHouseは起動後、リモートファイルシステム(HDFS)用のローカルキャッシュを維持します。 +- root_dir: 必須。リモートファイルシステム用のローカルキャッシュファイルを保存するルートディレクトリ。 +- limit_size: 必須。ローカルキャッシュファイルの最大サイズ(バイト単位)。 +- bytes_read_before_flush: リモートファイルシステムからファイルをダウンロードする際にローカルファイルシステムにフラッシュする前のバイト量を制御します。デフォルト値は1MBです。 + +ClickHouseがリモートファイルシステム用のローカルキャッシュが有効で起動されている場合でも、ユーザーはクエリで`settings use_local_cache_for_remote_storage = 0`を使用してキャッシュを使用しないことを選択できます。デフォルトで`use_local_cache_for_remote_storage`は`1`です。 + +### ORC入力フォーマットでHiveテーブルを照会 + +#### Hiveでテーブルを作成 +``` text +hive > CREATE TABLE `test`.`test_orc`( + `f_tinyint` tinyint, + `f_smallint` smallint, + `f_int` int, + `f_integer` int, + `f_bigint` bigint, + `f_float` float, + `f_double` double, + `f_decimal` decimal(10,0), + `f_timestamp` timestamp, + `f_date` date, + `f_string` string, + `f_varchar` varchar(100), + `f_bool` boolean, + `f_binary` binary, + `f_array_int` array, + `f_array_string` array, + `f_array_float` array, + `f_array_array_int` array>, + `f_array_array_string` array>, + `f_array_array_float` array>) +PARTITIONED BY ( + `day` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' +STORED AS INPUTFORMAT + 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' +LOCATION + 'hdfs://testcluster/data/hive/test.db/test_orc' + +OK +Time taken: 0.51 seconds + +hive > insert into test.test_orc partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44))); +OK +Time taken: 36.025 seconds + +hive > select * from test.test_orc; +OK +1 2 3 4 5 6.11 7.22 8 2021-11-05 12:38:16.314 2021-11-05 hello world hello world hello world true hello world [1,2,3] ["hello world","hello world"] [1.1,1.2] [[1,2],[3,4]] [["a","b"],["c","d"]] [[1.11,2.22],[3.33,4.44]] 2021-09-18 +Time taken: 0.295 seconds, Fetched: 1 row(s) +``` + +#### ClickHouseでテーブルを作成 +上記で作成したHiveテーブルからデータを取得するClickHouseのテーブル: +``` sql +CREATE TABLE test.test_orc +( + `f_tinyint` Int8, + `f_smallint` Int16, + `f_int` Int32, + `f_integer` Int32, + `f_bigint` Int64, + `f_float` Float32, + `f_double` Float64, + `f_decimal` Float64, + `f_timestamp` DateTime, + `f_date` Date, + `f_string` String, + `f_varchar` String, + `f_bool` Bool, + `f_binary` String, + `f_array_int` Array(Int32), + `f_array_string` Array(String), + `f_array_float` Array(Float32), + `f_array_array_int` Array(Array(Int32)), + `f_array_array_string` Array(Array(String)), + `f_array_array_float` Array(Array(Float32)), + `day` String +) +ENGINE = Hive('thrift://202.168.117.26:9083', 'test', 'test_orc') +PARTITION BY day +``` + +``` sql +SELECT * FROM test.test_orc settings input_format_orc_allow_missing_columns = 1\G +``` + +``` text +SELECT * +FROM test.test_orc +SETTINGS input_format_orc_allow_missing_columns = 1 + +Query id: c3eaffdc-78ab-43cd-96a4-4acc5b480658 + +Row 1: +────── +f_tinyint: 1 +f_smallint: 2 +f_int: 3 +f_integer: 4 +f_bigint: 5 +f_float: 6.11 +f_double: 7.22 +f_decimal: 8 +f_timestamp: 2021-12-04 04:00:44 +f_date: 2021-12-03 +f_string: hello world +f_varchar: hello world +f_bool: true +f_binary: hello world +f_array_int: [1,2,3] +f_array_string: ['hello world','hello world'] +f_array_float: [1.1,1.2] +f_array_array_int: [[1,2],[3,4]] +f_array_array_string: [['a','b'],['c','d']] +f_array_array_float: [[1.11,2.22],[3.33,4.44]] +day: 2021-09-18 + +1 rows in set. Elapsed: 0.078 sec. +``` + +### Parquet入力フォーマットでHiveテーブルを照会 + +#### Hiveでテーブルを作成 +``` text +hive > +CREATE TABLE `test`.`test_parquet`( + `f_tinyint` tinyint, + `f_smallint` smallint, + `f_int` int, + `f_integer` int, + `f_bigint` bigint, + `f_float` float, + `f_double` double, + `f_decimal` decimal(10,0), + `f_timestamp` timestamp, + `f_date` date, + `f_string` string, + `f_varchar` varchar(100), + `f_char` char(100), + `f_bool` boolean, + `f_binary` binary, + `f_array_int` array, + `f_array_string` array, + `f_array_float` array, + `f_array_array_int` array>, + `f_array_array_string` array>, + `f_array_array_float` array>) +PARTITIONED BY ( + `day` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' +LOCATION + 'hdfs://testcluster/data/hive/test.db/test_parquet' +OK +Time taken: 0.51 seconds + +hive > insert into test.test_parquet partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44))); +OK +Time taken: 36.025 seconds + +hive > select * from test.test_parquet; +OK +1 2 3 4 5 6.11 7.22 8 2021-12-14 17:54:56.743 2021-12-14 hello world hello world hello world true hello world [1,2,3] ["hello world","hello world"] [1.1,1.2] [[1,2],[3,4]] [["a","b"],["c","d"]] [[1.11,2.22],[3.33,4.44]] 2021-09-18 +Time taken: 0.766 seconds, Fetched: 1 row(s) +``` + +#### ClickHouseでテーブルを作成 +上記で作成したHiveテーブルからデータを取得するClickHouseのテーブル: +``` sql +CREATE TABLE test.test_parquet +( + `f_tinyint` Int8, + `f_smallint` Int16, + `f_int` Int32, + `f_integer` Int32, + `f_bigint` Int64, + `f_float` Float32, + `f_double` Float64, + `f_decimal` Float64, + `f_timestamp` DateTime, + `f_date` Date, + `f_string` String, + `f_varchar` String, + `f_char` String, + `f_bool` Bool, + `f_binary` String, + `f_array_int` Array(Int32), + `f_array_string` Array(String), + `f_array_float` Array(Float32), + `f_array_array_int` Array(Array(Int32)), + `f_array_array_string` Array(Array(String)), + `f_array_array_float` Array(Array(Float32)), + `day` String +) +ENGINE = Hive('thrift://localhost:9083', 'test', 'test_parquet') +PARTITION BY day +``` + +``` sql +SELECT * FROM test.test_parquet settings input_format_parquet_allow_missing_columns = 1\G +``` + +``` text +SELECT * +FROM test_parquet +SETTINGS input_format_parquet_allow_missing_columns = 1 + +Query id: 4e35cf02-c7b2-430d-9b81-16f438e5fca9 + +Row 1: +────── +f_tinyint: 1 +f_smallint: 2 +f_int: 3 +f_integer: 4 +f_bigint: 5 +f_float: 6.11 +f_double: 7.22 +f_decimal: 8 +f_timestamp: 2021-12-14 17:54:56 +f_date: 2021-12-14 +f_string: hello world +f_varchar: hello world +f_char: hello world +f_bool: true +f_binary: hello world +f_array_int: [1,2,3] +f_array_string: ['hello world','hello world'] +f_array_float: [1.1,1.2] +f_array_array_int: [[1,2],[3,4]] +f_array_array_string: [['a','b'],['c','d']] +f_array_array_float: [[1.11,2.22],[3.33,4.44]] +day: 2021-09-18 + +1 rows in set. Elapsed: 0.357 sec. +``` + +### Text入力フォーマットでHiveテーブルを照会 +#### Hiveでテーブルを作成 +``` text +hive > +CREATE TABLE `test`.`test_text`( + `f_tinyint` tinyint, + `f_smallint` smallint, + `f_int` int, + `f_integer` int, + `f_bigint` bigint, + `f_float` float, + `f_double` double, + `f_decimal` decimal(10,0), + `f_timestamp` timestamp, + `f_date` date, + `f_string` string, + `f_varchar` varchar(100), + `f_char` char(100), + `f_bool` boolean, + `f_binary` binary, + `f_array_int` array, + `f_array_string` array, + `f_array_float` array, + `f_array_array_int` array>, + `f_array_array_string` array>, + `f_array_array_float` array>) +PARTITIONED BY ( + `day` string) +ROW FORMAT SERDE + 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' +STORED AS INPUTFORMAT + 'org.apache.hadoop.mapred.TextInputFormat' +OUTPUTFORMAT + 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' +LOCATION + 'hdfs://testcluster/data/hive/test.db/test_text' +Time taken: 0.1 seconds, Fetched: 34 row(s) + +hive > insert into test.test_text partition(day='2021-09-18') select 1, 2, 3, 4, 5, 6.11, 7.22, 8.333, current_timestamp(), current_date(), 'hello world', 'hello world', 'hello world', true, 'hello world', array(1, 2, 3), array('hello world', 'hello world'), array(float(1.1), float(1.2)), array(array(1, 2), array(3, 4)), array(array('a', 'b'), array('c', 'd')), array(array(float(1.11), float(2.22)), array(float(3.33), float(4.44))); +OK +Time taken: 36.025 seconds + +hive > select * from test.test_text; +OK +1 2 3 4 5 6.11 7.22 8 2021-12-14 18:11:17.239 2021-12-14 hello world hello world hello world true hello world [1,2,3] ["hello world","hello world"] [1.1,1.2] [[1,2],[3,4]] [["a","b"],["c","d"]] [[1.11,2.22],[3.33,4.44]] 2021-09-18 +Time taken: 0.624 seconds, Fetched: 1 row(s) +``` + +#### ClickHouseでテーブルを作成 + +上記で作成したHiveテーブルからデータを取得するClickHouseのテーブル: +``` sql +CREATE TABLE test.test_text +( + `f_tinyint` Int8, + `f_smallint` Int16, + `f_int` Int32, + `f_integer` Int32, + `f_bigint` Int64, + `f_float` Float32, + `f_double` Float64, + `f_decimal` Float64, + `f_timestamp` DateTime, + `f_date` Date, + `f_string` String, + `f_varchar` String, + `f_char` String, + `f_bool` Bool, + `day` String +) +ENGINE = Hive('thrift://localhost:9083', 'test', 'test_text') +PARTITION BY day +``` + +``` sql +SELECT * FROM test.test_text settings input_format_skip_unknown_fields = 1, input_format_with_names_use_header = 1, date_time_input_format = 'best_effort'\G +``` + +``` text +SELECT * +FROM test.test_text +SETTINGS input_format_skip_unknown_fields = 1, input_format_with_names_use_header = 1, date_time_input_format = 'best_effort' + +Query id: 55b79d35-56de-45b9-8be6-57282fbf1f44 + +Row 1: +────── +f_tinyint: 1 +f_smallint: 2 +f_int: 3 +f_integer: 4 +f_bigint: 5 +f_float: 6.11 +f_double: 7.22 +f_decimal: 8 +f_timestamp: 2021-12-14 18:11:17 +f_date: 2021-12-14 +f_string: hello world +f_varchar: hello world +f_char: hello world +f_bool: true +day: 2021-09-18 +``` + + diff --git a/docs/ja/engines/table-engines/integrations/hudi.md b/docs/ja/engines/table-engines/integrations/hudi.md new file mode 100644 index 00000000000..d8c4d02f375 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/hudi.md @@ -0,0 +1,53 @@ +--- +slug: /ja/engines/table-engines/integrations/hudi +sidebar_position: 86 +sidebar_label: Hudi +--- + +# Hudi テーブルエンジン + +このエンジンは、Amazon S3 に存在する Apache [Hudi](https://hudi.apache.org/) テーブルとの読み取り専用の統合機能を提供します。 + +## テーブルの作成 + +Hudi テーブルはすでに S3 に存在している必要があり、このコマンドは新しいテーブルを作成するための DDL パラメータを受け取りません。 + +``` sql +CREATE TABLE hudi_table + ENGINE = Hudi(url, [aws_access_key_id, aws_secret_access_key,]) +``` + +**エンジンパラメータ** + +- `url` — 既存の Hudi テーブルへのパスを含むバケットの URL。 +- `aws_access_key_id`, `aws_secret_access_key` - [AWS](https://aws.amazon.com/) アカウントユーザーのための長期資格情報。これを使用してリクエストを認証できます。このパラメータはオプションです。資格情報が指定されていない場合、設定ファイルから使用されます。 + +エンジンパラメータは [Named Collections](/docs/ja/operations/named-collections.md) を使用して指定できます。 + +**例** + +```sql +CREATE TABLE hudi_table ENGINE=Hudi('http://mars-doc-test.s3.amazonaws.com/clickhouse-bucket-3/test_table/', 'ABC123', 'Abc+123') +``` + +Named Collections を使用する場合: + +``` xml + + + + http://mars-doc-test.s3.amazonaws.com/clickhouse-bucket-3/ + ABC123 + Abc+123 + + + +``` + +```sql +CREATE TABLE hudi_table ENGINE=Hudi(hudi_conf, filename = 'test_table') +``` + +## 参照 + +- [hudi テーブル関数](/docs/ja/sql-reference/table-functions/hudi.md) diff --git a/docs/ja/engines/table-engines/integrations/iceberg.md b/docs/ja/engines/table-engines/integrations/iceberg.md new file mode 100644 index 00000000000..632a94e6360 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/iceberg.md @@ -0,0 +1,70 @@ +--- +slug: /ja/engines/table-engines/integrations/iceberg +sidebar_position: 90 +sidebar_label: Iceberg +--- + +# Iceberg テーブルエンジン + +このエンジンは、Amazon S3、Azure、HDFS そしてローカルに保存された Apache [Iceberg](https://iceberg.apache.org/) テーブルと既存のテーブルへの読み取り専用の統合を提供します。 + +## テーブルの作成 + +Iceberg テーブルはストレージにすでに存在している必要があることに注意してください。このコマンドは、新しいテーブルを作成するためのDDLパラメータを受け取りません。 + +``` sql +CREATE TABLE iceberg_table_s3 + ENGINE = IcebergS3(url, [, NOSIGN | access_key_id, secret_access_key, [session_token]], format, [,compression]) + +CREATE TABLE iceberg_table_azure + ENGINE = IcebergAzure(connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression]) + +CREATE TABLE iceberg_table_hdfs + ENGINE = IcebergHDFS(path_to_table, [,format] [,compression_method]) + +CREATE TABLE iceberg_table_local + ENGINE = IcebergLocal(path_to_table, [,format] [,compression_method]) +``` + +**エンジンの引数** + +引数の説明は、`S3`、`AzureBlobStorage`、`HDFS` そして `File` の各エンジンの引数説明と一致します。 +`format` は、Iceberg テーブル内のデータファイルの形式を表します。 + +エンジンパラメータは、[Named Collections](../../../operations/named-collections.md) を使用して指定できます。 + +**例** + +```sql +CREATE TABLE iceberg_table ENGINE=IcebergS3('http://test.s3.amazonaws.com/clickhouse-bucket/test_table', 'test', 'test') +``` + +Named Collectionsを使用: + +``` xml + + + + http://test.s3.amazonaws.com/clickhouse-bucket/ + test + test + + + +``` + +```sql +CREATE TABLE iceberg_table ENGINE=IcebergS3(iceberg_conf, filename = 'test_table') +``` + +**エイリアス** + +テーブルエンジン `Iceberg` は現在 `IcebergS3` のエイリアスです。 + +### データキャッシュ {#data-cache} + +`Iceberg` テーブルエンジンおよびテーブル関数は、`S3`、`AzureBlobStorage`、`HDFS` ストレージと同様にデータキャッシュをサポートしています。詳細は[こちら](../../../engines/table-engines/integrations/s3.md#data-cache)をご覧ください。 + +## 参照 + +- [Iceberg テーブル関数](/docs/ja/sql-reference/table-functions/iceberg.md) diff --git a/docs/ja/engines/table-engines/integrations/index.md b/docs/ja/engines/table-engines/integrations/index.md new file mode 100644 index 00000000000..dd3964b530f --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/index.md @@ -0,0 +1,9 @@ +--- +slug: /ja/engines/table-engines/integrations/ +sidebar_position: 40 +sidebar_label: インテグレーション +--- + +# インテグレーション用テーブルエンジン + +ClickHouseは、外部システムとのインテグレーションのために、さまざまな手段を提供しており、その中にはテーブルエンジンも含まれます。 他のすべてのテーブルエンジンと同様に、設定は `CREATE TABLE` または `ALTER TABLE` クエリを用いて行います。 ユーザーの観点から見ると、設定されたインテグレーションは通常のテーブルのように見えますが、そのクエリは外部システムにプロキシされます。この透過的なクエリは、Dictionaryやテーブル関数のような代替のインテグレーション方法に対する大きな利点の一つで、各使用時にカスタムクエリメソッドを使用する必要がありません。 diff --git a/docs/ja/engines/table-engines/integrations/jdbc.md b/docs/ja/engines/table-engines/integrations/jdbc.md new file mode 100644 index 00000000000..8806bbe8ada --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/jdbc.md @@ -0,0 +1,99 @@ +--- +slug: /ja/engines/table-engines/integrations/jdbc +sidebar_position: 100 +sidebar_label: JDBC +--- + +# JDBC + +:::note +clickhouse-jdbc-bridgeにはエクスペリメンタルなコードが含まれており、もはやサポートされていません。信頼性の問題やセキュリティの脆弱性を含む可能性があります。使用する際は自己責任でお願いします。 +ClickHouseでは、Postgres、MySQL、MongoDBなどのアドホックなクエリシナリオに対するより良い代替手段を提供するClickHouseに内蔵されたテーブル関数を使用することを推奨しています。 +::: + +ClickHouseが外部データベースに[**JDBC**](https://en.wikipedia.org/wiki/Java_Database_Connectivity)経由で接続することを可能にします。 + +JDBC接続を実装するために、ClickHouseはデーモンとして実行される別個のプログラム[clickhouse-jdbc-bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge)を使用します。 + +このエンジンは[Nullable](../../../sql-reference/data-types/nullable.md)データ型をサポートしています。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + columns list... +) +ENGINE = JDBC(datasource_uri, external_database, external_table) +``` + +**エンジンパラメータ** + + +- `datasource_uri` — 外部DBMSのURIまたは名前。 + + URI形式: `jdbc:://:/?user=&password=`。 + MySQLの例: `jdbc:mysql://localhost:3306/?user=root&password=root`。 + +- `external_database` — 外部DBMSのデータベース。 + +- `external_table` — `external_database`内のテーブル名、または`select * from table1 where column1=1`のようなselect クエリ。 + +## 使用例 {#usage-example} + +MySQLサーバーのコンソールクライアントに直接接続してテーブルを作成します: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++------+----------+-----+----------+ +| int_id | int_nullable | float | float_nullable | ++------+----------+-----+----------+ +| 1 | NULL | 2 | NULL | ++------+----------+-----+----------+ +1 row in set (0,00 sec) +``` + +ClickHouseサーバーでテーブルを作成しデータを選択します: + +``` sql +CREATE TABLE jdbc_table +( + `int_id` Int32, + `int_nullable` Nullable(Int32), + `float` Float32, + `float_nullable` Nullable(Float32) +) +ENGINE JDBC('jdbc:mysql://localhost:3306/?user=root&password=root', 'test', 'test') +``` + +``` sql +SELECT * +FROM jdbc_table +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │ +└────────┴──────────────┴───────┴────────────────┘ +``` + +``` sql +INSERT INTO jdbc_table(`int_id`, `float`) +SELECT toInt32(number), toFloat32(number * 1.0) +FROM system.numbers +``` + +## 関連項目 {#see-also} + +- [JDBCテーブル関数](../../../sql-reference/table-functions/jdbc.md)。 diff --git a/docs/ja/engines/table-engines/integrations/kafka.md b/docs/ja/engines/table-engines/integrations/kafka.md new file mode 100644 index 00000000000..2d8b581f625 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/kafka.md @@ -0,0 +1,295 @@ +--- +slug: /ja/engines/table-engines/integrations/kafka +sidebar_position: 110 +sidebar_label: Kafka +--- + +# Kafka + +このエンジンは [Apache Kafka](http://kafka.apache.org/) と連携します。 + +Kafkaの利点: + +- データフローの発行や購読が可能です。 +- フォールトトレラントなストレージを整理できます。 +- ストリームを利用可能にした時点で処理します。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [ALIAS expr1], + name2 [type2] [ALIAS expr2], + ... +) ENGINE = Kafka() +SETTINGS + kafka_broker_list = 'host:port', + kafka_topic_list = 'topic1,topic2,...', + kafka_group_name = 'group_name', + kafka_format = 'data_format'[,] + [kafka_schema = '',] + [kafka_num_consumers = N,] + [kafka_max_block_size = 0,] + [kafka_skip_broken_messages = N,] + [kafka_commit_every_batch = 0,] + [kafka_client_id = '',] + [kafka_poll_timeout_ms = 0,] + [kafka_poll_max_batch_size = 0,] + [kafka_flush_interval_ms = 0,] + [kafka_thread_per_consumer = 0,] + [kafka_handle_error_mode = 'default',] + [kafka_commit_on_select = false,] + [kafka_max_rows_per_message = 1]; +``` + +必須パラメータ: + +- `kafka_broker_list` — ブローカーのカンマ区切りリスト (例: `localhost:9092`)。 +- `kafka_topic_list` — Kafka トピックのリスト。 +- `kafka_group_name` — Kafka コンシューマのグループ。各グループの読み取り範囲は別々に追跡されます。クラスタ内でメッセージが重複しないようにする場合、すべての場所で同じグループ名を使用します。 +- `kafka_format` — メッセージフォーマット。SQL の `FORMAT` 関数と同じ記法が使用され、例えば `JSONEachRow` が使用されます。詳細は [Formats](../../../interfaces/formats.md) を参照してください。 + +オプションパラメータ: + +- `kafka_schema` — フォーマットがスキーマ定義を必要とする場合に使用されるパラメータ。例えば [Cap’n Proto](https://capnproto.org/) では、スキーマファイルへのパスとルート `schema.capnp:Message` オブジェクトの名前が必要です。 +- `kafka_num_consumers` — テーブルあたりのコンシューマ数。1 つのコンシューマのスループットが不十分な場合は、さらにコンシューマを指定します。トピックのパーティション数を超えない数にする必要があります。1 つのパーティションには 1 つのコンシューマしか割り当てられず、ClickHouse がデプロイされたサーバー上の物理コア数を超えてはいけません。デフォルト: `1`。 +- `kafka_max_block_size` — ポーリングの最大バッチサイズ(メッセージ単位)。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 +- `kafka_skip_broken_messages` — Kafka メッセージのパーサがブロックごとにスキーマと互換性のないメッセージを許容するかどうか。`kafka_skip_broken_messages = N` の場合、パーサで解析できない *N* の Kafka メッセージ(メッセージはデータの1行に相当)をスキップします。デフォルト: `0`。 +- `kafka_commit_every_batch` — 全ブロックに書き込み後の単一コミットではなく、消費および処理された各バッチをコミットします。デフォルト: `0`。 +- `kafka_client_id` — クライアント識別子。デフォルトは空です。 +- `kafka_poll_timeout_ms` — Kafka からの単一ポールのタイムアウト。デフォルト: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms)。 +- `kafka_poll_max_batch_size` — 単一の Kafka ポールでポーリングされる最大メッセージ量。デフォルト: [max_block_size](../../../operations/settings/settings.md#setting-max_block_size)。 +- `kafka_flush_interval_ms` — Kafka からのデータをフラッシュするタイムアウト。デフォルト: [stream_flush_interval_ms](../../../operations/settings/settings.md#stream-flush-interval-ms)。 +- `kafka_thread_per_consumer` — 各コンシューマに独立したスレッドを提供します。有効にすると、各コンシューマはデータを独立して、並行してフラッシュします(そうでない場合は、複数のコンシューマからの行が集約されて1ブロックを形成します)。デフォルト: `0`。 +- `kafka_handle_error_mode` — Kafka エンジンのエラーをどのように対処するかを指定します。可能な値: デフォルト(メッセージの解析に失敗した場合に例外がスローされる)、ストリーム(例外メッセージと未加工のメッセージが仮想カラム `_error` 及び `_raw_message` に保存されます)。 +- `kafka_commit_on_select` — Select クエリが実行されたときにメッセージをコミットします。デフォルト: `false`。 +- `kafka_max_rows_per_message` — 行ベースのフォーマット用の 1 つの Kafka メッセージに書き込まれる最大行数。デフォルト : `1`。 + +例: + +``` sql + CREATE TABLE queue ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow'); + + SELECT * FROM queue LIMIT 5; + + CREATE TABLE queue2 ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka SETTINGS kafka_broker_list = 'localhost:9092', + kafka_topic_list = 'topic', + kafka_group_name = 'group1', + kafka_format = 'JSONEachRow', + kafka_num_consumers = 4; + + CREATE TABLE queue3 ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1') + SETTINGS kafka_format = 'JSONEachRow', + kafka_num_consumers = 4; +``` + +
+ +非推奨のテーブル作成メソッド + +:::note +新しいプロジェクトではこの方法を使用しないでください。可能であれば、上で説明したメソッドに旧プロジェクトを切り替えてください。 +::: + +``` sql +Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format + [, kafka_row_delimiter, kafka_schema, kafka_num_consumers, kafka_max_block_size, kafka_skip_broken_messages, kafka_commit_every_batch, kafka_client_id, kafka_poll_timeout_ms, kafka_poll_max_batch_size, kafka_flush_interval_ms, kafka_thread_per_consumer, kafka_handle_error_mode, kafka_commit_on_select, kafka_max_rows_per_message]); +``` + +
+ +:::info +Kafkaテーブルエンジンは[デフォルト値](../../../sql-reference/statements/create/table.md#default_value)を持つカラムをサポートしていません。デフォルト値を持つカラムが必要な場合、マテリアライズドビューのレベルで追加できます(下記参照)。 +::: + +## 説明 {#description} + +提供されたメッセージは自動的に追跡され、グループ内の各メッセージは1回のみカウントされます。データを2回取得したい場合は、別のグループ名でテーブルのコピーを作成します。 + +グループは柔軟でクラスタ内で同期されます。たとえば、10のトピックとクラスタ内のテーブルのコピーが5つある場合、それぞれのコピーは2つのトピックを取得します。コピーの数が変わると、トピックは自動的にコピー間で再配信されます。詳細は http://kafka.apache.org/intro を参照してください。 + +`SELECT` はメッセージの読み取りには特に有用ではありません(デバッグを除く)なぜなら各メッセージは一度のみ読み取れるからです。実際には、マテリアライズドビューを使用してリアルタイムスレッドを作成する方が実用的です。以下の手順で行います: + +1. エンジンを使用して Kafka コンシューマを作成し、データストリームと見なします。 +2. 所望の構造でテーブルを作成します。 +3. データをエンジンから変換し、以前に作成したテーブルに投入するマテリアライズドビューを作成します。 + +`MATERIALIZED VIEW` がエンジンに接続されると、バックグラウンドでデータの収集が始まります。これにより、Kafkaからメッセージを継続的に受信し、 `SELECT` を使用して必要なフォーマットに変換できます。 +1つのKafkaテーブルには、好きなだけ多くのマテリアライズドビューを持つことができ、それらはkafkaテーブルから直接データを読み取るのではなく、新しいレコード(ブロック単位)を受信します。この方法で、異なる詳細レベル(集約あり・なし)の複数のテーブルに書き込むことができます。 + +例: + +``` sql + CREATE TABLE queue ( + timestamp UInt64, + level String, + message String + ) ENGINE = Kafka('localhost:9092', 'topic', 'group1', 'JSONEachRow'); + + CREATE TABLE daily ( + day Date, + level String, + total UInt64 + ) ENGINE = SummingMergeTree(day, (day, level), 8192); + + CREATE MATERIALIZED VIEW consumer TO daily + AS SELECT toDate(toDateTime(timestamp)) AS day, level, count() as total + FROM queue GROUP BY day, level; + + SELECT level, sum(total) FROM daily GROUP BY level; +``` +パフォーマンスを向上させるために、受信したメッセージは [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size) のサイズのブロックにまとめられます。ブロックが[stream_flush_interval_ms](../../../operations/settings/settings.md/#stream-flush-interval-ms)ミリ秒以内に形成されない場合、データはブロックが完全であるかどうかに関係なくテーブルにフラッシュされます。 + +トピックデータの受信を停止するか、変換ロジックを変更するには、マテリアライズドビューをデタッチします: + +``` sql + DETACH TABLE consumer; + ATTACH TABLE consumer; +``` + +`ALTER` を使用してターゲットテーブルを変更したい場合は、ターゲットテーブルとビューからのデータ間の不一致を避けるためにマテリアルビューを無効にすることをお勧めします。 + +## 設定 {#configuration} + +GraphiteMergeTree と同様に、Kafka エンジンは ClickHouse の設定ファイルを使用した拡張設定をサポートしています。使用できる設定キーは2つあります: グローバル(`` 以下)と トピックレベル(`` 以下)。最初にグローバル設定が適用され、その後にトピックレベルの設定が適用されます(存在する場合)。 + +``` xml + + + cgrp + 3000 + + + logs + 4000 + + + + + smallest + + logs + 100000 + + + + stats + 50000 + + + + + + + logs + 250 + + + + stats + 400 + + + +``` + +可能な設定オプションのリストについては、[librdkafka configuration reference](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md) を参照してください。ClickHouse 設定では、ドット (`_`) の代わりにアンダースコア (`_`) を使用します。例えば、`check.crcs=true` は `true` となります。 + +### Kerberos サポート {#kafka-kerberos-support} + +Kerberosを認識するKafkaを扱うには、`security_protocol` の子要素として `sasl_plaintext` の値を追加します。KerberosチケットがOSによって取得されキャッシュされている限り、それで十分です。 +ClickHouse は keytab ファイルを使用してKerberos 資格情報を管理することができます。`sasl_kerberos_service_name`、`sasl_kerberos_keytab`、`sasl_kerberos_principal` の子要素を考慮してください。 + +例: + +``` xml + + + SASL_PLAINTEXT + /home/kafkauser/kafkauser.keytab + kafkauser/kafkahost@EXAMPLE.COM + +``` + +## 仮想カラム {#virtual-columns} + +- `_topic` — Kafka トピック。データ型: `LowCardinality(String)`。 +- `_key` — メッセージのキー。データ型: `String`。 +- `_offset` — メッセージのオフセット。データ型: `UInt64`。 +- `_timestamp` — メッセージのタイムスタンプ。データ型: `Nullable(DateTime)`。 +- `_timestamp_ms` — メッセージのミリ秒単位のタイムスタンプ。データ型: `Nullable(DateTime64(3))`。 +- `_partition` — Kafka トピックのパーティション。データ型: `UInt64`。 +- `_headers.name` — メッセージのヘッダキーの配列。データ型: `Array(String)`。 +- `_headers.value` — メッセージのヘッダ値の配列。データ型: `Array(String)`。 + +`kafka_handle_error_mode='stream'` の場合の追加仮想カラム: + +- `_raw_message` - 解析に失敗した生メッセージ。データ型: `String`。 +- `_error` - 解析失敗時の例外メッセージ。データ型: `String`。 + +注意: `_raw_message` と `_error` の仮想カラムは、解析中の例外の場合にのみ入力され、メッセージが正常に解析された場合は常に空です。 + +## データフォーマットのサポート {#data-formats-support} + +Kafka エンジンは、ClickHouse でサポートされるすべての [フォーマット](../../../interfaces/formats.md) をサポートします。 +1つの Kafka メッセージ内の行数は、フォーマットが行ベースかブロックベースかによって異なります。 + +- 行ベースのフォーマットでは、1つの Kafka メッセージ内の行数は `kafka_max_rows_per_message` 設定によって制御できます。 +- ブロックベースのフォーマットでは、ブロックを小さな部分に分割することはできませんが、1つのブロック内の行数は一般設定 [max_block_size](../../../operations/settings/settings.md#setting-max_block_size) によって制御できます。 + +## コミット済みオフセットをClickHouse Keeperに格納するエクスペリメンタルエンジン {#experimental-kafka-keeper} + +`allow_experimental_kafka_offsets_storage_in_keeper` が有効になっている場合、以下の2つの設定を Kafka テーブルエンジンに指定できます: + - `kafka_keeper_path` は ClickHouse Keeper のテーブルへのパスを指定します。 + - `kafka_replica_name` は ClickHouse Keeper 内のレプリカ名を指定します。 + +これらの設定はいずれも単独で指定することはできません。両方の設定が指定されている場合は、新しいエクスペリメンタルな Kafka エンジンが使用されます。この新しいエンジンは、設定済みのオフセットをKafkaに保存することには依存せず、ClickHouse Keeperにそれらを保存します。ただし、Kafkaへのオフセットコミットはまだ試みられますが、テーブルが作成される際にのみそれらのオフセットに依存します。その他の状況(テーブルの再起動またはエラー後の復旧)では、ClickHouse Keeperに保存されたオフセットがメッセージの消費を続けるために使用されます。コミット済みオフセットに加えて、最後のバッチで消費されたメッセージ数も保存され、挿入に失敗した場合、同じメッセージ数が消費されるため、必要に応じて重複除去が可能です。 + +例: + +``` sql +CREATE TABLE experimental_kafka (key UInt64, value UInt64) +ENGINE = Kafka('localhost:19092', 'my-topic', 'my-consumer', 'JSONEachRow') +SETTINGS + kafka_keeper_path = '/clickhouse/{database}/experimental_kafka', + kafka_replica_name = 'r1' +SETTINGS allow_experimental_kafka_offsets_storage_in_keeper=1; +``` + +または、`uuid` と `replica` マクロを ReplicatedMergeTree と同様に利用するには: + +``` sql +CREATE TABLE experimental_kafka (key UInt64, value UInt64) +ENGINE = Kafka('localhost:19092', 'my-topic', 'my-consumer', 'JSONEachRow') +SETTINGS + kafka_keeper_path = '/clickhouse/{database}/{uuid}', + kafka_replica_name = '{replica}' +SETTINGS allow_experimental_kafka_offsets_storage_in_keeper=1; +``` + +### 既知の制限 + +新しいエンジンはエクスペリメンタルであり、まだ本番使用には適していません。いくつかの既知の制限があります: + - 最大の制限点は、エンジンが直接読み取りをサポートしていないことです。マテリアライズドビューを使用したエンジンからの読み取りとエンジンへの書き込みは動作しますが、直接読み取りは動作しません。その結果、すべての直接 `SELECT` クエリは失敗します。 + - テーブルの急速な削除と再作成、または異なるエンジンに同じ ClickHouse Keeper パスを指定することは、問題を引き起こす可能性があります。パスの衝突を避けるために、`kafka_keeper_path` に `{uuid}` を使用することをお勧めします。 + - 繰り返し可能な読み取りを行うためには、1 つのスレッドで複数のパーティションからメッセージを消費することはできません。 一方で、Kafka コンシューマは定期的にポーリングして生かしておく必要があります。これら2つの目的を満たすために、`kafka_thread_per_consumer` が有効になっている場合にのみ複数のコンシューマを作成することが可能で、そうでなければ定期的にコンシューマをポーリングすることに関して問題を回避するのが難しすぎます。 + - 新しいストレージエンジンによって作成されたコンシューマは、[`system.kafka_consumers`](../../../operations/system-tables/kafka_consumers.md) テーブルに表示されません。 + +**関連情報** + +- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) +- [background_message_broker_schedule_pool_size](../../../operations/server-configuration-parameters/settings.md#background_message_broker_schedule_pool_size) +- [system.kafka_consumers](../../../operations/system-tables/kafka_consumers.md) diff --git a/docs/ja/engines/table-engines/integrations/materialized-postgresql.md b/docs/ja/engines/table-engines/integrations/materialized-postgresql.md new file mode 100644 index 00000000000..11d013cf564 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/materialized-postgresql.md @@ -0,0 +1,66 @@ +--- +slug: /ja/engines/table-engines/integrations/materialized-postgresql +sidebar_position: 130 +sidebar_label: MaterializedPostgreSQL +--- + +# [エクスペリメンタル] MaterializedPostgreSQL + +PostgreSQL テーブルの初期データダンプを作成し、レプリケーションプロセスを開始します。つまり、リモートの PostgreSQL データベース内の PostgreSQL テーブルで発生した新しい変更を逐次適用するためのバックグラウンドジョブを実行します。 + +:::note +このテーブルエンジンはエクスペリメンタルです。使用するには、設定ファイルまたは `SET` コマンドを使用して `allow_experimental_materialized_postgresql_table` を 1 に設定します: +```sql +SET allow_experimental_materialized_postgresql_table=1 +``` +::: + +複数のテーブルが必要な場合は、テーブルエンジンではなく[MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md) データベースエンジンを使用し、レプリケートするテーブルを指定する `materialized_postgresql_tables_list` 設定(データベース`スキーマ`も追加可能になります)を使用することを強くお勧めします。これにより、CPU の観点で非常に優れ、リモート PostgreSQL データベース内の接続数とレプリケーションスロットが少なくて済みます。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_table', 'postgres_user', 'postgres_password') +PRIMARY KEY key; +``` + +**エンジンパラメータ** + +- `host:port` — PostgreSQL サーバーアドレス。 +- `database` — リモートデータベース名。 +- `table` — リモートテーブル名。 +- `user` — PostgreSQL ユーザー。 +- `password` — ユーザーパスワード。 + +## 要件 {#requirements} + +1. PostgreSQL の設定ファイルで、[wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) 設定は `logical` 、`max_replication_slots` パラメータは少なくとも `2` である必要があります。 + +2. `MaterializedPostgreSQL` エンジンを持つテーブルには、PostgreSQL テーブルのレプリカアイデンティティインデックス(デフォルトでは主キー、[レプリカアイデンティティインデックスの詳細はこちら](../../../engines/database-engines/materialized-postgresql.md#requirements))と同じ主キーが必要です。 + +3. データベース[Atomic](https://en.wikipedia.org/wiki/Atomicity_(database_systems)) のみが許可されています。 + +4. `MaterializedPostgreSQL` テーブルエンジンは、PostgreSQL バージョンが >= 11 でのみ動作します。これは、[pg_replication_slot_advance](https://pgpedia.info/p/pg_replication_slot_advance.html) PostgreSQL 関数を必要とするためです。 + +## バーチャルカラム {#virtual-columns} + +- `_version` — トランザクションカウンター。タイプ: [UInt64](../../../sql-reference/data-types/int-uint.md)。 + +- `_sign` — 削除マーク。タイプ: [Int8](../../../sql-reference/data-types/int-uint.md)。可能な値: + - `1` — 行は削除されていません、 + - `-1` — 行は削除されています。 + +これらのカラムはテーブル作成時に追加する必要はありません。`SELECT` クエリで常にアクセス可能です。`_version` カラムは `WAL` の `LSN` 位置に等しいので、レプリケーションの最新状態を確認するために使用できます。 + +``` sql +CREATE TABLE postgresql_db.postgresql_replica (key UInt64, value UInt64) +ENGINE = MaterializedPostgreSQL('postgres1:5432', 'postgres_database', 'postgresql_replica', 'postgres_user', 'postgres_password') +PRIMARY KEY key; + +SELECT key, value, _version FROM postgresql_db.postgresql_replica; +``` + +:::note +[**TOAST**](https://www.postgresql.org/docs/9.5/storage-toast.html) 値のレプリケーションはサポートされていません。データ型のデフォルト値が使用されます。 +::: diff --git a/docs/ja/engines/table-engines/integrations/mongodb.md b/docs/ja/engines/table-engines/integrations/mongodb.md new file mode 100644 index 00000000000..05a5b7e02ce --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/mongodb.md @@ -0,0 +1,181 @@ +--- +slug: /ja/engines/table-engines/integrations/mongodb +sidebar_position: 135 +sidebar_label: MongoDB +--- + +# MongoDB + +MongoDB エンジンはリモート [MongoDB](https://www.mongodb.com/) コレクションからデータを読み取るための読み取り専用テーブルエンジンです。 + +MongoDB v3.6+ サーバーのみがサポートされています。 +[シードリスト(`mongodb+srv`)](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-seed-list)はまだサポートされていません。 + +:::note +トラブルが発生した場合は、問題を報告し、[従来の実装](../../../operations/server-configuration-parameters/settings.md#use_legacy_mongodb_integration)を試してみてください。ただし、これは非推奨であり、次のリリースで削除される予定ですのでご注意ください。 +::: + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + name1 [type1], + name2 [type2], + ... +) ENGINE = MongoDB(host:port, database, collection, user, password [, options]); +``` + +**エンジンパラメータ** + +- `host:port` — MongoDB サーバーのアドレス。 + +- `database` — リモートデータベース名。 + +- `collection` — リモートコレクション名。 + +- `user` — MongoDB ユーザー。 + +- `password` — ユーザーパスワード。 + +- `options` — MongoDB 接続文字列オプション(省略可能なパラメータ)。 + +:::tip +MongoDB Atlas クラウド提供の接続 URL は 'Atlas SQL' オプションから取得できます。シードリスト(`mongodb**+srv**`)はまだサポートされていませんが、将来のリリースで追加される予定です。 +::: + +また、URI を簡単に渡すこともできます: + +``` sql +ENGINE = MongoDB(uri, collection); +``` + +**エンジンパラメータ** + +- `uri` — MongoDB サーバーの接続 URI + +- `collection` — リモートコレクション名。 + +## 型のマッピング + +| MongoDB | ClickHouse | +|--------------------|-----------------------------------------------------------------------| +| bool, int32, int64 | *任意の数値型*, String | +| double | Float64, String | +| date | Date, Date32, DateTime, DateTime64, String | +| string | String, UUID | +| document | String(as JSON) | +| array | Array, String(as JSON) | +| oid | String | +| binary | カラムにある場合は String、配列やドキュメントにある場合は base64 エンコードされた String| +| *その他* | String | + +キーが MongoDB ドキュメントに存在しない場合(例えば、カラム名が一致しない場合)、デフォルト値または `NULL`(カラムが nullable の場合)が挿入されます。 + +## サポートされている句 + +単純な式のクエリのみがサポートされています(例:`WHERE field = ORDER BY field2 LIMIT `)。こうした式は MongoDB クエリ言語に変換され、サーバー側で実行されます。 +これらの制限をすべて無効にしたい場合は、[mongodb_throw_on_unsupported_query](../../../operations/settings/settings.md#mongodb_throw_on_unsupported_query)を使用してください。その場合、ClickHouse はベストエフォートでクエリを変換しようとしますが、フルテーブルスキャンや ClickHouse 側での処理につながる可能性があります。 + +:::note +リテラルの型を明示的に指定した方が良いです。これは Mongo が厳密型のフィルターを要求するためです。\ +例えば `Date` でフィルターしたい場合: + +```sql +SELECT * FROM mongo_table WHERE date = '2024-01-01' +``` + +これは機能しません。なぜなら Mongo は文字列を `Date` にキャストしないためです。したがって、手動でキャストする必要があります: + +```sql +SELECT * FROM mongo_table WHERE date = '2024-01-01'::Date OR date = toDate('2024-01-01') +``` + +これは `Date`、`Date32`、`DateTime`、`Bool`、`UUID` に適用されます。 + +::: + +## 使用例 {#usage-example} + +MongoDB に [sample_mflix](https://www.mongodb.com/docs/atlas/sample-data/sample-mflix) データセットがロードされていると仮定します。 + +MongoDB コレクションからデータを読み取れる ClickHouse でテーブルを作成します: + +``` sql +CREATE TABLE sample_mflix_table +( + _id String, + title String, + plot String, + genres Array(String), + directors Array(String), + writers Array(String), + released Date, + imdb String, + year String, +) ENGINE = MongoDB('mongodb://:@atlas-sql-6634be87cefd3876070caf96-98lxs.a.query.mongodb.net/sample_mflix?ssl=true&authSource=admin', 'movies'); +``` + +クエリ: + +``` sql +SELECT count() FROM sample_mflix_table +``` + +``` text + ┌─count()─┐ +1. │ 21349 │ + └─────────┘ +``` + +```SQL +-- JSONExtractString は MongoDB にはプッシュダウンできません +SET mongodb_throw_on_unsupported_query = 0; + +-- 評価が 7.5 を超える 'Back to the Future' シリーズの続編を見つける +SELECT title, plot, genres, directors, released FROM sample_mflix_table +WHERE title IN ('Back to the Future', 'Back to the Future Part II', 'Back to the Future Part III') + AND toFloat32(JSONExtractString(imdb, 'rating')) > 7.5 +ORDER BY year +FORMAT Vertical; +``` + +```text +Row 1: +────── +title: Back to the Future +plot: A young man is accidentally sent 30 years into the past in a time-traveling DeLorean invented by his friend, Dr. Emmett Brown, and must make sure his high-school-age parents unite in order to save his own existence. +genres: ['Adventure','Comedy','Sci-Fi'] +directors: ['Robert Zemeckis'] +released: 1985-07-03 + +Row 2: +────── +title: Back to the Future Part II +plot: After visiting 2015, Marty McFly must repeat his visit to 1955 to prevent disastrous changes to 1985... without interfering with his first trip. +genres: ['Action','Adventure','Comedy'] +directors: ['Robert Zemeckis'] +released: 1989-11-22 +``` + +```SQL +-- Cormac McCarthy の本に基づいたトップ3の映画を探す +SELECT title, toFloat32(JSONExtractString(imdb, 'rating')) as rating +FROM sample_mflix_table +WHERE arrayExists(x -> x like 'Cormac McCarthy%', writers) +ORDER BY rating DESC +LIMIT 3; +``` + +```text + ┌─title──────────────────┬─rating─┐ +1. │ No Country for Old Men │ 8.1 │ +2. │ The Sunset Limited │ 7.4 │ +3. │ The Road │ 7.3 │ + └────────────────────────┴────────┘ +``` + +## トラブルシューティング +DEBUG レベルのログで生成された MongoDB クエリを見ることができます。 + +実装の詳細は [mongocxx](https://github.com/mongodb/mongo-cxx-driver) および [mongoc](https://github.com/mongodb/mongo-c-driver) のドキュメントに記載されています。 diff --git a/docs/ja/engines/table-engines/integrations/mysql.md b/docs/ja/engines/table-engines/integrations/mysql.md new file mode 100644 index 00000000000..4b7a8a5c44e --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/mysql.md @@ -0,0 +1,198 @@ +--- +slug: /ja/engines/table-engines/integrations/mysql +sidebar_position: 138 +sidebar_label: MySQL +--- + +# MySQL テーブルエンジン + +MySQL エンジンを使用すると、リモートの MySQL サーバーに保存されているデータに対して `SELECT` および `INSERT` クエリを実行することができます。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], + ... +) ENGINE = MySQL({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]}) +SETTINGS + [ connection_pool_size=16, ] + [ connection_max_tries=3, ] + [ connection_wait_timeout=5, ] + [ connection_auto_close=true, ] + [ connect_timeout=10, ] + [ read_write_timeout=300 ] +; +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query) クエリの詳細な説明を参照してください。 + +テーブル構造は元の MySQL テーブル構造と異なる場合があります: + +- カラム名は元の MySQL テーブルと同じでなければなりませんが、これらのカラムの一部しか使用しないことができ、順序も任意です。 +- カラムタイプは元の MySQL テーブルのものと異なる場合があります。ClickHouse は値を ClickHouse のデータタイプに[キャスト](../../../engines/database-engines/mysql.md#data_types-support)しようとします。 +- [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls) 設定は Nullable カラムの処理方法を定義します。デフォルト値: 1。0の場合、テーブル関数は Nullable カラムを作成せず、null の代わりにデフォルト値を挿入します。これは配列内の NULL 値にも適用されます。 + +:::note +MySQL テーブルエンジンは、現在 MacOS 用の ClickHouse ビルドでは利用できません([issue](https://github.com/ClickHouse/ClickHouse/issues/21191)) +::: + +**エンジンパラメータ** + +- `host:port` — MySQL サーバーのアドレス。 +- `database` — リモートデータベース名。 +- `table` — リモートテーブル名。 +- `user` — MySQL ユーザー。 +- `password` — ユーザーパスワード。 +- `replace_query` — `INSERT INTO` クエリを `REPLACE INTO` クエリに変換するフラグ。`replace_query=1` の場合、クエリが置き換えられます。 +- `on_duplicate_clause` — `INSERT` クエリに追加される `ON DUPLICATE KEY on_duplicate_clause` 式。例: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1` で、`on_duplicate_clause` は `UPDATE c2 = c2 + 1` です。`ON DUPLICATE KEY` 句で使用可能な `on_duplicate_clause` については [MySQL のドキュメント](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html)をご覧ください。`on_duplicate_clause` を指定するには、`replace_query` パラメータに `0` を渡す必要があります。`replace_query = 1` と `on_duplicate_clause` の両方を同時に渡すと、ClickHouse は例外を生成します。 + +引数は[名前付きコレクション](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`host` と `port` は別々に指定する必要があります。このアプローチは本番環境で推奨されます。 + +`=, !=, >, >=, <, <=` のようなシンプルな `WHERE` 条件は MySQL サーバー上で実行されます。 + +残りの条件と `LIMIT` サンプリング制約は、MySQL へのクエリが完了した後に ClickHouse でのみ実行されます。 + +複数のレプリカをサポートしており、`|` でリストする必要があります。例えば: + +```sql +CREATE TABLE test_replicas (id UInt32, name String, age UInt32, money UInt32) ENGINE = MySQL(`mysql{2|3|4}:3306`, 'clickhouse', 'test_replicas', 'root', 'clickhouse'); +``` + +## 使用例 {#usage-example} + +MySQL でテーブルを作成: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++------+----------+-----+----------+ +| int_id | int_nullable | float | float_nullable | ++------+----------+-----+----------+ +| 1 | NULL | 2 | NULL | ++------+----------+-----+----------+ +1 row in set (0,00 sec) +``` + +ClickHouse で引数を使ってテーブルを作成: + +``` sql +CREATE TABLE mysql_table +( + `float_nullable` Nullable(Float32), + `int_id` Int32 +) +ENGINE = MySQL('localhost:3306', 'test', 'test', 'bayonet', '123') +``` + +または[名前付きコレクション](/docs/ja/operations/named-collections.md)を使用: + +```sql +CREATE NAMED COLLECTION creds AS + host = 'localhost', + port = 3306, + database = 'test', + user = 'bayonet', + password = '123'; +CREATE TABLE mysql_table +( + `float_nullable` Nullable(Float32), + `int_id` Int32 +) +ENGINE = MySQL(creds, table='test') +``` + +MySQL テーブルからデータを取得: + +``` sql +SELECT * FROM mysql_table +``` + +``` text +┌─float_nullable─┬─int_id─┐ +│ ᴺᵁᴸᴸ │ 1 │ +└────────────────┴────────┘ +``` + +## 設定 {#mysql-settings} + +デフォルト設定は非常に効率的ではなく、接続を再利用することすらしません。これらの設定により、サーバーによって実行されるクエリ数を秒単位で増やすことができます。 + +### connection_auto_close {#connection-auto-close} + +クエリ実行後に接続を自動的にクローズし、接続の再利用を無効にすることを許可します。 + +可能な値: + +- 1 — 自動クローズ接続が許可されているため、接続の再利用は無効です +- 0 — 自動クローズ接続は許可されていないため、接続の再利用は有効です + +デフォルト値: `1`。 + +### connection_max_tries {#connection-max-tries} + +フォールオーバー付きプールの再試行回数を設定します。 + +可能な値: + +- 正の整数。 +- 0 — フォールオーバー付きプールの再試行はありません。 + +デフォルト値: `3`。 + +### connection_pool_size {#connection-pool-size} + +接続プールのサイズ (すべての接続が使用中の場合、クエリは接続が解放されるまで待機します)。 + +可能な値: + +- 正の整数。 + +デフォルト値: `16`。 + +### connection_wait_timeout {#connection-wait-timeout} + +空き接続を待つためのタイムアウト(秒単位)(すでに connection_pool_size のアクティブな接続がある場合)、0 - 待機しない。 + +可能な値: + +- 正の整数。 + +デフォルト値: `5`。 + +### connect_timeout {#connect-timeout} + +接続タイムアウト(秒単位)。 + +可能な値: + +- 正の整数。 + +デフォルト値: `10`。 + +### read_write_timeout {#read-write-timeout} + +読み取り/書き込みタイムアウト(秒単位)。 + +可能な値: + +- 正の整数。 + +デフォルト値: `300`。 + +## 関連項目 {#see-also} + +- [mysql テーブル関数](../../../sql-reference/table-functions/mysql.md) +- [Dictionary ソースとして MySQL を使用](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) diff --git a/docs/ja/engines/table-engines/integrations/nats.md b/docs/ja/engines/table-engines/integrations/nats.md new file mode 100644 index 00000000000..6f5be8e4688 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/nats.md @@ -0,0 +1,183 @@ +--- +slug: /ja/engines/table-engines/integrations/nats +sidebar_position: 140 +sidebar_label: NATS +--- + +# NATS エンジン {#redisstreams-engine} + +このエンジンを使用すると、ClickHouseを[NATS](https://nats.io/)と統合できます。 + +`NATS` は以下を可能にします: + +- メッセージのサブジェクトを発行したり、購読したりします。 +- 新しいメッセージを利用可能になると処理します。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = NATS SETTINGS + nats_url = 'host:port', + nats_subjects = 'subject1,subject2,...', + nats_format = 'data_format'[,] + [nats_schema = '',] + [nats_num_consumers = N,] + [nats_queue_group = 'group_name',] + [nats_secure = false,] + [nats_max_reconnect = N,] + [nats_reconnect_wait = N,] + [nats_server_list = 'host1:port1,host2:port2,...',] + [nats_skip_broken_messages = N,] + [nats_max_block_size = N,] + [nats_flush_interval_ms = N,] + [nats_username = 'user',] + [nats_password = 'password',] + [nats_token = 'clickhouse',] + [nats_credential_file = '/var/nats_credentials',] + [nats_startup_connect_tries = '5'] + [nats_max_rows_per_message = 1,] + [nats_handle_error_mode = 'default'] +``` + +必須パラメータ: + +- `nats_url` – ホストとポート (例: `localhost:5672`). +- `nats_subjects` – NATS テーブルがサブスクライブ/発行するサブジェクトのリスト。`foo.*.bar`や`baz.>`のようなワイルドカードサブジェクトをサポートします。 +- `nats_format` – メッセージフォーマット。SQL の `FORMAT` 関数の同じ表記を使用し、`JSONEachRow` などがあります。詳細については、[フォーマット](../../../interfaces/formats.md)セクションを参照してください。 + +オプションのパラメータ: + +- `nats_schema` – フォーマットがスキーマの定義を必要とする場合に使用するパラメータ。例えば、[Cap’n Proto](https://capnproto.org/) はスキーマファイルのパスとルート `schema.capnp:Message` オブジェクトの名前を必要とします。 +- `nats_num_consumers` – テーブルごとのコンシューマーの数。デフォルト: `1`。1つのコンシューマーのスループットが不十分な場合は、より多くのコンシューマーを指定します。 +- `nats_queue_group` – NATS サブスクライバーのキューグループ名。デフォルトはテーブル名です。 +- `nats_max_reconnect` – NATSへの接続1回あたりの再接続試行の最大回数。デフォルト: `5`。 +- `nats_reconnect_wait` – 再接続試行間に睡眠する時間 (ミリ秒)。デフォルト: `5000`。 +- `nats_server_list` - 接続するためのサーバーリスト。NATSクラスターへの接続に指定することができます。 +- `nats_skip_broken_messages` - シャード内のスキーマ非互換メッセージに対する NATS メッセージパーサーの許容度。デフォルト: `0`。`nats_skip_broken_messages = N`の場合、解析できない*N*件のNATSメッセージをスキップします (メッセージはデータの行に相当します)。 +- `nats_max_block_size` - NATSからデータをフラッシュするためのポール(s)で収集された行の数。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 +- `nats_flush_interval_ms` - NATSから読み取ったデータをフラッシュするためのタイムアウト。デフォルト: [stream_flush_interval_ms](../../../operations/settings/settings.md#stream-flush-interval-ms)。 +- `nats_username` - NATS ユーザー名。 +- `nats_password` - NATS パスワード。 +- `nats_token` - NATS認証トークン。 +- `nats_credential_file` - NATS認証情報ファイルのパス。 +- `nats_startup_connect_tries` - 起動時の接続試行回数。デフォルト: `5`。 +- `nats_max_rows_per_message` — 行ベースのフォーマットで1つのNATSメッセージに書き込む最大行数。(デフォルト : `1`)。 +- `nats_handle_error_mode` — NATSエンジンのエラー処理方法。可能な値: default (メッセージの解析に失敗した場合に例外がスローされます)、stream (例外メッセージと生のメッセージが仮想カラム `_error` と `_raw_message` に保存されます)。 + +SSL接続: + +安全な接続には `nats_secure = 1` を使用します。 +使用されるライブラリのデフォルトの動作では、作成されたTLS接続が十分に安全であるかどうかをチェックしません。期限切れ、自署名、欠落、または無効な証明書であっても、接続は単に許可されます。証明書のより厳密なチェックは、将来的に実装できる可能性があります。 + +NATSテーブルへの書き込み: + +テーブルが1つのサブジェクトからしか読み取らない場合、任意の挿入は同じサブジェクトに公開されます。 +ただし、テーブルが複数のサブジェクトから読み取る場合、どのサブジェクトに公開するかを指定する必要があります。 +そのため、複数のサブジェクトを持つテーブルに挿入する際は、`stream_like_engine_insert_queue`の設定が必要です。 +テーブルが読み取るサブジェクトの1つを選択し、そこにデータを公開できます。例えば: + +``` sql + CREATE TABLE queue ( + key UInt64, + value UInt64 + ) ENGINE = NATS + SETTINGS nats_url = 'localhost:4444', + nats_subjects = 'subject1,subject2', + nats_format = 'JSONEachRow'; + + INSERT INTO queue + SETTINGS stream_like_engine_insert_queue = 'subject2' + VALUES (1, 1); +``` + +また、nats関連の設定と共にフォーマット設定を追加することも可能です。 + +例: + +``` sql + CREATE TABLE queue ( + key UInt64, + value UInt64, + date DateTime + ) ENGINE = NATS + SETTINGS nats_url = 'localhost:4444', + nats_subjects = 'subject1', + nats_format = 'JSONEachRow', + date_time_input_format = 'best_effort'; +``` + +NATSサーバーの設定は、ClickHouseの設定ファイルを使用して追加できます。 +特に、NATSエンジン用のRedisパスワードを追加できます: + +``` xml + + click + house + clickhouse + +``` + +## 説明 {#description} + +`SELECT` はメッセージを読み取るために特に有用ではありません(デバッグを除く)、なぜなら各メッセージは一度だけ読み取れます。実際には、[Materialized View](../../../sql-reference/statements/create/view.md)を使用してリアルタイムのスレッドを作成する方が実用的です。これを行うには: + +1. エンジンを使用してNATSコンシューマーを作成し、データストリームと見なします。 +2. 望む構造を持つテーブルを作成します。 +3. エンジンからデータを変換し、事前に作成したテーブルに格納するMaterialized Viewを作成します。 + +`MATERIALIZED VIEW` がエンジンに接続されると、バックグラウンドでデータを収集し始めます。これにより、NATSからメッセージを継続的に受信し、`SELECT` を使用して要求されるフォーマットに変換できます。 +1つのNATS テーブルには好きなだけ多くのMaterialized Viewを持たせることができ、これらはテーブルから直接データを読み取るのではなく、新しいレコード(ブロック単位)を受信します。このようにして異なる詳細レベルで(集約を伴う集計や集計なしで)複数のテーブルに書き込むことができます。 + +例: + +``` sql + CREATE TABLE queue ( + key UInt64, + value UInt64 + ) ENGINE = NATS + SETTINGS nats_url = 'localhost:4444', + nats_subjects = 'subject1', + nats_format = 'JSONEachRow', + date_time_input_format = 'best_effort'; + + CREATE TABLE daily (key UInt64, value UInt64) + ENGINE = MergeTree() ORDER BY key; + + CREATE MATERIALIZED VIEW consumer TO daily + AS SELECT key, value FROM queue; + + SELECT key, value FROM daily ORDER BY key; +``` + +ストリームデータの受信を止めたり、変換ロジックを変更したりするには、Materialized Viewをデタッチします: + +``` sql + DETACH TABLE consumer; + ATTACH TABLE consumer; +``` + +ターゲットテーブルを`ALTER`を使って変更したい場合は、ターゲットテーブルとビューからのデータ間の不一致を避けるために、マテリアルビューを無効にすることをお勧めします。 + +## 仮想カラム {#virtual-columns} + +- `_subject` - NATS メッセージのサブジェクト。データ型: `String`. + +`nats_handle_error_mode='stream'`の場合の追加仮想カラム: + +- `_raw_message` - 解析に失敗した生メッセージ。データ型: `Nullable(String)`。 +- `_error` - 解析に失敗したときの例外メッセージ。データ型: `Nullable(String)`。 + +注意: `_raw_message`と`_error`仮想カラムは、解析中に例外が発生した場合のみ埋められ、メッセージが正常に解析された場合は常に`NULL`です。 + +## データフォーマットのサポート {#data-formats-support} + +NATS エンジンは、ClickHouseでサポートされているすべての[フォーマット](../../../interfaces/formats.md)をサポートしています。 +1つのNATSメッセージ内の行数は、フォーマットが行ベースかブロックベースかによって異なります: + +- 行ベースのフォーマットの場合、1つのNATSメッセージ内の行数は、`nats_max_rows_per_message`設定で制御できます。 +- ブロックベースのフォーマットの場合、ブロックを小さな部分に分割することはできませんが、1つのブロック内の行数は、一般設定の[max_block_size](../../../operations/settings/settings.md#setting-max_block_size)で制御できます。 diff --git a/docs/ja/engines/table-engines/integrations/odbc.md b/docs/ja/engines/table-engines/integrations/odbc.md new file mode 100644 index 00000000000..3512283a8de --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/odbc.md @@ -0,0 +1,135 @@ +--- + +slug: /ja/engines/table-engines/integrations/odbc +sidebar_position: 150 +sidebar_label: ODBC + +--- + +# ODBC + +ClickHouseが[ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity)を介して外部データベースに接続できるようにします。 + +ODBC接続を安全に実装するために、ClickHouseは別のプログラム`clickhouse-odbc-bridge`を使用します。もしODBCドライバが`clickhouse-server`から直接ロードされた場合、ドライバの問題がClickHouseサーバをクラッシュさせる可能性があります。ClickHouseは必要に応じて`clickhouse-odbc-bridge`を自動的に開始します。ODBCブリッジプログラムは、`clickhouse-server`と同じパッケージからインストールされます。 + +このエンジンは[Nullable](../../../sql-reference/data-types/nullable.md)データ型をサポートします。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1], + name2 [type2], + ... +) +ENGINE = ODBC(connection_settings, external_database, external_table) +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query)クエリの詳細な説明を参照してください。 + +テーブル構造はソーステーブル構造と異なる可能性があります: + +- カラム名はソーステーブルと同じである必要がありますが、これらのカラムの一部だけを任意の順序で使用することができます。 +- カラムタイプはソーステーブルと異なる場合があります。ClickHouseは値をClickHouseデータ型に[キャスト](../../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast)しようとします。 +- [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls)設定はNullableカラムの処理方法を定義します。デフォルト値: 1。0の場合、テーブル関数はNullableカラムを作成せず、nullの代わりにデフォルト値を挿入します。これは配列内のNULL値にも適用されます。 + +**エンジンパラメータ** + +- `connection_settings` — `odbc.ini`ファイルの接続設定を含むセクションの名前。 +- `external_database` — 外部DBMS内のデータベース名。 +- `external_table` — `external_database`内のテーブル名。 + +## 使用例 {#usage-example} + +**ODBCを介してローカルMySQLインストールからデータを取得する** + +この例はUbuntu Linux 18.04およびMySQLサーバ5.7で確認されています。 + +unixODBCとMySQL Connectorがインストールされていることを確認します。 + +デフォルトでは(パッケージからインストールされた場合)、ClickHouseはユーザ`clickhouse`として開始されます。そのため、MySQLサーバでこのユーザを作成して設定する必要があります。 + +``` bash +$ sudo mysql +``` + +``` sql +mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse'; +mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'localhost' WITH GRANT OPTION; +``` + +その後、`/etc/odbc.ini`で接続を設定します。 + +``` bash +$ cat /etc/odbc.ini +[mysqlconn] +DRIVER = /usr/local/lib/libmyodbc5w.so +SERVER = 127.0.0.1 +PORT = 3306 +DATABASE = test +USER = clickhouse +PASSWORD = clickhouse +``` + +unixODBCインストールの`isql`ユーティリティを使って接続を確認できます。 + +``` bash +$ isql -v mysqlconn ++-------------------------+ +| Connected! | +| | +... +``` + +MySQLのテーブル: + +``` text +mysql> CREATE DATABASE test; +Query OK, 1 row affected (0,01 sec) + +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test.test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test.test; ++------+-------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++------+-------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++------+-------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +MySQLテーブルからデータを取得するClickHouseのテーブル: + +``` sql +CREATE TABLE odbc_t +( + `int_id` Int32, + `float_nullable` Nullable(Float32) +) +ENGINE = ODBC('DSN=mysqlconn', 'test', 'test') +``` + +``` sql +SELECT * FROM odbc_t +``` + +``` text +┌─int_id─┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└────────┴────────────────┘ +``` + +## 参照 {#see-also} + +- [ODBC dictionaries](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) +- [ODBC table function](../../../sql-reference/table-functions/odbc.md) diff --git a/docs/ja/engines/table-engines/integrations/postgresql.md b/docs/ja/engines/table-engines/integrations/postgresql.md new file mode 100644 index 00000000000..e0c22adfc93 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/postgresql.md @@ -0,0 +1,225 @@ +--- +slug: /ja/engines/table-engines/integrations/postgresql +title: PostgreSQL テーブルエンジン +sidebar_position: 160 +sidebar_label: PostgreSQL +--- + +PostgreSQLエンジンを使用すると、リモートのPostgreSQLサーバーに保存されているデータに対して`SELECT`および`INSERT`クエリを実行できます。 + +:::note +現在、PostgreSQLバージョン12以上のみがサポートされています。 +::: + +:::note Postgresデータのレプリケーションまたは移行にPeerDBを使用する +> Postgresテーブルエンジンに加えて、ClickHouseによる[PeerDB](https://docs.peerdb.io/introduction)を使用して、PostgresからClickHouseへの継続的なデータパイプラインを設定できます。PeerDBは、変化データキャプチャ(CDC)を使用してPostgresからClickHouseにデータをレプリケートするために設計されたツールです。 +::: + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 type1 [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 type2 [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], + ... +) ENGINE = PostgreSQL({host:port, database, table, user, password[, schema, [, on_conflict]] | named_collection[, option=value [,..]]}) +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query) クエリの詳細な説明を参照してください。 + +テーブル構造は、オリジナルのPostgreSQLテーブル構造と異なる場合があります: + +- カラム名はオリジナルのPostgreSQLテーブルと同じである必要がありますが、これらのカラムの一部を任意の順序で使用できます。 +- カラムタイプは、オリジナルのPostgreSQLテーブルのタイプと異なる場合があります。ClickHouseは値をClickHouseデータタイプに[キャスト](../../../engines/database-engines/postgresql.md#data_types-support)しようとします。 +- [external_table_functions_use_nulls](../../../operations/settings/settings.md#external-table-functions-use-nulls)設定は、Nullableカラムをどのように処理するかを定義します。デフォルト値: 1。0の場合、テーブル関数はNullableカラムを作成せず、nullの代わりにデフォルト値を挿入します。これは配列内のNULL値にも適用されます。 + +**エンジンパラメータ** + +- `host:port` — PostgreSQLサーバーのアドレス。 +- `database` — リモートのデータベース名。 +- `table` — リモートのテーブル名。 +- `user` — PostgreSQLユーザー。 +- `password` — ユーザーパスワード。 +- `schema` — デフォルト以外のテーブルスキーマ。オプション。 +- `on_conflict` — 衝突解決戦略。例: `ON CONFLICT DO NOTHING`。オプション。このオプションを追加すると挿入が非効率になります。 + +プロダクション環境では[名前付きコレクション](/docs/ja/operations/named-collections.md)(バージョン21.11以降で利用可能)が推奨されます。以下は例です: + +``` + + + localhost + 5432 + postgres + **** + schema1 + + +``` + +一部のパラメータはキー値引数によって上書き可能です: +``` sql +SELECT * FROM postgresql(postgres_creds, table='table1'); +``` + +## 実装の詳細 {#implementation-details} + +PostgreSQL側の`SELECT`クエリは、読み取り専用のPostgreSQLトランザクション内で`COPY (SELECT ...) TO STDOUT`として実行され、各`SELECT`クエリの後にコミットされます。 + +`=`, `!=`, `>`, `>=`, `<`, `<=`, `IN`のような単純な`WHERE`句はPostgreSQLサーバーで実行されます。 + +すべての結合、集計、並べ替え、`IN [ array ]`条件、および`LIMIT`サンプリング制約は、PostgreSQLへのクエリが終了した後にのみClickHouseで実行されます。 + +PostgreSQL側の`INSERT`クエリは、各`INSERT`ステートメントの後に自動コミットされるPostgreSQLトランザクション内で`COPY "table_name" (field1, field2, ... fieldN) FROM STDIN`として実行されます。 + +PostgreSQLの`Array`型はClickHouseの配列に変換されます。 + +:::note +注意 - PostgreSQLでは、`type_name[]`のように作成された配列データは、同じカラム内の異なるテーブル行に異なる次元の多次元配列を含むことがあります。しかしClickHouseでは、同じカラム内のすべてのテーブル行に同じ次元数の多次元配列を持つことのみが許可されています。 +::: + +複数のレプリカをサポートしており、`|`でリストする必要があります。例: + +```sql +CREATE TABLE test_replicas (id UInt32, name String) ENGINE = PostgreSQL(`postgres{2|3|4}:5432`, 'clickhouse', 'test_replicas', 'postgres', 'mysecretpassword'); +``` + +PostgreSQL Dictionary ソース用のレプリカプライオリティがサポートされています。マップ内の数字が大きいほど優先順位は低く、最高優先順位は`0`です。 + +以下の例では、レプリカ`example01-1`が最高優先順位を持っています: + +```xml + + 5432 + clickhouse + qwerty + + example01-1 + 1 + + + example01-2 + 2 + + db_name + table_name
+ id=10 + SQL_QUERY +
+ +``` + +## 使用例 {#usage-example} + +### PostgreSQLのテーブル + +``` text +postgres=# CREATE TABLE "public"."test" ( +"int_id" SERIAL, +"int_nullable" INT NULL DEFAULT NULL, +"float" FLOAT NOT NULL, +"str" VARCHAR(100) NOT NULL DEFAULT '', +"float_nullable" FLOAT NULL DEFAULT NULL, +PRIMARY KEY (int_id)); + +CREATE TABLE + +postgres=# INSERT INTO test (int_id, str, "float") VALUES (1,'test',2); +INSERT 0 1 + +postgresql> SELECT * FROM test; + int_id | int_nullable | float | str | float_nullable + --------+--------------+-------+------+---------------- + 1 | | 2 | test | + (1 row) +``` + +### ClickHouseでのテーブル作成と上記で作成したPostgreSQLテーブルへの接続 + +この例では、[PostgreSQLテーブルエンジン](/docs/ja/engines/table-engines/integrations/postgresql.md)を使用して、ClickHouseテーブルをPostgreSQLテーブルに接続し、PostgreSQLデータベースに対して`SELECT`と`INSERT`の両方のステートメントを使用します: + +``` sql +CREATE TABLE default.postgresql_table +( + `float_nullable` Nullable(Float32), + `str` String, + `int_id` Int32 +) +ENGINE = PostgreSQL('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); +``` + +### SELECTクエリを使用してPostgreSQLテーブルからClickHouseテーブルに初期データを挿入 + +[postgresqlテーブル関数](/docs/ja/sql-reference/table-functions/postgresql.md)は、PostgreSQLからClickHouseへのデータをコピーし、ClickHouseでクエリを実行または分析を行うことでデータのクエリパフォーマンスを向上させるか、PostgreSQLからClickHouseへのデータ移行に使用されます。ここではPostgreSQLからClickHouseへデータをコピーするので、ClickHouseではMergeTreeテーブルエンジンを使用し、postgresql_copyと呼びます: + +``` sql +CREATE TABLE default.postgresql_copy +( + `float_nullable` Nullable(Float32), + `str` String, + `int_id` Int32 +) +ENGINE = MergeTree +ORDER BY (int_id); +``` + +``` sql +INSERT INTO default.postgresql_copy +SELECT * FROM postgresql('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); +``` + +### PostgreSQLテーブルからClickHouseテーブルへの増分データの挿入 + +初回の挿入後にPostgreSQLテーブルとClickHouseテーブルの間で継続的な同期を行う場合、ClickHouseでWHERE句を使用して、タイムスタンプまたはユニークなシーケンスIDに基づいてPostgreSQLに追加されたデータのみを挿入できます。 + +これは以前に追加された最大のIDまたはタイムスタンプを追跡するといった作業を必要とします。例: + +``` sql +SELECT max(`int_id`) AS maxIntID FROM default.postgresql_copy; +``` + +その後、PostgreSQLテーブルからmaxIDより大きい値を挿入します: + +``` sql +INSERT INTO default.postgresql_copy +SELECT * FROM postgresql('localhost:5432', 'public', 'test', 'postges_user', 'postgres_password'); +WHERE int_id > maxIntID; +``` + +### ClickHouseテーブルからのデータ選択 + +``` sql +SELECT * FROM postgresql_copy WHERE str IN ('test'); +``` + +``` text +┌─float_nullable─┬─str──┬─int_id─┐ +│ ᴺᵁᴸᴸ │ test │ 1 │ +└────────────────┴──────┴────────┘ +``` + +### デフォルト以外のスキーマを使用する + +```text +postgres=# CREATE SCHEMA "nice.schema"; + +postgres=# CREATE TABLE "nice.schema"."nice.table" (a integer); + +postgres=# INSERT INTO "nice.schema"."nice.table" SELECT i FROM generate_series(0, 99) as t(i) +``` + +```sql +CREATE TABLE pg_table_schema_with_dots (a UInt32) + ENGINE PostgreSQL('localhost:5432', 'clickhouse', 'nice.table', 'postgrsql_user', 'password', 'nice.schema'); +``` + +**関連項目** + +- [`postgresql`テーブル関数](../../../sql-reference/table-functions/postgresql.md) +- [PostgreSQLをDictionaryソースとして使用する](../../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) + +## 関連コンテンツ + +- ブログ: [ClickHouse と PostgreSQL - データヘブンでの出会い - パート1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) +- ブログ: [ClickHouse と PostgreSQL - データヘブンでの出会い - パート2](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres-part-2) diff --git a/docs/ja/engines/table-engines/integrations/rabbitmq.md b/docs/ja/engines/table-engines/integrations/rabbitmq.md new file mode 100644 index 00000000000..a61c56ca1a1 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/rabbitmq.md @@ -0,0 +1,210 @@ +--- +slug: /ja/engines/table-engines/integrations/rabbitmq +sidebar_position: 170 +sidebar_label: RabbitMQ +--- + +# RabbitMQ エンジン + +このエンジンを使用すると、ClickHouse を [RabbitMQ](https://www.rabbitmq.com) と統合することができます。 + +`RabbitMQ` を使用すると、以下のことが可能になります: + +- データフローのパブリッシュまたはサブスクライブ +- ストリームが利用可能になると処理 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1], + name2 [type2], + ... +) ENGINE = RabbitMQ SETTINGS + rabbitmq_host_port = 'host:port' [or rabbitmq_address = 'amqp(s)://guest:guest@localhost/vhost'], + rabbitmq_exchange_name = 'exchange_name', + rabbitmq_format = 'data_format'[,] + [rabbitmq_exchange_type = 'exchange_type',] + [rabbitmq_routing_key_list = 'key1,key2,...',] + [rabbitmq_secure = 0,] + [rabbitmq_schema = '',] + [rabbitmq_num_consumers = N,] + [rabbitmq_num_queues = N,] + [rabbitmq_queue_base = 'queue',] + [rabbitmq_deadletter_exchange = 'dl-exchange',] + [rabbitmq_persistent = 0,] + [rabbitmq_skip_broken_messages = N,] + [rabbitmq_max_block_size = N,] + [rabbitmq_flush_interval_ms = N,] + [rabbitmq_queue_settings_list = 'x-dead-letter-exchange=my-dlx,x-max-length=10,x-overflow=reject-publish',] + [rabbitmq_queue_consume = false,] + [rabbitmq_address = '',] + [rabbitmq_vhost = '/',] + [rabbitmq_username = '',] + [rabbitmq_password = '',] + [rabbitmq_commit_on_select = false,] + [rabbitmq_max_rows_per_message = 1,] + [rabbitmq_handle_error_mode = 'default'] +``` + +必須パラメータ: + +- `rabbitmq_host_port` – ホスト:ポート(例: `localhost:5672`)。 +- `rabbitmq_exchange_name` – RabbitMQ エクスチェンジ名。 +- `rabbitmq_format` – メッセージ形式。SQL の `FORMAT` 関数の記法と同じ形式を使用し、例えば `JSONEachRow`。詳細は、[フォーマット](../../../interfaces/formats.md)セクションを参照してください。 + +任意パラメータ: + +- `rabbitmq_exchange_type` – RabbitMQ エクスチェンジの種類: `direct`, `fanout`, `topic`, `headers`, `consistent_hash`。デフォルト: `fanout`。 +- `rabbitmq_routing_key_list` – 経路指定キーのカンマ区切りリスト。 +- `rabbitmq_schema` – 形式がスキーマ定義を必要とする場合に使用するパラメータ。例えば、[Cap’n Proto](https://capnproto.org/) ではスキーマファイルへのパスとルート `schema.capnp:Message` オブジェクトの名前が必要です。 +- `rabbitmq_num_consumers` – テーブルあたりのコンシューマ数。1つのコンシューマのスループットが不十分な場合は、コンシューマ数を増やします。デフォルト: `1` +- `rabbitmq_num_queues` – キューの合計数。この数を増やすと、パフォーマンスが大幅に向上する可能性があります。デフォルト: `1`。 +- `rabbitmq_queue_base` - キュー名のヒントを指定。以下に設定の使用例を説明します。 +- `rabbitmq_deadletter_exchange` - [デッドレターエクスチェンジ](https://www.rabbitmq.com/dlx.html)の名前を指定。デッドレターエクスチェンジに再公開された場合にメッセージを収集するために、このエクスチェンジ名を持つ別のテーブルを作成できます。デフォルトではデッドレターエクスチェンジは指定されていません。 +- `rabbitmq_persistent` - 値が1(true)の場合、インサートクエリ配信モードが2に設定され(メッセージが「永続的」とマークされます)。デフォルト: `0`。 +- `rabbitmq_skip_broken_messages` – ブロックごとにスキーマ不適合のメッセージを RabbitMQ メッセージパーサが許容する数。`rabbitmq_skip_broken_messages = N` の場合、エンジンは解析できない *N* RabbitMQ メッセージをスキップします(メッセージはデータの行に相当)。デフォルト: `0`。 +- `rabbitmq_max_block_size` - RabbitMQ からデータをフラッシュする前に収集する行数。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 +- `rabbitmq_flush_interval_ms` - RabbitMQ からデータをフラッシュするタイムアウト。デフォルト: [stream_flush_interval_ms](../../../operations/settings/settings.md#stream-flush-interval-ms)。 +- `rabbitmq_queue_settings_list` - キューを作成する際に RabbitMQ 設定をセットします。利用可能な設定: `x-max-length`, `x-max-length-bytes`, `x-message-ttl`, `x-expires`, `x-priority`, `x-max-priority`, `x-overflow`, `x-dead-letter-exchange`, `x-queue-type`。キューに対して `durable` 設定が自動的に有効になります。 +- `rabbitmq_address` - 接続用アドレス。この設定か `rabbitmq_host_port` を使用します。 +- `rabbitmq_vhost` - RabbitMQ vhost。デフォルト: `'/'`。 +- `rabbitmq_queue_consume` - ユーザー定義のキューを使用し、RabbitMQのセットアップを行わない: エクスチェンジ、キュー、バインディングの宣言など。デフォルト: `false`。 +- `rabbitmq_username` - RabbitMQ ユーザー名。 +- `rabbitmq_password` - RabbitMQ パスワード。 +- `reject_unhandled_messages` - エラーの場合にメッセージを拒否(RabbitMQ に否定的な承認を送信)。この設定は `rabbitmq_queue_settings_list` に `x-dead-letter-exchange` が定義されている場合に自動的に有効になります。 +- `rabbitmq_commit_on_select` - select クエリが実行された際にメッセージをコミット。デフォルト: `false`。 +- `rabbitmq_max_rows_per_message` — 行ベースの形式に対して、一つの RabbitMQ メッセージに書き込まれる最大行数。デフォルト: `1`。 +- `rabbitmq_empty_queue_backoff_start` — RabbitMQ キューが空の場合の読み取り再スケジュールの開始バックオフポイント。 +- `rabbitmq_empty_queue_backoff_end` — RabbitMQ キューが空の場合の読み取り再スケジュールの終了バックオフポイント。 +- `rabbitmq_handle_error_mode` — RabbitMQエンジンのエラーハンドリング方法。選択可能な値: default(メッセージのパースに失敗すると例外が発生する)、stream(例外メッセージと生のメッセージが仮想カラム `_error` と `_raw_message` に保存される)。 + + * [ ] SSL 接続: + +`rabbitmq_secure = 1` または接続アドレスに `amqps` を使用: `rabbitmq_address = 'amqps://guest:guest@localhost/vhost'`。 +使用されるライブラリのデフォルト動作は、作成された TLS 接続が十分に安全であるかどうかをチェックしないことです。証明書が期限切れ、自分で署名、欠落、無効であっても、接続が許可されます。証明書のより厳格な確認は将来的に実装される可能性があります。 + +rabbitmq関連の設定と共にフォーマット設定も追加できます。 + +例: + +``` sql + CREATE TABLE queue ( + key UInt64, + value UInt64, + date DateTime + ) ENGINE = RabbitMQ SETTINGS rabbitmq_host_port = 'localhost:5672', + rabbitmq_exchange_name = 'exchange1', + rabbitmq_format = 'JSONEachRow', + rabbitmq_num_consumers = 5, + date_time_input_format = 'best_effort'; +``` + +RabbitMQ サーバー設定は ClickHouse のコンフィグファイルを使用して追加されるべきです。 + +必須コンフィグレーション: + +``` xml + + root + clickhouse + +``` + +追加コンフィグレーション: + +``` xml + + clickhouse + +``` + +## 説明 {#description} + +`SELECT` はメッセージの読み取りに特に有用ではありません(デバッグを除く)、なぜならメッセージは一度だけしか読み取ることができないからです。より実用的には、[マテリアライズドビュー](../../../sql-reference/statements/create/view.md)を使用してリアルタイムスレッドを作成します。これを行うには: + +1. エンジンを使用して RabbitMQ コンシューマを作成し、それをデータストリームとみなします。 +2. 希望の構造を持つテーブルを作成します。 +3. エンジンからデータを変換し、前述のテーブルに入れるマテリアライズドビューを作成します。 + +`MATERIALIZED VIEW` がエンジンに接続されると、バックグラウンドでデータの収集を開始します。これにより、RabbitMQ からのメッセージを継続的に受信し、`SELECT` を使用して必要な形式に変換することができます。 +1つの RabbitMQ テーブルには、いくつでもマテリアライズドビューを作ることができます。 + +データは `rabbitmq_exchange_type` と指定された `rabbitmq_routing_key_list` に基づいてチャネル化できます。 +1テーブルあたりのエクスチェンジは1つまでで、1つのエクスチェンジは複数のテーブル間で共有できます - これにより、同時に複数のテーブルへのルーティングが可能になります。 + +エクスチェンジタイプオプション: + +- `direct` - キーの正確な一致に基づくルーティング。例:テーブルのキーリスト `key1,key2,key3,key4,key5`、メッセージキーはそのいずれかに等しい可能性があります。 +- `fanout` - キーに関係なくすべてのテーブル(エクスチェンジ名が同じ)へのルーティング。 +- `topic` - ドットで区切られたキーを使用したパターンに基づくルーティング。例: `*.logs`, `records.*.*.2020`, `*.2018,*.2019,*.2020`。 +- `headers` - `key=value` の一致に基づくルーティング(`x-match=all` または `x-match=any` 設定を使用) 。例:テーブルキーリスト `x-match=all,format=logs,type=report,year=2020`。 +- `consistent_hash` - データがすべてのバインドされたテーブル間で均等に分配される(エクスチェンジ名が同じ)。注意、このエクスチェンジタイプは RabbitMQ プラグインで有効にする必要があります: `rabbitmq-plugins enable rabbitmq_consistent_hash_exchange`. + +設定 `rabbitmq_queue_base` は次の用途に使用できます: + +- 異なるテーブルにキューを共有させることで、一つのキューに複数のコンシューマを登録可能となり、より良いパフォーマンスを実現します。`rabbitmq_num_consumers` および/または `rabbitmq_num_queues` 設定を使用する場合、これらのパラメータが同じであると正確なキューの一致が達成されます。 +- すべてのメッセージが正常に消費されなかった場合に特定の永続キューから読み取りを復元するため。一つの特定のキューから消費を再開するには、その名前を `rabbitmq_queue_base` 設定にセットし、`rabbitmq_num_consumers` および `rabbitmq_num_queues` を指定しないでください(デフォルトは 1)。特定のテーブルに対して宣言されたすべてのキューからの消費を再開するには、同じ設定を指定するだけです: `rabbitmq_queue_base`, `rabbitmq_num_consumers`, `rabbitmq_num_queues`。デフォルトでは、キュー名はテーブルに対してユニークになります。 +- キューは耐久性があり、自動削除されないため再利用可能です。(RabbitMQ CLI ツールのいずれかで削除可能) + +パフォーマンス向上のために、受信したメッセージは [max_insert_block_size](../../../operations/server-configuration-parameters/settings.md#settings-max_insert_block_size) サイズのブロックにグループ化されます。ブロックが [stream_flush_interval_ms](../../../operations/server-configuration-parameters/settings.md) ミリ秒以内に形成されなかった場合、データはブロックの完全性に関係なくテーブルにフラッシュされます。 + +`rabbitmq_num_consumers` および/または `rabbitmq_num_queues` 設定が `rabbitmq_exchange_type` と共に指定された場合: + +- `rabbitmq-consistent-hash-exchange` プラグインを有効にする必要があります。 +- 公開されるメッセージの `message_id` プロパティが指定されている必要があります(各メッセージ/バッチに対してユニーク)。 + +挿入クエリには、各公開されたメッセージに追加されるメッセージメタデータがあります: `messageID` および `republished` フラグ(真の場合、再公開された場合) - メッセージヘッダーを通じてアクセス可能です。 + +挿入とマテリアライズドビューに同じテーブルを使用しないでください。 + +例: + +``` sql + CREATE TABLE queue ( + key UInt64, + value UInt64 + ) ENGINE = RabbitMQ SETTINGS rabbitmq_host_port = 'localhost:5672', + rabbitmq_exchange_name = 'exchange1', + rabbitmq_exchange_type = 'headers', + rabbitmq_routing_key_list = 'format=logs,type=report,year=2020', + rabbitmq_format = 'JSONEachRow', + rabbitmq_num_consumers = 5; + + CREATE TABLE daily (key UInt64, value UInt64) + ENGINE = MergeTree() ORDER BY key; + + CREATE MATERIALIZED VIEW consumer TO daily + AS SELECT key, value FROM queue; + + SELECT key, value FROM daily ORDER BY key; +``` + +## 仮想カラム {#virtual-columns} + +- `_exchange_name` - RabbitMQ エクスチェンジ名。データ型: `String`。 +- `_channel_id` - メッセージを受信した消費者が宣言された ChannelID。データ型: `String`。 +- `_delivery_tag` - 受信したメッセージの DeliveryTag。チャネルごとにスコープされる。データ型: `UInt64`。 +- `_redelivered` - メッセージの `redelivered` フラグ。データ型: `UInt8`。 +- `_message_id` - 受信したメッセージの messageID。設定された場合は非空。データ型: `String`。 +- `_timestamp` - 受信したメッセージのタイムスタンプ。設定された場合は非空。データ型: `UInt64`。 + +`kafka_handle_error_mode='stream'` の場合の追加仮想カラム: + +- `_raw_message` - 正しく解析されなかった生メッセージ。データ型: `Nullable(String)`。 +- `_error` - 解析の失敗時に発生した例外メッセージ。データ型: `Nullable(String)`。 + +注: `_raw_message` と `_error` 仮想カラムは、解析中の例外時にのみ埋められます。正常に解析された場合は常に `NULL` です。 + +## 注意点 {#caveats} + +[デフォルトカラム式](/docs/ja/sql-reference/statements/create/table.md/#default_values)(`DEFAULT`, `MATERIALIZED`, `ALIAS` など)をテーブル定義に指定することはできますが、それらは無視されます。代わりに、カラムはその型のデフォルト値で埋められます。 + +## データ形式サポート {#data-formats-support} + +RabbitMQ エンジンは、ClickHouse でサポートされているすべての[形式](../../../interfaces/formats.md)をサポートします。 +1つの RabbitMQ メッセージ内の行数は、形式が行ベースかブロックベースかによります: + +- 行ベースの形式の場合、1つの RabbitMQ メッセージ内の行数は `rabbitmq_max_rows_per_message` を設定することで制御できます。 +- ブロックベースの形式の場合、ブロックを小さな部分に分けることはできませんが、1ブロック内の行数は一般設定 [max_block_size](../../../operations/settings/settings.md#setting-max_block_size) で制御できます。 diff --git a/docs/ja/engines/table-engines/integrations/redis.md b/docs/ja/engines/table-engines/integrations/redis.md new file mode 100644 index 00000000000..631b251031f --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/redis.md @@ -0,0 +1,154 @@ +--- +slug: /ja/engines/table-engines/integrations/redis +sidebar_position: 175 +sidebar_label: Redis +--- + +# Redis + +このエンジンは、ClickHouseを[Redis](https://redis.io/)と統合することを可能にします。Redisはkvモデルを採用しているため、`where k=xx` や `where k in (xx, xx)` のように、特定の方法でクエリを行うことを強くお勧めします。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + name1 [type1], + name2 [type2], + ... +) ENGINE = Redis({host:port[, db_index[, password[, pool_size]]] | named_collection[, option=value [,..]] }) +PRIMARY KEY(primary_key_name); +``` + +**エンジンパラメータ** + +- `host:port` — Redisサーバーのアドレスです。ポートを無視できます。デフォルトはRedisのポート6379が使用されます。 +- `db_index` — Redisのデータベースインデックス範囲は0から15までです。デフォルトは0です。 +- `password` — ユーザーのパスワードです。デフォルトは空の文字列です。 +- `pool_size` — Redisの最大接続プールサイズです。デフォルトは16です。 +- `primary_key_name` - カラムリスト内の任意のカラム名です。 + +:::note シリアル化 +`PRIMARY KEY` は1つのカラムのみをサポートします。主キーはRedisキーとしてバイナリでシリアル化されます。 +主キー以外のカラムはRedis値として対応する順序でバイナリでシリアル化されます。 +::: + +引数は[named collections](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`host` と `port` は別々に指定する必要があります。この方法は本番環境で推奨されます。現在、Redisにnamed collectionsを使用して渡されるすべてのパラメータは必須です。 + +:::note フィルタリング +`key equals` や `in filtering` を使用したクエリは、Redisからのマルチキー検索に最適化されます。フィルタリングキーなしのクエリでは、すべてのテーブルをスキャンすることになりますが、これは重い操作です。 +::: + +## 使用例 {#usage-example} + +`Redis`エンジンを使用してClickHouseにテーブルを作成する例: + +``` sql +CREATE TABLE redis_table +( + `key` String, + `v1` UInt32, + `v2` String, + `v3` Float32 +) +ENGINE = Redis('redis1:6379') PRIMARY KEY(key); +``` + +または[named collections](/docs/ja/operations/named-collections.md)を使用する場合: + +``` + + + localhost + 6379 + **** + 16 + s0 + + +``` + +```sql +CREATE TABLE redis_table +( + `key` String, + `v1` UInt32, + `v2` String, + `v3` Float32 +) +ENGINE = Redis(redis_creds) PRIMARY KEY(key); +``` + +挿入: + +```sql +INSERT INTO redis_table Values('1', 1, '1', 1.0), ('2', 2, '2', 2.0); +``` + +クエリ: + +``` sql +SELECT COUNT(*) FROM redis_table; +``` + +``` text +┌─count()─┐ +│ 2 │ +└─────────┘ +``` + +``` sql +SELECT * FROM redis_table WHERE key='1'; +``` + +```text +┌─key─┬─v1─┬─v2─┬─v3─┐ +│ 1 │ 1 │ 1 │ 1 │ +└─────┴────┴────┴────┘ +``` + +``` sql +SELECT * FROM redis_table WHERE v1=2; +``` + +```text +┌─key─┬─v1─┬─v2─┬─v3─┐ +│ 2 │ 2 │ 2 │ 2 │ +└─────┴────┴────┴────┘ +``` + +更新: + +主キーは更新できないことに注意してください。 + +```sql +ALTER TABLE redis_table UPDATE v1=2 WHERE key='1'; +``` + +削除: + +```sql +ALTER TABLE redis_table DELETE WHERE key='1'; +``` + +削除: + +Redisデータベースを非同期的にフラッシュします。また、`Truncate`はSYNCモードをサポートしています。 + +```sql +TRUNCATE TABLE redis_table SYNC; +``` + +結合: + +他のテーブルと結合します。 + +``` +SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key; +``` + +## 制限 {#limitations} + +Redisエンジンは`where k > xx`のようなスキャンクエリもサポートしますが、いくつかの制限があります: +1. スキャンクエリは、再ハッシング中に非常に稀に重複したキーを生成する場合があります。[Redis Scan](https://github.com/redis/redis/blob/e4d183afd33e0b2e6e8d1c79a832f678a04a7886/src/dict.c#L1186-L1269)の詳細を参照してください。 +2. スキャン中にキーが作成または削除される可能性があり、結果として得られるデータセットは有効な時点を表すことができません。 diff --git a/docs/ja/engines/table-engines/integrations/s3.md b/docs/ja/engines/table-engines/integrations/s3.md new file mode 100644 index 00000000000..ecca7591669 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/s3.md @@ -0,0 +1,360 @@ +--- +slug: /ja/engines/table-engines/integrations/s3 +sidebar_position: 180 +sidebar_label: S3 +--- + +# S3 テーブルエンジン + +このエンジンは [Amazon S3](https://aws.amazon.com/s3/) エコシステムとの統合を提供します。このエンジンは [HDFS](../../../engines/table-engines/special/file.md#table_engines-hdfs) エンジンに似ていますが、S3特有の機能を提供します。 + +## 例 + +``` sql +CREATE TABLE s3_engine_table (name String, value UInt32) + ENGINE=S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'gzip') + SETTINGS input_format_with_names_use_header = 0; + +INSERT INTO s3_engine_table VALUES ('one', 1), ('two', 2), ('three', 3); + +SELECT * FROM s3_engine_table LIMIT 2; +``` + +```text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE s3_engine_table (name String, value UInt32) + ENGINE = S3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key,] format, [compression]) + [PARTITION BY expr] + [SETTINGS ...] +``` + +### エンジンのパラメータ {#parameters} + +- `path` — ファイルへのパスを含むバケットURL。以下のワイルドカードを読み取り専用モードでサポートします:`*`, `**`, `?`, `{abc,def}` および `{N..M}`(`N`, `M` は数値、 `'abc'`, `'def'` は文字列)。詳細は[下記](#wildcards-in-path)を参照してください。 +- `NOSIGN` - このキーワードがクレデンシャルの代わりに指定されている場合、すべてのリクエストは署名されません。 +- `format` — ファイルの[フォーマット](../../../interfaces/formats.md#formats)。 +- `aws_access_key_id`, `aws_secret_access_key` - [AWS](https://aws.amazon.com/) アカウントユーザーの長期クレデンシャル。これを使用してリクエストの認証が可能です。このパラメータはオプションです。クレデンシャルが指定されていない場合、設定ファイルから使用されます。詳細は[Using S3 for Data Storage](../mergetree-family/mergetree.md#table_engine-mergetree-s3)を参照してください。 +- `compression` — 圧縮タイプ。サポートされる値は `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。このパラメータはオプションで、デフォルトではファイル拡張子によって圧縮形式を自動的に検出します。 + +### データキャッシュ {#data-cache} + +`S3` テーブルエンジンはローカルディスクへのデータキャッシュをサポートします。 +ファイルシステムキャッシュの構成オプションと使用法については、この[セクション](/docs/ja/operations/storing-data.md/#using-local-cache)を参照してください。 +キャッシュはパスとストレージオブジェクトのETagに基づいて行われるため、ClickHouseは古いキャッシュバージョンを読みません。 + +キャッシュを有効にするには、設定 `filesystem_cache_name = ''` と `enable_filesystem_cache = 1` を使用してください。 + +```sql +SELECT * +FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV') +SETTINGS filesystem_cache_name = 'cache_for_s3', enable_filesystem_cache = 1; +``` + +構成ファイルでキャッシュを定義する方法は2つあります。 + +1. 次のセクションをClickHouseの構成ファイルに追加します: + +``` xml + + + + キャッシュディレクトリへのパス + 10Gi + + + +``` + +2. ClickHouseの `storage_configuration` セクションからキャッシュ構成を再利用し、キャッシュストレージを使用します。詳細は[こちら](/docs/ja/operations/storing-data.md/#using-local-cache)をご覧ください。 + +### PARTITION BY + +`PARTITION BY` — オプションです。ほとんどの場合、分割キーは必要ありませんが、必要な場合でも通常は1ヶ月単位より細かい分割キーは必要ありません。パーティショニングはクエリの高速化に寄与しません(ORDER BY 表現とは対照的に)。決して細かすぎるパーティショニングを使ってはいけません。クライアントIDや名前でデータを分割するのではなく、クライアントIDや名前を ORDER BY 表現の最初のカラムにするべきです。 + +月単位で分割するには、`toYYYYMM(date_column)` 式を使用します。ここで `date_column` は [Date](/docs/ja/sql-reference/data-types/date.md) 型の日付を持つカラムです。ここでのパーティション名は `"YYYYMM"` フォーマットです。 + +### パーティションされたデータのクエリ + +この例は、ClickHouseとMinIOを統合する[ドッカーコンポーズレシピ](https://github.com/ClickHouse/examples/tree/5fdc6ff72f4e5137e23ea075c88d3f44b0202490/docker-compose-recipes/recipes/ch-and-minio-S3)を使用します。同じクエリを使用して、エンドポイントや認証値を置き換えることで、S3を利用することができます。 + +`ENGINE` 構成のS3エンドポイントには、S3オブジェクト(ファイル名)の一部として `_partition_id` パラメータトークンを使用し、それらの結果オブジェクト名(例:`test_3.csv`)を選択します。 + +:::note +例に示されているように、現在のところパーティション化されたS3テーブルからのクエリは直接サポートされていませんが、S3テーブル関数を使用して個々のパーティションをクエリすることで達成できます。 + +主なユースケースは、S3でパーティション化されたデータを書き込むことにより、データを他の ClickHouseシステムに転送すること(例えば、オンプレミスシステムからClickHouse Cloudに移行)です。ClickHouseのデータセットは非常に大きいことが多いため、ネットワークの信頼性が欠けることもあるので、データセットを部分ごとに転送するのが合理的です。したがって、パーティション化された書き込みが役立ちます。 +::: + +#### テーブルの作成 +```sql +CREATE TABLE p +( + `column1` UInt32, + `column2` UInt32, + `column3` UInt32 +) +ENGINE = S3( +# highlight-next-line + 'http://minio:10000/clickhouse//test_{_partition_id}.csv', + 'minioadmin', + 'minioadminpassword', + 'CSV') +PARTITION BY column3 +``` + +#### データの挿入 +```sql +insert into p values (1, 2, 3), (3, 2, 1), (78, 43, 45) +``` + +#### パーティション 3 からの選択 + +:::tip +このクエリはs3テーブル関数を使用しています +::: + +```sql +SELECT * +FROM s3('http://minio:10000/clickhouse//test_3.csv', 'minioadmin', 'minioadminpassword', 'CSV') +``` +```response +┌─c1─┬─c2─┬─c3─┐ +│ 1 │ 2 │ 3 │ +└────┴────┴────┘ +``` + +#### パーティション 1 からの選択 +```sql +SELECT * +FROM s3('http://minio:10000/clickhouse//test_1.csv', 'minioadmin', 'minioadminpassword', 'CSV') +``` +```response +┌─c1─┬─c2─┬─c3─┐ +│ 3 │ 2 │ 1 │ +└────┴────┴────┘ +``` + +#### パーティション 45 からの選択 +```sql +SELECT * +FROM s3('http://minio:10000/clickhouse//test_45.csv', 'minioadmin', 'minioadminpassword', 'CSV') +``` +```response +┌─c1─┬─c2─┬─c3─┐ +│ 78 │ 43 │ 45 │ +└────┴────┴────┘ +``` + +#### 制限 + +当然 `Select * from p` を試してみたくなるかもしれませんが、前述の通り、このクエリは失敗します。前のクエリを使用してください。 + +```sql +SELECT * FROM p +``` +```response +Received exception from server (version 23.4.1): +Code: 48. DB::Exception: Received from localhost:9000. DB::Exception: Reading from a partitioned S3 storage is not implemented yet. (NOT_IMPLEMENTED) +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。型: `LowCardinalty(String)`。 +- `_file` — ファイル名。型: `LowCardinalty(String)`。 +- `_size` — ファイルのバイト単位のサイズ。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL`。 +- `_time` — ファイルの最終変更時間。型: `Nullable(DateTime)`。時間が不明な場合、値は `NULL`。 +- `_etag` — ファイルのETag。型: `LowCardinalty(String)`。ETagが不明な場合、値は `NULL`。 + +仮想カラムについての詳細は[こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns)をご覧ください。 + +## 実装の詳細 {#implementation-details} + +- 読み書きは並行して行うことが可能 +- サポートされていません: + - `ALTER` および `SELECT...SAMPLE` 操作。 + - インデックス。 + - [ゼロコピーの](../../../operations/storing-data.md#zero-copy)レプリケーションは可能ですが、サポートされていません。 + + :::note + プロダクションにはゼロコピーのレプリケーションは推奨されません + ゼロコピーのレプリケーションはClickHouseバージョン22.8以降でデフォルトで無効になっています。この機能はプロダクション環境での使用は推奨されません。 + ::: + +## パス内のワイルドカード {#wildcards-in-path} + +`path` 引数はbashのようなワイルドカードを用いて複数のファイルを指定できます。処理されるためには、ファイルが存在し、パスパターン全体に一致する必要があります。ファイルのリストは `SELECT` 時に決定されます(`CREATE` の時点ではありません)。 + +- `*` — `/` を除く任意の数の任意の文字を空文字列も含めて代替します。 +- `**` — `/` を含む任意の数の任意の文字を空文字列も含めて代替します。 +- `?` — 任意の単一の文字を代替します。 +- `{some_string,another_string,yet_another_one}` — 文字列 `'some_string', 'another_string', 'yet_another_one'` のいずれかを代替します。 +- `{N..M}` — NからMまでの範囲のいずれかの数を含む。範囲にはNとMも含まれます。NおよびMは先頭にゼロを含めることができます(例:`000..078`)。 + +`{}` を使った構造は、[remote](../../../sql-reference/table-functions/remote.md) テーブル関数に似ています。 + +:::note +ファイルのリストに先頭にゼロがある数値の範囲を含む場合、各桁ごとにかっこで構成するか、または `?` を使用してください。 +::: + +**ワイルドカードを使用した例 1** + +ファイル名が `file-000.csv`, `file-001.csv`, ... , `file-999.csv` のファイルを持つテーブルを作成します。 + +``` sql +CREATE TABLE big_table (name String, value UInt32) + ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/my_folder/file-{000..999}.csv', 'CSV'); +``` + +**ワイルドカードを使用した例 2** + +S3にはCSVフォーマットの以下のURIを持ついくつかのファイルがあるとします: + +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/some_folder/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv' + +これら6つのファイルを構成するテーブルを作成する方法は以下の通りです: + +1. ファイルの接尾辞の範囲を指定します: + +``` sql +CREATE TABLE table_with_range (name String, value UInt32) + ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_{1..3}', 'CSV'); +``` + +2. `some_file_` プレフィックスを持つすべてのファイルを取得します(両方のフォルダーにそのようなプレフィックスの余分なファイルがないことを確認してください): + +``` sql +CREATE TABLE table_with_question_mark (name String, value UInt32) + ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/some_file_?', 'CSV'); +``` + +3. 両方のフォルダ内のすべてのファイルを取得します(すべてのファイルがクエリで説明されているフォーマットとスキーマを満たす必要があります): + +``` sql +CREATE TABLE table_with_asterisk (name String, value UInt32) + ENGINE = S3('https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/{some,another}_folder/*', 'CSV'); +``` + +## ストレージ設定 {#storage-settings} + +- [s3_truncate_on_insert](/docs/ja/operations/settings/settings.md#s3_truncate_on_insert) - 挿入する前にファイルを切り詰めることを許可します。デフォルトでは無効です。 +- [s3_create_new_file_on_insert](/docs/ja/operations/settings/settings.md#s3_create_new_file_on_insert) - フォーマットに接尾辞が付いている場合、挿入ごとに新しいファイルを作成することを許可します。デフォルトでは無効です。 +- [s3_skip_empty_files](/docs/ja/operations/settings/settings.md#s3_skip_empty_files) - 読み取り中に空のファイルをスキップすることを許可します。デフォルトでは無効です。 + +## S3に関連した設定 {#settings} + +以下の設定はクエリ実行前に設定できるか、設定ファイルに配置できます。 + +- `s3_max_single_part_upload_size` — S3への単一パートアップロードを使用したオブジェクトをアップロードする際の最大サイズ。デフォルト値は `32Mb`。 +- `s3_min_upload_part_size` — [S3マルチパートアップロード](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html)中にアップロードするパートの最小サイズ。デフォルト値は `16Mb`。 +- `s3_max_redirects` — 許可されるS3リダイレクトホップの最大数。デフォルト値は `10`。 +- `s3_single_read_retries` — 単一の読み取り中の試行最大数。デフォルト値は `4`。 +- `s3_max_put_rps` — スロットリング前の1秒あたりの最大PUTリクエスト数。デフォルト値は `0` (無制限)。 +- `s3_max_put_burst` — 秒単位のリクエスト制限に達する前に同時に発行できる最大リクエスト数。デフォルトでは (`0`値) `s3_max_put_rps` に等しい。 +- `s3_max_get_rps` — スロットリング前の1秒あたりの最大GETリクエスト数。デフォルト値は `0` (無制限)。 +- `s3_max_get_burst` — 秒単位のGETリクエスト制限に達する前に同時に発行できる最大リクエスト数。デフォルトでは (`0`値) `s3_max_get_rps` に等しい。 +- `s3_upload_part_size_multiply_factor` - S3に一度に書き込みされた後に `s3_multiply_parts_count_threshold` パートがアップロードされるたびに `s3_min_upload_part_size` をこのファクターで掛け算します。デフォルト値は `2`。 +- `s3_upload_part_size_multiply_parts_count_threshold` - S3に特定の数のパートがアップロードされるたびに、`s3_min_upload_part_size` は `s3_upload_part_size_multiply_factor` で掛け算されます。デフォルト値は `500`。 +- `s3_max_inflight_parts_for_one_file` - 1つのオブジェクトのために同時に実行可能なPUTリクエストの数を制限します。制限する必要があります。値 `0` は無制限を意味します。デフォルト値は `20`。飛行中の各パートは、最初の `s3_upload_part_size_multiply_factor` パートで `s3_min_upload_part_size` のサイズでバッファを持ち、ファイルが非常に大きい場合にはより多くなります、`upload_part_size_multiply_factor` を参照してください。デフォルト設定で、アップロードされるファイルは `8G`未満の場合は `320Mb`以上を消費しません。消費はより大きなファイルにはさらに大きくなります。 + +セキュリティの考慮点: 任意のS3 URLを指定可能な悪意のあるユーザーがいた場合、`s3_max_redirects` をゼロに設定して [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) 攻撃を回避する必要があります。または、サーバー構成で `remote_host_filter` を指定する必要があります。 + +## エンドポイントベースの設定 {#endpoint-settings} + +以下の設定は、特定のエンドポイント(URLの正確なプレフィックスと一致する)に対して構成ファイルで指定できます: + +- `endpoint` — エンドポイントのプレフィックスを指定します。必須です。 +- `access_key_id` と `secret_access_key` — 特定のエンドポイントに使用するクレデンシャルを指定します。任意です。 +- `use_environment_credentials` — `true` に設定されている場合、S3クライアントは環境変数と [Amazon EC2](https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud) メタデータからクレデンシャルを取得しようとします。任意です。デフォルト値は `false`。 +- `region` — S3リージョン名を指定します。任意です。 +- `use_insecure_imds_request` — `true` に設定されている場合、S3クライアントはAmazon EC2メタデータからクレデンシャルを取得する際に不安全なIMDSリクエストを使用します。任意です。デフォルト値は `false`。 +- `expiration_window_seconds` — 期限ベースのクレデンシャルが期限切れかどうかを確認するための猶予期間。任意です。デフォルト値は `120`。 +- `no_sign_request` - すべてのクレデンシャルを無視して、リクエストが署名されないようにします。公開バケットにアクセスする際に便利です。 +- `header` — 特定のエンドポイントへのリクエストに指定されたHTTPヘッダを追加します。任意で、複数回指定できます。 +- `access_header` - 他のソースからのクレデンシャルがない場合、特定のエンドポイントへのリクエスト用に指定されたHTTPヘッダーを追加します。 +- `server_side_encryption_customer_key_base64` — 指定された場合、SSE-C暗号化でS3オブジェクトにアクセスするために必要なヘッダーがセットされます。任意です。 +- `server_side_encryption_kms_key_id` - 指定された場合、[SSE-KMS暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)されたS3オブジェクトにアクセスするために必要なヘッダーがセットされます。空の文字列が指定された場合、AWS管理のS3キーが使用されます。任意です。 +- `server_side_encryption_kms_encryption_context` - `server_side_encryption_kms_key_id` と共に指定された場合、SSE-KMSのための指定された暗号化コンテキストヘッダーがセットされます。任意です。 +- `server_side_encryption_kms_bucket_key_enabled` - `server_side_encryption_kms_key_id` と共に指定された場合、SSE-KMSのためにS3バケットキーを有効にするためのヘッダーがセットされます。オプションで、`true`または`false`を設定できます。デフォルトでは何も設定されていません(バケットレベル設定に一致)。 +- `max_single_read_retries` — 単一の読み取り中の試行最大数。デフォルト値は `4`。任意です。 +- `max_put_rps`, `max_put_burst`, `max_get_rps`, `max_get_burst` - 特定のエンドポイントに対してクエリ単位ではなく使用するスロットリング設定(上記説明参照)。任意です。 + +**例:** + +``` xml + + + https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/ + + + + + + + + + + + + + + + +``` + +## アーカイブの操作 + +S3にある以下のURIの複数のアーカイブファイルがあるとします: + +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip' +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip' +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip' + +これらのアーカイブからデータを抽出することが `::` を使用して可能です。グロブはURL部分とアーカイブ内のファイル名を担当する部分の両方で使用できます。 + +``` sql +SELECT * +FROM s3( + 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-1{0..2}.csv.zip :: *.csv' +); +``` + +:::note +ClickHouseは次の3つのアーカイブフォーマットをサポートしています: +ZIP +TAR +7Z +ZIPおよびTARアーカイブは任意のサポートされたストレージロケーションからアクセス可能ですが、7ZアーカイブはClickHouseがインストールされているローカルファイルシステムからのみ読み取ることができます。 +::: + + +## 公開バケットへのアクセス + +ClickHouseはさまざまな種類のソースからクレデンシャルを取得しようとします。 +時として、このことが、パブリックでアクセスできる一部のバケットにアクセスする際に問題を引き起こし、クライアントが `403` エラーコードを返すことがあります。 +この問題は、`NOSIGN` キーワードを使用して、クライアントがすべてのクレデンシャルを無視し、リクエストにサインをしないようにすることで回避できます。 + +``` sql +CREATE TABLE big_table (name String, value UInt32) + ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', NOSIGN, 'CSVWithNames'); +``` + +## パフォーマンスの最適化 + +s3 関数のパフォーマンス最適化に関する詳細は[詳細ガイド](/docs/ja/integrations/s3/performance)をご覧ください。 + +## 関連情報 + +- [s3 テーブル関数](../../../sql-reference/table-functions/s3.md) diff --git a/docs/ja/engines/table-engines/integrations/s3queue.md b/docs/ja/engines/table-engines/integrations/s3queue.md new file mode 100644 index 00000000000..639e6373de8 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/s3queue.md @@ -0,0 +1,365 @@ +--- +slug: /ja/engines/table-engines/integrations/s3queue +sidebar_position: 181 +sidebar_label: S3Queue +--- + +# S3Queue テーブルエンジン + +このエンジンは [Amazon S3](https://aws.amazon.com/s3/) エコシステムとの統合を提供し、ストリーミングインポートを可能にします。このエンジンは [Kafka](../../../engines/table-engines/integrations/kafka.md)、[RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) エンジンに似ていますが、S3 特有の機能を提供します。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE s3_queue_engine_table (name String, value UInt32) + ENGINE = S3Queue(path, [NOSIGN, | aws_access_key_id, aws_secret_access_key,] format, [compression]) + [SETTINGS] + [mode = '',] + [after_processing = 'keep',] + [keeper_path = '',] + [loading_retries = 0,] + [processing_threads_num = 1,] + [enable_logging_to_s3queue_log = 0,] + [polling_min_timeout_ms = 1000,] + [polling_max_timeout_ms = 10000,] + [polling_backoff_ms = 0,] + [tracked_file_ttl_sec = 0,] + [tracked_files_limit = 1000,] + [cleanup_interval_min_ms = 10000,] + [cleanup_interval_max_ms = 30000,] +``` + +:::warning +バージョン `24.7` 以前では、`mode`、`after_processing`、`keeper_path` を除くすべての設定に `s3queue_` プレフィックスを使用する必要があります。 +::: + +**エンジンパラメータ** + +`S3Queue` のパラメータは `S3` テーブルエンジンがサポートするものと同じです。詳細は[こちら](../../../engines/table-engines/integrations/s3.md#parameters)を参照してください。 + +**例** + +```sql +CREATE TABLE s3queue_engine_table (name String, value UInt32) +ENGINE=S3Queue('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*', 'CSV', 'gzip') +SETTINGS + mode = 'unordered'; +``` + +ネームドコレクションを使用する場合: + +``` xml + + + + 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/* + test + test + + + +``` + +```sql +CREATE TABLE s3queue_engine_table (name String, value UInt32) +ENGINE=S3Queue(s3queue_conf, format = 'CSV', compression_method = 'gzip') +SETTINGS + mode = 'ordered'; +``` + +## 設定 {#settings} + +テーブルに設定された設定のリストを取得するには、`system.s3_queue_settings` テーブルを使用します。`24.10` から使用可能です。 + +### mode {#mode} + +可能な値: + +- unordered — 無順序モードでは、すでに処理されたすべてのファイルのセットが ZooKeeper の持続的なノードで追跡されます。 +- ordered — 順序付きモードでは、ファイルは辞書順で処理されます。つまり、ある時点で 'BBB' という名前のファイルが処理され、後で 'AA' という名前のファイルがバケットに追加された場合、無視されます。辞書的な意味での最大の名前のファイルと、読み込みが失敗した後に再試行されるファイルの名前のみが ZooKeeper に保存されます。 + +デフォルト値:バージョン 24.6 より前は `ordered`。24.6 以降はデフォルト値がなく、手動で設定する必要があります。以前のバージョンで作成されたテーブルは、下位互換性のためにデフォルト値が `Ordered` のままとなります。 + +### after_processing {#after_processing} + +処理が成功した後にファイルを削除または保持。 + +可能な値: + +- keep. +- delete. + +デフォルト値:`keep`。 + +### keeper_path {#keeper_path} + +ZooKeeper のパスはテーブルエンジンの設定として指定するか、グローバル設定から提供されるパスとテーブル UUID からデフォルトパスを形成することができます。 + +可能な値: + +- 文字列。 + +デフォルト値:`/`。 + +### s3queue_loading_retries {#loading_retries} + +指定された回数までファイルの読み込みを再試行します。デフォルトでは再試行はありません。 + +可能な値: + +- 正の整数。 + +デフォルト値:`0`。 + +### s3queue_processing_threads_num {#processing_threads_num} + +処理を行うスレッド数を指定します。`Unordered` モードにのみ適用されます。 + +デフォルト値:`1`。 + +### s3queue_enable_logging_to_s3queue_log {#enable_logging_to_s3queue_log} + +`system.s3queue_log` へのログを有効にします。 + +デフォルト値:`0`。 + +### s3queue_polling_min_timeout_ms {#polling_min_timeout_ms} + +次回のポーリングまでの最小タイムアウト(ミリ秒単位)。 + +可能な値: + +- 正の整数。 + +デフォルト値:`1000`。 + +### s3queue_polling_max_timeout_ms {#polling_max_timeout_ms} + +次回のポーリングまでの最大タイムアウト(ミリ秒単位)。 + +可能な値: + +- 正の整数。 + +デフォルト値:`10000`。 + +### s3queue_polling_backoff_ms {#polling_backoff_ms} + +ポーリングのバックオフ(ミリ秒単位)。 + +可能な値: + +- 正の整数。 + +デフォルト値:`0`。 + +### s3queue_tracked_files_limit {#tracked_files_limit} + +「unordered」モードが使用されている場合に Zookeeper ノードの数を制限することができ、「ordered」モードでは何も行いません。制限に達した場合、ZooKeeper ノードから最も古い処理済みファイルが削除され、再処理されます。 + +可能な値: + +- 正の整数。 + +デフォルト値:`1000`。 + +### s3queue_tracked_file_ttl_sec {#tracked_file_ttl_sec} + +「unordered」モードで ZooKeeper ノードに保存される処理済みファイルを保存する秒数(デフォルトでは永久保存)、`ordered` モードの場合は何もしません。指定された秒数後、ファイルは再インポートされます。 + +可能な値: + +- 正の整数。 + +デフォルト値:`0`。 + +### s3queue_cleanup_interval_min_ms {#cleanup_interval_min_ms} + +「Ordered」モードの場合、バックグラウンドタスクの再スケジュール間隔の最小境界を定義します。このタスクは、追跡ファイルの TTL と最大追跡ファイルセットの管理を担当します。 + +デフォルト値:`10000`。 + +### s3queue_cleanup_interval_max_ms {#cleanup_interval_max_ms} + +「Ordered」モードの場合、バックグラウンドタスクの再スケジュール間隔の最大境界を定義します。このタスクは、追跡ファイルの TTL と最大追跡ファイルセットの管理を担当します。 + +デフォルト値:`30000`。 + +### s3queue_buckets {#buckets} + +「Ordered」モードの場合。バージョン `24.6` から使用可能です。S3Queue テーブルの複数のレプリカが同じメタデータディレクトリで動作している場合、`s3queue_buckets` の値は少なくともレプリカの数に等しくする必要があります。`s3queue_processing_threads` 設定が使用されている場合は、`s3queue_buckets` 設定の値をさらに大きくすることが妥当です。これは `S3Queue` 処理の実際の並行性を定義するためです。 + +## S3 関連の設定 {#s3-settings} + +エンジンはすべての S3 関連の設定をサポートしています。S3 設定に関する詳細は[こちら](../../../engines/table-engines/integrations/s3.md)を参照してください。 + +## S3Queue 順序付きモード {#ordered-mode} + +`S3Queue` の処理モードは、ZooKeeper に保存するメタデータを少なくすることができますが、時間的にあとで追加されたファイルがアルファベット順でより大きな名前を持つ必要があるという制限があります。 + +`S3Queue` の `ordered` モードでは、`unordered` モードと同様に `(s3queue_)processing_threads_num` 設定(`s3queue_` プレフィックスはオプション)をサポートしており、`S3` ファイルをサーバーでローカルに処理するスレッド数を制御できます。さらに、`ordered` モードは、`(s3queue_)buckets` という設定も導入しており、これは「論理スレッド」を意味します。つまり、複数のサーバーで `S3Queue` テーブルのレプリカがあり、この設定が処理単位の数を定義する分散シナリオでは、各 `S3Queue` レプリカの各処理スレッドが処理のために特定の `bucket` をロックしようとします。各 `bucket` はファイル名のハッシュによって特定のファイルに関連付けられます。したがって、分散シナリオでは、`(s3queue_)buckets` 設定がレプリカの数以上であることが強く推奨されます。バケットの数がレプリカの数よりも多いのは問題ありません。最も最適なシナリオは、`(s3queue_)buckets` 設定が `number_of_replicas` と `(s3queue_)processing_threads_num` の積と等しいことです。 + +バージョン `24.6` より前では `(s3queue_)processing_threads_num` 設定の使用は推奨されません。 + +バージョン `24.6` からは `(s3queue_)buckets` 設定が使用可能です。 + +## 説明 {#description} + +`SELECT` はストリーミングインポートには特に有用ではありません(デバッグを除く)ので、各ファイルは一度しかインポートできません。実際には、[マテリアライズドビュー](../../../sql-reference/statements/create/view.md)を使用してリアルタイムスレッドを作成する方が実用的です。これを行うには: + +1. S3 の指定されたパスからデータを消費するテーブルをエンジンを使って作成し、それをデータストリームと見なします。 +2. 希望する構造を持つテーブルを作成します。 +3. エンジンからデータを変換し、前に作成したテーブルにデータを投入するマテリアライズドビューを作成します。 + +`MATERIALIZED VIEW` がエンジンに結合されると、バックグラウンドでデータの収集を開始します。 + +例: + +``` sql + CREATE TABLE s3queue_engine_table (name String, value UInt32) + ENGINE=S3Queue('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/*', 'CSV', 'gzip') + SETTINGS + mode = 'unordered'; + + CREATE TABLE stats (name String, value UInt32) + ENGINE = MergeTree() ORDER BY name; + + CREATE MATERIALIZED VIEW consumer TO stats + AS SELECT name, value FROM s3queue_engine_table; + + SELECT * FROM stats ORDER BY name; +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。 +- `_file` — ファイルの名前。 + +仮想カラムの詳細は[こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns)を参照してください。 + +## パスのワイルドカード {#wildcards-in-path} + +`path` 引数は、bash のようなワイルドカードを使って複数のファイルを指定できます。処理されるには、ファイルが存在し、パスパターン全体に一致する必要があります。ファイルのリストは `SELECT` 時に決定されます(`CREATE` 時ではありません)。 + +- `*` — `/` を除く任意の文字を任意の回数置き換えます(空文字列を含む)。 +- `**` — `/` を含め、任意の文字を任意の回数置き換えます(空文字列を含む)。 +- `?` — 任意の単一の文字を置き換えます。 +- `{some_string,another_string,yet_another_one}` — 文字列 `'some_string', 'another_string', 'yet_another_one'` のいずれかを置き換えます。 +- `{N..M}` — N と M を含む範囲の任意の数字を置き換えます。N と M は先行ゼロを持つことができます(例:`000..078`)。 + +`{}` を使った構築は [remote](../../../sql-reference/table-functions/remote.md) テーブル関数と似ています。 + +## 制限事項 {#limitations} + +1. 重複した行が発生する可能性があるのは次のような場合です: + +- ファイル処理の途中で解析時に例外が発生し、`s3queue_loading_retries` によって再試行が有効になっている場合。 + +- `S3Queue` が zookeeper 内の同じパスを指す複数のサーバーで設定され、キーパーセッションが期限切れになる前に、あるサーバーが処理済みファイルをコミットするのに失敗した場合。これにより、最初のサーバーによって部分的または完全に処理された可能性のあるファイルを別のサーバーが処理する可能性があります。 + +- 異常なサーバーの終了。 + +2. `S3Queue` が zookeeper 内の同じパスを指す複数のサーバーで設定されていて、`Ordered` モードが使用されている場合、`s3queue_loading_retries` は動作しません。これはすぐに修正されます。 + +## 内部検査 {#introspection} + +内部検査には、`system.s3queue` ステートレステーブルと `system.s3queue_log` 永続テーブルを使用します。 + +1. `system.s3queue`。このテーブルは永続的ではなく、`S3Queue` のメモリ内の状態を示します:現在処理中のファイル、処理済みまたは失敗したファイル。 + +``` sql +┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE system.s3queue +( + `database` String, + `table` String, + `file_name` String, + `rows_processed` UInt64, + `status` String, + `processing_start_time` Nullable(DateTime), + `processing_end_time` Nullable(DateTime), + `ProfileEvents` Map(String, UInt64) + `exception` String +) +ENGINE = SystemS3Queue +COMMENT 'Contains in-memory state of S3Queue metadata and currently processed rows per file.' │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +例: + +``` sql + +SELECT * +FROM system.s3queue + +Row 1: +────── +zookeeper_path: /clickhouse/s3queue/25ea5621-ae8c-40c7-96d0-cec959c5ab88/3b3f66a1-9866-4c2e-ba78-b6bfa154207e +file_name: wikistat/original/pageviews-20150501-030000.gz +rows_processed: 5068534 +status: Processed +processing_start_time: 2023-10-13 13:09:48 +processing_end_time: 2023-10-13 13:10:31 +ProfileEvents: {'ZooKeeperTransactions':3,'ZooKeeperGet':2,'ZooKeeperMulti':1,'SelectedRows':5068534,'SelectedBytes':198132283,'ContextLock':1,'S3QueueSetFileProcessingMicroseconds':2480,'S3QueueSetFileProcessedMicroseconds':9985,'S3QueuePullMicroseconds':273776,'LogTest':17} +exception: +``` + +2. `system.s3queue_log`。永続的なテーブルです。`processed` および `failed` ファイルについて `system.s3queue` と同じ情報を持っています。 + +このテーブルの構造は次の通りです: + +``` sql +SHOW CREATE TABLE system.s3queue_log + +Query id: 0ad619c3-0f2a-4ee4-8b40-c73d86e04314 + +┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE system.s3queue_log +( + `event_date` Date, + `event_time` DateTime, + `table_uuid` String, + `file_name` String, + `rows_processed` UInt64, + `status` Enum8('Processed' = 0, 'Failed' = 1), + `processing_start_time` Nullable(DateTime), + `processing_end_time` Nullable(DateTime), + `ProfileEvents` Map(String, UInt64), + `exception` String +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(event_date) +ORDER BY (event_date, event_time) +SETTINGS index_granularity = 8192 │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +`system.s3queue_log` を利用するためには、サーバーの構成ファイルにその設定を定義します: + +``` xml + + system + s3queue_log
+
+``` + +例: + +``` sql +SELECT * +FROM system.s3queue_log + +Row 1: +────── +event_date: 2023-10-13 +event_time: 2023-10-13 13:10:12 +table_uuid: +file_name: wikistat/original/pageviews-20150501-020000.gz +rows_processed: 5112621 +status: Processed +processing_start_time: 2023-10-13 13:09:48 +processing_end_time: 2023-10-13 13:10:12 +ProfileEvents: {'ZooKeeperTransactions':3,'ZooKeeperGet':2,'ZooKeeperMulti':1,'SelectedRows':5112621,'SelectedBytes':198577687,'ContextLock':1,'S3QueueSetFileProcessingMicroseconds':1934,'S3QueueSetFileProcessedMicroseconds':17063,'S3QueuePullMicroseconds':5841972,'LogTest':17} +exception: +``` diff --git a/docs/ja/engines/table-engines/integrations/sqlite.md b/docs/ja/engines/table-engines/integrations/sqlite.md new file mode 100644 index 00000000000..e955e1a7f28 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/sqlite.md @@ -0,0 +1,60 @@ +--- +slug: /ja/engines/table-engines/integrations/sqlite +sidebar_position: 185 +sidebar_label: SQLite +--- + +# SQLite + +このエンジンは、SQLite へのデータのインポートおよびエクスポートを可能にし、ClickHouse から直接 SQLite テーブルへのクエリをサポートします。 + +## テーブルの作成 {#creating-a-table} + +``` sql + CREATE TABLE [IF NOT EXISTS] [db.]table_name + ( + name1 [type1], + name2 [type2], ... + ) ENGINE = SQLite('db_path', 'table') +``` + +**エンジンパラメータ** + +- `db_path` — データベースを含む SQLite ファイルへのパス。 +- `table` — SQLite データベース内のテーブル名。 + +## 使用例 {#usage-example} + +SQLite テーブルを作成するクエリを示します: + +```sql +SHOW CREATE TABLE sqlite_db.table2; +``` + +``` text +CREATE TABLE SQLite.table2 +( + `col1` Nullable(Int32), + `col2` Nullable(String) +) +ENGINE = SQLite('sqlite.db','table2'); +``` + +テーブルからデータを返します: + +``` sql +SELECT * FROM sqlite_db.table2 ORDER BY col1; +``` + +```text +┌─col1─┬─col2──┐ +│ 1 │ text1 │ +│ 2 │ text2 │ +│ 3 │ text3 │ +└──────┴───────┘ +``` + +**関連項目** + +- [SQLite](../../../engines/database-engines/sqlite.md) エンジン +- [sqlite](../../../sql-reference/table-functions/sqlite.md) テーブル関数 diff --git a/docs/ja/engines/table-engines/integrations/time-series.md b/docs/ja/engines/table-engines/integrations/time-series.md new file mode 100644 index 00000000000..2c25c9c0f02 --- /dev/null +++ b/docs/ja/engines/table-engines/integrations/time-series.md @@ -0,0 +1,290 @@ +--- +slug: /ja/engines/table-engines/special/time_series +sidebar_position: 60 +sidebar_label: TimeSeries +--- + +# TimeSeries エンジン [エクスペリメンタル] + +タイムシリーズ、すなわちタイムスタンプとタグ(またはラベル)に関連付けられた値のセットを格納するテーブルエンジン: + +``` +metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...} +metric_name2[...] = ... +``` + +:::info +これは将来のリリースで後方互換性がない形で変更される可能性のあるエクスペリメンタル機能です。 +TimeSeries テーブルエンジンの使用を +[allow_experimental_time_series_table](../../../operations/settings/settings.md#allow-experimental-time-series-table) 設定で有効にしてください。 +コマンド `set allow_experimental_time_series_table = 1` を入力します。 +::: + +## 構文 {#syntax} + +``` sql +CREATE TABLE name [(columns)] ENGINE=TimeSeries +[SETTINGS var1=value1, ...] +[DATA db.data_table_name | DATA ENGINE data_table_engine(arguments)] +[TAGS db.tags_table_name | TAGS ENGINE tags_table_engine(arguments)] +[METRICS db.metrics_table_name | METRICS ENGINE metrics_table_engine(arguments)] +``` + +## 使用法 {#usage} + +すべてをデフォルトで設定した状態で始めると簡単です(`TimeSeries` テーブルをカラムのリストを指定せずに作成することが許可されています): + +``` sql +CREATE TABLE my_table ENGINE=TimeSeries +``` + +この後、このテーブルは次のプロトコルで使用できます(サーバー構成でポートを割り当てなければなりません): +- [prometheus remote-write](../../../interfaces/prometheus.md#remote-write) +- [prometheus remote-read](../../../interfaces/prometheus.md#remote-read) + +## ターゲットテーブル {#target-tables} + +`TimeSeries` テーブルには独自のデータはなく、すべてがそのターゲットテーブルに格納されます。 +これは[Materialized View](../../../sql-reference/statements/create/view#materialized-view) の動作に似ていますが、 +Materialized View は1つのターゲットテーブルを持つのに対し、 +`TimeSeries` テーブルは [data]{#data-table}、[tags]{#tags-table}、[metrics]{#metrics-table} という名前の3つのターゲットテーブルを持ちます。 + +ターゲットテーブルは `CREATE TABLE` クエリで明示的に指定することもできますし、 +TimeSeries テーブルエンジンが内部ターゲットテーブルを自動的に生成することもできます。 + +ターゲットテーブルは次の通りです: +1. _data_ テーブル {#data-table} は、特定の識別子に関連付けられたタイムシリーズを含みます。 +_data_ テーブルは以下のカラムを持たなければなりません: + +| 名前 | 必須? | デフォルトタイプ | 可能なタイプ | 説明 | +|---|---|---|---|---| +| `id` | [x] | `UUID` | 任意 | メトリック名とタグの組み合わせを識別します | +| `timestamp` | [x] | `DateTime64(3)` | `DateTime64(X)` | 時点 | +| `value` | [x] | `Float64` | `Float32` または `Float64` | `timestamp` に関連付けられた値 | + +2. _tags_ テーブル {#tags-table} は、メトリック名とタグの各組み合わせに対して計算された識別子を含みます。 +_tags_ テーブルは以下のカラムを持たなければなりません: + +| 名前 | 必須? | デフォルトタイプ | 可能なタイプ | 説明 | +|---|---|---|---|---| +| `id` | [x] | `UUID` | 任意 ([data]{#data-table} テーブルの `id` のタイプと一致しなければなりません) | `id` はメトリック名とタグの組み合わせを識別します。DEFAULT 式はそのような識別子を計算する方法を示します | +| `metric_name` | [x] | `LowCardinality(String)` | `String` または `LowCardinality(String)` | メトリックの名前 | +| `` | [ ] | `String` | `String` または `LowCardinality(String)` または `LowCardinality(Nullable(String))` | 特定のタグの値、タグの名前と対応するカラムの名前は [tags_to_columns](#settings) 設定で指定 | +| `tags` | [x] | `Map(LowCardinality(String), String)` | `Map(String, String)` または `Map(LowCardinality(String), String)` または `Map(LowCardinality(String), LowCardinality(String))` | メトリック名を含むタグ `__name__` と [tags_to_columns](#settings) 設定で列挙される名前のタグを除くタグのマップ | +| `all_tags` | [ ] | `Map(String, String)` | `Map(String, String)` または `Map(LowCardinality(String), String)` または `Map(LowCardinality(String), LowCardinality(String))` | 一時的なカラム、各行はメトリック名を含むタグ `__name__` を除くすべてのタグのマップです。そのカラムの唯一の目的は `id` を計算する際に使用されることです | +| `min_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` または `Nullable(DateTime64(X))` | その `id` を持つタイムシリーズの最小タイムスタンプ。このカラムは [store_min_time_and_max_time](#settings) が `true` の場合に作成されます | +| `max_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` または `Nullable(DateTime64(X))` | その `id` を持つタイムシリーズの最大タイムスタンプ。このカラムは [store_min_time_and_max_time](#settings) が `true` の場合に作成されます | + +3. _metrics_ テーブル {#metrics-table} は、収集されたメトリックについてのいくつかの情報、これらのメトリックのタイプとその説明を含みます。 +_metrics_ テーブルは以下のカラムを持たなければなりません: + +| 名前 | 必須? | デフォルトタイプ | 可能なタイプ | 説明 | +|---|---|---|---|---| +| `metric_family_name` | [x] | `String` | `String` または `LowCardinality(String)` | メトリックファミリーの名前 | +| `type` | [x] | `String` | `String` または `LowCardinality(String)` | メトリックファミリーのタイプ。これには "counter", "gauge", "summary", "stateset", "histogram", "gaugehistogram" のいずれかがあります | +| `unit` | [x] | `String` | `String` または `LowCardinality(String)` | メトリックで使用される単位 | +| `help` | [x] | `String` | `String` または `LowCardinality(String)` | メトリックの説明 | + +`TimeSeries` テーブルに挿入された行は、実際にはこれら3つのターゲットテーブルに格納されます。 +`TimeSeries` テーブルには [data]{#data-table}、[tags]{#tags-table}、[metrics]{#metrics-table} のすべてのカラムが含まれます。 + +## 作成 {#creation} + +`TimeSeries` テーブルエンジンを使用してテーブルを作成するにはいくつかの方法があります。最もシンプルな文は次の通りです。 + +``` sql +CREATE TABLE my_table ENGINE=TimeSeries +``` + +実際には、次のテーブルを作成します(`SHOW CREATE TABLE my_table` を実行すると見ることができます): + +``` sql +CREATE TABLE my_table +( + `id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)), + `timestamp` DateTime64(3), + `value` Float64, + `metric_name` LowCardinality(String), + `tags` Map(LowCardinality(String), String), + `all_tags` Map(String, String), + `min_time` Nullable(DateTime64(3)), + `max_time` Nullable(DateTime64(3)), + `metric_family_name` String, + `type` String, + `unit` String, + `help` String +) +ENGINE = TimeSeries +DATA ENGINE = MergeTree ORDER BY (id, timestamp) +DATA INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +TAGS ENGINE = AggregatingMergeTree PRIMARY KEY metric_name ORDER BY (metric_name, id) +TAGS INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +METRICS ENGINE = ReplacingMergeTree ORDER BY metric_family_name +METRICS INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +``` + +したがって、カラムは自動的に生成され、さらに3つの内部UUIDがあります。 +それぞれの内部ターゲットテーブルが作成されました。 +(内部UUIDは通常は設定 +[show_table_uuid_in_table_create_query_if_not_nil](../../../operations/settings/settings#show_table_uuid_in_table_create_query_if_not_nil) +が設定されるまで表示されません。) + +内部ターゲットテーブルは `.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`, +`.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`, `.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` のような名前を持ち、 +各ターゲットテーブルはメインの `TimeSeries` テーブルのカラムのサブセットを持ちます: + +``` sql +CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +( + `id` UUID, + `timestamp` DateTime64(3), + `value` Float64 +) +ENGINE = MergeTree +ORDER BY (id, timestamp) +``` + +``` sql +CREATE TABLE default.`.inner_id.tags.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +( + `id` UUID DEFAULT reinterpretAsUUID(sipHash128(metric_name, all_tags)), + `metric_name` LowCardinality(String), + `tags` Map(LowCardinality(String), String), + `all_tags` Map(String, String) EPHEMERAL, + `min_time` SimpleAggregateFunction(min, Nullable(DateTime64(3))), + `max_time` SimpleAggregateFunction(max, Nullable(DateTime64(3))) +) +ENGINE = AggregatingMergeTree +PRIMARY KEY metric_name +ORDER BY (metric_name, id) +``` + +``` sql +CREATE TABLE default.`.inner_id.metrics.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +( + `metric_family_name` String, + `type` String, + `unit` String, + `help` String +) +ENGINE = ReplacingMergeTree +ORDER BY metric_family_name +``` + +## カラムタイプの調整 {#adjusting-column-types} + +メインテーブルを定義する際に明示的に指定することで、内部ターゲットテーブルのほぼすべてのカラムのタイプを調整できます。例えば、 + +``` sql +CREATE TABLE my_table +( + timestamp DateTime64(6) +) ENGINE=TimeSeries +``` + +これにより、内部の [data]{#data-table} テーブルがマイクロ秒単位でタイムスタンプを格納します: + +``` sql +CREATE TABLE default.`.inner_id.data.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` +( + `id` UUID, + `timestamp` DateTime64(6), + `value` Float64 +) +ENGINE = MergeTree +ORDER BY (id, timestamp) +``` + +## `id` カラム {#id-column} + +`id` カラムには識別子が含まれ、すべての識別子はメトリック名とタグの組み合わせに対して計算されます。 +`id` カラムの DEFAULT 式は、そのような識別子を計算するために使用される式です。 +`id` カラムのタイプとその式は、明示的に指定することで調整できます: + +``` sql +CREATE TABLE my_table +( + id UInt64 DEFAULT sipHash64(metric_name, all_tags) +) ENGINE=TimeSeries +``` + +## `tags` および `all_tags` カラム {#tags-and-all-tags} + +タグのマップを含む2つのカラム - `tags` と `all_tags` があります。この例では同じ意味を持ちますが、 +設定 `tags_to_columns` が使用された場合には異なる場合があります。 +特定のタグが `tags` カラム内のマップに格納される代わりに、別のカラムに格納されるべきであることを指定することができます: + +``` sql +CREATE TABLE my_table ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'} +``` + +この文は次のカラムを追加します: +``` + `instance` String, + `job` String +``` +これにより、`my_table` と内部の [tags]{#tags-table} ターゲットテーブルの両方の定義にカラムが追加されます。 +この場合、`tags` カラムには `instance` と `job` のタグが含まれませんが、`all_tags` カラムにはそれらが含まれます。`all_tags` カラムは一時的であり、`id` カラムの DEFAULT 式で使用されることが唯一の目的です。 + +カラムのタイプは明示的に指定することで調整できます: + +``` sql +CREATE TABLE my_table (instance LowCardinality(String), job LowCardinality(Nullable(String))) +ENGINE=TimeSeries SETTINGS = {'instance': 'instance', 'job': 'job'} +``` + +## 内部ターゲットテーブルのテーブルエンジン {#inner-table-engines} + +デフォルトでは、内部ターゲットテーブルは次のテーブルエンジンを使用します: +- [data]{#data-table} テーブルは [MergeTree](../mergetree-family/mergetree) を使用します; +- [tags]{#tags-table} テーブルは [AggregatingMergeTree](../mergetree-family/aggregatingmergetree) を使用します。このテーブルには同じデータが頻繁に複数回挿入されるため、重複を削除する方法が必要であり、`min_time` および `max_time` カラムの集計が必要だからです; +- [metrics]{#metrics-table} テーブルは [ReplacingMergeTree](../mergetree-family/replacingmergetree) を使用します。このテーブルには同じデータが頻繁に複数回挿入されるため、重複を削除する方法が必要です。 + +内部ターゲットテーブルに他のテーブルエンジンを使用することも指定があれば可能です: + +``` sql +CREATE TABLE my_table ENGINE=TimeSeries +DATA ENGINE=ReplicatedMergeTree +TAGS ENGINE=ReplicatedAggregatingMergeTree +METRICS ENGINE=ReplicatedReplacingMergeTree +``` + +## 外部ターゲットテーブル {#external-target-tables} + +`TimeSeries` テーブルが手動で作成されたテーブルを使用することも可能です: + +``` sql +CREATE TABLE data_for_my_table +( + `id` UUID, + `timestamp` DateTime64(3), + `value` Float64 +) +ENGINE = MergeTree +ORDER BY (id, timestamp); + +CREATE TABLE tags_for_my_table ... + +CREATE TABLE metrics_for_my_table ... + +CREATE TABLE my_table ENGINE=TimeSeries DATA data_for_my_table TAGS tags_for_my_table METRICS metrics_for_my_table; +``` + +## 設定 {#settings} + +`TimeSeries` テーブルを定義する際に指定できる設定のリストは以下の通りです: + +| 名前 | タイプ | デフォルト | 説明 | +|---|---|---|---| +| `tags_to_columns` | Map | {} | [tags]{#tags-table} テーブルにおいて、どのタグが別のカラムに配置されるべきかを指定するマップ。構文: `{'tag1': 'column1', 'tag2' : column2, ...}` | +| `use_all_tags_column_to_generate_id` | Bool | true | タイムシリーズの識別子を計算する式を生成する際に、その計算に `all_tags` カラムを使用することを有効にするフラグ | +| `store_min_time_and_max_time` | Bool | true | true に設定されている場合、このテーブルは各タイムシリーズの `min_time` と `max_time` を格納します | +| `aggregate_min_time_and_max_time` | Bool | true | 内部ターゲット `tags` テーブルを作成する際に、このフラグが設定されていると `min_time` カラムのタイプとして `Nullable(DateTime64(3))` の代わりに `SimpleAggregateFunction(min, Nullable(DateTime64(3)))` を使用し、`max_time` カラムの場合も同様です | +| `filter_by_min_time_and_max_time` | Bool | true | true に設定されている場合、このテーブルはタイムシリーズをフィルタリングするために `min_time` と `max_time` カラムを使用します | + +# 関数 {#functions} + +以下は、`TimeSeries` テーブルを引数としてサポートする関数のリストです: +- [timeSeriesData](../../../sql-reference/table-functions/timeSeriesData.md) +- [timeSeriesTags](../../../sql-reference/table-functions/timeSeriesTags.md) +- [timeSeriesMetrics](../../../sql-reference/table-functions/timeSeriesMetrics.md) diff --git a/docs/ja/engines/table-engines/log-family/index.md b/docs/ja/engines/table-engines/log-family/index.md new file mode 100644 index 00000000000..97297683c60 --- /dev/null +++ b/docs/ja/engines/table-engines/log-family/index.md @@ -0,0 +1,45 @@ +--- +slug: /ja/engines/table-engines/log-family/ +sidebar_position: 20 +sidebar_label: Logファミリー +--- + +# Log エンジンファミリー + +これらのエンジンは、多くの小さなテーブル(約100万行まで)をすばやく書き込み、後で全体として読む必要があるシナリオのために開発されました。 + +ファミリーのエンジン: + +- [StripeLog](/docs/ja/engines/table-engines/log-family/stripelog.md) +- [Log](/docs/ja/engines/table-engines/log-family/log.md) +- [TinyLog](/docs/ja/engines/table-engines/log-family/tinylog.md) + +`Log`ファミリーのテーブルエンジンは、[HDFS](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-hdfs)や[S3](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)の分散ファイルシステムにデータを保存できます。 + +## 共通のプロパティ {#common-properties} + +エンジンの特徴: + +- データをディスクに保存します。 + +- データをファイルの末尾に追加して書き込みます。 + +- 同時データアクセス用のロックをサポートします。 + + `INSERT`クエリの間、テーブルはロックされ、他の読み書きクエリはテーブルがアンロックされるのを待ちます。データ書き込みのクエリがない場合、任意の数のデータ読み取りクエリを並行して実行できます。 + +- [ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#alter-mutations)をサポートしません。 + +- インデックスをサポートしません。 + + これにより、データ範囲の`SELECT`クエリは効率的ではありません。 + +- データをアトミックに書き込みません。 + + たとえば、サーバーの異常終了などで書き込み操作が中断されると、データが破損したテーブルが得られる可能性があります。 + +## 差異 {#differences} + +`TinyLog`エンジンは、ファミリー内で最もシンプルで、機能と効率が最も低いです。`TinyLog`エンジンは、単一クエリで複数のスレッドによる並行データ読み取りをサポートしません。単一のクエリから並行読み取りをサポートする他のエンジンよりもデータを読むのが遅く、各カラムを別々のファイルに保存するため、`Log`エンジンとほぼ同じ数のファイルディスクリプタを使用します。簡単なシナリオでのみ使用してください。 + +`Log`および`StripeLog`エンジンは並行データ読み取りをサポートしています。データを読み取る際、ClickHouseは複数のスレッドを使用し、各スレッドは別々のデータブロックを処理します。`Log`エンジンはテーブルの各カラムに対して別々のファイルを使用します。一方、`StripeLog`はすべてのデータを1つのファイルに格納します。その結果、`StripeLog`エンジンは使用するファイルディスクリプタが少なくなりますが、`Log`エンジンの方がデータ読み取りの効率が高くなります。 diff --git a/docs/ja/engines/table-engines/log-family/log.md b/docs/ja/engines/table-engines/log-family/log.md new file mode 100644 index 00000000000..743f500a444 --- /dev/null +++ b/docs/ja/engines/table-engines/log-family/log.md @@ -0,0 +1,13 @@ +--- +slug: /ja/engines/table-engines/log-family/log +toc_priority: 33 +toc_title: Log +--- + +# Log + +このエンジンは `Log` エンジンファミリーに属します。`Log` エンジンの共通プロパティとその違いについては、[Log エンジンファミリー](../../../engines/table-engines/log-family/index.md)の記事を参照してください。 + +`Log` は [TinyLog](../../../engines/table-engines/log-family/tinylog.md) と異なり、カラムファイルと一緒に小さな「マーク」ファイルが存在します。これらのマークはデータブロックごとに書き込まれ、指定された行数をスキップするためにファイルをどこから読み始めるかを示すオフセットを含みます。これにより、テーブルデータを複数のスレッドで読み取ることが可能になります。 +同時にデータにアクセスする場合、読み取り操作は同時に実行できますが、書き込み操作は読み取りおよび他の書き込みをブロックします。 +`Log` エンジンはインデックスをサポートしていません。同様に、テーブルへの書き込みに失敗した場合、テーブルは壊れており、読み取りはエラーを返します。`Log` エンジンは、一時的なデータ、書き込みが一度だけ行われるテーブル、テストまたはデモンストレーションの目的に適しています。 diff --git a/docs/ja/engines/table-engines/log-family/stripelog.md b/docs/ja/engines/table-engines/log-family/stripelog.md new file mode 100644 index 00000000000..638dbbc4c51 --- /dev/null +++ b/docs/ja/engines/table-engines/log-family/stripelog.md @@ -0,0 +1,92 @@ +--- +slug: /ja/engines/table-engines/log-family/stripelog +toc_priority: 32 +toc_title: StripeLog +--- + +# Stripelog + +このエンジンはログエンジンファミリーに属します。ログエンジンの共通の特性とその違いについては、[Log Engine Family](../../../engines/table-engines/log-family/index.md)の記事を参照してください。 + +このエンジンは、小量のデータ(100万行未満)を持つ多くのテーブルを書き込む必要があるシナリオで使用します。 + +## テーブルの作成 {#table_engines-stripelog-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = StripeLog +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query) クエリの詳細な説明を参照してください。 + +## データの書き込み {#table_engines-stripelog-writing-the-data} + +`StripeLog`エンジンはすべてのカラムを1つのファイルに保存します。各`INSERT`クエリに対して、ClickHouseはデータブロックをテーブルファイルの末尾に追加し、カラムを一つずつ書き込みます。 + +各テーブルに対してClickHouseは以下のファイルを書き込みます: + +- `data.bin` — データファイル。 +- `index.mrk` — マークを含むファイル。マークは、挿入された各データブロックの各カラムのオフセットを含みます。 + +`StripeLog`エンジンは`ALTER UPDATE`および`ALTER DELETE`操作をサポートしていません。 + +## データの読み取り {#table_engines-stripelog-reading-the-data} + +マークを含むファイルにより、ClickHouseはデータの読み取りを並列化することができます。これにより、`SELECT`クエリが行を予測不能な順序で返します。行をソートするには`ORDER BY`句を使用してください。 + +## 使用例 {#table_engines-stripelog-example-of-use} + +テーブルの作成: + +``` sql +CREATE TABLE stripe_log_table +( + timestamp DateTime, + message_type String, + message String +) +ENGINE = StripeLog +``` + +データの挿入: + +``` sql +INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The first regular message') +INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message') +``` + +`data.bin`ファイル内に2つのデータブロックを作成するために、2つの`INSERT`クエリを使用しました。 + +ClickHouseはデータを選択する際に複数のスレッドを使用します。各スレッドは別々のデータブロックを読み取って、それぞれ完了時に結果の行を独立して返します。その結果、出力のブロックの順序は入力の同じブロックの順序にはほとんどの場合一致しません。例: + +``` sql +SELECT * FROM stripe_log_table +``` + +``` text +┌───────────timestamp─┬─message_type─┬─message────────────────────┐ +│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │ +│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │ +└─────────────────────┴──────────────┴────────────────────────────┘ +┌───────────timestamp─┬─message_type─┬─message───────────────────┐ +│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │ +└─────────────────────┴──────────────┴───────────────────────────┘ +``` + +結果のソート(デフォルトで昇順): + +``` sql +SELECT * FROM stripe_log_table ORDER BY timestamp +``` + +``` text +┌───────────timestamp─┬─message_type─┬─message────────────────────┐ +│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │ +│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │ +│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │ +└─────────────────────┴──────────────┴────────────────────────────┘ +``` diff --git a/docs/ja/engines/table-engines/log-family/tinylog.md b/docs/ja/engines/table-engines/log-family/tinylog.md new file mode 100644 index 00000000000..8e887a5ff94 --- /dev/null +++ b/docs/ja/engines/table-engines/log-family/tinylog.md @@ -0,0 +1,13 @@ +--- +slug: /ja/engines/table-engines/log-family/tinylog +toc_priority: 34 +toc_title: TinyLog +--- + +# TinyLog + +このエンジンはログエンジンファミリーに属します。ログエンジンの共通特性とその違いについては、[ログエンジンファミリー](../../../engines/table-engines/log-family/index.md)を参照してください。 + +このテーブルエンジンは通常、書き込みを一度だけ行い、その後必要に応じて何度も読み取るという方法で使用されます。例えば、`TinyLog` 型のテーブルは小さなバッチで処理される中間データに使用することができます。ただし、多数の小さなテーブルにデータを保存することは非効率的です。 + +クエリは単一のストリームで実行されます。言い換えれば、このエンジンは比較的少ないテーブル (およそ1,000,000行まで) に向いています。多数の小さなテーブルを持っている場合、このテーブルエンジンを使用することに意味があります。なぜなら、[Log](../../../engines/table-engines/log-family/log.md) エンジンよりも単純で(開く必要のあるファイルが少なくて済む)済むからです。 diff --git a/docs/ja/engines/table-engines/mergetree-family/aggregatingmergetree.md b/docs/ja/engines/table-engines/mergetree-family/aggregatingmergetree.md new file mode 100644 index 00000000000..137f03bfa00 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/aggregatingmergetree.md @@ -0,0 +1,161 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/aggregatingmergetree +sidebar_position: 60 +sidebar_label: AggregatingMergeTree +--- + +# AggregatingMergeTree + +このエンジンは、データパーツのマージロジックを変更した[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree)から継承しています。ClickHouseでは、同じ主キー(より正確には、同じ[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を、そのキーを持つすべての行の結合状態を保存する単一の行に置き換えます(同一のデータパーツ内で)。 + +`AggregatingMergeTree`テーブルは、集計されたマテリアライズドビューを含む増分データ集計に使用できます。 + +このエンジンは、以下の型のすべてのカラムを処理します: + +## [AggregateFunction](../../../sql-reference/data-types/aggregatefunction.md) +## [SimpleAggregateFunction](../../../sql-reference/data-types/simpleaggregatefunction.md) + +`AggregatingMergeTree`を使用するのが適切なのは、行数を何桁も削減できる場合です。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = AggregatingMergeTree() +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[TTL expr] +[SETTINGS name=value, ...] +``` + +リクエストパラメータの説明については、[リクエストの説明](../../../sql-reference/statements/create/table.md)を参照してください。 + +**クエリ句** + +`AggregatingMergeTree`テーブルを作成するときには、`MergeTree`テーブルを作成するときと同じ[句](../../../engines/table-engines/mergetree-family/mergetree.md)が必要です。 + +
+ +非推奨のテーブル作成メソッド + +:::note +新しいプロジェクトではこの方法を使用せず、可能であれば古いプロジェクトを上記の方法に切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] AggregatingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity) +``` + +すべてのパラメータは、`MergeTree`と同じ意味を持ちます。 +
+ +## SELECTとINSERT {#select-and-insert} + +データを挿入するには、集計-State-関数を使用して[INSERT SELECT](../../../sql-reference/statements/insert-into.md)クエリを使用します。 +`AggregatingMergeTree`テーブルからデータを選択する際には、`GROUP BY`句と挿入時に使用したものと同じ集計関数を、`-Merge`サフィックスをつけて使用します。 + +`SELECT`クエリの結果において、`AggregateFunction`タイプの値は、すべてのClickHouse出力フォーマットに対して実装依存のバイナリ表現を持ちます。たとえば、`TabSeparated`フォーマットで`SELECT`クエリによってデータをダンプする場合、このダンプは`INSERT`クエリを使用して再ロードできます。 + +## 集計マテリアライズドビューの例 {#example-of-an-aggregated-materialized-view} + +以下の例では、`test`という名前のデータベースがすでにあると仮定していますので、まだ存在しない場合は作成してください: + +```sql +CREATE DATABASE test; +``` + +次に、生データを含むテーブル`test.visits`を作成します: + +``` sql +CREATE TABLE test.visits + ( + StartDate DateTime64 NOT NULL, + CounterID UInt64, + Sign Nullable(Int32), + UserID Nullable(Int32) +) ENGINE = MergeTree ORDER BY (StartDate, CounterID); +``` + +次に、総訪問数と一意のユーザー数を追跡する`AggregationFunction`を格納する`AggregatingMergeTree`テーブルが必要です。 + +`test.visits`テーブルを監視し、`AggregateFunction`タイプを使用する`AggregatingMergeTree`マテリアライズドビューを作成します: + +``` sql +CREATE TABLE test.agg_visits ( + StartDate DateTime64 NOT NULL, + CounterID UInt64, + Visits AggregateFunction(sum, Nullable(Int32)), + Users AggregateFunction(uniq, Nullable(Int32)) +) +ENGINE = AggregatingMergeTree() ORDER BY (StartDate, CounterID); +``` + +`test.visits`から`test.agg_visits`にデータを入力するマテリアライズドビューを作成します: + +```sql +CREATE MATERIALIZED VIEW test.visits_mv TO test.agg_visits +AS SELECT + StartDate, + CounterID, + sumState(Sign) AS Visits, + uniqState(UserID) AS Users +FROM test.visits +GROUP BY StartDate, CounterID; +``` + +`test.visits`テーブルにデータを挿入します: + +``` sql +INSERT INTO test.visits (StartDate, CounterID, Sign, UserID) + VALUES (1667446031000, 1, 3, 4), (1667446031000, 1, 6, 3); +``` + +データは`test.visits`と`test.agg_visits`の両方に挿入されます。 + +集計されたデータを取得するには、`SELECT ... GROUP BY ...`クエリをマテリアライズドビュー`test.mv_visits`から実行します: + +```sql +SELECT + StartDate, + sumMerge(Visits) AS Visits, + uniqMerge(Users) AS Users +FROM test.agg_visits +GROUP BY StartDate +ORDER BY StartDate; +``` + +```text +┌───────────────StartDate─┬─Visits─┬─Users─┐ +│ 2022-11-03 03:27:11.000 │ 9 │ 2 │ +└─────────────────────────┴────────┴───────┘ +``` + +`test.visits`にさらに2つのレコードを追加しますが、今回は1つのレコードに異なるタイムスタンプを使用してみます: + +```sql +INSERT INTO test.visits (StartDate, CounterID, Sign, UserID) + VALUES (1669446031000, 2, 5, 10), (1667446031000, 3, 7, 5); +``` + +再び`SELECT`クエリを実行すると、以下の出力が返されます: + +```text +┌───────────────StartDate─┬─Visits─┬─Users─┐ +│ 2022-11-03 03:27:11.000 │ 16 │ 3 │ +│ 2022-11-26 07:00:31.000 │ 5 │ 1 │ +└─────────────────────────┴────────┴───────┘ +``` + +## 関連コンテンツ + +- ブログ: [Using Aggregate Combinators in ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/docs/ja/engines/table-engines/mergetree-family/annindexes.md b/docs/ja/engines/table-engines/mergetree-family/annindexes.md new file mode 100644 index 00000000000..e2e059a27ee --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/annindexes.md @@ -0,0 +1,116 @@ +# 近似最適近傍探索インデックス [エクスペリメンタル] + +最適近傍探索は、N次元ベクトル空間で与えられた点に対して最も近いM個の点を見つける問題です。この問題を解決する最も単純なアプローチは、ベクトル空間内のすべての点と参照点の距離を計算するブルートフォース検索です。この方法は完全な精度を保証しますが、実際のアプリケーションにおいては通常、速度が遅すぎます。したがって、最適近傍探索の問題は、多くの場合[近似アルゴリズム](https://github.com/erikbern/ann-benchmarks)で解決されます。近似最適近傍探索技術は、[埋め込みメソッド](https://cloud.google.com/architecture/overview-extracting-and-serving-feature-embeddings-for-machine-learning)と組み合わせて、大量のメディア(画像、曲、記事など)をミリ秒単位で検索することが可能です。 + +ブログ: +- [ClickHouseでのベクトル検索 - Part 1](https://clickhouse.com/blog/vector-search-clickhouse-p1) +- [ClickHouseでのベクトル検索 - Part 2](https://clickhouse.com/blog/vector-search-clickhouse-p2) + +SQLでは、最適近傍問題を次のように表現できます: + +``` sql +SELECT * +FROM table +ORDER BY Distance(vectors, Point) +LIMIT N +``` + +`vectors`は、[Array(Float32)](../../../sql-reference/data-types/array.md)またはArray(Float64)型のN次元の値(例えば埋め込み)を含みます。関数`Distance`は、二つのベクトル間の距離を計算します。距離関数としては、しばしばユークリッド(L2)距離が選ばれますが、[他の距離関数](/docs/ja/sql-reference/functions/distance-functions.md)も可能です。`Point`は参照点、例えば`(0.17, 0.33, ...)`で、`N`は検索結果の数を制限します。 + +このクエリは、参照点に最も近いトップ`N`個の点を返します。`N`引数は返される値の数を制限し、事前に`MaxDistance`を決定するのが難しい場合に便利です。 + +ブルートフォース検索では、`vectors`内のすべての点と`Point`間の距離を計算する必要があるため、クエリは高価です(点の数に対して線形です)。このプロセスを速めるために、近似最適近傍探索インデックス(ANNインデックス)は検索空間のコンパクトな表現(クラスタリング、検索ツリーなどの使用)を保存します。これにより、近似的な答えをより迅速に(サブ線形時間で)計算することが可能です。 + +# ベクトル類似インデックスの作成と使用 + +[Array(Float32)](../../../sql-reference/data-types/array.md)カラムに対するベクトル類似インデックスを作成する構文: + +```sql +CREATE TABLE table +( + id Int64, + vectors Array(Float32), + INDEX index_name vectors TYPE vector_similarity(method, distance_function[, quantization, hnsw_max_connections_per_layer, hnsw_candidate_list_size_for_construction]) [GRANULARITY N] +) +ENGINE = MergeTree +ORDER BY id; +``` + +パラメータ: +- `method`: 現在は`hnsw`のみサポートしています。 +- `distance_function`: `L2Distance`([ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance) - ユークリッド空間内の二点間の線の長さ)または`cosineDistance`([コサイン距離](https://en.wikipedia.org/wiki/Cosine_similarity#Cosine_distance)- ゼロでない二つのベクトル間の角度)。 +- `quantization`: ベクトルを精度を落として保存するための`f64`、`f32`、`f16`、`bf16`、または`i8`(オプション、デフォルト: `bf16`) +- `hnsw_max_connections_per_layer`: HNSWグラフノードごとの隣接ノード数、[HNSWペーパー](https://doi.org/10.1109/TPAMI.2018.2889473)で`M`として知られています(オプション、デフォルト: 32) +- `hnsw_candidate_list_size_for_construction`: HNSWグラフを構築する際の動的候補リストのサイズ、元の[HNSWペーパー](https://doi.org/10.1109/TPAMI.2018.2889473)で`ef_construction`として知られています(オプション、デフォルト: 128) + +`hnsw_max_connections_per_layer`および`hnsw_candidate_list_size_for_construction`の値が0の場合、これらのパラメータのデフォルト値が使用されます。 + +例: + +```sql +CREATE TABLE table +( + id Int64, + vectors Array(Float32), + INDEX idx vectors TYPE vector_similarity('hnsw', 'L2Distance') -- 代替構文: TYPE vector_similarity(hnsw, L2Distance) +) +ENGINE = MergeTree +ORDER BY id; +``` + +ベクトル類似インデックスは[USearchライブラリ](https://github.com/unum-cloud/usearch)に基づいており、[HNSWアルゴリズム](https://arxiv.org/abs/1603.09320)を実装しています。すなわち、各点がベクトルを表し、辺が類似性を表す階層的なグラフです。このような階層構造は大規模なコレクションに非常に効率的です。全体のデータセットから0.05%以下のデータを取得しながら、99%の再現率を提供することが頻繁にあります。これは高次元ベクトル作業で特に役立ちます。高次元ベクトルはロードと比較にコストがかかるからです。このライブラリはまた、最新のArm(NEONとSVE)およびx86(AVX2とAVX-512)CPUで距離計算をさらに加速するためのハードウェア固有のSIMD最適化や、RAMにロードせずに不変の永続ファイル周りを効率的にナビゲートするためのOS固有の最適化も備えています。 + +USearchインデックスは現在エクスペリメンタルであり、使用するにはまず`SET allow_experimental_vector_similarity_index = 1`を設定する必要があります。 + +ベクトル類似インデックスは現在二つの距離関数をサポートしています: +- `L2Distance`、ユークリッド距離とも呼ばれ、ユークリッド空間内の二点間の線分の長さ([Wikipedia](https://en.wikipedia.org/wiki/Euclidean_distance))。 +- `cosineDistance`、コサイン類似性とも呼ばれ、二つの(ゼロでない)ベクトル間の角度のコサイン([Wikipedia](https://en.wikipedia.org/wiki/Cosine_similarity))。 + +ベクトル類似インデックスはベクトルを精度を落とした形式で保存することができます。サポートされているスカラー型は`f64`、`f32`、`f16`、`bf16`、および`i8`です。インデックス作成時にスカラー型を指定しなかった場合、デフォルトで`bf16`が使用されます。 + +正規化されたデータには通常`L2Distance`がより良い選択であり、そうでない場合はスケールを補うため`cosineDistance`が推奨されます。インデックス作成時に距離関数が指定されなかった場合、デフォルトで`L2Distance`が使用されます。 + +:::note +すべての配列は同じ長さである必要があります。エラーを回避するために、例えば`CONSTRAINT constraint_name_1 CHECK length(vectors) = 256`といった[CONSTRAINT](/docs/ja/sql-reference/statements/create/table.md#constraints)を使用することができます。また、`INSERT`文で空の`Arrays`や指定されていない`Array`値(つまりデフォルト値)はサポートされていません。 +::: + +:::note +現在、ベクトル類似インデックスはテーブルごとに設定される非デフォルトの`index_granularity`設定では機能しません。[こちらを参照](https://github.com/ClickHouse/ClickHouse/pull/51325#issuecomment-1605920475)。必要があれば、config.xmlで値を変更する必要があります。 +::: + +ベクトルインデックス作成は遅いことが知られています。このプロセスを速めるために、インデックス作成を並列化することができます。スレッドの最大数は、サーバー設定の[max_build_vector_similarity_index_thread_pool_size](../../../operations/server-configuration-parameters/settings.md#server_configuration_parameters_max_build_vector_similarity_index_thread_pool_size)で設定できます。 + +ANNインデックスはカラムの挿入およびマージ時に構築されます。その結果、`INSERT`や`OPTIMIZE`ステートメントは通常のテーブルに比べて遅くなります。ANNインデックスは基本的に不変またはまれにしか変更されないデータにのみ使用され、読み取り要求が書き込み要求よりも多い場合に理想的です。 + +:::tip +ベクトル類似インデックスの構築コストを削減するには、新しく挿入されたパーツにスキップインデックスの構築を無効にする`materialize_skip_indexes_on_insert`を設定してください。検索は正確な検索にフォールバックしますが、挿入されたパーツは通常テーブル全体のサイズに比べて小さいので、その影響は無視できる程度です。 + +ANNインデックスはこの種のクエリをサポートします: + +``` sql +WITH [...] AS reference_vector +SELECT * +FROM table +WHERE ... -- WHERE句はオプション +ORDER BY Distance(vectors, reference_vector) +LIMIT N +SETTINGS enable_analyzer = 0; -- 一時的な制限で、解除される予定 +``` + +:::tip +大きなベクトルを出力するのを避けるため、[クエリパラメータ](/docs/ja/interfaces/cli.md#queries-with-parameters-cli-queries-with-parameters)を使用することができます。例えば、 + +```bash +clickhouse-client --param_vec='hello' --query="SELECT * FROM table WHERE L2Distance(vectors, {vec: Array(Float32)}) < 1.0" +``` +::: + +HNSWパラメータ`hnsw_candidate_list_size_for_search`(デフォルト: 256)を異なる値で検索するために、`SELECT`クエリを`SETTINGS hnsw_candidate_list_size_for_search = `を指定して実行します。 + +**制限事項**: 近似アルゴリズムを使用して最適近傍を決定するために、制限が必要です。そのため、`LIMIT`句のないクエリはANNインデックスを利用できません。また、ANNインデックスはクエリに`max_limit_for_ann_queries`(デフォルト: 100万行)より小さい`LIMIT`値がある場合にのみ使用されます。これは、近似近傍検索のために外部ライブラリによる大規模なメモリ割り当てを防ぐための安全策です。 + +**スキップインデックスとの違い** 通常の[スキップインデックス](https://clickhouse.com/docs/ja/optimize/skipping-indexes)と同様に、ANNインデックスはグラニュールごとに構築され、各インデックスブロックは`GRANULARITY = [N]`グラニュール(通常のスキップインデックスの場合はデフォルトで`[N]` = 1)で構成されます。例えば、テーブルの主キーインデックスグラニュラリティが8192(`index_granularity = 8192`設定)であり、`GRANULARITY = 2`の場合、各インデックスブロックは16384行を含みます。しかし、近似近傍検索のためのデータ構造とアルゴリズム(通常外部ライブラリから提供される)は本質的に行指向です。それらは一連の行をコンパクトに表現し、ANNクエリに対する行も返します。これは通常のスキップインデックスがインデックスブロックの粒度でデータを飛び越える方法とは異なる振る舞いを引き起こします。 + +ユーザーがカラムにANNインデックスを定義すると、ClickHouseは内部的に各インデックスブロックに対してANN「サブインデックス」を作成します。サブインデックスは「ローカル」であり、自身の含むインデックスブロック内の行のみを認識しています。前述の例で、カラムが65536行あると仮定すると、四つのインデックスブロック(八つのグラニュールにまたがる)が得られ、それぞれにANNサブインデックスが作成されます。サブインデックスは理論的には、インデックスブロック内でN個の最も近い点を持つ行を直接返すことができます。しかし、ClickHouseはデータをディスクからメモリにグラニュールの粒度でロードするため、サブインデックスは一致する行をグラニュール粒度に外挿します。これは通常のスキップインデックスがインデックスブロックの粒度でデータを飛び越える方法と異なります。 + +`GRANULARITY`パラメータは、いくつのANNサブインデックスが作成されるかを決定します。大きな`GRANULARITY`値は、少ないが大きなANNSサブインデックスを意味し、一つのサブインデックスがあるカラム(またはカラムのデータパート)の場合まで、大きさを増やします。その場合、サブインデックスはカラム行全体(またはその一部)のすべてのグラニュールを直接返せる「グローバル」なビューを持ちます(関連する行があるグラニュールは最大で`LIMIT [N]`個です)。次のステップでは、ClickHouseがこれらのグラニュールをロードし、ブルートフォースで距離計算を行うことにより、実際の最良の行を確認します。小さい`GRANULARITY`値では、各サブインデックスが最大`LIMIT N`までのグラニュールを返します。結果として、より多くのグラニュールをロードして後処理する必要があります。一方、大きな`GRANULARITY`値を使用することが一般的に推奨されます。これは、ANNインデックスの処理性能が異なるだけで、検索精度には両方とも等しく良い影響を与えます。`GRANULARITY`がANNインデックスで指定されていない場合、デフォルト値は1億です。 diff --git a/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md b/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md new file mode 100644 index 00000000000..8c45ef21e4c --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md @@ -0,0 +1,308 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/collapsingmergetree +sidebar_position: 70 +sidebar_label: CollapsingMergeTree +--- + +# CollapsingMergeTree + +このエンジンは [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md)から継承しており、行の折り畳みロジックをデータパーツのマージアルゴリズムに追加しています。 + +`CollapsingMergeTree` は、ソートキー (`ORDER BY`)内の特定のフィールド`Sign`がすべてのフィールドと等価である場合に、1 と -1 の値を持っている場合に、行のペアを非同期的に削除(折り畳み)します。ペアがない行は保持されます。詳細は、本ドキュメントの [Collapsing](#table_engine-collapsingmergetree-collapsing) セクションを参照してください。 + +このエンジンにより、ストレージのボリュームが大幅に削減され、`SELECT`クエリの効率が向上します。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = CollapsingMergeTree(sign) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +クエリパラメータの説明については、[クエリ説明](../../../sql-reference/statements/create/table.md)を参照してください。 + +## CollapsingMergeTree パラメータ + +### sign + +`sign` — 行のタイプを示すカラムの名前: `1` は「状態」の行で、`-1` は「キャンセル」行です。 + + カラムのデータ型 — `Int8`. + +## クエリ句 + +`CollapsingMergeTree`テーブルを作成する場合、`MergeTree`テーブルを作成するときと同じ[クエリ句](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)が必要です。 + +
+ +推奨されない方法でのテーブル作成 + +:::note +新しいプロジェクトではこの方法を使用せず、可能であれば上記で説明した方法に古いプロジェクトを切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] CollapsingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, sign) +``` + +`sign`を除くすべてのパラメータは`MergeTree`と同じ意味を持ちます。 + +- `sign` — 行のタイプを示すカラム名: `1` — 「状態」の行, `-1` — 「キャンセル」行。 + + カラムデータ型 — `Int8`. + +
+ +## Collapsing {#table_engine-collapsingmergetree-collapsing} + +### データ {#data} + +特定のオブジェクトの継続的に変化するデータを保存する必要がある状況を考えてみてください。オブジェクトの1行を持ち、変更時にそれを更新するのが論理的に聞こえるかもしれませんが、更新操作はストレージ内のデータの書き換えを必要とするため、DBMSにとって時間と費用のかかる操作です。データを迅速に書き込む必要がある場合、更新は容認できませんが、次のようにオブジェクトの変更を順次書き込むことができます。 + +特定のカラム `Sign` を使用します。`Sign = 1` の場合、行はオブジェクトの状態を示し、「状態」行と呼びます。`Sign = -1` の場合、同じ属性を持つオブジェクトの状態のキャンセルを示し、「キャンセル」行と呼びます。 + +例えば、あるサイトでユーザーがチェックしたページとそこでの滞在時間を計算したいとします。ある時点でユーザーのアクティビティ状態を次の行で記録します。 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +後のある時点で、ユーザーのアクティビティの変化を登録し、次の2行で記録します。 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +最初の行はオブジェクト(ユーザー)の以前の状態をキャンセルします。キャンセルされた状態のソートキーのフィールドを Sign を除いてコピーする必要があります。 + +2番目の行には現在の状態が含まれています。 + +私たちはユーザーの活動の最後の状態のみを必要としているので、次の行 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +はオブジェクトの無効な(古い)状態を折り畳んで削除できます。`CollapsingMergeTree` はデータパーツのマージ中にこれを行います。 + +なぜすべての変更に対して2行が必要なのか、[アルゴリズム](#table_engine-collapsingmergetree-collapsing-algorithm)の段落で説明します。 + +**このアプローチの特異な特性** + +1. データを書くプログラムは、オブジェクトをキャンセルできるようにその状態を記憶しておく必要があります。「キャンセル」文字列は「状態」文字列のソートキーのフィールドのコピーと反対の`Sign` を含むべきです。初期のストレージサイズを増大させますが、データをすばやく書き込むことができます。 +2. カラム内の長い増加する配列は、書き込み負荷のため、エンジンの効率を低下させます。より単純なデータの方が効率は高くなります。 +3. `SELECT`の結果はオブジェクト変更履歴の一貫性に大きく依存します。挿入用データを準備する際には正確である必要があります。一貫性のないデータでは、例えばセッション深度のような非負のメトリックに対して負の値を得るといった予測不可能な結果が生じる可能性があります。 + +### アルゴリズム {#table_engine-collapsingmergetree-collapsing-algorithm} + +ClickHouseがデータパーツをマージする際、同じソートキー (`ORDER BY`)を持つ連続する行の各グループは、`Sign = 1` の行(「状態」行)と `Sign = -1` の行(「キャンセル」行)を持つ2行以下に減少します。つまり、エントリは崩壊します。 + +結果となるデータパーツの各々について、ClickHouse は次のことを行います: + +1. 「状態」行と「キャンセル」行の数が一致し、最後の行が「状態」行の場合、最初の「キャンセル」行と最後の「状態」行を保持します。 +2. 「状態」行が「キャンセル」行より多い場合、最後の「状態」行を保持します。 +3. 「キャンセル」行が「状態」行より多い場合、最初の「キャンセル」行を保持します。 +4. 他のすべての場合、どの行も保持しません。 + +また、「状態」行が「キャンセル」行より少なくとも2つ以上多い場合、または「キャンセル」行が「状態」行より少なくとも2つ以上多い場合、マージは続行されますが、ClickHouse はこの状況を論理的エラーとして扱い、サーバーログに記録します。このエラーは、同じデータが複数回挿入された場合に発生することがあります。 + +したがって、崩壊は統計計算の結果を変更すべきではありません。 +変更は徐々に折り畳まれ、最終的にはほぼすべてのオブジェクトの最後の状態のみが残ります。 + +`Sign` は必須です。なぜなら、マージアルゴリズムは同じソートキーを持つすべての行が同じ結果のデータパーツや同じ物理サーバー上にあることを保証しないからです。ClickHouse は複数のスレッドで`SELECT`クエリを処理し、結果中の行の順序を予測することはできません。`CollapsingMergeTree` テーブルから完全に「折り畳まれた」データを取得する必要がある場合、集計が必要です。 + +最終的な崩壊を行うには、`GROUP BY` 句と符号を考慮に入れた集計関数を含むクエリを書きます。たとえば、数量を計算する場合は`count()`の代わりに`sum(Sign)`を使用します。何かの合計を計算する場合は`sum(x)`の代わりに`sum(Sign * x)`を使用するなどし、さらに`HAVING sum(Sign) > 0`を追加します。 + +この方法で`count`、`sum`、および`avg`を計算することができます。オブジェクトが折り畳まれない状態を少なくとも1つ持っている場合、`uniq`を計算できます。`CollapsingMergeTree`が折り畳まれた状態の値の履歴を保存しないため、`min`および`max`を計算することはできません。 + +集計なしでデータを抽出する必要がある場合(たとえば、最新の値が特定の条件と一致する行が存在するかどうかを確認する場合)、`FROM`句に`FINAL`修飾子を使用できます。このアプローチは非常に効率が悪いです。 + +## 使用例 {#example-of-use} + +サンプルデータ: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +テーブルの作成: + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews UInt8, + Duration UInt8, + Sign Int8 +) +ENGINE = CollapsingMergeTree(Sign) +ORDER BY UserID +``` + +データの挿入: + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1) +``` + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1),(4324182021466249494, 6, 185, 1) +``` + +我々は2つの`INSERT`クエリを使用して2つの異なるデータパーツを作成しました。1つのクエリでデータを挿入する場合は、ClickHouseは1つのデータパーツを作成し、マージは発生しません。 + +データの取得: + +``` sql +SELECT * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +何を見て、どこで折り畳みが行われるのか? + +2つの`INSERT`クエリを通じて、2つのデータパーツを作成しました。`SELECT`クエリは2つのスレッドで実行され、我々は行のランダムな順序を得ました。折り畳みは発生しませんでした。なぜなら、まだデータパーツのマージが行われていないからです。ClickHouseは予測できない瞬間にデータパーツをマージします。 + +したがって、集計が必要です: + +``` sql +SELECT + UserID, + sum(PageViews * Sign) AS PageViews, + sum(Duration * Sign) AS Duration +FROM UAct +GROUP BY UserID +HAVING sum(Sign) > 0 +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┐ +│ 4324182021466249494 │ 6 │ 185 │ +└─────────────────────┴───────────┴──────────┘ +``` + +集計が必要なくて、強制的に折り畳みを行いたい場合は、`FROM`句に`FINAL`修飾子を使用できます。 + +``` sql +SELECT * FROM UAct FINAL +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +このデータの選択方法は非常に非効率的です。大きなテーブルに対しては使用しないでください。 + +## 別のアプローチの使用例 {#example-of-another-approach} + +サンプルデータ: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ +│ 4324182021466249494 │ -5 │ -146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +マージはキーフィールドのみを考慮するというアイデアです。「キャンセル」行では、`Sign` カラムを使用せずに合計するときに行の前バージョンを相殺する負の値を指定できます。このアプローチでは、負の値を格納できるように`PageViews`,`Duration`のデータ型をUInt8からInt16に変更する必要があります。 + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews Int16, + Duration Int16, + Sign Int8 +) +ENGINE = CollapsingMergeTree(Sign) +ORDER BY UserID +``` + +このアプローチをテストしましょう: + +``` sql +insert into UAct values(4324182021466249494, 5, 146, 1); +insert into UAct values(4324182021466249494, -5, -146, -1); +insert into UAct values(4324182021466249494, 6, 185, 1); + +select * from UAct final; // 本番環境ではfinalの使用を避けてください(テストや小さなテーブルの場合のみ) +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +``` sql +SELECT + UserID, + sum(PageViews) AS PageViews, + sum(Duration) AS Duration +FROM UAct +GROUP BY UserID +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┐ +│ 4324182021466249494 │ 6 │ 185 │ +└─────────────────────┴───────────┴──────────┘ +``` + +``` sql +select count() FROM UAct +``` + +``` text +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +``` sql +optimize table UAct final; + +select * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` diff --git a/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md b/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md new file mode 100644 index 00000000000..7afe33be059 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md @@ -0,0 +1,181 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/custom-partitioning-key +sidebar_position: 30 +sidebar_label: カスタムパーティショニングキー +--- + +# カスタムパーティショニングキー + +:::note +ほとんどの場合、パーティションキーは必要なく、その他多くの場合も月単位以上に詳細なパーティションキーは不要です。 + +あまりに詳細なパーティショニングは絶対に避けてください。データをクライアントIDや名前でパーティショニングしないでください。代わりに、`ORDER BY` 式の最初のカラムとしてクライアントIDや名前を設定してください。 +::: + +パーティショニングは、[MergeTree ファミリーのテーブル](../../../engines/table-engines/mergetree-family/mergetree.md)で利用可能です。これには、[レプリケートテーブル](../../../engines/table-engines/mergetree-family/replication.md)や[マテリアライズドビュー](../../../sql-reference/statements/create/view.md#materialized-view)も含まれます。 + +パーティションとは、指定された基準によってテーブル内のレコードを論理的に組み合わせたものです。月単位、日単位、またはイベントタイプ別など、任意の基準でパーティションを設定できます。それぞれのパーティションは個別に保存され、このデータの操作を簡素化します。データにアクセスする際、ClickHouse は可能な限り最小のパーティションサブセットを使用します。パーティションキーを含むクエリのパフォーマンスは、パーティションによって向上します。ClickHouse はパーツやグラニュールを選択する前に、そのパーティションをフィルタ処理します。 + +パーティションは、[テーブル作成時](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)の `PARTITION BY expr` 句で指定されます。パーティションキーはテーブルのカラムから任意の式を用いることができます。例えば、月別のパーティショニングを指定するには、`toYYYYMM(date_column)` という式を使用します。 + +``` sql +CREATE TABLE visits +( + VisitDate Date, + Hour UInt8, + ClientID UUID +) +ENGINE = MergeTree() +PARTITION BY toYYYYMM(VisitDate) +ORDER BY Hour; +``` + +パーティションキーは、複数の式のタプルにもできます([主キー](../../../engines/table-engines/mergetree-family/mergetree.md#primary-keys-and-indexes-in-queries)と似ています)。例えば: + +``` sql +ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/name', 'replica1', Sign) +PARTITION BY (toMonday(StartDate), EventType) +ORDER BY (CounterID, StartDate, intHash32(UserID)); +``` + +この例では、当週中に発生したイベントタイプでパーティショニングを設定しています。 + +デフォルトでは、浮動小数点のパーティションキーはサポートされていません。使用するには、設定 [allow_floating_point_partition_key](../../../operations/settings/merge-tree-settings.md#allow_floating_point_partition_key) を有効にしてください。 + +新しいデータをテーブルに挿入する際、このデータは主キーでソートされた個別のパーツ(チャンク)として保存されます。挿入から10-15分後に、同じパーティションのパーツが統合されます。 + +:::info +統合はパーティショニング式が同じ値を持つデータパーツに対してのみ機能します。これは、**過剰に詳細なパーティションを作成しないでください**(約1,000パーティション以上)。さもないと、ファイルシステム上のファイル数が不当に多く、オープンファイルディスクリプタが膨大になるため `SELECT` クエリのパフォーマンスが悪くなります。 +::: + +[system.parts](../../../operations/system-tables/parts.md#system_tables-parts) テーブルを使用してテーブルのパーツとパーティションを表示できます。たとえば、月別パーティショニングの `visits` テーブルを持っていると仮定します。`system.parts` テーブルに対して `SELECT` クエリを実行してみましょう。 + +``` sql +SELECT + partition, + name, + active +FROM system.parts +WHERE table = 'visits' +``` + +``` text +┌─partition─┬─name──────────────┬─active─┐ +│ 201901 │ 201901_1_3_1 │ 0 │ +│ 201901 │ 201901_1_9_2_11 │ 1 │ +│ 201901 │ 201901_8_8_0 │ 0 │ +│ 201901 │ 201901_9_9_0 │ 0 │ +│ 201902 │ 201902_4_6_1_11 │ 1 │ +│ 201902 │ 201902_10_10_0_11 │ 1 │ +│ 201902 │ 201902_11_11_0_11 │ 1 │ +└───────────┴───────────────────┴────────┘ +``` + +`partition` カラムにはパーティションの名前が含まれます。この例では、`201901` と `201902` の2つのパーティションがあります。このカラムの値を使用して、[ALTER ... PARTITION](../../../sql-reference/statements/alter/partition.md) クエリでパーティション名を指定できます。 + +`name` カラムにはパーティションデータパーツの名前が含まれます。このカラムを使用して、[ALTER ATTACH PART](../../../sql-reference/statements/alter/partition.md#alter_attach-partition) クエリでパーツの名前を指定できます。 + +パーツ名 `201901_1_9_2_11` の内訳は以下の通りです。 + +- `201901` はパーティション名です。 +- `1` はデータブロックの最小番号です。 +- `9` はデータブロックの最大番号です。 +- `2` はチャンクレベル(生成される MergeTree の深さ)です。 +- `11` は変更バージョン(パーツが変更された場合) + +:::info +古いタイプのテーブルパーツ名は次の形式です:`20190117_20190123_2_2_0`(最小日付 - 最大日付 - 最小ブロック番号 - 最大ブロック番号 - レベル)。 +::: + +`active` カラムはパーツの状態を示します。`1` はアクティブ、`0` は非アクティブです。非アクティブなパーツは、例えば、より大きなパーツに統合された後に残るソースパーツです。破損したデータパーツも非アクティブとして示されます。 + +例で示すように、同じパーティションに属するいくつかの分離されたパーツがあります(例えば、`201901_1_3_1` と `201901_1_9_2`)。これはまだ統合されていない状態を示しています。ClickHouse はデータの挿入から約15分後に、挿入されたデータパーツを定期的に統合します。さらに、[OPTIMIZE](../../../sql-reference/statements/optimize.md) クエリを使用して非スケジュールの統合を行うこともできます。例: + +``` sql +OPTIMIZE TABLE visits PARTITION 201902; +``` + +``` text +┌─partition─┬─name─────────────┬─active─┐ +│ 201901 │ 201901_1_3_1 │ 0 │ +│ 201901 │ 201901_1_9_2_11 │ 1 │ +│ 201901 │ 201901_8_8_0 │ 0 │ +│ 201901 │ 201901_9_9_0 │ 0 │ +│ 201902 │ 201902_4_6_1 │ 0 │ +│ 201902 │ 201902_4_11_2_11 │ 1 │ +│ 201902 │ 201902_10_10_0 │ 0 │ +│ 201902 │ 201902_11_11_0 │ 0 │ +└───────────┴──────────────────┴────────┘ +``` + +非アクティブなパーツは統合から約10分後に削除されます。 + +パーツとパーティションのセットを見る別の方法として、テーブルのディレクトリにアクセスする方法があります:`/var/lib/clickhouse/data///`。例: + +``` bash +/var/lib/clickhouse/data/default/visits$ ls -l +total 40 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 201901_1_3_1 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201901_1_9_2_11 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_8_8_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 15:52 201901_9_9_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_10_10_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201902_11_11_0 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:19 201902_4_11_2_11 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 12:09 201902_4_6_1 +drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 detached +``` + +フォルダー ‘201901_1_1_0’, ‘201901_1_7_1’ などはパーツのディレクトリです。各パーツは対応するパーティションに属し、特定の月(この例のテーブルは月単位でパーティショニングされています)のデータのみを含みます。 + +`detached` ディレクトリには、[DETACH](../../../sql-reference/statements/alter/partition.md#alter_detach-partition) クエリを使用してテーブルから切り離されたパーツが含まれます。破損したパーツも削除の代わりにこのディレクトリに移動されます。サーバーは `detached` ディレクトリのパーツを使用しません。このディレクトリ内のデータはいつでも追加、削除、変更できますが、サーバーは [ATTACH](../../../sql-reference/statements/alter/partition.md#alter_attach-partition) クエリを実行するまでこのことを認識しません。 + +動作中のサーバーでは、ファイルシステム上のパーツやそのデータのセットを手動で変更することはできません。サーバーはそれを認識しないためです。非レプリケートテーブルの場合、サーバーが停止しているときにこれを行うことができますが、お勧めしません。レプリケートテーブルの場合、パーツのセットを変更することはできません。 + +ClickHouse はパーティションに対して操作を行うことができます:削除、別のテーブルへのコピー、バックアップの作成など。すべての操作のリストは[パーティションとパーツの操作](../../../sql-reference/statements/alter/partition.md#alter_manipulations-with-partitions)セクションをご覧ください。 + +## パーティションキーを使用した GROUP BY 最適化 + +テーブルのパーティションキーとクエリの GROUP BY キーの組み合わせによっては、各パーティションごとに独立して集計処理を実行できる可能性があります。 +この場合、すべての実行スレッドの部分的に集計されたデータを最終的にマージする必要がなくなります。 +これは、各 GROUP BY キーの値が異なるスレッドの作業セットに現れないという保証があるためです。 + +典型的な例は以下の通りです: + +``` sql +CREATE TABLE session_log +( + UserID UInt64, + SessionID UUID +) +ENGINE = MergeTree +PARTITION BY sipHash64(UserID) % 16 +ORDER BY tuple(); + +SELECT + UserID, + COUNT() +FROM session_log +GROUP BY UserID; +``` + +:::note +このようなクエリのパフォーマンスは、テーブルのレイアウトに大きく依存します。そのため、この最適化はデフォルトでは有効になっていません。 +::: + +良好なパフォーマンスのための重要な要素: + +- クエリに関与するパーティションの数が十分に大きいこと(`max_threads / 2` より多い)、そうでないとクエリはマシンを十分に利用できません +- パーティションが小さすぎてはいけません。そうでないと、バッチ処理が行ごとの処理に退化します +- パーティションは大きさが比較可能であるべきです。そうすると、すべてのスレッドがほぼ同等の作業量を行います + +:::info +データを均等にパーティション間で分散させるためには、`partition by` 句のカラムにいくつかのハッシュ関数を適用することをお勧めします。 +::: + +関連する設定は次のとおりです: + +- `allow_aggregate_partitions_independently` - 最適化の使用が有効かどうかを制御します +- `force_aggregate_partitions_independently` - 正しさの観点から使用可能な場合だが、内部ロジックによりその実行性が評価されて無効化されている場合に使用を強制します +- `max_number_of_partitions_for_independent_aggregation` - テーブルが保持することができるパーティションの最大数に対する制限 + diff --git a/docs/ja/engines/table-engines/mergetree-family/graphitemergetree.md b/docs/ja/engines/table-engines/mergetree-family/graphitemergetree.md new file mode 100644 index 00000000000..686f04fae6b --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/graphitemergetree.md @@ -0,0 +1,272 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/graphitemergetree +sidebar_position: 90 +sidebar_label: GraphiteMergeTree +--- + +# GraphiteMergeTree + +このエンジンは、[Graphite](http://graphite.readthedocs.io/en/latest/index.html) データの間引きと集計/平均化(ロールアップ)を目的としています。ClickHouseをGraphiteのデータストアとして使用したい開発者にとって役立つかもしれません。 + +ロールアップが不要な場合は、任意のClickHouseテーブルエンジンを使用してGraphiteデータを保存できますが、ロールアップが必要な場合は `GraphiteMergeTree` を使用してください。このエンジンはストレージの容量を削減し、Graphiteからのクエリの効率を向上させます。 + +このエンジンは、[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md)のプロパティを継承しています。 + +## テーブルの作成 {#creating-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + Path String, + Time DateTime, + Value Float64, + Version + ... +) ENGINE = GraphiteMergeTree(config_section) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +[CREATE TABLE](../../../sql-reference/statements/create/table.md#create-table-query)クエリの詳細な説明を参照してください。 + +Graphiteデータのテーブルには、以下のデータ用に以下のカラムが必要です: + +- メトリック名(Graphiteセンサー)。データ型:`String`。 + +- メトリックを計測した時間。データ型:`DateTime`。 + +- メトリックの値。データ型:`Float64`。 + +- メトリックのバージョン。データ型:任意の数値型(ClickHouseは最高バージョンの行または同一バージョンの場合は最後に書き込まれた行を保存します。他の行はデータ部分のマージ中に削除されます)。 + +これらのカラムの名前はロールアップ設定で指定する必要があります。 + +**GraphiteMergeTreeのパラメータ** + +- `config_section` — ロールアップのルールが設定されている設定ファイル内のセクション名。 + +**クエリ句** + +`GraphiteMergeTree` テーブルを作成する際、`MergeTree` テーブルを作成する場合と同様に、同じ[クエリ句](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)が必要です。 + +
+ +非推奨のテーブル作成方法 + +:::note +新しいプロジェクトではこの方法を使用せず、可能であれば古いプロジェクトを上記の方法に切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + EventDate Date, + Path String, + Time DateTime, + Value Float64, + Version + ... +) ENGINE [=] GraphiteMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, config_section) +``` + +`config_section` を除くすべてのパラメータは `MergeTree` と同じ意味を持ちます。 + +- `config_section` — ロールアップのルールが設定されている設定ファイル内のセクション名。 + +
+ +## ロールアップ設定 {#rollup-configuration} + +ロールアップの設定は、サーバー構成内の[graphite_rollup](../../../operations/server-configuration-parameters/settings.md#graphite)パラメータによって定義されます。パラメータ名は任意に設定できます。複数の構成を作成し、異なるテーブルに使用することが可能です。 + +ロールアップ構成の構造: + +``` +required-columns +patterns +``` + +### 必須カラム {#required-columns} + +#### path_column_name + +`path_column_name` — メトリック名(Graphiteセンサー)を保存するカラムの名前。デフォルト値は `Path` です。 + +#### time_column_name +`time_column_name` — メトリックを計測した時間を保存するカラムの名前。デフォルト値は `Time` です。 + +#### value_column_name +`value_column_name` — `time_column_name` に設定された時間におけるメトリックの値を保存するカラムの名前。デフォルト値は `Value` です。 + +#### version_column_name +`version_column_name` — メトリックのバージョンを保存するカラムの名前。デフォルト値は `Timestamp` です。 + +### パターン {#patterns} + +`patterns` セクションの構造: + +``` text +pattern + rule_type + regexp + function +pattern + rule_type + regexp + age + precision + ... +pattern + rule_type + regexp + function + age + precision + ... +pattern + ... +default + function + age + precision + ... +``` + +:::important +パターンは以下の順序で厳密に記述する必要があります: + +1. `function` または `retention` がないパターン。 +2. `function` と `retention` の両方を持つパターン。 +3. `default` パターン。 +::: + +行を処理する際、ClickHouseは`pattern`セクションのルールを確認します。各`pattern`(`default`を含む)セクションには集計用の`function`パラメータ、または`retention`パラメータ、または両方を含むことができます。メトリック名が`regexp`に一致すると、`pattern`セクション(またはセクション)からのルールが適用されます。そうでない場合は`default`セクションからのルールが使用されます。 + +`pattern` と `default` セクション用フィールド: + +- `rule_type` - ルールのタイプ。特定のメトリクスにのみ適用されます。エンジンは、プレーンメトリクスとタグ付きメトリクスを分けるために使用します。オプションのパラメータ。デフォルト値は `all` です。 + パフォーマンスが重要でない場合、または1種類のメトリクスしか使用しない場合(例:プレーンメトリクス)には不要です。デフォルトでは1種類のルールセットのみが作成されます。それ以外の場合、特定のタイプが定義されている場合は、2つの異なるセットが作成されます。1つはプレーンメトリクス用(root.branch.leaf)、もう1つはタグ付きメトリクス用(root.branch.leaf;tag1=value1)です。 + デフォルトルールは両方のセットに組み込まれます。 + 有効な値: + + - `all`(デフォルト)- `rule_type`が省略された場合に使用されるユニバーサルルール。 + - `plain` - プレーンメトリクス用のルール。`regexp`フィールドは正規表現として処理されます。 + - `tagged` - タグ付きメトリクス用のルール(メトリクスは `someName?tag1=value1&tag2=value2&tag3=value3` 形式でDBに保存されます)。正規表現はタグ名によってソートされていなければならず、存在する場合は最初のタグは `__name__` でなければなりません。`regexp`フィールドは正規表現として処理されます。 + - `tag_list` - タグ付きメトリクス用のルール。クリックハウスフォーマットかつ `someName;tag1=value1;tag2=value2` または `someName` または `tag1=value1;tag2=value2` フォーマットで、メトリクスの記述を簡単にするためのDSL。`regexp`フィールドは `tagged` ルールに変換されます。タグ名によるソートは自動的に行われるので不要です。タグの値(名前ではなく)は正規表現として設定できます。例えば `env=(dev|staging)`。 + +- `regexp` – メトリック名のパターン(正規表現またはDSL)。 +- `age` – データの最小年齢(秒単位)。 +- `precision` – データの年齢を秒単位でどの程度正確に定義するか。86400(1日の秒数)の約数である必要があります。 +- `function` – `[age, age + precision]` の範囲内でデータに適用する集約関数の名前。受け入れられる関数:min / max / any / avg。平均は平均の平均として不正確に計算されます。 + +### ルールタイプなしの設定例 {#configuration-example} + +``` xml + + Version + + click_cost + any + + 0 + 5 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + +``` + +### ルールタイプを含む設定例 {#configuration-typed-example} + +``` xml + + Version + + plain + click_cost + any + + 0 + 5 + + + 86400 + 60 + + + + tagged + ^((.*)|.)min\? + min + + 0 + 5 + + + 86400 + 60 + + + + tagged + + min + + 0 + 5 + + + 86400 + 60 + + + + tag_list + someName;tag2=value2 + + 0 + 5 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + +``` + +:::note +データのロールアップはマージ中に実行されます。通常、古いパーティションに対してはマージが開始されないため、ロールアップのためには[optimize](../../../sql-reference/statements/optimize.md)を使用して予定外のマージをトリガーする必要があります。または、[graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer)のような追加ツールを使用してください。 +::: diff --git a/docs/ja/engines/table-engines/mergetree-family/index.md b/docs/ja/engines/table-engines/mergetree-family/index.md new file mode 100644 index 00000000000..cd43f5ff2a0 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/index.md @@ -0,0 +1,17 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/ +sidebar_position: 10 +sidebar_label: MergeTree ファミリー +--- + +# MergeTree エンジンファミリー + +MergeTree ファミリーのテーブルエンジンは、ClickHouse のデータストレージ機能の中核を成しています。これらはカラム型ストレージ、カスタムパーティショニング、スパースな主キーインデックス、データスキップ用のセカンダリインデックスなど、回復力と高性能データ取得のためのほとんどの機能を提供します。 + +基本的な [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) テーブルエンジンは、単一ノードの ClickHouse インスタンスにおけるデフォルトのテーブルエンジンと見なせます。これは汎用性が高く、多くのユースケースに対して実用的です。 + +実運用では、[ReplicatedMergeTree](../../../engines/table-engines/mergetree-family/replication.md) を使用するのが一般的です。これは、通常の MergeTree エンジンのすべての機能に高可用性を追加します。さらにデータ挿入時の自動データ重複排除も行うため、挿入中にネットワークの問題があってもソフトウェアが安全に再試行できます。 + +MergeTree ファミリーの他のエンジンは、特定のユースケースに対して追加機能を提供します。通常、これはバックグラウンドでの追加データ操作として実装されます。 + +MergeTree エンジンの主な欠点は、それが比較的重いことです。そのため、典型的なパターンは、それほど多くのテーブルを持たないことです。例えば、一時データ用に多くの小さなテーブルが必要な場合は、[Log エンジンファミリー](../../../engines/table-engines/log-family/index.md)を検討してください。 diff --git a/docs/ja/engines/table-engines/mergetree-family/invertedindexes.md b/docs/ja/engines/table-engines/mergetree-family/invertedindexes.md new file mode 100644 index 00000000000..b061946bf91 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/invertedindexes.md @@ -0,0 +1,203 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/invertedindexes +sidebar_label: テキスト検索インデックス +description: テキスト内の検索語を迅速に見つけます。 +keywords: [フルテキスト検索, テキスト検索, インデックス, インデックス] +--- + +# フルテキスト検索を使用したテキスト検索インデックス [エクスペリメンタル] + +フルテキストインデックスは、[二次インデックス](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#available-types-of-indices)のエクスペリメンタルなタイプであり、[String](/docs/ja/sql-reference/data-types/string.md)または[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md)カラムの高速テキスト検索機能を提供します。フルテキストインデックスの主なアイデアは、「用語」からこれらの用語を含む行へのマッピングを保持することです。「用語」は文字列カラムのトークン化されたセルです。例えば、文字列セル「I will be a little late」は、デフォルトで6つの用語「I」、「will」、「be」、「a」、「little」、「late」にトークン化されます。別のトークン化手法としてはn-gramがあります。例えば、3-gramトークン化の結果は、「I w」、「wi」、「wil」、「ill」、「ll」、「l b」、「 b」など21の用語になります。入力文字列が細かくトークン化されるほど、生成されるフルテキストインデックスは大きくなりますが、より有用になります。 + +
+ +
+ +:::note +フルテキストインデックスはエクスペリメンタルであり、まだ本番環境で使用するべきではありません。こちらは今後、後方互換性のない方法で変更される可能性があります。例えば、そのDDL/DQL構文やパフォーマンス/圧縮特性に関してです。 +::: + +## 使い方 + +フルテキストインデックスを使用するには、まず設定でそれらを有効にします: + +```sql +SET allow_experimental_full_text_index = true; +``` + +フルテキストインデックスは次のような構文で文字列カラムに定義できます。 + +``` sql +CREATE TABLE tab +( + `key` UInt64, + `str` String, + INDEX inv_idx(str) TYPE full_text(0) GRANULARITY 1 +) +ENGINE = MergeTree +ORDER BY key +``` + +:::note +初期のClickHouseバージョンでは、対応するインデックスタイプ名は`inverted`でした。 +::: + +ここで`N`はトークナイザを指定します: + +- `full_text(0)`(短くして`full_text()`でも可)はトークナイザを「トークン」に設定し、スペースで文字列を分割します。 +- `full_text(N)`で`N`が2から8の間の場合、トークナイザを「ngrams(N)」に設定します。 + +ポスティングリストごとの最大行数は2番目のパラメータで指定できます。このパラメータは、巨大なポスティングリストファイルの生成を防ぐために使用できます。以下のバリエーションがあります: + +- `full_text(ngrams, max_rows_per_postings_list)`: 指定されたmax_rows_per_postings_listを使用(0でない場合) +- `full_text(ngrams, 0)`: ポスティングリストごとの最大行数に制限なし +- `full_text(ngrams)`: デフォルトの最大行数64Kを使用 + +スキッピングインデックスの一種として、フルテキストインデックスは、テーブル作成後にカラムに追加または削除できます: + +``` sql +ALTER TABLE tab DROP INDEX inv_idx; +ALTER TABLE tab ADD INDEX inv_idx(s) TYPE full_text(2); +``` + +インデックスを使用するために特別な関数や構文は必要ありません。典型的な文字列検索述語は自動的にインデックスを活用します。例として以下を考慮してください: + +```sql +INSERT INTO tab(key, str) values (1, 'Hello World'); +SELECT * from tab WHERE str == 'Hello World'; +SELECT * from tab WHERE str IN ('Hello', 'World'); +SELECT * from tab WHERE str LIKE '%Hello%'; +SELECT * from tab WHERE multiSearchAny(str, ['Hello', 'World']); +SELECT * from tab WHERE hasToken(str, 'Hello'); +``` + +フルテキストインデックスは、`Array(String)`、`Array(FixedString)`、`Map(String)`、`Map(String)`タイプのカラムでも機能します。 + +他の二次インデックスと同様に、各カラムパートは独自のフルテキストインデックスを持ちます。さらに、各フルテキストインデックスは内部的に「セグメント」に分割されています。セグメントの存在とサイズは一般的にユーザーに対して透明ですが、セグメントサイズはインデックス構築時のメモリ消費を決定します(例えば、2つのパートが結合されたとき)。設定パラメータ「max_digestion_size_per_segment」(デフォルトでは256 MB)は、新しいセグメントが作成される前に使用される基盤となるカラムから消費されるデータの量を制御します。パラメータを増やすとインデックス構築の中間メモリ消費が増えますが、検索パフォーマンスを改善し、平均的にクエリを評価するためにチェックするセグメント数が少なくなります。 + +## Hacker Newsデータセットのフルテキスト検索 + +大量のテキストを持つ大規模データセットでのフルテキストインデックスのパフォーマンス改善を見てみましょう。人気のあるHacker Newsウェブサイトのコメント28.7M行を使用します。フルテキストインデックスを持たないテーブルは以下のとおりです: + +```sql +CREATE TABLE hackernews ( + id UInt64, + deleted UInt8, + type String, + author String, + timestamp DateTime, + comment String, + dead UInt8, + parent UInt64, + poll UInt64, + children Array(UInt32), + url String, + score UInt32, + title String, + parts Array(UInt32), + descendants UInt32 +) +ENGINE = MergeTree +ORDER BY (type, author); +``` + +28.7M行はS3にあるParquetファイルに入っています - それらを`hackernews`テーブルに挿入しましょう: + +```sql +INSERT INTO hackernews + SELECT * FROM s3Cluster( + 'default', + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/hackernews/hacknernews.parquet', + 'Parquet', + ' + id UInt64, + deleted UInt8, + type String, + by String, + time DateTime, + text String, + dead UInt8, + parent UInt64, + poll UInt64, + kids Array(UInt32), + url String, + score UInt32, + title String, + parts Array(UInt32), + descendants UInt32'); +``` + +`comment`カラムに「ClickHouse」という用語(とその大文字小文字のバリエーション)を検索する以下のシンプルな検索を考えてみましょう: + +```sql +SELECT count() +FROM hackernews +WHERE hasToken(lower(comment), 'clickhouse'); +``` + +クエリの実行には3秒かかります: + +```response +┌─count()─┐ +│ 1145 │ +└─────────┘ + +1 row in set. Elapsed: 3.001 sec. Processed 28.74 million rows, 9.75 GB (9.58 million rows/s., 3.25 GB/s.) +``` + +`ALTER TABLE`を使用して`comment`カラムの小文字版にフルテキストインデックスを追加し、それをマテリアライズします(時間がかかるかもしれません - マテリアライズするのを待ちます): + +```sql +ALTER TABLE hackernews + ADD INDEX comment_lowercase(lower(comment)) TYPE full_text; + +ALTER TABLE hackernews MATERIALIZE INDEX comment_lowercase; +``` + +同じクエリを実行すると... + +```sql +SELECT count() +FROM hackernews +WHERE hasToken(lower(comment), 'clickhouse') +``` + +...クエリ実行時間が4倍速くなります: + +```response +┌─count()─┐ +│ 1145 │ +└─────────┘ + +1 row in set. Elapsed: 0.747 sec. Processed 4.49 million rows, 1.77 GB (6.01 million rows/s., 2.37 GB/s.) +``` + +また、複数の用語のうち一つまたは全てを検索することもできます。例えば、ORやAND条件です: + +```sql +-- 複数のOR条件 +SELECT count(*) +FROM hackernews +WHERE multiSearchAny(lower(comment), ['oltp', 'olap']); + +-- 複数のAND条件 +SELECT count(*) +FROM hackernews +WHERE hasToken(lower(comment), 'avx') AND hasToken(lower(comment), 'sve'); +``` + +:::note +他の二次インデックスと異なり、フルテキストインデックスは(現状では)グラニュールIDではなく行番号(行ID)にマップされています。このデザインの理由はパフォーマンスによるものです。実際、ユーザーは複数の用語を一度に検索することが多いです。例えば、フィルタ条件`WHERE s LIKE '%little%' OR s LIKE '%big%'`は、「little」および「big」の行IDリストの合計を形成して、フルテキストインデックスを直接使用して評価できます。これは、インデックス作成時に指定された`GRANULARITY`パラメータに意味がないことを意味し、将来的に構文から削除される可能性があります。 +::: + +## 関連コンテンツ + +- ブログ: [ClickHouseでのインバーテッドインデックスの紹介](https://clickhouse.com/blog/clickhouse-search-with-inverted-indices) diff --git a/docs/ja/engines/table-engines/mergetree-family/mergetree.md b/docs/ja/engines/table-engines/mergetree-family/mergetree.md new file mode 100644 index 00000000000..435345a3877 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/mergetree.md @@ -0,0 +1,1068 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/mergetree +sidebar_position: 11 +sidebar_label: MergeTree +--- + +# MergeTree + +`MergeTree`エンジンおよび`MergeTree`ファミリーの他のエンジン(例えば、`ReplacingMergeTree`、`AggregatingMergeTree`)は、ClickHouseで最も一般的に使用され、最も堅牢なテーブルエンジンです。 + +`MergeTree`ファミリーのテーブルエンジンは、高いデータ取り込み速度と膨大なデータ量を処理するために設計されています。 +データの挿入操作はテーブルのパーツを作成し、これらのパーツはバックグラウンドプロセスで他のテーブルパーツとマージされます。 + +`MergeTree`ファミリーのテーブルエンジンの主な特徴: + +- テーブルの主キーは、各テーブルパーツ内のソート順を決定します(クラスター化インデックス)。主キーは8192行のブロック(グラニュールと呼ばれる)を参照し、個々の行を参照しません。これにより、大規模なデータセットの主キーがメインメモリに保持できるほど小さくなる一方で、ディスクに保存されたデータへの迅速なアクセスを提供します。 + +- テーブルは任意のパーティション式を使用してパーティションを分けることができます。パーティションプルーニングにより、クエリが許す場合に読み取りからパーティションを除外できます。 + +- データは高可用性、フェイルオーバー、ダウンタイムゼロでのアップグレードのために複数のクラスターのノードにまたがってレプリケートできます。[データレプリケーション](/docs/ja/engines/table-engines/mergetree-family/replication.md)を参照してください。 + +- `MergeTree`テーブルエンジンは、クエリ最適化を支援するために様々な統計情報やサンプリング方法をサポートします。 + +:::note +似た名前ですが、[Merge](/docs/ja/engines/table-engines/special/merge.md/#merge)エンジンは`*MergeTree`エンジンとは異なります。 +::: + +## テーブルの作成 {#table_engine-mergetree-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [[NOT] NULL] [DEFAULT|MATERIALIZED|ALIAS|EPHEMERAL expr1] [COMMENT ...] [CODEC(codec1)] [STATISTICS(stat1)] [TTL expr1] [PRIMARY KEY] [SETTINGS (name = value, ...)], + name2 [type2] [[NOT] NULL] [DEFAULT|MATERIALIZED|ALIAS|EPHEMERAL expr2] [COMMENT ...] [CODEC(codec2)] [STATISTICS(stat2)] [TTL expr2] [PRIMARY KEY] [SETTINGS (name = value, ...)], + ... + INDEX index_name1 expr1 TYPE type1(...) [GRANULARITY value1], + INDEX index_name2 expr2 TYPE type2(...) [GRANULARITY value2], + ... + PROJECTION projection_name_1 (SELECT [GROUP BY] [ORDER BY]), + PROJECTION projection_name_2 (SELECT [GROUP BY] [ORDER BY]) +) ENGINE = MergeTree() +ORDER BY expr +[PARTITION BY expr] +[PRIMARY KEY expr] +[SAMPLE BY expr] +[TTL expr + [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ] + [WHERE conditions] + [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ] +[SETTINGS name = value, ...] +``` + +パラメータの詳細な説明は、[CREATE TABLE](/docs/ja/sql-reference/statements/create/table.md)ステートメントを参照してください。 + +### クエリ句 {#mergetree-query-clauses} + +#### ENGINE + +`ENGINE` — エンジンの名前とパラメータ。`ENGINE = MergeTree()`。`MergeTree`エンジンにはパラメータはありません。 + +#### ORDER_BY + +`ORDER BY` — ソートキー。 + +カラム名や任意の式のタプル。例: `ORDER BY (CounterID + 1, EventDate)`。 + +主キーが定義されていない場合(つまり、`PRIMARY KEY`が指定されていない場合)、ClickHouseはソートキーを主キーとして使用します。 + +ソートの必要がない場合は、`ORDER BY tuple()`という構文を使用できます。 +また、`create_table_empty_primary_key_by_default`設定を有効にすると、`CREATE TABLE`ステートメントに`ORDER BY tuple()`が暗黙的に追加されます。[主キーの選択](#selecting-a-primary-key)を参照してください。 + +#### PARTITION BY + +`PARTITION BY` — [パーティションキー](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md)。オプションです。多くの場合、パーティションキーは必要ありませんが、パーティション分けが必要な場合でも一般的には月ごとのパーティションキー以上の粒度が必要ありません。パーティション分けはクエリを速くするものではありません(`ORDER BY`式とは対照的に)。過度に細かいパーティション分けは避ける必要があります。クライアントの識別子や名前でデータをパーティション分けしないでください(代わりにクライアントの識別子または名前を`ORDER BY`式の最初のカラムに設定してください)。 + +月によるパーティション分けには、`toYYYYMM(date_column)`式を使用します。ここで`date_column`は[Date](/docs/ja/sql-reference/data-types/date.md)型の日付を持つカラムです。パーティション名は`"YYYYMM"`形式になります。 + +#### PRIMARY KEY + +`PRIMARY KEY` — [ソートキーと異なる主キーを選択する](#choosing-a-primary-key-that-differs-from-the-sorting-key)場合の主キー。オプションです。 + +ソートキーを指定する(`ORDER BY`句を使用する)ことで、暗黙的に主キーが指定されます。 +ソートキーに加えて主キーを指定する必要は通常ありません。 + +#### SAMPLE BY + +`SAMPLE BY` — サンプリング式。オプションです。 + +指定されている場合は、主キーに含まれている必要があります。 +サンプリング式は符号なし整数を結果とする必要があります。 + +例: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`。 + +#### TTL + +`TTL` — 行の保存期間と自動パーツ移動のロジックを指定するルールのリスト [ディスクとボリューム間](#table_engine-mergetree-multiple-volumes)。オプションです。 + +式は`Date`または`DateTime`である必要があります。例として `TTL date + INTERVAL 1 DAY`。 + +ルールの種類`DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'|GROUP BY`は、式が満たされた場合(現在時刻に達する)、そのパートに対して行われるアクションを指定します:期限切れの行の削除、特定ディスクへのパートの移動(`TO DISK 'xxx'`)、またはボリューム(`TO VOLUME 'xxx'`)への移動、または期限切れ行の集計。デフォルトのルールタイプは削除(`DELETE`)です。複数のルールを設定できますが、`DELETE`ルールは1つだけにする必要があります。 + +詳細については、[カラムとテーブルのTTL](#table_engine-mergetree-ttl)を参照してください。 + +#### SETTINGS + +[MergeTree設定](../../../operations/settings/merge-tree-settings.md)を参照してください。 + +**セクション設定の例** + +``` sql +ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192 +``` + +例では、月によるパーティション分けを設定しています。 + +また、ユーザーIDでのハッシュとしてサンプリングの式も設定しています。これにより、各`CounterID`および`EventDate`のためのテーブル内のデータを疑似ランダムに化すことができます。データの選択時に[SAMPLE](/docs/ja/sql-reference/statements/select/sample.md/#select-sample-clause)句を定義する場合、ClickHouseはユーザーのサブセットに対して均一な疑似ランダムデータサンプルを返します。 + +`index_granularity`設定は省略可能です。デフォルト値は8192です。 + +
+ +テーブル作成の非推奨メソッド + +:::note +新しいプロジェクトでこの方法を使用しないでください。可能であれば、古いプロジェクトを上記の方法に切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity) +``` + +**MergeTree()のパラメータ** + +- `date-column` — [Date](/docs/ja/sql-reference/data-types/date.md)型のカラム名。ClickHouseはこのカラムに基づいて月ごとにパーティションを自動作成します。パーティション名は`"YYYYMM"`形式です。 +- `sampling_expression` — サンプリングのための式。 +- `(primary, key)` — 主キー。型:[Tuple()](/docs/ja/sql-reference/data-types/tuple.md) +- `index_granularity` — インデックスの粒度。インデックスの「マーク」の間のデータ行数。8192という値は、ほとんどのタスクに適しています。 + +**例** + +``` sql +MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192) +``` + +`MergeTree`エンジンは、上記の主要エンジン設定方法の例と同じ方法で構成されます。 +
+ +## データストレージ {#mergetree-data-storage} + +テーブルは、主キーでソートされたデータパートから構成されます。 + +テーブルにデータが挿入されると、個別のデータパートが作成され、それぞれが主キーで辞書順にソートされます。例えば、主キーが`(CounterID, Date)`の場合、パート内のデータは`CounterID`でソートされ、各`CounterID`内で`Date`で並べ替えられます。 + +異なるパーティションに属するデータは、異なるパートに分離されます。バックグラウンドで、ClickHouseはデータパートをマージして、より効率的に保管します。異なるパーティションに属するパーツはマージされません。マージメカニズムは、同じ主キーを持つ全ての行が同じデータパートに含まれることを保証しません。 + +データパートは`Wide`または`Compact`フォーマットで保存できます。`Wide`フォーマットでは、各カラムはファイルシステム内の別々のファイルに保存され、`Compact`フォーマットでは全てのカラムが1つのファイルに保存されます。`Compact`フォーマットは、小規模で頻繁な挿入のパフォーマンスを向上させるために使用できます。 + +データの保存フォーマットは、テーブルエンジンの`min_bytes_for_wide_part`と`min_rows_for_wide_part`設定によって制御されます。データパートのバイトまたは行数が対応する設定値より少ない場合、パートは`Compact`フォーマットで保存されます。それ以外の場合は`Wide`フォーマットで保存されます。これらの設定が設定されていない場合、データパートは`Wide`フォーマットで保存されます。 + +各データパートは、論理的にグラニュールに分割されます。グラニュールは、ClickHouseがデータを選択する際に読み取る最小の不可分データセットです。ClickHouseは行や値を分割しないため、各グラニュールには常に整数の行数が含まれます。グラニュールの最初の行は、その行の主キーの値でマークされています。各データパートについて、ClickHouseはインデックスファイルを作成し、マークを保存します。プライマリキーにあるかどうかにかかわらず、各カラムについても同様のマークが保存されます。これらのマークにより、カラムファイル内のデータを直接見つけることができます。 + +グラニュールのサイズは、テーブルエンジンの`index_granularity`と`index_granularity_bytes`設定によって制限されます。グラニュール内の行の数は`[1, index_granularity]`範囲内にあり、行のサイズによって異なります。グラニュールのサイズは、単一の行のサイズが設定値より大きい場合、`index_granularity_bytes`を超えることがあります。この場合、グラニュールのサイズは行のサイズに等しくなります。 + +## クエリでの主キーとインデックス {#primary-keys-and-indexes-in-queries} + +例えば、`(CounterID, Date)`の主キーを考えます。この場合、ソートとインデックスは次のように図示されます: + + 全データ: [---------------------------------------------] + CounterID: [aaaaaaaaaaaaaaaaaabbbbcdeeeeeeeeeeeeefgggggggghhhhhhhhhiiiiiiiiikllllllll] + Date: [1111111222222233331233211111222222333211111112122222223111112223311122333] + マーク: | | | | | | | | | | | + a,1 a,2 a,3 b,3 e,2 e,3 g,1 h,2 i,1 i,3 l,3 + マーク番号: 0 1 2 3 4 5 6 7 8 9 10 + +データクエリが次を指定している場合: + +- `CounterID in ('a', 'h')`、サーバーはマークの範囲`[0, 3)`と`[6, 8)`のデータを読み取ります。 +- `CounterID IN ('a', 'h') AND Date = 3`、サーバーはマークの範囲`[1, 3)`と`[7, 8)`のデータを読み取ります。 +- `Date = 3`、サーバーはマークの範囲`[1, 10]`のデータを読み取ります。 + +上記の例は、フルスキャンよりもインデックスを使用する方が常に効果的であることを示しています。 + +訳注: + +スパースインデックスは、追加のデータを読み取ることを許可します。プライマリキーの単一範囲を読み取る際に、データブロックごとに最大`index_granularity * 2`の追加行を読み取ることができます。 + +スパースインデックスにより、大量のテーブル行を使用することができます。なぜなら、ほとんどの場合、このようなインデックスはコンピューターのRAMに収まるからです。 + +ClickHouseは一意のプライマリキーを必要としません。同じプライマリキーを持つ複数の行を挿入できます。 + +`Nullable`型の式を`PRIMARY KEY`と`ORDER BY`句に使用できますが、強く推奨されません。この機能を許可するには、[allow_nullable_key](/docs/ja/operations/settings/settings.md/#allow-nullable-key)設定をオンにします。`ORDER BY`句における`NULL`値には[NULLS_LAST](/docs/ja/sql-reference/statements/select/order-by.md/#sorting-of-special-values)原則が適用されます。 + +### 主キーの選択 {#selecting-a-primary-key} + +主キーに含まれるカラムの数に明示的な制限はありません。データ構造によって、プライマリキーに多くのカラムを含めることも、少ないカラムを含めることもできます。これにより以下のことが可能です: + +- インデックスのパフォーマンスを向上させる。 + + 主キーが`(a, b)`の場合、以下の条件が満たされると、追加のカラム`c`を追加することでパフォーマンスが向上します: + + - カラム`c`に対する条件を持つクエリが存在する。 + - `(a, b)`の値が同一の長いデータ範囲(`index_granularity`の数倍程度の長さ)が一般的である。つまり、長いデータ範囲をスキップできる場合に、追加のカラムを追加する意味があります。 + +- データ圧縮の向上。 + + ClickHouseはプライマリキーによってデータをソートするため、一貫性が高いほど、圧縮が向上します。 + +- [CollapsingMergeTree](/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md/#table_engine-collapsingmergetree)および[SummingMergeTree](/docs/ja/engines/table-engines/mergetree-family/summingmergetree.md)エンジンでデータパーツをマージする際の追加ロジックを提供します。 + + この場合、主キーとは異なる*ソートキー*を指定することには意義があります。 + +長いプライマリキーは挿入パフォーマンスとメモリ消費に悪影響を与えますが、追加のカラムは`SELECT`クエリのパフォーマンスには影響しません。 + +`ORDER BY tuple()`構文を使用して、プライマリキーなしのテーブルを作成することができます。この場合、ClickHouseは挿入の順序でデータを保存します。`INSERT ... SELECT`クエリでデータを挿入するときにデータの順序を保持したい場合は、[max_insert_threads = 1](/docs/ja/operations/settings/settings.md/#max-insert-threads)を設定します。 + +初期の順序でデータを選択するには、[単一スレッド](/docs/ja/operations/settings/settings.md/#max_threads)の`SELECT`クエリを使用します。 + +### ソートキーと異なる主キーの選択 {#choosing-a-primary-key-that-differs-from-the-sorting-key} + +プライマリキー(マークごとにインデックスファイルに書き込まれる値の式)が、ソートキー(データパーツ内の行をソートするための式)と異なる場合に指定することができます。この場合、プライマリキーの式タプルはソートキーの式タプルのプレフィックスである必要があります。 + +この機能は[SummingMergeTree](/docs/ja/engines/table-engines/mergetree-family/summingmergetree.md)や[AggregatingMergeTree](/docs/ja/engines/table-engines/mergetree-family/aggregatingmergetree.md)のエンジンで使用する際に役立ちます。通常、これらのエンジンを使用する場合、テーブルには*ディメンション*と*メジャー*の2種類のカラムがあります。典型的なクエリでは、ディメンションを`GROUP BY`およびフィルタリングして、メジャーカラムの値を集計します。SummingMergeTreeとAggregatingMergeTreeは、ソートキーの値が同じ行を集計するため、ディメンションの全てをソートキーに追加するのは自然です。この結果、キーの式は長いカラムリストとなり、新たに追加されたディメンションで頻繁に更新する必要があります。 + +この場合、効率的な範囲スキャンを提供する少数のカラムだけをプライマリキーに残し、残りのディメンションカラムをソートキータプルに追加するのが賢明です。 + +ソートキーの[ALTER](/docs/ja/sql-reference/statements/alter/index.md)は軽量な操作です。新しいカラムがテーブルに追加され、同時にソートキーに追加されるとき、既存のデータパーツを変更する必要はありません。古いソートキーが新しいソートキーのプレフィックスであり、新しく追加されたカラムに既存のデータがないため、テーブル変更の瞬間にデータは両方の古いと新しいソートキーでソートされます。 + +### クエリにおけるインデックスとパーティションの利用 {#use-of-indexes-and-partitions-in-queries} + +`SELECT`クエリに対して、ClickHouseはインデックスが使用可能かどうかを分析します。インデックスは、`WHERE/PREWHERE`句にプライマリキーまたはパーティションキーに含まれるカラムや式、またはこれらの特定の部分的に繰り返される関数が含まれる場合に使用可能です。また、これらの式やそれらの論理的な関係が含まれる場合に使用されます。 + +したがって、プライマリキーの1つまたは複数の範囲でクエリを迅速に実行することが可能です。この例では、特定のトラッキングタグ、特定のタグと日付範囲、特定のタグと日付、複数のタグと日付範囲などに対するクエリが高速になります。 + +次のようにエンジンが設定されている場合を見てみましょう: +```sql +ENGINE MergeTree() +PARTITION BY toYYYYMM(EventDate) +ORDER BY (CounterID, EventDate) +SETTINGS index_granularity=8192 +``` + +この場合、クエリでは: + +``` sql +SELECT count() FROM table +WHERE EventDate = toDate(now()) +AND CounterID = 34 + +SELECT count() FROM table +WHERE EventDate = toDate(now()) +AND (CounterID = 34 OR CounterID = 42) + +SELECT count() FROM table +WHERE ((EventDate >= toDate('2014-01-01') +AND EventDate <= toDate('2014-01-31')) OR EventDate = toDate('2014-05-01')) +AND CounterID IN (101500, 731962, 160656) +AND (CounterID = 101500 OR EventDate != toDate('2014-05-01')) +``` + +ClickHouseはプライマリキーインデックスを使用して不適切なデータをトリムし、月ごとのパーティションキーを使用して不適切な日付範囲のパーティションをトリムします。 + +上記のクエリは、複雑な式でもインデックスが使用されることを示しています。テーブルからの読み取りは、インデックスの使用がフルスキャンより遅くなることがないように整理されています。 + +以下の例では、インデックスを使用できません。 + +``` sql +SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%upyachka%' +``` + +クエリを実行する際にClickHouseがインデックスを使用できるかどうかを確認するために、[force_index_by_date](/docs/ja/operations/settings/settings.md/#force_index_by_date)および[force_primary_key](/docs/ja/operations/settings/settings.md/#force-primary-key)設定を使用してください。 + +月ごとのパーティションでパーティション分けを行うキーは、適切な範囲のデータブロックのみを読み取ることを可能にします。この場合、データブロックには多くの日付(場合によっては丸ごと月まで)が含まれることがあります。ブロック内では、データはプライマリキーで並べ替えられますが、日付が最初のカラムとして含まれていない可能性があります。したがって、プライマリキーのプレフィックスを指定しないただの日付条件でのクエリの使用は、単一の日付よりも多くのデータを読み取る原因となります。 + +### 部分的に単調なプライマリキーのインデックス使用 {#use-of-index-for-partially-monotonic-primary-keys} + +例えば、月の日数を考えてみましょう。一ヶ月に対しては[単調なシーケンス](https://en.wikipedia.org/wiki/Monotonic_function)を形成しますが、より長い期間に対しては単調ではありません。これは部分的に単調なシーケンスです。ユーザーが部分的に単調なプライマリキーでテーブルを作成した場合、ClickHouseは通常のようにスパースインデックスを作成します。ユーザーがこの種のテーブルからデータを選択する際、ClickHouseはクエリ条件を分析します。ユーザーがインデックスの2つのマーク間のデータを取得し、両マークが1ヶ月内に収まる場合、ClickHouseはこの特定のケースでインデックスを使用できます。なぜなら、クエリパラメータとインデックスマーク間の距離を計算できるからです。 + +ClickHouseは、クエリパラメータ範囲内のプライマリキーの値が単調シーケンスを表していない場合、インデックスを使用できません。この場合、ClickHouseはフルスキャンメソッドを使用します。 + +ClickHouseは、このロジックを月の日シーケンスだけでなく、部分的に単調なシーケンスを表すあらゆるプライマリキーに対しても使用します。 + +### データスキッピングインデックス {#table_engine-mergetree-data_skipping-indexes} + +インデックス宣言は`CREATE`クエリのカラムセクションで行われます。 + +``` sql +INDEX index_name expr TYPE type(...) [GRANULARITY granularity_value] +``` + +`*MergeTree`ファミリーのテーブルでは、データスキッピングインデックスを指定できます。 + +これらのインデックスは、グランラリティ値`granularity_value`のグラニュールで構成されたブロック上で指定された式についての情報を集計し、集計結果を`SELECT`クエリで使用して、クエリが満たすことができない大きなデータブロックをスキップすることでディスクから読み取るデータ量を削減します。 + +`GRANULARITY`句は省略可能で、`granularity_value`のデフォルト値は1です。 + +**例** + +``` sql +CREATE TABLE table_name +( + u64 UInt64, + i32 Int32, + s String, + ... + INDEX idx1 u64 TYPE bloom_filter GRANULARITY 3, + INDEX idx2 u64 * i32 TYPE minmax GRANULARITY 3, + INDEX idx3 u64 * length(s) TYPE set(1000) GRANULARITY 4 +) ENGINE = MergeTree() +... +``` + +例に示されているインデックスは、以下のクエリにおいてディスクから読み取るデータ量を削減するためにClickHouseによって利用されることがあります: + +``` sql +SELECT count() FROM table WHERE u64 == 10; +SELECT count() FROM table WHERE u64 * i32 >= 1234 +SELECT count() FROM table WHERE u64 * length(s) == 1234 +``` + +データスキッピングインデックスは、複合集合カラムに対しても作成することができます: + +```sql +-- Map型のカラムに対して: +INDEX map_key_index mapKeys(map_column) TYPE bloom_filter +INDEX map_value_index mapValues(map_column) TYPE bloom_filter + +-- Tuple型のカラムに対して: +INDEX tuple_1_index tuple_column.1 TYPE bloom_filter +INDEX tuple_2_index tuple_column.2 TYPE bloom_filter + +-- Nested型のカラムに対して: +INDEX nested_1_index col.nested_col1 TYPE bloom_filter +INDEX nested_2_index col.nested_col2 TYPE bloom_filter +``` + +### 使用可能なインデックスタイプ {#available-types-of-indices} + +#### MinMax + +指定された式の極値を保存します(もし式が`tuple`の場合は、`tuple`の各要素の極値を保存します)。保存された情報を利用して、プライマリキーのようにデータブロックをスキップします。 + +構文: `minmax` + +#### Set + +指定された式のユニークな値を保存します(最大行数が`max_rows`行で、`max_rows=0`は「制限なし」を意味します)。その値を使用して、`WHERE`式がデータブロックで満たせない場合を確認します。 + +構文: `set(max_rows)` + +#### ブルームフィルタ + +指定されたカラムに対して[ブルームフィルタ](https://en.wikipedia.org/wiki/Bloom_filter)を保存します。オプションの`false_positive`パラメータは、0から1の値でフィルタから偽陽性の応答を受け取る確率を指定します。デフォルト値: 0.025。サポートされているデータ型: `Int*`、 `UInt*`、 `Float*`、 `Enum`、 `Date`、 `DateTime`、 `String`、 `FixedString`、 `Array`、 `LowCardinality`、 `Nullable`、 `UUID`、 `Map`。`Map`データ型に対しては、クライアントは[mapKeys](/docs/ja/sql-reference/functions/tuple-map-functions.md/#mapkeys)または[mapValues](/docs/ja/sql-reference/functions/tuple-map-functions.md/#mapvalues)関数を使用して、キーまたは値に対してインデックスを作成すべきかを指定できます。 + +構文: `bloom_filter([false_positive])` + +#### N-gramブルームフィルタ + +ブロックデータから全てのn-gramを含む[ブルームフィルタ](https://en.wikipedia.org/wiki/Bloom_filter)を保存します。データ型が[String](/docs/ja/sql-reference/data-types/string.md)、[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md)、[Map](/docs/ja/sql-reference/data-types/map.md)に対応します。`EQUALS`、`LIKE`、`IN`式の最適化に使用できます。 + +構文: `ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)` + +- `n` — ngramのサイズ、 +- `size_of_bloom_filter_in_bytes` — ブルームフィルタのサイズ(大きな値を使用できます。例えば、256または512は圧縮効率が良いです)。 +- `number_of_hash_functions` — ブルームフィルタで使用されるハッシュ関数の数。 +- `random_seed` — ブルームフィルタのハッシュ関数のシード。 + +ユーザーは`ngrambf_v1`のパラメータセットを推定するために[UDF](/docs/ja/sql-reference/statements/create/function.md)を作成できます。以下に示すクエリ文を実行します: + +```sql +CREATE FUNCTION bfEstimateFunctions [ON CLUSTER cluster] +AS +(total_number_of_all_grams, size_of_bloom_filter_in_bits) -> round((size_of_bloom_filter_in_bits / total_number_of_all_grams) * log(2)); + +CREATE FUNCTION bfEstimateBmSize [ON CLUSTER cluster] +AS +(total_number_of_all_grams, probability_of_false_positives) -> ceil((total_number_of_all_grams * log(probability_of_false_positives)) / log(1 / pow(2, log(2)))); + +CREATE FUNCTION bfEstimateFalsePositive [ON CLUSTER cluster] +AS +(total_number_of_all_grams, number_of_hash_functions, size_of_bloom_filter_in_bytes) -> pow(1 - exp(-number_of_hash_functions/ (size_of_bloom_filter_in_bytes / total_number_of_all_grams)), number_of_hash_functions); + +CREATE FUNCTION bfEstimateGramNumber [ON CLUSTER cluster] +AS +(number_of_hash_functions, probability_of_false_positives, size_of_bloom_filter_in_bytes) -> ceil(size_of_bloom_filter_in_bytes / (-number_of_hash_functions / log(1 - exp(log(probability_of_false_positives) / number_of_hash_functions)))) + +``` +それらの関数を使用するためには、少なくとも2つのパラメータを指定する必要があります。 +例えば、グラニュールで4300ngramがあり、偽陽性を0.0001以下に予期している場合です。他のパラメーターは以下のクエリを実行することで推定できます: + +```sql +--- フィルタ内のビット数を推定 +SELECT bfEstimateBmSize(4300, 0.0001) / 8 as size_of_bloom_filter_in_bytes; + +┌─size_of_bloom_filter_in_bytes─┐ +│ 10304 │ +└───────────────────────────────┘ + +--- ハッシュ関数の数を推定 +SELECT bfEstimateFunctions(4300, bfEstimateBmSize(4300, 0.0001)) as number_of_hash_functions + +┌─number_of_hash_functions─┐ +│ 13 │ +└──────────────────────────┘ + +``` +もちろん、これらの関数を使用して、他の条件に基づいたパラメータの推定も可能です。 +これら関数の内容は[こちら](https://hur.st/bloomfilter)を参照してください。 + +#### トークンブルームフィルタ + +`ngrambf_v1`と同様だが、トークンを格納します。トークンは非英数字文字で区切られた文字列です。 + +構文: `tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)` + +#### 特殊目的 + +- 近似最近隣(ANN)検索をサポートするためのエクスペリメンタルなインデックス。詳細は[こちら](annindexes.md)を参照してください。 +- フルテキスト検索をサポートするためのエクスペリメンタルなフルテキストインデックス。詳細は[こちら](invertedindexes.md)を参照してください。 + +### サポートされている機能 {#functions-support} + +`WHERE`句の条件は、カラムを操作する関数の呼び出しを含みます。カラムがインデックスの一部である場合、ClickHouseは関数を実行する際にこのインデックスを利用しようとします。ClickHouseはインデックスに対して異なる関数のサブセットをサポートしています。 + +`set`型のインデックスは、すべての関数によって利用可能です。他のインデックスタイプは次のようにサポートされています: + +| 関数(オペレーター)/ インデックス | プライマリキー | minmax | ngrambf_v1 | tokenbf_v1 | bloom_filter | full_text | +|--------------------------------------------------------------------------------------------------|-------------|--------|------------|------------|--------------|-----------| +| [equals (=, ==)](/docs/ja/sql-reference/functions/comparison-functions.md/#equals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | +| [notEquals(!=, <>)](/docs/ja/sql-reference/functions/comparison-functions.md/#notequals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | +| [like](/docs/ja/sql-reference/functions/string-search-functions.md/#like) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | +| [notLike](/docs/ja/sql-reference/functions/string-search-functions.md/#notlike) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | +| [match](/docs/ja/sql-reference/functions/string-search-functions.md/#match) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | +| [startsWith](/docs/ja/sql-reference/functions/string-functions.md/#startswith) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | +| [endsWith](/docs/ja/sql-reference/functions/string-functions.md/#endswith) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | +| [multiSearchAny](/docs/ja/sql-reference/functions/string-search-functions.md/#multisearchany) | ✗ | ✗ | ✔ | ✗ | ✗ | ✔ | +| [in](/docs/ja/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | +| [notIn](/docs/ja/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | +| [less (<)](/docs/ja/sql-reference/functions/comparison-functions.md/#less) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [greater (>)](/docs/ja/sql-reference/functions/comparison-functions.md/#greater) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [lessOrEquals (<=)](/docs/ja/sql-reference/functions/comparison-functions.md/#lessorequals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [greaterOrEquals (>=)](/docs/ja/sql-reference/functions/comparison-functions.md/#greaterorequals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [empty](/docs/ja/sql-reference/functions/array-functions/#empty) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [notEmpty](/docs/ja/sql-reference/functions/array-functions/#notempty) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | +| [has](/docs/ja/sql-reference/functions/array-functions/#has) | ✗ | ✗ | ✔ | ✔ | ✔ | ✔ | +| [hasAny](/docs/ja/sql-reference/functions/array-functions/#hasany) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | +| [hasAll](/docs/ja/sql-reference/functions/array-functions/#hasall) | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | +| hasToken | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | +| hasTokenOrNull | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | +| hasTokenCaseInsensitive (*) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | +| hasTokenCaseInsensitiveOrNull (*) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | + +定数引数のある関数で、ngramサイズより小さいものは`ngrambf_v1`によってクエリ最適化には使用できません。 + +(*) `hasTokenCaseInsensitive`および`hasTokenCaseInsensitiveOrNull`が効果的であるためには、`tokenbf_v1`インデックスが小文字化されたデータに対して作成される必要があります。例えば`INDEX idx (lower(str_col)) TYPE tokenbf_v1(512, 3, 0)`。 + +:::note +ブルームフィルタは偽陽性マッチを持つ可能性があるため、`ngrambf_v1`、`tokenbf_v1`、`bloom_filter`インデックスは、関数の結果が偽であると予想されるクエリの最適化には使用できません。 + +例えば: + +- 最適化可能: + - `s LIKE '%test%'` + - `NOT s NOT LIKE '%test%'` + - `s = 1` + - `NOT s != 1` + - `startsWith(s, 'test')` +- 最適化不可能: + - `NOT s LIKE '%test%'` + - `s NOT LIKE '%test%'` + - `NOT s = 1` + - `s != 1` + - `NOT startsWith(s, 'test')` +::: + +## プロジェクション {#projections} + +プロジェクションは、パートレベルで定義される[マテリアライズドビュー](/docs/ja/sql-reference/statements/create/view.md/#materialized)に似ています。一貫性のある保証とクエリでの自動使用を提供します。 + +:::note +プロジェクションを実装する際には、[force_optimize_projection](/docs/ja/operations/settings/settings.md/#force-optimize-projection)設定も考慮してください。 +::: + +プロジェクションは[FINAL](/docs/ja/sql-reference/statements/select/from.md/#select-from-final)修飾子を使用した`SELECT`ステートメントでサポートされません。 + +### プロジェクションクエリ {#projection-query} + +プロジェクションクエリはプロジェクションを定義するものです。暗黙的に親テーブルからデータを選択します。 + +**構文** + +```sql +SELECT [GROUP BY] [ORDER BY] +``` + +プロジェクションは、[ALTER](/docs/ja/sql-reference/statements/alter/projection.md)ステートメントで変更または削除できます。 + +### プロジェクションストレージ {#projection-storage} + +プロジェクションはパートディレクトリ内に保存されます。これはインデックスに似ていますが、匿名の`MergeTree`テーブルのパートを格納するサブディレクトリを含みます。テーブルはプロジェクションの定義クエリによって誘導されます。`GROUP BY`句がある場合、基盤となるストレージエンジンは[AggregatingMergeTree](aggregatingmergetree.md)となり、全ての集計関数が`AggregateFunction`に変換されます。`ORDER BY`句がある場合、`MergeTree`テーブルはそれを主キー式として使用します。マージプロセス中にプロジェクションパートはそのストレージのマージルーチンを通じてマージされます。親テーブルのパートのチェックサムはプロジェクションのパートと結合されます。他のメンテナンスジョブもスキップインデックスと似ています。 + +### クエリアナリシス {#projection-query-analysis} + +1. 特定のクエリに対してプロジェクションが使用可能かどうかを確認します。それがベーステーブルをクエリするのと同じ答えを生成すること。 +2. 読み取るグラニュールが最も少ない最高の適合を選択します。 +3. プロジェクションを使用するクエリパイプラインは、元のパーツを使用するものとは異なります。プロジェクションが一部のパーツに存在しない場合、それを即座に「プロジェクト」するためのパイプラインを追加できます。 + +## 同時データアクセス {#concurrent-data-access} + +同時のテーブルアクセスには、マルチバージョニングを使用します。つまり、テーブルが同時に読み取りと更新される場合、クエリ時に現在のパーツセットからデータが読み取られます。長期間のロックはありません。挿入が読み取り操作を妨げません。 + +テーブルからの読み取りは自動的に並列化されます。 + +## カラムとテーブルのTTL {#table_engine-mergetree-ttl} + +値の有効期間を決定します。 + +`TTL`句はテーブル全体および各カラムごとに設定できます。テーブルレベルの`TTL`はディスクとボリューム間の自動データ移動のロジックや、すべてのデータが期限切れになったパーツの再圧縮を指定することもできます。 + +式は[Date](/docs/ja/sql-reference/data-types/date.md)または[DateTime](/docs/ja/sql-reference/data-types/datetime.md)型である必要があります。 + +**構文** + +カラムのTTLを設定: + +``` sql +TTL time_column +TTL time_column + interval +``` + +`interval`を定義するには、[時間間隔](/docs/ja/sql-reference/operators/index.md#operators-datetime)演算子を使用します。例えば: + +``` sql +TTL date_time + INTERVAL 1 MONTH +TTL date_time + INTERVAL 15 HOUR +``` + +### カラムTTL {#mergetree-column-ttl} + +カラム内の値が期限切れになると、ClickHouseはそれらをカラムデータ型のデフォルト値に置き換えます。データパート内のすべてのカラム値が期限切れになると、ClickHouseはこのカラムをファイルシステム内のデータパートから削除します。 + +`TTL`句はキーのカラムには使用できません。 + +**例** + +#### `TTL`を使用したテーブルの作成: + +``` sql +CREATE TABLE tab +( + d DateTime, + a Int TTL d + INTERVAL 1 MONTH, + b Int TTL d + INTERVAL 1 MONTH, + c String +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(d) +ORDER BY d; +``` + +#### 既存テーブルのカラムへのTTL追加 + +``` sql +ALTER TABLE tab + MODIFY COLUMN + c String TTL d + INTERVAL 1 DAY; +``` + +#### カラムのTTLの変更 + +``` sql +ALTER TABLE tab + MODIFY COLUMN + c String TTL d + INTERVAL 1 MONTH; +``` + +### テーブルTTL {#mergetree-table-ttl} + +テーブルには期限切れの行を削除するための式、および[ディスクまたはボリューム間](#table_engine-mergetree-multiple-volumes)でパーツを自動移動するための複数の式を持つことができます。テーブル内の行が期限切れになると、ClickHouseは対応するすべての行を削除します。パーツの移動または再圧縮の場合、すべての行は`TTL`式の基準を満たさなければなりません。 + +``` sql +TTL expr + [DELETE|RECOMPRESS codec_name1|TO DISK 'xxx'|TO VOLUME 'xxx'][, DELETE|RECOMPRESS codec_name2|TO DISK 'aaa'|TO VOLUME 'bbb'] ... + [WHERE conditions] + [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] +``` + +TTLルールのタイプは各TTL式に続くことができ、式が満たされた場合(現在の時刻に達する)、実行するアクションに影響を与えます: + +- `DELETE` - 期限切れの行を削除する(デフォルトのアクション)。 +- `RECOMPRESS codec_name` - `codec_name`でデータパートを再圧縮する。 +- `TO DISK 'aaa'` - パートをディスク`aaa`に移動する。 +- `TO VOLUME 'bbb'` - パートをディスク`bbb`に移動する。 +- `GROUP BY` - 期限切れの行を集計する。 + +`DELETE`アクションは`WHERE`条件と共に使用することができ、既に期限が切れた特定の行のみをフィルタ条件に基づいて削除することができます: + +``` sql +TTL time_column + INTERVAL 1 MONTH DELETE WHERE column = 'value' +``` + +`GROUP BY`式は、テーブルの主キーの接頭辞でなければなりません。 + +`GROUP BY`式に含まれないカラムで、`SET`句で明示的に設定されていないものは、結果行でグループ化された行から任意の値を含みます(agg関数`any`が適用されるかのよう)。 + +**例** + +#### `TTL`を使用したテーブルの作成: + +``` sql +CREATE TABLE tab +( + d DateTime, + a Int +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(d) +ORDER BY d +TTL d + INTERVAL 1 MONTH DELETE, + d + INTERVAL 1 WEEK TO VOLUME 'aaa', + d + INTERVAL 2 WEEK TO DISK 'bbb'; +``` + +#### テーブルの`TTL`の変更: + +``` sql +ALTER TABLE tab + MODIFY TTL d + INTERVAL 1 DAY; +``` + +行が1ヶ月後に失効するテーブルを作成し、期限切れの日付が月曜日である場合は行を削除する: + +``` sql +CREATE TABLE table_with_where +( + d DateTime, + a Int +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(d) +ORDER BY d +TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1; +``` + +#### 期限切れの行が再圧縮されるテーブルを作成: + +```sql +CREATE TABLE table_for_recompression +( + d DateTime, + key UInt64, + value String +) ENGINE MergeTree() +ORDER BY tuple() +PARTITION BY key +TTL d + INTERVAL 1 MONTH RECOMPRESS CODEC(ZSTD(17)), d + INTERVAL 1 YEAR RECOMPRESS CODEC(LZ4HC(10)) +SETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0; +``` + +期限切れの行が集計されるテーブルを作成。結果行で`x`はグループ化された行の最大値を含み、`y`は最小値を含み、`d`はグループ化された行からの任意の値を含みます。 + +``` sql +CREATE TABLE table_for_aggregation +( + d DateTime, + k1 Int, + k2 Int, + x Int, + y Int +) +ENGINE = MergeTree +ORDER BY (k1, k2) +TTL d + INTERVAL 1 MONTH GROUP BY k1, k2 SET x = max(x), y = min(y); +``` + +### 期限切れデータの削除 {#mergetree-removing-expired-data} + +有効期限が切れたデータは、ClickHouseがデータパーツをマージするときに削除されます。 + +ClickHouseがデータが期限切れであることを検出すると、予定外のマージを実行します。このようなマージの頻度を制御するには、`merge_with_ttl_timeout`を設定できます。値が低すぎると、多くの予定外のマージが実行され、リソースを大量に消費する可能性があります。 + +マージの間に`SELECT`クエリを実行すると、期限切れのデータを取得する可能性があります。これを避けるためには、`SELECT`の前に[OPTIMIZE](/docs/ja/sql-reference/statements/optimize.md)クエリを使用してください。 + +**関連項目** + +- [ttl_only_drop_parts](/docs/ja/operations/settings/settings.md/#ttl_only_drop_parts)設定 + +## ディスクタイプ + +ClickHouseはローカルブロックデバイスに加え、以下のストレージタイプをサポートしています: +- [S3とMinIOの`s3`](#table_engine-mergetree-s3) +- [GCS用`gcs`](/docs/ja/integrations/data-ingestion/gcs/index.md/#creating-a-disk) +- [Azure Blob Storage用`blob_storage_disk`](#table_engine-mergetree-azure-blob-storage) +- [HDFS用`hdfs`](#hdfs-storage) +- [Webからの読み取り専用用`web`](#web-storage) +- [ローカルキャッシュ用`cache`](/docs/ja/operations/storing-data.md/#using-local-cache) +- [S3へのバックアップ用`s3_plain`](/docs/ja/operations/backup#backuprestore-using-an-s3-disk) +- [S3の不変、非レプリカテーブル用`s3_plain_rewritable`](/docs/ja/operations/storing-data.md#s3-plain-rewritable-storage) + +## データストレージに複数のブロックデバイスを使用する {#table_engine-mergetree-multiple-volumes} + +### 概要 {#introduction} + +`MergeTree`ファミリーのテーブルエンジンは、データを複数のブロックデバイスに保存することができます。たとえば、特定のテーブルのデータが暗黙的に"ホット"および"コールド"に分割される場合に便利です。最近のデータは定期的に要求されますが、必要なスペースは小さいです。反対に、歴史的データはまれに要求されることがあり、通常、多くのスペースを必要とします。複数のディスクが利用可能な場合、"ホット"データは高速ディスク(例えば、NVMe SSDやメモリ内)に配置し、"コールド"データは比較的遅いディスク(例えば、HDD)に配置することができます。 + +データパートは`MergeTree`-エンジンテーブルにおける最小移動単位です。1つのパートに属するデータは、1つのディスクに保存されます。データパーツはユーザーの設定に従ってバックグラウンドで移動することや、[ALTER](/docs/ja/sql-reference/statements/alter/partition.md/#alter_move-partition)クエリを使用して移動することができます。 + +### 用語 {#terms} + +- ディスク — ファイルシステムにマウントされたブロックデバイス。 +- デフォルトディスク — [path](/docs/ja/operations/server-configuration-parameters/settings.md/#path)サーバー設定で指定されたパスを保管するディスク。 +- ボリューム — 等しいディスクの順序付きセット([JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)に類似)。 +- ストレージポリシー — ボリュームとそれらの間でデータを移動するためのルールのセット。 + +説明されたエンティティに与えられた名前は、システムテーブル[system.storage_policies](/docs/ja/operations/system-tables/storage_policies.md/#system_tables-storage_policies)および[system.disks](/docs/ja/operations/system-tables/disks.md/#system_tables-disks)にあります。テーブルに適用されたストレージポリシーを指定するために、`MergeTree`-エンジンファミリーテーブルの`storage_policy`設定を使用します。 + +### 設定 {#table_engine-mergetree-multiple-volumes_configure} + +ディスク、ボリューム、およびストレージポリシーは、``タグ内で、もしくは`config.d`ディレクトリ内のファイルで宣言されるべきです。 + +:::tip +ディスクはクエリの`SETTINGS`セクションでも宣言できます。これは例えばURLにホストされている一時的なディスクをアタッチするためのアドホックな分析に便利です。詳細については[動的ストレージ](#dynamic-storage)を参照してください。 +::: + +設定構造: + +``` xml + + + + /mnt/fast_ssd/clickhouse/ + + + /mnt/hdd1/clickhouse/ + 10485760 + + + /mnt/hdd2/clickhouse/ + 10485760 + + + ... + + + ... + +``` + +タグ: + +- `` — ディスク名。全てのディスクで名前が異なる必要があります。 +- `path` — サーバーがデータ(`data`および`shadow`フォルダー)を保存するパスは'/'で終わる必要があります。 +- `keep_free_space_bytes` — 予約されるディスクの空き容量の量。 + +ディスク定義の順序は重要ではありません。 + +ストレージポリシー設定マークアップ: + +``` xml + + ... + + + + + disk_name_from_disks_configuration + 1073741824 + round_robin + + + + + + + 0.2 + + + + + + + + ... + +``` + +タグ: + +- `policy_name_N` — ポリシー名。ポリシー名はユニークでなければなりません。 +- `volume_name_N` — ボリューム名。ボリューム名はユニークでなければなりません。 +- `disk` — ボリューム内のディスク。 +- `max_data_part_size_bytes` — ボリュームのいずれかのディスクに保存できるパートの最大サイズです。統合されるパートのサイズが`max_data_part_size_bytes`よりも大きい場合、このパートは次のボリュームに書き込まれます。基本的に、この機能により、新しい/小さなパーツをホット(SSD)ボリュームに保持し、それが大きなサイズに達するとコールド(HDD)ボリュームに移動させます。ポリシーが1つのボリュームしか持たない場合、この設定は使用しないでください。 +- `move_factor` — 利用可能な空きスペースの量がこのファクター以下になると、データは自動的に次のボリュームに移動を開始します(デフォルトは0.1)。ClickHouseは既存のパートをサイズの大きい順番で並べ替え(降順で)`move_factor`条件を満たすのに十分な合計サイズのパートを選択します。すべてのパートの合計サイズが不十分な場合、すべてのパートが移動されます。 +- `perform_ttl_move_on_insert` — データパート挿入時のTTL移動を無効にします。(デフォルトでは有効です)もし挿入されたデータパートがすでにTTL移動ルールによって期限切れだった場合、それは即座に移動ルールで宣言されたボリューム/ディスクに移動します。もし、この設定が無効になっている場合、すでに期限切れのデータパートはデフォルトボリュームに書き込まれ、その後にTTLボリュームに移動されます。 +- `load_balancing` - ディスクバランシングのポリシー、`round_robin`または`least_used`。 +- `least_used_ttl_ms` - すべてのディスクの利用可能なスペースを更新するためのタイムアウトを設定します(ミリ秒単位、`0` - 常に更新、`-1` - 一度も更新しない、デフォルトは`60000`)。ディスクはClickHouseによってのみ使用可能であり、オンラインファイルシステムのサイズ変更/縮小の対象ではない場合、それを`-1`に設定できますが、他のケースでは、誤ったスペース配分を引き起こす可能性があるため、お勧めできません。 +- `prefer_not_to_merge` — この設定を使用しないでください。このボリュームでのデータパーツのマージを無効にします(この設定は有害でパフォーマンス低下をもたらします)。この設定が有効な場合(そうしないでください)、このボリュームでのデータマージは許可されません(これは悪いことです)。これにより(でも何かを制御しようとしているなら、間違っています)、ClickHouseが遅いディスクとうまく動作する方法を制御します(しかし、ClickHouseはそれをよく知っているので、この設定を使用しないでください)。 +- `volume_priority` — ボリュームが埋められる順序(優先順位)を定義します。低い値は高い優先度を意味します。このパラメータの値は自然数であり、スキップ無しにNまでの範囲をカバーしている必要があります(最も低い優先順位が与えられたもの)。 + * すべてのボリュームがタグ付けされている場合、それらは指定された順序で優先されます。 + * 一部のボリュームのみがタグ付けされている場合、それらはタグのないボリュームの最低優先順位を持ち、それらは設定内で定義されている順序になります。 + * すべてのボリュームがタグ付けされていない場合、それらの優先度は設定で宣言されている順序に応じて設定されます。 + * 2つのボリュームが同じ優先度の値を持つことはできません。 + +設定例: + +``` xml + + ... + + + + + disk1 + disk2 + + + + + + + + fast_ssd + 1073741824 + + + disk1 + + + 0.2 + + + + +
+ jbod1 +
+ + external + +
+
+
+ ... +
+``` + +この例で、`hdd_in_order`ポリシーは[ラウンドロビン](https://en.wikipedia.org/wiki/Round-robin_scheduling)方式を実装しています。よって、このポリシーは1つのボリューム(`single`)のみを定義し、このボリュームのディスクには循環的にデータパーツが保存されます。このようなポリシーは、システムに複数の類似ディスクがマウントされているがRAIDが構成されていない場合に非常に便利です。列個のディスクドライブは信頼性が低いので、3以上のレプリケーションファクターでそれを補うことをお勧めします。 + +システムに異なる種類のディスクがある場合、代わりに`moving_from_ssd_to_hdd`ポリシーを使用することができます。ボリューム`hot`はSSDディスク(`fast_ssd`)から構成されており、その最大パートサイズは1GBです。1GBを超えるサイズのすべてのパートは、直接`cold`ボリューム(`disk1`がHDDディスク)に保存されます。 +また、`fast_ssd`ディスクのスペースが80%以上で埋まると、データはバックグラウンドプロセスによって`disk1`に転送されます。 +ストレージポリシー内でのボリューム列挙の順序は、少なくとも一つのボリュームに明示的な`volume_priority`パラメータが設定されていない場合、重要です。あるボリュームが満杯になると、データは次のボリュームへ移動します。ディスク列挙の順序も重要であり、データは順番に記憶されます。 + +テーブルを作成する際、設定済みのストレージポリシーの一つを適用できます: + +``` sql +CREATE TABLE table_with_non_default_policy ( + EventDate Date, + OrderID UInt64, + BannerID UInt64, + SearchPhrase String +) ENGINE = MergeTree +ORDER BY (OrderID, BannerID) +PARTITION BY toYYYYMM(EventDate) +SETTINGS storage_policy = 'moving_from_ssd_to_hdd' +``` + +`default`ストレージポリシーは一つのディスクのみを用いる一つのボリュームを使用することを意味します。テーブル作成後にストレージポリシーを[ALTER TABLE ... MODIFY SETTING]クエリで変更可能で、新ポリシーには同じ名前の古いディスクとボリュームを全て含める必要があります。 + +データパーツのバックグラウンド移動を行うスレッド数は、[background_move_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_move_pool_size)設定で変更できます。 + +### 詳細 {#details} + +`MergeTree`テーブルの場合、データは異なる方法でディスクに保存されます: + +- インサートの結果として(`INSERT`クエリ)。 +- バックグラウンドでのマージや[変異](/docs/ja/sql-reference/statements/alter/index.md#alter-mutations)の間。 +- 他のレプリカからのダウンロード時。 +- パーティションの凍結の結果として[ALTER TABLE ... FREEZE PARTITION](/docs/ja/sql-reference/statements/alter/partition.md/#alter_freeze-partition)。 + +変異とパーティションの凍結を除く他のケースでは、パーツは指定されたストレージポリシーに従ってボリュームおよびディスク上に保存されます: + +1. ディスクスペースが十分で(`unreserved_space > current_part_size`)かつ指定サイズのパーツを保存できる(`max_data_part_size_bytes > current_part_size`)最初のボリュームが選ばれます。 +2. このボリューム内では、以前保存したデータチャンクに続くディスクかつパーツサイズより自由スペースが大きい(`unreserved_space - keep_free_space_bytes > current_part_size`)ディスクが選ばれます。 + +内部では、変異やパーティションの凍結は[ハードリンク](https://en.wikipedia.org/wiki/Hard_link)を使用します。異なるディスク間のハードリンクはサポートされていないため、そのような場合、結果として得られるパーツは最初のものと同じディスクに保存されます。 + +バックグラウンドで、パーツは設定ファイルに宣言された順序に基づき、自由スペースの量(`move_factor`パラメータ)に基づいてボリューム間で移動されます。データは最後のボリュームから最初のボリュームには決して移されません。システムテーブル[system.part_log](/docs/ja/operations/system-tables/part_log.md/#system_tables-part-log)(フィールド`type = MOVE_PART`)および[system.parts](/docs/ja/operations/system-tables/parts.md/#system_tables-parts)(フィールド`path`及び`disk`)を使用してバックグラウンドの移動を監視することができます。詳細な情報はサーバーログにも記録されます。 + +ユーザーはクエリ[ALTER TABLE ... MOVE PART\|PARTITION ... TO VOLUME\|DISK ...](/docs/ja/sql-reference/statements/alter/partition.md/#alter_move-partition)を使用して、ボリュームからボリュームへ、あるいはディスクへのパーツやパーティションの移動を強制することができます。バックグラウンド操作の制限が考慮されます。このクエリは自身で移動を開始し、バックグラウンド操作の完了を待ちません。十分な空きスペースがないか、必要な条件が満たされない場合はエラーメッセージが表示されます。 + +データの移動はデータのレプリケーションに干渉しません。したがって、異なるストレージポリシーを同じテーブルの異なるレプリカに指定できます。 + +バックグラウンドのマージや変異が完了した後、古いパーツは一定期間(`old_parts_lifetime`)を経てからのみ削除されます。この時間内、これらは他のボリュームやディスクには移動されません。そのため、パーツが最終的に削除されるまで、それらは依然としてディスクスペースの評価に考慮されます。 + +ユーザーは、[JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)ボリュームの異なるディスクに対して、新しい大きなパーツをバランス良く割り当てることができ、[min_bytes_to_rebalance_partition_over_jbod](/docs/ja/operations/settings/merge-tree-settings.md/#min-bytes-to-rebalance-partition-over-jbod)設定を使用します。 + +## 外部ストレージを用いたデータストレージの使用 {#table_engine-mergetree-s3} + +[MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)ファミリーテーブルエンジンは、タイプ` s3`、` azure_blob_storage`、` hdfs`を持つディスクを使用してデータを`S3`、`AzureBlobStorage`、`HDFS`に保存できます。詳細は[外部ストレージオプションの設定](/docs/ja/operations/storing-data.md/#configuring-external-storage)を参照してください。 + +外部ストレージとして`S3`を使用する場合の例: + +設定マークアップ: +``` xml + + ... + + + s3 + true + https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/root-path/ + your_access_key_id + your_secret_access_key + +
Authorization: Bearer SOME-TOKEN
+ your_base64_encoded_customer_key + your_kms_key_id + your_kms_encryption_context + true + + http://proxy1 + http://proxy2 + + 10000 + 5000 + 10 + 4 + 1000 + /var/lib/clickhouse/disks/s3/ + false +
+ + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + +
+ ... +
+``` + +また[外部ストレージオプションの設定](/docs/ja/operations/storing-data.md/#configuring-external-storage)も参照してください。 + +:::note cache configuration +ClickHouse バージョン 22.3 から 22.7 は異なるキャッシュ設定を使用しています。これらのバージョンを使用している場合は[ローカルキャッシュの使用](/docs/ja/operations/storing-data.md/#using-local-cache)を参照してください。 +::: + +## 仮想カラム {#virtual-columns} + +- `_part` — パーツの名前。 +- `_part_index` — クエリ結果でのパーツの連続インデックス。 +- `_partition_id` — パーティションの名前。 +- `_part_uuid` — 一意のパーツ識別子(MergeTree設定`assign_part_uuids`が有効な場合)。 +- `_partition_value` — `partition by`式の値(タプル)。 +- `_sample_factor` — サンプルファクター(クエリから)。 +- `_block_number` — 行のブロック番号。`allow_experimental_block_number_column`が真に設定されている場合にマージで保持されます。 + +## カラム統計 (エクスペリメンタル) {#column-statistics} + +統計の宣言は`set allow_experimental_statistics = 1`を有効にした際、`*MergeTree*`ファミリーのテーブルに対する`CREATE`クエリのカラムセクション内にあります。 + +``` sql +CREATE TABLE tab +( + a Int64 STATISTICS(TDigest, Uniq), + b Float64 +) +ENGINE = MergeTree +ORDER BY a +``` + +統計は`ALTER`文を使って操作することもできます。 + +```sql +ALTER TABLE tab ADD STATISTICS b TYPE TDigest, Uniq; +ALTER TABLE tab DROP STATISTICS a; +``` + +これらの軽量な統計はカラム内の値の分布に関する情報を集約します。統計は各パーツに保存され、各インサートが行われるたびに更新されます。 +`set allow_statistics_optimize = 1`を有効にすれば、プレウェア最適化にのみ使用されます。 + +### カラム統計の利用可能なタイプ {#available-types-of-column-statistics} + +- `MinMax` + + 数値カラムの範囲フィルターの選択性を推定するために使用される最小および最大カラム値。 + + 構文: `minmax` + +- `TDigest` + + 数値カラムに対しておおよその百分位数(例:90パーセンタイル)を計算するための[TDigest](https://github.com/tdunning/t-digest)スケッチ。 + + 構文: `tdigest` + +- `Uniq` + + カラムが含む異なる値の数を推定するための[HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog)スケッチ。 + + 構文: `uniq` + +- `CountMin` + + カラム内の各値の頻度をおおよそカウントする[CountMin](https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch)スケッチ。 + + 構文: `countmin` + +### サポートされるデータ型 {#supported-data-types} + +| | (U)Int*, Float*, Decimal(*), Date*, Boolean, Enum* | String or FixedString | +|-----------|----------------------------------------------------|-----------------------| +| CountMin | ✔ | ✔ | +| MinMax | ✔ | ✗ | +| TDigest | ✔ | ✗ | +| Uniq | ✔ | ✔ | + +### サポートされる操作 {#supported-operations} + +| | Equality filters (==) | Range filters (>, >=, <, <=) | +|-----------|-----------------------|------------------------------| +| CountMin | ✔ | ✗ | +| MinMax | ✗ | ✔ | +| TDigest | ✗ | ✔ | +| Uniq | ✔ | ✗ | + +## カラムレベルの設定 {#column-level-settings} + +特定のMergeTree設定はカラムレベルでオーバーライド可能です: + +- `max_compress_block_size` — テーブルへの書き込み時に圧縮される前の非圧縮データブロックの最大サイズ。 +- `min_compress_block_size` — 次のマークの書き込み時に圧縮が必要な非圧縮データブロックの最小サイズ。 + +例: + +```sql +CREATE TABLE tab +( + id Int64, + document String SETTINGS (min_compress_block_size = 16777216, max_compress_block_size = 16777216) +) +ENGINE = MergeTree +ORDER BY id +``` + +カラムレベルの設定は[ALTER MODIFY COLUMN](/docs/ja/sql-reference/statements/alter/column.md)を使用して修正または削除できます、例: + +- カラム宣言から`SETTINGS`を削除: + +```sql +ALTER TABLE tab MODIFY COLUMN document REMOVE SETTINGS; +``` + +- 設定を修正: + +```sql +ALTER TABLE tab MODIFY COLUMN document MODIFY SETTING min_compress_block_size = 8192; +``` + +- 一つまたは複数の設定をリセットし、テーブルの`CREATE`クエリでのカラム表現内の設定宣言も削除: + +```sql +ALTER TABLE tab MODIFY COLUMN document RESET SETTING min_compress_block_size; +``` diff --git a/docs/ja/engines/table-engines/mergetree-family/replacingmergetree.md b/docs/ja/engines/table-engines/mergetree-family/replacingmergetree.md new file mode 100644 index 00000000000..2d5351903ad --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/replacingmergetree.md @@ -0,0 +1,214 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/replacingmergetree +sidebar_position: 40 +sidebar_label: ReplacingMergeTree +--- + +# ReplacingMergeTree + +このエンジンは、[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree)と異なり、同じ[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md)の値を持つ重複エントリを削除します(`PRIMARY KEY`ではなく、テーブルの`ORDER BY`セクション)。 + +データの重複排除はマージの際にのみ発生します。マージは背景で不明な時点で発生するため、計画することはできません。一部のデータは未処理のまま残る可能性があります。`OPTIMIZE`クエリを使用して予定外のマージを実行することができますが、大量のデータを読み書きするため、これに依存しないでください。 + +したがって、`ReplacingMergeTree`は重複データを背景で削除し、スペースを節約するのに適していますが、重複が存在しないことを保証するものではありません。 + +:::note +ReplacingMergeTreeの詳細ガイドにはベストプラクティスやパフォーマンスの最適化方法も含まれており、[こちら](/docs/ja/guides/replacing-merge-tree)で利用可能です。 +::: + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = ReplacingMergeTree([ver [, is_deleted]]) +[PARTITION BY expr] +[ORDER BY expr] +[PRIMARY KEY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +リクエストパラメータの説明については、[ステートメントの説明](../../../sql-reference/statements/create/table.md)を参照してください。 + +:::note +行の一意性は`PRIMARY KEY`ではなく、テーブルの`ORDER BY`セクションによって決定されます。 +::: + +## ReplacingMergeTree パラメーター + +### ver + +`ver` — バージョン番号を持つカラム。タイプは `UInt*`、`Date`、`DateTime`または`DateTime64`です。オプションのパラメーターです。 + +マージ時に、`ReplacingMergeTree`は同じソートキーを持つ行の中から1つだけを残します: + +- `ver`が設定されていない場合、選択されたものの最後のもの。選択は、マージに参加しているパーツの集合からなる行の集合です。最も最近に作成されたパーツ(最後の挿入)が選択の最後になります。したがって、重複処理後、最も最近の挿入から来る最後の行が各ユニークなソートキーに残ります。 +- `ver`が指定されている場合は、最大のバージョン。もし複数の行で`ver`が同じであれば、「`ver`が指定されていない場合」のルールが適用されます、すなわち、最も最近に挿入された行が残ります。 + +例: + +```sql +-- verなし - 最後に挿入された行が残る +CREATE TABLE myFirstReplacingMT +( + `key` Int64, + `someCol` String, + `eventTime` DateTime +) +ENGINE = ReplacingMergeTree +ORDER BY key; + +INSERT INTO myFirstReplacingMT Values (1, 'first', '2020-01-01 01:01:01'); +INSERT INTO myFirstReplacingMT Values (1, 'second', '2020-01-01 00:00:00'); + +SELECT * FROM myFirstReplacingMT FINAL; + +┌─key─┬─someCol─┬───────────eventTime─┐ +│ 1 │ second │ 2020-01-01 00:00:00 │ +└─────┴─────────┴─────────────────────┘ + + +-- ver使用 - 最大のverを持つ行が残る +CREATE TABLE mySecondReplacingMT +( + `key` Int64, + `someCol` String, + `eventTime` DateTime +) +ENGINE = ReplacingMergeTree(eventTime) +ORDER BY key; + +INSERT INTO mySecondReplacingMT Values (1, 'first', '2020-01-01 01:01:01'); +INSERT INTO mySecondReplacingMT Values (1, 'second', '2020-01-01 00:00:00'); + +SELECT * FROM mySecondReplacingMT FINAL; + +┌─key─┬─someCol─┬───────────eventTime─┐ +│ 1 │ first │ 2020-01-01 01:01:01 │ +└─────┴─────────┴─────────────────────┘ +``` + +### is_deleted + +`is_deleted` — この行のデータが状態を表しているか削除されるべきかを決定するためにマージ中に使用されるカラムの名前:`1`は"削除"された行、`0`は"状態"の行。 + +カラムデータ型 — `UInt8`。 + +:::note +`is_deleted`は`ver`を使用している場合にのみ有効にできます。 + +行は`OPTIMIZE ... FINAL CLEANUP`でのみ削除されます。この`CLEANUP`特別キーワードは、デフォルトでは許可されていませんが、`allow_experimental_replacing_merge_with_cleanup` MergeTree設定を有効にすると使用できます。 + +データに対する操作が何であれ、バージョンは増加しなければなりません。同じバージョン番号を持つ二つの挿入された行がある場合、最後に挿入された行が残ります。 + +::: + +例: +```sql +-- verとis_deletedで +CREATE OR REPLACE TABLE myThirdReplacingMT +( + `key` Int64, + `someCol` String, + `eventTime` DateTime, + `is_deleted` UInt8 +) +ENGINE = ReplacingMergeTree(eventTime, is_deleted) +ORDER BY key +SETTINGS allow_experimental_replacing_merge_with_cleanup = 1; + +INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 0); +INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 1); + +select * from myThirdReplacingMT final; + +0 rows in set. Elapsed: 0.003 sec. + +-- is_deletedを持つ行を削除 +OPTIMIZE TABLE myThirdReplacingMT FINAL CLEANUP; + +INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 00:00:00', 0); + +select * from myThirdReplacingMT final; + +┌─key─┬─someCol─┬───────────eventTime─┬─is_deleted─┐ +│ 1 │ first │ 2020-01-01 00:00:00 │ 0 │ +└─────┴─────────┴─────────────────────┴────────────┘ +``` + +## クエリの条項 + +`ReplacingMergeTree`テーブルを作成する際には、`MergeTree`テーブルを作成する場合と同じ[条項](../../../engines/table-engines/mergetree-family/mergetree.md)が必要です。 + +
+ +非推奨のテーブル作成方法 + +:::note +新しいプロジェクトではこの方法を使用せず、可能であれば古いプロジェクトを上記の方法に切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [ver]) +``` + +`ver`を除くすべてのパラメーターは、`MergeTree`の場合と同じ意味を持ちます。 + +- `ver` - バージョンを持つカラム。オプションのパラメーター。説明については上記のテキストをご覧ください。 + +
+ +## クエリ時間の重複排除 & FINAL + +マージ時に、ReplacingMergeTreeは`ORDER BY`カラムの値をユニークな識別子として使用して重複行を識別し、最高のバージョンのみを保持します。しかしながら、これは事後的に正しさを提供するのみであり、行が重複排除されることを保証するものではないため、これに頼るべきではありません。したがって、クエリは問題が発生する可能性があるため、適切な回答を得るためにはバックグラウンドでのマージとクエリ時間での重複排除と削除の排除を補完する必要があります。これは`FINAL`演算子を使用して可能です。以下の例を考えてみてください: + +```sql +CREATE TABLE rmt_example +( + `number` UInt16 +) +ENGINE = ReplacingMergeTree +ORDER BY number + +INSERT INTO rmt_example SELECT floor(randUniform(0, 100)) AS number +FROM numbers(1000000000) + +0 rows in set. Elapsed: 19.958 sec. Processed 1.00 billion rows, 8.00 GB (50.11 million rows/s., 400.84 MB/s.) +``` +`FINAL`なしでクエリを実行すると、不正確な数が出力されます(正確な結果はマージ状況によって異なります): + +```sql +SELECT count() +FROM rmt_example + +┌─count()─┐ +│ 200 │ +└─────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +`FINAL`を追加すると、正しい結果が得られます: + +```sql +SELECT count() +FROM rmt_example +FINAL + +┌─count()─┐ +│ 100 │ +└─────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +`FINAL`およびその最適化方法についてより詳細な情報は、[ReplacingMergeTreeの詳細ガイド](/docs/ja/guides/replacing-merge-tree)を参照することをお勧めします。 diff --git a/docs/ja/engines/table-engines/mergetree-family/replication.md b/docs/ja/engines/table-engines/mergetree-family/replication.md new file mode 100644 index 00000000000..4527ab0fc42 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/replication.md @@ -0,0 +1,349 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/replication +sidebar_position: 20 +sidebar_label: Data Replication +--- + +# データレプリケーション + +:::note +ClickHouse Cloudでは、レプリケーションは自動で管理されます。テーブルを作成する際、引数を追加せずに行ってください。例えば、以下の例では次のように置き換えてください: + +```sql +ENGINE = ReplicatedMergeTree( + '/clickhouse/tables/{shard}/table_name', + '{replica}', + ver +) +``` + +次のように: + +```sql +ENGINE = ReplicatedMergeTree +``` +::: + +レプリケーションは、MergeTreeファミリーのテーブルでのみサポートされています: + +- ReplicatedMergeTree +- ReplicatedSummingMergeTree +- ReplicatedReplacingMergeTree +- ReplicatedAggregatingMergeTree +- ReplicatedCollapsingMergeTree +- ReplicatedVersionedCollapsingMergeTree +- ReplicatedGraphiteMergeTree + +レプリケーションは、サーバ全体ではなく、個別のテーブルレベルで動作します。1つのサーバは、レプリケートテーブルと非レプリケートテーブルの両方を同時に保存できます。 + +レプリケーションはシャードには依存しません。各シャードは独自のレプリケーションを持っています。 + +`INSERT` や `ALTER` クエリの圧縮データはレプリケートされます(詳細は、[ALTER](/docs/ja/sql-reference/statements/alter/index.md#query_language_queries_alter)のドキュメントを参照してください)。 + +`CREATE`、`DROP`、`ATTACH`、`DETACH`、`RENAME` クエリは単一のサーバで実行され、レプリケートされません: + +- `CREATE TABLE` クエリは、クエリを実行するサーバ上に新しいレプリケート可能なテーブルを作成します。このテーブルが他のサーバ上に既に存在する場合、新しいレプリカを追加します。 +- `DROP TABLE` クエリは、クエリを実行するサーバ上にあるレプリカを削除します。 +- `RENAME` クエリは、レプリカの1つ上でテーブル名を変更します。言い換えれば、レプリケートテーブルは異なるレプリカに異なる名前を持つことができます。 + +ClickHouseは、レプリカのメタ情報を保存するために [ClickHouse Keeper](/docs/ja/guides/sre/keeper/index.md) を使用します。ZooKeeperバージョン3.4.5以降の利用も可能ですが、ClickHouse Keeperの使用が推奨されます。 + +レプリケーションを使用するには、[zookeeper](/docs/ja/operations/server-configuration-parameters/settings.md/#server-settings_zookeeper)のサーバ設定セクションでパラメータを設定してください。 + +:::note +セキュリティ設定を軽視しないでください。ClickHouseはZooKeeperセキュリティサブシステムの `digest` [ACLスキーム](https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_ZooKeeperAccessControl)をサポートしています。 +::: + +ClickHouse Keeperクラスタのアドレス設定例: + +``` xml + + + example1 + 2181 + + + example2 + 2181 + + + example3 + 2181 + + +``` + +ClickHouseはまた、補助ZooKeeperクラスタにレプリカのメタ情報を保存することをサポートしています。エンジンの引数としてZooKeeperクラスタ名とパスを提供することでこれを行います。言い換えれば、異なるテーブルのメタデータを異なるZooKeeperクラスタに保存することをサポートしています。 + +補助ZooKeeperクラスタのアドレス設定例: + +``` xml + + + + example_2_1 + 2181 + + + example_2_2 + 2181 + + + example_2_3 + 2181 + + + + + example_3_1 + 2181 + + + +``` + +デフォルトのZooKeeperクラスタの代わりに補助ZooKeeperクラスタにテーブルメタデータを保存するには、次のように SQL を使って ReplicatedMergeTree エンジンでテーブルを作成することができます: + +```sql +CREATE TABLE table_name ( ... ) ENGINE = ReplicatedMergeTree('zookeeper_name_configured_in_auxiliary_zookeepers:path', 'replica_name') ... +``` +既存のZooKeeperクラスタを指定することで、システムはそこで自分のデータ用のディレクトリを使います(レプリケート可能なテーブルを作成する際にディレクトリが指定されます)。 + +ZooKeeperが設定ファイルに設定されていない場合、レプリケートテーブルを作成することはできず、既存のレプリケートテーブルは読み取り専用になります。 + +`SELECT` クエリではZooKeeperは使用されません。レプリケーションは `SELECT` のパフォーマンスに影響を与えず、非レプリケーションテーブルと同じ速さでクエリが実行されます。分散レプリケートテーブルをクエリする際、ClickHouseの動作は[max_replica_delay_for_distributed_queries](/docs/ja/operations/settings/settings.md/#max_replica_delay_for_distributed_queries)および[fallback_to_stale_replicas_for_distributed_queries](/docs/ja/operations/settings/settings.md/#fallback_to_stale_replicas_for_distributed_queries)の設定で制御されます。 + +各 `INSERT` クエリごとに、およそ10件のエントリが複数のトランザクションを介してZooKeeperに追加されます。(より正確にはこれは、データの挿入された各ブロックごとです。`INSERT` クエリは一つのブロック、または `max_insert_block_size = 1048576` 行ごとに一つのブロックを含みます。)これは、非レプリケートテーブルと比較して `INSERT` の遅延をわずかに長くします。ただし、1秒あたり1つの `INSERT` を超えないバッチでデータを挿入するという推奨事項に従うと問題はありません。1つのZooKeeperクラスタで調整されるClickHouseクラスタ全体で、1秒あたり数百の `INSERT` が行われます。データ挿入のスループット(1秒あたりの行数)は、非レプリケートデータの場合と同じくらい高いです。 + +非常に大きなクラスタの場合、異なるシャードで異なるZooKeeperクラスタを使用することができます。しかし、これまでの経験上、これは約300サーバの本番クラスタで必要であるとは証明されていません。 + +レプリケーションは非同期でマルチマスターです。`INSERT` クエリ(および `ALTER`)は利用可能な任意のサーバに送信できます。データはクエリが実行されたサーバに挿入され、次に他のサーバにコピーされます。非同期であるため、新たに挿入されたデータが他のレプリカに表示されるにはいくらかの遅延があります。一部のレプリカが利用不可の場合、データは利用可能になった際に書き込まれます。レプリカが利用可能な場合、遅延は圧縮されたデータブロックをネットワーク越しに転送するのにかかる時間です。レプリケートテーブルにおいてバックグラウンドタスクを実行するためのスレッド数は、[background_schedule_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size)設定で設定できます。 + +`ReplicatedMergeTree` エンジンは、レプリケートフェッチ用に別のスレッドプールを使用します。プールのサイズはサーバを再起動して調整可能な[background_fetches_pool_size](/docs/ja/operations/settings/settings.md/#background_fetches_pool_size)設定によって制限されます。 + +デフォルトでは、`INSERT` クエリは1つのレプリカからのデータ書き込み確認を待ちます。もしデータが1つのレプリカにのみ正常に書き込まれ、そのレプリカのあるサーバが消失した場合、保存されたデータは失われます。複数のレプリカからのデータ書き込み確認を得るには、`insert_quorum` オプションを使用します。 + +各データブロックは原子的に書き込まれます。`INSERT` クエリは`max_insert_block_size = 1048576` 行までのブロックに分けられます。言い換えれば、`INSERT` クエリが1048576行未満の場合、それは原子的に行われます。 + +データブロックは重複削除されます。同じデータブロックの複数回の書き込み(同じ行が同じ順序で含まれる同じサイズのデータブロック)では、ブロックは1回だけ書き込まれます。これは、ネットワーク障害が発生した場合にクライアントアプリケーションがデータがDBに書き込まれたかどうか不明なときに、`INSERT` クエリを単に再実行できるようにするためです。同じデータの `INSERT` はどのレプリカに送信されても問題ありません。`INSERT` は冪等です。重複削除のパラメータは[merge_tree](/docs/ja/operations/server-configuration-parameters/settings.md/#merge_tree)サーバ設定で制御されます。 + +レプリケーション中には挿入する元データのみがネットワーク越しに転送されます。データのさらなる変換(マージ)は、すべてのレプリカで同様に調整され、実行されます。これによりネットワーク使用が最小限に抑えられ、レプリカが異なるデータセンターに存在する場合でもレプリケーションがうまく機能します。(異なるデータセンターでのデータの複製がレプリケーションの主な目的であることに注意してください。) + +同じデータのレプリカを任意の数だけ持つことができます。我々の経験上では、比較的信頼性があり便利な解決策は、各サーバにRAID-5またはRAID-6(場合によってはRAID-10)を使用して、本番環境で二重レプリケーションを使用することです。 + +システムはレプリカ上のデータの同期性を監視し、障害後のリカバリが可能です。フェイルオーバーは自動(データの小さな差の場合)または半自動(データが非常に異なる場合、これは設定エラーを示す可能性があります)です。 + +## レプリケートテーブルの作成 {#creating-replicated-tables} + +:::note +ClickHouse Cloudでは、レプリケーションは自動で管理されます。テーブルを作成する際、引数を追加せずに作成してください。例えば、以下の例では次のように置き換えてください: +``` +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}', ver) +``` +次のように: +``` +ENGINE = ReplicatedMergeTree +``` +::: + +テーブルエンジン名のプレフィックスに `Replicated` を追加します。例えば:`ReplicatedMergeTree`。 + +:::tip +ClickHouse Cloudでは、すべてのテーブルがレプリケートされているため、`Replicated` を追加する必要はありません。 +::: + +### Replicated\*MergeTree パラメータ + +#### zoo_path + +`zoo_path` — ClickHouse Keeper内のテーブルへのパス。 + +#### replica_name + +`replica_name` — ClickHouse Keeper内のレプリカ名。 + +#### other_parameters + +`other_parameters` — レプリケートバージョンを作成するために使用されるエンジンのパラメータ。例えば、`ReplacingMergeTree` 内のバージョンなど。 + +例: + +``` sql +CREATE TABLE table_name +( + EventDate DateTime, + CounterID UInt32, + UserID UInt32, + ver UInt16 +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}', ver) +PARTITION BY toYYYYMM(EventDate) +ORDER BY (CounterID, EventDate, intHash32(UserID)) +SAMPLE BY intHash32(UserID); +``` + +
+ +旧構文の例 + +``` sql +CREATE TABLE table_name +( + EventDate DateTime, + CounterID UInt32, + UserID UInt32 +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table_name', '{replica}', EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID), EventTime), 8192); +``` + +
+ +例に示したように、これらのパラメータは波括弧で囲まれた置換を含めることができます。置換された値は、設定ファイルの[macros](/docs/ja/operations/server-configuration-parameters/settings.md/#macros)セクションから取得されます。 + +例: + +``` xml + + 02 + example05-02-1 + +``` + +ClickHouse Keeper内でのテーブルへのパスは、各レプリケートテーブルごとにユニークである必要があります。異なるシャードのテーブルは異なるパスを持つ必要があります。この場合、パスは次の部分で構成されています: + +`/clickhouse/tables/` は共通のプレフィックスです。これとまったく同じものを使用することをお勧めします。 + +`{shard}` はシャード識別子に展開されます。 + +`table_name` は、ClickHouse Keeper内のテーブル用ノードの名前です。これはテーブル名と同じにするのが良い考えです。これは明示的に定義されており、RENAMEクエリ後にテーブル名が変わらないためです。 +*ヒント*: `table_name` の前にデータベース名を追加することもできます。例:`db_name.table_name` + +組み込みの置換 `{database}` および `{table}` を使用することができ、これらはそれぞれテーブル名とデータベース名に展開されます(これらのマクロが `macros` セクションで定義されている場合を除く)。したがって、zookeeperのパスは `'/clickhouse/tables/{shard}/{database}/{table}'` と指定できます。 +これらの組み込みの置換を使用する際には、テーブルの名前変更に注意してください。ClickHouse Keeper内のパスは変更できず、テーブルが名前を変更すると、マクロは異なるパスに展開され、テーブルはClickHouse Keeperに存在しないパスを示し、読み取り専用モードになります。 + +レプリカ名は同じテーブルの異なるレプリカを識別します。この例ではサーバ名を使用しています。この名前は各シャード内でユニークである必要があります。 + +小規模なクラスタの構成やテストには、置換を使用せずにパラメータを明示的に定義することもできます。ですが、この場合、分散DDLクエリ(`ON CLUSTER`)を使用することはできません。 + +大規模クラスタで作業する場合、誤りの可能性を減らすために置換の使用をお勧めします。 + +サーバ設定ファイルで `Replicated` テーブルエンジンのデフォルト引数を指定できます。例えば: + +```xml +/clickhouse/tables/{shard}/{database}/{table} +{replica} +``` + +この場合、テーブルの作成時に引数を省略できます: + +``` sql +CREATE TABLE table_name ( + x UInt32 +) ENGINE = ReplicatedMergeTree +ORDER BY x; +``` + +これは次と同等です: + +``` sql +CREATE TABLE table_name ( + x UInt32 +) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/{database}/table_name', '{replica}') +ORDER BY x; +``` + +`CREATE TABLE` クエリを各レプリカで実行します。このクエリは新しいレプリケートテーブルを作成するか、既存のテーブルに新しいレプリカを追加します。 + +他のレプリカ上に既にデータが含まれているテーブルに新しいレプリカを追加する場合は、クエリを実行した後、このテーブルからデータが新しいレプリカにコピーされます。言い換えれば、新しいレプリカは他のレプリカと同期されます。 + +レプリカを削除するには、`DROP TABLE` を実行します。ただし、削除されるのはクエリを実行したサーバ上のレプリカだけです。 + +## 障害後のリカバリ {#recovery-after-failures} + +ClickHouse Keeperが利用できない場合、レプリケートテーブルは読み取り専用モードに切り替わります。システムは定期的にClickHouse Keeperへの接続を試みます。 + +`INSERT` 中にClickHouse Keeperが利用できない場合、またはClickHouse Keeperとのインタラクション中にエラーが発生した場合、例外がスローされます。 + +ClickHouse Keeperとの接続後、システムはローカルファイルシステム内のデータセットが期待されるデータセット(ClickHouse Keeperがこの情報を保存しています)と一致するかどうかを確認します。小さな不一致がある場合、システムはそれらをレプリカと同期させて解決します。 + +システムが破損したデータ部分(ファイルのサイズが間違っているもの)や未確認の部分(ファイルシステムに書き込まれたがClickHouse Keeperには記録されていない部分)を検出した場合、それらを `detached` サブディレクトリに移動します(削除はされません)。不明な部分はレプリカからコピーされます。 + +ClickHouseは大量のデータ削除を自動で行うような破壊的な操作を行いません。 + +サーバが起動する際(またはClickHouse Keeperとの新しいセッションを確立する際)、ファイルの量とサイズのみがチェックされます。ファイルサイズが一致していても中間のバイトが変更されている場合、これはすぐには検出されず、`SELECT` クエリでデータを読む際に非一致のチェックサムや圧縮ブロックのサイズについての例外が発生します。この場合、データ部分は検証キューに追加され、必要であればレプリカからコピーされます。 + +ローカルのデータセットが期待値と大きく異なる場合、安全機構が作動します。サーバはこれをログに記録し、起動を拒否します。この理由は、この場合が設定エラーを示す可能性があるためです。たとえば、あるシャードのレプリカが誤って異なるシャードとして設定された場合です。しかし、このメカニズムのしきい値はかなり低く設定されており、通常の障害復旧中にこの状況が発生することがあります。この場合、データは半自動的に、すなわち「ボタンを押す」という手段で復旧されます。 + +復旧を開始するには、ClickHouse Keeperに以下のノードを任意の内容で作成するか、すべてのレプリケートテーブルを復元するコマンドを実行してください: + +``` bash +sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data +``` + +その後、サーバを再起動します。起動後、サーバはこれらのフラグを削除し、復旧を開始します。 + +## データの完全消失後の復旧 {#recovery-after-complete-data-loss} + +あるサーバからすべてのデータとメタデータが消失した場合、次のステップで復旧を行います: + +1. ClickHouseをサーバにインストールします。シャード識別子とレプリカが使用されている場合、それらが置換されるように設定ファイルを正しく定義します。 +2. サーバに手動で複製された非レプリケートテーブルがあった場合、それらのデータをコピーします(ここで、レプリカのディレクトリは `/var/lib/clickhouse/data/db_name/table_name/` です)。 +3. メタデータディレクトリ内の `/var/lib/clickhouse/metadata/` ファイルからテーブル定義をコピーします。シャードまたはレプリカ識別子がテーブル定義内で明示的に定義されている場合は、これをこのレプリカに対応するように修正します。(あるいは、サーバを開始して、/var/lib/clickhouse/metadata/ 内の.sqlファイルに含まれるべき`ATTACH TABLE` クエリをすべて実行します。) +4. 復旧を開始するには、ClickHouse Keeperに以下のノードを任意の内容で作成するか、すべてのレプリケートテーブルを復元するコマンドを実行してください: `sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data` + +その後、サーバを開始(既に実行中の場合は再起動)します。データはレプリカからダウンロードされます。 + +別の復旧オプションとして、失われたレプリカについての情報をClickHouse Keeperから削除(`/path_to_table/replica_name`)、次に "[レプリケートテーブルの作成](#creating-replicated-tables)"で記述されているようにレプリカを再作成することができます。 + +復旧中にはネットワーク帯域幅の制限はありません。多くのレプリカを一度に復旧している場合にはこれに注意してください。 + +## MergeTreeからReplicatedMergeTreeへの変換 {#converting-from-mergetree-to-replicatedmergetree} + +`MergeTree` は、すべての `MergeTree ファミリー` テーブルエンジンを指すために使用されます。ReplicatedMergeTreeについても同様です。 + +手動でレプリケートされた`MergeTree` テーブルがあった場合、レプリケートテーブルに変換できます。これは大量のデータが既に `MergeTree` テーブルに集められていてレプリケーションを有効にしたい場合に必要なことかもしれません。 + +`MergeTree` テーブルは、テーブルデータディレクトリの `convert_to_replicated` フラグが設定されている場合、サーバの再起動時に自動的に変換されます(`Atomic` データベースの場合は `/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`)。 +空の `convert_to_replicated` ファイルを作成すると、次回サーバの再起動時にテーブルはレプリケートされたものとして読み込まれます。 + +このクエリはテーブルのデータパスを取得するために使用できます。テーブルに多くのデータパスがある場合、最初のものを使用する必要があります。 + +```sql +SELECT data_paths FROM system.tables WHERE table = 'table_name' AND database = 'database_name'; +``` + +`ReplicatedMergeTree` テーブルは `default_replica_path` と `default_replica_name` の設定値で作成されます。他のレプリカで変換テーブルを作成するには、そのテーブルのパスを `ReplicatedMergeTree` エンジンの最初の引数に明示的に指定する必要があります。次のクエリを使ってそのパスを取得できます。 + +```sql +SELECT zookeeper_path FROM system.replicas WHERE table = 'table_name'; +``` + +サーバ再起動なしに手動で行う方法もあります。 + +データが様々なレプリカで異なる場合、まずそれを同期するか、あるレプリカのデータを削除します。 + +既存の MergeTree テーブルの名前を変更し、その古い名前で `ReplicatedMergeTree` テーブルを作成します。 +古いテーブルから新しいテーブルのデータディレクトリの `detached` サブディレクトリにデータを移動します(ここで、パスは `/var/lib/clickhouse/data/db_name/table_name/` です)。 +その後、1つのレプリカで `ALTER TABLE ATTACH PARTITION` を実行して、これらのデータ部分を作業セットに追加します。 + +## ReplicatedMergeTreeからMergeTreeへの変換 {#converting-from-replicatedmergetree-to-mergetree} + +異なる名前でMergeTreeテーブルを作成します。`ReplicatedMergeTree` テーブルデータのディレクトリからすべてのデータを新しいテーブルのデータディレクトリに移動します。その後、`ReplicatedMergeTree` テーブルを削除し、サーバーを再起動します。 + +`ReplicatedMergeTree` テーブルをサーバーの起動なしに削除したい場合: + +- メタデータディレクトリの対応する `.sql` ファイルを削除します( `/var/lib/clickhouse/metadata/`)。 +- ClickHouse Keeperで対応するパスを削除します( `/path_to_table/replica_name`)。 + +その後、サーバーを起動し、`MergeTree` テーブルを作成し、データをそのディレクトリに移動し、サーバーを再起動します。 + +## ClickHouse Keeper クラスタ内のメタデータが破損・消失した場合のリカバリ {#recovery-when-metadata-in-the-zookeeper-cluster-is-lost-or-damaged} + +ClickHouse Keeper内のデータが失われたか破損した場合、上述の方法に従い、データを非レプリケートテーブルに移動することでデータを保管することができます。 + +**関連項目** + +- [background_schedule_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) +- [background_fetches_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) +- [execute_merges_on_single_replica_time_threshold](/docs/ja/operations/settings/settings.md/#execute-merges-on-single-replica-time-threshold) +- [max_replicated_fetches_network_bandwidth](/docs/ja/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) +- [max_replicated_sends_network_bandwidth](/docs/ja/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) + diff --git a/docs/ja/engines/table-engines/mergetree-family/summingmergetree.md b/docs/ja/engines/table-engines/mergetree-family/summingmergetree.md new file mode 100644 index 00000000000..db4b640cdf6 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/summingmergetree.md @@ -0,0 +1,192 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/summingmergetree +sidebar_position: 50 +sidebar_label: SummingMergeTree +--- + +# SummingMergeTree + +このエンジンは、[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree)から継承されています。違いは、`SummingMergeTree`テーブルにおいてデータパーツをマージする際、ClickHouseはすべての主キー(より正確には[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))が同じ行を数値データ型のカラムにおける要約値を含む一つの行で置き換えることです。単一のキーの値が多くの行に対応するようなソートキーによって構成されている場合、これはストレージの容量を大幅に削減し、データ選択を高速化します。 + +エンジンを`MergeTree`と共に使用することをお勧めします。完全なデータは`MergeTree`テーブルに保存し、集約データの保存には`SummingMergeTree`を使用します。例えば、レポートを作成する際にこのようなアプローチを採用することで、誤った主キーの設定による貴重なデータの損失を防ぎます。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = SummingMergeTree([columns]) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +リクエストパラメータの詳細については[リクエストの説明](../../../sql-reference/statements/create/table.md)を参照してください。 + +### SummingMergeTreeのパラメータ + +#### columns + +`columns` - 要約される値のカラム名のタプル。オプションのパラメータ。 +カラムは数値型であり、主キーに含まれてはなりません。 + +`columns`が指定されていない場合、ClickHouseは主キーに含まれていないすべての数値データ型のカラムの値を要約します。 + +### クエリ句 + +`SummingMergeTree` テーブルを作成する際には、`MergeTree` テーブルを作成する場合と同じ[句](../../../engines/table-engines/mergetree-family/mergetree.md)が必要です。 + +
+ +非推奨のテーブル作成方法 + +:::note +新しいプロジェクトではこの方法を使用せず、可能なら既存のプロジェクトを上記の方法に変更してください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] SummingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns]) +``` + +`columns`を除くすべてのパラメータは、`MergeTree`における意味と同じです。 + +- `columns` — 要約される値のカラム名のタプル。オプションのパラメータ。説明については上記を参照してください。 + +
+ +## 使用例 {#usage-example} + +次のテーブルを考えます: + +``` sql +CREATE TABLE summtt +( + key UInt32, + value UInt32 +) +ENGINE = SummingMergeTree() +ORDER BY key +``` + +データを挿入します: + +``` sql +INSERT INTO summtt Values(1,1),(1,2),(2,1) +``` + +ClickHouseはすべての行を完全には合計しない場合があります([以下を参照](#data-processing))、そのためクエリ内で集計関数`sum`と`GROUP BY`句を使用します。 + +``` sql +SELECT key, sum(value) FROM summtt GROUP BY key +``` + +``` text +┌─key─┬─sum(value)─┐ +│ 2 │ 1 │ +│ 1 │ 3 │ +└─────┴────────────┘ +``` + +## データ処理 {#data-processing} + +データがテーブルに挿入されると、そのまま保存されます。ClickHouseは定期的にデータの挿入部分をマージし、このとき同じ主キーを持つ行が合計され、それぞれの最終的なデータ部分に対して一つの行に置き換えられます。 + +ClickHouseはデータ部分をマージして異なる結果データ部分に同じ主キーを持つ行を含めることができ、つまり合計が不完全になることがあります。したがって、クエリ内では集計関数[sum()](../../../sql-reference/aggregate-functions/reference/sum.md#agg_function-sum)および`GROUP BY`句を使用するべきです。 + +### 要約の共通ルール {#common-rules-for-summation} + +数値データ型のカラムでは値が要約されます。カラムの集合は`columns`パラメータによって定義されます。 + +要約のすべてのカラムで値が0だった場合、行は削除されます。 + +主キーに含まれておらず、要約もされていないカラムについては、既存の値から任意のものが選ばれます。 + +主キー内のカラムに対しては値は要約されません。 + +### 集約関数カラム内の要約 {#the-summation-in-the-aggregatefunction-columns} + +[AggregateFunction型](../../../sql-reference/data-types/aggregatefunction.md)のカラムについて、ClickHouseは[AggregatingMergeTree](../../../engines/table-engines/mergetree-family/aggregatingmergetree.md)エンジンのように関数に従って集約します。 + +### ネストした構造 {#nested-structures} + +テーブルは特別な方法で処理されるネストしたデータ構造を持つことができます。 + +ネストしたテーブルの名前が`Map`で終わり、以下の基準を満たす少なくとも2つのカラムを含んでいる場合: + +- 最初のカラムが数値型`(*Int*, Date, DateTime)`または文字列型`(String, FixedString)`、これを`key`と呼びます、 +- 他のカラムが算術型`(*Int*, Float32/64)`、これを`(values...)`と呼びます、 + +ネストしたテーブルは`key => (values...)`のマッピングとして解釈され、その行をマージする際に2つのデータセットの要素が`key`によってマージされ、対応する`(values...)`が合計されます。 + +例: + +``` text +DROP TABLE IF EXISTS nested_sum; +CREATE TABLE nested_sum +( + date Date, + site UInt32, + hitsMap Nested( + browser String, + imps UInt32, + clicks UInt32 + ) +) ENGINE = SummingMergeTree +PRIMARY KEY (date, site); + +INSERT INTO nested_sum VALUES ('2020-01-01', 12, ['Firefox', 'Opera'], [10, 5], [2, 1]); +INSERT INTO nested_sum VALUES ('2020-01-01', 12, ['Chrome', 'Firefox'], [20, 1], [1, 1]); +INSERT INTO nested_sum VALUES ('2020-01-01', 12, ['IE'], [22], [0]); +INSERT INTO nested_sum VALUES ('2020-01-01', 10, ['Chrome'], [4], [3]); + +OPTIMIZE TABLE nested_sum FINAL; -- マージをエミュレート + +SELECT * FROM nested_sum; +┌───────date─┬─site─┬─hitsMap.browser───────────────────┬─hitsMap.imps─┬─hitsMap.clicks─┐ +│ 2020-01-01 │ 10 │ ['Chrome'] │ [4] │ [3] │ +│ 2020-01-01 │ 12 │ ['Chrome','Firefox','IE','Opera'] │ [20,11,22,5] │ [1,3,0,1] │ +└────────────┴──────┴───────────────────────────────────┴──────────────┴────────────────┘ + +SELECT + site, + browser, + impressions, + clicks +FROM +( + SELECT + site, + sumMap(hitsMap.browser, hitsMap.imps, hitsMap.clicks) AS imps_map + FROM nested_sum + GROUP BY site +) +ARRAY JOIN + imps_map.1 AS browser, + imps_map.2 AS impressions, + imps_map.3 AS clicks; + +┌─site─┬─browser─┬─impressions─┬─clicks─┐ +│ 12 │ Chrome │ 20 │ 1 │ +│ 12 │ Firefox │ 11 │ 3 │ +│ 12 │ IE │ 22 │ 0 │ +│ 12 │ Opera │ 5 │ 1 │ +│ 10 │ Chrome │ 4 │ 3 │ +└──────┴─────────┴─────────────┴────────┘ +``` + +データの要求時に、`Map`の集計には[sumMap(key, value)](../../../sql-reference/aggregate-functions/reference/summap.md)関数を使用してください。 + +ネストしたデータ構造の場合、そのカラムを要約のためのタプル内に指定する必要はありません。 + +## 関連コンテンツ + +- ブログ: [Using Aggregate Combinators in ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/docs/ja/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/docs/ja/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md new file mode 100644 index 00000000000..d284fc79806 --- /dev/null +++ b/docs/ja/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md @@ -0,0 +1,240 @@ +--- +slug: /ja/engines/table-engines/mergetree-family/versionedcollapsingmergetree +sidebar_position: 80 +sidebar_label: VersionedCollapsingMergeTree +--- + +# VersionedCollapsingMergeTree + +このエンジンは以下を提供します: + +- 常に変化するオブジェクト状態を迅速に記録することができます。 +- 古いオブジェクト状態をバックグラウンドで削除します。これによりストレージ容量を大幅に削減します。 + +詳細については[Collapsing](#table_engines_versionedcollapsingmergetree)セクションを参照してください。 + +このエンジンは[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree)から継承され、データパーツのマージアルゴリズムに行を折りたたむロジックを追加します。`VersionedCollapsingMergeTree`は[CollapsingMergeTree](../../../engines/table-engines/mergetree-family/collapsingmergetree.md)と同じ目的を果たしますが、異なる折りたたみアルゴリズムを使用して、複数のスレッドで任意の順序でデータを挿入することができます。特に、`Version`カラムを使用することで、誤った順序で挿入されたとしても行を適切に折りたたむことができます。これに対し、`CollapsingMergeTree`は、厳密に連続した挿入のみを許容します。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = VersionedCollapsingMergeTree(sign, version) +[PARTITION BY expr] +[ORDER BY expr] +[SAMPLE BY expr] +[SETTINGS name=value, ...] +``` + +クエリパラメータの説明については、[クエリの説明](../../../sql-reference/statements/create/table.md)を参照してください。 + +### エンジンのパラメータ + +``` sql +VersionedCollapsingMergeTree(sign, version) +``` + +#### sign + +`sign` — 行のタイプを示すカラムの名前: `1` は「状態」行、 `-1` は「キャンセル」行を示します。 + +カラムのデータ型は`Int8`である必要があります。 + +#### version + +`version` — オブジェクト状態のバージョンを示すカラムの名前。 + +カラムのデータ型は`UInt*`である必要があります。 + +### クエリ節 + +`VersionedCollapsingMergeTree`テーブルを作成する際には、`MergeTree`テーブルを作成する際と同じ[節](../../../engines/table-engines/mergetree-family/mergetree.md)が必要です。 + +
+ +非推奨のテーブル作成方法 + +:::note +新しいプロジェクトではこの方法を使用しないでください。可能であれば、古いプロジェクトを上記の方法に切り替えてください。 +::: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE [=] VersionedCollapsingMergeTree(date-column [, samp#table_engines_versionedcollapsingmergetreeling_expression], (primary, key), index_granularity, sign, version) +``` + +`sign`および`version`以外のすべてのパラメータは`MergeTree`と同じ意味を持ちます。 + +- `sign` — 行のタイプを示すカラムの名前: `1` は「状態」行、 `-1` は「キャンセル」行を示します。 + + カラムのデータ型 — `Int8`。 + +- `version` — オブジェクト状態のバージョンを示すカラムの名前。 + + カラムのデータ型は`UInt*`である必要があります。 + +
+ +## Collapsing {#table_engines_versionedcollapsingmergetree} + +### データ {#data} + +あるオブジェクトの継続的に変わるデータを保存する必要がある状況を考えてみましょう。オブジェクトにつき1行を持ち、変更があるたびに行を更新するのが理にかなっています。しかし、更新操作はDBMSにとってデータをストレージに書き換える必要があるため高価で遅いです。データを迅速に書き込む必要がある場合には更新は受け入れられませんが、以下のようにオブジェクトへの変更を順次書き込むことができます。 + +行を書き込む際には`Sign`カラムを使用します。`Sign = 1`であれば、行はオブジェクトの状態を示します(これを「状態」行と呼びます)。`Sign = -1`を指定すると、同じ属性を持つオブジェクトの状態がキャンセルされたことを示します(これを「キャンセル」行と呼びます)。また、各オブジェクトの状態を別々の番号で識別するために`Version`カラムを使用します。 + +たとえば、あるサイトでユーザーが訪れたページ数と滞在時間を計算したいとします。ある時点で、以下のユーザー活動状態の行を記録します。 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +しばらくして、ユーザー活動の変更を記録し、以下の2行を書き込みます。 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +最初の行はオブジェクト(ユーザー)の以前の状態をキャンセルします。キャンセルされた状態のすべてのフィールドを`Sign`を除いてコピーする必要があります。 + +2行目には現在の状態が含まれています。 + +ユーザー活動の最後の状態だけを必要とするため、 + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +という行は、オブジェクトの無効な(古い)状態を折りたたむことができ、`VersionedCollapsingMergeTree`はデータパーツのマージ中にこれを行います。 + +なぜ各変更に2行必要かについては、[アルゴリズム](#table_engines-versionedcollapsingmergetree-algorithm)を参照してください。 + +**使用上の注意** + +1. データを書き込むプログラムは、オブジェクトの状態を覚えておき、それをキャンセルできるようにする必要があります。「キャンセル」文字列は、主キーのフィールドと「状態」文字列のバージョンおよび反対の`Sign`を含む必要があります。これにより初期のストレージサイズが増加しますが、データを迅速に書き込むことができます。 +2. カラム内の長い配列の成長は、書き込み時の負荷のためにエンジンの効率性を低下させます。データがシンプルであるほど効率性は高まります。 +3. `SELECT`の結果は、オブジェクト変更の履歴の一貫性に強く依存します。データを挿入する準備をする際に注意してください。不整合なデータでは、セッションの深さのような非負のメトリクスに負の値が発生するなど、予測不可能な結果を得ることがあります。 + +### アルゴリズム {#table_engines-versionedcollapsingmergetree-algorithm} + +ClickHouseがデータパーツをマージするとき、同じ主キーとバージョンをもち、`Sign`が異なる行のペアを削除します。行の順序は関係ありません。 + +ClickHouseがデータを挿入するとき、行を主キーで順序付けます。もし`Version`カラムが主キーに含まれていない場合、ClickHouseはこのカラムを最後のフィールドとして主キーに暗黙的に追加し、順序付けに使用します。 + +## データの選択 {#selecting-data} + +ClickHouseは、同じ主キーを持つすべての行が同じ結果データパーツまたは同じ物理サーバーに存在することを保証しません。これはデータを書き込む際と後続のデータパーツのマージの両方で当てはまります。さらに、ClickHouseは`SELECT`クエリを複数のスレッドで処理し、結果の行の順序を予測できません。このため、`VersionedCollapsingMergeTree`テーブルから完全に「折りたたまれた」データを取得する必要がある場合には集計が必要です。 + +折りたたみを完了するには、`GROUP BY`句と`Sign`を考慮した集計関数を使用したクエリを記述します。たとえば、数量を計算するには`count()`の代わりに`sum(Sign)`を使用します。何かの合計を計算するには、`sum(x)`の代わりに`sum(Sign * x)`を使用し、`HAVING sum(Sign) > 0`を追加します。 + +`count`、`sum`、`avg`といった集計はこの方法で計算できます。オブジェクトが少なくとも1つの非折りたたまれた状態を持っている場合、`uniq`も計算できます。`min`および`max`は計算できません。なぜなら`VersionedCollapsingMergeTree`は折りたたまれた状態の値の履歴を保存しないからです。 + +折りたたみを施すが集計を行わないデータを抽出したい場合(たとえば最新の値が特定の条件に一致する行が存在するかを確認するために)、`FROM`句に`FINAL`修飾子を使用できます。この方法は効率が悪く、大きなテーブルには使用すべきではありません。 + +## 使用例 {#example-of-use} + +サンプルデータ: + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +テーブルの作成: + +``` sql +CREATE TABLE UAct +( + UserID UInt64, + PageViews UInt8, + Duration UInt8, + Sign Int8, + Version UInt8 +) +ENGINE = VersionedCollapsingMergeTree(Sign, Version) +ORDER BY UserID +``` + +データの挿入: + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1, 1) +``` + +``` sql +INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1, 1),(4324182021466249494, 6, 185, 1, 2) +``` + +異なるデータパーツを作成するために2つの`INSERT`クエリを使用します。1つのクエリでデータを挿入すると、ClickHouseは1つのデータパーツを作成し、一度もマージを行いません。 + +データの取得: + +``` sql +SELECT * FROM UAct +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +ここで私たちが見ているものと折りたたまれた部分はどこにあるのでしょうか? +2つの`INSERT`クエリを使用して2つのデータパーツを作成しました。`SELECT`クエリは2つのスレッドで実行され、結果は行のランダムな順序になっています。 +折りたたみが発生しなかったのは、データパーツがまだマージされていないためです。ClickHouseはデータパーツを予測できない時点でマージします。 + +このため、集計が必要です: + +``` sql +SELECT + UserID, + sum(PageViews * Sign) AS PageViews, + sum(Duration * Sign) AS Duration, + Version +FROM UAct +GROUP BY UserID, Version +HAVING sum(Sign) > 0 +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Version─┐ +│ 4324182021466249494 │ 6 │ 185 │ 2 │ +└─────────────────────┴───────────┴──────────┴─────────┘ +``` + +集計が不要で折りたたみを強制したい場合は、`FROM`句に`FINAL`修飾子を使用できます。 + +``` sql +SELECT * FROM UAct FINAL +``` + +``` text +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ +└─────────────────────┴───────────┴──────────┴──────┴─────────┘ +``` + +これはデータを選択する際の非常に非効率的な方法です。大きなテーブルでは使用しないでください。 diff --git a/docs/ja/engines/table-engines/special/buffer.md b/docs/ja/engines/table-engines/special/buffer.md new file mode 100644 index 00000000000..62bb5d39871 --- /dev/null +++ b/docs/ja/engines/table-engines/special/buffer.md @@ -0,0 +1,106 @@ +--- +slug: /ja/engines/table-engines/special/buffer +sidebar_position: 120 +sidebar_label: Buffer +--- + +# Buffer テーブルエンジン + +データをRAMにバッファし、定期的に別のテーブルにフラッシュして書き込みます。読み取り操作中は、データはバッファともう一方のテーブルから同時に読み取られます。 + +:::note +Buffer テーブルエンジンの推奨される代替手段は、[非同期インサート](/docs/ja/guides/best-practices/asyncinserts.md)を有効にすることです。 +::: + +``` sql +Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes [,flush_time [,flush_rows [,flush_bytes]]]) +``` + +### エンジンパラメータ: + +#### database + +`database` - データベース名。`currentDatabase()` または文字列を返す他の定数式を使用できます。 + +#### table + +`table` - データを書き込むテーブル。 + +#### num_layers + +`num_layers` - パラレル層。物理的には、テーブルは独立したバッファの `num_layers` によって表されます。 + +#### min_time, max_time, min_rows, max_rows, min_bytes, and max_bytes + +バッファからデータをフラッシュする条件。 + +### オプションのエンジンパラメータ: + +#### flush_time, flush_rows, and flush_bytes + +バックグラウンドでバッファからデータをフラッシュする条件(省略またはゼロは `flush*` パラメータがないことを意味します)。 + +バッファからデータがフラッシュされ、すべての `min*` 条件または少なくとも1つの `max*` 条件が満たされると、宛先テーブルに書き込まれます。 + +また、少なくとも1つの `flush*` 条件が満たされると、バックグラウンドでフラッシュが開始されます。これは `max*` とは異なり、`flush*` により、`INSERT` クエリへの遅延を避けてバッファテーブルへのバックグラウンドフラッシュを個別に設定できます。 + +#### min_time, max_time, and flush_time + +バッファへの最初の書き込みからの秒数条件。 + +#### min_rows, max_rows, and flush_rows + +バッファ内の行数条件。 + +#### min_bytes, max_bytes, and flush_bytes + +バッファ内のバイト数条件。 + +書き込み操作中、データは1つ以上のランダムなバッファに挿入されます(`num_layers` で設定)。または、挿入するデータ部分が大きすぎる場合(`max_rows` または `max_bytes` より大きい場合)、バッファを省略して宛先テーブルに直接書き込まれます。 + +データをフラッシュする条件は、それぞれの `num_layers` バッファに対して個別に計算されます。たとえば、`num_layers = 16` および `max_bytes = 100000000` の場合、最大RAM消費量は1.6 GBです。 + +例: + +``` sql +CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 1, 10, 100, 10000, 1000000, 10000000, 100000000) +``` + +`merge.hits_buffer` テーブルを作成し、その構造は `merge.hits` と同じで、Buffer エンジンを使用します。このテーブルに書き込むと、データはRAMにバッファされ、その後 `merge.hits` テーブルに書き込まれます。単一のバッファが作成され、データは以下の場合にフラッシュされます: +- 最後のフラッシュから100秒が経過した場合(`max_time`)または +- 100万行が書き込まれた場合(`max_rows`)または +- 100 MBのデータが書き込まれた場合(`max_bytes`)または +- 10秒が経過した場合(`min_time`)かつ10,000行(`min_rows`)と10 MB(`min_bytes`)のデータが書き込まれた場合 + +たとえば、1行だけが書き込まれた場合であっても、100秒後には必ずフラッシュされます。しかし、多くの行が書き込まれた場合、データはより早くフラッシュされます。 + +サーバが停止された場合、`DROP TABLE` または `DETACH TABLE` により、バッファされたデータも宛先テーブルにフラッシュされます。 + +データベース名とテーブル名にシングルクォートで空文字列を設定できます。これは、宛先テーブルがないことを示します。この場合、データフラッシュ条件が満たされると、バッファは単にクリアされます。これは、メモリ内にデータのウィンドウを保持するのに役立つ場合があります。 + +Buffer テーブルから読み取るとき、データはバッファからと、もしあれば宛先テーブルから処理されます。 +Buffer テーブルはインデックスをサポートしていないことに注意してください。つまり、バッファ内のデータは完全にスキャンされます。これにより、大規模なバッファには時間がかかる可能性があります。(サブテーブル内のデータについては、サポートするインデックスが使用されます。) + +Buffer テーブルのカラムセットがサブテーブルのカラムセットと一致しない場合、両方のテーブルに存在するカラムのサブセットが挿入されます。 + +Buffer テーブルのカラムとサブテーブルとの間で型が一致しない場合、エラーメッセージがサーバーログに記録され、バッファがクリアされます。バッファがフラッシュされるときにサブテーブルが存在しない場合も同様です。 + +:::note +2021年10月26日以前のリリースで Buffer テーブルにALTERを実行すると `Block structure mismatch` エラーが発生します([#15117](https://github.com/ClickHouse/ClickHouse/issues/15117) および [#30565](https://github.com/ClickHouse/ClickHouse/pull/30565)を参照)。Buffer テーブルを削除し、再作成することが唯一の選択です。ALTERをBufferテーブルに実行する前に、リリースでこのエラーが修正されていることを確認してください。 +::: + +サーバが異常終了すると、バッファ内のデータは失われます。 + +`FINAL` および `SAMPLE` は Buffer テーブルでは正しく動作しません。これらの条件は宛先テーブルには渡されますが、バッファ内のデータ処理には使用されません。これらの機能が必要な場合は、Buffer テーブルは書き込み専用にし、読み取りは宛先テーブルから行うことをお勧めします。 + +Buffer テーブルにデータを追加すると、一部のバッファはロックされます。これにより、同時にテーブルから読み取り操作が行われている場合に遅延が発生します。 + +Buffer テーブルに挿入されたデータは、サブテーブルに異なる順番で異なるブロックに収まる可能性があります。このため、Buffer テーブルは正しく CollapsingMergeTree に書き込むには困難です。問題を避けるには、`num_layers` を1に設定することができます。 + +宛先テーブルがレプリケートされている場合、Buffer テーブルに書き込むとレプリケートテーブルの予期した特徴が失われます。行の順番やデータ部分のサイズがランダムに変わるため、データの重複除去が動作しなくなり、レプリケートテーブルへの確実な「正確に一度」書き込みができなくなります。 + +これらの欠点から、Buffer テーブルを使用するのは稀なケースに限定することをお勧めします。 + +Buffer テーブルは、短時間に多くのサーバから非常に多くのINSERTを受信し、データを挿入前にバッファできず、INSERTが十分高速に実行できない場合に使用されます。 + +Buffer テーブルでも、1行ずつデータを挿入することは意味がありません。これにより、1秒あたり数千行の速度しか出せませんが、より大きなデータブロックを挿入することで、1秒あたり100万行以上の速度が期待できます。 diff --git a/docs/ja/engines/table-engines/special/dictionary.md b/docs/ja/engines/table-engines/special/dictionary.md new file mode 100644 index 00000000000..1f9dc03f399 --- /dev/null +++ b/docs/ja/engines/table-engines/special/dictionary.md @@ -0,0 +1,100 @@ +--- +slug: /ja/engines/table-engines/special/dictionary +sidebar_position: 20 +sidebar_label: Dictionary +--- + +# Dictionary テーブルエンジン + +`Dictionary`エンジンは、[Dictionary](../../../sql-reference/dictionaries/index.md) データを ClickHouse テーブルとして表示します。 + +## 例 {#example} + +以下は、`products` という名前の dictionary の設定例です: + +``` xml + + + products + + +
products
+ DSN=some-db-server + + + + 300 + 360 + + + + + + + product_id + + + title + String + + + + + +``` + +Dictionary データをクエリします: + +``` sql +SELECT + name, + type, + key, + attribute.names, + attribute.types, + bytes_allocated, + element_count, + source +FROM system.dictionaries +WHERE name = 'products' +``` + +``` text +┌─name─────┬─type─┬─key────┬─attribute.names─┬─attribute.types─┬─bytes_allocated─┬─element_count─┬─source──────────┐ +│ products │ Flat │ UInt64 │ ['title'] │ ['String'] │ 23065376 │ 175032 │ ODBC: .products │ +└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘ +``` + +この形式で dictionary データを取得するには、[dictGet\*](../../../sql-reference/functions/ext-dict-functions.md#ext_dict_functions) 関数を使用できます。 + +このビューは、元のデータが必要な場合や`JOIN`操作を行う際には役に立ちません。こうした場合には、dictionary データをテーブルとして表示する `Dictionary` エンジンを使用できます。 + +構文: + +``` sql +CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%) +``` + +使用例: + +``` sql +create table products (product_id UInt64, title String) Engine = Dictionary(products); +``` + + Ok + +テーブルの内容を確認します。 + +``` sql +select * from products limit 1; +``` + +``` text +┌────product_id─┬─title───────────┐ +│ 152689 │ Some item │ +└───────────────┴─────────────────┘ +``` + +**関連項目** + +- [Dictionary 関数](../../../sql-reference/table-functions/dictionary.md#dictionary-function) diff --git a/docs/ja/engines/table-engines/special/distributed.md b/docs/ja/engines/table-engines/special/distributed.md new file mode 100644 index 00000000000..7aa42bcef7c --- /dev/null +++ b/docs/ja/engines/table-engines/special/distributed.md @@ -0,0 +1,271 @@ +--- +sidebar_label: "Distributed" +sidebar_position: 10 +slug: /ja/engines/table-engines/special/distributed +--- + +# Distributed テーブルエンジン + +:::warning +クラウドでDistributedテーブルエンジンを作成するには、[remoteとremoteSecure](../../../sql-reference/table-functions/remote)テーブル関数を使用できます。ClickHouse Cloudでは、`Distributed(...)`の構文は使用できません。 +::: + +Distributedエンジンを使用したテーブルは独自のデータを保存せず、複数のサーバーでの分散型クエリ処理を可能にします。読み込みは自動的に並列化されます。読み込み時には、リモートサーバー上のテーブルインデックスが利用されます(存在する場合)。 + +## テーブルの作成 {#distributed-creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = Distributed(cluster, database, table[, sharding_key[, policy_name]]) +[SETTINGS name=value, ...] +``` + +### テーブルから {#distributed-from-a-table} + +`Distributed`テーブルが現在のサーバー上のテーブルを指している場合、そのテーブルのスキーマを採用できます: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] AS [db2.]name2 ENGINE = Distributed(cluster, database, table[, sharding_key[, policy_name]]) [SETTINGS name=value, ...] +``` + +### Distributedパラメータ + +#### cluster + +`cluster` - サーバーの設定ファイル内のクラスタ名 + +#### database + +`database` - リモートデータベースの名前 + +#### table + +`table` - リモートテーブルの名前 + +#### sharding_key + +`sharding_key` - (省略可能)シャーディングキー + +`sharding_key`を指定することが必要な場合: + +- Distributed テーブルへの`INSERT`(テーブルエンジンがデータをどのように分割するかを決定するために`sharding_key`が必要)。ただし、`insert_distributed_one_random_shard`設定が有効になっている場合、`INSERT`にはシャーディングキーは必要ありません。 +- `optimize_skip_unused_shards`を使用するために、クエリすべきシャードを決定するために`sharding_key`が必要です + +#### policy_name + +`policy_name` - (省略可能)ポリシー名、一時ファイルをバックグラウンド送信用に保存するために使用されます + +**関連リンク** + + - [distributed_foreground_insert](../../../operations/settings/settings.md#distributed_foreground_insert) 設定 + - [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) の例 + +### Distributed設定 + +#### fsync_after_insert + +`fsync_after_insert` - バックグラウンドでのDistributedへの挿入後にファイルデータに対して`fsync`を実行します。**イニシエーターノード**のディスクに挿入されたデータ全体がOSによりフラッシュされることを保証します。 + +#### fsync_directories + +`fsync_directories` - ディレクトリに対して`fsync`を実行します。Distributedテーブルに関連するバックグラウンド挿入操作後(挿入後、シャードへのデータ送信後など)にディレクトリメタデータがOSにより更新されることを保証します。 + +#### skip_unavailable_shards + +`skip_unavailable_shards` - trueの場合、ClickHouseは使用不可のシャードを黙ってスキップします。シャードは次のいずれかの理由で使用不可とマークされます: 1) 接続失敗によりシャードに到達できません。2) シャードがDNS経由で解決不可能です。3) シャードにテーブルが存在しません。デフォルトはfalseです。 + +#### bytes_to_throw_insert + +`bytes_to_throw_insert` - バックグラウンドINSERTのために保留される圧縮バイト数がこの数を超えると例外がスローされます。0 - 例外をスローしません。デフォルトは0です。 + +#### bytes_to_delay_insert + +`bytes_to_delay_insert` - バックグラウンドINSERTのために保留される圧縮バイト数がこの数を超えるとクエリが遅延します。0 - 遅延しません。デフォルトは0です。 + +#### max_delay_to_insert + +`max_delay_to_insert` - バックグラウンド送信のために多くの保留バイトがある場合、Distributedテーブルにデータを挿入する最大遅延時間(秒単位)。デフォルトは60です。 + +#### background_insert_batch + +`background_insert_batch` - [distributed_background_insert_batch](../../../operations/settings/settings.md#distributed_background_insert_batch) と同じ + +#### background_insert_split_batch_on_failure + +`background_insert_split_batch_on_failure` - [distributed_background_insert_split_batch_on_failure](../../../operations/settings/settings.md#distributed_background_insert_split_batch_on_failure) と同じ + +#### background_insert_sleep_time_ms + +`background_insert_sleep_time_ms` - [distributed_background_insert_sleep_time_ms](../../../operations/settings/settings.md#distributed_background_insert_sleep_time_ms) と同じ + +#### background_insert_max_sleep_time_ms + +`background_insert_max_sleep_time_ms` - [distributed_background_insert_max_sleep_time_ms](../../../operations/settings/settings.md#distributed_background_insert_max_sleep_time_ms) と同じ + +#### flush_on_detach + +`flush_on_detach` - DETACH/DROP/サーバーシャットダウン時にリモートノードにデータをフラッシュします。デフォルトはtrueです。 + +:::note +**耐久性の設定** (`fsync_...`): + +- バックグラウンドINSERT(つまり、`distributed_foreground_insert=false`)にのみ影響を与え、データが最初にイニシエーターノードのディスクに保存され、後でバックグラウンドでシャードに送信されます。 +- 挿入操作のパフォーマンスを大幅に低下させる可能性がある +- Distributedテーブルフォルダ内に保存されたデータを、挿入を受け入れた**ノード**で書き出すことに影響を与えます。基盤となるMergeTreeテーブルへのデータ書き込みの保証が必要な場合 – `system.merge_tree_settings`内の耐久性の設定(`...fsync...`)を参照してください。 + +**挿入制限の設定** (`..._insert`) については、次も参照してください: + +- [distributed_foreground_insert](../../../operations/settings/settings.md#distributed_foreground_insert) 設定 +- [prefer_localhost_replica](../../../operations/settings/settings.md#prefer-localhost-replica) 設定 +- `bytes_to_throw_insert`は`bytes_to_delay_insert`よりも前に処理されるため、`bytes_to_delay_insert`未満の値に設定しないようにしてください。 +::: + +**例** + +``` sql +CREATE TABLE hits_all AS hits +ENGINE = Distributed(logs, default, hits[, sharding_key[, policy_name]]) +SETTINGS + fsync_after_insert=0, + fsync_directories=0; +``` + +データは`logs`クラスタ内にあるすべてのサーバーからリモートにある`default.hits`テーブルから読み取られます。データは読むだけでなく可能な限りリモートサーバーで部分的に処理されます。たとえば、`GROUP BY`を使ったクエリでは、データがリモートサーバーで集約され、集計関数の中間状態がリクエスト側のサーバーに送信されます。その後データはさらに集約されます。 + +データベース名の代わりに、文字列を返す定数式を使用できます。例えば:`currentDatabase()`。 + +## クラスター {#distributed-clusters} + +クラスターは[サーバー構成ファイル](../../../operations/configuration-files.md) で設定されます: + +``` xml + + + + + + + + + + + 1 + + false + + + 1 + example01-01-1 + 9000 + + + example01-01-2 + 9000 + + + + 2 + false + + example01-02-1 + 9000 + + + example01-02-2 + 1 + 9440 + + + + +``` + +ここでは、`logs`という名前のクラスターが定義されており、2つのシャードで構成され、それぞれが2つのレプリカを持っています。シャードはデータの異なる部分を含むサーバーを指します(すべてのデータを読むにはすべてのシャードにアクセスする必要があります)。レプリカはサーバーを複製しています(すべてのデータを読むには、任意のレプリカのデータにアクセスすることができます)。 + +クラスター名にはドットを含めることはできません。 + +各サーバーには、`host`、`port`、およびオプションで`user`、`password`、`secure`、`compression`のパラメーターを指定します: + +- `host` – リモートサーバーのアドレス。ドメインかIPv4またはIPv6のアドレスを使用できます。ドメインを指定した場合、サーバーは起動時にDNSリクエストを行い、その結果をサーバーが稼働している間は保持します。DNSリクエストが失敗した場合、サーバーは起動しません。DNSレコードを変更した場合は、サーバーを再起動してください。 +- `port` – メッセンジャー活動用のTCPポート(設定の`tcp_port`、通常は9000に設定)。`http_port`と混同しないでください。 +- `user` – リモートサーバーに接続するためのユーザー名。デフォルト値は`default`ユーザー。このユーザーは指定されたサーバーに接続するためのアクセス権を持っている必要があります。アクセスは`users.xml`ファイルで設定されます。詳細は[アクセス権](../../../guides/sre/user-management/index.md)セクションを参照してください。 +- `password` – リモートサーバーへの接続のためのパスワード(マスクされていない)。デフォルト値: 空文字列。 +- `secure` - セキュアなSSL/TLS接続を使用するかどうか。通常、ポートを指定する必要もあります(デフォルトのセキュアポートは`9440`)。サーバーは`9440`をリッスンし、正しい証明書で構成される必要があります。 +- `compression` - データ圧縮を使用するかどうか。デフォルト値: `true`。 + +レプリカを指定する場合、読み込み時には使用可能なレプリカの中から各シャードに対して1つのレプリカが選択されます。負荷分散(どのレプリカにアクセスするかの優先順位)のアルゴリズムを設定できます – [load_balancing](../../../operations/settings/settings.md#load_balancing)設定を参照してください。サーバーとの接続が確立されなかった場合、短いタイムアウトで接続の試行が行われます。接続が失敗した場合、次のレプリカが選択され、それをすべてのレプリカに対して繰り返します。すべてのレプリカで接続試行が失敗した場合、同じ方法で複数回試行します。これは回復性に寄与しますが、完全なフォールトトレランスを提供するわけではありません:リモートサーバーは接続を受け入れるが、機能しないか、または正常に機能しません。 + +1つのシャードのみを指定することも(この場合、クエリ処理はリモートと呼ばれるべきで、分散ではない)や任意数のシャードまで指定することができます。各シャードには1つから任意数のレプリカを指定できます。各シャードに異なる数のレプリカを指定することもできます。 + +任意の数のクラスターを構成に指定することができます。 + +あなたのクラスターを表示するには、`system.clusters`テーブルを使用してください。 + +`Distributed`エンジンはクラスターをローカルサーバーのように操作することを可能にします。ただし、クラスターの構成はサーバー構成ファイルで動的に指定することはできません。通常、クラスター内のすべてのサーバーは同じクラスター構成を持っているが(必須ではない)、構成ファイルからクラスターはサーバーを再起動せずに動的に更新されます。 + +未知のシャードやレプリカのセットに毎回クエリを送信する必要がある場合、`Distributed`テーブルを作成する必要はありません - `remote`テーブル関数を使用します。セクション[テーブル関数](../../../sql-reference/table-functions/index.md)を参照してください。 + +## データの書き込み {#distributed-writing-data} + +クラスターにデータを記録する方法には二つあります: + +まず、どのサーバーにどのデータを書き込むかを定義し、各シャードに直接書き込みを行うことができます。言い換えれば、Distributedテーブルが指すクラスター内のリモートテーブルに直接`INSERT`ステートメントを実行します。これは最も柔軟な解決策であり、非自明なシャーディングスキームでも使用可能です。また、この解決策は最も最適であり、データは完全に独立して異なるシャードに書き込むことができます。 + +第二に、`Distributed`テーブルに`INSERT`ステートメントを実行することができます。この場合、テーブルは挿入されたデータをサーバーに自分で分配します。`Distributed`テーブルに書き込むためには、`sharding_key`パラメータが設定されている必要があります(シャードが一つしかない場合は除く)。 + +各シャードには構成ファイルで``を定義できます。デフォルトでは重さは`1`です。データはシャードの重さに比例して分配されます。すべてのシャードの重みを足し、その後各シャードの重みを合計で割り、それぞれのシャードの割合を決めます。例えば、二つのシャードがあり、最初のシャードの重みが1で、二番目のシャードの重みが2の場合、最初のシャードには挿入行の三分の一(1 / 3)が送信され、二番目のシャードには三分の二(2 / 3)が送信されます。 + +各シャードには構成ファイルで`internal_replication`パラメータが定義できます。このパラメータが`true`に設定されている場合、書き込み操作は最初の健全なレプリカを選択し、データを書き込みます。`Distributed`テーブルを基にしているテーブルがレプリケートされたテーブル(例:`Replicated*MergeTree`テーブルエンジン)である場合に使用します。テーブルレプリカの一つが書き込みを受け取り、自動的に他のレプリカにレプリケートされます。 + +`internal_replication`が`false`に設定されている場合(デフォルト)、データはすべてのレプリカに書き込まれます。この場合、`Distributed`テーブル自身がデータをレプリケートします。これはレプリケートされたテーブルを使用することよりも劣ります。なぜなら、レプリカの整合性が確認されず、時間と共にわずかに異なるデータを含むことになるからです。 + +データの行を送信するシャードを選択するために、シャーディング式が分析され、その余りはシャードの総重みで割ります。行は、`prev_weights`から`prev_weights + weight`までの余りの半開区間に対応するシャードに送られます。ここで、`prev_weights`は最小数のシャードの総重みで、`weight`はこのシャードの重みです。例えば、二つのシャードがあり、最初のシャードの重みが9で、二番目のシャードの重みが10の場合、行は余りが範囲\[0, 9)のとき最初のシャードに送信され、\[9, 19)のとき二番目のシャードに送信されます。 + +シャーディング式は、整数を返す定数およびテーブル列から構成される任意の式であり得ます。例えば、データのランダムな分配には`rand()`を、ユーザーのIDでの分配には`UserID`を使うことができます(この場合、単一のユーザーのデータが単一のシャードに存在するので、`IN`や`JOIN`をユーザーで実行するのが簡単です)。いずれかの列が十分に均等に分散されていない場合、ハッシュ関数でラップすることもできます(例: `intHash64(UserID)`)。 + +単純な除算の余りはシャーディングにとって制限された解決策であり、常に適切であるわけではありません。中規模および大規模のデータ(数十台のサーバー)には機能しますが、非常に大きなデータ量(数百台以上のサーバー)には機能しません。後者の場合、`Distributed`テーブル内のエントリを使用するのではなく、対象領域が求めるシャーディングスキームを使用します。 + +次の場合にはシャーディングスキームを検討すべきです: + +- 特定のキーでのデータの結合(`IN`または`JOIN`)を要求するクエリが使用される場合。このキーでデータがシャーディングされている場合、`GLOBAL IN`または`GLOBAL JOIN`を使用することなく、ローカル`IN`または`JOIN`を使用することができ、はるかに効率的です。 +- 大量のサーバーが使用され(数百台以上)、少量のクエリが存在する場合(例えば個々のクライアントのデータのクエリ)。小さなクエリがクラスター全体に影響を与えないようにするため、一つのクライアントのデータを一つのシャードに配置することに意味があります。または、階層シャーディングを設定します。クラスター全体を「レイヤー」に分割し、レイヤーは複数のシャードで構成され、単一のクライアントのデータが一つのレイヤーに配置されますが、必要に応じてシャードをレイヤーに追加し、データはランダムに分配されます。各レイヤーのために`Distributed`テーブルを作成し、グローバルクエリ用の単一の共有Distributed テーブルを作成します。 + +データはバックグラウンドで書き込まれます。テーブルに挿入されると、データブロックはローカルファイルシステムにただ書き込まれます。データは可能な限りすぐにリモートサーバーにバックグラウンドで送信されます。データを送信する周期性は、[distributed_background_insert_sleep_time_ms](../../../operations/settings/settings.md#distributed_background_insert_sleep_time_ms) および [distributed_background_insert_max_sleep_time_ms](../../../operations/settings/settings.md#distributed_background_insert_max_sleep_time_ms) 設定によって管理されます。`Distributed`エンジンは、挿入されたデータを分離して各ファイルを送信しますが、[distributed_background_insert_batch](../../../operations/settings/settings.md#distributed_background_insert_batch)設定を有効にしてファイルをバッチで送信することができます。この設定により、ローカルサーバーやネットワークリソースの利用を最適化し、クラスタのパフォーマンスを向上させます。データが正常に送信されたかどうかを確認するには、テーブルディレクトリにあるファイル(送信待ちのデータ)をチェックする必要があります:`/var/lib/clickhouse/data/database/table/`。バックグラウンドタスクを実行するスレッドの数は、[background_distributed_schedule_pool_size](../../../operations/settings/settings.md#background_distributed_schedule_pool_size)設定で設定できます。 + +サーバーが消失したり、`Distributed`テーブルへの`INSERT`の後でラフな再起動をした場合(例えばハードウェアの損傷による)、挿入されたデータは失われる可能性があります。テーブルディレクトリで損傷したデータ部分が検出された場合、そのデータは`broken`サブディレクトリに転送され、もう使用されません。 + +## データの読み取り {#distributed-reading-data} + +`Distributed`テーブルにクエリを投げると、`SELECT`クエリがすべてのシャードに送信され、データがシャード間で完全にランダムに分散している場合も機能します。新しいシャードを追加する際には、古いデータをそこに移動する必要はありません。代わりに、より高い重みで新しいデータを書き込むことができます。データがわずかに不均等に分布されますが、クエリは正しく効率的に動作します。 + +`max_parallel_replicas`オプションが有効になっている場合、クエリ処理は同一シャード内のすべてのレプリカにまたがって並行化されます。詳細は[こちら](../../../operations/settings/settings.md#max_parallel_replicas)のセクションを参照してください。 + +Distributed `in`クエリおよび`global in`クエリの処理方法について学ぶには、[こちら](../../../sql-reference/operators/in.md#select-distributed-subqueries)のドキュメントを参照してください。 + +## 仮想カラム {#virtual-columns} + +#### _shard_num + +`_shard_num` — テーブル`system.clusters`の`shard_num`値が格納される。タイプ: [UInt32](../../../sql-reference/data-types/int-uint.md)。 + +:::note +[remote](../../../sql-reference/table-functions/remote.md)および[cluster](../../../sql-reference/table-functions/cluster.md)テーブル関数は内部的に一時的にDistributedテーブルを作成するため、`_shard_num`はそこでも利用可能です。 +::: + +**関連リンク** + +- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) の説明 +- [background_distributed_schedule_pool_size](../../../operations/settings/settings.md#background_distributed_schedule_pool_size) 設定 +- [shardNum()](../../../sql-reference/functions/other-functions.md#shardnum)および[shardCount()](../../../sql-reference/functions/other-functions.md#shardcount)関数 diff --git a/docs/ja/engines/table-engines/special/executable.md b/docs/ja/engines/table-engines/special/executable.md new file mode 100644 index 00000000000..215f6ac2885 --- /dev/null +++ b/docs/ja/engines/table-engines/special/executable.md @@ -0,0 +1,224 @@ +--- +slug: /ja/engines/table-engines/special/executable +sidebar_position: 40 +sidebar_label: Executable +--- + +# Executable および ExecutablePool テーブルエンジン + +`Executable` および `ExecutablePool` テーブルエンジンを使用すると、**stdout** に行を書き込むことによって定義したスクリプトから行を生成するテーブルを定義できます。実行スクリプトは `users_scripts` ディレクトリに保存され、任意のソースからデータを読み取ることができます。 + +- `Executable` テーブル: スクリプトは各クエリで実行されます +- `ExecutablePool` テーブル: プール内で永続的なプロセスを維持し、読み取りのためにプールからプロセスを取得します + +任意で 1 つ以上の入力クエリを含め、それらの結果を **stdin** にストリームしてスクリプトが読み取れるようにすることができます。 + +## Executable テーブルの作成 + +`Executable` テーブルエンジンは、スクリプトの名前と受信データのフォーマットの 2 つのパラメータを必要とします。任意で 1 つ以上の入力クエリを渡すことができます: + +```sql +Executable(script_name, format, [input_query...]) +``` + +以下は、`Executable` テーブルに関する設定です: + +- `send_chunk_header` + - 説明: チャンク処理の前に各チャンクの行数を送信します。この設定によってリソースの一部を事前に割り当てる脚本を書くのに役立ちます + - デフォルト値: false +- `command_termination_timeout` + - 説明: コマンド終了タイムアウト(秒単位) + - デフォルト値: 10 +- `command_read_timeout` + - 説明: コマンド stdout からデータを読み取るためのタイムアウト(ミリ秒単位) + - デフォルト値: 10000 +- `command_write_timeout` + - 説明: コマンド stdin にデータを書き込むためのタイムアウト(ミリ秒単位) + - デフォルト値: 10000 + +例を見てみましょう。この Python スクリプトは `my_script.py` と名付けられ、`user_scripts` フォルダに保存されています。それは数値 `i` を読み取り、各文字列がタブで区切られた番号とともに、`i` 個のランダムな文字列を出力します: + +```python +#!/usr/bin/python3 + +import sys +import string +import random + +def main(): + + # 入力値を読み取る + for number in sys.stdin: + i = int(number) + + # ランダムな行を生成する + for id in range(0, i): + letters = string.ascii_letters + random_string = ''.join(random.choices(letters ,k=10)) + print(str(id) + '\t' + random_string + '\n', end='') + + # 結果を stdout にフラッシュする + sys.stdout.flush() + +if __name__ == "__main__": + main() +``` + +次の `my_executable_table` は `my_script.py` の出力から構築されており、`my_executable_table` から `SELECT` を実行するたびに 10 個のランダムな文字列を生成します: + +```sql +CREATE TABLE my_executable_table ( + x UInt32, + y String +) +ENGINE = Executable('my_script.py', TabSeparated, (SELECT 10)) +``` + +テーブルを作成しても即座にスクリプトを実行することはなく、`my_executable_table` をクエリするとスクリプトが実行されます: + +```sql +SELECT * FROM my_executable_table +``` + +```response +┌─x─┬─y──────────┐ +│ 0 │ BsnKBsNGNH │ +│ 1 │ mgHfBCUrWM │ +│ 2 │ iDQAVhlygr │ +│ 3 │ uNGwDuXyCk │ +│ 4 │ GcFdQWvoLB │ +│ 5 │ UkciuuOTVO │ +│ 6 │ HoKeCdHkbs │ +│ 7 │ xRvySxqAcR │ +│ 8 │ LKbXPHpyDI │ +│ 9 │ zxogHTzEVV │ +└───┴────────────┘ +``` + +## クエリ結果をスクリプトに渡す + +Hacker News のユーザーはコメントを残します。Python には自然言語処理のツールキット(`nltk`)があり、コメントがポジティブ、ネガティブ、あるいは中立であるかを判定する `SentimentIntensityAnalyzer` が存在します。Hacker News のコメントの感情を `nltk` を使用して計算する `Executable` テーブルを作成してみましょう。 + +この例では、[このページ](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/invertedindexes/#full-text-search-of-the-hacker-news-dataset)で説明されている `hackernews` テーブルを使用します。`hackernews` テーブルには `UInt64` タイプの `id` カラムと `comment` という名前の `String` カラムがあります。まずは `Executable` テーブルを定義してみましょう: + +```sql +CREATE TABLE sentiment ( + id UInt64, + sentiment Float32 +) +ENGINE = Executable( + 'sentiment.py', + TabSeparated, + (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20) +); +``` + +`sentiment` テーブルについていくつかのコメント: + +- ファイル `sentiment.py` は `user_scripts` フォルダに保存されています(`user_scripts_path` 設定のデフォルトフォルダ) +- `TabSeparated` フォーマットは、Python スクリプトがタブ区切りの値を含む生データ行を生成する必要があることを意味します +- クエリは `hackernews` から 2 つのカラムを選択しています。Python スクリプトはそれらのカラム値を入力行から解析する必要があります + +`sentiment.py` の定義はこちらです: + +```python +#!/usr/local/bin/python3.9 + +import sys +import nltk +from nltk.sentiment import SentimentIntensityAnalyzer + +def main(): + sentiment_analyzer = SentimentIntensityAnalyzer() + + while True: + try: + row = sys.stdin.readline() + if row == '': + break + + split_line = row.split("\t") + + id = str(split_line[0]) + comment = split_line[1] + + score = sentiment_analyzer.polarity_scores(comment)['compound'] + print(id + '\t' + str(score) + '\n', end='') + sys.stdout.flush() + except BaseException as x: + break + +if __name__ == "__main__": + main() +``` + +Python スクリプトに関するコメント: + +- 機能させるためには `nltk.downloader.download('vader_lexicon')` を実行する必要があります。これはスクリプト内に配置することも可能ですが、そうすると `sentiment` テーブルの各クエリ実行ごとにダウンロードされるため非効率です +- `row` の各値は `SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20` の結果セット内の行です +- 入力行はタブ区切りなので、Python の `split` 関数を使って `id` と `comment` を解析します +- `polarity_scores` の結果は JSON オブジェクトで、いくつかの値を持ちます。ここではその JSON オブジェクトの `compound` 値だけを取得することにしました +- ClickHouse の `sentiment` テーブルは `TabSeparated` フォーマットを使用し、2 つのカラムを含むので、`print` 関数でそれらのカラムをタブで区切っています + +`sentiment` テーブルから行を選択するクエリを書くたびに、`SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20` クエリが実行され、その結果が `sentiment.py` に渡されます。試してみましょう: + +```sql +SELECT * +FROM sentiment +``` + +レスポンスは次のようになります: + +```response +┌───────id─┬─sentiment─┐ +│ 7398199 │ 0.4404 │ +│ 21640317 │ 0.1779 │ +│ 21462000 │ 0 │ +│ 25168863 │ 0 │ +│ 25168978 │ -0.1531 │ +│ 25169359 │ 0 │ +│ 25169394 │ -0.9231 │ +│ 25169766 │ 0.4137 │ +│ 25172570 │ 0.7469 │ +│ 25173687 │ 0.6249 │ +│ 28291534 │ 0 │ +│ 28291669 │ -0.4767 │ +│ 28291731 │ 0 │ +│ 28291949 │ -0.4767 │ +│ 28292004 │ 0.3612 │ +│ 28292050 │ -0.296 │ +│ 28292322 │ 0 │ +│ 28295172 │ 0.7717 │ +│ 28295288 │ 0.4404 │ +│ 21465723 │ -0.6956 │ +└──────────┴───────────┘ +``` + +## ExecutablePool テーブルの作成 + +`ExecutablePool` の文法は `Executable` と似ていますが、`ExecutablePool` テーブルにはいくつかの特有の設定があります: + +- `pool_size` + - 説明: プロセスプールのサイズ。サイズが0の場合、サイズ制限はありません + - デフォルト値: 16 +- `max_command_execution_time` + - 説明: コマンドの最大実行時間(秒単位) + - デフォルト値: 10 + +上記の `sentiment` テーブルを `Executable` ではなく `ExecutablePool` を使用するように簡単に変換できます: + +```sql +CREATE TABLE sentiment_pooled ( + id UInt64, + sentiment Float32 +) +ENGINE = ExecutablePool( + 'sentiment.py', + TabSeparated, + (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20000) +) +SETTINGS + pool_size = 4; +``` + +クライアントが `sentiment_pooled` テーブルをクエリすると、ClickHouse はオンデマンドで 4 つのプロセスを維持します。 diff --git a/docs/ja/engines/table-engines/special/external-data.md b/docs/ja/engines/table-engines/special/external-data.md new file mode 100644 index 00000000000..7b8ff5adc16 --- /dev/null +++ b/docs/ja/engines/table-engines/special/external-data.md @@ -0,0 +1,64 @@ +--- +slug: /ja/engines/table-engines/special/external-data +sidebar_position: 130 +sidebar_label: 外部データ +--- + +# クエリ処理用の外部データ + +ClickHouseでは、`SELECT`クエリと一緒に、クエリの処理に必要なデータをサーバに送信することができます。このデータは一時テーブル(「一時テーブル」のセクションを参照)に置かれ、クエリで使用することができます(例えば、`IN`演算子内で)。 + +例えば、重要なユーザー識別子を持つテキストファイルがある場合、このリストによるフィルタリングを行うクエリと一緒に、サーバにアップロードすることができます。 + +大量の外部データで複数のクエリを実行する必要がある場合、この機能は使用しないでください。このデータを事前にデータベースにアップロードする方が良いです。 + +外部データは、コマンドラインクライアント(非対話モード)やHTTPインターフェースを使用してアップロードできます。 + +コマンドラインクライアントでは、次の形式でパラメータセクションを指定できます。 + +``` bash +--external --file=... [--name=...] [--format=...] [--types=...|--structure=...] +``` + +このようなセクションを複数持つことができ、送信されるテーブルの数に応じます。 + +**–external** – 節の開始を示します。 +**–file** – テーブルダンプのファイルへのパス、またはstdinを指す-です。stdinからは1つのテーブルしか取得できません。 + +以下のパラメータは任意です:**–name**– テーブルの名前。省略した場合、_dataが使用されます。 +**–format** – ファイル内のデータ形式。省略した場合、TabSeparatedが使用されます。 + +次のいずれかのパラメータは必須です:**–types** – カンマで区切られたカラムタイプのリスト。例: `UInt64,String`。カラムは_1, _2, ...と命名されます。 +**–structure**– テーブル構造で`UserID UInt64`, `URL String`の形式で定義。カラム名とタイプを定義します。 + +‘file’で指定されたファイルは、‘format’で指定された形式で解析され、‘types’や‘structure’で指定されたデータ型を使用します。このテーブルはサーバにアップロードされ、‘name’で指定された名前で一時テーブルとしてアクセス可能になります。 + +例: + +``` bash +$ echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8 +849897 +$ cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String' +/bin/sh 20 +/bin/false 5 +/bin/bash 4 +/usr/sbin/nologin 1 +/bin/sync 1 +``` + +HTTPインターフェースを使用する場合、外部データはmultipart/form-data形式で渡されます。各テーブルは個別のファイルとして送信されます。テーブル名はファイル名から取得されます。`query_string`には`name_format`、`name_types`、`name_structure`のパラメータが渡されます。`name`はこれらのパラメータに対応するテーブル名です。パラメータの意味はコマンドラインクライアントを使用するときと同じです。 + +例: + +``` bash +$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv + +$ curl -F 'passwd=@passwd.tsv;' 'http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String' +/bin/sh 20 +/bin/false 5 +/bin/bash 4 +/usr/sbin/nologin 1 +/bin/sync 1 +``` + +分散クエリ処理の場合、一時テーブルはすべてのリモートサーバに送信されます。 diff --git a/docs/ja/engines/table-engines/special/file.md b/docs/ja/engines/table-engines/special/file.md new file mode 100644 index 00000000000..ab5fd499125 --- /dev/null +++ b/docs/ja/engines/table-engines/special/file.md @@ -0,0 +1,110 @@ +--- +slug: /ja/engines/table-engines/special/file +sidebar_position: 40 +sidebar_label: File +--- + +# Fileテーブルエンジン + +Fileテーブルエンジンは、サポートされている[ファイルフォーマット](../../../interfaces/formats.md#formats)(`TabSeparated`、`Native`など)の一つでファイルにデータを保持します。 + +使用シナリオ: + +- ClickHouseからファイルへのデータエクスポート。 +- データをあるフォーマットから別のフォーマットに変換。 +- ディスク上のファイルを編集してClickHouse内のデータを更新。 + +:::note +このエンジンは現在ClickHouse Cloudでは利用できませんので、[代わりにS3テーブル関数を使用してください](/docs/ja/sql-reference/table-functions/s3.md)。 +::: + +## ClickHouseサーバーでの使用 {#usage-in-clickhouse-server} + +``` sql +File(Format) +``` + +`Format`パラメータは利用可能なファイルフォーマットの一つを指定します。`SELECT`クエリを実行するには入力用、`INSERT`クエリを実行するには出力用のフォーマットがサポートされている必要があります。利用可能なフォーマットは[Formats](../../../interfaces/formats.md#formats)セクションに一覧で載っています。 + +ClickHouseは、`File`のファイルシステムパスの指定を許可していません。これはサーバー設定で[パス](../../../operations/server-configuration-parameters/settings.md)として定義されたフォルダを使用します。 + +`File(Format)`を使用してテーブルを作成すると、そのフォルダ内に空のサブディレクトリが作成されます。テーブルにデータが書き込まれると、そのサブディレクトリ内の`data.Format`ファイルにデータが保存されます。 + +サーバーファイルシステム内にこのサブフォルダとファイルを手動で作成し、マッチングする名前で[ATTACH](../../../sql-reference/statements/attach.md)することで、そのファイルからデータをクエリすることができます。 + +:::note +この機能を使用する際は注意してください。ClickHouseはそのようなファイルへの外部変更を追跡しません。ClickHouseとClickHouse外で同時に書き込みが行われた場合、結果は未定義です。 +::: + +## 例 {#example} + +**1.** `file_engine_table`テーブルを設定する: + +``` sql +CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated) +``` + +デフォルトでは、ClickHouseは`/var/lib/clickhouse/data/default/file_engine_table`フォルダを作成します。 + +**2.** `/var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated`を手動で作成し、以下の内容を含める: + +``` bash +$ cat data.TabSeparated +one 1 +two 2 +``` + +**3.** データをクエリする: + +``` sql +SELECT * FROM file_engine_table +``` + +``` text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## ClickHouse-localでの使用 {#usage-in-clickhouse-local} + +[clickhouse-local](../../../operations/utilities/clickhouse-local.md)では、Fileエンジンは`Format`に加えてファイルパスを受け入れます。デフォルトの入力/出力ストリームは、数値または人間に読みやすい名前(`0`や`stdin`、`1`や`stdout`など)で指定できます。圧縮ファイルの読み書きが、追加のエンジンパラメータまたはファイル拡張子(`gz`、`br`、または`xz`)に基づいて可能です。 + +**例:** + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table" +``` + +## 実装の詳細 {#details-of-implementation} + +- 複数の`SELECT`クエリを同時に実行できますが、`INSERT`クエリは互いに待ちます。 +- `INSERT`クエリによる新しいファイルの作成がサポートされています。 +- ファイルが存在する場合、`INSERT`は新しい値を追加します。 +- サポートされていない機能: + - `ALTER` + - `SELECT ... SAMPLE` + - インデックス + - レプリケーション + +## PARTITION BY {#partition-by} + +`PARTITION BY` — オプションです。データをパーティションキーでパーティショニングすることで、別々のファイルを作成できます。ほとんどの場合、パーティションキーは必要ありませんし、必要であっても月ごとよりも詳細にする必要は通常ありません。パーティショニングはクエリを高速化しません(ORDER BY式とは対照的に)。過度に詳細なパーティショニングを使用しないでください。クライアント識別子や名前などでデータをパーティショニングしないで、クライアント識別子や名前をORDER BY式の最初のカラムにしてください。 + +月ごとにパーティショニングするには、`date_column`が[Date](/docs/ja/sql-reference/data-types/date.md)型の日付を持つカラムである場合、`toYYYYMM(date_column)`式を使用します。ここでのパーティション名は`"YYYYMM"`フォーマットになります。 + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。型: `LowCardinalty(String)`。 +- `_file` — ファイルの名前。型: `LowCardinalty(String)`。 +- `_size` — ファイルサイズ(バイト)。型: `Nullable(UInt64)`。サイズが不明な場合は値は`NULL`。 +- `_time` — ファイルの最終更新時刻。型: `Nullable(DateTime)`。時刻が不明な場合は値は`NULL`。 + +## 設定 {#settings} + +- [engine_file_empty_if_not_exists](/docs/ja/operations/settings/settings.md#engine-file-empty_if-not-exists) - 存在しないファイルから空のデータを選択することを許可します。デフォルトで無効です。 +- [engine_file_truncate_on_insert](/docs/ja/operations/settings/settings.md#engine-file-truncate-on-insert) - 挿入前にファイルを切り詰めることを許可します。デフォルトで無効です。 +- [engine_file_allow_create_multiple_files](/docs/ja/operations/settings/settings.md#engine_file_allow_create_multiple_files) - フォーマットにサフィックスがある場合は、各挿入で新しいファイルを作成することを許可します。デフォルトで無効です。 +- [engine_file_skip_empty_files](/docs/ja/operations/settings/settings.md#engine-file-skip-empty-files) - 読み込み中に空のファイルをスキップすることを許可します。デフォルトで無効です。 +- [storage_file_read_method](/docs/ja/operations/settings/settings.md#engine-file-empty_if-not-exists) - ストレージファイルからデータを読み取る方法、`read`、`pread`、`mmap`のいずれか。mmapメソッドはclickhouse-serverには適用されません(clickhouse-local用)。デフォルト値: clickhouse-serverでは`pread`、clickhouse-localでは`mmap`。 diff --git a/docs/ja/engines/table-engines/special/filelog.md b/docs/ja/engines/table-engines/special/filelog.md new file mode 100644 index 00000000000..e339ad5938a --- /dev/null +++ b/docs/ja/engines/table-engines/special/filelog.md @@ -0,0 +1,104 @@ +--- +slug: /ja/engines/table-engines/special/filelog +sidebar_position: 160 +sidebar_label: FileLog +--- + +# FileLog エンジン {#filelog-engine} + +このエンジンは、アプリケーションログファイルをレコードのストリームとして処理することができます。 + +`FileLog`を使用すると次のことができます: + +- ログファイルを購読する。 +- 購読したログファイルに新しいレコードが追加されると、それを処理する。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = FileLog('path_to_logs', 'format_name') SETTINGS + [poll_timeout_ms = 0,] + [poll_max_batch_size = 0,] + [max_block_size = 0,] + [max_threads = 0,] + [poll_directory_watch_events_backoff_init = 500,] + [poll_directory_watch_events_backoff_max = 32000,] + [poll_directory_watch_events_backoff_factor = 2,] + [handle_error_mode = 'default'] +``` + +エンジン引数: + +- `path_to_logs` – 購読するログファイルへのパス。ログファイルがあるディレクトリまたは単一のログファイルへのパスにすることができます。ClickHouseは`user_files`ディレクトリ内のパスのみを許可することに注意してください。 +- `format_name` - レコードフォーマット。FileLog はファイル内の各行を個別のレコードとして処理し、すべてのデータフォーマットが適しているわけではありません。 + +オプションのパラメータ: + +- `poll_timeout_ms` - ログファイルからの単一ポールのタイムアウト。デフォルト: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms)。 +- `poll_max_batch_size` — 単一ポールでポールされるレコードの最大数。デフォルト: [max_block_size](../../../operations/settings/settings.md#setting-max_block_size)。 +- `max_block_size` — ポールの最大バッチサイズ(レコード数)。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 +- `max_threads` - ファイルを解析するための最大スレッド数、デフォルトは0で、これは max(1, physical_cpu_cores / 4) となります。 +- `poll_directory_watch_events_backoff_init` - ディレクトリを監視するスレッドの初期スリープ値。デフォルト: `500`。 +- `poll_directory_watch_events_backoff_max` - ディレクトリ監視スレッドの最大スリープ値。デフォルト: `32000`。 +- `poll_directory_watch_events_backoff_factor` - バックオフの速度、デフォルトで指数的。デフォルト: `2`。 +- `handle_error_mode` — FileLog エンジンでのエラーハンドリング方法。可能な値: デフォルト(メッセージの解析に失敗したときに例外がスローされる)、ストリーム(例外メッセージと生メッセージが仮想カラム`_error`と`_raw_message`に保存される)。 + +## 説明 {#description} + +配信されたレコードは自動的に追跡されるため、ログファイル内の各レコードは一度だけカウントされます。 + +`SELECT`はレコードを読み取るためには特に有用ではありません(デバッグ以外では)、というのも各レコードは一度だけしか読めないからです。より実用的なのは、[materialized views](../../../sql-reference/statements/create/view.md) を用いてリアルタイムのスレッドを作成することです。手順は以下の通りです: + +1. エンジンを用いて FileLog テーブルを作成し、それをデータストリームと見なす。 +2. 目的の構造を持つテーブルを作成する。 +3. エンジンからデータを変換し、事前に作成したテーブルにデータを格納する materialized view を作成する。 + +`MATERIALIZED VIEW`がエンジンに結合されると、バックグラウンドでデータを収集し始めます。これにより、ログファイルからレコードを継続的に受け取り、`SELECT`を使って必要なフォーマットに変換できます。一つの FileLog テーブルは、好きなだけ materialized views を持つことができます。これらはテーブルから直接データを読み取ることはせず、新しいレコード(ブロック単位)を受け取ることで、異なる詳細レベル(集計 - グループ化ありとなし)の複数のテーブルに書き込むことができます。 + +例: + +``` sql + CREATE TABLE logs ( + timestamp UInt64, + level String, + message String + ) ENGINE = FileLog('user_files/my_app/app.log', 'JSONEachRow'); + + CREATE TABLE daily ( + day Date, + level String, + total UInt64 + ) ENGINE = SummingMergeTree(day, (day, level), 8192); + + CREATE MATERIALIZED VIEW consumer TO daily + AS SELECT toDate(toDateTime(timestamp)) AS day, level, count() as total + FROM queue GROUP BY day, level; + + SELECT level, sum(total) FROM daily GROUP BY level; +``` + +ストリームデータの受信を停止したい場合や変換ロジックを変更したい場合、materialized viewをデタッチします: + +``` sql + DETACH TABLE consumer; + ATTACH TABLE consumer; +``` + +`ALTER`を使ってターゲットテーブルを変更したい場合は、ターゲットテーブルとビューからのデータの間に不整合が生じるのを避けるために、material viewを無効化することをお勧めします。 + +## 仮想カラム {#virtual-columns} + +- `_filename` - ログファイルの名前。データ型: `LowCardinality(String)`。 +- `_offset` - ログファイル内のオフセット。データ型: `UInt64`。 + +`handle_error_mode='stream'`の際の追加の仮想カラム: + +- `_raw_record` - 正しく解析できなかった生レコード。データ型: `Nullable(String)`。 +- `_error` - 解析失敗時の例外メッセージ。データ型: `Nullable(String)`。 + +注意: `_raw_record`および`_error`の仮想カラムは、解析中に例外が発生した場合のみ埋められ、メッセージが正常に解析された場合は常に`NULL`です。 diff --git a/docs/ja/engines/table-engines/special/generate.md b/docs/ja/engines/table-engines/special/generate.md new file mode 100644 index 00000000000..66931f0cf05 --- /dev/null +++ b/docs/ja/engines/table-engines/special/generate.md @@ -0,0 +1,56 @@ +--- +slug: /ja/engines/table-engines/special/generate +sidebar_position: 140 +sidebar_label: GenerateRandom +title: "GenerateRandom テーブルエンジン" +--- + +GenerateRandomテーブルエンジンは、指定したテーブルスキーマに対してランダムなデータを生成します。 + +使用例: + +- テストで再現可能な大規模テーブルを生成する。 +- ファジングテストのためにランダムな入力を生成する。 + +## ClickHouseサーバーでの使用例 {#usage-in-clickhouse-server} + +``` sql +ENGINE = GenerateRandom([random_seed [,max_string_length [,max_array_length]]]) +``` + +`max_array_length`と`max_string_length`パラメータは、生成されたデータ内のすべての配列またはマップカラムと文字列の最大長をそれぞれ指定します。 + +Generateテーブルエンジンは`SELECT`クエリのみをサポートします。 + +表に格納できるすべての[データ型](../../../sql-reference/data-types/index.md)をサポートし、`AggregateFunction`を除きます。 + +## 例 {#example} + +**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` + - インデックス + - レプリケーション diff --git a/docs/ja/engines/table-engines/special/index.md b/docs/ja/engines/table-engines/special/index.md new file mode 100644 index 00000000000..a67534760f7 --- /dev/null +++ b/docs/ja/engines/table-engines/special/index.md @@ -0,0 +1,15 @@ +--- +slug: /ja/engines/table-engines/special/ +sidebar_position: 50 +sidebar_label: Special +--- + +# 特殊テーブルエンジン + +テーブルエンジンには三つの主要なカテゴリーがあります。 + +- 本番環境向けの[MergeTreeエンジンファミリー](../../../engines/table-engines/mergetree-family/index.md)。 +- 小規模または一時的なデータ用の[Logエンジンファミリー](../../../engines/table-engines/log-family/index.md)。 +- 統合のための[テーブルエンジン](../../../engines/table-engines/integrations/index.md)。 + +残りのエンジンはその目的が独特で、まだファミリーには分類されていないため、この「特殊」カテゴリーに配置されています。 diff --git a/docs/ja/engines/table-engines/special/join.md b/docs/ja/engines/table-engines/special/join.md new file mode 100644 index 00000000000..5c20290edfa --- /dev/null +++ b/docs/ja/engines/table-engines/special/join.md @@ -0,0 +1,163 @@ +--- +slug: /ja/engines/table-engines/special/join +sidebar_position: 70 +sidebar_label: Join +--- + +# Join テーブルエンジン + +[JOIN](/docs/ja/sql-reference/statements/select/join.md/#select-join) 操作で使用するためのオプションの準備済みデータ構造です。 + +:::note +これは [JOIN句](/docs/ja/sql-reference/statements/select/join.md/#select-join) そのものに関する記事ではありません。 +::: + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], +) ENGINE = Join(join_strictness, join_type, k1[, k2, ...]) +``` + +[CREATE TABLE](/docs/ja/sql-reference/statements/create/table.md/#create-table-query) クエリの詳細な説明を参照してください。 + +## エンジンパラメータ + +### join_strictness + +`join_strictness` – [JOIN厳密性](/docs/ja/sql-reference/statements/select/join.md/#select-join-types)。 + +### join_type + +`join_type` – [JOIN型](/docs/ja/sql-reference/statements/select/join.md/#select-join-types)。 + +### キーカラム + +`k1[, k2, ...]` – `JOIN` 操作で `USING` 句から使われるキーカラムです。 + +`join_strictness` と `join_type` パラメータは、例として `Join(ANY, LEFT, col1)` のように引用符なしで入力します。これらはテーブルが使用される `JOIN` 操作に一致する必要があります。パラメータが一致しない場合、ClickHouse は例外をスローせず、不正確なデータを返す可能性があります。 + +## 特長と推奨事項 {#specifics-and-recommendations} + +### データストレージ {#data-storage} + +`Join` テーブルのデータは常に RAM に置かれます。テーブルに行を挿入する際、ClickHouse はデータブロックをディスク上のディレクトリに書き込み、サーバーが再起動した際に復元できるようにします。 + +サーバーが不正に再起動すると、ディスク上のデータブロックが失われたり破損したりする可能性があります。この場合、破損したデータのファイルを手動で削除する必要があるかもしれません。 + +### データの選択と挿入 {#selecting-and-inserting-data} + +`Join` エンジンのテーブルにデータを追加するために `INSERT` クエリを使用できます。テーブルが `ANY` 厳密性で作成された場合、重複したキーのデータは無視されます。`ALL` 厳密性の場合、すべての行が追加されます。 + +`Join` エンジンのテーブルの主な使用ケースは以下の通りです: + +- `JOIN` 句でテーブルを右側に配置する。 +- 同じ方法でテーブルからデータを抽出できる [joinGet](/docs/ja/sql-reference/functions/other-functions.md/#joinget) 関数を呼び出す。 + +### データの削除 {#deleting-data} + +`Join` エンジンのテーブルに対する `ALTER DELETE` クエリは、[変異](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。`DELETE` 変異はフィルタリングされたデータを読み取り、メモリとディスクのデータを上書きします。 + +### 制限と設定 {#join-limitations-and-settings} + +テーブルを作成する際、以下の設定が適用されます: + +#### join_use_nulls + +[join_use_nulls](/docs/ja/operations/settings/settings.md/#join_use_nulls) + +#### max_rows_in_join + +[max_rows_in_join](/docs/ja/operations/settings/query-complexity.md/#settings-max_rows_in_join) + +#### max_bytes_in_join + +[max_bytes_in_join](/docs/ja/operations/settings/query-complexity.md/#settings-max_bytes_in_join) + +#### join_overflow_mode + +[join_overflow_mode](/docs/ja/operations/settings/query-complexity.md/#settings-join_overflow_mode) + +#### join_any_take_last_row + +[join_any_take_last_row](/docs/ja/operations/settings/settings.md/#join_any_take_last_row) + +### persistent + +Join と [Set](/docs/ja/engines/table-engines/special/set.md) テーブルエンジンに対する永続性を無効にします。 + +I/O のオーバーヘッドを削減します。パフォーマンスを追求し永続性が必要ないシナリオに適しています。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 + +デフォルト値: `1`。 + +`Join` エンジンのテーブルは `GLOBAL JOIN` 操作で使用することはできません。 + +`Join` エンジンでは [join_use_nulls](/docs/ja/operations/settings/settings.md/#join_use_nulls) 設定を `CREATE TABLE` ステートメントで指定できます。[SELECT](/docs/ja/sql-reference/statements/select/index.md) クエリは同じ `join_use_nulls` 値を持っている必要があります。 + +## 使用例 {#example} + +左側のテーブルを作成: + +``` sql +CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog; +``` + +``` sql +INSERT INTO id_val VALUES (1,11)(2,12)(3,13); +``` + +右側の `Join` テーブルを作成: + +``` sql +CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id); +``` + +``` sql +INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23); +``` + +テーブルを結合: + +``` sql +SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id); +``` + +``` text +┌─id─┬─val─┬─id_val_join.val─┐ +│ 1 │ 11 │ 21 │ +│ 2 │ 12 │ 0 │ +│ 3 │ 13 │ 23 │ +└────┴─────┴─────────────────┘ +``` + +代替として、結合キーの値を指定して `Join` テーブルからデータを取得することができます: + +``` sql +SELECT joinGet('id_val_join', 'val', toUInt32(1)); +``` + +``` text +┌─joinGet('id_val_join', 'val', toUInt32(1))─┐ +│ 21 │ +└────────────────────────────────────────────┘ +``` + +`Join` テーブルから行を削除: + +```sql +ALTER TABLE id_val_join DELETE WHERE id = 3; +``` + +```text +┌─id─┬─val─┐ +│ 1 │ 21 │ +└────┴─────┘ +``` diff --git a/docs/ja/engines/table-engines/special/keepermap.md b/docs/ja/engines/table-engines/special/keepermap.md new file mode 100644 index 00000000000..3e0e697390c --- /dev/null +++ b/docs/ja/engines/table-engines/special/keepermap.md @@ -0,0 +1,117 @@ +--- +slug: /ja/engines/table-engines/special/keeper-map +sidebar_position: 150 +sidebar_label: KeeperMap +--- + +# KeeperMap {#keepermap} + +このエンジンを使用すると、Keeper/ZooKeeper クラスターを一貫したキー・バリュー ストアとして利用でき、線形化された書き込みと、順次整合性のある読み取りが可能になります。 + +KeeperMap ストレージエンジンを有効にするには、テーブルを保存する ZooKeeper パスを `` 設定で定義する必要があります。 + +例: + +```xml + + /keeper_map_tables + +``` + +ここで、パスは他の任意の有効な ZooKeeper パスであることができます。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) ENGINE = KeeperMap(root_path, [keys_limit]) PRIMARY KEY(primary_key_name) +``` + +エンジンパラメータ: + +- `root_path` - `table_name` が保存される ZooKeeper パス。 +このパスには `` 設定で定義されたプレフィックスを含める必要はありません。プレフィックスは自動的に `root_path` に追加されます。 +さらに、`auxiliary_zookeeper_cluster_name:/some/path` の形式もサポートされており、`auxiliary_zookeeper_cluster` は `` 設定内で定義された ZooKeeper クラスターです。 +デフォルトでは、`` 設定内で定義された ZooKeeper クラスターが使用されます。 +- `keys_limit` - テーブル内に許可されるキーの数。 +この制限はソフトリミットであり、エッジケースでテーブルにより多くのキーが入り込む可能性があります。 +- `primary_key_name` – カラムリスト内の任意のカラム名。 +- `主キー` は指定する必要があり、主キーには1つのカラムのみをサポートします。主キーは ZooKeeper 内で `ノード名` としてバイナリでシリアル化されます。 +- 主キー以外のカラムは対応する順序でバイナリにシリアル化され、シリアル化されたキーによって定義された結果ノードの値として保存されます。 +- キーに対する `equals` または `in` フィルタリングを使用したクエリは `Keeper` からのマルチキー検索に最適化され、それ以外の場合はすべての値がフェッチされます。 + +例: + +``` sql +CREATE TABLE keeper_map_table +( + `key` String, + `v1` UInt32, + `v2` String, + `v3` Float32 +) +ENGINE = KeeperMap('/keeper_map_table', 4) +PRIMARY KEY key +``` + +以下の設定で + +```xml + + /keeper_map_tables + +``` + +各値、すなわち `(v1, v2, v3)` のバイナリシリアル化されたものは、`Keeper` 内の `/keeper_map_tables/keeper_map_table/data/serialized_key` 内に保存されます。 +また、キー数にはソフトリミットとして4の制限があります。 + +同じ ZooKeeper パスに対して複数のテーブルを作成した場合、値は少なくとも1つのテーブルがそれを使用している限り、永続化されます。 +したがって、テーブルを作成する際に `ON CLUSTER` 句を使用して、複数の ClickHouse インスタンスからデータを共有することが可能です。 +もちろん、無関連な ClickHouse インスタンスで同じパスを持つ `CREATE TABLE` を手動で実行して、同じデータ共有効果を得ることもできます。 + +## 対応する操作 {#supported-operations} + +### 挿入 + +`KeeperMap` に新しい行を挿入する場合、キーが存在しない場合は、そのキーのための新しいエントリが作成されます。 +キーが存在する場合で、`keeper_map_strict_mode` 設定が `true` に設定されている場合は、例外がスローされ、そうでない場合はキーの値が上書きされます。 + +例: + +```sql +INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2); +``` + +### 削除 + +行は `DELETE` クエリまたは `TRUNCATE` を使用して削除できます。 +キーが存在し、かつ `keeper_map_strict_mode` 設定が `true` に設定されている場合、データの取得と削除は、アトミックに実行される場合にのみ成功します。 + +```sql +DELETE FROM keeper_map_table WHERE key LIKE 'some%' AND v1 > 1; +``` + +```sql +ALTER TABLE keeper_map_table DELETE WHERE key LIKE 'some%' AND v1 > 1; +``` + +```sql +TRUNCATE TABLE keeper_map_table; +``` + +### 更新 + +値は `ALTER TABLE` クエリを使用して更新できます。主キーは更新できません。 +`keeper_map_strict_mode` 設定が `true` に設定されている場合、データの取得と更新はアトミックに実行された場合にのみ成功します。 + +```sql +ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1; +``` + +## 関連コンテンツ + +- ブログ: [リアルタイム分析アプリケーションを ClickHouse と Hex で構築する](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine) diff --git a/docs/ja/engines/table-engines/special/memory.md b/docs/ja/engines/table-engines/special/memory.md new file mode 100644 index 00000000000..399b6886885 --- /dev/null +++ b/docs/ja/engines/table-engines/special/memory.md @@ -0,0 +1,99 @@ +--- +slug: /ja/engines/table-engines/special/memory +sidebar_position: 110 +sidebar_label: Memory +--- + +# Memory テーブルエンジン + +:::note +ClickHouse CloudでMemoryテーブルエンジンを使用する際、データは全ノード間でレプリケーションされません(設計によるもの)。全クエリを同一ノードにルーティングし、Memoryテーブルエンジンが期待通りに動作することを保証するために、以下のいずれかを行うことができます: +- 同じセッション内で全ての操作を実行する +- [clickhouse-client](/ja/interfaces/cli)のようなTCPまたはネイティブインターフェイスを使用するクライアントを使用する(これによりスティッキー接続のサポートが有効になる) +::: + +MemoryエンジンはデータをRAMに非圧縮形式で保存します。データは読み込まれる時に受け取った形式と全く同じ形で保存されます。言い換えれば、このテーブルからの読み取りは完全に無料です。並行データアクセスは同期されています。ロックは短く、読み取りと書き込み操作が互いをブロックすることはありません。インデックスはサポートされていません。読み取りは並列化されています。 + +シンプルなクエリで最大の生産性(10 GB/秒以上)が得られます。なぜなら、ディスクからの読み取りやデータの解凍、逆シリアル化がないためです。(多くの場合、MergeTreeエンジンの生産性はほぼ同等であることを記しておくべきです。)サーバーを再起動すると、データはテーブルから消え、テーブルは空になります。通常、このテーブルエンジンを使用する理由はありません。しかし、テストや比較的小さい行数(おおよそ1億行まで)で最大の速度が必要なタスクには使用することができます。 + +Memoryエンジンは、外部クエリデータを含む一時テーブルや、`GLOBAL IN`の実装(「INオペレーター」のセクションを参照)にシステムによって使用されます。 + +Memoryエンジンテーブルサイズを制限するために上下限を指定することができ、これにより循環バッファとして機能させることが可能です([エンジンパラメーター](#engine-parameters)参照)。 + +## エンジンパラメーター {#engine-parameters} + +- `min_bytes_to_keep` — サイズ制限がある場合にメモリテーブルに保持する最小バイト数。 + - デフォルト値: `0` + - `max_bytes_to_keep`が必要 +- `max_bytes_to_keep` — メモリテーブル内で保持する最大バイト数。この値を超えると各挿入で最古の行が削除されます(つまり循環バッファ)。大きなブロックを追加する際に、削除する最古の行のバッチが`min_bytes_to_keep`の制限下にあると、この最大バイト数の制限を超えることがあります。 + - デフォルト値: `0` +- `min_rows_to_keep` — サイズ制限がある場合にメモリテーブルに保持する最小行数。 + - デフォルト値: `0` + - `max_rows_to_keep`が必要 +- `max_rows_to_keep` — メモリテーブル内で保持する最大行数。この値を超えると各挿入で最古の行が削除されます(つまり循環バッファ)。大きなブロックを追加する際に、削除する最古の行のバッチが`min_rows_to_keep`の制限下にあると、この最大行数の制限を超えることがあります。 + - デフォルト値: `0` + +## 使用法 {#usage} + +**設定の初期化** +``` sql +CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 100, max_rows_to_keep = 1000; +``` + +**設定の変更** +```sql +ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000; +``` + +**注:** `bytes`と`rows`の両方の制限パラメーターは同時に設定可能ですが、`max`および`min`の下限が遵守されます。 + +## 例 {#examples} +``` sql +CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_bytes_to_keep = 4096, max_bytes_to_keep = 16384; + +/* 1. 最古のブロックが保持されている(3000行) */ +INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 8'192 bytes + +/* 2. 削除されないブロックを追加 */ +INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 bytes + +/* 3. 古いブロックが削除される(9216 bytes - 1100) */ +INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 bytes + +/* 4. 全てを上書きする非常に大きなブロックをチェック */ +INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 65'536 bytes + +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' and database = currentDatabase(); +``` + +``` text +┌─total_bytes─┬─total_rows─┐ +│ 65536 │ 10000 │ +└─────────────┴────────────┘ +``` + +また、行数についても: + +``` sql +CREATE TABLE memory (i UInt32) ENGINE = Memory SETTINGS min_rows_to_keep = 4000, max_rows_to_keep = 10000; + +/* 1. 最古のブロックが保持されている(3000行) */ +INSERT INTO memory SELECT * FROM numbers(0, 1600); -- 1'600 rows + +/* 2. 削除されないブロックを追加 */ +INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 rows + +/* 3. 古いブロックが削除される(9216 bytes - 1100) */ +INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 rows + +/* 4. 全てを上書きする非常に大きなブロックをチェック */ +INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 rows + +SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' and database = currentDatabase(); +``` + +``` text +┌─total_bytes─┬─total_rows─┐ +│ 65536 │ 10000 │ +└─────────────┴────────────┘ +``` diff --git a/docs/ja/engines/table-engines/special/merge.md b/docs/ja/engines/table-engines/special/merge.md new file mode 100644 index 00000000000..0d809461c81 --- /dev/null +++ b/docs/ja/engines/table-engines/special/merge.md @@ -0,0 +1,86 @@ +--- +slug: /ja/engines/table-engines/special/merge +sidebar_position: 30 +sidebar_label: Merge +--- + +# Merge テーブルエンジン + +`Merge` エンジン(`MergeTree`と混同しないでください)は、データ自体を保存するのではなく、他の任意の数のテーブルから同時に読み取ることができます。 + +読み取りは自動的に並列化されます。テーブルへの書き込みはサポートされていません。読み取りの際に、実際に読み取られるテーブルのインデックスが存在すれば使用されます。 + +## テーブルの作成 {#creating-a-table} + +``` sql +CREATE TABLE ... Engine=Merge(db_name, tables_regexp) +``` + +## エンジンパラメータ + +### db_name + +`db_name` — 使用可能な値: + - データベース名 + - データベース名を文字列で返す定数式、例:`currentDatabase()` + - DB名にマッチする正規表現の `REGEXP(expression)` + +### tables_regexp + +`tables_regexp` — 指定されたDBまたは複数のDBで、テーブル名にマッチする正規表現。 + +正規表現は、[re2](https://github.com/google/re2)(PCREのサブセットをサポート)、大文字と小文字を区別します。正規表現における記号のエスケープについては、"match"セクションのノートをご参照ください。 + +## 使用方法 {#usage} + +読み取り用のテーブルを選択する際、たとえ正規表現に一致したとしても、`Merge` テーブル自体は選択されません。これはループを避けるためです。2つの `Merge` テーブルが互いのデータを無限に読み取ろうとするシナリオを作ることは可能ですが、これは推奨されません。 + +`Merge` エンジンの典型的な使用方法は、多数の `TinyLog` テーブルを単一のテーブルのように扱う場合です。 + +## 例 {#examples} + +**例 1** + +2つのデータベース `ABC_corporate_site` と `ABC_store` を考えます。`all_visitors` テーブルには、両方のデータベースにある `visitors` テーブルのIDが含まれます。 + +``` sql +CREATE TABLE all_visitors (id UInt32) ENGINE=Merge(REGEXP('ABC_*'), 'visitors'); +``` + +**例 2** + +古いテーブル `WatchLog_old` があり、データを新しいテーブル `WatchLog_new` に移さずにパーティショニングを変更することを決めたとします。そして、両方のテーブルからデータを表示する必要があります。 + +``` sql +CREATE TABLE WatchLog_old(date Date, UserId Int64, EventType String, Cnt UInt64) + ENGINE=MergeTree(date, (UserId, EventType), 8192); +INSERT INTO WatchLog_old VALUES ('2018-01-01', 1, 'hit', 3); + +CREATE TABLE WatchLog_new(date Date, UserId Int64, EventType String, Cnt UInt64) + ENGINE=MergeTree PARTITION BY date ORDER BY (UserId, EventType) SETTINGS index_granularity=8192; +INSERT INTO WatchLog_new VALUES ('2018-01-02', 2, 'hit', 3); + +CREATE TABLE WatchLog as WatchLog_old ENGINE=Merge(currentDatabase(), '^WatchLog'); + +SELECT * FROM WatchLog; +``` + +``` text +┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐ +│ 2018-01-01 │ 1 │ hit │ 3 │ +└────────────┴────────┴───────────┴─────┘ +┌───────date─┬─UserId─┬─EventType─┬─Cnt─┐ +│ 2018-01-02 │ 2 │ hit │ 3 │ +└────────────┴────────┴───────────┴─────┘ +``` + +## 仮想カラム {#virtual-columns} + +- `_table` — データが読み取られたテーブルの名前を含む。タイプ: [String](../../../sql-reference/data-types/string.md)。 + + `WHERE/PREWHERE` 句で `_table` に定数条件を設定することができます(例:`WHERE _table='xyz'`)。この場合、読み取り操作は `_table` の条件を満たすテーブルのみに対して行われるため、カラム `_table` はインデックスとして機能します。 + +**関連項目** + +- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) +- [merge](../../../sql-reference/table-functions/merge.md) テーブル関数 diff --git a/docs/ja/engines/table-engines/special/null.md b/docs/ja/engines/table-engines/special/null.md new file mode 100644 index 00000000000..320072334a9 --- /dev/null +++ b/docs/ja/engines/table-engines/special/null.md @@ -0,0 +1,13 @@ +--- +slug: /ja/engines/table-engines/special/null +sidebar_position: 50 +sidebar_label: 'Null' +--- + +# Null テーブルエンジン + +`Null` テーブルに書き込むとデータは無視されます。`Null` テーブルから読み取ると、応答は空になります。 + +:::note +これがなぜ有用なのか疑問に思う場合は、`Null` テーブルに対して Materialized View を作成できることを確認してください。従って、テーブルに書き込まれたデータはビューに影響を与えますが、元の生データは無視されます。 +::: diff --git a/docs/ja/engines/table-engines/special/set.md b/docs/ja/engines/table-engines/special/set.md new file mode 100644 index 00000000000..4d1c8601a0d --- /dev/null +++ b/docs/ja/engines/table-engines/special/set.md @@ -0,0 +1,32 @@ +--- +slug: /ja/engines/table-engines/special/set +sidebar_position: 60 +sidebar_label: Set +--- + +# Set テーブルエンジン + +常にRAM上に存在するデータセットです。「IN演算子」の右側での使用を目的としています(「IN演算子」のセクションを参照してください)。 + +`INSERT`を使用してテーブルにデータを挿入できます。新しい要素がデータセットに追加され、重複は無視されます。ただし、テーブルから`SELECT`を実行することはできません。データを取得する唯一の方法は、IN演算子の右半分で使用することです。 + +データは常にRAMに配置されます。`INSERT`の場合、挿入されたデータのブロックもディスク上のテーブルのディレクトリに書き込まれます。サーバーの起動時に、このデータがRAMにロードされます。つまり、再起動後もデータはそのまま残ります。 + +粗雑にサーバーを再起動すると、ディスク上のデータブロックが失われたり、損傷したりするかもしれません。その場合、損傷したデータを含むファイルを手動で削除する必要があるかもしれません。 + +### 制限事項と設定 {#join-limitations-and-settings} + +テーブルを作成する際、以下の設定が適用されます: + +#### persistent + +Setおよび[Join](/docs/ja/engines/table-engines/special/join.md/#join)テーブルエンジンに対する永続性を無効にします。 + +I/Oオーバーヘッドを削減します。永続性を必要とせず、パフォーマンスを求めるシナリオに適しています。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 + +デフォルト値: `1`。 diff --git a/docs/ja/engines/table-engines/special/url.md b/docs/ja/engines/table-engines/special/url.md new file mode 100644 index 00000000000..389d638fd65 --- /dev/null +++ b/docs/ja/engines/table-engines/special/url.md @@ -0,0 +1,114 @@ +--- +slug: /ja/engines/table-engines/special/url +sidebar_position: 80 +sidebar_label: URL +--- + +# URLテーブルエンジン + +リモートHTTP/HTTPSサーバーとの間でデータをクエリします。このエンジンは、[File](../../../engines/table-engines/special/file.md)エンジンと似ています。 + +構文: `URL(URL [,Format] [,CompressionMethod])` + +- `URL`パラメータは、Uniform Resource Locatorの構造に従う必要があります。指定されたURLはHTTPまたはHTTPSを使用するサーバーを指している必要があります。サーバーから応答を得るために追加のヘッダーは必要ありません。 + +- `Format`は、ClickHouseが`SELECT`クエリで使用でき、必要に応じて`INSERT`でも使用できる形式である必要があります。サポートされている形式の全リストについては、[Formats](../../../interfaces/formats.md#formats)を参照してください。 + + この引数が指定されていない場合、ClickHouseは`URL`パラメータのサフィックスから自動的に形式を検出します。`URL`パラメータのサフィックスがサポートされている形式と一致しない場合、テーブルの作成に失敗します。例えば、エンジンの式`URL('http://localhost/test.json')`では、`JSON`形式が適用されます。 + +- `CompressionMethod`は、HTTPボディを圧縮するかどうかを示します。圧縮が有効になっている場合、URLエンジンによって送信されるHTTPパケットには、使用される圧縮方式を示す'Content-Encoding'ヘッダーが含まれます。 + +圧縮を有効にするには、まず`URL`パラメータで示されるリモートHTTPエンドポイントが対応する圧縮アルゴリズムをサポートしていることを確認してください。 + +サポートされている`CompressionMethod`は以下のいずれかです: +- gzip または gz +- deflate +- brotli または br +- lzma または xz +- zstd または zst +- lz4 +- bz2 +- snappy +- none +- auto + +`CompressionMethod`が指定されていない場合、デフォルトでは`auto`になります。これは、ClickHouseが`URL`パラメータのサフィックスから自動的に圧縮方式を検出することを意味します。サフィックスが上記の圧縮方式のいずれかと一致する場合、対応する圧縮が適用され、そうでない場合は圧縮は適用されません。 + +例えば、エンジンの式`URL('http://localhost/test.gzip')`では、`gzip`圧縮方式が適用されますが、`URL('http://localhost/test.fr')`では、サフィックス`fr`が上記の圧縮方式に一致しないため、圧縮は有効化されません。 + +## 使用例 {#using-the-engine-in-the-clickhouse-server} + +`INSERT`および`SELECT`クエリはそれぞれ`POST`および`GET`リクエストに変換されます。`POST`リクエストを処理するには、リモートサーバーが[チャンク転送エンコーディング](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)をサポートしている必要があります。 + +HTTP GETリダイレクトホップの最大数を制限するには、[max_http_get_redirects](../../../operations/settings/settings.md#setting-max_http_get_redirects)設定を使用できます。 + +## 例 {#example} + +**1.** サーバー上で`url_engine_table`テーブルを作成します: + +``` sql +CREATE TABLE url_engine_table (word String, value UInt64) +ENGINE=URL('http://127.0.0.1:12345/', CSV) +``` + +**2.** 標準のPython 3ツールを使用して基本的なHTTPサーバーを作成し、起動します: + +``` python3 +from http.server import BaseHTTPRequestHandler, HTTPServer + +class CSVHTTPServer(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header('Content-type', 'text/csv') + self.end_headers() + + self.wfile.write(bytes('Hello,1\nWorld,2\n', "utf-8")) + +if __name__ == "__main__": + server_address = ('127.0.0.1', 12345) + HTTPServer(server_address, CSVHTTPServer).serve_forever() +``` + +``` bash +$ python3 server.py +``` + +**3.** データをリクエストします: + +``` sql +SELECT * FROM url_engine_table +``` + +``` text +┌─word──┬─value─┐ +│ Hello │ 1 │ +│ World │ 2 │ +└───────┴───────┘ +``` + +## 実装の詳細 {#details-of-implementation} + +- 読み取りと書き込みは並行して行うことができます +- サポートされていない機能: + - `ALTER`および`SELECT...SAMPLE`操作。 + - インデックス。 + - レプリケーション。 + +## PARTITION BY + +`PARTITION BY` — 任意です。パーティションキーに基づいてデータを分割して、別々のファイルを作成することができます。ほとんどの場合、パーティションキーは不要であり、必要な場合でも一般的に月ごと以上に細かいパーティションキーは不要です。パーティション分割はクエリを高速化しません(ORDER BY式とは対照的です)。過度に細かいパーティション分割は避けてください。クライアントの識別子や名前でデータをパーティション分割しないでください(代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにしてください)。 + +月ごとにパーティション分割するには、`toYYYYMM(date_column)`式を使用します。ここで`date_column`は[Date](/docs/ja/sql-reference/data-types/date.md)型の日付を持つカラムです。パーティション名は`"YYYYMM"`形式になります。 + +## 仮想カラム {#virtual-columns} + +- `_path` — `URL`へのパスです。型: `LowCardinalty(String)`。 +- `_file` — `URL`のリソース名です。型: `LowCardinalty(String)`。 +- `_size` — リソースのバイト単位のサイズです。型: `Nullable(UInt64)`。サイズが不明な場合、値は`NULL`です。 +- `_time` — ファイルの最終更新時間です。型: `Nullable(DateTime)`。時間が不明な場合、値は`NULL`です。 +- `_headers` - HTTP応答ヘッダーです。型: `Map(LowCardinality(String), LowCardinality(String))`。 + +## ストレージ設定 {#storage-settings} + +- [engine_url_skip_empty_files](/docs/ja/operations/settings/settings.md#engine_url_skip_empty_files) - 読み込み時に空のファイルをスキップすることを許可します。デフォルトでは無効です。 +- [enable_url_encoding](/docs/ja/operations/settings/settings.md#enable_url_encoding) - URIのパスのデコード/エンコードを有効/無効にすることを許可します。デフォルトで有効です。 diff --git a/docs/ja/engines/table-engines/special/view.md b/docs/ja/engines/table-engines/special/view.md new file mode 100644 index 00000000000..1fde2d8dd32 --- /dev/null +++ b/docs/ja/engines/table-engines/special/view.md @@ -0,0 +1,9 @@ +--- +slug: /ja/engines/table-engines/special/view +sidebar_position: 90 +sidebar_label: View +--- + +# View テーブルエンジン + +ビューを実装するために使用されます(詳細については、`CREATE VIEW クエリ`を参照してください)。データを保存することはなく、指定された`SELECT`クエリのみを保存します。テーブルから読み込む際には、このクエリを実行し、クエリから不要なカラムをすべて削除します。 diff --git a/docs/ja/faq/_category_.yml b/docs/ja/faq/_category_.yml new file mode 100644 index 00000000000..d3b55f0a328 --- /dev/null +++ b/docs/ja/faq/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'FAQ' +collapsible: true +collapsed: true +link: + type: doc + id: en/faq/index diff --git a/docs/ja/faq/general/_category_.yml b/docs/ja/faq/general/_category_.yml new file mode 100644 index 00000000000..52163f94150 --- /dev/null +++ b/docs/ja/faq/general/_category_.yml @@ -0,0 +1,4 @@ +position: 10 +label: 'General' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/general/columnar-database.md b/docs/ja/faq/general/columnar-database.md new file mode 100644 index 00000000000..247a308b66b --- /dev/null +++ b/docs/ja/faq/general/columnar-database.md @@ -0,0 +1,26 @@ +--- +slug: /ja/faq/general/columnar-database +title: 列指向データベースとは? +toc_hidden: true +toc_priority: 101 +--- + +# 列指向データベースとは? {#what-is-a-columnar-database} + +列指向データベースは、各カラムのデータを独立して保存します。これにより、クエリで使用されるカラムだけのデータをディスクから読み取ることができます。その代わりに、行全体に影響を与える操作のコストが相対的に高くなります。列指向データベースの同義語は、列指向データベース管理システムです。ClickHouseはそのようなシステムの典型例です。 + +列指向データベースの主要な利点は次の通りです: + +- 多くのカラムの中からほんの数カラムだけを使用するクエリ。 +- 大量のデータに対する集約クエリ。 +- カラム単位でのデータ圧縮。 + +レポート作成時の従来の行指向システムと列指向データベースの違いを以下に示します: + +**従来の行指向** +![従来の行指向](@site/docs/ja/images/row-oriented.gif#) + +**列指向データベース** +![列指向データベース](@site/docs/ja/images/column-oriented.gif#) + +列指向データベースは分析アプリケーションに最適です。なぜなら、テーブルに多くのカラムを用意しておくことができ、未使用のカラムに対してクエリ実行時間中にコストを払う必要がないからです(従来のOLTPデータベースは、データが行で保存されているため、クエリ時にすべてのデータを読み込む必要があります)。列指向データベースはビッグデータ処理とデータウェアハウジングのために設計されており、しばしば安価なハードウェアの分散クラスタを使ってスケールします。ClickHouseは、[分散テーブル](../../engines/table-engines/special/distributed.md)と[レプリケーションテーブル](../../engines/table-engines/mergetree-family/replication.md)の組み合わせでこれを実現します。 diff --git a/docs/ja/faq/general/dbms-naming.md b/docs/ja/faq/general/dbms-naming.md new file mode 100644 index 00000000000..fb391198d24 --- /dev/null +++ b/docs/ja/faq/general/dbms-naming.md @@ -0,0 +1,19 @@ +--- +slug: /ja/faq/general/dbms-naming +title: "「ClickHouse」とはどういう意味ですか?" +toc_hidden: true +toc_priority: 10 +--- + +# 「ClickHouse」とはどういう意味ですか? {#what-does-clickhouse-mean} + +「**Click**stream」と「Data ware**House**」を組み合わせたものです。これは、ClickHouseが元々Yandex.Metricaでの初期のユースケースから名付けられたもので、インターネット上のすべてのクリックを記録することが目的でした。そして現在でもその役割を果たしています。このユースケースについて詳しくは[ClickHouseの歴史](../../about-us/history.md)ページをご覧ください。 + +この二重の意味には、次の2つの結果があります: + +- Click**H**ouseを書く正しい方法は、Hを大文字にすることです。 +- 略す必要がある場合には、**CH**を使用してください。歴史的な理由から、中国ではCKと略すことが人気がありますが、これは主に中国語でのClickHouseに関する最初の講演の一つでこの形が使われたからです。 + +:::info +ClickHouseがその名を取得してから何年も経った後、独立して意味を持つ2つの言葉を組み合わせるこの手法は、[Andy Pavloによる研究](https://www.cs.cmu.edu/~pavlo/blog/2020/03/on-naming-a-database-management-system.html)で、データベースに名前を付ける最良の方法として取り上げられました。彼はカーネギーメロン大学のデータベース准教授です。ClickHouseは、Postgresと共に「今までで最高のデータベース名」賞を受賞しました。 +::: diff --git a/docs/ja/faq/general/index.md b/docs/ja/faq/general/index.md new file mode 100644 index 00000000000..78fe2ad0f44 --- /dev/null +++ b/docs/ja/faq/general/index.md @@ -0,0 +1,23 @@ +--- +slug: /ja/faq/general/ +sidebar_position: 1 +sidebar_label: ClickHouseに関する一般的な質問 +keywords: [clickhouse, faq, 質問, とは] +--- + +# ClickHouseに関する一般的な質問 + +- [ClickHouseとは何ですか?](../../intro.md) +- [なぜClickHouseはこんなに速いのですか?](../../concepts/why-clickhouse-is-so-fast.md) +- [誰がClickHouseを使用していますか?](../../faq/general/who-is-using-clickhouse.md) +- [「ClickHouse」とはどういう意味ですか?](../../faq/general/dbms-naming.md) +- [「Не тормозит」とはどういう意味ですか?](../../faq/general/ne-tormozit.md) +- [OLAPとは何ですか?](../../faq/general/olap.md) +- [カラム型データベースとは何ですか?](../../faq/general/columnar-database.md) +- [どのように主キーを選択すればいいですか?](../../guides/best-practices/sparse-primary-indexes.md) +- [なぜMapReduceのようなものを使わないのですか?](../../faq/general/mapreduce.md) +- [ClickHouseにコードを貢献するにはどうすればよいですか?](/knowledgebase/how-do-i-contribute-code-to-clickhouse) + +:::info お探しの情報が見つからない場合 +[Knowledge Base](/knowledgebase/)をチェックし、ドキュメント内の多数の有用な記事もご参照ください。 +::: diff --git a/docs/ja/faq/general/mapreduce.md b/docs/ja/faq/general/mapreduce.md new file mode 100644 index 00000000000..35d3ebd81ef --- /dev/null +++ b/docs/ja/faq/general/mapreduce.md @@ -0,0 +1,14 @@ +--- +slug: /ja/faq/general/mapreduce +title: MapReduceのようなものを使わない理由 +toc_hidden: true +toc_priority: 110 +--- + +# MapReduceのようなものを使わない理由 {#why-not-use-something-like-mapreduce} + +MapReduceのようなシステムは、分散ソートに基づくreduce操作を行う分散コンピューティングシステムとして参照できます。このクラスで最も一般的なオープンソースソリューションは、[Apache Hadoop](http://hadoop.apache.org)です。 + +これらのシステムは高レイテンシーのため、オンラインクエリには適していません。言い換えれば、ウェブインターフェースのバックエンドとして使用することはできません。リアルタイムデータの更新にも不向きです。分散ソートは、操作結果やすべての中間結果(存在する場合)が単一サーバーのRAMにあるのが通常のオンラインクエリでは、reduce操作を実行する最善の方法ではありません。このような場合、ハッシュテーブルがreduce操作を行うための最適な方法です。map-reduceタスクを最適化する一般的なアプローチは、RAM内でハッシュテーブルを使用した事前集計(部分的なreduce)です。この最適化はユーザーが手動で行います。分散ソートは、簡単なmap-reduceタスクを実行する際のパフォーマンス低下の主な原因の一つです。 + +ほとんどのMapReduceの実装は、クラスター上で任意のコードを実行することを可能にしますが、実験を迅速に実行するためにはOLAPに適した宣言型クエリ言語の方が優れています。例えば、HadoopにはHiveやPigがあります。また、Cloudera ImpalaやShark(廃止された)をSpark用として考慮することもできますし、Spark SQL、Presto、Apache Drillも同様です。このようなタスクを実行する際のパフォーマンスは、専門システムと比較して非常に非効率的ですが、比較的高いレイテンシーにより、これらのシステムをウェブインターフェースのバックエンドとして使用することは現実的ではありません。 diff --git a/docs/ja/faq/general/ne-tormozit.md b/docs/ja/faq/general/ne-tormozit.md new file mode 100644 index 00000000000..7152a6ab3ef --- /dev/null +++ b/docs/ja/faq/general/ne-tormozit.md @@ -0,0 +1,26 @@ +--- +slug: /ja/faq/general/ne-tormozit +title: 「“не тормозит”とは何を意味しますか?」 +toc_hidden: true +toc_priority: 11 +--- + +# 「не тормозит」とは何を意味しますか? {#what-does-ne-tormozit-mean} + +この質問は、公式のClickHouse Tシャツを見たときによく出てきます。Tシャツの前面には大きく「**ClickHouse не тормозит**」と書かれています。 + +ClickHouseがオープンソースになる前は、ロシア最大のIT企業である[Yandex](https://yandex.com/company/)によって社内ストレージシステムとして開発されていました。そのため、最初はロシア語で「не тормозит」(発音は「ネ・トルモジット」)というスローガンが付けられました。オープンソースとしてリリースされた後、ロシアでのイベント用にそのスローガンをそのまま使ったTシャツを最初に製作しました。 + +その後、ロシア国外のイベントでも配布を予定していた次のバッチに対して、スローガンの英語版を作ろうとしました。しかし、ロシア語は物事を表現するのに優雅な言語であるため、スペースの制限があるTシャツにうまく翻訳することができず(多くの選択肢が長すぎたり不正確だったりしました)、国際的なイベント用に製作したTシャツでもロシア語のままスローガンを維持することにしました。この選択は素晴らしい決断となり、世界中の人々がそれを見て好奇心をくすぐられたり、驚いたりしています。 + +では、それは何を意味するのでしょうか?「не тормозит」を翻訳すると以下のようになります。 + +- 文字通りに翻訳すると、「ClickHouseはブレーキペダルを踏まない」という感じです。 +- IT背景を持つロシアの人には、「大規模なシステムが遅れるのは、ClickHouseのせいではない」と聞こえるかもしれません。 +- より短く、しかしそれほど正確ではないバージョンとしては、「ClickHouseは遅くない」「ClickHouseは遅れない」あるいは単に「ClickHouseは高速」のようになります。 + +これらのTシャツを直接見たことがない場合は、ClickHouse関連の多くのビデオでオンラインで見ることができます。例えば、このビデオです: + + + +P.S. これらのTシャツは販売されておらず、ほとんどの[ClickHouse Meetup](https://www.meetup.com/pro/clickhouse/)で、特に優れた質問をしたり、その他の形で積極的に参加した方に無料で配布されます。 diff --git a/docs/ja/faq/general/olap.md b/docs/ja/faq/general/olap.md new file mode 100644 index 00000000000..7e7e35109ca --- /dev/null +++ b/docs/ja/faq/general/olap.md @@ -0,0 +1,40 @@ +--- +slug: /ja/faq/general/olap +title: OLAPとは何ですか? +toc_hidden: true +toc_priority: 100 +--- + +# OLAPとは何ですか? {#what-is-olap} + +[OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing)は、オンライン分析処理(Online Analytical Processing)の略です。技術的視点とビジネス的視点の2つの視点から見ることができますが、非常に高いレベルではこれらの単語を逆から読むだけで理解できます。 + +処理 +: いくつかのソースデータが処理され… + +分析 +: …分析レポートや洞察を生成し… + +オンライン +: …リアルタイムで行われます。 + +## ビジネスの視点から見たOLAP {#olap-from-the-business-perspective} + +近年、ビジネス関係者はデータの価値に気づき始めました。盲目的に意思決定を行う企業は多くの場合、競争に追いつけなくなります。成功している企業のデータ駆動アプローチは、ビジネス決定を行う上で遠くからでも役立つ可能性のあるすべてのデータを収集し、それらをタイムリーに分析するメカニズムを必要とします。そこでOLAPデータベース管理システム(DBMS)が登場します。 + +ビジネスの観点から、OLAPは企業が継続的に計画し、分析し、運用活動を報告することを可能にし、その結果、効率を最大化し、経費を削減し、最終的には市場シェアを獲得することができます。これは社内のシステムで行うことも、ウェブやモバイルの分析サービス、CRMサービスなど、SaaSプロバイダーにアウトソースすることも可能です。OLAPは、多くのBIアプリケーション(ビジネスインテリジェンス)の背後にある技術です。 + +ClickHouseは、特定のドメインデータを分析するためのSaaSソリューションのバックエンドとしてよく使用されるOLAPデータベース管理システムです。しかし、いまだに第三者プロバイダーとデータを共有することを躊躇するビジネスもあり、社内データウェアハウスというシナリオも現実的です。 + +## 技術的視点から見たOLAP {#olap-from-the-technical-perspective} + +すべてのデータベース管理システムは、OLAP(オンライン**分析**処理)とOLTP(オンライン**取引**処理)の2つのグループに分類できます。前者は、大量の履歴データに基づくレポートを作成することに重点を置いていますが、それほど頻繁には行っていません。一方、後者は通常、トランザクションの連続ストリームを処理し、データの現在の状態を常に変更します。 + +実際には、OLAPとOLTPはカテゴリではなく、スペクトラムです。ほとんどの実際のシステムはそのどちらかに焦点を当てていますが、反対の種類のワークロードが望ましい場合に備えて、いくつかのソリューションや回避策を提供しています。この状況は、多くのストレージシステムを統合して操作することを企業に強制し、それは大したことではないかもしれませんが、システムを増やすことでメンテナンスがより高価になります。したがって、最近のトレンドは、HTAP(**ハイブリッド取引/分析処理**)に移行しており、両方の種類のワークロードが単一のデータベース管理システムで同等にうまく処理されます。 + +もしDBMSが純粋なOLAPまたは純粋なOLTPとして始まったとしても、それらは競争に追いつくためにHTAPの方向に進むことを強いられます。ClickHouseも例外ではありません。最初は[できるだけ速いOLAPシステム](/ja/concepts/why-clickhouse-is-so-fast)として設計されており、完全なトランザクションサポートはまだありませんが、一貫した読み書きやデータの更新/削除のためのミューテーションのような機能は追加する必要がありました。 + +OLAPとOLTPシステム間の基本的なトレードオフは変わりません: + +- 分析レポートを効率的に構築するには、カラムを別々に読み取ることが重要であるため、ほとんどのOLAPデータベースは[列指向](/ja/faq/general/columnar-database)です。 +- カラムを別々に保存すると、行の追加やインプレースの修正などの操作のコストが、カラムの数(システムがイベントのすべての詳細を万が一に備えて収集しようとする場合は膨大になる可能性がある)に比例して増加します。したがって、ほとんどのOLTPシステムはデータを行ごとに配置して保存しています。 diff --git a/docs/ja/faq/general/who-is-using-clickhouse.md b/docs/ja/faq/general/who-is-using-clickhouse.md new file mode 100644 index 00000000000..a3531418850 --- /dev/null +++ b/docs/ja/faq/general/who-is-using-clickhouse.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/general/who-is-using-clickhouse +title: ClickHouseを使用しているのは誰ですか? +toc_hidden: true +toc_priority: 9 +--- + +# ClickHouseを使用しているのは誰ですか? {#who-is-using-clickhouse} + +オープンソース製品であるため、この質問に答えるのはそれほど簡単ではありません。ClickHouseを使いたい場合、誰にも言う必要はなく、ソースコードや事前コンパイルパッケージを取得するだけです。契約を結ぶ必要はなく、[Apache 2.0 ライセンス](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE)によって制約のないソフトウェア配布が許可されています。 + +また、技術スタックはしばしばNDAでカバーされているかどうかのグレーゾーンにあります。いくつかの企業は、オープンソースであっても競争上の優位性として技術を使用すると考えており、従業員が公に詳細を共有することを許可しません。一部の企業はPRリスクがあると考えており、実装の詳細の公開はPR部門の承認が必要です。 + +では、ClickHouseを使用しているのは誰なのか、どうやって知るのでしょうか? + +一つの方法は、**周りに聞く**ことです。書面でない場合、人々は自分の会社で使用されている技術や、使用例、使用しているハードウェアの種類、データのボリュームなどをより自由に共有します。私たちは世界中の[ClickHouse Meetup](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists)でユーザーと定期的に会話しており、1000社以上の企業がClickHouseを使用しているという話を耳にしています。残念ながら、それらは再現可能ではなく、潜在的なトラブルを避けるため、そのような話はNDAの下で語られたものと考えています。しかし、今後のミートアップに参加し、直接他のユーザーと話すことができます。ミートアップの発表方法はいくつかあり、例えば[Twitter](http://twitter.com/ClickHouseDB/)に登録できます。 + +二つ目の方法は、ClickHouseを使用していることを**公に発表している**企業を探すことです。これには通常、ブログ投稿、講演ビデオ、スライドデッキなどの具体的な証拠があります。私たちの**[Adopters](../../about-us/adopters.md)**ページには、そのような証拠へのリンク集を収集しており、あなたの雇用主のストーリーや見つけたリンクを自由に提供してください(プロセスでNDAを違反しないように注意してください)。 + +採用者リストには、Bloomberg、Cisco、中国電信、Tencent、Lyftなどの非常に大きな会社の名前が見つかりますが、最初の方法ではそれ以上の企業がいることがわかりました。例えば、[Forbesによる最大のIT企業のリスト(2020年)](https://www.forbes.com/sites/hanktucker/2020/05/13/worlds-largest-technology-companies-2020-apple-stays-on-top-zoom-and-uber-debut/)を見ても、その半分以上が何らかの形でClickHouseを使用しています。また、もともとClickHouseを2016年にオープンソース化し、ヨーロッパで最大のIT企業の一つである[Yandex](../../about-us/history.md)も忘れてはなりません。 diff --git a/docs/ja/faq/integration/_category_.yml b/docs/ja/faq/integration/_category_.yml new file mode 100644 index 00000000000..28e8a6f6134 --- /dev/null +++ b/docs/ja/faq/integration/_category_.yml @@ -0,0 +1,4 @@ +position: 20 +label: 'Integration' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/integration/index.md b/docs/ja/faq/integration/index.md new file mode 100644 index 00000000000..5ff92ea6fcf --- /dev/null +++ b/docs/ja/faq/integration/index.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/integration/ +sidebar_position: 1 +sidebar_label: ClickHouseと他のシステムの統合 +keywords: [clickhouse, faq, questions, integrations] +--- + +# ClickHouseと他のシステムの統合に関する質問 + +- [ClickHouseからファイルにデータをエクスポートするにはどうすればよいですか?](https://clickhouse.com/docs/knowledgebase/file-export) +- [JSONをClickHouseにインポートする方法は?](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [KafkaをClickHouseに接続するにはどうすればよいですか?](/docs/ja/integrations/data-ingestion/kafka/index.md) +- [JavaアプリケーションをClickHouseに接続できますか?](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +- [ClickHouseはMySQLのテーブルを読み取れますか?](/docs/ja/integrations/data-ingestion/dbms/mysql/index.md) +- [ClickHouseはPostgreSQLのテーブルを読み取れますか?](/docs/ja/integrations/data-ingestion/dbms/postgresql/index.md) +- [ODBCを介してOracleに接続するときにエンコーディングの問題が発生した場合はどうすればよいですか?](/docs/ja/faq/integration/oracle-odbc.md) + +:::info お探しの情報が見つかりませんか? +[ナレッジベース](/knowledgebase/)をご覧いただき、このドキュメントにある多くの有益な記事もご参照ください。 +::: diff --git a/docs/ja/faq/integration/json-import.md b/docs/ja/faq/integration/json-import.md new file mode 100644 index 00000000000..625c18d13a5 --- /dev/null +++ b/docs/ja/faq/integration/json-import.md @@ -0,0 +1,35 @@ +--- +slug: /ja/faq/integration/json-import +title: ClickHouseにJSONをインポートする方法 +toc_hidden: true +toc_priority: 11 +--- + +# ClickHouseにJSONをインポートする方法 {#how-to-import-json-into-clickhouse} + +ClickHouseは、[入力および出力のためのデータ形式](../../interfaces/formats.md)を幅広くサポートしています。データ取り込みに最も一般的に使用されるJSONのバリエーションの1つは、[JSONEachRow](../../interfaces/formats.md#jsoneachrow)です。この形式では、1つのJSONオブジェクトが1行に対応し、各オブジェクトが改行で区切られます。 + +## 例 {#examples} + +[HTTPインターフェース](../../interfaces/http.md)を使用する場合: + +``` bash +$ echo '{"foo":"bar"}' | curl 'http://localhost:8123/?query=INSERT%20INTO%20test%20FORMAT%20JSONEachRow' --data-binary @- +``` + +[CLIインターフェース](../../interfaces/cli.md)を使用する場合: + +``` bash +$ echo '{"foo":"bar"}' | clickhouse-client --query="INSERT INTO test FORMAT JSONEachRow" +``` + +データを手動で挿入する代わりに、[インテグレーションツール](../../integrations/index.mdx)を使用することも検討してください。 + +## 便利な設定 {#useful-settings} + +- `input_format_skip_unknown_fields` は、テーブルスキーマに存在しない追加のフィールドがあっても、それらを無視してJSONを挿入できるようにします。 +- `input_format_import_nested_json` は、[Nested](../../sql-reference/data-types/nested-data-structures/index.md)型のカラムにネストされたJSONオブジェクトを挿入できるようにします。 + +:::note +設定は、HTTPインターフェースでは `GET` パラメータとして、`CLI` インターフェースでは `--` で始まる追加のコマンドライン引数として指定されます。 +::: diff --git a/docs/ja/faq/integration/oracle-odbc.md b/docs/ja/faq/integration/oracle-odbc.md new file mode 100644 index 00000000000..56ed5b90b77 --- /dev/null +++ b/docs/ja/faq/integration/oracle-odbc.md @@ -0,0 +1,16 @@ +--- +slug: /ja/faq/integration/oracle-odbc +title: ODBC経由でOracleを使用する際にエンコーディングの問題が発生した場合はどうすればよいですか? +toc_hidden: true +toc_priority: 20 +--- + +# ODBC経由でOracleを使用する際にエンコーディングの問題が発生した場合はどうすればよいですか? {#oracle-odbc-encodings} + +OracleをOracle ODBCドライバーを通じてClickHouse外部Dictionaryのソースとして使用する場合、`/etc/default/clickhouse`で`NLS_LANG`環境変数に正しい値を設定する必要があります。詳細については、[Oracle NLS_LANG FAQ](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html)を参照してください。 + +**例** + +``` sql +NLS_LANG=RUSSIAN_RUSSIA.UTF8 +``` diff --git a/docs/ja/faq/operations/_category_.yml b/docs/ja/faq/operations/_category_.yml new file mode 100644 index 00000000000..b1843465799 --- /dev/null +++ b/docs/ja/faq/operations/_category_.yml @@ -0,0 +1,4 @@ +position: 30 +label: 'Operations' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/operations/delete-old-data.md b/docs/ja/faq/operations/delete-old-data.md new file mode 100644 index 00000000000..01f0c27e594 --- /dev/null +++ b/docs/ja/faq/operations/delete-old-data.md @@ -0,0 +1,55 @@ +--- +slug: /ja/faq/operations/delete-old-data +title: ClickHouseテーブルから古いレコードを削除できますか? +toc_hidden: true +toc_priority: 20 +--- + +# ClickHouseテーブルから古いレコードを削除できますか? {#is-it-possible-to-delete-old-records-from-a-clickhouse-table} + +短い答えは「はい」です。ClickHouseは、古いデータを削除してディスクスペースを解放するための複数の仕組みを提供しています。各仕組みは異なるシナリオに対応しています。 + +## 有効期限 (TTL) {#ttl} + +ClickHouseは、条件が発生したときに自動的に値を削除することを可能にします。この条件は、通常はタイムスタンプカラムに対する固定オフセットとして、任意のカラムに基づく式として設定されます。 + +このアプローチの主要な利点は、TTLが設定されると、データの削除がバックグラウンドで自動的に行われ、外部システムがトリガーを必要としないことです。 + +:::note +TTLは、データを[/dev/null](https://en.wikipedia.org/wiki/Null_device)に移動するだけでなく、SSDからHDDへのように、異なるストレージシステム間でのデータの移動にも使用できます。 +::: + +[有効期限 (TTL) の設定](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl)に関する詳細情報。 + +## DELETE FROM + +[DELETE FROM](/docs/ja/sql-reference/statements/delete.md)は、ClickHouseでの標準的なDELETEクエリの実行を可能にします。フィルタ句で対象とされた行は削除としてマークされ、将来の結果セットから除外されます。行のクリーンアップは非同期で行われます。 + +:::note +DELETE FROMは、バージョン23.3以降で一般に使用可能です。古いバージョンではエクスペリメンタルであり、以下の設定で有効化する必要があります: +``` +SET allow_experimental_lightweight_delete = true; +``` +::: + +## ALTER DELETE {#alter-delete} + +ALTER DELETEは非同期バッチ操作を使用して行を削除します。DELETE FROMとは異なり、ALTER DELETE後に実行され、バッチ操作が完了する前のクエリは、削除対象の行を含めます。詳細は[ALTER DELETE](/docs/ja/sql-reference/statements/alter/delete.md)ドキュメントを参照してください。 + +`ALTER DELETE`は柔軟に古いデータを削除するために発行できます。定期的に行う必要がある場合の主な欠点は、クエリを送信する外部システムが必要になることです。また、ミューテーションは削除する行が1つしかない場合でも完全なパーツをリライトするため、一部のパフォーマンス上の考慮事項があります。 + +これは、ClickHouseを基にしたシステムを[GDPR](https://gdpr-info.eu)準拠にするための最も一般的なアプローチです。 + +[ミューテーション](../../sql-reference/statements/alter/index.md#alter-mutations)に関する詳細情報。 + +## パーティションの削除 {#drop-partition} + +`ALTER TABLE ... DROP PARTITION`は、パーティション全体を削除するためのコスト効率の良い方法です。柔軟性には欠け、テーブル作成時に適切なパーティションスキームの設定が必要ですが、それでも一般的なケースの多くをカバーします。ミューテーションと同様に、定期的に使用するには外部システムから実行する必要があります。 + +[パーティション操作](../../sql-reference/statements/alter/partition.md#alter_drop-partition)に関する詳細情報。 + +## TRUNCATE {#truncate} + +テーブルからすべてのデータを削除することは極端ですが、場合によってはそれが必要なこともあります。 + +[テーブルトランケーション](/docs/ja/sql-reference/statements/truncate.md)に関する詳細情報。 diff --git a/docs/ja/faq/operations/index.md b/docs/ja/faq/operations/index.md new file mode 100644 index 00000000000..70a9258a10d --- /dev/null +++ b/docs/ja/faq/operations/index.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/operations/ +sidebar_position: 3 +sidebar_label: ClickHouseサーバーとクラスタの運用に関する質問 +--- + +# ClickHouseサーバーとクラスタの運用に関する質問 + +- [本番環境で使用すべきClickHouseのバージョンはどれですか?](/docs/ja/faq/operations/production.md) +- [ストレージとコンピュートを分離してClickHouseをデプロイすることは可能ですか?](/docs/ja/faq/operations/separate_storage.md) +- [ClickHouseのテーブルから古いレコードを削除することは可能ですか?](/docs/ja/faq/operations/delete-old-data.md) +- [ClickHouse Keeperをどのように構成しますか?](/docs/ja/guides/sre/keeper/index.md) +- [ClickHouseはLDAPと統合できますか?](/docs/ja/guides/sre/user-management/configuring-ldap.md) +- [ClickHouseでユーザー、ロール、権限をどのように構成しますか?](/docs/ja/guides/sre/user-management/index.md) +- [ClickHouseで行を更新または削除できますか?](/docs/ja/guides/developer/mutations.md) +- [ClickHouseはマルチリージョンレプリケーションをサポートしていますか?](/docs/ja/faq/operations/multi-region-replication.md) + +:::info お探しのものが見つかりませんか? +[ナレッジベース](/knowledgebase/)をチェックし、ドキュメントにある多くの記事を参照してください。 +::: diff --git a/docs/ja/faq/operations/multi-region-replication.md b/docs/ja/faq/operations/multi-region-replication.md new file mode 100644 index 00000000000..b2243cea273 --- /dev/null +++ b/docs/ja/faq/operations/multi-region-replication.md @@ -0,0 +1,14 @@ +--- +slug: /ja/faq/operations/multi-region-replication +title: ClickHouseはマルチリージョンレプリケーションをサポートしていますか? +toc_hidden: true +toc_priority: 30 +--- + +# ClickHouseはマルチリージョンレプリケーションをサポートしていますか? {#does-clickhouse-support-multi-region-replication} + +短く言えば「はい」です。ただし、すべてのリージョン/データセンター間の遅延はできるだけ二桁程度に保つことをお勧めします。さもなければ、分散合意プロトコルを経由するため、書き込みパフォーマンスが低下します。たとえば、米国の東西間のレプリケーションは問題なく動作する可能性がありますが、米国とヨーロッパ間ではそうではないかもしれません。 + +設定に関しては、シングルリージョンのレプリケーションと比べて違いはありません。単に異なる場所にあるホストをレプリカとして使用してください。 + +詳細については、[データレプリケーションに関する完全な記事](../../engines/table-engines/mergetree-family/replication.md)をご覧ください。 diff --git a/docs/ja/faq/operations/production.md b/docs/ja/faq/operations/production.md new file mode 100644 index 00000000000..29f3f39e416 --- /dev/null +++ b/docs/ja/faq/operations/production.md @@ -0,0 +1,67 @@ +--- +slug: /ja/faq/operations/production +title: 本番環境で使用するべき ClickHouse バージョンは? +toc_hidden: true +toc_priority: 10 +--- + +# 本番環境で使用するべき ClickHouse バージョンは? {#which-clickhouse-version-to-use-in-production} + +まず最初に、なぜこの質問がよくあるのかを考えてみましょう。主な理由は2つあります。 + +1. ClickHouseは非常に高い速度で開発されており、通常1年に10以上の安定版リリースがあります。そのため、選択肢が多く、単純ではない選択肢となります。 +2. 一部のユーザーは、自分のユースケースに最適なバージョンを見つけるための時間を節約し、他の人のアドバイスに従いたいと考えています。 + +2番目の理由はより根本的なものなので、まずそれについて話し、その後でさまざまなClickHouseリリースをどうナビゲートするかを解説します。 + +## 推奨する ClickHouse バージョンは? {#which-clickhouse-version-do-you-recommend} + +コンサルタントを雇ったり、知られた専門家を信頼して本番環境の責任をなくすことは、魅力的な方法です。誰かが推奨した特定のClickHouseバージョンをインストールし、それに問題があれば、それはあなたの責任ではなく、他の人の責任です。この考え方は大きな罠です。外部の人物があなたの会社の本番環境で何が起こっているかをあなたよりも知っていることはありません。 + +では、どうやって適切にクリックハウスのバージョンを選んでアップグレードすれば良いのでしょうか?または初めてのClickHouseバージョンをどうやって選ぶべきなのでしょうか?まず第一に、**現実的なプレプロダクション環境**を設定するために投資する必要があります。理想的な世界では、それは完全に同一のシャドウコピーである可能性がありますが、それは通常高価です。 + +以下は、それほど高くないコストでプレプロダクション環境に合理的な忠実度を持たせるための重要なポイントです: + +- プレプロダクション環境は、本番で実行する予定のクエリセットにできるだけ近いものを実行する必要があります: + - 固定データで読み取り専用にしないでください。 + - 単にデータをコピーして典型的なレポートを作成せずに書き込み専用にしないでください。 + - スキーママイグレーションを適用する代わりにデータを削除しないでください。 +- 実際の本番データとクエリのサンプルを使用してください。代表的であり、`SELECT`クエリが合理的な結果を返すようなサンプルを選んでください。あなたのデータが機密であり、内部ポリシーが本番環境から離れることを禁じている場合は、難読化を使用してください。 +- プレプロダクションが、本番環境と同様に監視およびアラートソフトウェアでカバーされていることを確認してください。 +- 本番が複数のデータセンターや地域にまたがっている場合は、プレプロダクションでも同様にしてください。 +- 本番がレプリケーションや分散テーブル、マテリアライズドビューの連鎖などの複雑な機能を使用している場合は、プレプロダクションでも同様に設定してください。 +- プレプロダクションで本番とほぼ同じ数のサーバーやVMを使用するか、より小さいが同じサイズのものを使用するかについてのトレードオフがあります。前者はネットワーク関連の問題をさらに検出する可能性がありますが、後者の方が管理が容易です。 + +次に投資するべき分野は、**自動テストインフラストラクチャ**です。ある種類のクエリが1回実行に成功したからといって、それが永遠に成功し続けるとは思わないでください。ClickHouseがモックされたユニットテストをいくつか持つことは問題ありませんが、製品が実際のClickHouseに対して実行され、すべての重要なユースケースが期待通りに動作しているかを確認する合理的な自動テストセットを持っていることを確認してください。 + +さらに一歩進めて、その自動テストを[ClickHouseのオープンソーステストインフラストラクチャ](https://github.com/ClickHouse/ClickHouse/tree/master/tests)に貢献することもできます。これらは日常的な開発で継続的に使用されます。[実行方法](../../development/tests.md)を学び、そのフレームワークにテストを適用するのに追加の時間と労力が必要になりますが、リリースが安定版として発表される前から既にそれらに対してテストされていることを保証し、問題報告とその後のバグフィックスの報告に時間を無駄にすることを避けることができます。いくつかの企業では、(Googleでは[Beyonce’s Rule](https://www.oreilly.com/library/view/software-engineering-at/9781492082781/ch01.html#policies_that_scale_well)と呼ばれる)そういったテスト貢献を内部ポリシーとしていることもあります。 + +プレプロダクション環境とテストインフラストラクチャを整えたら、最適なバージョンの選択は簡単です: + +1. 新しいClickHouseリリースに対して自動テストを定期的に実行します。それを`testing`としてマークされたClickHouseリリースに対して行うこともできますが、それで今後のステップに進むことは推奨されません。 +2. テストに合格したClickHouseリリースをプレプロダクションにデプロイし、すべてのプロセスが期待通りに動作しているかを確認します。 +3. 発見した問題を[ClickHouse GitHub Issues](https://github.com/ClickHouse/ClickHouse/issues)に報告してください。 +4. 重大な問題がなければ、そのClickHouseリリースを本番環境にデプロイし始めるのが安全です。[カナリアリリース](https://martinfowler.com/bliki/CanaryRelease.html)や[ブルーグリーンデプロイメント](https://martinfowler.com/bliki/BlueGreenDeployment.html)のようなアプローチを実装するための漸進的なリリース自動化に投資すると、本番環境での問題のリスクをさらに軽減できます。 + +お気づきかもしれませんが、上記のアプローチにはClickHouseに特有のものはありません。人々は本番環境を真剣に考える場合、依存するインフラの任意の部分に対してこれを行います。 + +## クリックハウスのリリースを選択する方法は? {#how-to-choose-between-clickhouse-releases} + +ClickHouseのパッケージリポジトリの内容を見てみると、2種類のパッケージがあります: + +1. `stable` +2. `lts` (長期サポート) + +どちらを選ぶかのガイドラインは以下の通りです: + +- `stable`はデフォルトで推奨するパッケージです。おおよそ毎月リリースされ、新機能を合理的な遅延で提供し、最新の安定版リリースのうち3つが診断とバグフィックスのバックポーティングのサポートを受けます。 +- `lts`は半年に一度リリースされ、初期リリースから1年間サポートされます。以下のような場合には、`stable`よりも`lts`を優先するかもしれません: + - 会社の内部ポリシーが頻繁なアップグレードや非LTSソフトウェアの使用を認めていない。 + - ClickHouseを使用する製品が特に複雑な機能を必要としていなかったり、更新を続けるためのリソースが不足している。 + +多くのチームは最初は`lts`が適していると考えていても、製品にとって重要な最近の機能のために`stable`に切り替えることがよくあります。 + +:::tip +ClickHouseをアップグレードする際に覚えておくべきことがあります:リリース間の互換性は常に注意していますが、時には互換性を保つことが合理的でない場合があり、いくつかの小さな詳細が変更されることがあります。アップグレード前に[Changelog](/docs/ja/whats-new/changelog/index.md)を確認して、後方互換性のない変更についての注意点があるかどうかを確認してください。 +::: + diff --git a/docs/ja/faq/operations/separate_storage.md b/docs/ja/faq/operations/separate_storage.md new file mode 100644 index 00000000000..b98590f8a1e --- /dev/null +++ b/docs/ja/faq/operations/separate_storage.md @@ -0,0 +1,11 @@ +--- +slug: /ja/faq/operations/deploy-separate-storage-and-compute +title: ClickHouseをストレージとコンピュートを分離してデプロイすることは可能ですか? +sidebar_label: ClickHouseをストレージとコンピュートを分離してデプロイすることは可能ですか? +toc_hidden: true +toc_priority: 20 +--- + +簡潔に言うと、「はい」です。 + +オブジェクトストレージ (S3, GCS) は、ClickHouseテーブルのデータの弾性主記憶バックエンドとして使用できます。[S3サポートのMergeTree](/docs/ja/integrations/data-ingestion/s3/index.md) と [GCSサポートのMergeTree](/docs/ja/integrations/data-ingestion/gcs/index.md) のガイドが公開されています。この構成では、メタデータのみがコンピュートノードにローカルで保存されます。このセットアップでは、追加のノードがメタデータのみをレプリケーションする必要があるため、コンピュートリソースを簡単にスケールアップおよびスケールダウンできます。 diff --git a/docs/ja/faq/troubleshooting.md b/docs/ja/faq/troubleshooting.md new file mode 100644 index 00000000000..d4397ae3c83 --- /dev/null +++ b/docs/ja/faq/troubleshooting.md @@ -0,0 +1,24 @@ +--- +title: "トラブルシューティング" +slug: /ja/faq/troubleshooting +--- + +## ClickHouse Cloud トラブルシューティング + +### ClickHouse Cloud サービスにアクセスできない + +以下のようなエラーメッセージが表示される場合、IPアクセスリストがアクセスを拒否している可能性があります。 + +```response +curl: (35) error:02FFF036:system library:func(4095):Connection reset by peer +``` +または +```response +curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to HOSTNAME.clickhouse.cloud:8443 +``` +または +```response +Code: 210. DB::NetException: SSL connection unexpectedly closed (e46453teek.us-east-2.aws.clickhouse-staging.com:9440). (NETWORK_ERROR) +``` + +[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)を確認し、許可されたリストの外部から接続を試みている場合、接続は失敗します。 diff --git a/docs/ja/faq/use-cases/_category_.yml b/docs/ja/faq/use-cases/_category_.yml new file mode 100644 index 00000000000..4c0bfa72940 --- /dev/null +++ b/docs/ja/faq/use-cases/_category_.yml @@ -0,0 +1,4 @@ +position: 40 +label: 'Use Cases' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/use-cases/index.md b/docs/ja/faq/use-cases/index.md new file mode 100644 index 00000000000..1285ce5830a --- /dev/null +++ b/docs/ja/faq/use-cases/index.md @@ -0,0 +1,16 @@ +--- +slug: /ja/faq/use-cases/ +sidebar_position: 2 +sidebar_label: ClickHouseのユースケースに関する質問 +--- + +# ClickHouseのユースケースに関する質問 + +- [ClickHouseを時系列データベースとして使用できますか?](/knowledgebase/time-series) +- [ClickHouseをキー・バリュー型ストレージとして使用できますか?](/knowledgebase/key-value) + +:::info お探しの内容が見つかりませんか? +[Knowledge Base](/knowledgebase/)をチェックし、ここでのドキュメント内にある多くの有益な記事もご覧ください。 +::: + + diff --git a/docs/ja/faq/use-cases/key-value.md b/docs/ja/faq/use-cases/key-value.md new file mode 100644 index 00000000000..a65aba07ad2 --- /dev/null +++ b/docs/ja/faq/use-cases/key-value.md @@ -0,0 +1,18 @@ +--- +slug: /ja/faq/use-cases/key-value +title: ClickHouseをキー・バリューストレージとして使用できますか? +toc_hidden: true +toc_priority: 101 +--- + +# ClickHouseをキー・バリューストレージとして使用できますか? {#can-i-use-clickhouse-as-a-key-value-storage} + +短い答えは**「いいえ」**です。キー・バリューのワークロードは、ClickHouseを使用**しない**ほうが良いケースの上位に位置しています。結局のところ、ClickHouseは[OLAP](../../faq/general/olap.md)システムであり、優れたキー・バリューストレージシステムが他にも多く存在しています。 + +しかし、キー・バリューのようなクエリにClickHouseを使用しても意味がある状況もあるかもしれません。通常、低予算のプロダクトで、主なワークロードは分析的でありClickHouseに適しているが、キー・バリューパターンを必要とする高いリクエストスループットが求められず、厳しい遅延要件もない二次プロセスが存在する場合です。予算が無制限であれば、この二次ワークロード用に別のキー・バリューデータベースをインストールするでしょうが、現実には、もう一つのストレージシステムを維持する追加のコスト(監視、バックアップなど)があるため、これを避けることが望ましいかもしれません。 + +推奨に逆らってClickHouseでキー・バリューのようなクエリを実行することを決めた場合、以下のようなヒントがあります: + +- ClickHouseでポイントクエリが高コストとなる主な理由は、メインの[MergeTreeテーブルエンジンファミリー](../..//engines/table-engines/mergetree-family/mergetree.md)のスパースな主キーインデックスです。このインデックスは特定の行に直接ポイントできず、N番目ごとにポイントするため、隣接するN番目の行から目的の行までスキャンする必要があり、その過程で余分なデータを読み取ります。キー・バリューのシナリオでは、`index_granularity`設定でNの値を減らすことが有効かもしれません。 +- ClickHouseは各カラムを別々のファイルセットに保持しているため、1つの完全な行を組み立てるためには各ファイルを通過する必要があります。カラム数が多いほどファイル数は線形に増加するため、キー・バリューシナリオでは多くのカラムの使用を避け、すべてのペイロードを単一の`String`カラムにJSON、Protobuf、または適切なシリアル化形式でエンコードして格納することが価値を持つかもしれません。 +- 通常の`MergeTree`テーブルの代わりに[Join](../../engines/table-engines/special/join.md)テーブルエンジンと[joinGet](../../sql-reference/functions/other-functions.md#joinget)関数を使用してデータを取得する代替アプローチがあります。これによってクエリ性能が向上する可能性がありますが、使い勝手や信頼性の問題が発生する可能性があります。[この使用例](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00800_versatile_storage_join.sql#L49-L51)をご覧ください。 diff --git a/docs/ja/faq/use-cases/time-series.md b/docs/ja/faq/use-cases/time-series.md new file mode 100644 index 00000000000..7c64c8ed33d --- /dev/null +++ b/docs/ja/faq/use-cases/time-series.md @@ -0,0 +1,22 @@ +--- +slug: /ja/faq/use-cases/time-series +title: ClickHouseを時系列データベースとして使用できますか? +toc_hidden: true +toc_priority: 101 +--- + +# ClickHouseを時系列データベースとして使用できますか? {#can-i-use-clickhouse-as-a-time-series-database} + +_注: ClickHouseを使用した時系列データ分析の追加例については、ブログ [Working with Time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) をご覧ください。_ + +ClickHouseは、[OLAP](../../faq/general/olap.md) ワークロード向けの汎用データストレージソリューションであり、多くの特化された時系列データベース管理システムが存在します。それにもかかわらず、ClickHouseの[クエリ実行速度への注力](../../concepts/why-clickhouse-is-so-fast.md)は、多くの場合、特化されたシステムを上回ることを可能にします。このテーマに関する独立したベンチマークはたくさんあるので、ここで行うことはありません。その代わり、あなたの用途としてそれを使用する場合に重要なClickHouseの機能に焦点を当てます。 + +まず、典型的な時系列として使用される**[特化されたコーデック](../../sql-reference/statements/create/table.md#specialized-codecs)**があります。`DoubleDelta`や`Gorilla`などの一般的なアルゴリズムやClickHouse特有の`T64`があります。 + +次に、時系列クエリはしばしば最新のデータ、例えば1日や1週間前のデータにのみアクセスします。高速なnVME/SSDドライブと大容量のHDDドライブを備えたサーバーを利用することが理にかなっています。ClickHouseの[有効期限 (TTL)](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/##table_engine-mergetree-multiple-volumes) 機能を使用すると、新しいホットデータを高速ドライブに保持し、それが古くなるにつれて徐々に遅いドライブに移動するように設定できます。要件が必要とする場合には、さらに古いデータのロールアップや削除も可能です。 + +生データの保存と処理を推奨するClickHouseの哲学には反するものの、[Materialized View](../../sql-reference/statements/create/view.md) を使用すると、さらに厳密なレイテンシーやコスト要件に適合させることができます。 + +## 関連コンテンツ + +- ブログ: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/fast-release-24-2.md b/docs/ja/fast-release-24-2.md new file mode 100644 index 00000000000..300d7e6c7e5 --- /dev/null +++ b/docs/ja/fast-release-24-2.md @@ -0,0 +1,240 @@ +--- +slug: /ja/whats-new/changelog/24.2-fast-release +title: v24.2 Changelog (Fast Release) +description: Fast release changelog for v24.2 +keywords: [chaneglog, fast release] +--- + +### ClickHouse release tag: 24.2.2.15987 + +#### Backward Incompatible Change +* Validate suspicious/experimental types in nested types. Previously we didn't validate such types (except JSON) in nested types like Array/Tuple/Map. [#59385](https://github.com/ClickHouse/ClickHouse/pull/59385) ([Kruglov Pavel](https://github.com/Avogar)). +* The sort clause `ORDER BY ALL` (introduced with v23.12) is replaced by `ORDER BY *`. The previous syntax was too error-prone for tables with a column `all`. [#59450](https://github.com/ClickHouse/ClickHouse/pull/59450) ([Robert Schulze](https://github.com/rschu1ze)). +* Add sanity check for number of threads and block sizes. [#60138](https://github.com/ClickHouse/ClickHouse/pull/60138) ([Raúl Marín](https://github.com/Algunenano)). +* Reject incoming INSERT queries in case when query-level settings `async_insert` and `deduplicate_blocks_in_dependent_materialized_views` are enabled together. This behaviour is controlled by a setting `throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert` and enabled by default. This is a continuation of https://github.com/ClickHouse/ClickHouse/pull/59699 needed to unblock https://github.com/ClickHouse/ClickHouse/pull/59915. [#60888](https://github.com/ClickHouse/ClickHouse/pull/60888) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Utility `clickhouse-copier` is moved to a separate repository on GitHub: https://github.com/ClickHouse/copier. It is no longer included in the bundle but is still available as a separate download. This closes: [#60734](https://github.com/ClickHouse/ClickHouse/issues/60734) This closes: [#60540](https://github.com/ClickHouse/ClickHouse/issues/60540) This closes: [#60250](https://github.com/ClickHouse/ClickHouse/issues/60250) This closes: [#52917](https://github.com/ClickHouse/ClickHouse/issues/52917) This closes: [#51140](https://github.com/ClickHouse/ClickHouse/issues/51140) This closes: [#47517](https://github.com/ClickHouse/ClickHouse/issues/47517) This closes: [#47189](https://github.com/ClickHouse/ClickHouse/issues/47189) This closes: [#46598](https://github.com/ClickHouse/ClickHouse/issues/46598) This closes: [#40257](https://github.com/ClickHouse/ClickHouse/issues/40257) This closes: [#36504](https://github.com/ClickHouse/ClickHouse/issues/36504) This closes: [#35485](https://github.com/ClickHouse/ClickHouse/issues/35485) This closes: [#33702](https://github.com/ClickHouse/ClickHouse/issues/33702) This closes: [#26702](https://github.com/ClickHouse/ClickHouse/issues/26702) ### Documentation entry for user-facing changes. [#61058](https://github.com/ClickHouse/ClickHouse/pull/61058) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* To increase compatibility with MySQL, function `locate` now accepts arguments `(needle, haystack[, start_pos])` by default. The previous behavior `(haystack, needle, [, start_pos])` can be restored by setting `function_locate_has_mysql_compatible_argument_order = 0`. [#61092](https://github.com/ClickHouse/ClickHouse/pull/61092) ([Robert Schulze](https://github.com/rschu1ze)). +* The obsolete in-memory data parts have been deprecated since version 23.5 and have not been supported since version 23.10. Now the remaining code is removed. Continuation of [#55186](https://github.com/ClickHouse/ClickHouse/issues/55186) and [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). It is unlikely that you have used in-memory data parts because they were available only before version 23.5 and only when you enabled them manually by specifying the corresponding SETTINGS for a MergeTree table. To check if you have in-memory data parts, run the following query: `SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type`. To disable the usage of in-memory data parts, do `ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT`. Before upgrading from old ClickHouse releases, first check that you don't have in-memory data parts. If there are in-memory data parts, disable them first, then wait while there are no in-memory data parts and continue the upgrade. [#61127](https://github.com/ClickHouse/ClickHouse/pull/61127) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Forbid `SimpleAggregateFunction` in `ORDER BY` of `MergeTree` tables (like `AggregateFunction` is forbidden, but they are forbidden because they are not comparable) by default (use `allow_suspicious_primary_key` to allow them). [#61399](https://github.com/ClickHouse/ClickHouse/pull/61399) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse allows arbitrary binary data in the String data type, which is typically UTF-8. Parquet/ORC/Arrow Strings only support UTF-8. That's why you can choose which Arrow's data type to use for the ClickHouse String data type - String or Binary. This is controlled by the settings, `output_format_parquet_string_as_string`, `output_format_orc_string_as_string`, `output_format_arrow_string_as_string`. While Binary would be more correct and compatible, using String by default will correspond to user expectations in most cases. Parquet/ORC/Arrow supports many compression methods, including lz4 and zstd. ClickHouse supports each and every compression method. Some inferior tools lack support for the faster `lz4` compression method, that's why we set `zstd` by default. This is controlled by the settings `output_format_parquet_compression_method`, `output_format_orc_compression_method`, and `output_format_arrow_compression_method`. We changed the default to `zstd` for Parquet and ORC, but not Arrow (it is emphasized for low-level usages). [#61817](https://github.com/ClickHouse/ClickHouse/pull/61817) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix for the materialized view security issue, which allowed a user to insert into a table without required grants for that. Fix validates that the user has permission to insert not only into a materialized view but also into all underlying tables. This means that some queries, which worked before, now can fail with Not enough privileges. To address this problem, the release introduces a new feature of SQL security for views [https://clickhouse.com/docs/ja/sql-reference/statements/create/view#sql_security](https://clickhouse.com/docs/ja/sql-reference/statements/create/view#sql_security). [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)) + +#### New Feature +* Topk/topkweighed support mode, which return count of values and it's error. [#54508](https://github.com/ClickHouse/ClickHouse/pull/54508) ([UnamedRus](https://github.com/UnamedRus)). +* Added new syntax which allows to specify definer user in View/Materialized View. This allows to execute selects/inserts from views without explicit grants for underlying tables. [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)). +* Implemented automatic conversion of merge tree tables of different kinds to replicated engine. Create empty `convert_to_replicated` file in table's data directory (`/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`) and that table will be converted automatically on next server start. [#57798](https://github.com/ClickHouse/ClickHouse/pull/57798) ([Kirill](https://github.com/kirillgarbar)). +* Added table function `mergeTreeIndex`. It represents the contents of index and marks files of `MergeTree` tables. It can be used for introspection. Syntax: `mergeTreeIndex(database, table, [with_marks = true])` where `database.table` is an existing table with `MergeTree` engine. [#58140](https://github.com/ClickHouse/ClickHouse/pull/58140) ([Anton Popov](https://github.com/CurtizJ)). +* Try to detect file format automatically during schema inference if it's unknown in `file/s3/hdfs/url/azureBlobStorage` engines. Closes [#50576](https://github.com/ClickHouse/ClickHouse/issues/50576). [#59092](https://github.com/ClickHouse/ClickHouse/pull/59092) ([Kruglov Pavel](https://github.com/Avogar)). +* Add generate_series as a table function. This function generates table with an arithmetic progression with natural numbers. [#59390](https://github.com/ClickHouse/ClickHouse/pull/59390) ([divanik](https://github.com/divanik)). +* Added query `ALTER TABLE table FORGET PARTITION partition` that removes ZooKeeper nodes, related to an empty partition. [#59507](https://github.com/ClickHouse/ClickHouse/pull/59507) ([Sergei Trifonov](https://github.com/serxa)). +* Support reading and writing backups as tar archives. [#59535](https://github.com/ClickHouse/ClickHouse/pull/59535) ([josh-hildred](https://github.com/josh-hildred)). +* Provides new aggregate function ‘groupArrayIntersect’. Follows up: [#49862](https://github.com/ClickHouse/ClickHouse/issues/49862). [#59598](https://github.com/ClickHouse/ClickHouse/pull/59598) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Implemented system.dns_cache table, which can be useful for debugging DNS issues. [#59856](https://github.com/ClickHouse/ClickHouse/pull/59856) ([Kirill Nikiforov](https://github.com/allmazz)). +* Implemented support for S3Express buckets. [#59965](https://github.com/ClickHouse/ClickHouse/pull/59965) ([Nikita Taranov](https://github.com/nickitat)). +* The codec `LZ4HC` will accept a new level 2, which is faster than the previous minimum level 3, at the expense of less compression. In previous versions, `LZ4HC(2)` and less was the same as `LZ4HC(3)`. Author: [Cyan4973](https://github.com/Cyan4973). [#60090](https://github.com/ClickHouse/ClickHouse/pull/60090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Implemented system.dns_cache table, which can be useful for debugging DNS issues. New server setting dns_cache_max_size. [#60257](https://github.com/ClickHouse/ClickHouse/pull/60257) ([Kirill Nikiforov](https://github.com/allmazz)). +* Added function `toMillisecond` which returns the millisecond component for values of type`DateTime` or `DateTime64`. [#60281](https://github.com/ClickHouse/ClickHouse/pull/60281) ([Shaun Struwig](https://github.com/Blargian)). +* Support single-argument version for the merge table function, as `merge(['db_name', ] 'tables_regexp')`. [#60372](https://github.com/ClickHouse/ClickHouse/pull/60372) ([豪肥肥](https://github.com/HowePa)). +* Make all format names case insensitive, like Tsv, or TSV, or tsv, or even rowbinary. [#60420](https://github.com/ClickHouse/ClickHouse/pull/60420) ([豪肥肥](https://github.com/HowePa)). +* Added new syntax which allows to specify definer user in View/Materialized View. This allows to execute selects/inserts from views without explicit grants for underlying tables. [#60439](https://github.com/ClickHouse/ClickHouse/pull/60439) ([pufit](https://github.com/pufit)). +* Add four properties to the `StorageMemory` (memory-engine) `min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep` and `max_rows_to_keep` - Add tests to reflect new changes - Update `memory.md` documentation - Add table `context` property to `MemorySink` to enable access to table parameter bounds. [#60612](https://github.com/ClickHouse/ClickHouse/pull/60612) ([Jake Bamrah](https://github.com/JakeBamrah)). +* Added function `toMillisecond` which returns the millisecond component for values of type`DateTime` or `DateTime64`. [#60649](https://github.com/ClickHouse/ClickHouse/pull/60649) ([Robert Schulze](https://github.com/rschu1ze)). +* Separate limits on number of waiting and executing queries. Added new server setting `max_waiting_queries` that limits the number of queries waiting due to `async_load_databases`. Existing limits on number of executing queries no longer count waiting queries. [#61053](https://github.com/ClickHouse/ClickHouse/pull/61053) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for `ATTACH PARTITION ALL`. [#61107](https://github.com/ClickHouse/ClickHouse/pull/61107) ([Kirill Nikiforov](https://github.com/allmazz)). + +#### Performance Improvement +* Eliminates min/max/any/anyLast aggregators of GROUP BY keys in SELECT section. [#52230](https://github.com/ClickHouse/ClickHouse/pull/52230) ([JackyWoo](https://github.com/JackyWoo)). +* Improve the performance of serialized aggregation method when involving multiple [nullable] columns. This is a general version of [#51399](https://github.com/ClickHouse/ClickHouse/issues/51399) that doesn't compromise on abstraction integrity. [#55809](https://github.com/ClickHouse/ClickHouse/pull/55809) ([Amos Bird](https://github.com/amosbird)). +* Lazy build join output to improve performance of ALL join. [#58278](https://github.com/ClickHouse/ClickHouse/pull/58278) ([LiuNeng](https://github.com/liuneng1994)). +* Improvements to aggregate functions ArgMin / ArgMax / any / anyLast / anyHeavy, as well as `ORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1` queries. [#58640](https://github.com/ClickHouse/ClickHouse/pull/58640) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize performance of sum/avg conditionally for bigint and big decimal types by reducing branch miss. [#59504](https://github.com/ClickHouse/ClickHouse/pull/59504) ([李扬](https://github.com/taiyang-li)). +* Improve performance of SELECTs with active mutations. [#59531](https://github.com/ClickHouse/ClickHouse/pull/59531) ([Azat Khuzhin](https://github.com/azat)). +* Trivial optimize on column filter. Avoid those filter columns whoes underlying data type is not number being filtered with `result_size_hint = -1`. Peak memory can be reduced to 44% of the original in some cases. [#59698](https://github.com/ClickHouse/ClickHouse/pull/59698) ([李扬](https://github.com/taiyang-li)). +* Primary key will use less amount of memory. [#60049](https://github.com/ClickHouse/ClickHouse/pull/60049) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve memory usage for primary key and some other operations. [#60050](https://github.com/ClickHouse/ClickHouse/pull/60050) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The tables' primary keys will be loaded in memory lazily on first access. This is controlled by the new MergeTree setting `primary_key_lazy_load`, which is on by default. This provides several advantages: - it will not be loaded for tables that are not used; - if there is not enough memory, an exception will be thrown on first use instead of at server startup. This provides several disadvantages: - the latency of loading the primary key will be paid on the first query rather than before accepting connections; this theoretically may introduce a thundering-herd problem. This closes [#11188](https://github.com/ClickHouse/ClickHouse/issues/11188). [#60093](https://github.com/ClickHouse/ClickHouse/pull/60093) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Vectorized function `dotProduct` which is useful for vector search. [#60202](https://github.com/ClickHouse/ClickHouse/pull/60202) ([Robert Schulze](https://github.com/rschu1ze)). +* If the table's primary key contains mostly useless columns, don't keep them in memory. This is controlled by a new setting `primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns` with the value `0.9` by default, which means: for a composite primary key, if a column changes its value for at least 0.9 of all the times, the next columns after it will be not loaded. [#60255](https://github.com/ClickHouse/ClickHouse/pull/60255) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Execute multiIf function columnarly when result_type's underlying type is number. [#60384](https://github.com/ClickHouse/ClickHouse/pull/60384) ([李扬](https://github.com/taiyang-li)). +* As is shown in Fig 1, the replacement of "&&" with "&" could generate the SIMD code. ![image](https://github.com/ClickHouse/ClickHouse/assets/26588299/a5a72ac4-6dc6-4d52-835a-4f512e55f0b9) Fig 1. Code compiled from '&&' (left) and '&' (right). [#60498](https://github.com/ClickHouse/ClickHouse/pull/60498) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Faster (almost 2x) mutexes (was slower due to ThreadFuzzer). [#60823](https://github.com/ClickHouse/ClickHouse/pull/60823) ([Azat Khuzhin](https://github.com/azat)). +* Move connection drain from prepare to work, and drain multiple connections in parallel. [#60845](https://github.com/ClickHouse/ClickHouse/pull/60845) ([lizhuoyu5](https://github.com/lzydmxy)). +* Optimize insertManyFrom of nullable number or nullable string. [#60846](https://github.com/ClickHouse/ClickHouse/pull/60846) ([李扬](https://github.com/taiyang-li)). +* Optimized function `dotProduct` to omit unnecessary and expensive memory copies. [#60928](https://github.com/ClickHouse/ClickHouse/pull/60928) ([Robert Schulze](https://github.com/rschu1ze)). +* Operations with the filesystem cache will suffer less from the lock contention. [#61066](https://github.com/ClickHouse/ClickHouse/pull/61066) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimize ColumnString::replicate and prevent memcpySmallAllowReadWriteOverflow15Impl from being optimized to built-in memcpy. Close [#61074](https://github.com/ClickHouse/ClickHouse/issues/61074). ColumnString::replicate speeds up by 2.46x on x86-64. [#61075](https://github.com/ClickHouse/ClickHouse/pull/61075) ([李扬](https://github.com/taiyang-li)). +* 30x faster printing for 256-bit integers. [#61100](https://github.com/ClickHouse/ClickHouse/pull/61100) ([Raúl Marín](https://github.com/Algunenano)). +* If a query with a syntax error contained COLUMNS matcher with a regular expression, the regular expression was compiled each time during the parser's backtracking, instead of being compiled once. This was a fundamental error. The compiled regexp was put to AST. But the letter A in AST means "abstract" which means it should not contain heavyweight objects. Parts of AST can be created and discarded during parsing, including a large number of backtracking. This leads to slowness on the parsing side and consequently allows DoS by a readonly user. But the main problem is that it prevents progress in fuzzers. [#61543](https://github.com/ClickHouse/ClickHouse/pull/61543) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* While running the MODIFY COLUMN query for materialized views, check the inner table's structure to ensure every column exists. [#47427](https://github.com/ClickHouse/ClickHouse/pull/47427) ([sunny](https://github.com/sunny19930321)). +* Added table `system.keywords` which contains all the keywords from parser. Mostly needed and will be used for better fuzzing and syntax highlighting. [#51808](https://github.com/ClickHouse/ClickHouse/pull/51808) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for parameterized view with analyzer to not analyze create parameterized view. Refactor existing parameterized view logic to not analyze create parameterized view. [#54211](https://github.com/ClickHouse/ClickHouse/pull/54211) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Ordinary database engine is deprecated. You will receive a warning in clickhouse-client if your server is using it. This closes [#52229](https://github.com/ClickHouse/ClickHouse/issues/52229). [#56942](https://github.com/ClickHouse/ClickHouse/pull/56942) ([shabroo](https://github.com/shabroo)). +* All zero copy locks related to a table have to be dropped when the table is dropped. The directory which contains these locks has to be removed also. [#57575](https://github.com/ClickHouse/ClickHouse/pull/57575) ([Sema Checherinda](https://github.com/CheSema)). +* Add short-circuit ability for `dictGetOrDefault` function. Closes [#52098](https://github.com/ClickHouse/ClickHouse/issues/52098). [#57767](https://github.com/ClickHouse/ClickHouse/pull/57767) ([jsc0218](https://github.com/jsc0218)). +* Allow declaring enum in external table structure. [#57857](https://github.com/ClickHouse/ClickHouse/pull/57857) ([Duc Canh Le](https://github.com/canhld94)). +* Running `ALTER COLUMN MATERIALIZE` on a column with `DEFAULT` or `MATERIALIZED` expression now writes the correct values: The default value for existing parts with default value or the non-default value for existing parts with non-default value. Previously, the default value was written for all existing parts. [#58023](https://github.com/ClickHouse/ClickHouse/pull/58023) ([Duc Canh Le](https://github.com/canhld94)). +* Enabled a backoff logic (e.g. exponential). Will provide an ability for reduced CPU usage, memory usage and log file sizes. [#58036](https://github.com/ClickHouse/ClickHouse/pull/58036) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Consider lightweight deleted rows when selecting parts to merge. [#58223](https://github.com/ClickHouse/ClickHouse/pull/58223) ([Zhuo Qiu](https://github.com/jewelzqiu)). +* Allow to define `volume_priority` in `storage_configuration`. [#58533](https://github.com/ClickHouse/ClickHouse/pull/58533) ([Andrey Zvonov](https://github.com/zvonand)). +* Add support for Date32 type in T64 codec. [#58738](https://github.com/ClickHouse/ClickHouse/pull/58738) ([Hongbin Ma](https://github.com/binmahone)). +* This PR makes http/https connections reusable for all uses cases. Even when response is 3xx or 4xx. [#58845](https://github.com/ClickHouse/ClickHouse/pull/58845) ([Sema Checherinda](https://github.com/CheSema)). +* Added comments for columns for more system tables. Continuation of https://github.com/ClickHouse/ClickHouse/pull/58356. [#59016](https://github.com/ClickHouse/ClickHouse/pull/59016) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now we can use virtual columns in PREWHERE. It's worthwhile for non-const virtual columns like `_part_offset`. [#59033](https://github.com/ClickHouse/ClickHouse/pull/59033) ([Amos Bird](https://github.com/amosbird)). +* Settings for the Distributed table engine can now be specified in the server configuration file (similar to MergeTree settings), e.g. ``` false ```. [#59291](https://github.com/ClickHouse/ClickHouse/pull/59291) ([Azat Khuzhin](https://github.com/azat)). +* Keeper improvement: cache only a certain amount of logs in-memory controlled by `latest_logs_cache_size_threshold` and `commit_logs_cache_size_threshold`. [#59460](https://github.com/ClickHouse/ClickHouse/pull/59460) ([Antonio Andelic](https://github.com/antonio2368)). +* Instead using a constant key, now object storage generates key for determining remove objects capability. [#59495](https://github.com/ClickHouse/ClickHouse/pull/59495) ([Sema Checherinda](https://github.com/CheSema)). +* Don't infer floats in exponential notation by default. Add a setting `input_format_try_infer_exponent_floats` that will restore previous behaviour (disabled by default). Closes [#59476](https://github.com/ClickHouse/ClickHouse/issues/59476). [#59500](https://github.com/ClickHouse/ClickHouse/pull/59500) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow alter operations to be surrounded by parenthesis. The emission of parentheses can be controlled by the `format_alter_operations_with_parentheses` config. By default in formatted queries the parentheses are emitted as we store the formatted alter operations in some places as metadata (e.g.: mutations). The new syntax clarifies some of the queries where alter operations end in a list. E.g.: `ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c` cannot be parsed properly with the old syntax. In the new syntax the query `ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c)` is obvious. Older versions are not able to read the new syntax, therefore using the new syntax might cause issues if newer and older version of ClickHouse are mixed in a single cluster. [#59532](https://github.com/ClickHouse/ClickHouse/pull/59532) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Bumped Intel QPL (used by codec `DEFLATE_QPL`) from v1.3.1 to v1.4.0 . Also fixed a bug for polling timeout mechanism, as we observed in same cases timeout won't work properly, if timeout happen, IAA and CPU may process buffer concurrently. So far, we'd better make sure IAA codec status is not QPL_STS_BEING_PROCESSED, then fallback to SW codec. [#59551](https://github.com/ClickHouse/ClickHouse/pull/59551) ([jasperzhu](https://github.com/jinjunzh)). +* Add positional pread in libhdfs3. If you want to call positional read in libhdfs3, use the hdfsPread function in hdfs.h as follows. `tSize hdfsPread(hdfsFS fs, hdfsFile file, void * buffer, tSize length, tOffset position);`. [#59624](https://github.com/ClickHouse/ClickHouse/pull/59624) ([M1eyu](https://github.com/M1eyu2018)). +* Check for stack overflow in parsers even if the user misconfigured the `max_parser_depth` setting to a very high value. This closes [#59622](https://github.com/ClickHouse/ClickHouse/issues/59622). [#59697](https://github.com/ClickHouse/ClickHouse/pull/59697) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Unify xml and sql created named collection behaviour in kafka storage. [#59710](https://github.com/ClickHouse/ClickHouse/pull/59710) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Allow uuid in replica_path if CREATE TABLE explicitly has it. [#59908](https://github.com/ClickHouse/ClickHouse/pull/59908) ([Azat Khuzhin](https://github.com/azat)). +* Add column `metadata_version` of ReplicatedMergeTree table in `system.tables` system table. [#59942](https://github.com/ClickHouse/ClickHouse/pull/59942) ([Maksim Kita](https://github.com/kitaisreal)). +* Keeper improvement: add retries on failures for Disk related operations. [#59980](https://github.com/ClickHouse/ClickHouse/pull/59980) ([Antonio Andelic](https://github.com/antonio2368)). +* Add new config setting `backups.remove_backup_files_after_failure`: ``` true ```. [#60002](https://github.com/ClickHouse/ClickHouse/pull/60002) ([Vitaly Baranov](https://github.com/vitlibar)). +* Use multiple threads while reading the metadata of tables from a backup while executing the RESTORE command. [#60040](https://github.com/ClickHouse/ClickHouse/pull/60040) ([Vitaly Baranov](https://github.com/vitlibar)). +* Now if `StorageBuffer` has more than 1 shard (`num_layers` > 1) background flush will happen simultaneously for all shards in multiple threads. [#60111](https://github.com/ClickHouse/ClickHouse/pull/60111) ([alesapin](https://github.com/alesapin)). +* Support specifying users for specific S3 settings in config using `user` key. [#60144](https://github.com/ClickHouse/ClickHouse/pull/60144) ([Antonio Andelic](https://github.com/antonio2368)). +* Copy S3 file GCP fallback to buffer copy in case GCP returned `Internal Error` with `GATEWAY_TIMEOUT` HTTP error code. [#60164](https://github.com/ClickHouse/ClickHouse/pull/60164) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow "local" as object storage type instead of "local_blob_storage". [#60165](https://github.com/ClickHouse/ClickHouse/pull/60165) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implement comparison operator for Variant values and proper Field inserting into Variant column. Don't allow creating `Variant` type with similar variant types by default (allow uder a setting `allow_suspicious_variant_types`) Closes [#59996](https://github.com/ClickHouse/ClickHouse/issues/59996). Closes [#59850](https://github.com/ClickHouse/ClickHouse/issues/59850). [#60198](https://github.com/ClickHouse/ClickHouse/pull/60198) ([Kruglov Pavel](https://github.com/Avogar)). +* Improved overall usability of virtual columns. Now it is allowed to use virtual columns in `PREWHERE` (it's worthwhile for non-const virtual columns like `_part_offset`). Now a builtin documentation is available for virtual columns as a comment of column in `DESCRIBE` query with enabled setting `describe_include_virtual_columns`. [#60205](https://github.com/ClickHouse/ClickHouse/pull/60205) ([Anton Popov](https://github.com/CurtizJ)). +* Short circuit execution for `ULIDStringToDateTime`. [#60211](https://github.com/ClickHouse/ClickHouse/pull/60211) ([Juan Madurga](https://github.com/jlmadurga)). +* Added `query_id` column for tables `system.backups` and `system.backup_log`. Added error stacktrace to `error` column. [#60220](https://github.com/ClickHouse/ClickHouse/pull/60220) ([Maksim Kita](https://github.com/kitaisreal)). +* Parallel flush of pending INSERT blocks of Distributed engine on `DETACH`/server shutdown and `SYSTEM FLUSH DISTRIBUTED` (Parallelism will work only if you have multi disk policy for table (like everything in Distributed engine right now)). [#60225](https://github.com/ClickHouse/ClickHouse/pull/60225) ([Azat Khuzhin](https://github.com/azat)). +* Filter setting is improper in `joinRightColumnsSwitchNullability`, resolve [#59625](https://github.com/ClickHouse/ClickHouse/issues/59625). [#60259](https://github.com/ClickHouse/ClickHouse/pull/60259) ([lgbo](https://github.com/lgbo-ustc)). +* Add a setting to force read-through cache for merges. [#60308](https://github.com/ClickHouse/ClickHouse/pull/60308) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Issue [#57598](https://github.com/ClickHouse/ClickHouse/issues/57598) mentions a variant behaviour regarding transaction handling. An issued COMMIT/ROLLBACK when no transaction is active is reported as an error contrary to MySQL behaviour. [#60338](https://github.com/ClickHouse/ClickHouse/pull/60338) ([PapaToemmsn](https://github.com/PapaToemmsn)). +* Added `none_only_active` mode for `distributed_ddl_output_mode` setting. [#60340](https://github.com/ClickHouse/ClickHouse/pull/60340) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Connections through the MySQL port now automatically run with setting `prefer_column_name_to_alias = 1` to support QuickSight out-of-the-box. Also, settings `mysql_map_string_to_text_in_show_columns` and `mysql_map_fixed_string_to_text_in_show_columns` are now enabled by default, affecting also only MySQL connections. This increases compatibility with more BI tools. [#60365](https://github.com/ClickHouse/ClickHouse/pull/60365) ([Robert Schulze](https://github.com/rschu1ze)). +* When output format is Pretty format and a block consists of a single numeric value which exceeds one million, A readable number will be printed on table right. e.g. ``` ┌──────count()─┐ │ 233765663884 │ -- 233.77 billion └──────────────┘ ```. [#60379](https://github.com/ClickHouse/ClickHouse/pull/60379) ([rogeryk](https://github.com/rogeryk)). +* Allow configuring HTTP redirect handlers for clickhouse-server. For example, you can make `/` redirect to the Play UI. [#60390](https://github.com/ClickHouse/ClickHouse/pull/60390) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The advanced dashboard has slightly better colors for multi-line graphs. [#60391](https://github.com/ClickHouse/ClickHouse/pull/60391) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix a race condition in JavaScript code leading to duplicate charts on top of each other. [#60392](https://github.com/ClickHouse/ClickHouse/pull/60392) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check for stack overflow in parsers even if the user misconfigured the `max_parser_depth` setting to a very high value. This closes [#59622](https://github.com/ClickHouse/ClickHouse/issues/59622). [#60434](https://github.com/ClickHouse/ClickHouse/pull/60434) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Function `substring` now has a new alias `byteSlice`. [#60494](https://github.com/ClickHouse/ClickHouse/pull/60494) ([Robert Schulze](https://github.com/rschu1ze)). +* Renamed server setting `dns_cache_max_size` to `dns_cache_max_entries` to reduce ambiguity. [#60500](https://github.com/ClickHouse/ClickHouse/pull/60500) ([Kirill Nikiforov](https://github.com/allmazz)). +* `SHOW INDEX | INDEXES | INDICES | KEYS` no longer sorts by the primary key columns (which was unintuitive). [#60514](https://github.com/ClickHouse/ClickHouse/pull/60514) ([Robert Schulze](https://github.com/rschu1ze)). +* Keeper improvement: abort during startup if an invalid snapshot is detected to avoid data loss. [#60537](https://github.com/ClickHouse/ClickHouse/pull/60537) ([Antonio Andelic](https://github.com/antonio2368)). +* Added MergeTree read split ranges into intersecting and non intersecting fault injection using `merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_fault_probability` setting. [#60548](https://github.com/ClickHouse/ClickHouse/pull/60548) ([Maksim Kita](https://github.com/kitaisreal)). +* The Advanced dashboard now has controls always visible on scrolling. This allows you to add a new chart without scrolling up. [#60692](https://github.com/ClickHouse/ClickHouse/pull/60692) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* String types and Enums can be used in the same context, such as: arrays, UNION queries, conditional expressions. This closes [#60726](https://github.com/ClickHouse/ClickHouse/issues/60726). [#60727](https://github.com/ClickHouse/ClickHouse/pull/60727) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Update tzdata to 2024a. [#60768](https://github.com/ClickHouse/ClickHouse/pull/60768) ([Raúl Marín](https://github.com/Algunenano)). +* Support files without format extension in Filesystem database. [#60795](https://github.com/ClickHouse/ClickHouse/pull/60795) ([Kruglov Pavel](https://github.com/Avogar)). +* Keeper improvement: support `leadership_expiry_ms` in Keeper's settings. [#60806](https://github.com/ClickHouse/ClickHouse/pull/60806) ([Brokenice0415](https://github.com/Brokenice0415)). +* Always infer exponential numbers in JSON formats regardless of the setting `input_format_try_infer_exponent_floats`. Add setting `input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects` that allows to use String type for ambiguous paths instead of an exception during named Tuples inference from JSON objects. [#60808](https://github.com/ClickHouse/ClickHouse/pull/60808) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a flag for SMJ to treat null as biggest/smallest. So the behavior can be compitable with other SQL systems, like Apache Spark. [#60896](https://github.com/ClickHouse/ClickHouse/pull/60896) ([loudongfeng](https://github.com/loudongfeng)). +* Clickhouse version has been added to docker labels. Closes [#54224](https://github.com/ClickHouse/ClickHouse/issues/54224). [#60949](https://github.com/ClickHouse/ClickHouse/pull/60949) ([Nikolay Monkov](https://github.com/nikmonkov)). +* Add a setting `parallel_replicas_allow_in_with_subquery = 1` which allows subqueries for IN work with parallel replicas. [#60950](https://github.com/ClickHouse/ClickHouse/pull/60950) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* DNSResolver shuffles set of resolved IPs. [#60965](https://github.com/ClickHouse/ClickHouse/pull/60965) ([Sema Checherinda](https://github.com/CheSema)). +* Support detect output format by file exctension in `clickhouse-client` and `clickhouse-local`. [#61036](https://github.com/ClickHouse/ClickHouse/pull/61036) ([豪肥肥](https://github.com/HowePa)). +* Check memory limit update periodically. [#61049](https://github.com/ClickHouse/ClickHouse/pull/61049) ([Han Fei](https://github.com/hanfei1991)). +* Enable processors profiling (time spent/in and out bytes for sorting, aggregation, ...) by default. [#61096](https://github.com/ClickHouse/ClickHouse/pull/61096) ([Azat Khuzhin](https://github.com/azat)). +* Add the function `toUInt128OrZero`, which was missed by mistake (the mistake is related to https://github.com/ClickHouse/ClickHouse/pull/945). The compatibility aliases `FROM_UNIXTIME` and `DATE_FORMAT` (they are not ClickHouse-native and only exist for MySQL compatibility) have been made case insensitive, as expected for SQL-compatibility aliases. [#61114](https://github.com/ClickHouse/ClickHouse/pull/61114) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improvements for the access checks, allowing to revoke of unpossessed rights in case the target user doesn't have the revoking grants either. Example: ```sql GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;. [#61115](https://github.com/ClickHouse/ClickHouse/pull/61115) ([pufit](https://github.com/pufit)). +* Fix an error in previeous opt: https://github.com/ClickHouse/ClickHouse/pull/59698: remove break to make sure the first filtered column has minimum size cc @jsc0218. [#61145](https://github.com/ClickHouse/ClickHouse/pull/61145) ([李扬](https://github.com/taiyang-li)). +* Fix `has()` function with `Nullable` column (fixes [#60214](https://github.com/ClickHouse/ClickHouse/issues/60214)). [#61249](https://github.com/ClickHouse/ClickHouse/pull/61249) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Now it's possible to specify attribute `merge="true"` in config substitutions for subtrees ``. In case this attribute specified, clickhouse will merge subtree with existing configuration, otherwise default behavior is append new content to configuration. [#61299](https://github.com/ClickHouse/ClickHouse/pull/61299) ([alesapin](https://github.com/alesapin)). +* Add async metrics for virtual memory mappings: VMMaxMapCount & VMNumMaps. Closes [#60662](https://github.com/ClickHouse/ClickHouse/issues/60662). [#61354](https://github.com/ClickHouse/ClickHouse/pull/61354) ([Tuan Pham Anh](https://github.com/tuanpavn)). +* Use `temporary_files_codec` setting in all places where we create temporary data, for example external memory sorting and external memory GROUP BY. Before it worked only in `partial_merge` JOIN algorithm. [#61456](https://github.com/ClickHouse/ClickHouse/pull/61456) ([Maksim Kita](https://github.com/kitaisreal)). +* Remove duplicated check `containing_part.empty()`, It's already being checked here: https://github.com/ClickHouse/ClickHouse/blob/1296dac3c7e47670872c15e3f5e58f869e0bd2f2/src/Storages/MergeTree/MergeTreeData.cpp#L6141. [#61467](https://github.com/ClickHouse/ClickHouse/pull/61467) ([William Schoeffel](https://github.com/wiledusc)). +* Add a new setting `max_parser_backtracks` which allows to limit the complexity of query parsing. [#61502](https://github.com/ClickHouse/ClickHouse/pull/61502) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Less contention during dynamic resize of filesystem cache. [#61524](https://github.com/ClickHouse/ClickHouse/pull/61524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disallow sharded mode of StorageS3 queue, because it will be rewritten. [#61537](https://github.com/ClickHouse/ClickHouse/pull/61537) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed typo: from `use_leagcy_max_level` to `use_legacy_max_level`. [#61545](https://github.com/ClickHouse/ClickHouse/pull/61545) ([William Schoeffel](https://github.com/wiledusc)). +* Remove some duplicate entries in blob_storage_log. [#61622](https://github.com/ClickHouse/ClickHouse/pull/61622) ([YenchangChan](https://github.com/YenchangChan)). +* Added `current_user` function as a compatibility alias for MySQL. [#61770](https://github.com/ClickHouse/ClickHouse/pull/61770) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Use managed identity for backups IO when using Azure Blob Storage. Add a setting to prevent ClickHouse from attempting to create a non-existent container, which requires permissions at the storage account level. [#61785](https://github.com/ClickHouse/ClickHouse/pull/61785) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* In the previous version, some numbers in Pretty formats were not pretty enough. [#61794](https://github.com/ClickHouse/ClickHouse/pull/61794) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A long value in Pretty formats won't be cut if it is the single value in the resultset, such as in the result of the `SHOW CREATE TABLE` query. [#61795](https://github.com/ClickHouse/ClickHouse/pull/61795) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Similarly to `clickhouse-local`, `clickhouse-client` will accept the `--output-format` option as a synonym to the `--format` option. This closes [#59848](https://github.com/ClickHouse/ClickHouse/issues/59848). [#61797](https://github.com/ClickHouse/ClickHouse/pull/61797) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* If stdout is a terminal and the output format is not specified, `clickhouse-client` and similar tools will use `PrettyCompact` by default, similarly to the interactive mode. `clickhouse-client` and `clickhouse-local` will handle command line arguments for input and output formats in a unified fashion. This closes [#61272](https://github.com/ClickHouse/ClickHouse/issues/61272). [#61800](https://github.com/ClickHouse/ClickHouse/pull/61800) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Underscore digit groups in Pretty formats for better readability. This is controlled by a new setting, `output_format_pretty_highlight_digit_groups`. [#61802](https://github.com/ClickHouse/ClickHouse/pull/61802) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Fix bug with `intDiv` for decimal arguments [#59243](https://github.com/ClickHouse/ClickHouse/pull/59243) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix_kql_issue_found_by_wingfuzz [#59626](https://github.com/ClickHouse/ClickHouse/pull/59626) ([Yong Wang](https://github.com/kashwy)). +* Fix error "Read beyond last offset" for AsynchronousBoundedReadBuffer [#59630](https://github.com/ClickHouse/ClickHouse/pull/59630) ([Vitaly Baranov](https://github.com/vitlibar)). +* rabbitmq: fix having neither acked nor nacked messages [#59775](https://github.com/ClickHouse/ClickHouse/pull/59775) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix function execution over const and LowCardinality with GROUP BY const for analyzer [#59986](https://github.com/ClickHouse/ClickHouse/pull/59986) ([Azat Khuzhin](https://github.com/azat)). +* Fix scale conversion for DateTime64 [#60004](https://github.com/ClickHouse/ClickHouse/pull/60004) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix INSERT into SQLite with single quote (by escaping single quotes with a quote instead of backslash) [#60015](https://github.com/ClickHouse/ClickHouse/pull/60015) ([Azat Khuzhin](https://github.com/azat)). +* Fix optimize_uniq_to_count removing the column alias [#60026](https://github.com/ClickHouse/ClickHouse/pull/60026) ([Raúl Marín](https://github.com/Algunenano)). +* Fix finished_mutations_to_keep=0 for MergeTree (as docs says 0 is to keep everything) [#60031](https://github.com/ClickHouse/ClickHouse/pull/60031) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible exception from s3queue table on drop [#60036](https://github.com/ClickHouse/ClickHouse/pull/60036) ([Kseniia Sumarokova](https://github.com/kssenii)). +* PartsSplitter invalid ranges for the same part [#60041](https://github.com/ClickHouse/ClickHouse/pull/60041) ([Maksim Kita](https://github.com/kitaisreal)). +* Use max_query_size from context in DDLLogEntry instead of hardcoded 4096 [#60083](https://github.com/ClickHouse/ClickHouse/pull/60083) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix inconsistent formatting of queries [#60095](https://github.com/ClickHouse/ClickHouse/pull/60095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of explain in subqueries [#60102](https://github.com/ClickHouse/ClickHouse/pull/60102) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix cosineDistance crash with Nullable [#60150](https://github.com/ClickHouse/ClickHouse/pull/60150) ([Raúl Marín](https://github.com/Algunenano)). +* Allow casting of bools in string representation to to true bools [#60160](https://github.com/ClickHouse/ClickHouse/pull/60160) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix system.s3queue_log [#60166](https://github.com/ClickHouse/ClickHouse/pull/60166) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix arrayReduce with nullable aggregate function name [#60188](https://github.com/ClickHouse/ClickHouse/pull/60188) ([Raúl Marín](https://github.com/Algunenano)). +* Fix actions execution during preliminary filtering (PK, partition pruning) [#60196](https://github.com/ClickHouse/ClickHouse/pull/60196) ([Azat Khuzhin](https://github.com/azat)). +* Hide sensitive info for s3queue [#60233](https://github.com/ClickHouse/ClickHouse/pull/60233) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Revert "Replace `ORDER BY ALL` by `ORDER BY *`" [#60248](https://github.com/ClickHouse/ClickHouse/pull/60248) ([Robert Schulze](https://github.com/rschu1ze)). +* Azure Blob Storage : Fix issues endpoint and prefix [#60251](https://github.com/ClickHouse/ClickHouse/pull/60251) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix http exception codes. [#60252](https://github.com/ClickHouse/ClickHouse/pull/60252) ([Austin Kothig](https://github.com/kothiga)). +* fix LRUResource Cache bug (Hive cache) [#60262](https://github.com/ClickHouse/ClickHouse/pull/60262) ([shanfengp](https://github.com/Aed-p)). +* s3queue: fix bug (also fixes flaky test_storage_s3_queue/test.py::test_shards_distributed) [#60282](https://github.com/ClickHouse/ClickHouse/pull/60282) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix use-of-uninitialized-value and invalid result in hashing functions with IPv6 [#60359](https://github.com/ClickHouse/ClickHouse/pull/60359) ([Kruglov Pavel](https://github.com/Avogar)). +* Force reanalysis if parallel replicas changed [#60362](https://github.com/ClickHouse/ClickHouse/pull/60362) ([Raúl Marín](https://github.com/Algunenano)). +* Fix usage of plain metadata type with new disks configuration option [#60396](https://github.com/ClickHouse/ClickHouse/pull/60396) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Don't allow to set max_parallel_replicas to 0 as it doesn't make sense [#60430](https://github.com/ClickHouse/ClickHouse/pull/60430) ([Kruglov Pavel](https://github.com/Avogar)). +* Try to fix logical error 'Cannot capture column because it has incompatible type' in mapContainsKeyLike [#60451](https://github.com/ClickHouse/ClickHouse/pull/60451) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix OptimizeDateOrDateTimeConverterWithPreimageVisitor with null arguments [#60453](https://github.com/ClickHouse/ClickHouse/pull/60453) ([Raúl Marín](https://github.com/Algunenano)). +* Try to avoid calculation of scalar subqueries for CREATE TABLE. [#60464](https://github.com/ClickHouse/ClickHouse/pull/60464) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Merging [#59674](https://github.com/ClickHouse/ClickHouse/issues/59674). [#60470](https://github.com/ClickHouse/ClickHouse/pull/60470) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Correctly check keys in s3Cluster [#60477](https://github.com/ClickHouse/ClickHouse/pull/60477) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in parallel parsing when lots of rows are skipped due to errors [#60516](https://github.com/ClickHouse/ClickHouse/pull/60516) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix_max_query_size_for_kql_compound_operator: [#60534](https://github.com/ClickHouse/ClickHouse/pull/60534) ([Yong Wang](https://github.com/kashwy)). +* Keeper fix: add timeouts when waiting for commit logs [#60544](https://github.com/ClickHouse/ClickHouse/pull/60544) ([Antonio Andelic](https://github.com/antonio2368)). +* Reduce the number of read rows from `system.numbers` [#60546](https://github.com/ClickHouse/ClickHouse/pull/60546) ([JackyWoo](https://github.com/JackyWoo)). +* Don't output number tips for date types [#60577](https://github.com/ClickHouse/ClickHouse/pull/60577) ([Raúl Marín](https://github.com/Algunenano)). +* Fix reading from MergeTree with non-deterministic functions in filter [#60586](https://github.com/ClickHouse/ClickHouse/pull/60586) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix logical error on bad compatibility setting value type [#60596](https://github.com/ClickHouse/ClickHouse/pull/60596) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix inconsistent aggregate function states in mixed x86-64 / ARM clusters [#60610](https://github.com/ClickHouse/ClickHouse/pull/60610) ([Harry Lee](https://github.com/HarryLeeIBM)). +* fix(prql): Robust panic handler [#60615](https://github.com/ClickHouse/ClickHouse/pull/60615) ([Maximilian Roos](https://github.com/max-sixty)). +* Fix `intDiv` for decimal and date arguments [#60672](https://github.com/ClickHouse/ClickHouse/pull/60672) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix: expand CTE in alter modify query [#60682](https://github.com/ClickHouse/ClickHouse/pull/60682) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix system.parts for non-Atomic/Ordinary database engine (i.e. Memory) [#60689](https://github.com/ClickHouse/ClickHouse/pull/60689) ([Azat Khuzhin](https://github.com/azat)). +* Fix "Invalid storage definition in metadata file" for parameterized views [#60708](https://github.com/ClickHouse/ClickHouse/pull/60708) ([Azat Khuzhin](https://github.com/azat)). +* Fix buffer overflow in CompressionCodecMultiple [#60731](https://github.com/ClickHouse/ClickHouse/pull/60731) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove nonsense from SQL/JSON [#60738](https://github.com/ClickHouse/ClickHouse/pull/60738) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove wrong sanitize checking in aggregate function quantileGK [#60740](https://github.com/ClickHouse/ClickHouse/pull/60740) ([李扬](https://github.com/taiyang-li)). +* Fix insert-select + insert_deduplication_token bug by setting streams to 1 [#60745](https://github.com/ClickHouse/ClickHouse/pull/60745) ([Jordi Villar](https://github.com/jrdi)). +* Prevent setting custom metadata headers on unsupported multipart upload operations [#60748](https://github.com/ClickHouse/ClickHouse/pull/60748) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Fix toStartOfInterval [#60763](https://github.com/ClickHouse/ClickHouse/pull/60763) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix crash in arrayEnumerateRanked [#60764](https://github.com/ClickHouse/ClickHouse/pull/60764) ([Raúl Marín](https://github.com/Algunenano)). +* Fix crash when using input() in INSERT SELECT JOIN [#60765](https://github.com/ClickHouse/ClickHouse/pull/60765) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash with different allow_experimental_analyzer value in subqueries [#60770](https://github.com/ClickHouse/ClickHouse/pull/60770) ([Dmitry Novik](https://github.com/novikd)). +* Remove recursion when reading from S3 [#60849](https://github.com/ClickHouse/ClickHouse/pull/60849) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible stuck on error in HashedDictionaryParallelLoader [#60926](https://github.com/ClickHouse/ClickHouse/pull/60926) ([vdimir](https://github.com/vdimir)). +* Fix async RESTORE with Replicated database [#60934](https://github.com/ClickHouse/ClickHouse/pull/60934) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in async inserts to `Log` tables via native protocol [#61055](https://github.com/ClickHouse/ClickHouse/pull/61055) ([Anton Popov](https://github.com/CurtizJ)). +* Fix lazy execution of default argument in dictGetOrDefault for RangeHashedDictionary [#61196](https://github.com/ClickHouse/ClickHouse/pull/61196) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix multiple bugs in groupArraySorted [#61203](https://github.com/ClickHouse/ClickHouse/pull/61203) ([Raúl Marín](https://github.com/Algunenano)). +* Fix Keeper reconfig for standalone binary [#61233](https://github.com/ClickHouse/ClickHouse/pull/61233) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix usage of session_token in S3 engine [#61234](https://github.com/ClickHouse/ClickHouse/pull/61234) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible incorrect result of aggregate function `uniqExact` [#61257](https://github.com/ClickHouse/ClickHouse/pull/61257) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bugs in show database [#61269](https://github.com/ClickHouse/ClickHouse/pull/61269) ([Raúl Marín](https://github.com/Algunenano)). +* Fix logical error in RabbitMQ storage with MATERIALIZED columns [#61320](https://github.com/ClickHouse/ClickHouse/pull/61320) ([vdimir](https://github.com/vdimir)). +* Fix CREATE OR REPLACE DICTIONARY [#61356](https://github.com/ClickHouse/ClickHouse/pull/61356) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix ATTACH query with external ON CLUSTER [#61365](https://github.com/ClickHouse/ClickHouse/pull/61365) ([Nikolay Degterinsky](https://github.com/evillique)). +* fix issue of actions dag split [#61458](https://github.com/ClickHouse/ClickHouse/pull/61458) ([Raúl Marín](https://github.com/Algunenano)). +* Fix finishing a failed RESTORE [#61466](https://github.com/ClickHouse/ClickHouse/pull/61466) ([Vitaly Baranov](https://github.com/vitlibar)). +* Disable async_insert_use_adaptive_busy_timeout correctly with compatibility settings [#61468](https://github.com/ClickHouse/ClickHouse/pull/61468) ([Raúl Marín](https://github.com/Algunenano)). +* Allow queuing in restore pool [#61475](https://github.com/ClickHouse/ClickHouse/pull/61475) ([Nikita Taranov](https://github.com/nickitat)). +* Fix bug when reading system.parts using UUID (issue 61220). [#61479](https://github.com/ClickHouse/ClickHouse/pull/61479) ([Dan Wu](https://github.com/wudanzy)). +* Fix crash in window view [#61526](https://github.com/ClickHouse/ClickHouse/pull/61526) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `repeat` with non native integers [#61527](https://github.com/ClickHouse/ClickHouse/pull/61527) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix client `-s` argument [#61530](https://github.com/ClickHouse/ClickHouse/pull/61530) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix crash in arrayPartialReverseSort [#61539](https://github.com/ClickHouse/ClickHouse/pull/61539) ([Raúl Marín](https://github.com/Algunenano)). +* Fix string search with const position [#61547](https://github.com/ClickHouse/ClickHouse/pull/61547) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix addDays cause an error when used datetime64 [#61561](https://github.com/ClickHouse/ClickHouse/pull/61561) ([Shuai li](https://github.com/loneylee)). +* Fix `system.part_log` for async insert with deduplication [#61620](https://github.com/ClickHouse/ClickHouse/pull/61620) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix Non-ready set for system.parts. [#61666](https://github.com/ClickHouse/ClickHouse/pull/61666) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). diff --git a/docs/ja/get-started/cloud-quick-start.md b/docs/ja/get-started/cloud-quick-start.md new file mode 100644 index 00000000000..b6801aa1387 --- /dev/null +++ b/docs/ja/get-started/cloud-quick-start.md @@ -0,0 +1,251 @@ +--- +sidebar_position: 1 +slug: /ja/cloud-quick-start +sidebar_label: Cloudクイックスタート +keywords: [clickhouse, install, getting started, quick start] +pagination_next: en/get-started/sql-console +--- +import SignUp from '@site/docs/ja/_snippets/_sign_in_or_trial.md'; +import SQLConsoleDetail from '@site/docs/ja/_snippets/_launch_sql_console.md'; +import CheckIPAccess from '@site/docs/ja/_snippets/_check_ip_access_list_detail.md'; + +# ClickHouse Cloud クイックスタート + +ClickHouse をすぐにセットアップして利用を開始する最速かつ最も簡単な方法は、[ClickHouse Cloud](https://clickhouse.cloud)で新しいサービスを作成することです。 + +## 1: ClickHouse を入手する + +[ClickHouse Cloud](https://clickhouse.cloud)で無料の ClickHouse サービスを作成するには、次のステップを完了するだけでサインアップできます: + + - [サインアップページ](https://clickhouse.cloud/signUp)でアカウントを作成 + - 受信したメール内のリンクをクリックしてメールアドレスを確認 + - 作成したユーザー名とパスワードでログイン + +ログインすると、ClickHouse Cloud のオンボーディングウィザードが開始され、新しい ClickHouse サービスの作成をガイドしてくれます。サービスの展開先のリージョンを選択し、新しいサービスに名前を付けます: + +
+ +![New ClickHouse Service](@site/docs/ja/_snippets/images/createservice1.png) +
+ +
+ +ClickHouse Cloud は IP フィルタリングを使用してサービスへのアクセスを制限します。ローカル IP アドレスが既に追加されていることに注意してください。サービスが起動してから追加することもできます。 + +
+ +![IP Filtering](@site/docs/ja/_snippets/images/createservice2.png) +
+ +
+ +ClickHouse Cloud は `default` ユーザーのためにパスワードを生成します。資格情報を必ず保存してください。(後で変更可能です。) + +
+ +![Download Credentials](@site/docs/ja/_snippets/images/createservice3.png) +
+ +新しいサービスがプロビジョニングされ、ClickHouse Cloud ダッシュボードに表示されるはずです: + +
+ +![Download Credentials](@site/docs/ja/_snippets/images/createservice4.png) +
+ +
+ +おめでとうございます!ClickHouse Cloud サービスが起動しました。接続方法やデータのインジェストを開始する方法について、引き続きお読みください。 + +## 2: ClickHouse に接続 + +素早く始めるために、ClickHouse ではウェブベースの SQL コンソールが提供されています。 + + + +:::note +ClickHouse はデータのセキュリティを非常に重視しているため、サービス作成時に IP アクセスリストの設定が求められました。これをスキップしたり誤って閉じたりした場合、サービスに接続できません。 + +ローカル IP アドレスの追加方法については、[IP アクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントページを参照してください。 +::: + +1. 接続が正常に動作するか確認するために、簡単なクエリを入力しましょう: + + ```sql + SHOW databases + ``` + + リストには 4 つのデータベースが表示され、追加したものがあればそれも含まれます。 + + これで、新しい ClickHouse サービスを使用する準備が整いました! + +## 3: データベースとテーブルを作成 + +1. ほとんどのデータベース管理システムと同様に、ClickHouse はテーブルを論理的に**データベース**にグループ化します。新しいデータベースを ClickHouse に作成するには `CREATE DATABASE` コマンドを使用します: + ```sql + CREATE DATABASE IF NOT EXISTS helloworld + ``` + +1. `helloworld` データベースに `my_first_table` という名前のテーブルを作成するには次のコマンドを実行します: + ```sql + CREATE TABLE helloworld.my_first_table + ( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 + ) + ENGINE = MergeTree() + PRIMARY KEY (user_id, timestamp) + ``` + + 上記の例では、`my_first_table` は4つのカラムを持つ MergeTree テーブルです: + + - `user_id`: 32ビットの符号なし整数 + - `message`: 他のデータベースシステムでの VARCHAR, BLOB, CLOB などに置き換わる String データ型 + - `timestamp`: 時間を表す DateTime 値 + - `metric`: 32ビットの浮動小数点数 + + :::note テーブルエンジン + テーブルエンジンは以下を決定します: + - データがどのように、どこに保存されるか + - どのクエリがサポートされるか + - データがレプリケーションされるかどうか + + 選択可能なエンジンは多数ありますが、単一ノードの ClickHouse サーバー上のシンプルなテーブルには [MergeTree](/ja/engines/table-engines/mergetree-family/mergetree.md) が一般的な選択です。 + ::: + + ### 主キーの簡単な紹介 + + 先に進む前に、ClickHouse における主キーの働きについて理解することが重要です(主キーの実装が予想外に思えるかもしれません!): + + - ClickHouse の主キーはテーブルの各行に対して**一意ではありません** + + ClickHouse テーブルの主キーはデータがディスクに書き込まれる際の並び順を決定します。8,192 行または 10MB のデータごとに(**インデックス粒度**として参照される)主キーインデックスファイルにエントリが作成されます。この粒度の概念により、**スパースインデックス**がメモリに簡単に適合し、粒度は `SELECT` クエリ処理時に処理される最小のカラムデータのストライプを表します。 + + 主キーは `PRIMARY KEY` パラメータを使用して定義できます。`PRIMARY KEY`を指定しないでテーブルを定義すると、キーは `ORDER BY` 句に指定されたタプルになります。`PRIMARY KEY` と `ORDER BY` の両方を指定した場合、主キーはソート順のサブセットでなければなりません。 + + 主キーはまたソートキーであり `(user_id, timestamp)` のタプルです。したがって、各カラムファイルに格納されるデータは `user_id`、次に `timestamp` の順にソートされます。 + +## 4: データを挿入 + +ClickHouse ではおなじみの `INSERT INTO TABLE` コマンドを使用できますが、`MergeTree` テーブルへの各挿入がストレージに**パート**を作成することを理解することが重要です。 + +:::tip ClickHouse ベストプラクティス +バッチごとに大量(数万または数百万)の行を挿入してください。心配いりません - ClickHouse はそうしたボリュームを容易に処理でき、それが [コスト削減](/docs/ja/cloud/bestpractices/bulkinserts.md) にも繋がります。 +::: + +1. 簡単な例であっても、複数の行を同時に挿入しましょう: + ```sql + INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) + ``` + + :::note + `timestamp` カラムがさまざまな **Date** および **DateTime** 関数を使用して埋められていることに注意してください。ClickHouse には多くの便利な関数があります。詳細は[**関数**セクション](/docs/ja/sql-reference/functions/index.md)を参照してください。 + ::: + +1. 挿入が成功したか確認しましょう: + ```sql + SELECT * FROM helloworld.my_first_table + ``` + 挿入された4つの行が表示されるはずです: + +## 5: ClickHouse クライアントを使用する + +コマンドラインツール **clickhouse client** を使用して ClickHouse Cloud サービスに接続することもできます。接続詳細はサービスの **Native** タブに記載されています: + + ![clickhouse client connection details](@site/docs/ja/images/quickstart/CloudClickhouseClientDetails.png) + +1. [ClickHouse](/docs/ja/integrations/clickhouse-client-local.md) をインストールします。 + +2. ホスト名、ユーザー名、パスワードを差し替えてコマンドを実行します: + ```bash + ./clickhouse client --host HOSTNAME.REGION.CSP.clickhouse.cloud \ + --secure --port 9440 \ + --user default \ + --password + ``` + スマイリーフェイスのプロンプトが表示されたら、クエリを実行する準備が整いました! + ```response + :) + ``` + +3. 次のクエリを実行してみましょう: + ```sql + SELECT * + FROM helloworld.my_first_table + ORDER BY timestamp + ``` + 応答が整ったテーブル形式で返ってくることに注目してください: + ```response + ┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ + │ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ + │ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ + │ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ + │ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ + └─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + + 4 rows in set. Elapsed: 0.008 sec. + ``` + +5. `FORMAT`句を追加してその一つを指定すべき [ClickHouse の多くのサポートされている出力形式](/ja/interfaces/formats/) のいずれかを指定してください: + ```sql + SELECT * + FROM helloworld.my_first_table + ORDER BY timestamp + FORMAT TabSeparated + ``` + 上記のクエリでは、出力はタブ区切りで返されます: + ```response + Query id: 3604df1c-acfd-4117-9c56-f86c69721121 + + 102 Insert a lot of rows per batch 2022-03-21 00:00:00 1.41421 + 102 Sort your data based on your commonly-used queries 2022-03-22 00:00:00 2.718 + 101 Hello, ClickHouse! 2022-03-22 14:04:09 -1 + 101 Granules are the smallest chunks of data read 2022-03-22 14:04:14 3.14159 + + 4 rows in set. Elapsed: 0.005 sec. + ``` + +6. `clickhouse client` を終了するには、**exit** コマンドを入力します: + ```bash + exit + ``` + +## 6: CSV ファイルを挿入する + +データベースを始める際に一般的なタスクは、既にファイルにあるデータを挿入することです。ユーザーID、訪問した URL、イベントのタイムスタンプを含むクリックストリームデータを表すサンプルデータをオンラインで提供しています。 + +`data.csv` という名前の CSV ファイルに次のテキストがあるとします: + + ```bash + 102,This is data in a file,2022-02-22 10:43:28,123.45 + 101,It is comma-separated,2022-02-23 00:00:00,456.78 + 103,Use FORMAT to specify the format,2022-02-21 10:43:30,678.90 + ``` + +1. 次のコマンドは `my_first_table` にデータを挿入します: + ```bash + ./clickhouse client --host HOSTNAME.REGION.CSP.clickhouse.cloud \ + --secure --port 9440 \ + --user default \ + --password \ + --query='INSERT INTO helloworld.my_first_table FORMAT CSV' < data.csv + ``` + +2. テーブルに新しい行が表示されることに注目してください: + + ![New rows from CSV file](@site/docs/ja/images/quickstart_04.png) + +## 次は何をすべきか? + +- [チュートリアル](/docs/ja/tutorial.md) では200万行のデータをテーブルに挿入し、分析クエリを書く体験を提供します +- [例データセット](/docs/ja/getting-started/index.md) のリストと、それらを挿入する手順があります +- [ClickHouse の始め方](https://clickhouse.com/company/events/getting-started-with-clickhouse/)に関する25分のビデオをご覧ください +- 外部ソースからデータを取得する場合、メッセージキュー、データベース、パイプラインなどとの接続方法についての[統合ガイドのコレクション](/docs/ja/integrations/index.mdx)を参照してください +- UI/BI 可視化ツールを使用している場合、[UI を ClickHouse に接続するためのユーザーガイド](/docs/ja/integrations/data-visualization.md) を参照してください +- 主キーに関するすべてのことを知るためには、[主キーに関するユーザーガイド](/docs/ja/guides/best-practices/sparse-primary-indexes.md)を参照してください diff --git a/docs/ja/get-started/query-endpoints.md b/docs/ja/get-started/query-endpoints.md new file mode 100644 index 00000000000..effcdf170f9 --- /dev/null +++ b/docs/ja/get-started/query-endpoints.md @@ -0,0 +1,500 @@ +--- +sidebar_title: クエリ API エンドポイント +slug: /ja/get-started/query-endpoints +description: 保存したクエリから簡単にREST APIエンドポイントを作成 +keywords: [api, query api endpoints, query endpoints, query rest api] +--- + +import BetaBadge from '@theme/badges/BetaBadge'; + +# クエリ API エンドポイント + + + +**クエリ API エンドポイント** 機能を使用すると、ClickHouse Cloud コンソール内の任意の保存した SQL クエリから直接 API エンドポイントを作成できます。ネイティブドライバを使ってClickHouse Cloudサービスに接続せずに、HTTP経由でAPIエンドポイントにアクセスして保存したクエリを実行することが可能になります。 + +## クイックスタートガイド + +始める前に、APIキーと管理コンソールのロールを確認してください。[APIキーを作成する](/docs/ja/cloud/manage/openapi)方法についてはこちらを参照してください。 + +### 保存されたクエリを作成 + +すでに保存されたクエリがある場合、このステップをスキップできます。 + +新しいクエリタブを開きます。デモンストレーションのために、約45億レコードを含む [youtube データセット](/docs/ja/getting-started/example-datasets/youtube-dislikes) を使用します。以下の例では、ユーザーが入力する `year` パラメーターに基づいて、ビデオあたりの平均視聴数によるトップ10のアップローダーを返します: + +```sql +with sum(view_count) as view_sum, + round(view_sum / num_uploads, 2) as per_upload +select + uploader, + count() as num_uploads, + formatReadableQuantity(view_sum) as total_views, + formatReadableQuantity(per_upload) as views_per_video +from + youtube +where + toYear(upload_date) = {year: UInt16} +group by uploader +order by per_upload desc +limit 10 +``` + +注意すべきは、このクエリはパラメーター(`year`)を含んでいることです。SQLコンソールのクエリエディタはClickHouseのクエリパラメーター式を自動的に検出し、各パラメーターの入力を提供します。このクエリが機能することを確認するために、速やかに実行してみましょう: + +![例クエリのテスト](@site/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png) + +次に、クエリを保存します: + +![例クエリの保存](@site/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png) + +保存されたクエリに関するさらに詳しいドキュメントは[こちら](/docs/ja/get-started/sql-console#saving-a-query)から確認できます。 + +### クエリ API エンドポイントの設定 + +クエリ API エンドポイントは、クエリビューから直接、**共有** ボタンをクリックし、`API Endpoint` を選択することで設定できます。どのAPIキーがエンドポイントにアクセス可能であるかを指定するようプロンプトが表示されます: + +![クエリエンドポイントの設定](@site/docs/ja/cloud/images/sqlconsole/endpoints-configure.png) + +APIキーを選択すると、クエリAPIエンドポイントが自動的に設定されます。テストリクエストを送信できるように例として `curl` コマンドが表示されます: + +![エンドポイントcurlコマンド](@site/docs/ja/cloud/images/sqlconsole/endpoints-completed.png) + +### クエリ API パラメーター + +クエリ内のパラメーターは `{parameter_name: type}` の構文で指定できます。これらのパラメーターは自動的に検出され、例のリクエストペイロードにはこれらのパラメーターを渡せる `queryVariables` オブジェクトが含まれます。 + +### テストと監視 + +クエリ API エンドポイントが作成されたら、`curl`や他のHTTPクライアントを使って機能することを確認できます: +エンドポイントcurlテスト + +最初のリクエストを送信すると、**共有** ボタンの右側に新しいボタンが直ちに表示されるはずです。これをクリックすると、クエリに関する監視データを含むフライアウトが開きます: + +![エンドポイント監視](@site/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png) + +## 実装の詳細 + +### 説明 + +このルートは、指定されたクエリエンドポイントでクエリを実行します。異なるバージョン、フォーマット、クエリ変数をサポートしています。応答はストリームとして送信 (_バージョン2のみ_) できるか、単一のペイロードとして返されます。 + +### 認証 + +- **必須**: はい +- **メソッド**: OpenAPIキー/シークレット経由の基本認証 +- **権限**: クエリエンドポイントに対する適切な権限を持つ + +### URL パラメーター + +- `queryEndpointId` (必須):実行するクエリエンドポイントの一意の識別子。 + +### クエリパラメーター + +#### V1 + +なし + +#### V2 + +- `format` (任意):応答のフォーマット。ClickHouseがサポートするすべてのフォーマットをサポート。 +- `param_:name` クエリ内で使用するクエリ変数。`name`はクエリ内の変数名に一致する必要があります。リクエストの本文がストリームの場合にのみ使用します。 +- `:clickhouse_setting` どの[ClickHouse設定](https://clickhouse.com/docs/ja/operations/settings/settings)でもクエリパラメーターとして渡すことが可能です。 + +### ヘッダー + +- `x-clickhouse-endpoint-version` (任意):クエリエンドポイントのバージョン。サポートされているバージョンは`1`と`2`です。提供されない場合、エンドポイントに対して最後に保存されたバージョンがデフォルトで使用されます。 +- `x-clickhouse-endpoint-upgrade` (任意):このヘッダーを設定して、エンドポイントバージョンをアップグレードします。このヘッダーは `x-clickhouse-endpoint-version` ヘッダーと連携します。 + +### リクエストボディ + +- `queryVariables` (任意):クエリ内で使用する変数を含むオブジェクト。 +- `format` (任意):応答のフォーマット。Query API エンドポイントがバージョン2の場合、ClickHouseがサポートする任意のフォーマットが可能。v1でサポートされるフォーマットは: + - TabSeparated + - TabSeparatedWithNames + - TabSeparatedWithNamesAndTypes + - JSON + - JSONEachRow + - CSV + - CSVWithNames + - CSVWithNamesAndTypes + +### 応答 + +- **200 OK**: クエリが正常に実行された。 +- **400 Bad Request**: リクエストが不正であった。 +- **401 Unauthorized**: 認証なしまたは権限が不十分でリクエストが行われた。 +- **404 Not Found**: 指定されたクエリエンドポイントが見つからなかった。 + +### エラーハンドリング + +- リクエストに有効な認証資格情報が含まれていることを確認してください。 +- `queryEndpointId` および `queryVariables` が正しいことを確認してください。 +- サーバーエラーを適切に処理し、適切なエラーメッセージを返します。 + +### エンドポイントバージョンのアップグレード + +エンドポイントバージョンを`v1`から`v2`にアップグレードするには、リクエストに `x-clickhouse-endpoint-upgrade` ヘッダーを含め、それを`1`に設定します。これによりアップグレードプロセスがトリガされ、`v2`で利用可能な機能や改善点を使用できるようになります。 + +## 例 + +### 基本的なリクエスト + +**クエリ API エンドポイント SQL:** + +```sql +SELECT database, name as num_tables FROM system.tables limit 3; +``` + +#### バージョン 1 + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run' \ +--user '' \ +-H 'Content-Type: application/json' \ +-d '{ "format": "JSONEachRow" }' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + format: "JSONEachRow", + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```json +{ + "data": { + "columns": [ + { + "name": "database", + "type": "String" + }, + { + "name": "num_tables", + "type": "String" + } + ], + "rows": [ + ["INFORMATION_SCHEMA", "COLUMNS"], + ["INFORMATION_SCHEMA", "KEY_COLUMN_USAGE"], + ["INFORMATION_SCHEMA", "REFERENTIAL_CONSTRAINTS"] + ] + } +} +``` + +#### バージョン 2 + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```application/x-ndjson +{"database":"INFORMATION_SCHEMA","num_tables":"COLUMNS"} +{"database":"INFORMATION_SCHEMA","num_tables":"KEY_COLUMN_USAGE"} +{"database":"INFORMATION_SCHEMA","num_tables":"REFERENTIAL_CONSTRAINTS"} +``` + +### クエリ変数を使用したリクエストおよびJSONCompactEachRowフォーマットのバージョン2 + +**クエリ API エンドポイント SQL:** + +```sql +SELECT name, database FROM system.tables WHERE match(name, {tableNameRegex: String}) AND database = {database: String}; +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONCompactEachRow' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +-d '{ "queryVariables": { "tableNameRegex": "query.*", "database": "system" } }' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONCompactEachRow", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + body: JSON.stringify({ + queryVariables: { + tableNameRegex: "query.*", + database: "system", + }, + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```application/x-ndjson +["query_cache", "system"] +["query_log", "system"] +["query_views_log", "system"] +``` + +### テーブルにデータを挿入するクエリ変数内で配列を使用したリクエスト + +**テーブル SQL:** + +```SQL +CREATE TABLE default.t_arr +( + `arr` Array(Array(Array(UInt32))) +) +ENGINE = MergeTree +ORDER BY tuple() +``` + +**クエリ API エンドポイント SQL:** + +```sql + INSERT INTO default.t_arr VALUES ({arr: Array(Array(Array(UInt32)))}); +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +-d '{ + "queryVariables": { + "arr": [[[12, 13, 0, 1], [12]]] + } +}' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + body: JSON.stringify({ + queryVariables: { + arr: [[[12, 13, 0, 1], [12]]], + }, + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```text +OK +``` + +### max_threads を8にセットしたClickHouse設定を使ったリクエスト + +**クエリ API エンドポイント SQL:** + +```sql +SELECT * from system.tables; +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?max_threads=8,' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?max_threads=8", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +### ストリームとしての応答をリクエストおよび解析 + +**クエリ API エンドポイント SQL:** + +```sql +SELECT name, database from system.tables; +``` + +**Typescript:** + +```typescript +async function fetchAndLogChunks( + url: string, + openApiKeyId: string, + openApiKeySecret: string +) { + const auth = Buffer.from(`${openApiKeyId}:${openApiKeySecret}`).toString( + "base64" + ); + + const headers = { + Authorization: `Basic ${auth}`, + "x-clickhouse-endpoint-version": "2", + }; + + const response = await fetch(url, { + headers, + method: "POST", + body: JSON.stringify({ format: "JSONEachRow" }), + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return; + } + + const reader = response.body as unknown as Readable; + reader.on("data", (chunk) => { + console.log(chunk.toString()); + }); + + reader.on("end", () => { + console.log("Stream ended."); + }); + + reader.on("error", (err) => { + console.error("Stream error:", err); + }); +} + +const endpointUrl = + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow"; +const openApiKeyId = ""; +const openApiKeySecret = ""; +// Usage example +fetchAndLogChunks(endpointUrl, openApiKeyId, openApiKeySecret).catch((err) => + console.error(err) +); +``` + +**出力** + +```shell +> npx tsx index.ts +> {"name":"COLUMNS","database":"INFORMATION_SCHEMA"} +> {"name":"KEY_COLUMN_USAGE","database":"INFORMATION_SCHEMA"} +... +> Stream ended. +``` + +### ファイルからテーブルにストリームを挿入 + +以下のコンテンツで、ファイル ./samples/my_first_table_2024-07-11.csv を作成します: + +```csv +"user_id","json","name" +"1","{""name"":""John"",""age"":30}","John" +"2","{""name"":""Jane"",""age"":25}","Jane" +``` + +**テーブル作成 SQL:** + +```sql +create table default.my_first_table +( + user_id String, + json String, + name String, +) ENGINE = MergeTree() +ORDER BY user_id; +``` + +**クエリ API エンドポイント SQL:** + +```sql +INSERT INTO default.my_first_table +``` + +**cURL:** + +```bash +cat ./samples/my_first_table_2024-07-11.csv | curl --user '' \ + -X POST \ + -H 'Content-Type: application/octet-stream' \ + -H 'x-clickhouse-endpoint-version: 2' \ + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=CSV" \ + --data-binary @- +``` diff --git a/docs/ja/get-started/query-insights.md b/docs/ja/get-started/query-insights.md new file mode 100644 index 00000000000..bda1f39bba8 --- /dev/null +++ b/docs/ja/get-started/query-insights.md @@ -0,0 +1,47 @@ +--- +sidebar_title: クエリインサイト +slug: /ja/get-started/query-insights +description: system.query_logデータを視覚化してクエリのデバッグとパフォーマンス最適化を簡素化 +keywords: [クエリインサイト, クエリログ, クエリログUI, system.query_logインサイト] +--- + +# クエリインサイト + +**クエリインサイト**機能は、さまざまな視覚化とテーブルを通じてClickHouseの組み込みクエリログをより使いやすくします。ClickHouseの`system.query_log`テーブルは、クエリの最適化、デバッグ、クラスター全体の健康状態とパフォーマンスを監視するための重要な情報源です。 + +## クエリ概要 + +サービスを選択すると、左サイドバーの**モニタリング**ナビゲーション項目が展開され、新たに**クエリインサイト**のサブ項目が表示されます。このオプションをクリックすると、新しいクエリインサイトページが開きます: + +![クエリインサイトUI概要](@site/docs/ja/cloud/images/sqlconsole/insights_overview.png) + +## トップレベルメトリクス + +上部の統計ボックスは、選択された期間内の基本的なトップレベルクエリメトリクスを表しています。その下には、クエリの種類(select、insert、その他)ごとに分解されたクエリボリューム、レイテンシ、エラー率を示す3つの時系列チャートがあります。レイテンシチャートは、p50、p90、およびp99レイテンシを表示するようにさらに調整できます: + +![クエリインサイトUIレイテンシチャート](@site/docs/ja/cloud/images/sqlconsole/insights_latency.png) + +## 最近のクエリ + +トップレベルメトリクスの下には、指定された期間内にノーマライズされたクエリハッシュとユーザーでグループ化されたクエリログエントリが表示されるテーブルがあります: + +![クエリインサイトUI最近のクエリテーブル](@site/docs/ja/cloud/images/sqlconsole/insights_recent.png) + +最近のクエリは、利用可能なフィールドでフィルターおよびソートすることができます。また、テーブルは、テーブル、p90、およびp99レイテンシなどの追加フィールドを表示または非表示にするように構成することができます。 + +## クエリ詳細表示 + +最近のクエリテーブルからクエリを選択すると、選択されたクエリに特有のメトリクスと情報を含むフライアウトが開きます: + +![クエリインサイトUIクエリ詳細表示](@site/docs/ja/cloud/images/sqlconsole/insights_drilldown.png) + +このフライアウトからわかるように、この特定のクエリは過去24時間で3000回以上実行されています。**クエリ情報**タブのすべてのメトリクスは集計されたメトリクスですが、**クエリ履歴**タブを選択することで個々の実行からのメトリクスも表示できます: + +クエリインサイトUIクエリ情報 + +
+ +このペインから、各クエリ実行の`設定`および`プロファイルイベント`項目を展開して、追加情報を表示できます。 diff --git a/docs/ja/get-started/sql-console.md b/docs/ja/get-started/sql-console.md new file mode 100644 index 00000000000..bd87dfdb487 --- /dev/null +++ b/docs/ja/get-started/sql-console.md @@ -0,0 +1,290 @@ +--- +sidebar_title: SQLコンソール +slug: /ja/get-started/sql-console +description: SQLコンソールを使用してクエリを実行し、ビジュアライゼーションを作成します。 +keywords: [sqlコンソール, sqlクライアント, クラウドコンソール, コンソール] +--- +# SQLコンソール + +SQLコンソールは、ClickHouse Cloudでデータベースを探索しクエリを実行するための最速かつ最も簡単な方法です。SQLコンソールを使用して以下のことが可能です: +- ClickHouse Cloudサービスに接続 +- テーブルデータの表示、フィルタリング、並べ替え +- クエリを実行し、数クリックで結果データを可視化 +- チームメンバーとクエリを共有し、より効果的にコラボレーション + +## コントロールプレーンからSQLコンソールを開く + +SQLコンソールはサービス概要画面から直接開くことができます。「接続」ボタンをクリックし、「SQLコンソールを開く」を選択します。 + + ![サービスからSQLコンソールを開く](@site/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png) + +SQLコンソールは新しいタブで開き、サービス認証情報の入力を求められます: + + ![認証情報を入力](@site/docs/ja/cloud/images/sqlconsole/enter-credentials.png) + +認証情報を入力後、「接続」をクリックすると、SQLコンソールが接続と認証を試みます。成功すると、SQLコンソールのインターフェースが表示されます: + + ![認証成功](@site/docs/ja/cloud/images/sqlconsole/authentication-success.png) + +## 直接SQLコンソールを読み込む + +SQLコンソールは https://console.clickhouse.cloud から直接開くこともできます。ClickHouse Cloudアカウントにログインすると、サービス一覧が表示されます。1つ選択し、サービス認証画面でサービス認証情報を入力します: + + ![サービスを選択](@site/docs/ja/cloud/images/sqlconsole/select-a-service.png) + +:::note +組織内に1つのサービスしか存在しない場合、SQLコンソールは直ちにサービス認証画面へ移動します。 +::: + +## サービススイッチャーを使用する + +SQLコンソールから直接他のサービスに簡単に切り替えることができます。コンソールの右上隅にあるサービススイッチャーを開き、別のサービスを選択します: + + ![サービスを切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-services.png) + +### テーブルを探索する + +### テーブルリストとスキーマ情報の表示 + +ClickHouseインスタンスに含まれるテーブルの概要は左のサイドバーにあります。左バーの上部にあるデータベースセレクターを使用して、特定のデータベース内のテーブルを表示します + + ![テーブルリストとスキーマ](@site/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png) + +リストのテーブルは展開してカラムとタイプを表示することもできます + + ![カラムを表示](@site/docs/ja/cloud/images/sqlconsole/view-columns.png) + +### テーブルデータを探索する + +リストのテーブルをクリックすると、新しいタブで開きます。テーブルビューでは、データを簡単に表示、選択、コピーできます。Microsoft ExcelやGoogle Sheetsなどのスプレッドシートアプリケーションにコピー貼り付けする際に、構造やフォーマットが保持されます。フッターのナビゲーションを使用して、テーブルデータのページを(30行ごとのページネーションで)切り替えることができます。 + + ![abc](@site/docs/ja/cloud/images/sqlconsole/abc.png) + +### セルデータの検査 + +セルインスペクターツールを使用して、単一のセルに含まれる大量のデータを表示できます。セルを右クリックし、「セルを検査」を選択して開きます。インスペクターの内容は、右上隅のコピーアイコンをクリックしてコピーできます。 + + ![セル内容の検査](@site/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png) + +## テーブルのフィルタリングと並べ替え + +### テーブルの並べ替え + +SQLコンソールでテーブルを並べ替えるには、テーブルを開いてツールバーの「並べ替え」ボタンを選択します。このボタンは、並べ替えを設定するためのメニューを開きます。どのカラムで並べ替えるかを選択し、並べ替えの順序(昇順または降順)を設定できます。「適用」を選択するか、Enterキーを押してテーブルを並べ替えます。 + + ![カラムで降順に並べ替える](@site/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png) + +SQLコンソールでは、複数の並べ替えをテーブルに追加することもできます。「並べ替え」ボタンを再度クリックして、別の並べ替えを追加します。注意:並べ替えは、並べ替えペインで表示される順序(上から下)で適用されます。並べ替えを削除するには、並べ替えの隣にある「x」ボタンをクリックします。 + +### テーブルのフィルタリング + +SQLコンソールでテーブルをフィルタリングするには、テーブルを開いて「フィルター」ボタンを選択します。並べ替えと同様に、このボタンはフィルターを設定するためのメニューを開きます。どのカラムでフィルタリングするかを選択し、必要な条件を設定します。SQLコンソールは、カラムに含まれるデータのタイプに対応するフィルターオプションをインテリジェントに表示します。 + + ![GSMに等しいラジオカラムでフィルタリング](@site/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png) + +フィルターに満足したら、「適用」を選択してデータをフィルタリングします。以下のように追加のフィルターも追加できます。 + + ![2000より大きい範囲にフィルターを追加](@site/docs/ja/cloud/images/sqlconsole/add-more-filters.png) + +並べ替え機能と同様に、フィルターの隣にある「x」ボタンをクリックして、フィルターを削除します。 + +### フィルタリングと並べ替えを同時に行う + +SQLコンソールでは、テーブルをフィルタリングと並べ替えを同時に行うことができます。上記の手順を使用して、すべての必要なフィルターと並べ替えを追加し、「適用」ボタンをクリックします。 + + ![フィルタリングと並べ替えを同時に行う](@site/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png) + +### フィルターと並べ替えからクエリを作成する + +SQLコンソールは、並べ替えとフィルターをクリック1つで直接クエリに変換することができます。ツールバーから並べ替えとフィルターパラメータを選んで「クエリを作成」ボタンを選択します。「クエリを作成」をクリックすると、新しいクエリタブが開き、テーブルビューに含まれるデータに対応するSQLコマンドが事前入力されます。 + + ![並べ替えとフィルターからクエリを作成する](@site/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png) + +:::note +「クエリを作成」機能を使用する際に、フィルターと並べ替えは必須ではありません。 +::: + +クエリの詳細については、(link) クエリドキュメンテーションを参照してください。 + +## クエリの作成と実行 + +### クエリの作成 + +SQLコンソールで新しいクエリを作成する方法は2つあります。 +* タブバーの「+」ボタンをクリックする +* 左サイドバーのクエリリストから「新しいクエリ」ボタンを選択する + + ![クエリの作成](@site/docs/ja/cloud/images/sqlconsole/creating-a-query.png) + +### クエリの実行 + +クエリを実行するには、SQLエディタにSQLコマンドを入力して「実行」ボタンをクリックするか、ショートカット `cmd / ctrl + enter` を使用します。複数のコマンドを順次書き、実行するには、各コマンドの後にセミコロンを追加する必要があります。 + +クエリ実行オプション +デフォルトでは、「実行」ボタンをクリックするとSQLエディタに含まれるすべてのコマンドが実行されます。SQLコンソールは他に2つのクエリ実行オプションをサポートしています: +* 選択したコマンドを実行 +* カーソル位置のコマンドを実行 + +選択したコマンドを実行するには、目的のコマンドまたはコマンドシーケンスをハイライトし、「実行」ボタンをクリックする(または `cmd / ctrl + enter` ショートカットを使用する)。選択が存在する場合、SQLエディタのコンテキストメニュー(エディタ内の任意の場所を右クリックして開く)から「選択したものを実行」を選択することもできます。 + + ![選択したクエリを実行](@site/docs/ja/cloud/images/sqlconsole/run-selected-query.png) + +現在のカーソル位置のコマンドを実行するには、以下の2つの方法があります: +* 拡張実行オプションメニューから「カーソルで」を選択する(または対応する `cmd / ctrl + shift + enter` キーボードショートカットを使用する + + ![カーソルでの実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png) + + * SQLエディタのコンテキストメニューから「カーソルで実行」を選択する + + ![カーソルでの実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor.png) + +:::note +カーソル位置にあるコマンドは、実行時に黄色で点滅します。 +::: + +### クエリのキャンセル + +クエリを実行中に、クエリエディタのツールバーの「実行」ボタンが「キャンセル」ボタンに置き換わります。このボタンをクリックするか、`Esc` を押してクエリをキャンセルします。注意:キャンセル後もすでに返された結果は保持されます。 + + ![クエリをキャンセル](@site/docs/ja/cloud/images/sqlconsole/cancel-a-query.png) + +### クエリの保存 + +クエリを保存することで、後から簡単に見つけたり、チームメンバーと共有したりすることができます。SQLコンソールではクエリをフォルダに整理することもできます。 + +クエリを保存するには、ツールバーの「実行」ボタンの右にある「保存」ボタンをクリックし、目的の名前を入力して「クエリを保存」をクリックします。 + +:::note +ショートカット `cmd / ctrl + s` を使用することでも、現在のクエリタブでの作業は保存されます。 +::: + +![クエリを保存](../images/sql-console-save-query.png) + +また、「無題のクエリ」をクリックして名前を設定し、Enterキーを押すことで、クエリの同時命名と保存を行うこともできます: + +![クエリをリネーム](../images/sql-console-rename.png) + +### クエリの共有 + +SQLコンソールは、クエリをチームメンバーと簡単に共有することができます。SQLコンソールは4つのアクセスレベルをサポートしており、これらはグローバルにも個別のユーザーごとにも調整可能です: + +- 所有者(共有オプションを調整可能) +- 書き込みアクセス +- 読み取り専用アクセス +- アクセスなし + +クエリを保存した後、ツールバーの「共有」ボタンをクリックします。共有オプションが表示されるモーダルが表示されます: + +![クエリを共有](../images/sql-console-share.png) + +サービスにアクセス可能なすべての組織メンバーのクエリアクセスを調整するには、トップラインのアクセスレベルセレクタを調整します: + +![アクセスを編集](../images/sql-console-edit-access.png) + +上記を適用すると、SQLコンソールへのアクセスを持つすべてのチームメンバーはクエリを表示(および実行)できるようになります。 + +特定のメンバーのクエリアクセスを調整するには、「チームメンバーを追加」セレクターから目的のチームメンバーを選択します: + +![チームメンバーを追加](../images/sql-console-add-team.png) + +チームメンバーを選択すると、アクセスレベルセレクターが表示された新しいラインアイテムが出現します: + +![チームメンバーのアクセスを編集](../images/sql-console-edit-member.png) + +### 共有されたクエリにアクセスする + +クエリが共有された場合、それはSQLコンソール左サイドバーの「クエリ」タブに表示されます: + +![クエリにアクセス](../images/sql-console-access-queries.png) + +### クエリへのリンク(パーマリンク) + +保存されたクエリはパーマリンクされており、共有されたクエリへのリンクを送信および受信し、直接開くことができます。 + +クエリにある可能性がある任意のパラメーターの値は、保存されたクエリURLにクエリパラメータとして自動的に追加されます。たとえば、クエリに `{start_date: Date}` と `{end_date: Date}` パラメーターが含まれる場合、パーマリンクは次のようになります:`https://console.clickhouse.cloud/services/:serviceId/console/query/:queryId?param_start_date=2015-01-01¶m_end_date=2016-01-01`。 + +## 高度なクエリ機能 + +### クエリ結果を検索する + +クエリが実行された後、結果ペインの検索入力を使用して返された結果セットを素早く検索できます。この機能は、追加の `WHERE` 句の結果をプレビューしたり、特定のデータが結果セットに含まれていることを確認したりするのに役立ちます。検索入力に値を入力した後、結果ペインが更新され、入力した値に一致するエントリを含むレコードが返されます。この例では、ClickHouseリポジトリの `github_events` テーブルで `alexey-milovidov` のすべてのインスタンスを探します: + + ![GitHubデータを検索](@site/docs/ja/cloud/images/sqlconsole/search-github.png) + +注意:入力した値に一致するフィールドはすべて返されます。たとえば、上記のスクリーンショットの3番目のレコードは、`actor_login` フィールドで「alexey-milovidov」と一致しませんが、`body` フィールドで一致します: + + ![ボディでの一致](@site/docs/ja/cloud/images/sqlconsole/match-in-body.png) + +### ページネーション設定の調整 + +デフォルトでは、クエリ結果ペインはすべての結果レコードを単一のページに表示します。より大きな結果セットのためには、結果をページネーションで表示する方が見やすい場合があります。これは、結果ペインの右下隅にあるページネーションセレクターを使用することで可能です: + ![ページネーションオプション](@site/docs/ja/cloud/images/sqlconsole/pagination.png) + +ページサイズを選択すると、すぐに結果セットにページネーションが適用され、ナビゲーションオプションが結果ペインフッターの中央に表示されます。 + + ![ページネーションナビゲーション](@site/docs/ja/cloud/images/sqlconsole/pagination-nav.png) + +### クエリ結果データのエクスポート + +クエリ結果セットは、SQLコンソールから直接CSV形式で簡単にエクスポートできます。そのためには、結果ペインツールバーの右側にある `•••` メニューを開き、「CSVとしてダウンロード」を選択します。 + + ![CSVとしてダウンロード](@site/docs/ja/cloud/images/sqlconsole/download-as-csv.png) + +## クエリデータのビジュアライゼーション + +データは、チャート形式で表示するとより容易に解釈できることがあります。SQLコンソールからクエリ結果データを使用してビジュアライゼーションを数クリックで迅速に作成できます。例として、NYCタクシーの週ごとの統計を計算するクエリを使用します: + +```sql +select + toStartOfWeek(pickup_datetime) as week, + sum(total_amount) as fare_total, + sum(trip_distance) as distance_total, + count(*) as trip_total +from + nyc_taxi +group by + 1 +order by + 1 asc +``` + + ![タブ形式のクエリ結果](@site/docs/ja/cloud/images/sqlconsole/tabular-query-results.png) + +ビジュアライゼーションがないと、これらの結果は解釈が難しいです。それらをチャートに変換しましょう。 + +### チャートの作成 + +ビジュアライゼーションの作成を開始するには、クエリ結果ペインツールバーから「チャート」オプションを選択します。チャート設定ペインが表示されます: + + ![クエリからチャートに切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png) + +まず、`week` で `trip_total` を追跡する単純な棒グラフを作成します。これを達成するために、`week` フィールドをx軸に、`trip_total` フィールドをy軸にドラッグします: + + ![週ごとのトリップ総数](@site/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png) + +ほとんどのチャートタイプは、数値軸に複数のフィールドをサポートしています。実演のために、`fare_total` フィールドをy軸にドラッグします: + + ![棒グラフ](@site/docs/ja/cloud/images/sqlconsole/bar-chart.png) + +### チャートのカスタマイズ + +SQLコンソールは10種類のチャートタイプをサポートしており、チャート設定ペインのチャートタイプセレクターから選択できます。たとえば、前述の棒グラフからエリアチャートに簡単にタイプを変更できます: + + ![棒グラフからエリアに変更](@site/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png) + +チャートのタイトルは、データを供給するクエリの名前に一致します。クエリの名前を更新すると、チャートのタイトルも更新されます: + + ![クエリ名の更新](@site/docs/ja/cloud/images/sqlconsole/update-query-name.png) + +より高度なチャートの特性を、チャート設定ペインの「高度な設定」セクションで調整することもできます。まず、次の設定を調整します: +- サブタイトル +- 軸タイトル +- x軸のラベルの向き + +これにより、チャートが以下のように更新されます: + + ![サブタイトルなどの更新](@site/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png) + +いくつかのシナリオでは、各フィールドの軸スケールを独立して調整する必要があるかもしれません。これは、チャート設定ペインの「高度な設定」セクションで軸範囲の最小値と最大値を指定することでも可能です。たとえば、上記のチャートは見栄えが良いですが、`trip_total` と `fare_total` フィールドの相関関係を示すために、軸範囲の調整が必要です: + + ![軸スケールを調整](@site/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png) diff --git a/docs/ja/getting-started/_category_.yml b/docs/ja/getting-started/_category_.yml new file mode 100644 index 00000000000..f50d681b7ed --- /dev/null +++ b/docs/ja/getting-started/_category_.yml @@ -0,0 +1,8 @@ +position: 1 +label: 'Getting Started' +collapsible: true +collapsed: true +link: + type: generated-index + title: Getting Started + slug: /ja/getting-started diff --git a/docs/ja/getting-started/example-datasets/amazon-reviews.md b/docs/ja/getting-started/example-datasets/amazon-reviews.md new file mode 100644 index 00000000000..b08d44e49c1 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/amazon-reviews.md @@ -0,0 +1,434 @@ +--- +slug: /ja/getting-started/example-datasets/amazon-reviews +sidebar_label: Amazonカスタマーレビュー +--- + +# Amazonカスタマーレビューのデータセット + +このデータセットには、Amazon製品の150M以上のカスタマーレビューが含まれています。データはAWS S3のsnappy圧縮Parquetファイル形式で、合計49GBのサイズ(圧縮済み)です。これをClickHouseに挿入する手順を見ていきましょう。 + +:::note +以下のクエリは、[ClickHouse Cloud](https://clickhouse.cloud) の**本番**インスタンスで実行されました。 +::: + +1. ClickHouseにデータを挿入することなく、その場でクエリを実行できます。例として、一部の行を取得して、その内容を確認しましょう: + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet') +LIMIT 10 +``` + +行の内容は次のようになります: + +```response +┌─review_date─┬─marketplace─┬─customer_id─┬─review_id──────┬─product_id─┬─product_parent─┬─product_title────────────────────────────────────────────────┬─product_category───────┬─star_rating─┬─helpful_votes─┬─total_votes─┬─vine──┬─verified_purchase─┬─review_headline─────────────────────────────────────────────────────────────┬─review_body────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 16452 │ US │ 21080196 │ R17NMVYCQXEEFW │ B00RSI5DJA │ 904397429 │ Pilot │ Digital_Video_Download │ 5 │ 0 │ 0 │ false │ false │ yes indeed │ OMG- i totally see myself get hook on that show if it happen- love it │ +│ 16452 │ US │ 44158214 │ R3MAPJVO9D0ERG │ B00RSI61PU │ 475013967 │ Salem Rogers: Model of the Year 1998 │ Digital_Video_Download │ 5 │ 0 │ 0 │ false │ false │ Halarious show!! │ Loved this pilot episode!! Please pick this up Amazon!!! │ +│ 16452 │ US │ 1944630 │ R1Q5YPRE84OVB6 │ B009IU6BIS │ 101502671 │ National Lampoon's Christmas Vacation │ Digital_Video_Download │ 5 │ 0 │ 0 │ false │ false │ Classic! │ This is a holiday classic. How can you not love it! │ +│ 16452 │ US │ 49029010 │ RGDK35TBJJ2ZI │ B00RSI68V2 │ 639602030 │ Table 58 │ Digital_Video_Download │ 5 │ 2 │ 3 │ false │ false │ Fun for the whole family!! │ This show is fun! Our family really enjoyed watching the show. I can see this being one of the shows that we watch on Friday nights with our pizza and ice cream. I hope to see more of the show and the great cast of characters. │ +│ 16452 │ US │ 52257958 │ R1R2SEOJT8M14Y │ B00RSGIMUE │ 196368495 │ Niko and the Sword of Light │ Digital_Video_Download │ 5 │ 1 │ 2 │ false │ false │ it's a new kind of avatar. great show. make more. │ My 7 year old son and my husband both loved it! It's like avatar the last air bender but with different magical powers. The characters are adorably well developed. The story is interesting. We hope amazon makes the whole season. We can't wait to see more! │ +│ 16452 │ US │ 26927978 │ RN0JCPQ6Z4FUB │ B009ITL7UG │ 497741324 │ Lord of the Rings: The Return of the King (Extended Edition) │ Digital_Video_Download │ 5 │ 0 │ 0 │ false │ true │ Definite must-own for any Tolkien buff who has not yet upgraded to Blu-Ray! │ If you liked the theatrical release and are a fan of Middle-Earth then you should get this. │ +│ 16452 │ US │ 19626887 │ R15LDVOU1S1DFB │ B00RSGHGB0 │ 576999592 │ Just Add Magic - Season 1 │ Digital_Video_Download │ 5 │ 1 │ 1 │ false │ false │ Great story! So good even my teenage boys said ... │ Great story! So good even my teenage boys said this is actually pretty good!!! Can't wait for the next episode. │ +│ 16452 │ US │ 1439383 │ R2DJVLZM1MVFQH │ B002WEQJ3E │ 733651019 │ Six: The Mark Unleashed │ Digital_Video_Download │ 1 │ 0 │ 4 │ false │ false │ I am now less intelligent for having watched an entire 10 minutes of it │ I am now less intelligent for having watched an entire 10 minutes of it. God save my sole as I now must kick out the chair from which I am standing on so that the noose may do its job. Watch the movie at your own risk. The screen will suck your brain cells out of your body. │ +│ 16452 │ US │ 46233181 │ R33W2NB9MCRUFV │ B00RSGFYQE │ 464741068 │ Point of Honor │ Digital_Video_Download │ 4 │ 0 │ 0 │ false │ false │ Give it a chance. │ Pilots are just what they are...pilots. A chance to see what works and what doesn't and a chance to smooth out the wrinkles. Point of Honor at least stands a fair chance. │ +│ 16452 │ US │ 19537300 │ R2WGJYESHID0ZF │ B00RSGHQJM │ 374287214 │ Down Dog │ Digital_Video_Download │ 5 │ 1 │ 1 │ false │ false │ Five Stars │ great fun │ +└─────────────┴─────────────┴─────────────┴────────────────┴────────────┴────────────────┴──────────────────────────────────────────────────────────────┴────────────────────────┴─────────────┴───────────────┴─────────────┴───────┴───────────────────┴─────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +2. このデータをClickHouseに保存するために、新しい`MergeTree`テーブル`amazon_reviews`を定義します: + +```sql +CREATE TABLE amazon_reviews +( + review_date Date, + marketplace LowCardinality(String), + customer_id UInt64, + review_id String, + product_id String, + product_parent UInt64, + product_title String, + product_category LowCardinality(String), + star_rating UInt8, + helpful_votes UInt32, + total_votes UInt32, + vine Bool, + verified_purchase Bool, + review_headline String, + review_body String +) +ENGINE = MergeTree +ORDER BY (review_date, product_category); +``` + +3. 次の`INSERT`コマンドは`s3Cluster`テーブル関数を使用して、クラスターのすべてのノードを用いて複数のS3ファイルを並行処理します。また、`https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet`という名前で始まる任意のファイルを挿入するためにワイルドカードを使用します: + +```sql +INSERT INTO amazon_reviews +SELECT + * +FROM s3Cluster( + 'default', + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet' + ); +``` + +:::tip +ClickHouse Cloudでは、クラスターの名前は`default`です。クラスターの名前を変更するか、クラスターを持っていない場合は`s3Cluster`の代わりに`s3`テーブル関数を使用してください。 +::: + +5. このクエリの実行時間は短く、平均で約300,000行/秒です。約5分以内にすべての行が挿入されるのを確認できます: + +```sql +SELECT formatReadableQuantity(count()) +FROM amazon_reviews; +``` + +```response +┌─formatReadableQuantity(count())─┐ +│ 150.96 million │ +└─────────────────────────────────┘ + +1 row in set. Elapsed: 0.005 sec. +``` + +6. データ使用量を確認してみましょう: + +```sql +SELECT + disk_name, + formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed, + formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed, + round(usize / size, 2) AS compr_rate, + sum(rows) AS rows, + count() AS part_count +FROM system.parts +WHERE (active = 1) AND (table = 'amazon_reviews') +GROUP BY disk_name +ORDER BY size DESC; +``` +元のデータは約70Gですが、ClickHouseで圧縮されると約30Gに圧縮されます: + +```response +┌─disk_name─┬─compressed─┬─uncompressed─┬─compr_rate─┬──────rows─┬─part_count─┐ +│ s3disk │ 30.05 GiB │ 70.47 GiB │ 2.35 │ 150957260 │ 14 │ +└───────────┴────────────┴──────────────┴────────────┴───────────┴────────────┘ +``` + +7. いくつかのクエリを実行してみましょう...以下は、データセット内で最も役立つレビューTOP10です: + +```sql +SELECT + product_title, + review_headline +FROM amazon_reviews +ORDER BY helpful_votes DESC +LIMIT 10; +``` + +クエリは151Mの行すべてを処理する必要がありますが、1秒未満で終了します! + +```response +┌─product_title────────────────────────────────────────────────────────────────────────────┬─review_headline───────────────────────────────────────────────────────┐ +│ Kindle: Amazon's Original Wireless Reading Device (1st generation) │ Why and how the Kindle changes everything │ +│ BIC Cristal For Her Ball Pen, 1.0mm, Black, 16ct (MSLP16-Blk) │ FINALLY! │ +│ The Mountain Kids 100% Cotton Three Wolf Moon T-Shirt │ Dual Function Design │ +│ Kindle Keyboard 3G, Free 3G + Wi-Fi, 6" E Ink Display │ Kindle vs. Nook (updated) │ +│ Kindle Fire HD 7", Dolby Audio, Dual-Band Wi-Fi │ You Get What You Pay For │ +│ Kindle Fire (Previous Generation - 1st) │ A great device WHEN you consider price and function, with a few flaws │ +│ Fifty Shades of Grey: Book One of the Fifty Shades Trilogy (Fifty Shades of Grey Series) │ Did a teenager write this??? │ +│ Wheelmate Laptop Steering Wheel Desk │ Perfect for an Starfleet Helmsman │ +│ Kindle Wireless Reading Device (6" Display, U.S. Wireless) │ BEWARE of the SIGNIFICANT DIFFERENCES between Kindle 1 and Kindle 2! │ +│ Tuscan Dairy Whole Vitamin D Milk, Gallon, 128 oz │ Make this your only stock and store │ +└──────────────────────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.897 sec. Processed 150.96 million rows, 15.36 GB (168.36 million rows/s., 17.13 GB/s.) +``` + +8. Amazonでレビュー数が最も多い商品TOP10は次のとおりです: + +```sql +SELECT + any(product_title), + count() +FROM amazon_reviews +GROUP BY product_id +ORDER BY 2 DESC +LIMIT 10; +``` + +```response +┌─any(product_title)────────────────────────────┬─count()─┐ +│ Candy Crush Saga │ 50051 │ +│ The Secret Society® - Hidden Mystery │ 41255 │ +│ Google Chromecast HDMI Streaming Media Player │ 35977 │ +│ Minecraft │ 35129 │ +│ Bosch Season 1 │ 33610 │ +│ Gone Girl: A Novel │ 33240 │ +│ Subway Surfers │ 32328 │ +│ The Fault in Our Stars │ 30149 │ +│ Amazon.com eGift Cards │ 28879 │ +│ Crossy Road │ 28111 │ +└───────────────────────────────────────────────┴─────────┘ + +10 rows in set. Elapsed: 20.059 sec. Processed 150.96 million rows, 12.78 GB (7.53 million rows/s., 637.25 MB/s.) +``` + +9. 各商品の月ごとの平均レビュー評価は以下の通りです(実際の[Amazonの就職面接](https://datalemur.com/questions/sql-avg-review-ratings)問題): + +```sql +SELECT + toStartOfMonth(review_date) AS month, + any(product_title), + avg(star_rating) AS avg_stars +FROM amazon_reviews +GROUP BY + month, + product_id +ORDER BY + month DESC, + product_id ASC +LIMIT 20; +``` + +各商品の月別平均を計算し、結果として20行だけを取得: + +```response +┌──────month─┬─any(product_title)──────────────────────────────────────────────────────────────────────┬─avg_stars─┐ +│ 2015-08-01 │ Mystiqueshapes Girls Ballet Tutu Neon Lime Green │ 4 │ +│ 2015-08-01 │ Adult Ballet Tutu Yellow │ 5 │ +│ 2015-08-01 │ The Way Things Work: An Illustrated Encyclopedia of Technology │ 5 │ +│ 2015-08-01 │ Hilda Boswell's Treasury of Poetry │ 5 │ +│ 2015-08-01 │ Treasury of Poetry │ 5 │ +│ 2015-08-01 │ Uncle Remus Stories │ 5 │ +│ 2015-08-01 │ The Book of Daniel │ 5 │ +│ 2015-08-01 │ Berenstains' B Book │ 5 │ +│ 2015-08-01 │ The High Hills (Brambly Hedge) │ 4.5 │ +│ 2015-08-01 │ Fuzzypeg Goes to School (The Little Grey Rabbit library) │ 5 │ +│ 2015-08-01 │ Dictionary in French: The Cat in the Hat (Beginner Series) │ 5 │ +│ 2015-08-01 │ Windfallen │ 5 │ +│ 2015-08-01 │ The Monk Who Sold His Ferrari: A Remarkable Story About Living Your Dreams │ 5 │ +│ 2015-08-01 │ Illustrissimi: The Letters of Pope John Paul I │ 5 │ +│ 2015-08-01 │ Social Contract: A Personal Inquiry into the Evolutionary Sources of Order and Disorder │ 5 │ +│ 2015-08-01 │ Mexico The Beautiful Cookbook: Authentic Recipes from the Regions of Mexico │ 4.5 │ +│ 2015-08-01 │ Alanbrooke │ 5 │ +│ 2015-08-01 │ Back to Cape Horn │ 4 │ +│ 2015-08-01 │ Ovett: An Autobiography (Willow books) │ 5 │ +│ 2015-08-01 │ The Birds of West Africa (Collins Field Guides) │ 4 │ +└────────────┴─────────────────────────────────────────────────────────────────────────────────────────┴───────────┘ + +20 rows in set. Elapsed: 43.055 sec. Processed 150.96 million rows, 13.24 GB (3.51 million rows/s., 307.41 MB/s.) +Peak memory usage: 41.73 GiB. +``` + +10. 各商品カテゴリ別の投票総数は以下のとおりです。このクエリは速く、`product_category`が主キーに含まれているためです: + +```sql +SELECT + sum(total_votes), + product_category +FROM amazon_reviews +GROUP BY product_category +ORDER BY 1 DESC +FORMAT PrettyCompactMonoBlock; +``` + +```response +┌─sum(total_votes)─┬─product_category─────────┐ +│ 103877874 │ Books │ +│ 25330411 │ Digital_Ebook_Purchase │ +│ 23065953 │ Video DVD │ +│ 18048069 │ Music │ +│ 17292294 │ Mobile_Apps │ +│ 15977124 │ Health & Personal Care │ +│ 13554090 │ PC │ +│ 13065746 │ Kitchen │ +│ 12537926 │ Home │ +│ 11067538 │ Beauty │ +│ 10418643 │ Wireless │ +│ 9089085 │ Toys │ +│ 9071484 │ Sports │ +│ 7335647 │ Electronics │ +│ 6885504 │ Apparel │ +│ 6710085 │ Video Games │ +│ 6556319 │ Camera │ +│ 6305478 │ Lawn and Garden │ +│ 5954422 │ Office Products │ +│ 5339437 │ Home Improvement │ +│ 5284343 │ Outdoors │ +│ 5125199 │ Pet Products │ +│ 4733251 │ Grocery │ +│ 4697750 │ Shoes │ +│ 4666487 │ Automotive │ +│ 4361518 │ Digital_Video_Download │ +│ 4033550 │ Tools │ +│ 3559010 │ Baby │ +│ 3317662 │ Home Entertainment │ +│ 2559501 │ Video │ +│ 2204328 │ Furniture │ +│ 2157587 │ Musical Instruments │ +│ 1881662 │ Software │ +│ 1676081 │ Jewelry │ +│ 1499945 │ Watches │ +│ 1224071 │ Digital_Music_Purchase │ +│ 847918 │ Luggage │ +│ 503939 │ Major Appliances │ +│ 392001 │ Digital_Video_Games │ +│ 348990 │ Personal_Care_Appliances │ +│ 321372 │ Digital_Software │ +│ 169585 │ Mobile_Electronics │ +│ 72970 │ Gift Card │ +└──────────────────┴──────────────────────────┘ + +43 rows in set. Elapsed: 0.201 sec. Processed 150.96 million rows, 754.79 MB (750.85 million rows/s., 3.75 GB/s.) +``` + +11. レビューで最も頻繁に「awful」という単語が現れる製品を見つけます。これは大規模なタスクで、151M以上の文字列を解析する必要があります: + +```sql +SELECT + product_id, + any(product_title), + avg(star_rating), + count() AS count +FROM amazon_reviews +WHERE position(review_body, 'awful') > 0 +GROUP BY product_id +ORDER BY count DESC +LIMIT 50; +``` + +クエリはたった4秒で完了し、結果は面白い内容です: + +```response + +┌─product_id─┬─any(product_title)───────────────────────────────────────────────────────────────────────┬───avg(star_rating)─┬─count─┐ +│ 0345803485 │ Fifty Shades of Grey: Book One of the Fifty Shades Trilogy (Fifty Shades of Grey Series) │ 1.3870967741935485 │ 248 │ +│ B007J4T2G8 │ Fifty Shades of Grey (Fifty Shades, Book 1) │ 1.4439834024896265 │ 241 │ +│ B006LSZECO │ Gone Girl: A Novel │ 2.2986425339366514 │ 221 │ +│ B00008OWZG │ St. Anger │ 1.6565656565656566 │ 198 │ +│ B00BD99JMW │ Allegiant (Divergent Trilogy, Book 3) │ 1.8342541436464088 │ 181 │ +│ B0000YUXI0 │ Mavala Switzerland Mavala Stop Nail Biting │ 4.473684210526316 │ 171 │ +│ B004S8F7QM │ Cards Against Humanity │ 4.753012048192771 │ 166 │ +│ 031606792X │ Breaking Dawn (The Twilight Saga, Book 4) │ 1.796875 │ 128 │ +│ 006202406X │ Allegiant (Divergent Series) │ 1.4242424242424243 │ 99 │ +│ B0051VVOB2 │ Kindle Fire (Previous Generation - 1st) │ 2.7448979591836733 │ 98 │ +│ B00I3MP3SG │ Pilot │ 1.8762886597938144 │ 97 │ +│ 030758836X │ Gone Girl │ 2.15625 │ 96 │ +│ B0009X29WK │ Precious Cat Ultra Premium Clumping Cat Litter │ 3.0759493670886076 │ 79 │ +│ B00JB3MVCW │ Noah │ 1.2027027027027026 │ 74 │ +│ B00BAXFECK │ The Goldfinch: A Novel (Pulitzer Prize for Fiction) │ 2.643835616438356 │ 73 │ +│ B00N28818A │ Amazon Prime Video │ 1.4305555555555556 │ 72 │ +│ B007FTE2VW │ SimCity - Limited Edition │ 1.2794117647058822 │ 68 │ +│ 0439023513 │ Mockingjay (The Hunger Games) │ 2.6417910447761193 │ 67 │ +│ B000OCEWGW │ Liquid Ass │ 4.8125 │ 64 │ +│ B00178630A │ Diablo III - PC/Mac │ 1.671875 │ 64 │ +│ B005ZOBNOI │ The Fault in Our Stars │ 4.316666666666666 │ 60 │ +│ B00L9B7IKE │ The Girl on the Train: A Novel │ 2.0677966101694913 │ 59 │ +│ B003WUYPPG │ Unbroken: A World War II Story of Survival, Resilience, and Redemption │ 4.620689655172414 │ 58 │ +│ B0064X7B4A │ Words With Friends │ 2.2413793103448274 │ 58 │ +│ B007S6Y6VS │ Garden of Life Raw Organic Meal │ 2.8793103448275863 │ 58 │ +│ B000XUBFE2 │ The Book Thief │ 4.526315789473684 │ 57 │ +│ B00006HBUJ │ Star Wars: Episode II - Attack of the Clones (Widescreen Edition) │ 2.2982456140350878 │ 57 │ +│ B0006399FS │ How to Dismantle an Atomic Bomb │ 1.9821428571428572 │ 56 │ +│ B003ZSJ212 │ Star Wars: The Complete Saga (Episodes I-VI) (Packaging May Vary) [Blu-ray] │ 2.309090909090909 │ 55 │ +│ 193700788X │ Dead Ever After (Sookie Stackhouse/True Blood) │ 1.5185185185185186 │ 54 │ +│ B004FYEZMQ │ Mass Effect 3 │ 2.056603773584906 │ 53 │ +│ B000CFYAMC │ The Room │ 3.9615384615384617 │ 52 │ +│ B0012JY4G4 │ Color Oops Hair Color Remover Extra Strength 1 Each │ 3.9019607843137254 │ 51 │ +│ B0031JK95S │ Garden of Life Raw Organic Meal │ 3.3137254901960786 │ 51 │ +│ B00CE18P0K │ Pilot │ 1.7142857142857142 │ 49 │ +│ B007VTVRFA │ SimCity - Limited Edition │ 1.2040816326530612 │ 49 │ +│ 0316015849 │ Twilight (The Twilight Saga, Book 1) │ 1.8979591836734695 │ 49 │ +│ B00DR0PDNE │ Google Chromecast HDMI Streaming Media Player │ 2.5416666666666665 │ 48 │ +│ B000056OWC │ The First Years: 4-Stage Bath System │ 1.2127659574468086 │ 47 │ +│ B007IXWKUK │ Fifty Shades Darker (Fifty Shades, Book 2) │ 1.6304347826086956 │ 46 │ +│ 1892112000 │ To Train Up a Child │ 1.4130434782608696 │ 46 │ +│ 043935806X │ Harry Potter and the Order of the Phoenix (Book 5) │ 3.977272727272727 │ 44 │ +│ B003XF1XOQ │ Mockingjay (Hunger Games Trilogy, Book 3) │ 2.772727272727273 │ 44 │ +│ B00BGO0Q9O │ Fitbit Flex Wireless Wristband with Sleep Function, Black │ 1.9318181818181819 │ 44 │ +│ B0064X7FVE │ The Weather Channel: Forecast, Radar & Alerts │ 1.5116279069767442 │ 43 │ +│ B0083PWAPW │ Kindle Fire HD 7", Dolby Audio, Dual-Band Wi-Fi │ 2.627906976744186 │ 43 │ +│ B00DD2B52Y │ Spring Breakers │ 1.2093023255813953 │ 43 │ +│ B00192KCQ0 │ Death Magnetic │ 3.5714285714285716 │ 42 │ +│ B004CFA9RS │ Divergent (Divergent Trilogy, Book 1) │ 3.1219512195121952 │ 41 │ +│ B0052QYLUM │ Infant Optics DXR-5 Portable Video Baby Monitor │ 2.1463414634146343 │ 41 │ +└────────────┴──────────────────────────────────────────────────────────────────────────────────────────┴────────────────────┴───────┘ + +50 rows in set. Elapsed: 4.072 sec. Processed 150.96 million rows, 68.93 GB (37.07 million rows/s., 16.93 GB/s.) +Peak memory usage: 1.82 GiB. +``` + +12. 同じクエリを再度実行し、今度はレビューで**"awesome"**という単語を検索します: + +```sql +SELECT + product_id, + any(product_title), + avg(star_rating), + count() AS count +FROM amazon_reviews +WHERE position(review_body, 'awesome') > 0 +GROUP BY product_id +ORDER BY count DESC +LIMIT 50; +``` + +```response + +┌─product_id─┬─any(product_title)────────────────────────────────────────────────────┬───avg(star_rating)─┬─count─┐ +│ B00992CF6W │ Minecraft │ 4.848130353039482 │ 4787 │ +│ B009UX2YAC │ Subway Surfers │ 4.866720955483171 │ 3684 │ +│ B00QW8TYWO │ Crossy Road │ 4.935217903415784 │ 2547 │ +│ B00DJFIMW6 │ Minion Rush: Despicable Me Official Game │ 4.850450450450451 │ 2220 │ +│ B00AREIAI8 │ My Horse │ 4.865313653136531 │ 2168 │ +│ B00I8Q77Y0 │ Flappy Wings (not Flappy Bird) │ 4.8246561886051085 │ 2036 │ +│ B0054JZC6E │ 101-in-1 Games │ 4.792542016806722 │ 1904 │ +│ B00G5LQ5MU │ Escape The Titanic │ 4.724673710379117 │ 1609 │ +│ B0086700CM │ Temple Run │ 4.87636130685458 │ 1561 │ +│ B009HKL4B8 │ The Sims Freeplay │ 4.763942931258106 │ 1542 │ +│ B00I6IKSZ0 │ Pixel Gun 3D (Pocket Edition) - multiplayer shooter with skin creator │ 4.849894291754757 │ 1419 │ +│ B006OC2ANS │ BLOOD & GLORY │ 4.8561538461538465 │ 1300 │ +│ B00FATEJYE │ Injustice: Gods Among Us (Kindle Tablet Edition) │ 4.789265982636149 │ 1267 │ +│ B00B2V66VS │ Temple Run 2 │ 4.764705882352941 │ 1173 │ +│ B00JOT3HQ2 │ Geometry Dash Lite │ 4.909747292418772 │ 1108 │ +│ B00DUGCLY4 │ Guess The Emoji │ 4.813606710158434 │ 1073 │ +│ B00DR0PDNE │ Google Chromecast HDMI Streaming Media Player │ 4.607276119402985 │ 1072 │ +│ B00FAPF5U0 │ Candy Crush Saga │ 4.825757575757576 │ 1056 │ +│ B0051VVOB2 │ Kindle Fire (Previous Generation - 1st) │ 4.600407747196738 │ 981 │ +│ B007JPG04E │ FRONTLINE COMMANDO │ 4.8125 │ 912 │ +│ B00PTB7B34 │ Call of Duty®: Heroes │ 4.876404494382022 │ 890 │ +│ B00846GKTW │ Style Me Girl - Free 3D Fashion Dressup │ 4.785714285714286 │ 882 │ +│ B004S8F7QM │ Cards Against Humanity │ 4.931034482758621 │ 754 │ +│ B00FAX6XQC │ DEER HUNTER CLASSIC │ 4.700272479564033 │ 734 │ +│ B00PSGW79I │ Buddyman: Kick │ 4.888736263736264 │ 728 │ +│ B00CTQ6SIG │ The Simpsons: Tapped Out │ 4.793948126801153 │ 694 │ +│ B008JK6W5K │ Logo Quiz │ 4.782106782106782 │ 693 │ +│ B00EDTSKLU │ Geometry Dash │ 4.942028985507246 │ 690 │ +│ B00CSR2J9I │ Hill Climb Racing │ 4.880059970014993 │ 667 │ +│ B00CRFAAYC │ Fab Tattoo Artist FREE │ 4.907435508345979 │ 659 │ +│ B005ZXWMUS │ Netflix │ 4.722306525037936 │ 659 │ +│ B00DHQHQCE │ Battle Beach │ 4.863287250384024 │ 651 │ +│ B00BGA9WK2 │ PlayStation 4 500GB Console [Old Model] │ 4.688751926040061 │ 649 │ +│ B008Y7SMQU │ Logo Quiz - Fun Plus Free │ 4.7888 │ 625 │ +│ B0083PWAPW │ Kindle Fire HD 7", Dolby Audio, Dual-Band Wi-Fi │ 4.593900481540931 │ 623 │ +│ B008XG1X18 │ Pinterest │ 4.8148760330578515 │ 605 │ +│ B007SYWFRM │ Ice Age Village │ 4.8566666666666665 │ 600 │ +│ B00K7WGUKA │ Don't Tap The White Tile (Piano Tiles) │ 4.922689075630252 │ 595 │ +│ B00BWYQ9YE │ Kindle Fire HDX 7", HDX Display (Previous Generation - 3rd) │ 4.649913344887349 │ 577 │ +│ B00IZLM8MY │ High School Story │ 4.840425531914893 │ 564 │ +│ B004MC8CA2 │ Bible │ 4.884476534296029 │ 554 │ +│ B00KNWYDU8 │ Dragon City │ 4.861111111111111 │ 540 │ +│ B009ZKSPDK │ Survivalcraft │ 4.738317757009346 │ 535 │ +│ B00A4O6NMG │ My Singing Monsters │ 4.845559845559846 │ 518 │ +│ B002MQYOFW │ The Hunger Games (Hunger Games Trilogy, Book 1) │ 4.846899224806202 │ 516 │ +│ B005ZFOOE8 │ iHeartRadio – Free Music & Internet Radio │ 4.837301587301587 │ 504 │ +│ B00AIUUXHC │ Hungry Shark Evolution │ 4.846311475409836 │ 488 │ +│ B00E8KLWB4 │ The Secret Society® - Hidden Mystery │ 4.669438669438669 │ 481 │ +│ B006D1ONE4 │ Where's My Water? │ 4.916317991631799 │ 478 │ +│ B00G6ZTM3Y │ Terraria │ 4.728421052631579 │ 475 │ +└────────────┴───────────────────────────────────────────────────────────────────────┴────────────────────┴───────┘ + +50 rows in set. Elapsed: 4.079 sec. Processed 150.96 million rows, 68.95 GB (37.01 million rows/s., 16.90 GB/s.) +Peak memory usage: 2.18 GiB. +``` diff --git a/docs/ja/getting-started/example-datasets/amplab-benchmark.md b/docs/ja/getting-started/example-datasets/amplab-benchmark.md new file mode 100644 index 00000000000..82e4047f330 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/amplab-benchmark.md @@ -0,0 +1,126 @@ +--- +slug: /ja/getting-started/example-datasets/amplab-benchmark +sidebar_label: AMPLab ビッグデータベンチマーク +description: データウェアハウスソリューションのパフォーマンスを比較するために使用されるベンチマークデータセット。 +--- + +# AMPLab ビッグデータベンチマーク + +詳細は https://amplab.cs.berkeley.edu/benchmark/ をご覧ください。 + +https://aws.amazon.com で無料アカウントに登録してください。クレジットカード、メールアドレス、電話番号が必要です。https://console.aws.amazon.com/iam/home?nc2=h_m_sc#security_credential から新しいアクセスキーを取得してください。 + +コンソールで以下を実行します: + +``` bash +$ sudo apt-get install s3cmd +$ mkdir tiny; cd tiny; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/tiny/ . +$ cd .. +$ mkdir 1node; cd 1node; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/1node/ . +$ cd .. +$ mkdir 5nodes; cd 5nodes; +$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/5nodes/ . +$ cd .. +``` + +以下の ClickHouse クエリを実行します: + +``` sql +CREATE TABLE rankings_tiny +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_tiny +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); + +CREATE TABLE rankings_1node +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_1node +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); + +CREATE TABLE rankings_5nodes_on_single +( + pageURL String, + pageRank UInt32, + avgDuration UInt32 +) ENGINE = Log; + +CREATE TABLE uservisits_5nodes_on_single +( + sourceIP String, + destinationURL String, + visitDate Date, + adRevenue Float32, + UserAgent String, + cCode FixedString(3), + lCode FixedString(6), + searchWord String, + duration UInt32 +) ENGINE = MergeTree(visitDate, visitDate, 8192); +``` + +コンソールに戻ります: + +``` bash +$ for i in tiny/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_tiny FORMAT CSV"; done +$ for i in tiny/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_tiny FORMAT CSV"; done +$ for i in 1node/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_1node FORMAT CSV"; done +$ for i in 1node/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_1node FORMAT CSV"; done +$ for i in 5nodes/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_5nodes_on_single FORMAT CSV"; done +$ for i in 5nodes/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_5nodes_on_single FORMAT CSV"; done +``` + +データサンプルを取得するためのクエリ: + +``` sql +SELECT pageURL, pageRank FROM rankings_1node WHERE pageRank > 1000 + +SELECT substring(sourceIP, 1, 8), sum(adRevenue) FROM uservisits_1node GROUP BY substring(sourceIP, 1, 8) + +SELECT + sourceIP, + sum(adRevenue) AS totalRevenue, + avg(pageRank) AS pageRank +FROM rankings_1node ALL INNER JOIN +( + SELECT + sourceIP, + destinationURL AS pageURL, + adRevenue + FROM uservisits_1node + WHERE (visitDate > '1980-01-01') AND (visitDate < '1980-04-01') +) USING pageURL +GROUP BY sourceIP +ORDER BY totalRevenue DESC +LIMIT 1 +``` diff --git a/docs/ja/getting-started/example-datasets/brown-benchmark.md b/docs/ja/getting-started/example-datasets/brown-benchmark.md new file mode 100644 index 00000000000..38282c8e18e --- /dev/null +++ b/docs/ja/getting-started/example-datasets/brown-benchmark.md @@ -0,0 +1,456 @@ +--- +slug: /ja/getting-started/example-datasets/brown-benchmark +sidebar_label: ブラウン大学ベンチマーク +description: 機械生成ログデータの新しい分析ベンチマーク +title: "ブラウン大学ベンチマーク" +--- + +`MgBench`は、機械生成ログデータの新しい分析ベンチマークです。[Andrew Crotty](http://cs.brown.edu/people/acrotty/)。 + +データをダウンロードします: +``` +wget https://datasets.clickhouse.com/mgbench{1..3}.csv.xz +``` + +データを展開します: +``` +xz -v -d mgbench{1..3}.csv.xz +``` + +データベースとテーブルを作成します: +```sql +CREATE DATABASE mgbench; +``` + +```sql +USE mgbench; +``` + +```sql +CREATE TABLE mgbench.logs1 ( + log_time DateTime, + machine_name LowCardinality(String), + machine_group LowCardinality(String), + cpu_idle Nullable(Float32), + cpu_nice Nullable(Float32), + cpu_system Nullable(Float32), + cpu_user Nullable(Float32), + cpu_wio Nullable(Float32), + disk_free Nullable(Float32), + disk_total Nullable(Float32), + part_max_used Nullable(Float32), + load_fifteen Nullable(Float32), + load_five Nullable(Float32), + load_one Nullable(Float32), + mem_buffers Nullable(Float32), + mem_cached Nullable(Float32), + mem_free Nullable(Float32), + mem_shared Nullable(Float32), + swap_free Nullable(Float32), + bytes_in Nullable(Float32), + bytes_out Nullable(Float32) +) +ENGINE = MergeTree() +ORDER BY (machine_group, machine_name, log_time); +``` + + +```sql +CREATE TABLE mgbench.logs2 ( + log_time DateTime, + client_ip IPv4, + request String, + status_code UInt16, + object_size UInt64 +) +ENGINE = MergeTree() +ORDER BY log_time; +``` + + +```sql +CREATE TABLE mgbench.logs3 ( + log_time DateTime64, + device_id FixedString(15), + device_name LowCardinality(String), + device_type LowCardinality(String), + device_floor UInt8, + event_type LowCardinality(String), + event_unit FixedString(1), + event_value Nullable(Float32) +) +ENGINE = MergeTree() +ORDER BY (event_type, log_time); +``` + +データを挿入します: + +``` +clickhouse-client --query "INSERT INTO mgbench.logs1 FORMAT CSVWithNames" < mgbench1.csv +clickhouse-client --query "INSERT INTO mgbench.logs2 FORMAT CSVWithNames" < mgbench2.csv +clickhouse-client --query "INSERT INTO mgbench.logs3 FORMAT CSVWithNames" < mgbench3.csv +``` + +## ベンチマーククエリを実行: + +```sql +USE mgbench; +``` + +```sql +-- Q1.1: 各ウェブサーバのCPU/ネットワーク使用率は、今日の午前0時以降どのくらいですか? + +SELECT machine_name, + MIN(cpu) AS cpu_min, + MAX(cpu) AS cpu_max, + AVG(cpu) AS cpu_avg, + MIN(net_in) AS net_in_min, + MAX(net_in) AS net_in_max, + AVG(net_in) AS net_in_avg, + MIN(net_out) AS net_out_min, + MAX(net_out) AS net_out_max, + AVG(net_out) AS net_out_avg +FROM ( + SELECT machine_name, + COALESCE(cpu_user, 0.0) AS cpu, + COALESCE(bytes_in, 0.0) AS net_in, + COALESCE(bytes_out, 0.0) AS net_out + FROM logs1 + WHERE machine_name IN ('anansi','aragog','urd') + AND log_time >= TIMESTAMP '2017-01-11 00:00:00' +) AS r +GROUP BY machine_name; +``` + + +```sql +-- Q1.2: コンピューターラボのマシンのうち、過去1日間にオフラインになっていたものはどれですか? + +SELECT machine_name, + log_time +FROM logs1 +WHERE (machine_name LIKE 'cslab%' OR + machine_name LIKE 'mslab%') + AND load_one IS NULL + AND log_time >= TIMESTAMP '2017-01-10 00:00:00' +ORDER BY machine_name, + log_time; +``` + +```sql +-- Q1.3: 特定のワークステーションの過去10日間の毎時平均メトリクスはどのくらいですか? + +SELECT dt, + hr, + AVG(load_fifteen) AS load_fifteen_avg, + AVG(load_five) AS load_five_avg, + AVG(load_one) AS load_one_avg, + AVG(mem_free) AS mem_free_avg, + AVG(swap_free) AS swap_free_avg +FROM ( + SELECT CAST(log_time AS DATE) AS dt, + EXTRACT(HOUR FROM log_time) AS hr, + load_fifteen, + load_five, + load_one, + mem_free, + swap_free + FROM logs1 + WHERE machine_name = 'babbage' + AND load_fifteen IS NOT NULL + AND load_five IS NOT NULL + AND load_one IS NOT NULL + AND mem_free IS NOT NULL + AND swap_free IS NOT NULL + AND log_time >= TIMESTAMP '2017-01-01 00:00:00' +) AS r +GROUP BY dt, + hr +ORDER BY dt, + hr; +``` + +```sql +-- Q1.4: 1か月間で、各サーバーがディスクI/Oでブロックされた頻度はどのくらいですか? + +SELECT machine_name, + COUNT(*) AS spikes +FROM logs1 +WHERE machine_group = 'Servers' + AND cpu_wio > 0.99 + AND log_time >= TIMESTAMP '2016-12-01 00:00:00' + AND log_time < TIMESTAMP '2017-01-01 00:00:00' +GROUP BY machine_name +ORDER BY spikes DESC +LIMIT 10; +``` + +```sql +-- Q1.5: メモリ不足になった外部アクセス可能なVMはどれですか? + +SELECT machine_name, + dt, + MIN(mem_free) AS mem_free_min +FROM ( + SELECT machine_name, + CAST(log_time AS DATE) AS dt, + mem_free + FROM logs1 + WHERE machine_group = 'DMZ' + AND mem_free IS NOT NULL +) AS r +GROUP BY machine_name, + dt +HAVING MIN(mem_free) < 10000 +ORDER BY machine_name, + dt; +``` + +```sql +-- Q1.6: ファイルサーバー全体の毎時ネットワークトラフィックの合計はどのくらいですか? + +SELECT dt, + hr, + SUM(net_in) AS net_in_sum, + SUM(net_out) AS net_out_sum, + SUM(net_in) + SUM(net_out) AS both_sum +FROM ( + SELECT CAST(log_time AS DATE) AS dt, + EXTRACT(HOUR FROM log_time) AS hr, + COALESCE(bytes_in, 0.0) / 1000000000.0 AS net_in, + COALESCE(bytes_out, 0.0) / 1000000000.0 AS net_out + FROM logs1 + WHERE machine_name IN ('allsorts','andes','bigred','blackjack','bonbon', + 'cadbury','chiclets','cotton','crows','dove','fireball','hearts','huey', + 'lindt','milkduds','milkyway','mnm','necco','nerds','orbit','peeps', + 'poprocks','razzles','runts','smarties','smuggler','spree','stride', + 'tootsie','trident','wrigley','york') +) AS r +GROUP BY dt, + hr +ORDER BY both_sum DESC +LIMIT 10; +``` + +```sql +-- Q2.1: 過去2週間にサーバーエラーを引き起こしたリクエストはどれですか? + +SELECT * +FROM logs2 +WHERE status_code >= 500 + AND log_time >= TIMESTAMP '2012-12-18 00:00:00' +ORDER BY log_time; +``` + +```sql +-- Q2.2: 特定の2週間の期間中にユーザーパスワードファイルが漏洩しましたか? + +SELECT * +FROM logs2 +WHERE status_code >= 200 + AND status_code < 300 + AND request LIKE '%/etc/passwd%' + AND log_time >= TIMESTAMP '2012-05-06 00:00:00' + AND log_time < TIMESTAMP '2012-05-20 00:00:00'; +``` + + +```sql +-- Q2.3: 過去1か月のトップレベルリクエストの平均パス深さはどのくらいですか? + +SELECT top_level, + AVG(LENGTH(request) - LENGTH(REPLACE(request, '/', ''))) AS depth_avg +FROM ( + SELECT SUBSTRING(request FROM 1 FOR len) AS top_level, + request + FROM ( + SELECT POSITION(SUBSTRING(request FROM 2), '/') AS len, + request + FROM logs2 + WHERE status_code >= 200 + AND status_code < 300 + AND log_time >= TIMESTAMP '2012-12-01 00:00:00' + ) AS r + WHERE len > 0 +) AS s +WHERE top_level IN ('/about','/courses','/degrees','/events', + '/grad','/industry','/news','/people', + '/publications','/research','/teaching','/ugrad') +GROUP BY top_level +ORDER BY top_level; +``` + + +```sql +-- Q2.4: 過去3か月間で過剰なリクエストを行ったクライアントはどれですか? + +SELECT client_ip, + COUNT(*) AS num_requests +FROM logs2 +WHERE log_time >= TIMESTAMP '2012-10-01 00:00:00' +GROUP BY client_ip +HAVING COUNT(*) >= 100000 +ORDER BY num_requests DESC; +``` + + +```sql +-- Q2.5: 日別のユニークビジター数はどれだけですか? + +SELECT dt, + COUNT(DISTINCT client_ip) +FROM ( + SELECT CAST(log_time AS DATE) AS dt, + client_ip + FROM logs2 +) AS r +GROUP BY dt +ORDER BY dt; +``` + + +```sql +-- Q2.6: 平均および最大データ転送速度 (Gbps) はどれだけですか? + +SELECT AVG(transfer) / 125000000.0 AS transfer_avg, + MAX(transfer) / 125000000.0 AS transfer_max +FROM ( + SELECT log_time, + SUM(object_size) AS transfer + FROM logs2 + GROUP BY log_time +) AS r; +``` + + +```sql +-- Q3.1: 室内温度が週末に氷点下になったことがありますか? + +SELECT * +FROM logs3 +WHERE event_type = 'temperature' + AND event_value <= 32.0 + AND log_time >= '2019-11-29 17:00:00.000'; +``` + + +```sql +-- Q3.4: 過去6ヶ月間で各ドアが開かれた頻度はどのくらいですか? + +SELECT device_name, + device_floor, + COUNT(*) AS ct +FROM logs3 +WHERE event_type = 'door_open' + AND log_time >= '2019-06-01 00:00:00.000' +GROUP BY device_name, + device_floor +ORDER BY ct DESC; +``` + +以下のクエリ3.5ではUNIONを使用しています。SELECTクエリ結果を結合するモードを設定します。この設定は、明示的にUNION ALLまたはUNION DISTINCTを指定していない場合に、UNIONと共有されているときにのみ使用されます。 +```sql +SET union_default_mode = 'DISTINCT' +``` + +```sql +-- Q3.5: 冬と夏で大きな温度変動が発生するのは建物のどこですか? + +WITH temperature AS ( + SELECT dt, + device_name, + device_type, + device_floor + FROM ( + SELECT dt, + hr, + device_name, + device_type, + device_floor, + AVG(event_value) AS temperature_hourly_avg + FROM ( + SELECT CAST(log_time AS DATE) AS dt, + EXTRACT(HOUR FROM log_time) AS hr, + device_name, + device_type, + device_floor, + event_value + FROM logs3 + WHERE event_type = 'temperature' + ) AS r + GROUP BY dt, + hr, + device_name, + device_type, + device_floor + ) AS s + GROUP BY dt, + device_name, + device_type, + device_floor + HAVING MAX(temperature_hourly_avg) - MIN(temperature_hourly_avg) >= 25.0 +) +SELECT DISTINCT device_name, + device_type, + device_floor, + 'WINTER' +FROM temperature +WHERE dt >= DATE '2018-12-01' + AND dt < DATE '2019-03-01' +UNION +SELECT DISTINCT device_name, + device_type, + device_floor, + 'SUMMER' +FROM temperature +WHERE dt >= DATE '2019-06-01' + AND dt < DATE '2019-09-01'; +``` + + +```sql +-- Q3.6: 各デバイスカテゴリについて、月別の電力消費メトリクスはどのくらいですか? + +SELECT yr, + mo, + SUM(coffee_hourly_avg) AS coffee_monthly_sum, + AVG(coffee_hourly_avg) AS coffee_monthly_avg, + SUM(printer_hourly_avg) AS printer_monthly_sum, + AVG(printer_hourly_avg) AS printer_monthly_avg, + SUM(projector_hourly_avg) AS projector_monthly_sum, + AVG(projector_hourly_avg) AS projector_monthly_avg, + SUM(vending_hourly_avg) AS vending_monthly_sum, + AVG(vending_hourly_avg) AS vending_monthly_avg +FROM ( + SELECT dt, + yr, + mo, + hr, + AVG(coffee) AS coffee_hourly_avg, + AVG(printer) AS printer_hourly_avg, + AVG(projector) AS projector_hourly_avg, + AVG(vending) AS vending_hourly_avg + FROM ( + SELECT CAST(log_time AS DATE) AS dt, + EXTRACT(YEAR FROM log_time) AS yr, + EXTRACT(MONTH FROM log_time) AS mo, + EXTRACT(HOUR FROM log_time) AS hr, + CASE WHEN device_name LIKE 'coffee%' THEN event_value END AS coffee, + CASE WHEN device_name LIKE 'printer%' THEN event_value END AS printer, + CASE WHEN device_name LIKE 'projector%' THEN event_value END AS projector, + CASE WHEN device_name LIKE 'vending%' THEN event_value END AS vending + FROM logs3 + WHERE device_type = 'meter' + ) AS r + GROUP BY dt, + yr, + mo, + hr +) AS s +GROUP BY yr, + mo +ORDER BY yr, + mo; +``` + +このデータは、[Playground](https://sql.clickhouse.com)、[例](https://sql.clickhouse.com?query_id=1MXMHASDLEQIP4P1D1STND)でもインタラクティブなクエリに利用できます。 diff --git a/docs/ja/getting-started/example-datasets/cell-towers.md b/docs/ja/getting-started/example-datasets/cell-towers.md new file mode 100644 index 00000000000..55bddb7cd48 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/cell-towers.md @@ -0,0 +1,368 @@ +--- +slug: /ja/getting-started/example-datasets/cell-towers +sidebar_label: 地理データ +sidebar_position: 3 +title: "携帯電話タワーデータセットを使用した地理データ" +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import ActionsMenu from '@site/docs/ja/_snippets/_service_actions_menu.md'; +import SQLConsoleDetail from '@site/docs/ja/_snippets/_launch_sql_console.md'; +import SupersetDocker from '@site/docs/ja/_snippets/_add_superset_detail.md'; + +## 目的 + +このガイドでは以下のことを学びます: +- OpenCelliDデータをClickHouseにロードする +- Apache SupersetをClickHouseに接続する +- データセットに基づいたダッシュボードを作成する + +以下はこのガイドで作成するダッシュボードのプレビューです: + +![mcc 204のラジオタイプ別携帯電話タワーのダッシュボード](@site/docs/ja/getting-started/example-datasets/images/superset-cell-tower-dashboard.png) + +## データセットの取得 {#get-the-dataset} + +このデータセットは、世界最大の携帯電話タワーのオープンデータベースである[OpenCelliD](https://www.opencellid.org/)からのものです。 + +2021年現在、世界中の携帯電話タワー(GSM、LTE、UMTSなど)に関する4000万件以上のレコードが、地理的座標とメタデータ(国コード、ネットワークなど)と共に含まれています。 + +OpenCelliDプロジェクトは、Creative Commons Attribution-ShareAlike 4.0 International Licenseの下でライセンスされており、このデータセットのスナップショットも同じライセンスの条件で再配布しています。データセットの最新バージョンは、サインインした後にダウンロードできます。 + + + + +### サンプルデータをロードする + +ClickHouse Cloudは、S3からこのデータセットをアップロードするための簡単な方法を提供しています。 [ClickHouse.cloud](https://clickhouse.cloud)で無料トライアルを作成するか、ご所属のClickHouse Cloud組織にログインしてください。 + + +**サンプルデータ**タブから**Cell Towers**データセットを選び、**データをロード**します: + +![携帯電話タワーのデータセットをロード](@site/docs/ja/_snippets/images/cloud-load-data-sample.png) + +### cell_towersテーブルのスキーマを確認する +```sql +DESCRIBE TABLE cell_towers +``` + + + +以下は`DESCRIBE`コマンドの出力結果です。このガイドの後半ではフィールドタイプの選択について説明します。 +```response +┌─name──────────┬─type──────────────────────────────────────────────────────────────────┬ +│ radio │ Enum8('' = 0, 'CDMA' = 1, 'GSM' = 2, 'LTE' = 3, 'NR' = 4, 'UMTS' = 5) │ +│ mcc │ UInt16 │ +│ net │ UInt16 │ +│ area │ UInt16 │ +│ cell │ UInt64 │ +│ unit │ Int16 │ +│ lon │ Float64 │ +│ lat │ Float64 │ +│ range │ UInt32 │ +│ samples │ UInt32 │ +│ changeable │ UInt8 │ +│ created │ DateTime │ +│ updated │ DateTime │ +│ averageSignal │ UInt8 │ +└───────────────┴───────────────────────────────────────────────────────────────────────┴ +``` + + + + +1. 2021年2月のデータセットのスナップショットをダウンロードします: [cell_towers.csv.xz](https://datasets.clickhouse.com/cell_towers.csv.xz) (686 MB). + +2. 整合性を検証します(オプションの手順): +```bash +md5sum cell_towers.csv.xz +``` +```response +8a797f7bdb55faba93f6cbc37d47b037 cell_towers.csv.xz +``` + +3. 次のコマンドで解凍します: +```bash +xz -d cell_towers.csv.xz +``` + +4. テーブルを作成します: + +```sql +CREATE TABLE cell_towers +( + radio Enum8('' = 0, 'CDMA' = 1, 'GSM' = 2, 'LTE' = 3, 'NR' = 4, 'UMTS' = 5), + mcc UInt16, + net UInt16, + area UInt16, + cell UInt64, + unit Int16, + lon Float64, + lat Float64, + range UInt32, + samples UInt32, + changeable UInt8, + created DateTime, + updated DateTime, + averageSignal UInt8 +) +ENGINE = MergeTree ORDER BY (radio, mcc, net, created); +``` + +5. データセットを挿入します: +```bash +clickhouse-client --query "INSERT INTO cell_towers FORMAT CSVWithNames" < cell_towers.csv +``` + + + + +## いくつかのクエリを実行する {#examples} + +1. 種類別の携帯電話タワー数: + +```sql +SELECT radio, count() AS c FROM cell_towers GROUP BY radio ORDER BY c DESC +``` +```response +┌─radio─┬────────c─┐ +│ UMTS │ 20686487 │ +│ LTE │ 12101148 │ +│ GSM │ 9931304 │ +│ CDMA │ 556344 │ +│ NR │ 867 │ +└───────┴──────────┘ + +5 rows in set. Elapsed: 0.011 sec. Processed 43.28 million rows, 43.28 MB (3.83 billion rows/s., 3.83 GB/s.) +``` + +2. [携帯国コード (MCC)](https://en.wikipedia.org/wiki/Mobile_country_code)別の携帯電話タワー: + +```sql +SELECT mcc, count() FROM cell_towers GROUP BY mcc ORDER BY count() DESC LIMIT 10 +``` +```response +┌─mcc─┬─count()─┐ +│ 310 │ 5024650 │ +│ 262 │ 2622423 │ +│ 250 │ 1953176 │ +│ 208 │ 1891187 │ +│ 724 │ 1836150 │ +│ 404 │ 1729151 │ +│ 234 │ 1618924 │ +│ 510 │ 1353998 │ +│ 440 │ 1343355 │ +│ 311 │ 1332798 │ +└─────┴─────────┘ + +10 rows in set. Elapsed: 0.019 sec. Processed 43.28 million rows, 86.55 MB (2.33 billion rows/s., 4.65 GB/s.) +``` + +上記のクエリと[MCCリスト](https://en.wikipedia.org/wiki/Mobile_country_code)に基づいて、携帯電話タワーが最も多い国はアメリカ、ドイツ、ロシアです。 + +これらの値をデコードするために、ClickHouseで[Dictionary](../../sql-reference/dictionaries/index.md)を作成することをお勧めします。 + +## ユースケース: 地理データの組み込み {#use-case} + +[`pointInPolygon`](/docs/ja/sql-reference/functions/geo/coordinates.md/#pointinpolygon)関数を使用します。 + +1. 多角形を格納するテーブルを作成します: + + + + +```sql +CREATE TABLE moscow (polygon Array(Tuple(Float64, Float64))) +ORDER BY polygon; +``` + + + + +```sql +CREATE TEMPORARY TABLE +moscow (polygon Array(Tuple(Float64, Float64))); +``` + + + + +2. これはモスクワの大まかな形です("新しいモスクワ"を含まない): + +```sql +INSERT INTO moscow VALUES ([(37.84172564285271, 55.78000432402266), +(37.8381207618713, 55.775874525970494), (37.83979446823122, 55.775626746008065), (37.84243326983639, 55.77446586811748), (37.84262672750849, 55.771974101091104), (37.84153238623039, 55.77114545193181), (37.841124690460184, 55.76722010265554), +(37.84239076983644, 55.76654891107098), (37.842283558197025, 55.76258709833121), (37.8421759312134, 55.758073999993734), (37.84198330422974, 55.75381499999371), (37.8416827275085, 55.749277102484484), (37.84157576190186, 55.74794544108413), +(37.83897929098507, 55.74525257875241), (37.83739676451868, 55.74404373042019), (37.838732481460525, 55.74298009816793), (37.841183997352545, 55.743060321833575), (37.84097476190185, 55.73938799999373), (37.84048155819702, 55.73570799999372), +(37.840095812164286, 55.73228210777237), (37.83983814285274, 55.73080491981639), (37.83846476321406, 55.729799917464675), (37.83835745269769, 55.72919751082619), (37.838636380279524, 55.72859509486539), (37.8395161005249, 55.727705075632784), +(37.83897964285276, 55.722727886185154), (37.83862557539366, 55.72034817326636), (37.83559735744853, 55.71944437307499), (37.835370708803126, 55.71831419154461), (37.83738169402022, 55.71765218986692), (37.83823396494291, 55.71691750159089), +(37.838056931213345, 55.71547311301385), (37.836812846557606, 55.71221445615604), (37.83522525396725, 55.709331054395555), (37.83269301586908, 55.70953687463627), (37.829667367706236, 55.70903403789297), (37.83311126588435, 55.70552351822608), +(37.83058993121339, 55.70041317726053), (37.82983872750851, 55.69883771404813), (37.82934501586913, 55.69718947487017), (37.828926414016685, 55.69504441658371), (37.82876530422971, 55.69287499999378), (37.82894754100031, 55.690759754047335), +(37.827697554878185, 55.68951421135665), (37.82447346292115, 55.68965045405069), (37.83136543914793, 55.68322046195302), (37.833554015869154, 55.67814012759211), (37.83544184655761, 55.67295011628339), (37.837480388885474, 55.6672498719639), +(37.838960677246064, 55.66316274139358), (37.83926093121332, 55.66046999999383), (37.839025050262435, 55.65869897264431), (37.83670784390257, 55.65794084879904), (37.835656529083245, 55.65694309303843), (37.83704060449217, 55.65689306460552), +(37.83696819873806, 55.65550363526252), (37.83760389616388, 55.65487847246661), (37.83687972750851, 55.65356745541324), (37.83515216004943, 55.65155951234079), (37.83312418518067, 55.64979413590619), (37.82801726983639, 55.64640836412121), +(37.820614174591, 55.64164525405531), (37.818908190475426, 55.6421883258084), (37.81717543386075, 55.64112490388471), (37.81690987037274, 55.63916106913107), (37.815099354492155, 55.637925371757085), (37.808769150787356, 55.633798276884455), +(37.80100123544311, 55.62873670012244), (37.79598013491824, 55.62554336109055), (37.78634567724606, 55.62033499605651), (37.78334147619623, 55.618768681480326), (37.77746201055901, 55.619855533402706), (37.77527329626457, 55.61909966711279), +(37.77801986242668, 55.618770300976294), (37.778212973541216, 55.617257701952106), (37.77784818518065, 55.61574504433011), (37.77016867724609, 55.61148576294007), (37.760191219573976, 55.60599579539028), (37.75338926983641, 55.60227892751446), +(37.746329965606634, 55.59920577639331), (37.73939925396728, 55.59631430313617), (37.73273665739439, 55.5935318803559), (37.7299954450912, 55.59350760316188), (37.7268679946899, 55.59469840523759), (37.72626726983634, 55.59229549697373), +(37.7262673598022, 55.59081598950582), (37.71897193121335, 55.5877595845419), (37.70871550793456, 55.58393177431724), (37.700497489410374, 55.580917323756644), (37.69204305026244, 55.57778089778455), (37.68544477378839, 55.57815154690915), +(37.68391050793454, 55.57472945079756), (37.678803592590306, 55.57328235936491), (37.6743402539673, 55.57255251445782), (37.66813862698363, 55.57216388774464), (37.617927457672096, 55.57505691895805), (37.60443099999999, 55.5757737568051), +(37.599683515869145, 55.57749105910326), (37.59754177842709, 55.57796291823627), (37.59625834786988, 55.57906686095235), (37.59501783265684, 55.57746616444403), (37.593090671936025, 55.57671634534502), (37.587018007904, 55.577944600233785), +(37.578692203704804, 55.57982895000019), (37.57327546607398, 55.58116294118248), (37.57385012109279, 55.581550362779), (37.57399562266922, 55.5820107079112), (37.5735356072979, 55.58226289171689), (37.57290393054962, 55.582393529795155), +(37.57037722355653, 55.581919415056234), (37.5592298306885, 55.584471614867844), (37.54189249206543, 55.58867650795186), (37.5297256269836, 55.59158133551745), (37.517837865081766, 55.59443656218868), (37.51200186508174, 55.59635625174229), +(37.506808949737554, 55.59907823904434), (37.49820432275389, 55.6062944994944), (37.494406071441674, 55.60967103463367), (37.494760001358024, 55.61066689753365), (37.49397137107085, 55.61220931698269), (37.49016528606031, 55.613417718449064), +(37.48773249206542, 55.61530616333343), (37.47921386508177, 55.622640129112334), (37.470652153442394, 55.62993723476164), (37.46273446298218, 55.6368075123157), (37.46350692265317, 55.64068225239439), (37.46050283203121, 55.640794546982576), +(37.457627470916734, 55.64118904154646), (37.450718034393326, 55.64690488145138), (37.44239252645875, 55.65397824729769), (37.434587576721185, 55.66053543155961), (37.43582144975277, 55.661693766520735), (37.43576786245721, 55.662755031737014), +(37.430982915344174, 55.664610641628116), (37.428547447097685, 55.66778515273695), (37.42945134592044, 55.668633314343566), (37.42859571562949, 55.66948145750025), (37.4262836402282, 55.670813882451405), (37.418709037048295, 55.6811141674414), +(37.41922139651101, 55.68235377885389), (37.419218771842885, 55.68359335082235), (37.417196501327446, 55.684375235224735), (37.41607020370478, 55.68540557585352), (37.415640857147146, 55.68686637150793), (37.414632153442334, 55.68903015131686), +(37.413344899475064, 55.690896881757396), (37.41171432275391, 55.69264232162232), (37.40948282275393, 55.69455101638112), (37.40703674603271, 55.69638690385348), (37.39607169577025, 55.70451821283731), (37.38952706878662, 55.70942491932811), +(37.387778313491815, 55.71149057784176), (37.39049275399779, 55.71419814298992), (37.385557272491454, 55.7155489617061), (37.38388335714726, 55.71849856042102), (37.378368238098155, 55.7292763261685), (37.37763597123337, 55.730845879211614), +(37.37890062088197, 55.73167906388319), (37.37750451918789, 55.734703664681774), (37.375610832015965, 55.734851959522246), (37.3723813571472, 55.74105626086403), (37.37014935714723, 55.746115620904355), (37.36944173016362, 55.750883999993725), +(37.36975304365541, 55.76335905525834), (37.37244070571134, 55.76432079697595), (37.3724259757175, 55.76636979670426), (37.369922155757884, 55.76735417953104), (37.369892695770275, 55.76823419316575), (37.370214730163575, 55.782312184391266), +(37.370493611114505, 55.78436801120489), (37.37120164550783, 55.78596427165359), (37.37284851456452, 55.7874378183096), (37.37608325135799, 55.7886695054807), (37.3764587460632, 55.78947647305964), (37.37530000265506, 55.79146512926804), +(37.38235915344241, 55.79899647809345), (37.384344043655396, 55.80113596939471), (37.38594269577028, 55.80322699999366), (37.38711208598329, 55.804919036911976), (37.3880239841309, 55.806610999993666), (37.38928977249147, 55.81001864976979), +(37.39038389947512, 55.81348641242801), (37.39235781481933, 55.81983538336746), (37.393709457672124, 55.82417822811877), (37.394685720901464, 55.82792275755836), (37.39557615344238, 55.830447148154136), (37.39844478226658, 55.83167107969975), +(37.40019761214057, 55.83151823557964), (37.400398790382326, 55.83264967594742), (37.39659544313046, 55.83322180909622), (37.39667059524539, 55.83402792148566), (37.39682089947515, 55.83638877400216), (37.39643489154053, 55.83861656112751), +(37.3955338994751, 55.84072348043264), (37.392680272491454, 55.84502158126453), (37.39241188227847, 55.84659117913199), (37.392529730163616, 55.84816071336481), (37.39486835714723, 55.85288092980303), (37.39873052645878, 55.859893456073635), +(37.40272161111449, 55.86441833633205), (37.40697072750854, 55.867579567544375), (37.410007082016016, 55.868369880337), (37.4120992989502, 55.86920843741314), (37.412668021163924, 55.87055369615854), (37.41482461111453, 55.87170587948249), +(37.41862266137694, 55.873183961039565), (37.42413732540892, 55.874879126654704), (37.4312182698669, 55.875614937236705), (37.43111093783558, 55.8762723478417), (37.43332105622856, 55.87706546369396), (37.43385747619623, 55.87790681284802), +(37.441303050262405, 55.88027084462084), (37.44747234260555, 55.87942070143253), (37.44716141796871, 55.88072960917233), (37.44769797085568, 55.88121221323979), (37.45204320500181, 55.882080694420715), (37.45673176190186, 55.882346110794586), +(37.463383999999984, 55.88252729504517), (37.46682797486874, 55.88294937719063), (37.470014457672086, 55.88361266759345), (37.47751410450743, 55.88546991372396), (37.47860317658232, 55.88534929207307), (37.48165826025772, 55.882563306475106), +(37.48316434442331, 55.8815803226785), (37.483831555817645, 55.882427612793315), (37.483182967125686, 55.88372791409729), (37.483092277908824, 55.88495581062434), (37.4855716508179, 55.8875561994203), (37.486440636245746, 55.887827444039566), +(37.49014203439328, 55.88897899871799), (37.493210285705544, 55.890208937135604), (37.497512451065035, 55.891342397444696), (37.49780744510645, 55.89174030252967), (37.49940333499519, 55.89239745507079), (37.50018383334346, 55.89339220941865), +(37.52421672750851, 55.903869074155224), (37.52977457672118, 55.90564076517974), (37.53503220370484, 55.90661661218259), (37.54042858064267, 55.90714113744566), (37.54320461007303, 55.905645048442985), (37.545686966066306, 55.906608607018505), +(37.54743976120755, 55.90788552162358), (37.55796999999999, 55.90901557907218), (37.572711542327866, 55.91059395704873), (37.57942799999998, 55.91073854155573), (37.58502865872187, 55.91009969268444), (37.58739968913264, 55.90794809960554), +(37.59131567193598, 55.908713267595054), (37.612687423278814, 55.902866854295375), (37.62348079629517, 55.90041967242986), (37.635797880950896, 55.898141151686396), (37.649487626983664, 55.89639275532968), (37.65619302513125, 55.89572360207488), +(37.66294133862307, 55.895295577183965), (37.66874564418033, 55.89505457604897), (37.67375601586915, 55.89254677027454), (37.67744661901856, 55.8947775867987), (37.688347, 55.89450045676125), (37.69480554232789, 55.89422926332761), +(37.70107096560668, 55.89322256101114), (37.705962965606716, 55.891763491662616), (37.711885134918205, 55.889110234998974), (37.71682005026245, 55.886577568759876), (37.7199315476074, 55.88458159806678), (37.72234560316464, 55.882281005794134), +(37.72364385977171, 55.8809452036196), (37.725371142837474, 55.8809722706006), (37.727870902099546, 55.88037213862385), (37.73394330422971, 55.877941504088696), (37.745339592590376, 55.87208120378722), (37.75525267724611, 55.86703807949492), +(37.76919976190188, 55.859821640197474), (37.827835219574, 55.82962968399116), (37.83341438888553, 55.82575289922351), (37.83652584655761, 55.82188784027888), (37.83809213491821, 55.81612575504693), (37.83605359521481, 55.81460347077685), +(37.83632178569025, 55.81276696067908), (37.838623105812026, 55.811486181656385), (37.83912198147584, 55.807329380532785), (37.839079078033414, 55.80510270463816), (37.83965844708251, 55.79940712529036), (37.840581150787344, 55.79131399999368), +(37.84172564285271, 55.78000432402266)]); +``` + +3. モスクワにどのくらいの携帯電話タワーがあるのかを確認します: + +```sql +SELECT count() FROM cell_towers +WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) +``` +```response +┌─count()─┐ +│ 310463 │ +└─────────┘ + +1 rows in set. Elapsed: 0.067 sec. Processed 43.28 million rows, 692.42 MB (645.83 million rows/s., 10.33 GB/s.) +``` + +## スキーマの復習 + +Supersetでの視覚化を構築する前に、使用するカラムを確認しておきましょう。このデータセットは主に、世界中の携帯電話タワーの位置(経度と緯度)とラジオの種類を提供します。カラムの説明は[コミュニティフォーラム](https://community.opencellid.org/t/documenting-the-columns-in-the-downloadable-cells-database-csv/186)にあります。このガイドで構築する視覚化で使用するカラムは以下の通りです: + +OpenCelliDフォーラムから引用したカラムの説明: + +| カラム | 説明 | +|--------------|---------------------------------------------------------------| +| radio | 技術世代: CDMA、GSM、UMTS、5G NR | +| mcc | 携帯国コード: `204` はオランダ | +| lon | 経度: 緯度と合わせて、タワーの位置を大まかに示す | +| lat | 緯度: 経度と合わせて、タワーの位置を大まかに示す | + +:::tip mcc +あなたのMCCを見つけるには、[携帯ネットワークコード](https://en.wikipedia.org/wiki/Mobile_country_code)を確認し、**携帯国コード**カラムの3桁を使用してください。 +::: + +このテーブルのスキーマは、ディスク上のコンパクトなストレージとクエリ速度を考慮して設計されました。 +- `radio`データは文字列ではなく`Enum8`(`UInt8`)として格納されています。 +- `mcc`または携帯国コードは、範囲が1から999であるため、`UInt16`として格納されています。 +- `lon`と`lat`は`Float64`です。 + +その他のフィールドはこのガイドでのクエリや視覚化には使用されていませんが、興味があれば上述のフォーラムで詳しく説明されています。 + +## Apache Supersetでの視覚化を作成する + +SupersetはDockerから簡単に実行できます。すでにSupersetが動作している場合は、`pip install clickhouse-connect`でClickHouse Connectを追加するだけです。Supersetをインストールする必要がある場合は、以下の**DockerでApache Supersetを起動**を直接参照してください。 + + + +OpenCelliDデータセットを使用してSupersetダッシュボードを構築するには: +- ClickHouseサービスをSupersetの**データベース**として追加する +- テーブル**cell_towers**をSupersetの**データセット**として追加する +- **チャート**を作成する +- チャートを**ダッシュボード**に追加する + +### ClickHouseサービスをSupersetデータベースとして追加する + + + + Supersetでは、データベースの種類を選択し、接続情報を提供することによってデータベースを追加できます。Supersetを開き、**+**を探し、それには**データ**、その後**データベース接続**オプションがあります。 + + ![データベースを追加](@site/docs/ja/getting-started/example-datasets/images/superset-add.png) + + リストから**ClickHouse Connect**を選択します: + + ![データベースタイプとしてClickHouse Connectを選択](@site/docs/ja/getting-started/example-datasets/images/superset-choose-a-database.png) + +:::note + **ClickHouse Connect**がオプションにない場合は、それをインストールする必要があります。コマンドは`pip install clickhouse-connect`です。詳細は[こちら](https://pypi.org/project/clickhouse-connect/)で確認できます。 +::: + +#### 接続情報を追加する: + +:::tip + ClickHouse CloudやSSLの使用が必須の他のClickHouseシステムに接続するときは、**SSL**をオンにすることを忘れないでください。 +::: + + ![SupersetデータソースとしてClickHouseを追加](@site/docs/ja/getting-started/example-datasets/images/superset-connect-a-database.png) + +### テーブル**cell_towers**をSuperset**データセット**として追加する + + Supersetでは、**データセット**はデータベース内のテーブルに対応しています。データセットを追加して、ClickHouseサービス、テーブルが含まれるデータベース(`default`)、`cell_towers`テーブルを選択します: + +![データセットとしてcell_towersテーブルを追加](@site/docs/ja/getting-started/example-datasets/images/superset-add-dataset.png) + +### **チャート**を作成する + +Supersetでチャートを追加するときには、データセット(`cell_towers`)とチャートタイプを指定する必要があります。OpenCelliDデータセットでは、携帯電話タワーの緯度と経度の座標が提供されているため、**マップ**チャートを作成します。**deck.gL Scatterplot**タイプは、このデータセットに適しており、地図上の密集したデータポイントに対応しています。 + +![Supersetでの地図作成](@site/docs/ja/getting-started/example-datasets/images/superset-create-map.png) + +#### 地図で使用するクエリを指定する + +deck.gl Scatterplotは経度と緯度を必要とし、クエリにフィルターを適用できます。この例では、UMTSラジオを持つ携帯電話タワーと、オランダに割り当てられたモバイル国コードのフィルターが適用されています。 + +`lon`および`lat`フィールドには、経度と緯度が含まれています: + +![経度と緯度フィールドを指定](@site/docs/ja/getting-started/example-datasets/images/superset-lon-lat.png) + +`mcc` = `204` のフィルターを追加します(または、任意の`mcc`値に置き換える): + +![MCC 204でフィルタリング](@site/docs/ja/getting-started/example-datasets/images/superset-mcc-204.png) + +`radio` = `'UMTS'` のフィルターを追加します(または、任意の`radio`値に置き換えることができます。`DESCRIBE TABLE cell_towers`の出力で選択肢を確認できます): + +![radio = UMTSでフィルタリング](@site/docs/ja/getting-started/example-datasets/images/superset-radio-umts.png) + +これは `radio = 'UMTS'` と `mcc = 204`でフィルタリングするチャートの完全な設定です: + +![MCC 204のUMTSラジオのチャート](@site/docs/ja/getting-started/example-datasets/images/superset-umts-netherlands.png) + +**UPDATE CHART**をクリックして、視覚化をレンダリングします。 + +### チャートを**ダッシュボード**に追加する + +このスクリーンショットでは、LTE、UMTS、およびGSMラジオを搭載した携帯電話タワーの位置が示されています。すべてのチャートは同じ方法で作成され、ダッシュボードに追加されます。 + + ![mcc 204のラジオタイプ別携帯電話タワーのダッシュボード](@site/docs/ja/getting-started/example-datasets/images/superset-cell-tower-dashboard.png) + +:::tip +このデータは[Playground](https://sql.clickhouse.com)でインタラクティブなクエリに利用できます。 + +この[例](https://sql.clickhouse.com?query_id=UV8M4MAGS2PWAUOAYAAARM)では、ユーザー名とクエリも自動的に入力されます。 + +Playgroundでテーブルを作成することはできませんが、すべてのクエリを実行し、Supersetを使用することもできます(ホスト名とポート番号を調整してください)。 +::: diff --git a/docs/ja/getting-started/example-datasets/covid19.md b/docs/ja/getting-started/example-datasets/covid19.md new file mode 100644 index 00000000000..74c79a271a9 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/covid19.md @@ -0,0 +1,265 @@ +--- +slug: /ja/getting-started/example-datasets/covid19 +sidebar_label: COVID-19 オープンデータ +--- + +# COVID-19 オープンデータ + +COVID-19 オープンデータは、最大のCovid-19疫学データベースを構築し、広範な共変量の強力なセットを提供することを試みています。人口統計、経済、疫学、地理、健康、入院、移動、政府の対応、天候などに関するオープンで公開されたデータが含まれています。 + +詳細はGitHubの[こちら](https://github.com/GoogleCloudPlatform/covid-19-open-data)にあります。 + +このデータをClickHouseに挿入するのは簡単です... + +:::note +以下のコマンドは [ClickHouse Cloud](https://clickhouse.cloud) の**本番環境**で実行されました。ローカルインストールでも簡単に実行できます。 +::: + +1. データの形を見てみましょう: + +```sql +DESCRIBE url( + 'https://storage.googleapis.com/covid19-open-data/v3/epidemiology.csv', + 'CSVWithNames' +); +``` + +このCSVファイルには10のカラムがあります: + +```response +┌─name─────────────────┬─type─────────────┐ +│ date │ Nullable(Date) │ +│ location_key │ Nullable(String) │ +│ new_confirmed │ Nullable(Int64) │ +│ new_deceased │ Nullable(Int64) │ +│ new_recovered │ Nullable(Int64) │ +│ new_tested │ Nullable(Int64) │ +│ cumulative_confirmed │ Nullable(Int64) │ +│ cumulative_deceased │ Nullable(Int64) │ +│ cumulative_recovered │ Nullable(Int64) │ +│ cumulative_tested │ Nullable(Int64) │ +└──────────────────────┴──────────────────┘ + +10 rows in set. Elapsed: 0.745 sec. +``` + +2. 次にいくつかの行を見てみましょう: + +```sql +SELECT * +FROM url('https://storage.googleapis.com/covid19-open-data/v3/epidemiology.csv') +LIMIT 100; +``` + +`url`関数はCSVファイルからデータを簡単に読み取ることができます: + +```response +┌─c1─────────┬─c2───────────┬─c3────────────┬─c4───────────┬─c5────────────┬─c6─────────┬─c7───────────────────┬─c8──────────────────┬─c9───────────────────┬─c10───────────────┐ +│ date │ location_key │ new_confirmed │ new_deceased │ new_recovered │ new_tested │ cumulative_confirmed │ cumulative_deceased │ cumulative_recovered │ cumulative_tested │ +│ 2020-04-03 │ AD │ 24 │ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 466 │ 17 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ 2020-04-04 │ AD │ 57 │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 523 │ 17 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ 2020-04-05 │ AD │ 17 │ 4 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 540 │ 21 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ 2020-04-06 │ AD │ 11 │ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 551 │ 22 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ 2020-04-07 │ AD │ 15 │ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 566 │ 24 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ 2020-04-08 │ AD │ 23 │ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 589 │ 26 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└────────────┴──────────────┴───────────────┴──────────────┴───────────────┴────────────┴──────────────────────┴─────────────────────┴──────────────────────┴───────────────────┘ +``` + +3. データの形がわかったので、テーブルを作成します: + +```sql +CREATE TABLE covid19 ( + date Date, + location_key LowCardinality(String), + new_confirmed Int32, + new_deceased Int32, + new_recovered Int32, + new_tested Int32, + cumulative_confirmed Int32, + cumulative_deceased Int32, + cumulative_recovered Int32, + cumulative_tested Int32 +) +ENGINE = MergeTree +ORDER BY (location_key, date); +``` + +4. 以下のコマンドは、`covid19`テーブルに全データセットを挿入します: + +```sql +INSERT INTO covid19 + SELECT * + FROM + url( + 'https://storage.googleapis.com/covid19-open-data/v3/epidemiology.csv', + CSVWithNames, + 'date Date, + location_key LowCardinality(String), + new_confirmed Int32, + new_deceased Int32, + new_recovered Int32, + new_tested Int32, + cumulative_confirmed Int32, + cumulative_deceased Int32, + cumulative_recovered Int32, + cumulative_tested Int32' + ); +``` + +5. 処理は非常に速く進行します - 挿入された行数を確認してみましょう: + +```sql +SELECT formatReadableQuantity(count()) +FROM covid19; +``` + +```response +┌─formatReadableQuantity(count())─┐ +│ 12.53 million │ +└─────────────────────────────────┘ +``` + +6. Covid-19に関して記録された総症例数を見てみましょう: + +```sql +SELECT formatReadableQuantity(sum(new_confirmed)) +FROM covid19; +``` + +```response +┌─formatReadableQuantity(sum(new_confirmed))─┐ +│ 1.39 billion │ +└────────────────────────────────────────────┘ +``` + +7. データには0が多く含まれていることに気づくでしょう - 週末や日々の報告がされなかった日です。ウィンドウ関数を使用して新しい症例の毎日の平均をスムーズにすることができます: + +```sql +SELECT + AVG(new_confirmed) OVER (PARTITION BY location_key ORDER BY date ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS cases_smoothed, + new_confirmed, + location_key, + date +FROM covid19; +``` + +8. このクエリは、各場所の最新値を決定します。すべての国が毎日報告したわけではないため、`max(date)`を使用することはできません。そのため、`ROW_NUMBER`を使用して最後の行を取得します: + +```sql +WITH latest_deaths_data AS + ( SELECT location_key, + date, + new_deceased, + new_confirmed, + ROW_NUMBER() OVER (PARTITION BY location_key ORDER BY date DESC) as rn + FROM covid19) +SELECT location_key, + date, + new_deceased, + new_confirmed, + rn +FROM latest_deaths_data +WHERE rn=1; +``` + +9. `lagInFrame`を使用して、各日の新しい症例の遅延を決定できます。このクエリでは`US_DC`の場所でフィルタリングします: + +```sql +SELECT + new_confirmed - lagInFrame(new_confirmed,1) OVER (PARTITION BY location_key ORDER BY date) AS confirmed_cases_delta, + new_confirmed, + location_key, + date +FROM covid19 +WHERE location_key = 'US_DC'; +``` + +出力は以下のようになります: + +```response +┌─confirmed_cases_delta─┬─new_confirmed─┬─location_key─┬───────date─┐ +│ 0 │ 0 │ US_DC │ 2020-03-08 │ +│ 2 │ 2 │ US_DC │ 2020-03-09 │ +│ -2 │ 0 │ US_DC │ 2020-03-10 │ +│ 6 │ 6 │ US_DC │ 2020-03-11 │ +│ -6 │ 0 │ US_DC │ 2020-03-12 │ +│ 0 │ 0 │ US_DC │ 2020-03-13 │ +│ 6 │ 6 │ US_DC │ 2020-03-14 │ +│ -5 │ 1 │ US_DC │ 2020-03-15 │ +│ 4 │ 5 │ US_DC │ 2020-03-16 │ +│ 4 │ 9 │ US_DC │ 2020-03-17 │ +│ -1 │ 8 │ US_DC │ 2020-03-18 │ +│ 24 │ 32 │ US_DC │ 2020-03-19 │ +│ -26 │ 6 │ US_DC │ 2020-03-20 │ +│ 15 │ 21 │ US_DC │ 2020-03-21 │ +│ -3 │ 18 │ US_DC │ 2020-03-22 │ +│ 3 │ 21 │ US_DC │ 2020-03-23 │ +``` + +10. このクエリは、各日の新しい症例の変化率を計算し、結果セットに単純な`増加`または`減少`の列を含めます: + +```sql +WITH confirmed_lag AS ( + SELECT + *, + lagInFrame(new_confirmed) OVER( + PARTITION BY location_key + ORDER BY date + ) AS confirmed_previous_day + FROM covid19 +), +confirmed_percent_change AS ( + SELECT + *, + COALESCE(ROUND((new_confirmed - confirmed_previous_day) / confirmed_previous_day * 100), 0) AS percent_change + FROM confirmed_lag +) +SELECT + date, + new_confirmed, + percent_change, + CASE + WHEN percent_change > 0 THEN 'increase' + WHEN percent_change = 0 THEN 'no change' + ELSE 'decrease' + END AS trend +FROM confirmed_percent_change +WHERE location_key = 'US_DC'; +``` + +結果は次のようになります + +```response +┌───────date─┬─new_confirmed─┬─percent_change─┬─trend─────┐ +│ 2020-03-08 │ 0 │ nan │ decrease │ +│ 2020-03-09 │ 2 │ inf │ increase │ +│ 2020-03-10 │ 0 │ -100 │ decrease │ +│ 2020-03-11 │ 6 │ inf │ increase │ +│ 2020-03-12 │ 0 │ -100 │ decrease │ +│ 2020-03-13 │ 0 │ nan │ decrease │ +│ 2020-03-14 │ 6 │ inf │ increase │ +│ 2020-03-15 │ 1 │ -83 │ decrease │ +│ 2020-03-16 │ 5 │ 400 │ increase │ +│ 2020-03-17 │ 9 │ 80 │ increase │ +│ 2020-03-18 │ 8 │ -11 │ decrease │ +│ 2020-03-19 │ 32 │ 300 │ increase │ +│ 2020-03-20 │ 6 │ -81 │ decrease │ +│ 2020-03-21 │ 21 │ 250 │ increase │ +│ 2020-03-22 │ 18 │ -14 │ decrease │ +│ 2020-03-23 │ 21 │ 17 │ increase │ +│ 2020-03-24 │ 46 │ 119 │ increase │ +│ 2020-03-25 │ 48 │ 4 │ increase │ +│ 2020-03-26 │ 36 │ -25 │ decrease │ +│ 2020-03-27 │ 37 │ 3 │ increase │ +│ 2020-03-28 │ 38 │ 3 │ increase │ +│ 2020-03-29 │ 59 │ 55 │ increase │ +│ 2020-03-30 │ 94 │ 59 │ increase │ +│ 2020-03-31 │ 91 │ -3 │ decrease │ +│ 2020-04-01 │ 67 │ -26 │ decrease │ +│ 2020-04-02 │ 104 │ 55 │ increase │ +│ 2020-04-03 │ 145 │ 39 │ increase │ +``` + +:::note +[GitHubリポジトリ](https://github.com/GoogleCloudPlatform/covid-19-open-data)に記載されているように、このデータセットは2022年9月15日をもって更新が終了しています。 +::: diff --git a/docs/ja/getting-started/example-datasets/criteo.md b/docs/ja/getting-started/example-datasets/criteo.md new file mode 100644 index 00000000000..8f2e2e975ce --- /dev/null +++ b/docs/ja/getting-started/example-datasets/criteo.md @@ -0,0 +1,166 @@ +--- +slug: /ja/getting-started/example-datasets/criteo +sidebar_label: Criteoのテラバイトクリックログ +--- + +# Criteoのテラバイトクリックログ + +データを以下からダウンロードします:http://labs.criteo.com/downloads/download-terabyte-click-logs/ + +ログをインポートするためのテーブルを作成します: + +``` sql +CREATE TABLE criteo_log ( + date Date, + clicked UInt8, + int1 Int32, + int2 Int32, + int3 Int32, + int4 Int32, + int5 Int32, + int6 Int32, + int7 Int32, + int8 Int32, + int9 Int32, + int10 Int32, + int11 Int32, + int12 Int32, + int13 Int32, + cat1 String, + cat2 String, + cat3 String, + cat4 String, + cat5 String, + cat6 String, + cat7 String, + cat8 String, + cat9 String, + cat10 String, + cat11 String, + cat12 String, + cat13 String, + cat14 String, + cat15 String, + cat16 String, + cat17 String, + cat18 String, + cat19 String, + cat20 String, + cat21 String, + cat22 String, + cat23 String, + cat24 String, + cat25 String, + cat26 String +) ENGINE = Log; +``` + +データを挿入します: + +``` bash +$ for i in {00..23}; do echo $i; zcat datasets/criteo/day_${i#0}.gz | sed -r 's/^/2000-01-'${i/00/24}'\t/' | clickhouse-client --host=example-perftest01j --query="INSERT INTO criteo_log FORMAT TabSeparated"; done +``` + +変換されたデータのためのテーブルを作成します: + +``` sql +CREATE TABLE criteo +( + date Date, + clicked UInt8, + int1 Int32, + int2 Int32, + int3 Int32, + int4 Int32, + int5 Int32, + int6 Int32, + int7 Int32, + int8 Int32, + int9 Int32, + int10 Int32, + int11 Int32, + int12 Int32, + int13 Int32, + icat1 UInt32, + icat2 UInt32, + icat3 UInt32, + icat4 UInt32, + icat5 UInt32, + icat6 UInt32, + icat7 UInt32, + icat8 UInt32, + icat9 UInt32, + icat10 UInt32, + icat11 UInt32, + icat12 UInt32, + icat13 UInt32, + icat14 UInt32, + icat15 UInt32, + icat16 UInt32, + icat17 UInt32, + icat18 UInt32, + icat19 UInt32, + icat20 UInt32, + icat21 UInt32, + icat22 UInt32, + icat23 UInt32, + icat24 UInt32, + icat25 UInt32, + icat26 UInt32 +) ENGINE = MergeTree() +PARTITION BY toYYYYMM(date) +ORDER BY (date, icat1) +``` + +生ログからデータを変換して、2番目のテーブルに入れます: + +``` sql +INSERT INTO + criteo +SELECT + date, + clicked, + int1, + int2, + int3, + int4, + int5, + int6, + int7, + int8, + int9, + int10, + int11, + int12, + int13, + reinterpretAsUInt32(unhex(cat1)) AS icat1, + reinterpretAsUInt32(unhex(cat2)) AS icat2, + reinterpretAsUInt32(unhex(cat3)) AS icat3, + reinterpretAsUInt32(unhex(cat4)) AS icat4, + reinterpretAsUInt32(unhex(cat5)) AS icat5, + reinterpretAsUInt32(unhex(cat6)) AS icat6, + reinterpretAsUInt32(unhex(cat7)) AS icat7, + reinterpretAsUInt32(unhex(cat8)) AS icat8, + reinterpretAsUInt32(unhex(cat9)) AS icat9, + reinterpretAsUInt32(unhex(cat10)) AS icat10, + reinterpretAsUInt32(unhex(cat11)) AS icat11, + reinterpretAsUInt32(unhex(cat12)) AS icat12, + reinterpretAsUInt32(unhex(cat13)) AS icat13, + reinterpretAsUInt32(unhex(cat14)) AS icat14, + reinterpretAsUInt32(unhex(cat15)) AS icat15, + reinterpretAsUInt32(unhex(cat16)) AS icat16, + reinterpretAsUInt32(unhex(cat17)) AS icat17, + reinterpretAsUInt32(unhex(cat18)) AS icat18, + reinterpretAsUInt32(unhex(cat19)) AS icat19, + reinterpretAsUInt32(unhex(cat20)) AS icat20, + reinterpretAsUInt32(unhex(cat21)) AS icat21, + reinterpretAsUInt32(unhex(cat22)) AS icat22, + reinterpretAsUInt32(unhex(cat23)) AS icat23, + reinterpretAsUInt32(unhex(cat24)) AS icat24, + reinterpretAsUInt32(unhex(cat25)) AS icat25, + reinterpretAsUInt32(unhex(cat26)) AS icat26 +FROM + criteo_log; + +DROP TABLE criteo_log; +``` diff --git a/docs/ja/getting-started/example-datasets/environmental-sensors.md b/docs/ja/getting-started/example-datasets/environmental-sensors.md new file mode 100644 index 00000000000..8bc08f4ecaa --- /dev/null +++ b/docs/ja/getting-started/example-datasets/environmental-sensors.md @@ -0,0 +1,173 @@ +--- +slug: /ja/getting-started/example-datasets/environmental-sensors +sidebar_label: 環境センサーのデータ +--- + +# 環境センサーのデータ + +[Sensor.Community](https://sensor.community/en/) は、オープン環境データを生成する共同作業型グローバルセンサーネットワークです。このデータは、世界中のセンサーから収集されています。誰でもセンサーを購入して、好きな場所に設置することができます。データをダウンロードするためのAPIは [GitHub](https://github.com/opendata-stuttgart/meta/wiki/APIs) にあり、データは [Database Contents License (DbCL)](https://opendatacommons.org/licenses/dbcl/1-0/) の下で自由に利用可能です。 + +:::important +このデータセットには200億以上のレコードがあるため、以下のコマンドを単純にコピー&ペーストする場合は、リソースがこのボリュームに耐えられるか注意が必要です。以下のコマンドは、[ClickHouse Cloud](https://clickhouse.cloud) の**本番**インスタンスで実行されています。 +::: + +1. データはS3にあるので、`s3`テーブル関数を使用してファイルからテーブルを作成できます。また、データをそのままクエリすることもできます。ClickHouseに挿入する前にいくつかの行を見てみましょう: + +```sql +SELECT * +FROM s3( + 'https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/sensors/monthly/2019-06_bmp180.csv.zst', + 'CSVWithNames' + ) +LIMIT 10 +SETTINGS format_csv_delimiter = ';'; +``` + +データはCSVファイルにあり、デリミタとしてセミコロンを使用しています。行の形式は次のようになっています: + +```response +┌─sensor_id─┬─sensor_type─┬─location─┬────lat─┬────lon─┬─timestamp───────────┬──pressure─┬─altitude─┬─pressure_sealevel─┬─temperature─┐ +│ 9119 │ BMP180 │ 4594 │ 50.994 │ 7.126 │ 2019-06-01T00:00:00 │ 101471 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.9 │ +│ 21210 │ BMP180 │ 10762 │ 42.206 │ 25.326 │ 2019-06-01T00:00:00 │ 99525 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.3 │ +│ 19660 │ BMP180 │ 9978 │ 52.434 │ 17.056 │ 2019-06-01T00:00:04 │ 101570 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 15.3 │ +│ 12126 │ BMP180 │ 6126 │ 57.908 │ 16.49 │ 2019-06-01T00:00:05 │ 101802.56 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 8.07 │ +│ 15845 │ BMP180 │ 8022 │ 52.498 │ 13.466 │ 2019-06-01T00:00:05 │ 101878 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 23 │ +│ 16415 │ BMP180 │ 8316 │ 49.312 │ 6.744 │ 2019-06-01T00:00:06 │ 100176 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 14.7 │ +│ 7389 │ BMP180 │ 3735 │ 50.136 │ 11.062 │ 2019-06-01T00:00:06 │ 98905 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 12.1 │ +│ 13199 │ BMP180 │ 6664 │ 52.514 │ 13.44 │ 2019-06-01T00:00:07 │ 101855.54 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 19.74 │ +│ 12753 │ BMP180 │ 6440 │ 44.616 │ 2.032 │ 2019-06-01T00:00:07 │ 99475 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 17 │ +│ 16956 │ BMP180 │ 8594 │ 52.052 │ 8.354 │ 2019-06-01T00:00:08 │ 101322 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 17.2 │ +└───────────┴─────────────┴──────────┴────────┴────────┴─────────────────────┴───────────┴──────────┴───────────────────┴─────────────┘ +``` + +2. データをClickHouseに保存するために、以下の`MergeTree`テーブルを使用します: + +```sql +CREATE TABLE sensors +( + sensor_id UInt16, + sensor_type Enum('BME280', 'BMP180', 'BMP280', 'DHT22', 'DS18B20', 'HPM', 'HTU21D', 'PMS1003', 'PMS3003', 'PMS5003', 'PMS6003', 'PMS7003', 'PPD42NS', 'SDS011'), + location UInt32, + lat Float32, + lon Float32, + timestamp DateTime, + P1 Float32, + P2 Float32, + P0 Float32, + durP1 Float32, + ratioP1 Float32, + durP2 Float32, + ratioP2 Float32, + pressure Float32, + altitude Float32, + pressure_sealevel Float32, + temperature Float32, + humidity Float32, + date Date MATERIALIZED toDate(timestamp) +) +ENGINE = MergeTree +ORDER BY (timestamp, sensor_id); +``` + +3. ClickHouse Cloud サービスには `default` という名前のクラスタがあります。`s3Cluster` テーブル関数を使用して、クラスタ内のノードからS3ファイルを並行して読み込みます。(クラスタがない場合は、単に `s3` 関数を使用し、クラスタ名を削除してください。) + +このクエリには時間がかかります - 圧縮されていないデータが約1.67Tあります: + +```sql +INSERT INTO sensors + SELECT * + FROM s3Cluster( + 'default', + 'https://clickhouse-public-datasets.s3.amazonaws.com/sensors/monthly/*.csv.zst', + 'CSVWithNames', + $$ sensor_id UInt16, + sensor_type String, + location UInt32, + lat Float32, + lon Float32, + timestamp DateTime, + P1 Float32, + P2 Float32, + P0 Float32, + durP1 Float32, + ratioP1 Float32, + durP2 Float32, + ratioP2 Float32, + pressure Float32, + altitude Float32, + pressure_sealevel Float32, + temperature Float32, + humidity Float32 $$ + ) +SETTINGS + format_csv_delimiter = ';', + input_format_allow_errors_ratio = '0.5', + input_format_allow_errors_num = 10000, + input_format_parallel_parsing = 0, + date_time_input_format = 'best_effort', + max_insert_threads = 32, + parallel_distributed_insert_select = 1; +``` + +以下はレスポンスです - 行数と処理速度を示しています。6M行/秒以上の速度で入力されています! + +```response +0 rows in set. Elapsed: 3419.330 sec. Processed 20.69 billion rows, 1.67 TB (6.05 million rows/s., 488.52 MB/s.) +``` + +4. `sensors` テーブルのストレージディスクがどれくらい必要か見てみましょう: + +```sql +SELECT + disk_name, + formatReadableSize(sum(data_compressed_bytes) AS size) AS compressed, + formatReadableSize(sum(data_uncompressed_bytes) AS usize) AS uncompressed, + round(usize / size, 2) AS compr_rate, + sum(rows) AS rows, + count() AS part_count +FROM system.parts +WHERE (active = 1) AND (table = 'sensors') +GROUP BY + disk_name +ORDER BY size DESC; +``` + +1.67Tは310 GiBに圧縮されており、20.69億行があります: + +```response +┌─disk_name─┬─compressed─┬─uncompressed─┬─compr_rate─┬────────rows─┬─part_count─┐ +│ s3disk │ 310.21 GiB │ 1.30 TiB │ 4.29 │ 20693971809 │ 472 │ +└───────────┴────────────┴──────────────┴────────────┴─────────────┴────────────┘ +``` + +5. それでは、データをClickHouseにインポートしたので、分析を行いましょう。センサーが増えたことで、データの量が時間とともに増加していることに注目してください: + +```sql +SELECT + date, + count() +FROM sensors +GROUP BY date +ORDER BY date ASC; +``` + +SQLコンソールで結果を可視化するためにチャートを作成できます: + +![Number of events per day](./images/sensors_01.png) + +6. 次のクエリは、非常に暑く湿度の高い日数をカウントします: + +```sql +WITH + toYYYYMMDD(timestamp) AS day +SELECT day, count() FROM sensors +WHERE temperature >= 40 AND temperature <= 50 AND humidity >= 90 +GROUP BY day +ORDER BY day asc; +``` + +こちらがその結果の視覚化です: + +![Hot and humid days](./images/sensors_02.png) + + diff --git a/docs/ja/getting-started/example-datasets/github-events.md b/docs/ja/getting-started/example-datasets/github-events.md new file mode 100644 index 00000000000..ddcf81f6a6c --- /dev/null +++ b/docs/ja/getting-started/example-datasets/github-events.md @@ -0,0 +1,9 @@ +--- +slug: /ja/getting-started/example-datasets/github-events +sidebar_label: GitHub Events +title: "GitHub Events データセット" +--- + +このデータセットには、2011年から2020年12月6日までのGitHub上のすべてのイベントが含まれており、サイズは31億件のレコードです。ダウンロードサイズは75 GBで、lz4圧縮を使用したテーブルに格納する場合、最大200 GBのディスクスペースが必要です。 + +データセットの詳細な説明、洞察、ダウンロード手順、およびインタラクティブなクエリは[こちら](https://ghe.clickhouse.tech/)に掲載されています。 diff --git a/docs/ja/getting-started/example-datasets/github.md b/docs/ja/getting-started/example-datasets/github.md new file mode 100644 index 00000000000..252737caaf9 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/github.md @@ -0,0 +1,2491 @@ +--- +slug: /ja/getting-started/example-datasets/github +sidebar_label: Githubリポジトリ +sidebar_position: 1 +description: ClickHouseのGitHubリポジトリまたはお好みのリポジトリを分析します +--- + +# GitHubデータを使用したClickHouseでのクエリ記述 + +このデータセットには、ClickHouseリポジトリのすべてのコミットと変更が含まれています。これは、ClickHouseに付属しているネイティブの`git-import`ツールを使用して生成できます。 + +生成されたデータは、以下の各テーブルに対して`tsv`ファイルを提供します: + +- `commits` - 統計を伴うコミット。 +- `file_changes` - 各コミットで変更されたファイルと、その変更に関する情報および統計。 +- `line_changes` - 各コミットで変更されたファイル内の変更行、およびその行に関する完全な情報および前回の変更に関する情報。 + +2022年11月8日時点で、各TSVファイルのサイズと行数はおおよそ以下の通りです: + +- `commits` - 7.8M - 266,051行 +- `file_changes` - 53M - 266,051行 +- `line_changes` - 2.7G - 7,535,157行 + +# 目次 + +- [GitHubデータを使用したClickHouseでのクエリ記述](#githubデータを使用したclickhouseでのクエリ記述) +- [目次](#目次) +- [データの生成](#データの生成) +- [データのダウンロードと挿入](#データのダウンロードと挿入) +- [クエリ](#クエリ) + - [単一ファイルの履歴](#単一ファイルの履歴) + - [現在のアクティブファイルを見つける](#現在のアクティブファイルを見つける) + - [最も多く変更されたファイルをリストする](#最も多く変更されたファイルをリストする) + - [コミットは通常、週のどの日に発生するか?](#コミットは通常週のどの日に発生するか) + - [サブディレクトリ/ファイルの履歴 - 行数、コミット数、寄稿者数の推移](#サブディレクトリファイルの履歴---行数コミット数寄稿者数の推移) + - [最大著者数のファイルリスト](#最大著者数のファイルリスト) + - [リポジトリ内の最古のコード行](#リポジトリ内の最古のコード行) + - [最も古い履歴を持つファイル](#最も古い履歴を持つファイル) + - [ドキュメントとコードに関する寄稿者の分布](#ドキュメントとコードに関する寄稿者の分布) + - [最も多様な影響を持つ著者](#最も多様な影響を持つ著者) + - [著者のお気に入りファイル](#著者のお気に入りファイル) + - [著者数が最も少ない最大ファイル](#著者数が最も少ない最大ファイル) + - [コミットとコード行の時間別分布; 曜日別、著者別; 特定のサブディレクトリ用](#コミットとコード行の時間別分布-曜日別著者別-特定のサブディレクトリ用) + - [著者の行列:他の著者のコードを書き直す傾向を示す](#著者の行列他の著者のコードを書き直す傾向を示す) + - [曜日ごとの最高貢献者は誰ですか?](#曜日ごとの最高貢献者は誰ですか) + - [リポジトリ全体のコード年齢の分布](#リポジトリ全体のコード年齢の分布) + - [各著者のコードの何パーセントが他の著者によって削除されたか?](#各著者のコードの何パーセントが他の著者によって削除されたか) + - [最も多く書き直されたファイルのリスト?](#最も多く書き直されたファイルのリスト) + - [コードがリポジトリに留まる可能性が最も高い曜日は?](#コードがリポジトリに留まる可能性が最も高い曜日は) + - [平均コード年齢でソートされたファイル](#平均コード年齢でソートされたファイル) + - [誰がより多くのテスト/CPPコード/コメントを書く傾向があるのか?](#誰がより多くのテストcppコードコメントを書く傾向があるのか) + - [著者のコミットが時間経過とともにコード/コメントの割合に関してどのように変化するのか?](#著者のコミットが時間経過とともにコードコメントの割合に関してどのように変化するのか) + - [コードが書き換えられるまでの平均時間と中央値(コードの decay の半減期)は?](#コードが書き換えられるまでの平均時間と中央値コードの-decay-の半減期は) + - [どのような時がコードが書き換えられる可能性が最も高いのか?](#どのような時がコードが書き換えられる可能性が最も高いのか) + - [どの著者のコードが最も安定しているか?](#どの著者のコードが最も安定しているか) + - [ある著者による最も連続したコミットの日数](#ある著者による最も連続したコミットの日数) + - [ファイルの行ごとのコミット履歴](#ファイルの行ごとのコミット履歴) +- [未解決の質問](#未解決の質問) + - [Git blame](#git-blame) + - [関連コンテンツ](#関連コンテンツ) + +# データの生成 + +これは任意です。データは自由に配布しています - [データのダウンロードと挿入](#データのダウンロードと挿入)を参照してください。 + +```bash +git clone git@github.com:ClickHouse/ClickHouse.git +cd ClickHouse +clickhouse git-import --skip-paths 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' --skip-commits-with-messages '^Merge branch ' +``` + +この操作は、ClickHouseリポジトリに対して約3分(2022年11月8日時点のMacBook Pro 2021で)かかります。 + +利用可能なオプションの完全なリストは、ツールのネイティブヘルプから取得できます。 + +```bash +clickhouse git-import -h +``` + +このヘルプでは、上記の各テーブルのDDLも提供されます。例えば: + +``` +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; +``` + +**これらのクエリは、どのリポジトリでも機能するはずです。自由に探索して、結果を報告してください** 実行時間に関するいくつかのガイドライン(2022年11月時点): + +- Linux - `~/clickhouse git-import` - 160分 + +# データのダウンロードと挿入 + +以下のデータを使用して、作業環境を再現できます。あるいは、このデータセットはplay.clickhouse.comで入手可能です - 詳細は[クエリ](#クエリ)を参照してください。 + +以下のリポジトリのために生成されたファイルが見つかります: + +- ClickHouse(2022年11月8日) + - https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/commits.tsv.xz - 2.5 MB + - https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/file_changes.tsv.xz - 4.5MB + - https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/line_changes.tsv.xz - 127.4 MB +- Linux(2022年11月8日) + - https://datasets-documentation.s3.amazonaws.com/github/commits/linux/commits.tsv.xz - 44 MB + - https://datasets-documentation.s3.amazonaws.com/github/commits/linux/file_changes.tsv.xz - 467MB + - https://datasets-documentation.s3.amazonaws.com/github/commits/linux/line_changes.tsv.xz - 1.1G + +このデータを挿入するには、以下のクエリを実行してデータベースを準備します: + +```sql +DROP DATABASE IF EXISTS git; +CREATE DATABASE git; + +CREATE TABLE git.commits +( + hash String, + author LowCardinality(String), + time DateTime, + message String, + files_added UInt32, + files_deleted UInt32, + files_renamed UInt32, + files_modified UInt32, + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.file_changes +( + change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + lines_added UInt32, + lines_deleted UInt32, + hunks_added UInt32, + hunks_removed UInt32, + hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; + +CREATE TABLE git.line_changes +( + sign Int8, + line_number_old UInt32, + line_number_new UInt32, + hunk_num UInt32, + hunk_start_line_number_old UInt32, + hunk_start_line_number_new UInt32, + hunk_lines_added UInt32, + hunk_lines_deleted UInt32, + hunk_context LowCardinality(String), + line LowCardinality(String), + indent UInt8, + line_type Enum('Empty' = 0, 'Comment' = 1, 'Punct' = 2, 'Code' = 3), + + prev_commit_hash String, + prev_author LowCardinality(String), + prev_time DateTime, + + file_change_type Enum('Add' = 1, 'Delete' = 2, 'Modify' = 3, 'Rename' = 4, 'Copy' = 5, 'Type' = 6), + path LowCardinality(String), + old_path LowCardinality(String), + file_extension LowCardinality(String), + file_lines_added UInt32, + file_lines_deleted UInt32, + file_hunks_added UInt32, + file_hunks_removed UInt32, + file_hunks_changed UInt32, + + commit_hash String, + author LowCardinality(String), + time DateTime, + commit_message String, + commit_files_added UInt32, + commit_files_deleted UInt32, + commit_files_renamed UInt32, + commit_files_modified UInt32, + commit_lines_added UInt32, + commit_lines_deleted UInt32, + commit_hunks_added UInt32, + commit_hunks_removed UInt32, + commit_hunks_changed UInt32 +) ENGINE = MergeTree ORDER BY time; +``` + +データを挿入するには、`INSERT INTO SELECT`と[s3機能](https://clickhouse.com/docs/ja/integrations/s3/s3-table-functions/)を使用します。例えば、以下のようにClickHouseファイルをそれぞれのテーブルに挿入します: + +*commits* + +```sql +INSERT INTO git.commits SELECT * +FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/commits.tsv.xz', 'TSV', 'hash String,author LowCardinality(String), time DateTime, message String, files_added UInt32, files_deleted UInt32, files_renamed UInt32, files_modified UInt32, lines_added UInt32, lines_deleted UInt32, hunks_added UInt32, hunks_removed UInt32, hunks_changed UInt32') + +0 rows in set. Elapsed: 1.826 sec. Processed 62.78 thousand rows, 8.50 MB (34.39 thousand rows/s., 4.66 MB/s.) +``` + +*file_changes* + +```sql +INSERT INTO git.file_changes SELECT * +FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/file_changes.tsv.xz', 'TSV', 'change_type Enum(\'Add\' = 1, \'Delete\' = 2, \'Modify\' = 3, \'Rename\' = 4, \'Copy\' = 5, \'Type\' = 6), path LowCardinality(String), old_path LowCardinality(String), file_extension LowCardinality(String), lines_added UInt32, lines_deleted UInt32, hunks_added UInt32, hunks_removed UInt32, hunks_changed UInt32, commit_hash String, author LowCardinality(String), time DateTime, commit_message String, commit_files_added UInt32, commit_files_deleted UInt32, commit_files_renamed UInt32, commit_files_modified UInt32, commit_lines_added UInt32, commit_lines_deleted UInt32, commit_hunks_added UInt32, commit_hunks_removed UInt32, commit_hunks_changed UInt32') + +0 rows in set. Elapsed: 2.688 sec. Processed 266.05 thousand rows, 48.30 MB (98.97 thousand rows/s., 17.97 MB/s.) +``` + +*line_changes* + +```sql +INSERT INTO git.line_changes SELECT * +FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/line_changes.tsv.xz', 'TSV', ' sign Int8, line_number_old UInt32, line_number_new UInt32, hunk_num UInt32, hunk_start_line_number_old UInt32, hunk_start_line_number_new UInt32, hunk_lines_added UInt32,\n hunk_lines_deleted UInt32, hunk_context LowCardinality(String), line LowCardinality(String), indent UInt8, line_type Enum(\'Empty\' = 0, \'Comment\' = 1, \'Punct\' = 2, \'Code\' = 3), prev_commit_hash String, prev_author LowCardinality(String), prev_time DateTime, file_change_type Enum(\'Add\' = 1, \'Delete\' = 2, \'Modify\' = 3, \'Rename\' = 4, \'Copy\' = 5, \'Type\' = 6),\n path LowCardinality(String), old_path LowCardinality(String), file_extension LowCardinality(String), file_lines_added UInt32, file_lines_deleted UInt32, file_hunks_added UInt32, file_hunks_removed UInt32, file_hunks_changed UInt32, commit_hash String,\n author LowCardinality(String), time DateTime, commit_message String, commit_files_added UInt32, commit_files_deleted UInt32, commit_files_renamed UInt32, commit_files_modified UInt32, commit_lines_added UInt32, commit_lines_deleted UInt32, commit_hunks_added UInt32, commit_hunks_removed UInt32, commit_hunks_changed UInt32') + +0 rows in set. Elapsed: 50.535 sec. Processed 7.54 million rows, 2.09 GB (149.11 thousand rows/s., 41.40 MB/s.) +``` + +# クエリ + +ツールはヘルプ出力に基づいて、いくつかのクエリを提案しています。私たちは、これらに加えて、興味深い追加のクエリにも回答しています。これらのクエリは、ツールの任意の順序に対しておおよそ増加する複雑さを持っています。 + +このデータセットは、`git_clickhouse`データベースで[play.clickhouse.com](https://sql.clickhouse.com?query_id=DCQPNPAIMAQXRLHYURLKVJ)で入手可能です。すべてのクエリのために、この環境へのリンクを提供しますが、データベース名は必要に応じて調整します。データ収集の時期によって、playの結果はここに表示されているものと異なる場合があります。 + +## 単一ファイルの履歴 + +最もシンプルなクエリです。ここでは、`StorageReplicatedMergeTree.cpp`のすべてのコミットメッセージを表示します。これらはより興味深いものが多いので、最新のメッセージを最初に表示するようにソートします。 + +[play](https://sql.clickhouse.com?query_id=COAZRFX2YFULDBXRQTCQ1S) + +```sql +SELECT + time, + substring(commit_hash, 1, 11) AS commit, + change_type, + author, + path, + old_path, + lines_added, + lines_deleted, + commit_message +FROM git.file_changes +WHERE path = 'src/Storages/StorageReplicatedMergeTree.cpp' +ORDER BY time DESC +LIMIT 10 + +┌────────────────time─┬─commit──────┬─change_type─┬─author─────────────┬─path────────────────────────────────────────┬─old_path─┬─lines_added─┬─lines_deleted─┬─commit_message───────────────────────────────────┐ +│ 2022-10-30 16:30:51 │ c68ab231f91 │ Modify │ Alexander Tokmakov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 13 │ 10 │ partを削除状態でアクセスする修正 │ +│ 2022-10-23 16:24:20 │ b40d9200d20 │ Modify │ Anton Popov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 28 │ 30 │ DataPartStorageの定数性のセマンティクス向上 │ +│ 2022-10-23 01:23:15 │ 56e5daba0c9 │ Modify │ Anton Popov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 28 │ 44 │ DataPartStorageBuilderを削除 │ +│ 2022-10-21 13:35:37 │ 851f556d65a │ Modify │ Igor Nikonov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 3 │ 2 │ 使用されていないパラメータを削除 │ +│ 2022-10-21 13:02:52 │ 13d31eefbc3 │ Modify │ Igor Nikonov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 4 │ 4 │ Replicated merge treeの改良 │ +│ 2022-10-21 12:25:19 │ 4e76629aafc │ Modify │ Azat Khuzhin │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 3 │ 2 │ -Wshorten-64-to-32への修正 │ +│ 2022-10-19 13:59:28 │ 05e6b94b541 │ Modify │ Antonio Andelic │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 4 │ 0 │ 改良 │ +│ 2022-10-19 13:34:20 │ e5408aac991 │ Modify │ Antonio Andelic │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 3 │ 53 │ 論理を簡素化 │ +│ 2022-10-18 15:36:11 │ 7befe2825c9 │ Modify │ Alexey Milovidov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 2 │ 2 │ StorageReplicatedMergeTree.cppの更新 │ +│ 2022-10-18 15:35:44 │ 0623ad4e374 │ Modify │ Alexey Milovidov │ src/Storages/StorageReplicatedMergeTree.cpp │ │ 1 │ 1 │ StorageReplicatedMergeTree.cppの更新 │ +└─────────────────────┴─────────────┴─────────────┴────────────────────┴─────────────────────────────────────────────┴──────────┴─────────────┴───────────────┴──────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.006 sec. Processed 12.10 thousand rows, 1.60 MB (1.93 million rows/s., 255.40 MB/s.) +``` + +リネームイベントの前に存在していた変更は表示しないため、リネームを除外し、行変更を確認することもできます: + +[play](https://sql.clickhouse.com?query_id=AKS9SYLARFMZCHGAAQNEBN) + +```sql +SELECT + time, + substring(commit_hash, 1, 11) AS commit, + sign, + line_number_old, + line_number_new, + author, + line +FROM git.line_changes +WHERE path = 'src/Storages/StorageReplicatedMergeTree.cpp' +ORDER BY line_number_new ASC +LIMIT 10 + +┌────────────────time─┬─commit──────┬─sign─┬─line_number_old─┬─line_number_new─┬─author───────────┬─line──────────────────────────────────────────────────┐ +│ 2020-04-16 02:06:10 │ cdeda4ab915 │ -1 │ 1 │ 1 │ Alexey Milovidov │ #include │ +│ 2020-04-16 02:06:10 │ cdeda4ab915 │ 1 │ 2 │ 1 │ Alexey Milovidov │ #include │ +│ 2020-04-16 02:06:10 │ cdeda4ab915 │ 1 │ 2 │ 2 │ Alexey Milovidov │ │ +│ 2021-05-03 23:46:51 │ 02ce9cc7254 │ -1 │ 3 │ 2 │ Alexey Milovidov │ #include │ +│ 2021-05-27 22:21:02 │ e2f29b9df02 │ -1 │ 3 │ 2 │ s-kat │ #include │ +│ 2022-10-03 22:30:50 │ 210882b9c4d │ 1 │ 2 │ 3 │ alesapin │ #include │ +│ 2022-10-23 16:24:20 │ b40d9200d20 │ 1 │ 2 │ 3 │ Anton Popov │ #include │ +│ 2021-06-20 09:24:43 │ 4c391f8e994 │ 1 │ 2 │ 3 │ Mike Kot │ #include "Common/hex.h" │ +│ 2021-12-29 09:18:56 │ 8112a712336 │ -1 │ 6 │ 5 │ avogar │ #include │ +│ 2022-04-21 20:19:13 │ 9133e398b8c │ 1 │ 11 │ 12 │ Nikolai Kochetov │ #include │ +└─────────────────────┴─────────────┴──────┴─────────────────┴─────────────────┴──────────────────┴───────────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.258 sec. Processed 7.54 million rows, 654.92 MB (29.24 million rows/s., 2.54 GB/s.) +``` + +リネームを考慮したファイルの[行ごとのコミット履歴](#行ごとのコミット履歴)を見つけるよりも複雑なクエリもあります。 + +## 現在のアクティブファイルを見つける + +これは、リポジトリ内の現在のファイルのみを考慮したい後の分析にとって重要です。このセットは、リネームまたは削除(および再追加/リネーム)されていないファイルとして推定します。 + +**dbms、libs、tests/testflows/ディレクトリ内のファイルに関して壊れたコミット履歴があったようです。したがって、これらも除外します。** + +[play](https://sql.clickhouse.com?query_id=2HNFWPCFWEEY92WTAPMA7W) + +```sql +SELECT path +FROM +( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path +) +GROUP BY path +HAVING (argMax(change_type, last_time) != 2) AND NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)') ORDER BY path +LIMIT 10 + +┌─path────────────────────────────────────────────────────────────┐ +│ tests/queries/0_stateless/01054_random_printable_ascii_ubsan.sh │ +│ tests/queries/0_stateless/02247_read_bools_as_numbers_json.sh │ +│ tests/performance/file_table_function.xml │ +│ tests/queries/0_stateless/01902_self_aliases_in_columns.sql │ +│ tests/queries/0_stateless/01070_h3_get_base_cell.reference │ +│ src/Functions/ztest.cpp │ +│ src/Interpreters/InterpreterShowTablesQuery.h │ +│ src/Parsers/Kusto/ParserKQLStatement.h │ +│ tests/queries/0_stateless/00938_dataset_test.sql │ +│ src/Dictionaries/Embedded/GeodataProviders/Types.h │ +└─────────────────────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.085 sec. Processed 532.10 thousand rows, 8.68 MB (6.30 million rows/s., 102.64 MB/s.) +``` + +これにより、ファイルがリネームされた後に元の名前に再リネームされることが可能になります。まず、リネームの結果として削除されたファイルの`old_path`のリストを集約します。これを最後の操作と統合します。最後に、最終イベントが`Delete`ではないものにフィルタリングします。 + +[play](https://sql.clickhouse.com?query_id=1OXCKMOH2JVMSHD3NS2WW6) + +```sql +SELECT uniq(path) +FROM +( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)') ORDER BY path +) + +┌─uniq(path)─┐ +│ 18559 │ +└────────────┘ +1 row in set. Elapsed: 0.089 sec. Processed 532.10 thousand rows, 8.68 MB (6.01 million rows/s., 97.99 MB/s.) +``` + +このパターンを`git list-files`に適用すると、18155件が報告されます。 + +```bash +git ls-files | grep -v -E 'generated\.cpp|^(contrib|docs?|website|libs/(libcityhash|liblz4|libdivide|libvectorclass|libdouble-conversion|libcpuid|libzstd|libfarmhash|libmetrohash|libpoco|libwidechar_width))/' | wc -l + 18155 +``` + +**したがって、現行のソリューションは現在のファイルの推定値です** + +ここでの違いは、いくつかの要因に起因しています: + +- リネームはファイルの他の変更と同時に発生する可能性があります。これらは`file_changes`内で別のイベントとしてリストされますが、同じ時間で発生します。`argMax`関数はこれを区別する方法がなく、最初の値を選択します。挿入の自然な順序(正しい順序を知る唯一の手段)は、ユニオン全体で維持されないため、変更されたイベントが選択される可能性があります。例えば、`src/Functions/geometryFromColumn.h`ファイルは、`src/Functions/geometryConverters.h`にリネームされる前に複数の変更があります。現在のソリューションでは、最後の変更イベントが`Modify`として選ばれる可能性があるため、`src/Functions/geometryFromColumn.h`が保持されます。 + +[play](https://sql.clickhouse.com?query_id=SCXWMR9GBMJ9UNZYQXQBFA) + +```sql +SELECT + change_type, + path, + old_path, + time, + commit_hash +FROM git.file_changes +WHERE (path = 'src/Functions/geometryFromColumn.h') OR (old_path = 'src/Functions/geometryFromColumn.h') + +┌─change_type─┬─path───────────────────────────────┬─old_path───────────────────────────┬────────────────time─┬─commit_hash──────────────────────────────┐ +│ Add │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 9376b676e9a9bb8911b872e1887da85a45f7479d │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 6d59be5ea4768034f6526f7f9813062e0c369f7b │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 33acc2aa5dc091a7cb948f78c558529789b2bad8 │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 78e0db268ceadc42f82bc63a77ee1a4da6002463 │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 14a891057d292a164c4179bfddaef45a74eaf83a │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ d0d6e6953c2a2af9fb2300921ff96b9362f22edb │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ fe8382521139a58c0ba277eb848e88894658db66 │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ 3be3d5cde8788165bc0558f1e2a22568311c3103 │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ afad9bf4d0a55ed52a3f55483bc0973456e10a56 │ +│ Modify │ src/Functions/geometryFromColumn.h │ │ 2021-03-11 12:08:16 │ e3290ecc78ca3ea82b49ebcda22b5d3a4df154e6 │ +│ Rename │ src/Functions/geometryConverters.h │ src/Functions/geometryFromColumn.h │ 2021-03-11 12:08:16 │ 125945769586baf6ffd15919b29565b1b2a63218 │ +└─────────────┴────────────────────────────────────┴────────────────────────────────────┴─────────────────────┴──────────────────────────────────────────┘ + 11 rows in set. Elapsed: 0.030 sec. Processed 266.05 thousand rows, 6.61 MB (8.89 million rows/s., 220.82 MB/s.) +``` + +- 壊れたコミット履歴 - 削除イベントの欠落。ソースと原因は未定です。 + +これらの違いは、私たちの分析に有意に影響を及ぼすべきではありません。**このクエリの改善版を歓迎します**。 + +## 最も多く変更されたファイルをリストする + +現在のファイルに制限し、変更数を削除と追加の合計として考えます。 + +[play](https://sql.clickhouse.com?query_id=MHXPSBNPTDMJYR3OYSXVR7) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + sum(lines_added) + sum(lines_deleted) AS modifications +FROM git.file_changes +WHERE (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) +GROUP BY path +ORDER BY modifications DESC +LIMIT 10 + +┌─path───────────────────────────────────────────────────┬─modifications─┐ +│ src/Storages/StorageReplicatedMergeTree.cpp │ 21871 │ +│ src/Storages/MergeTree/MergeTreeData.cpp │ 17709 │ +│ programs/client/Client.cpp │ 15882 │ +│ src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp │ 14249 │ +│ src/Interpreters/InterpreterSelectQuery.cpp │ 12636 │ +│ src/Parsers/ExpressionListParsers.cpp │ 11794 │ +│ src/Analyzer/QueryAnalysisPass.cpp │ 11760 │ +│ src/Coordination/KeeperStorage.cpp │ 10225 │ +│ src/Functions/FunctionsConversion.h │ 9247 │ +│ src/Parsers/ExpressionElementParsers.cpp │ 8197 │ +└────────────────────────────────────────────────────────┴───────────────┘ + +10 rows in set. Elapsed: 0.134 sec. Processed 798.15 thousand rows, 16.46 MB (5.95 million rows/s., 122.62 MB/s.) +``` + +## コミットは通常、週のどの日に発生するか? + +[play](https://sql.clickhouse.com?query_id=GED2STFSYJDRAA59H8RLIV) + +```sql +SELECT + day_of_week, + count() AS c +FROM git.commits +GROUP BY dayOfWeek(time) AS day_of_week + +┌─day_of_week─┬─────c─┐ +│ 1 │ 10575 │ +│ 2 │ 10645 │ +│ 3 │ 10748 │ +│ 4 │ 10944 │ +│ 5 │ 10090 │ +│ 6 │ 4617 │ +│ 7 │ 5166 │ +└─────────────┴───────┘ +7 rows in set. Elapsed: 0.262 sec. Processed 62.78 thousand rows, 251.14 KB (239.73 thousand rows/s., 958.93 KB/s.) +``` + +金曜日に生産性の低下が見られるのは理にかなっています。週末にコードをコミットしている人々を見るのは素晴らしいです!貢献者の皆さんに大感謝! + +## サブディレクトリ/ファイルの履歴 - 行数、コミット数、寄稿者数の推移 + +フィルタリングされない場合、これは非常に大きなクエリ結果を生成します。したがって、以下の例ではファイルまたはサブディレクトリでフィルタリングできるようにします。ここでは、`toStartOfWeek`関数を使用して週ごとにグループ化します - 必要に応じて適応してください。 + +[play](https://sql.clickhouse.com?query_id=REZRXDVU7CAWT5WKNJSTNY) + +```sql +SELECT + week, + sum(lines_added) AS lines_added, + sum(lines_deleted) AS lines_deleted, + uniq(commit_hash) AS num_commits, + uniq(author) AS authors +FROM git.file_changes +WHERE path LIKE 'src/Storages%' +GROUP BY toStartOfWeek(time) AS week +ORDER BY week ASC +LIMIT 10 + +┌───────week─┬─lines_added─┬─lines_deleted─┬─num_commits─┬─authors─┐ +│ 2020-03-29 │ 49 │ 35 │ 4 │ 3 │ +│ 2020-04-05 │ 940 │ 601 │ 55 │ 14 │ +│ 2020-04-12 │ 1472 │ 607 │ 32 │ 11 │ +│ 2020-04-19 │ 917 │ 841 │ 39 │ 12 │ +│ 2020-04-26 │ 1067 │ 626 │ 36 │ 10 │ +│ 2020-05-03 │ 514 │ 435 │ 27 │ 10 │ +│ 2020-05-10 │ 2552 │ 537 │ 48 │ 12 │ +│ 2020-05-17 │ 3585 │ 1913 │ 83 │ 9 │ +│ 2020-05-24 │ 2851 │ 1812 │ 74 │ 18 │ +│ 2020-05-31 │ 2771 │ 2077 │ 77 │ 16 │ +└────────────┴─────────────┴───────────────┴─────────────┴─────────┘ +10 rows in set. Elapsed: 0.043 sec. Processed 266.05 thousand rows, 15.85 MB (6.12 million rows/s., 364.61 MB/s.) +``` + +このデータは視覚化に適しています。以下では Superset を使用します。 + +**追加された行と削除された行に関して:** + +![](./images/superset-github-lines-added-deleted.png) + +**コミットと著者に関して:** + +![](./images/superset-commits-authors.png) + +## 最大著者数のファイルリスト + +現在のファイルのみに制限します。 + +[play](https://sql.clickhouse.com?query_id=CYQFNQNK9TAMPU2OZ8KG5Y) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + uniq(author) AS num_authors +FROM git.file_changes +WHERE path IN (current_files) +GROUP BY path +ORDER BY num_authors DESC +LIMIT 10 + +┌─path────────────────────────────────────────┬─num_authors─┐ +│ src/Core/Settings.h │ 127 │ +│ CMakeLists.txt │ 96 │ +│ .gitmodules │ 85 │ +│ src/Storages/MergeTree/MergeTreeData.cpp │ 72 │ +│ src/CMakeLists.txt │ 71 │ +│ programs/server/Server.cpp │ 70 │ +│ src/Interpreters/Context.cpp │ 64 │ +│ src/Storages/StorageReplicatedMergeTree.cpp │ 63 │ +│ src/Common/ErrorCodes.cpp │ 61 │ +│ src/Interpreters/InterpreterSelectQuery.cpp │ 59 │ +└─────────────────────────────────────────────┴─────────────┘ + +10 rows in set. Elapsed: 0.239 sec. Processed 798.15 thousand rows, 14.13 MB (3.35 million rows/s., 59.22 MB/s.) +``` + +## リポジトリ内の最古のコード行 + +現在のファイルのみに制限します。 + +[play](https://sql.clickhouse.com?query_id=VWPBPGRZVGTHOCQYWNQZNT) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + any(path) AS file_path, + line, + max(time) AS latest_change, + any(file_change_type) +FROM git.line_changes +WHERE path IN (current_files) +GROUP BY line +ORDER BY latest_change ASC +LIMIT 10 + +┌─file_path───────────────────────────────────┬─line────────────────────────────────────────────────────────┬───────latest_change─┬─any(file_change_type)─┐ +│ utils/compressor/test.sh │ ./compressor -d < compressor.snp > compressor2 │ 2011-06-17 22:19:39 │ Modify │ +│ utils/compressor/test.sh │ ./compressor < compressor > compressor.snp │ 2011-06-17 22:19:39 │ Modify │ +│ utils/compressor/test.sh │ ./compressor -d < compressor.qlz > compressor2 │ 2014-02-24 03:14:30 │ Add │ +│ utils/compressor/test.sh │ ./compressor < compressor > compressor.qlz │ 2014-02-24 03:14:30 │ Add │ +│ utils/config-processor/config-processor.cpp │ if (argc != 2) │ 2014-02-26 19:10:00 │ Add │ +│ utils/config-processor/config-processor.cpp │ std::cerr << "std::exception: " << e.what() << std::endl; │ 2014-02-26 19:10:00 │ Add │ +│ utils/config-processor/config-processor.cpp │ std::cerr << "Exception: " << e.displayText() << std::endl; │ 2014-02-26 19:10:00 │ Add │ +│ utils/config-processor/config-processor.cpp │ Poco::XML::DOMWriter().writeNode(std::cout, document); │ 2014-02-26 19:10:00 │ Add │ +│ utils/config-processor/config-processor.cpp │ std::cerr << "Some exception" << std::endl; │ 2014-02-26 19:10:00 │ Add │ +│ utils/config-processor/config-processor.cpp │ std::cerr << "usage: " << argv[0] << " path" << std::endl; │ 2014-02-26 19:10:00 │ Add │ +└─────────────────────────────────────────────┴─────────────────────────────────────────────────────────────┴─────────────────────┴───────────────────────┘ + +10 rows in set. Elapsed: 1.101 sec. Processed 8.07 million rows, 905.86 MB (7.33 million rows/s., 823.13 MB/s.) +``` + +## 最も古い履歴を持つファイル + +現在のファイルのみに制限します。 + +[play](https://sql.clickhouse.com?query_id=VWPBPGRZVGTHOCQYWNQZNT) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + count() AS c, + path, + max(time) AS latest_change +FROM git.file_changes +WHERE path IN (current_files) +GROUP BY path +ORDER BY c DESC +LIMIT 10 + +┌───c─┬─path────────────────────────────────────────┬───────latest_change─┐ +│ 790 │ src/Storages/StorageReplicatedMergeTree.cpp │ 2022-10-30 16:30:51 │ +│ 788 │ src/Storages/MergeTree/MergeTreeData.cpp │ 2022-11-04 09:26:44 │ +│ 752 │ src/Core/Settings.h │ 2022-10-25 11:35:25 │ +│ 749 │ CMakeLists.txt │ 2022-10-05 21:00:49 │ +│ 575 │ src/Interpreters/InterpreterSelectQuery.cpp │ 2022-11-01 10:20:10 │ +│ 563 │ CHANGELOG.md │ 2022-10-27 08:19:50 │ +│ 491 │ src/Interpreters/Context.cpp │ 2022-10-25 12:26:29 │ +│ 437 │ programs/server/Server.cpp │ 2022-10-21 12:25:19 │ +│ 375 │ programs/client/Client.cpp │ 2022-11-03 03:16:55 │ +│ 350 │ src/CMakeLists.txt │ 2022-10-24 09:22:37 │ +└─────┴─────────────────────────────────────────────┴─────────────────────┘ + +10 rows in set. Elapsed: 0.124 sec. Processed 798.15 thousand rows, 14.71 MB (6.44 million rows/s., 118.61 MB/s.) +``` + +私たちのコアデータ構造である Merge Tree は、当然のことながら常に進化しており、長い編集の歴史があります! + +## ドキュメントとコードに関する寄稿者の分布 + +**データ収集中に、`docs/` フォルダ内の変更は非常に汚れたコミット履歴のためにフィルタリングされました。そのため、このクエリの結果は正確ではありません。** + +特定の時期、例えばリリース日周辺に、私たちはより多くのドキュメントを記述していますか?`countIf` 関数を使用して単純な比率を計算し、`bar` 関数を使用して結果を視覚化できます。 + +[play](https://sql.clickhouse.com?query_id=BA4RZUXUHNQBH9YK7F2T9J) + +```sql +SELECT + day, + bar(docs_ratio * 1000, 0, 100, 100) AS bar +FROM +( + SELECT + day, + countIf(file_extension IN ('h', 'cpp', 'sql')) AS code, + countIf(file_extension = 'md') AS docs, + docs / (code + docs) AS docs_ratio + FROM git.line_changes + WHERE (sign = 1) AND (file_extension IN ('h', 'cpp', 'sql', 'md')) + GROUP BY dayOfMonth(time) AS day +) + +┌─day─┬─bar─────────────────────────────────────────────────────────────┐ +│ 1 │ ███████████████████████████████████▍ │ +│ 2 │ ███████████████████████▋ │ +│ 3 │ ████████████████████████████████▋ │ +│ 4 │ █████████████ │ +│ 5 │ █████████████████████▎ │ +│ 6 │ ████████ │ +│ 7 │ ███▋ │ +│ 8 │ ████████▌ │ +│ 9 │ ██████████████▎ │ +│ 10 │ █████████████████▏ │ +│ 11 │ █████████████▎ │ +│ 12 │ ███████████████████████████████████▋ │ +│ 13 │ █████████████████████████████▎ │ +│ 14 │ ██████▋ │ +│ 15 │ █████████████████████████████████████████▊ │ +│ 16 │ ██████████▎ │ +│ 17 │ ██████████████████████████████████████▋ │ +│ 18 │ █████████████████████████████████▌ │ +│ 19 │ ███████████ │ +│ 20 │ █████████████████████████████████▊ │ +│ 21 │ █████ │ +│ 22 │ ███████████████████████▋ │ +│ 23 │ ███████████████████████████▌ │ +│ 24 │ ███████▌ │ +│ 25 │ ██████████████████████████████████▎ │ +│ 26 │ ███████████▏ │ +│ 27 │ ███████████████████████████████████████████████████████████████ │ +│ 28 │ ████████████████████████████████████████████████████▏ │ +│ 29 │ ███▌ │ +│ 30 │ ████████████████████████████████████████▎ │ +│ 31 │ █████████████████████████████████▏ │ +└─────┴─────────────────────────────────────────────────────────────────┘ + +31 rows in set. Elapsed: 0.043 sec. Processed 7.54 million rows, 40.53 MB (176.71 million rows/s., 950.40 MB/s.) +``` + +月末近くに少し多いかもしれませんが、全体的には良好な均等分布を維持しています。再度、これはデータ挿入中のドキュメントフィルタリングによる信頼性が低いです。 + +## 最も多様な影響を持つ著者 + +ここでの多様性は、著者が貢献したユニークなファイルの数とします。 + +[play](https://sql.clickhouse.com?query_id=MT8WBABUKYBYSBA78W5TML) + +```sql +SELECT + author, + uniq(path) AS num_files +FROM git.file_changes +WHERE (change_type IN ('Add', 'Modify')) AND (file_extension IN ('h', 'cpp', 'sql')) +GROUP BY author +ORDER BY num_files DESC +LIMIT 10 + +┌─author─────────────┬─num_files─┐ +│ Alexey Milovidov │ 8433 │ +│ Nikolai Kochetov │ 3257 │ +│ Vitaly Baranov │ 2316 │ +│ Maksim Kita │ 2172 │ +│ Azat Khuzhin │ 1988 │ +│ alesapin │ 1818 │ +│ Alexander Tokmakov │ 1751 │ +│ Amos Bird │ 1641 │ +│ Ivan │ 1629 │ +│ alexey-milovidov │ 1581 │ +└────────────────────┴───────────┘ + +10 rows in set. Elapsed: 0.041 sec. Processed 266.05 thousand rows, 4.92 MB (6.56 million rows/s., 121.21 MB/s.) +``` + +最近の作業において、最も多様なコミットを持つ人物を見てみましょう。日付で制限するのではなく、著者の最後の N 回のコミットに制限します(この場合、私たちは 3 を使用しましたが、自由に変更してください): + +[play](https://sql.clickhouse.com?query_id=4Q3D67FWRIVWTY8EIDDE5U) + +```sql +SELECT + author, + sum(num_files_commit) AS num_files +FROM +( + SELECT + author, + commit_hash, + uniq(path) AS num_files_commit, + max(time) AS commit_time + FROM git.file_changes + WHERE (change_type IN ('Add', 'Modify')) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY + author, + commit_hash + ORDER BY + author ASC, + commit_time DESC + LIMIT 3 BY author +) +GROUP BY author +ORDER BY num_files DESC +LIMIT 10 + +┌─author───────────────┬─num_files─┐ +│ Mikhail │ 782 │ +│ Li Yin │ 553 │ +│ Roman Peshkurov │ 119 │ +│ Vladimir Smirnov │ 88 │ +│ f1yegor │ 65 │ +│ maiha │ 54 │ +│ Vitaliy Lyudvichenko │ 53 │ +│ Pradeep Chhetri │ 40 │ +│ Orivej Desh │ 38 │ +│ liyang │ 36 │ +└──────────────────────┴───────────┘ + +10 rows in set. Elapsed: 0.106 sec. Processed 266.05 thousand rows, 21.04 MB (2.52 million rows/s., 198.93 MB/s.) +``` + +## 著者のお気に入りファイル + +ここでは、創設者である [Alexey Milovidov](https://github.com/alexey-milovidov) を選択し、分析を現在のファイルに制限します。 + +[play](https://sql.clickhouse.com?query_id=OKGZBACRHVGCRAGCZAJKMF) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + count() AS c +FROM git.file_changes +WHERE (author = 'Alexey Milovidov') AND (path IN (current_files)) +GROUP BY path +ORDER BY c DESC +LIMIT 10 + +┌─path────────────────────────────────────────┬───c─┐ +│ CMakeLists.txt │ 165 │ +│ CHANGELOG.md │ 126 │ +│ programs/server/Server.cpp │ 73 │ +│ src/Storages/MergeTree/MergeTreeData.cpp │ 71 │ +│ src/Storages/StorageReplicatedMergeTree.cpp │ 68 │ +│ src/Core/Settings.h │ 65 │ +│ programs/client/Client.cpp │ 57 │ +│ programs/server/play.html │ 48 │ +│ .gitmodules │ 47 │ +│ programs/install/Install.cpp │ 37 │ +└─────────────────────────────────────────────┴─────┘ + +10 rows in set. Elapsed: 0.106 sec. Processed 798.15 thousand rows, 13.97 MB (7.51 million rows/s., 131.41 MB/s.) +``` + +これは理にかなっています。なぜなら、Alexey は変更ログの維持を担当しているからです。しかし、ファイルの基本名を使用してお気に入りのファイルを特定すると、リネームを考慮に入れ、コードの貢献に焦点を当てることができます。 + +[play](https://sql.clickhouse.com?query_id=P9PBDZGOSVTKXEXU73ZNAJ) + +```sql +SELECT + base, + count() AS c +FROM git.file_changes +WHERE (author = 'Alexey Milovidov') AND (file_extension IN ('h', 'cpp', 'sql')) +GROUP BY basename(path) AS base +ORDER BY c DESC +LIMIT 10 + +┌─base───────────────────────────┬───c─┐ +│ StorageReplicatedMergeTree.cpp │ 393 │ +│ InterpreterSelectQuery.cpp │ 299 │ +│ Aggregator.cpp │ 297 │ +│ Client.cpp │ 280 │ +│ MergeTreeData.cpp │ 274 │ +│ Server.cpp │ 264 │ +│ ExpressionAnalyzer.cpp │ 259 │ +│ StorageMergeTree.cpp │ 239 │ +│ Settings.h │ 225 │ +│ TCPHandler.cpp │ 205 │ +└────────────────────────────────┴─────┘ +10 rows in set. Elapsed: 0.032 sec. Processed 266.05 thousand rows, 5.68 MB (8.22 million rows/s., 175.50 MB/s.) +``` + +これは彼の興味分野をより反映しているかもしれません。 + +## 著者数が最も少ない最大ファイル + +これを行うには、まず最大ファイルを特定する必要があります。すべてのファイルを、履歴からのコミットによる完全なファイル再構成により推定することは非常に負担がかかります! + +推定として、現在のファイルに制限し、行の追加を合計し、削除を差し引きます。次に、著者数に対する長さの比率を計算することができます。 + +[play](https://sql.clickhouse.com?query_id=PVSDOHZYUMRDDUZFEYJC7J) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + sum(lines_added) - sum(lines_deleted) AS num_lines, + uniqExact(author) AS num_authors, + num_lines / num_authors AS lines_author_ratio +FROM git.file_changes +WHERE path IN (current_files) +GROUP BY path +ORDER BY lines_author_ratio DESC +LIMIT 10 + +┌─path──────────────────────────────────────────────────────────────────┬─num_lines─┬─num_authors─┬─lines_author_ratio─┐ +│ src/Common/ClassificationDictionaries/emotional_dictionary_rus.txt │ 148590 │ 1 │ 148590 │ +│ src/Functions/ClassificationDictionaries/emotional_dictionary_rus.txt │ 55533 │ 1 │ 55533 │ +│ src/Functions/ClassificationDictionaries/charset_freq.txt │ 35722 │ 1 │ 35722 │ +│ src/Common/ClassificationDictionaries/charset_freq.txt │ 35722 │ 1 │ 35722 │ +│ tests/integration/test_storage_meilisearch/movies.json │ 19549 │ 1 │ 19549 │ +│ tests/queries/0_stateless/02364_multiSearch_function_family.reference │ 12874 │ 1 │ 12874 │ +│ src/Functions/ClassificationDictionaries/programming_freq.txt │ 9434 │ 1 │ 9434 │ +│ src/Common/ClassificationDictionaries/programming_freq.txt │ 9434 │ 1 │ 9434 │ +│ tests/performance/explain_ast.xml │ 5911 │ 1 │ 5911 │ +│ src/Analyzer/QueryAnalysisPass.cpp │ 5686 │ 1 │ 5686 │ +└───────────────────────────────────────────────────────────────────────┴───────────┴─────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.138 sec. Processed 798.15 thousand rows, 16.57 MB (5.79 million rows/s., 120.11 MB/s.) +``` + +テキスト辞書はあまり現実的ではないかもしれないので、ファイル拡張子フィルターを介してコードのみに制限しましょう! + +[play](https://sql.clickhouse.com?query_id=BZHGWUIZMPZZUHS5XRBK2M) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + sum(lines_added) - sum(lines_deleted) AS num_lines, + uniqExact(author) AS num_authors, + num_lines / num_authors AS lines_author_ratio +FROM git.file_changes +WHERE (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) +GROUP BY path +ORDER BY lines_author_ratio DESC +LIMIT 10 + +┌─path──────────────────────────────────┬─num_lines─┬─num_authors─┬─lines_author_ratio─┐ +│ src/Analyzer/QueryAnalysisPass.cpp │ 5686 │ 1 │ 5686 │ +│ src/Analyzer/QueryTreeBuilder.cpp │ 880 │ 1 │ 880 │ +│ src/Planner/Planner.cpp │ 873 │ 1 │ 873 │ +│ src/Backups/RestorerFromBackup.cpp │ 869 │ 1 │ 869 │ +│ utils/memcpy-bench/FastMemcpy.h │ 770 │ 1 │ 770 │ +│ src/Planner/PlannerActionsVisitor.cpp │ 765 │ 1 │ 765 │ +│ src/Functions/sphinxstemen.cpp │ 728 │ 1 │ 728 │ +│ src/Planner/PlannerJoinTree.cpp │ 708 │ 1 │ 708 │ +│ src/Planner/PlannerJoins.cpp │ 695 │ 1 │ 695 │ +│ src/Analyzer/QueryNode.h │ 607 │ 1 │ 607 │ +└───────────────────────────────────────┴───────────┴─────────────┴────────────────────┘ +10 rows in set. Elapsed: 0.140 sec. Processed 798.15 thousand rows, 16.84 MB (5.70 million rows/s., 120.32 MB/s.) +``` + +若干の新しいバイアスがあるため、これは、最近のファイルにはコミットの機会が少ないです。1 年以上経過したファイルに制限したらどうなるのでしょうか? + +[play](https://sql.clickhouse.com?query_id=RMHHZEDHFUCBGRQVQA2732) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + min(time) AS min_date, + path, + sum(lines_added) - sum(lines_deleted) AS num_lines, + uniqExact(author) AS num_authors, + num_lines / num_authors AS lines_author_ratio +FROM git.file_changes +WHERE (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) +GROUP BY path +HAVING min_date <= (now() - toIntervalYear(1)) +ORDER BY lines_author_ratio DESC +LIMIT 10 + +┌────────────min_date─┬─path───────────────────────────────────────────────────────────┬─num_lines─┬─num_authors─┬─lines_author_ratio─┐ +│ 2021-03-08 07:00:54 │ utils/memcpy-bench/FastMemcpy.h │ 770 │ 1 │ 770 │ +│ 2021-05-04 13:47:34 │ src/Functions/sphinxstemen.cpp │ 728 │ 1 │ 728 │ +│ 2021-03-14 16:52:51 │ utils/memcpy-bench/glibc/dwarf2.h │ 592 │ 1 │ 592 │ +│ 2021-03-08 09:04:52 │ utils/memcpy-bench/FastMemcpy_Avx.h │ 496 │ 1 │ 496 │ +│ 2020-10-19 01:10:50 │ tests/queries/0_stateless/01518_nullable_aggregate_states2.sql │ 411 │ 1 │ 411 │ +│ 2020-11-24 14:53:34 │ programs/server/GRPCHandler.cpp │ 399 │ 1 │ 399 │ +│ 2021-03-09 14:10:28 │ src/DataTypes/Serializations/SerializationSparse.cpp │ 363 │ 1 │ 363 │ +│ 2021-08-20 15:06:57 │ src/Functions/vectorFunctions.cpp │ 1327 │ 4 │ 331.75 │ +│ 2020-08-04 03:26:23 │ src/Interpreters/MySQL/CreateQueryConvertVisitor.cpp │ 311 │ 1 │ 311 │ +│ 2020-11-06 15:45:13 │ src/Storages/Rocksdb/StorageEmbeddedRocksdb.cpp │ 611 │ 2 │ 305.5 │ +└─────────────────────┴────────────────────────────────────────────────────────────────┴───────────┴─────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.143 sec. Processed 798.15 thousand rows, 18.00 MB (5.58 million rows/s., 125.87 MB/s.) +``` + +## コミットとコード行の時間別分布; 曜日別、著者別; 特定のサブディレクトリ用 + +これは、週の曜日ごとの追加された行と削除された行の数として解釈します。この場合、[Functions ディレクトリ](https://github.com/ClickHouse/ClickHouse/tree/master/src/Functions) に注目します。 + +[play](https://sql.clickhouse.com?query_id=PF3KEMYG5CVLJGCFYQEGB1) + +```sql +SELECT + dayOfWeek, + uniq(commit_hash) AS commits, + sum(lines_added) AS lines_added, + sum(lines_deleted) AS lines_deleted +FROM git.file_changes +WHERE path LIKE 'src/Functions%' +GROUP BY toDayOfWeek(time) AS dayOfWeek + +┌─dayOfWeek─┬─commits─┬─lines_added─┬─lines_deleted─┐ +│ 1 │ 476 │ 24619 │ 15782 │ +│ 2 │ 434 │ 18098 │ 9938 │ +│ 3 │ 496 │ 26562 │ 20883 │ +│ 4 │ 587 │ 65674 │ 18862 │ +│ 5 │ 504 │ 85917 │ 14518 │ +│ 6 │ 314 │ 13604 │ 10144 │ +│ 7 │ 294 │ 11938 │ 6451 │ +└───────────┴─────────┴─────────────┴───────────────┘ + +7 rows in set. Elapsed: 0.034 sec. Processed 266.05 thousand rows, 14.66 MB (7.73 million rows/s., 425.56 MB/s.) +``` + +および、時間帯別に。 + +[play](https://sql.clickhouse.com?query_id=Q4VDVKEGHHRBCUJHNCVTF1) + +```sql +SELECT + hourOfDay, + uniq(commit_hash) AS commits, + sum(lines_added) AS lines_added, + sum(lines_deleted) AS lines_deleted +FROM git.file_changes +WHERE path LIKE 'src/Functions%' +GROUP BY toHour(time) AS hourOfDay + +┌─hourOfDay─┬─commits─┬─lines_added─┬─lines_deleted─┐ +│ 0 │ 71 │ 4169 │ 3404 │ +│ 1 │ 90 │ 2174 │ 1927 │ +│ 2 │ 65 │ 2343 │ 1515 │ +│ 3 │ 76 │ 2552 │ 493 │ +│ 4 │ 62 │ 1480 │ 1304 │ +│ 5 │ 38 │ 1644 │ 253 │ +│ 6 │ 104 │ 4434 │ 2979 │ +│ 7 │ 117 │ 4171 │ 1678 │ +│ 8 │ 106 │ 4604 │ 4673 │ +│ 9 │ 135 │ 60550 │ 2678 │ +│ 10 │ 149 │ 6133 │ 3482 │ +│ 11 │ 182 │ 8040 │ 3833 │ +│ 12 │ 209 │ 29428 │ 15040 │ +│ 13 │ 187 │ 10204 │ 5491 │ +│ 14 │ 204 │ 9028 │ 6060 │ +│ 15 │ 231 │ 15179 │ 10077 │ +│ 16 │ 196 │ 9568 │ 5925 │ +│ 17 │ 138 │ 4941 │ 3849 │ +│ 18 │ 123 │ 4193 │ 3036 │ +│ 19 │ 165 │ 8817 │ 6646 │ +│ 20 │ 140 │ 3749 │ 2379 │ +│ 21 │ 132 │ 41585 │ 4182 │ +│ 22 │ 85 │ 4094 │ 3955 │ +│ 23 │ 100 │ 3332 │ 1719 │ +└───────────┴─────────┴─────────────┴───────────────┘ + +24 rows in set. Elapsed: 0.039 sec. Processed 266.05 thousand rows, 14.66 MB (6.77 million rows/s., 372.89 MB/s.) +``` + +この分布は、私たちの開発チームの大部分がアムステルダムにいることを考慮すると理にかなっています。`bar` 関数は、これらの分布を視覚化するのに役立ちます。 + +[play](https://sql.clickhouse.com?query_id=9AZ8CENV8N91YGW7T6IB68) + +```sql +SELECT + hourOfDay, + bar(commits, 0, 400, 50) AS commits, + bar(lines_added, 0, 30000, 50) AS lines_added, + bar(lines_deleted, 0, 15000, 50) AS lines_deleted +FROM +( + SELECT + hourOfDay, + uniq(commit_hash) AS commits, + sum(lines_added) AS lines_added, + sum(lines_deleted) AS lines_deleted + FROM git.file_changes + WHERE path LIKE 'src/Functions%' + GROUP BY toHour(time) AS hourOfDay +) + +┌─hourOfDay─┬─commits───────────────────────┬─lines_added────────────────────────────────────────┬─lines_deleted──────────────────────────────────────┐ +│ 0 │ ████████▊ │ ██████▊ │ ███████████▎ │ +│ 1 │ ███████████▎ │ ███▌ │ ██████▍ │ +│ 2 │ ████████ │ ███▊ │ █████ │ +│ 3 │ █████████▌ │ ████▎ │ █▋ │ +│ 4 │ ███████▋ │ ██▍ │ ████▎ │ +│ 5 │ ████▋ │ ██▋ │ ▋ │ +│ 6 │ █████████████ │ ███████▍ │ █████████▊ │ +│ 7 │ ██████████████▋ │ ██████▊ │ █████▌ │ +│ 8 │ █████████████▎ │ ███████▋ │ ███████████████▌ │ +│ 9 │ ████████████████▊ │ ██████████████████████████████████████████████████ │ ████████▊ │ +│ 10 │ ██████████████████▋ │ ██████████▏ │ ███████████▌ │ +│ 11 │ ██████████████████████▋ │ █████████████▍ │ ████████████▋ │ +│ 12 │ ██████████████████████████ │ █████████████████████████████████████████████████ │ ██████████████████████████████████████████████████ │ +│ 13 │ ███████████████████████▍ │ █████████████████ │ ██████████████████▎ │ +│ 14 │ █████████████████████████▌ │ ███████████████ │ ████████████████████▏ │ +│ 15 │ ████████████████████████████▊ │ █████████████████████████▎ │ █████████████████████████████████▌ │ +│ 16 │ ████████████████████████▌ │ ███████████████▊ │ ███████████████████▋ │ +│ 17 │ █████████████████▎ │ ████████▏ │ ████████████▋ │ +│ 18 │ ███████████████▍ │ ██████▊ │ ██████████ │ +│ 19 │ ████████████████████▋ │ ██████████████▋ │ ██████████████████████▏ │ +│ 20 │ █████████████████▌ │ ██████▏ │ ███████▊ │ +│ 21 │ ████████████████▌ │ ██████████████████████████████████████████████████ │ █████████████▊ │ +│ 22 │ ██████████▋ │ ██████▋ │ █████████████▏ │ +│ 23 │ ████████████▌ │ █████▌ │ █████▋ │ +└───────────┴───────────────────────────────┴────────────────────────────────────────────────────┴────────────────────────────────────────────────────┘ + +24 rows in set. Elapsed: 0.038 sec. Processed 266.05 thousand rows, 14.66 MB (7.09 million rows/s., 390.69 MB/s.) +``` + +## 著者の行列:他の著者のコードを書き直す傾向を示す + +`sign = -1` はコード削除を示しています。句読点や空行の挿入は除外します。 + +[プレイ](https://sql.clickhouse.com?query_id=448O8GWAHY3EM6ZZ7AGLAM) + +```sql +SELECT + prev_author || '(a)' as add_author, + author || '(d)' as delete_author, + count() AS c +FROM git.line_changes +WHERE (sign = -1) AND (file_extension IN ('h', 'cpp')) AND (line_type NOT IN ('Punct', 'Empty')) AND (author != prev_author) AND (prev_author != '') +GROUP BY + prev_author, + author +ORDER BY c DESC +LIMIT 1 BY prev_author +LIMIT 100 + +┌─prev_author──────────┬─author───────────┬─────c─┐ +│ Ivan │ Alexey Milovidov │ 18554 │ +│ Alexey Arno │ Alexey Milovidov │ 18475 │ +│ Michael Kolupaev │ Alexey Milovidov │ 14135 │ +│ Alexey Milovidov │ Nikolai Kochetov │ 13435 │ +│ Andrey Mironov │ Alexey Milovidov │ 10418 │ +│ proller │ Alexey Milovidov │ 7280 │ +│ Nikolai Kochetov │ Alexey Milovidov │ 6806 │ +│ alexey-milovidov │ Alexey Milovidov │ 5027 │ +│ Vitaliy Lyudvichenko │ Alexey Milovidov │ 4390 │ +│ Amos Bird │ Ivan Lezhankin │ 3125 │ +│ f1yegor │ Alexey Milovidov │ 3119 │ +│ Pavel Kartavyy │ Alexey Milovidov │ 3087 │ +│ Alexey Zatelepin │ Alexey Milovidov │ 2978 │ +│ alesapin │ Alexey Milovidov │ 2949 │ +│ Sergey Fedorov │ Alexey Milovidov │ 2727 │ +│ Ivan Lezhankin │ Alexey Milovidov │ 2618 │ +│ Vasily Nemkov │ Alexey Milovidov │ 2547 │ +│ Alexander Tokmakov │ Alexey Milovidov │ 2493 │ +│ Nikita Vasilev │ Maksim Kita │ 2420 │ +│ Anton Popov │ Amos Bird │ 2127 │ +└──────────────────────┴──────────────────┴───────┘ + +20 rows in set. Elapsed: 0.098 sec. Processed 7.54 million rows, 42.16 MB (76.67 million rows/s., 428.99 MB/s.) +``` + +Sankeyチャート(SuperSet)は、これをうまく視覚化できます。視覚的多様性を高めるために、各著者の上位3つのコード削除者を取得するために`LIMIT BY`を3に増やします。 + +![](./images/superset-authors-matrix.png) + +Alexeyは明らかに他の人のコードを削除するのが好きです。よりバランスの取れたコード削除のビューを得るために、彼を除外しましょう。 + +![](./images/superset-authors-matrix_v2.png) + +## 曜日ごとの最高貢献者は誰ですか? + +コミット数を単純に考えると: + +[プレイ](https://sql.clickhouse.com?query_id=WXPKFJCAHOKYKEVTWNFVCY) + +```sql +SELECT + day_of_week, + author, + count() AS c +FROM git.commits +GROUP BY + dayOfWeek(time) AS day_of_week, + author +ORDER BY + day_of_week ASC, + c DESC +LIMIT 1 BY day_of_week + +┌─day_of_week─┬─author───────────┬────c─┐ +│ 1 │ Alexey Milovidov │ 2204 │ +│ 2 │ Alexey Milovidov │ 1588 │ +│ 3 │ Alexey Milovidov │ 1725 │ +│ 4 │ Alexey Milovidov │ 1915 │ +│ 5 │ Alexey Milovidov │ 1940 │ +│ 6 │ Alexey Milovidov │ 1851 │ +│ 7 │ Alexey Milovidov │ 2400 │ +└─────────────┴──────────────────┴──────┘ + +7 rows in set. Elapsed: 0.012 sec. Processed 62.78 thousand rows, 395.47 KB (5.44 million rows/s., 34.27 MB/s.) +``` + +ここでは、最も長い貢献者である創業者のAlexeyにいくつかの利点があります。過去1年に分析を制限しましょう。 + +[プレイ](https://sql.clickhouse.com?query_id=8YRJGHFTNJAWJ96XCJKKEH) + +```sql +SELECT + day_of_week, + author, + count() AS c +FROM git.commits +WHERE time > (now() - toIntervalYear(1)) +GROUP BY + dayOfWeek(time) AS day_of_week, + author +ORDER BY + day_of_week ASC, + c DESC +LIMIT 1 BY day_of_week + +┌─day_of_week─┬─author───────────┬───c─┐ +│ 1 │ Alexey Milovidov │ 198 │ +│ 2 │ alesapin │ 162 │ +│ 3 │ alesapin │ 163 │ +│ 4 │ Azat Khuzhin │ 166 │ +│ 5 │ alesapin │ 191 │ +│ 6 │ Alexey Milovidov │ 179 │ +│ 7 │ Alexey Milovidov │ 243 │ +└─────────────┴──────────────────┴─────┘ + +7 rows in set. Elapsed: 0.004 sec. Processed 21.82 thousand rows, 140.02 KB (4.88 million rows/s., 31.29 MB/s.) +``` + +これはまだ少し単純で、人々の作業を反映していません。 + +より良い指標は、過去1年の総作業に対する各日の最高貢献者の割合かもしれません。削除と追加のコードを同等に扱います。 + +[プレイ](https://sql.clickhouse.com?query_id=VQF4KMRDSUEXGS1JFVDJHV) + +```sql +SELECT + top_author.day_of_week, + top_author.author, + top_author.author_work / all_work.total_work AS top_author_percent +FROM +( + SELECT + day_of_week, + author, + sum(lines_added) + sum(lines_deleted) AS author_work + FROM git.file_changes + WHERE time > (now() - toIntervalYear(1)) + GROUP BY + author, + dayOfWeek(time) AS day_of_week + ORDER BY + day_of_week ASC, + author_work DESC + LIMIT 1 BY day_of_week +) AS top_author +INNER JOIN +( + SELECT + day_of_week, + sum(lines_added) + sum(lines_deleted) AS total_work + FROM git.file_changes + WHERE time > (now() - toIntervalYear(1)) + GROUP BY dayOfWeek(time) AS day_of_week +) AS all_work USING (day_of_week) + +┌─day_of_week─┬─author──────────────┬──top_author_percent─┐ +│ 1 │ Alexey Milovidov │ 0.3168282877768332 │ +│ 2 │ Mikhail f. Shiryaev │ 0.3523434231193969 │ +│ 3 │ vdimir │ 0.11859742484577324 │ +│ 4 │ Nikolay Degterinsky │ 0.34577318920318467 │ +│ 5 │ Alexey Milovidov │ 0.13208704423684223 │ +│ 6 │ Alexey Milovidov │ 0.18895257783624633 │ +│ 7 │ Robert Schulze │ 0.3617405888930302 │ +└─────────────┴─────────────────────┴─────────────────────┘ + +7 rows in set. Elapsed: 0.014 sec. Processed 106.12 thousand rows, 1.38 MB (7.61 million rows/s., 98.65 MB/s.) +``` + +## リポジトリ全体のコード年齢の分布 + +分析を現在のファイルに制限します。簡潔さのために、結果を深さ2のルートフォルダーごとに5ファイルに制限します。必要に応じて調整してください。 + +[プレイ](https://sql.clickhouse.com?query_id=6YWAUQYPZINZDJGBEZBNWG) + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + concat(root, '/', sub_folder) AS folder, + round(avg(days_present)) AS avg_age_of_files, + min(days_present) AS min_age_files, + max(days_present) AS max_age_files, + count() AS c +FROM +( + SELECT + path, + dateDiff('day', min(time), toDate('2022-11-03')) AS days_present + FROM git.file_changes + WHERE (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY path +) +GROUP BY + splitByChar('/', path)[1] AS root, + splitByChar('/', path)[2] AS sub_folder +ORDER BY + root ASC, + c DESC +LIMIT 5 BY root + +┌─folder───────────────────────────┬─avg_age_of_files─┬─min_age_files─┬─max_age_files─┬────c─┐ +│ base/base │ 387 │ 201 │ 397 │ 84 │ +│ base/glibc-compatibility │ 887 │ 59 │ 993 │ 19 │ +│ base/consistent-hashing │ 993 │ 993 │ 993 │ 5 │ +│ base/widechar_width │ 993 │ 993 │ 993 │ 2 │ +│ base/consistent-hashing-sumbur │ 993 │ 993 │ 993 │ 2 │ +│ docker/test │ 1043 │ 1043 │ 1043 │ 1 │ +│ programs/odbc-bridge │ 835 │ 91 │ 945 │ 25 │ +│ programs/copier │ 587 │ 14 │ 945 │ 22 │ +│ programs/library-bridge │ 155 │ 47 │ 608 │ 21 │ +│ programs/disks │ 144 │ 62 │ 150 │ 14 │ +│ programs/server │ 874 │ 709 │ 945 │ 10 │ +│ rust/BLAKE3 │ 52 │ 52 │ 52 │ 1 │ +│ src/Functions │ 752 │ 0 │ 944 │ 809 │ +│ src/Storages │ 700 │ 8 │ 944 │ 736 │ +│ src/Interpreters │ 684 │ 3 │ 944 │ 490 │ +│ src/Processors │ 703 │ 44 │ 944 │ 482 │ +│ src/Common │ 673 │ 7 │ 944 │ 473 │ +│ tests/queries │ 674 │ -5 │ 945 │ 3777 │ +│ tests/integration │ 656 │ 132 │ 945 │ 4 │ +│ utils/memcpy-bench │ 601 │ 599 │ 605 │ 10 │ +│ utils/keeper-bench │ 570 │ 569 │ 570 │ 7 │ +│ utils/durability-test │ 793 │ 793 │ 793 │ 4 │ +│ utils/self-extracting-executable │ 143 │ 143 │ 143 │ 3 │ +│ utils/self-extr-exec │ 224 │ 224 │ 224 │ 2 │ +└──────────────────────────────────┴──────────────────┴───────────────┴───────────────┴──────┘ + +24 rows in set. Elapsed: 0.129 sec. Processed 798.15 thousand rows, 15.11 MB (6.19 million rows/s., 117.08 MB/s.) +``` + +## 各著者のコードの何パーセントが他の著者によって削除されたか? + +この質問を解決するには、著者によって書かれた行数を他の貢献者によって削除された総行数で割る必要があります。 + +[プレイ](https://sql.clickhouse.com?query_id=T4DTWTB36WFSEYAZLMGRNF) + +```sql +SELECT + k, + written_code.c, + removed_code.c, + removed_code.c / written_code.c AS remove_ratio +FROM +( + SELECT + author AS k, + count() AS c + FROM git.line_changes + WHERE (sign = 1) AND (file_extension IN ('h', 'cpp')) AND (line_type NOT IN ('Punct', 'Empty')) + GROUP BY k +) AS written_code +INNER JOIN +( + SELECT + prev_author AS k, + count() AS c + FROM git.line_changes + WHERE (sign = -1) AND (file_extension IN ('h', 'cpp')) AND (line_type NOT IN ('Punct', 'Empty')) AND (author != prev_author) + GROUP BY k +) AS removed_code USING (k) +WHERE written_code.c > 1000 +ORDER BY remove_ratio DESC +LIMIT 10 + +┌─k──────────────────┬─────c─┬─removed_code.c─┬───────remove_ratio─┐ +│ Marek Vavruša │ 1458 │ 1318 │ 0.9039780521262003 │ +│ Ivan │ 32715 │ 27500 │ 0.8405930001528351 │ +│ artpaul │ 3450 │ 2840 │ 0.8231884057971014 │ +│ Silviu Caragea │ 1542 │ 1209 │ 0.7840466926070039 │ +│ Ruslan │ 1027 │ 802 │ 0.7809152872444012 │ +│ Tsarkova Anastasia │ 1755 │ 1364 │ 0.7772079772079772 │ +│ Vyacheslav Alipov │ 3526 │ 2727 │ 0.7733976176971072 │ +│ Marek Vavruša │ 1467 │ 1124 │ 0.7661895023858214 │ +│ f1yegor │ 7194 │ 5213 │ 0.7246316374756742 │ +│ kreuzerkrieg │ 3406 │ 2468 │ 0.724603640634175 │ +└────────────────────┴───────┴────────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.126 sec. Processed 15.07 million rows, 73.51 MB (119.97 million rows/s., 585.16 MB/s.) +``` + +## 最も多く書き直されたファイルのリスト? + +この質問に対する最も単純なアプローチは、パスごとの行修正数を単純にカウントすることかもしれません(現行ファイルに制限): + +```sql +WITH current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ) +SELECT + path, + count() AS c +FROM git.line_changes +WHERE (file_extension IN ('h', 'cpp', 'sql')) AND (path IN (current_files)) +GROUP BY path +ORDER BY c DESC +LIMIT 10 + +┌─path───────────────────────────────────────────────────┬─────c─┐ +│ src/Storages/StorageReplicatedMergeTree.cpp │ 21871 │ +│ src/Storages/MergeTree/MergeTreeData.cpp │ 17709 │ +│ programs/client/Client.cpp │ 15882 │ +│ src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp │ 14249 │ +│ src/Interpreters/InterpreterSelectQuery.cpp │ 12636 │ +│ src/Parsers/ExpressionListParsers.cpp │ 11794 │ +│ src/Analyzer/QueryAnalysisPass.cpp │ 11760 │ +│ src/Coordination/KeeperStorage.cpp │ 10225 │ +│ src/Functions/FunctionsConversion.h │ 9247 │ +│ src/Parsers/ExpressionElementParsers.cpp │ 8197 │ +└────────────────────────────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.160 sec. Processed 8.07 million rows, 98.99 MB (50.49 million rows/s., 619.49 MB/s.) +``` + +これは「書き直し」という概念を捉えていませんが、コミット内の大部分のファイルが変更された場合に求めます。これは、より複雑なクエリを必要とします。50%以上が削除され、50%以上が追加された場合を書き直しと見なすとしましょう。このクエリは現在のファイルのみに制限されています。我々は、`path`と`commit_hash`をグループ化することによってすべてのファイル変更をリストし、追加された行と削除された行の数を返します。ウィンドウ関数を使用して、ある瞬間のファイルの累積サイズを推定し、変更がファイルサイズに与える影響を`追加行 - 削除行`として推定します。この統計を使用して、各変更の追加されたまたは削除されたファイルの割合を計算できます。最後に、書き直しを構成するファイル変更の数をカウントします。すなわち、`(percent_add >= 0.5) AND (percent_delete >= 0.5) AND current_size > 50`。ファイルが90行未満の場合はそれを除外し、早期の寄稿が書き直しとしてカウントされるのを避けます。これにより非常に小さなファイルへのバイアスを避けることができます。 + +[プレイ](https://sql.clickhouse.com?query_id=5PL1QLNSH6QQTR8H9HINNP) + +```sql +WITH + current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ), + changes AS + ( + SELECT + path, + max(time) AS max_time, + commit_hash, + any(lines_added) AS num_added, + any(lines_deleted) AS num_deleted, + any(change_type) AS type + FROM git.file_changes + WHERE (change_type IN ('Add', 'Modify')) AND (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY + path, + commit_hash + ORDER BY + path ASC, + max_time ASC + ), + rewrites AS + ( + SELECT + path, + commit_hash, + max_time, + type, + num_added, + num_deleted, + sum(num_added - num_deleted) OVER (PARTITION BY path ORDER BY max_time ASC) AS current_size, + if(current_size > 0, num_added / current_size, 0) AS percent_add, + if(current_size > 0, num_deleted / current_size, 0) AS percent_delete + FROM changes + ) +SELECT + path, + count() AS num_rewrites +FROM rewrites +WHERE (type = 'Modify') AND (percent_add >= 0.5) AND (percent_delete >= 0.5) AND (current_size > 50) +GROUP BY path +ORDER BY num_rewrites DESC +LIMIT 10 + +┌─path──────────────────────────────────────────────────┬─num_rewrites─┐ +│ src/Storages/WindowView/StorageWindowView.cpp │ 8 │ +│ src/Functions/array/arrayIndex.h │ 7 │ +│ src/Dictionaries/CacheDictionary.cpp │ 6 │ +│ src/Dictionaries/RangeHashedDictionary.cpp │ 5 │ +│ programs/client/Client.cpp │ 4 │ +│ src/Functions/polygonPerimeter.cpp │ 4 │ +│ src/Functions/polygonsEquals.cpp │ 4 │ +│ src/Functions/polygonsWithin.cpp │ 4 │ +│ src/Processors/Formats/Impl/ArrowColumnToCHColumn.cpp │ 4 │ +│ src/Functions/polygonsSymDifference.cpp │ 4 │ +└───────────────────────────────────────────────────────┴──────────────┘ + +10 rows in set. Elapsed: 0.299 sec. Processed 798.15 thousand rows, 31.52 MB (2.67 million rows/s., 105.29 MB/s.) +``` + +## コードがリポジトリに留まる可能性が最も高い曜日は? + +このためには、コードの行を一意に特定する必要があります。同じ行がファイル内に複数回表示される可能性があるため、パスと行の内容を使用して推定します。 + +追加された行に関するクエリを作成し、削除された行と結合し、後者が前者よりも最近発生したケースをフィルタリングします。これにより、削除された行を取得し、これらの二つのイベント間の時間を計算できます。 + +最後に、このデータセットを集約して、曜日ごとのリポジトリの平均保持日数を計算します。 + +[プレイ](https://sql.clickhouse.com?query_id=GVF23LEZTNZI22BT8LZBBE) + +```sql +SELECT + day_of_week_added, + count() AS num, + avg(days_present) AS avg_days_present +FROM +( + SELECT + added_code.line, + added_code.time AS added_day, + dateDiff('day', added_code.time, removed_code.time) AS days_present + FROM + ( + SELECT + path, + line, + max(time) AS time + FROM git.line_changes + WHERE (sign = 1) AND (line_type NOT IN ('Punct', 'Empty')) + GROUP BY + path, + line + ) AS added_code + INNER JOIN + ( + SELECT + path, + line, + max(time) AS time + FROM git.line_changes + WHERE (sign = -1) AND (line_type NOT IN ('Punct', 'Empty')) + GROUP BY + path, + line + ) AS removed_code USING (path, line) + WHERE removed_code.time > added_code.time +) +GROUP BY dayOfWeek(added_day) AS day_of_week_added + +┌─day_of_week_added─┬────num─┬───avg_days_present─┐ +│ 1 │ 171879 │ 193.81759260875384 │ +│ 2 │ 141448 │ 153.0931013517335 │ +│ 3 │ 161230 │ 137.61553681076722 │ +│ 4 │ 255728 │ 121.14149799787273 │ +│ 5 │ 203907 │ 141.60181847606998 │ +│ 6 │ 62305 │ 202.43449161383518 │ +│ 7 │ 70904 │ 220.0266134491707 │ +└───────────────────┴────────┴────────────────────┘ + +7 rows in set. Elapsed: 3.965 sec. Processed 15.07 million rows, 1.92 GB (3.80 million rows/s., 483.50 MB/s.) +``` + +## 平均コード年齢でソートされたファイル + +このクエリは、[コードがリポジトリに留まる可能性が最も高い曜日は?](#コードがリポジトリに留まる可能性が最も高い曜日は) と同じ原則を使用します - パスと行の内容を使用して、行のコードを一意に特定します。これにより、ラインが追加されてから削除されるまでの時間を特定できます。ただし、現在のファイルとコードのみにフィルタリングし、各ファイルの行にわたって平均化します。 + +[プレイ](https://sql.clickhouse.com?query_id=3CYYT7HEHWRFHVCM9JCKSU) + +```sql +WITH + current_files AS + ( + SELECT path + FROM + ( + SELECT + old_path AS path, + max(time) AS last_time, + 2 AS change_type + FROM git.file_changes + GROUP BY old_path + UNION ALL + SELECT + path, + max(time) AS last_time, + argMax(change_type, time) AS change_type + FROM git.file_changes + GROUP BY path + ) + GROUP BY path + HAVING (argMax(change_type, last_time) != 2) AND (NOT match(path, '(^dbms/)|(^libs/)|(^tests/testflows/)|(^programs/server/store/)')) + ORDER BY path ASC + ), + lines_removed AS + ( + SELECT + added_code.path AS path, + added_code.line, + added_code.time AS added_day, + dateDiff('day', added_code.time, removed_code.time) AS days_present + FROM + ( + SELECT + path, + line, + max(time) AS time, + any(file_extension) AS file_extension + FROM git.line_changes + WHERE (sign = 1) AND (line_type NOT IN ('Punct', 'Empty')) + GROUP BY + path, + line + ) AS added_code + INNER JOIN + ( + SELECT + path, + line, + max(time) AS time + FROM git.line_changes + WHERE (sign = -1) AND (line_type NOT IN ('Punct', 'Empty')) + GROUP BY + path, + line + ) AS removed_code USING (path, line) + WHERE (removed_code.time > added_code.time) AND (path IN (current_files)) AND (file_extension IN ('h', 'cpp', 'sql')) + ) +SELECT + path, + avg(days_present) AS avg_code_age +FROM lines_removed +GROUP BY path +ORDER BY avg_code_age DESC +LIMIT 10 + +┌─path────────────────────────────────────────────────────────────┬──────avg_code_age─┐ +│ utils/corrector_utf8/corrector_utf8.cpp │ 1353.888888888889 │ +│ tests/queries/0_stateless/01288_shard_max_network_bandwidth.sql │ 881 │ +│ src/Functions/replaceRegexpOne.cpp │ 861 │ +│ src/Functions/replaceRegexpAll.cpp │ 861 │ +│ src/Functions/replaceOne.cpp │ 861 │ +│ utils/zookeeper-remove-by-list/main.cpp │ 838.25 │ +│ tests/queries/0_stateless/01356_state_resample.sql │ 819 │ +│ tests/queries/0_stateless/01293_create_role.sql │ 819 │ +│ src/Functions/ReplaceStringImpl.h │ 810 │ +│ src/Interpreters/createBlockSelector.cpp │ 795 │ +└─────────────────────────────────────────────────────────────────┴───────────────────┘ + +10 rows in set. Elapsed: 3.134 sec. Processed 16.13 million rows, 1.83 GB (5.15 million rows/s., 582.99 MB/s.) +``` + +## 誰がより多くのテスト/CPPコード/コメントを書く傾向があるのか? + +この質問にアプローチする方法はいくつかあります。テスト対コードの比率に焦点を当て、このクエリは比較的簡単です - `tests`を含むフォルダへの寄与をカウントし、総寄与に対する比率を計算します。 + +ただし、20回以上の変更を行ったユーザーに制限して、定期的なコミッターに焦点を当て、一回限りの寄与へのバイアスを避けます。 + +[プレイ](https://sql.clickhouse.com?query_id=JGKZSEQDPDTDKZXD3ZCGLE) + +```sql +SELECT + author, + countIf((file_extension IN ('h', 'cpp', 'sql', 'sh', 'py', 'expect')) AND (path LIKE '%tests%')) AS test, + countIf((file_extension IN ('h', 'cpp', 'sql')) AND (NOT (path LIKE '%tests%'))) AS code, + code / (code + test) AS ratio_code +FROM git.file_changes +GROUP BY author +HAVING code > 20 +ORDER BY code DESC +LIMIT 20 + +┌─author───────────────┬─test─┬──code─┬─────────ratio_code─┐ +│ Alexey Milovidov │ 6617 │ 41799 │ 0.8633303040317251 │ +│ Nikolai Kochetov │ 916 │ 13361 │ 0.9358408629263851 │ +│ alesapin │ 2408 │ 8796 │ 0.785076758300607 │ +│ kssenii │ 869 │ 6769 │ 0.8862267609321812 │ +│ Maksim Kita │ 799 │ 5862 │ 0.8800480408347096 │ +│ Alexander Tokmakov │ 1472 │ 5727 │ 0.7955271565495208 │ +│ Vitaly Baranov │ 1764 │ 5521 │ 0.7578586135895676 │ +│ Ivan Lezhankin │ 843 │ 4698 │ 0.8478613968597726 │ +│ Anton Popov │ 599 │ 4346 │ 0.8788675429726996 │ +│ Ivan │ 2630 │ 4269 │ 0.6187853312074214 │ +│ Azat Khuzhin │ 1664 │ 3697 │ 0.689610147360567 │ +│ Amos Bird │ 400 │ 2901 │ 0.8788245986064829 │ +│ proller │ 1207 │ 2377 │ 0.6632254464285714 │ +│ chertus │ 453 │ 2359 │ 0.8389046941678521 │ +│ alexey-milovidov │ 303 │ 2321 │ 0.8845274390243902 │ +│ Alexey Arno │ 169 │ 2310 │ 0.9318273497377975 │ +│ Vitaliy Lyudvichenko │ 334 │ 2283 │ 0.8723729461215132 │ +│ Robert Schulze │ 182 │ 2196 │ 0.9234650967199327 │ +│ CurtizJ │ 460 │ 2158 │ 0.8242933537051184 │ +│ Alexander Kuzmenkov │ 298 │ 2092 │ 0.8753138075313808 │ +└──────────────────────┴──────┴───────┴────────────────────┘ + +20 rows in set. Elapsed: 0.034 sec. Processed 266.05 thousand rows, 4.65 MB (7.93 million rows/s., 138.76 MB/s.) +``` + +この分布をヒストグラムとしてプロットできます。 + +[プレイ](https://sql.clickhouse.com?query_id=S5AJIIRGSUAY1JXEVHQDAK) + +```sql +WITH ( + SELECT histogram(10)(ratio_code) AS hist + FROM + ( + SELECT + author, + countIf((file_extension IN ('h', 'cpp', 'sql', 'sh', 'py', 'expect')) AND (path LIKE '%tests%')) AS test, + countIf((file_extension IN ('h', 'cpp', 'sql')) AND (NOT (path LIKE '%tests%'))) AS code, + code / (code + test) AS ratio_code + FROM git.file_changes + GROUP BY author + HAVING code > 20 + ORDER BY code DESC + LIMIT 20 + ) + ) AS hist +SELECT + arrayJoin(hist).1 AS lower, + arrayJoin(hist).2 AS upper, + bar(arrayJoin(hist).3, 0, 100, 500) AS bar + +┌──────────────lower─┬──────────────upper─┬─bar───────────────────────────┐ +│ 0.6187853312074214 │ 0.6410053888179964 │ █████ │ +│ 0.6410053888179964 │ 0.6764177968945693 │ █████ │ +│ 0.6764177968945693 │ 0.7237343804750673 │ █████ │ +│ 0.7237343804750673 │ 0.7740802855073157 │ █████▋ │ +│ 0.7740802855073157 │ 0.807297655565091 │ ████████▋ │ +│ 0.807297655565091 │ 0.8338381996094653 │ ██████▎ │ +│ 0.8338381996094653 │ 0.8533566747727687 │ ████████▋ │ +│ 0.8533566747727687 │ 0.871392376017531 │ █████████▍ │ +│ 0.871392376017531 │ 0.904916108899021 │ ████████████████████████████▋ │ +│ 0.904916108899021 │ 0.9358408629263851 │ █████████████████▌ │ +└────────────────────┴────────────────────┴───────────────────────────────┘ +10 rows in set. Elapsed: 0.051 sec. Processed 266.05 thousand rows, 4.65 MB (5.24 million rows/s., 91.64 MB/s.) +``` + +ほとんどの寄稿者は、予想通り、テストよりもコードを多く書きます。 + +コードを寄稿する際に、誰が最も多くのコメントを追加するのでしょうか? + +[プレイ](https://sql.clickhouse.com?query_id=EXPHDIURBTOXXOK1TGNNYD) + +```sql +SELECT + author, + avg(ratio_comments) AS avg_ratio_comments, + sum(code) AS code +FROM +( + SELECT + author, + commit_hash, + countIf(line_type = 'Comment') AS comments, + countIf(line_type = 'Code') AS code, + if(comments > 0, comments / (comments + code), 0) AS ratio_comments + FROM git.line_changes + GROUP BY + author, + commit_hash +) +GROUP BY author +ORDER BY code DESC +LIMIT 10 +┌─author─────────────┬──avg_ratio_comments─┬────code─┐ +│ Alexey Milovidov │ 0.1034915408309902 │ 1147196 │ +│ s-kat │ 0.1361718900215362 │ 614224 │ +│ Nikolai Kochetov │ 0.08722993407690126 │ 218328 │ +│ alesapin │ 0.1040477684726504 │ 198082 │ +│ Vitaly Baranov │ 0.06446875712939285 │ 161801 │ +│ Maksim Kita │ 0.06863376297549255 │ 156381 │ +│ Alexey Arno │ 0.11252677608033655 │ 146642 │ +│ Vitaliy Zakaznikov │ 0.06199215397180561 │ 138530 │ +│ kssenii │ 0.07455322590796751 │ 131143 │ +│ Artur │ 0.12383737231074826 │ 121484 │ +└────────────────────┴─────────────────────┴─────────┘ +10 rows in set. Elapsed: 0.290 sec. Processed 7.54 million rows, 394.57 MB (26.00 million rows/s., 1.36 GB/s.) +``` + +コードの寄与によってソートしていることに注意してください。すべての大きな寄稿者に対して驚くほど高い%であり、これがコードを非常に読みやすくする一因です。 + +## 著者のコミットが時間経過とともにコード/コメントの割合に関してどのように変化するのか? + +著者ごとの計算は簡単です。 + +[プレイ](#U0VMRUNUCiAgICBhdXRob3IsCiAgICBjb3VudElmKGxpbmVfdHlwZSA9ICdDb2RlJykgQVMgY29kZV9saW5lcywKICAgIGNvdW50SWYoKGxpbmVfdHlwZSA9ICdDb21tZW50JykgT1IgKGxpbmVfdHlwZSA9ICdQdW5jdCcpKSBBUyBjb21tZW50cywKICAgIGNvZGVfbGluZXMgLyAoY29tbWVudHMgKyBjb2RlX2xpbmVzKSBBUyByYXRpb19jb2RlLAogICAgdG9TdGFydE9mV2Vlayh0aW1lKSBBUyB3ZWVrCkZST00gZ2l0X2NsaWNraG91c2UubGluZV9jaGFuZ2VzCkdST1VQIEJZCiAgICB0aW1lLAogICAgYXV0aG9yCk9SREVSIEJZCiAgICBhdXRob3IgQVNDLAogICAgdGltZSBBU0MKTElNSVQgMTA=) + +```sql +SELECT + author, + countIf(line_type = 'Code') AS code_lines, + countIf((line_type = 'Comment') OR (line_type = 'Punct')) AS comments, + code_lines / (comments + code_lines) AS ratio_code, + toStartOfWeek(time) AS week +FROM git.line_changes +GROUP BY + time, + author +ORDER BY + author ASC, + time ASC +LIMIT 10 + +┌─author──────────────────────┬─code_lines─┬─comments─┬─────────ratio_code─┬───────week─┐ +│ 1lann │ 8 │ 0 │ 1 │ 2022-03-06 │ +│ 20018712 │ 2 │ 0 │ 1 │ 2020-09-13 │ +│ 243f6a8885a308d313198a2e037 │ 0 │ 2 │ 0 │ 2020-12-06 │ +│ 243f6a8885a308d313198a2e037 │ 0 │ 112 │ 0 │ 2020-12-06 │ +│ 243f6a8885a308d313198a2e037 │ 0 │ 14 │ 0 │ 2020-12-06 │ +│ 3ldar-nasyrov │ 2 │ 0 │ 1 │ 2021-03-14 │ +│ 821008736@qq.com │ 27 │ 2 │ 0.9310344827586207 │ 2019-04-21 │ +│ ANDREI STAROVEROV │ 182 │ 60 │ 0.7520661157024794 │ 2021-05-09 │ +│ ANDREI STAROVEROV │ 7 │ 0 │ 1 │ 2021-05-09 │ +│ ANDREI STAROVEROV │ 32 │ 12 │ 0.7272727272727273 │ 2021-05-09 │ +└─────────────────────────────┴────────────┴──────────┴────────────────────┴────────────┘ + +10 rows in set. Elapsed: 0.145 sec. Processed 7.54 million rows, 51.09 MB (51.83 million rows/s., 351.44 MB/s.) +``` + +理想的には、すべての著者の最初のコミットからの集約でこの変化を見たいと思います。著者は徐々に書くコメントの数を減らしているのでしょうか? + +これを計算するために、まず各著者の時間に伴うコメント比率を計算します - [誰がより多くのテスト/ CPP コード/ コメントを書きがちか?](#who-tends-to-write-more-tests--cpp-code--comments)と同様です。これは各著者の開始日と結合され、コメント比率を週オフセットで計算できます。 + +すべての著者の平均を計算した後、毎10週目を選択してこれらの結果をサンプリングします。 + +[プレイ](https://sql.clickhouse.com?query_id=SBHEWR8XC4PRHY13HPPKCN) + +```sql +WITH author_ratios_by_offset AS + ( + SELECT + author, + dateDiff('week', start_dates.start_date, contributions.week) AS week_offset, + ratio_code + FROM + ( + SELECT + author, + toStartOfWeek(min(time)) AS start_date + FROM git.line_changes + WHERE file_extension IN ('h', 'cpp', 'sql') + GROUP BY author AS start_dates + ) AS start_dates + INNER JOIN + ( + SELECT + author, + countIf(line_type = 'Code') AS code, + countIf((line_type = 'Comment') OR (line_type = 'Punct')) AS comments, + comments / (comments + code) AS ratio_code, + toStartOfWeek(time) AS week + FROM git.line_changes + WHERE (file_extension IN ('h', 'cpp', 'sql')) AND (sign = 1) + GROUP BY + time, + author + HAVING code > 20 + ORDER BY + author ASC, + time ASC + ) AS contributions USING (author) + ) +SELECT + week_offset, + avg(ratio_code) AS avg_code_ratio +FROM author_ratios_by_offset +GROUP BY week_offset +HAVING (week_offset % 10) = 0 +ORDER BY week_offset ASC +LIMIT 20 + +┌─week_offset─┬──────avg_code_ratio─┐ +│ 0 │ 0.21626798253005078 │ +│ 10 │ 0.18299433892099454 │ +│ 20 │ 0.22847255749045017 │ +│ 30 │ 0.2037816688365288 │ +│ 40 │ 0.1987063517030308 │ +│ 50 │ 0.17341406302829748 │ +│ 60 │ 0.1808884776496144 │ +│ 70 │ 0.18711773536450496 │ +│ 80 │ 0.18905573684766458 │ +│ 90 │ 0.2505147771581594 │ +│ 100 │ 0.2427673990917429 │ +│ 110 │ 0.19088569009169926 │ +│ 120 │ 0.14218574654598348 │ +│ 130 │ 0.20894252550489317 │ +│ 140 │ 0.22316626978848397 │ +│ 150 │ 0.1859507592277053 │ +│ 160 │ 0.22007759757363546 │ +│ 170 │ 0.20406936638195144 │ +│ 180 │ 0.1412102467834332 │ +│ 190 │ 0.20677550885049117 │ +└─────────────┴─────────────────────┘ + +20 rows in set. Elapsed: 0.167 sec. Processed 15.07 million rows, 101.74 MB (90.51 million rows/s., 610.98 MB/s.) +``` + +励みになることに、我々のコメント % はかなり安定していて、著者が寄与する期間が長くなるほど劣化しません。 + +## コードが書き換えられるまでの平均時間と中央値(コードの decay の半減期)は? + +すべてのファイルを考慮して書き換えを特定するために、[最も多く再書き換えられたファイルや作者をリストする](#list-files-that-were-rewritten-most-number-of-time-or-by-most-of-authors)と同じ原則を用いることができます。ウィンドウ関数を使用して、各ファイルの書き換え間隔の時間を計算します。これから、すべてのファイルにわたって平均と中央値を計算できます。 + +[プレイ](https://sql.clickhouse.com?query_id=WSHUEPJP9TNJUH7QITWWOR) + +```sql +WITH + changes AS + ( + SELECT + path, + commit_hash, + max_time, + type, + num_added, + num_deleted, + sum(num_added - num_deleted) OVER (PARTITION BY path ORDER BY max_time ASC) AS current_size, + if(current_size > 0, num_added / current_size, 0) AS percent_add, + if(current_size > 0, num_deleted / current_size, 0) AS percent_delete + FROM + ( + SELECT + path, + max(time) AS max_time, + commit_hash, + any(lines_added) AS num_added, + any(lines_deleted) AS num_deleted, + any(change_type) AS type + FROM git.file_changes + WHERE (change_type IN ('Add', 'Modify')) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY + path, + commit_hash + ORDER BY + path ASC, + max_time ASC + ) + ), + rewrites AS + ( + SELECT + *, + any(max_time) OVER (PARTITION BY path ORDER BY max_time ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS previous_rewrite, + dateDiff('day', previous_rewrite, max_time) AS rewrite_days + FROM changes + WHERE (type = 'Modify') AND (percent_add >= 0.5) AND (percent_delete >= 0.5) AND (current_size > 50) + ) +SELECT + avgIf(rewrite_days, rewrite_days > 0) AS avg_rewrite_time, + quantilesTimingIf(0.5)(rewrite_days, rewrite_days > 0) AS half_life +FROM rewrites + +┌─avg_rewrite_time─┬─half_life─┐ +│ 122.2890625 │ [23] │ +└──────────────────┴───────────┘ + +1 row in set. Elapsed: 0.388 sec. Processed 266.05 thousand rows, 22.85 MB (685.82 thousand rows/s., 58.89 MB/s.) +``` + +## どのような時がコードが書き換えられる可能性が最も高いのか? + +[コードが書き換えられるまでの平均時間と中央値(コードの decay の半減期)](#what-is-the-average-time-before-code-will-be-rewritten-and-the-median-half-life-of-code-decay)と[最も多く再書き換えられたファイルや作者をリストする](#list-files-that-were-rewritten-most-number-of-time-or-by-most-of-authors)に似ていますが、こちらは曜日によって集計します。必要に応じて月ごとなどに調整できます。 + +[プレイ](https://sql.clickhouse.com?query_id=8PQNWEWHAJTGN6FTX59KH2) + +```sql +WITH + changes AS + ( + SELECT + path, + commit_hash, + max_time, + type, + num_added, + num_deleted, + sum(num_added - num_deleted) OVER (PARTITION BY path ORDER BY max_time ASC) AS current_size, + if(current_size > 0, num_added / current_size, 0) AS percent_add, + if(current_size > 0, num_deleted / current_size, 0) AS percent_delete + FROM + ( + SELECT + path, + max(time) AS max_time, + commit_hash, + any(file_lines_added) AS num_added, + any(file_lines_deleted) AS num_deleted, + any(file_change_type) AS type + FROM git.line_changes + WHERE (file_change_type IN ('Add', 'Modify')) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY + path, + commit_hash + ORDER BY + path ASC, + max_time ASC + ) + ), + rewrites AS + ( + SELECT any(max_time) OVER (PARTITION BY path ORDER BY max_time ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS previous_rewrite + FROM changes + WHERE (type = 'Modify') AND (percent_add >= 0.5) AND (percent_delete >= 0.5) AND (current_size > 50) + ) +SELECT + dayOfWeek(previous_rewrite) AS dayOfWeek, + count() AS num_re_writes +FROM rewrites +GROUP BY dayOfWeek + +┌─dayOfWeek─┬─num_re_writes─┐ +│ 1 │ 111 │ +│ 2 │ 121 │ +│ 3 │ 91 │ +│ 4 │ 111 │ +│ 5 │ 90 │ +│ 6 │ 64 │ +│ 7 │ 46 │ +└───────────┴───────────────┘ + +7 rows in set. Elapsed: 0.466 sec. Processed 7.54 million rows, 701.52 MB (16.15 million rows/s., 1.50 GB/s.) +``` + +## どの著者のコードが最も安定しているか? + +「安定している」とは、著者のコードが書き換えられるまでの時間を定義します。以前の質問[コードが書き換えられるまでの平均時間と中央値(コードの decay の半減期)](#what-is-the-average-time-before-code-will-be-rewritten-and-the-median-half-life-of-code-decay)と同じ指標を使用した重みを付けます。つまり、ファイルの追加および削除の比率が50%であることです。各著者ごとの平均書き換え時間を計算し、2ファイル以上の寄稿者のみを考慮します。 + +[プレイ](https://sql.clickhouse.com?query_id=BKHLVVWN5SET1VTIFQ8JVK) + +```sql +WITH + changes AS + ( + SELECT + path, + author, + commit_hash, + max_time, + type, + num_added, + num_deleted, + sum(num_added - num_deleted) OVER (PARTITION BY path ORDER BY max_time ASC) AS current_size, + if(current_size > 0, num_added / current_size, 0) AS percent_add, + if(current_size > 0, num_deleted / current_size, 0) AS percent_delete + FROM + ( + SELECT + path, + any(author) AS author, + max(time) AS max_time, + commit_hash, + any(file_lines_added) AS num_added, + any(file_lines_deleted) AS num_deleted, + any(file_change_type) AS type + FROM git.line_changes + WHERE (file_change_type IN ('Add', 'Modify')) AND (file_extension IN ('h', 'cpp', 'sql')) + GROUP BY + path, + commit_hash + ORDER BY + path ASC, + max_time ASC + ) + ), + rewrites AS + ( + SELECT + *, + any(max_time) OVER (PARTITION BY path ORDER BY max_time ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS previous_rewrite, + dateDiff('day', previous_rewrite, max_time) AS rewrite_days, + any(author) OVER (PARTITION BY path ORDER BY max_time ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_author + FROM changes + WHERE (type = 'Modify') AND (percent_add >= 0.5) AND (percent_delete >= 0.5) AND (current_size > 50) + ) +SELECT + prev_author, + avg(rewrite_days) AS c, + uniq(path) AS num_files +FROM rewrites +GROUP BY prev_author +HAVING num_files > 2 +ORDER BY c DESC +LIMIT 10 + +┌─prev_author─────────┬──────────────────c─┬─num_files─┐ +│ Michael Kolupaev │ 304.6 │ 4 │ +│ alexey-milovidov │ 81.83333333333333 │ 4 │ +│ Alexander Kuzmenkov │ 64.5 │ 5 │ +│ Pavel Kruglov │ 55.8 │ 6 │ +│ Alexey Milovidov │ 48.416666666666664 │ 90 │ +│ Amos Bird │ 42.8 │ 4 │ +│ alesapin │ 38.083333333333336 │ 12 │ +│ Nikolai Kochetov │ 33.18421052631579 │ 26 │ +│ Alexander Tokmakov │ 31.866666666666667 │ 12 │ +│ Alexey Zatelepin │ 22.5 │ 4 │ +└─────────────────────┴────────────────────┴───────────┘ + +10 rows in set. Elapsed: 0.555 sec. Processed 7.54 million rows, 720.60 MB (13.58 million rows/s., 1.30 GB/s.) +``` + +## ある著者による最も連続したコミットの日数 + +このクエリは、まず著者がコミットした日を計算する必要があります。ウィンドウ関数を使用して著者ごとに分割し、コミット間の日数を計算できます。各コミットについて、前回のコミットからの時間が1日であればそれを連続(1)としてマークし、そうでない場合は0として `consecutive_day` に結果を保存します。 + +その後、配列関数を使って各著者の最長の連続1のシーケンスを計算します。まず、`groupArray` 関数を使って著者ごとのすべての `consecutive_day` 値をまとめます。この1と0の配列は、0の値で分割され、サブ配列に変換されます。最後に、最も長いサブ配列を計算します。 + +[プレイ](https://sql.clickhouse.com?query_id=S3E64UYCAMDAYJRSXINVFR) + +```sql +WITH commit_days AS + ( + SELECT + author, + day, + any(day) OVER (PARTITION BY author ORDER BY day ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS previous_commit, + dateDiff('day', previous_commit, day) AS days_since_last, + if(days_since_last = 1, 1, 0) AS consecutive_day + FROM + ( + SELECT + author, + toStartOfDay(time) AS day + FROM git.commits + GROUP BY + author, + day + ORDER BY + author ASC, + day ASC + ) + ) +SELECT + author, + arrayMax(arrayMap(x -> length(x), arraySplit(x -> (x = 0), groupArray(consecutive_day)))) - 1 AS max_consecutive_days +FROM commit_days +GROUP BY author +ORDER BY max_consecutive_days DESC +LIMIT 10 + +┌─author───────────┬─max_consecutive_days─┐ +│ kssenii │ 32 │ +│ Alexey Milovidov │ 30 │ +│ alesapin │ 26 │ +│ Azat Khuzhin │ 23 │ +│ Nikolai Kochetov │ 15 │ +│ feng lv │ 11 │ +│ alexey-milovidov │ 11 │ +│ Igor Nikonov │ 11 │ +│ Maksim Kita │ 11 │ +│ Nikita Vasilev │ 11 │ +└──────────────────┴──────────────────────┘ + +10 rows in set. Elapsed: 0.025 sec. Processed 62.78 thousand rows, 395.47 KB (2.54 million rows/s., 16.02 MB/s.) +``` + +## ファイルの行ごとのコミット履歴 + +ファイルは名前が変更されることがあります。この場合、`path` カラムはファイルの新しいパスに設定され、`old_path` は前の場所を示します。例えば: + +[プレイ](https://sql.clickhouse.com?query_id=AKTW3Z8JZAPQ4H9BH2ZFRX) + +```sql +SELECT + time, + path, + old_path, + commit_hash, + commit_message +FROM git.file_changes +WHERE (path = 'src/Storages/StorageReplicatedMergeTree.cpp') AND (change_type = 'Rename') + +┌────────────────time─┬─path────────────────────────────────────────┬─old_path─────────────────────────────────────┬─commit_hash──────────────────────────────┬─commit_message─┐ +│ 2020-04-03 16:14:31 │ src/Storages/StorageReplicatedMergeTree.cpp │ dbms/Storages/StorageReplicatedMergeTree.cpp │ 06446b4f08a142d6f1bc30664c47ded88ab51782 │ dbms/ → src/ │ +└─────────────────────┴─────────────────────────────────────────────┴──────────────────────────────────────────────┴──────────────────────────────────────────┴────────────────┘ + +1 row in set. Elapsed: 0.135 sec. Processed 266.05 thousand rows, 20.73 MB (1.98 million rows/s., 154.04 MB/s.) +``` + +これにより、ファイルの完全な履歴を表示するのは難しいです。すべての行またはファイルの変更を接続する単一の値が存在しないからです。 + +これに対処するために、ユーザー定義関数(UDF)を使用することができます。これらは現在再帰的ではないため、ファイルの履歴を特定するためには、互いに明示的に呼び出す一連の UDF を定義する必要があります。 + +これにより、名前変更を最大深度まで追跡できるようになります - 次の例は5深です。ファイルがこの回数以上に名前が変更される可能性は低いため、現段階ではこれで十分です。 + +```sql +CREATE FUNCTION file_path_history AS (n) -> if(empty(n), [], arrayConcat([n], file_path_history_01((SELECT if(empty(old_path), Null, old_path) FROM git.file_changes WHERE path = n AND (change_type = 'Rename' OR change_type = 'Add') LIMIT 1)))); +CREATE FUNCTION file_path_history_01 AS (n) -> if(isNull(n), [], arrayConcat([n], file_path_history_02((SELECT if(empty(old_path), Null, old_path) FROM git.file_changes WHERE path = n AND (change_type = 'Rename' OR change_type = 'Add') LIMIT 1)))); +CREATE FUNCTION file_path_history_02 AS (n) -> if(isNull(n), [], arrayConcat([n], file_path_history_03((SELECT if(empty(old_path), Null, old_path) FROM git.file_changes WHERE path = n AND (change_type = 'Rename' OR change_type = 'Add') LIMIT 1)))); +CREATE FUNCTION file_path_history_03 AS (n) -> if(isNull(n), [], arrayConcat([n], file_path_history_04((SELECT if(empty(old_path), Null, old_path) FROM git.file_changes WHERE path = n AND (change_type = 'Rename' OR change_type = 'Add') LIMIT 1)))); +CREATE FUNCTION file_path_history_04 AS (n) -> if(isNull(n), [], arrayConcat([n], file_path_history_05((SELECT if(empty(old_path), Null, old_path) FROM git.file_changes WHERE path = n AND (change_type = 'Rename' OR change_type = 'Add') LIMIT 1)))); +CREATE FUNCTION file_path_history_05 AS (n) -> if(isNull(n), [], [n]); +``` + +`file_path_history('src/Storages/StorageReplicatedMergeTree.cpp')`を呼び出すことによって、名前変更の履歴を再帰的にたどります。各関数は `old_path` で次のレベルを呼び出します。結果は `arrayConcat` を使用して組み合わされます。 + +例えば、 + +```sql +SELECT file_path_history('src/Storages/StorageReplicatedMergeTree.cpp') AS paths + +┌─paths─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ ['src/Storages/StorageReplicatedMergeTree.cpp','dbms/Storages/StorageReplicatedMergeTree.cpp','dbms/src/Storages/StorageReplicatedMergeTree.cpp'] │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.074 sec. Processed 344.06 thousand rows, 6.27 MB (4.65 million rows/s., 84.71 MB/s.) +``` + +この機能を使用して、ファイルの完全な履歴のためのコミットを組み立てることができます。この例では、各 `path` 値のために1つのコミットを示します。 + +```sql +SELECT + time, + substring(commit_hash, 1, 11) AS commit, + change_type, + author, + path, + commit_message +FROM git.file_changes +WHERE path IN file_path_history('src/Storages/StorageReplicatedMergeTree.cpp') +ORDER BY time DESC +LIMIT 1 BY path +FORMAT PrettyCompactMonoBlock + +┌────────────────time─┬─commit──────┬─change_type─┬─author─────────────┬─path─────────────────────────────────────────────┬─commit_message──────────────────────────────────────────────────────────────────┐ +│ 2022-10-30 16:30:51 │ c68ab231f91 │ Modify │ Alexander Tokmakov │ src/Storages/StorageReplicatedMergeTree.cpp │ fix accessing part in Deleting state │ +│ 2020-04-03 15:21:24 │ 38a50f44d34 │ Modify │ alesapin │ dbms/Storages/StorageReplicatedMergeTree.cpp │ Remove empty line │ +│ 2020-04-01 19:21:27 │ 1d5a77c1132 │ Modify │ alesapin │ dbms/src/Storages/StorageReplicatedMergeTree.cpp │ Tried to add ability to rename primary key columns but just banned this ability │ +└─────────────────────┴─────────────┴─────────────┴────────────────────┴──────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────┘ + +3 rows in set. Elapsed: 0.170 sec. Processed 611.53 thousand rows, 41.76 MB (3.60 million rows/s., 246.07 MB/s.) +``` + +# 未解決の質問 + +## Git blame + +これは、状態を配列関数で保持できないことに起因して特に困難です。これは、各反復で状態を保持できる `arrayFold` または `arrayReduce` で可能になります。 + +高レベルの分析に十分な近似的な解決策は次のようになるかもしれません: + +```sql +SELECT + line_number_new, + argMax(author, time), + argMax(line, time) +FROM git.line_changes +WHERE path IN file_path_history('src/Storages/StorageReplicatedMergeTree.cpp') +GROUP BY line_number_new +ORDER BY line_number_new ASC +LIMIT 20 + +┌─line_number_new─┬─argMax(author, time)─┬─argMax(line, time)────────────────────────────────────────────┐ +│ 1 │ Alexey Milovidov │ #include │ +│ 2 │ s-kat │ #include │ +│ 3 │ Anton Popov │ #include │ +│ 4 │ Alexander Burmak │ #include │ +│ 5 │ avogar │ #include │ +│ 6 │ Alexander Burmak │ #include │ +│ 7 │ Alexander Burmak │ #include │ +│ 8 │ Alexander Burmak │ #include │ +│ 9 │ Alexander Burmak │ #include │ +│ 10 │ Alexander Burmak │ #include │ +│ 11 │ Alexander Burmak │ #include │ +│ 12 │ Nikolai Kochetov │ #include │ +│ 13 │ alesapin │ #include │ +│ 14 │ alesapin │ │ +│ 15 │ Alexey Milovidov │ #include │ +│ 16 │ Alexey Zatelepin │ #include │ +│ 17 │ CurtizJ │ #include │ +│ 18 │ Kirill Shvakov │ #include │ +│ 19 │ s-kat │ #include │ +│ 20 │ Nikita Mikhaylov │ #include │ +└─────────────────┴──────────────────────┴───────────────────────────────────────────────────────────────┘ +20 rows in set. Elapsed: 0.547 sec. Processed 7.88 million rows, 679.20 MB (14.42 million rows/s., 1.24 GB/s.) +``` + +ここでの正確で改善された解決策を歓迎します。 + +## 関連コンテンツ + +- Blog: [Gitコミットと私たちのコミュニティ](https://clickhouse.com/blog/clickhouse-git-community-commits) +- Blog: [Gitコミットシーケンスのためのウィンドウと配列関数](https://clickhouse.com/blog/clickhouse-window-array-functions-git-commits) +- Blog: [ClickHouseとHexでリアルタイム分析アプリを構築する](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine) +- Blog: [ClickHouse + Grafanaを使用したオープンソースGitHubアクティビティの物語](https://clickhouse.com/blog/introduction-to-clickhouse-and-grafana-webinar) +``` diff --git a/docs/ja/getting-started/example-datasets/images/sensors_01.png b/docs/ja/getting-started/example-datasets/images/sensors_01.png new file mode 100644 index 00000000000..1804bda6d1b Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/sensors_01.png differ diff --git a/docs/ja/getting-started/example-datasets/images/sensors_02.png b/docs/ja/getting-started/example-datasets/images/sensors_02.png new file mode 100644 index 00000000000..8226f4578d0 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/sensors_02.png differ diff --git a/docs/ja/getting-started/example-datasets/images/stackoverflow.png b/docs/ja/getting-started/example-datasets/images/stackoverflow.png new file mode 100644 index 00000000000..f31acdc8cc3 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/stackoverflow.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-add-dataset.png b/docs/ja/getting-started/example-datasets/images/superset-add-dataset.png new file mode 100644 index 00000000000..aaa976d76ce Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-add-dataset.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-add.png b/docs/ja/getting-started/example-datasets/images/superset-add.png new file mode 100644 index 00000000000..54bbf11a014 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-add.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-authors-matrix.png b/docs/ja/getting-started/example-datasets/images/superset-authors-matrix.png new file mode 100644 index 00000000000..bdfc6b6f304 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-authors-matrix.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-authors-matrix_v2.png b/docs/ja/getting-started/example-datasets/images/superset-authors-matrix_v2.png new file mode 100644 index 00000000000..aad98b5b077 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-authors-matrix_v2.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-cell-tower-dashboard.png b/docs/ja/getting-started/example-datasets/images/superset-cell-tower-dashboard.png new file mode 100644 index 00000000000..8197ea223c2 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-cell-tower-dashboard.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-choose-a-database.png b/docs/ja/getting-started/example-datasets/images/superset-choose-a-database.png new file mode 100644 index 00000000000..40c71e0a053 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-choose-a-database.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-commits-authors.png b/docs/ja/getting-started/example-datasets/images/superset-commits-authors.png new file mode 100644 index 00000000000..7be831467cf Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-commits-authors.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-connect-a-database.png b/docs/ja/getting-started/example-datasets/images/superset-connect-a-database.png new file mode 100644 index 00000000000..f67d0663063 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-connect-a-database.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-create-map.png b/docs/ja/getting-started/example-datasets/images/superset-create-map.png new file mode 100644 index 00000000000..5ad4395eb13 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-create-map.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-github-lines-added-deleted.png b/docs/ja/getting-started/example-datasets/images/superset-github-lines-added-deleted.png new file mode 100644 index 00000000000..48dbad1934d Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-github-lines-added-deleted.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-lon-lat.png b/docs/ja/getting-started/example-datasets/images/superset-lon-lat.png new file mode 100644 index 00000000000..f07fb899e72 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-lon-lat.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-mcc-204.png b/docs/ja/getting-started/example-datasets/images/superset-mcc-204.png new file mode 100644 index 00000000000..a561c539b58 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-mcc-204.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-radio-umts.png b/docs/ja/getting-started/example-datasets/images/superset-radio-umts.png new file mode 100644 index 00000000000..b0b31b6dbc0 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-radio-umts.png differ diff --git a/docs/ja/getting-started/example-datasets/images/superset-umts-netherlands.png b/docs/ja/getting-started/example-datasets/images/superset-umts-netherlands.png new file mode 100644 index 00000000000..5cb887cb5c1 Binary files /dev/null and b/docs/ja/getting-started/example-datasets/images/superset-umts-netherlands.png differ diff --git a/docs/ja/getting-started/example-datasets/laion.md b/docs/ja/getting-started/example-datasets/laion.md new file mode 100644 index 00000000000..b11cf16fa25 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/laion.md @@ -0,0 +1,276 @@ +# Laion-400M データセット + +[Laion-400M データセット](https://laion.ai/blog/laion-400-open-dataset/) は、400百万枚の画像と英語の画像キャプションを含んでいます。Laion は現在、[さらに大きなデータセット](https://laion.ai/blog/laion-5b/) を提供していますが、その操作は同様です。 + +このデータセットには、画像のURL、画像とそのキャプションの埋め込み、画像とキャプション間の類似度スコア、およびメタデータ(例えば、画像の幅/高さ、ライセンス、NSFWフラグ)が含まれています。ClickHouse で[近似最近傍探索](../../engines/table-engines/mergetree-family/annindexes.md)を実演するためにこのデータセットを使用することができます。 + +## データの準備 + +埋め込みとメタデータは生データの別々のファイルに保存されています。データ準備のステップでは、データをダウンロードしてファイルをマージし、それらを CSV に変換して ClickHouse にインポートします。以下の `download.sh` スクリプトを使用できます: + +```bash +number=${1} +if [[ $number == '' ]]; then + number=1 +fi; +wget --tries=100 https://deploy.laion.ai/8f83b608504d46bb81708ec86e912220/embeddings/img_emb/img_emb_${number}.npy # 画像埋め込みをダウンロード +wget --tries=100 https://deploy.laion.ai/8f83b608504d46bb81708ec86e912220/embeddings/text_emb/text_emb_${number}.npy # テキスト埋め込みをダウンロード +wget --tries=100 https://deploy.laion.ai/8f83b608504d46bb81708ec86e912220/embeddings/metadata/metadata_${number}.parquet # メタデータをダウンロード +python3 process.py $number # ファイルをマージし、CSV に変換 +``` + +`process.py` は以下のように定義されます: + +```python +import pandas as pd +import numpy as np +import os +import sys + +str_i = str(sys.argv[1]) +npy_file = "img_emb_" + str_i + '.npy' +metadata_file = "metadata_" + str_i + '.parquet' +text_npy = "text_emb_" + str_i + '.npy' + +# すべてのファイルを読み込む +im_emb = np.load(npy_file) +text_emb = np.load(text_npy) +data = pd.read_parquet(metadata_file) + +# ファイルを結合 +data = pd.concat([data, pd.DataFrame({"image_embedding" : [*im_emb]}), pd.DataFrame({"text_embedding" : [*text_emb]})], axis=1, copy=False) + +# ClickHouse にインポートするカラム +data = data[['url', 'caption', 'NSFW', 'similarity', "image_embedding", "text_embedding"]] + +# np.array をリストに変換 +data['image_embedding'] = data['image_embedding'].apply(lambda x: list(x)) +data['text_embedding'] = data['text_embedding'].apply(lambda x: list(x)) + +# キャプションに様々な引用符が含まれるための小さなハック +data['caption'] = data['caption'].apply(lambda x: x.replace("'", " ").replace('"', " ")) + +# データを CSV ファイルとしてエクスポート +data.to_csv(str_i + '.csv', header=False) + +# 生データファイルを削除 +os.system(f"rm {npy_file} {metadata_file} {text_npy}") +``` + +データ準備パイプラインを開始するには、以下を実行します: + +```bash +seq 0 409 | xargs -P1 -I{} bash -c './download.sh {}' +``` + +データセットは410個のファイルに分割されており、各ファイルには約100万行が含まれています。データの小さなサブセットで作業したい場合は、例えば `seq 0 9 | ...` として制限を調整してください。 + +(上記のPythonスクリプトは非常に遅く(ファイルあたり約2-10分)、大量のメモリ(ファイルあたり41 GB)を消費し、生成されるcsvファイルも大きい(各10GB)ため注意が必要です。十分なRAMがある場合は、より多くの並列処理を実行するために `-P1` の数を増やしてください。それでも遅すぎる場合は、より良いインジェスション手順、例えば .npy ファイルを parquet に変換してから ClickHouse で処理する方法を検討してください。) + +## テーブルの作成 + +インデックスなしのテーブルを作成するには、次を実行します: + +```sql +CREATE TABLE laion +( + `id` Int64, + `url` String, + `caption` String, + `NSFW` String, + `similarity` Float32, + `image_embedding` Array(Float32), + `text_embedding` Array(Float32) +) +ENGINE = MergeTree +ORDER BY id +SETTINGS index_granularity = 8192 +``` + +CSVファイルをClickHouseにインポートするには: + +```sql +INSERT INTO laion FROM INFILE '{path_to_csv_files}/*.csv' +``` + +## ブルートフォースのANN検索を実行する(ANNインデックスなし) + +ブルートフォースの近似最近傍探索を実行するには、次を実行します: + +```sql +SELECT url, caption FROM laion ORDER BY L2Distance(image_embedding, {target:Array(Float32)}) LIMIT 30 +``` + +`target` は 512 要素の配列で、クライアントパラメータです。このような配列を取得する便利な方法は記事の最後で紹介されます。今のところ、ランダムな猫の画像の埋め込みを `target` として実行できます。 + +**結果** + +``` +┌─url───────────────────────────────────────────────────────────────────────────────────────────────────────────┬─caption────────────────────────────────────────────────────────────────┐ +│ https://s3.amazonaws.com/filestore.rescuegroups.org/6685/pictures/animals/13884/13884995/63318230_463x463.jpg │ Adoptable Female Domestic Short Hair │ +│ https://s3.amazonaws.com/pet-uploads.adoptapet.com/8/b/6/239905226.jpg │ Adopt A Pet :: Marzipan - New York, NY │ +│ http://d1n3ar4lqtlydb.cloudfront.net/9/2/4/248407625.jpg │ Adopt A Pet :: Butterscotch - New Castle, DE │ +│ https://s3.amazonaws.com/pet-uploads.adoptapet.com/e/e/c/245615237.jpg │ Adopt A Pet :: Tiggy - Chicago, IL │ +│ http://pawsofcoronado.org/wp-content/uploads/2012/12/rsz_pumpkin.jpg │ Pumpkin an orange tabby kitten for adoption │ +│ https://s3.amazonaws.com/pet-uploads.adoptapet.com/7/8/3/188700997.jpg │ Adopt A Pet :: Brian the Brad Pitt of cats - Frankfort, IL │ +│ https://s3.amazonaws.com/pet-uploads.adoptapet.com/8/b/d/191533561.jpg │ Domestic Shorthair Cat for adoption in Mesa, Arizona - Charlie │ +│ https://s3.amazonaws.com/pet-uploads.adoptapet.com/0/1/2/221698235.jpg │ Domestic Shorthair Cat for adoption in Marietta, Ohio - Daisy (Spayed) │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────┘ + +8 rows in set. Elapsed: 6.432 sec. Processed 19.65 million rows, 43.96 GB (3.06 million rows/s., 6.84 GB/s.) +``` + +## ANNインデックスでANNを実行する + +ANNインデックスを持つ新しいテーブルを作成し、既存のテーブルからデータを挿入します: + +```sql +CREATE TABLE laion_annoy +( + `id` Int64, + `url` String, + `caption` String, + `NSFW` String, + `similarity` Float32, + `image_embedding` Array(Float32), + `text_embedding` Array(Float32), + INDEX annoy_image image_embedding TYPE annoy(), + INDEX annoy_text text_embedding TYPE annoy() +) +ENGINE = MergeTree +ORDER BY id +SETTINGS index_granularity = 8192; + +INSERT INTO laion_annoy SELECT * FROM laion; +``` + +デフォルトでは、Annoy インデックスは L2 距離をメトリックとして使用します。インデックス作成と検索のための詳細な調整は、Annoy インデックスの[ドキュメント](../../engines/table-engines/mergetree-family/annindexes.md)で説明されています。同じクエリで再度確認してみましょう: + +```sql +SELECT url, caption FROM laion_annoy ORDER BY l2Distance(image_embedding, {target:Array(Float32)}) LIMIT 8 +``` + +**結果** + +``` +┌─url──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─caption──────────────────────────────────────────────────────────────┐ +│ http://tse1.mm.bing.net/th?id=OIP.R1CUoYp_4hbeFSHBaaB5-gHaFj │ bed bugs and pets can cats carry bed bugs pets adviser │ +│ http://pet-uploads.adoptapet.com/1/9/c/1963194.jpg?336w │ Domestic Longhair Cat for adoption in Quincy, Massachusetts - Ashley │ +│ https://thumbs.dreamstime.com/t/cat-bed-12591021.jpg │ Cat on bed Stock Image │ +│ https://us.123rf.com/450wm/penta/penta1105/penta110500004/9658511-portrait-of-british-short-hair-kitten-lieing-at-sofa-on-sun.jpg │ Portrait of british short hair kitten lieing at sofa on sun. │ +│ https://www.easypetmd.com/sites/default/files/Wirehaired%20Vizsla%20(2).jpg │ Vizsla (Wirehaired) image 3 │ +│ https://images.ctfassets.net/yixw23k2v6vo/0000000200009b8800000000/7950f4e1c1db335ef91bb2bc34428de9/dog-cat-flickr-Impatience_1.jpg?w=600&h=400&fm=jpg&fit=thumb&q=65&fl=progressive │ dog and cat image │ +│ https://i1.wallbox.ru/wallpapers/small/201523/eaa582ee76a31fd.jpg │ cats, kittens, faces, tonkinese │ +│ https://www.baxterboo.com/images/breeds/medium/cairn-terrier.jpg │ Cairn Terrier Photo │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┘ + +8 rows in set. Elapsed: 0.641 sec. Processed 22.06 thousand rows, 49.36 MB (91.53 thousand rows/s., 204.81 MB/s.) +``` + +速度は大幅に向上しましたが、より正確ではない結果になっています。これは、ANN インデックスが近似的な検索結果のみを提供するためです。例では類似した画像埋め込みを検索しましたが、画像キャプションの埋め込みを検索することも可能です。 + +## UDFを使用した埋め込みの作成 + +通常、新しい画像や画像キャプションの埋め込みを作成し、データ中の類似画像/画像キャプションのペアを検索したくなります。クライアントを離れることなく `target` ベクトルを作成するために[UDF](../../sql-reference/functions/index.md#sql-user-defined-functions) を使用できます。データの作成と検索用に新しい埋め込みを作成する際には同じモデルを使用することが重要です。以下のスクリプトは、データセットの基礎となる `ViT-B/32` モデルを利用しています。 + +### テキスト埋め込み + +まず、次のPythonスクリプトを ClickHouse のデータパスにある `user_scripts/` ディレクトリに保存し、実行可能にします (`chmod +x encode_text.py`)。 + +`encode_text.py`: + +```python +#!/usr/bin/python3 +import clip +import torch +import numpy as np +import sys + +if __name__ == '__main__': + device = "cuda" if torch.cuda.is_available() else "cpu" + model, preprocess = clip.load("ViT-B/32", device=device) + for text in sys.stdin: + inputs = clip.tokenize(text) + with torch.no_grad(): + text_features = model.encode_text(inputs)[0].tolist() + print(text_features) + sys.stdout.flush() +``` + +次に、ClickHouse サーバーの設定ファイルで `/path/to/*_function.xml` に参照されている場所に `encode_text_function.xml` を作成します。 + +```xml + + + executable + encode_text + Array(Float32) + + String + text + + TabSeparated + encode_text.py + 1000000 + + +``` + +今すぐ次のように使えます: + +```sql +SELECT encode_text('cat'); +``` + +初回の実行はモデルが読み込まれるため遅くなりますが、繰り返すと速くなります。出力結果をコピーして `SET param_target=...` に簡単に書き込むことができます。 + +### 画像埋め込み + +画像埋め込みは、ローカル画像へのパスを画像キャプションテキストの代わりにPythonスクリプトに提供することで同様に作成できます。 + +`encode_image.py` + +```python +#!/usr/bin/python3 +import clip +import torch +import numpy as np +from PIL import Image +import sys + +if __name__ == '__main__': + device = "cuda" if torch.cuda.is_available() else "cpu" + model, preprocess = clip.load("ViT-B/32", device=device) + for text in sys.stdin: + image = preprocess(Image.open(text.strip())).unsqueeze(0).to(device) + with torch.no_grad(): + image_features = model.encode_image(image)[0].tolist() + print(image_features) + sys.stdout.flush() +``` + +`encode_image_function.xml` + +```xml + + + executable_pool + encode_image + Array(Float32) + + String + path + + TabSeparated + encode_image.py + 1000000 + + +``` + +次にこのクエリを実行します: + +```sql +SELECT encode_image('/path/to/your/image'); +``` + diff --git a/docs/ja/getting-started/example-datasets/menus.md b/docs/ja/getting-started/example-datasets/menus.md new file mode 100644 index 00000000000..8d453498cea --- /dev/null +++ b/docs/ja/getting-started/example-datasets/menus.md @@ -0,0 +1,354 @@ +--- +slug: /ja/getting-started/example-datasets/menus +sidebar_label: ニューヨーク公共図書館「What's on the Menu?」データセット +title: "ニューヨーク公共図書館「What's on the Menu?」データセット" +--- + +このデータセットはニューヨーク公共図書館によって作成されました。ホテル、レストラン、カフェのメニューに関する歴史的データで、料理名とそれに対応する価格が含まれています。 + +出典: http://menus.nypl.org/data +このデータはパブリックドメインにあります。 + +このデータは図書館のアーカイブからのものであり、統計分析には不完全で困難かもしれません。しかし、それでもとても魅力的なデータです。メニューに記載されている料理のレコードは約130万件あり、ClickHouseに適しているほど小さなデータ量ですが、良い例です。 + +## データセットをダウンロードする {#download-dataset} + +以下のコマンドを実行します: + +```bash +wget https://s3.amazonaws.com/menusdata.nypl.org/gzips/2021_08_01_07_01_17_data.tgz +# オプション: チェックサムを検証する +md5sum 2021_08_01_07_01_17_data.tgz +# チェックサムは次と一致する必要があります: db6126724de939a5481e3160a2d67d15 +``` + +必要に応じて、最新のリンクを http://menus.nypl.org/data から取得してリンクを置き換えてください。ダウンロードサイズは約35MBです。 + +## データセットを解凍する {#unpack-dataset} + +```bash +tar xvf 2021_08_01_07_01_17_data.tgz +``` + +解凍後のサイズは約150MBです。 + +データは正規化されており、4つのテーブルで構成されています: +- `Menu` — メニューに関する情報: レストラン名、メニューが表示された日付など。 +- `Dish` — 料理に関する情報: 料理名といくつかの特徴。 +- `MenuPage` — メニューのページ情報。すべてのページは特定のメニューに属します。 +- `MenuItem` — メニュー項目。あるメニューページ上の料理とその価格: 料理とメニューページへのリンク。 + +## テーブルを作成する {#create-tables} + +価格を保存するために[Decimal](../../sql-reference/data-types/decimal.md)データ型を使用します。 + +```sql +CREATE TABLE dish +( + id UInt32, + name String, + description String, + menus_appeared UInt32, + times_appeared Int32, + first_appeared UInt16, + last_appeared UInt16, + lowest_price Decimal64(3), + highest_price Decimal64(3) +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu +( + id UInt32, + name String, + sponsor String, + event String, + venue String, + place String, + physical_description String, + occasion String, + notes String, + call_number String, + keywords String, + language String, + date String, + location String, + location_type String, + currency String, + currency_symbol String, + status String, + page_count UInt16, + dish_count UInt16 +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu_page +( + id UInt32, + menu_id UInt32, + page_number UInt16, + image_id String, + full_height UInt16, + full_width UInt16, + uuid UUID +) ENGINE = MergeTree ORDER BY id; + +CREATE TABLE menu_item +( + id UInt32, + menu_page_id UInt32, + price Decimal64(3), + high_price Decimal64(3), + dish_id UInt32, + created_at DateTime, + updated_at DateTime, + xpos Float64, + ypos Float64 +) ENGINE = MergeTree ORDER BY id; +``` + +## データをインポートする {#import-data} + +ClickHouse にデータをアップロードするには、以下を実行します: + +```bash +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO dish FORMAT CSVWithNames" < Dish.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO menu FORMAT CSVWithNames" < Menu.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --query "INSERT INTO menu_page FORMAT CSVWithNames" < MenuPage.csv +clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_default 0 --date_time_input_format best_effort --query "INSERT INTO menu_item FORMAT CSVWithNames" < MenuItem.csv +``` + +データはヘッダ付きのCSVで表されているため、[CSVWithNames](../../interfaces/formats.md#csvwithnames)形式を使用します。 + +データフィールドには二重引用符しか使用されず、一重引用符は値の中に含まれる可能性があり、CSVパーサを混乱させないように`format_csv_allow_single_quotes`を無効にします。 + +[NULL](../../sql-reference/syntax.md#null-literal)を持たないため、[input_format_null_as_default](../../operations/settings/settings-formats.md#settings-input-format-null-as-default)を無効にします。これにより、ClickHouseは`\N` シーケンスを解析しようとし、データ内の`\`で混乱することがあります。 + +設定[date_time_input_format best_effort](../../operations/settings/settings-formats.md#settings-date_time_input_format)は、幅広い形式で[DateTime](../../sql-reference/data-types/datetime.md)フィールドを解析することを可能にします。例えば、'2000-01-01 01:02'のような秒なしのISO-8601形式も認識されます。この設定がないと、固定されたDateTime形式のみが許可されます。 + +## データを非正規化する {#denormalize-data} + +データは複数のテーブルに分けて[正規化](https://en.wikipedia.org/wiki/Database_normalization#Normal_forms)されています。つまり、例えばメニュー項目から料理名をクエリするには、[JOIN](../../sql-reference/statements/select/join.md#select-join)を実行する必要があります。典型的な分析タスクでは、毎回`JOIN`をする代わりに、事前にJOINされたデータを扱う方がはるかに効率的です。これを「非正規化」データと呼びます。 + +すべてのデータをJOINして含む`menu_item_denorm`というテーブルを作成します: + +```sql +CREATE TABLE menu_item_denorm +ENGINE = MergeTree ORDER BY (dish_name, created_at) +AS SELECT + price, + high_price, + created_at, + updated_at, + xpos, + ypos, + dish.id AS dish_id, + dish.name AS dish_name, + dish.description AS dish_description, + dish.menus_appeared AS dish_menus_appeared, + dish.times_appeared AS dish_times_appeared, + dish.first_appeared AS dish_first_appeared, + dish.last_appeared AS dish_last_appeared, + dish.lowest_price AS dish_lowest_price, + dish.highest_price AS dish_highest_price, + menu.id AS menu_id, + menu.name AS menu_name, + menu.sponsor AS menu_sponsor, + menu.event AS menu_event, + menu.venue AS menu_venue, + menu.place AS menu_place, + menu.physical_description AS menu_physical_description, + menu.occasion AS menu_occasion, + menu.notes AS menu_notes, + menu.call_number AS menu_call_number, + menu.keywords AS menu_keywords, + menu.language AS menu_language, + menu.date AS menu_date, + menu.location AS menu_location, + menu.location_type AS menu_location_type, + menu.currency AS menu_currency, + menu.currency_symbol AS menu_currency_symbol, + menu.status AS menu_status, + menu.page_count AS menu_page_count, + menu.dish_count AS menu_dish_count +FROM menu_item + JOIN dish ON menu_item.dish_id = dish.id + JOIN menu_page ON menu_item.menu_page_id = menu_page.id + JOIN menu ON menu_page.menu_id = menu.id; +``` + +## データを検証する {#validate-data} + +クエリ: + +```sql +SELECT count() FROM menu_item_denorm; +``` + +結果: + +```text +┌─count()─┐ +│ 1329175 │ +└─────────┘ +``` + +## クエリを実行する {#run-queries} + +### 料理の平均歴史価格 {#query-averaged-historical-prices} + +クエリ: + +```sql +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 100, 100) +FROM menu_item_denorm +WHERE (menu_currency = 'Dollars') AND (d > 0) AND (d < 2022) +GROUP BY d +ORDER BY d ASC; +``` + +結果: + +```text +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 100, 100)─┐ +│ 1850 │ 618 │ 1.5 │ █▍ │ +│ 1860 │ 1634 │ 1.29 │ █▎ │ +│ 1870 │ 2215 │ 1.36 │ █▎ │ +│ 1880 │ 3909 │ 1.01 │ █ │ +│ 1890 │ 8837 │ 1.4 │ █▍ │ +│ 1900 │ 176292 │ 0.68 │ ▋ │ +│ 1910 │ 212196 │ 0.88 │ ▊ │ +│ 1920 │ 179590 │ 0.74 │ ▋ │ +│ 1930 │ 73707 │ 0.6 │ ▌ │ +│ 1940 │ 58795 │ 0.57 │ ▌ │ +│ 1950 │ 41407 │ 0.95 │ ▊ │ +│ 1960 │ 51179 │ 1.32 │ █▎ │ +│ 1970 │ 12914 │ 1.86 │ █▋ │ +│ 1980 │ 7268 │ 4.35 │ ████▎ │ +│ 1990 │ 11055 │ 6.03 │ ██████ │ +│ 2000 │ 2467 │ 11.85 │ ███████████▋ │ +│ 2010 │ 597 │ 25.66 │ █████████████████████████▋ │ +└──────┴─────────┴──────────────────────┴──────────────────────────────┘ +``` + +結果を慎重に解釈してください。 + +### バーガーの価格 {#query-burger-prices} + +クエリ: + +```sql +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100) +FROM menu_item_denorm +WHERE (menu_currency = 'Dollars') AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%burger%') +GROUP BY d +ORDER BY d ASC; +``` + +結果: + +```text +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)───────────┐ +│ 1880 │ 2 │ 0.42 │ ▋ │ +│ 1890 │ 7 │ 0.85 │ █▋ │ +│ 1900 │ 399 │ 0.49 │ ▊ │ +│ 1910 │ 589 │ 0.68 │ █▎ │ +│ 1920 │ 280 │ 0.56 │ █ │ +│ 1930 │ 74 │ 0.42 │ ▋ │ +│ 1940 │ 119 │ 0.59 │ █▏ │ +│ 1950 │ 134 │ 1.09 │ ██▏ │ +│ 1960 │ 272 │ 0.92 │ █▋ │ +│ 1970 │ 108 │ 1.18 │ ██▎ │ +│ 1980 │ 88 │ 2.82 │ █████▋ │ +│ 1990 │ 184 │ 3.68 │ ███████▎ │ +│ 2000 │ 21 │ 7.14 │ ██████████████▎ │ +│ 2010 │ 6 │ 18.42 │ ████████████████████████████████████▋ │ +└──────┴─────────┴──────────────────────┴───────────────────────────────────────┘ +``` + +### ウォッカ {#query-vodka} + +クエリ: + +```sql +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100) +FROM menu_item_denorm +WHERE (menu_currency IN ('Dollars', '')) AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%vodka%') +GROUP BY d +ORDER BY d ASC; +``` + +結果: + +```text +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)─┐ +│ 1910 │ 2 │ 0 │ │ +│ 1920 │ 1 │ 0.3 │ ▌ │ +│ 1940 │ 21 │ 0.42 │ ▋ │ +│ 1950 │ 14 │ 0.59 │ █▏ │ +│ 1960 │ 113 │ 2.17 │ ████▎ │ +│ 1970 │ 37 │ 0.68 │ █▎ │ +│ 1980 │ 19 │ 2.55 │ █████ │ +│ 1990 │ 86 │ 3.6 │ ███████▏ │ +│ 2000 │ 2 │ 3.98 │ ███████▊ │ +└──────┴─────────┴──────────────────────┴─────────────────────────────┘ +``` + +ウォッカを手に入れるには`ILIKE '%vodka%'`と記述する必要があり、これは確かに主張しています。 + +### キャビア {#query-caviar} + +キャビアの価格を表示しましょう。また、キャビアを含む任意の料理名を表示します。 + +クエリ: + +```sql +SELECT + round(toUInt32OrZero(extract(menu_date, '^\\d{4}')), -1) AS d, + count(), + round(avg(price), 2), + bar(avg(price), 0, 50, 100), + any(dish_name) +FROM menu_item_denorm +WHERE (menu_currency IN ('Dollars', '')) AND (d > 0) AND (d < 2022) AND (dish_name ILIKE '%caviar%') +GROUP BY d +ORDER BY d ASC; +``` + +結果: + +```text +┌────d─┬─count()─┬─round(avg(price), 2)─┬─bar(avg(price), 0, 50, 100)──────┬─any(dish_name)──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1090 │ 1 │ 0 │ │ Caviar │ +│ 1880 │ 3 │ 0 │ │ Caviar │ +│ 1890 │ 39 │ 0.59 │ █▏ │ Butter and caviar │ +│ 1900 │ 1014 │ 0.34 │ ▋ │ Anchovy Caviar on Toast │ +│ 1910 │ 1588 │ 1.35 │ ██▋ │ 1/1 Brötchen Caviar │ +│ 1920 │ 927 │ 1.37 │ ██▋ │ ASTRAKAN CAVIAR │ +│ 1930 │ 289 │ 1.91 │ ███▋ │ Astrachan caviar │ +│ 1940 │ 201 │ 0.83 │ █▋ │ (SPECIAL) Domestic Caviar Sandwich │ +│ 1950 │ 81 │ 2.27 │ ████▌ │ Beluga Caviar │ +│ 1960 │ 126 │ 2.21 │ ████▍ │ Beluga Caviar │ +│ 1970 │ 105 │ 0.95 │ █▊ │ BELUGA MALOSSOL CAVIAR AMERICAN DRESSING │ +│ 1980 │ 12 │ 7.22 │ ██████████████▍ │ Authentic Iranian Beluga Caviar the world's finest black caviar presented in ice garni and a sampling of chilled 100° Russian vodka │ +│ 1990 │ 74 │ 14.42 │ ████████████████████████████▋ │ Avocado Salad, Fresh cut avocado with caviare │ +│ 2000 │ 3 │ 7.82 │ ███████████████▋ │ Aufgeschlagenes Kartoffelsueppchen mit Forellencaviar │ +│ 2010 │ 6 │ 15.58 │ ███████████████████████████████▏ │ "OYSTERS AND PEARLS" "Sabayon" of Pearl Tapioca with Island Creek Oysters and Russian Sevruga Caviar │ +└──────┴─────────┴──────────────────────┴──────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +少なくともウォッカと一緒にキャビアがあります。とても素晴らしいです。 + +## オンラインプレイグラウンド {#playground} + +このデータはClickHouseプレイグラウンドにアップロードされています。[例](https://sql.clickhouse.com?query_id=KB5KQJJFNBKHE5GBUJCP1B)。 diff --git a/docs/ja/getting-started/example-datasets/metrica.md b/docs/ja/getting-started/example-datasets/metrica.md new file mode 100644 index 00000000000..44bdd953dbb --- /dev/null +++ b/docs/ja/getting-started/example-datasets/metrica.md @@ -0,0 +1,137 @@ +--- +slug: /ja/getting-started/example-datasets/metrica +sidebar_label: ウェブ分析データ +description: ヒットおよび訪問を含む匿名化されたウェブ分析データを含む2つのテーブルから成るデータセット +--- + +# 匿名化されたウェブ分析データ + +このデータセットは、ヒット (`hits_v1`) および訪問 (`visits_v1`) を含む匿名化されたウェブ分析データの2つのテーブルから成っています。 + +テーブルは圧縮された `tsv.xz` ファイルとしてダウンロードできます。このドキュメントで扱うサンプルに加え、100百万行を含む `hits` テーブルの拡張版(7.5GB)が TSV 形式で [https://datasets.clickhouse.com/hits/tsv/hits_100m_obfuscated_v1.tsv.xz](https://datasets.clickhouse.com/hits/tsv/hits_100m_obfuscated_v1.tsv.xz) から利用可能です。 + +## データのダウンロードとインポート + +### ヒットの圧縮された TSV ファイルをダウンロード: + +``` bash +curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv +# チェックサムを確認 +md5sum hits_v1.tsv +# チェックサムは次の値と一致するはずです: f3631b6295bf06989c1437491f7592cb +``` + +### データベースとテーブルを作成 + +```bash +clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" +``` + +ヒットテーブル hits_v1 の作成: + +```bash +clickhouse-client --query "CREATE TABLE datasets.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" +``` + +または、ヒットテーブル hits_100m_obfuscated の場合 + +```bash +clickhouse-client --query="CREATE TABLE default.hits_100m_obfuscated (WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, Refresh UInt8, RefererCategoryID UInt16, RefererRegionID UInt32, URLCategoryID UInt16, URLRegionID 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, OriginalURL String, HID UInt32, IsOldCounter UInt8, IsEvent UInt8, IsParameter UInt8, DontCountHits UInt8, WithHash UInt8, HitColor FixedString(1), LocalEventTime DateTime, Age UInt8, Sex UInt8, Income UInt8, Interests UInt16, Robotness UInt8, RemoteIP UInt32, WindowName Int32, OpenerName Int32, HistoryLength Int16, BrowserLanguage FixedString(2), BrowserCountry FixedString(2), SocialNetwork String, SocialAction String, HTTPError UInt16, SendTiming UInt32, DNSTiming UInt32, ConnectTiming UInt32, ResponseStartTiming UInt32, ResponseEndTiming UInt32, FetchTiming UInt32, SocialSourceNetworkID UInt8, SocialSourcePage String, ParamPrice Int64, ParamOrderID String, ParamCurrency FixedString(3), ParamCurrencyID UInt16, 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) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192" +``` + +### ヒットデータをインポートする: + +```bash +cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000 +``` + +行数を確認 + +```bash +clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" +``` + +```response +8873898 +``` + +### 訪問の圧縮された TSV ファイルをダウンロード: + +``` bash +curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv +# チェックサムを確認 +md5sum visits_v1.tsv +# チェックサムは次の値と一致するはずです: 6dafe1a0f24e59e3fc2d0fed85601de6 +``` + +### 訪問テーブルを作成 + +```bash +clickhouse-client --query "CREATE TABLE datasets.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" +``` + +### 訪問データをインポート +```bash +cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000 +``` + +行数を確認 +```bash +clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" +``` + +```response +1680609 +``` + +## 例としてのJOIN + +ヒットと訪問データセットは ClickHouse のテストルーチンで使用され、このクエリはテストスイートの一つです。他のテストは、このページの最後にある *次のステップ* セクションに記載されています。 + +```sql +clickhouse-client --query "SELECT + EventDate, + hits, + visits +FROM +( + SELECT + EventDate, + count() AS hits + FROM datasets.hits_v1 + GROUP BY EventDate +) ANY LEFT JOIN +( + SELECT + StartDate AS EventDate, + sum(Sign) AS visits + FROM datasets.visits_v1 + GROUP BY EventDate +) USING EventDate +ORDER BY hits DESC +LIMIT 10 +SETTINGS joined_subquery_requires_alias = 0 +FORMAT PrettyCompact" +``` + +```response +┌──EventDate─┬────hits─┬─visits─┐ +│ 2014-03-17 │ 1406958 │ 265108 │ +│ 2014-03-19 │ 1405797 │ 261624 │ +│ 2014-03-18 │ 1383658 │ 258723 │ +│ 2014-03-20 │ 1353623 │ 255328 │ +│ 2014-03-21 │ 1245779 │ 236232 │ +│ 2014-03-23 │ 1046491 │ 202212 │ +│ 2014-03-22 │ 1031592 │ 197354 │ +└────────────┴─────────┴────────┘ +``` + +## 次のステップ + +[ClickHouseにおけるスパース主インデックスへの実践的な入門](/docs/ja/guides/best-practices/sparse-primary-indexes.md)は、ヒットデータセットを使用して、ClickHouseが伝統的なリレーショナルデータベースと比較してどのようにインデックス作成を行い、スパース主インデックスを構築・使用するか、またインデックス作成のベストプラクティスについて議論します。 + +これらのテーブルへのクエリの追加例は、ClickHouseの[statefulテスト](https://github.com/ClickHouse/ClickHouse/blob/d7129855757f38ceec3e4ecc6dafacdabe9b178f/tests/queries/1_stateful/00172_parallel_join.sql)の中で見つけることができます。 + +:::note +テストスイートではデータベース名に `test` を使用し、テーブル名は `hits` と `visits` です。データベースとテーブルの名前を変更するか、テストファイルのSQLを編集することができます。 +::: diff --git a/docs/ja/getting-started/example-datasets/noaa.md b/docs/ja/getting-started/example-datasets/noaa.md new file mode 100644 index 00000000000..e1667af8a69 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/noaa.md @@ -0,0 +1,338 @@ +--- +slug: /ja/getting-started/example-datasets/noaa +sidebar_label: NOAA グローバル気象データネットワーク +sidebar_position: 1 +description: 過去120年間の気候データ25億行 +--- + +# NOAA グローバル気象データネットワーク + +このデータセットには、過去120年間の気象観測データが含まれています。各行は時間と観測所地点の測定値です。 + +このデータの[由来](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn)によると、より正確には次のとおりです。 + +> GHCN-Daily は、世界の陸域における日別観測を含むデータセットです。 それは世界中の陸地に基づく観測所からの測定を含み、その約3分の2が降水量測定のみのためのものです (Menne et al., 2012)。 GHCN-Daily は、様々なソースからの気候記録の合成であり、それらは結合され、共通の品質保証レビューを受けています (Durre et al., 2010)。アーカイブには、以下の気象要素が含まれています。 + + - 日最高気温 + - 日最低気温 + - 観測時の気温 + - 降水量 (例:雨、溶けた雪) + - 降雪量 + - 積雪深 + - 利用可能な場合、他の要素 + +## データのダウンロード + +- ClickHouse 用に[準備されたバージョン](#pre-prepared-data)のデータで、データのクレンジング、再構築、および拡張を行っています。 このデータは1900年から2022年のものを対象としています。 +- [オリジナルデータをダウンロード](#original-data)し、ClickHouse が必要とする形式に変換します。独自のカラムを追加したいユーザーはこの方法を試すと良いでしょう。 + +### 準備されたデータ + +より具体的には、Noaa による品質保証チェックに不合格となった行を削除しました。データはまた、1行ごとの測定を観測所IDと日付ごとの行に再構築しています。つまり、 + +```csv +"station_id","date","tempAvg","tempMax","tempMin","precipitation","snowfall","snowDepth","percentDailySun","averageWindSpeed","maxWindSpeed","weatherType" +"AEM00041194","2022-07-30",347,0,308,0,0,0,0,0,0,0 +"AEM00041194","2022-07-31",371,413,329,0,0,0,0,0,0,0 +"AEM00041194","2022-08-01",384,427,357,0,0,0,0,0,0,0 +"AEM00041194","2022-08-02",381,424,352,0,0,0,0,0,0,0 +``` + +これはクエリが簡単であり、結果のテーブルがスパースにならないことを保証します。最後に、データには緯度と経度が追加されています。 + +このデータは以下の S3 ロケーションにあります。データをローカルファイルシステムにダウンロードして (ClickHouse クライアントを使用して挿入する)、またはClickHouseに直接挿入してください ([S3からの挿入](#inserting-from-s3)を参照)。 + +ダウンロード方法: + +```bash +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enriched.parquet +``` + +### オリジナルデータ + +以下に、ClickHouseへのロード準備のためにオリジナルデータをダウンロードして変換する手順を示します。 + +#### ダウンロード + +オリジナルデータをダウンロードするには: + +```bash +for i in {1900..2023}; do wget https://noaa-ghcn-pds.s3.amazonaws.com/csv.gz/${i}.csv.gz; done +``` + +#### サンプリングデータ + +```bash +$ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format PrettyCompact +┌─c1──────────┬───────c2─┬─c3───┬──c4─┬─c5───┬─c6───┬─c7─┬───c8─┐ +│ AE000041196 │ 20210101 │ TMAX │ 278 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AE000041196 │ 20210101 │ PRCP │ 0 │ D │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AE000041196 │ 20210101 │ TAVG │ 214 │ H │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041194 │ 20210101 │ TMAX │ 266 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041194 │ 20210101 │ TMIN │ 178 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041194 │ 20210101 │ PRCP │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041194 │ 20210101 │ TAVG │ 217 │ H │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041217 │ 20210101 │ TMAX │ 262 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041217 │ 20210101 │ TMIN │ 155 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +│ AEM00041217 │ 20210101 │ TAVG │ 202 │ H │ ᴺᵁᴸᴸ │ S │ ᴺᵁᴸᴸ │ +└─────────────┴──────────┴──────┴─────┴──────┴──────┴────┴──────┘ +``` + +[フォーマットドキュメンテーション](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn)の要約とカラムの順序: + + - 11文字の観測所識別コード。これは実際にはいくつかの有用な情報をエンコードしています。 + - YEAR/MONTH/DAY = YYYYMMDDフォーマットの8文字の日付(例:19860529 = 1986年5月29日) + - ELEMENT = 要素タイプの4文字のインジケーター。実際には測定タイプ。利用可能な多くの測定があるが、ここでは以下のものを選択: + - PRCP - 降水量(10分の1mm) + - SNOW - 降雪量(mm) + - SNWD - 積雪深(mm) + - TMAX - 最高気温(摂氏10分の1度) + - TAVG - 平均気温(摂氏10分の1度) + - TMIN - 最低気温(摂氏10分の1度) + - PSUN - 1日の可能な日照の割合(%) + - AWND - 日平均風速(10分の1メートル毎秒) + - WSFG - 突風最大風速(10分の1メートル毎秒) + - WT** = 天候タイプ(**は具体的な天候タイプ明義)。天候タイプの完全なリストはこちら。 +- DATA VALUE = ELEMENTの5文字データ値、すなわち測定の値。 +- M-FLAG = 測定旗の1文字。10の可能性のある値があります。これらの値のいくつかは疑わしいデータの正確性を示します。PRCP、SNOW、およびSNWD測定のみに関連するため、"P"に設定されているデータを受け入れます。 +- Q-FLAGは品質チェックを通過した場合の空の値。問題なく通過したもののみに興味があります。 +- S-FLAG は観察のソース旗。不必要とされるため、無視します。 +- OBS-TIME = 4文字で時間を表し、時分フォーマットです(例:0700 = 午前7時)。古いデータには通常存在しません。当面は無視します。 + +1行ごとの測定はClickHouseにおいてスパースなテーブル構造をもたらします。時間と観測所ごとの行に変換し、測定値がカラムになるように変換します。まず、`qFlag` が空文字列であることを条件に、問題のない行にデータセットを制限します。 + +#### データのクレンジング + +[ClickHouse local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)を使用し、関心のある測定を表し、品質要件を満たす行をフィルタリングできます。 + +```bash +clickhouse local --query "SELECT count() +FROM file('*.csv.gz', CSV, 'station_id String, date String, measurement String, value Int64, mFlag String, qFlag String, sFlag String, obsTime String') WHERE qFlag = '' AND (measurement IN ('PRCP', 'SNOW', 'SNWD', 'TMAX', 'TAVG', 'TMIN', 'PSUN', 'AWND', 'WSFG') OR startsWith(measurement, 'WT'))" + +2679264563 +``` + +26億行以上を超えるため、すべてのファイルを解析するので高速ではありません。私たちの8コアマシンで約160秒かかります。 + +### データのピボット + +1行当たりの測定構造はClickHouseで使用可能ですが、今後のクエリを不必要に複雑化します。観測所IDと日付ごとの行で、各測定タイプとその関連する値がカラムである必要があります。 + +```csv +"station_id","date","tempAvg","tempMax","tempMin","precipitation","snowfall","snowDepth","percentDailySun","averageWindSpeed","maxWindSpeed","weatherType" +"AEM00041194","2022-07-30",347,0,308,0,0,0,0,0,0,0 +"AEM00041194","2022-07-31",371,413,329,0,0,0,0,0,0,0 +"AEM00041194","2022-08-01",384,427,357,0,0,0,0,0,0,0 +"AEM00041194","2022-08-02",381,424,352,0,0,0,0,0,0,0 +``` + +ClickHouse local とシンプルな `GROUP BY` を使って、この構造にデータを再ピボットできます。メモリのオーバーヘッドを制限するため、1ファイルずつこれを行います。 + +```bash +for i in {1900..2022} +do +clickhouse-local --query "SELECT station_id, + toDate32(date) as date, + anyIf(value, measurement = 'TAVG') as tempAvg, + anyIf(value, measurement = 'TMAX') as tempMax, + anyIf(value, measurement = 'TMIN') as tempMin, + anyIf(value, measurement = 'PRCP') as precipitation, + anyIf(value, measurement = 'SNOW') as snowfall, + anyIf(value, measurement = 'SNWD') as snowDepth, + anyIf(value, measurement = 'PSUN') as percentDailySun, + anyIf(value, measurement = 'AWND') as averageWindSpeed, + anyIf(value, measurement = 'WSFG') as maxWindSpeed, + toUInt8OrZero(replaceOne(anyIf(measurement, startsWith(measurement, 'WT') AND value = 1), 'WT', '')) as weatherType +FROM file('$i.csv.gz', CSV, 'station_id String, date String, measurement String, value Int64, mFlag String, qFlag String, sFlag String, obsTime String') + WHERE qFlag = '' AND (measurement IN ('PRCP', 'SNOW', 'SNWD', 'TMAX', 'TAVG', 'TMIN', 'PSUN', 'AWND', 'WSFG') OR startsWith(measurement, 'WT')) +GROUP BY station_id, date +ORDER BY station_id, date FORMAT CSV" >> "noaa.csv"; +done +``` + +このクエリは1つの50GBファイル `noaa.csv` を生成します。 + +### データの拡張 + +データには場所を示すものが観測所IDしかないが、このIDには国コードのプレフィックスが含まれています。理想的には、各観測所に緯度と経度を関連付けるべきです。これを実現するために、NOAAは便利に各観測所の詳細を別の[ghcnd-stations.txt](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file)として提供しています。このファイルにはいくつかのカラムがありますが、私たちの分析に役立つのは5つ、id、緯度、経度、高度、および名前です。 + +```bash +wget http://noaa-ghcn-pds.s3.amazonaws.com/ghcnd-stations.txt +``` + +```bash +clickhouse local --query "WITH stations AS (SELECT id, lat, lon, elevation, splitByString(' GSN ',name)[1] as name FROM file('ghcnd-stations.txt', Regexp, 'id String, lat Float64, lon Float64, elevation Float32, name String')) +SELECT station_id, + date, + tempAvg, + tempMax, + tempMin, + precipitation, + snowfall, + snowDepth, + percentDailySun, + averageWindSpeed, + maxWindSpeed, + weatherType, + tuple(lon, lat) as location, + elevation, + name +FROM file('noaa.csv', CSV, + 'station_id String, date Date32, tempAvg Int32, tempMax Int32, tempMin Int32, precipitation Int32, snowfall Int32, snowDepth Int32, percentDailySun Int8, averageWindSpeed Int32, maxWindSpeed Int32, weatherType UInt8') as noaa LEFT OUTER + JOIN stations ON noaa.station_id = stations.id INTO OUTFILE 'noaa_enriched.parquet' FORMAT Parquet SETTINGS format_regexp='^(.{11})\s+(\-?\d{1,2}\.\d{4})\s+(\-?\d{1,3}\.\d{1,4})\s+(\-?\d*\.\d*)\s+(.*)\s+(?:[\d]*)'" +``` +このクエリは数分かかり、6.4GBのファイル `noaa_enriched.parquet` を生成します。 + +## テーブルの作成 + +ClickHouseでMergeTreeテーブルを作成します (ClickHouseクライアントから)。 + +```sql +CREATE TABLE noaa +( + `station_id` LowCardinality(String), + `date` Date32, + `tempAvg` Int32 COMMENT '平均気温(摂氏10分の1度)', + `tempMax` Int32 COMMENT '最高気温(摂氏10分の1度)', + `tempMin` Int32 COMMENT '最低気温(摂氏10分の1度)', + `precipitation` UInt32 COMMENT '降水量(10分の1mm)', + `snowfall` UInt32 COMMENT '降雪量(mm)', + `snowDepth` UInt32 COMMENT '積雪深(mm)', + `percentDailySun` UInt8 COMMENT '1日の可能な日照の割合(%)', + `averageWindSpeed` UInt32 COMMENT '日平均風速(10分の1メートル毎秒)', + `maxWindSpeed` UInt32 COMMENT '突風最大風速(10分の1メートル毎秒)', + `weatherType` Enum8('Normal' = 0, 'Fog' = 1, 'Heavy Fog' = 2, 'Thunder' = 3, 'Small Hail' = 4, 'Hail' = 5, 'Glaze' = 6, 'Dust/Ash' = 7, 'Smoke/Haze' = 8, 'Blowing/Drifting Snow' = 9, 'Tornado' = 10, 'High Winds' = 11, 'Blowing Spray' = 12, 'Mist' = 13, 'Drizzle' = 14, 'Freezing Drizzle' = 15, 'Rain' = 16, 'Freezing Rain' = 17, 'Snow' = 18, 'Unknown Precipitation' = 19, 'Ground Fog' = 21, 'Freezing Fog' = 22), + `location` Point, + `elevation` Float32, + `name` LowCardinality(String) +) ENGINE = MergeTree() ORDER BY (station_id, date); + +``` + +## ClickHouseへの挿入 + +### ローカルファイルからの挿入 + +ローカルファイルからデータを挿入するには以下のようにします(ClickHouseクライアントから): + +```sql +INSERT INTO noaa FROM INFILE '/noaa_enriched.parquet' +``` + +ここで `` はディスク上のローカルファイルのフルパスです。 + +このロードの速度を向上する方法については[こちら](https://clickhouse.com/blog/real-world-data-noaa-climate-data#load-the-data)を参照してください。 + +### S3からの挿入 + +```sql +INSERT INTO noaa SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enriched.parquet') +``` + +これを高速化する方法については、大量データロードのチューニングに関する[ブログ投稿](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)を参照してください。 + +## サンプルクエリ + +### これまでの最高気温 + +```sql +SELECT + tempMax / 10 AS maxTemp, + location, + name, + date +FROM blogs.noaa +WHERE tempMax > 500 +ORDER BY + tempMax DESC, + date ASC +LIMIT 5 + +┌─maxTemp─┬─location──────────┬─name───────────────────────────────────────────┬───────date─┐ +│ 56.7 │ (-116.8667,36.45) │ CA GREENLAND RCH │ 1913-07-10 │ +│ 56.7 │ (-115.4667,32.55) │ MEXICALI (SMN) │ 1949-08-20 │ +│ 56.7 │ (-115.4667,32.55) │ MEXICALI (SMN) │ 1949-09-18 │ +│ 56.7 │ (-115.4667,32.55) │ MEXICALI (SMN) │ 1952-07-17 │ +│ 56.7 │ (-115.4667,32.55) │ MEXICALI (SMN) │ 1952-09-04 │ +└─────────┴───────────────────┴────────────────────────────────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.514 sec. Processed 1.06 billion rows, 4.27 GB (2.06 billion rows/s., 8.29 GB/s.) +``` + +[記録の文書](https://en.wikipedia.org/wiki/List_of_weather_records#Highest_temperatures_ever_recorded)されている[Furnace Creek](https://www.google.com/maps/place/36%C2%B027'00.0%22N+116%C2%B052'00.1%22W/@36.1329666,-116.1104099,8.95z/data=!4m5!3m4!1s0x0:0xf2ed901b860f4446!8m2!3d36.45!4d-116.8667)と2023年の状態として矛盾なく一致しています。 + +### ベストスキーリゾート + +屋内雪の少ない[スキーリゾートのリスト](https://gist.githubusercontent.com/gingerwizard/dd022f754fd128fdaf270e58fa052e35/raw/622e03c37460f17ef72907afe554cb1c07f91f23/ski_resort_stats.csv)を利用し、それと過去5年間の雪の多い上位1000気象台を結びつけます。この結びつけを[geoDistance](https://clickhouse.com/docs/ja/sql-reference/functions/geo/coordinates/#geodistance)でソートし、結果を距離が20km未満のものに絞り込み、各リゾートの上位結果を選び、総雪量でソートします。また、高度が1800m以上のリゾートに制限を設けて、優れたスキー条件の広範な指標を示します。 + +```sql +SELECT + resort_name, + total_snow / 1000 AS total_snow_m, + resort_location, + month_year +FROM +( + WITH resorts AS + ( + SELECT + resort_name, + state, + (lon, lat) AS resort_location, + 'US' AS code + FROM url('https://gist.githubusercontent.com/gingerwizard/dd022f754fd128fdaf270e58fa052e35/raw/622e03c37460f17ef72907afe554cb1c07f91f23/ski_resort_stats.csv', CSVWithNames) + ) + SELECT + resort_name, + highest_snow.station_id, + geoDistance(resort_location.1, resort_location.2, station_location.1, station_location.2) / 1000 AS distance_km, + highest_snow.total_snow, + resort_location, + station_location, + month_year + FROM + ( + SELECT + sum(snowfall) AS total_snow, + station_id, + any(location) AS station_location, + month_year, + substring(station_id, 1, 2) AS code + FROM noaa + WHERE (date > '2017-01-01') AND (code = 'US') AND (elevation > 1800) + GROUP BY + station_id, + toYYYYMM(date) AS month_year + ORDER BY total_snow DESC + LIMIT 1000 + ) AS highest_snow + INNER JOIN resorts ON highest_snow.code = resorts.code + WHERE distance_km < 20 + ORDER BY + resort_name ASC, + total_snow DESC + LIMIT 1 BY + resort_name, + station_id +) +ORDER BY total_snow DESC +LIMIT 5 + +┌─resort_name──────────┬─total_snow_m─┬─resort_location─┬─month_year─┐ +│ Sugar Bowl, CA │ 7.799 │ (-120.3,39.27) │ 201902 │ +│ Donner Ski Ranch, CA │ 7.799 │ (-120.34,39.31) │ 201902 │ +│ Boreal, CA │ 7.799 │ (-120.35,39.33) │ 201902 │ +│ Homewood, CA │ 4.926 │ (-120.17,39.08) │ 201902 │ +│ Alpine Meadows, CA │ 4.926 │ (-120.22,39.17) │ 201902 │ +└──────────────────────┴──────────────┴─────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.750 sec. Processed 689.10 million rows, 3.20 GB (918.20 million rows/s., 4.26 GB/s.) +Peak memory usage: 67.66 MiB. +``` + +## 謝辞 + +このデータを準備し、クレンジングし、配布する努力をしてきたグローバル気象データネットワークの方々に感謝いたします。このデータを利用することができ、感謝しております。 + +Menne, M.J., I. Durre, B. Korzeniewski, S. McNeal, K. Thomas, X. Yin, S. Anthony, R. Ray, R.S. Vose, B.E.Gleason, and T.G. Houston, 2012: Global Historical Climatology Network - Daily (GHCN-Daily), Version 3. [使用したサブセットの指示、例:Version 3.25]。NOAA National Centers for Environmental Information http://doi.org/10.7289/V5D21VHZ [17/08/2020] diff --git a/docs/ja/getting-started/example-datasets/nyc-taxi.md b/docs/ja/getting-started/example-datasets/nyc-taxi.md new file mode 100644 index 00000000000..a85e0677265 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/nyc-taxi.md @@ -0,0 +1,356 @@ +--- +slug: /ja/getting-started/example-datasets/nyc-taxi +sidebar_label: New York Taxi Data +sidebar_position: 2 +description: 2009年以降にニューヨーク市から出発する数十億回のタクシーとハイヤー車両 (Uber, Lyftなど) のデータ +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# New York Taxi Data + +ニューヨークのタクシーデータは、2009年以降にニューヨーク市から出発する3億回以上のタクシーとハイヤー車両 (Uber, Lyftなど) のデータで構成されています。このデータセットは以下の方法で入手可能です: + +- データをS3またはGCSから直接ClickHouse Cloudに挿入 +- 準備済みのパーティションをダウンロード + +## テーブルtripsを作成する + +まず、タクシー乗車用のテーブルを作成します: + +```sql +CREATE TABLE trips ( + trip_id UInt32, + pickup_datetime DateTime, + dropoff_datetime DateTime, + pickup_longitude Nullable(Float64), + pickup_latitude Nullable(Float64), + dropoff_longitude Nullable(Float64), + dropoff_latitude Nullable(Float64), + passenger_count UInt8, + trip_distance Float32, + fare_amount Float32, + extra Float32, + tip_amount Float32, + tolls_amount Float32, + total_amount Float32, + payment_type Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5), + pickup_ntaname LowCardinality(String), + dropoff_ntaname LowCardinality(String) +) +ENGINE = MergeTree +PRIMARY KEY (pickup_datetime, dropoff_datetime); +``` + +## オブジェクトストレージからデータを直接ロード + +データに慣れるために、小さなサブセットを取り込みましょう。データはオブジェクトストレージのTSVファイルにあり、`s3`テーブル関数を使用してClickHouse Cloudに簡単にストリーミングできます。 + +同じデータがS3とGCSの両方に保存されていますので、いずれかのタブを選択してください。 + + + + +以下のコマンドは、GCSバケットから3つのファイルを`trips`テーブルにストリーミングします(`{0..2}`構文は0、1、および2のワイルドカードです): + +```sql +INSERT INTO trips +SELECT + trip_id, + pickup_datetime, + dropoff_datetime, + pickup_longitude, + pickup_latitude, + dropoff_longitude, + dropoff_latitude, + passenger_count, + trip_distance, + fare_amount, + extra, + tip_amount, + tolls_amount, + total_amount, + payment_type, + pickup_ntaname, + dropoff_ntaname +FROM gcs( + 'https://storage.googleapis.com/clickhouse-public-datasets/nyc-taxi/trips_{0..2}.gz', + 'TabSeparatedWithNames' +); +``` + + + + +以下のコマンドは、S3バケットから3つのファイルを`trips`テーブルにストリーミングします(`{0..2}`構文は0、1、および2のワイルドカードです): + +```sql +INSERT INTO trips +SELECT + trip_id, + pickup_datetime, + dropoff_datetime, + pickup_longitude, + pickup_latitude, + dropoff_longitude, + dropoff_latitude, + passenger_count, + trip_distance, + fare_amount, + extra, + tip_amount, + tolls_amount, + total_amount, + payment_type, + pickup_ntaname, + dropoff_ntaname +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{0..2}.gz', + 'TabSeparatedWithNames' +); +``` + + + + +## サンプルクエリ + +挿入された行数を確認してみましょう: + +```sql +SELECT count() +FROM trips; +``` + +各TSVファイルには約100万行あり、3つのファイルで3,000,317行になります。いくつかの行を見てみましょう: + +```sql +SELECT * +FROM trips +LIMIT 10; +``` + +ピックアップおよびドロップオフの日付、地理座標、料金の詳細、ニューヨークの地区などのカラムがあることに注意してください: + +```response +┌────trip_id─┬─────pickup_datetime─┬────dropoff_datetime─┬───pickup_longitude─┬────pickup_latitude─┬──dropoff_longitude─┬───dropoff_latitude─┬─passenger_count─┬─trip_distance─┬─fare_amount─┬─extra─┬─tip_amount─┬─tolls_amount─┬─total_amount─┬─payment_type─┬─pickup_ntaname─────────────────────────────┬─dropoff_ntaname────────────────────────────┐ +│ 1200864931 │ 2015-07-01 00:00:13 │ 2015-07-01 00:14:41 │ -73.99046325683594 │ 40.746116638183594 │ -73.97918701171875 │ 40.78467559814453 │ 5 │ 3.54 │ 13.5 │ 0.5 │ 1 │ 0 │ 15.8 │ CSH │ Midtown-Midtown South │ Upper West Side │ +│ 1200018648 │ 2015-07-01 00:00:16 │ 2015-07-01 00:02:57 │ -73.78358459472656 │ 40.648677825927734 │ -73.80242919921875 │ 40.64767837524414 │ 1 │ 1.45 │ 6 │ 0.5 │ 0 │ 0 │ 7.3 │ CRE │ Airport │ Airport │ +│ 1201452450 │ 2015-07-01 00:00:20 │ 2015-07-01 00:11:07 │ -73.98579406738281 │ 40.72777557373047 │ -74.00482177734375 │ 40.73748779296875 │ 5 │ 1.56 │ 8.5 │ 0.5 │ 1.96 │ 0 │ 11.76 │ CSH │ East Village │ West Village │ +│ 1202368372 │ 2015-07-01 00:00:40 │ 2015-07-01 00:05:46 │ -74.00206756591797 │ 40.73833084106445 │ -74.00658416748047 │ 40.74875259399414 │ 2 │ 1 │ 6 │ 0.5 │ 0 │ 0 │ 7.3 │ CRE │ West Village │ Hudson Yards-Chelsea-Flatiron-Union Square │ +│ 1200831168 │ 2015-07-01 00:01:06 │ 2015-07-01 00:09:23 │ -73.98748016357422 │ 40.74344253540039 │ -74.00575256347656 │ 40.716793060302734 │ 1 │ 2.3 │ 9 │ 0.5 │ 2 │ 0 │ 12.3 │ CSH │ Hudson Yards-Chelsea-Flatiron-Union Square │ SoHo-TriBeCa-Civic Center-Little Italy │ +│ 1201362116 │ 2015-07-01 00:01:07 │ 2015-07-01 00:03:31 │ -73.9926986694336 │ 40.75826644897461 │ -73.98628997802734 │ 40.76075744628906 │ 1 │ 0.6 │ 4 │ 0.5 │ 0 │ 0 │ 5.3 │ CRE │ Clinton │ Midtown-Midtown South │ +│ 1200639419 │ 2015-07-01 00:01:13 │ 2015-07-01 00:03:56 │ -74.00382995605469 │ 40.741981506347656 │ -73.99711608886719 │ 40.742271423339844 │ 1 │ 0.49 │ 4 │ 0.5 │ 0 │ 0 │ 5.3 │ CRE │ Hudson Yards-Chelsea-Flatiron-Union Square │ Hudson Yards-Chelsea-Flatiron-Union Square │ +│ 1201181622 │ 2015-07-01 00:01:17 │ 2015-07-01 00:05:12 │ -73.9512710571289 │ 40.78261947631836 │ -73.95230865478516 │ 40.77476119995117 │ 4 │ 0.97 │ 5 │ 0.5 │ 1 │ 0 │ 7.3 │ CSH │ Upper East Side-Carnegie Hill │ Yorkville │ +│ 1200978273 │ 2015-07-01 00:01:28 │ 2015-07-01 00:09:46 │ -74.00822448730469 │ 40.72113037109375 │ -74.00422668457031 │ 40.70782470703125 │ 1 │ 1.71 │ 8.5 │ 0.5 │ 1.96 │ 0 │ 11.76 │ CSH │ SoHo-TriBeCa-Civic Center-Little Italy │ Battery Park City-Lower Manhattan │ +│ 1203283366 │ 2015-07-01 00:01:47 │ 2015-07-01 00:24:26 │ -73.98199462890625 │ 40.77289962768555 │ -73.91968536376953 │ 40.766082763671875 │ 3 │ 5.26 │ 19.5 │ 0.5 │ 5.2 │ 0 │ 26 │ CSH │ Lincoln Square │ Astoria │ +└────────────┴─────────────────────┴─────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴─────────────────┴───────────────┴─────────────┴───────┴────────────┴──────────────┴──────────────┴──────────────┴────────────────────────────────────────────┴────────────────────────────────────────────┘ +``` + +いくつかのクエリを実行してみましょう。まず、ピックアップが最も頻繁に行われる上位10の地区を表示します: + +``` sql +SELECT + pickup_ntaname, + count(*) AS count +FROM trips +GROUP BY pickup_ntaname +ORDER BY count DESC +LIMIT 10; +``` + +結果は次のとおりです: + +```response +┌─pickup_ntaname─────────────────────────────┬──count─┐ +│ Midtown-Midtown South │ 526864 │ +│ Hudson Yards-Chelsea-Flatiron-Union Square │ 288797 │ +│ West Village │ 210436 │ +│ Turtle Bay-East Midtown │ 197111 │ +│ Upper East Side-Carnegie Hill │ 184327 │ +│ Airport │ 151343 │ +│ SoHo-TriBeCa-Civic Center-Little Italy │ 144967 │ +│ Murray Hill-Kips Bay │ 138599 │ +│ Upper West Side │ 135469 │ +│ Clinton │ 130002 │ +└────────────────────────────────────────────┴────────┘ +``` + +次のクエリは、乗客数に基づく平均運賃を示します: + +``` sql +SELECT + passenger_count, + avg(total_amount) +FROM trips +GROUP BY passenger_count; +``` + +```response +┌─passenger_count─┬──avg(total_amount)─┐ +│ 0 │ 25.226335263065018 │ +│ 1 │ 15.961279340656672 │ +│ 2 │ 17.146174183960667 │ +│ 3 │ 17.65380033178517 │ +│ 4 │ 17.248804201047456 │ +│ 5 │ 16.353501285179135 │ +│ 6 │ 15.995094439202836 │ +│ 7 │ 62.077143805367605 │ +│ 8 │ 26.120000791549682 │ +│ 9 │ 10.300000190734863 │ +└─────────────────┴────────────────────┘ +``` + +次は、乗客数と旅行距離の相関関係です: + +``` sql +SELECT + passenger_count, + toYear(pickup_datetime) AS year, + round(trip_distance) AS distance, + count(*) +FROM trips +GROUP BY passenger_count, year, distance +ORDER BY year, count(*) DESC; +``` + +結果の最初の部分は次のとおりです: + +```response +┌─passenger_count─┬─year─┬─distance─┬─count()─┐ +│ 1 │ 2015 │ 1 │ 748644 │ +│ 1 │ 2015 │ 2 │ 521602 │ +│ 1 │ 2015 │ 3 │ 225077 │ +│ 2 │ 2015 │ 1 │ 144990 │ +│ 1 │ 2015 │ 4 │ 134782 │ +│ 1 │ 2015 │ 0 │ 127284 │ +│ 2 │ 2015 │ 2 │ 106411 │ +│ 1 │ 2015 │ 5 │ 72725 │ +│ 5 │ 2015 │ 1 │ 59343 │ +│ 1 │ 2015 │ 6 │ 53447 │ +│ 2 │ 2015 │ 3 │ 48019 │ +│ 3 │ 2015 │ 1 │ 44865 │ +│ 6 │ 2015 │ 1 │ 39409 │ +``` + +## 準備済みパーティションのダウンロード {#download-of-prepared-partitions} + +:::note +以下のステップは、元のデータセットに関する情報と、準備済みパーティションをセルフマネージドのClickHouseサーバー環境にロードする方法を示しています。 +::: + +データセットの説明とダウンロード手順については、https://github.com/toddwschneider/nyc-taxi-data および http://tech.marksblogg.com/billion-nyc-taxi-rides-redshift.html を参照してください。 + +ダウンロードすると、CSVファイルで約227GBの未圧縮データになります。1 Gbit接続で約1時間かかります(s3.amazonaws.comからの並列ダウンロードにより、少なくとも1 Gbitチャンネルの半分が回復されます)。 +一部のファイルは完全にダウンロードされないことがあります。ファイルサイズを確認し、問題があると思われるものを再ダウンロードしてください。 + +``` bash +$ curl -O https://datasets.clickhouse.com/trips_mergetree/partitions/trips_mergetree.tar +# Checksumを確認 +$ md5sum trips_mergetree.tar +# Checksumは次と等しいはずです: f3b8d469b41d9a82da064ded7245d12c +$ tar xvf trips_mergetree.tar -C /var/lib/clickhouse # ClickHouseのデータディレクトリへのパス +$ # 解凍したデータの権限を確認し、必要に応じて修正 +$ sudo service clickhouse-server restart +$ clickhouse-client --query "select count(*) from datasets.trips_mergetree" +``` + +:::info +以下に記載されたクエリを実行する場合、フルテーブル名`datasets.trips_mergetree`を使用する必要があります。 +::: + +## シングルサーバーでの結果 {#results-on-single-server} + +Q1: + +``` sql +SELECT cab_type, count(*) FROM trips_mergetree GROUP BY cab_type; +``` + +0.490秒。 + +Q2: + +``` sql +SELECT passenger_count, avg(total_amount) FROM trips_mergetree GROUP BY passenger_count; +``` + +1.224秒。 + +Q3: + +``` sql +SELECT passenger_count, toYear(pickup_date) AS year, count(*) FROM trips_mergetree GROUP BY passenger_count, year; +``` + +2.104秒。 + +Q4: + +``` sql +SELECT passenger_count, toYear(pickup_date) AS year, round(trip_distance) AS distance, count(*) +FROM trips_mergetree +GROUP BY passenger_count, year, distance +ORDER BY year, count(*) DESC; +``` + +3.593秒。 + +使用したサーバー: + +2つのIntel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz、合計16物理コア、128 GiB RAM、8x6 TB HD on hardware RAID-5 + +実行時間は3回のランの中で最も短いものです。しかし、2回目以降のランからは、データがファイルシステムキャッシュから読み込まれます。これ以上のキャッシュは発生しません:データは各ランで読み込まれ処理されます。 + +3台のサーバーでテーブルを作成: + +各サーバーで: + +``` sql +CREATE TABLE default.trips_mergetree_third ( trip_id UInt32, vendor_id Enum8('1' = 1, '2' = 2, 'CMT' = 3, 'VTS' = 4, 'DDS' = 5, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14), pickup_date Date, pickup_datetime DateTime, dropoff_date Date, dropoff_datetime DateTime, store_and_fwd_flag UInt8, rate_code_id UInt8, pickup_longitude Float64, pickup_latitude Float64, dropoff_longitude Float64, dropoff_latitude Float64, passenger_count UInt8, trip_distance Float64, fare_amount Float32, extra Float32, mta_tax Float32, tip_amount Float32, tolls_amount Float32, ehail_fee Float32, improvement_surcharge Float32, total_amount Float32, payment_type_ Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), trip_type UInt8, pickup FixedString(25), dropoff FixedString(25), cab_type Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), pickup_nyct2010_gid UInt8, pickup_ctlabel Float32, pickup_borocode UInt8, pickup_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5), pickup_ct2010 FixedString(6), pickup_boroct2010 FixedString(7), pickup_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2), pickup_ntacode FixedString(4), pickup_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195), pickup_puma UInt16, dropoff_nyct2010_gid UInt8, dropoff_ctlabel Float32, dropoff_borocode UInt8, dropoff_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5), dropoff_ct2010 FixedString(6), dropoff_boroct2010 FixedString(7), dropoff_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2), dropoff_ntacode FixedString(4), dropoff_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195), dropoff_puma UInt16) ENGINE = MergeTree(pickup_date, pickup_datetime, 8192); +``` + +ソースサーバーで: + +``` sql +CREATE TABLE trips_mergetree_x3 AS trips_mergetree_third ENGINE = Distributed(perftest, default, trips_mergetree_third, rand()); +``` + +以下のクエリデータを再分配します: + +``` sql +INSERT INTO trips_mergetree_x3 SELECT * FROM trips_mergetree; +``` + +この処理には2454秒かかります。 + +3サーバーの場合: + +Q1: 0.212秒。 +Q2: 0.438秒。 +Q3: 0.733秒。 +Q4: 1.241秒。 + +ここに驚きはありません、クエリは線形にスケールしています。 + +また、140台のサーバークラスタからの結果もあります: + +Q1: 0.028秒。 +Q2: 0.043秒。 +Q3: 0.051秒。 +Q4: 0.072秒。 + +この場合、クエリ処理時間は主にネットワーク遅延によって決定されます。 +クエリはクラスターが位置するデータセンターとは異なる場所にあるクライアントを使用して実行されました。このため、約20 msの遅延が追加されました。 + +## まとめ {#summary} + +| サーバー数 | Q1 | Q2 | Q3 | Q4 | +|------------|-------|-------|-------|-------| +| 1, E5-2650v2 | 0.490 | 1.224 | 2.104 | 3.593 | +| 3, E5-2650v2 | 0.212 | 0.438 | 0.733 | 1.241 | +| 1, AWS c5n.4xlarge | 0.249 | 1.279 | 1.738 | 3.527 | +| 1, AWS c5n.9xlarge | 0.130 | 0.584 | 0.777 | 1.811 | +| 3, AWS c5n.9xlarge | 0.057 | 0.231 | 0.285 | 0.641 | +| 140, E5-2650v2 | 0.028 | 0.043 | 0.051 | 0.072 | diff --git a/docs/ja/getting-started/example-datasets/nypd_complaint_data.md b/docs/ja/getting-started/example-datasets/nypd_complaint_data.md new file mode 100644 index 00000000000..2446e7f910c --- /dev/null +++ b/docs/ja/getting-started/example-datasets/nypd_complaint_data.md @@ -0,0 +1,642 @@ +--- +slug: /ja/getting-started/example-datasets/nypd_complaint_data +sidebar_label: NYPD Complaint Data +description: "5つのステップでタブ区切りデータを取り込み、クエリする" +title: NYPD Complaint Data +--- + +タブ区切り値ファイル (TSV) は一般的で、ファイルの最初の行にフィールド見出しが含まれる場合があります。ClickHouseはTSVを取り込むことができ、また、ファイルを取り込まずにTSVにクエリを実行することも可能です。このガイドではこれらのケースを扱います。CSVファイルにクエリを実行または取り込む必要がある場合、フォーマット引数の`TSV`を`CSV`に置き換えるだけで同様の方法が適用できます。 + +このガイドを通じて、以下のことを行います: +- **調査**: TSVファイルの構造と内容をクエリします。 +- **ターゲットとするClickHouseスキーマを決定**: 適切なデータ型を選び、既存のデータをそれらの型にマッピングします。 +- **ClickHouseテーブルを作成**します。 +- データを**前処理してClickHouseにストリーム**します。 +- ClickHouseに対して**いくつかのクエリを実行**します。 + +このガイドで使用するデータセットはニューヨーク市のオープンデータチームから提供され、"ニューヨーク市警察 (NYPD) に報告されたすべての有効な重罪、軽犯罪、違反に関するデータ"が含まれています。執筆時点でデータファイルのサイズは166MBですが、定期的に更新されています。 + +**ソース**: [data.cityofnewyork.us](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243) +**利用規約**: https://www1.nyc.gov/home/terms-of-use.page + +## 前提条件 +- データセットは[NYPD Complaint Data Current (Year To Date)](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243)ページからダウンロードしてください。エクスポートボタンをクリックして**TSV for Excel**を選びます。 +- [ClickHouseサーバーとクライアント](../../getting-started/install.md)をインストールします。 +- [起動](../../getting-started/install.md#launch)し、`clickhouse-client`で接続します + +### このガイドで説明されるコマンドについての注意 +このガイドには2種類のコマンドがあります: +- 一部のコマンドはTSVファイルにクエリを実行するもので、これらはコマンドプロンプトで実行されます。 +- その他のコマンドはClickHouseにクエリを実行するもので、これらは`clickhouse-client`またはPlay UIで実行されます。 + +:::note +このガイドの例は、TSVファイルを`${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv`に保存したと仮定しています。必要に応じてコマンドを調整してください。 +::: + +## TSVファイルに慣れ親しむ +ClickHouseデータベースを使用する前に、データに慣れ親しんでください。 + +### ソースTSVファイルのフィールドを確認する +これがTSVファイルにクエリを実行するコマンドの例です。ただし、まだ実行しないでください。 +```sh +clickhouse-local --query \ +"describe file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames')" +``` + +サンプルレスポンス +```response +CMPLNT_NUM Nullable(Float64) +ADDR_PCT_CD Nullable(Float64) +BORO_NM Nullable(String) +CMPLNT_FR_DT Nullable(String) +CMPLNT_FR_TM Nullable(String) +``` + +:::tip +多くの場合、上記のコマンドは入力データの中で数値フィールドと文字列フィールド、およびタプルであるフィールドを教えてくれます。これは常にそうではありません。ClickHouseは何億ものレコードを含むデータセットでルーチンに使用されるため、スキーマを推測するために既定の行数(100)が調べられますが、これはスキーマを推測するために何十億もの行を解析することを避けるためです。以下のレスポンスは、データセットが毎年数回更新されるため、お客様が見る内容とは一致しないかもしれません。データディクショナリーを見ると、CMPLNT_NUMがテキストとして指定されており、数値ではありません。スキーマ推測のための入力行数を100から設定`SETTINGS input_format_max_rows_to_read_for_schema_inference=2000`にオーバーライドすると、より良いコンテンツの理解ができます。 + +バージョン22.5以降、推測のためのデフォルト行数が25,000行に変更されているため、古いバージョンの場合や25,000行以上のサンプルが必要な場合にのみ設定を変更してください。 +::: + +このコマンドをコマンドプロンプトで実行してください。`clickhouse-local`を使用してダウンロードしたTSVファイル内のデータにクエリを実行します。 +```sh +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"describe file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames')" +``` + +結果: +```response +CMPLNT_NUM Nullable(String) +ADDR_PCT_CD Nullable(Float64) +BORO_NM Nullable(String) +CMPLNT_FR_DT Nullable(String) +CMPLNT_FR_TM Nullable(String) +CMPLNT_TO_DT Nullable(String) +CMPLNT_TO_TM Nullable(String) +CRM_ATPT_CPTD_CD Nullable(String) +HADEVELOPT Nullable(String) +HOUSING_PSA Nullable(Float64) +JURISDICTION_CODE Nullable(Float64) +JURIS_DESC Nullable(String) +KY_CD Nullable(Float64) +LAW_CAT_CD Nullable(String) +LOC_OF_OCCUR_DESC Nullable(String) +OFNS_DESC Nullable(String) +PARKS_NM Nullable(String) +PATROL_BORO Nullable(String) +PD_CD Nullable(Float64) +PD_DESC Nullable(String) +PREM_TYP_DESC Nullable(String) +RPT_DT Nullable(String) +STATION_NAME Nullable(String) +SUSP_AGE_GROUP Nullable(String) +SUSP_RACE Nullable(String) +SUSP_SEX Nullable(String) +TRANSIT_DISTRICT Nullable(Float64) +VIC_AGE_GROUP Nullable(String) +VIC_RACE Nullable(String) +VIC_SEX Nullable(String) +X_COORD_CD Nullable(Float64) +Y_COORD_CD Nullable(Float64) +Latitude Nullable(Float64) +Longitude Nullable(Float64) +Lat_Lon Tuple(Nullable(Float64), Nullable(Float64)) +New Georeferenced Column Nullable(String) +``` + +この時点で、TSVファイルのカラムが[データセットのウェブページ](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243)の**このデータセットのカラム**セクションで指定されている名前と型に一致するか確認してください。データ型は非常に具体的ではなく、すべての数値フィールドは`Nullable(Float64)`に設定され、その他のフィールドはすべて`Nullable(String)`となっています。データを保存するClickHouseテーブルを作成する際に、より適切でパフォーマンスに優れた型を指定できます。 + +### 適切なスキーマを決定する + +フィールドに使用すべき型を判断するには、データがどのように見えるかを知る必要があります。例えば、`JURISDICTION_CODE`フィールドは数値ですが、`UInt8`にすべきか、`Enum`にすべきか、それとも`Float64`が適切かを判断します。 + +```sql +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select JURISDICTION_CODE, count() FROM + file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') + GROUP BY JURISDICTION_CODE + ORDER BY JURISDICTION_CODE + FORMAT PrettyCompact" +``` + +結果: +```response +┌─JURISDICTION_CODE─┬─count()─┐ +│ 0 │ 188875 │ +│ 1 │ 4799 │ +│ 2 │ 13833 │ +│ 3 │ 656 │ +│ 4 │ 51 │ +│ 6 │ 5 │ +│ 7 │ 2 │ +│ 9 │ 13 │ +│ 11 │ 14 │ +│ 12 │ 5 │ +│ 13 │ 2 │ +│ 14 │ 70 │ +│ 15 │ 20 │ +│ 72 │ 159 │ +│ 87 │ 9 │ +│ 88 │ 75 │ +│ 97 │ 405 │ +└───────────────────┴─────────┘ +``` + +このクエリのレスポンスは、`JURISDICTION_CODE`が`UInt8`に適していることを示しています。 + +同様に、一部の`String`フィールドを確認して、それらが`DateTime`または[`LowCardinality(String)`](../../sql-reference/data-types/lowcardinality.md)フィールドに適しているかを確認します。 + +例えば、`PARKS_NM`フィールドは"発生場所の適用がある場合はNYCの公園、遊び場、またはグリーンスペースの名前(州立公園は含まれません)"と説明されています。ニューヨーク市の公園の名前は、`LowCardinality(String)`に適している可能性があります。 + +```sh +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select count(distinct PARKS_NM) FROM + file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') + FORMAT PrettyCompact" +``` + +結果: +```response +┌─uniqExact(PARKS_NM)─┐ +│ 319 │ +└─────────────────────┘ +``` + +いくつかの公園名を見てみましょう: +```sql +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select distinct PARKS_NM FROM + file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') + LIMIT 10 + FORMAT PrettyCompact" +``` + +結果: +```response +┌─PARKS_NM───────────────────┐ +│ (null) │ +│ ASSER LEVY PARK │ +│ JAMES J WALKER PARK │ +│ BELT PARKWAY/SHORE PARKWAY │ +│ PROSPECT PARK │ +│ MONTEFIORE SQUARE │ +│ SUTTON PLACE PARK │ +│ JOYCE KILMER PARK │ +│ ALLEY ATHLETIC PLAYGROUND │ +│ ASTORIA PARK │ +└────────────────────────────┘ +``` + +執筆時のデータセットには、`PARK_NM`カラムに数百の異なる公園や遊び場しか含まれていません。これは、`LowCardinality`推奨の[`LowCardinality`](../../sql-reference/data-types/lowcardinality.md#lowcardinality-dscr)フィールドにおける 10,000未満の異なる文字列を保つための小さな数値です。 + +### DateTimeフィールド +[データセットのウェブページ](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243)の**このデータセットのカラム**セクションに基づき、報告されたイベントの開始と終了の日付と時間フィールドがあります。CMPLNT_FR_DTとCMPLT_TO_DTの最小値と最大値を確認すると、フィールドが常に入力されているかどうか分かります。 + +```sh title="CMPLNT_FR_DT" +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select min(CMPLNT_FR_DT), max(CMPLNT_FR_DT) FROM +file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +FORMAT PrettyCompact" +``` + +結果: +```response +┌─min(CMPLNT_FR_DT)─┬─max(CMPLNT_FR_DT)─┐ +│ 01/01/1973 │ 12/31/2021 │ +└───────────────────┴───────────────────┘ +``` + +```sh title="CMPLNT_TO_DT" +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select min(CMPLNT_TO_DT), max(CMPLNT_TO_DT) FROM +file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +FORMAT PrettyCompact" +``` + +結果: +```response +┌─min(CMPLNT_TO_DT)─┬─max(CMPLNT_TO_DT)─┐ +│ │ 12/31/2021 │ +└───────────────────┴───────────────────┘ +``` + +```sh title="CMPLNT_FR_TM" +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select min(CMPLNT_FR_TM), max(CMPLNT_FR_TM) FROM +file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +FORMAT PrettyCompact" +``` + +結果: +```response +┌─min(CMPLNT_FR_TM)─┬─max(CMPLNT_FR_TM)─┐ +│ 00:00:00 │ 23:59:00 │ +└───────────────────┴───────────────────┘ +``` + +```sh title="CMPLNT_TO_TM" +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select min(CMPLNT_TO_TM), max(CMPLNT_TO_TM) FROM +file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +FORMAT PrettyCompact" +``` + +結果: +```response +┌─min(CMPLNT_TO_TM)─┬─max(CMPLNT_TO_TM)─┐ +│ (null) │ 23:59:00 │ +└───────────────────┴───────────────────┘ +``` + +## プランを立てる + +上記の調査結果に基づき: +- `JURISDICTION_CODE`は`UInt8`としてキャストする必要があります。 +- `PARKS_NM`は`LowCardinality(String)`にキャストするべきです。 +- `CMPLNT_FR_DT`と`CMPLNT_FR_TM`は常に入力されています(おそらくデフォルトの時間`00:00:00`で) +- `CMPLNT_TO_DT`と`CMPLNT_TO_TM`は空欄の可能性があります +- ソースでは、日付と時刻が分割されたフィールドに保存されています +- 日付は`mm/dd/yyyy`形式です +- 時間は`hh:mm:ss`形式です +- 日付と時間は`DateTime`型に連結できます +- 1970年1月1日以前のデータが含まれるため、64ビットのDateTimeが必要です + +:::note +型に加えるべき変更は多数ありますが、すべて同じ調査手順に従って決定できます。フィールドの低位数文字列の数や、最小値と最大値を確認して決定します。このガイドの後のテーブルスキーマは、`LowCardinality`の文字列と符号なし整数フィールドが多く、浮動小数点数値フィールドは非常に少数です。 +::: + +## 日付と時間のフィールドを連結する + +日時フィールド`CMPLNT_FR_DT`と`CMPLNT_FR_TM`を1つの`String`に連結して`DateTime`型にキャストできるようにします。まず2つのフィールドを連結演算子で結合します: `CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM`。`CMPLNT_TO_DT`と`CMPLNT_TO_TM`フィールドも同様に処理されます。 + +```sh +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM AS complaint_begin FROM +file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +LIMIT 10 +FORMAT PrettyCompact" +``` + +結果: +```response +┌─complaint_begin─────┐ +│ 07/29/2010 00:01:00 │ +│ 12/01/2011 12:00:00 │ +│ 04/01/2017 15:00:00 │ +│ 03/26/2018 17:20:00 │ +│ 01/01/2019 00:00:00 │ +│ 06/14/2019 00:00:00 │ +│ 11/29/2021 20:00:00 │ +│ 12/04/2021 00:35:00 │ +│ 12/05/2021 12:50:00 │ +│ 12/07/2021 20:30:00 │ +└─────────────────────┘ +``` + +## 日時文字列をDateTime64型に変換する + +ガイドの早い段階で、TSVファイル内に1970年1月1日以前の日付が存在することが判明したため、日付には64ビットDateTime型が必要です。また、日付は`MM/DD/YYYY`から`YYYY/MM/DD`形式に変換する必要があります。これらはすべて[`parseDateTime64BestEffort()`](../../sql-reference/functions/type-conversion-functions.md#parsedatetime64besteffort)で処理できます。 + +```sh +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"WITH (CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM) AS CMPLNT_START, + (CMPLNT_TO_DT || ' ' || CMPLNT_TO_TM) AS CMPLNT_END +select parseDateTime64BestEffort(CMPLNT_START) AS complaint_begin, + parseDateTime64BestEffortOrNull(CMPLNT_END) AS complaint_end +FROM file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') +ORDER BY complaint_begin ASC +LIMIT 25 +FORMAT PrettyCompact" +``` + +上記の2行目と3行目には、前のステップでの連結があります。4行目と5行目で`String`を`DateTime64`に解析します。苦情の終了時間が存在するとは限らないため、`parseDateTime64BestEffortOrNull`を使用しています。 + +結果: +```response +┌─────────complaint_begin─┬───────────complaint_end─┐ +│ 1925-01-01 10:00:00.000 │ 2021-02-12 09:30:00.000 │ +│ 1925-01-01 11:37:00.000 │ 2022-01-16 11:49:00.000 │ +│ 1925-01-01 15:00:00.000 │ 2021-12-31 00:00:00.000 │ +│ 1925-01-01 15:00:00.000 │ 2022-02-02 22:00:00.000 │ +│ 1925-01-01 19:00:00.000 │ 2022-04-14 05:00:00.000 │ +│ 1955-09-01 19:55:00.000 │ 2022-08-01 00:45:00.000 │ +│ 1972-03-17 11:40:00.000 │ 2022-03-17 11:43:00.000 │ +│ 1972-05-23 22:00:00.000 │ 2022-05-24 09:00:00.000 │ +│ 1972-05-30 23:37:00.000 │ 2022-05-30 23:50:00.000 │ +│ 1972-07-04 02:17:00.000 │ ᴺᵁᴸᴸ │ +│ 1973-01-01 00:00:00.000 │ ᴺᵁᴸᴸ │ +│ 1975-01-01 00:00:00.000 │ ᴺᵁᴸᴸ │ +│ 1976-11-05 00:01:00.000 │ 1988-10-05 23:59:00.000 │ +│ 1977-01-01 00:00:00.000 │ 1977-01-01 23:59:00.000 │ +│ 1977-12-20 00:01:00.000 │ ᴺᵁᴸᴸ │ +│ 1981-01-01 00:01:00.000 │ ᴺᵁᴸᴸ │ +│ 1981-08-14 00:00:00.000 │ 1987-08-13 23:59:00.000 │ +│ 1983-01-07 00:00:00.000 │ 1990-01-06 00:00:00.000 │ +│ 1984-01-01 00:01:00.000 │ 1984-12-31 23:59:00.000 │ +│ 1985-01-01 12:00:00.000 │ 1987-12-31 15:00:00.000 │ +│ 1985-01-11 09:00:00.000 │ 1985-12-31 12:00:00.000 │ +│ 1986-03-16 00:05:00.000 │ 2022-03-16 00:45:00.000 │ +│ 1987-01-07 00:00:00.000 │ 1987-01-09 00:00:00.000 │ +│ 1988-04-03 18:30:00.000 │ 2022-08-03 09:45:00.000 │ +│ 1988-07-29 12:00:00.000 │ 1990-07-27 22:00:00.000 │ +└─────────────────────────┴─────────────────────────┘ +``` +:::note +上記の`1925`年はデータ中のエラーに由来します。オリジナルデータには、`1019`年から`1022`年の日付のまま入力された数件のレコードが含まれており、これらは`2019`年から`2022`年であるべきです。これらは64ビットDateTime型の最初の日である1925年1月1日として格納されています。 +::: + +## テーブルを作成する + +フィールドに対するデータ型の変更に関する前の決定を以下のテーブルスキーマに反映します。また、テーブルの`ORDER BY`と`PRIMARY KEY`を決定します。少なくとも1つの`ORDER BY`または`PRIMARY KEY`を指定する必要があります。このドキュメントの最後にある*次のステップ*セクションで、コラムを`ORDER BY`に含めるためのガイドラインと、より詳しい情報が提供されています。 + +### Order ByとPrimary Keyの句 + +- `ORDER BY`タプルにはクエリフィルタに使用されるフィールドを含めるべきです +- ディスクでの圧縮を最大化するため、`ORDER BY`タプルはカーディナリティの昇順にするべきです +- `PRIMARY KEY`タプルが存在する場合は、`ORDER BY`タプルの部分集合でなければなりません +- `ORDER BY`が指定されている場合、同じタプルが`PRIMARY KEY`として使用されます +- `PRIMARY KEY`インデックスは指定されている`PRIMARY KEY`タプルを用いて作成されるか、`ORDER BY`タプルを用いて作成されます +- `PRIMARY KEY`インデックスはメインメモリに保持されます + +データセットを見て、ニューヨーク市の5区における時間経過に応じた報告された犯罪の種類を調べることに決めたと仮定します。これらのフィールドを`ORDER BY`に含めることになります。 + +| カラム | データ辞書の説明 | +| ----------- | ----------------------------- | +| OFNS_DESC | キーコードに対応する犯罪の説明 | +| RPT_DT | 警察に報告された日 | +| BORO_NM | 発生場所の地区名 | + +TSVファイルをクエリして3つの候補カラムのカーディナリティを確認します: + +```bash +clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ +--query \ +"select formatReadableQuantity(uniq(OFNS_DESC)) as cardinality_OFNS_DESC, + formatReadableQuantity(uniq(RPT_DT)) as cardinality_RPT_DT, + formatReadableQuantity(uniq(BORO_NM)) as cardinality_BORO_NM + FROM + file('${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv', 'TSVWithNames') + FORMAT PrettyCompact" +``` + +結果: +```response +┌─cardinality_OFNS_DESC─┬─cardinality_RPT_DT─┬─cardinality_BORO_NM─┐ +│ 60.00 │ 306.00 │ 6.00 │ +└───────────────────────┴────────────────────┴─────────────────────┘ +``` +カードリナリティを考慮すると、`ORDER BY`は次のようになります: + +``` +ORDER BY ( BORO_NM, OFNS_DESC, RPT_DT ) +``` +:::note +ここでは読みやすいカラム名を使用しており、上記の名前は次のようにマッピングされます。 +``` +ORDER BY ( borough, offense_description, date_reported ) +``` +::: + +データ型の変更と`ORDER BY`タプルを合わせたテーブル構造は以下の通りです: + +```sql +CREATE TABLE NYPD_Complaint ( + complaint_number String, + precinct UInt8, + borough LowCardinality(String), + complaint_begin DateTime64(0,'America/New_York'), + complaint_end DateTime64(0,'America/New_York'), + was_crime_completed String, + housing_authority String, + housing_level_code UInt32, + jurisdiction_code UInt8, + jurisdiction LowCardinality(String), + offense_code UInt8, + offense_level LowCardinality(String), + location_descriptor LowCardinality(String), + offense_description LowCardinality(String), + park_name LowCardinality(String), + patrol_borough LowCardinality(String), + PD_CD UInt16, + PD_DESC String, + location_type LowCardinality(String), + date_reported Date, + transit_station LowCardinality(String), + suspect_age_group LowCardinality(String), + suspect_race LowCardinality(String), + suspect_sex LowCardinality(String), + transit_district UInt8, + victim_age_group LowCardinality(String), + victim_race LowCardinality(String), + victim_sex LowCardinality(String), + NY_x_coordinate UInt32, + NY_y_coordinate UInt32, + Latitude Float64, + Longitude Float64 +) ENGINE = MergeTree + ORDER BY ( borough, offense_description, date_reported ) +``` + +### テーブルの主キーを見つける + +ClickHouseの`system`データベース、特に`system.table`には、今作成したテーブルに関するすべての情報が含まれています。このクエリは`ORDER BY`(ソートキー)と`PRIMARY KEY`を表示します。 +```sql +SELECT + partition_key, + sorting_key, + primary_key, + table +FROM system.tables +WHERE table = 'NYPD_Complaint' +FORMAT Vertical +``` + +レスポンス: +```response +Query id: 6a5b10bf-9333-4090-b36e-c7f08b1d9e01 + +Row 1: +────── +partition_key: +sorting_key: borough, offense_description, date_reported +primary_key: borough, offense_description, date_reported +table: NYPD_Complaint + +1 row in set. Elapsed: 0.001 sec. +``` + +## データの前処理とインポート {#preprocess-import-data} + +データ前処理に`clickhouse-local`ツールを使用し、アップロードには`clickhouse-client`を使います。 + +### 使用する`clickhouse-local`引数 + +:::tip +`clickhouse-local`の引数に`table='input'`が含まれています。clickhouse-localは提供された入力(`cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv`)を受け取り、テーブルに挿入します。デフォルトではそのテーブル名は`table`です。このガイドでは、データフローを明確にするためにテーブル名を`input`に設定しています。clickhouse-localへの最終引数はテーブルから選択するクエリ(`FROM input`)で、これを`clickhouse-client`にパイプしてテーブル`NYPD_Complaint`を入力します。 +::: + +```sql +cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv \ + | clickhouse-local --table='input' --input-format='TSVWithNames' \ + --input_format_max_rows_to_read_for_schema_inference=2000 \ + --query " + WITH (CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM) AS CMPLNT_START, + (CMPLNT_TO_DT || ' ' || CMPLNT_TO_TM) AS CMPLNT_END + SELECT + CMPLNT_NUM AS complaint_number, + ADDR_PCT_CD AS precinct, + BORO_NM AS borough, + parseDateTime64BestEffort(CMPLNT_START) AS complaint_begin, + parseDateTime64BestEffortOrNull(CMPLNT_END) AS complaint_end, + CRM_ATPT_CPTD_CD AS was_crime_completed, + HADEVELOPT AS housing_authority_development, + HOUSING_PSA AS housing_level_code, + JURISDICTION_CODE AS jurisdiction_code, + JURIS_DESC AS jurisdiction, + KY_CD AS offense_code, + LAW_CAT_CD AS offense_level, + LOC_OF_OCCUR_DESC AS location_descriptor, + OFNS_DESC AS offense_description, + PARKS_NM AS park_name, + PATROL_BORO AS patrol_borough, + PD_CD, + PD_DESC, + PREM_TYP_DESC AS location_type, + toDate(parseDateTimeBestEffort(RPT_DT)) AS date_reported, + STATION_NAME AS transit_station, + SUSP_AGE_GROUP AS suspect_age_group, + SUSP_RACE AS suspect_race, + SUSP_SEX AS suspect_sex, + TRANSIT_DISTRICT AS transit_district, + VIC_AGE_GROUP AS victim_age_group, + VIC_RACE AS victim_race, + VIC_SEX AS victim_sex, + X_COORD_CD AS NY_x_coordinate, + Y_COORD_CD AS NY_y_coordinate, + Latitude, + Longitude + FROM input" \ + | clickhouse-client --query='INSERT INTO NYPD_Complaint FORMAT TSV' +``` + +## データの検証 {#validate-data} + +:::note +データセットは年に一度以上変わりますので、カウントがこのドキュメントと一致しない場合があります。 +::: + +クエリ: + +```sql +SELECT count() +FROM NYPD_Complaint +``` + +結果: + +```text +┌─count()─┐ +│ 208993 │ +└─────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +ClickHouse内のデータセットのサイズは、元のTSVファイルのわずか12%です。元のTSVファイルのサイズとテーブルのサイズを比較します。 + +クエリ: + +```sql +SELECT formatReadableSize(total_bytes) +FROM system.tables +WHERE name = 'NYPD_Complaint' +``` + +結果: +```text +┌─formatReadableSize(total_bytes)─┐ +│ 8.63 MiB │ +└─────────────────────────────────┘ +``` + +## クエリを実行する {#run-queries} + +### クエリ1. 月ごとの苦情数を比較する + +クエリ: + +```sql +SELECT + dateName('month', date_reported) AS month, + count() AS complaints, + bar(complaints, 0, 50000, 80) +FROM NYPD_Complaint +GROUP BY month +ORDER BY complaints DESC +``` + +結果: +```response +Query id: 7fbd4244-b32a-4acf-b1f3-c3aa198e74d9 + +┌─month─────┬─complaints─┬─bar(count(), 0, 50000, 80)───────────────────────────────┐ +│ March │ 34536 │ ███████████████████████████████████████████████████████▎ │ +│ May │ 34250 │ ██████████████████████████████████████████████████████▋ │ +│ April │ 32541 │ ████████████████████████████████████████████████████ │ +│ January │ 30806 │ █████████████████████████████████████████████████▎ │ +│ February │ 28118 │ ████████████████████████████████████████████▊ │ +│ November │ 7474 │ ███████████▊ │ +│ December │ 7223 │ ███████████▌ │ +│ October │ 7070 │ ███████████▎ │ +│ September │ 6910 │ ███████████ │ +│ August │ 6801 │ ██████████▊ │ +│ June │ 6779 │ ██████████▋ │ +│ July │ 6485 │ ██████████▍ │ +└───────────┴────────────┴──────────────────────────────────────────────────────────┘ + +12 rows in set. Elapsed: 0.006 sec. Processed 208.99 thousand rows, 417.99 KB (37.48 million rows/s., 74.96 MB/s.) +``` + +### クエリ2. 地区ごとの総苦情数を比較する + +クエリ: + +```sql +SELECT + borough, + count() AS complaints, + bar(complaints, 0, 125000, 60) +FROM NYPD_Complaint +GROUP BY borough +ORDER BY complaints DESC +``` + +結果: +```response +Query id: 8cdcdfd4-908f-4be0-99e3-265722a2ab8d + +┌─borough───────┬─complaints─┬─bar(count(), 0, 125000, 60)──┐ +│ BROOKLYN │ 57947 │ ███████████████████████████▋ │ +│ MANHATTAN │ 53025 │ █████████████████████████▍ │ +│ QUEENS │ 44875 │ █████████████████████▌ │ +│ BRONX │ 44260 │ █████████████████████▏ │ +│ STATEN ISLAND │ 8503 │ ████ │ +│ (null) │ 383 │ ▏ │ +└───────────────┴────────────┴──────────────────────────────┘ + +6 rows in set. Elapsed: 0.008 sec. Processed 208.99 thousand rows, 209.43 KB (27.14 million rows/s., 27.20 MB/s.) +``` + +## 次のステップ + +[A Practical Introduction to Sparse Primary Indexes in ClickHouse](/docs/ja/guides/best-practices/sparse-primary-indexes.md)は、ClickHouseのインデックスが従来のリレーショナルデータベースとどのように異なるか、ClickHouseがスパースなプライマリインデックスをどのように作成し使用するか、そしてインデックスのベストプラクティスについて解説します。 diff --git a/docs/ja/getting-started/example-datasets/ontime.md b/docs/ja/getting-started/example-datasets/ontime.md new file mode 100644 index 00000000000..166af81fc0d --- /dev/null +++ b/docs/ja/getting-started/example-datasets/ontime.md @@ -0,0 +1,398 @@ +--- +slug: /ja/getting-started/example-datasets/ontime +sidebar_label: OnTime 航空便データ +description: 航空便のオンタイムパフォーマンスを含むデータセット +--- + +# OnTime + +このデータセットには、交通統計局からのデータが含まれています。 + +## テーブルの作成 + +``` sql +CREATE TABLE `ontime` +( + `Year` UInt16, + `Quarter` UInt8, + `Month` UInt8, + `DayofMonth` UInt8, + `DayOfWeek` UInt8, + `FlightDate` Date, + `Reporting_Airline` LowCardinality(String), + `DOT_ID_Reporting_Airline` Int32, + `IATA_CODE_Reporting_Airline` LowCardinality(String), + `Tail_Number` LowCardinality(String), + `Flight_Number_Reporting_Airline` LowCardinality(String), + `OriginAirportID` Int32, + `OriginAirportSeqID` Int32, + `OriginCityMarketID` Int32, + `Origin` FixedString(5), + `OriginCityName` LowCardinality(String), + `OriginState` FixedString(2), + `OriginStateFips` FixedString(2), + `OriginStateName` LowCardinality(String), + `OriginWac` Int32, + `DestAirportID` Int32, + `DestAirportSeqID` Int32, + `DestCityMarketID` Int32, + `Dest` FixedString(5), + `DestCityName` LowCardinality(String), + `DestState` FixedString(2), + `DestStateFips` FixedString(2), + `DestStateName` LowCardinality(String), + `DestWac` Int32, + `CRSDepTime` Int32, + `DepTime` Int32, + `DepDelay` Int32, + `DepDelayMinutes` Int32, + `DepDel15` Int32, + `DepartureDelayGroups` LowCardinality(String), + `DepTimeBlk` LowCardinality(String), + `TaxiOut` Int32, + `WheelsOff` LowCardinality(String), + `WheelsOn` LowCardinality(String), + `TaxiIn` Int32, + `CRSArrTime` Int32, + `ArrTime` Int32, + `ArrDelay` Int32, + `ArrDelayMinutes` Int32, + `ArrDel15` Int32, + `ArrivalDelayGroups` LowCardinality(String), + `ArrTimeBlk` LowCardinality(String), + `Cancelled` Int8, + `CancellationCode` FixedString(1), + `Diverted` Int8, + `CRSElapsedTime` Int32, + `ActualElapsedTime` Int32, + `AirTime` Int32, + `Flights` Int32, + `Distance` Int32, + `DistanceGroup` Int8, + `CarrierDelay` Int32, + `WeatherDelay` Int32, + `NASDelay` Int32, + `SecurityDelay` Int32, + `LateAircraftDelay` Int32, + `FirstDepTime` Int16, + `TotalAddGTime` Int16, + `LongestAddGTime` Int16, + `DivAirportLandings` Int8, + `DivReachedDest` Int8, + `DivActualElapsedTime` Int16, + `DivArrDelay` Int16, + `DivDistance` Int16, + `Div1Airport` LowCardinality(String), + `Div1AirportID` Int32, + `Div1AirportSeqID` Int32, + `Div1WheelsOn` Int16, + `Div1TotalGTime` Int16, + `Div1LongestGTime` Int16, + `Div1WheelsOff` Int16, + `Div1TailNum` LowCardinality(String), + `Div2Airport` LowCardinality(String), + `Div2AirportID` Int32, + `Div2AirportSeqID` Int32, + `Div2WheelsOn` Int16, + `Div2TotalGTime` Int16, + `Div2LongestGTime` Int16, + `Div2WheelsOff` Int16, + `Div2TailNum` LowCardinality(String), + `Div3Airport` LowCardinality(String), + `Div3AirportID` Int32, + `Div3AirportSeqID` Int32, + `Div3WheelsOn` Int16, + `Div3TotalGTime` Int16, + `Div3LongestGTime` Int16, + `Div3WheelsOff` Int16, + `Div3TailNum` LowCardinality(String), + `Div4Airport` LowCardinality(String), + `Div4AirportID` Int32, + `Div4AirportSeqID` Int32, + `Div4WheelsOn` Int16, + `Div4TotalGTime` Int16, + `Div4LongestGTime` Int16, + `Div4WheelsOff` Int16, + `Div4TailNum` LowCardinality(String), + `Div5Airport` LowCardinality(String), + `Div5AirportID` Int32, + `Div5AirportSeqID` Int32, + `Div5WheelsOn` Int16, + `Div5TotalGTime` Int16, + `Div5LongestGTime` Int16, + `Div5WheelsOff` Int16, + `Div5TailNum` LowCardinality(String) +) ENGINE = MergeTree + ORDER BY (Year, Quarter, Month, DayofMonth, FlightDate, IATA_CODE_Reporting_Airline); +``` + +## 生データからのインポート {#import-from-raw-data} + +データのダウンロード: + +``` bash +wget --no-check-certificate --continue https://transtats.bts.gov/PREZIP/On_Time_Reporting_Carrier_On_Time_Performance_1987_present_{1987..2022}_{1..12}.zip +``` + +マルチスレッドでのデータ読み込み: + +``` bash +ls -1 *.zip | xargs -I{} -P $(nproc) bash -c "echo {}; unzip -cq {} '*.csv' | sed 's/\.00//g' | clickhouse-client --input_format_csv_empty_as_default 1 --query='INSERT INTO ontime FORMAT CSVWithNames'" +``` + +(サーバでメモリ不足または他の問題が発生した場合、`-P $(nproc)` 部分を削除してください) + +## 保存済みのコピーからのインポート + +代替として、以下のクエリを使用して保存済みのコピーからデータをインポートできます: + +``` +INSERT INTO ontime SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/*.csv.gz', CSVWithNames) SETTINGS max_insert_threads = 40; +``` + +このスナップショットは2022-05-29に作成されました。 + +## クエリ {#queries} + +Q0. + +``` sql +SELECT avg(c1) +FROM +( + SELECT Year, Month, count(*) AS c1 + FROM ontime + GROUP BY Year, Month +); +``` + +Q1. 2000年から2008年の1日あたりの便数 + +``` sql +SELECT DayOfWeek, count(*) AS c +FROM ontime +WHERE Year>=2000 AND Year<=2008 +GROUP BY DayOfWeek +ORDER BY c DESC; +``` + +Q2. 10分以上遅延した便の数、2000-2008年の曜日ごとのグループ + +``` sql +SELECT DayOfWeek, count(*) AS c +FROM ontime +WHERE DepDelay>10 AND Year>=2000 AND Year<=2008 +GROUP BY DayOfWeek +ORDER BY c DESC; +``` + +Q3. 2000-2008年の空港別の遅延数 + +``` sql +SELECT Origin, count(*) AS c +FROM ontime +WHERE DepDelay>10 AND Year>=2000 AND Year<=2008 +GROUP BY Origin +ORDER BY c DESC +LIMIT 10; +``` + +Q4. 2007年の空港ごとの遅延数 + +``` sql +SELECT IATA_CODE_Reporting_Airline AS Carrier, count(*) +FROM ontime +WHERE DepDelay>10 AND Year=2007 +GROUP BY Carrier +ORDER BY count(*) DESC; +``` + +Q5. 2007年の航空会社ごとの遅延割合 + +``` sql +SELECT Carrier, c, c2, c*100/c2 as c3 +FROM +( + SELECT + IATA_CODE_Reporting_Airline AS Carrier, + count(*) AS c + FROM ontime + WHERE DepDelay>10 + AND Year=2007 + GROUP BY Carrier +) q +JOIN +( + SELECT + IATA_CODE_Reporting_Airline AS Carrier, + count(*) AS c2 + FROM ontime + WHERE Year=2007 + GROUP BY Carrier +) qq USING Carrier +ORDER BY c3 DESC; +``` + +同じクエリの改良版: + +``` sql +SELECT IATA_CODE_Reporting_Airline AS Carrier, avg(DepDelay>10)*100 AS c3 +FROM ontime +WHERE Year=2007 +GROUP BY Carrier +ORDER BY c3 DESC +``` + +Q6. 2000-2008年の広範な年範囲のため + +``` sql +SELECT Carrier, c, c2, c*100/c2 as c3 +FROM +( + SELECT + IATA_CODE_Reporting_Airline AS Carrier, + count(*) AS c + FROM ontime + WHERE DepDelay>10 + AND Year>=2000 AND Year<=2008 + GROUP BY Carrier +) q +JOIN +( + SELECT + IATA_CODE_Reporting_Airline AS Carrier, + count(*) AS c2 + FROM ontime + WHERE Year>=2000 AND Year<=2008 + GROUP BY Carrier +) qq USING Carrier +ORDER BY c3 DESC; +``` + +同じクエリの改良版: + +``` sql +SELECT IATA_CODE_Reporting_Airline AS Carrier, avg(DepDelay>10)*100 AS c3 +FROM ontime +WHERE Year>=2000 AND Year<=2008 +GROUP BY Carrier +ORDER BY c3 DESC; +``` + +Q7. 年ごとの10分以上の遅延便の割合 + +``` sql +SELECT Year, c1/c2 +FROM +( + select + Year, + count(*)*100 as c1 + from ontime + WHERE DepDelay>10 + GROUP BY Year +) q +JOIN +( + select + Year, + count(*) as c2 + from ontime + GROUP BY Year +) qq USING (Year) +ORDER BY Year; +``` + +同じクエリの改良版: + +``` sql +SELECT Year, avg(DepDelay>10)*100 +FROM ontime +GROUP BY Year +ORDER BY Year; +``` + +Q8. 直接接続された都市数による最も人気のある目的地、さまざまな年の範囲 + +``` sql +SELECT DestCityName, uniqExact(OriginCityName) AS u +FROM ontime +WHERE Year >= 2000 and Year <= 2010 +GROUP BY DestCityName +ORDER BY u DESC LIMIT 10; +``` + +Q9. + +``` sql +SELECT Year, count(*) AS c1 +FROM ontime +GROUP BY Year; +``` + +Q10. + +``` sql +SELECT + min(Year), max(Year), IATA_CODE_Reporting_Airline AS Carrier, count(*) AS cnt, + sum(ArrDelayMinutes>30) AS flights_delayed, + round(sum(ArrDelayMinutes>30)/count(*),2) AS rate +FROM ontime +WHERE + DayOfWeek NOT IN (6,7) AND OriginState NOT IN ('AK', 'HI', 'PR', 'VI') + AND DestState NOT IN ('AK', 'HI', 'PR', 'VI') + AND FlightDate < '2010-01-01' +GROUP by Carrier +HAVING cnt>100000 and max(Year)>1990 +ORDER by rate DESC +LIMIT 1000; +``` + +ボーナス: + +``` sql +SELECT avg(cnt) +FROM +( + SELECT Year,Month,count(*) AS cnt + FROM ontime + WHERE DepDel15=1 + GROUP BY Year,Month +); + +SELECT avg(c1) FROM +( + SELECT Year,Month,count(*) AS c1 + FROM ontime + GROUP BY Year,Month +); + +SELECT DestCityName, uniqExact(OriginCityName) AS u +FROM ontime +GROUP BY DestCityName +ORDER BY u DESC +LIMIT 10; + +SELECT OriginCityName, DestCityName, count() AS c +FROM ontime +GROUP BY OriginCityName, DestCityName +ORDER BY c DESC +LIMIT 10; + +SELECT OriginCityName, count() AS c +FROM ontime +GROUP BY OriginCityName +ORDER BY c DESC +LIMIT 10; +``` + +また、Playgroundでデータを操作することもできます。[例](https://sql.clickhouse.com?query_id=M4FSVBVMSHY98NKCQP8N4K)。 + +この性能テストはVadim Tkachenkoによって作成されました。次を参照してください: + +- https://www.percona.com/blog/2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/ +- https://www.percona.com/blog/2009/10/26/air-traffic-queries-in-luciddb/ +- https://www.percona.com/blog/2009/11/02/air-traffic-queries-in-infinidb-early-alpha/ +- https://www.percona.com/blog/2014/04/21/using-apache-hadoop-and-impala-together-with-mysql-for-data-analysis/ +- https://www.percona.com/blog/2016/01/07/apache-spark-with-air-ontime-performance-data/ +- http://nickmakos.blogspot.ru/2012/08/analyzing-air-traffic-performance-with.html diff --git a/docs/ja/getting-started/example-datasets/opensky.md b/docs/ja/getting-started/example-datasets/opensky.md new file mode 100644 index 00000000000..153d3228143 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/opensky.md @@ -0,0 +1,420 @@ +--- +slug: /ja/getting-started/example-datasets/opensky +sidebar_label: 航空交通データ +description: このデータセットのデータは、COVID-19パンデミックの間における航空交通の発展を示すために、完全なOpenSkyデータセットから派生およびクリーニングされたものです。 +title: "The OpenSky Network 2020によるクラウドソースの航空交通データ" +--- + +このデータセットのデータは、COVID-19パンデミックの間の航空交通の発展を示すために、完全なOpenSkyデータセットから派生およびクリーニングされたものです。これは、2019年1月1日以降にネットワークの2500人以上のメンバーによって見られたすべてのフライトを網羅しています。COVID-19パンデミックが終了するまで、定期的にデータがデータセットに追加されます。 + +出典: https://zenodo.org/records/5092942 + +Martin Strohmeier, Xavier Olive, Jannis Luebbe, Matthias Schaefer, and Vincent Lenders +"OpenSky Networkからのクラウドソースされた航空交通データ 2019–2020" +地球システム科学データ 13(2), 2021 +https://doi.org/10.5194/essd-13-357-2021 + +## データセットのダウンロード {#download-dataset} + +以下のコマンドを実行します: + +```bash +wget -O- https://zenodo.org/records/5092942 | grep -oE 'https://zenodo.org/records/5092942/files/flightlist_[0-9]+_[0-9]+\.csv\.gz' | xargs wget +``` + +ダウンロードには良好なインターネット接続で約2分かかります。合計サイズ4.3 GBのファイルが30個あります。 + +## テーブルの作成 {#create-table} + +```sql +CREATE TABLE opensky +( + callsign String, + number String, + icao24 String, + registration String, + typecode String, + origin String, + destination String, + firstseen DateTime, + lastseen DateTime, + day DateTime, + latitude_1 Float64, + longitude_1 Float64, + altitude_1 Float64, + latitude_2 Float64, + longitude_2 Float64, + altitude_2 Float64 +) ENGINE = MergeTree ORDER BY (origin, destination, callsign); +``` + +## データのインポート {#import-data} + +ClickHouseにデータを並列でアップロードします: + +```bash +ls -1 flightlist_*.csv.gz | xargs -P100 -I{} bash -c 'gzip -c -d "{}" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"' +``` + +- ここでは、ファイルのリスト (`ls -1 flightlist_*.csv.gz`) を `xargs` に渡して並列処理を行います。 +`xargs -P100` は最大100の並列ワーカーを使用することを指定しますが、ファイルは30個しかないため、ワーカーの数は30個だけになります。 +- 各ファイルについて、`xargs` は `bash -c` を使ってスクリプトを実行します。スクリプト内には `{}` 形式の置換があります。`xargs` コマンドはそのファイル名を代入します (`-I{}` を指定しています)。 +- スクリプトはファイルを解凍し (`gzip -c -d "{}"`)、標準出力に出力します (`-c` パラメータ) その出力は `clickhouse-client` にリダイレクトされます。 +- また、ISO-8601形式のタイムゾーンオフセットを認識するために、[DateTime](../../sql-reference/data-types/datetime.md)フィールドの解析も要求しています ([--date_time_input_format best_effort](../../operations/settings/settings-formats.md#settings-date_time_input_format))。 + +最終的に、`clickhouse-client` が挿入を行います。入力データは [CSVWithNames](../../interfaces/formats.md#csvwithnames) 形式で読み込まれます。 + +並列アップロードには24秒かかります。 + +並列アップロードが好ましくない場合、こちらは逐次型の代替方法です: + +```bash +for file in flightlist_*.csv.gz; do gzip -c -d "$file" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"; done +``` + +## データの検証 {#validate-data} + +クエリ: + +```sql +SELECT count() FROM opensky; +``` + +結果: + +```text +┌──count()─┐ +│ 66010819 │ +└──────────┘ +``` + +ClickHouseにおけるデータセットのサイズはわずか2.66 GiBです。確認してください。 + +クエリ: + +```sql +SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'opensky'; +``` + +結果: + +```text +┌─formatReadableSize(total_bytes)─┐ +│ 2.66 GiB │ +└─────────────────────────────────┘ +``` + +## 一部のクエリを実行する {#run-queries} + +移動した合計距離は680億キロメートルです。 + +クエリ: + +```sql +SELECT formatReadableQuantity(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)) / 1000) FROM opensky; +``` + +結果: + +```text +┌─formatReadableQuantity(divide(sum(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)), 1000))─┐ +│ 68.72 billion │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +平均的なフライト距離は約1000kmです。 + +クエリ: + +```sql +SELECT round(avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)), 2) FROM opensky; +``` + +結果: + +```text + ┌─round(avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2)), 2)─┐ +1. │ 1041090.67 │ -- 1.04 million + └──────────────────────────────────────────────────────────────────────────────┘ +``` + +### 最も混雑した発着空港と見られる平均距離 {#busy-airports-average-distance} + +クエリ: + +```sql +SELECT + origin, + count(), + round(avg(geoDistance(longitude_1, latitude_1, longitude_2, latitude_2))) AS distance, + bar(distance, 0, 10000000, 100) AS bar +FROM opensky +WHERE origin != '' +GROUP BY origin +ORDER BY count() DESC +LIMIT 100; +``` + +結果: + +```text + ┌─origin─┬─count()─┬─distance─┬─bar────────────────────────────────────┐ + 1. │ KORD │ 745007 │ 1546108 │ ███████████████▍ │ + 2. │ KDFW │ 696702 │ 1358721 │ █████████████▌ │ + 3. │ KATL │ 667286 │ 1169661 │ ███████████▋ │ + 4. │ KDEN │ 582709 │ 1287742 │ ████████████▊ │ + 5. │ KLAX │ 581952 │ 2628393 │ ██████████████████████████▎ │ + 6. │ KLAS │ 447789 │ 1336967 │ █████████████▎ │ + 7. │ KPHX │ 428558 │ 1345635 │ █████████████▍ │ + 8. │ KSEA │ 412592 │ 1757317 │ █████████████████▌ │ + 9. │ KCLT │ 404612 │ 880355 │ ████████▋ │ + 10. │ VIDP │ 363074 │ 1445052 │ ██████████████▍ │ + 11. │ EDDF │ 362643 │ 2263960 │ ██████████████████████▋ │ + 12. │ KSFO │ 361869 │ 2445732 │ ████████████████████████▍ │ + 13. │ KJFK │ 349232 │ 2996550 │ █████████████████████████████▊ │ + 14. │ KMSP │ 346010 │ 1287328 │ ████████████▋ │ + 15. │ LFPG │ 344748 │ 2206203 │ ██████████████████████ │ + 16. │ EGLL │ 341370 │ 3216593 │ ████████████████████████████████▏ │ + 17. │ EHAM │ 340272 │ 2116425 │ █████████████████████▏ │ + 18. │ KEWR │ 337696 │ 1826545 │ ██████████████████▎ │ + 19. │ KPHL │ 320762 │ 1291761 │ ████████████▊ │ + 20. │ OMDB │ 308855 │ 2855706 │ ████████████████████████████▌ │ + 21. │ UUEE │ 307098 │ 1555122 │ ███████████████▌ │ + 22. │ KBOS │ 304416 │ 1621675 │ ████████████████▏ │ + 23. │ LEMD │ 291787 │ 1695097 │ ████████████████▊ │ + 24. │ YSSY │ 272979 │ 1875298 │ ██████████████████▋ │ + 25. │ KMIA │ 265121 │ 1923542 │ ███████████████████▏ │ + 26. │ ZGSZ │ 263497 │ 745086 │ ███████▍ │ + 27. │ EDDM │ 256691 │ 1361453 │ █████████████▌ │ + 28. │ WMKK │ 254264 │ 1626688 │ ████████████████▎ │ + 29. │ CYYZ │ 251192 │ 2175026 │ █████████████████████▋ │ + 30. │ KLGA │ 248699 │ 1106935 │ ███████████ │ + 31. │ VHHH │ 248473 │ 3457658 │ ██████████████████████████████████▌ │ + 32. │ RJTT │ 243477 │ 1272744 │ ████████████▋ │ + 33. │ KBWI │ 241440 │ 1187060 │ ███████████▋ │ + 34. │ KIAD │ 239558 │ 1683485 │ ████████████████▋ │ + 35. │ KIAH │ 234202 │ 1538335 │ ███████████████▍ │ + 36. │ KFLL │ 223447 │ 1464410 │ ██████████████▋ │ + 37. │ KDAL │ 212055 │ 1082339 │ ██████████▋ │ + 38. │ KDCA │ 207883 │ 1013359 │ ██████████▏ │ + 39. │ LIRF │ 207047 │ 1427965 │ ██████████████▎ │ + 40. │ PANC │ 206007 │ 2525359 │ █████████████████████████▎ │ + 41. │ LTFJ │ 205415 │ 860470 │ ████████▌ │ + 42. │ KDTW │ 204020 │ 1106716 │ ███████████ │ + 43. │ VABB │ 201679 │ 1300865 │ █████████████ │ + 44. │ OTHH │ 200797 │ 3759544 │ █████████████████████████████████████▌ │ + 45. │ KMDW │ 200796 │ 1232551 │ ████████████▎ │ + 46. │ KSAN │ 198003 │ 1495195 │ ██████████████▊ │ + 47. │ KPDX │ 197760 │ 1269230 │ ████████████▋ │ + 48. │ SBGR │ 197624 │ 2041697 │ ████████████████████▍ │ + 49. │ VOBL │ 189011 │ 1040180 │ ██████████▍ │ + 50. │ LEBL │ 188956 │ 1283190 │ ████████████▋ │ + 51. │ YBBN │ 188011 │ 1253405 │ ████████████▌ │ + 52. │ LSZH │ 187934 │ 1572029 │ ███████████████▋ │ + 53. │ YMML │ 187643 │ 1870076 │ ██████████████████▋ │ + 54. │ RCTP │ 184466 │ 2773976 │ ███████████████████████████▋ │ + 55. │ KSNA │ 180045 │ 778484 │ ███████▋ │ + 56. │ EGKK │ 176420 │ 1694770 │ ████████████████▊ │ + 57. │ LOWW │ 176191 │ 1274833 │ ████████████▋ │ + 58. │ UUDD │ 176099 │ 1368226 │ █████████████▋ │ + 59. │ RKSI │ 173466 │ 3079026 │ ██████████████████████████████▋ │ + 60. │ EKCH │ 172128 │ 1229895 │ ████████████▎ │ + 61. │ KOAK │ 171119 │ 1114447 │ ███████████▏ │ + 62. │ RPLL │ 170122 │ 1440735 │ ██████████████▍ │ + 63. │ KRDU │ 167001 │ 830521 │ ████████▎ │ + 64. │ KAUS │ 164524 │ 1256198 │ ████████████▌ │ + 65. │ KBNA │ 163242 │ 1022726 │ ██████████▏ │ + 66. │ KSDF │ 162655 │ 1380867 │ █████████████▋ │ + 67. │ ENGM │ 160732 │ 910108 │ █████████ │ + 68. │ LIMC │ 160696 │ 1564620 │ ███████████████▋ │ + 69. │ KSJC │ 159278 │ 1081125 │ ██████████▋ │ + 70. │ KSTL │ 157984 │ 1026699 │ ██████████▎ │ + 71. │ UUWW │ 156811 │ 1261155 │ ████████████▌ │ + 72. │ KIND │ 153929 │ 987944 │ █████████▊ │ + 73. │ ESSA │ 153390 │ 1203439 │ ████████████ │ + 74. │ KMCO │ 153351 │ 1508657 │ ███████████████ │ + 75. │ KDVT │ 152895 │ 74048 │ ▋ │ + 76. │ VTBS │ 152645 │ 2255591 │ ██████████████████████▌ │ + 77. │ CYVR │ 149574 │ 2027413 │ ████████████████████▎ │ + 78. │ EIDW │ 148723 │ 1503985 │ ███████████████ │ + 79. │ LFPO │ 143277 │ 1152964 │ ███████████▌ │ + 80. │ EGSS │ 140830 │ 1348183 │ █████████████▍ │ + 81. │ KAPA │ 140776 │ 420441 │ ████▏ │ + 82. │ KHOU │ 138985 │ 1068806 │ ██████████▋ │ + 83. │ KTPA │ 138033 │ 1338223 │ █████████████▍ │ + 84. │ KFFZ │ 137333 │ 55397 │ ▌ │ + 85. │ NZAA │ 136092 │ 1581264 │ ███████████████▋ │ + 86. │ YPPH │ 133916 │ 1271550 │ ████████████▋ │ + 87. │ RJBB │ 133522 │ 1805623 │ ██████████████████ │ + 88. │ EDDL │ 133018 │ 1265919 │ ████████████▋ │ + 89. │ ULLI │ 130501 │ 1197108 │ ███████████▊ │ + 90. │ KIWA │ 127195 │ 250876 │ ██▌ │ + 91. │ KTEB │ 126969 │ 1189414 │ ███████████▊ │ + 92. │ VOMM │ 125616 │ 1127757 │ ███████████▎ │ + 93. │ LSGG │ 123998 │ 1049101 │ ██████████▍ │ + 94. │ LPPT │ 122733 │ 1779187 │ █████████████████▋ │ + 95. │ WSSS │ 120493 │ 3264122 │ ████████████████████████████████▋ │ + 96. │ EBBR │ 118539 │ 1579939 │ ███████████████▋ │ + 97. │ VTBD │ 118107 │ 661627 │ ██████▌ │ + 98. │ KVNY │ 116326 │ 692960 │ ██████▊ │ + 99. │ EDDT │ 115122 │ 941740 │ █████████▍ │ +100. │ EFHK │ 114860 │ 1629143 │ ████████████████▎ │ + └────────┴─────────┴──────────┴────────────────────────────────────────┘ +``` + +### モスクワの主要3空港からのフライト数、週間 {#flights-from-moscow} + +クエリ: + +```sql +SELECT + toMonday(day) AS k, + count() AS c, + bar(c, 0, 10000, 100) AS bar +FROM opensky +WHERE origin IN ('UUEE', 'UUDD', 'UUWW') +GROUP BY k +ORDER BY k ASC; +``` + +結果: + +```text + ┌──────────k─┬────c─┬─bar──────────────────────────────────────────────────────────────────────────┐ + 1. │ 2018-12-31 │ 5248 │ ████████████████████████████████████████████████████▍ │ + 2. │ 2019-01-07 │ 6302 │ ███████████████████████████████████████████████████████████████ │ + 3. │ 2019-01-14 │ 5701 │ █████████████████████████████████████████████████████████ │ + 4. │ 2019-01-21 │ 5638 │ ████████████████████████████████████████████████████████▍ │ + 5. │ 2019-01-28 │ 5731 │ █████████████████████████████████████████████████████████▎ │ + 6. │ 2019-02-04 │ 5683 │ ████████████████████████████████████████████████████████▋ │ + 7. │ 2019-02-11 │ 5759 │ █████████████████████████████████████████████████████████▌ │ + 8. │ 2019-02-18 │ 5736 │ █████████████████████████████████████████████████████████▎ │ + 9. │ 2019-02-25 │ 5873 │ ██████████████████████████████████████████████████████████▋ │ + 10. │ 2019-03-04 │ 5965 │ ███████████████████████████████████████████████████████████▋ │ + 11. │ 2019-03-11 │ 5900 │ ███████████████████████████████████████████████████████████ │ + 12. │ 2019-03-18 │ 5823 │ ██████████████████████████████████████████████████████████▏ │ + 13. │ 2019-03-25 │ 5899 │ ██████████████████████████████████████████████████████████▊ │ + 14. │ 2019-04-01 │ 6043 │ ████████████████████████████████████████████████████████████▍ │ + 15. │ 2019-04-08 │ 6098 │ ████████████████████████████████████████████████████████████▊ │ + 16. │ 2019-04-15 │ 6196 │ █████████████████████████████████████████████████████████████▊ │ + 17. │ 2019-04-22 │ 6486 │ ████████████████████████████████████████████████████████████████▋ │ + 18. │ 2019-04-29 │ 6682 │ ██████████████████████████████████████████████████████████████████▋ │ + 19. │ 2019-05-06 │ 6739 │ ███████████████████████████████████████████████████████████████████▍ │ + 20. │ 2019-05-13 │ 6600 │ ██████████████████████████████████████████████████████████████████ │ + 21. │ 2019-05-20 │ 6575 │ █████████████████████████████████████████████████████████████████▋ │ + 22. │ 2019-05-27 │ 6786 │ ███████████████████████████████████████████████████████████████████▋ │ + 23. │ 2019-06-03 │ 6872 │ ████████████████████████████████████████████████████████████████████▋ │ + 24. │ 2019-06-10 │ 7045 │ ██████████████████████████████████████████████████████████████████████▍ │ + 25. │ 2019-06-17 │ 7045 │ ██████████████████████████████████████████████████████████████████████▍ │ + 26. │ 2019-06-24 │ 6852 │ ████████████████████████████████████████████████████████████████████▌ │ + 27. │ 2019-07-01 │ 7248 │ ████████████████████████████████████████████████████████████████████████▍ │ + 28. │ 2019-07-08 │ 7284 │ ████████████████████████████████████████████████████████████████████████▋ │ + 29. │ 2019-07-15 │ 7142 │ ███████████████████████████████████████████████████████████████████████▍ │ + 30. │ 2019-07-22 │ 7108 │ ███████████████████████████████████████████████████████████████████████ │ + 31. │ 2019-07-29 │ 7251 │ ████████████████████████████████████████████████████████████████████████▌ │ + 32. │ 2019-08-05 │ 7403 │ ██████████████████████████████████████████████████████████████████████████ │ + 33. │ 2019-08-12 │ 7457 │ ██████████████████████████████████████████████████████████████████████████▌ │ + 34. │ 2019-08-19 │ 7502 │ ███████████████████████████████████████████████████████████████████████████ │ + 35. │ 2019-08-26 │ 7540 │ ███████████████████████████████████████████████████████████████████████████▍ │ + 36. │ 2019-09-02 │ 7237 │ ████████████████████████████████████████████████████████████████████████▎ │ + 37. │ 2019-09-09 │ 7328 │ █████████████████████████████████████████████████████████████████████████▎ │ + 38. │ 2019-09-16 │ 5566 │ ███████████████████████████████████████████████████████▋ │ + 39. │ 2019-09-23 │ 7049 │ ██████████████████████████████████████████████████████████████████████▍ │ + 40. │ 2019-09-30 │ 6880 │ ████████████████████████████████████████████████████████████████████▋ │ + 41. │ 2019-10-07 │ 6518 │ █████████████████████████████████████████████████████████████████▏ │ + 42. │ 2019-10-14 │ 6688 │ ██████████████████████████████████████████████████████████████████▊ │ + 43. │ 2019-10-21 │ 6667 │ ██████████████████████████████████████████████████████████████████▋ │ + 44. │ 2019-10-28 │ 6303 │ ███████████████████████████████████████████████████████████████ │ + 45. │ 2019-11-04 │ 6298 │ ██████████████████████████████████████████████████████████████▊ │ + 46. │ 2019-11-11 │ 6137 │ █████████████████████████████████████████████████████████████▎ │ + 47. │ 2019-11-18 │ 6051 │ ████████████████████████████████████████████████████████████▌ │ + 48. │ 2019-11-25 │ 5820 │ ██████████████████████████████████████████████████████████▏ │ + 49. │ 2019-12-02 │ 5942 │ ███████████████████████████████████████████████████████████▍ │ + 50. │ 2019-12-09 │ 4891 │ ████████████████████████████████████████████████▊ │ + 51. │ 2019-12-16 │ 5682 │ ████████████████████████████████████████████████████████▋ │ + 52. │ 2019-12-23 │ 6111 │ █████████████████████████████████████████████████████████████ │ + 53. │ 2019-12-30 │ 5870 │ ██████████████████████████████████████████████████████████▋ │ + 54. │ 2020-01-06 │ 5953 │ ███████████████████████████████████████████████████████████▌ │ + 55. │ 2020-01-13 │ 5698 │ ████████████████████████████████████████████████████████▊ │ + 56. │ 2020-01-20 │ 5339 │ █████████████████████████████████████████████████████▍ │ + 57. │ 2020-01-27 │ 5566 │ ███████████████████████████████████████████████████████▋ │ + 58. │ 2020-02-03 │ 5801 │ ██████████████████████████████████████████████████████████ │ + 59. │ 2020-02-10 │ 5692 │ ████████████████████████████████████████████████████████▊ │ + 60. │ 2020-02-17 │ 5912 │ ███████████████████████████████████████████████████████████ │ + 61. │ 2020-02-24 │ 6031 │ ████████████████████████████████████████████████████████████▎ │ + 62. │ 2020-03-02 │ 6105 │ █████████████████████████████████████████████████████████████ │ + 63. │ 2020-03-09 │ 5823 │ ██████████████████████████████████████████████████████████▏ │ + 64. │ 2020-03-16 │ 4659 │ ██████████████████████████████████████████████▌ │ + 65. │ 2020-03-23 │ 3720 │ █████████████████████████████████████▏ │ + 66. │ 2020-03-30 │ 1720 │ █████████████████▏ │ + 67. │ 2020-04-06 │ 849 │ ████████▍ │ + 68. │ 2020-04-13 │ 710 │ ███████ │ + 69. │ 2020-04-20 │ 725 │ ███████▏ │ + 70. │ 2020-04-27 │ 920 │ █████████▏ │ + 71. │ 2020-05-04 │ 859 │ ████████▌ │ + 72. │ 2020-05-11 │ 1047 │ ██████████▍ │ + 73. │ 2020-05-18 │ 1135 │ ███████████▎ │ + 74. │ 2020-05-25 │ 1266 │ ████████████▋ │ + 75. │ 2020-06-01 │ 1793 │ █████████████████▊ │ + 76. │ 2020-06-08 │ 1979 │ ███████████████████▋ │ + 77. │ 2020-06-15 │ 2297 │ ██████████████████████▊ │ + 78. │ 2020-06-22 │ 2788 │ ███████████████████████████▊ │ + 79. │ 2020-06-29 │ 3389 │ █████████████████████████████████▊ │ + 80. │ 2020-07-06 │ 3545 │ ███████████████████████████████████▍ │ + 81. │ 2020-07-13 │ 3569 │ ███████████████████████████████████▋ │ + 82. │ 2020-07-20 │ 3784 │ █████████████████████████████████████▋ │ + 83. │ 2020-07-27 │ 3960 │ ███████████████████████████████████████▌ │ + 84. │ 2020-08-03 │ 4323 │ ███████████████████████████████████████████▏ │ + 85. │ 2020-08-10 │ 4581 │ █████████████████████████████████████████████▋ │ + 86. │ 2020-08-17 │ 4791 │ ███████████████████████████████████████████████▊ │ + 87. │ 2020-08-24 │ 4928 │ █████████████████████████████████████████████████▎ │ + 88. │ 2020-08-31 │ 4687 │ ██████████████████████████████████████████████▋ │ + 89. │ 2020-09-07 │ 4643 │ ██████████████████████████████████████████████▍ │ + 90. │ 2020-09-14 │ 4594 │ █████████████████████████████████████████████▊ │ + 91. │ 2020-09-21 │ 4478 │ ████████████████████████████████████████████▋ │ + 92. │ 2020-09-28 │ 4382 │ ███████████████████████████████████████████▋ │ + 93. │ 2020-10-05 │ 4261 │ ██████████████████████████████████████████▌ │ + 94. │ 2020-10-12 │ 4243 │ ██████████████████████████████████████████▍ │ + 95. │ 2020-10-19 │ 3941 │ ███████████████████████████████████████▍ │ + 96. │ 2020-10-26 │ 3616 │ ████████████████████████████████████▏ │ + 97. │ 2020-11-02 │ 3586 │ ███████████████████████████████████▋ │ + 98. │ 2020-11-09 │ 3403 │ ██████████████████████████████████ │ + 99. │ 2020-11-16 │ 3336 │ █████████████████████████████████▎ │ +100. │ 2020-11-23 │ 3230 │ ████████████████████████████████▎ │ +101. │ 2020-11-30 │ 3183 │ ███████████████████████████████▋ │ +102. │ 2020-12-07 │ 3285 │ ████████████████████████████████▋ │ +103. │ 2020-12-14 │ 3367 │ █████████████████████████████████▋ │ +104. │ 2020-12-21 │ 3748 │ █████████████████████████████████████▍ │ +105. │ 2020-12-28 │ 3986 │ ███████████████████████████████████████▋ │ +106. │ 2021-01-04 │ 3906 │ ███████████████████████████████████████ │ +107. │ 2021-01-11 │ 3425 │ ██████████████████████████████████▎ │ +108. │ 2021-01-18 │ 3144 │ ███████████████████████████████▍ │ +109. │ 2021-01-25 │ 3115 │ ███████████████████████████████▏ │ +110. │ 2021-02-01 │ 3285 │ ████████████████████████████████▋ │ +111. │ 2021-02-08 │ 3321 │ █████████████████████████████████▏ │ +112. │ 2021-02-15 │ 3475 │ ██████████████████████████████████▋ │ +113. │ 2021-02-22 │ 3549 │ ███████████████████████████████████▍ │ +114. │ 2021-03-01 │ 3755 │ █████████████████████████████████████▌ │ +115. │ 2021-03-08 │ 3080 │ ██████████████████████████████▋ │ +116. │ 2021-03-15 │ 3789 │ █████████████████████████████████████▊ │ +117. │ 2021-03-22 │ 3804 │ ██████████████████████████████████████ │ +118. │ 2021-03-29 │ 4238 │ ██████████████████████████████████████████▍ │ +119. │ 2021-04-05 │ 4307 │ ███████████████████████████████████████████ │ +120. │ 2021-04-12 │ 4225 │ ██████████████████████████████████████████▎ │ +121. │ 2021-04-19 │ 4391 │ ███████████████████████████████████████████▊ │ +122. │ 2021-04-26 │ 4868 │ ████████████████████████████████████████████████▋ │ +123. │ 2021-05-03 │ 4977 │ █████████████████████████████████████████████████▋ │ +124. │ 2021-05-10 │ 5164 │ ███████████████████████████████████████████████████▋ │ +125. │ 2021-05-17 │ 4986 │ █████████████████████████████████████████████████▋ │ +126. │ 2021-05-24 │ 5024 │ ██████████████████████████████████████████████████▏ │ +127. │ 2021-05-31 │ 4824 │ ████████████████████████████████████████████████▏ │ +128. │ 2021-06-07 │ 5652 │ ████████████████████████████████████████████████████████▌ │ +129. │ 2021-06-14 │ 5613 │ ████████████████████████████████████████████████████████▏ │ +130. │ 2021-06-21 │ 6061 │ ████████████████████████████████████████████████████████████▌ │ +131. │ 2021-06-28 │ 2554 │ █████████████████████████▌ │ + └────────────┴──────┴──────────────────────────────────────────────────────────────────────────────┘ +``` + +### オンラインプレイグラウンド {#playground} + +このデータセットに対して他のクエリをテストするには、インタラクティブリソース [Online Playground](https://sql.clickhouse.com) を使用できます。例えば、[このように](https://sql.clickhouse.com?query_id=BIPDVQNIGVEZFQYFEFQB7O)です。しかし、ここでは一時テーブルを作成できないことに注意してください。 diff --git a/docs/ja/getting-started/example-datasets/recipes.md b/docs/ja/getting-started/example-datasets/recipes.md new file mode 100644 index 00000000000..82485ef1095 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/recipes.md @@ -0,0 +1,338 @@ +--- +slug: /ja/getting-started/example-datasets/recipes +sidebar_label: レシピデータセット +title: "レシピデータセット" +--- + +RecipeNLGデータセットは[こちら](https://recipenlg.cs.put.poznan.pl/dataset)からダウンロードできます。2.2百万件のレシピが含まれており、サイズは約1GBです。 + +## データセットのダウンロードと解凍 + +1. ダウンロードページに移動します:[https://recipenlg.cs.put.poznan.pl/dataset](https://recipenlg.cs.put.poznan.pl/dataset)。 +1. 規約に同意してzipファイルをダウンロードします。 +1. オプション: `md5sum dataset.zip`を使用してzipファイルを検証し、`3a168dfd0912bb034225619b3586ce76`と一致することを確認します。 +1. `unzip dataset.zip`でzipファイルを解凍します。`dataset`ディレクトリに`full_dataset.csv`ファイルが生成されます。 + +## テーブルの作成 + +clickhouse-clientを実行し、次のCREATEクエリを実行します: + +``` sql +CREATE TABLE recipes +( + title String, + ingredients Array(String), + directions Array(String), + link String, + source LowCardinality(String), + NER Array(String) +) ENGINE = MergeTree ORDER BY title; +``` + +## データの挿入 + +次のコマンドを実行します: + +``` bash +clickhouse-client --query " + INSERT INTO recipes + SELECT + title, + JSONExtract(ingredients, 'Array(String)'), + JSONExtract(directions, 'Array(String)'), + link, + source, + JSONExtract(NER, 'Array(String)') + FROM input('num UInt32, title String, ingredients String, directions String, link String, source LowCardinality(String), NER String') + FORMAT CSVWithNames +" --input_format_with_names_use_header 0 --format_csv_allow_single_quote 0 --input_format_allow_errors_num 10 < full_dataset.csv +``` + +この例では、カスタムCSVの解析方法を紹介します。挿入時にいくつかの調整が必要です。 + +説明: +- データセットはCSV形式ですが、挿入時に前処理が必要です。テーブル関数[input](../../sql-reference/table-functions/input.md)を使用して前処理を行います。 +- CSVファイルの構造はテーブル関数`input`の引数で指定されています。 +- フィールド`num`(行番号)は不要です。ファイルから解析して無視します。 +- `FORMAT CSVWithNames`を使用しますが、CSVのヘッダーは最初のフィールド名を含んでいないため、コマンドラインパラメータ`--input_format_with_names_use_header 0`で無視されます。 +- ファイルはCSV文字列をダブルクォートで囲んでいます。いくつかの文字列はダブルクォートで囲まれていませんが、シングルクォートは文字列の囲みとして解析されてはいけません。そのため、`--format_csv_allow_single_quote 0`パラメータを追加します。 +- CSVからいくつかの文字列は解析できません。なぜなら、それらは値の先頭に`\M/`シーケンスを含んでいるためです。CSVでバックスラッシュで始まる唯一の値は`\N`であり、これはSQL NULLとして解析されます。`--input_format_allow_errors_num 10`パラメータを追加し、最大10件の不正なレコードをスキップできます。 +- ingredients、directions、NERフィールドの各配列は、通常でない形式で表現されています。それらは文字列としてJSONにシリアライズされた後、CSVに配置されています。それをStringとして解析し、[JSONExtract](../../sql-reference/functions/json-functions.md)関数を使用してArrayに変換します。 + +## 挿入されたデータの検証 + +行数を確認します: + +クエリ: + +``` sql +SELECT count() FROM recipes; +``` + +結果: + +``` text +┌─count()─┐ +│ 2231142 │ +└─────────┘ +``` + +## クエリの例 + +### レシピ数による主要な成分 + +この例では、[arrayJoin](../../sql-reference/functions/array-join.md)関数を使って配列を行のセットに展開する方法を学びます。 + +クエリ: + +``` sql +SELECT + arrayJoin(NER) AS k, + count() AS c +FROM recipes +GROUP BY k +ORDER BY c DESC +LIMIT 50 +``` + +結果: + +``` text +┌─k────────────────────┬──────c─┐ +│ salt │ 890741 │ +│ sugar │ 620027 │ +│ butter │ 493823 │ +│ flour │ 466110 │ +│ eggs │ 401276 │ +│ onion │ 372469 │ +│ garlic │ 358364 │ +│ milk │ 346769 │ +│ water │ 326092 │ +│ vanilla │ 270381 │ +│ olive oil │ 197877 │ +│ pepper │ 179305 │ +│ brown sugar │ 174447 │ +│ tomatoes │ 163933 │ +│ egg │ 160507 │ +│ baking powder │ 148277 │ +│ lemon juice │ 146414 │ +│ Salt │ 122558 │ +│ cinnamon │ 117927 │ +│ sour cream │ 116682 │ +│ cream cheese │ 114423 │ +│ margarine │ 112742 │ +│ celery │ 112676 │ +│ baking soda │ 110690 │ +│ parsley │ 102151 │ +│ chicken │ 101505 │ +│ onions │ 98903 │ +│ vegetable oil │ 91395 │ +│ oil │ 85600 │ +│ mayonnaise │ 84822 │ +│ pecans │ 79741 │ +│ nuts │ 78471 │ +│ potatoes │ 75820 │ +│ carrots │ 75458 │ +│ pineapple │ 74345 │ +│ soy sauce │ 70355 │ +│ black pepper │ 69064 │ +│ thyme │ 68429 │ +│ mustard │ 65948 │ +│ chicken broth │ 65112 │ +│ bacon │ 64956 │ +│ honey │ 64626 │ +│ oregano │ 64077 │ +│ ground beef │ 64068 │ +│ unsalted butter │ 63848 │ +│ mushrooms │ 61465 │ +│ Worcestershire sauce │ 59328 │ +│ cornstarch │ 58476 │ +│ green pepper │ 58388 │ +│ Cheddar cheese │ 58354 │ +└──────────────────────┴────────┘ + +50 rows in set. Elapsed: 0.112 sec. Processed 2.23 million rows, 361.57 MB (19.99 million rows/s., 3.24 GB/s.) +``` + +### ストロベリーを使った最も複雑なレシピ + +``` sql +SELECT + title, + length(NER), + length(directions) +FROM recipes +WHERE has(NER, 'strawberry') +ORDER BY length(directions) DESC +LIMIT 10 +``` + +結果: + +``` text +┌─title────────────────────────────────────────────────────────────┬─length(NER)─┬─length(directions)─┐ +│ Chocolate-Strawberry-Orange Wedding Cake │ 24 │ 126 │ +│ Strawberry Cream Cheese Crumble Tart │ 19 │ 47 │ +│ Charlotte-Style Ice Cream │ 11 │ 45 │ +│ Sinfully Good a Million Layers Chocolate Layer Cake, With Strawb │ 31 │ 45 │ +│ Sweetened Berries With Elderflower Sherbet │ 24 │ 44 │ +│ Chocolate-Strawberry Mousse Cake │ 15 │ 42 │ +│ Rhubarb Charlotte with Strawberries and Rum │ 20 │ 42 │ +│ Chef Joey's Strawberry Vanilla Tart │ 7 │ 37 │ +│ Old-Fashioned Ice Cream Sundae Cake │ 17 │ 37 │ +│ Watermelon Cake │ 16 │ 36 │ +└──────────────────────────────────────────────────────────────────┴─────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.215 sec. Processed 2.23 million rows, 1.48 GB (10.35 million rows/s., 6.86 GB/s.) +``` + +この例では、[has](../../sql-reference/functions/array-functions.md#hasarr-elem)関数を用いて配列要素でフィルタリングを行い、手順の数でソートします。 + +結婚式用ケーキを作るのには126ステップも必要です!その手順を表示します: + +クエリ: + +``` sql +SELECT arrayJoin(directions) +FROM recipes +WHERE title = 'Chocolate-Strawberry-Orange Wedding Cake' +``` + +結果: + +``` text +┌─arrayJoin(directions)───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Position 1 rack in center and 1 rack in bottom third of oven and preheat to 350F. │ +│ Butter one 5-inch-diameter cake pan with 2-inch-high sides, one 8-inch-diameter cake pan with 2-inch-high sides and one 12-inch-diameter cake pan with 2-inch-high sides. │ +│ Dust pans with flour; line bottoms with parchment. │ +│ Combine 1/3 cup orange juice and 2 ounces unsweetened chocolate in heavy small saucepan. │ +│ Stir mixture over medium-low heat until chocolate melts. │ +│ Remove from heat. │ +│ Gradually mix in 1 2/3 cups orange juice. │ +│ Sift 3 cups flour, 2/3 cup cocoa, 2 teaspoons baking soda, 1 teaspoon salt and 1/2 teaspoon baking powder into medium bowl. │ +│ using electric mixer, beat 1 cup (2 sticks) butter and 3 cups sugar in large bowl until blended (mixture will look grainy). │ +│ Add 4 eggs, 1 at a time, beating to blend after each. │ +│ Beat in 1 tablespoon orange peel and 1 tablespoon vanilla extract. │ +│ Add dry ingredients alternately with orange juice mixture in 3 additions each, beating well after each addition. │ +│ Mix in 1 cup chocolate chips. │ +│ Transfer 1 cup plus 2 tablespoons batter to prepared 5-inch pan, 3 cups batter to prepared 8-inch pan and remaining batter (about 6 cups) to 12-inch pan. │ +│ Place 5-inch and 8-inch pans on center rack of oven. │ +│ Place 12-inch pan on lower rack of oven. │ +│ Bake cakes until tester inserted into center comes out clean, about 35 minutes. │ +│ Transfer cakes in pans to racks and cool completely. │ +│ Mark 4-inch diameter circle on one 6-inch-diameter cardboard cake round. │ +│ Cut out marked circle. │ +│ Mark 7-inch-diameter circle on one 8-inch-diameter cardboard cake round. │ +│ Cut out marked circle. │ +│ Mark 11-inch-diameter circle on one 12-inch-diameter cardboard cake round. │ +│ Cut out marked circle. │ +│ Cut around sides of 5-inch-cake to loosen. │ +│ Place 4-inch cardboard over pan. │ +│ Hold cardboard and pan together; turn cake out onto cardboard. │ +│ Peel off parchment.Wrap cakes on its cardboard in foil. │ +│ Repeat turning out, peeling off parchment and wrapping cakes in foil, using 7-inch cardboard for 8-inch cake and 11-inch cardboard for 12-inch cake. │ +│ Using remaining ingredients, make 1 more batch of cake batter and bake 3 more cake layers as described above. │ +│ Cool cakes in pans. │ +│ Cover cakes in pans tightly with foil. │ +│ (Can be prepared ahead. │ +│ Let stand at room temperature up to 1 day or double-wrap all cake layers and freeze up to 1 week. │ +│ Bring cake layers to room temperature before using.) │ +│ Place first 12-inch cake on its cardboard on work surface. │ +│ Spread 2 3/4 cups ganache over top of cake and all the way to edge. │ +│ Spread 2/3 cup jam over ganache, leaving 1/2-inch chocolate border at edge. │ +│ Drop 1 3/4 cups white chocolate frosting by spoonfuls over jam. │ +│ Gently spread frosting over jam, leaving 1/2-inch chocolate border at edge. │ +│ Rub some cocoa powder over second 12-inch cardboard. │ +│ Cut around sides of second 12-inch cake to loosen. │ +│ Place cardboard, cocoa side down, over pan. │ +│ Turn cake out onto cardboard. │ +│ Peel off parchment. │ +│ Carefully slide cake off cardboard and onto filling on first 12-inch cake. │ +│ Refrigerate. │ +│ Place first 8-inch cake on its cardboard on work surface. │ +│ Spread 1 cup ganache over top all the way to edge. │ +│ Spread 1/4 cup jam over, leaving 1/2-inch chocolate border at edge. │ +│ Drop 1 cup white chocolate frosting by spoonfuls over jam. │ +│ Gently spread frosting over jam, leaving 1/2-inch chocolate border at edge. │ +│ Rub some cocoa over second 8-inch cardboard. │ +│ Cut around sides of second 8-inch cake to loosen. │ +│ Place cardboard, cocoa side down, over pan. │ +│ Turn cake out onto cardboard. │ +│ Peel off parchment. │ +│ Slide cake off cardboard and onto filling on first 8-inch cake. │ +│ Refrigerate. │ +│ Place first 5-inch cake on its cardboard on work surface. │ +│ Spread 1/2 cup ganache over top of cake and all the way to edge. │ +│ Spread 2 tablespoons jam over, leaving 1/2-inch chocolate border at edge. │ +│ Drop 1/3 cup white chocolate frosting by spoonfuls over jam. │ +│ Gently spread frosting over jam, leaving 1/2-inch chocolate border at edge. │ +│ Rub cocoa over second 6-inch cardboard. │ +│ Cut around sides of second 5-inch cake to loosen. │ +│ Place cardboard, cocoa side down, over pan. │ +│ Turn cake out onto cardboard. │ +│ Peel off parchment. │ +│ Slide cake off cardboard and onto filling on first 5-inch cake. │ +│ Chill all cakes 1 hour to set filling. │ +│ Place 12-inch tiered cake on its cardboard on revolving cake stand. │ +│ Spread 2 2/3 cups frosting over top and sides of cake as a first coat. │ +│ Refrigerate cake. │ +│ Place 8-inch tiered cake on its cardboard on cake stand. │ +│ Spread 1 1/4 cups frosting over top and sides of cake as a first coat. │ +│ Refrigerate cake. │ +│ Place 5-inch tiered cake on its cardboard on cake stand. │ +│ Spread 3/4 cup frosting over top and sides of cake as a first coat. │ +│ Refrigerate all cakes until first coats of frosting set, about 1 hour. │ +│ (Cakes can be made to this point up to 1 day ahead; cover and keep refrigerate.) │ +│ Prepare second batch of frosting, using remaining frosting ingredients and following directions for first batch. │ +│ Spoon 2 cups frosting into pastry bag fitted with small star tip. │ +│ Place 12-inch cake on its cardboard on large flat platter. │ +│ Place platter on cake stand. │ +│ Using icing spatula, spread 2 1/2 cups frosting over top and sides of cake; smooth top. │ +│ Using filled pastry bag, pipe decorative border around top edge of cake. │ +│ Refrigerate cake on platter. │ +│ Place 8-inch cake on its cardboard on cake stand. │ +│ Using icing spatula, spread 1 1/2 cups frosting over top and sides of cake; smooth top. │ +│ Using pastry bag, pipe decorative border around top edge of cake. │ +│ Refrigerate cake on its cardboard. │ +│ Place 5-inch cake on its cardboard on cake stand. │ +│ Using icing spatula, spread 3/4 cup frosting over top and sides of cake; smooth top. │ +│ Using pastry bag, pipe decorative border around top edge of cake, spooning more frosting into bag if necessary. │ +│ Refrigerate cake on its cardboard. │ +│ Keep all cakes refrigerated until frosting sets, about 2 hours. │ +│ (Can be prepared 2 days ahead. │ +│ Cover loosely; keep refrigerated.) │ +│ Place 12-inch cake on platter on work surface. │ +│ Press 1 wooden dowel straight down into and completely through center of cake. │ +│ Mark dowel 1/4 inch above top of frosting. │ +│ Remove dowel and cut with serrated knife at marked point. │ +│ Cut 4 more dowels to same length. │ +│ Press 1 cut dowel back into center of cake. │ +│ Press remaining 4 cut dowels into cake, positioning 3 1/2 inches inward from cake edges and spacing evenly. │ +│ Place 8-inch cake on its cardboard on work surface. │ +│ Press 1 dowel straight down into and completely through center of cake. │ +│ Mark dowel 1/4 inch above top of frosting. │ +│ Remove dowel and cut with serrated knife at marked point. │ +│ Cut 3 more dowels to same length. │ +│ Press 1 cut dowel back into center of cake. │ +│ Press remaining 3 cut dowels into cake, positioning 2 1/2 inches inward from edges and spacing evenly. │ +│ Using large metal spatula as aid, place 8-inch cake on its cardboard atop dowels in 12-inch cake, centering carefully. │ +│ Gently place 5-inch cake on its cardboard atop dowels in 8-inch cake, centering carefully. │ +│ Using citrus stripper, cut long strips of orange peel from oranges. │ +│ Cut strips into long segments. │ +│ To make orange peel coils, wrap peel segment around handle of wooden spoon; gently slide peel off handle so that peel keeps coiled shape. │ +│ Garnish cake with orange peel coils, ivy or mint sprigs, and some berries. │ +│ (Assembled cake can be made up to 8 hours ahead. │ +│ Let stand at cool room temperature.) │ +│ Remove top and middle cake tiers. │ +│ Remove dowels from cakes. │ +│ Cut top and middle cakes into slices. │ +│ To cut 12-inch cake: Starting 3 inches inward from edge and inserting knife straight down, cut through from top to bottom to make 6-inch-diameter circle in center of cake. │ +│ Cut outer portion of cake into slices; cut inner portion into slices and serve with strawberries. │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +126 rows in set. Elapsed: 0.011 sec. Processed 8.19 thousand rows, 5.34 MB (737.75 thousand rows/s., 480.59 MB/s.) +``` + +### オンラインプレイグラウンド + +データセットは[オンラインプレイグラウンド](https://sql.clickhouse.com?query_id=HQXNQZE26Z1QWYP9KC76ML)でも利用可能です。 diff --git a/docs/ja/getting-started/example-datasets/reddit-comments.md b/docs/ja/getting-started/example-datasets/reddit-comments.md new file mode 100644 index 00000000000..b91d6bb8de7 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/reddit-comments.md @@ -0,0 +1,716 @@ +--- +slug: /ja/getting-started/example-datasets/reddit-comments +sidebar_label: Redditのコメント +--- + +# Reddit comments dataset + +このデータセットには、2005年12月から2023年3月にかけてのRedditで公開されたコメントが含まれており、14B以上の行のデータが含まれています。生データはJSON形式の圧縮ファイルに入っており、その行は以下のような形式です: + +```json +{"controversiality":0,"body":"A look at Vietnam and Mexico exposes the myth of market liberalisation.","subreddit_id":"t5_6","link_id":"t3_17863","stickied":false,"subreddit":"reddit.com","score":2,"ups":2,"author_flair_css_class":null,"created_utc":1134365188,"author_flair_text":null,"author":"frjo","id":"c13","edited":false,"parent_id":"t3_17863","gilded":0,"distinguished":null,"retrieved_on":1473738411} +{"created_utc":1134365725,"author_flair_css_class":null,"score":1,"ups":1,"subreddit":"reddit.com","stickied":false,"link_id":"t3_17866","subreddit_id":"t5_6","controversiality":0,"body":"The site states \"What can I use it for? Meeting notes, Reports, technical specs Sign-up sheets, proposals and much more...\", just like any other new breeed of sites that want us to store everything we have on the web. And they even guarantee multiple levels of security and encryption etc. But what prevents these web site operators fom accessing and/or stealing Meeting notes, Reports, technical specs Sign-up sheets, proposals and much more, for competitive or personal gains...? I am pretty sure that most of them are honest, but what's there to prevent me from setting up a good useful site and stealing all your data? Call me paranoid - I am.","retrieved_on":1473738411,"distinguished":null,"gilded":0,"id":"c14","edited":false,"parent_id":"t3_17866","author":"zse7zse","author_flair_text":null} +{"gilded":0,"distinguished":null,"retrieved_on":1473738411,"author":"[deleted]","author_flair_text":null,"edited":false,"id":"c15","parent_id":"t3_17869","subreddit":"reddit.com","score":0,"ups":0,"created_utc":1134366848,"author_flair_css_class":null,"body":"Jython related topics by Frank Wierzbicki","controversiality":0,"subreddit_id":"t5_6","stickied":false,"link_id":"t3_17869"} +{"gilded":0,"retrieved_on":1473738411,"distinguished":null,"author_flair_text":null,"author":"[deleted]","edited":false,"parent_id":"t3_17870","id":"c16","subreddit":"reddit.com","created_utc":1134367660,"author_flair_css_class":null,"score":1,"ups":1,"body":"[deleted]","controversiality":0,"stickied":false,"link_id":"t3_17870","subreddit_id":"t5_6"} +{"gilded":0,"retrieved_on":1473738411,"distinguished":null,"author_flair_text":null,"author":"rjoseph","edited":false,"id":"c17","parent_id":"t3_17817","subreddit":"reddit.com","author_flair_css_class":null,"created_utc":1134367754,"score":1,"ups":1,"body":"Saft is by far the best extension you could tak onto your Safari","controversiality":0,"link_id":"t3_17817","stickied":false,"subreddit_id":"t5_6"} +``` + +Perconaに[このデータセットの取り込みの動機](https://www.percona.com/blog/big-data-set-reddit-comments-analyzing-clickhouse/)に感謝します。このデータセットはダウンロードされ、S3バケットに保存されています。 + +:::note +以下のコマンドは、最低メモリを720GBに設定したClickHouse CloudのProductionインスタンスで実行されました。自分のクラスターでこれを実行したい場合は、`s3Cluster`関数呼び出しの`default`を自分のクラスター名に置き換えてください。クラスターを持っていない場合は、`s3Cluster`関数を`s3`関数に置き換えてください。 +::: + +1. Redditデータ用のテーブルを作成しましょう: + +```sql +CREATE TABLE reddit +( + subreddit LowCardinality(String), + subreddit_id LowCardinality(String), + subreddit_type Enum('public' = 1, 'restricted' = 2, 'user' = 3, 'archived' = 4, 'gold_restricted' = 5, 'private' = 6), + author LowCardinality(String), + body String CODEC(ZSTD(6)), + created_date Date DEFAULT toDate(created_utc), + created_utc DateTime, + retrieved_on DateTime, + id String, + parent_id String, + link_id String, + score Int32, + total_awards_received UInt16, + controversiality UInt8, + gilded UInt8, + collapsed_because_crowd_control UInt8, + collapsed_reason Enum('' = 0, 'comment score below threshold' = 1, 'may be sensitive content' = 2, 'potentially toxic' = 3, 'potentially toxic content' = 4), + distinguished Enum('' = 0, 'moderator' = 1, 'admin' = 2, 'special' = 3), + removal_reason Enum('' = 0, 'legal' = 1), + author_created_utc DateTime, + author_fullname LowCardinality(String), + author_patreon_flair UInt8, + author_premium UInt8, + can_gild UInt8, + can_mod_post UInt8, + collapsed UInt8, + is_submitter UInt8, + _edited String, + locked UInt8, + quarantined UInt8, + no_follow UInt8, + send_replies UInt8, + stickied UInt8, + author_flair_text LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (subreddit, created_date, author); +``` + +:::note +S3内のファイル名は`RC_YYYY-MM`で始まり、`YYYY-MM`は`2005-12`から`2023-02`まで続きます。しかし、圧縮形式が数回変わるため、ファイル拡張子は一貫していません。例えば: + +- 初期のファイル名は`RC_2005-12.bz2`から`RC_2017-11.bz2`です +- 次に`RC_2017-12.xz`から`RC_2018-09.xz`に変わります +- そして最終的に`RC_2018-10.zst`から`RC_2023-02.zst`になります +::: + +2. 最初に、1か月分のデータから始めますが、すべての行を挿入する場合は、下記のステップ8に進んでください。次のファイルには2017年12月の8600万件のレコードが含まれています: + +```sql +INSERT INTO reddit + SELECT * + FROM s3( + 'https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/reddit/original/RC_2017-12.xz', + 'JSONEachRow' + ); +``` + +3. リソースに応じて時間がかかりますが、完了したら動作を確認します: + +```sql +SELECT formatReadableQuantity(count()) +FROM reddit; +``` + +```response +┌─formatReadableQuantity(count())─┐ +│ 85.97 million │ +└─────────────────────────────────┘ +``` + +4. 2017年12月にどれだけのユニークなサブレディットがあったか見てみましょう: + +```sql +SELECT uniqExact(subreddit) +FROM reddit; +``` + +```response +┌─uniqExact(subreddit)─┐ +│ 91613 │ +└──────────────────────┘ + +1 row in set. Elapsed: 1.572 sec. Processed 85.97 million rows, 367.43 MB (54.71 million rows/s., 233.80 MB/s.) +``` + +5. 次のクエリは、コメント数で上位10のサブレディットを返します: + +```sql +SELECT + subreddit, + count() AS c +FROM reddit +GROUP BY subreddit +ORDER BY c DESC +LIMIT 20; +``` + +```response +┌─subreddit───────┬───────c─┐ +│ AskReddit │ 5245881 │ +│ politics │ 1753120 │ +│ nfl │ 1220266 │ +│ nba │ 960388 │ +│ The_Donald │ 931857 │ +│ news │ 796617 │ +│ worldnews │ 765709 │ +│ CFB │ 710360 │ +│ gaming │ 602761 │ +│ movies │ 601966 │ +│ soccer │ 590628 │ +│ Bitcoin │ 583783 │ +│ pics │ 563408 │ +│ StarWars │ 562514 │ +│ funny │ 547563 │ +│ leagueoflegends │ 517213 │ +│ teenagers │ 492020 │ +│ DestinyTheGame │ 477377 │ +│ todayilearned │ 472650 │ +│ videos │ 450581 │ +└─────────────────┴─────────┘ + +20 rows in set. Elapsed: 0.368 sec. Processed 85.97 million rows, 367.43 MB (233.34 million rows/s., 997.25 MB/s.) +``` + +6. 2017年12月にコメント数で上位10の著者は次のとおりです: + +```sql +SELECT + author, + count() AS c +FROM reddit +GROUP BY author +ORDER BY c DESC +LIMIT 10; +``` + +```response +┌─author──────────┬───────c─┐ +│ [deleted] │ 5913324 │ +│ AutoModerator │ 784886 │ +│ ImagesOfNetwork │ 83241 │ +│ BitcoinAllBot │ 54484 │ +│ imguralbumbot │ 45822 │ +│ RPBot │ 29337 │ +│ WikiTextBot │ 25982 │ +│ Concise_AMA_Bot │ 19974 │ +│ MTGCardFetcher │ 19103 │ +│ TotesMessenger │ 19057 │ +└─────────────────┴─────────┘ + +10 rows in set. Elapsed: 8.143 sec. Processed 85.97 million rows, 711.05 MB (10.56 million rows/s., 87.32 MB/s.) +``` + +7. データをすでに挿入していますが、最初からやり直します: + +```sql +TRUNCATE TABLE reddit; +``` + +8. このデータセットは面白いデータセットなので、2005年から2023年までのすべてのデータを挿入してみましょう。実用的な理由から、年ごとにデータを挿入するとうまく機能します... + +```sql +INSERT INTO reddit + SELECT * + FROM s3Cluster( + 'default', + 'https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/reddit/original/RC_2005*', + 'JSONEachRow' + ) + SETTINGS zstd_window_log_max = 31; +``` + +...そして、以下のように終了します: + +```sql +INSERT INTO reddit +SELECT * +FROM s3Cluster( + 'default', + 'https://clickhouse-public-datasets.s3.amazonaws.com/reddit/original/RC_2023*', + 'JSONEachRow' + ) +SETTINGS zstd_window_log_max = 31; +``` + +クラスターを持っていない場合は、`s3Cluster`の代わりに`s3`を使用してください: + +```sql +INSERT INTO reddit +SELECT * +FROM s3( + 'https://clickhouse-public-datasets.s3.amazonaws.com/reddit/original/RC_2005*', + 'JSONEachRow' + ) +SETTINGS zstd_window_log_max = 31; +``` + +9. 正しく動作したか確認するために、1年ごとの行数を示します(2023年2月現在): + +```sql +SELECT + toYear(created_utc) AS year, + formatReadableQuantity(count()) +FROM reddit +GROUP BY year; +``` + +```response + +┌─year─┬─formatReadableQuantity(count())─┐ +│ 2005 │ 1.07 thousand │ +│ 2006 │ 417.18 thousand │ +│ 2007 │ 2.46 million │ +│ 2008 │ 7.24 million │ +│ 2009 │ 18.86 million │ +│ 2010 │ 42.93 million │ +│ 2011 │ 28.91 million │ +│ 2012 │ 260.31 million │ +│ 2013 │ 402.21 million │ +│ 2014 │ 531.80 million │ +│ 2015 │ 667.76 million │ +│ 2016 │ 799.90 million │ +│ 2017 │ 972.86 million │ +│ 2018 │ 1.24 billion │ +│ 2019 │ 1.66 billion │ +│ 2020 │ 2.16 billion │ +│ 2021 │ 2.59 billion │ +│ 2022 │ 2.82 billion │ +│ 2023 │ 474.86 million │ +└──────┴─────────────────────────────────┘ +``` + +10. 挿入された行数とテーブルが使用しているディスクスペースを確認しましょう: + +```sql +SELECT + sum(rows) AS count, + formatReadableQuantity(count), + formatReadableSize(sum(bytes)) AS disk_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size +FROM system.parts +WHERE (table = 'reddit') AND active; +``` + +ディスクストレージの圧縮が非圧縮サイズの約1/3であることに注目してください: + +```response +┌───────count─┬─formatReadableQuantity(sum(rows))─┬─disk_size─┬─uncompressed_size─┐ +│ 14688534662 │ 14.69 billion │ 1.03 TiB │ 3.26 TiB │ +└─────────────┴───────────────────────────────────┴───────────┴───────────────────┘ + +1 row in set. Elapsed: 0.005 sec. +``` + +11. 次のクエリは、月ごとにコメント、著者、サブレディットの数を示します: + +```sql +SELECT + toStartOfMonth(created_utc) AS firstOfMonth, + count() AS c, + bar(c, 0, 50000000, 25) AS bar_count, + uniq(author) AS authors, + bar(authors, 0, 5000000, 25) AS bar_authors, + uniq(subreddit) AS subreddits, + bar(subreddits, 0, 100000, 25) AS bar_subreddits +FROM reddit +GROUP BY firstOfMonth +ORDER BY firstOfMonth ASC; +``` + +これは14.69B行のすべてを処理するための大きなクエリですが、まだ印象的な応答時間(約48秒)を示します: + +```response +┌─firstOfMonth─┬─────────c─┬─bar_count─────────────────┬──authors─┬─bar_authors───────────────┬─subreddits─┬─bar_subreddits────────────┐ +│ 2005-12-01 │ 1075 │ │ 394 │ │ 1 │ │ +│ 2006-01-01 │ 3666 │ │ 791 │ │ 2 │ │ +│ 2006-02-01 │ 9095 │ │ 1464 │ │ 18 │ │ +│ 2006-03-01 │ 13859 │ │ 1958 │ │ 15 │ │ +│ 2006-04-01 │ 19090 │ │ 2334 │ │ 21 │ │ +│ 2006-05-01 │ 26859 │ │ 2698 │ │ 21 │ │ +│ 2006-06-01 │ 29163 │ │ 3043 │ │ 19 │ │ +│ 2006-07-01 │ 37031 │ │ 3532 │ │ 22 │ │ +│ 2006-08-01 │ 50559 │ │ 4750 │ │ 24 │ │ +│ 2006-09-01 │ 50675 │ │ 4908 │ │ 21 │ │ +│ 2006-10-01 │ 54148 │ │ 5654 │ │ 31 │ │ +│ 2006-11-01 │ 62021 │ │ 6490 │ │ 23 │ │ +│ 2006-12-01 │ 61018 │ │ 6707 │ │ 24 │ │ +│ 2007-01-01 │ 81341 │ │ 7931 │ │ 23 │ │ +│ 2007-02-01 │ 95634 │ │ 9020 │ │ 21 │ │ +│ 2007-03-01 │ 112444 │ │ 10842 │ │ 23 │ │ +│ 2007-04-01 │ 126773 │ │ 10701 │ │ 26 │ │ +│ 2007-05-01 │ 170097 │ │ 11365 │ │ 25 │ │ +│ 2007-06-01 │ 178800 │ │ 11267 │ │ 22 │ │ +│ 2007-07-01 │ 203319 │ │ 12482 │ │ 25 │ │ +│ 2007-08-01 │ 225111 │ │ 14124 │ │ 30 │ │ +│ 2007-09-01 │ 259497 │ ▏ │ 15416 │ │ 33 │ │ +│ 2007-10-01 │ 274170 │ ▏ │ 15302 │ │ 36 │ │ +│ 2007-11-01 │ 372983 │ ▏ │ 15134 │ │ 43 │ │ +│ 2007-12-01 │ 363390 │ ▏ │ 15915 │ │ 31 │ │ +│ 2008-01-01 │ 452990 │ ▏ │ 18857 │ │ 126 │ │ +│ 2008-02-01 │ 441768 │ ▏ │ 18266 │ │ 173 │ │ +│ 2008-03-01 │ 463728 │ ▏ │ 18947 │ │ 292 │ │ +│ 2008-04-01 │ 468317 │ ▏ │ 18590 │ │ 323 │ │ +│ 2008-05-01 │ 536380 │ ▎ │ 20861 │ │ 375 │ │ +│ 2008-06-01 │ 577684 │ ▎ │ 22557 │ │ 575 │ ▏ │ +│ 2008-07-01 │ 592610 │ ▎ │ 23123 │ │ 657 │ ▏ │ +│ 2008-08-01 │ 595959 │ ▎ │ 23729 │ │ 707 │ ▏ │ +│ 2008-09-01 │ 680892 │ ▎ │ 26374 │ ▏ │ 801 │ ▏ │ +│ 2008-10-01 │ 789874 │ ▍ │ 28970 │ ▏ │ 893 │ ▏ │ +│ 2008-11-01 │ 792310 │ ▍ │ 30272 │ ▏ │ 1024 │ ▎ │ +│ 2008-12-01 │ 850359 │ ▍ │ 34073 │ ▏ │ 1103 │ ▎ │ +│ 2009-01-01 │ 1051649 │ ▌ │ 38978 │ ▏ │ 1316 │ ▎ │ +│ 2009-02-01 │ 944711 │ ▍ │ 43390 │ ▏ │ 1132 │ ▎ │ +│ 2009-03-01 │ 1048643 │ ▌ │ 46516 │ ▏ │ 1203 │ ▎ │ +│ 2009-04-01 │ 1094599 │ ▌ │ 48284 │ ▏ │ 1334 │ ▎ │ +│ 2009-05-01 │ 1201257 │ ▌ │ 52512 │ ▎ │ 1395 │ ▎ │ +│ 2009-06-01 │ 1258750 │ ▋ │ 57728 │ ▎ │ 1473 │ ▎ │ +│ 2009-07-01 │ 1470290 │ ▋ │ 60098 │ ▎ │ 1686 │ ▍ │ +│ 2009-08-01 │ 1750688 │ ▉ │ 67347 │ ▎ │ 1777 │ ▍ │ +│ 2009-09-01 │ 2032276 │ █ │ 78051 │ ▍ │ 1784 │ ▍ │ +│ 2009-10-01 │ 2242017 │ █ │ 93409 │ ▍ │ 2071 │ ▌ │ +│ 2009-11-01 │ 2207444 │ █ │ 95940 │ ▍ │ 2141 │ ▌ │ +│ 2009-12-01 │ 2560510 │ █▎ │ 104239 │ ▌ │ 2141 │ ▌ │ +│ 2010-01-01 │ 2884096 │ █▍ │ 114314 │ ▌ │ 2313 │ ▌ │ +│ 2010-02-01 │ 2687779 │ █▎ │ 115683 │ ▌ │ 2522 │ ▋ │ +│ 2010-03-01 │ 3228254 │ █▌ │ 125775 │ ▋ │ 2890 │ ▋ │ +│ 2010-04-01 │ 3209898 │ █▌ │ 128936 │ ▋ │ 3170 │ ▊ │ +│ 2010-05-01 │ 3267363 │ █▋ │ 131851 │ ▋ │ 3166 │ ▊ │ +│ 2010-06-01 │ 3532867 │ █▊ │ 139522 │ ▋ │ 3301 │ ▊ │ +│ 2010-07-01 │ 806612 │ ▍ │ 76486 │ ▍ │ 1955 │ ▍ │ +│ 2010-08-01 │ 4247982 │ ██ │ 164071 │ ▊ │ 3653 │ ▉ │ +│ 2010-09-01 │ 4704069 │ ██▎ │ 186613 │ ▉ │ 4009 │ █ │ +│ 2010-10-01 │ 5032368 │ ██▌ │ 203800 │ █ │ 4154 │ █ │ +│ 2010-11-01 │ 5689002 │ ██▊ │ 226134 │ █▏ │ 4383 │ █ │ +│ 2010-12-01 │ 3642690 │ █▊ │ 196847 │ ▉ │ 3914 │ ▉ │ +│ 2011-01-01 │ 3924540 │ █▉ │ 215057 │ █ │ 4240 │ █ │ +│ 2011-02-01 │ 3859131 │ █▉ │ 223485 │ █ │ 4371 │ █ │ +│ 2011-03-01 │ 2877996 │ █▍ │ 208607 │ █ │ 3870 │ ▉ │ +│ 2011-04-01 │ 3859131 │ █▉ │ 248931 │ █▏ │ 4881 │ █▏ │ +│ 2011-06-01 │ 3859131 │ █▉ │ 267197 │ █▎ │ 5255 │ █▎ │ +│ 2011-08-01 │ 2943405 │ █▍ │ 259428 │ █▎ │ 5806 │ █▍ │ +│ 2011-10-01 │ 3859131 │ █▉ │ 327342 │ █▋ │ 6958 │ █▋ │ +│ 2011-12-01 │ 3728313 │ █▊ │ 354817 │ █▊ │ 7713 │ █▉ │ +│ 2012-01-01 │ 16350205 │ ████████▏ │ 696110 │ ███▍ │ 14281 │ ███▌ │ +│ 2012-02-01 │ 16015695 │ ████████ │ 722892 │ ███▌ │ 14949 │ ███▋ │ +│ 2012-03-01 │ 17881943 │ ████████▉ │ 789664 │ ███▉ │ 15795 │ ███▉ │ +│ 2012-04-01 │ 19044534 │ █████████▌ │ 842491 │ ████▏ │ 16440 │ ████ │ +│ 2012-05-01 │ 20388260 │ ██████████▏ │ 886176 │ ████▍ │ 16974 │ ████▏ │ +│ 2012-06-01 │ 21897913 │ ██████████▉ │ 946798 │ ████▋ │ 17952 │ ████▍ │ +│ 2012-07-01 │ 24087517 │ ████████████ │ 1018636 │ █████ │ 19069 │ ████▊ │ +│ 2012-08-01 │ 25703326 │ ████████████▊ │ 1094445 │ █████▍ │ 20553 │ █████▏ │ +│ 2012-09-01 │ 23419524 │ ███████████▋ │ 1088491 │ █████▍ │ 20831 │ █████▏ │ +│ 2012-10-01 │ 24788236 │ ████████████▍ │ 1131885 │ █████▋ │ 21868 │ █████▍ │ +│ 2012-11-01 │ 24648302 │ ████████████▎ │ 1167608 │ █████▊ │ 21791 │ █████▍ │ +│ 2012-12-01 │ 26080276 │ █████████████ │ 1218402 │ ██████ │ 22622 │ █████▋ │ +│ 2013-01-01 │ 30365867 │ ███████████████▏ │ 1341703 │ ██████▋ │ 24696 │ ██████▏ │ +│ 2013-02-01 │ 27213960 │ █████████████▌ │ 1304756 │ ██████▌ │ 24514 │ ██████▏ │ +│ 2013-03-01 │ 30771274 │ ███████████████▍ │ 1391703 │ ██████▉ │ 25730 │ ██████▍ │ +│ 2013-04-01 │ 33259557 │ ████████████████▋ │ 1485971 │ ███████▍ │ 27294 │ ██████▊ │ +│ 2013-05-01 │ 33126225 │ ████████████████▌ │ 1506473 │ ███████▌ │ 27299 │ ██████▊ │ +│ 2013-06-01 │ 32648247 │ ████████████████▎ │ 1506650 │ ███████▌ │ 27450 │ ██████▊ │ +│ 2013-07-01 │ 34922133 │ █████████████████▍ │ 1561771 │ ███████▊ │ 28294 │ ███████ │ +│ 2013-08-01 │ 34766579 │ █████████████████▍ │ 1589781 │ ███████▉ │ 28943 │ ███████▏ │ +│ 2013-09-01 │ 31990369 │ ███████████████▉ │ 1570342 │ ███████▊ │ 29408 │ ███████▎ │ +│ 2013-10-01 │ 35940040 │ █████████████████▉ │ 1683770 │ ████████▍ │ 30273 │ ███████▌ │ +│ 2013-11-01 │ 37396497 │ ██████████████████▋ │ 1757467 │ ████████▊ │ 31173 │ ███████▊ │ +│ 2013-12-01 │ 39810216 │ ███████████████████▉ │ 1846204 │ █████████▏ │ 32326 │ ████████ │ +│ 2014-01-01 │ 42420655 │ █████████████████████▏ │ 1927229 │ █████████▋ │ 35603 │ ████████▉ │ +│ 2014-02-01 │ 38703362 │ ███████████████████▎ │ 1874067 │ █████████▎ │ 37007 │ █████████▎ │ +│ 2014-03-01 │ 42459956 │ █████████████████████▏ │ 1959888 │ █████████▊ │ 37948 │ █████████▍ │ +│ 2014-04-01 │ 42440735 │ █████████████████████▏ │ 1951369 │ █████████▊ │ 38362 │ █████████▌ │ +│ 2014-05-01 │ 42514094 │ █████████████████████▎ │ 1970197 │ █████████▊ │ 39078 │ █████████▊ │ +│ 2014-06-01 │ 41990650 │ ████████████████████▉ │ 1943850 │ █████████▋ │ 38268 │ █████████▌ │ +│ 2014-07-01 │ 46868899 │ ███████████████████████▍ │ 2059346 │ ██████████▎ │ 40634 │ ██████████▏ │ +│ 2014-08-01 │ 46990813 │ ███████████████████████▍ │ 2117335 │ ██████████▌ │ 41764 │ ██████████▍ │ +│ 2014-09-01 │ 44992201 │ ██████████████████████▍ │ 2124708 │ ██████████▌ │ 41890 │ ██████████▍ │ +│ 2014-10-01 │ 47497520 │ ███████████████████████▋ │ 2206535 │ ███████████ │ 43109 │ ██████████▊ │ +│ 2014-11-01 │ 46118074 │ ███████████████████████ │ 2239747 │ ███████████▏ │ 43718 │ ██████████▉ │ +│ 2014-12-01 │ 48807699 │ ████████████████████████▍ │ 2372945 │ ███████████▊ │ 43823 │ ██████████▉ │ +│ 2015-01-01 │ 53851542 │ █████████████████████████ │ 2499536 │ ████████████▍ │ 47172 │ ███████████▊ │ +│ 2015-02-01 │ 48342747 │ ████████████████████████▏ │ 2448496 │ ████████████▏ │ 47229 │ ███████████▊ │ +│ 2015-03-01 │ 54564441 │ █████████████████████████ │ 2550534 │ ████████████▊ │ 48156 │ ████████████ │ +│ 2015-04-01 │ 55005780 │ █████████████████████████ │ 2609443 │ █████████████ │ 49865 │ ████████████▍ │ +│ 2015-05-01 │ 54504410 │ █████████████████████████ │ 2585535 │ ████████████▉ │ 50137 │ ████████████▌ │ +│ 2015-06-01 │ 54258492 │ █████████████████████████ │ 2595129 │ ████████████▉ │ 49598 │ ████████████▍ │ +│ 2015-07-01 │ 58451788 │ █████████████████████████ │ 2720026 │ █████████████▌ │ 55022 │ █████████████▊ │ +│ 2015-08-01 │ 58075327 │ █████████████████████████ │ 2743994 │ █████████████▋ │ 55302 │ █████████████▊ │ +│ 2015-09-01 │ 55574825 │ █████████████████████████ │ 2672793 │ █████████████▎ │ 53960 │ █████████████▍ │ +│ 2015-10-01 │ 59494045 │ █████████████████████████ │ 2816426 │ ██████████████ │ 70210 │ █████████████████▌ │ +│ 2015-11-01 │ 57117500 │ █████████████████████████ │ 2847146 │ ██████████████▏ │ 71363 │ █████████████████▊ │ +│ 2015-12-01 │ 58523312 │ █████████████████████████ │ 2854840 │ ██████████████▎ │ 94559 │ ███████████████████████▋ │ +│ 2016-01-01 │ 61991732 │ █████████████████████████ │ 2920366 │ ██████████████▌ │ 108438 │ █████████████████████████ │ +│ 2016-02-01 │ 59189875 │ █████████████████████████ │ 2854683 │ ██████████████▎ │ 109916 │ █████████████████████████ │ +│ 2016-03-01 │ 63918864 │ █████████████████████████ │ 2969542 │ ██████████████▊ │ 84787 │ █████████████████████▏ │ +│ 2016-04-01 │ 64271256 │ █████████████████████████ │ 2999086 │ ██████████████▉ │ 61647 │ ███████████████▍ │ +│ 2016-05-01 │ 65212004 │ █████████████████████████ │ 3034674 │ ███████████████▏ │ 67465 │ ████████████████▊ │ +│ 2016-06-01 │ 65867743 │ █████████████████████████ │ 3057604 │ ███████████████▎ │ 75170 │ ██████████████████▊ │ +│ 2016-07-01 │ 66974735 │ █████████████████████████ │ 3199374 │ ███████████████▉ │ 77732 │ ███████████████████▍ │ +│ 2016-08-01 │ 69654819 │ █████████████████████████ │ 3239957 │ ████████████████▏ │ 63080 │ ███████████████▊ │ +│ 2016-09-01 │ 67024973 │ █████████████████████████ │ 3190864 │ ███████████████▉ │ 62324 │ ███████████████▌ │ +│ 2016-10-01 │ 71826553 │ █████████████████████████ │ 3284340 │ ████████████████▍ │ 62549 │ ███████████████▋ │ +│ 2016-11-01 │ 71022319 │ █████████████████████████ │ 3300822 │ ████████████████▌ │ 69718 │ █████████████████▍ │ +│ 2016-12-01 │ 72942967 │ █████████████████████████ │ 3430324 │ █████████████████▏ │ 71705 │ █████████████████▉ │ +│ 2017-01-01 │ 78946585 │ █████████████████████████ │ 3572093 │ █████████████████▊ │ 78198 │ ███████████████████▌ │ +│ 2017-02-01 │ 70609487 │ █████████████████████████ │ 3421115 │ █████████████████ │ 69823 │ █████████████████▍ │ +│ 2017-03-01 │ 79723106 │ █████████████████████████ │ 3638122 │ ██████████████████▏ │ 73865 │ ██████████████████▍ │ +│ 2017-04-01 │ 77478009 │ █████████████████████████ │ 3620591 │ ██████████████████ │ 74387 │ ██████████████████▌ │ +│ 2017-05-01 │ 79810360 │ █████████████████████████ │ 3650820 │ ██████████████████▎ │ 74356 │ ██████████████████▌ │ +│ 2017-06-01 │ 79901711 │ █████████████████████████ │ 3737614 │ ██████████████████▋ │ 72114 │ ██████████████████ │ +│ 2017-07-01 │ 81798725 │ █████████████████████████ │ 3872330 │ ███████████████████▎ │ 76052 │ ███████████████████ │ +│ 2017-08-01 │ 84658503 │ █████████████████████████ │ 3960093 │ ███████████████████▊ │ 77798 │ ███████████████████▍ │ +│ 2017-09-01 │ 83165192 │ █████████████████████████ │ 3880501 │ ███████████████████▍ │ 78402 │ ███████████████████▌ │ +│ 2017-10-01 │ 85828912 │ █████████████████████████ │ 3980335 │ ███████████████████▉ │ 80685 │ ████████████████████▏ │ +│ 2017-11-01 │ 84965681 │ █████████████████████████ │ 4026749 │ ████████████████████▏ │ 82659 │ ████████████████████▋ │ +│ 2017-12-01 │ 85973810 │ █████████████████████████ │ 4196354 │ ████████████████████▉ │ 91984 │ ██████████████████████▉ │ +│ 2018-01-01 │ 91558594 │ █████████████████████████ │ 4364443 │ █████████████████████▊ │ 102577 │ █████████████████████████ │ +│ 2018-02-01 │ 86467179 │ █████████████████████████ │ 4277899 │ █████████████████████▍ │ 104610 │ █████████████████████████ │ +│ 2018-03-01 │ 96490262 │ █████████████████████████ │ 4422470 │ ██████████████████████ │ 112559 │ █████████████████████████ │ +│ 2018-04-01 │ 98101232 │ █████████████████████████ │ 4572434 │ ██████████████████████▊ │ 105284 │ █████████████████████████ │ +│ 2018-05-01 │ 100109100 │ █████████████████████████ │ 4698908 │ ███████████████████████▍ │ 103910 │ █████████████████████████ │ +│ 2018-06-01 │ 100009462 │ █████████████████████████ │ 4697426 │ ███████████████████████▍ │ 101107 │ █████████████████████████ │ +│ 2018-07-01 │ 108151359 │ █████████████████████████ │ 5099492 │ █████████████████████████ │ 106184 │ █████████████████████████ │ +│ 2018-08-01 │ 107330940 │ █████████████████████████ │ 5084082 │ █████████████████████████ │ 109985 │ █████████████████████████ │ +│ 2018-09-01 │ 104473929 │ █████████████████████████ │ 5011953 │ █████████████████████████ │ 109710 │ █████████████████████████ │ +│ 2018-10-01 │ 112346556 │ █████████████████████████ │ 5320405 │ █████████████████████████ │ 112533 │ █████████████████████████ │ +│ 2018-11-01 │ 112573001 │ █████████████████████████ │ 5353282 │ █████████████████████████ │ 112211 │ █████████████████████████ │ +│ 2018-12-01 │ 121953600 │ █████████████████████████ │ 5611543 │ █████████████████████████ │ 118291 │ █████████████████████████ │ +│ 2019-01-01 │ 129386587 │ █████████████████████████ │ 6016687 │ █████████████████████████ │ 125725 │ █████████████████████████ │ +│ 2019-02-01 │ 120645639 │ █████████████████████████ │ 5974488 │ █████████████████████████ │ 125420 │ █████████████████████████ │ +│ 2019-03-01 │ 137650471 │ █████████████████████████ │ 6410197 │ █████████████████████████ │ 135924 │ █████████████████████████ │ +│ 2019-04-01 │ 138473643 │ █████████████████████████ │ 6416384 │ █████████████████████████ │ 139844 │ █████████████████████████ │ +│ 2019-05-01 │ 142463421 │ █████████████████████████ │ 6574836 │ █████████████████████████ │ 142012 │ █████████████████████████ │ +│ 2019-06-01 │ 134172939 │ █████████████████████████ │ 6601267 │ █████████████████████████ │ 140997 │ █████████████████████████ │ +│ 2019-07-01 │ 145965083 │ █████████████████████████ │ 6901822 │ █████████████████████████ │ 147802 │ █████████████████████████ │ +│ 2019-08-01 │ 146854393 │ █████████████████████████ │ 6993882 │ █████████████████████████ │ 151888 │ █████████████████████████ │ +│ 2019-09-01 │ 137540219 │ █████████████████████████ │ 7001362 │ █████████████████████████ │ 148839 │ █████████████████████████ │ +│ 2019-10-01 │ 145909884 │ █████████████████████████ │ 7160126 │ █████████████████████████ │ 152075 │ █████████████████████████ │ +│ 2019-11-01 │ 138512489 │ █████████████████████████ │ 7098723 │ █████████████████████████ │ 164597 │ █████████████████████████ │ +│ 2019-12-01 │ 146012313 │ █████████████████████████ │ 7438261 │ █████████████████████████ │ 166966 │ █████████████████████████ │ +│ 2020-01-01 │ 153498208 │ █████████████████████████ │ 7703548 │ █████████████████████████ │ 174390 │ █████████████████████████ │ +│ 2020-02-01 │ 148386817 │ █████████████████████████ │ 7582031 │ █████████████████████████ │ 170257 │ █████████████████████████ │ +│ 2020-03-01 │ 166266315 │ █████████████████████████ │ 8339049 │ █████████████████████████ │ 192460 │ █████████████████████████ │ +│ 2020-04-01 │ 178511581 │ █████████████████████████ │ 8991649 │ █████████████████████████ │ 202334 │ █████████████████████████ │ +│ 2020-05-01 │ 189993779 │ █████████████████████████ │ 9331358 │ █████████████████████████ │ 217357 │ █████████████████████████ │ +│ 2020-06-01 │ 187914434 │ █████████████████████████ │ 9085003 │ █████████████████████████ │ 223362 │ █████████████████████████ │ +│ 2020-07-01 │ 194244994 │ █████████████████████████ │ 9321706 │ █████████████████████████ │ 228222 │ █████████████████████████ │ +│ 2020-08-01 │ 196099301 │ █████████████████████████ │ 9368408 │ █████████████████████████ │ 230251 │ █████████████████████████ │ +│ 2020-09-01 │ 182549761 │ █████████████████████████ │ 9271571 │ █████████████████████████ │ 227889 │ █████████████████████████ │ +│ 2020-10-01 │ 186583890 │ █████████████████████████ │ 9396112 │ █████████████████████████ │ 233715 │ █████████████████████████ │ +│ 2020-11-01 │ 186083723 │ █████████████████████████ │ 9623053 │ █████████████████████████ │ 234963 │ █████████████████████████ │ +│ 2020-12-01 │ 191317162 │ █████████████████████████ │ 9898168 │ █████████████████████████ │ 249115 │ █████████████████████████ │ +│ 2021-01-01 │ 210496207 │ █████████████████████████ │ 10503943 │ █████████████████████████ │ 259805 │ █████████████████████████ │ +│ 2021-02-01 │ 193510365 │ █████████████████████████ │ 10215033 │ █████████████████████████ │ 253656 │ █████████████████████████ │ +│ 2021-03-01 │ 207454415 │ █████████████████████████ │ 10365629 │ █████████████████████████ │ 267263 │ █████████████████████████ │ +│ 2021-04-01 │ 204573086 │ █████████████████████████ │ 10391984 │ █████████████████████████ │ 270543 │ █████████████████████████ │ +│ 2021-05-01 │ 217655366 │ █████████████████████████ │ 10648130 │ █████████████████████████ │ 288555 │ █████████████████████████ │ +│ 2021-06-01 │ 208027069 │ █████████████████████████ │ 10397311 │ █████████████████████████ │ 291520 │ █████████████████████████ │ +│ 2021-07-01 │ 210955954 │ █████████████████████████ │ 10063967 │ █████████████████████████ │ 252061 │ █████████████████████████ │ +│ 2021-08-01 │ 225681244 │ █████████████████████████ │ 10383556 │ █████████████████████████ │ 254569 │ █████████████████████████ │ +│ 2021-09-01 │ 220086513 │ █████████████████████████ │ 10298344 │ █████████████████████████ │ 256826 │ █████████████████████████ │ +│ 2021-10-01 │ 227527379 │ █████████████████████████ │ 10729882 │ █████████████████████████ │ 283328 │ █████████████████████████ │ +│ 2021-11-01 │ 228289963 │ █████████████████████████ │ 10995197 │ █████████████████████████ │ 302386 │ █████████████████████████ │ +│ 2021-12-01 │ 235807471 │ █████████████████████████ │ 11312798 │ █████████████████████████ │ 313876 │ █████████████████████████ │ +│ 2022-01-01 │ 256766679 │ █████████████████████████ │ 12074520 │ █████████████████████████ │ 340407 │ █████████████████████████ │ +│ 2022-02-01 │ 219927645 │ █████████████████████████ │ 10846045 │ █████████████████████████ │ 293236 │ █████████████████████████ │ +│ 2022-03-01 │ 236554668 │ █████████████████████████ │ 11330285 │ █████████████████████████ │ 302387 │ █████████████████████████ │ +│ 2022-04-01 │ 231188077 │ █████████████████████████ │ 11697995 │ █████████████████████████ │ 316303 │ █████████████████████████ │ +│ 2022-05-01 │ 230492108 │ █████████████████████████ │ 11448584 │ █████████████████████████ │ 323725 │ █████████████████████████ │ +│ 2022-06-01 │ 218842949 │ █████████████████████████ │ 11400399 │ █████████████████████████ │ 324846 │ █████████████████████████ │ +│ 2022-07-01 │ 242504279 │ █████████████████████████ │ 12049204 │ █████████████████████████ │ 335621 │ █████████████████████████ │ +│ 2022-08-01 │ 247215325 │ █████████████████████████ │ 12189276 │ █████████████████████████ │ 337873 │ █████████████████████████ │ +│ 2022-09-01 │ 234131223 │ █████████████████████████ │ 11674079 │ █████████████████████████ │ 326325 │ █████████████████████████ │ +│ 2022-10-01 │ 237365072 │ █████████████████████████ │ 11804508 │ █████████████████████████ │ 336063 │ █████████████████████████ │ +│ 2022-11-01 │ 229478878 │ █████████████████████████ │ 11543020 │ █████████████████████████ │ 323122 │ █████████████████████████ │ +│ 2022-12-01 │ 238862690 │ █████████████████████████ │ 11967451 │ █████████████████████████ │ 331668 │ █████████████████████████ │ +│ 2023-01-01 │ 253577512 │ █████████████████████████ │ 12264087 │ █████████████████████████ │ 332711 │ █████████████████████████ │ +│ 2023-02-01 │ 221285501 │ █████████████████████████ │ 11537091 │ █████████████████████████ │ 317879 │ █████████████████████████ │ +└──────────────┴───────────┴───────────────────────────┴──────────┴───────────────────────────┴────────────┴───────────────────────────┘ + +203 rows in set. Elapsed: 48.492 sec. Processed 14.69 billion rows, 213.35 GB (302.91 million rows/s., 4.40 GB/s.) +``` + +```sql +SELECT + subreddit, + count() AS count +FROM reddit +WHERE toYear(created_utc) = 2022 +GROUP BY subreddit +ORDER BY count DESC +LIMIT 10; +``` + +```response +┌─subreddit──────┬────count─┐ +│ AskReddit │ 72312060 │ +│ AmItheAsshole │ 25323210 │ +│ teenagers │ 22355960 │ +│ worldnews │ 17797707 │ +│ FreeKarma4U │ 15652274 │ +│ FreeKarma4You │ 14929055 │ +│ wallstreetbets │ 14235271 │ +│ politics │ 12511136 │ +│ memes │ 11610792 │ +│ nba │ 11586571 │ +└────────────────┴──────────┘ + +10 rows in set. Elapsed: 5.956 sec. Processed 14.69 billion rows, 126.19 GB (2.47 billion rows/s., 21.19 GB/s.) +``` + +11. 次に、2018年から2019年にかけてコメント数が最も増加したサブレディットを見てみましょう: + +```sql +SELECT + subreddit, + newcount - oldcount AS diff +FROM +( + SELECT + subreddit, + count(*) AS newcount + FROM reddit + WHERE toYear(created_utc) = 2019 + GROUP BY subreddit +) +ALL INNER JOIN +( + SELECT + subreddit, + count(*) AS oldcount + FROM reddit + WHERE toYear(created_utc) = 2018 + GROUP BY subreddit +) USING (subreddit) +ORDER BY diff DESC +LIMIT 50 +SETTINGS joined_subquery_requires_alias = 0; +``` + +2019年は「memes」と「teenagers」がRedditで盛り上がっていたようです: + +```response +┌─subreddit────────────┬─────diff─┐ +│ AskReddit │ 18765909 │ +│ memes │ 16496996 │ +│ teenagers │ 13071715 │ +│ AmItheAsshole │ 12312663 │ +│ dankmemes │ 12016716 │ +│ unpopularopinion │ 6809935 │ +│ PewdiepieSubmissions │ 6330844 │ +│ Market76 │ 5213690 │ +│ relationship_advice │ 4060717 │ +│ Minecraft │ 3328659 │ +│ freefolk │ 3227970 │ +│ classicwow │ 3063133 │ +│ Animemes │ 2866876 │ +│ gonewild │ 2457680 │ +│ PublicFreakout │ 2452288 │ +│ gameofthrones │ 2411661 │ +│ RoastMe │ 2378781 │ +│ ShitPostCrusaders │ 2345414 │ +│ AnthemTheGame │ 1813152 │ +│ nfl │ 1804407 │ +│ Showerthoughts │ 1797968 │ +│ Cringetopia │ 1764034 │ +│ pokemon │ 1763269 │ +│ entitledparents │ 1744852 │ +│ HistoryMemes │ 1721645 │ +│ MortalKombat │ 1718184 │ +│ trashy │ 1684357 │ +│ ChapoTrapHouse │ 1675363 │ +│ Brawlstars │ 1663763 │ +│ iamatotalpieceofshit │ 1647381 │ +│ ukpolitics │ 1599204 │ +│ cursedcomments │ 1590781 │ +│ Pikabu │ 1578597 │ +│ wallstreetbets │ 1535225 │ +│ AskOuija │ 1533214 │ +│ interestingasfuck │ 1528910 │ +│ aww │ 1439008 │ +│ wholesomememes │ 1436566 │ +│ SquaredCircle │ 1432172 │ +│ insanepeoplefacebook │ 1290686 │ +│ borderlands3 │ 1274462 │ +│ FreeKarma4U │ 1217769 │ +│ YangForPresidentHQ │ 1186918 │ +│ FortniteCompetitive │ 1184508 │ +│ AskMen │ 1180820 │ +│ EpicSeven │ 1172061 │ +│ MurderedByWords │ 1112476 │ +│ politics │ 1084087 │ +│ barstoolsports │ 1068020 │ +│ BattlefieldV │ 1053878 │ +└──────────────────────┴──────────┘ + +50 rows in set. Elapsed: 10.680 sec. Processed 29.38 billion rows, 198.67 GB (2.75 billion rows/s., 18.60 GB/s.) +``` + +12. もう一つクエリ: ClickHouseに関する言及を、SnowflakeやPostgresといった他の技術と比較してみましょう。このクエリは、14.69億件のコメント全体でそれぞれ部分文字列を3回検索するため大きなクエリですが、パフォーマンスは非常に印象的です。(残念ながらClickHouseユーザーはまだRedditではあまり活発ではありませんが): + +```sql +SELECT + toStartOfQuarter(created_utc) AS quarter, + sum(if(positionCaseInsensitive(body, 'clickhouse') > 0, 1, 0)) AS clickhouse, + sum(if(positionCaseInsensitive(body, 'snowflake') > 0, 1, 0)) AS snowflake, + sum(if(positionCaseInsensitive(body, 'postgres') > 0, 1, 0)) AS postgres +FROM reddit +GROUP BY quarter +ORDER BY quarter ASC; +``` + +```response +┌────quarter─┬─clickhouse─┬─snowflake─┬─postgres─┐ +│ 2005-10-01 │ 0 │ 0 │ 0 │ +│ 2006-01-01 │ 0 │ 2 │ 23 │ +│ 2006-04-01 │ 0 │ 2 │ 24 │ +│ 2006-07-01 │ 0 │ 4 │ 13 │ +│ 2006-10-01 │ 0 │ 23 │ 73 │ +│ 2007-01-01 │ 0 │ 14 │ 91 │ +│ 2007-04-01 │ 0 │ 10 │ 59 │ +│ 2007-07-01 │ 0 │ 39 │ 116 │ +│ 2007-10-01 │ 0 │ 45 │ 125 │ +│ 2008-01-01 │ 0 │ 53 │ 234 │ +│ 2008-04-01 │ 0 │ 79 │ 303 │ +│ 2008-07-01 │ 0 │ 102 │ 174 │ +│ 2008-10-01 │ 0 │ 156 │ 323 │ +│ 2009-01-01 │ 0 │ 206 │ 208 │ +│ 2009-04-01 │ 0 │ 178 │ 417 │ +│ 2009-07-01 │ 0 │ 300 │ 295 │ +│ 2009-10-01 │ 0 │ 633 │ 589 │ +│ 2010-01-01 │ 0 │ 555 │ 501 │ +│ 2010-04-01 │ 0 │ 587 │ 469 │ +│ 2010-07-01 │ 0 │ 601 │ 696 │ +│ 2010-10-01 │ 0 │ 1246 │ 505 │ +│ 2011-01-01 │ 0 │ 758 │ 247 │ +│ 2011-04-01 │ 0 │ 537 │ 113 │ +│ 2011-07-01 │ 0 │ 173 │ 64 │ +│ 2011-10-01 │ 0 │ 649 │ 96 │ +│ 2012-01-01 │ 0 │ 4621 │ 662 │ +│ 2012-04-01 │ 0 │ 5737 │ 785 │ +│ 2012-07-01 │ 0 │ 6097 │ 1127 │ +│ 2012-10-01 │ 0 │ 7986 │ 600 │ +│ 2013-01-01 │ 0 │ 9704 │ 839 │ +│ 2013-04-01 │ 0 │ 8161 │ 853 │ +│ 2013-07-01 │ 0 │ 9704 │ 1028 │ +│ 2013-10-01 │ 0 │ 12879 │ 1404 │ +│ 2014-01-01 │ 0 │ 12317 │ 1548 │ +│ 2014-04-01 │ 0 │ 13181 │ 1577 │ +│ 2014-07-01 │ 0 │ 15640 │ 1710 │ +│ 2014-10-01 │ 0 │ 19479 │ 1959 │ +│ 2015-01-01 │ 0 │ 20411 │ 2104 │ +│ 2015-04-01 │ 1 │ 20309 │ 9112 │ +│ 2015-07-01 │ 0 │ 20325 │ 4771 │ +│ 2015-10-01 │ 0 │ 25087 │ 3030 │ +│ 2016-01-01 │ 0 │ 23462 │ 3126 │ +│ 2016-04-01 │ 3 │ 25496 │ 2757 │ +│ 2016-07-01 │ 4 │ 28233 │ 2928 │ +│ 2016-10-01 │ 2 │ 45445 │ 2449 │ +│ 2017-01-01 │ 9 │ 76019 │ 2808 │ +│ 2017-04-01 │ 9 │ 67919 │ 2803 │ +│ 2017-07-01 │ 13 │ 68974 │ 2771 │ +│ 2017-10-01 │ 12 │ 69730 │ 2906 │ +│ 2018-01-01 │ 17 │ 67476 │ 3152 │ +│ 2018-04-01 │ 3 │ 67139 │ 3986 │ +│ 2018-07-01 │ 14 │ 67979 │ 3609 │ +│ 2018-10-01 │ 28 │ 74147 │ 3850 │ +│ 2019-01-01 │ 14 │ 80250 │ 4305 │ +│ 2019-04-01 │ 30 │ 70307 │ 3872 │ +│ 2019-07-01 │ 33 │ 77149 │ 4164 │ +│ 2019-10-01 │ 22 │ 113011 │ 4369 │ +│ 2020-01-01 │ 34 │ 238273 │ 5133 │ +│ 2020-04-01 │ 52 │ 454467 │ 6100 │ +│ 2020-07-01 │ 37 │ 406623 │ 5507 │ +│ 2020-10-01 │ 49 │ 212143 │ 5385 │ +│ 2021-01-01 │ 56 │ 151262 │ 5749 │ +│ 2021-04-01 │ 71 │ 119928 │ 6039 │ +│ 2021-07-01 │ 53 │ 110342 │ 5765 │ +│ 2021-10-01 │ 92 │ 121144 │ 6401 │ +│ 2022-01-01 │ 93 │ 107512 │ 6772 │ +│ 2022-04-01 │ 120 │ 91560 │ 6687 │ +│ 2022-07-01 │ 183 │ 99764 │ 7377 │ +│ 2022-10-01 │ 123 │ 99447 │ 7052 │ +│ 2023-01-01 │ 126 │ 58733 │ 4891 │ +└────────────┴────────────┴───────────┴──────────┘ + +70 rows in set. Elapsed: 325.835 sec. Processed 14.69 billion rows, 2.57 TB (45.08 million rows/s., 7.87 GB/s.) +``` \ No newline at end of file diff --git a/docs/ja/getting-started/example-datasets/stackoverflow.md b/docs/ja/getting-started/example-datasets/stackoverflow.md new file mode 100644 index 00000000000..ac63a65ee49 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/stackoverflow.md @@ -0,0 +1,392 @@ +--- +slug: /ja/getting-started/example-datasets/stackoverflow +sidebar_label: Stack Overflow +sidebar_position: 1 +description: Stack OverflowデータのClickHouseによる分析 +--- + +# Stack OverflowデータのClickHouseによる分析 + +このデータセットには、Stack Overflowで行われたすべての`Posts`、`Users`、`Votes`、`Comments`、`Badges`、`PostHistory`、`PostLinks`が含まれています。 + +ユーザーは、2024年4月までのすべての投稿を含む、事前準備されたParquet形式のデータをダウンロードするか、最新のデータをXML形式でダウンロードして読み込むことができます。Stack Overflowは、過去には3ヶ月ごとに、このデータを定期的に更新しています。 + +次の図は、Parquet形式を前提とした利用可能なテーブルのスキーマを示しています。 + +![Stack Overflow schema](./images/stackoverflow.png) + +このデータのスキーマの説明は[こちら](https://meta.stackexchange.com/questions/2677/database-schema-documentation-for-the-public-data-dump-and-sede)で確認できます。 + +## 事前準備されたデータ + +Parquet形式で2024年4月まで最新の状態に更新したこのデータのコピーを提供します。このデータセットは、ClickHouseにとって行数(6000万件の投稿)に関しては小さいですが、膨大なテキストと大きなStringカラムが含まれています。 + +```sql +CREATE DATABASE stackoverflow +``` + +以下のタイミングは、`eu-west-2`にある96 GiB、24 vCPUのClickHouse Cloudクラスターを対象にしています。データセットは`eu-west-3`にあります。 + +### Posts + +```sql +CREATE TABLE stackoverflow.posts +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), + `Score` Int32, + `ViewCount` UInt32 CODEC(Delta(4), ZSTD(1)), + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `LastActivityDate` DateTime64(3, 'UTC'), + `Title` String, + `Tags` String, + `AnswerCount` UInt16 CODEC(Delta(2), ZSTD(1)), + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime64(3, 'UTC'), + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +PARTITION BY toYear(CreationDate) +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) + +INSERT INTO stackoverflow.posts SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 265.466 sec. Processed 59.82 million rows, 38.07 GB (225.34 thousand rows/s., 143.42 MB/s.) +``` + +投稿は、年ごとにも利用可能です。例:[https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2020.parquet](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2020.parquet) + +### Votes + +```sql +CREATE TABLE stackoverflow.votes +( + `Id` UInt32, + `PostId` Int32, + `VoteTypeId` UInt8, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `BountyAmount` UInt8 +) +ENGINE = MergeTree +ORDER BY (VoteTypeId, CreationDate, PostId, UserId) + +INSERT INTO stackoverflow.votes SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes/*.parquet') + +0 rows in set. Elapsed: 21.605 sec. Processed 238.98 million rows, 2.13 GB (11.06 million rows/s., 98.46 MB/s.) +``` + +投票は、年ごとにも利用可能です。例:[https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2020.parquet](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes/2020.parquet) + +### Comments + +```sql +CREATE TABLE stackoverflow.comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY CreationDate + +INSERT INTO stackoverflow.comments SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/comments/*.parquet') + +0 rows in set. Elapsed: 56.593 sec. Processed 90.38 million rows, 11.14 GB (1.60 million rows/s., 196.78 MB/s.) +``` + +コメントも年ごとに利用可能です。例:[https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2020.parquet](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/comments/2020.parquet) + +### Users + +```sql +CREATE TABLE stackoverflow.users +( + `Id` Int32, + `Reputation` LowCardinality(String), + `CreationDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `DisplayName` String, + `LastAccessDate` DateTime64(3, 'UTC'), + `AboutMe` String, + `Views` UInt32, + `UpVotes` UInt32, + `DownVotes` UInt32, + `WebsiteUrl` String, + `Location` LowCardinality(String), + `AccountId` Int32 +) +ENGINE = MergeTree +ORDER BY (Id, CreationDate) + +INSERT INTO stackoverflow.users SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/users.parquet') + +0 rows in set. Elapsed: 10.988 sec. Processed 22.48 million rows, 1.36 GB (2.05 million rows/s., 124.10 MB/s.) +``` + +### Badges + +```sql +CREATE TABLE stackoverflow.badges +( + `Id` UInt32, + `UserId` Int32, + `Name` LowCardinality(String), + `Date` DateTime64(3, 'UTC'), + `Class` Enum8('Gold' = 1, 'Silver' = 2, 'Bronze' = 3), + `TagBased` Bool +) +ENGINE = MergeTree +ORDER BY UserId + +INSERT INTO stackoverflow.badges SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/badges.parquet') + +0 rows in set. Elapsed: 6.635 sec. Processed 51.29 million rows, 797.05 MB (7.73 million rows/s., 120.13 MB/s.) +``` + +### PostLinks + +```sql +CREATE TABLE stackoverflow.postlinks +( + `Id` UInt64, + `CreationDate` DateTime64(3, 'UTC'), + `PostId` Int32, + `RelatedPostId` Int32, + `LinkTypeId` Enum8('Linked' = 1, 'Duplicate' = 3) +) +ENGINE = MergeTree +ORDER BY (PostId, RelatedPostId) + +INSERT INTO stackoverflow.postlinks SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/postlinks.parquet') + +0 rows in set. Elapsed: 1.534 sec. Processed 6.55 million rows, 129.70 MB (4.27 million rows/s., 84.57 MB/s.) +``` + +### PostHistory + +```sql +CREATE TABLE stackoverflow.posthistory +( + `Id` UInt64, + `PostHistoryTypeId` UInt8, + `PostId` Int32, + `RevisionGUID` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `Text` String, + `ContentLicense` LowCardinality(String), + `Comment` String, + `UserDisplayName` String +) +ENGINE = MergeTree +ORDER BY (CreationDate, PostId) + +INSERT INTO stackoverflow.posthistory SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posthistory/*.parquet') + +0 rows in set. Elapsed: 422.795 sec. Processed 160.79 million rows, 67.08 GB (380.30 thousand rows/s., 158.67 MB/s.) +``` + +## オリジナルデータセット + +オリジナルのデータセットは、圧縮済み(7zip)XML形式で[https://archive.org/download/stackexchange](https://archive.org/download/stackexchange)から利用できます。`stackoverflow.com*`プレフィックスが付いたファイルです。 + +### ダウンロード + +```bash +wget https://archive.org/download/stackexchange/stackoverflow.com-Badges.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-Comments.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-PostHistory.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-PostLinks.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z +wget https://archive.org/download/stackexchange/stackoverflow.com-Votes.7z +``` + +これらのファイルは最大35GBまであり、インターネット接続によってはダウンロードに約30分かかることがあります。ダウンロードサーバーは約20MB/secで制限されています。 + +### JSONへの変換 + +執筆時点で、ClickHouseは入力フォーマットとしてXMLをネイティブにサポートしていません。ClickHouseにデータをロードするには、まずNDJSONに変換します。 + +XMLをJSONに変換するには、XMLドキュメント用のシンプルな`jq`ラッパーツールである[`xq`](https://github.com/kislyuk/yq)をお勧めします。 + +xqとjqのインストール: + +```bash +sudo apt install jq +pip install yq +``` + +以下の手順は上記の任意のファイルに適用されます。ここでは`stackoverflow.com-Posts.7z`ファイルを例に使用します。必要に応じて修正してください。 + +[p7zip](https://p7zip.sourceforge.net/)を使用してファイルを抽出します。これにより単一のxmlファイルが生成されます。今回の場合は`Posts.xml`です。 + +> ファイルは約4.5倍圧縮されています。22GB圧縮時、投稿ファイルは約97G非圧縮で必要です。 + +```bash +p7zip -d stackoverflow.com-Posts.7z +``` + +以下はxmlファイルを10000行ずつのファイルに分割します。 + +```bash +mkdir posts +cd posts +# 以下は入力xmlファイルを10000行のサブファイルに分割します。 +tail +3 ../Posts.xml | head -n -1 | split -l 10000 --filter='{ printf "\n"; cat - ; printf "\n"; } > $FILE' - +``` + +上記を実行すると、ユーザーはそれぞれ10000行のファイルをセットで取得できます。これにより、次のコマンドのメモリオーバーヘッドが過度にならないことが保証されます(XMLからJSONへの変換はメモリ内で行われます)。 + +```bash +find . -maxdepth 1 -type f -exec xq -c '.rows.row[]' {} \; | sed -e 's:"@:":g' > posts_v2.json +``` + +上記のコマンドは単一の`posts.json`ファイルを生成します。 + +次のコマンドでClickHouseにロードします。`posts.json`ファイルのスキーマが指定されている点に注意してください。データタイプに応じて、ターゲットテーブルに対する適用が必要です。 + +```bash +clickhouse local --query "SELECT * FROM file('posts.json', JSONEachRow, 'Id Int32, PostTypeId UInt8, AcceptedAnswerId UInt32, CreationDate DateTime64(3, \'UTC\'), Score Int32, ViewCount UInt32, Body String, OwnerUserId Int32, OwnerDisplayName String, LastEditorUserId Int32, LastEditorDisplayName String, LastEditDate DateTime64(3, \'UTC\'), LastActivityDate DateTime64(3, \'UTC\'), Title String, Tags String, AnswerCount UInt16, CommentCount UInt8, FavoriteCount UInt8, ContentLicense String, ParentId String, CommunityOwnedDate DateTime64(3, \'UTC\'), ClosedDate DateTime64(3, \'UTC\')') FORMAT Native" | clickhouse client --host --secure --password --query "INSERT INTO stackoverflow.posts_v2 FORMAT Native" +``` + +## クエリ例 + +いくつかの簡単な質問をして、始める手助けをします。 + +### Stack Overflowの最も人気のあるタグ + +```sql + +SELECT + arrayJoin(arrayFilter(t -> (t != ''), splitByChar('|', Tags))) AS Tags, + count() AS c +FROM stackoverflow.posts +GROUP BY Tags +ORDER BY c DESC +LIMIT 10 + +┌─Tags───────┬───────c─┐ +│ javascript │ 2527130 │ +│ python │ 2189638 │ +│ java │ 1916156 │ +│ c# │ 1614236 │ +│ php │ 1463901 │ +│ android │ 1416442 │ +│ html │ 1186567 │ +│ jquery │ 1034621 │ +│ c++ │ 806202 │ +│ css │ 803755 │ +└────────────┴─────────┘ + +10 rows in set. Elapsed: 1.013 sec. Processed 59.82 million rows, 1.21 GB (59.07 million rows/s., 1.19 GB/s.) +Peak memory usage: 224.03 MiB. +``` + +### 最も回答の多いユーザー(アクティブアカウント) + +アカウントには`UserId`が必要です。 + +```sql +SELECT + any(OwnerUserId) UserId, + OwnerDisplayName, + count() AS c +FROM stackoverflow.posts WHERE OwnerDisplayName != '' AND PostTypeId='Answer' AND OwnerUserId != 0 +GROUP BY OwnerDisplayName +ORDER BY c DESC +LIMIT 5 + +┌─UserId─┬─OwnerDisplayName─┬────c─┐ +│ 22656 │ Jon Skeet │ 2727 │ +│ 23354 │ Marc Gravell │ 2150 │ +│ 12950 │ tvanfosson │ 1530 │ +│ 3043 │ Joel Coehoorn │ 1438 │ +│ 10661 │ S.Lott │ 1087 │ +└────────┴──────────────────┴──────┘ + +5 rows in set. Elapsed: 0.154 sec. Processed 35.83 million rows, 193.39 MB (232.33 million rows/s., 1.25 GB/s.) +Peak memory usage: 206.45 MiB. +``` + +### ClickHouse関連の投稿で最も多くの閲覧数 + +```sql +SELECT + Id, + Title, + ViewCount, + AnswerCount +FROM stackoverflow.posts +WHERE Title ILIKE '%ClickHouse%' +ORDER BY ViewCount DESC +LIMIT 10 + +┌───────Id─┬─Title────────────────────────────────────────────────────────────────────────────┬─ViewCount─┬─AnswerCount─┐ +│ 52355143 │ Is it possible to delete old records from clickhouse table? │ 41462 │ 3 │ +│ 37954203 │ Clickhouse Data Import │ 38735 │ 3 │ +│ 37901642 │ Updating data in Clickhouse │ 36236 │ 6 │ +│ 58422110 │ Pandas: How to insert dataframe into Clickhouse │ 29731 │ 4 │ +│ 63621318 │ DBeaver - Clickhouse - SQL Error [159] .. Read timed out │ 27350 │ 1 │ +│ 47591813 │ How to filter clickhouse table by array column contents? │ 27078 │ 2 │ +│ 58728436 │ How to search the string in query with case insensitive on Clickhouse database? │ 26567 │ 3 │ +│ 65316905 │ Clickhouse: DB::Exception: Memory limit (for query) exceeded │ 24899 │ 2 │ +│ 49944865 │ How to add a column in clickhouse │ 24424 │ 1 │ +│ 59712399 │ How to cast date Strings to DateTime format with extended parsing in ClickHouse? │ 22620 │ 1 │ +└──────────┴──────────────────────────────────────────────────────────────────────────────────┴───────────┴─────────────┘ + +10 rows in set. Elapsed: 0.472 sec. Processed 59.82 million rows, 1.91 GB (126.63 million rows/s., 4.03 GB/s.) +Peak memory usage: 240.01 MiB. +``` + +### 最も議論を呼ぶ投稿 + +```sql +SELECT + Id, + Title, + UpVotes, + DownVotes, + abs(UpVotes - DownVotes) AS Controversial_ratio +FROM stackoverflow.posts +INNER JOIN +( + SELECT + PostId, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes + FROM stackoverflow.votes + GROUP BY PostId + HAVING (UpVotes > 10) AND (DownVotes > 10) +) AS votes ON posts.Id = votes.PostId +WHERE Title != '' +ORDER BY Controversial_ratio ASC +LIMIT 3 + +┌───────Id─┬─Title─────────────────────────────────────────────┬─UpVotes─┬─DownVotes─┬─Controversial_ratio─┐ +│ 583177 │ VB.NET Infinite For Loop │ 12 │ 12 │ 0 │ +│ 9756797 │ Read console input as enumerable - one statement? │ 16 │ 16 │ 0 │ +│ 13329132 │ What's the point of ARGV in Ruby? │ 22 │ 22 │ 0 │ +└──────────┴───────────────────────────────────────────────────┴─────────┴───────────┴─────────────────────┘ + +3 rows in set. Elapsed: 4.779 sec. Processed 298.80 million rows, 3.16 GB (62.52 million rows/s., 661.05 MB/s.) +Peak memory usage: 6.05 GiB. +``` + +## 帰属 + +このデータを提供してくれたStack Overflowに感謝します。このデータは`cc-by-sa 4.0`ライセンスの下で提供されており、[https://archive.org/details/stackexchange](https://archive.org/details/stackexchange)で元のデータソースに感謝します。 diff --git a/docs/ja/getting-started/example-datasets/star-schema.md b/docs/ja/getting-started/example-datasets/star-schema.md new file mode 100644 index 00000000000..e399d367a2f --- /dev/null +++ b/docs/ja/getting-started/example-datasets/star-schema.md @@ -0,0 +1,772 @@ +--- +slug: /ja/getting-started/example-datasets/star-schema +sidebar_label: スタースキーマベンチマーク +description: "スター スキーマ ベンチマーク (SSB) データ セットとクエリ" +--- + +# スター スキーマ ベンチマーク (SSB, 2009) + +スター スキーマ ベンチマークは、[TPC-H](tpch.md) のテーブルとクエリをだいたい基にしていますが、TPC-Hとは異なり、スター スキーマ レイアウトを使用しています。 +データの大部分は巨大なファクトテーブルにあり、複数の小さなディメンションテーブルに囲まれています。 +クエリでは、ファクトテーブルを1つ以上のディメンションテーブルと結合し、たとえば `MONTH = 'JANUARY'` のようなフィルター条件を適用します。 + +参考文献: +- [スター スキーマ ベンチマーク](https://cs.umb.edu/~poneil/StarSchemaB.pdf) (O'Neil et. al), 2009 +- [クエリ パフォーマンスにおけるデータ スキューの影響をテストするためのスター スキーマ ベンチマークのバリエーション](https://doi.org/10.1145/2479871.2479927) (Rabl. et. al.), 2013 + +まず、スター スキーマ ベンチマーク リポジトリをチェックアウトし、データ ジェネレーターをコンパイルします: + +``` bash +git clone https://github.com/vadimtk/ssb-dbgen.git +cd ssb-dbgen +make +``` + +次に、データを生成します。パラメーター `-s` はスケールファクターを指定します。たとえば `-s 100` では、6億行が生成されます。 + +``` bash +./dbgen -s 1000 -T c +./dbgen -s 1000 -T l +./dbgen -s 1000 -T p +./dbgen -s 1000 -T s +./dbgen -s 1000 -T d +``` + +次に、ClickHouseでテーブルを作成します: + +``` sql +CREATE TABLE customer +( + C_CUSTKEY UInt32, + C_NAME String, + C_ADDRESS String, + C_CITY LowCardinality(String), + C_NATION LowCardinality(String), + C_REGION LowCardinality(String), + C_PHONE String, + C_MKTSEGMENT LowCardinality(String) +) +ENGINE = MergeTree ORDER BY (C_CUSTKEY); + +CREATE TABLE lineorder +( + LO_ORDERKEY UInt32, + LO_LINENUMBER UInt8, + LO_CUSTKEY UInt32, + LO_PARTKEY UInt32, + LO_SUPPKEY UInt32, + LO_ORDERDATE Date, + LO_ORDERPRIORITY LowCardinality(String), + LO_SHIPPRIORITY UInt8, + LO_QUANTITY UInt8, + LO_EXTENDEDPRICE UInt32, + LO_ORDTOTALPRICE UInt32, + LO_DISCOUNT UInt8, + LO_REVENUE UInt32, + LO_SUPPLYCOST UInt32, + LO_TAX UInt8, + LO_COMMITDATE Date, + LO_SHIPMODE LowCardinality(String) +) +ENGINE = MergeTree PARTITION BY toYear(LO_ORDERDATE) ORDER BY (LO_ORDERDATE, LO_ORDERKEY); + +CREATE TABLE part +( + P_PARTKEY UInt32, + P_NAME String, + P_MFGR LowCardinality(String), + P_CATEGORY LowCardinality(String), + P_BRAND LowCardinality(String), + P_COLOR LowCardinality(String), + P_TYPE LowCardinality(String), + P_SIZE UInt8, + P_CONTAINER LowCardinality(String) +) +ENGINE = MergeTree ORDER BY P_PARTKEY; + +CREATE TABLE supplier +( + S_SUPPKEY UInt32, + S_NAME String, + S_ADDRESS String, + S_CITY LowCardinality(String), + S_NATION LowCardinality(String), + S_REGION LowCardinality(String), + S_PHONE String +) +ENGINE = MergeTree ORDER BY S_SUPPKEY; + +CREATE TABLE date +( + D_DATEKEY Date, + D_DATE FixedString(18), + D_DAYOFWEEK LowCardinality(String), + D_MONTH LowCardinality(String), + D_YEAR UInt16, + D_YEARMONTHNUM UInt32, + D_YEARMONTH LowCardinality(FixedString(7)), + D_DAYNUMINWEEK UInt8, + D_DAYNUMINMONTH UInt8, + D_DAYNUMINYEAR UInt16, + D_MONTHNUMINYEAR UInt8, + D_WEEKNUMINYEAR UInt8, + D_SELLINGSEASON String, + D_LASTDAYINWEEKFL UInt8, + D_LASTDAYINMONTHFL UInt8, + D_HOLIDAYFL UInt8, + D_WEEKDAYFL UInt8 +) +ENGINE = MergeTree ORDER BY D_DATEKEY; +``` + +データは以下のようにインポートされます: + +``` bash +clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl +clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl +clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl +clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl +clickhouse-client --query "INSERT INTO date FORMAT CSV" < date.tbl +``` + +ClickHouseの多くのユースケースでは、複数のテーブルが単一の非正規化されたフラットテーブルに変換されます。 +このステップはオプションですが、以下のクエリは元の形と非正規化されたテーブル用に書き直された形式で示されています。 + +``` sql +SET max_memory_usage = 20000000000; + +CREATE TABLE lineorder_flat +ENGINE = MergeTree ORDER BY (LO_ORDERDATE, LO_ORDERKEY) +AS SELECT + l.LO_ORDERKEY AS LO_ORDERKEY, + l.LO_LINENUMBER AS LO_LINENUMBER, + l.LO_CUSTKEY AS LO_CUSTKEY, + l.LO_PARTKEY AS LO_PARTKEY, + l.LO_SUPPKEY AS LO_SUPPKEY, + l.LO_ORDERDATE AS LO_ORDERDATE, + l.LO_ORDERPRIORITY AS LO_ORDERPRIORITY, + l.LO_SHIPPRIORITY AS LO_SHIPPRIORITY, + l.LO_QUANTITY AS LO_QUANTITY, + l.LO_EXTENDEDPRICE AS LO_EXTENDEDPRICE, + l.LO_ORDTOTALPRICE AS LO_ORDTOTALPRICE, + l.LO_DISCOUNT AS LO_DISCOUNT, + l.LO_REVENUE AS LO_REVENUE, + l.LO_SUPPLYCOST AS LO_SUPPLYCOST, + l.LO_TAX AS LO_TAX, + l.LO_COMMITDATE AS LO_COMMITDATE, + l.LO_SHIPMODE AS LO_SHIPMODE, + c.C_NAME AS C_NAME, + c.C_ADDRESS AS C_ADDRESS, + c.C_CITY AS C_CITY, + c.C_NATION AS C_NATION, + c.C_REGION AS C_REGION, + c.C_PHONE AS C_PHONE, + c.C_MKTSEGMENT AS C_MKTSEGMENT, + s.S_NAME AS S_NAME, + s.S_ADDRESS AS S_ADDRESS, + s.S_CITY AS S_CITY, + s.S_NATION AS S_NATION, + s.S_REGION AS S_REGION, + s.S_PHONE AS S_PHONE, + p.P_NAME AS P_NAME, + p.P_MFGR AS P_MFGR, + p.P_CATEGORY AS P_CATEGORY, + p.P_BRAND AS P_BRAND, + p.P_COLOR AS P_COLOR, + p.P_TYPE AS P_TYPE, + p.P_SIZE AS P_SIZE, + p.P_CONTAINER AS P_CONTAINER +FROM lineorder AS l +INNER JOIN customer AS c ON c.C_CUSTKEY = l.LO_CUSTKEY +INNER JOIN supplier AS s ON s.S_SUPPKEY = l.LO_SUPPKEY +INNER JOIN part AS p ON p.P_PARTKEY = l.LO_PARTKEY; +``` + +クエリは `./qgen -s ` によって生成されます。`s = 100` の場合のサンプルクエリ: + +Q1.1 + +```sql +SELECT + sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS REVENUE +FROM + lineorder, + date +WHERE + LO_ORDERDATE = D_DATEKEY + AND D_YEAR = 1993 + AND LO_DISCOUNT BETWEEN 1 AND 3 + AND LO_QUANTITY < 25; +``` + +非正規化されたテーブル: + +``` sql +SELECT + sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM + lineorder_flat +WHERE + toYear(LO_ORDERDATE) = 1993 + AND LO_DISCOUNT BETWEEN 1 AND 3 + AND LO_QUANTITY < 25; +``` + +Q1.2 + +```sql +SELECT + sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS REVENUE +FROM + lineorder, + date +WHERE + LO_ORDERDATE = D_DATEKEY + AND D_YEARMONTHNUM = 199401 + AND LO_DISCOUNT BETWEEN 4 AND 6 + AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +非正規化されたテーブル: + +```sql +SELECT + sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM + lineorder_flat +WHERE + toYYYYMM(LO_ORDERDATE) = 199401 + AND LO_DISCOUNT BETWEEN 4 AND 6 + AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +Q1.3 + +```sql +SELECT + sum(LO_EXTENDEDPRICE*LO_DISCOUNT) AS REVENUE +FROM + lineorder, + date +WHERE + LO_ORDERDATE = D_DATEKEY + AND D_WEEKNUMINYEAR = 6 + AND D_YEAR = 1994 + AND LO_DISCOUNT BETWEEN 5 AND 7 + AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +非正規化されたテーブル: + +```sql +SELECT + sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue +FROM + lineorder_flat +WHERE + toISOWeek(LO_ORDERDATE) = 6 + AND toYear(LO_ORDERDATE) = 1994 + AND LO_DISCOUNT BETWEEN 5 AND 7 + AND LO_QUANTITY BETWEEN 26 AND 35; +``` + +Q2.1 + +```sql +SELECT + sum(LO_REVENUE), + D_YEAR, + P_BRAND +FROM + lineorder, + date, + part, + supplier +WHERE + LO_ORDERDATE = D_DATEKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND P_CATEGORY = 'MFGR#12' + AND S_REGION = 'AMERICA' +GROUP BY + D_YEAR, + P_BRAND +ORDER BY + D_YEAR, + P_BRAND; +``` + +非正規化されたテーブル: + +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE + P_CATEGORY = 'MFGR#12' + AND S_REGION = 'AMERICA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q2.2 + +```sql +SELECT + sum(LO_REVENUE), + D_YEAR, + P_BRAND +FROM + lineorder, + date, + part, + supplier +WHERE + LO_ORDERDATE = D_DATEKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND P_BRAND BETWEEN + 'MFGR#2221' AND 'MFGR#2228' + AND S_REGION = 'ASIA' +GROUP BY + D_YEAR, + P_BRAND +ORDER BY + D_YEAR, + P_BRAND; +``` + +非正規化されたテーブル: + +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND >= 'MFGR#2221' AND P_BRAND <= 'MFGR#2228' AND S_REGION = 'ASIA' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q2.3 + +```sql +SELECT + sum(LO_REVENUE), + D_YEAR, + P_BRAND +FROM + lineorder, + date, + part, + supplier +WHERE + LO_ORDERDATE = D_DATEKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND P_BRAND = 'MFGR#2221' + AND S_REGION = 'EUROPE' +GROUP BY + D_YEAR, + P_BRAND +ORDER BY + D_YEAR, + P_BRAND; +``` + +非正規化されたテーブル: + +```sql +SELECT + sum(LO_REVENUE), + toYear(LO_ORDERDATE) AS year, + P_BRAND +FROM lineorder_flat +WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' +GROUP BY + year, + P_BRAND +ORDER BY + year, + P_BRAND; +``` + +Q3.1 + +```sql +SELECT + C_NATION, + S_NATION, + D_YEAR, + sum(LO_REVENUE) AS REVENUE +FROM + customer, + lineorder, + supplier, + date +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_ORDERDATE = D_DATEKEY + AND C_REGION = 'ASIA' AND S_REGION = 'ASIA' + AND D_YEAR >= 1992 AND D_YEAR <= 1997 +GROUP BY + C_NATION, + S_NATION, + D_YEAR +ORDER BY + D_YEAR ASC, + REVENUE DESC; +``` + +非正規化されたテーブル: + +```sql +SELECT + C_NATION, + S_NATION, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE + C_REGION = 'ASIA' + AND S_REGION = 'ASIA' + AND year >= 1992 + AND year <= 1997 +GROUP BY + C_NATION, + S_NATION, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.2 + +```sql +SELECT + C_CITY, + S_CITY, + D_YEAR, + sum(LO_REVENUE) AS REVENUE +FROM + customer, + lineorder, + supplier, + date +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_ORDERDATE = D_DATEKEY + AND C_NATION = 'UNITED STATES' + AND S_NATION = 'UNITED STATES' + AND D_YEAR >= 1992 AND D_YEAR <= 1997 +GROUP BY + C_CITY, + S_CITY, + D_YEAR +ORDER BY + D_YEAR ASC, + REVENUE DESC; +``` + +非正規化されたテーブル: + +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE + C_NATION = 'UNITED STATES' + AND S_NATION = 'UNITED STATES' + AND year >= 1992 + AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.3 + +```sql +SELECT + C_CITY, + S_CITY, + D_YEAR, + sum(LO_REVENUE) AS revenue +FROM + customer, + lineorder, + supplier, + date +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_ORDERDATE = D_DATEKEY + AND (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') + AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') + AND D_YEAR >= 1992 + AND D_YEAR <= 1997 +GROUP BY + C_CITY, + S_CITY, + D_YEAR +ORDER BY + D_YEAR ASC, + revenue DESC; +``` + +非正規化されたテーブル: + +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE + (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') + AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') + AND year >= 1992 + AND year <= 1997 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q3.4 + +```sql +SELECT + C_CITY, + S_CITY, + D_YEAR, + sum(LO_REVENUE) AS revenue +FROM + customer, + lineorder, + supplier, + date +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_ORDERDATE = D_DATEKEY + AND (C_CITY='UNITED KI1' OR C_CITY='UNITED KI5') + AND (S_CITY='UNITED KI1' OR S_CITY='UNITED KI5') + AND D_YEARMONTH = 'Dec1997' +GROUP BY + C_CITY, + S_CITY, + D_YEAR +ORDER BY + D_YEAR ASC, + revenue DESC; +``` + +非正規化されたテーブル: + +```sql +SELECT + C_CITY, + S_CITY, + toYear(LO_ORDERDATE) AS year, + sum(LO_REVENUE) AS revenue +FROM lineorder_flat +WHERE + (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') + AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') + AND toYYYYMM(LO_ORDERDATE) = 199712 +GROUP BY + C_CITY, + S_CITY, + year +ORDER BY + year ASC, + revenue DESC; +``` + +Q4.1 + +```sql +SELECT + D_YEAR, + C_NATION, + sum(LO_REVENUE - LO_SUPPLYCOST) AS PROFIT +FROM + date, + customer, + supplier, + part, + lineorder +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_ORDERDATE = D_DATEKEY + AND C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + D_YEAR, + C_NATION +ORDER BY + D_YEAR, + C_NATION +``` + +非正規化されたテーブル: + +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + C_NATION, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + C_NATION +ORDER BY + year ASC, + C_NATION ASC; +``` + +Q4.2 + +```sql +SELECT + D_YEAR, + S_NATION, + P_CATEGORY, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM + date, + customer, + supplier, + part, + lineorder +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_ORDERDATE = D_DATEKEY + AND C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND (D_YEAR = 1997 OR D_YEAR = 1998) + AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + D_YEAR, + S_NATION, + P_CATEGORY +ORDER BY + D_YEAR, + S_NATION, + P_CATEGORY +``` + +非正規化されたテーブル: + +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_NATION, + P_CATEGORY, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM lineorder_flat +WHERE + C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND (year = 1997 OR year = 1998) + AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') +GROUP BY + year, + S_NATION, + P_CATEGORY +ORDER BY + year ASC, + S_NATION ASC, + P_CATEGORY ASC; +``` + +Q4.3 + +```sql +SELECT + D_YEAR, + S_CITY, + P_BRAND, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM + date, + customer, + supplier, + part, + lineorder +WHERE + LO_CUSTKEY = C_CUSTKEY + AND LO_SUPPKEY = S_SUPPKEY + AND LO_PARTKEY = P_PARTKEY + AND LO_ORDERDATE = D_DATEKEY + AND C_REGION = 'AMERICA' + AND S_NATION = 'UNITED STATES' + AND (D_YEAR = 1997 OR D_YEAR = 1998) + AND P_CATEGORY = 'MFGR#14' +GROUP BY + D_YEAR, + S_CITY, + P_BRAND +ORDER BY + D_YEAR, + S_CITY, + P_BRAND +``` + +非正規化されたテーブル: + +```sql +SELECT + toYear(LO_ORDERDATE) AS year, + S_CITY, + P_BRAND, + sum(LO_REVENUE - LO_SUPPLYCOST) AS profit +FROM + lineorder_flat +WHERE + S_NATION = 'UNITED STATES' + AND (year = 1997 OR year = 1998) + AND P_CATEGORY = 'MFGR#14' +GROUP BY + year, + S_CITY, + P_BRAND +ORDER BY + year ASC, + S_CITY ASC, + P_BRAND ASC; +``` + + diff --git a/docs/ja/getting-started/example-datasets/tpcds.md b/docs/ja/getting-started/example-datasets/tpcds.md new file mode 100644 index 00000000000..f47b9f24df1 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/tpcds.md @@ -0,0 +1,596 @@ +--- +slug: /ja/getting-started/example-datasets/tpcds +sidebar_label: TPC-DS +description: "TPC-DSベンチマークデータセットとクエリ。" +--- + +# TPC-DS (2012) + +[Star Schema Benchmark (SSB)](star-schema.md) と同様に、TPC-DSは [TPC-H](tpch.md) に基づいていますが、逆のアプローチを取りました。すなわち、データを複雑なスノーフレークスキーマに保存することで必要な結合数を増やしました(24テーブル対して8テーブル)。 +データ分布は偏っており(例えば、正規分布やポアソン分布)です。 +99のレポートおよびアドホッククエリがランダムに置換されます。 + +参考文献 +- [The Making of TPC-DS](https://dl.acm.org/doi/10.5555/1182635.1164217) (Nambiar), 2006 + +まず、TPC-DSリポジトリをチェックアウトしデータジェネレータをコンパイルします。 + +``` bash +git clone https://github.com/gregrahn/tpcds-kit.git +cd tpcds-kit/tools +make +``` + +次に、データを生成します。パラメータ `-scale` はスケールファクターを指定します。 + +``` bash +./dsdgen -scale 1 +``` + +次に、クエリを生成します(同じスケールファクターを使用してください)。 + +```bash +./dsqgen -DIRECTORY ../query_templates/ -INPUT ../query_templates/templates.lst -SCALE 1 # generates 99 queries in out/query_0.sql +``` + +次にClickHouseでテーブルを作成します。 +元のテーブル定義を tools/tpcds.sql で使用するか、主キーインデックスとLowCardinality型のカラムタイプを適切に定義した「チューニング済み」テーブル定義を使用することができます。 + +```sql +CREATE TABLE call_center( + cc_call_center_sk Int64, + cc_call_center_id LowCardinality(String), + cc_rec_start_date Nullable(Date), + cc_rec_end_date Nullable(Date), + cc_closed_date_sk Nullable(UInt32), + cc_open_date_sk Nullable(UInt32), + cc_name LowCardinality(String), + cc_class LowCardinality(String), + cc_employees Int32, + cc_sq_ft Int32, + cc_hours LowCardinality(String), + cc_manager LowCardinality(String), + cc_mkt_id Int32, + cc_mkt_class LowCardinality(String), + cc_mkt_desc LowCardinality(String), + cc_market_manager LowCardinality(String), + cc_division Int32, + cc_division_name LowCardinality(String), + cc_company Int32, + cc_company_name LowCardinality(String), + cc_street_number LowCardinality(String), + cc_street_name LowCardinality(String), + cc_street_type LowCardinality(String), + cc_suite_number LowCardinality(String), + cc_city LowCardinality(String), + cc_county LowCardinality(String), + cc_state LowCardinality(String), + cc_zip LowCardinality(String), + cc_country LowCardinality(String), + cc_gmt_offset Decimal(7,2), + cc_tax_percentage Decimal(7,2), + PRIMARY KEY (cc_call_center_sk) +); + +CREATE TABLE catalog_page( + cp_catalog_page_sk Int64, + cp_catalog_page_id LowCardinality(String), + cp_start_date_sk Nullable(UInt32), + cp_end_date_sk Nullable(UInt32), + cp_department LowCardinality(Nullable(String)), + cp_catalog_number Nullable(Int32), + cp_catalog_page_number Nullable(Int32), + cp_description LowCardinality(Nullable(String)), + cp_type LowCardinality(Nullable(String)), + PRIMARY KEY (cp_catalog_page_sk) +); + +CREATE TABLE catalog_returns( + cr_returned_date_sk Int32, + cr_returned_time_sk Int64, + cr_item_sk Int64, + cr_refunded_customer_sk Nullable(Int64), + cr_refunded_cdemo_sk Nullable(Int64), + cr_refunded_hdemo_sk Nullable(Int64), + cr_refunded_addr_sk Nullable(Int64), + cr_returning_customer_sk Nullable(Int64), + cr_returning_cdemo_sk Nullable(Int64), + cr_returning_hdemo_sk Nullable(Int64), + cr_returning_addr_sk Nullable(Int64), + cr_call_center_sk Nullable(Int64), + cr_catalog_page_sk Nullable(Int64), + cr_ship_mode_sk Nullable(Int64), + cr_warehouse_sk Nullable(Int64), + cr_reason_sk Nullable(Int64), + cr_order_number Int64, + cr_return_quantity Nullable(Int32), + cr_return_amount Nullable(Decimal(7,2)), + cr_return_tax Nullable(Decimal(7,2)), + cr_return_amt_inc_tax Nullable(Decimal(7,2)), + cr_fee Nullable(Decimal(7,2)), + cr_return_ship_cost Nullable(Decimal(7,2)), + cr_refunded_cash Nullable(Decimal(7,2)), + cr_reversed_charge Nullable(Decimal(7,2)), + cr_store_credit Nullable(Decimal(7,2)), + cr_net_loss Nullable(Decimal(7,2)), + PRIMARY KEY (cr_item_sk, cr_order_number) +); + +CREATE TABLE catalog_sales ( + cs_sold_date_sk Nullable(UInt32), + cs_sold_time_sk Nullable(Int64), + cs_ship_date_sk Nullable(UInt32), + cs_bill_customer_sk Nullable(Int64), + cs_bill_cdemo_sk Nullable(Int64), + cs_bill_hdemo_sk Nullable(Int64), + cs_bill_addr_sk Nullable(Int64), + cs_ship_customer_sk Nullable(Int64), + cs_ship_cdemo_sk Nullable(Int64), + cs_ship_hdemo_sk Nullable(Int64), + cs_ship_addr_sk Nullable(Int64), + cs_call_center_sk Nullable(Int64), + cs_catalog_page_sk Nullable(Int64), + cs_ship_mode_sk Nullable(Int64), + cs_warehouse_sk Nullable(Int64), + cs_item_sk Int64, + cs_promo_sk Nullable(Int64), + cs_order_number Int64, + cs_quantity Nullable(Int32), + cs_wholesale_cost Nullable(Decimal(7,2)), + cs_list_price Nullable(Decimal(7,2)), + cs_sales_price Nullable(Decimal(7,2)), + cs_ext_discount_amt Nullable(Decimal(7,2)), + cs_ext_sales_price Nullable(Decimal(7,2)), + cs_ext_wholesale_cost Nullable(Decimal(7,2)), + cs_ext_list_price Nullable(Decimal(7,2)), + cs_ext_tax Nullable(Decimal(7,2)), + cs_coupon_amt Nullable(Decimal(7,2)), + cs_ext_ship_cost Nullable(Decimal(7,2)), + cs_net_paid Nullable(Decimal(7,2)), + cs_net_paid_inc_tax Nullable(Decimal(7,2)), + cs_net_paid_inc_ship Nullable(Decimal(7,2)), + cs_net_paid_inc_ship_tax Nullable(Decimal(7,2)), + cs_net_profit Decimal(7,2), + PRIMARY KEY (cs_item_sk, cs_order_number) +); + +CREATE TABLE customer_address ( + ca_address_sk Int64, + ca_address_id LowCardinality(String), + ca_street_number LowCardinality(Nullable(String)), + ca_street_name LowCardinality(Nullable(String)), + ca_street_type LowCardinality(Nullable(String)), + ca_suite_number LowCardinality(Nullable(String)), + ca_city LowCardinality(Nullable(String)), + ca_county LowCardinality(Nullable(String)), + ca_state LowCardinality(Nullable(String)), + ca_zip LowCardinality(Nullable(String)), + ca_country LowCardinality(Nullable(String)), + ca_gmt_offset Nullable(Decimal(7,2)), + ca_location_type LowCardinality(Nullable(String)), + PRIMARY KEY (ca_address_sk) +); + +CREATE TABLE customer_demographics ( + cd_demo_sk Int64, + cd_gender LowCardinality(String), + cd_marital_status LowCardinality(String), + cd_education_status LowCardinality(String), + cd_purchase_estimate Int32, + cd_credit_rating LowCardinality(String), + cd_dep_count Int32, + cd_dep_employed_count Int32, + cd_dep_college_count Int32, + PRIMARY KEY (cd_demo_sk) +); + +CREATE TABLE customer ( + c_customer_sk Int64, + c_customer_id LowCardinality(String), + c_current_cdemo_sk Nullable(Int64), + c_current_hdemo_sk Nullable(Int64), + c_current_addr_sk Nullable(Int64), + c_first_shipto_date_sk Nullable(UInt32), + c_first_sales_date_sk Nullable(UInt32), + c_salutation LowCardinality(Nullable(String)), + c_first_name LowCardinality(Nullable(String)), + c_last_name LowCardinality(Nullable(String)), + c_preferred_cust_flag LowCardinality(Nullable(String)), + c_birth_day Nullable(Int32), + c_birth_month Nullable(Int32), + c_birth_year Nullable(Int32), + c_birth_country LowCardinality(Nullable(String)), + c_login LowCardinality(Nullable(String)), + c_email_address LowCardinality(Nullable(String)), + c_last_review_date LowCardinality(Nullable(String)), + PRIMARY KEY (c_customer_sk) +); + +CREATE TABLE date_dim ( + d_date_sk UInt32, + d_date_id LowCardinality(String), + d_date Date, + d_month_seq UInt16, + d_week_seq UInt16, + d_quarter_seq UInt16, + d_year UInt16, + d_dow UInt16, + d_moy UInt16, + d_dom UInt16, + d_qoy UInt16, + d_fy_year UInt16, + d_fy_quarter_seq UInt16, + d_fy_week_seq UInt16, + d_day_name LowCardinality(String), + d_quarter_name LowCardinality(String), + d_holiday LowCardinality(String), + d_weekend LowCardinality(String), + d_following_holiday LowCardinality(String), + d_first_dom Int32, + d_last_dom Int32, + d_same_day_ly Int32, + d_same_day_lq Int32, + d_current_day LowCardinality(String), + d_current_week LowCardinality(String), + d_current_month LowCardinality(String), + d_current_quarter LowCardinality(String), + d_current_year LowCardinality(String), + PRIMARY KEY (d_date_sk) +); + +CREATE TABLE household_demographics ( + hd_demo_sk Int64, + hd_income_band_sk Int64, + hd_buy_potential LowCardinality(String), + hd_dep_count Int32, + hd_vehicle_count Int32, + PRIMARY KEY (hd_demo_sk) +); + +CREATE TABLE income_band( + ib_income_band_sk Int64, + ib_lower_bound Int32, + ib_upper_bound Int32, + PRIMARY KEY (ib_income_band_sk), +); + +CREATE TABLE inventory ( + inv_date_sk UInt32, + inv_item_sk Int64, + inv_warehouse_sk Int64, + inv_quantity_on_hand Nullable(Int32) + PRIMARY KEY (inv_date_sk, inv_item_sk, inv_warehouse_sk), +); + +CREATE TABLE item ( + i_item_sk Int64, + i_item_id LowCardinality(String), + i_rec_start_date LowCardinality(Nullable(String)), + i_rec_end_date LowCardinality(Nullable(String)), + i_item_desc LowCardinality(Nullable(String)), + i_current_price Nullable(Decimal(7,2)), + i_wholesale_cost Nullable(Decimal(7,2)), + i_brand_id Nullable(Int32), + i_brand LowCardinality(Nullable(String)), + i_class_id Nullable(Int32), + i_class LowCardinality(Nullable(String)), + i_category_id Nullable(Int32), + i_category LowCardinality(Nullable(String)), + i_manufact_id Nullable(Int32), + i_manufact LowCardinality(Nullable(String)), + i_size LowCardinality(Nullable(String)), + i_formulation LowCardinality(Nullable(String)), + i_color LowCardinality(Nullable(String)), + i_units LowCardinality(Nullable(String)), + i_container LowCardinality(Nullable(String)), + i_manager_id Nullable(Int32), + i_product_name LowCardinality(Nullable(String)), + PRIMARY KEY (i_item_sk) +); + +CREATE TABLE promotion ( + p_promo_sk Int64, + p_promo_id LowCardinality(String), + p_start_date_sk Nullable(UInt32), + p_end_date_sk Nullable(UInt32), + p_item_sk Nullable(Int64), + p_cost Nullable(Decimal(15,2)), + p_response_target Nullable(Int32), + p_promo_name LowCardinality(Nullable(String)), + p_channel_dmail LowCardinality(Nullable(String)), + p_channel_email LowCardinality(Nullable(String)), + p_channel_catalog LowCardinality(Nullable(String)), + p_channel_tv LowCardinality(Nullable(String)), + p_channel_radio LowCardinality(Nullable(String)), + p_channel_press LowCardinality(Nullable(String)), + p_channel_event LowCardinality(Nullable(String)), + p_channel_demo LowCardinality(Nullable(String)), + p_channel_details LowCardinality(Nullable(String)), + p_purpose LowCardinality(Nullable(String)), + p_discount_active LowCardinality(Nullable(String)), + PRIMARY KEY (p_promo_sk) +); + +CREATE TABLE reason( + r_reason_sk Int64, + r_reason_id LowCardinality(String), + r_reason_desc LowCardinality(String), + PRIMARY KEY (r_reason_sk) +); + +CREATE TABLE ship_mode( + sm_ship_mode_sk Int64, + sm_ship_mode_id LowCardinality(String), + sm_type LowCardinality(String), + sm_code LowCardinality(String), + sm_carrier LowCardinality(String), + sm_contract LowCardinality(String), + PRIMARY KEY (sm_ship_mode_sk) +); + +CREATE TABLE store_returns ( + sr_returned_date_sk Nullable(UInt32), + sr_return_time_sk Nullable(Int64), + sr_item_sk Int64, + sr_customer_sk Nullable(Int64), + sr_cdemo_sk Nullable(Int64), + sr_hdemo_sk Nullable(Int64), + sr_addr_sk Nullable(Int64), + sr_store_sk Nullable(Int64), + sr_reason_sk Nullable(Int64), + sr_ticket_number Int64, + sr_return_quantity Nullable(Int32), + sr_return_amt Nullable(Decimal(7,2)), + sr_return_tax Nullable(Decimal(7,2)), + sr_return_amt_inc_tax Nullable(Decimal(7,2)), + sr_fee Nullable(Decimal(7,2)), + sr_return_ship_cost Nullable(Decimal(7,2)), + sr_refunded_cash Nullable(Decimal(7,2)), + sr_reversed_charge Nullable(Decimal(7,2)), + sr_store_credit Nullable(Decimal(7,2)), + sr_net_loss Nullable(Decimal(7,2)), + PRIMARY KEY (sr_item_sk, sr_ticket_number) +); + +CREATE TABLE store_sales ( + ss_sold_date_sk Nullable(UInt32), + ss_sold_time_sk Nullable(Int64), + ss_item_sk Int64, + ss_customer_sk Nullable(Int64), + ss_cdemo_sk Nullable(Int64), + ss_hdemo_sk Nullable(Int64), + ss_addr_sk Nullable(Int64), + ss_store_sk Nullable(Int64), + ss_promo_sk Nullable(Int64), + ss_ticket_number Int64, + ss_quantity Nullable(Int32), + ss_wholesale_cost Nullable(Decimal(7,2)), + ss_list_price Nullable(Decimal(7,2)), + ss_sales_price Nullable(Decimal(7,2)), + ss_ext_discount_amt Nullable(Decimal(7,2)), + ss_ext_sales_price Nullable(Decimal(7,2)), + ss_ext_wholesale_cost Nullable(Decimal(7,2)), + ss_ext_list_price Nullable(Decimal(7,2)), + ss_ext_tax Nullable(Decimal(7,2)), + ss_coupon_amt Nullable(Decimal(7,2)), + ss_net_paid Nullable(Decimal(7,2)), + ss_net_paid_inc_tax Nullable(Decimal(7,2)), + ss_net_profit Nullable(Decimal(7,2)), + PRIMARY KEY (ss_item_sk, ss_ticket_number) +); + +CREATE TABLE store ( + s_store_sk Int64, + s_store_id LowCardinality(String), + s_rec_start_date LowCardinality(Nullable(String)), + s_rec_end_date LowCardinality(Nullable(String)), + s_closed_date_sk Nullable(UInt32), + s_store_name LowCardinality(Nullable(String)), + s_number_employees Nullable(Int32), + s_floor_space Nullable(Int32), + s_hours LowCardinality(Nullable(String)), + s_manager LowCardinality(Nullable(String)), + s_market_id Nullable(Int32), + s_geography_class LowCardinality(Nullable(String)), + s_market_desc LowCardinality(Nullable(String)), + s_market_manager LowCardinality(Nullable(String)), + s_division_id Nullable(Int32), + s_division_name LowCardinality(Nullable(String)), + s_company_id Nullable(Int32), + s_company_name LowCardinality(Nullable(String)), + s_street_number LowCardinality(Nullable(String)), + s_street_name LowCardinality(Nullable(String)), + s_street_type LowCardinality(Nullable(String)), + s_suite_number LowCardinality(Nullable(String)), + s_city LowCardinality(Nullable(String)), + s_county LowCardinality(Nullable(String)), + s_state LowCardinality(Nullable(String)), + s_zip LowCardinality(Nullable(String)), + s_country LowCardinality(Nullable(String)), + s_gmt_offset Nullable(Decimal(7,2)), + s_tax_precentage Nullable(Decimal(7,2)), + PRIMARY KEY (s_store_sk) +); + +CREATE TABLE time_dim ( + t_time_sk UInt32, + t_time_id LowCardinality(String), + t_time UInt32, + t_hour UInt8, + t_minute UInt8, + t_second UInt8, + t_am_pm LowCardinality(String), + t_shift LowCardinality(String), + t_sub_shift LowCardinality(String), + t_meal_time LowCardinality(Nullable(String)), + PRIMARY KEY (t_time_sk) +); + +CREATE TABLE warehouse( + w_warehouse_sk Int64, + w_warehouse_id LowCardinality(String), + w_warehouse_name LowCardinality(Nullable(String)), + w_warehouse_sq_ft Nullable(Int32), + w_street_number LowCardinality(Nullable(String)), + w_street_name LowCardinality(Nullable(String)), + w_street_type LowCardinality(Nullable(String)), + w_suite_number LowCardinality(Nullable(String)), + w_city LowCardinality(Nullable(String)), + w_county LowCardinality(Nullable(String)), + w_state LowCardinality(Nullable(String)), + w_zip LowCardinality(Nullable(String)), + w_country LowCardinality(Nullable(String)), + w_gmt_offset Decimal(7,2), + PRIMARY KEY (w_warehouse_sk) +); + +CREATE TABLE web_page( + wp_web_page_sk Int64, + wp_web_page_id LowCardinality(String), + wp_rec_start_date LowCardinality(Nullable(String)), + wp_rec_end_date LowCardinality(Nullable(String)), + wp_creation_date_sk Nullable(UInt32), + wp_access_date_sk Nullable(UInt32), + wp_autogen_flag LowCardinality(Nullable(String)), + wp_customer_sk Nullable(Int64), + wp_url LowCardinality(Nullable(String)), + wp_type LowCardinality(Nullable(String)), + wp_char_count Nullable(Int32), + wp_link_count Nullable(Int32), + wp_image_count Nullable(Int32), + wp_max_ad_count Nullable(Int32), + PRIMARY KEY (wp_web_page_sk) +); + +CREATE TABLE web_returns ( + wr_returned_date_sk Nullable(UInt32), + wr_returned_time_sk Nullable(Int64), + wr_item_sk Int64, + wr_refunded_customer_sk Nullable(Int64), + wr_refunded_cdemo_sk Nullable(Int64), + wr_refunded_hdemo_sk Nullable(Int64), + wr_refunded_addr_sk Nullable(Int64), + wr_returning_customer_sk Nullable(Int64), + wr_returning_cdemo_sk Nullable(Int64), + wr_returning_hdemo_sk Nullable(Int64), + wr_returning_addr_sk Nullable(Int64), + wr_web_page_sk Nullable(Int64), + wr_reason_sk Nullable(Int64), + wr_order_number Int64, + wr_return_quantity Nullable(Int32), + wr_return_amt Nullable(Decimal(7,2)), + wr_return_tax Nullable(Decimal(7,2)), + wr_return_amt_inc_tax Nullable(Decimal(7,2)), + wr_fee Nullable(Decimal(7,2)), + wr_return_ship_cost Nullable(Decimal(7,2)), + wr_refunded_cash Nullable(Decimal(7,2)), + wr_reversed_charge Nullable(Decimal(7,2)), + wr_account_credit Nullable(Decimal(7,2)), + wr_net_loss Nullable(Decimal(7,2)), + PRIMARY KEY (wr_item_sk, wr_order_number) +); + +CREATE TABLE web_sales ( + ws_sold_date_sk Nullable(UInt32), + ws_sold_time_sk Nullable(Int64), + ws_ship_date_sk Nullable(UInt32), + ws_item_sk Int64, + ws_bill_customer_sk Nullable(Int64), + ws_bill_cdemo_sk Nullable(Int64), + ws_bill_hdemo_sk Nullable(Int64), + ws_bill_addr_sk Nullable(Int64), + ws_ship_customer_sk Nullable(Int64), + ws_ship_cdemo_sk Nullable(Int64), + ws_ship_hdemo_sk Nullable(Int64), + ws_ship_addr_sk Nullable(Int64), + ws_web_page_sk Nullable(Int64), + ws_web_site_sk Nullable(Int64), + ws_ship_mode_sk Nullable(Int64), + ws_warehouse_sk Nullable(Int64), + ws_promo_sk Nullable(Int64), + ws_order_number Int64, + ws_quantity Nullable(Int32), + ws_wholesale_cost Nullable(Decimal(7,2)), + ws_list_price Nullable(Decimal(7,2)), + ws_sales_price Nullable(Decimal(7,2)), + ws_ext_discount_amt Nullable(Decimal(7,2)), + ws_ext_sales_price Nullable(Decimal(7,2)), + ws_ext_wholesale_cost Nullable(Decimal(7,2)), + ws_ext_list_price Nullable(Decimal(7,2)), + ws_ext_tax Nullable(Decimal(7,2)), + ws_coupon_amt Nullable(Decimal(7,2)), + ws_ext_ship_cost Nullable(Decimal(7,2)), + ws_net_paid Nullable(Decimal(7,2)), + ws_net_paid_inc_tax Nullable(Decimal(7,2)), + ws_net_paid_inc_ship Decimal(7,2), + ws_net_paid_inc_ship_tax Decimal(7,2), + ws_net_profit Decimal(7,2), + PRIMARY KEY (ws_item_sk, ws_order_number) +); + +CREATE TABLE web_site ( + web_site_sk Int64, + web_site_id LowCardinality(String), + web_rec_start_date LowCardinality(String), + web_rec_end_date LowCardinality(Nullable(String)), + web_name LowCardinality(String), + web_open_date_sk UInt32, + web_close_date_sk Nullable(UInt32), + web_class LowCardinality(String), + web_manager LowCardinality(String), + web_mkt_id Int32, + web_mkt_class LowCardinality(String), + web_mkt_desc LowCardinality(String), + web_market_manager LowCardinality(String), + web_company_id Int32, + web_company_name LowCardinality(String), + web_street_number LowCardinality(String), + web_street_name LowCardinality(String), + web_street_type LowCardinality(String), + web_suite_number LowCardinality(String), + web_city LowCardinality(String), + web_county LowCardinality(String), + web_state LowCardinality(String), + web_zip LowCardinality(String), + web_country LowCardinality(String), + web_gmt_offset Decimal(7,2), + web_tax_percentage Decimal(7,2), + PRIMARY KEY (web_site_sk) +); +``` + +データのインポートは以下のように行われます。 + +``` bash +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO call_center FORMAT CSV" < call_center.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO catalog_page FORMAT CSV" < catalog_page.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO catalog_returns FORMAT CSV" < catalog_returns.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO catalog_sales FORMAT CSV" < catalog_sales.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO customer FORMAT CSV" < customer.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO customer_address FORMAT CSV" < customer_address.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO customer_demographics FORMAT CSV" < customer_demographics.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO date_dim FORMAT CSV" < date_dim.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO household_demographics FORMAT CSV" < household_demographics.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO income_band FORMAT CSV" < income_band.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO inventory FORMAT CSV" < inventory.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO item FORMAT CSV" < item.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO promotion FORMAT CSV" < promotion.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO reason FORMAT CSV" < reason.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO ship_mode FORMAT CSV" < ship_mode.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO store FORMAT CSV" < store.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO store_returns FORMAT CSV" < store_returns.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO store_sales FORMAT CSV" < store_sales.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO time_dim FORMAT CSV" < time_dim.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO warehouse FORMAT CSV" < warehouse.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO web_page FORMAT CSV" < web_page.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO web_returns FORMAT CSV" < web_returns.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO web_sales FORMAT CSV" < web_sales.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO web_site FORMAT CSV" < web_site.tbl +``` + +その後、生成されたクエリを実行します。 + +::::warning +TPC-DSは関連サブクエリを多用していますが、これは執筆時点(2024年9月)ではClickHouseでサポートされておりません([issue #6697](https://github.com/ClickHouse/ClickHouse/issues/6697))。 +その結果、多くのベンチマーククエリがエラーで失敗します。 +:::: diff --git a/docs/ja/getting-started/example-datasets/tpch.md b/docs/ja/getting-started/example-datasets/tpch.md new file mode 100644 index 00000000000..67523dadab7 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/tpch.md @@ -0,0 +1,1126 @@ +--- +slug: /ja/getting-started/example-datasets/tpch +sidebar_label: TPC-H +description: "TPC-H ベンチマークデータセットとクエリ。" +--- + +# TPC-H (1999) + +卸売業者の内部データウェアハウスをモデル化した人気のベンチマークです。 +データは第3正規形で保存されており、クエリ実行時に多くの結合を必要とします。 +その古さや、データが均一かつ独立して分布しているという非現実的な仮定にもかかわらず、TPC-H は現在も最も人気のある OLAP ベンチマークです。 + +**参考文献** + +- [TPC-H](https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp) +- [New TPC Benchmarks for Decision Support and Web Commerce](https://doi.org/10.1145/369275.369291) (Poess et. al., 2000) +- [TPC-H Analyzed: Hidden Messages and Lessons Learned from an Influential Benchmark](https://doi.org/10.1007/978-3-319-04936-6_5) (Boncz et. al.), 2013 +- [Quantifying TPC-H Choke Points and Their Optimizations](https://doi.org/10.14778/3389133.3389138) (Dresseler et. al.), 2020 + +## データ生成とインポート + +まず、TPC-H リポジトリをチェックアウトし、データジェネレータをコンパイルします。 + +```bash +git clone https://github.com/gregrahn/tpch-kit.git +cd tpch-kit/dbgen +make +``` + +次に、データを生成します。パラメータ `-s` はスケールファクタを指定します。例えば、`-s 100` を指定すると、テーブル 'lineitem' に対して 6 億行が生成されます。 + +```bash +./dbgen -s 100 +``` + +次に、ClickHouse にテーブルを作成します。 + +TPC-H 仕様のルールにできるだけ忠実に従います: +- 主キーは、仕様のセクション 1.4.2.2 で言及されているカラムのみに作成されます。 +- 代用パラメータは、仕様のセクション 2.1.x.4 におけるクエリ検証用の値に置き換えられました。 +- セクション 1.4.2.1 に従い、`dbgen` がデフォルトで生成する場合であっても、表定義ではオプションの `NOT NULL` 制約を使用しません。 + ClickHouse における `SELECT` クエリのパフォーマンスは、`NOT NULL` 制約の有無に影響されません。 +- セクション 1.3.1 に従い、仕様に記載されている抽象データ型(例:`Identifier`、`Variable text, size N`)を実装するために、ClickHouse のネイティブデータ型(例:`Int32`、`String`)を使用します。これにより、読みやすさが向上しますが、`dbgen` が生成する SQL-92 データ型(例:`INTEGER`、`VARCHAR(40)`)も ClickHouse で機能します。 + +```sql +CREATE TABLE nation ( + n_nationkey Int32, + n_name String, + n_regionkey Int32, + n_comment String) +ORDER BY (n_nationkey); + +CREATE TABLE region ( + r_regionkey Int32, + r_name String, + r_comment String) +ORDER BY (r_regionkey); + +CREATE TABLE part ( + p_partkey Int32, + p_name String, + p_mfgr String, + p_brand String, + p_type String, + p_size Int32, + p_container String, + p_retailprice Decimal(15,2), + p_comment String) +ORDER BY (p_partkey); + +CREATE TABLE supplier ( + s_suppkey Int32, + s_name String, + s_address String, + s_nationkey Int32, + s_phone String, + s_acctbal Decimal(15,2), + s_comment String) +ORDER BY (s_suppkey); + +CREATE TABLE partsupp ( + ps_partkey Int32, + ps_suppkey Int32, + ps_availqty Int32, + ps_supplycost Decimal(15,2), + ps_comment String) +ORDER BY (ps_partkey, ps_suppkey); + +CREATE TABLE customer ( + c_custkey Int32, + c_name String, + c_address String, + c_nationkey Int32, + c_phone String, + c_acctbal Decimal(15,2), + c_mktsegment String, + c_comment String) +ORDER BY (c_custkey); + +CREATE TABLE orders ( + o_orderkey Int32, + o_custkey Int32, + o_orderstatus String, + o_totalprice Decimal(15,2), + o_orderdate Date, + o_orderpriority String, + o_clerk String, + o_shippriority Int32, + o_comment String) +ORDER BY (o_orderkey); +-- 以下の代替順序キーは、公式の TPC-H 規則には準拠していませんが、「Quantifying TPC-H Choke Points and Their Optimizations」の sec. 4.5 に推奨されています: +-- ORDER BY (o_orderdate, o_orderkey); + +CREATE TABLE lineitem ( + l_orderkey Int32, + l_partkey Int32, + l_suppkey Int32, + l_linenumber Int32, + l_quantity Decimal(15,2), + l_extendedprice Decimal(15,2), + l_discount Decimal(15,2), + l_tax Decimal(15,2), + l_returnflag String, + l_linestatus String, + l_shipdate Date, + l_commitdate Date, + l_receiptdate Date, + l_shipinstruct String, + l_shipmode String, + l_comment String) +ORDER BY (l_orderkey, l_linenumber); +-- 以下の代替順序キーは、公式の TPC-H 規則には準拠していませんが、「Quantifying TPC-H Choke Points and Their Optimizations」の sec. 4.5 に推奨されています: +-- ORDER BY (l_shipdate, l_orderkey, l_linenumber); +``` + +データは次のようにインポートできます。 + +```bash +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO nation FORMAT CSV" < nation.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO region FORMAT CSV" < region.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO part FORMAT CSV" < part.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO partsupp FORMAT CSV" < partsupp.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO customer FORMAT CSV" < customer.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO orders FORMAT CSV" < orders.tbl +clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO lineitem FORMAT CSV" < lineitem.tbl +``` + +クエリは `./qgen -s ` で生成されます。`s = 100` の場合のクエリ例: + +## クエリ + +**正確性** + +クエリの結果は特に記載がない限り、公式の結果と一致します。検証するには、スケールファクタ = 1 の TPC-H データベースを生成し(上記の `dbgen` 参照)、[tpch-kit の期待される結果](https://github.com/gregrahn/tpch-kit/tree/master/dbgen/answers) と比較してください。 + +**Q1** + +```sql +SELECT + l_returnflag, + l_linestatus, + sum(l_quantity) AS sum_qty, + sum(l_extendedprice) AS sum_base_price, + sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + avg(l_quantity) AS avg_qty, + avg(l_extendedprice) AS avg_price, + avg(l_discount) AS avg_disc, + count(*) AS count_order +FROM + lineitem +WHERE + l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY +GROUP BY + l_returnflag, + l_linestatus +ORDER BY + l_returnflag, + l_linestatus; +``` + +**Q2** + +```sql +SELECT + s_acctbal, + s_name, + n_name, + p_partkey, + p_mfgr, + s_address, + s_phone, + s_comment +FROM + part, + supplier, + partsupp, + nation, + region +WHERE + p_partkey = ps_partkey + AND s_suppkey = ps_suppkey + AND p_size = 15 + AND p_type LIKE '%BRASS' + AND s_nationkey = n_nationkey + AND n_regionkey = r_regionkey + AND r_name = 'EUROPE' + AND ps_supplycost = ( + SELECT + min(ps_supplycost) + FROM + partsupp, + supplier, + nation, + region + WHERE + p_partkey = ps_partkey + AND s_suppkey = ps_suppkey + AND s_nationkey = n_nationkey + AND n_regionkey = r_regionkey + AND r_name = 'EUROPE' + ) +ORDER BY + s_acctbal DESC, + n_name, + s_name, + p_partkey; +``` + +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +WITH MinSupplyCost AS ( + SELECT + ps_partkey, + MIN(ps_supplycost) AS min_supplycost + FROM + partsupp ps + JOIN + supplier s ON ps.ps_suppkey = s.s_suppkey + JOIN + nation n ON s.s_nationkey = n.n_nationkey + JOIN + region r ON n.n_regionkey = r.r_regionkey + WHERE + r.r_name = 'EUROPE' + GROUP BY + ps_partkey +) +SELECT + s.s_acctbal, + s.s_name, + n.n_name, + p.p_partkey, + p.p_mfgr, + s.s_address, + s.s_phone, + s.s_comment +FROM + part p +JOIN + partsupp ps ON p.p_partkey = ps.ps_partkey +JOIN + supplier s ON s.s_suppkey = ps.ps_suppkey +JOIN + nation n ON s.s_nationkey = n.n_nationkey +JOIN + region r ON n.n_regionkey = r.r_regionkey +JOIN + MinSupplyCost msc ON ps.ps_partkey = msc.ps_partkey AND ps.ps_supplycost = msc.min_supplycost +WHERE + p.p_size = 15 + AND p.p_type LIKE '%BRASS' + AND r.r_name = 'EUROPE' +ORDER BY + s.s_acctbal DESC, + n.n_name, + s.s_name, + p.p_partkey; +``` +:::: + +**Q3** + +```sql +SELECT + l_orderkey, + sum(l_extendedprice * (1 - l_discount)) AS revenue, + o_orderdate, + o_shippriority +FROM + customer, + orders, + lineitem +WHERE + c_mktsegment = 'BUILDING' + AND c_custkey = o_custkey + AND l_orderkey = o_orderkey + AND o_orderdate < DATE '1995-03-15' + AND l_shipdate > DATE '1995-03-15' +GROUP BY + l_orderkey, + o_orderdate, + o_shippriority +ORDER BY + revenue DESC, + o_orderdate; +``` + +**Q4** + +```sql +SELECT + o_orderpriority, + count(*) AS order_count +FROM + orders +WHERE + o_orderdate >= DATE '1993-07-01' + AND o_orderdate < DATE '1993-07-01' + INTERVAL '3' MONTH + AND EXISTS ( + SELECT + * + FROM + lineitem + WHERE + l_orderkey = o_orderkey + AND l_commitdate < l_receiptdate + ) +GROUP BY + o_orderpriority +ORDER BY + o_orderpriority; +``` + +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +WITH ValidLineItems AS ( + SELECT + l_orderkey + FROM + lineitem + WHERE + l_commitdate < l_receiptdate + GROUP BY + l_orderkey +) +SELECT + o.o_orderpriority, + COUNT(*) AS order_count +FROM + orders o +JOIN + ValidLineItems vli ON o.o_orderkey = vli.l_orderkey +WHERE + o.o_orderdate >= DATE '1993-07-01' + AND o.o_orderdate < DATE '1993-07-01' + INTERVAL '3' MONTH +GROUP BY + o.o_orderpriority +ORDER BY + o.o_orderpriority; +``` +:::: + +**Q5** + +```sql +SELECT + n_name, + sum(l_extendedprice * (1 - l_discount)) AS revenue +FROM + customer, + orders, + lineitem, + supplier, + nation, + region +WHERE + c_custkey = o_custkey + AND l_orderkey = o_orderkey + AND l_suppkey = s_suppkey + AND c_nationkey = s_nationkey + AND s_nationkey = n_nationkey + AND n_regionkey = r_regionkey + AND r_name = 'ASIA' + AND o_orderdate >= DATE '1994-01-01' + AND o_orderdate < DATE '1994-01-01' + INTERVAL '1' year +GROUP BY + n_name +ORDER BY + revenue DESC; +``` + +**Q6** + +```sql +SELECT + sum(l_extendedprice * l_discount) AS revenue +FROM + lineitem +WHERE + l_shipdate >= DATE '1994-01-01' + AND l_shipdate < DATE '1994-01-01' + INTERVAL '1' year + AND l_discount BETWEEN 0.06 - 0.01 AND 0.06 + 0.01 + AND l_quantity < 24; +``` + +::::note +2024年10月時点では、小数の加算に関するバグのため、クエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/70136 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +SELECT + sum(l_extendedprice * l_discount) AS revenue +FROM + lineitem +WHERE + l_shipdate >= DATE '1994-01-01' + AND l_shipdate < DATE '1994-01-01' + INTERVAL '1' year + AND l_discount BETWEEN 0.05 AND 0.07 + AND l_quantity < 24; +``` +:::: + +**Q7** + +```sql +SELECT + supp_nation, + cust_nation, + l_year, + sum(volume) AS revenue +FROM ( + SELECT + n1.n_name AS supp_nation, + n2.n_name AS cust_nation, + extract(year FROM l_shipdate) AS l_year, + l_extendedprice * (1 - l_discount) AS volume + FROM + supplier, + lineitem, + orders, + customer, + nation n1, + nation n2 + WHERE + s_suppkey = l_suppkey + AND o_orderkey = l_orderkey + AND c_custkey = o_custkey + AND s_nationkey = n1.n_nationkey + AND c_nationkey = n2.n_nationkey + AND ( + (n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY') + OR (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE') + ) + AND l_shipdate BETWEEN DATE '1995-01-01' AND DATE '1996-12-31' + ) AS shipping +GROUP BY + supp_nation, + cust_nation, + l_year +ORDER BY + supp_nation, + cust_nation, + l_year; +``` + +**Q8** + +```sql +SELECT + o_year, + sum(CASE + WHEN nation = 'BRAZIL' + THEN volume + ELSE 0 + END) / sum(volume) AS mkt_share +FROM ( + SELECT + extract(year FROM o_orderdate) AS o_year, + l_extendedprice * (1 - l_discount) AS volume, + n2.n_name AS nation + FROM + part, + supplier, + lineitem, + orders, + customer, + nation n1, + nation n2, + region + WHERE + p_partkey = l_partkey + AND s_suppkey = l_suppkey + AND l_orderkey = o_orderkey + AND o_custkey = c_custkey + AND c_nationkey = n1.n_nationkey + AND n1.n_regionkey = r_regionkey + AND r_name = 'AMERICA' + AND s_nationkey = n2.n_nationkey + AND o_orderdate BETWEEN DATE '1995-01-01' AND DATE '1996-12-31' + AND p_type = 'ECONOMY ANODIZED STEEL' + ) AS all_nations +GROUP BY + o_year +ORDER BY + o_year; +``` + +**Q9** + +```sql +SELECT + nation, + o_year, + sum(amount) AS sum_profit +FROM ( + SELECT + n_name AS nation, + extract(year FROM o_orderdate) AS o_year, + l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount + FROM + part, + supplier, + lineitem, + partsupp, + orders, + nation + WHERE + s_suppkey = l_suppkey + AND ps_suppkey = l_suppkey + AND ps_partkey = l_partkey + AND p_partkey = l_partkey + AND o_orderkey = l_orderkey + AND s_nationkey = n_nationkey + AND p_name LIKE '%green%' + ) AS profit +GROUP BY + nation, + o_year +ORDER BY + nation, + o_year DESC; +``` + +**Q10** + +```sql +SELECT + c_custkey, + c_name, + sum(l_extendedprice * (1 - l_discount)) AS revenue, + c_acctbal, + n_name, + c_address, + c_phone, + c_comment +FROM + customer, + orders, + lineitem, + nation +WHERE + c_custkey = o_custkey + AND l_orderkey = o_orderkey + AND o_orderdate >= DATE '1993-10-01' + AND o_orderdate < DATE '1993-10-01' + INTERVAL '3' MONTH + AND l_returnflag = 'R' + AND c_nationkey = n_nationkey +GROUP BY + c_custkey, + c_name, + c_acctbal, + c_phone, + n_name, + c_address, + c_comment +ORDER BY + revenue DESC; +``` + +**Q11** + +```sql +SELECT + ps_partkey, + sum(ps_supplycost * ps_availqty) AS value +FROM + partsupp, + supplier, + nation +WHERE + ps_suppkey = s_suppkey + AND s_nationkey = n_nationkey + AND n_name = 'GERMANY' +GROUP BY + ps_partkey HAVING + sum(ps_supplycost * ps_availqty) > ( + SELECT + sum(ps_supplycost * ps_availqty) * 0.0001 + FROM + partsupp, + supplier, + nation + WHERE + ps_suppkey = s_suppkey + AND s_nationkey = n_nationkey + AND n_name = 'GERMANY' + ) +ORDER BY + value DESC; +``` + +**Q12** + +```sql +SELECT + l_shipmode, + sum(CASE + WHEN o_orderpriority = '1-URGENT' + OR o_orderpriority = '2-HIGH' + THEN 1 + ELSE 0 + END) AS high_line_count, + sum(CASE + WHEN o_orderpriority <> '1-URGENT' + AND o_orderpriority <> '2-HIGH' + THEN 1 + ELSE 0 + END) AS low_line_count +FROM + orders, + lineitem +WHERE + o_orderkey = l_orderkey + AND l_shipmode in ('MAIL', 'SHIP') + AND l_commitdate < l_receiptdate + AND l_shipdate < l_commitdate + AND l_receiptdate >= DATE '1994-01-01' + AND l_receiptdate < DATE '1994-01-01' + INTERVAL '1' year +GROUP BY + l_shipmode +ORDER BY + l_shipmode; +``` + +**Q13** + +```sql +SELECT + c_count, + count(*) AS custdist +FROM ( + SELECT + c_custkey, + count(o_orderkey) + FROM + customer LEFT OUTER JOIN orders ON + c_custkey = o_custkey + AND o_comment NOT LIKE '%special%requests%' + GROUP BY + c_custkey + ) AS c_orders +GROUP BY + c_count +ORDER BY + custdist DESC, + c_count DESC; +``` + +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +WITH CustomerOrderCounts AS ( + SELECT + c.c_custkey, + count(o.o_orderkey) AS order_count + FROM + customer c + LEFT OUTER JOIN + orders o ON c.c_custkey = o.o_custkey + AND o.o_comment NOT LIKE '%special%requests%' + GROUP BY + c.c_custkey +) +SELECT + order_count AS c_count, + count(*) AS custdist +FROM + CustomerOrderCounts +GROUP BY + order_count +ORDER BY + custdist DESC, + c_count DESC; +``` +:::: + +**Q14** + +```sql +SELECT + 100.00 * sum(CASE + WHEN p_type LIKE 'PROMO%' + THEN l_extendedprice * (1 - l_discount) + ELSE 0 + END) / sum(l_extendedprice * (1 - l_discount)) AS promo_revenue +FROM + lineitem, + part +WHERE + l_partkey = p_partkey + AND l_shipdate >= DATE '1995-09-01' + AND l_shipdate < DATE '1995-09-01' + INTERVAL '1' MONTH; +``` + +**Q15** + +```sql +CREATE VIEW revenue0 (supplier_no, total_revenue) AS + SELECT + l_suppkey, + sum(l_extendedprice * (1 - l_discount)) + FROM + lineitem + WHERE + l_shipdate >= DATE '1996-01-01' + AND l_shipdate < DATE '1996-01-01' + INTERVAL '3' MONTH + GROUP BY + l_suppkey; + +SELECT + s_suppkey, + s_name, + s_address, + s_phone, + total_revenue +FROM + supplier, + revenue0 +WHERE + s_suppkey = supplier_no + AND total_revenue = ( + SELECT + max(total_revenue) + FROM + revenue0 + ) +ORDER BY + s_suppkey; + +DROP VIEW revenue0; +``` + +::::note +2024年10月時点では、ビューの定義はそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/70139 + +この代替ビュー定義は動作します: + +```sql +CREATE VIEW revenue0 AS + SELECT + l_suppkey AS supplier_no, + sum(l_extendedprice * (1 - l_discount)) AS total_revenue + FROM + lineitem + WHERE + l_shipdate >= DATE '1996-01-01' + AND l_shipdate < DATE '1996-01-01' + INTERVAL '3' MONTH + GROUP BY + l_suppkey; +``` +:::: + +**Q16** + +```sql +SELECT + p_brand, + p_type, + p_size, + count(distinct ps_suppkey) AS supplier_cnt +FROM + partsupp, + part +WHERE + p_partkey = ps_partkey + AND p_brand <> 'Brand#45' + AND p_type NOT LIKE 'MEDIUM POLISHED%' + AND p_size in (49, 14, 23, 45, 19, 3, 36, 9) + AND ps_suppkey NOT in ( + SELECT + s_suppkey + FROM + supplier + WHERE + s_comment LIKE '%Customer%Complaints%' + ) +GROUP BY + p_brand, + p_type, + p_size +ORDER BY + supplier_cnt DESC, + p_brand, + p_type, + p_size; +``` + +**Q17** + +```sql +SELECT + sum(l_extendedprice) / 7.0 AS avg_yearly +FROM + lineitem, + part +WHERE + p_partkey = l_partkey + AND p_brand = 'Brand#23' + AND p_container = 'MED BOX' + AND l_quantity < ( + SELECT + 0.2 * avg(l_quantity) + FROM + lineitem + WHERE + l_partkey = p_partkey + ); +``` + +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +WITH AvgQuantity AS ( + SELECT + l_partkey, + AVG(l_quantity) * 0.2 AS avg_quantity + FROM + lineitem + GROUP BY + l_partkey +) +SELECT + SUM(l.l_extendedprice) / 7.0 AS avg_yearly +FROM + lineitem l +JOIN + part p ON p.p_partkey = l.l_partkey +JOIN + AvgQuantity aq ON l.l_partkey = aq.l_partkey +WHERE + p.p_brand = 'Brand#23' + AND p.p_container = 'MED BOX' + AND l.l_quantity < aq.avg_quantity; + +``` +:::: + +**Q18** + +```sql +SELECT + c_name, + c_custkey, + o_orderkey, + o_orderdate, + o_totalprice, + sum(l_quantity) +FROM + customer, + orders, + lineitem +WHERE + o_orderkey in ( + SELECT + l_orderkey + FROM + lineitem + GROUP BY + l_orderkey + HAVING + sum(l_quantity) > 300 + ) + AND c_custkey = o_custkey + AND o_orderkey = l_orderkey +GROUP BY + c_name, + c_custkey, + o_orderkey, + o_orderdate, + o_totalprice +ORDER BY + o_totalprice DESC, + o_orderdate; +``` + +**Q19** + +```sql +SELECT + sum(l_extendedprice * (1 - l_discount)) AS revenue +FROM + lineitem, + part +WHERE + ( + p_partkey = l_partkey + AND p_brand = 'Brand#12' + AND p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') + AND l_quantity >= 1 AND l_quantity <= 1 + 10 + AND p_size BETWEEN 1 AND 5 + AND l_shipmode in ('AIR', 'AIR REG') + AND l_shipinstruct = 'DELIVER IN PERSON' + ) + OR + ( + p_partkey = l_partkey + AND p_brand = 'Brand#23' + AND p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') + AND l_quantity >= 10 AND l_quantity <= 10 + 10 + AND p_size BETWEEN 1 AND 10 + AND l_shipmode in ('AIR', 'AIR REG') + AND l_shipinstruct = 'DELIVER IN PERSON' + ) + OR + ( + p_partkey = l_partkey + AND p_brand = 'Brand#34' + AND p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') + AND l_quantity >= 20 AND l_quantity <= 20 + 10 + AND p_size BETWEEN 1 AND 15 + AND l_shipmode in ('AIR', 'AIR REG') + AND l_shipinstruct = 'DELIVER IN PERSON' + ); +``` + +::::note +2024年10月時点では、結合述語のプッシュダウンが欠如しているため、クエリは非常に遅いです。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/70802 + +この代替のフォームは動作し、参照結果を返すことが確認されています。 + +```sql +SELECT + sum(l_extendedprice * (1 - l_discount)) AS revenue +FROM + lineitem, + part +WHERE + p_partkey = l_partkey + AND l_shipinstruct = 'DELIVER IN PERSON' + AND l_shipmode IN ('AIR', 'AIR REG') + AND ( + ( + p_brand = 'Brand#12' + AND p_container IN ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') + AND l_quantity >= 1 AND l_quantity <= 1 + 10 + AND p_size BETWEEN 1 AND 5 + ) + OR + ( + p_brand = 'Brand#23' + AND p_container IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') + AND l_quantity >= 10 AND l_quantity <= 10 + 10 + AND p_size BETWEEN 1 AND 10 + ) + OR + ( + p_brand = 'Brand#34' + AND p_container IN ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') + AND l_quantity >= 20 AND l_quantity <= 20 + 10 + AND p_size BETWEEN 1 AND 15 + ) + ) +``` +:::: + +**Q20** + +```sql +SELECT + s_name, + s_address +FROM + supplier, + nation +WHERE + s_suppkey in ( + SELECT + ps_suppkey + FROM + partsupp + WHERE + ps_partkey in ( + SELECT + p_partkey + FROM + part + WHERE + p_name LIKE 'forest%' + ) + AND ps_availqty > ( + SELECT + 0.5 * sum(l_quantity) + FROM + lineitem + WHERE + l_partkey = ps_partkey + AND l_suppkey = ps_suppkey + AND l_shipdate >= DATE '1994-01-01' + AND l_shipdate < DATE '1994-01-01' + INTERVAL '1' year + ) + ) + AND s_nationkey = n_nationkey + AND n_name = 'CANADA' +ORDER BY + s_name; +``` + +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 +:::: + +**Q21** + +```sql +SELECT + s_name, + count(*) AS numwait +FROM + supplier, + lineitem l1, + orders, + nation +WHERE + s_suppkey = l1.l_suppkey + AND o_orderkey = l1.l_orderkey + AND o_orderstatus = 'F' + AND l1.l_receiptdate > l1.l_commitdate + AND EXISTS ( + SELECT + * + FROM + lineitem l2 + WHERE + l2.l_orderkey = l1.l_orderkey + AND l2.l_suppkey <> l1.l_suppkey + ) + AND NOT EXISTS ( + SELECT + * + FROM + lineitem l3 + WHERE + l3.l_orderkey = l1.l_orderkey + AND l3.l_suppkey <> l1.l_suppkey + AND l3.l_receiptdate > l3.l_commitdate + ) + AND s_nationkey = n_nationkey + AND n_name = 'SAUDI ARABIA' +GROUP BY + s_name +ORDER BY + numwait DESC, + s_name; +``` +::::note +2024年10月時点では、相関サブクエリのためクエリはそのままでは動作しません。対応する問題: https://github.com/ClickHouse/ClickHouse/issues/6697 +:::: + +**Q22** + +```sql +SELECT + cntrycode, + count(*) AS numcust, + sum(c_acctbal) AS totacctbal +FROM ( + SELECT + substring(c_phone FROM 1 for 2) AS cntrycode, + c_acctbal + FROM + customer + WHERE + substring(c_phone FROM 1 for 2) in + ('13', '31', '23', '29', '30', '18', '17') + AND c_acctbal > ( + SELECT + avg(c_acctbal) + FROM + customer + WHERE + c_acctbal > 0.00 + AND substring(c_phone FROM 1 for 2) in + ('13', '31', '23', '29', '30', '18', '17') + ) + AND NOT EXISTS ( + SELECT + * + FROM + orders + WHERE + o_custkey = c_custkey + ) + ) AS custsale +GROUP BY + cntrycode +ORDER BY + cntrycode; +``` + diff --git a/docs/ja/getting-started/example-datasets/tw-weather.md b/docs/ja/getting-started/example-datasets/tw-weather.md new file mode 100644 index 00000000000..6af4aeeea4a --- /dev/null +++ b/docs/ja/getting-started/example-datasets/tw-weather.md @@ -0,0 +1,293 @@ +--- +slug: /ja/getting-started/example-datasets/tw-weather +sidebar_label: 台湾の歴史的気象データセット +sidebar_position: 1 +description: 過去128年間の気象観測データ1億3100万行 +--- + +# 台湾の歴史的気象データセット + +このデータセットには、過去128年間の歴史的な気象観測の測定値が含まれています。それぞれの行は、特定の日時と気象観測所の観測値です。 + +このデータセットの出典は[こちら](https://github.com/Raingel/historical_weather)で、気象観測所番号のリストは[こちら](https://github.com/Raingel/weather_station_list)から参照できます。 + +> 気象データの出典には、中央気象局が設置した気象観測所(観測所コードがC0、C1、4で始まる)や、農業委員会所属の農業気象観測所(上記以外の観測所コード)を含みます: + +- StationId +- MeasuredDate(観測時刻) +- StnPres(観測所気圧) +- SeaPres(海面気圧) +- Td(露点温度) +- RH(相対湿度) +- 他の利用可能な要素 + +## データのダウンロード + +- ClickHouse用にクリーニング、再構造化、およびエンリッチメントされた[事前処理済みバージョン](#pre-processed-data)のデータ。このデータセットは1896年から2023年までの情報をカバーしています。 +- [オリジナルの生データをダウンロード](#original-raw-data)し、ClickHouseが必要とするフォーマットに変換します。独自にカラムを追加したいユーザーは、独自のアプローチを検討したり、完成させたりすることができます。 + +### 事前処理済みデータ + +データセットは1行ごとの測定値から、観測所IDと測定日の行ごとに再構造化されています。例: + +```csv +StationId,MeasuredDate,StnPres,Tx,RH,WS,WD,WSGust,WDGust,Precp,GloblRad,TxSoil0cm,TxSoil5cm,TxSoil20cm,TxSoil50cm,TxSoil100cm,SeaPres,Td,PrecpHour,SunShine,TxSoil10cm,EvapA,Visb,UVI,Cloud Amount,TxSoil30cm,TxSoil200cm,TxSoil300cm,TxSoil500cm,VaporPressure +C0X100,2016-01-01 01:00:00,1022.1,16.1,72,1.1,8.0,,,,,,,,,,,,,,,,,,,,,,, +C0X100,2016-01-01 02:00:00,1021.6,16.0,73,1.2,358.0,,,,,,,,,,,,,,,,,,,,,,, +C0X100,2016-01-01 03:00:00,1021.3,15.8,74,1.5,353.0,,,,,,,,,,,,,,,,,,,,,,, +C0X100,2016-01-01 04:00:00,1021.2,15.8,74,1.7,8.0,,,,,,,,,,,,,,,,,,,,,,, +``` + +このデータをクエリするのが容易で、結果のテーブルに対して、不足している要素をnullとして管理することができ、各気象観測所で利用可能な測定項目が異なることがあります。 + +このデータセットは、以下のGoogle CloudStorageの場所にあります。データセットをローカルのファイルシステムにダウンロードして(そしてClickHouseクライアントを使用して挿入する)も、直接ClickHouseに挿入しても構いません([URLから挿入](#inserting-from-url)を参照)。 + +ダウンロードするには: + +```bash +wget https://storage.googleapis.com/taiwan-weather-observaiton-datasets/preprocessed_weather_daily_1896_2023.tar.gz + +# オプション: チェックサムを検証 +md5sum preprocessed_weather_daily_1896_2023.tar.gz +# チェックサムは次のとおりである必要があります: 11b484f5bd9ddafec5cfb131eb2dd008 + +tar -xzvf preprocessed_weather_daily_1896_2023.tar.gz +daily_weather_preprocessed_1896_2023.csv + +# オプション: チェックサムを検証 +md5sum daily_weather_preprocessed_1896_2023.csv +# チェックサムは次のとおりである必要があります: 1132248c78195c43d93f843753881754 +``` + +### オリジナルの生データ + +以下は、変換および独自の目的に合わせて変更するためのオリジナルの生データをダウンロードする手順に関する詳細です。 + +#### ダウンロード + +オリジナルの生データをダウンロードするには: + +```bash +mkdir tw_raw_weather_data && cd tw_raw_weather_data + +wget https://storage.googleapis.com/taiwan-weather-observaiton-datasets/raw_data_weather_daily_1896_2023.tar.gz + +# オプション: チェックサムを検証 +md5sum raw_data_weather_daily_1896_2023.tar.gz +# チェックサムは次のとおりである必要があります: b66b9f137217454d655e3004d7d1b51a + +tar -xzvf raw_data_weather_daily_1896_2023.tar.gz +466920_1928.csv +466920_1929.csv +466920_1930.csv +466920_1931.csv +... + +# オプション: チェックサムを検証 +cat *.csv | md5sum +# チェックサムは次のとおりである必要があります: b26db404bf84d4063fac42e576464ce1 +``` + +#### 台湾の気象観測所を取得 + +```bash +wget -O weather_sta_list.csv https://github.com/Raingel/weather_station_list/raw/main/data/weather_sta_list.csv + +# オプション: UTF-8-BOMからUTF-8エンコーディングに変換 +sed -i '1s/^\xEF\xBB\xBF//' weather_sta_list.csv +``` + +## テーブルスキーマの作成 + +ClickHouseにMergeTreeテーブルを作成します(ClickHouseクライアントから)。 + +```bash +CREATE TABLE tw_weather_data ( + StationId String null, + MeasuredDate DateTime64, + StnPres Float64 null, + SeaPres Float64 null, + Tx Float64 null, + Td Float64 null, + RH Float64 null, + WS Float64 null, + WD Float64 null, + WSGust Float64 null, + WDGust Float64 null, + Precp Float64 null, + PrecpHour Float64 null, + SunShine Float64 null, + GloblRad Float64 null, + TxSoil0cm Float64 null, + TxSoil5cm Float64 null, + TxSoil10cm Float64 null, + TxSoil20cm Float64 null, + TxSoil50cm Float64 null, + TxSoil100cm Float64 null, + TxSoil30cm Float64 null, + TxSoil200cm Float64 null, + TxSoil300cm Float64 null, + TxSoil500cm Float64 null, + VaporPressure Float64 null, + UVI Float64 null, + "Cloud Amount" Float64 null, + EvapA Float64 null, + Visb Float64 null +) +ENGINE = MergeTree +ORDER BY (MeasuredDate); +``` + +## データのClickHouseへの挿入 + +### ローカルファイルからの挿入 + +データはローカルファイルから次のように挿入できます(ClickHouseクライアントから): + +```sql +INSERT INTO tw_weather_data FROM INFILE '/path/to/daily_weather_preprocessed_1896_2023.csv' +``` + +ここで `/path/to` は、ディスク上の特定のユーザーのローカルファイルへのパスを表します。 + +ClickHouseへのデータの挿入後のサンプル応答出力は次のとおりです: + +```response +Query id: 90e4b524-6e14-4855-817c-7e6f98fbeabb + +Ok. +131985329 行がセット内にあります。Elapsed: 71.770 秒。処理された1億3198.5万行、10.06 GB(1.84百万行/秒、140.14 MB/秒)。 +ピークメモリ使用量: 583.23 MiB。 +``` + +### URLからの挿入 + +```sql +INSERT INTO tw_weather_data SELECT * +FROM url('https://storage.googleapis.com/taiwan-weather-observaiton-datasets/daily_weather_preprocessed_1896_2023.csv', 'CSVWithNames') +``` + +データのロードを高速化する方法については、[大規模データロードの調整に関するブログ投稿](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)をご覧ください。 + +## データ行とサイズを確認 + +1. 挿入された行数を確認: + +```sql +SELECT formatReadableQuantity(count()) +FROM tw_weather_data; +``` + +```response +┌─formatReadableQuantity(count())─┐ +│ 1億3199万 │ +└─────────────────────────────────┘ +``` + +2. このテーブルに使用されているディスク容量を確認: + +```sql +SELECT + formatReadableSize(sum(bytes)) AS disk_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size +FROM system.parts +WHERE (`table` = 'tw_weather_data') AND active +``` + +```response +┌─disk_size─┬─uncompressed_size─┐ +│ 2.13 GiB │ 32.94 GiB │ +└───────────┴───────────────────┘ +``` + +## サンプルクエリ + +### Q1: 特定の年における各気象観測所の最高露点温度を取得 + +```sql +SELECT + StationId, + max(Td) AS max_td +FROM tw_weather_data +WHERE (year(MeasuredDate) = 2023) AND (Td IS NOT NULL) +GROUP BY StationId + +┌─StationId─┬─max_td─┐ +│ 466940 │ 1 │ +│ 467300 │ 1 │ +│ 467540 │ 1 │ +│ 467490 │ 1 │ +│ 467080 │ 1 │ +│ 466910 │ 1 │ +│ 467660 │ 1 │ +│ 467270 │ 1 │ +│ 467350 │ 1 │ +│ 467571 │ 1 │ +│ 466920 │ 1 │ +│ 467650 │ 1 │ +│ 467550 │ 1 │ +│ 467480 │ 1 │ +│ 467610 │ 1 │ +│ 467050 │ 1 │ +│ 467590 │ 1 │ +│ 466990 │ 1 │ +│ 467060 │ 1 │ +│ 466950 │ 1 │ +│ 467620 │ 1 │ +│ 467990 │ 1 │ +│ 466930 │ 1 │ +│ 467110 │ 1 │ +│ 466881 │ 1 │ +│ 467410 │ 1 │ +│ 467441 │ 1 │ +│ 467420 │ 1 │ +│ 467530 │ 1 │ +│ 466900 │ 1 │ +└───────────┴────────┘ + +30 行がセット内にあります。Elapsed: 0.045 秒。処理された641万行、187.33 MB(143.92百万行/秒、4.21 GB/秒)。 +``` + +### Q2: 特定の期間、フィールド、および気象観測所での生データ取得 + +```sql +SELECT + StnPres, + SeaPres, + Tx, + Td, + RH, + WS, + WD, + WSGust, + WDGust, + Precp, + PrecpHour +FROM tw_weather_data +WHERE (StationId = 'C0UB10') AND (MeasuredDate >= '2023-12-23') AND (MeasuredDate < '2023-12-24') +ORDER BY MeasuredDate ASC +LIMIT 10 +``` + +```response +┌─StnPres─┬─SeaPres─┬───Tx─┬───Td─┬─RH─┬──WS─┬──WD─┬─WSGust─┬─WDGust─┬─Precp─┬─PrecpHour─┐ +│ 1029.5 │ ᴺᵁᴸᴸ │ 11.8 │ ᴺᵁᴸᴸ │ 78 │ 2.7 │ 271 │ 5.5 │ 275 │ -99.8 │ -99.8 │ +│ 1029.8 │ ᴺᵁᴸᴸ │ 12.3 │ ᴺᵁᴸᴸ │ 78 │ 2.7 │ 289 │ 5.5 │ 308 │ -99.8 │ -99.8 │ +│ 1028.6 │ ᴺᵁᴸᴸ │ 12.3 │ ᴺᵁᴸᴸ │ 79 │ 2.3 │ 251 │ 6.1 │ 289 │ -99.8 │ -99.8 │ +│ 1028.2 │ ᴺᵁᴸᴸ │ 13 │ ᴺᵁᴸᴸ │ 75 │ 4.3 │ 312 │ 7.5 │ 316 │ -99.8 │ -99.8 │ +│ 1027.8 │ ᴺᵁᴸᴸ │ 11.1 │ ᴺᵁᴸᴸ │ 89 │ 7.1 │ 310 │ 11.6 │ 322 │ -99.8 │ -99.8 │ +│ 1027.8 │ ᴺᵁᴸᴸ │ 11.6 │ ᴺᵁᴸᴸ │ 90 │ 3.1 │ 269 │ 10.7 │ 295 │ -99.8 │ -99.8 │ +│ 1027.9 │ ᴺᵁᴸᴸ │ 12.3 │ ᴺᵁᴸᴸ │ 89 │ 4.7 │ 296 │ 8.1 │ 310 │ -99.8 │ -99.8 │ +│ 1028.2 │ ᴺᵁᴸᴸ │ 12.2 │ ᴺᵁᴸᴸ │ 94 │ 2.5 │ 246 │ 7.1 │ 283 │ -99.8 │ -99.8 │ +│ 1028.4 │ ᴺᵁᴸᴸ │ 12.5 │ ᴺᵁᴸᴸ │ 94 │ 3.1 │ 265 │ 4.8 │ 297 │ -99.8 │ -99.8 │ +│ 1028.3 │ ᴺᵁᴸᴸ │ 13.6 │ ᴺᵁᴸᴸ │ 91 │ 1.2 │ 273 │ 4.4 │ 256 │ -99.8 │ -99.8 │ +└─────────┴─────────┴──────┴──────┴────┴─────┴─────┴────────┴────────┴───────┴───────────┘ + +10 行がセット内にあります。Elapsed: 0.009 秒。処理された9万1700行、2.33 MB(967万行/秒、245.31 MB/秒)。 +``` + +## クレジット + +データセットの準備、クリーニング、および配信に対する中央気象局と農業委員会の農業気象観測ネットワーク(観測所)の努力を認めたいと思います。感謝いたします。 + +Ou, J.-H., Kuo, C.-H., Wu, Y.-F., Lin, G.-C., Lee, M.-H., Chen, R.-K., Chou, H.-P., Wu, H.-Y., Chu, S.-C., Lai, Q.-J., Tsai, Y.-C., Lin, C.-C., Kuo, C.-C., Liao, C.-T., Chen, Y.-N., Chu, Y.-W., Chen, C.-Y., 2023. 台湾におけるイネいもち病の早期警報のためのアプリケーション指向の深層学習モデル。Ecological Informatics 73, 101950. https://doi.org/10.1016/j.ecoinf.2022.101950 [13/12/2022] diff --git a/docs/ja/getting-started/example-datasets/uk-price-paid.md b/docs/ja/getting-started/example-datasets/uk-price-paid.md new file mode 100644 index 00000000000..b6ff53048bd --- /dev/null +++ b/docs/ja/getting-started/example-datasets/uk-price-paid.md @@ -0,0 +1,448 @@ +--- +slug: /ja/getting-started/example-datasets/uk-price-paid +sidebar_label: イギリスの不動産価格 +sidebar_position: 1 +--- + +# イギリスの不動産価格データセット + +プロジェクションは、頻繁に実行するクエリのパフォーマンスを改善するための素晴らしい方法です。今回は、イギリスの不動産データセットを使用してプロジェクションの力を示します。このデータセットには、イングランドおよびウェールズにおける不動産に対して支払われた価格に関するデータが含まれています。データは1995年以降利用可能で、非圧縮形式でのデータセットのサイズは約4 GiB(ClickHouseでは約278 MiBしか使用しません)。 + +- ソース: https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads +- フィールドの説明: https://www.gov.uk/guidance/about-the-price-paid-data +- HM土地登記データを含む © Crown copyright and database right 2021。このデータは、オープンガバメントライセンスv3.0の下でライセンスされています。 + +## テーブルの作成 {#create-table} + +```sql +CREATE TABLE uk_price_paid +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0), + is_new UInt8, + duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (postcode1, postcode2, addr1, addr2); +``` + +## データの前処理と挿入 {#preprocess-import-data} + +`url`関数を使用してデータをClickHouseにストリームします。まず、いくつかの受信データを前処理する必要があります。これには以下が含まれます: +- `postcode`を二つの異なるカラム、`postcode1`と`postcode2`に分割します。これはストレージとクエリにとってより良いです +- `time`フィールドを日付に変換します(時間は00:00のみであるため) +- 分析に必要ないため、[UUid](../../sql-reference/data-types/uuid.md)フィールドを無視します +- [transform](../../sql-reference/functions/other-functions.md#transform)関数を使用して、`type`と`duration`をより読みやすい`Enum`フィールドに変換します +- `is_new`フィールドを単一文字の文字列(`Y`/`N`)から[UInt8](../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-uint256-int8-int16-int32-int64-int128-int256)フィールド(0または1)に変換します +- 最後の二つのカラムは同じ値(0)しか持たないので削除します + +`url`関数は、WebサーバーからClickHouseテーブルにデータをストリームします。以下のコマンドは、`uk_price_paid`テーブルに500万行を挿入します: + +```sql +INSERT INTO uk_price_paid +WITH + splitByChar(' ', postcode) AS p +SELECT + toUInt32(price_string) AS price, + parseDateTimeBestEffortUS(time) AS date, + p[1] AS postcode1, + p[2] AS postcode2, + transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type, + b = 'Y' AS is_new, + transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration, + addr1, + addr2, + street, + locality, + town, + district, + county +FROM url( + 'http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', + 'CSV', + 'uuid_string String, + price_string String, + time String, + postcode String, + a String, + b String, + c String, + addr1 String, + addr2 String, + street String, + locality String, + town String, + district String, + county String, + d String, + e String' +) SETTINGS max_http_get_redirects=10; +``` + +データが挿入されるのを待ちます。ネットワークの速度によって、1、2分かかります。 + +## データの検証 {#validate-data} + +どうなったか確認するために、挿入された行数を見てみましょう: + +```sql +SELECT count() +FROM uk_price_paid +``` + +このクエリが実行された時点で、データセットには27,450,499行がありました。ClickHouseでのテーブルのストレージサイズを見てみましょう: + +```sql +SELECT formatReadableSize(total_bytes) +FROM system.tables +WHERE name = 'uk_price_paid' +``` + +テーブルのサイズはわずか221.43 MiBです! + +## クエリを実行する {#run-queries} + +データを分析するためにクエリを実行してみましょう: + +### クエリ1. 年ごとの平均価格 {#average-price} + +```sql +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 1000000, 80 +) +FROM uk_price_paid +GROUP BY year +ORDER BY year +``` + +結果は次のようになります: + +```response +┌─year─┬──price─┬─bar(round(avg(price)), 0, 1000000, 80)─┐ +│ 1995 │ 67934 │ █████▍ │ +│ 1996 │ 71508 │ █████▋ │ +│ 1997 │ 78536 │ ██████▎ │ +│ 1998 │ 85441 │ ██████▋ │ +│ 1999 │ 96038 │ ███████▋ │ +│ 2000 │ 107487 │ ████████▌ │ +│ 2001 │ 118888 │ █████████▌ │ +│ 2002 │ 137948 │ ███████████ │ +│ 2003 │ 155893 │ ████████████▍ │ +│ 2004 │ 178888 │ ██████████████▎ │ +│ 2005 │ 189359 │ ███████████████▏ │ +│ 2006 │ 203532 │ ████████████████▎ │ +│ 2007 │ 219375 │ █████████████████▌ │ +│ 2008 │ 217056 │ █████████████████▎ │ +│ 2009 │ 213419 │ █████████████████ │ +│ 2010 │ 236110 │ ██████████████████▊ │ +│ 2011 │ 232805 │ ██████████████████▌ │ +│ 2012 │ 238381 │ ███████████████████ │ +│ 2013 │ 256927 │ ████████████████████▌ │ +│ 2014 │ 280008 │ ██████████████████████▍ │ +│ 2015 │ 297263 │ ███████████████████████▋ │ +│ 2016 │ 313518 │ █████████████████████████ │ +│ 2017 │ 346371 │ ███████████████████████████▋ │ +│ 2018 │ 350556 │ ████████████████████████████ │ +│ 2019 │ 352184 │ ████████████████████████████▏ │ +│ 2020 │ 375808 │ ██████████████████████████████ │ +│ 2021 │ 381105 │ ██████████████████████████████▍ │ +│ 2022 │ 362572 │ █████████████████████████████ │ +└──────┴────────┴────────────────────────────────────────┘ +``` + +### クエリ2. ロンドンの年ごとの平均価格 {#average-price-london} + +```sql +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 2000000, 100 +) +FROM uk_price_paid +WHERE town = 'LONDON' +GROUP BY year +ORDER BY year +``` + +結果は次のようになります: + +```response +┌─year─┬───price─┬─bar(round(avg(price)), 0, 2000000, 100)───────────────┐ +│ 1995 │ 109110 │ █████▍ │ +│ 1996 │ 118659 │ █████▊ │ +│ 1997 │ 136526 │ ██████▋ │ +│ 1998 │ 153002 │ ███████▋ │ +│ 1999 │ 180633 │ █████████ │ +│ 2000 │ 215849 │ ██████████▋ │ +│ 2001 │ 232987 │ ███████████▋ │ +│ 2002 │ 263668 │ █████████████▏ │ +│ 2003 │ 278424 │ █████████████▊ │ +│ 2004 │ 304664 │ ███████████████▏ │ +│ 2005 │ 322887 │ ████████████████▏ │ +│ 2006 │ 356195 │ █████████████████▋ │ +│ 2007 │ 404062 │ ████████████████████▏ │ +│ 2008 │ 420741 │ █████████████████████ │ +│ 2009 │ 427754 │ █████████████████████▍ │ +│ 2010 │ 480322 │ ████████████████████████ │ +│ 2011 │ 496278 │ ████████████████████████▋ │ +│ 2012 │ 519482 │ █████████████████████████▊ │ +│ 2013 │ 616195 │ ██████████████████████████████▋ │ +│ 2014 │ 724121 │ ████████████████████████████████████▏ │ +│ 2015 │ 792101 │ ███████████████████████████████████████▌ │ +│ 2016 │ 843589 │ ██████████████████████████████████████████▏ │ +│ 2017 │ 983523 │ █████████████████████████████████████████████████▏ │ +│ 2018 │ 1016753 │ ██████████████████████████████████████████████████▋ │ +│ 2019 │ 1041673 │ ████████████████████████████████████████████████████ │ +│ 2020 │ 1060027 │ █████████████████████████████████████████████████████ │ +│ 2021 │ 958249 │ ███████████████████████████████████████████████▊ │ +│ 2022 │ 902596 │ █████████████████████████████████████████████▏ │ +└──────┴─────────┴───────────────────────────────────────────────────────┘ +``` + +2020年に家の価格に何かが起こりました!ですが、それはおそらく驚くべきことではないでしょう... + +### クエリ3. 最も高価な地域 {#most-expensive-neighborhoods} + +```sql +SELECT + town, + district, + count() AS c, + round(avg(price)) AS price, + bar(price, 0, 5000000, 100) +FROM uk_price_paid +WHERE date >= '2020-01-01' +GROUP BY + town, + district +HAVING c >= 100 +ORDER BY price DESC +LIMIT 100 +``` + +結果は次のようになります: + +```response +┌─town─────────────────┬─district───────────────┬─────c─┬───price─┬─bar(round(avg(price)), 0, 5000000, 100)─────────────────────────┐ +│ LONDON │ CITY OF LONDON │ 578 │ 3149590 │ ██████████████████████████████████████████████████████████████▊ │ +│ LONDON │ CITY OF WESTMINSTER │ 7083 │ 2903794 │ ██████████████████████████████████████████████████████████ │ +│ LONDON │ KENSINGTON AND CHELSEA │ 4986 │ 2333782 │ ██████████████████████████████████████████████▋ │ +│ LEATHERHEAD │ ELMBRIDGE │ 203 │ 2071595 │ █████████████████████████████████████████▍ │ +│ VIRGINIA WATER │ RUNNYMEDE │ 308 │ 1939465 │ ██████████████████████████████████████▋ │ +│ LONDON │ CAMDEN │ 5750 │ 1673687 │ █████████████████████████████████▍ │ +│ WINDLESHAM │ SURREY HEATH │ 182 │ 1428358 │ ████████████████████████████▌ │ +│ NORTHWOOD │ THREE RIVERS │ 112 │ 1404170 │ ████████████████████████████ │ +│ BARNET │ ENFIELD │ 259 │ 1338299 │ ██████████████████████████▋ │ +│ LONDON │ ISLINGTON │ 5504 │ 1275520 │ █████████████████████████▌ │ +│ LONDON │ RICHMOND UPON THAMES │ 1345 │ 1261935 │ █████████████████████████▏ │ +│ COBHAM │ ELMBRIDGE │ 727 │ 1251403 │ █████████████████████████ │ +│ BEACONSFIELD │ BUCKINGHAMSHIRE │ 680 │ 1199970 │ ███████████████████████▊ │ +│ LONDON │ TOWER HAMLETS │ 10012 │ 1157827 │ ███████████████████████▏ │ +│ LONDON │ HOUNSLOW │ 1278 │ 1144389 │ ██████████████████████▊ │ +│ BURFORD │ WEST OXFORDSHIRE │ 182 │ 1139393 │ ██████████████████████▋ │ +│ RICHMOND │ RICHMOND UPON THAMES │ 1649 │ 1130076 │ ██████████████████████▌ │ +│ KINGSTON UPON THAMES │ RICHMOND UPON THAMES │ 147 │ 1126111 │ ██████████████████████▌ │ +│ ASCOT │ WINDSOR AND MAIDENHEAD │ 773 │ 1106109 │ ██████████████████████ │ +│ LONDON │ HAMMERSMITH AND FULHAM │ 6162 │ 1056198 │ █████████████████████ │ +│ RADLETT │ HERTSMERE │ 513 │ 1045758 │ ████████████████████▊ │ +│ LEATHERHEAD │ GUILDFORD │ 354 │ 1045175 │ ████████████████████▊ │ +│ WEYBRIDGE │ ELMBRIDGE │ 1275 │ 1036702 │ ████████████████████▋ │ +│ FARNHAM │ EAST HAMPSHIRE │ 107 │ 1033682 │ ████████████████████▋ │ +│ ESHER │ ELMBRIDGE │ 915 │ 1032753 │ ████████████████████▋ │ +│ FARNHAM │ HART │ 102 │ 1002692 │ ████████████████████ │ +│ GERRARDS CROSS │ BUCKINGHAMSHIRE │ 845 │ 983639 │ ███████████████████▋ │ +│ CHALFONT ST GILES │ BUCKINGHAMSHIRE │ 286 │ 973993 │ ███████████████████▍ │ +│ SALCOMBE │ SOUTH HAMS │ 215 │ 965724 │ ███████████████████▎ │ +│ SURBITON │ ELMBRIDGE │ 181 │ 960346 │ ███████████████████▏ │ +│ BROCKENHURST │ NEW FOREST │ 226 │ 951278 │ ███████████████████ │ +│ SUTTON COLDFIELD │ LICHFIELD │ 110 │ 930757 │ ██████████████████▌ │ +│ EAST MOLESEY │ ELMBRIDGE │ 372 │ 927026 │ ██████████████████▌ │ +│ LLANGOLLEN │ WREXHAM │ 127 │ 925681 │ ██████████████████▌ │ +│ OXFORD │ SOUTH OXFORDSHIRE │ 638 │ 923830 │ ██████████████████▍ │ +│ LONDON │ MERTON │ 4383 │ 923194 │ ██████████████████▍ │ +│ GUILDFORD │ WAVERLEY │ 261 │ 905733 │ ██████████████████ │ +│ TEDDINGTON │ RICHMOND UPON THAMES │ 1147 │ 894856 │ █████████████████▊ │ +│ HARPENDEN │ ST ALBANS │ 1271 │ 893079 │ █████████████████▋ │ +│ HENLEY-ON-THAMES │ SOUTH OXFORDSHIRE │ 1042 │ 887557 │ █████████████████▋ │ +│ POTTERS BAR │ WELWYN HATFIELD │ 314 │ 863037 │ █████████████████▎ │ +│ LONDON │ WANDSWORTH │ 13210 │ 857318 │ █████████████████▏ │ +│ BILLINGSHURST │ CHICHESTER │ 255 │ 856508 │ █████████████████▏ │ +│ LONDON │ SOUTHWARK │ 7742 │ 843145 │ ████████████████▋ │ +│ LONDON │ HACKNEY │ 6656 │ 839716 │ ████████████████▋ │ +│ LUTTERWORTH │ HARBOROUGH │ 1096 │ 836546 │ ████████████████▋ │ +│ KINGSTON UPON THAMES │ KINGSTON UPON THAMES │ 1846 │ 828990 │ ████████████████▌ │ +│ LONDON │ EALING │ 5583 │ 820135 │ ████████████████▍ │ +│ INGATESTONE │ CHELMSFORD │ 120 │ 815379 │ ████████████████▎ │ +│ MARLOW │ BUCKINGHAMSHIRE │ 718 │ 809943 │ ████████████████▏ │ +│ EAST GRINSTEAD │ TANDRIDGE │ 105 │ 809461 │ ████████████████▏ │ +│ CHIGWELL │ EPPING FOREST │ 484 │ 809338 │ ████████████████▏ │ +│ EGHAM │ RUNNYMEDE │ 989 │ 807858 │ ████████████████▏ │ +│ HASLEMERE │ CHICHESTER │ 223 │ 804173 │ ████████████████ │ +│ PETWORTH │ CHICHESTER │ 288 │ 803206 │ ████████████████ │ +│ TWICKENHAM │ RICHMOND UPON THAMES │ 2194 │ 802616 │ ████████████████ │ +│ WEMBLEY │ BRENT │ 1698 │ 801733 │ ████████████████ │ +│ HINDHEAD │ WAVERLEY │ 233 │ 801482 │ ████████████████ │ +│ LONDON │ BARNET │ 8083 │ 792066 │ ███████████████▋ │ +│ WOKING │ GUILDFORD │ 343 │ 789360 │ ███████████████▋ │ +│ STOCKBRIDGE │ TEST VALLEY │ 318 │ 777909 │ ███████████████▌ │ +│ BERKHAMSTED │ DACORUM │ 1049 │ 776138 │ ███████████████▌ │ +│ MAIDENHEAD │ BUCKINGHAMSHIRE │ 236 │ 775572 │ ███████████████▌ │ +│ SOLIHULL │ STRATFORD-ON-AVON │ 142 │ 770727 │ ███████████████▍ │ +│ GREAT MISSENDEN │ BUCKINGHAMSHIRE │ 431 │ 764493 │ ███████████████▎ │ +│ TADWORTH │ REIGATE AND BANSTEAD │ 920 │ 757511 │ ███████████████▏ │ +│ LONDON │ BRENT │ 4124 │ 757194 │ ███████████████▏ │ +│ THAMES DITTON │ ELMBRIDGE │ 470 │ 750828 │ ███████████████ │ +│ LONDON │ LAMBETH │ 10431 │ 750532 │ ███████████████ │ +│ RICKMANSWORTH │ THREE RIVERS │ 1500 │ 747029 │ ██████████████▊ │ +│ KINGS LANGLEY │ DACORUM │ 281 │ 746536 │ ██████████████▊ │ +│ HARLOW │ EPPING FOREST │ 172 │ 739423 │ ██████████████▋ │ +│ TONBRIDGE │ SEVENOAKS │ 103 │ 738740 │ ██████████████▋ │ +│ BELVEDERE │ BEXLEY │ 686 │ 736385 │ ██████████████▋ │ +│ CRANBROOK │ TUNBRIDGE WELLS │ 769 │ 734328 │ ██████████████▋ │ +│ SOLIHULL │ WARWICK │ 116 │ 733286 │ ██████████████▋ │ +│ ALDERLEY EDGE │ CHESHIRE EAST │ 357 │ 732882 │ ██████████████▋ │ +│ WELWYN │ WELWYN HATFIELD │ 404 │ 730281 │ ██████████████▌ │ +│ CHISLEHURST │ BROMLEY │ 870 │ 730279 │ ██████████████▌ │ +│ LONDON │ HARINGEY │ 6488 │ 726715 │ ██████████████▌ │ +│ AMERSHAM │ BUCKINGHAMSHIRE │ 965 │ 725426 │ ██████████████▌ │ +│ SEVENOAKS │ SEVENOAKS │ 2183 │ 725102 │ ██████████████▌ │ +│ BOURNE END │ BUCKINGHAMSHIRE │ 269 │ 724595 │ ██████████████▍ │ +│ NORTHWOOD │ HILLINGDON │ 568 │ 722436 │ ██████████████▍ │ +│ PURFLEET │ THURROCK │ 143 │ 722205 │ ██████████████▍ │ +│ SLOUGH │ BUCKINGHAMSHIRE │ 832 │ 721529 │ ██████████████▍ │ +│ INGATESTONE │ BRENTWOOD │ 301 │ 718292 │ ██████████████▎ │ +│ EPSOM │ REIGATE AND BANSTEAD │ 315 │ 709264 │ ██████████████▏ │ +│ ASHTEAD │ MOLE VALLEY │ 524 │ 708646 │ ██████████████▏ │ +│ BETCHWORTH │ MOLE VALLEY │ 155 │ 708525 │ ██████████████▏ │ +│ OXTED │ TANDRIDGE │ 645 │ 706946 │ ██████████████▏ │ +│ READING │ SOUTH OXFORDSHIRE │ 593 │ 705466 │ ██████████████ │ +│ FELTHAM │ HOUNSLOW │ 1536 │ 703815 │ ██████████████ │ +│ TUNBRIDGE WELLS │ WEALDEN │ 207 │ 703296 │ ██████████████ │ +│ LEWES │ WEALDEN │ 116 │ 701349 │ ██████████████ │ +│ OXFORD │ OXFORD │ 3656 │ 700813 │ ██████████████ │ +│ MAYFIELD │ WEALDEN │ 177 │ 698158 │ █████████████▊ │ +│ PINNER │ HARROW │ 997 │ 697876 │ █████████████▊ │ +│ LECHLADE │ COTSWOLD │ 155 │ 696262 │ █████████████▊ │ +│ WALTON-ON-THAMES │ ELMBRIDGE │ 1850 │ 690102 │ █████████████▋ │ +└──────────────────────┴────────────────────────┴───────┴─────────┴─────────────────────────────────────────────────────────────────┘ +``` + +## プロジェクションを使用してクエリを高速化しよう {#speedup-with-projections} + +[プロジェクション](../../sql-reference/statements/alter/projection.md)を使用すると、事前集約されたデータを任意の形式で保存することによって、クエリ速度を向上させることができます。この例では、年、地区、町ごとに物件の平均価格、総価格、カウントを追跡するプロジェクションを作成します。クエリ時に、ClickHouseはプロジェクションがクエリのパフォーマンスを向上させると判断した場合に、そのプロジェクションを使用します(プロジェクションを使用するために特別な操作は必要ありません - ClickHouseが有用なタイミングを判断します)。 + +### プロジェクションの作成 {#build-projection} + +`toYear(date)`, `district`, `town`によって集約プロジェクションを作成しましょう: + +```sql +ALTER TABLE uk_price_paid + ADD PROJECTION projection_by_year_district_town + ( + SELECT + toYear(date), + district, + town, + avg(price), + sum(price), + count() + GROUP BY + toYear(date), + district, + town + ) +``` + +既存のデータに対してプロジェクションを人口します。(物質化せずに、プロジェクションは新しく挿入されたデータにのみ作成されます): + +```sql +ALTER TABLE uk_price_paid + MATERIALIZE PROJECTION projection_by_year_district_town +SETTINGS mutations_sync = 1 +``` + +## パフォーマンステスト {#test-performance} + +同じ3つのクエリを再度実行してみましょう: + +### クエリ1. 年ごとの平均価格 {#average-price-projections} + +```sql +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 1000000, 80) +FROM uk_price_paid +GROUP BY year +ORDER BY year ASC +``` + +結果は同じですが、パフォーマンスが向上しています! +```response +No projection: 28 rows in set. Elapsed: 1.775 sec. Processed 27.45 million rows, 164.70 MB (15.47 million rows/s., 92.79 MB/s.) +With projection: 28 rows in set. Elapsed: 0.665 sec. Processed 87.51 thousand rows, 3.21 MB (131.51 thousand rows/s., 4.82 MB/s.) +``` + +### クエリ2. ロンドンの年ごとの平均価格 {#average-price-london-projections} + +```sql +SELECT + toYear(date) AS year, + round(avg(price)) AS price, + bar(price, 0, 2000000, 100) +FROM uk_price_paid +WHERE town = 'LONDON' +GROUP BY year +ORDER BY year ASC +``` + +結果は同じですが、クエリパフォーマンスの改善に注目してください: + +```response +No projection: 28 rows in set. Elapsed: 0.720 sec. Processed 27.45 million rows, 46.61 MB (38.13 million rows/s., 64.74 MB/s.) +With projection: 28 rows in set. Elapsed: 0.015 sec. Processed 87.51 thousand rows, 3.51 MB (5.74 million rows/s., 230.24 MB/s.) +``` + +### クエリ3. 最も高価な地域 {#most-expensive-neighborhoods-projections} + +条件(date >= '2020-01-01')は、プロジェクションの次元に一致するように修正する必要があります(`toYear(date) >= 2020`)。 + +```sql +SELECT + town, + district, + count() AS c, + round(avg(price)) AS price, + bar(price, 0, 5000000, 100) +FROM uk_price_paid +WHERE toYear(date) >= 2020 +GROUP BY + town, + district +HAVING c >= 100 +ORDER BY price DESC +LIMIT 100 +``` + +結果は同じですが、クエリパフォーマンスの改善に注目してください: + +```response +No projection: 100 rows in set. Elapsed: 0.928 sec. Processed 27.45 million rows, 103.80 MB (29.56 million rows/s., 111.80 MB/s.) +With projection: 100 rows in set. Elapsed: 0.336 sec. Processed 17.32 thousand rows, 1.23 MB (51.61 thousand rows/s., 3.65 MB/s.) +``` + +### Playgroundで試す {#playground} + +データセットは[オンラインプレイグラウンド](https://sql.clickhouse.com?query_id=TRCWH5ZETY4SEEK8ISCCAX)でも利用可能です。 diff --git a/docs/ja/getting-started/example-datasets/wikistat.md b/docs/ja/getting-started/example-datasets/wikistat.md new file mode 100644 index 00000000000..1c00e521672 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/wikistat.md @@ -0,0 +1,83 @@ +--- +sidebar_label: WikiStat +--- + +# WikiStat + +このデータセットには0.5兆件のレコードが含まれています。 + +FOSDEM 2023のビデオをご覧ください: https://www.youtube.com/watch?v=JlcI2Vfz_uk + +およびプレゼンテーション: https://presentations.clickhouse.com/fosdem2023/ + +データソース: https://dumps.wikimedia.org/other/pageviews/ + +リンクのリストを取得します: +``` shell +for i in {2015..2023}; do + for j in {01..12}; do + echo "${i}-${j}" >&2 + curl -sSL "https://dumps.wikimedia.org/other/pageviews/$i/$i-$j/" \ + | grep -oE 'pageviews-[0-9]+-[0-9]+\.gz' + done +done | sort | uniq | tee links.txt +``` + +データをダウンロードします: +``` shell +sed -r 's!pageviews-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz!https://dumps.wikimedia.org/other/pageviews/\1/\1-\2/\0!' \ + links.txt | xargs -P3 wget --continue +``` + +(これには約3日かかります) + +テーブルを作成します: + +``` sql +CREATE TABLE wikistat +( + time DateTime CODEC(Delta, ZSTD(3)), + project LowCardinality(String), + subproject LowCardinality(String), + path String CODEC(ZSTD(3)), + hits UInt64 CODEC(ZSTD(3)) +) +ENGINE = MergeTree +ORDER BY (path, time); +``` + +データをロードします: + +``` shell +clickhouse-local --query " + WITH replaceRegexpOne(_path, '^.+pageviews-(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})(\\d{2}).gz$', '\1-\2-\3 \4-\5-\6')::DateTime AS time, + extractGroups(line, '^([^ \\.]+)(\\.[^ ]+)? +([^ ]+) +(\\d+) +(\\d+)$') AS values + SELECT + time, + values[1] AS project, + values[2] AS subproject, + values[3] AS path, + (values[4])::UInt64 AS hits + FROM file('pageviews*.gz', LineAsString) + WHERE length(values) = 5 FORMAT Native +" | clickhouse-client --query "INSERT INTO wikistat FORMAT Native" +``` + +またはクリーンデータをロードします: + +``` sql +INSERT INTO wikistat WITH + parseDateTimeBestEffort(extract(_file, '^pageviews-([\\d\\-]+)\\.gz$')) AS time, + splitByChar(' ', line) AS values, + splitByChar('.', values[1]) AS projects +SELECT + time, + projects[1] AS project, + projects[2] AS subproject, + decodeURLComponent(values[2]) AS path, + CAST(values[3], 'UInt64') AS hits +FROM s3( + 'https://clickhouse-public-datasets.s3.amazonaws.com/wikistat/original/pageviews*.gz', + LineAsString) +WHERE length(values) >= 3 +``` diff --git a/docs/ja/getting-started/example-datasets/youtube-dislikes.md b/docs/ja/getting-started/example-datasets/youtube-dislikes.md new file mode 100644 index 00000000000..7ee76573aa8 --- /dev/null +++ b/docs/ja/getting-started/example-datasets/youtube-dislikes.md @@ -0,0 +1,482 @@ +--- +slug: /ja/getting-started/example-datasets/youtube-dislikes +sidebar_label: YouTube Dislikes +description: YouTube動画の嫌いの数に関するコレクションです。 +--- + +# YouTubeの嫌い数データセット + +2021年11月、YouTubeはすべての動画から公に表示される***嫌い***の数を非表示にしました。クリエイターは嫌いの数を見ることができますが、視聴者は動画が受け取った***いいね***の数だけを見ることができます。 + +:::important +このデータセットには、45.5億以上のレコードがあるため、下記のコマンドをリソースの許容範囲を超えてコピー&ペーストしないように注意してください。下記のコマンドは、[ClickHouse Cloud](https://clickhouse.cloud) の**Production**インスタンスで実行されています。 +::: + +データはJSON形式であり、[archive.org](https://archive.org/download/dislikes_youtube_2021_12_video_json_files) からダウンロードできます。同じデータをS3に提供しており、ClickHouse Cloudインスタンスに効率的にダウンロードできます。 + +ClickHouse Cloudでテーブルを作成し、データを挿入する手順は以下の通りです。 + +:::note +以下の手順は、ClickHouseのローカルインストールでも簡単に動作します。唯一の変更は、`s3cluster` の代わりに `s3` 関数を使用する点です(クラスタが設定されている場合は、`default` をクラスタの名前に変更してください)。 +::: + +## 手順 + +1. データの内容を確認しましょう。`s3cluster` テーブル関数はテーブルを返すため、結果を `DESCRIBE` できます。 + +```sql +DESCRIBE s3( + 'https://clickhouse-public-datasets.s3.amazonaws.com/youtube/original/files/*.zst', + 'JSONLines' +); +``` + +ClickHouseはJSONファイルから次のスキーマを推測します。 + +```response +┌─name────────────────┬─type───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(String) │ │ │ │ │ │ +│ fetch_date │ Nullable(String) │ │ │ │ │ │ +│ upload_date │ Nullable(String) │ │ │ │ │ │ +│ title │ Nullable(String) │ │ │ │ │ │ +│ uploader_id │ Nullable(String) │ │ │ │ │ │ +│ uploader │ Nullable(String) │ │ │ │ │ │ +│ uploader_sub_count │ Nullable(Int64) │ │ │ │ │ │ +│ is_age_limit │ Nullable(Bool) │ │ │ │ │ │ +│ view_count │ Nullable(Int64) │ │ │ │ │ │ +│ like_count │ Nullable(Int64) │ │ │ │ │ │ +│ dislike_count │ Nullable(Int64) │ │ │ │ │ │ +│ is_crawlable │ Nullable(Bool) │ │ │ │ │ │ +│ is_live_content │ Nullable(Bool) │ │ │ │ │ │ +│ has_subtitles │ Nullable(Bool) │ │ │ │ │ │ +│ is_ads_enabled │ Nullable(Bool) │ │ │ │ │ │ +│ is_comments_enabled │ Nullable(Bool) │ │ │ │ │ │ +│ description │ Nullable(String) │ │ │ │ │ │ +│ rich_metadata │ Array(Tuple(call Nullable(String), content Nullable(String), subtitle Nullable(String), title Nullable(String), url Nullable(String))) │ │ │ │ │ │ +│ super_titles │ Array(Tuple(text Nullable(String), url Nullable(String))) │ │ │ │ │ │ +│ uploader_badges │ Nullable(String) │ │ │ │ │ │ +│ video_badges │ Nullable(String) │ │ │ │ │ │ +└─────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +2. 推測されたスキーマに基づいてデータ型を整理し、主キーを追加しました。次のテーブルを定義します。 + +```sql +CREATE TABLE youtube +( + `id` String, + `fetch_date` DateTime, + `upload_date_str` String, + `upload_date` Date, + `title` String, + `uploader_id` String, + `uploader` String, + `uploader_sub_count` Int64, + `is_age_limit` Bool, + `view_count` Int64, + `like_count` Int64, + `dislike_count` Int64, + `is_crawlable` Bool, + `has_subtitles` Bool, + `is_ads_enabled` Bool, + `is_comments_enabled` Bool, + `description` String, + `rich_metadata` Array(Tuple(call String, content String, subtitle String, title String, url String)), + `super_titles` Array(Tuple(text String, url String)), + `uploader_badges` String, + `video_badges` String +) +ENGINE = MergeTree +ORDER BY (uploader, upload_date) +``` + +3. 次のコマンドは、S3ファイルから `youtube` テーブルにレコードをストリームします。 + +:::important +これは大量のデータを挿入します - 46.5億行です。もしすべてのデータセットを必要としない場合は、`LIMIT`クローズを使用して希望の行数を指定してください。 +::: + +```sql +INSERT INTO youtube +SETTINGS input_format_null_as_default = 1 +SELECT + id, + parseDateTimeBestEffortUSOrZero(toString(fetch_date)) AS fetch_date, + upload_date AS upload_date_str, + toDate(parseDateTimeBestEffortUSOrZero(upload_date::String)) AS upload_date, + ifNull(title, '') AS title, + uploader_id, + ifNull(uploader, '') AS uploader, + uploader_sub_count, + is_age_limit, + view_count, + like_count, + dislike_count, + is_crawlable, + has_subtitles, + is_ads_enabled, + is_comments_enabled, + ifNull(description, '') AS description, + rich_metadata, + super_titles, + ifNull(uploader_badges, '') AS uploader_badges, + ifNull(video_badges, '') AS video_badges +FROM s3( + 'https://clickhouse-public-datasets.s3.amazonaws.com/youtube/original/files/*.zst', + 'JSONLines' +) +``` + +この `INSERT` コマンドに関するいくつかのコメント: + +- `parseDateTimeBestEffortUSOrZero` 関数は、日付フィールドが適切な形式でない場合に便利です。`fetch_date` が適切に解析されない場合は、`0` に設定されます +- `upload_date` カラムには有効な日付が含まれていますが、"4 hours ago" のような文字列も含まれており、有効な日付とは言えません。このため、元の値を `upload_date_str` に保存し、`toDate(parseDateTimeBestEffortUSOrZero(upload_date::String))` で解析を試みます。解析に失敗した場合は、単に `0` を取得します +- `ifNull` 関数を使用して、テーブルに `NULL` 値が入らないようにしています。入力値が `NULL` の場合、`ifNull` 関数は空の文字列に設定します + +4. ClickHouse CloudのSQLコンソールに新しいタブを開くか、新しい `clickhouse-client` ウィンドウを開き、カウントが増える様子を観察します。4.56B行を挿入するには、サーバーのリソースに応じて時間がかかるでしょう。(設定を調整せずに、約4.5時間かかります。) + +```sql +SELECT formatReadableQuantity(count()) +FROM youtube +``` + +```response +┌─formatReadableQuantity(count())─┐ +│ 4.56 billion │ +└─────────────────────────────────┘ +``` + +5. データが挿入されたら、お気に入りの動画やチャンネルの嫌いの数を確認してみましょう。ClickHouseによってアップロードされた動画の数を見てみましょう。 + +```sql +SELECT count() +FROM youtube +WHERE uploader = 'ClickHouse'; +``` + +```response +┌─count()─┐ +│ 84 │ +└─────────┘ + +1 row in set. Elapsed: 0.570 sec. Processed 237.57 thousand rows, 5.77 MB (416.54 thousand rows/s., 10.12 MB/s.) +``` + +:::note +上記のクエリは、`uploader` を主キーの最初のカラムとして選んだため非常に迅速に実行されます。そのため、237k行だけを処理しました。 +::: + +6. ClickHouse動画のいいねと嫌いを見てみましょう。 + +```sql +SELECT + title, + like_count, + dislike_count +FROM youtube +WHERE uploader = 'ClickHouse' +ORDER BY dislike_count DESC; +``` + +レスポンスは次のようになります。 + +```response +┌─title────────────────────────────────────────────────────────────────────────────────────────────────┬─like_count─┬─dislike_count─┐ +│ ClickHouse v21.11 Release Webinar │ 52 │ 3 │ +│ ClickHouse Introduction │ 97 │ 3 │ +│ Casa Modelo Algarve │ 180 │ 3 │ +│ Профайлер запросов: трудный путь │ 33 │ 3 │ +│ ClickHouse в Курсометре │ 4 │ 2 │ +│ 10 Good Reasons to Use ClickHouse │ 27 │ 2 │ +... + +84 rows in set. Elapsed: 0.013 sec. Processed 155.65 thousand rows, 16.94 MB (11.96 million rows/s., 1.30 GB/s.) +``` + +7. `title` または `description` フィールドに **ClickHouse** が含まれる動画を検索します。 + +```sql +SELECT + view_count, + like_count, + dislike_count, + concat('https://youtu.be/', id) AS url, + title +FROM youtube +WHERE (title ILIKE '%ClickHouse%') OR (description ILIKE '%ClickHouse%') +ORDER BY + like_count DESC, + view_count DESC; +``` + +このクエリはすべての行を処理し、かつ2つの文字列カラムを解析する必要があります。それでも、1秒あたり4.15M行の処理速度でそこそこのパフォーマンスを得ることができます。 + +```response +1174 rows in set. Elapsed: 1099.368 sec. Processed 4.56 billion rows, 1.98 TB (4.15 million rows/s., 1.80 GB/s.) +``` + +結果は次のようになります。 + +```response +┌─view_count─┬─like_count─┬─dislike_count─┬─url──────────────────────────┬─title──────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 1919 │ 63 │ 1 │ https://youtu.be/b9MeoOtAivQ │ ClickHouse v21.10 Release Webinar │ +│ 8710 │ 62 │ 4 │ https://youtu.be/PeV1mC2z--M │ What is JDBC DriverManager? | JDBC │ +│ 3534 │ 62 │ 1 │ https://youtu.be/8nWRhK9gw10 │ CLICKHOUSE - Arquitetura Modular │ +``` + +## 質問 + +### コメントを無効にすると、実際にいいねや嫌いをクリックする可能性は低くなるでしょうか? + +コメントが無効になった場合、動画に対する感情を表現するためにいいねや嫌いをクリックする可能性は高くなるでしょうか? + +```sql +SELECT + concat('< ', formatReadableQuantity(view_range)) AS views, + is_comments_enabled, + total_clicks / num_views AS prob_like_dislike +FROM +( + SELECT + is_comments_enabled, + power(10, CEILING(log10(view_count + 1))) AS view_range, + sum(like_count + dislike_count) AS total_clicks, + sum(view_count) AS num_views + FROM youtube + GROUP BY + view_range, + is_comments_enabled +) WHERE view_range > 1 +ORDER BY + is_comments_enabled ASC, + num_views ASC; +``` + +```response +┌─views─────────────┬─is_comments_enabled─┬────prob_like_dislike─┐ +│ < 10.00 │ false │ 0.08224180712685371 │ +│ < 100.00 │ false │ 0.06346337759167248 │ +│ < 1.00 thousand │ false │ 0.03201883652987105 │ +│ < 10.00 thousand │ false │ 0.01716073540410903 │ +│ < 10.00 billion │ false │ 0.004555639481829971 │ +│ < 100.00 thousand │ false │ 0.01293351460515323 │ +│ < 1.00 billion │ false │ 0.004761811192464957 │ +│ < 1.00 million │ false │ 0.010472604018980551 │ +│ < 10.00 million │ false │ 0.00788902538420125 │ +│ < 100.00 million │ false │ 0.00579152804250582 │ +│ < 10.00 │ true │ 0.09819517478134059 │ +│ < 100.00 │ true │ 0.07403784478585775 │ +│ < 1.00 thousand │ true │ 0.03846294910067627 │ +│ < 10.00 billion │ true │ 0.005615217329358215 │ +│ < 10.00 thousand │ true │ 0.02505881391701455 │ +│ < 1.00 billion │ true │ 0.007434998802482997 │ +│ < 100.00 thousand │ true │ 0.022694648130822004 │ +│ < 100.00 million │ true │ 0.011761563746575625 │ +│ < 1.00 million │ true │ 0.020776022304589435 │ +│ < 10.00 million │ true │ 0.016917095718089584 │ +└───────────────────┴─────────────────────┴──────────────────────┘ + +22 rows in set. Elapsed: 8.460 sec. Processed 4.56 billion rows, 77.48 GB (538.73 million rows/s., 9.16 GB/s.) +``` + +コメントが有効な方が、エンゲージメント率が高いことがわかります。 + +### 時間の経過に伴う動画数の変化 - 特に注目すべきイベント + +```sql +SELECT + toStartOfMonth(toDateTime(upload_date)) AS month, + uniq(uploader_id) AS uploaders, + count() as num_videos, + sum(view_count) as view_count +FROM youtube +GROUP BY month +ORDER BY month ASC; +``` + +```response +┌──────month─┬─uploaders─┬─num_videos─┬───view_count─┐ +│ 2005-04-01 │ 5 │ 6 │ 213597737 │ +│ 2005-05-01 │ 6 │ 9 │ 2944005 │ +│ 2005-06-01 │ 165 │ 351 │ 18624981 │ +│ 2005-07-01 │ 395 │ 1168 │ 94164872 │ +│ 2005-08-01 │ 1171 │ 3128 │ 124540774 │ +│ 2005-09-01 │ 2418 │ 5206 │ 475536249 │ +│ 2005-10-01 │ 6750 │ 13747 │ 737593613 │ +│ 2005-11-01 │ 13706 │ 28078 │ 1896116976 │ +│ 2005-12-01 │ 24756 │ 49885 │ 2478418930 │ +│ 2006-01-01 │ 49992 │ 100447 │ 4532656581 │ +│ 2006-02-01 │ 67882 │ 138485 │ 5677516317 │ +│ 2006-03-01 │ 103358 │ 212237 │ 8430301366 │ +│ 2006-04-01 │ 114615 │ 234174 │ 9980760440 │ +│ 2006-05-01 │ 152682 │ 332076 │ 14129117212 │ +│ 2006-06-01 │ 193962 │ 429538 │ 17014143263 │ +│ 2006-07-01 │ 234401 │ 530311 │ 18721143410 │ +│ 2006-08-01 │ 281280 │ 614128 │ 20473502342 │ +│ 2006-09-01 │ 312434 │ 679906 │ 23158422265 │ +│ 2006-10-01 │ 404873 │ 897590 │ 27357846117 │ +``` + +[covidの周りでのアップローダーのスパイクが顕著です](https://www.theverge.com/2020/3/27/21197642/youtube-with-me-style-videos-views-coronavirus-cook-workout-study-home-beauty)。 + +### 時間の経過に伴う字幕の増加 + +音声認識の進歩により、動画に字幕を追加することがこれまで以上に簡単になりました。YouTubeが自動字幕機能を提供し始めたのは2009年の後半です。そこからジャンプがあったのでしょうか? + +```sql +SELECT + toStartOfMonth(upload_date) AS month, + countIf(has_subtitles) / count() AS percent_subtitles, + percent_subtitles - any(percent_subtitles) OVER ( + ORDER BY month ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING + ) AS previous +FROM youtube +GROUP BY month +ORDER BY month ASC; +``` + +```response +┌──────month─┬───percent_subtitles─┬────────────────previous─┐ +│ 2015-01-01 │ 0.2652653881082824 │ 0.2652653881082824 │ +│ 2015-02-01 │ 0.3147556050309162 │ 0.049490216922633834 │ +│ 2015-03-01 │ 0.32460464492371877 │ 0.009849039892802558 │ +│ 2015-04-01 │ 0.33471963051468445 │ 0.010114985590965686 │ +│ 2015-05-01 │ 0.3168087575501062 │ -0.017910872964578273 │ +│ 2015-06-01 │ 0.3162609788438222 │ -0.0005477787062839745 │ +│ 2015-07-01 │ 0.31828767677518033 │ 0.0020266979313581235 │ +│ 2015-08-01 │ 0.3045551564286859 │ -0.013732520346494415 │ +│ 2015-09-01 │ 0.311221133995152 │ 0.006665977566466086 │ +│ 2015-10-01 │ 0.30574870926812175 │ -0.005472424727030245 │ +│ 2015-11-01 │ 0.31125409712077234 │ 0.0055053878526505895 │ +│ 2015-12-01 │ 0.3190967954651779 │ 0.007842698344405541 │ +│ 2016-01-01 │ 0.32636021432496176 │ 0.007263418859783877 │ +``` + +データの結果は2009年にスパイクを示しています。どうやらその時点で、YouTubeは他の人の動画に字幕をアップロードできるコミュニティ字幕機能を削除していました。 +これにより、ハードオブヒアリングや聴覚障害のある視聴者のために、クリエイターが動画にキャプションを追加することを求める非常に効果的なキャンペーンが促されました。 + +### 時間の経過に伴うトップのアップローダー + +```sql +WITH uploaders AS + ( + SELECT uploader + FROM youtube + GROUP BY uploader + ORDER BY sum(view_count) DESC + LIMIT 10 + ) +SELECT + month, + uploader, + sum(view_count) AS total_views, + avg(dislike_count / like_count) AS like_to_dislike_ratio +FROM youtube +WHERE uploader IN (uploaders) +GROUP BY + toStartOfMonth(upload_date) AS month, + uploader +ORDER BY + month ASC, + total_views DESC; +``` + +```response +┌──────month─┬─uploader───────────────────┬─total_views─┬─like_to_dislike_ratio─┐ +│ 1970-01-01 │ T-Series │ 10957099 │ 0.022784656361208206 │ +│ 1970-01-01 │ Ryan's World │ 0 │ 0.003035559410234172 │ +│ 1970-01-01 │ SET India │ 0 │ nan │ +│ 2006-09-01 │ Cocomelon - Nursery Rhymes │ 256406497 │ 0.7005566715978622 │ +│ 2007-06-01 │ Cocomelon - Nursery Rhymes │ 33641320 │ 0.7088650914344298 │ +│ 2008-02-01 │ WWE │ 43733469 │ 0.07198856488734842 │ +│ 2008-03-01 │ WWE │ 16514541 │ 0.1230603715431997 │ +│ 2008-04-01 │ WWE │ 5907295 │ 0.2089399470159618 │ +│ 2008-05-01 │ WWE │ 7779627 │ 0.09101676560436774 │ +│ 2008-06-01 │ WWE │ 7018780 │ 0.0974184753155297 │ +│ 2008-07-01 │ WWE │ 4686447 │ 0.1263845422065158 │ +│ 2008-08-01 │ WWE │ 4514312 │ 0.08384574274791441 │ +│ 2008-09-01 │ WWE │ 3717092 │ 0.07872802579349912 │ +``` + +### 視聴数が上がるにつれて好感度がどう変化するか? + +```sql +SELECT + concat('< ', formatReadableQuantity(view_range)) AS view_range, + is_comments_enabled, + round(like_ratio, 2) AS like_ratio +FROM +( +SELECT + power(10, CEILING(log10(view_count + 1))) as view_range, + is_comments_enabled, + avg(like_count / dislike_count) as like_ratio +FROM youtube WHERE dislike_count > 0 +GROUP BY + view_range, + is_comments_enabled HAVING view_range > 1 +ORDER BY + view_range ASC, + is_comments_enabled ASC +); +``` + +```response +┌─view_range────────┬─is_comments_enabled─┬─like_ratio─┐ +│ < 10.00 │ false │ 0.66 │ +│ < 10.00 │ true │ 0.66 │ +│ < 100.00 │ false │ 3 │ +│ < 100.00 │ true │ 3.95 │ +│ < 1.00 thousand │ false │ 8.45 │ +│ < 1.00 thousand │ true │ 13.07 │ +│ < 10.00 thousand │ false │ 18.57 │ +│ < 10.00 thousand │ true │ 30.92 │ +│ < 100.00 thousand │ false │ 23.55 │ +│ < 100.00 thousand │ true │ 42.13 │ +│ < 1.00 million │ false │ 19.23 │ +│ < 1.00 million │ true │ 37.86 │ +│ < 10.00 million │ false │ 12.13 │ +│ < 10.00 million │ true │ 30.72 │ +│ < 100.00 million │ false │ 6.67 │ +│ < 100.00 million │ true │ 23.32 │ +│ < 1.00 billion │ false │ 3.08 │ +│ < 1.00 billion │ true │ 20.69 │ +│ < 10.00 billion │ false │ 1.77 │ +│ < 10.00 billion │ true │ 19.5 │ +└───────────────────┴─────────────────────┴────────────┘ +``` + +### 視聴数の分布はどうなっていますか? + +```sql +SELECT + labels AS percentile, + round(quantiles) AS views +FROM +( + SELECT + quantiles(0.999, 0.99, 0.95, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1)(view_count) AS quantiles, + ['99.9th', '99th', '95th', '90th', '80th', '70th','60th', '50th', '40th', '30th', '20th', '10th'] AS labels + FROM youtube +) +ARRAY JOIN + quantiles, + labels; +``` + +```response +┌─percentile─┬───views─┐ +│ 99.9th │ 1216624 │ +│ 99th │ 143519 │ +│ 95th │ 13542 │ +│ 90th │ 4054 │ +│ 80th │ 950 │ +│ 70th │ 363 │ +│ 60th │ 177 │ +│ 50th │ 97 │ +│ 40th │ 57 │ +│ 30th │ 32 │ +│ 20th │ 16 │ +│ 10th │ 6 │ +└────────────┴─────────┘ +``` diff --git a/docs/ja/getting-started/index.md b/docs/ja/getting-started/index.md new file mode 100644 index 00000000000..ee5df3882bd --- /dev/null +++ b/docs/ja/getting-started/index.md @@ -0,0 +1,29 @@ +--- +slug: /ja/getting-started/example-datasets/ +sidebar_position: 0 +sidebar_label: 概要 +keywords: [clickhouse, インストール, チュートリアル, サンプル, データセット] +pagination_next: 'en/tutorial' +--- + +# チュートリアルとサンプルデータセット + +ClickHouseの始め方や動作を学ぶためのリソースが豊富にあります。 + +- ClickHouseをすぐに使用開始する場合は、[クイックスタート](../quick-start.mdx)をご覧ください。 +- [ClickHouseチュートリアル](../tutorial.md)では、ニューヨーク市のタクシー乗車データセットを分析しています。 + +さらに、サンプルデータセットを使用すると、ClickHouseでの作業体験を深め、重要な技術やコツを学び、多くの強力な機能を活用する方法を見ることができます。サンプルデータセットには以下があります: + +- [英国の不動産価格支払いデータセット](../getting-started/example-datasets/uk-price-paid.md)は、興味深いSQLクエリを含む良い出発点です。 +- [ニューヨークタクシーデータ](../getting-started/example-datasets/nyc-taxi.md)では、S3からClickHouseにデータを挿入する例があります。 +- [携帯基地局データセット](../getting-started/example-datasets/cell-towers.md)は、CSVをClickHouseにインポートします。 +- [NYPD苦情データ](../getting-started/example-datasets/nypd_complaint_data.md)は、データ推論を使用してテーブル作成を簡素化する方法を示しています。 +- [「What's on the Menu?」データセット](../getting-started/example-datasets/menus.md)は、データの非正規化の例があります。 +- [Laionデータセット](../getting-started/example-datasets/laion.md)には、[近似最近傍検索インデックス](../engines/table-engines/mergetree-family/annindexes.md)の使用例があります。 +- 分析用データベースの業界基準である[TPC-H](../getting-started/example-datasets/tpch.md)、[TPC-DS](../getting-started/example-datasets/tpcds.md)、[スター・スキーマ (SSB)](../getting-started/example-datasets/star-schema.md) +- [ClickHouseへのデータ投入 - パート1](https://clickhouse.com/blog/getting-data-into-clickhouse-part-1)では、スキーマの定義と小規模なHacker Newsデータセットのロード例を紹介しています。 +- [ClickHouseへのデータ投入 - パート3 - S3の使用](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3)には、S3からデータをロードする例があります。 +- [ClickHouseでのランダムデータ生成](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse)では、上記のいずれも適合しない場合にランダムデータを生成する方法を紹介しています。 + +**チュートリアルとデータセット**メニューで、サンプルデータセットの完全なリストをご覧ください。 diff --git a/docs/ja/getting-started/install.md b/docs/ja/getting-started/install.md new file mode 100644 index 00000000000..0f48b9835f1 --- /dev/null +++ b/docs/ja/getting-started/install.md @@ -0,0 +1,426 @@ +--- +sidebar_label: インストール +keywords: [clickhouse, install, getting started, quick start] +description: ClickHouseのインストール +slug: /ja/install +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# ClickHouseをインストール + +ClickHouseをすぐに利用し始めるためには、以下の4つのオプションがあります: + +- **[ClickHouse Cloud](https://clickhouse.com/cloud/):** ClickHouseの開発者によって構築、維持、サポートされている公式のClickHouse as a Service +- **[クイックインストール](#quick-install):** ClickHouseのテストや開発のための簡単にダウンロード可能なバイナリ +- **[プロダクション向けデプロイメント](#available-installation-options):** ClickHouseは、x86-64、最新のARM (ARMv8.2-A以降)、またはPowerPC64LE CPUアーキテクチャを持つ任意のLinux、FreeBSD、またはmacOSで動作可能 +- **[Dockerイメージ](https://hub.docker.com/r/clickhouse/clickhouse-server/):** Docker Hubにある公式のDockerイメージを使用 + +## ClickHouse Cloud + +ClickHouseを迅速かつ簡単に利用し始める方法は、[ClickHouse Cloud](https://clickhouse.cloud/)で新しいサービスを作成することです。 + +## クイックインストール + +:::tip +特定のリリースバージョンのプロダクションインストールについては、以下の[インストールオプション](#available-installation-options)をご覧ください。 +::: + +Linux、macOS、FreeBSDでは: + +1. 始めたばかりでClickHouseの機能を確認したい場合、最も簡単な方法は次のコマンドを実行してClickHouseをローカルにダウンロードすることです。ご利用のオペレーティングシステム用の単一バイナリがダウンロードされ、それを使ってClickHouseサーバーや`clickhouse-client`、`clickhouse-local`、ClickHouse Keeper、その他のツールを実行できます: + + ```bash + curl https://clickhouse.com/ | sh + ``` + +2. [clickhouse-local](../operations/utilities/clickhouse-local.md)を起動するために次のコマンドを実行します: + + ```bash + ./clickhouse + ``` + + `clickhouse-local`は、ローカルおよびリモートファイルをClickHouseの強力なSQLを使って処理することを可能にし、設定が不要です。テーブルデータは一時的な場所に保存され、`clickhouse-local`を再起動すると前に作成されたテーブルは利用できなくなります。 + + 代わりに次のコマンドでClickHouseサーバーを開始することもできます... + + ```bash + ./clickhouse server + ``` + + ...そして、`clickhouse-client`でサーバに接続するために新しいターミナルを開きます: + + ```bash + ./clickhouse client + ``` + + ```response + ./clickhouse client + ClickHouse client version 24.5.1.117 (official build). + Connecting to localhost:9000 as user default. + Connected to ClickHouse server version 24.5.1. + + local-host :) + ``` + + テーブルデータは現在のディレクトリに保存され、ClickHouseサーバーを再起動した後も利用可能です。必要に応じて、`./clickhouse server`に追加のコマンドライン引数として`-C config.xml`を渡し、設定ファイルで追加の設定を提供することができます。利用可能なすべての設定は[ここ](../operations/settings/settings.md)および[設定ファイルテンプレートの例](https://github.com/ClickHouse/ClickHouse/blob/master/programs/server/config.xml)に文書化されています。 + + ClickHouseにSQLコマンドを送信する準備が整いました! + +:::tip +[Quick Start](/docs/ja/quick-start.mdx)で、テーブルの作成とデータの挿入の手順を詳しく説明しています。 +::: + +## プロダクション向けデプロイメント {#available-installation-options} + +ClickHouseのプロダクション向けデプロイメントには、以下のインストールオプションから選択してください。 + +### DEBパッケージからのインストール {#install-from-deb-packages} + +DebianまたはUbuntuでは公式の事前コンパイル済みの`deb`パッケージを使用することをお勧めします。パッケージをインストールするために次のコマンドを実行してください: + +#### Debianリポジトリの設定 +```bash +sudo apt-get install -y apt-transport-https ca-certificates curl gnupg +curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg + +echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee \ + /etc/apt/sources.list.d/clickhouse.list +sudo apt-get update +``` + +#### ClickHouseサーバーとクライアントのインストール +```bash +sudo apt-get install -y clickhouse-server clickhouse-client +``` + +#### ClickHouseサーバーの起動 + +```bash +sudo service clickhouse-server start +clickhouse-client # または、パスワードを設定している場合は "clickhouse-client --password" +``` + +
+古いディストリビューションのdebパッケージインストール法 + +```bash +sudo apt-get install apt-transport-https ca-certificates dirmngr +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754 +echo "deb https://packages.clickhouse.com/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 + +sudo service clickhouse-server start +clickhouse-client # または、パスワードを設定している場合は "clickhouse-client --password" +``` + +
+ +必要に応じて、`stable`を`lts`に置き換えて、ニーズに基づいた異なる[リリース種別](/knowledgebase/production)を使用することができます。 + +また、[こちら](https://packages.clickhouse.com/deb/pool/main/c/)からパッケージを手動でダウンロードしてインストールすることも可能です。 + +#### スタンドアロンClickHouse Keeperのインストール + +:::tip +プロダクション環境では、ClickHouse Keeperを専用のノード上で実行することを[強く推奨します](/docs/ja/operations/tips.md#L143-L144)。テスト環境でClickHouse ServerとClickHouse Keeperを同じサーバーで実行することを決定した場合は、ClickHouse ServerにClickHouse Keeperが含まれているので、ClickHouse Keeperをインストールする必要はありません。このコマンドは、スタンドアロンのClickHouse Keeperサーバーにのみ必要です。 +::: + +```bash +sudo apt-get install -y clickhouse-keeper +``` + +#### ClickHouse Keeperの有効化と開始 + +```bash +sudo systemctl enable clickhouse-keeper +sudo systemctl start clickhouse-keeper +sudo systemctl status clickhouse-keeper +``` + +#### パッケージ {#packages} + +- `clickhouse-common-static` — ClickHouseのコンパイル済みバイナリファイルをインストールします。 +- `clickhouse-server` — `clickhouse-server`のシンボリックリンクを作成し、デフォルトのサーバー設定をインストールします。 +- `clickhouse-client` — `clickhouse-client`および他のクライアント関連ツールのシンボリックリンクを作成し、クライアント設定ファイルをインストールします。 +- `clickhouse-common-static-dbg` — デバッグ情報付きのClickHouseコンパイル済みバイナリファイルをインストールします。 +- `clickhouse-keeper` - 専用のClickHouse KeeperノードにClickHouse Keeperをインストールするために使用されます。ClickHouseサーバーと同じサーバーでClickHouse Keeperを実行している場合、このパッケージをインストールする必要はありません。ClickHouse KeeperとデフォルトのClickHouse Keeper設定ファイルをインストールします。 + +:::info +特定のバージョンのClickHouseをインストールする必要がある場合は、すべてのパッケージを同じバージョンでインストールする必要があります: `sudo apt-get install clickhouse-server=21.8.5.7 clickhouse-client=21.8.5.7 clickhouse-common-static=21.8.5.7` +::: + +### RPMパッケージからのインストール {#from-rpm-packages} + +CentOS、RedHat、およびすべてのrpmベースのLinuxディストリービューションでは、公式の事前コンパイル済み`rpm`パッケージを使用することをお勧めします。 + +#### RPMリポジトリの設定 +まず、公式リポジトリを追加する必要があります: + +```bash +sudo yum install -y yum-utils +sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo +``` + +`zypper`パッケージマネージャーを使用するシステム(openSUSE, SLES)の場合: + +```bash +sudo zypper addrepo -r https://packages.clickhouse.com/rpm/clickhouse.repo -g +sudo zypper --gpg-auto-import-keys refresh clickhouse-stable +``` + +その後、任意の`yum install`を`zypper install`に置き換えることができます。特定のバージョンを指定するには、パッケージ名の末尾に`-$VERSION`を追加します。例:`clickhouse-client-22.2.2.22`。 + +#### ClickHouseサーバーとクライアントのインストール + +```bash +sudo yum install -y clickhouse-server clickhouse-client +``` + +#### ClickHouseサーバーの起動 + +```bash +sudo systemctl enable clickhouse-server +sudo systemctl start clickhouse-server +sudo systemctl status clickhouse-server +clickhouse-client # または "clickhouse-client --password"、パスワードを設定している場合 +``` + +#### スタンドアロンClickHouse Keeperのインストール + +:::tip +プロダクション環境では、ClickHouse Keeperを専用のノード上で実行することを[強く推奨します](/docs/ja/operations/tips.md#L143-L144)。テスト環境でClickHouse ServerとClickHouse Keeperを同じサーバーで実行することを決定した場合は、ClickHouse ServerにClickHouse Keeperが含まれているので、ClickHouse Keeperをインストールする必要はありません。このコマンドは、スタンドアロンのClickHouse Keeperサーバーにのみ必要です。 +::: + +```bash +sudo yum install -y clickhouse-keeper +``` + +#### ClickHouse Keeperの有効化と開始 + +```bash +sudo systemctl enable clickhouse-keeper +sudo systemctl start clickhouse-keeper +sudo systemctl status clickhouse-keeper +``` + +必要に応じて、`stable`を`lts`に置き換えて、ニーズに基づいて異なる[リリース種別](/knowledgebase/production)を使用することができます。 + +その後、これらのコマンドを実行してパッケージをインストールします: + +```bash +sudo yum install clickhouse-server clickhouse-client +``` + +また、[こちら](https://packages.clickhouse.com/rpm/stable)からパッケージを手動でダウンロードしてインストールすることも可能です。 + +### Tgzアーカイブからのインストール {#from-tgz-archives} + +`deb`や`rpm`パッケージのインストールが不可能なすべてのLinuxディストリービューションでは、公式の事前コンパイル済みの`tgz`アーカイブを使用することをお勧めします。 + +必要なバージョンは、リポジトリhttps://packages.clickhouse.com/tgz/ から`curl`または`wget`を使用してダウンロードできます。その後、ダウンロードされたアーカイブを解凍し、インストールスクリプトでインストールします。最新の安定版の例: + +```bash +LATEST_VERSION=$(curl -s https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/utils/list-versions/version_date.tsv | \ + grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -V -r | head -n 1) +export LATEST_VERSION + +case $(uname -m) in + x86_64) ARCH=amd64 ;; + aarch64) ARCH=arm64 ;; + *) echo "Unknown architecture $(uname -m)"; exit 1 ;; +esac + +for PKG in clickhouse-common-static clickhouse-common-static-dbg clickhouse-server clickhouse-client clickhouse-keeper +do + curl -fO "https://packages.clickhouse.com/tgz/stable/$PKG-$LATEST_VERSION-${ARCH}.tgz" \ + || curl -fO "https://packages.clickhouse.com/tgz/stable/$PKG-$LATEST_VERSION.tgz" +done + +tar -xzvf "clickhouse-common-static-$LATEST_VERSION-${ARCH}.tgz" \ + || tar -xzvf "clickhouse-common-static-$LATEST_VERSION.tgz" +sudo "clickhouse-common-static-$LATEST_VERSION/install/doinst.sh" + +tar -xzvf "clickhouse-common-static-dbg-$LATEST_VERSION-${ARCH}.tgz" \ + || tar -xzvf "clickhouse-common-static-dbg-$LATEST_VERSION.tgz" +sudo "clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh" + +tar -xzvf "clickhouse-server-$LATEST_VERSION-${ARCH}.tgz" \ + || tar -xzvf "clickhouse-server-$LATEST_VERSION.tgz" +sudo "clickhouse-server-$LATEST_VERSION/install/doinst.sh" configure +sudo /etc/init.d/clickhouse-server start + +tar -xzvf "clickhouse-client-$LATEST_VERSION-${ARCH}.tgz" \ + || tar -xzvf "clickhouse-client-$LATEST_VERSION.tgz" +sudo "clickhouse-client-$LATEST_VERSION/install/doinst.sh" +``` + +プロダクション環境では、最新の`stable`-バージョンを使用することをお勧めします。バージョン番号はGitHubのページhttps://github.com/ClickHouse/ClickHouse/tags の`-stable`の接尾辞で確認できます。 + +### Dockerイメージからのインストール {#from-docker-image} + +Docker内でClickHouseを実行するには、[Docker Hub](https://hub.docker.com/r/clickhouse/clickhouse-server/)のガイドに従ってください。これらのイメージは内部で公式の`deb`パッケージを使用します。 + +## 非プロダクションデプロイメント(上級) + +### ソースからのコンパイル {#from-sources} + +ClickHouseを手動でコンパイルするには、[Linux](/docs/ja/development/build.md)または[macOS](/docs/ja/development/build-osx.md)の指示に従ってください。 + +パッケージをコンパイルしてインストールするか、インストールせずにプログラムを使用することができます。 + + クライアント: /programs/clickhouse-client + サーバー: /programs/clickhouse-server + +データおよびメタデータフォルダを手動で作成し、希望のユーザーに対して`chown`する必要があります。これらのパスはサーバーの設定ファイル(src/programs/server/config.xml)で変更でき、デフォルトでは以下のようになっています: + + /var/lib/clickhouse/data/default/ + /var/lib/clickhouse/metadata/default/ + +Gentooでは、単に`emerge clickhouse`コマンドを使用してソースからClickHouseをインストールできます。 + +### CIで生成されたバイナリのインストール + +ClickHouseの継続的インテグレーション(CI)インフラストラクチャは、[ClickHouseのリポジトリ](https://github.com/clickhouse/clickhouse/)の各コミットのために特別にビルドされたビルドを生成します。例えば、[サニタイズ](https://github.com/google/sanitizers)されたビルド、最適化されていない(デバッグ)ビルド、クロスコンパイルされたビルドなどです。これらのビルドは通常、開発中のみ役立ちますが、特定の状況ではユーザーにとっても興味深い場合があります。 + +:::note +ClickHouseのCIは時間とともに進化するため、CIで生成されたビルドをダウンロードするための正確な手順は変わるかもしれません。 +また、CIは古いビルドアーティファクトを削除することがあり、それによりそれらのダウンロードができなくなることがあります。 +::: + +例えば、ClickHouse v23.4のaarch64バイナリをダウンロードするには、以下の手順に従います: + +- リリースv23.4のGitHubプルリクエストを見つけます:[Release pull request for branch 23.4](https://github.com/ClickHouse/ClickHouse/pull/49238) +- "Commits"をクリックし、特定のインストールしたいバージョンに対応する"Update autogenerated version to 23.4.2.1 and contributors"のようなコミットをクリックします。 +- CIチェックのリストを開くため、緑のチェック / 黄色のドット / 赤いバツをクリックします。 +- リスト内の"Builds"の横にある"Details"をクリックし、[このページ](https://s3.amazonaws.com/clickhouse-test-reports/46793/b460eb70bf29b19eadd19a1f959b15d186705394/clickhouse_build_check/report.html)のようなページを開きます。 +- コンパイラ="clang-*-aarch64"の行を見つけます - 複数の行があります。 +- これらのビルドのアーティファクトをダウンロードします。 + +[SSE3](https://ja.wikipedia.org/wiki/SSE3)サポートなしの非常に古いx86-64システムまたは[ARMv8.1-A](https://ja.wikipedia.org/wiki/AArch64#ARMv8.1-A)サポートなしの古いARMシステムのためのバイナリをダウンロードするには、プルリクエストを開いてCIチェック"BuilderBinAmd64Compat"、それぞれ"BuilderBinAarch64V80Compat"を見つけます。その後、"Details"をクリックしてビルドフォルダを開き、最後までスクロールし、メッセージ"Notice: Build URLs https://s3.amazonaws.com/clickhouse/builds/PRs/.../.../binary_aarch64_v80compat/clickhouse" を見つけます。そのリンクをクリックしてビルドをダウンロードできます。 + +### macOSのみ:Homebrewでのインストール + +macOSで[homebrew](https://brew.sh/)を使用してClickHouseをインストールするには、ClickHouse [community homebrew formula](https://formulae.brew.sh/cask/clickhouse)を参照してください。 + +## 起動 {#launch} + +サーバーをデーモンとして開始するには、次のコマンドを実行します: + +```bash +$ clickhouse start +``` + +ClickHouseを実行する他の方法もあります: + +```bash +$ sudo service clickhouse-server start +``` + +`service`コマンドがない場合は、このように実行します: + +```bash +$ sudo /etc/init.d/clickhouse-server start +``` + +`systemctl`コマンドがある場合は、このように実行します: + +```bash +$ sudo systemctl start clickhouse-server.service +``` + +`/var/log/clickhouse-server/`ディレクトリでログを参照します。 + +サーバーが起動しない場合は、`/etc/clickhouse-server/config.xml`ファイル内の設定を確認してください。 + +サーバーをコンソールから手動で起動することもできます: + +```bash +$ clickhouse-server --config-file=/etc/clickhouse-server/config.xml +``` + +この場合、ログはコンソールに出力されるため、開発中には便利です。設定ファイルが現在のディレクトリにある場合、`--config-file`パラメータを指定する必要はありません。デフォルトで`./config.xml`が使用されます。 + +ClickHouseはアクセス制限の設定をサポートしています。これらは`users.xml`ファイル(`config.xml`の横)に含まれています。 +デフォルトでは、パスワードなしで`default`ユーザーに対するどこからでものアクセスが許可されています。`user/default/networks`を参照してください。 +詳細については、[「設定ファイル」](/docs/ja/operations/configuration-files.md)のセクションを参照してください。 + +サーバーを起動した後、コマンドラインクライアントを使用して接続できます: + +```bash +$ clickhouse-client +``` + +デフォルトでは、`localhost:9000`に`default`ユーザーで、パスワードなしで接続します。`--host`引数を使用してリモートサーバーに接続することもできます。 + +ターミナルはUTF-8エンコーディングを使用する必要があります。 +詳細については、[「コマンドラインクライアント」](/docs/ja/interfaces/cli.md)のセクションを参照してください。 + +例: + +``` +$ ./clickhouse-client +ClickHouse client version 0.0.18749. +Connecting to localhost:9000. +Connected to ClickHouse server version 0.0.18749. + +:) SELECT 1 + +SELECT 1 + +┌─1─┐ +│ 1 │ +└───┘ + +1 rows in set. Elapsed: 0.003 sec. + +:) +``` + +**おめでとうございます、システムは正常に動作しています!** + +実験を続けるには、テストデータセットの一つをダウンロードするか、[チュートリアル](/docs/ja/tutorial.md)を進めてください。 + +## セルフマネージドClickHouseに対する推奨事項 + +ClickHouseは、x86-64、ARM、またはPowerPC64LE CPUアーキテクチャを持つ任意のLinux、FreeBSD、またはmacOSで実行可能です。 + +ClickHouseは利用可能なハードウェアリソースを全て使用してデータを処理します。 + +ClickHouseは、少ないコア数で高いクロックレートよりも、低いクロックレートで多くのコア数を持つ方がより効率的に動作する傾向があります。 + +非トリビアルなクエリを実行するには、最低でも4GBのRAMを使用することをお勧めします。ClickHouseサーバーははるかに少ないRAMでも実行可能ですが、その場合、クエリはよく中断されます。 + +必要なRAMの容量は通常次の要因に依存します: + +- クエリの複雑さ +- クエリで処理されるデータ量 + +必要なRAMの容量を計算するには、[GROUP BY](/docs/ja/sql-reference/statements/select/group-by.md#select-group-by-clause)、[DISTINCT](/docs/ja/sql-reference/statements/select/distinct.md#select-distinct)、[JOIN](/docs/ja/sql-reference/statements/select/join.md#select-join)など、使用している操作の一時データのサイズを見積もります。 + +メモリ消費を削減するために、ClickHouseは一時データを外部ストレージにスワップすることができます。詳細については、[外部メモリのGROUP BY](/docs/ja/sql-reference/statements/select/group-by.md#select-group-by-in-external-memory)を参照してください。 + +プロダクション環境では、オペレーティングシステムのスワップファイルを無効にすることをお勧めします。 + +ClickHouseバイナリのインストールには少なくとも2.5GBのディスクスペースが必要です。 + +データの保存に必要なストレージ容量は以下に基づいて別途計算できます + +- データ容量の見積もり + + データのサンプルを取得し、その平均行サイズを計算します。そして、保存する予定の行数をかけます。 + +- データ圧縮係数 + + データ圧縮係数を見積もるには、ClickHouseにデータのサンプルをロードし、実際のデータサイズを保存されたテーブルサイズと比較します。例えば、クリックストリームデータは通常6-10倍に圧縮されます。 + +データを保存するために必要な最終ボリュームを計算するには、圧縮係数をデータ容量の見積もりに適用します。複数のレプリカにデータを保存する計画がある場合は、その見積もり体積をレプリカ数で掛けます。 + +分散ClickHouseデプロイメント(クラスタリング)では、少なくとも10Gクラスのネットワーク接続を推奨します。 + +ネットワーク帯域幅は、大量の中間データを持つ分散クエリの処理にとって重要です。また、ネットワーク速度はレプリケーションプロセスにも影響を与えます。 diff --git a/docs/ja/getting-started/playground.md b/docs/ja/getting-started/playground.md new file mode 100644 index 00000000000..9b49eb56cdf --- /dev/null +++ b/docs/ja/getting-started/playground.md @@ -0,0 +1,46 @@ +--- +sidebar_label: ClickHouse Playground +sidebar_position: 2 +keywords: [clickhouse, playground, getting, started, docs] +description: ClickHouse Playgroundを使用すると、サーバーやクラスタを設定せずにクエリを即座に実行して、ClickHouseを試すことができます。 +slug: /ja/getting-started/playground +--- + +# ClickHouse Playground + +[ClickHouse Playground](https://sql.clickhouse.com)を使用すると、サーバーやクラスタを設定せずにクエリを即座に実行して、ClickHouseを試すことができます。 +Playgroundにはいくつかのサンプルデータセットが用意されています。 + +Playgroundに対してクエリを行うには、任意のHTTPクライアントを使用できます。例えば、[curl](https://curl.haxx.se)や[wget](https://www.gnu.org/software/wget/)を使用する方法や、[JDBC](../interfaces/jdbc.md)や[ODBC](../interfaces/odbc.md)ドライバを使用して接続を設定する方法があります。ClickHouseをサポートするソフトウェア製品に関する詳細情報は[こちら](../integrations/index.mdx)で確認できます。 + +## 認証情報 {#credentials} + +| パラメータ | 値 | +|:-------------------|:-----------------------------------| +| HTTPSエンドポイント | `https://play.clickhouse.com:443/` | +| ネイティブTCPエンドポイント | `play.clickhouse.com:9440` | +| ユーザー | `explorer` または `play` | +| パスワード | (空) | + +## 制限事項 {#limitations} + +クエリは読み取り専用のユーザーとして実行されます。それはいくつかの制限を意味します: + +- DDLクエリは許可されていません +- INSERTクエリは許可されていません + +サービスの使用にはクォータもあります。 + +## 例 {#examples} + +`curl`を使用したHTTPSエンドポイントの例: + +``` bash +curl "https://play.clickhouse.com/?user=explorer" --data-binary "SELECT 'Play ClickHouse'" +``` + +[CLI](../interfaces/cli.md)を使用したTCPエンドポイントの例: + +``` bash +clickhouse client --secure --host play.clickhouse.com --user explorer +``` diff --git a/docs/ja/guides/_category_.yml b/docs/ja/guides/_category_.yml new file mode 100644 index 00000000000..5c42e1659b1 --- /dev/null +++ b/docs/ja/guides/_category_.yml @@ -0,0 +1,7 @@ +position: 10 +label: 'User Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: User Guides \ No newline at end of file diff --git a/docs/ja/guides/best-practices/_category_.yml b/docs/ja/guides/best-practices/_category_.yml new file mode 100644 index 00000000000..92e91f1a2b1 --- /dev/null +++ b/docs/ja/guides/best-practices/_category_.yml @@ -0,0 +1,7 @@ +label: 'Best Practices' +collapsible: true +collapsed: true +link: + type: generated-index + title: Best Practices + slug: /ja/optimize diff --git a/docs/ja/guides/best-practices/asyncinserts.md b/docs/ja/guides/best-practices/asyncinserts.md new file mode 100644 index 00000000000..c496e0a2d37 --- /dev/null +++ b/docs/ja/guides/best-practices/asyncinserts.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/asynchronous-inserts +sidebar_label: 非同期挿入 +title: 非同期挿入 (async_insert) +description: データのバッチ処理の代替として非同期挿入を使用します。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/asyncinserts.md'; + + diff --git a/docs/ja/guides/best-practices/avoidmutations.md b/docs/ja/guides/best-practices/avoidmutations.md new file mode 100644 index 00000000000..75bcc5f7c6d --- /dev/null +++ b/docs/ja/guides/best-practices/avoidmutations.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoid-mutations +sidebar_label: 変更を避ける +title: 変更を避ける +description: 変更とは、テーブルデータを操作するALTERクエリを指します +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidmutations.md'; + + diff --git a/docs/ja/guides/best-practices/avoidnullablecolumns.md b/docs/ja/guides/best-practices/avoidnullablecolumns.md new file mode 100644 index 00000000000..a41db85a1f3 --- /dev/null +++ b/docs/ja/guides/best-practices/avoidnullablecolumns.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoid-nullable-columns +sidebar_label: Nullableカラムを避ける +title: Nullableカラムを避ける +description: Nullableカラム (例. Nullable(String)) は、別のUInt8型のカラムを作成します。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidnullablecolumns.md'; + + diff --git a/docs/ja/guides/best-practices/avoidoptimizefinal.md b/docs/ja/guides/best-practices/avoidoptimizefinal.md new file mode 100644 index 00000000000..a1c4b62fe74 --- /dev/null +++ b/docs/ja/guides/best-practices/avoidoptimizefinal.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoidoptimizefinal +sidebar_label: Optimize Final を避ける +title: Optimize Final を避ける +description: OPTIMIZE TABLE ... FINAL クエリを使用すると、データパーツの予定外のマージが開始されます。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidoptimizefinal.md'; + + diff --git a/docs/ja/guides/best-practices/bulkinserts.md b/docs/ja/guides/best-practices/bulkinserts.md new file mode 100644 index 00000000000..9bf909f236c --- /dev/null +++ b/docs/ja/guides/best-practices/bulkinserts.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/bulk-inserts +sidebar_label: バルクインサート +title: バルクインサート +description: 各インサートに多くのデータを含む小さな量のインサートを送信することにより、必要な書き込みの数を減らすことができます。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/bulkinserts.md'; + + diff --git a/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw b/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw new file mode 100644 index 00000000000..1821354d0db --- /dev/null +++ b/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw @@ -0,0 +1,19542 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 3688, + "versionNonce": 1885549462, + "isDeleted": false, + "id": "JujSi_9FMwHGpiseeR6Pq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1203.8431808894738, + "y": 2259.9076998425608, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 510203220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2750, + "versionNonce": 558627018, + "isDeleted": false, + "id": "4v4G5fa8LsgmBY1fV3eB8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1367.3214111138498, + "y": 2312.4838749918317, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 238006100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4194, + "versionNonce": 1680101590, + "isDeleted": false, + "id": "eBqrP7alszLkhR7-HE38l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1672.3728413331926, + "y": 2262.570754923138, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 1875763948, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4458, + "versionNonce": 463884170, + "isDeleted": false, + "id": "IJJBrumtrc4gF7aKrwG5x", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1538.6583488423046, + "y": 2550.4398955481392, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 2097591020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3255, + "versionNonce": 340772374, + "isDeleted": false, + "id": "IJ67qOmNDRUeCm_VNfIk9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1835.8510715575694, + "y": 2315.1469300724093, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 936967636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3518, + "versionNonce": 1846005322, + "isDeleted": false, + "id": "MikIyU8HjODp4w-mQISZD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1702.1365790666812, + "y": 2603.01607069741, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 36964076, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1863, + "versionNonce": 1525433290, + "isDeleted": false, + "id": "KrOLtjXovP7Is50-wbg18", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -557.3339866730645, + "y": 236.12036171209593, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 188284116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1445, + "versionNonce": 1271018966, + "isDeleted": false, + "id": "UeB9NWeMGCQXeUe2lCAWU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -542.7033598073182, + "y": 241.54356773500197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 1527334740, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2238, + "versionNonce": 154150614, + "isDeleted": false, + "id": "8mYC83f5VvbPLI-yIYBU3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -126.84302469271188, + "y": 233.46108768035958, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 207581676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2177, + "versionNonce": 2120931722, + "isDeleted": false, + "id": "Bht8HpauLhirSeUtcRjy0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -406.64541368082337, + "y": 235.03246827065914, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1305925588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2386, + "versionNonce": 359717910, + "isDeleted": false, + "id": "Yv3nLcJhPtttBvVPPlFyy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.264061029748, + "y": 278.51971904240395, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 825754604, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1327, + "versionNonce": 1537939530, + "isDeleted": false, + "id": "SRVgvQb-at-BnHwkjToPM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 278.5444605833959, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 556499156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1393, + "versionNonce": 1516824918, + "isDeleted": false, + "id": "GBWMlsbQ1sujbbrh-8JYd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.4191550403508, + "y": 278.5444605833959, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2045290092, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1152, + "versionNonce": 200638218, + "isDeleted": false, + "id": "H1xyPIEbOagl1G_DSe72g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.17546551877626, + "y": 279.88635938517615, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1932281428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1247, + "versionNonce": 2076511690, + "isDeleted": false, + "id": "b1vRTMQiTxXSto2OcOcPK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -313.8086570057543, + "y": 242.05538220263549, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 603478996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1374, + "versionNonce": 1496517590, + "isDeleted": false, + "id": "V9QJgTEebJECbyDcq-jTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -109.27665599496709, + "y": 242.19861136930336, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 2066414444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1519, + "versionNonce": 1345635466, + "isDeleted": false, + "id": "KhmuFmBQHujMa8ZL0LLr4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -617.2890876251264, + "y": 280.8859916716468, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1571144020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1607, + "versionNonce": 231678230, + "isDeleted": false, + "id": "-o7rDZdth2Kl2tp81M-t0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 352.0904546111291, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 160476652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1739, + "versionNonce": 1392485194, + "isDeleted": false, + "id": "URpkC6epTPHue-Gy4AMzq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 365.87028415658494, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 394950356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1748, + "versionNonce": 414617174, + "isDeleted": false, + "id": "yukRr3dksYWcx0rCE0cGY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 379.0397553104307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1436291180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1605, + "versionNonce": 1585490442, + "isDeleted": false, + "id": "EULzLCZ_8TlBk-8gEuLA-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.25817566351316, + "y": 350.8605638678378, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1849457748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1721, + "versionNonce": 1186878358, + "isDeleted": false, + "id": "iMYzXSO9YDT88kwz4NF45", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.971243845333, + "y": 364.64039341329186, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2132222700, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1730, + "versionNonce": 1236457674, + "isDeleted": false, + "id": "ilT3qpQslCI41RVgsuW0j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.94630394148544, + "y": 377.8098645671376, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2073154004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1651, + "versionNonce": 35352790, + "isDeleted": false, + "id": "Tvi68Js3tnAwYJ22qRX9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.55856101636357, + "y": 350.9095695496558, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 478930284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1767, + "versionNonce": 1412509578, + "isDeleted": false, + "id": "FRBfSbIIMAV6kMeyQUJRU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.271629198181586, + "y": 364.6893990951099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 782268244, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1776, + "versionNonce": 644015638, + "isDeleted": false, + "id": "5_zWdXezblXxt56bdia25", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.24668929433403, + "y": 377.8588702489556, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1665423340, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2321, + "versionNonce": 1596086358, + "isDeleted": false, + "id": "LA3nFky31RVfhRBcslVH4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 575.1456375869698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 292807788, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2496, + "versionNonce": 1561231370, + "isDeleted": false, + "id": "j28_69JFnGAJAoQGcK6b-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.0912377566881, + "y": 310.7438026230182, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1534847060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1478, + "versionNonce": 555802006, + "isDeleted": false, + "id": "ySEupHwfgAbGF3hAZ7Cai", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 310.69410644246267, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 416577260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1541, + "versionNonce": 605417162, + "isDeleted": false, + "id": "ji68W23umOuZksmvJ0KmV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.0954782201794, + "y": 310.69410644246267, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1711521236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1305, + "versionNonce": 1134344918, + "isDeleted": false, + "id": "123Pg3w3GTv_keglZ0AT4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.85178869860488, + "y": 310.78079495324994, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 998160748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1665, + "versionNonce": 1572963722, + "isDeleted": false, + "id": "drH7Kr3YWRju0ofIRqQ98", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -616.965410804955, + "y": 312.9795218393964, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 1274340180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3273, + "versionNonce": 2099965974, + "isDeleted": false, + "id": "sChxNs_gAXJI6YFism3yU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.9875910027811, + "y": 343.24660435953115, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 1153215468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2297, + "versionNonce": 1934378058, + "isDeleted": false, + "id": "tfCJnX3i0ttIwwjeH5kvA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 343.3180019289756, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1940216020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1774222678, + "isDeleted": false, + "id": "OsaSuhVYPHcwx0Hcpk8Du", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.9088502858591, + "y": 343.3180019289756, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 110644844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2108, + "versionNonce": 1855007498, + "isDeleted": false, + "id": "JCZ6eR_oN-M_nMan445MD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.66516076428456, + "y": 343.4046904397629, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 145432148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2487, + "versionNonce": 1588748950, + "isDeleted": false, + "id": "SFaRmSxjQRRA6otLU6Ibq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -617.7787828706347, + "y": 345.6749390456788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 31170796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3018, + "versionNonce": 1789579082, + "isDeleted": false, + "id": "izleLozEH60YtPZ0_4lRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.4999757505483, + "y": 406.8097365897543, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 1381519060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2114, + "versionNonce": 94642774, + "isDeleted": false, + "id": "JsOCpO-jnibFs1OcqeVh4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 406.85181624738294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1496823916, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2182, + "versionNonce": 803624458, + "isDeleted": false, + "id": "ijXUuHYP037tzyeFDiwST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.1971214931342, + "y": 406.85181624738294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1099912276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 1930, + "versionNonce": 1759078294, + "isDeleted": false, + "id": "A-8nDx9IIO_12ny9wwj4F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.95343197155967, + "y": 406.9385047581702, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1627245292, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2293, + "versionNonce": 964887754, + "isDeleted": false, + "id": "zq8k4l8VeCN8x0fpZneZx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -645.0670540779098, + "y": 408.9974807923321, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 248097236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3129, + "versionNonce": 1471415510, + "isDeleted": false, + "id": "zYq9Uzws3j3rR4Dlaa-Wq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.9383902085276, + "y": 438.4908009328081, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 1532857708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2216, + "versionNonce": 823909258, + "isDeleted": false, + "id": "RB7PbAouTLqMord5vTy4o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 438.6393928731747, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1025331028, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2283, + "versionNonce": 1674115606, + "isDeleted": false, + "id": "9Sx86LDkpEBi9-tAE1OYH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.46343458466583, + "y": 438.6393928731747, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 698417132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2032, + "versionNonce": 1424742986, + "isDeleted": false, + "id": "Q1hVICdpxjpA-TpY3mT7q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.2197450630913, + "y": 438.72608138396197, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2095072468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2383, + "versionNonce": 604850006, + "isDeleted": false, + "id": "Y6sQUv6HzTPY_Znc-pe_C", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -646.3333671694432, + "y": 441.1230963910306, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 1943151212, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3343, + "versionNonce": 1674445066, + "isDeleted": false, + "id": "pSdVkx-JCZCbW2AaCn6b2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5041391910064, + "y": 472.0585767803765, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 61377108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2360, + "versionNonce": 148237462, + "isDeleted": false, + "id": "TzpGxKfIKXri2vQMeRpjG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 471.2731522084487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1354429676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2431, + "versionNonce": 155013066, + "isDeleted": false, + "id": "x4cGtDtaJvmdED8em0Pw5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.13975776449445, + "y": 471.2731522084487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1682710484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4200, + "versionNonce": 1230292618, + "isDeleted": false, + "id": "zozpqYhRkzeeMU0ikG6eP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.1173989820096, + "y": 504.35506380067744, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1726022996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3188, + "versionNonce": 942161686, + "isDeleted": false, + "id": "JbuAVVyndg8-5g8_NCWpn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 504.0210574467409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 932948460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3255, + "versionNonce": 1825531210, + "isDeleted": false, + "id": "pT7Typ6370QAD38T3X6eS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.95312983017504, + "y": 504.0210574467409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1623014100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3000, + "versionNonce": 373025878, + "isDeleted": false, + "id": "vQ3inejchrSeZ2AWeZWIu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.7094403086005, + "y": 504.10774595752815, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 15174764, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 1973, + "versionNonce": 1829252106, + "isDeleted": false, + "id": "fZv6GHb4VbpNcPwdkTyMp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 512.7602890221027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 209109076, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2093, + "versionNonce": 1743253910, + "isDeleted": false, + "id": "hx-SuBqjgW3C9Or-bL6AX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 526.5401185675586, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 731061996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2102, + "versionNonce": 1610226378, + "isDeleted": false, + "id": "DpMdJ4dmyx09dYrnJvqA1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 539.7095897214043, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1642304980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1976, + "versionNonce": 1214336726, + "isDeleted": false, + "id": "DeROn1uuPG85tiF18TBW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.29863196989163, + "y": 511.53039827881145, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1344823660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2092, + "versionNonce": 1681928586, + "isDeleted": false, + "id": "9KMNsFmrs22g01qbUz1ta", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.01170015171147, + "y": 525.3102278242654, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1847180116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2101, + "versionNonce": 607978518, + "isDeleted": false, + "id": "6hcOgqYZE3lUomd17T6nW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.9867602478639, + "y": 538.4796989781113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1710314476, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2022, + "versionNonce": 219508810, + "isDeleted": false, + "id": "YCNqiMxfjALt9EreZ-yKK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.59901732274204, + "y": 511.57940396062946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 728707284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2138, + "versionNonce": 225448278, + "isDeleted": false, + "id": "OXfozcWoiqhSGKCU1Hmg0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.31208550456006, + "y": 525.3592335060835, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1794635372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2147, + "versionNonce": 1314182922, + "isDeleted": false, + "id": "l6-hMAr309y50JC_EkVt-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.287145600712506, + "y": 538.5287046599293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1501165140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3442, + "versionNonce": 1908999754, + "isDeleted": false, + "id": "fbKOtlBZosE_Epj0LGU1J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.3536609985991, + "y": 566.8484278789748, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 1800543444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 803789654, + "isDeleted": false, + "id": "VPqBPUxprXiingIFf8JDQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -529.3967708021288, + "y": 567.1453752050109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 1074383468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2556, + "versionNonce": 1143319818, + "isDeleted": false, + "id": "dTHxGLWOgqk17Hx3UwT3y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.2375777995136, + "y": 567.1453752050109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1981768276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2301, + "versionNonce": 1008664726, + "isDeleted": false, + "id": "uC0mwB22cKgjWOSevLyo-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.99388827793905, + "y": 567.2320637157982, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 129866988, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2643, + "versionNonce": 1505721290, + "isDeleted": false, + "id": "_mqoVPE9JSTzREp5T8dG9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -657.1075103842874, + "y": 569.6673152033059, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 304609236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2500, + "versionNonce": 1088323030, + "isDeleted": false, + "id": "8EtD87pVLZb0pKqInpBFc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 593.9195813138276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2119376748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2684, + "versionNonce": 548500106, + "isDeleted": false, + "id": "fIMxIOQ3E11BdKz_KPav9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 612.6940606892772, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 461495636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2565, + "versionNonce": 322720534, + "isDeleted": false, + "id": "cwja6HbJzF6dcjGqa-A_C", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.50335408198544, + "y": 575.2323587542312, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1007964652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2742, + "versionNonce": 196514122, + "isDeleted": false, + "id": "a7Al4JRo8KwkgN0MT2RC6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.14285216735834, + "y": 594.0063024810895, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2072187604, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2926, + "versionNonce": 497909846, + "isDeleted": false, + "id": "t1ep_LukFQOJz9MXnq8NV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.22308047687284, + "y": 612.7807818565386, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1074476140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2628, + "versionNonce": 2116671498, + "isDeleted": false, + "id": "6dpUWsXiT3CRU9-ItI3D-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -47.032550987864056, + "y": 575.2076191708977, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 12687444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2805, + "versionNonce": 872875414, + "isDeleted": false, + "id": "HFN_vKhbDdt1tBcH00Zoo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -46.67204907323696, + "y": 593.981562897756, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 402769644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2989, + "versionNonce": 939935434, + "isDeleted": false, + "id": "F3Qobhx90sdkVSapPLJMG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -46.75227738275146, + "y": 612.7560422732051, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 924020180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3812, + "versionNonce": 1736303318, + "isDeleted": false, + "id": "NYj9aBqmdnd0QkM5t1PRh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -562.3729087027565, + "y": 662.9696997320676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 142739820, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2747, + "versionNonce": 1105649034, + "isDeleted": false, + "id": "haU1kCbuW9_yKTt7njxao", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 662.7064140116544, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1066308436, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2815, + "versionNonce": 1520900118, + "isDeleted": false, + "id": "iOO-ri_0EZbneLndaR4kx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.58428023053386, + "y": 662.7064140116544, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 886438892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2560, + "versionNonce": 1493605450, + "isDeleted": false, + "id": "3coSLb6snj1VyI5z2Ia0s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.34059070895933, + "y": 662.7931025224416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 680069332, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 2872, + "versionNonce": 360162646, + "isDeleted": false, + "id": "Isl5zcmy3QLTxg7Jallf0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -688.4542128153113, + "y": 664.4630077725648, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1191681644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3821, + "versionNonce": 1530954506, + "isDeleted": false, + "id": "FgGIPYssRtFfTkRMcC8jg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5398085980914, + "y": 695.1366236269752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1167642196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2891, + "versionNonce": 1497664150, + "isDeleted": false, + "id": "El7_MD7l_3Rz2hy94pvfT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 694.8011592721494, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 400617708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2968, + "versionNonce": 856658378, + "isDeleted": false, + "id": "izUvnLeMtdeHiI-B7FdlQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.2606034103625, + "y": 694.8011592721494, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 127132628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2706, + "versionNonce": 1958922198, + "isDeleted": false, + "id": "qWWGTTonKNG0ixxengBjq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.01691388878794, + "y": 694.8878477829367, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1458303852, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4632, + "versionNonce": 1133430922, + "isDeleted": false, + "id": "5L9of5WhUYZ_2lFeHj6JD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.5456420361772, + "y": 727.2901364314722, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 1418742100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3714, + "versionNonce": 403135766, + "isDeleted": false, + "id": "gIRP2yDZc1Vh8WnVtQXMA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 727.2404402509167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 846374380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3787, + "versionNonce": 1417226058, + "isDeleted": false, + "id": "QbzfI5ZJV6Pyr7GHKnT7Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.1726927735215, + "y": 727.2404402509167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1608777428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3529, + "versionNonce": 679955030, + "isDeleted": false, + "id": "TSWOv_g9-_zzQjxGLRo_d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.83028595446854, + "y": 727.327128761704, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2139031660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2505, + "versionNonce": 2116660746, + "isDeleted": false, + "id": "IHUs8beuhrshsf6LM0eoq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 736.2343500529055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 35980372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 353865622, + "isDeleted": false, + "id": "G5QE9Mv_aOMeSkAveeLtY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 750.0141795983614, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1641749228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2630, + "versionNonce": 362503370, + "isDeleted": false, + "id": "Al--4u4IeZdZp8gRnyuyd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 763.1836507522071, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 287922644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2506, + "versionNonce": 703409366, + "isDeleted": false, + "id": "5Qw4nqbMq5pB0ZW7MsKlv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.41947761575875, + "y": 735.0044593096143, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1947262316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 409547658, + "isDeleted": false, + "id": "y7DjbHb9TFInBC5YRRJJx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.2192343083659, + "y": 748.697600344281, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 939982676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2630, + "versionNonce": 1688019478, + "isDeleted": false, + "id": "jhWOMEZvMo-zetSTiA70d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.19429440451836, + "y": 761.8670714981267, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1869238252, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2552, + "versionNonce": 416166474, + "isDeleted": false, + "id": "kp5LK0_W1jhR0HgWCPYm_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.71986296861098, + "y": 735.0534649914323, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1326707924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2667, + "versionNonce": 1209823062, + "isDeleted": false, + "id": "W4fLIuwBgqmfKLS5I2C4A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.519619661214506, + "y": 748.746606026099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1408332396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2676, + "versionNonce": 698702090, + "isDeleted": false, + "id": "e45V1H8SOju3H8_-NF20T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.49467975736695, + "y": 761.9160771799448, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 870726228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3965, + "versionNonce": 119523402, + "isDeleted": false, + "id": "ZnC7tHpssZlkQgmqBbV0J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5309018875965, + "y": 790.8637445869201, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1257431252, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2643, + "versionNonce": 1373059414, + "isDeleted": false, + "id": "dRsyzG0tTDBmsOlm-CVSh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 986138220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2803, + "versionNonce": 1163144970, + "isDeleted": false, + "id": "hQEVfBC20A6tLeLrtnrz-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.4173630996046, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 755476052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2524, + "versionNonce": 210869910, + "isDeleted": false, + "id": "nxWW7ddUB-VhTZ6k3Y-ha", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -121.9637281246728, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1164679404, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2763, + "versionNonce": 1976417738, + "isDeleted": false, + "id": "73I2nurlCUI2VwgThPYvr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -687.4423437187958, + "y": 792.6451422112608, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1265089492, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 2763, + "versionNonce": 878635722, + "isDeleted": false, + "id": "fdKBZ7au4Vj_VTNmlJ4Gr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1226.25436119329, + "y": 2312.7902346924393, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 677157356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4081, + "versionNonce": 533148694, + "isDeleted": false, + "id": "0Ts5CSD3IRrXDLrhNs1q4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1218.1612083608773, + "y": 2322.6710607030027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1832570964, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1731, + "versionNonce": 176570442, + "isDeleted": false, + "id": "fxzfvu7a_64f2hx0KYuJG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1234.893413221989, + "y": 2325.6982559087382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 886574828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 1964, + "versionNonce": 1913497238, + "isDeleted": false, + "id": "sVCTgV1Z59OdhAzemKrPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1284.6998679744986, + "y": 2366.1726333954784, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1494862676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2080, + "versionNonce": 1005991370, + "isDeleted": false, + "id": "5roG5Q9aoFAAG4mcy70-q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1284.9867997926806, + "y": 2379.9524629409343, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 918176748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2089, + "versionNonce": 1309172694, + "isDeleted": false, + "id": "8RlyVhOIyCfaOI3NrZA-8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1285.0117396965281, + "y": 2393.12193409478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1542275284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2177, + "versionNonce": 1073802378, + "isDeleted": false, + "id": "g-m-TZYzjeOuydK8GIFFo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.1452214491503, + "y": 2364.8560541414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 354608748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2293, + "versionNonce": 1849260310, + "isDeleted": false, + "id": "dwI2bk25tX3miPELYgnXl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.4321532673305, + "y": 2378.635883686854, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1874200148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2302, + "versionNonce": 1191627594, + "isDeleted": false, + "id": "GcxWQOfFzJPaZMSpY8jYa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.457093171178, + "y": 2391.8053548406997, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 324221164, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3329, + "versionNonce": 706078294, + "isDeleted": false, + "id": "yR8U23V91OOx3k7ZBaUn0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1218.6059789310486, + "y": 2354.7248390325167, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1766464468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3259, + "versionNonce": 1947205834, + "isDeleted": false, + "id": "Y1uKvcu_fQ1ipQYHr-DKd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1219.5715563357744, + "y": 2414.47266065032, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 468905452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2085, + "versionNonce": 853622294, + "isDeleted": false, + "id": "ANkNzPYuy9_BsBmF5gR3K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1304.1605892330197, + "y": 2272.1357878225444, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 109, + "height": 25, + "seed": 2011577428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.mrk" + }, + { + "type": "text", + "version": 1397, + "versionNonce": 1432999498, + "isDeleted": false, + "id": "NNvdCe6tZ_vz6Z_tnQi20", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1111.9723597745635, + "y": 2417.483954693459, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 233399020, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "KuL0PHE0rSQ-wquK_N1zX", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 1507, + "versionNonce": 1870465878, + "isDeleted": false, + "id": "b4uVaa_f56sO1ESMw0Fqe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1140.9489222745635, + "y": 2325.0280395148866, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 704877012, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "VAVd-jpfcqV8eCE3akPbS", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 1514, + "versionNonce": 455900426, + "isDeleted": false, + "id": "sAsS8YABjrT8epHSPTWeZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.3942347745635, + "y": 2358.2233520148866, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 387327340, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2402, + "versionNonce": 578245386, + "isDeleted": false, + "id": "KDUCZDbXse_FRGUztJgjm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1378.4478062031349, + "y": 2487.5513452564546, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 80, + "seed": 1198692204, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "9Yi3inzhOmDgl8CzNHG8c", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "locations of \ngranules in \ndecompressed \nblock data", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "locations of \ngranules in \ndecompressed \nblock data" + }, + { + "type": "text", + "version": 1895, + "versionNonce": 183263690, + "isDeleted": false, + "id": "f1apoAydNSroVvnSulrwE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.5369059055165, + "y": 2322.8962733318504, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1790515820, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1991, + "versionNonce": 836433878, + "isDeleted": false, + "id": "zT-D3QT33UpfTco9LOGnC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.9805333564964, + "y": 2355.417974720738, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 2088036052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1992, + "versionNonce": 659658890, + "isDeleted": false, + "id": "EPKgp0Rg9M8BZANi_0hg5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.8725370329673, + "y": 2414.622937956032, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 60912724, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "9Yi3inzhOmDgl8CzNHG8c", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1833, + "versionNonce": 1654230294, + "isDeleted": false, + "id": "qPOOlO6NgpPAbUkodneif", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1234.975937768261, + "y": 2358.382129132503, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1740502868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 1846, + "versionNonce": 1466038090, + "isDeleted": false, + "id": "gE8lHM6phGgTWynmC_Kii", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1236.8095774741437, + "y": 2417.4538203089733, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 80754004, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ywAsFjf4WphpubAH3rMk8", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 1095989846, + "isDeleted": false, + "id": "jLKzuR8Qsnbedkqd6ubFX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1240.5627665338557, + "y": 2488.401778753716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 80, + "seed": 1693051092, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ywAsFjf4WphpubAH3rMk8", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "locations of \nblocks in \ncompressed \ncolumn file", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "locations of \nblocks in \ncompressed \ncolumn file" + }, + { + "type": "arrow", + "version": 605, + "versionNonce": 1097686230, + "isDeleted": false, + "id": "ywAsFjf4WphpubAH3rMk8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1285.2502665338557, + "y": 2479.960372503716, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 1.15625, + "height": 36.359375, + "seed": 800950252, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jLKzuR8Qsnbedkqd6ubFX", + "focus": -0.09129231596882527, + "gap": 8.44140625 + }, + "endBinding": { + "elementId": "gE8lHM6phGgTWynmC_Kii", + "focus": 0.08240871417353615, + "gap": 6.147177194742653 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.15625, + -36.359375 + ] + ] + }, + { + "type": "arrow", + "version": 642, + "versionNonce": 2090291734, + "isDeleted": false, + "id": "9Yi3inzhOmDgl8CzNHG8c", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1429.144797783857, + "y": 2482.054122503716, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 1.8125, + "height": 37.75, + "seed": 2088078292, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KDUCZDbXse_FRGUztJgjm", + "focus": -0.053841688355087666, + "gap": 5.497222752738708 + }, + "endBinding": { + "elementId": "EPKgp0Rg9M8BZANi_0hg5", + "focus": 0.07415983734863017, + "gap": 9.681184547684097 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.8125, + -37.75 + ] + ] + }, + { + "type": "text", + "version": 2044, + "versionNonce": 953090634, + "isDeleted": false, + "id": "BDZXPQPNfobP6Y1LAJpE-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 961.8791727838568, + "y": 2290.826583441216, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1778324948, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "VAVd-jpfcqV8eCE3akPbS", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of \ngranule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of \ngranule 0" + }, + { + "type": "text", + "version": 2104, + "versionNonce": 1095802710, + "isDeleted": false, + "id": "ZL-_7v_-1qmBR8x-OIALx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 962.5735087213568, + "y": 2357.472091253716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 86, + "height": 40, + "seed": 1716250836, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of\ngranule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of\ngranule 1" + }, + { + "type": "text", + "version": 2119, + "versionNonce": 822880522, + "isDeleted": false, + "id": "kdg1HDiQaDiOfK4DmsKb4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 957.4231180963568, + "y": 2429.444747503716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 40, + "seed": 753034860, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "KuL0PHE0rSQ-wquK_N1zX", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of \ngranule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of \ngranule 1082" + }, + { + "type": "arrow", + "version": 574, + "versionNonce": 1408124054, + "isDeleted": false, + "id": "VAVd-jpfcqV8eCE3akPbS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1063.2444071588568, + "y": 2309.8069950027675, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 76.0693359375, + "height": 21.84099656669332, + "seed": 1565253844, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "BDZXPQPNfobP6Y1LAJpE-", + "focus": -0.49646516033010085, + "gap": 7.365234375 + }, + "endBinding": { + "elementId": "b4uVaa_f56sO1ESMw0Fqe", + "focus": -0.28431140681285944, + "gap": 1.6351791782067266 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.0693359375, + 21.84099656669332 + ] + ] + }, + { + "type": "arrow", + "version": 496, + "versionNonce": 1551267786, + "isDeleted": false, + "id": "6gkr09UfyYbzjuh6y6WGW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1057.0920634088568, + "y": 2374.6900936406937, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 79.6728515625, + "height": 7.038138873516118, + "seed": 1989969132, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZL-_7v_-1qmBR8x-OIALx", + "focus": 0.07433430851635363, + "gap": 8.5185546875 + }, + "endBinding": { + "elementId": "sAsS8YABjrT8epHSPTWeZ", + "focus": 0.2730369878904534, + "gap": 6.629319803206727 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 79.6728515625, + -7.038138873516118 + ] + ] + }, + { + "type": "arrow", + "version": 520, + "versionNonce": 639975894, + "isDeleted": false, + "id": "KuL0PHE0rSQ-wquK_N1zX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1062.0822977838568, + "y": 2448.316108846946, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 45.2099609375, + "height": 17.944919312151114, + "seed": 623537260, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kdg1HDiQaDiOfK4DmsKb4", + "focus": 0.4938361234900873, + "gap": 1.6591796875 + }, + "endBinding": { + "elementId": "NNvdCe6tZ_vz6Z_tnQi20", + "focus": 0.5864545974028658, + "gap": 4.680101053206727 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 45.2099609375, + -17.944919312151114 + ] + ] + }, + { + "type": "rectangle", + "version": 3269, + "versionNonce": 724102794, + "isDeleted": false, + "id": "moibOvP6fFX4zdVL20rM-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1694.7840216370093, + "y": 2315.453289773017, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 648483284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4586, + "versionNonce": 722114326, + "isDeleted": false, + "id": "g92zEEZnwdPvo_P_-md5F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1686.6908688045967, + "y": 2325.3341157835803, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1214948716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2236, + "versionNonce": 1373539658, + "isDeleted": false, + "id": "cKaF5cHMfO-LulnkBmt2Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.423073665708, + "y": 2328.361310989316, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1158526804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2469, + "versionNonce": 722682966, + "isDeleted": false, + "id": "AjuUpQuP3SqjoJPuKbYAw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.229528418218, + "y": 2368.835688476056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 625678316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2585, + "versionNonce": 905073674, + "isDeleted": false, + "id": "Somfi5AGJX6HJu3bfi9Pt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.5164602364, + "y": 2382.615518021512, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2055449812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2594, + "versionNonce": 403982742, + "isDeleted": false, + "id": "SvxSIHuh65r3mvLJkaD6J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.5414001402476, + "y": 2395.7849891753576, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 578370156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2682, + "versionNonce": 1499415242, + "isDeleted": false, + "id": "cjQ4gA8-X4lRtYOwtv4cG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.67488189287, + "y": 2367.5191092219775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1218376276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2798, + "versionNonce": 1631758038, + "isDeleted": false, + "id": "PHG97rTLYCp7k2dLcA6rQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.9618137110501, + "y": 2381.2989387674315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1254034668, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2807, + "versionNonce": 1187010954, + "isDeleted": false, + "id": "5nujjwIfxJVHvTBivkCnt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.9867536148977, + "y": 2394.4684099212773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 238389204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3834, + "versionNonce": 1194548246, + "isDeleted": false, + "id": "1Q_axHfCOBS1GjaHQCs2i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1687.135639374768, + "y": 2357.3878941130943, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1067880300, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3765, + "versionNonce": 2102433866, + "isDeleted": false, + "id": "cBo0Wx5inLHFRPfMjwfzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1688.1012167794931, + "y": 2417.1357157308976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 1599958356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2613, + "versionNonce": 802908502, + "isDeleted": false, + "id": "JIY9Hq_-m2I6qkbYp1Wy9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1786.6902496767389, + "y": 2274.798842903122, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 78, + "height": 25, + "seed": 1635369452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ULR.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ULR.mrk" + }, + { + "type": "text", + "version": 1903, + "versionNonce": 1558904586, + "isDeleted": false, + "id": "692pq1q3--XyG8ad3v2EM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1580.5020202182827, + "y": 2420.1470097740366, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1567400660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2013, + "versionNonce": 2056244886, + "isDeleted": false, + "id": "7_0oMsXxAqKxXzPyrseDf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1609.4785827182827, + "y": 2327.691094595464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 2000856172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2020, + "versionNonce": 302681546, + "isDeleted": false, + "id": "3jcOzdCSifcUTDoTcHBp9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1611.9238952182827, + "y": 2360.886407095464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 251209812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2400, + "versionNonce": 30033034, + "isDeleted": false, + "id": "onyXlikavkJekRt1K3Uz2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.0665663492355, + "y": 2325.559328412428, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 211646828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2496, + "versionNonce": 173121814, + "isDeleted": false, + "id": "J12iAWfevSlm-X53PwCsU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.5101938002153, + "y": 2358.0810298013157, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 824320852, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2498, + "versionNonce": 904209226, + "isDeleted": false, + "id": "H0Aojn7Cbid8n-zJl7wuz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.4021974766865, + "y": 2417.2859930366094, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 67333100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2338, + "versionNonce": 1625886294, + "isDeleted": false, + "id": "FTl5JDMlzhHwP6SFf5gFL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.50559821198, + "y": 2361.0451842130806, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1093310676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2352, + "versionNonce": 1219897866, + "isDeleted": false, + "id": "cciu-Eq8n1zaIXfNLDuy_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.3392379178629, + "y": 2420.116875389551, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 788991596, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "rectangle", + "version": 3533, + "versionNonce": 1165743574, + "isDeleted": false, + "id": "kDp1vUzo53V2bnJFP5m6f", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1561.0695291461213, + "y": 2603.322430398018, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 1109606868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4849, + "versionNonce": 1094032010, + "isDeleted": false, + "id": "EfmM2TO1h8pHboiroHkzx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1552.9763763137087, + "y": 2613.203256408581, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1443460460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2499, + "versionNonce": 1248766742, + "isDeleted": false, + "id": "7sTy4KJa5r6AG57VMjMJH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1569.70858117482, + "y": 2616.2304516143167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 25421652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2732, + "versionNonce": 1500887370, + "isDeleted": false, + "id": "5BVCBYipLqCGV4KwURJLl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.51503592733, + "y": 2656.704829101057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 915400684, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2848, + "versionNonce": 1825888342, + "isDeleted": false, + "id": "DCe58NiaSdoX4SxL1P4w9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.801967745512, + "y": 2670.484658646513, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 682876116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2857, + "versionNonce": 432275466, + "isDeleted": false, + "id": "wOx6B4E19tLezqgf4ifcZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.8269076493596, + "y": 2683.6541298003585, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1386482284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2945, + "versionNonce": 1417895318, + "isDeleted": false, + "id": "nq3gFFNtxlsTWAA1crsjv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1761.9603894019817, + "y": 2655.3882498469784, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 558441044, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3061, + "versionNonce": 773549770, + "isDeleted": false, + "id": "Xruoa6-io7ONSRS7gAn6u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1762.247321220162, + "y": 2669.1680793924324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1292885228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3070, + "versionNonce": 1722759894, + "isDeleted": false, + "id": "1jCJgvbE4dpIUWUmvcyJO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1762.2722611240094, + "y": 2682.337550546278, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 840546260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4097, + "versionNonce": 186058122, + "isDeleted": false, + "id": "lp3VUJp0FzXRqPPVLe9oK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1553.42114688388, + "y": 2645.257034738095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1599954796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4029, + "versionNonce": 434991126, + "isDeleted": false, + "id": "Y3Hv1leLPB9ftKYg2JQoC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1554.3867242886051, + "y": 2705.0048563558994, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 1463524692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2925, + "versionNonce": 1509016650, + "isDeleted": false, + "id": "U_YNezHPtlhhytJHsUkRS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1622.9757571858506, + "y": 2562.667983528123, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 137, + "height": 25, + "seed": 30839276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.mrk" + }, + { + "type": "text", + "version": 2167, + "versionNonce": 1244855638, + "isDeleted": false, + "id": "q2y_BWoYnHnQT1YoF6rRc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1446.7875277273945, + "y": 2708.0161503990385, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 436523732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2277, + "versionNonce": 1686547210, + "isDeleted": false, + "id": "kxJbHQHgV7VjPN4DOvHgb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1475.7640902273945, + "y": 2615.560235220465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 327513196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 215278230, + "isDeleted": false, + "id": "2s7GiUTdLZp2rzJT-zg4h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1478.2094027273945, + "y": 2648.755547720465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 1762351188, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2663, + "versionNonce": 22067658, + "isDeleted": false, + "id": "ArTZN_DLN8dAr1tYATOc6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.3520738583472, + "y": 2613.428469037429, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1881484756, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2759, + "versionNonce": 76029910, + "isDeleted": false, + "id": "NPxsQofyq94BAoH3DuXlu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.7957013093271, + "y": 2645.9501704263166, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1919699308, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2762, + "versionNonce": 2137714826, + "isDeleted": false, + "id": "KUsQT8a6jgoQDMhQnyg9K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.6877049857983, + "y": 2705.155133661611, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1885885268, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2601, + "versionNonce": 895595798, + "isDeleted": false, + "id": "xucS1SX2Yzdks84pgrya7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1569.791105721092, + "y": 2648.9143248380815, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1735932908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2616, + "versionNonce": 311447370, + "isDeleted": false, + "id": "Ioj3J7QMkVeqdmcKHNf1J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1571.6247454269749, + "y": 2707.9860160145527, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 405457108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "rectangle", + "version": 3652, + "versionNonce": 1058788874, + "isDeleted": false, + "id": "1nLDuL3RqTev92zDCVP8m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.8597484916295, + "y": 1416.3311926854121, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 327.69087921627045, + "seed": 1306112748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2637, + "versionNonce": 834398102, + "isDeleted": false, + "id": "zq4wPnaPzVb_m1wUKkCjm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1031.1284655601517, + "y": 1469.262670549996, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 256.8020156926412, + "seed": 1543520724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1916, + "versionNonce": 1174963402, + "isDeleted": false, + "id": "nWaENb6CnQyiTWDg9a9hD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1059.6608301829942, + "y": 1474.491105171026, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 343700844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 2864, + "versionNonce": 1615234262, + "isDeleted": false, + "id": "g-v0LTRlAltrmO3R1gQxs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1179.8936026582955, + "y": 1468.0006805326339, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 257.10693993506436, + "seed": 1472259924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3628, + "versionNonce": 284253066, + "isDeleted": false, + "id": "4RNpuOxj3Y_EsXnqZTd00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.035312727739, + "y": 1555.069967148795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 782428140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1804, + "versionNonce": 906721814, + "isDeleted": false, + "id": "bnCToVqZE3jDASSnyxV_5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.6637849499616, + "y": 1557.5388286291002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 793828564, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "737.456.303", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "737.456.303" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 504453706, + "isDeleted": false, + "id": "Z3gSU-HYdw_t21YATxu0B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.9450349499616, + "y": 1557.1716411291002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1347881580, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://e.mail.yandsearch...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://e.mail.yandsearch..." + }, + { + "type": "text", + "version": 1712, + "versionNonce": 167757654, + "isDeleted": false, + "id": "Pr8x5pVhR1yUB9GUd2kDh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1281.4688444737708, + "y": 1474.9162311278724, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 1279664724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2183, + "versionNonce": 1816363274, + "isDeleted": false, + "id": "dHaFoPNhZPZw_Gjd-48Ow", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.5739723413603, + "y": 1666.0379920471532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 476241132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2299, + "versionNonce": 209218710, + "isDeleted": false, + "id": "-C1-I0-w82I75mQBRCwZx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.8609041595423, + "y": 1679.817821592609, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1970714580, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2308, + "versionNonce": 1728237514, + "isDeleted": false, + "id": "U6zYV0O2mB5wGgJsBfewu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.8858440633899, + "y": 1692.9872927464548, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1280335724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2272, + "versionNonce": 455764438, + "isDeleted": false, + "id": "rIuVZJ0YUkG1z2etFf2dh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.019325816012, + "y": 1664.7214127930747, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 653827412, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2388, + "versionNonce": 1382696586, + "isDeleted": false, + "id": "gRqDM_KFA3VHJE--9uJxO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.3062576341922, + "y": 1678.5012423385288, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1483313644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2397, + "versionNonce": 355122966, + "isDeleted": false, + "id": "JFhKt6LgsMy3pFeENoH23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.3311975380398, + "y": 1691.6707134923745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1780601556, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3274, + "versionNonce": 926213450, + "isDeleted": false, + "id": "I6vQn5c2MwYmaX-VftQl9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.4800832979104, + "y": 1587.7924035665446, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 532182124, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1967, + "versionNonce": 787377238, + "isDeleted": false, + "id": "7hIRlRKfFo3ty2ih84Qgi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1046.229649270133, + "y": 1588.5151712968495, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 763910228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "742.414.531", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "742.414.531" + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1321053194, + "isDeleted": false, + "id": "1hPKYuTkUId6YkuSpyfxg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1185.4065095122896, + "y": 1589.2651712968493, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 268895980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://rabota.ru/yandex ...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://rabota.ru/yandex ..." + }, + { + "type": "text", + "version": 1982, + "versionNonce": 1989521802, + "isDeleted": false, + "id": "nJ-9UjLwPoInnMqmksQ-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.168884776353, + "y": 1424.8306501506904, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1552628716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 1593, + "versionNonce": 951775306, + "isDeleted": false, + "id": "Vw9m1zH2jyO1i8swYgB9Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 933.7019328914253, + "y": 1557.8933981665618, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1175772780, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 174", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 174" + }, + { + "type": "text", + "version": 1598, + "versionNonce": 2028114262, + "isDeleted": false, + "id": "Rgf2QWPlwJTU_8iG8htEh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 929.2683391414253, + "y": 1591.0887106665618, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 2030014036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 175", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 175" + }, + { + "type": "rectangle", + "version": 3525, + "versionNonce": 1375995786, + "isDeleted": false, + "id": "dC8hsfcGRr0jcIjv3ibmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1021.8892189983467, + "y": 1620.9376351795495, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 408662484, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2210, + "versionNonce": 1170837014, + "isDeleted": false, + "id": "vVOWnf9vIGOpZx4RJKQPP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.7598787205693, + "y": 1621.6604029098542, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1909458284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 2300, + "versionNonce": 2146338378, + "isDeleted": false, + "id": "dvJr3RpPSD41jrVF33-mb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1183.6778474705693, + "y": 1622.4104029098542, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1462654804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://fanati-avtomobile...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://fanati-avtomobile..." + }, + { + "type": "text", + "version": 1852, + "versionNonce": 551246678, + "isDeleted": false, + "id": "lxMcju7oD2UblqnUiAf9g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 927.6774748418616, + "y": 1624.2339422795671, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 990148588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 176" + }, + { + "type": "rectangle", + "version": 3633, + "versionNonce": 1905995018, + "isDeleted": false, + "id": "xq1Hmll1rth4pLVjjbbdW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.9749704864412, + "y": 1654.2083755069298, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 1167634284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2316, + "versionNonce": 1791066262, + "isDeleted": false, + "id": "QjtKD_-C8GCB2RWZJmP16", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.703656777351, + "y": 1654.0731166685464, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 18697556, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "text", + "version": 2412, + "versionNonce": 1015348170, + "isDeleted": false, + "id": "E92tV1UsZ7nLG7fSb64ls", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.7635989586638, + "y": 1655.6811432372335, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 606593516, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://image&img_url=htt...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://image&img_url=htt..." + }, + { + "type": "text", + "version": 1959, + "versionNonce": 1999699414, + "isDeleted": false, + "id": "qxI9BByIy3N9yQghVQ32o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 930.7632263299561, + "y": 1657.5046826069474, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 66, + "height": 20, + "seed": 2083554004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 177", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 177" + }, + { + "type": "text", + "version": 2130, + "versionNonce": 960257418, + "isDeleted": false, + "id": "zkF-yXsWdsHC_jlId5-Qq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1496.4859621281198, + "y": 1620.3001948044835, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 20, + "seed": 1553655788, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + } + ], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 818, + "versionNonce": 1298765846, + "isDeleted": false, + "id": "BltJEdlS1EvGPQMbe6C4b", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1448.435180878119, + "y": 1628.874413554484, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.55859375, + "height": 1.9140625, + "seed": 1635879020, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "startBinding": { + "elementId": "dC8hsfcGRr0jcIjv3ibmH", + "focus": -0.6036155620159408, + "gap": 3.6708435085597557 + }, + "endBinding": { + "elementId": "zkF-yXsWdsHC_jlId5-Qq", + "focus": -0.25250806832497674, + "gap": 4.4921875000009095 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.55859375, + 1.9140625 + ] + ] + }, + { + "type": "rectangle", + "version": 4392, + "versionNonce": 2097838934, + "isDeleted": false, + "id": "aEhttCUFLsQDizHodrGDT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.2711033584119, + "y": 1001.4133599014169, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 2101334498, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3341, + "versionNonce": 191761674, + "isDeleted": false, + "id": "QzdbT54E-9in4lHVmuDIN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1030.539820426934, + "y": 1054.4659315160006, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 1422406974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2804, + "versionNonce": 873242774, + "isDeleted": false, + "id": "T_Hmeit4TgUlSfzg9HsX-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1059.0721850497766, + "y": 1059.6943661370306, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 1659848098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3615, + "versionNonce": 1492900810, + "isDeleted": false, + "id": "UJcRC5CuQD3LDBq0mi8sv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1179.304957525078, + "y": 1053.0867539986384, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 2060115326, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4470, + "versionNonce": 706223574, + "isDeleted": false, + "id": "7OXC2HtxOCeebeqv5O7_8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.4466675945214, + "y": 1094.2732281148, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 301613410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2639, + "versionNonce": 962712202, + "isDeleted": false, + "id": "D0tiBmfqizIVi8Hymauea", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1083.313421066744, + "y": 1097.7668755264176, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1389264318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2741, + "versionNonce": 1682043670, + "isDeleted": false, + "id": "i7IvaB8aEXlUaOKzYFRgr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.356389816744, + "y": 1096.5168755264176, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1706018082, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3mRchANiENPPmEHMVvXfw", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2600, + "versionNonce": 1868230986, + "isDeleted": false, + "id": "Lvfk1WNKvo2jjpdLWCPpz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1280.8801993405532, + "y": 1060.119492093877, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 1643386366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2890, + "versionNonce": 2097094742, + "isDeleted": false, + "id": "Nwb7n8BjXHjw-llru2plk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.9853272081427, + "y": 1138.2412530131578, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2004799714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3006, + "versionNonce": 776091658, + "isDeleted": false, + "id": "EwOEIL9JGNJuxmfcdtBt2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.2722590263247, + "y": 1152.0210825586137, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1631364670, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3015, + "versionNonce": 2015667606, + "isDeleted": false, + "id": "6YDMWeCVkevT5FVObPUtl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.2971989301723, + "y": 1165.1905537124594, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1526097058, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2977, + "versionNonce": 101885642, + "isDeleted": false, + "id": "kmpxdL5vWaF6VRXljdMS9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.4306806827944, + "y": 1136.9246737590793, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1099509374, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3093, + "versionNonce": 384271062, + "isDeleted": false, + "id": "kI0xfD-QXOFG94k__NFL_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.7176125009746, + "y": 1150.7045033045333, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1506115682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3102, + "versionNonce": 1332166026, + "isDeleted": false, + "id": "m281l4J2WMbgJgpW9-2zx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.7425524048222, + "y": 1163.873974458379, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 798666430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4111, + "versionNonce": 735885334, + "isDeleted": false, + "id": "9DUadkYR7DysB7iitCu6y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.8914381646928, + "y": 1126.9956645325492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 800793634, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2791, + "versionNonce": 393935946, + "isDeleted": false, + "id": "pNEG1HCjjczUaiuTbH1Iw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1064.7620978869154, + "y": 1127.8604056941667, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 403842814, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2886, + "versionNonce": 1861829974, + "isDeleted": false, + "id": "7vMo12OgAaj9IsJoQNwhU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.6800666369154, + "y": 1127.4748320639576, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1187401698, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4008, + "versionNonce": 204006154, + "isDeleted": false, + "id": "nfVvmk0hO2Y8W4qCPTrUL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.9282471870656, + "y": 1187.1611102312345, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 728799038, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "xJKd2nkOCNIe1_O4_jlZ-", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2950, + "versionNonce": 1368533654, + "isDeleted": false, + "id": "s4SUiIM79KoA37W4gFdAj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1030.7989069092882, + "y": 1188.7938859778333, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1928725410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3056, + "versionNonce": 1743516106, + "isDeleted": false, + "id": "p4x0HvPYaGEL35sA2ubUl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.5813020290789, + "y": 1188.068327794209, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1645674366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2870, + "versionNonce": 1381787606, + "isDeleted": false, + "id": "dcKDiAd1lj1N_tz6EK3JX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1181.5802396431345, + "y": 1010.0339111166952, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 779698018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2286, + "versionNonce": 1574905994, + "isDeleted": false, + "id": "zhDloC-xc295ZOpxr-Uv2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 916.2578190082077, + "y": 1189.5525743111384, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 4612030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2435, + "versionNonce": 1366097174, + "isDeleted": false, + "id": "SR2C7tH2X59CODMwzflzZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 945.2343815082077, + "y": 1096.9452919450669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1436484386, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2441, + "versionNonce": 96307018, + "isDeleted": false, + "id": "Sx8RA8l1PC2zPej-2K5Vv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 947.6796940082077, + "y": 1130.2919716325669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 438286334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2228, + "versionNonce": 1681451606, + "isDeleted": false, + "id": "pBvIHclZrN_kpqVXAZHRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1503.8530413987787, + "y": 1049.2275185075669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 203, + "height": 40, + "seed": 1658212066, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3mRchANiENPPmEHMVvXfw", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 0" + }, + { + "type": "arrow", + "version": 890, + "versionNonce": 1424134730, + "isDeleted": false, + "id": "3mRchANiENPPmEHMVvXfw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1497.150753452354, + "y": 1078.2110954643786, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 48.41553489057196, + "height": 23.729966514004445, + "seed": 878495998, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": { + "elementId": "pBvIHclZrN_kpqVXAZHRZ", + "focus": 0.5990815490550125, + "gap": 6.7022879464248035 + }, + "endBinding": { + "elementId": "i7IvaB8aEXlUaOKzYFRgr", + "focus": 0.8758659295786526, + "gap": 11.378828745037936 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -48.41553489057196, + 23.729966514004445 + ] + ] + }, + { + "type": "arrow", + "version": 832, + "versionNonce": 1308495702, + "isDeleted": false, + "id": "8oR4MyfX4jHtsAYeNAcq2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1520.9051019937037, + "y": 1134.6878109209931, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 72.49159598081201, + "height": 0.9767917052906796, + "seed": 1668206050, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": { + "elementId": "R9dwa1OWCNQUNiEB4_L_8", + "focus": -0.002655559170003563, + "gap": 1 + }, + "endBinding": { + "elementId": "9DUadkYR7DysB7iitCu6y", + "focus": 0.09326585366049274, + "gap": 2.6469494769864923 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -72.49159598081201, + 0.9767917052906796 + ] + ] + }, + { + "type": "arrow", + "version": 634, + "versionNonce": 606976266, + "isDeleted": false, + "id": "xJKd2nkOCNIe1_O4_jlZ-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1522.555531061782, + "y": 1215.9612037134202, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 74.6171875, + "height": 14.890625, + "seed": 1779890494, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "nfVvmk0hO2Y8W4qCPTrUL", + "focus": -0.7385533528788956, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -74.6171875, + -14.890625 + ] + ] + }, + { + "type": "rectangle", + "version": 4889, + "versionNonce": 274487882, + "isDeleted": false, + "id": "Z6DmDcFKnMIP5y9F7Bmy8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1276.1228956907623, + "y": 3151.816427080022, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 192.7960069444445, + "height": 503.416079452614, + "seed": 1515981819, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4002, + "versionNonce": 1977927510, + "isDeleted": false, + "id": "bDoO6UgGKpeo5RBnu_qJF", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1308.9060833147685, + "y": 3267.59872895081, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 305595701, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3945, + "versionNonce": 1563328778, + "isDeleted": false, + "id": "qVZmaAyCxLCoGghvfIa9g", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 809.2047906232171, + "y": 3217.163106767522, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 307.40147569444457, + "height": 197.04303257761387, + "seed": 344904859, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2872, + "versionNonce": 868052118, + "isDeleted": false, + "id": "HqTFfxWLU4Zfk0gYeQEI8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 972.4242317850938, + "y": 3269.739281916792, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 1609209493, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5866, + "versionNonce": 42848202, + "isDeleted": false, + "id": "p2YUn-HGVRGSyM_BFKymH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1788.7049269407626, + "y": 3363.573558448194, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 82.14952256944427, + "height": 119.4682229662705, + "seed": 1520404795, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 2527, + "versionNonce": 298805718, + "isDeleted": false, + "id": "HOwjurdjaB4sRHwxFSc2x", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1799.2323104408306, + "y": 3421.351413681329, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 63.328459017776375, + "height": 56.28633437499965, + "seed": 1206189045, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 3856, + "versionNonce": 1150633610, + "isDeleted": false, + "id": "Ss3212zGYasKcx7Tvk1_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1790.3929694754834, + "y": 3370.829154306329, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 78, + "height": 40, + "seed": 1374726619, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + }, + { + "id": "Ll35jXXZFdsir3OFSS6WG", + "type": "arrow" + }, + { + "id": "63L6OMYVfF9heOL7sMe5S", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse\nEngine", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse\nEngine" + }, + { + "type": "rectangle", + "version": 2885, + "versionNonce": 1865400086, + "isDeleted": false, + "id": "MViU46vTgBdwBBFbXzMZv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 831.5085490520339, + "y": 3270.0456416173997, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 36418901, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2094, + "versionNonce": 738190666, + "isDeleted": false, + "id": "IvHLEtNaAArrWlCbYJ6hn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 889.9540558332426, + "y": 3333.428040320439, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1335146107, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2210, + "versionNonce": 5467222, + "isDeleted": false, + "id": "832vCIG0NLyR1SJrHZ4dx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.2409876514246, + "y": 3347.2078698658947, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 705970869, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2219, + "versionNonce": 1915268106, + "isDeleted": false, + "id": "HdLbqBj_BXJzh1Gu9ivFV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.2659275552721, + "y": 3360.3773410197405, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1649291035, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2307, + "versionNonce": 588214678, + "isDeleted": false, + "id": "-v2IQwGSmYPUDLn4v9N_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.3994093078943, + "y": 3332.1114610663603, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1413751829, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2423, + "versionNonce": 1829411530, + "isDeleted": false, + "id": "DarNTWkKsw6ndqO-BFqak", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.6863411260745, + "y": 3345.8912906118144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 479171515, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2432, + "versionNonce": 848875222, + "isDeleted": false, + "id": "OPUapY0nDSvbgwW-DhSwX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.711281029922, + "y": 3359.06076176566, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1689311605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3459, + "versionNonce": 2067837322, + "isDeleted": false, + "id": "C-nMXaKIR9NB3q1TAJ-P-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 823.8601667897926, + "y": 3321.980245957478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 511403099, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1535411222, + "isDeleted": false, + "id": "Ta3Y_e3w0vmX0CQusRUPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 909.4147770917632, + "y": 3229.391194747506, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 109, + "height": 25, + "seed": 614458069, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.mrk" + }, + { + "type": "text", + "version": 1606, + "versionNonce": 1879437386, + "isDeleted": false, + "id": "cR2GrgOl-IFb6qLrCBks2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 729.7997898208068, + "y": 3325.478758939848, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1608786171, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 176" + }, + { + "type": "text", + "version": 2121, + "versionNonce": 1875349846, + "isDeleted": false, + "id": "RUUUoExQzH8Aia3Fpamuf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.2347212152397, + "y": 3322.6733816456995, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 413581365, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1965, + "versionNonce": 2134202122, + "isDeleted": false, + "id": "OCDZBy_rQCw0eKLQxElg9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 840.2301256270046, + "y": 3325.6375360574634, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 978078107, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2270, + "versionNonce": 985069206, + "isDeleted": false, + "id": "mk2hgDdfaJdv6YweUrVYD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.0358412521443, + "y": 3271.5713873337177, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 380301717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2386, + "versionNonce": 692708810, + "isDeleted": false, + "id": "3bwech_pfXMW4ybZgy6wl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.3227730703263, + "y": 3285.3512168791735, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 853958203, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2395, + "versionNonce": 1426568150, + "isDeleted": false, + "id": "kETD1_cmk8lD2ieaJp8ok", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.3477129741739, + "y": 3298.5206880330193, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 467793653, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2483, + "versionNonce": 660511882, + "isDeleted": false, + "id": "4Efi-P_u4VTlPcVDhpQZ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.481194726796, + "y": 3270.254808079639, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 76865243, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2599, + "versionNonce": 2026817814, + "isDeleted": false, + "id": "fv2_6p8n9c4tZSF-NzQz7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.7681265449762, + "y": 3284.034637625093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1657884757, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2608, + "versionNonce": 1462664010, + "isDeleted": false, + "id": "7US_mRzDjZMfar7tDDVaB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.7930664488238, + "y": 3297.204108778939, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1776962427, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4625, + "versionNonce": 1434531414, + "isDeleted": false, + "id": "KVecjoEAN3h1OjND-NAT0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 970.3894972532623, + "y": 3472.2793177050216, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 185.44835069444457, + "height": 255.49811070261416, + "seed": 961445301, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3453, + "versionNonce": 655655434, + "isDeleted": false, + "id": "AQNVgLvtYccz4tnzxt14P", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 982.1844666195782, + "y": 3559.0378291173997, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 657007643, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2410, + "versionNonce": 1676934038, + "isDeleted": false, + "id": "MFZp-TyP7EqUDqY-OgFIu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1015.1785852843075, + "y": 3484.3257650600053, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 377421589, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 2389, + "versionNonce": 34320586, + "isDeleted": false, + "id": "RCJdhNGWbIn2Z82Cpd6hc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 997.920313225484, + "y": 3565.746146493829, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 1413736635, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "rectangle", + "version": 3606, + "versionNonce": 979114198, + "isDeleted": false, + "id": "x1xbsGQUTLpRRPF8cmV7q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 982.346094475485, + "y": 3601.7613963615313, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 1893225589, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2544, + "versionNonce": 1001326474, + "isDeleted": false, + "id": "ZC4pVrvW8a6_YpDh3WsNe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 998.0819410813908, + "y": 3608.469713737961, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 1725765979, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + }, + { + "id": "6SAFrhAZi-gFmpbfKrgf0", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "rectangle", + "version": 3721, + "versionNonce": 1615760918, + "isDeleted": false, + "id": "QhBVWepQpphyAMj-tC5zu", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 985.192774162984, + "y": 3644.5983104240313, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 1411382741, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2658, + "versionNonce": 2084144714, + "isDeleted": false, + "id": "5Ubt_S_uMp85pn12q4XRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1000.9286207688899, + "y": 3651.306627800461, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 2085041659, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "text", + "version": 2701, + "versionNonce": 583031638, + "isDeleted": false, + "id": "kSlJMf5FUexzKinlFu-XA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4216039269702, + "y": 3670.431652394179, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 929790773, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2817, + "versionNonce": 746990858, + "isDeleted": false, + "id": "tZgUcMZJaeYvqtnrrev8z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.7085357451504, + "y": 3684.211481939633, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1669643931, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2826, + "versionNonce": 1745256598, + "isDeleted": false, + "id": "nnh5bib1AhQI433fhM_gT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.733475648998, + "y": 3697.3809530934786, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 320883861, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "line", + "version": 812, + "versionNonce": 1645214666, + "isDeleted": false, + "id": "T82Du1jWAmtKTC18fZGaa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 862.9787691065137, + "y": 3347.622206224925, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.4532116264103934, + "height": 272.0675993272662, + "seed": 1732784955, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.4532116264103934, + 272.0675993272662 + ] + ] + }, + { + "type": "text", + "version": 2752, + "versionNonce": 64355798, + "isDeleted": false, + "id": "iC1nzwsGcHjR1mz5GvlrK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1311.932031975485, + "y": 3163.575248056329, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 50, + "seed": 921956853, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "decompressed\nblock data", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "decompressed\nblock data" + }, + { + "type": "rectangle", + "version": 2797, + "versionNonce": 1257370250, + "isDeleted": false, + "id": "0nYg04T2hDy1xJllAs1z0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.5841897135751, + "y": 3276.5611886565307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 1475613659, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2538, + "versionNonce": 188994326, + "isDeleted": false, + "id": "dbwr9kM-1MzDGcG6KgP-h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.13627304691, + "y": 3276.2766989491843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1609296725, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "742.414.531", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "742.414.531" + }, + { + "type": "text", + "version": 2544, + "versionNonce": 434573642, + "isDeleted": false, + "id": "amafakoO8IEfWubKbLi0P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.7716318287548, + "y": 3287.7836334209564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1436213371, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2660, + "versionNonce": 683999318, + "isDeleted": false, + "id": "huO253QyknBNJqbui9ajf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.058563646935, + "y": 3301.5634629664105, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 241023157, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2669, + "versionNonce": 1917474826, + "isDeleted": false, + "id": "agtqV0dx2GEO63HbUTdW9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.0835035507826, + "y": 3314.7329341202562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1509890331, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3057, + "versionNonce": 1882097046, + "isDeleted": false, + "id": "ZfzG27phIqOQfWAhN2Wgn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1316.9316367001857, + "y": 3341.3469903656674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 468638229, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2790, + "versionNonce": 1410778826, + "isDeleted": false, + "id": "AQE8pL3-yttNZLiPJ1F1M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.6411987451356, + "y": 3342.062500658321, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 43204027, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 3149, + "versionNonce": 850748118, + "isDeleted": false, + "id": "OoIznPgkv0BOUiNU2wUvS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.1544443287546, + "y": 3507.771914670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 294965109, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3274, + "versionNonce": 132603274, + "isDeleted": false, + "id": "n-UNPVs4Z9U3JSOiub8EN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4413761469348, + "y": 3521.55174421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 444190299, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3283, + "versionNonce": 1391368214, + "isDeleted": false, + "id": "mGcJNxM3llQkuP06NvsQp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4663160507823, + "y": 3534.721215370256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1033181397, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 658, + "versionNonce": 183966794, + "isDeleted": false, + "id": "6SAFrhAZi-gFmpbfKrgf0", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 865.2947551897685, + "y": 3619.262190020606, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 117.00390625, + "height": 2.0703125, + "seed": 1686457083, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "ZC4pVrvW8a6_YpDh3WsNe", + "focus": 0.24399918217240393, + "gap": 15.783279641622357 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 117.00390625, + -2.0703125 + ] + ] + }, + { + "type": "text", + "version": 3101, + "versionNonce": 416228694, + "isDeleted": false, + "id": "3nwYU4swX2Anvc1UVX4Yg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.2677255787548, + "y": 3210.4984771709564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 159725109, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3218, + "versionNonce": 2065761034, + "isDeleted": false, + "id": "aXJpJZpcitfVUcqR7_shF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.554657396935, + "y": 3224.2783067164105, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 624440219, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3227, + "versionNonce": 95160982, + "isDeleted": false, + "id": "J_64UiuYtjZngok7be4KJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.5795973007826, + "y": 3237.4477778702562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 273328021, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4266, + "versionNonce": 48239050, + "isDeleted": false, + "id": "B9hasLRMPT-RrBJsAAA-s", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1309.2400676897685, + "y": 3382.90341645081, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 1824852027, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3058, + "versionNonce": 674908118, + "isDeleted": false, + "id": "gYgE5GLkRlj_bZK1rgmQ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.9181740885751, + "y": 3391.8658761565307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 1947921653, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2789, + "versionNonce": 1162823818, + "isDeleted": false, + "id": "0nSqhgjX_T6PkNH4H-AwN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1325.470257421911, + "y": 3391.5813864491843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 554584283, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 2805, + "versionNonce": 1888410902, + "isDeleted": false, + "id": "4I2U1Qo-zPPF7Sc0NRNJ6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.1056162037548, + "y": 3403.088320920956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1954252373, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2921, + "versionNonce": 1244243786, + "isDeleted": false, + "id": "Wy6ubQFbs-5drcBfpWlHe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.392548021935, + "y": 3416.86815046641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1202091387, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2930, + "versionNonce": 69126742, + "isDeleted": false, + "id": "sgaW75e5nkX16Qs7-_n_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.4174879257826, + "y": 3430.037621620256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1145172917, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3321, + "versionNonce": 1774857738, + "isDeleted": false, + "id": "Yu5fhbBJs74fITyO54Qk6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.2656210751857, + "y": 3456.651677865667, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 265293339, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3051, + "versionNonce": 297734038, + "isDeleted": false, + "id": "1xKjC3poeJiw_9g4CBieY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.8850600907363, + "y": 3457.3671881583205, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 529773845, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "rectangle", + "version": 4460, + "versionNonce": 959175882, + "isDeleted": false, + "id": "6TsF2ajztP-JcpDvfTdoI", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1308.4353801897685, + "y": 3501.0245102008093, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 477991611, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3253, + "versionNonce": 631549142, + "isDeleted": false, + "id": "bUfnRGrGRdxe7fSNLzmvn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.1134865885751, + "y": 3509.9869699065302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 568740469, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2983, + "versionNonce": 1978250122, + "isDeleted": false, + "id": "IHtbRE1MXMH91eRGl52tt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.665569921911, + "y": 3510.702480199184, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 240223067, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "text", + "version": 3000, + "versionNonce": 2103747094, + "isDeleted": false, + "id": "CIaVliMv2mnoOe3SaTNJL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.3009287037548, + "y": 3521.209414670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1543451605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3116, + "versionNonce": 1916711498, + "isDeleted": false, + "id": "HTp6raiHFIHsd52BifYvW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.587860521935, + "y": 3534.98924421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1302224891, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3125, + "versionNonce": 1542713174, + "isDeleted": false, + "id": "26WkaQ26WL0iPA7asA_UJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.6128004257826, + "y": 3548.1587153702562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 703852853, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3513, + "versionNonce": 17160458, + "isDeleted": false, + "id": "XsLP2OdIryofvPn9pdkp1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1316.4609335751857, + "y": 3574.7727716156674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 342272155, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3247, + "versionNonce": 1571263638, + "isDeleted": false, + "id": "jOvjTXVPUltjmhIKQvN3o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.0130169085205, + "y": 3575.488281908321, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1227489941, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "752.832.461", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "752.832.461" + }, + { + "type": "line", + "version": 449, + "versionNonce": 1639589834, + "isDeleted": false, + "id": "YNoMgSRtknqq7BZNwV4c4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.7752239397685, + "y": 3343.6918775206063, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.96875, + "height": 93.48828125, + "seed": 945610043, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.96875, + 93.48828125 + ] + ] + }, + { + "type": "text", + "version": 3590, + "versionNonce": 1278513622, + "isDeleted": false, + "id": "B6luJz0jJP3NC7Zbv9WMg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.1349130787548, + "y": 3598.990664670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 777447413, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3707, + "versionNonce": 745971338, + "isDeleted": false, + "id": "ODOiZE9_IEFZ4lSWjecPI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.421844896935, + "y": 3612.77049421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 887324123, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3716, + "versionNonce": 1924130582, + "isDeleted": false, + "id": "dU31U7UQHz90x3i1gCIPd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.4467848007826, + "y": 3625.939965370256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 461381973, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 972, + "versionNonce": 1039547722, + "isDeleted": false, + "id": "uoInldJRljDzt8fpfGqE5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1147.2910355023866, + "y": 3616.675221493787, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 120.93780388257687, + "height": 1.9492749591704523, + "seed": 1963788923, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Iz4RhtaLO452plU5Wtr5J", + "focus": 2.114843304963227, + "gap": 13.730282187381817 + }, + "endBinding": { + "elementId": "Z6DmDcFKnMIP5y9F7Bmy8", + "focus": -0.8272882662943504, + "gap": 7.894056305798927 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 120.93780388257687, + -1.9492749591704523 + ] + ] + }, + { + "type": "text", + "version": 2073, + "versionNonce": 1905169494, + "isDeleted": false, + "id": "Iz4RhtaLO452plU5Wtr5J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1161.0213176897685, + "y": 3583.1215650206072, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 1979395765, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + }, + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "decompress", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "decompress" + }, + { + "type": "arrow", + "version": 959, + "versionNonce": 596902922, + "isDeleted": false, + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1013.1736614397685, + "y": 3437.809065020606, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 293.70297228147615, + "height": 1.886237626986258, + "seed": 1570505499, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": { + "elementId": "qVZmaAyCxLCoGghvfIa9g", + "focus": 1.2240306758329034, + "gap": 23.60292567547026 + }, + "endBinding": { + "elementId": "B9hasLRMPT-RrBJsAAA-s", + "focus": -0.0996491562710595, + "gap": 2.36343396852385 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 293.70297228147615, + 1.886237626986258 + ] + ] + }, + { + "type": "text", + "version": 2819, + "versionNonce": 312842646, + "isDeleted": false, + "id": "luhOhH2JDwa6eOsUwL0mV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.1489218564363, + "y": 3272.0052455761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 1550684181, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 175", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 175" + }, + { + "type": "text", + "version": 2912, + "versionNonce": 122352330, + "isDeleted": false, + "id": "zwTzFuVNTQAvQjK7ktj0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1216.0512656064363, + "y": 3386.0482143261593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 386066363, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 176" + }, + { + "type": "text", + "version": 3084, + "versionNonce": 489289430, + "isDeleted": false, + "id": "5zaozhWnau3QPikbOvc_E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.4653281064363, + "y": 3503.950558076159, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 2093794677, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 177", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 177" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 464914826, + "isDeleted": false, + "id": "wDUa-cmfDR7oEoBuYX0BQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1449.6918906064366, + "y": 3274.4974330761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 20, + "seed": 392443995, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.433.600", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.433.600" + }, + { + "type": "text", + "version": 3132, + "versionNonce": 699444246, + "isDeleted": false, + "id": "2EDet1OaDkn7DbT-9i-9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1452.3207968564366, + "y": 3341.7943080761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 95, + "height": 20, + "seed": 710823637, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.441.791", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.441.791" + }, + { + "type": "text", + "version": 3230, + "versionNonce": 135284810, + "isDeleted": false, + "id": "wIt7_Ju6OG6_LFIqsmqKR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1452.0434531064366, + "y": 3390.3021205761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1821537531, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ll35jXXZFdsir3OFSS6WG", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.441.792", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.441.792" + }, + { + "type": "text", + "version": 3272, + "versionNonce": 1982773590, + "isDeleted": false, + "id": "NtYNSFy-whbZIid7xeJmD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1450.7700156064366, + "y": 3456.6906510323734, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 111, + "height": 20, + "seed": 867675189, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "63L6OMYVfF9heOL7sMe5S", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.449.983", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.449.983" + }, + { + "type": "text", + "version": 3400, + "versionNonce": 1412738826, + "isDeleted": false, + "id": "s8aMbA9Mmgn4vXWLwvBMl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1449.6254843564366, + "y": 3508.001339326159, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1175461275, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.449.984", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.449.984" + }, + { + "type": "text", + "version": 3490, + "versionNonce": 972627606, + "isDeleted": false, + "id": "Lo23rQFd0Avk_iVT6aWrg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1451.1254843564366, + "y": 3573.7825893261593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 20, + "seed": 2025741717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.458.175", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.458.175" + }, + { + "type": "text", + "version": 4076, + "versionNonce": 375911562, + "isDeleted": false, + "id": "Bp_OjPrmGcEi6dRrneEhC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1627.5043906064357, + "y": 3334.2630580761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 116, + "height": 80, + "seed": 1752412891, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "all 8192 rows \nof granule 176\nare streamed\ninto ClickHouse", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "all 8192 rows \nof granule 176\nare streamed\ninto ClickHouse" + }, + { + "type": "arrow", + "version": 1223, + "versionNonce": 1263326026, + "isDeleted": false, + "id": "Ll35jXXZFdsir3OFSS6WG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 80, + "angle": 0, + "x": 1551.3202837280069, + "y": 3387.079154306329, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 234.4677734375, + "height": 39.3115234375, + "seed": 1946044853, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "startBinding": { + "elementId": "wIt7_Ju6OG6_LFIqsmqKR", + "focus": -0.45215935910385624, + "gap": 3.222966269830067 + }, + "endBinding": { + "elementId": "Ss3212zGYasKcx7Tvk1_v", + "focus": -1.2887866917668438, + "gap": 7.9443359375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 34.1064453125, + -4.16015625 + ], + [ + 46.455078125, + 0.4248046875 + ], + [ + 49.0576171875, + 13.0078125 + ], + [ + 50.9375, + 25.673828125 + ], + [ + 56.26953125, + 35.1513671875 + ], + [ + 96.455078125, + 34.8828125 + ], + [ + 234.4677734375, + 31.6943359375 + ] + ] + }, + { + "type": "arrow", + "version": 1077, + "versionNonce": 343148746, + "isDeleted": false, + "id": "63L6OMYVfF9heOL7sMe5S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 80, + "angle": 0, + "x": 1542.7810271344842, + "y": 3479.2215910125433, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 244.39863159352217, + "height": 61.611328125, + "seed": 1695447835, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "startBinding": { + "elementId": "NtYNSFy-whbZIid7xeJmD", + "focus": 1.1689823066050393, + "gap": 2.530939980169933 + }, + "endBinding": { + "elementId": "Ss3212zGYasKcx7Tvk1_v", + "focus": -1.2184134905993005, + "gap": 7.163085937499545 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 46.04413940602217, + 0.3819773562854607 + ], + [ + 59.90644409352217, + -15.79478045621454 + ], + [ + 61.93769409352217, + -41.69321795621454 + ], + [ + 67.60663940602217, + -52.29868670621454 + ], + [ + 97.03535034352217, + -56.63950701871454 + ], + [ + 244.39863159352217, + -61.22935076871454 + ] + ] + }, + { + "type": "text", + "version": 2230, + "versionNonce": 527905686, + "isDeleted": false, + "id": "R9dwa1OWCNQUNiEB4_L_8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1521.9051019937037, + "y": 1113.2972125092788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 196, + "height": 40, + "seed": 1498844490, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1" + }, + { + "type": "rectangle", + "version": 1953, + "versionNonce": 1224542998, + "isDeleted": false, + "id": "Wiarv-8t9VQnxkUlojxsC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1036.3692977255103, + "y": 234.94051825362084, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 2135112598, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1535, + "versionNonce": 427645258, + "isDeleted": false, + "id": "jQVofhsMHssMFAvmpT9Ao", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1050.9999245912566, + "y": 240.3637242765269, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 1984983242, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2328, + "versionNonce": 1251424342, + "isDeleted": false, + "id": "JWcu2wIZgbUlnKpPKVlUy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1466.860259705863, + "y": 232.2812442218845, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 700668118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2267, + "versionNonce": 936878090, + "isDeleted": false, + "id": "nPYoRwi-k7atwl3DVWImu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1187.0578707177515, + "y": 233.85262481218405, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1230751626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1337, + "versionNonce": 184139158, + "isDeleted": false, + "id": "VyF77oCL1iZbYtoUI3ZNj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1279.8946273928204, + "y": 240.8755387441604, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 1102430358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1464, + "versionNonce": 146476746, + "isDeleted": false, + "id": "2Y-_8zgs2gstfoyrz7Prq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1484.4266284036078, + "y": 241.01876791082827, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 771013578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2411, + "versionNonce": 1062836950, + "isDeleted": false, + "id": "qNgMkIDpGu8IAvTPpYZdz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 573.9657941284946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1882052630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2590, + "versionNonce": 818062730, + "isDeleted": false, + "id": "7EtQCslXAd6YyoT7bOe_A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 592.7397378553525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 843816534, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2774, + "versionNonce": 776720406, + "isDeleted": false, + "id": "WcpC8JNUEow5syDT-lSBh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 611.514217230802, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 545561098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2655, + "versionNonce": 153707594, + "isDeleted": false, + "id": "h-3pnyDUkn79NnzL1kaZ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.1999303165894, + "y": 574.052515295756, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 187786134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2832, + "versionNonce": 63266134, + "isDeleted": false, + "id": "sFKI3WDdokcox4fW4b1u4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.5604322312165, + "y": 592.8264590226144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 95996106, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3016, + "versionNonce": 197806858, + "isDeleted": false, + "id": "8NCgSdfWzTqvl20WiPH6A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.480203921702, + "y": 611.6009383980635, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1705803990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2718, + "versionNonce": 622543510, + "isDeleted": false, + "id": "vKyMaKKYSiRNZCY1C7SVb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1546.6707334107107, + "y": 574.0277757124226, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2046369674, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2895, + "versionNonce": 1059084746, + "isDeleted": false, + "id": "iubGWa41U1NhCKpnd7tZ6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1547.0312353253378, + "y": 592.8017194392809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 357692950, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3079, + "versionNonce": 84049878, + "isDeleted": false, + "id": "TIcN1Q-CbLToEmt4zu6-f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1546.9510070158233, + "y": 611.57619881473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 427859530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4704, + "versionNonce": 575049866, + "isDeleted": false, + "id": "P1FXiVWkjFCTe_XCb5L8B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.7115608355889, + "y": 274.5175730727937, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1629141846, + "groupIds": [ + "a7f9zaB8n_8P-t8iMsIJW" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5382, + "versionNonce": 2005931286, + "isDeleted": false, + "id": "jKrOvtSdbVSH_uP-cvpmx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.7676852736147, + "y": 273.51839931494743, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1311319626, + "groupIds": [ + "a7f9zaB8n_8P-t8iMsIJW" + ], + "roundness": null, + "boundElements": [ + { + "id": "GkiYx80xAbmpjHnxJ7KXx", + "type": "arrow" + } + ], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2480, + "versionNonce": 1153454282, + "isDeleted": false, + "id": "sN7LqVozphO5hoJhmZq93", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.4392233688268, + "y": 277.33987558392886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 1624100374, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1422, + "versionNonce": 583104726, + "isDeleted": false, + "id": "KhJ3mbvURq3KzNIaRQQxg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 277.3646171249208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 911099466, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1488, + "versionNonce": 2127538058, + "isDeleted": false, + "id": "AMDb-U0BCJy0MkDYPiz09", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.284129358224, + "y": 277.3646171249208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1364695894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1246, + "versionNonce": 1426583062, + "isDeleted": false, + "id": "t7Vrh9UgW0xxmfbLk6xFK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.5278188797986, + "y": 278.70651592670106, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1174596874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1613, + "versionNonce": 1380329034, + "isDeleted": false, + "id": "xkJUUPxw00NjP0bKmNIiu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.4141967734483, + "y": 279.70614821317173, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1704803798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1701, + "versionNonce": 2035137366, + "isDeleted": false, + "id": "9LJB99J5_K09L5mrhTbJV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 350.91061115265404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1010741898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1833, + "versionNonce": 1476316426, + "isDeleted": false, + "id": "5JsPwnpfh0zYOCl36AiiO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 364.6904406981099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 841159446, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1842, + "versionNonce": 1172824214, + "isDeleted": false, + "id": "fSpj0tMfZCpda3liRX31-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 377.85991185195564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1134285130, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1699, + "versionNonce": 1433705418, + "isDeleted": false, + "id": "NtISqBYOhvjQmFihnC7ie", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.4451087350617, + "y": 349.6807204093627, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 834420822, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1815, + "versionNonce": 1586191830, + "isDeleted": false, + "id": "ExIN_KifsomgpIySVBtGC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.7320405532419, + "y": 363.46054995481677, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 124196874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1824, + "versionNonce": 683840138, + "isDeleted": false, + "id": "auSGetdr07XJzyWwj5s6g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.7569804570894, + "y": 376.6300211086625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1480443286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1745, + "versionNonce": 676147990, + "isDeleted": false, + "id": "Jcxi9IuR5w1v52AKJfNP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.1447233822112, + "y": 349.72972609118074, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 664504010, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1861, + "versionNonce": 883142986, + "isDeleted": false, + "id": "8O8jEFQjaXPL-B6x81yAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4316552003932, + "y": 363.5095556366348, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1457300182, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1870, + "versionNonce": 497180758, + "isDeleted": false, + "id": "FHDp9nYzRfva5YRKCGirr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4565951042407, + "y": 376.6790267904805, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 215227786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2590, + "versionNonce": 1282603018, + "isDeleted": false, + "id": "f2C59pIQsZ8QGjB08SM8f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.6120466418868, + "y": 309.5639591645431, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1414257738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1572, + "versionNonce": 576710038, + "isDeleted": false, + "id": "S-IG85sraUiYKpdAE93nK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 309.5142629839876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1277584726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1635, + "versionNonce": 539715274, + "isDeleted": false, + "id": "UVHDZeKonXESdYoOfkTyZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.6078061783953, + "y": 309.5142629839876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1004389130, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1399, + "versionNonce": 1471857366, + "isDeleted": false, + "id": "pKFawK3dgoH0dx2ktI1Mq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.85149569997, + "y": 309.60095149477485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1276856982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1759, + "versionNonce": 677903754, + "isDeleted": false, + "id": "z3pgb_xK_Z9u7up197veV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.7378735936197, + "y": 311.7996783809213, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 235196874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3367, + "versionNonce": 1883764758, + "isDeleted": false, + "id": "w2jEoeeD---7EjJ8-O-2u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.7156933957938, + "y": 342.066760901056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 1589741526, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2391, + "versionNonce": 308526154, + "isDeleted": false, + "id": "B1NsNgleD3yeRYodD7Egd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 342.13815847050057, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 232523914, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2459, + "versionNonce": 66880854, + "isDeleted": false, + "id": "CSrZOJdlTdTo6w0M2J-fw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.7944341127156, + "y": 342.13815847050057, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1412308246, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2202, + "versionNonce": 737780490, + "isDeleted": false, + "id": "lIJYYt-AeK-j0SZqdpqQR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.0381236342903, + "y": 342.2248469812878, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1662936906, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2581, + "versionNonce": 1680698006, + "isDeleted": false, + "id": "97AsS_UGQVpLg2ATac8EI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 975.92450152794, + "y": 344.49509558720376, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 836110934, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3112, + "versionNonce": 1336193482, + "isDeleted": false, + "id": "2SMO7jRL-DGEddiExwUNC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.2033086480265, + "y": 405.62989313127923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 103214602, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2208, + "versionNonce": 1871685590, + "isDeleted": false, + "id": "shwrqvH-X7JWDj_sz2LyP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 405.67197278890785, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 109989782, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2276, + "versionNonce": 1350559882, + "isDeleted": false, + "id": "-ifH1k-FmymKu2xkG7dcW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.5061629054405, + "y": 405.67197278890785, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 737189066, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2024, + "versionNonce": 1714961686, + "isDeleted": false, + "id": "cBJM8NbVjeG9nn-sWgnR_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7498524270152, + "y": 405.75866129969506, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1049357526, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2387, + "versionNonce": 1715881802, + "isDeleted": false, + "id": "d00kK9Qnv7E-Kv8QqWkgo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 948.636230320665, + "y": 407.8176373338571, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 840332170, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5252, + "versionNonce": 1033644630, + "isDeleted": false, + "id": "xOV8xa8SN2JbzNrsymR1m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.4183834872588, + "y": 434.93176308508674, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 643828810, + "groupIds": [ + "HrR_ARvvEjdPll0Lk4N2Q" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5930, + "versionNonce": 424857098, + "isDeleted": false, + "id": "chehznvRTylGXnyCR9RaI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.4745079252843, + "y": 433.93258932724035, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 2024617302, + "groupIds": [ + "HrR_ARvvEjdPll0Lk4N2Q" + ], + "roundness": null, + "boundElements": [ + { + "id": "3WI04rxxvXSjHIfous1og", + "type": "arrow" + } + ], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3224, + "versionNonce": 1955622806, + "isDeleted": false, + "id": "O7nOLj3p7plkP96NpwQ1I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.7648941900472, + "y": 437.19145782877354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 2003034646, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2312, + "versionNonce": 782269642, + "isDeleted": false, + "id": "kerXQoUlsPMLNF2wHsMAh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 437.34004976914014, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 181629514, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 1732906198, + "isDeleted": false, + "id": "_dLZhGSEbNBZITX5N1Rr-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.239849813909, + "y": 437.34004976914014, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1410019158, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2127, + "versionNonce": 332026762, + "isDeleted": false, + "id": "LXDpFrfd5JPY4vBM5txib", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.4835393354836, + "y": 437.42673827992746, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 688036106, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2478, + "versionNonce": 593363478, + "isDeleted": false, + "id": "0XIN9-RWyD5sgHGLRv4HZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 947.3699172291316, + "y": 439.82375328699607, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 1356256406, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3438, + "versionNonce": 1259033162, + "isDeleted": false, + "id": "p6ySQJ_foDdWAhHI5G_Hv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.1991452075683, + "y": 470.759233676342, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1813964746, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2455, + "versionNonce": 1002524502, + "isDeleted": false, + "id": "_ep0Vqmc7fkgZRRcVSs_E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 469.97380910441416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 393990614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2526, + "versionNonce": 1463712010, + "isDeleted": false, + "id": "-P2USAO2VxJ8IQ_85gsyF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.5635266340803, + "y": 469.97380910441416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 205741706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4299, + "versionNonce": 482931862, + "isDeleted": false, + "id": "tol1691g-FTuKcuji6cA_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.5858854165651, + "y": 501.0557206966429, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1393501974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3287, + "versionNonce": 668911562, + "isDeleted": false, + "id": "bo1X2KQrQ3NbZfjp3QHWF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 500.7217143427064, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 103480650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3354, + "versionNonce": 1613361622, + "isDeleted": false, + "id": "aOYGlP1e05XHLxTJocUZ0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.7501545683997, + "y": 500.7217143427064, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 67490902, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3099, + "versionNonce": 84360842, + "isDeleted": false, + "id": "9LQrHaz85QHSicWMy1nUE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.9938440899743, + "y": 500.8084028534936, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 120636426, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2072, + "versionNonce": 553207574, + "isDeleted": false, + "id": "vTJDvgFMWV4A56kE_RqQK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 509.4609459180682, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1412749718, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2192, + "versionNonce": 2071125322, + "isDeleted": false, + "id": "bd1dfwX19t8A-t00pyE8k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 523.2407754635241, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1498395338, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2201, + "versionNonce": 1336669270, + "isDeleted": false, + "id": "tD3P6Ai3HuprA_ORZwVTr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 536.4102466173698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1792095958, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2075, + "versionNonce": 1216128010, + "isDeleted": false, + "id": "sFbPRpuIN5z-8W2wnOj1t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.4046524286832, + "y": 508.2310551747769, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1327679882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2191, + "versionNonce": 102168982, + "isDeleted": false, + "id": "CD-HstjW1h3S9QujY9LRk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.6915842468634, + "y": 522.0108847202308, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1081076758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2200, + "versionNonce": 1176474314, + "isDeleted": false, + "id": "gq1xWaZE-XhBqMf-8PdhZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.716524150711, + "y": 535.1803558740768, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 803539018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2121, + "versionNonce": 1534023382, + "isDeleted": false, + "id": "nnS6YuBTRzIv8NM-F5hLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.1042670758327, + "y": 508.2800608565949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1929771350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2237, + "versionNonce": 1459005834, + "isDeleted": false, + "id": "rOFNKc2TWjTz009v3DvLa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.3911988940147, + "y": 522.0598904020488, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 594636554, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2246, + "versionNonce": 944376854, + "isDeleted": false, + "id": "gQNmVdGM-aUXmIvDvBc_g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4161387978622, + "y": 535.2293615558948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 434658966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3541, + "versionNonce": 1379723338, + "isDeleted": false, + "id": "GlYjoKrN39RMxb4VCGoBe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.3496233999756, + "y": 563.5490847749403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 507706826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2585, + "versionNonce": 714873174, + "isDeleted": false, + "id": "PFOE-trbLGwmt4FzZotc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1064.306513596446, + "y": 563.8460321009762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 432806870, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2655, + "versionNonce": 1875726090, + "isDeleted": false, + "id": "g0zIwtHgYJ5YJUAaMg1Cw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.4657065990611, + "y": 563.8460321009762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1299494026, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2400, + "versionNonce": 968523414, + "isDeleted": false, + "id": "7ZOLRyjOVxrznqzpWsAh1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7093961206358, + "y": 563.9327206117636, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2026254614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2742, + "versionNonce": 874700234, + "isDeleted": false, + "id": "pkkc_YhVwYsIk7vb1ML_X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 936.5957740142875, + "y": 566.3679720992712, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 46240586, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4880, + "versionNonce": 978992086, + "isDeleted": false, + "id": "LuX7Fpej4nAk8sD572q7G", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.372576942194, + "y": 658.7441360943783, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 2021674838, + "groupIds": [ + "P6tHtuIUAYxSvJEzJ24r8" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5558, + "versionNonce": 1549309066, + "isDeleted": false, + "id": "MQERmG_TTHLhJwKfqehAr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.42870138022, + "y": 657.744962336532, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 166689034, + "groupIds": [ + "P6tHtuIUAYxSvJEzJ24r8" + ], + "roundness": null, + "boundElements": [ + { + "id": "3kgcfqKSC119Vts5h_nWg", + "type": "arrow" + } + ], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3906, + "versionNonce": 579883286, + "isDeleted": false, + "id": "__SVNO9hLIe1Mqz7onLdF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1031.2108760502588, + "y": 661.7898562735926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 857129814, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2842, + "versionNonce": 1244230474, + "isDeleted": false, + "id": "tn6VoybdvXfsMUUO_KPIZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 661.5265705531793, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1093289226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2910, + "versionNonce": 1574026838, + "isDeleted": false, + "id": "A4fOWu39OwVcywFuPt6Ng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1192.9995045224814, + "y": 661.5265705531793, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1901062294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2654, + "versionNonce": 1878030858, + "isDeleted": false, + "id": "4K3M0bCq4xlLFKiMZVXWJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.243194044056, + "y": 661.6132590639664, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2054230986, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 2966, + "versionNonce": 552829846, + "isDeleted": false, + "id": "19VqruzPfWRjVW6K2x3lm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 905.1295719377041, + "y": 663.2831643140897, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1873962454, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3915, + "versionNonce": 1017686218, + "isDeleted": false, + "id": "o6RiAfEK6_hC_jOr7fVDs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.043976154924, + "y": 693.9567801685001, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1735395978, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2985, + "versionNonce": 1042981078, + "isDeleted": false, + "id": "4L8mA8Ckfe23nWBJT34eX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 693.6213158136744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 257112854, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3062, + "versionNonce": 132972426, + "isDeleted": false, + "id": "GA4Bu9iq1wG963-RtmhFY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.3231813426528, + "y": 693.6213158136744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 786573642, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2800, + "versionNonce": 2030835222, + "isDeleted": false, + "id": "4DzDdL3kkJRx5x-kBPbMs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.5668708642274, + "y": 693.7080043244615, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1185376342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4726, + "versionNonce": 2113437258, + "isDeleted": false, + "id": "hLsQVwev3SN3adAAmfj3M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.0381427168381, + "y": 726.1102929729972, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 1747087370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3808, + "versionNonce": 1519182678, + "isDeleted": false, + "id": "WrS7VAFY1bfp7wfKxtVl8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 726.0605967924415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1971580310, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3881, + "versionNonce": 195437834, + "isDeleted": false, + "id": "eon42bZOpPXz6rEO9tLkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.411091979494, + "y": 726.0605967924415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 120315594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3623, + "versionNonce": 84019350, + "isDeleted": false, + "id": "9kXMTTpRhLdeNrZy7it-E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7534987985468, + "y": 726.1472853032288, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 958253782, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2599, + "versionNonce": 1248916426, + "isDeleted": false, + "id": "yTa0PqJZh3PTcNlYBNMMw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 735.0545065944303, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1218016650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 136349142, + "isDeleted": false, + "id": "oM4FQNn-Mvi72e6XCVcLS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 748.8343361398862, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1074397206, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1819536010, + "isDeleted": false, + "id": "Ye-d6hQnU2M48gLxGunW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 762.0038072937319, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 497431626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2600, + "versionNonce": 889019158, + "isDeleted": false, + "id": "BbTuAf2VuGHXFMirGRPV_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.1643071372566, + "y": 733.8246158511391, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 507350358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 678037834, + "isDeleted": false, + "id": "EUH07YvDkOYB433W6z0Fr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.3645504446495, + "y": 747.5177568858059, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 405609226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1913489494, + "isDeleted": false, + "id": "RtlASmtbxNdARl2D54g1c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.389490348497, + "y": 760.6872280396516, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 554529430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2646, + "versionNonce": 632180746, + "isDeleted": false, + "id": "ipHD6wPu79s8Qu-bHHYA7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1547.8639217844043, + "y": 733.8736215329571, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1453926858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2761, + "versionNonce": 254152086, + "isDeleted": false, + "id": "LCAKPpe09w2Je8IhcONMo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.0641650918008, + "y": 747.5667625676239, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 590262230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2770, + "versionNonce": 1748745930, + "isDeleted": false, + "id": "_vIqxjHjb_YOjdlDiMJ23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.0891049956483, + "y": 760.7362337214696, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1882546314, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4059, + "versionNonce": 427551446, + "isDeleted": false, + "id": "e-FHjlOvv0hJppkmVyfZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.0528828654187, + "y": 789.683901128445, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1622557974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2737, + "versionNonce": 1017992586, + "isDeleted": false, + "id": "WDUAmEYWfFdwFzbHkQ2tz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1619836746, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2897, + "versionNonce": 799285270, + "isDeleted": false, + "id": "gX3fHoVZ1AnvTdybGAyDl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1194.1664216534107, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1259942486, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2618, + "versionNonce": 608048202, + "isDeleted": false, + "id": "rkSx4vh5rlOYbuMCnocyh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.6200566283426, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1946830346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2857, + "versionNonce": 1435741526, + "isDeleted": false, + "id": "ZVHJt1y6EbxU9i66uwLd_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 906.1414410342196, + "y": 791.4652987527858, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1563195286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1777, + "versionNonce": 1218417302, + "isDeleted": false, + "id": "IhL2-OJrSbi3EJ_cNKNTp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 717.989017400923, + "y": 284.8446568103518, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 606921546, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "GkiYx80xAbmpjHnxJ7KXx", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1733, + "versionNonce": 1086917066, + "isDeleted": false, + "id": "GkiYx80xAbmpjHnxJ7KXx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 847.4688284044247, + "y": 305.78029017015615, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 738020950, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "IhL2-OJrSbi3EJ_cNKNTp", + "focus": 0.12412743246042555, + "gap": 10.479811003501709 + }, + "endBinding": { + "elementId": "jKrOvtSdbVSH_uP-cvpmx", + "focus": 0.6408863246638227, + "gap": 8.560575619190104 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2491, + "versionNonce": 1400688598, + "isDeleted": false, + "id": "SpWNTXzUj6aN5NPSUhRAY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 721.2735133993058, + "y": 437.9595550258464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 943125206, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3WI04rxxvXSjHIfous1og", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1679, + "versionNonce": 1264140426, + "isDeleted": false, + "id": "3WI04rxxvXSjHIfous1og", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 848.9141383993067, + "y": 460.4928562436967, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 1090964874, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SpWNTXzUj6aN5NPSUhRAY", + "focus": 0.037566857262255365, + "gap": 8.64062500000091 + }, + "endBinding": { + "elementId": "chehznvRTylGXnyCR9RaI", + "focus": 0.4556907888569733, + "gap": 3.724432025977535 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2770, + "versionNonce": 574645526, + "isDeleted": false, + "id": "VlXyMPCdRQCg7m9ThEtTy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 715.8710167352311, + "y": 669.2559365499744, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 2058369354, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3kgcfqKSC119Vts5h_nWg", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1417, + "versionNonce": 1815387978, + "isDeleted": false, + "id": "3kgcfqKSC119Vts5h_nWg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 847.316329235232, + "y": 685.8621354970959, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.2924149685511566, + "seed": 1921144918, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VlXyMPCdRQCg7m9ThEtTy", + "focus": 0.03561765500796156, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "MQERmG_TTHLhJwKfqehAr", + "focus": 0.7478290302818336, + "gap": 7.285692198557172 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.2924149685511566 + ] + ] + }, + { + "type": "text", + "version": 2314, + "versionNonce": 375345750, + "isDeleted": false, + "id": "e_TJfU5-f0tr0032g1I2m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1500.8747505666038, + "y": 1200.0338608147845, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 231, + "height": 40, + "seed": 865405462, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1082" + }, + { + "type": "rectangle", + "version": 1997, + "versionNonce": 447649686, + "isDeleted": false, + "id": "pWOj9caE7KB3XHDbMSg0S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2507.3467238219796, + "y": 243.6977036981849, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 1065365142, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1579, + "versionNonce": 517526730, + "isDeleted": false, + "id": "66Cg7L-YsfE3ZFXe-2LQL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2521.977350687726, + "y": 249.12090972109104, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 449850826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2372, + "versionNonce": 2002990294, + "isDeleted": false, + "id": "Wj8PWU5wnkz7U8lvblU3U", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2937.8376858023325, + "y": 241.03842966644868, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 1542056918, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2311, + "versionNonce": 188197770, + "isDeleted": false, + "id": "pRV42FOTjYkKJYnUgKb6l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2658.035296814221, + "y": 242.60981025674812, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 551281802, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1381, + "versionNonce": 638724630, + "isDeleted": false, + "id": "AERP1ARLHUZdaIQPJRCGu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.87205348929, + "y": 249.63272418872452, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 1453981974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1508, + "versionNonce": 453880394, + "isDeleted": false, + "id": "MLAorr83tAGsrUS9fcYKo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2955.4040545000776, + "y": 249.7759533553924, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 1103283018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2455, + "versionNonce": 632321878, + "isDeleted": false, + "id": "dtTYmwaotDlgQQlg7Xbns", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 582.7229795730589, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1127575126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2634, + "versionNonce": 624283914, + "isDeleted": false, + "id": "jJiUXlgovk-ViFbfXi1cC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 601.4969232999167, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1205848586, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2818, + "versionNonce": 1318263958, + "isDeleted": false, + "id": "cMfpU_9RWO_ldt64kULAL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 620.2714026753663, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2120299414, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2699, + "versionNonce": 1831542730, + "isDeleted": false, + "id": "_hICWBWri3Vb4bKy89BKH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.177356413059, + "y": 582.8097007403203, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2049833162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2876, + "versionNonce": 644815318, + "isDeleted": false, + "id": "k3ijfVNOzI51IpN-U0f7n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.537858327686, + "y": 601.5836444671786, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 39997654, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3060, + "versionNonce": 252221066, + "isDeleted": false, + "id": "mczF970BUWR9dCA0Rfwlg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.4576300181716, + "y": 620.3581238426277, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 138956682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2762, + "versionNonce": 878276374, + "isDeleted": false, + "id": "d6j-29IKQf4PU1W1Ckrs4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3017.6481595071805, + "y": 582.7849611569868, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 986564118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2939, + "versionNonce": 1804154186, + "isDeleted": false, + "id": "gLPBiGV-Fpz3ohYs6CWCQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3018.0086614218076, + "y": 601.5589048838451, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1986645578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3123, + "versionNonce": 1422335062, + "isDeleted": false, + "id": "ypRIUdLWGuoNWXQbMNQas", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3017.928433112293, + "y": 620.3333842592942, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1486394198, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4748, + "versionNonce": 336067594, + "isDeleted": false, + "id": "PaA6_N4i8mBfh6IWtJgsV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.6889869320585, + "y": 283.2747585173578, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 158168330, + "groupIds": [ + "LqyJbO82T9Tz_zh9FaXqX" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5427, + "versionNonce": 227352982, + "isDeleted": false, + "id": "Gw2eBgsuxsg2VlKRwbtKO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.745111370084, + "y": 282.2755847595116, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 639088790, + "groupIds": [ + "LqyJbO82T9Tz_zh9FaXqX" + ], + "roundness": null, + "boundElements": [ + { + "id": "_YjTxlDG87CIdOOLU9b08", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2524, + "versionNonce": 914352842, + "isDeleted": false, + "id": "p0DVISkFBiGtIIbd6AsVu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.4166494652964, + "y": 286.09706102849293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 852378570, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1466, + "versionNonce": 1642102486, + "isDeleted": false, + "id": "lWLTYQPIBBONW7KEC20Zq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 286.1218025694849, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1526740438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1532, + "versionNonce": 160170378, + "isDeleted": false, + "id": "9dQM9xr4iE3Q8KkNb6ZjL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.2615554546933, + "y": 286.1218025694849, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2091334282, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1290, + "versionNonce": 643183638, + "isDeleted": false, + "id": "vTCSThHVsBtVi_-9zwayc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.5052449762684, + "y": 287.4637013712652, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1885801238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1657, + "versionNonce": 946290762, + "isDeleted": false, + "id": "4RSGzIhqjwypztdfOZ-aM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2447.3916228699177, + "y": 288.4633336577359, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1974688074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1745, + "versionNonce": 1424179542, + "isDeleted": false, + "id": "DBDnsNNIqoGgZc53sz0pb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 359.66779659721817, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1958819926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1877, + "versionNonce": 1324132106, + "isDeleted": false, + "id": "NjY_7TWm_jNBkBoDggCU9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 373.44762614267404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 491626506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1886, + "versionNonce": 1625073302, + "isDeleted": false, + "id": "hsPFUyCfIdD25xowKMR3k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 386.6170972965198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1608760726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1743, + "versionNonce": 630666698, + "isDeleted": false, + "id": "Ot7FznlQfCbvOnn6seKd5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.4225348315313, + "y": 358.43790585392685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1332809418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1859, + "versionNonce": 183985110, + "isDeleted": false, + "id": "YXQ2Fs-Sn2aRlbFc2Xwfy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.7094666497114, + "y": 372.2177353993809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1728289494, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1868, + "versionNonce": 1300360330, + "isDeleted": false, + "id": "fGKh6RPdkCWqrk6wlkhIY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.734406553559, + "y": 385.38720655322663, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 817407370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1789, + "versionNonce": 893942038, + "isDeleted": false, + "id": "OdvaidDYe_wDJ5HegSRka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.122149478681, + "y": 358.48691153574487, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1354092566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1905, + "versionNonce": 2087177034, + "isDeleted": false, + "id": "6nkhaaiDymQFURub_drPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.409081296863, + "y": 372.2667410811989, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 442459210, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1914, + "versionNonce": 927262294, + "isDeleted": false, + "id": "OupMWQIO8HkIzJP3F3gX1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.4340212007105, + "y": 385.43621223504465, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1223646550, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2634, + "versionNonce": 2024002058, + "isDeleted": false, + "id": "L5M1FEAdApBDgAPURIhNP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.589472738356, + "y": 318.32114460910725, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 104876810, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1616, + "versionNonce": 834775958, + "isDeleted": false, + "id": "wHvXC7k1v1lDEBUBOwnD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 318.2714484285517, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 889537174, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1679, + "versionNonce": 87097546, + "isDeleted": false, + "id": "9stpsGPgDZRK48xEqx5go", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.5852322748647, + "y": 318.2714484285517, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2060868042, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1443, + "versionNonce": 1660143830, + "isDeleted": false, + "id": "Kfl__Y3G27Rg_DhKu9xyi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.8289217964398, + "y": 318.35813693933903, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 128745430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1803, + "versionNonce": 1303009162, + "isDeleted": false, + "id": "WOjhBbun-WrZaKsluuPm-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2447.715299690089, + "y": 320.5568638254855, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 2000457866, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3412, + "versionNonce": 2054176278, + "isDeleted": false, + "id": "6TycpKEFxVMASLkw0QA3d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.693119492263, + "y": 350.82394634562013, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 351933718, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2435, + "versionNonce": 1380636234, + "isDeleted": false, + "id": "GEzNqcYGjHLXojcholYji", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 350.8953439150647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1596845898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2503, + "versionNonce": 1831603030, + "isDeleted": false, + "id": "t6rKejep6V0ALzUNP2_ss", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.771860209185, + "y": 350.8953439150647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1717764694, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2246, + "versionNonce": 1408072970, + "isDeleted": false, + "id": "k1LLV6XmP8aiHepeNbCPH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2942.01554973076, + "y": 350.9820324258519, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1728411146, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2625, + "versionNonce": 1232875670, + "isDeleted": false, + "id": "_g_bU1RV-5EVKLLHtitbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2446.9019276244094, + "y": 353.2522810317679, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 247220118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3156, + "versionNonce": 1074613194, + "isDeleted": false, + "id": "Xh7_8qca1VJs2lw9dACUZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.180734744496, + "y": 414.38707857584336, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 2143167690, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2252, + "versionNonce": 185970134, + "isDeleted": false, + "id": "YacFD9jL89-waL0-M4IVW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 414.429158233472, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 2117788886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2320, + "versionNonce": 482689674, + "isDeleted": false, + "id": "tH5ZVq3Qskxyz0i_VyHVg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.48358900191, + "y": 414.429158233472, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1123220362, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2068, + "versionNonce": 1863156502, + "isDeleted": false, + "id": "xfKKb37kmK-4DBrH_xGST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.727278523485, + "y": 414.5158467442592, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1450433046, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2431, + "versionNonce": 1959813450, + "isDeleted": false, + "id": "5Ld0zQneqRNaceeYMBS3x", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2419.6136564171347, + "y": 416.5748227784212, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 1591671370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5296, + "versionNonce": 1205383254, + "isDeleted": false, + "id": "qCOACf_-BqBXPXxg1DVFo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.3958095837284, + "y": 443.68894852965093, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1046226774, + "groupIds": [ + "WbhmfdmEQzI5ceP26x_NP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5975, + "versionNonce": 1133094922, + "isDeleted": false, + "id": "E45ogxhmy1byRnHG7lRjI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.451934021754, + "y": 442.68977477180454, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 39657738, + "groupIds": [ + "WbhmfdmEQzI5ceP26x_NP" + ], + "roundness": null, + "boundElements": [ + { + "id": "-04dLzEB2MhYPnVa6qYiw", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3268, + "versionNonce": 1363948950, + "isDeleted": false, + "id": "ojui0YA6_zg1L0giHfrSb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.742320286517, + "y": 445.94864327333767, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 910740630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2356, + "versionNonce": 1626085066, + "isDeleted": false, + "id": "BwFh7s9wPF9O5-JfnrbQm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 446.09723521370427, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1223192522, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2423, + "versionNonce": 77402838, + "isDeleted": false, + "id": "cpneQfHnsrxTTw7d_G6NA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.2172759103782, + "y": 446.09723521370427, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1810811350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2171, + "versionNonce": 1838329226, + "isDeleted": false, + "id": "Wb6shCrHs1dxXj_6khnIa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.4609654319534, + "y": 446.1839237244916, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 647751306, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2522, + "versionNonce": 1818249238, + "isDeleted": false, + "id": "iXlbtlfx_VRhIhWjZGeRk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2418.3473433256013, + "y": 448.5809387315602, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 241377046, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3482, + "versionNonce": 1052273738, + "isDeleted": false, + "id": "p7gwyelhvWMyE3SgyViDY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.176571304038, + "y": 479.51641912090616, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1412597066, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2499, + "versionNonce": 2022364502, + "isDeleted": false, + "id": "lS25rbCjdQfw2YvfibjSg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 478.73099454897823, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 572181590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2570, + "versionNonce": 1245205258, + "isDeleted": false, + "id": "NF1KXJK-5z5yDHE3wK9lz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.5409527305496, + "y": 478.73099454897823, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 990333962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4344, + "versionNonce": 1383185046, + "isDeleted": false, + "id": "kt_dGcsR7ef7M6F49EQSp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.5633115130345, + "y": 509.8129061412071, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1424675222, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hicqNte9JKDbcQ-UbMc4P", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3331, + "versionNonce": 311255498, + "isDeleted": false, + "id": "KjHJ8T8_-vsz0O8LndffR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 509.4788997872706, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1628781258, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3398, + "versionNonce": 818542550, + "isDeleted": false, + "id": "OXvqeLygwrPzAmx4GimdM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.727580664869, + "y": 509.4788997872706, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1376267990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3143, + "versionNonce": 315791498, + "isDeleted": false, + "id": "uXZFdanVAFIwAdvPMCerI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.971270186444, + "y": 509.5655882980577, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1425494410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2116, + "versionNonce": 732466454, + "isDeleted": false, + "id": "4ICG-etq8I2892YZ3mTVu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 518.2181313626324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 369615894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2236, + "versionNonce": 717420362, + "isDeleted": false, + "id": "q3VH05johldBe24_VZdbv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 531.9979609080883, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 434671690, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2245, + "versionNonce": 276986454, + "isDeleted": false, + "id": "dTA_h83l8unSmBf8DARz3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 545.167432061934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1121907030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2119, + "versionNonce": 179928586, + "isDeleted": false, + "id": "UUx9UnBRuuZIaSELgYEP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.382078525153, + "y": 516.988240619341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 331609866, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2235, + "versionNonce": 908902294, + "isDeleted": false, + "id": "yCoN-rptdoaSKEIVeenX1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.669010343333, + "y": 530.7680701647951, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1944213142, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2244, + "versionNonce": 531705034, + "isDeleted": false, + "id": "ML-Xvh5mc0M9Uefhf1gHg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.6939502471805, + "y": 543.937541318641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1929676234, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2165, + "versionNonce": 1356618966, + "isDeleted": false, + "id": "szLD0TowT11CnzigHzKga", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.0816931723025, + "y": 517.037246301159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 298259414, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2281, + "versionNonce": 2135229322, + "isDeleted": false, + "id": "OCMFfxPQQH7Iac3HyDTWi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.3686249904845, + "y": 530.8170758466131, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 549797002, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2290, + "versionNonce": 1176916502, + "isDeleted": false, + "id": "gX2_CEHworkrbQ7D6F8GN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.393564894332, + "y": 543.986547000459, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 648161558, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3585, + "versionNonce": 1404043850, + "isDeleted": false, + "id": "6dTmfGDapN_vOOxpfuX2v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.327049496445, + "y": 572.3062702195045, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 717298506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2629, + "versionNonce": 16752470, + "isDeleted": false, + "id": "wb--3FvQNraygmIX9r1qu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2535.2839396929153, + "y": 572.6032175455405, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 837326422, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2699, + "versionNonce": 1204627722, + "isDeleted": false, + "id": "ypnwujl6UjVWz_dFoP_ER", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.4431326955305, + "y": 572.6032175455405, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 793977354, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2444, + "versionNonce": 1170031766, + "isDeleted": false, + "id": "WZxkIggKKWAfSvLfzzLBI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.6868222171056, + "y": 572.6899060563278, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2087672726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2786, + "versionNonce": 1930917834, + "isDeleted": false, + "id": "wc744o3Sxw3002itW9wKH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2407.573200110757, + "y": 575.1251575438355, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 1232490698, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4924, + "versionNonce": 101990870, + "isDeleted": false, + "id": "nal558VBswtmh0fsQQ-SM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.3500030386635, + "y": 667.5013215389424, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1818982614, + "groupIds": [ + "7h8JcUbe6uzMUGYZd-4cZ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5603, + "versionNonce": 1168764554, + "isDeleted": false, + "id": "tDMAG6WJUKTBF5siocecU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.4061274766896, + "y": 666.5021477810963, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 2093328266, + "groupIds": [ + "7h8JcUbe6uzMUGYZd-4cZ" + ], + "roundness": null, + "boundElements": [ + { + "id": "PM05sS8aLlBRdIXcZwKbQ", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3950, + "versionNonce": 890869526, + "isDeleted": false, + "id": "L4Z2jH_7U6_rfqD8KxdCM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2502.1883021467283, + "y": 670.5470417181568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 1500638742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2886, + "versionNonce": 1950321994, + "isDeleted": false, + "id": "bmxIrKK4vj6-mniHV4rC5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 670.2837559977436, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 561784394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2954, + "versionNonce": 457327702, + "isDeleted": false, + "id": "ZrToI0TrtVt9kMn7qGNSd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2663.976930618951, + "y": 670.2837559977436, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1618459478, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2698, + "versionNonce": 1681085450, + "isDeleted": false, + "id": "AjUPqk8Da_o_UtGlGtKms", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.2206201405256, + "y": 670.3704445085307, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1349831946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 711149974, + "isDeleted": false, + "id": "4DQWOr6aIXh9VrCb9F4B5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2376.1069980341736, + "y": 672.040349758654, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 936501398, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3959, + "versionNonce": 394281674, + "isDeleted": false, + "id": "4NDRPe58KxcR9OwKtyg84", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.0214022513933, + "y": 702.7139656130644, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1328192458, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3029, + "versionNonce": 1370597078, + "isDeleted": false, + "id": "ye3n9ViOVdNowHg4ToOSK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 702.3785012582387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 53829078, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3106, + "versionNonce": 415324554, + "isDeleted": false, + "id": "YzkJwHQaKNS4uRpRIxoAQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.3006074391224, + "y": 702.3785012582387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2075693706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2844, + "versionNonce": 1371692054, + "isDeleted": false, + "id": "WlXMnS8hjom5YoP3nAvsj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.544296960697, + "y": 702.4651897690258, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 666317590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4771, + "versionNonce": 1731303498, + "isDeleted": false, + "id": "b9Ma96rWblzVxxpmCWx2x", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.0155688133077, + "y": 734.8674784175614, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 953790794, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3852, + "versionNonce": 277506390, + "isDeleted": false, + "id": "-G4rQ16FDCrEv9jGWTjFu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 734.8177822370058, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 533487702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3925, + "versionNonce": 1655439114, + "isDeleted": false, + "id": "389SeaHiJkWVwkR0pDakl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.3885180759635, + "y": 734.8177822370058, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1508440074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3667, + "versionNonce": 1834929814, + "isDeleted": false, + "id": "c-m83xxuyfBPwUzmghk5b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.7309248950164, + "y": 734.9044707477931, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1330242966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2643, + "versionNonce": 933989834, + "isDeleted": false, + "id": "32FplZcKqnjFXju2EZ1FX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 743.8116920389946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 249652938, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2759, + "versionNonce": 351570902, + "isDeleted": false, + "id": "ffZHT1qmW18EDOK8nGatL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 757.5915215844504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1466221270, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2768, + "versionNonce": 1263223946, + "isDeleted": false, + "id": "rXzbuozFp3A41bgX8AecV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 770.7609927382962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1348337034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2644, + "versionNonce": 1432396054, + "isDeleted": false, + "id": "790kshXeZMzXamnCCVUaW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.1417332337264, + "y": 742.5818012957034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1790048278, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2759, + "versionNonce": 658907978, + "isDeleted": false, + "id": "m30ibOMGuMJB5yyLKvDaB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.341976541119, + "y": 756.2749423303701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1268366410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2768, + "versionNonce": 1914179158, + "isDeleted": false, + "id": "Ff9R2zjUljTPPVPwPkEO5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.3669164449666, + "y": 769.4444134842158, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 556172630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2690, + "versionNonce": 1710696970, + "isDeleted": false, + "id": "AMFQ4PliEitPXY1sQqHj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3018.841347880874, + "y": 742.6308069775214, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1315939082, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2805, + "versionNonce": 2012205974, + "isDeleted": false, + "id": "DEUAbTbsTJo9tVddYMGun", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.0415911882706, + "y": 756.3239480121881, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1276603030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2814, + "versionNonce": 509171914, + "isDeleted": false, + "id": "UkDmB1iNHNOJj5MNm4fYC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.066531092118, + "y": 769.4934191660338, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 861581770, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4103, + "versionNonce": 287109334, + "isDeleted": false, + "id": "0sIwnhyibrNzAZCYtvjv1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.0303089618883, + "y": 798.4410865730092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1245292502, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2781, + "versionNonce": 1342680970, + "isDeleted": false, + "id": "axgtTftR1DFWrwfGTsNS1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1299572874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2941, + "versionNonce": 1496606230, + "isDeleted": false, + "id": "Y0qQiaxjpb74usFWOHNvs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2665.14384774988, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1537359126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2662, + "versionNonce": 1329409610, + "isDeleted": false, + "id": "RlUnl-FH8d0tPyRufc7gd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2942.5974827248124, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1417430858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2901, + "versionNonce": 824914774, + "isDeleted": false, + "id": "SXOVtYO90RmHS4Mvd_twC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2377.118867130689, + "y": 800.22248419735, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1975921238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1822, + "versionNonce": 819254538, + "isDeleted": false, + "id": "-40-8yAvmOGaO7N9VpPFw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2188.9664434973924, + "y": 293.60184225491594, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 1355337226, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "_YjTxlDG87CIdOOLU9b08", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1780, + "versionNonce": 324425878, + "isDeleted": false, + "id": "_YjTxlDG87CIdOOLU9b08", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2318.446254500894, + "y": 314.5374756147203, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 393899926, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-40-8yAvmOGaO7N9VpPFw", + "focus": 0.12412743246042555, + "gap": 10.479811003501709 + }, + "endBinding": { + "elementId": "Gw2eBgsuxsg2VlKRwbtKO", + "focus": 0.6408863246638227, + "gap": 8.560575619190104 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2536, + "versionNonce": 910795722, + "isDeleted": false, + "id": "YEOH1zgGsxDb7E2LcL8IA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2192.2509394957756, + "y": 446.7167404704105, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 123108554, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-04dLzEB2MhYPnVa6qYiw", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1726, + "versionNonce": 1735054806, + "isDeleted": false, + "id": "-04dLzEB2MhYPnVa6qYiw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2319.8915644957765, + "y": 469.25004168826075, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 485756118, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YEOH1zgGsxDb7E2LcL8IA", + "focus": 0.037566857262252715, + "gap": 8.64062500000091 + }, + "endBinding": { + "elementId": "E45ogxhmy1byRnHG7lRjI", + "focus": 0.45569078885697434, + "gap": 3.7244320259774213 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2815, + "versionNonce": 968268426, + "isDeleted": false, + "id": "Y9KxOYR3E59kj1hukW9io", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2186.8484428317006, + "y": 678.0131219945386, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 1707103114, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PM05sS8aLlBRdIXcZwKbQ", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1464, + "versionNonce": 1451076374, + "isDeleted": false, + "id": "PM05sS8aLlBRdIXcZwKbQ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2318.2937553317015, + "y": 694.6193209416601, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.2924149685511566, + "seed": 331874838, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Y9KxOYR3E59kj1hukW9io", + "focus": 0.03561765500796531, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "tDMAG6WJUKTBF5siocecU", + "focus": 0.7478290302818332, + "gap": 7.285692198557399 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.2924149685511566 + ] + ] + }, + { + "type": "rectangle", + "version": 4498, + "versionNonce": 433502538, + "isDeleted": false, + "id": "fdy-50lmxNxu7hkQfN3YW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3281.83941706825, + "y": 373.16261314321514, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 1412657738, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3446, + "versionNonce": 520345686, + "isDeleted": false, + "id": "lsLjZQxTVRzodEv9JkDKL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3304.108134136772, + "y": 426.21518475779885, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 1353396054, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2909, + "versionNonce": 637861898, + "isDeleted": false, + "id": "Bi2qF4khGXVkg9kju39Yh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3332.6404987596147, + "y": 431.44361937882877, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 1180866826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3720, + "versionNonce": 1758616982, + "isDeleted": false, + "id": "GlbybtP_On5KGAdjGjONf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3452.873271234916, + "y": 424.83600724043663, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 964088982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4575, + "versionNonce": 171732682, + "isDeleted": false, + "id": "yI6YLYqWrB2TXXIey4Lb9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3296.0149813043595, + "y": 466.0224813565983, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 1568597962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2744, + "versionNonce": 421411542, + "isDeleted": false, + "id": "DdS2U6EZQGpfv306_ABg6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3356.881734776582, + "y": 469.5161287682158, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1813762518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2847, + "versionNonce": 991430026, + "isDeleted": false, + "id": "sCFGX-236ejMqZ1datnXG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3455.924703526582, + "y": 468.2661287682158, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1369661066, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hkhoeNjFEoC21b0x7dDgo", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2705, + "versionNonce": 645689366, + "isDeleted": false, + "id": "O_JJJ2ygDlQH8PLhQARRq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3554.4485130503913, + "y": 431.86874533567516, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 330245910, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2995, + "versionNonce": 1641202762, + "isDeleted": false, + "id": "UaXlA7ebrV89Unxrv6qop", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.553640917981, + "y": 509.990506254956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 529202506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3111, + "versionNonce": 1826749782, + "isDeleted": false, + "id": "aWfqLTqx9KVfE2ieqoLDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.840572736163, + "y": 523.7703358004119, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 816174166, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3120, + "versionNonce": 1212656394, + "isDeleted": false, + "id": "6uaGFybhLsxSmBGrUpIvl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.8655126400104, + "y": 536.9398069542576, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1955644426, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3082, + "versionNonce": 27517590, + "isDeleted": false, + "id": "LZFFvqJC5gQ7815X-mBfs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3574.9989943926325, + "y": 508.6739270008775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1825888662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3198, + "versionNonce": 1156692426, + "isDeleted": false, + "id": "EL7VNVMBK49T6e_eOH3Gq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3575.2859262108127, + "y": 522.4537565463315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 447722186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3207, + "versionNonce": 125247446, + "isDeleted": false, + "id": "LRyXlsOoALxApYV4hDiVl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3575.3108661146603, + "y": 535.6232277001773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1869690582, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4217, + "versionNonce": 652996746, + "isDeleted": false, + "id": "vUt5x25ixJXerhfpTOVmS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3296.459751874531, + "y": 498.7449177743474, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 1686292874, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8AhUM4jsXM6vQonhRP5Vn", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2896, + "versionNonce": 40940822, + "isDeleted": false, + "id": "WWKZt1ntiYKr5KTkj4nFO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3338.3304115967535, + "y": 499.60965893596494, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 823127062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2991, + "versionNonce": 569462602, + "isDeleted": false, + "id": "PjRm6Dkk6a3-XSs_XAyU8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3458.2483803467535, + "y": 499.2240853057558, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 423954506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4113, + "versionNonce": 738566742, + "isDeleted": false, + "id": "Qfx40EWL_yJoAjymWKvzJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3297.4965608969037, + "y": 558.9103634730327, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 1336277334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3055, + "versionNonce": 979162634, + "isDeleted": false, + "id": "hXAIL6pFcCr0G_vfdQ5qV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3304.3672206191263, + "y": 560.5431392196315, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1624338186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3162, + "versionNonce": 1191896982, + "isDeleted": false, + "id": "faWWPxWLgAgH2Fnzjlan9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3456.149615738917, + "y": 559.8175810360071, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1653104278, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "TyOVJdp7tv778ruJgy3Iv", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2975, + "versionNonce": 824804554, + "isDeleted": false, + "id": "6tN6iOxfRSwixeOm4WMUW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3455.1485533529726, + "y": 381.7831643584934, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 799210954, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2392, + "versionNonce": 1941275862, + "isDeleted": false, + "id": "guRf-DGiVFYAHaPXQuYGg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3189.8261327180458, + "y": 561.3018275529366, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1315707862, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2541, + "versionNonce": 1878154122, + "isDeleted": false, + "id": "otbmwMA9DieAcgaKiiwQ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3218.8026952180458, + "y": 468.69454518686507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 852800650, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2547, + "versionNonce": 60455446, + "isDeleted": false, + "id": "UnKL1QNuvNo22NWVnKgcF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3221.2480077180458, + "y": 502.04122487436507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 426127638, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2334, + "versionNonce": 1962039882, + "isDeleted": false, + "id": "DJTD1dOn11IaXToM1h-sW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3777.4213551086164, + "y": 420.97677174936507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 203, + "height": 40, + "seed": 1008833354, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hkhoeNjFEoC21b0x7dDgo", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 0" + }, + { + "type": "arrow", + "version": 1114, + "versionNonce": 1303299926, + "isDeleted": false, + "id": "hkhoeNjFEoC21b0x7dDgo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3770.7190671621925, + "y": 449.9603487061768, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 48.41553489057196, + "height": 23.729966514004445, + "seed": 1055628886, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "DJTD1dOn11IaXToM1h-sW", + "focus": 0.6315527656085902, + "gap": 6.702287946423894 + }, + "endBinding": { + "elementId": "sCFGX-236ejMqZ1datnXG", + "focus": 0.875865929578657, + "gap": 11.37882874503839 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -48.41553489057196, + 23.729966514004445 + ] + ] + }, + { + "type": "arrow", + "version": 1056, + "versionNonce": 1057259786, + "isDeleted": false, + "id": "8AhUM4jsXM6vQonhRP5Vn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3794.4734157035423, + "y": 506.43706416279133, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 72.49159598081201, + "height": 0.9767917052906796, + "seed": 769956362, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Fob6PQcyHTpjDCWe_cAzs", + "focus": -0.0026555591700033686, + "gap": 1 + }, + "endBinding": { + "elementId": "vUt5x25ixJXerhfpTOVmS", + "focus": 0.09326585366049385, + "gap": 2.646949476986947 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -72.49159598081201, + 0.9767917052906796 + ] + ] + }, + { + "type": "arrow", + "version": 799, + "versionNonce": 38235286, + "isDeleted": false, + "id": "TyOVJdp7tv778ruJgy3Iv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3796.12384477162, + "y": 587.7104569552184, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 74.6171875, + "height": 14.890625, + "seed": 64054166, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "faWWPxWLgAgH2Fnzjlan9", + "focus": -0.6914733701556606, + "gap": 10.357041532703079 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -74.6171875, + -14.890625 + ] + ] + }, + { + "type": "text", + "version": 2336, + "versionNonce": 967036874, + "isDeleted": false, + "id": "Fob6PQcyHTpjDCWe_cAzs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3795.4734157035423, + "y": 485.046465751077, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 196, + "height": 40, + "seed": 1729677514, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8AhUM4jsXM6vQonhRP5Vn", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1" + }, + { + "type": "text", + "version": 2419, + "versionNonce": 2132371926, + "isDeleted": false, + "id": "QkSUhuBq3IJkHub-09Ab4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3774.4430642764423, + "y": 571.7831140565827, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 231, + "height": 40, + "seed": 1246527702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1082" + }, + { + "type": "arrow", + "version": 529, + "versionNonce": 686507658, + "isDeleted": false, + "id": "vU55N_-jUk6NTTBoCvPcl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3141.122983196827, + "y": 754.1871684878633, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 87.80580015746273, + "height": 164.10832427172465, + "seed": 531785238, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "b9Ma96rWblzVxxpmCWx2x", + "focus": 1.027785426680333, + "gap": 9.23713780407411 + }, + "endBinding": { + "elementId": "guRf-DGiVFYAHaPXQuYGg", + "focus": -0.15098585348692564, + "gap": 8.777016663202062 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 87.80580015746273, + -164.10832427172465 + ] + ] + }, + { + "type": "arrow", + "version": 453, + "versionNonce": 590987030, + "isDeleted": false, + "id": "hicqNte9JKDbcQ-UbMc4P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3142.362019983864, + "y": 512.8125568107583, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.86609707639809, + "height": 0.7083324747919733, + "seed": 929881354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kt_dGcsR7ef7M6F49EQSp", + "focus": -0.7803713931671208, + "gap": 8.360252613271996 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.86609707639809, + 0.7083324747919733 + ] + ] + }, + { + "type": "arrow", + "version": 546, + "versionNonce": 362145098, + "isDeleted": false, + "id": "OlRGFFrc3VVyCZZcg8VsU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3145.092160585339, + "y": 368.04004887401055, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 65.59221172581238, + "height": 88.44427935692812, + "seed": 274717514, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6TycpKEFxVMASLkw0QA3d", + "focus": -1.002715617808851, + "gap": 13.644565578390711 + }, + "endBinding": { + "elementId": "otbmwMA9DieAcgaKiiwQ8", + "focus": -0.554738507787712, + "gap": 12.210216955926398 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 65.59221172581238, + 88.44427935692812 + ] + ] + }, + { + "type": "text", + "version": 2349, + "versionNonce": 589130838, + "isDeleted": false, + "id": "yXMjDxyl8sGOd0hgO2xLT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.0006501169164, + "y": 1499.6077771985297, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 24904022, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2465, + "versionNonce": 956214282, + "isDeleted": false, + "id": "-QrwXjYMBBNdBaYqONhY7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.2875819350966, + "y": 1513.3876067439837, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1698686730, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2474, + "versionNonce": 1553559958, + "isDeleted": false, + "id": "SWRxX7CnLCkFGI79Kr-y6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.3125218389441, + "y": 1526.5570778978295, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2086495894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1763744458, + "isDeleted": false, + "id": "TGznz2D1iTZwx2y2kIton", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.365732888588, + "y": 1499.23864214908, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 717583562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2535, + "versionNonce": 719507158, + "isDeleted": false, + "id": "7N5H1VeOX4Hyzu6S278Fk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.652664706768, + "y": 1513.0184716945341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1712362710, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 76984714, + "isDeleted": false, + "id": "t6iQ_8U3tMlfedALMboAJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.6776046106156, + "y": 1526.1879428483799, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 814762890, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw b/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw new file mode 100644 index 00000000000..70fd87be90b --- /dev/null +++ b/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw @@ -0,0 +1,45782 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 6824, + "versionNonce": 2097790282, + "isDeleted": false, + "id": "5ZxJvUdKKFbADItwC72g7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4764.519916255, + "y": 2712.2757953292135, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 286.53253069673764, + "height": 190.76982807013113, + "seed": 1249442682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728655, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6986, + "versionNonce": 1609638934, + "isDeleted": false, + "id": "ehdSrK7xnucULy6jgHhg_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2112.814558997129, + "y": 2966.2789366615452, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 987625854, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7609, + "versionNonce": 775114826, + "isDeleted": false, + "id": "Nx7TcWB4qb3vzLoXkaJIV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.00161863388, + "y": 2966.3646123525123, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1698096482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7123, + "versionNonce": 2107650390, + "isDeleted": false, + "id": "l_xBG63oCgTdNAh8m2ts9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2111.3718506638024, + "y": 2899.0445616615452, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1511922110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7517, + "versionNonce": 1354151690, + "isDeleted": false, + "id": "S1Ur7AwT0czeXk2vw9QFT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2109.638337383888, + "y": 2834.48440401918, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1907878178, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6892, + "versionNonce": 1148950166, + "isDeleted": false, + "id": "FLB4RIJPYcbcCcuBHA7KY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2112.532006913805, + "y": 2834.398728328213, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 351285758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4595, + "versionNonce": 60769738, + "isDeleted": false, + "id": "BhAK0DZ0qMav-BiUxZCEg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2173.2729479298796, + "y": 2798.1717317770435, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 340.8218005952383, + "seed": 383939810, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3902, + "versionNonce": 2100843478, + "isDeleted": false, + "id": "a-RfaFs7S4ftHvSUUMcfu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2185.1369076771116, + "y": 2803.193553674859, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 25, + "seed": 374686270, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 5355, + "versionNonce": 1342700682, + "isDeleted": false, + "id": "hV4wi4lbEh7VbpXIyXxYH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2321.8033549143875, + "y": 2797.1666862041257, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 87.64195261437878, + "height": 342.412946428571, + "seed": 373655714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5291, + "versionNonce": 300640534, + "isDeleted": false, + "id": "XbPu9E6KM5z6iMuB7z3st", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.187252483831, + "y": 2839.858526481903, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 19810942, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4085, + "versionNonce": 1672207178, + "isDeleted": false, + "id": "s3wneKc5lBoFqCiGKBtEc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2226.2818705393865, + "y": 2840.5221549541257, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 663757922, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4134, + "versionNonce": 1644811862, + "isDeleted": false, + "id": "IWl8vz-ByuNiJugOk_tAC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2358.6881205393875, + "y": 2840.3528841207935, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1950108350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3973, + "versionNonce": 2095440394, + "isDeleted": false, + "id": "AyAQhUVmdz9DpqLMYHooy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2331.2809404798627, + "y": 2804.494563188253, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 71, + "height": 25, + "seed": 881936418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "rectangle", + "version": 5205, + "versionNonce": 375954326, + "isDeleted": false, + "id": "odFU6CJ50br3KdGRwLkZT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.5109293040023, + "y": 2871.983306649652, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 236995326, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2R8FpSvMDNmt2sCccOp2b", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6026, + "versionNonce": 1454444746, + "isDeleted": false, + "id": "ABodgSp0HUfSFjyEvOP_J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.6975572383226, + "y": 2906.5732551059336, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 355988450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4225, + "versionNonce": 1966913750, + "isDeleted": false, + "id": "9cN--cIWvFhTn4sKacIpc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5769447229814, + "y": 2873.1093131572507, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1901802302, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4338, + "versionNonce": 346580874, + "isDeleted": false, + "id": "cuZ53R8xr2P8AilW8Tg9g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5014238896492, + "y": 2907.6613964905846, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1267935138, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4255, + "versionNonce": 907750934, + "isDeleted": false, + "id": "SVZu2mftv_h3-eDreIuUI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.0248613896492, + "y": 2873.1119173239185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1213078398, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 4347, + "versionNonce": 788981322, + "isDeleted": false, + "id": "9zkrAsa-3t8WTEqcSk7hU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.6732988896492, + "y": 2906.5832714905846, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1070719842, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "rectangle", + "version": 5616, + "versionNonce": 1442380630, + "isDeleted": false, + "id": "smUZOSK4GQVuuHOVXv9sU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.27036005407, + "y": 2936.530794819577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 1228536766, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4414, + "versionNonce": 1588038922, + "isDeleted": false, + "id": "j6t0W0M3uUCFSWQ8V8wRS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2226.2438843596246, + "y": 2937.1944232918013, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 2084775714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4460, + "versionNonce": 1797988502, + "isDeleted": false, + "id": "_sqoNYY4EYi2EdLRH1i0g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2355.1579468596265, + "y": 2937.0251524584673, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 977261566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W3" + }, + { + "type": "rectangle", + "version": 5527, + "versionNonce": 151346122, + "isDeleted": false, + "id": "da1BMP8F8XNbA8-zPi1K0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.665268491888, + "y": 2968.534481237326, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1767240418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6353, + "versionNonce": 2036768214, + "isDeleted": false, + "id": "eNE335b2gsPO3ERqZ1R8r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.7806648085607, + "y": 3003.2455234436093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1969267774, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4551, + "versionNonce": 742085258, + "isDeleted": false, + "id": "H-Q3l6mXJIhLSKYFLzx-w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.6600522932204, + "y": 2969.7815814949263, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 161040034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4666, + "versionNonce": 1170240278, + "isDeleted": false, + "id": "KU0Q20pmKb2nr5rc1DtfT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5845314598864, + "y": 3004.3336648282584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1820159102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4579, + "versionNonce": 1258582346, + "isDeleted": false, + "id": "tod1UqsN3yE_bNx1kBEC4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.7251564598864, + "y": 2969.7841856615923, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 901522018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4675, + "versionNonce": 716021846, + "isDeleted": false, + "id": "-MPdOPJHcTgdNM_HP3P1W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.2564064598882, + "y": 3003.2555398282584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 760687806, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4558, + "versionNonce": 1488697354, + "isDeleted": false, + "id": "BeJZDUFl4HlhFc7BnWZJW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.9636089770765, + "y": 2840.8657606825946, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 1485669922, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 4631, + "versionNonce": 1812145558, + "isDeleted": false, + "id": "rZIZ7LvjJ1G4VU14lV5-H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2115.2292339770765, + "y": 2873.20083012704, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 40, + "height": 20, + "seed": 1703863550, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "EIOF3EPTwu2X2yK4S4cFx", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "text", + "version": 4666, + "versionNonce": 626796234, + "isDeleted": false, + "id": "NKK6RmioR78Y_pA9JZVr2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.396768699299, + "y": 2904.845795404817, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 721187298, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "text", + "version": 4641, + "versionNonce": 183894742, + "isDeleted": false, + "id": "oWpXpnS_RUsFqvqPy71os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.0712478659652, + "y": 2937.0636773492624, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1722127678, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gSdOMX7r_67h9iMy6uc_l", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 3", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 3" + }, + { + "type": "text", + "version": 4617, + "versionNonce": 1233173898, + "isDeleted": false, + "id": "xzgXiU63XHs6Jl3c_zOtL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.4792339770765, + "y": 2970.765934293706, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1880614306, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 4", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 4" + }, + { + "type": "text", + "version": 4621, + "versionNonce": 437991446, + "isDeleted": false, + "id": "orm-PSE4OCLXN_JmgLFI7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.3681228659652, + "y": 3003.986420404817, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 20, + "seed": 704396670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1dOOjUMqDLdFcktB-gRg8", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 5", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 5" + }, + { + "type": "rectangle", + "version": 7749, + "versionNonce": 308575306, + "isDeleted": false, + "id": "_Au7e5I2HkB5LrDuzf-J0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2108.4156811338853, + "y": 2899.130237352514, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 317, + "height": 58.68447577621506, + "seed": 823058786, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZoOy6zcVf_A308U8XrjDJ", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7162, + "versionNonce": 292013398, + "isDeleted": false, + "id": "AiKDcbGLX147-LvpMse_b", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2111.7258179313367, + "y": 3034.7298177808043, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1423171006, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7787, + "versionNonce": 1843553034, + "isDeleted": false, + "id": "aCiNrtIVoeEA8BwTfTrgF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2108.9128775680883, + "y": 3034.8154934717713, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 2033214754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5703, + "versionNonce": 573614742, + "isDeleted": false, + "id": "IcOul4HQsS7ySIU51-tw8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2164.5765274260966, + "y": 3036.985362356585, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1011709438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6536, + "versionNonce": 1450537418, + "isDeleted": false, + "id": "1xl2TUVEwjnnkCca2vEMW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2164.691923742769, + "y": 3071.6964045628683, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 300642530, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "c0fzQD_BcJb-2-zqdD-e3", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4726, + "versionNonce": 187361238, + "isDeleted": false, + "id": "BNt06YCT3AmmKRfScPR2M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.571311227429, + "y": 3038.2324626141854, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1768556094, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4846, + "versionNonce": 1060677770, + "isDeleted": false, + "id": "k4-OgUdfCRm-xRNHIkE3f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.495790394095, + "y": 3072.7845459475175, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1053754530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4757, + "versionNonce": 1818983702, + "isDeleted": false, + "id": "Q9zZqktZSMyORp-hAjiqd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.636415394095, + "y": 3038.2350667808514, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 487231102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W5", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W5" + }, + { + "type": "text", + "version": 4857, + "versionNonce": 2145847114, + "isDeleted": false, + "id": "MR1kuaRKWUKXjkH0JeXfN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.1676653940967, + "y": 3071.7064209475175, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 2039095394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W6", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W6" + }, + { + "type": "text", + "version": 4795, + "versionNonce": 459762262, + "isDeleted": false, + "id": "mTUKZSRYWfRt2Vh-1vclf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2111.390492911284, + "y": 3039.216815412965, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1408241342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 6", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 6" + }, + { + "type": "text", + "version": 4802, + "versionNonce": 1088130570, + "isDeleted": false, + "id": "5dmJNYXmkNOBvwYrSi_Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2111.279381800173, + "y": 3072.4373015240762, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 44, + "height": 20, + "seed": 770425890, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlCfen_-Yp9OwbDRJvDOx", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 7", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 7" + }, + { + "type": "text", + "version": 4924, + "versionNonce": 1995681686, + "isDeleted": false, + "id": "C3hyejITH6H86llsqbar-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2231.807843647889, + "y": 3084.5170900781086, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1253803774, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5042, + "versionNonce": 1729182922, + "isDeleted": false, + "id": "ahOGTNm7nz8kLX7e-Shdy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.094775466071, + "y": 3098.2969196235645, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1977806818, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5051, + "versionNonce": 994397398, + "isDeleted": false, + "id": "OFin0H5KyTNA5E37MVH96", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.1197153699186, + "y": 3111.46639077741, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 32372542, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5100, + "versionNonce": 2298762, + "isDeleted": false, + "id": "ILPEs9gDdQgBJGDqDSuPu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.2531971225408, + "y": 3083.20051082403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1434362786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5226, + "versionNonce": 1441874454, + "isDeleted": false, + "id": "W4Z9FVp6utADZ7oekh4TU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.540128940721, + "y": 3096.980340369484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1105747838, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5235, + "versionNonce": 776737354, + "isDeleted": false, + "id": "AoQCz2UJrbKjv5sBo7miK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.5650688445685, + "y": 3110.14981152333, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1995300706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 6215, + "versionNonce": 61641226, + "isDeleted": false, + "id": "ynToXztLDxXyPLG-ujgbg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2558.0833403183005, + "y": 2810.5035653893992, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 251.25889756944446, + "height": 263.3309461805559, + "seed": 1261123618, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5052, + "versionNonce": 1218767766, + "isDeleted": false, + "id": "eybtNOoKuhzwIYXCBKtSH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2580.6645573868227, + "y": 2863.556137003983, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 197.2833214962126, + "seed": 979194622, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4415, + "versionNonce": 824295626, + "isDeleted": false, + "id": "Fl7yaLppSn2pwkhsSzomu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2609.1969220096653, + "y": 2868.633204437512, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 73, + "height": 25, + "seed": 588506082, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 5430, + "versionNonce": 997132502, + "isDeleted": false, + "id": "ER0hvl2LPDsBr8aEuGxbn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2729.4296944849666, + "y": 2862.05195948662, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 60.780841503267865, + "height": 199.05406605113606, + "seed": 863388478, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6282, + "versionNonce": 1032001418, + "isDeleted": false, + "id": "C3nI6jj5qV1pqyxs8KhRW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2572.57140455441, + "y": 2905.5323789152826, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 224.41844223484904, + "height": 19.07958491161571, + "seed": 410064802, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4343, + "versionNonce": 562265622, + "isDeleted": false, + "id": "PgPBBpU2WTlPXasE7yZjs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2740.0049363004423, + "y": 2869.0583303943586, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 42, + "height": 25, + "seed": 881273726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "rectangle", + "version": 5936, + "versionNonce": 1225496138, + "isDeleted": false, + "id": "_3ThBkVr5tP4Xuezzfc_U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2573.0161751245814, + "y": 2936.4930965830317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 223.03527462121252, + "height": 20.091303661616152, + "seed": 460444514, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-HRw9-i3s1WFaEyOW7EY_", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5818, + "versionNonce": 1339509590, + "isDeleted": false, + "id": "7ieK5Yf5SDD18kN8divCI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2574.0529841469543, + "y": 2965.232761031717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1808862142, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4578, + "versionNonce": 882261258, + "isDeleted": false, + "id": "MFRW6jrz-foZfaIBVrUat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2633.704976603023, + "y": 2818.9727494171766, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1046812450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 4044, + "versionNonce": 884961430, + "isDeleted": false, + "id": "Phqzht_TtG0nTrcWog7XI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2495.3591184680954, + "y": 2906.0354974330494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 393536510, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2R8FpSvMDNmt2sCccOp2b", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 4056, + "versionNonce": 228461514, + "isDeleted": false, + "id": "2hcFSCkVOGBNEpQpcLXFC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2494.8044309680954, + "y": 2937.2308099330494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50, + "height": 20, + "seed": 1908007650, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZoOy6zcVf_A308U8XrjDJ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 3880, + "versionNonce": 737209814, + "isDeleted": false, + "id": "sbGTFiedpGLLthzwL7fES", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.508393021666, + "y": 2906.0353656746174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 158577726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4038, + "versionNonce": 2050884234, + "isDeleted": false, + "id": "mq_M393rAjSAZFpPXuvTb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.770111771666, + "y": 2937.2580219246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1073690274, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4108, + "versionNonce": 1384170262, + "isDeleted": false, + "id": "g5nEAL53sxWgR2axnh8dF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.172455521666, + "y": 2967.3752094246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 732855422, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 3827, + "versionNonce": 623976778, + "isDeleted": false, + "id": "xMfa9QXvx72Y5GMARK1nv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.406830521667, + "y": 2906.3283344246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 165941858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3967, + "versionNonce": 1524887638, + "isDeleted": false, + "id": "YnLYRGy_a4KeqkMWodF9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2746.8130805216665, + "y": 2937.1877094246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 65420478, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 4009, + "versionNonce": 701655050, + "isDeleted": false, + "id": "t1mZGeZaLC3ANp7QShc3F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.5787055216665, + "y": 2965.9338031746174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1110930978, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4134, + "versionNonce": 1626305942, + "isDeleted": false, + "id": "Y9lJE5Z43I5bRw5IDybo-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2490.649018021666, + "y": 2967.0822406746174, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 57, + "height": 20, + "seed": 935064830, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 2" + }, + { + "type": "text", + "version": 4763, + "versionNonce": 1889994, + "isDeleted": false, + "id": "3k_ag_aV8iba0OEmS0hLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2842.0396430216715, + "y": 2904.2580219246174, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 703095266, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 8218, + "versionNonce": 1037587158, + "isDeleted": false, + "id": "FbY8kaSjKSSR9_mpWstIe", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2796.9035753133326, + "y": 2913.09300149931, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 42.593750000000455, + "height": 1.1352127296454455, + "seed": 280012094, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ER0hvl2LPDsBr8aEuGxbn", + "focus": -0.49308173705066843, + "gap": 6.693039325098198 + }, + "endBinding": { + "elementId": "3k_ag_aV8iba0OEmS0hLj", + "focus": -0.1421234942671109, + "gap": 2.542317708338487 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 42.593750000000455, + 1.1352127296454455 + ] + ] + }, + { + "type": "text", + "version": 4942, + "versionNonce": 1756065162, + "isDeleted": false, + "id": "JQiWAHQtr0Z586-dYZN76", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.0624075731903, + "y": 3009.311607958487, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 201708962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5062, + "versionNonce": 1546881046, + "isDeleted": false, + "id": "IQZZAJVTw4HRhoiZHolI0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.3493393913723, + "y": 3023.091437503943, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2444670, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5071, + "versionNonce": 1488530506, + "isDeleted": false, + "id": "wub8r77wGyriwF_VS-avO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.37427929522, + "y": 3036.2609086577886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2042548578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5126, + "versionNonce": 200676694, + "isDeleted": false, + "id": "9ZJFeTmsZkMdRZu_gENRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.5077610478425, + "y": 3007.9950287044085, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 593161662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5246, + "versionNonce": 1713443594, + "isDeleted": false, + "id": "EcPy_OO5GQvhC4pGietJT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.7946928660226, + "y": 3021.7748582498625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 107107618, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5255, + "versionNonce": 1450506902, + "isDeleted": false, + "id": "Up3XH3RweoEltwU3Xe6FC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.81963276987, + "y": 3034.9443294037083, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1198687742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5996, + "versionNonce": 861807050, + "isDeleted": false, + "id": "sCtxWGvWZnlQf-_rLbkNR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2574.005327552113, + "y": 2997.3642776765646, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 56582370, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4284, + "versionNonce": 1382365142, + "isDeleted": false, + "id": "lzz19Fp4n5X9u9cBZjB5A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.124798926825, + "y": 2999.648327631965, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1835865662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4183, + "versionNonce": 1535858826, + "isDeleted": false, + "id": "8fpx0fBmfwjqP2nLqEzbB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.5310489268254, + "y": 2998.065319819465, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1011152034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W5", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W5" + }, + { + "type": "text", + "version": 4309, + "versionNonce": 2010893590, + "isDeleted": false, + "id": "tWAtGodo4lkywsUJOvNib", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2491.601361426825, + "y": 2999.213757319465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1311481470, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "c0fzQD_BcJb-2-zqdD-e3", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 3" + }, + { + "type": "text", + "version": 4884, + "versionNonce": 1583593290, + "isDeleted": false, + "id": "MSBvbyhLtOMrK4nXtfV0-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2841.7629503133358, + "y": 2935.9532181671766, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 851578978, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "-HRw9-i3s1WFaEyOW7EY_", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "text", + "version": 4999, + "versionNonce": 1951251030, + "isDeleted": false, + "id": "U_kdR9a7Y4JT-7LY639rf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2842.1991482300036, + "y": 2965.4519160838445, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 1584340670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 7173, + "versionNonce": 2123366294, + "isDeleted": false, + "id": "-HRw9-i3s1WFaEyOW7EY_", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2797.1379503133307, + "y": 2945.2891556671766, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 39.407552083333485, + "height": 2.12239583333303, + "seed": 1389926142, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "_3ThBkVr5tP4Xuezzfc_U", + "focus": -0.45566325229548293, + "gap": 1.0865005675370867 + }, + "endBinding": { + "elementId": "MSBvbyhLtOMrK4nXtfV0-", + "focus": -0.365346377370317, + "gap": 5.217447916671517 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.407552083333485, + 2.12239583333303 + ] + ] + }, + { + "type": "arrow", + "version": 7205, + "versionNonce": 1914825930, + "isDeleted": false, + "id": "RmF54tXFilnBgKFYfzosl", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2797.553576003016, + "y": 2973.161248532484, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.51536389365083, + "height": 2.7579643258513897, + "seed": 1440669666, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "7ieK5Yf5SDD18kN8divCI", + "focus": -0.5531776293254858, + "gap": 1 + }, + "endBinding": { + "elementId": "U_kdR9a7Y4JT-7LY639rf", + "focus": -0.3161215814063423, + "gap": 1.1302083333366681 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.51536389365083, + 2.7579643258513897 + ] + ] + }, + { + "type": "text", + "version": 4195, + "versionNonce": 86695766, + "isDeleted": false, + "id": "O90FfPdBOVpaNffUrmvFm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1983.77558034926, + "y": 2846.4430553853235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 694341566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 2 rows" + }, + { + "type": "text", + "version": 4286, + "versionNonce": 1593174282, + "isDeleted": false, + "id": "B_YGDnWOZFi_gF09kFHcp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1984.36151784926, + "y": 2912.7399303853235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 784438050, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 2 rows" + }, + { + "type": "text", + "version": 4379, + "versionNonce": 578847894, + "isDeleted": false, + "id": "wPS1XXANdi_yeJFyUFhho", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.13886159926, + "y": 2975.4860241353235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1177430014, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 2\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 2\nwith 2 rows" + }, + { + "type": "text", + "version": 4558, + "versionNonce": 656947146, + "isDeleted": false, + "id": "j2JRx4fO2D9-W3WRiWxfp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1983.87712946204, + "y": 3043.9369052545826, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 421977826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 3\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 3\nwith 2 rows" + }, + { + "type": "arrow", + "version": 632, + "versionNonce": 705484566, + "isDeleted": false, + "id": "gSdOMX7r_67h9iMy6uc_l", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.079439125594, + "y": 2930.562724925605, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.35850694444434, + "height": 0.5598958333334849, + "seed": 1815812926, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "oWpXpnS_RUsFqvqPy71os", + "focus": 1.499965817649534, + "gap": 5.941056590324024 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.35850694444434, + 0.5598958333334849 + ] + ] + }, + { + "type": "arrow", + "version": 627, + "versionNonce": 1797279050, + "isDeleted": false, + "id": "1dOOjUMqDLdFcktB-gRg8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.4396821811492, + "y": 2996.7389402033823, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.64670138888914, + "height": 0, + "seed": 1781906110, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "orm-PSE4OCLXN_JmgLFI7", + "focus": 1.7247480201434882, + "gap": 7.2474802014348825 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.64670138888914, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 626, + "versionNonce": 265126998, + "isDeleted": false, + "id": "OlCfen_-Yp9OwbDRJvDOx", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2069.813814125594, + "y": 3063.4490096478276, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.824652777777374, + "height": 0, + "seed": 1702784354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "5dmJNYXmkNOBvwYrSi_Sp", + "focus": 1.89882918762487, + "gap": 8.988291876248695 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.824652777777374, + 0 + ] + ] + }, + { + "type": "text", + "version": 3376, + "versionNonce": 1803979158, + "isDeleted": false, + "id": "ycDjYz4VHBIH9n0EvKAsN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1981.069890514476, + "y": 2717.519322147822, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 340, + "height": 50, + "seed": 1048957694, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Searching for rows with URL = W3\nwhen UserID has low cardinality", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Searching for rows with URL = W3\nwhen UserID has low cardinality" + }, + { + "type": "rectangle", + "version": 6029, + "versionNonce": 320183318, + "isDeleted": false, + "id": "7UjVIYTTPuZqNHA_5jK1A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1966.4026813130877, + "y": 2705.095385515877, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1009.0225694444454, + "height": 452.9728732638886, + "seed": 394755198, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 397, + "versionNonce": 129128522, + "isDeleted": false, + "id": "EIOF3EPTwu2X2yK4S4cFx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.3928071811433, + "y": 2863.305780481156, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 33.916015625, + "height": 2.05078125, + "seed": 986478114, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "rZIZ7LvjJ1G4VU14lV5-H", + "focus": 1.4424947274438729, + "gap": 8.920411170933221 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 33.916015625, + 2.05078125 + ] + ] + }, + { + "type": "arrow", + "version": 354, + "versionNonce": 2014301142, + "isDeleted": false, + "id": "2R8FpSvMDNmt2sCccOp2b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2430.544592895429, + "y": 2867.911528249, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.75111607142867, + "height": 45.6640625, + "seed": 2086203070, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "odFU6CJ50br3KdGRwLkZT", + "focus": -1.125899389945349, + "gap": 12.01152817475986 + }, + "endBinding": { + "elementId": "Phqzht_TtG0nTrcWog7XI", + "focus": -0.6392384352629061, + "gap": 2.063409501237402 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.75111607142867, + 45.6640625 + ] + ] + }, + { + "type": "arrow", + "version": 348, + "versionNonce": 713294986, + "isDeleted": false, + "id": "ZoOy6zcVf_A308U8XrjDJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2428.0111107525718, + "y": 2932.1414389632864, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.24330357142867, + "height": 15.452008928570649, + "seed": 318118434, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "_Au7e5I2HkB5LrDuzf-J0", + "focus": -0.5287987231200575, + "gap": 2.5954296186864667 + }, + "endBinding": { + "elementId": "2hcFSCkVOGBNEpQpcLXFC", + "focus": -0.48641496639845494, + "gap": 5.550016644095194 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.24330357142867, + 15.452008928570649 + ] + ] + }, + { + "type": "arrow", + "version": 343, + "versionNonce": 856940822, + "isDeleted": false, + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.428521466858, + "y": 2997.3758139632864, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 57.08147321428555, + "height": 15.965401785714675, + "seed": 985315902, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "eNE335b2gsPO3ERqZ1R8r", + "focus": 0.5354276161442509, + "gap": 10.196033741631027 + }, + "endBinding": { + "elementId": "Y9lJE5Z43I5bRw5IDybo-", + "focus": 0.27707474574018387, + "gap": 5.139023340522726 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 57.08147321428555, + -15.965401785714675 + ] + ] + }, + { + "type": "arrow", + "version": 308, + "versionNonce": 560390986, + "isDeleted": false, + "id": "c0fzQD_BcJb-2-zqdD-e3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.155083966858, + "y": 3061.728492534715, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 59.17410714285711, + "height": 45.25111607142844, + "seed": 908542718, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1xl2TUVEwjnnkCca2vEMW", + "focus": 0.8195738091729939, + "gap": 11.011337307422536 + }, + "endBinding": { + "elementId": "tWAtGodo4lkywsUJOvNib", + "focus": 0.5300716069445183, + "gap": 3.272170317110067 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 59.17410714285711, + -45.25111607142844 + ] + ] + }, + { + "type": "text", + "version": 5055, + "versionNonce": 390731978, + "isDeleted": false, + "id": "YELLDPCdrutYZQMCgdceW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2840.2808280144764, + "y": 2998.6400748759925, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 1538706402, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + }, + { + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 343, + "versionNonce": 1821913302, + "isDeleted": false, + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2798.133258570032, + "y": 3005.818894320435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 40.90711805555543, + "height": 2.6866319444443434, + "seed": 1675981374, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sCtxWGvWZnlQf-_rLbkNR", + "focus": -0.5325546962262563, + "gap": 1.4971308285246323 + }, + "endBinding": { + "elementId": "YELLDPCdrutYZQMCgdceW", + "focus": -0.2805570161616386, + "gap": 1.2404513888886868 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 40.90711805555543, + 2.6866319444443434 + ] + ] + }, + { + "type": "text", + "version": 5198, + "versionNonce": 1363374986, + "isDeleted": false, + "id": "tBDjrw4HxMxjd_bx2aUzi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8119.168947300781, + "y": 5254.717566659101, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 408330453, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728725, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "text", + "version": 5119, + "versionNonce": 1837556246, + "isDeleted": false, + "id": "2v9cs9kzw6sMzKOlb6z0_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8100.538087925781, + "y": 3918.526160409101, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 914375419, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728725, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "rectangle", + "version": 6807, + "versionNonce": 1097315658, + "isDeleted": false, + "id": "-e444xpyLXFfuz2oDiix-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8063.220538541571, + "y": 3965.532050786069, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 167233109, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2swlMAJG8K9dg3yX2zAP0", + "type": "arrow" + }, + { + "id": "8Soo57-vZQs3nl-5U7MtZ", + "type": "arrow" + } + ], + "updated": 1672253728730, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6565, + "versionNonce": 848983702, + "isDeleted": false, + "id": "dsGztSKtIczoHTUBcsYuL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8061.954080323045, + "y": 4648.26724958645, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 1404440731, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "C9Z-DlShPPwOi7jVOPEmD", + "type": "arrow" + }, + { + "id": "AS1siV7Lg1QtQEyT8lHwM", + "type": "arrow" + } + ], + "updated": 1672253728731, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4598, + "versionNonce": 2080005654, + "isDeleted": false, + "id": "ruMl8gNZmzBzapKmiFkbL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8197.972278373225, + "y": 3983.5373747200465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 1269254235, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728732, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6470, + "versionNonce": 657404938, + "isDeleted": false, + "id": "0eKc-t9Ey7YPF7RyPIXpE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7627.9938401421405, + "y": 4213.769183770271, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 1271189429, + "groupIds": [ + "pEEv72I7N_kh4iw8Mz-St" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3618, + "versionNonce": 227895702, + "isDeleted": false, + "id": "d7y1jhu63tRE5TlDGF-QL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7635.194789028617, + "y": 4221.5917658713315, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1534652955, + "groupIds": [ + "pEEv72I7N_kh4iw8Mz-St" + ], + "roundness": null, + "boundElements": [ + { + "id": "2swlMAJG8K9dg3yX2zAP0", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 6946, + "versionNonce": 1342186186, + "isDeleted": false, + "id": "98JkcLTIw6ZS5ERD7JCaD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7637.457660826665, + "y": 4892.013417401224, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 1784353045, + "groupIds": [ + "DuTRDuPWR27yAXYXzrhOU" + ], + "roundness": null, + "boundElements": [ + { + "id": "C9Z-DlShPPwOi7jVOPEmD", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4042, + "versionNonce": 1235207894, + "isDeleted": false, + "id": "IaWdj7iRnoGUh073NKLgx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7661.755581446041, + "y": 4899.013822138759, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 1231681211, + "groupIds": [ + "DuTRDuPWR27yAXYXzrhOU" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3906, + "versionNonce": 1984248202, + "isDeleted": false, + "id": "PfwPRNgIoR94-ZLMxZXeu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7643.363432156031, + "y": 4557.073779456701, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 253, + "height": 101, + "seed": 1398941301, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8Soo57-vZQs3nl-5U7MtZ", + "type": "arrow" + }, + { + "id": "AS1siV7Lg1QtQEyT8lHwM", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements\n(need to be routed\nto both tables) ", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements\n(need to be routed\nto both tables) " + }, + { + "type": "arrow", + "version": 261, + "versionNonce": 1726774294, + "isDeleted": false, + "id": "2swlMAJG8K9dg3yX2zAP0", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7912.146939767312, + "y": 4261.1586473882635, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148.69140625, + "height": 0.322265625, + "seed": 1182208539, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "d7y1jhu63tRE5TlDGF-QL", + "focus": 0.127040771514781, + "gap": 12.730721244193319 + }, + "endBinding": { + "elementId": "-e444xpyLXFfuz2oDiix-", + "focus": 0.010937820565666832, + "gap": 2.382192524260063 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 148.69140625, + -0.322265625 + ] + ] + }, + { + "type": "arrow", + "version": 286, + "versionNonce": 691632202, + "isDeleted": false, + "id": "C9Z-DlShPPwOi7jVOPEmD", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7914.077278308978, + "y": 4942.411902596597, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 145.8203125, + "height": 1.6003988816937635, + "seed": 225160347, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "98JkcLTIw6ZS5ERD7JCaD", + "focus": 0.10349399757588981, + "gap": 5.25245504025952 + }, + "endBinding": { + "elementId": "dsGztSKtIczoHTUBcsYuL", + "focus": 0.027823366811839147, + "gap": 2.0564895140660155 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.8203125, + -1.6003988816937635 + ] + ] + }, + { + "type": "arrow", + "version": 276, + "versionNonce": 997230934, + "isDeleted": false, + "id": "8Soo57-vZQs3nl-5U7MtZ", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7904.480924142314, + "y": 4592.001746346599, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157.87109375, + "height": 103.26822916666606, + "seed": 1619676539, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PfwPRNgIoR94-ZLMxZXeu", + "focus": 0.5509461109856089, + "gap": 8.587960736282184 + }, + "endBinding": { + "elementId": "-e444xpyLXFfuz2oDiix-", + "focus": -0.10976486703900913, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 157.87109375, + -103.26822916666606 + ] + ] + }, + { + "type": "arrow", + "version": 319, + "versionNonce": 1488445194, + "isDeleted": false, + "id": "AS1siV7Lg1QtQEyT8lHwM", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7905.075090808979, + "y": 4614.045281583165, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149.54906250000022, + "height": 83.82777694818833, + "seed": 408084027, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PfwPRNgIoR94-ZLMxZXeu", + "focus": -0.5710586997878563, + "gap": 8.711658652948245 + }, + "endBinding": { + "elementId": "dsGztSKtIczoHTUBcsYuL", + "focus": 0.21531842663100562, + "gap": 7.3299270140641966 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 149.54906250000022, + 83.82777694818833 + ] + ] + }, + { + "type": "text", + "version": 4970, + "versionNonce": 377548438, + "isDeleted": false, + "id": "1-_wN65ZhuvlbKg54HIXZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8206.74838744564, + "y": 4665.791008768891, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 1441203413, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_URL_UserID table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_URL_UserID table" + }, + { + "type": "rectangle", + "version": 6863, + "versionNonce": 1094413770, + "isDeleted": false, + "id": "twURJO4mwDfz2qy3VlyHF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8052.859210416578, + "y": 5685.880413714487, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 350696411, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "TF119TH8IEW69RTU435SM", + "type": "arrow" + }, + { + "id": "WYIytTWhG_OaRo1gwIGj9", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6601, + "versionNonce": 1866874762, + "isDeleted": false, + "id": "pfTG3rJoJFk5gHtQIZ_7I", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8051.350564698052, + "y": 6368.793163401104, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 21041915, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ft4zSnsjdQySQToTkIjRp", + "type": "arrow" + }, + { + "id": "WYIytTWhG_OaRo1gwIGj9", + "type": "arrow" + } + ], + "updated": 1672253728734, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4652, + "versionNonce": 1466431818, + "isDeleted": false, + "id": "LTxujyBlZJbGLB-rrnT5h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8187.610950248232, + "y": 5703.885737648467, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 499285531, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728735, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6524, + "versionNonce": 726963978, + "isDeleted": false, + "id": "xJXztDrR-t32vxmsyHoH3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7617.632512017148, + "y": 5934.11754669869, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 1304456693, + "groupIds": [ + "80CS_RqfnJ7t1mKpb64vf" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3673, + "versionNonce": 1395373718, + "isDeleted": false, + "id": "N1fWlp7o53vHgHG55h-7u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7624.833460903625, + "y": 5941.94012879975, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1060984795, + "groupIds": [ + "80CS_RqfnJ7t1mKpb64vf" + ], + "roundness": null, + "boundElements": [ + { + "id": "TF119TH8IEW69RTU435SM", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 7003, + "versionNonce": 260122058, + "isDeleted": false, + "id": "kzcOys8pqIg83tQrhVcJg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7627.0963327016725, + "y": 6612.361780329644, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 1607001941, + "groupIds": [ + "p-nQh4MCR8GmpIVoByvsA" + ], + "roundness": null, + "boundElements": [ + { + "id": "0oOhZTED1gVD6uv24_6pR", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4097, + "versionNonce": 14971862, + "isDeleted": false, + "id": "nJsp_t_x3SjjBMI2Qr3rW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7651.394253321048, + "y": 6619.362185067177, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 186360955, + "groupIds": [ + "p-nQh4MCR8GmpIVoByvsA" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 4062, + "versionNonce": 1152244874, + "isDeleted": false, + "id": "sw11QL3zMuxfZle_deumV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7627.3067915310385, + "y": 6160.8596423851195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 248, + "height": 34, + "seed": 20657333, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rFhMfoT4Bkp7RpKR4TzNy", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 24, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 428, + "versionNonce": 185829654, + "isDeleted": false, + "id": "TF119TH8IEW69RTU435SM", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7901.785611642319, + "y": 5981.507010316684, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148.69140625, + "height": 0.322265625, + "seed": 717708571, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "N1fWlp7o53vHgHG55h-7u", + "focus": 0.12704077151483206, + "gap": 12.730721244193319 + }, + "endBinding": { + "elementId": "twURJO4mwDfz2qy3VlyHF", + "focus": 0.010937820565660738, + "gap": 2.382192524260063 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 148.69140625, + -0.322265625 + ] + ] + }, + { + "type": "text", + "version": 5175, + "versionNonce": 1007205270, + "isDeleted": false, + "id": "3LIoa5FynBn0QKdFaxDmI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8250.644871820647, + "y": 6386.139371697311, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 181, + "height": 31, + "seed": 1090589275, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "implicit table 2", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicit table 2" + }, + { + "type": "rectangle", + "version": 6417, + "versionNonce": 1923281098, + "isDeleted": false, + "id": "x-p6jLxQf_c32SmEv6Evw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 7938.09578253202, + "y": 6370.817825837577, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 74.33017905392987, + "height": 599.9941431013729, + "seed": 973173755, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ft4zSnsjdQySQToTkIjRp", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 5055, + "versionNonce": 836294870, + "isDeleted": false, + "id": "rBpFzVKDKjaoecF8v8FSc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.562374043350375, + "x": 7732.59687836195, + "y": 6641.939436788496, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 483, + "height": 31, + "seed": 2013011253, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 24.27686099119398, + "fontFamily": 1, + "text": "mv_hits_URL_UserID materialized view", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "mv_hits_URL_UserID materialized view" + }, + { + "type": "arrow", + "version": 223, + "versionNonce": 536921674, + "isDeleted": false, + "id": "0oOhZTED1gVD6uv24_6pR", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7903.181630987556, + "y": 6656.916180870407, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 36.261160714285325, + "height": 0.6305803571422075, + "seed": 186603291, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kzcOys8pqIg83tQrhVcJg", + "focus": 0.0022868252753708296, + "gap": 4.718135843830169 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.261160714285325, + -0.6305803571422075 + ] + ] + }, + { + "type": "arrow", + "version": 302, + "versionNonce": 1913461590, + "isDeleted": false, + "id": "Ft4zSnsjdQySQToTkIjRp", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8016.04435420184, + "y": 6655.9731005132635, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 31.431919642857792, + "height": 0.7038480707151393, + "seed": 1806251547, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "x-p6jLxQf_c32SmEv6Evw", + "focus": -0.05237206736672402, + "gap": 3.618392615890116 + }, + "endBinding": { + "elementId": "pfTG3rJoJFk5gHtQIZ_7I", + "focus": 0.01349302486895752, + "gap": 3.874290853353159 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.431919642857792, + 0.7038480707151393 + ] + ] + }, + { + "type": "text", + "version": 5323, + "versionNonce": 1432710410, + "isDeleted": false, + "id": "L8UMcztoxcfdVF0DZCX10", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8085.0278921482695, + "y": 5643.515790245401, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 1009489429, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "text", + "version": 5374, + "versionNonce": 800800918, + "isDeleted": false, + "id": "allbUluIr3lSel0nIGzUc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8098.3169546482695, + "y": 6971.965008995401, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 1371527701, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "arrow", + "version": 244, + "versionNonce": 755448778, + "isDeleted": false, + "id": "rFhMfoT4Bkp7RpKR4TzNy", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7886.8716421482695, + "y": 6179.181805870401, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 166.884765625, + "height": 1.85546875, + "seed": 767279483, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sw11QL3zMuxfZle_deumV", + "focus": 0.1539507484478187, + "gap": 11.564850617231059 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 166.884765625, + -1.85546875 + ] + ] + }, + { + "type": "arrow", + "version": 293, + "versionNonce": 1995619798, + "isDeleted": false, + "id": "WYIytTWhG_OaRo1gwIGj9", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8434.220631429085, + "y": 6280.814266224911, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.3696070222940762, + "height": 85.03746152049098, + "seed": 1836056571, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "pfTG3rJoJFk5gHtQIZ_7I", + "focus": 0.46320140713743546, + "gap": 2.941435655701298 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.3696070222940762, + 85.03746152049098 + ] + ] + }, + { + "type": "rectangle", + "version": 6948, + "versionNonce": 503029642, + "isDeleted": false, + "id": "Z_7e2g7YscsvJVGgJ3AqQ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8041.347443111283, + "y": 7232.943437226015, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 2143156469, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "v1AE_CoFKHPMf9WRkFt_J", + "type": "arrow" + }, + { + "id": "Bev9_Lln4zav5DCs11J-V", + "type": "arrow" + }, + { + "id": "KK3gr8mnCDr1zS5NiHoM2", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6682, + "versionNonce": 230775114, + "isDeleted": false, + "id": "hCNlVRkD-sfGtxuksHy9H", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8039.811223180199, + "y": 7916.134123222537, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 2006947797, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "type": "arrow" + }, + { + "id": "KK3gr8mnCDr1zS5NiHoM2", + "type": "arrow" + } + ], + "updated": 1672253728738, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4731, + "versionNonce": 1787624202, + "isDeleted": false, + "id": "h-QfKMvHXxy7q2kvC9Va8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8175.829421230379, + "y": 7251.2266974699, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 58387125, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728739, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6794, + "versionNonce": 1643104470, + "isDeleted": false, + "id": "eetdhKawBsuVyikGZtLQC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7605.8509829992945, + "y": 7368.4585065201245, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 300277819, + "groupIds": [ + "YUkymRHYRKke4_IGeCvYh" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3946, + "versionNonce": 1282299786, + "isDeleted": false, + "id": "oTTY226Oi7p3vALeQ9CbC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7613.051931885771, + "y": 7376.281088621185, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1343460597, + "groupIds": [ + "YUkymRHYRKke4_IGeCvYh" + ], + "roundness": null, + "boundElements": [ + { + "id": "v1AE_CoFKHPMf9WRkFt_J", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 7267, + "versionNonce": 971783702, + "isDeleted": false, + "id": "JCTMLk-mYcKjStD_24zPy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7611.135116183819, + "y": 7668.666281817743, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 475275483, + "groupIds": [ + "cHnyxUd3QHtwzViQE-LtO" + ], + "roundness": null, + "boundElements": [ + { + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4360, + "versionNonce": 1485755978, + "isDeleted": false, + "id": "zJmWF62PQIyStRG7mvDe2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7635.433036803195, + "y": 7675.666686555276, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 455028309, + "groupIds": [ + "cHnyxUd3QHtwzViQE-LtO" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 4416, + "versionNonce": 1562905430, + "isDeleted": false, + "id": "X9VJ8NC7FRPpuEFFes6ix", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7615.115106263185, + "y": 7550.14461262322, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 248, + "height": 34, + "seed": 208751995, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Bev9_Lln4zav5DCs11J-V", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 24, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "text", + "version": 5244, + "versionNonce": 1509437590, + "isDeleted": false, + "id": "Ve6s-AV1UA3cwzjqTfw-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8238.863342802793, + "y": 7933.480331518744, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 146, + "height": 31, + "seed": 629138971, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hidden table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table" + }, + { + "type": "text", + "version": 5403, + "versionNonce": 957636938, + "isDeleted": false, + "id": "LYNjmWQV_sVLjKZufR3Z5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8073.246363130416, + "y": 7190.856750066836, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 1603197909, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "text", + "version": 5454, + "versionNonce": 1507110998, + "isDeleted": false, + "id": "PMsztz095pgjXHe-PuC4p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8086.535425630416, + "y": 8519.305968816834, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 1245526011, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "text", + "version": 7407, + "versionNonce": 1680873162, + "isDeleted": false, + "id": "TYSZDzLSRzTAgt1ZTo-Dj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8448.771056210771, + "y": 7844.469194263265, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 337, + "height": 60, + "seed": 451914389, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 23.740985576923116, + "fontFamily": 1, + "text": "Data is automatically kept \nin sync with the hidden table", + "baseline": 51, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically kept \nin sync with the hidden table" + }, + { + "type": "arrow", + "version": 733, + "versionNonce": 1876707350, + "isDeleted": false, + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7882.891452416132, + "y": 7716.0175573585, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 232.09635416666697, + "height": 197.2460937500009, + "seed": 256393269, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "JCTMLk-mYcKjStD_24zPy", + "focus": 0.018315066168853755, + "gap": 1 + }, + "endBinding": { + "elementId": "hCNlVRkD-sfGtxuksHy9H", + "focus": -0.6433915395529685, + "gap": 3.332711697369632 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 158.02083333333303, + -0.46223958333393966 + ], + [ + 226.27604166666697, + 46.60807291666697 + ], + [ + 232.09635416666697, + 196.78385416666697 + ] + ] + }, + { + "type": "arrow", + "version": 275, + "versionNonce": 1090284618, + "isDeleted": false, + "id": "v1AE_CoFKHPMf9WRkFt_J", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7886.628356254965, + "y": 7415.233589064104, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 151.90395162372624, + "height": 0.44369186711264774, + "seed": 280695387, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oTTY226Oi7p3vALeQ9CbC", + "focus": 0.10567869992573134, + "gap": 9.576424369193319 + }, + "endBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": 0.39136505740374905, + "gap": 2.8151352325921835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 151.90395162372624, + -0.44369186711264774 + ] + ] + }, + { + "type": "arrow", + "version": 261, + "versionNonce": 747033942, + "isDeleted": false, + "id": "Bev9_Lln4zav5DCs11J-V", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7869.134941999466, + "y": 7565.809224025168, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.2125011118178, + "height": 0.7914602852943062, + "seed": 1921260315, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "X9VJ8NC7FRPpuEFFes6ix", + "focus": -0.04638153040439678, + "gap": 6.019835736280584 + }, + "endBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": -0.10980672692889652, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 171.2125011118178, + -0.7914602852943062 + ] + ] + }, + { + "type": "text", + "version": 6790, + "versionNonce": 1677480714, + "isDeleted": false, + "id": "qTEEGX0PbmViwqq-MG-4e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7690.224785749468, + "y": 7841.466776108502, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 402, + "height": 63, + "seed": 417310907, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 24.760416666666444, + "fontFamily": 1, + "text": "ClickHouse automatically choses \nthe most effective table version", + "baseline": 54, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse automatically choses \nthe most effective table version" + }, + { + "type": "arrow", + "version": 246, + "versionNonce": 653114006, + "isDeleted": false, + "id": "KK3gr8mnCDr1zS5NiHoM2", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8423.15707741613, + "y": 7835.245421941838, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 4.3359375, + "height": 74.65625, + "seed": 35349051, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": -0.35406380187828085, + "gap": 6.318423304890075 + }, + "endBinding": { + "elementId": "hCNlVRkD-sfGtxuksHy9H", + "focus": 0.5003709721725933, + "gap": 6.232451280699024 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 4.3359375, + 74.65625 + ] + ] + }, + { + "type": "text", + "version": 7435, + "versionNonce": 1406230986, + "isDeleted": false, + "id": "XRp-HuyTTq1kecRKcMBuY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8461.93832741613, + "y": 6295.018859441838, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 337, + "height": 60, + "seed": 46765717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 23.740985576923116, + "fontFamily": 1, + "text": "Data is automatically kept \nin sync with the hidden table", + "baseline": 51, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically kept \nin sync with the hidden table" + }, + { + "type": "image", + "version": 162, + "versionNonce": 365295574, + "isDeleted": false, + "id": "Pch4taxj4RvusHnRQcTSx", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 9324.274292970846, + "y": 7284.873973078202, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 479.3451143451143, + "height": 809, + "seed": 819925371, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 436, + "versionNonce": 194418826, + "isDeleted": false, + "id": "ZtrzPPqnOPKIalBxb4FSg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 9381.965316052494, + "y": 7551.057211714564, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 419.8828124999997, + "height": 406.3906249999999, + "seed": 2012955605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1452, + "versionNonce": 1822998422, + "isDeleted": false, + "id": "N6dIDN7vX4unxZ-bloMhX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9412.884073943902, + "y": 8029.262270111027, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 30151797, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1574, + "versionNonce": 1473797334, + "isDeleted": false, + "id": "Y5G1bq9UYKIrmMOVblHdx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.288903489356, + "y": 7961.527974025164, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 2005816277, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1569, + "versionNonce": 1980302218, + "isDeleted": false, + "id": "O-dA70_HJPyOEmmVviw7o", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.097142125722, + "y": 7457.387349025161, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 875206171, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1740, + "versionNonce": 228741654, + "isDeleted": false, + "id": "6Avt6AQUL25R0hZhfX7NX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.651119398452, + "y": 7524.230388797885, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 26.712200126260473, + "seed": 538183221, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1750, + "versionNonce": 1374945866, + "isDeleted": false, + "id": "HFj52AfmdNVkOp4c60LxV", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.514755762086, + "y": 7894.372434252431, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1523192475, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 2029756246, + "isDeleted": false, + "id": "NxVkmmvhixkKmzHRNHOru", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.60353417118, + "y": 7827.486780843337, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1672588085, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1842, + "versionNonce": 1569794314, + "isDeleted": false, + "id": "RuT_pknQ-MsLu5IYEFWrd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.237767125724, + "y": 7727.243172888795, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1030288213, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1887, + "versionNonce": 1580811414, + "isDeleted": false, + "id": "ZU2o3HvOBt_cifAgzMOgc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.62484098936, + "y": 7792.238201297887, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 26.712200126260473, + "seed": 368888283, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 445, + "versionNonce": 811300810, + "isDeleted": false, + "id": "Z7_nJRqDhZYSyLmTkdj6U", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9571.990455843254, + "y": 6562.79834236295, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 695.9854910714289, + "height": 94.3947933234529, + "seed": 935460955, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 903, + "versionNonce": 789594582, + "isDeleted": false, + "id": "jpqj16ml3jClhCgI_xRrt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 20, + "angle": 0, + "x": 9607.611549593254, + "y": 6566.722153543549, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 659.828125000001, + "height": 30.473772321428363, + "seed": 59080283, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "e1a0kx3SZ5TALwhYSdmUF", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 768, + "versionNonce": 1586861846, + "isDeleted": false, + "id": "qFOLMNR2ZjoMXwRMK7yvs", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9825.342500785104, + "y": 6688.433091043546, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 433.9677868150695, + "height": 413.4375000000009, + "seed": 1135176411, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 1974, + "versionNonce": 813927754, + "isDeleted": false, + "id": "yHDvEdfIrFFus9PHnxZ-y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 9827.465716259927, + "y": 6686.352315373901, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 433.71961805555475, + "height": 416.74707031249994, + "seed": 488733051, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "e1a0kx3SZ5TALwhYSdmUF", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 735, + "versionNonce": 893273174, + "isDeleted": false, + "id": "4JIRWad-5pcIerpc52Xci", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9324.470637824888, + "y": 8088.936129237984, + "strokeColor": "transparent", + "backgroundColor": "#ffffff", + "width": 479.7645399305556, + "height": 8.712022569443418, + "seed": 1986378907, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1004, + "versionNonce": 2012697610, + "isDeleted": false, + "id": "VUE4b6afgqa4Z1O91JHuQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9572.159352267992, + "y": 6652.239155747069, + "strokeColor": "transparent", + "backgroundColor": "#ffffff", + "width": 695.4787493322644, + "height": 6.232855902777367, + "seed": 1226314235, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 746, + "versionNonce": 314852042, + "isDeleted": false, + "id": "e1a0kx3SZ5TALwhYSdmUF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10037.178754742521, + "y": 6598.057036976088, + "strokeColor": "#ffc029", + "backgroundColor": "#ffffff", + "width": 2.066973597152355, + "height": 86.82061826485824, + "seed": 1696479157, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jpqj16ml3jClhCgI_xRrt", + "focus": -0.3028865187706572, + "gap": 1 + }, + "endBinding": { + "elementId": "yHDvEdfIrFFus9PHnxZ-y", + "focus": -0.06405934507366456, + "gap": 1.474660132954341 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.066973597152355, + 86.82061826485824 + ] + ] + }, + { + "type": "rectangle", + "version": 2033, + "versionNonce": 481142486, + "isDeleted": false, + "id": "DtCxBD6yVKGI9wfd1jVZk", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9910.215828994393, + "y": 7040.61881547536, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 1247446651, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2142, + "versionNonce": 193288586, + "isDeleted": false, + "id": "FfFPhiiOOrjCyEyFJrKtY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9910.044930556893, + "y": 6972.75260453786, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 1152923317, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2241, + "versionNonce": 1564367894, + "isDeleted": false, + "id": "CbW4WoxH_JrwIql0BfjXm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9909.385750869393, + "y": 6871.05338578786, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 973968763, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2449, + "versionNonce": 1635096650, + "isDeleted": false, + "id": "T7jj_g3DXoJJMiMkGPHpw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9909.083993056893, + "y": 6934.91373735036, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 28.924558080805543, + "seed": 1605045365, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5363, + "versionNonce": 1310374218, + "isDeleted": false, + "id": "EZjfEEEoSVPCynr5giBbv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4626.687090016218, + "y": 2475.873001833646, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 574.1115434808286, + "height": 209.4985212519491, + "seed": 1876311162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4029, + "versionNonce": 1090508886, + "isDeleted": false, + "id": "Fw_XtYwjmSw6yYPdJokly", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4643.883552788515, + "y": 2519.889788848918, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 120.04052217913272, + "height": 151.42952949282065, + "seed": 1293246502, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3471, + "versionNonce": 835256330, + "isDeleted": false, + "id": "JH_cQIIkgQLjRR-d8U1t-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4670.240790878718, + "y": 2524.2172469246884, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 21, + "seed": 1099734330, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494137, + "fontFamily": 1, + "text": "granules", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules" + }, + { + "type": "rectangle", + "version": 4322, + "versionNonce": 1800297878, + "isDeleted": false, + "id": "Cm8vPeB7qvZsMiF3PPP0_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4784.483052721605, + "y": 2518.7482745491307, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 188.1717824359662, + "height": 152.22830497217703, + "seed": 1627548518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5504, + "versionNonce": 2105568970, + "isDeleted": false, + "id": "NUwdBWkmkrTKkGQRDCMv3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4636.543717970744, + "y": 2551.727618325574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 551.9063917871771, + "height": 18.57679310887235, + "seed": 2000217594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3324, + "versionNonce": 1813658326, + "isDeleted": false, + "id": "D2hDI5vsA7GuLHay0K3lv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4672.714650940634, + "y": 2554.366537412698, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 70, + "height": 17, + "seed": 1638665894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995324, + "fontFamily": 1, + "text": "0, 1, 2, 3 ", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "0, 1, 2, 3 " + }, + { + "type": "text", + "version": 3384, + "versionNonce": 635176330, + "isDeleted": false, + "id": "VRI2yPOORBOAFH6C3apmp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4786.9096492260105, + "y": 2554.6944121140314, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 180, + "height": 17, + "seed": 1776162490, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "goal://22013/10/stremena...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://22013/10/stremena..." + }, + { + "type": "text", + "version": 3241, + "versionNonce": 972582934, + "isDeleted": false, + "id": "OZzl2hgo_VwNTPDKx76ZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4868.554602306207, + "y": 2524.5691141447096, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 24, + "height": 21, + "seed": 1002392038, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.55355145249415, + "fontFamily": 1, + "text": "min", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "min" + }, + { + "type": "text", + "version": 3537, + "versionNonce": 1410778186, + "isDeleted": false, + "id": "U5GL3hBTRIJjvkpHpmCiy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4699.908658626797, + "y": 2589.228743591547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1511993210, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3653, + "versionNonce": 819854678, + "isDeleted": false, + "id": "UMpaAcbyriMuz62v8I2oS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4700.146145657573, + "y": 2600.633999460905, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1044978982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3662, + "versionNonce": 1376496394, + "isDeleted": false, + "id": "TAJKuXkpFbA42F9gf3cyg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4700.166787856646, + "y": 2611.5340753782766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 2084515898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3616, + "versionNonce": 1713365654, + "isDeleted": false, + "id": "seW36Qa3GkXfD8L03Ynqg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.563774819813, + "y": 2588.139040470358, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1320585318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3732, + "versionNonce": 1983232458, + "isDeleted": false, + "id": "QHv5Q10bv9KgugcvuCKf4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.801261850598, + "y": 2599.5442963397254, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 69277946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3741, + "versionNonce": 2087919574, + "isDeleted": false, + "id": "z1ZRxA6X0zalljDL0QG9U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.821904049675, + "y": 2610.4443722570813, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 483691430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5055, + "versionNonce": 263188618, + "isDeleted": false, + "id": "t_5zaGsqy3Ck4s3T3R4q9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4637.077409689986, + "y": 2576.860386561766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 552.7450513303977, + "height": 20.1520926180047, + "seed": 826796474, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3528, + "versionNonce": 2012001558, + "isDeleted": false, + "id": "hraNZIjPgMoKUKjDL5N0l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4788.931909983894, + "y": 2581.257507260244, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 171, + "height": 17, + "seed": 1456482022, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995312, + "fontFamily": 1, + "text": "goal://auto.rg.ru/moskva...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://auto.rg.ru/moskva..." + }, + { + "type": "rectangle", + "version": 5026, + "versionNonce": 1379225418, + "isDeleted": false, + "id": "ratmuhEBZpvTrZkzw88v7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4639.510318120584, + "y": 2628.474379072063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 551.5885871464857, + "height": 20.07152876880092, + "seed": 1524015738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3594, + "versionNonce": 302096982, + "isDeleted": false, + "id": "-IrSQgI079EJPFmDWa3nZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4648.544457945982, + "y": 2632.5589369072954, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 113, + "height": 17, + "seed": 1563843110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "1080, 1081, 1082", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "1080, 1081, 1082" + }, + { + "type": "text", + "version": 3753, + "versionNonce": 226944918, + "isDeleted": false, + "id": "Khb_NYwOQQNpH4rWYq2cH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4800.394466498392, + "y": 2483.114402058014, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 260, + "height": 21, + "seed": 1995711846, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.55355145249416, + "fontFamily": 1, + "text": "skp_idx_url_skipping_index.idx2", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "skp_idx_url_skipping_index.idx2" + }, + { + "type": "text", + "version": 3427, + "versionNonce": 544048330, + "isDeleted": false, + "id": "t878vW0fE0tkKb14cBunt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4672.029837040707, + "y": 2579.5428632483063, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 71, + "height": 17, + "seed": 1037552634, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995324, + "fontFamily": 1, + "text": "4, 5, 6, 7 ", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "4, 5, 6, 7 " + }, + { + "type": "text", + "version": 3152, + "versionNonce": 179406038, + "isDeleted": false, + "id": "0jNnTUlpDHqjSZ3LQRIIp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4559.45471458458, + "y": 2552.9531908607014, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 60, + "height": 22, + "seed": 713078650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 0", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 3222, + "versionNonce": 1528199702, + "isDeleted": false, + "id": "LmfYXbu3WBr17MbXpQ2hW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4563.023373228718, + "y": 2579.224229558663, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 22, + "seed": 426580966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 1", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 3267, + "versionNonce": 1664506442, + "isDeleted": false, + "id": "njooOnI2x3ijCXskfLXE2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4544.603266701602, + "y": 2631.456941169645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 22, + "seed": 1948092538, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 271", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 271" + }, + { + "type": "rectangle", + "version": 5127, + "versionNonce": 1153990922, + "isDeleted": false, + "id": "glPTz_hjWNG0A9lDMTuz_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4911.131900857454, + "y": 2761.2230577975415, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.73313247461166, + "height": 122.34873768360643, + "seed": 585824698, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5076, + "versionNonce": 717450390, + "isDeleted": false, + "id": "Dn2cs5H_l-GYQug1e1mtu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4780.378775578767, + "y": 2761.5072575026747, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 114.96182565642971, + "height": 122.61305449408903, + "seed": 279320294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6471, + "versionNonce": 1726468042, + "isDeleted": false, + "id": "t6o77gSFrXrKijoStYMia", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4772.871026863802, + "y": 2771.855899578434, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 268.9033265008711, + "height": 18.236732489293967, + "seed": 1167569530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4041, + "versionNonce": 940927446, + "isDeleted": false, + "id": "9Q-xZLkgEDmiw5T2L0yj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4787.703940629022, + "y": 2773.4815994811547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 1187924518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4276, + "versionNonce": 229590666, + "isDeleted": false, + "id": "qtkr-R2fkuTnNOmpWbgGa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.596728398677, + "y": 2811.02833335081, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 196039482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4392, + "versionNonce": 1555414806, + "isDeleted": false, + "id": "6xOANJvYvP6UMKdO9h7T3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.862905503429, + "y": 2823.8114229210482, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 1208882534, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4401, + "versionNonce": 1104799050, + "isDeleted": false, + "id": "KriGiFDI74REXgQrFkqat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.88604142276, + "y": 2836.0283033111045, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 395631610, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4496, + "versionNonce": 1293511766, + "isDeleted": false, + "id": "pFsANL14D6q1Jax6WykUE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4971.738545271197, + "y": 2809.806986564504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 2108848294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4612, + "versionNonce": 1019390986, + "isDeleted": false, + "id": "Ks8JUS5QTEeiLsMlB-Xm6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4972.004722375945, + "y": 2822.5900761347375, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 1196117178, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4621, + "versionNonce": 1729458582, + "isDeleted": false, + "id": "dZIZMeUmHaTFExco9wgpD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4972.027858295278, + "y": 2834.806956524795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 526939110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5716, + "versionNonce": 1415879370, + "isDeleted": false, + "id": "EfuQ6jNHf3XBRzQlhzoQn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4773.283625729264, + "y": 2801.4085952589403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 269.3964650954019, + "height": 19.27559192236466, + "seed": 1081451898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5655, + "versionNonce": 98488022, + "isDeleted": false, + "id": "_h2AEPhHPqFjBl0AwYWlY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4774.179359773789, + "y": 2854.5242929212927, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 269.74075308853065, + "height": 21.365522990494803, + "seed": 1732052774, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4216, + "versionNonce": 697143638, + "isDeleted": false, + "id": "DNYqQ1E15zTpJZrZTggZ5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4914.3848981383835, + "y": 2770.882293434845, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 191504314, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4305, + "versionNonce": 751785738, + "isDeleted": false, + "id": "zVYJtDTsANgFAVTj5Wy8T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4911.79643657019, + "y": 2801.051594184121, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 1335120102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4311, + "versionNonce": 1270675094, + "isDeleted": false, + "id": "5DrenLaY0MaBmvesQoSIH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4912.696251972668, + "y": 2855.974069497955, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 1598167162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4143, + "versionNonce": 329508298, + "isDeleted": false, + "id": "Rbg0ECJPtFhK1kNUYQLnN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4787.7804959059395, + "y": 2803.801341648017, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 1071989798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4158, + "versionNonce": 1431155670, + "isDeleted": false, + "id": "JZa5GvhMelVXlu2C0BS4X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4789.481502476632, + "y": 2858.6001849053396, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 253557050, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4442, + "versionNonce": 1222924298, + "isDeleted": false, + "id": "h3EwxBTH1L5Z65GOxt9Oz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4694.396915823361, + "y": 2772.175586628996, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 60, + "height": 22, + "seed": 965343654, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 0", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 4535, + "versionNonce": 1748272534, + "isDeleted": false, + "id": "whUyRrP8BzVeEw5Jvpl55", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4698.068557422044, + "y": 2801.4721935087755, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 22, + "seed": 2003327930, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 1", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 4598, + "versionNonce": 1198573258, + "isDeleted": false, + "id": "UchKoSskYpqh4HsL9b0WD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4678.430411122202, + "y": 2855.658030119758, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 22, + "seed": 1453839590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 271", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 271" + }, + { + "type": "text", + "version": 4627, + "versionNonce": 972776150, + "isDeleted": false, + "id": "6y5kKJs6Dqk6tP3muFBIn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4775.373071088217, + "y": 2728.292917085145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 270, + "height": 23, + "seed": 2086069818, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.819931517158327, + "fontFamily": 1, + "text": "skp_idx_url_skipping_index.mrk", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "skp_idx_url_skipping_index.mrk" + }, + { + "type": "rectangle", + "version": 4468, + "versionNonce": 89482, + "isDeleted": false, + "id": "AQEIO92grlV-EwQyoWn_o", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4985.584145928198, + "y": 2517.8373949463735, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 196.54580587346618, + "height": 152.22830497217703, + "seed": 1763633062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3546, + "versionNonce": 24418326, + "isDeleted": false, + "id": "hN_wI4OLb-eE3h1CCJ5WL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4988.010742432603, + "y": 2553.783532511274, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 17, + "seed": 1784761786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "https://wwwww.hurriyet.com/...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://wwwww.hurriyet.com/..." + }, + { + "type": "text", + "version": 3405, + "versionNonce": 1875975242, + "isDeleted": false, + "id": "Jo4fWyt7nkDV4BukNFPbw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5069.655695512798, + "y": 2523.6582345419524, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 33, + "height": 21, + "seed": 1634665190, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.55355145249415, + "fontFamily": 1, + "text": "max", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "max" + }, + { + "type": "text", + "version": 3777, + "versionNonce": 110437718, + "isDeleted": false, + "id": "P4pxFD9XZU2D7av8jfGjJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.664868026406, + "y": 2587.2281608676008, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1931708026, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3893, + "versionNonce": 884671242, + "isDeleted": false, + "id": "Y9jeGZId6Gpy-B4hliG_t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.902355057189, + "y": 2598.6334167369682, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1738126886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3902, + "versionNonce": 1253182102, + "isDeleted": false, + "id": "pQr7826QaOMf8ZrbYnSq4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.922997256266, + "y": 2609.533492654324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1084270394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3691, + "versionNonce": 2033848778, + "isDeleted": false, + "id": "7Ih08DGaAYAdc1tFLBrow", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4990.033003190487, + "y": 2580.346627657487, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 185, + "height": 17, + "seed": 344719718, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995312, + "fontFamily": 1, + "text": "https://yandex.ru/yandex.k...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://yandex.ru/yandex.k..." + }, + { + "type": "text", + "version": 3848, + "versionNonce": 1551910870, + "isDeleted": false, + "id": "UFSmjp1fK0uPU2YLfgvS0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4988.40811404751, + "y": 2630.498505120336, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 185, + "height": 17, + "seed": 1262202874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.24284116199533, + "fontFamily": 1, + "text": "https://yandsearch?lr=65&...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://yandsearch?lr=65&..." + }, + { + "type": "text", + "version": 3551, + "versionNonce": 1617512586, + "isDeleted": false, + "id": "XoRvQeHSWUywtc-7D6Okf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4786.503493945569, + "y": 2631.4737773880333, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 166, + "height": 17, + "seed": 744537530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "goal://cars.auto.yandex...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://cars.auto.yandex..." + }, + { + "type": "rectangle", + "version": 6347, + "versionNonce": 739564822, + "isDeleted": false, + "id": "LAlitqCgryfRePyezvtKD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4717.123839431744, + "y": 6886.177132753239, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 1388526246, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZA4thJKPNw7H3CWK6qmss", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6381, + "versionNonce": 1912842058, + "isDeleted": false, + "id": "YffaJtBF5K1T4WsmiFJAY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4712.015580503174, + "y": 6736.7139631103855, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 196.21788194444466, + "height": 65.4920038728636, + "seed": 438282938, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6017, + "versionNonce": 1592052310, + "isDeleted": false, + "id": "1r43Bj6XLcqQ-XFO_f5xe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4718.6372322888865, + "y": 5321.225123824679, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 1494283750, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "5YGvoDE58PCeFAbhdoGmz", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5815, + "versionNonce": 107228682, + "isDeleted": false, + "id": "eHphIrShW_-UDRvoO7Ypy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4710.64476577103, + "y": 5013.312921443729, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 195.89980158730228, + "height": 65.4920038728636, + "seed": 890127226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5353, + "versionNonce": 600117142, + "isDeleted": false, + "id": "MdWZDPkelSEbwlzRyht_i", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5207.872836636801, + "y": 4977.569825347107, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 478497062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3591, + "versionNonce": 847633610, + "isDeleted": false, + "id": "k_J7rP92x8a_hsyU2aUg3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5223.709316671524, + "y": 4988.133285216232, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1345045562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5052, + "versionNonce": 116042966, + "isDeleted": false, + "id": "1d4R5EECHyhXWI4vOv-AU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5024.772400939687, + "y": 4927.355507438453, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 1821193318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3497, + "versionNonce": 872657802, + "isDeleted": false, + "id": "6pyBo-W6p4RmEWZNawpMt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5071.325828089794, + "y": 4939.793180334134, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 25, + "seed": 1432038650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table 1" + }, + { + "type": "rectangle", + "version": 5190, + "versionNonce": 1173004822, + "isDeleted": false, + "id": "GMq1kJ27BEai-yd8UBgYB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5212.839789063715, + "y": 5025.636912231577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 586528678, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5262, + "versionNonce": 1561899594, + "isDeleted": false, + "id": "G1Saap_NERPjsf1dx46JD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5212.91190444833, + "y": 5040.6055119911925, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2048884154, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5315, + "versionNonce": 599387990, + "isDeleted": false, + "id": "dMwDWrG3XlDqIIbI78TzS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5213.329572717562, + "y": 5057.453468721962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1475072742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3530, + "versionNonce": 10475786, + "isDeleted": false, + "id": "Krd-uMV_0QWt3BNWjxdbV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.534600762431, + "y": 5056.386084596796, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1268495994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3646, + "versionNonce": 1018008726, + "isDeleted": false, + "id": "ptnDERRJKvVZ7vQejeXFR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.821532580611, + "y": 5070.16591414225, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 368870950, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3655, + "versionNonce": 1578379210, + "isDeleted": false, + "id": "lr4AWmdoMY855SdgrpmTi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.846472484459, + "y": 5083.335385296095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 982701882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5212, + "versionNonce": 1517982166, + "isDeleted": false, + "id": "Rf7e032SPaYOjtuHI1wAR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.809140025255, + "y": 5060.520527049357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 236245350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5284, + "versionNonce": 227581578, + "isDeleted": false, + "id": "B6GHi4N8cq2f15EqpHMI4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.8812554098695, + "y": 5075.489126808972, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 661118970, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5340, + "versionNonce": 1211492118, + "isDeleted": false, + "id": "wXR4Uczr_MUPJkpgpORoN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.298923679102, + "y": 5092.337083539742, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1266791590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3544, + "versionNonce": 1808809290, + "isDeleted": false, + "id": "1sMq6z7ZkoSEJRCz80iZ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.503951723971, + "y": 5091.269699414574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1847447738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3660, + "versionNonce": 643077206, + "isDeleted": false, + "id": "ybCDCiRsLret0sjmXwlWv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.790883542151, + "y": 5105.049528960029, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1743794150, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3669, + "versionNonce": 103678986, + "isDeleted": false, + "id": "qoiubAVC7eR9b42UZSg-W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.815823445999, + "y": 5118.219000113873, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1918347642, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5336, + "versionNonce": 1051433366, + "isDeleted": false, + "id": "Cm4qHccRS_vB5vAbeOYlN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.289308294485, + "y": 5011.233759129776, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1064125222, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5408, + "versionNonce": 111473354, + "isDeleted": false, + "id": "Pp234yKhjNOpz_PIuQVmW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.3614236791, + "y": 5026.202358889392, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 727214650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5467, + "versionNonce": 1483732694, + "isDeleted": false, + "id": "-WrAzdrn4asKMJg4ntry_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.779091948332, + "y": 5043.050315620161, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 610659942, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ivpUh5nfWVWUrUgAB2g2v", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5457, + "versionNonce": 533727626, + "isDeleted": false, + "id": "BC0vsLPFazAhCKSOhFqmA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.597301082948, + "y": 4979.179805861384, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 805507834, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5529, + "versionNonce": 204909590, + "isDeleted": false, + "id": "3VXf8qlOgPVs6WkHIgr5I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.669416467564, + "y": 4994.148405620999, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 329724326, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5647, + "versionNonce": 2028619850, + "isDeleted": false, + "id": "bZpJSz7lgKHUHpYh6nGWp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5209.0146760799125, + "y": 5292.019645058646, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 1121625018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3883, + "versionNonce": 401914198, + "isDeleted": false, + "id": "X1WR5AL4cr4r34tpg3Q0y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5225.867897186064, + "y": 5302.583104927771, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1750994150, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5350, + "versionNonce": 432975626, + "isDeleted": false, + "id": "0zIxRwoKAIBDyo5qs7IP0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5025.914240382797, + "y": 5241.805327149992, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 1577196666, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YPRe37mSkziXzuMT2QDAL", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3789, + "versionNonce": 855580310, + "isDeleted": false, + "id": "Cvs3bojJManol8p-wTlCP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5069.467667532905, + "y": 5254.024436057578, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 25, + "seed": 269975590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table 2" + }, + { + "type": "rectangle", + "version": 5484, + "versionNonce": 1459109322, + "isDeleted": false, + "id": "VN8VJ9grJJsp7yZGfuHPy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5213.981628506826, + "y": 5340.086731943116, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1060928826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5556, + "versionNonce": 1644878806, + "isDeleted": false, + "id": "v82tcY7elmSAM5_ZYqLPo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5214.053743891441, + "y": 5355.055331702732, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1052805990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5609, + "versionNonce": 1031926922, + "isDeleted": false, + "id": "Pg5dyBUXpmy3HU0ilPgxe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5214.471412160672, + "y": 5371.903288433501, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1944897018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3824, + "versionNonce": 1261236502, + "isDeleted": false, + "id": "98nt9qVI2nY-Dg5jsi5iS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.676440205541, + "y": 5370.835904308335, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 581316262, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3940, + "versionNonce": 2133250890, + "isDeleted": false, + "id": "OQJ5OY5e230uv8orsxkjL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.963372023722, + "y": 5384.615733853789, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1695938234, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3949, + "versionNonce": 165305942, + "isDeleted": false, + "id": "g6C4lauzU6usffrhgkuNM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.988311927569, + "y": 5397.785205007634, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 410348006, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5506, + "versionNonce": 1581373962, + "isDeleted": false, + "id": "EStQ4RG89UnKVpJfoZwwR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.950979468365, + "y": 5374.970346760896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1666912122, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5578, + "versionNonce": 48767894, + "isDeleted": false, + "id": "psXaM7_bfMep8A3LN_IPE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5032.023094852981, + "y": 5389.938946520511, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1597717798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5631, + "versionNonce": 432933066, + "isDeleted": false, + "id": "BAv03uyO1eK-S8dKdz0wC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5032.440763122213, + "y": 5406.786903251281, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 855576634, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3838, + "versionNonce": 948650198, + "isDeleted": false, + "id": "ZMdl_Q6iIkPYxYYTowK6M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.645791167082, + "y": 5405.719519126113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1281665126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3954, + "versionNonce": 1499881354, + "isDeleted": false, + "id": "7nAmA1UmaJv-_a4AIKheu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.932722985262, + "y": 5419.499348671568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 400881914, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3963, + "versionNonce": 509130262, + "isDeleted": false, + "id": "BjpnokBLmhOHrWfgUjTNJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.95766288911, + "y": 5432.668819825412, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2143202214, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5630, + "versionNonce": 424009290, + "isDeleted": false, + "id": "SL38jWA2VOo8lHqmH289E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.431147737596, + "y": 5325.6835788413155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1636813242, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5702, + "versionNonce": 1833272150, + "isDeleted": false, + "id": "PRejrF9jNuuRo6zxQr95u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.503263122211, + "y": 5340.652178600931, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 393627366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5761, + "versionNonce": 373785866, + "isDeleted": false, + "id": "Wmqus0uLs61cm6k19ksMF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.920931391443, + "y": 5357.5001353317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1998750330, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "5YGvoDE58PCeFAbhdoGmz", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5751, + "versionNonce": 2007410838, + "isDeleted": false, + "id": "xnvdUC0l4PylvfPzxruWO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.739140526059, + "y": 5293.629625572923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1679325734, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5823, + "versionNonce": 971396042, + "isDeleted": false, + "id": "rUSEXSklj4q3yXijW3bfv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.811255910674, + "y": 5308.598225332538, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1667244858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2807, + "versionNonce": 2100372950, + "isDeleted": false, + "id": "WnLuqtvs94DN9SJdfunTP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5036.662591911906, + "y": 4868.960600587494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 479348070, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2905, + "versionNonce": 104680074, + "isDeleted": false, + "id": "YAaev0dZzgo9PGOVvqh1V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5046.175938266072, + "y": 5475.21320475416, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 303, + "height": 50, + "seed": 1621863418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on URL " + }, + { + "type": "text", + "version": 3836, + "versionNonce": 2130311958, + "isDeleted": false, + "id": "z4roqsMad3AywYxe7c-kd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5057.330343648019, + "y": 7264.175498590968, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 303, + "height": 50, + "seed": 305178790, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hidden table with primary index\noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table with primary index\noptimized for filtering on URL " + }, + { + "type": "text", + "version": 6447, + "versionNonce": 34040138, + "isDeleted": false, + "id": "jgLZ4IFyCCw9GbBpfpJUt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4821.35477321151, + "y": 6961.354845069147, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 261, + "height": 40, + "seed": 1695030458, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse automatically choses \nthe most effective table version", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse automatically choses \nthe most effective table version" + }, + { + "type": "rectangle", + "version": 5695, + "versionNonce": 326510678, + "isDeleted": false, + "id": "H9-92dARAD-yU-G-kzREU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5211.823034632166, + "y": 6762.724974776669, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 1688249318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3931, + "versionNonce": 614445066, + "isDeleted": false, + "id": "xjX0TvMQuASlXBesKaGE0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5228.659514666889, + "y": 6773.288434645794, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 773354874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5423, + "versionNonce": 981118358, + "isDeleted": false, + "id": "8cgc9w6f-UhmPaby7LiOV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5028.722598935053, + "y": 6712.510656868017, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 904869670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3847, + "versionNonce": 1107369674, + "isDeleted": false, + "id": "XTY7e8Y9Pgq9nEXrZqnc7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5080.27602608516, + "y": 6724.729765775603, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 25, + "seed": 1293923898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table" + }, + { + "type": "rectangle", + "version": 5532, + "versionNonce": 826051286, + "isDeleted": false, + "id": "9O_m7kapNjWzk495xF7sF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5216.78998705908, + "y": 6810.792061661141, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1586061926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5604, + "versionNonce": 1992734090, + "isDeleted": false, + "id": "qdCJEat5zfPIJ_YaygBV6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5216.862102443695, + "y": 6825.760661420754, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 855695098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5657, + "versionNonce": 1179697174, + "isDeleted": false, + "id": "v9kThuT_1RwLZWYdJh5R_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5217.2797707129275, + "y": 6842.608618151524, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 557589926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3872, + "versionNonce": 338392138, + "isDeleted": false, + "id": "InrkM6S2fYIeevqqsyPx8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.484798757797, + "y": 6841.541234026357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1010757562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3988, + "versionNonce": 766266710, + "isDeleted": false, + "id": "mR67NC7dvys-Ocx9pVKHD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.771730575977, + "y": 6855.321063571813, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1597276390, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3997, + "versionNonce": 202005258, + "isDeleted": false, + "id": "j_521rMuc7ss2mjRBoPS6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.796670479825, + "y": 6868.490534725657, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1023207546, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5554, + "versionNonce": 1420046998, + "isDeleted": false, + "id": "OGZ0rmTBhLuxJ2XhSmX_W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.759338020621, + "y": 6845.675676478921, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1275032614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5626, + "versionNonce": 1558079946, + "isDeleted": false, + "id": "PcyLwOcAd82NSRaC2rPwQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.831453405235, + "y": 6860.644276238534, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 217958714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5679, + "versionNonce": 904753110, + "isDeleted": false, + "id": "Sn6OR2U2VX1sEh7j4jtex", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5035.2491216744675, + "y": 6877.492232969304, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 562691942, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3886, + "versionNonce": 2109907082, + "isDeleted": false, + "id": "ObTDWxkhGxQnvtAcCTo5H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.454149719337, + "y": 6876.424848844137, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 329552378, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4002, + "versionNonce": 765265174, + "isDeleted": false, + "id": "Gcr4Wd7aDS9IfjpPI6_sg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.741081537517, + "y": 6890.204678389591, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1411457702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4011, + "versionNonce": 1248984906, + "isDeleted": false, + "id": "Mh34Wvp_lWv2QF-NEzyzx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.7660214413645, + "y": 6903.374149543437, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1408516794, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5678, + "versionNonce": 1294463574, + "isDeleted": false, + "id": "vbMOrTfCcCzxN79jFsoby", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.23950628985, + "y": 6796.38890855934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1181867494, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5750, + "versionNonce": 1866958346, + "isDeleted": false, + "id": "ezF4F0qJ54blYFHpcOkhb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.311621674466, + "y": 6811.3575083189535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2022693754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5808, + "versionNonce": 795031446, + "isDeleted": false, + "id": "AwO5g4fd338CZBjv2PilL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.729289943698, + "y": 6828.205465049723, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2106143014, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5799, + "versionNonce": 1430140106, + "isDeleted": false, + "id": "2Yjdgjaw1sn_iuEnaAGL6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.547499078314, + "y": 6764.334955290946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1606048826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5876, + "versionNonce": 1283708118, + "isDeleted": false, + "id": "jcChYC29vf5fyXnUh2EUd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.619614462929, + "y": 6779.303555050563, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1423187046, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rtZMNuAtAXbzldr7ItEr4", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5983, + "versionNonce": 233900938, + "isDeleted": false, + "id": "HwXdDaFmCWId70Jeh6GTC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5212.964874075277, + "y": 7080.174794488208, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 659997946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4218, + "versionNonce": 1310640662, + "isDeleted": false, + "id": "YoF5qPVhSTDsgzP1TK8pH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5229.622782681429, + "y": 7090.738254357333, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 840933286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5683, + "versionNonce": 1067125322, + "isDeleted": false, + "id": "l7M0RdL4_C1h4nJItQSqS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5029.864438378163, + "y": 7029.960476579556, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 954734010, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4194, + "versionNonce": 1663637334, + "isDeleted": false, + "id": "iW5b2kmSijlyaaSk1nIuc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5049.41786552827, + "y": 7042.374897987142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 120, + "height": 25, + "seed": 966310630, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZA4thJKPNw7H3CWK6qmss", + "type": "arrow" + }, + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hidden table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table" + }, + { + "type": "rectangle", + "version": 5820, + "versionNonce": 286732554, + "isDeleted": false, + "id": "Gi029rIZB4NPSknEpVB2I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5217.931826502191, + "y": 7128.24188137268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1435586170, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5892, + "versionNonce": 335002774, + "isDeleted": false, + "id": "Sqeq26qPt7ATXx7h2s1MG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5218.003941886806, + "y": 7143.210481132293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 30174758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5945, + "versionNonce": 367034314, + "isDeleted": false, + "id": "M5wMZO35nQ_DrutzLhizo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5218.421610156037, + "y": 7160.058437863063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 571830074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4160, + "versionNonce": 373275094, + "isDeleted": false, + "id": "6nGEbve45UR3dcCOUb5ys", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.626638200906, + "y": 7158.991053737896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1202174310, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4276, + "versionNonce": 974255754, + "isDeleted": false, + "id": "L12TUJzaKTdrJPSKJcCrB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.913570019086, + "y": 7172.770883283352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 852981754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4285, + "versionNonce": 555093782, + "isDeleted": false, + "id": "JsLbKQV-DNd3ibR-8ZH81", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.938509922934, + "y": 7185.940354437196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 578264230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5842, + "versionNonce": 778474826, + "isDeleted": false, + "id": "uhM58HqEFaqnYdzqia8gG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.901177463731, + "y": 7163.12549619046, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 400189626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5914, + "versionNonce": 1089453142, + "isDeleted": false, + "id": "QZ-WA8n8i4X_YHr5IcB1K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.973292848346, + "y": 7178.094095950073, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 938022886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5967, + "versionNonce": 1413045258, + "isDeleted": false, + "id": "xHkflXD8fa8_fa_IjepEc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5036.390961117579, + "y": 7194.942052680843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1757495674, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4174, + "versionNonce": 732021142, + "isDeleted": false, + "id": "poJmGPIPSS1GZ8BzyvcFB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.595989162448, + "y": 7193.874668555676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1879649062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4290, + "versionNonce": 696601290, + "isDeleted": false, + "id": "3VwxZauqDL2wukPV3uJlj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.882920980628, + "y": 7207.65449810113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1355743802, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4299, + "versionNonce": 341909206, + "isDeleted": false, + "id": "HbpOrR7LKW-D0XjUmFV7F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.907860884476, + "y": 7220.823969254976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 692377190, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5966, + "versionNonce": 887447946, + "isDeleted": false, + "id": "XEJfSsiwXvfT6BISvXBK-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.381345732962, + "y": 7113.838728270879, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 451324666, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6038, + "versionNonce": 2143474710, + "isDeleted": false, + "id": "ci-QNFS2Oubbcw5fe1EgU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.453461117577, + "y": 7128.8073280304925, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1818827174, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6094, + "versionNonce": 1905565770, + "isDeleted": false, + "id": "Q8BXvttUcHsJNorvW3Fos", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.871129386809, + "y": 7145.655284761262, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1032534970, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6087, + "versionNonce": 398188886, + "isDeleted": false, + "id": "4cBNxbPV_Q7om5qvgFwod", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.689338521424, + "y": 7081.784775002485, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 547550438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6159, + "versionNonce": 997066506, + "isDeleted": false, + "id": "h-9lPf5v9yxY-55UzfDKR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.76145390604, + "y": 7096.753374762102, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1725936762, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2727, + "versionNonce": 2141275798, + "isDeleted": false, + "id": "QnhXGIS1o6o8kW46TO5Iu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5037.854977407272, + "y": 6655.30455210039, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 1065314342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2953, + "versionNonce": 988583370, + "isDeleted": false, + "id": "knCJW9EkedIpL2EGasu9E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4715.080312646039, + "y": 5018.844637665867, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 145167674, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ivpUh5nfWVWUrUgAB2g2v", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3113, + "versionNonce": 673711062, + "isDeleted": false, + "id": "a8yNE7MnBj2vetggnDZDs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4735.486190622229, + "y": 5326.114602943644, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 149648230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3408, + "versionNonce": 1361792138, + "isDeleted": false, + "id": "GgUuZsspv3Y7w-9kvFsnp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4715.031701534932, + "y": 6740.879793915876, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 1682202106, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rtZMNuAtAXbzldr7ItEr4", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3527, + "versionNonce": 593828118, + "isDeleted": false, + "id": "nnZpsoyE7Rt169VhAEYFj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4734.924930701598, + "y": 6889.905835582542, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 926160550, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3381, + "versionNonce": 65350474, + "isDeleted": false, + "id": "GxqNrQTVg8Rn5sTTShN3R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4713.37545153492, + "y": 5159.043298380158, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 190, + "height": 75, + "seed": 381324986, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "q9WkxkAiDiOyfybt6ABuP", + "type": "arrow" + }, + { + "id": "YPRe37mSkziXzuMT2QDAL", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements\n(need to be routed\nto both tables) ", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements\n(need to be routed\nto both tables) " + }, + { + "type": "text", + "version": 3847, + "versionNonce": 2026735190, + "isDeleted": false, + "id": "ir1pOdj2fKMP6hx9mMZKm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4720.86373278492, + "y": 6833.533067725393, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 187, + "height": 25, + "seed": 856052198, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 722, + "versionNonce": 1769288202, + "isDeleted": false, + "id": "ivpUh5nfWVWUrUgAB2g2v", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4907.654097368249, + "y": 5045.85294209377, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 118.87834821428578, + "height": 0.11806745524609141, + "seed": 615294842, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "knCJW9EkedIpL2EGasu9E", + "focus": 0.07613332501017665, + "gap": 5.0737847222098935 + }, + "endBinding": { + "elementId": "-WrAzdrn4asKMJg4ntry_", + "focus": 0.32933805427905405, + "gap": 4.246646365797915 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 118.87834821428578, + 0.11806745524609141 + ] + ] + }, + { + "type": "arrow", + "version": 892, + "versionNonce": 2033601430, + "isDeleted": false, + "id": "5YGvoDE58PCeFAbhdoGmz", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.254543796819, + "y": 5354.3346794008285, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 117.09484857946109, + "height": 0.18038529274963366, + "seed": 1198466342, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1r43Bj6XLcqQ-XFO_f5xe", + "focus": 0.015542030223939405, + "gap": 1.0791170634888658 + }, + "endBinding": { + "elementId": "Wmqus0uLs61cm6k19ksMF", + "focus": 1.7254661610668003, + "gap": 5.571539015163125 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 117.09484857946109, + -0.18038529274963366 + ] + ] + }, + { + "type": "arrow", + "version": 1439, + "versionNonce": 349593802, + "isDeleted": false, + "id": "rtZMNuAtAXbzldr7ItEr4", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.716597368252, + "y": 6769.83586134637, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 116.33534957931579, + "height": 0.04513131541943949, + "seed": 106801210, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GgUuZsspv3Y7w-9kvFsnp", + "focus": 0.1595735658798593, + "gap": 7.184895833320297 + }, + "endBinding": { + "elementId": "jcChYC29vf5fyXnUh2EUd", + "focus": 3.097189479823459, + "gap": 9.512825019611682 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 116.33534957931579, + -0.04513131541943949 + ] + ] + }, + { + "type": "arrow", + "version": 1851, + "versionNonce": 315910358, + "isDeleted": false, + "id": "ZA4thJKPNw7H3CWK6qmss", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.934231296824, + "y": 6919.788238970294, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 185.43578360246693, + "height": 112.20982142857156, + "seed": 1440452710, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "LAlitqCgryfRePyezvtKD", + "focus": 0.08732103170904873, + "gap": 3.2721974206347113 + }, + "endBinding": { + "elementId": "iW5b2kmSijlyaaSk1nIuc", + "focus": -0.21080484532050084, + "gap": 13.412700797473008 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 136.64732142857156, + -3.035863209197032 + ], + [ + 181.11160714285734, + 20.970833219374526 + ], + [ + 185.43578360246693, + 109.17395821937453 + ] + ] + }, + { + "type": "arrow", + "version": 1460, + "versionNonce": 27506570, + "isDeleted": false, + "id": "BrO3BBILYAphiNG5IB4dO", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4917.263472368252, + "y": 6847.113728601762, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 114.3568193558458, + "height": 2.513077009440167, + "seed": 867209466, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ir1pOdj2fKMP6hx9mMZKm", + "focus": 0.22978675597423878, + "gap": 9.89973958333212 + }, + "endBinding": { + "elementId": "AwO5g4fd338CZBjv2PilL", + "focus": -1.6534824753822683, + "gap": 7.378101630983565 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 114.3568193558458, + -2.513077009440167 + ] + ] + }, + { + "type": "arrow", + "version": 1357, + "versionNonce": 624746006, + "isDeleted": false, + "id": "a1HyqPD6QQTt6pbXbIYXq", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5153.7392713591935, + "y": 6940.865098975384, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.803003594184247, + "height": 80.65830920237954, + "seed": 169382822, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQQTRB6f9JAFiiAR4CF41", + "focus": 1.108065294804133, + "gap": 13.813449520963331 + }, + "endBinding": { + "focus": 0.581822592016921, + "gap": 8.437068401791521, + "elementId": "l7M0RdL4_C1h4nJItQSqS" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.803003594184247, + 80.65830920237954 + ] + ] + }, + { + "type": "rectangle", + "version": 5999, + "versionNonce": 1586762, + "isDeleted": false, + "id": "dhsCL-WWAogv32Mqm6WBU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4716.861177804092, + "y": 6233.620972659004, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 807952826, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gw5xntt9h-7rsAez4s0Ml", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5838, + "versionNonce": 1432660822, + "isDeleted": false, + "id": "7iiH088Pasev93wHj4vXa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4709.868711286235, + "y": 5894.708770278052, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 195.89980158730228, + "height": 65.4920038728636, + "seed": 240332518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5356, + "versionNonce": 554622218, + "isDeleted": false, + "id": "lFYRZqqGriUI3TzI2RxBj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5205.096782152008, + "y": 5882.965674181432, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 384309882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3594, + "versionNonce": 1637929110, + "isDeleted": false, + "id": "x_1It5ZQiKdqe0t1v7HJP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5222.933262186731, + "y": 5893.5291340505555, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1058562598, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5059, + "versionNonce": 570600394, + "isDeleted": false, + "id": "j4GphQ4O53Yv2OLWnzcwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5021.996346454893, + "y": 5832.985731272778, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 649247546, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3510, + "versionNonce": 1973833174, + "isDeleted": false, + "id": "9d6pZ7VekDL_1Umh9ZhD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5075.549773605, + "y": 5845.36760059703, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 25, + "seed": 1599417702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table" + }, + { + "type": "rectangle", + "version": 5193, + "versionNonce": 1494131338, + "isDeleted": false, + "id": "Ug5-6jMlziPE7KlLZt7P5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.063734578922, + "y": 5931.032761065902, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1307263994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5265, + "versionNonce": 2122982166, + "isDeleted": false, + "id": "9YWnbuASwPAi_zkmDMmAW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.135849963535, + "y": 5946.001360825518, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1280741542, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5318, + "versionNonce": 552452426, + "isDeleted": false, + "id": "qnE4bQlYfawMEGgh2OY18", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.553518232768, + "y": 5962.849317556287, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 915715258, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3533, + "versionNonce": 2126598230, + "isDeleted": false, + "id": "jDNpI0bUih9426fVx07o7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5283.758546277637, + "y": 5961.781933431119, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 835292134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3649, + "versionNonce": 1157302282, + "isDeleted": false, + "id": "cGcqOwjor5ufmvAraQ7sQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5284.045478095817, + "y": 5975.561762976573, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1381109114, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3658, + "versionNonce": 1646318998, + "isDeleted": false, + "id": "JepxNViHCjsekmVEMp5Q2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5284.070417999665, + "y": 5988.731234130419, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1035673382, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5215, + "versionNonce": 1831958218, + "isDeleted": false, + "id": "QIWTwDFrgSwSHMMfez5CL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.033085540461, + "y": 5965.91637588368, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1717980730, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5287, + "versionNonce": 1373483734, + "isDeleted": false, + "id": "qwBKiClh-AlsLUCbcQuHM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.105200925076, + "y": 5980.884975643297, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1419266662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5346, + "versionNonce": 170659210, + "isDeleted": false, + "id": "amuG-2Bi4eUTXQaPeeaqi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.522869194308, + "y": 5997.732932374067, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 397702906, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "_1LCD99pxoxMTc9Gv9tPw", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3547, + "versionNonce": 143452182, + "isDeleted": false, + "id": "r2ilPv2y3GVkc6nPKYViK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5095.727897239178, + "y": 5996.665548248899, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1160646054, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3663, + "versionNonce": 1092996170, + "isDeleted": false, + "id": "apxGn4YL5D_6BLm8vavQv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5096.014829057358, + "y": 6010.445377794353, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1992263610, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3672, + "versionNonce": 639858006, + "isDeleted": false, + "id": "bY8n13qkDp7fFAeYjsjW7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5096.0397689612055, + "y": 6023.614848948198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2091477222, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5339, + "versionNonce": 1475982090, + "isDeleted": false, + "id": "dN9FJXVy7W-pqH3-1Vrql", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.513253809691, + "y": 5916.6296079641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 195723386, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5414, + "versionNonce": 66476694, + "isDeleted": false, + "id": "bd-leMKBGUVF9w9vSg7kO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.585369194307, + "y": 5931.598207723717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 982998054, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ip87GtGCCgviSwQ-vUlo9", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5470, + "versionNonce": 555925962, + "isDeleted": false, + "id": "B9DSJ_woMyRj5DDF275W9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.003037463539, + "y": 5948.4461644544845, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1647862074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5460, + "versionNonce": 146446294, + "isDeleted": false, + "id": "BXCgf1G14uSA0AxcNqwLD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.821246598154, + "y": 5884.575654695709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1155852134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5532, + "versionNonce": 1740372106, + "isDeleted": false, + "id": "-DMZZU1w-QHjPpCiENkB6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.893361982769, + "y": 5899.544254455324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 365701626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5849, + "versionNonce": 2089102614, + "isDeleted": false, + "id": "uqcmhOPyyQ5qJ1PXWPfh1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5208.238621595119, + "y": 6201.415493892971, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 467602086, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4083, + "versionNonce": 1535137610, + "isDeleted": false, + "id": "vpB42ooStFglhTsSSNgnp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5227.075101629842, + "y": 6211.9789537620945, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1567152826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5551, + "versionNonce": 1556814422, + "isDeleted": false, + "id": "90jMqh8wwpPQdUx4XqPSt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5025.138185898004, + "y": 6151.201175984317, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 775079398, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4060, + "versionNonce": 2093669898, + "isDeleted": false, + "id": "PfztNZLH6JXrlH0SXGzSv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.691613048111, + "y": 6163.420284891903, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 150, + "height": 25, + "seed": 397505402, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "implicit table 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicit table 2" + }, + { + "type": "rectangle", + "version": 5686, + "versionNonce": 811687830, + "isDeleted": false, + "id": "yeornJi9LN5bM4-uKWVj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.205574022033, + "y": 6249.482580777441, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 216865062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5759, + "versionNonce": 144084170, + "isDeleted": false, + "id": "nxk7EvK1h3kQ3BjzKFgJ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.5589394066465, + "y": 6265.302743037057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1458107450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5811, + "versionNonce": 1534917846, + "isDeleted": false, + "id": "1T-TD8047KdDHWcyMbBGP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.695357675879, + "y": 6281.299137267826, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 528155750, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4026, + "versionNonce": 1686004618, + "isDeleted": false, + "id": "-5QQ-Qz6Z3_KDrdT2j0Sb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5286.900385720748, + "y": 6280.231753142658, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1827822842, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4142, + "versionNonce": 1941107222, + "isDeleted": false, + "id": "MaU_kjWk8T7JULQy2mUMu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5287.187317538928, + "y": 6294.011582688112, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1470728102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4151, + "versionNonce": 180183626, + "isDeleted": false, + "id": "u6E86cflJSTgLupHLb5EM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5287.212257442776, + "y": 6307.181053841958, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2001776058, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5708, + "versionNonce": 335036246, + "isDeleted": false, + "id": "KBaBMm86mJ7A-qq0YhMsB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.174924983572, + "y": 6284.366195595219, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1705353958, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5780, + "versionNonce": 1982761226, + "isDeleted": false, + "id": "IB6DxVd2Yzsi-oOs3fid7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.247040368187, + "y": 6299.334795354836, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1797711482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5833, + "versionNonce": 815916182, + "isDeleted": false, + "id": "XCU17JiK2OeNwhGfV8QGW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.66470863742, + "y": 6316.182752085606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1811699238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4040, + "versionNonce": 239917002, + "isDeleted": false, + "id": "sjJcIPPkr0b9MSWJwew5H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5098.869736682289, + "y": 6315.115367960438, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 557319994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4156, + "versionNonce": 1801773526, + "isDeleted": false, + "id": "5h-dG2Jx_c5dAtdr4M_m-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5099.156668500469, + "y": 6328.895197505892, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 865771878, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4165, + "versionNonce": 322129546, + "isDeleted": false, + "id": "rOYRrV6ng7KV7c9pWWCOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5099.181608404317, + "y": 6342.064668659737, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1642532858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5832, + "versionNonce": 1733703446, + "isDeleted": false, + "id": "fr65sy7nU8d9ngUOtXrTG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.6550932528025, + "y": 6235.079427675639, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1607304358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5904, + "versionNonce": 161279306, + "isDeleted": false, + "id": "0nLNN0XFcmW_9ZA1qf5dm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.727208637418, + "y": 6250.048027435256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1899430074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5965, + "versionNonce": 485155926, + "isDeleted": false, + "id": "LsWUbnyYTmZ6nClojEWer", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.14487690665, + "y": 6266.8959841660235, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 574750694, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Urj7GRImtQ-_jf8kXKei0", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5955, + "versionNonce": 652522506, + "isDeleted": false, + "id": "sOemb4C3A2lmqcofw2qk3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.963086041265, + "y": 6203.025474407248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 449501562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6025, + "versionNonce": 771221910, + "isDeleted": false, + "id": "bcQ286_2M0pyhNne5ZOYE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.035201425881, + "y": 6217.994074166863, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1862603558, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2820, + "versionNonce": 1023779530, + "isDeleted": false, + "id": "PYv0E33Pd-h7JoEbtQ67u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5030.886537427112, + "y": 5776.356449421819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 1038457402, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2978, + "versionNonce": 967984854, + "isDeleted": false, + "id": "KfzwR1lDMYxxfF7eN-N9i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4714.304258161244, + "y": 5900.240486500192, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 813940326, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ip87GtGCCgviSwQ-vUlo9", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3091, + "versionNonce": 647674250, + "isDeleted": false, + "id": "yVw-kXVIuCTqAxMdBUYVP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4733.710136137435, + "y": 6238.510451777969, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 1500136186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "rectangle", + "version": 5544, + "versionNonce": 816774166, + "isDeleted": false, + "id": "tu8pRySDLpojlW2kZi8Wb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4944.616155709221, + "y": 6150.51421851904, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 49.38615117521417, + "height": 226.56336805555574, + "seed": 2072707494, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Urj7GRImtQ-_jf8kXKei0", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4161, + "versionNonce": 853473354, + "isDeleted": false, + "id": "h9obGfxVtHD68frZ1DS5F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5685749593264884, + "x": 4881.286904479649, + "y": 6250.4677763132, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 170, + "height": 25, + "seed": 400282554, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gw5xntt9h-7rsAez4s0Ml", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Materialized View" + }, + { + "type": "arrow", + "version": 756, + "versionNonce": 685967702, + "isDeleted": false, + "id": "Urj7GRImtQ-_jf8kXKei0", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4997.106106296828, + "y": 6266.246491021739, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 29.717785951007045, + "height": 0.013766459125690744, + "seed": 1128783078, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tu8pRySDLpojlW2kZi8Wb", + "focus": 0.021744171490670924, + "gap": 3.1037994123939825 + }, + "endBinding": { + "elementId": "LsWUbnyYTmZ6nClojEWer", + "focus": 1.14642988531582, + "gap": 4.320984658813813 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 29.717785951007045, + -0.013766459125690744 + ] + ] + }, + { + "type": "text", + "version": 3895, + "versionNonce": 296574730, + "isDeleted": false, + "id": "WK28zDzxGiAzic6FUQG5A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4711.996731296828, + "y": 6006.436527546819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 187, + "height": 25, + "seed": 1532841082, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + }, + { + "id": "_1LCD99pxoxMTc9Gv9tPw", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 396, + "versionNonce": 832794262, + "isDeleted": false, + "id": "ip87GtGCCgviSwQ-vUlo9", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4910.246731296828, + "y": 5927.818459313345, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 111.43377177709408, + "height": 1.5849349128602626, + "seed": 222777382, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KfzwR1lDMYxxfF7eN-N9i", + "focus": 0.04284237201216683, + "gap": 8.442473135583896 + }, + "endBinding": { + "elementId": "bd-leMKBGUVF9w9vSg7kO", + "focus": 0.99680382763453, + "gap": 5.904866120383758 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 111.43377177709408, + 1.5849349128602626 + ] + ] + }, + { + "type": "arrow", + "version": 362, + "versionNonce": 1065414090, + "isDeleted": false, + "id": "_1LCD99pxoxMTc9Gv9tPw", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4912.324856296828, + "y": 6016.470300982066, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 107.91939955055614, + "height": 0.01622560595296818, + "seed": 1236380986, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "WK28zDzxGiAzic6FUQG5A", + "focus": -0.19836116131514064, + "gap": 13.828125 + }, + "endBinding": { + "elementId": "amuG-2Bi4eUTXQaPeeaqi", + "focus": -3.1544689506849837, + "gap": 9.736509302336799 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 107.91939955055614, + 0.01622560595296818 + ] + ] + }, + { + "type": "arrow", + "version": 303, + "versionNonce": 665136086, + "isDeleted": false, + "id": "gw5xntt9h-7rsAez4s0Ml", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4908.542629734328, + "y": 6264.010680652937, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.72613987564637, + "height": 0.9014403207347641, + "seed": 628513638, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "dhsCL-WWAogv32Mqm6WBU", + "focus": -0.13665233604385063, + "gap": 2.1432574857913096 + }, + "endBinding": { + "elementId": "h9obGfxVtHD68frZ1DS5F", + "focus": -0.029294096529644393, + "gap": 9.522399646169106 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.72613987564637, + 0.9014403207347641 + ] + ] + }, + { + "type": "arrow", + "version": 305, + "versionNonce": 1903469706, + "isDeleted": false, + "id": "q9WkxkAiDiOyfybt6ABuP", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4915.871731296832, + "y": 5180.761193047398, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 109.34244791666697, + "height": 60.05643633391992, + "seed": 1480324602, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GxqNrQTVg8Rn5sTTShN3R", + "focus": 0.4838734344756022, + "gap": 12.996279761911865 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 109.34244791666697, + -60.05643633391992 + ] + ] + }, + { + "type": "arrow", + "version": 456, + "versionNonce": 150814998, + "isDeleted": false, + "id": "YPRe37mSkziXzuMT2QDAL", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4917.2844917135, + "y": 5201.932352818856, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 107.62974866929744, + "height": 69.77915843737992, + "seed": 1377959590, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GxqNrQTVg8Rn5sTTShN3R", + "focus": -0.6603382992041156, + "gap": 14.409040178579744 + }, + "endBinding": { + "elementId": "0zIxRwoKAIBDyo5qs7IP0", + "focus": 0.1857526586548959, + "gap": 1.0000000000004547 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 107.62974866929744, + 69.77915843737992 + ] + ] + }, + { + "type": "text", + "version": 6809, + "versionNonce": 21201738, + "isDeleted": false, + "id": "Hyfv6DYXvvdbsJVck3aJD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5165.848293796832, + "y": 6067.931319213483, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 1476339386, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "text", + "version": 4019, + "versionNonce": 1226878550, + "isDeleted": false, + "id": "zaNdvwOkdl1eewqZe110O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4999.969387546829, + "y": 6385.462569213481, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 407, + "height": 50, + "seed": 133642726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "implicitly created table with primary index\noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicitly created table with primary index\noptimized for filtering on URL " + }, + { + "type": "arrow", + "version": 1289, + "versionNonce": 1497926154, + "isDeleted": false, + "id": "jIZfRkvBm-8h6YG1lOMd7", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5151.0337561920705, + "y": 6062.734077944899, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 0.09692072858069878, + "height": 85.45114751858819, + "seed": 27148154, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728743, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Hyfv6DYXvvdbsJVck3aJD", + "focus": 1.1385931004955787, + "gap": 15.314537604761426 + }, + "endBinding": { + "elementId": "90jMqh8wwpPQdUx4XqPSt", + "focus": 0.565231736644087, + "gap": 3.015950520829847 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.09692072858069878, + 85.45114751858819 + ] + ] + }, + { + "type": "text", + "version": 6863, + "versionNonce": 618951574, + "isDeleted": false, + "id": "fQQTRB6f9JAFiiAR4CF41", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5167.052720880157, + "y": 6945.5680379634905, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 503516454, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "text", + "version": 7965, + "versionNonce": 1618917578, + "isDeleted": false, + "id": "wVaNwoEEGopLJzxF5O1HI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 0, + "angle": 0, + "x": 5167.400377130155, + "y": 5164.168298380157, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 22822970, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "rectangle", + "version": 4725, + "versionNonce": 1211883402, + "isDeleted": false, + "id": "_hoczvIT2eHHRo0cEV_k6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2622.0821419549434, + "y": 4982.051370566501, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 589074940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3801, + "versionNonce": 1369126422, + "isDeleted": false, + "id": "yWnPMFqnMTso7m7rj39JB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2919.3833463045835, + "y": 5032.053124782894, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 405445572, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4037, + "versionNonce": 292249162, + "isDeleted": false, + "id": "SWwd1_7R7OeffeEFoKfjX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2645.6463524832657, + "y": 5032.128641654072, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 1244721788, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2571, + "versionNonce": 339215190, + "isDeleted": false, + "id": "zgEovkLdgMWixy32BlE2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1674.7851890289728, + "y": 4752.093604114574, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1667924804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2317, + "versionNonce": 1841104138, + "isDeleted": false, + "id": "G8rlFdVFM8gO1PqduYjG0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1955.6255205762143, + "y": 4753.090988462556, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 1088766716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4868, + "versionNonce": 474556566, + "isDeleted": false, + "id": "ui4j85f9Hl6BoX2JI_nrN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.376997588213, + "y": 4792.816670116261, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 490830532, + "groupIds": [ + "-iggjnNeu56DFGUdItm7I" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5549, + "versionNonce": 111924170, + "isDeleted": false, + "id": "lsI78-QqmdT4q25J4qArV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.433122026239, + "y": 4791.817496358415, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1841005436, + "groupIds": [ + "-iggjnNeu56DFGUdItm7I" + ], + "roundness": null, + "boundElements": [ + { + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2490, + "versionNonce": 1770235350, + "isDeleted": false, + "id": "TtvBkIM1Pr41kiJC4gPdB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2100.5256964584873, + "y": 4750.580341265352, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 5079620, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1626, + "versionNonce": 508742282, + "isDeleted": false, + "id": "JObfCT0z6vgeOcvEkHxdg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2118.0920651562315, + "y": 4759.317864954296, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 385201148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2880, + "versionNonce": 1023179542, + "isDeleted": false, + "id": "OY2lgtj8re-NrT349DVvg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.3361701633344, + "y": 5092.32687275589, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1131190724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3057, + "versionNonce": 2070735178, + "isDeleted": false, + "id": "XjpWwfRTLR6MlR0s3rfqP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.6966720779615, + "y": 5111.100816482749, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1788204156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3241, + "versionNonce": 1831381078, + "isDeleted": false, + "id": "C2ZwoBjZwridBaFRivJJL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.616443768447, + "y": 5129.875295858197, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 297582916, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2642, + "versionNonce": 1431646218, + "isDeleted": false, + "id": "l2DVPrwRdU1TUH6rake5X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.104660121451, + "y": 4795.6389726273965, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 106816764, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1409, + "versionNonce": 970796438, + "isDeleted": false, + "id": "CMfkPVYojz8KbO-evCgPR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.1932556324223, + "y": 4797.005612970169, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 43776196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 1775, + "versionNonce": 1074175690, + "isDeleted": false, + "id": "blR0d3xGDcs5iJZPmOzb6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1610.0796335260727, + "y": 4798.00524525664, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 2144331132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 542051030, + "isDeleted": false, + "id": "MjzYuYgtw9d1OY-Elg_Fx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.810160134835, + "y": 4868.0288231346485, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 296239172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 404501898, + "isDeleted": false, + "id": "5awb-lAQptaSdw4qDzz7e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.097091953017, + "y": 4881.808652680103, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1814943228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2032, + "versionNonce": 789790742, + "isDeleted": false, + "id": "HUNG6XSM3vC5K_RBAYZAZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.1220318568644, + "y": 4894.978123833948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 381654980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2752, + "versionNonce": 1859187786, + "isDeleted": false, + "id": "1KE4ph3pUHqgG0LyGLus4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.2774833945111, + "y": 4827.863056208011, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1752807036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1562, + "versionNonce": 1511968086, + "isDeleted": false, + "id": "RWyALgDzDUsAPOjNxPhRn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.5169324525937, + "y": 4827.900048538242, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1040187204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 1921, + "versionNonce": 1979702026, + "isDeleted": false, + "id": "rWsrT2JYBJ-eEwWlY_Wsn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1610.403310346244, + "y": 4830.098775424389, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 561350396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3533, + "versionNonce": 1321644694, + "isDeleted": false, + "id": "B1pa7K8ZW30IK2C2WZowd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.3811301484182, + "y": 4860.365857944524, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 2143778500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1814292938, + "isDeleted": false, + "id": "aX2Zg4WJogrivysSTPufg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.703560386915, + "y": 4860.523944024755, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1537427324, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 2743, + "versionNonce": 1203761110, + "isDeleted": false, + "id": "E-AzA2HRZfPOUDvDxzioQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1609.5899382805635, + "y": 4862.794192630671, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 414449220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3274, + "versionNonce": 139993226, + "isDeleted": false, + "id": "F2gzo8nVGkaw5pJdKG36X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1662.8687454006501, + "y": 4923.928990174747, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 2068117500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2187, + "versionNonce": 1629455638, + "isDeleted": false, + "id": "2mISM_Ffr52gsY4oAoONw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.41528917964, + "y": 4924.057758343162, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 27497924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2549, + "versionNonce": 1717010250, + "isDeleted": false, + "id": "WeeRrOhcCJ-8tC0Rw_v9c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1582.3016670732893, + "y": 4926.116734377325, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 207394940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5414, + "versionNonce": 1817866838, + "isDeleted": false, + "id": "amPLPi4_peJhoBoto913J", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.0838202398825, + "y": 4953.230860128555, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1739865412, + "groupIds": [ + "VyNj7DH9GhyYMDDthJdvy" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6095, + "versionNonce": 1920796170, + "isDeleted": false, + "id": "W_a57TQXOeR2j7OO8yq5v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.1399446779085, + "y": 4952.231686370707, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1252796668, + "groupIds": [ + "VyNj7DH9GhyYMDDthJdvy" + ], + "roundness": null, + "boundElements": [ + { + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3386, + "versionNonce": 1145419670, + "isDeleted": false, + "id": "mj_JIVL1-qH926Fy_7fpQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.430330942672, + "y": 4955.490554872242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 608433348, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2291, + "versionNonce": 1438889162, + "isDeleted": false, + "id": "Yp4joyQdFDuxeqNQpmnGr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.0477786230513, + "y": 4955.624637858338, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 699771260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 2640, + "versionNonce": 555111638, + "isDeleted": false, + "id": "pY4HRRtbmMowePTOF_50c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1581.0353539817559, + "y": 4958.122850330464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 888192068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3600, + "versionNonce": 1640401802, + "isDeleted": false, + "id": "hYBbXIb2vkm9aT52unEuU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.8645819601932, + "y": 4989.05833071981, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1555765756, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4465, + "versionNonce": 1818315286, + "isDeleted": false, + "id": "wtycwVZqCb1sbtbRnZq4v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1664.2513221691895, + "y": 5019.354817740111, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 865637316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3262, + "versionNonce": 2092993098, + "isDeleted": false, + "id": "WGw_W4jrf0UQuBHD_Q9-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.659280842599, + "y": 5019.107499896962, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1589541500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2283, + "versionNonce": 354129750, + "isDeleted": false, + "id": "CiywWZUY80skHxz0Fdb2w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.7697038284564, + "y": 5026.5791579000625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1314487108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2399, + "versionNonce": 227324170, + "isDeleted": false, + "id": "P_y-c3pHmoDVk51h4Sk8c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.0566356466384, + "y": 5040.3589874455165, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2055326460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2408, + "versionNonce": 1671052438, + "isDeleted": false, + "id": "IxatrIlYNAlfLN73EN7-L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.081575550486, + "y": 5053.528458599363, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1066496708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3703, + "versionNonce": 1738932170, + "isDeleted": false, + "id": "7DxcqFL4KQliqcxQY0xeQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.0150601526, + "y": 5081.848181818408, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 1384582012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2563, + "versionNonce": 1301428694, + "isDeleted": false, + "id": "lCwrE5NTjgZyQ38CAbo15", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.3748328732595, + "y": 5082.231817655231, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1172208196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 2904, + "versionNonce": 925333130, + "isDeleted": false, + "id": "kNAh9Xbnrtv2a5lTqGnVE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1570.2612107669117, + "y": 5084.667069142739, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 1762671612, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 5043, + "versionNonce": 1243123478, + "isDeleted": false, + "id": "nN2EO8u7z6ZajekWuGx0R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.0380136948186, + "y": 5177.948057531298, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 471765444, + "groupIds": [ + "ED-wfCihYd9BhWaVE4s2Z" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5724, + "versionNonce": 1825314122, + "isDeleted": false, + "id": "_8qZd05P7LkoyeqB71OhG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.0941381328446, + "y": 5176.948883773452, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 673143932, + "groupIds": [ + "ED-wfCihYd9BhWaVE4s2Z" + ], + "roundness": null, + "boundElements": [ + { + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4068, + "versionNonce": 631389270, + "isDeleted": false, + "id": "h7CTynhkj6c_J5l5fChs4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1664.876312802883, + "y": 5180.08895331706, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 1903147332, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2818, + "versionNonce": 703519754, + "isDeleted": false, + "id": "nbP7lNunZlZgeKxG--_Uc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2103.807433331623, + "y": 5179.8111586423765, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1769368828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3128, + "versionNonce": 1443119510, + "isDeleted": false, + "id": "yNdLP1hptivXsOTDT3QTp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1538.7950086903281, + "y": 5181.582261357557, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1630531780, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4077, + "versionNonce": 747293386, + "isDeleted": false, + "id": "dgG9GfgfAZPFyHE7HFbQ_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.7094129075483, + "y": 5212.255877211968, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 2123853180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2964, + "versionNonce": 1316200150, + "isDeleted": false, + "id": "ewKSQp2o0MkZWmEUIgLUf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.232307616852, + "y": 5211.9059039028725, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1794979908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 4892, + "versionNonce": 993714570, + "isDeleted": false, + "id": "4znaigKepBh3LnMY49gIN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1662.7035794694618, + "y": 5244.409390016464, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 952393212, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3787, + "versionNonce": 1401246742, + "isDeleted": false, + "id": "Ql9oniAxV-s0HZoANIc2M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.5171566201975, + "y": 5244.446382346697, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1790283716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 2808, + "versionNonce": 289022026, + "isDeleted": false, + "id": "fN5gRHCo64YXqRP2NOaea", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.5293585370287, + "y": 5252.172718576425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1895775868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2923, + "versionNonce": 1328439638, + "isDeleted": false, + "id": "60PnmQOXePmyyyLGM-swh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.7296018444245, + "y": 5265.865859611092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 276232004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2932, + "versionNonce": 1248036618, + "isDeleted": false, + "id": "roYpBiHIahgImXpPplakp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.754541748272, + "y": 5279.035330764937, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 269094652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4221, + "versionNonce": 616810134, + "isDeleted": false, + "id": "OqZJYd1DfAjMAMvBxh86m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.7183196180429, + "y": 5307.982998171912, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1486843588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1640, + "versionNonce": 1328682442, + "isDeleted": false, + "id": "-cg_BvDIy8tGEal9F2u04", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1767.6219457040413, + "y": 4759.1165180465505, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 375836540, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 2958, + "versionNonce": 83526614, + "isDeleted": false, + "id": "ifvstiWrGeSLp3d1p3Oxt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1795.9272486278103, + "y": 5092.293494598144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 63764036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3135, + "versionNonce": 1086377098, + "isDeleted": false, + "id": "ck--u3j1MSoE8QxNGfGjw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1796.2877505424374, + "y": 5111.0674383250025, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 609714172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3319, + "versionNonce": 1105697046, + "isDeleted": false, + "id": "i5OddiBqILZZLXT3VKQhS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1796.2075222329229, + "y": 5129.841917700452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 249400772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1796, + "versionNonce": 1691003722, + "isDeleted": false, + "id": "fYLQmxF8aDee1Hl871KOT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.011447669445, + "y": 4795.504398962254, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 31334524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2002, + "versionNonce": 587204182, + "isDeleted": false, + "id": "_HtjIYpX11lEiUUmiAmew", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.1724270462826, + "y": 4867.921699711752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 720319812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2118, + "versionNonce": 296399370, + "isDeleted": false, + "id": "l2XzYXJrX6Gv8jQLOKidH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4593588644627, + "y": 4881.701529257206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 649900284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2127, + "versionNonce": 957926294, + "isDeleted": false, + "id": "-lTAm4tV_OTStewxzcnhQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4842987683103, + "y": 4894.871000411051, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 895478980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1950, + "versionNonce": 442228938, + "isDeleted": false, + "id": "XrGYWIUWHn3bYQOHvtdEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.3351244896164, + "y": 4827.755242286376, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1114976636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 2771, + "versionNonce": 845605078, + "isDeleted": false, + "id": "K2SxX6hQIrIhKF5gVPnv8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.5217524239358, + "y": 4860.37913777289, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 802010180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 2595, + "versionNonce": 981022602, + "isDeleted": false, + "id": "CO8mrPdHBO85E0yskTA8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.2334812166607, + "y": 4923.811754626239, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1145676284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2683, + "versionNonce": 780099094, + "isDeleted": false, + "id": "pulK1b7vfIo758tkAmfW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.967168125129, + "y": 4955.581029071529, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 941001668, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2830, + "versionNonce": 37598794, + "isDeleted": false, + "id": "LpqcPl60xIK1zdsMHANFY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.2908449453005, + "y": 4988.214788406803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1664877180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3659, + "versionNonce": 307702614, + "isDeleted": false, + "id": "0rvn4-IYUTTFX5MsN303n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.4774728796199, + "y": 5019.060914714121, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 5796676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2378, + "versionNonce": 1115970826, + "isDeleted": false, + "id": "5XyV6uEzAyXxqoyV-VYkt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.131970739904, + "y": 5026.472034477165, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 638472956, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2494, + "versionNonce": 1547915414, + "isDeleted": false, + "id": "yj9DvpoWnTvUXzIlLhK1r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4189025580843, + "y": 5040.251864022619, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1190226628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2503, + "versionNonce": 2026384330, + "isDeleted": false, + "id": "6PCIVWHlWKYM_uKzwOXs8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4438424619318, + "y": 5053.421335176466, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1799525244, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2962, + "versionNonce": 2012794326, + "isDeleted": false, + "id": "UbDDBxqT6sFoM0sckEvLx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.1930249102822, + "y": 5082.087011403364, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1316975172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3218, + "versionNonce": 992223882, + "isDeleted": false, + "id": "dX-qrhOZHXOx4_u1hirNU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.7268228337023, + "y": 5179.767549855567, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1897579516, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3368, + "versionNonce": 311206678, + "isDeleted": false, + "id": "JMFHvzji21XGd3s7iXCr0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.9493021888165, + "y": 5211.761097651005, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1440778692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4187, + "versionNonce": 609435978, + "isDeleted": false, + "id": "6KbMH8u1bdkhjArx4Chwu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.1384102907148, + "y": 5244.081322788528, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1570301052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 2903, + "versionNonce": 1853083734, + "isDeleted": false, + "id": "jGB8Ske5iiDPmH9-Qks9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1797.8916254484773, + "y": 5252.065595153526, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 271757636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3018, + "versionNonce": 1068533770, + "isDeleted": false, + "id": "TLki30n8DRh3tehb1UwDp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.0918687558703, + "y": 5265.758736188194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1182725372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3027, + "versionNonce": 931354006, + "isDeleted": false, + "id": "DKXyKgxu6Hf00ltsiDFEY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.116808659718, + "y": 5278.92820734204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 483649732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3209, + "versionNonce": 1966536394, + "isDeleted": false, + "id": "1UeDp6TUllfeYkYEhDHBw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.8937399646309, + "y": 5307.642880520893, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 961475964, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 2782, + "versionNonce": 1458582230, + "isDeleted": false, + "id": "qvZFWhAOpqcdyDE27-dlu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2105.2854933809663, + "y": 5307.802195727031, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2137141316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3019, + "versionNonce": 1971424650, + "isDeleted": false, + "id": "5ZgVZObzZp0x9YRkSQkvx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1539.8068777868436, + "y": 5309.764395796254, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1128982012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1942, + "versionNonce": 1196386326, + "isDeleted": false, + "id": "PWUw0SmCb-IzFBCwDlyng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1351.6544541535475, + "y": 4803.143753853819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 398165956, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1904, + "versionNonce": 634080330, + "isDeleted": false, + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1481.1342651570483, + "y": 4824.079387213624, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 2037696124, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PWUw0SmCb-IzFBCwDlyng", + "focus": 0.1241274324604245, + "gap": 10.4798110035008 + }, + "endBinding": { + "elementId": "lsI78-QqmdT4q25J4qArV", + "focus": 0.6408863246638249, + "gap": 8.5605756191909 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2656, + "versionNonce": 1754658134, + "isDeleted": false, + "id": "icuTSnemB_UwMZkwKTD0s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1354.9389501519306, + "y": 4956.258652069314, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 436072260, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1850, + "versionNonce": 200225546, + "isDeleted": false, + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1482.5795751519306, + "y": 4978.791953287164, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 9344764, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "icuTSnemB_UwMZkwKTD0s", + "focus": 0.03756685726227266, + "gap": 8.640625 + }, + "endBinding": { + "elementId": "W_a57TQXOeR2j7OO8yq5v", + "focus": 0.4556907888570512, + "gap": 3.7244320259779897 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2935, + "versionNonce": 1410914966, + "isDeleted": false, + "id": "Tr4CsJduoGQhH0NewfphC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1349.5364534878552, + "y": 5187.555033593442, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 109536964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1590, + "versionNonce": 979911114, + "isDeleted": false, + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1480.981765987856, + "y": 5204.161232540564, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.0531503382990195, + "seed": 354047868, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Tr4CsJduoGQhH0NewfphC", + "focus": 0.03561765500799312, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "_8qZd05P7LkoyeqB71OhG", + "focus": 0.7478290302818356, + "gap": 7.2856921985579675 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.0531503382990195 + ] + ] + }, + { + "type": "rectangle", + "version": 4801, + "versionNonce": 814553046, + "isDeleted": false, + "id": "jTNf1d9BeoxNPcAOr7xVG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2636.257706191053, + "y": 5074.911238779883, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 569765444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4445, + "versionNonce": 1011972234, + "isDeleted": false, + "id": "t_412R9R_LVx_WKZyzlPM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2636.7024767612243, + "y": 5107.633675197632, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 324667388, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4339, + "versionNonce": 101166358, + "isDeleted": false, + "id": "ogj6vCBmJtNFl8bYoP8xV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2637.739285783597, + "y": 5167.799120896318, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 1831306692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3263, + "versionNonce": 23451466, + "isDeleted": false, + "id": "WeQ8f5HiU5mDMFUXfsRzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2947.9157109274256, + "y": 5037.281559403923, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 2135926908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "text", + "version": 3100, + "versionNonce": 301832790, + "isDeleted": false, + "id": "-cj4w3sINXo5SRQyLfFxh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2915.95913992634, + "y": 5075.35406879331, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 490351940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 3349, + "versionNonce": 1241538058, + "isDeleted": false, + "id": "X2IbyhcNAZHJ2Rwke-6Fy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2977.8288530857917, + "y": 5115.82844628005, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 213727484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3465, + "versionNonce": 457432982, + "isDeleted": false, + "id": "0RxMsL13oCPOtTi2WJVYb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2978.1157849039737, + "y": 5129.608275825506, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 327935172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3474, + "versionNonce": 320605386, + "isDeleted": false, + "id": "bf_23DxfB0ZpeM6R4xUVE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2978.1407248078212, + "y": 5142.777746979352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 656718204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3251, + "versionNonce": 1175420118, + "isDeleted": false, + "id": "6KHbxVrtlTUcyrX-EMs6H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2906.6056237645644, + "y": 5105.447598961059, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 1438297156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3410, + "versionNonce": 39052170, + "isDeleted": false, + "id": "CKYVvRY9IGyoE9IbFgqh9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2919.6424327869377, + "y": 5166.381079244727, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 2043161084, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3165, + "versionNonce": 1744138774, + "isDeleted": false, + "id": "WykKOVwDzK101j6AawBgH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2648.6977847749317, + "y": 5075.6568973271105, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 94667716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 3020, + "versionNonce": 1373823562, + "isDeleted": false, + "id": "YFIlXJdx1Vs4lNyE6G-PQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.221594298741, + "y": 5039.25951389457, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 2007599740, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3397, + "versionNonce": 1542111062, + "isDeleted": false, + "id": "NOPCqCqmPZEYOnC3JBuGx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2767.772075640982, + "y": 5116.064695559772, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1499949892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3513, + "versionNonce": 1017383178, + "isDeleted": false, + "id": "wtbGwMY3jw1jCMRM1XpYx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2768.0590074591623, + "y": 5129.844525105226, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1670044412, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3522, + "versionNonce": 1447322774, + "isDeleted": false, + "id": "dwpjsXZD1K7OsIO9ULT0I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2768.08394736301, + "y": 5143.013996259072, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 325149380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3307, + "versionNonce": 1779587018, + "isDeleted": false, + "id": "-orJOZIa9E9puaPUL6nnF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2651.021461595103, + "y": 5106.61485386465, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1475222396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3480, + "versionNonce": 951542230, + "isDeleted": false, + "id": "WKZKxhAzpCDf36B5oJmhR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2648.9226969872675, + "y": 5167.208349594902, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2049993284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1514720906, + "isDeleted": false, + "id": "F435cbi9gZlbEyBrNb21P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2795.391278239666, + "y": 4990.671921781778, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1326795772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2621, + "versionNonce": 1717090070, + "isDeleted": false, + "id": "UYBGI7mES40seRbbHJYxq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2530.06885760474, + "y": 5170.1905849762215, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1353875908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2770, + "versionNonce": 1375890762, + "isDeleted": false, + "id": "rnVCrDuqyUsQ7C61nuHs5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.04542010474, + "y": 5077.58330261015, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 721579132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2773, + "versionNonce": 396190806, + "isDeleted": false, + "id": "yN8klqLg-MzW7tvUcU-2z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2561.49073260474, + "y": 5110.92998229765, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 1308993860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 1897, + "versionNonce": 163890902, + "isDeleted": false, + "id": "ZBfnLP9rXKnm_EO9sY61v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1970.2561474419606, + "y": 4758.609031195423, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 785852484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 2773, + "versionNonce": 1995454858, + "isDeleted": false, + "id": "EBHHaH5bgK9igknIOTg8D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5092.211101047391, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 734096892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2952, + "versionNonce": 1517386774, + "isDeleted": false, + "id": "17ol-fPelwunEq9ZbF3df", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5110.985044774248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2110881732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3136, + "versionNonce": 1552185418, + "isDeleted": false, + "id": "S6JKotvLCSQLe1cFgZl4z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5129.759524149698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 567955068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1788, + "versionNonce": 1985317206, + "isDeleted": false, + "id": "t1UVmW6Mo0TrF5xX675Zp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4795.609924043816, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 982837060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2063, + "versionNonce": 1789058826, + "isDeleted": false, + "id": "8HTUpVQrctmAmVWhkgZDk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4869.15591807155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 318971644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2195, + "versionNonce": 751169174, + "isDeleted": false, + "id": "WihaOPWsBIwiPu6IcPW7I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4882.935747617006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1769955012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1573285322, + "isDeleted": false, + "id": "isvSLGD_25dcFqidATgBu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4896.105218770852, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2008932220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1938, + "versionNonce": 444050390, + "isDeleted": false, + "id": "4FQpR4KgPATdPcLMnyWcI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4827.759569902883, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1395582532, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 2757, + "versionNonce": 722085002, + "isDeleted": false, + "id": "8Kr7mI1WZKdH-tz566dtv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4860.383465389396, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1749848060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2573, + "versionNonce": 2105524502, + "isDeleted": false, + "id": "7xpjJ0Nhe5fZ7Yr4z57LU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4923.714884777691, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 2088861124, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2676, + "versionNonce": 1814627146, + "isDeleted": false, + "id": "VPJfrL15NXQsfbvhHTBkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4955.4841592229795, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 615592060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2818, + "versionNonce": 156446294, + "isDeleted": false, + "id": "EfpbB3lhGZkVWv95p42hK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4988.219116023311, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 513090884, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3650, + "versionNonce": 1266551306, + "isDeleted": false, + "id": "hlJqZmQZveu1R6W31BPPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 5018.967021261602, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 481149180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2434, + "versionNonce": 986117014, + "isDeleted": false, + "id": "vqon-t3vLiOxXJULnKuy2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5027.706252836964, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 516414660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2554, + "versionNonce": 1879324874, + "isDeleted": false, + "id": "-45lrmve_35eU2ZHjJxPU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5041.48608238242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2009350524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2563, + "versionNonce": 739250390, + "isDeleted": false, + "id": "FRnbi3I1yQTgI5ScXCVvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5054.655553536266, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 112698436, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2948, + "versionNonce": 1767280522, + "isDeleted": false, + "id": "mo7eWjSL5hmUjGKV959m5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 5082.091339019873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 490123772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3206, + "versionNonce": 1757644310, + "isDeleted": false, + "id": "gpQHRZuU6UACW2WIUx-XK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.3420393365332, + "y": 5179.771877472076, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 2084731844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3348, + "versionNonce": 464522826, + "isDeleted": false, + "id": "ukMbo6F6R4A8AsbuZeakf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5211.86662273257, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1007096444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4172, + "versionNonce": 1104565078, + "isDeleted": false, + "id": "5JQv78s7-nBO-QDV33E5K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5244.204706246281, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 965108548, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 2961, + "versionNonce": 736867594, + "isDeleted": false, + "id": "-PX1IhDrrE1KaD7QOWMhW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5253.299813513327, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1391944444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3077, + "versionNonce": 563968150, + "isDeleted": false, + "id": "lfMpeAM37i4jf-9rk56N4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5267.0796430587825, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 81877700, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3086, + "versionNonce": 1803846602, + "isDeleted": false, + "id": "DSkuj9larYJfUI0MUzQdb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5280.249114212627, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 948544380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3101, + "versionNonce": 1607333334, + "isDeleted": false, + "id": "3JNZef4SmD6kkXulXVYNq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5307.748405602459, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 686907972, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2350, + "versionNonce": 1856757770, + "isDeleted": false, + "id": "C4cW6hZgTLX-7HTW8isMd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2106.4839639890974, + "y": 4988.554559242124, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1743470276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 5084, + "versionNonce": 2018497814, + "isDeleted": false, + "id": "XTM9mkzsOyCIjx3xmbOBv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8634.11398619021, + "y": 4862.221437039244, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.880479020459, + "height": 175.9067584677423, + "seed": 199933636, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4160, + "versionNonce": 1427386186, + "isDeleted": false, + "id": "Pe8R70Ta_Frbd-3-vGfCq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8840.727831155089, + "y": 4896.970891607506, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 86.12404450345402, + "height": 127.14876224516367, + "seed": 205029244, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4396, + "versionNonce": 1493221974, + "isDeleted": false, + "id": "elCJvh4cao0pnDYwjY8Wj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8650.490280902735, + "y": 4897.02337316791, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.6056463210472, + "height": 127.81945912873799, + "seed": 1361987140, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5160, + "versionNonce": 1176745482, + "isDeleted": false, + "id": "WTPfAN6DuKgMmyiISCDj_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8643.965503064406, + "y": 4926.755768329523, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.65820978251435, + "height": 14.872173477198414, + "seed": 635417852, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4804, + "versionNonce": 1738672022, + "isDeleted": false, + "id": "_XNMnDs_nn96hcDYMX75H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8644.274602914275, + "y": 4949.496706832209, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.88328358031396, + "height": 14.35094994545205, + "seed": 1893673156, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4698, + "versionNonce": 1628726474, + "isDeleted": false, + "id": "uM5bZCn4Dfm0bRKYP4G7l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8644.995148594791, + "y": 4991.309568293785, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 294.3975969516018, + "height": 14.777899145225708, + "seed": 1855436156, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3622, + "versionNonce": 879273174, + "isDeleted": false, + "id": "xzuILWPcKfXZHvZE-kcJj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8860.556817632158, + "y": 4900.604469152412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50.037459047680535, + "height": 17.374117724889075, + "seed": 805662788, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "text", + "version": 3459, + "versionNonce": 528563082, + "isDeleted": false, + "id": "xhm5FvpaX0F2KD2w4qZoH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8838.348128565893, + "y": 4927.063519560939, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.1756239154498, + "height": 13.899294179911259, + "seed": 1367057916, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 3708, + "versionNonce": 15309334, + "isDeleted": false, + "id": "lrp9KF2mcwrtk_J9okur7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.345395767388, + "y": 4955.191783532787, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 1375127492, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3824, + "versionNonce": 262486602, + "isDeleted": false, + "id": "Jb5ag2wZhXsZAAtHzvOR6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.544803254914, + "y": 4964.768278762853, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 59606652, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3833, + "versionNonce": 337241942, + "isDeleted": false, + "id": "XVCawdy4sMnW7Gszil-4L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.562135607934, + "y": 4973.920596450912, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 1792094020, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3610, + "versionNonce": 1079730442, + "isDeleted": false, + "id": "yUNf24O1Ta1or1w6wOTaV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8831.847764928438, + "y": 4947.977460996618, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 92.43030629640987, + "height": 13.899294179911259, + "seed": 1234130684, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3769, + "versionNonce": 240028822, + "isDeleted": false, + "id": "bxphi2BYF4xtX7vb_RgnI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8840.907887116902, + "y": 4990.324079390044, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.1756239154498, + "height": 13.899294179911259, + "seed": 1525851844, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3524, + "versionNonce": 756985802, + "isDeleted": false, + "id": "NuAet_so5dyzwsFpfRKVk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8652.610918657334, + "y": 4927.273974704807, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 202620, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 3379, + "versionNonce": 1027377622, + "isDeleted": false, + "id": "LRtU2yUj9hop5RqgEjjOn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8721.081489272181, + "y": 4901.979077719412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.49355306881808, + "height": 17.374117724889075, + "seed": 1190735428, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "URL", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3756, + "versionNonce": 705308298, + "isDeleted": false, + "id": "YWT5iDae4RPllOhxtBb3J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.36334855791, + "y": 4955.355968444719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 590006268, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3872, + "versionNonce": 1878581014, + "isDeleted": false, + "id": "pFMe5wu1Cxf6deiVQbGlD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.562756045434, + "y": 4964.932463674785, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 264422852, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3881, + "versionNonce": 1339606346, + "isDeleted": false, + "id": "G5WqpvTCLp9AIONu6m6nE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.580088398454, + "y": 4974.0847813628425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 1460168828, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3666, + "versionNonce": 1257802838, + "isDeleted": false, + "id": "HyDPJY1chK535z3jwJIpp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.225792042464, + "y": 4948.788661961015, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 1248685380, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3839, + "versionNonce": 1743096842, + "isDeleted": false, + "id": "hvBg-yPegJjxU-fMsJ27K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8652.767224707528, + "y": 4990.899003088214, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 1868429564, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3560, + "versionNonce": 470847894, + "isDeleted": false, + "id": "nYLi9j2JjaE_RoqNhRgvE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8754.557719654595, + "y": 4868.21241590595, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.19143560855186, + "height": 17.374117724889075, + "seed": 945235140, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2887, + "versionNonce": 515744790, + "isDeleted": false, + "id": "iLFOasAmnQV_C5OeipR8t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8168.818334460782, + "y": 4757.624383752309, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 1416835068, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2633, + "versionNonce": 1886310474, + "isDeleted": false, + "id": "cACU6T60lJ-AgeVpl7rsZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8349.714795970767, + "y": 4758.2668245951945, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 1133829572, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2806, + "versionNonce": 786215254, + "isDeleted": false, + "id": "ihJs0TRsXfGZJ8oyeqPOP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8443.048716155477, + "y": 4756.649652333746, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 1739350268, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1942, + "versionNonce": 1065498378, + "isDeleted": false, + "id": "Vq2kTt4KEuwHGh_CmGDTr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8454.36366483644, + "y": 4762.277715471905, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 8600772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3196, + "versionNonce": 438834838, + "isDeleted": false, + "id": "5CQSd27jXzdplfcusLZag", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.45668952277, + "y": 4976.777359559265, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 703521148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3373, + "versionNonce": 217761226, + "isDeleted": false, + "id": "r6tDvC6X2UUrTVWm6ftDz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.688898053379, + "y": 4988.870138292526, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1510409284, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3557, + "versionNonce": 1767166934, + "isDeleted": false, + "id": "EcSZYcCYSkVjoXXCCPilT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.637220941248, + "y": 5000.963262050783, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1896698364, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2958, + "versionNonce": 569605258, + "isDeleted": false, + "id": "i1sSKHMwppd_RcZHt1O1P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.294606168998, + "y": 4785.673072613057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1856363460, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1725, + "versionNonce": 1182263574, + "isDeleted": false, + "id": "UgT6sAyqPB8SQ1SshHN67", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.411085097603, + "y": 4786.553360714136, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 470397564, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2092, + "versionNonce": 1814518602, + "isDeleted": false, + "id": "9RPJtAyKmyL-NVj0h2_iw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8127.139826370346, + "y": 4787.197249511865, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 1216201540, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2223, + "versionNonce": 1359369814, + "isDeleted": false, + "id": "HqjjiCp9eIFg8dJVaxWvA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.406124273388, + "y": 4832.301232229069, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1504051964, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1777426954, + "isDeleted": false, + "id": "Om2QENqWej6DlO8V5BaPh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.590944417694, + "y": 4841.177173911841, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2112666308, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2348, + "versionNonce": 1909791638, + "isDeleted": false, + "id": "FtfbssK2Pj7epC2AiR9eD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.607008849507, + "y": 4849.659968098001, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 811877244, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3068, + "versionNonce": 374116554, + "isDeleted": false, + "id": "rMUHazSS00pDKuHKKM7Z8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.405926072343, + "y": 4806.429431441648, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 697352772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1878, + "versionNonce": 790182102, + "isDeleted": false, + "id": "-b_N5kHA8_RwpZ1cEZcXU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.619573640253, + "y": 4806.453259150458, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 109474812, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1423173514, + "isDeleted": false, + "id": "AytQc2_VbqAnZWTzrLXIU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8127.348314912997, + "y": 4807.869515538347, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 1648875972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3849, + "versionNonce": 6794774, + "isDeleted": false, + "id": "nN_u9Lgpe6mLHah-RPdE3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.472687605225, + "y": 4827.365319783978, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 705598588, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2681, + "versionNonce": 1573021258, + "isDeleted": false, + "id": "SiCCOcqkCDgCGtra2BZQN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.739785480026, + "y": 4827.467147083391, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 858784068, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3060, + "versionNonce": 582318934, + "isDeleted": false, + "id": "HpSgbcAYHggf_UqgfVCSo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8126.824401101322, + "y": 4828.92947244562, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 1488889084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3590, + "versionNonce": 703794442, + "isDeleted": false, + "id": "isnAUSieV-Q9ZSSa8_SIL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.142647445778, + "y": 4868.307963739675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 329726148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2503, + "versionNonce": 1817682070, + "isDeleted": false, + "id": "6n0lfcOWQo2FzpVlCreJk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.554102600845, + "y": 4868.390906620041, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1209574780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2866, + "versionNonce": 1591794634, + "isDeleted": false, + "id": "_cGE6bpieOIkQbXwCQCmM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.2473256331195, + "y": 4869.717145899356, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 1598783556, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3702, + "versionNonce": 553852374, + "isDeleted": false, + "id": "vWfxC8FMWs2OWSpTO4ofs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.504379098875, + "y": 4888.637577161083, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 1167226492, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2607, + "versionNonce": 984011402, + "isDeleted": false, + "id": "WwSuRi2q_JWDq7_TR1Y79", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.317379624172, + "y": 4888.72394345185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1809006404, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 2957, + "versionNonce": 1171059478, + "isDeleted": false, + "id": "DjWDlp6HwcsaYuxGHGgOn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.431660888102, + "y": 4890.333106187907, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 1568032508, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3917, + "versionNonce": 2147479882, + "isDeleted": false, + "id": "h2PTfuR76zvjHX8I_Fkez", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.669726238164, + "y": 4910.2594426464675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 288536260, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4781, + "versionNonce": 1965695062, + "isDeleted": false, + "id": "CONbQpIwQfa-tQWdM5PXk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8162.033200607487, + "y": 4929.774187084923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 1502349180, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3578, + "versionNonce": 1648834570, + "isDeleted": false, + "id": "36YEancDo9Tvd1No0tZFO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.711263889696, + "y": 4929.614883318091, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1521958468, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2599, + "versionNonce": 854566294, + "isDeleted": false, + "id": "I2laWgChnv-u7EphwoV4D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.380065328687, + "y": 4934.427569896716, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1041610748, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 1903666890, + "isDeleted": false, + "id": "mfB7-YvYZkcAx8L8Jf1Kl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.564885472993, + "y": 4943.3035115794855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 557766084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1079149270, + "isDeleted": false, + "id": "ipgOl46q_S60cOiq2H15i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.580949904806, + "y": 4951.786305765647, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 924145788, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4019, + "versionNonce": 103562634, + "isDeleted": false, + "id": "3t4HcTrLkqCuSBstREFzS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.236892530694, + "y": 4970.027765932866, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1910996292, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2879, + "versionNonce": 1877456918, + "isDeleted": false, + "id": "_0ne7vL5ae6DvyWyP6pAN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.528043656144, + "y": 4970.274875616177, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 541911292, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3221, + "versionNonce": 765459530, + "isDeleted": false, + "id": "PIGzltRmJ5XYDkegZe-Hr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8101.491758871077, + "y": 4971.843483567001, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 101659844, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4384, + "versionNonce": 2040808790, + "isDeleted": false, + "id": "MUbrBIAMLgydeK2Ws6d3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8162.435773106561, + "y": 5033.307166872926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1361828348, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3134, + "versionNonce": 363717386, + "isDeleted": false, + "id": "dd7u2PZ1zVqdyOkDPBNNl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.162567056757, + "y": 5033.128232197127, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 194237380, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3445, + "versionNonce": 1323117206, + "isDeleted": false, + "id": "G1A2w4NSJWDgeDxUmeQ1a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8081.223570959986, + "y": 5034.269044887318, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 118962812, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4393, + "versionNonce": 2026959306, + "isDeleted": false, + "id": "f78JVgELD-T4kp8_Jj0vs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.684142951307, + "y": 5054.0267076817245, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 82623300, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3280, + "versionNonce": 1850173398, + "isDeleted": false, + "id": "0JT-g6JZWPFxNuxfkUu6r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.436239482513, + "y": 5053.801280896015, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 432179964, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5208, + "versionNonce": 170141834, + "isDeleted": false, + "id": "NBUIuWNc4XNG2JvboYDXY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.036259832755, + "y": 5074.737610063176, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1102885572, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4103, + "versionNonce": 938999062, + "isDeleted": false, + "id": "NZHUam7V_zPHM7v7CgVb5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.619718032356, + "y": 5074.761437771985, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1269812092, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3124, + "versionNonce": 1633847114, + "isDeleted": false, + "id": "I8NljSc1Ej5eZmuPd1Qrd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.225252761273, + "y": 5079.738169129245, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1621211716, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3239, + "versionNonce": 1097067094, + "isDeleted": false, + "id": "fxiYQHuHqHK2Y0jIYFTaw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.354234612098, + "y": 5088.558272518532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1059126268, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3248, + "versionNonce": 1726418442, + "isDeleted": false, + "id": "lVLMbT4bwM9GJgo-CG7Mt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.37029904391, + "y": 5097.041066704693, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2088358340, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4537, + "versionNonce": 694169494, + "isDeleted": false, + "id": "nA69uKhm3de-edu_ff_Og", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.689879992006, + "y": 5115.687001831034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 2115509372, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1956, + "versionNonce": 1068285130, + "isDeleted": false, + "id": "TqFtnQQLXmpMMb6AFVW4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8228.616870832182, + "y": 4762.148022763788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 610466116, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3274, + "versionNonce": 1814154454, + "isDeleted": false, + "id": "VTGah6UmKF3WyxnNTkjSk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8246.84904251731, + "y": 4976.755859831664, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 39267580, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3451, + "versionNonce": 961450890, + "isDeleted": false, + "id": "vaQIhw_7918UcsJ953lZs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.081251047915, + "y": 4988.848638564923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1404776644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3635, + "versionNonce": 926794262, + "isDeleted": false, + "id": "voJjo1Jea8ORPwIAzcH23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.029573935786, + "y": 5000.941762323182, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1029713276, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2114, + "versionNonce": 906465866, + "isDeleted": false, + "id": "G0yG8l61FHIB4slmJTASi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.828827363644, + "y": 4785.472025183069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1780512836, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2318, + "versionNonce": 1034489686, + "isDeleted": false, + "id": "xkkOvyQRGzKGQcPP9BiS1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.295219528718, + "y": 4832.232231284512, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 544546300, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2434, + "versionNonce": 414365962, + "isDeleted": false, + "id": "QrDUq2t360awQYNrHdvVM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.480039673024, + "y": 4841.1081729672815, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 594595780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2443, + "versionNonce": 196654230, + "isDeleted": false, + "id": "q9SAAymlcDFjYc0Pc7lYc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.496104104837, + "y": 4849.590967153443, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 613940860, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2266, + "versionNonce": 818612170, + "isDeleted": false, + "id": "PrKooB1iFm1o801REWaIA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.037315906295, + "y": 4806.35998572914, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 264910660, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3087, + "versionNonce": 1528934870, + "isDeleted": false, + "id": "yvMEmi5k435cXP1laZZ9K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.157527746065, + "y": 4827.373873662075, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1384828668, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 2911, + "versionNonce": 644578954, + "isDeleted": false, + "id": "63EgSRoT_HDMuUHpI2wwW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.971844866887, + "y": 4868.232449315619, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 193638084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3000, + "versionNonce": 1727596310, + "isDeleted": false, + "id": "tsAGTFbP0w-XzJ-kLhOR4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.800305773316, + "y": 4888.695853913638, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1255116668, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3146, + "versionNonce": 1716460874, + "isDeleted": false, + "id": "pHwG-tUQQ9tOcn4L-VeSz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.008794315966, + "y": 4909.716095404579, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 928003652, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3975, + "versionNonce": 1068741718, + "isDeleted": false, + "id": "qGgn-knVOrfekdGlJBnYg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.1290061557365, + "y": 4929.584876606845, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1302872060, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2694, + "versionNonce": 231793674, + "isDeleted": false, + "id": "tVWzSiFrFBOLZFZnED4Ho", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.26916058402, + "y": 4934.358568952156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1878576580, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2810, + "versionNonce": 522631574, + "isDeleted": false, + "id": "oqMf6HiKkCCIp8PMPkAEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.453980728324, + "y": 4943.234510634927, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1125572732, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2819, + "versionNonce": 1458295498, + "isDeleted": false, + "id": "7c1B6_sMO2CvD0KlIyQCU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.470045160137, + "y": 4951.717304821088, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1185051972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3278, + "versionNonce": 1015486166, + "isDeleted": false, + "id": "FNRZxLXaWjv0s9Mlb8SeX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.945785922185, + "y": 4970.18160219486, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1121808636, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3536, + "versionNonce": 70969738, + "isDeleted": false, + "id": "6c-jIZNsr2ZM9AJBBht9l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.645493205902, + "y": 5033.211144060343, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2024484036, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3684, + "versionNonce": 543804438, + "isDeleted": false, + "id": "pFCsIHHitRi2ZhUtZJA6p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.788797865448, + "y": 5053.708007474698, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 478015868, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4503, + "versionNonce": 1291397194, + "isDeleted": false, + "id": "iIOgPUeacSb3Alv-V-Vhv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.910607244777, + "y": 5074.526293546263, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1739650116, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3219, + "versionNonce": 2026101078, + "isDeleted": false, + "id": "osP2WP8UVaQebr0aNoplx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.114348016607, + "y": 5079.669168184685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1597661692, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3334, + "versionNonce": 1224838922, + "isDeleted": false, + "id": "Rw7Rk-JjGrXWypyGNqBMs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.243329867428, + "y": 5088.489271573973, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 294767556, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3343, + "versionNonce": 1827290774, + "isDeleted": false, + "id": "V9ZxMTjYixskOBg0dbC48", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.259394299243, + "y": 5096.972065760135, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1645527676, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3525, + "versionNonce": 1557077450, + "isDeleted": false, + "id": "ZE-bxacxCg_SbcKwzaApA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.397134463045, + "y": 5115.467923327504, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 141275972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3098, + "versionNonce": 1905392598, + "isDeleted": false, + "id": "NqMAtiDmnyzgkNVxZQd1-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8446.114623448917, + "y": 5115.570542338441, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1271862012, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3336, + "versionNonce": 628937866, + "isDeleted": false, + "id": "9JZrYFWd3UUnq7UP1SuKg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8081.875341800956, + "y": 5116.834445736295, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 1788652228, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2213, + "versionNonce": 483397910, + "isDeleted": false, + "id": "5584mfvXR9yFZO8g1jmNn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8359.138758031719, + "y": 4761.8211374652055, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 1621083076, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3089, + "versionNonce": 1690678090, + "isDeleted": false, + "id": "O9Kvj6eLM6H6hmPPvWNo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 4976.702788032109, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1291995772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3268, + "versionNonce": 2048491094, + "isDeleted": false, + "id": "xve1-V0HBTOqzzQos71oI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 4988.79556676537, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 855288644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3452, + "versionNonce": 1829026314, + "isDeleted": false, + "id": "R6_Ze1cuukQW2r5fD3SST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 5000.888690523628, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 265001724, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2105, + "versionNonce": 1581466518, + "isDeleted": false, + "id": "CMYpBijGLpfUgY23dKLjA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4785.654361675235, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1485611716, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 221571274, + "isDeleted": false, + "id": "QbmJIOUGJnQOJUlO78ZxI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4833.027222989542, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1041685372, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2511, + "versionNonce": 998400214, + "isDeleted": false, + "id": "cV8PN7qA8BJw_lONOJwOq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4841.903164672314, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2012457540, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2520, + "versionNonce": 2096185226, + "isDeleted": false, + "id": "Q8qmim-K5AsAoL15OvtG8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4850.3859588584755, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1915096060, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2254, + "versionNonce": 1970001430, + "isDeleted": false, + "id": "sqcEz8otkdaSy92f5nfaL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4806.3627732579425, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 873316804, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3073, + "versionNonce": 1215610442, + "isDeleted": false, + "id": "d97TU4XaCU4To7bOVfpfI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4827.376661190876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 771435644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2889, + "versionNonce": 888447830, + "isDeleted": false, + "id": "Zc6JvrIVPgzc5jZnoFfil", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4868.170052961317, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 603515204, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2994, + "versionNonce": 1016751370, + "isDeleted": false, + "id": "SMKGMZrd45opis06sl9wx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4888.744458960766, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1666727164, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3134, + "versionNonce": 1014089878, + "isDeleted": false, + "id": "Yrk7GMG7j8BZKuvoSTm0d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4909.718882933382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1259544772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3966, + "versionNonce": 1390228426, + "isDeleted": false, + "id": "II9RfHWQ2KMFRkc67os3I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4929.524397425575, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 2076130684, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2750, + "versionNonce": 999835094, + "isDeleted": false, + "id": "cnt3z3GTBhQ09J3B0WNhJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4935.153560657187, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 284846148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2870, + "versionNonce": 492317322, + "isDeleted": false, + "id": "IC0t4QlFORaU1qJEw5tKY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4944.029502339959, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1618095612, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2879, + "versionNonce": 595401494, + "isDeleted": false, + "id": "cVweW6Adrgs2fPfcLmsPy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4952.512296526121, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 965525444, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3264, + "versionNonce": 851855690, + "isDeleted": false, + "id": "NImXcG7vkVN2hWfxkLr-1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4970.184389723663, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 41094780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3523, + "versionNonce": 2056603734, + "isDeleted": false, + "id": "ScGYzx9UzD1vz14-Pv7Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.532198432586, + "y": 5033.102930187718, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1558718276, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3664, + "versionNonce": 444764170, + "isDeleted": false, + "id": "3LuSvU6DtPYErlO3xi9Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5053.775978886604, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1652809468, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4488, + "versionNonce": 817221014, + "isDeleted": false, + "id": "_elyFz5agi2d_FEa7otku", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5074.605767996367, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1600822980, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3277, + "versionNonce": 948436682, + "isDeleted": false, + "id": "1FnWGMB9u8Yn0ymZOeQc7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5080.464159889717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 421961596, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3393, + "versionNonce": 1930668758, + "isDeleted": false, + "id": "cTGrtsFamyu4xzfDALDIN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5089.3401015724885, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1773282884, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3402, + "versionNonce": 963745162, + "isDeleted": false, + "id": "ARbFnzkoEspeQP1sNUI41", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5097.82289575865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1587367932, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3417, + "versionNonce": 4448278, + "isDeleted": false, + "id": "OD9F4CaDCaf5P6aTtaULQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5115.53589473941, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1620884932, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2666, + "versionNonce": 2121946186, + "isDeleted": false, + "id": "n3pvWNSkHIM7joRjUTmx2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8446.886589110118, + "y": 4909.934950515223, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 317321340, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 2138, + "versionNonce": 2084269398, + "isDeleted": false, + "id": "5-H16PQoIjD4ZQIblkmti", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8164.543208936322, + "y": 4090.473777544993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 1291159108, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1720, + "versionNonce": 159202058, + "isDeleted": false, + "id": "HnNLeCfvm6fBi4fEXF4Au", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.968324587369, + "y": 4093.967431264302, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 1270870012, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2513, + "versionNonce": 1146049174, + "isDeleted": false, + "id": "nfjCIlO8AyrqyBB_r2DOo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8441.86742345065, + "y": 4088.760661249503, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 1148460484, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2452, + "versionNonce": 1760905674, + "isDeleted": false, + "id": "VIndRubLnsp77kVrLqxW3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8261.617465615525, + "y": 4089.772951695516, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 45650044, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2661, + "versionNonce": 1127518166, + "isDeleted": false, + "id": "ra_mwfEPuhceTu0DMEKdR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.078823856897, + "y": 4117.787634294618, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 255051076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1602, + "versionNonce": 603816074, + "isDeleted": false, + "id": "SicCtOVCveHa_fR5EUR1B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4117.803572906639, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 46735612, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1668, + "versionNonce": 1157637398, + "isDeleted": false, + "id": "5etj8mlI95-RFAaS7iCdY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.628449444059, + "y": 4117.803572906639, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1116896452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1427, + "versionNonce": 642834250, + "isDeleted": false, + "id": "YPcWUleALYB0NWSJIaK3z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.230081571084, + "y": 4118.6680301520355, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1131651452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1522, + "versionNonce": 1260851798, + "isDeleted": false, + "id": "UhralLSWCEfXttinDw2hv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.423321944158, + "y": 4094.2971444470377, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 405685316, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1649, + "versionNonce": 743073290, + "isDeleted": false, + "id": "jDAufKiD0BGFnHDHS-DKu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8453.183757197963, + "y": 4094.389413320603, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 2079986172, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1794, + "versionNonce": 1618892694, + "isDeleted": false, + "id": "gL-15ZB9q_ehT-G6sSrYF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8125.919863161142, + "y": 4119.311997768389, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1709513668, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1882, + "versionNonce": 786765002, + "isDeleted": false, + "id": "I2JiSUqH_-g3_t0Wrn0JC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4165.182233147472, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 727609980, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2014, + "versionNonce": 1832580310, + "isDeleted": false, + "id": "LiRFN3GfCwsONuiUEAsRm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4174.059261336996, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 366281540, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 1337715594, + "isDeleted": false, + "id": "OXU8eEFbGyi3-SNmIsR4j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4182.543093904603, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 543343356, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1880, + "versionNonce": 183626262, + "isDeleted": false, + "id": "QbPomE02QBrH75jySEDS6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.104079473414, + "y": 4164.389931997287, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 509344452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1996, + "versionNonce": 1158277706, + "isDeleted": false, + "id": "z6aYCXY6zg7TIuLXq5RsY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.28892224161, + "y": 4173.266960186809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 25756540, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2005, + "versionNonce": 1486370646, + "isDeleted": false, + "id": "7POB5mehMLTlo6AuMsMbt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.304988639875, + "y": 4181.750792754417, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2048393796, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1926, + "versionNonce": 1168773386, + "isDeleted": false, + "id": "DIqWkKTZTNTD5Z3mltXKs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.231240654995, + "y": 4164.421501677994, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1427321852, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2042, + "versionNonce": 1317198998, + "isDeleted": false, + "id": "DgKPLNlnKK1Um294lbiC2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.416083423193, + "y": 4173.298529867517, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 535239108, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2051, + "versionNonce": 1964466122, + "isDeleted": false, + "id": "8rLzyg5GPxf2d-k99g2-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.432149821458, + "y": 4181.782362435123, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 151213180, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2596, + "versionNonce": 308730326, + "isDeleted": false, + "id": "_rYCxJorKZ5maZK7omNpT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4308.875385560154, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2061975876, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2771, + "versionNonce": 1332532874, + "isDeleted": false, + "id": "ZMCK_glr_Mxp8iLUTlUJG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.190157386944, + "y": 4138.546533915479, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 2065392892, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1753, + "versionNonce": 1264135958, + "isDeleted": false, + "id": "k8-9t15onY56r1Ei5OcsA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4138.514519412379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1651931332, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1816, + "versionNonce": 358970698, + "isDeleted": false, + "id": "DJjZ811bNOg2-sqablL7b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.836963507856, + "y": 4138.514519412379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 14509436, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1580, + "versionNonce": 1976491094, + "isDeleted": false, + "id": "fHvdpBpz9rouiOt1Ymnxc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.438595634881, + "y": 4138.570364541045, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 305315908, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1940, + "versionNonce": 945568778, + "isDeleted": false, + "id": "m-atRuda2BodxLUtBrBGC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8126.128377224939, + "y": 4139.986794293315, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1871402492, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3548, + "versionNonce": 933028246, + "isDeleted": false, + "id": "EGbWldjPMGXB_pqwy-H-R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.256927092125, + "y": 4159.484985026341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 570038212, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2572, + "versionNonce": 1179396810, + "isDeleted": false, + "id": "2oG4TBuSQavzr0N7ScGLp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4159.530979661799, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 606549628, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2640, + "versionNonce": 871907030, + "isDeleted": false, + "id": "aMHVg-PTa9_NSpeJuBa8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.957190062794, + "y": 4159.530979661799, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 2112520004, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2383, + "versionNonce": 1439711626, + "isDeleted": false, + "id": "LsSqilbUJJsE6lpwRIfBM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.558822189822, + "y": 4159.5868247904655, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 192087804, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2762, + "versionNonce": 1601565718, + "isDeleted": false, + "id": "39z68M3DBH2LW0lHSl4gJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8125.604399280814, + "y": 4161.049329156392, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1583478468, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3293, + "versionNonce": 1914929226, + "isDeleted": false, + "id": "oiLAUvleaLAUW14fxl_m8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8159.92684653236, + "y": 4200.43264078368, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 703645564, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2389, + "versionNonce": 1410007382, + "isDeleted": false, + "id": "3i9LtVbVWN0B3OAXyjvLF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4200.459748688442, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1073643076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2457, + "versionNonce": 119596810, + "isDeleted": false, + "id": "4mRMuYBVgyrkkqOqJ7VPx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.771484454117, + "y": 4200.459748688442, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 602044412, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2205, + "versionNonce": 621569686, + "isDeleted": false, + "id": "2P7AUnzIXk5JdD5RWTUpt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.373116581144, + "y": 4200.515593817109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1537086916, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2568, + "versionNonce": 1296266698, + "isDeleted": false, + "id": "_eqCnGsttVViwydviHEDH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.025172197396, + "y": 4201.841995441781, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 1162483836, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3404, + "versionNonce": 858727382, + "isDeleted": false, + "id": "OdhN-IRm8XPo4dn_69uvh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.288622465139, + "y": 4220.841724968625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 509525316, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2491, + "versionNonce": 900082826, + "isDeleted": false, + "id": "223sA0kmQvs5PxqC1ju_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4220.937448565134, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 166308092, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2558, + "versionNonce": 8927510, + "isDeleted": false, + "id": "md2vH6dKKcdsdbGvXjo2F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.599924362394, + "y": 4220.937448565134, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 564032708, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2307, + "versionNonce": 1443105610, + "isDeleted": false, + "id": "hvH6KQeT0QqZyFXN0aE8k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.20155648942, + "y": 4220.9932936938, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 625158524, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2658, + "versionNonce": 76326486, + "isDeleted": false, + "id": "8N0q7emNnWmuhq2yg91pP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8107.209407606606, + "y": 4222.5374615456785, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 586890308, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3618, + "versionNonce": 1421349386, + "isDeleted": false, + "id": "UijtMLcj2YGnWZ-0DM7BZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.568368924351, + "y": 4242.466237193215, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 177773052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2635, + "versionNonce": 1141654, + "isDeleted": false, + "id": "OFA7GNpthSbpEzV3bjppf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4241.960263150304, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2085819332, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2706, + "versionNonce": 1421689034, + "isDeleted": false, + "id": "CCkv3Akfm9D7Wfv8scNK2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.808438426191, + "y": 4241.960263150304, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1961622140, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4475, + "versionNonce": 1363904726, + "isDeleted": false, + "id": "RtmmAgRfBCrHxo8PiUyan", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.817508706956, + "y": 4263.27177943567, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 465828676, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3463, + "versionNonce": 1638832010, + "isDeleted": false, + "id": "gXJy-C-R10lkpMWD_0YTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4263.0566110397485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1862224636, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3530, + "versionNonce": 1204813334, + "isDeleted": false, + "id": "7Rt67uyoLzvrWDqxSy7rr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.928664981131, + "y": 4263.0566110397485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2074866372, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3275, + "versionNonce": 1539774026, + "isDeleted": false, + "id": "ouNV5B-xDgmg-wJ5WqRvq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.530297108156, + "y": 4263.112456168415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1532267388, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2248, + "versionNonce": 2022951766, + "isDeleted": false, + "id": "_coMNt7V4NVIkO6UQcb6o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4268.686463338962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 447281732, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2368, + "versionNonce": 1675738378, + "isDeleted": false, + "id": "FXYLBDI6jkoZxLePhdMy6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4277.563491528486, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2083372028, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2377, + "versionNonce": 300675222, + "isDeleted": false, + "id": "FKPP6B-ub-5ZwQ1JITe8z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4286.047324096093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1939411396, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2251, + "versionNonce": 1199147978, + "isDeleted": false, + "id": "pXE_Vb1LThYWfpg-sseTU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.07801733883, + "y": 4267.894162188777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2072829052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2367, + "versionNonce": 797797846, + "isDeleted": false, + "id": "UpbmEzy2iNh8CL64Ap0n4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.262860107026, + "y": 4276.771190378299, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1973041476, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2376, + "versionNonce": 1823048330, + "isDeleted": false, + "id": "X0xjqF5lL0dXgMfocKLKy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.27892650529, + "y": 4285.255022945907, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1932782844, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2297, + "versionNonce": 781009686, + "isDeleted": false, + "id": "0fswizsqIMXnlSH0jg1__", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.205178520411, + "y": 4267.925731869484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2081059012, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2413, + "versionNonce": 1043112266, + "isDeleted": false, + "id": "77IZEo25LdPIVbiqZzbhN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.39002128861, + "y": 4276.802760059006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1956965756, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2422, + "versionNonce": 23097430, + "isDeleted": false, + "id": "SRRxPQdorEpl4EAeFMdF2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.406087686873, + "y": 4285.286592626613, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1183299652, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3717, + "versionNonce": 392030218, + "isDeleted": false, + "id": "tUYk9IUYIjII8pdITVhw-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.021103153846, + "y": 4303.530285736582, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 287432188, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2761, + "versionNonce": 64746902, + "isDeleted": false, + "id": "du5MaoTWL5p-RgRACoBhT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.540489091714, + "y": 4303.72158054, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 1894780868, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2831, + "versionNonce": 808998602, + "isDeleted": false, + "id": "HnPioX-NmSD9mPg6Y03CL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.745422319533, + "y": 4303.72158054, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1638710908, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2576, + "versionNonce": 1328861910, + "isDeleted": false, + "id": "zhTWjAXWx0AfDBCK67uVj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.34705444656, + "y": 4303.777425668666, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1801549636, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2918, + "versionNonce": 156691850, + "isDeleted": false, + "id": "zaFVWh9X8Iu4JTtIpWxLT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8100.2686560740385, + "y": 4305.346225633272, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 252153596, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2775, + "versionNonce": 234883094, + "isDeleted": false, + "id": "DwtKLXA8mAgAtk8R4DXK9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4320.969644574178, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1916399300, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2959, + "versionNonce": 1475652682, + "isDeleted": false, + "id": "hzYdOLT7hR0JmFlA15GE_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4333.064248655436, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1504989052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2840, + "versionNonce": 1345492310, + "isDeleted": false, + "id": "qfCsU-Jmig9Y32VjsFl0S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.657725435032, + "y": 4308.931251726268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 102200900, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3017, + "versionNonce": 1911329546, + "isDeleted": false, + "id": "w8atK3lzklq62XGgZBSxu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.889962390356, + "y": 4321.025510740293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 569704444, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1596029590, + "isDeleted": false, + "id": "dIbHx1-Z6uXRZdjNp8D9u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.838278952415, + "y": 4333.1201148215505, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1675103684, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2903, + "versionNonce": 968466890, + "isDeleted": false, + "id": "9s1rO8PxQNmwy-hYMhFwh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.28168968378, + "y": 4308.915314375379, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1875615868, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3080, + "versionNonce": 293713878, + "isDeleted": false, + "id": "bx1wVaoiWTaf-q9YqVw12", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.513926639103, + "y": 4321.009573389404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2090448196, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3264, + "versionNonce": 175560842, + "isDeleted": false, + "id": "f3TQcnoMBR_Z2oNqVxJ9P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.462243201162, + "y": 4333.104177470662, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2063216892, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4087, + "versionNonce": 526929174, + "isDeleted": false, + "id": "exAsU_Q8cO859ieYnteEU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.297112694359, + "y": 4365.452041520142, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 1840934084, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3022, + "versionNonce": 601831242, + "isDeleted": false, + "id": "dSI8PDxoRgJe-ZqN1j3On", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4365.282431674513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 855814524, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3090, + "versionNonce": 1984576086, + "isDeleted": false, + "id": "_IL1NZ-X8U3RnmwgE1vXF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.522075053634, + "y": 4365.282431674513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 2027435076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2835, + "versionNonce": 374193674, + "isDeleted": false, + "id": "_wiKXkinUtPkIw0RVqaet", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.123707180659, + "y": 4365.338276803179, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1193746940, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3147, + "versionNonce": 217874326, + "isDeleted": false, + "id": "XOHaqa42PkHAC_HEl-8Zu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8080.074969337138, + "y": 4366.4140372783195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 2077297604, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4096, + "versionNonce": 784166090, + "isDeleted": false, + "id": "Ctm0h5VnfpqJcZO29PVyv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.545390531826, + "y": 4386.174118614305, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 778666620, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3166, + "versionNonce": 934550742, + "isDeleted": false, + "id": "bMknO3jgMotthVkocvvTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4385.958010967651, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1757606724, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3243, + "versionNonce": 1657357194, + "isDeleted": false, + "id": "MzBfcD3cZHYD8WfcNEz9M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.730589117431, + "y": 4385.958010967651, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 797692668, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2981, + "versionNonce": 2080772630, + "isDeleted": false, + "id": "U8WZgRjUXECE7emqki-S0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.332221244456, + "y": 4386.013856096318, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1040968388, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4907, + "versionNonce": 1017922122, + "isDeleted": false, + "id": "q9Yg7QYhvg2dfGMNn0Tgv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8159.8974281057035, + "y": 4406.887556223689, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 1762661244, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3989, + "versionNonce": 1692884822, + "isDeleted": false, + "id": "qy7h07retrv7hCuomrChz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4406.855541720589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 2118775364, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4062, + "versionNonce": 1195469066, + "isDeleted": false, + "id": "mfzYWRJrS_kOhJE7AzuRE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.787221545199, + "y": 4406.855541720589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1496859644, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3804, + "versionNonce": 1454179478, + "isDeleted": false, + "id": "xX7l4AMXxcwjCCKt1Ju1e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.452447799396, + "y": 4406.911386849255, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 677054916, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2780, + "versionNonce": 2047064010, + "isDeleted": false, + "id": "o5wl0ubOB494-FQTl1e1w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4412.649458879209, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1711694972, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 1661731286, + "isDeleted": false, + "id": "HUj9ygNCZk9YBSOFL3Oyx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4421.526487068733, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 794636612, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 621686410, + "isDeleted": false, + "id": "SgdnWHdrjzaLglwZbP-z_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4430.010319636341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1698460924, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2781, + "versionNonce": 488199958, + "isDeleted": false, + "id": "tgwqzJs6reSQ8BwnH6rks", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.00016803007, + "y": 4411.857157729024, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1924032708, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 1562103114, + "isDeleted": false, + "id": "-8gQ287vjpgaJF1FS6S2L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.1291656696, + "y": 4420.67834078988, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 610039164, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 1833567318, + "isDeleted": false, + "id": "EPZ1FPo1way9vjvQt57v6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.145232067865, + "y": 4429.1621733574875, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 904704068, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2827, + "versionNonce": 1736938506, + "isDeleted": false, + "id": "GYHImLEs5SAWd3ZMZTkKc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.12732921165, + "y": 4411.8887274097315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1890084348, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2942, + "versionNonce": 1702037910, + "isDeleted": false, + "id": "ghoL38oTRlwZJRUWVypuy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.256326851182, + "y": 4420.709910470587, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 418777028, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2951, + "versionNonce": 642548426, + "isDeleted": false, + "id": "HwJMFBWnRzTv-8ezhhzEu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.272393249446, + "y": 4429.193743038194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 522339964, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4240, + "versionNonce": 348743382, + "isDeleted": false, + "id": "uSconJ3cXahhwx9h4herL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.551128274799, + "y": 4447.841960619189, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 266891076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2918, + "versionNonce": 67475850, + "isDeleted": false, + "id": "WWqexOkF8TOjOhoPnyVNB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 344725244, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3078, + "versionNonce": 1541544982, + "isDeleted": false, + "id": "fJd-8RUnGnuVrAjT4cZse", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8266.273808319413, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1528948420, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2799, + "versionNonce": 1609422922, + "isDeleted": false, + "id": "HBLDeQoWpyHplcLXKzTEN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.01068825205, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1298651004, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3038, + "versionNonce": 1085417814, + "isDeleted": false, + "id": "xWXRy-GEKUQe5h6-ngIiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8080.726819961577, + "y": 4448.989544983412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 2134928964, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4594, + "versionNonce": 2044739338, + "isDeleted": false, + "id": "tLLMWNqbQJQBg289zzcvL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8628.889204560171, + "y": 4208.455819988283, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 240255044, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3543, + "versionNonce": 1116638870, + "isDeleted": false, + "id": "WoZuW6EiWStyGlbffEhtN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8644.341818150597, + "y": 4245.269835210445, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 939529724, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3006, + "versionNonce": 1582812618, + "isDeleted": false, + "id": "ZZmzvsAD55e4l0vCrUmSy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.140875455123, + "y": 4248.897928361612, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1479628740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3817, + "versionNonce": 774654934, + "isDeleted": false, + "id": "TwARQcO_ozN7_xXiWlyZL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8747.57229039697, + "y": 4244.312802203882, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 259708, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4672, + "versionNonce": 1383040138, + "isDeleted": false, + "id": "QZ7vKFM6_GLD0TlYFTakW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8638.725851902398, + "y": 4272.892745435941, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1798946628, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2841, + "versionNonce": 1906336022, + "isDeleted": false, + "id": "tvMygkREm3tH0LeW6EnH7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8680.962251018516, + "y": 4275.317042413032, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1303889660, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2945, + "versionNonce": 1071801162, + "isDeleted": false, + "id": "KOSGU46wM-Yy34eNia9Ct", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.689727335766, + "y": 4274.4496477208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1607022276, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2802, + "versionNonce": 1885326934, + "isDeleted": false, + "id": "tMfnXCr5mOiOA5Mgypdhy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8818.056950887241, + "y": 4249.192929960411, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 1167951740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3092, + "versionNonce": 554396170, + "isDeleted": false, + "id": "vGCIGLDFnE7HQsE6VVnAq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8684.89807604402, + "y": 4303.402850575718, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 310230596, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3208, + "versionNonce": 1463784342, + "isDeleted": false, + "id": "99TdHICzQ0lqFqOKuC8Pw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8685.09718255292, + "y": 4312.964891381781, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 737622012, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3217, + "versionNonce": 1826986186, + "isDeleted": false, + "id": "HSz2waOXLDV6epfNcgTPW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8685.114488745097, + "y": 4322.103394884451, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 473257412, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3179, + "versionNonce": 1886695638, + "isDeleted": false, + "id": "qGfv5ZeYCiqJsAJ41Np0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.317253638486, + "y": 4302.489255490206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1824970876, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3295, + "versionNonce": 51113866, + "isDeleted": false, + "id": "V2gu_TxL3PSdpAZ4_w7z-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.516360147383, + "y": 4312.0512962962675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1242430788, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3304, + "versionNonce": 2006197782, + "isDeleted": false, + "id": "ydD1HKsXFz6YEomSK6Bsl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.533666339561, + "y": 4321.189799798937, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 600729852, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4315, + "versionNonce": 398028362, + "isDeleted": false, + "id": "qf0yhexwBjimhSLkqph-5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8639.03448520786, + "y": 4295.599359568441, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 358986948, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2993, + "versionNonce": 1838347094, + "isDeleted": false, + "id": "UqpW8hB8t97_OtXbc7WPg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8668.089195610477, + "y": 4296.199417083434, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 613411196, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3088, + "versionNonce": 533271818, + "isDeleted": false, + "id": "FDV27XyimCkqP5y0RbpaT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8751.302163287988, + "y": 4295.931861467188, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 467303492, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4210, + "versionNonce": 1824921750, + "isDeleted": false, + "id": "m3dAQmkvd0DAYuhgjbXAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8639.75394332215, + "y": 4337.34911017225, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 38623740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3152, + "versionNonce": 1018553290, + "isDeleted": false, + "id": "yTgOQagoQjaZuexlO2k0G", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8644.521602342294, + "y": 4338.482118985213, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 390747076, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3260, + "versionNonce": 2095224278, + "isDeleted": false, + "id": "jdjij0FkzNjIAx7aUirKV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.845797463124, + "y": 4337.978642731308, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 403225212, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3072, + "versionNonce": 681237130, + "isDeleted": false, + "id": "n5yXnT6yEzdfdGOIRUMZV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.151144502997, + "y": 4214.437756282874, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 1439906628, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2235, + "versionNonce": 974062666, + "isDeleted": false, + "id": "tMJHH9xDGv7l-YOVB9Olh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8154.5483900876625, + "y": 5801.4695152643535, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 962946684, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1817, + "versionNonce": 1971961174, + "isDeleted": false, + "id": "QTDJG-6VzZ9ZwERAzL994", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8163.97350573871, + "y": 5804.963168983663, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 115822404, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2610, + "versionNonce": 1325132554, + "isDeleted": false, + "id": "z6GNnLrwh40CDh9qaXalO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8431.872604601991, + "y": 5799.756398968863, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 963327740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2549, + "versionNonce": 525574806, + "isDeleted": false, + "id": "CvO-ZTWVJmnoVB20GDlf0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8251.622646766866, + "y": 5800.7686894148765, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 1329907396, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2758, + "versionNonce": 1797126602, + "isDeleted": false, + "id": "N3e0tK-nGSqKjveCswdfw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.084005008237, + "y": 5828.783372013978, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 1231222652, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1699, + "versionNonce": 1496244182, + "isDeleted": false, + "id": "0CqvMrOtiLf5KThIAD4eO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5828.799310625999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 738676292, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1765, + "versionNonce": 1032859786, + "isDeleted": false, + "id": "51qBjF1iCt5vwPO94Hpti", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.6336305954, + "y": 5828.799310625999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1972283388, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1524, + "versionNonce": 1194358038, + "isDeleted": false, + "id": "3PJqxIpSSrF87oji1ekoj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.235262722425, + "y": 5829.663767871395, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1846339012, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1619, + "versionNonce": 1510838090, + "isDeleted": false, + "id": "nyTumWhlHJmboxX9angpn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8311.428503095498, + "y": 5805.292882166398, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 1911572604, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1746, + "versionNonce": 1120756310, + "isDeleted": false, + "id": "cCDYA7WGkGb-EkALX5mt7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8443.188938349303, + "y": 5805.3851510399645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 443780420, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1891, + "versionNonce": 619779594, + "isDeleted": false, + "id": "OUhG7K13uhTVIfbOW1sG6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8115.925044312482, + "y": 5830.307735487749, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 575265020, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1979, + "versionNonce": 786081686, + "isDeleted": false, + "id": "cJnH18CbtyfkxB4Lp1gGb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5876.177970866832, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1654211780, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2111, + "versionNonce": 1060488394, + "isDeleted": false, + "id": "ndcf2a1JEpeOAJwB0u1u5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5885.054999056357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 572348796, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2120, + "versionNonce": 1267549398, + "isDeleted": false, + "id": "XoQ3Vtdh3dC4snmoTvvQE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5893.538831623963, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 471600196, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1977, + "versionNonce": 1920375690, + "isDeleted": false, + "id": "8gA_vCpXXRPyOAnTxv2Tm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.109260624755, + "y": 5875.3856697166475, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1286392316, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2093, + "versionNonce": 175782422, + "isDeleted": false, + "id": "BiWnIZACXW76-aOb-dhil", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.294103392951, + "y": 5884.262697906171, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 953803716, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2102, + "versionNonce": 485399114, + "isDeleted": false, + "id": "Ipu3HaB5ay0a2NMS5Y8aZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.310169791215, + "y": 5892.746530473777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1157245564, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 1654032214, + "isDeleted": false, + "id": "iASlv7vBVXBhTpV0YTOrv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.236421806334, + "y": 5875.417239397354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1055968068, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2139, + "versionNonce": 494453002, + "isDeleted": false, + "id": "0U_Ze_8tB-rEjM3hBY9a9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.421264574532, + "y": 5884.294267586877, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2110225148, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2148, + "versionNonce": 607595670, + "isDeleted": false, + "id": "kBDSNyhwbxmpSQd8l44is", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.437330972796, + "y": 5892.778100154484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1086243524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2693, + "versionNonce": 1066405834, + "isDeleted": false, + "id": "ogmq7lj04ospfMJIeK7Nl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6019.871123279515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1100397436, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2868, + "versionNonce": 1292970454, + "isDeleted": false, + "id": "d0MB-1vFF33ax25FBTt5f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.195338538284, + "y": 5849.542271634839, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 1424083524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1850, + "versionNonce": 659523210, + "isDeleted": false, + "id": "IAd5vDK8YJBDJKLnC5apo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5849.510257131739, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 984214524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1913, + "versionNonce": 1547271958, + "isDeleted": false, + "id": "oCRaWV1sykBJ-qn0ZU2PU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.842144659196, + "y": 5849.510257131739, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 238543300, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1677, + "versionNonce": 1030890826, + "isDeleted": false, + "id": "rLYn8sqzOYTBp_xVhw6ZU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.443776786222, + "y": 5849.566102260406, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 2063797372, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 2037, + "versionNonce": 639970390, + "isDeleted": false, + "id": "2hCCp_dGiQMqdxmfuJTfx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8116.133558376279, + "y": 5850.982532012676, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1943996740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3645, + "versionNonce": 458419210, + "isDeleted": false, + "id": "WXaUqvGsC_h79XNjh1JM0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.262108243465, + "y": 5870.480722745701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 73669884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2669, + "versionNonce": 682176918, + "isDeleted": false, + "id": "fopC9hjwrPetggXkDEnMf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5870.52671738116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 2033533124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2737, + "versionNonce": 1995233994, + "isDeleted": false, + "id": "Dx0rUTmWINJVGC8MNQRhZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.962371214135, + "y": 5870.52671738116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1347362172, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2480, + "versionNonce": 1593478870, + "isDeleted": false, + "id": "yRs66yiyIr3DRjvEk1zxy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.564003341162, + "y": 5870.582562509825, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1977124932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2859, + "versionNonce": 249229706, + "isDeleted": false, + "id": "-SexBZ9sV47LV5PLt84hL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8115.609580432154, + "y": 5872.045066875752, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1476791804, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3390, + "versionNonce": 363742230, + "isDeleted": false, + "id": "q75lZrJdEYqPLFYTh1Dmd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8149.932027683701, + "y": 5911.428378503041, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 497475524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 374878282, + "isDeleted": false, + "id": "S6mpwe2w0tQWBVBnxDBCc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5911.455486407803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 478867068, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2554, + "versionNonce": 1052332374, + "isDeleted": false, + "id": "uBpkoLV1aOVVECSeuoyxp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.776665605457, + "y": 5911.455486407803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2025736004, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2302, + "versionNonce": 557815562, + "isDeleted": false, + "id": "T2ZjKX96-gH8eMP3VH1an", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.378297732484, + "y": 5911.51133153647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 782221052, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2665, + "versionNonce": 1165014678, + "isDeleted": false, + "id": "FWpJ9rCnqP4LQrLlLP_ep", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8098.030353348737, + "y": 5912.837733161142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 1534901956, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3501, + "versionNonce": 269231562, + "isDeleted": false, + "id": "8ImvMmUsEfkbYihIfTof5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.29380361648, + "y": 5931.837462687986, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 918978428, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2588, + "versionNonce": 1653175254, + "isDeleted": false, + "id": "D_8yt1Ad_T7Bd8LpD2gU2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5931.933186284495, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1585464900, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2655, + "versionNonce": 2077809802, + "isDeleted": false, + "id": "b6D4lojDl9I0D_vWxUhgR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.605105513734, + "y": 5931.933186284495, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2101424124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2404, + "versionNonce": 1880656150, + "isDeleted": false, + "id": "xKmKcev8RE1QkRiHAs57k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.206737640761, + "y": 5931.989031413162, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1453776324, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2755, + "versionNonce": 576764746, + "isDeleted": false, + "id": "xE91qIgI91dMfzE3jUX-v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8097.214588757946, + "y": 5933.533199265038, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 1913770108, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3715, + "versionNonce": 1033041494, + "isDeleted": false, + "id": "rak3HO3nctRMWnMverxdw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.573550075691, + "y": 5953.461974912577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 1292797252, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2732, + "versionNonce": 1375650314, + "isDeleted": false, + "id": "dW-wqHtGuhYbr0d5RtkEb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5952.9560008696635, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 888824060, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2803, + "versionNonce": 1674427286, + "isDeleted": false, + "id": "K7hfLwAQDs190trTgMSFu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.813619577531, + "y": 5952.9560008696635, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1997880516, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4572, + "versionNonce": 1437462730, + "isDeleted": false, + "id": "0zm4BAn5EMMbXhdqQID3S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.822689858296, + "y": 5974.267517155032, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 494723452, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3560, + "versionNonce": 419289302, + "isDeleted": false, + "id": "cg2Z3Pt6rOZka0FyhAwLX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5974.052348759108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 777585732, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3627, + "versionNonce": 1627998090, + "isDeleted": false, + "id": "qa5r1KIySBrmFxx7ARGEb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.933846132471, + "y": 5974.052348759108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1121669628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3372, + "versionNonce": 79187478, + "isDeleted": false, + "id": "FXSp61p59sxx_i16YN2uy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.535478259495, + "y": 5974.108193887775, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1756879812, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2345, + "versionNonce": 2085340746, + "isDeleted": false, + "id": "qLBQ2sgwPimN1SMdRaFOr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5979.682201058323, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 68661884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2465, + "versionNonce": 334633814, + "isDeleted": false, + "id": "ekMNO9cK1ERQyQQ3SlIAu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5988.559229247846, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 810533700, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2474, + "versionNonce": 1884318986, + "isDeleted": false, + "id": "Oo5tzz9_znerLf2dZBtMu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5997.043061815452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 267649788, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2348, + "versionNonce": 1291862166, + "isDeleted": false, + "id": "eC9ZWLDkPsYvQPwFxLMKu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.08319849017, + "y": 5978.889899908138, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 461290180, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2464, + "versionNonce": 848444362, + "isDeleted": false, + "id": "qshrm1GEylcXM2OiBY-pZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.268041258367, + "y": 5987.76692809766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1827816316, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2473, + "versionNonce": 597147094, + "isDeleted": false, + "id": "nFAkRhkZM6XzhErRfMCU_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.284107656631, + "y": 5996.250760665268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1155711556, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2394, + "versionNonce": 1361851018, + "isDeleted": false, + "id": "o9z3mEt-upAy8W9nhSVgB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.21035967175, + "y": 5978.921469588843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 22311932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2510, + "versionNonce": 1288540950, + "isDeleted": false, + "id": "nQ7RHr2DHXd91NDT6PeZq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.395202439948, + "y": 5987.798497778366, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1129961924, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2519, + "versionNonce": 1591300426, + "isDeleted": false, + "id": "JShrwIiZ7Q8cNSCKRakVL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.411268838212, + "y": 5996.282330345973, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 454857852, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3814, + "versionNonce": 320258134, + "isDeleted": false, + "id": "p055Rix90urW7eyLOQnqj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.026284305186, + "y": 6014.526023455942, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 570556740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2858, + "versionNonce": 1593088010, + "isDeleted": false, + "id": "YS54xQkRA5ufn92rNEhxT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.545670243055, + "y": 6014.717318259361, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 2014094588, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2928, + "versionNonce": 709379478, + "isDeleted": false, + "id": "6IhtpNjUBKJv3X9XT8nFk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.750603470873, + "y": 6014.717318259361, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1480145092, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2673, + "versionNonce": 830015178, + "isDeleted": false, + "id": "L7QmQmYHFpoIJ-EQloHmQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.3522355979, + "y": 6014.773163388028, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1302766972, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 3015, + "versionNonce": 60236502, + "isDeleted": false, + "id": "jvw-B8H_zFLe4jMAykvdl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8090.273837225379, + "y": 6016.341963352633, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 1100841028, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2872, + "versionNonce": 2130812298, + "isDeleted": false, + "id": "berO2PFT-n6YVo9ZAYorw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6031.965382293539, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1361876476, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3056, + "versionNonce": 563632150, + "isDeleted": false, + "id": "Q1m0-cIfEV4oe_QTnAYBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6044.059986374797, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 369940420, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2937, + "versionNonce": 617176138, + "isDeleted": false, + "id": "iuvrlmHdzMu2Z5Mi9xkJB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.662906586373, + "y": 6019.926989445629, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1067480700, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3114, + "versionNonce": 1816192342, + "isDeleted": false, + "id": "_ruJpQLkJgfq01_UeZ-0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.895143541697, + "y": 6032.021248459653, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1638219588, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3298, + "versionNonce": 548094730, + "isDeleted": false, + "id": "6xnsQD0Bz4-7EGcvSQC-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.843460103755, + "y": 6044.115852540911, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1707362044, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3000, + "versionNonce": 82168470, + "isDeleted": false, + "id": "AuRxkkcQawO4ed-ASofTe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.28687083512, + "y": 6019.911052094739, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2093266628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3177, + "versionNonce": 2099401162, + "isDeleted": false, + "id": "4kmqaGsX4VQ6kSipSP3Ov", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.519107790442, + "y": 6032.0053111087645, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 672794492, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3361, + "versionNonce": 440141782, + "isDeleted": false, + "id": "58p5amzcrtOaNqx63Ay7A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.4674243525, + "y": 6044.099915190022, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 67714628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4184, + "versionNonce": 1028229258, + "isDeleted": false, + "id": "Lrw2NpyOkeBePipt1F6Nl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8151.3022938457, + "y": 6076.447779239504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 182695932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3119, + "versionNonce": 1012440342, + "isDeleted": false, + "id": "gDIBbtTCsImhGjuE7r3u7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6076.278169393873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1347474884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3187, + "versionNonce": 1222371146, + "isDeleted": false, + "id": "uBFs-oxX-H1FqLjHXe2ps", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.527256204974, + "y": 6076.278169393873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 975394940, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2932, + "versionNonce": 816876118, + "isDeleted": false, + "id": "Qms17krviGXmkqgDRtTgZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.128888331998, + "y": 6076.33401452254, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1857649988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3244, + "versionNonce": 1479831050, + "isDeleted": false, + "id": "BxjSc-Xi8vm75CYuDzzVD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8070.0801504884785, + "y": 6077.40977499768, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 295364860, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4193, + "versionNonce": 1176031126, + "isDeleted": false, + "id": "8ltjUjES_FLmy8yVKGVs3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.550571683167, + "y": 6097.169856333666, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 413217988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3263, + "versionNonce": 1615731914, + "isDeleted": false, + "id": "86vQD_jDUskxxVmyb4UrV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6096.953748687011, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 617376124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3340, + "versionNonce": 684092630, + "isDeleted": false, + "id": "pa2ZFWImeEXpGKnQAIlZJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.735770268771, + "y": 6096.953748687011, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 732298308, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3078, + "versionNonce": 2126771082, + "isDeleted": false, + "id": "GU80FgsMvQG3VbbEDSmPV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.337402395795, + "y": 6097.009593815678, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1190779388, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 5004, + "versionNonce": 911106582, + "isDeleted": false, + "id": "ENU1NKg_hZzGpCmpZrKDZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8149.902609257044, + "y": 6117.8832939430495, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 564515780, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4086, + "versionNonce": 1708192330, + "isDeleted": false, + "id": "FIuoWoP8J91DnI1FvEFel", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6117.851279439949, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 321206908, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4159, + "versionNonce": 1369812822, + "isDeleted": false, + "id": "n_oRf4kzwvXqopjmcv5p6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.79240269654, + "y": 6117.851279439949, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 146717508, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3901, + "versionNonce": 1213208842, + "isDeleted": false, + "id": "qxjoUaGmAAEvkdhOwiqQf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.457628950735, + "y": 6117.907124568616, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1947241212, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2877, + "versionNonce": 924931222, + "isDeleted": false, + "id": "PRpV1-U849EATpBN-XCY6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6123.64519659857, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2068755140, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2993, + "versionNonce": 1169975242, + "isDeleted": false, + "id": "iCzaafzSmvjsbrnKvm85i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6132.522224788095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 742247292, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3002, + "versionNonce": 1349931478, + "isDeleted": false, + "id": "C0hbAL-l7u-CN0sEeTNfe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6141.006057355701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 401848900, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2878, + "versionNonce": 1446043274, + "isDeleted": false, + "id": "p0hOvnbpzHghUTnydKq_z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.00534918141, + "y": 6122.852895448384, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1575943164, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2993, + "versionNonce": 146384662, + "isDeleted": false, + "id": "xd9UovGwM5ja-X-Ihx2Uh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.13434682094, + "y": 6131.67407850924, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2039206340, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3002, + "versionNonce": 912817482, + "isDeleted": false, + "id": "xCMqWDrtYfMFXgwNd5zCN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.150413219206, + "y": 6140.157911076848, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 321264764, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2924, + "versionNonce": 543183958, + "isDeleted": false, + "id": "Km2baSQl7-neDygPWwAW4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.13251036299, + "y": 6122.884465129092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 792000836, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3039, + "versionNonce": 1404978186, + "isDeleted": false, + "id": "DmsIX2cxtbu2MUZcSL-E8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.26150800252, + "y": 6131.705648189948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1168452860, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3048, + "versionNonce": 20928918, + "isDeleted": false, + "id": "OcBmqiynEaRvFGdw3MK9Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.277574400785, + "y": 6140.1894807575545, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 877473988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4337, + "versionNonce": 942486218, + "isDeleted": false, + "id": "EdAY3WKef5kosG2jI83eK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.55630942614, + "y": 6158.837698338549, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 1726885244, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3015, + "versionNonce": 311146198, + "isDeleted": false, + "id": "6ESrC-t-GesFM98Fq4wSd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1752332356, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3175, + "versionNonce": 1984973194, + "isDeleted": false, + "id": "23k3oBSHlIy8mzl6pHyrz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8256.278989470753, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1749229052, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 215641110, + "isDeleted": false, + "id": "EJ_csQZuIW0tzc0YBgWH5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8435.015869403389, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 126013380, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3135, + "versionNonce": 358778954, + "isDeleted": false, + "id": "QKCExuEMOgIcGDSyf7Rfm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8070.732001112918, + "y": 6159.985282702773, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 1118174844, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4697, + "versionNonce": 1310751062, + "isDeleted": false, + "id": "6G9GZJboiPdWQcM5AXaBc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8618.787942548099, + "y": 5885.393575219705, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 727060220, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3646, + "versionNonce": 2101276426, + "isDeleted": false, + "id": "LTGeVFxytyC4lxJ5xaEro", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8634.240556138522, + "y": 5922.207590441869, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 1746104004, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3109, + "versionNonce": 766697110, + "isDeleted": false, + "id": "vfvZe_Pmz9_w0nqstGOIG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.03961344305, + "y": 5925.8356835930335, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1748160380, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3920, + "versionNonce": 1650490826, + "isDeleted": false, + "id": "YZuTg-jZyuVrdIMmEyFPd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8737.471028384896, + "y": 5921.250557435304, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 79754820, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4775, + "versionNonce": 1346804694, + "isDeleted": false, + "id": "nD13jZZFVl2BdfitZcOkx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8628.624589890327, + "y": 5949.830500667364, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1554219004, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2944, + "versionNonce": 836908170, + "isDeleted": false, + "id": "YRtRTdTfny4XKdWgfq7ne", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8670.860989006445, + "y": 5952.254797644455, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1364299204, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3048, + "versionNonce": 2079371542, + "isDeleted": false, + "id": "2xZBgll2tHrYmN7-YTsKf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.588465323692, + "y": 5951.387402952223, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1353326716, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 2105480010, + "isDeleted": false, + "id": "xpaC_W4PkdkvQ859b83rX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.955688875167, + "y": 5926.1306851918325, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 2128819524, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3195, + "versionNonce": 1814437462, + "isDeleted": false, + "id": "JHflMnctSg3CAcVVutW1Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8674.796814031948, + "y": 5980.34060580714, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1007202556, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3311, + "versionNonce": 1737628170, + "isDeleted": false, + "id": "FoMpoWNyhe94ptoGcEzYM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8674.995920540847, + "y": 5989.902646613204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1792273604, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3320, + "versionNonce": 633070486, + "isDeleted": false, + "id": "Uc1QKKXk0paZ-WMurpdct", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.013226733025, + "y": 5999.041150115872, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1312895356, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3282, + "versionNonce": 253118666, + "isDeleted": false, + "id": "iTOLyxLb4uUK5pzQNTypj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.215991626412, + "y": 5979.427010721629, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 381793348, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3398, + "versionNonce": 1256653014, + "isDeleted": false, + "id": "1h-WByntj_P_RgnMNXVac", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.41509813531, + "y": 5988.989051527691, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1989517820, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3407, + "versionNonce": 2074517386, + "isDeleted": false, + "id": "HbwfSZuNkkNY4GHKCcjwb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.432404327488, + "y": 5998.12755503036, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 545950660, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4418, + "versionNonce": 1866233366, + "isDeleted": false, + "id": "Cx5P4hvhO7uDtqk3CJntU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8628.933223195787, + "y": 5972.537114799865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 1812464252, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3096, + "versionNonce": 159260234, + "isDeleted": false, + "id": "ak64gVj6ZmRIswCx0XiLo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8657.987933598406, + "y": 5973.137172314857, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 978088772, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3191, + "versionNonce": 1806779222, + "isDeleted": false, + "id": "phAoR5SUrinGPf18YCFjr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8741.200901275914, + "y": 5972.86961669861, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 895111932, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4313, + "versionNonce": 1433912586, + "isDeleted": false, + "id": "bRykkPcQs5bjuQxZmMcHM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.652681310077, + "y": 6014.286865403674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 577071812, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3255, + "versionNonce": 848980118, + "isDeleted": false, + "id": "s53ECfHbDAdJ3a0LUOAjI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8634.420340330222, + "y": 6015.419874216635, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 823038844, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3363, + "versionNonce": 688821194, + "isDeleted": false, + "id": "KCL6Bnmq1utxXOEQnquGe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.744535451051, + "y": 6014.916397962732, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 460550724, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3175, + "versionNonce": 598533590, + "isDeleted": false, + "id": "gCge3TBZE4ByhNj1bSaZZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.049882490925, + "y": 5891.375511514298, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 493274108, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2988, + "versionNonce": 1717406346, + "isDeleted": false, + "id": "U-rhe64emYO9ah81j5ioy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8151.643151635286, + "y": 6479.877389517542, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 890332228, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2734, + "versionNonce": 1610464022, + "isDeleted": false, + "id": "iB73ZHL8LoJfjEQfHOWEn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8332.539613145269, + "y": 6480.519830360428, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 1784214012, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2907, + "versionNonce": 1948232010, + "isDeleted": false, + "id": "yO2enWkKCNJcuh9oYm6kO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8425.873533329981, + "y": 6478.902658098979, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 962870212, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 503441494, + "isDeleted": false, + "id": "Iu6C492xeLdmCd6Yxzwch", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8437.188482010944, + "y": 6484.530721237139, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 719409788, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3297, + "versionNonce": 699396106, + "isDeleted": false, + "id": "sXadieokQNE1PW7FmvWaI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.281506697273, + "y": 6699.030365324497, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1819288388, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3474, + "versionNonce": 2106486166, + "isDeleted": false, + "id": "qPgqr23dxcPSBGfy4bwlO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.51371522788, + "y": 6711.123144057759, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1820959484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3658, + "versionNonce": 990469834, + "isDeleted": false, + "id": "3eWQmkUFUc0-WnLxHGhYW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.462038115751, + "y": 6723.216267816015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 882055876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3059, + "versionNonce": 1540901590, + "isDeleted": false, + "id": "3L0iHLMxJAmmc7T0h-TqG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.119423343502, + "y": 6507.92607837829, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1708385148, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1826, + "versionNonce": 617018762, + "isDeleted": false, + "id": "A26QnHxe-ynY0HF3BTYBM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.235902272107, + "y": 6508.806366479368, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 2087395908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2193, + "versionNonce": 661946390, + "isDeleted": false, + "id": "22TlvAepiVAHk_qIiDd52", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.9646435448485, + "y": 6509.450255277099, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 755110908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2324, + "versionNonce": 404993098, + "isDeleted": false, + "id": "rQLV6lbwIDs5n2eagRs0w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.230941447891, + "y": 6554.554237994302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 718682564, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2440, + "versionNonce": 878185814, + "isDeleted": false, + "id": "SXyS4EoClOnSka5rbYGRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.415761592198, + "y": 6563.430179677074, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1075197052, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2449, + "versionNonce": 1727699722, + "isDeleted": false, + "id": "_ifsyt_Qt17AM9UP23rfK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.43182602401, + "y": 6571.912973863235, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 452092228, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3169, + "versionNonce": 265810582, + "isDeleted": false, + "id": "bHqD6-2iMVoO8T-owHOeI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.230743246848, + "y": 6528.682437206882, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 215106812, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1979, + "versionNonce": 1875290570, + "isDeleted": false, + "id": "A97TEs2k8fYY4ZMznbpW9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.444390814755, + "y": 6528.706264915691, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 337483972, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1420373974, + "isDeleted": false, + "id": "8vBIDFo9StKuKj597vG3Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8110.173132087501, + "y": 6530.12252130358, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 2025342332, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3950, + "versionNonce": 161669258, + "isDeleted": false, + "id": "RuVEhqXNviy-R-7ZIzfNb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.297504779726, + "y": 6549.618325549211, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 1106632772, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2782, + "versionNonce": 2128659734, + "isDeleted": false, + "id": "907W7vqRh631fzzLCY4CU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.56460265453, + "y": 6549.720152848624, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1762276860, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3161, + "versionNonce": 1883914058, + "isDeleted": false, + "id": "HnhUpMuQBF-M0ZCgxj3su", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.649218275827, + "y": 6551.182478210854, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 744044484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3691, + "versionNonce": 1072935510, + "isDeleted": false, + "id": "ifi4UaQzOsOjfBUoEdThH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.96746462028, + "y": 6590.560969504908, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 1254758012, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2604, + "versionNonce": 806864394, + "isDeleted": false, + "id": "5p8AgpB9PvlacO3SuVonM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.378919775347, + "y": 6590.643912385274, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 795189060, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2967, + "versionNonce": 1387722646, + "isDeleted": false, + "id": "xSzP0PVPsnffhdg0CPC3v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8092.072142807625, + "y": 6591.970151664589, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 448390908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3803, + "versionNonce": 302413002, + "isDeleted": false, + "id": "tLb-sbCXiuNHOfLZapN7d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.329196273378, + "y": 6610.890582926315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 1937315524, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2708, + "versionNonce": 1331664086, + "isDeleted": false, + "id": "IRHmj09ifo3Z7th-jFe-S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.142196798675, + "y": 6610.9769492170835, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1834723196, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 3058, + "versionNonce": 129059722, + "isDeleted": false, + "id": "7u4O_-yrb2RMJGBAm61aC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8091.256478062605, + "y": 6612.58611195314, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 1697750596, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 4018, + "versionNonce": 2139261462, + "isDeleted": false, + "id": "g4xgf4dCX5O7rDsu9joAe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.494543412668, + "y": 6632.5124484117005, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 1995528188, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4882, + "versionNonce": 391334474, + "isDeleted": false, + "id": "jQ7QXvYwGMAiTJpX8d0B6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.8580177819895, + "y": 6652.027192850155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 762131908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3679, + "versionNonce": 840226646, + "isDeleted": false, + "id": "_nBRg6I0GkQ8PG9vfSL2F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.536081064198, + "y": 6651.8678890833235, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 326957180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2700, + "versionNonce": 1204252938, + "isDeleted": false, + "id": "RmRKSh2WoYXegIKG-8Bvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.204882503192, + "y": 6656.680575661949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 692706628, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2816, + "versionNonce": 258702486, + "isDeleted": false, + "id": "0ewci9XAfX1aEKa5OfILl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.389702647499, + "y": 6665.556517344719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1321240828, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2825, + "versionNonce": 210288586, + "isDeleted": false, + "id": "xCfixMQ05d4jZLnyu3680", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.405767079308, + "y": 6674.03931153088, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1646630084, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4120, + "versionNonce": 1832614358, + "isDeleted": false, + "id": "H9cGUA_ArQ5PO5utPakP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.061709705198, + "y": 6692.280771698099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1816004988, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2980, + "versionNonce": 833762954, + "isDeleted": false, + "id": "MDF7O9yYDzjoGmvt8S9jR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.352860830648, + "y": 6692.527881381409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 94264388, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3322, + "versionNonce": 580505366, + "isDeleted": false, + "id": "O12kqrws0NvQBq74gMuYN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8084.316576045581, + "y": 6694.096489332234, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 1865906684, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4485, + "versionNonce": 1207883082, + "isDeleted": false, + "id": "l0DuARsinPaOCpgdlKDjf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8145.260590281065, + "y": 6755.560172638159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1569862596, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3235, + "versionNonce": 1543208022, + "isDeleted": false, + "id": "rwbIyE79EMs_nOPn3Z-ym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8427.987384231263, + "y": 6755.38123796236, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 581884540, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3546, + "versionNonce": 281648138, + "isDeleted": false, + "id": "6fmUU_DnF4X0gCQlDxKVf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8064.048388134488, + "y": 6756.522050652551, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 1209998148, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4494, + "versionNonce": 1865777558, + "isDeleted": false, + "id": "RMX3f4-R2op9FLLKvsQwX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.508960125811, + "y": 6776.2797134469565, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 560343804, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3381, + "versionNonce": 1779272394, + "isDeleted": false, + "id": "tshzLSz9nGrsGYoXTeeS5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.261056657018, + "y": 6776.054286661247, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 799216324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5309, + "versionNonce": 796712662, + "isDeleted": false, + "id": "Au4o2ImDqaVjjkcVjuXY8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.861077007259, + "y": 6796.990615828408, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1574923132, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4204, + "versionNonce": 979739018, + "isDeleted": false, + "id": "K6mCs-FEeg0FvF3o-p7zN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.444535206861, + "y": 6797.0144435372185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 45881924, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3225, + "versionNonce": 1097241622, + "isDeleted": false, + "id": "fODbegb0OJbn1h81zxZF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.050069935776, + "y": 6801.991174894478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 710712316, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3340, + "versionNonce": 1561124938, + "isDeleted": false, + "id": "9zFSdECLGb7AC7R_foKPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.1790517866, + "y": 6810.811278283765, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 742928836, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3349, + "versionNonce": 1860673878, + "isDeleted": false, + "id": "EjsO4sSVP3r0jqZkAn6FQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.195116218416, + "y": 6819.294072469926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1088404604, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4638, + "versionNonce": 232670986, + "isDeleted": false, + "id": "_xcmOsR3UTz6SSF3ERfts", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.514697166509, + "y": 6837.940007596268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 191191364, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2057, + "versionNonce": 2069169814, + "isDeleted": false, + "id": "PghpiMCAcDLqXO0B2U_t-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8211.441688006686, + "y": 6484.401028529021, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 1261096188, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3375, + "versionNonce": 1431623114, + "isDeleted": false, + "id": "GrYRhPI7PW9INAknGmE0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.673859691811, + "y": 6699.008865596896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1802604740, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3552, + "versionNonce": 2003026902, + "isDeleted": false, + "id": "LsoxXD1QFuk49rtvo5CFJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.906068222419, + "y": 6711.101644330156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1790954876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3736, + "versionNonce": 1955302538, + "isDeleted": false, + "id": "NTeDSI0nfhliKEBTiEHUg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.85439111029, + "y": 6723.194768088415, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 2081085508, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2215, + "versionNonce": 354998550, + "isDeleted": false, + "id": "d4Rk65_l6fSGbuLXx5xAa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.653644538146, + "y": 6507.725030948301, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1088470524, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1362979658, + "isDeleted": false, + "id": "jV4GUqwiiHdD2MPA1I4-t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.120036703222, + "y": 6554.485237049745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1225732036, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2535, + "versionNonce": 2082031190, + "isDeleted": false, + "id": "klUU8rnJxzVpQpfijP9g8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.304856847528, + "y": 6563.361178732515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1989123708, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 1640329738, + "isDeleted": false, + "id": "b-KMzZSObvC77q-8JdF2Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.32092127934, + "y": 6571.843972918676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 849123140, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2367, + "versionNonce": 487197590, + "isDeleted": false, + "id": "g7iSpjygYya3TR5NqBZKI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.862133080798, + "y": 6528.612991494372, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1150185212, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3188, + "versionNonce": 421437642, + "isDeleted": false, + "id": "ALYfggJ6txNrDg91Q6aT5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.982344920569, + "y": 6549.626879427307, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1695616708, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 3012, + "versionNonce": 103819478, + "isDeleted": false, + "id": "5mYBBcI__-b2kFBzS8AZS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.79666204139, + "y": 6590.485455080852, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2069835644, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3101, + "versionNonce": 1390671754, + "isDeleted": false, + "id": "H9EJzTYZWfMgkVwgcHFlA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.625122947818, + "y": 6610.948859678871, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1359648324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3247, + "versionNonce": 924884502, + "isDeleted": false, + "id": "wYO0QXh2-QEgVwGsUx6dN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.8336114904705, + "y": 6631.969101169812, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 188997628, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 4076, + "versionNonce": 1062237770, + "isDeleted": false, + "id": "F4PRb7TNAXs2r0P3mcz0P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.953823330241, + "y": 6651.837882372078, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 593964484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2795, + "versionNonce": 1959816022, + "isDeleted": false, + "id": "jclGTyFX3aikuZpd5IBuU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.093977758523, + "y": 6656.611574717388, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 205422716, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2911, + "versionNonce": 1329536266, + "isDeleted": false, + "id": "TJCB3bYHOgKOBi1lAvkbw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.278797902825, + "y": 6665.487516400159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1027921220, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2920, + "versionNonce": 496275606, + "isDeleted": false, + "id": "nW65yW034rk27h7hiLLKt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.294862334642, + "y": 6673.970310586321, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1175523580, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3379, + "versionNonce": 539683786, + "isDeleted": false, + "id": "GCuql9eRu2_DMNU3hbPba", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.770603096687, + "y": 6692.434607960093, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 738299076, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3637, + "versionNonce": 2099383766, + "isDeleted": false, + "id": "3WdX3wXvPs-6r0fDOnKxv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.470310380406, + "y": 6755.464149825575, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 943559036, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3785, + "versionNonce": 1747903114, + "isDeleted": false, + "id": "VG0-YBxg96wuwapnmPemi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.613615039951, + "y": 6775.96101323993, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 557536324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4604, + "versionNonce": 546169622, + "isDeleted": false, + "id": "PLKSYJV41j661JMIXrYKY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.735424419279, + "y": 6796.779299311496, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 570819068, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3320, + "versionNonce": 1644560714, + "isDeleted": false, + "id": "btgYFIdbjUROSJpADxkw4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8230.93916519111, + "y": 6801.922173949917, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1792027588, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3435, + "versionNonce": 709693526, + "isDeleted": false, + "id": "1yzzdMRuHlSvN0ZIhUXu1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.068147041933, + "y": 6810.742277339206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 174875260, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3444, + "versionNonce": 957040650, + "isDeleted": false, + "id": "Mi0XGD7uNc0-xjrqL1cBu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.084211473746, + "y": 6819.225071525367, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1792938820, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3626, + "versionNonce": 640980374, + "isDeleted": false, + "id": "c58ddDlxotM6mrvBMuc1a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8156.221951637548, + "y": 6837.720929092737, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1211282172, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3199, + "versionNonce": 1966716618, + "isDeleted": false, + "id": "25vIXtUYoBgX-GvoAnUZ4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.93944062342, + "y": 6837.823548103674, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 264440516, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3437, + "versionNonce": 1568240342, + "isDeleted": false, + "id": "piLdDoWuUVBKPp4_DkBX9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8064.700158975462, + "y": 6839.0874515015275, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 165344124, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2314, + "versionNonce": 1730956682, + "isDeleted": false, + "id": "DQpjL4x4rBlNhY75HICo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.96357520622, + "y": 6484.0741432304385, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 1276973636, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3190, + "versionNonce": 716220438, + "isDeleted": false, + "id": "OvsClU3i7v6vuyuuUXgqw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6698.955793797342, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1571234812, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3369, + "versionNonce": 337513546, + "isDeleted": false, + "id": "d8451jVpQUAE9SdREMreR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6711.0485725306025, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 248129988, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3553, + "versionNonce": 1305425238, + "isDeleted": false, + "id": "HwpG1dgmOSYxUvqKkXK_I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6723.14169628886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 966345852, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2206, + "versionNonce": 568980234, + "isDeleted": false, + "id": "3svV0XoRwjKCbmfE-TG_K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6507.907367440468, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 988303684, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2480, + "versionNonce": 1076501142, + "isDeleted": false, + "id": "ne_joCkbQpmVgc1b7t6Kb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6555.280228754775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 57890044, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2612, + "versionNonce": 1124794826, + "isDeleted": false, + "id": "SK5vfbOzbl6dvsse-TJZ5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6564.156170437547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 534087876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 141973462, + "isDeleted": false, + "id": "EmqIY3ALYVRy1JEtuUZ1D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6572.638964623709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 414668156, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2355, + "versionNonce": 580663434, + "isDeleted": false, + "id": "ah_2sI5FJIdW62Ud3iD8p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6528.6157790231755, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1898958916, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3174, + "versionNonce": 248048918, + "isDeleted": false, + "id": "j6zTCtxb656kYoKuy2sbm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6549.629666956109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1453803004, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2990, + "versionNonce": 1347983178, + "isDeleted": false, + "id": "Fsof2oDYOseTuSswATF1_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6590.42305872655, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1054156740, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3095, + "versionNonce": 1888934486, + "isDeleted": false, + "id": "LA_W2-in3gE7zcNeKa-rx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6610.997464725999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 574957180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3235, + "versionNonce": 748363274, + "isDeleted": false, + "id": "N9rWUoJ7OUn-1zZcEMB9S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6631.971888698614, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1826852676, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 4067, + "versionNonce": 1421156246, + "isDeleted": false, + "id": "NTurjweg3zgjYauWJM5VL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6651.777403190808, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1884485372, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2851, + "versionNonce": 1415498954, + "isDeleted": false, + "id": "hpHyX_LSFTkfv0PxjGGqe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6657.40656642242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 733546180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2971, + "versionNonce": 1062780118, + "isDeleted": false, + "id": "o4TY4rY3eaYjQunrxXBRu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6666.282508105192, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1297266556, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2980, + "versionNonce": 222208906, + "isDeleted": false, + "id": "sPFCAGhzM2tORTL4D_ndu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6674.765302291353, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1878232644, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3365, + "versionNonce": 1712763414, + "isDeleted": false, + "id": "hvmJFpm7YcIIvItJmRwQu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6692.437395488896, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1703307260, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3624, + "versionNonce": 829792842, + "isDeleted": false, + "id": "1uUmrrgfFRh0-fR9RfUMd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.35701560709, + "y": 6755.355935952952, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1785800132, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3765, + "versionNonce": 65273686, + "isDeleted": false, + "id": "ba7A_kMuZwnd4AHXGPC4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6776.028984651837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 217057404, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4589, + "versionNonce": 467585290, + "isDeleted": false, + "id": "DJwoK4w58jpqZidahlh-k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6796.8587737616, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 5229892, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3378, + "versionNonce": 756393110, + "isDeleted": false, + "id": "p2CplEbSL_IDSJitVDvSO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6802.717165654949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1196529916, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3494, + "versionNonce": 334829514, + "isDeleted": false, + "id": "ijkfn8RuHNDSBj_jbuRST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6811.593107337721, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1122862276, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3503, + "versionNonce": 593535446, + "isDeleted": false, + "id": "L-wAbMC5SsyPvCx_Tr9B1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6820.075901523882, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1345132924, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3518, + "versionNonce": 970165898, + "isDeleted": false, + "id": "faCN2184JPv5kY4DsJZwR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6837.788900504644, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1743277124, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2767, + "versionNonce": 702150422, + "isDeleted": false, + "id": "jhtx131CpvoMsw1u57dUd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8429.71140628462, + "y": 6632.187956280455, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 583305724, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 4742, + "versionNonce": 1916087626, + "isDeleted": false, + "id": "EIceUFcedivv316Pf7-On", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8620.75415075364, + "y": 6574.202156464479, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 304.57312989326493, + "height": 170.69067870387278, + "seed": 1950369045, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4789, + "versionNonce": 1492558934, + "isDeleted": false, + "id": "qo2gdV30XDiIoZ4TReXA1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8619.520378568464, + "y": 6571.201115006993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 804833092, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3738, + "versionNonce": 1383396362, + "isDeleted": false, + "id": "tTTATkL0Url2kbTlsMaTe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8634.972992158888, + "y": 6608.015130229157, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 2118991612, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1921755542, + "isDeleted": false, + "id": "IHLb1b240GILNvNCTB6Zt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.77204946342, + "y": 6611.643223380322, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1197948612, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4012, + "versionNonce": 210625226, + "isDeleted": false, + "id": "EuTtXZ1tgiA_568zQyDUK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8738.203464405262, + "y": 6607.058097222592, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 885260156, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4867, + "versionNonce": 902694614, + "isDeleted": false, + "id": "XfsHEp-q-6LT5b29b3X-u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.357025910693, + "y": 6635.638040454652, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1763362372, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3036, + "versionNonce": 1528494474, + "isDeleted": false, + "id": "d36VR8Wtml61O61ZXBgAr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8671.593425026811, + "y": 6638.062337431741, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1603186684, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3140, + "versionNonce": 861060118, + "isDeleted": false, + "id": "Y40urMPAw71F1wVGjXlqD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8740.320901344057, + "y": 6637.194942739509, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 703684036, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2997, + "versionNonce": 1834432586, + "isDeleted": false, + "id": "0v1o__GIj5GLKN96UPihK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8808.688124895532, + "y": 6611.938224979121, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 783241340, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3287, + "versionNonce": 554617174, + "isDeleted": false, + "id": "xKv_QkPhpcj5hWksUwSp3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.529250052314, + "y": 6666.148145594428, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1393100100, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3403, + "versionNonce": 1394450186, + "isDeleted": false, + "id": "-270a4ZrAcxZoIef-oIPo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.728356561216, + "y": 6675.710186400492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 31973628, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3412, + "versionNonce": 777465494, + "isDeleted": false, + "id": "myyr6yJurixURFNyW6mhl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.74566275339, + "y": 6684.84868990316, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1505737924, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3374, + "versionNonce": 1760112074, + "isDeleted": false, + "id": "BLNzHlH5Df9llXYfA_Nc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.948427646777, + "y": 6665.234550508915, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1891262844, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3490, + "versionNonce": 1474358230, + "isDeleted": false, + "id": "hRl2eh58iD4R4BtDhLdxx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8823.14753415568, + "y": 6674.796591314979, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1471382596, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3499, + "versionNonce": 1138025610, + "isDeleted": false, + "id": "HGEHaAZiWp43VHMeL1hRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8823.164840347854, + "y": 6683.935094817648, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1382601212, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4510, + "versionNonce": 1002504470, + "isDeleted": false, + "id": "z05mzTYJd1ASOMKb2JAre", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.665659216153, + "y": 6658.344654587153, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 46291908, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3188, + "versionNonce": 496747338, + "isDeleted": false, + "id": "JmE-iAJ_kglcvtJWD5dk_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8658.720369618772, + "y": 6658.944712102145, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1173697148, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3283, + "versionNonce": 1835822678, + "isDeleted": false, + "id": "3CLKh8J2BJudjOm2b3uMC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8741.93333729628, + "y": 6658.677156485898, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 621429572, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4405, + "versionNonce": 1083755018, + "isDeleted": false, + "id": "aaqUwFVB7_rDoHLQi5qjF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8630.385117330443, + "y": 6700.094405190962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 975274748, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3347, + "versionNonce": 1236808598, + "isDeleted": false, + "id": "FLYgVWMlfL5O-gEMO13Fg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8635.152776350587, + "y": 6701.2274140039235, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 350829252, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3455, + "versionNonce": 1942419658, + "isDeleted": false, + "id": "MY6nDho_VGOWw1RI40xT3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8740.47697147142, + "y": 6700.72393775002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1970258812, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3267, + "versionNonce": 1255755990, + "isDeleted": false, + "id": "vuFTqhpkMLvwzswj_Ws9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.782318511294, + "y": 6577.183051301586, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 754795076, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2386, + "versionNonce": 1723944842, + "isDeleted": false, + "id": "eyWQLirkWgBeWCOfQnogf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8146.6859553354625, + "y": 7346.249436011928, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 341736444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1968, + "versionNonce": 1550108182, + "isDeleted": false, + "id": "pusmS4Ljf3rv3o6ChNDqf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8156.11107098651, + "y": 7349.743089731238, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 1137988036, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2761, + "versionNonce": 499306058, + "isDeleted": false, + "id": "ng4GoKh69PcFNOWusIjq2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8424.01016984979, + "y": 7344.536319716438, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 1336253564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2700, + "versionNonce": 793744214, + "isDeleted": false, + "id": "MEKkSaqZkqGGhUGTaHVwh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8243.760212014666, + "y": 7345.548610162453, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 476936516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2909, + "versionNonce": 1571190026, + "isDeleted": false, + "id": "fpGp_XFjZxtG6Qsqy0C2y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.221570256035, + "y": 7373.5632927615525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 1177857276, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1850, + "versionNonce": 233748630, + "isDeleted": false, + "id": "tUlfkLfGgu6bxGotf6I_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7373.579231373574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1718988996, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1916, + "versionNonce": 401032138, + "isDeleted": false, + "id": "Va-OsOBHAswqLfC-MMWrX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.771195843197, + "y": 7373.579231373574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 697150844, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1675, + "versionNonce": 804730326, + "isDeleted": false, + "id": "WbeN7ETZ9pPRKwX94CLSD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.372827970226, + "y": 7374.44368861897, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1099626564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1770, + "versionNonce": 1453341322, + "isDeleted": false, + "id": "KL8SCNVpDcWYVbikJrTUM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8303.566068343298, + "y": 7350.072802913973, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 720543228, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1897, + "versionNonce": 243141398, + "isDeleted": false, + "id": "tzvLZjZQnxlpRpELVRxb5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8435.326503597105, + "y": 7350.165071787539, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 696995780, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2042, + "versionNonce": 680286538, + "isDeleted": false, + "id": "zuPRjxPY0E9b--V67WQj0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.062609560282, + "y": 7375.087656235323, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 56983164, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2130, + "versionNonce": 939014230, + "isDeleted": false, + "id": "V7SmIzKjKLzHwyyeX7ICq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7420.957891614406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1855240004, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2262, + "versionNonce": 218537994, + "isDeleted": false, + "id": "JlIsJsLpfs7P3ba8BAIvr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7429.834919803933, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2074627836, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2271, + "versionNonce": 607829398, + "isDeleted": false, + "id": "fCJNcsMHfcWbclsY1Y6yE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7438.31875237154, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 755314372, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2128, + "versionNonce": 1611271882, + "isDeleted": false, + "id": "b3Ge1YFCwB9yrKz-FDyQI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.246825872557, + "y": 7420.165590464222, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1950158716, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2244, + "versionNonce": 142252758, + "isDeleted": false, + "id": "WRa6ZxuguE8HP24yP7CP5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.431668640751, + "y": 7429.042618653745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1165669956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2253, + "versionNonce": 1177658762, + "isDeleted": false, + "id": "Il3SrWQwkzSbt4oMOfOeb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.447735039015, + "y": 7437.526451221352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1835384828, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2174, + "versionNonce": 726454294, + "isDeleted": false, + "id": "rxjHpaESbzq_zY3oiOrHb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.373987054132, + "y": 7420.19716014493, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1423134148, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2290, + "versionNonce": 414737482, + "isDeleted": false, + "id": "eMNiRyUxWXXlxjUK6raRx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.55882982233, + "y": 7429.0741883344535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 254042236, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2299, + "versionNonce": 950426966, + "isDeleted": false, + "id": "smfY8k4tMAxHnJtwSJ7tO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.574896220598, + "y": 7437.55802090206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 741143876, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2844, + "versionNonce": 1366903562, + "isDeleted": false, + "id": "QGy2MOBwSQYKpyZuYcyiH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7564.651044027091, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 825946364, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3019, + "versionNonce": 366756502, + "isDeleted": false, + "id": "dZ88qHjfn7Uw7Zm2FCCAQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.332903786082, + "y": 7394.322192382414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 1223011524, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2001, + "versionNonce": 1995397578, + "isDeleted": false, + "id": "_J5jVf8txcgcOO5ntxOYr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7394.290177879314, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1663791484, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2064, + "versionNonce": 899907542, + "isDeleted": false, + "id": "KNmAbPFRbdGp-vyKGjuKe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.979709906998, + "y": 7394.290177879314, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1285256260, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1828, + "versionNonce": 137728138, + "isDeleted": false, + "id": "uOgzgMKQLos69DzNUURPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.58134203402, + "y": 7394.346023007981, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1949819388, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 2188, + "versionNonce": 1813058838, + "isDeleted": false, + "id": "UQdyNToBv3Xou0tapjPXp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.271123624079, + "y": 7395.76245276025, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1965837252, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3796, + "versionNonce": 1762062154, + "isDeleted": false, + "id": "YsrvFR5baUk_Xxyib_rRu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.399673491265, + "y": 7415.260643493276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 2070037116, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2820, + "versionNonce": 1117389398, + "isDeleted": false, + "id": "Bu_0ggY_S9Tge8XF1Fp0Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7415.306638128736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 347484996, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2888, + "versionNonce": 1304327690, + "isDeleted": false, + "id": "V78XIuG54iSbnDyvYzuAh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.099936461935, + "y": 7415.306638128736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1600951036, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2631, + "versionNonce": 1276331926, + "isDeleted": false, + "id": "54Np45AE5uTDPoThaRwS_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.701568588964, + "y": 7415.3624832574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 160901828, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 660022474, + "isDeleted": false, + "id": "vPa80CNvOv6wgyfz9rhfL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8107.747145679954, + "y": 7416.8249876233285, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1591268220, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3541, + "versionNonce": 2024924374, + "isDeleted": false, + "id": "QqTUoBRIdTsdL9coBOmgT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.069592931501, + "y": 7456.208299250616, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 913125956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2637, + "versionNonce": 258734986, + "isDeleted": false, + "id": "nzG3bYM28gIh8xtHz64v_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7456.235407155379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 401146876, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2705, + "versionNonce": 1779096086, + "isDeleted": false, + "id": "BTLpD34QjYtoPSWczR4t3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.914230853257, + "y": 7456.235407155379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2048281028, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2453, + "versionNonce": 876083786, + "isDeleted": false, + "id": "ajs3bWqKHWc52NX73FbyW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.515862980283, + "y": 7456.291252284046, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 278865020, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2816, + "versionNonce": 1192437590, + "isDeleted": false, + "id": "r21v1jglDJ4RWw417dL8e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8090.167918596537, + "y": 7457.617653908718, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 665874756, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3652, + "versionNonce": 1150689546, + "isDeleted": false, + "id": "UFAt8q8kr0_8Srg_Qw8O5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.43136886428, + "y": 7476.617383435562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 1052587260, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2739, + "versionNonce": 270519446, + "isDeleted": false, + "id": "M11cAoGIT7-czsRrZLigW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7476.713107032069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2123999428, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2806, + "versionNonce": 1543598026, + "isDeleted": false, + "id": "2Ri6lo1tUkBrjGQhmS9hV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.742670761534, + "y": 7476.713107032069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 264582524, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2555, + "versionNonce": 1927662038, + "isDeleted": false, + "id": "0Bi8S_vMo5TF6Kyu7E8oP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.34430288856, + "y": 7476.768952160736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 577761348, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2906, + "versionNonce": 1855252106, + "isDeleted": false, + "id": "Zw_-yf_ZdvJk4yog3fBs0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8089.352154005748, + "y": 7478.313120012613, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 1895376380, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3866, + "versionNonce": 511319830, + "isDeleted": false, + "id": "jfAVVRU9ZK3PGJWFuzebv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.711115323491, + "y": 7498.241895660151, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 319899588, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2883, + "versionNonce": 889947466, + "isDeleted": false, + "id": "hAAzjxYUHXrDH8L09QaVR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7497.735921617238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1465583228, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2954, + "versionNonce": 391236694, + "isDeleted": false, + "id": "Gt4AFPkDfGx9LeNIZBMdg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.951184825331, + "y": 7497.735921617238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 614182724, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4723, + "versionNonce": 415255562, + "isDeleted": false, + "id": "Cpd5KzWYjFxnUSdgjtgW2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.960255106096, + "y": 7519.047437902606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 1202509564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3711, + "versionNonce": 188862870, + "isDeleted": false, + "id": "hzmUC0_V0DfzCi8IhyTpl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7518.832269506683, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2003642052, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3778, + "versionNonce": 531512010, + "isDeleted": false, + "id": "WoJxNwThuryhSZLhUOGIU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.071411380271, + "y": 7518.832269506683, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1584437116, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3523, + "versionNonce": 629092054, + "isDeleted": false, + "id": "YrMdFf4ficdmk1pS9eMTy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.673043507297, + "y": 7518.88811463535, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1881386564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2496, + "versionNonce": 1483755914, + "isDeleted": false, + "id": "cHjk1qQTD6V6YwGbeBTlh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7524.462121805897, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1474840572, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2616, + "versionNonce": 1654580246, + "isDeleted": false, + "id": "Zh2GpaVPjmS9rOJ53F-Ch", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7533.3391499954205, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 798836164, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2625, + "versionNonce": 1178701898, + "isDeleted": false, + "id": "cAzonjakSb1GH47ELfWrs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7541.822982563027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 404088956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2499, + "versionNonce": 1687548246, + "isDeleted": false, + "id": "9zyI0wCHNBsveZW1Rxozd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.220763737969, + "y": 7523.669820655713, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 184020292, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2615, + "versionNonce": 1291646730, + "isDeleted": false, + "id": "sbmYpg9fPU7d_hSmWw_aV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.405606506167, + "y": 7532.546848845236, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 851147004, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2624, + "versionNonce": 1186551446, + "isDeleted": false, + "id": "vp9ZeymaOkcd_45kcxTEi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.421672904431, + "y": 7541.030681412843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 59876548, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2545, + "versionNonce": 488474058, + "isDeleted": false, + "id": "yptsoLQvdlhujEhAPvGXu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.347924919552, + "y": 7523.701390336418, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1935341948, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2661, + "versionNonce": 1908282326, + "isDeleted": false, + "id": "coRo4THkUXGSiikDQvW2A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.53276768775, + "y": 7532.578418525941, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1057516612, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2670, + "versionNonce": 532561034, + "isDeleted": false, + "id": "-c2T5uxn3Sy4Ykhap2DOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.54883408601, + "y": 7541.062251093547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1698064892, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3965, + "versionNonce": 1874405654, + "isDeleted": false, + "id": "thnI8Q-fNbpd1wfUNd2zy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.163849552984, + "y": 7559.305944203516, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 2134524868, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3009, + "versionNonce": 1654266698, + "isDeleted": false, + "id": "TPCjDTmriAO_W98JC9JS7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.683235490855, + "y": 7559.497239006935, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 1531955836, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 3079, + "versionNonce": 1075811926, + "isDeleted": false, + "id": "nnrOgIjKhiJdq3Tg40SFC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.888168718673, + "y": 7559.497239006935, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 440740676, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2824, + "versionNonce": 67904010, + "isDeleted": false, + "id": "6-aR8x_3e64tQX8K0Jj77", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.489800845702, + "y": 7559.553084135602, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 2020154108, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 3166, + "versionNonce": 734419862, + "isDeleted": false, + "id": "I7ji7fXd3wikuwLAzDBld", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8082.411402473179, + "y": 7561.121884100209, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 1921458884, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 3023, + "versionNonce": 521097418, + "isDeleted": false, + "id": "0940Kad3RPAD5L4-gGvQy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7576.745303041113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 923032444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3207, + "versionNonce": 417495254, + "isDeleted": false, + "id": "ZKEujwwWYvwJ1MmtG7hZh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7588.839907122373, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1855859268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3088, + "versionNonce": 926853002, + "isDeleted": false, + "id": "dWbwBWV6pLyeaLFMVaIiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.800471834173, + "y": 7564.706910193204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1902349308, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3265, + "versionNonce": 1594420758, + "isDeleted": false, + "id": "Zfd4-5KLBkvpWaUZcRph7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8322.032708789498, + "y": 7576.80116920723, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1902657988, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3449, + "versionNonce": 617948746, + "isDeleted": false, + "id": "VvHJoZGDtfb4b84rRU0Ye", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.981025351553, + "y": 7588.8957732884855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1770564732, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3151, + "versionNonce": 456047446, + "isDeleted": false, + "id": "SIlz3HEvAz4cFS7DjtL6K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.424436082918, + "y": 7564.690972842313, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1375955268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3328, + "versionNonce": 11390218, + "isDeleted": false, + "id": "liSDDdw78J3nmDpQYb4ME", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.65667303824, + "y": 7576.785231856339, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1362476284, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3512, + "versionNonce": 61399190, + "isDeleted": false, + "id": "M8HnbNsOlbROyg4oTB-BG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.604989600302, + "y": 7588.879835937599, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1405984964, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4335, + "versionNonce": 272866250, + "isDeleted": false, + "id": "uBjx41ruBNauavGJObspT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.439859093502, + "y": 7621.227699987078, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 1374469500, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3270, + "versionNonce": 1009540566, + "isDeleted": false, + "id": "JlB64R0v9REeNPNzQaLSZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7621.058090141448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 509929540, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3338, + "versionNonce": 833720970, + "isDeleted": false, + "id": "r8VMfI4bt7ic83NP6VuW-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.664821452774, + "y": 7621.058090141448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 351251964, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3083, + "versionNonce": 701379350, + "isDeleted": false, + "id": "ZnM2JB-lQvi_w-_k59ymj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.266453579796, + "y": 7621.113935270115, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 900153284, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3395, + "versionNonce": 1202893130, + "isDeleted": false, + "id": "DXhM3_3k8HpCbiXcD_i9o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8062.2177157362785, + "y": 7622.189695745256, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 1262521980, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4344, + "versionNonce": 1191403606, + "isDeleted": false, + "id": "H1NDxJDukTHqqjRXLDoEY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.688136930967, + "y": 7641.949777081242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 1907533636, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3414, + "versionNonce": 631371786, + "isDeleted": false, + "id": "xF7gYZaXCP1oHM2_V-5u-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7641.733669434588, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 899768060, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3491, + "versionNonce": 2007033238, + "isDeleted": false, + "id": "rgsmyACQ-NYgZFLgujAD7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.873335516571, + "y": 7641.733669434588, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1994727108, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3229, + "versionNonce": 2071619274, + "isDeleted": false, + "id": "6gpA-61VSGEjIxSbYW4XZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.474967643597, + "y": 7641.789514563255, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 747904892, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 5155, + "versionNonce": 1557906134, + "isDeleted": false, + "id": "9Eaw4gcysIO1ZZaE43eeP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.040174504844, + "y": 7662.663214690624, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 769435204, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4237, + "versionNonce": 1104608650, + "isDeleted": false, + "id": "YZn_gbCOWmPo7yz5QKKJQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7662.631200187524, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 677040124, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4310, + "versionNonce": 692647958, + "isDeleted": false, + "id": "k2yuj_u3AVjQfa_pHtYVm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.92996794434, + "y": 7662.631200187524, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 997670340, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 4052, + "versionNonce": 636664906, + "isDeleted": false, + "id": "3ovu2yMS_lB79F5PSF9LJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.595194198533, + "y": 7662.687045316191, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1224175740, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 3028, + "versionNonce": 1960674646, + "isDeleted": false, + "id": "nhitQKzr6FC_fbgyg0zWn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7668.425117346146, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2027087172, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1973986058, + "isDeleted": false, + "id": "Pu7A0iOqTj2m9i_1NfMP-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7677.302145535669, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1579942140, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3153, + "versionNonce": 284060310, + "isDeleted": false, + "id": "ZBLCh-GyiK_Qw6Io38BDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7685.785978103276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1800248516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3029, + "versionNonce": 192131530, + "isDeleted": false, + "id": "musZGaxV6ZvYKV7ezd0gF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.142914429212, + "y": 7667.632816195958, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1870299516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1546692566, + "isDeleted": false, + "id": "XW592hY2pY89GusqIU75q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.27191206874, + "y": 7676.453999256814, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1015374916, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3153, + "versionNonce": 980347018, + "isDeleted": false, + "id": "EA2zz9adx5T5pBmNmbZOS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.287978467008, + "y": 7684.937831824424, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1143271932, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3075, + "versionNonce": 381238550, + "isDeleted": false, + "id": "nDQ83b0Gf5ma04vBkORUL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.270075610788, + "y": 7667.6643858766665, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 844643268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3190, + "versionNonce": 978667338, + "isDeleted": false, + "id": "2jol4ntdHr4A0NW_b1G3W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.399073250323, + "y": 7676.485568937523, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1798132348, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3199, + "versionNonce": 905783894, + "isDeleted": false, + "id": "JGUSqJpJnk9YK-wdbUUit", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.415139648583, + "y": 7684.969401505129, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 652485444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4488, + "versionNonce": 327273994, + "isDeleted": false, + "id": "cYN493zc-2IKzMjTvtHr5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.69387467394, + "y": 7703.617619086123, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 1129685756, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3166, + "versionNonce": 953249686, + "isDeleted": false, + "id": "I5UQC6eXb4ETJvt_MV6BS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 8854212, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3326, + "versionNonce": 183467210, + "isDeleted": false, + "id": "L5LGZDfS0Ktf6DqvulprB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.416554718555, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 52421500, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 3047, + "versionNonce": 2070613206, + "isDeleted": false, + "id": "9JFHwZXHfSJmpknoIbyuZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8427.15343465119, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 702489156, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3286, + "versionNonce": 238637962, + "isDeleted": false, + "id": "BcBe4B6Cpkz6sfJLPeYDB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8062.869566360718, + "y": 7704.765203450349, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 1087247356, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4745, + "versionNonce": 530207306, + "isDeleted": false, + "id": "ZpLhNpS92lB0t_LVrZQMv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8604.160310147388, + "y": 7442.278034049657, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 1932035396, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3694, + "versionNonce": 2074234710, + "isDeleted": false, + "id": "OYb5oPNw0Oc0Hu5ec3oKg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8619.612923737812, + "y": 7479.092049271821, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 360734972, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3157, + "versionNonce": 1106082058, + "isDeleted": false, + "id": "V6euQ-CSVo59DCPiu09DD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8639.411981042344, + "y": 7482.720142422986, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1240415428, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3968, + "versionNonce": 948565142, + "isDeleted": false, + "id": "icu7xzANGPdRcnYFaDfpS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8722.843395984186, + "y": 7478.135016265256, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 2101535100, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4823, + "versionNonce": 1689110474, + "isDeleted": false, + "id": "cjDNDKbfk7nZ8y_qnwUfI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8613.996957489617, + "y": 7506.714959497316, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 368247876, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2992, + "versionNonce": 1540026838, + "isDeleted": false, + "id": "RaDlEETS9wxXSFnxpPFNt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8656.233356605735, + "y": 7509.139256474406, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 971067900, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3096, + "versionNonce": 1341537930, + "isDeleted": false, + "id": "KN5g13QkRxreCij8b4l3s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8724.960832922981, + "y": 7508.271861782174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1293016004, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2953, + "versionNonce": 8013590, + "isDeleted": false, + "id": "Qrog8vp-UMxEKMiWSywLu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8793.328056474456, + "y": 7483.015144021785, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 710783612, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3243, + "versionNonce": 276946250, + "isDeleted": false, + "id": "flH3d03MxteX9Rn49h-jo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.169181631238, + "y": 7537.225064637092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 2036974404, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3359, + "versionNonce": 386724950, + "isDeleted": false, + "id": "fdk1WhYizrIKJJYCcRS89", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.36828814014, + "y": 7546.787105443156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 2105148156, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3368, + "versionNonce": 1672193034, + "isDeleted": false, + "id": "iQiUT-U8ZZX8JGVD4McYC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.385594332314, + "y": 7555.925608945825, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 827898564, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3330, + "versionNonce": 962066838, + "isDeleted": false, + "id": "Mt0HtWMNRYEZS_J4bWpC6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.588359225701, + "y": 7536.31146955158, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 968377212, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3446, + "versionNonce": 594449098, + "isDeleted": false, + "id": "S8CMnpUeeyZ6XauAHHkwF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.787465734604, + "y": 7545.873510357644, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 259834436, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3455, + "versionNonce": 2123388630, + "isDeleted": false, + "id": "T9iwyHOHOb3M2dAY2pUSF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.804771926778, + "y": 7555.012013860312, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1163555836, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4466, + "versionNonce": 845523338, + "isDeleted": false, + "id": "StEESHST8sKYxSFrkKGdn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8614.305590795077, + "y": 7529.421573629817, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 716429764, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1330318358, + "isDeleted": false, + "id": "CKwKxu_-RTpMzWKNsfL_O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8643.360301197696, + "y": 7530.021631144809, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1851954300, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3239, + "versionNonce": 1741416522, + "isDeleted": false, + "id": "-IgqprAYjIywkZbv-mP90", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8726.573268875203, + "y": 7529.754075528563, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 236716356, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4361, + "versionNonce": 964499798, + "isDeleted": false, + "id": "y_lIhIr-drTf14pvjZxdq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8615.025048909367, + "y": 7571.171324233626, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 1922213116, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3303, + "versionNonce": 2071744266, + "isDeleted": false, + "id": "_dCwdtkTvRQ5LAatWiAyY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8619.792707929511, + "y": 7572.304333046588, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 823343300, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3411, + "versionNonce": 1148944022, + "isDeleted": false, + "id": "kwLnWCV83ZCmpm-AQb1wN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8725.116903050344, + "y": 7571.8008567926845, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 124560764, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3223, + "versionNonce": 1911676362, + "isDeleted": false, + "id": "yAnvLI224dqTejnO4d2-4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8724.422250090218, + "y": 7448.25997034425, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 1865908292, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 4837, + "versionNonce": 1157315542, + "isDeleted": false, + "id": "KjiX31M6SpynnehLETfvy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8609.636698357337, + "y": 8142.220721795301, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 304.57312989326493, + "height": 170.69067870387278, + "seed": 1629703548, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4884, + "versionNonce": 138908810, + "isDeleted": false, + "id": "tJJ6DNAVHvwIXLOGvY7f-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8608.40292617216, + "y": 8139.219680337815, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 798971972, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3833, + "versionNonce": 823218454, + "isDeleted": false, + "id": "om1XGvHKuJZ6gywUGj3ZR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8623.855539762584, + "y": 8176.033695559978, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 517225980, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3296, + "versionNonce": 540570442, + "isDeleted": false, + "id": "bS4hWc_GgvVX6nCHRvkQr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8643.654597067116, + "y": 8179.661788711142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 370388932, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4107, + "versionNonce": 1949482582, + "isDeleted": false, + "id": "Wz7bTSdxYi3DXKEeBNkaW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8727.086012008958, + "y": 8175.0766625534125, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 1242766972, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4962, + "versionNonce": 740260362, + "isDeleted": false, + "id": "7qBUzqCrHcPwwzVaSbT2h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8618.23957351439, + "y": 8203.656605785472, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1796282180, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3131, + "versionNonce": 1127515030, + "isDeleted": false, + "id": "Qkm-1jBDFeLQk8X1XEZcC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.475972630507, + "y": 8206.080902762562, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1537339132, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3235, + "versionNonce": 452438218, + "isDeleted": false, + "id": "lm1H3Daz5d1urnn5oTKto", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8729.203448947754, + "y": 8205.21350807033, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 452300484, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 3092, + "versionNonce": 1884004566, + "isDeleted": false, + "id": "0CcrtQpzSpkyhMSWnJ3f-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8797.570672499229, + "y": 8179.956790309941, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 1677897596, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3382, + "versionNonce": 1146879882, + "isDeleted": false, + "id": "H4ropKYW02ljfa1GGUMwP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.41179765601, + "y": 8234.166710925248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1449072196, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3498, + "versionNonce": 1057822230, + "isDeleted": false, + "id": "pmHwx1GLsZpxQiqGxRAbA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.610904164912, + "y": 8243.728751731313, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 326590460, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3507, + "versionNonce": 1418165834, + "isDeleted": false, + "id": "OVCTfdJW28j89ckwXdaN3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.628210357087, + "y": 8252.867255233981, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 170634692, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3469, + "versionNonce": 946725718, + "isDeleted": false, + "id": "DsjLrXhzLMMfzG-RsocMW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8811.830975250474, + "y": 8233.253115839736, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1107427452, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3585, + "versionNonce": 945104138, + "isDeleted": false, + "id": "oSjxQPJEThNTKOB4suHQq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8812.030081759376, + "y": 8242.8151566458, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1467569476, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3594, + "versionNonce": 2126710934, + "isDeleted": false, + "id": "X2WqYF5erRzKAT3WIycAT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8812.04738795155, + "y": 8251.953660148469, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 2003079420, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4605, + "versionNonce": 155186122, + "isDeleted": false, + "id": "aqsXeVll8YI44xSF_sPKw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8618.548206819849, + "y": 8226.363219917974, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 195431620, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3283, + "versionNonce": 566330838, + "isDeleted": false, + "id": "876hU6te76N_4vNSYPbeK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8647.602917222468, + "y": 8226.963277432966, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1931547004, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3378, + "versionNonce": 2036525706, + "isDeleted": false, + "id": "a-JeeNkdRGCq8A51_Qz7P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8730.815884899976, + "y": 8226.695721816719, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 407884868, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4500, + "versionNonce": 1920883478, + "isDeleted": false, + "id": "oG_ZUxIgYFHzUzOYREXpi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8619.26766493414, + "y": 8268.112970521783, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 880378364, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3442, + "versionNonce": 1064896842, + "isDeleted": false, + "id": "mbtqxQjCU4n0-e-VRlSIs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8624.035323954284, + "y": 8269.245979334744, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 190098372, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3550, + "versionNonce": 1466861654, + "isDeleted": false, + "id": "o1owyyFfRs227nqeo3E8J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8729.359519075117, + "y": 8268.74250308084, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 40886908, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3362, + "versionNonce": 48058378, + "isDeleted": false, + "id": "uezVAywY70rzFqPo411oz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8728.66486611499, + "y": 8145.201616632407, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 114463556, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 3092, + "versionNonce": 543624598, + "isDeleted": false, + "id": "vE52bshJZTZBbsVv0Xpxh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8145.806489127222, + "y": 8036.034614093186, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 180803396, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2838, + "versionNonce": 1200275146, + "isDeleted": false, + "id": "eLtBmTHE_EUVRSTXc-7UE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8326.702950637206, + "y": 8036.677054936073, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 187182844, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3011, + "versionNonce": 1520233174, + "isDeleted": false, + "id": "Hv8dKzK6DhqZGdrHKhAnr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8420.036870821918, + "y": 8035.059882674624, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 1039355588, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2147, + "versionNonce": 1511806346, + "isDeleted": false, + "id": "sPLtd0u-5eAtZaiGoIVIY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8431.351819502881, + "y": 8040.687945812783, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 1220603772, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3401, + "versionNonce": 614801430, + "isDeleted": false, + "id": "8KEXqpW4sFrW8rsCNs9-P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.44484418921, + "y": 8255.187589900144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1403311684, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3578, + "versionNonce": 1003295818, + "isDeleted": false, + "id": "waAkMp3axyzBuYLSjwi6Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.677052719817, + "y": 8267.280368633406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1181589500, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3762, + "versionNonce": 41200982, + "isDeleted": false, + "id": "HwbPjhFgvEM-YIYu2fRbe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.625375607688, + "y": 8279.373492391662, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1488547268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3163, + "versionNonce": 242744074, + "isDeleted": false, + "id": "XNRh5wP8_JmG207BUAV4I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.282760835438, + "y": 8064.083302953934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1009795196, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1930, + "versionNonce": 828412566, + "isDeleted": false, + "id": "e6O7cFxkmc1xwBGZm0xDu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.399239764043, + "y": 8064.963591055012, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 240063812, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2297, + "versionNonce": 9963978, + "isDeleted": false, + "id": "Hp8OPDJ6jyXr811RZQSHW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8104.127981036785, + "y": 8065.607479852743, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 298504444, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2428, + "versionNonce": 2082328534, + "isDeleted": false, + "id": "xm7KiTahX4I3n_sZjO-bX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.394278939828, + "y": 8110.711462569946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1640221892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 961036426, + "isDeleted": false, + "id": "VMlOleZl92KeJkxIvnhin", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.579099084134, + "y": 8119.587404252718, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1723814268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2553, + "versionNonce": 247555350, + "isDeleted": false, + "id": "sDkzwi3g0f8u7evr3HnoE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.595163515947, + "y": 8128.070198438879, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1689621572, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3273, + "versionNonce": 1145282378, + "isDeleted": false, + "id": "jNkbFZy6pnl_TUOEo2BAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.394080738784, + "y": 8084.8396617825265, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 441434620, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2083, + "versionNonce": 1254117974, + "isDeleted": false, + "id": "H5RJoeJjfmHhDgGptJFI6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.607728306692, + "y": 8084.863489491335, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1157786564, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2443, + "versionNonce": 2112169482, + "isDeleted": false, + "id": "U0LpI7sUhmKzAQAHVrbRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8104.336469579437, + "y": 8086.279745879224, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 1400775292, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 4054, + "versionNonce": 451909526, + "isDeleted": false, + "id": "jjO5H9UO2bK4tAJ6nlsoP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.460842271663, + "y": 8105.775550124855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 1153979204, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2886, + "versionNonce": 2133316810, + "isDeleted": false, + "id": "dKeQxvGIQ7qJuIhM1maWN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.727940146466, + "y": 8105.877377424268, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 151810812, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3265, + "versionNonce": 1199846614, + "isDeleted": false, + "id": "kFOxhiyOxIOWPwQc45wut", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8103.812555767763, + "y": 8107.3397027864985, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 845499076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3795, + "versionNonce": 161917834, + "isDeleted": false, + "id": "l3bYGW2GEx-WP8biA5Bs5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.130802112217, + "y": 8146.718194080552, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 159167356, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2708, + "versionNonce": 1242769942, + "isDeleted": false, + "id": "l9ZCHX_-mRZTLGgOLjvK1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.542257267283, + "y": 8146.8011369609185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1618432580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 3071, + "versionNonce": 1939647050, + "isDeleted": false, + "id": "HU43L2-0QiwSupT85WXNk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8086.2354802995615, + "y": 8148.127376240233, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 51438588, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3907, + "versionNonce": 563181398, + "isDeleted": false, + "id": "IV23blO3YUrVV8mAVex7Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.492533765315, + "y": 8167.047807501959, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 500984260, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2812, + "versionNonce": 333762826, + "isDeleted": false, + "id": "_51jMTzl6O3yDDnta8kVP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.305534290612, + "y": 8167.134173792728, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 197854332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 3162, + "versionNonce": 643046550, + "isDeleted": false, + "id": "FIVViUHpYRs7_a0-0f2Dz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8085.419815554542, + "y": 8168.743336528784, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 766677316, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 4122, + "versionNonce": 771366858, + "isDeleted": false, + "id": "S1nlyP7B3SKuMAUbmLmgc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.657880904604, + "y": 8188.669672987344, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 695014652, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4986, + "versionNonce": 1578113494, + "isDeleted": false, + "id": "314M9tHwDbncP4oYqtUO9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8139.021355273926, + "y": 8208.1844174258, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 1062717636, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3783, + "versionNonce": 1576507018, + "isDeleted": false, + "id": "jyCsOfmk95zBd3c1XzVc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.699418556134, + "y": 8208.025113658969, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1501107580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2804, + "versionNonce": 1339715350, + "isDeleted": false, + "id": "JRuYYt13S2a6d0hrKtrcf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.368219995129, + "y": 8212.837800237594, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1718227012, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2920, + "versionNonce": 77083978, + "isDeleted": false, + "id": "alGYHOaxJ37pT6n4iMHQo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.553040139435, + "y": 8221.713741920365, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 422643196, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2929, + "versionNonce": 1479023702, + "isDeleted": false, + "id": "cNLf6A6QC9R6LIlleR1Oe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.569104571245, + "y": 8230.196536106525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 315058116, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4224, + "versionNonce": 859241482, + "isDeleted": false, + "id": "Pmp4mJ8zkSd5jK1PqXMrL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.225047197135, + "y": 8248.437996273746, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1838605948, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3084, + "versionNonce": 2093883798, + "isDeleted": false, + "id": "63T6023XE1sJ8IRw005zT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.516198322584, + "y": 8248.685105957056, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 143511364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3426, + "versionNonce": 399436490, + "isDeleted": false, + "id": "EACSr0-Xo0wZh3JtR4FHv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8078.479913537518, + "y": 8250.25371390788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 1802286844, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4589, + "versionNonce": 1090617046, + "isDeleted": false, + "id": "SNJY6dRh1UIrruLdVW0Rz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8139.423927773001, + "y": 8311.717397213806, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1478182596, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3339, + "versionNonce": 1761280394, + "isDeleted": false, + "id": "omOfLNLofV4DH0Pappnq6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.1507217232, + "y": 8311.538462538008, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1060403068, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3650, + "versionNonce": 2035758102, + "isDeleted": false, + "id": "rtgERUhZQuNWLHSH9bdGq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8058.211725626425, + "y": 8312.6792752282, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 1443745348, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4598, + "versionNonce": 1375092810, + "isDeleted": false, + "id": "OU2yTaSKQxjJB--RYIyLv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.672297617748, + "y": 8332.436938022607, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 892348412, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3485, + "versionNonce": 532955478, + "isDeleted": false, + "id": "yaaV7M1HnqNynFHGUX5hz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.424394148955, + "y": 8332.211511236897, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 323184068, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5413, + "versionNonce": 1587259146, + "isDeleted": false, + "id": "JcHBQk8Inna4xmYx7SFHh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.024414499196, + "y": 8353.147840404055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1096927356, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4308, + "versionNonce": 664643222, + "isDeleted": false, + "id": "D68gajzwJaZpXOvFZoo7s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.607872698798, + "y": 8353.171668112866, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1423576388, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3329, + "versionNonce": 1734751690, + "isDeleted": false, + "id": "_1u0nYKW2uaTor8eIv5Ki", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.213407427713, + "y": 8358.148399470125, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 126572796, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3444, + "versionNonce": 1368941526, + "isDeleted": false, + "id": "knzN8z5igWBTSVcciIHSa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.342389278536, + "y": 8366.968502859416, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 204457156, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3453, + "versionNonce": 2104552586, + "isDeleted": false, + "id": "nH1cTfst6XwC99sgPojTH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.358453710352, + "y": 8375.451297045574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1664014716, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4742, + "versionNonce": 2143910166, + "isDeleted": false, + "id": "RZxPjX_XWU50IpQwTmEJD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.6780346584455, + "y": 8394.097232171918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 1323469892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2161, + "versionNonce": 1450625866, + "isDeleted": false, + "id": "vRE06jwRcEyJU5zPthrXT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8205.605025498622, + "y": 8040.558253104665, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 1871596028, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3479, + "versionNonce": 161867350, + "isDeleted": false, + "id": "QmPSQHbJ93D3a8tfaNh82", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8223.837197183748, + "y": 8255.166090172543, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1322279876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3656, + "versionNonce": 953340426, + "isDeleted": false, + "id": "yXDkJf8ey9PNTt4A30ysn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8224.069405714356, + "y": 8267.258868905801, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 262908540, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3840, + "versionNonce": 268610454, + "isDeleted": false, + "id": "AhXxnfA3zRwp0mDQ0eqjA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8224.017728602226, + "y": 8279.35199266406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1377258308, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2319, + "versionNonce": 1736442058, + "isDeleted": false, + "id": "eoKtzyNgaDs4x5i9cIU6F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.816982030083, + "y": 8063.882255523945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1984494332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2523, + "versionNonce": 1360316630, + "isDeleted": false, + "id": "oqZVa6lVC6TPFdPsACXGw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.283374195158, + "y": 8110.642461625389, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 722813636, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2639, + "versionNonce": 236541834, + "isDeleted": false, + "id": "_z6oskwSOQ5JEnR4LtO3Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.468194339464, + "y": 8119.51840330816, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 770194300, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2648, + "versionNonce": 2087796246, + "isDeleted": false, + "id": "3giiwJKr20_NDmLOknFX-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.484258771277, + "y": 8128.00119749432, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 812141124, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2471, + "versionNonce": 752473674, + "isDeleted": false, + "id": "VNOgEdDXfQmOBNuRlS8PR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.025470572735, + "y": 8084.770216070016, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 550202364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3292, + "versionNonce": 118295382, + "isDeleted": false, + "id": "fngnUsqe7JvhhzyZz1hld", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.145682412505, + "y": 8105.784104002952, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 888037828, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 3116, + "versionNonce": 77364490, + "isDeleted": false, + "id": "eSazmN22o1Hk35UGsNbSp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.9599995333265, + "y": 8146.6426796564965, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 552897660, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3205, + "versionNonce": 2134716566, + "isDeleted": false, + "id": "Ut_QtoFawTC_Bk5HkY2y7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.788460439755, + "y": 8167.106084254515, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2143652164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3351, + "versionNonce": 47991754, + "isDeleted": false, + "id": "lR124Cl3uWkN3D94M20xF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.996948982407, + "y": 8188.126325745456, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1881513212, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 4180, + "versionNonce": 1622584790, + "isDeleted": false, + "id": "a6n3vbAP7b8ZXXVcAeIdE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.1171608221775, + "y": 8207.995106947721, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1145815236, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2899, + "versionNonce": 766788234, + "isDeleted": false, + "id": "uGERFW6M8MXHM34UctpIA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.25731525046, + "y": 8212.768799293033, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1205902716, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3015, + "versionNonce": 1754170134, + "isDeleted": false, + "id": "JXQDI2BrzKs1FYdTibdFF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.442135394762, + "y": 8221.644740975804, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 438241348, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3024, + "versionNonce": 266297674, + "isDeleted": false, + "id": "LH6-m5sELFToNd2CGXgfE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.458199826578, + "y": 8230.127535161964, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1634176508, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3483, + "versionNonce": 1765388374, + "isDeleted": false, + "id": "wCWNZkVC3Yo5pwDb1l6Ng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.933940588624, + "y": 8248.59183253574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1964859332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3741, + "versionNonce": 616081418, + "isDeleted": false, + "id": "T1q_10VRsZ_ONDc3AJ8K7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.633647872342, + "y": 8311.621374401222, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2109501052, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3889, + "versionNonce": 512570774, + "isDeleted": false, + "id": "kgm7PW3qc2KcNzh70vSF7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.776952531887, + "y": 8332.11823781558, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 493143876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4708, + "versionNonce": 1144723146, + "isDeleted": false, + "id": "ExJihQDKFRan2InMpI3pE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.898761911216, + "y": 8352.936523887145, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1839283964, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3424, + "versionNonce": 29233878, + "isDeleted": false, + "id": "f1cr6Z96I4fUIWHbxohMq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.102502683047, + "y": 8358.079398525564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 659766980, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3539, + "versionNonce": 251768202, + "isDeleted": false, + "id": "Jo388ybktmvar-Djik82v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.23148453387, + "y": 8366.899501914855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 429391740, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3548, + "versionNonce": 492914710, + "isDeleted": false, + "id": "ZgOT41oqq9gEjuLcRgIad", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.247548965683, + "y": 8375.382296101017, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1803994692, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3730, + "versionNonce": 1514630218, + "isDeleted": false, + "id": "ZzurVdTmCPiHrQE0eD5Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.385289129485, + "y": 8393.878153668387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 165851132, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3303, + "versionNonce": 1634456918, + "isDeleted": false, + "id": "gHxvKEeyY_WrbgLr8XS2t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8423.102778115357, + "y": 8393.980772679324, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 2128436676, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3541, + "versionNonce": 468144906, + "isDeleted": false, + "id": "EkO3y19k4g3Vvj6pYh9tL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8058.863496467398, + "y": 8395.244676077176, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 1854099580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2418, + "versionNonce": 1999813270, + "isDeleted": false, + "id": "ESFBHfshBNzlaUHb3xzq6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8336.126912698157, + "y": 8040.231367806083, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 712312132, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3294, + "versionNonce": 1448894922, + "isDeleted": false, + "id": "9IxSXS-ZYt0wfpnhEF97O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8255.11301837299, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 658235644, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3473, + "versionNonce": 359331798, + "isDeleted": false, + "id": "EdUPsCpXHB_sjnER9SXR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8267.205797106248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1672199364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3657, + "versionNonce": 79796362, + "isDeleted": false, + "id": "dsjrKKCeUVOJ_8DZKOno_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8279.298920864507, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1267622268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2310, + "versionNonce": 1412009238, + "isDeleted": false, + "id": "YBDq5bV5pxsGsbMxMc5fE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8064.064592016112, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1142916164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2584, + "versionNonce": 114423626, + "isDeleted": false, + "id": "fwqD6w0t95-gpv6vJVESs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8111.437453330419, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 851235324, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2716, + "versionNonce": 14907990, + "isDeleted": false, + "id": "TrtYHXPqAr_csZhhDb4A8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8120.313395013191, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 28203972, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2725, + "versionNonce": 216563210, + "isDeleted": false, + "id": "bdTV_MqMUm3WJ8J-wZM0A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8128.796189199354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2076783228, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2459, + "versionNonce": 1919795094, + "isDeleted": false, + "id": "Dsh9QnKpPNjl3qIyyD4rK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8084.77300359882, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1719026500, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3278, + "versionNonce": 67120330, + "isDeleted": false, + "id": "Zi1iWUv0-p2j6EQzO6KVv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8105.786891531753, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 360022780, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 3094, + "versionNonce": 1560108246, + "isDeleted": false, + "id": "B8slU_xUMwWVQiRlT5-Ah", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8146.580283302194, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1221933764, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3199, + "versionNonce": 28574602, + "isDeleted": false, + "id": "IyW8tbPtBTQLPqM56vdxm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8167.154689301643, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1178846076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3339, + "versionNonce": 640111126, + "isDeleted": false, + "id": "2sGSxPNRBg1QT5039zFmy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8188.129113274259, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 57229892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 4171, + "versionNonce": 809435722, + "isDeleted": false, + "id": "1Yl2bWBWmjchcus8HlIY7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8207.934627766452, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 880145404, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2955, + "versionNonce": 954244950, + "isDeleted": false, + "id": "-n1Q8Sn-frVKJ6uP6ujDC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8213.563790998065, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1829788100, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3075, + "versionNonce": 981215498, + "isDeleted": false, + "id": "ni5zpiRcjO4SXQKlFWGAp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8222.439732680836, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1846416508, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3084, + "versionNonce": 1501447318, + "isDeleted": false, + "id": "8-Uw67hABtc-8GNJosbwa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8230.922526866996, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1357414724, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3469, + "versionNonce": 937850826, + "isDeleted": false, + "id": "0TO5teHby6Az8lLWIbTyM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8248.594620064543, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1892558076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3728, + "versionNonce": 2041922006, + "isDeleted": false, + "id": "HtIZa5f_x8LZd-9ppt7Zx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.520353099026, + "y": 8311.513160528599, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1716500676, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3869, + "versionNonce": 412675722, + "isDeleted": false, + "id": "DFOHAWAXqcRnxnwg8KBCD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8332.186209227488, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 842540412, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4693, + "versionNonce": 211457814, + "isDeleted": false, + "id": "mhU5NYCqRYT9fiBTUAS61", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8353.015998337249, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1222901828, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3482, + "versionNonce": 290360650, + "isDeleted": false, + "id": "hqezwyPHAQvXGlGQoZ7pG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8358.874390230596, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 663623164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3598, + "versionNonce": 1520649302, + "isDeleted": false, + "id": "lIHeclXKtsr3TRGpYa8vb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8367.75033191337, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1887655876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3607, + "versionNonce": 123884554, + "isDeleted": false, + "id": "2xvULGhgUbs93lVLE3Pf7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8376.233126099532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1305605756, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3622, + "versionNonce": 1436830102, + "isDeleted": false, + "id": "FiiGVOu--JKhCuXN1N9hC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8393.946125080294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 692830020, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2871, + "versionNonce": 2093957834, + "isDeleted": false, + "id": "Tj1_DY_Tyzq7tsyTcZlpg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8423.874743776556, + "y": 8188.3451808561, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 835045116, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 5710, + "versionNonce": 641225738, + "isDeleted": false, + "id": "MBAoilmli5tnopdFFP_Ed", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1964.4943391092702, + "y": 3215.232654807995, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1009.3106553819443, + "height": 464.17078993055617, + "seed": 655234902, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4715, + "versionNonce": 925780374, + "isDeleted": false, + "id": "YyzVKd1wCSXmgp6RcfkLh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2114.5138887979588, + "y": 3478.3817123710746, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 704786698, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5339, + "versionNonce": 1357202122, + "isDeleted": false, + "id": "XkHNscGBF72a9jfUaowHG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2111.7009484347104, + "y": 3478.4673880620435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 322747542, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4852, + "versionNonce": 219981526, + "isDeleted": false, + "id": "I9CITwXNg2dVrpxHgEqmT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2113.071180464632, + "y": 3411.1473373710764, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1500217290, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5247, + "versionNonce": 1569085834, + "isDeleted": false, + "id": "4uzj8xICbwmCmQKKqWtZ3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2111.3376671847177, + "y": 3346.5871797287114, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1692711382, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4621, + "versionNonce": 1741511702, + "isDeleted": false, + "id": "m1hTR4pUFI9wZ_eZwSvi-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2114.2313367146357, + "y": 3346.5015040377425, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1413281418, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2323, + "versionNonce": 1263966282, + "isDeleted": false, + "id": "lGXYEpyOd7HlHt52rlLvV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2174.97227773071, + "y": 3310.274507486573, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 340.8218005952383, + "seed": 1394282262, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1630, + "versionNonce": 758475094, + "isDeleted": false, + "id": "V-WDNavdcuK5eK-eg9a_d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2186.836237477942, + "y": 3315.29632938439, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 25, + "seed": 1261540682, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 3083, + "versionNonce": 2050031370, + "isDeleted": false, + "id": "YpRIBr8Op06sCSJ3Kp7pn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2323.5026847152185, + "y": 3309.269461913655, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 87.64195261437878, + "height": 342.412946428571, + "seed": 1783938134, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3019, + "versionNonce": 1017761430, + "isDeleted": false, + "id": "6wIpicwR9gXvELcwQy4Rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.8865822846615, + "y": 3351.9613021914324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 530865162, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1814, + "versionNonce": 378572234, + "isDeleted": false, + "id": "Kul3-vbfqfbba4qIiX_T2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2227.981200340216, + "y": 3352.624930663657, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1617346966, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 1863, + "versionNonce": 1121946582, + "isDeleted": false, + "id": "uC72G_cuPa16MqjEBsy9f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2360.3874503402185, + "y": 3352.455659830323, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1334856394, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 1701, + "versionNonce": 93340810, + "isDeleted": false, + "id": "pf2YMa5R3Tl3-Qs26E8Fy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2332.9802702806937, + "y": 3316.5973388977823, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 71, + "height": 25, + "seed": 1753620182, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "rectangle", + "version": 2934, + "versionNonce": 914134166, + "isDeleted": false, + "id": "QtYlOzalTt6ga6i4-dkbj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.210259104833, + "y": 3384.0860823591834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1636852106, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-RM7a2Tnsb21UOJBgN549", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3754, + "versionNonce": 1357587274, + "isDeleted": false, + "id": "dk3Bq89x8j5gCm_4MDI_6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.3968870391523, + "y": 3418.676030815465, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 122147862, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1954, + "versionNonce": 506930070, + "isDeleted": false, + "id": "j1e1EhbG4bZ3h3qVJ3wtT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.6536680314844, + "y": 3385.212088866782, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1356832842, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253754304, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 2067, + "versionNonce": 1911010838, + "isDeleted": false, + "id": "epTZ2a_3a-EaiD6gvYt9w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.70075369048, + "y": 3419.764172200116, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1721819478, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253758691, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 1999, + "versionNonce": 1286748054, + "isDeleted": false, + "id": "a8HMkb_iTbC7vkR4GWads", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.7241911904803, + "y": 3385.214693033448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 2035877642, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253783795, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2084, + "versionNonce": 1319914634, + "isDeleted": false, + "id": "2JT-nd63hJakj8PaVaGYA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.3714290369417, + "y": 3418.645258979808, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 702957206, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253815409, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "rectangle", + "version": 3344, + "versionNonce": 1904734422, + "isDeleted": false, + "id": "MBTEMlrDKA5Shqj3epxWn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.9696898549005, + "y": 3448.633570529108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 58168778, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2145, + "versionNonce": 371334858, + "isDeleted": false, + "id": "M-M6cGr3mxj402as5gN1W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.9024259401476, + "y": 3449.256410781023, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1103954902, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253770428, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2191, + "versionNonce": 2121287318, + "isDeleted": false, + "id": "AoPN1VmxKDmRHKbiZn14N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2360.3572766604575, + "y": 3449.215502876306, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1347832970, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253812300, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "rectangle", + "version": 3255, + "versionNonce": 2120363594, + "isDeleted": false, + "id": "WVYVS6hyE55aBzf24Vrmr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.3645982927187, + "y": 3480.637256946857, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1080695062, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4082, + "versionNonce": 1492818326, + "isDeleted": false, + "id": "pU_CI0NHbneRQ2VjLRdgs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.4799946093913, + "y": 3515.3482991531405, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1706044234, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "zja_33DOJDMG2acFn04Rm", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2281, + "versionNonce": 336360522, + "isDeleted": false, + "id": "EW8PuY0acw9kW-Qx_uQ2p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.359382094051, + "y": 3481.923945771225, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 758285910, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253773488, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2394, + "versionNonce": 411003338, + "isDeleted": false, + "id": "JRPw4Sv65RCLq82Hgo3Hw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.283861260717, + "y": 3516.476029104559, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1507865098, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253776753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2312, + "versionNonce": 985018890, + "isDeleted": false, + "id": "ZyAxzo7Pj9lRkizeFfP33", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.9244862607175, + "y": 3481.9265499378926, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1492863894, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253823047, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2404, + "versionNonce": 74113366, + "isDeleted": false, + "id": "fBicEIQGc1-xP2qBKa-9r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2357.9557362607193, + "y": 3515.3583155377896, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1071734986, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253809500, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2287, + "versionNonce": 519805578, + "isDeleted": false, + "id": "WGh5jnVjDBunJ1rNuAnvp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2115.662938777906, + "y": 3352.9685363921258, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 838428886, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2361, + "versionNonce": 393847318, + "isDeleted": false, + "id": "McmBj7OV8kHbC0pR8INiD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2116.928563777906, + "y": 3385.303605836571, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 40, + "height": 20, + "seed": 323925898, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tCLdnNvIf4VsYmhf6WCEv", + "type": "arrow" + } + ], + "updated": 1672253748106, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "text", + "version": 2395, + "versionNonce": 242989386, + "isDeleted": false, + "id": "Ic8k_bcYS0I0jwbkjpjbN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.096098500129, + "y": 3416.9485711143484, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 398581270, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "text", + "version": 2371, + "versionNonce": 1024724886, + "isDeleted": false, + "id": "ixwBsfHzwzNHktPcTalk8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.770577666795, + "y": 3449.166453058792, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 610481738, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ki86qmcsAtMTZrgcgWzAT", + "type": "arrow" + } + ], + "updated": 1672253748105, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 3", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 3" + }, + { + "type": "text", + "version": 2346, + "versionNonce": 1040842762, + "isDeleted": false, + "id": "iisCSuXxWKRnLr2NCAuUf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.178563777906, + "y": 3482.868710003237, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 793357142, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 4", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 4" + }, + { + "type": "text", + "version": 2352, + "versionNonce": 1802039126, + "isDeleted": false, + "id": "vgtMTyIZGfll-h3GajFbQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.067452666795, + "y": 3516.0891961143484, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 20, + "seed": 66706698, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "bC8jtDTgkwE6zHu9X1f-6", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 5", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 5" + }, + { + "type": "rectangle", + "version": 5480, + "versionNonce": 1514465046, + "isDeleted": false, + "id": "8eZNABrVLwkJeBUlkccQJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.115010934716, + "y": 3411.2330130620435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 317, + "height": 58.68447577621506, + "seed": 921030806, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ahs63f6BAd7RZnQxB8dqN", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 512309974, + "isDeleted": false, + "id": "52RV0b6O9d69QVVN904O-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.7723854612245, + "y": 3359.466657896334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1871555530, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 2 rows" + }, + { + "type": "text", + "version": 2578, + "versionNonce": 1440548234, + "isDeleted": false, + "id": "TIivEtu9MJez2TVfP9-KS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1986.3583229612245, + "y": 3425.763532896334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1514884566, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 2 rows" + }, + { + "type": "text", + "version": 2671, + "versionNonce": 1183281174, + "isDeleted": false, + "id": "ltsIA0A2gw-bkGb6i2A5q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1987.1356667112245, + "y": 3488.509626646334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1027187338, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 2\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 2\nwith 2 rows" + }, + { + "type": "rectangle", + "version": 4891, + "versionNonce": 1542964298, + "isDeleted": false, + "id": "oGwv0Gdb8xw3JeseX0TAL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2113.4251477321664, + "y": 3546.8325934903337, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 110043926, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5516, + "versionNonce": 1401748822, + "isDeleted": false, + "id": "nL5D0bpeLnQ5noEp3pgXM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.612207368918, + "y": 3546.9182691813025, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1203290442, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3433, + "versionNonce": 902605578, + "isDeleted": false, + "id": "eh4QmQEnObGMEhqug5JzH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.2758572269263, + "y": 3549.0881380661162, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1042698326, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4269, + "versionNonce": 516271126, + "isDeleted": false, + "id": "gat2m4EG_lZAaSKNQ2Fa4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.391253543599, + "y": 3583.7991802723977, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1516636170, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "r0V3y2HfMunry04qr3-WA", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2455, + "versionNonce": 44827926, + "isDeleted": false, + "id": "rVEJWEEv_cbSFPxdvCnZj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.2706410282585, + "y": 3550.3352383237147, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1827001750, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253778843, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2574, + "versionNonce": 2137137110, + "isDeleted": false, + "id": "WHAD-C06aXkTq6CHpnevN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.1951201949246, + "y": 3584.8873216570487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 490501834, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2495, + "versionNonce": 273461974, + "isDeleted": false, + "id": "q_8L_3dYbq92ozIIK5rSr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2357.3345455413864, + "y": 3550.377431057152, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1006809814, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253857327, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2587, + "versionNonce": 374461462, + "isDeleted": false, + "id": "VLsty7uozuV1BDW_fMIgD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.4065837616963, + "y": 3583.848785223818, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 14093706, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253803589, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2524, + "versionNonce": 1637240650, + "isDeleted": false, + "id": "8lZVXh63-e86ZqKIPQ2th", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.089822712114, + "y": 3551.319591122496, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1712449558, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 6", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 6" + }, + { + "type": "text", + "version": 2531, + "versionNonce": 509193430, + "isDeleted": false, + "id": "OziR1Af9DXZ1NB0FHyU1l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.9787116010025, + "y": 3584.5400772336075, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 44, + "height": 20, + "seed": 712035402, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YeF1EvrR3elZJ4Y9KX_C5", + "type": "arrow" + } + ], + "updated": 1672253748105, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 7", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 7" + }, + { + "type": "text", + "version": 2850, + "versionNonce": 1029821962, + "isDeleted": false, + "id": "HFrhERx2Se2gFkmfXEk6I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.8739345740046, + "y": 3556.960507765593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 185103702, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 3\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 3\nwith 2 rows" + }, + { + "type": "text", + "version": 2652, + "versionNonce": 584443798, + "isDeleted": false, + "id": "pgSnAvFhdzrOpumJzFvwF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.5071734487187, + "y": 3596.61986578764, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1608823562, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2770, + "versionNonce": 193889482, + "isDeleted": false, + "id": "kAX8rM9mLb8oQyvqUt5XL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.7941052669007, + "y": 3610.3996953330957, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 70998678, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2779, + "versionNonce": 505447638, + "isDeleted": false, + "id": "7H6nrZRmXOfoiUgsJTGOr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.8190451707483, + "y": 3623.5691664869414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1940767178, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2827, + "versionNonce": 901208970, + "isDeleted": false, + "id": "FnAmFlmXmuQRRX-8dmA6r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2365.952526923371, + "y": 3595.3032865335613, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 945788886, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2954, + "versionNonce": 681933334, + "isDeleted": false, + "id": "N5wVDJirGnrXg7odzEfbh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2366.239458741551, + "y": 3609.0831160790153, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 820443274, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2963, + "versionNonce": 974608970, + "isDeleted": false, + "id": "iLAZdHXSIzE4IHlG93hYY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2366.2643986453986, + "y": 3622.252587232861, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1871326486, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5028, + "versionNonce": 721017814, + "isDeleted": false, + "id": "dJlcyPulTIDc8OW31V6Ve", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2561.237944370635, + "y": 3325.2660516954015, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 251.25889756944446, + "height": 263.3309461805559, + "seed": 1196119882, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PEKPTd-LhAGxWQY97JD3i", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3864, + "versionNonce": 394887434, + "isDeleted": false, + "id": "KBzXO0i7G--GT-h8VT8fh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2583.819161439157, + "y": 3378.3186233099855, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 197.2833214962126, + "seed": 657463894, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3227, + "versionNonce": 546466966, + "isDeleted": false, + "id": "MXhV1sD4oh6AW50btk_2-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2612.3515260619997, + "y": 3383.3956907435145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 73, + "height": 25, + "seed": 926277130, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4259, + "versionNonce": 302225430, + "isDeleted": false, + "id": "2Xp3FaqTyhKkyNfMAD81N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2732.584298537301, + "y": 3376.8144457926223, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 60.780841503267865, + "height": 199.05406605113606, + "seed": 1713790870, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "d2WKSFZDAQkBOakKFezKv", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5093, + "versionNonce": 470051286, + "isDeleted": false, + "id": "DI2DA9IKEcrtFUd_4uBQe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2575.7260086067445, + "y": 3420.294865221285, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 224.41844223484904, + "height": 19.07958491161571, + "seed": 1033997514, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3155, + "versionNonce": 1680885386, + "isDeleted": false, + "id": "ALoE0geVJqF180sjdpcUm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2743.1595403527763, + "y": 3383.820816700361, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 42, + "height": 25, + "seed": 279051478, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "rectangle", + "version": 4745, + "versionNonce": 1132530326, + "isDeleted": false, + "id": "MfVMPD_2cTT2vB3-dbSQq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2576.170779176916, + "y": 3451.255582889034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 223.03527462121252, + "height": 20.091303661616152, + "seed": 1076454282, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4630, + "versionNonce": 2099502358, + "isDeleted": false, + "id": "kTNr71hKZIAYg7teJhilD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2577.2075881992887, + "y": 3479.9952473377193, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1010299414, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "aYYMc2myv4sefG8YIl23J", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3390, + "versionNonce": 1095265366, + "isDeleted": false, + "id": "Jtg7K8_AzeNxeFSUcLAqV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.8595806553576, + "y": 3333.735235723179, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 956850762, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2856, + "versionNonce": 1114214870, + "isDeleted": false, + "id": "oeEvMJgISdMZ4tlvuKO68", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2498.51372252043, + "y": 3420.7979837390517, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 64831318, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-RM7a2Tnsb21UOJBgN549", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2868, + "versionNonce": 511939670, + "isDeleted": false, + "id": "p_AnsPaLV3dXq4uQMPn5y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2497.95903502043, + "y": 3451.9932962390517, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50, + "height": 20, + "seed": 588876042, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ahs63f6BAd7RZnQxB8dqN", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2692, + "versionNonce": 1317378762, + "isDeleted": false, + "id": "0U6pkwBhZjXk23DZtXTQb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.6629970740005, + "y": 3420.7978519806197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1541858454, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 2852, + "versionNonce": 1238359306, + "isDeleted": false, + "id": "XwOQFIAx4beCfbY-qoG8K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.3540677078913, + "y": 3451.9498601145106, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1708644298, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253832635, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 2920, + "versionNonce": 596987350, + "isDeleted": false, + "id": "iU8YIh60OAoEJ0KeCz2HB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.3270595740005, + "y": 3482.1376957306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1711923670, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253836000, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2639, + "versionNonce": 1687782422, + "isDeleted": false, + "id": "pqzLAxYiXpn3maCQT_qd9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2753.5614345740005, + "y": 3421.0908207306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1096699530, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2779, + "versionNonce": 1858138186, + "isDeleted": false, + "id": "FzG6say1zA6ok7kViI9NC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2749.9676845740005, + "y": 3451.9501957306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1163605782, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2821, + "versionNonce": 87820298, + "isDeleted": false, + "id": "bXHUnpH_a-UA0OEvpH4pw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.2333095740005, + "y": 3480.6962894806197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 979889482, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253847922, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2946, + "versionNonce": 1356789462, + "isDeleted": false, + "id": "vFHrT8I4LSZajCvaenmuH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2493.8036220740005, + "y": 3481.8447269806197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 57, + "height": 20, + "seed": 1917838422, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "zja_33DOJDMG2acFn04Rm", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 2" + }, + { + "type": "text", + "version": 3563, + "versionNonce": 759440726, + "isDeleted": false, + "id": "zfCGlhx93zYFnGewlD2EG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2845.194247074007, + "y": 3419.0205082306197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 105886730, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "d2WKSFZDAQkBOakKFezKv", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 4495, + "versionNonce": 867310666, + "isDeleted": false, + "id": "d2WKSFZDAQkBOakKFezKv", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.0581793656675, + "y": 3427.8525394806197, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 42.59375, + "height": 1.18359375, + "seed": 247261590, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "2Xp3FaqTyhKkyNfMAD81N", + "focus": -0.4933611925763207, + "gap": 6.693039325098653 + }, + "endBinding": { + "elementId": "zfCGlhx93zYFnGewlD2EG", + "focus": -0.1431536845471553, + "gap": 2.5423177083393966 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 42.59375, + 1.18359375 + ] + ] + }, + { + "type": "text", + "version": 3754, + "versionNonce": 440185814, + "isDeleted": false, + "id": "0GO2M_YqAp9L2fTeOE4I9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.2170116255247, + "y": 3524.0740942644893, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1997578954, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3874, + "versionNonce": 1006214282, + "isDeleted": false, + "id": "TTiwLjVCn4IQ9JZmmuRwD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.5039434437067, + "y": 3537.853923809945, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 970409686, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3883, + "versionNonce": 1331939606, + "isDeleted": false, + "id": "UjnGA44oIUC-MVMAgF85N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.5288833475543, + "y": 3551.023394963791, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1732622730, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3938, + "versionNonce": 543783754, + "isDeleted": false, + "id": "pZ96NjNhpMplig5CbbV59", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.6623651001764, + "y": 3522.7575150104108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1681128470, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4058, + "versionNonce": 292959830, + "isDeleted": false, + "id": "f0frKnRvSL4CBr08rpFbj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.9492969183566, + "y": 3536.537344555865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 640284746, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4067, + "versionNonce": 284131850, + "isDeleted": false, + "id": "YDKlLiwZT5HG3XkhcqWD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.974236822204, + "y": 3549.7068157097106, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 600312150, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4808, + "versionNonce": 768482966, + "isDeleted": false, + "id": "WiTP9xXzdUsQm4LL2hUjr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2577.1599316044476, + "y": 3512.126763982567, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1670930186, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PEKPTd-LhAGxWQY97JD3i", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3095, + "versionNonce": 396990422, + "isDeleted": false, + "id": "n4MA25q3Bl2J1DsmCJWqw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.2794029791594, + "y": 3514.4108139379673, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 132673174, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253877492, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2994, + "versionNonce": 1423078742, + "isDeleted": false, + "id": "p_c2dV3iKDn6djGoJgNmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2753.6856529791594, + "y": 3512.8278061254673, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 470543818, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253862922, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3121, + "versionNonce": 10729814, + "isDeleted": false, + "id": "KwIm32XKO1fKHCCypCjMB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2494.7559654791594, + "y": 3513.9762436254673, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1833577430, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "r0V3y2HfMunry04qr3-WA", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 3" + }, + { + "type": "text", + "version": 3696, + "versionNonce": 1668237270, + "isDeleted": false, + "id": "NaksSlA21Y52KW_zkMc4n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2844.917554365673, + "y": 3450.715704473179, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 77571210, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "text", + "version": 3799, + "versionNonce": 907266646, + "isDeleted": false, + "id": "t8M-kjtp4oQh61IYl_SBv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2845.353752282339, + "y": 3480.214402389846, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 1375879446, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "aYYMc2myv4sefG8YIl23J", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 3431, + "versionNonce": 2027622858, + "isDeleted": false, + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.2925543656656, + "y": 3460.051641973179, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 39.407552083333485, + "height": 2.12239583333303, + "seed": 1997439818, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "MfVMPD_2cTT2vB3-dbSQq", + "focus": -0.4556632522954561, + "gap": 1.0865005675375414 + }, + "endBinding": { + "elementId": "NaksSlA21Y52KW_zkMc4n", + "focus": -0.3666566984698796, + "gap": 5.217447916673791 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.407552083333485, + 2.12239583333303 + ] + ] + }, + { + "type": "arrow", + "version": 3446, + "versionNonce": 1030006602, + "isDeleted": false, + "id": "aYYMc2myv4sefG8YIl23J", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.3771897823317, + "y": 3487.873907598179, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 44.212239583333485, + "height": 2.916666666666515, + "seed": 696626774, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kTNr71hKZIAYg7teJhilD", + "focus": -0.5620611078781369, + "gap": 1 + }, + "endBinding": { + "elementId": "t8M-kjtp4oQh61IYl_SBv", + "focus": -0.31716976539648145, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 44.212239583333485, + 2.916666666666515 + ] + ] + }, + { + "type": "arrow", + "version": 553, + "versionNonce": 1034235402, + "isDeleted": false, + "id": "ki86qmcsAtMTZrgcgWzAT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2076.8579840531816, + "y": 3446.380960549572, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 33.8720703125, + "height": 0.9912109375, + "seed": 1572047370, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748105, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "ixwBsfHzwzNHktPcTalk8", + "focus": 1.3621904407139551, + "gap": 3.7767034467196936 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 33.8720703125, + -0.9912109375 + ] + ] + }, + { + "type": "arrow", + "version": 438, + "versionNonce": 1504107722, + "isDeleted": false, + "id": "YeF1EvrR3elZJ4Y9KX_C5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2074.1236090531816, + "y": 3575.052835549572, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.30859375, + "height": 0, + "seed": 816411542, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748105, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "OziR1Af9DXZ1NB0FHyU1l", + "focus": 1.9487241684035328, + "gap": 9.487241684035325 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.30859375, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 460, + "versionNonce": 1325708170, + "isDeleted": false, + "id": "tCLdnNvIf4VsYmhf6WCEv", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2070.6195251211825, + "y": 3377.3068735580023, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 40.95052083333303, + "height": 0.1649305555556566, + "seed": 529119434, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748106, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "McmBj7OV8kHbC0pR8INiD", + "focus": 1.758799553983158, + "gap": 7.831801723013086 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 40.95052083333303, + 0.1649305555556566 + ] + ] + }, + { + "type": "text", + "version": 2962, + "versionNonce": 1418523274, + "isDeleted": false, + "id": "VhxN827jn2HhKhohxtFtG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1979.5679843225648, + "y": 3230.075862273274, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 340, + "height": 50, + "seed": 1101172950, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Searching for rows with URL = W3\nwhen UserID has high cardinality", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Searching for rows with URL = W3\nwhen UserID has high cardinality" + }, + { + "type": "arrow", + "version": 434, + "versionNonce": 1878635082, + "isDeleted": false, + "id": "bC8jtDTgkwE6zHu9X1f-6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2076.695914010065, + "y": 3505.748713835774, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 31.640625, + "height": 0, + "seed": 204214154, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "vgtMTyIZGfll-h3GajFbQ", + "focus": 2.0340482278574195, + "gap": 10.3404822785742 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.640625, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 398, + "versionNonce": 1823811530, + "isDeleted": false, + "id": "-RM7a2Tnsb21UOJBgN549", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2427.0686818672075, + "y": 3377.7183008893467, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 68.51004464285734, + "height": 51.21651785714221, + "seed": 671483414, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": { + "elementId": "QtYlOzalTt6ga6i4-dkbj", + "focus": -1.1100701193001765, + "gap": 6.83628734570766 + }, + "endBinding": { + "elementId": "oeEvMJgISdMZ4tlvuKO68", + "focus": -0.6874116316600608, + "gap": 2.934996010365012 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 68.51004464285734, + 51.21651785714221 + ] + ] + }, + { + "type": "arrow", + "version": 417, + "versionNonce": 103890250, + "isDeleted": false, + "id": "Ahs63f6BAd7RZnQxB8dqN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.3622086529213, + "y": 3441.127899103632, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 64.67075892857156, + "height": 21.294642857143117, + "seed": 1205177930, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": { + "elementId": "8eZNABrVLwkJeBUlkccQJ", + "focus": -0.6424145019487615, + "gap": 2.2471977182053706 + }, + "endBinding": { + "elementId": "p_AnsPaLV3dXq4uQMPn5y", + "focus": -0.5459624308582374, + "gap": 3.926067438937025 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 64.67075892857156, + 21.294642857143117 + ] + ] + }, + { + "type": "arrow", + "version": 370, + "versionNonce": 1019605706, + "isDeleted": false, + "id": "zja_33DOJDMG2acFn04Rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.4961372243506, + "y": 3506.1781223179173, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 61.69642857142867, + "height": 12.834821428570649, + "seed": 1959318358, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "pU_CI0NHbneRQ2VjLRdgs", + "focus": 0.29086110609133803, + "gap": 9.170176835223174 + }, + "endBinding": { + "elementId": "vFHrT8I4LSZajCvaenmuH", + "focus": 0.31223210666640894, + "gap": 2.61105627822144 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 61.69642857142867, + -12.834821428570649 + ] + ] + }, + { + "type": "arrow", + "version": 372, + "versionNonce": 1523271754, + "isDeleted": false, + "id": "r0V3y2HfMunry04qr3-WA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2427.476047938635, + "y": 3574.8109348179173, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 65.30691964285711, + "height": 45.675223214286234, + "seed": 929117450, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "gat2m4EG_lZAaSKNQ2Fa4", + "focus": 0.7826516271118303, + "gap": 8.98824545448042 + }, + "endBinding": { + "elementId": "KwIm32XKO1fKHCCypCjMB", + "focus": 0.5342067936915732, + "gap": 1.972997897667483 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 65.30691964285711, + -45.675223214286234 + ] + ] + }, + { + "type": "text", + "version": 3934, + "versionNonce": 1603389130, + "isDeleted": false, + "id": "BpkQGbBTw3AgIsXrDWsau", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2843.150775121174, + "y": 3513.093424897265, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 1379924118, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 376, + "versionNonce": 1956199882, + "isDeleted": false, + "id": "PEKPTd-LhAGxWQY97JD3i", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.574386232285, + "y": 3523.345161008377, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.61545138888914, + "height": 0.542534722221717, + "seed": 1816789962, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "WiTP9xXzdUsQm4LL2hUjr", + "focus": -0.06206704117319776, + "gap": 1 + }, + "endBinding": { + "elementId": "dJlcyPulTIDc8OW31V6Ve", + "focus": -0.4878789719383463, + "gap": 31.692995681095 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.61545138888914, + 0.542534722221717 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d": { + "mimeType": "image/png", + "id": "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d", + "dataURL": "data:image/png;base64,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b/Jq3TSpUqWKieBKJMF0NWPGDNm6dat07NjxoDJdqUYn/Jv03XffyayZM+V///uftIvCdHWoEp1vvvlGZs+aJaeccopc3aZNeCC1hSKgCCQcAkp08iE6mK7G/3uCHHdMCSlaJEVSk8mlk2RITFEfhAbxiT/JL3jcZIlPfFZzk5NcMNOf3S4V52UsXVn45IhwHZ60P8Mv6X6/7MvMlN//3C19Sm2WatWyo7dU4oOAEp344JjfKIcq0Sl45PQJioAiUNAIHNREZ9euXVK6dOmIMPLax5quXsw6RY4slu0cXDQpSVJzcgKm41hMHh0///rNv2hpiMxCihFhnuWX/T6f0fb4/b5sP2TYDSYrSJFPjPkqXbJkX1qW7N6XJl2TvzJEB1+HWIU1/Pjjj4Y0HXvsscbJ2aukp6cL3/JxLq1xwgleux3wdtu3b5dt27ZJ9erVAxgmMtH5448/zHxx7vZKbkliSR/64s9VoUIFSU6GansXN5y89N63b5/8unWrZGZlGc1j0aJFTbd4Eh0iEn/99Vfhb5X39qijjvIytUCbcGv7b88eE1G5b/9+gx0YarLPiCDWxorAQYXAQUt05s6ZI6iVzzjzTLniiis8gY5D7XsbN0qFihXlhhtuyLcPJOGHH36QKVmnScmi5MxJNpFWRFwh6bjb8MHvkyxfliRDZ/w+Sc+2XUmJlGxGtBfjFmQoK9u85TedsktJcIXjKTtsPV327suQ61MjJzp//fWXXNaokXle//79DSZPPP64vP/++4E1coi2bddO+vTpk4fwDBs2zKjny5QtK7NmzZIHBwyQDz74QAixr1ipkixdulQ4HC6++GIz7zvuvFO6dOniCfP8Gn3++efS9dprTZNnn31WLrjwwjzNiea54frrzfVx48cHnGSD18xB9eKLLxpihwwaNEiuatXKfI430el7223yzjvvGJynTJniusTeN98sGzZskHPOOcc49zoFXEeNHClvvvWWbN+2LXCLQ71jp05yzTXXuB68mA9feP55Y0Jk/VYgAm3btpUbb7opjxO7V5yeefppsxZ8w9559908a/r7779l9KhR8tprrwnzQCD/jS67TPr27SvTp0+PyhnZ+e4xNuOwRkzHVs486yzjRF6rVq1c8/K6NtuJ923smDGydu3aXOMcd9xxJpKwU6dOedY9evRomfbii4Y0s18qioAicPAh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", + "created": 1648744551489 + }, + "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5": { + "mimeType": "image/png", + "id": "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9wAAACGCAYAAAAvrYIRAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQecXFXZxp87ZUs6IXQICYQOoSO9qggCAgrSi4BITQBRaYIgRaVLl6pSVVAUBenSFFE6ElronYSWZHdn5t7v9z+zZ7+bYfqdTbLJ++qy2Zlbzn3Oueec561BFEWRTAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ6ClCARGuFuKp13MEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEHAIGOG2gWAIGAKGgCFgCBgChoAhYAgYAoaAIWAI9AMCRrj7AVS7pCFgCBgChoAhYAgYAoaAIWAIGAKGgCFghNvGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCHQDwgY4e4HUO2ShoAhYAgYAoaAIWAIGAKGgCFgCBgChoARbhsDhoAhYAgYAoaAIWAIGAKGgCFgCBgChkA/IGCEux9AtUsaAoaAIWAIGAKGgCFgCBgChoAhYAgYAka4bQwYAoaAIWAIGAKGgCFgCBgChoAhYAgYAv2AgBHufgDVLmkIGAKGgCFgCBgChoAhYAgYAoaAIWAIGOG2MWAIGAKGgCFgCBgChoAhYAgYAoaAIWAI9AMCRrj7AVS7pCFgCBgChoAhYAgYAoaAIWAIGAKGgCFghNvGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCHQDwi0jHBHUSR+ykkqleqHptslDQFDwBAwBAwBQ8AQMAQMAUPAEDAEDIE5F4FEhDsMQ0eyu7q6FASB+LtU+Dybzbof/m1iCBgChoAhYAgYAoaAIWAIGAKGgCFgCMwLCDRNuCHX3d3duvWJyfrrGwUF2UGCThcUCnt2NpNWQZGiri4t3zFDB22yrAYNGiSs3WbxnheGlj2jIWAIGAKGgCFgCBgChoAhYAgYAvM2Ak0T7kKhoI8++kjfvf1NdWUHK1WQCpEURQVHuFOZtDBopxQom440OvehfrzVChoyZIgymUxZ1LGAm1v6vD0g7ekNAUPAEDAEDAFDwBAwBAwBQ8AQmFsQaJpwT58+Xe+88472unuaeqJAPdm0ZuRDBYVQUSClM4FSQaBUvqDBmYwy2ZQWDT7VnssM0RpjF9bQzqzS6fRMBBuyDemOE28+4zikvb3d/fZ/zy2dYM9hCBgChoAhYAgYAoaAIWAIGAKGgCEw9yGQiHC/+uqr+ua9OU3LR+pOpdQdRSpg5lakIBOoB+t2T0HZVKBsW0bDsyl1ZlJqx608y3EpKcQsHigfFl3RC+lQ6UgqBJmia7oKSgeBBqtLuy+Z0U5rj1NbW9uAcEvv6elxbe1PmTRpkn77299qhRVW0G677daftxrw106CVS6X0+9+9zunIFp77bW17LLLznY8ZsX4ij8k+D399NOaPHmyBg8erP33379fx3eS58vn84nCVwiX8Qq+ZjoaDyBTDlZHLkn/NtMnc+M5hHYx1vt7nUmC3UDu508//VRPPPGEnnnmGWFk2HDDDbXuuusmgWPAnTuQ+w+wZ+Vc/Pzzz+s///mPMxp9+9vfHjDGoTmxj+vdc9WzL6l2zE033STutfLKK2vVVVcdcO/nnNrgpHuoWflcs2r8N024P//8c7fx3vz+UFN7QhW6cwRwSzkiuSNlM5niP/O4mEdSW9pZuQeFUkcqUAg5x1rdHiiI+Lu4QU0FRWt2TyGvNj7HSp4OlE5nNL9m6K5vL6mRI0dWdEuv1kkPPPCA/vrXv7rFc/XVV9c222yjddZZp2q/TpkyRWeddZYjWjvvvLNWW221isczsf/hD3/Qv//9b/33v//VW2+9pbFjx2qNNdbQV77yFW266aZlz73wwgvdsfXIQgstpAkTJvQduuOOO+q5555zf19zzTX60pe+VM9l5sljkmD18ccf9220jjnmGO29994zYcg4gZDff//9LkHgJptsop122klDhw6tivXvf/97N1bmn39+HXXUUVWPnR3jyzfol7/8pRincfnXv/6l4cOHu494t/72t7/VNa5+/OMfq6Oj4wvHNvt8/kIsqrzf4PnUU0+5OYIFlPdv991313zzzVe1fcxn559/vtswvf/++06psMwyy2jffffVlltuWfPZXn75Zf3617/Wfffdpw8++MDdn/OZMw499NCa9yf55F/+8hen1OCHkJ3llltOK620kjbaaCP3HLWE8+gL5rj//e9/GjZsmNtI8LP11lv39Ve56wzE+ZE+XXDBBR1OzOXN5geZMWOGzjjjDLfxQpZYYgkddNBBZeFuxViv1Y/VvodgM9fceOONbg1ms7Dooou6MXLIIYdogQUWqHj6QJ2nWtXPd9xxh5ujveyzzz4Vladvvvmm9tprL7399tt9x++555467rjjknRfonPn9f6rF7yk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nHGGbrzhBnfuwYccogMOOOALTZ7VhLuVz1/6MChJ8Oi4/W9/0+9///s+8r3b7rvr6F4lB5nuL7/8cqXTaZcQjUzj9crsINzHHXec/nrbba6JvzjzTH25tyxZvW224wwBQ8AQMAQMAUPAEDAEDAFDoDoCiQg31tqrXg909R4bacutthG1izHeOuO1UvrPY4/o0PteV8fw+dXR1u4IdMEFc0fOcl2sx41LuZTutYjjZu4s3sWLKBcGCqNQhXxB07rz+m7b/xIlTesvC7evk9zIgDvv3HN19dVXu1PqsUjXunbcRXiFFVbQtdddVzVO/PjjjtNtvYSLEljr9dYb5z61CDd1zLfbdltNmzbNxTQT/4ubfFxmNeFu5fNXwxpL99ZbbeXKvS233HK64cYb3eFxzK759a81fvz4Wl3W9/2sJtyUNrvsssvc/YcMGaK77r67IQVB3Q9mBxoChoAhYAgYAoaAIWAIGALzMAKJCDfloK78aH6tmv5IR31jE6259nrq6e4uxmhHKT315H90xL1vqm34fL0JpFKirjZcOuytx+2rcTvC/f+e1kVreCB1wczDUPkcSdNy+k5mziHcuAbvsfvubvjE43H9eCLx1n8ee8zV5D7t9NNdfe64/OmPfxREHSmt59zsmNx/v/30n//8x51OfPiPTzyxLOm+9tprdeYvfuGOI0P17bff7kpVealFuDnusksv1cUXX1zx+Wc14aYhrXj+1157ra+++le33LJsAjMIN2XR4jXU33vvPX1tyy0dHssuu6zIVF6aYA3X9F/04n74hAl9bv+zinBjqb/uuuv6+p62nnjiidp+hx2aHXJ2niFgCBgChoAhYAgYAoaAIWAIVECgacL96aef6plnntbdqWV14kaL6eenn6Frr73OWacp+YW88PyzOvyeN9U5bISynZ1KqZgkDcbdQ3Y1V3c7pVRQrNfdW1HM/c6SrTyQphekKB+qEIaa3pPTvunntNRSSzWdpbyVFu6pU6dq8944aZKK7bf//lprrbU0eoklNGjwYMVdtldeZRUdduihIu4X0kOs7xmnn+4yRFN66u933ulckZMKSoCDvvc9EWOPbLzxxs5VePyqqzri/+STT+qfjzyim2++2X3PPU897TRt2UsUGyHclEzDys0zEItOHWcSrHnxhHuxxRabKT683DOOGTOmatxzvbi04vmJ3ea5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", + "created": 1648745237223 + }, + "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708": { + "mimeType": "image/png", + "id": "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABMoAAASQCAYAAAAN5qOoAAAAAXNSR0IArs4c6QAAIABJREFUeF7svQmUZGV5///U0nv3dM/GNsDMALLKMoCAIKKoiBJFMSpJJJsn8RzRaOISo/5PzPkZk2hyThKNGjBiMBg1iCgiIiqgyCrrsG+yw7DMdPf03lV1/+fzvPetul3TM9Pd03t/r6lUd/Wtu3zuW6X3M9/neXNJkiSmRQREQAREQAREQAREQAREQAREQAREQAREQASWOIGcRNkSHwE6fREQAREQAREQAREQAREQAREQAREQAREQAScgUaaBIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIg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vGnZJZspu0xD6uWsmDMrsX0z2y2XWE+lZEc3lO0961vt5P27bL89OqyxodFyhXDzvxT7aSG3fv7zn9vXv/51e+aZZ+zAAw+0vfbayx+ILh5r167dZpQikBBk9957r913332eSHv44Ydt48aN9trXvtbOPvtsO/HEE2316tUzMMJndpN8bhCAnA9JuTg2kEgIoYMOOshe9rKXuTBbDAvni+gkWfjss89WJSHfIVGSIc3ggCCiHJdnzh8pymO33XbzUtuFLg+5xvHaI5HjtScpiRDkuvMZQZZpEQEREAEREAEREAEREAEREIGZICBRNgNUoyijb1RWlP3k6bz91wtpyovkValiNhqTYWl4C6tUTXOloixNiGWb77so87RYGhXDUlGfySPTR4xUGA7MU2dpai3ItlSL5c1Gi+YN/uMbSbYx8ybPLPkk7+8f9RLQxBos77JutBJFX+K7jaKNclHW9/5pubyNMC2nmQ0Oo+7K9rcva7Y3H9RuL1vTbs3NLVZsaKreEC81WYYcu/TSS+3cc8+tjkQEF6WTp556qp100kn+c/2COHjooYc8jcbjrrvusuuuu85Xo2zzS1/6kr9/jz32mIERPr2bjMkpJAmPzZs32/3332833XSTPyNISEpt2rTJBeJZZ53lXDjPhbjESRji+SKEuJa33Xab3XrrrS49b7/99u2e2r777utyjLThhg0bXByRPkSWwSTyWghsxrv2Dz74oF97JHA8l+eff96TlVz7V73qVV6SrEUEREAEREAEREAEREAEREAEZoKARNkMUB0jyvp7rZtE2bMjdsVTOfuvZxBhyLGK2UjZrMQjtVYIMhJayLL0JU+Ueff92Hw/bfZfFWXpCbgki8mwVJZFkVYtu8wFCVebYDG8h+iXC7a0RJOd+/Yzx5FJtfkefeZNn1WgJut4PU2UVVNwSL74QAwWE/vUy5rs9ANb7MA1bdbS0moNjbWysaUoyn7wgx/Y+9///upIPOWUU2y//faz17zmNZ4K254oI3GFJPvNb35j99xzj1199dW+jX322cf+6Z/+yZNlC0GUUW5HfzVkCAm73/72t56uQpggjejbxrj45S9/6ZLkL/7iL+x1r3vdgpUlnC8SPZbOIslIB3LeyCGet2zZssNvJqTY/vvv7wkrpBljhOu+9957++8LRSTxXcm1R4Jy7bne8drDIXvtTzjh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fju6qdfWtyfW0dll7cu65rUoC3xqijHbTH1XvyaWQo8y2FFiiPBAFl177bX2d3/3d46O5BRLa2uryyJET3t7u8shUlg0vieBRC8r0lMLVZQxsyNN6r/3ve95ioreYchBJCDJrw0bNthhhx1mr3jFK1ycwWBHC8kyuNDXjUTeF77wBV8dwQRjls9//vN25pln+mtztXDtkWDx2iMH/+Ef/sHot5a99lx3rn+89si17LVnVlAWibK5upLarwiIgAiIgAiIgAiIgAgsHQJzKsoQStxIkRyY7WUm910vyrb09NpvBxrtjtJyu99arKuxYJ0NeSvQpN8b59OjjOcwo2RMbVUTYlUTllKqmwwvxxsyUqva9h9JlabTKNdEoOVzSVWAeZosJsHibtNm/p5gS0sq2Wt1l5myy9Dgf+wxhWRa2C/JOC/BtFCC2TNStsGRkh2R77fDG7ptXWvFlnXNf1HGTTuJIBrKM14phUN0TIfgXSqijDQRsuPuu++26667zi644IJtPvLvfe97PVFFqSASiHWRPvxMEglWC02URcmK6KNx/9e+9jW76qqr7IADDvDzomfZySefbGeffbYde+yxtn79em/gH1NkO5NlJPLY7qWXXmq/+MUvfHbQuLz//e+3d77znV5+mS3hnM3vWs6f84zXnmP9r//6r20O4U/+5E+cAz3ZXnzxxeq1Z9wgSEmdSZTN5pXTvkRABERABERABERABERg6RKYM1HGDRSpAm7s6M9DQ+rZXNg34oNeOIiP6VzGNPPf2m0uygab7Y7ycnsgabWOYs4fNOnPW87yaX+yXD407Ud8VVuQMWtkWuLILXD19SRINZrp5xFTfgJBkcV1EFWUQvrf2BcllbnEZ9oMZZw5n5WSv/PsS+xTlrq3qiBLm/pnOXnz/sz72HtIoYXX2X8plaHlcsW6Rys2UirbyxFlxW7bt61snZ1dXnqJeJqPs15yLUm2kOChNJBxS/qJpvIc864uS0GUwZCySfqQUXKI/LrsssuqpZb05KJckFLB0047zZNGrI/4ueGGG1yc8B6kyUITZQhWElWkxyiRPO+883x2R86ZxBzX/13vepchikiWdXV1TWpIIZDi7JmUsGZnDP2zP/sz54koI60VZ5Gc1A52cWU+L/XX/oorrvDPFEvsx8a1p/cYZaJINa49vJBs9CejzJRFibJdvCB6uwiI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Nt1P5dWYQ88KtGx55RiTNabx2bjii22OSZQhvYIrC0tdCzR/rdqrjPgbqZHai0iwKMuQY6RJ4jM/S5LN4ADUpkVABERABERABERABERABERABERABCZFQKJsUrgmv3K2DDOWP2Wf499jmir+jT1lG11nU2auoTIps/i3+BxLnNxrZdJpkzn67LYm8r54PPWpsJgqi8Isll7F17PHOpH9aB0REAEREAEREAEREAEREAEREAEREAERmCkCEmUzRTaz3azIimIs+5wVXzGFFl9DJI0nu6KQyv5tLkVZvbzLYo1SLHtOEmSzMPC0CxEQAREQAREQAREQAREQAREQAREQgUkRkCibFK6pr1wvu3aU9BrToyxNjo33Gkezve2MJ9KmfvQ7fmeUeTvqMTZe0mymjkfbFQEREAEREAEREAEREAEREAEREAEREIGpEJAomwo1vUcEREAEREAEREAEREAEREAEREAEREAERGDREZAoW3SXVCckAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwFQISZVOhpveIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAgsOgISZYvukuqEREAEREAEREAEREAEREAEREAEREAEREAEpkJAomwq1PQeERABERABERABERABERABERABERABERCBRUdAomzRXVKdkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwFQISJRNhZreIwIiIAIiIAIiIAIiIAIiIAIiIAIiIAIisOgIzJooS0CXJGa5XHjWIgIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIALziMAMi7LEnViUZEmShJ9TaVbzZeFV6bN5NDJ0KCIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwxAjMmChDimHJkF/8XOHn9IESc0nmq4QfwrNk2RIbfzpdERABERABERABERABERABERABERABEZg3BKZVlFVlV0aKZSWZizCXZ2nMzJ+qkTMlyubNsNCBiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMDSIzBtoiymxVyMVRJLKpWQIsukxSLeKNSWHm6dsQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwHwlsMuiLCvIgiRLBRmyrE6U5Wjkr0UEREAEREAEREAEREAEREAEREAEREAEREAE5iGBXRZlnh5LKkGQRUmWdvDPtO6fh6euQxIBERABERABERAB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WXyyCF111VXjNWLEiDdcRs6TPHRL/crfBcqol1IMway1E+aADpIvbgUqKqANK6ZPn57++vDD6Z577knPPvtsmjtnTiJ8H/D75vXXT9tuu21af/31416KnWGXcBgm18UlhpPs8cceS/fee2965JFH0uxZs9K8bng9YdVVo12bbrppGjduXNzz+Q67FSUYkMPoGzo+9eST6d777gvtgfzAMvowdqWV0rbbbpM222zzeIblztwBabAvagWsgBWwAlbAClgBK2AFWlgBg7IWHpzB0LT+gLJasEyhSPkxtT7nv2nXSsDWnDlzehacuF9Y2OP+kvtMY1TL+aW8QZyjxP4BFJZbLhw1LHJ55aCsJ78TF3BS/8FwK3REH5nD3B8vvvhiuuuuu9Jvb7wx/f3vf0+vLViQZs+ZE/fTju98Z9pzzz3TJptskkaNGhUur6UByrjXZs+enR5+6KF0yy23pD/fcUeaO29eXP+ll19K6633prT/fvult223XcAk7v92AWX0jX4A/37/u9+lW2+9NSAgTr6XX345rTZxYtp///3TDjvsEI45/WNAR0w6d8IKWAErYAWsgBWwAlbACjRZAYOyJgvq6upToL+grAyW5S0oc5P15TBTm1gkK+cPC3w+K3RSdQiC5fnF8h3/5LABHvC98jXloGzYsGEBzATKeI86hpDxybtf1jejfPRAKiBQxk6xf/zjH9MvLrww3XLzzeFoeuyxxwKUfeSjH01HHHFE2mqrrdIKK6wQ99XSBGW43K644or0iwsuSMstv3xc//HHHw832Sc/+cm08847p4mTJgUoK9thdyD1Lbs2YaXLDxsW/XjwgQfT1b++Op1/7rnh4AOIPfrooxE2/u+f+1x61+67pzXXWiu+l7O11frj9lgBK2AFrIAVsAJWwApYgYFWwKBsoEdgkF+/HlC28sorx255C7pzCvUFxPR7WR6zIiwrOtDy/GIsKFmE6hV5f7pDxYpQLN+5UjnH8l0tFZ752sKFUQdOMvIHAcuUpyx3ltGHVs9Tlrcv15FdC5bmvoZqB+BALrxaUHSQ33q9zqv+QCvmLnP6ueeeS7///e/TWWeeGVBqxdGj04yZM0Py97///ekDRx+dttlmm6UKyrjHyJ129113pYsvvjideuqpadmhQ3ueJ+uss0468UtfSrvuumvk82ofULZMWn5YF/C7//770xWX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lqURaSoef9NlAd9++22OKOvfv78p21gIxjHKknUQASRyhMUikxsTXeyGKcWZiLH4BsyWusDktlIw5SZRSEguSwAn6turVy9T7PFe7Yk6xfXkZ+pK/bEPCB7i3WFTffr0caKsQIPrUg3sBbsRluDIxix2ia52u/HyOwKOgCNQDQhMnTo1TJw40dZHkGadO3e2w0TGYy5gYr3jhxfV0JJexkpBgDXirFmzbJ0zZ84c61daL/bu3dv6li41q5QyezkcgZaOgBNlLb2FK7x+WYkyFmByvYyJsoaQZcnvJokyyDA25dOmTTMFyzrrrGMLQRRAECFyuVQdROKJaJNyin+LFIsJM8gSXpBExVwxK7wZMxcPPD///PMwadIkW2BzWQNx4Kj/gAEDwve//30jI6sxSS3G4oZ64bKL7eA+TF2JtwfZw9+xg6222ioMGjTI7MpPCfO3OH0N7NiYffbZZ2Y/YAqOkIxbbrll2GijjSyWoSdHwBFwBByBxkWATfyECRPCa6+9Ft555x0bn4nfusUWW4Tvfe979jMHm5BlnhwBRyAbAqwbp0yZEiZPnhyI0cy/Weew59h4443DZpttZgesnhwBR6DpEHCirOmw9ielIFAOoqzcZJmILm7f5HRHRNl6661nCiAWf7rtMibJYuIsLcA/hFgywH/shhkry1qq+yUEx7vvvhveeustIz0gk3iB3a677hp23333sMEGG1RlX4EYhRCjXl988YURO7zYVLCRwJbkyottHX744WHo0KG2sUClKIl9VVa+EQsNriwcP/jgg/Dhhx8aycoLuwG7fffdN2y99dYtQonYiDB61o6AI+AINAgBxmLmM+Y3CLIXXnghjBkzxjbzhKVg7h44cKAdePEzKjNPjoAjkA0B9au3337b1o6QZayZUc7vueeeYeedd67ag+RsCPinHIHKQ8CJssprk1ZVoixEWffu3W1yiF0vs8YgKxTEPxnAX8CLKMNNLkmUrb322kaUxeqxuA7xzyLTUMRAjEhZFqvK4gD/rcEFk8n/1VdfDaNGjTLig9OzV155xaD/3e9+Fw499FA7OavGhK1AAL788stGBkLqcOqO3dK2IlL5DOmcc84JBx54oNWX2BOklupy25D2pB9iK6gX3nzzzfD++++H+++/37KEXP31r38dhgwZEvr27duQx/h3HQFHwBFwBAoggPobRS/j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ZnQMvHfqe0QvSTRRFl2cgPRY+JIka4eTWKckAiIgAiIgAiIgAiIgAiIgAiLQ5ghIlLW5S9ZxBhxkVKbvbY1EtEl/VJ5xHmrg39aupsYrAiIgAiIgAiIgAiIgAiIgAiLQHglIlLXHq6pzEgEREAEREAEREAEREAEREAEREAEREAERyJmARFnOyPQCERABERABERABERABERABERABERABERCB9khAoqw9XlWdkwiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQM4EJMpyRqYXiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAItEcCEmXt8arqnERABERABERABERABERABERABERABERABHImIFGWMzK9QAREQAREQAREQAREQAREQAREQAREQAREoD0SkChrj1dV5yQCIiACIiACIiACIiACIiACIiACIiACIpAzgVYTZfX19TkPTi8QAREQAREQAREQAREQAREQAREQAREQAREQgdYi0MKirN7wY0GS8d11WUKaferO2E8irbUuut5HBERABERABERABERABERABERABERABETgcAItJspciiXkV13iz+FnUXHm5swFWoMoky7TNBUBERABERABERABERABERABERABERABETgSBPIqylyA+f/XW31dvbkg4/+CKHMTFkmPJfZNxMwkyY7EDNB7ioAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIOIG8ibKkDEsIsrq6uoggOzQnpjJLzT4REAEREAEREAEREAEREAEREAEREAEREIFCI9BsURYtp+TPCLK6umiK7NMEWVFRUaGdv8YjAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAk6g2aLMpVhdndXW1zYIMpJkHDmUVQq0CIiACIiACIiACIiACIiACIiACIiACIiACLQBAk0WZQ19+uutrrbOauuQZHXek4wv5cbawJXXEEVABERABERABERABERABERABERABERABA4h0CRR1lBuSV/+OqutpdSytqFxf2jUX1QkWaaJJgIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0KYINEmUeaN+yi29H1lDkkwN+tvUdddgRUAEREAEREAEREAEREAEREAEREAEREAEUgjkJMqCDEOO1dZ+Wm4ZkmRq1q/5JQIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0FYJ5CzKwsqWNQlRpiRZW730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7MTx4+34sWNd9HH/cL8GYdY6lPUuIiACIiACIiACIiACItA8AhJlzeOnV+eJQGOJssZ6lMWRXwwx12RZeE1IjJGwImGBfKE8asSIES7K2EK6KdrAOjVZhoRBvpDK4kG5UJOZoak4UofSsCefeMKef+45T7pUdOni4ua0iRPts5/9rE2YMMFlUj5EGUwQkQsWLLBZs2bZx0uWuFR67513bNuOHXbHHXfYTTfdZKecemqjoowU3Kuvvmp/fOwx27F9u4+Z8bEgBHOABFdG+ZTowRjkFsmxrt26+XXu1r27CzJ/6C8rs8FDhniqbvDgwV6CGpJC0QUdmBsci3Nj/nB+yIePPvrIZs2cab/73e98/lx+2WU29fzzbfz48V7S27tPHz/mIf2g8nSf6TBHlkBSlK1aZdNeeMHuvvvu5IDOOfdcl0tIssmTJ9uoUaNaXJQFSV11sMr27N1jmzdtshWffGILFy605cuWuTDnPiT9yM+4f9JtA486yhNk3DPDhg9PfkaOO+EE/x8V+Jzw8vPIogBH9kro3UVABERABERABERABEQgMwGJMs2OgiCQTZSFsp1cxVj05HKVZSEthghLFWVIkiDKouV30URZEB2pDf7Dw2khyrIgykh3IXN+/etf2+OPP+7ljjwM8xB966232vU33GCTJk3yxAjpruYkn0JvI0TknDlzXHTNnz/f1q9bZx988IFfQiTZl7/yFTvttNNcIqUmykh2wXv58uU2bdo0++63v207d+/2EllKMPn31NUmM038MNe47nyRBoNHdLv22mvtsssvd7mFOI2mZqJzNMhRStZI6TC++R9+aG+++aY999xzfkikyGWXXeZpuREjR/rxkHISZQXx0ZTXQSBU+UKY/uXFF+2uu+7y43MfnXrqqTb06KN9Ppx++ukuYlu69DJ87iLENm3caMuWLfMk6bPPPmvvv/++3zPIYMbBPcSiAyFByQqtIXHL/cgX9xo/417m8+GWW26xiaef7uWYlGXyOcLW0qWkeb1oOpgIiIAIiIAIiIAIiECHIyBR1uEueWGecDZRFhUxrSnLECWhv1QovUxNlAWiQbCkJsuiDf7Z1xNLJSX+EFposiwqyihhfPCXv7Q//elPfoqkykiX8PB744032qTJk/MmykpLSm3T5k0uyl5++WUXZOvWrvUUC9sNN9xgX/3qVz3NlkmUsR8r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qWkUbYlAVJT5KpDV1da5vNybvZeVlRkN4KONr1PPLZdkWazeZGlK0LK9LuMY6I1UVNTQvJqm2qEpeV2dnycrRvJvFRUV/qXVH9vSzNVYRUAEREAEREAEREAEREAEREAE2hOBrKKMk4026g5N/bOVVrUnSDqXlicQ5hNN7ffv3+8liYgxJBlf5WVlniyLrhYYJykWRp5Ncvl+TZBjqcfPJuzCvVRTW2M11TVW7SvK1vh5de7c2b8kylp+vukdREAEREAEREAEREAEREAEREAERCAdgdiijAf86OqXwikC+SRAM3j+H1FGwoqkFckrmowjjjxRVlx8yFumlV8J4eU7RlfN8xXvGvqCJRa9a0h4pWz+k5SfJ/dKJMPCvx9yrEyvix4rsfIerwvCrGGYRS4Fy8vLXQpKlOVzZulYIiACIiACIiACIiACIiACIiACIhCfQCxR1uAAEqKsptbLMOtdOWgTgfwRQBghY5FkJMqQZtEv/s2b+vv8S2yZpFZzhpWvY6ZIsrBgQXFJg/jji5Rc+B5KTCXKmnPx9FoREAEREAEREAEREAEREAEREAERaDqBnERZQ5+yOqutq7X6OlSZZFnT0euVqQRIeoX+XUGWIcwOHDjg4oyvsKhEctXExEFCSqwgqRZ5Xs6TYyEdV1Ze7uWkIUUWlWQSZQV5FTUoERABERABERABERABERABERCBDkAgtiiDBaKsLiHKahMN/vm5+pV1gJnSSqfoibH6+mSSLAgzvpMuSxVlrTSs5r9NkVlxUXFSlB2SIutUap1KO/m/8aVNBERABERABERABERABERABERABETgyBDISZQlm/onVsBEnGkTgXwTCLLMe+Il5Bh/DpIszLvGGufne0zNPV5YhCDIMHqShS+kGcknUm8AACAASURBVD+PLlTQ3PfT60VABERABERABERABERABERABERABHInkLMoi66ASaqsLcmK3PHoFUeKQJBlnmJMzLPw3eec/3/bKf0NqctQfpkqzpQkO1IzTe8rAiIgAiIgAiIgAiIgAiIgAiIgAp8SyEmU8bIgyoLA8O+JcjmVYGpq5ZNAVMJm+nM+36+lj5V6fyTlWWLFz5Z+fx1fBERABERABERABERABERABERABESgcQI5i7LGZJlgi0C+CWSSS/l+n9Y6XroEplKZrUVf7yMCIiACIiACIiACIiACIiACIiACLSTKOGxdXX1Dg/+62obviWQZ/6Z0maZeSxBgXiGWss2v6D5x9o81Vko+ixrW1wzHTHfsjD+zojZVLhqLiXYSAREQAREQAREQAREQAREQAREQgXZEoEmJsnD+eINDRFlClrUjPjoVERABERABERABERABERABERABERABERCBDkKgWaIMRtGeZeHPDb3W65ON/kNpWbYUUAdhrtMUAREQAREQAREQAREQAREQAREQAREQAREoQALNFmVBlh26SmGDJKurb1gVk/8romG5NhEQAREQAREQAREQAREQAREQAREQAREQAREoUAJ5EWVBlpnLsQZJVk//svBnq/fTP6RpeSJ1lo0L6bTURQEjraIafXnipYfsE14b/bfGjtfoe6V7g3Qj8nNNtrfKdsoJVoefd8M/NPw87ub8Ut473Tkd9rPU90n8PXW/JM9P23cdMsbDhtsYi5jnFuf6R/eJs38snpHxpT3vxEGy8fXDJK7LYdcyGx+/mJ+ONu31CNOk6PDp0lQWydclxl1flGYaxrx+sVhHdorDk/si0T7usMOnuwfCTtmO3dhYG5sDuZxjY+Nr+Nw89Nyy3qtZ2OUytkM/PA//7GnyJY/5wkY/m3P7KPSbobHPYX+vRu6vWEMOO2W6vzNcm6bel8nDNeV3TDp+sU6y4V0P+UzI4XdSnHsquk8UZbZ7JXlfR35Xphtaumudy+/W1P9+SP0de8j4I/dv6mdGcrqk+fyKcymS+8TZOfX3U+rv9ByOke5zIfy3mrNIOVa263bYXIreR3mYW5n+eyDbuLJ9/h1y/6X8Tjzknm7C/RmZwocOo5HfdalzOOPvjhjXOjpXm7Qwd6b/hox87iTfI3Gyyd/hjfBq7L+f0v4+D++X5jM57eduDDb5/B2a67GyXZdcf5c4ljCn0px7rv/9FOd8Uj8/M/63W66/49P8fs31v5+y8mNupvvv35T3Tv2dkHUcjT3eHQIsPpTGOGea5hmnf+SezMoozSSIdVtF2UZ+BzT2323p/hu50TmYYSCpv4MO+Z2R8vkU61yy3AhNYZj13sp0/ybma67vedhHeOJzItPnZrrrlO09m/LvzbqXovdp9HdDI/+dkTdR1jBZG34TNXxLCLOoPPN0WcMOvm/iF1fD6xKvzToTtIMIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAI5J9AXkVZ6vBCOWZD+WWDSGsQZEGYBbn2aT+z/J+ijigCIiACIiACIiACIiACIiACIiACIiACIiAC2Qm0qCjj7ZMps4a/hBBZiJ35CEMCLftwtYcIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAItAyBFhdlLTNsHVUEREAEREAEREAEREAEREAEREAEREAEREAE8ktAoiy/PHU0ERABERABERABERABERABERABERABERCBNkpAoqyNXjgNWwREQAREQAREQAREQAREQAREQAREQAREIL8EJMryy1NHEwEREAEREAEREAEREAEREAEREAEREAERaKMEJMra6IXTsEVABERABERABERABERABERABERABERABPJLQKIsvzx1NBEQAREQAREQAREQAREQAREQAREQAREQgTZKQKKsjV44DVsEREAEREAEREAEREAEREAEREAEREAERCC/BCTK8stTRxMBERABERABERABERABERABERABERABEWijBCTK2uiF07BFQAREQAREQAREQAREQAREQAREQAREQATyS0CiLL88dTQREAEREAEREAEREAEREAEREAEREAEREIE2SkCirI1eOA1bBERABERABERABERABERABERABERABEQgvwQkyvLLU0cTAREQAREQAREQAREQAREQAREQAREQARFoowQkytrohdOwm0+gvr7eDxK+pztiUVHRIT9O/XvzR6EjiIAIiIAIiIAIiIAIiIAIiIAIiIAIFAoBibJCuRIaxyEEkFfpvsJOjcmtVJRhXyQXf+Z7TU2N7dy103bs2GFVVdVWUlxiaLO62lqrr69LyLMi69y5s1V27WKVlV2srKzcOpV2stLSUispKbHi4mJdNREQAREQAREQAREQAREQAREQAREQgXZEQKKsHV3M9nQqdXV1Fr5qXV7V+98bS4Glk2fpfobg2rdvny1fsdzmzf/QNm/eYl06V5rV1duBg/utquqg1dTUWXFRsQ0ZOtiGjxxmgwcPsh5du1uXikrrUtHFOpU1CDMlzNrTrNO5iIAIiIAIiIAIiIAIiIAIiIAIdHQCEmUdfQYU2PmHFBlSDEEWFWaNibKoEMuWNistKbXde3bbB/M/sGl//YvNfP9969+tn9XXFtn+A/vtYNU+27B5h+3aXW233HCJnXXOGXbsqFFW2aXSyjqVW2VlpSfNysrKPFmGLJMwK7CJpOGI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ihUrPJnJteO+GTFihKejBg4c6H/n/k3duGc4Btd3zZo1LpDWr1/vCdJsMiZ6H4d7meQm7xNkDjKVHoIsuIH05vPjSG4IwaVLl9q8efPso48+8j+///77fn/dcMMNdtttt/lnDAK+tTdSZNOmTbNnnnnG5SX/YwFjHDNmjF199dV+zyHzSL4hxrWJgAiIgAiIgAiIgAiIQEcgIFHWEa5yGzrHTKIs12b+0VOOlniF5tk82K9Yvtw+nD/fNmzcZEWlnayiS6X17T/AKrt0sY0bN9jSRQtt8MAB/hDLgz8P9ogykk1IIh4cOXZIPQVZFi3BRJoFwRQaY7cF0cPD/Zw5c+y5556zd99918tIERGIMUrFpkyZ4r3b8lkuhhQj0cL7IhNI3tBDjve/99577frrr7dTTjnFhYq2I0OAuY0ko4SQazN79mx79dVXPY3EvLjooovs1FNPdVmG+EFUpW7cL9xLyDHSTO+884699dZbvm/YP1N/wfBz5Fc0PcbrEHPMUwQZpdHIMu5R5myQdvy5tYU1nzWc58yZM+29995zZnPnznUszOdvfetbds4557iMau0NYffrX//afvSjHx321nfeeaede+65fl0HDx7s/wOBNhEQAREQAREQAREQARHoCAQkyjrCVW5D59iYKOM0cln5Mp0s42cIKxprk4ZZMH++7di9xyp79rIevftY/wGDvGRr7epVNu/9WdaraxebNGmyP3TTywdRxoM4yZmQsGDMqZIsNPcPgg9BhyALK2IWerIMUTZr1ix79NFH7bHHHvPzhQvniji88sor/3/23gNMruJK368Z5YyEJEQWQgSDBAKLnEQONllksImLWWQbvNi/Xdvr3WfXeNf248V/bGwDJpgMDoDJQZgschICkZGEhFBCEQml+T/vmTk9NVe3u2/3dI96NN+1m55wQ9VX596eevWdU2H06NH2s0ptpKK98cYbBk0ALziWnn32WXOVfetb3zLnDdcs5jqqVHt0njUVIJ5Z0AInGPX9AC24kYBm1LQ67rjjbIxwIeE8THMhEUM4BnGi4Wgizu66664c2PJ7JunM5J6JQZlDb+AXL+4tL0SP25MXAI0YJVUauM0iHECztnSZAcoAwABfABl9fvzxx03c/fffP3z3u9+1NMe1AaIYv+uuuy5cccUVqaBsv/32C9tvv71AmR4GUkAKSAEpIAWkgBSQAh1KAYGyDjXctd/ZUkFZGjwr9LM49RJHGWlGi79cHtZbf1BYb+DgMHCDIeacmj51Snj9xQmhd7fOYfToXRtB2dx5YdbsWQbKcMw4BCCVzCf3cQpm/DX7uAOGCT1fl1KTqa1Hjsk9wOqqq64Kf/7zn+3y1CrC5XXmmWeG0047Leyxxx4GHSq1URONifsjjzxiaWrUTyL1k+30008POFx22203gbJKCV7GeYhpIJenLQO5rr766tyZcP4xRhSBB0qlpROS4kc6L6mHgNGnn346F2Mc426xQveIg2juK9IFAbukc6Y50YC8J5xwgsUrKYUAKQAacK0tgDX3EiARNxlxDWAkxtlw4F144YVhr732WiugDGj3wAMPhDvvvNPSyNESmAccQ7Ndd93VoCcuWmrPaZMCUkAKSAEpIAWkgBSQAh1BAYGyjjDK7aiPxUBZqWAsreu4Tpi8Tvn44zB58jth4dKloc96A0Kvfv1D3/4DQrcuXcPMGdPDe5NeD+v17hl22mkng2Oeepl0lMXXcBeMT+TjCT2TeC88Tht4taWzpZQwECgrRa2Os29bgDLuGaANQI04pF4em4Nl3nlOlLIdc8wxBn+orUe9O4AcqY6A3mqn8tYyKMMZ6MX8gXnASzbgYlzMnxRrOTlLiTjtKwWkgBSQAlJACkgBKdCeFRAoa8+jtw62PQso826Xk4bpKZA4UKZOmWopUaReduvVO3Tp0St079krdKrvFObNmR1mTvs4DB6wXthh5MgwaPAgWwWStDMcKaRyJVdgjNMvk8X9Y3BG+3GVeapYW7haSg0VJvcTJkwI11xzTbjlllssjQ53EOlyp5xySjj55JMtBbPSjjLqk40fP96cZNSwIl2N7Zvf/GY477zzzOGiCXupo1m5/Ylr0o9xlOFGYnx+//vf2wUYl4svvtjGCOcWMIp7JLm5o4zUZ8aZ9FpijI3jWP0Rxxdwxu8Rfhff7zwncD/hIiNll7RoQLbfW6Rb4gz1eoDAMFJ5cW5RD4w00eHDh+dSMSun0JpnqmVQZqv7zptn44m7FlCGbrhHd9hhBxuPtDGspl46txSQAlJACkgBKSAFpIAUWNsKCJSt7RHQ9VsoEIMyJt6kR+G6KnWVy/ik8bFx6mVjsfj3w7z5C0Knbt1DXeduoaulY9WHxQvmh8/nfhY2GjwojNh++zBo0MCwePFim4wzkWTyyGQ8mT4ZXytOx4y/5hj65av0MZnnVUvAbG2DMlYjBWwIlNXWA6LaoIzC8Tg4qSfGAhrUGfM6ePHKt/GCGf61358AVq9/Rq07gB2x5BurOVJHjRUdSRHlOtVcYKOWQZmvdMlzjXRY/jHA67wBx0k5F5iurXtQrZECUkAKSAEpIAWkgBSovgICZdXXWFcoQYEkKAMmAcriSXLydFkgmu/joAxHmYGy998Pc+bOD4GVFOs6h85du4TO9Z3CkiULw6KFC8ImGw0JI7/yFavRwzGs+MfkMrnFaWF8HddXcgDmtZeYiHoBcvrnBf79mBLkqtquAmVVk7Zdn9hTL6dMmVIVR9moUaPCEUccYSuqkv5HmrPXxvJnQPJ+9/sLyMNqnLiicKo9+OCDVgMNEAbswX0GeON4zk06Jg4zvsa9Vq3VMGsZlLnTlecuzzXe3XWLZl5PsV0HrRovBaSAFJACUkAKSAEpIAVKVECgrETBtHt1FcgHytyRlXb1LKCM49gvCcreeffdMGv23LC6vlMIdfW5VK8lixcZKBu66caWejlkgw1sEkmqEhNfr50UA7i4CHmyILnXJsO5woScSSgvQFm8Yl+t1Cxb10GZ18HyePLxagtXX7yqo8MfB63ejureZfnPnlyMwqGvO66q7SjbeeedrYg8bi+KyJfiaKKuma/ICcij5haOMlI8X3nlFXOBcu+9//77JsA//dM/hYMOOshql7l7rRrj31pQlraCblvGa6VjMe4P5/YYq5VnX6X7q/NJASkgBaSAFJACUkAKtD8FBMra35it0y0uB5S5IFlqlrEvk2XcYVM+nhLenvx2mDlrTgidOof6zp2t5hYAa/7n88JnMz8NW26+Wdhl9OiwySabmKvNARnuC1/tMp5cx4DMJ4ExBPGvAQ/s664NB2e1koK5roMyCsR/8cUXNqZojnMGV1FbbVyfGlu8E0exy7DaxeUL9ZF7iHuDFzFOW0h99BUi2wKUjR07Nnz1q18NW221lYGyUsaFdpOCydhSe4sU3vvuuy/cdttt1m1Wq/WC9YcddljYbrvtbJVOUjFxllVjay0o83psxAuxQqw6YC+3vf6PBlmOj/8xIMv+xfbhnmN83JnLs48xrmb6a7E26fdSQApIASkgBaSAFJACUiBWQKBM8VBTChQCZTQ0zT2WD5Sl7R/XKMNpMmnSm2HGzM9CQ33n0KlLV0vz6ta1a5gze3b4ZMpHYZuttgx77rlX2Hzzzc35wGQ16YhocUPV1a1RtywGZsn2e32yGJhVw9VS6iCvC6DMtY7f+ZoJOim0pOoRb2gPDPIi8owJYxzXnyt3TJJtAHQAc0gDdKBDGwBRtIEi9jGYilN6Sx3DuC5eMkbTvie2GXfaRYF82klbWMQBbfiac86ZM8dcWtUo5o+j7Ljjjgu8OyhDk3I2+vP2229bCub1119vY83Y0kdgE/2bPn26LUDA4hRcsxqQshgoGzduXNhzzz1tkZA47jxWgEqMCTFDH4BKaALU9wUP/FmXrJlYTLfYqZuW0lrofL7Cb9o1PI08Pj8/494jtrj3GB82Yr9fv37WJ09/bU3cF+uzfi8FpIAUkAJSQApIASkgBYopIFBWTCH9vk0VaA0oywfS4glgDMo+/vgjc5xMnTY9fLlyZWioqw99+/YL3bv3CPPmzgkzP5kWRo7YzuoYUVycY3EApaWBJl0X7FvIiZHWJneJlAtlKjlQ6wIoY6wc+jA5BzSw8XNSaPmZgzKAA+CBl7v6gEPACybxgJVyxgUYQDogxdL5mhfgA339HSDirhpgFG3hnWvyThuAVVlT04gtzkn/qNnF9d215jDOF8lwlyTa8KJdvpIkOnFtiuGTmkhxd2KU83344Yd271R61ctKgjLGmgL1pGC+/vrrVq/srrvuslU7gXD8nA1IduaZZ1q6JzXMSoVNxe67QqDs0EMPDRdddJGBMsaGOGHciA1/OVjle8aRsSNOfWVP4pTvefevi7XJfw8wZjy5JuPN/cCLWGO8Gfu0lW3pE8AU15473Wgb8YSG/MMC9w33HwspcH6/9/ia+y8GZUAyXtwHwDLSZAcOHGj/cFHOfZe1/9pPCkgBKSAFpIAUkAJSQAqkKSBQprioKQWSoAxo4KteFqpTluxEvjTMuEbZxx9/bJP9Dz/6KCxcsiR8uWJV6NOnX+jZo1dYsODz8PmcWeGrO+3YApThiIjPnc/hlgRhcapT8ni+B87QV161MDFcF0AZ0IEVEEm1o1YVYITJvK/0R6wxsSe+mJx7+qO/U1Dei8oDIMpZ/Q8IgauJOKMtgCtAgTvb3JXjcekpuSweARwbOnRooMA99bqAVFk2zgn0oE7XM888E+69914DGhtvvLGt8ggkAoBxLWAFMAmNPvnkE4Mk/Azt0GGHHXYI22yzjaUo0gbaxO+o89UeQJlDJhxwTz31VPj1r39tK2KiAQAHKHjiiSeai43VNoFDAKhyxjrf2BQDZd/73vcMlBETjANxytjRZsaN2IhTvT1evdA+KaP0h7TSzTbbzBZAyJrGyHWAiIwl4AuIiMuO+KBW3JgxY+x8yY12AR4BpegI+OJnwDzg31FHHWWprMQUunMN4sphrEO5uD6ZQ2JAG6m3xP2mm25qY1ELz8Qs9572kQJSQApIASkgBaSAFFg3FBAoWzfGcZ3pRQzKvBZPDMroaKH0SxcibR+HVUy8mLy2AGWLFoely1cYKOvRs2dYtGBB+Hzu7DB6553C3ns3O8qSK17mA3JZ2+lF5ZnYMlHkVQuTwvYKygBhTMKBOQAgdz49/fTTYfz48SXdJ2effXbYe++9DS5RKwuXC+PjMKvQyYACuHWAHa+99lp4/PHHA20AHGTdtt1223DggQeGfffdN4wcOTLn7imWHogGXB84+Ne//jVceumluUvus88+4YADDjD4Qezi+AHO3HjjjZaKmNyo44UGu+66q0FDjmtPoMz7A6R87rnnwt///ncDPGgEvGGjjwcffLD1D9jEWGeFklnGshAo23///W1RAcAQcevprACoJ554IsvpDWSyKAGgjzjB/eoOxGLPknfffdeuA0xFm3i77LLLDJYBWJPbrFmzDMLecccdufpvvs+xxx4bLrjgAoN3PGPvvvtuA5RZN577wMPdd989cA8Qc7jTsjoqs15H+0kBKSAFpIAUkAJSQApIgXwKCJQpNmpKgUKOMhpaCEyldSQNmAHKcD5MwVE2aVL4eMqU8MXSZWH56obQp2+/0KN7jzB//udh7mczw6gdRoa9AGVDh9pEzUFZPhAXtyEL0HNQxrk9narY5LYtBqy9gjLAD1AEQMYkHViE+wkn1wsvvJBZOpx9pNyScoibasSIEQZRcByRIsZkvtCGKwfowYu2sOoiP8PBk2XDVcOLawM/hg8fbu4uwAHpaL7FTkX/mbvCcCY9l7SYcgAAIABJREFU8MAD4Yc//GFu/8MPP9zOSazhbMNBBLx7+eWXDZolN/ZHBwrec/32CsqAe2+99ZbBMsaEuHj22Wetu7imHDLhYgLwlFsXLW1sC4EyYNCRRx5psAtQSRuJFV+tM0ussGonMUGcAEJ5x4mVJU65NwBewDLiBZjr2x/+8AdzhnEPJDfi5vnnnw/333+/AUdck2jMRn/2228/A47ci5wTWJZlA0RzPe43jicdFrcd+giUZVFQ+0gBKSAFpIAUkAJSQApUQgGBskqoqHNUTIFSQRkXLgSk0gpU48hh8moFyd98M0yZNs3cZKsaQiMo69EjfD5vbpg1Y0bYceT25qghBa5UUFasbfweUOY1gbxGlkDZeEsFI6ULZw3bN7/5zXDeeeeZs6lQWhxAjIk7EIR3alKx4bAhLQ1nihemd9jlLrS4yD6pZMAKNibs5557rq2MCKjCYVMIpACcJk6cGB566CF7ARA4F440IIAX7CfOvFaYwy0ArtcIw+kFAOEY0tiOOeYYAxAAu0KpdZyLvnD8ww8/HH7wgx9YP3AacR7qTrEB7Z588knTAxBHu2gP+tIHXFWAI0+95L29pV76gwldSbkEROEoix2GxBQAFBCIg486acRJpbZCoIxrAraIMTTHfQiAosYXK+36mPgCE4B6xpZz8vI0WdyTbP/yL/9i9wguSOKU8Sq0AcqAh+iBPq+++qo5Mdmuvvrq8LWvfS0vKAM8E1/ENsdwv6IjcU7qJrEEjAUQc49Rc4xY477jGewpwvSD+40C//SNn9MWNkDd+eefb+4y+pIGhis1TjqPFJACUkAKSAEpIAWkgBRwBQTKFAs1pUBa6qVPEr2hWdxccafyFfMHlAFkpkydFr5cvjKsCnWhD6tedu8WPp83L8yaMT2MGjki7L3P3gYZ6usp5r8id+qs7SgE8gTKmkeKiTITdVIkywVl06ZNM3fM7bffbs4cJu++eXoasAgw4YXbmZxzbdLJmKADmIApvPtGOhkABWgK3EgDEKTOkW6JQ4vj6QcpjcAOd2sBvkh9BEwBrDgPQIHfUyOK9gNzSNVkA1bRPqDHGWecYe4aYB01zDhXmssmHyjjmlwPkAFg8WsAhXAiAWeAGZ7mBtDgOrjIaCsvHD/tqZi/jx/9BaIypgBUAA9uOzbGlTHAVQaYwT1HbFRqywfK0JlxJRYZS4Cqp1syHsAuAD1jQBz4IhTEKZATxyQQinffjjjiCHMM7rHHHpZKirOMccwHmCoJymgLsRKDbOIaSEZqKaAV+Ef8AYl99VnuUWL+tttus24QZ37f0o/TTjvNIDXxybGMlTYpIAWkgBSQAlJACkgBKVBNBQTKqqmuzl2yAklQ5sX8AUrJrZw0TNxannoJKMP5AyhbvmKVOcp650DZ3DBr+vQwasfGdKZGUFZvk9V4ay0sEyhrVrMSoIyaS/fcc0+45JJL7MRMzkkTw9lCzTEm3u62YdLNmOI2ohA5rhhigjQyUhEfeeQROwf743ghxe0b3/iGgS7gRnLjGqSvAftI7wPU4dhiXwAVwBfwAcAAWgExgCBM/Dk/IAcAwvU5FuhGvNEm7gsKztMWXF7AOmIyrV5ZPlBGMX76SzvYBycQ7cGBRHtw3AHK0IV7hBcOIEAfIIcXx6KnuTEnTar5VS99jBxiAnMYH5yGXpOL8SAGcC1R2J9UUzSo1JYPlBEXwDKveQc4ApYC7oBdjAlj7DXTvA/ECXAMyAX4o1g+4wSkchfkT37yE6u7Rrz4QhRpTlUHZaRfEnulOsq4RyZPnmyxS0wQz/QHVyRxg8PMUylJaSXmcZsBXOkP9zxwGrDMuYCYwEPuB8aKZy/xTiomuhDDcepxpcZI55ECUkAKSAEpIAWkgBSQArECAmWKh5pSIB8oS1vxMiuk8g62KOb/xdLw4UcfGij7eMq0sGzFyrC6IYReffqE7uYoa0y93HnUDjZZw4Xkq88VW/WylHYJlLUelKE3k27cK0AmCpP//Oc/txMzbjiwgEC4WoBdwIfYmcIYcCwvIBDwAGBAShoAjZfXFrviiissHQ13S3KjHhOpotRtYuKPK8aPYyVAQAwTfcAB1+cFTAB24XgCtPn1ACG4bBxEcC1gAcANAML5ADxptdIKgTIABO3EoQNEAcYAy2iTAwzcS7QJ4MH5eQHz3JmERrSvPYEyT68FRL300kvhlltuCX/5y19sCNEVByNusrPOOsvSW9sClOGuAhgBd9ko7E9b3HnlY+Kgi3EFugGhAEyMAc8vUjWJG34OqGU7+eSTwyGHHGJA1eFUWrpuJUCZp15ybUAZgJWvAY7eJ097xqnntdMYEwAlY4ILk7YA3YBl7qzD5eegDUcocVvJsampDz81RgpIASkgBaSAFJACUqBmFBAoq5mhUENQoBAo4/dZIFShVEdgFxCACdpHH30cJr4BKJsalq5YHlY2NITevfuErt27hwWkXs6cEXbZadQajrIsbcjaVoGy1oMyNCRtDTAFvKHeEkCLjQn617/+dasD5ZAM500MmBhPJu3EBmmOAAhAGdDLgRWTeLbLL788UOCeOmGxQ4e4ZV8m+BRBB8YAxRyC4EQ7/vjjDW65iwig4PDC24CriBduGuqs/f73vzfoRjoacYv7hnppp59+ujnBcFwmt0KgDEgGLDv66KMtrgEzaATgoEaeb/TNX7jQ/EU72yMoc0iOS49xvfbaa8Ott95q3cW9BZQEPrICJcX9i9X2KuVpnc9RlgRlXNtTa32VVQCljwN9INa9ViKxQJzhWiT2cHR5ujAreeLgAg5TEJ+v02r7VRKUoSFxBMgiPRSwRcoy1+eeY3NHo9879Al9gNQ4OoFkgG5Wa2XDTQZMJE4BmThCKzk2pYyj9pUCUkAKSAEpIAWkgBToOAoIlHWcsW4XPS0GytIAVFZwxbEOypZ+sTR88MGH4fXXXg8fT5tmkKyhri70oqB5125hzpzZ4dNpU8MuX92pqYA6jrLm1Mus1yyWHipQVhlQ5itd4rABHlx33XV2Ytw0ACom3MAyAFexQu1AN181k69xegGXAA04dIBdgCuHXLjZcPMAHXCA/ehHP7JrAzu4Hi4a3D2kbOLiKlSI39XAMQTQIT0QxxBxQjooGy6diy66yBw7uMCS9afygTJgCc4jaoxdcMEFOccR7QRGZNm4ltfIak+OMu8bEJIi9IAyXmw4uHBFoSe6Mk6VhDH5QBnXIDURuAWsO/XUU60NjBMxU2jRCtpNTBJzwCXi/h//+IcBXsYTMEVfgUtAUYBZmvuwkqCMhQjYALCkT3JNYpV7plhfiCvuNdp/xx13hKuuusrOBdz2FEwW9MDtR3qwNikgBaSAFJACUkAKSAEpUE0FBMqqqa7OXbICaaAsWcyfk2YBVWn7xDXK3nnn3fDi8y+GaZ/MCD169wpduncPvXv1MecOk7PJb04Ku++2czjk0INt8uo1yvy8WdpQrK0CZc0hUm6NMjSMQRmA6frrr7cTkyLJSoZMuHG2AMuKFWonDRIIgesQ2EBMuuOMNDiOx33lrhgvxI97DHfPpZdemusUddGAdMA1HGZptc3SbhLaAMSgVhmOMl4UoGcD5JxzzjlWdJ7z4TqKa5XlA2VAO7SiX7iXcMbh1KFPWbf26ijz/qENIPXmm28Ov/3tbw004oBCa9L8/vVf/9WcUG0BymgT8cj1SYElpZYYxeFXDCxxLDEJoMVZRpowfWKBBpxqxCd9GjduXDjhhBPsvG0FyoBzpBkDyADDwOos/cHNCWwjJfZXv/qVAW3iG4gJIAPuEvu41rRJASkgBaSAFJACUkAKSIFqKiBQVk11de6SFUiCMpwuAKosNcqygKsYlL3/3vvm0pk+49PQtVuP0LlL99CzZ6/QuXOnMHPm9PDee++EXUbvFA484ECbyMbF/CsFywTKKgPKSAdkxUhqTQENrrzySjsxNcqAEbzj1sHlQk0uNl8gwoFXWrHzLAFMjSVgBalnQBjSPoljtv/3//6frZSJayleqTItntnfV7EEGlAgHWcbkIyUzjvvvNPOCfijsD99AaoAWqgrFsMgjsepBFz7wQ9+YL8CGnobcBnhcqN+WylbewdlwCXueVZYvOyyy8z5BGhEZ1xdFMEHlAHQKrXlc5Rxfi/c7ytV5ltRtVBbALUU9MchB2TiWQVo5X4AiLJqJFA1bbXIajjKWJ2V1Tfpi6/ombboRLJPxBaxTpxz//Ls554kjoHN3//+9w0mCpRVKjJ1HikgBaSAFJACUkAKSIF8CgiUKTZqSoFSQBkNL5bamPy9p14CEmYAwz56L3z00ZQwa8bc8PmcxaFb1+6hR8/uYXn4IqzstDSM2n6HsOtOu4fNN9k81NXXmcPIt1JgWb66acAazgkgwQUSO5XW5sAwuZ8wYUK45pprrPA5KWK4bABCp5xyihULxzUS17VqbXvLdZShrbu6gFUPPfRQ+M1vfmPNwUUFDCEVDccQzjLgErW9cLkwGQcy8Y7jphxYRm003GSkwDHR/9vf/mbF1tlwKO27774G6tCKa3GNtFVc2Z/f4aAkPqmn5XXXSKtzUIa7BsgFPMDpSBpoPA75HGXsBzTE4cM5AIcsbFDK1t5BGboDM2+66SaLEQeHwBi0IW22LUEZdeYYB66N65DxLMXhx9gRK9yrpCyS+kssUxSf5wqQDPchtc+qBcp81UtPvQTOjR071vqD+xJI5gC4WKwBuu+77z6rUUa/cHZSfw1d/uM//sPiXqCsmIr6vRSQAlJACkgBKSAFpEBrFRAoa62COr6iChQCZWlgrNjP0gAVIIJJ5Pwl88OseTPD+x98EN546a3w6tNvhbCsLgzcZL2wwfABYciW64fthm8ftt582zBk4IYGMVaubAZl8bWzuNnS2uqOMs4tUDbfahSNHz/enGFAItIo2ahPdN5551kB+2QalxfCB+6x6uXdd98dfvazn9lxTLABYEzWHZiRmsZKerhdeOEe4tW3b9/U9LRiAQ48BBIAYEgTI/2NOl5s3/ve9wxSAKdoQ1yYPe28/nvik/5QUwwIh2PonnvusUMAKw5XACzALtruWz5QRm0nakbhbmP1QEBb2uqdhfq7LoAyYooadriWiCUchqzSSGxdcskl5thrq9RLYoNFBBgLxoUYZVXIUjYgMSm6Dz74oN0vvmAB58B5SMoi10mrQ1cJRxmgzAvxc81vf/vbBtPpE0A6WUMvX9/Yj7p3uCAfeOAB6weuSu4vYvy//uu/TCuBslKiQ/tKASkgBaSAFJACUkAKlKOAQFk5qumYqikQgzIcEEy0kjXKirnIaFy8T3L/+rr6sGr1qrBs1bKwZOmiMHPmZ2HKe1PDjCmfhhVfrgrdenQJAzYaEAZtvH4YssGQMGi9waFfz34h1DXWBUpurXGWtTdQ9sknn5ib7KSTTqq4o4yJMRP+UkGZjwdasvIfq17eddddBj9oL+eNNyAZ6ZBANE9HxHFGTSQgBfAEYAVgIwZ552f5XDG4kVihkvpkpLsx2ee6gM8TTzzRgAHnd6BX7Obh2sRZXIPKdeFYr7VGuh4pdbjkSL8sBspw97ACKPu7uw5oWMrW3kEZLiWK+QPKvI4d6afAHla7pKYXMLGtQBluQ2qIeUpwMo02y9hQcw6wTNwDbKdMmWKxyEYK5Pnnn2+rRXoR/Ng1WQ1QBhxmVVbivhSHJrGFI/Sxxx4zZxwpzdxP3EvE6f/8z/+Yo8xX0MyijfaRAlJACkgBKSAFpIAUkALlKCBQVo5qOqZqCmQBZUkQ5o0p5Opq+bs6KlSF1Q2rw8pVK8MXXywNixctCUuXULx9ZairC6FHrx6hd59ejSl6nbuGzp06h7pQFxr4X0NDq2BZ3N72AsqYnDLRxuUF/OFV6dRLB2VMlN1RBtRgK+QoiwcDJxeuLupQUavs9ttvbzFWTNyp4UQaIi4ygAhwjHQ3xhrXDV/zM3ec0W8cW/nqLHE92owLhsk9CwtQMw3nC04YXEKeTpcvBTcZUA7VqDXFaoDoDjCgf9R+4ryAMqAOda7imlr5HGWAsiOPPDIHyji+o4Ay191XE/3Tn/5kKcVs6ACgYXEDXIukpbYVKGP8iG2AJzHpKcGlPGBxHuI6xNFI6i99efTRR+0UgCVqhuGWAxCT+hs7MqsBynDlkfIJKCtlY4xwhHIv0X7uIdxkxD3p0iySIVBWiqLaVwpIASkgBaSAFJACUqBcBQTKylVOx1VFgSQoK6WYfzGAllavDHDCzwFWOHi4fkPD6tC5cxdzErn7LFlTqhKwzK/LNdtL6iUuLSb2pFZVGpQBMdw5NXHiREvnypJ6GQci7hom2DjLmHQ///zzVgycsWSFQKACqWpci7TGtI20RFbrY6IPVCM1D+gFaPKi+bFThuvcf//94dZbb7Ui6rSBscWNxte4YrICsrT2AMFwpwHqaDeQDHiHEwpwAARxtxDH5wNlOOYo4s9Kl/QNQATEK2Vrr44yNGFsiA2AEsX8qYPFRvoqABJABuDZZ599Wjj0StEnbd9Cxfyphwac416iDiBjjIO2lI3z+6IPgDJcZaRhspFGCtQmpkn/BfjGtcqqAcpYPOLUU0+1GmWlbA7KqMeHq5QxoT4ZKxDj/PzpT3+q1MtSBNW+UkAKSAEpIAWkgBSQAmUrIFBWtnQ6sBoK5HOUMYnKUgcsH5BIpkfmVjokn5JUzSanGECMfUmz61TfOGHFeZZWfL0SsMyL+dc6KMONwiQb9xSgjNSqfHWPyo0LIBAQgxpFOMocanC+rI4yh0Scy91dgCpepNcBzaiDVmgDhuHSAkTRb0AZL69xhjsM8OYbDp57773XVh10J5ivrgrswxFWyQ23E7ALEHHYYYcJlGUQd/ny5ZaCizuJ8Sc112u+4dADogKrSCum/lucyprh9AV3KQbKKH5PaiSgDEiWtfC9X5TzA4aBy4Ay+oe7ke2AAw7IpXbiygL2CpS1dkR1vBSQAlJACkgBKSAFpMC6roBA2bo+wu2sf4VAmQGtAmmPcVez7FfI5ZPl+GLtyXKOWgdlwJ+bb77ZUvSYYAOagAlnnXWWAYVKrnoJUCLVklXvmPCz4h0Os1JAmccA7kAcRLjHgCO0G1AGMPPaZVxv7ty5lrboKW/u6AFWuMMF1w9QEDiF0wx3S7wyIaAMRxk6AWSog8W1OSdgAicX8M1hL++xI83jJFnPiTYQH7QR1xrf4wrC5UYqLPAOwAIwy1KjzB1lXqOsIznKgEmkxOKgIrZI7WN1VDagKGNF3TZquJEGybhVaisEynB8nXvuuTlQRlpkOY4y4pt+uaPM+8b5qSfojjLittqg7Pvf/74588p1lJF6yUuOskpFoM4jBaSAFJACUkAKSAEpUKoCAmWlKqb9q6pAWuplsWL+acAqC6RKS8X0ziUdaMmfZ4VyyWskv69lUEaNrxtuuMGKng8bNsxWCgU0ARO+9a1vWYpavNpiawMDcEVBctLiAGbAC1wybIA5gAJphvlqhaVd31Y3nT/f3Gk4zEiFxD0EyAJqLVy40H7P6noANRxzvJIbzhyK6JOeB1Chfplv1IcCvADLgFq4yEgZw3VGuynUjluILW0xiHy6eVow9wT94HvuBV9gAEhJXStcbzGwLJZ62VFBGeMKeCWmcF098cQTJj0QdMstt7QUTOAvQLSScV0IlFGjDHcmcQ2MJtU8ditmuaeIafpGmjKgDCBM6iIbq0TixuT8xCyxE98/1Ui9FCjLMmraRwpIASkgBaSAFJACUqCWFRAoq+XR6YBtywLKkCULCCu2X9a6UcVgV7nX8RplDkGAHbxKWSmuWiHC5B5YRcHzq666ytIQAU28WKnv4osvtvdKFj0HlOEk+e1vfxsef/xxuyaTfjYg2dlnn20T/lIcN75YAhoDqTw10mtWcU3AFqlrXGvChAlW18w3oAUuLhw7XJt2ADeoE+btoD7UM888s8aql5zjl7/8pdURw/3F5vXossaetyN2nREfvHCY4UCijbEmAmVr3hXEMws8sJoioIy6V75QhENQQBlpmEDhSjolC4EyYPNxxx1nMJWYcndjKfc14Jc+sdIlABDgC3Bm+9rXvmZQGxjIvZp0MwqUlaK09pUCUkAKSAEpIAWkgBToKAoIlHWUkW4n/cwHytJqlJULy+LjsgCLcq8TA7R81wHe1CIoI30Qh8rf/vY3q78FOAAWkcrIpP473/lO2Hvvva1uVzkFyNPCEWCFM+vf//3fzZGFy4fVHgEN//zP/xy+8Y1vWApZKaCsWNjjKMMFRloeqV5AhilTpphzDgCG64w+03c22nbEEUcYxCOVEWDlda/QC3cZxcg5F9tvfvMbc+A5KCvWnkr8XqCsWUXuO/RgjACgd999t7muiCF3KzI+jCkLHJBWC6yK0xNbOyaFQBmps6T2kqZIWi9QNk7rzXJtQBm1/UhZpo98DxRkGzt2bA6U4dBMbgJlWRTWPlJACkgBKSAFpIAUkAIdTQGBso424jXe31JAWQyi4m6VCraywLK0a1XiOrUMyphsAxZw4QCEgEWAJWo6kc5FLSdcMNRzKjVdLBmGaAmgImXskksuya3uSFokrq9x48aFM844wyBdDMqSDplSwxtICRTkRewBGYB0OHOAD6Rk8j1tY8NJR/olUANICEAEilGnjNUGgS/ARdrN9r//+7/h4IMPDltttZXtW2qh9lL7w/4CZc2qATl9IQcAGfEFHKKmG2PGdtRRR4UzzzzTICyrm5ZTJ6zQOBUCZbgUuY9I9+S+2mabbUoGZaQRP/vss+b+ZIECVkAlZoll0jrPOeccq4GWBv8Eysq5w3SMFJACUkAKSAEpIAWkwLqugEDZuj7C7ax/aaAMx5KvOlkqnMoK0LLAskpcO61GGa6lWlv1ksk30Ad3FC4VYBDphYwDzpvDDz/c3nFW+Wp65YYakAqggYOL9LF/+7d/M9iDuwa4BCg777zzwjHHHGPXTHOUeRprGtD0NMWsKa1Tp061tDz6S5sAhqTqsZHGRq0ywAZF9UlnYzVFUjcBL7jKLr/88ly8Uq+JtDfAGgX4gYpZ2+EuyjQ3padf5lZvrWtcvVWgrDkK0Q1gxJiQishYUqMM9yBjRxoxQJMxBSgBYVl0Id9WaBzKBWXUuwOich/h0CS+gXWlbNwfTz31lK26CtgGXnvfL7jggnDKKacYjEuD2QJlpSitfaWAFJACUkAKSAEpIAU6igICZR1lpNtJP2NQxqSV4tblFPNPAybFfrY2YBngqRZBGW0CLLz++uvmlOL9gQcesCgCErFiIhN8oBHF4SlEXggy5As/HHW4trjWpEmT7Dp/+ctfrPg+BdW5FoCJumDUkuK6SVcWGgILOAbgxvdeiwzIisMG+JA1pY1UTPoMYAF+Pfjgg3ZutvPPPz8HykgN5dyAPvpAQXVA36WXXmr74kwi9Q1IhluIvgAVs4IyzouDDxDHi+/9vKTR9e7d29I/6VcMQdq7o+z44483dxfxRQH6tJTBYo8zCtwzZtSdA/TiimRcfVEHxoZ0R9IsqSGH6484LuT4Ax4zDjjE2A+HltcVLBeUERP0j1gCPgO0SP/Mci/5QhVAWsDuHXfcYcAMpyOxwT1FyvIJJ5xgMStQVixq9HspIAWkgBSQAlJACkgBKdCogECZIqGmFMgHypJujkq4u+KO+/mywLI04FZOe9wFVYugjHHARYYjh5Q1ANCtt95qkuF+WbRoka3kCAjCMbX11ltbOluWCX6sO+lhwAxWIPz73/9uIIJze00w0uJIRwOcAJsotJ6EGcA2nDGkSlIjDKDhLjUcX6xkiHOH1SEBJMU2YArQC1hG3wF3gDg2arPtvvvuBuxwvHF+rg/Qog3UWPvhD39o+/rvgXUUbD/ssMMMlmVJUyU2aAe1td577z2DiK4J8Aiwgha8s/LlurTqZWtBmbup0OzNN980Z+TDDz9s0J34JEbYjj32WINjOMko4k8duUKgDNDG/cC4MIZASsaC+6DQSqz5Ui+Bt4A64h/QDITFVca9RFwVu5dww7399tvmeATo4oAkXjkvQJZYBwBS0J/4Fygrdufr91JACkgBKSAFpIAUkAJSQKBMMVCDCmQFZWmwKuvP8sGwUmBZOWDM5Y6PBbLUIiijXUzw582bZ5NwHDn/93//Z10AKAAM2E499dTAyn3AM4ABsAyHDK4pJuq8gA+++iTjy7m9LhgACpjBggG33367nRMnEXCIDUcMYAqgAXjCwZV0ZHE+gAEwj9UygVwAA9/+8z//02o0kZKGS80dWDgV/VzuQMOJBJwCpgBYgBjUtcIxxvajH/3I3G3AO2AG8IUNdw91zLj+lVdeadAu7seJJ55oYAYgg0aAFUBIXA8LjegLGgFBWMgAHXDZ3X///dZH337605+aLqQQAka8Hfy+PTvKSD0E7PAOCMRNyJixoU08Xg6a3UHIO79HO6AidebQjnjwwv24tRgnxo4VTNGQ2AV4paXFcg1cipyTWmecl3FxpyJtjBcASANm+UAZcIx7xWOdxSqIU2+Pr4BJnPo95Cu38sygH6SSEvekC/sCFGjFAgXEGoCMd2I/DRIr9bIGPwTVJCkgBaSAFJACUkAKSIG1roAcZWt9CNSAWIE0UFaoRlmlgJW3Iev5Stm/EJirVVDmRfIBWgAaVtRjxUc23Es4wQA9gAbcKzibeMe1BYRgH8ADrhtS1JjY4xTDecWx1IfCmQN0IEWMa1APjWMAWUz62X784x+bEwt4QDoZrpg0UMY5vAA/YI/2sgGScAzxTgokkA9AQRs5n5+LcQCGsPIm8ADQRuolLiLa6GCQ4vxACCAY4CFuC7WvKKp+5513mhvNFwagHaSNjhw50tpBahzAz2uWOeRCI1+FE1gH/ADY0TfaAPRhQwvquOGUA/Cgbwxo2jMoA+o4eCWeGCdPmY1BGVAMOIlmvOMiRG+gFmMG2CSG0I1xBSqhrW+dRRq1AAAgAElEQVTEwUUXXRQOPPBAi100THOTcU13VRJXxAdOS67L+AFwcYABohgL4j25FQJljL073LiXALC86DtxAnzmnMQ94wrIxXVJH70uHlCWvnGv+rlY+IJUTvR0CJhW20+gTJ+/UkAKSAEpIAWkgBSQAlJgTQUEyhQVNaVAqaCMxmeFW1n2y7JPLFjW/fPBMgdlDqAATFlrWLXVwAEbvLg98IbJNaALNwxAAhCB28vTxpjg44Zhku9uJ2AB7jGOY5IPxGBST5F1XDocA3gDBDCxB5AAH0gdcxiXr79AE9oBOMCdRluvueYa2x3gwPWAKKxsyCqDgAiAHlDO09v4vZ8DaEddK4dt7I8rCXfOd7/7XatpxfHJDRDIfrh8gCq4mB577DEDc0A1QBpgxdvgcAXHFPEB6AAeojFONl7eBlxoaIJWFJ8n5ZV01DQw055BGfrwwqVF/KCN1yjze4j7gz4Cx4gXXgAy4hTdAUe+xXXcOJ6xYOzQHiAHREXXfBvXAcCSfvuLX/zC6iVyz/qGU5CUYMaCdNy0uMgHygBt7koE1BE/xC9xRrsAcDjWOCdx6iCVOCLWcaJxLxLvbEBY2kZcn3zyyeZ85BzAOEBq2nNFoKytnqK6jhSQAlJACkgBKSAFpEB7UkCgrD2NVgdoazFQVmkwlvV8xWqXJX+fFaC1B1AGiABw+aqBFPWnFhcQAkDBBkAAaAHMgGMAHCCAwyigBiAAqIb7BSgFEKL4OKDLU8s4F0XWARDuBAMoFCrEj9bACM4NKKF9niYa3zJjxowxmAE8w9EVF8H3NFMgBA4iYBnAy7d9993XCqIfdNBBBkU4PrnhbKKPrJCJo4x0ydtuu63FbhxHv2gDtcUAirGjzF1ttMGdTH4C0hHRmJdrk1bHam2CMlxaFKTH9Ub/AHxpOuHMIp6AiRMmTAi33HKL7YbrD1CKTsQQ2gCR2Dy1kq+5b9AbuMjYEaM4vYBkxFraBqAktRGw5a4t9C9UMw4tgaaA1+uuu26N0wLbiCkcg/mALu0DClNLDFcgsUUqM30D2BEL6MTYEzNsnhIK2PM20l+ArrsccR1yH3nqJsdRC4/7x8EdALpQXT4HZQBr7kegIGPDdvXVV1sabBr8A+gC6Kj9BhzmGHc8stLraaedZu0oZeM+RhvgMunOXIN7gPsJjVgkA0jN80CbFJACUkAKSAEpIAWkgBSopgICZdVUV+cuWYEsoMxPWi6cygKxsuyT7Fyp7XFnDE4RNl9Br9YcZd5PJujAIybHgCDgGQXTASIAG6+lBPSKX/QnWU8K0AH48FU/0QDwxmQdNwwTfsAU0I0tiyaci4k/7bvssssMxJBWx7njemC4a3jRxmTbiD9/ASWAEUAH3DmksVGMH7iR5uRynQA1pG6yWiZAhPPQL9pAH12nWC+OdY3Qxl+0hT6xnXXWWeaCog0OJNPS6dYmKLv44ovNMZcFlOGKApSRrgooYyxwQCVjJ23s43qCfB3Hl8cV7zgX0YPxA8Lh1mI83WlV7AHFsQCh66+/3sAR8JcXsQ/AAuAwFjgfcVSS0pnc8jnK2I/2oBfnADoTNw899JDBIM6fjNNkjPA98YaWnAPXJPcNINDTNgv1sbWOsmqBMmCZLyYSg7JDDz0090woNnb6vRSQAlJACkgBKSAFpIAUKFcBgbJyldNxVVEgCcqAR8AAJr3FwJTDhnL2ywrGCjnLSjmHT/7pb3sBZcAbX4URhwzuLSACEMiL3ZcbFKSY7bfffgZYcOgANXzlvlLOSXon6YkAPNwotBOXCkAAt1cpG7XRSGcDOtA+3D3AB1xy7nLKdz4cNn5t3p977jlrh6+embUdQA80QQsAGe2hHYA6wFsaRPLFEnAasUiC15bjmqwiCijivJyPc5WyEeMADMAMUAdH4E033ZQ7xbhx4wzmMYa4mQo5yhgTHEzARKBipTZih3HCmUb/gE7ubsMd5YtCZLke9yf9vOeee2zVV/rt9yvHn3DCCeacAnahZ77US1xXONO4XwCDpNWy4Wr8yU9+YucAeHnqMCCaa2XZqJdHqirnwDGH9r4SaqHVODk3MYKbDAcX13ZXGL+74oorwjHHHGPnSm64vXACslIt/eJY3y688MJw9tlnm3OvlI3Y4r4FvlHnD4hKPTbfrr32WnO4yVFWiqraVwpIASkgBaSAFJACUqAcBQTKylFNx1RNgXygzF0jaRcu1cnl5ygFbMXXrUQapp+vPYEyd7MAnJhgM+lnxT2K3med1OcLHEADLjKvc0ZtKl8xs5RgQ09S1JjIAyMAVEzkn3nmmRaT7iznpBYYBfMdvACnqJcVr5aZ7zy0w4v5kw4IiEAvIF4pG2AANxQQBrcSLiPaka/mFOcGlAFdgDMAh//+7//OXRKIBZAEqLC4ANColI0Y8FpuQC6gxt133507xTnnnGPpqbS3ECgjxZUYQhvqf8V1xUppT9q+e+65p7n+cBNS74yvAWekOjJ+pFoWSkeMz4mWtJMYItZZcCKOdRx0xKzXJ8tXzB9IClgCSiXTcQFwnIOYAQ6hBWmaXp+umB6AT9KKSc31+m5pgDLtPEDcJ554wq4VjyP7/vrXv7ZaeIxjcgOWck/9+c9/NoAYbzgfgWWkB5eyEVsAN9JPr7rqKnOExhuryR599NE2ltqkgBSQAlJACkgBKSAFpEA1FRAoq6a6OnfJClQClHHRciFY2rFZz+WdLWX/9gLK6FPsXmKiDIhhMutF+kkdI82MulGevugplhxLSh2AB9AEsMARhaMGKEZKIs4pAAtOoNZutBdHGbCM1C3qolEDivZ4IXicQexHe4AnvDyFlHbiIsNNBkxycFdqu9AGGIFW8+bNM1gHQPPadLTFa7RxTQAO7zgpca1RqwsXGY4hXxghbXXGuF2+IiTuP1JlgTyMCxAHbb2YvZ+zlD6hl9dRYyVJoBE6UyOMMSSlkfaiGVAvrbYcfUYLrwfnq3p6/0tpD3HF+PkLbWgH1+X6tMPdZMV0S7uuLxRBX71eFqCQGAdGEa+eZsqYpdWMA1qSAgpw450UZl7EJDFG2ibQkmtxDfRAGxYnYB9PT0Y3j1fixIEf4+kpoL6iata+EiPuuCQ2geC8AxUBqtSbS6vHRwxwHGCLvqAH9z/3FMAOIIvTrZTN71kcfGjFOXnRJu4/zokTMisELOXa2lcKSAEpIAWkgBSQAlJACsQKCJQpHmpKgTRQxgTaUy9LSX3MCqxK3a+YoywfMEs7zt0/HFPrNcriQGECyyQeQOLuKeAHtZv4Ob/nd7i7+L1DMkACL9IXmYAz6fVV+YAb7tqqRFAyweZFWxxMeVoik3pejAnQgTYAWHj3ul/APH7GuJTjbqMPvlIh7XAo6sXnAWZAFNpEjAPGuJY7n2gH103+rFi9Nnf+oT+gjmtz//j5uA7X4Ly+omQpetNm7wPvfO+wj/P5ublOmnOLfZPnQCf6Vaxvae30Y/x4jzUfV9pEW8o5N1oSP4wV8YKmtN3jxkEvWjoETraR8fXjOZffE+gA7PL7gHNyDY8Lv4f4nuvyPcf4+Hmc+Dv9dACdta+cO76PY7DNPQpszAf/OI7Yoj9eF44+0B76BNwqdXNQR385J+ejTcQu7aE+XLG051Kvqf2lgBSQAlJACkgBKSAFpEBSAYEyxURNKVBJUEbHSoVgsRiFUjqzwLJi1/Zi/r5KX3sCZWkwAChDyiMTaAchTKKZ6NJXQAKTbuBADMracuLL5NvdLw7KaI9DsTQoUOkbxAGIw48kKCMOCq3EWOn26HzZFXB4wxHuksx+dOl7AhAd0OUDZVndY6VfXUdIASkgBaSAFJACUkAKSIGOqYBAWccc95rtNWCFiSGgBXjhxfzjGmWluMpqFZbFxfzbEyhLpmDGgcSkHoeKO7iAnkAgH6849RIglS9VrS2CE83dGeQpf20Jp4hz9IpTLz2drlgB9rbQR9dohOxZnVnV1CuOFdoUx2u57Sulb6Xsm9ShNcfm07Qa56zm+OncUkAKSAEpIAWkgBSQAu1PAYGy9jdm63SLs4CyfPArFqaQG8z3K+b4yrJfFmdZofZ6vSz2ac+OMtrvbhvXJJ82niIXv7dlUDt09fYlU/eq3ZZ80DdOPSwXgFS77Tp/2yoQ30trK17btse6mhSQAlJACkgBKSAFpIAUWPsKCJSt/TFQCyIF0kCZ1yjLAr+ywK1CQC0NahUDallgWb591iVQpkCWAlJACkgBKSAFpIAUkAJSQApIASnQ3hUQKGvvI7iOtT+uUeapl8WK+ZeSilkMepUL2rLAsjQIJ1C2jgWwuiMFpIAUkAJSQApIASkgBaSAFJAC7VoBgbJ2PXzrXuMBR16jjDpWwLJkzaassKsU6JX1nIX2KxWWsb+vxkiqHavF8VLa3boX1+qRFJACUkAKSAEpIAWkgBSQAlJACrQPBQTK2sc4dZhWAsooCE+hc18lkfdOnTqFQqu7tcZVVi4ky5IKmraP16iiphegjD47KAMMCpR1mHBXR6WAFJACUkAKSAEpIAWkgBSQAlKgxhQQKKuxAenozQEcLV261FYkBBgByfwFLEtCpGKwiv3jfYrtj/6VAmdp54ohGV8Dy3jRNxx0vATKOvpdoP5LASkgBaSAFJACUkAKSAEpIAWkwNpSQKBsbSmv66Yq4KmIgDJfRZEdY3hUbFXFtBPnc5xlSZfMCs6S18137ni1R1xyvICB3bp1C127dhUo070hBaSAFJACUkAKSAEpIAWkgBSQAlJgLSkgULaWhNdl0xUAjrHyJamXvMdfk6Lo8KwQ+HIXWdJNVg3NaYdDvGLQDSDGvrjHunTpYi/gmH8NJAOYyVFWjZHSOaWAFJACUkAKSAEpIAWkgBSQAlJAChRXQKCsuEbaow0V8AL3DsgAZsuWLbNUTL7GcRY7zUppWgzQSjmuUvvG7jGgGJCMVEtAmUMyIJo2KSAFpIAUkAJSQApIASkgBaSAFJACUmDtKCBQtnZ011XzKOA1vABi7iiL372mV5x+2V4cWA7KYkeZu8lwkvnvFRxSQApIASkgBaSAFJACUkAKSAEpIAWkwNpRQKBs7eiuqxZQIIZlviqkrxCZBGXtScg49dJX8fQVPdMWKmhPfVNbpYAUkAJSQApIASkgBaSAFJACUkAKrAsKCJStC6O4DvYhbXVI/5m/t7duJ4v4873DM961SQEpIAWkgBSQAlJACkgBKSAFpIAUkAJrVwGBsrWrv65eRIFyV5ysZWGTqaLtJXW0ljVV26SAFJACUkAKSAEpIAWkgBSQAlJAClRCAYGySqioc0gBKSAFpIAUkAJSQApIASkgBaSAFJACUkAKtHsFBMra/RCqA1JACkgBKSAFpIAUkAJSQApIASkgBaSAFJAClVBAoKwSKuocUkAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkALtXgGBsnY/hOqAFJACUkAKSAEpIAWkgBSQAlJACkgBKSAFpEAlFBAoq4SKOocUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkQLtXQKCs3Q+hOiAFpIAUkAJSQApIASkgBaSAFJACUkAKSAEpUAkFBMoqoaLOIQWkgBSQAlJACkgBKSAFpIAUkAJSQApIASnQ7hVoE1DW0NDQQij7rvk/7V5EdUAKSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSoP0rUFVQ5oCMd3vBx5qgmb07LLMvW8I0l9Z/Whdpzc/i7/MNQ7yff532zvH5zl/oWqW0I75GluPS+u180dta7j5p10/+LN/3WX6epnuW8cyiS1KD5NgnxzdNsyyxE5+30DmzaBm3IRnl8VjydaEx9TYVuhfi8/v5iu1fbL+4Tcnzp+mUdj9mHdusxyZjrNg9nO/3WcYvX9vT4iJfPBbqV74x97gp1Les90Ox/bJ8lOXTKo7LrONcTNP4eZG8X7Ponva8KaRzrLXrndy/WKwk7+34PGnPnELPySzjkbz3knFSTMO09uXTNk27fM+CfM/LfO0r1o+050+xZ3ih51TW+6rQGKQ9f9Kez/k+f5IaFYutfPdvsX4We+7Ez/5Cnz354jd578fXS37uFBr/fJ9bWZ4npe5TymdHMjbzxV3aOMRjnC82ij2XS42L5P75vi/0/E0+F5L3X7F7r9izN+25l/asTWpWSM9CnwnJ45Ixn+/zpdgzuNS4y/csKHadQs+QtHsqS7vic6aNb9Z7JMu1isVwoXMUiudi1873bCx2zmKfo2mxmhZDyfMUu27a3+Fpn+H5ntNpz5J891op10qbb5YyZoX+Dkn77C/0/Ml3rmKxUOg5nnx2pH2f71lU6HO52OdfvnEspS/JZ0e+ey2paZZnTtpzp9B5yu1PWowW+9wt9nwqdi8kP6MK/W1iv2tI2r2yKlhgvzUAWUNDWJ2DZY2AzEFZ476NIM22ujqDBbmb035ex49zG/vW8YNCn44G5ex0tvnXfmzz942S2vmatpbHtfxdTDIa29yybWmyeN/8GvH5W+wfdXyNczf9Lm5/7uZNPKWT7W+UNe5fAU1zGiQ1aRY7eS6+z41JEwzN19ekFmljE/+scfBakky7lkdInr5nbU/zoOenr8nYaWxfih5NIQz0jTXy/Wlz84d341ctdGq8E1r83PveeHskfpfQurldfisxLs33QK4duZuiSVpupTX2a3nv+D3S/LhYM+6T91Y8bvH9Ft/LBR4ja97v0f0Z37PN2jS2KXqUNN37a2rdqH3jOLYYqyZov8bzwA6IWhvtt8Y5WrSzpf5xvDVHUNq4Nl6u8Tct79fk8y93P7R4Rq7Zv7TnTlKrQuPR8p7y8zcf4dq3GN88n/ot+hBpm4yTFtrmnoHN1275ubCm1nH/0p49cX+Tse1xlXyWtTznmvdJPHKNz8am0FnjWdX8OebPjLyfDUVulNS+5Z5Hzddv+bnXcuzi58Oa95A/U5qPSX0GtvisTWqT515IfD7bZ2oiJuL7NX5u5pMl+Uzw/ZrN7c1/1jX/jdD0uRLPDJpvwhb3f9pnrO+Qi8nEZ3ZLfRvHvsVnC72Orm2HJ+/pxHMo7k/yMyf5udmsgV+7sb/NsZf+90y+mExeuzkeGp9Za/7N0dj4tOd/MpaaP0vW/CxNjnn++yuOv+axjZ89a3zeJv5uTD4f1tA496xvftC1iKemMU777I5jMt9nYtrncurfq01xsebfty1juoWuiXjj2+Tz0v+283HL8rdrHGfxcc1/QyTGJdLI7vymz+WmJ07K3/D+mZj4+ynt83yNZ0vjMWv8TZf42zvv3+ot9sv/PMs3tvHf9UU/j6PPO3/+JZ8hyWdl/PsiHxmRBk33a9OzIPkcy/o3u10v5fM+Xz+T98maf+enfeYk5nSJ52HyfvXP4rQ5S4vnYS7umjuRvCfjmGkZ12l/dxT+W73Q3xZpfz8l5zO552jzx1ij/AX/jm/5jMq3b8vPtpb3qn/25vubN60NLe6F3HMq399qzZ9B8bPKr5t6X6X8zV4o9pNtTz4Lks/IlnO25jlGki20jL2WsZv2d3b8LEgemy/28n+mN/+9v+bfTwlN4+d+AaHS/wZMzHsTz80W45Ty90/a+KXNK5L3cep8ukmk3L2U6FdqfEfPi+a/X5qefwUmphUDZf4w5d1fOTjW1CL7ud9JTTd1IzXzh1Ozo6bYQ16/lwJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQApVUoCKgrBGSNYSG1Y3OsdWrG2HZ6tWr7V8rm/+lvpJN17mkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBaRA5RRoNSjLuceAYg7HmlIrgWZxWmVjOkXWCgeV66TOJAWkgBSQAlJACkgBKSAFpIAUkAJSQApIASkgBYop0CpQBgdraFhtzrHcy37YeNl8BfqLNUq/lwJSQApIASkgBaSAFJACUkAKSAEpIAWkgBSQAm2tQNmgrBGSNaZXrl69KqxqgmXFCia3dQd1PSkgBaSAFJACUkAKSAEpIAWkgBSQAlJACkgBKZBFgbJAWZxuCSgDkjVYPbLURU+ytEP7SAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgbWqQFmgLE61dCfZWu2FLi4FpIAUkAJSQApIASkgBaSAFJACUkAKSAEpIAVaqUBJoMzTKs1Ftqox3VJOslaOgA6XAlJACkgBKSAFpIAUkAJSQApIASkgBaSAFKgJBUoGZcAyg2RNoKwmeqFGSAEpIAWkgBSQAlJACkgBKSAFpIAUkAJSQApIgVYqUBIo85RLnGSAMr5nq6ura2UzdLgUkAJSQApIASkgBaSAFJACUkAKSAEpIAWkgBRYuwqUBMpWrWpa4ZL3htW26qU2KVA7CgBsGwzcEpsOcAnTSrNcxX7tjLpaIgWkgBSQAlJACkgBKSAFpIAUkAJSoFIKZAZljSmXzbXJQkND4H/apEBNKhDRsRiaEbelbPn2louyFBW1rxSQAlJACkgBKSAFpIAUkAJSQApIgfahQCZQBmhQbbL2MaDrSivNsWUwFpNYwhIWwa41QFYKCPN9Gv1mTZvv51YzfhFnEDf9Pj6/u8jq6+uDv9YVvdUPKSAFpIAUkAJSQApIASkgBaSAFJACUiCEzKDMV7pcabXJSGuTfFKgOgo4mLX3lDp4DqzS0h8L/oygdQAWAzX/eV2dsbIcnDNG14jK+C/3AN937tw5dOnSJXTq1En1+aoTAjqrFJACUkAKSAEpIAWkgBSQAlJACkiBtaJAUVAGIABWOCijkD9fK/VsrYzXOn9RQJQvGhGz2OZ6Y03gKgZd7jxzdZLfR8CreZdsKZjubFvd0BBWrFxpi1gAyrp36xa6dO0a6oFr9fXr/Liog1JACkgBKSAFpIAUkAJSQApIASkgBTqCAsVBGeCiCV74SpcCZR0hNNZOHxtWN4QVq1aG1atWWXpjp/r6XHH+uEVlu8qik2QpyB+nHX/55ZdhxYoVjaCsR4/QrWvX0KlzZ2unwPHaiRddVQpIASkgBaSAFJACUkAKSAEpIAWkQCUVyAbKVq8OOMkAZQ4OKtkInUsKoACwiRhbvnx5WLVqZejUqXPo0gSicDUmPWBtAcs83leuXBmWLl0ali1bZmmXvXr1Ct27dw/1nTrlQBntFzBTLEsBKSAFpIAUkAJSQApIASkgBaSAFGi/CmQCZQ7JLCWuqch6++2yWl6LClh1sLoQAFI4t3gHknUlvbG+Pi+grTYsi0HZkiVLwhdffBG6desW+vXrZ6DMfh+COd8cmtWivmqTFJACUkAKSAEpIAWkgBSQAlJACkgBKVBcgWygbNWq0FjEv7GYuTYpUGkF3Inlzi1SHLt26dLo2moCZVyzULH+kov7R53IF9cOymjP4sWLA7CsR48eYcCAAdY2HHC8gGSkZNJWiJ8Wu6h0hOh8UkAKSAEpIAWkgBSQAlJACkgBKSAFqq9AJlAGJFu1clVY3SBQVv0h6ZhXcFAGkMK1RfolBfOBUqwuCaT1rS1hWQzKFi5caLCMtMuBAweGnj17mvMNUMZGUX9Amb865kiq11JACkiByilQV8czteUy27GTWP94VzmtdSYpIAWkgBSQAlJACkiBRgWygbKVqwwINKaZyVGm4Km8AjEoW7xkSVjRBMqAUYCyZG28toJlMSibP3++gbLevXuHwYMHGzAD4DksIy2ZVTAp8E+bVa+s8nGiM0oBKdCxFPB/eEhb+Vgu944VC+qtFJACUkAKSAEpIAXaSoGMoGxlWImjDFdPy3/Ybat26jrruAJWCD/UheUrlodFixeH5V9+aW6yXj17hs44yoC0ibTftoBlDsqomwYoW7RoUejbt28YMmRI6NOnj7nJHJS5s4w0TFuts2k1zPYKzJLt5taPMXk1nBxrXLMph7VQLbp1/Nao2e75WNlHQhnjFI91SwjSGGk8D/iHmcZ3Pnr8v82/KyRONeKzZgdjHWwYMcHfHLiLebESMnHGz/mHCF6ku/Mep+e3tRT547hlSxr/dGqsxRnHpuK0rUdM15MCUkAKSAEpIAWkQHEFsoOyFSst9VLFl4qLqj1KV6AFKFu0yCZGOVDWuXMu9bIQLCsFpMUtLFafjMkaoOzzzz8PpF+ut956YaONNjJQ1sJR1lTDD6jHpMgmc507tztnGXrEk9EkvOL3QEFb3GP16or1j+vE7pF4FVGu4/XgvH2lR5mOqIQCPi7JsXKo7HGRdIHG186NNeDDgDK1/cp3KyfBgzuNCrWhElroHNVRwOODz4E5s2eHWbNm2arDxAoLvOA0xtnLi69Zibitxzp3H9TxjyKNz65GZly3RlvsGWr/b8RlyXslLi1QHUV1VikgBaSAFJACUkAKSIFSFMgEyqgb5amXAmWlyKt9syrgkw4mRri2DJR1727pjbgGGoBQa6GYvwMhQNm8efNyoGzTTTc1Z5k7ypj4OCDwe8VBWTyByqpHLeyHg4MVb0PTyp45B5G5OupDp06NE8NKbfHkMekgc3DnWlbqmjpP6Qr4OHnMx5CK8XHI4dAg7Qr5zpFzpzWaxwwo5EBt08+Ix7TPIT+W9/bu5ix9VNatIxhz4Bep7h+8/36YOHFimD17tv2sd58+tpjKBhtsEIZsuGEYuP769o8qPIvb0p3l14qhbAzBvD3+2bbGe1TXsr26jtetqFNvpIAUkAJSQApIASnQrEBJoMycMlrOT/FTBQVSQVmPHqF3r15r1CjLknLp/6rvE5dkkwudI97XHWPLli0zULZgwYKw/vrrh8022yz069cvB8p8suRwyR0COedMU3pQFaSr6CljJwf9nTt3rjk5gBO+WAGT0v79+5uzrlu3bq1eDdfHHhgJJMW1xzWBpUB6tASYMjFmgsxk2dNcK9p5naygAn5PrVi+Iiz7cplBDO4HVoJlPEiRxmVJXPTq3ducP0Du+F6M0+m4pxYtXBgWNI039f2IsaybAzHSnGMozWq0OI2Ima5du6v9a6wAACAASURBVIXOnRvrBRrIBqbkAe5Zr6v9qq8AwJX7nGfBa6+9Fh55+OHwzuTJoW+/fmHgoEFh0KBBYejQoWGbbbaxZzHj7f+oUe3WEWts/IMIzyzif/GiRbmSAfx8edM/LtIm4pT+eO1K7gvOgRNuQP8BYb3+jc9Rh8Jt7Yyrtl46vxSQAlJACkgBKSAF2qMCmUHZiqZi/gJl7XGYa7/NpYAy700pqZZZwVi8H21yxxjgBmgEGGDFy80339yAgIM0d5PlgFlTqiDfM0kCGFC7rNbvn9jJ8f5774XXX389zJgxwyRnosckj/psX/nKV8KwYcNCn959wspVK1usSlpqtHkKH5Bs+vTp4eOPPw4zZ84MnzeByS+XLQvDhg8Pu+++e9h6663NPQJAa0v3SKl9Whf3Z5yIZ8AA9wFj9cEHH4SPP/rIVqoFVmy11VZh+PDhYcONNrLvgVZ+XAxhOQepzNOmTQvvv/9+mP7JJ3aPAEeybP684BggA9fhxfHAVJxGwBTAHT9jvzglNMs1tM/aU4CY4VlDXcgJEyaEa/74x3DXXXcZLB81apSN78iRI8Nuu+0WvrLttgbQAFRtkcLooIyYB+R99tln9oycOmWKfUYAkIlt3vnc4DlFDAJuiUf+kQFItvHGGxvo23zoUHMnx7XW9Gxbe7GnK0sBKSAFpIAUkAJSAAUEyhQHNaFAGijrSTH/ptTLtNXNSoVfpezvQIvJFy8mPHPmzDFAwAR8iy22MEcZ5/RUy3giHtfUIk3MYZC/14ToKY2IJ6g4OR64//7wwvPPN8KIHj1s8jpixIiw35gxYYcddjBY6K6vcvvkE0TA2DvvvmsOEtKtPvnkk/Du5MnhzbfeCuPGjQtjx44No3bayWICt5kmk+UqXt5xjBOxzj1Azaj33nsvvPrqq+Efjz0WXn3hhbDbXnuFQw49NOy8884GUfsPGGAgtb5TvQFnT5/FSQYA+fTTT80l9OKLL4ann3wy9Onb19LqPNXXapY1/r/lxuqy9fX26tqtmy340bNXr0YHWZcu5jjaaOONDaoAJrqzT1MtKyAr0MJTROXeKS8Wqn0U48MzB1frU089FX526aXhpZdesstuOXy4AVkg2ZgxY+x5VInnUKE++eeTP9f9H06IYcA+oJf7AVjG91OnTct7ul1GjzaYCyTbbsQIu1eAZgA04HKy1lm1tdb5pYAUkAJSQApIASkgBdZUQKBMUVETChRylLkbhIaWArvijiVrXqX9bs35eGPRekAQEyNq5DDBHzx4sLlmcAGwOSiL65TFzrK46L2n39SqsywGZQCMv/z5z+GWG24I22y/vQGJL5cvN2fX177+9fDVr37VJny2Ih21zMrcfAU7QOSbb74Znn322fDuO++EmZ99Fp594omwbOXKcM4554RTTzvNrilQVqbQrTyM+5B7AdcMbrJ33nknvPrKK+Hee+4JH338sbkMjz76aBuj4VttZfcJAIOYSoIy7qWpU6eGt99+20DZ3XfeaS4h9o9rn+UDWe5OcxcaABcARiwRHwA37k8r9t6jRxi6xRZ2z7IIBz9jf29Xa2K3lZLq8DwKxKDs2WeeCZdffnkYP3687c3zZ5NNNzUgu9dee4Xtttuu6qDMXcHEP85XFhj48MMP7XmF6xZ3GT/HScaL2E7bNhwyJAwaPDh069rVgC7xvuGGG4bRu+xiDjni02PT1nllASVtUkAKSAEpIAWkgBSQAm2ugEBZm0uuC6YpUAyUxcW/04BWKT8rBba5o4yJEJN73DQAgC233NIcZWxxMeekq4xrefom+5J+yWQ+LuxcSxHhoIzJ3nPPPZdLeaKNQzbYwODVqaeeGk455ZSw2267hwHrVwaUATxwKb366ivh0UfHhzfeeCPMmD49TJ482eQ56aSTwjnnnht22WUXAx1ylLV91Dgo4z6YMmVKmDRpUnjpxRfD9ddfn2vMt7/97bDrrruaW4b0S0CqO9GIec7BvUS6moMGwOhdd95p58CtafWcmmr6+X2S7K05e6gRxeIfCxcGSgPk3Tp1ChdecIE5kGgXqdPmNOvePbfwgNyJbR9Pha7ooAyX6TPPPhuu+O1vw8MPP2yH7LX33mGTTTaxFMw999yzTUCZt5V0ylmffRY++uijMPGNN8Kj48eHxx9/3H5NrbyNN9nE4BfxRXql/yMPgG1JU6rm/M8/N6jGuXz77ne/ay5d4pN7JnZS19bIqDVSQApIASkgBaSAFOgYCgiUdYxxrvleFgNlSddHFtiVpeh/LEza/oAyJjlM7j31ElBGuoyDsuQ58qVg5tJHm1IxHZjV0uDEoOz5554L1153XfjbX/8aKLSOiwOnxOmnnx5OOvlkAw+VdJQBYEjle+yxx2yVu09nzDDHBtvJJ59soGz06NECZWspYGJQNnUqoOwtS4e77tprcy36zne+E3bdZZewzbbbmkOM+AAOA7WSoAzYwPhSg4oYYyMFzeEy9x316ZZ/+aX9LobLy5YvL0mFww8/3FxupOxx7+LcwdnTp6mOml+zpJNq56opUCugzJ2/gPmlX+AqnmV1+QD5PKMA+QBj3zYYNChst/32YbOhQ8MGgweHHj17hOXLVxgUI02TY0g3Tm7E5/bbbx922nnnMHLECFugAJC7ctWqqmmsE0sBKSAFpIAUkAJSQArkV0CgTNFREwqUCspodCnF/JMwK+34tJ85KCP1kno5OAGY/ONooKaM15Ph2KSzLJmK6YX/+TnwoEuXzqG+vrYK/OdSL3GUPf98uPGGG8Ltt99uLjr6O33atDD2xBPD2BNOMOdQpUEZ9clwaLz11lth5qefhpdfftmG7rTTTgtnnnWWQNlavFsdlAGMAaaMEePzx6uvtlaR+kgtOWAmzpghQzYM/Qc03iPJ1EscZYAyIANA9o477rBzsFgDMQWExlVDnSqum9z8vqTeGfcmIJt34Fq80IM/I9if2lG777FHOPDAAy3NDWgGMMMBxKaVVNdicCUuXSugzAv3L2yqywck4xl17733GiTedNNNLUa/WLo0bLThhpbey2cDNfJwLlITD8gGKPN0Y+IQx+68uXPtd6RafjZrlq2cSYr5CSecYG45XGmsNI4WcjzWTmyqJVJACkgBKSAFpEDHUECgrGOMc833Mm8x/969Q+dOnVJrYGVxlRUDYsXO4WmTX375pa1wxoSHiQ0TeSZB+VLD4vPm6iw1NNjEx501XbqyGl9jYXErLk5j6+y/a23rKKDMxs1UrgsNUbn4tpqQulMlV6uuobkVbdWGtCBbo10RkAYaAKHmzJ4Tpk6rDiij3hQ1zkhtpnZTv/XWs9p4bLGrlAL/7tz03wEaABCsQAiMeOXVV8NHH35oRf0Bc77h3mFRCNJ4qavGdXjGcO/R/7Wpf3JMcnEatavc9sVjm3w+tfUDJxlnjc9Ie1pbU2oFlDmknT1rVnj33XfN8crr5ptvzkm277772gIDLPACOCPe1uvXL3Tr3t0gL58hADGgLkCX+MRJ+Y9//MNSmAcNHGgLAbAdcOCB4cxvftPuAdKQu3XrHvic0KITbR2hup4UkAJSQApIASnQ0RUQKOvoEVAj/c8HyqhHxQS90EShGOyy6VfjLKzFlqXAv69y5umXTHS8eL23KZ70+Wp6yXcu7HWXrAB51y6hS5euoUvXrjZJ52d+zNockg4FyhJQsq0mo0lIEMMZi0n7/5rx2hZxEYNfb5ffJw7KcMZMmzatKo4yVlI94ogjbEXVLYYNM1jgi2bkQFkEFR2q0EZAtjnVPvzQnGr/ePxxW7GVulHUj1q5YoWtjrlg4cKw+eabhxPGjrUaV6Ri9ujZM7cYQC0V90+C+ELPrGLxUclzFbtWod/H8e9f+73n/asVUIZLko0VeF944YXw6KOPhg8/+MBgF4tZsB13/PG2wACQFzcZMcs/osRjxdd+P3Es9R//8pe/hBdfeSUMGTgwV4uRRVIOPuigMHKHHSz90uuVxVC4NdrrWCkgBaSAFJACUkAKSIFsCgiUZdNJe1VZgVRQ1rNn6N2rV64gcj4nRRZQVi4s8/TJ2BVAihfugLigvLff3WFefyznFqurM1DGCyiWezWt1Mf39vt6nC1VFrvA6dc1UJbmkHL4yZj6BNYLyHuqlUnUBKzKdfC4zI2uoDobVwcCXDuuZVdfVx/qOzU6C/0Vx2w5bUjre9p9EMMK18bbFhfWBxqYo6yKqZeknB133HG2oiGpkbhzvBbgqjwrq3r685IlSwLF36kFNX3GDEvtfO/dd8M7774b/vHYY1b/jDQ5FhFgO+OMM8KYMWOsNhQpmP0HDDBYtmrlqoqDyjgGkrdfDGhjmMXP3dHK1/GzxfucD5wl3WPxc4yx5ffJRRPKjbc0V21avHqbkjHGdZOLN1QDlOW7H3w80rQkHjgO+PrIo4+GK373u/D2pEmWYsliIzyqzzv//LDPvvuaOxFIRsqkxVHT84Xzcw7rY11dmD1ndpj4xkRbpOCtSZOs5hkrv7Ltv//+YZdddw0jRoyw8wF0iX9/Xqy9TwZdWQpIASkgBaSAFJACHUsBgbKONd4129tCjjJfOSwf7EpOdOJOJids5TjLHBpQ54gJi9dBimsaJV1lPpH1fsXvOXjmKZdNk1YmVz5hLAeMVGJw1yVQFkOnuJYc44gzELDCGBJfpNOySh3pUkCrhobVuaLyce25UjVOwgjGFcBKKi+wlXfOTxuAOBTw9rpcxIzHXjzpztKGGITE8M+BSRxfrhO6WNHyCAQTk9QK69qtW+jSuXNgn2qCsh133DEce8wxVtScdLYWoCxPYXO/9+y+XL7c6kWh6/z58w1E3HfffeG2224z2UiPA6A5lCDFEzcQ9fa4HtpzbKXuPwdcDskb20qKZ+Mo8nt/rvA7d5byO8aeOKUuIuNPjHp80E62JHDNQRmeLU1gBm8i+zGuxDzXWyPeOnUOqxtW2zXZN4bIheItBsxJd1jszHNQxM88/j3O+B33Hn2L/4GBPlZq1ct8YDDum/fb2t3kWnRQBlx94P77w8UXX2yHALBo3/rrrx+OOuqosO9++1l9PZxk7gxOxpD9vL4+LF640FYPxpnGogAsXjJ+/Hg7Lw5HzgO8BZhtu+225irztmW597WPFJACUkAKSAEpIAWkQOsVEChrvYY6QwUUKAbKkqk5aZeslrMsBiUOGnIrWCYaEgMxnwinOS7iw8zhUV9vE2EmZmuzePO6BMpyUGg1teEaIQAbE3XS9BYsWGDQAM2Z4OIEAQp5qm/sBiw2hvluAQddfm0HFg7qeHcIAizg+gbsunXLuX7idmS91XJx2uRcA5YkoW18LvYHEAEvqMMHnAHk0R4m6qQ/9urZyw6ZM3eO1VaqRjF/QNnRRx8ddtppJ6tTNjh2lBVZATAeIzSj/dSVohbU3+++28bcC/8DZahnxuv888+3VVy5Jv2NFwPIqneh/WI3V/yMcjejQzTgDK45B/DEJm1mERG+ps0eH8SrpwU6mGkBqlavtnqIDtLoE+NKzDPODoZx7JKOyrni9sRguVDf0kCuQSlclPX1uUP93LSDcQHYEWO8038WCmFRBe8X7aGNlQJlSSentyd+RtNmg4sArSaSSdvo4wfvvx/uu/++8G//+m/Wp6FDh1rK7qabbhL2G7N/2GOPPQzCsj/6pm3xZxwruc6aNcvqnbGQxT333GOHUJsMHUg9PuiggwwY41JzmFqJeNQ5pIAUkAJSQApIASkgBYorIFBWXCPt0QYKpIKynj1Dn0SNsmJOj2rAsjglJ+3rfJOieBKWKqFNjBvCylUr7dfuFhEoK3/VS3e4OJBiMo6ziBeggPFzaMD3q1auDJ06d26GED16hE6dOpvjhwnrIFb7XK9/6Nqta87tkg+SxmOMY4eY5vpzZs8Oc+fODUuXLQvLWKGxybHljhraChhg/AEFvBss69o1UKOPNrCCHj9nwpyvhhbXi4EAfaYeEhNy0gmpiwdoAXr16N7dQIbphGtp8WLTxwuO026AIoXGSUvktcGQIdY+wA2urFoFZe5eQiv6/jGra771Vnj99dfD7bfdZrAICEfKG9vYsWPDqaedloMUfry7isp9/Pl5GGdceNRPs5hbtcrGkRfju8XQobagAIBl2iefNI5Xk3OVcQCWsS/wtGePHvZOTTUAJoApXiHU45tjuCYvzovTbvGSJXZ94j+ON8aU83bu0iX069vX4CROKV/lNBlv7nTkWoBe+kWcOfTifAZWm9LmHcI6gLW4X7rUYo5j2I8VI4kxu9/6988BM1aGJEXxit/+Njz88MM2FHvtvbfVAiNNFwcWtcG4V+lX0sXG88C15Fpz58wxfdHCnZZAK254VvZlHDgXGnOsu/refecdg1m//OUvc+Fw2GGHBcDubrvvbmCLQv4ckw+UcaDdo03/MML9ycqZrCxMvTI2zsPvvzp6tAHjXXfbzdolUFbuXajjpIAUkAJSQApIASlQngICZeXppqMqrEAaKGO1OyaSnnrpECDLpbMAs0L7lPI739dBRZb2+T6W7rZihQEOJpieulMMCJZyjVL2be+OMtpPvAB8fAVEgAhQhxdgLE6dNZ1JeWtykjBBdogwevRoc3TgFGHiz+/cYVJsfGgD+8z89NPw9ttvW4rV9OnT7cUEmXa2gF7UMIpScYcMGWJwDKCD02nrbbaxFSBpfzFQ5ultuL6efPLJcNONN9oqe0AF+vOVbbc1EOLuF2p6UZiclSJXAmiWLw+z58wxMLfrLrtY+hcwgjYAZ2i/a/ryyy+HP159tYUYuo0bNy6g2zbbbBOGDNkw9B/Q3/oKrHBwxNhY0X0A1qRJ4fnnnjNXDVtrHGVxnPu96KsNosUzzzwTrvzDH2yFQWpMMRZAm2OPPTZ8/cgjDbyQ6gm4oe9ZgGihe4t+o4mlgL71lhVwnzx5soE6VlH8aMqUcOghh4STTzrJrg0Uo41PPPlkWDB/vgEXTw/2umIs/sH4AMd22223sP2IEeZsot04ItEZIEXf0JbaV8Qg/eT87pSi3QBiYg7n1pANNwzrDxhgdbEs7XXLLe1Z5AuXeD/9eHeqAYBfefnlcNddd9lKkDuOGhVG7bijAR9gFjqyL/ciMTP5nXesfatXrTIAOH/BgrDTqFGWavgVYmzrre047jfiszWgzJ2Y6Lh48ZIwa9ZnNg5PPflkeP7553P3AG4x4CDAFOhFWqV/7ny5bJmNnzsTf/GLX5gU3J+kXFJ0n7bzjGAM/L4uFBdoiOaMB+Nz7bXXGsBlozbZksWLw+577BGOHzvWnGqDB28QVq5ckXMalvI8175SQApIASkgBaSAFJAC5SkgUFaebjqqwgpkBWVcthikyLdPFngWH1vOdZKpVcVkApYsa6qJhIuIl8OYYsdW4/ftFZT5BN5Tu5iYA4Dc+QSkeObpp0uS7JRTTrGJM6AIpwlOF59AmxslsTqlgyDAAE4b2oCbaeLEiTY5f/qpp8KcefMyt2Ho5puH/Q84IOy9994GEQAIwBBfUS+ukcdJHQ7xc+AAQOjuu+4KPrlnHybe++67r6VzAV+YrFOo/Kabb05t14EHHBD22muvMHqXXcLIkSPN8dNeQFmzJiHMnPlpePmll8JDDz5oAAlXH/CS7cADD7Qi6kAPABEQhHH2tMLMA5bY0e6lLl3C3HnzLMWOWmk33HhjWPD55y32/N3vfmeLFwCOqFX185//PNMlWR0UxxHjAmACrBJ3xP37779vDrprrr8+LMwYczuMHBkOOvhgA6rbNhWmBw4DdfwfKWJQRpwBPJ966qlw3rnntmjzeeedZ1o6tJ45c6atGskrua3fv3848aSTwi7E2I47GnTC1YV+5YCyOAWVNgImuT6aAPV+fdllBoTj7YxvfMPiAMDHog/+DxaAwsWLFpkLbeq0aQYdzd3XvbuBNu4jXgBk7k132xUaQPYBoMag7I7bb7dDuD4bKZhH4SjbdVc5yjLdDdpJCkgBKSAFpIAUkAKVVUCgrLJ66mxlKlAo9bJYMf9CQCv5u3z75tsv6/50O+u1XCL6bGCnqaC716gSKCs99dLTqIA4uGkovg2kwinF10yWX3nllczRucHgwWHrbbcN/ddbz6DBjkCU4cMNojisApRR+8w3JvY4aHBM4WACkE16880wZerUMPGNN2zSTyocKWfFNlLRcA8BGwB1WwwbZq4jHD9AOyCOpXg1OeI4XwzKiCmKhT/y8MPhJz/5Se5yhx52WNh6q61C9x49TJNZn31mEAGohjsouR1+2GFW7J5UMNxLQIH2AMriMUEX+kb6HA64t996K7w9eXKYMGGC7QaIHDFypDmD0JjVNq2AOot35Flps9j48Xt3lAFMrWj7+PEGikhTxNnEBugCTG222WbmtHr9tdfCX//616KnB9JwzHr9+xv8BGZussnGYfbsORbnQLLPZs4ME998094LbTx3cJTh8qL/6AB4I+5xVwGIvci/QyhPBQQg4c666sorzQ3HhgNy1E47Wdou98Ls2bMtxrgvcWYlty2HDQtAP2KMcaD+V2tAWS6lsmlhCvTGUfn000/b2NMenH1sQzbYIJxz3nkGpoZtMSwMGjzI3GzeT++3L0Dg9es8xRvg5S9Pty70eeQgjff5C+aHl198Kdxwww25MbcaZf37N9coQ0fVKCt6P2gHKSAFpIAUkAJSQApUWgGBskorqvOVpUAxR1mcdlkKkCrVRRY3Pq5HluxUa87LuXIOqJUrLS2Kwtukmnox+XzpdWWJW8JB7dVRxiSVjck4kIBJMXDi0UcesZ9T72u77bc31w2T8F69e4Vu3brbOKxsgpW+wiBpb8AN4JFvF110kU3kgVY4u4AHxIC7uuIJMADqzYkTwyOPPGIr5S1YuDB88skn5lLZDPCw3nqhT9++gULqvtIfE3BLj1u8OCxcsMDADqmQTPqZzAPMjj3uuLD3PvvY17h8PI6Sqb9ADCAagHD8o4+GH//4x7YvDjWuDxThGH6PywptgGDo4nXyqKeGm2jbbbax6wFOSFdkEo82HFtrNcrSwtwL5aMp9b+AZQ5NKPLPBpxYf+BAS3vDVQToqQSciEEZoJTrAbGApUBMYBdxQDF9tCYGcJXRZuIUYMNKoyzEYCmACxYYbAU+AW5wSLEBMk888UQbW+KMNMjHm/oG+Bo4aFDo17df6N69mxWrj+v3LWpa1AJnGONKnbBNNt7Y3HWHHX64pd5uuNFGBsqIqzRQBvz70/XX51ZuJHWTel08y4BSTz7xhLWXdFzqbfnqssQg9cGAwMO33NIA5bAttwwbb7Rx6NO3T8mpl/HqoXzNfYjW77/3nkHRyy67zPTCLci1aB+QkTRH7ms05x7l3nI3oX8ueRqnL3Lgn0e8+77FHMicq7GGGYsZfGHwEKfhnX/7m7kN2fbYc0+7z4CVpNYCxrXqZQkfYNpVCkgBKSAFpIAUkAIVUkCgrEJC6jStUyAfKMO946sQFktrLMVZRmuLAbdyrpcVoCVBGcfJUTY7vPbaa+Hxx0t3lPmqfcClJ554wmr+4Ohiou6brSK30042GccZZq6Vujorso9LytKrpk61Wko4e4BBvh1++OFhhx13NPcRdbQ43uGBT6IBbRS6nzZtmqX3AQiovQUY+3z+fDtVz969w8EHHWSTYVK8qAsFqKK4OHXBuD4A6onHH7f9gSXADADG2BNOsFQsaoVRD4n2M6kHfBA/7ijLB8qoZcUx1LfCcTbh2WftGoMHDgy7NtVmMqjSr5/VrsLRNnD99Q0icT1etVzMP+0J5GNDrS9igfhwgOrF4RlPdOT9a1//esXS3QqBMiAsoAxABtSkTiEAhxdAiRdjzqILgDIHt6++8kr4dMYMGz9ihQ2YgqOMtFhiGOcaKcdshxxySNhxx1Fh86Gb29hznwCt5syZHaZOnWZ6vDVpkjkv2YDAwLY999gjnPtP/xTGjBlj0MsXICgGynhe43TrP2CApV0CBL2de++9Vxg+fCu7d/g9UJbz0S60AKLhQgPG+uqXWVMvAdfeRt4Zb/pBfcDXXn3VHGT3339/LkSoSYeTDzhKe4ltT3v3xVRiAO2QK07r9M+QGJoV+hRED14APDShbTyjnqUu3RNP2KE8X8xZN2KEpdRyz3I/ek241n3K6mgpIAWkgBSQAlJACkiBrAoIlGVVSvtVVYFUUNarl616GRfzjxtRDHQlG5xl/0JwLCsEy7JfHY0j9ZIaZU2OMoGy0kGZwyEvog2AwJ3xk3//dxt+gBROLfZjckwdJCCE1xzj5/weEOGgDGjA5JqJNasBbj50aJg2fXqghtNZZ51l9ayYXDPOuIAAuVwf9wqpZZbeRwH/11+3Yt1AgI023tgcZJtutpmBDdLLAGWAKGAJTjJADpANpxCgDVcZTihPVwPWbbX11pYex4tJNDHj6WCpoGz8+PDjH/0op4VP7tkX99LGm2wSRmy/fWN7NtnE2srEHKDCfQe4wXnjEKe+rj7MmTvHUkvbg6PMAceypcvCosWLrH4XMPbvf/97uO/ee00XoAR1qKhHR0F3XD2Ak9auNNgClE2caC4vamTNmTvX4gOdgUXEHlozpsQa8UncApQARmwAWAAuzjQgGPoDchkvX50RcIvbjHccgMS4pVBuu63FHQAKKAuYI1aBNcQW8O2hhx6y/Rlrd6r9f5dfHg499FBrEym+viAD7YlTL1984YVwfZOjDFeWp2qiPe3h/gBC4kzkvolXtuR39NFjzNxmTXXRiMHP583LvOql9x9IRv+Iz3889li48sorTUNcZDwf+q+/fvjW+ecblOJngDrawBgk6/5V8kPP3Y08Z3AW4jCkjaQ/4yxj4x7fb8wYi8lhw7awQv6VqJdXyX7oXFJACkgBKSAFpIAU6AgKCJR1hFFuB32sBChzCJCvu1kAVnyOUvf362Y9zmqUCZTZRJoXoKhUR5mvqMjkH/DzzuTJNun/9a9/s8U3UQAAIABJREFUbcMBAGLSyWSfyToQwmo7NaUZMgY4bHCDeQF+c5S9/rrVk5oze7bBFdKk2H71q19ZShqQio2JtTtQqIUEGHvggQfMKYIbxt00OHtw/eAGwzmDU6xfU9odK25+uXy5uWBwtuE4AZiRIkjqpqeAbrPttlYf7eCDDzaAQeFvvqf9eR1lCVCGRkzUAYakd1F3jTpUgCEAh6deOvzDaQWw4B2AQX8dsrQXUFYXuM9WGNyxVRpfecUch3feeaeNIeAScEWdLIq6A1CARgDI1oCTQqCM2nWkXBKHLCxATboDDjzQYtRrdAGP0J4NmEtcEGPU2SK1+MH77w+bDR1qcUPKsW+bbLppOOrII3PuSUvxbFoEgnH11Evgmxe4p84YNdJ8bDnXz372s3DwIYdYaiSLErg7j1jLB8oGDxoUevXubTBvwyFDLK1xOCmVw4aZpqS0Ogyjb65RXOeLNgKtiLl8oAzIjDuUsWJFVu4nngHcP2jEPYxz0BbRaFrEo1uPHuHYY46xuMetBbijTb6aradPF0uhLPXj1NM1bYXj5cvDJ9Omheeef97qkr38yivm6PSaaSeffHI48sgjzb2KVtyP8WIKpV5b+0sBKSAFpIAUkAJSQAqUp4BAWXm66agKK1Ao9bKcYv6VTsOsBECLz8HXAmWNQVQuKPNjmXwy6TeI8Pbb4bkJE8LVV19t5yaVjHQ6JsYAESAZoIqYimvQ4UZhQsu5gFtMsnF5TGtKxQTg9ezePfz3pZfayoCszBc7HZkE4/J58sknw++uuMImvriC3J3zzTPPDMccfbTVfvJi4V78251gnsoJyADOUVfpmj/+0cAO/Vi1elX4dMan4bTTTgunnX66wS5cSXGBcT9HrkZZApSxah9pnkcffbTVOwMykFoHTAFgxOlmHqPuyqK99LM9gTLvA/1ifIFNOP5u+NOfLC2WDccV40V9snPOOSfss+++BlDoK69yt0KgDLchYwVE6t2nj6UDH3LwwZb2CQTymIhT/bhPaD8Q99577gm33XJLGDxkiEG0L5YssXpnnbt0MccWQIjVTYFBQCiu5c9Yv29we3mdOkAZqYrAWYfCLAKBFsQxriZcV77QSCFHGVAOUIaurNzo7kfuO+LVwbL3zdsVv7MPAKsYKNtnn30MfNE2VpHkvgFSk7rMSrcNq1fbggZsG2y4Yfj2uHGmMXCYtgAjvT3ljnOx4/xZg2vRnYFA+FtvvdVSXnmWALCBuBdeeGE47rjjw46jdjTNWxN/xdql30sBKSAFpIAUkAJSQArkV0CgTNFREwoUc5R5HZgkbEr7Pt/PvKNZHV+F9iv3HEkQYateki6lGmUlO8oYTyahQCEm90zOSVkkve2mm26y4QY6AIVwaDSmMw0LgwYNJuu1hROL+HOggLMNWIZLhwksE1zcZp06d7ZUNoAbDizfH7iGGwcXy2OPPRb++7/+y65NvaWvbLedOUP23W8/c79wPEDKnUoADIc4MSigDYC6hx96yEAZriEADxvnuXDcOCviTqobG5N9d8S0qFEWgTL6Tn8AXed/61uBmm1oQvsABl7vLF5IIr7vgCT01VNE24OjzO95tKF/jBM63njDDeFPf/qT/dpT8tATXcfst58VsK8mKANMse28885hx1GjDFgCPnknblhtk2eDb7bIRpcuVk8PEIRrklpkxAV1xhgTgBapuYwzkMyBEOdw16E7D4FQ9A8QDEgi/RJYSNoyGrF971/+Jeyx++52TmIEsORw2N12uBPj1EtckoA6ADEpyscfPzaM3mW0AWp3tdGG2KnXXOPLnty5+yEfKCP+SSXFUUmdMYAc40vttnffe88WqPj5//6v1XZjQwdSn9nfU6+5bzy9mOtXY/GUGHaiPwsmsBIvMBLYeeONN+bG98ADDjDXqy8uwFgSr3w2VNrhVhMf+GqEFJACUkAKSAEpIAVqXAGBshofoI7SvHygrG+fPoHUNEBSofphNsVq8KlRs2qtdZalnTd2IiXHp9Q22GqHTZMh1SgrLfUS7R2UMQmNQZlPQpmg4zphMj16l13MWbbxRhvZsJH22jxJbyyG73WOAGNMUpnQeyFt6sr16NnTJvykRHlNI5wsuEFIkaQw9y9/+ctcWJx19tnmqHFIR90pB1LJ2PJ7wJ1P9AcoYhPr116zVTTZxuy/fzj99NPD6NGjrY6Vp2dxvBc0T3OUbUGtqfp6AzDfOOOMcMihhxqYAZKxJYuYJ2MbUMaxc2bPCVOnNS46AHT6Y5N7D/Awbtw4axcprkOGbBj6D+hv5/X6VpwDXePxev6553LuLlIPAZuk1eGGGrzBBgZo2FqTBok2gBcgEACS1Ms//OEPBqV69+0bPvrwQ3P7XXLJJQZ4KKTfFqAMOPe1/7+9M4+vsrr2/g4JCWMIhnlGQUaRGZFJQBGUOuBQp3oFhyqo1d6P1Vbft9zW4bWXz+3r0PpHta16P1wVfdUyiwiIIM7KpGGSGUFE5hAIyfv5rvOsw5PDGZ6Tc4IJWU97PoHkOfvs/dt7P3F/+a21Lr1U1oiOl/UVCZO0/4Ax1hluqU8//dRt3rRJcp8B1ng/4Zs4rIBCwBaArjhXfdANLZkrxgfoAt4AmHFNqhOTeyZOmiQVQQHDUngiP1/exzzEAmVU6cQl9+2mTe6ysWPduHHjXL/+/cP9CFeNLCkFiZVZYqHHd+h78RxluNxwYTHOfn37yrjZr8CnpUuXurXr1kl4KgCRi7DnMZdcIpowr1SR5Fnrd9ilG0apC1OfH+QgpLABodlLPvjA7dz5nVuzZm242Aj7eSjuuO7dHaGzjfIbuayaIQdnuvtWXf6bwsZpCpgCpoApYAqYAqZAKgoYKEtFPXtv2hSIBspIfs6hMWgy/0jwEO3vkR2OPIQEBV3pgmWWoyw9oZeAKhxgEnq5bJmELHKR70mS57dt6wYMHCgABnimYYTRwr70kBsKDcsQ95lepSUh90lJaUkYlKnDisM5EOb5558PgwlcObhecC1prijNEyXunjAa4JOcy6hRQ8LbOPjTLuGcgDJyLZGAnotKhBQm0LGQW0xhVzxQRoilVMts2FCSho8cOcJ16tRZ4AdgLdGBHM0ElPmqc1Y1UAZoYo5enzbNPfvsswJNqe4JVOnUpYv77UMPuREjRpwyUMZcAklwOgE9c2LkpFLHI+uCNQFABQx98/XXbvr06bIucJJdd/31rk/v3gKrNNRRAar/2adrUKq97twpIYC43DS3H1VPb5kwQXKmAaQAU7SXCJTxGb1695b7gIDkfQO2AadwVQWFnXFB2ZAhEqrKnurqQTxCGufPn++mTJkS3veEYwLECL0GlgNv+X1C3zSENNGaL+8vOH2usK8A6YBh9vGc2bPdq6++Ks3iLgWGAzRZA4MHDZJxhdydOa5GZo0KcbqVd0z2PlPAFDAFTAFTwBQwBaqTAgbKqtNsV+KxlgeUBQFjQQ5CPyUswzFAjiELvUw+mT+V+GpkZorrQhPxA8oIV3zuuefC8AA4RHXJ7j16yGGZfF8aaqi5lzhQqzOLNn1srIzrTCCZ91JXDrnRqB5IRUKcOdP/9S+3d98++XxAGUn8AXZ169QRNxkwLFaoF/sASKHFCb7buVNgyKL335d2uQYNHuwI1cIBBSwgn5a6rtQFFc1RBojBVUPYGn0aMGCAwJXqAsqYXwFln3/u/gdH2XPPCbwkZxzAovs557gHHnigwh1l3+/eLYUiuHA7kRcNqJTfqFE47DDy2ca6AFRSvRM3H1B2+YoVjqIAWpQAmHX7HXfIvLLeGJc6pyLXm4IyHHaS1H/tWrdkyRL35JNPSr9w8d58yy1lQJmGG8dzlPHe8wcNEgBJSCmACjclRQvSBcoAz7jIcIcB74BfjAHQp1oQAnrtddeFcxMCibkXVyGXhkUG+f2QzK9Nzbumn0FOOYXd5D3EUfbh0qXSJHt22LBhrlvXruJ2xd3ZrHlzmWf9fZju/iUzFrvXFDAFTAFTwBQwBUyB6qyAgbLqPPuVaOxxQy9JvE4upyTCK+M5vqINO4iTLJ05ywTEeCFRhF5ykLXQy+RCLzXfkoIrQvoAVrNmznRPPPGETDNuDQ334qCPs6Vlq1YCyziUUm0w/4wzBFIoWFC3icIKmXdCfyMWjoIywt9w9+CuIjcTwIGQNi5CEfsPGCCha8AH/yE92jrUfYBzS6v40SYhZVTT5AKqkHcJpw9wB0AC8KGf8UAZ4yRsk5xT5MYiDBWAwDgiQ/Oi9a2qO8oAZZqj7L9fftn9/e9/d4QKkhsKjXF13XvvveLYq6gcZawRHHkKynBckS8O+IMzEJgUDaKGQdmRI1I1kXxiuMp4UT2Ri3Vwz733CgRlXmvVqu1ycrIF+gLi/Rd7gs8pPHxYCgQw/sWLF7vHHntMbkvFUTZ8xAjXuVMnWZusM/YgUIi1GTQXWDxHGWtfK4OyR+i/Vov98ccfwyGXjz3+uBs6ZKhr176dPFuB1BWduF9BmTo7eQ4w52+/9Zab9sYbrtPZZ7vvd+2SUG32LxUuCbsV4N2ihQBFrqA6VaJf4dYVU8AUMAVMAVPAFDAFTisFDJSdVtNZdQeTyFHmTyqeLNQK8q/yQdpUcBKpcjJhmHqvHqg0R1llBWUvvfSSe+3VV8WNcUbDhm77tm3uqmuucVddfbXAGg2pSuVg5696SS6uBYsWudWrVjkqNGoCeyo93jJ+vOS/wgWmycnVGaJ5sHBvfPzRR5Ls/JuCAsntFXk1yM93QwcNEldK61atJCE+L6oGqtOM9gAr+tJwLb8ThYM380cSfypUfrB4sYR/EsbGV8AbYV84aiTpfkQS81i7VXKlebnRDh0+LG3hRqGiJhchl7hPCCllDrp26ybJ1rnoT6xk/sAKcjXxPkLqNPdUdQBlaAPoIwyONQUo04IPhMABWHH33HHHHVJ4oaKqXkaCMkDJnXfdJaCM+QH8RAtPLAPKtm51Bd98I6F8VM983QNlwKNf//rX4jgEBOOeYm6jPbfCoKyw0B3Yv1/WMOvrj3/84wlQNn68uMKSDb286KKLBJKx7oGxuBbZC+kAZYyJfIPMD38mpJFQay70Y58xFq6nnn5aKpkSas0zRp+5qTyrEv2GVRAHvCN0mr7gInvi8cfDb8VBxrOGkFSgN/uQ8dStV0+eN5H56RJ9pv3cFDAFTAFTwBQwBUwBUyD9ChgoS7+m1mI5FIgFyjhgRctRlizYCgLLoh0oo30vHc4ylUhAWSFVLyunoywMyho3dmfk57udO3a4K8aNqzhQ9tVXbuHChZIonip2iUCZ6qgHVA6nGzZsEIcX1fimTp1aZjXmNmjgmjVtKg6yvAYNwi4yABkH7zp168r3cuvnuhYtW8gBliqZubmhBP4cuPXAr6BsTUGBW7BwoZszZ477cc8eyfnEQZlcYLhEgIy0L/nIohSciNwu6gACmAAEtVIl7hSqewIu2rZp4zp36eKGXXCBgDPCKmk7LijLzXWXjB17ApR17iJjPN1BmYBHr7ooziPWFOti2muvifSACkJ2L774YnfLLbe4wUOGhEDZsWJXfLy4HE+z0FtYk2iLywnnF0n3I0HZZZddJnBu4MDzXV7DPAFlgRxlBQVu5YoVAlDDjrJ27dx9998voY84yljPrNFozzA/KNu/b59bv26de3/xYvfoo4/K/ak4yi4aNUoAmYIynG4UZSk+fjywUyqWowzXHc5QHGJayAP4yZ7UkEUFZc8884wUNwCUqas01jO+3JPsvVEhnK61LVu2SLXa9xctkrDejZs2OZ4TXAP695cqvDjJCIVuf+aZAvkqsrhAquOz95sCpoApYAqYAqaAKVDdFDBQVt1mvJKONyooq1dPDlipJPP3H4yCQIpoB6l0QLlYn13ZHWUvv/SSJJ+WJPANGkguo5tuvtldc801ElKYbkcZlffee+89AWW4RT7/7DNZsbEcZbqcAVhcmnOJgyrVAXHc4DIDPgCvyFFFPqOtW7fG3AlndeggB32tvNi2bVtxbBEWRYJwDt28gBCALCALDjZ04u9FXhVTfs4hfseOHSntOsaGzrTHGAhlwzmDE+rCCy90ffr2FbCTCJSxl8Zedpm40TioEx5HnqfTGZT5nytAKGCjJvPX4giAxz0//CCA6ec//7l8Zb0DX4Imn482wUFAGRU+b7v9djdw4EAJvQwMynCUAcr8oZft2rlf3X9/OPQyECg7fFhArIZepgOUkXeN9QUo44XTjTxiWj02yGaIBcqaNG4sbiwNMVaoyB5hHfM+QFlOdrb735Mnu8GDB0tIKqAa0K0gK0gfkrmHzxUn55Ejbv+BA+IqpUrtn//rv6QZYB19pZLlqItGuZ69erkunTs7ni1UdmWu+F1QkW63ZMZj95oCpoApYAqYAqaAKVDdFTBQVt1XQCUZf7KOMu12eSCW/ut/PHAWpN1UnWX0g8PRYZL5V9IcZS+9+KJ77bXXxLFUv149t3bdOnfDDTe462+4QZKGkxsrmSTd0ZYbh1xgKBADF8a78+dL6CW5nEi8znXDjTe68VFCL7U9WT+EHnJY9SrN4eShTaDY5s2bJa8Th2htM9bSB0IRlonTA0DGYZbDPuFsABTcHzhaOJiTFw2oR/6wl19+WcIrOTBzAbYYA/mI0nnl5eZKIn9eSYGy3FyplimgrEcPCWGrDqAMiEHBDCAjYayE486YOdPNnjVLpgWYQ66ufv37i1MSaGWgrPxVL0OgrIfr3j3kKksnKGM/sv94ZjCn7Gv/xV4FjDdv1syNGj1a1jphxkBh3J2sBQ3bTteelIqkFFooKpL8cau//locrbj9yE2mF/sVLYYOHSphlxqSSoXLTK/CZdB/zElX360dU8AUMAVMAVPAFDAFTIHoChgos5VRKRSIDsrqScgbEEVzlAUBWAwoyH2JDiWRPw/Spv+z493vT+ZfWUHZRx9/7HCUvfLKK65Vy5auZna2hBFdddVV7hc33yxAQUFZKk4IBWU4yD795BM3a/Zsyb906OBBOXByJXKUlQFmGRniXgFC4iDD0UU4Jq4ZQhe3bN4sDiKKKFAtkyqUFIvwV7Rk7vgZ7yVEihBHXGYcvDnsqsOLw7pW2nx92jQ5LPM+XsA0ACOHe/4cc116nfdX2uRbGh6noZfsEZw5uMekKEHLlpIsPWiOMkJKx44de8JRVg1Ambr/1NnHGsCJtWjRIjd//nxRHudg/fr13Dnn9JDwSxx6hMuao2xCmaqXaAIcTlT1ElAGFFJHGY6udDnKgNia8F4AVc2a8lI3JX0DlPM7o/jYMZnfCbfe6i4ePVpCbHFuKchOxy8+daixdwGxPK+mT58uVXd5TtAvwB1QjHxkZ3fqJOsNFyP7l/UZpJBGOvpqbZgCpoApYAqYAqaAKWAKBFfAQFlwrezOClQgUehlKsn8/d32w6tkQVlQABcElvmT+VdKULZ3r1Tm+5+pU8UpxWGXA+j27dsFJtx+xx1u0PmDXKPGjVIOGeJQywuIRXVHigd8/MnHrn69+m7VqlUyfYC5W/7t3wRiEEYVyxWCrpqPiPnVHF+EW5Kf6khhoTj4+P6xo0fdvv375fsAMQAan6c5jvzr5ryBA8UFQkVEwBmHXBxjaLJ2zRq3cNEiN++dd9wPu3e77Tt2hJ0ud955p+vbr5/kRaPuYDKhfJLTzHuPHu6BitkeHCAMtHGTJgJ1KHDApdX26BdwEBj0yMMPy8+qIyhjXQFSmH8S9uNYZI5XLF8u1Um5mNsOHc5y3bp1l/xRXbp2FQCMlsnMV+TjsTqHXlYUKGOts+6BT4CoK6+8UnL1EfJISO2M6dMFjuMe03180003Oc2bpo5Q9m4yxQWi/epjLzLHfN7u7793G7/91n0JKJsxwy32Cm/wnKiVkyPFDQgD7da9uzxLgefsR55R5MIjR6X+TqjAX7PWtClgCpgCpoApYAqYAqZAQAUMlAUUym6rWAVigbIGaUrmHw2WJQJl+p4gTrJkwzC17Uoberl3r7i7pk2b5l544QXXqVMnqeIGcBh4/vnunnvukYMfBz5NlF7eFVIzq6bk7iF5P4n8//KXv0gVyY4dO0qeMS7CLoFlwCpAGSAoyPypS0zzI/EevqeJ8gnPxMm2ceO3bu2atZJs/ZMPP3Q5deo4Kk7ihCF3FE4k+jNx0iQ3fPhwOexyYGf+cNl9tGyZW7pkiSM32spVqwQocj3xxBNySCckTEGWVs5MpJeCMrmPIgAZIc+ZBJlmhBxn6sbTqn6MLVbVy+oIyoBkgMXvd+8OhfW++66AMn/+uwuGD3f9+vUTBxSOQeaK8L5kcmpFm0sDZaEcZel0lAHKWOuAbXL1PfjQQxICjrOTZ8c/XnhBqt3yM6A1Li/2X4cOHd055/Zwffv0kX2slXNTAaFAWPqiee/emz9f3KWEW1Ppkos8ggA9Qp2HDBkirlRyksk+9vZzkOdYomeF/dwUMAVMAVPAFDAFTAFTIL0KGChLr57WWjkViAbKyIkVq+pliB3gtyl7Jfu9IIeUZNv090jfG+tzKjMoAyz86+233dw5c1yt2rXFoYR7AkfVXXfdJcBMc1xp+FMQPVUfOSiWlrqMGjgzMiSX2IL33nP/MXmy27ptmxywOYTymVQGJC8aoIwwxkhQ5q86V6Z9QhgzariMGhllqsopUCIkT3OZkUtMQzNxrADHyEFG6CMwjOuBB37jLh59sRyA8/IaSr+BYuQjIvdZAe6yBQvksMw1ZcoUN3rMGMl5plX5goOyEBALj80bGKteHZbqIOPv2q6BshBE5FItyE0G+CU32cpVK11OzeywW3HMJZe4MWPGSJgheegAo0DQaAA4musn1po3UJZ+UAYkJ/SYvXnFFVdIWCUhjewD9iDAmkT6FAUBiAKygGbHS0rcsGHD3OjRo12vnj3FiSmgmbDrgNVo9blCm8w5zyCeTTwbcCdO+c//lH3P+qlTu7bsx0GDB0sYKon7+ceG1m3aCHzH0cra1H1bzl+b9jZTwBQwBUwBU8AUMAVMgQpSwEBZBQlrzSanQBBHWTQ4VpEQqzwQLhlnGWM+SjL/w4crXzL/vXvlsDlr5kyBVxwmCWUCLAEUSOhPSCFuCQ6GHGAljMhLZB9k9hVmqMMLN9aCBQvcw7/9rVSOa9e2rdt/4KDbs+cHd+ddd7nrrrvO9e7Vy9XxOcr0oMnhVUOhIkGZth8JLfk+oJKXgjeSum/cuFHG/umnn3pus43hUMpJkyZJVUHCvQirYtwcjikUsGLFCsmt9uYbb0j/uX4/ebIbMWKEHNa5lxxJmntMRI1MTOYd2jWEVHNsabEC2QPePTouIIGBshMrDq0IreNibjZt3CjzAzh5f/FiCZFjzfI9rksvvTTsViTkMjOTcM0TeRG1Zf9c6LNIYVq0fW+gLP2gDN0Fltet6/r37y/gC3DPvgJ0s3cJGX/ur3+VPzMHQGqKkIwZPdqNHDlS3F08t/IbNRJnWdDnFvdpNU7+DCDHQcazgrW08L333MZNm2S58Owin9rICy90g4cMEVDW0KtcG6uKc5Bnpt1jCpgCpoApYAqYAqaAKXBqFDBQdmp0tk9JoEAiR5k6aNIBxvxdSeT4inZvKt/TzyuTo+zwYXE84JQCpgB8UkmOn8pi08M9LioOgR8sXizhiIQ6ffDBB9I04UMcOMm7Q4Ls1q1bS04nTWwd9PMVGAEKAXA41shR9ugf/iDVK1u2aOFy8/LEfXHttdcK0OCQi9tHc5T583gpMIpcI5k41jJryCE30hGk646fad4iDti4j5Z9+KHb8O234fEzrltvuy2UQL9rVzmAk1SfvlN9D73Q6pmnnw5LcPc990hoGG4SEvsDaDgoxwv50jH5iwvIehADZSgEMxpIUz2rs6NMXXXsIdYIbh/mcsmSD9zGjZvc8q++cj/s2SOghHA9QjBxR159zTWSZJ39Fyu5us6Hfw8LPMMZ6YXR+de+gbKKAWWA6pYtW7mevXqG8n516ybOY9Y94eE4O0moP2vWLEn8jysVYIpDlRyD3A/s79Cxo+T3C/rc0rWlVVRxrhHKO3XqVHGW4Y7dtXOXa9mqpcA81hhrqmevXq59u3YuOydHgPxP9WwP+ly2+0wBU8AUMAVMAVPAFDAFnDNQZqugUigQD5QR1ucPg/opYZmgioiQz2T74w+3kcqMlchRppXkDh486DZv2iT5tghp+urLL93cuXNlrQDHcEhRyQ1XWfdu3V2r1q0EYAGBFNhQSVIAp7fC/FBKNePgCITDrUY1wlWrV7s5s2fL4bZOrVru3N69XdNmzSS/z5DBg13nzp3DoIyGBYgcOypuEsImAXy0LW6r4mKp1Nm0SRNpg8O0H5ZxTxlQRvU85yQElL58/tlnAr/mzJ0r7Sso6+NVmuTgDSBkDBzQyae2ePFi96cnn5R70QPHC1oB14B8bdu1E/eLgrLSklJvPYUAmOYd04qd5FgiNJQXbjcugB6OGs2fRh4/QmMZS1VP5o87iJA6nINndezoNPk6444GF/3gkxBbgCiADN2AYGsKCsQZiFNx748/ur379sna4urXt6+0T0VTwvI6sbbq1JEiD/49rc5HgC5tUAyCkL2cWrXEkcRLq0H6IYiBsooBZcCxVq1bi5Ps/PPPF2gNEEN79j/PLZ4jVKAEkpK7jKtlyxaufbv28twaMnSoQKw2bdvKftSw6FgQC9heM7um7HWgmxb+WPrhUvfiP1+U9mmXfdm2TRs3dOhQ1+PccwWm4yzTZw/7Omh4ejy3YqX4pW2dMAVMAVPAFDAFTAFT4DRWwEDZaTy5VWloflBG2BqHVUBArGT+6QBWfn2ScZZF++zy9qcygjLgE7m5OBAKNFq5Upxlr7zyikhGfi6+TyL/G2+6SQ6rJMjWEEx1TPk19ecQA2gcLwlVFMSJUfDNNwIyXnvtNYEcXFqx7vLLLxeAwaEYJxuJ1mvVqhV2/QAocAbn+JtDAAAd6klEQVSRs4gE2oAt/g5U2rd3r+QiAoRwKNZ8avSPy38oVkBIn77bsUOgVziU8s03pTIm18SJE13/AQME2LVq1VLylNEOYHHD+vVuwcKF7n898ojc26ZNG6l4d6SoyN14440Czah6p2GqJOUvEeh6IteegjLGQCU9wlGp1gisXL16tRyygW2EcuGI4XDOuEg+z4Wrpqo7ygBlzBeAkcTnOrZYLjyJXvVcdswtc4ErkFBL1u7qVaukGiJtoT1rheuqceNkPnAXAX+BL0ATzR3lfz4wx+wH2mVeKBDQIC/PNWveXGAb7UYm/zdQVjGgjLxf5JKLBsrYN8w/MJT5f3fePPfiiyGQpcVBmLv77r9fQqg7nn22uEKZPwmJJIw5yi9OqTabnS0gjnapakmVTeA8QA4wi1ONcOyzOnQQ5xqFA1q2ahUG2Mn+PlYXdbLvs/tNAVPAFDAFTAFTwBQwBVJXwEBZ6hpaC2lQIB2gjG4k6+7ydz0ZWJbq52gie81RVllCL3UegAVHjhS5ffv2CnwixOjpp54SuTikAsq4xo0b584bOFBCC3FuActwN+G4wc3F4VJDSY8ePeaKjx1zxceLQzCrsFCcUrRPwYC3335b2gT+EIbJ9cs773QDBw4UMEQSb/L8AMfon+aiwukDTCKhNkCPkCggl16/+c1vXL/+/SUUKq9BA1c/NzfsIqFvXLQH6OCQTeL3dWvXCmQBmBFyijuJ68EHH5RDMAdsAA6uMYAIwJPwSz7/n//8p/voo4/KjAP4c8mll8phGo3QhfeqPrStBQaAxD/u3StVQAGGjGXeO++4devXh8f0H3/4g4R04mrjoI+riauqO8pw3Y0aNUqgaLv27V3jRo1kvnRsClzVNXhyeGqp20fxhQ0b3PIVy93Klavc+nXrZI1xtWje3G3fscPlnXGGu41E8AMGCPht1Lixy62f6zKzMsPONdYG6wI4gqOQNU+7gNTMrCxxCqE/QJT3A3A1N5rms2KtssaZQ4o8EJoLcCOPFhcg+Lbbb5c1zrqIFZrHuAE5AOytW7ZITixcj8tXrHBvvPGGtEV43688AEQ4NNDP3x//s05dnwBlxgc8xA356KOPym3s31smTBCIyJplnIQpqnOO9c5aA0h98vHHsubnz58v75X569FDKl6mu+ol7eMoA0BFgjJd+wrg2Tsk939vwQK387vvBDqrm/Cyyy93A/r3l34CZHm2MH+RMFbdhAB8nle4X7/84gsJ63z99dclPBw3Kc9xHGSEXALRGTduMhynrCENFffPQaw/q+OY/vDSQilB3mv3mAKmgClgCpgCpoApYAqkRwEDZenR0VpJUYEgoIyPKC+gKu/7Yn2mDjdIu/FCbThAAXoqCyhjXJqzB1DAwR3wRNjl/5kyxRXu3y/uC5xgjfLzXUdybzVt6tqfeaZr07q1uJsE3NSvJ24rQqI47NEOubxwXgCjgAW7du4UKIVLRxLof/GFwCNC2hTEPfzww+6iiy4SMEUON2CBgjd1gXGApUrliuXLJbE2UGTGjBkyRUAQHGnADEK0zmzfXpxD+dLH+mGQQBu4xnCIAMkAEIRtAREkIbyXpBuQQJVErWIpUMGDbYAtAAgFEAAjwC7GxUXoKI4W4A+gsUnjxuJEkgp5devKPRoyiGOJ8QPeAHV8NrAFVxkX8OJX990n1f4UXnCY5lLYht7ARuDFIw8/LD8j/Gvs2LGiA4d6DvTqsouVl8u/rdGe+9CDvuFwA/w8/7e/yW304e6773Z9+/b1crIBNqkMWkMABPOlbkXAI/nDcOcAM3ATcgFlqKbKvOHOQR+FgH4HoBZiQDNeur5YYz/s3i193PHdd+77XbtkvQFKdnvhs3xO127d3G233eYuGDZM1q7qp3mo/GuLfuIeWrVypfuetnftEmCFWxEgwryeedZZAltY+xoCa46yigFlsRxlCrsVXPNsASgyd7gKFShSTfnsTp0EwAK9eeEoxMGs4dj6zNaQzB92/+A2bFgv6/WbggIJyyYXGmuAtcBn4YK8aNQo2V+4bf2Qy+8O86+xEBST9Gbhi73CPmncuIlr2rRJ2IEaNGQzxV/F9nZTwBQwBUwBU8AUMAVMAc7EpQn+64sfS2U4K2VuC6YCFUgEyvSgEQRM0c103hdvi6TyOfRTQy85HFWGZP7+KcaRwvhwYki+n08/FfBDqCSgg4MgFQV5NtTOyXGjLr5YoEGLli3dGfn5AnFw3dSpXdsVHjkisAdnzp4f97itW7a6tWvWuHfmzHH7Dx4U51DdevUETAG1gCQADPKScQDFQULSdICiXgpeACWaNwh4A6z6xz/+IbcBL3CBcF1z7bWSl+pscl81ayYQDyjHBfjDbQKUYnyMVR0yQDHAEFX2xk8Y74YPHyF9VFijFTcZH+GXQDIO6GhGG8AoLqrkkXdr0MCBAoJwuBEOyAGdsWi4K/mPgJO8CEnVC+fLgf37JfH82J/9TBw1jEEhlALOMqGX7853jzxSFpR16dpVYFvFg7Jm4gBMBpQBLDp16iw574ANaMM68+9pxhly6RS5w4cLBTQDw9CXXHoatqu6oRHrEOhB6C6gFO379esnzjWKLKChhP1CLLwwTtY/7QJfcQ89+8wzJz0Bf+bNA20B35hr1gP7urqAMvbbi6fQURYLlKE5e1IdWAq+gc3sRXIfsq81BJPJpCrl9ddfLzkEWQc8g3Oyc1xJaSi/InMpz8DNm92Hy5a52bNmyXOLZwoglnXEc4miH+zHCy+8UCAcwJ91qQDan0sv3q9RPovnAGs+tBc6CXy1MMwK/I8Pa9oUMAVMAVPAFDAFTIEoChgos2VRKRSICsrq1XO5DRq4mllZJx0UggCqIPf4D+B+IYK+V98T5H7/PXpw4nBOMv/KCMrUKQVEwgkmrq8vv3RzZs1y89591+VkZ7siL6dYw7y8kIuoeXMJN5L8cnl5kmOOam+ME+iA44eXOH62bxenB84rPkvDns7t0cNde911cnjlIKqhheSiCuX0OnEphBFH0f794vaYM3uOe+qp/3vSuuaA3bFDB4FweTiV6taV8FDgCHnEOFgDy3BzEa7H4VqvC4YPl5xDQ4cNE8gEgFP3FgfljBo1xNXE4Rj30lfLl7vZs2e7V728btpO8xYtJIwUoAJIpB+ARC7CtwCFuKC2bd3qtm7bJuGfenEQJ68Sji1CFHGnaW4sDfU7yVH27rvuES9nmjrKUgVlhJpt2YKjLFTls4yjbNIkKfAQrvKZJCjjfQAyABtrSMJTPbec7B+09kJMAbRozgtHIE4yoMiePXuiPtMAnbjVWFcCdL3cbsARKf5w/Hj4fexPBWXAFUIL//vll09eU+TnO/tscSURCsucqKOpDChbvlyg5+eff5620EuALK8KC70cP96d27OnuPzYhzggo4VeVjZQpuGSQCrWBvsZB9jMWbPEXZaVmRnOU8deYt4IwWR/AaMVPmvifb7izqQowAt/+5v7+ptvBJTzTGP/sVaA5OiDm0xcmtnZArwAulySRy/AxRrnHxN4LuCkpX+0q5dWxA3QlN1iCpgCpoApYAqYAqaAKZCCAgbKUhDP3po+BYI6yvyfGAmngsAq3l/e+xKFviTTnzAoo+rloUOVEpSp1uqYAm4Bj95ftEhCkIBKgAkAjIZD+nNGSSgUr5ISgQcaNqkJ6/mquZKAFGc0bCgODCrSEd6Ik0zdFJrTLVqibfqp7ZBDauGiRVJ4gDBKkukDr7TAgCa718Tr+lWhBiCAeyXkyjm3dt06N3zECDlMcwjGhUX+J0ICme9IuEJOKOYTfQAj5E3bv2+fOO+AaVrxUoGW6iNjIDTRCy3V6qF83bZ9uzt44ID75S9/Kf3AaQJwQy8gJH0IhXBlyNeYyfzr1xcn2ikLvSSnXMPgoZfkxSKEUdcQVVMBo7H2nT4z9KusJyqHZmaKFvxdQNqRI65Xnz6SM45QSYAILkFCOtEqWqVDPygDBk6dOtW98PzzYZcbewGXmjjUWrVyw4cPl1x95PKiQiKVWE+1owyYpUnqU81Rho7jb721UuYoS+Qo8z+32D+AJ4Dz0qVLZV+yF5ctWyZzCdTH/QmUuukXv3CDBw0SRyyX5jzj+cFz7p25c91jjz0mPwOoRXOJsZ+Ljx8Ph3Am+xuS/ITfefkQ//rcc7KuWF/6WbrHk23X7jcFTAFTwBQwBUwBU8AUSE6BwKBMDhTeYSy5j7C7TYHECsQDZcALDrPJgKh4QC0oLAsK1PSzgt6vUIP34SKq7KAsKyvTZWXVDLmldu50G7/9VgCS5Jf66CO3pqBAnFCpXG3btJEwKCAOOcUAGTgzcPtoFcJ4oFLdb7iJCBXlYEs/OQSTW+pLnzssaD8vHj1a3F84hgAihGaVCQcsLS3jcAOMAMpwmgARN2781hUUrJEQyg+XLnVffPaZO+I58IL2oXefPqHE9u3aCaTjK242IA8QELCmsE4P0fwdQESC9pkzZ7rHvATtfCaJ1gkT7NO3r+vWtauEtLK/kslRhqMMdyFuJhLAvz5tWng45P0iHxuuNc3ZpUnxNSG9riNCJAGvAAjcOum6gBjADhKt4/whzJa5o/gC80e/ACQ6V7FAGT+nr0AWcvS99dZbbnnEOrr66qtdz169XO9evWTd0jbrgDXrB2Xk36MNijKQ/04vikz87ne/E80CJfMvLHSbt2wRJyY5sig08cGSJeH2/vSnPzncj23athXHZ5Bk/hQ/WFtQ4N6ZN8/9+c9/Drd11dVXS5EBHJRAxpMcZSUlkmcQADX597+X8GQu9CcEkbXbk/eedZbA9FhQMtq8ox1Qmf38/vvvu4cefFD2tF4jR46UpP44+bqfc464wDT0Uu9h3QHKmENds+T5mzdvnoRQRl733XeftEfopISMe05DHLDkPXzrzTfds88+m65lmrCdKVOmyD8YsIYNlCWUy24wBUwBU8AUMAVMAVMgrQokBco09CWtPbDGTAEvgTyHASAD0IVDT279+uHQy2igTIULAqiC3EN7qdyXTH/03soceulfmJr/iq+APSAHIWnLPlzmVq1eJbmhynvVzclxfc87z40ZM0ZC4zhoE9KkzrNETj7/56obCRcJAO+TTz6RcLdVq1dLbqFkrokTJ4YrenJw5rDP4V2hbrS2BFaVANBKJPRq86ZNEu6FCw/g8kWSOl1x5ZUCBACIHJgJcaUIgYLByDlSlxvrCrAwY/p09/jjj4dvw6Ey8LzzJDySkLqUQNny5QK43nzzzXD7EyZMkPBU+psQlG1Y77784ks3c8YMgS3puBrn57tzzj1X8pDh7lK4SJirVhFUZ2M8dw4/AyAS0olL8bPPPxcozMu/1n/97/8uMImcc0A4YJyGA/tBGWuAHFmMdY0P+FBUYfLkyW7o0KFJgzKcbrgWWeN6Pfnkk27EyJGuTds2kmtLixRE7qFw1cvCQnE8slfmzJ3rnvIq29IelVoHDxkSFZSFEueXuF27doprctLEiaIVF/kGr7zySlljhG4CvVMBZYsWLXL33n23VCvVa+iQIW7YBReI2xOQHA2Uca//ucXvFULH/98bb7jnn3/+pOU2bNgwCXWkSAauQ3WW8T4BZW+9Fa78m461mqgNoCWwnn2vlznKEqlmPzcFTAFTwBQwBUwBUyA9CgQCZfxH8bFjxa60tERyxNhlCqRbgTKOMh8o4+DJwTZVUEZ/ywvBgr5PNQlyv+6ioirgKFPtgDMaOkgya/L24N7iIPnjnj3uwMGD7vChQ3JgDj0zjonbSRw7hBUSfkloY2aWq1Ontjg2gD5UoaPyI64VgIO6cjRHUDJrLTMzy2VnhwCH5Bpbv15yhh08dEhyo0k41bFjkpPsaFFROGE3zhvGBkzRUFOFLTjbyJelkCw8pjgdA1CwpgnRQydgC84dQijJSUcfyO8mbjlfaCr94L2169QRNxAAQMP7cEHRP74fmVNLoQBrT8M6mSNcfytXrBCHGcUS8s/Id40bNxKQRK422mR/aS6leFpLHrniYhkHDh0q/ZFLDYBBeCP5xFq3aSP9RTP6ztwScqrVBAE0QDx/PjjmifbIHYVDLplLQyxZW/SPzyLnG+sJhxZrCScUzxF09Yf6AjRjJY+iXdrTQhEUCqCfrCUgLE5Q1gS5zgBBTZo0lTXN/CicUdBLbj7cjTgLcRoyF0BU1ightDj8AHoSCkpC+og8fDq30p+iIllT27ZtF/13fb9L+lN4+LD8owLQqHNnHFGNwyHE0Z59qoNW3WWtAMuAePSNvYkLj3lknUg+vby8cAhzCfu6tFRyFwKgAVCEDDJ+KZ6Qny9jIwQU/WlPQ4SDzK9CRnFzrV4tgJLk+VrwRPrXtKlAdUASazvWvmQ+6BdjZS/SV8IveSYxDt4nbtCcHFk7PIc6d+ki49d/GEBrnKnkJ9P2gowj2XvYv4cOHpRx9urdW0KFgfR2mQKmgClgCpgCpoApYAqcWgUCg7LiYj3wntoO2qdVDwVigTJN5q/hUfHcRUEAVZB7EkG1oA6neJ8VzlFGkvtDhySvTd06dcRJpfm+KtvMK5RgXBzyCWniUM1Bkz+T0JpDPOBMQQCHU+AKAIOiDFSZrJVTy+U1zBNIQ54tAAuARMAZIYU+2JCsBtpHwI/2kT5ohUrN3wW8OHTwkDi/ACjy2XXryldyXHERugawoj/0XXNfAVj4X7xLE4oDRXDg+eGh9gvN+Dn6AYnQRkFACNiR161m2AkFIGNtaNux1iHf53WksDAELw8flr9rnjjGq+4qhX9B1rS6WTRJOnNM/9FX26eP2jZ/llxvXu40BT7MBe9RYMRX5iVazqdYGmtS83BIWqhx4V6Sq8wLu6MvjFEhmfYl6Hi1r8wZMIrqrQpwGZt/zWpeOf0M+sK6537mgHVADirJu+blX6NfuK2Abryf78daWQrgVDf0p+0wbM3MlOcH6xjogw6xNNU+KlSlLYHcR46E55K+6XyiIX+O1I/PZy/xAvIxXtYo+4U+sLcVPgfRXOdbfx8wNp4nvLR9AZA8T7KzZbzMgWgXJ5+dPlOloAjPp6IiWSuita/SKe3Wql27zHNInyVAbvTRdZzssyno/cwJY2Qe63su1qDvtftMAVPAFDAFTAFTwBQwBdKjQEBQdvxEnqAEB8T0dMtaqW4KJHKU6SEo0WEr8ufpAGP+udD2EvVD3xOrP35QJgfo4uOubt3KDcr8Omgifv+8AcrIKYQLRA/zHG4BQRygOcxy2OYATTVMEvXjPlFYQ/saOpnq+ldIobBAIYPm70JzXnyeOLhq15ZDt0C7zMzwodvfn6Bz7u+7gjvVifYESgBdCgtdUdFRd/x4sWiDDhz6efk1UZdYPBAQTS+dIwVrISYQgmj+NpPVWsfi19a/3tX9Ga+/kbokA8li9TfaXpM+eGCzPPPHZ6mOvN9fOCEM6TyXdVxQA7TywJV/rDoPkmfOAzaJ5sOvu86FvsdfCCE+yj3xKToXNTLo4wnHeOQ6iaZf+L0+KKf36TqIlgMu0Rjl554eCodVN/8zONnnhbr8oq03f7/9DmbVmCINfn0CjSGFm9Q1Wt51m8JH21tNAVPAFDAFTAFTwBSo9goEA2WEJ3iOskROimqvqAlQLgXigbLIZP7xDg4VBcb8g0oHLDvJUVZcLKCmMjvKQodXbDIn4IHOGwd9cd0UFopbiL9rKJTqpU4fXBuAIL/bxO9wKffB2jdJ0WCOH0rQR3UGaZgX60xDJhUqBYE+8RY8/ZCQQB9M0bBUrcBJv/QAr30AnMWCT0E3WCxQxvvDQCVKmF+i9hOBMs3RdqpBmV8vnT8/GCwvcFAd/W2WAS2lbIsTADKafpGwx3+P7hX6FwQYKiiL5hg7AcoSux61D9FgV6R+sULfZX17Dr5QHGsIz/khW3n3s+qhodD4BfW/P8LzWlIiVXWDXvFAmb/f/jDRMCjz7eOgn5fKfQbKUlHP3msKmAKmgClgCpgCpkBqCgQCZZLXx8s1VN7DRmrdtHef7gpEBWW5uS4vTo6yVIFZOqBa0P0Q6z6AjYReVhVQFmchxgWIHmDzvz3SDXPK1rgHNiI/LwikSFcfy6yHCCfRqexHusZj7ZgCpoApYAqYAqaAKWAKmAKmgClwuigQDJTxr7YeKCshAbKFX54u819pxiHQxGW4o8eOuv0HDkg+GvL2EKIX6SjTTqcKymgnCCyL9TnJOMvigTJCAAHRmp+qsuYoi7dYZPZqZJSpCBkL+ES6fILCxnQtVgV00UK5TkVf/IAwMgxP1+Sp6Ee69Kxu7fidTdVt7DZeU8AUMAVMAVPAFDAFTAFToDooEAiUSQiAB8vihdNUB8FsjBWjgB+UkeOKsDg/KPPDlcgeJAPMEkGveBAuHlQLCjYi78NRdjqAMv+cBHJExXB1VczqslZNAVPAFDAFTAFTwBQwBUwBU8AUMAVMgWAKBANlpaWS0yacc4icIF7OnWAfY3eZAvEVULiiVdT4isOqfr16kgCeK14CZn4eBFb574m8358jKKFbjCThviFF3q85t6KN2g/9jh47Jnm92FuayJ2k0VRjtMsUMAVMAVPAFDAFTAFTwBQwBUwBU8AUMAVOrQKJQRkAglL2HijDWcafA7lGTu1Y7NOqsAJ+UEZFQEAZgKx2rdouJyfbZdWs6bIyMxOP0J+cPCPjJHh2EkyLAF7RgFt5wzNjvU/3EuGWjBNXGfeS3J4XCaeDQL/EYtgdpoApYAqYAqaAKWAKmAKmgClgCpgCpoApkIwCCUGZggP/4d5AWTIS271BFFBQRlJ7HFYApIwaNVzNrCwBZrz4sz+/UzRHWLzPCnJ/ECgWDaYF/R7ts3+AZIxVK94Bx2rVqiXVIA2UBVkxdo8pYAqYAqaAKWAKmAKmgClgCpgCpoApkH4FAoMyDvj+6pfp74q1WJ0VIEE2/wce4bDiBVDSC3gUdjF6rjEJffRXDIziDsvwl57wu828hv3hk/KtaPeU933+9rxQZfoj3/a+6riyBAjmuOzsmgbKqvNGsLGbAqaAKWAKmAKmgClgCpgCpoApYAr8pAoEAmWh834IlB0/TmL/4x5POAkz/KSDsQ+v2goAwgTGerAMV5mGJvI9/gw8C1RQgqWpVEpl8RLI+799Klcw46uRkeGoakkoqTrlQpAsW6p78mdzlFXtdWy9NwVMAVPAFDAFTAFTwBQwBUwBU8AUqLoKJAXKQuGXoRxlJBu3PEpVd+Ira8/DzkWfs6yoqMjxwmUWLigRxeWVeEzqL/NQWSRIi8LWErcZ/A4AGC8FY8Axwi0BZPwZgMYLd13ZUgHBP8PuNAVMAVPAFDAFTAFTwBQwBUwBU8AUMAVMgfIrEBiU8RECyDxYhqtMQ+MssX/5J8DeWVYBdYups+wYTrKjR8VlxkvXYLQqk7SklSvLVLD0ATD/90+19grKxFGWlSUvIJnfSWZ76VTPin2eKWAKmAKmgClgCpgCpoApYAqYAqaAKXBCgaRAmUAMQJmvAqaJaQpUhAInoCzhviS995yMHqxVKFYRn10RbWoRAr4CyvzuMv27QbKKUN7aNAVMAVPAFDAFTAFTwBQwBUwBU8AUMAWCK5A0KKNpDX/jq8Cz4J9nd5oCgRRQZ5lWifT/vaqG/CoIk1xlNTJcRkaoQEGZQgWB1LGbTAFTwBQwBUwBU8AUMAVMAVPAFDAFTAFToCIUSAqU0QEFFqEQzFD4ZYkHy6KkfKqIPlub1VEBLxH/6TR0rfR5Oo3JxmIKmAKmgClgCpgCpoApYAqYAqaAKWAKVGUFkgZlYVhWUioJ/QnDlEqEvKqyEtb3SqlAZDhiVQ9PjOaGq6oOuUq5YKxTpoApYAqYAqaAKWAKmAKmgClgCpgCpkAKCpQLlIVgWchdVlJCDimfs8yrRljVgUYKmtpbTQFTwBQwBUwBU8AUMAVMAVPAFDAFTAFTwBQwBaqgAuUGZSdgmVcJU6pgloZDM6ugFtZlU8AUMAVMAVPAFDAFTAFTwBQwBUwBU8AUMAVMgWqsQEqgLATLQnAsnKtMc5Z539d7+Go5marxSrOhmwKmgClgCpgCpoApYAqYAqaAKWAKmAKmgClQyRVIGZT5YdkJaBYCZ+FKhZa9rJIvA+ueKWAKmAKmgClgCpgCpoApYAqYAqaAKWAKmAKmQFpAmcKyMtBMkv2XOvmfl7csnLTcq5Ip8ksFgFAZACsGYAvSFDAFTAFTwBQwBUwBU8AUMAVMAVPAFDAFTAFT4KdS4P8DFtGV2hHiLSMAAAAASUVORK5CYII=", + "created": 1648745429881 + } + } +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw b/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw new file mode 100644 index 00000000000..0423333e644 --- /dev/null +++ b/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw @@ -0,0 +1,2499 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 2838, + "versionNonce": 52205387, + "isDeleted": false, + "id": "qtX6x84ifEWpmMlvjuwhm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 385.26381756295194, + "y": -4873.5835302275245, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 299.2631095638441, + "seed": 1499470394, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + } + ], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2575, + "versionNonce": 1007916773, + "isDeleted": false, + "id": "Lrjtc8i7RDtRgEMzCyc2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 14.532151266623146, + "y": -4876.301753193795, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 301.1095767910746, + "seed": 2146516582, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2687, + "versionNonce": 1908504043, + "isDeleted": false, + "id": "YaUuLC54Jft-Q1TmGCg0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 6.0590924196161495, + "y": -4832.473690197763, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 563397370, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + } + ], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1828, + "versionNonce": 497644101, + "isDeleted": false, + "id": "ZG7xIJmYU_01zBa6E4IOM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 128.4332335151239, + "y": -4830.028272260108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 21528998, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 2692, + "versionNonce": 26312843, + "isDeleted": false, + "id": "uP1orLYT3sg-lBzvmtKp1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5.863796025501756, + "y": -4799.272459137157, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1991660474, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3491, + "versionNonce": 984408485, + "isDeleted": false, + "id": "KJNPSV2FX9EbB9AUWVVXe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3.647522174107735, + "y": -4768.285747288017, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 894786790, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1959, + "versionNonce": 1011300139, + "isDeleted": false, + "id": "eSid1nhor4D8oJbUtO7uA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 52.61542690531667, + "y": -4865.53779188645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 2062011514, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "rectangle", + "version": 3901, + "versionNonce": 973241445, + "isDeleted": false, + "id": "Y3XoRfqQf-NLr3lE7JnMN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5.451470492958094, + "y": -4704.339245230425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 304339814, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3527, + "versionNonce": 1113749413, + "isDeleted": false, + "id": "ONKeuz9pVhxRHOaFetGq5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 174.7365697763001, + "y": -4757.2240361838685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 730583270, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3631, + "versionNonce": 1692270891, + "isDeleted": false, + "id": "-HvFH8HPNIoXqNg7o4GK1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.02350159448025, + "y": -4743.4442066384145, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 8558714, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3634, + "versionNonce": 1625176837, + "isDeleted": false, + "id": "wj08ZywhI7w7csrHoqqy0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.0484414983278, + "y": -4730.274735484569, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 820823078, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2075, + "versionNonce": 474211563, + "isDeleted": false, + "id": "kZsLE3jpmPz1Q9HP50zTT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 423.5356465388398, + "y": -4864.597721248145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 246, + "height": 25, + "seed": 818562598, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "high cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "high cardinality column ch" + }, + { + "type": "text", + "version": 1827, + "versionNonce": 804130699, + "isDeleted": false, + "id": "sovQZLFZhWlrgZZEN7Onl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 534.942638101621, + "y": -4828.874510744283, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1586818554, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v1" + }, + { + "type": "text", + "version": 1898, + "versionNonce": 426033829, + "isDeleted": false, + "id": "TKuOOFwXXx8if2hOOwVvm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 532.4485832537756, + "y": -4797.424552349724, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 21, + "height": 20, + "seed": 1152533114, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v2" + }, + { + "type": "text", + "version": 1999, + "versionNonce": 775546411, + "isDeleted": false, + "id": "e-xdBVQQ-6WHMcQ9W56bZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 534.4252205718773, + "y": -4767.596246790877, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 20, + "seed": 143083450, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3" + }, + { + "type": "text", + "version": 2105, + "versionNonce": 1465853445, + "isDeleted": false, + "id": "yrHiTgCA5gWUbt6nLBOJu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 538.2390809430202, + "y": -4703.998054559754, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 17, + "height": 20, + "seed": 2086876454, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "vn", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "vn" + }, + { + "type": "rectangle", + "version": 3015, + "versionNonce": 1758873957, + "isDeleted": false, + "id": "FCCUs0_i4qLdB0Ej94E4Y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 390.83654539798164, + "y": -4312.63594729479, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 1914513466, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + } + ], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2736, + "versionNonce": 1838754667, + "isDeleted": false, + "id": "jgFXbXeH8YIKeQ2gURwgW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 19.861398564808013, + "y": -4315.35417026106, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 239.25119804797578, + "seed": 668209254, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2823, + "versionNonce": 879875269, + "isDeleted": false, + "id": "o6Ok6BRVTyY0YZICjpu1r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11.457897918761972, + "y": -4271.526107265028, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 2071990522, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + } + ], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2826, + "versionNonce": 1329919013, + "isDeleted": false, + "id": "e1w5nDBdprtkB0GjJBMVk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11.436523860531423, + "y": -4238.324876204422, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1376248250, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3625, + "versionNonce": 1791986859, + "isDeleted": false, + "id": "9mEd9Pc5kSLTLJP76KICb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 9.220250009137402, + "y": -4207.338164355282, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 472624870, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2173, + "versionNonce": 356329349, + "isDeleted": false, + "id": "9K9GA5Xsx7Linr6bzdWXg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 430.99068170730413, + "y": -4301.428285389093, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 1356307066, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "text", + "version": 3665, + "versionNonce": 1949935755, + "isDeleted": false, + "id": "ZVy4SXPgb8AN-xRWRSzZd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.30929761132978, + "y": -4192.276453251134, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1392447654, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3769, + "versionNonce": 1140537765, + "isDeleted": false, + "id": "zs9dJsuDRPlb1lxvSFJT-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.59622942950995, + "y": -4178.49662370568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 750007482, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3772, + "versionNonce": 2007654187, + "isDeleted": false, + "id": "HIw5GXLWPA088s4648m9j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.6211693333575, + "y": -4165.327152551834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1331825638, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2149, + "versionNonce": 91672683, + "isDeleted": false, + "id": "o5Iyk91ZX6NHnkpCdNoMq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 126.61669812534177, + "y": -4239.368643462498, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 1175505510, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "larger value" + }, + { + "type": "text", + "version": 2288, + "versionNonce": 1151963781, + "isDeleted": false, + "id": "GahQ9RQkP70w-ToYDmci_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 53.666320191733945, + "y": -4304.755056684555, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 246, + "height": 25, + "seed": 1041891450, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "high cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "high cardinality column ch" + }, + { + "type": "text", + "version": 2043, + "versionNonce": 88013285, + "isDeleted": false, + "id": "S9EAguDXECpjTanurYF92", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 505.2946637966753, + "y": -4269.467830075513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 448258362, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "some value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "some value" + }, + { + "type": "text", + "version": 1923, + "versionNonce": 849643211, + "isDeleted": false, + "id": "gxjeT_-XlqLq3Soh1LyCn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 130.16653022905263, + "y": -4799.959769238338, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 2098985658, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 1978, + "versionNonce": 484728677, + "isDeleted": false, + "id": "EANFDhLMVVj_cUw-jXS5K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 128.82537610354728, + "y": -4769.680317299848, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 446104038, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2107, + "versionNonce": 1503622507, + "isDeleted": false, + "id": "QqhxE25m1vjZKIcjFyv_-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 129.9347258122986, + "y": -4703.98032260843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 14130298, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 3995, + "versionNonce": 709700293, + "isDeleted": false, + "id": "5aWnqxdg_GK3aF9xgcy-z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 6.716100664771005, + "y": -4662.45154636205, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 1188888890, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2202, + "versionNonce": 1283690507, + "isDeleted": false, + "id": "G4cSyyf6j_eXEv-ZUcXR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 542.5037111148331, + "y": -4662.251094087263, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1650083686, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "...", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 2248, + "versionNonce": 1531284005, + "isDeleted": false, + "id": "0-Zu47vlyIleKnDquRUwp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 113.06450111395831, + "y": -4662.374100531826, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1021102586, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "different value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "different value" + }, + { + "type": "arrow", + "version": 1942, + "versionNonce": 1725230565, + "isDeleted": false, + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 700.1163393610292, + "y": -4837.17969566948, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 102.01905034388096, + "height": 78.0457406876982, + "seed": 624469542, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YaUuLC54Jft-Q1TmGCg0n", + "focus": 0.8787880374605471, + "gap": 4.706005471717162 + }, + "endBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.507689627061049, + "gap": 3.1361614618572844 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -8.259218862988307 + ], + [ + 15.779906463149969, + 0.8433709402347214 + ], + [ + 16.66393948236995, + 25.82459982511837 + ], + [ + 17.30249991839189, + 50.97062533050765 + ], + [ + 19.11368951874503, + 69.7865218247099 + ], + [ + 32.76395546279845, + 69.2533562877799 + ], + [ + 102.01905034388096, + 61.64491894859428 + ] + ] + }, + { + "type": "arrow", + "version": 1246, + "versionNonce": 1336217323, + "isDeleted": false, + "id": "rh-38xKn85IlMvAGLOUuV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 708.787358024008, + "y": -4676.67684185521, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 92.75934039482536, + "height": 97.14706067288162, + "seed": 1705315578, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "5aWnqxdg_GK3aF9xgcy-z", + "focus": -1.623767504357262, + "gap": 14.225295493160502 + }, + "endBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.5002702869307034, + "gap": 3.724852747934108 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 9.390209912397566, + 0.3407545017945566 + ], + [ + 13.652890747270717, + -24.746349152546944 + ], + [ + 14.277503366963296, + -64.90994643073208 + ], + [ + 16.020713106057247, + -81.35703038401603 + ], + [ + 25.070088728382185, + -88.08882487502407 + ], + [ + 92.75934039482536, + -96.80630617108707 + ] + ] + }, + { + "type": "text", + "version": 313, + "versionNonce": 939577253, + "isDeleted": false, + "id": "3p2klKHZ3xRJgdfEZWb2u", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 805.2715511667674, + "y": -4797.3005241711, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 337, + "height": 50, + "seed": 1917678758, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Rows with the same cl value \nare ordered ascending by ch value", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rows with the same cl value \nare ordered ascending by ch value" + }, + { + "type": "text", + "version": 610, + "versionNonce": 1626417451, + "isDeleted": false, + "id": "lGplLR8Z6jWDoJktrIipg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 736.8301707406551, + "y": -4688.162934495756, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 511, + "height": 75, + "seed": 84608038, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Good data locality:\nSimilar ch data is placed close to each other,\nand therefore that data will be compressed better", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Good data locality:\nSimilar ch data is placed close to each other,\nand therefore that data will be compressed better" + }, + { + "type": "arrow", + "version": 487, + "versionNonce": 875030853, + "isDeleted": false, + "id": "kx0Y5XeLPP8gELJRVQBS8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 956.9471743771608, + "y": -4744.119863639449, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.8971719581269326, + "height": 40.45578583351107, + "seed": 998502630, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.10694674091478802, + "gap": 3.180660531650574 + }, + "endBinding": { + "elementId": "lGplLR8Z6jWDoJktrIipg", + "focus": -0.12050265110988508, + "gap": 15.50114331018176 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.8971719581269326, + 40.45578583351107 + ] + ] + }, + { + "type": "text", + "version": 3651, + "versionNonce": 1580897547, + "isDeleted": false, + "id": "PIsgcoP-1CloIIpQqrMNU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.3773587517943, + "y": -4756.378846180702, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 92313594, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3755, + "versionNonce": 674059557, + "isDeleted": false, + "id": "Atwr3a8M6kiymsFpsJ9OJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.6642905699745, + "y": -4742.599016635248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 40926374, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3758, + "versionNonce": 1004125099, + "isDeleted": false, + "id": "xrULyUeXjGsYNLsPYaT6K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.689230473822, + "y": -4729.429545481402, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2019526842, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3619, + "versionNonce": 1416718469, + "isDeleted": false, + "id": "BKVYbxey2QmitkdhvVkVj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.6784348211513, + "y": -4648.858702720743, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1231286182, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3723, + "versionNonce": 1947930187, + "isDeleted": false, + "id": "jaRokGmuyH-UX_Q_RqO9Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.9653666393315, + "y": -4635.078873175289, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1657849274, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3726, + "versionNonce": 966528997, + "isDeleted": false, + "id": "IUw1dFIp5HXlIvaVZ0QLh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.990306543179, + "y": -4621.909402021443, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 64162534, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3676, + "versionNonce": 1238961387, + "isDeleted": false, + "id": "Ayu8jCN0JwCyp99wqkWQJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.9159546240246, + "y": -4649.51435179256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1098385062, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3780, + "versionNonce": 632998725, + "isDeleted": false, + "id": "KK8FVzfNzvvlmQnJfDRBX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 176.20288644220477, + "y": -4635.734522247106, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 921542330, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3783, + "versionNonce": 1084110731, + "isDeleted": false, + "id": "Yvddr7Umq1L32GhZFH1TO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 176.22782634605232, + "y": -4622.56505109326, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 793526758, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 314, + "versionNonce": 1227561637, + "isDeleted": false, + "id": "ie9gUcV3zGfunavl0g5D9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -32.300865930757936, + "y": -5105.988560748006, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1079, + "height": 50, + "seed": 292855782, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Compression algorithm benefits from run length of data (the more data it sees the better for compression) \nand locality (the more similar the data is the better the compression is)", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Compression algorithm benefits from run length of data (the more data it sees the better for compression) \nand locality (the more similar the data is the better the compression is)" + }, + { + "type": "text", + "version": 2154, + "versionNonce": 111480363, + "isDeleted": false, + "id": "mAHet1TZcuvaagMWEtn2g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 156.5164996874937, + "y": -4270.257376751229, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 42, + "height": 20, + "seed": 981121530, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "value" + }, + { + "type": "text", + "version": 2249, + "versionNonce": 1822064133, + "isDeleted": false, + "id": "gUZl0f0606C_BG_20WgYa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 110.94695212633592, + "y": -4206.953486095181, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 137, + "height": 20, + "seed": 1035169914, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "even larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "even larger value" + }, + { + "type": "text", + "version": 2133, + "versionNonce": 517476555, + "isDeleted": false, + "id": "aHnVfkGnkWjtPsMVsmOAr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 492.92585411281516, + "y": -4238.310847166858, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1800397306, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "another value" + }, + { + "type": "text", + "version": 2233, + "versionNonce": 1728476517, + "isDeleted": false, + "id": "FaGIyLxwcwM-r2j9pMHp2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 478.6214149762976, + "y": -4208.14541931701, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 145, + "height": 20, + "seed": 2107456314, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "and another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "and another value" + }, + { + "type": "text", + "version": 3792, + "versionNonce": 1255260011, + "isDeleted": false, + "id": "3VIQjVNOQ5DFdQPt_HlPx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.4837160786736, + "y": -4196.306783802103, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1471763834, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3896, + "versionNonce": 1404862661, + "isDeleted": false, + "id": "R1FNA6QYXJAE2Wg6BBkmf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.7706478968538, + "y": -4182.526954256649, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 457987878, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3899, + "versionNonce": 886872587, + "isDeleted": false, + "id": "p7mZuEE_jy1w1NZuZEL71", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.7955878007014, + "y": -4169.357483102804, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1336186426, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 2404, + "versionNonce": 1718288459, + "isDeleted": false, + "id": "anUfuQZGoFRmo_9HIl_zk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 717.3925645716687, + "y": -4279.243374226462, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 78.0457406876982, + "seed": 94378982, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "o6Ok6BRVTyY0YZICjpu1r", + "focus": 0.8997046848840218, + "gap": 7.717266961434234 + }, + "endBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.5076896270609952, + "gap": 3.136161461857398 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -8.259218862988307 + ], + [ + 15.779906463149969, + 0.8433709402347214 + ], + [ + 16.66393948236995, + 25.82459982511837 + ], + [ + 17.30249991839189, + 50.97062533050765 + ], + [ + 19.11368951874503, + 69.7865218247099 + ], + [ + 32.76395546279845, + 69.2533562877799 + ], + [ + 79.49015283162282, + 64.28916667596013 + ] + ] + }, + { + "type": "arrow", + "version": 1830, + "versionNonce": 1241267685, + "isDeleted": false, + "id": "1sq5PdmMU7wreMSi402mr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 721.1531457114645, + "y": -4124.7073773528955, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 98.60285158357827, + "seed": 955022714, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "FCCUs0_i4qLdB0Ej94E4Y", + "focus": -0.04370403929404864, + "gap": 14.266227560214958 + }, + "endBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.5952944648084507, + "gap": 3.58397693526166 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 6.27657903854597 + ], + [ + 18.59813121582617, + -20.04021531495019 + ], + [ + 19.223914873307095, + -62.172505460118806 + ], + [ + 20.97039282122862, + -79.42577359648875 + ], + [ + 30.03673441651118, + -86.48753942210244 + ], + [ + 75.28175621842279, + -92.32627254503231 + ] + ] + }, + { + "type": "text", + "version": 514, + "versionNonce": 1254937477, + "isDeleted": false, + "id": "r9AtQIG-zS2yFMMLF7FLH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 800.0188788651488, + "y": -4240.252487562602, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 484, + "height": 50, + "seed": 2017439526, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Can't locally order rows with the same ch value \nby cl value, because of high cardinality of ch ", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Can't locally order rows with the same ch value \nby cl value, because of high cardinality of ch " + }, + { + "type": "text", + "version": 1003, + "versionNonce": 868209483, + "isDeleted": false, + "id": "S9aThX9aR8pW8qWeVFqKt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 798.7303720319195, + "y": -4132.157828770881, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 501, + "height": 75, + "seed": 1882373690, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Bad data locality:\ncl data is in random order, \nand therefore that data will be compressed worse", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bad data locality:\ncl data is in random order, \nand therefore that data will be compressed worse" + }, + { + "type": "arrow", + "version": 1477, + "versionNonce": 291159787, + "isDeleted": false, + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1016.7432970066836, + "y": -4187.071827030952, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 0.9356510596478529, + "height": 39.412854949889606, + "seed": 1879759462, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.10694674091478941, + "gap": 3.180660531650574 + }, + "endBinding": { + "elementId": "S9aThX9aR8pW8qWeVFqKt", + "focus": -0.12050265110988774, + "gap": 15.50114331018176 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.9356510596478529, + 39.412854949889606 + ] + ] + }, + { + "type": "text", + "version": 3205, + "versionNonce": 1182234181, + "isDeleted": false, + "id": "Kc78Sf6teXO2KTKiRinns", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -175.50485157304524, + "y": -4727.141252753443, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 832145254, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1127, + "versionNonce": 588932517, + "isDeleted": false, + "id": "00AAAOP2mz9j-ETnOx4Ap", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": -23.997585556718356, + "y": -4829.970267373838, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 1254353658, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 3376, + "versionNonce": 6842629, + "isDeleted": false, + "id": "SNY-PfJ7f0iQJTZZjEcNx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -172.48684407606407, + "y": -4199.1940317516355, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 779573562, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1297, + "versionNonce": 1735546315, + "isDeleted": false, + "id": "02UXtFhzFeL1YkGEvp_26", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": -20.979578059737296, + "y": -4302.02304637203, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 439447398, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 805, + "versionNonce": 1910203499, + "isDeleted": false, + "id": "nIC2GVfSBcWRYJ8P0ua7n", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -67.2283376687189, + "y": -4924.215103331335, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 222, + "height": 25, + "seed": 1587856523, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (cl, ch) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (cl, ch) " + }, + { + "type": "text", + "version": 840, + "versionNonce": 927706053, + "isDeleted": false, + "id": "bLvEuzx5XMyTsh0bQ0P2-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -51.80236372990356, + "y": -4366.349603590697, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 222, + "height": 25, + "seed": 1104014027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (ch, cl) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (ch, cl) " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw b/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw new file mode 100644 index 00000000000..f2656285cc6 --- /dev/null +++ b/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw @@ -0,0 +1,9556 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 3183, + "versionNonce": 359071435, + "isDeleted": false, + "id": "p1WxM-Qoc3hiBO5eo-2jf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3166.7053500934853, + "y": -4253.225960235581, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 784694661, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216762462, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3061, + "versionNonce": 1987930693, + "isDeleted": false, + "id": "paClRYMk-CVd1O4Ii1CMo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3546.8696000569953, + "y": -3810.749117838364, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 296.11179326251374, + "seed": 1786671685, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756416, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2964, + "versionNonce": 1243154571, + "isDeleted": false, + "id": "tWiuLgmsLkU6DIrA3FRP0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3167.133003467527, + "y": -3807.996383637967, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 296.11179326251374, + "seed": 759477547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756416, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3039, + "versionNonce": 410871755, + "isDeleted": false, + "id": "MQsW9s8xL8qvXI6gwA3_M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.50900556125794, + "y": -3118.005636936821, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 1484196441, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1995, + "versionNonce": 1178996325, + "isDeleted": false, + "id": "m8AOUclFzCqKasrwXU2vt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.91401548189265, + "y": -3116.7830426907876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1444422583, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "rectangle", + "version": 3045, + "versionNonce": 867448427, + "isDeleted": false, + "id": "8CysppYmg170rFx8o8zB4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.70430195537233, + "y": -3084.804405876214, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1370904377, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3844, + "versionNonce": 1750610187, + "isDeleted": false, + "id": "btWfoMtAtMD25RyXu595z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.92057580676624, + "y": -3053.8176940270746, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 54069273, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2107, + "versionNonce": 830288869, + "isDeleted": false, + "id": "Ioel2cvvh0rZRzBFg9NAJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -18.22496457700231, + "y": -3151.5404211630103, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 593039415, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2240, + "versionNonce": 386672875, + "isDeleted": false, + "id": "R2ojjX132toy3HDwE3xSl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 341.2359729229977, + "y": -3153.3333899130103, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 648573625, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2011, + "versionNonce": 1305964357, + "isDeleted": false, + "id": "asWw-4_Ug2fhxH2_d9ZWJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 236.5094104229977, + "y": -3117.0443274130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 1280831831, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 3915, + "versionNonce": 822989707, + "isDeleted": false, + "id": "92HFEivuWOU0GiX05Fm8V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -155.38307469604956, + "y": -3021.1098301644874, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 979088281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4041, + "versionNonce": 2126588459, + "isDeleted": false, + "id": "NzWOZMBc9drJAPtdtLohV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.80104344604956, + "y": -2990.0294730216306, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.3368675595235, + "height": 21.891121031746003, + "seed": 2075383929, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2162, + "versionNonce": 1964027083, + "isDeleted": false, + "id": "mY_9QXPQ9QndDCNHPvLCe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.31329429425955, + "y": -3083.9708472525467, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 745824601, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2099, + "versionNonce": 590715237, + "isDeleted": false, + "id": "R8gG4MutRqLZO1di-iUsD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.56062027526036, + "y": -3053.819488194116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1283439799, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2135, + "versionNonce": 127327083, + "isDeleted": false, + "id": "te8Gg4XypgtupMvEYrFIo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.67946207947375, + "y": -3020.3579924975697, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 166776377, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2093, + "versionNonce": 107422917, + "isDeleted": false, + "id": "nhl58uPXqosWvIUlY5YMe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.95475069446115, + "y": -2987.9037024130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1693781463, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 2088, + "versionNonce": 1386100235, + "isDeleted": false, + "id": "is9q-tkXUtwVs8symlqe7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 236.6969104229977, + "y": -3085.4857336630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1527553817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 2176, + "versionNonce": 1443906597, + "isDeleted": false, + "id": "n6wbRr3VpcSBsxdNQ18jh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.6265979229977, + "y": -3052.0951086630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 551762679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2262, + "versionNonce": 86064299, + "isDeleted": false, + "id": "2uj8BxFz9WKkik2M7JHv9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.3805041729977, + "y": -3019.0990149130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1044075513, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2327, + "versionNonce": 1176401797, + "isDeleted": false, + "id": "W5lD4wo_aYF8FD9jzk73z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.6656604229977, + "y": -2987.1497961630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 1422836759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "rectangle", + "version": 3103, + "versionNonce": 818888421, + "isDeleted": false, + "id": "oyuMeMC0-SbmyDATSoeAz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -151.82252782105002, + "y": -2953.61538396063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 702.7844122023815, + "height": 24.466455853174235, + "seed": 1353460023, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2142, + "versionNonce": 1978945003, + "isDeleted": false, + "id": "Trh2swDxyux7JKMxSJbiG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.9328879125385, + "y": -2949.4965843574537, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2121230777, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2139, + "versionNonce": 1286609477, + "isDeleted": false, + "id": "ix8YUQUncLk7LzGleGz89", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 240.42524084177717, + "y": -2949.7578690796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 1910499927, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on " + }, + { + "type": "rectangle", + "version": 3197, + "versionNonce": 580815269, + "isDeleted": false, + "id": "XFd01VPlmqh22umst9R6L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -153.53402335676424, + "y": -2917.214714317773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6482514880958, + "height": 22.71422371031703, + "seed": 1967032183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1134825259, + "isDeleted": false, + "id": "aiklupzf6rT4vtAyTULJ2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.14618540467586, + "y": -2914.185824000065, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1768492921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2220, + "versionNonce": 1137184005, + "isDeleted": false, + "id": "0FPc8nd3wOlKGKC7U-8KZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 240.58149084177717, + "y": -2915.1094315796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 151814295, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "rectangle", + "version": 3336, + "versionNonce": 1068115045, + "isDeleted": false, + "id": "XcY81vPHo7RVfA8-5Ow0E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -151.87777335676424, + "y": -2884.2197366392015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.2185639880958, + "height": 22.691902281745577, + "seed": 519984567, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2361, + "versionNonce": 46432363, + "isDeleted": false, + "id": "WaFkuRAsw-2s5YRmm8Hg1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.59575919400163, + "y": -2881.7631144368543, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 386155833, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1511149509, + "isDeleted": false, + "id": "-uehDvVOHOQc7dzrKX9D8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 241.80805334177717, + "y": -2882.0039628296763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 2117633751, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "rectangle", + "version": 3278, + "versionNonce": 18747173, + "isDeleted": false, + "id": "gtQWuXsry8ykoQmiIG3fO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.4313447853358, + "y": -2851.48257146063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.2799479166672, + "height": 23.09926835317424, + "seed": 357536759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2323, + "versionNonce": 854172075, + "isDeleted": false, + "id": "wVsdzAYGZSQbP-Sqk11-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.6933751924455, + "y": -2848.4610711891128, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1478298361, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2313, + "versionNonce": 54190725, + "isDeleted": false, + "id": "GWmICSsRM6kPtWsAAJD4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 242.17914709177717, + "y": -2848.9922440796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 206044439, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "rectangle", + "version": 3360, + "versionNonce": 86395365, + "isDeleted": false, + "id": "C1XpWR8XvAHh39Pd5jNql", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.85042960676424, + "y": -2816.5517678892015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.4920014880959, + "height": 21.129402281745573, + "seed": 378946103, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2426, + "versionNonce": 2124903147, + "isDeleted": false, + "id": "2U6j89Q16gt9GNxsIPpFQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.0701783205966, + "y": -2816.3996180055224, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1989107897, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2397, + "versionNonce": 938329413, + "isDeleted": false, + "id": "oetWI8rNlG3IK069wp6ym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 242.10883459177717, + "y": -2816.0313065796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 85910359, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "rectangle", + "version": 3431, + "versionNonce": 1324274853, + "isDeleted": false, + "id": "tX6O1DV2RYCpJQ_l_Li_N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -153.19864389247846, + "y": -2783.894401817773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.8301711309529, + "height": 23.143911210317018, + "seed": 406216823, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2473, + "versionNonce": 2073162795, + "isDeleted": false, + "id": "mp-99dhXTz2daYf4NIXpO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -133.13490381311317, + "y": -2781.0981468574537, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1966556793, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2498, + "versionNonce": 903280645, + "isDeleted": false, + "id": "3agSWLK-3AhTag5Z0UFwW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 243.28852209177717, + "y": -2781.2266190796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 295778711, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 3773, + "versionNonce": 111390565, + "isDeleted": false, + "id": "34A88GFXY9CCcG0HvZ4br", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.2764656334127267, + "y": -2748.9709866912317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 110358199, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3877, + "versionNonce": 1782392171, + "isDeleted": false, + "id": "LckWBoWXvnktFo_NPBTLF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.5633974515928912, + "y": -2735.1911571457777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1341176889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3840, + "versionNonce": 1067612869, + "isDeleted": false, + "id": "2I5ASjeqj09-q-kv4mqOH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.5883373554404443, + "y": -2722.021685991932, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1907556311, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3846, + "versionNonce": 1575698443, + "isDeleted": false, + "id": "aeB7to-DurtYDCmuZ8zP4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 384.9036977762696, + "y": -2749.936388476946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1994312985, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3950, + "versionNonce": 963697189, + "isDeleted": false, + "id": "aCcNhGCLNWN8wUQkhPpj2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 385.1906295944498, + "y": -2736.156558931492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 85126391, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3913, + "versionNonce": 1983710891, + "isDeleted": false, + "id": "WYGJ20KtITKclfAUqUDPW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 385.2155694982973, + "y": -2722.987087777646, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 999801337, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 1663187557, + "isDeleted": false, + "id": "lcdSSOpTllpVoxBgKbdsU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 689.2592409459633, + "y": -2394.0151226080548, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 183, + "height": 50, + "seed": 962965465, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "61YnaJnTFnqbuwlctLUN-", + "type": "arrow" + } + ], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content is stored \nin random order", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "content is stored \nin random order" + }, + { + "type": "arrow", + "version": 1226, + "versionNonce": 966654859, + "isDeleted": false, + "id": "2h_lJWmyLHbhscIs1Dbae", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": -203.07057824917115, + "y": -3138.4867331694013, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 1911728439, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 2984, + "versionNonce": 1723392517, + "isDeleted": false, + "id": "zBJ5VXkEChEe5uqTioovL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -336.8684118034191, + "y": -2988.841254411818, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 207, + "height": 25, + "seed": 737539479, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655220777443, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert order of rows" + }, + { + "type": "text", + "version": 917, + "versionNonce": 1969856267, + "isDeleted": false, + "id": "22IBNBUs5wrbD6iTKNaq0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -211.49094710820214, + "y": -2629.8118066134275, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 216, + "height": 25, + "seed": 1521703915, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (hash) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (hash) " + }, + { + "type": "rectangle", + "version": 2832, + "versionNonce": 650898213, + "isDeleted": false, + "id": "w42EK7f0BeOrMB-8LYcH4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 217.32240737455027, + "y": -2553.662165313527, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 480.7338169642854, + "seed": 1589199179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2591, + "versionNonce": 1821869483, + "isDeleted": false, + "id": "KdShR-ekfP_RKuNWHL6cu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -153.56085819537225, + "y": -2556.3803882797993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 482.7204241071425, + "seed": 1970179301, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2763, + "versionNonce": 1858944645, + "isDeleted": false, + "id": "JLlj8GrRbNXoqYzDSwPPk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -161.8823177687857, + "y": -2512.5523252837675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 1211686891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1804, + "versionNonce": 512727115, + "isDeleted": false, + "id": "QpCrZyxXhgHrTt-OKQsKJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -143.7327535167076, + "y": -2512.0620212682898, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 473278533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "rectangle", + "version": 2769, + "versionNonce": 101524965, + "isDeleted": false, + "id": "ZSgSwaSZH2wcoqQkP37MX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.0776141629001, + "y": -2479.3510942231596, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 697019019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3568, + "versionNonce": 153900779, + "isDeleted": false, + "id": "6pvwYbiy9U4AokPXfrn9A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -164.293888014294, + "y": -2448.3643823740213, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 1178752933, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1831, + "versionNonce": 798564677, + "isDeleted": false, + "id": "iiaBqurYVCMqCB7tIyx4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -25.598276784529617, + "y": -2546.0871095099565, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 2003575083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 1964, + "versionNonce": 184041867, + "isDeleted": false, + "id": "38r6PanY1AHwj6Z166EEh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.8626607154704, + "y": -2547.8800782599565, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 499260165, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 1736, + "versionNonce": 1892593829, + "isDeleted": false, + "id": "9BirB5svUi8JJ5rycoDzi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 229.13609821547038, + "y": -2511.5910157599565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 725926859, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "rectangle", + "version": 3639, + "versionNonce": 1294850091, + "isDeleted": false, + "id": "r71wIOY50jXdDxnsQORjH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.75638690357732, + "y": -2415.656518511433, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 724726373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3765, + "versionNonce": 1197167621, + "isDeleted": false, + "id": "ZUInZa9S8V0WFZNQPjFn2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.17435565357732, + "y": -2384.5761613685763, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.3368675595235, + "height": 21.891121031746003, + "seed": 758125163, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1925, + "versionNonce": 1840749259, + "isDeleted": false, + "id": "xhMVaw6ZOBfVDiom5rccM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -143.348727144162, + "y": -2480.08952227984, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 190897605, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 1925, + "versionNonce": 524061541, + "isDeleted": false, + "id": "HSCzbBIs7164AoqYH2Dz-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.80877707766308, + "y": -2448.5113654941238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2113441035, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 1962, + "versionNonce": 1764755819, + "isDeleted": false, + "id": "78h747g3TB4TleOJFomO8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.39684581956158, + "y": -2416.020958625834, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1701502245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 1916, + "versionNonce": 146790085, + "isDeleted": false, + "id": "f_pWRGs7e50aY2uAs-I7m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.14761881539948, + "y": -2383.3072633693705, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 555266987, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "text", + "version": 1813, + "versionNonce": 1155638283, + "isDeleted": false, + "id": "8anq89LRUwYoPz0uKhUut", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 229.32359821547038, + "y": -2480.0324220099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 549318789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "text", + "version": 1901, + "versionNonce": 780318245, + "isDeleted": false, + "id": "TouOAxRYQ9kokyaCXPt7l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.25328571547038, + "y": -2446.6417970099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1186661963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 1987, + "versionNonce": 2026302123, + "isDeleted": false, + "id": "0E15VDn4DihFizfdk-V9L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.00719196547038, + "y": -2413.6457032599565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1528272869, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2052, + "versionNonce": 192063877, + "isDeleted": false, + "id": "YLFNOShw3WTpc0nClQmWV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.29234821547038, + "y": -2381.6964845099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 901383403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 2827, + "versionNonce": 428498251, + "isDeleted": false, + "id": "TiuOOY-2cJlom3zpPjiUR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -159.19584002857778, + "y": -2348.1620723075766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 702.7844122023815, + "height": 24.466455853174235, + "seed": 512054085, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1913, + "versionNonce": 1624060133, + "isDeleted": false, + "id": "vZfpS0_o7sYPoXWCGNikx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.40247366566723, + "y": -2344.3081407419286, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1973432203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 1864, + "versionNonce": 1116109803, + "isDeleted": false, + "id": "Zd2vL-NuwafiOojeEKDo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 233.0519286342494, + "y": -2344.3045574266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1466213029, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "rectangle", + "version": 2921, + "versionNonce": 1814023237, + "isDeleted": false, + "id": "wF-tQxSnYyfZxlKLK68mo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -160.907335564292, + "y": -2311.7614026647198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6482514880958, + "height": 22.71422371031703, + "seed": 950535723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1972, + "versionNonce": 1069926027, + "isDeleted": false, + "id": "JzHFWdUOsyBawviDaMywm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.97871713481277, + "y": -2310.454216584111, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 174261765, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 1945, + "versionNonce": 1564998565, + "isDeleted": false, + "id": "VvlOUahL3uHlGfxLiBkK6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 233.20817863424986, + "y": -2309.6561199266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 96209099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "rectangle", + "version": 3060, + "versionNonce": 2013445419, + "isDeleted": false, + "id": "68GMsyRvCBV5Z3QjLnBFd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -159.251085564292, + "y": -2278.7664249861473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.2185639880958, + "height": 22.691902281745577, + "seed": 1249770853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2171, + "versionNonce": 208879365, + "isDeleted": false, + "id": "in5XmgU2egtNJGkJwtuiD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.06702064164188, + "y": -2277.068448827981, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 578205547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2065, + "versionNonce": 380100555, + "isDeleted": false, + "id": "DnM9L-_1Yzqr9ZgVyZ3tR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.43474113424986, + "y": -2276.5506511766225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 1862469829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": " fastest OLAP database on", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " fastest OLAP database on" + }, + { + "type": "rectangle", + "version": 3043, + "versionNonce": 1881085541, + "isDeleted": false, + "id": "3ggjxkgo6tOdCbJZbL1hs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -163.80465699286356, + "y": -2246.0292598075766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.2799479166672, + "height": 23.09926835317424, + "seed": 1025675787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2065, + "versionNonce": 1976544875, + "isDeleted": false, + "id": "3n8kjeJRvi1yQXGvo--SL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -146.2018862598486, + "y": -2243.9840229847455, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 160409637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2037, + "versionNonce": 1394147781, + "isDeleted": false, + "id": "cdTNNF8xl_lsLzo4nKuIv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.8058348842494, + "y": -2243.5389324266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 1455036587, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "rectangle", + "version": 3084, + "versionNonce": 1212459275, + "isDeleted": false, + "id": "VwI7AvGDfn80xchs0bPY6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -164.223741814292, + "y": -2211.0984562361473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.4920014880959, + "height": 21.129402281745573, + "seed": 470899589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2143, + "versionNonce": 1249804581, + "isDeleted": false, + "id": "Rah-cHPbSp1Jaz1OnZBKf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -147.32005542095817, + "y": -2211.459328044157, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1827130187, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2122, + "versionNonce": 58806187, + "isDeleted": false, + "id": "LvJ9C8wx2igOGDZ0UP9SH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.7355223842494, + "y": -2210.5779949266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 247833317, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "rectangle", + "version": 3155, + "versionNonce": 1807553669, + "isDeleted": false, + "id": "sd1yueVIRTgDd2dvDHr9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -160.57195610000622, + "y": -2178.4410901647198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.8301711309529, + "height": 23.143911210317018, + "seed": 1678125547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2238, + "versionNonce": 162538059, + "isDeleted": false, + "id": "S8l-U7J9vHo9hbrENOhK8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -146.4391665536143, + "y": -2175.6448352044, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1715076677, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2222, + "versionNonce": 1116879845, + "isDeleted": false, + "id": "6QJzqJa_GR5uuzQzxIxRt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 235.91520988424986, + "y": -2175.7733074266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 824161419, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 3497, + "versionNonce": 330014955, + "isDeleted": false, + "id": "0im-lLcMmx5LAgSJehgT8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -6.096846574115034, + "y": -2143.517675038178, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 961277349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3601, + "versionNonce": 118191941, + "isDeleted": false, + "id": "mLBxENMtRCpw-TytnR2Hy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -5.809914755934869, + "y": -2129.737845492724, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1139731243, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3604, + "versionNonce": 1526614923, + "isDeleted": false, + "id": "tCBhDXJrqPA7zeO1GPMWK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -5.784974852087316, + "y": -2116.568374338878, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1730736389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3570, + "versionNonce": 327567013, + "isDeleted": false, + "id": "zMPuZKFglQxl2KHVnWK4k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.53038556874185, + "y": -2144.4830768238926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 819875275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3674, + "versionNonce": 65184299, + "isDeleted": false, + "id": "ez4OYglVPqqXDzwuRoD-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.817317386922, + "y": -2130.7032472784385, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 223250533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3677, + "versionNonce": 447752709, + "isDeleted": false, + "id": "89ZKbCIYnxnJVokM5EQa1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.84225729076957, + "y": -2117.533776124593, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 453532779, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 964, + "versionNonce": 1195582667, + "isDeleted": false, + "id": "ajtEYVqmW42eOK1TXI_ln", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": -196.4438904566989, + "y": -2533.0334215163475, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 1032467397, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3513, + "versionNonce": 613592587, + "isDeleted": false, + "id": "o4-zFy4E_jqeHJurXghwB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -343.0858863818887, + "y": -2383.0821152253084, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 1451070981, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 2683, + "versionNonce": 298235051, + "isDeleted": false, + "id": "CzddlABOhDB8TViZGAlMw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 579.299911798428, + "y": -2506.307896419628, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 173.95942343925103, + "seed": 934518027, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -18.40931918646651 + ], + [ + 15.779906463149969, + 1.8798248465053824 + ], + [ + 16.66393948236995, + 57.56153323092345 + ], + [ + 17.30249991839189, + 113.6105637117851 + ], + [ + 19.11368951874503, + 155.55010425278454 + ], + [ + 32.76395546279845, + 154.36170923487882 + ], + [ + 79.49015283162282, + 143.29681888844888 + ] + ] + }, + { + "type": "arrow", + "version": 2138, + "versionNonce": 1521254277, + "isDeleted": false, + "id": "_YN16cB6fgb-cF-eD3Lar", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 583.2725607153009, + "y": -2167.3375430023743, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 209.8449522449944, + "seed": 78171429, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 13.357711338492038 + ], + [ + 18.59813121582617, + -42.64925362914658 + ], + [ + 19.223914873307095, + -132.31449425346148 + ], + [ + 20.97039282122862, + -169.03261315165378 + ], + [ + 30.03673441651118, + -184.06134597876843 + ], + [ + 75.28175621842279, + -196.48724090650234 + ] + ] + }, + { + "type": "text", + "version": 2173, + "versionNonce": 375146213, + "isDeleted": false, + "id": "qbSD73tBoatVqg-d8s6QJ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 680.7185861111018, + "y": -2296.3092691734532, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 204, + "height": 50, + "seed": 703995147, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "61YnaJnTFnqbuwlctLUN-", + "type": "arrow" + } + ], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "bad for compression \nof content column", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "bad for compression \nof content column" + }, + { + "type": "arrow", + "version": 129, + "versionNonce": 190587461, + "isDeleted": false, + "id": "61YnaJnTFnqbuwlctLUN-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 776.9484906060243, + "y": -2342.9330075232388, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 1.1809934673997304, + "height": 45.030042439117096, + "seed": 529179109, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lcdSSOpTllpVoxBgKbdsU", + "focus": 0.048806163122091475, + "gap": 1.0718368715292854 + }, + "endBinding": { + "elementId": "qbSD73tBoatVqg-d8s6QJ", + "focus": -0.03793177709135398, + "gap": 1.6058662945174547 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 1.1809934673997304, + 45.030042439117096 + ] + ] + }, + { + "type": "text", + "version": 2214, + "versionNonce": 1024595205, + "isDeleted": false, + "id": "zE9hHQl7luEGPddf-BMZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1080.4105365929627, + "y": -3154.2848675407477, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 97, + "height": 25, + "seed": 1500041259, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "fingerprint", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fingerprint" + }, + { + "type": "rectangle", + "version": 3190, + "versionNonce": 309537893, + "isDeleted": false, + "id": "CFvNSB8Tii-R3R8jj0sQu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.1326753877074, + "y": -3119.206715790251, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 668177099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2270, + "versionNonce": 1659893867, + "isDeleted": false, + "id": "TQz86ODTHbzzK9irhJ80f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3117.3117205837234, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 519836517, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "rectangle", + "version": 3240, + "versionNonce": 2121947077, + "isDeleted": false, + "id": "rOmlZtGeNq9_e91gxLbjD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.4563522078788, + "y": -3085.374904372502, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.1354166666671, + "height": 18.283420138888914, + "seed": 1829568875, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2179, + "versionNonce": 2127278859, + "isDeleted": false, + "id": "658KXSO-GZ82wqvWZiHLd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3085.0189716659743, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2001624773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2bb6f701", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2bb6f701" + }, + { + "type": "rectangle", + "version": 4028, + "versionNonce": 1799690021, + "isDeleted": false, + "id": "5GygS-naBD3Kkw026f4W5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.3773551421991, + "y": -3054.5388621662196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 851.5651041666665, + "height": 19.252170138888914, + "seed": 845126667, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3006, + "versionNonce": 680991147, + "isDeleted": false, + "id": "XEiLYrFiyJHQvcJpmPC44", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3052.3235910486846, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1509965349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "text", + "version": 3961, + "versionNonce": 591456901, + "isDeleted": false, + "id": "GMmTa1WkiHTvF2tT8fdRx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.0109364425653, + "y": -2743.690899866534, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1942348459, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4065, + "versionNonce": 1568451659, + "isDeleted": false, + "id": "IgxCLZ71St0f63RD0sfwC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.2978682607454, + "y": -2729.91107032108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2113876357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4068, + "versionNonce": 1194021349, + "isDeleted": false, + "id": "mWPorCoPHenCwnd7k_HtN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.322808164593, + "y": -2716.741599167234, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1240094027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2380, + "versionNonce": 290908907, + "isDeleted": false, + "id": "e0TJ4uY5yTqmVJW_s52_A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1343.8876985148208, + "y": -3151.926767873584, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 1619572965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2513, + "versionNonce": 68275525, + "isDeleted": false, + "id": "CayKn3uSd3hTG7GbZWdtM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.348636014819, + "y": -3153.719736623584, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 1411871723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 1487951243, + "isDeleted": false, + "id": "Vn88uwgCgfODTdX-a3iNu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1598.6220735148208, + "y": -3117.430674123584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 2066371653, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 4151, + "versionNonce": 156359845, + "isDeleted": false, + "id": "piIVTIbzK0-yiVZMvCe5X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1058.3590526814878, + "y": -3021.038587589347, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 853.2057291666666, + "height": 19.28342013888891, + "seed": 1653063307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3113, + "versionNonce": 1388538923, + "isDeleted": false, + "id": "ZPmnXm8bnZvKDHBw-BIY9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3018.6809487004566, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 968983461, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "rectangle", + "version": 4249, + "versionNonce": 1050214405, + "isDeleted": false, + "id": "u3p4aNoYk_I3dfTyOtO_g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1058.3942089314878, + "y": -2988.663587589347, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 855.4440104166664, + "height": 20.138888888888903, + "seed": 1606792491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3264, + "versionNonce": 1400549067, + "isDeleted": false, + "id": "_yKtUHTFLGEaMjJ-ynMmq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2986.1677886632838, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 813418245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "118785d9", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "118785d9" + }, + { + "type": "text", + "version": 2391, + "versionNonce": 971290469, + "isDeleted": false, + "id": "Z4-_m3bfavABdB1A1pJ_L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3084.516611623584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2068568011, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2336, + "versionNonce": 1299225963, + "isDeleted": false, + "id": "ICNQU7nKoJYX5y6bTGjKw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3051.536142873584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 299277925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1971487429, + "isDeleted": false, + "id": "2iZcjardkjL5vVwc7FE26", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3019.3699168949397, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 322217579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2344, + "versionNonce": 2079307787, + "isDeleted": false, + "id": "a_8AyM_XsI_Tty3ELgVDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2988.290049123584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1688177093, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 2361, + "versionNonce": 1175446053, + "isDeleted": false, + "id": "5DVVoEwHwkEdaoG1ffVxQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1598.8095735148208, + "y": -3085.872080373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1581949195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 2449, + "versionNonce": 1290960555, + "isDeleted": false, + "id": "Ak6Ggynr85K6-hvM1w7Xi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.7392610148208, + "y": -3052.481455373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 2046036261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2535, + "versionNonce": 276452741, + "isDeleted": false, + "id": "hLUIbvfih0EMeb7Oekwb7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.4931672648208, + "y": -3019.485361623584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1443383211, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2600, + "versionNonce": 186872139, + "isDeleted": false, + "id": "wLPBYz_8gigbPnAaF5vDU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.7783235148208, + "y": -2987.536142873584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 591502469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1073700069, + "isDeleted": false, + "id": "Ob9EgrpXMX2gErpCayDQm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3115.512705373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1620580939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3328afab", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3328afab" + }, + { + "type": "rectangle", + "version": 3310, + "versionNonce": 1205669867, + "isDeleted": false, + "id": "rvdnIF3hq3J9C5zBW0ukD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1063.052412056487, + "y": -2951.920257456918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 675660773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2390, + "versionNonce": 2083289157, + "isDeleted": false, + "id": "Dqwji45nAMFLWhhOXblw2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2949.8829310680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 987011307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2412, + "versionNonce": 86629003, + "isDeleted": false, + "id": "Qd8EGd1UM59L_lqaJj8Cy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.5379039335994, + "y": -2950.14421579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 2098069317, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on " + }, + { + "type": "text", + "version": 2359, + "versionNonce": 517941157, + "isDeleted": false, + "id": "_PU8Ew-5xYuMG7kqKLtag", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2948.35515329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 575161227, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3390, + "versionNonce": 532959531, + "isDeleted": false, + "id": "vDC-QJAOJElC2mAflUJf7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1063.204755806487, + "y": -2917.271819956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 938987173, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2471, + "versionNonce": 1782901509, + "isDeleted": false, + "id": "mLy-tmwHAgYi6owwC1OHp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2915.0963335308547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1059953195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2493, + "versionNonce": 2031547339, + "isDeleted": false, + "id": "VFRJLeLe8zcBrkA1VXcmQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.6941539335994, + "y": -2915.49577829025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1202762245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "text", + "version": 2441, + "versionNonce": 2128298597, + "isDeleted": false, + "id": "vhXbl1FtNgG06YbGwsvMR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2913.70671579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1315904715, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3511, + "versionNonce": 1631339115, + "isDeleted": false, + "id": "KYpD4NpQcFprhg3QF09TO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.431318306487, + "y": -2884.299163706918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1765157221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2590, + "versionNonce": 292531653, + "isDeleted": false, + "id": "MHvzV7Cp8XAuRHc5eaPYc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2882.1290248180276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 195513195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2612, + "versionNonce": 1090436363, + "isDeleted": false, + "id": "9pglgCozY6d4DaVc9RpNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1603.9207164335994, + "y": -2882.39030954025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 1574286533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "text", + "version": 2559, + "versionNonce": 1629465893, + "isDeleted": false, + "id": "zlW_Fl_Bb-NnXHV4pCWF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2880.60124704025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1528866315, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3480, + "versionNonce": 64545707, + "isDeleted": false, + "id": "yMZnOQpPHokpJpg86BqYd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.939130806487, + "y": -2851.154632456918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1630327845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2561, + "versionNonce": 1834532997, + "isDeleted": false, + "id": "AcpToHr0wiN-SUz7ioGhX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2849.1173060680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 869641387, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2586, + "versionNonce": 1106589259, + "isDeleted": false, + "id": "GhhxmWQDd825JG1fttqTL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1604.2918101835994, + "y": -2849.37859079025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 1596524421, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "text", + "version": 2530, + "versionNonce": 1809344485, + "isDeleted": false, + "id": "FaObkie0n6My9wYsBY-_i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2847.58952829025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1232133963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3566, + "versionNonce": 707671275, + "isDeleted": false, + "id": "aGHbDOOfxADePM3X9f9_X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.732099556487, + "y": -2818.193694956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1778896613, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2646, + "versionNonce": 2125210437, + "isDeleted": false, + "id": "BYP1T8CHQCLxfRPp-2XhV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2816.1563685680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1984740843, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2670, + "versionNonce": 739139467, + "isDeleted": false, + "id": "ktPKuhPR8o2SrsGoHAQod", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1604.2214976835994, + "y": -2816.41765329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1884727877, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2617, + "versionNonce": 707883685, + "isDeleted": false, + "id": "m14jWpBDhHMI41l861_06", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2814.62859079025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1702086795, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "18dd7c7d", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "18dd7c7d" + }, + { + "type": "rectangle", + "version": 3678, + "versionNonce": 1641035307, + "isDeleted": false, + "id": "Jaz9akBQ5drADFj_h5k3U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1065.911787056487, + "y": -2783.521819956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 854792613, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2748, + "versionNonce": 185980421, + "isDeleted": false, + "id": "d25jgMfaMO9yM2ysSd-3l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2781.3463335308547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2090893099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2771, + "versionNonce": 979253451, + "isDeleted": false, + "id": "5GMFJXb8da4Ea4qUByEcR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1605.4011851835994, + "y": -2781.61296579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 2064293125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 2717, + "versionNonce": 1280757093, + "isDeleted": false, + "id": "LI93PM8ubJnA1v8jp9LSS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2779.82390329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 104686027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "863461a7", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "863461a7" + }, + { + "type": "text", + "version": 4046, + "versionNonce": 1666377579, + "isDeleted": false, + "id": "UJEWdghA0qA2_86ZnIMPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.3891287252354, + "y": -2749.3573334018056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 270185573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4150, + "versionNonce": 1564596421, + "isDeleted": false, + "id": "dRbJGcMj4YIPXgdj_uRo0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.6760605434156, + "y": -2735.5775038563515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 459599979, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4153, + "versionNonce": 1928905227, + "isDeleted": false, + "id": "Jj9zqbedemJypWYiDMevx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.7010004472631, + "y": -2722.408032702506, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1844502469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4119, + "versionNonce": 1735686181, + "isDeleted": false, + "id": "naWsTnXqPGvf7IIiVnVR4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.0163608680896, + "y": -2750.3227351875194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1306635019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4223, + "versionNonce": 1380599979, + "isDeleted": false, + "id": "VOnuKyleBI4xXqwYvq-qk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.3032926862697, + "y": -2736.5429056420653, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 984260389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4226, + "versionNonce": 81537925, + "isDeleted": false, + "id": "cxpIRZSCs2xEWHQWjtfGj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.3282325901173, + "y": -2723.3734344882196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 305009067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1394, + "versionNonce": 1727134539, + "isDeleted": false, + "id": "FggqNXx6tTOZHDsxNo4p9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": 1017.1145488201892, + "y": -3121.117948431154, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 2092266117, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3148, + "versionNonce": 920609797, + "isDeleted": false, + "id": "2SXnjF-uLZt9FtMrYnMdh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 877.2096688972838, + "y": -2982.014312787203, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 207, + "height": 25, + "seed": 56518469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655220782246, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert order of rows" + }, + { + "type": "rectangle", + "version": 3171, + "versionNonce": 2102024683, + "isDeleted": false, + "id": "cs-7A9DnBR90lUlF_z21A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1600.3603849388564, + "y": -2556.777389227287, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 480.7338169642854, + "seed": 211623333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2319, + "versionNonce": 378588741, + "isDeleted": false, + "id": "ZMNIRHHI2PhPIJpCIrWnc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1080.1079847058572, + "y": -2557.53886771191, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 480.4825148809527, + "seed": 1837677355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2004, + "versionNonce": 1918755979, + "isDeleted": false, + "id": "XIiuUmm-61NzditdX3YI1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.9625388579207, + "y": -2551.56043309088, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 97, + "height": 25, + "seed": 416555269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "fingerprint", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fingerprint" + }, + { + "type": "rectangle", + "version": 2912, + "versionNonce": 1447607717, + "isDeleted": false, + "id": "XcOAsEwJjgTAGEzhnEQxX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1229.4771193689367, + "y": -2559.6926252875837, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 482.7204241071425, + "seed": 649993675, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2980, + "versionNonce": 501685035, + "isDeleted": false, + "id": "SBR25gx8jWVi0yq3Xh6O5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1072.6846776526654, + "y": -2516.4822813403835, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1108588645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1812709637, + "isDeleted": false, + "id": "I7040dqTZ0Vndh5VnamBS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2514.444954951493, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1684941931, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "rectangle", + "version": 3030, + "versionNonce": 2085649867, + "isDeleted": false, + "id": "r6WlOIc2znxgBiy86jVyA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1073.0083544728368, + "y": -2482.6504699226343, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.1354166666671, + "height": 18.283420138888914, + "seed": 36266949, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1992, + "versionNonce": 223828069, + "isDeleted": false, + "id": "N_SEJs8MeFCsyR0gPl1z1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2482.152206033744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 442722059, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "18dd7c7d", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "18dd7c7d" + }, + { + "type": "rectangle", + "version": 3818, + "versionNonce": 414485611, + "isDeleted": false, + "id": "yx4cpT8hVGr2KdPtb10o2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1072.929357407157, + "y": -2451.814427716352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 851.5651041666665, + "height": 19.252170138888914, + "seed": 1026728741, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2819, + "versionNonce": 1677263813, + "isDeleted": false, + "id": "QfD2vFCeYTKY3vH70DABZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2449.4567888274614, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1595428267, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2bb6f701", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2bb6f701" + }, + { + "type": "text", + "version": 3751, + "versionNonce": 920504075, + "isDeleted": false, + "id": "uHUECWkNLl5cB8LZPB2dy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.5629387075232, + "y": -2140.966465416666, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2006775429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3855, + "versionNonce": 68043557, + "isDeleted": false, + "id": "tg__PH_vVPuJ5HB-2_B1X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.8498705257034, + "y": -2127.186635871212, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 364339275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3858, + "versionNonce": 1028042155, + "isDeleted": false, + "id": "foHDXehdypmmzTKYti--r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.874810429551, + "y": -2114.017164717366, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1277550053, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2170, + "versionNonce": 570726021, + "isDeleted": false, + "id": "SSvLfCiy8xV4IENLMPHeB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1357.4397007797788, + "y": -2549.2023334237165, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 1478172395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2303, + "versionNonce": 1595523147, + "isDeleted": false, + "id": "GURelP14oOUMYX3lOXa3_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1716.900638279776, + "y": -2550.9953021737165, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 567990597, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2075, + "versionNonce": 144276965, + "isDeleted": false, + "id": "4e7TW-vPLWZFiXFj8eotN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.174075779776, + "y": -2514.7062396737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 550373771, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "rectangle", + "version": 3941, + "versionNonce": 103907051, + "isDeleted": false, + "id": "UIGEcB_CIuX4WhiVXVDbc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1071.9110549464458, + "y": -2418.3141531394795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 853.2057291666666, + "height": 19.28342013888891, + "seed": 572090533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2926, + "versionNonce": 1322940741, + "isDeleted": false, + "id": "TYeoeoxYERLcL2TgxgzVb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2415.956514250589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 889888811, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3328afab", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3328afab" + }, + { + "type": "rectangle", + "version": 4039, + "versionNonce": 2098751883, + "isDeleted": false, + "id": "AaYO3_wRGBCBy05XW_WcT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1071.9462111964458, + "y": -2385.9391531394795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 855.4440104166664, + "height": 20.138888888888903, + "seed": 1854868485, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3077, + "versionNonce": 1311049893, + "isDeleted": false, + "id": "-gPTxkSoRh-xP1h-kZTq3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2383.581514250589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1320903371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "text", + "version": 2181, + "versionNonce": 1493762091, + "isDeleted": false, + "id": "vaSMbBP2UqbNGMkvGUP9i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2481.7921771737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 389628773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2125, + "versionNonce": 1478929413, + "isDeleted": false, + "id": "mzLMk3hrw02k_22zqPwzh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2448.8117084237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 108712299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2153, + "versionNonce": 602784459, + "isDeleted": false, + "id": "ThnFZelW7BdLRSn7A8SNF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2416.5031146737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1348832965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "text", + "version": 2133, + "versionNonce": 752673637, + "isDeleted": false, + "id": "SX64nWN7D66InkhVzej8m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2385.5656146737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2106813451, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2152, + "versionNonce": 1180774763, + "isDeleted": false, + "id": "qv3HxGA6VQtsykg4_HuLP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.361575779776, + "y": -2483.1476459237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1756458533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2240, + "versionNonce": 815083205, + "isDeleted": false, + "id": "ZTRSyV96X4d_zq4l6em6c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.291263279776, + "y": -2449.7570209237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 265, + "height": 20, + "seed": 1207939755, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab " + }, + { + "type": "text", + "version": 2326, + "versionNonce": 833473547, + "isDeleted": false, + "id": "n26vDr6kFrObRcl3y62Qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.045169529776, + "y": -2416.7609271737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 2131386757, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "text", + "version": 2391, + "versionNonce": 1642925605, + "isDeleted": false, + "id": "W5n5NwSo3qMHtNjCFcCPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.330325779776, + "y": -2384.8117084237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 376055115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2053, + "versionNonce": 1238241963, + "isDeleted": false, + "id": "l4GMlq1nUD6JdgRADh8bQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2512.9852840177414, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2024663269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "118785d9", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "118785d9" + }, + { + "type": "rectangle", + "version": 3100, + "versionNonce": 265421189, + "isDeleted": false, + "id": "7ESgbFufVAwPyTdg3ck3b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1076.604414321445, + "y": -2349.19582300705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 539837419, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2180, + "versionNonce": 258770251, + "isDeleted": false, + "id": "Azc3Mjcjeo6ak6O1nCLmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2347.1584966181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 925467717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1333889253, + "isDeleted": false, + "id": "CeribvcC7eozU7TRuIIgD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1615.8911695720117, + "y": -2347.419781340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1297321611, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2173, + "versionNonce": 165913579, + "isDeleted": false, + "id": "yIW3bhE3CZjiX1KhTbvAW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2345.630718840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 240825253, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "rectangle", + "version": 3180, + "versionNonce": 847848517, + "isDeleted": false, + "id": "Rz2QFLoi_SQ5TYU5Vcj_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1076.756758071445, + "y": -2314.54738550705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 546800939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2260, + "versionNonce": 1899884171, + "isDeleted": false, + "id": "TPxPr0hYyp0t1yVUisQTW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2312.5100591181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2054092549, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 1019630501, + "isDeleted": false, + "id": "L-BNuWh_TloUbzraY-NC3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1616.2461561985547, + "y": -2312.771343840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 1633920971, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 2255, + "versionNonce": 406185259, + "isDeleted": false, + "id": "1HnQEmDnaHkljgWE0JSuv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2310.982281340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 367251045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "863461a7", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "863461a7" + }, + { + "type": "rectangle", + "version": 3301, + "versionNonce": 442930949, + "isDeleted": false, + "id": "buFcLgpz7ewIeLbBb1Lr3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1077.983320571445, + "y": -2281.57472925705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 97678955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2380, + "versionNonce": 372639691, + "isDeleted": false, + "id": "0RE1Jbpg_vMl6EibPBkAX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2279.4045903681595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1334229445, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2402, + "versionNonce": 367488613, + "isDeleted": false, + "id": "tsllb0cWUKQQGbQPMqwF0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.4727186985547, + "y": -2279.665875090382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 1554936075, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "text", + "version": 2372, + "versionNonce": 827905643, + "isDeleted": false, + "id": "4jfvtxNQGA09cy6dFaXUe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2277.876812590382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1618295077, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3270, + "versionNonce": 1310087621, + "isDeleted": false, + "id": "3v0Rr2tn8Sn7dFDPdLp0B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1078.491133071445, + "y": -2248.43019800705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 2003965867, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2351, + "versionNonce": 141086987, + "isDeleted": false, + "id": "xlCFLqVWt6eKKnphi6qDw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2246.3928716181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 35441797, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2377, + "versionNonce": 739301669, + "isDeleted": false, + "id": "PpP6W-DDGzjwlHI4z_XV-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.8438124485547, + "y": -2246.654156340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1413999179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "text", + "version": 2343, + "versionNonce": 2095085483, + "isDeleted": false, + "id": "mBWyoxQkH5NKPtXvREJxK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2244.865093840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1681585125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3356, + "versionNonce": 423914629, + "isDeleted": false, + "id": "DyC6DbR7jBZipIzPpkjm4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1078.284101821445, + "y": -2215.46926050705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1208641771, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2436, + "versionNonce": 1558858315, + "isDeleted": false, + "id": "HhwfOxhsnyrbUoMifhQLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2213.4319341181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1658662725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2461, + "versionNonce": 1970181093, + "isDeleted": false, + "id": "GZ1PxH32TYCHCyWHRaE8l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.7734999485547, + "y": -2213.693218840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 222, + "height": 20, + "seed": 675550091, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on" + }, + { + "type": "text", + "version": 2430, + "versionNonce": 1298188523, + "isDeleted": false, + "id": "z4lyJRB_LYgIr3YOBTYD3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2211.904156340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2086731429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3457, + "versionNonce": 1285345093, + "isDeleted": false, + "id": "EJE8q-EeutM9aRtA4aBRV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1079.463789321445, + "y": -2180.79738550705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 892299819, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2537, + "versionNonce": 1942909835, + "isDeleted": false, + "id": "I5rfO39QfMpVSmJAozcRO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2178.7600591181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 125035013, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2562, + "versionNonce": 1294769829, + "isDeleted": false, + "id": "8HzZOdUgoT2PLGxvdByTC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1618.9531874485547, + "y": -2178.888531340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 266, + "height": 20, + "seed": 1136061643, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear " + }, + { + "type": "text", + "version": 2531, + "versionNonce": 1617807915, + "isDeleted": false, + "id": "3Fygermvv_cPRNw6bHjBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2177.099468840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 689133925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "text", + "version": 3836, + "versionNonce": 2110489093, + "isDeleted": false, + "id": "MYHf44qUxLlQPvrtLnqsA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1376.9411309901934, + "y": -2146.6328989519375, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 661986155, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3940, + "versionNonce": 942230731, + "isDeleted": false, + "id": "9A6--91M-MxZbzevtkcsj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1377.2280628083736, + "y": -2132.8530694064834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 177005765, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3943, + "versionNonce": 863435109, + "isDeleted": false, + "id": "fq-GUbC5lAvrZD5sRPzsk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1377.2530027122211, + "y": -2119.6835982526377, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1555330571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3909, + "versionNonce": 513506155, + "isDeleted": false, + "id": "CG8JNZxXXpIPDFhE_fFNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.5683631330467, + "y": -2147.5983007376517, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1333658661, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4013, + "versionNonce": 1199342789, + "isDeleted": false, + "id": "OfHlKzy5ypA4iKK5oAORu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.8552949512268, + "y": -2133.8184711921976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1919909035, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4016, + "versionNonce": 1611585035, + "isDeleted": false, + "id": "1GwOVXkrbl34dhHvTwe3I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.8802348550744, + "y": -2120.649000038352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1272199045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1184, + "versionNonce": 747835211, + "isDeleted": false, + "id": "hLbMOnJ8wA8gbnwN6SyHZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": 1030.6665510851471, + "y": -2518.3935139812866, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 804641349, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3626, + "versionNonce": 363392491, + "isDeleted": false, + "id": "UXXtOG9DpEI8-U9p6lBNf", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 886.6210693069197, + "y": -2348.737919145162, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 1145330187, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "text", + "version": 2245, + "versionNonce": 994405835, + "isDeleted": false, + "id": "nn-lgBCpaIsETWvX7_ubF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 2038.7288147339104, + "y": -2394.4160930605126, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 252, + "height": 50, + "seed": 2129653963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "aPsf6_lhligZN5UjoNMUq", + "type": "arrow" + } + ], + "updated": 1655228267172, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "similar content is stored \nclose to each other", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "similar content is stored \nclose to each other" + }, + { + "type": "arrow", + "version": 2794, + "versionNonce": 917548843, + "isDeleted": false, + "id": "nwotZcDtqdhjFmyZiRrSd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1963.7788323688446, + "y": -2506.2309720467974, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 173.95942343925103, + "seed": 484218213, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -18.40931918646651 + ], + [ + 15.779906463149969, + 1.8798248465053824 + ], + [ + 16.66393948236995, + 57.56153323092345 + ], + [ + 17.30249991839189, + 113.6105637117851 + ], + [ + 19.11368951874503, + 155.55010425278454 + ], + [ + 32.76395546279845, + 154.36170923487882 + ], + [ + 79.49015283162282, + 143.29681888844888 + ] + ] + }, + { + "type": "arrow", + "version": 2249, + "versionNonce": 1297444101, + "isDeleted": false, + "id": "CYEG1rZpw33wJZ2cC3B6R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1967.751481285718, + "y": -2167.2606186295434, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 209.8449522449944, + "seed": 485334891, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 13.357711338492038 + ], + [ + 18.59813121582617, + -42.64925362914658 + ], + [ + 19.223914873307095, + -132.31449425346148 + ], + [ + 20.97039282122862, + -169.03261315165378 + ], + [ + 30.03673441651118, + -184.06134597876843 + ], + [ + 75.28175621842279, + -196.48724090650234 + ] + ] + }, + { + "type": "text", + "version": 2286, + "versionNonce": 1858572747, + "isDeleted": false, + "id": "rwFR0EjSH9E76bSP0Kfaq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 2036.1975066815185, + "y": -2296.232344800622, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 262, + "height": 50, + "seed": 701407429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "aPsf6_lhligZN5UjoNMUq", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "very good for compression \nof content column!", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "very good for compression \nof content column!" + }, + { + "type": "arrow", + "version": 511, + "versionNonce": 193690731, + "isDeleted": false, + "id": "aPsf6_lhligZN5UjoNMUq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2158.485991356077, + "y": -2343.3274777106535, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 2.3327224224058227, + "height": 45.50622035281913, + "seed": 410810891, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655228267173, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nn-lgBCpaIsETWvX7_ubF", + "focus": 0.059865761350412605, + "gap": 1.071836871528376 + }, + "endBinding": { + "elementId": "rwFR0EjSH9E76bSP0Kfaq", + "focus": -0.03793177709135198, + "gap": 1.605866294518819 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 2.3327224224058227, + 45.50622035281913 + ] + ] + }, + { + "type": "text", + "version": 1003, + "versionNonce": 1395204203, + "isDeleted": false, + "id": "MZk4m-pedbhAdY_Co7VYz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1016.0866577275192, + "y": -2618.8800827169925, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 328, + "height": 25, + "seed": 1760519915, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (fingerprint, hash) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (fingerprint, hash) " + }, + { + "type": "rectangle", + "version": 3047, + "versionNonce": 1473171493, + "isDeleted": false, + "id": "DIWj18WjJ-lmBFysLqRrO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2803.980531649605, + "y": -4252.547768976054, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 915874117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2765, + "versionNonce": 1835102379, + "isDeleted": false, + "id": "Fom-vC3182nzSwkFFkKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2433.1580579336414, + "y": -4255.265991942324, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 239.25119804797578, + "seed": 2061123979, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3422, + "versionNonce": 673940357, + "isDeleted": false, + "id": "EQTUoYwNwHxClmXWg4Fjk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2424.754557287595, + "y": -4208.919428995535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1068.2330070953583, + "height": 19.051750545273826, + "seed": 1745662117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2990, + "versionNonce": 1692672843, + "isDeleted": false, + "id": "ZG16-HFXnQejdegFgeVTJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2424.733183229365, + "y": -4179.906530684606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1070.7482094771276, + "height": 19.953252937808696, + "seed": 1892669483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3767, + "versionNonce": 1700448997, + "isDeleted": false, + "id": "voXBNvXF_q7ST3xgEK9Al", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2422.516909377971, + "y": -4148.686376461232, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1073.5800802604406, + "height": 20.124944492145907, + "seed": 651777029, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3694, + "versionNonce": 2146051653, + "isDeleted": false, + "id": "II3NrBBIAn0wXhM3pj1Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.6059569801632, + "y": -4132.188274932398, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1593477989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3798, + "versionNonce": 1743129739, + "isDeleted": false, + "id": "CvXhSR11WT_xyM0CyOugX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.8928887983434, + "y": -4118.408445386944, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 206702955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3801, + "versionNonce": 2058818981, + "isDeleted": false, + "id": "7AWIWUHWa5OKZdvLTZ5jp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.917828702191, + "y": -4105.238974233098, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 549312197, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2178, + "versionNonce": 2769707, + "isDeleted": false, + "id": "iMs1mGIDuEALlrFKV1neV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2539.913357494175, + "y": -4179.280465143762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 868459531, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "larger value" + }, + { + "type": "text", + "version": 2373, + "versionNonce": 552540421, + "isDeleted": false, + "id": "20OE-TjWFLvbKWeXG9utN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2573.9514048565397, + "y": -4247.556757632726, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 25, + "seed": 381728293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid" + }, + { + "type": "text", + "version": 2072, + "versionNonce": 2079237579, + "isDeleted": false, + "id": "IRtQZLg9YdVRQCN_qiMPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2918.5913231655086, + "y": -4209.379651756777, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 996731563, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "some value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "some value" + }, + { + "type": "text", + "version": 2183, + "versionNonce": 2081402981, + "isDeleted": false, + "id": "TF51Wp7Mi52qSpDrSwEI8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2569.813159056327, + "y": -4210.1691984324925, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 42, + "height": 20, + "seed": 1005627781, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "value" + }, + { + "type": "text", + "version": 2278, + "versionNonce": 1380824171, + "isDeleted": false, + "id": "SlC3bHAxWSaZUC3yJ9nY0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2524.2436114951693, + "y": -4146.865307776445, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 137, + "height": 20, + "seed": 938237259, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "even larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "even larger value" + }, + { + "type": "text", + "version": 2162, + "versionNonce": 166091717, + "isDeleted": false, + "id": "uK1AAnKdL7t4njBwjtyd0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2906.2225134816485, + "y": -4178.222668848122, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1368076517, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "another value" + }, + { + "type": "text", + "version": 2262, + "versionNonce": 856813323, + "isDeleted": false, + "id": "Zc3Ndh3N0TX3gHRx67nCk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2891.918074345131, + "y": -4148.057240998274, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 145, + "height": 20, + "seed": 1151892459, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "and another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "and another value" + }, + { + "type": "text", + "version": 3821, + "versionNonce": 848337701, + "isDeleted": false, + "id": "Qnwq34wBA_Yn5GHGoCXNF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.780375447507, + "y": -4136.218605483367, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 354274373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3925, + "versionNonce": 1890964907, + "isDeleted": false, + "id": "q8v2Oiu-YxvFgz8X4eoB5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2960.0673072656873, + "y": -4122.438775937913, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 765970059, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3928, + "versionNonce": 2122051205, + "isDeleted": false, + "id": "DT6wW4iW2ljcbSTKX1Nj_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2960.092247169535, + "y": -4109.269304784068, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 914750373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3406, + "versionNonce": 1555783845, + "isDeleted": false, + "id": "ZFl1VMpSUuoQqj1fKGVJa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 2240.8098152927696, + "y": -4139.1058534328995, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 219611589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1326, + "versionNonce": 1738811435, + "isDeleted": false, + "id": "b29q_TTX5bQlG1lF04j0n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": 2392.317081309096, + "y": -4241.934868053294, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 891726091, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 883, + "versionNonce": 1915880453, + "isDeleted": false, + "id": "kbEK8cwAkj88852ooyWMU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2361.49429563893, + "y": -4306.261425271961, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 242, + "height": 25, + "seed": 347898149, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (uuid, ...) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (uuid, ...) " + }, + { + "type": "text", + "version": 2548, + "versionNonce": 2104580485, + "isDeleted": false, + "id": "unjQPjdlqcvQ-7t6JJehi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2909.5340805161545, + "y": -4249.466907755409, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 116, + "height": 25, + "seed": 157509989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "some column", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "some column" + }, + { + "type": "rectangle", + "version": 3122, + "versionNonce": 1343139147, + "isDeleted": false, + "id": "7DGwFwHn--T_YN-lORdBr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2799.0735512437077, + "y": -3809.928161069573, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 299.2631095638441, + "seed": 2010639077, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "z0ua18VXNGMa8I6OgumX6", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2858, + "versionNonce": 2138431717, + "isDeleted": false, + "id": "RE5dIgHaPRIU8XX9FeokO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2428.341884947379, + "y": -3812.646384035845, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 301.1095767910746, + "seed": 35414507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3240, + "versionNonce": 1140902891, + "isDeleted": false, + "id": "lOB5i5mUyRYPhxT8uKZET", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.868826100372, + "y": -3765.2352775872528, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1455.890015988075, + "height": 17.817000343718874, + "seed": 96683589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2111, + "versionNonce": 305298501, + "isDeleted": false, + "id": "uK8PMuoQMKthsSwMSnZCT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2542.24296719588, + "y": -3766.372903102158, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 531557515, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 2975, + "versionNonce": 1031149195, + "isDeleted": false, + "id": "3buiGxc5YZf7fV09TFBM5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.673529706258, + "y": -3735.6170899792055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 678180261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3774, + "versionNonce": 226798501, + "isDeleted": false, + "id": "h9rVcRYLvf_rLepdLs6L7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2417.457255854864, + "y": -3704.630378130067, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 198648619, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2242, + "versionNonce": 2066287915, + "isDeleted": false, + "id": "ypBDlZ3OepnNUFAk_bOeX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2466.4251605860727, + "y": -3801.882422728499, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 452999429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "rectangle", + "version": 4184, + "versionNonce": 1905913605, + "isDeleted": false, + "id": "dkGxzdleJ9vItK83hAM7d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.261204173714, + "y": -3640.6838760724754, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 1056933323, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3810, + "versionNonce": 8662987, + "isDeleted": false, + "id": "TRPj2IkRwz4EUs79oLwoO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.546303457056, + "y": -3693.568667025917, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1459408997, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3914, + "versionNonce": 1559217765, + "isDeleted": false, + "id": "QmGXJfO4WIm3YYDSYvIRH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.8332352752363, + "y": -3679.7888374804647, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1078105195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3917, + "versionNonce": 2141322859, + "isDeleted": false, + "id": "0UW4F-8GOLDRMcxLamP3r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.858175179084, + "y": -3666.619366326617, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1244625861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2360, + "versionNonce": 1112781253, + "isDeleted": false, + "id": "OwjPgrxMGgD02xhpWTPbu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2837.345380219596, + "y": -3800.942352090195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 265, + "height": 25, + "seed": 1332399883, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "higher cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "higher cardinality column ch" + }, + { + "type": "text", + "version": 2110, + "versionNonce": 55376139, + "isDeleted": false, + "id": "dscmqZUjoNGyg68BzjNMw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2948.752371782377, + "y": -3765.2191415863313, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1286978341, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v1" + }, + { + "type": "text", + "version": 2184, + "versionNonce": 1258817547, + "isDeleted": false, + "id": "imRkuJ7JkPpzNm_-pcfe4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2947.2583169345316, + "y": -3733.769183191773, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 40, + "seed": 1324529067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216765915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v2\n", + "baseline": 34, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v2\n" + }, + { + "type": "text", + "version": 2282, + "versionNonce": 1493147563, + "isDeleted": false, + "id": "r_M8Kjq5x_hKhQrI3MVi1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2948.234954252633, + "y": -3703.940877632926, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 20, + "seed": 1459424901, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3" + }, + { + "type": "text", + "version": 2388, + "versionNonce": 1879819397, + "isDeleted": false, + "id": "Sx_Zar6hDHyeNFMcDc-XN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2952.0488146237763, + "y": -3640.342685401804, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 17, + "height": 20, + "seed": 1845807179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "vn", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "vn" + }, + { + "type": "text", + "version": 2206, + "versionNonce": 988049995, + "isDeleted": false, + "id": "5rbdwJGeoF5OKYM8Fqz69", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2543.9762639098085, + "y": -3736.304400080386, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 2009265637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2261, + "versionNonce": 696970213, + "isDeleted": false, + "id": "8Miy_qDZKNIHNsmwVOASx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2542.635109784303, + "y": -3706.024948141898, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 310085355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2390, + "versionNonce": 970322155, + "isDeleted": false, + "id": "oYQEsWzZQjDaoTI47e-8o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2543.7444594930544, + "y": -3640.32495345048, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 169144645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 4280, + "versionNonce": 1802381125, + "isDeleted": false, + "id": "TYeKcJqHSy_LK5_4B8yAd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2420.525834345527, + "y": -3598.7961772040985, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 48329099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2485, + "versionNonce": 1734253451, + "isDeleted": false, + "id": "yiIidIA18sodqB3ycKIvz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2956.313444795589, + "y": -3598.595724929312, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 726696101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "...", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 2531, + "versionNonce": 940766885, + "isDeleted": false, + "id": "SxBO8JsgEVrk5FQOSZvCM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2526.874234794714, + "y": -3598.7187313738764, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1349584939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "different value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "different value" + }, + { + "type": "text", + "version": 3934, + "versionNonce": 652336325, + "isDeleted": false, + "id": "c4Eqamnfr5_7DgFW6yExw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.1870924325503, + "y": -3692.723477022752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 649253899, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4038, + "versionNonce": 374013451, + "isDeleted": false, + "id": "j6rxPUdJ063qDw5Oj1C8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.4740242507305, + "y": -3678.943647477296, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1906083365, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4041, + "versionNonce": 108264485, + "isDeleted": false, + "id": "LJmiu3ipTGlutYvYONPj5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.498964154578, + "y": -3665.774176323452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1760697003, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3902, + "versionNonce": 1207239851, + "isDeleted": false, + "id": "5U7vbrPfRlK4XVK04hKqy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.4881685019072, + "y": -3585.2033335627934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1792178565, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4006, + "versionNonce": 558575493, + "isDeleted": false, + "id": "UCSiraGu-W8DsLJhxS9sn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.7751003200874, + "y": -3571.4235040173376, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1020235083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4009, + "versionNonce": 1340421963, + "isDeleted": false, + "id": "hi6xXhRlqbNmoBdau-cyt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.800040223935, + "y": -3558.2540328634936, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1672675557, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3959, + "versionNonce": 1973745381, + "isDeleted": false, + "id": "jGfRmsHgmqVkvGF6a6i37", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2589.7256883047808, + "y": -3585.858982634609, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 631614443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4063, + "versionNonce": 1551242731, + "isDeleted": false, + "id": "QXMxd3prM0IVx2_3TK2Jl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2590.012620122961, + "y": -3572.079153089155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 835427397, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4066, + "versionNonce": 1578029637, + "isDeleted": false, + "id": "faWn-R1-cQn_GApNkuCIR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2590.0375600268085, + "y": -3558.9096819353094, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1467938443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3489, + "versionNonce": 1823613067, + "isDeleted": false, + "id": "sK7VfQOROotGFdgDz4LV8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 2238.3048821077105, + "y": -3663.4858835954915, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 486132645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1410, + "versionNonce": 124141989, + "isDeleted": false, + "id": "W39ppyFfTgpN2nCjbvv_x", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": 2389.812148124038, + "y": -3766.3148982158878, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 555085099, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 1095, + "versionNonce": 2110689899, + "isDeleted": false, + "id": "GgNyTTqiK25-yc19gLLYR", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2346.581396012037, + "y": -3860.559734173385, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 276, + "height": 25, + "seed": 359337733, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "z0ua18VXNGMa8I6OgumX6", + "type": "arrow" + }, + { + "id": "rLvO1LgAa2qAv-FcJ26i-", + "type": "arrow" + }, + { + "id": "tHFRKN9bKZMgeFD1D9-g8", + "type": "arrow" + } + ], + "updated": 1655216859167, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (cl, ch, uuid) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (cl, ch, uuid) " + }, + { + "type": "text", + "version": 2494, + "versionNonce": 1247086533, + "isDeleted": false, + "id": "UpwfCJ_awvy0PjVOIUKi8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3307.9263503904244, + "y": -3800.287149328368, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 25, + "seed": 1783663045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid" + }, + { + "type": "text", + "version": 2593, + "versionNonce": 259353003, + "isDeleted": false, + "id": "1sjN3ggO5riGkc0WWRABY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3687.6629469798927, + "y": -3803.0398835287647, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 17, + "height": 25, + "seed": 1485602955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "...", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 3954, + "versionNonce": 1919985035, + "isDeleted": false, + "id": "bpIW6QzwIVkTuGWwJSfVI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3322.837371680836, + "y": -4137.058374484362, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 265134149, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4058, + "versionNonce": 645827749, + "isDeleted": false, + "id": "dngJEt6HpbIjp_4TYxXoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3323.124303499016, + "y": -4123.278544938906, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1435447947, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4061, + "versionNonce": 1878637611, + "isDeleted": false, + "id": "688DEMzqBIvbHCbQNumKD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3323.1492434028637, + "y": -4110.109073785062, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1947946917, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2790, + "versionNonce": 1924116485, + "isDeleted": false, + "id": "AvhaUY7ellA7nGo1jpYqR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3311.9127990988645, + "y": -4248.143049199147, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 17, + "height": 25, + "seed": 1774102827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "...", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 639, + "versionNonce": 231553547, + "isDeleted": false, + "id": "pEcCstdY6Meu0oOIM_LZO", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2840.1912257413414, + "y": -4432.777279282515, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 545, + "height": 100, + "seed": 1008153515, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655217195078, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid values are unique by definition\n\nClickHouse can't locally order rows that\nhave the same uuid value by values of other columns, ", + "baseline": 93, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid values are unique by definition\n\nClickHouse can't locally order rows that\nhave the same uuid value by values of other columns, " + }, + { + "type": "text", + "version": 3, + "versionNonce": 140737253, + "isDeleted": false, + "id": "AGAbEuIffQj2v1jEk-6yq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2867.8310707294304, + "y": -4681.581883296003, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 349, + "height": 25, + "seed": 713700229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655217201182, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid values are unique by definition", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid values are unique by definition" + }, + { + "type": "text", + "version": 97, + "versionNonce": 1607587909, + "isDeleted": false, + "id": "_YZRdsVLRxyatgKZZKs2N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2821.6809781577963, + "y": -4615.207979865381, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 436, + "height": 25, + "seed": 1037160939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655217248731, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "there are no rows with the same uuid value", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "there are no rows with the same uuid value" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/bad_skip_1.svg b/docs/ja/guides/best-practices/images/bad_skip_1.svg new file mode 100755 index 00000000000..73373679e38 --- /dev/null +++ b/docs/ja/guides/best-practices/images/bad_skip_1.svg @@ -0,0 +1,16 @@ + + + + + + + timestamp columnvisitor_idcolumnurlcolumnGranule 4072 8192 rows Granule 4073 8192 rows Granule 4074 8192 rows Granule 4075 8192 rows 2022-02-07 15:00:002022-02-07 16:00:002022-02-07 17:00:002022-02-07 18:00:0010011001100110011001 \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/simple_skip.svg b/docs/ja/guides/best-practices/images/simple_skip.svg new file mode 100755 index 00000000000..05e5019ad69 --- /dev/null +++ b/docs/ja/guides/best-practices/images/simple_skip.svg @@ -0,0 +1,16 @@ + + + + + + + my_key columnmy_valuecolumnGranule 61 8192 rows Granule 62 8192 rows Granule 63 8192 rows Granule 64 8192 rows 507904 ...516095524288 ...532479516096...524287516096...524288125124126128130127129131Skip IndexBlock of Two GranulesSkip IndexBlock of Two Granulesindex calc is set of (124, 125,126, 127) so blocknot skippedset of (128, 129,130, 131) so blockskipped \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png new file mode 100644 index 00000000000..ce0eb5e61c1 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png new file mode 100644 index 00000000000..c8d52bfd64c Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png new file mode 100644 index 00000000000..30418ace1af Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png new file mode 100644 index 00000000000..a65094ba3c4 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png new file mode 100644 index 00000000000..30418ace1af Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png new file mode 100644 index 00000000000..6cfa7562b8f Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png new file mode 100644 index 00000000000..b642c107cb9 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png new file mode 100644 index 00000000000..54db2c7ce2c Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png new file mode 100644 index 00000000000..9f98588b105 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png new file mode 100644 index 00000000000..cfad1bb9429 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png new file mode 100644 index 00000000000..1e292904d91 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png new file mode 100644 index 00000000000..1c07ec5acca Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png new file mode 100644 index 00000000000..4bf5c5ea034 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png new file mode 100644 index 00000000000..aa40aae9560 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png new file mode 100644 index 00000000000..2d5e3e91e61 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png new file mode 100644 index 00000000000..93cf2e3cb92 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png new file mode 100644 index 00000000000..de082849c11 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png new file mode 100644 index 00000000000..1f34b9f6612 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png new file mode 100644 index 00000000000..71798945110 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png new file mode 100644 index 00000000000..4b439ed992b Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png new file mode 100644 index 00000000000..062c0c5c598 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png new file mode 100644 index 00000000000..0c49751debf Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png new file mode 100644 index 00000000000..6b36d6ab603 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png new file mode 100644 index 00000000000..97c9084ec7d Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png new file mode 100644 index 00000000000..3161c59835a Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png new file mode 100644 index 00000000000..d9b8acc07c1 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png differ diff --git a/docs/ja/guides/best-practices/partitioningkey.md b/docs/ja/guides/best-practices/partitioningkey.md new file mode 100644 index 00000000000..5a16c1f8d26 --- /dev/null +++ b/docs/ja/guides/best-practices/partitioningkey.md @@ -0,0 +1,11 @@ +--- +slug: /ja/optimize/partitioning-key +sidebar_label: パーティショニングキー +title: 低カーディナリティのパーティショニングキーを選ぶ +description: 低カーディナリティのパーティショニングキーを使用するか、パーティショニングキーを使用しないテーブルにする。 + +--- + +import Content from '@site/docs/ja/cloud/bestpractices/partitioningkey.md'; + + diff --git a/docs/ja/guides/best-practices/skipping-indexes.md b/docs/ja/guides/best-practices/skipping-indexes.md new file mode 100644 index 00000000000..3c1eaea6f45 --- /dev/null +++ b/docs/ja/guides/best-practices/skipping-indexes.md @@ -0,0 +1,185 @@ +--- +slug: /ja/optimize/skipping-indexes +sidebar_label: データスキッピング インデックス +sidebar_position: 2 +description: スキップインデックスにより、ClickHouseは一致しないことが保証されているデータの大きなチャンクを読み飛ばすことができます。 +--- + +# ClickHouseデータスキッピングインデックスの理解 + +## はじめに + +ClickHouseのクエリパフォーマンスに影響を与える要因は多くあります。ほとんどのシナリオで重要なのは、ClickHouseがクエリWHERE句の条件を評価する際に主キーを使用できるかどうかです。したがって、最も一般的なクエリパターンに適用される主キーを選択することが、効果的なテーブル設計のために不可欠です。 + +しかし、どんなに慎重に主キーを調整しても、必然的にそれを効率的に使用できないクエリのユースケースが存在します。ユーザーは通常、ClickHouseを使用して時系列データを扱いますが、同じデータを顧客ID、ウェブサイトのURL、製品番号などの他の業務次元に基づいて分析したいと考えることがよくあります。その場合、WHERE句の条件を適用するために各カラム値の全スキャンが必要になるため、クエリのパフォーマンスがかなり悪化する可能性があります。このような場合でも、ClickHouseは相対的に速いですが、数百万または数十億の個々の値を評価することは、主キーに基づくクエリよりもはるかに遅くなります。 + +伝統的なリレーショナルデータベースでは、この問題に対処する1つの方法として、テーブルに1つ以上の「二次」インデックスを付けることがあります。これは、データベースがディスク上で一致する行をO(log(n))時間で見つけることを可能にするb-tree構造です(nは行数)。しかし、ディスク上に追加する個別の行がないため、このタイプの二次インデックスはClickHouse(または他の列指向データベース)には適用できません。 + +代わりに、ClickHouseは異なる種類のインデックスを提供しており、特定の状況でクエリの速度を大幅に向上させることができます。これらの構造は「スキップ」インデックスとラベル付けされており、一致しないことが保証されているデータの大きなチャンクの読み込みをClickHouseがスキップできるようにします。 + +## 基本操作 + +ユーザーはMergeTreeファミリーのテーブルでのみデータスキッピングインデックスを使用できます。各データスキッピングには4つの主要な引数があります: + +- インデックス名。インデックス名は各パーティション内のインデックスファイルの作成に使用されます。また、インデックスをドロップまたはマテリアライズする際のパラメータとして必要です。 +- インデックス式。インデックス式はインデックスに格納される値の集合を計算するために使用されます。カラム、単純演算子、および/またはインデックスタイプによって決定された関数のサブセットの組み合わせが可能です。 +- TYPE。インデックスタイプは、各インデックスブロックの読み取りと評価をスキップできるかどうかを決定する計算を制御します。 +- GRANULARITY。 各インデックス付きブロックは GRANULARITY グラニュールから成ります。たとえば、主テーブルインデックスの粒度が8192行で、インデックスの粒度が4である場合、各インデックス付き「ブロック」は32768行になります。 + +ユーザーがデータスキッピングインデックスを作成すると、テーブルの各データパートディレクトリに2つの追加ファイルが作成されます。 + +- `skp_idx_{index_name}.idx`, には順序付けられた式の値が含まれています +- `skp_idx_{index_name}.mrk2`, には関連付けられたデータカラムファイルへの対応するオフセットが含まれています。 + +クエリを実行して関連するカラムファイルを読み取るときに、WHERE句のフィルター条件の一部がスキップインデックスの式と一致する場合、ClickHouseはインデックスファイルのデータを使用して、関連する各データブロックを処理する必要があるか、(主キーを適用することでブロックがすでに除外されていない限り)バイパスできるかを判断します。非常に簡単な例を挙げると、以下のようなテーブルに予測可能なデータがロードされているとします。 + +``` +CREATE TABLE skip_table +( + my_key UInt64, + my_value UInt64 +) +ENGINE MergeTree primary key my_key +SETTINGS index_granularity=8192; + +INSERT INTO skip_table SELECT number, intDiv(number,4096) FROM numbers(100000000); +``` + +主キーを使用しない単純なクエリを実行すると、`my_value`カラムの1億エントリすべてがスキャンされます: + +``` +SELECT * FROM skip_table WHERE my_value IN (125, 700) + +┌─my_key─┬─my_value─┐ +│ 512000 │ 125 │ +│ 512001 │ 125 │ +│ ... | ... | +└────────┴──────────┘ + +8192 rows in set. Elapsed: 0.079 sec. Processed 100.00 million rows, 800.10 MB (1.26 billion rows/s., 10.10 GB/s. +``` + +ここで非常に基本的なスキップインデックスを追加します: + +``` +ALTER TABLE skip_table ADD INDEX vix my_value TYPE set(100) GRANULARITY 2; +``` + +通常、スキップインデックスは新たに挿入されたデータにのみ適用されるため、インデックスを追加するだけでは上記のクエリには影響しません。 + +既存のデータをインデックス化するには、次のステートメントを使用します: + +``` +ALTER TABLE skip_table MATERIALIZE INDEX vix; +``` + +新しく作成したインデックスでクエリを再実行します: + +``` +SELECT * FROM skip_table WHERE my_value IN (125, 700) + +┌─my_key─┬─my_value─┐ +│ 512000 │ 125 │ +│ 512001 │ 125 │ +│ ... | ... | +└────────┴──────────┘ + +8192 rows in set. Elapsed: 0.051 sec. Processed 32.77 thousand rows, 360.45 KB (643.75 thousand rows/s., 7.08 MB/s.) +``` + +1億行の800メガバイトを処理する代わりに、ClickHouseは32,768行の360キロバイトのみを読み取り、分析しました +-- 各8192行の4つのグラニュールです。 + +より視覚的な形式では、`my_value`が125である4096行がどのように読み取られ選択されたか、そして次の行がディスクからの読み取りなしにスキップされたかを示しています: + +![Simple Skip](images/simple_skip.svg) + +クエリを実行する際にtraceを有効にすることでスキップインデックスの使用に関する詳細情報にアクセスできます。 +clickhouse-clientから、`send_logs_level`を設定します: + +``` +SET send_logs_level='trace'; +``` +これにより、クエリSQLやテーブルインデックスの調整を試みる際に有用なデバッグ情報が提供されます。上記の例では、スキップインデックスが6104のうち6102のグラニュールを削除したことを示しています: + +``` + default.skip_table (933d4b2c-8cea-4bf9-8c93-c56e900eefd1) (SelectExecutor): Index `vix` has dropped 6102/6104 granules. +``` + +## スキップインデックスタイプ + +### minmax + +この軽量なインデックスタイプはパラメータを必要としません。各ブロックのインデックス式の最小値と最大値を記録します(式がタプルである場合、タプルの要素の各メンバーの値を個別に記録します)。このタイプは、値で緩やかにソートされる傾向があるカラムに理想的です。このインデックスタイプは通常、クエリ処理中に適用するのに最も費用がかかりません。 + +このタイプのインデックスは、スカラーまたはタプルの式でのみ正常に機能します。ただし、インデックスが配列またはマップデータ型を返す式には適用されません。 + +### set + +この軽量なインデックスタイプは、ブロックごとに格納される値集合の最大サイズ(0は無制限の個別値を許可)という単一のパラメータを受け取ります。この集合にはブロック内のすべての値が含まれます(値の数がmax_sizeを超える場合は空です)。このインデックスタイプは、各グラニュールセット内で低いカーディナリティ(基本的に「ひとつにまとまっている」)だが、全体では高いカーディナリティのカラムによく適しています。 + +このインデックスのコスト、パフォーマンス、および効果は、ブロック内のカーディナリティに依存します。各ブロックが大量のユニークな値を含む場合、クエリ条件を大きなインデックスセットに評価するのが非常に高価になるか、max_sizeを超えたためインデックスが空になり適用されないことがあります。 + +### Bloomフィルタタイプ + +*Bloomフィルタ*は、集合のメンバーシップのテストを効率的に行うためのデータ構造で、 false positive(誤って一致と判定する)可能性があります。スキップインデックスの場合、false positiveはわずかに余分なブロックを読み込むだけのデメリットしかないため、大きな問題にはなりません。ただし、false positivesの可能性があるため、インデックスした式がtrueであると予想されるべきです。さもないと、有効なデータがスキップされる可能性があります。 + +Bloomフィルタは、多数の個別値のテストをより効率的に処理できるため、多くの値をテストする条件式に適しています。特に、Bloomフィルタインデックスは配列に適用でき、配列の各値がテストされ、mapKeysまたはmapValues関数を使用してキーまたは値を配列に変換することでマップに適用されます。 + +Bloomフィルタに基づくデータスキッピングインデックスには、以下の3種類があります: + +* 基本的な**bloom_filter**は、false positive率を0から1の範囲で許可する単一のオプションパラメータを受け取ります(指定しない場合、.025が使用されます)。 + +* 専用の**tokenbf_v1**。これはBloomフィルタに関連する3つのパラメータを取ります:(1)フィルタのサイズ(バイト単位)(大きなフィルタはfalse positiveが少ないですが、ストレージのコストがかかります)、(2)適用されるハッシュ関数の数(より多くのハッシュ関数はfalse positiveを減少させます)、(3)Bloomフィルタのハッシュ関数のシードです。これらのパラメータがBloomフィルタの機能にどのように影響するかについては、計算機を参照してください。[ここ](https://hur.st/bloomfilter/)をご覧ください。 +このインデックスは、String、FixedString、Mapデータ型でのみ機能します。入力式は、非英数字で区切られた文字列に分割されます。たとえば、`This is a candidate for a "full text" search` という列の値は、`This` `is` `a` `candidate` `for` `full` `text` `search` というトークンが含まれます。LIKE、EQUALS、IN、hasToken()などの単語や他の値を長い文字列内で検索するために使用されます。たとえば、アプリケーションログの行の中で少数のクラス名や行番号を検索するのに役立つかもしれません。 + +* 専用の**ngrambf_v1**。このインデックスはトークンインデックスと同様に機能します。Bloomフィルタ設定の前にn-gramのサイズを表す追加パラメータを取得します。n-gramは任意の文字の長さ`n`の文字列です。`A short string`という文字列でn-gramサイズが4の場合、以下のようにインデックスされます: + ``` + 'A sh', ' sho', 'shor', 'hort', 'ort ', 'rt s', 't st', ' str', 'stri', 'trin', 'ring' + ``` +このインデックスは、特に単語の切れ目がない言語(中国語など)のテキスト検索に有用かもしれません。 + +## スキップインデックス関数 + +データスキッピングインデックスの主な目的は、人気のあるクエリによって分析されるデータの量を制限することです。ClickHouseデータの分析特性により、これらのクエリのパターンには多くの場合、機能的な表現が含まれています。そのため、スキップインデックスは一般的な関数と正しく連携する必要があります。これは、次のいずれかの場合に発生する可能性があります: +* データが挿入され、インデックスが機能的な式として定義されている場合(式の結果がインデックスファイルに格納される)、 +* クエリが処理され、式が格納されたインデックス値に適用され、ブロックを除外するかどうかを判断する場合。 + +各タイプのスキップインデックスは、可能な関数サポートのサブセットで機能します。[こちら](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree/#functions-support)に記載されています。一般的に、セットインデックスやBloomフィルタベースのインデックス(もう一つのセットインデックスタイプ)は無秩序で範囲では機能しません。対照的に、minmaxインデックスは範囲で特によく機能します。部分一致関数LIKE、startsWith、endsWith、およびhasTokenの有効性は、使用されるインデックスタイプ、インデックス式、およびデータの特定の形状に依存します。 + +## スキップインデックス設定 + +スキップインデックスに適用される設定は2つ存在します。 + +* **use_skip_indexes**(0または1、デフォルトは1)。すべてのクエリがスキップインデックスを効率的に利用できるわけではありません。特定のフィルタリング条件が +ほとんどの場合全グラニュールを含む可能性がある場合、データスキッピングインデックスを適用することは不要であり、時にはかなりのコストがかかります。スキップインデックスを利用する可能性が低いクエリの場合は、値を +0に設定してください。 +* **force_data_skipping_indices**(インデックス名のカンマ区切りリスト)。この設定は、一部の非効率的な +クエリを防ぐために使用できます。テーブルを問い合わせるのがスキップインデックスを使用しない限り高価すぎる場合、この設定を1つ以上のインデックス +名で使用すると、指定されたインデックスを使用しないクエリに対しては例外を返します。これにより、他のリソースを浪費するクエリを +防ぐことができます。 + +## スキップインデックスのベストプラクティス + +スキップインデックスは直感的ではなく、RDMSの領域の行ベースの二次インデックスや文書ストアのインバーテッドインデックスに慣れているユーザーには特にそうです。ClickHouseデータスキッピングインデックスを適用して利益を得るためには、計算コストを相殺するだけのグラニュールの読み取りを避ける必要があります。重要なことは、インデックス付きブロック内に1回でも値が現れる場合、それはブロック全体がメモリに読み込まれ評価されなければならず、インデックスコストが不必要にかかることを意味します。 + +以下のデータ分布を考えてみましょう: + +![Bad Skip!](images/bad_skip_1.svg) + +主/ORDER BY キーが `timestamp` で、`visitor_id` にインデックスがあると仮定します。次のクエリを考えます: + + `SELECT timestamp, url FROM table WHERE visitor_id = 1001` + +この種のデータ分布では、伝統的な二次インデックスが非常に有利です。 +要求されたvisitor_idを持つ5つの行を見つけるために32768行全体を読む代わりに、二次インデックスにはちょうど5つの行位置が含まれ、ディスクからそれらの5つの行だけが読み込まれます。 +ClickHouseのデータスキッピングインデックスでは逆が当てはまります。8192行のスキップ・ブロックの中で要求されたvisitor_idが1つでも見つかるため、visitor_idにインデックスが付いている8192行のすべての値がテストされます。 + +したがって、ClickHouseのクエリを単にキーとなるカラムにインデックスを追加することで高速化しようとする自然な衝動は、しばしば間違っています。この高度な機能は、他の代替手段、例えば主キーの変更([主キーの選び方](../best-practices/sparse-primary-indexes.md)を参照)、プロジェクションの利用、またはマテリアライズされたビューを使用するまでは利用するべきではありません。データスキッピングインデックスが適切である場合でも、多くの場合、インデックスとテーブルの両方の慎重な調整が必要になります。 + +ほとんどの場合、有用なスキップインデックスは、主キーとターゲットの非主カラム/式の強い相関関係を必要とします。 +(上記の図のように)相関がなければ、フィルタリング条件が数千の値ブロックの少なくとも1行に一致する可能性が高く、多くのブロックはスキップされません。対照的に、主キー(時間帯のような)の値の範囲が、潜在的なインデックスカラム(テレビ視聴者の年齢)の値と強く関連している場合、minmaxタイプのインデックスが有益である可能性があります。データを挿入する際にこの相関関係を高めることが可能かもしれません。これには、並べ替え/ORDER BYキーに追加のカラムを含める、または主キーと関連する値が挿入時にグループ化されるようにバッチ挿入することが含まれるかもしれません。例えば、サイトIDごとのすべてのイベントをまとめてグループ化して挿入プロセスによって一緒に挿入することができます。これにより、多くのグラニュールが少数のサイトIDのみを含むようになり、特定のサイトID値を検索する際に多くのブロックをスキップできるようになります。 + +スキップインデックスの良い候補の1つは、高カーディナリティの式で、1つの値がデータ内で比較的スパースである場合です。 1つの例として、APIリクエストにおけるエラーコードを追跡する観測プラットフォームが考えられます。データ内で稀であるエラーコードが特に重要である場合があります。エラーコードカラムに対するセットスキップインデックスを設定することで、エラーを含まないブロックの大部分をバイパスし、エラー中心のクエリを大幅に改善できます。 + +最後に、主要なベストプラクティスはテスト、テスト、テストです。 b-treeの二次インデックスや文書の検索用インバーテッドインデックスとは異なり、データスキッピングインデックスの動作は容易に予測できません。テーブルに追加することは、データ挿入時および、いくつかの理由で利益を得ないクエリの上での有意義なコストを伴います。常に実世界のデータでテストし、テストには型、粒度サイズ、および他のパラメータのバリエーションを含める必要があります。テストは思考実験だけでは明らかにならないパターンや落とし穴を明らかにすることがよくあります。 diff --git a/docs/ja/guides/best-practices/sparse-primary-indexes.md b/docs/ja/guides/best-practices/sparse-primary-indexes.md new file mode 100644 index 00000000000..5a961934363 --- /dev/null +++ b/docs/ja/guides/best-practices/sparse-primary-indexes.md @@ -0,0 +1,1459 @@ +--- +slug: /ja/optimize/sparse-primary-indexes +sidebar_label: スパース主キーインデックス +sidebar_position: 1 +description: このガイドでは、ClickHouseのインデックスについて深く掘り下げて解説します。 +--- + +# ClickHouseにおける主キーインデックスの実践的な紹介 + +## はじめに + +このガイドでは、ClickHouseのインデックスについて詳しく解説します。以下の点について具体的に説明します: +- [ClickHouseのインデックスが従来のリレーショナルデータベース管理システムとどのように異なるか](#an-index-design-for-massive-data-scales) +- [ClickHouseがどのようにテーブルのスパース主キーインデックスを構築し利用しているか](#a-table-with-a-primary-key) +- [ClickHouseでのインデックス作成のベストプラクティスは何か](#using-multiple-primary-indexes) + +このガイドで提案されているClickHouseのすべてのSQL文やクエリを、自分のマシンで実行することも可能です。ClickHouseのインストールと開始手順については、[クイックスタート](/docs/ja/quick-start.mdx)を参照してください。 + +:::note +このガイドはClickHouseのスパース主キーインデックスに焦点を当てています。 + +ClickHouseの[二次データスキッピングインデックス](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-data_skipping-indexes)については、[チュートリアル](/docs/ja/guides/best-practices/skipping-indexes.md)を参照してください。 +::: + + +### データセット + +このガイドを通じて、匿名化されたウェブトラフィックデータセットのサンプルを使用します。 + +- 8.87百万行(イベント)のサブセットを使用します。 +- 圧縮されていないデータサイズは8.87百万イベントで約700 MBです。ClickHouseに格納すると200 MBに圧縮されます。 +- サブセットでは、各行は特定の時間にURLをクリックしたインターネットユーザー(`UserID`カラム)が含まれています。 + +これらの3つのカラムを用いて、次のような一般的なウェブ分析クエリを既に立てることができます: + +- 「特定のユーザーが最もクリックしたURLのトップ10は何ですか?」 +- 「特定のURLを最も頻繁にクリックしたユーザーのトップ10は誰ですか?」 +- 「あるユーザーが特定のURLをクリックする最も人気のある時間(例:週の日)はいつですか?」 + +### テストマシン + +このドキュメントに示されている全ての実行時間は、Apple M1 Proチップと16GBのRAMを搭載したMacBook ProでClickHouseバージョン22.2.1をローカルで実行したものに基づいています。 + + +### フルテーブルスキャン + +主キーなしでデータセットに対してクエリがどのように実行されるかを確認するために、以下のSQL DDL文を実行してテーブルを作成します(テーブルエンジンはMergeTree): + +```sql +CREATE TABLE hits_NoPrimaryKey +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +PRIMARY KEY tuple(); +``` + +次に、以下のSQL挿入文を使用して、データセットのサブセットをテーブルに挿入します。これは、遠隔地にホストされている完全なデータセットのサブセットをロードするのに[URLテーブル関数](/docs/ja/sql-reference/table-functions/url.md)を使用します: + +```sql +INSERT INTO hits_NoPrimaryKey SELECT + intHash32(UserID) AS UserID, + URL, + EventTime +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz', 'TSV_FORMAT') +WHERE URL != ''; +``` +応答は: +```response +Ok. + +0 rows in set. Elapsed: 145.993 sec. Processed 8.87 million rows, 18.40 GB (60.78 thousand rows/s., 126.06 MB/s.) +``` + +ClickHouseクライアントの結果出力は、上記の文が8.87百万行をテーブルに挿入したことを示しています。 + +最後に、このガイドでのディスカッションを簡潔にし、図や結果を再現可能にするために、FINALキーワードを使用してテーブルを[最適化](/docs/ja/sql-reference/statements/optimize.md)します: + +```sql +OPTIMIZE TABLE hits_NoPrimaryKey FINAL; +``` + +:::note +一般的にはデータをロードした直後にテーブルを最適化することは必須でも推奨されることでもありません。この例でなぜこれが必要かは明らかになるでしょう。 +::: + +今、私たちは最初のウェブ分析クエリを実行します。次はインターネットユーザーID 749927693のトップ10最もクリックされたURLを計算しています: + +```sql +SELECT URL, count(URL) as Count +FROM hits_NoPrimaryKey +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` +応答は: +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.022 sec. +// highlight-next-line +Processed 8.87 million rows, +70.45 MB (398.53 million rows/s., 3.17 GB/s.) +``` + +ClickHouseクライアントの結果出力は、ClickHouseがフルテーブルスキャンを実行したことを示しています!テーブルの8.87百万行のそれぞれがClickHouseにストリーミングされました。これはスケールしません。 + +これをより効率的で高速にするためには、適切な主キーを持つテーブルを使用する必要があります。これにより、ClickHouseは主キーのカラムに基づいて自動的にスパース主キーインデックスを作成でき、その後、クエリの実行を大幅に高速化することができます。 + +### 関連コンテンツ +- ブログ: [ClickHouseクエリの高速化](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes) + +## ClickHouseインデックスデザイン + +### 大規模データスケール向けのインデックス設計 + +従来のリレーショナルデータベース管理システムでは、主キーインデックスはテーブル行ごとに1つのエントリーを含みます。これにより、我々のデータセットでは主キーインデックスが8.87百万のエントリーを含むことになり、特定の行をすばやく見つけることができ、高効率なルックアップクエリとポイントアップデートが可能になります。`B(+)-Tree`データ構造でのエントリー検索は平均的に`O(log n)`の時間複雑度を持ちます。さらに正確には、`b`が通常数百から数千の範囲であるため、`B(+)-Tree`は非常に浅い構造であり、少数のディスクアクセスでレコードを見つけることができます。8.87百万の行と1000のブランチングファクターであれば、平均して2.3回のディスクアクセスが必要です。この機能はコストとともに来ます:追加のディスクとメモリのオーバーヘッド、新しい行をテーブルとインデックスに追加する際の高い挿入コスト、時にはB-Treeの再バランシングも必要です。 + +B-Treeインデックスに関連する課題を考慮して、ClickHouseのテーブルエンジンは異なるアプローチを利用します。ClickHouseの[MergeTreeエンジンファミリー](/docs/ja/engines/table-engines/mergetree-family/index.md)は、巨大なデータ量を処理するために設計され最適化されています。これらのテーブルは、毎秒数百万行の挿入を受け取り、非常に大きな(数百ペタバイト)のデータを保存するために設計されています。データはテーブルに対して[パートごと](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)に迅速に書き込まれ、バックグラウンドでパートのマージルールが適用されます。ClickHouseでは、各パートには独自の主キーインデックスがあります。パートがマージされると、マージされたパートの主キーインデックスもマージされます。ClickHouseが設計されている非常に大規模なスケールでは、ディスクとメモリの効率が非常に重要です。そのため、全ての行をインデックス化するのではなく、パートの主キーインデックスには行のグループ(「グラニュール」と呼ばれる)ごとに1つのインデックスエントリ(「マーク」として知られる)があります - このテクニックは**スパースインデックス**と呼ばれます。 + +スパースインデックスは、ClickHouseがディスク上で行を主キーのカラムで順序付けて保存するために可能です。`B-Tree`ベースのインデックスのように単一の行を直接見つけ出すのではなく、スパース主キーインデックスを使うことでクエリに一致する可能性のある行のグループを素早く(インデックスエントリに対するバイナリサーチを介して)特定することができます。クエリに一致する可能性がある行のグループ(グラニュール)は、その後、並行してClickHouseエンジンにストリーミングされ、マッチを見つけ出すことができます。このインデックスデザインにより、主キーインデックスは小さく(完全にメインメモリに収まる必要があります)、クエリ実行時間を大幅に短縮します:特にデータ分析ユースケースで一般的な範囲クエリの場合です。 + +以下では、ClickHouseがどのようにスパース主キーインデックスを構築し使用しているかを詳しく説明します。その後、テーブルのインデックス(主キーのカラム)を構築する際の選択、削除および順序付けのベストプラクティスをいくつか議論します。 + +### 主キーを持つテーブル + +UserIDとURLをキーとした複合主キーを持つテーブルを作成します: + +```sql +CREATE TABLE hits_UserID_URL +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (UserID, URL) +ORDER BY (UserID, URL, EventTime) +SETTINGS index_granularity = 8192, index_granularity_bytes = 0, compress_primary_key = 0; +``` + +[//]: # (
) +
+ + DDL文の詳細 + +

+ +このガイドでのディスカッションを簡潔にし、結果を再現可能にするため、DDL文は以下に示すように +

    +
  • `ORDER BY`句を使用してテーブルの複合ソートキーを指定します
  • +
    +
  • 以下の設定を通じて、主キーインデックスのエントリー数を明示的に制御します:
  • +
    +
      +
    • `index_granularity`: デフォルト値の8192に明示的に設定されています。これは、8192行ごとに主キーインデックスに1つのエントリーが作成されることを意味します。つまり、テーブルに16384行が含まれている場合、インデックスには2つのエントリーが存在します。 +
    • +
      +
    • `index_granularity_bytes`: 適応インデックス粒度を無効にするために0に設定されます。適応インデックス粒度というのは、ClickHouseがn行のグループに対してインデックスエントリーを自動的に作成することを意味します。これらの条件が成り立つ場合: +
        +
      • nが8192より小さく、そのn行の合計データサイズが10 MB以上(index_granularity_bytesのデフォルト値)である場合、あるいは
      • +
      • n行の合計データサイズが10 MB未満であるが、nが8192である場合。
      • +
      +
    • +
      +
    • `compress_primary_key`: 主キーの圧縮を無効化するために0に設定されています。これにより、後でその内容を任意で確認できます。 +
    • +
    +
+

+
+ +上記のDDL文の主キーは、指定された2つのキーカラムに基づいて主キーインデックスを作成させます。 + +
+次にデータを挿入します: + +```sql +INSERT INTO hits_UserID_URL SELECT + intHash32(UserID) AS UserID, + URL, + EventTime +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz', 'TSV_FORMAT') +WHERE URL != ''; +``` +応答は以下のようになります: +```response +0 rows in set. Elapsed: 149.432 sec. Processed 8.87 million rows, 18.40 GB (59.38 thousand rows/s., 123.16 MB/s.) +``` + +
+そしてテーブルを最適化します: + +```sql +OPTIMIZE TABLE hits_UserID_URL FINAL; +``` + +
+以下のクエリを使用してテーブルのメタデータを取得できます: + +```sql +SELECT + part_type, + path, + formatReadableQuantity(rows) AS rows, + formatReadableSize(data_uncompressed_bytes) AS data_uncompressed_bytes, + formatReadableSize(data_compressed_bytes) AS data_compressed_bytes, + formatReadableSize(primary_key_bytes_in_memory) AS primary_key_bytes_in_memory, + marks, + formatReadableSize(bytes_on_disk) AS bytes_on_disk +FROM system.parts +WHERE (table = 'hits_UserID_URL') AND (active = 1) +FORMAT Vertical; +``` + +応答は: + +```response +part_type: Wide +path: ./store/d9f/d9f36a1a-d2e6-46d4-8fb5-ffe9ad0d5aed/all_1_9_2/ +rows: 8.87 million +data_uncompressed_bytes: 733.28 MiB +data_compressed_bytes: 206.94 MiB +primary_key_bytes_in_memory: 96.93 KiB +marks: 1083 +bytes_on_disk: 207.07 MiB + +1 rows in set. Elapsed: 0.003 sec. +``` + +ClickHouseクライアントの出力が示しているのは: + +- テーブルのデータが[ワイドフォーマット](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)で特定のディレクトリに保存されており、そのディレクトリ内でテーブルカラムごとにデータファイル(およびマークファイル)が1つあることを意味します。 +- テーブルには8.87百万行が含まれています。 +- 全ての行の非圧縮データサイズが733.28 MBです。 +- 全ての行のディスク上での圧縮サイズは206.94 MBです。 +- テーブルは、1083個のエントリー(「マーク」と呼ばれる)を持つ主キーインデックスを持ち、そのインデックスのサイズは96.93 KBです。 +- 合計で、テーブルのデータおよびマークファイルと主キーインデックスファイルを合わせてディスク上で207.07 MBを消費しています。 + +### 主キーのカラムで順序付けされたディスク上のデータストア + +上で作成したテーブルには +- 複合[主キー](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#primary-keys-and-indexes-in-queries) `(UserID, URL)` と +- 複合[ソートキー](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#choosing-a-primary-key-that-differs-from-the-sorting-key) `(UserID, URL, EventTime)` を持ちます。 + +:::note +- ソートキーのみを指定した場合、主キーは暗黙的にソートキーと同じものとして定義されます。 + +- メモリ効率を追求するために、クエリがフィルタリングするカラムだけを含む主キーを明示的に指定しました。主キーに基づく主キーインデックスは完全にメインメモリにロードされます。 + +- ガイド内の図に一貫性を持たせ、圧縮率を最大化するため、テーブルのすべてのカラムを含むソートキーを別途定義しました(カラム内の類似データを近くに配置すると、より良い圧縮が可能です)。 + +- 両方が指定された場合、主キーはソートキーの接頭辞である必要があります。 +::: + + +挿入された行は、主キーのカラム(およびソートキーの追加カラム)で辞書的順序(昇順)でディスク上に格納されます。 + +:::note +ClickHouseは、主キーのカラム値が同一の複数の行を挿入することを許可しています。この場合(下図の行1と行2を参照)、最終的な順序は指定されたソートキーによって決まり、したがって`EventTime`カラムの値によって最終的な順序が決定されます。 +::: + + + +ClickHouseは真の列指向データベース管理システムです。図に示すように +- ディスク上の表現では、テーブルの各カラムに対して単一のデータファイル(*.bin)が存在し、そのカラムの全ての値が圧縮された形式で保存され、そして +- 行は、主キーのカラム(およびソートキーの追加カラム)で辞書的に昇順でディスク上に保存されています。つまりこの場合は + - 最初に `UserID` で、 + - 次に `URL` で、 + - 最後に `EventTime` で: + + +UserID.bin, URL.bin, および EventTime.binは、`UserID`、`URL`、および `EventTime`カラムの値が保存されているディスク上のデータファイルです。 + +
+
+ + +:::note +- 主キーがディスク上の行の辞書的順序を定義するため、テーブルには1つの主キーしか持てません。 + +- 行を番号付けするとき、ClickHouseの内部行番号付けスキームと一致するように0から始めています。またログメッセージにも使用されます。 +::: + + + +### データはグラニュールに組織化され、並行的に処理される + +データ処理の目的上、テーブルのカラムの値は論理的にグラニュールに分割されます。 +グラニュールはClickHouseにストリーミングされる最小の分割可能なデータセットです。 +これは、ClickHouseが個々の行を読むのではなく、常に1つのグラニュール(つまり、行のグループ)を読み取ることを意味します。 +:::note +カラムの値はグラニュール内に物理的に保存されているわけではありません。グラニュールはクエリ処理のためのカラム値の論理的な組織です。 +::: + +以下の図は、我々のテーブルの8.87百万行(そのカラムの値)が、テーブルのDDL文に`index_granularity`(デフォルト値である8192に設定)の設定を含む結果として、1083個のグラニュールにどのように組織化されているかを示しています。 + + + +最初の(ディスク上の物理的な順序に基づいた)8192行(そのカラムの値)は論理的にグラニュール0に属し、次の8192行(そのカラムの値)はグラニュール1に属する、という具合です。 + +:::note +- 最後のグラニュール(グラニュール1082)は8192行未満を「含んでいます」。 + +- このガイドの冒頭で述べたように、「DDL文の詳細」で適応インデックス粒度を無効化しました(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)。 + + したがって、我々の例のテーブルのすべてのグラニュール(最後の1つを除く)は同じサイズを持っています。 + +- 適応インデックス粒度(index_granularity_bytesが[デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的である)を持つテーブルでは、一部のグラニュールのサイズが、行データサイズによっては8192行未満になることがあります。 + + + +- 主キーのカラム(`UserID`、`URL`)の一部のカラム値をオレンジ色でマークしました。 + これらのオレンジ色でマークされたカラム値は、各グラニュールの最初の行の主キーのカラム値です。 + これらのオレンジ色でマークされたカラム値が、テーブルの主キーインデックスのエントリーになります。 + +- グラニュールを番号付けするとき、ClickHouseの内部の番号付けスキームと一致し、またログメッセージにも使用されるように0から始めています。 +::: + + + +### 主キーインデックスはグラニュールごとに1エントリーを持つ + +主キーインデックスは上図のグラニュールに基づいて作成されます。このインデックスは未圧縮のフラットアレイファイル(primary.idx)であり、0から始まる数値インデックスマークを含みます。 + +下記の図は、インデックスが各グラニュールの最初の行の主キーのカラム値(上図でオレンジ色でマークされている値)をどのように保存しているかを示しています。 +あるいは、言い換えると:主キーインデックスは主キーのカラム値をテーブルの毎の8192行目から保存しています(物理的な順序に基づく)。 +例えば +- 最初のインデックスエントリー(下図で「マーク0」)は、上図のグラニュール0の最初の行のキーカラム値を保存しています。 +- 2番目のインデックスエントリー(下図で「マーク1」)は、上図のグラニュール1の最初の行のキーカラム値を保存しています。 + + + +合計でインデックスは、我々のテーブルの8.87百万行と1083グラニュール用に1083個のエントリーを持っています: + + + +:::note +- 適応インデックス粒度(index_granularity_bytesが [デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的である)を持つテーブルの場合、インデックスには、テーブル行の最後までの末尾の主キーのカラム値を記録する「最終」追加マークもストアされますが、我々の例のテーブルではこの適応インデックス粒度を無効化したため(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)、実例のインデックスにはこの最終的なマークは含まれません。 + +- 主キーインデックスファイルは完全にメインメモリにロードされます。もしファイルが利用可能な空きメモリ容量より大きい場合、ClickHouseはエラーをスローします。 +::: + +
+ + 主キーインデックスの内容を調べる + +

+ +セルフマネージドのClickHouseクラスタでは、ファイルテーブル関数を使用して、主キーインデックスの内容を調べることができます。 + +そのためにはまず、稼働中のクラスタのノードからのuser_files_pathに主キーインデックスファイルをコピーする必要があります: +

    +
  • ステップ1: 主キーインデックスファイルを含むパートパスを取得 +
  • +` +SELECT path FROM system.parts WHERE table = 'hits_UserID_URL' AND active = 1 +` + + +テストマシンでは、`/Users/tomschreiber/Clickhouse/store/85f/85f4ee68-6e28-4f08-98b1-7d8affa1d88c/all_1_9_4` を返します。 + +
  • ステップ2: user_files_pathを取得 +
  • +Linuxの場合のデフォルトのuser_files_pathは +`/var/lib/clickhouse/user_files/` + +Linuxでパスが変更されていたかどうかを確認できます。: `$ grep user_files_path /etc/clickhouse-server/config.xml` + +テストマシンのパスは `/Users/tomschreiber/Clickhouse/user_files/` です。 + +
  • ステップ3: 主キーインデックスファイルをuser_files_pathにコピー +
  • +` +cp /Users/tomschreiber/Clickhouse/store/85f/85f4ee68-6e28-4f08-98b1-7d8affa1d88c/all_1_9_4/primary.idx /Users/tomschreiber/Clickhouse/user_files/primary-hits_UserID_URL.idx +` + +
    + +
+ +上のSQLを使用して、主キーインデックスの内容を調べることができます: +
    +
  • エントリー数を取得 +
  • +` +SELECT count( )
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String'); +` + +
    +
    +`1083`を返します。 +
    +
    +
  • 最初の2つのインデックスマークを取得 +
  • +` +SELECT UserID, URL
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String')
    LIMIT 0, 2; +` +
    +
    +次を返します +
    +` +240923, http://showtopics.html%3...
    +4073710, http://mk.ru&pos=3_0 +` +
    +
    +
  • 最後のインデックスマークを取得 +
  • +` +SELECT UserID, URL
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String')
    LIMIT 1082, 1; +` +
    +
    +次を返します +
    +` +4292714039 │ http://sosyal-mansetleri... +` + + +
+ +これは、我々の例のテーブルの主キーインデックスの内容の図と完全に一致します: + +

+
+ +主キーエントリーはインデックスマークと呼ばれます、なぜなら各インデックスエントリーは特定のデータ範囲の開始を指し示しているためです。具体的にいうと例のテーブルでは: +- UserIDインデックスマーク:
+ 主キーインデックスに保存されている`UserID`値は昇順にソートされています。
+ 上記のマーク176は、すべての行がgranule 176にあり、その後のすべてのグラニュールにも`UserID`の値は749.927.693以上になることが保証されているということを示しています。 + + [後述するように](#the-primary-index-is-used-for-selecting-granules)、この全体的な順序付けによりClickHouseはクエリが主キーの最初のカラムにフィルタリングしている場合インデックスマークに対してバイナリ検索アルゴリズムを使用できるようになります。 + +- URLインデックスマーク:
+ 主キーのカラム`UserID`と`URL`のカードイナリティがほとんど同じであるため、最初のカラム以降のキーのインデックスマークは、一般に、先行キーの値に依存してグラニュール全体の値範囲のみを示します。
+ たとえば、上記のグラフでマーク0とマーク1のUserIDが異なる場合、ClickHouseはすべてのグラフがグラニュール0のURLが`'http://showtopics.html%3...'`以上であると仮定できません。しかし、上記のグラフでマーク0とマーク1が同じであれば(つまり、グラニュール0内のすべての行が同じUserIDを持つ場合)、ClickHouseはすべてのグラニュール0までのグラニュール内の行のURLが`'http://showtopics.html%3...'`以上であると仮定することができます。 + + このことのクエリの実行パフォーマンスに対する影響は後で詳しく議論します。 + +### 主キーインデックスはグラニュールの選択に使用される + +次に、主キーインデックスによるサポートを受けたクエリを実行できます。 + +以下はUserID 749927693のトップ10のクリックされたURLを計算します。 + +```sql +SELECT URL, count(URL) AS Count +FROM hits_UserID_URL +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +応答は以下の通りです: + +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.005 sec. +// highlight-next-line +Processed 8.19 thousand rows, +740.18 KB (1.53 million rows/s., 138.59 MB/s.) +``` + +ClickHouseクライアントの出力は、今度はフルスキャンを実行せずに、わずか8.19千行がClickHouseにストリーミングされたことを示しています。 + +トレースログが有効化されている場合、ClickHouseサーバーログファイルは、主キーインデックスの1083 UserIDマークをバイナリサーチを用いて、クエリに一致する可能性のある行を含むグラニュールを特定する過程を示しています。この処理には19ステップが必要で、平均的な時間複雑度は`O(log2 n)`です: + +```response +...Executor): Key condition: (column 0 in [749927693, 749927693]) +// highlight-next-line +...Executor): Running binary search on index range for part all_1_9_2 (1083 marks) +...Executor): Found (LEFT) boundary mark: 176 +...Executor): Found (RIGHT) boundary mark: 177 +...Executor): Found continuous range in 19 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 1/1083 marks by primary key, 1 marks to read from 1 ranges +...Reading ...approx. 8192 rows starting from 1441792 +``` + +サンプルトレースログでは、1のマークがクエリに一致する可能性のあるものとして選択されたことが示されています。 + +
+ + トレースログの詳細 + +

+ +マーク176が識別されました(‘found left boundary mark’は包含的で、‘found right boundary mark’は除外的です)。したがって、グラニュール176から始まる8192行全てがClickHouseにストリーミングされて、実際に`UserID`カラム値が`749927693`の行を見つけます。 +

+
+ +このことはEXPLAIN句を使用して簡単に再現できます: + +```sql +EXPLAIN indexes = 1 +SELECT URL, count(URL) AS Count +FROM hits_UserID_URL +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +応答は以下のようになります: + +```response +┌─explain───────────────────────────────────────────────────────────────────────────────┐ +│ Expression (Projection) │ +│ Limit (preliminary LIMIT (without OFFSET)) │ +│ Sorting (Sorting for ORDER BY) │ +│ Expression (Before ORDER BY) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter (WHERE) │ +│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │ +│ ReadFromMergeTree │ +│ Indexes: │ +│ PrimaryKey │ +│ Keys: │ +│ UserID │ +│ Condition: (UserID in [749927693, 749927693]) │ +│ Parts: 1/1 │ +// highlight-next-line +│ Granules: 1/1083 │ +└───────────────────────────────────────────────────────────────────────────────────────┘ + +16 rows in set. Elapsed: 0.003 sec. +``` +クライアントの出力は、1083個のgranuleのうち1つが、UserIDカラム値749927693の行を含む可能性があると選択されたことを示しています。 + +:::note 結論 +クエリが複合キーの一部であり最初のキーカラムでフィルタリングしている場合、ClickHouseはプロミナリキーインデックスマークに対してバイナリサーチアルゴリズムを実行しています。 +::: + +ClickHouseはそのスパース主キーインデックスを使用して簡単に(バイナリサーチを通じて)クエリにマッチする可能性がある行を含むgranuleを選択しています。 + +これはClickHouseクエリ実行の**最初のステージ(granule選択)**です。 + +クエリ実行の**第二ステージ(データ読み取り)**では、ClickHouseは選択されたgranuleを特定し、その全ての行をClickHouseエンジンにストリーミングして、実際にクエリに一致する行を見つけるプロセスを並行して実行します。 + +以下のセクションでは、この第二段階について更に詳しく説明します。 + +### マークファイルはgranuleの位置を特定するために使用される + +以下の図は我々のテーブルの主キーインデックスファイルの一部を示しています。 + + + +上述したように、インデックス内の1083 UserIDマークに対してバイナリサーチを行い、マーク176が特定されます。したがって、クエリに一致する可能性がある行を含む可能性があるのは、その対応するgranule176のみです。 + +
+ + Granule選択の詳細 + +

+ +上記の図は、mark 176がその関連するgranule 176の最低UserID値が749.927.693よりも小さい最初のインデックスエントリーであることを示しています。そして、その次のマーク(マーク177)のgranule 177が、この値よりも大きい最小UserID値であることを示しています。したがって、クエリに一致する可能性がある行を含む可能性があるのは、その対応するgranule 176のみです。 +

+
+ +granule 176にUserIDカラム値`749.927.693`を含む行があることを確認するために(またはしないために)、そのgranule内の全ての8192行をClickHouseにストリーミングする必要があります。 + +これを達成するため、ClickHouseはgranule 176の物理的位置を知っておく必要があります。 + +ClickHouseでは、テーブルの全てのgranuleの物理位置がマークファイルに保存されます。データファイルと同様に、各テーブルカラムにつき1つのマークファイルがあります。 + +以下の図は、テーブルのUserID、URL、およびEventTimeカラムのgranuleの物理位置を保存する3つのマークファイルUserID.mrk, URL.mrk, およびEventTime.mrkを示しています。 + + + +我々は以前に、主キーインデックスは0から始まる数値インデックスマークを含む未圧縮のフラットアレイファイル(primary.idx)であると述べました。 + +同様に、マークファイルもまた、0から始まる数値インデックスマークを含む未圧縮のフラットアレイファイル(*.mrk)です。 + +インデックスで選択されたgranuleに一致する行が含まれる可能性がある場合、ClickHouseはそのmark番号に基づいてarray lookupを行い、granuleの物理位置を取得することができます。 + +ある特定のカラムに対する各マークファイルエントリーは、次の形でオフセットの位置を提供しています: + +- 最初のオフセット(上記の図で「ブロックオフセット」)は、選択されたgranuleを含む圧縮column data fileのブロックを位置付けるためのものです。この圧縮されたファイルブロックは、おそらくいくつかの圧縮granuleを含んでいます。見つかった圧縮されたブロックは、メモリに読み込まれるときに解凍されます。 + +- 第二のオフセット(上記の図の「granuleオフセット」)は、解凍されたブロックデータ内のgranuleの位置を提供します。 + +その後、指定の解凍されたgranuleのすべての8192行が、さらに処理のためにClickHouseにストリーミングされます。 + +:::note + +- wide formatを使い、適応インデックス粒度が無効なテーブルでは(これが関連する場合は上記の図に示されているように.mrkファイルを使用)、各マークファイルエントリーでは2つの8バイトのアドレスを含むエントリーがあり、それらはgranuleの物理位置で全て同じサイズを持っています。 + +インデックスの粒度は[デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的ですが、我々の例のテーブルでは適応インデックス粒度を無効化しました(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)。このテーブルは、データサイズが[min_bytes_for_wide_part](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#min_bytes_for_wide_part)よりも大きいため、ワイドフォーマットを使用しています(self-managed clustersのデフォルトでは10 MBです)。 + +- wide formatおよび適応インデックス粒度を持つテーブルでは、.mrk2マークファイルを使用します。これは.mrkファイルと同様のエントリーを持ちますが、エントリーごとになんらかの追加の第3値:granuleに対応する行数が記録されているファイルです。 + +- compact formatを持つテーブルには、.mrk3マークファイルが使用されます。 + +::: + + +:::note マークファイルの理由 + +なぜ主キーインデックスがインデックスの物理的位置を直接保存していないか? + +なぜなら、ClickHouseが設計された非常に大規模なスケールでは、ディスクとメモリ効率が非常に重要だからです。 + +主キーインデックスファイルはメインメモリに完全に収まる必要があります。 + +我々のサンプルクエリのために、ClickHouseは主キーインデックスを使用してあくまでクエリに一致する可能性があるgranuleを選択しました。クエリの更なる処理のために、その1つのgranuleのみに対して物理的位置が必要です。 + +さらに、このオフセット情報はUserIDおよびURLカラムにのみ必要です。 + +クエリで使用していないカラム(例:EventTimeカラム)に対してオフセット情報が不要です。 + +我々のサンプルクエリでは、UserIDデータファイル(UserID.bin)とURLデータファイル(URL.bin)それぞれのgranule 176のために2つの物理的位置オフセットが必要です。 + +マークファイルによる間接化のおかげで、全 + +1083個のgranuleの物理位置を主キーインデックス内に直接保存することを回避できます:したがって、メモリ内に不要な(使用されない可能性のある)データを持たずに済みます。 + +::: + +下記の図と以下のテキストは、我々のサンプルクエリに対してClickHouseがどのようにUserID.binデータファイル内のgranule 176を特定するかを示しています。 + + + +このガイドの冒頭で述べたことから、ClickHouseは他にはないgranuleを選択し、クエリに一致する行を含む可能性があるgranule 176を選択しました。 + +ClickHouseは、UserID.mrkマークファイル内でgranule 176の2つのオフセットを取得するためにインデックスから選択されたマーク番号(176)を使用して位置取得を行います。 + +示されているように、最初のオフセットは、UserID.binデータファイル内のgranule 176の圧縮バージョンを含む圧縮ファイルブロックを位置付けるためのものです。 + +見つかったファイルブロックがメモリに解凍されると、マークファイルから2つ目のオフセットを使用して、解凍されたデータ内のgranule 176を特定できます。 + +ClickHouseは我々のサンプルクエリ(UserIDが749.927.693であるインターネットユーザーのためのトップ10の最もクリックされたURL)を実行するために、観念的にUserID.binデータファイル内と平行してURL.binデータファイル内のgranule176を特定する必要があります。2つのgranuleは整列し、ClickHouseエンジンのさらなる処理のためにストリーミングされます。これは、全行の中から、まず最初にUserIDでフィルタリングされ、次にURL値ごとにグループ化され、最後に最も大きな10のURLグループを逆順に出力します。 + + +## 複数の主キーインデックスを使用する + + + +### セカンダリキーカラムは効率的でない可能性があります + +クエリがcompound keyの一部であり、最初のキーカラムでフィルタリングしている場合、[ClickHouseはそのキーカラムのインデックスマークに対してバイナリサーチアルゴリズムを走らせます](#the-primary-index-is-used-for-selecting-granules)。 + +ですが、クエリがcompound keyの一部であっても最初のキーカラムではないカラムでフィルタリングしている場合はどうなるでしょう? + +:::note +クエリが明示的に最初のキーカラムでフィルタリングしていないが、セカンダリキーカラムでフィルタリングしているシナリオについて説明します。 + +クエリが最初のキーカラムと任意のキーカラム(または複数カラム)の両方でフィルタリングしている場合、ClickHouseは最初のキーカラムのインデックスマークに対してバイナリサーチを行います。 +::: + +
+
+ + +クエリを使って、"http://public_search"をクリックしたユーザーのトップ10を計算します。 + +```sql +SELECT UserID, count(UserID) AS Count +FROM hits_UserID_URL +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +応答はこうなります: +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.086 sec. +// highlight-next-line +Processed 8.81 million rows, +799.69 MB (102.11 million rows/s., 9.27 GB/s.) +``` + +クライアントの出力は、[URLカラムが複合主キーの一部であるにもかかわらず](#a-table-with-a-primary-key)、ClickHouseがほぼフルテーブルスキャンを行ったことを示しています! ClickHouseがテーブルの8.87百万行中8.81百万行を読み取っています。 + +[トレースログ](/docs/ja/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-logger)が有効化されている場合、ClickHouseサーバーログファイルは、ClickHouseが汎用排除検索を使用して、 +基準された1083 URLインデックスマークに、URLカラム値が"http://public_search"を含む行が存在する可能性のあるgranuleを特定していることを示しています: + +```response +...Executor): Key condition: (column 1 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Used generic exclusion search over index for part all_1_9_2 + with 1537 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 1076/1083 marks by primary key, 1076 marks to read from 5 ranges +...Executor): Reading approx. 8814592 rows with 10 streams +``` + +サンプルトレースログでは、10761083 granularが選択されて、URL値に一致する行を持っている可能性があることが示されています。この結果、8.81百万行がClickHouseエンジンにストリーミング(並行して10ストリームを使用)され、実際に"URL:"が"http://public_search"である行を特定します。しかし、[後に示すように](#query-on-url-fast)、選択された1076-granuleの中から実際に該当する行を持っているのは39だけです。 + +複合主キー(UserID, URL)に基づいた主キーインデックスは、特定のUserID値を持つ行をフィルタリングするクエリを加速するのには非常に役立ちましたが、指定のURL値を持つ行をフィルタリングするクエリを加速するにはあまり役立ちません。 + +そのため、URLカラムが最初のキーカラムではなく、したがってClickHouseは汎用排除検索アルゴリズム(バイナリサーチではありません)をURLカラムのインデックスマークに対して使用し、その**アルゴリズムの効果はUserIDカラムとのカードイナリティの差に依存している**からです。 + +このことを示すために、汎用排除検索がどのように機能するのかいくつかの詳細を示します。 + + + +### 汎用排除検索アルゴリズム + +以下は、クエリがセカンダリカラムでgranuleを選択するとき、先行するキーカラムに低いカードイナリティまたはより高いカードイナリティを持つ場合にClickHouse汎用排除検索アルゴリズムがどのように機能するかを示しています。 + +両方のケースの例として、考えてみます。 +- URLの値が"W3"である行を検索するクエリ。 +- 簡略化された値を持つ我々の打ち込みテーブルの抽象的なバージョン。 +- 同じ合成キー(UserID, URL)を持つ表インデックス。つまり、行は最初にUserID値でソートされています。同じUserID値を持つ行はURLでソートされます。 +- 2のgranuleサイズ、つまり各granuleに2行を含みます。 + +我々は、以下の図に示すように、各granuleの最初の + +テーブル行のキーカラム値をオレンジ色でマークしました。 + +**先行キーカラムが低いカードイナリティを持つ場合** + +UserIDに低いカードイナリティがあると仮定します。この場合、大きな可能性があるUserID値が複数のテーブル行やgranule、すなわちインデックスマークに広がることになります。同じUserIDを持つインデックスマークについては、インデックスマーク内のURL値は昇順でソートされます(テーブル行が最初にUserIDでその後URLでソートされるため)。これにより以下で説明されるような効率的なフィルタリングが可能です: + + + +上記の図では我々の抽象的なサンプルデータに対してgranule選択プロセスに関する3つの異なるシナリオが存在します: + +1.**URL値がW3より小さく、次のインデックスマークのもURL値がW3より小さい場合のインデックスマーク0**:は、マーク0と1に同じUserID値があるため除外されます。この排除条件は、granule0が完全にU1 UserID値で構成されていることを確認して、ClickHouseがgranule0の最大URL値がW3より小さいと仮定してgranuleを除外できることを保証します。 + +2. **URL値がW3以下で、次のインデックスマークのURL値がW3以上の場合のインデックスマーク1**:は選択されます。これはgranule1がURL W3を持つ行を持つ可能性があることを意味します。 + +3. **URL値がW3より大きいインデックスマーク2および3**:は、主キーインデックスのインデックスマークは、それぞれのgranuleに対するテーブル行の最初のキーカラム値を含んでおり、テーブル行がキーカラム値でディスク上でソートされているため、granule2および3がURL値W3を含むことができないため除外されます。 + +**先行キーカラムが高いカードイナリティを持つ場合** +ユーザーIDのカーディナリティが高い場合、同じユーザーIDの値が複数のテーブル行やグラニュールに分散している可能性は低いです。これは、インデックスマークのURL値が単調増加していないことを意味します: + + + +上の図で示されているように、URL値がW3より小さいすべてのマークが選択され、その関連するグラニュールの行がClickHouseエンジンにストリーミングされます。 + +これは、図中のすべてのインデックスマークが上述のシナリオ1に該当するにもかかわらず、「次のインデックスマークが現在のマークと同じユーザーID値を持つ」という除外前提条件を満たしていないため、除外できないからです。 + +例えば、インデックスマーク0を考えてみます。このマークの**URL値はW3より小さく、次のインデックスマークのURL値もW3より小さい**です。しかし、次のインデックスマーク1が現在のマーク0と同じユーザーID値を持っていないため、これを除外することは*できません*。 + +これは最終的に、ClickHouseがグラニュール0のURL値の最大値について仮定をすることを妨げます。代わりに、グラニュール0がURL値W3を持つ行を含む可能性があると考え、マーク0を選択せざるを得ません。 + +同じ状況はマーク1, 2, 3についても真です。 + +:::note 結論 +ClickHouseが使用している一般的な除外検索アルゴリズムは、コンパウンドキーの一部であるカラムをフィルタリングしているときに、二分探索アルゴリズムを使用する代わりに最も効果的です。ただし、前のキーのカラムのカーディナリティが低い(または低い場合)です。 +::: + +サンプルデータセットでは、両方のキーのカラム(UserID, URL)が同様に高いカーディナリティを持ち、説明されているように、URLカラムの前のキーのカラムが高い(または同様の)カーディナリティを持つとき、一般的な除外検索アルゴリズムはあまり効果的ではありません。 + +### データスキップインデックスについての注意 + +ユーザーIDとURLのカーディナリティが同様に高いため、[URLでクエリをフィルタリングする](#query-on-url)ことによってURLカラムに[二次データスキップインデックス](./skipping-indexes.md)を作成しても大きな恩恵はありません。 + +例えば、次の2つのステートメントは、テーブルのURLカラムに[minmax](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#primary-keys-and-indexes-in-queries)データスキップインデックスを作成し、データを挿入します: +```sql +ALTER TABLE hits_UserID_URL ADD INDEX url_skipping_index URL TYPE minmax GRANULARITY 4; +ALTER TABLE hits_UserID_URL MATERIALIZE INDEX url_skipping_index; +``` +ClickHouseは4つの連続する[グラニュール](#data-is-organized-into-granules-for-parallel-data-processing)のグループごとに最小URL値と最大URL値を保存する追加のインデックスを作成しました(`ALTER TABLE`ステートメントの上の`GRANULARITY 4`句に注意してください)。 + + + +最初のインデックスエントリ(図中の「マーク0」)は[テーブルの最初の4つのグラニュールに属する行](#data-is-organized-into-granules-for-parallel-data-processing)の最小URL値と最大URL値を保存します。 + +2番目のインデックスエントリ(‘マーク1’)はテーブルの次の4つのグラニュールに属する行の最小URL値と最大URL値を保存します。以降同様です。 + +(ClickHouseはインデックスマークに関連するグラニュールのグループを特定するための[マークファイル](#mark-files-are-used-for-locating-granules)を作成しました。) + +ユーザーIDとURLのカーディナリティが同様に高いため、我々の[URLでクエリをフィルタリングする](#query-on-url)際に、この二次データスキップインデックスはグラニュールを除外するのに役立ちません。 + +クエリが探している特定のURL値(すなわち 'http://public_search')は、各グラニュールのグループでインデックスにより保存されている最小値と最大値の間にある可能性が高く、ClickHouseはグラニュールのグループを選択せざるを得ません(クエリと一致する行が含まれている可能性があるため)。 + +### 複数の主キーインデックスを使用する必要性 + +その結果、特定のURLを持つ行をフィルタリングするサンプルクエリの実行速度を大幅に上げるためには、そのクエリに最適化された主キーインデックスを使用する必要があります。 + +さらに特定のユーザーIDを持つ行をフィルタリングするサンプルクエリの良好なパフォーマンスを維持したい場合、複数の主キーインデックスを使用する必要があります。 + +以下にその方法を示します。 + + + +### 追加の主キーインデックスを作成するためのオプション + +以下の三つの選択肢のいずれかを使用して、特定のユーザーIDでフィルタリングするクエリと特定のURLでフィルタリングするクエリの両方を劇的に高速化したい場合、複数の主キーインデックスを使用する必要があります。 + +- 異なる主キーを持つ**第2のテーブル**を作成します。 +- 既存のテーブルに**マテリアライズドビュー**を作成します。 +- 既存のテーブルに**プロジェクション**を追加します。 + +すべての選択肢において、サンプルデータが新しいテーブルに複製され、テーブル主キーインデックスと行ソート順が再編成されます。 + +しかし、クエリと挿入ステートメントのルーティングに関して、ユーザーにとっての追加テーブルの透明性は各選択肢で異なります。 + +異なる主キーを持つ**第2のテーブル**を作成するとき、クエリはクエリに最適なテーブルバージョンに明示的に送信され、新しいデータは両方のテーブルに明示的に挿入されてテーブルを同期した状態に保つ必要があります: + + +**マテリアライズドビュー**を使用すると、追加テーブルは暗黙的に作成され、データは両方のテーブル間で自動的に同期されます: + + +そして、**プロジェクション**は最も透明性の高いオプションです。これは、データの変更に伴って暗黙的に(隠されて)新しいテーブルを自動的に同期させるだけでなく、ClickHouseがクエリに最も効果的なテーブルバージョンを自動的に選択するからです: + + +以下では、複数の主キーインデックスを作成し使用するための3つのオプションについて、詳細かつ実際の例を交えて説明します。 + + + +### オプション1: 第2のテーブル + + +元のテーブルと比較して主キーのキー列の順序を変更して新しい追加テーブルを作成します: + +```sql +CREATE TABLE hits_URL_UserID +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (URL, UserID) +ORDER BY (URL, UserID, EventTime) +SETTINGS index_granularity = 8192, index_granularity_bytes = 0, compress_primary_key = 0; +``` + +すべての元のテーブル[#やテーブル(#a-table-with-a-primary-key)]から8.87百万行を追加する: + +```sql +INSERT INTO hits_URL_UserID +SELECT * from hits_UserID_URL; +``` + +レスポンスは以下のようになります: + +```response +Ok. + +0 rows in set. Elapsed: 2.898 sec. Processed 8.87 million rows, 838.84 MB (3.06 million rows/s., 289.46 MB/s.) +``` + +最後にテーブルを最適化します: +```sql +OPTIMIZE TABLE hits_URL_UserID FINAL; +``` + +主キーの列の順序を変更したことにより、挿入された行はこれまでの[#やテーブル(#a-table-with-a-primary-key)]と比較してディスク上に異なる辞書順に格納され、そのためテーブルの1083グラニュールも異なる値を持つようになります: + + +これは生成された主キーです: + + +これは、URLカラムでフィルタリングを行うサンプルクエリの実行を大幅に高速化するために使用されます。例えば、URL "http://public_search"を最も頻繁にクリックしたトップ10のユーザーを計算します: +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM hits_URL_UserID +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下のとおりです: + + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.017 sec. +// highlight-next-line +Processed 319.49 thousand rows, +11.38 MB (18.41 million rows/s., 655.75 MB/s.) +``` + +前述の[#や主キー列使用時フィルタリング[#filtering-on-key-columns-after-the-first](#filtering-on-key-columns-after-the-first)をほぼ行ったときと異なり、ClickHouseはそのクエリをより効果的に実行しました。 + +元のテーブルでの主キーによるインデックスを持つ状況では,ユーザーIDは最初でURLは2番目のキー列であったため,ClickHouseはインデックスマークに対して一般的な除外検索を実行していたが,ユーザーIDとURLのカーディナリティが同じかったため,それはあまり効果的でなかった. + +URLが主キーの最初の列として考慮されると,ClickHouseはインデックスマークに対するバイナリサーチを実行しています。 + +ClickHouseサーバーログの対応するトレースログはそれを確認します: +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range for part all_1_9_2 (1083 marks) +...Executor): Found (LEFT) boundary mark: 644 +...Executor): Found (RIGHT) boundary mark: 683 +...Executor): Found continuous range in 19 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 39/1083 marks by primary key, 39 marks to read from 1 ranges +...Executor): Reading approx. 319488 rows with 2 streams +``` + ClickHouseは1076の汎用的除外検索を使用していたとき以下の39のインデックスマークだけを選択しました。 + +追加のテーブルは、URLでフィルタリングするサンプルクエリの実行速度を向上させるために最適化されています。 + +元のテーブルでの[#クエリのバッドパフォーマンス](#query-on-url-slow)と同様に、新しい追加のテーブルヒット_URL_ユーザーIDにおけるユーザーIDでフィルタリングするクエリの例はあまり効果的ではありません。ユーザーIDがテーブルの主キーの2番目のキー列であるため、ClickHouseはグラニュール選択のための一般的除外検索を使用しています。これがユーザーIDとURLというように同様に高いカーディナリティを持つ場合、あまり効果的でありません。この詳細については詳細を開いてください。 +
+ + ユーザーIDでフィルタリングするクエリはパフォーマンスが悪くなった + +

+ +```sql +SELECT URL, count(URL) AS Count +FROM hits_URL_UserID +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは: + +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.024 sec. +// highlight-next-line +Processed 8.02 million rows, +73.04 MB (340.26 million rows/s., 3.10 GB/s.) +``` + +サーバーログ: +```response +...Executor): Key condition: (column 1 in [749927693, 749927693]) +// highlight-next-line +...Executor): Used generic exclusion search over index for part all_1_9_2 + with 1453 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 980/1083 marks by primary key, 980 marks to read from 23 ranges +...Executor): Reading approx. 8028160 rows with 10 streams +``` +

+
+ +我々は今、二つのテーブルを持っています。ユーザーIDでフィルタリングするクエリを加速するために最適化されたテーブルと、URLでフィルタリングするクエリを加速するために最適化されたテーブルです: + + +### オプション2: マテリアライズドビュー + +既存のテーブルに[マテリアライズドビュー](/docs/ja/sql-reference/statements/create/view.md)を作成します。 +```sql +CREATE MATERIALIZED VIEW mv_hits_URL_UserID +ENGINE = MergeTree() +PRIMARY KEY (URL, UserID) +ORDER BY (URL, UserID, EventTime) +POPULATE +AS SELECT * FROM hits_UserID_URL; +``` + +レスポンスは以下のようになります: + +```response +Ok. + +0 rows in set. Elapsed: 2.935 sec. Processed 8.87 million rows, 838.84 MB (3.02 million rows/s., 285.84 MB/s.) +``` + +:::note +- ビューの主キーにおいて、元のテーブルと比較してキーのカラムの順序を入れ替えています。 +- マテリアライズドビューは**暗黙的に作成されたテーブル**によってバックアップされ、その行の順序と主キーは与えられたプライマリキー定義に基づいています。 +- 暗黙的に作成されたテーブルは`SHOW TABLES`クエリによって表示され、その名前は`.inner`で始まります。 +- マテリアライズドビューのバックアップテーブルをまず明示的に作成してから、そのビューを`TO [db].[table]`[句](/docs/ja/sql-reference/statements/create/view.md)を使ってそれにターゲットさせることも可能です。 +- `POPULATE`キーワードを使用して、ソーステーブル[ヒット_ユーザーID_URL](#a-table-with-a-primary-key)から暗黙的に作成されたテーブルに即座にすべての8.87百万行を挿入します。 +- ソーステーブルヒット_ユーザーID_URLに新しい行が挿入されると、その行は暗黙的に作成されたテーブルにも自動的に挿入されます。 +- 暗黙的に作成されたテーブルは、以前に明示的に作成した二次テーブルと同じ行順と主キーを持つことになります: + + + +ClickHouseは[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns) (*.bin)、[マークファイル](#mark-files-are-used-for-locating-granules) (*.mrk2)、およびインデックス(`primary.idx`)を、ClickHouseサーバーのデータディレクトリ内の特別なフォルダに格納しています: + + + +::: + + +マテリアライズドビューのバックアップとして暗黙的に作成されたテーブル(およびその主キー)は、URLカラムでフィルタリングを行うサンプルクエリの実行を大幅に高速化するために現時点で使用されます: +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM mv_hits_URL_UserID +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下の通りです: + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.026 sec. +// highlight-next-line +Processed 335.87 thousand rows, +13.54 MB (12.91 million rows/s., 520.38 MB/s.) +``` + +効果的に言えば、暗黙的に作成されたテーブル(およびそのプライマリインデックス)は、以前に明示的に作成した二次テーブルと同一なので、クエリは明示的に作成したテーブルと同じ効果的な方法で実行されます。 + +ClickHouseサーバーログの対応するトレースログは、ClickHouseがインデックスマークにバイナリサーチ実行していることを確認します: + +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range ... +... +...Executor): Selected 4/4 parts by partition key, 4 parts by primary key, +// highlight-next-line + 41/1083 marks by primary key, 41 marks to read from 4 ranges +...Executor): Reading approx. 335872 rows with 4 streams +``` + + + +### オプション3: プロジェクション + +既存のテーブルにプロジェクションを追加: +```sql +ALTER TABLE hits_UserID_URL + ADD PROJECTION prj_url_userid + ( + SELECT * + ORDER BY (URL, UserID) + ); +``` + +そしてプロジェクションをマテリアライズします: +```sql +ALTER TABLE hits_UserID_URL + MATERIALIZE PROJECTION prj_url_userid; +``` + +:::note +- プロジェクションは行順と主キー定義に基づいている**隠れたテーブル**を作成する。 +- 隠れたテーブルは`SHOW TABLES`クエリには表示されません。 +- `MATERIALIZE`キーワードを使用して、ソーステーブル[#hitsUserID_URL](#a-table-with-a-primary-key)からすべての8.87百万行を即座に格納する。 +- ソーステーブルの[#hits_USERID_URL](#a-table-with-a-primary-key)に新しい行が挿入されると、その行は隠れたテーブルにも自動的に挿入されます。 +- 常にクエリは構文上でソーステーブル[#hits_USERID_URL](#a-table-with-a-primary-key)をターゲットにしており、行の順序と主キーのある隠れたテーブルがより効果的なクエリ実行を可能にする場合、そのクエリに対応するものです。 +- しかし、ORDER BYがプロジェクションのORDER BYと一致する場合でも、プロジェクションはクエリのORDER BYをより効率的にすることはないことに注意してください (詳細は、https://github.com/ClickHouse/ClickHouse/issues/47333 を参照)。 +- 事実上、暗黙に作成された隠れたテーブルは以前に明示的に作成した二次テーブルと同様の行順と主キーを持ちます: + + + +ClickHouseは、ソーステーブルのデータファイル、マークファイル、および主キーと一緒に、特別なフォルダ(オレンジ色で表示されています)に隠れたテーブルの[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns) (*.bin)、マークファイル (*.mrk2)、および主キー (primary.idx) ファイルを格納しています: + + +::: + + +仮想的な隠れたテーブルとその主キーはURLカラムでフィルタリングを行うサンプルクエリの実行スピードを劇的に上げるために暗黙的に使用されます。注意として、クエリは構文的にプロジェクションのソーステーブルをターゲットにしています。 +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM hits_UserID_URL +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下の通りです: + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.029 sec. +// highlight-next-line +Processed 319.49 thousand rows, 1 +1.38 MB (11.05 million rows/s., 393.58 MB/s.) +``` + +暗黙的に作成された隠れたテーブルとその主キーは、以前に明示的にテーブルを作成したものと同一であるため、クエリは明示的にテーブルを作成したときと同様に効果的に実行されます。 + +ClickHouseサーバーログの対応するトレースログが、ClickHouseがインデックスマークに対してバイナリサーチを行っていることを確認しました: + + +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range for part prj_url_userid (1083 marks) +...Executor): ... +// highlight-next-line +...Executor): Choose complete Normal projection prj_url_userid +...Executor): projection required columns: URL, UserID +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 39/1083 marks by primary key, 39 marks to read from 1 ranges +...Executor): Reading approx. 319488 rows with 2 streams +``` + +### まとめ + +コンパウンドプライマリキーを持つ我々の[#テーブル](#a-table-with-a-primary-key)のプライマリインデックスが[ユーザーIDでフィルタリングするクエリ](#the-primary-index-is-used-for-selecting-granules)を加速するのに有用であった。 しかし、そのインデックスは、URLカラムがコンパウンドプライマリキーに加わっているにもかかわらず[URLでフィルタリングするクエリ](#guidelines-for-choosing-either-mergetree-or-replicatedmergetree)-の高速化には貢献しませんでした。 + +逆に:[URL, UserID](#secondary-table)のコンパウンドプライマリキーを持つ我々の[#テーブル](#a-table-with-a-primary-key)のプライマリインデックスは[URLでフィルタリングするクエリ](#query-on-url)を加速しましたが、[ユーザーIDでフィルタリングするクエリ](#the-primary-index-is-used-for-selecting-granules)-実行にあまり貢献しませんでした。 + +プライマリキーのカラムユーザーIDとURLのカーディナリティが似ているため、2つ目のキーのカラムがインデックスに含まれていても、[2番目のキーのカラムでフィルタリングを行うクエリ](#generic-exclusion-search-slow)はその恩恵を受けません。 + +したがって、プライマリインデックスから2番目のキーのカラムを削除すること(インデックスのメモリ使用量が少なくなる結果)や、 [複数のプライマリインデックス](#multiple-primary-indexes)を使用することは理にかなっています。 + +しかしながら、コンパウンドプライマリキーのキーのカラム群がカーディナリティの大きな違いがある場合、 [クエリにとって](#generic-exclusion-search-fast)カーディナリティにしたがってプライマリキーのカラムを昇順に並べることは利益になります。 + +キーのカラム間のカーディナリティ差が高ければ高いほど、それらのカラムがキー内で並べられる順序の影響が大きくなります。次のセクションでそれをデモンストレーションします。 + +## キーのカラムを効率的に並べ替える + + + +コンパウンドプライマリキーではキーのカラムの順序は、以下の両方において大きく影響を与えます: +- クエリ内の二次キーのカラムに対するフィルタリングの効率 +- テーブルのデータファイルの圧縮率 + +それを証明するため、我々はwebトラフィックのサンプルデータセットのバージョンを使用します。 +各行がインターネットユーザー(`UserID`カラム)がURL(`URL`カラム)へのアクセスがbotトラフィックとしてマークされたかどうかを示す3つのカラムを持っています。 + +1つのコンパウンドプライマリキーを使用し、web分析クエリを高速化するためのすべての3つのカラムをキーのカラムとして使用します。以下が考えられるクエリ: +- 特定のURLへのトラフィックの何%がbotによるものか +- 指定のユーザーがbotかどうか(そのユーザーからのトラフィックの何%がbotと仮定されているか) +など + +コンパウンドプライマリキーに使用しようとしている3つのカラムのカーディナリティを計算するためにこのクエリを使用します(TSVデータをアドホックにクエリするために[URLテーブル関数](/docs/ja/sql-reference/table-functions/url.md)を使用しています)。このクエリを`clickhouse client`で実行します: +```sql +SELECT + formatReadableQuantity(uniq(URL)) AS cardinality_URL, + formatReadableQuantity(uniq(UserID)) AS cardinality_UserID, + formatReadableQuantity(uniq(IsRobot)) AS cardinality_IsRobot +FROM +( + SELECT + c11::UInt64 AS UserID, + c15::String AS URL, + c20::UInt8 AS IsRobot + FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') + WHERE URL != '' +) +``` +レスポンスは以下の通りです: +```response +┌─cardinality_URL─┬─cardinality_UserID─┬─cardinality_IsRobot─┐ +│ 2.39 million │ 119.08 thousand │ 4.00 │ +└─────────────────┴────────────────────┴─────────────────────┘ + +1 row in set. Elapsed: 118.334 sec. Processed 8.87 million rows, 15.88 GB (74.99 thousand rows/s., 134.21 MB/s.) +``` + +特に`URL`および`IsRobot`カラム間に非常に大きなカードナリティの違いがあります。したがって、このコンパウンドプライマリキーのカラムの順番は、そのカラムでフィルタリングするクエリの効率的な加速と、テーブルのカラムデータファイルの最適な圧縮比を達成するために重要です。 + +それを証明するため、我々はボットトラフィック分析データのために2つのテーブルバージョンを作ります: +- コンパウンドプライマリキーが`(URL, UserID, IsRobot)`で、キーのカラムをカードナリティの降順に並べた`hits_URL_UserID_IsRobot`テーブル +- コンパウンドプライマリキーが`(IsRobot, UserID, URL)`で、キーのカラムをカードナリティの昇順に並べた`hits-IsRobot_UserID_URL`テーブル + +コンバウンドプライマリキー`(URL, UserID, IsRobot)`を持つ`hits_URL_UserID_IsRobot`テーブルを作成する: +```sql +CREATE TABLE hits_URL_UserID_IsRobot +( + `UserID` UInt32, + `URL` String, + `IsRobot` UInt8 +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (URL, UserID, IsRobot); +``` + +そして、887百万行を挿入します: +```sql +INSERT INTO hits_URL_UserID_IsRobot SELECT + intHash32(c11::UInt64) AS UserID, + c15 AS URL, + c20 AS IsRobot +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') +WHERE URL != ''; +``` +レスポンスは以下のようになります: +```response +0 rows in set. Elapsed: 104.729 sec. Processed 8.87 million rows, 15.88 GB (84.73 thousand rows/s., 151.64 MB/s.) +``` + + +次にコンパウンドプライマリキー`(IsRobot, UserID, URL)`を持つ`hits_IsRobot_UserID_URL`テーブルを作成します: +```sql +CREATE TABLE hits_IsRobot_UserID_URL +( + `UserID` UInt32, + `URL` String, + `IsRobot` UInt8 +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (IsRobot, UserID, URL); +``` +そして、以前のテーブルに挿入した行と同じ8.87百万行を挿入します: + +```sql +INSERT INTO hits_IsRobot_UserID_URL SELECT + intHash32(c11::UInt64) AS UserID, + c15 AS URL, + c20 AS IsRobot +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') +WHERE URL != ''; +``` +レスポンスは以下の通り: +```response +0 rows in set. Elapsed: 95.959 sec. Processed 8.87 million rows, 15.88 GB (92.48 thousand rows/s., 165.50 MB/s.) +``` + + + +### 二次キーのカラムでの効率的なフィルタリング + +クエリがコンパウンドキーの一部のカラム、すなわち最初のキーのカラムでフィルタリングされている場合、ClickHouseは[#バイナリ検索アルゴリズム](#the-primary-index-is-used-for-selecting-granules)をそのキーのカラムのインデックスマークで実行します。 + +クエリがコンパウンドキーの一部のカラム(最初のキーのカラムでない)にのみフィルタリングされている場合、ClickHouseは[#一般的除外検索アルゴリズム](#secondary-key-columns-can-not-be-inefficient)をそのキーのカラムのインデックスマークで使用します。 + +2番目のケースでは、コンパウンドプライマリキーのキーのカラムの順序が一般的除外検索アルゴリズムの[#効率にとって重要です](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444)。 + +以下はカードナリティが降順となる`(URL, UserID, IsRobot)`のキーのカラムを並べ替えたテーブルでUserIDカラムをフィルタリングしているクエリです: +```sql +SELECT count(*) +FROM hits_URL_UserID_IsRobot +WHERE UserID = 112304 +``` +レスポンスは以下のとおりです: +```response +┌─count()─┐ +│ 73 │ +└─────────┘ + +1 row in set. Elapsed: 0.026 sec. +// highlight-next-line +Processed 7.92 million rows, +31.67 MB (306.90 million rows/s., 1.23 GB/s.) +``` + +これも、先に作成した、カードナリティが昇順になるようにキーのカラムを並べた`(IsRobot, UserID, URL)`のテーブルで同じクエリ: +```sql +SELECT count(*) +FROM hits_IsRobot_UserID_URL +WHERE UserID = 112304 +``` +レスポンスは以下のとおりです: +```response +┌─count()─┐ +│ 73 │ +└─────────┘ + +1 row in set. Elapsed: 0.003 sec. +// highlight-next-line +Processed 20.32 thousand rows, +81.28 KB (6.61 million rows/s., 26.44 MB/s.) +``` + +カードナリティを昇順に並べたテーブルの方が、クエリの実行が大幅に効果的で速いことが分かります。 + +その理由は、最も効果的に[一般的除外検索アルゴリズム](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444)が[グラニュール](#the-primary-index-is-used-for-selecting-granules)が選択される時の二次キーのカラムにおける、先行するキーのカラムのカードナリティが低い場合です。それを前述のセクションで詳しく説明しました。 + +### データファイルの最適な圧縮比 + +次のクエリは、上で作成した2つのテーブル間のユーザーIDカラムの圧縮比を比較します: + +```sql +SELECT + table AS Table, + name AS Column, + formatReadableSize(data_uncompressed_bytes) AS Uncompressed, + formatReadableSize(data_compressed_bytes) AS Compressed, + round(data_uncompressed_bytes / data_compressed_bytes, 0) AS Ratio +FROM system.columns +WHERE (table = 'hits_URL_UserID_IsRobot' OR table = 'hits_IsRobot_UserID_URL') AND (name = 'UserID') +ORDER BY Ratio ASC +``` +これがレスポンスです: +```response +┌─Table───────────────────┬─Column─┬─Uncompressed─┬─Compressed─┬─Ratio─┐ +│ hits_URL_UserID_IsRobot │ UserID │ 33.83 MiB │ 11.24 MiB │ 3 │ +│ hits_IsRobot_UserID_URL │ UserID │ 33.83 MiB │ 877.47 KiB │ 39 │ +└─────────────────────────┴────────┴──────────────┴────────────┴───────┘ + +2 rows in set. Elapsed: 0.006 sec. +``` +カードナリティを昇順に並べたテーブル`(IsRobot, UserID, URL)`では、`UserID`カラムの圧縮比が大幅に高いことが確認されます。 + +どちらのテーブルにも同じデータが保存されている(同じ8.87百万行を両方のテーブルに挿入しました)にもかかわらず、コンポーネントプライマリキーのキーのカラムの順序がテーブルの[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns)に格納される圧縮データがどれだけのディスクスペースを要するかに大きな影響を与えます: +- カードナリティを降順に並べたコンパウンドプライマリキー`(URL, UserID, IsRobot)`を持つ`hits_URL_UserID_IsRobot`テーブルでは、データファイル`UserID.bin`のディスクスペースは**11.24 MiB**です。 +- カードナリティを昇順に並べたコンパウンドプライマリキー`(IsRobot, UserID, URL)`を持つ`hits_IsRobot_UserID_URL`テーブルの場合、データファイル`UserID.bin`のディスクスペースはわずか**877.47 KiB**です。 + +ディスク上でのテーブルのカラムの良好な圧縮比を持つことは、ディスクスペースを節約するだけでなく、それによってそのカラムからデータを読み込まなければならないクエリ(特に分析クエリ)が高速化され、メインメモリのファイルキャッシュにディスクからデータを移動するためのi/oが少なくて済む。 + +次に例を示すことで、プライマリキーのカラムをカードナリティにしたがって昇順に並べることがテーブルのカラムの圧縮比にとって有利な理由を説明します。 + +以下の図は、プライマリキーのカラムをカードナリティにしたがって昇順に並べた場合の行をディスクに並べる順序を概略します: + + +テーブルの行データはプライマリキーのカラムでディスクに格納されることを[議論しました](#data-is-stored-on-disk-ordered-by-primary-key-columns)。 + +上記の方法では、そのテーブルの行はまず`cl`値でソートされ、同じ`cl`値を持つ行は`ch`値でソートされます。そしてカードナリティが低い最初のキーのカラム`cl`があるため、同じ`cl`値の行が存在する可能性が高い。したがって、`ch`値は(同じ`cl`値の行で)局所的にソートされています。 + +カラム内で、類似したデータが近隣に配置されると、データの圧縮が容易になります +一般的に、圧縮アルゴリズムはデータの長さに対する(より多くのデータが使用されるほど、圧縮のためにより良くなる)および局所性(より類似したデータであれば、より良い圧縮比率が得られる)を考慮します。 + +これに対して、以下の図は、プライマリキーのカラムをカードナリティにしたがって降順に並べた場合の行をディスクに並べる順序を概略します: + + +今度はテーブルの行がまず`ch`値を基に並べられ、同じ`ch`値を持つ行は`cl`値で最終的な順序が決定される。 +ただし、最初のキーのカラム`ch`が非常に高いカードナリティを持っているため、同じ`ch`値を持つ行がほとんどない可能性がある。したがって、`cl`値が(同じ`ch`値を持つ行で)局所的にソートされる可能性は少ない。 + +したがって、`cl`値はおそらくランダムな順序であり、局所性が悪く圧縮比も悪い。 + +### サマリー + +二次キーのカラムでの効率的なフィルタリングとテーブルのカラムデータファイルの圧縮比の両方において、プライマリキー内のカラムをそのカーディナリティに従って昇順に並べることが有益です。 + +### 関連コンテンツ +- Blog: [クリックハウスのクエリをスーパーチャージするには](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes) + +## シングル行を効率的に特定する + +場合によってはClickHouse上に構築したアプリケーションがClickHouseテーブルの特定の行を特定する必要があることがありますが、通常はClickHouseの[^best-uses-for-clickhouse]最適な使用方法ではありません。 + +そのための直感的な解決策は、各行に一意の値を持つ[UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)カラムを使い、行の高速な検索の目的でそのカラムをプライマリキーのカラムとして使用することです。 + +最も高速な検索のためには、UUIDカラムはプライマリキーのカラムの最初に[する必要があります](#the-primary-index-is-used-for-selecting-granules) 。 + +プライマリキーまたはカードナリティが非常に高いカラムを含むコンパウンドプライマリキーのカラムを、そのプライマリキー列の後の低いカードナリティのカラムより前に持つことがあると、[テーブル内の他のカラムの圧縮比の劣化](#optimal-compression-ratio-of-data-files)につながります。 + +最速の検索と最適なデータ圧縮の妥協としては、UUIDを最後のキー列として持つコンパウンドプライマリキーを使用し、いくつかのテーブルのカラムで良好な圧縮比を確保しています。 + +### 具体的な例 + +具体的な例として、Alexey Milovidovが開発し[ブログに書いた例](https://clickhouse.com/blog/building-a-paste-service-with-clickhouse/) のhttps://pastila.nlが柔軟なペーストサービスがあります。 + +テキストエリアへの変更があると(例えば、テキストエリアでのタイピングによるキー入力のたびに)、データが自動でClickHouseテーブル行(変更1つにつき1行)に保存されます。 + +特定の行のバージョンを特定し取得する方法の1つとして、行に含まれる内容のハッシュをそのテーブル行のUUIDとして使用することが考えられます。 + +以下の図は、何を示すか: +- 内容変更時の行の挿入順序(例えば、テキストエリアにテキストを入力するキー入力による変更) +- `PRIMARY KEY (hash)`が使用されたときに挿入された行からのデータのディスク上での順序: + + + +`hash`カラムがプライマリキーのカラムとして使用されているため、 +- 特定の行を非常にすばやく[検索できます](#the-primary-index-is-used-for-selecting-granules)。 しかし +- テーブルの行(カラムデータ)は、(一意でランダムな)ハッシュ値によってディスク上の順序づけがされるため、contentカラムの値もランダム順で保存され、データの局所性がないためcontentカラムのデータファイルの圧縮比が最適化されていません。 + +データの圧縮比を大幅に改善し、特定の行の高速検索を実現するために、`pastila.nl`は特定の行を特定するために、2つのハッシュ(およびコンパウンドプライマリキー)を使用しています: +- ハッシュデータとは異なり、各データに対して固有のハッシュが設定されます。 +- 小さなデータ変更で変化しない[局所性に敏感なハッシュ(フィンガープリント)](https://en.wikipedia.org/wiki/Locality-sensitive_hashing) + +以下の図は、何を示すか: +- 内容変更時の行の挿入順序(例えば、テキストエリアにテキストを入力するキー入力による変更) +- コンパウンド`PRIMARY KEY (fingerprint, hash)`が使用されたときに挿入された行からのデータのディスク上での順序: + + + +行は`fingerprint`によってまず順序づけられ、同じfingerprintを持つ行では`hash`によって最終的な順序が決まります。 + +僅かなデータ変更のみで同じfingerprintが生成されるため、似たデータがcontentカラムのディスク上で隣り合って保存されます。圧縮アルゴリズムは一般にデータの局所性の恩恵を受け(データが似ていれば似ているほど圧縮比が良くなる)、contentカラムの圧縮比に非常に有効です。 + +妥協としては、2つのフィールド(`fingerprint` および `hash`)を使用して特定の行を検索し、コンパウンド`PRIMARY KEY (fingerprint, hash)`によってプライマリインデックスを最適に利用することです。 diff --git a/docs/ja/guides/creating-tables.md b/docs/ja/guides/creating-tables.md new file mode 100644 index 00000000000..e6a8f646c76 --- /dev/null +++ b/docs/ja/guides/creating-tables.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 1 +sidebar_label: テーブルの作成 +--- + +# ClickHouseにおけるテーブルの作成 + +ほとんどのデータベースと同様に、ClickHouseはテーブルを**データベース**に論理的にグループ化します。ClickHouseで新しいデータベースを作成するには、`CREATE DATABASE`コマンドを使用します。 + +```sql +CREATE DATABASE IF NOT EXISTS helloworld +``` + +同様に、`CREATE TABLE`を使用して新しいテーブルを定義します。(データベース名を指定しない場合、テーブルは`default`データベースに作成されます。)次のテーブルは`helloworld`データベース内に`my_first_table`という名前で作成されます。 + +```sql +CREATE TABLE helloworld.my_first_table +( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 +) +ENGINE = MergeTree() +PRIMARY KEY (user_id, timestamp) +``` + +上記の例では、`my_first_table`は四つのカラムを持つ`MergeTree`テーブルです。 + +- `user_id`: 32ビットの符号なし整数 +- `message`: `String`データ型で、他のデータベースシステムの`VARCHAR`、`BLOB`、`CLOB`などの型の代替 +- `timestamp`: 時間の瞬間を表す`DateTime`値 +- `metric`: 32ビットの浮動小数点数 + +:::note +テーブルエンジンは以下を決定します。 +- データの保存方法と保存場所 +- サポートされているクエリ +- データがレプリケートされるかどうか + +選択できるエンジンは多くありますが、単一ノードのClickHouseサーバーでの単純なテーブルには、[MergeTree](/ja/engines/table-engines/mergetree-family/mergetree.md)が適しています。 +::: + +## 主キーの簡単な紹介 + +先に進む前に、ClickHouseにおける主キーの働きを理解することが重要です(主キーの実装は意外に感じるかもしれません!)。 + +- ClickHouseでは、主キーは各行に対して**一意ではありません** + +ClickHouseテーブルの主キーは、データがディスクに書き込まれるときのソート方法を決定します。8,192行または10MBのデータごと(**インデックスの粒度**と呼ばれる)に主キーインデックスファイルにエントリが作成されます。この粒度の概念により、メモリに簡単に収まる**スパースインデックス**が作成され、グラニュールは`SELECT`クエリの処理中に最小のカラムデータ量のストライプを表します。 + +主キーは`PRIMARY KEY`パラメータを使用して定義できます。`PRIMARY KEY`を指定せずにテーブルを定義すると、キーは`ORDER BY`句で指定されたタプルになります。`PRIMARY KEY`と`ORDER BY`の両方を指定した場合、主キーはソート順序の接頭辞でなければなりません。 + +主キーはまたソートキーでもあり、`(user_id, timestamp)`のタプルです。 したがって、各カラムファイルに保存されるデータは、`user_id`、次に`timestamp`の順にソートされます。 + +:::tip +詳細については、ClickHouse Academyの[データモデリングトレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328860/?utm_source=clickhouse&utm_medium=docs)をチェックしてください。 +::: diff --git a/docs/ja/guides/developer/_category_.yml b/docs/ja/guides/developer/_category_.yml new file mode 100644 index 00000000000..8bfa1dade38 --- /dev/null +++ b/docs/ja/guides/developer/_category_.yml @@ -0,0 +1,8 @@ +position: 2 +label: 'Developer Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: Developer Guides + slug: /ja/guides/developer diff --git a/docs/ja/guides/developer/alternative-query-languages.md b/docs/ja/guides/developer/alternative-query-languages.md new file mode 100644 index 00000000000..88c249c0e69 --- /dev/null +++ b/docs/ja/guides/developer/alternative-query-languages.md @@ -0,0 +1,78 @@ +--- +slug: /ja/guides/developer/alternative-query-languages +sidebar_label: 代替クエリ言語 +title: 代替クエリ言語 +description: ClickHouseで代替クエリ言語を使用する +--- + +`dialect` 設定を使用して、ClickHouseで他のクエリ言語を使用してデータをクエリすることができます。 +`dialect` を変更した後、新しく設定された方言でクエリを実行できます。 + +現在サポートされている方言は次の通りです: +- `clickhouse`: デフォルトの [ClickHouse SQL 方言](../../sql-reference/syntax.md) + +エクスペリメンタルな方言: +- `prql`: [Pipelined Relational Query Language](https://prql-lang.org/) +- `kusto`: [Kusto Query Language (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query) + +### ClickHouse SQL + +ClickHouseのデフォルトのSQL方言です。 + +```sql +SET dialect = 'clickhouse' +``` + +## エクスペリメンタルな方言 + +これらの方言は完全にはサポートされていないか、またはその元の仕様のすべての機能を持っていない可能性があります。 + +### Pipelined Relational Query Language (PRQL) + +方言を `prql` に設定した後、PRQL言語を使用してクエリを実行することができます: +```sql +SET dialect = 'prql' +``` + +その後、組み込まれているコンパイラがサポートするすべてのPRQL機能を使用できます: + +```prql +from trips +aggregate { + ct = count this + total_days = sum days +} +``` + +内部的にはClickHouseがPRQLクエリをSQLクエリに変換して実行します。 + +### Kusto Query Language (KQL) + +KustoがClickHouseで定義されているすべての関数にアクセスできるわけではないかもしれません。 + +Kustoを有効にする: +```sql +SET dialect = 'kusto' +``` + +`system.numbers(10)` から選択するクエリの例: +```sql +numbers(10) | project number +``` + +```sql +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ +``` + + diff --git a/docs/ja/guides/developer/cascading-materialized-views.md b/docs/ja/guides/developer/cascading-materialized-views.md new file mode 100644 index 00000000000..a88debdba98 --- /dev/null +++ b/docs/ja/guides/developer/cascading-materialized-views.md @@ -0,0 +1,374 @@ +--- +slug: /ja/guides/developer/cascading-materialized-views +title: カスケードされたMaterialized View +description: ソーステーブルから複数のMaterialized Viewを使用する方法。 +keywords: [materialized view, 集計] +--- + +# カスケードされたMaterialized View + +この例では、まずMaterialized Viewを作成し、次にそのMaterialized ViewにさらにカスケードさせたMaterialized Viewを作成する方法を示します。このページでは、その方法、多くの可能性、および制限を確認できます。異なるユースケースは、2番目のMaterialized Viewをソースとして使用してMaterialized Viewを作成することで解決できます。 + +
+ +
+ +
+ +例: + +ドメイン名ごとの毎時のビュー数という架空のデータセットを使用します。 + +### 目的 + +1. 各ドメイン名ごとに月ごとに集計されたデータを必要とする。 +2. 各ドメイン名ごとに年ごとに集計されたデータも必要とする。 + +以下のオプションから選択できます: + +- SELECTリクエスト中にデータを読み取り、集計するクエリを書く +- データを新しい形式で取り込み時に準備する +- データを特定の集計形式で取り込み時に準備する + +Materialized Viewを使用してデータを準備すると、ClickHouseが必要とするデータ量と計算を制限できるため、SELECTリクエストがより高速になります。 + +## Materialized Viewのソーステーブル + +ソーステーブルを作成します。目標が個々の行ではなく集計データのレポートであるため、データを解析し、その情報をMaterialized Viewに渡し、実際の受信データを破棄できます。これにより目的が達成され、ストレージが節約できるため、`Null`テーブルエンジンを使用します。 + +```sql +CREATE DATABASE IF NOT EXISTS analytics; +``` + +```sql +CREATE TABLE analytics.hourly_data +( + `domain_name` String, + `event_time` DateTime, + `count_views` UInt64 +) +ENGINE = Null +``` + +:::note +Nullテーブルに対してMaterialized Viewを作成できます。したがって、テーブルに書き込まれるデータはビューに影響を与えますが、元の生データは破棄されます。 +::: + +## 月次集計テーブルとMaterialized View + +最初のMaterialized Viewについては、`Target`テーブルを作成する必要があります。この例では、`analytics.monthly_aggregated_data`というテーブルを作成し、月別およびドメイン名別にビューの合計を保存します。 + +```sql +CREATE TABLE analytics.monthly_aggregated_data +( + `domain_name` String, + `month` Date, + `sumCountViews` AggregateFunction(sum, UInt64) +) +ENGINE = AggregatingMergeTree +ORDER BY (domain_name, month) +``` + +ターゲットテーブルにデータを転送するMaterialized Viewは次のようになります: + +```sql +CREATE MATERIALIZED VIEW analytics.monthly_aggregated_data_mv +TO analytics.monthly_aggregated_data +AS +SELECT + toDate(toStartOfMonth(event_time)) AS month, + domain_name, + sumState(count_views) AS sumCountViews +FROM analytics.hourly_data +GROUP BY + domain_name, + month +``` + +## 年次集計テーブルとMaterialized View + +次に、前のターゲットテーブル`monthly_aggregated_data`にリンクされる2番目のMaterialized Viewを作成します。 + +まず、ドメイン名ごとに年別に集計されたビューの合計を格納する新しいターゲットテーブルを作成します。 + +```sql +CREATE TABLE analytics.year_aggregated_data +( + `domain_name` String, + `year` UInt16, + `sumCountViews` UInt64 +) +ENGINE = SummingMergeTree() +ORDER BY (domain_name, year) +``` + +このステップでカスケードを定義します。`FROM`文は`monthly_aggregated_data`テーブルを使用します。これは、データフローが次のようになることを意味します: + +1. データは`hourly_data`テーブルに到着します。 +2. ClickHouseは、受信したデータを最初のMaterialized Viewである`monthly_aggregated_data`テーブルに転送します。 +3. 最後に、ステップ2で受信したデータが`year_aggregated_data`に転送されます。 + +```sql +CREATE MATERIALIZED VIEW analytics.year_aggregated_data_mv +TO analytics.year_aggregated_data +AS +SELECT + toYear(toStartOfYear(month)) AS year, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + year +``` + +:::note +Materialized Viewを使用する際の一般的な誤解は、データがテーブルから読み取られるということです。これは`Materialized View`の動作ではありません。転送されるデータはテーブルの最終結果ではなく、挿入されたブロックです。 + +この例で`monthly_aggregated_data`で使用されるエンジンがCollapsingMergeTreeであると仮定した場合、私たちの2番目のMaterialized View`year_aggregated_data_mv`に転送されるデータは、圧縮されたテーブルの最終結果ではなく、`SELECT ... GROUP BY`で定義されたフィールドを持つデータブロックが転送されます。 + +CollapsingMergeTree、ReplacingMergeTree、またはSummingMergeTreeを使用してカスケードMaterialized Viewを作成する予定がある場合は、ここで説明されている制限を理解する必要があります。 +::: + +## サンプルデータ + +カスケードMaterialized Viewをテストするために、データを挿入します: + +```sql +INSERT INTO analytics.hourly_data (domain_name, event_time, count_views) +VALUES ('clickhouse.com', '2019-01-01 10:00:00', 1), + ('clickhouse.com', '2019-02-02 00:00:00', 2), + ('clickhouse.com', '2019-02-01 00:00:00', 3), + ('clickhouse.com', '2020-01-01 00:00:00', 6); +``` + +`analytics.hourly_data`の内容をSELECTすると、テーブルエンジンが`Null`であるため、次のようになりますが、データは処理されます。 + +```sql +SELECT * FROM analytics.hourly_data +``` + +```response +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +少量のデータセットを使用することで、予想される結果を確認し、比較することができます。少量のデータセットでフローが正しいことを確認したら、大量のデータに移行することができます。 + +## 結果 + +ターゲットテーブルをクエリして`sumCountViews`フィールドを選択しようとすると、バイナリ表現(いくつかのターミナルで)を目にすることがあります。これは、値が数値としてではなく、`AggregateFunction`型として格納されているためです。集計の最終結果を得るには、`-Merge`サフィックスを使用する必要があります。 + +AggregateFunctionに格納された特殊文字を見るためのクエリ: + +```sql +SELECT sumCountViews FROM analytics.monthly_aggregated_data +``` + +```response +┌─sumCountViews─┐ +│ │ +│ │ +│ │ +└───────────────┘ + +3 rows in set. Elapsed: 0.003 sec. +``` + +代わりに、`Merge`サフィックスを使用して`sumCountViews`の値を取得してみましょう: + +```sql +SELECT + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data; +``` + +```response +┌─sumCountViews─┐ +│ 12 │ +└───────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +`AggregatingMergeTree`で`AggregateFunction`が`sum`として定義されているため、`sumMerge`を使用できます。`AggregateFunction`で`avg`を使用すると、`avgMerge`を使用します。 + +```sql +SELECT + month, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + month +``` + +これで、Materialized Viewが定義した目標に答えていることを確認できます。 + +ターゲットテーブル`monthly_aggregated_data`にデータが保存されているため、各ドメイン名ごとに月ごとに集計されたデータを取得できます: + +```sql +SELECT + month, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + month +``` + +```response +┌──────month─┬─domain_name────┬─sumCountViews─┐ +│ 2020-01-01 │ clickhouse.com │ 6 │ +│ 2019-01-01 │ clickhouse.com │ 1 │ +│ 2019-02-01 │ clickhouse.com │ 5 │ +└────────────┴────────────────┴───────────────┘ + +3 rows in set. Elapsed: 0.004 sec. +``` + +各ドメイン名ごとの年ごとに集計されたデータ: + +```sql +SELECT + year, + domain_name, + sum(sumCountViews) +FROM analytics.year_aggregated_data +GROUP BY + domain_name, + year +``` + +```response +┌─year─┬─domain_name────┬─sum(sumCountViews)─┐ +│ 2019 │ clickhouse.com │ 6 │ +│ 2020 │ clickhouse.com │ 6 │ +└──────┴────────────────┴────────────────────┘ + +2 rows in set. Elapsed: 0.004 sec. +``` + +## 複数のソーステーブルを単一のターゲットテーブルに結合する + +Materialized Viewは、複数のソーステーブルを同じ宛先テーブルに結合するためにも使用できます。これは、`UNION ALL`と同様のロジックを持つMaterialized Viewを作成するのに役立ちます。 + +まず、異なるメトリックセットを表す2つのソーステーブルを作成します: + +```sql +CREATE TABLE analytics.impressions +( + `event_time` DateTime, + `domain_name` String +) ENGINE = MergeTree ORDER BY (domain_name, event_time) +; + +CREATE TABLE analytics.clicks +( + `event_time` DateTime, + `domain_name` String +) ENGINE = MergeTree ORDER BY (domain_name, event_time) +; +``` + +次に、結合されたメトリックセットを持つ`Target`テーブルを作成します: + +```sql +CREATE TABLE analytics.daily_overview +( + `on_date` Date, + `domain_name` String, + `impressions` SimpleAggregateFunction(sum, UInt64), + `clicks` SimpleAggregateFunction(sum, UInt64) +) ENGINE = AggregatingMergeTree ORDER BY (on_date, domain_name) +``` + +同じ`Target`テーブルを指す2つのMaterialized Viewを作成します。不足しているカラムを明示的に含める必要はありません: + +```sql +CREATE MATERIALIZED VIEW analytics.daily_impressions_mv +TO analytics.daily_overview +AS +SELECT + toDate(event_time) AS on_date, + domain_name, + count() AS impressions, + 0 clicks ---<<<--- これを省略すると、デフォルトで0になります +FROM + analytics.impressions +GROUP BY + toDate(event_time) AS on_date, + domain_name +; + +CREATE MATERIALIZED VIEW analytics.daily_clicks_mv +TO analytics.daily_overview +AS +SELECT + toDate(event_time) AS on_date, + domain_name, + count() AS clicks, + 0 impressions ---<<<--- これを省略すると、デフォルトで0になります +FROM + analytics.clicks +GROUP BY + toDate(event_time) AS on_date, + domain_name +; +``` + +これで、挿入された値は`Target`テーブルのそれぞれのカラムに集計されます: + +```sql +INSERT INTO analytics.impressions (domain_name, event_time) +VALUES ('clickhouse.com', '2019-01-01 00:00:00'), + ('clickhouse.com', '2019-01-01 12:00:00'), + ('clickhouse.com', '2019-02-01 00:00:00'), + ('clickhouse.com', '2019-03-01 00:00:00') +; + +INSERT INTO analytics.clicks (domain_name, event_time) +VALUES ('clickhouse.com', '2019-01-01 00:00:00'), + ('clickhouse.com', '2019-01-01 12:00:00'), + ('clickhouse.com', '2019-03-01 00:00:00') +; +``` + +`Target`テーブルで統合されたインプレッションとクリック: + +```sql +SELECT + on_date, + domain_name, + sum(impressions) AS impressions, + sum(clicks) AS clicks +FROM + analytics.daily_overview +GROUP BY + on_date, + domain_name +; +``` + +このクエリは次のような出力になります: + +``` +┌────on_date─┬─domain_name────┬─impressions─┬─clicks─┐ +│ 2019-01-01 │ clickhouse.com │ 2 │ 2 │ +│ 2019-03-01 │ clickhouse.com │ 1 │ 1 │ +│ 2019-02-01 │ clickhouse.com │ 1 │ 0 │ +└────────────┴────────────────┴─────────────┴────────┘ + +3 rows in set. Elapsed: 0.018 sec. +``` diff --git a/docs/ja/guides/developer/debugging-memory-issues.md b/docs/ja/guides/developer/debugging-memory-issues.md new file mode 100644 index 00000000000..50a68921f26 --- /dev/null +++ b/docs/ja/guides/developer/debugging-memory-issues.md @@ -0,0 +1,77 @@ +--- +slug: /ja/guides/developer/debugging-memory-issues +sidebar_label: メモリ問題のデバッグ +sidebar_position: 1 +description: メモリ問題のデバッグに役立つクエリ。 +--- + +# メモリ問題のデバッグ + +メモリの問題やメモリリークが発生した場合、どのクエリやリソースが大量のメモリを消費しているのかを知ることが役立ちます。以下のクエリは、デバッグに役立ち、最適化できるクエリ、データベース、テーブルを見つけるのに役立ちます。 + +**ピークメモリ使用量で現在実行中のプロセスを一覧表示** + +```sql +SELECT + initial_query_id, + query, + elapsed, + formatReadableSize(memory_usage), + formatReadableSize(peak_memory_usage), +FROM system.processes +ORDER BY peak_memory_usage DESC +LIMIT 100; +``` + +**メモリ使用量のメトリクスを一覧表示** + +```sql +SELECT + metric, description, formatReadableSize(value) size +FROM + system.asynchronous_metrics +WHERE + metric like '%Cach%' + or metric like '%Mem%' +order by + value desc; +``` + +**現在のメモリ使用量別にテーブルを一覧表示** + +```sql +SELECT + database, + name, + formatReadableSize(total_bytes) +FROM system.tables +WHERE engine IN ('Memory','Set','Join'); +``` + +**マージによる総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(memory_usage)) FROM system.merges; +``` + +**現在実行中のプロセスによる総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(memory_usage)) FROM system.processes; +``` + +**Dictionary による総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(bytes_allocated)) FROM system.dictionaries; +``` + +**主キーによる総メモリ使用量を出力** + +```sql +SELECT + sumIf(data_uncompressed_bytes, part_type = 'InMemory') as memory_parts, + formatReadableSize(sum(primary_key_bytes_in_memory)) AS primary_key_bytes_in_memory, + formatReadableSize(sum(primary_key_bytes_in_memory_allocated)) AS primary_key_bytes_in_memory_allocated +FROM system.parts; +``` diff --git a/docs/ja/guides/developer/deduplicating-inserts-on-retries.md b/docs/ja/guides/developer/deduplicating-inserts-on-retries.md new file mode 100644 index 00000000000..6de685ffe7f --- /dev/null +++ b/docs/ja/guides/developer/deduplicating-inserts-on-retries.md @@ -0,0 +1,397 @@ +--- +slug: /ja/guides/developer/deduplicating-inserts-on-retries +title: 挿入操作の再試行時のデータ重複防止 +description: 挿入操作を再試行する際の重複データ防止策 +keywords: [重複排除, デデュプリケート, 挿入再試行, 挿入] +--- + +挿入操作は、タイムアウトなどのエラーにより失敗することがあります。挿入が失敗した場合、データが成功裏に挿入されたかどうかは不明です。本ガイドでは、挿入再試行時に同じデータが複数回挿入されないように、データ重複防止機能を有効にする方法を説明します。 + +挿入が再試行されると、ClickHouseはデータが既に成功裏に挿入されたかどうかを判断しようとします。挿入されたデータが重複としてマークされる場合、ClickHouseはそれを対象のテーブルに挿入しません。しかし、ユーザーはあたかもデータが正常に挿入されたかのように成功操作ステータスを受け取ります。 + +## 再試行時の挿入重複防止の有効化 + +### テーブルに対する挿入重複防止 + +**`*MergeTree`エンジンのみが挿入時の重複防止をサポートしています。** + +`*ReplicatedMergeTree`エンジンに対しては、挿入重複防止はデフォルトで有効になっており、`replicated_deduplication_window`および`replicated_deduplication_window_seconds`設定によって制御されます。非レプリケートされた`*MergeTree`エンジンに対しては、重複防止は`non_replicated_deduplication_window`設定によって制御されます。 + +上記の設定は、テーブルの重複防止ログのパラメータを決定します。この重複防止ログは有限の数の`block_id`を保持し、これにより重複防止の仕組みが決まります(以下参照)。 + +### クエリレベルでの挿入重複防止 + +設定`insert_deduplicate=1`を用いると、クエリレベルでの重複防止が有効になります。`insert_deduplicate=0`でデータを挿入した場合、そのデータは`insert_deduplicate=1`で挿入を再試行しても重複防止されません。これは、`block_id`が`insert_deduplicate=0`での挿入時に記録されないためです。 + +## 挿入重複防止の仕組み + +データがClickHouseに挿入されるとき、行数とバイト数に基づいてデータがブロックに分割されます。 + +`*MergeTree`エンジンを使用したテーブルでは、各ブロックにはそのブロック内のデータのハッシュである一意の`block_id`が割り当てられます。この`block_id`は挿入操作の一意キーとして使用されます。同じ`block_id`が重複防止ログで見つかった場合、そのブロックは重複と見なされ、テーブルには挿入されません。 + +このアプローチは異なるデータを含む挿入の場合にうまく機能します。しかし、同じデータを複数回意図的に挿入する場合は、`insert_deduplication_token`設定を使用して重複防止プロセスを制御する必要があります。この設定を用いると、各挿入に対して一意のトークンを指定でき、ClickHouseはこのトークンを利用してデータが重複かどうかを判断します。 + +`INSERT ... VALUES` クエリの場合、挿入データのブロック分割は決定的であり、設定によって決定されます。したがって、初回操作と同じ設定値で挿入を再試行することをお勧めします。 + +`INSERT ... SELECT` クエリの場合、クエリの`SELECT`部分が各操作で同じ順序で同じデータを返すことが重要です。実際の使用においてこれは難しいことに留意してください。再試行で安定したデータ順序を確保するために、クエリの`SELECT`部分で正確な`ORDER BY`セクションを定義してください。再試行間に選択されたテーブルが更新される可能性がある事にも注意が必要です。結果データが変更され、重複防止が行われない可能性があります。また、大量のデータを挿入する場合、挿入後のブロック数が重複防止ログウィンドウをオーバーフローすることがあり、ClickHouseがブロックを重複防止しない可能性があります。 + +## マテリアライズドビューを使用した挿入重複防止 + +テーブルにマテリアライズドビューがある場合、そのビューの変換定義にしたがって挿入されたデータもビューの対象に挿入されます。変換されたデータも再試行時に重複を排除されます。ClickHouseはマテリアライズドビューに対しても、ターゲットテーブルに挿入されたデータと同様に重複を排除します。 + +このプロセスは以下のソーステーブル用の設定を使用して制御できます: +- `replicated_deduplication_window` +- `replicated_deduplication_window_seconds` +- `non_replicated_deduplication_window` + +また、ユーザープロファイル設定`deduplicate_blocks_in_dependent_materialized_views`を使用することもできます。 + +マテリアライズドビュー下のテーブルへブロックを挿入する際、ClickHouseはソーステーブルの`block_id`と追加の識別子を組み合わせた文字列をハッシュして`block_id`を計算します。これにより、マテリアライズドビュー内での正確な重複防止が保証され、元の挿入によってデータが区別され、マテリアライズドビューの対象テーブルに到達する前に加えられる変換にかかわらずデータが識別されます。 + +## 例 + +### マテリアライズドビューの変換後の同一ブロック + +マテリアライズドビュー内での変換中に生成された同一ブロックは異なる挿入データに基づいているため、重複排除されません。 + +こちらは例です: + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000 +AS SELECT + 0 AS key, + value AS value +FROM dst; +``` + +```sql +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +上記の設定により、テーブルから一行のみを持つ一連のブロックを選択できます。これらの小さいブロックは圧縮されず、テーブルに挿入されるまでは同一のままです。 + +```sql +SET deduplicate_blocks_in_dependent_materialized_views=1; +``` + +マテリアライズドビューでの重複排除を有効にする必要があります: + +```sql +INSERT INTO dst SELECT + number + 1 AS key, + IF(key = 0, 'A', 'B') AS value +FROM numbers(2); + +SELECT + *, + _part +FROM dst +ORDER by all; +``` + +ここでは、`dst`テーブルに2つのパートが挿入されたことが分かります。選択からの2ブロック — 挿入時の2パート。パートは異なるデータを含んでいます。 + +```sql +SELECT + *, + _part +FROM mv_dst +ORDER by all; +``` + +ここでは、`mv_dst`テーブルに2つのパートが挿入されたことが分かります。それらのパートは同じデータを含んでいますが、重複排除されていません。 + +```sql +INSERT INTO dst SELECT + number + 1 AS key, + IF(key = 0, 'A', 'B') AS value +FROM numbers(2); + +SELECT + *, + _part +FROM dst +ORDER by all; + +SELECT + *, + _part +FROM mv_dst +ORDER by all; +``` + +ここでは、挿入を再試行したとき、すべてのデータが重複排除されることが確認できます。重複排除は`dst`テーブルと`mv_dst`テーブルの両方で機能します。 + +## 挿入時の同一ブロック + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + + +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +挿入: + +```sql +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +上記の設定で、選択結果から2つのブロックが生成され、その結果、テーブル`dst`への挿入には2つのブロックがあるはずです。しかし、`dst`テーブルには一つのブロックのみが挿入されたことが確認できます。これは、2番目のブロックが重複排除されたためです。挿入されたデータと、重複排除のキーである`block_id`は挿入されたデータのハッシュとして計算されています。この動作は期待されたものではありません。このようなケースは稀ですが、理論的には可能です。このようなケースを正しく処理するために、ユーザーは`insert_deduplication_token`を提供する必要があります。以下の例でそれを修正しましょう: + +## `insert_deduplication_token`を使用した挿入時の同一ブロック + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +挿入: + +```sql +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +2つの同一ブロックが期待通りに挿入されました。 + +```sql +select 'second attempt'; + +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +再試行挿入は期待通りに重複排除されます。 + +```sql +select 'third attempt'; + +INSERT INTO dst SELECT + 1 AS key, + 'b' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +この挿入も異なるデータを含んでいるにもかかわらず重複排除されています。`insert_deduplication_token`の優先度が高いことに注意してください:`insert_deduplication_token`が提供されると、ClickHouseはデータのハッシュサムを使用しません。 + +## 異なる挿入操作がマテリアライズドビューの基になるテーブルで同じデータを生成する場合 + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000 +AS SELECT + 0 AS key, + value AS value +FROM dst; + +SET deduplicate_blocks_in_dependent_materialized_views=1; + +select 'first attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; + +select 'second attempt'; + +INSERT INTO dst VALUES (2, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +毎回異なるデータを挿入しています。しかし、`mv_dst`テーブルには同じデータが挿入されています。データは元のデータが異なっていたため、重複排除されません。 + +## 異なるマテリアライズドビューが同一のデータを基になるテーブルに挿入する場合 + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE TABLE mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_first +TO mv_dst +AS SELECT + 0 AS key, + value AS value +FROM dst; + +CREATE MATERIALIZED VIEW mv_second +TO mv_dst +AS SELECT + 0 AS key, + value AS value +FROM dst; + +SET deduplicate_blocks_in_dependent_materialized_views=1; + +select 'first attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +テーブル`mv_dst`に2つの等しいブロックが挿入されました(期待通り)。 + +```sql +select 'second attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +この再試行操作は、`dst`テーブルと`mv_dst`テーブルの両方で重複排除されます。 diff --git a/docs/ja/guides/developer/deduplication.md b/docs/ja/guides/developer/deduplication.md new file mode 100644 index 00000000000..babeedcaf46 --- /dev/null +++ b/docs/ja/guides/developer/deduplication.md @@ -0,0 +1,339 @@ +--- +slug: /ja/guides/developer/deduplication +sidebar_label: 重複排除戦略 +sidebar_position: 3 +description: 頻繁にupsert、更新、および削除を実行する必要がある場合は、重複排除を使用します。 +--- + +# 重複排除戦略 + +**重複排除**とは、***データセットの重複行を削除するプロセス***を指します。OLTPデータベースでは、各行に一意の主キーがあるため、これを簡単に行うことができますが、その代わりに挿入が遅くなります。挿入された各行は最初に検索され、存在する場合は置き換える必要があります。 + +ClickHouseはデータ挿入のスピードを追求して設計されています。ストレージファイルは不変であり、ClickHouseは行を挿入する前に既存の主キーを確認しないため、重複排除はもう少し手間がかかります。また、重複排除は即時には行われず、**最終的**であるため、以下のような副作用があります: + +- 任意の時点で、テーブルにはまだ重複(同じソートキーを持つ行)が存在する可能性があります +- 重複行の実際の削除は、パーツのマージ時に行われます +- クエリでは、重複の可能性を考慮する必要があります + +
+ +||| +|------|----| +|Cassandra logo|ClickHouseは重複排除やその他多くのトピックに関する無料トレーニングを提供しています。[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)は素晴らしい出発点です。| + +
+ +## 重複排除のオプション + +ClickHouseにおける重複排除は、以下のテーブルエンジンを使用して実装されます: + +1. `ReplacingMergeTree`テーブルエンジン:このテーブルエンジンを使用すると、同じソートキーを持つ重複行がマージ時に削除されます。`ReplacingMergeTree`は、クエリが最後に挿入された行を返すようなupsert動作をエミュレートするのに適しています。 + +2. 行の折りたたみ:`CollapsingMergeTree`および`VersionedCollapsingMergeTree`テーブルエンジンは、既存の行が"キャンセル"されて新しい行が挿入されるロジックを利用します。これらは`ReplacingMergeTree`よりも複雑ですが、クエリや集計を書く際にデータがまだマージされているかどうかを気にせずに済むため、クエリがシンプルになることがあります。データを頻繁に更新する必要がある場合、これらのテーブルエンジンが役立ちます。 + +以下でこれらの技術を詳しく説明します。詳細については、[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)をご覧ください。 + +## ReplacingMergeTreeを使用したUpserts + +ハッカーニュースのコメントを含むテーブルを例に見てみましょう。このテーブルは、コメントの表示回数を表す`views`カラムを持っています。新しい記事が公開されると新しい行を挿入し、表示回数が増えた場合は1日ごとに新しい行をupsertするとします: + +```sql +CREATE TABLE hackernews_rmt ( + id UInt32, + author String, + comment String, + views UInt64 +) +ENGINE = ReplacingMergeTree +PRIMARY KEY (author, id) +``` + +2行を挿入してみましょう: + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 0), + (2, 'ch_fan', 'This is post #2', 0) +``` + +`views`カラムを更新するために、同じ主キーで新しい行を挿入します(`views`カラムの新しい値に注目してください): + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 100), + (2, 'ch_fan', 'This is post #2', 200) +``` + +現在、テーブルには4行あります: + +```sql +SELECT * +FROM hackernews_rmt +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 0 │ +│ 1 │ ricardo │ This is post #1 │ 0 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +上の出力の別々のボックスは、実際のマージがまだ行われておらず、重複行がまだ削除されていないことを示しています。`SELECT`クエリで`FINAL`キーワードを使用して、クエリ結果の論理的なマージを行います: + +```sql +SELECT * +FROM hackernews_rmt +FINAL +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +結果には2行だけが含まれ、最後に挿入された行が返されます。 + +:::note +`FINAL`を使用することは、データ量が少ない場合には問題ありません。大量のデータを扱う場合、`FINAL`の使用は最良の選択肢ではないかもしれません。カラムの最新値を見つけるためのより良い選択肢について議論しましょう… +::: + +### FINALを避ける + +2つのユニークな行の`views`カラムを再度更新しましょう: + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 150), + (2, 'ch_fan', 'This is post #2', 250) +``` + +テーブルには現在6行ありますが、実際のマージはまだ行われていません( `FINAL`を使用したクエリ時間のマージのみ)。 + +```sql +SELECT * +FROM hackernews_rmt +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 0 │ +│ 1 │ ricardo │ This is post #1 │ 0 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 250 │ +│ 1 │ ricardo │ This is post #1 │ 150 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +`FINAL`を使用する代わりに、ビジネスロジックを使用しましょう - `views`カラムは常に増加すると分かっているので、最大値を持つ行を選択するために`max`関数を使用して、望むカラムでグループ化します: + +```sql +SELECT + id, + author, + comment, + max(views) +FROM hackernews_rmt +GROUP BY (id, author, comment) +``` + +```response +┌─id─┬─author──┬─comment─────────┬─max(views)─┐ +│ 2 │ ch_fan │ This is post #2 │ 250 │ +│ 1 │ ricardo │ This is post #1 │ 150 │ +└────┴─────────┴─────────────────┴────────────┘ +``` + +上記のクエリに示されているようにグループ化することで、`FINAL`キーワードを使用するよりもクエリパフォーマンスの観点で効率的になることがあります。 + +私たちの[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)では、この例をさらに展開し、`ReplacingMergeTree`を使用した`version`カラムの使用方法も紹介しています。 + +## カラムの頻繁な更新にCollapsingMergeTreeを使用する + +カラムの更新は、既存の行を削除し、新しい値で置き換えることを伴います。これまでに見た通り、ClickHouseにおけるこの種の変更は_最終的に_発生します - マージ中に。多くの行を更新する場合、`ALTER TABLE..UPDATE`を回避し、既存データと共に新しいデータを挿入する方が実際には効率的である可能性があります。データが古いものか新しいものかを示すカラムを追加することができます…そして実際、古いデータを自動的に削除するという振る舞いを非常にうまく実装するテーブルエンジンがあります。それがどのように機能するかを見てみましょう。 + +外部システムを使用して、ハッカーニュースのコメントの表示回数を追跡し、数時間ごとにデータをClickHouseにプッシュするとします。古い行を削除し、新しい行が各ハッカーニュースコメントの新しい状態を表すようにしたいです。この振る舞いを実現するために、`CollapsingMergeTree`を使用することができます。 + +表示回数を格納するためのテーブルを定義しましょう: + +```sql +CREATE TABLE hackernews_views ( + id UInt32, + author String, + views UInt64, + sign Int8 +) +ENGINE = CollapsingMergeTree(sign) +PRIMARY KEY (id, author) +``` + +`hackernews_views`テーブルには、signと呼ばれる`Int8`カラムがあり、**sign**カラムとして参照されます。signカラムの名前は任意ですが、`Int8`データ型である必要があります。また、`CollapsingMergeTree`テーブルのコンストラクタにカラム名が渡されています。 + +`CollapsingMergeTree`テーブルのsignカラムとは何でしょうか?これは行の_状態_を表し、signカラムは1または-1のみであることができます。その働き方を見てみましょう: + +- 二つの行が同じ主キー(またはソート順が主キーとは異なる場合、そのソート順)を持つが、signカラムの値が異なる場合、最後に挿入された行の+1が状態行となり、他の行はお互いをキャンセルします +- お互いをキャンセルする行はマージ中に削除されます +- マッチするペアを持たない行は残ります + +`hackernews_views`テーブルに行を追加しましょう。この主キーに対応する唯一の行であるため、その状態を1に設定します: + +```sql +INSERT INTO hackernews_views VALUES + (123, 'ricardo', 0, 1) +``` + +次に、viewsカラムを変更したいとします。既存の行をキャンセルする1行と、その行の新しい状態を含む1行の計2行を挿入します: + +```sql +INSERT INTO hackernews_views VALUES + (123, 'ricardo', 0, -1), + (123, 'ricardo', 150, 1) +``` + +テーブルには現在、主キー(123, 'ricardo')を持つ3行があります: + +```sql +SELECT * +FROM hackernews_views +``` + +```response +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 0 │ -1 │ +│ 123 │ ricardo │ 150 │ 1 │ +└─────┴─────────┴───────┴──────┘ +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 0 │ 1 │ +└─────┴─────────┴───────┴──────┘ +``` + +`FINAL`を追加すると、現在の状態行が返されることに注目してください: + +```sql +SELECT * +FROM hackernews_views +FINAL +``` + +```response +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 150 │ 1 │ +└─────┴─────────┴───────┴──────┘ +``` + +しかし、当然のことながら、大きなテーブルに対して`FINAL`を使用することは推奨されていません。 + +:::note +この例で`views`カラムに渡された値は本当に必要なく、古い行の現在の`views`の値と一致している必要もありません。実際、主キーと-1だけで行をキャンセルすることができます: + +```sql +INSERT INTO hackernews_views(id, author, sign) VALUES + (123, 'ricardo', -1) +``` +::: + +## 複数スレッドからのリアルタイム更新 + +`CollapsingMergeTree`テーブルを使用すると、行はsignカラムを使って互いにキャンセルされ、行の状態は最後に挿入された行によって決定されます。しかし、行が異なるスレッドから順不同で挿入される場合、これは問題になる可能性があります。この場合、最後の行を使用することは機能しません。 + +ここで`VersionedCollapsingMergeTree`が役立ちます。`VersionedCollapsingMergeTree`は、`CollapsingMergeTree`と同様に行を折りたたみますが、最後に挿入された行ではなく、指定したバージョンカラムの最大値を持つ行を保持します。 + +例を見てみましょう。ハッカーニュースのコメントの表示回数を追跡し、データは頻繁に更新されます。レポートでは、マージを強制したり待つことなく最新の値を使用したいです。`CollapsedMergeTree`に似たテーブルから始めますが、行の状態のバージョンを格納するカラムを追加します: + +```sql +CREATE TABLE hackernews_views_vcmt ( + id UInt32, + author String, + views UInt64, + sign Int8, + version UInt32 +) +ENGINE = VersionedCollapsingMergeTree(sign, version) +PRIMARY KEY (id, author) +``` + +このテーブルは`VersionsedCollapsingMergeTree`をエンジンとして使用し、**signカラム**と**versionカラム**を渡しています。このテーブルの働き方は次の通りです: + +- 同じ主キーとバージョンを持ち、異なるsignを持つ各ペアの行を削除します +- 行が挿入された順序は関係ありません +- バージョンカラムが主キーパートでない場合、ClickHouseはそれを最後のフィールドとして主キーに暗黙的に追加します + +クエリを記述するときに同様のロジックを使用します - 主キーでグループ化し、キャンセルされたがまだ削除されていない行を避ける巧妙なロジックを使用します。`hackernews_views_vcmt`テーブルにいくつかの行を追加しましょう: + +```sql +INSERT INTO hackernews_views_vcmt VALUES + (1, 'ricardo', 0, 1, 1), + (2, 'ch_fan', 0, 1, 1), + (3, 'kenny', 0, 1, 1) +``` + +次に、2つの行を更新し、1つを削除します。行をキャンセルするには、前のバージョン番号を含めてください(これは主キーの一部であるため): + +```sql +INSERT INTO hackernews_views_vcmt VALUES + (1, 'ricardo', 0, -1, 1), + (1, 'ricardo', 50, 1, 2), + (2, 'ch_fan', 0, -1, 1), + (3, 'kenny', 0, -1, 1), + (3, 'kenny', 1000, 1, 2) +``` + +signカラムに基づいて値を加減算する同じクエリを実行します: + +```sql +SELECT + id, + author, + sum(views * sign) +FROM hackernews_views_vcmt +GROUP BY (id, author) +HAVING sum(sign) > 0 +ORDER BY id ASC +``` + +結果は2行です: + +```response +┌─id─┬─author──┬─sum(multiply(views, sign))─┐ +│ 1 │ ricardo │ 50 │ +│ 3 │ kenny │ 1000 │ +└────┴─────────┴────────────────────────────┘ +``` + +テーブルのマージを強制します: + +```sql +OPTIMIZE TABLE hackernews_views_vcmt +``` + +結果には2行だけが含まれます: + +```sql +SELECT * +FROM hackernews_views_vcmt +``` + +```response +┌─id─┬─author──┬─views─┬─sign─┬─version─┐ +│ 1 │ ricardo │ 50 │ 1 │ 2 │ +│ 3 │ kenny │ 1000 │ 1 │ 2 │ +└────┴─────────┴───────┴──────┴─────────┘ +``` + +`VersionedCollapsingMergeTree`テーブルは、複数のクライアントやスレッドからの行の挿入を行いつつ、重複排除を実装したい場合に非常に役立ちます。 + +## なぜ行が重複排除されていないのか? + +挿入された行が重複排除されない理由の一つは、`INSERT`ステートメントで非冪等関数や式を使用している場合です。例えば、`createdAt DateTime64(3) DEFAULT now()`というカラムを使用して行を挿入すると、各行は一意のデフォルト値を持つため、必ずユニークになります。MergeTree / ReplicatedMergeTreeテーブルエンジンは、各挿入行が一意のチェックサムを生成するため、重複排除を認識しません。 + +この場合、バッチの行ごとに独自の`insert_deduplication_token`を指定して、同じバッチの複数の挿入が同じ行を再挿入することにならないようにすることができます。[`insert_deduplication_token`に関するドキュメント](/docs/ja/operations/settings/settings#insert_deduplication_token)をご覧ください。この設定の使用方法についてもっと詳しく知ることができます。 diff --git a/docs/ja/guides/developer/images/Deduplication.png b/docs/ja/guides/developer/images/Deduplication.png new file mode 100644 index 00000000000..3e89a646b8e Binary files /dev/null and b/docs/ja/guides/developer/images/Deduplication.png differ diff --git a/docs/ja/guides/developer/images/analyzer1.png b/docs/ja/guides/developer/images/analyzer1.png new file mode 100644 index 00000000000..4938af2149b Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer1.png differ diff --git a/docs/ja/guides/developer/images/analyzer2.png b/docs/ja/guides/developer/images/analyzer2.png new file mode 100644 index 00000000000..2943b8b8efd Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer2.png differ diff --git a/docs/ja/guides/developer/images/analyzer3.png b/docs/ja/guides/developer/images/analyzer3.png new file mode 100644 index 00000000000..0530706badb Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer3.png differ diff --git a/docs/ja/guides/developer/images/analyzer4.png b/docs/ja/guides/developer/images/analyzer4.png new file mode 100644 index 00000000000..e4b038f4391 Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer4.png differ diff --git a/docs/ja/guides/developer/images/analyzer5.png b/docs/ja/guides/developer/images/analyzer5.png new file mode 100644 index 00000000000..54f8420696e Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer5.png differ diff --git a/docs/ja/guides/developer/lightweight-delete.md b/docs/ja/guides/developer/lightweight-delete.md new file mode 100644 index 00000000000..5a98f5a7a7d --- /dev/null +++ b/docs/ja/guides/developer/lightweight-delete.md @@ -0,0 +1,8 @@ +--- +slug: /ja/guides/developer/lightweight-delete +title: 論理削除 +keywords: [論理削除] +--- +import Content from '@site/docs/ja/sql-reference/statements/delete.md'; + + diff --git a/docs/ja/guides/developer/lightweight-update.md b/docs/ja/guides/developer/lightweight-update.md new file mode 100644 index 00000000000..dbf36ca02bd --- /dev/null +++ b/docs/ja/guides/developer/lightweight-update.md @@ -0,0 +1,95 @@ +--- +slug: /ja/guides/developer/lightweight-update +sidebar_label: 論理更新 +title: 論理更新 +keywords: [lightweight update] +--- + +## 論理更新 + +:::note +論理更新はClickHouse Cloudでのみ利用可能です。 +::: + +論理更新が有効な場合、更新された行は即座に更新済みとしてマークされ、後続の`SELECT`クエリは自動的に変更された値を返します。論理更新が有効でない場合は、バックグラウンド処理でミューテーションが適用されるのを待つ必要があるかもしれません。 + +論理更新は、`MergeTree`ファミリーのテーブルに対してクエリレベルの設定`apply_mutations_on_fly`を有効にすることで使用できます。 + +```sql +SET apply_mutations_on_fly = 1; +``` + +## 例 + +テーブルを作成し、いくつかのミューテーションを実行してみましょう: +```sql +CREATE TABLE test_on_fly_mutations (id UInt64, v String) +ENGINE = MergeTree ORDER BY id; + +-- 論理更新が有効でない場合のデフォルトの動作を示すために +-- ミューテーションのバックグラウンドの具体化を無効化 +SYSTEM STOP MERGES test_on_fly_mutations; +SET mutations_sync = 0; + +-- 新しいテーブルにいくつかの行を挿入 +INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c'); + +-- 行の値を更新 +ALTER TABLE test_on_fly_mutations UPDATE v = 'd' WHERE id = 1; +ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'd'; +ALTER TABLE test_on_fly_mutations UPDATE v = 'e' WHERE id = 2; +ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'e'; +``` + +`SELECT`クエリで更新の結果を確認してみましょう: +```sql +-- 論理更新を明示的に無効化 +SET apply_mutations_on_fly = 0; + +SELECT id, v FROM test_on_fly_mutations ORDER BY id; +``` + +新しいテーブルをクエリした際に、行の値がまだ更新されていないことに注意してください: + +``` +┌─id─┬─v─┐ +│ 1 │ a │ +│ 2 │ b │ +│ 3 │ c │ +└────┴───┘ +``` + +論理更新を有効にするとどうなるかを見てみましょう: + +```sql +-- 論理更新を有効化 +SET apply_mutations_on_fly = 1; + +SELECT id, v FROM test_on_fly_mutations ORDER BY id; +``` + +この`SELECT`クエリは、ミューテーションが適用されるのを待たなくても、正しい結果を即座に返すようになります: + +``` +┌─id─┬─v─┐ +│ 3 │ c │ +└────┴───┘ +``` + +## パフォーマンスへの影響 + +論理更新を有効にすると、ミューテーションは即座に具体化されず、`SELECT`クエリの際にのみ適用されます。ただし、ミューテーションはバックグラウンドで非同期に具体化されていることに注意してください。これは重いプロセスです。 + +特定の時間間隔内で処理されるミューテーションの数を送信されたミューテーションの数が常に超える場合、適用されるべき具体化されていないミューテーションのキューが増え続けます。これにより、最終的に`SELECT`クエリのパフォーマンスの劣化を招く可能性があります。 + +具体化されていないミューテーションの無限成長を制限するために、`apply_mutations_on_fly`の設定を`number_of_mutations_to_throw`や`number_of_mutations_to_delay`といった他の`MergeTree`レベルの設定と併せて有効にすることをお勧めします。 + +## サブクエリと非決定的な関数のサポート + +論理更新は、サブクエリと非決定的な関数に対して限定的なサポートを提供します。妥当なサイズ(設定`mutations_max_literal_size_to_replace`で制御される)の結果を持つスカラーサブクエリのみがサポートされています。また、定数の非決定的な関数(例:`now()`関数)のみがサポートされています。 + +これらの動作は次の設定によって制御されます: + +- `mutations_execute_nondeterministic_on_initiator` - trueの場合、非決定的な関数はイニシエーターレプリカで実行され、`UPDATE`や`DELETE`クエリでリテラルとして置き換えられます。デフォルト値:`false`。 +- `mutations_execute_subqueries_on_initiator` - trueの場合、スカラーサブクエリはイニシエーターレプリカで実行され、`UPDATE`や`DELETE`クエリでリテラルとして置き換えられます。デフォルト値:`false`。 +- `mutations_max_literal_size_to_replace` - `UPDATE`や`DELETE`クエリで置き換えるリテラルのシリアライズされた最大サイズ(バイト単位)。デフォルト値:`16384`(16 KiB)。 diff --git a/docs/ja/guides/developer/mutations.md b/docs/ja/guides/developer/mutations.md new file mode 100644 index 00000000000..e3487ea7263 --- /dev/null +++ b/docs/ja/guides/developer/mutations.md @@ -0,0 +1,100 @@ +--- +slug: /ja/guides/developer/mutations +sidebar_label: データの更新と削除 +sidebar_position: 1 +keywords: [更新, 削除, ミューテーション] +--- + +# ClickHouse データの更新と削除 + +ClickHouse は高ボリュームの分析ワークロードに適しているものの、特定の状況では既存のデータを変更または削除できます。これらの操作は「ミューテーション」と呼ばれ、`ALTER TABLE` コマンドを使用して実行されます。また、ClickHouse の論理削除の機能を使用して、行を `DELETE` することもできます。 + +:::tip +頻繁な更新が必要な場合は、ClickHouse の [重複排除](../developer/deduplication.md) を使用することを検討してください。これにより、ミューテーションイベントを生成せずに行を更新および/または削除できます。 +::: + +## データの更新 + +テーブルの行を更新するには `ALTER TABLE...UPDATE` コマンドを使用します: + +```sql +ALTER TABLE [.] UPDATE = WHERE +``` + +`` は `` を満たすカラムの新しい値です。`` はカラムと同じデータ型であるか、`CAST` 演算子を使用して同じデータ型に変換可能である必要があります。`` はデータの各行に対して `UInt8`(0 または 0 以外)の値を返す必要があります。複数の `UPDATE ` ステートメントをカンマで区切って単一の `ALTER TABLE` コマンドに組み合わせることができます。 + +**例**: + + 1. このようなミューテーションは、Dictionaryルックアップを使用して `visitor_id` を新しいものに更新できます。 + + ```sql + ALTER TABLE website.clicks + UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id) + WHERE visit_date < '2022-01-01' + ``` + +2. 一つのコマンドで複数の値を変更することで、複数のコマンドよりも効率的になります。 + + ```sql + ALTER TABLE website.clicks + UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id + WHERE visit_date < '2022-01-01' + ``` + +3. シャード化されたテーブルに対して `ON CLUSTER` でミューテーションを実行できます。 + + ```sql + ALTER TABLE clicks ON CLUSTER main_cluster + UPDATE click_count = click_count / 2 + WHERE visitor_id ILIKE '%robot%' + ``` + +:::note +主キーまたはソートキーの一部であるカラムを更新することはできません。 +::: + +## データの削除 + +行を削除するには、`ALTER TABLE` コマンドを使用します: + +```sql +ALTER TABLE [.]
DELETE WHERE +``` + +`` はデータの各行に対して `UInt8` の値を返す必要があります。 + +**例** + +1. カラムが値の配列に含まれるレコードを削除する: + ```sql + ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277) + ``` + +2. このクエリは何を変更するのか? + ```sql + ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573' + ``` + +:::note +テーブル内のすべてのデータを削除するには、`TRUNCATE TABLE [` コマンドを使用する方が効率的です。このコマンドは `ON CLUSTER` でも実行できます。 +::: + +詳細については、[`DELETE` ステートメント](/docs/ja/sql-reference/statements/delete.md) ドキュメントページを参照してください。 + +## 論理削除 + +行を削除する別のオプションとして、`DELETE FROM` コマンドがあります。これは **論理削除** と呼ばれます。削除された行は即座に削除としてマークされ、後続のすべてのクエリから自動的にフィルタリングされるため、パーツのマージを待ったり `FINAL` キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期に行われます。 + +``` sql +DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr] +``` + +たとえば、次のクエリは、`Title` カラムに `hello` というテキストが含まれる `hits` テーブルのすべての行を削除します。 + +```sql +DELETE FROM hits WHERE Title LIKE '%hello%'; +``` + +論理削除に関する注意事項: +- この機能は `MergeTree` テーブルエンジンファミリーでのみ利用可能です。 +- 論理削除はデフォルトで非同期です。`mutations_sync` を 1 に設定すると 1 つのレプリカがステートメントを処理するのを待ち、2 に設定するとすべてのレプリカを待ちます。 diff --git a/docs/ja/guides/developer/time-series-filling-gaps.md b/docs/ja/guides/developer/time-series-filling-gaps.md new file mode 100644 index 00000000000..5d985f6ca44 --- /dev/null +++ b/docs/ja/guides/developer/time-series-filling-gaps.md @@ -0,0 +1,337 @@ +--- +slug: /ja/guides/developer/time-series-filling-gaps +sidebar_label: タイムシリーズ - ギャップの埋め方 +sidebar_position: 10 +description: タイムシリーズデータのギャップを埋める。 +keywords: [time series, gap fill] +--- + +# タイムシリーズデータのギャップを埋める + +タイムシリーズデータを扱う際、データが欠落しているか、非アクティブのためにギャップが発生することがあります。通常、データをクエリする際に、そのようなギャップを残したくありません。この場合、`WITH FILL`句が便利です。このガイドでは、`WITH FILL`を使用してタイムシリーズデータのギャップを埋める方法を説明します。 + +## セットアップ + +GenAIイメージサービスによって生成された画像のメタデータを格納する以下のようなテーブルがあるとします: + +```sql +CREATE TABLE images +( + `id` String, + `timestamp` DateTime64(3), + `height` Int64, + `width` Int64, + `size` Int64 +) +ENGINE = MergeTree +ORDER BY (size, height, width); +``` + +いくつかのレコードをインポートします: + +```sql +INSERT INTO images VALUES (1088619203512250448, '2023-03-24 00:24:03.684', 1536, 1536, 2207289); +INSERT INTO images VALUES (1088619204040736859, '2023-03-24 00:24:03.810', 1024, 1024, 1928974); +INSERT INTO images VALUES (1088619204749561989, '2023-03-24 00:24:03.979', 1024, 1024, 1275619); +INSERT INTO images VALUES (1088619206431477862, '2023-03-24 00:24:04.380', 2048, 2048, 5985703); +INSERT INTO images VALUES (1088619206905434213, '2023-03-24 00:24:04.493', 1024, 1024, 1558455); +INSERT INTO images VALUES (1088619208524431510, '2023-03-24 00:24:04.879', 1024, 1024, 1494869); +INSERT INTO images VALUES (1088619208425437515, '2023-03-24 00:24:05.160', 1024, 1024, 1538451); +``` + +## バケット単位のクエリ + +2023年3月24日の`00:24:03`から`00:24:04`の間に作成された画像を調べるために、これらの時点のパラメータを作成します: + +```sql +SET param_start = '2023-03-24 00:24:03', + param_end = '2023-03-24 00:24:04'; +``` + +次に、データを100ミリ秒のバケットにグループ化し、そのバケットで作成された画像の数を返すクエリを書きます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +結果セットは画像が作成されたバケットのみを含んでいますが、タイムシリーズ分析では、エントリがなくても各100msのバケットを返したい場合があります。 + +## WITH FILL + +これらのギャップを埋めるために`WITH FILL`句を使用できます。また、ギャップを埋めるサイズである`STEP`も指定します。`DateTime`タイプの場合のデフォルトは1秒ですが、100msのギャップを埋めたいので、ステップ値として100msの間隔を指定します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +`count`カラムには0の値でギャップが埋められています。 + +## WITH FILL...FROM + +しかし、時間範囲の最初にまだギャップがあります。これを修正するには`FROM`を指定します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +結果から`00:24:03.000`から`00:24:03.500`までのバケットがすべて出現しています。 + +## WITH FILL...TO + +しかしまだ、時間範囲の終わりからいくつかのバケットが欠けています。これを埋めるために`TO`値を指定します。`TO`は含まれないので、終わりの時間に少しだけ追加します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 1 millisecond +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +│ 2023-03-24 00:24:04.900 │ 0 │ +│ 2023-03-24 00:24:05.000 │ 0 │ +└─────────────────────────┴───────┘ +``` + +ギャップがすべて埋められ、`00:24:03.000`から`00:24:05.000`までのすべての100msのエントリがあります。 + +## 累積カウント + +次に、バケット全体で作成された画像の累積カウントを保持したいとします。以下のように`cumulative`カラムを追加できます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 1 millisecond +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ +│ 2023-03-24 00:24:04.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ +│ 2023-03-24 00:24:04.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ +│ 2023-03-24 00:24:04.900 │ 0 │ 0 │ +│ 2023-03-24 00:24:05.000 │ 0 │ 0 │ +└─────────────────────────┴───────┴────────────┘ +``` + +`cumulative`カラムの値は意図した通りには機能していません。 + +## WITH FILL...INTERPOLATE + +`count`カラムが0の行は`cumulative`カラムも0のままですが、`cumulative`カラムの前の値を使用させたいです。以下のように`INTERPOLATE`句を使用してこれを実現できます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 100 millisecond +STEP toIntervalMillisecond(100) +INTERPOLATE (cumulative); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ 1 │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ +│ 2023-03-24 00:24:04.000 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.100 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.200 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ +│ 2023-03-24 00:24:04.500 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.600 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.700 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ +│ 2023-03-24 00:24:04.900 │ 0 │ 6 │ +│ 2023-03-24 00:24:05.000 │ 0 │ 6 │ +└─────────────────────────┴───────┴────────────┘ +``` + +これでかなり良くなりました。そして最後に、`bar`関数を使用して棒グラフを追加します。新しいカラムを`INTERPPOLATE`句に追加するのも忘れないようにします。 + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative, + bar(cumulative, 0, 10, 10) AS barChart +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 100 millisecond +STEP toIntervalMillisecond(100) +INTERPOLATE (cumulative, barChart); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┬─barChart─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ █ │ +│ 2023-03-24 00:24:03.700 │ 0 │ 1 │ █ │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ ██ │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.000 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.100 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.200 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ ████ │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.500 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.600 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.700 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ ██████ │ +│ 2023-03-24 00:24:04.900 │ 0 │ 6 │ ██████ │ +│ 2023-03-24 00:24:05.000 │ 0 │ 6 │ ██████ │ +└─────────────────────────┴───────┴────────────┴──────────┘ +``` diff --git a/docs/ja/guides/developer/ttl.md b/docs/ja/guides/developer/ttl.md new file mode 100644 index 00000000000..01e5a2914db --- /dev/null +++ b/docs/ja/guides/developer/ttl.md @@ -0,0 +1,259 @@ +--- +slug: /ja/guides/developer/ttl +sidebar_label: 有効期限 (TTL) +sidebar_position: 2 +keywords: [ttl, time to live, clickhouse, 古い, データ] +description: TTL (time-to-live) は、一定期間経過後に行やカラムを移動、削除、または集約する機能を指します。 +--- + +# 有効期限 (TTL) を用いたデータ管理 + +## TTLの概要 + +TTL (time-to-live) は、一定期間経過後に行やカラムを移動、削除、または集約する機能を指します。「time-to-live」という表現は古いデータを削除することだけを意味しているように聞こえますが、TTLにはいくつかの用途があります: + +- 古いデータの削除: 予想どおり、指定された時間経過後に行やカラムを削除できます +- ディスク間のデータ移動: 一定時間経過後にストレージボリューム間でデータを移動できます - ホット/ウォーム/コールドアーキテクチャの展開に役立ちます +- データのロールアップ: 古いデータを削除する前に、有用な集計や計算にまとめます + +:::note +TTLは、テーブル全体または特定のカラムに適用できます。 +::: + +## TTLの構文 + +`TTL`句は、カラム定義の後および/またはテーブル定義の最後に記述できます。`INTERVAL`句を使用して、時間の長さを定義します(これには`Date`または`DateTime`データ型が必要です)。たとえば、次のテーブルには`TTL`句を持つ二つのカラムがあります: + +```sql +CREATE TABLE example1 ( + timestamp DateTime, + x UInt32 TTL timestamp + INTERVAL 1 MONTH, + y String TTL timestamp + INTERVAL 1 DAY, + z String +) +ENGINE = MergeTree +ORDER BY tuple() +``` + +- xカラムは、timestampカラムから1か月の有効期限があります +- yカラムは、timestampカラムから1日の有効期限があります +- インターバルが経過すると、カラムは期限切れになります。ClickHouseはデフォルト値に置き換え、データ部分の全カラム値が期限切れになると、そのカラムをファイルシステムから削除します。 + +:::note +TTLルールは変更または削除できます。詳細は[テーブルTTLの操作](/docs/ja/sql-reference/statements/alter/ttl.md)ページを参照してください。 +::: + +## TTLイベントのトリガー + +期限切れの行を削除または集約する操作は即時には行われず、テーブルマージ時にのみ実行されます。アクティブにマージされていないテーブルがある場合、TTLイベントをトリガーする2つの設定があります: + +- `merge_with_ttl_timeout`: 削除TTLで再度マージするまでの最小遅延時間(秒)。デフォルトは14400秒(4時間)です。 +- `merge_with_recompression_ttl_timeout`: 再圧縮TTL(削除前にデータをロールアップするルール)で再度マージするまでの最小遅延時間(秒)。デフォルト値は14400秒(4時間)です。 + +したがって、デフォルトでは、TTLルールは少なくとも4時間ごとにテーブルに適用されます。より頻繁にTTLルールを適用する必要がある場合は、上記の設定を変更してください。 + +:::note +推奨する頻繁な使用法ではありませんが、`OPTIMIZE`を使用してマージを強制することもできます: + +```sql +OPTIMIZE TABLE example1 FINAL +``` + +`OPTIMIZE`はテーブルの部分の予定外のマージを初期化し、`FINAL`はテーブルがすでに単一部分になっている場合に再最適化を強制します。 +::: + +## 行の削除 + +一定時間経過後にテーブル全体の行を削除するには、テーブルレベルでTTLルールを定義します: + +```sql +CREATE TABLE customers ( +timestamp DateTime, +name String, +balance Int32, +address String +) +ENGINE = MergeTree +ORDER BY timestamp +TTL timestamp + INTERVAL 12 HOUR +``` + +さらに、レコードの値に基づくTTLルールを定義することも可能です。 +これは、条件を指定することで簡単に実装できます。 +複数の条件を許可しています: + +```sql +CREATE TABLE events +( + `event` String, + `time` DateTime, + `value` UInt64 +) +ENGINE = MergeTree +ORDER BY (event, time) +TTL time + INTERVAL 1 MONTH DELETE WHERE event != 'error', + time + INTERVAL 6 MONTH DELETE WHERE event = 'error' +``` + +## カラムの削除 + +行全体を削除する代わりに、balanceとaddressカラムだけを期限切れにしたいとします。`customers`テーブルを変更し、両方のカラムに2時間のTTLを追加します: + +```sql +ALTER TABLE customers +MODIFY COLUMN balance Int32 TTL timestamp + INTERVAL 2 HOUR, +MODIFY COLUMN address String TTL timestamp + INTERVAL 2 HOUR +``` + +## ロールアップの実装 + +特定の期間経過後に行を削除したいが、報告目的のために一部のデータを保持したい場合を考えてみましょう。すべての詳細が欲しいわけではなく、履歴データの集約された結果を少し欲しいだけです。これは、`TTL`式に`GROUP BY`句を追加し、テーブルのカラムを使用して集約結果を保存することで実装できます。 + +以下の`hits`テーブルでは、古い行を削除しますが、削除する前に`hits`カラムの合計と最大を保持したいとします。それらの値を保存するフィールドが必要であり、それに加えて合計と最大をロールアップする`TTL`句に`GROUP BY`句を追加する必要があります: + +```sql +CREATE TABLE hits ( + timestamp DateTime, + id String, + hits Int32, + max_hits Int32 DEFAULT hits, + sum_hits Int64 DEFAULT hits +) +ENGINE = MergeTree +PRIMARY KEY (id, toStartOfDay(timestamp), timestamp) +TTL timestamp + INTERVAL 1 DAY + GROUP BY id, toStartOfDay(timestamp) + SET + max_hits = max(max_hits), + sum_hits = sum(sum_hits); +``` + +`hits`テーブルに関するいくつかの注意点: + +- `TTL`句の`GROUP BY`カラムは`PRIMARY KEY`のプレフィックスである必要があり、結果を日付の開始時点でグループ化したいです。そのため、`toStartOfDay(timestamp)`が主キーに追加されました +- 集約結果を保存するためのフィールド`max_hits`と`sum_hits`を追加しました +- `max_hits`と`sum_hits`のデフォルト値を`hits`に設定することは、`SET`句に基づいて、ロジックが機能するために必要です + +## ホット/ウォーム/コールドアーキテクチャの実装 + +:::note +ClickHouse Cloudを使用している場合、このレッスンの手順は適用されません。ClickHouse Cloudでは、古いデータを移動するといったことを気にする必要はありません。 +::: + +大量のデータを扱う際に一般的な手法として、データが古くなるにつれてデータを移動する方法があります。以下は`TTL`コマンドの`TO DISK`と`TO VOLUME`句を使用して、ClickHouseでホット/ウォーム/コールドアーキテクチャを実装する手順です。(ちなみに、これをホットとコールドのものとする必要はなく、どのようなユースケースでもデータを移動するためにTTLを使用できます。) + +1. `TO DISK`と`TO VOLUME`オプションは、ClickHouseの構成ファイルに定義されているディスクまたはボリュームの名前を指します。ディスクを定義する新しいファイル`my_system.xml`(または任意のファイル名)を作成し、そのディスクを使用するボリュームを定義します。このXMLファイルを`/etc/clickhouse-server/config.d/`に配置して、システムに構成を適用します: + +```xml + + + + + + + ./hot/ + + + ./warm/ + + + ./cold/ + + + + + + + default + + + hot_disk + + + warm_disk + + + cold_disk + + + + + + +``` + +2. 上記の設定は、ClickHouseが読み書きできるフォルダを指す三つのディスクを指しています。ボリュームは一つ以上のディスクを含むことができ、私たちは三つのディスクのためにそれぞれのボリュームを定義しました。ディスクを確認してみましょう: + +```sql +SELECT name, path, free_space, total_space +FROM system.disks +``` + +```response +┌─name────────┬─path───────────┬───free_space─┬──total_space─┐ +│ cold_disk │ ./data/cold/ │ 179143311360 │ 494384795648 │ +│ default │ ./ │ 179143311360 │ 494384795648 │ +│ hot_disk │ ./data/hot/ │ 179143311360 │ 494384795648 │ +│ warm_disk │ ./data/warm/ │ 179143311360 │ 494384795648 │ +└─────────────┴────────────────┴──────────────┴──────────────┘ +``` + +3. そして…ボリュームを確認しましょう: + +```sql +SELECT + volume_name, + disks +FROM system.storage_policies +``` + +```response +┌─volume_name─┬─disks─────────┐ +│ default │ ['default'] │ +│ hot_volume │ ['hot_disk'] │ +│ warm_volume │ ['warm_disk'] │ +│ cold_volume │ ['cold_disk'] │ +└─────────────┴───────────────┘ +``` + +4. では、データをホット、ウォーム、そしてコールドボリューム間で移動する`TTL`ルールを追加します: + +```sql +ALTER TABLE my_table + MODIFY TTL + trade_date TO VOLUME 'hot_volume', + trade_date + INTERVAL 2 YEAR TO VOLUME 'warm_volume', + trade_date + INTERVAL 4 YEAR TO VOLUME 'cold_volume'; +``` + +5. 新しい`TTL`ルールは材料化されるはずですが、確認のために強制することもできます: + +```sql +ALTER TABLE my_table + MATERIALIZE TTL +``` + +6. `system.parts`テーブルを使って、データが期待通りのディスクに移動したかを確認してください: + +```sql +Using the system.parts table, view which disks the parts are on for the crypto_prices table: + +SELECT + name, + disk_name +FROM system.parts +WHERE (table = 'my_table') AND (active = 1) +``` + +レスポンスは以下のようになります: + +```response +┌─name────────┬─disk_name─┐ +│ all_1_3_1_5 │ warm_disk │ +│ all_2_2_0 │ hot_disk │ +└─────────────┴───────────┘ +``` + +## 関連コンテンツ + +- ブログ&ウェビナー: [Using TTL to Manage Data Lifecycles in ClickHouse](https://clickhouse.com/blog/using-ttl-to-manage-data-lifecycles-in-clickhouse) diff --git a/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md b/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md new file mode 100644 index 00000000000..17f09ccff83 --- /dev/null +++ b/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md @@ -0,0 +1,436 @@ +--- +slug: /ja/guides/developer/understanding-query-execution-with-the-analyzer +sidebar_label: アナライザーでクエリ実行を理解する +title: アナライザーでクエリ実行を理解する +--- + +# アナライザーでクエリ実行を理解する + +ClickHouseはクエリを非常に迅速に処理しますが、クエリの実行は単純ではありません。`SELECT`クエリがどのように実行されるかを理解してみましょう。これを説明するために、ClickHouseにテーブルにデータを追加します。 + +```sql +CREATE TABLE session_events( + clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type String +) ORDER BY (timestamp); + +INSERT INTO session_events SELECT * FROM generateRandom('clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type Enum(\'type1\', \'type2\')', 1, 10, 2) LIMIT 1000; +``` + +ClickHouseにデータを追加したので、クエリを実行してその実行を理解したいと思います。クエリの実行は多くのステップに分解されます。クエリ実行の各ステップは、対応する`EXPLAIN`クエリを使用して分析およびトラブルシューティングを行うことができます。これらのステップは以下のチャートにまとめられています。 + +![Explain query steps](./images/analyzer1.png) + +クエリ実行中の各エンティティの動作を見てみましょう。いくつかのクエリを取り上げ、`EXPLAIN`ステートメントを使用してそれらを調べます。 + +## パーサー + +パーサーの目的はクエリテキストをAST(抽象構文木)に変換することです。このステップは`EXPLAIN AST`を使用して視覚化できます。 + +```sql +EXPLAIN AST SELECT min(timestamp), max(timestamp) FROM session_events; + +┌─explain────────────────────────────────────────────┐ +│ SelectWithUnionQuery (children 1) │ +│ ExpressionList (children 1) │ +│ SelectQuery (children 2) │ +│ ExpressionList (children 2) │ +│ Function min (alias minimum_date) (children 1) │ +│ ExpressionList (children 1) │ +│ Identifier timestamp │ +│ Function max (alias maximum_date) (children 1) │ +│ ExpressionList (children 1) │ +│ Identifier timestamp │ +│ TablesInSelectQuery (children 1) │ +│ TablesInSelectQueryElement (children 1) │ +│ TableExpression (children 1) │ +│ TableIdentifier session_events │ +└────────────────────────────────────────────────────┘ +``` + +出力は以下のように視覚化される抽象構文木です。 + +![AST output](./images/analyzer2.png) + +各ノードには対応する子ノードがあり、全体の木構造はクエリの全体構造を表しています。これは、クエリ処理を助ける論理構造です。エンドユーザーの観点では(クエリ実行に興味がない限り)それほど役に立ちませんが、このツールは主に開発者によって使用されます。 + +## アナライザー + + + +ClickHouseには現在、アナライザーのための2つのアーキテクチャがあります。古いアーキテクチャを使用するには、`allow_experimental_analyzer=0`を設定することができます。新しいアーキテクチャを使用したい場合は、`allow_experimental_analyzer=1`を設定してください。新しいアナライザーが一般的に利用可能になったら古いものは廃止されるため、ここでは新しいアーキテクチャのみを説明します。 + +:::note +新しいアナライザーはベータ版です。新しいアーキテクチャはClickHouseの性能向上に役立つはずですが、クエリ処理ステップの基本要素であるため、いくつかのクエリに悪影響を及ぼす可能性もあります。新しいアナライザーに移行した後、性能の低下、クエリの失敗、または予期しない結果をもたらすクエリが発生する可能性があります。クエリまたはユーザーレベルで`allow_experimental_analyzer`設定を変更することで、古いアナライザーに戻すことができます。あらゆる問題をGitHubにて報告してください。 +::: + +アナライザーはクエリ実行の重要なステップです。ASTを取得してクエリツリーに変換します。クエリツリーの主な利点は、多くのコンポーネントが解決されることです。例えば、ストレージや、どのテーブルから読むのかがわかります。別名も解決され、異なるデータ型が使用されていることがわかります。これらすべての利点から、アナライザーは最適化を適用できます。これらの最適化は「パス」を通じて機能します。各パスは異なる最適化を探します。パスの一覧は[こちら](https://github.com/ClickHouse/ClickHouse/blob/76578ebf92af3be917cd2e0e17fea2965716d958/src/Analyzer/QueryTreePassManager.cpp#L249)にあります。以前のクエリで実際に確認してみましょう。 + +```sql +EXPLAIN QUERY TREE passes=0 SELECT min(timestamp) AS minimum_date, max(timestamp) AS maximum_date FROM session_events SETTINGS allow_experimental_analyzer=1; + +┌─explain────────────────────────────────────────────────────────────────────────────────┐ +│ QUERY id: 0 │ +│ PROJECTION │ +│ LIST id: 1, nodes: 2 │ +│ FUNCTION id: 2, alias: minimum_date, function_name: min, function_type: ordinary │ +│ ARGUMENTS │ +│ LIST id: 3, nodes: 1 │ +│ IDENTIFIER id: 4, identifier: timestamp │ +│ FUNCTION id: 5, alias: maximum_date, function_name: max, function_type: ordinary │ +│ ARGUMENTS │ +│ LIST id: 6, nodes: 1 │ +│ IDENTIFIER id: 7, identifier: timestamp │ +│ JOIN TREE │ +│ IDENTIFIER id: 8, identifier: session_events │ +│ SETTINGS allow_experimental_analyzer=1 │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +```sql +EXPLAIN QUERY TREE passes=20 SELECT min(timestamp) AS minimum_date, max(timestamp) AS maximum_date FROM session_events SETTINGS allow_experimental_analyzer=1; + +┌─explain───────────────────────────────────────────────────────────────────────────────────┐ +│ QUERY id: 0 │ +│ PROJECTION COLUMNS │ +│ minimum_date DateTime │ +│ maximum_date DateTime │ +│ PROJECTION │ +│ LIST id: 1, nodes: 2 │ +│ FUNCTION id: 2, function_name: min, function_type: aggregate, result_type: DateTime │ +│ ARGUMENTS │ +│ LIST id: 3, nodes: 1 │ +│ COLUMN id: 4, column_name: timestamp, result_type: DateTime, source_id: 5 │ +│ FUNCTION id: 6, function_name: max, function_type: aggregate, result_type: DateTime │ +│ ARGUMENTS │ +│ LIST id: 7, nodes: 1 │ +│ COLUMN id: 4, column_name: timestamp, result_type: DateTime, source_id: 5 │ +│ JOIN TREE │ +│ TABLE id: 5, alias: __table1, table_name: default.session_events │ +│ SETTINGS allow_experimental_analyzer=1 │ +└───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +2つの実行の間に、別名やプロジェクションの解決を見ることができます。 + +## プランナー + +プランナーはクエリツリーを取り、それに基づいてクエリプランを構築します。クエリツリーは特定のクエリで何をしたいかを示し、クエリプランはそれをどのように行うかを示します。追加の最適化がクエリプランの一部として行われます。`EXPLAIN PLAN`または`EXPLAIN`を使用してクエリプランを見ることができます(`EXPLAIN`は`EXPLAIN PLAN`を実行します)。 + +```sql +EXPLAIN PLAN WITH + ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT type, min(timestamp) AS minimum_date, max(timestamp) AS maximum_date, count(*) /total_rows * 100 AS percentage FROM session_events GROUP BY type + +┌─explain──────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ ReadFromMergeTree (default.session_events) │ +└──────────────────────────────────────────────────┘ +``` + +これが私たちにいくつかの情報を提供していますが、さらに多くの情報を得ることができます。たとえば、プロジェクションを行う必要があるカラムの名前を知りたいかもしれません。その場合、ヘッダーをクエリに追加することができます。 + +``` +EXPLAIN header = 1 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type + +┌─explain──────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Header: type String │ +│ minimum_date DateTime │ +│ maximum_date DateTime │ +│ percentage Nullable(Float64) │ +│ Aggregating │ +│ Header: type String │ +│ min(timestamp) DateTime │ +│ max(timestamp) DateTime │ +│ count() UInt64 │ +│ Expression (Before GROUP BY) │ +│ Header: timestamp DateTime │ +│ type String │ +│ ReadFromMergeTree (default.session_events) │ +│ Header: timestamp DateTime │ +│ type String │ +└──────────────────────────────────────────────────┘ +``` + +これで最後のプロジェクションのために作成する必要があるカラム名(`minimum_date`、`maximum_date`、および`percentage`)を知ることができますが、実行する必要があるすべてのアクションの詳細も知りたいかもしれません。これは`actions=1`を設定することで行うことができます。 + +```sql +EXPLAIN actions = 1 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type + + +┌─explain────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Actions: INPUT :: 0 -> type String : 0 │ +│ INPUT : 1 -> min(timestamp) DateTime : 1 │ +│ INPUT : 2 -> max(timestamp) DateTime : 2 │ +│ INPUT : 3 -> count() UInt64 : 3 │ +│ COLUMN Const(Nullable(UInt64)) -> total_rows Nullable(UInt64) : 4 │ +│ COLUMN Const(UInt8) -> 100 UInt8 : 5 │ +│ ALIAS min(timestamp) :: 1 -> minimum_date DateTime : 6 │ +│ ALIAS max(timestamp) :: 2 -> maximum_date DateTime : 1 │ +│ FUNCTION divide(count() :: 3, total_rows :: 4) -> divide(count(), total_rows) Nullable(Float64) : 2 │ +│ FUNCTION multiply(divide(count(), total_rows) :: 2, 100 :: 5) -> multiply(divide(count(), total_rows), 100) Nullable(Float64) : 4 │ +│ ALIAS multiply(divide(count(), total_rows), 100) :: 4 -> percentage Nullable(Float64) : 5 │ +│ Positions: 0 6 1 5 │ +│ Aggregating │ +│ Keys: type │ +│ Aggregates: │ +│ min(timestamp) │ +│ Function: min(DateTime) → DateTime │ +│ Arguments: timestamp │ +│ max(timestamp) │ +│ Function: max(DateTime) → DateTime │ +│ Arguments: timestamp │ +│ count() │ +│ Function: count() → UInt64 │ +│ Arguments: none │ +│ Skip merging: 0 │ +│ Expression (Before GROUP BY) │ +│ Actions: INPUT :: 0 -> timestamp DateTime : 0 │ +│ INPUT :: 1 -> type String : 1 │ +│ Positions: 0 1 │ +│ ReadFromMergeTree (default.session_events) │ +│ ReadType: Default │ +│ Parts: 1 │ +│ Granules: 1 │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +これで使用されているすべての入力、関数、エイリアス、データ型を見ることができます。プランナーが適用するいくつかの最適化は[こちら](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/QueryPlan/Optimizations/Optimizations.h)に見ることができます。 + +## クエリパイプライン + +クエリパイプラインはクエリプランから生成されます。クエリパイプラインはクエリプランに非常に似ていますが、それが木ではなくグラフであるという点が異なります。ClickHouseがどのようにクエリを実行し、どのリソースが使用されるかを強調表示します。クエリパイプラインを分析することは、入力/出力に関するボトルネックを確認するのに非常に役立ちます。以前のクエリを取り上げ、クエリパイプラインの実行を見てみましょう。 + +```sql +EXPLAIN PIPELINE +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type; + +┌─explain────────────────────────────────────────────────────────────────────┐ +│ (Expression) │ +│ ExpressionTransform × 2 │ +│ (Aggregating) │ +│ Resize 1 → 2 │ +│ AggregatingTransform │ +│ (Expression) │ +│ ExpressionTransform │ +│ (ReadFromMergeTree) │ +│ MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread) 0 → 1 │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +括弧内はクエリプランステップであり、それに続くのはプロセッサーです。これは素晴らしい情報ですが、これはグラフであるため、そのように視覚化できると良いでしょう。設定`graph`を1に設定し、出力フォーマットをTSVに指定することができます。 + +```sql +EXPLAIN PIPELINE graph=1 WITH + ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT type, min(timestamp) AS minimum_date, max(timestamp) AS maximum_date, count(*) /total_rows * 100 AS percentage FROM session_events GROUP BY type FORMAT TSV; +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + subgraph cluster_0 { + label ="Expression"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n5 [label="ExpressionTransform × 2"]; + } + } + subgraph cluster_1 { + label ="Aggregating"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n3 [label="AggregatingTransform"]; + n4 [label="Resize"]; + } + } + subgraph cluster_2 { + label ="Expression"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n2 [label="ExpressionTransform"]; + } + } + subgraph cluster_3 { + label ="ReadFromMergeTree"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n1 [label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + } + } + } + n3 -> n4 [label=""]; + n4 -> n5 [label="× 2"]; + n2 -> n3 [label=""]; + n1 -> n2 [label=""]; +} +``` + +この出力をコピーし、[ここ](https://dreampuf.github.io/GraphvizOnline)に貼り付けると、次のグラフが生成されます。 + +![Graph output](./images/analyzer3.png) + +白い矩形はパイプラインノードに対応し、灰色の矩形はクエリプランステップに対応します。数字の後に`x`が付くのは、使用されている入力/出力の数を示しています。コンパクト形式で見たくない場合は、`compact=0`を追加することができます。 + +```sql +EXPLAIN PIPELINE graph = 1, compact = 0 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type +FORMAT TSV +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + n0[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n1[label="ExpressionTransform"]; + n2[label="AggregatingTransform"]; + n3[label="Resize"]; + n4[label="ExpressionTransform"]; + n5[label="ExpressionTransform"]; + } + n0 -> n1; + n1 -> n2; + n2 -> n3; + n3 -> n4; + n3 -> n5; +} +``` + +![Compact graph output](./images/analyzer4.png) + +なぜClickHouseは複数のスレッドを使用してテーブルから読み取りを行わないのでしょうか?テーブルにデータを追加してみましょう。 + +```sql +INSERT INTO session_events SELECT * FROM generateRandom('clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type Enum(\'type1\', \'type2\')', 1, 10, 2) LIMIT 1000000; +``` + +次に、再度`EXPLAIN`クエリを実行してみましょう。 + +```sql +EXPLAIN PIPELINE graph = 1, compact = 0 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type +FORMAT TSV +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + n0[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n1[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n2[label="ExpressionTransform"]; + n3[label="ExpressionTransform"]; + n4[label="StrictResize"]; + n5[label="AggregatingTransform"]; + n6[label="AggregatingTransform"]; + n7[label="Resize"]; + n8[label="ExpressionTransform"]; + n9[label="ExpressionTransform"]; + } + n0 -> n2; + n1 -> n3; + n2 -> n4; + n3 -> n4; + n4 -> n5; + n4 -> n6; + n5 -> n7; + n6 -> n7; + n7 -> n8; + n7 -> n9; +} +``` + +![Parallel graph](./images/analyzer5.png) + +したがって、エグゼキューターはデータ量が十分でないため、操作を並列化しないことを決定しました。より多くの行を追加すると、エグゼキューターはグラフに示されるように複数のスレッドを使用することを決定しました。 + +## エグゼキューター + +クエリ実行の最後のステップはエグゼキューターによって行われます。クエリパイプラインを取り、それを実行します。`SELECT`、`INSERT`、または`INSERT SELECT`を行うかに応じて、異なるエグゼキューターがあります。 +``` diff --git a/docs/ja/guides/images/joins-1.png b/docs/ja/guides/images/joins-1.png new file mode 100644 index 00000000000..2888262493f Binary files /dev/null and b/docs/ja/guides/images/joins-1.png differ diff --git a/docs/ja/guides/images/joins-2.png b/docs/ja/guides/images/joins-2.png new file mode 100644 index 00000000000..26bd293170c Binary files /dev/null and b/docs/ja/guides/images/joins-2.png differ diff --git a/docs/ja/guides/images/joins-3.png b/docs/ja/guides/images/joins-3.png new file mode 100644 index 00000000000..8b62fa42897 Binary files /dev/null and b/docs/ja/guides/images/joins-3.png differ diff --git a/docs/ja/guides/images/joins-4.png b/docs/ja/guides/images/joins-4.png new file mode 100644 index 00000000000..121f412384f Binary files /dev/null and b/docs/ja/guides/images/joins-4.png differ diff --git a/docs/ja/guides/images/joins-5.png b/docs/ja/guides/images/joins-5.png new file mode 100644 index 00000000000..8e2fe2df3ab Binary files /dev/null and b/docs/ja/guides/images/joins-5.png differ diff --git a/docs/ja/guides/images/postgres-inserts.png b/docs/ja/guides/images/postgres-inserts.png new file mode 100644 index 00000000000..0b4032adfb9 Binary files /dev/null and b/docs/ja/guides/images/postgres-inserts.png differ diff --git a/docs/ja/guides/images/s3_bucket_example.png b/docs/ja/guides/images/s3_bucket_example.png new file mode 100644 index 00000000000..9c6d5c4355c Binary files /dev/null and b/docs/ja/guides/images/s3_bucket_example.png differ diff --git a/docs/ja/guides/inserting-data.md b/docs/ja/guides/inserting-data.md new file mode 100644 index 00000000000..03bbcc997be --- /dev/null +++ b/docs/ja/guides/inserting-data.md @@ -0,0 +1,77 @@ +--- +title: データの挿入 +description: ClickHouseへのデータの挿入方法 +keywords: [挿入, データ挿入, テーブルへの挿入] +--- + +## 基本的な例 + +ClickHouseでおなじみの `INSERT INTO TABLE` コマンドを使用できます: + +```sql +INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) +``` + +動作を確認してみましょう。挿入された4行のデータが表示されるはずです: + +```sql +SELECT * FROM helloworld.my_first_table +``` + +## ClickHouseへの挿入とOLTPデータベースとの比較 + +OLAPデータベースとして、ClickHouseは高性能とスケーラビリティに最適化されており、毎秒何百万行もの挿入を可能にします。これは、高度に並列化されたアーキテクチャ、列指向による高圧縮を組み合わせることで実現されますが、一貫性には妥協があります。具体的には、ClickHouseは追記専用操作に最適化されており、最終的な整合性の保証のみを提供します。 + +これに対し、PostgresのようなOLTPデータベースは、トランザクション挿入に最適化され、完全なACID準拠を持ち、強い一貫性と信頼性の保証を提供します。PostgreSQLはMVCC(Multi-Version Concurrency Control)を使用して同時トランザクションを処理し、複数のデータバージョンを維持します。これらのトランザクションは、時間内に少数の行になる可能性があり、挿入パフォーマンスを制限する信頼性保証によるオーバーヘッドが発生します。 + +ClickHouseへの高い挿入パフォーマンスを達成するために、強い一貫性の保証を得る場合、以下に説明するシンプルなルールに従う必要があります。これにより、ClickHouseを初めて使用するユーザーがOLTP挿入戦略を再現する際に一般的に遭遇する問題を回避できます。 + +## 挿入時のベストプラクティス + +- **大きなバッチサイズ** - デフォルトでは、ClickHouseに送信される各挿入は、挿入からのデータと共に保存する必要のある他のメタデータを含むストレージのパートを即座に作成するため、より多くのデータを含む小さな数の挿入を送信することは、より少ないデータを含む多量の挿入を送信することに比べて必要な書き込みの数を減らします。基本的には、1,000行以上、理想的には10,000〜100,000行のかなり大きなバッチでデータを挿入することをお勧めします。詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)。大きなバッチが不可能な場合は、以下で説明する非同期挿入を使用してください。 + +- **再試行のための一貫したバッチを確保して冪等性を担保する再試行** - デフォルトでは、ClickHouseへの挿入は同期的であり、同一の場合のみ冪等性があります。MergeTreeエンジンファミリーのテーブルの場合、ClickHouseはデフォルトで自動的に[挿入時に重複を除去](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#5-deduplication-at-insert-time)します。例えば以下のようなケースにおいても挿入は許容されます: + + 1. データを受信したノードに問題がある場合、挿入クエリはタイムアウト(またはより具体的なエラー)し、確認応答が得られません。 + 2. データがノードによって書き込まれたが、ネットワークの中断により、クエリの送信者に確認応答を返すことができない場合、送信者はタイムアウトまたはネットワークエラーを受け取ります。 + + クライアントの観点からは、(i) と (ii) を区別するのは難しい場合があります。しかし、どちらの場合でも、確認のない挿入は直ちに再試行できます。再試行された挿入クエリが同じ順序で同じデータを含む限り、ClickHouseは(確認されていない)元の挿入が成功した場合、再試行された挿入を自動的に無視します。 + +- **MergeTreeテーブルまたは分散テーブルへの挿入** - データがシャードされている場合、リクエストを一連のノードに分散させてMergeTree(またはReplicatedテーブル)に直接挿入し、`internal_replication=true` を使用することを推奨します。これにより、ClickHouseはデータを任意のレプリカシャードにレプリケートし、データが最終的に整合性を持つようにします。このクライアントサイドの負荷分散が不便な場合、ユーザーは[分散テーブル](/ja/engines/table-engines/special/distributed)を介して挿入できます。これにより、ノード間で書き込みが分散されます(やはり、`internal_replication=true` を設定します)。このアプローチは、ノードに分散テーブルがある場合、データをローカルで書き込んでからシャードに送信するため、やや性能が劣ります。 + +- **小さなバッチの非同期挿入を使用する** - クライアントサイドのバッチ処理が現実的でないシナリオ、例えば数百または数千の単機能エージェントがログ、メトリクス、トレースなどを送信する観測ユースケースでは、問題や異常を迅速に検出するためにリアルタイムのデータ転送が重要な場合があります。さらに、観測システムのイベントスパイクにより、観測データをクライアントサイドでバッファリングしようとするときに大規模なメモリスパイクや関連する問題が発生するリスクがあります。大きなバッチを挿入できない場合、ユーザーはClickHouseに[非同期挿入](/ja/cloud/bestpractices/asynchronous-inserts)を使用してバッチ処理を委任できます。非同期挿入では、データはまずバッファに挿入され、その後データベースストレージに書き込まれるか、非同期で書き込まれます。 + +
+ + NEEDS ALT + +
+ + 非同期挿入が有効化されているとき、ClickHouseが (1) 挿入クエリを受け取ると、クエリのデータは (2) まずメモリ内バッファに直ちに書き込まれます。 (1) に非同期で、 (3) 次のバッファフラッシュが行われたときのみ、バッファのデータはソートされてデータベースストレージの一部として書き込まれます。注意点として、バッファがデータベースストレージにフラッシュされる前は、クエリでデータを検索することはできません。バッファフラッシュは設定可能です。 + + バッファがフラッシュされる前に、同じまたは他のクライアントからの他の非同期挿入クエリのデータがバッファに収集される可能性があります。バッファフラッシュから作成されたパートには、複数の非同期挿入クエリからのデータが含まれる可能性があります。通常、これらのメカニズムはクライアントサイドからサーバーサイド(ClickHouseインスタンス)へのデータバッチシフトとなります。 + + 非同期挿入の設定に関する完全な詳細は[こちら](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)で確認でき、より深い情報は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)で確認できます。 + +- **公式クライアントを使用する** - ClickHouseは最も人気のあるプログラミング言語でのクライアントを持っています。これらは、挿入が正しく実行されることを保証するように最適化されており、直接またはクエリ、ユーザー、接続レベル設定での有効化により非同期挿入をネイティブにサポートします(例: [Goクライアント](/ja/integrations/go#async-insert))。 +- **ネイティブフォーマットの推奨** - ClickHouseは挿入(およびクエリ)時に多くの[入力フォーマット](/ja/interfaces/formats)をサポートしています。これはOLTPデータベースとの大きな違いであり、テーブル関数と連携した外部ソースからのデータ読み込みがより簡単になり、ディスク上のファイルからのデータロードの能力も含まれています。これらのフォーマットはアドホックなデータロードとデータエンジニアリング作業に理想的です。最適な挿入パフォーマンスを達成したいアプリケーションの場合、ユーザーはネイティブフォーマットで挿入するべきです。これはほとんどのクライアント(GoとPython)でサポートされており、サーバーが最小限の作業を必要とするため、最適な選択です。このフォーマットはすでに列指向なので、列指向データをクライアントが生成する必要はなく、インサートをスケールさせる取り組みにおいて考慮されるべきです。代替として、ユーザーは[RowBinaryフォーマット](/ja/interfaces/formats#rowbinary)(Javaクライアントで使用)の利用を検討できます。ネイティブフォーマットに比べて、書くのが通常より容易な行フォーマットです。JSONのような他の行フォーマットに比べて、圧縮、ネットワークオーバーヘッド、サーバーでの処理においてより効率的です。低い書き込みスループットのユーザーで迅速に統合したい場合は、JSONEachRowフォーマットを利用することもできます。このフォーマットには、ClickHouse内での解析にCPUオーバーヘッドがかかることをユーザーは認識しておく必要があります。 + +- **HTTPまたはネイティブプロトコル** - 多くの伝統的なデータベースとは異なり、ClickHouseはHTTPインターフェースをサポートしています。ユーザーはこれを使用して、上記のフォーマットのいずれかでデータを挿入およびクエリできます。これは、トラフィックをロードバランサで簡単に切り替えることができるため、ClickHouseのネイティブプロトコルよりも好まれることがあります。ネイティブプロトコルでの挿入パフォーマンスには若干の違いが予想され、多少のオーバーヘッドが軽減されます。既存のクライアントはこれらのプロトコルのいずれか(または両方、例: Goクライアント)を使用します。ネイティブプロトコルはクエリの進行を簡単に追跡することを可能にします。 + +## 大量データのロード + +Postgresから大量データをロードするためにユーザーは以下を使用できます: +- `PeerDB by ClickHouse`を使用する。これはPostgreSQLデータベースのレプリケーションを自社ホスト型ClickHouseおよびClickHouse Cloudに対して実行するために特別に設計されたETLツールです。開始するには[PeerDB Cloud](https://www.peerdb.io/)でアカウントを作成し、セットアップ手順については[ドキュメント](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)を参照してください。 +- 過去の例で示したように、データを直接読み取るPostgresテーブル関数を使用する。通常は既知のウォーターマーク、例: タイムスタンプに基づくバッチレプリケーションに適しているか、ワンオフ移行の場合です。このアプローチは数千万行にスケールできます。より大きなデータセットを移行したいユーザーは、データのチャンクを扱う複数のリクエストを検討すべきです。各チャンクにはそのパーティションが最終テーブルに移動する前にステージングテーブルを使用できます。失敗したリクエストを再試行することが可能になります。この大量ロード戦略の詳細については、こちらを参照してください。 +- データをCSVフォーマットでPostgresからエクスポートできます。その後、ローカルファイルまたはオブジェクトストレージを介してテーブル関数を使用してClickHouseに挿入することができます。 + +:::note 大量データセットの挿入に関するお手伝いが必要ですか? +大きなデータセットの挿入時に助けが必要な場合や、ClickHouse Cloudにデータをインポートする際にエラーが発生した場合は、support@clickhouse.com までご連絡ください。サポートいたします。 +::: diff --git a/docs/ja/guides/joining-tables.md b/docs/ja/guides/joining-tables.md new file mode 100644 index 00000000000..6a26b4800db --- /dev/null +++ b/docs/ja/guides/joining-tables.md @@ -0,0 +1,204 @@ +--- +title: ClickHouseでのJOINの使用 +description: ClickHouseでテーブルを結合する方法 +keywords: [joins, join tables] +--- + +ClickHouseは、多様な結合アルゴリズムを備えた[フルの`JOIN`サポート](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)を提供しています。パフォーマンスを最大限に引き出すために、このガイドに記載されているJOINの最適化の提案に従うことを推奨します。 + +- 最適なパフォーマンスを得るには、特にリアルタイムの分析ワークロードにおいて、クエリでの`JOIN`の数を削減することを目指すべきです。クエリ内のJOINは最大3から4までに制限してください。[データモデリングセクション](/ja/data-modeling/schema-design)では、正規化解除、Dictionary、マテリアライズドビューなど、JOINを最小化するためのいくつかの変更について詳しく説明しています。 +- 現在、ClickHouseはJOINの順序を変更しません。常に最小のテーブルをJOINの右側に配置することを確認してください。ほとんどの結合アルゴリズムではこれがメモリに保持され、クエリのメモリオーバーヘッドを最低限に抑えます。 +- クエリが直接のJOINを必要とする場合、つまり`LEFT ANY JOIN`のような場合は、可能であれば[Dictionary](/ja/dictionary)を使用することをお勧めします。 + +
+ +NEEDS ALT + +
+ +- INNER JOINを実行する場合、これらを`IN`句を使用したサブクエリとして書くことがしばしばより最適です。以下のクエリを考えてみましょう。これらは機能的には同等で、両方とも質問にClickHouseが言及されていないが、`comments`には言及されている`posts`の数を見つけます。 + +```sql +SELECT count() +FROM stackoverflow.posts AS p +ANY INNER `JOIN` stackoverflow.comments AS c ON p.Id = c.PostId +WHERE (p.Title != '') AND (p.Title NOT ILIKE '%clickhouse%') AND (p.Body NOT ILIKE '%clickhouse%') AND (c.Text ILIKE '%clickhouse%') + +┌─count()─┐ +│ 86 │ +└─────────┘ + +1 row in set. Elapsed: 8.209 sec. Processed 150.20 million rows, 56.05 GB (18.30 million rows/s., 6.83 GB/s.) +Peak memory usage: 1.23 GiB. +``` + +注意すべきは、直積を避けるため`ANY INNER JOIN`を使用していることであり、つまり各ポストに対して1つの一致のみを望んでいます。 + +このJOINはサブクエリを使用して書き直すことで、パフォーマンスが大幅に向上します。 + +```sql +SELECT count() +FROM stackoverflow.posts +WHERE (Title != '') AND (Title NOT ILIKE '%clickhouse%') AND (Body NOT ILIKE '%clickhouse%') AND (Id IN ( + SELECT PostId + FROM stackoverflow.comments + WHERE Text ILIKE '%clickhouse%' +)) +┌─count()─┐ +│ 86 │ +└─────────┘ + +1 row in set. Elapsed: 2.284 sec. Processed 150.20 million rows, 16.61 GB (65.76 million rows/s., 7.27 GB/s.) +Peak memory usage: 323.52 MiB. +``` + +ClickHouseはすべてのJOIN句やサブクエリに条件を適用しようとしますが、可能であれば常に条件を手動ですべてのサブ句に適用し、`JOIN`するデータのサイズを最小化することをお勧めします。以下の例を考えてみましょう。ここでは、2020年以降のJava関連の投稿についてのアップボート数を計算したいと考えています。 + +大きなテーブルを左側に配置した素朴なクエリは56秒で完了します。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.posts AS p +INNER JOIN stackoverflow.votes AS v ON p.Id = v.PostId +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 56.642 sec. Processed 252.30 million rows, 1.62 GB (4.45 million rows/s., 28.60 MB/s.) +``` + +JOINを再配置することでパフォーマンスが劇的に改善され、1.5秒になりました。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.votes AS v +INNER JOIN stackoverflow.posts AS p ON v.PostId = p.Id +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 1.519 sec. Processed 252.30 million rows, 1.62 GB (166.06 million rows/s., 1.07 GB/s.) +``` + +右側のテーブルにフィルタを追加することで、パフォーマンスがさらに向上し、0.5秒になりました。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.votes AS v +INNER JOIN stackoverflow.posts AS p ON v.PostId = p.Id +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') AND (v.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 0.597 sec. Processed 81.14 million rows, 1.31 GB (135.82 million rows/s., 2.19 GB/s.) +Peak memory usage: 249.42 MiB. +``` + +このクエリは前述のように`INNER JOIN`をサブクエリに移動し、外側および内側のクエリにフィルタを維持することでさらに改善できます。 + +```sql +SELECT count() AS upvotes +FROM stackoverflow.votes +WHERE (VoteTypeId = 2) AND (PostId IN ( + SELECT Id + FROM stackoverflow.posts + WHERE (CreationDate >= '2020-01-01') AND has(arrayFilter(t -> (t != ''), splitByChar('|', Tags)), 'java') +)) + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 0.383 sec. Processed 99.64 million rows, 804.55 MB (259.85 million rows/s., 2.10 GB/s.) +Peak memory usage: 250.66 MiB. +``` + +## JOINアルゴリズムの選択 + +ClickHouseは、いくつかの[joinアルゴリズム](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をサポートしています。これらのアルゴリズムは通常、メモリ使用量とパフォーマンスをトレードオフします。以下は、メモリ消費と実行時間に基づくClickHouse joinアルゴリズムの概要です: + +
+ +NEEDS ALT + +
+ +これらのアルゴリズムは、JOINクエリの計画と実行方法を決定します。デフォルトでは、ClickHouseは使用されたJOINタイプおよび結合テーブルのエンジンに基づいて直接またはハッシュJOINアルゴリズムを使用します。代わりに、ClickHouseを設定して、リソースの可用性と使用量に応じてランタイムで使用するJOINアルゴリズムを柔軟に選択し、動的に変更することもできます:`join_algorithm=auto`の場合、ClickHouseは最初にハッシュJOINアルゴリズムを試し、そのアルゴリズムのメモリ制限が超えた場合、そのアルゴリズムを部分マージJOINに即座に切り替えます。選択されたアルゴリズムをトレースログで観察することができます。ClickHouseはまた、`join_algorithm`設定を介してユーザーが希望のJOINアルゴリズムを自分で指定することも許可しています。 + +各JOINアルゴリズムのサポートされている`JOIN`タイプは以下に示されており、最適化を考慮する前に考慮するべきです: + +
+ +NEEDS ALT + +
+ +各`JOIN`アルゴリズムの詳細な説明、利点、欠点、スケーリング特性については[こちら](https://clickhouse.com/blog/clickhouse-fully-supports-joins-hash-joins-part2)で見つけることができます。 + +適切なJOINアルゴリズムの選択は、メモリの最適化を行うかパフォーマンスを最適化するかによります。 + +## JOINパフォーマンスの最適化 + +主要な最適化指標がパフォーマンスであり、JOINを可能な限り早く実行したい場合は、以下の意思決定ツリーを使用して適切なJOINアルゴリズムを選択できます: + +
+ +NEEDS ALT + +
+ +- **(1)** 右側のテーブルからのデータがメモリ内の低レイテンシのキー・バリューデータ構造、例えばDictionaryに事前ロードでき、JOINキーが基礎となるキー・バリューのストレージのキー属性に一致し、`LEFT ANY JOIN`のセマンティクスで十分である場合、**直接JOIN**が適用可能であり、最速のアプローチを提供します。 + +- **(2)** テーブルの[物理的な行順序](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)がJOINキーのソート順に一致する場合、この場合、**フルソートマージJOIN**はソートフェーズを[スキップ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3#utilizing-physical-row-order)し、メモリ消費を大幅に削減し、データサイズやJOINキー値の分布に応じて、一部のハッシュJOINアルゴリズムよりも速い実行時間を持ちます。 + +- **(3)** 右テーブルがメモリに収まる場合、追加のメモリ使用量のオーバーヘッドがあっても、**並列ハッシュJOIN**はこのアルゴリズムまたはハッシュJOINがより速い可能性があります。これはデータサイズ、データ型、およびJOINキーの値の分布に依存します。 + +- **(4)** 右テーブルがメモリに収まらない場合、それは再び依存します。ClickHouseは3つのメモリ非依存のJOINアルゴリズムを提供しています。すべてが一時的にデータをディスクにスピルします。**フルソートマージJOIN**および**部分マージJOIN**は、データの事前ソートを必要とします。**グレースハッシュJOIN**は、代わりにデータからハッシュテーブルを構築します。データ量、データ型、JOINキーの値の分布に基づいて、データをソートするよりも、データからハッシュテーブルを構築する方が速いシナリオ、またその逆のシナリオがあります。 + +部分マージJOINは、大きなテーブルを結合する際にメモリ使用量を最小化するよう最適化されており、JOIN速度が非常に遅い代償としてあります。これは特に、左テーブルの物理的な行順序がJOINキーのソート順と一致しない場合に顕著です。 + +グレースハッシュJOINは、3つのメモリ非依存のJOINアルゴリズムの中で最も柔軟であり、[grace_hash_join_initial_buckets](https://github.com/ClickHouse/ClickHouse/blob/23.5/src/Core/Settings.h#L759)設定を使用してメモリ使用量とJOIN速度を良好に制御できます。データ量に応じて、グレースハッシュが部分マージアルゴリズムよりも速いまたは遅い場合があります。両方のアルゴリズムのメモリ使用量がほぼ一致するように選択されたバケツ数の場合です。メモリ使用量が完全ソートマージとほぼ一致するようにグレースハッシュJOINのメモリ使用量を構成すると、完全ソートマージがテストランでは常に速かったです。 + +メモリ非依存の3つのアルゴリズムのうち、どれが最速かは、データの量、データ型、JOINキーの値の分布に依存します。現実的なデータ量で現実的なデータを使用してベンチマークを行い、どのアルゴリズムが最速かを判断するのが最良です。 + +## メモリの最適化 + +JOINを最速ではなく最も低いメモリ使用量で最適化したい場合は、代わりに以下の意思決定ツリーを使用できます: + +
+ +NEEDS ALT + +
+ +- **(1)** テーブルの物理的な行順序がJOINキーのソート順に一致する場合、**フルソートマージJOIN**のメモリ使用量は、これ以上低くはなりません。加えて、ソートフェーズが[無効](https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3#utilizing-physical-row-order)になっているため、良好なJOIN速度の利点があります。 +- **(2)** **グレースハッシュJOIN**は[JOIN速度](https://github.com/ClickHouse/ClickHouse/blob/23.5/src/Core/Settings.h#L759)の犠牲にして、高い[バケット数](https://clickhouse.com/blog/clickhouse-fully-supports-joins-hash-joins-part2#description-2)を構成することで、非常に低いメモリ使用に調整できます。**部分マージJOIN**は、意図的にメインメモリの使用を低くします。**フルソートマージJOIN**は、外部ソートが有効になっている場合は通常、部分マージJOINよりも多くのメモリを使用しますが、それにより大幅に良好なJOIN実行時間の利点があります。 + +上記の詳細についてさらなる情報が必要なユーザには、この[ブログシリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をお勧めします。 + diff --git a/docs/ja/guides/separation-storage-compute.md b/docs/ja/guides/separation-storage-compute.md new file mode 100644 index 00000000000..085807ce952 --- /dev/null +++ b/docs/ja/guides/separation-storage-compute.md @@ -0,0 +1,171 @@ +--- +sidebar_position: 1 +sidebar_label: ストレージとコンピュートの分離 +slug: /ja/guides/separation-storage-compute +--- +import BucketDetails from '@site/docs/ja/_snippets/_S3_authentication_and_bucket.md'; + +# ストレージとコンピュートの分離 + +## 概要 + +このガイドは、ClickHouseとS3を使用して、ストレージとコンピュートを分離したアーキテクチャを実装する方法を探ります。 + +ストレージとコンピュートの分離とは、コンピューティングリソースとストレージリソースを独立して管理することを意味します。ClickHouseでは、スケーラビリティ、コスト効率、柔軟性を向上させることができます。必要に応じてストレージとコンピュートリソースを別々にスケールし、パフォーマンスとコストを最適化できます。 + +ClickHouseにS3をバックエンドとして使用することは、特に「コールド」データのクエリパフォーマンスがあまり重要でないユースケースにおいて有用です。ClickHouseは`S3BackedMergeTree`を使用して、`MergeTree`エンジンのストレージとしてS3をサポートします。このテーブルエンジンは、S3のスケーラビリティとコストの利点を活用しながら、`MergeTree`エンジンのインサートとクエリのパフォーマンスを維持することができます。 + +ストレージとコンピュートの分離アーキテクチャの実装と管理は、標準のClickHouseデプロイと比較してより複雑であることに注意してください。このガイドで説明するように、セルフマネージド型のClickHouseはストレージとコンピュートの分離を可能にしますが、設定なしでこのアーキテクチャを使用できる[ClickHouse Cloud](https://clickhouse.com/cloud)の利用をお勧めします。これには[`SharedMergeTree`テーブルエンジン](/ja/cloud/reference/shared-merge-tree)を使用してください。 + +*このガイドは、ClickHouseバージョン22.8以上を使用していることを前提としています。* + +:::warning +AWS/GCSライフサイクルポリシーを設定しないでください。これはサポートされておらず、テーブルが破損する可能性があります。 +::: + +## 1. ClickHouseディスクとしてS3を使用する + +### ディスクの作成 + +ストレージ構成を保存するためにClickHouseの`config.d`ディレクトリに新しいファイルを作成します: + +```bash +vim /etc/clickhouse-server/config.d/storage_config.xml +``` + +次のXMLを新しく作成したファイルにコピーし、データを保存したいAWSのバケット詳細に応じて`BUCKET`、`ACCESS_KEY_ID`、`SECRET_ACCESS_KEY`を置き換えます: + +```xml + + + + + s3 + $BUCKET + $ACCESS_KEY_ID + $SECRET_ACCESS_KEY + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` + +S3ディスクの設定をさらに詳細に指定する必要がある場合、例えば`region`を指定したりカスタムHTTP`header`を送信したりする必要がある場合は、関連する設定の一覧を[こちら](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)で確認できます。 + +また、`access_key_id`と`secret_access_key`を以下に置き換えることで、環境変数やAmazon EC2メタデータから資格情報を取得しようとすることもできます: + +```bash +true +``` + +設定ファイルを作成した後、ファイルの所有者をclickhouseユーザーとグループに更新する必要があります: + +```bash +chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml +``` + +クリックハウスサーバーを再起動して変更を適用することができます: + +```bash +service clickhouse-server restart +``` + +## 2. S3をバックエンドにしたテーブルを作成 + +S3ディスクが正しく設定されていることをテストするために、テーブルを作成してクエリを試みます。 + +新しいS3ストレージポリシーを指定してテーブルを作成します: + +```sql +CREATE TABLE my_s3_table + ( + `id` UInt64, + `column1` String + ) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main'; +``` + +エンジンを`S3BackedMergeTree`として指定する必要がないことを注意してください。ClickHouseは、テーブルがストレージにS3を使用していると検出すると、エンジンタイプを内部的に自動で変換します。 + +テーブルが正しいポリシーで作成されたことを確認します: + +```sql +SHOW CREATE TABLE my_s3_table; +``` + +次の結果が表示されるはずです: + +```response +┌─statement──────────────────────────────────────────────────── +│ CREATE TABLE default.my_s3_table +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main', index_granularity = 8192 +└────────────────────────────────────────────────────────────── +``` + +新しいテーブルに行を挿入しましょう: + +```sql +INSERT INTO my_s3_table (id, column1) + VALUES (1, 'abc'), (2, 'xyz'); +``` + +行が挿入されたことを確認しましょう: + +```sql +SELECT * FROM my_s3_table; +``` + +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +│ 2 │ xyz │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.284 sec. +``` + +AWSコンソールにて、データがS3に正常に挿入された場合、指定されたバケットにClickHouseが新しいファイルを作成したことが確認できるはずです。 + +すべてが正常に動作した場合、ストレージとコンピュートが分離された状態でClickHouseを使用していることになります! + +![コンピュートとストレージの分離を使ったS3バケットの例](./images/s3_bucket_example.png) + +## 3. フォールトトレランスのためのレプリケーションの実装 (オプション) + +:::warning +AWS/GCSライフサイクルポリシーを設定しないでください。これはサポートされておらず、テーブルが破損する可能性があります。 +::: + +フォールトトレランスを確保するために、複数のAWSリージョンに分散された複数のClickHouseサーバーノードと、それぞれのノードに対するS3バケットを使用することができます。 + +S3ディスクを用いたレプリケーションは、`ReplicatedMergeTree`テーブルエンジンを使用することで実現できます。詳細は次のガイドを参照してください: +- [S3オブジェクトストレージを使用した2つのAWSリージョン間での単一シャードのレプリケーション](/ja/integrations/s3#s3-multi-region). + +## 参考文献 + +- [SharedMergeTreeテーブルエンジン](/ja/cloud/reference/shared-merge-tree) +- [SharedMergeTree発表ブログ](https://clickhouse.com/blog/clickhouse-cloud-boosts-performance-with-sharedmergetree-and-lightweight-updates) diff --git a/docs/ja/guides/sizing-and-hardware-recommendations.md b/docs/ja/guides/sizing-and-hardware-recommendations.md new file mode 100644 index 00000000000..c34fb069173 --- /dev/null +++ b/docs/ja/guides/sizing-and-hardware-recommendations.md @@ -0,0 +1,223 @@ +--- +slug: /ja/guides/sizing-and-hardware-recommendations +sidebar_label: サイズおよびハードウェアの推奨事項 +sidebar_position: 4 +--- + +# サイズおよびハードウェアの推奨事項 + +このガイドでは、オープンソースユーザー向けのハードウェア、コンピュート、メモリ、およびディスク構成に関する一般的な推奨事項について説明します。セットアップを簡略化したい場合は、[ClickHouse Cloud](https://clickhouse.com/cloud) の使用をお勧めします。これは、インフラ管理に関連するコストを最小限に抑えつつ、ワークロードに自動的に対応し、スケールします。 + +ClickHouse クラスターの構成は、お客様のアプリケーションのユースケースやワークロードパターンによって大きく異なります。アーキテクチャを計画する際には、以下の要因を考慮する必要があります。 + +- 同時実行性(リクエスト数/秒) +- スループット(処理される行数/秒) +- データ量 +- データ保持ポリシー +- ハードウェアコスト +- メンテナンスコスト + +## ディスク + +ClickHouse で使用するディスクの種類は、データ量、レイテンシー、スループットの要件によって異なります。 + +### パフォーマンスを最適化する + +パフォーマンスを最大化するために、[AWS のプロビジョンドIOPS SSDボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/provisioned-iops.html) またはクラウドプロバイダーの同等の提供を直接接続することをお勧めします。これはIOを最適化します。 + +### ストレージコストを最適化する + +コストを抑えるために、[汎用SSD EBSボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/general-purpose.html)を使用できます。また、[ホット/ウォーム/コールドアーキテクチャ](/ja/guides/developer/ttl#implementing-a-hotwarmcold-architecture)を使用してSSDとHDDを組み合わせた階層型ストレージを実装することもできます。また、ストレージを分離するために[AWS S3](https://aws.amazon.com/s3/)を使用することも可能です。コンピュートとストレージの分離でオープンソースのClickHouseを使用するためのガイドは[こちら](/ja/guides/separation-storage-compute)をご覧ください。ClickHouse Cloud ではデフォルトでコンピュートとストレージの分離が利用可能です。 + +## CPU + +### どの CPU を使用すべきか? + +使用する CPU の種類は、使用パターンに依存します。ただし、一般的に、多くの頻繁な同時実行クエリを処理し、より多くのデータを処理する、または計算集約的な UDF を使用するアプリケーションは、より多くの CPU コアを必要とします。 + +**低レイテンシまたは顧客向けアプリケーション** + +顧客向けワークロードのように10ミリ秒単位の低レイテンシ要件に対しては、AWS の [i3 ライン](https://aws.amazon.com/ec2/instance-types/i3/) または [i4i ライン](https://aws.amazon.com/ec2/instance-types/i4i/) またはクラウドプロバイダーの同等のIO最適化された提供をお勧めします。 + +**高同時実行性アプリケーション** + +同時実行性を最適化する必要があるワークロード(1秒あたり100以上のクエリ)に対しては、AWS の[計算最適化されたCシリーズ](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized) またはクラウドプロバイダーの同等の提供をお勧めします。 + +**データウェアハウジングユースケース** + +データウェアハウジングワークロードやアドホック分析クエリに対しては、AWS の [Rタイプシリーズ](https://aws.amazon.com/ec2/instance-types/#Memory_Optimized) 又はクラウドプロバイダーのメモリ最適化された提供をお勧めします。 + +--- + +### CPU 利用率はどの程度にすべきか? + +ClickHouse に標準的な CPU 利用率の目標はありません。[iostat](https://linux.die.net/man/1/iostat) などのツールを利用して平均の CPU 使用率を測定し、予期しないトラフィックの急増を管理できるようにサーバーのサイズを調整します。ただし、アドホッククエリを伴う分析またはデータウェアハウジングユースケースの場合、10-20% の CPU 利用率を目標とすべきです。 + +### 何 CPU コア使うべきか? + +使用する CPU 数はワークロードに依存します。しかし、一般的に、CPU の種類に基づいて以下のメモリ対 CPU コア比を推奨します。 + +- **[Mタイプ](https://aws.amazon.com/ec2/instance-types/)(一般的な利用ケース):** メモリ対 CPU コア比 4:1 +- **[Rタイプ](https://aws.amazon.com/ec2/instance-types/#Memory_Optimized)(データウェアハウジングユースケース):** メモリ対 CPU コア比 8:1 +- **[Cタイプ](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized)(計算最適化ユースケース):** メモリ対 CPU コア比 2:1 + +具体例として、Mタイプの CPU を使用する場合は、25 CPU コアあたり 100GB のメモリをプロビジョニングすることをお勧めします。適切なメモリ量を決定するには、メモリ使用量をプロファイリングする必要があります。[メモリ問題のデバッグに関するガイド](https://clickhouse.com/docs/ja/guides/developer/debugging-memory-issues)を読むか、[組み込みのオブザーバビリティダッシュボード](https://clickhouse.com/docs/ja/operations/monitoring)を使用して ClickHouse を監視できます。 + +## メモリ + +CPU の選択と同様に、ストレージ対メモリの比率やメモリ対 CPU の比率の選択はユースケースに依存します。ただし、一般的にはメモリが多いほどクエリは高速になります。価格に敏感なユースケースの場合、低メモリ量でも動作しますが、設定を有効にすることができます([max_bytes_before_external_group_by](/ja/operations/settings/query-complexity#settings-max_bytes_before_external_group_by) や [max_bytes_before_external_sort](/ja/operations/settings/query-complexity#settings-max_bytes_before_external_sort))。これによりデータをディスクにスピルすることが許可されますが、クエリパフォーマンスに大きな影響を与える可能性があります。 + +### メモリ対ストレージ比はどの程度にすべきか? + +低データ量の場合、1:1 のメモリ対ストレージ比が許容されますが、合計メモリは8GB未満にしてはいけません。 + +長期間のデータ保持や高データ量のユースケースの場合、1:100 から 1:130 のメモリ対ストレージ比を推奨します。例えば、10TB のデータを保存している場合、レプリカあたり 100GB の RAM が良い例です。 + +顧客向けワークロードのように頻繁にアクセスされるユースケースには、より多くのメモリを使用し、1:30 から 1:50 のメモリ対ストレージ比を推奨します。 + +## レプリカ + +各シャードに少なくとも3つのレプリカを持つことを推奨します(または [Amazon EBS](https://aws.amazon.com/ebs/) を使用した 2 つのレプリカ)。さらに、追加のレプリカを追加する前にすべてのレプリカを垂直スケーリングすることを提案します(水平スケーリング)。 + +ClickHouse は自動的にシャーディングを行わないため、データセットの再シャーディングには多大なコンピューティングリソースが必要になります。したがって、将来的にデータを再シャーディングする必要を避けるため、可能な限り大きなサーバーを使用することを一般的に推奨します。 + +[ClickHouse Cloud](https://clickhouse.com/cloud) を使用することを検討してください。これは自動的にスケールし、ユースケースに合わせてレプリカの数を簡単に制御できます。 + +## 大規模ワークロードの例示的な構成 + +ClickHouse の構成は、特定のアプリケーションの要件に大きく依存します。コストとパフォーマンスを最適化するための支援を希望される場合は、[営業までお問い合わせください](https://clickhouse.com/company/contact?loc=docs-sizing-and-hardware-recommendations)。 + +ガイダンス(推奨ではありません)を提供するために、以下は本番環境での ClickHouse ユーザーの例示的な構成です。 + +### Fortune 500 B2B SaaS + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ストレージ
月間新規データ量30TB
総ストレージ(圧縮)540TB
データ保持18ヶ月
ノードあたりのディスク25TB
CPU
同時実行性200以上の同時クエリ
レプリカ数(HAペアを含む)44
ノードあたりの vCPU62
総 vCPU2700
メモリ
総 RAM11TB
レプリカあたりの RAM256GB
RAM 対 vCPU 比率4:1
RAM 対ディスク比率1:50
+ +### Fortune 500 テレコムオペレーターのログユースケース + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ストレージ
月間ログデータ量4860TB
総ストレージ(圧縮)608TB
データ保持30日
ノードあたりのディスク13TB
CPU
レプリカ数(HAペアを含む)38
ノードあたりの vCPU42
総 vCPU1600
メモリ
総 RAM10TB
レプリカあたりの RAM256GB
RAM 対 vCPU 比率6:1
RAM 対ディスク比率1:60
+ +## さらなる読み物 + +以下は、オープンソースの ClickHouse を使用する企業のアーキテクチャに関するブログ記事です。 + +- [Cloudflare](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/?utm_source=linkedin&utm_medium=social&utm_campaign=blog) +- [eBay](https://innovation.ebayinc.com/tech/engineering/ou-online-analytical-processing/) +- [GitLab](https://handbook.gitlab.com/handbook/engineering/development/ops/monitor/observability/#clickhouse-datastore) +- [Lyft](https://eng.lyft.com/druid-deprecation-and-clickhouse-adoption-at-lyft-120af37651fd) +- [MessageBird](https://clickhouse.com/blog/how-messagebird-uses-clickhouse-to-monitor-the-delivery-of-billions-of-messages) +- [Microsoft](https://clickhouse.com/blog/self-service-data-analytics-for-microsofts-biggest-web-properties) +- [Uber](https://www.uber.com/en-ES/blog/logging/) +- [Zomato](https://blog.zomato.com/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) diff --git a/docs/ja/guides/sre/_category_.yml b/docs/ja/guides/sre/_category_.yml new file mode 100644 index 00000000000..6804e31fe37 --- /dev/null +++ b/docs/ja/guides/sre/_category_.yml @@ -0,0 +1,8 @@ +position: 5 +label: 'SRE Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: SRE Guides + slug: /ja/guides/sre diff --git a/docs/ja/guides/sre/configuring-ssl.md b/docs/ja/guides/sre/configuring-ssl.md new file mode 100644 index 00000000000..d0304f4d08e --- /dev/null +++ b/docs/ja/guides/sre/configuring-ssl.md @@ -0,0 +1,502 @@ +--- +slug: /ja/guides/sre/configuring-ssl +sidebar_label: SSL-TLSの設定 +sidebar_position: 20 +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + +# SSL-TLSの設定 + + + +このガイドでは、ClickHouseをOpenSSL証明書を使用して接続を検証するための簡単で最小限の設定を提供します。このデモンストレーションでは、自己署名の証明局 (CA) 証明書とキーを作成し、適切な設定でノード証明書を使用して接続を行います。 + +:::note +TLSの実装は複雑であり、完全に安全で堅牢なデプロイメントを確保するためには多くのオプションを考慮する必要があります。これは基本的なSSL/TLSの設定例を含むチュートリアルです。組織内で正しい証明書を生成するためにPKI/セキュリティチームに相談してください。 + +証明書の使用については、この[基本的なチュートリアル](https://ubuntu.com/server/docs/security-certificates)を参照してください。 +::: + +## 1. ClickHouse デプロイメントを作成する + +このガイドは、Ubuntu 20.04およびDEBパッケージ(aptを使用)を使用してインストールされたClickHouseを以下のホスト上で使用する形で書かれています。ドメインは `marsnet.local` です: + +|ホスト |IPアドレス| +|--------|-------------| +|chnode1 |192.168.1.221| +|chnode2 |192.168.1.222| +|chnode3 |192.168.1.223| + + +:::note +ClickHouseのインストール方法の詳細については、[クイックスタート](/docs/ja/getting-started/install.md)を参照してください。 +::: + + +## 2. SSL 証明書を作成する +:::note +自己署名証明書はデモンストレーション目的のみで使用され、実運用環境では使用しないでください。証明書要求は、組織によって署名され、設定で構成されるCAチェーンを使用して検証されるべきです。ただし、これらの手順は設定を構成およびテストするためのものであり、その後実際に使用される証明書に置き換えることができます。 +::: + +1. 新しいCAに使用するキーを生成します: + ```bash + openssl genrsa -out marsnet_ca.key 2048 + ``` + +2. 新しい自己署名CA証明書を生成します。以下のコマンドは、CAキーを使用して他の証明書を署名するために使用する新しい証明書を生成します: + ```bash + openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt + ``` + + :::note + キーとCA証明書はクラスタ外の安全な場所にバックアップしてください。ノード証明書の生成後、キーはクラスタノードから削除してください。 + ::: + +3. 新しいCA証明書の内容を確認します: + ```bash + openssl x509 -in marsnet_ca.crt -text + ``` + +4. 各ノードに証明書要求 (CSR) とキーを生成します: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1" -addext "subjectAltName = DNS:chnode1.marsnet.local,IP:192.168.1.221" -keyout chnode1.key -out chnode1.csr + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode2" -addext "subjectAltName = DNS:chnode2.marsnet.local,IP:192.168.1.222" -keyout chnode2.key -out chnode2.csr + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode3" -addext "subjectAltName = DNS:chnode3.marsnet.local,IP:192.168.1.223" -keyout chnode3.key -out chnode3.csr + ``` + +5. CSRとCAを使用して新しい証明書とキーのペアを作成します: + ```bash + openssl x509 -req -in chnode1.csr -out chnode1.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + openssl x509 -req -in chnode2.csr -out chnode2.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + openssl x509 -req -in chnode3.csr -out chnode3.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + ``` + +6. サブジェクトと発行者が正しいことを確認します: + ```bash + openssl x509 -in chnode1.crt -text -noout + ``` + +7. 新しい証明書がCA証明書と検証されることを確認します: + ```bash + openssl verify -CAfile marsnet_ca.crt chnode1.crt + chnode1.crt: OK + ``` + +## 3. 証明書およびキーを保存するディレクトリを作成および構成する + +:::note +これは各ノードで行う必要があります。適切な証明書およびキーを各ホストで使用してください。 +::: + +1. 各ノードでClickHouseがアクセス可能なディレクトリにフォルダを作成します。デフォルトの構成ディレクトリ(例: `/etc/clickhouse-server`)を推奨します: + ```bash + mkdir /etc/clickhouse-server/certs + ``` + +2. 各ノードに対応するCA証明書、ノード証明書、およびキーを新しい証明書ディレクトリにコピーします。 + +3. ClickHouseが証明書を読み取れるように所有者とパーミッションを更新します: + ```bash + chown clickhouse:clickhouse -R /etc/clickhouse-server/certs + chmod 600 /etc/clickhouse-server/certs/* + chmod 755 /etc/clickhouse-server/certs + ll /etc/clickhouse-server/certs + ``` + + ```response + total 20 + drw-r--r-- 2 clickhouse clickhouse 4096 Apr 12 20:23 ./ + drwx------ 5 clickhouse clickhouse 4096 Apr 12 20:23 ../ + -rw------- 1 clickhouse clickhouse 997 Apr 12 20:22 chnode1.crt + -rw------- 1 clickhouse clickhouse 1708 Apr 12 20:22 chnode1.key + -rw------- 1 clickhouse clickhouse 1131 Apr 12 20:23 marsnet_ca.crt + ``` + +## 4. ClickHouse Keeperを使用して基本的なクラスタを持つ環境を構成する + +このデプロイメント環境では、以下のClickHouse Keeper 設定を各ノードで使用します。各サーバーには独自の `` が設定されます。(例: ノード `chnode1` には `1` など) + +:::note +ClickHouse Keeper推奨ポートは `9281` です。ただし、このポートがすでに環境内の他のアプリケーションによって使用されている場合は、ポートを変更できます。 + +すべてのオプションの詳細については、次を参照してください: https://clickhouse.com/docs/ja/operations/clickhouse-keeper/ +::: + + +1. 次の設定をClickHouseサーバーの `config.xml` の `` タグ内に追加します + + :::note + 本番環境には、`config.d` ディレクトリに別の `.xml` 設定ファイルを使用することを推奨します。 + 詳細については、https://clickhouse.com/docs/ja/operations/configuration-files/ を参照してください。 + ::: + + ```xml + + 9281 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + true + + 1 + chnode1.marsnet.local + 9444 + + + 2 + chnode2.marsnet.local + 9444 + + + 3 + chnode3.marsnet.local + 9444 + + + + ``` + +2. すべてのノードでkeeper設定をコメント解除し、`` フラグを1に設定します: + ```xml + + + chnode1.marsnet.local + 9281 + 1 + + + chnode2.marsnet.local + 9281 + 1 + + + chnode3.marsnet.local + 9281 + 1 + + + ``` + +3. 以下のクラスタ設定を `chnode1` と `chnode2` に更新して追加します。 `chnode3` はClickHouse Keeperのクォーラムに使用されます。 + + :::note + この構成では、1つのサンプルクラスタのみが設定されています。テストサンプルのクラスタは削除するかコメントアウトする必要があります、またはテストされている既存のクラスタが存在する場合、それに対応するポートを更新し、`` オプションを追加する必要があります。また、`users.xml` ファイルやインストール時に `default` ユーザーにパスワードが設定されていた場合は、`` を設定する必要があります。 + ::: + + 以下の内容は、2つのサーバーに1つのシャードレプリカを持つクラスタを作成します。 + ```xml + + + + + chnode1.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + chnode2.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + + + ``` + +4. ReplicatedMergeTreeテーブルをテストするためにマクロ値を定義します。 `chnode1` では: + ```xml + + 1 + replica_1 + + ``` + + `chnode2` では: + ```xml + + 1 + replica_2 + + ``` + +## 5. ClickHouse ノード上でSSL-TLSインターフェースを設定する +以下の設定は、ClickHouseサーバーの `config.xml` に構成されています + +1. (オプション) デプロイメントの表示名を設定します: + ```xml + clickhouse + ``` + +2. ClickHouseが外部ポートでリッスンするように設定します: + ```xml + 0.0.0.0 + ``` + +3. 各ノードで `https` ポートを構成し、`http` ポートを無効にします: + ```xml + 8443 + + ``` + +4. 各ノードでClickHouse NativeのセキュアTCPポートを構成し、デフォルトの非セキュアポートを無効にします: + ```xml + 9440 + + ``` + +5. 各ノードで `interserver https` ポートを構成し、デフォルトの非セキュアポートを無効にします: + ```xml + 9010 + + ``` + +6. OpenSSLを証明書とパスで構成する + + :::note + 各ファイル名とパスは、設定されるノードに合わせて更新する必要があります。 + たとえば、`chnode2` ホストを構成する際には、`` エントリを `chnode2.crt` に更新します。 + ::: + + ```xml + + + /etc/clickhouse-server/certs/chnode1.crt + /etc/clickhouse-server/certs/chnode1.key + relaxed + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + + + false + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + relaxed + + RejectCertificateHandler + + + + ``` + + 詳細については、https://clickhouse.com/docs/ja/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl を参照してください。 + + + +7. 各ノードでSSL用にgRPCを設定する: + ```xml + + 1 + /etc/clickhouse-server/certs/chnode1.crt + /etc/clickhouse-server/certs/chnode1.key + true + /etc/clickhouse-server/certs/marsnet_ca.crt + none + 0 + -1 + -1 + false + + ``` + + 詳細については、https://clickhouse.com/docs/ja/interfaces/grpc/ を参照してください。 + +8. 少なくとも1つのノードで、接続をSSLで行うためにClickHouseクライアントを設定し、その自身の `config.xml`ファイルを使用して(デフォルトでは`/etc/clickhouse-client/`): + ```xml + + + false + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + + RejectCertificateHandler + + + + ``` + +6. MySQLおよびPostgreSQLのデフォルトエミュレーションポートを無効にする: + ```xml + + + ``` + +## 6. テスト +1. 各ノード別に一度に起動します: + ```bash + service clickhouse-server start + ``` + +2. セキュアポートが起動し、リスニングしていることを確認します。各ノードでこの例のようになります: + ```bash + root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcp + ``` + + ```response + tcp 0 0 0.0.0.0:9010 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:9440 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:9281 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 192.168.1.221:33046 192.168.1.222:9444 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:42730 192.168.1.223:9444 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:51952 192.168.1.222:9281 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:22 192.168.1.210:49801 ESTABLISHED keepalive (6618.05/0/0) + tcp 0 64 192.168.1.221:22 192.168.1.210:59195 ESTABLISHED on (0.24/0/0) + tcp6 0 0 :::22 :::* LISTEN off (0.00/0/0) + tcp6 0 0 :::9444 :::* LISTEN off (0.00/0/0) + tcp6 0 0 192.168.1.221:9444 192.168.1.222:59046 ESTABLISHED off (0.00/0/0) + tcp6 0 0 192.168.1.221:9444 192.168.1.223:41976 ESTABLISHED off (0.00/0/0) + ``` + + |ClickHouse ポート |説明| + |--------|-------------| + |8443 | https インターフェース| + |9010 | interserver https ポート| + |9281 | ClickHouse Keeper セキュアポート| + |9440 | セキュアNative TCPプロトコル| + |9444 | ClickHouse Keeper Raftポート | + +3. ClickHouse Keeperのヘルスを確認する +典型的な[4文字単語 (4lW)](/docs/ja/guides/sre/keeper/index.md#four-letter-word-commands) コマンドはTLSなしでは `echo` を使用して動作しません。ここでは、`openssl` を使用してコマンドを実行する方法を示します。 + - `openssl` でインタラクティブセッションを開始 + + ```bash + openssl s_client -connect chnode1.marsnet.local:9281 + ``` + ```response + CONNECTED(00000003) + depth=0 CN = chnode1 + verify error:num=20:unable to get local issuer certificate + verify return:1 + depth=0 CN = chnode1 + verify error:num=21:unable to verify the first certificate + verify return:1 + --- + Certificate chain + 0 s:CN = chnode1 + i:CN = marsnet.local CA + --- + Server certificate + -----BEGIN CERTIFICATE----- + MIICtDCCAZwCFD321grxU3G5pf6hjitf2u7vkusYMA0GCSqGSIb3DQEBCwUAMBsx + ... + ``` + + - opensslセッションで4LWコマンドを送信 + + ```bash + mntr + ``` + ```response + --- + Post-Handshake New Session Ticket arrived: + SSL-Session: + Protocol : TLSv1.3 + ... + read R BLOCK + zk_version v22.7.3.5-stable-e140b8b5f3a5b660b6b576747063fd040f583cf3 + zk_avg_latency 0 + # highlight-next-line + zk_max_latency 4087 + zk_min_latency 0 + zk_packets_received 4565774 + zk_packets_sent 4565773 + zk_num_alive_connections 2 + zk_outstanding_requests 0 + # highlight-next-line + zk_server_state leader + zk_znode_count 1087 + zk_watch_count 26 + zk_ephemerals_count 12 + zk_approximate_data_size 426062 + zk_key_arena_size 258048 + zk_latest_snapshot_size 0 + zk_open_file_descriptor_count 187 + zk_max_file_descriptor_count 18446744073709551615 + # highlight-next-line + zk_followers 2 + zk_synced_followers 1 + closed + ``` + +4. `--secure` フラグとSSLポートを使用してClickHouseクライアントを開始します: + ```bash + root@chnode1:/etc/clickhouse-server# clickhouse-client --user default --password ClickHouse123! --port 9440 --secure --host chnode1.marsnet.local + ClickHouse client version 22.3.3.44 (official build). + Connecting to chnode1.marsnet.local:9440 as user default. + Connected to ClickHouse server version 22.3.3 revision 54455. + + clickhouse :) + ``` + +5. `https` インターフェースを使用して `https://chnode1.marsnet.local:8443/play` でPlay UIにログインします。 + + ![Play UI](images/configuring-ssl_01.png) + + :::note + ワークステーションからアクセスしており、クライアントマシンのルートCAストアに証明書がない場合、ブラウザは不信召の証明書を表示します。 + 公共機関や企業CAから発行された証明書を使用している場合、信頼された状態で表示されるべきです。 + ::: + +6. レプリケートテーブルを作成します: + ```sql + clickhouse :) CREATE TABLE repl_table ON CLUSTER cluster_1S_2R + ( + id UInt64, + column1 Date, + column2 String + ) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/repl_table', '{replica}' ) + ORDER BY (id); + ``` + + ```response + ┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ + │ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ + │ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ + └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + ``` + +7. `chnode1` に2行追加します: + ```sql + INSERT INTO repl_table + (id, column1, column2) + VALUES + (1,'2022-04-01','abc'), + (2,'2022-04-02','def'); + ``` + +8. `chnode2` で行を閲覧することによってレプリケーションを確認します: + ```sql + SELECT * FROM repl_table + ``` + + ```response + ┌─id─┬────column1─┬─column2─┐ + │ 1 │ 2022-04-01 │ abc │ + │ 2 │ 2022-04-02 │ def │ + └────┴────────────┴─────────┘ + ``` + +## まとめ + +この記事は、ClickHouse環境がSSL/TLSで構成されるようにすることに焦点を当てています。生産環境の異なる要件に応じて設定は異なる場合があります(たとえば、証明書の検証レベル、プロトコル、暗号など)。しかし、セキュアな接続を構成し実施するために必要な手順を理解することができたはずです。 diff --git a/docs/ja/guides/sre/images/configuring-ssl_01.png b/docs/ja/guides/sre/images/configuring-ssl_01.png new file mode 100644 index 00000000000..89872675f12 Binary files /dev/null and b/docs/ja/guides/sre/images/configuring-ssl_01.png differ diff --git a/docs/ja/guides/sre/keeper/_category_.yml b/docs/ja/guides/sre/keeper/_category_.yml new file mode 100644 index 00000000000..9349d42f22e --- /dev/null +++ b/docs/ja/guides/sre/keeper/_category_.yml @@ -0,0 +1,8 @@ +position: 5 +label: 'ClickHouse Keeper' +collapsible: true +collapsed: true +link: + type: generated-index + title: ClickHouse Keeper + slug: /ja/guides/sre/clickhouse-keeper diff --git a/docs/ja/guides/sre/keeper/index.md b/docs/ja/guides/sre/keeper/index.md new file mode 100644 index 00000000000..c64ba889be3 --- /dev/null +++ b/docs/ja/guides/sre/keeper/index.md @@ -0,0 +1,1295 @@ +--- +slug: /ja/guides/sre/keeper/clickhouse-keeper + +sidebar_label: ClickHouse Keeperの設定 +sidebar_position: 10 +keywords: + - Keeper + - ZooKeeper + - clickhouse-keeper + - レプリケーション +description: ClickHouse Keeperまたはclickhouse-keeperは、ZooKeeperを置き換えるもので、レプリケーションと調整を提供します。 +--- + +# ClickHouse Keeper (clickhouse-keeper) + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + + + +ClickHouse Keeperは、データの[レプリケーション](/docs/ja/engines/table-engines/mergetree-family/replication.md)と[分散DDL](/docs/ja/sql-reference/distributed-ddl.md)クエリの実行を調整するシステムを提供します。ClickHouse KeeperはZooKeeperと互換性があります。 + +### 実装の詳細 {#implementation-details} + +ZooKeeperは、最初に知られるオープンソースの調整システムの1つです。Javaで実装されており、非常にシンプルで強力なデータモデルを持っています。ZooKeeperの調整アルゴリズム、ZooKeeper Atomic Broadcast (ZAB)は、各ZooKeeperノードがローカルに読み取りを行うため、読み取りに対する線形化可能性保証を提供しません。ZooKeeperとは異なり、ClickHouse KeeperはC++で書かれており、[RAFTアルゴリズム](https://raft.github.io/)の[実装](https://github.com/eBay/NuRaft)を使用しています。このアルゴリズムは読み書きに対する線形化可能性を許可し、さまざまな言語でオープンソースの実装があります。 + +デフォルトでは、ClickHouse KeeperはZooKeeperと同じ保証を提供します:線形化可能な書き込みと非線形化可能な読み取りです。クライアントサーバープロトコルは互換性があるため、任意の標準的なZooKeeperクライアントを使用してClickHouse Keeperと対話できます。スナップショットとログはZooKeeperとは互換性のない形式ですが、`clickhouse-keeper-converter`ツールを使用してZooKeeperデータをClickHouse Keeperスナップショットに変換できます。ClickHouse KeeperのインターサーバープロトコルもZooKeeperと互換性がないため、ZooKeeper / ClickHouse Keeperの混合クラスターは不可能です。 + +ClickHouse Keeperは、[ZooKeeper](https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl)と同じ方法でアクセス制御リスト(ACL)をサポートします。ClickHouse Keeperは、同じ権限セットをサポートし、`world`、`auth`、および`digest`の同一の組み込みスキームを持っています。ダイジェスト認証スキームは`username:password`ペアを使用し、パスワードはBase64でエンコードされます。 + +:::note +外部統合はサポートされていません。 +::: + +### 設定 {#configuration} + +ClickHouse Keeperは、ZooKeeperのスタンドアロンの代替品として、またはClickHouseサーバーの内部の一部として使用できます。いずれの場合も、設定はほぼ同じ`.xml`ファイルです。 + +#### Keeperの設定項目 + +ClickHouse Keeperの主な設定タグは``で、以下のパラメータがあります: + +| パラメータ | 説明 | デフォルト | +|--------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------| +| `tcp_port` | クライアントが接続するためのポート。 | `2181` | +| `tcp_port_secure` | クライアントとkeeperサーバー間のSSL接続のためのセキュアポート。 | - | +| `server_id` | ユニークなサーバーID。ClickHouse Keeperクラスターの各参加者は、1, 2, 3といったユニークな番号を持たなければなりません。 | - | +| `log_storage_path` | 調整ログの保存パス。ZooKeeperと同様に、ログはビジーでないノードに保存するのが最適です。 | - | +| `snapshot_storage_path` | 調整スナップショットの保存パス。 | - | +| `enable_reconfiguration` | [`reconfig`](#reconfiguration)を介した動的クラスター再設定を有効にします。 | `False` | +| `max_memory_usage_soft_limit` | Keeperの最大メモリ使用量のソフト制限(バイト単位)。 | `max_memory_usage_soft_limit_ratio` * `physical_memory_amount` | +| `max_memory_usage_soft_limit_ratio` | `max_memory_usage_soft_limit`が設定されていないか0に設定されている場合、この値を使用してデフォルトソフト制限を定義します。 | `0.9` | +| `cgroups_memory_observer_wait_time` | `max_memory_usage_soft_limit`が設定されていないか0に設定されている場合、物理メモリ量を監視するための間隔。このメモリ量が変化すると、`max_memory_usage_soft_limit_ratio`によってKeeperのメモリソフト制限を再計算します。 | `15` | +| `http_control` | [HTTP control](#http-control)インターフェイスの設定。 | - | +| `digest_enabled` | リアルタイムデータ整合性チェックを有効にします。 | `True` | +| `create_snapshot_on_exit` | シャットダウン時にスナップショットを作成します。 | - | +| `hostname_checks_enabled` | クラスター設定のためのホスト名チェックを有効にします(例:リモートエンドポイントと一緒にlocalhostが使用されている場合)。 | `True` | + +他の一般的なパラメータは、ClickHouseサーバーの設定(`listen_host`、`logger`など)から継承されます。 + +#### 内部調整設定 + +内部の調整設定は、`.`セクションにあり、以下のパラメータがあります: + +| パラメータ | 説明 | デフォルト | +|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------| +| `operation_timeout_ms` | 単一クライアント操作のタイムアウト(ms)。 | `10000` | +| `min_session_timeout_ms` | クライアントセッションの最小タイムアウト(ms)。 | `10000` | +| `session_timeout_ms` | クライアントセッションの最大タイムアウト(ms)。 | `100000` | +| `dead_session_check_period_ms` | ClickHouse Keeperがデッドセッションをチェックし削除する頻度(ms)。 | `500` | +| `heart_beat_interval_ms` | ClickHouse Keeperリーダーがフォロワーにハートビートを送信する頻度(ms)。 | `500` | +| `election_timeout_lower_bound_ms` | フォロワーがこの間隔内にリーダーからハートビートを受信しない場合、フォロワーはリーダー選挙を開始できます。`election_timeout_upper_bound_ms`より小さくまたは等しくなければなりません。理想的には等しくない方が良いです。 | `1000` | +| `election_timeout_upper_bound_ms` | フォロワーがこの間隔内にリーダーからハートビートを受信しない場合、リーダー選挙を開始しなければなりません。 | `2000` | +| `rotate_log_storage_interval` | 単一ファイルに保存するログレコードの数。 | `100000` | +| `reserved_log_items` | コンパクション前に保存する調整ログレコードの数。 | `100000` | +| `snapshot_distance` | ClickHouse Keeperが新しいスナップショットを作成する頻度(ログ内のレコード数で)。 | `100000` | +| `snapshots_to_keep` | 保持するスナップショットの数。 | `3` | +| `stale_log_gap` | リーダーがフォロワーを古くなったと見なしてスナップショットを送信する代わりにログを送信するしきい値。 | `10000` | +| `fresh_log_gap` | ノードが新しくなったとき。 | `200` | +| `max_requests_batch_size` | RAFTに送信する前にリクエストのバッチでの最大サイズ(リクエスト数)。 | `100` | +| `force_sync` | 調整ログへの各書き込みで`fsync`を呼び出します。 | `true` | +| `quorum_reads` | 全体的なRAFTコンセンサスと同じスピードで読み取り要求を実行します。 | `false` | +| `raft_logs_level` | 調整に関するテキストログレベル(trace、debugなど)。 | `system default` | +| `auto_forwarding` | フォロワーからリーダーに書き込み要求を転送することを許可します。 | `true` | +| `shutdown_timeout` | 内部接続を終了してシャットダウンするまでの待機時間(ms)。 | `5000` | +| `startup_timeout` | サーバーが指定されたタイムアウト内に他のクォーラム参加者に接続しない場合、終了します(ms)。 | `30000` | +| `four_letter_word_white_list` | 4lwコマンドのホワイトリスト。 | `conf, cons, crst, envi, ruok, srst, srvr, stat, wchs, dirs, mntr, isro, rcvr, apiv, csnp, lgif, rqld, ydld` | +| `async_replication` | 非同期レプリケーションを有効にします。全ての書き込みと読み取りの保証が維持され、より良いパフォーマンスが達成されます。この設定は、後方互換性を破壊しないようにするためにデフォルトでは無効になっています。 | `false` | +| `latest_logs_cache_size_threshold` | 最新のログエントリのインメモリキャッシュの最大合計サイズ | `1GiB` | +| `commit_logs_cache_size_threshold` | 次にコミットのために必要なログエントリのインメモリキャッシュの最大合計サイズ | `500MiB` | +| `disk_move_retries_wait_ms` | ディスク間でファイルを移動している間に発生した失敗後、再試行までどれくらい待機するか | `1000` | +| `disk_move_retries_during_init` | 初期化中にディスク間でファイルを移動している間に発生した失敗後の再試行回数 | `100` | +| `experimental_use_rocksdb` | rocksdbをバックエンドストレージとして使用 | `0` | + +クォーラム設定は、`.`セクションにあり、サーバーの説明を含んでいます。 + +すべてのクォーラムに対する唯一のパラメータは`secure`で、クォーラム参加者間の通信の暗号化接続を有効にします。このパラメータは、ノード間の内部通信にSSL接続が必要な場合は `true` に設定できますが、それ以外の場合は指定しなくても構いません。 + +各``のメインパラメータは以下です: + +- `id` — クォーラム内のサーバー識別子。 +- `hostname` — このサーバーが配置されているホスト名。 +- `port` — サーバーが接続を受け付けるポート。 +- `can_become_leader` — サーバーを`learner`として設定するには`false`を設定します。省略すると値は`true`です。 + +:::note +ClickHouse Keeperクラスターのトポロジーが変更される場合(例:サーバーを置き換える場合)、`server_id`から`hostname`へのマッピングを一貫して保持し、既存の`server_id`を他のサーバーに再利用したりしないようにしてください(例:ClickHouse Keeperのデプロイに自動化スクリプトを使用する場合)。 + +Keeperインスタンスのホストが変わる可能性がある場合は、生IPアドレスの代わりにホスト名を定義して使用することをお勧めします。ホスト名を変更することは、サーバーを削除して再追加するのと同等で、場合によっては不可能な場合があります(例:クォーラム用のKeeperインスタンスが十分でない場合)。 +::: + +:::note +`async_replication`は後方互換性を破壊しないようにするため、デフォルトでは無効になっています。クラスター内の全てのKeeperインスタンスが`async_replication`をサポートするバージョン(v23.9+)を実行している場合、この設定を有効にすることをお勧めします。パフォーマンスを向上させることができ、デメリットはありません。 +::: + +3ノードのクォーラムの設定例は、[インテグレーションテスト](https://github.com/ClickHouse/ClickHouse/tree/master/tests/integration)で`test_keeper_`接頭辞付きで見つけることができます。サーバー#1の設定例: + +```xml + + 2181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + zoo1 + 9234 + + + 2 + zoo2 + 9234 + + + 3 + zoo3 + 9234 + + + +``` + +### 実行方法 {#how-to-run} + +ClickHouse KeeperはClickHouseサーバーパッケージにバンドルされており、``の設定をあなたの`/etc/your_path_to_config/clickhouse-server/config.xml`に追加し、通常通りClickHouseサーバーを開始します。スタンドアロンのClickHouse Keeperを実行したい場合は、次のようにして開始できます: + +```bash +clickhouse-keeper --config /etc/your_path_to_config/config.xml +``` + +シンボリックリンク(`clickhouse-keeper`)を持たない場合は、それを作成するか`clickhouse`への引数として`keeper`を指定できます: + +```bash +clickhouse keeper --config /etc/your_path_to_config/config.xml +``` + +### 4文字コマンド {#four-letter-word-commands} + +ClickHouse Keeperは、ZooKeeperとほぼ同じ4文字コマンド(4lw)を提供します。各コマンドは`mntr`、`stat`などの4文字で構成されています。興味深いコマンドのいくつかを紹介すると、`stat`はサーバーと接続されたクライアントに関する一般情報を提供し、`srvr`と`cons`はそれぞれサーバーと接続に関する詳細を提供します。 + +4lwコマンドのホワイトリスト設定`four_letter_word_white_list`は、デフォルトで`conf,cons,crst,envi,ruok,srst,srvr,stat,wchs,dirs,mntr,isro,rcvr,apiv,csnp,lgif,rqld,ydld`です。 + +これらのコマンドをClickHouse Keeperに対してtelnetやncで発行できます。 + +``` +echo mntr | nc localhost 9181 +``` + +以下に4lwコマンドの詳細を示します: + +- `ruok`: サーバーがエラーステートなしで実行中であることをテストします。サーバーが実行中の場合`imok`で応答します。そうでない場合、まったく応答しません。サーバーが実行中であることを示す `imok` の応答は、サーバーがクォーラムに参加していることを必ずしも示しているわけではなく、単にサーバープロセスがアクティブで指定されたクライアントポートにバインドされていることを示しています。 + +``` +imok +``` + +- `mntr`: クラスターの健全性を監視するために使用できる変数のリストを出力します。 + +``` +zk_version v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 68 +zk_packets_sent 68 +zk_num_alive_connections 1 +zk_outstanding_requests 0 +zk_server_state leader +zk_znode_count 4 +zk_watch_count 1 +zk_ephemerals_count 0 +zk_approximate_data_size 723 +zk_open_file_descriptor_count 310 +zk_max_file_descriptor_count 10240 +zk_followers 0 +zk_synced_followers 0 +``` + +- `srvr`: サーバーの完全な詳細をリストします。 + +``` +ClickHouse Keeper version: v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +Latency min/avg/max: 0/0/0 +Received: 2 +Sent : 2 +Connections: 1 +Outstanding: 0 +Zxid: 34 +Mode: leader +Node count: 4 +``` + +- `stat`: サーバーと接続されたクライアントの簡単な詳細をリストします。 + +``` +ClickHouse Keeper version: v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +Clients: + 192.168.1.1:52852(recved=0,sent=0) + 192.168.1.1:52042(recved=24,sent=48) +Latency min/avg/max: 0/0/0 +Received: 4 +Sent : 4 +Connections: 1 +Outstanding: 0 +Zxid: 36 +Mode: leader +Node count: 4 +``` + +- `srst`: サーバーの統計をリセットします。このコマンドは`srvr`、`mntr`、および`stat`の結果に影響を与えます。 + +``` +Server stats reset. +``` + +- `conf`: 提供中の設定の詳細を表示します。 + +``` +server_id=1 +tcp_port=2181 +four_letter_word_white_list=* +log_storage_path=./coordination/logs +snapshot_storage_path=./coordination/snapshots +max_requests_batch_size=100 +session_timeout_ms=30000 +operation_timeout_ms=10000 +dead_session_check_period_ms=500 +heart_beat_interval_ms=500 +election_timeout_lower_bound_ms=1000 +election_timeout_upper_bound_ms=2000 +reserved_log_items=1000000000000000 +snapshot_distance=10000 +auto_forwarding=true +shutdown_timeout=5000 +startup_timeout=240000 +raft_logs_level=information +snapshots_to_keep=3 +rotate_log_storage_interval=100000 +stale_log_gap=10000 +fresh_log_gap=200 +max_requests_batch_size=100 +quorum_reads=false +force_sync=false +compress_logs=true +compress_snapshots_with_zstd_format=true +configuration_change_tries_count=20 +``` + +- `cons`: このサーバーに接続されているすべてのクライアントの完全な接続/セッションの詳細をリストします。受信/送信したパケット数、セッションID、操作レイテンシー、最後に実行された操作などの情報を含みます。 + +``` + 192.168.1.1:52163(recved=0,sent=0,sid=0xffffffffffffffff,lop=NA,est=1636454787393,to=30000,lzxid=0xffffffffffffffff,lresp=0,llat=0,minlat=0,avglat=0,maxlat=0) + 192.168.1.1:52042(recved=9,sent=18,sid=0x0000000000000001,lop=List,est=1636454739887,to=30000,lcxid=0x0000000000000005,lzxid=0x0000000000000005,lresp=1636454739892,llat=0,minlat=0,avglat=0,maxlat=0) +``` + +- `crst`: すべての接続に対する接続/セッション統計をリセットします。 + +``` +Connection stats reset. +``` + +- `envi`: サーバー環境の詳細を表示します。 + +``` +Environment: +clickhouse.keeper.version=v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +host.name=ZBMAC-C02D4054M.local +os.name=Darwin +os.arch=x86_64 +os.version=19.6.0 +cpu.count=12 +user.name=root +user.home=/Users/JackyWoo/ +user.dir=/Users/JackyWoo/project/jd/clickhouse/cmake-build-debug/programs/ +user.tmp=/var/folders/b4/smbq5mfj7578f2jzwn602tt40000gn/T/ +``` + +- `dirs`: スナップショットとログファイルの合計サイズをバイト単位で表示します。 + +``` +snapshot_dir_size: 0 +log_dir_size: 3875 +``` + +- `isro`: サーバーが読み取り専用モードで実行されているかをテストします。読み取り専用モードで`ro`、そうでない場合は`rw`で応答します。 + +``` +rw +``` + +- `wchs`: サーバーの監視に関する簡単な情報をリストします。 + +``` +1 connections watching 1 paths +Total watches:1 +``` + +- `wchc`: セッションごとに、サーバーの監視に関する詳細な情報をリストします。セッション(接続)のリストと関連する監視(パス)を出力します。注意として、監視数によっては、この操作は高負荷になる可能性があります(サーバーのパフォーマンスに影響を与える)、注意して使用してください。 + +``` +0x0000000000000001 + /clickhouse/task_queue/ddl +``` + +- `wchp`: サーバーのパスごとに、監視に関する詳細情報をリストします。パス(znodes)のリストと関連するセッションを出力します。注意として、監視数によっては、この操作は高負荷になる可能性があります(つまり、サーバーのパフォーマンスに影響を与える)、注意して使用してください。 + +``` +/clickhouse/task_queue/ddl + 0x0000000000000001 +``` + +- `dump`: 実行中のセッションと一時ノードをリストします。これはリーダーでのみ機能します。 + +``` +Sessions dump (2): +0x0000000000000001 +0x0000000000000002 +Sessions with Ephemerals (1): +0x0000000000000001 + /clickhouse/task_queue/ddl +``` + +- `csnp`: スナップショット作成タスクのスケジュールを設定します。成功した場合はスケジュールされたスナップショットの最後のコミットログインデックスを返し、失敗した場合は`Failed to schedule snapshot creation task.`を返します。`lgif`コマンドはスナップショットが完了したかどうかを判断するのに役立ちます。 + +``` +100 +``` + +- `lgif`: Keeperログの情報。`first_log_idx` : ログストア内の最初のログインデックス; `first_log_term` : 最初のログターム; `last_log_idx` : ログストア内の最後のログインデックス; `last_log_term` : 最後のログターム; `last_committed_log_idx` : 状態マシンで最後にコミットされたログインデックス; `leader_committed_log_idx` : 私の視点からのリーダーのコミットログインデックス; `target_committed_log_idx` : コミットされるべきターゲットログインデックス; `last_snapshot_idx` : 最後のスナップショットの最大コミットログインデックス。 + +``` +first_log_idx 1 +first_log_term 1 +last_log_idx 101 +last_log_term 1 +last_committed_log_idx 100 +leader_committed_log_idx 101 +target_committed_log_idx 101 +last_snapshot_idx 50 +``` + +- `rqld`: 新しいリーダーになるようにリクエストします。リーダーシップリクエストが送信された場合は`Sent leadership request to leader.`、送信されなかった場合は`Failed to send leadership request to leader.`を返します。ノードが既にリーダーであれば、結果はリクエストが送信されたのと同じです。 + +``` +Sent leadership request to leader. +``` + +- `ftfl`: Keeperインスタンスで有効になっているすべてのフィーチャーフラグをリストします。 + +``` +filtered_list 1 +multi_read 1 +check_not_exists 0 +``` +- `ydld`: リーダーシップを放棄し、フォロワーになるリクエストを送信します。リクエストを受け取ったサーバーがリーダーの場合、まず書き込み操作を一時停止し、後継者(現在のリーダーは後継者にはなれません)が最新のログのキャッチアップを終了するのを待ってから辞任します。後継者は自動的に選ばれます。リクエストが送信された場合は`リーダーへのリーダーシップ放棄リクエストを送信しました。`を返し、送信されなかった場合は`リーダーへのリーダーシップ放棄リクエストの送信に失敗しました。`を返します。ノードがすでにフォロワーである場合、結果はリクエストが送信された場合と同じです。 + +``` +リーダーへのリーダーシップ放棄リクエストを送信しました。 +``` + +- `pfev`: 収集されたすべてのイベントの値を返します。各イベントについてイベント名、イベント値、およびイベントの説明を返します。 + +``` +FileOpen 62 ファイルが開かれた回数。 +Seek 4 'lseek'関数が呼ばれた回数。 +ReadBufferFromFileDescriptorRead 126 ファイルディスクリプタからの読み取り(read/pread)の回数。ソケットは含まれません。 +ReadBufferFromFileDescriptorReadFailed 0 ファイルディスクリプタからの読み取り(read/pread)が失敗した回数。 +ReadBufferFromFileDescriptorReadBytes 178846 ファイルディスクリプタから読み取られたバイト数。ファイルが圧縮されている場合、これは圧縮データのサイズを示します。 +WriteBufferFromFileDescriptorWrite 7 ファイルディスクリプタへの書き込み(write/pwrite)の回数。ソケットは含まれません。 +WriteBufferFromFileDescriptorWriteFailed 0 ファイルディスクリプタへの書き込み(write/pwrite)が失敗した回数。 +WriteBufferFromFileDescriptorWriteBytes 153 ファイルディスクリプタに書き込まれたバイト数。ファイルが圧縮されている場合、これは圧縮データサイズを示します。 +FileSync 2 ファイルに対してF_FULLFSYNC/fsync/fdatasync関数が呼ばれた回数。 +DirectorySync 0 ディレクトリに対してF_FULLFSYNC/fsync/fdatasync関数が呼ばれた回数。 +FileSyncElapsedMicroseconds 12756 ファイルに対するF_FULLFSYNC/fsync/fdatasyncシステムコールを待って費やした合計時間。 +DirectorySyncElapsedMicroseconds 0 ディレクトリに対するF_FULLFSYNC/fsync/fdatasyncシステムコールを待って費やした合計時間。 +ReadCompressedBytes 0 圧縮ソース(ファイル、ネットワーク)から読み取ったバイト数(解凍前のバイト数)。 +CompressedReadBufferBlocks 0 圧縮ソース(ファイル、ネットワーク)から読み取った圧縮ブロック(各自で圧縮されるデータブロック)。 +CompressedReadBufferBytes 0 圧縮ソース(ファイル、ネットワーク)から読み取った非圧縮バイト数(解凍後のバイト数)。 +AIOWrite 0 LinuxまたはFreeBSDのAIOインターフェースによる書き込みの回数。 +AIOWriteBytes 0 LinuxまたはFreeBSDのAIOインターフェースで書き込まれたバイト数。 +... +``` + +### HTTP制御 {#http-control} + +ClickHouse Keeperは、レプリカがトラフィックを受信する準備ができているかどうかをチェックするためのHTTPインターフェイスを提供します。これは、[Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)のようなクラウド環境で使用できます。 + +`/ready`エンドポイントを有効にする構成の例: + +```xml + + + + 9182 + + /ready + + + + +``` + +### フィーチャーフラグ + +KeeperはZooKeeperおよびそのクライアントと完全に互換性がありますが、ClickHouseクライアントで使用できるいくつかのユニークな機能やリクエストタイプも導入しています。これらの機能は後方互換性のない変更を引き起こす可能性があるため、そのほとんどはデフォルトで無効になっており、`keeper_server.feature_flags`設定を使用して有効にすることができます。すべての機能は明示的に無効にすることができます。Keeperクラスタに新しい機能を有効にしたい場合、まずクラスタ内のすべてのKeeperインスタンスを機能をサポートするバージョンに更新し、それから機能自体を有効にすることをお勧めします。 + +`multi_read`を無効にし、`check_not_exists`を有効にするフィーチャーフラグ設定の例: + +```xml + + + + 0 + 1 + + + +``` + +利用可能な機能は次の通りです: + +`multi_read` - マルチリードリクエストのサポート。デフォルト: `1` +`filtered_list` - ノードのタイプ(永続的またはエフェメラル)で結果をフィルターするリストリクエストのサポート。デフォルト: `1` +`check_not_exists` - ノードが存在しないことを確認する`CheckNotExists`リクエストのサポート。デフォルト: `0` +`create_if_not_exists` - ノードが存在しない場合に作成しようとする`CreateIfNotExists`リクエストのサポート。存在する場合、変更は適用されず`ZOK`が返されます。デフォルト: `0` + +### ZooKeeperからの移行 {#migration-from-zookeeper} + +ZooKeeperからClickHouse Keeperへのシームレスな移行は不可能です。ZooKeeperクラスタを停止し、データを変換してClickHouse Keeperを開始する必要があります。`clickhouse-keeper-converter`ツールはZooKeeperログとスナップショットをClickHouse Keeperのスナップショットに変換することを可能にします。これはZooKeeper > 3.4でのみ動作します。移行の手順: + +1. すべてのZooKeeperノードを停止します。 + +2. オプションですが推奨: ZooKeeperのリーダーノードを見つけ、それを開始して再度停止します。これにより、ZooKeeperが一貫したスナップショットを作成することを強制します。 + +3. リーダーで`clickhouse-keeper-converter`を実行します。例: + +```bash +clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /path/to/clickhouse/keeper/snapshots +``` + +4. Keeperが構成されたClickHouseサーバーノードにスナップショットをコピーするか、ZooKeeperの代わりにClickHouse Keeperを開始します。スナップショットはすべてのノードで持続する必要があります。そうしないと、空のノードがより速くなり、リーダーになることがあります。 + +:::note +`keeper-converter`ツールはKeeper単独のバイナリからは利用できません。 +ClickHouseがインストールされている場合、バイナリを直接使用できます: + +```bash +clickhouse keeper-converter ... +``` + +それ以外の場合は、[バイナリをダウンロード](/docs/ja/getting-started/quick-start#1-download-the-binary)して上記のようにツールを実行することができます。ClickHouseをインストールせずに。 +::: + + +### クォーラム喪失後の復旧 + +ClickHouse KeeperはRaftを使用しているため、クラスタのサイズに応じて一定のノードのクラッシュを許容できます。 +たとえば、3ノードのクラスタの場合、1ノードがクラッシュした場合でも正しく動作し続けます。 + +クラスタの構成は動的に設定できますが、制限があります。再構成はRaftに依存しているため、クラスタからノードを追加または削除するにはクォーラムが必要です。クラスタ内の多くのノードを同時に失い、それらを再起動できなくなると、Raftは機能を停止し、従来の方法でクラスタを再構成できなくなります。 + +それにもかかわらず、ClickHouse Keeperにはリカバリーモードがあり、1つのノードだけで強制的にクラスタを再構成することができます。これは、ノードを再起動できない場合、または同じエンドポイントで新しいインスタンスを開始する場合だけを最後の手段として行うべきです。 + +続行する前に注意すべき重要なこと: +- 失敗したノードが再びクラスタに接続できないことを確認してください。 +- ステップで指定されていない限り、新しいノードを起動しないでください。 + +上記のことを確認した後、以下の手順を実行します: +1. Keeperノードの1つを新しいリーダーとして選択します。そのノードのデータがクラスタ全体に利用されることになるので、最新の状態を持つノードを使用することをお勧めします。 +2. 他の何かを行う前に、選択したノードの`log_storage_path`と`snapshot_storage_path`フォルダをバックアップします。 +3. 使用したいすべてのノードでクラスタを再構成します。 +4. 選択したノードに四文字コマンド`rcvr`を送り、ノードをリカバリモードに移行するか、選択したノードでKeeperインスタンスを停止し、`--force-recovery`引数で再起動します。 +5. 新しいノードでKeeperインスタンスを1つずつ開始し、次のノードを開始する前に`mntr`が`zk_server_state`で`follower`を返すことを確認します。 +6. リカバリモード中、リーダーノードはクォーラムを新しいノードと達成するまで`mntr`コマンドに対してエラーメッセージを返し、クライアントとフォロワーからのすべての要求を拒否します。 +7. クォーラムが達成されると、リーダーノードは通常モードに戻り、すべての要求を受け入れてRaftと共に確認されます。`mntr`で確認すると`zk_server_state`として`leader`が返されます。 + +## Keeperでディスクを使用する + +Keeperはスナップショット、ログファイル、および状態ファイルの保存に[外部ディスク](/docs/ja/operations/storing-data.md)のサブセットをサポートしています。 + +サポートされているディスクの種類は: +- s3_plain +- s3 +- local + +以下は、ディスク定義が含まれる設定の例です。 + +```xml + + + + + local + /var/lib/clickhouse/coordination/logs/ + + + s3_plain + https://some_s3_endpoint/logs/ + ACCESS_KEY + SECRET_KEY + + + local + /var/lib/clickhouse/coordination/snapshots/ + + + s3_plain + https://some_s3_endpoint/snapshots/ + ACCESS_KEY + SECRET_KEY + + + s3_plain + https://some_s3_endpoint/state/ + ACCESS_KEY + SECRET_KEY + + + + +``` + +ログ用のディスクを使用するには、`keeper_server.log_storage_disk`設定をディスク名に設定する必要があります。 +スナップショット用のディスクを使用するには、`keeper_server.snapshot_storage_disk`設定をディスク名に設定する必要があります。 +また、最新のログまたはスナップショット用に異なるディスクを使用することができます。これには、`keeper_server.latest_log_storage_disk`と`keeper_server.latest_snapshot_storage_disk`をそれぞれ使用します。 +この場合、新しいログやスナップショットが作成されるたびにKeeperは自動的にファイルを適切なディスクに移動します。 +状態ファイル用のディスクを使用するには、`keeper_server.state_storage_disk`設定をディスク名に設定する必要があります。 + +ディスク間のファイルの移動は安全で、転送の途中でKeeperが停止した場合でもデータを失うリスクはありません。 +ファイルが完全に新しいディスクに移動されるまで、元のディスクから削除されません。 + +Keeperで`keeper_server.coordination_settings.force_sync`が`true`に設定されている場合(一部のディスクタイプでは保証を満たすことができません。デフォルトではtrueです)。 +現在、`local`タイプのディスクのみが持続的な同期をサポートしています。 +`force_sync`が使用されている場合、`log_storage_disk`は`local`ディスクでなければなりません。`latest_log_storage_disk`が使用されていない場合。 +`latest_log_storage_disk`が使用されている場合、それは常に`local`ディスクでなければなりません。 +`force_sync`が無効の場合、すべてのタイプのディスクを任意のセットアップで使用できます。 + +Keeperインスタンスのストレージ設定例は次のようにすることができます: + +```xml + + + log_s3_plain + log_local + + snapshot_s3_plain + snapshot_local + + +``` + +このインスタンスは、最新でないログをすべて`log_s3_plain`ディスクに保存し、最新のログは`log_local`ディスクに保存します。 +スナップショットについても同様で、最新でないスナップショットは`snapshot_s3_plain`に保存され、最新のスナップショットは`snapshot_local`に保存されます。 + +### ディスク設定の変更 + +:::important +新しいディスク設定を適用する前に、すべてのKeeperログとスナップショットを手動でバックアップしてください。 +::: + +階層化ディスク設定が定義されている場合(最新のファイルに別々のディスクを使用する)、Keeperは起動時にファイルを正しいディスクに自動的に移動しようとします。 +以前と同じ保証が適用されます。ファイルが完全に新しいディスクに移動されるまで、元のディスクから削除されません。そのため、複数の再起動は安全に行うことができます。 + +ファイルを完全に新しいディスクに移動する必要がある場合(または2ディスク設定から1ディスク設定に移行する場合)、`keeper_server.old_snapshot_storage_disk`と`keeper_server.old_log_storage_disk`の複数の定義を使用できます。 + +次の設定は、以前の2ディスク設定から完全に新しい1ディスク設定に移行する方法を示しています: + +```xml + + + log_local + log_s3_plain + log_local2 + + snapshot_s3_plain + snapshot_local + snapshot_local2 + + +``` + +起動時に、すべてのログファイルは`log_local`と`log_s3_plain`から`log_local2`に移動されます。 +また、すべてのスナップショットファイルは`snapshot_local`と`snapshot_s3_plain`から`snapshot_local2`に移動されます。 + +## ログキャッシュの設定 + +ディスクから読み取るデータ量を最小限に抑えるために、Keeperはログエントリをメモリにキャッシュします。 +リクエストが大きい場合、ログエントリは多くのメモリを使用するため、キャッシュされるログの量に上限があります。 +上限は次の2つの設定で制御されます: +- `latest_logs_cache_size_threshold` - キャッシュに格納された最新のログの総サイズ +- `commit_logs_cache_size_threshold` - 次にコミットする必要がある一連のログの総サイズ + +デフォルト値が大きすぎる場合、これら2つの設定を減らしてメモリ使用量を減らすことができます。 + +:::note +各キャッシュおよびファイルから読み取られたログの量を確認するために`pfev`コマンドを使用できます。 +また、Prometheusエンドポイントからメトリクスを使用して、両方のキャッシュの現在のサイズを追跡することもできます。 +::: + + +## Prometheus + +KeeperはPrometheusからのスクレイピング用にメトリクス・データを公開することができます。 +設定は[ClickHouseと同じ方法で行われます。](/docs/ja/operations/server-configuration-parameters/settings#prometheus) + +## ClickHouse Keeperユーザーガイド + +このガイドは、ClickHouse Keeperを設定するためのシンプルで最小限の設定を提供し、分散操作をテストする方法の例を示します。この例は、Linux上で3つのノードを使用して実行されます。 + +### 1. ノードをKeeper設定で構成する + +1. 3つのClickHouseインスタンスを3つのホスト(chnode1、chnode2、chnode3)にインストールします。(ClickHouseのインストールに関する詳細は[クイックスタート](/docs/ja/getting-started/install.md)を参照してください。) + +2. 各ノードで、ネットワークインターフェイスを介した外部通信を許可するために、次のエントリを追加します。 + ```xml + 0.0.0.0 + ``` + +3. 次のClickHouse Keeper設定を3つのサーバーに追加し、各サーバーの``設定を更新します。例えば、`chnode1`は`1`、`chnode2`は`2`のように設定します。 + ```xml + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + warning + + + + + 1 + chnode1.domain.com + 9234 + + + 2 + chnode2.domain.com + 9234 + + + 3 + chnode3.domain.com + 9234 + + + + ``` + + 以下は上記の基本設定です: + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |tcp_port |keeperのクライアントが使用するポート|9181 デフォルトではzookeeperの2181相当| + |server_id| 各ClickHouse Keeperサーバーの識別子でraftの設定で使用されます| 1| + |coordination_settings| パラメータ(タイムアウト等)を設定するセクション| タイムアウト: 10000, ログレベル: trace| + |server |参加するサーバーの定義|各サーバーの定義リスト| + |raft_configuration| keeperクラスタ内の各サーバーの設定| 各サーバーと設定のリスト| + |id |keeperサービス用のサーバーの数値ID|1| + |hostname |keeperクラスタ内の各サーバーのホスト名、IP、またはFQDN|chnode1.domain.com| + |port|インターサーバーのkeeper接続をリッスンするポート|9234| + + +4. 組み込みのZooKeeperを有効にします。ClickHouse Keeperエンジンを使用します: + ```xml + + + chnode1.domain.com + 9181 + + + chnode2.domain.com + 9181 + + + chnode3.domain.com + 9181 + + + ``` + + 以下は上記の基本設定です: + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |node |ClickHouse Keeper接続用のノードのリスト|各サーバーの設定エントリ| + |host|各ClickHouse Keeperノードのホスト名、IP、またはFQDN|chnode1.domain.com| + |port|ClickHouse Keeperのクライアントポート|9181| + +5. ClickHouseを再起動し、各Keeperインスタンスが実行されていることを確認します。各サーバーで次のコマンドを実行します。`ruok`コマンドはKeeperが実行中で正常である場合に`imok`を返します。 + ```bash + # echo ruok | nc localhost 9181; echo + imok + ``` + +6. `system`データベースには、ClickHouse Keeperインスタンスの詳細を含む`zookeeper`テーブルがあります。このテーブルを表示してみましょう: + ```sql + SELECT * + FROM system.zookeeper + WHERE path IN ('/', '/clickhouse') + ``` + + テーブルは次のようになります: + ```response + ┌─name───────┬─value─┬─czxid─┬─mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬─pzxid─┬─path────────┐ + │ clickhouse │ │ 124 │ 124 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 2 │ 0 │ 0 │ 0 │ 2 │ 5693 │ / │ + │ task_queue │ │ 125 │ 125 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 126 │ /clickhouse │ + │ tables │ │ 5693 │ 5693 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 3 │ 0 │ 0 │ 0 │ 3 │ 6461 │ /clickhouse │ + └────────────┴───────┴───────┴───────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴───────┴─────────────┘ + ``` + +### 2. ClickHouseにクラスタを設定する + +1. 2つのシャードと1つのレプリカで構成されるシンプルなクラスタを構成します。3番目のノードは、ClickHouse Keeperのクォーラム条件のために使用されます。`chnode1`と`chnode2`で設定を更新します。このクラスタは、各ノードに1つのシャードを配置し、合計2つのシャードを持ち、レプリケーションは行われません。この例では、データの一部が片方のノードにあり、残りがもう一方のノードにあります: + ```xml + + + + + chnode1.domain.com + 9000 + default + ClickHouse123! + + + + + chnode2.domain.com + 9000 + default + ClickHouse123! + + + + + ``` + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |shard |クラスタ定義内のレプリカのリスト|各シャードのレプリカリスト| + |replica|各レプリカの設定のリスト|各レプリカの設定エントリ| + |host|レプリカシャードをホストするサーバーのホスト名、IPまたはFQDN|chnode1.domain.com| + |port|ネイティブTCPプロトコルを使った通信に使用するポート|9000| + |user|クラスタインスタンスに接続するために使用するユーザー名|default| + |password|クラスタインスタンスへの接続を許可するためのユーザインのパスワード|ClickHouse123!| + + +2. ClickHouseを再起動し、クラスタが作成されたことを確認します。 + ```bash + SHOW clusters; + ``` + + クラスタが表示されます: + ```response + ┌─cluster───────┐ + │ cluster_2S_1R │ + └───────────────┘ + ``` + +### 3. 分散テーブルの作成とテスト + +1. 新しいクラスタで新しいデータベースを作成します。`ON CLUSTER`句は、両方のノードでデータベースを自動的に作成します。 + ```sql + CREATE DATABASE db1 ON CLUSTER 'cluster_2S_1R'; + ``` + +2. `db1`データベースに新しいテーブルを作成します。再び、`ON CLUSTER`は両方のノードにテーブルを作成します。 + ```sql + CREATE TABLE db1.table1 on cluster 'cluster_2S_1R' + ( + `id` UInt64, + `column1` String + ) + ENGINE = MergeTree + ORDER BY column1 + ``` + +3. `chnode1`ノードにいくつかの行を追加します: + ```sql + INSERT INTO db1.table1 + (id, column1) + VALUES + (1, 'abc'), + (2, 'def') + ``` + +4. `chnode2`ノードにいくつかの行を追加します: + ```sql + INSERT INTO db1.table1 + (id, column1) + VALUES + (3, 'ghi'), + (4, 'jkl') + ``` + +5. 各ノードでの`SELECT`ステートメントの実行は、そのノードにあるデータのみを表示します。例えば、`chnode1`で: + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 7ef1edbc-df25-462b-a9d4-3fe6f9cb0b6d + + ┌─id─┬─column1─┐ + │ 1 │ abc │ + │ 2 │ def │ + └────┴─────────┘ + + 2 rows in set. Elapsed: 0.006 sec. + ``` + + `chnode2`で: + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: c43763cc-c69c-4bcc-afbe-50e764adfcbf + + ┌─id─┬─column1─┐ + │ 3 │ ghi │ + │ 4 │ jkl │ + └────┴─────────┘ + ``` + +6. 2つのシャード上のデータを表すために`分散テーブル`を作成できます。`分散テーブル`エンジンを持つテーブルは、自身のデータを保存せず、複数のサーバーで分散クエリ処理を可能にします。読み取りはすべてのシャードに当たり、書き込みはシャード間で分散できます。`chnode1`で以下のクエリを実行します: + ```sql + CREATE TABLE db1.dist_table ( + id UInt64, + column1 String + ) + ENGINE = Distributed(cluster_2S_1R,db1,table1) + ``` + +7. `dist_table`をクエリすると、2つのシャードのデータがすべて4行返されることを確認します: + ```sql + SELECT * + FROM db1.dist_table + ``` + + ```response + Query id: 495bffa0-f849-4a0c-aeea-d7115a54747a + + ┌─id─┬─column1─┐ + │ 1 │ abc │ + │ 2 │ def │ + └────┴─────────┘ + ┌─id─┬─column1─┐ + │ 3 │ ghi │ + │ 4 │ jkl │ + └────┴─────────┘ + + 4 rows in set. Elapsed: 0.018 sec. + ``` + +### まとめ + +このガイドでは、ClickHouse Keeperを使用してクラスタを設定する方法を示しました。ClickHouse Keeperを使用すると、クラスターを構成し、シャード間でレプリケート可能な分散テーブルを定義できます。 + + +## ユニークなパスでClickHouse Keeperを設定する + + + +### 説明 + +この記事では、組み込みの`{uuid}`マクロ設定を使用して、ClickHouse KeeperまたはZooKeeperにユニークなエントリを作成する方法を説明します。ユニークなパスはテーブルを頻繁に作成および削除する場合に役立ちます。これは、パスが作成されるたびに新しい`uuid`がパスで使用され、パスが再利用されないため、Keeperガベージコレクションがパスエントリを削除するまで数分待つ必要がないからです。 + +### 環境例 +すべてのノードにClickHouse Keeperを持ち、ClickHouseを2ノードに持つように構成される3ノードクラスタ例。この設定により、ClickHouse Keeperには3ノード(タイブレーカーノードを含む)があり、1つのClickHouseシャードが2つのレプリカで構成されます。 + +|ノード|説明| +|-----|-----| +|chnode1.marsnet.local|データノード - cluster cluster_1S_2R| +|chnode2.marsnet.local|データノード - cluster cluster_1S_2R| +|chnode3.marsnet.local|ClickHouse Keeperタイブレーカーノード| + +クラスタの例設定: +```xml + + + + + chnode1.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + chnode2.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + + +``` + +### {uuid}を使用するためのテーブル設定手順 +1. 各サーバーでマクロを設定します。サーバー1の例: +```xml + + 1 + replica_1 + +``` +:::note +`shard`と`replica`のマクロを定義することに注意してくださいが、`{uuid}`はここで定義されることはなく、それ自体で組み込まれているため、定義する必要はありません。 +::: + +2. データベースを作成する + +```sql +CREATE DATABASE db_uuid + ON CLUSTER 'cluster_1S_2R' + ENGINE Atomic; +``` + +```response +CREATE DATABASE db_uuid ON CLUSTER cluster_1S_2R +ENGINE = Atomic + +Query id: 07fb7e65-beb4-4c30-b3ef-bd303e5c42b5 + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +3. クラスタ上でマクロと`{uuid}`を使用してテーブルを作成する +```sql +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}' ) + ORDER BY (id); +``` + +```response +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}') +ORDER BY id + +Query id: 8f542664-4548-4a02-bd2a-6f2c973d0dc4 + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +4. 分散テーブルを作成する +```sql +create table db_uuid.dist_uuid_table1 on cluster 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = Distributed('cluster_1S_2R', 'db_uuid', 'uuid_table1' ); +``` + +```response +CREATE TABLE db_uuid.dist_uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = Distributed('cluster_1S_2R', 'db_uuid', 'uuid_table1') + +Query id: 3bc7f339-ab74-4c7d-a752-1ffe54219c0e + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +### テスト +1. 最初のノードにデータを挿入する(例:`chnode1`) +```sql +INSERT INTO db_uuid.uuid_table1 + ( id, column1) + VALUES + ( 1, 'abc'); +``` + +```response +INSERT INTO db_uuid.uuid_table1 (id, column1) FORMAT Values + +Query id: 0f178db7-50a6-48e2-9a1b-52ed14e6e0f9 + +Ok. + +1 row in set. Elapsed: 0.033 sec. +``` + +2. 2番目のノードにデータを挿入する(例:`chnode2`) +```sql +INSERT INTO db_uuid.uuid_table1 + ( id, column1) + VALUES + ( 2, 'def'); +``` + +```response +INSERT INTO db_uuid.uuid_table1 (id, column1) FORMAT Values + +Query id: edc6f999-3e7d-40a0-8a29-3137e97e3607 + +Ok. + +1 row in set. Elapsed: 0.529 sec. +``` + +3. 分散テーブルを使用してレコードを表示する +```sql +SELECT * FROM db_uuid.dist_uuid_table1; +``` + +```response +SELECT * +FROM db_uuid.dist_uuid_table1 + +Query id: 6cbab449-9e7f-40fe-b8c2-62d46ba9f5c8 + +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.007 sec. +``` + +### 代替案 +デフォルトのレプリケーションパスはマクロによって事前に定義され、`{uuid}`も使用されます。 + +1. 各ノードでテーブルのデフォルトを設定する +```xml +/clickhouse/tables/{shard}/db_uuid/{uuid} +``` +```default_replica_name +{replica} +``` +:::tip +ノードが特定のデータベースに使用される場合、各ノードでマクロ `{database}` を定義することもできます。 +::: + +2. パラメータを明示的に指定せずにテーブルを作成する: +```sql +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = ReplicatedMergeTree + ORDER BY (id); +``` + +```response +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree +ORDER BY id + +Query id: ab68cda9-ae41-4d6d-8d3b-20d8255774ee + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + +2 rows in set. Elapsed: 1.175 sec. +``` + +3. デフォルトの設定が使用されていることを確認する: +```sql +SHOW CREATE TABLE db_uuid.uuid_table1; +``` + +```response +SHOW CREATE TABLE db_uuid.uuid_table1 + +Query id: 5925ecce-a54f-47d8-9c3a-ad3257840c9e + +┌─statement────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE db_uuid.uuid_table1 +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}') +ORDER BY id +SETTINGS index_granularity = 8192 │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +### トラブルシューティング + +テーブル情報とUUIDを取得するためのコマンドの例: +```sql +SELECT * FROM system.tables +WHERE database = 'db_uuid' AND name = 'uuid_table1'; +``` + +上記のテーブルのUUIDに関する情報をZooKeeperから取得するためのコマンドの例: +```sql +SELECT * FROM system.zookeeper +WHERE path = '/clickhouse/tables/1/db_uuid/9e8a3cc2-0dec-4438-81a7-c3e63ce2a1cf/replicas'; +``` + +:::note +データベースは `Atomic` でなければなりません。以前のバージョンからアップグレードする場合、 +`default` データベースはおそらく `Ordinary` タイプです。 +::: + +チェック方法の例: +``` +SELECT name, engine FROM system.databases WHERE name = 'db_uuid'; +``` + +```response +SELECT + name, + engine +FROM system.databases +WHERE name = 'db_uuid' + +Query id: b047d459-a1d2-4016-bcf9-3e97e30e49c2 + +┌─name────┬─engine─┐ +│ db_uuid │ Atomic │ +└─────────┴────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +## ClickHouse Keeperの動的再構成 {#reconfiguration} + + + +### 説明 + +ClickHouse Keeperは、動的クラスタ再構成のためにZooKeeperの[`reconfig`](https://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperReconfig.html#sc_reconfig_modifying) +コマンドを部分的にサポートしています。`keeper_server.enable_reconfiguration` がオンになっている場合にのみ動作します。 + +:::note +この設定がオフの場合、レプリカの `raft_configuration` セクションを手動で変更してクラスタを再構成できます。 +リーダーのみが変更を適用するため、すべてのレプリカのファイルを編集することを確認してください。 +あるいは、ZooKeeper互換のクライアントを使用して `reconfig` クエリを送信することもできます。 +::: + +仮想ノード `/keeper/config` には、次の形式で最後にコミットされたクラスタの設定が含まれています: + +``` +server.id = server_host:server_port[;server_type][;server_priority] +server.id2 = ... +... +``` + +- 各サーバーエントリは改行で区切られています。 +- `server_type` は `participant` または `learner` ([learner](https://github.com/eBay/NuRaft/blob/master/docs/readonly_member.md) はリーダー選出に参加しません) のいずれかです。 +- `server_priority` は、[リーダー選出時に優先されるノードを評価する](https://github.com/eBay/NuRaft/blob/master/docs/leader_election_priority.md)非負の整数です。 + 0 の優先度は、サーバーがリーダーにならないことを意味します。 + +例: + +``` +:) get /keeper/config +server.1=zoo1:9234;participant;1 +server.2=zoo2:9234;participant;1 +server.3=zoo3:9234;participant;1 +``` + +`reconfig` コマンドを用いて、新しいサーバーを追加し、既存のサーバーを削除したり、 +既存のサーバーの優先度を変更したりできます。以下に例を示します(`clickhouse-keeper-client`を使用): + +```bash +# 新しい2つのサーバーを追加 +reconfig add "server.5=localhost:123,server.6=localhost:234;learner" +# 他の2つのサーバーを削除 +reconfig remove "3,4" +# 既存のサーバーの優先度を8に変更 +reconfig add "server.5=localhost:5123;participant;8" +``` + +こちらは`kazoo`の例です: + +```python +# 新しい2つのサーバーを追加し、他の2つのサーバーを削除 +reconfig(joining="server.5=localhost:123,server.6=localhost:234;learner", leaving="3,4") + +# 既存のサーバーの優先度を8に変更 +reconfig(joining="server.5=localhost:5123;participant;8", leaving=None) +``` + +参加するサーバーは上記のサーバーフォーマットで指定する必要があります。サーバーエントリはカンマで区切る必要があります。 +新しいサーバーを追加する際、`server_priority`(デフォルト値は1)や`server_type`(デフォルト値は`participant`)は省略できます。 + +既存のサーバー優先度を変更したい場合、`joining`に対象の優先度で追加してください。 +サーバーのホスト、ポート、タイプは既存のサーバー設定と等しくなければなりません。 + +サーバーは`joining`および`leaving`に記載された順に追加および削除されます。 +`joining`からのすべてのアップデートは`leaving`からのアップデートよりも先に処理されます。 + +Keeper再構成の実装にはいくつかの注意点があります: + +- 増分再構成のみがサポートされています。`new_members`が空でないリクエストは拒否されます。 + + ClickHouse Keeperの実装は、会員を動的に変更するためにNuRaft APIに依存しています。NuRaftは、一度に1台のサーバーを追加または削除する方法を提供しています。つまり、構成への変更(`joining`の各部分、`leaving`の各部分)は個別に決定されなければなりません。従って、ユーザーにとって誤解を招くおそれがあるため、大量の再構成は利用できません。 + + サーバータイプの変更(participant/learner)はNuRaftでサポートされていないためできません。また、サーバーを削除し追加する方法しかないため、これも誤解を招くおそれがあります。 + +- 返された `znodestat` 値は使用できません。 +- `from_version` フィールドは使用されません。`from_version` を設定したリクエストはすべて拒否されます。 + これは `/keeper/config` が仮想ノードであり、永続ストレージに保存されるのではなく、 + 指定されたノード設定に基づいてリクエストごとにリアルタイムで生成されるためです。この決定は、NuRaftがすでにこの構成を保存しているため、データの重複を防ぐために行われました。 +- ZooKeeperとは異なり、`sync` コマンドを提出することでクラスタの再構成を待つことはできません。 + 新しいコンフィグは_最終的に_適用されますが、時間保証はありません。 +- `reconfig` コマンドはさまざまな理由で失敗することがあります。更新が適用されたかどうか、クラスタの状態を確認できます。 + +## シングルノードのKeeperをクラスターに変換する + +時折、エクスペリメンタルなKeeperノードをクラスタに拡張する必要があります。3ノードクラスタへステップバイステップで変換する方法の概要は次のとおりです: + +- **重要**: 新しいノードは、現在のクォーラムより少ないバッチで追加されなければなりません、さもないと内部でリーダーを選出します。ここでは一つずつ。 +- 既存のKeeperノードは`keeper_server.enable_reconfiguration`設定パラメータをオンにする必要があります。 +- 完全な新しいKeeperクラスタ設定で2番目のノードを起動する。 +- 起動後、[reconfig](#reconfiguration)を使用してノード1に追加する。 +- 次に、3番目のノードを起動し、[reconfig](#reconfiguration)を使用して追加する。 +- 新しいKeeperノードを追加して`clickhouse-server`設定を更新し、設定を適用するために再起動する。 +- ノード1のRaft設定を更新し、必要に応じて再起動する。 + +このプロセスに自信を持つために、[サンドボックスリポジトリ](https://github.com/ClickHouse/keeper-extend-cluster)を参照してください。 + +## 未サポートの機能 + +ClickHouse KeeperはZooKeeperと完全に互換性を持つことを目指していますが、現在実装されていない機能があります(開発中です): + +- [`create`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#create(java.lang.String,byte%5B%5D,java.util.List,org.apache.zookeeper.CreateMode,org.apache.zookeeper.data.Stat)) は `Stat` オブジェクトの返却をサポートしていません +- [`create`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#create(java.lang.String,byte%5B%5D,java.util.List,org.apache.zookeeper.CreateMode,org.apache.zookeeper.data.Stat)) は [TTL](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/CreateMode.html#PERSISTENT_WITH_TTL) をサポートしていません +- [`addWatch`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#addWatch(java.lang.String,org.apache.zookeeper.Watcher,org.apache.zookeeper.AddWatchMode)) は [`PERSISTENT`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/AddWatchMode.html#PERSISTENT) ウォッチでは機能しません +- [`removeWatch`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#removeWatches(java.lang.String,org.apache.zookeeper.Watcher,org.apache.zookeeper.Watcher.WatcherType,boolean)) および [`removeAllWatches`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#removeAllWatches(java.lang.String,org.apache.zookeeper.Watcher.WatcherType,boolean)) はサポートされていません +- `setWatches` はサポートされていません +- [`CONTAINER`](https://zookeeper.apache.org/doc/r3.5.1-alpha/api/org/apache/zookeeper/CreateMode.html) タイプのznode作成はサポートされていません +- [`SASL認証`](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zookeeper+and+SASL) はサポートされていません +``` diff --git a/docs/ja/guides/sre/network-ports.md b/docs/ja/guides/sre/network-ports.md new file mode 100644 index 00000000000..03c5c6b19e4 --- /dev/null +++ b/docs/ja/guides/sre/network-ports.md @@ -0,0 +1,30 @@ +--- +slug: /ja/guides/sre/network-ports +sidebar_label: ネットワークポート +--- + +# ネットワークポート + +:::note +**デフォルト**として記載されているポートは、ポート番号が`/etc/clickhouse-server/config.xml`に設定されています。設定をカスタマイズするには、`/etc/clickhouse-server/config.d/`にファイルを追加してください。詳細は[設定ファイル](../../operations/configuration-files.md#override)のドキュメントを参照してください。 +::: + +|ポート|説明| +|----|-----------| +|2181|ZooKeeper デフォルトサービスポート。 **注: ClickHouse Keeper の場合は `9181` を参照**| +|8123|HTTP デフォルトポート| +|8443|HTTP SSL/TLS デフォルトポート| +|9000|ネイティブプロトコルポート(ClickHouse TCP プロトコルとも呼ばれます)。`clickhouse-server`, `clickhouse-client` およびネイティブ ClickHouse ツールのような ClickHouse アプリケーションとプロセスで使用されます。分散クエリのためのサーバ間通信に使用されます。| +|9004|MySQL エミュレーションポート| +|9005|PostgreSQL エミュレーションポート(ClickHouse で SSL が有効になっている場合、セキュア通信にも使用されます)。| +|9009|低レベルデータアクセスのためのサーバ間通信ポート。データ交換、レプリケーション、サーバ間通信に使用されます。| +|9010|サーバ間通信のための SSL/TLS| +|9011|ネイティブプロトコル PROXYv1 プロトコルポート| +|9019|JDBC ブリッジ| +|9100|gRPC ポート| +|9181|推奨される ClickHouse Keeper ポート| +|9234|推奨される ClickHouse Keeper Raft ポート(`1`が有効な場合、セキュア通信にも使用)| +|9363|Prometheus デフォルトメトリックポート| +|9281|推奨されるセキュア SSL ClickHouse Keeper ポート| +|9440|ネイティブプロトコル SSL/TLS ポート| +|42000|Graphite デフォルトポート| diff --git a/docs/ja/guides/sre/scaling-clusters.md b/docs/ja/guides/sre/scaling-clusters.md new file mode 100644 index 00000000000..c308b7ac3a8 --- /dev/null +++ b/docs/ja/guides/sre/scaling-clusters.md @@ -0,0 +1,18 @@ +--- +slug: /ja/guides/sre/scaling-clusters +sidebar_label: シャード再調整 +sidebar_position: 20 +description: ClickHouseは自動シャード再調整をサポートしていないため、シャードを再調整するためのベストプラクティスを提供します。 +--- + +# データの再調整 + +ClickHouseは自動シャード再調整をサポートしていませんが、以下の優先順位でシャードを再調整する方法があります: + +1. [分散テーブル](/docs/ja/engines/table-engines/special/distributed.md)のシャードを調整し、新しいシャードに書き込みを偏らせることができます。これにより、クラスタ内で負荷の不均衡やホットスポットが発生する可能性がありますが、書き込みスループットが非常に高くないほとんどのシナリオでは実行可能です。ユーザーは書き込みのターゲットを変える必要がなく、分散テーブルのままで済みます。ただし、既存のデータの再調整には役立ちません。 + +2. (1) の代替として、既存のクラスタを修正し、新しいシャードにのみ書き込むことでクラスタがバランスされるようにします。これも書き込みの重み付けを手動で行うことになります。(1)と同じ制限があります。 + +3. 既存のデータの再調整が必要で、データをパーティション化している場合は、パーティションを切り離して別のノードに手動で移動し、新しいシャードに再アタッチすることを検討してください。これは後の技術より手動が多くなりますが、より迅速でリソースを消費しない場合があります。これは手動操作であり、データの再調整を考慮する必要があります。 + +4. ソースクラスタから新しいクラスタにデータをエクスポートするために、[INSERT FROM SELECT](/docs/ja/sql-reference/statements/insert-into.md/#inserting-the-results-of-select)を使用します。これにより、非常に大きなデータセットではパフォーマンスが低下し、ソースクラスタに大幅なIOを発生させ、ネットワークリソースをかなり消費します。これは最終手段です。 diff --git a/docs/ja/guides/sre/user-management/_category_.yml b/docs/ja/guides/sre/user-management/_category_.yml new file mode 100644 index 00000000000..6123b1742ed --- /dev/null +++ b/docs/ja/guides/sre/user-management/_category_.yml @@ -0,0 +1,7 @@ +position: 5 +label: 'User and role management' +collapsible: true +collapsed: true +link: + type: generated-index + slug: /ja/guides/sre/user-role diff --git a/docs/ja/guides/sre/user-management/configuring-ldap.md b/docs/ja/guides/sre/user-management/configuring-ldap.md new file mode 100644 index 00000000000..4e9477b2c37 --- /dev/null +++ b/docs/ja/guides/sre/user-management/configuring-ldap.md @@ -0,0 +1,167 @@ +--- +sidebar_label: LDAPの設定 +sidebar_position: 2 +slug: /ja/guides/sre/configuring-ldap +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + +# ClickHouseをLDAPで認証とロールマッピングに使用する設定 + + + +ClickHouseはLDAPを使用してClickHouseデータベースユーザーを認証するように設定できます。このガイドは、公開ディレクトリに認証するLDAPシステムとClickHouseを統合する簡単な例を示します。 + +## 1. ClickHouseでのLDAP接続設定の構成 + +1. この公開LDAPサーバーへの接続をテストします: + ```bash + $ ldapsearch -x -b dc=example,dc=com -H ldap://ldap.forumsys.com + ``` + + 応答は次のようになります: + ```response + # extended LDIF + # + # LDAPv3 + # base with scope subtree + # filter: (objectclass=*) + # requesting: ALL + # + + # example.com + dn: dc=example,dc=com + objectClass: top + objectClass: dcObject + objectClass: organization + o: example.com + dc: example + ... + ``` + +2. `config.xml`ファイルを編集し、LDAPを構成するために以下を追加します: + ```xml + + + ldap.forumsys.com + 389 + uid={user_name},dc=example,dc=com + no + never + + + ``` + + :::note + ``タグは特定のLDAPサーバーを識別するための任意のラベルです。 + ::: + + 上記で使用される基本設定は次の通りです: + + |パラメータ |説明 |例 | + |----------|-----------------------|----------------| + |host |LDAPサーバーのホスト名またはIP|ldap.forumsys.com| + |port |LDAPサーバーのディレクトリポート|389| + |bind_dn |ユーザーへのテンプレートパス|uid={user_name},dc=example,dc=com| + |enable_tls|安全なLDAPを使用するかどうか|no| + |tls_require_cert |接続に証明書を必要とするかどうか|never| + + :::note + この例では、公開サーバーが389を使用し、安全なポートを使用しないため、デモ用にTLSを無効にしています。 + ::: + + :::note + LDAP設定の詳細については、[LDAPドキュメントページ](../../../operations/external-authenticators/ldap.md)を参照してください。 + ::: + +3. `` セクションに `` セクションを追加して、ユーザーロールマッピングを構成します。このセクションでは、ユーザーが認証されたときにどのロールを受け取るかが定義されます。この基本的な例では、LDAPへの認証に成功したユーザーは、ClickHouseで後ほど定義される `scientists_role` を受け取ります。このセクションは次のようになります: + ```xml + + + users.xml + + + /var/lib/clickhouse/access/ + + + test_ldap_server + + + + + dc=example,dc=com + (&(objectClass=groupOfUniqueNames)(uniqueMember={bind_dn})) + cn + + + + ``` + + 上記で使用されている基本設定は次の通りです: + + |パラメータ |説明 |例 | + |----------|-----------------------|----------------| + |server |前のldap_serversセクションで定義されたラベル|test_ldap_server| + |roles |ユーザーがマッピングされるClickHouseで定義されたロール名|scientists_role| + |base_dn |グループを検索するベースパス|dc=example,dc=com| + |search_filter|ユーザーをマッピングするために選択すべきグループを識別するldap検索フィルター|(&(objectClass=groupOfUniqueNames)(uniqueMember={bind_dn}))| + |attribute |戻されるべき値がある属性名|cn| + +4. 設定を適用するためにClickHouseサーバーを再起動します。 + +## 2. ClickHouseデータベースのロールと権限を構成 + +:::note +このセクションの手順は、ClickHouseでSQLアクセス制御とアカウント管理が有効になっていることを前提としています。有効化するには、[SQLユーザーとロールガイド](index.md)を参照してください。 +::: + +1. `config.xml`ファイルのロールマッピングセクションで使用されているのと同じ名前でClickHouseにロールを作成します + ```sql + CREATE ROLE scientists_role; + ``` + +2. 必要な特権をロールに付与します。次のステートメントは、LDAPを通して認証された任意のユーザーに管理者特権を付与します: + ```sql + GRANT ALL ON *.* TO scientists_role; + ``` + +## 3. LDAP設定のテスト + +1. ClickHouseクライアントを使用してログインします + ```bash + $ clickhouse-client --user einstein --password password + ClickHouse client version 22.2.2.1. + Connecting to localhost:9000 as user einstein. + Connected to ClickHouse server version 22.2.2 revision 54455. + + chnode1 :) + ``` + + :::note + ステップ1の`ldapsearch`コマンドを使用して、ディレクトリ内のすべてのユーザーを表示し、すべてのユーザーのパスワードは`password`です。 + ::: + +2. ユーザーが`scientists_role`ロールに正しくマッピングされ、管理者権限を持っていることをテストします + ```sql + SHOW DATABASES + ``` + + ```response + Query id: 93b785ff-1482-4eda-95b0-b2d68b2c5e0f + + ┌─name───────────────┐ + │ INFORMATION_SCHEMA │ + │ db1_mysql │ + │ db2 │ + │ db3 │ + │ db4_mysql │ + │ db5_merge │ + │ default │ + │ information_schema │ + │ system │ + └────────────────────┘ + + 9 rows in set. Elapsed: 0.004 sec. + ``` + +## サマリー +この記事では、ClickHouseをLDAPサーバーに認証させ、ロールにマッピングする基本を示しました。ClickHouse内で個々のユーザーを構成し、自動ロールマッピングを構成せずにLDAPで認証するオプションもあります。LDAPモジュールはActive Directoryへの接続にも使用できます。 diff --git a/docs/ja/guides/sre/user-management/index.md b/docs/ja/guides/sre/user-management/index.md new file mode 100644 index 00000000000..60e84bd1f1e --- /dev/null +++ b/docs/ja/guides/sre/user-management/index.md @@ -0,0 +1,535 @@ +--- +slug: /ja/operations/access-rights +sidebar_position: 1 +sidebar_label: ユーザーとロール +title: アクセス制御とアカウント管理 +--- + +# ClickHouseでのユーザーとロールの作成 + +ClickHouseは[RBAC](https://en.wikipedia.org/wiki/Role-based_access_control)アプローチに基づくアクセス制御管理をサポートしています。 + +ClickHouseのアクセスエンティティ: +- [ユーザーアカウント](#user-account-management) +- [ロール](#role-management) +- [行ポリシー](#row-policy-management) +- [設定プロファイル](#settings-profiles-management) +- [クォータ](#quotas-management) + +アクセスエンティティは以下の方法で設定できます: + +- SQL駆動のワークフロー。 + + この機能を[有効化](#enabling-access-control)する必要があります。 + +- サーバーの[設定ファイル](/docs/ja/operations/configuration-files.md) `users.xml` と `config.xml`。 + +SQL駆動のワークフローを使用することをお勧めします。両方の設定方法は同時に動作するため、アカウントやアクセス権をサーバー設定ファイルで管理している場合も、スムーズにSQL駆動のワークフローに移行できます。 + +:::note +同じアクセスエンティティを両方の設定方法で同時に管理することはできません。 +::: + +:::note +ClickHouse Cloud Consoleユーザーの管理については、この[ページ](https://clickhouse.com/docs/ja/security/cloud-access-management.md)を参照してください。 +::: + +すべてのユーザー、ロール、プロファイルなどとそのすべての付与を確認するには、[SHOW ACCESS](/docs/ja/sql-reference/statements/show.md#show-access-statement)ステートメントを使用します。 + +## 概要 {#access-control-usage} + +デフォルトでは、ClickHouseサーバーにはSQL駆動のアクセス制御とアカウント管理を使用できないがすべての権限を持つ`default`ユーザーアカウントが用意されています。`default`ユーザーアカウントは、例えばクライアントからログインするときや分散クエリでユーザー名が定義されていない場合に使用されます。分散クエリ処理では、サーバーやクラスターの設定で[user and password](/docs/ja/engines/table-engines/special/distributed.md)プロパティが指定されていない場合、デフォルトのユーザーアカウントが使用されます。 + +ClickHouseを使い始めたばかりの場合、以下のシナリオを検討してください: + +1. `default`ユーザーに対してSQL駆動のアクセス制御とアカウント管理を[有効化](#enabling-access-control)します。 +2. `default`ユーザーアカウントにログインし、必要なすべてのユーザーを作成します。管理者アカウントを作成することを忘れずに行ってください(`GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION`)。 +3. `default`ユーザーの[権限を制限](/docs/ja/operations/settings/permissions-for-queries.md#permissions_for_queries)し、そのSQL駆動のアクセス制御とアカウント管理を無効化します。 + +### 現在のソリューションの特性 {#access-control-properties} + +- データベースやテーブルが存在しなくても権限を付与することが可能です。 +- テーブルが削除されても、そのテーブルに対応するすべての特権は取り消されません。つまり、後で同じ名前の新しいテーブルを作成しても、特権は有効なままです。削除されたテーブルに対応する特権を取り消すには、例えば`REVOKE ALL PRIVILEGES ON db.table FROM ALL`クエリを実行する必要があります。 +- 特権に関する有効期限の設定は存在しません。 + +### ユーザーアカウント {#user-account-management} + +ユーザーアカウントは、ClickHouseでの認証を可能にするアクセスエンティティです。ユーザーアカウントには以下が含まれます: + +- 識別情報。 +- ユーザーが実行できるクエリの範囲を定義する[特権](/docs/ja/sql-reference/statements/grant.md#privileges)。 +- ClickHouseサーバーへの接続が許可されたホスト。 +- 割り当てられた、またはデフォルトのロール。 +- ユーザーのログイン時にデフォルトで適用される制約を持つ設定。 +- 割り当てられた設定プロファイル。 + +特権は[GRANT](/docs/ja/sql-reference/statements/grant.md)クエリを用いてユーザーアカウントに付与されるか、[ロール](#role-management)を割り当てることによって付与されます。ユーザーから特権を取り消すには、ClickHouseは[REVOKE](/docs/ja/sql-reference/statements/revoke.md)クエリを提供します。ユーザーの特権を一覧表示するには、[SHOW GRANTS](/docs/ja/sql-reference/statements/show.md#show-grants-statement)ステートメントを使用します。 + +管理クエリ: + +- [CREATE USER](/docs/ja/sql-reference/statements/create/user.md) +- [ALTER USER](/docs/ja/sql-reference/statements/alter/user.md#alter-user-statement) +- [DROP USER](/docs/ja/sql-reference/statements/drop.md) +- [SHOW CREATE USER](/docs/ja/sql-reference/statements/show.md#show-create-user-statement) +- [SHOW USERS](/docs/ja/sql-reference/statements/show.md#show-users-statement) + +### 設定の適用 {#access-control-settings-applying} + +設定は異なる方法で構成することができます:ユーザーアカウント、デフォルトで割り当てられたロールおよび設定プロファイルにおいて、ログイン時に適用される設定の値と制約は以下の通り(優先順位が高い順)です: + +1. ユーザーアカウントの設定。 +2. ユーザーアカウントのデフォルトロールの設定。ある設定が複数のロールで構成されている場合、その設定の適用順序は未定義です。 +3. ユーザーまたはそのデフォルトロールに割り当てられた設定プロファイルの設定。ある設定が複数のプロファイルで構成されている場合、その設定の適用順序は未定義です。 +4. サーバー全体にデフォルトで適用される設定または[デフォルトプロファイル](/docs/ja/operations/server-configuration-parameters/settings.md#default-profile)からの設定。 + +### ロール {#role-management} + +ロールは、ユーザーアカウントに付与されるアクセスエンティティのコンテナです。 + +ロールには以下が含まれます: + +- [特権](/docs/ja/sql-reference/statements/grant.md#grant-privileges) +- 設定と制約 +- 割り当てられたロールのリスト + +管理クエリ: + +- [CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md) +- [ALTER ROLE](/docs/ja/sql-reference/statements/alter/role.md#alter-role-statement) +- [DROP ROLE](/docs/ja/sql-reference/statements/drop.md) +- [SET ROLE](/docs/ja/sql-reference/statements/set-role.md) +- [SET DEFAULT ROLE](/docs/ja/sql-reference/statements/set-role.md#set-default-role-statement) +- [SHOW CREATE ROLE](/docs/ja/sql-reference/statements/show.md#show-create-role-statement) +- [SHOW ROLES](/docs/ja/sql-reference/statements/show.md#show-roles-statement) + +特権は[GRANT](/docs/ja/sql-reference/statements/grant.md)クエリを使用してロールに付与できます。ロールから特権を取り消すには、ClickHouseは[REVOKE](/docs/ja/sql-reference/statements/revoke.md)クエリを提供します。 + +#### 行ポリシー {#row-policy-management} + +行ポリシーは、ユーザーまたはロールに利用可能な行を定義するフィルターです。行ポリシーには特定のテーブル用のフィルターと、その行ポリシーを使用するロールやユーザーのリストが含まれます。 + +:::note +行ポリシーは読み取り専用アクセスのユーザーに対してのみ意味を持ちます。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーできる場合、行ポリシーの制限は効果が薄れます。 +::: + +管理クエリ: + +- [CREATE ROW POLICY](/docs/ja/sql-reference/statements/create/row-policy.md) +- [ALTER ROW POLICY](/docs/ja/sql-reference/statements/alter/row-policy.md#alter-row-policy-statement) +- [DROP ROW POLICY](/docs/ja/sql-reference/statements/drop.md#drop-row-policy-statement) +- [SHOW CREATE ROW POLICY](/docs/ja/sql-reference/statements/show.md#show-create-row-policy-statement) +- [SHOW POLICIES](/docs/ja/sql-reference/statements/show.md#show-policies-statement) + +### 設定プロファイル {#settings-profiles-management} + +設定プロファイルは、[設定](/docs/ja/operations/settings/index.md)のコレクションです。設定プロファイルには、設定と制約、そしてこのプロファイルが適用されるロールやユーザーのリストが含まれます。 + +管理クエリ: + +- [CREATE SETTINGS PROFILE](/docs/ja/sql-reference/statements/create/settings-profile.md#create-settings-profile-statement) +- [ALTER SETTINGS PROFILE](/docs/ja/sql-reference/statements/alter/settings-profile.md#alter-settings-profile-statement) +- [DROP SETTINGS PROFILE](/docs/ja/sql-reference/statements/drop.md#drop-settings-profile-statement) +- [SHOW CREATE SETTINGS PROFILE](/docs/ja/sql-reference/statements/show.md#show-create-settings-profile-statement) +- [SHOW PROFILES](/docs/ja/sql-reference/statements/show.md#show-profiles-statement) + +### クォータ {#quotas-management} + +クォータはリソースの使用を制限します。詳しくは[クォータ](/docs/ja/operations/quotas.md)を参照してください。 + +クォータは、一定期間に関する制限のセットと、このクォータを使用する必要があるロールやユーザーのリストを含みます。 + +管理クエリ: + +- [CREATE QUOTA](/docs/ja/sql-reference/statements/create/quota.md) +- [ALTER QUOTA](/docs/ja/sql-reference/statements/alter/quota.md#alter-quota-statement) +- [DROP QUOTA](/docs/ja/sql-reference/statements/drop.md#drop-quota-statement) +- [SHOW CREATE QUOTA](/docs/ja/sql-reference/statements/show.md#show-create-quota-statement) +- [SHOW QUOTA](/docs/ja/sql-reference/statements/show.md#show-quota-statement) +- [SHOW QUOTAS](/docs/ja/sql-reference/statements/show.md#show-quotas-statement) + +### SQL駆動のアクセス制御とアカウント管理の有効化 {#enabling-access-control} + +- 設定の保存用ディレクトリを設定します。 + + ClickHouseは、アクセスエンティティの設定を[access_control_path](/docs/ja/operations/server-configuration-parameters/settings.md#access_control_path)サーバー設定パラメータで設定されたフォルダに保存します。 + +- 少なくとも1つのユーザーアカウントに対してSQL駆動のアクセス制御とアカウント管理を有効化します。 + + デフォルトでは、SQL駆動のアクセス制御とアカウント管理はすべてのユーザーに対して無効になっています。少なくとも1人のユーザーを`users.xml`設定ファイルに設定し、[`access_management`](/docs/ja/operations/settings/settings-users.md#access_management-user-setting)、`named_collection_control`、`show_named_collections`、`show_named_collections_secrets`設定の値を1に設定する必要があります。 + +## SQLユーザーとロールの定義 + +:::tip +ClickHouse Cloudで作業する場合は、[クラウドアクセス管理](/docs/ja/cloud/security/cloud-access-management)を参照してください。 +::: + +この記事では、SQLユーザーとロールの基本的な定義方法と、それらの特権と権限をデータベース、テーブル、行、カラムに適用する方法を示します。 + +### SQLユーザーモードの有効化 + +1. `users.xml`ファイルの``ユーザーの下にSQLユーザーモードを有効にします: + ```xml + 1 + 1 + 1 + 1 + ``` + + :::note + `default`ユーザーは、新しくインストールした際に作成される唯一のユーザーであり、デフォルトではノード間の通信に使用されるアカウントでもあります。 + + 本番環境では、ノード間通信がSQL管理者ユーザーで設定されている場合や、``、クラスターの認証情報、および/またはノード間HTTPおよびトランスポートプロトコルの認証情報で設定されている場合には、このユーザーを無効にすることを推奨します。 + ::: + +2. ノードを再起動して、変更を適用します。 + +3. ClickHouseクライアントを起動します: + ```sql + clickhouse-client --user default --password + ``` +### ユーザーの定義 + +1. SQL管理者アカウントを作成します: + ```sql + CREATE USER clickhouse_admin IDENTIFIED BY 'password'; + ``` +2. 新しいユーザーに完全な管理権限を付与します: + ```sql + GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION; + ``` + + + +## ALTER権限 + +この記事は、特権をどのように定義し、特権ユーザーに対して`ALTER`ステートメントを使用する場合の権限がどのように機能するかをよりよく理解するためのものです。 + +`ALTER`ステートメントは、いくつかのカテゴリーに分かれています。その中には階層的なものと、明示的に定義されるべきものが存在します。 + +**DB、テーブル、ユーザーの構成例** + +1. 管理者ユーザーでサンプルユーザーを作成します: +```sql +CREATE USER my_user IDENTIFIED BY 'password'; +``` + +2. サンプルデータベースを作成します: +```sql +CREATE DATABASE my_db; +``` + +3. サンプルテーブルを作成します: +```sql +CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id; +``` + +4. 権限の付与/取消しを行うサンプル管理者ユーザーを作成します: +```sql +CREATE USER my_alter_admin IDENTIFIED BY 'password'; +``` + +:::note +権限を付与または取消するには、管理者ユーザーが`WITH GRANT OPTION`特権を持っている必要があります。 +例えば: + ```sql + GRANT ALTER ON my_db.* WITH GRANT OPTION + ``` +ユーザーに権限を付与または取り消すためには、まずそのユーザー自身がこれらの権限を持っている必要があります。 +::: + +**権限の付与または取消し** + +`ALTER`の階層: + +``` +. +├── ALTER (テーブルとビューのみ)/ +│ ├── ALTER TABLE/ +│ │ ├── ALTER UPDATE +│ │ ├── ALTER DELETE +│ │ ├── ALTER COLUMN/ +│ │ │ ├── ALTER ADD COLUMN +│ │ │ ├── ALTER DROP COLUMN +│ │ │ ├── ALTER MODIFY COLUMN +│ │ │ ├── ALTER COMMENT COLUMN +│ │ │ ├── ALTER CLEAR COLUMN +│ │ │ └── ALTER RENAME COLUMN +│ │ ├── ALTER INDEX/ +│ │ │ ├── ALTER ORDER BY +│ │ │ ├── ALTER SAMPLE BY +│ │ │ ├── ALTER ADD INDEX +│ │ │ ├── ALTER DROP INDEX +│ │ │ ├── ALTER MATERIALIZE INDEX +│ │ │ └── ALTER CLEAR INDEX +│ │ ├── ALTER CONSTRAINT/ +│ │ │ ├── ALTER ADD CONSTRAINT +│ │ │ └── ALTER DROP CONSTRAINT +│ │ ├── ALTER TTL/ +│ │ │ └── ALTER MATERIALIZE TTL +│ │ ├── ALTER SETTINGS +│ │ ├── ALTER MOVE PARTITION +│ │ ├── ALTER FETCH PARTITION +│ │ └── ALTER FREEZE PARTITION +│ └── ALTER LIVE VIEW/ +│ ├── ALTER LIVE VIEW REFRESH +│ └── ALTER LIVE VIEW MODIFY QUERY +├── ALTER DATABASE +├── ALTER USER +├── ALTER ROLE +├── ALTER QUOTA +├── ALTER [ROW] POLICY +└── ALTER [SETTINGS] PROFILE +``` + +1. ユーザーまたはロールに`ALTER`権限を付与する + +`GRANT ALTER on *.* TO my_user`を使用すると、トップレベルの`ALTER TABLE`と`ALTER VIEW`にのみ影響し、その他の`ALTER`ステートメントは個別に付与または取り消す必要があります。 + +例えば、基本的な`ALTER`特権を付与する: +```sql +GRANT ALTER ON my_db.my_table TO my_user; +``` + +結果として付与される特権のセット: +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3 + +┌─GRANTS FOR my_user───────────────────────────────────────────┐ +│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user │ +└──────────────────────────────────────────────────────────────┘ +``` + +これにより、上記の例から`ALTER TABLE`と`ALTER VIEW`の下にあるすべての権限が付与されますが、`ALTER ROW POLICY`などの他の`ALTER`権限は付与されません(階層図に戻ると、`ALTER ROW POLICY`が`ALTER TABLE`または`ALTER VIEW`の子でないことがわかります)。これらは明示的に付与または取り消す必要があります。 + +例えば、次のように一部の`ALTER`特権が必要な場合、それぞれを別々に付与できます。副権限がある場合、それらも自動的に付与されます。 + +例: +```sql +GRANT ALTER COLUMN ON my_db.my_table TO my_user; +``` + +付与されたものは次のようになります: +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2 + +┌─GRANTS FOR my_user────────────────────────────────┐ +│ GRANT ALTER COLUMN ON default.my_table TO my_user │ +└───────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +これにより、次のような副権限も与えられます: +```sql +ALTER ADD COLUMN +ALTER DROP COLUMN +ALTER MODIFY COLUMN +ALTER COMMENT COLUMN +ALTER CLEAR COLUMN +ALTER RENAME COLUMN +``` + +2. ユーザーおよびロールから`ALTER`権限を取り消す + +`REVOKE`ステートメントは、`GRANT`ステートメントと同様に機能します。 + +ユーザーまたはロールに副権限が付与された場合、その副権限を直接取り消すか、次の上位レベルの権限を取り消すことができます。 + +例:ユーザーに`ALTER ADD COLUMN`が付与された場合 +```sql +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user + +Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739 + +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683 + +┌─GRANTS FOR my_user──────────────────────────────────┐ +│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │ +└─────────────────────────────────────────────────────┘ +``` + +権限を個別に取り消すこともできます: +```sql +REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user; +``` + +あるいは、どの上位レベルからでも取り消すことができます(すべてのCOLUMN副権限を取り消します): +``` +REVOKE ALTER COLUMN ON my_db.my_table FROM my_user; +``` + +```response +REVOKE ALTER COLUMN ON my_db.my_table FROM my_user + +Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc + +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: e7d341de-de65-490b-852c-fa8bb8991174 + +Ok. + +0 rows in set. Elapsed: 0.003 sec. +``` + +**補足** + +権限は、`WITH GRANT OPTION`を持つユーザーによって付与される必要があり、さらにそのユーザー自身がその権限を持っている必要があります。 + +1. 管理者ユーザーに権限を付与し、特権のセットを管理することを許可する場合 +例: +```sql +GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION; +``` + +このユーザーは、`ALTER COLUMN`およびすべてのサブ特権を付与または取り消すことができます。 + +**テスト** + +1. `SELECT`権限を追加します: +```sql + GRANT SELECT ON my_db.my_table TO my_user; +``` + +2. ユーザーにカラム追加権限を与える: +```sql +GRANT ADD COLUMN ON my_db.my_table TO my_user; +``` + +3. 制限付きユーザーでログインする: +```bash +clickhouse-client --user my_user --password password --port 9000 --host +``` + +4. カラムを追加してみる: +```sql +ALTER TABLE my_db.my_table ADD COLUMN column2 String; +``` + +```response +ALTER TABLE my_db.my_table + ADD COLUMN `column2` String + +Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5 + +Ok. + +0 rows in set. Elapsed: 0.010 sec. +``` + +```sql +DESCRIBE my_db.my_table; +``` + +```response +DESCRIBE TABLE my_db.my_table + +Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272 + +┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ UInt64 │ │ │ │ │ │ +│ column1 │ String │ │ │ │ │ │ +│ column2 │ String │ │ │ │ │ │ +└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +4. カラムを削除してみる: +```sql +ALTER TABLE my_db.my_table DROP COLUMN column2; +``` + +```response +ALTER TABLE my_db.my_table + DROP COLUMN column2 + +Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47 + + +0 rows in set. Elapsed: 0.004 sec. + +Received exception from server (version 22.5.1): +Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED) +``` + +5. alter管理者を利用して権限を付与するテスト +```sql +GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION; +``` + +6. alter管理者ユーザーでログイン: +```bash +clickhouse-client --user my_alter_admin --password password --port 9000 --host +``` + +7. サブ特権を付与する: +```sql +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user + +Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba + +Ok. +``` + +8. 権限を持たないalter管理者ユーザーが持っていないサブ特権を持たない特権を付与しようとするテスト。 +```sql +GRANT ALTER UPDATE ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER UPDATE ON my_db.my_table TO my_user + +Query id: 191690dc-55a6-4625-8fee-abc3d14a5545 + + +0 rows in set. Elapsed: 0.004 sec. + +Received exception from server (version 22.5.1): +Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED) +``` + +**まとめ** + +`ALTER`特権はテーブルおよびビューに対する`ALTER`に対して階層的ですが、他の`ALTER`ステートメントには適用されません。特権は細かいレベルや特権のグループに設定でき、同様に取り消すこともできます。権限を設定するユーザーは、`WITH GRANT OPTION`を持っている必要があり、設定するユーザー自身を含む、その権限を既に持っている必要があります。操作を行うユーザーは、もし付与オプション権限を自分でも持っていない場合、自分自身の特権を取り消すことはできません。 + diff --git a/docs/ja/guides/sre/user-management/ssl-user-auth.md b/docs/ja/guides/sre/user-management/ssl-user-auth.md new file mode 100644 index 00000000000..c96c6906d06 --- /dev/null +++ b/docs/ja/guides/sre/user-management/ssl-user-auth.md @@ -0,0 +1,134 @@ +--- +sidebar_label: SSLユーザー証明書認証 +sidebar_position: 3 +slug: /ja/guides/sre/ssl-user-auth +--- + +# SSLユーザー証明書の認証設定 +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +このガイドでは、SSLユーザー証明書を使用して認証を設定するためのシンプルで最小限の設定を提供します。このチュートリアルは、[SSL-TLSの設定ガイド](../configuring-ssl.md)に基づいています。 + +:::note +SSLユーザー認証は、`https`またはネイティブインターフェースを使用する場合のみサポートされています。現在、gRPCやPostgreSQL/MySQLエミュレーションポートでは使用されていません。 + +ClickHouseノードは、安全な認証のために`strict`を設定する必要があります(`relaxed`はテスト目的で機能します)。 +::: + +## 1. SSLユーザー証明書を作成 + +:::note +この例では、自己署名されたCAを使用した自己署名証明書を使用しています。プロダクション環境では、CSRを作成し、PKIチームまたは証明書プロバイダーに提出して適切な証明書を取得してください。 +::: + +1. 証明書署名要求(CSR)とキーを生成します。基本的な形式は次のとおりです: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=:" -keyout .key -out .csr + ``` + この例では、サンプル環境で使用されるドメインとユーザーに対してこれを使用します: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user" -keyout chnode1_cert_user.key -out chnode1_cert_user.csr + ``` + :::note + CNは任意であり、証明書の識別子として任意の文字列を使用できます。次のステップでユーザーを作成する際に使用されます。 + ::: + +2. 認証に使用する新しいユーザー証明書を生成し、署名します。基本的な形式は次のとおりです: + ```bash + openssl x509 -req -in .csr -out .crt -CA .crt -CAkey .key -days 365 + ``` + この例では、サンプル環境で使用されるドメインとユーザーに対してこれを使用します: + ```bash + openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 + ``` + +## 2. SQLユーザーを作成し、権限を付与 + +:::note +SQLユーザーを有効にしてロールを設定する方法の詳細については、[SQLユーザーとロールの定義](index.md)ユーザーガイドを参照してください。 +::: + +1. 証明書認証を使用するように定義されたSQLユーザーを作成します: + ```sql + CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user'; + ``` + +2. 新しい証明書ユーザーに権限を付与します: + ```sql + GRANT ALL ON *.* TO cert_user WITH GRANT OPTION; + ``` + :::note + この演習ではデモンストレーション目的でユーザーにフル管理者権限を付与しています。権限設定についてはClickHouseの[RBACドキュメント](/docs/ja/guides/sre/user-management/index.md)を参照してください。 + ::: + + :::note + ユーザーとロールを定義するためにSQLを使用することをお勧めしますが、現在設定ファイルでユーザーとロールを定義している場合、ユーザーは次のようになります: + ```xml + + + + chnode1.marsnet.local:cert_user + + + ::/0 + + default + 1 + + + + ``` + ::: + +## 3. テスト + +1. ユーザー証明書、ユーザーキー、CA証明書をリモートノードにコピーします。 + +2. 証明書とパスを指定して、ClickHouseの[クライアント設定](/docs/ja/interfaces/cli.md#configuration_files)でOpenSSLを構成します。 + + ```xml + + + my_cert_name.crt + my_cert_name.key + my_ca_cert.crt + + + ``` + +3. `clickhouse-client`を実行します。 + ``` + clickhouse-client --user --query 'SHOW TABLES' + ``` + :::note + 設定で証明書が指定されている場合、clickhouse-clientに渡されるパスワードは無視されることに注意してください。 + ::: + +## 4. HTTPのテスト + +1. ユーザー証明書、ユーザーキー、CA証明書をリモートノードにコピーします。 + +2. `curl`を使用してサンプルSQLコマンドをテストします。基本的な形式は次のとおりです: + ```bash + echo 'SHOW TABLES' | curl 'https://:8443' --cert .crt --key .key --cacert .crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: " --data-binary @- + ``` + 例えば: + ```bash + echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @- + ``` + 出力は次のようになります: + ```response + INFORMATION_SCHEMA + default + information_schema + system + ``` + :::note + パスワードが指定されていないことに注意してください。ClickHouseはパスワードの代わりに証明書を使用してユーザーを認証します。 + ::: + +## まとめ + +この記事では、SSL証明書認証のためのユーザーを作成し設定する基本を紹介しました。この方法は、`clickhouse-client`または`https`インターフェースをサポートし、HTTPヘッダーを設定できるクライアントで使用できます。生成された証明書とキーはプライベートに保ち、限られたアクセスのみを許可してください。証明書とキーはパスワードと同様に扱ってください。 diff --git a/docs/ja/guides/troubleshooting.md b/docs/ja/guides/troubleshooting.md new file mode 100644 index 00000000000..0c202c5ac11 --- /dev/null +++ b/docs/ja/guides/troubleshooting.md @@ -0,0 +1,193 @@ +--- +title: "トラブルシューティング" +--- + +## インストール + +### apt-keyでkeyserver.ubuntu.comからGPGキーをインポートできない + +[Advanced package tool (APT)の`apt-key`機能は廃止されています](https://manpages.debian.org/bookworm/apt/apt-key.8.en.html)。代わりに`gpg`コマンドを使用する必要があります。[インストールガイド](../getting-started/install.md)の記事を参照してください。 + +### gpgでkeyserver.ubuntu.comからGPGキーをインポートできない + +1. `gpg`がインストールされているか確認します: + +```shell +sudo apt-get install gnupg +``` + +### apt-getでClickHouseリポジトリからdebパッケージを取得できない + +1. ファイアウォールの設定を確認します。 +2. 何らかの理由でリポジトリにアクセスできない場合は、[インストールガイド](../getting-started/install.md)の記事で説明されているようにパッケージをダウンロードし、`sudo dpkg -i `コマンドを使って手動でインストールします。また、`tzdata`パッケージも必要です。 + +### apt-getでClickHouseリポジトリからdebパッケージを更新できない + +この問題はGPGキーが変更されたときに発生する可能性があります。 + +リポジトリ設定を更新するには、[設定](../getting-started/install.md#setup-the-debian-repository)ページのマニュアルを使用してください。 + +### `apt-get update`で異なる警告が出る + +警告メッセージの例は次のいずれかです: + +```shell +N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://packages.clickhouse.com/deb stable InRelease' doesn't support architecture 'i386' +``` + +```shell +E: Failed to fetch https://packages.clickhouse.com/deb/dists/stable/main/binary-amd64/Packages.gz File has unexpected size (30451 != 28154). Mirror sync in progress? +``` + +```shell +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Origin' value from 'Artifactory' to 'ClickHouse' +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Label' value from 'Artifactory' to 'ClickHouse' +N: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Suite' value from 'stable' to '' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. +``` + +```shell +Err:11 https://packages.clickhouse.com/deb stable InRelease +400 Bad Request [IP: 172.66.40.249 443] +``` + +上記の問題を解決するには、以下のスクリプトを使用してください: + +```shell +sudo rm /var/lib/apt/lists/packages.clickhouse.com_* /var/lib/dpkg/arch /var/lib/apt/lists/partial/packages.clickhouse.com_* +sudo apt-get clean +sudo apt-get autoclean +``` + +### 不正な署名のためにYumでパッケージを取得できない + +可能性のある問題: キャッシュが間違っている、または2022-09に更新されたGPGキー後に破損した可能性があります。 + +解決方法は、Yumのキャッシュとlibディレクトリをクリアすることです: + +```shell +sudo find /var/lib/yum/repos/ /var/cache/yum/ -name 'clickhouse-*' -type d -exec rm -rf {} + +sudo rm -f /etc/yum.repos.d/clickhouse.repo +``` + +その後、[インストールガイド](../getting-started/install.md#from-rpm-packages)に従ってください。 + +## サーバーへの接続 + +可能性のある問題: + +- サーバーが稼働していない。 +- 予期せぬ、または間違った構成パラメータ。 + +### サーバーが稼働していない + +#### サーバーが稼働しているか確認 + +```shell +sudo service clickhouse-server status +``` + +サーバーが稼働していない場合は、次のコマンドで開始してください: + +```shell +sudo service clickhouse-server start +``` + +#### ログを確認 + +`clickhouse-server`のメインログはデフォルトで`/var/log/clickhouse-server/clickhouse-server.log`にあります。 + +サーバーが正常に開始した場合、次の文字列が表示されます: + +- ` Application: starting up.` — サーバーが開始されました。 +- ` Application: Ready for connections.` — サーバーが稼働中で接続可能です。 + +構成エラーで`clickhouse-server`の開始が失敗した場合、``文字列とエラーの説明が表示されます。例: + +```plaintext +2019.01.11 15:23:25.549505 [ 45 ] {} ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused +``` + +ファイルの末尾にエラーが表示されない場合は、次の文字列からファイル全体を確認してください: + +```plaintext + Application: starting up. +``` + +サーバーに`clickhouse-server`の2番目のインスタンスを開始しようとすると、次のログが表示されます: + +```plaintext +2019.01.11 15:25:11.151730 [ 1 ] {} : Starting ClickHouse 19.1.0 with revision 54413 +2019.01.11 15:25:11.154578 [ 1 ] {} Application: starting up +2019.01.11 15:25:11.156361 [ 1 ] {} StatusFile: Status file ./status already exists - unclean restart. Contents: +PID: 8510 +Started at: 2019-01-11 15:24:23 +Revision: 54413 + +2019.01.11 15:25:11.156673 [ 1 ] {} Application: DB::Exception: Cannot lock file ./status. Another server instance in same directory is already running. +2019.01.11 15:25:11.156682 [ 1 ] {} Application: shutting down +2019.01.11 15:25:11.156686 [ 1 ] {} Application: Uninitializing subsystem: Logging Subsystem +2019.01.11 15:25:11.156716 [ 2 ] {} BaseDaemon: Stop SignalListener thread +``` + +#### system.dログを確認 + +`clickhouse-server`ログに有用な情報が見つからない場合、またはログがない場合は、次のコマンドを使用して`system.d`ログを確認できます: + +```shell +sudo journalctl -u clickhouse-server +``` + +#### インタラクティブモードでclickhouse-serverを起動 + +```shell +sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml +``` + +このコマンドは、autostartスクリプトの標準パラメータを使用してサーバーをインタラクティブアプリとして起動します。このモードでは、`clickhouse-server`はすべてのイベントメッセージをコンソールに表示します。 + +### 構成パラメータ + +確認事項: + +1. Dockerの設定: + + - DockerでClickHouseを実行する際にIPv6ネットワークを使用する場合、`network=host`が設定されていることを確認してください。 + +1. エンドポイントの設定。 + - [listen_host](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-listen_host)と[tcp_port](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port)の設定を確認してください。 + - ClickHouseサーバーはデフォルトでlocalhost接続のみ受け入れます。 + +1. HTTPプロトコルの設定: + + - HTTP APIのプロトコル設定を確認します。 + +1. セキュア接続の設定。 + + - 次を確認してください: + - [tcp_port_secure](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure)の設定。 + - [SSL証明書](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl)の設定。 + - 接続する際には適切なパラメータを使用してください。例えば、`clickhouse_client`には`port_secure`パラメータを使用します。 + +1. ユーザー設定: + + - 間違ったユーザー名またはパスワードを使用している可能性があります。 + +## クエリ処理 + +ClickHouseがクエリを処理できない場合、クライアントにエラーの説明を送信します。`clickhouse-client`では、コンソールにエラーの説明が表示されます。HTTPインターフェースを使用している場合、ClickHouseは応答ボディにエラーの説明を送信します。例えば: + +```shell +$ curl 'http://localhost:8123/' --data-binary "SELECT a" +Code: 47, e.displayText() = DB::Exception: Unknown identifier: a. Note that there are no tables (FROM clause) in your query, context: required_names: 'a' source_tables: table_aliases: private_aliases: column_aliases: public_columns: 'a' masked_columns: array_join_columns: source_columns: , e.what() = DB::Exception +``` + +`stack-trace`パラメータで`clickhouse-client`を起動すると、エラーの説明と共にサーバーのスタックトレースが返されます。 + +接続が切断されたというメッセージを見ることがあります。この場合、クエリを再実行することができます。クエリを実行するたびに接続が切断される場合は、サーバーログでエラーを確認してください。 + +## クエリ処理の効率 + +ClickHouseが非常に遅く動作している場合、クエリに対するサーバーのリソースとネットワーク負荷をプロファイルする必要があります。 + +clickhouse-benchmarkユーティリティを使用してクエリをプロファイルできます。これは、1秒あたりに処理されるクエリの数、1秒あたりに処理される行の数、およびクエリ処理時間のパーセンタイルを表示します。 diff --git a/docs/ja/guides/writing-queries.md b/docs/ja/guides/writing-queries.md new file mode 100644 index 00000000000..0830338a071 --- /dev/null +++ b/docs/ja/guides/writing-queries.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 3 +sidebar_label: SELECT クエリ +--- + +# ClickHouse の SELECT クエリ + +ClickHouse は SQL データベースであり、データのクエリは既にお馴染みの `SELECT` クエリを書くことで行えます。例えば以下のように使用します: + +```sql +SELECT * +FROM helloworld.my_first_table +ORDER BY timestamp +``` + +:::note +構文や利用可能な句、オプションの詳細については、[SQL リファレンス](../sql-reference/statements/select/index.md) を参照してください。 +::: + +応答はきれいなテーブル形式で返ってくることに注目してください: + +```response +┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ +│ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ +│ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ +│ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ +│ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ +└─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + +4 rows in set. Elapsed: 0.008 sec. +``` + +`FORMAT` 句を追加して、ClickHouseでサポートされている多くの出力フォーマットの一つを指定することができます: + +```sql +SELECT * +FROM helloworld.my_first_table +ORDER BY timestamp +FORMAT TabSeparated +``` + +上記のクエリでは、出力はタブ区切りで返されます: + +```response +Query id: 3604df1c-acfd-4117-9c56-f86c69721121 + +102 Insert a lot of rows per batch 2022-03-21 00:00:00 1.41421 +102 Sort your data based on your commonly-used queries 2022-03-22 00:00:00 2.718 +101 Hello, ClickHouse! 2022-03-22 14:04:09 -1 +101 Granules are the smallest chunks of data read 2022-03-22 14:04:14 3.14159 + +4 rows in set. Elapsed: 0.005 sec. +``` + +:::note +ClickHouse は 70 以上の入力および出力フォーマットをサポートしており、数千の関数とすべてのデータフォーマットとの組み合わせで、ClickHouse を使用して印象的で高速な ETL のようなデータ変換を実行できます。実際、データを変換するために ClickHouse サーバーを起動する必要すらありません。`clickhouse-local` ツールを使用できます。詳細は、[`clickhouse-local` のドキュメントページ](../operations/utilities/clickhouse-local.md)を参照してください。 +::: diff --git a/docs/ja/home_links/deployment_links.json b/docs/ja/home_links/deployment_links.json new file mode 100644 index 00000000000..7ba64e7041c --- /dev/null +++ b/docs/ja/home_links/deployment_links.json @@ -0,0 +1,14 @@ +[ + { + "title": "Quick Start", + "description": "Get up and running on ClickHouse in minutes, explore some sample data, and build your solution", + "url": "/docs/ja/quick-start/", + "background": "cloud" + }, + { + "title": "Tutorials and Sample Datasets", + "description": "From taxi rides to property prices, learn how to get data into ClickHouse and model it for query performance", + "url": "/docs/ja/getting-started/example-datasets/", + "background": "cloud" + } +] diff --git a/docs/ja/home_links/links_101.json b/docs/ja/home_links/links_101.json new file mode 100644 index 00000000000..4cb92c40b2c --- /dev/null +++ b/docs/ja/home_links/links_101.json @@ -0,0 +1,27 @@ +[ + { + "title": "SQL reference", + "description": "Learn the statements, functions, and data types that are available", + "url": "/docs/ja/sql-reference" + }, + { + "title": "Ingest data", + "description": "Explore the many ways to get data into ClickHouse", + "url": "/docs/ja/integrations/data-ingestion/" + }, + { + "title": "Visualize data", + "description": "Now that your data is in ClickHouse, it's time to analyze it", + "url": "/docs/ja/integrations/data-visualization/" + }, + { + "title": "Optimize data", + "description": "Ways to improve the performance of your ClickHouse service", + "url": "/docs/ja/optimize/" + }, + { + "title": "Migrate data", + "description": "Importing your data from an external source into ClickHouse", + "url": "/docs/ja/integrations/migration/" + } +] diff --git a/docs/ja/images/column-oriented.gif b/docs/ja/images/column-oriented.gif new file mode 100644 index 00000000000..22ce122042c Binary files /dev/null and b/docs/ja/images/column-oriented.gif differ diff --git a/docs/ja/images/logo.png b/docs/ja/images/logo.png new file mode 100644 index 00000000000..552637796d6 Binary files /dev/null and b/docs/ja/images/logo.png differ diff --git a/docs/ja/images/logo.svg b/docs/ja/images/logo.svg new file mode 100644 index 00000000000..b5ab923ff65 --- /dev/null +++ b/docs/ja/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/images/play.png b/docs/ja/images/play.png new file mode 100644 index 00000000000..ddd78c55e32 Binary files /dev/null and b/docs/ja/images/play.png differ diff --git a/docs/ja/images/quickstart/CloudClickhouseClientDetails.png b/docs/ja/images/quickstart/CloudClickhouseClientDetails.png new file mode 100644 index 00000000000..3fe04d9f843 Binary files /dev/null and b/docs/ja/images/quickstart/CloudClickhouseClientDetails.png differ diff --git a/docs/ja/images/quickstart/SQLConsole.png b/docs/ja/images/quickstart/SQLConsole.png new file mode 100644 index 00000000000..243b7683715 Binary files /dev/null and b/docs/ja/images/quickstart/SQLConsole.png differ diff --git a/docs/ja/images/quickstart/ServiceDetails.png b/docs/ja/images/quickstart/ServiceDetails.png new file mode 100644 index 00000000000..3555d1f8013 Binary files /dev/null and b/docs/ja/images/quickstart/ServiceDetails.png differ diff --git a/docs/ja/images/quickstart/Services.png b/docs/ja/images/quickstart/Services.png new file mode 100644 index 00000000000..35239b26862 Binary files /dev/null and b/docs/ja/images/quickstart/Services.png differ diff --git a/docs/ja/images/quickstart/ShowDatabases.png b/docs/ja/images/quickstart/ShowDatabases.png new file mode 100644 index 00000000000..e22ceaa15e6 Binary files /dev/null and b/docs/ja/images/quickstart/ShowDatabases.png differ diff --git a/docs/ja/images/quickstart_01.png b/docs/ja/images/quickstart_01.png new file mode 100644 index 00000000000..2ace0859bd1 Binary files /dev/null and b/docs/ja/images/quickstart_01.png differ diff --git a/docs/ja/images/quickstart_02.png b/docs/ja/images/quickstart_02.png new file mode 100644 index 00000000000..5fc561441e5 Binary files /dev/null and b/docs/ja/images/quickstart_02.png differ diff --git a/docs/ja/images/quickstart_03.png b/docs/ja/images/quickstart_03.png new file mode 100644 index 00000000000..51ef33fa610 Binary files /dev/null and b/docs/ja/images/quickstart_03.png differ diff --git a/docs/ja/images/quickstart_04.png b/docs/ja/images/quickstart_04.png new file mode 100644 index 00000000000..0a29219d3a8 Binary files /dev/null and b/docs/ja/images/quickstart_04.png differ diff --git a/docs/ja/images/row-oriented.gif b/docs/ja/images/row-oriented.gif new file mode 100644 index 00000000000..78ff99523a9 Binary files /dev/null and b/docs/ja/images/row-oriented.gif differ diff --git a/docs/ja/images/sql-console-access-queries.png b/docs/ja/images/sql-console-access-queries.png new file mode 100644 index 00000000000..55286fa01de Binary files /dev/null and b/docs/ja/images/sql-console-access-queries.png differ diff --git a/docs/ja/images/sql-console-add-team.png b/docs/ja/images/sql-console-add-team.png new file mode 100644 index 00000000000..c186cad24d2 Binary files /dev/null and b/docs/ja/images/sql-console-add-team.png differ diff --git a/docs/ja/images/sql-console-edit-access.png b/docs/ja/images/sql-console-edit-access.png new file mode 100644 index 00000000000..3093ba2f52a Binary files /dev/null and b/docs/ja/images/sql-console-edit-access.png differ diff --git a/docs/ja/images/sql-console-edit-member.png b/docs/ja/images/sql-console-edit-member.png new file mode 100644 index 00000000000..22af2ec301a Binary files /dev/null and b/docs/ja/images/sql-console-edit-member.png differ diff --git a/docs/ja/images/sql-console-rename.png b/docs/ja/images/sql-console-rename.png new file mode 100644 index 00000000000..0da0f86bff4 Binary files /dev/null and b/docs/ja/images/sql-console-rename.png differ diff --git a/docs/ja/images/sql-console-save-query.png b/docs/ja/images/sql-console-save-query.png new file mode 100644 index 00000000000..82689a9f1a4 Binary files /dev/null and b/docs/ja/images/sql-console-save-query.png differ diff --git a/docs/ja/images/sql-console-share.png b/docs/ja/images/sql-console-share.png new file mode 100644 index 00000000000..9502b824c5e Binary files /dev/null and b/docs/ja/images/sql-console-share.png differ diff --git a/docs/ja/integrations/cli.mdx b/docs/ja/integrations/cli.mdx new file mode 100644 index 00000000000..fd89f1852c8 --- /dev/null +++ b/docs/ja/integrations/cli.mdx @@ -0,0 +1,12 @@ +--- +sidebar_position: 30 +sidebar_label: clickhouse-client +title: clickhouse-client +slug: /ja/integrations/sql-clients/cli +--- + +import Content from '@site/docs/ja/interfaces/cli.md'; + + + + diff --git a/docs/ja/integrations/clickhouse-client-local.md b/docs/ja/integrations/clickhouse-client-local.md new file mode 100644 index 00000000000..3e7f99760d1 --- /dev/null +++ b/docs/ja/integrations/clickhouse-client-local.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 20 +slug: /ja/integrations/sql-clients/clickhouse-client-local +sidebar_label: コマンドラインインターフェース (CLI) +--- + +# コマンドラインインターフェース (CLI) + +`clickhouse client` はコマンドラインからClickHouseに接続するために使用されるクライアントアプリケーションです。`clickhouse local` はディスク上およびネットワーク越しにファイルをクエリするために使用されるクライアントアプリケーションです。ClickHouseのドキュメントの多くのガイドでは、`clickhouse local`を使用してファイル(CSV、TSV、Parquetなど)のスキーマを調べ、そのファイルをクエリし、データを操作してClickHouseへの挿入の準備をする方法を説明しています。`clickhouse local`でファイルをクエリし、その出力を`clickhouse client`にパイプで渡してClickHouseにデータをストリームすることもよくあります。このドキュメントの最後の「次のステップ」セクションでは、`clickhouse client` と `clickhouse local` の両方を使用した例のデータセットを紹介しています。 + +:::tip +もし既にローカルにClickHouseサーバーをインストールしている場合は、**clickhouse client** と **clickhouse local** がインストールされているかもしれません。コマンドラインで **clickhouse client** と **clickhouse local** を実行して確認してください。そうでない場合は、あなたのオペレーティングシステムに対するインストール手順を確認してください。 +::: + + +## Microsoft Windowsの前提条件 + +Windows 10または11でWindows Subsystem for Linux (WSL) Version 2 (WSL 2) を使用すると、Ubuntu Linuxを実行でき、その上で`clickhouse client` および `clickhouse local`を実行することができます。 + +Microsoftの[WSLドキュメント](https://docs.microsoft.com/en-us/windows/wsl/install)に従ってWSLをインストールしてください。 + +#### WSL 2でシェルを開く: + +ターミナルから `bash` コマンドを実行すると、WSLに入ります: + +```bash +bash +``` + +## ClickHouseのダウンロード + +``` +curl https://clickhouse.com/ | sh +``` + +## `clickhouse client` の確認 + +```bash +./clickhouse client +``` +:::note +`clickhouse client` はローカルのClickHouseサーバーインスタンスに接続しようとしますが、実行中でない場合はタイムアウトします。[`clickhouse-client`](/docs/ja/integrations/cli.mdx) ドキュメントを参照して例を見てください。 +::: + +## `clickhouse local` の確認 + +```bash +./clickhouse local +``` + +## 次のステップ +[`NYPD Complaint` データセット](/docs/ja/getting-started/example-datasets/nypd_complaint_data.md)で `clickhouse-client` と `clickhouse-local` の使用例を確認してください。 + +[`clickhouse-client`](/docs/ja/integrations/cli.mdx) ドキュメントを参照してください。 + +[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md) ドキュメントを参照してください。 + +[ClickHouseのインストール](/docs/ja/getting-started/install.md) ドキュメントを参照してください。 + +## 関連コンテンツ + +- ブログ: [`clickhouse-local`を使ったローカルファイルからのデータの抽出、変換、およびクエリ](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) diff --git a/docs/ja/integrations/data-ingestion/_category_.yml b/docs/ja/integrations/data-ingestion/_category_.yml new file mode 100644 index 00000000000..430c6129eee --- /dev/null +++ b/docs/ja/integrations/data-ingestion/_category_.yml @@ -0,0 +1,8 @@ +position: 200 +label: 'Data ingestion' +collapsible: true +collapsed: true +link: + type: generated-index + title: Data ingestion + slug: /ja/integrations/data-ingestion diff --git a/docs/ja/integrations/data-ingestion/apache-spark/index.md b/docs/ja/integrations/data-ingestion/apache-spark/index.md new file mode 100644 index 00000000000..7d6d90790d4 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/apache-spark/index.md @@ -0,0 +1,484 @@ +--- +sidebar_label: Apache Spark +sidebar_position: 1 +slug: /ja/integrations/apache-spark/ +description: ClickHouseとApache Sparkの統合の紹介 +keywords: [ clickhouse, apache, spark, migrating, data ] +--- + +# ClickHouseとApache Sparkの統合 + +[Apache Spark](https://spark.apache.org/) Apache Spark™は、シングルノードマシンまたはクラスターでデータエンジニアリング、データサイエンス、および機械学習を実行するための多言語エンジンです。 + +Apache SparkとClickHouseを接続する主な方法は2つあります: + +1. [Spark Connector](#spark-connector) - Sparkコネクタは`DataSourceV2`を実装し、独自のカタログ管理を備えています。現在、ClickHouseとSparkを統合する推奨方法です。 +2. [Spark JDBC](#spark-jdbc) - [JDBCデータソース](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)を使用してSparkとClickHouseを統合します。 + +## Spark Connector + +このコネクタは、高度なパーティショニングや述語プッシュダウンなど、ClickHouseに特化した最適化を活用してクエリ性能やデータ処理を向上させます。コネクタは[ClickHouseの公式JDBCコネクタ](https://github.com/ClickHouse/clickhouse-java)に基づいており、独自のカタログを管理します。 + +### 要件 + +- Java 8または17 +- Scala 2.12または2.13 +- Apache Spark 3.3または3.4または3.5 + +### 互換性マトリックス + +| バージョン | 互換性のあるSparkバージョン | ClickHouse JDBCバージョン | +|------------|-----------------------------|---------------------------| +| main | Spark 3.3, 3.4, 3.5 | 0.6.3 | +| 0.8.0 | Spark 3.3, 3.4, 3.5 | 0.6.3 | +| 0.7.3 | Spark 3.3, 3.4 | 0.4.6 | +| 0.6.0 | Spark 3.3 | 0.3.2-patch11 | +| 0.5.0 | Spark 3.2, 3.3 | 0.3.2-patch11 | +| 0.4.0 | Spark 3.2, 3.3 | 依存なし | +| 0.3.0 | Spark 3.2, 3.3 | 依存なし | +| 0.2.1 | Spark 3.2 | 依存なし | +| 0.1.2 | Spark 3.2 | 依存なし | + +### ライブラリのダウンロード + +バイナリJARの名前パターンは: + +``` +clickhouse-spark-runtime-${spark_binary_version}_${scala_binary_version}-${version}.jar +``` + +すべてのリリースされたJARは[Maven Central Repository](https://repo1.maven.org/maven2/com/clickhouse/spark/)で見つけることができ、すべてのデイリービルドのSNAPSHOT JARは[Sonatype OSS Snapshots Repository](https://s01.oss.sonatype.org/content/repositories/snapshots/com/clickhouse/)で確認できます。 + +### 依存関係としてのインポート + +#### Gradle + +``` +dependencies { + implementation("com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}") + implementation("com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all") { transitive = false } +} +``` + +SNAPSHOTバージョンを使用したい場合は、次のリポジトリを追加します: + +``` +repositories { + maven { url = "https://s01.oss.sonatype.org/content/repositories/snapshots" } +} +``` + +#### Maven + +``` + + com.clickhouse.spark + clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }} + {{ stable_version }} + + + com.clickhouse + clickhouse-jdbc + all + {{ clickhouse_jdbc_version }} + + + * + * + + + +``` + +SNAPSHOTバージョンを使用したい場合は、次のリポジトリを追加します。 + +``` + + + sonatype-oss-snapshots + Sonatype OSS Snapshots Repository + https://s01.oss.sonatype.org/content/repositories/snapshots + + +``` + +## Spark SQLで遊ぶ + +注意:SQLのみの使用例に対しては、[Apache Kyuubi](https://github.com/apache/kyuubi)を本番環境で使用することが推奨されます。 + +### Spark SQL CLIの起動 + +```shell +$SPARK_HOME/bin/spark-sql \ + --conf spark.sql.catalog.clickhouse=com.clickhouse.spark.ClickHouseCatalog \ + --conf spark.sql.catalog.clickhouse.host=${CLICKHOUSE_HOST:-127.0.0.1} \ + --conf spark.sql.catalog.clickhouse.protocol=http \ + --conf spark.sql.catalog.clickhouse.http_port=${CLICKHOUSE_HTTP_PORT:-8123} \ + --conf spark.sql.catalog.clickhouse.user=${CLICKHOUSE_USER:-default} \ + --conf spark.sql.catalog.clickhouse.password=${CLICKHOUSE_PASSWORD:-} \ + --conf spark.sql.catalog.clickhouse.database=default \ + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +次の引数 + +``` + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +は次のように置き換えることができます + +``` + --repositories https://{maven-cental-mirror or private-nexus-repo} \ + --packages com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }},com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all +``` + +これにより、JARをSparkクライアントノードにコピーする必要がなくなります。 + +## 操作 + +基本的な操作、例えばデータベースの作成、テーブルの作成、テーブルへの書き込み、テーブルの読み込みなど。 + +``` +spark-sql> use clickhouse; +Time taken: 0.016 seconds + +spark-sql> create database if not exists test_db; +Time taken: 0.022 seconds + +spark-sql> show databases; +default +system +test_db +Time taken: 0.289 seconds, Fetched 3 row(s) + +spark-sql> CREATE TABLE test_db.tbl_sql ( + > create_time TIMESTAMP NOT NULL, + > m INT NOT NULL COMMENT 'part key', + > id BIGINT NOT NULL COMMENT 'sort key', + > value STRING + > ) USING ClickHouse + > PARTITIONED BY (m) + > TBLPROPERTIES ( + > engine = 'MergeTree()', + > order_by = 'id', + > settings.index_granularity = 8192 + > ); +Time taken: 0.242 seconds + +spark-sql> insert into test_db.tbl_sql values + > (timestamp'2021-01-01 10:10:10', 1, 1L, '1'), + > (timestamp'2022-02-02 10:10:10', 2, 2L, '2') + > as tabl(create_time, m, id, value); +Time taken: 0.276 seconds + +spark-sql> select * from test_db.tbl_sql; +2021-01-01 10:10:10 1 1 1 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.116 seconds, Fetched 2 row(s) + +spark-sql> insert into test_db.tbl_sql select * from test_db.tbl_sql; +Time taken: 1.028 seconds + +spark-sql> insert into test_db.tbl_sql select * from test_db.tbl_sql; +Time taken: 0.462 seconds + +spark-sql> select count(*) from test_db.tbl_sql; +6 +Time taken: 1.421 seconds, Fetched 1 row(s) + +spark-sql> select * from test_db.tbl_sql; +2021-01-01 10:10:10 1 1 1 +2021-01-01 10:10:10 1 1 1 +2021-01-01 10:10:10 1 1 1 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.123 seconds, Fetched 6 row(s) + +spark-sql> delete from test_db.tbl_sql where id = 1; +Time taken: 0.129 seconds + +spark-sql> select * from test_db.tbl_sql; +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.101 seconds, Fetched 3 row(s) +``` + +## Spark Shellで遊ぶ + +### Spark Shellの起動 + +```shell +$SPARK_HOME/bin/spark-shell \ + --conf spark.sql.catalog.clickhouse=com.clickhouse.spark.ClickHouseCatalog \ + --conf spark.sql.catalog.clickhouse.host=${CLICKHOUSE_HOST:-127.0.0.1} \ + --conf spark.sql.catalog.clickhouse.protocol=http \ + --conf spark.sql.catalog.clickhouse.http_port=${CLICKHOUSE_HTTP_PORT:-8123} \ + --conf spark.sql.catalog.clickhouse.user=${CLICKHOUSE_USER:-default} \ + --conf spark.sql.catalog.clickhouse.password=${CLICKHOUSE_PASSWORD:-} \ + --conf spark.sql.catalog.clickhouse.database=default \ + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +次の引数 + +``` + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +は次のように置き換えることができます + +``` + --repositories https://{maven-cental-mirror or private-nexus-repo} \ + --packages com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }},com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all +``` + +これにより、JARをSparkクライアントノードにコピーする必要がなくなります。 + +### 操作 + +基本的な操作、例えばデータベースの作成、テーブルの作成、テーブルへの書き込み、テーブルの読み込みなど。 + +``` +scala> spark.sql("use clickhouse") +res0: org.apache.spark.sql.DataFrame = [] + +scala> spark.sql("create database test_db") +res1: org.apache.spark.sql.DataFrame = [] + +scala> spark.sql("show databases").show ++---------+ +|namespace| ++---------+ +| default| +| system| +| test_db| ++---------+ + +scala> spark.sql(""" + | CREATE TABLE test_db.tbl ( + | create_time TIMESTAMP NOT NULL, + | m INT NOT NULL COMMENT 'part key', + | id BIGINT NOT NULL COMMENT 'sort key', + | value STRING + | ) USING ClickHouse + | PARTITIONED BY (m) + | TBLPROPERTIES ( + | engine = 'MergeTree()', + | order_by = 'id', + | settings.index_granularity = 8192 + | ) + | """) +res2: org.apache.spark.sql.DataFrame = [] + +scala> :paste +// Pasteモードに入ります(ctrl-Dで終了) + +spark.createDataFrame(Seq( + ("2021-01-01 10:10:10", 1L, "1"), + ("2022-02-02 10:10:10", 2L, "2") +)).toDF("create_time", "id", "value") + .withColumn("create_time", to_timestamp($"create_time")) + .withColumn("m", month($"create_time")) + .select($"create_time", $"m", $"id", $"value") + .writeTo("test_db.tbl") + .append + +// Pasteモードを終了し、現在解釈中です。 + +scala> spark.table("test_db.tbl").show ++-------------------+---+---+-----+ +| create_time| m| id|value| ++-------------------+---+---+-----+ +|2021-01-01 10:10:10| 1| 1| 1| +|2022-02-02 10:10:10| 2| 2| 2| ++-------------------+---+---+-----+ + +scala> spark.sql("DELETE FROM test_db.tbl WHERE id=1") +res3: org.apache.spark.sql.DataFrame = [] + +scala> spark.table("test_db.tbl").show ++-------------------+---+---+-----+ +| create_time| m| id|value| ++-------------------+---+---+-----+ +|2022-02-02 10:10:10| 2| 2| 2| ++-------------------+---+---+-----+ +``` + +ClickHouseのネイティブSQLを実行します。 + +``` +scala> val options = Map( + | "host" -> "clickhouse", + | "protocol" -> "http", + | "http_port" -> "8123", + | "user" -> "default", + | "password" -> "" + | ) + +scala> val sql = """ + | |CREATE TABLE test_db.person ( + | | id Int64, + | | name String, + | | age Nullable(Int32) + | |) + | |ENGINE = MergeTree() + | |ORDER BY id + | """.stripMargin + +scala> spark.executeCommand("com.clickhouse.spark.ClickHouseCommandRunner", sql, options) + +scala> spark.sql("show tables in clickhouse_s1r1.test_db").show ++---------+---------+-----------+ +|namespace|tableName|isTemporary| ++---------+---------+-----------+ +| test_db| person| false| ++---------+---------+-----------+ + +scala> spark.table("clickhouse_s1r1.test_db.person").printSchema +root + |-- id: long (nullable = false) + |-- name: string (nullable = false) + |-- age: integer (nullable = true) +``` + +## サポートされているデータ型 + +このセクションでは、SparkとClickHouse間のデータ型のマッピングについて説明します。以下の表は、ClickHouseからSparkにデータを読み取る際のデータ型の変換や、SparkからClickHouseにデータを挿入する際の変換のクイックリファレンスを提供します。 + +### ClickHouseからSparkへのデータ読み込み + +| ClickHouse データ型 | Spark データ型 | サポートされている | プリミティブか | メモ | +|-----------------------------------------------------------------|-------------------------------|-------------------|--------------|-------------------------------------------| +| `Nothing` | `NullType` | ✅ | Yes | | +| `Bool` | `BooleanType` | ✅ | Yes | | +| `UInt8`, `Int16` | `ShortType` | ✅ | Yes | | +| `Int8` | `ByteType` | ✅ | Yes | | +| `UInt16`,`Int32` | `IntegerType` | ✅ | Yes | | +| `UInt32`,`Int64`, `UInt64` | `LongType` | ✅ | Yes | | +| `Int128`,`UInt128`, `Int256`, `UInt256` | `DecimalType(38, 0)` | ✅ | Yes | | +| `Float32` | `FloatType` | ✅ | Yes | | +| `Float64` | `DoubleType` | ✅ | Yes | | +| `String`, `JSON`, `UUID`, `Enum8`, `Enum16`, `IPv4`, `IPv6` | `StringType` | ✅ | Yes | | +| `FixedString` | `BinaryType`, `StringType` | ✅ | Yes | 設定 `READ_FIXED_STRING_AS` で制御されます | +| `Decimal` | `DecimalType` | ✅ | Yes | 精度とスケールは `Decimal128` まで可能 | +| `Decimal32` | `DecimalType(9, scale)` | ✅ | Yes | | +| `Decimal64` | `DecimalType(18, scale)` | ✅ | Yes | | +| `Decimal128` | `DecimalType(38, scale)` | ✅ | Yes | | +| `Date`, `Date32` | `DateType` | ✅ | Yes | | +| `DateTime`, `DateTime32`, `DateTime64` | `TimestampType` | ✅ | Yes | | +| `Array` | `ArrayType` | ✅ | No | 配列要素の型も変換されます | +| `Map` | `MapType` | ✅ | No | キーは `StringType` に制限されます | +| `IntervalYear` | `YearMonthIntervalType(Year)` | ✅ | Yes | | +| `IntervalMonth` | `YearMonthIntervalType(Month)`| ✅ | Yes | | +| `IntervalDay`, `IntervalHour`, `IntervalMinute`, `IntervalSecond`| `DayTimeIntervalType` | ✅ | No | 特定の間隔型が使用されます | +| `Object` | | ❌ | | | +| `Nested` | | ❌ | | | +| `Tuple` | | ❌ | | | +| `Point` | | ❌ | | | +| `Polygon` | | ❌ | | | +| `MultiPolygon` | | ❌ | | | +| `Ring` | | ❌ | | | +| `IntervalQuarter` | | ❌ | | | +| `IntervalWeek` | | ❌ | | | +| `Decimal256` | | ❌ | | | +| `AggregateFunction` | | ❌ | | | +| `SimpleAggregateFunction` | | ❌ | | | + +### SparkからClickHouseへのデータ挿入 + +| Spark データ型 | ClickHouse データ型 | サポートされている | プリミティブか | メモ | +|--------------------------------------|--------------------|-------------------|--------------|--------------------------------------| +| `BooleanType` | `UInt8` | ✅ | Yes | | +| `ByteType` | `Int8` | ✅ | Yes | | +| `ShortType` | `Int16` | ✅ | Yes | | +| `IntegerType` | `Int32` | ✅ | Yes | | +| `LongType` | `Int64` | ✅ | Yes | | +| `FloatType` | `Float32` | ✅ | Yes | | +| `DoubleType` | `Float64` | ✅ | Yes | | +| `StringType` | `String` | ✅ | Yes | | +| `VarcharType` | `String` | ✅ | Yes | | +| `CharType` | `String` | ✅ | Yes | | +| `DecimalType` | `Decimal(p, s)` | ✅ | Yes | 精度とスケールは `Decimal128` まで可能| +| `DateType` | `Date` | ✅ | Yes | | +| `TimestampType` | `DateTime` | ✅ | Yes | | +| `ArrayType` (リスト、タプル、配列) | `Array` | ✅ | No | 配列要素の型も変換されます | +| `MapType` | `Map` | ✅ | No | キーは `StringType` に制限されます | +| `Object` | | ❌ | | | +| `Nested` | | ❌ | | | + +## Spark JDBC + +Sparkでサポートされているデータソースの中で最もよく使われるのがJDBCです。このセクションでは、Sparkで[ClickHouse公式JDBCコネクタ](https://github.com/ClickHouse/clickhouse-java)を使用する方法について詳しく説明します。 + +### データの読み込み + +```java +public static void main(String[] args) { + // Sparkセッションの初期化 + SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate(); + + // JDBC接続の詳細 + String jdbcUrl = "jdbc:ch://localhost:8123/default"; + Properties jdbcProperties = new Properties(); + jdbcProperties.put("user", "default"); + jdbcProperties.put("password", "123456"); + + // ClickHouseからテーブルを読み込む + Dataset df = spark.read().jdbc(jdbcUrl, "example_table", jdbcProperties); + + // DataFrameを表示する + df.show(); + + // Sparkセッションを停止する + spark.stop(); + } +``` + +### データの書き込み + +:::important +現時点では、JDBCを使用して既存のテーブルにのみデータを挿入できます。 +::: + +```java + public static void main(String[] args) { + // Sparkセッションの初期化 + SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate(); + + // JDBC接続の詳細 + String jdbcUrl = "jdbc:ch://localhost:8123/default"; + Properties jdbcProperties = new Properties(); + jdbcProperties.put("user", "default"); + jdbcProperties.put("password", "******"); + // サンプルDataFrameの作成 + StructType schema = new StructType(new StructField[]{ + DataTypes.createStructField("id", DataTypes.IntegerType, false), + DataTypes.createStructField("name", DataTypes.StringType, false) + }); + + List rows = new ArrayList(); + rows.add(RowFactory.create(1, "John")); + rows.add(RowFactory.create(2, "Doe")); + + Dataset df = spark.createDataFrame(rows, schema); + + df.write() + .mode(SaveMode.Append) + .jdbc(jdbcUrl, "my_table", jdbcProperties); + // DataFrameを表示する + df.show(); + + // Sparkセッションを停止する + spark.stop(); + } +``` + + + +:::important +Spark JDBCを使用する場合、Sparkは単一パーティションでデータを読み取ります。より高い並行性を達成するには、`partitionColumn`、`lowerBound`、`upperBound`、`numPartitions`を指定する必要があります。これらは、複数のワーカーから並行して読み取る際のテーブル分割を説明します。より詳細な情報については、Apache Sparkの公式ドキュメントで[JDBC構成](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html#data-source-option)をご確認ください。 +::: + diff --git a/docs/ja/integrations/data-ingestion/aws-glue/index.md b/docs/ja/integrations/data-ingestion/aws-glue/index.md new file mode 100644 index 00000000000..6d5b742f9a9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/aws-glue/index.md @@ -0,0 +1,57 @@ +--- +sidebar_label: Amazon Glue +sidebar_position: 1 +slug: /ja/integrations/glue +description: ClickHouseとAmazon Glueの統合 +keywords: [ clickhouse, amazon, aws, glue, データ移行, data ] +--- + +# ClickHouseとAmazon Glueの統合 + +[Amazon Glue](https://aws.amazon.com/glue/)は、Amazon Web Services (AWS)が提供する完全に管理されたサーバーレスのデータ統合サービスです。これは、分析、機械学習、アプリケーション開発のためのデータの発見、準備、および変換のプロセスを簡素化します。 + +現在のところ、Glue用のClickHouseコネクタは利用できませんが、公式のJDBCコネクタを利用してClickHouseと接続および統合を行うことができます: + +```java +import com.amazonaws.services.glue.util.Job +import com.amazonaws.services.glue.util.GlueArgParser +import com.amazonaws.services.glue.GlueContext +import org.apache.spark.SparkContext +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.DataFrame +import scala.collection.JavaConverters._ +import com.amazonaws.services.glue.log.GlueLogger + + +// Glueジョブの初期化 +object GlueJob { + def main(sysArgs: Array[String]) { + val sc: SparkContext = new SparkContext() + val glueContext: GlueContext = new GlueContext(sc) + val spark: SparkSession = glueContext.getSparkSession + val logger = new GlueLogger + import spark.implicits._ + // @params: [JOB_NAME] + val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) + Job.init(args("JOB_NAME"), glueContext, args.asJava) + + // JDBC接続の詳細 + val jdbcUrl = "jdbc:ch://{host}:{port}/{schema}" + val jdbcProperties = new java.util.Properties() + jdbcProperties.put("user", "default") + jdbcProperties.put("password", "*******") + jdbcProperties.put("driver", "com.clickhouse.jdbc.ClickHouseDriver") + + // ClickHouseからテーブルをロード + val df: DataFrame = spark.read.jdbc(jdbcUrl, "my_table", jdbcProperties) + + // Spark dfを表示、もしくは他の用途に使用 + df.show() + + // ジョブをコミット + Job.commit() + } +} +``` + +詳細については、[Spark & JDBC ドキュメント](/ja/integrations/apache-spark#read-data)をご覧ください。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json b/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json new file mode 100644 index 00000000000..5d196b7a8fe --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json @@ -0,0 +1 @@ +{"aws":[{"region":"eu-central-1","ips":["18.195.233.217","3.127.86.90","35.157.23.2","18.197.167.47","3.122.25.29","52.28.148.40"]},{"region":"us-east-1","ips":["54.82.38.199","3.90.133.29","52.5.177.8","3.227.227.145","3.216.6.184","54.84.202.92","3.131.130.196","3.23.172.68","3.20.208.150"]},{"region":"us-east-2","ips":["3.131.130.196","3.23.172.68","3.20.208.150","3.132.20.192","18.119.76.110","3.134.185.180"]}]} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png b/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png new file mode 100644 index 00000000000..7f08f2c1d00 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png new file mode 100644 index 00000000000..507fdd441a3 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png new file mode 100644 index 00000000000..64b4a314e63 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png new file mode 100644 index 00000000000..7ca20e781fb Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png new file mode 100644 index 00000000000..91cd2eb5e11 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png new file mode 100644 index 00000000000..52423d812c5 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png new file mode 100644 index 00000000000..fa1fc69e813 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png new file mode 100644 index 00000000000..af048c35486 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png new file mode 100644 index 00000000000..ca08187adf8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png new file mode 100644 index 00000000000..492a057d54f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png new file mode 100644 index 00000000000..59ab4ac7165 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png new file mode 100644 index 00000000000..4a9d370c3de Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png new file mode 100644 index 00000000000..85c2a7b78d8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png new file mode 100644 index 00000000000..53eb2b11b49 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png new file mode 100644 index 00000000000..ef1ad26498f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png new file mode 100644 index 00000000000..c260d7980a1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png new file mode 100644 index 00000000000..e68b467da2a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png new file mode 100644 index 00000000000..72c78dbc64c Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png new file mode 100644 index 00000000000..b6189385511 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png new file mode 100644 index 00000000000..893daa81325 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png new file mode 100644 index 00000000000..1736d54c4e4 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png new file mode 100644 index 00000000000..7dbd0f9f488 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png b/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png new file mode 100644 index 00000000000..8be306e2230 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg b/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg new file mode 100644 index 00000000000..ec3d716508d Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/index.md b/docs/ja/integrations/data-ingestion/clickpipes/index.md new file mode 100644 index 00000000000..2bab15746f9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/index.md @@ -0,0 +1,82 @@ +--- +sidebar_label: はじめに +description: 外部データソースをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes +--- + +import KafkaSVG from "../../images/logos/kafka.svg"; +import ConfluentSVG from "../../images/logos/confluent.svg"; +import MskSVG from "../../images/logos/msk.svg"; +import AzureEventHubsSVG from "../../images/logos/azure_event_hubs.svg"; +import WarpStreamSVG from "../../images/logos/warpstream.svg"; +import S3SVG from "../../images/logos/amazon_s3_logo.svg"; +import AmazonKinesis from "../../images/logos/amazon_kinesis_logo.svg"; +import GCSSVG from "../../images/logos/gcs.svg"; + +# ClickHouse Cloudとの統合 + +## はじめに + +[ClickPipes](https://clickhouse.com/cloud/clickpipes)は、さまざまなソースからのデータをわずか数クリックで取り込むことを可能にする管理された統合プラットフォームです。最も要求の厳しいワークロード向けに設計されたClickPipesの堅牢でスケーラブルなアーキテクチャは、一貫したパフォーマンスと信頼性を保証します。ClickPipesは、長期的なストリーミングニーズにも、一度きりのデータローディングジョブにも使用できます。 + +![ClickPipesスタック](./images/clickpipes_stack.png) + +## 対応データソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Apache Kafka||ストリーミング|安定|ClickPipesを設定し、Apache KafkaからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Confluent Cloud||ストリーミング|安定|ConfluentとClickHouse Cloudの直接統合により、両者の組み合わせの力を引き出します。| +|Redpanda|Redpanda logo|ストリーミング|安定|ClickPipesを設定し、RedPandaからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|AWS MSK||ストリーミング|安定|ClickPipesを設定し、AWS MSKからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Azure Event Hubs||ストリーミング|安定|ClickPipesを設定し、Azure Event HubsからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|WarpStream||ストリーミング|安定|ClickPipesを設定し、WarpStreamからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Amazon S3||オブジェクトストレージ|安定|ClickPipesを設定し、大量のデータをオブジェクトストレージから取り込みます。| +|Google Cloud Storage||オブジェクトストレージ|安定|ClickPipesを設定し、大量のデータをオブジェクトストレージから取り込みます。| +|Amazon Kinesis||ストリーミング|安定|ClickPipesを設定し、Amazon KinesisからClickHouse Cloudへストリーミングデータの取り込みを開始します。| + +ClickPipesにはさらに多くのコネクタが追加されますので、詳細は[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## 固定IPリスト + +以下は、ClickPipesが各地域のKafkaブローカーに接続するために使用する固定NAT IPです。 +関連するインスタンスの地域IPをIP許可リストに追加して、トラフィックを許可してください。 +インスタンス地域がここにリストされていない場合は、デフォルトの地域にフォールバックします。 + +- EU地域用の **eu-central-1** +- `us-east-1` インスタンス用の **us-east-1** +- 他のすべての地域用の **us-east-2** + +| ClickHouse Cloud 地域 | IPアドレス | +|-----------------------|------------| +| **eu-central-1** | `18.195.233.217`, `3.127.86.90`, `35.157.23.2`, `18.197.167.47`, `3.122.25.29`, `52.28.148.40` | +| **us-east-2** | `3.131.130.196`, `3.23.172.68`, `3.20.208.150`, `3.132.20.192`, `18.119.76.110`, `3.134.185.180` | +| **us-east-1** | `54.82.38.199`, `3.90.133.29`, `52.5.177.8`, `3.227.227.145`, `3.216.6.184`, `54.84.202.92`, `3.131.130.196`, `3.23.172.68`, `3.20.208.150` | + +## ClickHouse設定の調整 +ClickHouse Cloudは、ほとんどのユースケースに対応するための適切なデフォルトを提供します。ただし、ClickPipesのために特定のClickHouse設定を調整する必要がある場合は、ClickPipes専用のロールを作成することが最も柔軟な解決策です。 +ステップ: +1. カスタムロールを作成します `CREATE ROLE my_clickpipes_role SETTINGS ...`。詳細については[CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md)文法を参照してください。 +2. ClickPipes作成時の`Details and Settings`ステップで、ClickPipesユーザーにカスタムロールを追加します。 +![カスタムロールを割り当てる](./images/cp_custom_role.png) + +## エラーレポート +ClickPipesは、宛先テーブルの隣に`_clickpipes_error`という接尾辞を持つテーブルを作成します。このテーブルには、ClickPipeの操作(ネットワーク、接続性など)からのエラーや、スキーマに適合しないデータが含まれます。エラーテーブルには7日間の[有効期限 (TTL)](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)があります。 +ClickPipesが15分間ソースまたは宛先に接続できない場合、ClickPipesインスタンスは停止し、エラーテーブルに適切なメッセージを保存します(ClickHouseインスタンスが利用可能な場合)。 + +## よくある質問 +- **ClickPipesとは何ですか?** + + ClickPipesは、ユーザーがClickHouseサービスを外部データソース、特にKafkaに簡単に接続できるようにするClickHouse Cloudの機能です。Kafka向けのClickPipesを使用することで、ユーザーはClickHouseにデータを継続的にロードし、リアルタイム分析用に利用可能にします。 + +- **ClickPipesはデータ変換をサポートしていますか?** + + はい、ClickPipesはDDL作成を公開することで基本的なデータ変換をサポートしています。その後、ClickHouse Cloudサービスの宛先テーブルにデータがロードされる際に、ClickHouseの[マテリアライズドビューの機能](https://clickhouse.com/docs/ja/guides/developer/cascading-materialized-views)を活用して、より高度な変換を適用することができます。 + +- **ClickPipesの使用には追加のコストがかかりますか?** + + 現在、ClickPipesは別途請求されていません。ClickPipesを実行すると、他の取り込みワークロードと同様に、宛先ClickHouse Cloudサービスで間接的な計算およびストレージコストが発生する可能性があります。 + +- **Kafka用のClickPipesを使用する際にエラーや障害を処理する方法はありますか?** + + はい、Kafka用のClickPipesは、Kafkaからデータを消費する際に障害が発生した場合に自動的にリトライします。ClickPipesは、エラーや不正なデータを7日間保持する専用のエラーテーブルの有効化もサポートしています。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/kafka.md b/docs/ja/integrations/data-ingestion/clickpipes/kafka.md new file mode 100644 index 00000000000..ccc4980b4e7 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/kafka.md @@ -0,0 +1,274 @@ +--- +sidebar_label: Kafka用のClickPipes +description: Kafka データソースを ClickHouse Cloud とシームレスに接続します。 +slug: /ja/integrations/clickpipes/kafka +sidebar_position: 1 +--- + +import KafkaSVG from "../../images/logos/kafka.svg"; +import ConfluentSVG from "../../images/logos/confluent.svg"; +import MskSVG from "../../images/logos/msk.svg"; +import AzureEventHubsSVG from "../../images/logos/azure_event_hubs.svg"; +import WarpStreamSVG from "../../images/logos/warpstream.svg"; + +# Kafka と ClickHouse Cloud の統合 +## 前提条件 +[ClickPipes のイントロダクション](./index.md)を確認してください。 + +## 初めての Kafka ClickPipe の作成 + +1. ClickHouse Cloud サービスの SQL コンソールにアクセスします。 + + ![ClickPipes サービス](./images/cp_service.png) + +2. 左側のメニューで `Data Sources` ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![インポートを選択](./images/cp_step0.png) + +3. データソースを選択します。 + + ![データソースタイプの選択](./images/cp_step1.png) + +4. フォームに、ClickPipe の名前、説明(オプション)、クレデンシャル、およびその他の接続詳細を入力します。 + + ![接続詳細の入力](./images/cp_step2.png) + +5. スキーマレジストリを設定します。Avro ストリームには有効なスキーマが必要で、JSON にはオプションです。このスキーマは、選択されたトピック上で [AvroConfluent](../../../interfaces/formats.md/#data-format-avro-confluent) を解析したり、JSON メッセージを検証するのに使用されます。 +- パースできない Avro メッセージや検証に失敗した JSON メッセージはエラーを生成します。 +- スキーマレジストリの「ルート」パス。例えば、Confluent Cloud のスキーマレジストリの URL は HTTPS の URL であり、パスがない形式です。例:`https://test-kk999.us-east-2.aws.confluent.cloud`。ルートパスのみが指定されている場合、スキーマはサンプルされた Kafka メッセージに埋め込まれた ID によってカラム名とタイプを決定します。 +- 数値スキーマ ID によるスキーマドキュメントのパス `/schemas/ids/[ID]`。スキーマ ID を使用した完全な URL は、`https://registry.example.com/schemas/ids/1000` のようになります。 +- サブジェクト名によるスキーマドキュメントのパス `/subjects/[subject_name]`。オプションで、特定のバージョンは URL に `/versions/[version]` を追加することで参照できます(そうでなければ、ClickPipes は最新バージョンを取得します)。スキーマサブジェクトを使用した完全な URL は、`https://registry.example.com/subjects/events` や `https://registry/example.com/subjects/events/versions/4` のようになります。 + +すべてのケースで、ClickPipes はメッセージに埋め込まれたスキーマ ID によって示された場合、レジストリから自動的に更新または異なるスキーマを取得します。メッセージが埋め込まれたスキーマ ID なしで書き込まれている場合、特定のスキーマ ID またはサブジェクトを指定して、すべてのメッセージを解析する必要があります。 + +6. トピックを選択し、UI がそのトピックのサンプルドキュメントを表示します。 + + ![データフォーマットとトピックの設定](./images/cp_step3.png) + +7. 次のステップで、新しい ClickHouse テーブルにデータを取り込むか、既存のものを再利用するかを選択できます。画面の指示に従い、テーブル名、スキーマ、設定を変更します。上部のサンプルテーブルで変更をリアルタイムでプレビューできます。 + + ![テーブル、スキーマ、および設定の設定](./images/cp_step4a.png) + + 指定されたコントロールを使用して、高度な設定をカスタマイズすることもできます。 + + ![高度なコントロールの設定](./images/cp_step4a3.png) + +8. あるいは、既存の ClickHouse テーブルにデータを取り込みたい場合、UI はソースから選択した宛先テーブルの ClickHouse フィールドにフィールドをマップすることを許可します。 + + ![既存のテーブルを使用](./images/cp_step4b.png) + +9. 最後に、内部クリックパイプスユーザーの権限を設定できます。 + + **権限:** ClickPipes は、宛先テーブルへのデータ書き込みのために専用のユーザーを作成します。この内部ユーザーには、カスタムロールまたは事前定義されたロールのいずれかを選択できます: + - `Full access`: クラスターへの完全なアクセスを許可します。Materialized View または Dictionary を宛先テーブルで使用する場合に有用です。 + - `Only destination table`: 宛先テーブルのみに `INSERT` 権限があります。 + + ![権限](./images/cp_step5.png) + +10. 「Complete Setup」をクリックすると、システムは ClickPipe を登録し、それがサマリーテーブルに表示されるようになります。 + + ![成功通知](./images/cp_success.png) + + ![削除通知](./images/cp_remove.png) + + サマリーテーブルは、ソースまたは ClickHouse の宛先テーブルからサンプルデータを表示するためのコントロールを提供します。 + + ![宛先を表示](./images/cp_destination.png) + + そして、ClickPipe を削除し、取り込みジョブの概要を表示するためのコントロールも提供します。 + + ![概要を表示](./images/cp_overview.png) + +11. **おめでとうございます!** 初めての ClickPipe を設定することができました。これがストリーミング ClickPipe であれば、リモートデータソースからのデータをリアルタイムで継続的に取り込みます。 + +## 対応データソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Apache Kafka||ストリーミング|安定|ClickPipes を設定して、Apache Kafka から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|Confluent Cloud||ストリーミング|安定|Confluent と ClickHouse Cloud のパワーを直接統合により解放します。| +|Redpanda|Redpanda logo|ストリーミング|安定|ClickPipes を設定して、RedPanda から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|AWS MSK||ストリーミング|安定|ClickPipes を設定して、AWS MSK から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|Azure Event Hubs||ストリーミング|安定|ClickPipes を設定して、Azure Event Hubs から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|WarpStream||ストリーミング|安定|ClickPipes を設定して、WarpStream から ClickHouse Cloud へストリーミングデータを取り込み始めます。| + +ClickPipes に追加のコネクタが追加される予定です。詳細は[こちら](https://clickhouse.com/company/contact?loc=clickpipes)を参照してください。 + +## 対応するデータフォーマット + +対応フォーマットは次の通りです: +- [JSON](../../../interfaces/formats.md/#json) +- [AvroConfluent](../../../interfaces/formats.md/#data-format-avro-confluent) + +### 対応データタイプ + +現在 ClickPipes で対応している ClickHouse データタイプは次の通りです: + +- 基本数値型 - \[U\]Int8/16/32/64 および Float32/64 +- 大きな整数型 - \[U\]Int128/256 +- Decimal 型 +- Boolean +- String +- FixedString +- Date, Date32 +- DateTime, DateTime64 (UTC タイムゾーンのみ) +- Enum8/Enum16 +- UUID +- IPv4 +- IPv6 +- すべての ClickHouse LowCardinality 型 +- 上記の任意の型(Nullable を含む)をキーと値に使用した Map +- 上記の任意の型(Nullable を含む、1 階層のみ)を要素に使用した Tuple および Array + +### Avro +#### 対応する Avro データタイプ + +ClickPipes はすべての Avro プリミティブおよび複合型、`time-millis`、`time-micros`、`local-timestamp-millis`、`local_timestamp-micros`、および `duration` を除くすべての Avro 論理型をサポートしています。Avro `record` 型は Tuple に、`array` 型は Array に、`map` は Map(文字列キーのみ)に変換されます。一般的な変換は[こちら](../../../../en/interfaces/formats.md#data-types-matching)で示されています。Avro 数値型については、型変換におけるオーバーフローや精度損失をチェックしないため、正確な型一致をお勧めします。 + +#### Nullable 型と Avro ユニオン + +Avro における Nullable 型は `(T, null)` または `(null, T)` のユニオンスキーマを使用して定義されます。スキーマ推論中、このようなユニオンは ClickHouse の「Nullable」カラムにマップされます。ただし、ClickHouse は `Nullable(Array)`、`Nullable(Map)`、または `Nullable(Tuple)` 型をサポートしていません。これらの型に対する Avro の null ユニオンは、非 Nullable バージョンにマップされます(Avro Record 型は ClickHouse ネームド Tuple にマップされます)。これらの型に対する Avro の "null" は以下のように挿入されます: +- Null Avro 配列には空の Array +- Null Avro Map には空の Map +- Null Avro Record にはすべてがデフォルト/ゼロ値のネームド Tuple + +ClickPipes は現在、他の Avro ユニオンを含むスキーマをサポートしていません(これは新しい ClickHouse Variant や JSON データタイプの成熟度によって変わる可能性があります)。Avro スキーマが「非 null」ユニオンを含んでいる場合、ClickPipes は Avro スキーマと Clickhouse カラムタイプ間のマッピングを計算しようとする際にエラーを生成します。 + +#### Avro スキーマ管理 + +ClickPipes は、各メッセージ/イベントに埋め込まれたスキーマ ID を使用して、設定済みのスキーマレジストリから動的に Avro スキーマを取得し適用します。スキーマの更新は自動的に検出および処理されます。 + +現時点で ClickPipes は、[Confluent Schema Registry API](https://docs.confluent.io/platform/current/schema-registry/develop/api.html) を使用するスキーマレジストリとだけ互換性があります。これには Confluent Kafka と Cloud、RedPanda、AWS MSK、および Upstash スキーマレジストリが含まれます。ClickPipes は、AWS Glue スキーマレジストリや Azure スキーマレジストリとは現在互換性がありません(間もなく対応予定)。 + +取得された Avro スキーマと ClickHouse 宛先テーブル間のマッピングには次のルールが適用されます: +- Avro スキーマに ClickHouse 宛先マッピングに含まれていないフィールドがある場合、そのフィールドは無視されます。 +- Avro スキーマに ClickHouse 宛先マッピングに定義されたフィールドが欠けている場合、ClickHouse カラムは 0 や空文字列のような "ゼロ" 値で埋められます。クリックハウスのサーバーデフォルト処理の更新を待っている一時的な制限のため、ClickPipes 挿入のための [デフォルト](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default) 式は現在評価されていません。 +- Avro スキーマフィールドと ClickHouse カラムが互換性がない場合、その行/メッセージの挿入に失敗し、失敗は ClickPipes のエラーテーブルに記録されます。いくつかの暗黙的な変換(数値型間の変換など)はサポートされていますが、すべてではありません(例えば、Avro `record` フィールドは `Int32` ClickHouse カラムに挿入できません)。 + +## Kafka 仮想カラム + +Kafka 互換のストリーミングデータソースに対してサポートされている仮想カラムは次の通りです。新しい宛先テーブルを作成する際には、`Add Column` ボタンを使用して仮想カラムを追加できます。 + +| 名前 | 説明 | 推奨データタイプ | +|----------------|------------------------------------------|------------------| +| _key | Kafka メッセージキー | String | +| _timestamp | Kafka タイムスタンプ (ミリ秒精度) | DateTime64(3) | +| _partition | Kafka パーティション | Int32 | +| _offset | Kafka オフセット | Int64 | +| _topic | Kafka トピック | String | +| _header_keys | レコードヘッダー内のキーの並列配列 | Array(String) | +| _header_values | レコードヘッダー内の値の並列配列 | Array(String) | +| _raw_message | 完全な Kafka メッセージ | String | + +_note: `_raw_message` カラムは JSON データにのみ推奨されます。JSON 文字列だけが必要なユースケース(例えば ClickHouse [`JsonExtract*`](https://clickhouse.com/docs/ja/sql-reference/functions/json-functions#jsonextract-functions) 関数を使用してダウンストリームのマテリアライズドビューをポピュレートするなど)では、"非仮想" カラムを全削除することで ClickPipes のパフォーマンスが向上する可能性があります。_ + +## 制限 + +- [デフォルト](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default) はサポートされていません。 + +## 配信セマンティクス +ClickPipes for Kafka は `少なくとも一度` の配信セマンティクスを提供します(最も一般的に使用されるアプローチの一つとして)。配信セマンティクスについてのフィードバックをお待ちしております [お問い合わせフォーム](https://clickhouse.com/company/contact?loc=clickpipes)。`ちょうど一度` のセマンティクスが必要な場合、公式の [`clickhouse-kafka-connect`](https://clickhouse.com/blog/real-time-event-streaming-with-kafka-connect-confluent-cloud-clickhouse) シンクの使用をお勧めします。 + +## 認証 +Apache Kafka プロトコルのデータソースに対して、ClickPipes は TLS 暗号化を使用した [SASL/PLAIN](https://docs.confluent.io/platform/current/kafka/authentication_sasl/authentication_sasl_plain.html) 認証、および `SASL/SCRAM-SHA-256` と `SASL/SCRAM-SHA-512` をサポートしています。ストリーミングソース(Redpanda、MSK など)により、互換性に基づいてこれらの認証メカニズムのすべてまたは一部が有効になります。他の認証ニーズがある場合は、[フィードバックをお寄せください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### IAM +AWS MSK の認証は現在、[SASL/SCRAM-SHA-512](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html) 認証のみをサポートしています。 + +### カスタム証明書 +ClickPipes for Kafka は、Kafka ブローカーのカスタム証明書を SASL & パブリック SSL/TLS 証明書でアップロードすることをサポートしています。ClickPipe 設定の SSL 証明書セクションで証明書をアップロードできます。 +:::note +SASL と共に SSL 証明書の単一アップロードをサポートしていますが、現時点では SSL with マルチTLS (mTLS) はサポートされていません。 +::: + +## パフォーマンス + +### バッチ処理 +ClickPipes は ClickHouse へのデータ挿入をバッチで行います。これは、データベース内にあまり多くのパーツを作成しないようにして、クラスター内でのパフォーマンス問題を防ぐためです。 + +バッチは以下の基準のいずれかが満たされたときに挿入されます: +- バッチサイズが最大サイズ(100,000 行または 20MB)に達したとき +- バッチが最大時間(5 秒)開かれていたとき + +### レイテンシー + +レイテンシー(Kafka メッセージが生成されてから ClickHouse で使用可能になるまでの時間)は、さまざまな要因(例:ブローカのレイテンシー、ネットワークレイテンシー、メッセージサイズ/フォーマット)に依存します。上記で説明した[バッチ処理](#Batching)もレイテンシーに影響します。特定の負荷でのレイテンシーを決定するために、特定のユースケースでのテストを常にお勧めします。 + +ClickPipes はレイテンシーに関する保証を提供していません。特定の低レイテンシー要件がある場合は、[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### スケーリング +ClickPipes for Kafka は水平スケーリングを意図しています。デフォルトでは、2 つのコンシューマーを持つコンシューマーグループを作成します。これを増やすには、[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## よくある質問 + +### 一般 + +- **ClickPipes for Kafka はどのように機能しますか?** + + ClickPipes は専用のアーキテクチャを使用して Kafka Consumer API を実行し、指定されたトピックからデータを読み取り、そのデータを特定の ClickHouse Cloud サービス上の ClickHouse テーブルに挿入します。 + +- **ClickPipes と ClickHouse Kafka テーブルエンジンの違いは何ですか?** + + Kafka テーブルエンジンは、ClickHouse サーバー自身が Kafka に接続し、イベントを取得してローカルに書き込む「プルモデル」を実装する ClickHouse のコア機能です。 + + ClickPipes は ClickHouse サービスとは独立して動作する別のクラウドサービスであり、Kafka(または他のデータソース)に接続し、関連 ClickHouse Cloud サービスにイベントをプッシュします。この分離されたアーキテクチャにより、優れた運用の柔軟性、明確な関心の分離、スケーラブルな取り込み、スムーズな障害管理、拡張性などが可能となります。 + +- **ClickPipes for Kafka を使用する際の要件は何ですか?** + + ClickPipes for Kafka を使用するには、稼働中の Kafka ブローカーと ClickPipes が有効な ClickHouse Cloud サービスが必要です。また、ClickHouse Cloud があなたの Kafka ブローカーにアクセスできることを確認する必要があります。これは、Kafka サイドでのリモート接続を許可し、Kafka 設定で [ClickHouse Cloud Egress IP アドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api) をホワイトリストに登録することで実現できます。 + +- **ClickPipes for Kafka は AWS PrivateLink をサポートしていますか?** + + AWS PrivateLink はサポートされています。詳細は [お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +- **ClickPipes for Kafka を使用して Kafka トピックにデータを書き込むことはできますか?** + + いいえ、ClickPipes for Kafka は Kafka トピックからデータを読み取るために設計されており、データを書き込むためではありません。Kafka トピックにデータを書き込むには、専用の Kafka プロデューサーを使用する必要があります。 + +- **ClickPipes は複数のブローカーをサポートしていますか?** + + はい、同じクォーラムの一部であれば、`,`で区切って一緒に設定できます。 + +### Upstash + +- **ClickPipes は Upstash をサポートしていますか?** + + はい。Upstash の Kafka 製品は 2024 年 9 月 11日から6 ヶ月間の廃止期間に入りました。既存の顧客は、ClickPipes ユーザーインターフェースの一般的な Kafka タイルを使用して、既存の Upstash Kafka ブローカーで ClickPipes を引き続き使用することができます。既存の Upstash Kafka ClickPipes は、廃止通知の前には影響されません。廃止期間が終わると、ClickPipe は機能しなくなります。 + +- **ClickPipes は Upstash スキーマレジストリをサポートしていますか?** + + いいえ。ClickPipes は Upstash Kafka スキーマレジストリと互換性がありません。 + +- **ClickPipes は Upstash の QStash ワークフローをサポートしていますか?** + + いいえ。QStash ワークフローに Kafka 互換の表面が導入されない限り、Kafka ClickPipes では動作しません。 + +### Azure EventHubs + +- **Azure Event Hubs ClickPipe は Kafka サーフェスなしで動作しますか?** + + いいえ。ClickPipes は Azure Event Hubs で Kafka サーフェスを有効にする必要があります。Kafka プロトコルは、Standard、Premium、Dedicated SKU のみのプライシングティアに対応しています。 + +- **Azure スキーマレジストリは ClickPipes で動作しますか?** + + いいえ。ClickPipes は現在、Event Hubs スキーマレジストリとは互換性がありません。 + +- **Azure Event Hubs からデータを取得するためにポリシーにどの権限が必要ですか?** + + トピックをリストし、イベントを取得するには、共有アクセスポリシーに少なくとも「Listen」クレームが必要です。 + +- **Event Hubs がデータを返さない理由は何ですか?** + + あなたの ClickHouse インスタンスがあなたの Event Hubs 配置と異なる地域または大陸にある場合、ClickPipes のオンボーディング時にタイムアウトが発生し、Event Hub からデータを取得する際にレイテンシーが高くなる可能性があります。ClickHouse Cloud 配置と Azure Event Hubs 配置をクラウド地域が互いに近い場所に配置することは、パフォーマンスに悪影響を及ぼさない最良のプラクティスと考えられています。 + +- **Azure Event Hubs のためにポート番号を含めるべきですか?** + + はい。ClickPipes は Kafka サーフェス用のポート番号を含めることを期待しており、それは `:9093` であるべきです。 + +- **Event Hubs のための ClickPipes IP はまだ relevant ですか?** + + はい。Event Hubs インスタンスへのトラフィックを制限する場合、[ドキュメント化された静的 NAT IPs](./index.md) を追加してください。 + +- **イベントハブの接続文字列か、イベントハブネームスペースの接続文字列ですか?** + + 両方とも使用できますが、複数のイベントハブからサンプルを取得するためにネームスペースレベルでの共有アクセスポリシーを使用することをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md b/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md new file mode 100644 index 00000000000..609a4995292 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md @@ -0,0 +1,135 @@ +--- +sidebar_label: Amazon KinesisとClickPipesの統合 +description: Amazon KinesisデータソースをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes/kinesis +--- + +# Amazon KinesisとClickHouse Cloudの統合 + +## 前提条件 + +[ClickPipesの紹介](./index.md)に慣れており、[IAM認証情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を設定しています。[Kinesis Role-Based Accessガイド](./secure-kinesis.md)に従って、ClickHouse Cloudと連携するロールの設定方法を確認してください。 + +## 最初のClickPipeを作成する + +1. ClickHouse CloudサービスのSQLコンソールにアクセスします。 + + ![ClickPipes service](./images/cp_service.png) + +2. 左側のメニューから`Data Sources`ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![Select imports](./images/cp_step0.png) + +3. データソースを選択します。 + + ![Select data source type](./images/cp_step1.png) + +4. 名前、説明(オプション)、IAMロールまたは認証情報、その他の接続詳細を入力してClickPipeのフォームを記入します。 + + ![Fill out connection details](./images/cp_step2_kinesis.png) + +5. Kinesis Streamと開始オフセットを選択します。UIは選択したソース(Kafkaトピックなど)のサンプルドキュメントを表示します。また、Kinesisストリームのパフォーマンスと安定性を向上させるためにEnhanced Fan-outを有効にすることができます(Enhanced Fan-outの詳細はこちら[こちら](https://aws.amazon.com/blogs/aws/kds-enhanced-fanout)で確認できます)。 + + ![Set data format and topic](./images/cp_step3_kinesis.png) + +6. 次のステップでは、新しいClickHouseテーブルにデータを取り込むか、既存のテーブルを再利用するかを選択できます。画面の指示に従ってテーブル名、スキーマ、および設定を変更します。サンプルテーブルの上部で変更のリアルタイムプレビューを確認できます。 + + ![Set table, schema, and settings](./images/cp_step4a.png) + + 提供されているコントロールを使用して高度な設定をカスタマイズすることもできます。 + + ![Set advanced controls](./images/cp_step4a3.png) + +7. あるいは、既存のClickHouseテーブルにデータを取り込むことを選択することもできます。その場合、UIはソースから選択した宛先テーブルのClickHouseフィールドへのフィールドマッピングを許可します。 + + ![Use and existing table](./images/cp_step4b.png) + +8. 最後に、内部ClickPipesユーザーの権限を設定できます。 + + **Permissions:** ClickPipesは宛先テーブルにデータを書き込む専用ユーザーを作成します。この内部ユーザーのためにカスタムロールまたは事前定義されたロールを選択できます: + - `Full access`: クラスターへの完全アクセスを持つ。これは、Materialized ViewまたはDictionaryを宛先テーブルで使用する場合に有用です。 + - `Only destination table`: 宛先テーブルへの`INSERT`権限のみを持つ。 + + ![permissions](./images/cp_step5.png) + +9. 「Complete Setup」をクリックすると、システムはあなたのClickPipeを登録し、要約テーブルに表示されるようになります。 + + ![Success notice](./images/cp_success.png) + + ![Remove notice](./images/cp_remove.png) + + 要約テーブルには、ClickHouseのソースまたは宛先テーブルからサンプルデータを表示するためのコントロールが含まれています。 + + ![View destination](./images/cp_destination.png) + + さらにClickPipeを削除し、取り込みジョブの要約を表示するためのコントロールもあります。 + + ![View overview](./images/cp_overview.png) + +10. **おめでとうございます!** 初めてのClickPipeを正常に設定しました。これがストリーミングClickPipeの場合、リモートデータソースからリアルタイムでデータを連続して取り込むことになります。そうでなければ、バッチを取り込み完了します。 + +## サポートされているデータフォーマット + +サポートされているフォーマットは次の通りです: +- [JSON](../../../interfaces/formats.md/#json) + +## サポートされているデータ型 + +ClickPipesでは、以下のClickHouseデータ型が現在サポートされています: + +- 基本数値型 - \[U\]Int8/16/32/64およびFloat32/64 +- 大きな整数型 - \[U\]Int128/256 +- Decimal型 +- ブール型 +- String +- FixedString +- Date, Date32 +- DateTime, DateTime64(UTCタイムゾーンのみ) +- Enum8/Enum16 +- UUID +- IPv4 +- IPv6 +- すべてのClickHouse LowCardinality型 +- Map(上記の型およびNullableを使用したキーおよび値) +- TupleおよびArray(上記の型およびNullableを使用した要素、一段階の深さのみ) + +## Kinesis仮想カラム + +Kinesisストリームに対してサポートされている仮想カラムは以下の通りです。新しい宛先テーブルを作成する際、`Add Column`ボタンを使用して仮想カラムを追加できます。 + +| 名前 | 説明 | 推奨データ型 | +|--------------|---------------------------------------------------------------|-----------------------| +| _key | Kinesis パーティションキー | String | +| _timestamp | Kinesis おおよその到着タイムスタンプ(ミリ秒精度) | DateTime64(3) | +| _stream | Kafka ストリーム名 | String | +| _raw_message | 完全な Kinesis メッセージ | String | + +_raw_messageフィールドは、完全なKinesis JSONレコードが必要な場合(例えば、ClickHouseの[`JsonExtract*`](https://clickhouse.com/docs/ja/sql-reference/functions/json-functions#jsonextract-functions)関数を使用して下流のmaterialized viewを埋める場合)に使用できます。このようなパイプでは、すべての「非仮想」カラムを削除することでClickPipesのパフォーマンスを向上させることができます。 + +## 制限事項 + +- [DEFAULT](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default)はサポートされていません。 + +## パフォーマンス + +### バッチング + +ClickPipesはデータをバッチでClickHouseに挿入します。これは、データベース内のパーツが多くなりすぎることによってクラスタのパフォーマンスに影響を与えることを避けるためです。 + +バッチは、以下のいずれかの条件を満たすと挿入されます: +- バッチサイズが最大サイズに達したとき(100,000行または20MB) +- バッチが最大時間(5秒)開かれていたとき + +### レイテンシー + +レイテンシー(Kinesisメッセージがストリームに送信され、ClickHouseで利用可能になるまでの時間)は、いくつかの要因(例:kinesisのレイテンシー、ネットワークレイテンシー、メッセージサイズ/フォーマット)に依存します。上記のセクションに記載されている[バッチング](#Batching)もレイテンシーに影響します。お客様の特定のユースケースをテストして、期待されるレイテンシーを理解することをお勧めします。 + +特定の低レイテンシー要件がある場合は、[ここからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### スケーリング + +Kinesis向けClickPipesは水平スケーリングを前提に設計されています。デフォルトでは、2つのコンシューマーを作成します。これを増やすには、[こちらからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## 認証 + +Amazon Kinesisストリームにアクセスするには、[IAM認証情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を使用できます。IAMロールの設定方法に関する詳細は、[このガイド](./secure-kinesis.md)を参照して、ClickHouse Cloudと連携するロールの設定方法について確認できます。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md b/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md new file mode 100644 index 00000000000..73497dd3df4 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md @@ -0,0 +1,146 @@ +--- +sidebar_label: オブジェクトストレージ用のClickPipes +description: あなたのオブジェクトストレージをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes/object-storage +--- +import S3SVG from "../../images/logos/amazon_s3_logo.svg"; +import GCSSVG from "../../images/logos/gcs.svg"; + +# オブジェクトストレージとClickHouse Cloudの統合 +## 前提条件 +[ClickPipesの紹介](./index.md)を確認していること。 + +## 初めてのClickPipeの作成 + +1. ClickHouse Cloud ServiceのSQLコンソールにアクセスします。 + + ![ClickPipesサービス](./images/cp_service.png) + +2. 左側のメニューから`Data Sources`ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![インポートを選択](./images/cp_step0.png) + +3. データソースを選択します。 + + ![データソースタイプを選択](./images/cp_step1.png) + +4. フォームにClickPipeの名前、説明(オプション)、IAMロールまたは資格情報、バケットURLを入力してフォームを記入します。bash風のワイルドカードを使用して複数のファイルを指定できます。詳細については、[パスでのワイルドカードの使用に関する文書](#limitations)を参照してください。 + + ![接続詳細を記入](./images/cp_step2_object_storage.png) + +5. 指定されたバケット内のファイルのリストがUIに表示されます。データフォーマットを選択し(現在、ClickHouseフォーマットのサブセットをサポートしています)、継続的な取り込みを有効にしたい場合は[以下の詳細](#continuous-ingest)をご覧ください。 + + ![データフォーマットとトピックを設定](./images/cp_step3_object_storage.png) + +6. 次のステップでは、新しいClickHouseテーブルにデータを取り込むか、既存のテーブルを再利用するかを選択できます。画面の指示に従って、テーブル名、スキーマ、設定を変更します。サンプルテーブルの上部でリアルタイムの変更プレビューを見ることができます。 + + ![テーブル、スキーマ、および設定を設定](./images/cp_step4a.png) + + 提供されたコントロールを使用して、高度な設定をカスタマイズすることもできます。 + + ![高度なコントロールを設定](./images/cp_step4a3.png) + +7. あるいは、既存のClickHouseテーブルにデータを取り込むことも選択できます。その場合、UIはソースから選択された宛先テーブルのClickHouseフィールドへフィールドをマッピングする機能を提供します。 + + ![既存のテーブルを使用](./images/cp_step4b.png) + +:::info +[_path]や[_size]のような[仮想カラム](../../sql-reference/table-functions/s3#virtual-columns)をフィールドにマッピングすることもできます。 +::: + +8. 最後に、内部clickpipesユーザーの権限を設定できます。 + + **権限:** ClickPipesは、宛先テーブルにデータを書き込むための専用ユーザーを作成します。この内部ユーザーのロールをカスタムロールまたは以下の事前定義されたロールで選択できます: + - `Full access`: クラスターへの完全なアクセス権があります。Materialized ViewやDictionaryを宛先テーブルで使用する場合に必要です。 + - `Only destination table`: 宛先テーブルへの`INSERT`権限のみ。 + + ![権限](./images/cp_step5.png) + +9. 「Complete Setup」をクリックすると、システムがあなたのClickPipeを登録し、サマリーテーブルにリストされているのを見ることができます。 + + ![成功通知](./images/cp_success.png) + + ![削除通知](./images/cp_remove.png) + + サマリーテーブルは、ClickHouseのソースまたは宛先テーブルからサンプルデータを表示するコントロールを提供します。 + + ![宛先を表示](./images/cp_destination.png) + + また、ClickPipeを削除し、取り込みジョブのサマリーを表示するコントロールもあります。 + + ![概要を表示](./images/cp_overview.png) + +10. **おめでとうございます!** あなたの初めてのClickPipeを成功裏に設定しました。これがストリーミングClickPipeである場合、それはリモートデータソースからリアルタイムでデータを継続的に取り込みます。それ以外の場合は、バッチを取り込んで完了します。 + +## サポートされているデータソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Amazon S3||オブジェクトストレージ|Beta|オブジェクトストレージから大量のデータを取り込むためにClickPipesを設定します。| +|Google Cloud Storage||オブジェクトストレージ|Beta|オブジェクトストレージから大量のデータを取り込むためにClickPipesを設定します。| + +ClickPipesには今後より多くのコネクタが追加される予定です。[こちらからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)で詳細を確認できます。 + +## サポートされているデータフォーマット + +サポートされているフォーマットは次のとおりです: +- [JSON](../../../interfaces/formats.md/#json) +- [CSV](../../../interfaces/formats.md/#csv) +- [Parquet](../../../interfaces/formats.md/#parquet) + +## スケーリング + +オブジェクトストレージClickPipesは、[設定された縦方向の自動スケーリング設定](/docs/ja/manage/scaling#configuring-vertical-auto-scaling)により決定された最小のClickHouseサービスサイズに基づいてスケーリングされます。ClickPipeのサイズはパイプ作成時に決定され、後続のClickHouseサービス設定の変更はClickPipeのサイズに影響しません。 + +大規模な取り込みジョブのスループットを増加させるため、ClickPipeを作成する前にClickHouseサービスをスケーリングすることをお勧めします。 + +## Materialized Views + +オブジェクトストレージClickPipesでMaterialized Viewsを使用する場合、作成時に`Full access`権限を選択する必要があります。これが不可能な場合は、パイプが宛先データベースにテーブルおよびMaterialized Viewsを作成できることを確認してください。 + +オブジェクトストレージClickPipeの実行中に作成されるMaterialized Viewsは、データを取得しません。パイプを停止し再起動することで、パイプがMaterialized Viewsを取得し始めます。以下の[制限](#limitations)を参照してください。 + +## 制限事項 +- 宛先テーブル、そのMaterialized Views(カスケードMaterialized Viewsを含む)、またはMaterialized Viewsのターゲットテーブルの変更は、パイプによって自動的に取得されず、エラーを引き起こす可能性があります。パイプを停止し、必要な変更を加えてからパイプを再起動し、変更を取得し、エラーや再試行による重複データを回避してください。 +- GCPまたはAzureにデプロイされたClickHouse Cloudインスタンス用に、S3 ClickPipesのロール認証は利用できません。AWS ClickHouse Cloudインスタンスのみサポートされています。 +- ClickPipesは10GB以下のオブジェクトの取り込みのみを試みます。10GBを超えるファイルは、ClickPipes専用のエラーテーブルにエラーを追加します。 +- S3 / GCS ClickPipesは、[S3 Table Function](https://clickhouse.com/docs/ja/sql-reference/table-functions/file#globs_in_path)とリスト構文を共有して**いません**。 + - `?` — 任意の1文字に置き換えます。 + - `*` — 空の文字列を含む任意の数の任意の文字に置き換えます。 + - `**` — 空の文字列を含む任意の数の任意の文字に置き換えます。 + +:::note +これは有効なパスです: + +https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/**.ndjson.gz + + +これは有効なパスではありません。ClickPipesでは`{N..M}`はサポートされていません。 + +https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/{documents-01,documents-02}.ndjson.gz +::: + +## 継続的な取り込み +ClickPipesはS3およびGCSからの継続的な取り込みをサポートしています。有効にすると、ClickPipesは指定されたパスからデータを継続的に取り込み、新しいファイルを30秒ごとにポーリングします。ただし、新しいファイルは最後に取り込まれたファイルよりも辞書順で大きくなければならず、取り込みの順序を定義するように名前が付けられている必要があります。例えば、`file1`、`file2`、`file3`などのファイルは順番に取り込まれます。`file0`のような名前の新しいファイルが追加されても、辞書順で最後に取り込まれたファイルより大きくないため、ClickPipesはそれを取り込みません。 + +## アーカイブテーブル +ClickPipesは、宛先テーブルの隣に`_archive`の接尾辞を持つテーブルを作成します。このテーブルには、ClickPipeによって取り込まれたすべてのファイルのリストが含まれます。このテーブルは取り込み中のファイルを追跡するために使用され、ファイルが取り込まれたことを確認するために使用できます。アーカイブテーブルには7日の[有効期限](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)があります。 + +:::note +これらのテーブルはClickHouse Cloud SQLコンソールを使用しても表示されません。HTTPSまたはネイティブ接続を介して外部クライアントを使用して接続し、読み取る必要があります。 +::: + +## 認証 + +### S3 +公開バケットには設定なしでアクセスでき、保護されたバケットには[IAM資格情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を使用できます。データへのアクセスに必要な権限を理解するには、[このガイドを参照してください](/docs/ja/cloud/security/secure-s3)。 + +### GCS +S3と同様に、公開バケットには設定なしでアクセスでき、保護されたバケットにはAWS IAM資格情報の代わりに[HMACキー](https://cloud.google.com/storage/docs/authentication/managing-hmackeys)を使用できます。このキーの設定方法については、Google Cloudのガイドを参照してください。[このキーの設定方法](https://cloud.google.com/storage/docs/authentication/hmackeys)。 + +GCSのサービスアカウントは直接サポートされていません。公開されていないバケットに対して認証する際にはHMAC(IAM)資格情報を使用する必要があります。HMAC資格情報に付随するサービスアカウントの権限は`storage.objects.list`および`storage.objects.get`である必要があります。 + +## よくある質問 +- **ClickPipesは`gs://`で始まるGCSバケットをサポートしていますか?** + +いいえ。相互運用性のために、`gs://`バケットプレフィックスを`https://storage.googleapis.com/`に置き換えることをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/postgres.md b/docs/ja/integrations/data-ingestion/clickpipes/postgres.md new file mode 100644 index 00000000000..a2aae58f65d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/postgres.md @@ -0,0 +1,11 @@ +--- +sidebar_label: PostgreSQL 用 ClickPipes +description: PostgreSQL をシームレスに ClickHouse Cloud に接続します。 +slug: /ja/integrations/clickpipes/postgres +--- + +# ClickHouse Cloud との PostgreSQL 統合 + +PeerDB は ClickHouse と提携し、最速の Postgres CDC を提供します!スタートするには、[PeerDB Cloud](https://www.peerdb.io/) でアカウントを作成し、ClickHouse Cloud の設定手順については[ドキュメント](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)を参照してください。 + +今後数ヶ月で、PostgreSQL CDC を ClickPipes に完全に統合されたソリューションとして提供する予定です。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md b/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md new file mode 100644 index 00000000000..fdecd10918d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md @@ -0,0 +1,95 @@ +--- +slug: /ja/integrations/clickpipes/secure-kinesis +sidebar_label: Kinesis ロールベース アクセス +title: Kinesis ロールベース アクセス +--- + +この記事では、ClickPipes 顧客がロールベース・アクセスを活用して Amazon Kinesis に認証し、安全にデータストリームへアクセスする方法を説明します。 + +## はじめに + +Kinesis への安全なアクセスを設定する前に、そのメカニズムを理解することが重要です。以下は、ClickPipes が顧客の AWS アカウント内でロールを引き受けることで Amazon Kinesis ストリームにアクセスする方法の概要です。 + +![securekinesis](@site/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg) + +この方法を使用することで、顧客は IAM ポリシー(引き受けられるロールの IAM ポリシー)内で Kinesis データストリームへのすべてのアクセスを一元管理でき、それぞれのストリームのアクセスポリシーを個別に変更する必要がありません。 + +## 設定 + +### ClickHouse サービス IAM ロール Arn の取得 + +1 - ClickHouse クラウドアカウントにログインします。 + +2 - 統合したい ClickHouse サービスを選択します。 + +3 - **設定** タブを選択します。 + +4 - ページ下部の **このサービスについて** セクションまでスクロールします。 + +5 - 以下に示すように、サービスに属する **IAM ロール** の値をコピーします。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_arn.jpg) + +### IAM ロールの設定 + +#### IAM ロールを手動で作成 + +1 - IAM ユーザーとしての許可がある AWS アカウントにウェブブラウザでログインして、IAM ロールを作成および管理します。 + +2 - IAM サービスコンソールに移動します。 + +3 - 以下の IAM および信頼ポリシーを持つ新しい IAM ロールを作成します。IAM ロールの名前は `ClickHouseAccessRole-` で始める必要があることに注意してください。 + +信頼ポリシー({ClickHouse_IAM_ARN} を ClickHouse インスタンスに属する IAM ロールの arn で置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "{ClickHouse_IAM_ARN}" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +IAM ポリシー({STREAM_NAME} を Kinesis ストリーム名で置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "kinesis:DescribeStream", + "kinesis:GetShardIterator", + "kinesis:GetRecords", + "kinesis:ListShards", + "kinesis:SubscribeToShard", + "kinesis:DescribeStreamConsumer", + "kinesis:RegisterStreamConsumer", + "kinesis:DeregisterStreamConsumer", + "kinesis:ListStreamConsumers" + ], + "Resource": [ + "arn:aws:kinesis:region:account-id:stream/{STREAM_NAME}" + ], + "Effect": "Allow" + }, + { + "Action": [ + "kinesis:ListStreams" + ], + "Resource": "*", + "Effect": "Allow" + } + ] + +} +``` + +4 - 作成後、新しい **IAM ロール Arn** をコピーします。これが Kinesis ストリームにアクセスするために必要です。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/_category_.yml b/docs/ja/integrations/data-ingestion/data-formats/_category_.yml new file mode 100644 index 00000000000..f8179149dd5 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/_category_.yml @@ -0,0 +1,7 @@ +position: 5 +label: 'Data Formats' +collapsible: true +collapsed: true +link: + type: doc + id: intro diff --git a/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md b/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md new file mode 100644 index 00000000000..606ee064533 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md @@ -0,0 +1,165 @@ +--- +sidebar_label: Avro、Arrow、および ORC +sidebar_position: 5 +slug: /ja/integrations/data-formats/arrow-avro-orc +--- + +# ClickHouseでのAvro、Arrow、およびORCデータの操作 + +Apacheは、分析環境で広く使用される複数のデータフォーマットをリリースしており、その中には人気のある[Avro](https://avro.apache.org/)、[Arrow](https://arrow.apache.org/)、そして[Orc](https://orc.apache.org/)があります。ClickHouseはリストから選択されたデータをインポートおよびエクスポートすることをサポートしています。 + +## Avroフォーマットでのインポートとエクスポート + +ClickHouseは、Hadoopシステムで広く使われている[Apache Avro](https://avro.apache.org/)データファイルの読み取りと書き込みをサポートしています。 + +[Avroファイル](assets/data.avro)からインポートするには、`INSERT`文で[Avro](/docs/ja/interfaces/formats.md/#data-format-avro)フォーマットを使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.avro' +FORMAT Avro +``` + +[file()](/docs/ja/sql-reference/functions/files.md/#file)関数を使用して、実際にデータをインポートする前にAvroファイルを調査することも可能です: + +```sql +SELECT path, hits +FROM file('data.avro', Avro) +ORDER BY hits DESC +LIMIT 5; +``` +```response +┌─path────────────┬──hits─┐ +│ Amy_Poehler │ 62732 │ +│ Adam_Goldberg │ 42338 │ +│ Aaron_Spelling │ 25128 │ +│ Absence_seizure │ 18152 │ +│ Ammon_Bundy │ 11890 │ +└─────────────────┴───────┘ +``` + +Avroファイルへのエクスポート: + +```sql +SELECT * FROM sometable +INTO OUTFILE 'export.avro' +FORMAT Avro; +``` + +### AvroとClickHouseデータタイプ + +Avroファイルをインポートまたはエクスポートする際は、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data_types-matching)を考慮に入れてください。Avroファイルからデータをロードする際には、明示的な型キャストを使用して変換してください: + +```sql +SELECT + date, + toDate(date) +FROM file('data.avro', Avro) +LIMIT 3; +``` +```response +┌──date─┬─toDate(date)─┐ +│ 16556 │ 2015-05-01 │ +│ 16556 │ 2015-05-01 │ +│ 16556 │ 2015-05-01 │ +└───────┴──────────────┘ +``` + +### KafkaにおけるAvroメッセージ + +KafkaメッセージがAvroフォーマットを使用している場合、ClickHouseは[AvroConfluent](/docs/ja/interfaces/formats.md/#data-format-avro-confluent)フォーマットと[Kafka](/docs/ja/engines/table-engines/integrations/kafka.md)エンジンを使用してこのようなストリームを読み取ることができます: + +```sql +CREATE TABLE some_topic_stream +( + field1 UInt32, + field2 String +) +ENGINE = Kafka() SETTINGS +kafka_broker_list = 'localhost', +kafka_topic_list = 'some_topic', +kafka_group_name = 'some_group', +kafka_format = 'AvroConfluent'; +``` + +## Arrowフォーマットの操作 + +もう一つのカラム形式のフォーマットは[Apache Arrow](https://arrow.apache.org/)で、ClickHouseでもインポートとエクスポートをサポートしています。[Arrowファイル](assets/data.arrow)からデータをインポートするには、[Arrow](/docs/ja/interfaces/formats.md/#data-format-arrow)フォーマットを使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.arrow' +FORMAT Arrow +``` + +Arrowファイルへのエクスポートも同様の方法で行います: + +```sql +SELECT * FROM sometable +INTO OUTFILE 'export.arrow' +FORMAT Arrow +``` + +また、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data-types-matching-arrow)を確認し、手動で変換が必要な場合があります。 + +### Arrowデータストリーミング + +[ArrowStream](/docs/ja/interfaces/formats.md/#data-format-arrow-stream)フォーマットはArrowストリーミング(メモリ内処理用)で使用できます。ClickHouseはArrowストリームの読み書きが可能です。 + +ClickHouseがArrowデータをストリームする方法を示すために、次のPythonスクリプトにパイプでデータを渡します(これはArrowストリーミングフォーマットで入力ストリームを読み取り、結果をPandasテーブルとして出力します): + +```python +import sys, pyarrow as pa + +with pa.ipc.open_stream(sys.stdin.buffer) as reader: + print(reader.read_pandas()) +``` + +次に、そのスクリプトに出力をパイプさせることでClickHouseからデータをストリームします: + +```bash +clickhouse-client -q "SELECT path, hits FROM some_data LIMIT 3 FORMAT ArrowStream" | python3 arrow.py +``` +```response + path hits +0 b'Akiba_Hebrew_Academy' 241 +1 b'Aegithina_tiphia' 34 +2 b'1971-72_Utah_Stars_season' 1 +``` + +ClickHouseは同じArrowStreamフォーマットを使用してArrowストリームを読み取ることもできます: + +```sql +arrow-stream | clickhouse-client -q "INSERT INTO sometable FORMAT ArrowStream" +``` + +`arrow-stream`をArrowストリーミングデータの可能なソースとして使用しました。 + +## ORCデータのインポートとエクスポート + +[Apache ORC](https://orc.apache.org/)フォーマットは通常Hadoopで使用されるカラム形式のストレージフォーマットです。ClickHouseは[ORCフォーマット](/docs/ja/interfaces/formats.md/#data-format-orc)を使用した[Orcデータ](assets/data.orc)のインポートとエクスポートをサポートしています: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'data.orc' +FORMAT ORC; + +INSERT INTO sometable +FROM INFILE 'data.orc' +FORMAT ORC; +``` + +エクスポートとインポートを調整するために、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data-types-matching-orc)および[追加設定](/docs/ja/interfaces/formats.md/#parquet-format-settings)も確認してください。 + +## さらなる学習 + +ClickHouseは、さまざまなシナリオとプラットフォームに対応するために多くのフォーマット(テキストおよびバイナリ)をサポートしています。以下の記事で他のフォーマットとその活用方法をさらに探索してください: + +- [CSVとTSVフォーマット](csv-tsv.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブとバイナリフォーマット](binary.md) +- [SQLフォーマット](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してください - Clickhouseサーバーを必要とせずにローカル/リモートファイルで作業するためのポータブルでフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json b/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json new file mode 100644 index 00000000000..8f17589ef18 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json @@ -0,0 +1,3 @@ +["Akiba_Hebrew_Academy", "2017-08-01", 241], +["Aegithina_tiphia", "2018-02-01", 34], +["1971-72_Utah_Stars_season", "2016-10-01", 1] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json b/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json new file mode 100644 index 00000000000..e6d73ac80f5 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json @@ -0,0 +1,5 @@ +[ + ["Heidenrod", "Arthur_Henrique", "Alan_Ebnother"], + ["2017-01-01", "2016-11-01", "2015-11-01"], + [10, 12, 66] +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json b/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json new file mode 100644 index 00000000000..6304484f563 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json @@ -0,0 +1,5 @@ +{ + "path": ["2007_Copa_America", "Car_dealerships_in_the_USA", "Dihydromyricetin_reductase"], + "month": ["2016-07-01", "2015-07-01", "2015-07-01"], + "hits": [178, 11, 1] +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json b/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json new file mode 100644 index 00000000000..a02ac155e46 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json @@ -0,0 +1,5 @@ +[ + {"name": "Joe", "age": 99, "type": "person"}, + {"url": "/my.post.MD", "hits": 1263, "type": "post"}, + {"message": "Warning on disk usage", "type": "log"} +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow b/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow new file mode 100644 index 00000000000..615593bb3ea Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro b/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro new file mode 100644 index 00000000000..817200d6672 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary b/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary new file mode 100644 index 00000000000..5a7cfee6736 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson b/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson new file mode 100644 index 00000000000..3b37c10c0a1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse b/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse new file mode 100644 index 00000000000..56dffd70ae0 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse @@ -0,0 +1,59 @@ +pathStringBangor_City_Forest Alireza_AfzalAkhaura-Laksam-Chittagong_Line1973_National_500 +AttachmentKellett_Strait Ajarani_RiverAkbarabad,_KhomeynAdriaan_Theodoor_PeperzakAlucita_dryogramma +Brit_Med_J4th_Metro_Manila_Film_FestivalAlialujah_Choir1953-54_SM-sarja_seasonAir_Force_Song 4-6_duoprismAshley_Spurlin Asfaq_Kayani1607_in_architecture4-way_speakers Blue_Heeler5_Euro'2009_Spa-Francorchamps_GP2_Series_round"2015_Guru_Granth_Sahib_desecrationAgriculture_Marketing_Service2006_Football_League_Cup_Final2008_Uber_Cup_group_stage1923_PGA_Championship +Fannie_Bay +AlchemyAPICinema_of_ItalyArodes Damien_MarleyAl_Jumayl_Baladiyat(2015_Alabama_State_Hornets_football_team Aglossa_tanya73rd_Pennsylvania_Infantry72015_European_Junior_and_U23_Canoe_Slalom_ChampionshipsAfrican_LeopardFaverolles,_OrneAaron_FukuharaAnnular_ligaments_of_trachea2014_US_Open_SeriesA_Better_MousetrapDibakluAt_Samat_District Aaron_Peasley Apistomology Buyat_Bay#1942_Estonian_Football_ChampionshipAction_for_Autism100_Hz+2003_Arizona_State_Sun_Devils_football_teamAntona_obscuraAkiko_SugiyamaElysburg2017_New_South_Wales_Cup#2011-12_Gold_Coast_United_FC_seasonPAgency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean Albert_DunnHahamakin_ang_Lahat2013_Spuyten_Duyvil_derailmentAylingAnti-Establishment"1951_Spanish_motorcycle_Grand_Prix2009-10_Brunei_Premier_League23_Ursae_Majoris&1927-28_Austrian_football_championshipAndrew_McKeever Clinocottus2006_State_of_Origin#2013-14_Los_Angeles_Clippers_seasonCor_JesuBesseringen_B-Werk +Amy_Hempel Franc-ComtoisAllium_giganteumAbishaiAbraham_Clark_High_SchoolBaku_chronology22nd_MEU2015_Open_Engie_de_TouraineChurchill_BowlAGMARKAmerican_standard_wire_gauge Araby,_LA217_BC#2008_Trinidad_and_Tobago_League_Cup +Alazan_BayAluminum_fencingAchilles_tendinitis"AFP_Peacekeeping_Operations_Center2013_Xinjiang_clashesArborea_Giudicato_of_Arborea1941_Cleveland_Rams_seasonJu_Posht,_Rasht Ascalenia AplectoidesEuropean_Cup_1969-70Armen_Mkertchian 2015_Aspria_Tennis_Cup_-_Singles14_August_1947Adobe_Creative_Suite_1IC_chips Austo_AE300 +Date_palms BCS_bowl_game AR_BorderAranda_de_Duero,1919_Wake_Forest_Demon_Deacons_football_team*All_The_Wrong_Clues_For_The_Right_SolutionAllan_Campbell_McLeanBradford_Council_election,_2011Astronomy_and_astrophysicsDutch_Antillean_people +Army_Radio BBVA_Bancomer +Lake_Aloha Andy_Bean1941_Pittsburgh_Steelers_seasonAniopi_MelidoniAglossosia_fusca Art_books1929_Washington_Senators_seasonAntaeotricha_congelataDouglas_C-54G-5-DO_Skymaster Chris_Jamison Ace_BlackwellAbdul_Qadir_FitratArnoldo_Vizcaino*2012_Open_EuroEnergie_de_Quimper_-_Doubles Dale_Rominski ADHD_coaching +Claire_Yiu ApplicantApache_OpenOfficeAbel_Kiprop_MutaiAirdrome_TaubeAndrey_ViktorovichAmerican_Idol_controversyAnthrenocerus_confertusAppraisal_SubcommitteeBabusa 500_homeruns"Argentina_national_volleyball_teamChief_prosecutor_of_RussiaAbsolution_DVD1,3-Beta-glucan_synthase Dave_SinardetAdeline_Whitney Allon_shvut-2012_Penn_State_Nittany_Lions_football_seasonColeman-Franklin-Cannon_MillAction_directorAD_547Acta_germanicaAbu_Dhabi_Global_Market_Square Kozo_ShioyaChina_Investment_CorpDmitri_Zakharovich_Protopopov Anatra_Anadis Archaikum2000_Webby_Awards2003_BCR_Open_Romania_-_SinglesAbacetus_bisignatusAmerican_school_of_kinshasaAnna,_7th_Duchess_of_BedfordBlack_majority_district Dagma_Lahlum Credit_SaisonAriyankuppam_firkaAnnette_FuentesAngerstein,_JohnAnnenkov_IslandAnne_Frank_museumAnnales_sancti_AmandiL-FABP +Alvord,_TX*2006_World_Team_Table_Tennis_Championships AngriffenAnthony_OppenheimerAbsamat_Masaliyevich_MasaliyevAirborne_Museum_at_AldershotAktiubinsk_Oblast100_East_Wisconsin#7th_Bangladesh_National_Film_AwardsAlejandro_ReyesApplied_philosophyAdhemar_PimentaBreak_the_fourth_wallAnnoushka_DucasATC_code_J01CA01Evelyn_County,_New_South_WalesElastic_scattering 1032_PafuriAndrew_Bromwich Ishita_Arun Aspergics 1857_in_ChileBreffni 845_in_poetry20321_LightdonovanArthur_Chandler CsISOLatin21900_Grand_National Aeritalia_AMXB_Sharps 544_area_code30th_Guldbagge_Awards AgrippinaArdmoreAmplypterus_panopusAlexander_BukharovAlaska_Raceway_Park)Albanian_National_Road_Race_Championships41968_Democratic_National_Convention_protest_activity2012_Birthday_Honours2000_NHL_expansion_draftA_Town_Where_You_Live Ahmed_ShahzadElisabeth_Svendsen)2002_FINA_Synchronised_Swimming_World_CupAkatekAnimation_with_DAZ_Studio Fergus_Craig Ancel_Nalau5171_Augustesen Anne_McGuireAustralian_Photoplay_Company1913_in_CanadaArhopala_allataIl_Paradiso_delle_Signore Geri_PalastAlan_Abela_Wadge"22nd_Tactical_Air_Support_Squadron Avant_StellarBlack_phantom_tetraBilly_McCaffreyAnnie_Furuhjelm 1992_PGA_Tour2008_Chilean_pork_crisis2012_Currie_Cup_First_DivisionAleksei_FomkinAlexander_Krausnick-GrohAdam_Richard_WilesATCvet_code_QA01AD01Abu_Bakr_Ibn_BajjaArchitecture-Studio950s_BC AbschwungesAdonis_Geroskipou2008-09_SV_Werder_Bremen_season Closed_loopsAFC_Youth_Championship_1982 Aquila_Shoes9842_FunakoshiEducational_quotientAntoni_Julian_NowowiejskiAdi_Oka_IdhileDEXIA-BIL_Luxembourg_OpenAndrew_James_SimpsonAlexander_Boksenberg1827_in_DenmarkAfternoon_tea_with_suggs Alpha,_MN +Ari_Onasis&1961-62_Football_League_First_Division Andi_LilaA_Gathering_Of_Old_MenAbul_Fazl_al-AbbasAsgill,_CharlesAlexander_Arkhangelsky1947-48_Portuguese_Liga3rd_MMC_-_VarnaAlberts,_WayneAlois_SchickelgruberHefner_Stadium410912_LisakarolineAcademy_at_Mountain_State 617_Squadron$Al_Silm_Haji_Hajjaj_Awwad_Al_HajjajiArturo_Merino_Benitez_AirportAEK_Athens_FutsalAggaeus6Association_for_Retarded_Citizens_of_the_United_States Kielce_pogrom1351_in_poetry#1923_Princeton_Tigers_football_teamAuzata_semipavonaria 892_in_poetry Anton_KrotiakArthur_Shelley2003_Kyoto_Purple_Sanga_season!Frederic_Bowker_Terrington_Carter 2-orthoplexAcacia_australiana2012_Newcastle_Knights_seasonAnn_Wrights_Corner,_Virginia 12557_Caracol#2001_African_Footballer_of_the_Year Bass_PyramidA_noodle +Aed_Bennan 1886_Yale_Bulldogs_football_team2002_Players_ChampionshipAfrican_Skimmer3rd_Guldbagge_Awards Arrows_A19B&Archduchess_Elisabetta_of_Austria-EsteAmerica_Islands1932_Olympic_Games#2011_Chinese_pro-democracy_protests Bank_walkaway594_in_Ireland%Association_of_Municipal_CorporationsAndreas_BrantelidAmarthal_urf_Unchagaon3-methoxymorphinan2382_BC1763_in_scienceArvert Ale_yeastA_Man_Without_a_SoulAir_Force_Base_Louis_TrichardtAthirson_Mazzoli_de_OliveiraAnthony_Chan_YauBasic_Enlisted_Submarine_School%Aboriginal_Lands_of_Hawaiian_AncestryFondren_Southwest,_Houston3_World_Financial_Center#1971_IIHF_European_U19_Championship1937-38_AllsvenskanChristopher_Ashton_Kutcher,Australian_rules_football_in_south_australia Amicable_pair +Alan_Tomes%Alexei_Petrovich,_Tsarevich_of_Russia Alexis_DamourBankruptcy_Act_of_1938 AmphiphyllumConway_High_School_West5447_Lallement Gabriel_Iddan1879-80_Scottish_Cup2011_Eneco_Tour1471_in_EnglandAshland_Town_Hall Archduke_John2000_Cameroonian_Premier_League +1997_floodAgile_managementAm_841Apprentice_MasonHales-Jewett_theoremAlien_Abductions Arjun_Menon AnthokyanAutomobili_Lamborghini Alain_Prost Fartein_ValenAntonio_Galli_da_BibienaAl_Jawf,_LibyaAD_695 +Amir_chandAlcis_obliquisignaChandra_Talpade_MohantyAlgerian_safe_house,_Jalalabad Jake_MilnerAlternate_Communications_CenterIn_the_BleachersAlex_PuodziukasAltarpiece_of_Pilgrim_IICybernetical_PhysicsChristopher_Unthank1982_Independence_BowlAscoli_Calcio_1898Briggs-Rauscher_reactionsAdjadja/Afghanistan_from_Ahmad_Shah_until_Dost_MohammedCatholic_social_doctrine2833_BCBethy_WoodwardBateman_polynomials1966_Buenos_Aires_Grand_PrixA_River_Somewhere&2016-17_BVIFA_National_Football_League!1909_Major_League_Baseball_season1988_Oklahoma_Sooners_football2010s_in_Chechen_fashionAccademia_Olimpica Air_cooling +Amir_Saoud Alex_AuburnApamea_impulsa!Australian_federal_election,_2007 +Ain_Sakhri Belosaepiidae(Acts_of_Parliament_in_the_United_Kingdom Equity_Office David_Bintley Aksel_SchiotzAppropriation_Act_2000Edward_Johnson_III&2006_Ohio_State_Buckeyes_football_teamBattle_of_Fort_Beausejour Abel_Foullon Apollo_VIIICarry_on_up_the_jungle Armour_villa +201_PoplarArta_prefecture2015-16_EkstraklasaAlport,_Ontario BongolandAlfred_Charles_PostAam_Aadmi_Party_crisis Andrea_ModaAbdul_Halim_ShararApostolic_Vicariate_of_YunnanCatherine_SteadmanAgastachys_odorata9783_Tensho-kan +AFL_CairnsAbomey"Anne_Crofton,_1st_Baroness_CroftonCash-flow_return_on_investment%Alberto_Arvelo_Torrealba_MunicipalityAbyssinian_Shorthorned_ZebuAlbanian_hip_hopAlphonso_IV_of_Portugal19th_The_Alberta_Mounted_RiflesChinese_shadow_theatre.American_Committee_of_the_Fourth_International2014_Bahrain_GP2_Series_roundAlexandrian_orthodox2010_Hurricane_Season21938_All-Ireland_Senior_Camogie_Championship_Final ATC_code_D01AlbedoChavigny,_Meurthe-et-Moselle Becky_Essex$Archaeological_Museum_Padre_Le_PaigeAbu_Bakar_Sillah Back_chatAnchylobela_dyseimataAnthony_Overton Bear_maulAmbarawa,_Central_Java Amber_lager2nd_LAAD Ashiya,_HyogoAngels_at_RiskAudrey_Marie_Munson&1984_Australian_Football_ChampionshipsAmmonia_fountainAllister_BentleyAlsager_Hay_Hill1753_English_cricket_season 2009-10_New_Jersey_Devils_seasonAn_Untamed_StateBeatrice_CarmichaelAbdul_Ghani_AhmadArteria_suralisBerzasca_River Angel_Attack&1969_San_Francisco_49ers_football_teamAnthony_BeilensonCrystalline_EntityGranice203rd_General_HospitalAcrocercops_rhombiferellumAmpliglossum_blanchetii 11553_Scheria Ashkenozi2010_Calder_Cup_Playoffs Alice_Caymmi Alfredo_Alvar2006_Legends_TourAlbano_Albanese#1943_Frankford_Junction_train_wreckEvans_Court_Apartment_Building$Abu_al-Rayhan_Muhammad_ibn_al-BiruniAbubakar_Muhammad_RimiDostpur%Accessories_Council_Excellence_Awards2006_North_American_heat_wave AmstelodamumA_Very_Peculiar_PracticeAllegorie_der_Liebe Alex_Mackie1812_Homestead_Farm_and_MuseumArgus_distributionAnthony_Thomas_StoverArthur_ShallcrossAntoine_Francois_Fourcroy Abbas_HalimAkiva_Baer_ben_Joseph BalatonfueredAntemnae Cling_Cling B_flat_major +AirExploreAuckland_Super_SprintAlfredo_De_GasperisGeoffrey_I_of_ViandenCopa_de_ZaachilaAlboacenBNH_Hospital_BangkokAgricultural_health_and_safetyChiasms +Al_KaraanaAlberta_Highway_872Among_the_mournersAchema_Power_Plant ATSE_Graz Arthroscopy.2010-2012_European_Nations_Cup_Second_Division1967_Cincinnati_Reds24th_Golden_Disc_Awards Johnny_Floyd Arthur_Rupin-Alpine_skiing_at_the_2011_Canada_Winter_GamesCollege_Press_ServiceAmerican_Psycho CBC_WinnipegBurning_the_process2011_Stanley_Cup_playoffsAndrew_Mumford%1925_in_fine_arts_of_the_Soviet_Union Aragvi_riverAndrew_AdamsonArcides_fulvohirtaAraya_Selassie_YohannesApartment_house Advanced_Art 1028_Lydina82005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti Adolph_WeissAdam_Jerzy_Czartoryski(1980_United_States_presidential_election 1956_OscarsBurundian_Senate_election,_2005Amarolea_floridana August_BierArbelodes_sebelensis Abiah_BrownA_Maceo_Smith_High_School1488_in_architecture2009_AMP_Energy_5001921_Baylor_Bears_football_team Dmitry_Akhba*2004_Big_12_Conference_Baseball_TournamentAbdisalam_OmerAlma,_son_of_Alma An_Phoblacht2009_Turner_Prize +Jack_Zajac1906_Wimbledon_ChampionshipsChuckwalla_ValleyAlien_QuadrologyChalcidoptera_contraria6Alaska_Republican_Gubernatorial_Primary_Election,_2006 333639_YaimaAquila_hastataAl-Fua AnihilationInternational_Toy_Fair38th_Regiment_Indiana_Infantry Andrea_StellaAnselmo_de_Moraes ApplemoreAkpinar,_KirsehirAnt_nestCatherine_of_SienaBarbosAmlaib_mac_IduilbAlice_JanowskiAcacia_leptocarpa Al-Hadi_Yahya)2015_British_Figure_Skating_ChampionshipsAvenues_TelevisionDendropsophus_sartori1952_in_GermanyArmuchee_High_School April_1_RFCCaroline_Bliss66th_Rice_Bowl Alec_Smight Alexei_PaninCodewordDormice2105_BC#5th_National_Congress_of_KuomintangCaminho_das_IndiasAgerbo Abe_Anellis +Aceh_Medal Alltech_ArenaAly_Oury757th_Troop_Carrier_Squadron Alec_PetersAgua_Buena_AirportAlessandro_LiviAndkaerCateran'57th_Venice_International_Film_Festival Brijal_PatelCnemaspis_jerdoniiAluminum_sodium_saltArnaldo_Antonio_Sanabria_AyalaAngels_of_IronBugs_Bunny_Rabbit_RampageAdmiralty_Class_Destroyer Atlas_MediaArcesilaus_i_of_cyrene.2011_Tajikistan_national_football_team_resultsArtur_Shakhnazarov747_Express_Bus101-in-1_Party_MegamixFastpoint_GamesAnalog_Anthology_1 Archival_bond1985_Air_Force_Falcons_footballDAmerican_Airlines_plane_diverted_to_Miami_after_landing_gear_problem&Adaptive_Evolution_in_the_Human_GenomeArthur_Strangways1583_in_poetryAndrew_igoudala Euonychophora Catechizing$1960-61_ice_hockey_Bundesliga_season Buk_Vlaka Arbor_Day +Guan_Sheng!2014_Barcelona_Open_Banc_Sabadell1976-77_Nationalliga_A AFL_records2005_Tour_Down_Under92_BCEBento_Box_AnimationAlabama_TerritoryAbdul-Wasa_Al-SaqqafArchbishops_of_SemarangAmbivinaAghjaghala_UliaBlechnum_novae-zelandiae +DictyosomeArts_Council_of_Great_Britain LBC_Radio Ageo,_Saitama Babla_Mehta2012-13_Russian_Cup Chandragupt407th_Air_Refueling_Squadron AftermarketA_Portrait_of_New_Orleans2000-01_Yemeni_LeagueActinidia_chinensisAmsterdam_Tournament_1999Arthur_IberallAuricula_MeretriculaArchbishop_of_LahoreChippewa_Indians_of_MontanaAbidjan-Niger_Railway29th_Annual_Grammy_AwardsAteles_geoffroyi_frontatusEnrico_Cernuschi +A4183_roadAhrayut Alison_CastleAutomobile_aftermarket$2008_GAINSCO_Auto_Insurance_Indy_3001937_Scottish_Cup_Final2005_Clipsal_500_Adelaide Farid_Farjad13_Tribes_of_Long_IslandAfroneta_bamilekeiFrederick_Stuart_GreeneAndre_Braugher(1906_International_Lawn_Tennis_Challenge2009-10_NFL_PlayoffsCricket_Wellington Craig_BlazerAeolidiella_orientalisAndre_Prokovsky Angela_McKeeAirbase_Golubovci%2011_ISAF_Sailing_World_ChampionshipsBartica_Airport +Agusan_DamBosque_Real_Country_ClubGeorges_Duhamel +Allrounder'2017_Missouri_State_Bears_football_teamAllons_a_LafayetteAgathla1086_in_poetryAbsolute_extremeAgathe_BonitzerChinese_Red_PineAngular_dispersionJean-Sebastian_Giguere Actinium-235Ago,_filo_e_nodoAranea_cruentata2009_Korea_National_League +Americom-82006_Junee_Bushfire)2013_Major_League_Baseball_Home_Run_Derby1928_US_Presidential_ElectionAfter-eighty_generation"1932_Hawthorn_Football_Club_seasonAmelia_Elizabeth_Mary_Rygate Aline_KhalafAkron_Junction,_New_York'Apollo_moon_landing_conspiracy_theories(1978_National_League_Championship_Series$1959-60_German_football_championshipAlmost_a_BrideAndrew_Lysaght,_junior1902_Otani_expedition1892_Currie_Cup1988_USC_Trojans_football_team1944_in_Northern_IrelandAlfred_AchermanArcadia,_Nebraska4_x_400_metre_relay +A4030_roadChi-liAircraft_fairingBuddhism_in_BelizeAlameda_County_Open3Area_of_countries_and_regions_of_the_United_Kingdom'2014_Weber_State_Wildcats_football_team#American_Journal_of_Comparative_LawA_Teaspoon_Every_Four_HoursAstasisAkhrakouaeronon +Annenkrone Ballotine2000_Kipawa_earthquakeArchdiocese_of_cashel_and_emlyChevrolet_SS396 AchyroserisDaniel_Pulteney 2006_Major_League_Baseball_draftAdetunji_Idowu_OlurinArdatov,_Nizhny_Novgorod_OblastAndrew_Hilditch"A_Very_Merry_Daughter_Of_the_Bride 1993_in_radioDeltanAdnan_Custovic +Di_Gennaro237_AD Aaron_Gombar +AcrolophusAlfred_Bergman Charles_BebbDirico 1982_Major_League_Baseball_Draft DDT_wrestling1988-89_Houston_Rockets_season Acacia_loderi%2015_Deauville_American_Film_FestivalAndropadus_importunusAntonio_Bacchetti Ann_Trindade5_x_Monk_5_x_LacyBarlochan,_OntarioAchaian +Flow_riderAntiblemma_discerpta+1997_Illinois_Fighting_Illini_football_teamAhrntalApollo_ConferenceAlgenib_in_Perseus Craig_Norgate Antwerp_ZooCold_ContagiousBolitoChinese_bridges14th_Indiana_Infantry_RegimentBindunuwewa_massacreEastshore_Highway Daemonologie Aero_PacificoBlue_Ribbon_Schools_ProgramAsh_Township,_MIAl-Hatab_Square Alje_Vennema31920_All-Ireland_Senior_Football_Championship_Final Criss_OlivaBethlehem,_Ohio1976_WHA_Amateur_DraftAngela_FimmanoAlexander_Bonini_of_Alexandria Anarchist_faqAleksander_Benedykt_SobieskiCape_Florida_LighthouseFernando_VI_of_SpainCrossing_number 1984_NSL_CupBarbara_Weldon Andreas_OlsenBattle_of_Baima Amory_HansenAkhmimicAl_AwdaAdelheid-Marie_of_Anhalt-Dessau#Americans_for_Technology_LeadershipBelizean_diplomatic_missionsAfrican_communistAndosolAlan_AttractionA_Yank_in_Rome 2004_in_the_United_Arab_Emirates AdditionalityAssassination_of_Trotsky Alice_SoteroAgyneta_platnicki Alexandra_Vasilyevna_Velyaminova 1881_in_ChileArterial_ischemic_stroke Astro_GlacierChester_Earl_MerrowAlejandro_de_la_Madrid 70936_KamenAK_Steel_Holding_Corp1124_Stroobantia Asian_Wedding23837_Matthewnanni3Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden Betsy_HodgesArthur_and_the_Invisibles"Arkansas-Ole_Miss_football_rivalryAsia_CupArginine_racemase$585th_Field_Company,_Royal_Engineers1975_Stagg_Bowl7Dame_Commander_of_The_Most_Honourable_Order_of_the_BathAskajian'2006_Nebraska_Cornhuskers_football_teamCicero_Francis_Lowe_HouseConan_IV,_Duke_of_Brittany*2005_World_Modern_Pentathlon_Championships 1946_Aleutian_Islands_earthquakeANKRD17%1970_Maryland_Terrapins_football_team Ali_Dehkhoda 1244_in_art1520s_in_DenmarkAbdoulaye_GayeAn_Angel_Has_Arrived1453_BC2017_National_Games_of_ChinaA_Night_in_SickbayDateline_Diamonds419_guestbook_spammingFamiliar_bluetAbu_Bakr_Mirza7272_Darbydyar Ages_of_consent_in_Latin_America1982_Japan_Soccer_League_Cup2810_BCDruga_Liga_Republike_Srpske1998_Swedish_Rally1567_in_Norway+126_Army_Engineer_Regiment,_Royal_Engineers#2017_American_League_Wild_Card_Game August_Follen Ala_Gertner"Glenwood,_Harford_County,_MarylandApplied_ecologyAriarathes_V_Eusebes_Philopator2006_AFC_Champions_League 60_minutes_2Embryonic_shield-2001_Meath_Intermediate_Football_ChampionshipApparition_of_Christ_to_MadonnaHoosier_Road_ElementaryArua_UdaArray_comprehensionBaszkiAkron_NeighborhoodsCatholic_Church_in_Costa_RicaCanada-Sweden_relationsBarza_Radio_CommunityDalhousie_Middle_SchoolAlliphis_bakeriBartica_massacre 30th_January1920_revolution +AmyraldismAA_Jefferson_DistrictEunebristis_cinclidiasA_Scott_Connelly Antony_DuroseArval_BrethrenAnthidium_dissectum%Aru,_Democratic_Republic_of_the_Congo"1956-57_West_Indian_cricket_season2014_Moscow_Film_Festival +Anna_GurjiAllen_Memorial_Medical_LibraryAnton_Sistermans Clotheshorses 36_StratagemsAttack_of_the_crab_monsters30_rock_awards+Aeroflot,_Uralsk_Civil_Aviation_DirectorateAmblyseius_parabufortusIndian_coral_tree3285_Ruth_WolfeAnderson_da_Silva_Gibin5001st_Composite_GroupDanzik4810_RuslanovaArkendale,_VirginiaAl_Francis_BicharaCayenaA_Glass_of_DarknessGMC_CCKWAlabama_State_Route_1072011_in_motorsport$Adecco_General_Staffing,_New_ZealandAnbargah1995_Asian_Cup_Winners_Cup01986_Wales_rugby_union_tour_of_the_South_PacificAdya_Goud_Brahmin Akcakiraz24249_BobbiolsonAhmanson_TheatreAbdullah_ibn_Jahsh 1937_in_Chile2000_in_EnglandA_Deepness_In_The_Sky Area_code_678 Avalon_HillAnna,_Duchess_of_PrussiaAlexandr_Syman7400_series_logicGreenleaf_Township,_Minnesota AcetylsalEarth_and_Man_National_Museum Affetside1971_CFL_season +Beth_BaderEnrolled_NurseAl-Azraq4th_South_Carolina_RegimentAmanda_Overmyer Auto_wrapAnonymous_internet_banking CuratoriaA-rollAccra_hearts_of_oak_scApostasy_from_JudaismAcantharctia_tenebrosaAbigail_Keasey_Frankel 2008_Paraguayan_general_election Adams_motorDrummond_Community_High_SchoolAndrews_Nakahara10th_MaccabiahAckerman,_Rick Dumri,_BuxarAsking_Jesus_into_your_heartAdamowicz_brothers Alien_MusibatAhmad_Al_TayerAnalytical_phonics +Do_It_Good2004_Kumbakonam_School_fire#1977_Chattanooga_Mocs_football_team Globe_valvesAbelmoschus_crinitus 1874_Yale_Bulldogs_football_teamClimer Auchroisk2010_Albirex_Niigata_season AdhocracyChios_MassacreAfrican_Red_Slip1976_Portland_Timbers_seasonAlsace-Larraine 3750_IlizarovAleksandr_Shkaev 32_bar_formAequatorium_jamesonii Abade_neivaArakvaz207_Sqn Ducal_hat 2_DegreesAhmeddiyya_IslamAmidi-ye_Kohneh!Contributions_to_Indian_Sociology Clark_LeibleeAbraham_of_StrathearnmonthDate@.C'A DDC|DJCD'A@'ADBDAC D9BEA@iCAdAWBdAAvBAACB@ACACDvBCdACBDB@CA@C9B@CBABDCACC?DCB|DCvBC DCdA@CCCACvBA@EAEACC]D@BAAdABCA'ACCWBDBBD?D@CWB@CCAA D@C'A@DBCDB9BDiCiCBCBdAD D]DC@BEAC'AiC9BA|DD@9BvB@@CADWB]DC@ADCCCA D?DiCvBBAvBB@@A9BAA9BCCCBAJCBAA@C]DD9BA D@BB@ACWBD@CEA]DC9BJC@'A@CAADCJC D DCBDBvBiCDBdAiC?DAiC@CCJC DCBC?D]DAD@BC'AJCAACCAAAA]DA|D?DBA]DJC?DC@dA@DCC@@WBCDCDDB@ D@DCCA?DCA]D]DDAA'A9BCJCCC@D D9BCBEACdAAdAAiCB'ACiCWBWBiC]DDDCCC'ACCDACB|DdAAEAC9BAdACiCBdAC@D?D'A]D|DC DAAAiCABJCDdACC@C DCADCC@DCD9BCBACEAEAiCEA?DBC@B@B@ D@ DBCDCBA@AEA@CAvBDDCBB@CBBEAA D@ACADAABACAD@C|DAC@DCCAJCAABDDDAC9BDB@BBB]D.CC'A?DDACC]DCJC.C|DAiCCEAvBA?D@BA@DvB'A.CDA.CB|DBCB?DCC]DdA]DCADCBCBBA@ D.C|DACCA'ACACACCD.CDBdABA@iC@'ACvBA@ADDB]DAJC@WBDABACACAAADdAC@CCC'AB@BB@CDJCACA@@A?DB9B.CDA@?D9BC?D|D@B9BC]DDvBiCCiCC@BDDC DCJCiC]DD DBC'ADCCdA'A@BADCDCvBAdABACDWBC DCBABC9BB|DCAWBvBJCdAD.CABA|DCCB.CBABWBiCDAACCiC DAB@CC?DBCCB@CJCD?D@'AD]DCACD.CA?DvBDDBACC]DC'AJCCCEADBBBC.CDWBBB@.C DBAJCAdAABdACCABCAiCAiCCB]DC?DDiCCCCBBAdABAiC'ABCJCCD?DAEAAAACBBiC@BC@CDDDBBCACD@BACCC@CABdADWBEACBBBADC@DA@9B|D'ACdACA DBEAJCAA@'ABDCCAA@BWBJCD?DiC@A]DAACBCAC D?DJCA@CDEAA DCdAC]DDDBCdACCBdA@AC@BB?DCdACCBCCWB?DCiCiCCCWB.CCCB'ACCCAvBJCAAABCiCCdA]D]DEA9BBJCA]DABAAC@CAiC?DCiCBEAABAB@.CA@BB DA|D?DA'AC DiCABBB]DAAA]DvBCAACCBC@.CWB'ACCADBvB DBJCA?DBADhitsUInt32"PLXP^ (aX$  @## 6ZHR &W0ZCO8X'u0@( + O  >9 $/ +; 2.$@ +]#hOC w )[#B^#& E %;. +h ' +NwI&M:a37 e^ + +='    +O) g:6' qR +M @ R/BL +^5hrVlbZX2*f[-&aj4LD3 aR  > !b&Q&*8| P[ 3 WJ H3Usbr, y,5 D_]x:7A-G& ?U5b8 +-+%t5K +K25f" 0'& ?T?V! + hbS  wD% +?I9  +`pg ?K73~x IEY*z?di  Q*8E5.E(!/>/>()%CU[/'Z +#~ 41%#KI*os4w-(!/  )FZF!s/9:^0L:2 +&* +$ 5V "Y bl$U5 +<-CQx$ I_w V!9p;+*db-%#'B %%V)   + * \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk b/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk new file mode 100644 index 00000000000..fb05c0c859a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc b/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc new file mode 100644 index 00000000000..1e360f94fe7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet new file mode 100644 index 00000000000..52a08e0cfff Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv new file mode 100644 index 00000000000..d2f59a757fa --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv @@ -0,0 +1,102 @@ +"path","month","hits" +"String","Date","UInt32" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv new file mode 100644 index 00000000000..14a0e1ac080 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv @@ -0,0 +1,1000 @@ +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 +"1-krona","2017-01-01",4 +"Ahmadabad-e_Kalij-e_Sofla","2017-01-01",3 +"Bob_Dolman","2016-11-01",245 +"Bellevue,_French_Guiana","2017-01-01",5 +"Bison_Nickel","2017-01-01",2 +"Arthur_Drabble","2016-12-01",35 +"Edgewater_Borough,_New_Jersey","2016-11-01",3 +"Alberto_Cambrosio","2017-11-01",31 +"Amalia_Celia_Figueredo","2017-07-01",32 +"1989_-_1992_Rugby_League_World_Cup","2016-01-01",10 +"Admir_Seferagic","2016-06-01",7 +"Adriaan_Loosjes","2015-05-01",46 +"Alfred_Manuel_Martin","2015-06-01",3 +"Academy_of_the_Arabic_Language","2015-08-01",67 +"Ankita_Shrivastav","2018-01-01",7430 +"Anarchism_in_asia","2017-11-01",1 +"Batiquitos_Lagoon_State_Marine_Conservation_Area","2015-07-01",18 +"Alstonia_calophylla","2017-12-01",2 +"4-Hydroxycyclohexanecarboxylate_dehydrogenase","2016-11-01",4 +"832_symmetry","2017-09-01",6 +"1931_Fuyun_earthquake","2016-07-01",64 +"1998_Masters_of_Formula_3","2016-01-01",60 +"2011_LG_Hockey_Games","2016-04-01",7 +"Generalized_pustular_psoriasis","2017-01-01",159 +"2013_European_Cup_Winter_Throwing","2016-07-01",56 +"2008_in_Argentina","2017-06-01",48 +"Apostrophized","2017-10-01",5 +"Algebraically_compact_module","2017-01-01",5 +"Askett","2015-10-01",79 +"2009_swine_flu_outbreak_timeline","2015-08-01",65 +"72704-01-9","2017-12-01",4 +"Alexandre-Charles-Albert-Joseph_Renard","2017-11-01",4 +"Acyl-CoA_oxidase","2016-09-01",250 +"2011_Budweiser_Shootout","2015-08-01",109 +"Augusta_Davies_Webster","2015-07-01",2 +"Association_theory","2017-07-01",112 +"Abemama_Airfield","2015-05-01",8 +"Archaeological_Museum_of_Heraklion","2015-10-01",14 +"Authorized_marches_of_the_Canadian_Armed_Forces","2016-11-01",241 +"1986_in_Portugal","2017-01-01",7 +"Antiziganism_in_Bulgaria","2017-12-01",13 +"Adriana_Martin","2015-09-01",21 +"2004_Green_Bay_Packers_season","2015-05-01",970 +"Agrippa_the_Sceptic","2017-11-01",95 +"Admiral_Island","2016-04-01",1 +"Auxiliary_sign_language","2015-06-01",31 +"2013_Food_City_500","2015-06-01",90 +"Andy_Roesch","2015-08-01",15 +"Alsoszentivan","2017-05-01",4 +"Architecture_of_Belgium","2015-05-01",199 +"1_South_African_Infantry","2017-06-01",5 +"1930_Auburn_Tigers_football_team","2016-12-01",39 +"1860_in_Canada","2017-05-01",269 +"Aldeaseca_de_la_Frontera","2018-03-01",21 +"Elijah_Fox_Cook","2015-07-01",13 +"2010_BCS_Bowl_Games","2016-03-01",1 +"2017_NPSL_season","2017-06-01",2806 +"Bank_of_New_South_Wales_v_Commonwealth","2016-12-01",173 +"American_Enterprise_Association","2016-02-01",4 +"26th_Kentucky_Derby","2018-03-01",1 +"Chaldean_Diocese_of_Amid","2016-11-01",18 +"Ajaran_language","2016-03-01",1 +"1992_Texas_Rangers_season","2017-06-01",113 +"26_SAS","2017-12-01",3 +"2015_Terengganu_FA_season","2016-01-01",537 +"Aagard,_Oregon","2017-03-01",3 +"Auberry,_CA","2017-05-01",13 +"American_Eskimo_spitz","2015-09-01",3 +"Antidiabetic","2016-11-01",75 +"Asinius","2017-11-01",26 +"Andrey_Vasilievich_Abramov","2016-10-01",1 +"Alan_Carrington","2018-03-01",91 +"Colebrook,_Ontario","2017-06-01",2 +"Abbasabad-e_Kheyrabad","2015-08-01",24 +"Arandjelovac_Municipality","2016-02-01",1 +"Aloysius_Valente","2017-12-01",11 +"Almondo_Curry","2016-03-01",86 +"4th_century_AD","2017-03-01",13 +"Askhat_Dilmukhamedov","2016-02-01",77 +"1147_AD","2017-05-01",1 +"1953_Torneo_di_Viareggio","2017-03-01",20 +"ATP_Schenectady","2015-12-01",30 +"Lakarian_City","2017-01-01",3 +"Adam_Ferency","2017-12-01",176 +"AugustDvorak","2016-07-01",5 +"97th_Light_Infantry_Division","2017-07-01",1 +"16th_Connecticut_Infantry_Regiment","2016-05-01",146 +"2011_Somalian_drought","2017-05-01",2 +"Anbargah","2017-12-01",8 +"1921_in_Paraguayan_football","2016-03-01",2 +"Cosmetic_dermatitis","2017-01-01",5 +"Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia","2015-09-01",9 +"1300_AM","2016-07-01",106 +"A_Promising_Africa","2016-03-01",41 +"2015-16_Odense_Bulldogs_season","2016-10-01",1 +"Aral_AG","2017-12-01",1446 +"Angel_Vivar_Dorado","2015-12-01",6 +"1951_Australian_Championships","2018-03-01",32 +"DJMax_Portable_Hot_Tunes","2017-01-01",27 +"Allinge","2017-03-01",32 +"1986_Buick_WCT_Finals","2016-11-01",14 +"Arimatsu,_Aichi","2015-06-01",112 +"Arthur_Berzinsh","2017-02-01",249 +"Apolima_Uta","2017-04-01",23 +"Capitol_Hill_Pride_Festival","2015-07-01",19 +"Kara-Murza","2017-01-01",5 +"Aigleville,_Alabama","2015-11-01",19 +"Abdullah_bin_al-Hussein","2017-02-01",1 +"2017-18_Inter_Milan_season","2018-03-01",26 +"African_Collared_Dove","2016-07-01",10 +"Achaea_dmoe","2016-11-01",3 +"Aurora,_Utah","2016-06-01",201 +"Architecture_in_Portland,_OR","2017-07-01",1 +"Charchala","2015-07-01",4 +"Around_the_Roses","2015-07-01",3 +"1965_in_music","2016-12-01",3394 +"Alojzije_Jankovic","2017-04-01",5 +"Arisu_Seno","2015-08-01",6 +"ALCO_T-6","2017-01-01",77 +"1998_Royal_Bank_Cup","2015-12-01",32 +"1956_Claxton_Shield","2016-11-01",9 +"Anita_Dube","2017-07-01",233 +"Anderson_Windows","2015-05-01",13 +"Annaquatucket_River","2018-03-01",38 +"Black_salve","2017-01-01",1496 +"Anna_Pendleton_Schenck","2017-02-01",11 +"Asghar_Nadeem_Syed","2017-07-01",146 +"Disarming","2016-11-01",5 +"Antarctic_ice_cap","2017-08-01",7 +"Antonio_Ottone","2017-05-01",11 +"Coralie_Larnack","2017-01-01",9 +"Budha_Subba_Gold_Cup","2016-11-01",24 +"Amphoe_Chaiya","2017-03-01",9 +"Anarcho-capitalism_in_Somalia","2016-10-01",7 +"Felix_Loch","2017-01-01",131 +"26508_Jimmylin","2017-12-01",3 +"Andrew_McMillen","2015-11-01",134 +"Dundee_Canal_Industrial_Historic_District","2017-01-01",2 +"Aula_Baratto","2015-12-01",140 +"Church_of_St_Mary,_Knowsley","2015-07-01",1 +"Aggelakis","2017-10-01",1 +"Al_Badiyah","2017-11-01",157 +"Assault_Gunboat","2016-03-01",21 +"Lachau","2017-01-01",4 +"2008_Pittsburgh_Steelers_season","2016-12-01",10018 +"Apolychrosis_candidus","2018-01-01",24 +"Andrei_Krylov","2017-02-01",192 +"Aldesh_Vadher","2018-02-01",7 +"Alwand","2017-02-01",7 +"Edward_Baker_Lincoln","2015-07-01",4347 +"Aermotor_Corporation","2017-11-01",4 +"Aischylos","2017-01-01",7 +"6th_Assault_Aviation_Corps","2017-07-01",100 +"Azygos_lobe","2016-10-01",1598 +"Demirciler,_Nazilli","2015-07-01",4 +"Akhlaq-e-Hindi","2016-11-01",13 +"Dragon_Crusaders","2016-04-01",122 +"25V_USB","2016-01-01",1 +"Calliophis_melanurus","2017-01-01",31 +"Antonionian","2016-10-01",15 +"Ashley_Richardson","2017-09-01",1216 +"1st_Observation_Group","2018-01-01",6 +"Andrzej_Bargiel","2015-05-01",97 +"2008_AFL_National_Under_16_Championships","2018-03-01",20 +"Ammon_Bundy","2016-09-01",11890 +"Benno_Wandolleck","2016-11-01",5 +"Aero-Kros_MP-02_Czajka","2016-03-01",136 +"A6005_road","2015-10-01",14 +"Eagle_Eye_Networks","2015-07-01",101 +"Aarberg","2017-12-01",277 +"Encyclopedia_of_anthropology","2015-07-01",1 +"Duncormick_railway_station","2016-11-01",7 +"Aiqing_huajiao_zhuanyi","2017-03-01",1 +"Crude_oil_washing","2016-04-01",466 +"2010_Indiana_Hoosiers_football_team","2017-06-01",90 +"Book_of_Bodley_Head_Verse","2015-07-01",18 +"Absence_seizure","2016-05-01",18152 +"Cayucupil","2016-04-01",3 +"Akanabee","2017-03-01",1 +"Grooved_consonant","2017-01-01",5 +"Dellamora_philippinensis","2015-07-01",7 +"Dejan_Blazevski","2017-01-01",1 +"Arabis_armena","2016-08-01",25 +"1988_Summer_Paralympics_medal_table","2016-12-01",90 +"2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina","2017-04-01",2 +"1966_in_music","2017-10-01",3510 +"Antti_Tyrvainen","2015-12-01",2 +"African_desert","2016-06-01",262 +"Bruneau_mariposa_lily","2016-04-01",1 +"Bernie_Parmalee","2017-06-01",221 +"2015_South_American_Youth_Football_Championship_squads","2015-09-01",594 +"1985_IIHF_World_U20_Championship","2015-08-01",7 +"18th_British_Academy_Film_Awards","2018-02-01",270 +"523_Ada","2016-04-01",35 +"Active_Pharmaceutical_Ingredients","2016-02-01",5 +"Burley,_ID_mSA","2015-07-01",2 +"CFRN-TV-10","2017-06-01",2 +"1982_Super_Bowl_of_Poker","2017-08-01",38 +"Australian_Journal_of_Educational_Technology","2017-01-01",1 +"2013_Super_League_Grand_Final","2016-06-01",212 +"2006_BCR_Open_Romania","2015-06-01",25 +"Charlestown_Townies","2016-04-01",319 +"1943_Polish_underground_raid_on_East_Prussia","2017-08-01",8 +"Anthony_Celestino","2018-02-01",182 +"Andrew_Beerwinkel","2018-02-01",73 +"Greigia_atrobrunnea","2017-01-01",1 +"Adrian_Beecham","2017-11-01",1 +"Implementation_of_mathematics_in_set_theory","2017-01-01",12 +"Annastacia_Palaszczuk","2015-05-01",6247 +"Egon_Zimmermann_II","2016-11-01",3 +"Air_aide-de-camp","2018-03-01",137 +"Albert_Murphy","2016-09-01",1 +"1924_Arkansas_Razorbacks_football_team","2016-02-01",28 +"Avondale_Mill","2016-10-01",68 +"Alexander_Volzhin","2015-12-01",25 +"Arek_Monthly","2017-08-01",31 +"Dinka_Blanche","2015-07-01",1 +"1921_Mercer_Baptists_football_team","2016-11-01",10 +"Afro-Antiguan_and_Barbudan","2016-06-01",252 +"American_southern_literature","2016-10-01",3 +"1947_Swiss_Grand_Prix","2016-11-01",32 +"99p_Stores","2017-12-01",3028 +"Artem_Radkov","2018-03-01",21 +"Arctic_brome","2016-12-01",19 +"Battle_Of_Moskova","2015-06-01",6 +"Airdrieonians","2016-06-01",32 +"Advanced_transportation_controller","2018-03-01",79 +"BC_government","2016-12-01",18 +"Antonio_Maura","2017-03-01",457 +"Anjuman,_Afghanistan","2017-09-01",62 +"Deodato_Guinaccia","2015-07-01",13 +"Blowjob_Betty","2016-11-01",28 +"453d_Flying_Training_Squadron","2017-08-01",3 +"1990_Africa_Cup_of_Nations","2016-04-01",22 +"Agenville","2016-08-01",100 +"1202_in_Scotland","2018-01-01",82 +"Calytrix_desolata","2017-06-01",10 +"1957_in_Chile","2016-04-01",13 +"Anglican_Bishop_of_Torres_Strait_people","2017-08-01",1 +"2015_Mexican_Grand_Prix","2015-06-01",528 +"Catalan_parliament","2017-01-01",14 +"Cult_Shaker","2017-01-01",32 +"Ander_Gayoso","2016-11-01",34 +"Ageneiosus_ucayalensis","2017-12-01",20 +"Club_de_Berne","2015-07-01",194 +"Adecco","2016-03-01",9863 +"Anti-unionism","2018-01-01",11 +"Auchindoun_Castle","2017-01-01",102 +"557_in_poetry","2016-07-01",1 +"Abu_ol_Verdi_Rural_District","2017-01-01",1 +"Centro_73","2016-04-01",23 +"Dagger_compact_category","2016-04-01",97 +"Alan_Nunn_May","2017-11-01",770 +"Basal_clade","2015-07-01",44 +"Aizu_Line","2015-08-01",26 +"Edward_Kernan_Campbell","2016-04-01",5 +"865_area_code","2016-12-01",9 +"Bahamas_at_the_1984_Summer_Olympics","2017-06-01",35 +"Gardan_Kalat","2017-01-01",1 +"American_Samoa_national_under-19_football_team","2017-12-01",4 +"Kayah_National_United_League","2017-01-01",14 +"2007_Nordea_Nordic_Light_Open_-_Singles","2016-10-01",2 +"Avondale_Estate","2016-11-01",2 +"Acalolepta_variolaris","2017-02-01",3 +"Anantapur,_Andhra_Pradesh","2017-05-01",1032 +"Amenable_Banach_algebra","2015-08-01",59 +"300_metres","2017-01-01",61 +"Black_Bottom,_Kentucky","2016-04-01",8 +"100_Players_Who_Shook_The_Kop","2018-01-01",1133 +"Adventure_story","2015-07-01",29 +"Anacampsis_lignaria","2017-05-01",5 +"2007_American_Indoor_Football_Association_season","2015-09-01",89 +"Dmitry_Kardovsky","2016-04-01",33 +"A10_autoroute","2015-11-01",27 +"1995_Sydney_Bulldogs_season","2017-04-01",40 +"Ilex_jelskii","2017-01-01",2 +"Adrian_Jose_Hernandez","2016-10-01",2 +"CallAir_A-5","2016-11-01",4 +"22nd_meridian_west","2015-07-01",45 +"Anglican_Diocese_of_Antananarivo","2015-08-01",2 +"Andrew_Kelsey","2016-11-01",14 +"Brownhill_Creek","2017-06-01",4 +"Abunai_Deka","2015-06-01",269 +"Aisha_Jefferson","2017-04-01",115 +"Alonso_Lopez","2017-03-01",7 +"Aeroparque_Ciudad_de_Mendoza","2016-01-01",1 +"Arthur_Ashley_Sykes","2017-12-01",45 +"Holy_Face_Medal","2017-01-01",20 +"1Chronicles","2018-02-01",1 +"2014_CFU_Club_Championship","2017-12-01",108 +"Aetna_class_ironclad_floating_battery","2015-06-01",37 +"Antoine_Delrio","2015-07-01",2 +"Chislet_Windmill","2015-07-01",38 +"Aerojet_SD-2","2017-07-01",59 +"Age_role_play","2015-09-01",2 +"50687_Paultemple","2018-03-01",8 +"1997-98_Cuban_National_Series","2017-02-01",1 +"Aleksandr_Borisovich_Belyavskiy","2017-10-01",42 +"Carol_MacReady","2017-01-01",111 +"18th_Chess_Olympiad","2015-06-01",134 +"Clara_Schonfeld","2015-07-01",1 +"Apollonius_of_Athens","2017-02-01",35 +"ABC_80","2018-03-01",603 +"Apatelodes_damora","2015-08-01",22 +"Ernest_Walbourn","2016-04-01",30 +"428_BCE","2017-04-01",2 +"72nd_Seaforth_Highlanders","2017-12-01",29 +"Broughton_Hackett","2015-07-01",38 +"A_Fazenda_2","2016-12-01",56 +"ATCvet_code_QJ01MQ","2017-05-01",2 +"Abura,_Iran","2017-03-01",3 +"DeLeon_Independent_School_District","2015-07-01",1 +"Abby_aldrich","2016-09-01",1 +"Cinema_One_Originals","2016-11-01",359 +"2013_European_Short_Course_Swimming_Championships","2017-09-01",124 +"Ars_technica","2015-11-01",442 +"AMS_Production_Company","2016-02-01",1 +"Joao_Soares","2017-01-01",1 +"Cervical_vertebra_6","2017-06-01",45 +"Kevin_Pugh","2017-01-01",2 +"Alpha-1_antitrypsin","2015-11-01",11845 +"Assyrians_in_iran","2017-07-01",53 +"Boophis_ankarafensis","2016-11-01",2 +"A_View_To_a_Kill","2018-01-01",4 +"Charles_Edouard_Brown-Sequard","2015-07-01",7 +"1919_in_Ireland","2017-04-01",239 +"74th_Foot","2015-06-01",3 +"9275_Persson","2016-07-01",22 +"Dalcerides_mesoa","2015-07-01",11 +"A_Summer_Bird-Cage","2016-03-01",248 +"2011_NAB_Cup","2017-10-01",127 +"13th_Parliament_of_Lower_Canada","2015-08-01",41 +"2011_Players_Championship_Finals","2015-07-01",25 +"Flag_of_Tenerife","2017-01-01",128 +"Hypopta_corrientina","2017-01-01",1 +"Jalatarangam","2017-01-01",16 +"Adjoint_endomorphism","2018-01-01",330 +"Anime_conventions","2015-06-01",18 +"2004_Grammy_Award","2015-06-01",13 +"American_war","2015-07-01",80 +"Beynes,_Yvelines","2016-11-01",32 +"Agriculture_Department","2016-06-01",16 +"Andrey_Chisty","2015-10-01",58 +"Ait_Yahia_Moussa","2017-08-01",7 +"Alfred_Blau","2017-03-01",57 +"1869_in_sports","2017-08-01",73 +"Ambolodia_Sud","2016-04-01",6 +"Animal_slaughter","2017-06-01",6423 +"Adamowka_Commune","2018-01-01",2 +"Arsenic_pentachloride","2016-03-01",467 +"220_BCE","2016-01-01",3 +"863d_Engineer_Battalion","2015-11-01",160 +"Amer_Abu-Hudaib","2017-04-01",31 +"Aaina_tv","2017-08-01",3 +"Arnhem,_Netherlands","2015-08-01",67 +"Antoine_de_sartine","2015-08-01",4 +"ATC_code_A16","2016-01-01",155 +"Eastern_Front","2017-01-01",70 +"Ashy-headed_tyrannulet","2016-12-01",44 +"Aoheng_language","2015-08-01",64 +"1996_World_Junior_Canoe_Slalom_Championships","2017-11-01",15 +"Agriophara_nodigera","2017-11-01",12 +"Amsterdam_Island_cattle","2015-12-01",675 +"Aliyah_from_the_Soviet_Union_in_the_1990s","2017-08-01",54 +"Abandoned_and_Little_Known_Airfields","2018-01-01",2 +"Church_numerals","2015-07-01",57 +"Ankeny_Christian_Academy","2015-09-01",74 +"2010_FIFA_World_Cup_qualification_-_AFC_First_Round","2017-06-01",58 +"1ESS_switch","2015-07-01",514 +"Chelys_boulengerii","2016-04-01",1 +"Bivalent_logic","2016-11-01",25 +"Ivan_Skavinsky_Skavar","2017-01-01",1 +"Fergus_Sings_the_Blues","2016-04-01",62 +"2015-16_Libyan_Premier_League","2017-02-01",4 +"Dutch_Chess_Championship","2017-01-01",35 +"Every_Man_in_His_Humor","2016-11-01",1 +"2008_Allstate_BCS_National_Championship_Game","2015-08-01",11 +"Aq_Tappeh,_Hamadan","2015-09-01",25 +"Agrotractor","2016-02-01",1 +"Alexander_of_Pfalz-Zweibrucken","2017-12-01",2 +"2003_Mistral_World_Championships","2016-04-01",6 +"146th_Fighter-Interceptor_Wing","2015-11-01",49 +"Al-Qahir","2016-04-01",328 +"25604_Karlin","2015-05-01",20 +"Allen_taflove","2017-12-01",3 +"Aretha_Thurmond","2017-05-01",109 +"Atlanta_and_lagrange_rail_road","2015-07-01",1 +"ACSI_College_Iloilo","2015-10-01",1 +"Alan_Sacks","2015-07-01",150 +"African_Desert_Warbler","2017-02-01",11 +"A_Man_and_His_Soul","2018-02-01",89 +"ASCII_ART","2015-05-01",9 +"1992-93_VMI_Keydets_basketball_team","2016-10-01",1 +"George_and_the_Dragon","2017-01-01",18 +"2012_NAB_Cup","2016-12-01",99 +"1965_Indy_500","2016-05-01",51 +"Forest_Glen,_Nova_Scotia","2016-04-01",9 +"A_Critical_Dictionary_of_English_Literature","2016-08-01",4 +"Aquion_Energy","2015-08-01",1077 +"Alibeyce,_Emirdag","2017-09-01",1 +"Blauhu00F6hle","2015-07-01",1 +"Ian_Sommerville","2017-01-01",1 +"Air_propulsion","2017-07-01",474 +"2016_12_Hours_of_Sebring","2016-10-01",187 +"Asites","2017-07-01",4 +"Al-Kini","2017-03-01",1 +"Austin_Aztex_2009_season","2016-03-01",10 +"Alto_Vista_Chapel","2015-12-01",833 +"Abecedaria","2017-04-01",22 +"Farm_to_Market_Road_2503","2016-11-01",3 +"Anglican_Bishop_of_The_Leeward_Islands","2015-09-01",2 +"Basketball_at_the_2011_Pan_American_Games","2017-06-01",120 +"Angela_Peel","2016-08-01",7 +"Amber_Frey","2018-02-01",728 +"Afraid_to_Sleep","2017-06-01",51 +"ATC_code_A02BA","2018-02-01",7 +"Apateon_pedestris","2015-11-01",5 +"Alois_Estermann","2015-12-01",1155 +"1752_in_science","2016-01-01",78 +"Baldassin","2017-06-01",3 +"Camilla_Hildegarde_Wedgwood","2017-01-01",1 +"B-A-C-H_motive","2016-10-01",3 +"AI_Velorum_star","2016-09-01",1 +"Ali_Zayn_al-Abidin","2017-04-01",71 +"Ailurarctos_lufengensis","2015-07-01",1 +"Clearview,_Philadelphia","2017-06-01",67 +"Adam_Sender","2016-08-01",759 +"Apriona_paucigranula","2018-02-01",7 +"Dark_at_the_Top_of_the_Stairs","2015-07-01",10 +"Acanthio","2017-12-01",11 +"1980_Labatt_Brier","2018-01-01",111 +"2016-17_New_York_Knicks_season","2017-10-01",21 +"1995_CAF_Cup","2015-10-01",48 +"Boiled_linseed_oil","2016-04-01",79 +"2015_Kumanovo_clashes","2016-07-01",6 +"David_Jamieson","2017-01-01",3 +"1915_Florida_Gators_football_team","2015-08-01",32 +"2010-11_New_Zealand_Football_Championship","2017-03-01",1 +"Ashley_Church","2015-08-01",27 +"Acanthoxylini","2017-06-01",27 +"American_Hindu","2016-10-01",33 +"Amylosporomyces","2015-12-01",20 +"2007_Southeast_Asia_Basketball_Association_Championship","2018-01-01",1 +"Aethelred_I","2017-08-01",1 +"2-methyl-GPP_synthase","2018-02-01",1 +"Dave_Aspin","2016-11-01",6 +"Descent_of_the_Nine","2016-04-01",1 +"2010_Kleen_Energy_Systems_disaster","2017-08-01",3 +"1978_in_Japanese_television","2017-08-01",70 +"Alexandros_Falekas","2018-01-01",1 +"1910_in_Afghanistan","2016-02-01",32 +"Abd-ru-shin","2017-09-01",681 +"610_in_poetry","2017-05-01",3 +"2015_arrests_of_FIFA_officials","2017-12-01",46 +"ATmega328P","2017-09-01",26 +"A_G_Mathews","2017-12-01",3 +"Attack_on_Mers-el-Kebir","2016-12-01",511 +"2016_in_Estonia","2016-05-01",89 +"Adidas-Salomon","2015-09-01",574 +"Education_and_Skills_Act_2008","2016-11-01",141 +"1789_in_the_United_States","2015-07-01",845 +"Apple_Computer_advertising","2015-09-01",7 +"9th_US_Army","2016-12-01",17 +"Ad_Rotas","2016-02-01",16 +"Agios_Ioannis,_Paphos","2018-03-01",97 +"Arabian_toad","2017-12-01",100 +"Anterior_pituitary_acidophil","2016-06-01",47 +"Arguello,_Christine","2017-12-01",3 +"Amilkar_Ariza","2017-03-01",67 +"Charles_Grierson","2016-11-01",14 +"Achi,_Bolivar","2017-11-01",1 +"Exonym_and_endonym","2017-01-01",1712 +"Abdul_Maroof_Gullestani","2017-12-01",20 +"Fairlawne_Handicap_Chase","2016-04-01",11 +"1963_Virginia_Tech_Hokies_football_team","2016-07-01",6 +"AE_Clarke","2017-12-01",3 +"ALFA-PROJ_Model_3563_sport","2017-10-01",2 +"Aleks_Vanderpool-Wallace","2018-02-01",32 +"Antioxident","2017-05-01",16 +"Calliope_Project","2015-07-01",3 +"Anderson_World","2017-10-01",5 +"Amydria_selvae","2017-11-01",6 +"Antoni_Katski","2016-09-01",1 +"Bera_District","2017-06-01",85 +"80_South_Street_New_Design","2016-07-01",86 +"Askizsky","2015-08-01",2 +"Amausi_metro_station","2015-11-01",44 +"9486_Utemorrah","2017-04-01",5 +"Army_CIS","2018-01-01",2 +"1851_Chilean_Revolution","2017-06-01",255 +"Jens_Robert_Dahlqvist","2017-01-01",6 +"1966-67_Tercera_Division","2017-05-01",1 +"Chanel_Iman","2017-06-01",9434 +"Astydamia","2017-06-01",34 +"1944_in_Belgium","2016-09-01",27 +"Acton_Baronets,_of_Aldenham","2017-01-01",1 +"2014_FBS_season","2016-12-01",5 +"2016_Winter_Youth_Olympics","2017-09-01",2090 +"1903_Clemson_Tigers_football_team","2017-06-01",50 +"2014_Taca_da_Liga_Final","2017-04-01",2 +"10th_Alberta_general_election","2016-11-01",4 +"Edertalschule_Frankenberg","2016-04-01",16 +"4th_Punjab_Infantry_Regiment","2017-09-01",136 +"America_Air_Linhas_Aereas","2018-02-01",1 +"Australian_Liberal_Party","2015-06-01",146 +"American_licorice","2017-05-01",15 +"2013_NASCAR_Cup_Series","2015-10-01",49 +"Anja_Lundqvist","2016-03-01",93 +"Amauris_dannfelti","2016-01-01",12 +"Abandoned_shipwrecks_act","2015-06-01",3 +"11086_Nagatayuji","2017-02-01",3 +"Advertising_tissues","2017-06-01",1 +"Anti_corn-law_league","2016-10-01",1 +"Always_Guaranteed","2017-09-01",445 +"Alfredo_Palacio_Moreno","2018-01-01",48 +"Antonio_Puche_Vicente","2015-06-01",1 +"Elazig_Province","2017-01-01",1 +"ATC_code_C02AC01","2017-05-01",1 +"Alexander_Mattock_Thompson","2016-08-01",2 +"Cocos_Islands_Malay","2017-06-01",63 +"Aftonbladet_antisemitism_controversy","2016-10-01",1 +"Azad_Kashmir,_Pakistan","2015-07-01",14 +"1852_English_cricket_season","2016-10-01",24 +"Birmingham_Pride","2015-07-01",129 +"Air-pollution_controls","2015-08-01",4 +"James_Southerton","2017-01-01",20 +"Architecture_of_Chiswick_House","2015-06-01",240 +"Alexander,_Colin","2015-12-01",1 +"Al-Mansooreh","2016-10-01",1 +"Arielle_Gastineau_Ashton","2017-12-01",18 +"Blue_Ben","2017-06-01",240 +"1911_Michigan_State_Normal_Normalites_football_season","2017-11-01",1 +"Arctictis_binturong","2017-04-01",334 +"Fornaldarsaga","2016-04-01",18 +"Bibasis_gomata","2017-06-01",35 +"Anna_Schchian","2017-06-01",19 +"2005_in_Rwanda","2016-08-01",69 +"Archaeology_in_ethiopia","2016-01-01",1 +"23277_Benhughes","2016-12-01",2 +"Bahrain_-_USA_relations","2017-06-01",1 +"Dieter_Korn","2015-07-01",13 +"Antidynamo_theorem","2016-10-01",222 +"An_Jae-Won","2016-12-01",1 +"Bruray","2015-07-01",82 +"Gosport_Council_election,_2004","2017-01-01",2 +"1856_in_South_Africa","2017-03-01",60 +"Dialakoro,_Guinea","2017-01-01",1 +"05-CV-1678","2016-02-01",1 +"Allison,_Henry","2016-12-01",5 +"Animal_house","2016-06-01",1399 +"Alexander_Tabarrok","2017-03-01",5 +"Chung-Ho_Memorial_Hospital","2017-06-01",50 +"2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles","2016-03-01",4 +"1965_Speedway_World_Team_Cup","2017-11-01",13 +"Alexander_Ollongren","2017-11-01",788 +"Amore_traditore,_BWV_203","2016-06-01",83 +"Arthur_William_Rogers","2015-10-01",31 +"Ashoka_pillar","2017-02-01",265 +"1_62_honeycomb","2018-02-01",10 +"1926_Australasian_Championships","2016-05-01",47 +"Export_award","2016-04-01",3 +"5000_Days_Project","2016-07-01",75 +"2012_UCI_Europe_Tour","2017-03-01",65 +"1985_Toronto_Indoor_-_Singles","2015-08-01",4 +"Cedar_Grove,_North_Carolina","2017-06-01",18 +"Battle_of_The_Afsluitdijk","2016-04-01",15 +"Arishtanemi","2017-03-01",7 +"Alfalfa_bill_murray","2016-12-01",7 +"Elisha_Jay_Edwards","2015-07-01",28 +"Arturas_Paulauskas","2016-01-01",10 +"Abdelrahman_Hamad","2015-09-01",2 +"1948_in_Northern_Ireland","2015-07-01",29 +"1988_in_philosophy","2015-05-01",70 +"5-Hydroxytryptaminen","2016-01-01",4 +"2017_FBS_season","2017-10-01",124 +"Areeiro","2016-04-01",2 +"Alemonides","2016-03-01",6 +"Abrochia_caurensis","2016-10-01",1 +"Anafylaxia","2018-01-01",2 +"1938_Grand_National","2018-02-01",80 +"China-Korea_Champions_League","2015-07-01",4 +"Acetyl_bromide","2017-11-01",448 +"24_hours_of_lemans","2015-05-01",37 +"Albright_hereditary_osteodystrophy","2017-02-01",153 +"Ashland_Bus_System","2015-08-01",115 +"1,8-Cineole_2-endo-monooxygenase","2016-10-01",8 +"2005-2006_NHL_Season","2015-11-01",6 +"Cammie_Dunaway","2015-07-01",344 +"D-Fish","2016-11-01",2 +"4_sister_vineyard","2015-09-01",1 +"Alessia_Cara_discography","2017-03-01",100 +"Alexander_Berg","2017-08-01",63 +"4822_Karge","2018-02-01",32 +"Emile_Francis_Trophy","2017-01-01",8 +"Amin_Ghaseminejad","2017-06-01",45 +"Artichia","2017-09-01",19 +"Cividale","2016-11-01",41 +"2007_Orissa_Violence","2016-05-01",1 +"Australian_Saltbush","2016-12-01",5 +"Asian_Food_Channel","2016-09-01",727 +"Camp_iawah","2015-07-01",1 +"ATC_code_J01MA04","2017-11-01",1 +"Arpad_Balazs","2017-10-01",2 +"Angel_of_Music,_or_The_Private_Life_of_Giselle","2018-02-01",56 +"1983_Torneo_di_Viareggio","2016-03-01",22 +"Arellano_University","2017-09-01",1699 +"ATC_code_B03AA","2017-11-01",1 +"FS5000","2016-11-01",1 +"Abd-Allah_ibn_Zubayr","2017-05-01",2 +"1889_SAFA_season","2016-04-01",28 +"Aloha_bowl_broadcasters","2015-05-01",2 +"1994_All_England_Open_Badminton_Championships","2016-07-01",75 +"Are_We_Not_Horses","2015-07-01",79 +"Angiolo_Torchi","2018-02-01",5 +"Chimanimani_National_Park","2017-06-01",37 +"Art_manifesto","2017-09-01",2619 +"Adrian_Apostol","2016-10-01",62 +"Adventure_book","2015-10-01",14 +"Albemarle_Bertie","2016-06-01",20 +"Adam_Deibert","2017-08-01",611 +"Alberta_association_of_architects","2017-10-01",2 +"Alloschmidia","2017-11-01",15 +"Administrative_department_of_security","2016-05-01",1 +"Archdeaconry_of_Dudley","2017-07-01",19 +"Ammayenna_Sthree","2015-12-01",38 +"Aaron_Spelling","2016-05-01",25128 +"Anatolian_hieroglyph","2016-07-01",308 +"Central_University_of_Rajasthan","2016-11-01",323 +"Annamanum_touzalini","2017-08-01",7 +"Acleris_hispidana","2016-11-01",2 +"Frisco_kid","2016-04-01",15 +"Allerheiligenberg_monastery","2017-12-01",2 +"Arctic_comb_jelly","2017-03-01",3 +"279377_Lechmankiewicz","2016-06-01",1 +"AEGON_Pro-Series_Loughborough","2018-02-01",7 +"Firefly_Space_Systems","2017-01-01",235 +"2000-01_Hong_Kong_League_Cup","2017-12-01",6 +"British_supermarkets","2017-01-01",2 +"A_description_of_New_England","2016-10-01",13 +"Artificial_Flavoring","2016-06-01",2 +"Anglican_bishop_of_the_Torres_people","2018-02-01",1 +"Antonio_Diaz_Cardoso","2018-02-01",1 +"Johan_Patriksson","2017-01-01",3 +"Ashutosh_Morya","2017-07-01",1 +"Iron_ore","2017-01-01",3682 +"AT-16_Scallion","2015-08-01",594 +"Data_analyst","2015-07-01",134 +"Cabbageball","2016-04-01",3 +"Acanthonyx_seriopuncta","2017-04-01",2 +"Aegeria_ruficauda","2017-10-01",1 +"Archibald_Douglas,_1st_Earl_of_Ormond","2016-06-01",100 +"2014_European_Championships_in_Athletics","2017-01-01",3 +"1Co-Co1","2017-08-01",77 +"Arthur_Abba_Goldberg","2015-10-01",2 +"Ameri-Cana_Ultralights","2015-05-01",33 +"1979_British_Formula_One_season","2015-12-01",218 +"American_colonial_history","2016-06-01",6 +"Arcadia_Martin_Wesay_Toe","2015-06-01",73 +"Adam_Ornstein","2017-08-01",2 +"Archive_of_Modern_Conflict","2016-12-01",307 +"Ciro_Urriola","2015-07-01",12 +"Acanthosyris","2015-12-01",53 +"Eriopyga_jamaicensis","2015-07-01",1 +"10th_parallel_north","2016-06-01",1412 +"Derek_Almond","2017-01-01",2 +"Jaimanglapur","2017-01-01",4 +"Aphroditeola_olida","2018-02-01",6 +"18th_dynasty_of_egypt","2017-06-01",2 +"Ali_ben_Ahmed","2016-08-01",62 +"Ashkur_Mahalleh","2018-02-01",8 +"Adolf_Mosengel","2017-02-01",54 +"1838_Safed_pogrom","2016-02-01",1 +"1829_in_architecture","2017-05-01",24 +"Arcones,_Segovia","2016-05-01",3 +"Albert_Smith_Medal","2018-02-01",30 +"Arqanqergen_mass_murder","2015-10-01",60 +"Jaan_Usin","2017-01-01",4 +"2009_Bangladesh_Rifles_revolt","2016-03-01",269 +"-coltore","2015-11-01",9 +"Ernest_Makins","2017-01-01",10 +"Amsterdam_Bijlmer_Arena","2016-07-01",87 +"Apostolic_assemblies_of_christ","2018-01-01",1 +"Abirabad,_Razavi_Khorasan","2015-08-01",26 +"2016_All-Ireland_Senior_Football_Championship","2015-10-01",883 +"Asylum_seeking","2016-06-01",36 +"56th_parallel","2015-07-01",12 +"Junior_roller_derby","2017-01-01",19 +"Ana_Goncalves","2016-03-01",2 +"Alekseevskiy_Raion","2017-11-01",1 +"2009_Vietnam_national_football_team_results","2017-07-01",15 +"Chicago,_Burlington_and_Quincy_Railroad_Depot","2017-01-01",2 +"Fox_Valley_Conference","2016-04-01",84 +"Brachioplasty","2017-06-01",304 +"Arnold_Doren","2017-06-01",11 +"All_Ireland_mandolin_Champion","2015-07-01",2 +"Deborah_Rennard","2016-04-01",814 +"Anthony_Macdonnell","2016-02-01",2 +"Azerbaijan_Pakistan_relations","2017-01-01",1 +"A_Girl_Named_Zippy","2018-03-01",346 +"Academic_OneFile","2018-02-01",109 +"East_Point_Academy","2017-01-01",48 +"2011_Italian_Figure_Skating_Championships","2017-03-01",47 +"Chen_Qiao_En","2016-04-01",52 +"Canobie_lake","2016-04-01",1 +"Andrei_Arlashin","2017-11-01",13 +"Again_Into_Eyes","2017-12-01",54 +"Andropogon_curtipendulus","2018-02-01",1 +"Abbath","2016-05-01",927 +"Alien_Opponent","2016-05-01",160 +"Art_of_Love","2016-02-01",3 +"Ariana_Huffington","2017-05-01",84 +"Amy_Poehler","2016-04-01",62732 +"Cherven,_Rousse_Province","2015-07-01",2 +"1_Month_2_Live","2018-03-01",306 +"Country_Day_School_of_the_Sacred_Heart","2017-06-01",132 +"Cooperative_institute_for_arctic_research","2015-07-01",2 +"Depression_symptoms","2017-01-01",7 +"Brent_Skoda","2016-04-01",31 +"American_Christians","2016-12-01",10 +"Counterbleed","2017-01-01",1 +"Abarka","2016-05-01",325 +"Aleksander_Povetkin","2017-02-01",89 +"Austin_TX","2016-03-01",119 +"Aleksandr_Tretyakov","2017-01-01",40 +"Connecticut_congressional_districts","2016-11-01",3 +"Alessio_de_Marchis","2015-10-01",66 +"Capel_Salem,_Pwllheli","2016-04-01",6 +"5-alpha_reductase_deficiency","2016-10-01",30 +"Annabelle_Croft","2016-01-01",32 +"Aeronca_Aircraft_Corporation","2017-05-01",9 +"1597_in_Scotland","2016-07-01",18 +"Alf_Somerfield","2017-11-01",10 +"Agapanthia_villosoviridescens","2018-02-01",53 +"Adam_Goldberg","2015-12-01",42338 +"1961_Paris_massacre","2017-01-01",52 +"2007_in_radio","2017-04-01",131 +"Arthur_French,_5th_Baron_de_Freyne","2015-12-01",44 +"AMD_Socket_G3","2017-04-01",121 +"Albert_geouffre_de_lapradelle","2016-02-01",1 +"Collaborations_between_ex-Beatles","2015-07-01",1279 +"Betty_Ireland","2016-04-01",40 +"Domingo_Tirado_Benedi","2015-07-01",1 +"Bac_Ly","2016-04-01",1 +"All_gas-phase_iodine_laser","2015-07-01",136 +"Andre_Salifou","2017-01-01",1 +"1,3-b-D-glucan","2017-05-01",2 +"Joseph_Johnston_Muir","2017-01-01",3 +"17th_of_Shahrivar_league","2016-05-01",63 +"2001_in_art","2018-03-01",131 +"Abiji_language","2017-10-01",6 +"Ahliah_school","2018-03-01",133 +"1605_in_India","2017-12-01",83 +"Dr_Jeom_Kee_Paik","2015-07-01",1 +"1954_Texas_Longhorns_football_team","2018-01-01",69 +"1985_Little_League_World_Series","2016-07-01",226 +"Eleanor_de_bohun","2015-07-01",1 +"Adrenaline_strength","2016-03-01",8 +"434_BC","2018-02-01",97 +"8x60mm_S","2015-06-01",61 +"2016-17_South_Pacific_cyclone_season","2017-09-01",101 +"Beth_Aala","2017-06-01",15 +"Al_Shaver","2017-07-01",138 +"Adelphoi_Zangaki","2018-01-01",89 +"Cyclopropyl_group","2016-11-01",167 +"216_Sqn","2017-08-01",11 +"20469_Dudleymoore","2017-05-01",5 +"Attila_Hildmann","2017-06-01",103 +"1970_Arkansas_Razorbacks_football_team","2016-11-01",66 +"Anthony_Fairfax","2017-08-01",24 +"Fort_Point,_Boston","2016-04-01",384 +"Epsilon_numbers","2016-04-01",3 +"2013_Recopa_Sudamericana","2016-05-01",202 +"Italo_Disco","2017-01-01",27 +"Andersen_Press","2015-09-01",228 +"Amasa_Walker","2017-09-01",146 +"2010_in_Israeli_film","2015-09-01",234 +"A-25_Shrike","2017-12-01",90 +"2009_Winnipeg_Blue_Bombers_season","2017-06-01",66 +"Ashland_County,_Ohio","2016-10-01",1298 +"Dusky_Turtle_Dove","2017-01-01",3 +"Antonov_148","2017-02-01",129 +"Abdul_Hamid_Lahori","2017-08-01",458 +"Amadeo_of_Spain","2015-11-01",1701 +"2015_Novak_Djokovic_tennis_season","2017-07-01",2484 +"Dhabawallah","2016-04-01",4 +"Afshar_Beylik","2017-06-01",4 +"1998_ATP_Tour_World_Championships_-_Singles","2017-03-01",20 +"Beach_Haven_Terrace,_New_Jersey","2016-11-01",4 +"Aix-la_Chapelle","2018-03-01",66 +"Ackerman,_Val","2017-05-01",2 +"47th_Ohio_Infantry","2016-12-01",59 +"100_People,_100_Songs","2017-11-01",517 +"2007_Masters_of_Formula_3","2016-01-01",63 +"1832_US_presidential_election","2016-05-01",6 +"Aaron_Baker","2016-05-01",113 +"2015-16_FIBA_Europe_Club_Competition","2017-11-01",2 +"Alebra","2018-02-01",27 +"Asilus_crabroniformis","2016-11-01",4 +"Earth_and_Air_and_Rain","2016-11-01",31 +"2014_Stade_Tata_Raphael_disaster","2018-02-01",1 +"Alexander_Izvolski","2017-01-01",7 +"Fabric_17","2017-01-01",13 +"1925_Campeonato_de_Portugal_Final","2018-01-01",37 +"1948_Ashes_series","2017-01-01",121 +"Abraham_ben_david","2016-09-01",4 +"2006_Acropolis_Rally","2017-01-01",12 +"Alottment","2017-03-01",6 +"Angolanness","2015-07-01",11 +"2002_in_NASCAR_Craftsman_Truck_Series","2016-01-01",12 +"Aces_of_ANSI_Art","2015-08-01",77 +"Alan_Tskhovrebov","2015-08-01",13 +"Aegis_Security","2015-10-01",1 +"Alec_the_Great","2015-05-01",69 +"Corel_SnapFire","2016-11-01",9 +"AbdulMagid_Breish","2016-03-01",276 +"A_Night_in_NYC","2015-10-01",232 +"79th_parallel_south","2016-11-01",17 +"Alphonse_Crespo","2016-06-01",50 +"Acacia_petite_feuille","2016-05-01",1 +"Amstrad_464","2017-12-01",18 +"Charles_County,_Maryland","2017-06-01",2079 +"1972_outbreak_of_smallpox_in_Yugoslavia","2018-03-01",375 +"Alungili","2017-09-01",37 +"Brontispalaelaps_froggatti","2016-04-01",1 +"Alison_Lacey","2016-12-01",94 +"Alessandro_Capra","2017-07-01",21 +"2012_UCF_Knights_baseball_team","2016-08-01",46 +"16_Candles_Down_the_Drain","2017-05-01",2 +"Anandra_strandi","2015-08-01",11 +"Brigitte_Rohde","2017-01-01",9 +"Agenda_VR3","2015-09-01",93 +"1641_in_architecture","2015-11-01",32 +"ALF_Tales","2016-04-01",280 +"A_Woman_Scorned","2015-07-01",164 +"Air-free_techniques","2016-04-01",5 +"1973_in_British_television","2016-04-01",96 +"All_Saints_Cemetery","2017-04-01",345 +"1981_in_Swedish_football","2016-06-01",21 +"Apple_Dictionary","2016-10-01",19 +"2015_PBZ_Zagreb_Indoors","2016-08-01",121 +"16th_IIFA_Awards","2017-02-01",1194 +"Duki,_Pakistan","2016-04-01",14 +"Administration_of_Borderchek_points,_Population_and_Immigration","2015-09-01",2 +"Alonia,_Zante","2017-10-01",1 +"African_United_Club","2017-10-01",50 +"Burjanadze-Democrats","2016-04-01",19 +"Application_software_development","2015-06-01",27 +"Almonacid_de_la_Sierra,_Zaragoza","2015-06-01",1 +"Baissour","2016-12-01",100 +"Coti_Sorokin","2016-04-01",46 +"Alberta_and_Great_Waterways_Railway_scandal","2017-05-01",70 +"1942_Alabama_Crimson_Tide_football_team","2015-09-01",144 +"Adam_Art_Gallery","2016-08-01",80 +"Akshinski_Raion","2016-09-01",1 +"Edwin_of_Deira","2015-07-01",34 +"Altaf_Mahmud","2015-10-01",245 +"Astana_cycling_team","2017-12-01",7 +"1982_CART_World_Series_season","2015-12-01",3 +"3_Rotaxane","2017-03-01",1 +"1924_Eastern_Suburbs_season","2015-08-01",32 +"Downtown_Science","2016-11-01",6 +"1993-94_Slovak_Cup","2017-04-01",1 +"Brandon_Wayne_Hedrick","2016-04-01",32 +"2015_Brasil_Open","2016-01-01",403 +"Aung_Pinle_Hsinbyushin","2016-02-01",69 +"An_Numaniyah","2016-06-01",185 +"24th_Arkansas_Infantry_Regiment","2016-03-01",64 +"Adimchinobe_Echemandu","2017-05-01",90 +"August_Belmont,_Jr","2017-06-01",8 +"Empacher","2016-11-01",102 +"Abdulkadir_Sheikh_Dini","2017-01-01",70 +"Alvaro_Quiros","2017-08-01",12 +"Algernon_May","2017-11-01",35 +"Athol_Shmith","2016-02-01",188 +"2004_Indesit_ATP_Milan_Indoor_-_Doubles","2015-09-01",1 +"Alfred_Dennis","2016-11-01",9 +"2nd_Medical_Battalion","2017-05-01",380 +"Atom_clocks","2016-03-01",12 +"368th_Expeditionary_Air_Support_Operations_Group","2015-06-01",48 +"1911_Washington_Senators_season","2017-06-01",46 +"1963_Night_Series_Cup","2015-07-01",26 +"Aromobates_capurinensis","2017-12-01",21 +"2013-14_Super_Lig","2017-05-01",14 +"Al_taglio","2016-09-01",2 +"2015_RBC_Tennis_Championships_of_Dallas","2016-04-01",18 +"2011_Mirabella_Cup","2017-11-01",15 +"1996_NHL_Western_Conference_Final","2015-06-01",1 +"2009_Formula_Nippon_Championship","2016-11-01",44 +"Information_security_awareness","2017-01-01",56 +"A_Noiseless_Patient_Spider","2018-03-01",757 +"Aggregate_field_theory","2017-06-01",3 +"Armenians_in_Central_Asia","2015-10-01",351 +"Acona,_Mississippi","2017-10-01",33 +"Apozomus","2017-12-01",19 +"Antwun_Echols","2016-11-01",87 +"1949_Albanian_Cup","2016-11-01",11 +"Aesychlus","2016-10-01",4 +"1961_Pulitzer_Prize","2015-09-01",879 +"East_Midlands_Conference_Centre","2016-04-01",13 +"Blumen","2016-11-01",11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv new file mode 100644 index 00000000000..407b9ddafba --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv @@ -0,0 +1,1000 @@ +Akiba_Hebrew_Academy 2017-08-01 241 +Aegithina_tiphia 2018-02-01 34 +1971-72_Utah_Stars_season 2016-10-01 1 +2015_UEFA_European_Under-21_Championship_qualification_Group_8 2015-12-01 73 +2016_Greater_Western_Sydney_Giants_season 2017-05-01 86 +AAA_Americas_Trios_Championship 2015-10-01 104 +1420_in_literature 2016-05-01 20 +Adair,_Beegie 2017-08-01 2 +1980_Rugby_League_State_of_Origin_match 2017-07-01 2 +Column_of_Santa_Felicita,_Florence 2017-06-01 14 +2007_Copa_America 2016-07-01 178 +Car_dealerships_in_the_USA 2015-07-01 11 +Dihydromyricetin_reductase 2015-07-01 1 +ATCvet_code_QB05BB01 2017-04-01 1 +City_CarShare 2017-01-01 125 +Heidenrod 2017-01-01 10 +Arthur_Henrique 2016-11-01 12 +Alan_Ebnother 2015-11-01 66 +2013_UConn_football_season 2017-05-01 2 +2008_American_League_Division_Series 2016-12-01 376 +Antilipaemic 2017-09-01 12 +Aberzombie 2016-12-01 28 +2008_Asian_Wrestling_Championships 2016-12-01 76 +Federal_Correctional_Complex,_Pollock 2017-01-01 19 +Central_body 2015-07-01 32 +Binbrook,_Ontario 2015-07-01 446 +Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun 2016-10-01 25 +Ashford_Lake 2017-10-01 80 +1942_Joint_Strike 2015-12-01 3 +AFC_Youth_Championship_2012 2017-10-01 2 +Akhira 2016-07-01 64 +Arroniro_Arlieri 2016-10-01 1 +Alesheim_Burgsalach 2015-05-01 2 +2700_classic 2017-05-01 4 +ARX-8_Laevatein 2015-06-01 14 +1991_Newsweek_Champions_Cup_-_Singles 2017-06-01 3 +Aphelandra_sinclairiana 2017-07-01 69 +Asia_Kong 2015-10-01 2 +2012_Internazionali_Tennis_Val_Gardena_Sudtirol 2016-02-01 1 +24_Carat_Purple 2017-06-01 476 +Acroliths 2017-12-01 9 +Bundesautobahn_3 2016-04-01 264 +ATC_code_S01AX21 2016-09-01 1 +Allington,_Lincolnshire 2015-11-01 188 +Acer_Aspire_One 2017-06-01 5169 +ATC_code_L04AC 2015-06-01 1 +1969_New_Year_Honours 2017-07-01 269 +Antonio_Napolitano 2017-11-01 44 +Amberfish 2017-10-01 11 +1976_Cam_2_Motor_Oil_400 2018-03-01 45 +April_25,_2017 2018-01-01 2 +Akahori_Station 2016-06-01 11 +Abducens_palsy 2016-05-01 28 +Ancona_cathedral 2018-01-01 2 +Ajou_Motor_College 2017-02-01 83 +Brad_Skyes 2016-11-01 1 +Alegro_PCS 2017-07-01 157 +Franz_Dunshirn 2017-01-01 1 +Arthur_Godfrey_Road 2016-11-01 3 +Ab_Golman 2017-05-01 30 +Art_in_early_modern_Scotland 2016-03-01 98 +1968_World_Series 2016-02-01 1960 +1828_in_the_UK 2017-08-01 3 +Explorer-1_Prime_Unit_2 2016-11-01 11 +2014_Desafio_Internacional_das_Estrelas 2017-12-01 31 +Ambulyx_subocellata 2016-08-01 1 +2008_Hamilton_Tiger-Cats_season 2015-11-01 153 +Deuterogamist 2015-07-01 5 +Art_Nouveau_furniture 2017-12-01 839 +Allison,_Colorado 2015-10-01 85 +2014_MLS_Re-Entry_Draft 2017-09-01 36 +Amiot_353 2015-12-01 8 +ACLU_of_Massachusetts 2015-11-01 106 +Altable,_Spain 2016-10-01 1 +Agnidra_scabiosa 2016-12-01 16 +Dictyotremella_novoguineensis 2015-07-01 1 +Compiler_Construction 2015-07-01 42 +Aufheben 2016-11-01 1080 +Avafauna 2017-06-01 17 +Atheist_billboard 2017-01-01 19 +2011_Indonesia_Super_League_All-Star_team 2015-11-01 15 +BrahMos_II 2015-07-01 31 +1707_in_art 2016-04-01 17 +Aeromarine_Model_60 2016-06-01 34 +Ayatollah-al-ozma 2015-06-01 12 +Exanimus 2017-01-01 4 +Anderby 2017-01-01 29 +Ashgabat_indoor_tennis_arena 2017-07-01 27 +1971_Rose_Bowl 2015-12-01 961 +2004_HR56 2016-05-01 5 +1886_in_South_Africa 2016-03-01 70 +Bishop_of_Central_Newfoundland 2016-04-01 1 +Alice_Rivlin 2016-09-01 1137 +Arriba_en_la_Cordillera 2017-06-01 39 +Adam_Lively 2016-06-01 77 +Colasposoma_fairmairei_fairmairei 2017-06-01 5 +Archie_Barton 2017-02-01 49 +Aharon_wasserman 2016-01-01 7 +Alabama_Educational_Television_Commission 2017-05-01 3 +Advanced_Technology_Bomber 2016-02-01 67 +1-krona 2017-01-01 4 +Ahmadabad-e_Kalij-e_Sofla 2017-01-01 3 +Bob_Dolman 2016-11-01 245 +Bellevue,_French_Guiana 2017-01-01 5 +Bison_Nickel 2017-01-01 2 +Arthur_Drabble 2016-12-01 35 +Edgewater_Borough,_New_Jersey 2016-11-01 3 +Alberto_Cambrosio 2017-11-01 31 +Amalia_Celia_Figueredo 2017-07-01 32 +1989_-_1992_Rugby_League_World_Cup 2016-01-01 10 +Admir_Seferagic 2016-06-01 7 +Adriaan_Loosjes 2015-05-01 46 +Alfred_Manuel_Martin 2015-06-01 3 +Academy_of_the_Arabic_Language 2015-08-01 67 +Ankita_Shrivastav 2018-01-01 7430 +Anarchism_in_asia 2017-11-01 1 +Batiquitos_Lagoon_State_Marine_Conservation_Area 2015-07-01 18 +Alstonia_calophylla 2017-12-01 2 +4-Hydroxycyclohexanecarboxylate_dehydrogenase 2016-11-01 4 +832_symmetry 2017-09-01 6 +1931_Fuyun_earthquake 2016-07-01 64 +1998_Masters_of_Formula_3 2016-01-01 60 +2011_LG_Hockey_Games 2016-04-01 7 +Generalized_pustular_psoriasis 2017-01-01 159 +2013_European_Cup_Winter_Throwing 2016-07-01 56 +2008_in_Argentina 2017-06-01 48 +Apostrophized 2017-10-01 5 +Algebraically_compact_module 2017-01-01 5 +Askett 2015-10-01 79 +2009_swine_flu_outbreak_timeline 2015-08-01 65 +72704-01-9 2017-12-01 4 +Alexandre-Charles-Albert-Joseph_Renard 2017-11-01 4 +Acyl-CoA_oxidase 2016-09-01 250 +2011_Budweiser_Shootout 2015-08-01 109 +Augusta_Davies_Webster 2015-07-01 2 +Association_theory 2017-07-01 112 +Abemama_Airfield 2015-05-01 8 +Archaeological_Museum_of_Heraklion 2015-10-01 14 +Authorized_marches_of_the_Canadian_Armed_Forces 2016-11-01 241 +1986_in_Portugal 2017-01-01 7 +Antiziganism_in_Bulgaria 2017-12-01 13 +Adriana_Martin 2015-09-01 21 +2004_Green_Bay_Packers_season 2015-05-01 970 +Agrippa_the_Sceptic 2017-11-01 95 +Admiral_Island 2016-04-01 1 +Auxiliary_sign_language 2015-06-01 31 +2013_Food_City_500 2015-06-01 90 +Andy_Roesch 2015-08-01 15 +Alsoszentivan 2017-05-01 4 +Architecture_of_Belgium 2015-05-01 199 +1_South_African_Infantry 2017-06-01 5 +1930_Auburn_Tigers_football_team 2016-12-01 39 +1860_in_Canada 2017-05-01 269 +Aldeaseca_de_la_Frontera 2018-03-01 21 +Elijah_Fox_Cook 2015-07-01 13 +2010_BCS_Bowl_Games 2016-03-01 1 +2017_NPSL_season 2017-06-01 2806 +Bank_of_New_South_Wales_v_Commonwealth 2016-12-01 173 +American_Enterprise_Association 2016-02-01 4 +26th_Kentucky_Derby 2018-03-01 1 +Chaldean_Diocese_of_Amid 2016-11-01 18 +Ajaran_language 2016-03-01 1 +1992_Texas_Rangers_season 2017-06-01 113 +26_SAS 2017-12-01 3 +2015_Terengganu_FA_season 2016-01-01 537 +Aagard,_Oregon 2017-03-01 3 +Auberry,_CA 2017-05-01 13 +American_Eskimo_spitz 2015-09-01 3 +Antidiabetic 2016-11-01 75 +Asinius 2017-11-01 26 +Andrey_Vasilievich_Abramov 2016-10-01 1 +Alan_Carrington 2018-03-01 91 +Colebrook,_Ontario 2017-06-01 2 +Abbasabad-e_Kheyrabad 2015-08-01 24 +Arandjelovac_Municipality 2016-02-01 1 +Aloysius_Valente 2017-12-01 11 +Almondo_Curry 2016-03-01 86 +4th_century_AD 2017-03-01 13 +Askhat_Dilmukhamedov 2016-02-01 77 +1147_AD 2017-05-01 1 +1953_Torneo_di_Viareggio 2017-03-01 20 +ATP_Schenectady 2015-12-01 30 +Lakarian_City 2017-01-01 3 +Adam_Ferency 2017-12-01 176 +AugustDvorak 2016-07-01 5 +97th_Light_Infantry_Division 2017-07-01 1 +16th_Connecticut_Infantry_Regiment 2016-05-01 146 +2011_Somalian_drought 2017-05-01 2 +Anbargah 2017-12-01 8 +1921_in_Paraguayan_football 2016-03-01 2 +Cosmetic_dermatitis 2017-01-01 5 +Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia 2015-09-01 9 +1300_AM 2016-07-01 106 +A_Promising_Africa 2016-03-01 41 +2015-16_Odense_Bulldogs_season 2016-10-01 1 +Aral_AG 2017-12-01 1446 +Angel_Vivar_Dorado 2015-12-01 6 +1951_Australian_Championships 2018-03-01 32 +DJMax_Portable_Hot_Tunes 2017-01-01 27 +Allinge 2017-03-01 32 +1986_Buick_WCT_Finals 2016-11-01 14 +Arimatsu,_Aichi 2015-06-01 112 +Arthur_Berzinsh 2017-02-01 249 +Apolima_Uta 2017-04-01 23 +Capitol_Hill_Pride_Festival 2015-07-01 19 +Kara-Murza 2017-01-01 5 +Aigleville,_Alabama 2015-11-01 19 +Abdullah_bin_al-Hussein 2017-02-01 1 +2017-18_Inter_Milan_season 2018-03-01 26 +African_Collared_Dove 2016-07-01 10 +Achaea_dmoe 2016-11-01 3 +Aurora,_Utah 2016-06-01 201 +Architecture_in_Portland,_OR 2017-07-01 1 +Charchala 2015-07-01 4 +Around_the_Roses 2015-07-01 3 +1965_in_music 2016-12-01 3394 +Alojzije_Jankovic 2017-04-01 5 +Arisu_Seno 2015-08-01 6 +ALCO_T-6 2017-01-01 77 +1998_Royal_Bank_Cup 2015-12-01 32 +1956_Claxton_Shield 2016-11-01 9 +Anita_Dube 2017-07-01 233 +Anderson_Windows 2015-05-01 13 +Annaquatucket_River 2018-03-01 38 +Black_salve 2017-01-01 1496 +Anna_Pendleton_Schenck 2017-02-01 11 +Asghar_Nadeem_Syed 2017-07-01 146 +Disarming 2016-11-01 5 +Antarctic_ice_cap 2017-08-01 7 +Antonio_Ottone 2017-05-01 11 +Coralie_Larnack 2017-01-01 9 +Budha_Subba_Gold_Cup 2016-11-01 24 +Amphoe_Chaiya 2017-03-01 9 +Anarcho-capitalism_in_Somalia 2016-10-01 7 +Felix_Loch 2017-01-01 131 +26508_Jimmylin 2017-12-01 3 +Andrew_McMillen 2015-11-01 134 +Dundee_Canal_Industrial_Historic_District 2017-01-01 2 +Aula_Baratto 2015-12-01 140 +Church_of_St_Mary,_Knowsley 2015-07-01 1 +Aggelakis 2017-10-01 1 +Al_Badiyah 2017-11-01 157 +Assault_Gunboat 2016-03-01 21 +Lachau 2017-01-01 4 +2008_Pittsburgh_Steelers_season 2016-12-01 10018 +Apolychrosis_candidus 2018-01-01 24 +Andrei_Krylov 2017-02-01 192 +Aldesh_Vadher 2018-02-01 7 +Alwand 2017-02-01 7 +Edward_Baker_Lincoln 2015-07-01 4347 +Aermotor_Corporation 2017-11-01 4 +Aischylos 2017-01-01 7 +6th_Assault_Aviation_Corps 2017-07-01 100 +Azygos_lobe 2016-10-01 1598 +Demirciler,_Nazilli 2015-07-01 4 +Akhlaq-e-Hindi 2016-11-01 13 +Dragon_Crusaders 2016-04-01 122 +25V_USB 2016-01-01 1 +Calliophis_melanurus 2017-01-01 31 +Antonionian 2016-10-01 15 +Ashley_Richardson 2017-09-01 1216 +1st_Observation_Group 2018-01-01 6 +Andrzej_Bargiel 2015-05-01 97 +2008_AFL_National_Under_16_Championships 2018-03-01 20 +Ammon_Bundy 2016-09-01 11890 +Benno_Wandolleck 2016-11-01 5 +Aero-Kros_MP-02_Czajka 2016-03-01 136 +A6005_road 2015-10-01 14 +Eagle_Eye_Networks 2015-07-01 101 +Aarberg 2017-12-01 277 +Encyclopedia_of_anthropology 2015-07-01 1 +Duncormick_railway_station 2016-11-01 7 +Aiqing_huajiao_zhuanyi 2017-03-01 1 +Crude_oil_washing 2016-04-01 466 +2010_Indiana_Hoosiers_football_team 2017-06-01 90 +Book_of_Bodley_Head_Verse 2015-07-01 18 +Absence_seizure 2016-05-01 18152 +Cayucupil 2016-04-01 3 +Akanabee 2017-03-01 1 +Grooved_consonant 2017-01-01 5 +Dellamora_philippinensis 2015-07-01 7 +Dejan_Blazevski 2017-01-01 1 +Arabis_armena 2016-08-01 25 +1988_Summer_Paralympics_medal_table 2016-12-01 90 +2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina 2017-04-01 2 +1966_in_music 2017-10-01 3510 +Antti_Tyrvainen 2015-12-01 2 +African_desert 2016-06-01 262 +Bruneau_mariposa_lily 2016-04-01 1 +Bernie_Parmalee 2017-06-01 221 +2015_South_American_Youth_Football_Championship_squads 2015-09-01 594 +1985_IIHF_World_U20_Championship 2015-08-01 7 +18th_British_Academy_Film_Awards 2018-02-01 270 +523_Ada 2016-04-01 35 +Active_Pharmaceutical_Ingredients 2016-02-01 5 +Burley,_ID_mSA 2015-07-01 2 +CFRN-TV-10 2017-06-01 2 +1982_Super_Bowl_of_Poker 2017-08-01 38 +Australian_Journal_of_Educational_Technology 2017-01-01 1 +2013_Super_League_Grand_Final 2016-06-01 212 +2006_BCR_Open_Romania 2015-06-01 25 +Charlestown_Townies 2016-04-01 319 +1943_Polish_underground_raid_on_East_Prussia 2017-08-01 8 +Anthony_Celestino 2018-02-01 182 +Andrew_Beerwinkel 2018-02-01 73 +Greigia_atrobrunnea 2017-01-01 1 +Adrian_Beecham 2017-11-01 1 +Implementation_of_mathematics_in_set_theory 2017-01-01 12 +Annastacia_Palaszczuk 2015-05-01 6247 +Egon_Zimmermann_II 2016-11-01 3 +Air_aide-de-camp 2018-03-01 137 +Albert_Murphy 2016-09-01 1 +1924_Arkansas_Razorbacks_football_team 2016-02-01 28 +Avondale_Mill 2016-10-01 68 +Alexander_Volzhin 2015-12-01 25 +Arek_Monthly 2017-08-01 31 +Dinka_Blanche 2015-07-01 1 +1921_Mercer_Baptists_football_team 2016-11-01 10 +Afro-Antiguan_and_Barbudan 2016-06-01 252 +American_southern_literature 2016-10-01 3 +1947_Swiss_Grand_Prix 2016-11-01 32 +99p_Stores 2017-12-01 3028 +Artem_Radkov 2018-03-01 21 +Arctic_brome 2016-12-01 19 +Battle_Of_Moskova 2015-06-01 6 +Airdrieonians 2016-06-01 32 +Advanced_transportation_controller 2018-03-01 79 +BC_government 2016-12-01 18 +Antonio_Maura 2017-03-01 457 +Anjuman,_Afghanistan 2017-09-01 62 +Deodato_Guinaccia 2015-07-01 13 +Blowjob_Betty 2016-11-01 28 +453d_Flying_Training_Squadron 2017-08-01 3 +1990_Africa_Cup_of_Nations 2016-04-01 22 +Agenville 2016-08-01 100 +1202_in_Scotland 2018-01-01 82 +Calytrix_desolata 2017-06-01 10 +1957_in_Chile 2016-04-01 13 +Anglican_Bishop_of_Torres_Strait_people 2017-08-01 1 +2015_Mexican_Grand_Prix 2015-06-01 528 +Catalan_parliament 2017-01-01 14 +Cult_Shaker 2017-01-01 32 +Ander_Gayoso 2016-11-01 34 +Ageneiosus_ucayalensis 2017-12-01 20 +Club_de_Berne 2015-07-01 194 +Adecco 2016-03-01 9863 +Anti-unionism 2018-01-01 11 +Auchindoun_Castle 2017-01-01 102 +557_in_poetry 2016-07-01 1 +Abu_ol_Verdi_Rural_District 2017-01-01 1 +Centro_73 2016-04-01 23 +Dagger_compact_category 2016-04-01 97 +Alan_Nunn_May 2017-11-01 770 +Basal_clade 2015-07-01 44 +Aizu_Line 2015-08-01 26 +Edward_Kernan_Campbell 2016-04-01 5 +865_area_code 2016-12-01 9 +Bahamas_at_the_1984_Summer_Olympics 2017-06-01 35 +Gardan_Kalat 2017-01-01 1 +American_Samoa_national_under-19_football_team 2017-12-01 4 +Kayah_National_United_League 2017-01-01 14 +2007_Nordea_Nordic_Light_Open_-_Singles 2016-10-01 2 +Avondale_Estate 2016-11-01 2 +Acalolepta_variolaris 2017-02-01 3 +Anantapur,_Andhra_Pradesh 2017-05-01 1032 +Amenable_Banach_algebra 2015-08-01 59 +300_metres 2017-01-01 61 +Black_Bottom,_Kentucky 2016-04-01 8 +100_Players_Who_Shook_The_Kop 2018-01-01 1133 +Adventure_story 2015-07-01 29 +Anacampsis_lignaria 2017-05-01 5 +2007_American_Indoor_Football_Association_season 2015-09-01 89 +Dmitry_Kardovsky 2016-04-01 33 +A10_autoroute 2015-11-01 27 +1995_Sydney_Bulldogs_season 2017-04-01 40 +Ilex_jelskii 2017-01-01 2 +Adrian_Jose_Hernandez 2016-10-01 2 +CallAir_A-5 2016-11-01 4 +22nd_meridian_west 2015-07-01 45 +Anglican_Diocese_of_Antananarivo 2015-08-01 2 +Andrew_Kelsey 2016-11-01 14 +Brownhill_Creek 2017-06-01 4 +Abunai_Deka 2015-06-01 269 +Aisha_Jefferson 2017-04-01 115 +Alonso_Lopez 2017-03-01 7 +Aeroparque_Ciudad_de_Mendoza 2016-01-01 1 +Arthur_Ashley_Sykes 2017-12-01 45 +Holy_Face_Medal 2017-01-01 20 +1Chronicles 2018-02-01 1 +2014_CFU_Club_Championship 2017-12-01 108 +Aetna_class_ironclad_floating_battery 2015-06-01 37 +Antoine_Delrio 2015-07-01 2 +Chislet_Windmill 2015-07-01 38 +Aerojet_SD-2 2017-07-01 59 +Age_role_play 2015-09-01 2 +50687_Paultemple 2018-03-01 8 +1997-98_Cuban_National_Series 2017-02-01 1 +Aleksandr_Borisovich_Belyavskiy 2017-10-01 42 +Carol_MacReady 2017-01-01 111 +18th_Chess_Olympiad 2015-06-01 134 +Clara_Schonfeld 2015-07-01 1 +Apollonius_of_Athens 2017-02-01 35 +ABC_80 2018-03-01 603 +Apatelodes_damora 2015-08-01 22 +Ernest_Walbourn 2016-04-01 30 +428_BCE 2017-04-01 2 +72nd_Seaforth_Highlanders 2017-12-01 29 +Broughton_Hackett 2015-07-01 38 +A_Fazenda_2 2016-12-01 56 +ATCvet_code_QJ01MQ 2017-05-01 2 +Abura,_Iran 2017-03-01 3 +DeLeon_Independent_School_District 2015-07-01 1 +Abby_aldrich 2016-09-01 1 +Cinema_One_Originals 2016-11-01 359 +2013_European_Short_Course_Swimming_Championships 2017-09-01 124 +Ars_technica 2015-11-01 442 +AMS_Production_Company 2016-02-01 1 +Joao_Soares 2017-01-01 1 +Cervical_vertebra_6 2017-06-01 45 +Kevin_Pugh 2017-01-01 2 +Alpha-1_antitrypsin 2015-11-01 11845 +Assyrians_in_iran 2017-07-01 53 +Boophis_ankarafensis 2016-11-01 2 +A_View_To_a_Kill 2018-01-01 4 +Charles_Edouard_Brown-Sequard 2015-07-01 7 +1919_in_Ireland 2017-04-01 239 +74th_Foot 2015-06-01 3 +9275_Persson 2016-07-01 22 +Dalcerides_mesoa 2015-07-01 11 +A_Summer_Bird-Cage 2016-03-01 248 +2011_NAB_Cup 2017-10-01 127 +13th_Parliament_of_Lower_Canada 2015-08-01 41 +2011_Players_Championship_Finals 2015-07-01 25 +Flag_of_Tenerife 2017-01-01 128 +Hypopta_corrientina 2017-01-01 1 +Jalatarangam 2017-01-01 16 +Adjoint_endomorphism 2018-01-01 330 +Anime_conventions 2015-06-01 18 +2004_Grammy_Award 2015-06-01 13 +American_war 2015-07-01 80 +Beynes,_Yvelines 2016-11-01 32 +Agriculture_Department 2016-06-01 16 +Andrey_Chisty 2015-10-01 58 +Ait_Yahia_Moussa 2017-08-01 7 +Alfred_Blau 2017-03-01 57 +1869_in_sports 2017-08-01 73 +Ambolodia_Sud 2016-04-01 6 +Animal_slaughter 2017-06-01 6423 +Adamowka_Commune 2018-01-01 2 +Arsenic_pentachloride 2016-03-01 467 +220_BCE 2016-01-01 3 +863d_Engineer_Battalion 2015-11-01 160 +Amer_Abu-Hudaib 2017-04-01 31 +Aaina_tv 2017-08-01 3 +Arnhem,_Netherlands 2015-08-01 67 +Antoine_de_sartine 2015-08-01 4 +ATC_code_A16 2016-01-01 155 +Eastern_Front 2017-01-01 70 +Ashy-headed_tyrannulet 2016-12-01 44 +Aoheng_language 2015-08-01 64 +1996_World_Junior_Canoe_Slalom_Championships 2017-11-01 15 +Agriophara_nodigera 2017-11-01 12 +Amsterdam_Island_cattle 2015-12-01 675 +Aliyah_from_the_Soviet_Union_in_the_1990s 2017-08-01 54 +Abandoned_and_Little_Known_Airfields 2018-01-01 2 +Church_numerals 2015-07-01 57 +Ankeny_Christian_Academy 2015-09-01 74 +2010_FIFA_World_Cup_qualification_-_AFC_First_Round 2017-06-01 58 +1ESS_switch 2015-07-01 514 +Chelys_boulengerii 2016-04-01 1 +Bivalent_logic 2016-11-01 25 +Ivan_Skavinsky_Skavar 2017-01-01 1 +Fergus_Sings_the_Blues 2016-04-01 62 +2015-16_Libyan_Premier_League 2017-02-01 4 +Dutch_Chess_Championship 2017-01-01 35 +Every_Man_in_His_Humor 2016-11-01 1 +2008_Allstate_BCS_National_Championship_Game 2015-08-01 11 +Aq_Tappeh,_Hamadan 2015-09-01 25 +Agrotractor 2016-02-01 1 +Alexander_of_Pfalz-Zweibrucken 2017-12-01 2 +2003_Mistral_World_Championships 2016-04-01 6 +146th_Fighter-Interceptor_Wing 2015-11-01 49 +Al-Qahir 2016-04-01 328 +25604_Karlin 2015-05-01 20 +Allen_taflove 2017-12-01 3 +Aretha_Thurmond 2017-05-01 109 +Atlanta_and_lagrange_rail_road 2015-07-01 1 +ACSI_College_Iloilo 2015-10-01 1 +Alan_Sacks 2015-07-01 150 +African_Desert_Warbler 2017-02-01 11 +A_Man_and_His_Soul 2018-02-01 89 +ASCII_ART 2015-05-01 9 +1992-93_VMI_Keydets_basketball_team 2016-10-01 1 +George_and_the_Dragon 2017-01-01 18 +2012_NAB_Cup 2016-12-01 99 +1965_Indy_500 2016-05-01 51 +Forest_Glen,_Nova_Scotia 2016-04-01 9 +A_Critical_Dictionary_of_English_Literature 2016-08-01 4 +Aquion_Energy 2015-08-01 1077 +Alibeyce,_Emirdag 2017-09-01 1 +Blauhu00F6hle 2015-07-01 1 +Ian_Sommerville 2017-01-01 1 +Air_propulsion 2017-07-01 474 +2016_12_Hours_of_Sebring 2016-10-01 187 +Asites 2017-07-01 4 +Al-Kini 2017-03-01 1 +Austin_Aztex_2009_season 2016-03-01 10 +Alto_Vista_Chapel 2015-12-01 833 +Abecedaria 2017-04-01 22 +Farm_to_Market_Road_2503 2016-11-01 3 +Anglican_Bishop_of_The_Leeward_Islands 2015-09-01 2 +Basketball_at_the_2011_Pan_American_Games 2017-06-01 120 +Angela_Peel 2016-08-01 7 +Amber_Frey 2018-02-01 728 +Afraid_to_Sleep 2017-06-01 51 +ATC_code_A02BA 2018-02-01 7 +Apateon_pedestris 2015-11-01 5 +Alois_Estermann 2015-12-01 1155 +1752_in_science 2016-01-01 78 +Baldassin 2017-06-01 3 +Camilla_Hildegarde_Wedgwood 2017-01-01 1 +B-A-C-H_motive 2016-10-01 3 +AI_Velorum_star 2016-09-01 1 +Ali_Zayn_al-Abidin 2017-04-01 71 +Ailurarctos_lufengensis 2015-07-01 1 +Clearview,_Philadelphia 2017-06-01 67 +Adam_Sender 2016-08-01 759 +Apriona_paucigranula 2018-02-01 7 +Dark_at_the_Top_of_the_Stairs 2015-07-01 10 +Acanthio 2017-12-01 11 +1980_Labatt_Brier 2018-01-01 111 +2016-17_New_York_Knicks_season 2017-10-01 21 +1995_CAF_Cup 2015-10-01 48 +Boiled_linseed_oil 2016-04-01 79 +2015_Kumanovo_clashes 2016-07-01 6 +David_Jamieson 2017-01-01 3 +1915_Florida_Gators_football_team 2015-08-01 32 +2010-11_New_Zealand_Football_Championship 2017-03-01 1 +Ashley_Church 2015-08-01 27 +Acanthoxylini 2017-06-01 27 +American_Hindu 2016-10-01 33 +Amylosporomyces 2015-12-01 20 +2007_Southeast_Asia_Basketball_Association_Championship 2018-01-01 1 +Aethelred_I 2017-08-01 1 +2-methyl-GPP_synthase 2018-02-01 1 +Dave_Aspin 2016-11-01 6 +Descent_of_the_Nine 2016-04-01 1 +2010_Kleen_Energy_Systems_disaster 2017-08-01 3 +1978_in_Japanese_television 2017-08-01 70 +Alexandros_Falekas 2018-01-01 1 +1910_in_Afghanistan 2016-02-01 32 +Abd-ru-shin 2017-09-01 681 +610_in_poetry 2017-05-01 3 +2015_arrests_of_FIFA_officials 2017-12-01 46 +ATmega328P 2017-09-01 26 +A_G_Mathews 2017-12-01 3 +Attack_on_Mers-el-Kebir 2016-12-01 511 +2016_in_Estonia 2016-05-01 89 +Adidas-Salomon 2015-09-01 574 +Education_and_Skills_Act_2008 2016-11-01 141 +1789_in_the_United_States 2015-07-01 845 +Apple_Computer_advertising 2015-09-01 7 +9th_US_Army 2016-12-01 17 +Ad_Rotas 2016-02-01 16 +Agios_Ioannis,_Paphos 2018-03-01 97 +Arabian_toad 2017-12-01 100 +Anterior_pituitary_acidophil 2016-06-01 47 +Arguello,_Christine 2017-12-01 3 +Amilkar_Ariza 2017-03-01 67 +Charles_Grierson 2016-11-01 14 +Achi,_Bolivar 2017-11-01 1 +Exonym_and_endonym 2017-01-01 1712 +Abdul_Maroof_Gullestani 2017-12-01 20 +Fairlawne_Handicap_Chase 2016-04-01 11 +1963_Virginia_Tech_Hokies_football_team 2016-07-01 6 +AE_Clarke 2017-12-01 3 +ALFA-PROJ_Model_3563_sport 2017-10-01 2 +Aleks_Vanderpool-Wallace 2018-02-01 32 +Antioxident 2017-05-01 16 +Calliope_Project 2015-07-01 3 +Anderson_World 2017-10-01 5 +Amydria_selvae 2017-11-01 6 +Antoni_Katski 2016-09-01 1 +Bera_District 2017-06-01 85 +80_South_Street_New_Design 2016-07-01 86 +Askizsky 2015-08-01 2 +Amausi_metro_station 2015-11-01 44 +9486_Utemorrah 2017-04-01 5 +Army_CIS 2018-01-01 2 +1851_Chilean_Revolution 2017-06-01 255 +Jens_Robert_Dahlqvist 2017-01-01 6 +1966-67_Tercera_Division 2017-05-01 1 +Chanel_Iman 2017-06-01 9434 +Astydamia 2017-06-01 34 +1944_in_Belgium 2016-09-01 27 +Acton_Baronets,_of_Aldenham 2017-01-01 1 +2014_FBS_season 2016-12-01 5 +2016_Winter_Youth_Olympics 2017-09-01 2090 +1903_Clemson_Tigers_football_team 2017-06-01 50 +2014_Taca_da_Liga_Final 2017-04-01 2 +10th_Alberta_general_election 2016-11-01 4 +Edertalschule_Frankenberg 2016-04-01 16 +4th_Punjab_Infantry_Regiment 2017-09-01 136 +America_Air_Linhas_Aereas 2018-02-01 1 +Australian_Liberal_Party 2015-06-01 146 +American_licorice 2017-05-01 15 +2013_NASCAR_Cup_Series 2015-10-01 49 +Anja_Lundqvist 2016-03-01 93 +Amauris_dannfelti 2016-01-01 12 +Abandoned_shipwrecks_act 2015-06-01 3 +11086_Nagatayuji 2017-02-01 3 +Advertising_tissues 2017-06-01 1 +Anti_corn-law_league 2016-10-01 1 +Always_Guaranteed 2017-09-01 445 +Alfredo_Palacio_Moreno 2018-01-01 48 +Antonio_Puche_Vicente 2015-06-01 1 +Elazig_Province 2017-01-01 1 +ATC_code_C02AC01 2017-05-01 1 +Alexander_Mattock_Thompson 2016-08-01 2 +Cocos_Islands_Malay 2017-06-01 63 +Aftonbladet_antisemitism_controversy 2016-10-01 1 +Azad_Kashmir,_Pakistan 2015-07-01 14 +1852_English_cricket_season 2016-10-01 24 +Birmingham_Pride 2015-07-01 129 +Air-pollution_controls 2015-08-01 4 +James_Southerton 2017-01-01 20 +Architecture_of_Chiswick_House 2015-06-01 240 +Alexander,_Colin 2015-12-01 1 +Al-Mansooreh 2016-10-01 1 +Arielle_Gastineau_Ashton 2017-12-01 18 +Blue_Ben 2017-06-01 240 +1911_Michigan_State_Normal_Normalites_football_season 2017-11-01 1 +Arctictis_binturong 2017-04-01 334 +Fornaldarsaga 2016-04-01 18 +Bibasis_gomata 2017-06-01 35 +Anna_Schchian 2017-06-01 19 +2005_in_Rwanda 2016-08-01 69 +Archaeology_in_ethiopia 2016-01-01 1 +23277_Benhughes 2016-12-01 2 +Bahrain_-_USA_relations 2017-06-01 1 +Dieter_Korn 2015-07-01 13 +Antidynamo_theorem 2016-10-01 222 +An_Jae-Won 2016-12-01 1 +Bruray 2015-07-01 82 +Gosport_Council_election,_2004 2017-01-01 2 +1856_in_South_Africa 2017-03-01 60 +Dialakoro,_Guinea 2017-01-01 1 +05-CV-1678 2016-02-01 1 +Allison,_Henry 2016-12-01 5 +Animal_house 2016-06-01 1399 +Alexander_Tabarrok 2017-03-01 5 +Chung-Ho_Memorial_Hospital 2017-06-01 50 +2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles 2016-03-01 4 +1965_Speedway_World_Team_Cup 2017-11-01 13 +Alexander_Ollongren 2017-11-01 788 +Amore_traditore,_BWV_203 2016-06-01 83 +Arthur_William_Rogers 2015-10-01 31 +Ashoka_pillar 2017-02-01 265 +1_62_honeycomb 2018-02-01 10 +1926_Australasian_Championships 2016-05-01 47 +Export_award 2016-04-01 3 +5000_Days_Project 2016-07-01 75 +2012_UCI_Europe_Tour 2017-03-01 65 +1985_Toronto_Indoor_-_Singles 2015-08-01 4 +Cedar_Grove,_North_Carolina 2017-06-01 18 +Battle_of_The_Afsluitdijk 2016-04-01 15 +Arishtanemi 2017-03-01 7 +Alfalfa_bill_murray 2016-12-01 7 +Elisha_Jay_Edwards 2015-07-01 28 +Arturas_Paulauskas 2016-01-01 10 +Abdelrahman_Hamad 2015-09-01 2 +1948_in_Northern_Ireland 2015-07-01 29 +1988_in_philosophy 2015-05-01 70 +5-Hydroxytryptaminen 2016-01-01 4 +2017_FBS_season 2017-10-01 124 +Areeiro 2016-04-01 2 +Alemonides 2016-03-01 6 +Abrochia_caurensis 2016-10-01 1 +Anafylaxia 2018-01-01 2 +1938_Grand_National 2018-02-01 80 +China-Korea_Champions_League 2015-07-01 4 +Acetyl_bromide 2017-11-01 448 +24_hours_of_lemans 2015-05-01 37 +Albright_hereditary_osteodystrophy 2017-02-01 153 +Ashland_Bus_System 2015-08-01 115 +1,8-Cineole_2-endo-monooxygenase 2016-10-01 8 +2005-2006_NHL_Season 2015-11-01 6 +Cammie_Dunaway 2015-07-01 344 +D-Fish 2016-11-01 2 +4_sister_vineyard 2015-09-01 1 +Alessia_Cara_discography 2017-03-01 100 +Alexander_Berg 2017-08-01 63 +4822_Karge 2018-02-01 32 +Emile_Francis_Trophy 2017-01-01 8 +Amin_Ghaseminejad 2017-06-01 45 +Artichia 2017-09-01 19 +Cividale 2016-11-01 41 +2007_Orissa_Violence 2016-05-01 1 +Australian_Saltbush 2016-12-01 5 +Asian_Food_Channel 2016-09-01 727 +Camp_iawah 2015-07-01 1 +ATC_code_J01MA04 2017-11-01 1 +Arpad_Balazs 2017-10-01 2 +Angel_of_Music,_or_The_Private_Life_of_Giselle 2018-02-01 56 +1983_Torneo_di_Viareggio 2016-03-01 22 +Arellano_University 2017-09-01 1699 +ATC_code_B03AA 2017-11-01 1 +FS5000 2016-11-01 1 +Abd-Allah_ibn_Zubayr 2017-05-01 2 +1889_SAFA_season 2016-04-01 28 +Aloha_bowl_broadcasters 2015-05-01 2 +1994_All_England_Open_Badminton_Championships 2016-07-01 75 +Are_We_Not_Horses 2015-07-01 79 +Angiolo_Torchi 2018-02-01 5 +Chimanimani_National_Park 2017-06-01 37 +Art_manifesto 2017-09-01 2619 +Adrian_Apostol 2016-10-01 62 +Adventure_book 2015-10-01 14 +Albemarle_Bertie 2016-06-01 20 +Adam_Deibert 2017-08-01 611 +Alberta_association_of_architects 2017-10-01 2 +Alloschmidia 2017-11-01 15 +Administrative_department_of_security 2016-05-01 1 +Archdeaconry_of_Dudley 2017-07-01 19 +Ammayenna_Sthree 2015-12-01 38 +Aaron_Spelling 2016-05-01 25128 +Anatolian_hieroglyph 2016-07-01 308 +Central_University_of_Rajasthan 2016-11-01 323 +Annamanum_touzalini 2017-08-01 7 +Acleris_hispidana 2016-11-01 2 +Frisco_kid 2016-04-01 15 +Allerheiligenberg_monastery 2017-12-01 2 +Arctic_comb_jelly 2017-03-01 3 +279377_Lechmankiewicz 2016-06-01 1 +AEGON_Pro-Series_Loughborough 2018-02-01 7 +Firefly_Space_Systems 2017-01-01 235 +2000-01_Hong_Kong_League_Cup 2017-12-01 6 +British_supermarkets 2017-01-01 2 +A_description_of_New_England 2016-10-01 13 +Artificial_Flavoring 2016-06-01 2 +Anglican_bishop_of_the_Torres_people 2018-02-01 1 +Antonio_Diaz_Cardoso 2018-02-01 1 +Johan_Patriksson 2017-01-01 3 +Ashutosh_Morya 2017-07-01 1 +Iron_ore 2017-01-01 3682 +AT-16_Scallion 2015-08-01 594 +Data_analyst 2015-07-01 134 +Cabbageball 2016-04-01 3 +Acanthonyx_seriopuncta 2017-04-01 2 +Aegeria_ruficauda 2017-10-01 1 +Archibald_Douglas,_1st_Earl_of_Ormond 2016-06-01 100 +2014_European_Championships_in_Athletics 2017-01-01 3 +1Co-Co1 2017-08-01 77 +Arthur_Abba_Goldberg 2015-10-01 2 +Ameri-Cana_Ultralights 2015-05-01 33 +1979_British_Formula_One_season 2015-12-01 218 +American_colonial_history 2016-06-01 6 +Arcadia_Martin_Wesay_Toe 2015-06-01 73 +Adam_Ornstein 2017-08-01 2 +Archive_of_Modern_Conflict 2016-12-01 307 +Ciro_Urriola 2015-07-01 12 +Acanthosyris 2015-12-01 53 +Eriopyga_jamaicensis 2015-07-01 1 +10th_parallel_north 2016-06-01 1412 +Derek_Almond 2017-01-01 2 +Jaimanglapur 2017-01-01 4 +Aphroditeola_olida 2018-02-01 6 +18th_dynasty_of_egypt 2017-06-01 2 +Ali_ben_Ahmed 2016-08-01 62 +Ashkur_Mahalleh 2018-02-01 8 +Adolf_Mosengel 2017-02-01 54 +1838_Safed_pogrom 2016-02-01 1 +1829_in_architecture 2017-05-01 24 +Arcones,_Segovia 2016-05-01 3 +Albert_Smith_Medal 2018-02-01 30 +Arqanqergen_mass_murder 2015-10-01 60 +Jaan_Usin 2017-01-01 4 +2009_Bangladesh_Rifles_revolt 2016-03-01 269 +-coltore 2015-11-01 9 +Ernest_Makins 2017-01-01 10 +Amsterdam_Bijlmer_Arena 2016-07-01 87 +Apostolic_assemblies_of_christ 2018-01-01 1 +Abirabad,_Razavi_Khorasan 2015-08-01 26 +2016_All-Ireland_Senior_Football_Championship 2015-10-01 883 +Asylum_seeking 2016-06-01 36 +56th_parallel 2015-07-01 12 +Junior_roller_derby 2017-01-01 19 +Ana_Goncalves 2016-03-01 2 +Alekseevskiy_Raion 2017-11-01 1 +2009_Vietnam_national_football_team_results 2017-07-01 15 +Chicago,_Burlington_and_Quincy_Railroad_Depot 2017-01-01 2 +Fox_Valley_Conference 2016-04-01 84 +Brachioplasty 2017-06-01 304 +Arnold_Doren 2017-06-01 11 +All_Ireland_mandolin_Champion 2015-07-01 2 +Deborah_Rennard 2016-04-01 814 +Anthony_Macdonnell 2016-02-01 2 +Azerbaijan_Pakistan_relations 2017-01-01 1 +A_Girl_Named_Zippy 2018-03-01 346 +Academic_OneFile 2018-02-01 109 +East_Point_Academy 2017-01-01 48 +2011_Italian_Figure_Skating_Championships 2017-03-01 47 +Chen_Qiao_En 2016-04-01 52 +Canobie_lake 2016-04-01 1 +Andrei_Arlashin 2017-11-01 13 +Again_Into_Eyes 2017-12-01 54 +Andropogon_curtipendulus 2018-02-01 1 +Abbath 2016-05-01 927 +Alien_Opponent 2016-05-01 160 +Art_of_Love 2016-02-01 3 +Ariana_Huffington 2017-05-01 84 +Amy_Poehler 2016-04-01 62732 +Cherven,_Rousse_Province 2015-07-01 2 +1_Month_2_Live 2018-03-01 306 +Country_Day_School_of_the_Sacred_Heart 2017-06-01 132 +Cooperative_institute_for_arctic_research 2015-07-01 2 +Depression_symptoms 2017-01-01 7 +Brent_Skoda 2016-04-01 31 +American_Christians 2016-12-01 10 +Counterbleed 2017-01-01 1 +Abarka 2016-05-01 325 +Aleksander_Povetkin 2017-02-01 89 +Austin_TX 2016-03-01 119 +Aleksandr_Tretyakov 2017-01-01 40 +Connecticut_congressional_districts 2016-11-01 3 +Alessio_de_Marchis 2015-10-01 66 +Capel_Salem,_Pwllheli 2016-04-01 6 +5-alpha_reductase_deficiency 2016-10-01 30 +Annabelle_Croft 2016-01-01 32 +Aeronca_Aircraft_Corporation 2017-05-01 9 +1597_in_Scotland 2016-07-01 18 +Alf_Somerfield 2017-11-01 10 +Agapanthia_villosoviridescens 2018-02-01 53 +Adam_Goldberg 2015-12-01 42338 +1961_Paris_massacre 2017-01-01 52 +2007_in_radio 2017-04-01 131 +Arthur_French,_5th_Baron_de_Freyne 2015-12-01 44 +AMD_Socket_G3 2017-04-01 121 +Albert_geouffre_de_lapradelle 2016-02-01 1 +Collaborations_between_ex-Beatles 2015-07-01 1279 +Betty_Ireland 2016-04-01 40 +Domingo_Tirado_Benedi 2015-07-01 1 +Bac_Ly 2016-04-01 1 +All_gas-phase_iodine_laser 2015-07-01 136 +Andre_Salifou 2017-01-01 1 +1,3-b-D-glucan 2017-05-01 2 +Joseph_Johnston_Muir 2017-01-01 3 +17th_of_Shahrivar_league 2016-05-01 63 +2001_in_art 2018-03-01 131 +Abiji_language 2017-10-01 6 +Ahliah_school 2018-03-01 133 +1605_in_India 2017-12-01 83 +Dr_Jeom_Kee_Paik 2015-07-01 1 +1954_Texas_Longhorns_football_team 2018-01-01 69 +1985_Little_League_World_Series 2016-07-01 226 +Eleanor_de_bohun 2015-07-01 1 +Adrenaline_strength 2016-03-01 8 +434_BC 2018-02-01 97 +8x60mm_S 2015-06-01 61 +2016-17_South_Pacific_cyclone_season 2017-09-01 101 +Beth_Aala 2017-06-01 15 +Al_Shaver 2017-07-01 138 +Adelphoi_Zangaki 2018-01-01 89 +Cyclopropyl_group 2016-11-01 167 +216_Sqn 2017-08-01 11 +20469_Dudleymoore 2017-05-01 5 +Attila_Hildmann 2017-06-01 103 +1970_Arkansas_Razorbacks_football_team 2016-11-01 66 +Anthony_Fairfax 2017-08-01 24 +Fort_Point,_Boston 2016-04-01 384 +Epsilon_numbers 2016-04-01 3 +2013_Recopa_Sudamericana 2016-05-01 202 +Italo_Disco 2017-01-01 27 +Andersen_Press 2015-09-01 228 +Amasa_Walker 2017-09-01 146 +2010_in_Israeli_film 2015-09-01 234 +A-25_Shrike 2017-12-01 90 +2009_Winnipeg_Blue_Bombers_season 2017-06-01 66 +Ashland_County,_Ohio 2016-10-01 1298 +Dusky_Turtle_Dove 2017-01-01 3 +Antonov_148 2017-02-01 129 +Abdul_Hamid_Lahori 2017-08-01 458 +Amadeo_of_Spain 2015-11-01 1701 +2015_Novak_Djokovic_tennis_season 2017-07-01 2484 +Dhabawallah 2016-04-01 4 +Afshar_Beylik 2017-06-01 4 +1998_ATP_Tour_World_Championships_-_Singles 2017-03-01 20 +Beach_Haven_Terrace,_New_Jersey 2016-11-01 4 +Aix-la_Chapelle 2018-03-01 66 +Ackerman,_Val 2017-05-01 2 +47th_Ohio_Infantry 2016-12-01 59 +100_People,_100_Songs 2017-11-01 517 +2007_Masters_of_Formula_3 2016-01-01 63 +1832_US_presidential_election 2016-05-01 6 +Aaron_Baker 2016-05-01 113 +2015-16_FIBA_Europe_Club_Competition 2017-11-01 2 +Alebra 2018-02-01 27 +Asilus_crabroniformis 2016-11-01 4 +Earth_and_Air_and_Rain 2016-11-01 31 +2014_Stade_Tata_Raphael_disaster 2018-02-01 1 +Alexander_Izvolski 2017-01-01 7 +Fabric_17 2017-01-01 13 +1925_Campeonato_de_Portugal_Final 2018-01-01 37 +1948_Ashes_series 2017-01-01 121 +Abraham_ben_david 2016-09-01 4 +2006_Acropolis_Rally 2017-01-01 12 +Alottment 2017-03-01 6 +Angolanness 2015-07-01 11 +2002_in_NASCAR_Craftsman_Truck_Series 2016-01-01 12 +Aces_of_ANSI_Art 2015-08-01 77 +Alan_Tskhovrebov 2015-08-01 13 +Aegis_Security 2015-10-01 1 +Alec_the_Great 2015-05-01 69 +Corel_SnapFire 2016-11-01 9 +AbdulMagid_Breish 2016-03-01 276 +A_Night_in_NYC 2015-10-01 232 +79th_parallel_south 2016-11-01 17 +Alphonse_Crespo 2016-06-01 50 +Acacia_petite_feuille 2016-05-01 1 +Amstrad_464 2017-12-01 18 +Charles_County,_Maryland 2017-06-01 2079 +1972_outbreak_of_smallpox_in_Yugoslavia 2018-03-01 375 +Alungili 2017-09-01 37 +Brontispalaelaps_froggatti 2016-04-01 1 +Alison_Lacey 2016-12-01 94 +Alessandro_Capra 2017-07-01 21 +2012_UCF_Knights_baseball_team 2016-08-01 46 +16_Candles_Down_the_Drain 2017-05-01 2 +Anandra_strandi 2015-08-01 11 +Brigitte_Rohde 2017-01-01 9 +Agenda_VR3 2015-09-01 93 +1641_in_architecture 2015-11-01 32 +ALF_Tales 2016-04-01 280 +A_Woman_Scorned 2015-07-01 164 +Air-free_techniques 2016-04-01 5 +1973_in_British_television 2016-04-01 96 +All_Saints_Cemetery 2017-04-01 345 +1981_in_Swedish_football 2016-06-01 21 +Apple_Dictionary 2016-10-01 19 +2015_PBZ_Zagreb_Indoors 2016-08-01 121 +16th_IIFA_Awards 2017-02-01 1194 +Duki,_Pakistan 2016-04-01 14 +Administration_of_Borderchek_points,_Population_and_Immigration 2015-09-01 2 +Alonia,_Zante 2017-10-01 1 +African_United_Club 2017-10-01 50 +Burjanadze-Democrats 2016-04-01 19 +Application_software_development 2015-06-01 27 +Almonacid_de_la_Sierra,_Zaragoza 2015-06-01 1 +Baissour 2016-12-01 100 +Coti_Sorokin 2016-04-01 46 +Alberta_and_Great_Waterways_Railway_scandal 2017-05-01 70 +1942_Alabama_Crimson_Tide_football_team 2015-09-01 144 +Adam_Art_Gallery 2016-08-01 80 +Akshinski_Raion 2016-09-01 1 +Edwin_of_Deira 2015-07-01 34 +Altaf_Mahmud 2015-10-01 245 +Astana_cycling_team 2017-12-01 7 +1982_CART_World_Series_season 2015-12-01 3 +3_Rotaxane 2017-03-01 1 +1924_Eastern_Suburbs_season 2015-08-01 32 +Downtown_Science 2016-11-01 6 +1993-94_Slovak_Cup 2017-04-01 1 +Brandon_Wayne_Hedrick 2016-04-01 32 +2015_Brasil_Open 2016-01-01 403 +Aung_Pinle_Hsinbyushin 2016-02-01 69 +An_Numaniyah 2016-06-01 185 +24th_Arkansas_Infantry_Regiment 2016-03-01 64 +Adimchinobe_Echemandu 2017-05-01 90 +August_Belmont,_Jr 2017-06-01 8 +Empacher 2016-11-01 102 +Abdulkadir_Sheikh_Dini 2017-01-01 70 +Alvaro_Quiros 2017-08-01 12 +Algernon_May 2017-11-01 35 +Athol_Shmith 2016-02-01 188 +2004_Indesit_ATP_Milan_Indoor_-_Doubles 2015-09-01 1 +Alfred_Dennis 2016-11-01 9 +2nd_Medical_Battalion 2017-05-01 380 +Atom_clocks 2016-03-01 12 +368th_Expeditionary_Air_Support_Operations_Group 2015-06-01 48 +1911_Washington_Senators_season 2017-06-01 46 +1963_Night_Series_Cup 2015-07-01 26 +Aromobates_capurinensis 2017-12-01 21 +2013-14_Super_Lig 2017-05-01 14 +Al_taglio 2016-09-01 2 +2015_RBC_Tennis_Championships_of_Dallas 2016-04-01 18 +2011_Mirabella_Cup 2017-11-01 15 +1996_NHL_Western_Conference_Final 2015-06-01 1 +2009_Formula_Nippon_Championship 2016-11-01 44 +Information_security_awareness 2017-01-01 56 +A_Noiseless_Patient_Spider 2018-03-01 757 +Aggregate_field_theory 2017-06-01 3 +Armenians_in_Central_Asia 2015-10-01 351 +Acona,_Mississippi 2017-10-01 33 +Apozomus 2017-12-01 19 +Antwun_Echols 2016-11-01 87 +1949_Albanian_Cup 2016-11-01 11 +Aesychlus 2016-10-01 4 +1961_Pulitzer_Prize 2015-09-01 879 +East_Midlands_Conference_Centre 2016-04-01 13 +Blumen 2016-11-01 11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt new file mode 100644 index 00000000000..2d4626327a6 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt @@ -0,0 +1 @@ +row('Akiba_Hebrew_Academy';'2017-08-01';241),row('Aegithina_tiphia';'2018-02-01';34),row('1971-72_Utah_Stars_season';'2016-10-01';1),row('2015_UEFA_European_Under-21_Championship_qualification_Group_8';'2015-12-01';73),row('2016_Greater_Western_Sydney_Giants_season';'2017-05-01';86),row('AAA_Americas_Trios_Championship';'2015-10-01';104),row('1420_in_literature';'2016-05-01';20),row('Adair,_Beegie';'2017-08-01';2),row('1980_Rugby_League_State_of_Origin_match';'2017-07-01';2),row('Column_of_Santa_Felicita,_Florence';'2017-06-01';14) diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv new file mode 100644 index 00000000000..f01c7b864df --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv @@ -0,0 +1,1001 @@ +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 +"1-krona","2017-01-01",4 +"Ahmadabad-e_Kalij-e_Sofla","2017-01-01",3 +"Bob_Dolman","2016-11-01",245 +"Bellevue,_French_Guiana","2017-01-01",5 +"Bison_Nickel","2017-01-01",2 +"Arthur_Drabble","2016-12-01",35 +"Edgewater_Borough,_New_Jersey","2016-11-01",3 +"Alberto_Cambrosio","2017-11-01",31 +"Amalia_Celia_Figueredo","2017-07-01",32 +"1989_-_1992_Rugby_League_World_Cup","2016-01-01",10 +"Admir_Seferagic","2016-06-01",7 +"Adriaan_Loosjes","2015-05-01",46 +"Alfred_Manuel_Martin","2015-06-01",3 +"Academy_of_the_Arabic_Language","2015-08-01",67 +"Ankita_Shrivastav","2018-01-01",7430 +"Anarchism_in_asia","2017-11-01",1 +"Batiquitos_Lagoon_State_Marine_Conservation_Area","2015-07-01",18 +"Alstonia_calophylla","2017-12-01",2 +"4-Hydroxycyclohexanecarboxylate_dehydrogenase","2016-11-01",4 +"832_symmetry","2017-09-01",6 +"1931_Fuyun_earthquake","2016-07-01",64 +"1998_Masters_of_Formula_3","2016-01-01",60 +"2011_LG_Hockey_Games","2016-04-01",7 +"Generalized_pustular_psoriasis","2017-01-01",159 +"2013_European_Cup_Winter_Throwing","2016-07-01",56 +"2008_in_Argentina","2017-06-01",48 +"Apostrophized","2017-10-01",5 +"Algebraically_compact_module","2017-01-01",5 +"Askett","2015-10-01",79 +"2009_swine_flu_outbreak_timeline","2015-08-01",65 +"72704-01-9","2017-12-01",4 +"Alexandre-Charles-Albert-Joseph_Renard","2017-11-01",4 +"Acyl-CoA_oxidase","2016-09-01",250 +"2011_Budweiser_Shootout","2015-08-01",109 +"Augusta_Davies_Webster","2015-07-01",2 +"Association_theory","2017-07-01",112 +"Abemama_Airfield","2015-05-01",8 +"Archaeological_Museum_of_Heraklion","2015-10-01",14 +"Authorized_marches_of_the_Canadian_Armed_Forces","2016-11-01",241 +"1986_in_Portugal","2017-01-01",7 +"Antiziganism_in_Bulgaria","2017-12-01",13 +"Adriana_Martin","2015-09-01",21 +"2004_Green_Bay_Packers_season","2015-05-01",970 +"Agrippa_the_Sceptic","2017-11-01",95 +"Admiral_Island","2016-04-01",1 +"Auxiliary_sign_language","2015-06-01",31 +"2013_Food_City_500","2015-06-01",90 +"Andy_Roesch","2015-08-01",15 +"Alsoszentivan","2017-05-01",4 +"Architecture_of_Belgium","2015-05-01",199 +"1_South_African_Infantry","2017-06-01",5 +"1930_Auburn_Tigers_football_team","2016-12-01",39 +"1860_in_Canada","2017-05-01",269 +"Aldeaseca_de_la_Frontera","2018-03-01",21 +"Elijah_Fox_Cook","2015-07-01",13 +"2010_BCS_Bowl_Games","2016-03-01",1 +"2017_NPSL_season","2017-06-01",2806 +"Bank_of_New_South_Wales_v_Commonwealth","2016-12-01",173 +"American_Enterprise_Association","2016-02-01",4 +"26th_Kentucky_Derby","2018-03-01",1 +"Chaldean_Diocese_of_Amid","2016-11-01",18 +"Ajaran_language","2016-03-01",1 +"1992_Texas_Rangers_season","2017-06-01",113 +"26_SAS","2017-12-01",3 +"2015_Terengganu_FA_season","2016-01-01",537 +"Aagard,_Oregon","2017-03-01",3 +"Auberry,_CA","2017-05-01",13 +"American_Eskimo_spitz","2015-09-01",3 +"Antidiabetic","2016-11-01",75 +"Asinius","2017-11-01",26 +"Andrey_Vasilievich_Abramov","2016-10-01",1 +"Alan_Carrington","2018-03-01",91 +"Colebrook,_Ontario","2017-06-01",2 +"Abbasabad-e_Kheyrabad","2015-08-01",24 +"Arandjelovac_Municipality","2016-02-01",1 +"Aloysius_Valente","2017-12-01",11 +"Almondo_Curry","2016-03-01",86 +"4th_century_AD","2017-03-01",13 +"Askhat_Dilmukhamedov","2016-02-01",77 +"1147_AD","2017-05-01",1 +"1953_Torneo_di_Viareggio","2017-03-01",20 +"ATP_Schenectady","2015-12-01",30 +"Lakarian_City","2017-01-01",3 +"Adam_Ferency","2017-12-01",176 +"AugustDvorak","2016-07-01",5 +"97th_Light_Infantry_Division","2017-07-01",1 +"16th_Connecticut_Infantry_Regiment","2016-05-01",146 +"2011_Somalian_drought","2017-05-01",2 +"Anbargah","2017-12-01",8 +"1921_in_Paraguayan_football","2016-03-01",2 +"Cosmetic_dermatitis","2017-01-01",5 +"Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia","2015-09-01",9 +"1300_AM","2016-07-01",106 +"A_Promising_Africa","2016-03-01",41 +"2015-16_Odense_Bulldogs_season","2016-10-01",1 +"Aral_AG","2017-12-01",1446 +"Angel_Vivar_Dorado","2015-12-01",6 +"1951_Australian_Championships","2018-03-01",32 +"DJMax_Portable_Hot_Tunes","2017-01-01",27 +"Allinge","2017-03-01",32 +"1986_Buick_WCT_Finals","2016-11-01",14 +"Arimatsu,_Aichi","2015-06-01",112 +"Arthur_Berzinsh","2017-02-01",249 +"Apolima_Uta","2017-04-01",23 +"Capitol_Hill_Pride_Festival","2015-07-01",19 +"Kara-Murza","2017-01-01",5 +"Aigleville,_Alabama","2015-11-01",19 +"Abdullah_bin_al-Hussein","2017-02-01",1 +"2017-18_Inter_Milan_season","2018-03-01",26 +"African_Collared_Dove","2016-07-01",10 +"Achaea_dmoe","2016-11-01",3 +"Aurora,_Utah","2016-06-01",201 +"Architecture_in_Portland,_OR","2017-07-01",1 +"Charchala","2015-07-01",4 +"Around_the_Roses","2015-07-01",3 +"1965_in_music","2016-12-01",3394 +"Alojzije_Jankovic","2017-04-01",5 +"Arisu_Seno","2015-08-01",6 +"ALCO_T-6","2017-01-01",77 +"1998_Royal_Bank_Cup","2015-12-01",32 +"1956_Claxton_Shield","2016-11-01",9 +"Anita_Dube","2017-07-01",233 +"Anderson_Windows","2015-05-01",13 +"Annaquatucket_River","2018-03-01",38 +"Black_salve","2017-01-01",1496 +"Anna_Pendleton_Schenck","2017-02-01",11 +"Asghar_Nadeem_Syed","2017-07-01",146 +"Disarming","2016-11-01",5 +"Antarctic_ice_cap","2017-08-01",7 +"Antonio_Ottone","2017-05-01",11 +"Coralie_Larnack","2017-01-01",9 +"Budha_Subba_Gold_Cup","2016-11-01",24 +"Amphoe_Chaiya","2017-03-01",9 +"Anarcho-capitalism_in_Somalia","2016-10-01",7 +"Felix_Loch","2017-01-01",131 +"26508_Jimmylin","2017-12-01",3 +"Andrew_McMillen","2015-11-01",134 +"Dundee_Canal_Industrial_Historic_District","2017-01-01",2 +"Aula_Baratto","2015-12-01",140 +"Church_of_St_Mary,_Knowsley","2015-07-01",1 +"Aggelakis","2017-10-01",1 +"Al_Badiyah","2017-11-01",157 +"Assault_Gunboat","2016-03-01",21 +"Lachau","2017-01-01",4 +"2008_Pittsburgh_Steelers_season","2016-12-01",10018 +"Apolychrosis_candidus","2018-01-01",24 +"Andrei_Krylov","2017-02-01",192 +"Aldesh_Vadher","2018-02-01",7 +"Alwand","2017-02-01",7 +"Edward_Baker_Lincoln","2015-07-01",4347 +"Aermotor_Corporation","2017-11-01",4 +"Aischylos","2017-01-01",7 +"6th_Assault_Aviation_Corps","2017-07-01",100 +"Azygos_lobe","2016-10-01",1598 +"Demirciler,_Nazilli","2015-07-01",4 +"Akhlaq-e-Hindi","2016-11-01",13 +"Dragon_Crusaders","2016-04-01",122 +"25V_USB","2016-01-01",1 +"Calliophis_melanurus","2017-01-01",31 +"Antonionian","2016-10-01",15 +"Ashley_Richardson","2017-09-01",1216 +"1st_Observation_Group","2018-01-01",6 +"Andrzej_Bargiel","2015-05-01",97 +"2008_AFL_National_Under_16_Championships","2018-03-01",20 +"Ammon_Bundy","2016-09-01",11890 +"Benno_Wandolleck","2016-11-01",5 +"Aero-Kros_MP-02_Czajka","2016-03-01",136 +"A6005_road","2015-10-01",14 +"Eagle_Eye_Networks","2015-07-01",101 +"Aarberg","2017-12-01",277 +"Encyclopedia_of_anthropology","2015-07-01",1 +"Duncormick_railway_station","2016-11-01",7 +"Aiqing_huajiao_zhuanyi","2017-03-01",1 +"Crude_oil_washing","2016-04-01",466 +"2010_Indiana_Hoosiers_football_team","2017-06-01",90 +"Book_of_Bodley_Head_Verse","2015-07-01",18 +"Absence_seizure","2016-05-01",18152 +"Cayucupil","2016-04-01",3 +"Akanabee","2017-03-01",1 +"Grooved_consonant","2017-01-01",5 +"Dellamora_philippinensis","2015-07-01",7 +"Dejan_Blazevski","2017-01-01",1 +"Arabis_armena","2016-08-01",25 +"1988_Summer_Paralympics_medal_table","2016-12-01",90 +"2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina","2017-04-01",2 +"1966_in_music","2017-10-01",3510 +"Antti_Tyrvainen","2015-12-01",2 +"African_desert","2016-06-01",262 +"Bruneau_mariposa_lily","2016-04-01",1 +"Bernie_Parmalee","2017-06-01",221 +"2015_South_American_Youth_Football_Championship_squads","2015-09-01",594 +"1985_IIHF_World_U20_Championship","2015-08-01",7 +"18th_British_Academy_Film_Awards","2018-02-01",270 +"523_Ada","2016-04-01",35 +"Active_Pharmaceutical_Ingredients","2016-02-01",5 +"Burley,_ID_mSA","2015-07-01",2 +"CFRN-TV-10","2017-06-01",2 +"1982_Super_Bowl_of_Poker","2017-08-01",38 +"Australian_Journal_of_Educational_Technology","2017-01-01",1 +"2013_Super_League_Grand_Final","2016-06-01",212 +"2006_BCR_Open_Romania","2015-06-01",25 +"Charlestown_Townies","2016-04-01",319 +"1943_Polish_underground_raid_on_East_Prussia","2017-08-01",8 +"Anthony_Celestino","2018-02-01",182 +"Andrew_Beerwinkel","2018-02-01",73 +"Greigia_atrobrunnea","2017-01-01",1 +"Adrian_Beecham","2017-11-01",1 +"Implementation_of_mathematics_in_set_theory","2017-01-01",12 +"Annastacia_Palaszczuk","2015-05-01",6247 +"Egon_Zimmermann_II","2016-11-01",3 +"Air_aide-de-camp","2018-03-01",137 +"Albert_Murphy","2016-09-01",1 +"1924_Arkansas_Razorbacks_football_team","2016-02-01",28 +"Avondale_Mill","2016-10-01",68 +"Alexander_Volzhin","2015-12-01",25 +"Arek_Monthly","2017-08-01",31 +"Dinka_Blanche","2015-07-01",1 +"1921_Mercer_Baptists_football_team","2016-11-01",10 +"Afro-Antiguan_and_Barbudan","2016-06-01",252 +"American_southern_literature","2016-10-01",3 +"1947_Swiss_Grand_Prix","2016-11-01",32 +"99p_Stores","2017-12-01",3028 +"Artem_Radkov","2018-03-01",21 +"Arctic_brome","2016-12-01",19 +"Battle_Of_Moskova","2015-06-01",6 +"Airdrieonians","2016-06-01",32 +"Advanced_transportation_controller","2018-03-01",79 +"BC_government","2016-12-01",18 +"Antonio_Maura","2017-03-01",457 +"Anjuman,_Afghanistan","2017-09-01",62 +"Deodato_Guinaccia","2015-07-01",13 +"Blowjob_Betty","2016-11-01",28 +"453d_Flying_Training_Squadron","2017-08-01",3 +"1990_Africa_Cup_of_Nations","2016-04-01",22 +"Agenville","2016-08-01",100 +"1202_in_Scotland","2018-01-01",82 +"Calytrix_desolata","2017-06-01",10 +"1957_in_Chile","2016-04-01",13 +"Anglican_Bishop_of_Torres_Strait_people","2017-08-01",1 +"2015_Mexican_Grand_Prix","2015-06-01",528 +"Catalan_parliament","2017-01-01",14 +"Cult_Shaker","2017-01-01",32 +"Ander_Gayoso","2016-11-01",34 +"Ageneiosus_ucayalensis","2017-12-01",20 +"Club_de_Berne","2015-07-01",194 +"Adecco","2016-03-01",9863 +"Anti-unionism","2018-01-01",11 +"Auchindoun_Castle","2017-01-01",102 +"557_in_poetry","2016-07-01",1 +"Abu_ol_Verdi_Rural_District","2017-01-01",1 +"Centro_73","2016-04-01",23 +"Dagger_compact_category","2016-04-01",97 +"Alan_Nunn_May","2017-11-01",770 +"Basal_clade","2015-07-01",44 +"Aizu_Line","2015-08-01",26 +"Edward_Kernan_Campbell","2016-04-01",5 +"865_area_code","2016-12-01",9 +"Bahamas_at_the_1984_Summer_Olympics","2017-06-01",35 +"Gardan_Kalat","2017-01-01",1 +"American_Samoa_national_under-19_football_team","2017-12-01",4 +"Kayah_National_United_League","2017-01-01",14 +"2007_Nordea_Nordic_Light_Open_-_Singles","2016-10-01",2 +"Avondale_Estate","2016-11-01",2 +"Acalolepta_variolaris","2017-02-01",3 +"Anantapur,_Andhra_Pradesh","2017-05-01",1032 +"Amenable_Banach_algebra","2015-08-01",59 +"300_metres","2017-01-01",61 +"Black_Bottom,_Kentucky","2016-04-01",8 +"100_Players_Who_Shook_The_Kop","2018-01-01",1133 +"Adventure_story","2015-07-01",29 +"Anacampsis_lignaria","2017-05-01",5 +"2007_American_Indoor_Football_Association_season","2015-09-01",89 +"Dmitry_Kardovsky","2016-04-01",33 +"A10_autoroute","2015-11-01",27 +"1995_Sydney_Bulldogs_season","2017-04-01",40 +"Ilex_jelskii","2017-01-01",2 +"Adrian_Jose_Hernandez","2016-10-01",2 +"CallAir_A-5","2016-11-01",4 +"22nd_meridian_west","2015-07-01",45 +"Anglican_Diocese_of_Antananarivo","2015-08-01",2 +"Andrew_Kelsey","2016-11-01",14 +"Brownhill_Creek","2017-06-01",4 +"Abunai_Deka","2015-06-01",269 +"Aisha_Jefferson","2017-04-01",115 +"Alonso_Lopez","2017-03-01",7 +"Aeroparque_Ciudad_de_Mendoza","2016-01-01",1 +"Arthur_Ashley_Sykes","2017-12-01",45 +"Holy_Face_Medal","2017-01-01",20 +"1Chronicles","2018-02-01",1 +"2014_CFU_Club_Championship","2017-12-01",108 +"Aetna_class_ironclad_floating_battery","2015-06-01",37 +"Antoine_Delrio","2015-07-01",2 +"Chislet_Windmill","2015-07-01",38 +"Aerojet_SD-2","2017-07-01",59 +"Age_role_play","2015-09-01",2 +"50687_Paultemple","2018-03-01",8 +"1997-98_Cuban_National_Series","2017-02-01",1 +"Aleksandr_Borisovich_Belyavskiy","2017-10-01",42 +"Carol_MacReady","2017-01-01",111 +"18th_Chess_Olympiad","2015-06-01",134 +"Clara_Schonfeld","2015-07-01",1 +"Apollonius_of_Athens","2017-02-01",35 +"ABC_80","2018-03-01",603 +"Apatelodes_damora","2015-08-01",22 +"Ernest_Walbourn","2016-04-01",30 +"428_BCE","2017-04-01",2 +"72nd_Seaforth_Highlanders","2017-12-01",29 +"Broughton_Hackett","2015-07-01",38 +"A_Fazenda_2","2016-12-01",56 +"ATCvet_code_QJ01MQ","2017-05-01",2 +"Abura,_Iran","2017-03-01",3 +"DeLeon_Independent_School_District","2015-07-01",1 +"Abby_aldrich","2016-09-01",1 +"Cinema_One_Originals","2016-11-01",359 +"2013_European_Short_Course_Swimming_Championships","2017-09-01",124 +"Ars_technica","2015-11-01",442 +"AMS_Production_Company","2016-02-01",1 +"Joao_Soares","2017-01-01",1 +"Cervical_vertebra_6","2017-06-01",45 +"Kevin_Pugh","2017-01-01",2 +"Alpha-1_antitrypsin","2015-11-01",11845 +"Assyrians_in_iran","2017-07-01",53 +"Boophis_ankarafensis","2016-11-01",2 +"A_View_To_a_Kill","2018-01-01",4 +"Charles_Edouard_Brown-Sequard","2015-07-01",7 +"1919_in_Ireland","2017-04-01",239 +"74th_Foot","2015-06-01",3 +"9275_Persson","2016-07-01",22 +"Dalcerides_mesoa","2015-07-01",11 +"A_Summer_Bird-Cage","2016-03-01",248 +"2011_NAB_Cup","2017-10-01",127 +"13th_Parliament_of_Lower_Canada","2015-08-01",41 +"2011_Players_Championship_Finals","2015-07-01",25 +"Flag_of_Tenerife","2017-01-01",128 +"Hypopta_corrientina","2017-01-01",1 +"Jalatarangam","2017-01-01",16 +"Adjoint_endomorphism","2018-01-01",330 +"Anime_conventions","2015-06-01",18 +"2004_Grammy_Award","2015-06-01",13 +"American_war","2015-07-01",80 +"Beynes,_Yvelines","2016-11-01",32 +"Agriculture_Department","2016-06-01",16 +"Andrey_Chisty","2015-10-01",58 +"Ait_Yahia_Moussa","2017-08-01",7 +"Alfred_Blau","2017-03-01",57 +"1869_in_sports","2017-08-01",73 +"Ambolodia_Sud","2016-04-01",6 +"Animal_slaughter","2017-06-01",6423 +"Adamowka_Commune","2018-01-01",2 +"Arsenic_pentachloride","2016-03-01",467 +"220_BCE","2016-01-01",3 +"863d_Engineer_Battalion","2015-11-01",160 +"Amer_Abu-Hudaib","2017-04-01",31 +"Aaina_tv","2017-08-01",3 +"Arnhem,_Netherlands","2015-08-01",67 +"Antoine_de_sartine","2015-08-01",4 +"ATC_code_A16","2016-01-01",155 +"Eastern_Front","2017-01-01",70 +"Ashy-headed_tyrannulet","2016-12-01",44 +"Aoheng_language","2015-08-01",64 +"1996_World_Junior_Canoe_Slalom_Championships","2017-11-01",15 +"Agriophara_nodigera","2017-11-01",12 +"Amsterdam_Island_cattle","2015-12-01",675 +"Aliyah_from_the_Soviet_Union_in_the_1990s","2017-08-01",54 +"Abandoned_and_Little_Known_Airfields","2018-01-01",2 +"Church_numerals","2015-07-01",57 +"Ankeny_Christian_Academy","2015-09-01",74 +"2010_FIFA_World_Cup_qualification_-_AFC_First_Round","2017-06-01",58 +"1ESS_switch","2015-07-01",514 +"Chelys_boulengerii","2016-04-01",1 +"Bivalent_logic","2016-11-01",25 +"Ivan_Skavinsky_Skavar","2017-01-01",1 +"Fergus_Sings_the_Blues","2016-04-01",62 +"2015-16_Libyan_Premier_League","2017-02-01",4 +"Dutch_Chess_Championship","2017-01-01",35 +"Every_Man_in_His_Humor","2016-11-01",1 +"2008_Allstate_BCS_National_Championship_Game","2015-08-01",11 +"Aq_Tappeh,_Hamadan","2015-09-01",25 +"Agrotractor","2016-02-01",1 +"Alexander_of_Pfalz-Zweibrucken","2017-12-01",2 +"2003_Mistral_World_Championships","2016-04-01",6 +"146th_Fighter-Interceptor_Wing","2015-11-01",49 +"Al-Qahir","2016-04-01",328 +"25604_Karlin","2015-05-01",20 +"Allen_taflove","2017-12-01",3 +"Aretha_Thurmond","2017-05-01",109 +"Atlanta_and_lagrange_rail_road","2015-07-01",1 +"ACSI_College_Iloilo","2015-10-01",1 +"Alan_Sacks","2015-07-01",150 +"African_Desert_Warbler","2017-02-01",11 +"A_Man_and_His_Soul","2018-02-01",89 +"ASCII_ART","2015-05-01",9 +"1992-93_VMI_Keydets_basketball_team","2016-10-01",1 +"George_and_the_Dragon","2017-01-01",18 +"2012_NAB_Cup","2016-12-01",99 +"1965_Indy_500","2016-05-01",51 +"Forest_Glen,_Nova_Scotia","2016-04-01",9 +"A_Critical_Dictionary_of_English_Literature","2016-08-01",4 +"Aquion_Energy","2015-08-01",1077 +"Alibeyce,_Emirdag","2017-09-01",1 +"Blauhu00F6hle","2015-07-01",1 +"Ian_Sommerville","2017-01-01",1 +"Air_propulsion","2017-07-01",474 +"2016_12_Hours_of_Sebring","2016-10-01",187 +"Asites","2017-07-01",4 +"Al-Kini","2017-03-01",1 +"Austin_Aztex_2009_season","2016-03-01",10 +"Alto_Vista_Chapel","2015-12-01",833 +"Abecedaria","2017-04-01",22 +"Farm_to_Market_Road_2503","2016-11-01",3 +"Anglican_Bishop_of_The_Leeward_Islands","2015-09-01",2 +"Basketball_at_the_2011_Pan_American_Games","2017-06-01",120 +"Angela_Peel","2016-08-01",7 +"Amber_Frey","2018-02-01",728 +"Afraid_to_Sleep","2017-06-01",51 +"ATC_code_A02BA","2018-02-01",7 +"Apateon_pedestris","2015-11-01",5 +"Alois_Estermann","2015-12-01",1155 +"1752_in_science","2016-01-01",78 +"Baldassin","2017-06-01",3 +"Camilla_Hildegarde_Wedgwood","2017-01-01",1 +"B-A-C-H_motive","2016-10-01",3 +"AI_Velorum_star","2016-09-01",1 +"Ali_Zayn_al-Abidin","2017-04-01",71 +"Ailurarctos_lufengensis","2015-07-01",1 +"Clearview,_Philadelphia","2017-06-01",67 +"Adam_Sender","2016-08-01",759 +"Apriona_paucigranula","2018-02-01",7 +"Dark_at_the_Top_of_the_Stairs","2015-07-01",10 +"Acanthio","2017-12-01",11 +"1980_Labatt_Brier","2018-01-01",111 +"2016-17_New_York_Knicks_season","2017-10-01",21 +"1995_CAF_Cup","2015-10-01",48 +"Boiled_linseed_oil","2016-04-01",79 +"2015_Kumanovo_clashes","2016-07-01",6 +"David_Jamieson","2017-01-01",3 +"1915_Florida_Gators_football_team","2015-08-01",32 +"2010-11_New_Zealand_Football_Championship","2017-03-01",1 +"Ashley_Church","2015-08-01",27 +"Acanthoxylini","2017-06-01",27 +"American_Hindu","2016-10-01",33 +"Amylosporomyces","2015-12-01",20 +"2007_Southeast_Asia_Basketball_Association_Championship","2018-01-01",1 +"Aethelred_I","2017-08-01",1 +"2-methyl-GPP_synthase","2018-02-01",1 +"Dave_Aspin","2016-11-01",6 +"Descent_of_the_Nine","2016-04-01",1 +"2010_Kleen_Energy_Systems_disaster","2017-08-01",3 +"1978_in_Japanese_television","2017-08-01",70 +"Alexandros_Falekas","2018-01-01",1 +"1910_in_Afghanistan","2016-02-01",32 +"Abd-ru-shin","2017-09-01",681 +"610_in_poetry","2017-05-01",3 +"2015_arrests_of_FIFA_officials","2017-12-01",46 +"ATmega328P","2017-09-01",26 +"A_G_Mathews","2017-12-01",3 +"Attack_on_Mers-el-Kebir","2016-12-01",511 +"2016_in_Estonia","2016-05-01",89 +"Adidas-Salomon","2015-09-01",574 +"Education_and_Skills_Act_2008","2016-11-01",141 +"1789_in_the_United_States","2015-07-01",845 +"Apple_Computer_advertising","2015-09-01",7 +"9th_US_Army","2016-12-01",17 +"Ad_Rotas","2016-02-01",16 +"Agios_Ioannis,_Paphos","2018-03-01",97 +"Arabian_toad","2017-12-01",100 +"Anterior_pituitary_acidophil","2016-06-01",47 +"Arguello,_Christine","2017-12-01",3 +"Amilkar_Ariza","2017-03-01",67 +"Charles_Grierson","2016-11-01",14 +"Achi,_Bolivar","2017-11-01",1 +"Exonym_and_endonym","2017-01-01",1712 +"Abdul_Maroof_Gullestani","2017-12-01",20 +"Fairlawne_Handicap_Chase","2016-04-01",11 +"1963_Virginia_Tech_Hokies_football_team","2016-07-01",6 +"AE_Clarke","2017-12-01",3 +"ALFA-PROJ_Model_3563_sport","2017-10-01",2 +"Aleks_Vanderpool-Wallace","2018-02-01",32 +"Antioxident","2017-05-01",16 +"Calliope_Project","2015-07-01",3 +"Anderson_World","2017-10-01",5 +"Amydria_selvae","2017-11-01",6 +"Antoni_Katski","2016-09-01",1 +"Bera_District","2017-06-01",85 +"80_South_Street_New_Design","2016-07-01",86 +"Askizsky","2015-08-01",2 +"Amausi_metro_station","2015-11-01",44 +"9486_Utemorrah","2017-04-01",5 +"Army_CIS","2018-01-01",2 +"1851_Chilean_Revolution","2017-06-01",255 +"Jens_Robert_Dahlqvist","2017-01-01",6 +"1966-67_Tercera_Division","2017-05-01",1 +"Chanel_Iman","2017-06-01",9434 +"Astydamia","2017-06-01",34 +"1944_in_Belgium","2016-09-01",27 +"Acton_Baronets,_of_Aldenham","2017-01-01",1 +"2014_FBS_season","2016-12-01",5 +"2016_Winter_Youth_Olympics","2017-09-01",2090 +"1903_Clemson_Tigers_football_team","2017-06-01",50 +"2014_Taca_da_Liga_Final","2017-04-01",2 +"10th_Alberta_general_election","2016-11-01",4 +"Edertalschule_Frankenberg","2016-04-01",16 +"4th_Punjab_Infantry_Regiment","2017-09-01",136 +"America_Air_Linhas_Aereas","2018-02-01",1 +"Australian_Liberal_Party","2015-06-01",146 +"American_licorice","2017-05-01",15 +"2013_NASCAR_Cup_Series","2015-10-01",49 +"Anja_Lundqvist","2016-03-01",93 +"Amauris_dannfelti","2016-01-01",12 +"Abandoned_shipwrecks_act","2015-06-01",3 +"11086_Nagatayuji","2017-02-01",3 +"Advertising_tissues","2017-06-01",1 +"Anti_corn-law_league","2016-10-01",1 +"Always_Guaranteed","2017-09-01",445 +"Alfredo_Palacio_Moreno","2018-01-01",48 +"Antonio_Puche_Vicente","2015-06-01",1 +"Elazig_Province","2017-01-01",1 +"ATC_code_C02AC01","2017-05-01",1 +"Alexander_Mattock_Thompson","2016-08-01",2 +"Cocos_Islands_Malay","2017-06-01",63 +"Aftonbladet_antisemitism_controversy","2016-10-01",1 +"Azad_Kashmir,_Pakistan","2015-07-01",14 +"1852_English_cricket_season","2016-10-01",24 +"Birmingham_Pride","2015-07-01",129 +"Air-pollution_controls","2015-08-01",4 +"James_Southerton","2017-01-01",20 +"Architecture_of_Chiswick_House","2015-06-01",240 +"Alexander,_Colin","2015-12-01",1 +"Al-Mansooreh","2016-10-01",1 +"Arielle_Gastineau_Ashton","2017-12-01",18 +"Blue_Ben","2017-06-01",240 +"1911_Michigan_State_Normal_Normalites_football_season","2017-11-01",1 +"Arctictis_binturong","2017-04-01",334 +"Fornaldarsaga","2016-04-01",18 +"Bibasis_gomata","2017-06-01",35 +"Anna_Schchian","2017-06-01",19 +"2005_in_Rwanda","2016-08-01",69 +"Archaeology_in_ethiopia","2016-01-01",1 +"23277_Benhughes","2016-12-01",2 +"Bahrain_-_USA_relations","2017-06-01",1 +"Dieter_Korn","2015-07-01",13 +"Antidynamo_theorem","2016-10-01",222 +"An_Jae-Won","2016-12-01",1 +"Bruray","2015-07-01",82 +"Gosport_Council_election,_2004","2017-01-01",2 +"1856_in_South_Africa","2017-03-01",60 +"Dialakoro,_Guinea","2017-01-01",1 +"05-CV-1678","2016-02-01",1 +"Allison,_Henry","2016-12-01",5 +"Animal_house","2016-06-01",1399 +"Alexander_Tabarrok","2017-03-01",5 +"Chung-Ho_Memorial_Hospital","2017-06-01",50 +"2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles","2016-03-01",4 +"1965_Speedway_World_Team_Cup","2017-11-01",13 +"Alexander_Ollongren","2017-11-01",788 +"Amore_traditore,_BWV_203","2016-06-01",83 +"Arthur_William_Rogers","2015-10-01",31 +"Ashoka_pillar","2017-02-01",265 +"1_62_honeycomb","2018-02-01",10 +"1926_Australasian_Championships","2016-05-01",47 +"Export_award","2016-04-01",3 +"5000_Days_Project","2016-07-01",75 +"2012_UCI_Europe_Tour","2017-03-01",65 +"1985_Toronto_Indoor_-_Singles","2015-08-01",4 +"Cedar_Grove,_North_Carolina","2017-06-01",18 +"Battle_of_The_Afsluitdijk","2016-04-01",15 +"Arishtanemi","2017-03-01",7 +"Alfalfa_bill_murray","2016-12-01",7 +"Elisha_Jay_Edwards","2015-07-01",28 +"Arturas_Paulauskas","2016-01-01",10 +"Abdelrahman_Hamad","2015-09-01",2 +"1948_in_Northern_Ireland","2015-07-01",29 +"1988_in_philosophy","2015-05-01",70 +"5-Hydroxytryptaminen","2016-01-01",4 +"2017_FBS_season","2017-10-01",124 +"Areeiro","2016-04-01",2 +"Alemonides","2016-03-01",6 +"Abrochia_caurensis","2016-10-01",1 +"Anafylaxia","2018-01-01",2 +"1938_Grand_National","2018-02-01",80 +"China-Korea_Champions_League","2015-07-01",4 +"Acetyl_bromide","2017-11-01",448 +"24_hours_of_lemans","2015-05-01",37 +"Albright_hereditary_osteodystrophy","2017-02-01",153 +"Ashland_Bus_System","2015-08-01",115 +"1,8-Cineole_2-endo-monooxygenase","2016-10-01",8 +"2005-2006_NHL_Season","2015-11-01",6 +"Cammie_Dunaway","2015-07-01",344 +"D-Fish","2016-11-01",2 +"4_sister_vineyard","2015-09-01",1 +"Alessia_Cara_discography","2017-03-01",100 +"Alexander_Berg","2017-08-01",63 +"4822_Karge","2018-02-01",32 +"Emile_Francis_Trophy","2017-01-01",8 +"Amin_Ghaseminejad","2017-06-01",45 +"Artichia","2017-09-01",19 +"Cividale","2016-11-01",41 +"2007_Orissa_Violence","2016-05-01",1 +"Australian_Saltbush","2016-12-01",5 +"Asian_Food_Channel","2016-09-01",727 +"Camp_iawah","2015-07-01",1 +"ATC_code_J01MA04","2017-11-01",1 +"Arpad_Balazs","2017-10-01",2 +"Angel_of_Music,_or_The_Private_Life_of_Giselle","2018-02-01",56 +"1983_Torneo_di_Viareggio","2016-03-01",22 +"Arellano_University","2017-09-01",1699 +"ATC_code_B03AA","2017-11-01",1 +"FS5000","2016-11-01",1 +"Abd-Allah_ibn_Zubayr","2017-05-01",2 +"1889_SAFA_season","2016-04-01",28 +"Aloha_bowl_broadcasters","2015-05-01",2 +"1994_All_England_Open_Badminton_Championships","2016-07-01",75 +"Are_We_Not_Horses","2015-07-01",79 +"Angiolo_Torchi","2018-02-01",5 +"Chimanimani_National_Park","2017-06-01",37 +"Art_manifesto","2017-09-01",2619 +"Adrian_Apostol","2016-10-01",62 +"Adventure_book","2015-10-01",14 +"Albemarle_Bertie","2016-06-01",20 +"Adam_Deibert","2017-08-01",611 +"Alberta_association_of_architects","2017-10-01",2 +"Alloschmidia","2017-11-01",15 +"Administrative_department_of_security","2016-05-01",1 +"Archdeaconry_of_Dudley","2017-07-01",19 +"Ammayenna_Sthree","2015-12-01",38 +"Aaron_Spelling","2016-05-01",25128 +"Anatolian_hieroglyph","2016-07-01",308 +"Central_University_of_Rajasthan","2016-11-01",323 +"Annamanum_touzalini","2017-08-01",7 +"Acleris_hispidana","2016-11-01",2 +"Frisco_kid","2016-04-01",15 +"Allerheiligenberg_monastery","2017-12-01",2 +"Arctic_comb_jelly","2017-03-01",3 +"279377_Lechmankiewicz","2016-06-01",1 +"AEGON_Pro-Series_Loughborough","2018-02-01",7 +"Firefly_Space_Systems","2017-01-01",235 +"2000-01_Hong_Kong_League_Cup","2017-12-01",6 +"British_supermarkets","2017-01-01",2 +"A_description_of_New_England","2016-10-01",13 +"Artificial_Flavoring","2016-06-01",2 +"Anglican_bishop_of_the_Torres_people","2018-02-01",1 +"Antonio_Diaz_Cardoso","2018-02-01",1 +"Johan_Patriksson","2017-01-01",3 +"Ashutosh_Morya","2017-07-01",1 +"Iron_ore","2017-01-01",3682 +"AT-16_Scallion","2015-08-01",594 +"Data_analyst","2015-07-01",134 +"Cabbageball","2016-04-01",3 +"Acanthonyx_seriopuncta","2017-04-01",2 +"Aegeria_ruficauda","2017-10-01",1 +"Archibald_Douglas,_1st_Earl_of_Ormond","2016-06-01",100 +"2014_European_Championships_in_Athletics","2017-01-01",3 +"1Co-Co1","2017-08-01",77 +"Arthur_Abba_Goldberg","2015-10-01",2 +"Ameri-Cana_Ultralights","2015-05-01",33 +"1979_British_Formula_One_season","2015-12-01",218 +"American_colonial_history","2016-06-01",6 +"Arcadia_Martin_Wesay_Toe","2015-06-01",73 +"Adam_Ornstein","2017-08-01",2 +"Archive_of_Modern_Conflict","2016-12-01",307 +"Ciro_Urriola","2015-07-01",12 +"Acanthosyris","2015-12-01",53 +"Eriopyga_jamaicensis","2015-07-01",1 +"10th_parallel_north","2016-06-01",1412 +"Derek_Almond","2017-01-01",2 +"Jaimanglapur","2017-01-01",4 +"Aphroditeola_olida","2018-02-01",6 +"18th_dynasty_of_egypt","2017-06-01",2 +"Ali_ben_Ahmed","2016-08-01",62 +"Ashkur_Mahalleh","2018-02-01",8 +"Adolf_Mosengel","2017-02-01",54 +"1838_Safed_pogrom","2016-02-01",1 +"1829_in_architecture","2017-05-01",24 +"Arcones,_Segovia","2016-05-01",3 +"Albert_Smith_Medal","2018-02-01",30 +"Arqanqergen_mass_murder","2015-10-01",60 +"Jaan_Usin","2017-01-01",4 +"2009_Bangladesh_Rifles_revolt","2016-03-01",269 +"-coltore","2015-11-01",9 +"Ernest_Makins","2017-01-01",10 +"Amsterdam_Bijlmer_Arena","2016-07-01",87 +"Apostolic_assemblies_of_christ","2018-01-01",1 +"Abirabad,_Razavi_Khorasan","2015-08-01",26 +"2016_All-Ireland_Senior_Football_Championship","2015-10-01",883 +"Asylum_seeking","2016-06-01",36 +"56th_parallel","2015-07-01",12 +"Junior_roller_derby","2017-01-01",19 +"Ana_Goncalves","2016-03-01",2 +"Alekseevskiy_Raion","2017-11-01",1 +"2009_Vietnam_national_football_team_results","2017-07-01",15 +"Chicago,_Burlington_and_Quincy_Railroad_Depot","2017-01-01",2 +"Fox_Valley_Conference","2016-04-01",84 +"Brachioplasty","2017-06-01",304 +"Arnold_Doren","2017-06-01",11 +"All_Ireland_mandolin_Champion","2015-07-01",2 +"Deborah_Rennard","2016-04-01",814 +"Anthony_Macdonnell","2016-02-01",2 +"Azerbaijan_Pakistan_relations","2017-01-01",1 +"A_Girl_Named_Zippy","2018-03-01",346 +"Academic_OneFile","2018-02-01",109 +"East_Point_Academy","2017-01-01",48 +"2011_Italian_Figure_Skating_Championships","2017-03-01",47 +"Chen_Qiao_En","2016-04-01",52 +"Canobie_lake","2016-04-01",1 +"Andrei_Arlashin","2017-11-01",13 +"Again_Into_Eyes","2017-12-01",54 +"Andropogon_curtipendulus","2018-02-01",1 +"Abbath","2016-05-01",927 +"Alien_Opponent","2016-05-01",160 +"Art_of_Love","2016-02-01",3 +"Ariana_Huffington","2017-05-01",84 +"Amy_Poehler","2016-04-01",62732 +"Cherven,_Rousse_Province","2015-07-01",2 +"1_Month_2_Live","2018-03-01",306 +"Country_Day_School_of_the_Sacred_Heart","2017-06-01",132 +"Cooperative_institute_for_arctic_research","2015-07-01",2 +"Depression_symptoms","2017-01-01",7 +"Brent_Skoda","2016-04-01",31 +"American_Christians","2016-12-01",10 +"Counterbleed","2017-01-01",1 +"Abarka","2016-05-01",325 +"Aleksander_Povetkin","2017-02-01",89 +"Austin_TX","2016-03-01",119 +"Aleksandr_Tretyakov","2017-01-01",40 +"Connecticut_congressional_districts","2016-11-01",3 +"Alessio_de_Marchis","2015-10-01",66 +"Capel_Salem,_Pwllheli","2016-04-01",6 +"5-alpha_reductase_deficiency","2016-10-01",30 +"Annabelle_Croft","2016-01-01",32 +"Aeronca_Aircraft_Corporation","2017-05-01",9 +"1597_in_Scotland","2016-07-01",18 +"Alf_Somerfield","2017-11-01",10 +"Agapanthia_villosoviridescens","2018-02-01",53 +"Adam_Goldberg","2015-12-01",42338 +"1961_Paris_massacre","2017-01-01",52 +"2007_in_radio","2017-04-01",131 +"Arthur_French,_5th_Baron_de_Freyne","2015-12-01",44 +"AMD_Socket_G3","2017-04-01",121 +"Albert_geouffre_de_lapradelle","2016-02-01",1 +"Collaborations_between_ex-Beatles","2015-07-01",1279 +"Betty_Ireland","2016-04-01",40 +"Domingo_Tirado_Benedi","2015-07-01",1 +"Bac_Ly","2016-04-01",1 +"All_gas-phase_iodine_laser","2015-07-01",136 +"Andre_Salifou","2017-01-01",1 +"1,3-b-D-glucan","2017-05-01",2 +"Joseph_Johnston_Muir","2017-01-01",3 +"17th_of_Shahrivar_league","2016-05-01",63 +"2001_in_art","2018-03-01",131 +"Abiji_language","2017-10-01",6 +"Ahliah_school","2018-03-01",133 +"1605_in_India","2017-12-01",83 +"Dr_Jeom_Kee_Paik","2015-07-01",1 +"1954_Texas_Longhorns_football_team","2018-01-01",69 +"1985_Little_League_World_Series","2016-07-01",226 +"Eleanor_de_bohun","2015-07-01",1 +"Adrenaline_strength","2016-03-01",8 +"434_BC","2018-02-01",97 +"8x60mm_S","2015-06-01",61 +"2016-17_South_Pacific_cyclone_season","2017-09-01",101 +"Beth_Aala","2017-06-01",15 +"Al_Shaver","2017-07-01",138 +"Adelphoi_Zangaki","2018-01-01",89 +"Cyclopropyl_group","2016-11-01",167 +"216_Sqn","2017-08-01",11 +"20469_Dudleymoore","2017-05-01",5 +"Attila_Hildmann","2017-06-01",103 +"1970_Arkansas_Razorbacks_football_team","2016-11-01",66 +"Anthony_Fairfax","2017-08-01",24 +"Fort_Point,_Boston","2016-04-01",384 +"Epsilon_numbers","2016-04-01",3 +"2013_Recopa_Sudamericana","2016-05-01",202 +"Italo_Disco","2017-01-01",27 +"Andersen_Press","2015-09-01",228 +"Amasa_Walker","2017-09-01",146 +"2010_in_Israeli_film","2015-09-01",234 +"A-25_Shrike","2017-12-01",90 +"2009_Winnipeg_Blue_Bombers_season","2017-06-01",66 +"Ashland_County,_Ohio","2016-10-01",1298 +"Dusky_Turtle_Dove","2017-01-01",3 +"Antonov_148","2017-02-01",129 +"Abdul_Hamid_Lahori","2017-08-01",458 +"Amadeo_of_Spain","2015-11-01",1701 +"2015_Novak_Djokovic_tennis_season","2017-07-01",2484 +"Dhabawallah","2016-04-01",4 +"Afshar_Beylik","2017-06-01",4 +"1998_ATP_Tour_World_Championships_-_Singles","2017-03-01",20 +"Beach_Haven_Terrace,_New_Jersey","2016-11-01",4 +"Aix-la_Chapelle","2018-03-01",66 +"Ackerman,_Val","2017-05-01",2 +"47th_Ohio_Infantry","2016-12-01",59 +"100_People,_100_Songs","2017-11-01",517 +"2007_Masters_of_Formula_3","2016-01-01",63 +"1832_US_presidential_election","2016-05-01",6 +"Aaron_Baker","2016-05-01",113 +"2015-16_FIBA_Europe_Club_Competition","2017-11-01",2 +"Alebra","2018-02-01",27 +"Asilus_crabroniformis","2016-11-01",4 +"Earth_and_Air_and_Rain","2016-11-01",31 +"2014_Stade_Tata_Raphael_disaster","2018-02-01",1 +"Alexander_Izvolski","2017-01-01",7 +"Fabric_17","2017-01-01",13 +"1925_Campeonato_de_Portugal_Final","2018-01-01",37 +"1948_Ashes_series","2017-01-01",121 +"Abraham_ben_david","2016-09-01",4 +"2006_Acropolis_Rally","2017-01-01",12 +"Alottment","2017-03-01",6 +"Angolanness","2015-07-01",11 +"2002_in_NASCAR_Craftsman_Truck_Series","2016-01-01",12 +"Aces_of_ANSI_Art","2015-08-01",77 +"Alan_Tskhovrebov","2015-08-01",13 +"Aegis_Security","2015-10-01",1 +"Alec_the_Great","2015-05-01",69 +"Corel_SnapFire","2016-11-01",9 +"AbdulMagid_Breish","2016-03-01",276 +"A_Night_in_NYC","2015-10-01",232 +"79th_parallel_south","2016-11-01",17 +"Alphonse_Crespo","2016-06-01",50 +"Acacia_petite_feuille","2016-05-01",1 +"Amstrad_464","2017-12-01",18 +"Charles_County,_Maryland","2017-06-01",2079 +"1972_outbreak_of_smallpox_in_Yugoslavia","2018-03-01",375 +"Alungili","2017-09-01",37 +"Brontispalaelaps_froggatti","2016-04-01",1 +"Alison_Lacey","2016-12-01",94 +"Alessandro_Capra","2017-07-01",21 +"2012_UCF_Knights_baseball_team","2016-08-01",46 +"16_Candles_Down_the_Drain","2017-05-01",2 +"Anandra_strandi","2015-08-01",11 +"Brigitte_Rohde","2017-01-01",9 +"Agenda_VR3","2015-09-01",93 +"1641_in_architecture","2015-11-01",32 +"ALF_Tales","2016-04-01",280 +"A_Woman_Scorned","2015-07-01",164 +"Air-free_techniques","2016-04-01",5 +"1973_in_British_television","2016-04-01",96 +"All_Saints_Cemetery","2017-04-01",345 +"1981_in_Swedish_football","2016-06-01",21 +"Apple_Dictionary","2016-10-01",19 +"2015_PBZ_Zagreb_Indoors","2016-08-01",121 +"16th_IIFA_Awards","2017-02-01",1194 +"Duki,_Pakistan","2016-04-01",14 +"Administration_of_Borderchek_points,_Population_and_Immigration","2015-09-01",2 +"Alonia,_Zante","2017-10-01",1 +"African_United_Club","2017-10-01",50 +"Burjanadze-Democrats","2016-04-01",19 +"Application_software_development","2015-06-01",27 +"Almonacid_de_la_Sierra,_Zaragoza","2015-06-01",1 +"Baissour","2016-12-01",100 +"Coti_Sorokin","2016-04-01",46 +"Alberta_and_Great_Waterways_Railway_scandal","2017-05-01",70 +"1942_Alabama_Crimson_Tide_football_team","2015-09-01",144 +"Adam_Art_Gallery","2016-08-01",80 +"Akshinski_Raion","2016-09-01",1 +"Edwin_of_Deira","2015-07-01",34 +"Altaf_Mahmud","2015-10-01",245 +"Astana_cycling_team","2017-12-01",7 +"1982_CART_World_Series_season","2015-12-01",3 +"3_Rotaxane","2017-03-01",1 +"1924_Eastern_Suburbs_season","2015-08-01",32 +"Downtown_Science","2016-11-01",6 +"1993-94_Slovak_Cup","2017-04-01",1 +"Brandon_Wayne_Hedrick","2016-04-01",32 +"2015_Brasil_Open","2016-01-01",403 +"Aung_Pinle_Hsinbyushin","2016-02-01",69 +"An_Numaniyah","2016-06-01",185 +"24th_Arkansas_Infantry_Regiment","2016-03-01",64 +"Adimchinobe_Echemandu","2017-05-01",90 +"August_Belmont,_Jr","2017-06-01",8 +"Empacher","2016-11-01",102 +"Abdulkadir_Sheikh_Dini","2017-01-01",70 +"Alvaro_Quiros","2017-08-01",12 +"Algernon_May","2017-11-01",35 +"Athol_Shmith","2016-02-01",188 +"2004_Indesit_ATP_Milan_Indoor_-_Doubles","2015-09-01",1 +"Alfred_Dennis","2016-11-01",9 +"2nd_Medical_Battalion","2017-05-01",380 +"Atom_clocks","2016-03-01",12 +"368th_Expeditionary_Air_Support_Operations_Group","2015-06-01",48 +"1911_Washington_Senators_season","2017-06-01",46 +"1963_Night_Series_Cup","2015-07-01",26 +"Aromobates_capurinensis","2017-12-01",21 +"2013-14_Super_Lig","2017-05-01",14 +"Al_taglio","2016-09-01",2 +"2015_RBC_Tennis_Championships_of_Dallas","2016-04-01",18 +"2011_Mirabella_Cup","2017-11-01",15 +"1996_NHL_Western_Conference_Final","2015-06-01",1 +"2009_Formula_Nippon_Championship","2016-11-01",44 +"Information_security_awareness","2017-01-01",56 +"A_Noiseless_Patient_Spider","2018-03-01",757 +"Aggregate_field_theory","2017-06-01",3 +"Armenians_in_Central_Asia","2015-10-01",351 +"Acona,_Mississippi","2017-10-01",33 +"Apozomus","2017-12-01",19 +"Antwun_Echols","2016-11-01",87 +"1949_Albanian_Cup","2016-11-01",11 +"Aesychlus","2016-10-01",4 +"1961_Pulitzer_Prize","2015-09-01",879 +"East_Midlands_Conference_Centre","2016-04-01",13 +"Blumen","2016-11-01",11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql new file mode 100644 index 00000000000..fcbf558352a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql @@ -0,0 +1 @@ +INSERT INTO some_table (`path`, `month`, `hits`) VALUES ('Bangor_City_Forest', '2015-07-01', 34), ('Alireza_Afzal', '2017-02-01', 24), ('Akhaura-Laksam-Chittagong_Line', '2015-09-01', 30), ('1973_National_500', '2017-10-01', 80), ('Attachment', '2017-09-01', 1356), ('Kellett_Strait', '2017-01-01', 5), ('Ajarani_River', '2018-01-01', 30), ('Akbarabad,_Khomeyn', '2017-03-01', 8), ('Adriaan_Theodoor_Peperzak', '2018-02-01', 88), ('Alucita_dryogramma', '2015-09-01', 1), ('Brit_Med_J', '2015-07-01', 1), ('4th_Metro_Manila_Film_Festival', '2015-09-01', 80), ('Alialujah_Choir', '2018-03-01', 221), ('1953-54_SM-sarja_season', '2016-09-01', 1), ('Air_Force_Song', '2018-02-01', 19), ('4-6_duoprism', '2016-03-01', 30), ('Ashley_Spurlin', '2017-06-01', 94), ('Asfaq_Kayani', '2017-10-01', 1), ('1607_in_architecture', '2016-06-01', 7), ('4-way_speakers', '2015-10-01', 2), ('Blue_Heeler', '2015-07-01', 149), ('5_Euro', '2017-04-01', 16), ('2009_Spa-Francorchamps_GP2_Series_round', '2016-04-01', 12), ('2015_Guru_Granth_Sahib_desecration', '2015-11-01', 6821), ('Agriculture_Marketing_Service', '2016-07-01', 2), ('2006_Football_League_Cup_Final', '2015-11-01', 1711), ('2008_Uber_Cup_group_stage', '2016-02-01', 40), ('1923_PGA_Championship', '2016-08-01', 97), ('Fannie_Bay', '2016-04-01', 6), ('AlchemyAPI', '2016-04-01', 344), ('Cinema_of_Italy', '2017-01-01', 1217), ('Arodes', '2016-11-01', 36), ('Damien_Marley', '2015-07-01', 168), ('Al_Jumayl_Baladiyat', '2015-08-01', 5), ('2015_Alabama_State_Hornets_football_team', '2017-06-01', 32), ('Aglossa_tanya', '2016-03-01', 1), ('73rd_Pennsylvania_Infantry', '2017-01-01', 12), ('2015_European_Junior_and_U23_Canoe_Slalom_Championships', '2018-02-01', 31), ('African_Leopard', '2016-08-01', 64), ('Faverolles,_Orne', '2017-01-01', 5), ('Aaron_Fukuhara', '2015-11-01', 17), ('Annular_ligaments_of_trachea', '2017-01-01', 31), ('2014_US_Open_Series', '2016-11-01', 35), ('A_Better_Mousetrap', '2018-02-01', 4), ('Dibaklu', '2016-11-01', 1), ('At_Samat_District', '2015-06-01', 35), ('Aaron_Peasley', '2017-05-01', 32), ('Apistomology', '2015-12-01', 2), ('Buyat_Bay', '2015-07-01', 54), ('1942_Estonian_Football_Championship', '2017-05-01', 22), ('Action_for_Autism', '2016-06-01', 346), ('100_Hz', '2015-06-01', 72), ('2003_Arizona_State_Sun_Devils_football_team', '2017-05-01', 82), ('Antona_obscura', '2016-09-01', 1), ('Akiko_Sugiyama', '2015-12-01', 32), ('Elysburg', '2016-11-01', 8), ('2017_New_South_Wales_Cup', '2017-09-01', 38), ('2011-12_Gold_Coast_United_FC_season', '2017-06-01', 1), ('Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean', '2016-04-01', 15), ('Albert_Dunn', '2017-08-01', 87), ('Hahamakin_ang_Lahat', '2017-01-01', 984), ('2013_Spuyten_Duyvil_derailment', '2017-11-01', 5), ('Ayling', '2017-01-01', 5), ('Anti-Establishment', '2016-10-01', 1), ('1951_Spanish_motorcycle_Grand_Prix', '2018-01-01', 48), ('2009-10_Brunei_Premier_League', '2017-08-01', 4), ('23_Ursae_Majoris', '2016-08-01', 90), ('1927-28_Austrian_football_championship', '2017-08-01', 4), ('Andrew_McKeever', '2017-10-01', 3), ('Clinocottus', '2017-06-01', 23), ('2006_State_of_Origin', '2015-11-01', 7), ('2013-14_Los_Angeles_Clippers_season', '2015-07-01', 8), ('Cor_Jesu', '2017-01-01', 1), ('Besseringen_B-Werk', '2017-06-01', 158), ('Amy_Hempel', '2017-07-01', 1091), ('Franc-Comtois', '2016-04-01', 2), ('Allium_giganteum', '2017-07-01', 1103), ('Abishai', '2016-08-01', 56), ('Abraham_Clark_High_School', '2016-04-01', 88), ('Baku_chronology', '2015-06-01', 1), ('22nd_MEU', '2015-10-01', 39), ('2015_Open_Engie_de_Touraine', '2015-10-01', 195), ('Churchill_Bowl', '2017-06-01', 30), ('AGMARK', '2017-08-01', 117), ('American_standard_wire_gauge', '2017-12-01', 3), ('Araby,_LA', '2015-05-01', 2), ('217_BC', '2016-12-01', 202), ('2008_Trinidad_and_Tobago_League_Cup', '2016-02-01', 6), ('Alazan_Bay', '2015-12-01', 22), ('Aluminum_fencing', '2015-11-01', 48), ('Achilles_tendinitis', '2016-10-01', 5884), ('AFP_Peacekeeping_Operations_Center', '2017-01-01', 64), ('2013_Xinjiang_clashes', '2016-01-01', 1), ('Arborea_Giudicato_of_Arborea', '2015-09-01', 3), ('1941_Cleveland_Rams_season', '2017-06-01', 40), ('Ju_Posht,_Rasht', '2017-01-01', 3), ('Ascalenia', '2016-07-01', 10), ('Aplectoides', '2018-02-01', 4), ('European_Cup_1969-70', '2016-11-01', 14), ('Armen_Mkertchian', '2016-05-01', 9), ('2015_Aspria_Tennis_Cup_-_Singles', '2018-02-01', 1), ('14_August_1947', '2017-11-01', 6), ('Adobe_Creative_Suite_1', '2015-05-01', 1), ('IC_chips', '2017-01-01', 2), ('Austo_AE300', '2016-07-01', 4), ('Date_palms', '2015-07-01', 79), ('BCS_bowl_game', '2017-06-01', 13), ('AR_Border', '2017-06-01', 1), ('Aranda_de_Duero', '2016-04-01', 256), ('1919_Wake_Forest_Demon_Deacons_football_team', '2016-01-01', 16), ('All_The_Wrong_Clues_For_The_Right_Solution', '2017-10-01', 9), ('Allan_Campbell_McLean', '2015-06-01', 131), ('Bradford_Council_election,_2011', '2017-06-01', 5), ('Astronomy_and_astrophysics', '2015-09-01', 62), ('Dutch_Antillean_people', '2015-07-01', 57), ('Army_Radio', '2018-03-01', 711), ('BBVA_Bancomer', '2016-11-01', 709), ('Lake_Aloha', '2017-01-01', 30), ('Andy_Bean', '2018-02-01', 3092), ('1941_Pittsburgh_Steelers_season', '2016-05-01', 147), ('Aniopi_Melidoni', '2016-06-01', 4), ('Aglossosia_fusca', '2017-09-01', 3), ('Art_books', '2017-04-01', 36), ('1929_Washington_Senators_season', '2017-04-01', 47), ('Antaeotricha_congelata', '2016-12-01', 10), ('Douglas_C-54G-5-DO_Skymaster', '2017-01-01', 1), ('Chris_Jamison', '2016-11-01', 827), ('Ace_Blackwell', '2015-11-01', 9), ('Abdul_Qadir_Fitrat', '2018-02-01', 32), ('Arnoldo_Vizcaino', '2017-10-01', 1), ('2012_Open_EuroEnergie_de_Quimper_-_Doubles', '2017-12-01', 3), ('Dale_Rominski', '2017-01-01', 7), ('ADHD_coaching', '2015-06-01', 50), ('Claire_Yiu', '2016-11-01', 209), ('Applicant', '2015-10-01', 253), ('Apache_OpenOffice', '2017-06-01', 6031), ('Abel_Kiprop_Mutai', '2015-09-01', 22), ('Airdrome_Taube', '2017-04-01', 46), ('Andrey_Viktorovich', '2016-06-01', 1), ('American_Idol_controversy', '2016-03-01', 36), ('Anthrenocerus_confertus', '2018-01-01', 17), ('Appraisal_Subcommittee', '2018-03-01', 17), ('Babusa', '2015-07-01', 3), ('500_homeruns', '2016-06-01', 1), ('Argentina_national_volleyball_team', '2016-08-01', 64), ('Chief_prosecutor_of_Russia', '2015-07-01', 1), ('Absolution_DVD', '2015-06-01', 1), ('1,3-Beta-glucan_synthase', '2017-05-01', 440), ('Dave_Sinardet', '2016-04-01', 26), ('Adeline_Whitney', '2018-03-01', 10), ('Allon_shvut', '2016-07-01', 3), ('2012_Penn_State_Nittany_Lions_football_season', '2017-12-01', 3), ('Coleman-Franklin-Cannon_Mill', '2017-01-01', 4), ('Action_director', '2015-05-01', 93), ('AD_547', '2016-01-01', 1), ('Acta_germanica', '2017-09-01', 1), ('Abu_Dhabi_Global_Market_Square', '2017-01-01', 35), ('Kozo_Shioya', '2017-01-01', 7), ('China_Investment_Corp', '2017-01-01', 2), ('Dmitri_Zakharovich_Protopopov', '2016-04-01', 129), ('Anatra_Anadis', '2017-10-01', 208), ('Archaikum', '2017-11-01', 5), ('2000_Webby_Awards', '2017-04-01', 360), ('2003_BCR_Open_Romania_-_Singles', '2016-08-01', 2), ('Abacetus_bisignatus', '2016-09-01', 79), ('American_school_of_kinshasa', '2016-01-01', 1), ('Anna,_7th_Duchess_of_Bedford', '2016-08-01', 8), ('Black_majority_district', '2016-11-01', 3), ('Dagma_Lahlum', '2015-07-01', 1), ('Credit_Saison', '2015-07-01', 517), ('Ariyankuppam_firka', '2016-02-01', 19), ('Annette_Fuentes', '2016-06-01', 17), ('Angerstein,_John', '2015-12-01', 2), ('Annenkov_Island', '2016-03-01', 280), ('Anne_Frank_museum', '2016-06-01', 67), ('Annales_sancti_Amandi', '2017-06-01', 22), ('L-FABP', '2017-01-01', 1), ('Alvord,_TX', '2017-06-01', 12), ('2006_World_Team_Table_Tennis_Championships', '2016-05-01', 119), ('Angriffen', '2015-12-01', 9), ('Anthony_Oppenheimer', '2017-03-01', 452), ('Absamat_Masaliyevich_Masaliyev', '2016-09-01', 1), ('Airborne_Museum_at_Aldershot', '2016-03-01', 41), ('Aktiubinsk_Oblast', '2015-08-01', 7), ('100_East_Wisconsin', '2015-05-01', 782), ('7th_Bangladesh_National_Film_Awards', '2017-08-01', 91), ('Alejandro_Reyes', '2017-12-01', 35), ('Applied_philosophy', '2018-03-01', 539), ('Adhemar_Pimenta', '2016-06-01', 146), ('Break_the_fourth_wall', '2016-04-01', 66), ('Annoushka_Ducas', '2017-10-01', 411), ('ATC_code_J01CA01', '2015-06-01', 1), ('Evelyn_County,_New_South_Wales', '2016-11-01', 7), ('Elastic_scattering', '2016-11-01', 1374), ('1032_Pafuri', '2015-07-01', 35), ('Andrew_Bromwich', '2015-08-01', 26), ('Ishita_Arun', '2017-01-01', 249), ('Aspergics', '2016-07-01', 1), ('1857_in_Chile', '2018-03-01', 22), ('Breffni', '2015-07-01', 38), ('845_in_poetry', '2017-08-01', 2), ('20321_Lightdonovan', '2015-10-01', 12), ('Arthur_Chandler', '2017-12-01', 27), ('CsISOLatin2', '2017-06-01', 1), ('1900_Grand_National', '2016-06-01', 69), ('Aeritalia_AMX', '2017-03-01', 3), ('B_Sharps', '2015-06-01', 11), ('544_area_code', '2015-09-01', 2), ('30th_Guldbagge_Awards', '2015-06-01', 37), ('Agrippina', '2017-08-01', 315), ('Ardmore', '2016-02-01', 433), ('Amplypterus_panopus', '2016-03-01', 23), ('Alexander_Bukharov', '2017-09-01', 5), ('Alaska_Raceway_Park', '2017-01-01', 46), ('Albanian_National_Road_Race_Championships', '2017-03-01', 31), ('1968_Democratic_National_Convention_protest_activity', '2017-10-01', 2802), ('2012_Birthday_Honours', '2017-10-01', 427), ('2000_NHL_expansion_draft', '2017-06-01', 1), ('A_Town_Where_You_Live', '2016-11-01', 2920), ('Ahmed_Shahzad', '2018-03-01', 25), ('Elisabeth_Svendsen', '2016-11-01', 39), ('2002_FINA_Synchronised_Swimming_World_Cup', '2016-08-01', 30), ('Akatek', '2017-04-01', 10), ('Animation_with_DAZ_Studio', '2018-02-01', 78), ('Fergus_Craig', '2016-11-01', 119), ('Ancel_Nalau', '2015-11-01', 5), ('5171_Augustesen', '2017-04-01', 20), ('Anne_McGuire', '2017-11-01', 329), ('Australian_Photoplay_Company', '2015-12-01', 6), ('1913_in_Canada', '2017-04-01', 137), ('Arhopala_allata', '2015-05-01', 26), ('Il_Paradiso_delle_Signore', '2017-01-01', 31), ('Geri_Palast', '2017-01-01', 38), ('Alan_Abela_Wadge', '2017-03-01', 77), ('22nd_Tactical_Air_Support_Squadron', '2017-10-01', 7), ('Avant_Stellar', '2017-06-01', 22), ('Black_phantom_tetra', '2016-11-01', 205), ('Billy_McCaffrey', '2017-01-01', 314), ('Annie_Furuhjelm', '2017-11-01', 97), ('1992_PGA_Tour', '2017-12-01', 307), ('2008_Chilean_pork_crisis', '2016-01-01', 55), ('2012_Currie_Cup_First_Division', '2018-02-01', 32), ('Aleksei_Fomkin', '2015-05-01', 144), ('Alexander_Krausnick-Groh', '2016-05-01', 101), ('Adam_Richard_Wiles', '2017-08-01', 5), ('ATCvet_code_QA01AD01', '2015-09-01', 2), ('Abu_Bakr_Ibn_Bajja', '2017-03-01', 5), ('Architecture-Studio', '2016-04-01', 94), ('950s_BC', '2016-02-01', 257), ('Abschwunges', '2017-07-01', 1), ('Adonis_Geroskipou', '2017-06-01', 15), ('2008-09_SV_Werder_Bremen_season', '2016-03-01', 3), ('Closed_loops', '2016-04-01', 1), ('AFC_Youth_Championship_1982', '2015-12-01', 10), ('Aquila_Shoes', '2015-08-01', 209), ('9842_Funakoshi', '2017-12-01', 11), ('Educational_quotient', '2016-04-01', 21), ('Antoni_Julian_Nowowiejski', '2018-01-01', 211), ('Adi_Oka_Idhile', '2017-11-01', 16), ('DEXIA-BIL_Luxembourg_Open', '2016-11-01', 3), ('Andrew_James_Simpson', '2016-03-01', 43), ('Alexander_Boksenberg', '2017-12-01', 61), ('1827_in_Denmark', '2017-03-01', 39), ('Afternoon_tea_with_suggs', '2017-11-01', 3), ('Alpha,_MN', '2017-06-01', 6), ('Ari_Onasis', '2015-06-01', 4), ('1961-62_Football_League_First_Division', '2015-11-01', 1), ('Andi_Lila', '2015-06-01', 2847), ('A_Gathering_Of_Old_Men', '2018-02-01', 1), ('Abul_Fazl_al-Abbas', '2017-01-01', 1), ('Asgill,_Charles', '2017-08-01', 1), ('Alexander_Arkhangelsky', '2015-07-01', 12), ('1947-48_Portuguese_Liga', '2015-06-01', 1), ('3rd_MMC_-_Varna', '2016-07-01', 3), ('Alberts,_Wayne', '2017-05-01', 3), ('Alois_Schickelgruber', '2018-02-01', 9), ('Hefner_Stadium', '2017-01-01', 2), ('410912_Lisakaroline', '2018-02-01', 26), ('Academy_at_Mountain_State', '2018-03-01', 1), ('617_Squadron', '2016-05-01', 489), ('Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji', '2015-07-01', 5), ('Arturo_Merino_Benitez_Airport', '2017-10-01', 13), ('AEK_Athens_Futsal', '2015-06-01', 10), ('Aggaeus', '2018-02-01', 2), ('Association_for_Retarded_Citizens_of_the_United_States', '2017-08-01', 3), ('Kielce_pogrom', '2017-01-01', 335), ('1351_in_poetry', '2016-01-01', 17), ('1923_Princeton_Tigers_football_team', '2017-11-01', 41), ('Auzata_semipavonaria', '2017-01-01', 2), ('892_in_poetry', '2016-01-01', 6), ('Anton_Krotiak', '2017-12-01', 2), ('Arthur_Shelley', '2017-12-01', 23), ('2003_Kyoto_Purple_Sanga_season', '2018-02-01', 9), ('Frederic_Bowker_Terrington_Carter', '2016-04-01', 6), ('2-orthoplex', '2016-03-01', 1), ('Acacia_australiana', '2015-09-01', 4), ('2012_Newcastle_Knights_season', '2016-06-01', 103), ('Ann_Wrights_Corner,_Virginia', '2017-07-01', 19), ('12557_Caracol', '2017-03-01', 5), ('2001_African_Footballer_of_the_Year', '2017-05-01', 1), ('Bass_Pyramid', '2017-01-01', 22), ('A_noodle', '2015-05-01', 5), ('Aed_Bennan', '2018-02-01', 2), ('1886_Yale_Bulldogs_football_team', '2017-10-01', 58), ('2002_Players_Championship', '2016-06-01', 54), ('African_Skimmer', '2017-07-01', 2), ('3rd_Guldbagge_Awards', '2016-12-01', 39), ('Arrows_A19B', '2015-10-01', 1), ('Archduchess_Elisabetta_of_Austria-Este', '2017-08-01', 1526), ('America_Islands', '2015-11-01', 1), ('1932_Olympic_Games', '2016-01-01', 9), ('2011_Chinese_pro-democracy_protests', '2015-11-01', 2044), ('Bank_walkaway', '2016-04-01', 113), ('594_in_Ireland', '2017-04-01', 1), ('Association_of_Municipal_Corporations', '2016-12-01', 5), ('Andreas_Brantelid', '2015-09-01', 167), ('Amarthal_urf_Unchagaon', '2017-05-01', 82), ('3-methoxymorphinan', '2017-04-01', 146), ('2382_BC', '2016-07-01', 10), ('1763_in_science', '2016-07-01', 28), ('Arvert', '2017-04-01', 77), ('Ale_yeast', '2017-12-01', 19), ('A_Man_Without_a_Soul', '2018-03-01', 17), ('Air_Force_Base_Louis_Trichardt', '2017-09-01', 1), ('Athirson_Mazzoli_de_Oliveira', '2017-06-01', 3), ('Anthony_Chan_Yau', '2017-07-01', 181), ('Basic_Enlisted_Submarine_School', '2017-06-01', 392), ('Aboriginal_Lands_of_Hawaiian_Ancestry', '2015-09-01', 11), ('Fondren_Southwest,_Houston', '2017-01-01', 4), ('3_World_Financial_Center', '2017-07-01', 64), ('1971_IIHF_European_U19_Championship', '2017-09-01', 9), ('1937-38_Allsvenskan', '2015-12-01', 6), ('Christopher_Ashton_Kutcher', '2017-06-01', 2), ('Australian_rules_football_in_south_australia', '2016-12-01', 1), ('Amicable_pair', '2018-01-01', 7), ('Alan_Tomes', '2015-11-01', 82), ('Alexei_Petrovich,_Tsarevich_of_Russia', '2015-12-01', 3887), ('Alexis_Damour', '2015-10-01', 66), ('Bankruptcy_Act_of_1938', '2017-06-01', 76), ('Amphiphyllum', '2016-06-01', 14), ('Conway_High_School_West', '2016-04-01', 1), ('5447_Lallement', '2015-11-01', 10), ('Gabriel_Iddan', '2017-01-01', 1), ('1879-80_Scottish_Cup', '2017-04-01', 3), ('2011_Eneco_Tour', '2016-10-01', 31), ('1471_in_England', '2015-11-01', 94), ('Ashland_Town_Hall', '2017-01-01', 5), ('Archduke_John', '2015-05-01', 20), ('2000_Cameroonian_Premier_League', '2017-09-01', 18), ('1997_flood', '2017-11-01', 5), ('Agile_management', '2015-09-01', 26677), ('Am_841', '2017-12-01', 3), ('Apprentice_Mason', '2018-01-01', 4), ('Hales-Jewett_theorem', '2017-01-01', 2), ('Alien_Abductions', '2017-10-01', 14), ('Arjun_Menon', '2016-02-01', 370), ('Anthokyan', '2016-01-01', 4), ('Automobili_Lamborghini', '2016-02-01', 1110), ('Alain_Prost', '2017-04-01', 25196), ('Fartein_Valen', '2016-04-01', 90), ('Antonio_Galli_da_Bibiena', '2016-05-01', 5), ('Al_Jawf,_Libya', '2017-03-01', 600), ('AD_695', '2018-02-01', 1), ('Amir_chand', '2015-11-01', 1), ('Alcis_obliquisigna', '2017-08-01', 1), ('Chandra_Talpade_Mohanty', '2017-01-01', 306), ('Algerian_safe_house,_Jalalabad', '2015-06-01', 3), ('Jake_Milner', '2017-01-01', 1), ('Alternate_Communications_Center', '2017-10-01', 1), ('In_the_Bleachers', '2017-01-01', 42), ('Alex_Puodziukas', '2016-04-01', 7), ('Altarpiece_of_Pilgrim_II', '2018-02-01', 2), ('Cybernetical_Physics', '2017-01-01', 3), ('Christopher_Unthank', '2017-06-01', 2), ('1982_Independence_Bowl', '2015-06-01', 102), ('Ascoli_Calcio_1898', '2018-03-01', 1115), ('Briggs-Rauscher_reactions', '2017-06-01', 1), ('Adjadja', '2018-02-01', 45), ('Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed', '2016-06-01', 3), ('Catholic_social_doctrine', '2017-01-01', 6), ('2833_BC', '2016-11-01', 1), ('Bethy_Woodward', '2016-04-01', 38), ('Bateman_polynomials', '2017-06-01', 22), ('1966_Buenos_Aires_Grand_Prix', '2015-10-01', 19), ('A_River_Somewhere', '2015-10-01', 353), ('2016-17_BVIFA_National_Football_League', '2017-04-01', 2), ('1909_Major_League_Baseball_season', '2015-10-01', 362), ('1988_Oklahoma_Sooners_football', '2017-11-01', 2), ('2010s_in_Chechen_fashion', '2016-10-01', 1), ('Accademia_Olimpica', '2017-08-01', 17), ('Air_cooling', '2015-07-01', 2010), ('Amir_Saoud', '2016-11-01', 22), ('Alex_Auburn', '2015-05-01', 52), ('Apamea_impulsa', '2016-11-01', 6), ('Australian_federal_election,_2007', '2015-07-01', 1794), ('Ain_Sakhri', '2017-10-01', 76), ('Belosaepiidae', '2015-07-01', 68), ('Acts_of_Parliament_in_the_United_Kingdom', '2017-10-01', 4070), ('Equity_Office', '2016-11-01', 202), ('David_Bintley', '2017-01-01', 51), ('Aksel_Schiotz', '2018-03-01', 3), ('Appropriation_Act_2000', '2017-05-01', 12), ('Edward_Johnson_III', '2016-11-01', 491), ('2006_Ohio_State_Buckeyes_football_team', '2016-03-01', 1452), ('Battle_of_Fort_Beausejour', '2015-07-01', 97), ('Abel_Foullon', '2015-12-01', 82), ('Apollo_VIII', '2015-10-01', 19), ('Carry_on_up_the_jungle', '2015-07-01', 8), ('Armour_villa', '2017-05-01', 4), ('201_Poplar', '2015-08-01', 265), ('Arta_prefecture', '2016-08-01', 1), ('2015-16_Ekstraklasa', '2018-02-01', 13), ('Alport,_Ontario', '2018-02-01', 2), ('Bongoland', '2017-06-01', 62), ('Alfred_Charles_Post', '2016-11-01', 11), ('Aam_Aadmi_Party_crisis', '2016-10-01', 1), ('Andrea_Moda', '2015-07-01', 143), ('Abdul_Halim_Sharar', '2017-08-01', 545), ('Apostolic_Vicariate_of_Yunnan', '2016-12-01', 1), ('Catherine_Steadman', '2016-11-01', 5218), ('Agastachys_odorata', '2015-10-01', 38), ('9783_Tensho-kan', '2016-03-01', 2), ('AFL_Cairns', '2017-10-01', 337), ('Abomey', '2015-06-01', 1062), ('Anne_Crofton,_1st_Baroness_Crofton', '2015-12-01', 42), ('Cash-flow_return_on_investment', '2017-01-01', 137), ('Alberto_Arvelo_Torrealba_Municipality', '2015-08-01', 56), ('Abyssinian_Shorthorned_Zebu', '2017-09-01', 124), ('Albanian_hip_hop', '2016-01-01', 1812), ('Alphonso_IV_of_Portugal', '2016-02-01', 12), ('19th_The_Alberta_Mounted_Rifles', '2016-10-01', 1), ('Chinese_shadow_theatre', '2016-04-01', 1), ('American_Committee_of_the_Fourth_International', '2017-08-01', 4), ('2014_Bahrain_GP2_Series_round', '2016-03-01', 80), ('Alexandrian_orthodox', '2017-09-01', 2), ('2010_Hurricane_Season', '2015-05-01', 18), ('1938_All-Ireland_Senior_Camogie_Championship_Final', '2017-01-01', 1), ('ATC_code_D01', '2018-01-01', 203), ('Albedo', '2015-08-01', 23484), ('Chavigny,_Meurthe-et-Moselle', '2017-01-01', 12), ('Becky_Essex', '2015-07-01', 51), ('Archaeological_Museum_Padre_Le_Paige', '2018-02-01', 2), ('Abu_Bakar_Sillah', '2017-01-01', 5), ('Back_chat', '2017-01-01', 2), ('Anchylobela_dyseimata', '2015-12-01', 11), ('Anthony_Overton', '2017-03-01', 261), ('Bear_maul', '2016-04-01', 3), ('Ambarawa,_Central_Java', '2016-01-01', 1), ('Amber_lager', '2016-11-01', 87), ('2nd_LAAD', '2017-09-01', 8), ('Ashiya,_Hyogo', '2018-03-01', 24), ('Angels_at_Risk', '2018-02-01', 74), ('Audrey_Marie_Munson', '2016-03-01', 17), ('1984_Australian_Football_Championships', '2017-01-01', 27), ('Ammonia_fountain', '2016-06-01', 434), ('Allister_Bentley', '2018-03-01', 11), ('Alsager_Hay_Hill', '2016-10-01', 72), ('1753_English_cricket_season', '2015-05-01', 51), ('2009-10_New_Jersey_Devils_season', '2016-10-01', 1), ('An_Untamed_State', '2016-05-01', 1109), ('Beatrice_Carmichael', '2016-11-01', 5), ('Abdul_Ghani_Ahmad', '2017-12-01', 115), ('Arteria_suralis', '2017-02-01', 3), ('Berzasca_River', '2017-01-01', 1), ('Angel_Attack', '2015-09-01', 98), ('1969_San_Francisco_49ers_football_team', '2017-11-01', 1), ('Anthony_Beilenson', '2017-09-01', 114), ('Crystalline_Entity', '2016-04-01', 180), ('Granice', '2017-01-01', 2), ('203rd_General_Hospital', '2017-07-01', 44), ('Acrocercops_rhombiferellum', '2017-12-01', 20), ('Ampliglossum_blanchetii', '2017-05-01', 1), ('11553_Scheria', '2017-03-01', 2), ('Ashkenozi', '2017-02-01', 1), ('2010_Calder_Cup_Playoffs', '2018-01-01', 9), ('Alice_Caymmi', '2016-01-01', 121), ('Alfredo_Alvar', '2017-04-01', 44), ('2006_Legends_Tour', '2017-07-01', 30), ('Albano_Albanese', '2015-10-01', 53), ('1943_Frankford_Junction_train_wreck', '2016-08-01', 510), ('Evans_Court_Apartment_Building', '2016-04-01', 4), ('Abu_al-Rayhan_Muhammad_ibn_al-Biruni', '2017-11-01', 1), ('Abubakar_Muhammad_Rimi', '2015-05-01', 4), ('Dostpur', '2016-11-01', 26), ('Accessories_Council_Excellence_Awards', '2016-03-01', 14), ('2006_North_American_heat_wave', '2015-06-01', 1161), ('Amstelodamum', '2017-09-01', 12), ('A_Very_Peculiar_Practice', '2016-08-01', 1860), ('Allegorie_der_Liebe', '2015-09-01', 1), ('Alex_Mackie', '2017-02-01', 95), ('1812_Homestead_Farm_and_Museum', '2017-09-01', 29), ('Argus_distribution', '2016-03-01', 8), ('Anthony_Thomas_Stover', '2017-02-01', 1), ('Arthur_Shallcross', '2016-11-01', 20), ('Antoine_Francois_Fourcroy', '2018-01-01', 1), ('Abbas_Halim', '2016-11-01', 21), ('Akiva_Baer_ben_Joseph', '2017-08-01', 1), ('Balatonfuered', '2016-11-01', 3), ('Antemnae', '2017-11-01', 204), ('Cling_Cling', '2017-06-01', 93), ('B_flat_major', '2017-01-01', 28), ('AirExplore', '2017-12-01', 930), ('Auckland_Super_Sprint', '2015-11-01', 120), ('Alfredo_De_Gasperis', '2017-12-01', 793), ('Geoffrey_I_of_Vianden', '2017-01-01', 5), ('Copa_de_Zaachila', '2016-04-01', 6), ('Alboacen', '2017-09-01', 1), ('BNH_Hospital_Bangkok', '2017-06-01', 2), ('Agricultural_health_and_safety', '2016-09-01', 1), ('Chiasms', '2017-06-01', 2), ('Al_Karaana', '2016-05-01', 58), ('Alberta_Highway_872', '2016-11-01', 1), ('Among_the_mourners', '2016-03-01', 1), ('Achema_Power_Plant', '2015-06-01', 55), ('ATSE_Graz', '2017-10-01', 65), ('Arthroscopy', '2017-02-01', 11721), ('2010-2012_European_Nations_Cup_Second_Division', '2018-01-01', 7), ('1967_Cincinnati_Reds', '2015-08-01', 4), ('24th_Golden_Disc_Awards', '2017-05-01', 71), ('Johnny_Floyd', '2017-01-01', 17), ('Arthur_Rupin', '2016-02-01', 5), ('Alpine_skiing_at_the_2011_Canada_Winter_Games', '2015-09-01', 38), ('College_Press_Service', '2017-01-01', 8), ('American_Psycho', '2015-08-01', 55567), ('CBC_Winnipeg', '2017-06-01', 17), ('Burning_the_process', '2016-04-01', 1), ('2011_Stanley_Cup_playoffs', '2017-01-01', 1036), ('Andrew_Mumford', '2017-01-01', 6), ('1925_in_fine_arts_of_the_Soviet_Union', '2018-02-01', 28), ('Aragvi_river', '2017-02-01', 2), ('Andrew_Adamson', '2018-03-01', 16269), ('Arcides_fulvohirta', '2016-10-01', 1), ('Araya_Selassie_Yohannes', '2015-11-01', 423), ('Apartment_house', '2016-09-01', 85), ('Advanced_Art', '2015-12-01', 171), ('1028_Lydina', '2015-06-01', 53), ('2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti', '2017-04-01', 2), ('Adolph_Weiss', '2015-06-01', 98), ('Adam_Jerzy_Czartoryski', '2015-09-01', 1237), ('1980_United_States_presidential_election', '2017-05-01', 56), ('1956_Oscars', '2016-08-01', 10), ('Burundian_Senate_election,_2005', '2016-04-01', 1), ('Amarolea_floridana', '2015-07-01', 3), ('August_Bier', '2015-12-01', 514), ('Arbelodes_sebelensis', '2018-03-01', 6), ('Abiah_Brown', '2018-02-01', 1), ('A_Maceo_Smith_High_School', '2016-10-01', 2), ('1488_in_architecture', '2017-12-01', 6), ('2009_AMP_Energy_500', '2016-04-01', 45), ('1921_Baylor_Bears_football_team', '2017-03-01', 21), ('Dmitry_Akhba', '2015-07-01', 43), ('2004_Big_12_Conference_Baseball_Tournament', '2016-07-01', 37), ('Abdisalam_Omer', '2018-02-01', 116), ('Alma,_son_of_Alma', '2015-08-01', 53), ('An_Phoblacht', '2016-10-01', 962), ('2009_Turner_Prize', '2016-01-01', 75), ('Jack_Zajac', '2017-01-01', 24), ('1906_Wimbledon_Championships', '2016-04-01', 22), ('Chuckwalla_Valley', '2017-06-01', 22), ('Alien_Quadrology', '2016-02-01', 1), ('Chalcidoptera_contraria', '2016-04-01', 1), ('Alaska_Republican_Gubernatorial_Primary_Election,_2006', '2016-02-01', 1), ('333639_Yaima', '2018-02-01', 7), ('Aquila_hastata', '2015-11-01', 28), ('Al-Fua', '2017-07-01', 1), ('Anihilation', '2015-07-01', 28), ('International_Toy_Fair', '2017-01-01', 1), ('38th_Regiment_Indiana_Infantry', '2017-01-01', 10), ('Andrea_Stella', '2017-07-01', 75), ('Anselmo_de_Moraes', '2015-09-01', 562), ('Applemore', '2016-05-01', 3), ('Akpinar,_Kirsehir', '2015-06-01', 3), ('Ant_nest', '2016-05-01', 53), ('Catherine_of_Siena', '2016-11-01', 8806), ('Barbos', '2015-06-01', 12), ('Amlaib_mac_Iduilb', '2017-08-01', 2), ('Alice_Janowski', '2018-03-01', 17), ('Acacia_leptocarpa', '2017-03-01', 48), ('Al-Hadi_Yahya', '2016-01-01', 39), ('2015_British_Figure_Skating_Championships', '2017-07-01', 38), ('Avenues_Television', '2016-03-01', 214), ('Dendropsophus_sartori', '2015-07-01', 11), ('1952_in_Germany', '2015-05-01', 63), ('Armuchee_High_School', '2016-04-01', 27), ('April_1_RFC', '2017-11-01', 2), ('Caroline_Bliss', '2016-11-01', 972), ('66th_Rice_Bowl', '2016-06-01', 17), ('Alec_Smight', '2017-02-01', 173), ('Alexei_Panin', '2017-09-01', 3), ('Codeword', '2016-04-01', 84), ('Dormice', '2015-07-01', 63), ('2105_BC', '2017-11-01', 6), ('5th_National_Congress_of_Kuomintang', '2016-06-01', 5), ('Caminho_das_Indias', '2017-01-01', 5), ('Agerbo', '2017-11-01', 2), ('Abe_Anellis', '2018-01-01', 86), ('Aceh_Medal', '2015-07-01', 33), ('Alltech_Arena', '2016-10-01', 144), ('Aly_Oury', '2016-06-01', 260), ('757th_Troop_Carrier_Squadron', '2017-07-01', 2), ('Alec_Peters', '2017-12-01', 2731), ('Agua_Buena_Airport', '2017-09-01', 12), ('Alessandro_Livi', '2016-08-01', 104), ('Andkaer', '2017-04-01', 3), ('Cateran', '2017-06-01', 135), ('57th_Venice_International_Film_Festival', '2017-04-01', 180), ('Brijal_Patel', '2017-06-01', 98), ('Cnemaspis_jerdonii', '2015-07-01', 6), ('Aluminum_sodium_salt', '2016-10-01', 3), ('Arnaldo_Antonio_Sanabria_Ayala', '2017-09-01', 4), ('Angels_of_Iron', '2018-02-01', 83), ('Bugs_Bunny_Rabbit_Rampage', '2017-06-01', 422), ('Admiralty_Class_Destroyer', '2017-10-01', 2), ('Atlas_Media', '2017-05-01', 2), ('Arcesilaus_i_of_cyrene', '2017-03-01', 1), ('2011_Tajikistan_national_football_team_results', '2017-04-01', 13), ('Artur_Shakhnazarov', '2017-12-01', 22), ('747_Express_Bus', '2018-03-01', 20), ('101-in-1_Party_Megamix', '2017-10-01', 188), ('Fastpoint_Games', '2016-11-01', 32), ('Analog_Anthology_1', '2017-07-01', 1), ('Archival_bond', '2015-09-01', 119), ('1985_Air_Force_Falcons_football', '2017-09-01', 4), ('American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem', '2017-06-01', 3), ('Adaptive_Evolution_in_the_Human_Genome', '2017-08-01', 2), ('Arthur_Strangways', '2015-11-01', 5), ('1583_in_poetry', '2015-09-01', 68), ('Andrew_igoudala', '2015-06-01', 2), ('Euonychophora', '2016-11-01', 37), ('Catechizing', '2016-04-01', 4), ('1960-61_ice_hockey_Bundesliga_season', '2018-03-01', 3), ('Buk_Vlaka', '2017-06-01', 10), ('Arbor_Day', '2018-03-01', 16265), ('Guan_Sheng', '2017-01-01', 73), ('2014_Barcelona_Open_Banc_Sabadell', '2016-08-01', 57), ('1976-77_Nationalliga_A', '2016-04-01', 1), ('AFL_records', '2015-11-01', 16), ('2005_Tour_Down_Under', '2016-10-01', 26), ('92_BCE', '2015-08-01', 4), ('Bento_Box_Animation', '2017-01-01', 1), ('Alabama_Territory', '2018-03-01', 1195), ('Abdul-Wasa_Al-Saqqaf', '2016-07-01', 21), ('Archbishops_of_Semarang', '2017-01-01', 6), ('Ambivina', '2017-10-01', 13), ('Aghjaghala_Ulia', '2017-08-01', 2), ('Blechnum_novae-zelandiae', '2016-11-01', 26), ('Dictyosome', '2016-04-01', 19), ('Arts_Council_of_Great_Britain', '2016-12-01', 785), ('LBC_Radio', '2017-01-01', 3), ('Ageo,_Saitama', '2016-06-01', 396), ('Babla_Mehta', '2016-12-01', 674), ('2012-13_Russian_Cup', '2018-01-01', 10), ('Chandragupt', '2017-06-01', 6), ('407th_Air_Refueling_Squadron', '2016-01-01', 96), ('Aftermarket', '2016-07-01', 1253), ('A_Portrait_of_New_Orleans', '2016-08-01', 18), ('2000-01_Yemeni_League', '2017-03-01', 1), ('Actinidia_chinensis', '2015-11-01', 907), ('Amsterdam_Tournament_1999', '2018-03-01', 1), ('Arthur_Iberall', '2017-02-01', 112), ('Auricula_Meretricula', '2016-02-01', 103), ('Archbishop_of_Lahore', '2016-09-01', 8), ('Chippewa_Indians_of_Montana', '2016-04-01', 9), ('Abidjan-Niger_Railway', '2018-01-01', 22), ('29th_Annual_Grammy_Awards', '2017-05-01', 1087), ('Ateles_geoffroyi_frontatus', '2017-06-01', 3), ('Enrico_Cernuschi', '2016-11-01', 3), ('A4183_road', '2017-02-01', 8), ('Ahrayut', '2016-10-01', 75), ('Alison_Castle', '2016-03-01', 55), ('Automobile_aftermarket', '2016-10-01', 5), ('2008_GAINSCO_Auto_Insurance_Indy_300', '2016-07-01', 51), ('1937_Scottish_Cup_Final', '2017-04-01', 126), ('2005_Clipsal_500_Adelaide', '2018-02-01', 22), ('Farid_Farjad', '2016-04-01', 120), ('13_Tribes_of_Long_Island', '2015-12-01', 11), ('Afroneta_bamilekei', '2017-01-01', 2), ('Frederick_Stuart_Greene', '2017-01-01', 1), ('Andre_Braugher', '2017-04-01', 37655), ('1906_International_Lawn_Tennis_Challenge', '2017-10-01', 73), ('2009-10_NFL_Playoffs', '2016-01-01', 69), ('Cricket_Wellington', '2016-11-01', 2), ('Craig_Blazer', '2015-07-01', 21), ('Aeolidiella_orientalis', '2017-05-01', 3), ('Andre_Prokovsky', '2017-06-01', 4), ('Angela_McKee', '2017-11-01', 14), ('Airbase_Golubovci', '2016-10-01', 1), ('2011_ISAF_Sailing_World_Championships', '2017-05-01', 89), ('Bartica_Airport', '2017-06-01', 27), ('Agusan_Dam', '2016-09-01', 454), ('Bosque_Real_Country_Club', '2015-07-01', 42), ('Georges_Duhamel', '2017-01-01', 122), ('Allrounder', '2017-03-01', 63), ('2017_Missouri_State_Bears_football_team', '2017-09-01', 868), ('Allons_a_Lafayette', '2017-11-01', 17), ('Agathla', '2015-05-01', 105), ('1086_in_poetry', '2015-09-01', 25), ('Absolute_extreme', '2017-09-01', 1), ('Agathe_Bonitzer', '2017-12-01', 229), ('Chinese_Red_Pine', '2017-06-01', 18), ('Angular_dispersion', '2016-02-01', 11), ('Jean-Sebastian_Giguere', '2017-01-01', 2), ('Actinium-235', '2018-03-01', 4), ('Ago,_filo_e_nodo', '2017-02-01', 11), ('Aranea_cruentata', '2016-03-01', 1), ('2009_Korea_National_League', '2017-11-01', 19), ('Americom-8', '2016-08-01', 28), ('2006_Junee_Bushfire', '2018-03-01', 81), ('2013_Major_League_Baseball_Home_Run_Derby', '2017-09-01', 182), ('1928_US_Presidential_Election', '2016-12-01', 42), ('After-eighty_generation', '2016-02-01', 127), ('1932_Hawthorn_Football_Club_season', '2017-07-01', 16), ('Amelia_Elizabeth_Mary_Rygate', '2017-05-01', 2), ('Aline_Khalaf', '2017-12-01', 465), ('Akron_Junction,_New_York', '2017-07-01', 56), ('Apollo_moon_landing_conspiracy_theories', '2015-09-01', 4), ('1978_National_League_Championship_Series', '2017-03-01', 325), ('1959-60_German_football_championship', '2017-08-01', 5), ('Almost_a_Bride', '2017-01-01', 1), ('Andrew_Lysaght,_junior', '2015-10-01', 20), ('1902_Otani_expedition', '2018-02-01', 1), ('1892_Currie_Cup', '2016-09-01', 53), ('1988_USC_Trojans_football_team', '2016-10-01', 494), ('1944_in_Northern_Ireland', '2016-12-01', 46), ('Alfred_Acherman', '2017-07-01', 1), ('Arcadia,_Nebraska', '2017-02-01', 148), ('4_x_400_metre_relay', '2018-03-01', 1), ('A4030_road', '2016-07-01', 1), ('Chi-li', '2016-11-01', 3), ('Aircraft_fairing', '2016-11-01', 1861), ('Buddhism_in_Belize', '2015-07-01', 40), ('Alameda_County_Open', '2017-02-01', 33), ('Area_of_countries_and_regions_of_the_United_Kingdom', '2017-10-01', 6), ('2014_Weber_State_Wildcats_football_team', '2016-10-01', 47), ('American_Journal_of_Comparative_Law', '2016-04-01', 62), ('A_Teaspoon_Every_Four_Hours', '2017-03-01', 47), ('Astasis', '2016-03-01', 1195), ('Akhrakouaeronon', '2015-11-01', 62), ('Annenkrone', '2016-03-01', 40), ('Ballotine', '2016-12-01', 4753), ('2000_Kipawa_earthquake', '2015-11-01', 139), ('Archdiocese_of_cashel_and_emly', '2017-01-01', 1), ('Chevrolet_SS396', '2017-01-01', 1), ('Achyroseris', '2016-03-01', 1), ('Daniel_Pulteney', '2016-11-01', 29), ('2006_Major_League_Baseball_draft', '2017-07-01', 10637), ('Adetunji_Idowu_Olurin', '2016-01-01', 37), ('Ardatov,_Nizhny_Novgorod_Oblast', '2017-04-01', 18), ('Andrew_Hilditch', '2015-08-01', 398), ('A_Very_Merry_Daughter_Of_the_Bride', '2017-04-01', 67), ('1993_in_radio', '2017-08-01', 85), ('Deltan', '2016-11-01', 91), ('Adnan_Custovic', '2017-12-01', 26), ('Di_Gennaro', '2017-01-01', 4), ('237_AD', '2017-11-01', 1), ('Aaron_Gombar', '2018-03-01', 2), ('Acrolophus', '2017-04-01', 47), ('Alfred_Bergman', '2017-06-01', 27), ('Charles_Bebb', '2017-06-01', 39), ('Dirico', '2017-01-01', 24), ('1982_Major_League_Baseball_Draft', '2016-12-01', 90), ('DDT_wrestling', '2016-11-01', 4), ('1988-89_Houston_Rockets_season', '2016-02-01', 10), ('Acacia_loderi', '2015-11-01', 35), ('2015_Deauville_American_Film_Festival', '2016-10-01', 126), ('Andropadus_importunus', '2016-02-01', 9), ('Antonio_Bacchetti', '2017-04-01', 52), ('Ann_Trindade', '2015-09-01', 49), ('5_x_Monk_5_x_Lacy', '2016-05-01', 37), ('Barlochan,_Ontario', '2017-06-01', 2), ('Achaian', '2017-03-01', 35), ('Flow_rider', '2017-01-01', 1), ('Antiblemma_discerpta', '2018-02-01', 1), ('1997_Illinois_Fighting_Illini_football_team', '2017-11-01', 331), ('Ahrntal', '2016-03-01', 540), ('Apollo_Conference', '2015-10-01', 329), ('Algenib_in_Perseus', '2016-01-01', 1), ('Craig_Norgate', '2016-04-01', 42), ('Antwerp_Zoo', '2015-12-01', 879), ('Cold_Contagious', '2017-06-01', 161), ('Bolito', '2016-11-01', 181), ('Chinese_bridges', '2016-11-01', 1), ('14th_Indiana_Infantry_Regiment', '2017-04-01', 115), ('Bindunuwewa_massacre', '2015-07-01', 52), ('Eastshore_Highway', '2016-11-01', 2), ('Daemonologie', '2017-01-01', 1655), ('Aero_Pacifico', '2015-07-01', 1), ('Blue_Ribbon_Schools_Program', '2017-06-01', 557), ('Ash_Township,_MI', '2018-02-01', 3), ('Al-Hatab_Square', '2018-02-01', 450), ('Alje_Vennema', '2018-02-01', 187), ('1920_All-Ireland_Senior_Football_Championship_Final', '2016-05-01', 40), ('Criss_Oliva', '2016-11-01', 801), ('Bethlehem,_Ohio', '2017-01-01', 16), ('1976_WHA_Amateur_Draft', '2015-08-01', 47), ('Angela_Fimmano', '2017-06-01', 17), ('Alexander_Bonini_of_Alexandria', '2017-09-01', 1), ('Anarchist_faq', '2015-05-01', 13), ('Aleksander_Benedykt_Sobieski', '2016-05-01', 240), ('Cape_Florida_Lighthouse', '2016-04-01', 6), ('Fernando_VI_of_Spain', '2017-01-01', 3), ('Crossing_number', '2017-06-01', 29), ('1984_NSL_Cup', '2017-05-01', 26), ('Barbara_Weldon', '2015-06-01', 29), ('Andreas_Olsen', '2017-01-01', 32), ('Battle_of_Baima', '2016-04-01', 2), ('Amory_Hansen', '2016-05-01', 26), ('Akhmimic', '2015-11-01', 41), ('Al_Awda', '2018-02-01', 18), ('Adelheid-Marie_of_Anhalt-Dessau', '2016-07-01', 70), ('Americans_for_Technology_Leadership', '2015-10-01', 90), ('Belizean_diplomatic_missions', '2017-06-01', 3), ('African_communist', '2016-05-01', 3), ('Andosol', '2016-09-01', 246), ('Alan_Attraction', '2016-05-01', 15), ('A_Yank_in_Rome', '2015-12-01', 70), ('2004_in_the_United_Arab_Emirates', '2018-02-01', 33), ('Additionality', '2017-06-01', 371), ('Assassination_of_Trotsky', '2015-06-01', 47), ('Alice_Sotero', '2018-02-01', 27), ('Agyneta_platnicki', '2016-04-01', 4), ('Alexandra_Vasilyevna_Velyaminova', '2015-07-01', 30), ('1881_in_Chile', '2016-06-01', 16), ('Arterial_ischemic_stroke', '2018-01-01', 57), ('Astro_Glacier', '2015-09-01', 27), ('Chester_Earl_Merrow', '2017-06-01', 58), ('Alejandro_de_la_Madrid', '2015-11-01', 1630), ('70936_Kamen', '2017-08-01', 1), ('AK_Steel_Holding_Corp', '2015-08-01', 8), ('1124_Stroobantia', '2017-10-01', 23), ('Asian_Wedding', '2016-10-01', 15), ('23837_Matthewnanni', '2015-10-01', 18), ('Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden', '2017-03-01', 4893), ('Betsy_Hodges', '2016-04-01', 560), ('Arthur_and_the_Invisibles', '2015-08-01', 14924), ('Arkansas-Ole_Miss_football_rivalry', '2015-05-01', 7), ('Asia_Cup', '2015-09-01', 5938), ('Arginine_racemase', '2016-12-01', 15), ('585th_Field_Company,_Royal_Engineers', '2018-03-01', 1), ('1975_Stagg_Bowl', '2017-08-01', 6), ('Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath', '2017-01-01', 1), ('Askajian', '2016-02-01', 26), ('2006_Nebraska_Cornhuskers_football_team', '2015-08-01', 975), ('Cicero_Francis_Lowe_House', '2015-07-01', 10), ('Conan_IV,_Duke_of_Brittany', '2016-11-01', 252), ('2005_World_Modern_Pentathlon_Championships', '2016-07-01', 38), ('1946_Aleutian_Islands_earthquake', '2017-03-01', 2019), ('ANKRD17', '2017-09-01', 19), ('1970_Maryland_Terrapins_football_team', '2017-11-01', 42), ('Ali_Dehkhoda', '2017-04-01', 1), ('1244_in_art', '2015-07-01', 22), ('1520s_in_Denmark', '2016-01-01', 20), ('Abdoulaye_Gaye', '2017-12-01', 10), ('An_Angel_Has_Arrived', '2016-03-01', 36), ('1453_BC', '2015-08-01', 26), ('2017_National_Games_of_China', '2017-05-01', 1293), ('A_Night_in_Sickbay', '2016-05-01', 251), ('Dateline_Diamonds', '2017-01-01', 53), ('419_guestbook_spamming', '2016-02-01', 5), ('Familiar_bluet', '2017-01-01', 4), ('Abu_Bakr_Mirza', '2017-10-01', 86), ('7272_Darbydyar', '2017-11-01', 4), ('Ages_of_consent_in_Latin_America', '2017-03-01', 961), ('1982_Japan_Soccer_League_Cup', '2016-04-01', 14), ('2810_BC', '2015-07-01', 9), ('Druga_Liga_Republike_Srpske', '2017-01-01', 1), ('1998_Swedish_Rally', '2017-09-01', 34), ('1567_in_Norway', '2015-10-01', 89), ('126_Army_Engineer_Regiment,_Royal_Engineers', '2016-03-01', 5), ('2017_American_League_Wild_Card_Game', '2017-10-01', 25120), ('August_Follen', '2017-01-01', 2), ('Ala_Gertner', '2015-11-01', 876), ('Glenwood,_Harford_County,_Maryland', '2017-01-01', 3), ('Applied_ecology', '2017-12-01', 730), ('Ariarathes_V_Eusebes_Philopator', '2018-03-01', 5), ('2006_AFC_Champions_League', '2017-09-01', 947), ('60_minutes_2', '2016-10-01', 2), ('Embryonic_shield', '2017-01-01', 2), ('2001_Meath_Intermediate_Football_Championship', '2015-11-01', 8), ('Apparition_of_Christ_to_Madonna', '2017-06-01', 5), ('Hoosier_Road_Elementary', '2017-01-01', 1), ('Arua_Uda', '2016-12-01', 29), ('Array_comprehension', '2015-11-01', 8), ('Baszki', '2015-06-01', 36), ('Akron_Neighborhoods', '2016-01-01', 4), ('Catholic_Church_in_Costa_Rica', '2017-06-01', 85), ('Canada-Sweden_relations', '2015-07-01', 1), ('Barza_Radio_Community', '2016-11-01', 6), ('Dalhousie_Middle_School', '2016-11-01', 5), ('Alliphis_bakeri', '2017-11-01', 2), ('Bartica_massacre', '2017-06-01', 53), ('30th_January', '2015-11-01', 10), ('1920_revolution', '2017-05-01', 5), ('Amyraldism', '2017-08-01', 828), ('AA_Jefferson_District', '2016-05-01', 45), ('Eunebristis_cinclidias', '2017-01-01', 1), ('A_Scott_Connelly', '2017-06-01', 5), ('Antony_Durose', '2016-07-01', 19), ('Arval_Brethren', '2017-11-01', 579), ('Anthidium_dissectum', '2017-05-01', 2), ('Aru,_Democratic_Republic_of_the_Congo', '2017-04-01', 81), ('1956-57_West_Indian_cricket_season', '2017-04-01', 2), ('2014_Moscow_Film_Festival', '2017-08-01', 2), ('Anna_Gurji', '2017-06-01', 27), ('Allen_Memorial_Medical_Library', '2016-07-01', 120), ('Anton_Sistermans', '2017-02-01', 36), ('Clotheshorses', '2017-06-01', 1), ('36_Stratagems', '2017-08-01', 25), ('Attack_of_the_crab_monsters', '2016-10-01', 16), ('30_rock_awards', '2015-09-01', 2), ('Aeroflot,_Uralsk_Civil_Aviation_Directorate', '2017-08-01', 2), ('Amblyseius_parabufortus', '2017-06-01', 3), ('Indian_coral_tree', '2017-01-01', 3), ('3285_Ruth_Wolfe', '2016-02-01', 9), ('Anderson_da_Silva_Gibin', '2016-08-01', 73), ('5001st_Composite_Group', '2017-03-01', 4), ('Danzik', '2016-04-01', 8), ('4810_Ruslanova', '2016-03-01', 2), ('Arkendale,_Virginia', '2016-04-01', 14), ('Al_Francis_Bichara', '2016-09-01', 239), ('Cayena', '2017-01-01', 1), ('A_Glass_of_Darkness', '2017-04-01', 95), ('GMC_CCKW', '2017-01-01', 887), ('Alabama_State_Route_107', '2015-11-01', 13), ('2011_in_motorsport', '2017-12-01', 26), ('Adecco_General_Staffing,_New_Zealand', '2017-12-01', 86), ('Anbargah', '2015-10-01', 6), ('1995_Asian_Cup_Winners_Cup', '2016-06-01', 7), ('1986_Wales_rugby_union_tour_of_the_South_Pacific', '2016-12-01', 30), ('Adya_Goud_Brahmin', '2017-03-01', 2), ('Akcakiraz', '2015-08-01', 5), ('24249_Bobbiolson', '2017-12-01', 4), ('Ahmanson_Theatre', '2016-02-01', 801), ('Abdullah_ibn_Jahsh', '2016-10-01', 196), ('1937_in_Chile', '2015-08-01', 24), ('2000_in_England', '2016-01-01', 57), ('A_Deepness_In_The_Sky', '2017-08-01', 2), ('Area_code_678', '2015-07-01', 480), ('Avalon_Hill', '2017-01-01', 880), ('Anna,_Duchess_of_Prussia', '2015-12-01', 315), ('Alexandr_Syman', '2017-04-01', 24), ('7400_series_logic', '2017-11-01', 2), ('Greenleaf_Township,_Minnesota', '2017-01-01', 1), ('Acetylsal', '2017-04-01', 6), ('Earth_and_Man_National_Museum', '2016-11-01', 43), ('Affetside', '2015-10-01', 185), ('1971_CFL_season', '2015-08-01', 202), ('Beth_Bader', '2016-11-01', 21), ('Enrolled_Nurse', '2016-04-01', 5), ('Al-Azraq', '2016-12-01', 22), ('4th_South_Carolina_Regiment', '2015-07-01', 42), ('Amanda_Overmyer', '2017-02-01', 356), ('Auto_wrap', '2016-02-01', 8), ('Anonymous_internet_banking', '2015-07-01', 98), ('Curatoria', '2016-11-01', 3), ('A-roll', '2016-05-01', 134), ('Accra_hearts_of_oak_sc', '2017-10-01', 4), ('Apostasy_from_Judaism', '2015-12-01', 45), ('Acantharctia_tenebrosa', '2018-01-01', 3), ('Abigail_Keasey_Frankel', '2017-11-01', 25), ('2008_Paraguayan_general_election', '2016-01-01', 1), ('Adams_motor', '2015-09-01', 37), ('Drummond_Community_High_School', '2017-01-01', 17), ('Andrews_Nakahara', '2017-10-01', 474), ('10th_Maccabiah', '2017-04-01', 30), ('Ackerman,_Rick', '2015-08-01', 4), ('Dumri,_Buxar', '2016-11-01', 35), ('Asking_Jesus_into_your_heart', '2016-09-01', 1), ('Adamowicz_brothers', '2016-12-01', 161), ('Alien_Musibat', '2017-12-01', 2), ('Ahmad_Al_Tayer', '2016-04-01', 39), ('Analytical_phonics', '2016-01-01', 520), ('Do_It_Good', '2016-04-01', 281), ('2004_Kumbakonam_School_fire', '2017-12-01', 2114), ('1977_Chattanooga_Mocs_football_team', '2016-08-01', 3), ('Globe_valves', '2017-01-01', 11), ('Abelmoschus_crinitus', '2016-04-01', 18), ('1874_Yale_Bulldogs_football_team', '2016-02-01', 37), ('Climer', '2017-06-01', 1), ('Auchroisk', '2017-06-01', 37), ('2010_Albirex_Niigata_season', '2016-10-01', 19), ('Adhocracy', '2017-06-01', 2217), ('Chios_Massacre', '2015-07-01', 1110), ('African_Red_Slip', '2017-02-01', 221), ('1976_Portland_Timbers_season', '2016-07-01', 41), ('Alsace-Larraine', '2015-09-01', 2), ('3750_Ilizarov', '2017-07-01', 12), ('Aleksandr_Shkaev', '2017-05-01', 1), ('32_bar_form', '2016-01-01', 12), ('Aequatorium_jamesonii', '2018-03-01', 14), ('Abade_neiva', '2016-09-01', 2), ('Arakvaz', '2016-08-01', 23), ('207_Sqn', '2017-10-01', 2), ('Ducal_hat', '2016-11-01', 10), ('2_Degrees', '2017-03-01', 19), ('Ahmeddiyya_Islam', '2016-03-01', 4), ('Amidi-ye_Kohneh', '2017-11-01', 13), ('Contributions_to_Indian_Sociology', '2016-11-01', 42), ('Clark_Leiblee', '2016-04-01', 5), ('Abraham_of_Strathearn', '2017-09-01', 14); diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet new file mode 100644 index 00000000000..eb83250bfc9 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/html.results b/docs/ja/integrations/data-ingestion/data-formats/assets/html.results new file mode 100644 index 00000000000..fdc03901e52 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/html.results @@ -0,0 +1,14 @@ +

Top 10 IPs

+ + + +${data} +
IPRequests
+ +

Query information

+
+
Rows read
+
${rows_read:Escaped}
+
Time spent
+
${time:Escaped}
+
diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/html.row b/docs/ja/integrations/data-ingestion/data-formats/assets/html.row new file mode 100644 index 00000000000..449fba0b9bc --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/html.row @@ -0,0 +1,4 @@ + + ${ip:Escaped} + ${total:Escaped} + \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json b/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json new file mode 100644 index 00000000000..7bf195ba46c --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json @@ -0,0 +1,29 @@ +[ + { + "page": { + "path": "Akiba_Hebrew_Academy", + "title": "Akiba Hebrew Academy", + "owner_id": 12 + }, + "month": "2017-08-01", + "hits": 241 + }, + { + "page": { + "path": "Aegithina_tiphia", + "title": "Aegithina Tiphia", + "owner_id": 3 + }, + "month": "2018-02-01", + "hits": 34 + }, + { + "page": { + "path": "1971-72_Utah_Stars_season", + "title": "Utah Stars: 71/72 season", + "owner_id": 432 + }, + "month": "2016-10-01", + "hits": 1 + } +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/list.json b/docs/ja/integrations/data-ingestion/data-formats/assets/list.json new file mode 100644 index 00000000000..7c749a3a7b9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/list.json @@ -0,0 +1,17 @@ +[ + { + "path": "Akiba_Hebrew_Academy", + "month": "2017-08-01", + "hits": 241 + }, + { + "path": "Aegithina_tiphia", + "month": "2018-02-01", + "hits": 34 + }, + { + "path": "1971-72_Utah_Stars_season", + "month": "2016-10-01", + "hits": 1 + } +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql new file mode 100644 index 00000000000..527c20d94d0 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql @@ -0,0 +1,51 @@ +-- MySQL dump 10.13 Distrib 8.0.31, for Linux (x86_64) +-- +-- Host: localhost Database: test +-- ------------------------------------------------------ +-- Server version 8.0.31-0ubuntu0.22.04.1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `some_table` +-- + +DROP TABLE IF EXISTS `some_table`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `some_table` ( + `path` varchar(255) DEFAULT NULL, + `month` date DEFAULT NULL, + `hits` int unsigned DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `some_table` +-- + +LOCK TABLES `some_table` WRITE; +/*!40000 ALTER TABLE `some_table` DISABLE KEYS */; +INSERT INTO `some_table` VALUES ('Bangor_City_Forest','2015-07-01',34),('Alireza_Afzal','2017-02-01',24),('Akhaura-Laksam-Chittagong_Line','2015-09-01',30),('1973_National_500','2017-10-01',80),('Attachment','2017-09-01',1356),('Kellett_Strait','2017-01-01',5),('Ajarani_River','2018-01-01',30),('Akbarabad,_Khomeyn','2017-03-01',8),('Adriaan_Theodoor_Peperzak','2018-02-01',88),('Alucita_dryogramma','2015-09-01',1),('Brit_Med_J','2015-07-01',1),('4th_Metro_Manila_Film_Festival','2015-09-01',80),('Alialujah_Choir','2018-03-01',221),('1953-54_SM-sarja_season','2016-09-01',1),('Air_Force_Song','2018-02-01',19),('4-6_duoprism','2016-03-01',30),('Ashley_Spurlin','2017-06-01',94),('Asfaq_Kayani','2017-10-01',1),('1607_in_architecture','2016-06-01',7),('4-way_speakers','2015-10-01',2),('Blue_Heeler','2015-07-01',149),('5_Euro','2017-04-01',16),('2009_Spa-Francorchamps_GP2_Series_round','2016-04-01',12),('2015_Guru_Granth_Sahib_desecration','2015-11-01',6821),('Agriculture_Marketing_Service','2016-07-01',2),('2006_Football_League_Cup_Final','2015-11-01',1711),('2008_Uber_Cup_group_stage','2016-02-01',40),('1923_PGA_Championship','2016-08-01',97),('Fannie_Bay','2016-04-01',6),('AlchemyAPI','2016-04-01',344),('Cinema_of_Italy','2017-01-01',1217),('Arodes','2016-11-01',36),('Damien_Marley','2015-07-01',168),('Al_Jumayl_Baladiyat','2015-08-01',5),('2015_Alabama_State_Hornets_football_team','2017-06-01',32),('Aglossa_tanya','2016-03-01',1),('73rd_Pennsylvania_Infantry','2017-01-01',12),('2015_European_Junior_and_U23_Canoe_Slalom_Championships','2018-02-01',31),('African_Leopard','2016-08-01',64),('Faverolles,_Orne','2017-01-01',5),('Aaron_Fukuhara','2015-11-01',17),('Annular_ligaments_of_trachea','2017-01-01',31),('2014_US_Open_Series','2016-11-01',35),('A_Better_Mousetrap','2018-02-01',4),('Dibaklu','2016-11-01',1),('At_Samat_District','2015-06-01',35),('Aaron_Peasley','2017-05-01',32),('Apistomology','2015-12-01',2),('Buyat_Bay','2015-07-01',54),('1942_Estonian_Football_Championship','2017-05-01',22),('Action_for_Autism','2016-06-01',346),('100_Hz','2015-06-01',72),('2003_Arizona_State_Sun_Devils_football_team','2017-05-01',82),('Antona_obscura','2016-09-01',1),('Akiko_Sugiyama','2015-12-01',32),('Elysburg','2016-11-01',8),('2017_New_South_Wales_Cup','2017-09-01',38),('2011-12_Gold_Coast_United_FC_season','2017-06-01',1),('Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean','2016-04-01',15),('Albert_Dunn','2017-08-01',87),('Hahamakin_ang_Lahat','2017-01-01',984),('2013_Spuyten_Duyvil_derailment','2017-11-01',5),('Ayling','2017-01-01',5),('Anti-Establishment','2016-10-01',1),('1951_Spanish_motorcycle_Grand_Prix','2018-01-01',48),('2009-10_Brunei_Premier_League','2017-08-01',4),('23_Ursae_Majoris','2016-08-01',90),('1927-28_Austrian_football_championship','2017-08-01',4),('Andrew_McKeever','2017-10-01',3),('Clinocottus','2017-06-01',23),('2006_State_of_Origin','2015-11-01',7),('2013-14_Los_Angeles_Clippers_season','2015-07-01',8),('Cor_Jesu','2017-01-01',1),('Besseringen_B-Werk','2017-06-01',158),('Amy_Hempel','2017-07-01',1091),('Franc-Comtois','2016-04-01',2),('Allium_giganteum','2017-07-01',1103),('Abishai','2016-08-01',56),('Abraham_Clark_High_School','2016-04-01',88),('Baku_chronology','2015-06-01',1),('22nd_MEU','2015-10-01',39),('2015_Open_Engie_de_Touraine','2015-10-01',195),('Churchill_Bowl','2017-06-01',30),('AGMARK','2017-08-01',117),('American_standard_wire_gauge','2017-12-01',3),('Araby,_LA','2015-05-01',2),('217_BC','2016-12-01',202),('2008_Trinidad_and_Tobago_League_Cup','2016-02-01',6),('Alazan_Bay','2015-12-01',22),('Aluminum_fencing','2015-11-01',48),('Achilles_tendinitis','2016-10-01',5884),('AFP_Peacekeeping_Operations_Center','2017-01-01',64),('2013_Xinjiang_clashes','2016-01-01',1),('Arborea_Giudicato_of_Arborea','2015-09-01',3),('1941_Cleveland_Rams_season','2017-06-01',40),('Ju_Posht,_Rasht','2017-01-01',3),('Ascalenia','2016-07-01',10),('Aplectoides','2018-02-01',4),('European_Cup_1969-70','2016-11-01',14),('Armen_Mkertchian','2016-05-01',9),('2015_Aspria_Tennis_Cup_-_Singles','2018-02-01',1),('14_August_1947','2017-11-01',6),('Adobe_Creative_Suite_1','2015-05-01',1),('IC_chips','2017-01-01',2),('Austo_AE300','2016-07-01',4),('Date_palms','2015-07-01',79),('BCS_bowl_game','2017-06-01',13),('AR_Border','2017-06-01',1),('Aranda_de_Duero','2016-04-01',256),('1919_Wake_Forest_Demon_Deacons_football_team','2016-01-01',16),('All_The_Wrong_Clues_For_The_Right_Solution','2017-10-01',9),('Allan_Campbell_McLean','2015-06-01',131),('Bradford_Council_election,_2011','2017-06-01',5),('Astronomy_and_astrophysics','2015-09-01',62),('Dutch_Antillean_people','2015-07-01',57),('Army_Radio','2018-03-01',711),('BBVA_Bancomer','2016-11-01',709),('Lake_Aloha','2017-01-01',30),('Andy_Bean','2018-02-01',3092),('1941_Pittsburgh_Steelers_season','2016-05-01',147),('Aniopi_Melidoni','2016-06-01',4),('Aglossosia_fusca','2017-09-01',3),('Art_books','2017-04-01',36),('1929_Washington_Senators_season','2017-04-01',47),('Antaeotricha_congelata','2016-12-01',10),('Douglas_C-54G-5-DO_Skymaster','2017-01-01',1),('Chris_Jamison','2016-11-01',827),('Ace_Blackwell','2015-11-01',9),('Abdul_Qadir_Fitrat','2018-02-01',32),('Arnoldo_Vizcaino','2017-10-01',1),('2012_Open_EuroEnergie_de_Quimper_-_Doubles','2017-12-01',3),('Dale_Rominski','2017-01-01',7),('ADHD_coaching','2015-06-01',50),('Claire_Yiu','2016-11-01',209),('Applicant','2015-10-01',253),('Apache_OpenOffice','2017-06-01',6031),('Abel_Kiprop_Mutai','2015-09-01',22),('Airdrome_Taube','2017-04-01',46),('Andrey_Viktorovich','2016-06-01',1),('American_Idol_controversy','2016-03-01',36),('Anthrenocerus_confertus','2018-01-01',17),('Appraisal_Subcommittee','2018-03-01',17),('Babusa','2015-07-01',3),('500_homeruns','2016-06-01',1),('Argentina_national_volleyball_team','2016-08-01',64),('Chief_prosecutor_of_Russia','2015-07-01',1),('Absolution_DVD','2015-06-01',1),('1,3-Beta-glucan_synthase','2017-05-01',440),('Dave_Sinardet','2016-04-01',26),('Adeline_Whitney','2018-03-01',10),('Allon_shvut','2016-07-01',3),('2012_Penn_State_Nittany_Lions_football_season','2017-12-01',3),('Coleman-Franklin-Cannon_Mill','2017-01-01',4),('Action_director','2015-05-01',93),('AD_547','2016-01-01',1),('Acta_germanica','2017-09-01',1),('Abu_Dhabi_Global_Market_Square','2017-01-01',35),('Kozo_Shioya','2017-01-01',7),('China_Investment_Corp','2017-01-01',2),('Dmitri_Zakharovich_Protopopov','2016-04-01',129),('Anatra_Anadis','2017-10-01',208),('Archaikum','2017-11-01',5),('2000_Webby_Awards','2017-04-01',360),('2003_BCR_Open_Romania_-_Singles','2016-08-01',2),('Abacetus_bisignatus','2016-09-01',79),('American_school_of_kinshasa','2016-01-01',1),('Anna,_7th_Duchess_of_Bedford','2016-08-01',8),('Black_majority_district','2016-11-01',3),('Dagma_Lahlum','2015-07-01',1),('Credit_Saison','2015-07-01',517),('Ariyankuppam_firka','2016-02-01',19),('Annette_Fuentes','2016-06-01',17),('Angerstein,_John','2015-12-01',2),('Annenkov_Island','2016-03-01',280),('Anne_Frank_museum','2016-06-01',67),('Annales_sancti_Amandi','2017-06-01',22),('L-FABP','2017-01-01',1),('Alvord,_TX','2017-06-01',12),('2006_World_Team_Table_Tennis_Championships','2016-05-01',119),('Angriffen','2015-12-01',9),('Anthony_Oppenheimer','2017-03-01',452),('Absamat_Masaliyevich_Masaliyev','2016-09-01',1),('Airborne_Museum_at_Aldershot','2016-03-01',41),('Aktiubinsk_Oblast','2015-08-01',7),('100_East_Wisconsin','2015-05-01',782),('7th_Bangladesh_National_Film_Awards','2017-08-01',91),('Alejandro_Reyes','2017-12-01',35),('Applied_philosophy','2018-03-01',539),('Adhemar_Pimenta','2016-06-01',146),('Break_the_fourth_wall','2016-04-01',66),('Annoushka_Ducas','2017-10-01',411),('ATC_code_J01CA01','2015-06-01',1),('Evelyn_County,_New_South_Wales','2016-11-01',7),('Elastic_scattering','2016-11-01',1374),('1032_Pafuri','2015-07-01',35),('Andrew_Bromwich','2015-08-01',26),('Ishita_Arun','2017-01-01',249),('Aspergics','2016-07-01',1),('1857_in_Chile','2018-03-01',22),('Breffni','2015-07-01',38),('845_in_poetry','2017-08-01',2),('20321_Lightdonovan','2015-10-01',12),('Arthur_Chandler','2017-12-01',27),('CsISOLatin2','2017-06-01',1),('1900_Grand_National','2016-06-01',69),('Aeritalia_AMX','2017-03-01',3),('B_Sharps','2015-06-01',11),('544_area_code','2015-09-01',2),('30th_Guldbagge_Awards','2015-06-01',37),('Agrippina','2017-08-01',315),('Ardmore','2016-02-01',433),('Amplypterus_panopus','2016-03-01',23),('Alexander_Bukharov','2017-09-01',5),('Alaska_Raceway_Park','2017-01-01',46),('Albanian_National_Road_Race_Championships','2017-03-01',31),('1968_Democratic_National_Convention_protest_activity','2017-10-01',2802),('2012_Birthday_Honours','2017-10-01',427),('2000_NHL_expansion_draft','2017-06-01',1),('A_Town_Where_You_Live','2016-11-01',2920),('Ahmed_Shahzad','2018-03-01',25),('Elisabeth_Svendsen','2016-11-01',39),('2002_FINA_Synchronised_Swimming_World_Cup','2016-08-01',30),('Akatek','2017-04-01',10),('Animation_with_DAZ_Studio','2018-02-01',78),('Fergus_Craig','2016-11-01',119),('Ancel_Nalau','2015-11-01',5),('5171_Augustesen','2017-04-01',20),('Anne_McGuire','2017-11-01',329),('Australian_Photoplay_Company','2015-12-01',6),('1913_in_Canada','2017-04-01',137),('Arhopala_allata','2015-05-01',26),('Il_Paradiso_delle_Signore','2017-01-01',31),('Geri_Palast','2017-01-01',38),('Alan_Abela_Wadge','2017-03-01',77),('22nd_Tactical_Air_Support_Squadron','2017-10-01',7),('Avant_Stellar','2017-06-01',22),('Black_phantom_tetra','2016-11-01',205),('Billy_McCaffrey','2017-01-01',314),('Annie_Furuhjelm','2017-11-01',97),('1992_PGA_Tour','2017-12-01',307),('2008_Chilean_pork_crisis','2016-01-01',55),('2012_Currie_Cup_First_Division','2018-02-01',32),('Aleksei_Fomkin','2015-05-01',144),('Alexander_Krausnick-Groh','2016-05-01',101),('Adam_Richard_Wiles','2017-08-01',5),('ATCvet_code_QA01AD01','2015-09-01',2),('Abu_Bakr_Ibn_Bajja','2017-03-01',5),('Architecture-Studio','2016-04-01',94),('950s_BC','2016-02-01',257),('Abschwunges','2017-07-01',1),('Adonis_Geroskipou','2017-06-01',15),('2008-09_SV_Werder_Bremen_season','2016-03-01',3),('Closed_loops','2016-04-01',1),('AFC_Youth_Championship_1982','2015-12-01',10),('Aquila_Shoes','2015-08-01',209),('9842_Funakoshi','2017-12-01',11),('Educational_quotient','2016-04-01',21),('Antoni_Julian_Nowowiejski','2018-01-01',211),('Adi_Oka_Idhile','2017-11-01',16),('DEXIA-BIL_Luxembourg_Open','2016-11-01',3),('Andrew_James_Simpson','2016-03-01',43),('Alexander_Boksenberg','2017-12-01',61),('1827_in_Denmark','2017-03-01',39),('Afternoon_tea_with_suggs','2017-11-01',3),('Alpha,_MN','2017-06-01',6),('Ari_Onasis','2015-06-01',4),('1961-62_Football_League_First_Division','2015-11-01',1),('Andi_Lila','2015-06-01',2847),('A_Gathering_Of_Old_Men','2018-02-01',1),('Abul_Fazl_al-Abbas','2017-01-01',1),('Asgill,_Charles','2017-08-01',1),('Alexander_Arkhangelsky','2015-07-01',12),('1947-48_Portuguese_Liga','2015-06-01',1),('3rd_MMC_-_Varna','2016-07-01',3),('Alberts,_Wayne','2017-05-01',3),('Alois_Schickelgruber','2018-02-01',9),('Hefner_Stadium','2017-01-01',2),('410912_Lisakaroline','2018-02-01',26),('Academy_at_Mountain_State','2018-03-01',1),('617_Squadron','2016-05-01',489),('Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji','2015-07-01',5),('Arturo_Merino_Benitez_Airport','2017-10-01',13),('AEK_Athens_Futsal','2015-06-01',10),('Aggaeus','2018-02-01',2),('Association_for_Retarded_Citizens_of_the_United_States','2017-08-01',3),('Kielce_pogrom','2017-01-01',335),('1351_in_poetry','2016-01-01',17),('1923_Princeton_Tigers_football_team','2017-11-01',41),('Auzata_semipavonaria','2017-01-01',2),('892_in_poetry','2016-01-01',6),('Anton_Krotiak','2017-12-01',2),('Arthur_Shelley','2017-12-01',23),('2003_Kyoto_Purple_Sanga_season','2018-02-01',9),('Frederic_Bowker_Terrington_Carter','2016-04-01',6),('2-orthoplex','2016-03-01',1),('Acacia_australiana','2015-09-01',4),('2012_Newcastle_Knights_season','2016-06-01',103),('Ann_Wrights_Corner,_Virginia','2017-07-01',19),('12557_Caracol','2017-03-01',5),('2001_African_Footballer_of_the_Year','2017-05-01',1),('Bass_Pyramid','2017-01-01',22),('A_noodle','2015-05-01',5),('Aed_Bennan','2018-02-01',2),('1886_Yale_Bulldogs_football_team','2017-10-01',58),('2002_Players_Championship','2016-06-01',54),('African_Skimmer','2017-07-01',2),('3rd_Guldbagge_Awards','2016-12-01',39),('Arrows_A19B','2015-10-01',1),('Archduchess_Elisabetta_of_Austria-Este','2017-08-01',1526),('America_Islands','2015-11-01',1),('1932_Olympic_Games','2016-01-01',9),('2011_Chinese_pro-democracy_protests','2015-11-01',2044),('Bank_walkaway','2016-04-01',113),('594_in_Ireland','2017-04-01',1),('Association_of_Municipal_Corporations','2016-12-01',5),('Andreas_Brantelid','2015-09-01',167),('Amarthal_urf_Unchagaon','2017-05-01',82),('3-methoxymorphinan','2017-04-01',146),('2382_BC','2016-07-01',10),('1763_in_science','2016-07-01',28),('Arvert','2017-04-01',77),('Ale_yeast','2017-12-01',19),('A_Man_Without_a_Soul','2018-03-01',17),('Air_Force_Base_Louis_Trichardt','2017-09-01',1),('Athirson_Mazzoli_de_Oliveira','2017-06-01',3),('Anthony_Chan_Yau','2017-07-01',181),('Basic_Enlisted_Submarine_School','2017-06-01',392),('Aboriginal_Lands_of_Hawaiian_Ancestry','2015-09-01',11),('Fondren_Southwest,_Houston','2017-01-01',4),('3_World_Financial_Center','2017-07-01',64),('1971_IIHF_European_U19_Championship','2017-09-01',9),('1937-38_Allsvenskan','2015-12-01',6),('Christopher_Ashton_Kutcher','2017-06-01',2),('Australian_rules_football_in_south_australia','2016-12-01',1),('Amicable_pair','2018-01-01',7),('Alan_Tomes','2015-11-01',82),('Alexei_Petrovich,_Tsarevich_of_Russia','2015-12-01',3887),('Alexis_Damour','2015-10-01',66),('Bankruptcy_Act_of_1938','2017-06-01',76),('Amphiphyllum','2016-06-01',14),('Conway_High_School_West','2016-04-01',1),('5447_Lallement','2015-11-01',10),('Gabriel_Iddan','2017-01-01',1),('1879-80_Scottish_Cup','2017-04-01',3),('2011_Eneco_Tour','2016-10-01',31),('1471_in_England','2015-11-01',94),('Ashland_Town_Hall','2017-01-01',5),('Archduke_John','2015-05-01',20),('2000_Cameroonian_Premier_League','2017-09-01',18),('1997_flood','2017-11-01',5),('Agile_management','2015-09-01',26677),('Am_841','2017-12-01',3),('Apprentice_Mason','2018-01-01',4),('Hales-Jewett_theorem','2017-01-01',2),('Alien_Abductions','2017-10-01',14),('Arjun_Menon','2016-02-01',370),('Anthokyan','2016-01-01',4),('Automobili_Lamborghini','2016-02-01',1110),('Alain_Prost','2017-04-01',25196),('Fartein_Valen','2016-04-01',90),('Antonio_Galli_da_Bibiena','2016-05-01',5),('Al_Jawf,_Libya','2017-03-01',600),('AD_695','2018-02-01',1),('Amir_chand','2015-11-01',1),('Alcis_obliquisigna','2017-08-01',1),('Chandra_Talpade_Mohanty','2017-01-01',306),('Algerian_safe_house,_Jalalabad','2015-06-01',3),('Jake_Milner','2017-01-01',1),('Alternate_Communications_Center','2017-10-01',1),('In_the_Bleachers','2017-01-01',42),('Alex_Puodziukas','2016-04-01',7),('Altarpiece_of_Pilgrim_II','2018-02-01',2),('Cybernetical_Physics','2017-01-01',3),('Christopher_Unthank','2017-06-01',2),('1982_Independence_Bowl','2015-06-01',102),('Ascoli_Calcio_1898','2018-03-01',1115),('Briggs-Rauscher_reactions','2017-06-01',1),('Adjadja','2018-02-01',45),('Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed','2016-06-01',3),('Catholic_social_doctrine','2017-01-01',6),('2833_BC','2016-11-01',1),('Bethy_Woodward','2016-04-01',38),('Bateman_polynomials','2017-06-01',22),('1966_Buenos_Aires_Grand_Prix','2015-10-01',19),('A_River_Somewhere','2015-10-01',353),('2016-17_BVIFA_National_Football_League','2017-04-01',2),('1909_Major_League_Baseball_season','2015-10-01',362),('1988_Oklahoma_Sooners_football','2017-11-01',2),('2010s_in_Chechen_fashion','2016-10-01',1),('Accademia_Olimpica','2017-08-01',17),('Air_cooling','2015-07-01',2010),('Amir_Saoud','2016-11-01',22),('Alex_Auburn','2015-05-01',52),('Apamea_impulsa','2016-11-01',6),('Australian_federal_election,_2007','2015-07-01',1794),('Ain_Sakhri','2017-10-01',76),('Belosaepiidae','2015-07-01',68),('Acts_of_Parliament_in_the_United_Kingdom','2017-10-01',4070),('Equity_Office','2016-11-01',202),('David_Bintley','2017-01-01',51),('Aksel_Schiotz','2018-03-01',3),('Appropriation_Act_2000','2017-05-01',12),('Edward_Johnson_III','2016-11-01',491),('2006_Ohio_State_Buckeyes_football_team','2016-03-01',1452),('Battle_of_Fort_Beausejour','2015-07-01',97),('Abel_Foullon','2015-12-01',82),('Apollo_VIII','2015-10-01',19),('Carry_on_up_the_jungle','2015-07-01',8),('Armour_villa','2017-05-01',4),('201_Poplar','2015-08-01',265),('Arta_prefecture','2016-08-01',1),('2015-16_Ekstraklasa','2018-02-01',13),('Alport,_Ontario','2018-02-01',2),('Bongoland','2017-06-01',62),('Alfred_Charles_Post','2016-11-01',11),('Aam_Aadmi_Party_crisis','2016-10-01',1),('Andrea_Moda','2015-07-01',143),('Abdul_Halim_Sharar','2017-08-01',545),('Apostolic_Vicariate_of_Yunnan','2016-12-01',1),('Catherine_Steadman','2016-11-01',5218),('Agastachys_odorata','2015-10-01',38),('9783_Tensho-kan','2016-03-01',2),('AFL_Cairns','2017-10-01',337),('Abomey','2015-06-01',1062),('Anne_Crofton,_1st_Baroness_Crofton','2015-12-01',42),('Cash-flow_return_on_investment','2017-01-01',137),('Alberto_Arvelo_Torrealba_Municipality','2015-08-01',56),('Abyssinian_Shorthorned_Zebu','2017-09-01',124),('Albanian_hip_hop','2016-01-01',1812),('Alphonso_IV_of_Portugal','2016-02-01',12),('19th_The_Alberta_Mounted_Rifles','2016-10-01',1),('Chinese_shadow_theatre','2016-04-01',1),('American_Committee_of_the_Fourth_International','2017-08-01',4),('2014_Bahrain_GP2_Series_round','2016-03-01',80),('Alexandrian_orthodox','2017-09-01',2),('2010_Hurricane_Season','2015-05-01',18),('1938_All-Ireland_Senior_Camogie_Championship_Final','2017-01-01',1),('ATC_code_D01','2018-01-01',203),('Albedo','2015-08-01',23484),('Chavigny,_Meurthe-et-Moselle','2017-01-01',12),('Becky_Essex','2015-07-01',51),('Archaeological_Museum_Padre_Le_Paige','2018-02-01',2),('Abu_Bakar_Sillah','2017-01-01',5),('Back_chat','2017-01-01',2),('Anchylobela_dyseimata','2015-12-01',11),('Anthony_Overton','2017-03-01',261),('Bear_maul','2016-04-01',3),('Ambarawa,_Central_Java','2016-01-01',1),('Amber_lager','2016-11-01',87),('2nd_LAAD','2017-09-01',8),('Ashiya,_Hyogo','2018-03-01',24),('Angels_at_Risk','2018-02-01',74),('Audrey_Marie_Munson','2016-03-01',17),('1984_Australian_Football_Championships','2017-01-01',27),('Ammonia_fountain','2016-06-01',434),('Allister_Bentley','2018-03-01',11),('Alsager_Hay_Hill','2016-10-01',72),('1753_English_cricket_season','2015-05-01',51),('2009-10_New_Jersey_Devils_season','2016-10-01',1),('An_Untamed_State','2016-05-01',1109),('Beatrice_Carmichael','2016-11-01',5),('Abdul_Ghani_Ahmad','2017-12-01',115),('Arteria_suralis','2017-02-01',3),('Berzasca_River','2017-01-01',1),('Angel_Attack','2015-09-01',98),('1969_San_Francisco_49ers_football_team','2017-11-01',1),('Anthony_Beilenson','2017-09-01',114),('Crystalline_Entity','2016-04-01',180),('Granice','2017-01-01',2),('203rd_General_Hospital','2017-07-01',44),('Acrocercops_rhombiferellum','2017-12-01',20),('Ampliglossum_blanchetii','2017-05-01',1),('11553_Scheria','2017-03-01',2),('Ashkenozi','2017-02-01',1),('2010_Calder_Cup_Playoffs','2018-01-01',9),('Alice_Caymmi','2016-01-01',121),('Alfredo_Alvar','2017-04-01',44),('2006_Legends_Tour','2017-07-01',30),('Albano_Albanese','2015-10-01',53),('1943_Frankford_Junction_train_wreck','2016-08-01',510),('Evans_Court_Apartment_Building','2016-04-01',4),('Abu_al-Rayhan_Muhammad_ibn_al-Biruni','2017-11-01',1),('Abubakar_Muhammad_Rimi','2015-05-01',4),('Dostpur','2016-11-01',26),('Accessories_Council_Excellence_Awards','2016-03-01',14),('2006_North_American_heat_wave','2015-06-01',1161),('Amstelodamum','2017-09-01',12),('A_Very_Peculiar_Practice','2016-08-01',1860),('Allegorie_der_Liebe','2015-09-01',1),('Alex_Mackie','2017-02-01',95),('1812_Homestead_Farm_and_Museum','2017-09-01',29),('Argus_distribution','2016-03-01',8),('Anthony_Thomas_Stover','2017-02-01',1),('Arthur_Shallcross','2016-11-01',20),('Antoine_Francois_Fourcroy','2018-01-01',1),('Abbas_Halim','2016-11-01',21),('Akiva_Baer_ben_Joseph','2017-08-01',1),('Balatonfuered','2016-11-01',3),('Antemnae','2017-11-01',204),('Cling_Cling','2017-06-01',93),('B_flat_major','2017-01-01',28),('AirExplore','2017-12-01',930),('Auckland_Super_Sprint','2015-11-01',120),('Alfredo_De_Gasperis','2017-12-01',793),('Geoffrey_I_of_Vianden','2017-01-01',5),('Copa_de_Zaachila','2016-04-01',6),('Alboacen','2017-09-01',1),('BNH_Hospital_Bangkok','2017-06-01',2),('Agricultural_health_and_safety','2016-09-01',1),('Chiasms','2017-06-01',2),('Al_Karaana','2016-05-01',58),('Alberta_Highway_872','2016-11-01',1),('Among_the_mourners','2016-03-01',1),('Achema_Power_Plant','2015-06-01',55),('ATSE_Graz','2017-10-01',65),('Arthroscopy','2017-02-01',11721),('2010-2012_European_Nations_Cup_Second_Division','2018-01-01',7),('1967_Cincinnati_Reds','2015-08-01',4),('24th_Golden_Disc_Awards','2017-05-01',71),('Johnny_Floyd','2017-01-01',17),('Arthur_Rupin','2016-02-01',5),('Alpine_skiing_at_the_2011_Canada_Winter_Games','2015-09-01',38),('College_Press_Service','2017-01-01',8),('American_Psycho','2015-08-01',55567),('CBC_Winnipeg','2017-06-01',17),('Burning_the_process','2016-04-01',1),('2011_Stanley_Cup_playoffs','2017-01-01',1036),('Andrew_Mumford','2017-01-01',6),('1925_in_fine_arts_of_the_Soviet_Union','2018-02-01',28),('Aragvi_river','2017-02-01',2),('Andrew_Adamson','2018-03-01',16269),('Arcides_fulvohirta','2016-10-01',1),('Araya_Selassie_Yohannes','2015-11-01',423),('Apartment_house','2016-09-01',85),('Advanced_Art','2015-12-01',171),('1028_Lydina','2015-06-01',53),('2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti','2017-04-01',2),('Adolph_Weiss','2015-06-01',98),('Adam_Jerzy_Czartoryski','2015-09-01',1237),('1980_United_States_presidential_election','2017-05-01',56),('1956_Oscars','2016-08-01',10),('Burundian_Senate_election,_2005','2016-04-01',1),('Amarolea_floridana','2015-07-01',3),('August_Bier','2015-12-01',514),('Arbelodes_sebelensis','2018-03-01',6),('Abiah_Brown','2018-02-01',1),('A_Maceo_Smith_High_School','2016-10-01',2),('1488_in_architecture','2017-12-01',6),('2009_AMP_Energy_500','2016-04-01',45),('1921_Baylor_Bears_football_team','2017-03-01',21),('Dmitry_Akhba','2015-07-01',43),('2004_Big_12_Conference_Baseball_Tournament','2016-07-01',37),('Abdisalam_Omer','2018-02-01',116),('Alma,_son_of_Alma','2015-08-01',53),('An_Phoblacht','2016-10-01',962),('2009_Turner_Prize','2016-01-01',75),('Jack_Zajac','2017-01-01',24),('1906_Wimbledon_Championships','2016-04-01',22),('Chuckwalla_Valley','2017-06-01',22),('Alien_Quadrology','2016-02-01',1),('Chalcidoptera_contraria','2016-04-01',1),('Alaska_Republican_Gubernatorial_Primary_Election,_2006','2016-02-01',1),('333639_Yaima','2018-02-01',7),('Aquila_hastata','2015-11-01',28),('Al-Fua','2017-07-01',1),('Anihilation','2015-07-01',28),('International_Toy_Fair','2017-01-01',1),('38th_Regiment_Indiana_Infantry','2017-01-01',10),('Andrea_Stella','2017-07-01',75),('Anselmo_de_Moraes','2015-09-01',562),('Applemore','2016-05-01',3),('Akpinar,_Kirsehir','2015-06-01',3),('Ant_nest','2016-05-01',53),('Catherine_of_Siena','2016-11-01',8806),('Barbos','2015-06-01',12),('Amlaib_mac_Iduilb','2017-08-01',2),('Alice_Janowski','2018-03-01',17),('Acacia_leptocarpa','2017-03-01',48),('Al-Hadi_Yahya','2016-01-01',39),('2015_British_Figure_Skating_Championships','2017-07-01',38),('Avenues_Television','2016-03-01',214),('Dendropsophus_sartori','2015-07-01',11),('1952_in_Germany','2015-05-01',63),('Armuchee_High_School','2016-04-01',27),('April_1_RFC','2017-11-01',2),('Caroline_Bliss','2016-11-01',972),('66th_Rice_Bowl','2016-06-01',17),('Alec_Smight','2017-02-01',173),('Alexei_Panin','2017-09-01',3),('Codeword','2016-04-01',84),('Dormice','2015-07-01',63),('2105_BC','2017-11-01',6),('5th_National_Congress_of_Kuomintang','2016-06-01',5),('Caminho_das_Indias','2017-01-01',5),('Agerbo','2017-11-01',2),('Abe_Anellis','2018-01-01',86),('Aceh_Medal','2015-07-01',33),('Alltech_Arena','2016-10-01',144),('Aly_Oury','2016-06-01',260),('757th_Troop_Carrier_Squadron','2017-07-01',2),('Alec_Peters','2017-12-01',2731),('Agua_Buena_Airport','2017-09-01',12),('Alessandro_Livi','2016-08-01',104),('Andkaer','2017-04-01',3),('Cateran','2017-06-01',135),('57th_Venice_International_Film_Festival','2017-04-01',180),('Brijal_Patel','2017-06-01',98),('Cnemaspis_jerdonii','2015-07-01',6),('Aluminum_sodium_salt','2016-10-01',3),('Arnaldo_Antonio_Sanabria_Ayala','2017-09-01',4),('Angels_of_Iron','2018-02-01',83),('Bugs_Bunny_Rabbit_Rampage','2017-06-01',422),('Admiralty_Class_Destroyer','2017-10-01',2),('Atlas_Media','2017-05-01',2),('Arcesilaus_i_of_cyrene','2017-03-01',1),('2011_Tajikistan_national_football_team_results','2017-04-01',13),('Artur_Shakhnazarov','2017-12-01',22),('747_Express_Bus','2018-03-01',20),('101-in-1_Party_Megamix','2017-10-01',188),('Fastpoint_Games','2016-11-01',32),('Analog_Anthology_1','2017-07-01',1),('Archival_bond','2015-09-01',119),('1985_Air_Force_Falcons_football','2017-09-01',4),('American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem','2017-06-01',3),('Adaptive_Evolution_in_the_Human_Genome','2017-08-01',2),('Arthur_Strangways','2015-11-01',5),('1583_in_poetry','2015-09-01',68),('Andrew_igoudala','2015-06-01',2),('Euonychophora','2016-11-01',37),('Catechizing','2016-04-01',4),('1960-61_ice_hockey_Bundesliga_season','2018-03-01',3),('Buk_Vlaka','2017-06-01',10),('Arbor_Day','2018-03-01',16265),('Guan_Sheng','2017-01-01',73),('2014_Barcelona_Open_Banc_Sabadell','2016-08-01',57),('1976-77_Nationalliga_A','2016-04-01',1),('AFL_records','2015-11-01',16),('2005_Tour_Down_Under','2016-10-01',26),('92_BCE','2015-08-01',4),('Bento_Box_Animation','2017-01-01',1),('Alabama_Territory','2018-03-01',1195),('Abdul-Wasa_Al-Saqqaf','2016-07-01',21),('Archbishops_of_Semarang','2017-01-01',6),('Ambivina','2017-10-01',13),('Aghjaghala_Ulia','2017-08-01',2),('Blechnum_novae-zelandiae','2016-11-01',26),('Dictyosome','2016-04-01',19),('Arts_Council_of_Great_Britain','2016-12-01',785),('LBC_Radio','2017-01-01',3),('Ageo,_Saitama','2016-06-01',396),('Babla_Mehta','2016-12-01',674),('2012-13_Russian_Cup','2018-01-01',10),('Chandragupt','2017-06-01',6),('407th_Air_Refueling_Squadron','2016-01-01',96),('Aftermarket','2016-07-01',1253),('A_Portrait_of_New_Orleans','2016-08-01',18),('2000-01_Yemeni_League','2017-03-01',1),('Actinidia_chinensis','2015-11-01',907),('Amsterdam_Tournament_1999','2018-03-01',1),('Arthur_Iberall','2017-02-01',112),('Auricula_Meretricula','2016-02-01',103),('Archbishop_of_Lahore','2016-09-01',8),('Chippewa_Indians_of_Montana','2016-04-01',9),('Abidjan-Niger_Railway','2018-01-01',22),('29th_Annual_Grammy_Awards','2017-05-01',1087),('Ateles_geoffroyi_frontatus','2017-06-01',3),('Enrico_Cernuschi','2016-11-01',3),('A4183_road','2017-02-01',8),('Ahrayut','2016-10-01',75),('Alison_Castle','2016-03-01',55),('Automobile_aftermarket','2016-10-01',5),('2008_GAINSCO_Auto_Insurance_Indy_300','2016-07-01',51),('1937_Scottish_Cup_Final','2017-04-01',126),('2005_Clipsal_500_Adelaide','2018-02-01',22),('Farid_Farjad','2016-04-01',120),('13_Tribes_of_Long_Island','2015-12-01',11),('Afroneta_bamilekei','2017-01-01',2),('Frederick_Stuart_Greene','2017-01-01',1),('Andre_Braugher','2017-04-01',37655),('1906_International_Lawn_Tennis_Challenge','2017-10-01',73),('2009-10_NFL_Playoffs','2016-01-01',69),('Cricket_Wellington','2016-11-01',2),('Craig_Blazer','2015-07-01',21),('Aeolidiella_orientalis','2017-05-01',3),('Andre_Prokovsky','2017-06-01',4),('Angela_McKee','2017-11-01',14),('Airbase_Golubovci','2016-10-01',1),('2011_ISAF_Sailing_World_Championships','2017-05-01',89),('Bartica_Airport','2017-06-01',27),('Agusan_Dam','2016-09-01',454),('Bosque_Real_Country_Club','2015-07-01',42),('Georges_Duhamel','2017-01-01',122),('Allrounder','2017-03-01',63),('2017_Missouri_State_Bears_football_team','2017-09-01',868),('Allons_a_Lafayette','2017-11-01',17),('Agathla','2015-05-01',105),('1086_in_poetry','2015-09-01',25),('Absolute_extreme','2017-09-01',1),('Agathe_Bonitzer','2017-12-01',229),('Chinese_Red_Pine','2017-06-01',18),('Angular_dispersion','2016-02-01',11),('Jean-Sebastian_Giguere','2017-01-01',2),('Actinium-235','2018-03-01',4),('Ago,_filo_e_nodo','2017-02-01',11),('Aranea_cruentata','2016-03-01',1),('2009_Korea_National_League','2017-11-01',19),('Americom-8','2016-08-01',28),('2006_Junee_Bushfire','2018-03-01',81),('2013_Major_League_Baseball_Home_Run_Derby','2017-09-01',182),('1928_US_Presidential_Election','2016-12-01',42),('After-eighty_generation','2016-02-01',127),('1932_Hawthorn_Football_Club_season','2017-07-01',16),('Amelia_Elizabeth_Mary_Rygate','2017-05-01',2),('Aline_Khalaf','2017-12-01',465),('Akron_Junction,_New_York','2017-07-01',56),('Apollo_moon_landing_conspiracy_theories','2015-09-01',4),('1978_National_League_Championship_Series','2017-03-01',325),('1959-60_German_football_championship','2017-08-01',5),('Almost_a_Bride','2017-01-01',1),('Andrew_Lysaght,_junior','2015-10-01',20),('1902_Otani_expedition','2018-02-01',1),('1892_Currie_Cup','2016-09-01',53),('1988_USC_Trojans_football_team','2016-10-01',494),('1944_in_Northern_Ireland','2016-12-01',46),('Alfred_Acherman','2017-07-01',1),('Arcadia,_Nebraska','2017-02-01',148),('4_x_400_metre_relay','2018-03-01',1),('A4030_road','2016-07-01',1),('Chi-li','2016-11-01',3),('Aircraft_fairing','2016-11-01',1861),('Buddhism_in_Belize','2015-07-01',40),('Alameda_County_Open','2017-02-01',33),('Area_of_countries_and_regions_of_the_United_Kingdom','2017-10-01',6),('2014_Weber_State_Wildcats_football_team','2016-10-01',47),('American_Journal_of_Comparative_Law','2016-04-01',62),('A_Teaspoon_Every_Four_Hours','2017-03-01',47),('Astasis','2016-03-01',1195),('Akhrakouaeronon','2015-11-01',62),('Annenkrone','2016-03-01',40),('Ballotine','2016-12-01',4753),('2000_Kipawa_earthquake','2015-11-01',139),('Archdiocese_of_cashel_and_emly','2017-01-01',1),('Chevrolet_SS396','2017-01-01',1),('Achyroseris','2016-03-01',1),('Daniel_Pulteney','2016-11-01',29),('2006_Major_League_Baseball_draft','2017-07-01',10637),('Adetunji_Idowu_Olurin','2016-01-01',37),('Ardatov,_Nizhny_Novgorod_Oblast','2017-04-01',18),('Andrew_Hilditch','2015-08-01',398),('A_Very_Merry_Daughter_Of_the_Bride','2017-04-01',67),('1993_in_radio','2017-08-01',85),('Deltan','2016-11-01',91),('Adnan_Custovic','2017-12-01',26),('Di_Gennaro','2017-01-01',4),('237_AD','2017-11-01',1),('Aaron_Gombar','2018-03-01',2),('Acrolophus','2017-04-01',47),('Alfred_Bergman','2017-06-01',27),('Charles_Bebb','2017-06-01',39),('Dirico','2017-01-01',24),('1982_Major_League_Baseball_Draft','2016-12-01',90),('DDT_wrestling','2016-11-01',4),('1988-89_Houston_Rockets_season','2016-02-01',10),('Acacia_loderi','2015-11-01',35),('2015_Deauville_American_Film_Festival','2016-10-01',126),('Andropadus_importunus','2016-02-01',9),('Antonio_Bacchetti','2017-04-01',52),('Ann_Trindade','2015-09-01',49),('5_x_Monk_5_x_Lacy','2016-05-01',37),('Barlochan,_Ontario','2017-06-01',2),('Achaian','2017-03-01',35),('Flow_rider','2017-01-01',1),('Antiblemma_discerpta','2018-02-01',1),('1997_Illinois_Fighting_Illini_football_team','2017-11-01',331),('Ahrntal','2016-03-01',540),('Apollo_Conference','2015-10-01',329),('Algenib_in_Perseus','2016-01-01',1),('Craig_Norgate','2016-04-01',42),('Antwerp_Zoo','2015-12-01',879),('Cold_Contagious','2017-06-01',161),('Bolito','2016-11-01',181),('Chinese_bridges','2016-11-01',1),('14th_Indiana_Infantry_Regiment','2017-04-01',115),('Bindunuwewa_massacre','2015-07-01',52),('Eastshore_Highway','2016-11-01',2),('Daemonologie','2017-01-01',1655),('Aero_Pacifico','2015-07-01',1),('Blue_Ribbon_Schools_Program','2017-06-01',557),('Ash_Township,_MI','2018-02-01',3),('Al-Hatab_Square','2018-02-01',450),('Alje_Vennema','2018-02-01',187),('1920_All-Ireland_Senior_Football_Championship_Final','2016-05-01',40),('Criss_Oliva','2016-11-01',801),('Bethlehem,_Ohio','2017-01-01',16),('1976_WHA_Amateur_Draft','2015-08-01',47),('Angela_Fimmano','2017-06-01',17),('Alexander_Bonini_of_Alexandria','2017-09-01',1),('Anarchist_faq','2015-05-01',13),('Aleksander_Benedykt_Sobieski','2016-05-01',240),('Cape_Florida_Lighthouse','2016-04-01',6),('Fernando_VI_of_Spain','2017-01-01',3),('Crossing_number','2017-06-01',29),('1984_NSL_Cup','2017-05-01',26),('Barbara_Weldon','2015-06-01',29),('Andreas_Olsen','2017-01-01',32),('Battle_of_Baima','2016-04-01',2),('Amory_Hansen','2016-05-01',26),('Akhmimic','2015-11-01',41),('Al_Awda','2018-02-01',18),('Adelheid-Marie_of_Anhalt-Dessau','2016-07-01',70),('Americans_for_Technology_Leadership','2015-10-01',90),('Belizean_diplomatic_missions','2017-06-01',3),('African_communist','2016-05-01',3),('Andosol','2016-09-01',246),('Alan_Attraction','2016-05-01',15),('A_Yank_in_Rome','2015-12-01',70),('2004_in_the_United_Arab_Emirates','2018-02-01',33),('Additionality','2017-06-01',371),('Assassination_of_Trotsky','2015-06-01',47),('Alice_Sotero','2018-02-01',27),('Agyneta_platnicki','2016-04-01',4),('Alexandra_Vasilyevna_Velyaminova','2015-07-01',30),('1881_in_Chile','2016-06-01',16),('Arterial_ischemic_stroke','2018-01-01',57),('Astro_Glacier','2015-09-01',27),('Chester_Earl_Merrow','2017-06-01',58),('Alejandro_de_la_Madrid','2015-11-01',1630),('70936_Kamen','2017-08-01',1),('AK_Steel_Holding_Corp','2015-08-01',8),('1124_Stroobantia','2017-10-01',23),('Asian_Wedding','2016-10-01',15),('23837_Matthewnanni','2015-10-01',18),('Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden','2017-03-01',4893),('Betsy_Hodges','2016-04-01',560),('Arthur_and_the_Invisibles','2015-08-01',14924),('Arkansas-Ole_Miss_football_rivalry','2015-05-01',7),('Asia_Cup','2015-09-01',5938),('Arginine_racemase','2016-12-01',15),('585th_Field_Company,_Royal_Engineers','2018-03-01',1),('1975_Stagg_Bowl','2017-08-01',6),('Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath','2017-01-01',1),('Askajian','2016-02-01',26),('2006_Nebraska_Cornhuskers_football_team','2015-08-01',975),('Cicero_Francis_Lowe_House','2015-07-01',10),('Conan_IV,_Duke_of_Brittany','2016-11-01',252),('2005_World_Modern_Pentathlon_Championships','2016-07-01',38),('1946_Aleutian_Islands_earthquake','2017-03-01',2019),('ANKRD17','2017-09-01',19),('1970_Maryland_Terrapins_football_team','2017-11-01',42),('Ali_Dehkhoda','2017-04-01',1),('1244_in_art','2015-07-01',22),('1520s_in_Denmark','2016-01-01',20),('Abdoulaye_Gaye','2017-12-01',10),('An_Angel_Has_Arrived','2016-03-01',36),('1453_BC','2015-08-01',26),('2017_National_Games_of_China','2017-05-01',1293),('A_Night_in_Sickbay','2016-05-01',251),('Dateline_Diamonds','2017-01-01',53),('419_guestbook_spamming','2016-02-01',5),('Familiar_bluet','2017-01-01',4),('Abu_Bakr_Mirza','2017-10-01',86),('7272_Darbydyar','2017-11-01',4),('Ages_of_consent_in_Latin_America','2017-03-01',961),('1982_Japan_Soccer_League_Cup','2016-04-01',14),('2810_BC','2015-07-01',9),('Druga_Liga_Republike_Srpske','2017-01-01',1),('1998_Swedish_Rally','2017-09-01',34),('1567_in_Norway','2015-10-01',89),('126_Army_Engineer_Regiment,_Royal_Engineers','2016-03-01',5),('2017_American_League_Wild_Card_Game','2017-10-01',25120),('August_Follen','2017-01-01',2),('Ala_Gertner','2015-11-01',876),('Glenwood,_Harford_County,_Maryland','2017-01-01',3),('Applied_ecology','2017-12-01',730),('Ariarathes_V_Eusebes_Philopator','2018-03-01',5),('2006_AFC_Champions_League','2017-09-01',947),('60_minutes_2','2016-10-01',2),('Embryonic_shield','2017-01-01',2),('2001_Meath_Intermediate_Football_Championship','2015-11-01',8),('Apparition_of_Christ_to_Madonna','2017-06-01',5),('Hoosier_Road_Elementary','2017-01-01',1),('Arua_Uda','2016-12-01',29),('Array_comprehension','2015-11-01',8),('Baszki','2015-06-01',36),('Akron_Neighborhoods','2016-01-01',4),('Catholic_Church_in_Costa_Rica','2017-06-01',85),('Canada-Sweden_relations','2015-07-01',1),('Barza_Radio_Community','2016-11-01',6),('Dalhousie_Middle_School','2016-11-01',5),('Alliphis_bakeri','2017-11-01',2),('Bartica_massacre','2017-06-01',53),('30th_January','2015-11-01',10),('1920_revolution','2017-05-01',5),('Amyraldism','2017-08-01',828),('AA_Jefferson_District','2016-05-01',45),('Eunebristis_cinclidias','2017-01-01',1),('A_Scott_Connelly','2017-06-01',5),('Antony_Durose','2016-07-01',19),('Arval_Brethren','2017-11-01',579),('Anthidium_dissectum','2017-05-01',2),('Aru,_Democratic_Republic_of_the_Congo','2017-04-01',81),('1956-57_West_Indian_cricket_season','2017-04-01',2),('2014_Moscow_Film_Festival','2017-08-01',2),('Anna_Gurji','2017-06-01',27),('Allen_Memorial_Medical_Library','2016-07-01',120),('Anton_Sistermans','2017-02-01',36),('Clotheshorses','2017-06-01',1),('36_Stratagems','2017-08-01',25),('Attack_of_the_crab_monsters','2016-10-01',16),('30_rock_awards','2015-09-01',2),('Aeroflot,_Uralsk_Civil_Aviation_Directorate','2017-08-01',2),('Amblyseius_parabufortus','2017-06-01',3),('Indian_coral_tree','2017-01-01',3),('3285_Ruth_Wolfe','2016-02-01',9),('Anderson_da_Silva_Gibin','2016-08-01',73),('5001st_Composite_Group','2017-03-01',4),('Danzik','2016-04-01',8),('4810_Ruslanova','2016-03-01',2),('Arkendale,_Virginia','2016-04-01',14),('Al_Francis_Bichara','2016-09-01',239),('Cayena','2017-01-01',1),('A_Glass_of_Darkness','2017-04-01',95),('GMC_CCKW','2017-01-01',887),('Alabama_State_Route_107','2015-11-01',13),('2011_in_motorsport','2017-12-01',26),('Adecco_General_Staffing,_New_Zealand','2017-12-01',86),('Anbargah','2015-10-01',6),('1995_Asian_Cup_Winners_Cup','2016-06-01',7),('1986_Wales_rugby_union_tour_of_the_South_Pacific','2016-12-01',30),('Adya_Goud_Brahmin','2017-03-01',2),('Akcakiraz','2015-08-01',5),('24249_Bobbiolson','2017-12-01',4),('Ahmanson_Theatre','2016-02-01',801),('Abdullah_ibn_Jahsh','2016-10-01',196),('1937_in_Chile','2015-08-01',24),('2000_in_England','2016-01-01',57),('A_Deepness_In_The_Sky','2017-08-01',2),('Area_code_678','2015-07-01',480),('Avalon_Hill','2017-01-01',880),('Anna,_Duchess_of_Prussia','2015-12-01',315),('Alexandr_Syman','2017-04-01',24),('7400_series_logic','2017-11-01',2),('Greenleaf_Township,_Minnesota','2017-01-01',1),('Acetylsal','2017-04-01',6),('Earth_and_Man_National_Museum','2016-11-01',43),('Affetside','2015-10-01',185),('1971_CFL_season','2015-08-01',202),('Beth_Bader','2016-11-01',21),('Enrolled_Nurse','2016-04-01',5),('Al-Azraq','2016-12-01',22),('4th_South_Carolina_Regiment','2015-07-01',42),('Amanda_Overmyer','2017-02-01',356),('Auto_wrap','2016-02-01',8),('Anonymous_internet_banking','2015-07-01',98),('Curatoria','2016-11-01',3),('A-roll','2016-05-01',134),('Accra_hearts_of_oak_sc','2017-10-01',4),('Apostasy_from_Judaism','2015-12-01',45),('Acantharctia_tenebrosa','2018-01-01',3),('Abigail_Keasey_Frankel','2017-11-01',25),('2008_Paraguayan_general_election','2016-01-01',1),('Adams_motor','2015-09-01',37),('Drummond_Community_High_School','2017-01-01',17),('Andrews_Nakahara','2017-10-01',474),('10th_Maccabiah','2017-04-01',30),('Ackerman,_Rick','2015-08-01',4),('Dumri,_Buxar','2016-11-01',35),('Asking_Jesus_into_your_heart','2016-09-01',1),('Adamowicz_brothers','2016-12-01',161),('Alien_Musibat','2017-12-01',2),('Ahmad_Al_Tayer','2016-04-01',39),('Analytical_phonics','2016-01-01',520),('Do_It_Good','2016-04-01',281),('2004_Kumbakonam_School_fire','2017-12-01',2114),('1977_Chattanooga_Mocs_football_team','2016-08-01',3),('Globe_valves','2017-01-01',11),('Abelmoschus_crinitus','2016-04-01',18),('1874_Yale_Bulldogs_football_team','2016-02-01',37),('Climer','2017-06-01',1),('Auchroisk','2017-06-01',37),('2010_Albirex_Niigata_season','2016-10-01',19),('Adhocracy','2017-06-01',2217),('Chios_Massacre','2015-07-01',1110),('African_Red_Slip','2017-02-01',221),('1976_Portland_Timbers_season','2016-07-01',41),('Alsace-Larraine','2015-09-01',2),('3750_Ilizarov','2017-07-01',12),('Aleksandr_Shkaev','2017-05-01',1),('32_bar_form','2016-01-01',12),('Aequatorium_jamesonii','2018-03-01',14),('Abade_neiva','2016-09-01',2),('Arakvaz','2016-08-01',23),('207_Sqn','2017-10-01',2),('Ducal_hat','2016-11-01',10),('2_Degrees','2017-03-01',19),('Ahmeddiyya_Islam','2016-03-01',4),('Amidi-ye_Kohneh','2017-11-01',13),('Contributions_to_Indian_Sociology','2016-11-01',42),('Clark_Leiblee','2016-04-01',5),('Abraham_of_Strathearn','2017-09-01',14); +/*!40000 ALTER TABLE `some_table` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-01-16 16:55:58 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json b/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json new file mode 100644 index 00000000000..cda20604d9a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json @@ -0,0 +1,3 @@ +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json b/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json new file mode 100644 index 00000000000..ff5b12ecdcb --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json @@ -0,0 +1,17 @@ +{ + "a": { + "path":"April_25,_2017", + "month":"2018-01-01", + "hits":2 + }, + "b": { + "path":"Akahori_Station", + "month":"2016-06-01", + "hits":11 + }, + "c": { + "path": "Abducens_palsy", + "month":"2016-05-01", + "hits":28 + } +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/out.html b/docs/ja/integrations/data-ingestion/data-formats/assets/out.html new file mode 100644 index 00000000000..a3fa7fdfcc9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/out.html @@ -0,0 +1,53 @@ +

Top 10 IPs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IPRequests
9.8.4.63
9.5.1.13
2.4.8.93
4.8.8.23
4.5.4.43
3.3.6.42
8.9.5.92
2.5.1.82
6.8.3.62
6.6.3.52
+ +

Query information

+
+
Rows read
+
1000
+
Time spent
+
0.000211939
+
diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/output.results b/docs/ja/integrations/data-ingestion/data-formats/assets/output.results new file mode 100644 index 00000000000..11fb9a76417 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/output.results @@ -0,0 +1,5 @@ +== Top 10 IPs == + +${data} + +--- ${rows_read:XML} rows read in ${time:XML} --- \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows b/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows new file mode 100644 index 00000000000..50d989feba3 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows @@ -0,0 +1 @@ +${ip:Escaped} generated ${total:Escaped} requests \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/row.template b/docs/ja/integrations/data-ingestion/data-formats/assets/row.template new file mode 100644 index 00000000000..b8855dcb77a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/row.template @@ -0,0 +1 @@ +${time:Escaped} [error] client: ${ip:CSV}, server: ${host:CSV} ${request:JSON} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp new file mode 100644 index 00000000000..12859fac734 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp @@ -0,0 +1,7 @@ +@0xec8ff1a10aa10dbe; + +struct PathStats { + path @0 :Text; + month @1 :UInt32; + hits @2 :UInt32; +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto new file mode 100644 index 00000000000..b86c5cd42c1 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +message MessageType { + string path = 1; + date month = 2; + uint32 hits = 3; +}; diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql new file mode 100644 index 00000000000..d782a6c5520 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql @@ -0,0 +1,8 @@ +CREATE TABLE some_data +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple() diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv new file mode 100644 index 00000000000..917a23a097f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv @@ -0,0 +1,2000 @@ +Bangor_City_Forest 2015-07-01 34 +Alireza_Afzal 2017-02-01 24 +Akhaura-Laksam-Chittagong_Line 2015-09-01 30 +1973_National_500 2017-10-01 80 +Attachment 2017-09-01 1356 +Kellett_Strait 2017-01-01 5 +Ajarani_River 2018-01-01 30 +Akbarabad,_Khomeyn 2017-03-01 8 +Adriaan_Theodoor_Peperzak 2018-02-01 88 +Alucita_dryogramma 2015-09-01 1 +Brit_Med_J 2015-07-01 1 +4th_Metro_Manila_Film_Festival 2015-09-01 80 +Alialujah_Choir 2018-03-01 221 +1953-54_SM-sarja_season 2016-09-01 1 +Air_Force_Song 2018-02-01 19 +4-6_duoprism 2016-03-01 30 +Ashley_Spurlin 2017-06-01 94 +Asfaq_Kayani 2017-10-01 1 +1607_in_architecture 2016-06-01 7 +4-way_speakers 2015-10-01 2 +Blue_Heeler 2015-07-01 149 +5_Euro 2017-04-01 16 +2009_Spa-Francorchamps_GP2_Series_round 2016-04-01 12 +2015_Guru_Granth_Sahib_desecration 2015-11-01 6821 +Agriculture_Marketing_Service 2016-07-01 2 +2006_Football_League_Cup_Final 2015-11-01 1711 +2008_Uber_Cup_group_stage 2016-02-01 40 +1923_PGA_Championship 2016-08-01 97 +Fannie_Bay 2016-04-01 6 +AlchemyAPI 2016-04-01 344 +Cinema_of_Italy 2017-01-01 1217 +Arodes 2016-11-01 36 +Damien_Marley 2015-07-01 168 +Al_Jumayl_Baladiyat 2015-08-01 5 +2015_Alabama_State_Hornets_football_team 2017-06-01 32 +Aglossa_tanya 2016-03-01 1 +73rd_Pennsylvania_Infantry 2017-01-01 12 +2015_European_Junior_and_U23_Canoe_Slalom_Championships 2018-02-01 31 +African_Leopard 2016-08-01 64 +Faverolles,_Orne 2017-01-01 5 +Aaron_Fukuhara 2015-11-01 17 +Annular_ligaments_of_trachea 2017-01-01 31 +2014_US_Open_Series 2016-11-01 35 +A_Better_Mousetrap 2018-02-01 4 +Dibaklu 2016-11-01 1 +At_Samat_District 2015-06-01 35 +Aaron_Peasley 2017-05-01 32 +Apistomology 2015-12-01 2 +Buyat_Bay 2015-07-01 54 +1942_Estonian_Football_Championship 2017-05-01 22 +Action_for_Autism 2016-06-01 346 +100_Hz 2015-06-01 72 +2003_Arizona_State_Sun_Devils_football_team 2017-05-01 82 +Antona_obscura 2016-09-01 1 +Akiko_Sugiyama 2015-12-01 32 +Elysburg 2016-11-01 8 +2017_New_South_Wales_Cup 2017-09-01 38 +2011-12_Gold_Coast_United_FC_season 2017-06-01 1 +Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean 2016-04-01 15 +Albert_Dunn 2017-08-01 87 +Hahamakin_ang_Lahat 2017-01-01 984 +2013_Spuyten_Duyvil_derailment 2017-11-01 5 +Ayling 2017-01-01 5 +Anti-Establishment 2016-10-01 1 +1951_Spanish_motorcycle_Grand_Prix 2018-01-01 48 +2009-10_Brunei_Premier_League 2017-08-01 4 +23_Ursae_Majoris 2016-08-01 90 +1927-28_Austrian_football_championship 2017-08-01 4 +Andrew_McKeever 2017-10-01 3 +Clinocottus 2017-06-01 23 +2006_State_of_Origin 2015-11-01 7 +2013-14_Los_Angeles_Clippers_season 2015-07-01 8 +Cor_Jesu 2017-01-01 1 +Besseringen_B-Werk 2017-06-01 158 +Amy_Hempel 2017-07-01 1091 +Franc-Comtois 2016-04-01 2 +Allium_giganteum 2017-07-01 1103 +Abishai 2016-08-01 56 +Abraham_Clark_High_School 2016-04-01 88 +Baku_chronology 2015-06-01 1 +22nd_MEU 2015-10-01 39 +2015_Open_Engie_de_Touraine 2015-10-01 195 +Churchill_Bowl 2017-06-01 30 +AGMARK 2017-08-01 117 +American_standard_wire_gauge 2017-12-01 3 +Araby,_LA 2015-05-01 2 +217_BC 2016-12-01 202 +2008_Trinidad_and_Tobago_League_Cup 2016-02-01 6 +Alazan_Bay 2015-12-01 22 +Aluminum_fencing 2015-11-01 48 +Achilles_tendinitis 2016-10-01 5884 +AFP_Peacekeeping_Operations_Center 2017-01-01 64 +2013_Xinjiang_clashes 2016-01-01 1 +Arborea_Giudicato_of_Arborea 2015-09-01 3 +1941_Cleveland_Rams_season 2017-06-01 40 +Ju_Posht,_Rasht 2017-01-01 3 +Ascalenia 2016-07-01 10 +Aplectoides 2018-02-01 4 +European_Cup_1969-70 2016-11-01 14 +Armen_Mkertchian 2016-05-01 9 +2015_Aspria_Tennis_Cup_-_Singles 2018-02-01 1 +14_August_1947 2017-11-01 6 +Adobe_Creative_Suite_1 2015-05-01 1 +IC_chips 2017-01-01 2 +Austo_AE300 2016-07-01 4 +Date_palms 2015-07-01 79 +BCS_bowl_game 2017-06-01 13 +AR_Border 2017-06-01 1 +Aranda_de_Duero 2016-04-01 256 +1919_Wake_Forest_Demon_Deacons_football_team 2016-01-01 16 +All_The_Wrong_Clues_For_The_Right_Solution 2017-10-01 9 +Allan_Campbell_McLean 2015-06-01 131 +Bradford_Council_election,_2011 2017-06-01 5 +Astronomy_and_astrophysics 2015-09-01 62 +Dutch_Antillean_people 2015-07-01 57 +Army_Radio 2018-03-01 711 +BBVA_Bancomer 2016-11-01 709 +Lake_Aloha 2017-01-01 30 +Andy_Bean 2018-02-01 3092 +1941_Pittsburgh_Steelers_season 2016-05-01 147 +Aniopi_Melidoni 2016-06-01 4 +Aglossosia_fusca 2017-09-01 3 +Art_books 2017-04-01 36 +1929_Washington_Senators_season 2017-04-01 47 +Antaeotricha_congelata 2016-12-01 10 +Douglas_C-54G-5-DO_Skymaster 2017-01-01 1 +Chris_Jamison 2016-11-01 827 +Ace_Blackwell 2015-11-01 9 +Abdul_Qadir_Fitrat 2018-02-01 32 +Arnoldo_Vizcaino 2017-10-01 1 +2012_Open_EuroEnergie_de_Quimper_-_Doubles 2017-12-01 3 +Dale_Rominski 2017-01-01 7 +ADHD_coaching 2015-06-01 50 +Claire_Yiu 2016-11-01 209 +Applicant 2015-10-01 253 +Apache_OpenOffice 2017-06-01 6031 +Abel_Kiprop_Mutai 2015-09-01 22 +Airdrome_Taube 2017-04-01 46 +Andrey_Viktorovich 2016-06-01 1 +American_Idol_controversy 2016-03-01 36 +Anthrenocerus_confertus 2018-01-01 17 +Appraisal_Subcommittee 2018-03-01 17 +Babusa 2015-07-01 3 +500_homeruns 2016-06-01 1 +Argentina_national_volleyball_team 2016-08-01 64 +Chief_prosecutor_of_Russia 2015-07-01 1 +Absolution_DVD 2015-06-01 1 +1,3-Beta-glucan_synthase 2017-05-01 440 +Dave_Sinardet 2016-04-01 26 +Adeline_Whitney 2018-03-01 10 +Allon_shvut 2016-07-01 3 +2012_Penn_State_Nittany_Lions_football_season 2017-12-01 3 +Coleman-Franklin-Cannon_Mill 2017-01-01 4 +Action_director 2015-05-01 93 +AD_547 2016-01-01 1 +Acta_germanica 2017-09-01 1 +Abu_Dhabi_Global_Market_Square 2017-01-01 35 +Kozo_Shioya 2017-01-01 7 +China_Investment_Corp 2017-01-01 2 +Dmitri_Zakharovich_Protopopov 2016-04-01 129 +Anatra_Anadis 2017-10-01 208 +Archaikum 2017-11-01 5 +2000_Webby_Awards 2017-04-01 360 +2003_BCR_Open_Romania_-_Singles 2016-08-01 2 +Abacetus_bisignatus 2016-09-01 79 +American_school_of_kinshasa 2016-01-01 1 +Anna,_7th_Duchess_of_Bedford 2016-08-01 8 +Black_majority_district 2016-11-01 3 +Dagma_Lahlum 2015-07-01 1 +Credit_Saison 2015-07-01 517 +Ariyankuppam_firka 2016-02-01 19 +Annette_Fuentes 2016-06-01 17 +Angerstein,_John 2015-12-01 2 +Annenkov_Island 2016-03-01 280 +Anne_Frank_museum 2016-06-01 67 +Annales_sancti_Amandi 2017-06-01 22 +L-FABP 2017-01-01 1 +Alvord,_TX 2017-06-01 12 +2006_World_Team_Table_Tennis_Championships 2016-05-01 119 +Angriffen 2015-12-01 9 +Anthony_Oppenheimer 2017-03-01 452 +Absamat_Masaliyevich_Masaliyev 2016-09-01 1 +Airborne_Museum_at_Aldershot 2016-03-01 41 +Aktiubinsk_Oblast 2015-08-01 7 +100_East_Wisconsin 2015-05-01 782 +7th_Bangladesh_National_Film_Awards 2017-08-01 91 +Alejandro_Reyes 2017-12-01 35 +Applied_philosophy 2018-03-01 539 +Adhemar_Pimenta 2016-06-01 146 +Break_the_fourth_wall 2016-04-01 66 +Annoushka_Ducas 2017-10-01 411 +ATC_code_J01CA01 2015-06-01 1 +Evelyn_County,_New_South_Wales 2016-11-01 7 +Elastic_scattering 2016-11-01 1374 +1032_Pafuri 2015-07-01 35 +Andrew_Bromwich 2015-08-01 26 +Ishita_Arun 2017-01-01 249 +Aspergics 2016-07-01 1 +1857_in_Chile 2018-03-01 22 +Breffni 2015-07-01 38 +845_in_poetry 2017-08-01 2 +20321_Lightdonovan 2015-10-01 12 +Arthur_Chandler 2017-12-01 27 +CsISOLatin2 2017-06-01 1 +1900_Grand_National 2016-06-01 69 +Aeritalia_AMX 2017-03-01 3 +B_Sharps 2015-06-01 11 +544_area_code 2015-09-01 2 +30th_Guldbagge_Awards 2015-06-01 37 +Agrippina 2017-08-01 315 +Ardmore 2016-02-01 433 +Amplypterus_panopus 2016-03-01 23 +Alexander_Bukharov 2017-09-01 5 +Alaska_Raceway_Park 2017-01-01 46 +Albanian_National_Road_Race_Championships 2017-03-01 31 +1968_Democratic_National_Convention_protest_activity 2017-10-01 2802 +2012_Birthday_Honours 2017-10-01 427 +2000_NHL_expansion_draft 2017-06-01 1 +A_Town_Where_You_Live 2016-11-01 2920 +Ahmed_Shahzad 2018-03-01 25 +Elisabeth_Svendsen 2016-11-01 39 +2002_FINA_Synchronised_Swimming_World_Cup 2016-08-01 30 +Akatek 2017-04-01 10 +Animation_with_DAZ_Studio 2018-02-01 78 +Fergus_Craig 2016-11-01 119 +Ancel_Nalau 2015-11-01 5 +5171_Augustesen 2017-04-01 20 +Anne_McGuire 2017-11-01 329 +Australian_Photoplay_Company 2015-12-01 6 +1913_in_Canada 2017-04-01 137 +Arhopala_allata 2015-05-01 26 +Il_Paradiso_delle_Signore 2017-01-01 31 +Geri_Palast 2017-01-01 38 +Alan_Abela_Wadge 2017-03-01 77 +22nd_Tactical_Air_Support_Squadron 2017-10-01 7 +Avant_Stellar 2017-06-01 22 +Black_phantom_tetra 2016-11-01 205 +Billy_McCaffrey 2017-01-01 314 +Annie_Furuhjelm 2017-11-01 97 +1992_PGA_Tour 2017-12-01 307 +2008_Chilean_pork_crisis 2016-01-01 55 +2012_Currie_Cup_First_Division 2018-02-01 32 +Aleksei_Fomkin 2015-05-01 144 +Alexander_Krausnick-Groh 2016-05-01 101 +Adam_Richard_Wiles 2017-08-01 5 +ATCvet_code_QA01AD01 2015-09-01 2 +Abu_Bakr_Ibn_Bajja 2017-03-01 5 +Architecture-Studio 2016-04-01 94 +950s_BC 2016-02-01 257 +Abschwunges 2017-07-01 1 +Adonis_Geroskipou 2017-06-01 15 +2008-09_SV_Werder_Bremen_season 2016-03-01 3 +Closed_loops 2016-04-01 1 +AFC_Youth_Championship_1982 2015-12-01 10 +Aquila_Shoes 2015-08-01 209 +9842_Funakoshi 2017-12-01 11 +Educational_quotient 2016-04-01 21 +Antoni_Julian_Nowowiejski 2018-01-01 211 +Adi_Oka_Idhile 2017-11-01 16 +DEXIA-BIL_Luxembourg_Open 2016-11-01 3 +Andrew_James_Simpson 2016-03-01 43 +Alexander_Boksenberg 2017-12-01 61 +1827_in_Denmark 2017-03-01 39 +Afternoon_tea_with_suggs 2017-11-01 3 +Alpha,_MN 2017-06-01 6 +Ari_Onasis 2015-06-01 4 +1961-62_Football_League_First_Division 2015-11-01 1 +Andi_Lila 2015-06-01 2847 +A_Gathering_Of_Old_Men 2018-02-01 1 +Abul_Fazl_al-Abbas 2017-01-01 1 +Asgill,_Charles 2017-08-01 1 +Alexander_Arkhangelsky 2015-07-01 12 +1947-48_Portuguese_Liga 2015-06-01 1 +3rd_MMC_-_Varna 2016-07-01 3 +Alberts,_Wayne 2017-05-01 3 +Alois_Schickelgruber 2018-02-01 9 +Hefner_Stadium 2017-01-01 2 +410912_Lisakaroline 2018-02-01 26 +Academy_at_Mountain_State 2018-03-01 1 +617_Squadron 2016-05-01 489 +Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji 2015-07-01 5 +Arturo_Merino_Benitez_Airport 2017-10-01 13 +AEK_Athens_Futsal 2015-06-01 10 +Aggaeus 2018-02-01 2 +Association_for_Retarded_Citizens_of_the_United_States 2017-08-01 3 +Kielce_pogrom 2017-01-01 335 +1351_in_poetry 2016-01-01 17 +1923_Princeton_Tigers_football_team 2017-11-01 41 +Auzata_semipavonaria 2017-01-01 2 +892_in_poetry 2016-01-01 6 +Anton_Krotiak 2017-12-01 2 +Arthur_Shelley 2017-12-01 23 +2003_Kyoto_Purple_Sanga_season 2018-02-01 9 +Frederic_Bowker_Terrington_Carter 2016-04-01 6 +2-orthoplex 2016-03-01 1 +Acacia_australiana 2015-09-01 4 +2012_Newcastle_Knights_season 2016-06-01 103 +Ann_Wrights_Corner,_Virginia 2017-07-01 19 +12557_Caracol 2017-03-01 5 +2001_African_Footballer_of_the_Year 2017-05-01 1 +Bass_Pyramid 2017-01-01 22 +A_noodle 2015-05-01 5 +Aed_Bennan 2018-02-01 2 +1886_Yale_Bulldogs_football_team 2017-10-01 58 +2002_Players_Championship 2016-06-01 54 +African_Skimmer 2017-07-01 2 +3rd_Guldbagge_Awards 2016-12-01 39 +Arrows_A19B 2015-10-01 1 +Archduchess_Elisabetta_of_Austria-Este 2017-08-01 1526 +America_Islands 2015-11-01 1 +1932_Olympic_Games 2016-01-01 9 +2011_Chinese_pro-democracy_protests 2015-11-01 2044 +Bank_walkaway 2016-04-01 113 +594_in_Ireland 2017-04-01 1 +Association_of_Municipal_Corporations 2016-12-01 5 +Andreas_Brantelid 2015-09-01 167 +Amarthal_urf_Unchagaon 2017-05-01 82 +3-methoxymorphinan 2017-04-01 146 +2382_BC 2016-07-01 10 +1763_in_science 2016-07-01 28 +Arvert 2017-04-01 77 +Ale_yeast 2017-12-01 19 +A_Man_Without_a_Soul 2018-03-01 17 +Air_Force_Base_Louis_Trichardt 2017-09-01 1 +Athirson_Mazzoli_de_Oliveira 2017-06-01 3 +Anthony_Chan_Yau 2017-07-01 181 +Basic_Enlisted_Submarine_School 2017-06-01 392 +Aboriginal_Lands_of_Hawaiian_Ancestry 2015-09-01 11 +Fondren_Southwest,_Houston 2017-01-01 4 +3_World_Financial_Center 2017-07-01 64 +1971_IIHF_European_U19_Championship 2017-09-01 9 +1937-38_Allsvenskan 2015-12-01 6 +Christopher_Ashton_Kutcher 2017-06-01 2 +Australian_rules_football_in_south_australia 2016-12-01 1 +Amicable_pair 2018-01-01 7 +Alan_Tomes 2015-11-01 82 +Alexei_Petrovich,_Tsarevich_of_Russia 2015-12-01 3887 +Alexis_Damour 2015-10-01 66 +Bankruptcy_Act_of_1938 2017-06-01 76 +Amphiphyllum 2016-06-01 14 +Conway_High_School_West 2016-04-01 1 +5447_Lallement 2015-11-01 10 +Gabriel_Iddan 2017-01-01 1 +1879-80_Scottish_Cup 2017-04-01 3 +2011_Eneco_Tour 2016-10-01 31 +1471_in_England 2015-11-01 94 +Ashland_Town_Hall 2017-01-01 5 +Archduke_John 2015-05-01 20 +2000_Cameroonian_Premier_League 2017-09-01 18 +1997_flood 2017-11-01 5 +Agile_management 2015-09-01 26677 +Am_841 2017-12-01 3 +Apprentice_Mason 2018-01-01 4 +Hales-Jewett_theorem 2017-01-01 2 +Alien_Abductions 2017-10-01 14 +Arjun_Menon 2016-02-01 370 +Anthokyan 2016-01-01 4 +Automobili_Lamborghini 2016-02-01 1110 +Alain_Prost 2017-04-01 25196 +Fartein_Valen 2016-04-01 90 +Antonio_Galli_da_Bibiena 2016-05-01 5 +Al_Jawf,_Libya 2017-03-01 600 +AD_695 2018-02-01 1 +Amir_chand 2015-11-01 1 +Alcis_obliquisigna 2017-08-01 1 +Chandra_Talpade_Mohanty 2017-01-01 306 +Algerian_safe_house,_Jalalabad 2015-06-01 3 +Jake_Milner 2017-01-01 1 +Alternate_Communications_Center 2017-10-01 1 +In_the_Bleachers 2017-01-01 42 +Alex_Puodziukas 2016-04-01 7 +Altarpiece_of_Pilgrim_II 2018-02-01 2 +Cybernetical_Physics 2017-01-01 3 +Christopher_Unthank 2017-06-01 2 +1982_Independence_Bowl 2015-06-01 102 +Ascoli_Calcio_1898 2018-03-01 1115 +Briggs-Rauscher_reactions 2017-06-01 1 +Adjadja 2018-02-01 45 +Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed 2016-06-01 3 +Catholic_social_doctrine 2017-01-01 6 +2833_BC 2016-11-01 1 +Bethy_Woodward 2016-04-01 38 +Bateman_polynomials 2017-06-01 22 +1966_Buenos_Aires_Grand_Prix 2015-10-01 19 +A_River_Somewhere 2015-10-01 353 +2016-17_BVIFA_National_Football_League 2017-04-01 2 +1909_Major_League_Baseball_season 2015-10-01 362 +1988_Oklahoma_Sooners_football 2017-11-01 2 +2010s_in_Chechen_fashion 2016-10-01 1 +Accademia_Olimpica 2017-08-01 17 +Air_cooling 2015-07-01 2010 +Amir_Saoud 2016-11-01 22 +Alex_Auburn 2015-05-01 52 +Apamea_impulsa 2016-11-01 6 +Australian_federal_election,_2007 2015-07-01 1794 +Ain_Sakhri 2017-10-01 76 +Belosaepiidae 2015-07-01 68 +Acts_of_Parliament_in_the_United_Kingdom 2017-10-01 4070 +Equity_Office 2016-11-01 202 +David_Bintley 2017-01-01 51 +Aksel_Schiotz 2018-03-01 3 +Appropriation_Act_2000 2017-05-01 12 +Edward_Johnson_III 2016-11-01 491 +2006_Ohio_State_Buckeyes_football_team 2016-03-01 1452 +Battle_of_Fort_Beausejour 2015-07-01 97 +Abel_Foullon 2015-12-01 82 +Apollo_VIII 2015-10-01 19 +Carry_on_up_the_jungle 2015-07-01 8 +Armour_villa 2017-05-01 4 +201_Poplar 2015-08-01 265 +Arta_prefecture 2016-08-01 1 +2015-16_Ekstraklasa 2018-02-01 13 +Alport,_Ontario 2018-02-01 2 +Bongoland 2017-06-01 62 +Alfred_Charles_Post 2016-11-01 11 +Aam_Aadmi_Party_crisis 2016-10-01 1 +Andrea_Moda 2015-07-01 143 +Abdul_Halim_Sharar 2017-08-01 545 +Apostolic_Vicariate_of_Yunnan 2016-12-01 1 +Catherine_Steadman 2016-11-01 5218 +Agastachys_odorata 2015-10-01 38 +9783_Tensho-kan 2016-03-01 2 +AFL_Cairns 2017-10-01 337 +Abomey 2015-06-01 1062 +Anne_Crofton,_1st_Baroness_Crofton 2015-12-01 42 +Cash-flow_return_on_investment 2017-01-01 137 +Alberto_Arvelo_Torrealba_Municipality 2015-08-01 56 +Abyssinian_Shorthorned_Zebu 2017-09-01 124 +Albanian_hip_hop 2016-01-01 1812 +Alphonso_IV_of_Portugal 2016-02-01 12 +19th_The_Alberta_Mounted_Rifles 2016-10-01 1 +Chinese_shadow_theatre 2016-04-01 1 +American_Committee_of_the_Fourth_International 2017-08-01 4 +2014_Bahrain_GP2_Series_round 2016-03-01 80 +Alexandrian_orthodox 2017-09-01 2 +2010_Hurricane_Season 2015-05-01 18 +1938_All-Ireland_Senior_Camogie_Championship_Final 2017-01-01 1 +ATC_code_D01 2018-01-01 203 +Albedo 2015-08-01 23484 +Chavigny,_Meurthe-et-Moselle 2017-01-01 12 +Becky_Essex 2015-07-01 51 +Archaeological_Museum_Padre_Le_Paige 2018-02-01 2 +Abu_Bakar_Sillah 2017-01-01 5 +Back_chat 2017-01-01 2 +Anchylobela_dyseimata 2015-12-01 11 +Anthony_Overton 2017-03-01 261 +Bear_maul 2016-04-01 3 +Ambarawa,_Central_Java 2016-01-01 1 +Amber_lager 2016-11-01 87 +2nd_LAAD 2017-09-01 8 +Ashiya,_Hyogo 2018-03-01 24 +Angels_at_Risk 2018-02-01 74 +Audrey_Marie_Munson 2016-03-01 17 +1984_Australian_Football_Championships 2017-01-01 27 +Ammonia_fountain 2016-06-01 434 +Allister_Bentley 2018-03-01 11 +Alsager_Hay_Hill 2016-10-01 72 +1753_English_cricket_season 2015-05-01 51 +2009-10_New_Jersey_Devils_season 2016-10-01 1 +An_Untamed_State 2016-05-01 1109 +Beatrice_Carmichael 2016-11-01 5 +Abdul_Ghani_Ahmad 2017-12-01 115 +Arteria_suralis 2017-02-01 3 +Berzasca_River 2017-01-01 1 +Angel_Attack 2015-09-01 98 +1969_San_Francisco_49ers_football_team 2017-11-01 1 +Anthony_Beilenson 2017-09-01 114 +Crystalline_Entity 2016-04-01 180 +Granice 2017-01-01 2 +203rd_General_Hospital 2017-07-01 44 +Acrocercops_rhombiferellum 2017-12-01 20 +Ampliglossum_blanchetii 2017-05-01 1 +11553_Scheria 2017-03-01 2 +Ashkenozi 2017-02-01 1 +2010_Calder_Cup_Playoffs 2018-01-01 9 +Alice_Caymmi 2016-01-01 121 +Alfredo_Alvar 2017-04-01 44 +2006_Legends_Tour 2017-07-01 30 +Albano_Albanese 2015-10-01 53 +1943_Frankford_Junction_train_wreck 2016-08-01 510 +Evans_Court_Apartment_Building 2016-04-01 4 +Abu_al-Rayhan_Muhammad_ibn_al-Biruni 2017-11-01 1 +Abubakar_Muhammad_Rimi 2015-05-01 4 +Dostpur 2016-11-01 26 +Accessories_Council_Excellence_Awards 2016-03-01 14 +2006_North_American_heat_wave 2015-06-01 1161 +Amstelodamum 2017-09-01 12 +A_Very_Peculiar_Practice 2016-08-01 1860 +Allegorie_der_Liebe 2015-09-01 1 +Alex_Mackie 2017-02-01 95 +1812_Homestead_Farm_and_Museum 2017-09-01 29 +Argus_distribution 2016-03-01 8 +Anthony_Thomas_Stover 2017-02-01 1 +Arthur_Shallcross 2016-11-01 20 +Antoine_Francois_Fourcroy 2018-01-01 1 +Abbas_Halim 2016-11-01 21 +Akiva_Baer_ben_Joseph 2017-08-01 1 +Balatonfuered 2016-11-01 3 +Antemnae 2017-11-01 204 +Cling_Cling 2017-06-01 93 +B_flat_major 2017-01-01 28 +AirExplore 2017-12-01 930 +Auckland_Super_Sprint 2015-11-01 120 +Alfredo_De_Gasperis 2017-12-01 793 +Geoffrey_I_of_Vianden 2017-01-01 5 +Copa_de_Zaachila 2016-04-01 6 +Alboacen 2017-09-01 1 +BNH_Hospital_Bangkok 2017-06-01 2 +Agricultural_health_and_safety 2016-09-01 1 +Chiasms 2017-06-01 2 +Al_Karaana 2016-05-01 58 +Alberta_Highway_872 2016-11-01 1 +Among_the_mourners 2016-03-01 1 +Achema_Power_Plant 2015-06-01 55 +ATSE_Graz 2017-10-01 65 +Arthroscopy 2017-02-01 11721 +2010-2012_European_Nations_Cup_Second_Division 2018-01-01 7 +1967_Cincinnati_Reds 2015-08-01 4 +24th_Golden_Disc_Awards 2017-05-01 71 +Johnny_Floyd 2017-01-01 17 +Arthur_Rupin 2016-02-01 5 +Alpine_skiing_at_the_2011_Canada_Winter_Games 2015-09-01 38 +College_Press_Service 2017-01-01 8 +American_Psycho 2015-08-01 55567 +CBC_Winnipeg 2017-06-01 17 +Burning_the_process 2016-04-01 1 +2011_Stanley_Cup_playoffs 2017-01-01 1036 +Andrew_Mumford 2017-01-01 6 +1925_in_fine_arts_of_the_Soviet_Union 2018-02-01 28 +Aragvi_river 2017-02-01 2 +Andrew_Adamson 2018-03-01 16269 +Arcides_fulvohirta 2016-10-01 1 +Araya_Selassie_Yohannes 2015-11-01 423 +Apartment_house 2016-09-01 85 +Advanced_Art 2015-12-01 171 +1028_Lydina 2015-06-01 53 +2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti 2017-04-01 2 +Adolph_Weiss 2015-06-01 98 +Adam_Jerzy_Czartoryski 2015-09-01 1237 +1980_United_States_presidential_election 2017-05-01 56 +1956_Oscars 2016-08-01 10 +Burundian_Senate_election,_2005 2016-04-01 1 +Amarolea_floridana 2015-07-01 3 +August_Bier 2015-12-01 514 +Arbelodes_sebelensis 2018-03-01 6 +Abiah_Brown 2018-02-01 1 +A_Maceo_Smith_High_School 2016-10-01 2 +1488_in_architecture 2017-12-01 6 +2009_AMP_Energy_500 2016-04-01 45 +1921_Baylor_Bears_football_team 2017-03-01 21 +Dmitry_Akhba 2015-07-01 43 +2004_Big_12_Conference_Baseball_Tournament 2016-07-01 37 +Abdisalam_Omer 2018-02-01 116 +Alma,_son_of_Alma 2015-08-01 53 +An_Phoblacht 2016-10-01 962 +2009_Turner_Prize 2016-01-01 75 +Jack_Zajac 2017-01-01 24 +1906_Wimbledon_Championships 2016-04-01 22 +Chuckwalla_Valley 2017-06-01 22 +Alien_Quadrology 2016-02-01 1 +Chalcidoptera_contraria 2016-04-01 1 +Alaska_Republican_Gubernatorial_Primary_Election,_2006 2016-02-01 1 +333639_Yaima 2018-02-01 7 +Aquila_hastata 2015-11-01 28 +Al-Fua 2017-07-01 1 +Anihilation 2015-07-01 28 +International_Toy_Fair 2017-01-01 1 +38th_Regiment_Indiana_Infantry 2017-01-01 10 +Andrea_Stella 2017-07-01 75 +Anselmo_de_Moraes 2015-09-01 562 +Applemore 2016-05-01 3 +Akpinar,_Kirsehir 2015-06-01 3 +Ant_nest 2016-05-01 53 +Catherine_of_Siena 2016-11-01 8806 +Barbos 2015-06-01 12 +Amlaib_mac_Iduilb 2017-08-01 2 +Alice_Janowski 2018-03-01 17 +Acacia_leptocarpa 2017-03-01 48 +Al-Hadi_Yahya 2016-01-01 39 +2015_British_Figure_Skating_Championships 2017-07-01 38 +Avenues_Television 2016-03-01 214 +Dendropsophus_sartori 2015-07-01 11 +1952_in_Germany 2015-05-01 63 +Armuchee_High_School 2016-04-01 27 +April_1_RFC 2017-11-01 2 +Caroline_Bliss 2016-11-01 972 +66th_Rice_Bowl 2016-06-01 17 +Alec_Smight 2017-02-01 173 +Alexei_Panin 2017-09-01 3 +Codeword 2016-04-01 84 +Dormice 2015-07-01 63 +2105_BC 2017-11-01 6 +5th_National_Congress_of_Kuomintang 2016-06-01 5 +Caminho_das_Indias 2017-01-01 5 +Agerbo 2017-11-01 2 +Abe_Anellis 2018-01-01 86 +Aceh_Medal 2015-07-01 33 +Alltech_Arena 2016-10-01 144 +Aly_Oury 2016-06-01 260 +757th_Troop_Carrier_Squadron 2017-07-01 2 +Alec_Peters 2017-12-01 2731 +Agua_Buena_Airport 2017-09-01 12 +Alessandro_Livi 2016-08-01 104 +Andkaer 2017-04-01 3 +Cateran 2017-06-01 135 +57th_Venice_International_Film_Festival 2017-04-01 180 +Brijal_Patel 2017-06-01 98 +Cnemaspis_jerdonii 2015-07-01 6 +Aluminum_sodium_salt 2016-10-01 3 +Arnaldo_Antonio_Sanabria_Ayala 2017-09-01 4 +Angels_of_Iron 2018-02-01 83 +Bugs_Bunny_Rabbit_Rampage 2017-06-01 422 +Admiralty_Class_Destroyer 2017-10-01 2 +Atlas_Media 2017-05-01 2 +Arcesilaus_i_of_cyrene 2017-03-01 1 +2011_Tajikistan_national_football_team_results 2017-04-01 13 +Artur_Shakhnazarov 2017-12-01 22 +747_Express_Bus 2018-03-01 20 +101-in-1_Party_Megamix 2017-10-01 188 +Fastpoint_Games 2016-11-01 32 +Analog_Anthology_1 2017-07-01 1 +Archival_bond 2015-09-01 119 +1985_Air_Force_Falcons_football 2017-09-01 4 +American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem 2017-06-01 3 +Adaptive_Evolution_in_the_Human_Genome 2017-08-01 2 +Arthur_Strangways 2015-11-01 5 +1583_in_poetry 2015-09-01 68 +Andrew_igoudala 2015-06-01 2 +Euonychophora 2016-11-01 37 +Catechizing 2016-04-01 4 +1960-61_ice_hockey_Bundesliga_season 2018-03-01 3 +Buk_Vlaka 2017-06-01 10 +Arbor_Day 2018-03-01 16265 +Guan_Sheng 2017-01-01 73 +2014_Barcelona_Open_Banc_Sabadell 2016-08-01 57 +1976-77_Nationalliga_A 2016-04-01 1 +AFL_records 2015-11-01 16 +2005_Tour_Down_Under 2016-10-01 26 +92_BCE 2015-08-01 4 +Bento_Box_Animation 2017-01-01 1 +Alabama_Territory 2018-03-01 1195 +Abdul-Wasa_Al-Saqqaf 2016-07-01 21 +Archbishops_of_Semarang 2017-01-01 6 +Ambivina 2017-10-01 13 +Aghjaghala_Ulia 2017-08-01 2 +Blechnum_novae-zelandiae 2016-11-01 26 +Dictyosome 2016-04-01 19 +Arts_Council_of_Great_Britain 2016-12-01 785 +LBC_Radio 2017-01-01 3 +Ageo,_Saitama 2016-06-01 396 +Babla_Mehta 2016-12-01 674 +2012-13_Russian_Cup 2018-01-01 10 +Chandragupt 2017-06-01 6 +407th_Air_Refueling_Squadron 2016-01-01 96 +Aftermarket 2016-07-01 1253 +A_Portrait_of_New_Orleans 2016-08-01 18 +2000-01_Yemeni_League 2017-03-01 1 +Actinidia_chinensis 2015-11-01 907 +Amsterdam_Tournament_1999 2018-03-01 1 +Arthur_Iberall 2017-02-01 112 +Auricula_Meretricula 2016-02-01 103 +Archbishop_of_Lahore 2016-09-01 8 +Chippewa_Indians_of_Montana 2016-04-01 9 +Abidjan-Niger_Railway 2018-01-01 22 +29th_Annual_Grammy_Awards 2017-05-01 1087 +Ateles_geoffroyi_frontatus 2017-06-01 3 +Enrico_Cernuschi 2016-11-01 3 +A4183_road 2017-02-01 8 +Ahrayut 2016-10-01 75 +Alison_Castle 2016-03-01 55 +Automobile_aftermarket 2016-10-01 5 +2008_GAINSCO_Auto_Insurance_Indy_300 2016-07-01 51 +1937_Scottish_Cup_Final 2017-04-01 126 +2005_Clipsal_500_Adelaide 2018-02-01 22 +Farid_Farjad 2016-04-01 120 +13_Tribes_of_Long_Island 2015-12-01 11 +Afroneta_bamilekei 2017-01-01 2 +Frederick_Stuart_Greene 2017-01-01 1 +Andre_Braugher 2017-04-01 37655 +1906_International_Lawn_Tennis_Challenge 2017-10-01 73 +2009-10_NFL_Playoffs 2016-01-01 69 +Cricket_Wellington 2016-11-01 2 +Craig_Blazer 2015-07-01 21 +Aeolidiella_orientalis 2017-05-01 3 +Andre_Prokovsky 2017-06-01 4 +Angela_McKee 2017-11-01 14 +Airbase_Golubovci 2016-10-01 1 +2011_ISAF_Sailing_World_Championships 2017-05-01 89 +Bartica_Airport 2017-06-01 27 +Agusan_Dam 2016-09-01 454 +Bosque_Real_Country_Club 2015-07-01 42 +Georges_Duhamel 2017-01-01 122 +Allrounder 2017-03-01 63 +2017_Missouri_State_Bears_football_team 2017-09-01 868 +Allons_a_Lafayette 2017-11-01 17 +Agathla 2015-05-01 105 +1086_in_poetry 2015-09-01 25 +Absolute_extreme 2017-09-01 1 +Agathe_Bonitzer 2017-12-01 229 +Chinese_Red_Pine 2017-06-01 18 +Angular_dispersion 2016-02-01 11 +Jean-Sebastian_Giguere 2017-01-01 2 +Actinium-235 2018-03-01 4 +Ago,_filo_e_nodo 2017-02-01 11 +Aranea_cruentata 2016-03-01 1 +2009_Korea_National_League 2017-11-01 19 +Americom-8 2016-08-01 28 +2006_Junee_Bushfire 2018-03-01 81 +2013_Major_League_Baseball_Home_Run_Derby 2017-09-01 182 +1928_US_Presidential_Election 2016-12-01 42 +After-eighty_generation 2016-02-01 127 +1932_Hawthorn_Football_Club_season 2017-07-01 16 +Amelia_Elizabeth_Mary_Rygate 2017-05-01 2 +Aline_Khalaf 2017-12-01 465 +Akron_Junction,_New_York 2017-07-01 56 +Apollo_moon_landing_conspiracy_theories 2015-09-01 4 +1978_National_League_Championship_Series 2017-03-01 325 +1959-60_German_football_championship 2017-08-01 5 +Almost_a_Bride 2017-01-01 1 +Andrew_Lysaght,_junior 2015-10-01 20 +1902_Otani_expedition 2018-02-01 1 +1892_Currie_Cup 2016-09-01 53 +1988_USC_Trojans_football_team 2016-10-01 494 +1944_in_Northern_Ireland 2016-12-01 46 +Alfred_Acherman 2017-07-01 1 +Arcadia,_Nebraska 2017-02-01 148 +4_x_400_metre_relay 2018-03-01 1 +A4030_road 2016-07-01 1 +Chi-li 2016-11-01 3 +Aircraft_fairing 2016-11-01 1861 +Buddhism_in_Belize 2015-07-01 40 +Alameda_County_Open 2017-02-01 33 +Area_of_countries_and_regions_of_the_United_Kingdom 2017-10-01 6 +2014_Weber_State_Wildcats_football_team 2016-10-01 47 +American_Journal_of_Comparative_Law 2016-04-01 62 +A_Teaspoon_Every_Four_Hours 2017-03-01 47 +Astasis 2016-03-01 1195 +Akhrakouaeronon 2015-11-01 62 +Annenkrone 2016-03-01 40 +Ballotine 2016-12-01 4753 +2000_Kipawa_earthquake 2015-11-01 139 +Archdiocese_of_cashel_and_emly 2017-01-01 1 +Chevrolet_SS396 2017-01-01 1 +Achyroseris 2016-03-01 1 +Daniel_Pulteney 2016-11-01 29 +2006_Major_League_Baseball_draft 2017-07-01 10637 +Adetunji_Idowu_Olurin 2016-01-01 37 +Ardatov,_Nizhny_Novgorod_Oblast 2017-04-01 18 +Andrew_Hilditch 2015-08-01 398 +A_Very_Merry_Daughter_Of_the_Bride 2017-04-01 67 +1993_in_radio 2017-08-01 85 +Deltan 2016-11-01 91 +Adnan_Custovic 2017-12-01 26 +Di_Gennaro 2017-01-01 4 +237_AD 2017-11-01 1 +Aaron_Gombar 2018-03-01 2 +Acrolophus 2017-04-01 47 +Alfred_Bergman 2017-06-01 27 +Charles_Bebb 2017-06-01 39 +Dirico 2017-01-01 24 +1982_Major_League_Baseball_Draft 2016-12-01 90 +DDT_wrestling 2016-11-01 4 +1988-89_Houston_Rockets_season 2016-02-01 10 +Acacia_loderi 2015-11-01 35 +2015_Deauville_American_Film_Festival 2016-10-01 126 +Andropadus_importunus 2016-02-01 9 +Antonio_Bacchetti 2017-04-01 52 +Ann_Trindade 2015-09-01 49 +5_x_Monk_5_x_Lacy 2016-05-01 37 +Barlochan,_Ontario 2017-06-01 2 +Achaian 2017-03-01 35 +Flow_rider 2017-01-01 1 +Antiblemma_discerpta 2018-02-01 1 +1997_Illinois_Fighting_Illini_football_team 2017-11-01 331 +Ahrntal 2016-03-01 540 +Apollo_Conference 2015-10-01 329 +Algenib_in_Perseus 2016-01-01 1 +Craig_Norgate 2016-04-01 42 +Antwerp_Zoo 2015-12-01 879 +Cold_Contagious 2017-06-01 161 +Bolito 2016-11-01 181 +Chinese_bridges 2016-11-01 1 +14th_Indiana_Infantry_Regiment 2017-04-01 115 +Bindunuwewa_massacre 2015-07-01 52 +Eastshore_Highway 2016-11-01 2 +Daemonologie 2017-01-01 1655 +Aero_Pacifico 2015-07-01 1 +Blue_Ribbon_Schools_Program 2017-06-01 557 +Ash_Township,_MI 2018-02-01 3 +Al-Hatab_Square 2018-02-01 450 +Alje_Vennema 2018-02-01 187 +1920_All-Ireland_Senior_Football_Championship_Final 2016-05-01 40 +Criss_Oliva 2016-11-01 801 +Bethlehem,_Ohio 2017-01-01 16 +1976_WHA_Amateur_Draft 2015-08-01 47 +Angela_Fimmano 2017-06-01 17 +Alexander_Bonini_of_Alexandria 2017-09-01 1 +Anarchist_faq 2015-05-01 13 +Aleksander_Benedykt_Sobieski 2016-05-01 240 +Cape_Florida_Lighthouse 2016-04-01 6 +Fernando_VI_of_Spain 2017-01-01 3 +Crossing_number 2017-06-01 29 +1984_NSL_Cup 2017-05-01 26 +Barbara_Weldon 2015-06-01 29 +Andreas_Olsen 2017-01-01 32 +Battle_of_Baima 2016-04-01 2 +Amory_Hansen 2016-05-01 26 +Akhmimic 2015-11-01 41 +Al_Awda 2018-02-01 18 +Adelheid-Marie_of_Anhalt-Dessau 2016-07-01 70 +Americans_for_Technology_Leadership 2015-10-01 90 +Belizean_diplomatic_missions 2017-06-01 3 +African_communist 2016-05-01 3 +Andosol 2016-09-01 246 +Alan_Attraction 2016-05-01 15 +A_Yank_in_Rome 2015-12-01 70 +2004_in_the_United_Arab_Emirates 2018-02-01 33 +Additionality 2017-06-01 371 +Assassination_of_Trotsky 2015-06-01 47 +Alice_Sotero 2018-02-01 27 +Agyneta_platnicki 2016-04-01 4 +Alexandra_Vasilyevna_Velyaminova 2015-07-01 30 +1881_in_Chile 2016-06-01 16 +Arterial_ischemic_stroke 2018-01-01 57 +Astro_Glacier 2015-09-01 27 +Chester_Earl_Merrow 2017-06-01 58 +Alejandro_de_la_Madrid 2015-11-01 1630 +70936_Kamen 2017-08-01 1 +AK_Steel_Holding_Corp 2015-08-01 8 +1124_Stroobantia 2017-10-01 23 +Asian_Wedding 2016-10-01 15 +23837_Matthewnanni 2015-10-01 18 +Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden 2017-03-01 4893 +Betsy_Hodges 2016-04-01 560 +Arthur_and_the_Invisibles 2015-08-01 14924 +Arkansas-Ole_Miss_football_rivalry 2015-05-01 7 +Asia_Cup 2015-09-01 5938 +Arginine_racemase 2016-12-01 15 +585th_Field_Company,_Royal_Engineers 2018-03-01 1 +1975_Stagg_Bowl 2017-08-01 6 +Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath 2017-01-01 1 +Askajian 2016-02-01 26 +2006_Nebraska_Cornhuskers_football_team 2015-08-01 975 +Cicero_Francis_Lowe_House 2015-07-01 10 +Conan_IV,_Duke_of_Brittany 2016-11-01 252 +2005_World_Modern_Pentathlon_Championships 2016-07-01 38 +1946_Aleutian_Islands_earthquake 2017-03-01 2019 +ANKRD17 2017-09-01 19 +1970_Maryland_Terrapins_football_team 2017-11-01 42 +Ali_Dehkhoda 2017-04-01 1 +1244_in_art 2015-07-01 22 +1520s_in_Denmark 2016-01-01 20 +Abdoulaye_Gaye 2017-12-01 10 +An_Angel_Has_Arrived 2016-03-01 36 +1453_BC 2015-08-01 26 +2017_National_Games_of_China 2017-05-01 1293 +A_Night_in_Sickbay 2016-05-01 251 +Dateline_Diamonds 2017-01-01 53 +419_guestbook_spamming 2016-02-01 5 +Familiar_bluet 2017-01-01 4 +Abu_Bakr_Mirza 2017-10-01 86 +7272_Darbydyar 2017-11-01 4 +Ages_of_consent_in_Latin_America 2017-03-01 961 +1982_Japan_Soccer_League_Cup 2016-04-01 14 +2810_BC 2015-07-01 9 +Druga_Liga_Republike_Srpske 2017-01-01 1 +1998_Swedish_Rally 2017-09-01 34 +1567_in_Norway 2015-10-01 89 +126_Army_Engineer_Regiment,_Royal_Engineers 2016-03-01 5 +2017_American_League_Wild_Card_Game 2017-10-01 25120 +August_Follen 2017-01-01 2 +Ala_Gertner 2015-11-01 876 +Glenwood,_Harford_County,_Maryland 2017-01-01 3 +Applied_ecology 2017-12-01 730 +Ariarathes_V_Eusebes_Philopator 2018-03-01 5 +2006_AFC_Champions_League 2017-09-01 947 +60_minutes_2 2016-10-01 2 +Embryonic_shield 2017-01-01 2 +2001_Meath_Intermediate_Football_Championship 2015-11-01 8 +Apparition_of_Christ_to_Madonna 2017-06-01 5 +Hoosier_Road_Elementary 2017-01-01 1 +Arua_Uda 2016-12-01 29 +Array_comprehension 2015-11-01 8 +Baszki 2015-06-01 36 +Akron_Neighborhoods 2016-01-01 4 +Catholic_Church_in_Costa_Rica 2017-06-01 85 +Canada-Sweden_relations 2015-07-01 1 +Barza_Radio_Community 2016-11-01 6 +Dalhousie_Middle_School 2016-11-01 5 +Alliphis_bakeri 2017-11-01 2 +Bartica_massacre 2017-06-01 53 +30th_January 2015-11-01 10 +1920_revolution 2017-05-01 5 +Amyraldism 2017-08-01 828 +AA_Jefferson_District 2016-05-01 45 +Eunebristis_cinclidias 2017-01-01 1 +A_Scott_Connelly 2017-06-01 5 +Antony_Durose 2016-07-01 19 +Arval_Brethren 2017-11-01 579 +Anthidium_dissectum 2017-05-01 2 +Aru,_Democratic_Republic_of_the_Congo 2017-04-01 81 +1956-57_West_Indian_cricket_season 2017-04-01 2 +2014_Moscow_Film_Festival 2017-08-01 2 +Anna_Gurji 2017-06-01 27 +Allen_Memorial_Medical_Library 2016-07-01 120 +Anton_Sistermans 2017-02-01 36 +Clotheshorses 2017-06-01 1 +36_Stratagems 2017-08-01 25 +Attack_of_the_crab_monsters 2016-10-01 16 +30_rock_awards 2015-09-01 2 +Aeroflot,_Uralsk_Civil_Aviation_Directorate 2017-08-01 2 +Amblyseius_parabufortus 2017-06-01 3 +Indian_coral_tree 2017-01-01 3 +3285_Ruth_Wolfe 2016-02-01 9 +Anderson_da_Silva_Gibin 2016-08-01 73 +5001st_Composite_Group 2017-03-01 4 +Danzik 2016-04-01 8 +4810_Ruslanova 2016-03-01 2 +Arkendale,_Virginia 2016-04-01 14 +Al_Francis_Bichara 2016-09-01 239 +Cayena 2017-01-01 1 +A_Glass_of_Darkness 2017-04-01 95 +GMC_CCKW 2017-01-01 887 +Alabama_State_Route_107 2015-11-01 13 +2011_in_motorsport 2017-12-01 26 +Adecco_General_Staffing,_New_Zealand 2017-12-01 86 +Anbargah 2015-10-01 6 +1995_Asian_Cup_Winners_Cup 2016-06-01 7 +1986_Wales_rugby_union_tour_of_the_South_Pacific 2016-12-01 30 +Adya_Goud_Brahmin 2017-03-01 2 +Akcakiraz 2015-08-01 5 +24249_Bobbiolson 2017-12-01 4 +Ahmanson_Theatre 2016-02-01 801 +Abdullah_ibn_Jahsh 2016-10-01 196 +1937_in_Chile 2015-08-01 24 +2000_in_England 2016-01-01 57 +A_Deepness_In_The_Sky 2017-08-01 2 +Area_code_678 2015-07-01 480 +Avalon_Hill 2017-01-01 880 +Anna,_Duchess_of_Prussia 2015-12-01 315 +Alexandr_Syman 2017-04-01 24 +7400_series_logic 2017-11-01 2 +Greenleaf_Township,_Minnesota 2017-01-01 1 +Acetylsal 2017-04-01 6 +Earth_and_Man_National_Museum 2016-11-01 43 +Affetside 2015-10-01 185 +1971_CFL_season 2015-08-01 202 +Beth_Bader 2016-11-01 21 +Enrolled_Nurse 2016-04-01 5 +Al-Azraq 2016-12-01 22 +4th_South_Carolina_Regiment 2015-07-01 42 +Amanda_Overmyer 2017-02-01 356 +Auto_wrap 2016-02-01 8 +Anonymous_internet_banking 2015-07-01 98 +Curatoria 2016-11-01 3 +A-roll 2016-05-01 134 +Accra_hearts_of_oak_sc 2017-10-01 4 +Apostasy_from_Judaism 2015-12-01 45 +Acantharctia_tenebrosa 2018-01-01 3 +Abigail_Keasey_Frankel 2017-11-01 25 +2008_Paraguayan_general_election 2016-01-01 1 +Adams_motor 2015-09-01 37 +Drummond_Community_High_School 2017-01-01 17 +Andrews_Nakahara 2017-10-01 474 +10th_Maccabiah 2017-04-01 30 +Ackerman,_Rick 2015-08-01 4 +Dumri,_Buxar 2016-11-01 35 +Asking_Jesus_into_your_heart 2016-09-01 1 +Adamowicz_brothers 2016-12-01 161 +Alien_Musibat 2017-12-01 2 +Ahmad_Al_Tayer 2016-04-01 39 +Analytical_phonics 2016-01-01 520 +Do_It_Good 2016-04-01 281 +2004_Kumbakonam_School_fire 2017-12-01 2114 +1977_Chattanooga_Mocs_football_team 2016-08-01 3 +Globe_valves 2017-01-01 11 +Abelmoschus_crinitus 2016-04-01 18 +1874_Yale_Bulldogs_football_team 2016-02-01 37 +Climer 2017-06-01 1 +Auchroisk 2017-06-01 37 +2010_Albirex_Niigata_season 2016-10-01 19 +Adhocracy 2017-06-01 2217 +Chios_Massacre 2015-07-01 1110 +African_Red_Slip 2017-02-01 221 +1976_Portland_Timbers_season 2016-07-01 41 +Alsace-Larraine 2015-09-01 2 +3750_Ilizarov 2017-07-01 12 +Aleksandr_Shkaev 2017-05-01 1 +32_bar_form 2016-01-01 12 +Aequatorium_jamesonii 2018-03-01 14 +Abade_neiva 2016-09-01 2 +Arakvaz 2016-08-01 23 +207_Sqn 2017-10-01 2 +Ducal_hat 2016-11-01 10 +2_Degrees 2017-03-01 19 +Ahmeddiyya_Islam 2016-03-01 4 +Amidi-ye_Kohneh 2017-11-01 13 +Contributions_to_Indian_Sociology 2016-11-01 42 +Clark_Leiblee 2016-04-01 5 +Abraham_of_Strathearn 2017-09-01 14 +Bangor_City_Forest 2015-07-01 34 +Alireza_Afzal 2017-02-01 24 +Akhaura-Laksam-Chittagong_Line 2015-09-01 30 +1973_National_500 2017-10-01 80 +Attachment 2017-09-01 1356 +Kellett_Strait 2017-01-01 5 +Ajarani_River 2018-01-01 30 +Akbarabad,_Khomeyn 2017-03-01 8 +Adriaan_Theodoor_Peperzak 2018-02-01 88 +Alucita_dryogramma 2015-09-01 1 +Brit_Med_J 2015-07-01 1 +4th_Metro_Manila_Film_Festival 2015-09-01 80 +Alialujah_Choir 2018-03-01 221 +1953-54_SM-sarja_season 2016-09-01 1 +Air_Force_Song 2018-02-01 19 +4-6_duoprism 2016-03-01 30 +Ashley_Spurlin 2017-06-01 94 +Asfaq_Kayani 2017-10-01 1 +1607_in_architecture 2016-06-01 7 +4-way_speakers 2015-10-01 2 +Blue_Heeler 2015-07-01 149 +5_Euro 2017-04-01 16 +2009_Spa-Francorchamps_GP2_Series_round 2016-04-01 12 +2015_Guru_Granth_Sahib_desecration 2015-11-01 6821 +Agriculture_Marketing_Service 2016-07-01 2 +2006_Football_League_Cup_Final 2015-11-01 1711 +2008_Uber_Cup_group_stage 2016-02-01 40 +1923_PGA_Championship 2016-08-01 97 +Fannie_Bay 2016-04-01 6 +AlchemyAPI 2016-04-01 344 +Cinema_of_Italy 2017-01-01 1217 +Arodes 2016-11-01 36 +Damien_Marley 2015-07-01 168 +Al_Jumayl_Baladiyat 2015-08-01 5 +2015_Alabama_State_Hornets_football_team 2017-06-01 32 +Aglossa_tanya 2016-03-01 1 +73rd_Pennsylvania_Infantry 2017-01-01 12 +2015_European_Junior_and_U23_Canoe_Slalom_Championships 2018-02-01 31 +African_Leopard 2016-08-01 64 +Faverolles,_Orne 2017-01-01 5 +Aaron_Fukuhara 2015-11-01 17 +Annular_ligaments_of_trachea 2017-01-01 31 +2014_US_Open_Series 2016-11-01 35 +A_Better_Mousetrap 2018-02-01 4 +Dibaklu 2016-11-01 1 +At_Samat_District 2015-06-01 35 +Aaron_Peasley 2017-05-01 32 +Apistomology 2015-12-01 2 +Buyat_Bay 2015-07-01 54 +1942_Estonian_Football_Championship 2017-05-01 22 +Action_for_Autism 2016-06-01 346 +100_Hz 2015-06-01 72 +2003_Arizona_State_Sun_Devils_football_team 2017-05-01 82 +Antona_obscura 2016-09-01 1 +Akiko_Sugiyama 2015-12-01 32 +Elysburg 2016-11-01 8 +2017_New_South_Wales_Cup 2017-09-01 38 +2011-12_Gold_Coast_United_FC_season 2017-06-01 1 +Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean 2016-04-01 15 +Albert_Dunn 2017-08-01 87 +Hahamakin_ang_Lahat 2017-01-01 984 +2013_Spuyten_Duyvil_derailment 2017-11-01 5 +Ayling 2017-01-01 5 +Anti-Establishment 2016-10-01 1 +1951_Spanish_motorcycle_Grand_Prix 2018-01-01 48 +2009-10_Brunei_Premier_League 2017-08-01 4 +23_Ursae_Majoris 2016-08-01 90 +1927-28_Austrian_football_championship 2017-08-01 4 +Andrew_McKeever 2017-10-01 3 +Clinocottus 2017-06-01 23 +2006_State_of_Origin 2015-11-01 7 +2013-14_Los_Angeles_Clippers_season 2015-07-01 8 +Cor_Jesu 2017-01-01 1 +Besseringen_B-Werk 2017-06-01 158 +Amy_Hempel 2017-07-01 1091 +Franc-Comtois 2016-04-01 2 +Allium_giganteum 2017-07-01 1103 +Abishai 2016-08-01 56 +Abraham_Clark_High_School 2016-04-01 88 +Baku_chronology 2015-06-01 1 +22nd_MEU 2015-10-01 39 +2015_Open_Engie_de_Touraine 2015-10-01 195 +Churchill_Bowl 2017-06-01 30 +AGMARK 2017-08-01 117 +American_standard_wire_gauge 2017-12-01 3 +Araby,_LA 2015-05-01 2 +217_BC 2016-12-01 202 +2008_Trinidad_and_Tobago_League_Cup 2016-02-01 6 +Alazan_Bay 2015-12-01 22 +Aluminum_fencing 2015-11-01 48 +Achilles_tendinitis 2016-10-01 5884 +AFP_Peacekeeping_Operations_Center 2017-01-01 64 +2013_Xinjiang_clashes 2016-01-01 1 +Arborea_Giudicato_of_Arborea 2015-09-01 3 +1941_Cleveland_Rams_season 2017-06-01 40 +Ju_Posht,_Rasht 2017-01-01 3 +Ascalenia 2016-07-01 10 +Aplectoides 2018-02-01 4 +European_Cup_1969-70 2016-11-01 14 +Armen_Mkertchian 2016-05-01 9 +2015_Aspria_Tennis_Cup_-_Singles 2018-02-01 1 +14_August_1947 2017-11-01 6 +Adobe_Creative_Suite_1 2015-05-01 1 +IC_chips 2017-01-01 2 +Austo_AE300 2016-07-01 4 +Date_palms 2015-07-01 79 +BCS_bowl_game 2017-06-01 13 +AR_Border 2017-06-01 1 +Aranda_de_Duero 2016-04-01 256 +1919_Wake_Forest_Demon_Deacons_football_team 2016-01-01 16 +All_The_Wrong_Clues_For_The_Right_Solution 2017-10-01 9 +Allan_Campbell_McLean 2015-06-01 131 +Bradford_Council_election,_2011 2017-06-01 5 +Astronomy_and_astrophysics 2015-09-01 62 +Dutch_Antillean_people 2015-07-01 57 +Army_Radio 2018-03-01 711 +BBVA_Bancomer 2016-11-01 709 +Lake_Aloha 2017-01-01 30 +Andy_Bean 2018-02-01 3092 +1941_Pittsburgh_Steelers_season 2016-05-01 147 +Aniopi_Melidoni 2016-06-01 4 +Aglossosia_fusca 2017-09-01 3 +Art_books 2017-04-01 36 +1929_Washington_Senators_season 2017-04-01 47 +Antaeotricha_congelata 2016-12-01 10 +Douglas_C-54G-5-DO_Skymaster 2017-01-01 1 +Chris_Jamison 2016-11-01 827 +Ace_Blackwell 2015-11-01 9 +Abdul_Qadir_Fitrat 2018-02-01 32 +Arnoldo_Vizcaino 2017-10-01 1 +2012_Open_EuroEnergie_de_Quimper_-_Doubles 2017-12-01 3 +Dale_Rominski 2017-01-01 7 +ADHD_coaching 2015-06-01 50 +Claire_Yiu 2016-11-01 209 +Applicant 2015-10-01 253 +Apache_OpenOffice 2017-06-01 6031 +Abel_Kiprop_Mutai 2015-09-01 22 +Airdrome_Taube 2017-04-01 46 +Andrey_Viktorovich 2016-06-01 1 +American_Idol_controversy 2016-03-01 36 +Anthrenocerus_confertus 2018-01-01 17 +Appraisal_Subcommittee 2018-03-01 17 +Babusa 2015-07-01 3 +500_homeruns 2016-06-01 1 +Argentina_national_volleyball_team 2016-08-01 64 +Chief_prosecutor_of_Russia 2015-07-01 1 +Absolution_DVD 2015-06-01 1 +1,3-Beta-glucan_synthase 2017-05-01 440 +Dave_Sinardet 2016-04-01 26 +Adeline_Whitney 2018-03-01 10 +Allon_shvut 2016-07-01 3 +2012_Penn_State_Nittany_Lions_football_season 2017-12-01 3 +Coleman-Franklin-Cannon_Mill 2017-01-01 4 +Action_director 2015-05-01 93 +AD_547 2016-01-01 1 +Acta_germanica 2017-09-01 1 +Abu_Dhabi_Global_Market_Square 2017-01-01 35 +Kozo_Shioya 2017-01-01 7 +China_Investment_Corp 2017-01-01 2 +Dmitri_Zakharovich_Protopopov 2016-04-01 129 +Anatra_Anadis 2017-10-01 208 +Archaikum 2017-11-01 5 +2000_Webby_Awards 2017-04-01 360 +2003_BCR_Open_Romania_-_Singles 2016-08-01 2 +Abacetus_bisignatus 2016-09-01 79 +American_school_of_kinshasa 2016-01-01 1 +Anna,_7th_Duchess_of_Bedford 2016-08-01 8 +Black_majority_district 2016-11-01 3 +Dagma_Lahlum 2015-07-01 1 +Credit_Saison 2015-07-01 517 +Ariyankuppam_firka 2016-02-01 19 +Annette_Fuentes 2016-06-01 17 +Angerstein,_John 2015-12-01 2 +Annenkov_Island 2016-03-01 280 +Anne_Frank_museum 2016-06-01 67 +Annales_sancti_Amandi 2017-06-01 22 +L-FABP 2017-01-01 1 +Alvord,_TX 2017-06-01 12 +2006_World_Team_Table_Tennis_Championships 2016-05-01 119 +Angriffen 2015-12-01 9 +Anthony_Oppenheimer 2017-03-01 452 +Absamat_Masaliyevich_Masaliyev 2016-09-01 1 +Airborne_Museum_at_Aldershot 2016-03-01 41 +Aktiubinsk_Oblast 2015-08-01 7 +100_East_Wisconsin 2015-05-01 782 +7th_Bangladesh_National_Film_Awards 2017-08-01 91 +Alejandro_Reyes 2017-12-01 35 +Applied_philosophy 2018-03-01 539 +Adhemar_Pimenta 2016-06-01 146 +Break_the_fourth_wall 2016-04-01 66 +Annoushka_Ducas 2017-10-01 411 +ATC_code_J01CA01 2015-06-01 1 +Evelyn_County,_New_South_Wales 2016-11-01 7 +Elastic_scattering 2016-11-01 1374 +1032_Pafuri 2015-07-01 35 +Andrew_Bromwich 2015-08-01 26 +Ishita_Arun 2017-01-01 249 +Aspergics 2016-07-01 1 +1857_in_Chile 2018-03-01 22 +Breffni 2015-07-01 38 +845_in_poetry 2017-08-01 2 +20321_Lightdonovan 2015-10-01 12 +Arthur_Chandler 2017-12-01 27 +CsISOLatin2 2017-06-01 1 +1900_Grand_National 2016-06-01 69 +Aeritalia_AMX 2017-03-01 3 +B_Sharps 2015-06-01 11 +544_area_code 2015-09-01 2 +30th_Guldbagge_Awards 2015-06-01 37 +Agrippina 2017-08-01 315 +Ardmore 2016-02-01 433 +Amplypterus_panopus 2016-03-01 23 +Alexander_Bukharov 2017-09-01 5 +Alaska_Raceway_Park 2017-01-01 46 +Albanian_National_Road_Race_Championships 2017-03-01 31 +1968_Democratic_National_Convention_protest_activity 2017-10-01 2802 +2012_Birthday_Honours 2017-10-01 427 +2000_NHL_expansion_draft 2017-06-01 1 +A_Town_Where_You_Live 2016-11-01 2920 +Ahmed_Shahzad 2018-03-01 25 +Elisabeth_Svendsen 2016-11-01 39 +2002_FINA_Synchronised_Swimming_World_Cup 2016-08-01 30 +Akatek 2017-04-01 10 +Animation_with_DAZ_Studio 2018-02-01 78 +Fergus_Craig 2016-11-01 119 +Ancel_Nalau 2015-11-01 5 +5171_Augustesen 2017-04-01 20 +Anne_McGuire 2017-11-01 329 +Australian_Photoplay_Company 2015-12-01 6 +1913_in_Canada 2017-04-01 137 +Arhopala_allata 2015-05-01 26 +Il_Paradiso_delle_Signore 2017-01-01 31 +Geri_Palast 2017-01-01 38 +Alan_Abela_Wadge 2017-03-01 77 +22nd_Tactical_Air_Support_Squadron 2017-10-01 7 +Avant_Stellar 2017-06-01 22 +Black_phantom_tetra 2016-11-01 205 +Billy_McCaffrey 2017-01-01 314 +Annie_Furuhjelm 2017-11-01 97 +1992_PGA_Tour 2017-12-01 307 +2008_Chilean_pork_crisis 2016-01-01 55 +2012_Currie_Cup_First_Division 2018-02-01 32 +Aleksei_Fomkin 2015-05-01 144 +Alexander_Krausnick-Groh 2016-05-01 101 +Adam_Richard_Wiles 2017-08-01 5 +ATCvet_code_QA01AD01 2015-09-01 2 +Abu_Bakr_Ibn_Bajja 2017-03-01 5 +Architecture-Studio 2016-04-01 94 +950s_BC 2016-02-01 257 +Abschwunges 2017-07-01 1 +Adonis_Geroskipou 2017-06-01 15 +2008-09_SV_Werder_Bremen_season 2016-03-01 3 +Closed_loops 2016-04-01 1 +AFC_Youth_Championship_1982 2015-12-01 10 +Aquila_Shoes 2015-08-01 209 +9842_Funakoshi 2017-12-01 11 +Educational_quotient 2016-04-01 21 +Antoni_Julian_Nowowiejski 2018-01-01 211 +Adi_Oka_Idhile 2017-11-01 16 +DEXIA-BIL_Luxembourg_Open 2016-11-01 3 +Andrew_James_Simpson 2016-03-01 43 +Alexander_Boksenberg 2017-12-01 61 +1827_in_Denmark 2017-03-01 39 +Afternoon_tea_with_suggs 2017-11-01 3 +Alpha,_MN 2017-06-01 6 +Ari_Onasis 2015-06-01 4 +1961-62_Football_League_First_Division 2015-11-01 1 +Andi_Lila 2015-06-01 2847 +A_Gathering_Of_Old_Men 2018-02-01 1 +Abul_Fazl_al-Abbas 2017-01-01 1 +Asgill,_Charles 2017-08-01 1 +Alexander_Arkhangelsky 2015-07-01 12 +1947-48_Portuguese_Liga 2015-06-01 1 +3rd_MMC_-_Varna 2016-07-01 3 +Alberts,_Wayne 2017-05-01 3 +Alois_Schickelgruber 2018-02-01 9 +Hefner_Stadium 2017-01-01 2 +410912_Lisakaroline 2018-02-01 26 +Academy_at_Mountain_State 2018-03-01 1 +617_Squadron 2016-05-01 489 +Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji 2015-07-01 5 +Arturo_Merino_Benitez_Airport 2017-10-01 13 +AEK_Athens_Futsal 2015-06-01 10 +Aggaeus 2018-02-01 2 +Association_for_Retarded_Citizens_of_the_United_States 2017-08-01 3 +Kielce_pogrom 2017-01-01 335 +1351_in_poetry 2016-01-01 17 +1923_Princeton_Tigers_football_team 2017-11-01 41 +Auzata_semipavonaria 2017-01-01 2 +892_in_poetry 2016-01-01 6 +Anton_Krotiak 2017-12-01 2 +Arthur_Shelley 2017-12-01 23 +2003_Kyoto_Purple_Sanga_season 2018-02-01 9 +Frederic_Bowker_Terrington_Carter 2016-04-01 6 +2-orthoplex 2016-03-01 1 +Acacia_australiana 2015-09-01 4 +2012_Newcastle_Knights_season 2016-06-01 103 +Ann_Wrights_Corner,_Virginia 2017-07-01 19 +12557_Caracol 2017-03-01 5 +2001_African_Footballer_of_the_Year 2017-05-01 1 +Bass_Pyramid 2017-01-01 22 +A_noodle 2015-05-01 5 +Aed_Bennan 2018-02-01 2 +1886_Yale_Bulldogs_football_team 2017-10-01 58 +2002_Players_Championship 2016-06-01 54 +African_Skimmer 2017-07-01 2 +3rd_Guldbagge_Awards 2016-12-01 39 +Arrows_A19B 2015-10-01 1 +Archduchess_Elisabetta_of_Austria-Este 2017-08-01 1526 +America_Islands 2015-11-01 1 +1932_Olympic_Games 2016-01-01 9 +2011_Chinese_pro-democracy_protests 2015-11-01 2044 +Bank_walkaway 2016-04-01 113 +594_in_Ireland 2017-04-01 1 +Association_of_Municipal_Corporations 2016-12-01 5 +Andreas_Brantelid 2015-09-01 167 +Amarthal_urf_Unchagaon 2017-05-01 82 +3-methoxymorphinan 2017-04-01 146 +2382_BC 2016-07-01 10 +1763_in_science 2016-07-01 28 +Arvert 2017-04-01 77 +Ale_yeast 2017-12-01 19 +A_Man_Without_a_Soul 2018-03-01 17 +Air_Force_Base_Louis_Trichardt 2017-09-01 1 +Athirson_Mazzoli_de_Oliveira 2017-06-01 3 +Anthony_Chan_Yau 2017-07-01 181 +Basic_Enlisted_Submarine_School 2017-06-01 392 +Aboriginal_Lands_of_Hawaiian_Ancestry 2015-09-01 11 +Fondren_Southwest,_Houston 2017-01-01 4 +3_World_Financial_Center 2017-07-01 64 +1971_IIHF_European_U19_Championship 2017-09-01 9 +1937-38_Allsvenskan 2015-12-01 6 +Christopher_Ashton_Kutcher 2017-06-01 2 +Australian_rules_football_in_south_australia 2016-12-01 1 +Amicable_pair 2018-01-01 7 +Alan_Tomes 2015-11-01 82 +Alexei_Petrovich,_Tsarevich_of_Russia 2015-12-01 3887 +Alexis_Damour 2015-10-01 66 +Bankruptcy_Act_of_1938 2017-06-01 76 +Amphiphyllum 2016-06-01 14 +Conway_High_School_West 2016-04-01 1 +5447_Lallement 2015-11-01 10 +Gabriel_Iddan 2017-01-01 1 +1879-80_Scottish_Cup 2017-04-01 3 +2011_Eneco_Tour 2016-10-01 31 +1471_in_England 2015-11-01 94 +Ashland_Town_Hall 2017-01-01 5 +Archduke_John 2015-05-01 20 +2000_Cameroonian_Premier_League 2017-09-01 18 +1997_flood 2017-11-01 5 +Agile_management 2015-09-01 26677 +Am_841 2017-12-01 3 +Apprentice_Mason 2018-01-01 4 +Hales-Jewett_theorem 2017-01-01 2 +Alien_Abductions 2017-10-01 14 +Arjun_Menon 2016-02-01 370 +Anthokyan 2016-01-01 4 +Automobili_Lamborghini 2016-02-01 1110 +Alain_Prost 2017-04-01 25196 +Fartein_Valen 2016-04-01 90 +Antonio_Galli_da_Bibiena 2016-05-01 5 +Al_Jawf,_Libya 2017-03-01 600 +AD_695 2018-02-01 1 +Amir_chand 2015-11-01 1 +Alcis_obliquisigna 2017-08-01 1 +Chandra_Talpade_Mohanty 2017-01-01 306 +Algerian_safe_house,_Jalalabad 2015-06-01 3 +Jake_Milner 2017-01-01 1 +Alternate_Communications_Center 2017-10-01 1 +In_the_Bleachers 2017-01-01 42 +Alex_Puodziukas 2016-04-01 7 +Altarpiece_of_Pilgrim_II 2018-02-01 2 +Cybernetical_Physics 2017-01-01 3 +Christopher_Unthank 2017-06-01 2 +1982_Independence_Bowl 2015-06-01 102 +Ascoli_Calcio_1898 2018-03-01 1115 +Briggs-Rauscher_reactions 2017-06-01 1 +Adjadja 2018-02-01 45 +Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed 2016-06-01 3 +Catholic_social_doctrine 2017-01-01 6 +2833_BC 2016-11-01 1 +Bethy_Woodward 2016-04-01 38 +Bateman_polynomials 2017-06-01 22 +1966_Buenos_Aires_Grand_Prix 2015-10-01 19 +A_River_Somewhere 2015-10-01 353 +2016-17_BVIFA_National_Football_League 2017-04-01 2 +1909_Major_League_Baseball_season 2015-10-01 362 +1988_Oklahoma_Sooners_football 2017-11-01 2 +2010s_in_Chechen_fashion 2016-10-01 1 +Accademia_Olimpica 2017-08-01 17 +Air_cooling 2015-07-01 2010 +Amir_Saoud 2016-11-01 22 +Alex_Auburn 2015-05-01 52 +Apamea_impulsa 2016-11-01 6 +Australian_federal_election,_2007 2015-07-01 1794 +Ain_Sakhri 2017-10-01 76 +Belosaepiidae 2015-07-01 68 +Acts_of_Parliament_in_the_United_Kingdom 2017-10-01 4070 +Equity_Office 2016-11-01 202 +David_Bintley 2017-01-01 51 +Aksel_Schiotz 2018-03-01 3 +Appropriation_Act_2000 2017-05-01 12 +Edward_Johnson_III 2016-11-01 491 +2006_Ohio_State_Buckeyes_football_team 2016-03-01 1452 +Battle_of_Fort_Beausejour 2015-07-01 97 +Abel_Foullon 2015-12-01 82 +Apollo_VIII 2015-10-01 19 +Carry_on_up_the_jungle 2015-07-01 8 +Armour_villa 2017-05-01 4 +201_Poplar 2015-08-01 265 +Arta_prefecture 2016-08-01 1 +2015-16_Ekstraklasa 2018-02-01 13 +Alport,_Ontario 2018-02-01 2 +Bongoland 2017-06-01 62 +Alfred_Charles_Post 2016-11-01 11 +Aam_Aadmi_Party_crisis 2016-10-01 1 +Andrea_Moda 2015-07-01 143 +Abdul_Halim_Sharar 2017-08-01 545 +Apostolic_Vicariate_of_Yunnan 2016-12-01 1 +Catherine_Steadman 2016-11-01 5218 +Agastachys_odorata 2015-10-01 38 +9783_Tensho-kan 2016-03-01 2 +AFL_Cairns 2017-10-01 337 +Abomey 2015-06-01 1062 +Anne_Crofton,_1st_Baroness_Crofton 2015-12-01 42 +Cash-flow_return_on_investment 2017-01-01 137 +Alberto_Arvelo_Torrealba_Municipality 2015-08-01 56 +Abyssinian_Shorthorned_Zebu 2017-09-01 124 +Albanian_hip_hop 2016-01-01 1812 +Alphonso_IV_of_Portugal 2016-02-01 12 +19th_The_Alberta_Mounted_Rifles 2016-10-01 1 +Chinese_shadow_theatre 2016-04-01 1 +American_Committee_of_the_Fourth_International 2017-08-01 4 +2014_Bahrain_GP2_Series_round 2016-03-01 80 +Alexandrian_orthodox 2017-09-01 2 +2010_Hurricane_Season 2015-05-01 18 +1938_All-Ireland_Senior_Camogie_Championship_Final 2017-01-01 1 +ATC_code_D01 2018-01-01 203 +Albedo 2015-08-01 23484 +Chavigny,_Meurthe-et-Moselle 2017-01-01 12 +Becky_Essex 2015-07-01 51 +Archaeological_Museum_Padre_Le_Paige 2018-02-01 2 +Abu_Bakar_Sillah 2017-01-01 5 +Back_chat 2017-01-01 2 +Anchylobela_dyseimata 2015-12-01 11 +Anthony_Overton 2017-03-01 261 +Bear_maul 2016-04-01 3 +Ambarawa,_Central_Java 2016-01-01 1 +Amber_lager 2016-11-01 87 +2nd_LAAD 2017-09-01 8 +Ashiya,_Hyogo 2018-03-01 24 +Angels_at_Risk 2018-02-01 74 +Audrey_Marie_Munson 2016-03-01 17 +1984_Australian_Football_Championships 2017-01-01 27 +Ammonia_fountain 2016-06-01 434 +Allister_Bentley 2018-03-01 11 +Alsager_Hay_Hill 2016-10-01 72 +1753_English_cricket_season 2015-05-01 51 +2009-10_New_Jersey_Devils_season 2016-10-01 1 +An_Untamed_State 2016-05-01 1109 +Beatrice_Carmichael 2016-11-01 5 +Abdul_Ghani_Ahmad 2017-12-01 115 +Arteria_suralis 2017-02-01 3 +Berzasca_River 2017-01-01 1 +Angel_Attack 2015-09-01 98 +1969_San_Francisco_49ers_football_team 2017-11-01 1 +Anthony_Beilenson 2017-09-01 114 +Crystalline_Entity 2016-04-01 180 +Granice 2017-01-01 2 +203rd_General_Hospital 2017-07-01 44 +Acrocercops_rhombiferellum 2017-12-01 20 +Ampliglossum_blanchetii 2017-05-01 1 +11553_Scheria 2017-03-01 2 +Ashkenozi 2017-02-01 1 +2010_Calder_Cup_Playoffs 2018-01-01 9 +Alice_Caymmi 2016-01-01 121 +Alfredo_Alvar 2017-04-01 44 +2006_Legends_Tour 2017-07-01 30 +Albano_Albanese 2015-10-01 53 +1943_Frankford_Junction_train_wreck 2016-08-01 510 +Evans_Court_Apartment_Building 2016-04-01 4 +Abu_al-Rayhan_Muhammad_ibn_al-Biruni 2017-11-01 1 +Abubakar_Muhammad_Rimi 2015-05-01 4 +Dostpur 2016-11-01 26 +Accessories_Council_Excellence_Awards 2016-03-01 14 +2006_North_American_heat_wave 2015-06-01 1161 +Amstelodamum 2017-09-01 12 +A_Very_Peculiar_Practice 2016-08-01 1860 +Allegorie_der_Liebe 2015-09-01 1 +Alex_Mackie 2017-02-01 95 +1812_Homestead_Farm_and_Museum 2017-09-01 29 +Argus_distribution 2016-03-01 8 +Anthony_Thomas_Stover 2017-02-01 1 +Arthur_Shallcross 2016-11-01 20 +Antoine_Francois_Fourcroy 2018-01-01 1 +Abbas_Halim 2016-11-01 21 +Akiva_Baer_ben_Joseph 2017-08-01 1 +Balatonfuered 2016-11-01 3 +Antemnae 2017-11-01 204 +Cling_Cling 2017-06-01 93 +B_flat_major 2017-01-01 28 +AirExplore 2017-12-01 930 +Auckland_Super_Sprint 2015-11-01 120 +Alfredo_De_Gasperis 2017-12-01 793 +Geoffrey_I_of_Vianden 2017-01-01 5 +Copa_de_Zaachila 2016-04-01 6 +Alboacen 2017-09-01 1 +BNH_Hospital_Bangkok 2017-06-01 2 +Agricultural_health_and_safety 2016-09-01 1 +Chiasms 2017-06-01 2 +Al_Karaana 2016-05-01 58 +Alberta_Highway_872 2016-11-01 1 +Among_the_mourners 2016-03-01 1 +Achema_Power_Plant 2015-06-01 55 +ATSE_Graz 2017-10-01 65 +Arthroscopy 2017-02-01 11721 +2010-2012_European_Nations_Cup_Second_Division 2018-01-01 7 +1967_Cincinnati_Reds 2015-08-01 4 +24th_Golden_Disc_Awards 2017-05-01 71 +Johnny_Floyd 2017-01-01 17 +Arthur_Rupin 2016-02-01 5 +Alpine_skiing_at_the_2011_Canada_Winter_Games 2015-09-01 38 +College_Press_Service 2017-01-01 8 +American_Psycho 2015-08-01 55567 +CBC_Winnipeg 2017-06-01 17 +Burning_the_process 2016-04-01 1 +2011_Stanley_Cup_playoffs 2017-01-01 1036 +Andrew_Mumford 2017-01-01 6 +1925_in_fine_arts_of_the_Soviet_Union 2018-02-01 28 +Aragvi_river 2017-02-01 2 +Andrew_Adamson 2018-03-01 16269 +Arcides_fulvohirta 2016-10-01 1 +Araya_Selassie_Yohannes 2015-11-01 423 +Apartment_house 2016-09-01 85 +Advanced_Art 2015-12-01 171 +1028_Lydina 2015-06-01 53 +2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti 2017-04-01 2 +Adolph_Weiss 2015-06-01 98 +Adam_Jerzy_Czartoryski 2015-09-01 1237 +1980_United_States_presidential_election 2017-05-01 56 +1956_Oscars 2016-08-01 10 +Burundian_Senate_election,_2005 2016-04-01 1 +Amarolea_floridana 2015-07-01 3 +August_Bier 2015-12-01 514 +Arbelodes_sebelensis 2018-03-01 6 +Abiah_Brown 2018-02-01 1 +A_Maceo_Smith_High_School 2016-10-01 2 +1488_in_architecture 2017-12-01 6 +2009_AMP_Energy_500 2016-04-01 45 +1921_Baylor_Bears_football_team 2017-03-01 21 +Dmitry_Akhba 2015-07-01 43 +2004_Big_12_Conference_Baseball_Tournament 2016-07-01 37 +Abdisalam_Omer 2018-02-01 116 +Alma,_son_of_Alma 2015-08-01 53 +An_Phoblacht 2016-10-01 962 +2009_Turner_Prize 2016-01-01 75 +Jack_Zajac 2017-01-01 24 +1906_Wimbledon_Championships 2016-04-01 22 +Chuckwalla_Valley 2017-06-01 22 +Alien_Quadrology 2016-02-01 1 +Chalcidoptera_contraria 2016-04-01 1 +Alaska_Republican_Gubernatorial_Primary_Election,_2006 2016-02-01 1 +333639_Yaima 2018-02-01 7 +Aquila_hastata 2015-11-01 28 +Al-Fua 2017-07-01 1 +Anihilation 2015-07-01 28 +International_Toy_Fair 2017-01-01 1 +38th_Regiment_Indiana_Infantry 2017-01-01 10 +Andrea_Stella 2017-07-01 75 +Anselmo_de_Moraes 2015-09-01 562 +Applemore 2016-05-01 3 +Akpinar,_Kirsehir 2015-06-01 3 +Ant_nest 2016-05-01 53 +Catherine_of_Siena 2016-11-01 8806 +Barbos 2015-06-01 12 +Amlaib_mac_Iduilb 2017-08-01 2 +Alice_Janowski 2018-03-01 17 +Acacia_leptocarpa 2017-03-01 48 +Al-Hadi_Yahya 2016-01-01 39 +2015_British_Figure_Skating_Championships 2017-07-01 38 +Avenues_Television 2016-03-01 214 +Dendropsophus_sartori 2015-07-01 11 +1952_in_Germany 2015-05-01 63 +Armuchee_High_School 2016-04-01 27 +April_1_RFC 2017-11-01 2 +Caroline_Bliss 2016-11-01 972 +66th_Rice_Bowl 2016-06-01 17 +Alec_Smight 2017-02-01 173 +Alexei_Panin 2017-09-01 3 +Codeword 2016-04-01 84 +Dormice 2015-07-01 63 +2105_BC 2017-11-01 6 +5th_National_Congress_of_Kuomintang 2016-06-01 5 +Caminho_das_Indias 2017-01-01 5 +Agerbo 2017-11-01 2 +Abe_Anellis 2018-01-01 86 +Aceh_Medal 2015-07-01 33 +Alltech_Arena 2016-10-01 144 +Aly_Oury 2016-06-01 260 +757th_Troop_Carrier_Squadron 2017-07-01 2 +Alec_Peters 2017-12-01 2731 +Agua_Buena_Airport 2017-09-01 12 +Alessandro_Livi 2016-08-01 104 +Andkaer 2017-04-01 3 +Cateran 2017-06-01 135 +57th_Venice_International_Film_Festival 2017-04-01 180 +Brijal_Patel 2017-06-01 98 +Cnemaspis_jerdonii 2015-07-01 6 +Aluminum_sodium_salt 2016-10-01 3 +Arnaldo_Antonio_Sanabria_Ayala 2017-09-01 4 +Angels_of_Iron 2018-02-01 83 +Bugs_Bunny_Rabbit_Rampage 2017-06-01 422 +Admiralty_Class_Destroyer 2017-10-01 2 +Atlas_Media 2017-05-01 2 +Arcesilaus_i_of_cyrene 2017-03-01 1 +2011_Tajikistan_national_football_team_results 2017-04-01 13 +Artur_Shakhnazarov 2017-12-01 22 +747_Express_Bus 2018-03-01 20 +101-in-1_Party_Megamix 2017-10-01 188 +Fastpoint_Games 2016-11-01 32 +Analog_Anthology_1 2017-07-01 1 +Archival_bond 2015-09-01 119 +1985_Air_Force_Falcons_football 2017-09-01 4 +American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem 2017-06-01 3 +Adaptive_Evolution_in_the_Human_Genome 2017-08-01 2 +Arthur_Strangways 2015-11-01 5 +1583_in_poetry 2015-09-01 68 +Andrew_igoudala 2015-06-01 2 +Euonychophora 2016-11-01 37 +Catechizing 2016-04-01 4 +1960-61_ice_hockey_Bundesliga_season 2018-03-01 3 +Buk_Vlaka 2017-06-01 10 +Arbor_Day 2018-03-01 16265 +Guan_Sheng 2017-01-01 73 +2014_Barcelona_Open_Banc_Sabadell 2016-08-01 57 +1976-77_Nationalliga_A 2016-04-01 1 +AFL_records 2015-11-01 16 +2005_Tour_Down_Under 2016-10-01 26 +92_BCE 2015-08-01 4 +Bento_Box_Animation 2017-01-01 1 +Alabama_Territory 2018-03-01 1195 +Abdul-Wasa_Al-Saqqaf 2016-07-01 21 +Archbishops_of_Semarang 2017-01-01 6 +Ambivina 2017-10-01 13 +Aghjaghala_Ulia 2017-08-01 2 +Blechnum_novae-zelandiae 2016-11-01 26 +Dictyosome 2016-04-01 19 +Arts_Council_of_Great_Britain 2016-12-01 785 +LBC_Radio 2017-01-01 3 +Ageo,_Saitama 2016-06-01 396 +Babla_Mehta 2016-12-01 674 +2012-13_Russian_Cup 2018-01-01 10 +Chandragupt 2017-06-01 6 +407th_Air_Refueling_Squadron 2016-01-01 96 +Aftermarket 2016-07-01 1253 +A_Portrait_of_New_Orleans 2016-08-01 18 +2000-01_Yemeni_League 2017-03-01 1 +Actinidia_chinensis 2015-11-01 907 +Amsterdam_Tournament_1999 2018-03-01 1 +Arthur_Iberall 2017-02-01 112 +Auricula_Meretricula 2016-02-01 103 +Archbishop_of_Lahore 2016-09-01 8 +Chippewa_Indians_of_Montana 2016-04-01 9 +Abidjan-Niger_Railway 2018-01-01 22 +29th_Annual_Grammy_Awards 2017-05-01 1087 +Ateles_geoffroyi_frontatus 2017-06-01 3 +Enrico_Cernuschi 2016-11-01 3 +A4183_road 2017-02-01 8 +Ahrayut 2016-10-01 75 +Alison_Castle 2016-03-01 55 +Automobile_aftermarket 2016-10-01 5 +2008_GAINSCO_Auto_Insurance_Indy_300 2016-07-01 51 +1937_Scottish_Cup_Final 2017-04-01 126 +2005_Clipsal_500_Adelaide 2018-02-01 22 +Farid_Farjad 2016-04-01 120 +13_Tribes_of_Long_Island 2015-12-01 11 +Afroneta_bamilekei 2017-01-01 2 +Frederick_Stuart_Greene 2017-01-01 1 +Andre_Braugher 2017-04-01 37655 +1906_International_Lawn_Tennis_Challenge 2017-10-01 73 +2009-10_NFL_Playoffs 2016-01-01 69 +Cricket_Wellington 2016-11-01 2 +Craig_Blazer 2015-07-01 21 +Aeolidiella_orientalis 2017-05-01 3 +Andre_Prokovsky 2017-06-01 4 +Angela_McKee 2017-11-01 14 +Airbase_Golubovci 2016-10-01 1 +2011_ISAF_Sailing_World_Championships 2017-05-01 89 +Bartica_Airport 2017-06-01 27 +Agusan_Dam 2016-09-01 454 +Bosque_Real_Country_Club 2015-07-01 42 +Georges_Duhamel 2017-01-01 122 +Allrounder 2017-03-01 63 +2017_Missouri_State_Bears_football_team 2017-09-01 868 +Allons_a_Lafayette 2017-11-01 17 +Agathla 2015-05-01 105 +1086_in_poetry 2015-09-01 25 +Absolute_extreme 2017-09-01 1 +Agathe_Bonitzer 2017-12-01 229 +Chinese_Red_Pine 2017-06-01 18 +Angular_dispersion 2016-02-01 11 +Jean-Sebastian_Giguere 2017-01-01 2 +Actinium-235 2018-03-01 4 +Ago,_filo_e_nodo 2017-02-01 11 +Aranea_cruentata 2016-03-01 1 +2009_Korea_National_League 2017-11-01 19 +Americom-8 2016-08-01 28 +2006_Junee_Bushfire 2018-03-01 81 +2013_Major_League_Baseball_Home_Run_Derby 2017-09-01 182 +1928_US_Presidential_Election 2016-12-01 42 +After-eighty_generation 2016-02-01 127 +1932_Hawthorn_Football_Club_season 2017-07-01 16 +Amelia_Elizabeth_Mary_Rygate 2017-05-01 2 +Aline_Khalaf 2017-12-01 465 +Akron_Junction,_New_York 2017-07-01 56 +Apollo_moon_landing_conspiracy_theories 2015-09-01 4 +1978_National_League_Championship_Series 2017-03-01 325 +1959-60_German_football_championship 2017-08-01 5 +Almost_a_Bride 2017-01-01 1 +Andrew_Lysaght,_junior 2015-10-01 20 +1902_Otani_expedition 2018-02-01 1 +1892_Currie_Cup 2016-09-01 53 +1988_USC_Trojans_football_team 2016-10-01 494 +1944_in_Northern_Ireland 2016-12-01 46 +Alfred_Acherman 2017-07-01 1 +Arcadia,_Nebraska 2017-02-01 148 +4_x_400_metre_relay 2018-03-01 1 +A4030_road 2016-07-01 1 +Chi-li 2016-11-01 3 +Aircraft_fairing 2016-11-01 1861 +Buddhism_in_Belize 2015-07-01 40 +Alameda_County_Open 2017-02-01 33 +Area_of_countries_and_regions_of_the_United_Kingdom 2017-10-01 6 +2014_Weber_State_Wildcats_football_team 2016-10-01 47 +American_Journal_of_Comparative_Law 2016-04-01 62 +A_Teaspoon_Every_Four_Hours 2017-03-01 47 +Astasis 2016-03-01 1195 +Akhrakouaeronon 2015-11-01 62 +Annenkrone 2016-03-01 40 +Ballotine 2016-12-01 4753 +2000_Kipawa_earthquake 2015-11-01 139 +Archdiocese_of_cashel_and_emly 2017-01-01 1 +Chevrolet_SS396 2017-01-01 1 +Achyroseris 2016-03-01 1 +Daniel_Pulteney 2016-11-01 29 +2006_Major_League_Baseball_draft 2017-07-01 10637 +Adetunji_Idowu_Olurin 2016-01-01 37 +Ardatov,_Nizhny_Novgorod_Oblast 2017-04-01 18 +Andrew_Hilditch 2015-08-01 398 +A_Very_Merry_Daughter_Of_the_Bride 2017-04-01 67 +1993_in_radio 2017-08-01 85 +Deltan 2016-11-01 91 +Adnan_Custovic 2017-12-01 26 +Di_Gennaro 2017-01-01 4 +237_AD 2017-11-01 1 +Aaron_Gombar 2018-03-01 2 +Acrolophus 2017-04-01 47 +Alfred_Bergman 2017-06-01 27 +Charles_Bebb 2017-06-01 39 +Dirico 2017-01-01 24 +1982_Major_League_Baseball_Draft 2016-12-01 90 +DDT_wrestling 2016-11-01 4 +1988-89_Houston_Rockets_season 2016-02-01 10 +Acacia_loderi 2015-11-01 35 +2015_Deauville_American_Film_Festival 2016-10-01 126 +Andropadus_importunus 2016-02-01 9 +Antonio_Bacchetti 2017-04-01 52 +Ann_Trindade 2015-09-01 49 +5_x_Monk_5_x_Lacy 2016-05-01 37 +Barlochan,_Ontario 2017-06-01 2 +Achaian 2017-03-01 35 +Flow_rider 2017-01-01 1 +Antiblemma_discerpta 2018-02-01 1 +1997_Illinois_Fighting_Illini_football_team 2017-11-01 331 +Ahrntal 2016-03-01 540 +Apollo_Conference 2015-10-01 329 +Algenib_in_Perseus 2016-01-01 1 +Craig_Norgate 2016-04-01 42 +Antwerp_Zoo 2015-12-01 879 +Cold_Contagious 2017-06-01 161 +Bolito 2016-11-01 181 +Chinese_bridges 2016-11-01 1 +14th_Indiana_Infantry_Regiment 2017-04-01 115 +Bindunuwewa_massacre 2015-07-01 52 +Eastshore_Highway 2016-11-01 2 +Daemonologie 2017-01-01 1655 +Aero_Pacifico 2015-07-01 1 +Blue_Ribbon_Schools_Program 2017-06-01 557 +Ash_Township,_MI 2018-02-01 3 +Al-Hatab_Square 2018-02-01 450 +Alje_Vennema 2018-02-01 187 +1920_All-Ireland_Senior_Football_Championship_Final 2016-05-01 40 +Criss_Oliva 2016-11-01 801 +Bethlehem,_Ohio 2017-01-01 16 +1976_WHA_Amateur_Draft 2015-08-01 47 +Angela_Fimmano 2017-06-01 17 +Alexander_Bonini_of_Alexandria 2017-09-01 1 +Anarchist_faq 2015-05-01 13 +Aleksander_Benedykt_Sobieski 2016-05-01 240 +Cape_Florida_Lighthouse 2016-04-01 6 +Fernando_VI_of_Spain 2017-01-01 3 +Crossing_number 2017-06-01 29 +1984_NSL_Cup 2017-05-01 26 +Barbara_Weldon 2015-06-01 29 +Andreas_Olsen 2017-01-01 32 +Battle_of_Baima 2016-04-01 2 +Amory_Hansen 2016-05-01 26 +Akhmimic 2015-11-01 41 +Al_Awda 2018-02-01 18 +Adelheid-Marie_of_Anhalt-Dessau 2016-07-01 70 +Americans_for_Technology_Leadership 2015-10-01 90 +Belizean_diplomatic_missions 2017-06-01 3 +African_communist 2016-05-01 3 +Andosol 2016-09-01 246 +Alan_Attraction 2016-05-01 15 +A_Yank_in_Rome 2015-12-01 70 +2004_in_the_United_Arab_Emirates 2018-02-01 33 +Additionality 2017-06-01 371 +Assassination_of_Trotsky 2015-06-01 47 +Alice_Sotero 2018-02-01 27 +Agyneta_platnicki 2016-04-01 4 +Alexandra_Vasilyevna_Velyaminova 2015-07-01 30 +1881_in_Chile 2016-06-01 16 +Arterial_ischemic_stroke 2018-01-01 57 +Astro_Glacier 2015-09-01 27 +Chester_Earl_Merrow 2017-06-01 58 +Alejandro_de_la_Madrid 2015-11-01 1630 +70936_Kamen 2017-08-01 1 +AK_Steel_Holding_Corp 2015-08-01 8 +1124_Stroobantia 2017-10-01 23 +Asian_Wedding 2016-10-01 15 +23837_Matthewnanni 2015-10-01 18 +Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden 2017-03-01 4893 +Betsy_Hodges 2016-04-01 560 +Arthur_and_the_Invisibles 2015-08-01 14924 +Arkansas-Ole_Miss_football_rivalry 2015-05-01 7 +Asia_Cup 2015-09-01 5938 +Arginine_racemase 2016-12-01 15 +585th_Field_Company,_Royal_Engineers 2018-03-01 1 +1975_Stagg_Bowl 2017-08-01 6 +Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath 2017-01-01 1 +Askajian 2016-02-01 26 +2006_Nebraska_Cornhuskers_football_team 2015-08-01 975 +Cicero_Francis_Lowe_House 2015-07-01 10 +Conan_IV,_Duke_of_Brittany 2016-11-01 252 +2005_World_Modern_Pentathlon_Championships 2016-07-01 38 +1946_Aleutian_Islands_earthquake 2017-03-01 2019 +ANKRD17 2017-09-01 19 +1970_Maryland_Terrapins_football_team 2017-11-01 42 +Ali_Dehkhoda 2017-04-01 1 +1244_in_art 2015-07-01 22 +1520s_in_Denmark 2016-01-01 20 +Abdoulaye_Gaye 2017-12-01 10 +An_Angel_Has_Arrived 2016-03-01 36 +1453_BC 2015-08-01 26 +2017_National_Games_of_China 2017-05-01 1293 +A_Night_in_Sickbay 2016-05-01 251 +Dateline_Diamonds 2017-01-01 53 +419_guestbook_spamming 2016-02-01 5 +Familiar_bluet 2017-01-01 4 +Abu_Bakr_Mirza 2017-10-01 86 +7272_Darbydyar 2017-11-01 4 +Ages_of_consent_in_Latin_America 2017-03-01 961 +1982_Japan_Soccer_League_Cup 2016-04-01 14 +2810_BC 2015-07-01 9 +Druga_Liga_Republike_Srpske 2017-01-01 1 +1998_Swedish_Rally 2017-09-01 34 +1567_in_Norway 2015-10-01 89 +126_Army_Engineer_Regiment,_Royal_Engineers 2016-03-01 5 +2017_American_League_Wild_Card_Game 2017-10-01 25120 +August_Follen 2017-01-01 2 +Ala_Gertner 2015-11-01 876 +Glenwood,_Harford_County,_Maryland 2017-01-01 3 +Applied_ecology 2017-12-01 730 +Ariarathes_V_Eusebes_Philopator 2018-03-01 5 +2006_AFC_Champions_League 2017-09-01 947 +60_minutes_2 2016-10-01 2 +Embryonic_shield 2017-01-01 2 +2001_Meath_Intermediate_Football_Championship 2015-11-01 8 +Apparition_of_Christ_to_Madonna 2017-06-01 5 +Hoosier_Road_Elementary 2017-01-01 1 +Arua_Uda 2016-12-01 29 +Array_comprehension 2015-11-01 8 +Baszki 2015-06-01 36 +Akron_Neighborhoods 2016-01-01 4 +Catholic_Church_in_Costa_Rica 2017-06-01 85 +Canada-Sweden_relations 2015-07-01 1 +Barza_Radio_Community 2016-11-01 6 +Dalhousie_Middle_School 2016-11-01 5 +Alliphis_bakeri 2017-11-01 2 +Bartica_massacre 2017-06-01 53 +30th_January 2015-11-01 10 +1920_revolution 2017-05-01 5 +Amyraldism 2017-08-01 828 +AA_Jefferson_District 2016-05-01 45 +Eunebristis_cinclidias 2017-01-01 1 +A_Scott_Connelly 2017-06-01 5 +Antony_Durose 2016-07-01 19 +Arval_Brethren 2017-11-01 579 +Anthidium_dissectum 2017-05-01 2 +Aru,_Democratic_Republic_of_the_Congo 2017-04-01 81 +1956-57_West_Indian_cricket_season 2017-04-01 2 +2014_Moscow_Film_Festival 2017-08-01 2 +Anna_Gurji 2017-06-01 27 +Allen_Memorial_Medical_Library 2016-07-01 120 +Anton_Sistermans 2017-02-01 36 +Clotheshorses 2017-06-01 1 +36_Stratagems 2017-08-01 25 +Attack_of_the_crab_monsters 2016-10-01 16 +30_rock_awards 2015-09-01 2 +Aeroflot,_Uralsk_Civil_Aviation_Directorate 2017-08-01 2 +Amblyseius_parabufortus 2017-06-01 3 +Indian_coral_tree 2017-01-01 3 +3285_Ruth_Wolfe 2016-02-01 9 +Anderson_da_Silva_Gibin 2016-08-01 73 +5001st_Composite_Group 2017-03-01 4 +Danzik 2016-04-01 8 +4810_Ruslanova 2016-03-01 2 +Arkendale,_Virginia 2016-04-01 14 +Al_Francis_Bichara 2016-09-01 239 +Cayena 2017-01-01 1 +A_Glass_of_Darkness 2017-04-01 95 +GMC_CCKW 2017-01-01 887 +Alabama_State_Route_107 2015-11-01 13 +2011_in_motorsport 2017-12-01 26 +Adecco_General_Staffing,_New_Zealand 2017-12-01 86 +Anbargah 2015-10-01 6 +1995_Asian_Cup_Winners_Cup 2016-06-01 7 +1986_Wales_rugby_union_tour_of_the_South_Pacific 2016-12-01 30 +Adya_Goud_Brahmin 2017-03-01 2 +Akcakiraz 2015-08-01 5 +24249_Bobbiolson 2017-12-01 4 +Ahmanson_Theatre 2016-02-01 801 +Abdullah_ibn_Jahsh 2016-10-01 196 +1937_in_Chile 2015-08-01 24 +2000_in_England 2016-01-01 57 +A_Deepness_In_The_Sky 2017-08-01 2 +Area_code_678 2015-07-01 480 +Avalon_Hill 2017-01-01 880 +Anna,_Duchess_of_Prussia 2015-12-01 315 +Alexandr_Syman 2017-04-01 24 +7400_series_logic 2017-11-01 2 +Greenleaf_Township,_Minnesota 2017-01-01 1 +Acetylsal 2017-04-01 6 +Earth_and_Man_National_Museum 2016-11-01 43 +Affetside 2015-10-01 185 +1971_CFL_season 2015-08-01 202 +Beth_Bader 2016-11-01 21 +Enrolled_Nurse 2016-04-01 5 +Al-Azraq 2016-12-01 22 +4th_South_Carolina_Regiment 2015-07-01 42 +Amanda_Overmyer 2017-02-01 356 +Auto_wrap 2016-02-01 8 +Anonymous_internet_banking 2015-07-01 98 +Curatoria 2016-11-01 3 +A-roll 2016-05-01 134 +Accra_hearts_of_oak_sc 2017-10-01 4 +Apostasy_from_Judaism 2015-12-01 45 +Acantharctia_tenebrosa 2018-01-01 3 +Abigail_Keasey_Frankel 2017-11-01 25 +2008_Paraguayan_general_election 2016-01-01 1 +Adams_motor 2015-09-01 37 +Drummond_Community_High_School 2017-01-01 17 +Andrews_Nakahara 2017-10-01 474 +10th_Maccabiah 2017-04-01 30 +Ackerman,_Rick 2015-08-01 4 +Dumri,_Buxar 2016-11-01 35 +Asking_Jesus_into_your_heart 2016-09-01 1 +Adamowicz_brothers 2016-12-01 161 +Alien_Musibat 2017-12-01 2 +Ahmad_Al_Tayer 2016-04-01 39 +Analytical_phonics 2016-01-01 520 +Do_It_Good 2016-04-01 281 +2004_Kumbakonam_School_fire 2017-12-01 2114 +1977_Chattanooga_Mocs_football_team 2016-08-01 3 +Globe_valves 2017-01-01 11 +Abelmoschus_crinitus 2016-04-01 18 +1874_Yale_Bulldogs_football_team 2016-02-01 37 +Climer 2017-06-01 1 +Auchroisk 2017-06-01 37 +2010_Albirex_Niigata_season 2016-10-01 19 +Adhocracy 2017-06-01 2217 +Chios_Massacre 2015-07-01 1110 +African_Red_Slip 2017-02-01 221 +1976_Portland_Timbers_season 2016-07-01 41 +Alsace-Larraine 2015-09-01 2 +3750_Ilizarov 2017-07-01 12 +Aleksandr_Shkaev 2017-05-01 1 +32_bar_form 2016-01-01 12 +Aequatorium_jamesonii 2018-03-01 14 +Abade_neiva 2016-09-01 2 +Arakvaz 2016-08-01 23 +207_Sqn 2017-10-01 2 +Ducal_hat 2016-11-01 10 +2_Degrees 2017-03-01 19 +Ahmeddiyya_Islam 2016-03-01 4 +Amidi-ye_Kohneh 2017-11-01 13 +Contributions_to_Indian_Sociology 2016-11-01 42 +Clark_Leiblee 2016-04-01 5 +Abraham_of_Strathearn 2017-09-01 14 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet new file mode 100644 index 00000000000..37402b87f1a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/binary.md b/docs/ja/integrations/data-ingestion/data-formats/binary.md new file mode 100644 index 00000000000..d364d7dcf85 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/binary.md @@ -0,0 +1,233 @@ +--- +sidebar_label: バイナリとネイティブ +slug: /ja/integrations/data-formats/binary-native +--- + +# ClickHouseでのネイティブおよびバイナリフォーマットの使用 + +ClickHouseは複数のバイナリフォーマットをサポートしており、これによりパフォーマンスとスペースの効率が向上します。バイナリフォーマットは、データがバイナリ形式で保存されるため、文字エンコーディングの安全性も確保されます。 + +ここでは、デモンストレーション用に `some_data` [テーブル](assets/some_data.sql)および[データ](assets/some_data.tsv)を使用します。ご自身のClickHouseインスタンスで再現してみてください。 + +## ネイティブClickHouseフォーマットでのエクスポート + +ClickHouseノード間でデータをエクスポートおよびインポートする最も効率的なデータフォーマットは[ネイティブ](/docs/ja/interfaces/formats.md/#native)フォーマットです。エクスポートは `INTO OUTFILE` 句を使用して行われます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.clickhouse' FORMAT Native +``` + +これにより、ネイティブフォーマットの[data.clickhouse](assets/data.clickhouse)ファイルが作成されます。 + +### ネイティブフォーマットからのインポート + +データをインポートするには、小さなファイルや探索目的で[file()](/docs/ja/sql-reference/table-functions/file.md)を使用できます: + +```sql +DESCRIBE file('data.clickhouse', Native); +``` +```response +┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ String │ │ │ │ │ │ +│ month │ Date │ │ │ │ │ │ +│ hits │ UInt32 │ │ │ │ │ │ +└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +:::tip +`file()` 関数を使用する場合、ClickHouse Cloudではファイルが存在するマシン上で `clickhouse client` でコマンドを実行する必要があります。他のオプションとして[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用してローカルでファイルを探索することができます。 +::: + +本番環境では、`FROM INFILE` を使用してデータをインポートします: + +```sql +INSERT INTO sometable +FROM INFILE 'data.clickhouse' +FORMAT Native +``` + +### ネイティブフォーマットの圧縮 + +データをネイティブフォーマットにエクスポートする際(および他のほとんどのフォーマット)に、`COMPRESSION` 句を使用して圧縮を有効にすることもできます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.clickhouse' +COMPRESSION 'lz4' +FORMAT Native +``` + +エクスポートにはLZ4圧縮を使用しました。データをインポートするときにはそれを指定する必要があります: + +```sql +INSERT INTO sometable +FROM INFILE 'data.clickhouse' +COMPRESSION 'lz4' +FORMAT Native +``` + +## RowBinaryへのエクスポート + +サポートされているもう一つのバイナリフォーマットは[RowBinary](/docs/ja/interfaces/formats.md/#rowbinary)で、バイナリ表現された行でデータをインポートおよびエクスポートできます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.binary' FORMAT RowBinary +``` + +これにより、バイナリ行形式の[data.binary](assets/data.binary)ファイルが生成されます。 + +### RowBinaryファイルの探索 + +このフォーマットでは自動スキーマ推論はサポートされていないので、読み込む前にスキーマを明示的に定義する必要があります: + +```sql +SELECT * +FROM file('data.binary', RowBinary, 'path String, month Date, hits UInt32') +LIMIT 5 +``` +```response +┌─path───────────────────────────┬──────month─┬─hits─┐ +│ Bangor_City_Forest │ 2015-07-01 │ 34 │ +│ Alireza_Afzal │ 2017-02-01 │ 24 │ +│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │ +│ 1973_National_500 │ 2017-10-01 │ 80 │ +│ Attachment │ 2017-09-01 │ 1356 │ +└────────────────────────────────┴────────────┴──────┘ +``` + +[RowBinaryWithNames](/docs/ja/interfaces/formats.md/#rowbinarywithnames)を利用すると、カラム一覧を含むヘッダー行も追加されます。[RowBinaryWithNamesAndTypes](/docs/ja/interfaces/formats.md/#rowbinarywithnamesandtypes)では、カラムタイプを含む追加のヘッダー行も追加されます。 + +### RowBinaryファイルからのインポート + +RowBinaryファイルからデータを読み込むには、`FROM INFILE` 句を使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.binary' +FORMAT RowBinary +``` + +## RawBLOBを使用した単一バイナリ値のインポート + +バイナリファイル全体を読み込み、テーブルのフィールドに保存したい場合があります。このような場合には、RawBLOB形式を使用できます。この形式は単一カラムテーブルでのみ直接使用できます: + +```sql +CREATE TABLE images(data String) Engine = Memory +``` + +画像ファイルを `images` テーブルに保存してみましょう: + +```bash +cat image.jpg | clickhouse-client -q "INSERT INTO images FORMAT RawBLOB" +``` + +`data` フィールドの長さを確認すると、元のファイルサイズと等しくなります: + +```sql +SELECT length(data) FROM images +``` +```response +┌─length(data)─┐ +│ 6121 │ +└──────────────┘ +``` + +### RawBLOBデータのエクスポート + +この形式はまた、`INTO OUTFILE` 句を使用してデータをエクスポートする際にも使用できます: + +```sql +SELECT * FROM images LIMIT 1 +INTO OUTFILE 'out.jpg' +FORMAT RawBLOB +``` + +`LIMIT 1`を使用する必要があるのは、複数の値をエクスポートするとファイルが破損するためです。 + +## MessagePack + +ClickHouseは[MessagePack](https://msgpack.org/)を使用して[MsgPack](/docs/ja/interfaces/formats.md/#msgpack)のインポートとエクスポートをサポートしています。MessagePack形式にエクスポートするには: + +```sql +SELECT * +FROM some_data +INTO OUTFILE 'data.msgpk' +FORMAT MsgPack +``` + +[MessagePackファイル](assets/data.msgpk)からデータをインポートするには: + +```sql +INSERT INTO sometable +FROM INFILE 'data.msgpk' +FORMAT MsgPack +``` + +## プロトコルバッファ + +[プロトコルバッファ](/docs/ja/interfaces/formats.md/#protobuf)を使用するには、まず[スキーマファイル](assets/schema.proto)を定義する必要があります: + +```protobuf +syntax = "proto3"; + +message MessageType { + string path = 1; + date month = 2; + uint32 hits = 3; +}; +``` + +このスキーマファイルのパス(私たちの場合は`schema.proto`)は、[Protobuf](/docs/ja/interfaces/formats.md/#protobuf)フォーマット用の`format_schema`設定オプションに設定されます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'proto.bin' +FORMAT Protobuf +SETTINGS format_schema = 'schema:MessageType' +``` + +これにより、データが[proto.bin](assets/proto.bin)ファイルに保存されます。ClickHouseはProtobufデータのインポートやネストされたメッセージもサポートしています。[ProtobufSingle](/docs/ja/interfaces/formats.md/#protobufsingle)を使用して、単一のプロトコルバッファメッセージを扱うことも検討してください(この場合、長さ区切りは省略されます)。 + +## Cap’n Proto + +ClickHouseがサポートするもう一つの人気のあるバイナリシリアライゼーションフォーマットは[Cap’n Proto](https://capnproto.org/)です。`Protobuf`形式と同様に、スキーマファイル([schema.capnp](assets/schema.capnp))を定義する必要があります: + +``` +@0xec8ff1a10aa10dbe; + +struct PathStats { + path @0 :Text; + month @1 :UInt32; + hits @2 :UInt32; +} +``` + +このスキーマを使用して[CapnProto](/docs/ja/interfaces/formats.md/#capnproto)フォーマットでインポートとエクスポートを行います: + +```sql +SELECT + path, + CAST(month, 'UInt32') AS month, + hits +FROM some_data +INTO OUTFILE 'capnp.bin' +FORMAT CapnProto +SETTINGS format_schema = 'schema:PathStats' +``` + +[`CapnProto`対応の型](/docs/ja/interfaces/formats.md/#data_types-matching-capnproto)に合わせるため、`Date`カラムを`UInt32`としてキャストする必要があることに注意してください。 + +## その他のフォーマット + +ClickHouseでは、さまざまなシナリオやプラットフォームに対応するために、多くのフォーマット、テキストフォーマットとバイナリフォーマットの両方が導入されています。以下の記事で、さらに多くのフォーマットとそれを扱う方法を探索してください: + +- [CSVおよびTSVフォーマット](csv-tsv.md) +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- **ネイティブおよびバイナリフォーマット** +- [SQLフォーマット](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)もチェックし、ClickHouseサーバーを起動せずにローカル/リモートファイルで作業するためのポータブルな完全機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md b/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md new file mode 100644 index 00000000000..6fb356fdb24 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md @@ -0,0 +1,375 @@ +--- +sidebar_label: CSV と TSV +slug: /ja/integrations/data-formats/csv-tsv +--- + +# ClickHouseでのCSVとTSVデータの操作 + +ClickHouseは、CSVからのデータのインポートおよびエクスポートをサポートしています。CSVファイルはヘッダ行、カスタムデリミタ、エスケープシンボルなど、さまざまなフォーマット仕様を持つ場合があります。そのため、ClickHouseは各ケースに効率的に対応するためのフォーマットと設定を提供しています。 + +## CSVファイルからのデータのインポート + +データをインポートする前に、次のような関連する構造のテーブルを作成します: + +```sql +CREATE TABLE sometable +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple(month, path) +``` + +この[CSVファイル](assets/data_small.csv)から`sometable`テーブルにデータをインポートするには、ファイルを直接clickhouse-clientにパイプします: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT CSV" < data_small.csv +``` + +[FORMAT CSV](/docs/ja/interfaces/formats.md/#csv)を使用して、CSVフォーマットのデータを取り込むことをClickHouseに知らせます。別の方法として、ローカルファイルからデータをロードする場合は、[FROM INFILE](/docs/ja/sql-reference/statements/insert-into.md/#inserting-data-from-a-file)句を使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data_small.csv' +FORMAT CSV +``` + +ここでは、`FORMAT CSV`句を使用して、ClickHouseがファイルフォーマットを理解できるようにしています。URLから直接データをロードするには[url()](/docs/ja/sql-reference/table-functions/url.md/)関数や、S3ファイルからは[s3()](/docs/ja/sql-reference/table-functions/s3.md/)関数を使用できます。 + +:::tip +`file()`および`INFILE`/`OUTFILE`に対して明示的なフォーマット設定をスキップできます。 +その場合、ClickHouseはファイルの拡張子に基づいてフォーマットを自動的に検出します。 +::: + +### ヘッダ付きのCSVファイル + +[ヘッダ付きのCSVファイル](assets/data_small_headers.csv)があると仮定します: + +```bash +head data-small-headers.csv +``` +```response +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +``` + +このファイルからデータをインポートするには、[CSVWithNames](/docs/ja/interfaces/formats.md/#csvwithnames)フォーマットを使用します: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT CSVWithNames" < data_small_headers.csv +``` + +この場合、ClickHouseはファイルの最初の行をスキップしてデータをインポートします。 + +:::tip +23.1[バージョン](https://github.com/ClickHouse/ClickHouse/releases)以降では、`CSV`タイプを使用した場合にClickHouseがCSVファイルのヘッダを自動的に検出するようになるので、`CSVWithNames`や`CSVWithNamesAndTypes`を使用する必要がありません。 +::: + +### カスタムデリミタ付きのCSVファイル + +CSVファイルがカンマ以外のデリミタを使用する場合は、[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)オプションを使用して関連するシンボルを設定できます: + +```sql +SET format_csv_delimiter = ';' +``` + +これで、CSVファイルからのインポート時にカンマの代わりに`;`シンボルがデリミタとして使用されます。 + +### CSVファイルの行のスキップ + +時には、CSVファイルからのデータインポート時に特定の行数をスキップすることがあります。これは[input_format_csv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_skip_first_lines)オプションを使用して行うことができます: + +```sql +SET input_format_csv_skip_first_lines = 10 +``` + +この場合、CSVファイルの最初の10行をスキップします: + +```sql +SELECT count(*) FROM file('data-small.csv', CSV) +``` +```response +┌─count()─┐ +│ 990 │ +└─────────┘ +``` + +[ファイル](assets/data_small.csv)には1k行がありますが、最初の10行をスキップするように指示したため、ClickHouseは990行のみをロードしました。 + +:::tip +`file()`関数を使用する場合、ClickHouse Cloudでは、ファイルが存在するマシン上で`clickhouse client`を実行する必要があります。ローカルでファイルを探索するには[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用することもできます。 +::: + +### CSVファイルでのNULL値の扱い + +NULL値は、ファイルを生成したアプリケーションに応じて異なる方法でエンコードされることがあります。デフォルトでは、ClickHouseはCSVで`\N`をNULL値として使用しますが、[format_csv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation)オプションを使用して変更できます。 + +次のCSVファイルがあるとします: + +```bash +> cat nulls.csv +Donald,90 +Joe,Nothing +Nothing,70 +``` + +このファイルからデータをロードすると、ClickHouseは`Nothing`を文字列として扱います(これが正しい): + +```sql +SELECT * FROM file('nulls.csv') +``` +```response +┌─c1──────┬─c2──────┐ +│ Donald │ 90 │ +│ Joe │ Nothing │ +│ Nothing │ 70 │ +└─────────┴─────────┘ +``` + +ClickHouseに`Nothing`を`NULL`として扱わせたい場合は、次のオプションを使用して定義できます: + +```sql +SET format_csv_null_representation = 'Nothing' +``` + +これで、期待通りに`NULL`が入ります: + +```sql +SELECT * FROM file('nulls.csv') +``` +```response +┌─c1─────┬─c2───┐ +│ Donald │ 90 │ +│ Joe │ ᴺᵁᴸᴸ │ +│ ᴺᵁᴸᴸ │ 70 │ +└────────┴──────┘ +``` + +## TSV(タブ区切り)ファイル + +タブ区切りデータフォーマットは、データ交換フォーマットとして広く使用されているフォーマットです。[TSVファイル](assets/data_small.tsv)からClickHouseにデータをロードするには、[TabSeparated](/docs/ja/interfaces/formats.md/#tabseparated)フォーマットを使用します: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT TabSeparated" < data_small.tsv +``` + +ヘッダを持つTSVファイルを操作するための[TabSeparatedWithNames](/docs/ja/interfaces/formats.md/#tabseparatedwithnames)フォーマットもあります。また、CSVと同様に、[input_format_tsv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_skip_first_lines)オプションを使用して最初のX行をスキップすることもできます。 + +### Raw TSV + +時折、TSVファイルはタブや改行をエスケープせずに保存されることがあります。そのようなファイルを扱うためには、[TabSeparatedRaw](/docs/ja/interfaces/formats.md/#tabseparatedraw)を使用するべきです。 + +## CSVへのエクスポート + +前の例のいずれかのフォーマットは、データをエクスポートするためにも使用できます。テーブル(またはクエリ)からCSVフォーマットにデータをエクスポートするには、同じ`FORMAT`句を使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSV +``` +```response +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +CSVファイルにヘッダを追加するには、[CSVWithNames](/docs/ja/interfaces/formats.md/#csvwithnames)フォーマットを使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSVWithNames +``` +```response +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +### エクスポートしたデータをCSVファイルに保存 + +エクスポートしたデータをファイルに保存するには、[INTO…OUTFILE](/docs/ja/sql-reference/statements/select/into-outfile.md)句を使用します: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'out.csv' +FORMAT CSVWithNames +``` +```response +36838935 rows in set. Elapsed: 1.304 sec. Processed 36.84 million rows, 1.42 GB (28.24 million rows/s., 1.09 GB/s.) +``` + +36百万行をCSVファイルに保存するのにClickHouseが約**1**秒かかりました。 + +### カスタムデリミタでのCSVエクスポート + +カンマ以外のデリミタを使用したい場合は、[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)設定オプションを使用できます: + +```sql +SET format_csv_delimiter = '|' +``` + +これで、ClickHouseはCSVフォーマットで`|`をデリミタとして使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSV +``` +```response +"Akiba_Hebrew_Academy"|"2017-08-01"|241 +"Aegithina_tiphia"|"2018-02-01"|34 +"1971-72_Utah_Stars_season"|"2016-10-01"|1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8"|"2015-12-01"|73 +"2016_Greater_Western_Sydney_Giants_season"|"2017-05-01"|86 +``` + +### Windows向けのCSVエクスポート + +Windows環境で問題なく動作するCSVファイルが必要な場合は、[output_format_csv_crlf_end_of_line](/docs/ja/operations/settings/settings-formats.md/#output_format_csv_crlf_end_of_line)オプションを有効にすることを検討すべきです。これにより、改行として`\n`の代わりに`\r\n`が使用されます: + +```sql +SET output_format_csv_crlf_end_of_line = 1; +``` + +## CSVファイルのスキーマ推論 + +多くの場合、不明なCSVファイルを操作しなければならないため、カラムにどのデータ型を使用するかを探索する必要があります。ClickHouseはデフォルトで、指定されたCSVファイルの分析に基づいてデータ型を推測しようとします。これは「スキーマ推論」として知られています。検出されたデータ型は、[file()](/docs/ja/sql-reference/table-functions/file.md)関数と組み合わせて`DESCRIBE`ステートメントを使用して探索できます: + +```sql +DESCRIBE file('data-small.csv', CSV) +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(Date) │ │ │ │ │ │ +│ c3 │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ここで、ClickHouseは効率的にCSVファイルのカラム型を推測できました。ClickHouseに推測させたくない場合は、次のオプションを使用して無効にできます: + +```sql +SET input_format_csv_use_best_effort_in_schema_inference = 0 +``` + +すべてのカラムタイプは、この場合`String`として扱われます。 + +### カラムタイプを明示的に指定したCSVのエクスポートとインポート {#exporting-and-importing-csv-with-explicit-column-types} + +ClickHouseは、[CSVWithNamesAndTypes](/docs/ja/interfaces/formats.md/#csvwithnamesandtypes)(および他の*WithNamesフォーマットファミリー)を使用してデータをエクスポートする際にカラムタイプを明示的に設定することもできます: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSVWithNamesAndTypes +``` +```response +"path","month","hits" +"String","Date","UInt32" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +このフォーマットでは、カラム名を持つ1行とカラム型を持つもう1行の2つのヘッダ行が含まれます。これにより、ClickHouse(および他のアプリ)は[そのようなファイル](assets/data_csv_types.csv)からデータをロードする際にカラムタイプを識別できます: + +```sql +DESCRIBE file('data_csv_types.csv', CSVWithNamesAndTypes) +``` +```response +┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ String │ │ │ │ │ │ +│ month │ Date │ │ │ │ │ │ +│ hits │ UInt32 │ │ │ │ │ │ +└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +これで、ClickHouseは推測の代わりに、(2番目の)ヘッダ行に基づいてカラム型を識別します。 + +## カスタムデリミタ、セパレータ、およびエスケープルール + +複雑なケースでは、テキストデータは非常にカスタムな形式でフォーマットされ、それでも構造を持つことがあります。このようなケースには、カスタムエスケープルール、デリミタ、行セパレータ、開始/終了シンボルを設定できる特別な[CustomSeparated](/docs/ja/interfaces/formats.md/#format-customseparated)フォーマットがあります。 + +次のデータがファイルにあると仮定します: + +``` +row('Akiba_Hebrew_Academy';'2017-08-01';241),row('Aegithina_tiphia';'2018-02-01';34),... +``` + +個別の行が`row()`で囲まれ、行は`,`で分離され、個別の値は`;`で区切られていることがわかります。この場合、次の設定を使用してこのファイルからデータを読み込むことができます: + +```sql +SET format_custom_row_before_delimiter = 'row('; +SET format_custom_row_after_delimiter = ')'; +SET format_custom_field_delimiter = ';'; +SET format_custom_row_between_delimiter = ','; +SET format_custom_escaping_rule = 'Quoted'; +``` + +これで、カスタムフォーマット[ファイル](assets/data_small_custom.txt)からデータをロードできます: + +```sql +SELECT * +FROM file('data_small_custom.txt', CustomSeparated) +LIMIT 3 +``` +```response +┌─c1────────────────────────┬─────────c2─┬──c3─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴─────┘ +``` + +[CustomSeparatedWithNames](/docs/ja/interfaces/formats.md/#customseparatedwithnames)を使用して、ヘッダを正しくエクスポートおよびインポートすることもできます。さらに複雑なケースに対処するために、正規表現やテンプレートフォーマットについては[regexとテンプレート](templates-regex.md)を探ってください。 + +## 大容量CSVファイルの操作 + +CSVファイルは大容量になることがあり、ClickHouseはどのようなサイズのファイルでも効率的に操作します。大容量のファイルは通常圧縮されており、ClickHouseは処理前に解凍する必要はありません。Insert中に`COMPRESSION`句を使用できます: + +```sql +INSERT INTO sometable +FROM INFILE 'data_csv.csv.gz' +COMPRESSION 'gzip' FORMAT CSV +``` + +`COMPRESSION`句を省略した場合、ClickHouseはファイルの拡張子に基づいて圧縮形式を推測しようとします。同じアプローチを使用して、ファイルを直接圧縮フォーマットにエクスポートすることもできます: + +```sql +SELECT * +FROM for_csv +INTO OUTFILE 'data_csv.csv.gz' +COMPRESSION 'gzip' FORMAT CSV +``` + +これにより、圧縮された`data_csv.csv.gz`ファイルが作成されます。 + +## その他のフォーマット + +ClickHouseは、さまざまなシナリオやプラットフォームをカバーするために、多くのフォーマット、テキストおよびバイナリー形式のサポートを導入しています。次の記事で、これらのフォーマットおよびそれらを使用する方法についてさらに探ってください: + +- **CSVとTSVフォーマット** +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブおよびバイナリーフォーマット](binary.md) +- [SQLフォーマット](sql.md) + +また、ローカル/リモートファイルでClickhouseサーバーを必要とせずに作業を行うための携帯型完全集合ツールである[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)もチェックしてください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png b/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png new file mode 100644 index 00000000000..012e2f1cdf8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/intro.md b/docs/ja/integrations/data-ingestion/data-formats/intro.md new file mode 100644 index 00000000000..15b47b7bdee --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/intro.md @@ -0,0 +1,36 @@ +--- +slug: /ja/integrations/data-formats +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, CSV, TSV, Parquet, clickhouse-client, clickhouse-local] +--- + +# ClickHouseへのさまざまなデータ形式からのインポート + +このドキュメントのセクションでは、さまざまなファイル形式からのロード例を見つけることができます。 + +### [**バイナリ**](/docs/ja/integrations/data-ingestion/data-formats/binary.md) + +ClickHouse Native、MessagePack、Protocol Buffers、Cap’n Protoなどのバイナリ形式のエクスポートとロード。 + +### [**CSVとTSV**](/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md) + +カスタムヘッダーとセパレーターを使用したCSVファミリー(TSVを含む)のインポートとエクスポート。 + +### [**JSON**](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) + +オブジェクトや行区切りNDJSONなど、さまざまな形式でのJSONのロードとエクスポート。 + +### [**Parquetデータ**](/docs/ja/integrations/data-ingestion/data-formats/parquet.md) + +ParquetやArrowなど、一般的なApache形式の処理。 + +### [**SQLデータ**](/docs/ja/integrations/data-ingestion/data-formats/sql.md) + +MySQLやPostgresqlにインポートするためのSQLダンプを必要としていますか?これ以上探す必要はありません。 + +BIツールのGrafana、Tableauなどを接続したい場合は、ドキュメントの[ビジュアル化カテゴリー](../../data-visualization.md)をご覧ください。 + +## 関連コンテンツ + +- ブログ: [ClickHouseにおけるデータ形式の紹介](https://clickhouse.com/blog/data-formats-clickhouse-csv-tsv-parquet-native) diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md b/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md new file mode 100644 index 00000000000..7714c91d473 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md @@ -0,0 +1,173 @@ +--- +title: JSONのエクスポート +slug: /ja/integrations/data-formats/json/exporting +description: ClickHouseからJSONデータをエクスポートする方法 +keywords: [json, clickhouse, formats, exporting] +--- + +# JSONのエクスポート + +インポート用に使用されるほぼすべてのJSONフォーマットは、エクスポートにも使用できます。最も一般的なのは[`JSONEachRow`](/docs/ja/interfaces/formats.md/#jsoneachrow)です: + +```sql +SELECT * FROM sometable FORMAT JSONEachRow +``` +```response +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +``` + +または、カラム名を省略してディスク容量を節約するために[`JSONCompactEachRow`](/ja/interfaces/formats#jsoncompacteachrow)を使用できます: + +```sql +SELECT * FROM sometable FORMAT JSONCompactEachRow +``` +```response +["Bob_Dolman", "2016-11-01", 245] +["1-krona", "2017-01-01", 4] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] +``` + +## データ型を文字列としてオーバーライドする {#overriding-data-types-as-strings} + +ClickHouseはデータ型を尊重し、JSONを標準に従ってエクスポートします。しかし、すべての値を文字列としてエンコードする必要がある場合は、[JSONStringsEachRow](/docs/ja/interfaces/formats.md/#jsonstringseachrow)フォーマットを使用できます: + +```sql +SELECT * FROM sometable FORMAT JSONStringsEachRow +``` +```response +{"path":"Bob_Dolman","month":"2016-11-01","hits":"245"} +{"path":"1-krona","month":"2017-01-01","hits":"4"} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":"3"} +``` + +ここでは、数値カラム`hits`が文字列としてエンコードされています。文字列としてのエクスポートはすべてのJSON*フォーマットでサポートされており、`JSONStrings\*`や`JSONCompactStrings\*`フォーマットを探索できます: + +```sql +SELECT * FROM sometable FORMAT JSONCompactStringsEachRow +``` +```response +["Bob_Dolman", "2016-11-01", "245"] +["1-krona", "2017-01-01", "4"] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", "3"] +``` + +## データと共にメタデータをエクスポートする + +アプリで一般的な[JSON](/docs/ja/interfaces/formats.md/#json)フォーマットは、結果データだけでなくカラムタイプやクエリ統計もエクスポートします: + +```sql +SELECT * FROM sometable FORMAT JSON +``` +```response +{ + "meta": + [ + { + "name": "path", + "type": "String" + }, + … + ], + + "data": + [ + { + "path": "Bob_Dolman", + "month": "2016-11-01", + "hits": 245 + }, + … + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.000497457, + "rows_read": 3, + "bytes_read": 87 + } +} +``` + +[JSONCompact](/docs/ja/interfaces/formats.md/#jsoncompact)フォーマットは、同じメタデータを表示しますが、データ自体をコンパクトな形式で出力します: + +```sql +SELECT * FROM sometable FORMAT JSONCompact +``` +```response +{ + "meta": + [ + { + "name": "path", + "type": "String" + }, + … + ], + + "data": + [ + ["Bob_Dolman", "2016-11-01", 245], + ["1-krona", "2017-01-01", 4], + ["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.00074981, + "rows_read": 3, + "bytes_read": 87 + } +} +``` + +すべての値を文字列としてエンコードするために、[`JSONStrings`](/docs/ja/interfaces/formats.md/#jsonstrings)または[`JSONCompactStrings`](/docs/ja/interfaces/formats.md/#jsoncompactstrings)バリアントを検討してください。 + +## JSONデータと構造をコンパクトにエクスポートする方法 + +データとその構造の両方を持つより効率的な方法は、[`JSONCompactEachRowWithNamesAndTypes`](/docs/ja/interfaces/formats.md/#jsoncompacteachrowwithnamesandtypes)フォーマットを使用することです: + +```sql +SELECT * FROM sometable FORMAT JSONCompactEachRowWithNamesAndTypes +``` +```response +["path", "month", "hits"] +["String", "Date", "UInt32"] +["Bob_Dolman", "2016-11-01", 245] +["1-krona", "2017-01-01", 4] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] +``` + +この形式は、カラム名とタイプを持つ2つのヘッダ行を前置したコンパクトなJSON形式を使用します。このフォーマットは別のClickHouseインスタンス(または他のアプリ)にデータをインジェストするために使用できます。 + +## JSONをファイルにエクスポートする + +JSONデータをファイルに保存するには、[INTO OUTFILE](/docs/ja/sql-reference/statements/select/into-outfile.md)句を使用できます: + +```sql +SELECT * FROM sometable INTO OUTFILE 'out.json' FORMAT JSONEachRow +``` +```response +36838935 rows in set. Elapsed: 2.220 sec. Processed 36.84 million rows, 1.27 GB (16.60 million rows/s., 572.47 MB/s.) +``` + +ClickHouseは37百万件近いレコードをJSONファイルにエクスポートするのにわずか2秒しかかかりません。また、`COMPRESSION`句を使用してオンザフライの圧縮を有効にしてエクスポートすることもできます: + +```sql +SELECT * FROM sometable INTO OUTFILE 'out.json.gz' FORMAT JSONEachRow +``` +```response +36838935 rows in set. Elapsed: 22.680 sec. Processed 36.84 million rows, 1.27 GB (1.62 million rows/s., 56.02 MB/s.) +``` + +達成するのにより多くの時間がかかりますが、はるかに小さな圧縮ファイルが生成されます: + +```bash +2.2G out.json +576M out.json.gz +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/formats.md b/docs/ja/integrations/data-ingestion/data-formats/json/formats.md new file mode 100644 index 00000000000..681b82a9703 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/formats.md @@ -0,0 +1,380 @@ +--- +title: 他のJSON形式の処理 +slug: /ja/integrations/data-formats/json/other-formats +description: 他のJSON形式の処理 +keywords: [json, formats, json formats] +--- + +# 他の形式の処理 + +以前のJSONデータのロード例では、[`JSONEachRow`](/ja/interfaces/formats#jsoneachrow) (ndjson) の使用を前提としています。以下に一般的な形式でのJSONのロード例を示します。 + +## JSONオブジェクトの配列 + +JSONデータの最も一般的な形式の1つは、JSON配列にJSONオブジェクトのリストがある形式です。[この例](../assets/list.json)のように: + +```bash +> cat list.json +[ + { + "path": "Akiba_Hebrew_Academy", + "month": "2017-08-01", + "hits": 241 + }, + { + "path": "Aegithina_tiphia", + "month": "2018-02-01", + "hits": 34 + }, + ... +] +``` + +このようなデータのためのテーブルを作成しましょう: + +```sql +CREATE TABLE sometable +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple(month, path) +``` + +JSONオブジェクトのリストをインポートするには、[`JSONEachRow`](/docs/ja/interfaces/formats.md/#jsoneachrow)形式を使用します([list.json](../assets/list.json) ファイルからデータを挿入する): + +```sql +INSERT INTO sometable +FROM INFILE 'list.json' +FORMAT JSONEachRow +``` + +`FROM INFILE`句を使用してローカルファイルからデータをロードし、インポートが成功したことを確認できます: + +```sql +SELECT * +FROM sometable +``` +```response +┌─path──────────────────────┬──────month─┬─hits─┐ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +└───────────────────────────┴────────────┴──────┘ +``` + +## NDJSON (行区切りJSON) の処理 + +多くのアプリケーションがJSON形式でデータをログに記録し、各ログ行が個別のJSONオブジェクトとなることがあります。[このファイル](../assets/object-per-line.json) のように: + +```bash +cat object-per-line.json +``` +```response +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} +``` + +同じ`JSONEachRow`形式はこのようなファイルにも対応できます: + +```sql +INSERT INTO sometable FROM INFILE 'object-per-line.json' FORMAT JSONEachRow; +SELECT * FROM sometable; +``` +```response +┌─path──────────────────────┬──────month─┬─hits─┐ +│ Bob_Dolman │ 2016-11-01 │ 245 │ +│ 1-krona │ 2017-01-01 │ 4 │ +│ Ahmadabad-e_Kalij-e_Sofla │ 2017-01-01 │ 3 │ +└───────────────────────────┴────────────┴──────┘ +``` + +## JSONオブジェクトキー + +場合によっては、JSONオブジェクトのリストが配列要素ではなくオブジェクトプロパティとしてエンコードされることがあります(例として[objects.json](../assets/objects.json) を参照): + +``` +cat objects.json +``` +```response +{ + "a": { + "path":"April_25,_2017", + "month":"2018-01-01", + "hits":2 + }, + "b": { + "path":"Akahori_Station", + "month":"2016-06-01", + "hits":11 + }, + ... +} +``` + +ClickHouseは、この種のデータを[`JSONObjectEachRow`](/docs/ja/interfaces/formats.md/#jsonobjecteachrow)形式を使用してロードできます: + +```sql +INSERT INTO sometable FROM INFILE 'objects.json' FORMAT JSONObjectEachRow; +SELECT * FROM sometable; +``` +```response +┌─path────────────┬──────month─┬─hits─┐ +│ Abducens_palsy │ 2016-05-01 │ 28 │ +│ Akahori_Station │ 2016-06-01 │ 11 │ +│ April_25,_2017 │ 2018-01-01 │ 2 │ +└─────────────────┴────────────┴──────┘ +``` + +### 親オブジェクトキーの値を指定する + +テーブルに親オブジェクトキーの値を保存したい場合は、[次のオプション](/docs/ja/operations/settings/settings-formats.md/#format_json_object_each_row_column_for_object_name)を使用してキー値を保存する列の名前を定義できます: + +```sql +SET format_json_object_each_row_column_for_object_name = 'id' +``` + +元のJSONファイルからどのデータがロードされるかを[`file()`](/docs/ja/sql-reference/functions/files.md/#file) 関数を使用して確認できます: + +```sql +SELECT * FROM file('objects.json', JSONObjectEachRow) +``` +```response +┌─id─┬─path────────────┬──────month─┬─hits─┐ +│ a │ April_25,_2017 │ 2018-01-01 │ 2 │ +│ b │ Akahori_Station │ 2016-06-01 │ 11 │ +│ c │ Abducens_palsy │ 2016-05-01 │ 28 │ +└────┴─────────────────┴────────────┴──────┘ +``` + +`id` カラムがキー値によって正しく埋められていることに注意してください。 + +## JSON配列 + +時には、スペースを節約するために、JSONファイルがオブジェクトではなく配列としてエンコードされることがあります。この場合、[JSON配列のリスト](../assets/arrays.json) を扱います: + +```bash +cat arrays.json +``` +```response +["Akiba_Hebrew_Academy", "2017-08-01", 241], +["Aegithina_tiphia", "2018-02-01", 34], +["1971-72_Utah_Stars_season", "2016-10-01", 1] +``` + +この場合、ClickHouseはこのデータをロードし、配列内の順番に基づいて各値を対応するカラムに割り当てます。[`JSONCompactEachRow`](/docs/ja/interfaces/formats.md/#jsoncompacteachrow)形式を使用します: + +```sql +SELECT * FROM sometable +``` +```response +┌─c1────────────────────────┬─────────c2─┬──c3─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴─────┘ +``` + +### JSON配列から個々のカラムをインポートする + +場合によっては、データが行単位ではなくカラム単位でエンコードされていることがあります。この場合、親JSONオブジェクトに値を持つカラムが含まれています。[次のファイル](../assets/columns.json)を見てみましょう: + +```bash +cat columns.json +``` +```response +{ + "path": ["2007_Copa_America", "Car_dealerships_in_the_USA", "Dihydromyricetin_reductase"], + "month": ["2016-07-01", "2015-07-01", "2015-07-01"], + "hits": [178, 11, 1] +} +``` + +ClickHouseは、このようにフォーマットされたデータを解析するために[`JSONColumns`](/docs/ja/interfaces/formats.md/#jsoncolumns)形式を使用します: + +```sql +SELECT * FROM file('columns.json', JSONColumns) +``` +```response +┌─path───────────────────────┬──────month─┬─hits─┐ +│ 2007_Copa_America │ 2016-07-01 │ 178 │ +│ Car_dealerships_in_the_USA │ 2015-07-01 │ 11 │ +│ Dihydromyricetin_reductase │ 2015-07-01 │ 1 │ +└────────────────────────────┴────────────┴──────┘ +``` + +よりコンパクトな形式もサポートされており、オブジェクトではなく[列の配列](../assets/columns-array.json)を扱う場合には[`JSONCompactColumns`](/docs/ja/interfaces/formats.md/#jsoncompactcolumns)形式を使用します: + +```sql +SELECT * FROM file('columns-array.json', JSONCompactColumns) +``` +```response +┌─c1──────────────┬─────────c2─┬─c3─┐ +│ Heidenrod │ 2017-01-01 │ 10 │ +│ Arthur_Henrique │ 2016-11-01 │ 12 │ +│ Alan_Ebnother │ 2015-11-01 │ 66 │ +└─────────────────┴────────────┴────┘ +``` + +## 解析せずにJSONオブジェクトを保存する + +場合によっては、JSONオブジェクトを解析せずに単一の`String`(またはJSON) カラムに保存したいことがあります。異なる構造のJSONオブジェクトのリストを扱う場合に便利です。[このファイル](../assets/custom.json)を見てみましょう。ここには親リストの中に異なるJSONオブジェクトがあります: + +```bash +cat custom.json +``` +```response +[ + {"name": "Joe", "age": 99, "type": "person"}, + {"url": "/my.post.MD", "hits": 1263, "type": "post"}, + {"message": "Warning on disk usage", "type": "log"} +] +``` + +これらの元のJSONオブジェクトを次のテーブルに保存したいと思います: + +```sql +CREATE TABLE events +( + `data` String +) +ENGINE = MergeTree +ORDER BY () +``` + +そして、JSONオブジェクトを解析せずに保持するために[`JSONAsString`](/docs/ja/interfaces/formats.md/#jsonasstring)形式を使用してファイルからこのテーブルにデータをロードできます: + +```sql +INSERT INTO events (data) +FROM INFILE 'custom.json' +FORMAT JSONAsString +``` + +保存されたオブジェクトをクエリするために[JSON functions](/docs/ja/sql-reference/functions/json-functions.md)を使用できます: + +```sql +SELECT + JSONExtractString(data, 'type') AS type, + data +FROM events +``` +```response +┌─type───┬─data─────────────────────────────────────────────────┐ +│ person │ {"name": "Joe", "age": 99, "type": "person"} │ +│ post │ {"url": "/my.post.MD", "hits": 1263, "type": "post"} │ +│ log │ {"message": "Warning on disk usage", "type": "log"} │ +└────────┴──────────────────────────────────────────────────────┘ +``` + +`JSONAsString`は通常`JSONEachRow`形式で使用されるJSONオブジェクトが行ごとにフォーマットされたファイルでも問題なく動作します。 + +## 入れ子になったオブジェクトのスキーマ + +[入れ子になったJSONオブジェクト](../assets/list-nested.json)を扱う場合は、追加でスキーマを定義し、複合型([`Array`](/docs/ja/sql-reference/data-types/array.md/)、[`Object Data Type`](/ja/sql-reference/data-types/object-data-type)または[`Tuple`](/docs/ja/sql-reference/data-types/tuple.md/))を使用してデータをロードできます: + +```sql +SELECT * +FROM file('list-nested.json', JSONEachRow, 'page Tuple(path String, title String, owner_id UInt16), month Date, hits UInt32') +LIMIT 1 +``` +```response +┌─page───────────────────────────────────────────────┬──────month─┬─hits─┐ +│ ('Akiba_Hebrew_Academy','Akiba Hebrew Academy',12) │ 2017-08-01 │ 241 │ +└────────────────────────────────────────────────────┴────────────┴──────┘ +``` + +## 入れ子になったJSONオブジェクトへのアクセス + +入れ子になったJSONキーを参照するために、[次の設定オプション](/docs/ja/operations/settings/settings-formats.md/#input_format_import_nested_json)を有効にします: + +```sql +SET input_format_import_nested_json = 1 +``` + +これにより、入れ子になったJSONオブジェクトキーをドット表記法を使用して参照できます(機能させるためにバックティック記号でラップすることを忘れないでください): + +```sql +SELECT * +FROM file('list-nested.json', JSONEachRow, '`page.owner_id` UInt32, `page.title` String, month Date, hits UInt32') +LIMIT 1 +``` +```results +┌─page.owner_id─┬─page.title───────────┬──────month─┬─hits─┐ +│ 12 │ Akiba Hebrew Academy │ 2017-08-01 │ 241 │ +└───────────────┴──────────────────────┴────────────┴──────┘ +``` + +この方法で、入れ子になったJSONオブジェクトをフラット化したり、いくつかの入れ子になった値を使用してそれらを個別のカラムとして保存できます。 + +## 不明なカラムをスキップする + +デフォルトでは、ClickHouseはJSONデータのインポート時に不明なカラムを無視します。`month`カラムがないテーブルに元のファイルをインポートしてみましょう: + +```sql +CREATE TABLE shorttable +( + `path` String, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY path +``` + +元の3カラムのJSONデータをこのテーブルに挿入することができます: + +```sql +INSERT INTO shorttable FROM INFILE 'list.json' FORMAT JSONEachRow; +SELECT * FROM shorttable +``` +```response +┌─path──────────────────────┬─hits─┐ +│ 1971-72_Utah_Stars_season │ 1 │ +│ Aegithina_tiphia │ 34 │ +│ Akiba_Hebrew_Academy │ 241 │ +└───────────────────────────┴──────┘ +``` + +ClickHouseはインポート時に不明なカラムを無視します。これは[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)設定オプションによって無効にできます: + +```sql +SET input_format_skip_unknown_fields = 0; +INSERT INTO shorttable FROM INFILE 'list.json' FORMAT JSONEachRow; +``` +```response +Ok. +Exception on client: +Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: month: (in file/uri /data/clickhouse/user_files/list.json): (at row 1) +``` + +ClickHouseはJSONとテーブルのカラム構造が不一致の際に例外をスローします。 + +## BSON + +ClickHouseは、[BSON](https://bsonspec.org/)でエンコードされたファイルのデータのエクスポートとインポートを許可します。この形式は、いくつかのデータベース管理システム(例: [MongoDB](https://github.com/mongodb/mongo) データベース)で使用されます。 + +BSONデータをインポートするには、[BSONEachRow](/docs/ja/interfaces/formats.md/#bsoneachrow)形式を使用します。[このBSONファイル](../assets/data.bson)からデータをインポートしてみましょう: + +```sql +SELECT * FROM file('data.bson', BSONEachRow) +``` +```response +┌─path──────────────────────┬─month─┬─hits─┐ +│ Bob_Dolman │ 17106 │ 245 │ +│ 1-krona │ 17167 │ 4 │ +│ Ahmadabad-e_Kalij-e_Sofla │ 17167 │ 3 │ +└───────────────────────────┴───────┴──────┘ +``` + +同じ形式を使用してBSONファイルにエクスポートすることもできます: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'out.bson' +FORMAT BSONEachRow +``` + +その後、データが`out.bson`ファイルにエクスポートされます。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/inference.md b/docs/ja/integrations/data-ingestion/data-formats/json/inference.md new file mode 100644 index 00000000000..4b7ebe1a6a3 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/inference.md @@ -0,0 +1,279 @@ +--- +title: JSON スキーマの推論 +slug: /ja/integrations/data-formats/json/inference +description: JSON スキーマの推論の使用方法 +keywords: [json, schema, inference, schema inference] +--- + +ClickHouse は JSON データの構造を自動的に判別できます。これを利用して、`clickhouse-local` や S3バケット上のディスクに直接 JSON データをクエリ**する、またはデータを ClickHouse にロードする前にスキーマを自動的に作成することが可能です。 + +## 型推論を使用する場合 + +* **一貫した構造** - 型を推論しようとしているデータに、興味のある全カラムが含まれている場合。推論後に追加されたカラムを含むデータは無視され、クエリできません。 +* **一貫した型** - 特定のカラムのデータ型が互換性を持たなければなりません。 + +:::note 重要 +もし新しいキーがスキーマを変更する十分な警告なしに追加される動的な JSON をお持ちの場合は、例えば Kubernetes のログラベルなど、[**JSON スキーマの設計**](/docs/ja/integrations/data-formats/json/schema)の読解を推奨します。 +::: + +## 型の検出 + +以前の例では、NDJSON形式の[Python PyPI データセット](https://clickpy.clickhouse.com/)の簡単なバージョンを使用していました。このセクションでは、2.5百万の学術論文を含むネストされた構造を持つより複雑な[arXiv データセット](https://www.kaggle.com/datasets/Cornell-University/arxiv?resource=download)を調査します。このデータセットは NDJSON として配布され、各行が発表された学術論文を表しています。以下に例となる行を示します。 + +```json +{ + "id": "2101.11408", + "submitter": "Daniel Lemire", + "authors": "Daniel Lemire", + "title": "Number Parsing at a Gigabyte per Second", + "comments": "Software at https://github.com/fastfloat/fast_float and\n https://github.com/lemire/simple_fastfloat_benchmark/", + "journal-ref": "Software: Practice and Experience 51 (8), 2021", + "doi": "10.1002/spe.2984", + "report-no": null, + "categories": "cs.DS cs.MS", + "license": "http://creativecommons.org/licenses/by/4.0/", + "abstract": "With disks and networks providing gigabytes per second ....\n", + "versions": [ + { + "created": "Mon, 11 Jan 2021 20:31:27 GMT", + "version": "v1" + }, + { + "created": "Sat, 30 Jan 2021 23:57:29 GMT", + "version": "v2" + } + ], + "update_date": "2022-11-07", + "authors_parsed": [ + [ + "Lemire", + "Daniel", + "" + ] + ] +} +``` + +このデータは、以前の例よりも複雑なスキーマを必要とします。このスキーマを定義するプロセスを以下に示し、`Tuple` や `Array` などの複雑な型を導入します。 + +このデータセットは公開されている S3 バケット `s3://datasets-documentation/arxiv/arxiv.json.gz` に保存されています。 + +上記のデータセットにはネストされた JSON オブジェクトが含まれていることがわかります。ユーザーはスキーマを作成しバージョン管理するべきですが、推論によりデータから型を推測することができます。これによりスキーマ DDL が自動生成され、手動で作成する必要がなくなり、開発プロセスが加速されます。 + +:::note 自動フォーマット検出 +スキーマを検出するだけでなく、JSON スキーマ推論はファイルの拡張子や内容からデータのフォーマットを自動的に推測します。上記のファイルは、その結果として自動的に NDJSON として認識されます。 +::: + +[s3 関数](/ja/sql-reference/table-functions/s3)と `DESCRIBE` コマンドを使用すると、推論される型を確認できます。 + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +SETTINGS describe_compact_output = 1 +``` +```response +┌─name───────────┬─type────────────────────────────────────────────────────────────────────┐ +│ id │ Nullable(String) │ +│ submitter │ Nullable(String) │ +│ authors │ Nullable(String) │ +│ title │ Nullable(String) │ +│ comments │ Nullable(String) │ +│ journal-ref │ Nullable(String) │ +│ doi │ Nullable(String) │ +│ report-no │ Nullable(String) │ +│ categories │ Nullable(String) │ +│ license │ Nullable(String) │ +│ abstract │ Nullable(String) │ +│ versions │ Array(Tuple(created Nullable(String),version Nullable(String))) │ +│ update_date │ Nullable(Date) │ +│ authors_parsed │ Array(Array(Nullable(String))) │ +└────────────────┴─────────────────────────────────────────────────────────────────────────┘ +``` + +:::note null の回避 +多くのカラムが Nullable として検出されていることがわかります。[Nullable の使用は推奨されていません](https://clickhouse.com/docs/ja/sql-reference/data-types/nullable#storage-features)が、絶対に必要な場合を除いて使用は避けてください。[schema_inference_make_columns_nullable](https://clickhouse.com/docs/ja/interfaces/schema-inference#schema_inference_make_columns_nullable)を使用して、Nullable が適用されるときの挙動を制御できます。 +::: + +ほとんどのカラムが自動的に `String` として検出されている一方、`update_date` カラムは正しく `Date` として検出されています。`versions` カラムはオブジェクトのリストを格納するために `Array(Tuple(created String, version String))` として作成され、`authors_parsed` はネストされた配列のために `Array(Array(String))` として定義されています。 + +:::note 型検出の制御 +日付や日時の自動検出は、設定 [`input_format_try_infer_dates`](/docs/ja/interfaces/schema-inference#input_format_try_infer_dates)および[`input_format_try_infer_datetimes`](/docs/ja/interfaces/schema-inference#input_format_try_infer_datetimes)(いずれもデフォルトで有効)を通して制御できます。オブジェクトをタプルとして推測することは、設定 [`input_format_json_try_infer_named_tuples_from_objects`](/docs/ja/operations/settings/formats#input_format_json_try_infer_named_tuples_from_objects)によって制御されます。JSON のスキーマ推論を制御するその他の設定、例えば数字の自動検出は[こちらを参照してください](/docs/ja/interfaces/schema-inference#text-formats)。 +::: + +## JSON のクエリ + +スキーマ推論に依存して JSON データをその場でクエリできます。下記にあるように、日付と配列が自動的に検出されることを利用して、各年のトップ著者を探します。 + +```sql +SELECT + toYear(update_date) AS year, + authors, + count() AS c +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +GROUP BY + year, + authors +ORDER BY + year ASC, + c DESC +LIMIT 1 BY year + +┌─year─┬─authors────────────────────────────────────┬───c─┐ +│ 2007 │ The BABAR Collaboration, B. Aubert, et al │ 98 │ +│ 2008 │ The OPAL collaboration, G. Abbiendi, et al │ 59 │ +│ 2009 │ Ashoke Sen │ 77 │ +│ 2010 │ The BABAR Collaboration, B. Aubert, et al │ 117 │ +│ 2011 │ Amelia Carolina Sparavigna │ 21 │ +│ 2012 │ ZEUS Collaboration │ 140 │ +│ 2013 │ CMS Collaboration │ 125 │ +│ 2014 │ CMS Collaboration │ 87 │ +│ 2015 │ ATLAS Collaboration │ 118 │ +│ 2016 │ ATLAS Collaboration │ 126 │ +│ 2017 │ CMS Collaboration │ 122 │ +│ 2018 │ CMS Collaboration │ 138 │ +│ 2019 │ CMS Collaboration │ 113 │ +│ 2020 │ CMS Collaboration │ 94 │ +│ 2021 │ CMS Collaboration │ 69 │ +│ 2022 │ CMS Collaboration │ 62 │ +│ 2023 │ ATLAS Collaboration │ 128 │ +│ 2024 │ ATLAS Collaboration │ 120 │ +└──────┴────────────────────────────────────────────┴─────┘ + +18 rows in set. Elapsed: 20.172 sec. Processed 2.52 million rows, 1.39 GB (124.72 thousand rows/s., 68.76 MB/s.) +``` + +スキーマ推論により、スキーマを指定することなく JSON ファイルをクエリできるため、アドホックなデータ解析作業が加速されます。 + +## テーブルの作成 + +スキーマ推論に依存して、テーブルのスキーマを作成することができます。以下の `CREATE AS EMPTY` コマンドは、テーブルの DDL を推論し、テーブルが作成されることを引き起こします。これはデータをロードしません: + +```sql +CREATE TABLE arxiv +ENGINE = MergeTree +ORDER BY update_date EMPTY +AS SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +SETTINGS schema_inference_make_columns_nullable = 0 +``` + +テーブルスキーマを確認するには、`SHOW CREATE TABLE` コマンドを使用します: + +```sql +SHOW CREATE TABLE arxiv + +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `journal-ref` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)) +) +ENGINE = MergeTree +ORDER BY update_date +SETTINGS index_granularity = 8192 +``` + +上記は、このデータに適した正しいスキーマです。スキーマ推論は、データのサンプリングと行単位での読み取りに基づいて行われます。カラム値はフォーマットに従って抽出され、再帰パーサーとヒューリスティックが各値の型を判定するために使用されます。スキーマ推論でデータから読み取る行数とバイト数の最大値は、設定 [`input_format_max_rows_to_read_for_schema_inference`](/docs/ja/interfaces/schema-inference#input_format_max_rows_to_read_for_schema_inferenceinput_format_max_bytes_to_read_for_schema_inference)(デフォルトで25000)および [`input_format_max_bytes_to_read_for_schema_inference`](/docs/ja/interfaces/schema-inference#input_format_max_rows_to_read_for_schema_inferenceinput_format_max_bytes_to_read_for_schema_inference)(デフォルトで32MB)によって制御されます。検出が正しくない場合、ユーザーは[こちら](/docs/ja/interfaces/schema-inference#schema_inference_hints)で説明されているようにヒントを提供できます。 + +### スニペットからテーブルを作成する + +上記の例では、S3 のファイルを使用してテーブルスキーマを作成しています。ユーザーは単一行のスニペットからスキーマを作成したいかもしれません。これは、[format](/docs/ja/sql-reference/table-functions/format)関数を使用して実現できます: + +```sql +CREATE TABLE arxiv +ENGINE = MergeTree +ORDER BY update_date EMPTY +AS SELECT * +FROM format(JSONEachRow, '{"id":"2101.11408","submitter":"Daniel Lemire","authors":"Daniel Lemire","title":"Number Parsing at a Gigabyte per Second","comments":"Software at https://github.com/fastfloat/fast_float and","doi":"10.1002/spe.2984","report-no":null,"categories":"cs.DS cs.MS","license":"http://creativecommons.org/licenses/by/4.0/","abstract":"Withdisks and networks providing gigabytes per second ","versions":[{"created":"Mon, 11 Jan 2021 20:31:27 GMT","version":"v1"},{"created":"Sat, 30 Jan 2021 23:57:29 GMT","version":"v2"}],"update_date":"2022-11-07","authors_parsed":[["Lemire","Daniel",""]]}') SETTINGS schema_inference_make_columns_nullable = 0 + +SHOW CREATE TABLE arxiv + +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)) +) +ENGINE = MergeTree +ORDER BY update_date +``` + +## JSON データのロード + +前述のコマンドはデータをロードできるテーブルを作成しました。以下の `INSERT INTO SELECT` を使用してデータをテーブルに挿入できます: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') + +0 rows in set. Elapsed: 38.498 sec. Processed 2.52 million rows, 1.39 GB (65.35 thousand rows/s., 36.03 MB/s.) +Peak memory usage: 870.67 MiB. +``` + +その他のソース、たとえばファイルからのデータロードの例は[こちら](/docs/ja/sql-reference/statements/insert-into)を参照してください。 + +ロード後、フォーマット `PrettyJSONEachRow` を使用して行を元の構造で表示し、データをクエリできます: + +```sql +SELECT * +FROM arxiv +LIMIT 1 +FORMAT PrettyJSONEachRow + +{ + "id": "0704.0004", + "submitter": "David Callan", + "authors": "David Callan", + "title": "A determinant of Stirling cycle numbers counts unlabeled acyclic", + "comments": "11 pages", + "journal-ref": "", + "doi": "", + "report-no": "", + "categories": "math.CO", + "license": "", + "abstract": " We show that a determinant of Stirling cycle numbers counts unlabeled acyclic\nsingle-source automata.", + "versions": [ + { + "created": "Sat, 31 Mar 2007 03:16:14 GMT", + "version": "v1" + } + ], + "update_date": "2007-05-23", + "authors_parsed": [ + [ + "Callan", + "David" + ] + ] +} + +1 row in set. Elapsed: 0.009 sec. +``` + +## エラーの処理 + +時折、不適切なデータに遭遇することがあります。特定のカラムが適切な型を持っていない場合や不適切にフォーマットされた JSON などです。そのため、挿入エラーを引き起こすデータがある場合に特定の行を無視するための [`input_format_allow_errors_ratio`](/docs/ja/operations/settings/formats#input_format_allow_errors_ratio) 設定を使用できます。さらに、推論を支援するための[ヒント](/docs/ja/interfaces/schema-inference#schema_inference_hints)を提供することも可能です。 + +## さらなる学習 + +データ型推論についての詳細は、[こちら](/ja/interfaces/schema-inference)のドキュメントページを参照してください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/intro.md b/docs/ja/integrations/data-ingestion/data-formats/json/intro.md new file mode 100644 index 00000000000..0dc3f760df9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/intro.md @@ -0,0 +1,37 @@ +--- +sidebar_label: 概要 +sidebar_position: 10 +title: JSONの操作 +slug: /ja/integrations/data-formats/json/overview +description: ClickHouseでのJSONの操作 +keywords: [json, clickhouse] +--- + +# 概要 + +
+ +
+ +
+ +ClickHouseは、JSONを扱うためのいくつかのアプローチを提供しており、それぞれに利点と欠点、および利用用途があります。このガイドでは、JSONをどのようにロードし、スキーマを最適に設計するかについて説明します。以下のセクションで構成されています: + +- [JSONのロード](/docs/ja/integrations/data-formats/json/loading) - 簡単なスキーマを使用してClickHouseでJSON(特に[NDJSON](https://github.com/ndjson/ndjson-spec))をロードし、クエリを実行します。 +- [JSONスキーマの推測](/docs/ja/integrations/data-formats/json/inference) - JSONスキーマの推測を使用してJSONをクエリし、テーブルスキーマを作成します。 +- [JSONスキーマの設計](/docs/ja/integrations/data-formats/json/schema) - JSONスキーマを設計し最適化するためのステップ。 +- [JSONのエクスポート](/docs/ja/integrations/data-formats/json/exporting) - JSONをどのようにエクスポートするかについて。 +- [その他のJSON形式の処理](/docs/ja/integrations/data-formats/json/other-formats) - NDJSON以外のJSON形式を処理するためのいくつかのヒント。 +- [JSONをモデリングするためのその他のアプローチ](/docs/ja/integrations/data-formats/json/other-approaches) - JSONをモデリングするための高度なアプローチ。**推奨されません。** + +:::note 重要: 新しいJSONタイプが間もなくリリースされます +このガイドでは、既存のJSON処理技術について考慮しています。現在、新しいJSONタイプが活発に開発されており、間もなく利用可能になります。この機能の進捗状況については、[このGitHub issue](https://github.com/ClickHouse/ClickHouse/issues/54864)を追ってください。この新しいデータタイプは、既存の廃止予定の[オブジェクトデータタイプ](/docs/ja/sql-reference/data-types/object-data-type)(エイリアス`JSON`)に取って代わります。 +::: diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/loading.md b/docs/ja/integrations/data-ingestion/data-formats/json/loading.md new file mode 100644 index 00000000000..ea23837cc90 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/loading.md @@ -0,0 +1,101 @@ +--- +sidebar_label: JSONの読み込み +sidebar_position: 20 +title: JSONの操作 +slug: /ja/integrations/data-formats/json/loading +description: JSONの読み込み +keywords: [json, clickhouse, 挿入, 読み込み] +--- + +# JSONの読み込み + +このセクションでは、JSONデータが[NDJSON](https://github.com/ndjson/ndjson-spec)(改行区切りJSON)形式、ClickHouseでいうところの[`JSONEachRow`](/ja/interfaces/formats#jsoneachrow)であると仮定します。これは、その簡潔さと効率的なスペース使用からJSONを読み込むための推奨形式ですが、他の形式も[入力と出力](/docs/ja/interfaces/formats#json)に対してサポートされています。 + +次のJSONサンプルを考えます。これは[Python PyPIデータセット](https://clickpy.clickhouse.com/)の行を表しています: + +```json +{ + "date": "2022-11-15", + "country_code": "ES", + "project": "clickhouse-connect", + "type": "bdist_wheel", + "installer": "pip", + "python_minor": "3.9", + "system": "Linux", + "version": "0.3.0" +} +``` + +このJSONオブジェクトをClickHouseにロードするためには、テーブルスキーマを定義する必要があります。以下に示されているのは、**JSONキーがカラム名にマッピングされる**シンプルなスキーマです: + +```sql +CREATE TABLE pypi ( + `date` Date, + `country_code` String, + `project` String, + `type` String, + `installer` String, + `python_minor` String, + `system` String, + `version` String +) +ENGINE = MergeTree +ORDER BY (project, date) +``` + +:::note 並び替えキーについて +ここでは、`ORDER BY`句を使用して並び替えキーを選択しています。並び替えキーの詳細と選択方法については、[こちら](/docs/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 +::: + +ClickHouseは複数の形式でJSONデータを読み込むことができ、拡張子と内容から自動的に型を推測します。上記のテーブルに対してJSONファイルを読み取るには、[S3関数](/docs/ja/sql-reference/table-functions/s3)を使用します: + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz') +LIMIT 1 +┌───────date─┬─country_code─┬─project────────────┬─type────────┬─installer────┬─python_minor─┬─system─┬─version─┐ +│ 2022-11-15 │ CN │ clickhouse-connect │ bdist_wheel │ bandersnatch │ │ │ 0.2.8 │ +└────────────┴──────────────┴────────────────────┴─────────────┴──────────────┴──────────────┴────────┴─────────┘ + +1 row in set. Elapsed: 1.232 sec. +``` + +ここではファイル形式を指定する必要がないことに注目してください。代わりに、バケット内のすべての`*.json.gz`ファイルを読み取るためにglobパターンを使用しています。ClickHouseは拡張子と内容から形式が`JSONEachRow`(ndjson)であることを自動的に推測します。ClickHouseが形式を検出できない場合でも、パラメータ関数を使用して手動で形式を指定できます。 + +```sql +SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz', JSONEachRow) +``` + +:::note 圧縮ファイルについて +上記のファイルは圧縮されていますが、これはClickHouseによって自動的に検出および処理されます。 +::: + +これらのファイルの行を読み込むには、[`INSERT INTO SELECT`](/ja/sql-reference/statements/insert-into#inserting-the-results-of-select)を使用します: + +```sql +INSERT INTO pypi SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz') +Ok. + +0 rows in set. Elapsed: 10.445 sec. Processed 19.49 million rows, 35.71 MB (1.87 million rows/s., 3.42 MB/s.) + +SELECT * FROM pypi LIMIT 2 + +┌───────date─┬─country_code─┬─project────────────┐ +│ 2022-05-26 │ CN │ clickhouse-connect │ +│ 2022-05-26 │ CN │ clickhouse-connect │ +└────────────┴──────────────┴────────────────────┘ + +2 rows in set. Elapsed: 0.005 sec. Processed 8.19 thousand rows, 908.03 KB (1.63 million rows/s., 180.38 MB/s.) +``` + +行は[`FORMAT`句](/ja/sql-reference/statements/select/format)を使ってインラインで読み込むこともできます。例えば + +```sql +INSERT INTO pypi +FORMAT JSONEachRow +{"date":"2022-11-15","country_code":"CN","project":"clickhouse-connect","type":"bdist_wheel","installer":"bandersnatch","python_minor":"","system":"","version":"0.2.8"} +``` + +これらの例はJSONEachRow形式の使用を前提としています。他の一般的なJSON形式もサポートされており、それらのロード方法についての例は[こちら](/docs/ja/integrations/data-formats/json/other-formats)で提供されています。 + +上記では非常にシンプルなJSONデータの読み込み例を提供しました。ネストされた構造を含むより複雑なJSONについては、[**JSONスキーマの設計**](/docs/ja/integrations/data-formats/json/schema)ガイドを参照してください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/other.md b/docs/ja/integrations/data-ingestion/data-formats/json/other.md new file mode 100644 index 00000000000..e946e9de57c --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/other.md @@ -0,0 +1,318 @@ +--- +title: JSONをモデル化する他のアプローチ +slug: /ja/integrations/data-formats/json/other-approaches +description: JSONをモデル化する他のアプローチ +keywords: [json, formats] +--- + +# JSONをモデル化する他のアプローチ + +**以下は、ClickHouseでJSONをモデル化する際の代替手段です。これらは完全性のために文書化されていますが、ほとんどの使用ケースでは推奨されず、適用されません。** + +## ネストを使用する + +[Nested型](/docs/ja/sql-reference/data-types/nested-data-structures/nested)は、変更されることが少ない静的なオブジェクトをモデル化するために使用できます。これは`Tuple`および`Array(Tuple)`の代替手段を提供します。一般的に、この型はその動作がしばしば混乱を招くため、JSONに使用することは避けることをお勧めします。`Nested`の主な利点は、サブカラムがソートキーで使用できることです。 + +以下に、静的オブジェクトをモデル化するためのNested型の使用例を示します。次のような単純なログエントリをJSONで考えます: + +```json +{ + "timestamp": 897819077, + "clientip": "45.212.12.0", + "request": { + "method": "GET", + "path": "/french/images/hm_nav_bar.gif", + "version": "HTTP/1.0" + }, + "status": 200, + "size": 3305 +} +``` + +`request`キーを`Nested`として宣言できます。`Tuple`と同様に、サブカラムを指定する必要があります。 + +```sql +-- デフォルト +SET flatten_nested=1 +CREATE table http +( + timestamp Int32, + clientip IPv4, + request Nested(method LowCardinality(String), path String, version LowCardinality(String)), + status UInt16, + size UInt32, +) ENGINE = MergeTree() ORDER BY (status, timestamp); +``` + +### flatten_nested + +設定`flatten_nested`はネストの動作を制御します。 + +#### flatten_nested=1 + +`1`(デフォルト)の値は、任意のレベルのネストをサポートしません。この値では、ネストされたデータ構造を同じ長さの複数の[Array](/docs/ja/sql-reference/data-types/array)カラムとして考えるのが最も簡単です。`method`、`path`、および`version`のフィールドは全て別々の`Array(Type)`カラムとして機能し、重要な制約として **`method`、`path`、および`version`フィールドの長さは同じでなければなりません。** これを説明するために、`SHOW CREATE TABLE`を使用すると以下のようになります: + +```sql +SHOW CREATE TABLE http + +CREATE TABLE http +( + `timestamp` Int32, + `clientip` IPv4, + `request.method` Array(LowCardinality(String)), + `request.path` Array(String), + `request.version` Array(LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) +``` + +以下、このテーブルに挿入します: + +```sql +SET input_format_import_nested_json = 1; +INSERT INTO http +FORMAT JSONEachRow +{"timestamp":897819077,"clientip":"45.212.12.0","request":[{"method":"GET","path":"/french/images/hm_nav_bar.gif","version":"HTTP/1.0"}],"status":200,"size":3305} +``` + +ここでのいくつかの重要なポイント: + +* JSONをネストされた構造として挿入するために、`input_format_import_nested_json`設定を使用する必要があります。これがない場合、JSONをフラットにする必要があります。例: + + ```sql + INSERT INTO http FORMAT JSONEachRow + {"timestamp":897819077,"clientip":"45.212.12.0","request":{"method":["GET"],"path":["/french/images/hm_nav_bar.gif"],"version":["HTTP/1.0"]},"status":200,"size":3305} + ``` +* ネストされたフィールド`method`、`path`、および`version`はJSON配列として渡す必要があります。例: + + ```json + { + "@timestamp": 897819077, + "clientip": "45.212.12.0", + "request": { + "method": [ + "GET" + ], + "path": [ + "/french/images/hm_nav_bar.gif" + ], + "version": [ + "HTTP/1.0" + ] + }, + "status": 200, + "size": 3305 + } + ``` + +カラムはドット表記を使用してクエリできます: + +```sql +SELECT clientip, status, size, `request.method` FROM http WHERE has(request.method, 'GET'); + +┌─clientip────┬─status─┬─size─┬─request.method─┐ +│ 45.212.12.0 │ 200 │ 3305 │ ['GET'] │ +└─────────────┴────────┴──────┴────────────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +サブカラムの`Array`使用は、完全な[Array関数](/docs/ja/sql-reference/functions/array-functions)を潜在的に活用できることを意味し、カラムに複数の値がある場合には[`ARRAY JOIN`](/docs/ja/sql-reference/statements/select/array-join)句が役立ちます。 + +#### flatten_nested=0 + +これは任意のレベルのネストを許可し、ネストされたカラムは`Tuple`の単一の配列として保持されます - 実質的に`Array(Tuple)`と同じになります。 + +**これが`Nested`を使ったJSONの使用において推奨される方法であり、しばしば最も単純な方法です。以下に示すように、オブジェクトすべてがリストであることを必要とするだけです。** + +以下では、テーブルを再作成し、行を再挿入します: + +```sql +CREATE TABLE http +( + `timestamp` Int32, + `clientip` IPv4, + `request` Nested(method LowCardinality(String), path String, version LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) + +SHOW CREATE TABLE http + +-- note Nested type is preserved. +CREATE TABLE default.http +( + `timestamp` Int32, + `clientip` IPv4, + `request` Nested(method LowCardinality(String), path String, version LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) + +INSERT INTO http +FORMAT JSONEachRow +{"timestamp":897819077,"clientip":"45.212.12.0","request":[{"method":"GET","path":"/french/images/hm_nav_bar.gif","version":"HTTP/1.0"}],"status":200,"size":3305} +``` + +ここでのいくつかの重要なポイント: + +* `input_format_import_nested_json`は挿入に必要ありません。 +* `SHOW CREATE TABLE`では`Nested`型が保持されます。このカラムの内部には実質的には`Array(Tuple(Nested(method LowCardinality(String), path String, version LowCardinality(String))))`があります。 +* 結果として、`request`を配列として挿入する必要があります。例: + + ```json + { + "timestamp": 897819077, + "clientip": "45.212.12.0", + "request": [ + { + "method": "GET", + "path": "/french/images/hm_nav_bar.gif", + "version": "HTTP/1.0" + } + ], + "status": 200, + "size": 3305 + } + ``` + +カラムは再度、ドット表記を使用してクエリできます: + +```sql +SELECT clientip, status, size, `request.method` FROM http WHERE has(request.method, 'GET'); + +┌─clientip────┬─status─┬─size─┬─request.method─┐ +│ 45.212.12.0 │ 200 │ 3305 │ ['GET'] │ +└─────────────┴────────┴──────┴────────────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +### 例 + +上記のデータの大きな例は、s3のパブリックバケットにあります:`s3://datasets-documentation/http/`。 + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONEachRow') +LIMIT 1 +FORMAT PrettyJSONEachRow + +{ + "@timestamp": "893964617", + "clientip": "40.135.0.0", + "request": { + "method": "GET", + "path": "\/images\/hm_bg.jpg", + "version": "HTTP\/1.0" + }, + "status": "200", + "size": "24736" +} + +1 row in set. Elapsed: 0.312 sec. +``` + +JSONの制約と入力形式を考慮して、このサンプルデータセットを次のクエリを使用して挿入します。ここでは、`flatten_nested=0`を設定します。 + +次の文は1000万行を挿入するため、実行に数分かかる場合があります。必要であれば`LIMIT`を適用してください。 + +```sql +INSERT INTO http +SELECT `@timestamp` AS `timestamp`, clientip, [request], status, +size FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', +'JSONEachRow'); +``` + +このデータをクエリするには、リクエストフィールドを配列としてアクセスする必要があります。以下では、固定された期間にわたるエラーとhttpメソッドをまとめています。 + +```sql +SELECT status, request.method[1] as method, count() as c +FROM http +WHERE status >= 400 + AND toDateTime(timestamp) BETWEEN '1998-01-01 00:00:00' AND '1998-06-01 00:00:00' +GROUP by method, status +ORDER BY c DESC LIMIT 5; + +┌─status─┬─method─┬─────c─┐ +│ 404 │ GET │ 11267 │ +│ 404 │ HEAD │ 276 │ +│ 500 │ GET │ 160 │ +│ 500 │ POST │ 115 │ +│ 400 │ GET │ 81 │ +└────────┴────────┴───────┘ + +5 rows in set. Elapsed: 0.007 sec. +``` + +### ペアワイズ配列を使用する + +ペアワイズ配列は、JSONをStringとして表現する柔軟性と、より構造化されたアプローチのパフォーマンスとのバランスを提供します。スキーマは柔軟で、ルートに新しいフィールドを追加することができます。ただし、これは非常に複雑なクエリ構文を必要とし、ネストされた構造と互換性がありません。 + +例として、次のテーブルを考えてみます: + +```sql +CREATE TABLE http_with_arrays ( + keys Array(String), + values Array(String) +) +ENGINE = MergeTree ORDER BY tuple(); +``` + +このテーブルに挿入するには、JSONをキーと値のリストとして構造化する必要があります。以下のクエリは、これを達成するための`JSONExtractKeysAndValues`の使用例を示しています: + +```sql +SELECT + arrayMap(x -> (x.1), JSONExtractKeysAndValues(json, 'String')) AS keys, + arrayMap(x -> (x.2), JSONExtractKeysAndValues(json, 'String')) AS values +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONAsString') +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +keys: ['@timestamp','clientip','request','status','size'] +values: ['893964617','40.135.0.0','{"method":"GET","path":"/images/hm_bg.jpg","version":"HTTP/1.0"}','200','24736'] + +1 row in set. Elapsed: 0.416 sec. +``` + +リクエストカラムがネストされた構造として文字列で表現されている点に注意してください。ルートに任意の新しいキーを挿入できます。また、JSON自体に任意の違いを持たせることもできます。ローカルテーブルに挿入するには、次を実行します: + +```sql +INSERT INTO http_with_arrays +SELECT + arrayMap(x -> (x.1), JSONExtractKeysAndValues(json, 'String')) AS keys, + arrayMap(x -> (x.2), JSONExtractKeysAndValues(json, 'String')) AS values +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONAsString') + +0 rows in set. Elapsed: 12.121 sec. Processed 10.00 million rows, 107.30 MB (825.01 thousand rows/s., 8.85 MB/s.) +``` + +この構造をクエリするには、必要なキーのインデックスを識別するために[`indexOf`](/ja/sql-reference/functions/array-functions#indexofarr-x)関数を使用する必要があります(これは値の順序に一致するはずです)。これを使って値の配列カラムにアクセスできます。つまり、`values[indexOf(keys, 'status')]`。リクエストカラムには引き続きJSONの解析メソッドが必要です - この場合、`simpleJSONExtractString`を使用します。 + +```sql +SELECT toUInt16(values[indexOf(keys, 'status')]) as status, + simpleJSONExtractString(values[indexOf(keys, 'request')], 'method') as method, + count() as c +FROM http_with_arrays +WHERE status >= 400 + AND toDateTime(values[indexOf(keys, '@timestamp')]) BETWEEN '1998-01-01 00:00:00' AND '1998-06-01 00:00:00' +GROUP by method, status ORDER BY c DESC LIMIT 5; + +┌─status─┬─method─┬─────c─┐ +│ 404 │ GET │ 11267 │ +│ 404 │ HEAD │ 276 │ +│ 500 │ GET │ 160 │ +│ 500 │ POST │ 115 │ +│ 400 │ GET │ 81 │ +└────────┴────────┴───────┘ + +5 rows in set. Elapsed: 0.383 sec. Processed 8.22 million rows, 1.97 GB (21.45 million rows/s., 5.15 GB/s.) +Peak memory usage: 51.35 MiB. +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/schema.md b/docs/ja/integrations/data-ingestion/data-formats/json/schema.md new file mode 100644 index 00000000000..15d35d35aec --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/schema.md @@ -0,0 +1,789 @@ +--- +title: JSON スキーマの設計 +slug: /ja/integrations/data-formats/json/schema +description: JSON スキーマを最適に設計する方法 +keywords: [json, clickhouse, 挿入, ロード, フォーマット, スキーマ] +--- + +# スキーマを設計する + +[スキーマ推論](/docs/ja/integrations/data-formats/JSON/inference) を使用して JSON データの初期スキーマを設定し、S3 などの場所で JSON データファイルをクエリできますが、ユーザーはデータの最適化されたバージョン管理スキーマを確立することを目指すべきです。以下では、JSON 構造をモデリングするためのオプションについて説明します。 + +## 可能な限り抽出する + +可能な限り、JSON キーをスキーマのルートにあるカラムに抽出することをお勧めします。これによりクエリ構文が簡素化されるだけでなく、必要に応じてこれらのカラムを `ORDER BY` 句で使用したり、[二次インデックス](/docs/ja/optimize/skipping-indexes) を指定したりすることができます。 + +ガイド [**JSON スキーマ推論**](/docs/ja/integrations/data-formats/json/inference) で探求された [arxiv データセット](https://www.kaggle.com/datasets/Cornell-University/arxiv?resource=download) を考えてみましょう: + +```json +{ + "id": "2101.11408", + "submitter": "Daniel Lemire", + "authors": "Daniel Lemire", + "title": "Number Parsing at a Gigabyte per Second", + "comments": "Software at https://github.com/fastfloat/fast_float and\n https://github.com/lemire/simple_fastfloat_benchmark/", + "journal-ref": "Software: Practice and Experience 51 (8), 2021", + "doi": "10.1002/spe.2984", + "report-no": null, + "categories": "cs.DS cs.MS", + "license": "http://creativecommons.org/licenses/by/4.0/", + "abstract": "With disks and networks providing gigabytes per second ....\n", + "versions": [ + { + "created": "Mon, 11 Jan 2021 20:31:27 GMT", + "version": "v1" + }, + { + "created": "Sat, 30 Jan 2021 23:57:29 GMT", + "version": "v2" + } + ], + "update_date": "2022-11-07", + "authors_parsed": [ + [ + "Lemire", + "Daniel", + "" + ] + ] +} +``` + +`versions.created` の最初の値を `published_date` という名前でメインの注文キーにするとします。これを挿入前または挿入時に ClickHouse の [マテリアライズドビュー](/ja/guides/developer/cascading-materialized-views) または [マテリアライズドカラム](/ja/sql-reference/statements/alter/column#materialize-column) を使用して抽出する必要があります。 + +マテリアライズドカラムは、クエリ時にデータを抽出する最も簡単な方法を提供し、抽出ロジックが単純な SQL 式としてキャプチャできる場合に最も推奨されます。例として、`published_date` を arxiv スキーマにマテリアライズドカラムとして追加し、以下のように注文キーとして定義できます: + +```sql +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `journal-ref` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)), + `published_date` DateTime DEFAULT parseDateTimeBestEffort(versions[1].1) +) +ENGINE = MergeTree +ORDER BY published_date +``` + + +:::note ネストされたカラム式 +上記の方法では、位置で `created` カラムを参照する `versions[1].1` の表記を使用してタプルにアクセスする必要があります。これは、推奨される構文 `versions.created_at[1]` よりも簡単ではありません。 +::: + +データをロードすると、カラムが抽出されます: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +0 rows in set. Elapsed: 39.827 sec. Processed 2.52 million rows, 1.39 GB (63.17 thousand rows/s., 34.83 MB/s.) + +SELECT published_date +FROM arxiv_2 +LIMIT 2 +┌──────published_date─┐ +│ 2007-03-31 02:26:18 │ +│ 2007-03-31 03:16:14 │ +└─────────────────────┘ + +2 rows in set. Elapsed: 0.001 sec. +``` + +:::note マテリアライズドカラムの動作 +マテリアライズドカラムの値は常に挿入時に計算され、`INSERT` クエリで指定することはできません。マテリアライズドカラムはデフォルトでは `SELECT *` で返されません。これは、`SELECT *` の結果を常にテーブルに戻して `INSERT` できるという不変性を維持するためです。この動作は `asterisk_include_materialized_columns=1` を設定することで無効にできます。 +::: + +より複雑なフィルタリングと変換タスクには、[マテリアライズドビュー](/docs/ja/materialized-view) の使用をお勧めします。 + +## 静的 JSON と動的 JSON + +JSON のスキーマを定義する主なタスクは、それぞれのキーの値に対して適切な型を選定することです。ユーザーは次のルールを JSON 階層内の各キーに適用して、それぞれのキーに対して適切な型を決定することをお勧めします。 + +1. **プリミティブ型** - キーの値がプリミティブ型である場合、それがサブオブジェクトの一部であろうとルートであろうと、一般的なスキーマ[設計のベストプラクティス](/docs/ja/data-modeling/schema-design)と[型最適化ルール](/docs/ja/data-modeling/schema-design#optimizing-types)に従ってその型を選択してください。 以下の`phone_numbers`のようなプリミティブの配列は、`Array()` 例えば `Array(String)` としてモデル化することができます。 +2. **静的か動的か** - キーの値が複雑なオブジェクト、すなわちオブジェクトまたはオブジェクトの配列である場合、それが変更対象であるかどうか確認してください。新しいキーがめったに追加されないオブジェクトで、新しいキーの追加が予測可能で [`ALTER TABLE ADD COLUMN`](/docs/ja/sql-reference/statements/alter/column#add-column) によるスキーマ変更で対応できる場合は、**静的**とみなすことができます。これは、いくつかの JSON ドキュメントでのみキーのサブセットが提供されるオブジェクトを含みます。新しいキーが頻繁に追加され、または予測できないオブジェクトは **動的**とみなされるべきです。値が **静的** か **動的** かを確認するには、関連するセクション [**静的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-static-objects) および [**動的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-dynamic-objects) を参照してください。 + +

+ +**重要:** 上述のルールは再帰的に適用されるべきです。キーの値が動的であると判断された場合、それ以上の評価は不要であり、[**動的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-dynamic-objects) のガイドラインに従うことができます。オブジェクトが静的である場合、キーの値がプリミティブであるか動的キーに遭遇するまでサブキーを評価し続けます。 + +これらのルールを説明するために、人を表す次の JSON 例を使用します: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics", + "labels": { + "type": "database systems", + "founded": "2021" + } + }, + "dob": "2007-03-31", + "tags": { + "hobby": "Databases", + "holidays": [ + { + "year": 2024, + "location": "Azores, Portugal" + } + ], + "car": { + "model": "Tesla", + "year": 2023 + } + } +} +``` + +これらのルールを適用すると: + +- ルートキー `name`、`username`、`email`、`website` は `String` 型として表現できます。`phone_numbers` カラムはタイプ `Array(String)` のプリミティブの配列であり、`dob` と `id` はそれぞれ `Date` と `UInt32` 型です。 +- `address` オブジェクトには新しいキーが追加されません(新しいアドレスオブジェクトのみ)。したがって、**静的**とみなすことができます。再帰すると、すべてのサブカラムは(`geo` を除いて)プリミティブ(および `String` 型)とみなすことができます。これも `lat` および `lon` の 2 つの `Float32` カラムを持つ静的構造です。 +- `tags` カラムは **動的** です。このオブジェクトに任意のタグが追加され、構造の変更があると仮定します。 +- `company` オブジェクトは **静的** で、指定された最大 3 つのキーしか持ちません。サブキー `name` および `catchPhrase` は `String` 型です。キー `labels` は **動的** です。このオブジェクトに任意のタグを追加できると仮定します。値は常にタイプ文字列のキーと値のペアになります。 + +## 静的オブジェクトの処理 + +静的オブジェクトには名前付きタプル、すなわち `Tuple` を使用することをお勧めします。オブジェクトの配列はタプルの配列、すなわち `Array(Tuple)` を使用して保持できます。タプル内では、カラムとそれに対応する型は同じルールを使用して定義されるべきです。これは、以下に示すように、ネストされたオブジェクトを表すネストされた `Tuple` を導く可能性があります。 + +これを示すために、前述の JSON の人の例を使用し、動的オブジェクトを省略します: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics" + }, + "dob": "2007-03-31" +} +``` + +このテーブルのスキーマは以下のようになります: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date +) +ENGINE = MergeTree +ORDER BY username +``` + +`company` カラムが `Tuple(catchPhrase String, name String)` として定義されていることに注意してください。`address` フィールドはネストされた `Tuple` を持つ `Array(Tuple)` を使用しています。 + +JSON は現状の構造でこのテーブルに挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} +``` + +上記の例ではデータが最小限ですが、以下に示すように、タプルフィールドをピリオド区切り名でクエリできます。 + +```sql +SELECT + address.street, + company.name +FROM people + +┌─address.street────┬─company.name─┐ +│ ['Victor Plains'] │ ClickHouse │ +└───────────────────┴──────────────┘ +``` + +`address.street` カラムが `Array` として返される方法に注意してください。配列内の特定のオブジェクトを位置によってクエリするには、配列のオフセットをカラム名の後に指定する必要があります。例えば、最初の住所から通りを取得するには: + +```sql +SELECT address.street[1] AS street +FROM people + +┌─street────────┐ +│ Victor Plains │ +└───────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +タプルの主な欠点は、サブカラムを注文キーとして使用できないことです。したがって、以下は失敗します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date +) +ENGINE = MergeTree +ORDER BY company.name + +Code: 47. DB::Exception: Missing columns: 'company.name' while processing query: 'company.name', required columns: 'company.name' 'company.name'. (UNKNOWN_IDENTIFIER) +``` + +:::note 注文キー内のタプル +タプルカラムは注文キーに使用できませんが、タプル全体を使用することができます。ただし、これはあまり意味をなさない場合が多いです。 +::: + +### デフォルト値の処理 + +JSON オブジェクトは構造化されていても、しばしば既知のキーのサブセットしか提供されません。幸いにも、`Tuple` 型は JSON ペイロードのすべてのカラムを要求するわけではありません。指定されていない場合、デフォルトの値が使用されます。 + +前述の `people` テーブルと、`suite`、`geo`、`phone_numbers` および `catchPhrase` キーが欠けている以下のスパースな JSON を考えてみてください。 + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "city": "Wisokyburgh", + "zipcode": "90566-7771" + } + ], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse" + }, + "dob": "2007-03-31" +} +``` + +この行が正常に挿入されることが以下に示されています: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","city":"Wisokyburgh","zipcode":"90566-7771"}],"website":"clickhouse.com","company":{"name":"ClickHouse"},"dob":"2007-03-31"} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +この 1 行をクエリすると、(サブオブジェクトを含む)省略されたカラムに対してデフォルト値が使用されていることが確認できます: + +```sql +SELECT * +FROM people +FORMAT PrettyJSONEachRow + +{ + "id": "1", + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "city": "Wisokyburgh", + "geo": { + "lat": 0, + "lng": 0 + }, + "street": "Victor Plains", + "suite": "", + "zipcode": "90566-7771" + } + ], + "phone_numbers": [], + "website": "clickhouse.com", + "company": { + "catchPhrase": "", + "name": "ClickHouse" + }, + "dob": "2007-03-31" +} + +1 row in set. Elapsed: 0.001 sec. +``` + +:::note 空と null の区別 +値が空であることと提供されないことを区別する必要がある場合は、[Nullable 型](/docs/ja/sql-reference/data-types/nullable) を使用することができます。これが絶対に必要でない限り、[Nullable カラムは避ける](/docs/ja/cloud/bestpractices/avoid-nullable-columns) べきです。なぜなら、これによりこれらのカラムのストレージとクエリのパフォーマンスが悪化するためです。 +::: + +### 新しいカラムの処理 + +JSON キーが静的である場合、構造化されたアプローチが最も簡単ですが、新しいキーが事前に知られていて、スキーマに応じて変更可能な場合、このアプローチを使用することも可能です。 + +ClickHouse はデフォルトで、スキーマに存在しない JSON キーをペイロードに提供しても無視します。以下のように、`nickname` キーが追加された修正済み JSON ペイロードを考えてみてください: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "nickname": "Clicky", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics" + }, + "dob": "2007-03-31" +} +``` + +`nickname` キーが無視された状態でこの JSON を正常に挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +カラムは [`ALTER TABLE ADD COLUMN`](/ja/sql-reference/statements/alter/column#add-column) コマンドを使用してスキーマに追加できます。 `DEFAULT` 句を介してデフォルトを指定することができ、これはその後の挿入で指定されていない場合に使用されます。この値が存在しない行(作成前に挿入された行)に対しても、このデフォルト値が返されます。 `DEFAULT` 値が指定されていない場合、型に対するデフォルト値が使用されます。 + +例えば: + +```sql +-- 初期行を挿入(nickname は無視されます) +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +-- カラムを追加 +ALTER TABLE people + (ADD COLUMN `nickname` String DEFAULT 'no_nickname') + +-- 新しい行を挿入(同じデータ、異なるID) +INSERT INTO people FORMAT JSONEachRow +{"id":2,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +-- 2 行を選択 +SELECT id, nickname FROM people + +┌─id─┬─nickname────┐ +│ 2 │ Clicky │ +│ 1 │ no_nickname │ +└────┴─────────────┘ + +2 rows in set. Elapsed: 0.001 sec. +``` + +## 動的オブジェクトの処理 + +動的オブジェクトの処理には、次の 2 つの推奨アプローチがあります: + +- [Map(String,V)](/docs/ja/sql-reference/data-types/map) 型 +- [String](/docs/ja/sql-reference/data-types/string) を使用した JSON 関数 + +以下のルールを適用して、最も適切なものを決定できます。 + +1. オブジェクトが非常に動的で、予測可能な構造がなく、任意のネストされたオブジェクトを含む場合、`String` 型を使用することをお勧めします。必要なフィールドはクエリ時に JSON 関数を使用して抽出できます。 +2. オブジェクトが主に 1 つのタイプの任意のキーを格納するために使用されている場合、`Map` 型を検討します。理想的には、ユニークなキーの数は数百を超えないべきです。`Map` 型は、ラベルやタグ、例えばログデータ内の Kubernetes ポッドラベルに使用されるべきです。 + +
+ +:::note オブジェクトレベルのアプローチの適用 +同じスキーマ内で異なるオブジェクトに異なる技術が適用される可能性があります。一部のオブジェクトは `String` で最善に解決し、他のオブジェクトは `Map` を適用します。`String` 型が使用されると、これ以上スキーマの決定を行う必要はありません。対照的に、`Map` キーとしてサブオブジェクト(JSON を表す `String` を含む)をネストすることが可能です。 +::: + +### String を使用する + +動的な JSON を持つユーザーにとって、構造化されたアプローチを使用することはしばしば現実的ではないため、スキーマが十分に理解されていないか変更対象となるためです。絶対の柔軟性を得るために、ユーザーはデータを `String` として格納し、必要に応じて関数を使用してフィールドを抽出することができます。これは、構造化されたオブジェクトとして JSON を処理することの対極を表します。この柔軟性は、クエリ構文の複雑化およびパフォーマンスの低下という形でコストを負います。 + +前述の、[オリジナルの person オブジェクト](/docs/ja/integrations/data-formats/json/schema#static-vs-dynamic-json) を例にすると、`tags` カラムの構造が確保できません。オリジナルの行を挿入し(`company.labels` も含めますが、ここでは無視します)、`Tags` カラムを `String` と宣言します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date, + `tags` String +) +ENGINE = MergeTree +ORDER BY username + +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics","labels":{"type":"database systems","founded":"2021"}},"dob":"2007-03-31","tags":{"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}}} + +Ok. +1 row in set. Elapsed: 0.002 sec. +``` + +`tags` カラムを選択すると、JSON が文字列として挿入されたことが見て取れます: + +```sql +SELECT tags +FROM people + +┌─tags───────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}} │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +[JSONExtract](/docs/ja/sql-reference/functions/json-functions#jsonextract-functions) 関数を使用して、この JSON から値を取得できます。以下の簡単な例をご覧ください: + +```sql +SELECT JSONExtractString(tags, 'holidays') as holidays FROM people + +┌─holidays──────────────────────────────────────┐ +│ [{"year":2024,"location":"Azores, Portugal"}] │ +└───────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +関数が JSON 内のパスを抽出するために `String` カラム `tags` と JSON 内のパスが必要なことに注意してください。ネストされたパスには、関数をネストする必要があります。例えば、 `tags.car.year` カラムを抽出するための `JSONExtractUInt(JSONExtractString(tags, 'car'), 'year')` です。ネストされたパスの抽出は、関数 [JSON_QUERY](/docs/ja/sql-reference/functions/json-functions.md/#json_queryjson-path) もしくは [JSON_VALUE](/docs/ja/sql-reference/functions/json-functions.md/#json_valuejson-path) を通じて簡素化することができます。 + +`arxiv` データセットを考えてみて、すべての本文を `String` として扱うケースの極端な例を考えてみましょう。 + +```sql +CREATE TABLE arxiv ( + body String +) +ENGINE = MergeTree ORDER BY () +``` + +このスキーマに挿入するには、`JSONAsString` フォーマットを使用する必要があります: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz', 'JSONAsString') + +0 rows in set. Elapsed: 25.186 sec. Processed 2.52 million rows, 1.38 GB (99.89 thousand rows/s., 54.79 MB/s.) +``` + +年ごとにリリースされた論文の数をカウントする必要があるとします。スキーマの [構造化バージョン](/docs/ja/integrations/data-formats/json/inference#creating-tables) と、単一の文字列を使用した場合のクエリを比較してみましょう: + +```sql +-- 構造化スキーマを使用 +SELECT + toYear(parseDateTimeBestEffort(versions.created[1])) AS published_year, + count() AS c +FROM arxiv_v2 +GROUP BY published_year +ORDER BY c ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 0.264 sec. Processed 2.31 million rows, 153.57 MB (8.75 million rows/s., 582.58 MB/s.) + +-- 非構造化文字列を使用 + +SELECT + toYear(parseDateTimeBestEffort(JSON_VALUE(body, '$.versions[0].created'))) AS published_year, + count() AS c +FROM arxiv +GROUP BY published_year +ORDER BY published_year ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 1.281 sec. Processed 2.49 million rows, 4.22 GB (1.94 million rows/s., 3.29 GB/s.) +Peak memory usage: 205.98 MiB. +``` + +ここで、`JSON_VALUE(body, '$.versions[0].created')` のようにクエリで JSON をメソッドによってフィルターするために xpath 式を使用していることに注意してください。 + +文字列関数は、インデックスを伴う明示的な型変換よりも顕著に遅いため、上記のクエリは常にフルテーブルスキャンとすべての行の処理を必要とします。このような小さなデータセットでは、クエリは依然として高速である可能性がありますが、大規模なデータセットにおいてはパフォーマンスが低下する可能性があります。 + +このアプローチの柔軟性は明確なパフォーマンスと構文のコストがかかるため、スキーマ内の非常に動的なオブジェクトにのみ使用するべきです。 + +#### シンプルJSON関数 + +上記の例では、JSON* 関数ファミリーを使用しています。これらの関数は、[simdjson](https://github.com/simdjson/simdjson) に基づいた厳密な JSON パーサーを利用し、異なるレベルでネストされた場合のフィールドを区別します。これらの関数は、構文的には正しいがフォーマットが整っていない JSON、例としてフィールド間に二重スペースがある場合を処理することができます。 + +より高速で厳格な一連の関数が利用可能です。これらの `simpleJSON*` 関数は、JSON の構造とフォーマットに対して厳しい前提を作ることによって主に性能を向上させます。具体的には: + +* フィールド名は定数である必要があります。 +* フィールド名のエンコーディングが一貫していること。例:`simpleJSONHas('{"abc":"def"}', 'abc') = 1` ですが、`visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0` です。 +* フィールド名はすべてのネストされた構造で一意である必要があります。ネストレベル間の区別はなく、マッチングは無差別です。複数のマッチングフィールドがある場合、最初の出現が使用されます。 +* ストリングリテラル外での特殊文字はありません。これにはスペースが含まれます。次の例は無効であり、パースされません。 + + ```json + {"@timestamp": 893964617, "clientip": "40.135.0.0", "request": {"method": "GET", + "path": "/images/hm_bg.jpg", "version": "HTTP/1.0"}, "status": 200, "size": 24736} + ``` + + 一方、次の例は正しく解析されます: + + ```json + {"@timestamp":893964617,"clientip":"40.135.0.0","request":{"method":"GET", + "path":"/images/hm_bg.jpg","version":"HTTP/1.0"},"status":200,"size":24736} + ``` + +これらの関数が適切であり、性能が重要で JSON が上記の要件を満たす場合に、使用することができます。以下は、`simpleJSON*` 関数を使用して再書かれた前述のクエリの例です: + +```sql +SELECT + toYear(parseDateTimeBestEffort(simpleJSONExtractString(simpleJSONExtractRaw(body, 'versions'), 'created'))) AS published_year, + count() AS c +FROM arxiv +GROUP BY published_year +ORDER BY published_year ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 0.964 sec. Processed 2.48 million rows, 4.21 GB (2.58 million rows/s., 4.36 GB/s.) +Peak memory usage: 211.49 MiB. +``` + +上記の例では、公開日付用に最初の値を取得するために `simpleJSONExtractString` を使用して `created` キーを抽出しています。この場合、性能向上のため `simpleJSON*` 関数の制限が受け入れられます。 + +### Map を使用する + +オブジェクトが主に 1 つのタイプの任意のキーを格納するために使用されている場合、`Map` 型を検討します。理想的には、ユニークなキーの数は数百を超えないべきです。`Map` 型は、ラベルやタグ、例えばログデータ内の Kubernetes ポッドラベルに使用されるべきです。`Map` がサポートするオブジェクトの構築にはいくつかの制限があります: + +- フィールドはすべて同じ型である必要があります。 +- サブカラムにアクセスするには、特殊なマップ構文が必要です。フィールドはカラムとして存在せず、オブジェクト全体がカラムです。 +- サブカラムにアクセスすると、`Map` 値全体、すなわちすべての兄弟とその各々の値がロードされます。大きなマップでは、これが重大なパフォーマンスペナルティになる可能性があります。 + +:::note 文字列キー +オブジェクトを `Map` としてモデリングする場合、JSON キー名を格納するために `String` キーが使用されます。したがって、マップは常に `Map(String, T)` となり、`T` はデータによって異なります。 +::: + +#### プリミティブ値 + +`Map` を最も単純に適用する方法は、オブジェクトが同じプリミティブ型の値を含む場合です。ほとんどのケースでは、値 `T` に `String` 型を使用することが含まれます。 + +前述の [people の JSON](/docs/ja/integrations/data-formats/json/schema#static-vs-dynamic-json) を考えた際、`company.labels` オブジェクトが動的であると判断しました。重要なのは、このオブジェクトには `String` 型のキー値ペアが追加されると考えられることです。したがって、これを `Map(String, String)` として宣言できます: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String, labels Map(String,String)), + `dob` Date, + `tags` String +) +ENGINE = MergeTree +ORDER BY username +``` + +元の完全な JSON オブジェクトを挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics","labels":{"type":"database systems","founded":"2021"}},"dob":"2007-03-31","tags":{"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}}} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +リクエストオブジェクト内のフィールドをクエリする際には、以下のようなマップ構文が必要です: + +```sql +SELECT company.labels FROM people + +┌─company.labels───────────────────────────────┐ +│ {'type':'database systems','founded':'2021'} │ +└──────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. + +SELECT company.labels['type'] AS type FROM people + +┌─type─────────────┐ +│ database systems │ +└──────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +この型をクエリするための `Map` 関数の完全なセットが [ここに](/docs/ja/sql-reference/functions/tuple-map-functions.md) 示されています。データが一貫した型でない場合、[必要な型の型変換](/docs/ja/sql-reference/functions/type-conversion-functions) を行う関数が存在します。 + +#### オブジェクト値 + +オブジェクトが一貫性のあるタイプを持つサブオブジェクトを持つ場合も、`Map` 型を考慮できます。 + +たとえば、`tags` キー用の `persons` オブジェクトが一貫した構造を要求する場合、各 `tag` のサブオブジェクトには `name` と `time` カラムが含まれます。簡素化されたこのような JSON ドキュメントの例は以下のようになります: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "tags": { + "hobby": { + "name": "Diving", + "time": "2024-07-11 14:18:01" + }, + "car": { + "name": "Tesla", + "time": "2024-07-11 15:18:23" + } + } +} +``` + +これは、`Map(String, Tuple(name String, time DateTime))` を使用してモデリングすることができます。以下に示します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `tags` Map(String, Tuple(name String, time DateTime)) +) +ENGINE = MergeTree +ORDER BY username + +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","tags":{"hobby":{"name":"Diving","time":"2024-07-11 14:18:01"},"car":{"name":"Tesla","time":"2024-07-11 15:18:23"}}} + +Ok. + +1 row in set. Elapsed: 0.002 sec. + +SELECT tags['hobby'] AS hobby +FROM people +FORMAT JSONEachRow + +{"hobby":{"name":"Diving","time":"2024-07-11 14:18:01"}} + +1 row in set. Elapsed: 0.001 sec. +``` + +このケースでのマップの適用は一般的には稀であり、データが再モデリングされ、動的キー名がサブオブジェクトを持たないようにすることが適切であることを示唆します。例えば、上記の例を以下のように再モデリングすることで、`Array(Tuple(key String, name String, time DateTime))` を使用できるようになります。 + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "tags": [ + { + "key": "hobby", + "name": "Diving", + "time": "2024-07-11 14:18:01" + }, + { + "key": "car", + "name": "Tesla", + "time": "2024-07-11 15:18:23" + } + ] +} +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/parquet.md b/docs/ja/integrations/data-ingestion/data-formats/parquet.md new file mode 100644 index 00000000000..8a6ede08183 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/parquet.md @@ -0,0 +1,195 @@ +--- +sidebar_label: Parquet +sidebar_position: 3 +slug: /ja/integrations/data-formats/parquet +--- + +# ClickHouseでのParquetの取り扱い + +Parquetは、データを列指向で効率的に保存するためのファイル形式です。ClickHouseはParquetファイルの読み書きをサポートしています。 + +:::tip +クエリでファイルパスを参照する場合、ClickHouseがどの場所から読み取ろうとするかは、使用しているClickHouseのバリアントに依存します。 + +[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用している場合、ClickHouse Localを起動した場所に相対的な位置から読み取ります。 +ClickHouse Serverまたは`clickhouse client`を介してClickHouse Cloudを使用している場合、サーバー上の`/var/lib/clickhouse/user_files/`ディレクトリに相対的な位置から読み取ります。 +::: + +## Parquetからのインポート + +データを読み込む前に、[file()](/docs/ja/sql-reference/functions/files.md/#file)関数を使用して[例のparquetファイル](assets/data.parquet)の構造を調べることができます。 + +```sql +DESCRIBE TABLE file('data.parquet', Parquet); +``` + +第2引数として[Parquet](/docs/ja/interfaces/formats.md/#data-format-parquet)を使用したので、ClickHouseはファイル形式を認識します。これによりカラムと型が表示されます。 + +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ date │ Nullable(String) │ │ │ │ │ │ +│ hits │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +データを実際にインポートする前に、SQLの力を利用してファイルを調べることもできます。 + +```sql +SELECT * +FROM file('data.parquet', Parquet) +LIMIT 3; +``` + +```response +┌─path──────────────────────┬─date───────┬─hits─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴──────┘ +``` + +:::tip +`file()`および`INFILE`/`OUTFILE`のための明示的な形式設定を省略することができます。その場合、ClickHouseはファイル拡張子に基づいて形式を自動的に検出します。 +::: + +## 既存テーブルへのインポート + +Parquetデータをインポートするためのテーブルを作成してみましょう。 + +```sql +CREATE TABLE sometable +( + `path` String, + `date` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY (date, path); +``` + +次に、`FROM INFILE`句を使用してデータをインポートできます。 + +```sql +INSERT INTO sometable +FROM INFILE 'data.parquet' FORMAT Parquet; + +SELECT * +FROM sometable +LIMIT 5; +``` + +```response +┌─path──────────────────────────┬───────date─┬─hits─┐ +│ 1988_in_philosophy │ 2015-05-01 │ 70 │ +│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │ +│ 24_hours_of_lemans │ 2015-05-01 │ 37 │ +│ 25604_Karlin │ 2015-05-01 │ 20 │ +│ ASCII_ART │ 2015-05-01 │ 9 │ +└───────────────────────────────┴────────────┴──────┘ +``` + +ClickHouseがParquetの文字列(`date`カラムで)を`Date`型に自動的に変換することに注目してください。これは、ClickHouseがターゲットテーブルの型に基づいて型キャストを自動的に行うためです。 + +## ローカルファイルをリモートサーバーに挿入 + +ローカルのParquetファイルをリモートのClickHouseサーバーに挿入したい場合は、以下のようにファイルの内容を`clickhouse-client`にパイプすることで行えます。 + +```sql +clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet +``` + +## Parquetファイルから新しいテーブルを作成 + +ClickHouseはParquetファイルのスキーマを読み取るため、即座にテーブルを作成することができます。 + +```sql +CREATE TABLE imported_from_parquet +ENGINE = MergeTree +ORDER BY tuple() AS +SELECT * +FROM file('data.parquet', Parquet) +``` + +これにより、指定されたParquetファイルから自動的にテーブルを作成および入力します。 + +```sql +DESCRIBE TABLE imported_from_parquet; +``` + +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ date │ Nullable(String) │ │ │ │ │ │ +│ hits │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +デフォルトでは、ClickHouseはカラム名、型、および値に厳密です。しかし、インポート中に存在しないカラムやサポートされていない値をスキップすることもできます。これらは[Parquet設定](/docs/ja/interfaces/formats.md/#parquet-format-settings)で管理できます。 + +## Parquet形式へのエクスポート + +:::tip +`INTO OUTFILE`を使用してClickHouse Cloudでエクスポートする際には、ファイルが書き込まれるマシンで`clickhouse client`でコマンドを実行する必要があります。 +::: + +任意のテーブルやクエリ結果をParquetファイルにエクスポートするには、`INTO OUTFILE`句を使用できます。 + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'export.parquet' +FORMAT Parquet +``` + +これにより、作業ディレクトリに`export.parquet`ファイルが作成されます。 + +## ClickHouseとParquetデータ型 + +ClickHouseとParquetのデータ型はほとんどが同じですが、[若干異なる部分](/docs/ja/interfaces/formats.md/#data-types-matching-parquet)もあります。例えば、ClickHouseは`DateTime`型をParquetの`int64`としてエクスポートします。これを再びClickHouseにインポートすると、次のように数値が表示されます([time.parquetファイル](assets/time.parquet))。 + +```sql +SELECT * FROM file('time.parquet', Parquet); +``` + +```response +┌─n─┬───────time─┐ +│ 0 │ 1673622611 │ +│ 1 │ 1673622610 │ +│ 2 │ 1673622609 │ +│ 3 │ 1673622608 │ +│ 4 │ 1673622607 │ +└───┴────────────┘ +``` + +この場合、[型変換](/docs/ja/sql-reference/functions/type-conversion-functions.md)を使用することができます。 + +```sql +SELECT + n, + toDateTime(time) <--- int から時刻へ +FROM file('time.parquet', Parquet); +``` + +```response +┌─n─┬────toDateTime(time)─┐ +│ 0 │ 2023-01-13 15:10:11 │ +│ 1 │ 2023-01-13 15:10:10 │ +│ 2 │ 2023-01-13 15:10:09 │ +│ 3 │ 2023-01-13 15:10:08 │ +│ 4 │ 2023-01-13 15:10:07 │ +└───┴─────────────────────┘ +``` + +## 詳細な情報 + +ClickHouseは、多くの形式、テキスト、バイナリをサポートしており、さまざまなシナリオやプラットフォームに対応しています。以下の記事で多様な形式とそれらの取り扱い方法を探ってみてください。 + +- [CSV and TSV形式](csv-tsv.md) +- [Avro, Arrow and ORC](arrow-avro-orc.md) +- [JSON形式](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [Regexとテンプレート](templates-regex.md) +- [ネイティブとバイナリ形式](binary.md) +- [SQL形式](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してみてください。ClickHouseサーバーがなくてもローカル/リモートファイルで作業できるポータブルなフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/sql.md b/docs/ja/integrations/data-ingestion/data-formats/sql.md new file mode 100644 index 00000000000..046dd7b588f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/sql.md @@ -0,0 +1,112 @@ +--- +sidebar_label: SQL ダンプ +slug: /ja/integrations/data-formats/sql +--- + +# ClickHouseでのSQLデータの挿入とダンプ + +ClickHouseは、さまざまな方法でOLTPデータベースインフラストラクチャに簡単に統合することができます。その一つの方法は、他のデータベースとClickHouse間でSQLダンプを利用してデータを転送することです。 + +## SQLダンプの作成 + +データは[SQLInsert](/docs/ja/interfaces/formats.md/#sqlinsert)を使用してSQL形式でダンプできます。ClickHouseはデータを`INSERT INTO VALUES(...)`の形式で書き込み、`output_format_sql_insert_table_name`設定オプションをテーブル名として使用します。 + +```sql +SET output_format_sql_insert_table_name = 'some_table'; +SELECT * FROM some_data +INTO OUTFILE 'dump.sql' +FORMAT SQLInsert +``` + +カラム名は[`output_format_sql_insert_include_column_names`](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_include_column_names)オプションを無効にすることで省略できます。 + +```sql +SET output_format_sql_insert_include_column_names = 0 +``` + +今度は[dump.sql](assets/dump.sql)ファイルを他のOLTPデータベースに供給できます。 + +```bash +mysql some_db < dump.sql +``` + +ここでは、`some_db` MySQLデータベースに`some_table`テーブルが存在すると仮定しています。 + +一部のDBMSは、1回のバッチで処理できる値の量に制限がある場合があります。デフォルトではClickHouseは65kの値のバッチを作成しますが、[`output_format_sql_insert_max_batch_size`](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_max_batch_size)オプションでこれを変更できます。 + +```sql +SET output_format_sql_insert_max_batch_size = 1000; +``` + +### 一連の値のエクスポート + +ClickHouseには、`INSERT INTO table VALUES`部分を省略し、一連の値のみを返す[Values](/docs/ja/interfaces/formats.md/#data-format-values)形式があります。 + +```sql +SELECT * FROM some_data LIMIT 3 FORMAT Values +``` +```response +('Bangor_City_Forest','2015-07-01',34),('Alireza_Afzal','2017-02-01',24),('Akhaura-Laksam-Chittagong_Line','2015-09-01',30) +``` + +## SQLダンプからのデータの挿入 + +SQLダンプを読み取るためには、[MySQLDump](/docs/ja/interfaces/formats.md/#mysqldump)を使用します。 + +```sql +SELECT * +FROM file('dump.sql', MySQLDump) +LIMIT 5 +``` +```response +┌─path───────────────────────────┬──────month─┬─hits─┐ +│ Bangor_City_Forest │ 2015-07-01 │ 34 │ +│ Alireza_Afzal │ 2017-02-01 │ 24 │ +│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │ +│ 1973_National_500 │ 2017-10-01 │ 80 │ +│ Attachment │ 2017-09-01 │ 1356 │ +└────────────────────────────────┴────────────┴──────┘ +``` + +デフォルトでClickHouseは未知のカラムをスキップします(これは[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)オプションによって制御されます)し、ダンプに複数のテーブルが含まれる場合、最初に見つかったテーブルのデータを処理します。DDL文はスキップされます。MySQLダンプからテーブルにデータを読み込むためには(例: [mysql.sql](assets/mysql.sql) ファイル)以下のようにします。 + +```sql +INSERT INTO some_data +FROM INFILE 'mysql.sql' FORMAT MySQLDump +``` + +また、MySQLダンプファイルから自動的にテーブルを作成することもできます。 + +```sql +CREATE TABLE table_from_mysql +ENGINE = MergeTree +ORDER BY tuple() AS +SELECT * +FROM file('mysql.sql', MySQLDump) +``` + +ここでは、ClickHouseが自動的に推測した構造に基づいて`table_from_mysql`という名前のテーブルを作成しました。ClickHouseはデータに基づいてタイプを検出するか、利用可能な場合はDDLを使用します。 + +```sql +DESCRIBE TABLE table_from_mysql; +``` +```response +┌─name──┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ month │ Nullable(Date32) │ │ │ │ │ │ +│ hits │ Nullable(UInt32) │ │ │ │ │ │ +└───────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## その他のフォーマット + +ClickHouseは、さまざまなシナリオやプラットフォームに対応するために、多くのフォーマットをテキストとバイナリの両方でサポートしています。以下の記事でさらに多くのフォーマットやその扱い方について学んでください。 + +- [CSVとTSVフォーマット](csv-tsv.md) +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブとバイナリフォーマット](binary.md) +- **SQLフォーマット** + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してください。これは、ClickHouseサーバーを使わずにローカル/リモートファイル上でSQLで作業するためのポータブルなフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md b/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md new file mode 100644 index 00000000000..0e5734f4920 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md @@ -0,0 +1,243 @@ +--- +sidebar_label: 正規表現とテンプレート +sidebar_position: 3 +slug: /ja/integrations/data-formats/templates-regexp +--- + +# ClickHouseでテンプレートと正規表現を使用したカスタムテキストデータのインポートとエクスポート + +私たちはしばしばカスタムテキストフォーマットのデータを扱わなければならないことがあります。それは標準ではないフォーマット、不正なJSON、壊れたCSVなどです。CSVやJSONのような標準パーサを使用しても、これらのすべてのケースで動作するわけではありません。しかし、ClickHouseには強力なテンプレートと正規表現フォーマットがあります。 + +## テンプレートに基づいたインポート +次の[ログファイル](assets/error.log)からデータをインポートしたいとします。 + +```bash +head error.log +``` +```response +2023/01/15 14:51:17 [error] client: 7.2.8.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:02:09 [error] client: 8.4.2.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:46:13 [error] client: 6.9.3.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:34:55 [error] client: 9.9.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +``` + +このデータをインポートするために、[テンプレート](/docs/ja/interfaces/formats.md/#format-template)フォーマットを使用することができます。入力データの各行に値のプレースホルダーを持つテンプレート文字列を定義する必要があります。 + +``` +
%20FORMAT%20JSONEachRow`を指定します。**注意**:クエリはエンコードされている必要があります。 + * `Endpoint Authentication type` - BASIC + * `Auth username` - ClickHouseのユーザー名 + * `Auth password` - ClickHouseのパスワード + +:::note + このHTTP Urlはエラーが発生しやすいです。正確なエスケープを心がけてください。 +::: + +Auth options for Confluent HTTP Sink +
+ +* 設定 + * `Input Kafka record value format` ソースデータに依存しますが、ほとんどの場合JSONまたはAvroです。以下の設定では`JSON`を想定しています。 + * `advanced configurations` セクションでは: + * `HTTP Request Method` - POSTに設定 + * `Request Body Format` - json + * `Batch batch size` - ClickHouseの推奨に基づき、**最低でも1000**に設定します。 + * `Batch json as array` - true + * `Retry on HTTP codes` - 400-500ですが、必要に応じて適応。例:ClickHouseの前にHTTPプロキシがある場合は変更が必要な場合があります。 + * `Maximum Reties` - デフォルト(10)が適切ですが、より強力なリトライを望む場合は調整してください。 + +Advanced options for Confluent HTTP Sink + +#### 5. 接続性のテスト +HTTP Sinkで設定したトピックにメッセージを作成 +Create a message in the topic + +
+ +そして、作成されたメッセージがClickHouseインスタンスに書き込まれたことを確認します。 + +### トラブルシューティング +#### HTTP Sinkがメッセージをバッチ処理しない + +[Sinkドキュメント](https://docs.confluent.io/kafka-connectors/http/current/overview.html#http-sink-connector-for-cp)からの引用: +> Kafkaヘッダ値が異なるメッセージの場合、HTTP Sinkコネクタは要求をバッチ処理しません。 + +1. Kafkaレコードに同じキーがあることを確認します。 +2. HTTP APIのURLにパラメータを追加すると、各レコードがユニークなURLを生成する可能性があります。このため、追加のURLパラメータを使用する場合、バッチ処理は無効になります。 + +#### 400 Bad Request +##### CANNOT_PARSE_QUOTED_STRING +HTTP Sinkが`String`カラムにJSONオブジェクトを挿入する際に以下のメッセージで失敗する場合: + +``` +Code: 26. DB::ParsingException: Cannot parse JSON string: expected opening quote: (while reading the value of key key_name): While executing JSONEachRowRowInputFormat: (at row 1). (CANNOT_PARSE_QUOTED_STRING) +``` + +URLに`input_format_json_read_objects_as_strings=1`設定をエンコードされた文字列として追加します `SETTINGS%20input_format_json_read_objects_as_strings%3D1` + +### GitHubデータセットをロードする(オプション) + +この例では、GitHubデータセットの配列フィールドを保ちます。例では空のgithubトピックを想定し、メッセージの挿入に[kcat](https://github.com/edenhill/kcat)を使用します。 + +##### 1. 設定を準備する + +[これらの手順](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#set-up-a-local-connect-worker-with-cp-install) に従って、インストールタイプに関連するConnectをセットアップしてください。スタンドアロンと分散型クラスターの違いに注意してください。Confluent Cloudを使用する場合、分散設定が該当します。 + +最も重要なパラメータは`http.api.url`です。ClickHouse用の[HTTPインターフェース](../../../../interfaces/http.md) では、INSERT文をURLのパラメータとしてエンコードする必要があります。これはフォーマット(この場合、`JSONEachRow`)とターゲットデータベースを含む必要があります。フォーマットはKafkaデータと一貫していなければなりません。これらのパラメータはURLエスケープされなければなりません。GitHubデータセット用のこのフォーマットの例を以下に示します(ClickHouseがローカルで実行されていると想定): + +``` +://:?query=INSERT%20INTO%20.
%20FORMAT%20JSONEachRow + +http://localhost:8123?query=INSERT%20INTO%20default.github%20FORMAT%20JSONEachRow +``` + +HTTP SinkをClickHouseで使用するための追加パラメータは以下の通りです。完全なパラメータリストは[こちら](https://docs.confluent.io/kafka-connect-http/current/connector_config.html)をご覧ください: + +* `request.method` - **POST**に設定 +* `retry.on.status.codes` - エラーステータスコード(400-500)でリトライするように設定します。データで予想されるエラーに基づいて詳細化してください。 +* `request.body.format` - 多くの場合、これはJSONです。 +* `auth.type` - ClickHouseのセキュリティを使用する場合、BASICに設定します。他のClickHouse互換認証メカニズムは現在サポートされていません。 +* `ssl.enabled` - SSLを使用する場合はtrueに設定します。 +* `connection.user` - ClickHouseのユーザー名。 +* `connection.password` - ClickHouseのパスワード。 +* `batch.max.size` - 1回のバッチで送信する行数です。適切に大きな数になるように設定します。ClickHouse [推奨事項](../../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data) に基づき、1000が最小と考えられます。 +* `tasks.max` - HTTP Sinkコネクタは1つ以上のタスクを実行することをサポートします。これによりパフォーマンスを向上させることができます。バッチサイズとともに、これがパフォーマンスを向上させる主な手段です。 +* `key.converter` - キーのタイプに応じて設定します。 +* `value.converter` - トピック上のデータのタイプに基づいて設定します。このデータはスキーマを必要としません。ここでのフォーマットは、`http.api.url`パラメータで指定されたFORMATと一貫している必要があります。最も単純なのはJSONを使用し、org.apache.kafka.connect.json.JsonConverterコンバータを使用することです。値を文字列として扱うことも可能です(org.apache.kafka.connect.storage.StringConverterコンバータを通じて)- ただし、これはINSERTステートメントで関数を使用して値を抽出する必要があるでしょう。[Avroフォーマット](../../../../interfaces/formats.md#data-format-avro) もClickHouseでサポートされており、io.confluent.connect.avro.AvroConverterコンバータを使用する場合に利用可能です。 + +プロキシの設定やリトライ、高度なSSL設定を含む設定の詳細は[こちら](https://docs.confluent.io/kafka-connect-http/current/connector_config.html)をご覧ください。 + +Githubサンプルデータ用の例の設定ファイルは[こちら](https://github.com/ClickHouse/clickhouse-docs/tree/main/docs/en/integrations/data-ingestion/kafka/code/connectors/http_sink)にあります。Connectがスタンドアロンモードで実行され、KafkaがConfluent Cloudでホストされていると仮定しています。 + +##### 2. ClickHouseテーブルを作成する + +テーブルが作成されていることを確認してください。MergeTreeを使用した最小限のGitHubデータセットの例を以下に示します。 + + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4,'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) + +``` + +##### 3. Kafkaにデータを追加する + +Kafkaにメッセージを挿入します。以下では[kcat](https://github.com/edenhill/kcat)を使用して10,000件のメッセージを挿入します。 + +```bash +head -n 10000 github_all_columns.ndjson | kcat -b : -X security.protocol=sasl_ssl -X sasl.mechanisms=PLAIN -X sasl.username= -X sasl.password= -t github +``` + +ターゲットテーブル「Github」で簡単な読み取りを行い、データの挿入を確認します。 + +```sql +SELECT count() FROM default.github; + +| count() | +| :--- | +| 10000 | + +``` diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw new file mode 100644 index 00000000000..d8e362fcfeb --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw @@ -0,0 +1,755 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 878, + "versionNonce": 328208404, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 231, + "versionNonce": 960998188, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 687.5, + "y": 868.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 671, + "versionNonce": 549252500, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 696.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 490, + "versionNonce": 134309292, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 399, + "y": 700, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 394.99999999999994, + "seed": 894230420, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 522, + "versionNonce": 2138184468, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 421.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 344, + "versionNonce": 2090848300, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 445, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 83, + "height": 72, + "seed": 2071509291, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic", + "baseline": 61, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic" + }, + { + "type": "text", + "version": 448, + "versionNonce": 2049284244, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1347, + "y": 1185, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 173, + "height": 35, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "User queries", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "User queries" + }, + { + "type": "arrow", + "version": 1403, + "versionNonce": 1460464300, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 605.0000000000001, + "y": 904.7304815823768, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 78.02606572763841, + "height": 0.2695184176232033, + "seed": 172826772, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.034746004512532146, + "gap": 1 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 78.02606572763841, + 0.2695184176232033 + ] + ] + }, + { + "type": "rectangle", + "version": 969, + "versionNonce": 479028756, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.5, + "y": 710, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 394, + "seed": 1345975444, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 255, + "versionNonce": 1240642860, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1002.5, + "y": 872, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 771, + "versionNonce": 195003284, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1019.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 825, + "versionNonce": 582692780, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.5, + "y": 871, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1361, + "versionNonce": 1569845524, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1296.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652465060452, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1146, + "versionNonce": 1905285676, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1316.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1396, + "versionNonce": 1910156948, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.7407827330846, + "y": 909.7665001139045, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 107.74078273308464, + "height": 1.766500113904499, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": -0.023096342081524727, + "gap": 3.759217266915357 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -107.74078273308464, + -1.766500113904499 + ] + ] + }, + { + "type": "arrow", + "version": 2562, + "versionNonce": 2048313108, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1293.4366941211092, + "y": 913.2775351569246, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 78.93669412110921, + "height": 2.764348193272099, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465081783, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.01860928002735619, + "gap": 3.0633058788907874 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": 0.06413755642360305, + "gap": 2 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -78.93669412110921, + 2.764348193272099 + ] + ] + }, + { + "type": "arrow", + "version": 3666, + "versionNonce": 1227865108, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1473.9239300813729, + "y": 1187.3723869577298, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.6178204858620798, + "gap": 6.543213961772835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png new file mode 100644 index 00000000000..c467d4d0438 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw new file mode 100644 index 00000000000..4d32c5c0c9f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw @@ -0,0 +1,1048 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 822, + "versionNonce": 1029316756, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "20AgrF3HvHf7UeyROfh63", + "type": "arrow" + } + ], + "updated": 1652459081172, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 181, + "versionNonce": 35805716, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 783.5, + "y": 868.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 666, + "versionNonce": 1800864044, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 792.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 438, + "versionNonce": 197133612, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 374, + "y": 700, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 394.99999999999994, + "seed": 894230420, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + } + ], + "updated": 1652458820139, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 517, + "versionNonce": 1371621524, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 396.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458820119, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 330, + "versionNonce": 474233516, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 420, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 83, + "height": 72, + "seed": 2071509291, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458820119, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic", + "baseline": 61, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic" + }, + { + "type": "text", + "version": 443, + "versionNonce": 1348424748, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1441, + "y": 1181, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 226, + "height": 35, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459130524, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(6) User queries", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6) User queries" + }, + { + "type": "arrow", + "version": 1398, + "versionNonce": 34256556, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 581, + "y": 824.6550741354022, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 196.5, + "height": 0.44225680624845154, + "seed": 172826772, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": -0.3695889031240465, + "gap": 1 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.39634447611422324, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 196.5, + 0.44225680624845154 + ] + ] + }, + { + "type": "rectangle", + "version": 912, + "versionNonce": 699792300, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1109.5, + "y": 710, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 394, + "seed": 1345975444, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652458937733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 198, + "versionNonce": 748954260, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1114.5, + "y": 872, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 766, + "versionNonce": 2031354028, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1131.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 455, + "versionNonce": 925846420, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1474.5, + "y": 871, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459040868, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1136, + "versionNonce": 250341292, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1469.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652459040868, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 954, + "versionNonce": 1656679596, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1489.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459040869, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1155, + "versionNonce": 2003689004, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1104.7407827330846, + "y": 909.9101994992986, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 137.98378221250425, + "height": 2.066634598782457, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459417283, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": -0.02317883163991407, + "gap": 4.759217266915357 + }, + "endBinding": { + "elementId": "PPMZXqupvG_AFJpkJkyTs", + "focus": 1.3955304257290362, + "gap": 14 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -137.98378221250425, + -2.066634598782457 + ] + ] + }, + { + "type": "arrow", + "version": 1871, + "versionNonce": 116003372, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1465.4366941211092, + "y": 912.6083644337409, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 139.9366941211092, + "height": 4.0506980513524695, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459040869, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.017801345344272513, + "gap": 4.063305878890787 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": 0.0639631242434834, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -139.9366941211092, + 4.0506980513524695 + ] + ] + }, + { + "type": "arrow", + "version": 2340, + "versionNonce": 1410627372, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1646.9239300813729, + "y": 1187.3723869577298, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459041009, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.6178204858620798, + "gap": 6.543213961772835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + }, + { + "type": "arrow", + "version": 1382, + "versionNonce": 1181162540, + "isDeleted": false, + "id": "fnewN-MLbbnm7F-0VOy8F", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 584.5422455342772, + "y": 955.0509996486933, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 190.97078732954185, + "height": 1.6618431469032657, + "seed": 1459117844, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.29481001141426355, + "gap": 4.5422455342771855 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.24749175012578659, + "gap": 2.986967136180965 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 190.97078732954185, + -1.6618431469032657 + ] + ] + }, + { + "id": "3GiF6AItYJOR_SCCtWz48", + "type": "text", + "x": 587.5, + "y": 782, + "width": 182, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1111672852, + "version": 57, + "versionNonce": 1496301460, + "isDeleted": false, + "boundElements": null, + "updated": 1652458913553, + "link": null, + "locked": false, + "text": "(3) messages", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 25, + "containerId": null, + "originalText": "(3) messages" + }, + { + "id": "cqZdtZeI6DgfZ0mE1UVDj", + "type": "text", + "x": 590.5, + "y": 900, + "width": 183, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 96965804, + "version": 41, + "versionNonce": 1015763244, + "isDeleted": false, + "boundElements": null, + "updated": 1652458954553, + "link": null, + "locked": false, + "text": "(2) messages", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 25, + "containerId": null, + "originalText": "(2) messages" + }, + { + "id": "PPMZXqupvG_AFJpkJkyTs", + "type": "text", + "x": 989.5, + "y": 824, + "width": 115, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1424642220, + "version": 43, + "versionNonce": 1459172268, + "isDeleted": false, + "boundElements": [ + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652459417282, + "link": null, + "locked": false, + "text": "(4) read\nrows", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(4) read\nrows" + }, + { + "id": "DycObbWQ7GIFaHs1NENKr", + "type": "text", + "x": 1335.5, + "y": 830, + "width": 130, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1772574612, + "version": 29, + "versionNonce": 440341012, + "isDeleted": false, + "boundElements": null, + "updated": 1652459030033, + "link": null, + "locked": false, + "text": "(5) insert\nrows", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(5) insert\nrows" + }, + { + "type": "text", + "version": 493, + "versionNonce": 1460463916, + "isDeleted": false, + "id": "F1AWugVwb8emy-O_UUz7p", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 762, + "y": 1183.7283930191138, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 218, + "height": 35, + "seed": 399215788, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459103504, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(1) Insert rows", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(1) Insert rows" + }, + { + "type": "arrow", + "version": 2399, + "versionNonce": 1081526316, + "isDeleted": false, + "id": "20AgrF3HvHf7UeyROfh63", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 939.9239300813729, + "y": 1185.1007799768436, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 1174529044, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459081172, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.46277159554651515, + "gap": 6.771606980886645 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png new file mode 100644 index 00000000000..dfdbd2267f4 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw new file mode 100644 index 00000000000..1800c44efb9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw @@ -0,0 +1,1484 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 877, + "versionNonce": 1057700116, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.5, + "y": 795.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 305, + "seed": 1090013588, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "z5NUzY_cWtaUODVlgPgjz", + "type": "arrow" + } + ], + "updated": 1652460591599, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 230, + "versionNonce": 727979564, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 783.5, + "y": 913, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460429499, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 670, + "versionNonce": 525893036, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 792.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460421719, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 489, + "versionNonce": 433248404, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 374, + "y": 799, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 295.99999999999994, + "seed": 894230420, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "20AgrF3HvHf7UeyROfh63", + "type": "arrow" + } + ], + "updated": 1652460582837, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 521, + "versionNonce": 1895931948, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 396.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460438687, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 343, + "versionNonce": 1367918740, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 420, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 104, + "height": 108, + "seed": 2071509291, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460438687, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic\n(github)", + "baseline": 97, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic\n(github)" + }, + { + "type": "rectangle", + "version": 968, + "versionNonce": 354049580, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1109.5, + "y": 798, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 306, + "seed": 1345975444, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652460413189, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 254, + "versionNonce": 652405396, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1114.5, + "y": 916, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460413189, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 770, + "versionNonce": 2137439276, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1131.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460405919, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 824, + "versionNonce": 829597740, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1480.5, + "y": 927.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460395640, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1360, + "versionNonce": 1234027284, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1475.5, + "y": 810, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 305, + "seed": 378158636, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652460395640, + "link": null, + "locked": false, + "fontSize": 26.280792193787637, + "baseline": 350.9999999999999 + }, + { + "type": "image", + "version": 1145, + "versionNonce": 947799572, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1495.6291629162915, + "y": 1054, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460387151, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 2558, + "versionNonce": 1039248660, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.4366941211092, + "y": 963.7977243135721, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 145.9366941211092, + "height": 1.9431502892945218, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460413189, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 4.063305878890787, + "focus": -0.017801345344272513 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 1, + "focus": 0.0639631242434834 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -145.9366941211092, + -1.9431502892945218 + ] + ] + }, + { + "type": "arrow", + "version": 3665, + "versionNonce": 1826298132, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1595.5129981322245, + "y": 1125.5684007913123, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 222.32892493558256, + "height": 121.75343195272853, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 10.568400791312115, + "focus": -0.8313797330069356 + }, + "endBinding": { + "elementId": "VtcX1BJjwsOGzM0IvQqzO", + "gap": 2.6840731966419753, + "focus": -0.08099668900567501 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -222.32892493558256, + 121.75343195272853 + ] + ] + }, + { + "type": "arrow", + "version": 1651, + "versionNonce": 455902484, + "isDeleted": false, + "id": "fnewN-MLbbnm7F-0VOy8F", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 586.5422455342772, + "y": 964.6509936995194, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 190.97078732954185, + "height": 2.323802059964578, + "seed": 1459117844, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460575675, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.12719275448043063, + "gap": 6.5422455342771855 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.08503908527857361, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 190.97078732954185, + -2.323802059964578 + ] + ] + }, + { + "type": "text", + "version": 42, + "versionNonce": 1867358996, + "isDeleted": false, + "id": "cqZdtZeI6DgfZ0mE1UVDj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 590.5, + "y": 900, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 183, + "height": 35, + "seed": 96965804, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": null, + "updated": 1652460380446, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(2) messages", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2) messages" + }, + { + "type": "text", + "version": 87, + "versionNonce": 33250092, + "isDeleted": false, + "id": "PPMZXqupvG_AFJpkJkyTs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.5, + "y": 893, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 116, + "height": 70, + "seed": 1424642220, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460600846, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(3) read\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3) read\nrows" + }, + { + "type": "text", + "version": 63, + "versionNonce": 407470892, + "isDeleted": false, + "id": "DycObbWQ7GIFaHs1NENKr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1332.5, + "y": 867, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 131, + "height": 70, + "seed": 1772574612, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460605666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(4) insert\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(4) insert\nrows" + }, + { + "type": "text", + "version": 632, + "versionNonce": 891215660, + "isDeleted": false, + "id": "F1AWugVwb8emy-O_UUz7p", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 214, + "y": 843.7283930191138, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 142, + "height": 70, + "seed": 399215788, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460556676, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(1) Insert\n messages", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(1) Insert\n messages" + }, + { + "type": "arrow", + "version": 2726, + "versionNonce": 1126638868, + "isDeleted": false, + "id": "20AgrF3HvHf7UeyROfh63", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 231.47673829484896, + "y": 943.6052132454781, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 140.833858347953, + "height": 5.315910734403133, + "seed": 1174529044, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460553074, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.08336612785291998, + "gap": 1.6894033571980458 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 140.833858347953, + -5.315910734403133 + ] + ] + }, + { + "type": "rectangle", + "version": 1992, + "versionNonce": 904332076, + "isDeleted": false, + "id": "6hrZ8Lxc1IkAujP2-UOiE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 784.5, + "y": 1191, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 265, + "seed": 1390883244, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "k1iyxZ_8w-N2G2s3vA0QL", + "type": "text" + }, + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + }, + { + "type": "text", + "id": "k1iyxZ_8w-N2G2s3vA0QL" + }, + { + "id": "wlxapT8t7hjX8nTBYrMKs", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1347, + "versionNonce": 2056209172, + "isDeleted": false, + "id": "k1iyxZ_8w-N2G2s3vA0QL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 789.5, + "y": 1288.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 396300052, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6hrZ8Lxc1IkAujP2-UOiE", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 1749, + "versionNonce": 726214700, + "isDeleted": false, + "id": "n9YlHz9gqfbSWi7lSMwv6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 798.6291629162915, + "y": 1400, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 15473708, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 1628, + "versionNonce": 1734197396, + "isDeleted": false, + "id": "jb4EQeDdqJ3eIcsJHTGnc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 378, + "y": 1184.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 265.99999999999994, + "seed": 1754533012, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zXkcojDwCzWlWnSDKS0c3", + "type": "arrow" + }, + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1630, + "versionNonce": 382419628, + "isDeleted": false, + "id": "xEoHwdvH0P_uYns_Ms3Oq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 400.61840277777765, + "y": 1369, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 602912428, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 1485, + "versionNonce": 8424980, + "isDeleted": false, + "id": "MIxwP1DPYMwHsQgVazdsX", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 396, + "y": 1204.25, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 175, + "height": 108, + "seed": 487414292, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic\n(github_out)", + "baseline": 97, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic\n(github_out)" + }, + { + "type": "rectangle", + "version": 2148, + "versionNonce": 1458416532, + "isDeleted": false, + "id": "VtcX1BJjwsOGzM0IvQqzO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1155.5, + "y": 1192.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 261, + "seed": 1448803244, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "-6G9aET6IBY_stKpoxVD7", + "type": "text" + }, + { + "id": "CrtJtOfS32z5l1W2UQfaP", + "type": "arrow" + }, + { + "type": "text", + "id": "-6G9aET6IBY_stKpoxVD7" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + }, + { + "id": "wlxapT8t7hjX8nTBYrMKs", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1430, + "versionNonce": 230610580, + "isDeleted": false, + "id": "-6G9aET6IBY_stKpoxVD7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1160.5, + "y": 1288, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 228910356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VtcX1BJjwsOGzM0IvQqzO", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 1877, + "versionNonce": 1395559596, + "isDeleted": false, + "id": "w1F0_rc6Oz2UmAQRAHPlJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1177.6291629162915, + "y": 1390.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 928425516, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 4947, + "versionNonce": 589450924, + "isDeleted": false, + "id": "dgu7t4SGC1_vz6zFKXgqT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.007128303637, + "y": 1329.819177277539, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 189.52804472557273, + "height": 2.7145468799994887, + "seed": 521124628, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460540565, + "link": null, + "locked": false, + "startBinding": { + "elementId": "MIxwP1DPYMwHsQgVazdsX", + "focus": 1.3231617705533951, + "gap": 20.007128303637046 + }, + "endBinding": { + "elementId": "6hrZ8Lxc1IkAujP2-UOiE", + "focus": -0.015578660553000877, + "gap": 3.9648269707902273 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 189.52804472557273, + -2.7145468799994887 + ] + ] + }, + { + "type": "text", + "version": 1150, + "versionNonce": 1435506476, + "isDeleted": false, + "id": "pREuftuG5AnRKp6e3-fvJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 615.5, + "y": 1228.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 128, + "height": 70, + "seed": 353319060, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(7) insert\nmessages", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(7) insert\nmessages" + }, + { + "type": "text", + "version": 1194, + "versionNonce": 1408603156, + "isDeleted": false, + "id": "WmVT-x9q2H7XouyFThDry", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.5, + "y": 1241.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 131, + "height": 70, + "seed": 1896696492, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460525154, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(6) insert\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6) insert\nrows" + }, + { + "id": "1WeLblNsCSvF3GRcE7reh", + "type": "text", + "x": 1445.25, + "y": 1213.364196509557, + "width": 184, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1282224276, + "version": 105, + "versionNonce": 1991606932, + "isDeleted": false, + "boundElements": null, + "updated": 1652460610106, + "link": null, + "locked": false, + "text": "(5) trigger on\n insert", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(5) trigger on\n insert" + }, + { + "type": "arrow", + "version": 5205, + "versionNonce": 1721554604, + "isDeleted": false, + "id": "wlxapT8t7hjX8nTBYrMKs", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 994.7646063352292, + "y": 1333.6314390588707, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 159.73539366477075, + "height": 1.9453894833075083, + "seed": 642100396, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510813, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6hrZ8Lxc1IkAujP2-UOiE", + "focus": 0.06589468890984199, + "gap": 6.264606335229246 + }, + "endBinding": { + "elementId": "VtcX1BJjwsOGzM0IvQqzO", + "focus": -0.1054420222882615, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 159.73539366477075, + 1.9453894833075083 + ] + ] + }, + { + "type": "arrow", + "version": 1817, + "versionNonce": 1397390228, + "isDeleted": false, + "id": "z5NUzY_cWtaUODVlgPgjz", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 982.7646063352291, + "y": 978.0260975395391, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 129.64692341642296, + "height": 4.110324198034277, + "seed": 1603864108, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460596744, + "link": null, + "locked": false, + "startBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.17198514904952156, + "gap": 1 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 129.64692341642296, + 4.110324198034277 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png new file mode 100644 index 00000000000..4d2c2cfd31a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw new file mode 100644 index 00000000000..34deb7a6532 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw @@ -0,0 +1,2384 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 410, + "versionNonce": 1606949524, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 645, + "y": 397, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 560, + "height": 203, + "seed": 1180344869, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458539756, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 491, + "versionNonce": 1603764372, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 654.6184027777776, + "y": 407.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "image", + "version": 569, + "versionNonce": 671974060, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 412.62916291629165, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 722, + "versionNonce": 1266830868, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 398.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 970209765, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 688, + "versionNonce": 1595952428, + "isDeleted": false, + "id": "yQt730wUg7Jm8prLoV0E4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 444.5, + "y": 730.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 554015205, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "I1HdsARxC3Fg0QwmFP7e_" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "id": "dqp4aHQM2LJ8LFkHyQVug", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 728, + "versionNonce": 1538747284, + "isDeleted": false, + "id": "no4hhjrIRjKPwEb_SIdv3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 447, + "y": 833, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 695150059, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "bbHzLDczYqvtwX1DL-R5S" + }, + { + "id": "dqp4aHQM2LJ8LFkHyQVug", + "type": "arrow" + }, + { + "id": "bsNl3So8xnScud4e0q3gT", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 743, + "versionNonce": 1853212588, + "isDeleted": false, + "id": "s7dSLvint5sJvavB_FVTn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 449, + "y": 938, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 1620350539, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "bsNl3So8xnScud4e0q3gT", + "type": "arrow" + }, + { + "id": "_l-d0XevHle03pX6piCdU", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 389, + "versionNonce": 845994260, + "isDeleted": false, + "id": "I1HdsARxC3Fg0QwmFP7e_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 449.5, + "y": 765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1933919371, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yQt730wUg7Jm8prLoV0E4", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 387, + "versionNonce": 439874092, + "isDeleted": false, + "id": "bbHzLDczYqvtwX1DL-R5S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 452, + "y": 867.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1488694821, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "no4hhjrIRjKPwEb_SIdv3", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 455, + "versionNonce": 991467156, + "isDeleted": false, + "id": "eFshv2EPB1O6JDPdNKtb5", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 495, + "y": 955.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 21572139, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "text", + "version": 304, + "versionNonce": 40936468, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 865, + "y": 448, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 120, + "height": 52, + "seed": 2071509291, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Kafka Topic\n", + "baseline": 44, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka Topic\n" + }, + { + "type": "rectangle", + "version": 62, + "versionNonce": 359290668, + "isDeleted": false, + "id": "6kWQPOWnbWeeWakZ-aoHJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 663, + "y": 562, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1295853643, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 107, + "versionNonce": 241893780, + "isDeleted": false, + "id": "hBSwH5KkpMp4AZuOon4qJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 714, + "y": 563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 960398469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 151, + "versionNonce": 586060204, + "isDeleted": false, + "id": "SLQgImQNj2b86-9I3Z10u", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 880, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1962219307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "H1KleDze5j-giRfLVU-ly", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 183, + "versionNonce": 910012180, + "isDeleted": false, + "id": "lK29vU6mpWmEzPz8ut4fk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 931, + "y": 566, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 689582213, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "vHObq0tLqdKgChmGZY1e4", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 190, + "versionNonce": 419920940, + "isDeleted": false, + "id": "pF3Aoc6O1u0CmRgF4Exsv", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1085, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 639862923, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 224, + "versionNonce": 2053024916, + "isDeleted": false, + "id": "Cbu4Qs9Hw9NcJzecuNVnZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1135, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 15583237, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "yOeYgKv0-55ugVRrvTZbF", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 116, + "versionNonce": 1637815980, + "isDeleted": false, + "id": "4HpPg65wWidd2ra-SuNxk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1230, + "y": 435, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1332885227, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 217, + "versionNonce": 1552153108, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1276, + "y": 436, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 85, + "height": 26, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "partition", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "partition" + }, + { + "type": "arrow", + "version": 1099, + "versionNonce": 425681196, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 688, + "y": 587, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 152, + "height": 138, + "seed": 2110100235, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6kWQPOWnbWeeWakZ-aoHJ", + "focus": -0.6829155060352831, + "gap": 1 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.40897243107769427, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -152, + 138 + ] + ] + }, + { + "type": "arrow", + "version": 679, + "versionNonce": 933468052, + "isDeleted": false, + "id": "yNYMjvDf-J0CBK_4SAyJq", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 739, + "y": 591, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 157, + "height": 134, + "seed": 594821957, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "hBSwH5KkpMp4AZuOon4qJ", + "focus": -0.8030726256983242, + "gap": 4 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.11283152311189693, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -157, + 134 + ] + ] + }, + { + "type": "arrow", + "version": 917, + "versionNonce": 934435756, + "isDeleted": false, + "id": "dqp4aHQM2LJ8LFkHyQVug", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 536, + "y": 818, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 832282699, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "no4hhjrIRjKPwEb_SIdv3", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 922, + "versionNonce": 401835284, + "isDeleted": false, + "id": "bsNl3So8xnScud4e0q3gT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 536, + "y": 924, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 914334411, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "s7dSLvint5sJvavB_FVTn", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "no4hhjrIRjKPwEb_SIdv3", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "image", + "version": 653, + "versionNonce": 918685228, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 805.6291629162915, + "y": 1045, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 799, + "versionNonce": 317309588, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 791.5, + "y": 707, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 1439426149, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 739, + "versionNonce": 997744812, + "isDeleted": false, + "id": "TdP4oWRlEc-9pLfHaDcgV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 837.5, + "y": 731, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 706207339, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "GofrK5Hib8jBiHa3Owk54", + "type": "text" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "type": "text", + "id": "GofrK5Hib8jBiHa3Owk54" + }, + { + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "type": "arrow" + }, + { + "id": "H1KleDze5j-giRfLVU-ly", + "type": "arrow" + }, + { + "id": "vHObq0tLqdKgChmGZY1e4", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 780, + "versionNonce": 524046356, + "isDeleted": false, + "id": "YMjqZ7fDrBGho7Y5hVDRZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 840, + "y": 833.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 179032517, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "w6pNx7-pQfFpnmLxrrAYA", + "type": "text" + }, + { + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "type": "arrow" + }, + { + "type": "text", + "id": "w6pNx7-pQfFpnmLxrrAYA" + }, + { + "id": "5QiNVNtXFF14U-aj2fOgo", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 794, + "versionNonce": 1031760684, + "isDeleted": false, + "id": "-wJsaOPL1Fd19lt_0PbzL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 842, + "y": 938.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 604428555, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "5QiNVNtXFF14U-aj2fOgo", + "type": "arrow" + }, + { + "id": "_l-d0XevHle03pX6piCdU", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + }, + { + "id": "ej-I5ud4HGqwa2-L9SDby", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 437, + "versionNonce": 1826696596, + "isDeleted": false, + "id": "GofrK5Hib8jBiHa3Owk54", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 842.5, + "y": 765.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 657936677, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TdP4oWRlEc-9pLfHaDcgV", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 441, + "versionNonce": 792798636, + "isDeleted": false, + "id": "w6pNx7-pQfFpnmLxrrAYA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 845, + "y": 868, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 125665195, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YMjqZ7fDrBGho7Y5hVDRZ", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 503, + "versionNonce": 1024350996, + "isDeleted": false, + "id": "HE2GVgZnlQRR5zx3gsWdp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 888, + "y": 956, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 1490805893, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "arrow", + "version": 1066, + "versionNonce": 635932716, + "isDeleted": false, + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 929, + "y": 818.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 514216523, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YMjqZ7fDrBGho7Y5hVDRZ", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 1070, + "versionNonce": 976869524, + "isDeleted": false, + "id": "5QiNVNtXFF14U-aj2fOgo", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 929, + "y": 924.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 1129778149, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "YMjqZ7fDrBGho7Y5hVDRZ", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "image", + "version": 780, + "versionNonce": 22850220, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1195.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 962, + "versionNonce": 1343858196, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1181.5, + "y": 704, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 923962283, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 729, + "versionNonce": 340423980, + "isDeleted": false, + "id": "4Sf2JJTKTIv4fXMhyftIK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1227.5, + "y": 728, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 1642961029, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "nS45VyL5gQgr4yEFQKF1O", + "type": "text" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "type": "text", + "id": "nS45VyL5gQgr4yEFQKF1O" + }, + { + "id": "U6eE3bs8s0eDq1lmlfqFA", + "type": "arrow" + }, + { + "id": "qr6MKD1-7_7vReZvNxdKb", + "type": "arrow" + }, + { + "id": "yOeYgKv0-55ugVRrvTZbF", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 768, + "versionNonce": 61064084, + "isDeleted": false, + "id": "nDwemTlbCnE6JVk1juOuX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1230, + "y": 830.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 800710219, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "Z0vWSwzkszboISa94ozDk", + "type": "text" + }, + { + "id": "U6eE3bs8s0eDq1lmlfqFA", + "type": "arrow" + }, + { + "type": "text", + "id": "Z0vWSwzkszboISa94ozDk" + }, + { + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 782, + "versionNonce": 1276833708, + "isDeleted": false, + "id": "en2eREDEBckio9tpltvw4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1232, + "y": 935.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 672284645, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "type": "arrow" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 426, + "versionNonce": 1259221268, + "isDeleted": false, + "id": "nS45VyL5gQgr4yEFQKF1O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1232.5, + "y": 762.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1226693867, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4Sf2JJTKTIv4fXMhyftIK", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 425, + "versionNonce": 1492654636, + "isDeleted": false, + "id": "Z0vWSwzkszboISa94ozDk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1235, + "y": 865, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1173027653, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nDwemTlbCnE6JVk1juOuX", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 492, + "versionNonce": 1708060308, + "isDeleted": false, + "id": "C91KrmcNBK1wntk4LkBCb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1278, + "y": 953, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 516491147, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "arrow", + "version": 1020, + "versionNonce": 1439429804, + "isDeleted": false, + "id": "U6eE3bs8s0eDq1lmlfqFA", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1319, + "y": 815.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 1406487205, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nDwemTlbCnE6JVk1juOuX", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 1024, + "versionNonce": 882637844, + "isDeleted": false, + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1319, + "y": 921.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 1995824683, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "en2eREDEBckio9tpltvw4", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "nDwemTlbCnE6JVk1juOuX", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 707, + "versionNonce": 1883275052, + "isDeleted": false, + "id": "H1KleDze5j-giRfLVU-ly", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 896.6471822090416, + "y": 594, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0.8984692097415063, + "height": 131, + "seed": 206213061, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SLQgImQNj2b86-9I3Z10u", + "focus": 0.06836643444191433, + "gap": 5 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": -0.3892729439809281, + "gap": 6 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.8984692097415063, + 131 + ] + ] + }, + { + "type": "arrow", + "version": 723, + "versionNonce": 292247956, + "isDeleted": false, + "id": "vHObq0tLqdKgChmGZY1e4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 949.6763431306226, + "y": 593, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0.9822442535212303, + "height": 131.00000000000023, + "seed": 40415301, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lK29vU6mpWmEzPz8ut4fk", + "focus": -0.031170433654243393, + "gap": 3 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": 0.19455621301774917, + "gap": 6.999999999999773 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.9822442535212303, + 131.00000000000023 + ] + ] + }, + { + "type": "arrow", + "version": 368, + "versionNonce": 281000364, + "isDeleted": false, + "id": "qr6MKD1-7_7vReZvNxdKb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1111, + "y": 587, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 153, + "height": 141, + "seed": 34914181, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": -0.06723372781065089, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 153, + 141 + ] + ] + }, + { + "type": "arrow", + "version": 672, + "versionNonce": 661849876, + "isDeleted": false, + "id": "yOeYgKv0-55ugVRrvTZbF", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1165, + "y": 589, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 153, + "height": 138, + "seed": 647723019, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Cbu4Qs9Hw9NcJzecuNVnZ", + "focus": 0.04166666666666667, + "gap": 1 + }, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": 0.3209302325581395, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 153, + 138 + ] + ] + }, + { + "type": "arrow", + "version": 979, + "versionNonce": 41133100, + "isDeleted": false, + "id": "_l-d0XevHle03pX6piCdU", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 644, + "y": 976, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 197, + "height": 2, + "seed": 1796874123, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "s7dSLvint5sJvavB_FVTn", + "focus": -0.1302043070127002, + "gap": 5 + }, + "endBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.2278851463279956, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 197, + -2 + ] + ] + }, + { + "type": "arrow", + "version": 915, + "versionNonce": 1260979348, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 837, + "y": 977, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 199, + "height": 1, + "seed": 643942629, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.13187845303867404, + "gap": 5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -199, + -1 + ] + ] + }, + { + "type": "arrow", + "version": 702, + "versionNonce": 457588396, + "isDeleted": false, + "id": "ej-I5ud4HGqwa2-L9SDby", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1036.5, + "y": 980.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 197, + "height": 2, + "seed": 1342950315, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": -0.04329099944781889, + "gap": 4.5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 197, + -2 + ] + ] + }, + { + "type": "arrow", + "version": 1368, + "versionNonce": 1380143636, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1229.5, + "y": 981.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 199, + "height": 1, + "seed": 1613256837, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "en2eREDEBckio9tpltvw4", + "focus": -0.03276243093922652, + "gap": 2.5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -199, + -1 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + }, + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png new file mode 100644 index 00000000000..6923a7d710e Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/index.md b/docs/ja/integrations/data-ingestion/kafka/index.md new file mode 100644 index 00000000000..feece2ad98b --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/index.md @@ -0,0 +1,58 @@ +--- +sidebar_label: ClickHouseとKafkaの統合 +sidebar_position: 1 +slug: /ja/integrations/kafka +description: ClickHouseとKafkaの紹介 +--- + +# ClickHouseとKafkaの統合 + +[Apache Kafka](https://kafka.apache.org/)は、数千の企業が高性能データパイプライン、ストリーミング分析、データ統合、ミッションクリティカルなアプリケーションのために使用しているオープンソースの分散イベントストリーミングプラットフォームです。KafkaとClickHouseが関与するほとんどの場合、ユーザーはKafkaベースのデータをClickHouseに挿入したいと考えています。以下に、その両方のユースケースに対するいくつかのオプションを示し、それぞれのアプローチの利点と欠点を特定します。 + +## オプションの選択 + +KafkaをClickHouseと統合する際、高レベルのアプローチについて早期にアーキテクチャ上の決定を下す必要があります。以下に最も一般的な戦略を示します。 + +### Kafka用ClickPipes(ClickHouse Cloud) +* [**ClickPipes**](../clickpipes/kafka.md)は、ClickHouse Cloudにデータを取り込む最も簡単で直感的な方法を提供します。現在、Apache Kafka、Confluent Cloud、およびAmazon MSKをサポートしており、今後さらに多くのデータソースが追加される予定です。 + +### 3rd-Party CloudベースのKafka接続 +* [**Confluent Cloud**](./confluent/index.md) - Confluentプラットフォームは、ClickHouse Connector SinkをConfluent Cloud上で[アップロードして稼働](./confluent/custom-connector.md)するオプションや、Apache KafkaをHTTPまたはHTTPS経由でAPIと統合する[Confluentプラットフォーム用のHTTP Sink Connector](./confluent/kafka-connect-http.md)を利用するオプションを提供します。 + +* [**Amazon MSK**](./msk/index.md) - Amazon MSK Connectフレームワークをサポートして、Apache KafkaクラスターからClickHouseなどの外部システムにデータを転送します。Amazon MSKにClickHouse Kafka Connectをインストールすることができます。 + +* [**Redpanda Cloud**](https://cloud.redpanda.com/) - Redpandaは、Kafka API互換のストリーミングデータプラットフォームで、ClickHouseのアップストリームデータソースとして使用できます。ホストされたクラウドプラットフォームであるRedpanda Cloudは、Kafkaプロトコル経由でClickHouseと統合され、ストリーミング分析ワークロードのリアルタイムデータ取り込みを可能にします。 + +### セルフマネージドKafka接続 +* [**Kafka Connect**](./kafka-clickhouse-connect-sink.md) - Kafka Connectは、Apache Kafkaの無料のオープンソースコンポーネントで、Kafkaと他のデータシステム間でのシンプルなデータ統合用に設計された集中データハブとして機能します。コネクタは、Kafkaから他のデータストアへのデータのスケーラブルで信頼性の高いストリーミングをシンプルに提供します。Source Connectorsは他のシステムからKafkaトピックにデータを挿入し、Sink ConnectorsはKafkaトピックからClickHouseなどのデータストアにデータを配信します。 + +* [**Vector**](./kafka-vector.md) - Vectorはベンダーに依存しないデータパイプラインです。Kafkaからデータを読み込み、ClickHouseにイベントを送信する能力があり、堅牢な統合オプションを提供します。 + +* [**JDBC Connect Sink**](./kafka-connect-jdbc.md) - Kafka Connect JDBC Sinkコネクタは、Kafkaトピックから任意のJDBCドライバーを備えたリレーショナルデータベースにデータをエクスポートすることを可能にします。 + +* **カスタムコード** - KafkaとClickHouse用のそれぞれのクライアントライブラリを使用したカスタムコードは、イベントのカスタム処理が必要な場合に適切なケースがあります。この文書の範囲を超えています。 + +* [**Kafkaテーブルエンジン**](./kafka-table-engine.md)は、ネイティブClickHouse統合(ClickHouse Cloudでは利用不可)を提供します。このテーブルエンジンは**プル**してデータをソースシステムから取得します。これには、ClickHouseがKafkaに直接アクセスできることが必要です。 + +* [**名前付きコレクションを用いたKafkaテーブルエンジン**](./kafka-table-engine-named-collections.md) - 名前付きコレクションを使用することで、KafkaとのネイティブClickHouse統合が可能になります。このアプローチは、複数のKafkaクラスターへの安全な接続を許可し、構成管理を集中化し、スケーラビリティとセキュリティを向上させます。 + +### アプローチの選択 +いくつかの決定ポイントに要約されます: + +* **接続性** - Kafkaテーブルエンジンは、ClickHouseが目的地である場合、Kafkaからプルできる必要があります。これには双方向接続性が必要です。例えば、ClickHouseがクラウドにあり、Kafkaがセルフマネージドされている場合のように、ネットワークが分断されている場合、コンプライアンスやセキュリティ上の理由からこれを解除することをためらうかもしれません。(このアプローチは現在のClickHouse Cloudではサポートされていません。)Kafkaテーブルエンジンは、消費者用のスレッドを使用して、ClickHouse自身のリソースを利用します。このリソースの負担をClickHouseにかけることは、リソースの制約のために不可能かもしれず、また、アーキテクトは関心の分離を好むかもしれません。この場合、別のプロセスとして実行され、異なるハードウェア上にデプロイできるKafka Connectのようなツールが好ましいかもしれません。これにより、Kafkaデータのプルを担当するプロセスをClickHouseとは独立してスケールすることができます。 + +* **クラウドでのホスティング** - クラウドベンダは、プラットフォーム上で利用可能なKafkaコンポーネントに制限を設ける場合があります。各クラウドベンダの推奨オプションを探るために、ガイドに従ってください。 + +* **外部でのエンリッチメント** - メッセージは、Materialized Viewのselectステートメント内の関数を使用してClickHouseに挿入される前に操作できますが、ユーザーは複雑なエンリッチメントをClickHouse外部に移動することを好むかもしれません。 + +* **データフローの方向** - Vectorは、KafkaからClickHouseへのデータ転送のみをサポートしています。 + +## 前提条件 + +リンクされたユーザーガイドは、以下を前提としています: + +* Kafkaの基礎(プロデューサー、コンシューマー、トピックなど)に精通していること。 +* これらの例のためにトピックを準備していること。すべてのデータがKafkaにJSONとして保存されていると想定していますが、Avroを使用している場合も原則は同じです。 +* kcat(以前はkafkacatと呼ばれていました)が素晴らしい[こちら](https://github.com/edenhill/kcat)にあることを利用して、Kafkaデータを公開および消費します。 +* サンプルデータをロードするためのいくつかのpythonスクリプトを参照していますが、例を自分のデータセットに適応させてください。 +* ClickHouseのMaterialized Viewについて大まかに理解していること。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md b/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md new file mode 100644 index 00000000000..869fb91991a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md @@ -0,0 +1,403 @@ +--- +sidebar_label: ClickHouse Kafka Connect Sink +sidebar_position: 2 +slug: /ja/integrations/kafka/clickhouse-kafka-connect-sink +description: ClickHouse公式のKafkaコネクタ。 +--- + +import ConnectionDetails from '@site/docs/ja/\_snippets/\_gather_your_details_http.mdx'; + +# ClickHouse Kafka Connect Sink + +:::note +サポートが必要な場合は、[このリポジトリで問題を報告](https://github.com/ClickHouse/clickhouse-kafka-connect/issues)するか、[ClickHouseの公的Slack](https://clickhouse.com/slack)で質問してください。 +::: + +**ClickHouse Kafka Connect Sink** は、KafkaトピックからClickHouseテーブルにデータを転送するKafkaコネクタです。 + +### ライセンス + +Kafka Connector Sink は [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) の下で配布されています。 + +### 環境要件 + +環境に [Kafka Connect](https://docs.confluent.io/platform/current/connect/index.html) フレームワークv2.7以上をインストールする必要があります。 + +### バージョン互換性マトリックス + +| ClickHouse Kafka Connect バージョン | ClickHouse バージョン | Kafka Connect | Confluent プラットフォーム | +|--------------------------------------|------------------------|---------------|----------------------------| +| 1.0.0 | > 23.3 | > 2.7 | > 6.1 | + +### 主な特徴 + +- 標準でExactly-onceセマンティクスを提供。新しいClickHouseのコア機能[KeepeMap](https://github.com/ClickHouse/ClickHouse/pull/39976)により実現され、最小限のアーキテクチャが可能です。 +- サードパーティのステートストアのサポート:現在はIn-memoryがデフォルトですが、KeeperMapを使用できます(Redisは近日追加予定)。 +- コア統合:ClickHouseによって構築、保守、およびサポートされています。 +- [ClickHouse Cloud](https://clickhouse.com/cloud)に対して継続的にテストされています。 +- 宣言されたスキーマとスキーマレスでのデータ挿入。 +- 全てのClickHouseデータタイプに対応。 + +### インストール手順 + +#### 接続情報を収集する + + + +#### 一般的なインストール手順 + +コネクタは、プラグインを実行するために必要なすべてのクラスファイルを含む単一のUber JARファイルとして配布されます。 + +プラグインをインストールするには、以下の手順を実行してください: + +- ClickHouse Kafka Connect Sink リポジトリの [リリース](https://github.com/ClickHouse/clickhouse-kafka-connect/releases) ページからコネクタ JAR ファイルを含む ZIP アーカイブをダウンロードします。 +- ZIP ファイルの内容を展開し、目的の場所にコピーします。 +- プラグインを Confluent Platform が見つけることができるように、Connect プロパティファイルの [plugin.path](https://kafka.apache.org/documentation/#connectconfigs_plugin.path) 設定にプラグインディレクトリを追加します。 +- トピック名、ClickHouseインスタンスのホスト名、およびパスワードを設定します。 + +```yml +connector.class=com.clickhouse.kafka.connect.ClickHouseSinkConnector +tasks.max=1 +topics= +ssl=true +jdbcConnectionProperties=?sslmode=STRICT +security.protocol=SSL +hostname= +database= +password= +ssl.truststore.location=/tmp/kafka.client.truststore.jks +port=8443 +value.converter.schemas.enable=false +value.converter=org.apache.kafka.connect.json.JsonConverter +exactlyOnce=true +username=default +schemas.enable=false +``` + +- Confluent Platformを再起動します。 +- Confluent Platformを使用している場合、Confluent Control Center UI にログインして、ClickHouse Sink が利用可能なコネクタのリストに表示されているか確認します。 + +### 設定オプション + +ClickHouse Sink を ClickHouseサーバーに接続するには、以下の情報を提供する必要があります: + +- 接続詳細:ホスト名(**必須**)とポート(オプション) +- ユーザー資格情報:パスワード(**必須**)とユーザー名(オプション) +- コネクタクラス:`com.clickhouse.kafka.connect.ClickHouseSinkConnector`(**必須**) +- トピックまたは topics.regex: ポーリングするKafka トピック - トピック名はテーブル名と一致している必要があります(**必須**) +- キーと値のコンバーター:トピック内のデータのタイプに基づいて設定します。ワーカ設定で定義されていない場合に必要です。 + +設定オプションの全表: + +| プロパティ名 | 説明 | デフォルト値 | +|--------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------| +| `hostname` (**必須**) | サーバーのホスト名またはIPアドレス | N/A | +| `port` | ClickHouseのポート - デフォルトは8443(クラウドではHTTPS用)ですが、HTTP(自ホストデフォルトの場合)を使用する場合は8123にする必要があります | `8443` | +| `ssl` | ClickHouseへのSSL接続を有効にする | `true` | +| `jdbcConnectionProperties` | ClickHouseへの接続時のプロパティ。`?`で始まり、`param=value`間は`&`で結合される必要があります | `""` | +| `username` | ClickHouseのデータベースユーザー名 | `default` | +| `password` (**必須**) | ClickHouseのデータベースパスワード | N/A | +| `database` | ClickHouseのデータベース名 | `default` | +| `connector.class` (**必須**) | コネクタクラス(デフォルト値として明示的に設定してください) | `"com.clickhouse.kafka.connect.ClickHouseSinkConnector"` | +| `tasks.max` | コネクタタスクの数 | `"1"` | +| `errors.retry.timeout` | ClickHouse JDBC リトライタイムアウト | `"60"` | +| `exactlyOnce` | Exactly Once 有効 | `"false"` | +| `topics` (**必須**) | ポーリングするKafkaトピック - トピック名はテーブル名と一致する必要があります | `""` | +| `key.converter` (**必須** - 説明参照) | キーのタイプに応じて設定します。キーを渡している場合(ワーカ設定で定義されていない場合)はここで必要です。 | `"org.apache.kafka.connect.storage.StringConverter"` | +| `value.converter` (**必須** - 説明参照) | トピック内のデータのタイプに基づいて設定します。サポートされる形式:- JSON、String、AvroまたはProtobuf フォーマット。ワーカ設定で定義されていない場合にここで必要です。 | `"org.apache.kafka.connect.json.JsonConverter"` | +| `value.converter.schemas.enable` | コネクタ値コンバータスキーマサポート | `"false"` | +| `errors.tolerance` | コネクタエラートレランス。サポートされる値:none、all | `"none"` | +| `errors.deadletterqueue.topic.name` | セットされている場合(errors.tolerance=allの場合)、失敗したバッチに対してDLQが使用されます([トラブルシューティング](#Troubleshooting)を参照) | `""` | +| `errors.deadletterqueue.context.headers.enable` | DLQに追加のヘッダーを追加します | `""` | +| `clickhouseSettings` | ClickHouse設定のコンマ区切りリスト(例: "insert_quorum=2, など...") | `""` | +| `topic2TableMap` | トピック名をテーブル名にマッピングするカンマ区切りリスト(例: "topic1=table1, topic2=table2, など...") | `""` | +| `tableRefreshInterval` | テーブル定義キャッシュの更新間隔(秒単位) | `0` | +| `keeperOnCluster` | 自ホストインスタンスのために ON CLUSTER パラメータを設定可能にします(例: " ON CLUSTER clusterNameInConfigFileDefinition ")exactly-once connect_state テーブル用([分散DDLクエリ](https://clickhouse.com/docs/ja/sql-reference/distributed-ddl)参照) | `""` | +| `bypassRowBinary` | スキーマベースのデータ(Avro、Protobufなど)に対するRowBinaryおよびRowBinaryWithDefaultsの使用を無効にすることができます - 欠損カラムがある場合や、Nullable/Defaultが許容できない場合にのみ使用してください | `"false"` | +| `dateTimeFormats` | DateTime64スキーマフィールドを解析するための日付時間形式、`-`で区切ります(例: 'someDateField=yyyy-MM-dd HH:mm:ss.SSSSSSSSS;someOtherDateField=yyyy-MM-dd HH:mm:ss')。 | `""` | +| `tolerateStateMismatch` | 現在のオフセットよりも"早い"レコードを削除できるようにコネクタを設定します(例: オフセット5が送信され、最後に記録されたオフセットが250の場合) | `"false"` | + +### ターゲットテーブル + +ClickHouse Connect SinkはKafkaトピックからメッセージを読み取り、適切なテーブルに書き込みます。ClickHouse Connect Sinkは既存のテーブルにデータを書き込みます。データを挿入する前に、ClickHouseに適切なスキーマを持つターゲットテーブルが作成されていることを確認してください。 + +各トピックにはClickHouse内で専用のターゲットテーブルが必要です。ターゲットテーブル名はソーストピック名と一致している必要があります。 + +### 前処理 + +ClickHouse Kafka Connect Sinkに送信される前にアウトバウンドメッセージを変換する必要がある場合は、[Kafka Connect Transformations](https://docs.confluent.io/platform/current/connect/transforms/overview.html) を使用してください。 + +### サポートされているデータ型 + +**スキーマ宣言あり:** + +| Kafka Connect タイプ | ClickHouse タイプ | サポート | プリミティブ | +| ----------------------------------------- |----------------------| -------- | ----------- | +| STRING | String | ✅ | Yes | +| INT8 | Int8 | ✅ | Yes | +| INT16 | Int16 | ✅ | Yes | +| INT32 | Int32 | ✅ | Yes | +| INT64 | Int64 | ✅ | Yes | +| FLOAT32 | Float32 | ✅ | Yes | +| FLOAT64 | Float64 | ✅ | Yes | +| BOOLEAN | Boolean | ✅ | Yes | +| ARRAY | Array(T) | ✅ | No | +| MAP | Map(Primitive, T) | ✅ | No | +| STRUCT | Variant(T1, T2, …) | ✅ | No | +| STRUCT | Tuple(a T1, b T2, …) | ✅ | No | +| STRUCT | Nested(a T1, b T2, …) | ✅ | No | +| BYTES | String | ✅ | No | +| org.apache.kafka.connect.data.Time | Int64 / DateTime64 | ✅ | No | +| org.apache.kafka.connect.data.Timestamp | Int32 / Date32 | ✅ | No | +| org.apache.kafka.connect.data.Decimal | Decimal | ✅ | No | + +**スキーマ宣言なし:** + +レコードはJSONに変換され、ClickHouseに[JSONEachRow](../../../sql-reference/formats.mdx#jsoneachrow)フォーマットの値として送信されます。 + +### 設定レシピ + +以下は、すぐに開始するための一般的な設定レシピです。 + +#### 基本設定 + +開始するための最も基本的な設定です - Kafka Connect を分散モードで実行し、ClickHouse サーバーが `localhost:8443` でSSLを有効にして実行されていることを前提とし、データはスキーマレスのJSONです。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + "tasks.max": "1", + "consumer.override.max.poll.records": "5000", + "consumer.override.max.partition.fetch.bytes": "5242880", + "database": "default", + "errors.retry.timeout": "60", + "exactlyOnce": "false", + "hostname": "localhost", + "port": "8443", + "ssl": "true", + "jdbcConnectionProperties": "?ssl=true&sslmode=strict", + "username": "default", + "password": "", + "topics": "", + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "value.converter.schemas.enable": "false", + "clickhouseSettings": "" + } +} +``` + +#### 複数トピックでの基本設定 + +コネクタは複数のトピックからデータを取得できます。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "topics": "SAMPLE_TOPIC, ANOTHER_TOPIC, YET_ANOTHER_TOPIC", + ... + } +} +``` + +#### DLQを使用した基本設定 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "errors.tolerance": "all", + "errors.deadletterqueue.topic.name": "", + "errors.deadletterqueue.context.headers.enable": "true", + } +} +``` + +#### 異なるデータ形式での使用 + +##### Avro スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "io.confluent.connect.avro.AvroConverter", + "value.converter.schema.registry.url": ":", + "value.converter.schemas.enable": "true", + } +} +``` + +##### Protobuf スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "io.confluent.connect.protobuf.ProtobufConverter", + "value.converter.schema.registry.url": ":", + "value.converter.schemas.enable": "true", + } +} +``` + +注意: クラスが足りないという問題に直面した場合、すべての環境においてprotobufコンバータが付属しているわけではないため、依存ファイルを含むJarの別のリリースが必要になるかもしれません。 + +##### JSON スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + } +} +``` + +##### String サポート + +コネクタは異なるClickHouseフォーマットでのStringコンバータをサポートします:[JSON](https://clickhouse.com/docs/ja/interfaces/formats#jsoneachrow)、[CSV](https://clickhouse.com/docs/ja/interfaces/formats#csv)、[TSV](https://clickhouse.com/docs/ja/interfaces/formats#tabseparated)。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "org.apache.kafka.connect.storage.StringConverter", + "customInsertFormat": "true", + "insertFormat": "CSV" + } +} +``` + +### ロギング + +クライアントKafka Connect Platformによってロギングが自動的に提供されます。ロギングの送信先と形式はKafka connectの[設定ファイル](https://docs.confluent.io/platform/current/connect/logging.html#log4j-properties-file)を通して設定できます。 + +Confluent Platformを使用する場合、CLIコマンドを実行してログを表示することができます: + +```bash +confluent local services connect log +``` + +追加の詳細については公式の[チュートリアル](https://docs.confluent.io/platform/current/connect/logging.html)をご覧ください。 + +### モニタリング + +ClickHouse Kafka Connectは[Java Management Extensions (JMX)](https://www.oracle.com/technical-resources/articles/javase/jmx.html)を通してランタイムメトリックをレポートします。JMXはKafka Connectorでデフォルトで有効になっています。 + +ClickHouse Connect MBeanName: + +```java +com.clickhouse:type=ClickHouseKafkaConnector,name=SinkTask{id} +``` + +ClickHouse Kafka Connectは次のメトリックを報告します: + +| 名前 | タイプ | 説明 | +|------------------------|------|----------------------------------------------------------------------------------| +| receivedRecords | long | 受信したレコードの総数。 | +| recordProcessingTime | long | レコードを統一された構造にグループ化および変換するのに費やされた総時間(ナノ秒単位)。 | +| taskProcessingTime | long | データをClickHouseに処理および挿入するのに費やされた総時間(ナノ秒単位)。 | + +### 制限事項 + +- 削除はサポートされていません。 +- バッチサイズはKafka Consumerのプロパティから継承されます。 +- Exactly-onceをKeeperMapで使用していてオフセットが変更または戻された場合、その特定のトピックからKeeperMapの内容を削除する必要があります。(さらなる詳細については下記のトラブルシューティングガイドをご覧ください) + +### パフォーマンスの調整 + +もし「Sinkコネクタのバッチサイズを調整したい」と考えたことがあるとしたら、このセクションはそのためのものです。 + +##### Connect Fetch対Connector Poll + +Kafka Connect(我々のSinkコネクタが基づいているフレームワーク)は、バックグラウンドでKafkaトピックからメッセージを取得します(コネクタとは独立して)。 + +このプロセスは `fetch.min.bytes` および `fetch.max.bytes` を使用して制御できます。`fetch.min.bytes` はフレームワークがコネクタに値を渡す前に必要な最小量を設定し(時間制限は `fetch.max.wait.ms` によって設定)、`fetch.max.bytes` は上限サイズを設定します。もしコネクタに大きなバッチを渡したい場合は、最小取得または最大待機を増やしてより大きなデータバンドルを構築するオプションがあります。 + +取得されたデータは次にコネクタクライアントがメッセージをポーリングすることによって消費され、各ポーリングの量は`max.poll.records` によって制御されます。注意してください、フェッチはポールとは独立しています! + +これらの設定を調整する際、ユーザーはフェッチサイズが `max.poll.records` の複数のバッチを生成することを目指すべきです(`fetch.min.bytes` および `fetch.max.bytes` は圧縮データを表していることを念頭に置いてください) - そうすることで、各コネクタタスクが可能な限り大きなバッチを挿入しています。 + +ClickHouseは大小を問わず頻繁に行われる小さいバッチよりも、多少の遅延があっても大バッチに最適化されています - バッチが大きいほど良いです。 + +```properties +consumer.max.poll.records=5000 +consumer.max.partition.fetch.bytes=5242880 +``` + +詳細については[Confluentのドキュメント](https://docs.confluent.io/platform/current/connect/references/allconfigs.html#override-the-worker-configuration)または[Kafkaのドキュメント](https://kafka.apache.org/documentation/#consumerconfigs)をご覧ください。 + +#### 高スループットの複数トピック + +もしコネクタが複数のトピックを購読するよう設定されており、topic2TableMapを使用してトピックをテーブルにマッピングしている場合でも、挿入でボトルネックが発生して消費者ラグが見られるときは、それぞれのトピックごとに1つのコネクタを作成することを検討してください。このボトルネックの主な原因は、現在バッチがテーブルに対して[逐次的に](https://github.com/ClickHouse/clickhouse-kafka-connect/blob/578ac07e8be1a920aaa3b26e49183595c3edd04b/src/main/java/com/clickhouse/kafka/connect/sink/ProxySinkTask.java#L95-L100)挿入されているからです。 + +1つのコネクタをトピックごとに作成することは、可能な限り最速の挿入速度を得るための回避策です。 + +### トラブルシューティング + +#### "State mismatch for topic \[someTopic\] partition \[0\]" + +これは、KeeperMapに保存されたオフセットがKafkaに保存されたオフセットと異なる場合に発生します。通常、トピックが削除された場合やオフセットが手動で調整された場合に発生します。 +これを解決するには、その特定のトピックとパーティションに対して保存された古い値を削除する必要があります。 + +**注意: この調整にはexactly-onceの影響があります。** + +#### "コネクタが再試行するエラーは何か?" + +現在は一時的で再試行可能と考えられるエラーに焦点を当てています。以下を含みます: + +- `ClickHouseException` - これはオーバーロードされた場合などにClickHouseが投げることができる一般的な例外です。 + 特に一時的と考えられるエラーコード: + - 3 - UNEXPECTED_END_OF_FILE + - 159 - TIMEOUT_EXCEEDED + - 164 - READONLY + - 202 - TOO_MANY_SIMULTANEOUS_QUERIES + - 203 - NO_FREE_CONNECTION + - 209 - SOCKET_TIMEOUT + - 210 - NETWORK_ERROR + - 242 - TABLE_IS_READ_ONLY + - 252 - TOO_MANY_PARTS + - 285 - TOO_FEW_LIVE_REPLICAS + - 319 - UNKNOWN_STATUS_OF_INSERT + - 425 - SYSTEM_ERROR + - 999 - KEEPER_EXCEPTION + - 1002 - UNKNOWN_EXCEPTION +- `SocketTimeoutException` - ソケットがタイムアウトした場合にスローされます。 +- `UnknownHostException` - ホストが解決できない場合にスローされます。 +- `IOException` - ネットワークに問題がある場合にスローされます。 + +#### "全てのデータが空白/ゼロである" +データのフィールドがテーブルのフィールドと一致していない可能性が高いです - これは特にCDC(およびDebeziumフォーマット)で一般的です。 +一般的な解決策は、コネクタ設定にflatten変換を追加することです: + +```properties +transforms=flatten +transforms.flatten.type=org.apache.kafka.connect.transforms.Flatten$Value +transforms.flatten.delimiter=_ +``` + +これによりデータがネストされたJSONからフラットなJSONに変換され(デリミタとして `_` を使用)、テーブル内のフィールドは「field1_field2_field3」の形式で構成されます(例: "before_id", "after_id" など)。 + +#### "KafkaキーをClickHouseで使用したい" +Kafkaキーはデフォルトで値フィールドに保存されませんが、`KeyToValue` 変換を使用してキーを値フィールドに移動することができます(新しい `_key` フィールド名の下): + +```properties +transforms=keyToValue +transforms.keyToValue.type=com.clickhouse.kafka.connect.transforms.KeyToValue +transforms.keyToValue.field=_key +``` diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md b/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md new file mode 100644 index 00000000000..e94b83686bf --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md @@ -0,0 +1,148 @@ +--- +sidebar_label: Kafka Connect JDBC コネクタ +sidebar_position: 4 +slug: /ja/integrations/kafka/kafka-connect-jdbc +description: Kafka Connect と ClickHouse を使用した JDBC コネクタ シンク +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# JDBC コネクタ + +:::note +このコネクタは、データが簡単でプリミティブ・データ型(例:int)で構成されている場合にのみ使用するべきです。ClickHouse固有の型、例えばマップはサポートされていません。 +::: + +以下の例では、Kafka Connect の Confluent ディストリビューションを使用します。 + +以下では、Kafka の単一トピックからメッセージを取り込み、ClickHouse テーブルに行を挿入する簡単なインストールについて説明します。Kafka 環境を持っていない場合、Confluent Cloud の使用を推奨します。これは、無料で利用できる十分なレベルを提供しています。 + +JDBC コネクタにはスキーマが必要であることに注意してください(JDBC コネクタでプレーンな JSON や CSV を使用することはできません)。スキーマは各メッセージにエンコードすることもできますが、関連オーバーヘッドを避けるために [Confluent スキーマレジスト](https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained/#json-schemas)y の利用を強く推奨します。提供された挿入スクリプトはメッセージからスキーマを自動的に推測し、それをレジストリに挿入します。このスクリプトは他のデータセットでも再利用可能です。Kafka のキーは文字列であると仮定しています。Kafka スキーマの詳細は[こちら](https://docs.confluent.io/platform/current/schema-registry/index.html)で確認できます。 + +### ライセンス +JDBC コネクタは [Confluent Community License](https://www.confluent.io/confluent-community-license) の下で配布されています。 + +### 手順 +#### 接続の詳細を収集する + + +#### 1. Kafka Connect と コネクタをインストールする + +Confluent パッケージをダウンロードし、ローカルにインストールしたと仮定しています。コネクタのインストールの手順については[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/#install-the-jdbc-connector)を参照してください。 + +confluent-hub のインストール方法を使用すると、ローカルの構成ファイルが更新されます。 + +Kafka から ClickHouse にデータを送信するには、コネクタの Sink コンポーネントを使用します。 + +#### 2. JDBC ドライバをダウンロードしてインストールする + +ClickHouse JDBC ドライバー `clickhouse-jdbc--shaded.jar` を[こちら](https://github.com/ClickHouse/clickhouse-java/releases)からダウンロードしてインストールします。そして、[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/#installing-jdbc-drivers)の詳細に従って Kafka Connect にインストールします。他のドライバも動作する可能性がありますが、テストされていません。 + +:::note + +一般的な問題: ドキュメントは jar を `share/java/kafka-connect-jdbc/` にコピーすることを推奨しています。ドライバが見つからない場合、ドライバを `share/confluent-hub-components/confluentinc-kafka-connect-jdbc/lib/` にコピーするか、`plugin.path` を変更してドライバを含めるようにします。詳しくは以下を参照してください。 + +::: + +#### 3. 構成を準備する + +[こちらの手順](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#set-up-a-local-connect-worker-with-cp-install)に従って、インストールタイプに関連する Connect をセットアップし、スタンドアロンと分散クラスターの違いに注意してください。Confluent Cloud を使用する場合、分散セットアップが関連します。 + +以下のパラメータは、ClickHouse で JDBC コネクタを使用する場合に関連します。全パラメータ一覧は[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/sink-connector/index.html)で確認できます。 + +* `connection.url` - 形式は `jdbc:clickhouse://<clickhouse host>:<clickhouse http port>/<target database>` とする必要があります。 +* `connection.user` - ターゲットデータベースへの書き込みアクセス権を持つユーザー +* `table.name.format` - データを挿入する ClickHouse テーブル。存在している必要があります。 +* `batch.size` - 一度に送信する行数。ClickHouse の[推奨事項](../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data)に基づき、1000 を最小値として考慮してください。 +* `tasks.max` - JDBC Sink コネクタは 1 つ以上のタスクの実行をサポートしています。これによりパフォーマンスを向上させることができます。バッチサイズと共に、パフォーマンス向上の主要手段を表します。 +* `value.converter.schemas.enable` - スキーマレジストリを使用している場合は false に設定し、メッセージにスキーマを埋め込む場合は true に設定します。 +* `value.converter` - データタイプに応じて設定します。たとえば JSON の場合は “io.confluent.connect.json.JsonSchemaConverter”。 +* `key.converter` - “org.apache.kafka.connect.storage.StringConverter” に設定します。文字列キーを利用します。 +* `pk.mode` - ClickHouse には関連しないため、none に設定します。 +* `auto.create` - サポートされておらず、false に設定する必要があります。 +* `auto.evolve` - 将来的にサポートされる可能性があるため、false を推奨します。 +* `insert.mode` - “insert” に設定します。他のモードは現在サポートされていません。 +* `key.converter` - キーのタイプに応じて設定します。 +* `value.converter` - トピック上のデータタイプに基づいて設定します。このデータはサポートされたスキーマを持っている必要があります。JSON、Avro、または Protobuf 形式など。 + +サンプルデータセットをテストに使用する場合、以下を設定してください: + +* `value.converter.schemas.enable` - スキーマレジストリを使用するため false に設定します。スキーマを各メッセージに埋め込む場合は true に設定します。 +* `key.converter` - Set to “org.apache.kafka.connect.storage.StringConverter”. 文字列キーを利用します。 +* `value.converter` - Set “io.confluent.connect.json.JsonSchemaConverter”. +* `value.converter.schema.registry.url` - スキーマサーバーの URL を設定し、`value.converter.schema.registry.basic.auth.user.info` によりスキーマサーバーへの認証情報を入力します。 + +Github のサンプルデータ用の構成ファイルの例は[こちら](https://github.com/ClickHouse/kafka-samples/tree/main/github_events/jdbc_sink)で確認できます。Connect がスタンドアロンモードで実行され、Kafka が Confluent Cloud にホストされていることを前提としています。 + +#### 4. ClickHouse テーブルを作成する + +テーブルが作成されていることを確認し、既存の例から存在する場合は削除します。以下に示すのは、削減された Github データセットに対応した例です。未対応の Array や Map 型の不在に注意してください: + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) +``` + +#### 5. Kafka Connect を起動する + +Kafka Connect を[スタンドアロン](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#standalone-cluster)または[分散](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#distributed-cluster)モードで起動します。 + +```bash +./bin/connect-standalone connect.properties.ini github-jdbc-sink.properties.ini +``` + +#### 6. Kafka にデータを追加する + +提供された[スクリプトと設定](https://github.com/ClickHouse/kafka-samples/tree/main/producer)を使用して Kafka にメッセージを挿入します。github.config を修正して Kafka の認証情報を含める必要があります。このスクリプトは現在、Confluent Cloud での使用向けに構成されています。 + +```bash +python producer.py -c github.config +``` + +このスクリプトは、任意の ndjson ファイルを Kafka トピックに挿入するために使用できます。スキーマを自動的に推測しようとします。提供されたサンプル設定は 10k のメッセージのみを挿入しますが、必要があれば[こちら](https://github.com/ClickHouse/clickhouse-docs/tree/main/docs/en/integrations/data-ingestion/kafka/code/producer/github.config#L25)で修正してください。この構成はまた、Kafka への挿入中にデータセットから互換性のない Array フィールドを削除します。 + +これは JDBC コネクタがメッセージを INSERT 文に変換するために必要です。自身のデータを使用する場合、スキーマを各メッセージに挿入(`value.converter.schemas.enable` を true に設定)するか、クライアントがメッセージをスキーマレジストリに参照しながら公開することを確認してください。 + +Kafka Connect はメッセージの消費を始め、ClickHouse に行を挿入していくはずです。「[JDBC Compliant Mode] トランザクションはサポートされていません。」の警告は予期されており、無視することができます。 + +ターゲットテーブル「Github」で簡単な読み取りを行うと、データ挿入が確認できます。 + +```sql +SELECT count() FROM default.github; +``` + +```response +| count\(\) | +| :--- | +| 10000 | +``` + +### 推奨されるさらなる読み物 + +* [Kafka Sink Configuration Parameters](https://docs.confluent.io/kafka-connect-jdbc/current/sink-connector/sink_config_options.html#sink-config-options) +* [Kafka Connect Deep Dive – JDBC Source Connector](https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector) +* [Kafka Connect JDBC Sink deep-dive: Working with Primary Keys](https://rmoff.net/2021/03/12/kafka-connect-jdbc-sink-deep-dive-working-with-primary-keys/) +* [Kafka Connect in Action: JDBC Sink](https://www.youtube.com/watch?v=b-3qN_tlYR4&t=981s) - 読むより視聴を好む方に。 +* [Kafka Connect Deep Dive – Converters and Serialization Explained](https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained/#json-schemas) diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md new file mode 100644 index 00000000000..2965a1c7494 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md @@ -0,0 +1,214 @@ +--- +title: Named Collectionsを使用したClickHouseとKafkaの統合 +description: named collectionsを使用してClickHouseをKafkaに接続する方法 +keywords: [named collection, 方法, kafka] +--- + +# Named Collectionsを使用したClickHouseとKafkaの統合 + +## はじめに + +このガイドでは、named collectionsを使用してClickHouseをKafkaに接続する方法を探ります。named collectionsのための設定ファイルを使用することには、以下のような利点があります: +- 設定の集中管理と容易な管理。 +- SQLテーブル定義を変更せずに設定を変更可能。 +- 単一の設定ファイルを調査することで、設定のレビューとトラブルシューティングが容易。 + +このガイドは、Apache Kafka 3.4.1とClickHouse 24.5.1でテストされています。 + +## 前提条件 + +このドキュメントは以下を前提としています: +1. 動作中のKafkaクラスター。 +2. 設定済みで稼働中のClickHouseクラスター。 +3. SQLの基本的な知識と、ClickHouseおよびKafkaの設定に関する基本理解。 + +## 必要条件 + +named collectionを作成するユーザーが必要なアクセス権を持っていることを確認してください: + +```xml +1 +1 +1 +1 +``` + +アクセス制御を有効にする詳細については、[ユーザー管理ガイド](./../../../guides/sre/user-management/index.md)を参照してください。 + +## 設定 + +ClickHouseの`config.xml`ファイルに以下のセクションを追加してください: + +```xml + + + + + c1-kafka-1:9094,c1-kafka-2:9094,c1-kafka-3:9094 + cluster_1_clickhouse_topic + cluster_1_clickhouse_consumer + JSONEachRow + 0 + 1 + 1 + + + + SASL_SSL + false + PLAIN + kafka-client + kafkapassword1 + all + latest + + + + + + c2-kafka-1:29094,c2-kafka-2:29094,c2-kafka-3:29094 + cluster_2_clickhouse_topic + cluster_2_clickhouse_consumer + JSONEachRow + 0 + 1 + 1 + + + + SASL_SSL + false + PLAIN + kafka-client + kafkapassword2 + all + latest + + + +``` + +### 設定メモ + +1. Kafkaアドレスや関連設定をお使いのKafkaクラスター設定に合わせて調整してください。 +2. ``の前のセクションには、ClickHouse Kafkaエンジンのパラメータが含まれます。すべてのパラメータについては、[Kafkaエンジンパラメータ](https://clickhouse.com/docs/ja/engines/table-engines/integrations/kafka)を参照してください。 +3. ``内のセクションには、Kafka拡張設定オプションが含まれます。より多くのオプションについては、[librdkafka設定](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md)を参照してください。 +4. この例では、`SASL_SSL`セキュリティプロトコルと`PLAIN`メカニズムを使用しています。これらの設定をあなたのKafkaクラスター設定に基づいて調整してください。 + +## テーブルとデータベースの作成 + +ClickHouseクラスター上に必要なデータベースとテーブルを作成します。ClickHouseを単一ノードとして実行している場合は、SQLコマンドのクラスタ部分を省略し、`ReplicatedMergeTree`の代わりに他のエンジンを使用してください。 + +### データベースの作成 + +```sql +CREATE DATABASE kafka_testing ON CLUSTER LAB_CLICKHOUSE_CLUSTER; +``` + +### Kafkaテーブルの作成 + +最初のKafkaクラスター用の最初のKafkaテーブルを作成: + +```sql +CREATE TABLE kafka_testing.first_kafka_table ON CLUSTER LAB_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) +ENGINE = Kafka(cluster_1); +``` + +2つ目のKafkaクラスター用の2つ目のKafkaテーブルを作成: + +```sql +CREATE TABLE kafka_testing.second_kafka_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) +ENGINE = Kafka(cluster_2); +``` + +### レプリケートテーブルの作成 + +最初のKafkaテーブル用のテーブルを作成: + +```sql +CREATE TABLE kafka_testing.first_replicated_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) ENGINE = ReplicatedMergeTree() +ORDER BY id; +``` + +2つ目のKafkaテーブル用のテーブルを作成: + +```sql +CREATE TABLE kafka_testing.second_replicated_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) ENGINE = ReplicatedMergeTree() +ORDER BY id; +``` + +### Materialized Viewの作成 + +最初のKafkaテーブルから最初のレプリケートテーブルにデータを挿入するためのmaterialized viewを作成: + +```sql +CREATE MATERIALIZED VIEW kafka_testing.cluster_1_mv ON CLUSTER STAGE_CLICKHOUSE_CLUSTER TO first_replicated_table AS +SELECT + id, + first_name, + last_name +FROM first_kafka_table; +``` + +2つ目のKafkaテーブルから2つ目のレプリケートテーブルにデータを挿入するためのmaterialized viewを作成: + +```sql +CREATE MATERIALIZED VIEW kafka_testing.cluster_2_mv ON CLUSTER STAGE_CLICKHOUSE_CLUSTER TO second_replicated_table AS +SELECT + id, + first_name, + last_name +FROM second_kafka_table; +``` + +## 設定の検証 + +Kafkaクラスター上で以下の消費者グループが見えるはずです: +- `cluster_1_clickhouse_consumer` on `cluster_1` +- `cluster_2_clickhouse_consumer` on `cluster_2` + +ClickHouseノードのいずれかで以下のクエリを実行して、両方のテーブルのデータを確認してください: + +```sql +SELECT * FROM first_replicated_table LIMIT 10; +``` + +```sql +SELECT * FROM second_replicated_table LIMIT 10; +``` + +### メモ + +このガイドでは、両方のKafkaトピックに取り込まれるデータは同じですが、実際には異なるでしょう。必要に応じて多くのKafkaクラスターを追加することが可能です。 + +例の出力: + +```sql +┌─id─┬─first_name─┬─last_name─┐ +│ 0 │ FirstName0 │ LastName0 │ +│ 1 │ FirstName1 │ LastName1 │ +│ 2 │ FirstName2 │ LastName2 │ +└────┴────────────┴───────────┘ +``` + +これで、Named Collectionsを使用したClickHouseとKafkaの統合のセットアップは完了です。ClickHouseの`config.xml`ファイルにKafka設定を集中させることで、設定の管理と調整がより簡単になり、効率的な統合が可能になります。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md new file mode 100644 index 00000000000..36e2e3f7415 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md @@ -0,0 +1,486 @@ +--- +sidebar_label: Kafka テーブルエンジン +sidebar_position: 5 +slug: /ja/integrations/kafka/kafka-table-engine +description: Kafka テーブルエンジンの使用 +--- + +# Kafka テーブルエンジンの使用 + +:::note +Kafka テーブルエンジンは[ClickHouse Cloud](https://clickhouse.com/cloud)ではサポートされていません。[ClickPipes](../clickpipes/kafka.md)または[Kafka Connect](./kafka-clickhouse-connect-sink.md)を検討してください。 +::: + +### Kafka を ClickHouse へ + +Kafka テーブルエンジンを使用するには、[ClickHouse の Materialized View](../../../guides/developer/cascading-materialized-views.md)について基本的な知識が必要です。 + +#### 概要 + +初めに注目するのは最も一般的なユースケースです。Kafka テーブルエンジンを使用して Kafka から ClickHouse にデータを挿入します。 + +Kafka テーブルエンジンは、ClickHouse が Kafka トピックから直接データを読み込むことを可能にします。トピック上のメッセージを表示するのに便利ですが、設計上、クエリがテーブルに発行されたときにキューからデータを消費し、コンシューマオフセットを増やしてから結果を呼び出し元に返します。したがって、これらのオフセットをリセットしない限り、データを再読することはできません。 + +このテーブルエンジンから読み込んだデータを保存するためには、データをキャプチャして別のテーブルに挿入する方法が必要です。トリガーに基づく Materialized View がネイティブにその機能を提供します。Materialized View はテーブルエンジンの読み取りを開始し、ドキュメントのバッチを受信します。TO 句がデータの宛先を決定する - 通常は [MergeTree ファミリー](../../../engines/table-engines/mergetree-family/index.md)のテーブルです。このプロセスは以下の図で視覚化されています。 + +Kafka テーブルエンジン + +#### ステップ + +##### 1. 準備 + +対象トピックにデータがある場合、以下の要素をデータセットに適用できます。あるいは、サンプルの Github データセットが[こちら](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)で提供されています。このデータセットは以下の例で使用されており、完全なデータセット([こちら](https://ghe.clickhouse.tech/))に比べてスキーマが縮小され、行のサブセット(具体的には[ClickHouse リポジトリ](https://github.com/ClickHouse/ClickHouse)に関連する Github イベントに限定)を使用していますが、それでもデータセットと共に公開されているほとんどのクエリを実行するには十分です。 + +##### 2. ClickHouse を設定 + +安全な Kafka に接続している場合はこのステップが必要です。これらの設定は SQL DDL コマンドを通じて渡すことができず、ClickHouse の config.xml に設定する必要があります。SASL で保護されたインスタンスに接続していると仮定します。これは Confluent Cloud と対話する際の最も簡単な方法です。 + +```xml + + + username + password + sasl_ssl + PLAIN + + +``` + +上記のスニペットを新しいファイルとして conf.d/ ディレクトリに置くか、既存の設定ファイルにマージします。設定できる設定については[こちら](../../../engines/table-engines/integrations/kafka.md#configuration)を参照してください。 + +このチュートリアルでは `KafkaEngine` というデータベースを作成します。 + +```sql +CREATE DATABASE KafkaEngine; +``` + +データベースを作成したら、そこに切り替える必要があります。 + +```sql +USE KafkaEngine; +``` + +##### 3. 目的のテーブルを作成する + +目的のテーブルを準備します。以下の例では簡潔にするために縮小された GitHub スキーマを使用します。MergeTree テーブルエンジンを使用していますが、この例は [MergeTree ファミリー](../../../engines/table-engines/mergetree-family/index.md)のいずれのメンバーにも簡単に適応できます。 + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) +``` + +##### 4. トピックを作成してデータを挿入する + +次に、トピックを作成します。これを行うためのいくつかのツールがあります。Kafka をローカルマシンまたは Docker コンテナ内で実行している場合、[RPK](https://docs.redpanda.com/current/get-started/rpk-install/) がよく機能します。以下のコマンドを実行して 5パーティションの `github` というトピックを作成できます。 + +```bash +rpk topic create -p 5 github --brokers : +``` + +Confluent Cloud 上で Kafka を実行している場合は、[Confluent CLI](https://docs.confluent.io/platform/current/tutorials/examples/clients/docs/kcat.html#produce-records)を使用することをお勧めします。 + +```bash +confluent kafka topic create --if-not-exists github +``` + +次に、このトピックにデータを投入する必要があります。これは [kcat](https://github.com/edenhill/kcat) を使用して行います。認証が無効な状態で Kafka をローカルで実行している場合は、次のようなコマンドを実行できます。 + +```bash +cat github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github +``` + +または、SASL を使用して認証する Kafka クラスターの場合: + +```bash +cat github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= \ +``` + +データセットには 200,000 行が含まれているため、数秒で取り込まれるはずです。より大きなデータセットを扱いたい場合は、[the large datasets section](https://github.com/ClickHouse/kafka-samples/tree/main/producer#large-datasets) of the [ClickHouse/kafka-samples](https://github.com/ClickHouse/kafka-samples) GitHub リポジトリをご覧ください。 + +##### 5. Kafka テーブルエンジンの作成 + +以下の例は、マージツリーテーブルと同じスキーマを持つテーブルエンジンを作成します。これは厳密には必要ありません。ターゲットテーブルにエイリアスやエフェメラルカラムを持つことができます。ただし、設定は重要です。Kafka トピックから JSON を消費するためのデータタイプとして `JSONEachRow` を使用している点に注意してください。`github` および `clickhouse` はそれぞれトピック名とコンシューマグループ名を表しています。トピックは実際には値のリストにすることができます。 + +```sql +CREATE TABLE github_queue +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) + ENGINE = Kafka('kafka_host:9092', 'github', 'clickhouse', + 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1; +``` + +エンジンの設定とパフォーマンスチューニングについては後述します。この時点で、テーブル `github_queue` に対する単純な select を行うといくつかの行が読み取れるはずです。その際には、コンシューマオフセットが進むため、これらの行を再読するには[リセット](#common-operations)が必要です。制限と必要なパラメーター `stream_like_engine_allow_direct_select` に注意してください。 + +##### 6. Materialized View の作成 + +Materialized View は、以前に作成した2つのテーブルを接続し、カフカテーブルエンジンからデータを読み取り、ターゲットのマージツリーテーブルにデータを挿入します。多くのデータ変換を行えます。ここでは簡単な読み取りと挿入を行います。* を使用すると、カラム名が同一(大文字小文字を区別)であることが前提となります。 + +```sql +CREATE MATERIALIZED VIEW github_mv TO github AS +SELECT * +FROM github_queue; +``` + +作成時点で、Materialized View は Kafka エンジンに接続し、読み取りを開始し、行をターゲットテーブルに挿入します。このプロセスは無期限に続き、Kafka へのメッセージの追加が消費され続けます。Kafka にさらにメッセージを追加するために挿入スクリプトを再度実行してみてください。 + +##### 7. 挿入された行を確認する + +ターゲットテーブルにデータが存在することを確認します。 + +```sql +SELECT count() FROM github; +``` + +200,000 行が表示されるはずです: +```response +┌─count()─┐ +│ 200000 │ +└─────────┘ +``` + +#### 一般的な操作 + +##### メッセージ消費の停止と再開 + +メッセージ消費を停止するには、Kafka エンジンテーブルをデタッチします。 + +```sql +DETACH TABLE github_queue; +``` + +これはコンシューマグループのオフセットに影響を与えません。消費を再開し、前回のオフセットから続行するにはテーブルを再アタッチします。 + +```sql +ATTACH TABLE github_queue; +``` + +##### Kafka メタデータの追加 + +元の Kafka メッセージから、ClickHouse に取り込まれた後のメタデータを追跡することは有用です。たとえば、特定のトピックやパーティションからどれだけ消費したかを知りたい場合です。この目的のために、Kafka テーブルエンジンにはいくつかの[仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns)が公開されています。これらをターゲットテーブルのカラムとして保持するには、スキーマと Materialized View の select 文を変更します。 + +まず、ターゲットテーブルにカラムを追加する前に、上で説明した停止操作を実行します。 + +```sql +DETACH TABLE github_queue; +``` + +以下は、行がどのトピックおよびパーティションから来たのかを識別する情報カラムを追加します。 + +```sql +ALTER TABLE github + ADD COLUMN topic String, + ADD COLUMN partition UInt64; +``` + +次に、必要なように仮想カラムをマップする必要があります。 +仮想カラムは `_` で始まります。 +仮想カラムの完全なリストは[こちら](../../../engines/table-engines/integrations/kafka.md#virtual-columns)にあります。 + +仮想カラムでテーブルを更新するには、Materialized View を削除し、Kafka エンジンテーブルを再アタッチし、Materialized View を再作成する必要があります。 + +```sql +DROP VIEW github_mv; +``` + +```sql +ATTACH TABLE github_queue; +``` + +```sql +CREATE MATERIALIZED VIEW github_mv TO github AS +SELECT *, _topic as topic, _partition as partition +FROM github_queue; +``` + +新たに消費された行にはメタデータが含まれます。 + +```sql +SELECT actor_login, event_type, created_at, topic, partition +FROM github +LIMIT 10; +``` + +結果は次のようになります。 + +| actor_login | event_type | created_at | topic | partition | +| :--- | :--- | :--- | :--- | :--- | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:22:00 | github | 0 | +| queeup | CommitCommentEvent | 2011-02-12 02:23:23 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:23:24 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:24:50 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:25:20 | github | 0 | +| dapi | CommitCommentEvent | 2011-02-12 06:18:36 | github | 0 | +| sourcerebels | CommitCommentEvent | 2011-02-12 06:34:10 | github | 0 | +| jamierumbelow | CommitCommentEvent | 2011-02-12 12:21:40 | github | 0 | +| jpn | CommitCommentEvent | 2011-02-12 12:24:31 | github | 0 | +| Oxonium | CommitCommentEvent | 2011-02-12 12:31:28 | github | 0 | + +##### Kafka エンジンの設定を変更する + +Kafka エンジンテーブルをドロップして新しい設定で再作成することをお勧めします。このプロセス中に Materialized View を変更する必要はありません - Kafka エンジンテーブルが再作成されるとメッセージ消費は再開されます。 + +##### 問題のデバッグ + +認証の問題などのエラーは、Kafka エンジン DDL に対する応答に報告されません。問題の診断には、主要な ClickHouse ログファイル clickhouse-server.err.log を使用することをお勧めします。基盤となる Kafka クライアントライブラリ [librdkafka](https://github.com/edenhill/librdkafka) のさらなるトレースログは設定を通じて有効にできます。 + +```xml + + all + +``` + +##### 破損したメッセージの処理 + +Kafka はしばしばデータの「一時保管所」として使用されます。これにより、トピックに混在したメッセージ形式や不一致のフィールド名が含まれることがあります。この状況を避け、Kafka Streams や ksqlDB などの Kafka 機能を活用し、メッセージが Kafka に挿入される前に、整形され、一貫性のあるものにします。これらのオプションが利用できない場合、ClickHouse には役立ついくつかの機能があります。 + +* メッセージフィールドを文字列として処理します。必要に応じて、Materialized View 文で関数を使用してクレンジングやキャスティングを行うことができます。これは本番環境でのソリューションを表すものではありませんが、1回限りのインジェストには役立つかもしれません。 +* JSONEachRow フォーマットを使用して、トピックから JSON を消費している場合は、設定 [`input_format_skip_unknown_fields`](../../../operations/settings/settings-formats.md#settings-input-format-skip-unknown-fields) を使用します。データを書き込む際に、デフォルトで ClickHouse はターゲットテーブルに存在しないカラムが入力データに含まれているときに例外を投げます。ただし、このオプションが有効にされている場合、これらの余分なカラムは無視されます。これもまた本番レベルのソリューションではなく、他の人を混乱させるかもしれません。 +* `kafka_skip_broken_messages` 設定を考慮してください。これは、ユーザーがブロックごとに破損したメッセージに対する許容度を指定する必要があり、kafka_max_block_size の文脈で考慮されます。この許容度を超えると(絶対メッセージ単位で測定)、通常の例外処理に戻り、他のメッセージがスキップされます。 + +##### 配信セマンティクスと重複に関する課題 + +Kafka テーブルエンジンは少なくとも一度のセマンティクスを持っています。稀な状況で重複が生じる可能性があります。たとえば、メッセージが Kafka から読み取られ、ClickHouse に正常に挿入された場合、新しいオフセットをコミットする前に Kafka への接続が失われることがあります。この状況ではブロックの再試行が必要です。このブロックは、分散テーブルや ReplicatedMergeTree をターゲットテーブルとして使用することで[データの重複排除](../../../engines/table-engines/mergetree-family/replication.md#table_engines-replication)することができます。これは重複行の可能性を減らしますが、同一ブロックに依存します。Kafka の再バランスなどのイベントによってこの仮定が無効になる可能性があり、稀に重複を引き起こす可能性があります。 + +##### クォーラムベースの挿入 + +ClickHouse でのより高い配信保証が必要な場合には[クォーラムベースの挿入](../../../operations/settings/settings.md#settings-insert_quorum)を行う必要があります。これは Materialized View やターゲットテーブルに設定することはできません。ただし、ユーザープロファイルに設定することができます。 + +```xml + + + 2 + + +``` + +### ClickHouse から Kafka へ + +あまり一般的でないユースケースですが、ClickHouse のデータも Kafka に保持できます。たとえば、行を手動で Kafka テーブルエンジンに挿入します。このデータは同じ Kafka エンジンによって読み取られ、その Materialized View はデータを MergeTree テーブルに配置します。最後に、既存のソーステーブルから Kafka に挿入する際の Materialized View の応用を示します。 + +#### ステップ + +私たちの初期の目的は以下の図で最もよく示されています: + +Kafka テーブルエンジンの挿入 + +[Kafka を ClickHouse へ](#kafka-to-clickhouse)のステップで作成されたテーブルとビューを持っていることを前提とし、トピックが完全に消費されていると仮定します。 + +##### 1. 直接行を挿入する + +まず、ターゲットテーブルの件数を確認します。 + +```sql +SELECT count() FROM github; +``` + +200,000 行があるはずです: +```response +┌─count()─┐ +│ 200000 │ +└─────────┘ +``` + +GitHub ターゲットテーブルから Kafka テーブルエンジン github_queue に行を挿入します。JSONEachRow フォーマットを活用し、SELECT を 100 に制限する点に注意してください。 + +```sql +INSERT INTO github_queue SELECT * FROM github LIMIT 100 FORMAT JSONEachRow +``` + +GitHub の行数を再確認して、100 増加したことを確認します。上記の図に示すように、行は Kafka へ Kafka テーブルエンジンを介して挿入され、その後 Materialized View によって GitHub ターゲットテーブルに再挿入されました! + +```sql +SELECT count() FROM github; +``` + +100 行追加されているはずです: +```response +┌─count()─┐ +│ 200100 │ +└─────────┘ +``` + +##### 2. Materialized View の使用 + +Materialized View を利用して、テーブルへのドキュメント挿入時に Kafka エンジン(およびトピック)にメッセージをプッシュできます。GitHub テーブルに行が挿入されると、Materialized View がトリガーされ、行が再び Kafka エンジンおよび新しいトピックに挿入されます。これもまた以下の図で最もよく示されています: + +Kafka テーブルエンジン挿入と Materialized View + +`github_out` または同等の新しい Kafka トピックを作成します。このトピックを指す Kafka テーブルエンジン `github_out_queue` を作成します。 + +```sql +CREATE TABLE github_out_queue +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) + ENGINE = Kafka('host:port', 'github_out', 'clickhouse_out', + 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1; +``` + +次に、新しい Materialized View `github_out_mv` を作成して GitHub テーブルを指し、トリガーされると上記のエンジンに行を挿入するようにします。GitHub テーブルへの追加は、結果として新しい Kafka トピックにプッシュされます。 + +```sql +CREATE MATERIALIZED VIEW github_out_mv TO github_out_queue AS +SELECT file_time, event_type, actor_login, repo_name, + created_at, updated_at, action, comment_id, path, + ref, ref_type, creator_user_login, number, title, + labels, state, assignee, assignees, closed_at, merged_at, + merge_commit_sha, requested_reviewers, merged_by, + review_comments, member_login +FROM github +FORMAT JsonEachRow; +``` + +オリジナルの github トピックに挿入すると、ドキュメントが「github_clickhouse」トピックに魔法のように現れます。ネイティブ Kafka ツールを使用してこれを確認してください。たとえば、Confluent Cloud ホストのトピックに対して [kcat](https://github.com/edenhill/kcat) を使用して github トピックに 100 行をインサートします。 + +```sql +head -n 10 github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= +``` + +`github_out` トピックの読み取りでメッセージの配信が確認されます。 + +```sql +kcat -C \ + -b : \ + -t github_out \ + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= \ + -e -q | +wc -l +``` + +これは複雑な例ですが、Kafka エンジンと組み合わせて使用する場合の Materialized View の力を示しています。 + +### クラスターとパフォーマンス + +#### ClickHouse クラスターを使用する + +Kafka コンシューマグループを通じて、複数の ClickHouse インスタンスが同じトピックを読むことができます。各コンシューマは 1:1 マッピングでトピックパーティションに割り当てられます。Kafka テーブルエンジンを使用して ClickHouse 消費をスケーリングする際には、クラスタ内のコンシューマの総数がトピックのパーティション数を超えることができないことを考慮してください。したがって、事前にトピックのパーティションを適切に構成してください。 + +複数の ClickHouse インスタンスが、Kafka テーブルエンジンの作成中に指定された同じコンシューマグループ ID を使用してトピックを読み込むように構成できます。したがって、各インスタンスは一つまたは複数のパーティションから読み取り、セグメントをローカルのターゲットテーブルに挿入します。ターゲットテーブルは、データの重複を処理するために ReplicatedMergeTree を使用して構成することができます。このアプローチにより、十分な Kafka パーティションがある場合は、ClickHouse クラスターに合わせて Kafka リードをスケールアウトすることができます。 + +レプリケートされた Kafka テーブルエンジン + +#### パフォーマンスのチューニング + +Kafka エンジン テーブルのスループットパフォーマンスを向上させる際には次の点を考慮してください。 + +* パフォーマンスはメッセージサイズ、フォーマット、およびターゲットテーブルのタイプによって異なります。単一テーブルエンジン上でのスループットは、100k 行/秒を目標にするべきです。既定では、メッセージはブロックで読み取られ、kafka_max_block_size パラメータによって制御されます。これはデフォルトでは [max_insert_block_size](../../../operations/settings/settings.md#setting-max_insert_block_size) に設定されており、デフォルトは 1,048,576 です。メッセージが非常に大きくない限り、これを増加させるべきです。500k から 1M の範囲は一般的です。スループットパフォーマンスへの影響をテストし評価してください。 +* テーブルエンジンのコンシューマ数は kafka_num_consumers を使用して増やすことができます。ただし、デフォルトでは kafka_thread_per_consumer を 1 に変更しない限り、挿入はシングルスレッドで行われます。これを 1 に設定すると、フラッシュが並行して実行されるようになります。なお、1 消費者あたり 1 スレッドの Kafka エンジン テーブルを作成することは、複数の Kafka エンジンを個別のマテリアライズドビューとともに作成することと論理的に同等です。 +* コンシューマの増加は無料の操作ではありません。各コンシューマは独自のバッファとスレッドを保持し、サーバーへのオーバーヘッドを増やします。オーバーヘッドを意識し、まずクラスタ全体で線形にスケールしてください。可能であれば線形にスケールアウトします。 +* Kafka メッセージのスループットが変動し、遅延が許容される場合は、stream_flush_interval_ms を増やして、より大きなブロックがフラッシュされるようにします。 +* [background_message_broker_schedule_pool_size](../../../operations/settings/settings.md#background_message_broker_schedule_pool_size)は、バックグラウンドタスクを実行するスレッドの数です。これらのスレッドは Kafka ストリーミングに使用されます。この設定は ClickHouse サーバーの起動時に適用され、ユーザーセッションでは変更できず、デフォルトは 16 です。ログにタイムアウトが見られる場合、この設定を増やすべきかもしれません。 +* Kafka との通信には、ライブラリ librdkafka が使用されており、それ自体がスレッドを生成します。大量の Kafka テーブルやコンシューマの結果、大量のコンテキスト切り替えが発生する可能性があります。この負荷をクラスタ全体に分散し、可能であればターゲットテーブルのみを複製するか、複数のトピックを読み取るためのテーブルエンジンを使用することを検討してください - 値のリストがサポートされています。異なるトピックからのデータをフィルタリングする形で単一テーブルから複数のマテリアライズドビューを読み取ることができます。 + +設定の変更はテストされるべきです。Kafka コンシューマの遅延を監視して、適切なスケールアウトが行われていることを確認してください。 + +#### 追加の設定 + +上記の設定に加えて、以下も興味深いかもしれません: + +* [Kafka_max_wait_ms](../../../operations/settings/settings.md#kafka-max-wait-ms) - Kafka からメッセージを読み取る際の再試行までの待機時間をミリ秒単位で設定します。ユーザープロファイルレベルで設定され、デフォルトは 5000 です。 + +[librdkafka のすべての設定 ](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)は、ClickHouse 構成ファイルの _kafka_ 要素内に配置することができます - 設定名は XML 要素として、ピリオドをアンダースコアに置き換えて指定してください。 + +```xml + + + false + + +``` + +これらは専門的な設定であり、Kafka のドキュメントを参照して詳細な説明を確認することをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md b/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md new file mode 100644 index 00000000000..eb64ada3c65 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md @@ -0,0 +1,129 @@ +--- +sidebar_label: KafkaとのVector +sidebar_position: 3 +slug: /ja/integrations/kafka/kafka-vector +description: KafkaとClickHouseでVectorを使用する +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +## KafkaとClickHouseでVectorを使用する + +Vectorは、Kafkaからデータを読み取り、ClickHouseにイベントを送信できる、ベンダーに依存しないデータパイプラインです。 + +ClickHouseとのVectorの[入門ガイド](../etl-tools/vector-to-clickhouse.md)は、ログのユースケースとファイルからイベントを読み取ることに焦点を当てています。私たちは、Kafkaトピックに保持されている[Githubサンプルデータセット](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)を利用します。 + +Vectorは、[sources](https://vector.dev/docs/about/concepts/#sources)を使用して、プッシュまたはプルモデルでデータを取得します。[sinks](https://vector.dev/docs/about/concepts/#sinks)は、イベントの宛先を提供します。そのため、KafkaのソースとClickHouseのシンクを使用します。注意点として、Kafkaはシンクとしてサポートされていますが、ClickHouseのソースは存在しません。したがって、ClickHouseからKafkaにデータを転送したいユーザーにはVectorは適切ではありません。 + +Vectorはまた、データの[変換](https://vector.dev/docs/reference/configuration/transforms/)もサポートしています。これはこのガイドの範囲外です。データセットにおいて変換が必要な場合は、Vectorのドキュメントを参照してください。 + +現在のClickHouseシンクの実装は、HTTPインターフェースを利用しています。ClickHouseシンクは現時点でJSONスキーマの利用をサポートしていません。データはプレーンなJSON形式または文字列としてKafkaに公開される必要があります。 + +### ライセンス +Vectorは、[MPL-2.0ライセンス](https://github.com/vectordotdev/vector/blob/master/LICENSE)の下で配布されています。 + +### 接続情報を収集する + + +### 手順 + +1. Kafkaの`github`トピックを作成し、[Githubデータセット](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)を挿入します。 + +```bash +cat /opt/data/github/github_all_columns.ndjson | kcat -b : -X security.protocol=sasl_ssl -X sasl.mechanisms=PLAIN -X sasl.username= -X sasl.password= -t github +``` + +このデータセットは`ClickHouse/ClickHouse`リポジトリに焦点を当てた200,000行で構成されています。 + +2. ターゲットテーブルが作成されていることを確認してください。以下ではデフォルトのデータベースを使用します。 + +```sql + +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, + 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at); + +``` + +3. [Vectorをダウンロードしてインストール](https://vector.dev/docs/setup/quickstart/)します。`kafka.toml`という設定ファイルを作成し、KafkaとClickHouseのインスタンスに合わせて値を変更します。 + +```toml +[sources.github] +type = "kafka" +auto_offset_reset = "smallest" +bootstrap_servers = ":" +group_id = "vector" +topics = [ "github" ] +tls.enabled = true +sasl.enabled = true +sasl.mechanism = "PLAIN" +sasl.username = "" +sasl.password = "" +decoding.codec = "json" + +[sinks.clickhouse] +type = "clickhouse" +inputs = ["github"] +endpoint = "http://localhost:8123" +database = "default" +table = "github" +skip_unknown_fields = true +auth.strategy = "basic" +auth.user = "username" +auth.password = "password" +buffer.max_events = 10000 +batch.timeout_secs = 1 +``` + +この設定とVectorの動作に関する重要な注意点: + +- この例はConfluent Cloudに対してテストされています。そのため、`sasl.*`および`ssl.enabled`のセキュリティオプションはセルフマネージドの場合には適切でない可能性があります。 +- 設定パラメータ`bootstrap_servers`にはプロトコル接頭辞は必要ありません。例えば `pkc-2396y.us-east-1.aws.confluent.cloud:9092` +- ソースパラメータの`decoding.codec = "json"`は、メッセージが単一のJSONオブジェクトとしてClickHouseシンクに渡されることを保証します。文字列としてメッセージを扱い、デフォルトの`bytes`値を使用する場合、メッセージの内容は`message`フィールドに追加されます。ほとんどの場合、これは[Vector入門](../etl-tools/vector-to-clickhouse.md#4-parse-the-logs)ガイドで説明されているようにClickHouseで処理が必要です。 +- Vectorはメッセージに[多くのフィールドを追加](https://vector.dev/docs/reference/configuration/sources/kafka/#output-data)します。この例では、ClickHouseシンクの設定パラメータ`skip_unknown_fields = true`を介してこれらのフィールドを無視しています。これは、ターゲットテーブルスキーマの一部でないフィールドを無視します。例えば`offset`などのメタフィールドが追加されるようにスキーマを調整しても問題ありません。 +- シンクがソースイベントへの参照として`inputs`パラメータをどのように使用するかに注意してください。 +- ClickHouseシンクの動作については[こちら](https://vector.dev/docs/reference/configuration/sinks/clickhouse/#buffers-and-batches)に記載されています。最適なスループットを得るために、ユーザーは`buffer.max_events`、`batch.timeout_secs`および`batch.max_bytes`パラメータのチューニングを行うことができます。 ClickHouseの[推奨事項](../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data)に従い、1000のイベント数は1バッチあたりの最低値と考えられるべきです。高スループットのユースケースでは、`buffer.max_events` パラメータを増やすことができます。スループットに変動がある場合は、`batch.timeout_secs` パラメータを変更する必要があるかもしれません。 +- `auto_offset_reset = "smallest"`パラメータは、Kafkaソースがトピックの先頭から開始することを強制します。これにより、ステップ(1)で公開されたメッセージを消費することが保証されます。異なる動作を必要とする場合は[こちら](https://vector.dev/docs/reference/configuration/sources/kafka/#auto_offset_reset)をご覧ください。 + +1. Vectorを開始します。 + +```bash +vector --config ./kafka.toml +``` + +デフォルトでは、ClickHouseへの挿入が開始される前に[ヘルスチェック](https://vector.dev/docs/reference/configuration/sinks/clickhouse/#healthcheck)が必要です。これは接続可能性を確保し、スキーマを確認するためです。問題が発生した場合にさらに詳細なログを取得するには、`VECTOR_LOG=debug`を付けることが役立つ場合があります。 + +5. データの挿入を確認します。 + +```sql +SELECT count() as count FROM github; +``` + +| count | +| :--- | +| 200000 | diff --git a/docs/ja/integrations/data-ingestion/kafka/msk/index.md b/docs/ja/integrations/data-ingestion/kafka/msk/index.md new file mode 100644 index 00000000000..0cfc32faeec --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/msk/index.md @@ -0,0 +1,88 @@ +--- +sidebar_label: Amazon MSK と Kafka Connector Sink +sidebar_position: 1 +slug: /ja/integrations/kafka/cloud/amazon-msk/ +description: ClickHouse 公式 Kafka コネクタと Amazon MSK の連携 +keywords: [integration, kafka, amazon msk, sink, connector] +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Amazon MSK と ClickHouse の統合 + +
+ +
+ +## 前提条件 +以下を前提としています: +* あなたが [ClickHouse コネクタ Sink](../kafka-clickhouse-connect-sink.md)、Amazon MSK、MSK コネクタに精通していること。Amazon MSK [開始ガイド](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)と[MSK コネクトガイド](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect.html)を推奨します。 +* MSK ブローカーが公開アクセス可能であること。開発者ガイドの[公開アクセス](https://docs.aws.amazon.com/msk/latest/developerguide/public-access.html)セクションを参照してください。 + +## ClickHouse の公式 Kafka コネクタと Amazon MSK + +### 接続の詳細を集める + + + +### ステップ +1. [ClickHouse コネクタ Sink](../kafka-clickhouse-connect-sink.md)を理解していることを確認してください。 +1. [MSK インスタンスを作成する](https://docs.aws.amazon.com/msk/latest/developerguide/create-cluster.html)。 +1. [IAM ロールを作成して割り当てる](https://docs.aws.amazon.com/msk/latest/developerguide/create-client-iam-role.html)。 +1. ClickHouse Connect Sink の[リリースページ](https://github.com/ClickHouse/clickhouse-kafka-connect/releases)から `jar` ファイルをダウンロードします。 +1. Amazon MSK コンソールの[カスタムプラグインページ](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-plugins.html)でダウンロードした `jar` ファイルをインストールします。 +1. コネクタが公開 ClickHouse インスタンスと通信する場合は、[インターネットアクセスを有効にします](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-internet-access.html)。 +1. 設定でトピック名、ClickHouse インスタンスホスト名、およびパスワードを指定します。 +```yml +connector.class=com.clickhouse.kafka.connect.ClickHouseSinkConnector +tasks.max=1 +topics= +ssl=true +security.protocol=SSL +hostname= +database= +password= +ssl.truststore.location=/tmp/kafka.client.truststore.jks +port=8443 +value.converter.schemas.enable=false +value.converter=org.apache.kafka.connect.json.JsonConverter +exactlyOnce=true +username=default +schemas.enable=false +``` + +## パフォーマンスチューニング +パフォーマンスを向上させるワンステップとして、**worker** 設定に以下を追加して、Kafka から取得するバッチサイズとレコード数を調整することができます: +```yml +consumer.max.poll.records=[NUMBER OF RECORDS] +consumer.max.partition.fetch.bytes=[NUMBER OF RECORDS * RECORD SIZE IN BYTES] +``` + +使用する具体的な値は、希望のレコード数やレコードサイズに基づいて異なります。例えば、デフォルト値は以下の通りです: + +```yml +consumer.max.poll.records=500 +consumer.max.partition.fetch.bytes=1048576 +``` + +詳細情報(実装やその他の考慮事項について)は、公式の [Kafka](https://kafka.apache.org/documentation/#consumerconfigs) および +[Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-workers.html#msk-connect-create-custom-worker-config) ドキュメントで確認できます。 + +## MSK Connect のネットワーキングに関する注意事項 + +MSK Connect が ClickHouse に接続するために、MSK クラスターをプライベートサブネットに配置し、プライベート NAT を使用してインターネットアクセスを確保することを推奨します。これを設定する方法は以下に記載されています。パブリックサブネットもサポートされていますが、Elastic IP アドレスを ENI に常に割り当てる必要があるため、推奨されません。詳しくは [AWS の詳細](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-internet-access.html)をご覧ください。 + +1. **プライベートサブネットの作成:** VPC 内に新しいサブネットを作成し、プライベートサブネットとして指定します。このサブネットにはインターネットへの直接アクセスがありません。 +1. **NAT ゲートウェイの作成:** VPC のパブリックサブネットに NAT ゲートウェイを作成します。NAT ゲートウェイは、プライベートサブネットのインスタンスがインターネットや他の AWS サービスと接続できるようにしますが、インターネットからこれらのインスタンスへの接続を防ぎます。 +1. **ルートテーブルの更新:** インターネットに向かうトラフィックを NAT ゲートウェイに送るルートを追加します。 +1. **セキュリティグループとネットワーク ACL の設定:** [セキュリティグループ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)と[ネットワーク ACL(アクセス制御リスト)](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)を構成し、ClickHouse インスタンスへの関連するトラフィックを許可します。 + 1. ClickHouse Cloud の場合、セキュリティグループを構成してポート 9440 および 8443 でのインバウンドトラフィックを許可します。 + 2. セルフマネージドの ClickHouse の場合、セキュリティグループが設定ファイルのポート(デフォルトは 8123)でのインバウンドトラフィックを許可するように構成します。 +2. **MSK にセキュリティグループをアタッチ:** これらの新しいセキュリティグループを NAT ゲートウェイにルートされた状態で MSK クラスターにアタッチします。 diff --git a/docs/ja/integrations/data-ingestion/redshift/images/pivot.png b/docs/ja/integrations/data-ingestion/redshift/images/pivot.png new file mode 100644 index 00000000000..6169d9ebfc1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/pivot.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/pull.png b/docs/ja/integrations/data-ingestion/redshift/images/pull.png new file mode 100644 index 00000000000..616eb570643 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/pull.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/push.png b/docs/ja/integrations/data-ingestion/redshift/images/push.png new file mode 100644 index 00000000000..c3f375f0e93 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/push.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png b/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png new file mode 100644 index 00000000000..3e062438fb7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png b/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png new file mode 100644 index 00000000000..067c368f51f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png b/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png new file mode 100644 index 00000000000..40c9a3b4b97 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/index.md b/docs/ja/integrations/data-ingestion/redshift/index.md new file mode 100644 index 00000000000..fed1b92cbda --- /dev/null +++ b/docs/ja/integrations/data-ingestion/redshift/index.md @@ -0,0 +1,250 @@ +--- +sidebar_label: Redshift +slug: /ja/integrations/redshift +description: RedshiftからClickHouseへのデータ移行 +--- + +# RedshiftからClickHouseへのデータ移行 + +## 関連コンテンツ + +
+ +
+ +- ブログ: [分析ワークロードの最適化: Redshift vs ClickHouse 比較](https://clickhouse.com/blog/redshift-vs-clickhouse-comparison) + +## はじめに + +[Amazon Redshift](https://aws.amazon.com/redshift/) は、Amazon Web Services の提供の一部である人気のクラウドデータウェアハウジングソリューションです。このガイドでは、RedshiftインスタンスからClickHouseへのデータ移行のためのさまざまなアプローチを紹介します。以下の3つのオプションをカバーします。 + +RedshitからClickHouseへの移行オプション + +ClickHouse インスタンスの観点からは、次のいずれかの方法で移行できます: + +1. **[RedshiftからClickHouseへデータをPUSHする](#push-data-from-redshift-to-clickhouse)** サードパーティのETL/ELTツールやサービスを使用してClickHouseにデータを送信する + +2. **[RedshiftからClickHouseへデータをPULLする](#pull-data-from-redshift-to-clickhouse)** ClickHouse JDBC Bridgeを活用してRedshiftからデータを取得する + +3. **[S3を使用してRedshiftからClickHouseへデータをPIVOTする](#pivot-data-from-redshift-to-clickhouse-using-s3)** S3オブジェクトストレージを使用して「アンロードしてロードする」ロジックを適用する + +:::note +このチュートリアルではデータソースとしてRedshiftを使用しましたが、ここで紹介する移行アプローチはRedshiftに限定されず、その他の互換性のあるデータソースにも類似した手順を適用できます。 +::: + + +## RedshiftからClickHouseへデータをPUSHする + +プッシュのシナリオでは、サードパーティのツールやサービス(カスタムコードや[ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)を使用するかのいずれか)を活用して、データをClickHouseインスタンスに送るという考え方です。例えば、[Airbyte](https://www.airbyte.com/)のようなソフトウェアを使用して、Redshiftインスタンス(ソースとして)からClickHouse(デスティネーションとして)にデータを移動することができます([Airbyteとの統合ガイド](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)を参照)。 + +RedshitからClickHouseへのPUSH + +### 利点 + +* ETL/ELTソフトウェアの既存のコネクタカタログを活用できます。 +* データを同期させるための組み込み機能(追加/上書き/インクリメントロジック)があります。 +* データ変換シナリオを可能にします(例として、[dbtとの統合ガイド](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md)を参照)。 + +### 欠点 + +* ユーザーはETL/ELTインフラストラクチャのセットアップと保守が必要です。 +* アーキテクチャにサードパーティ要素を導入することで、潜在的なスケーラビリティのボトルネックとなる可能性があります。 + + +## RedshiftからClickHouseへデータをPULLする + +プルのシナリオでは、ClickHouse JDBC Bridgeを活用して、ClickHouseインスタンスから直接Redshiftクラスタに接続し、`INSERT INTO ... SELECT` クエリを実行します。 + +RedshitからClickHouseへのPULL + +### 利点 + +* JDBC互換のすべてのツールに対して汎用的です。 +* ClickHouseから複数の外部データソースをクエリできる優雅なソリューションです。 + +### 欠点 + +* ClickHouse JDBC Bridgeインスタンスが必要で、これが潜在的なスケーラビリティのボトルネックになる可能性があります。 + +:::note +RedshiftはPostgreSQLベースですが、ClickHouseのPostgreSQLテーブル関数やテーブルエンジンを使用することはできません。なぜならClickHouseはPostgreSQLバージョン9以上を必要とし、Redshift APIはそれ以前のバージョン(8.x)に基づいているからです。 +::: + +### チュートリアル + +このオプションを使用するには、ClickHouse JDBC Bridgeをセットアップする必要があります。ClickHouse JDBC Bridgeは、JDBC接続を処理し、ClickHouseインスタンスとデータソース間のプロキシとして機能するスタンドアロンのJavaアプリケーションです。このチュートリアルでは、[サンプルデータベース](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)を持つ事前にポピュレートされたRedshiftインスタンスを使用しました。 + +1. ClickHouse JDBC Bridgeをデプロイします。詳細については、[外部データソース用のJDBC](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md)に関するユーザーガイドを参照してください。 + +:::note +ClickHouse Cloudを使用している場合は、ClickHouse JDBC Bridgeを別の環境で実行し、[remoteSecure](https://clickhouse.com/docs/ja/sql-reference/table-functions/remote/)関数を使用してClickHouse Cloudに接続する必要があります。 +::: + +2. ClickHouse JDBC Bridge用にRedshiftデータソースを設定します。例えば、 `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` + + ```json + { + "redshift-server": { + "aliases": [ + "redshift" + ], + "driverUrls": [ + "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" + ], + "driverClassName": "com.amazon.redshift.jdbc.Driver", + "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", + "username": "awsuser", + "password": "", + "maximumPoolSize": 5 + } + } + ``` + +3. ClickHouse JDBC Bridgeがデプロイされ実行中になったら、ClickHouseからRedshiftインスタンスをクエリし始めることができます。 + + ```sql + SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') + ``` + + ```response + Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 + + ┌─username─┬─firstname─┬─lastname─┐ + │ PGL08LJI │ Vladimir │ Humphrey │ + │ XDZ38RDD │ Barry │ Roy │ + │ AEB55QTM │ Reagan │ Hodge │ + │ OWY35QYB │ Tamekah │ Juarez │ + │ MSD36KVR │ Mufutau │ Watkins │ + └──────────┴───────────┴──────────┘ + + 5 rows in set. Elapsed: 0.438 sec. + ``` + + ```sql + SELECT * + FROM jdbc('redshift', 'select count(*) from sales') + ``` + + ```response + Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b + + ┌──count─┐ + │ 172456 │ + └────────┘ + + 1 rows in set. Elapsed: 0.304 sec. + ``` + +4. 以下に、`INSERT INTO ... SELECT`文を使用してデータをインポートする例を示します。 + + ```sql + # 3カラムを持つテーブル作成 + CREATE TABLE users_imported + ( + `username` String, + `firstname` String, + `lastname` String + ) + ENGINE = MergeTree + ORDER BY firstname + ``` + + ```response + Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 + + Ok. + + 0 rows in set. Elapsed: 0.233 sec. + ``` + + ```sql + # データのインポート + INSERT INTO users_imported (*) SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users') + ``` + + ```response + Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 + + Ok. + + 0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) + ``` + +## S3を使用してRedshiftからClickHouseへデータをPIVOTする + +このシナリオでは、中間ピボットフォーマットでデータをS3にエクスポートし、次のステップでClickHouseにデータをロードします。 + +RedshitからS3を使用してPIVOT + +### 利点 + +* RedshiftとClickHouseの両方が強力なS3統合機能を持っています。 +* Redshiftの`UNLOAD`コマンドとClickHouse S3テーブル関数/テーブルエンジンのような既存の機能を活用します。 +* ClickHouseでの並列リードとS3との間の高いスループット能力のおかげでシームレスにスケールします。 +* Apache Parquetのような高度で圧縮されたフォーマットを活用できます。 + +### 欠点 + +* プロセスが2ステップになる(Redshiftからアンロードし、その後ClickHouseにロード)。 + +### チュートリアル + +1. Redshiftの[UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html)機能を使用して、既存のプライベートS3バケットにデータをエクスポートします。 + + RedshitからS3へのUNLOAD + + これにより、S3には生データを含むパートファイルが生成されます。 + + S3内のデータ + +2. ClickHouseでテーブルを作成します。 + + ```sql + CREATE TABLE users + ( + username String, + firstname String, + lastname String + ) + ENGINE = MergeTree + ORDER BY username + ``` + + あるいは、ClickHouseは`CREATE TABLE ... EMPTY AS SELECT`を使用してテーブル構造を推測しようとすることもできます。 + + ```sql + CREATE TABLE users + ENGINE = MergeTree ORDER BY username + EMPTY AS + SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + これは特に、Parquetのようにデータ型に関する情報を含むフォーマットでデータがある場合にうまく機能します。 + +3. `INSERT INTO ... SELECT`ステートメントを使用して、ClickHouseにS3ファイルをロードします。 + ```sql + INSERT INTO users SELECT * + FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + ```response + Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 + + Ok. + + 0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) + ``` + +:::note +この例では、ピボットフォーマットとしてCSVを使用しました。しかし、本番環境のワークロードの場合、大規模な移行に適した選択肢として、Apache Parquetを推奨します。Parquetは圧縮を伴い、ストレージコストを削減し、転送時間を短縮することができます(デフォルトでは、各ロウグループはSNAPPYを使用して圧縮されています)。ClickHouseはまた、データのインジェストを高速化するためにParquetの列指向を活用しています。 +::: diff --git a/docs/ja/integrations/data-ingestion/s3-minio.md b/docs/ja/integrations/data-ingestion/s3-minio.md new file mode 100644 index 00000000000..fc3a3fd5f2d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3-minio.md @@ -0,0 +1,45 @@ +--- +sidebar_label: MinIO の使用 +sidebar_position: 6 +slug: /ja/integrations/minio +description: MinIO の使用 +--- + +# MinIO の使用 + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +すべての S3 機能とテーブルは [MinIO](https://min.io/) と互換性があります。特にネットワークのローカリティが最適な場合、セルフマネージドの MinIO ストアでは優れたスループットが得られることがあります。 + +また、バックエンドの MergeTree 構成も一部の構成を微調整することで互換性があります: + +```xml + + + ... + + + s3 + https://min.io/tables// + your_access_key_id + your_secret_access_key + + /var/lib/clickhouse/disks/s3/ + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + ... + + +``` + +:::tip +エンドポイントタグの二重スラッシュに注目してください。これはバケットルートを指定するために必要です。 +::: diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png new file mode 100644 index 00000000000..3ec80580181 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png new file mode 100644 index 00000000000..ca321eca8ec Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png new file mode 100644 index 00000000000..a616c48610f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png new file mode 100644 index 00000000000..760a7ff667b Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png new file mode 100644 index 00000000000..c24df729b46 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png new file mode 100644 index 00000000000..3c702b62b52 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png new file mode 100644 index 00000000000..bed731ea198 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png new file mode 100644 index 00000000000..4bcc4df39e7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png new file mode 100644 index 00000000000..863861c84a2 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png new file mode 100644 index 00000000000..9bbb890b376 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png new file mode 100644 index 00000000000..87bc2013c99 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png new file mode 100644 index 00000000000..c0c063be597 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png new file mode 100644 index 00000000000..e2513f32a87 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png new file mode 100644 index 00000000000..7a2a856665f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png new file mode 100644 index 00000000000..85da020506f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/bucket1.png b/docs/ja/integrations/data-ingestion/s3/images/bucket1.png new file mode 100644 index 00000000000..67e0dd22b0f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/bucket1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/bucket2.png b/docs/ja/integrations/data-ingestion/s3/images/bucket2.png new file mode 100644 index 00000000000..c8a210b033b Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/bucket2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png b/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png new file mode 100644 index 00000000000..f2d720147b8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png b/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png new file mode 100644 index 00000000000..815e33c056a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png b/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png new file mode 100644 index 00000000000..09d0da45cb6 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/merges.png b/docs/ja/integrations/data-ingestion/s3/images/merges.png new file mode 100644 index 00000000000..6a5e5f003c6 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/merges.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/mergetree.png b/docs/ja/integrations/data-ingestion/s3/images/mergetree.png new file mode 100644 index 00000000000..f48964b14d7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/mergetree.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/pull.png b/docs/ja/integrations/data-ingestion/s3/images/pull.png new file mode 100644 index 00000000000..196c029e757 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/pull.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png b/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png new file mode 100644 index 00000000000..d36c9a08446 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3-j.png b/docs/ja/integrations/data-ingestion/s3/images/s3-j.png new file mode 100644 index 00000000000..a0249e7a80e Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3-j.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png b/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png new file mode 100644 index 00000000000..5cfcf2d8856 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3_01.png b/docs/ja/integrations/data-ingestion/s3/images/s3_01.png new file mode 100644 index 00000000000..6698407e9cb Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3_01.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/index.md b/docs/ja/integrations/data-ingestion/s3/index.md new file mode 100644 index 00000000000..7b1a2a6298d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3/index.md @@ -0,0 +1,1246 @@ +--- +slug: /ja/integrations/s3 +sidebar_position: 1 +sidebar_label: S3とClickHouseの統合 + +--- +import BucketDetails from '@site/docs/ja/_snippets/_S3_authentication_and_bucket.md'; + +# S3とClickHouseの統合 + +S3からClickHouseにデータを挿入したり、S3をエクスポート先として使用したりできます。これにより「データレイク」アーキテクチャとの相互作用が可能になります。さらに、S3は「コールド」ストレージ階層を提供し、ストレージとコンピュートの分離を支援できます。以下のセクションでは、ニューヨーク市のタクシーデータセットを使用して、S3とClickHouse間でデータを移動するプロセスを示し、主要な構成パラメータを特定し、パフォーマンスを最適化するためのヒントを提供します。 + +## S3テーブル関数 + +`s3`テーブル関数を使用すると、S3互換ストレージからファイルを読み取ったり、ファイルを書き込んだりできます。構文の概要は次のとおりです: + +```sql +s3(path, [aws_access_key_id, aws_secret_access_key,] [format, [structure, [compression]]]) +``` + +ここで: + +* path — ファイルのパスを含むバケットURL。このURLは、読み取り専用モードで次のワイルドカードに対応します:`*`、`?`、`{abc,def}`、`{N..M}`(ここで`N`と`M`は数字、`'abc'`と`'def'`は文字列です)。詳細は、[パスでのワイルドカード使用に関するドキュメント](/docs/ja/engines/table-engines/integrations/s3/#wildcards-in-path)を参照してください。 +* format — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* structure — テーブルの構造。形式は`'column1_name column1_type, column2_name column2_type, ...'`。 +* compression — パラメータはオプションです。サポートされる値は`none`、`gzip/gz`、`brotli/br`、`xz/LZMA`、`zstd/zst`です。デフォルトでは、ファイル拡張子によって圧縮を自動検出します。 + +パス式にワイルドカードを使用することで、複数のファイルを参照し、並列処理の可能性を開きます。 + +### 準備 + +S3ベースのデータセットと相互作用するために、標準の`MergeTree`テーブルを作成し、宛先とします。以下のステートメントでは、デフォルトデータベースに`trips`という名前のテーブルを作成します: + +```sql +CREATE TABLE trips +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime +SETTINGS index_granularity = 8192 +``` + +`pickup_date`フィールドで[パーティショニング](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md/#custom-partitioning-key)を使用しています。通常、パーティションキーはデータ管理のためですが、後でこのキーを利用してS3への書き込みを並列化します。 + +私たちのタクシーデータセットの各エントリは、タクシーの旅を含んでいます。この匿名化されたデータは、約20MのレコードでS3バケットhttps://datasets-documentation.s3.eu-west-3.amazonaws.com/のフォルダ**nyc-taxi**に圧縮されています。データはTSV形式で、ファイルごとに約1Mの行が含まれています。 + +### S3からのデータ読み取り + +ClickHouseに保持することなく、S3データをソースとしてクエリできます。以下のクエリでは、10行をサンプルします。このバケットへのアクセスは公開されているため、ここでは認証情報が不要です: + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') +LIMIT 10; +``` + +`TabSeparatedWithNames`形式では、最初の行にカラム名が含まれているため、カラムを列挙する必要はありません。`CSV`や`TSV`などの他の形式では、自動生成されたカラム(例:`c1`、`c2`、`c3`など)がこのクエリに対して返されます。 + +クエリはまた、バケットパスとファイル名に関する情報を提供する[仮想カラム](../sql-reference/table-functions/s3#virtual-columns)(`_path`や`_file`など)をサポートしています。例えば: + +```sql +SELECT _path, _file, trip_id +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', 'TabSeparatedWithNames') +LIMIT 5; +``` + +```response +┌─_path──────────────────────────────────────┬─_file──────┬────trip_id─┐ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999902 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999919 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999944 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999969 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999990 │ +└────────────────────────────────────────────┴────────────┴────────────┘ +``` + +このサンプルデータセットの行数を確認します。ワイルドカードを使用してファイルの拡張を行うため、全ての20ファイルを考慮します。このクエリは、ClickHouseインスタンスのコア数によっては約10秒間かかります: + +```sql +SELECT count() AS count +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames'); +``` + +```response +┌────count─┐ +│ 20000000 │ +└──────────┘ +``` + +データをサンプリングしたり、アドホックかつ探索的なクエリを実行するには便利ですが、S3から直接データを読み取るのは定期的に行うことではありません。本格的に取り組むときは、データをClickHouseの`MergeTree`テーブルにインポートします。 + +### clickhouse-localの使用 + +`clickhouse-local`プログラムを使用すると、ClickHouseサーバーをデプロイおよび構成することなく、ローカルファイルに対して高速処理を実行できます。`s3`テーブル関数を使用する任意のクエリは、このユーティリティを使用して実行できます。例えば: + +```sql +clickhouse-local --query "SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') LIMIT 10" +``` + +### S3からのデータ挿入 + +ClickHouseの完全な機能を活用するために、次にデータを読み取り、インスタンスに挿入します。`s3`関数と単純な`INSERT`文を組み合わせてこれを実現します。ターゲットテーブルに必要な構造が提供されているため、カラムを列挙する必要はありません。この場合、カラムはテーブルDDL文で指定された順序で出現する必要があります:カラムは`SELECT`句での位置に基づいてマッピングされます。すべての1,000万行の挿入は、ClickHouseインスタンスに応じて数分かかることがあります。以下では、1,000,000行を挿入して迅速な応答を確保しています。必要に応じて`LIMIT`句やカラム選択を調整して、部分集合をインポートします: + +```sql +INSERT INTO trips + SELECT * + FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') + LIMIT 1000000; +``` + +### ClickHouseローカルを使用したリモート挿入 + +ネットワークセキュリティポリシーによりClickHouseクラスタからの外部接続が制限されている場合、`clickhouse-local`を使用してS3データを挿入することが可能です。以下の例では、S3バケットから読み取り、`remote`関数を使用してClickHouseに挿入します: + +```sql +clickhouse-local --query "INSERT INTO TABLE FUNCTION remote('localhost:9000', 'default.trips', 'username', 'password') (*) SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') LIMIT 10" +``` + +:::note +SSL接続でこれを実行するには、`remoteSecure`関数を利用してください。 +::: + +### データのエクスポート + +`s3`テーブル関数を使用して、S3にファイルを書き込むことができます。これには適切な権限が必要です。リクエストで必要な資格情報を渡しますが、他のオプションについては[資格情報の管理](#managing-credentials)ページを参照してください。 + +以下の単純な例では、ソースではなく宛先としてテーブル関数を使用します。ここで、`trips`テーブルから10,000行をS3バケットに流し込み、`lz4`圧縮と`CSV`の出力形式を指定します: + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) +SELECT * +FROM trips +LIMIT 10000; +``` + +ここでは、ファイルの形式が拡張子から推測されることに注意してください。また、`s3`関数内で列を指定する必要はありません - `SELECT`から推測できます。 + +### 大規模ファイルの分割 + +データを単一のファイルとしてエクスポートすることはあまり望ましくありません。ClickHouseを含むほとんどのツールは、並列処理の可能性があるため、複数のファイルに対する読み取りや書き込みでより高いスループットパフォーマンスを達成します。`INSERT`コマンドを複数回実行し、データのサブセットをターゲットにすることができます。ClickHouseは、`パーティション`キーを使用してファイルを自動的に分割する手段を提供します。 + +以下の例では、`rand()`関数の剰余を使用して10個のファイルを作成します。結果のパーティションIDがファイル名で参照されることに注目してください。これにより、数値サフィックスが付いた10個のファイルが作成されます。例:`trips_0.csv.lz4`、`trips_1.csv.lz4`など...: + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips_{_partition_id}.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) + PARTITION BY rand() % 10 +SELECT * +FROM trips +LIMIT 100000; +``` + +または、データのフィールドを参照することもできます。このデータセットでは、`payment_type`が5のカードのナチュラルなパーティションキーを提供します。 + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips_{_partition_id}.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) + PARTITION BY payment_type +SELECT * +FROM trips +LIMIT 100000; +``` + +### クラスターの利用 + +上記の関数はすべて単一ノードでの実行に制限されています。読み取り速度はCPUコアにリニアにスケールするため、他のリソース(通常はネットワーク)が飽和するまで縦方向にスケールできます。しかし、このアプローチには限界があります。`INSERT INTO SELECT`クエリを実行するときに分散テーブルに挿入することで、いくつかのリソースプレッシャーを軽減することができますが、データの読み取り、解析、処理を行うノードが単一のままです。この課題に対処し、読み取りを水平にスケールするために、[s3Cluster](/docs/ja/sql-reference/table-functions/s3Cluster.md)関数があります。 + +クエリを受信したノード(イニシエーターとして知られています)は、クラスタ内のすべてのノードとの接続を作成します。ファイルを読み取る必要があるかを決定するglobパターンが、一連のファイルに解決されます。イニシエーターはファイルをクラスタ内のノードに配布し、これらのノードはワーカーとして機能します。これらのワーカーは、読み取りが完了したら処理するファイルを要求します。このプロセスにより、読み取りを水平にスケールできるようになります。 + +`s3Cluster`関数は、単一ノードバリアントと同じ形式をとりますが、ワーカーノードを示すターゲットクラスタが必要です: + +``` +s3Cluster(cluster_name, source, [access_key_id, secret_access_key,] format, structure) +``` + +* `cluster_name` — リモートおよびローカルサーバーへのアドレスと接続パラメータのセットを構築するために使用されるクラスタの名前。 +* `source` — ファイルまたは一連のファイルへのURL。読み取り専用モードで以下のワイルドカードをサポートします:*, ?, {'abc','def'} 及び {N..M}、N, M — 数字、abc, def — 文字列。詳細は[ワイルドカード使用のドキュメント](/docs/ja/engines/table-engines/integrations/s3.md/#wildcards-in-path)を参照してください。 +* `access_key_id`及び`secret_access_key` — 指定されたエンドポイントで使用する資格情報を指定します。オプションです。 +* `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* `structure` — テーブルの構造。形式は'column1_name column1_type, column2_name column2_type, ...'です。 + +`s3`関数のように、バケットがセキュアではない、またはIAMロールを通じてセキュリティを定義している場合は、資格情報はオプションです。しかし、`s3Cluster`関数の場合、22.3.1ではリクエストに構造を指定する必要があります、つまりスキーマは推測されません。 + +この関数は、多くの場合、`INSERT INTO SELECT`の一部として使用されます。この場合、分散テーブルに挿入することが多いです。以下の簡単な例を示します。ここで`trips_all`は分散テーブルです。このテーブルがイベントクラスタを使用している間、読み取りと書き込みに使用されるノードの一貫性は要件ではありません: + +```sql +INSERT INTO default.trips_all + SELECT * + FROM s3Cluster( + 'events', + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', + 'TabSeparatedWithNames' + ) +``` + +挿入はイニシエーターノードに対して行われます。つまり、読み取りは各ノードで行われますが、結果の行はイニシエーターにルーティングされ、分配されます。高スループットのシナリオでは、これがボトルネックとなる可能性があります。これに対処するために、`s3Cluster`関数のパラメータ[parallel_distributed_insert_select](/docs/ja/operations/settings/settings/#parallel_distributed_insert_select)を設定します。 + +## S3テーブルエンジン + +`s3`関数は、S3に保存されたデータに対するアドホッククエリを可能にしますが、文法的に冗長です。`S3`テーブルエンジンを使用すると、バケットURLと資格情報を繰り返し指定する必要がありません。これを解決するために、ClickHouseはS3テーブルエンジンを提供します。 + +```sql +CREATE TABLE s3_engine_table (name String, value UInt32) + ENGINE = S3(path, [aws_access_key_id, aws_secret_access_key,] format, [compression]) + [SETTINGS ...] +``` + +* `path` — バケットURLとファイルパス。読み取り専用モードで以下のワイルドカードをサポートします:*, ?, {abc,def}、{N..M}(N, M — 数字、'abc', 'def' — 文字列)。詳細は[ここ](/docs/ja/engines/table-engines/integrations/s3#wildcards-in-path)を参照してください。 +* `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* `aws_access_key_id`、`aws_secret_access_key` - AWSアカウントユーザー用の長期的な資格情報。これを使用してリクエストに認証できます。パラメータはオプションです。資格情報が指定されていない場合、構成ファイルの値が使用されます。詳細は、[資格情報の管理](#managing-credentials)を参照してください。 +* `compression` — 圧縮タイプ。サポートされている値は、none、gzip/gz、brotli/br、xz/LZMA、zstd/zstです。パラメータはオプションです。デフォルトでは、ファイル拡張子により圧縮を自動検出します。 + +### データの読み取り + +以下の例では、`https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/`バケットにある最初の10個のTSVファイルを使用して`trips_raw`という名前のテーブルを作成します。それぞれのファイルには1M行が含まれています: + +```sql +CREATE TABLE trips_raw +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type_` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` FixedString(7), + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` FixedString(7), + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String、 + `dropoff_puma` UInt16 +) ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{0..9}.gz', 'TabSeparatedWithNames', 'gzip'); +``` + +{0..9}パターンを使用して最初の10個のファイルに限定している点に注目してください。作成後は、他のテーブルと同様にこのテーブルをクエリできます: + +```sql +SELECT DISTINCT(pickup_ntaname) +FROM trips_raw +LIMIT 10; +``` + +```response +┌─pickup_ntaname───────────────────────────────────┐ +│ Lenox Hill-Roosevelt Island │ +│ Airport │ +│ SoHo-TriBeCa-Civic Center-Little Italy │ +│ West Village │ +│ Chinatown │ +│ Hudson Yards-Chelsea-Flatiron-Union Square │ +│ Turtle Bay-East Midtown │ +│ Upper West Side │ +│ Murray Hill-Kips Bay │ +│ DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill │ +└──────────────────────────────────────────────────┘ +``` + +### データの挿入 + +`S3`テーブルエンジンは並列読み取りをサポートしています。書き込みは、テーブル定義にグロブパターンが含まれていない場合にのみサポートされます。したがって、上記のテーブルでは書込みはブロックされます。 + +書き込みを示すために、書き込み可能なS3バケットを指すテーブルを作成します: + +```sql +CREATE TABLE trips_dest +( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `tip_amount` Float32, + `total_amount` Float32 +) ENGINE = S3('/trips.bin', 'Native'); +``` + +```sql +INSERT INTO trips_dest + SELECT + trip_id, + pickup_date, + pickup_datetime, + dropoff_datetime, + tip_amount, + total_amount + FROM trips + LIMIT 10; +``` + +```sql +SELECT * FROM trips_dest LIMIT 5; +``` + +```response +┌────trip_id─┬─pickup_date─┬─────pickup_datetime─┬────dropoff_datetime─┬─tip_amount─┬─total_amount─┐ +│ 1200018648 │ 2015-07-01 │ 2015-07-01 00:00:16 │ 2015-07-01 00:02:57 │ 0 │ 7.3 │ +│ 1201452450 │ 2015-07-01 │ 2015-07-01 00:00:20 │ 2015-07-01 00:11:07 │ 1.96 │ 11.76 │ +│ 1202368372 │ 2015-07-01 │ 2015-07-01 00:00:40 │ 2015-07-01 00:05:46 │ 0 │ 7.3 │ +│ 1200831168 │ 2015-07-01 │ 2015-07-01 00:01:06 │ 2015-07-01 00:09:23 │ 2 │ 12.3 │ +│ 1201362116 │ 2015-07-01 │ 2015-07-01 00:01:07 │ 2015-07-01 00:03:31 │ 0 │ 5.3 │ +└────────────┴─────────────┴─────────────────────┴─────────────────────┴────────────┴──────────────┘ +``` + +行は新しいファイルにのみ挿入できます。マージサイクルやファイル分割操作はありません。一度書き込まれたファイルは、後続の挿入が失敗します。ユーザーには2つのオプションがあります: + +* 設定` s3_create_new_file_on_insert=1`を指定します。これにより、各挿入時に新しいファイルが作成されます。数値サフィックスがファイルの末尾に付加され、各挿入操作で単調に増加します。上記の例では、後続の挿入はtrips_1.binファイルの作成を引き起こすでしょう。 +* 設定`s3_truncate_on_insert=1`を指定します。これにより、ファイルが切り詰められ、完了後に新しく挿入された行のみが含まれます。 + +これらの設定はデフォルトで0に設定されており、いずれかを設定するようにしています。`s3_truncate_on_insert`が設定されている場合、優先されます。 + +`S3`テーブルエンジンに関するノート: + +- 伝統的な`MergeTree`ファミリーテーブルとは異なり、`S3`テーブルを削除することは、基になるデータを削除しません。 +- このテーブルタイプの完全な設定は[ここ](/docs/ja/engines/table-engines/integrations/s3.md/#settings)で見つけられます。 +- このエンジンを使用する際には、以下の注意点があります: + * ALTERクエリはサポートされていません + * サンプル操作はサポートされていません + * プライマリまたはスキップのインデックスの概念はありません。 + +## 資格情報の管理 + +前の例では、`s3`関数または`S3`テーブル定義で資格情報を渡しましたが、これは時折の使用には許容できますが、ユーザーはプロダクションでのより明示的でない認証メカニズムが求められます。これに対応して、ClickHouseは数つのオプションを提供します: + +* 接続の詳細を**config.xml**または**conf.d**下の同等の構成ファイルに指定します。デビアンパッケージを使用してインストールした場合の例ファイルの内容を以下に示します。 + + ```xml + ubuntu@single-node-clickhouse:/etc/clickhouse-server/config.d$ cat s3.xml + + + + https://dalem-files.s3.amazonaws.com/test/ + key + secret + + + + + + ``` + + これらの資格情報は、上記のエンドポイントが要求されたURLに対する完全なプレフィックス一致であるリクエストの場合に使用されます。また、例ではアクセストークンとしてのオルタナティブとしてアクセスキーとシークレットキーの代わりに、認証ヘッダーを宣言する能力があることに注意してください。サポートされている設定の完全なリストは[ここ](/docs/ja/engines/table-engines/integrations/s3.md/#settings)で見つけられます。 + +* 上記の例では、構成パラメータ`use_environment_credentials`の利用可能性を強調しています。この構成パラメータは、`s3`レベルでグローバルに設定することもできます: + + ```xml + + + true + + + ``` + + この設定は、環境からS3資格情報を取得しようとすることを許可するため、IAMロールを通じてアクセスを許可します。具体的には、次の順序での取得が実行されます: + + * 環境変数`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`および`AWS_SESSION_TOKEN`の検索。 + * **$HOME/.aws**でのチェック実施。 + * AWSセキュリティトークンサービスを通じた一時的な資格情報の取得 - すなわち [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) APIを通じて。 + * ECS環境変数`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`または`AWS_CONTAINER_CREDENTIALS_FULL_URI`と`AWS_ECS_CONTAINER_AUTHORIZATION_TOKEN`での資格情報のチェック。 + * [Amazon EC2インスタンスメタデータ](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-metadata.html)を通じた資格情報の取得、ただし[AWS_EC2_METADATA_DISABLED](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html#envvars-list-AWS_EC2_METADATA_DISABLED)がtrueに設定されていない場合。 + * これらの設定は、プレフィックス一致ルールを使用して、特定のエンドポイント用に設定することもできます。 + +## パフォーマンス最適化 {#s3-optimizing-performance} + +S3関数を使用した読み取りおよび挿入を最適化する方法については、[専用のパフォーマンスガイド](./performance.md)を参照してください。 + +### S3ストレージのチューニング + +内部的に、ClickHouseのMergeTreeは、[`Wide`と`Compact`](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)という2つの主なストレージ形式を使用します。現在の実装は、(`min_bytes_for_wide_part`および`min_rows_for_wide_part`の設定により制御される)ClickHouseのデフォルトの動作を使用していますが、将来のリリースではS3の動作が変わることが予測されます。例えば、より大きなデフォルト値が設定され`Compact`フォーマットを推奨し、それによりファイルが少なくなることがあります。現在、S3ストレージを専用に使用している場合、ユーザーはこれらの設定を調整することを検討することができます。 + +## S3バックドMergeTree + +`s3`関数と関連するテーブルエンジンを使用すると、ClickHouseの親しみやすい構文を使用してS3データをクエリすることができます。ただし、データ管理機能とパフォーマンスに関しては、制限があります。プライマリインデックスのサポートがない、キャッシュサポートがない、ファイルの挿入はユーザーが管理する必要があります。 + +ClickHouseは、S3が特にクエリパフォーマンスが重要でない「コールド」データのストレージソリューションとして魅力的であることを認識しており、ユーザーがストレージとコンピュートを分離したいと考えています。これを達成するために、S3をMergeTreeエンジンのストレージとして使用するサポートが提供されています。これにより、ユーザーはS3のスケーラビリティとコストメリット、そしてMergeTreeエンジンの挿入およびクエリパフォーマンスを活用できるようになります。 + +### ストレージ階層 + +ClickHouseストレージボリュームは、物理ディスクをMergeTreeテーブルエンジンから抽象化することができます。任意の単一のボリュームは、ディスクの順序付けされたセットで構成されることができます。これにより、データストレージに複数のブロックデバイスを使用する可能性があるだけでなく、S3などの他のストレージタイプも使用可能です。ClickHouseデータパーツは、ストレージポリシーに従ってボリューム間で移動およびフィルレートされることができ、ストレージ階層の概念が作成されます。 + +ストレージ階層アンロックは、通常、最も新しいデータが最もクエリされる必要があり、高性能なストレージ、例えばNVMe SSD上でのみ小量のスペースを要求するホット-コールドアーキテクチャを解放します。データが古くなるにつれて、クエリ時間のSLAが増加し、クエリの頻度が減少します。このデータのファットテールは、HDDやS3などのオブジェクトストレージのような、パフォーマンスの低いストレージに格納されることができます。 + +### ディスクの作成 + +S3バケットをディスクとして利用するために、まずClickHouse構成ファイル内で宣言する必要があります。config.xmlを拡張するか、またはpreferでplugin.dに新しいファイルを提供します。以下に示す例はS3ディスク宣言の例です: + +```xml + + + ... + + + s3 + https://sample-bucket.s3.us-east-2.amazonaws.com/tables/ + your_access_key_id + your_secret_access_key + + /var/lib/clickhouse/disks/s3/ + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + ... + + +``` + +このディスク宣言に関連する設定の完全なリストは[ここ](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)で見つけられます。資格情報は、[資格情報の管理](#managing-credentials)で説明された同じアプローチを使用してここで管理できます。たとえば、上記の設定ブロックで`use_environment_credentials`をtrueに設定してIAMロールを使用することができます。 + +### ストレージポリシーの作成 + +設定が完了すると、この「ディスク」はポリシーで宣言されたストレージボリュームで使用できます。以下の例では、S3が唯一のストレージであると仮定しています。これは、データがTTLやフィルレートに基づいて移動される可能性のあるより複雑なホット-コールドアーキテクチャを無視します。 + +```xml + + + + + ... + + + ... + + + + + +
+ s3 +
+
+
+
+
+
+``` + +### テーブルの作成 + +ディスクをwriteアクセスのあるバケットに設定していると仮定すると、以下の例のようにテーブルを作成できます。簡潔にするために、NYCタクシーのカラムの一部を使用し、データを直接S3バックドテーブルにストリームします: + +```sql +CREATE TABLE trips_s3 +( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `tip_amount` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4) +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime +SETTINGS index_granularity = 8192, storage_policy='s3_main' +``` + +```sql +INSERT INTO trips_s3 SELECT trip_id, pickup_date, pickup_datetime, dropoff_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tip_amount, total_amount, payment_type FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000; +``` +ハードウェアによりますが、1百万行の挿入は実行に数分かかる場合があります。進捗は `system.processes` テーブルで確認できます。行数を1千万まで増やし、一部のサンプルクエリを試してみてください。 + +```sql +SELECT passenger_count, avg(tip_amount) as avg_tip, avg(total_amount) as avg_amount FROM trips_s3 GROUP BY passenger_count; +``` + +### テーブルの変更 + +特定のテーブルのストレージポリシーを変更する必要がある場合もあります。これは可能ですが、制限があります。新しいターゲットポリシーは、前のポリシーのすべてのディスクとボリュームを含んでいる必要があります。つまり、ポリシー変更を満たすためにデータは移行されません。これらの制約を検証する際、ボリュームとディスクはその名前によって識別され、違反しようとするとエラーが発生します。しかし、以前の例を使用する場合、以下の変更は有効です。 + +```xml + + + +
+ s3 +
+
+
+ + + + default + +
+ s3 +
+
+ 0.2 +
+
+``` + +```sql +ALTER TABLE trips_s3 MODIFY SETTING storage_policy='s3_tiered' +``` + +ここでは新しい `s3_tiered` ポリシーに既存のメインボリュームを再利用し、新しいホットボリュームを導入します。これは、パラメータ `` を通じて設定された1つのディスクだけで構成されたデフォルトディスクを使用します。ボリューム名およびディスクは変更されないことに注意してください。新しい挿入はデフォルトディスクに配置され、これが move_factor * disk_size に達すると、データは S3 に移動されます。 + +### レプリケーションの取り扱い + +S3ディスクを使用したレプリケーションは、`ReplicatedMergeTree` テーブルエンジンを使用して実現できます。[S3オブジェクトストレージを使用して2つのAWSリージョンで単一シャードをレプリケートする](#s3-multi-region)ガイドを参照してください。 + +### 読み取りと書き込み + +以下のノートでは、ClickHouseとS3間のインタラクションの実装をカバーしています。通常は情報提供のみですが、[パフォーマンスの最適化](#s3-optimizing-performance)に役立つかもしれません: + +* デフォルトでは、クエリ処理パイプラインの任意のステージで使用される最大クエリ処理スレッド数はコア数と等しいです。あるステージは他よりも並列化が容易なため、この値は上限を提供します。データがディスクからストリーミングされるため、複数のクエリステージが一度に実行されることがあり、クエリに使用されるスレッドの正確な数はこれを超える場合があります。設定 [max_threads](/docs/ja/operations/settings/settings.md/#settings-max_threads) を変更して調整できます。 +* S3の読み取りはデフォルトで非同期です。この動作は `remote_filesystem_read_method` 設定によって決まります。デフォルト値は `threadpool` です。リクエストに応じて、ClickHouseはストライプでグラニュールを読み取ります。各ストライプは多数のカラムを含む可能性があります。スレッドはグラニュールに対してカラムを一つずつ読み込みます。これを同期的に行う代わりに、データの待機前にすべてのカラムをプリフェッチします。これは各カラムでの同期待機に比べて大幅なパフォーマンス向上をもたらします。ほとんどの場合、この設定を変更する必要はありません。[パフォーマンスの最適化](#s3-optimizing-performance)を参照してください。 +* s3関数とテーブルの場合、並列ダウンロードは `max_download_threads` と `max_download_buffer_size` の値によって決定されます。ファイルが全スレッドを通じた合計バッファサイズより大きい場合のみ並列でダウンロードされます。これはバージョン > 22.3.1 でのみ利用可能です。 +* 書き込みは並列で実行され、最大100の同時ファイル書き込みスレッドがあります。`max_insert_delayed_streams_for_parallel_write` はデフォルト値1000で、並列で書き込まれるS3ブロブの数を制御します。書き込まれる各ファイルに対してバッファが必要なため(約1MB)、この値を低メモリシナリオで低く設定するのが適切な場合があります。 + +## S3オブジェクトストレージをClickHouseディスクとして使用する {#configuring-s3-for-clickhouse-use} + +バケットとIAMロールを作成するためのステップバイステップの指示が必要な場合は、**Create S3 buckets and an IAM role**を展開して指示に従ってください。 + + + +### ClickHouseをS3バケットをディスクとして使用するように設定 +以下の例は、サービスとしてインストールされたLinux Debパッケージに基づくデフォルトのClickHouseディレクトリを使用します。 + +1. ClickHouseの`config.d`ディレクトリに、新しいストレージ設定を格納するファイルを作成します。 +```bash +vim /etc/clickhouse-server/config.d/storage_config.xml +``` +2. 次のストレージ設定を追加します。先に取得したバケットパス、アクセスキーおよびシークレットキーを使用してください。 +```xml + + + + + s3 + https://mars-doc-test.s3.amazonaws.com/clickhouse3/ + ABC123 + Abc+123 + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` + +:::note +``タグ内の`s3_disk`および`s3_cache`タグは任意のラベルです。他のラベルに設定できますが、同じラベルを``タグの下の``タグに使用してディスクを参照する必要があります。 +``タグも任意であり、ClickHouseでリソースを作成する際の識別ストレージターゲットとして使用されるポリシー名です。 + +上記の設定はClickHouseバージョン22.8以降のものです。古いバージョンを使用している場合は[データの保存](docs/ja/operations/storing-data.md/#using-local-cache)ドキュメントを参照してください。 + +S3の使用に関する詳細は以下を参照してください: +統合ガイド:[S3バックドMergeTree](#s3-backed-mergetree) +::: + +3. ファイルの所有者を`clickhouse`ユーザーとグループに更新します +```bash +chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml +``` +4. 変更が反映されるようにClickHouseインスタンスを再起動 +```bash +service clickhouse-server restart +``` + +### テスト +1. ClickHouseクライアントでログインします。以下のように行います。 +```bash +clickhouse-client --user default --password ClickHouse123! +``` +2. 新しいS3ストレージポリシーを指定してテーブルを作成します +```sql +CREATE TABLE s3_table1 + ( + `id` UInt64, + `column1` String + ) + ENGINE = MergeTree + ORDER BY id + SETTINGS storage_policy = 's3_main'; +``` + +3. 正しいポリシーでテーブルが作成されたことを確認します +```sql +SHOW CREATE TABLE s3_table1; +``` +```response +┌─statement──────────────────────────────────────────────────── +│ CREATE TABLE default.s3_table1 +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main', index_granularity = 8192 +└────────────────────────────────────────────────────────────── +``` + +4. テスト行をテーブルに挿入します +```sql +INSERT INTO s3_table1 + (id, column1) + VALUES + (1, 'abc'), + (2, 'xyz'); +``` +```response +INSERT INTO s3_table1 (id, column1) FORMAT Values + +Query id: 0265dd92-3890-4d56-9d12-71d4038b85d5 + +Ok. + +2 rows in set. Elapsed: 0.337 sec. +``` +5. 行を表示します +```sql +SELECT * FROM s3_table1; +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +│ 2 │ xyz │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.284 sec. +``` +6. AWSコンソールでバケットに移動し、新しいバケットとフォルダを選択してください。 +以下のようなものが表示されるはずです: + + ![create_s3_bucket_10](./images/s3-j.png) + +## S3オブジェクトストレージを使用したAWSリージョン間での単一シャードのレプリケート {#s3-multi-region} + +:::tip +オブジェクトストレージはClickHouse Cloudでデフォルトで使用されているため、ClickHouse Cloudを使用している場合、この手順に従う必要はありません。 +::: + +### 展開の計画 +このチュートリアルは、AWS EC2に2つのClickHouseサーバーノードと3つのClickHouse Keeper ノードを展開することを対象としています。ClickHouseサーバーのデータストアはS3です。ディザスタリカバリーをサポートするため、2つのAWSリージョンが使用され、各リージョンにはClickHouseサーバーとS3バケットが配置されます。 + +ClickHouseのテーブルは2つのサーバー間、したがって2つのリージョン間でレプリケートされます。 + +### ソフトウェアのインストール + +#### ClickHouseサーバーノード +ClickHouseサーバーノードでの展開手順を実行する際は、[インストール手順](/docs/ja/getting-started/install.md/#available-installation-options)を参照してください。 + +#### ClickHouseのデプロイ + +ClickHouseを2つのホストにデプロイします。サンプル構成ではこれらは `chnode1`、 `chnode2` と命名されます。 + +`chnode1`を1つのAWSリージョンに、 `chnode2`を別のリージョンに配置します。 + +#### ClickHouse Keeperのデプロイ + +ClickHouse Keeperを3つのホストにデプロイします。サンプル構成では、これらは `keepernode1`、 `keepernode2`、および `keepernode3` と命名されます。`keepernode1`は`chnode1`と同じリージョンに、`keepernode2`は`chnode2`と、`keepernode3`はどちらかのリージョンで異なるアベイラビリティゾーンにデプロイすることができます。 + +ClickHouse Keeperノードでの展開手順を実行する際は、[インストール手順](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper)を参照してください。 + +### S3バケットの作成 + +`chnode1`と`chnode2`を配置した各地域に2つのS3バケットを作成します。 + +バケットとIAMロールを作成するためのステップバイステップの指示が必要な場合は、**Create S3 buckets and an IAM role**を展開して指示に従ってください。 + + + +設定ファイルはその後 `/etc/clickhouse-server/config.d/` に配置されます。一つのバケットのサンプル設定ファイルを以下に示します。他のバケットも類似しており、3行の異なる点があります: + +```xml title="/etc/clickhouse-server/config.d/storage_config.xml" + + + + + s3 + + https://docs-clickhouse-s3.s3.us-east-2.amazonaws.com/clickhouses3/ + ABCDEFGHIJKLMNOPQRST + Tjdm4kf5snfkj303nfljnev79wkjn2l3knr81007 + + /var/lib/clickhouse/disks/s3_disk/ + + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` +:::note +このガイドの手順の多くでは、設定ファイルを `/etc/clickhouse-server/config.d/` に配置するよう求められます。これはLinuxシステムの設定オーバーライドファイルのデフォルトの場所です。このファイルをディレクトリに配置すると、ClickHouseは内容を使用してデフォルトの設定を上書きします。これらのファイルをオーバーライドディレクトリに置くことで、アップグレード中に設定を失うことを防ぐことができます。 +::: + +### ClickHouse Keeperの設定 + +ClickHouse Keeperを単独で(ClickHouseサーバーとは別に)実行する場合、設定は1つのXMLファイルです。このチュートリアルでは、そのファイルを `/etc/clickhouse-keeper/keeper_config.xml` としています。3つのKeeperサーバーは同じ設定を使用しますが、1つの設定だけが異なります;``です。 + +`server_id`は設定ファイルが使用されるホストに割り当てられるIDを示します。以下の例では、`server_id` は `3`であり、ファイルの下部にある`` セクションでは、サーバー3がホスト名`keepernode3`としてあります。これにより、ClickHouse Keeperプロセスはリーダーの選択およびその他のすべての活動時にどの他のサーバーに接続するかを知ります。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + warning + + + + + 1 + keepernode1 + 9234 + + + 2 + keepernode2 + 9234 + + + + 3 + keepernode3 + 9234 + + + + + +``` + +設定ファイルをClickHouse Keeperにコピーして配置します( `` を設定するのを忘れないでください): +```bash +sudo -u clickhouse \ + cp keeper.xml /etc/clickhouse-keeper/keeper.xml +``` + +### ClickHouseサーバーの設定 + +#### クラスターの定義 + +ClickHouseクラスターは、設定の `` セクションで定義されます。このサンプルでは、`cluster_1S_2R`という1つのクラスターが定義されており、それは1つのシャードと2つのレプリカで構成されています。レプリカはホスト `chnode1` と `chnode2` に配置されています。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml" + + + + + + chnode1 + 9000 + + + chnode2 + 9000 + + + + + +``` + +クラスターを使用する際には、クラスター、シャード、レプリカの設定を埋め込むDDLクエリを作成するマクロを定義すると便利です。このサンプルでは、`shard` と `replica` の詳細を提供することなく、レプリケートされたテーブルエンジンを指定することができます。テーブルを作成した際に `system.tables` をクエリすることで、`shard`と`replica`マクロの使用方法を見ることができます。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml" + + + /clickhouse/task_queue/ddl + + + cluster_1S_2R + 1 + replica_1 + + +``` +:::note +このマクロは `chnode1`用です。`chnode2` では `replica` を `replica_2` に設定してください。 +::: + +#### ゼロコピー レプリケーションの無効化 + +ClickHouseバージョン22.7以下では `allow_remote_fs_zero_copy_replication` 設定がデフォルトで `true` に設定されています。このディザスタリカバリーシナリオの場合、この設定は`false` に設定する必要があり、バージョン22.8およびそれ以降ではデフォルトで `false` に設定されています。 + +この設定は 1) この機能がまだプロダクションレディではない、2) ディザスタリカバリーシナリオではデータとメタデータの両方を複数の地域に保存しておく必要がある、という2つの理由から `false` にする必要があります。`allow_remote_fs_zero_copy_replication` を `false` に設定してください。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml" + + + false + + +``` + +ClickHouse Keeper は ClickHouse ノード間のデータレプリケーションを調整します。ClickHouse ノードに ClickHouse Keeper ノードを知らせるために、各 ClickHouse ノードに設定ファイルを追加します。 + +```xml title="/etc/clickhouse-server/config.d/use_keeper.xml" + + + + keepernode1 + 9181 + + + keepernode2 + 9181 + + + keepernode3 + 9181 + + + +``` + +### ネットワークの設定 + +サーバーが通信できるように、またあなたがサーバーと通信できるように、AWSでのセキュリティ設定を行う際は[ネットワークポート](../../../guides/sre/network-ports.md) リストを参照してください。 + +すべてのサーバーは、他のサーバーとの通信とS3との通信を行うためにネットワーク接続をリッスンする必要があります。デフォルトでは、ClickHouseはループバックアドレスでのみリッスンするため、これを変更する必要があります。これは `/etc/clickhouse-server/config.d/` に設定されます。ここにClickHouseとClickHouse KeeperをすべてのIPv4インターフェース上でリッスンするように設定するサンプルを示します。詳細についてはドキュメントあるいはデフォルトの設定ファイル `/etc/clickhouse/config.xml` を参照してください。 + +```xml title="/etc/clickhouse-server/config.d/networking.xml" + + 0.0.0.0 + +``` + +### サーバーの起動 + +#### ClickHouse Keeperの起動 + +各Keeperサーバーで以下のコマンドを実行します: + +```bash +sudo systemctl enable clickhouse-keeper +sudo systemctl start clickhouse-keeper +sudo systemctl status clickhouse-keeper +``` + +#### ClickHouse Keeperの状態を確認 + +ClickHouse Keeperにコマンドを送信するには`netcat`を使用します。例えば、`mntr` はClickHouse Keeperクラスタの状態を返します。各Keeperノードでコマンドを実行すると、1つのノードがリーダーであり、他の2つがフォロワーであることがわかるでしょう: + +```bash +echo mntr | nc localhost 9181 +``` +```response +zk_version v22.7.2.15-stable-f843089624e8dd3ff7927b8a125cf3a7a769c069 +zk_avg_latency 0 +zk_max_latency 11 +zk_min_latency 0 +zk_packets_received 1783 +zk_packets_sent 1783 +# highlight-start +zk_num_alive_connections 2 +zk_outstanding_requests 0 +zk_server_state leader +# highlight-end +zk_znode_count 135 +zk_watch_count 8 +zk_ephemerals_count 3 +zk_approximate_data_size 42533 +zk_key_arena_size 28672 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 182 +zk_max_file_descriptor_count 18446744073709551615 +# highlight-start +zk_followers 2 +zk_synced_followers 2 +# highlight-end +``` + +#### ClickHouseサーバーの起動 + +各ClickHouseサーバーで +``` +sudo service clickhouse-server start +``` + +#### ClickHouseサーバーの確認 + +[クラスター設定](#define-a-cluster)を追加することで、2つのClickHouseノードにレプリケートされた単一のシャードが定義されました。この確認ステップでは、ClickHouseが起動した際にクラスターが構築されたことを確認し、そのクラスターを使用してレプリケートされたテーブルを作成します。 +- クラスターが存在することの確認: + ```sql + show clusters + ``` + ```response + ┌─cluster───────┐ + │ cluster_1S_2R │ + └───────────────┘ + + 1 row in set. Elapsed: 0.009 sec. ` + ``` + +- `ReplicatedMergeTree`テーブルエンジンを使用してテーブルを作成します: + ```sql + create table trips on cluster 'cluster_1S_2R' ( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `tip_amount` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)) + ENGINE = ReplicatedMergeTree + PARTITION BY toYYYYMM(pickup_date) + ORDER BY pickup_datetime + SETTINGS index_granularity = 8192, storage_policy='s3_main' + ``` + ```response + ┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ + │ chnode1 │ 9000 │ 0 │ │ 1 │ 0 │ + │ chnode2 │ 9000 │ 0 │ │ 0 │ 0 │ + └─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + ``` +- 以前に定義したマクロの使用を理解する + + `shard` と `replica` のマクロは[以前に定義しました](#define-a-cluster)が、以下の行で各ClickHouseノード上でそれらの値がどのように置き換えられるかを見ることができます。また、`uuid` という値が使用されます;`uuid` はシステムによって生成されるのでマクロで定義されていません。 + ```sql + SELECT create_table_query + FROM system.tables + WHERE name = 'trips' + FORMAT Vertical + ``` + ```response + Query id: 4d326b66-0402-4c14-9c2f-212bedd282c0 + + Row 1: + ────── + create_table_query: CREATE TABLE default.trips (`trip_id` UInt32, `pickup_date` Date, `pickup_datetime` DateTime, `dropoff_datetime` DateTime, `pickup_longitude` Float64, `pickup_latitude` Float64, `dropoff_longitude` Float64, `dropoff_latitude` Float64, `passenger_count` UInt8, `trip_distance` Float64, `tip_amount` Float32, `total_amount` Float32, `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)) + # highlight-next-line + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') + PARTITION BY toYYYYMM(pickup_date) ORDER BY pickup_datetime SETTINGS index_granularity = 8192, storage_policy = 's3_main' + + 1 row in set. Elapsed: 0.012 sec. + ``` + :::note + 上記で示されている`clickhouse/tables/{uuid}/{shard}` というzookeeperパスをカスタマイズするには、`default_replica_path` および `default_replica_name` を設定できます。ドキュメントは[こちら](/docs/ja/operations/server-configuration-parameters/settings.md/#default_replica_path)です。 + ::: + +### テスト + +これらのテストは、データが2つのサーバー間でレプリケーションされていることと、S3バケットに保存されていることを確認します。 + +- ニューヨーク市タクシーデータセットからデータを追加: + ```sql + INSERT INTO trips + SELECT trip_id, + pickup_date, + pickup_datetime, + dropoff_datetime, + pickup_longitude, + pickup_latitude, + dropoff_longitude, + dropoff_latitude, + passenger_count, + trip_distance, + tip_amount, + total_amount, + payment_type + FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000; + ``` +- データがS3に保存されていることを確認。 + + このクエリはディスク上のデータサイズと使用されるディスクを決定するポリシーを表示します。 + ```sql + SELECT + engine, + data_paths, + metadata_path, + storage_policy, + formatReadableSize(total_bytes) + FROM system.tables + WHERE name = 'trips' + FORMAT Vertical + ``` + ```response + Query id: af7a3d1b-7730-49e0-9314-cc51c4cf053c + + Row 1: + ────── + engine: ReplicatedMergeTree + data_paths: ['/var/lib/clickhouse/disks/s3_disk/store/551/551a859d-ec2d-4512-9554-3a4e60782853/'] + metadata_path: /var/lib/clickhouse/store/e18/e18d3538-4c43-43d9-b083-4d8e0f390cf7/trips.sql + storage_policy: s3_main + formatReadableSize(total_bytes): 36.42 MiB + + 1 row in set. Elapsed: 0.009 sec. + ``` + + ローカルディスク上のデータサイズを確認します。上記の通り、ローカルディスク上の数百万行データのサイズは36.42 MiBです。これはS3上にあり、ローカルディスクにはないはずです。上記のクエリはまたローカルディスク上にデータおよびメタデータがどこに保存されているかを示しています。ローカルデータをチェックしてください: + ```response + root@chnode1:~# du -sh /var/lib/clickhouse/disks/s3_disk/store/551 + 536K /var/lib/clickhouse/disks/s3_disk/store/551 + ``` + + 各S3バケットのデータサイズを確認します(総量は表示されていませんが、挿入後にはどちらのバケットも約36 MiBを格納しています): + + ![最初のS3バケット内のサイズ](./images/bucket1.png) + + ![第二のS3バケット内のサイズ](./images/bucket2.png) + +## S3Express + +[S3Express](https://aws.amazon.com/s3/storage-classes/express-one-zone/) はAmazon S3の新しい高性能な単一アベイラビリティゾーンストレージクラスです。 + +ClickHouseでS3Expressをテストした経験については、この[ブログ](https://aws.amazon.com/blogs/storage/clickhouse-cloud-amazon-s3-express-one-zone-making-a-blazing-fast-analytical-database-even-faster/) を参照できます。 + +:::note +S3Expressは単一AZ内にデータを保存します。したがって、AZ が停止した場合にはデータが利用できなくなります。 +::: + +### S3ディスク + +S3Expressバケットをバックアップとするストレージでテーブルを作成するには、以下の手順が必要です: + +1. `Directory`タイプのバケットを作成 +2. 必要なすべての権限をS3ユーザーに付与する適切なバケットポリシーのインストール(例:`"Action": "s3express:*"` を使用して無制限のアクセスを許可) +3. ストレージポリシーを設定する際に`region`パラメータを指定 + +ストレージ設定は通常のS3と同様で、例としては次のようになります: + +``` xml + + + + s3 + https://my-test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com/store/ + eu-north-1 + ... + ... + + + + + +
+ s3_express +
+
+
+
+
+``` + +そして、新しいストレージでテーブルを作成します: + +``` sql +CREATE TABLE t +( + a UInt64, + s String +) +ENGINE = MergeTree +ORDER BY a +SETTINGS storage_policy = 's3_express'; +``` + +### S3ストレージ + +S3ストレージも`Object URL`パスに対してのみサポートされています。例: + +``` sql +select * from s3('https://test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com/file.csv', ...) +``` + +また、設定にバケットのリージョンを指定する必要があります: + +``` xml + + + https://test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com + eu-north-1 + + +``` + +### バックアップ + +上記で作成したディスクにバックアップを保存することが可能です: + +``` sql +BACKUP TABLE t TO Disk('s3_express', 't.zip') + +┌─id───────────────────────────────────┬─status─────────┐ +│ c61f65ac-0d76-4390-8317-504a30ba7595 │ BACKUP_CREATED │ +└──────────────────────────────────────┴────────────────┘ +``` + +``` sql +RESTORE TABLE t AS t_restored FROM Disk('s3_express', 't.zip') + +┌─id───────────────────────────────────┬─status───┐ +│ 4870e829-8d76-4171-ae59-cffaf58dea04 │ RESTORED │ +└──────────────────────────────────────┴──────────┘ +``` diff --git a/docs/ja/integrations/data-ingestion/s3/performance.md b/docs/ja/integrations/data-ingestion/s3/performance.md new file mode 100644 index 00000000000..5ecae3db830 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3/performance.md @@ -0,0 +1,392 @@ +--- +slug: /ja/integrations/s3/performance +sidebar_position: 2 +sidebar_label: パフォーマンスの最適化 +title: S3挿入と読み取りパフォーマンスの最適化 +description: S3の読み取りと挿入のパフォーマンスの最適化 +--- + +このセクションでは、[s3テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用してS3からデータを読み取ったり、挿入したりする際のパフォーマンス最適化に焦点を当てています。 + +:::info +**このガイドで説明するレッスンは、[GCS](/docs/ja/sql-reference/table-functions/gcs)や[Azure Blob Storage](/docs/ja/sql-reference/table-functions/azureBlobStorage)など独自のテーブル関数を持つ他のオブジェクトストレージ実装にも適用できます。** +::: + +挿入パフォーマンスを向上させるためにスレッドやブロックサイズを調整する前に、S3挿入のメカニズムを理解することをお勧めします。挿入メカニズムに精通している場合や、いくつかのクイックヒントを知りたい場合は、以下の[例](/docs/ja/integrations/s3/performance#example-dataset)にスキップしてください。 + +## 挿入メカニズム(単一ノード) + +ハードウェアのサイズに加えて、ClickHouseのデータ挿入メカニズム(単一ノード用)のパフォーマンスとリソース使用量に影響を与える主な要因は**挿入ブロックサイズ**と**挿入の並列度**です。 + +### 挿入ブロックサイズ + +![insert_mechanics](./images/insert_mechanics.png) + +`INSERT INTO SELECT`を実行すると、ClickHouseはデータの一部を受け取り、① 各[パーティショニングキー](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key)ごとにメモリ内挿入ブロックを少なくとも1つ形成します。ブロック内のデータがソートされ、テーブルエンジン特有の最適化が適用されます。データは圧縮された後、② データベースストレージに新しいデータ部分として書き込まれます。 + +挿入ブロックサイズは、ClickHouseサーバーの[ディスクファイルI/O使用量](https://en.wikipedia.org/wiki/Category:Disk_file_systems)とメモリ使用量の両方に影響します。より大きな挿入ブロックは、より多くのメモリを使用しますが、初期パーツの生成をより大きくし、減少させます。ClickHouseが大量のデータをロードする際に必要とするパーツが少なくなるほど、ディスクファイルI/Oと自動的に必要とされる[バックグラウンドマージの数](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)も少なくなります。 + +統合テーブルエンジンやテーブル関数との`INSERT INTO SELECT`クエリを使用すると、データはClickHouseサーバーによってプルされます: + +![pull data](./images/pull.png) + +データが完全にロードされるまでは、サーバーはループを実行します: + +```bash +① 次のデータ部分をプルして解析し、メモリ内データブロック(各パーティショニングキー用)を形成します。 + +② ブロックを新しいパーツとしてストレージに書き込みます。 + +①に戻る +``` + +①では、サイズは挿入ブロックの大きさに依存し、これは2つの設定で制御できます: + +- [`min_insert_block_size_rows`](https://clickhouse.com/docs/ja/operations/settings/settings#min-insert-block-size-rows)(デフォルト:`1048545`万行) +- [`min_insert_block_size_bytes`](https://clickhouse.com/docs/ja/operations/settings/settings#min-insert-block-size-bytes)(デフォルト:`256 MiB`) + +指定された行数が挿入ブロックに集まるか、設定されたデータ量に達すると(どちらかが先に起こる)、そのブロックは新しいパーツに書き込まれるトリガーとなります。挿入ループはステップ①で続きます。 + +`min_insert_block_size_bytes`の値は非圧縮メモリ内ブロックサイズを示し(圧縮済みのディスクセットサイズではありません)、作成されたブロックとパーツが設定された行数やバイト数を必ずしも正確に含んでいるわけではありません。これはClickHouseがデータを行-[ブロック](https://clickhouse.com/docs/ja/operations/settings/settings#setting-max_block_size)単位でストリーミングし、[処理](https://clickhouse.com/company/events/query-performance-introspection)するため、これらの設定は最低限の閾値を指定します。 + +#### マージに注意する + +設定された挿入ブロックサイズが小さいほど、大量のデータ負荷で生成される初期パーツは増え、データの取り込みと並行して実行されるバックグラウンドパーツマージが多くなるため、リソース競合(CPUとメモリ)が発生し、取り込み終了後に[健全な](/docs/ja/operations/settings/merge-tree-settings#parts-to-throw-insert)(3000)パーツ数に到達するまで追加の時間が必要になります。 + +:::important +ClickHouseのクエリパフォーマンスは、パーツ数が[推奨制限](/docs/ja/operations/settings/merge-tree-settings#parts-to-throw-insert)を超えると悪影響を受けます。 +::: + +ClickHouseは[マージパーツ](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)を継続的に実行し、[圧縮レベルに到達するまで](/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool)~150 GiBのサイズまでパーツを大きくしていきます。このダイアグラムは、ClickHouseサーバーがパーツをどのようにマージするかを示しています: + +![merges](./images/merges.png) + +単一のClickHouseサーバーは、いくつかの[バックグラウンドマージスレッド](/docs/ja/operations/server-configuration-parameters/settings#background_pool_size)を使用して並行して[パーツマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges:~:text=to%20execute%20concurrent-,part%20merges,-.%20Each%20thread%20executes)を実行します。各スレッドはループを実行します: + +```bash +① 次にどのパーツをマージするかを決定し、それらをメモリにブロックとしてロード。 + +② メモリ内のロードされたブロックを大きなブロックにマージ。 + +③ マージされたブロックを新しいディスクパーツに書き込みます。 + +①に戻る +``` + +[CPUコアとRAMサイズの増加](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#hardware-size)がバックグラウンドマージスループットを増加させることに注意してください。 + +大きなパーツにマージされたパーツは[非アクティブ](/docs/ja/operations/system-tables/parts)としてマークされ、最終的に[設定可能な](/docs/ja/operations/settings/merge-tree-settings#old-parts-lifetime)時間が経過した後に削除されます。時間とともに、マージされたパーツのツリーを作成します(そのため[`MergeTree`](/docs/ja/engines/table-engines/mergetree-family)テーブルと呼ばれます)。 + +### 挿入の並列性 + +![resource_usage](./images/resource_usage.png) + +ClickHouseサーバーはデータを並行して処理し、挿入できます。挿入の並列度は、ClickHouseサーバーの取り込みスループットとメモリ使用量に影響を及ぼします。データを並行してロードおよび処理するには、メインメモリが多く必要ですが、データが迅速に処理されるため、取り込みスループットが向上します。 + +s3のようなテーブル関数では、globパターンを使用して読み込むファイル名のセットを指定することができます。globパターンが複数のファイルに一致する場合、ClickHouseはこれらのファイルを並行して読み込み、それにあるデータをテーブルに挿入することで並行して挿入スレッドを利用できます(サーバー単位): + +![insert_threads](./images/insert_threads.png) + +すべてのデータがすべてのファイルから処理されるまで、各挿入スレッドはループを実行します: + +```bash +① 未処理のファイルデータ(部分サイズは設定されたブロックサイズに基づいている)の次の部分を取得し、メモリ内データブロックを作成します。 + +② ブロックをストレージに新しいパーツとして書き込みます。 + +①に戻る。 +``` + +このような並行挿入スレッドの数は、[`max_insert_threads`](https://clickhouse.com/docs/ja/operations/settings/settings#settings-max-insert-threads)設定で設定できます。デフォルト値は、オープンソースのClickHouseでは`1`、[ClickHouse Cloud](https://clickhouse.com/cloud)では`4`です。 + +大量のファイルがある場合、複数の挿入スレッドによる並行処理がうまく機能し、利用可能なCPUコアとネットワーク帯域幅(並行ファイルダウンロードのため)を完全に saturatすることができます。数個の大きなファイルだけをテーブルにロードするシナリオでは、ClickHouseは自動的に高いデータ処理の並列度を確立し、大きなファイル内の異なる範囲を並行して読むために挿入スレッドごとに追加のリーダースレッドを生成し、ネットワーク帯域幅の使用を最適化します。 + +s3関数とテーブルの場合、個々のファイルの並行ダウンロードは、[max_download_threads](https://clickhouse.com/codebrowser/ClickHouse/src/Core/Settings.h.html#DB::SettingsTraits::Data::max_download_threads)と[max_download_buffer_size](https://clickhouse.com/codebrowser/ClickHouse/src/Core/Settings.h.html#DB::SettingsTraits::Data::max_download_buffer_size)の値によって決定されます。ファイルは、そのサイズが`2 * max_download_buffer_size`を超える場合にのみ並行してダウンロードされます。デフォルトでは`max_download_buffer_size`デフォルトは10MiBに設定されています。一部のケースでは、このバッファサイズを50MB(`max_download_buffer_size=52428800`)に安全に増やすことができ、ファイルが単一スレッドによってダウンロードされることを確保します。これにより、各スレッドがS3コールに費やす時間を短縮し、S3待ち時間も短くなる可能性があります。また、並行読み取りに対してファイルが小さすぎる場合、スループットを向上させるためにClickHouseは自動的にデータを事前に読み込みし、こうしたファイルを非同期で事前読み込みすることでスループットを向上させます。 + +## パフォーマンスの測定 + +S3テーブル関数を使用したクエリのパフォーマンスを最適化する必要があります。これは、本番環境のデータに対してクエリを実行する場合、つまり、ClickHouseの計算のみが使用され、データがオリジナルの形式でS3に残る場合、およびClickHouse MergeTreeテーブルエンジンにS3からデータを挿入する場合です。指定がない限り、以下の推奨事項は両方のシナリオに適用されます。 + +## ハードウェアサイズの影響 + +![Hardware size](./images/hardware_size.png) + +利用可能なCPUコアの数とRAMサイズは、以下に影響を与えます: + +- サポートされる[初期パーツサイズ](#insert-block-size) +- 可能な[挿入の並列度](#insert-parallelism) +- [バックグラウンドパーツマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)のスループット + +したがって、全体的な取り込みスループットに影響します。 + +## リージョンのローカリティ + +バケットがClickHouseインスタンスと同じリージョンに配置されていることを確認してください。この単純な最適化により、特にAWSインフラストラクチャでClickHouseインスタンスをデプロイする場合、スループットパフォーマンスが劇的に向上する可能性があります。 + +## フォーマット + +ClickHouseは、`s3`関数と`S3`エンジンを使用して、[サポートされているフォーマット](/docs/ja/interfaces/formats.md/#data-formatting)でS3バケットに格納されているファイルを読み取ることができます。生のファイルを読む場合、これらのフォーマットには異なる利点があります: + +* Native、Parquet、CSVWithNames、TabSeparatedWithNamesのようなカラム名がエンコードされたフォーマットは、クエリがより簡素化されます。これにより、ユーザーが`s3`関数でカラム名を指定する必要がなくなります。カラム名によってこの情報が推測できるからです。 +* フォーマットによって、読み取りと書き込みスループットに関してパフォーマンスが異なることがあります。NativeとParquetは、すでに列指向でよりコンパクトであるため、読み取りパフォーマンスに最適です。Nativeフォーマットは、ClickHouseがデータをメモリ内で格納する方法と一致するため、データをClickHouseにストリーミングする際の処理オーバーヘッドを削減するという利点もあります。 +* 大きなファイルを読み取る際には、ブロックサイズが読み取りのレイテンシに影響を与えることがよくあります。特にデータをサンプリングする場合(例:最上位のN行を返す)などです。CSVやTSVのようなフォーマットでは、行セットを返すためにファイルを解析する必要があります。NativeやParquetのようなフォーマットは、その結果としてより高速にサンプリングを許可します。 +* 各圧縮フォーマットは、圧縮レベル、速度、圧縮または解凍パフォーマンスを均衡させるという長所と短所を持ってきます。CSVやTSVのような生ファイルを圧縮する場合、lz4は最速の解凍パフォーマンスを提供し、圧縮レベルを犠牲にします。gzipは通常、圧縮を改善するが、若干の読み取り速度を犠牲にします。xzはさらに進んで最高の圧縮を提供し、圧縮と解凍のパフォーマンスが最も低下します。エクスポートする場合、gzとlz4は比較的同じ速度で圧縮します。これを接続速度と比較してください。圧縮や解凍の速度から得られる利点は、s3バケットへの接続が遅い場合には簡単に無効になります。 +* NativeまたはParquetのようなフォーマットは通常、圧縮のオーバーヘッドを正当化するものではありません。データサイズの削減は、おそらく最小限のものであるため、これらのフォーマットは元来コンパクトです。特にs3がグローバルに利用可能で高帯域幅であるため、ネットワーク転送時間を十分にオフセットすることはほとんどありません。 + +## 例のデータセット + +さらなる最適化を図るために、[Stack Overflowデータセットからの投稿](/docs/ja/data-modeling/schema-design#stack-overflow-dataset)を使用して、クエリと挿入パフォーマンスの両方を最適化します。 + +このデータセットは、2008年7月から2024年3月までの毎月の投稿に関する189のParquetファイルで構成されています。 + +我々は上記の[推奨事項](#formats)に従い、パフォーマンスの向上のためにParquetを使用し、バケットと同じ地域に配置されたClickHouseクラスタで全てのクエリを実行します。このクラスタには3つのノードがあり、それぞれ32GiBのRAMと8つのvCPUを持っています。 + +調整なしで、MergeTreeテーブルエンジンにこのデータセットを挿入し、最も多くの質問をしたユーザーを計算するクエリを実行するパフォーマンスを示します。これらのクエリは、意図的にデータ全体をスキャンする必要があります。 + +```sql +-- トップユーザー名 +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 3.013 sec. Processed 59.82 million rows, 24.03 GB (19.86 million rows/s., 7.98 GB/s.) +Peak memory usage: 603.64 MiB. + +-- postsテーブルにロード +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') + +0 rows in set. Elapsed: 191.692 sec. Processed 59.82 million rows, 24.03 GB (312.06 thousand rows/s., 125.37 MB/s.) +``` + +この例では数行しか返しません。`SELECT`クエリのパフォーマンスを測定する場合、大量のデータがクライアントに返されることを避けるためにクエリには[nullフォーマット](/docs/ja/interfaces/formats/#null)を利用するか、結果を[`Null`エンジン](/docs/ja/engines/table-engines/special/null.md)に直接送るべきです。これによりクライアントがデータで圧倒されることやネットワークの飽和を避けることができます。 + +:::info +クエリを読む時、初回のクエリは再実行された場合に比べて遅く見えることがよくあります。これはS3自身のキャッシングと[ClickHouseのスキーマ推測キャッシュ](/docs/ja/operations/system-tables/schema_inference_cache)の双方に起因します。これはファイルの推測されたスキーマを保存し、その結果、繰り返しアクセス時に推測ステップをスキップできるため、クエリ時間を短縮します。 +::: + +## 読み取り用のスレッドの使用 + +S3上での読み取りパフォーマンスは、ネットワーク帯域幅やローカルI/Oによって制限されていない限り、コア数に比例してスケールします。スレッド数を増やすことは、ユーザーが認識しておくべきメモリオーバーヘッドを持っています。以下の設定を調整することで、読み取りスループット性能が向上する可能性があります: + +* 通常、`max_threads`のデフォルト値(コアの数)が十分です。クエリに使用されるメモリの量が多く、この量を削減する必要がある、または結果に`LIMIT`が低い場合、この値を低く設定することができます。メモリに余裕があるユーザーは、この値を増やして、より高い読み取りスループットの可能性を追求することが望ましいでしょう。通常、これはコア数の少ないマシン、つまり10未満の場合にのみ有益です。さらなる並列化の利益は、他のリソースがボトルネックとして作用するとされ、通常は減少します。例えば、ネットワークとCPUの競合です。 +* 22.3.1以前のClickHouseのバージョンは、`s3`関数や`S3`テーブルエンジンを使用する際、複数のファイルにわたって読み取りを並列化しました。最適な読み取りパフォーマンスを達成するために、S3上でファイルをチャンクに分割し、読み取りにグロブパターンを使用する必要がありました。最新のバージョンは、ファイル内でのダウンロードを並列化します。 +* 低スレッド数のシナリオでは、ユーザーは`remote_filesystem_read_method`を「read」に設定して、S3からファイルの同期読み取りを行うことで利益を得ることができます。 +* s3関数とテーブルの場合、個別のファイルの並列ダウンロードは、`max_download_threads`と`max_download_buffer_size`の値によって決定されます。ファイルは、そのサイズが2 * `max_download_buffer_size`を超える場合にのみ並行してダウンロードされます。デフォルトでは、`max_download_buffer_size`のデフォルトは10MiBに設定されています。一部のケースでは、このバッファサイズを50 MB(`max_download_buffer_size=52428800`)に安全に増やすことができ、各ファイルが単一スレッドによってダウンロードされることを確保します。これにより、各スレッドがS3コールに費やす時間を短縮し、S3待ち時間も短くなる可能性があります。[このブログポスト](https://clickhouse.com/blog/clickhouse-1-trillion-row-challenge)を参考にしてください。 + +パフォーマンスを向上させるための変更を行う前に、適切に測定することを確認してください。S3 APIコールは遅延に敏感であり、クライアントのタイミングに影響を与える可能性があるため、パフォーマンス指標にはクエリログ、すなわち`system.query_log`を使用してください。 + +ここでのクエリを例に、`max_threads`を倍増して16に設定すると(デフォルトで`max_threads`はノードのコア数)、読み取りクエリ性能が2倍向上し、メモリが増える代わりに。さらなる`max_threads`の増加は減衰するリターンを示します。 + +```sql +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 16 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 1.505 sec. Processed 59.82 million rows, 24.03 GB (39.76 million rows/s., 15.97 GB/s.) +Peak memory usage: 178.58 MiB. + +SETTINGS max_threads = 32 + +5 rows in set. Elapsed: 0.779 sec. Processed 59.82 million rows, 24.03 GB (76.81 million rows/s., 30.86 GB/s.) +Peak memory usage: 369.20 MiB. + +SETTINGS max_threads = 64 + +5 rows in set. Elapsed: 0.674 sec. Processed 59.82 million rows, 24.03 GB (88.81 million rows/s., 35.68 GB/s.) +Peak memory usage: 639.99 MiB. +``` + +## 挿入用スレッドとブロックサイズの調整 + +最大の取り込み性能を達成するには、(1)挿入ブロックサイズを選択し、(2)利用可能なCPUコアとRAMに基づいて適切な挿入の並列度を選択する必要があります。まとめると: + +- [挿入ブロックサイズを大きく設定するほど](#insert-block-size)、ClickHouseが作成するパーツが少なくなり、[ディスクファイル入出力](https://en.wikipedia.org/wiki/Category:Disk_file_systems)や[バックグラウンドマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)が少なくなります。 +- [並行挿入スレッドの数を多く設定するほど](#insert-parallelism)、データはより迅速に処理されます。 + +これら2つの性能要因間には対立するトレードオフがあります(バックグラウンドパーツのマージともトレードオフがあります)。ClickHouseサーバーのメインメモリの量には制限があります。より大きなブロックはより多くのメインメモリを使用するため、利用可能な並行挿入スレッドの数を制限します。反対に、より多くの並行挿入スレッドはより多くのメインメモリを必要とし、メモリ内で同時に作成される挿入ブロックの数を制限します。さらに、挿入スレッドとバックグラウンドマージスレッド間のリソース競合が発生する可能性があります。高い数の配置された挿入スレッドは(1)マージする必要があるパーツを多く生成し、(2)バックグラウンドマージスレッドからCPUコアとメモリスペースを奪います。 + +[このブログポスト](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)を読むことをお勧めします。このパラメータの動作がどのように性能とリソースに影響を与えるかをより詳細に説明しています。チューニングが2つのパラメータの微妙なバランスを含むことがあることを示しています。この徹底的なテストは実用的でない場合があるため、まとめとして、次のことをお勧めします: + +```bash +• max_insert_threads:挿入スレッドに利用可能なCPUコアの約半分を選択します(バックグラウンドマージ専用のコアを十分に残します)。 + +• peak_memory_usage_in_bytes:意図したピークメモリ使用量を選択します。それが単独の取り込みである場合はすべての利用可能なRAM、他の同時タスクのために半分またはそれ以下を選択します。 + +次に: +min_insert_block_size_bytes = peak_memory_usage_in_bytes / (~3 * max_insert_threads) +``` + +この計算式を使用するときは、`min_insert_block_size_rows`を0に設定して(行ベースの閾値を無効にするため)、最大スレッド数を選択した値に設定し、`min_insert_block_size_bytes`を上記の計算結果に基づいて設定します。 + +上記の計算式を使用して、Stack Overflowの例を取り上げます。 + +- `max_insert_threads=4`(ノードあたり8コア) +- `peak_memory_usage_in_bytes` - 32 GiB(ノードリソースの100%)または`34359738368`バイト +- `min_insert_block_size_bytes` = `34359738368/(3*4) = 2863311530` + +```sql +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 128.566 sec. Processed 59.82 million rows, 24.03 GB (465.28 thousand rows/s., 186.92 MB/s.) +``` + +示されているように、これらの設定を調整することで、挿入性能が33%を超えて向上しました。単一ノードのパフォーマンスをさらに向上させるために、他の設定を調整することをユーザーにお任せします。 + +## リソースとノードでのスケーリング + +リソースとノードによるスケーリングは、読み取りおよび挿入クエリの両方に適用されます。 + +### 垂直スケーリング + +前の調整とクエリは、ClickHouse Cloudクラスター内の単一ノードしか使用していません。ユーザーには通常、ClickHouseのノードが複数利用可能です。ユーザーは最初に垂直スケーリングを行い、コア数に比例してS3スループットを向上させることをお勧めします。以前の挿入と読み取りクエリを再実行し、適切な設定でリソースを二倍にしてClickHouse Cloudノードを利用すると、どちらも約二倍速く実行されます。 + +```sql +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=8, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 67.294 sec. Processed 59.82 million rows, 24.03 GB (888.93 thousand rows/s., 357.12 MB/s.) + +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 92 + +5 rows in set. Elapsed: 0.421 sec. Processed 59.82 million rows, 24.03 GB (142.08 million rows/s., 57.08 GB/s.) +``` + +:::note +個々のノードは、ネットワークやS3 GETリクエストによってもボトルネックとなり、垂直的なパフォーマンスのスケーリングを妨げる可能性があります。 +::: + +### 水平スケーリング + +最終的に、ハードウェアの利用可能性やコスト効率により、水平スケーリングが必要になることがよくあります。ClickHouse Cloudでは、本番クラスターは少なくとも3つのノードがあります。挿入についても全てのノードを利用することをユーザーは検討するでしょう。 + +S3のリーディングの利用は、[クラスターの利用](./index.md#utilizing-clusters)で説明したように、`s3Cluster`関数を使用する必要があります。これにより、リーディングがノード間で分散されます。 + +クエリを最初に受け取ったサーバーは、最初にグロブパターンを解決し、処理を動的に自身と他のサーバーに分散させます。 + +![s3Cluster](./images/s3Cluster.png) + +以前のリードクエリを3つのノードに負荷を分散し、クエリを`s3Cluster`を使用するよう調整します。これはClickHouse Cloudで自動的に、`default`クラスターを参照することで行われます。 + +[クラスターの利用](#utilizing-clusters)に示されているように、この作業はファイルレベルで分散されます。利用者がこの機能を活用するには、ノード数を超えるファイルが十分に必要です。 + +```sql +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 16 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 0.622 sec. Processed 59.82 million rows, 24.03 GB (96.13 million rows/s., 38.62 GB/s.) +Peak memory usage: 176.74 MiB. +``` + +同様に、原挿入クエリを分散し、単一ノード用に以前見つけた設定を使用します: + +```sql +INSERT INTO posts SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 171.202 sec. Processed 59.82 million rows, 24.03 GB (349.41 thousand rows/s., 140.37 MB/s.) +``` + +読み込むファイルの数が性能向上を示しているが、挿入性能を示していないことが分かります。デフォルトでは、リーディングは`s3Cluster`を使用して分散されますが、挿入は初期ノードに対してのみ発生します。これは、ノードごとに挿入スレッドを生成することでネットワーク待ち時間のオーバーヘッドが削減され、計算領域が挿入プロセス専用に設定されるため、バックグラウンドマージの負荷も削減します。シナリオの高スループットでこのボトルネックが発生する可能性があります。これに対処するには、`s3cluster`関数のパラメーター`parallel_distributed_insert_select`を設定します。 + +これを`parallel_distributed_insert_select=2`に設定することで、`SELECT`と`INSERT`が、各ノードの分散エンジンの基礎テーブルから/に対して並行に実行されるようにします。 + +```sql +INSERT INTO posts +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 54.571 sec. Processed 59.82 million rows, 24.03 GB (1.10 million rows/s., 440.38 MB/s.) +Peak memory usage: 11.75 GiB. +``` + +期待された通り、これにより挿入パフォーマンスが3倍向上します。 + +## さらなる調整 + +### 重複除去の無効化 + +挿入操作は、タイムアウトなどのエラーにより失敗することがあります。挿入が失敗すると、データが正常に挿入されたかどうかにかかわらず、クライアントによって再試行される可能性があります。分散配置(ClickHouse Cloudなど)では、ClickHouseはデータがすでに正常に挿入されたかどうかを確認し、挿入されたデータが重複としてマークされている場合、データを目的のテーブルに挿入しません。ただし、ユーザーには通常の挿入が行われたかのように成功状態を受け取ります。 + +この動作は挿入オーバーヘッドをもたらし、クライアントからデータをロードする際やバッチで意味がありますが、オブジェクトストレージからの`INSERT INTO SELECT`実行時には不要になることがあります。この機能を無効にすることで、性能を向上させることが示されます: + +```sql +INSERT INTO posts +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0 +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0 + +0 rows in set. Elapsed: 52.992 sec. Processed 59.82 million rows, 24.03 GB (1.13 million rows/s., 453.50 MB/s.) +Peak memory usage: 26.57 GiB. +``` + +### 挿入時の最適化 + +ClickHouseの`optimize_on_insert`設定は、挿入プロセス中にデータ部分がマージされるかどうかを制御します。有効にすると(デフォルトでは`optimize_on_insert = 1`)、小さいパーツが挿入時により大きなものにマージされ、読み込みパフォーマンスが向上する大きなパ-ツにとりこまれます。ただし、これに付随する挿入プロセスのオーバーヘッドがある可能性があります。 + +この設定を無効にすると(`optimize_on_insert = 0`)、挿入時のマージをスキップすることで、データを更に迅速に書き込みます。特に頻繁な小挿入時には、マージプロセスはバックグラウンドにて後回しされ、より高い挿入性能が可能になりますが、一時的に小さいパーツが増加する可能性があり、バックグラウンドマージが完了するまではクエリが遅くなる可能性があります。これは、挿入性能が優先事項で、バックグラウンドのマージプロセスが後で効率的に最適化できる場合に最適な設定です。設定を無効にすることで挿入スループットを改善できることが示されています: + +```sql +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0, optimize_on_insert = 0 + +0 rows in set. Elapsed: 49.688 sec. Processed 59.82 million rows, 24.03 GB (1.20 million rows/s., 483.66 MB/s.) +``` + +## その他のメモ + +* メモリが少ないシナリオでは、S3に挿入する場合、`max_insert_delayed_streams_for_parallel_write`を下げることを検討してください。 diff --git a/docs/ja/integrations/data-visualization.md b/docs/ja/integrations/data-visualization.md new file mode 100644 index 00000000000..9345e593c6c --- /dev/null +++ b/docs/ja/integrations/data-visualization.md @@ -0,0 +1,60 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, connect, explo, tableau, grafana, metabase, mitzu, superset, deepnote, draxlr, rocketbi, omni, bi, visualization, tool] +--- + +# ClickHouseでのデータの可視化 + +
+ +
+ +
+ +データがClickHouseに入りましたので、次はデータを分析する時です。これには、BIツールを使って可視化を構築することがよく含まれます。多くの人気のあるBIおよび可視化ツールは、ClickHouseに接続します。一部のツールはClickHouseにそのまま接続可能で、他のツールはコネクタのインストールが必要です。以下のツールに関するドキュメントがあります: + +- [Explo](./data-visualization/explo-and-clickhouse.md) +- [Grafana](./data-visualization/grafana/index.md) +- [Tableau](./data-visualization/tableau-and-clickhouse.md) +- [Looker](./data-visualization/looker-and-clickhouse.md) +- [Metabase](./data-visualization/metabase-and-clickhouse.md) +- [Mitzu](./data-visualization/mitzu-and-clickhouse.md) +- [Omni](./data-visualization/omni-and-clickhouse.md) +- [Superset](./data-visualization/superset-and-clickhouse.md) +- [Deepnote](./data-visualization/deepnote.md) +- [Draxlr](./data-visualization/draxlr-and-clickhouse.md) +- [Rocket BI](./data-visualization/rocketbi-and-clickhouse.md) +- [Rill](https://docs.rilldata.com/reference/olap-engines/clickhouse) +- [Zing Data](./data-visualization/zingdata-and-clickhouse.md) + +## ClickHouse Cloudとデータ可視化ツールの互換性 + +| ツール | サポート via | テスト済み | ドキュメントあり | コメント | +|-------------------------------------------------------------------------|-------------------------------|--------|------------|-------------------------------------------------------------------------------------------------------------------------------------| +| [Apache Superset](./data-visualization/superset-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | | +| [AWS QuickSight](./data-visualization/quicksight-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/quicksight-and-clickhouse.md)をご覧ください | +| [Deepnote](./data-visualization/deepnote.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Explo](./data-visualization/explo-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Grafana](./data-visualization/grafana/index.md) | ClickHouse公式コネクタ | ✅ | ✅ | | +| [Hashboard](./data-visualization/hashboard-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Looker](./data-visualization/looker-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/looker-and-clickhouse.md)をご覧ください | +| Looker | MySQLインターフェース | 🚧 | ❌ | | +| [Looker Studio](./data-visualization/looker-studio-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | | +| [Metabase](./data-visualization/metabase-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | +| [Mitzu](./data-visualization/mitzu-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Omni](./data-visualization/omni-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Power BI Desktop](./data-visualization/powerbi-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | ODBC経由で、直接クエリモードをサポート | +| [Power BI service](https://clickhouse.com/docs/ja/integrations/powerbi#power-bi-service) | ClickHouse公式コネクタ | ✅ | ✅ | [Microsoft Data Gateway](https://learn.microsoft.com/en-us/power-bi/connect-data/service-gateway-custom-connectors)の設定が必要 | +| [Rill](https://docs.rilldata.com/reference/olap-engines/clickhouse) | ネイティブコネクタ | ✅ | ✅ | +| [Rocket BI](./data-visualization/rocketbi-and-clickhouse.md) | ネイティブコネクタ | ✅ | ❌ | | +| [Tableau Desktop](./data-visualization/tableau-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | 認証プロセス中 | +| [Tableau Online](./data-visualization/tableau-online-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/tableau-online-and-clickhouse.md)をご覧ください | +| [Zing Data](./data-visualization/zingdata-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | diff --git a/docs/ja/integrations/data-visualization/_category_.yml b/docs/ja/integrations/data-visualization/_category_.yml new file mode 100644 index 00000000000..fd768d017a4 --- /dev/null +++ b/docs/ja/integrations/data-visualization/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'Data visualization' +collapsible: true +collapsed: true +link: + type: generated-index + title: Data visualization + slug: /ja/integrations/data-visualization diff --git a/docs/ja/integrations/data-visualization/deepnote.md b/docs/ja/integrations/data-visualization/deepnote.md new file mode 100644 index 00000000000..f735bbd04df --- /dev/null +++ b/docs/ja/integrations/data-visualization/deepnote.md @@ -0,0 +1,41 @@ +--- +sidebar_label: Deepnote +sidebar_position: 11 +slug: /ja/integrations/deepnote +keywords: [clickhouse, Deepnote, connect, integrate, notebook] +description: 非常に大きなデータセットを効率的にクエリし、使い慣れたノートブック環境で分析とモデリングを行う。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse を Deepnote に接続する + +Deepnote は、チームが発見や知見を共有するために構築された協力型データノートブックです。Jupyter 互換であることに加えて、クラウドで動作し、データサイエンスプロジェクトを効率的に進めるための中央集権的な場所を提供します。 + +このガイドは、すでに Deepnote アカウントがあり、稼働中の ClickHouse インスタンスをお持ちであることを前提としています。 + +## インタラクティブな例 +Deepnote のデータノートブックから ClickHouse にクエリを実行するインタラクティブな例をお探しの場合は、以下のボタンをクリックして、[ClickHouse プレイグラウンド](../../getting-started/playground.md)に接続されたテンプレートプロジェクトを起動してください。 + +[](https://deepnote.com/launch?template=ClickHouse%20and%20Deepnote) + +## ClickHouse に接続する + +1. Deepnote で「Integrations」概要を選択し、ClickHouse タイルをクリックします。 + +ClickHouse integration tile + +2. ClickHouse インスタンスの接続詳細を入力します: + + + ClickHouse details dialog + + **_注意:_** ClickHouse への接続が IP アクセスリストで保護されている場合、Deepnote の IP アドレスを許可する必要があるかもしれません。詳細は [Deepnote のドキュメント](https://docs.deepnote.com/integrations/authorize-connections-from-deepnote-ip-addresses)を参照してください。 +3. おめでとうございます!これで ClickHouse が Deepnote に統合されました。 + +## ClickHouse 統合の使用方法 + +1. ノートブックの右側で ClickHouse 統合に接続を開始します。 + + ClickHouse details dialog +2. 次に、新しい ClickHouse クエリブロックを作成し、データベースにクエリを実行します。クエリ結果はデータフレームとして保存され、SQL ブロックで指定された変数に格納されます。 +3. また、既存の [SQL ブロック](https://docs.deepnote.com/features/sql-cells) を ClickHouse ブロックに変換することもできます。 diff --git a/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md b/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md new file mode 100644 index 00000000000..e7f9fcc2c74 --- /dev/null +++ b/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md @@ -0,0 +1,86 @@ +--- +sidebar_label: Draxlr +sidebar_position: 131 +slug: /ja/integrations/draxlr +keywords: [clickhouse, draxlr, connect, integrate, ui] +description: Draxlrは、データの視覚化と分析を可能にするビジネスインテリジェンスツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DraxlrをClickHouseに接続する + +Draxlrは、ClickHouseデータベースへの接続を直感的なインターフェースで提供し、チームが数分で洞察を探索、視覚化、公開することを可能にします。このガイドでは、成功した接続を確立するための手順を順を追って説明します。 + +## 1. ClickHouseの認証情報を取得する + + +## 2. DraxlrをClickHouseに接続する + +1. ナビバーで**Connect a Database**ボタンをクリックします。 + +2. 利用可能なデータベースのリストから**ClickHouse**を選択し、次へをクリックします。 + +3. ホスティングサービスのいずれかを選び、次へをクリックします。 + +4. **Connection Name**フィールドに任意の名前を使用します。 + +5. フォームに接続詳細を追加します。 + + Connection Form + +6. **Next**ボタンをクリックし、接続が確立されるまで待ちます。接続が成功するとテーブルページが表示されます。 + +## 3. データを探索する + +1. リスト内のいずれかのテーブルをクリックします。 + +2. テーブル内のデータを表示するための探索ページに移動します。 + +3. フィルターの追加、結合、並べ替えを開始できます。 + + Connection Form + +4. **Graph**ボタンを使用してデータを視覚化するグラフタイプを選択することもできます。 + + Connection Form + + +## 4. SQLクエリの使用 + +1. ナビバーでExploreボタンをクリックします。 + +2. **Raw Query**ボタンをクリックし、テキストエリアにクエリを入力します。 + + Connection Form + +3. **Execute Query**ボタンをクリックして結果を確認します。 + + +## 5. クエリの保存 + +1. クエリを実行した後、**Save Query**ボタンをクリックします。 + + Connection Form + +2. **Query Name**テキストボックスにクエリの名前を付け、カテゴリ分けのためフォルダを選択できます。 + +3. **Add to dashboard**オプションを使用して、結果をダッシュボードに追加することもできます。 + +4. **Save**ボタンをクリックしてクエリを保存します。 + + +## 6. ダッシュボードの構築 + +1. ナビバーで**Dashboards**ボタンをクリックします。 + + Connection Form + +2. 左サイドバーの**Add +**ボタンをクリックして新しいダッシュボードを追加できます。 + +3. 新しいウィジェットを追加するには、右上の**Add**ボタンをクリックします。 + +4. 保存されたクエリのリストからクエリを選択し、視覚化タイプを選んで**Add Dashboard Item**ボタンをクリックします。 + + +## 詳細を学ぶ +Draxlrについてもっと知るためには、[Draxlrドキュメンテーション](https://draxlr.notion.site/draxlr/Draxlr-Docs-d228b23383f64d00a70836ff9643a928)サイトを訪れてください。 diff --git a/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md b/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md new file mode 100644 index 00000000000..b6e82a0fca9 --- /dev/null +++ b/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md @@ -0,0 +1,66 @@ +--- +sidebar_label: Embeddable +slug: /ja/integrations/embeddable +keywords: [clickhouse, embeddable, connect, integrate, ui] +description: Embeddableは、迅速でインタラクティブな完全カスタム分析体験をアプリに直接統合するための開発者向けツールキットです。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Embeddable と ClickHouse の接続 + +[Embeddable](https://embeddable.com/) では、コード内で [データモデル](https://trevorio.notion.site/Data-modeling-35637bbbc01046a1bc47715456bfa1d8) と [コンポーネント](https://trevorio.notion.site/Using-components-761f52ac2d0743b488371088a1024e49) を定義し(コードリポジトリに保存)、**SDK** を使用してこれらを強力なEmbeddableの**コード不要ビルダー**で利用できるようにします。 + +この結果、製品チームがデザインし、エンジニアリングチームが構築し、顧客対応およびデータチームが維持する、迅速でインタラクティブな顧客向けの分析を製品内に直接提供できるようになります。これが理想的な形です。 + +組み込みの行レベルセキュリティにより、各ユーザーは許可されたデータのみを見ることができます。また、完全に構成可能な2層のキャッシングにより、スケールに応じた迅速なリアルタイム分析を提供できます。 + +## 1. 接続情報を収集する + + +## 2. ClickHouse接続タイプを作成する + +データベース接続は、Embeddable APIを使用して追加します。この接続は、ClickHouseサービスに接続するために使用されます。次のAPI呼び出しを使用して接続を追加できます: + +```javascript +// セキュリティ上の理由から、これはクライアント側から*一切*呼び出してはいけません +fetch('https://api.embeddable.com/api/v1/connections', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + Authorization: `Bearer ${apiKey}` /* APIキーを安全に保持してください */, + }, + body: JSON.stringify({ + name: 'my-clickhouse-db', + type: 'clickhouse', + credentials: { + host: 'my.clickhouse.host', + user: 'clickhouse_user', + port: 8443, + password: '*****', + }, + }), +}); + + +Response: +Status 201 { errorMessage: null } +``` + +上記は `CREATE` アクションを示していますが、すべての `CRUD` 操作が利用可能です。 + +`apiKey` は、Embeddable ダッシュボードの1つで「**Publish**」をクリックして見つけることができます。 + +`name` は、この接続を識別するための一意の名前です。 +- デフォルトでは、データモデルは「default」と呼ばれる接続を探しますが、異なる `data_source` 名をモデルに供給することで、異なる接続に異なるデータモデルを接続できます(単にモデル内でdata_source名を指定してください)。 + +`type` は、Embeddableが使用するドライバーを指定します。 + +- ここでは `clickhouse` を使用しますが、1つのEmbeddable ワークスペースに複数の異なるデータソース(例: `postgres`, `bigquery`, `mongodb` など)を接続することができます。 + +`credentials` は、ドライバーが期待する必要な認証情報を含むJavaScriptオブジェクトです。 +- これらは安全に暗号化され、データモデルで記述したとおりのデータだけが取得されます。 +Embeddableは、各接続に対して読み取り専用のデータベースユーザーを作成することを強く推奨しています(Embeddableはデータベースから読み取るだけで、書き込みは行いません)。 + +本番、QA、テストなどの異なるデータベースに接続をサポートするため(または異なる顧客のために異なるデータベースをサポートするために)、各接続を環境に割り当てることができます([Environments API](https://www.notion.so/Environments-API-497169036b5148b38f7936aa75e62949?pvs=21)を参照)。 diff --git a/docs/ja/integrations/data-visualization/explo-and-clickhouse.md b/docs/ja/integrations/data-visualization/explo-and-clickhouse.md new file mode 100644 index 00000000000..ed2320bfd67 --- /dev/null +++ b/docs/ja/integrations/data-visualization/explo-and-clickhouse.md @@ -0,0 +1,113 @@ +--- +sidebar_label: Explo +sidebar_position: 131 +slug: /ja/integrations/explo +keywords: [clickhouse, Explo, connect, integrate, ui] +description: Exploはデータに関する質問を問うための使いやすいオープンソースのUIツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ExploをClickHouseに接続する + +あらゆるプラットフォーム向けの顧客向け分析。美しい視覚化のために設計され、簡素さを求めて構築されています。 + +## 目的 + +このガイドでは、ClickHouseからExploにデータを接続し、結果を視覚化する方法を説明します。チャートは以下のように表示されます: +Explo Dashboard + +

+ +:::tip データを追加 +作業するデータセットがない場合、例を追加することができます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用しているので、それを選ぶことをお勧めします。同じドキュメントカテゴリに他の例もいくつかあります。 +::: + +## 1. 接続に必要な詳細を集めます + + +## 2. ExploをClickHouseに接続する + +1. Exploアカウントにサインアップします。 + +2. 左側のサイドバーでExploの**データ**タブをクリックします。 + +Data Tab + +3. 右上の**データソースを接続**をクリックします。 + +Connect Data Source + +4. **はじめに**ページの情報を入力します。 + +Getting Started + +5. **Clickhouse**を選択します。 + +Clickhouse + +6. **Clickhouseの資格情報**を入力します。 + +Credentials + +7. **セキュリティ**を設定します。 + +Security + +8. Clickhouse内で、**ExploのIPをホワイトリストに追加**します。 +` +54.211.43.19, 52.55.98.121, 3.214.169.94, and 54.156.141.148 +` + +## 3. ダッシュボードを作成する + +1. 左側のナビゲーションバーで**ダッシュボード**タブに移動します。 + +Dashboard + +2. 右上の**ダッシュボードを作成**をクリックし、ダッシュボードに名前を付けます。これでダッシュボードが作成されました! + +Create Dashboard + +3. 次のような画面が表示されます: + +Explo Dashboard + +## 4. SQLクエリを実行する + +1. スキーマタイトルの下にある右側のサイドバーからテーブル名を取得します。それから以下のコマンドをデータセットエディタに入力します: +` +SELECT * FROM YOUR_TABLE_NAME +LIMIT 100 +` + +Explo Dashboard + +2. 実行をクリックし、プレビュータブに移動してデータを確認します。 + +Explo Dashboard + +## 5. チャートを作成する + +1. 左側からバーチャートのアイコンをドラッグして画面に配置します。 + +Explo Dashboard + +2. データセットを選択します。次のような画面が表示されます: + +Explo Dashboard + +3. **county**をX軸に、**Price**をY軸のセクションに入力します: + +Explo Dashboard + +4. 集約を**AVG**に変更します。 + +Explo Dashboard + +5. これで価格ごとに分類された住宅の平均価格が表示されました! + +Explo Dashboard + +## 詳細を学ぶ + +Exploやダッシュボードの作成について詳しくは、Exploのドキュメントを参照してください。 diff --git a/docs/ja/integrations/data-visualization/grafana/config.md b/docs/ja/integrations/data-visualization/grafana/config.md new file mode 100644 index 00000000000..724d81bf141 --- /dev/null +++ b/docs/ja/integrations/data-visualization/grafana/config.md @@ -0,0 +1,303 @@ +--- +sidebar_label: プラグイン設定 +sidebar_position: 3 +slug: /ja/integrations/grafana/config +description: GrafanaにおけるClickHouseデータソースプラグインの設定オプション +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# GrafanaでのClickHouseデータソースの設定 + +設定を変更する最も簡単な方法は、GrafanaのUIでプラグイン設定ページを操作することですが、データソースは[YAMLファイルでプロビジョニング](https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources)することもできます。 + +このページでは、ClickHouseプラグインの設定で利用可能なオプションの一覧と、YAMLを使用してデータソースをプロビジョニングする人向けの設定スニペットを紹介します。 + +全てのオプションの概要については、設定オプションの完全なリストを[こちら](#all-yaml-options)にて確認できます。 + +## 共通設定 + +設定画面の例: +Secure native config の例 + +共通設定のためのYAML設定例: +```yaml +jsonData: + host: 127.0.0.1 # (必須) サーバーアドレス。 + port: 9000 # (必須) サーバーポート。nativeの場合はデフォルトで9440(セキュア)および9000(インセキュア)。HTTPの場合はデフォルトで8443(セキュア)および8123(インセキュア)。 + + protocol: native # (必須) 接続に使うプロトコル。"native" または "http" に設定可能。 + secure: false # 接続がセキュアな場合は true に設定。 + + username: default # 認証に使用されるユーザー名。 + + tlsSkipVerify: # true に設定するとTLS検証をスキップします。 + tlsAuth: # TLSクライアント認証を有効にするにはtrueに設定。 + tlsAuthWithCACert: # CA証明書が提供されている場合はtrueに設定。自己署名のTLS証明書を検証するために必要。 + +secureJsonData: + password: secureExamplePassword # 認証に使用されるパスワード。 + + tlsCACert: # TLS CA 証明書 + tlsClientCert: # TLS クライアント証明書 + tlsClientKey: # TLS クライアントキー +``` + +UIから設定を保存した際には、`version` プロパティが追加されます。これは、設定が保存されたプラグインのバージョンを示します。 + +### HTTPプロトコル + +HTTPプロトコルを介して接続する場合は、設定が追加で表示されます。 + +追加のHTTP設定オプション + +#### HTTPパス + +HTTPサーバーが異なるURLパスで公開されている場合、ここにそのパスを追加できます。 + +```yaml +jsonData: + # 最初のスラッシュを除いた形式 + path: additional/path/example +``` + +#### カスタムHTTPヘッダー + +サーバーに送信されるリクエストにカスタムヘッダーを追加できます。 + +ヘッダーはプレーンテキストまたはセキュア値のいずれかです。 +すべてのヘッダーキーはプレーンテキストで保存され、セキュアヘッダー値は(`password`フィールドと同様に)セキュア設定で保存されます。 + +:::warning HTTP上のセキュア値 +セキュアヘッダー値は、設定でセキュアに保存されますが、接続がセキュアではない場合でもHTTPで送信されます。 +::: + +プレーン/セキュアヘッダーのYAML例: +```yaml +jsonData: + httpHeaders: + - name: X-Example-Plain-Header + value: plain text value + secure: false + - name: X-Example-Secure-Header + # "value" は除外 + secure: true +secureJsonData: + secureHttpHeaders.X-Example-Secure-Header: secure header value +``` + +## 追加設定 + +これらの追加設定はオプションです。 + +追加設定の例 + +YAML例: +```yaml +jsonData: + defaultDatabase: default # クエリビルダーでロードされるデフォルトのデータベース。デフォルトは "default"。 + defaultTable: # クエリビルダーでロードされるデフォルトのテーブル。 + + dialTimeout: 10 # サーバーへの接続時のダイアルタイムアウト(秒)。デフォルトは "10"。 + queryTimeout: 60 # クエリ実行時のクエリタイムアウト(秒)。デフォルトは60。ユーザーに対する権限が必要です。権限エラーが発生する場合は、"0" に設定して無効化を試みてください。 + validateSql: false # true に設定すると、SQLエディタでSQLを検証します。 +``` + +### OpenTelemetry + +OpenTelemetry (OTel) はプラグイン内に深く統合されています。 +OpenTelemetryデータは、[エクスポータープラグイン](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter)を使用してClickHouseにエクスポートできます。 +最善の利用のためには、[ログ](#logs)と[トレース](#traces)の両方のためにOTelを設定することを推奨しています。 + +[データリンク](./query-builder.md#data-links) を有効にするには、これらのデフォルトを設定する必要があります。この機能は強力な可観測性ワークフローを可能にします。 + +### ログ + +[ログのクエリ構築](./query-builder.md#logs)を高速化するために、デフォルトのデータベース/テーブルと、ログクエリ用のカラムを設定することができます。これにより、クエリビルダーで実行可能なログクエリが事前にロードされ、観察ページでのブラウジングが高速化されます。 + +OpenTelemetryを使用している場合は、「**Use OTel**」スイッチを有効にし、**デフォルトログテーブル**を`otel_logs`に設定する必要があります。 +これにより、選択したOTelスキーマバージョンを使用するためにデフォルトのカラムが自動的にオーバーライドされます。 + +OpenTelemetryはログには必須ではありませんが、単一のログ/トレースデータセットを使用すると、[データリンク](./query-builder.md#data-links)によるスムーズな可観測性ワークフローを促進します。 + +ログ設定画面の例: +ログ設定 + +ログ設定のYAML例: +```yaml +jsonData: + logs: + defaultDatabase: default # デフォルトのログデータベース。 + defaultTable: otel_logs # デフォルトのログテーブル。OTelを使用している場合、これは "otel_logs" に設定する必要があります。 + + otelEnabled: false # OTelが有効である場合にtrueに設定。 + otelVersion: latest # 使用されるotelコレクタースキーマバージョン。バージョンはUIで表示されますが、"latest"はプラグイン内で使用可能な最新のバージョンを使用します。 + + # 新しいログクエリを開く際に選択されるデフォルトのカラム。OTelが有効である場合は無視されます。 + timeColumn: # ログの主な時間カラム。 + logLevelColumn: # ログのレベル/シビリティ。値は通常 "INFO"、"error"、または "Debug" のようになります。 + logMessageColumn: # ログのメッセージ/コンテンツ。 +``` + +### トレース + +[トレースのクエリ構築](./query-builder.md#traces)を高速化するために、デフォルトのデータベース/テーブルと、トレースクエリ用のカラムを設定することができます。これにより、クエリビルダーで実行可能なトレース検索クエリが事前にロードされ、観察ページでのブラウジングが高速化されます。 + +OpenTelemetryを使用している場合は、「**Use OTel**」スイッチを有効にし、**デフォルトトレーステーブル**を`otel_traces`に設定する必要があります。 +これにより、選択したOTelスキーマバージョンを使用するためにデフォルトのカラムが自動的にオーバーライドされます。 +OpenTelemetryは必須ではありませんが、この機能はトレースにそのスキーマを使用するのが最適です。 + +トレース設定画面の例: +トレース設定 + +トレース設定のYAML例: +```yaml +jsonData: + traces: + defaultDatabase: default # デフォルトのトレースデータベース。 + defaultTable: otel_traces # デフォルトのトレーステーブル。OTelを使用している場合、これは "otel_traces" に設定する必要があります。 + + otelEnabled: false # OTelが有効である場合にtrueに設定。 + otelVersion: latest # 使用されるotelコレクタースキーマバージョン。バージョンはUIで表示されますが、"latest"はプラグイン内で使用可能な最新のバージョンを使用します。 + + # 新しいトレースクエリを開くときに選択されるデフォルトのカラム。OTelが有効の場合は無視されます。 + traceIdColumn: # トレースIDカラム。 + spanIdColumn: # スパンIDカラム。 + operationNameColumn: # オペレーション名カラム。 + parentSpanIdColumn: # 親スパンIDカラム。 + serviceNameColumn: # サービス名カラム。 + durationTimeColumn: # 継続時間カラム。 + durationUnitColumn:

+ +
+ +## 1. 接続情報を集める + + +## 2. 読み取り専用ユーザーの作成 + +ClickHouse を Grafana のようなデータ可視化ツールに接続する場合、データが不適切に変更されないように読み取り専用ユーザーを作成することをお勧めします。 + +Grafana はクエリが安全であるかを検証しません。クエリには `DELETE` や `INSERT` を含む任意の SQL ステートメントを含めることができます。 + +読み取り専用ユーザーを設定するには、次の手順に従ってください: +1. [ClickHouse でのユーザーとロールの作成](/docs/ja/operations/access-rights)ガイドに従って `readonly` ユーザープロファイルを作成します。 +2. 基盤となる [clickhouse-go クライアント](https://github.com/ClickHouse/clickhouse-go) に必要な `max_execution_time` 設定を変更するための十分な権限が `readonly` ユーザーにあることを確認します。 +3. 公共の ClickHouse インスタンスを使用している場合、`readonly` プロファイルで `readonly=2` を設定することはお勧めしません。代わりに、`readonly=1` のままにし、この設定の変更を許可するために `max_execution_time` の制約タイプを [changeable_in_readonly](/docs/ja/operations/settings/constraints-on-settings) に設定します。 + +## 3. Grafana 用 ClickHouse プラグインをインストールする + +Grafana が ClickHouse へ接続できるようにする前に、適切な Grafana プラグインをインストールする必要があります。Grafana にログインしていることを前提に、次の手順に従います: + +1. サイドバーの **Connections** ページから、**Add new connection** タブを選択します。 + +2. **ClickHouse** を検索し、Grafana Labs の署名されたプラグインをクリックします: + + Connections ページで ClickHouse プラグインを選択 + +3. 次の画面で、**Install** ボタンをクリックします: + + ClickHouse プラグインをインストール + +## 4. ClickHouse データソースを定義する + +1. インストールが完了したら、**Add new data source** ボタンをクリックします。(**Data sources** タブからもデータソースを追加できます。) + + ClickHouse データソースを作成 + +2. 下にスクロールして **ClickHouse** データソースのタイプを見つけるか、**Add data source** ページの検索バーで検索します。**ClickHouse** データソースを選択すると、以下のページが表示されます: + + 接続設定ページ + +3. サーバー設定と認証情報を入力します。主要な設定は次のとおりです: + +- **Server host address:** ClickHouse サービスのホスト名。 +- **Server port:** ClickHouse サービスのポート。サーバー設定およびプロトコルによって異なります。 +- **Protocol:** ClickHouse サービスに接続するためのプロトコル。 +- **Secure connection:** サーバーがセキュア接続を必要とする場合に有効にします。 +- **Username** と **Password**: ClickHouse のユーザー資格情報を入力します。ユーザーを設定していない場合は、ユーザー名に `default` を試してください。[読み取り専用ユーザーを設定](#2-making-a-read-only-user)することをお勧めします。 + +詳細な設定については、[プラグイン設定](./config.md)ドキュメントを確認してください。 + +4. **Save & test** ボタンをクリックして、Grafana が ClickHouse サービスに接続できることを確認します。成功した場合、**Data source is working** メッセージが表示されます: + + Select Save & test + +## 5. 次のステップ + +これでデータソースの準備が整いました![query builder](./query-builder.md) でクエリを構築する方法について詳しく学びましょう。 + +設定の詳細については、[プラグイン設定](./config.md)ドキュメントを確認してください。 + +これらのドキュメントに含まれていない情報をお探しの場合は、[GitHub のプラグインリポジトリ](https://github.com/grafana/clickhouse-datasource)を確認してください。 + +## プラグインバージョンのアップグレード + +v4 以降では、新しいバージョンがリリースされると設定やクエリがアップグレードされます。 + +v3 からの設定とクエリは開いたときに v4 に移行されます。古い設定やダッシュボードは v4 でロードされますが、移行は新しいバージョンで再保存するまで保持されません。古い設定/クエリを開いた際に問題が発生した場合は、変更を破棄し、[GitHub で問題を報告](https://github.com/grafana/clickhouse-datasource/issues)してください。 + +新しいバージョンで作成された設定/クエリを以前のバージョンにダウングレードすることはできません。 + +## 関連コンテンツ + +- [GitHub のプラグインリポジトリ](https://github.com/grafana/clickhouse-datasource) +- ブログ: [Visualizing Data with ClickHouse - Part 1 - Grafana](https://clickhouse.com/blog/visualizing-data-with-grafana) +- ブログ: [Visualizing ClickHouse Data with Grafana - Video](https://www.youtube.com/watch?v=Ve-VPDxHgZU) +- ブログ: [ClickHouse Grafana plugin 4.0 - Leveling up SQL Observability](https://clickhouse.com/blog/clickhouse-grafana-plugin-4-0) +- ブログ: [データの ClickHouse への投入 - Part 3 - S3 の使用](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3) +- ブログ: [ClickHouse を用いた Observability ソリューションの構築 - Part 1 - ログ](https://clickhouse.com/blog/storing-log-data-in-clickhouse-fluent-bit-vector-open-telemetry) +- ブログ: [ClickHouse を用いた Observability ソリューションの構築 - Part 2 - トレース](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) +- ブログ & ウェビナー: [ClickHouse + Grafana を用いたオープンソース GitHub アクティビティのストーリー](https://clickhouse.com/blog/introduction-to-clickhouse-and-grafana-webinar) diff --git a/docs/ja/integrations/data-visualization/grafana/query-builder.md b/docs/ja/integrations/data-visualization/grafana/query-builder.md new file mode 100644 index 00000000000..496cc8366f7 --- /dev/null +++ b/docs/ja/integrations/data-visualization/grafana/query-builder.md @@ -0,0 +1,247 @@ +--- +sidebar_label: クエリビルダー +sidebar_position: 2 +slug: /ja/integrations/grafana/query-builder +description: ClickHouse Grafana プラグインでのクエリビルダーの使用 +--- + +# クエリビルダー + +任意のクエリは ClickHouse プラグインで実行できます。 +クエリビルダーはシンプルなクエリには便利なオプションですが、複雑なクエリには [SQL エディタ](#sql-editor)を使用する必要があります。 + +クエリビルダー内のすべてのクエリには[クエリタイプ](#query-types)があり、少なくとも1つのカラムを選択する必要があります。 + +使用可能なクエリタイプは次のとおりです: +- [Table](#table): データを表形式で表示するための最も簡単なクエリタイプ。集計関数を含む単純なクエリにも複雑なクエリにも適しています。 +- [Logs](#logs): ログのクエリ作成に最適化されています。[デフォルト設定](./config.md#logs)されたエクスプローラビューで最適に機能します。 +- [Time Series](#time-series): 時系列クエリの作成に最適です。専用の時間カラムを選択し、集計関数を追加できます。 +- [Traces](#traces): トレースの検索/表示に最適化されています。[デフォルト設定](./config.md#traces)されたエクスプローラビューで最適に機能します。 +- [SQL Editor](#sql-editor): クエリの完全な制御を行いたい場合に使用できます。このモードでは任意の SQL クエリを実行できます。 + +## クエリタイプ + +*クエリタイプ*設定は、作成中のクエリのタイプに合うようにクエリビルダーのレイアウトを変更します。 +クエリタイプは、データの可視化に使用されるパネルも決定します。 + +### Table + +最も柔軟なクエリタイプは Table クエリです。これは、単純および集計クエリを処理するために設計された他のクエリビルダーを包括します。 + +| フィールド | 説明 | +|----|----| +| ビルダーモード | 単純なクエリは集計や Group By を含まず、集計クエリはこれらのオプションを含みます。 | +| カラム | 選択されたカラム。このフィールドに生の SQL を入力して、関数やカラムのエイリアシングを許可します。 | +| 集計 | [集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)のリスト。関数とカラムのカスタム値を許可します。集計モードでのみ表示されます。 | +| Group By | [GROUP BY](/docs/ja/sql-reference/statements/select/group-by.md) 式のリスト。集計モードでのみ表示されます。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されます。一部の可視化では、すべてのデータを表示するために `0` に設定する必要があります。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | + +Example aggregate table query + +このクエリタイプは、データをテーブルとしてレンダリングします。 + +### Logs + +Logs クエリタイプは、ログデータのクエリ作成に焦点を当てたクエリビルダーを提供します。 +デフォルトはデータソースの[ログ設定](./config.md#logs)で設定することができ、クエリビルダーをデフォルトのデータベース/テーブルとカラムでプレロードできます。 +また、OpenTelemetry を有効にして、スキーマバージョンに応じたカラムを自動選択することもできます。 + +**時間**と**レベル**フィルターがデフォルトで追加され、時間カラムの Order By も含まれます。 +これらのフィルターは各フィールドに関連付けられており、カラムが変更されると更新されます。 +**レベル**フィルターはデフォルトでは SQL から除外されており、`IS ANYTHING` オプションから変更することで有効になります。 + +Logs クエリタイプは[データリンク](#data-links)をサポートしています。 + +| フィールド | 説明 | +|----|----| +| Use OTel | OpenTelemetry カラムを有効にします。選択された OTel スキーマバージョンで定義されたカラムを使用するように選択されたカラムを上書きします(カラム選択を無効にします)。 | +| カラム | ログ行に追加されるカラム。生の SQL をこのフィールドに入力して関数やカラムのエイリアシングを許可します。 | +| 時間 | ログのプライマリタイムスタンプカラム。時間的な型を表示しますが、カスタム値/関数も許可されます。 | +| ログレベル | 任意。ログの*レベル*または*重大度*。通常は`INFO`, `error`, `Debug`などの値が使用されます。 | +| メッセージ | ログメッセージの内容。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、大規模なログデータセットには推奨されません。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | +| メッセージフィルター | `LIKE %value%` を使用してログを便利にフィルターリングするためのテキスト入力。入力が空の場合は除外されます。 | + +Example OTel logs query + +
+このクエリタイプは、上部にログヒストグラムパネルとともに、ログパネルとしてデータをレンダリングします。 + +クエリ内で選択された追加カラムは、展開されたログ行内で確認できます: +Example of extra fields on logs query + +### Time Series + +Time Series クエリタイプは[table](#table)に似ていますが、時系列データに焦点を当てています。 + +2つのビューはほぼ同じですが、以下の重要な違いがあります: +- 専用の*時間*フィールド。 +- 集計モードでは、時間間隔マクロが自動的に適用され、Time フィールドに対する Group By が追加されます。 +- 集計モードでは、「カラム」フィールドが非表示になります。 +- 時間範囲フィルターと Order By が **Time** フィールドに自動的に追加されます。 + +:::重要 あなたのビジュアライゼーションがデータを欠いている場合 +場合によっては、時系列パネルが `LIMIT` がデフォルトで `1000` に設定されているために切り捨てられたように表示されることがあります。 + +データセットが許せば、`LIMIT` 条項を削除して `0` に設定してみてください。 +::: + +| フィールド | 説明 | +|----|----| +| ビルダーモード | 単純なクエリは集計および Group By を含まず、集計クエリはこれらのオプションを含みます。 | +| 時間 | クエリのプライマリ時間カラム。時間的な型を表示しますが、カスタム値/関数も許可されます。 | +| カラム | 選択されたカラム。このフィールドに生の SQL を入力して、関数やカラムのエイリアシングを許可します。単純モードでのみ表示されます。 | +| 集計 | [集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)のリスト。関数とカラムのカスタム値を許可します。集計モードでのみ表示されます。 | +| Group By | [GROUP BY](/docs/ja/sql-reference/statements/select/group-by.md) 式のリスト。集計モードでのみ表示されます。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、時系列データセットではフルビジュアライゼーションを表示するために推奨されます。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | + +Example time series query + +このクエリタイプは、時系列パネルでデータをレンダリングします。 + +### Traces + +Traces クエリタイプは、トレースを簡単に検索および表示するためのクエリビルダーを提供します。 +これは OpenTelemetry データ用に設計されていますが、別のスキーマからトレースをレンダリングするためにカラムを選択することもできます。 +デフォルトはデータソースの[トレース設定](./config.md#traces)で設定することができ、クエリビルダーをデフォルトのデータベース/テーブルとカラムでプレロードできます。デフォルトが設定されている場合、カラム選択はデフォルトで折りたたまれます。 +また、OpenTelemetry を有効にして、スキーマバージョンに応じたカラムを自動選択することもできます。 + +デフォルトのフィルターは、トップレベルのスパンのみを表示する意図で追加されています。 +Time および Duration Time の Order By も含まれています。 +これらのフィルターは各フィールドに関連付けられており、カラムが変更されると更新されます。 +**サービス名**フィルターはデフォルトでは SQL から除外されており、`IS ANYTHING` オプションから変更することで有効になります。 + +Traces クエリタイプは[データリンク](#data-links)をサポートしています。 + +| フィールド | 説明 | +|----|----| +| Trace モード | クエリを Trace Search から Trace ID 検索に変更します。 | +| Use OTel | OpenTelemetry カラムを有効にします。選択された OTel スキーマバージョンで定義されたカラムを使用するように選択されたカラムを上書きします(カラム選択を無効にします)。 | +| Trace ID カラム | トレースの ID。 | +| Span ID カラム | スパン ID。 | +| Parent Span ID カラム | 親スパン ID。これは通常、トップレベルトレースでは空です。 | +| サービス名カラム | サービス名。 | +| 操作名カラム | 操作名。 | +| 開始時間カラム | トレーススパンのプライマリ時間カラム。スパンが開始された時刻。 | +| 期間時間カラム | スパンの期間。Grafana はデフォルトでこれをミリ秒の浮動小数点数で期待しています。変換は`Duration Unit`ドロップダウンを介して自動的に適用されます。 | +| 期間単位 | 期間に使用される時間の単位。デフォルトではナノ秒。選択された単位は、Grafana に必要なミリ秒の浮動小数点数に変換されます。 | +| タグカラム | スパンタグ。OTel に基づくスキーマを使用していない場合は除外します。特定のマップカラムタイプを期待します。 | +| サービスタグカラム | サービスタグ。OTel に基づくスキーマを使用していない場合は除外します。特定のマップカラムタイプを期待します。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、大規模なトレースデータセットには推奨されません。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | +| Trace ID | フィルターで使用するトレース ID。Trace ID モードでのみ使用され、Trace ID [データリンク](#data-links)を開くときに使用されます。 | + +Example OTel trace query + +このクエリタイプは、Trace Search モードではテーブルビューで、Trace ID モードではトレースパネルでデータをレンダリングします。 + +## SQL エディタ + +クエリビルダーには複雑すぎるクエリの場合は、SQL エディタを使用できます。 +これにより、生の ClickHouse SQL を記述して実行することでクエリを完全に制御できます。 + +SQL エディタは、クエリエディタの上部で「SQL Editor」を選択することで開くことができます。 + +このモードでも[マクロ関数](#macros)を使用できます。 + +クエリタイプを切り替えて、クエリに最も適したビジュアライゼーションを取得できます。 +ダッシュボードビュー、特に時系列データでは、この切り替えも効果があります。 + +Example raw SQL query + +## データリンク + +Grafana [データリンク](https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links) +は新しいクエリへのリンクを作成するために使用できます。 +この機能は、ClickHouse プラグイン内でトレースをログにリンクしたりその逆を実行したりするために有効化されています。 +データソースの[設定](./config.md#opentelemetry)で OpenTelemetry を両方のログとトレースに設定すると最適に機能します。 + +
+ テーブル内のトレースリンクの例 + Trace links in table +
+ +
+ ログ内のトレースリンクの例 + Trace links in logs +
+ +### データリンクの作成方法 + +あなたは、クエリ内で`traceID`という名前のカラムを選択することでデータリンクを作成できます。この名前は大文字と小文字を区別せず、"ID"の前にアンダースコアを追加することもサポートしています。例えば、`traceId`, `TraceId`, `TRACE_ID`, `tracE_iD`はすべて有効です。 + +OpenTelemetry が[ログ](#logs)または[トレース](#traces)クエリで有効になっている場合、トレース ID カラムは自動的に含まれます。 + +トレース ID カラムを含めることで、「**View Trace**」および「**View Logs**」リンクがデータに添付されます。 + +### リンクの機能 + +データリンクが存在すると、提供されたトレース ID を使用してトレースおよびログを開くことができます。 + +「**View Trace**」はトレース付きの分割パネルを開き、「**View Logs**」はトレース ID でフィルタリングされたログクエリを開きます。 +リンクがダッシュボードではなくエクスプローラビューからクリックされた場合、リンクはエクスプローラビューの新しいタブで開かれます。 + +[ログ](./config.md#logs)と[トレース](./config.md#traces)の両方に対してデフォルトが構成されていることが、クエリタイプを跨ぐ(ログからトレース、トレースからログ)のに必要です。同じクエリタイプのリンクを開く場合には、ただクエリをコピーすることで済むため、デフォルトは必要ありません。 + +
+ ログクエリ(左パネル)からトレースを表示する例(右パネル) + Example of data links linking +
+ +## マクロ + +マクロはクエリに動的 SQL を追加する簡単な方法です。 +クエリが ClickHouse サーバーに送信される前に、プラグインはマクロを展開し、完全な式に置き換えます。 + +SQL エディタとクエリビルダーの両方のクエリでマクロを使用できます。 + +### マクロの使用方法 + +必要に応じて、クエリの任意の場所にマクロを複数回含めることができます。 + +以下は、`$__timeFilter` マクロを使用する例です: + +入力: +```sql +SELECT log_time, log_message +FROM logs +WHERE $__timeFilter(log_time) +``` + +最終的なクエリ出力: +```sql +SELECT log_time, log_message +FROM logs +WHERE log_time >= toDateTime(1415792726) AND log_time <= toDateTime(1447328726) +``` + +この例では、Grafana ダッシュボードの時間範囲が `log_time` カラムに適用されています。 + +プラグインは中括弧 `{}` を使用した表記もサポートしています。クエリが [パラメーター](/docs/ja/sql-reference/syntax.md#defining-and-using-query-parameters)内に必要な場合は、この表記を使用します。 + +### マクロのリスト + +プラグインで利用可能なすべてのマクロのリストです: + +| マクロ | 説明 | 出力例 | +| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `$__dateFilter(columnName)` | Grafana パネルの時間範囲を[Date](/docs/ja/sql-reference/data-types/date.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= toDate('2022-10-21') AND columnName <= toDate('2022-10-23')` | +| `$__timeFilter(columnName)` | Grafana パネルの時間範囲を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= toDateTime(1415792726) AND time <= toDateTime(1447328726)` | +| `$__timeFilter_ms(columnName)` | Grafana パネルの時間範囲を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= fromUnixTimestamp64Milli(1415792726123) AND columnName <= fromUnixTimestamp64Milli(1447328726456)` | +| `$__dateTimeFilter(dateColumn, timeColumn)` | `$__dateFilter()` と `$__timeFilter()` を別々の Date と DateTime カラムで組み合わせたショートハンドです。Alias `$__dt()` | `$__dateFilter(dateColumn) AND $__timeFilter(timeColumn)` | +| `$__fromTime` | Grafana パネルの範囲の開始時刻を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)としてキャストしたものに置き換えます。 | `toDateTime(1415792726)` | +| `$__fromTime_ms` | パネル範囲の開始時刻を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)としてキャストしたものに置き換えます。 | `fromUnixTimestamp64Milli(1415792726123)` | +| `$__toTime` | Grafana パネル範囲の終了時刻を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)としてキャストしたものに置き換えます。 | `toDateTime(1447328726)` | +| `$__toTime_ms` | パネル範囲の終了時刻を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)としてキャストしたものに置き換えます。 | `fromUnixTimestamp64Milli(1447328726456)` | +| `$__timeInterval(columnName)` | ウィンドウサイズに基づく間隔を計算する関数で置き換えます。 | `toStartOfInterval(toDateTime(columnName), INTERVAL 20 second)` | +| `$__timeInterval_ms(columnName)` | ウィンドウサイズに基づく間隔を計算する関数で置き換えます(ミリ秒単位)。 | `toStartOfInterval(toDateTime64(columnName, 3), INTERVAL 20 millisecond)` | +| `$__interval_s` | ダッシュボード間隔を秒単位で置き換えます。 | `20` | +| `$__conditionalAll(condition, $templateVar)` | テンプレート変数がすべての値を選択していない場合は第一引数に置き換えます。テンプレート変数がすべての値を選択する場合は `1=1` に置き換えます。 | `condition` または `1=1` | + diff --git a/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md b/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md new file mode 100644 index 00000000000..35b18f89152 --- /dev/null +++ b/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md @@ -0,0 +1,45 @@ +--- +sidebar_label: Hashboard +sidebar_position: 132 +slug: /ja/integrations/hashboard +keywords: [clickhouse, hashboard, connect, integrate, ui, analytics] +description: HashboardはClickHouseと簡単に統合可能な強力な分析プラットフォームで、リアルタイムデータ分析を提供します。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# ClickHouseとHashboardの接続 + +[Hashboard](https://hashboard.com)は、組織内の誰もがメトリクスを追跡し、行動可能なインサイトを発見できるインタラクティブなデータ探索ツールです。HashboardはあなたのClickHouseデータベースに対してライブSQLクエリを発行し、セルフサービス型のアドホックなデータ探索用途に特に役立ちます。 + +Hashboard data explorer + +
+ +このガイドでは、HashboardをあなたのClickHouseインスタンスに接続する手順を案内します。この情報は、Hashboardの[ClickHouseインテグレーションドキュメント](https://docs.hashboard.com/docs/database-connections/clickhouse)でもご覧いただけます。 + +## 前提条件 + +- 自身のインフラストラクチャ上または[ClickHouse Cloud](https://clickhouse.com/)上にホストされているClickHouseデータベース。 +- [Hashboardアカウント](https://hashboard.com/getAccess)とプロジェクト。 + +## HashboardをClickHouseに接続する手順 + +### 1. 接続詳細の収集 + + + +### 2. Hashboardで新しいデータベース接続を追加 + +1. [Hashboardプロジェクト](https://hashboard.com/app)に移動します。 +2. サイドナビゲーションバーのギアアイコンをクリックして設定ページを開きます。 +3. `+ New Database Connection`をクリックします。 +4. モーダルで「ClickHouse」を選択します。 +5. **Connection Name**、**Host**、**Port**、**Username**、**Password**、**Database**の各フィールドに、事前に収集した情報を入力します。 +6. 「Test」をクリックして接続が正常に構成されていることを確認します。 +7. 「Add」をクリックします。 + +これで、ClickHouseデータベースがHashboardに接続され、[Data Models](https://docs.hashboard.com/docs/data-modeling/add-data-model)、[Explorations](https://docs.hashboard.com/docs/visualizing-data/explorations)、[Metrics](https://docs.hashboard.com/docs/metrics)、[Dashboards](https://docs.hashboard.com/docs/dashboards)を構築できるようになります。これらの機能についての詳細はHashboardの対応するドキュメントを参照してください。 + +## 詳細情報 + +より高度な機能やトラブルシューティングの情報については、[Hashboardのドキュメント](https://docs.hashboard.com/)を参照してください。 diff --git a/docs/ja/integrations/data-visualization/images/deepnote_01.png b/docs/ja/integrations/data-visualization/images/deepnote_01.png new file mode 100644 index 00000000000..058db58ffa3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/deepnote_02.png b/docs/ja/integrations/data-visualization/images/deepnote_02.png new file mode 100644 index 00000000000..46d63583428 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/deepnote_03.png b/docs/ja/integrations/data-visualization/images/deepnote_03.png new file mode 100644 index 00000000000..a35e5386e92 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_01.png b/docs/ja/integrations/data-visualization/images/draxlr_01.png new file mode 100644 index 00000000000..67a384a68a0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_02.png b/docs/ja/integrations/data-visualization/images/draxlr_02.png new file mode 100644 index 00000000000..de741803fb5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_03.png b/docs/ja/integrations/data-visualization/images/draxlr_03.png new file mode 100644 index 00000000000..7244a2babb1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_04.png b/docs/ja/integrations/data-visualization/images/draxlr_04.png new file mode 100644 index 00000000000..285f69793f3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_05.png b/docs/ja/integrations/data-visualization/images/draxlr_05.png new file mode 100644 index 00000000000..e622fc7db62 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_06.png b/docs/ja/integrations/data-visualization/images/draxlr_06.png new file mode 100644 index 00000000000..56191cb3803 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_01.png b/docs/ja/integrations/data-visualization/images/explo_01.png new file mode 100644 index 00000000000..2da81827d8a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_02.png b/docs/ja/integrations/data-visualization/images/explo_02.png new file mode 100644 index 00000000000..f6ed60f0da3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_03.png b/docs/ja/integrations/data-visualization/images/explo_03.png new file mode 100644 index 00000000000..d33c033fc72 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_04.png b/docs/ja/integrations/data-visualization/images/explo_04.png new file mode 100644 index 00000000000..a335491d63a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_05.png b/docs/ja/integrations/data-visualization/images/explo_05.png new file mode 100644 index 00000000000..104607a8859 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_06.png b/docs/ja/integrations/data-visualization/images/explo_06.png new file mode 100644 index 00000000000..05e38075dd3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_07.png b/docs/ja/integrations/data-visualization/images/explo_07.png new file mode 100644 index 00000000000..eb981bed136 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_08.png b/docs/ja/integrations/data-visualization/images/explo_08.png new file mode 100644 index 00000000000..953838722fb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_09.png b/docs/ja/integrations/data-visualization/images/explo_09.png new file mode 100644 index 00000000000..37813b8727a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_10.png b/docs/ja/integrations/data-visualization/images/explo_10.png new file mode 100644 index 00000000000..89dfa761179 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_11.png b/docs/ja/integrations/data-visualization/images/explo_11.png new file mode 100644 index 00000000000..a720e90a769 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_12.png b/docs/ja/integrations/data-visualization/images/explo_12.png new file mode 100644 index 00000000000..961a2128772 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_13.png b/docs/ja/integrations/data-visualization/images/explo_13.png new file mode 100644 index 00000000000..863d96c03e3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_14.png b/docs/ja/integrations/data-visualization/images/explo_14.png new file mode 100644 index 00000000000..e814c114b61 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_15.png b/docs/ja/integrations/data-visualization/images/explo_15.png new file mode 100644 index 00000000000..2ef119d4fff Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_16.png b/docs/ja/integrations/data-visualization/images/explo_16.png new file mode 100644 index 00000000000..a42adb352f8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/hashboard_01.png b/docs/ja/integrations/data-visualization/images/hashboard_01.png new file mode 100644 index 00000000000..97ff0834ecb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/hashboard_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_01.png b/docs/ja/integrations/data-visualization/images/looker_01.png new file mode 100644 index 00000000000..f6fae3fa0c8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_02.png b/docs/ja/integrations/data-visualization/images/looker_02.png new file mode 100644 index 00000000000..06527e0daf0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_03.png b/docs/ja/integrations/data-visualization/images/looker_03.png new file mode 100644 index 00000000000..d31f89c58f5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_04.png b/docs/ja/integrations/data-visualization/images/looker_04.png new file mode 100644 index 00000000000..17c774aeb4d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_01.png b/docs/ja/integrations/data-visualization/images/looker_studio_01.png new file mode 100644 index 00000000000..73b1032ae23 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_02.png b/docs/ja/integrations/data-visualization/images/looker_studio_02.png new file mode 100644 index 00000000000..08f6400a8be Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_03.png b/docs/ja/integrations/data-visualization/images/looker_studio_03.png new file mode 100644 index 00000000000..70ee103dbd5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_04.png b/docs/ja/integrations/data-visualization/images/looker_studio_04.png new file mode 100644 index 00000000000..6578d7a85be Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_05.png b/docs/ja/integrations/data-visualization/images/looker_studio_05.png new file mode 100644 index 00000000000..2a7c246c2a6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_06.png b/docs/ja/integrations/data-visualization/images/looker_studio_06.png new file mode 100644 index 00000000000..b3c95194751 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png b/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png new file mode 100644 index 00000000000..085cb598744 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png b/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png new file mode 100644 index 00000000000..61dfc680d01 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_01.png b/docs/ja/integrations/data-visualization/images/metabase_01.png new file mode 100644 index 00000000000..0dbe17723d5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_02.png b/docs/ja/integrations/data-visualization/images/metabase_02.png new file mode 100644 index 00000000000..64c61ab67cb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_03.png b/docs/ja/integrations/data-visualization/images/metabase_03.png new file mode 100644 index 00000000000..f3cb6d5d2fa Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_04.png b/docs/ja/integrations/data-visualization/images/metabase_04.png new file mode 100644 index 00000000000..e2dd277cff1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_05.png b/docs/ja/integrations/data-visualization/images/metabase_05.png new file mode 100644 index 00000000000..befe59e7be8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_06.png b/docs/ja/integrations/data-visualization/images/metabase_06.png new file mode 100644 index 00000000000..30be79f1fe3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_07.png b/docs/ja/integrations/data-visualization/images/metabase_07.png new file mode 100644 index 00000000000..404656531d8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_08.png b/docs/ja/integrations/data-visualization/images/metabase_08.png new file mode 100644 index 00000000000..3d1452648b5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_01.png b/docs/ja/integrations/data-visualization/images/mitzu_01.png new file mode 100644 index 00000000000..9f3eb6c0a93 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_02.png b/docs/ja/integrations/data-visualization/images/mitzu_02.png new file mode 100644 index 00000000000..c98ae0fd711 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_03.png b/docs/ja/integrations/data-visualization/images/mitzu_03.png new file mode 100644 index 00000000000..e4a4d4c0558 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_04.png b/docs/ja/integrations/data-visualization/images/mitzu_04.png new file mode 100644 index 00000000000..e9274cd7a0a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_05.png b/docs/ja/integrations/data-visualization/images/mitzu_05.png new file mode 100644 index 00000000000..dca2c7109f6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_06.png b/docs/ja/integrations/data-visualization/images/mitzu_06.png new file mode 100644 index 00000000000..dee7598f9c1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_07.png b/docs/ja/integrations/data-visualization/images/mitzu_07.png new file mode 100644 index 00000000000..95e2ba778cf Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_08.png b/docs/ja/integrations/data-visualization/images/mitzu_08.png new file mode 100644 index 00000000000..26b2c6a4fe6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_09.png b/docs/ja/integrations/data-visualization/images/mitzu_09.png new file mode 100644 index 00000000000..b3d192a394a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_10.png b/docs/ja/integrations/data-visualization/images/mitzu_10.png new file mode 100644 index 00000000000..630ffa79e2d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_11.png b/docs/ja/integrations/data-visualization/images/mitzu_11.png new file mode 100644 index 00000000000..dd273052c31 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_12.png b/docs/ja/integrations/data-visualization/images/mitzu_12.png new file mode 100644 index 00000000000..91163e0c84f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/omni_01.png b/docs/ja/integrations/data-visualization/images/omni_01.png new file mode 100644 index 00000000000..44363553e0a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/omni_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/omni_02.png b/docs/ja/integrations/data-visualization/images/omni_02.png new file mode 100644 index 00000000000..6520b031e30 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/omni_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_01.png b/docs/ja/integrations/data-visualization/images/powerbi_01.png new file mode 100644 index 00000000000..beecd2f3e73 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_02.png b/docs/ja/integrations/data-visualization/images/powerbi_02.png new file mode 100644 index 00000000000..16ebb42b950 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_03.png b/docs/ja/integrations/data-visualization/images/powerbi_03.png new file mode 100644 index 00000000000..923fae266a9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_04.png b/docs/ja/integrations/data-visualization/images/powerbi_04.png new file mode 100644 index 00000000000..8537f869dee Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_05.png b/docs/ja/integrations/data-visualization/images/powerbi_05.png new file mode 100644 index 00000000000..2c82b39c0b0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_06.png b/docs/ja/integrations/data-visualization/images/powerbi_06.png new file mode 100644 index 00000000000..025c4b55784 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_07.png b/docs/ja/integrations/data-visualization/images/powerbi_07.png new file mode 100644 index 00000000000..6c85c225f01 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_08.png b/docs/ja/integrations/data-visualization/images/powerbi_08.png new file mode 100644 index 00000000000..4ae7901b77b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_09.png b/docs/ja/integrations/data-visualization/images/powerbi_09.png new file mode 100644 index 00000000000..0f7bf60dff2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_10.png b/docs/ja/integrations/data-visualization/images/powerbi_10.png new file mode 100644 index 00000000000..657c2d7d4b2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_11.png b/docs/ja/integrations/data-visualization/images/powerbi_11.png new file mode 100644 index 00000000000..cdfc86ff09d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_12.png b/docs/ja/integrations/data-visualization/images/powerbi_12.png new file mode 100644 index 00000000000..3756f70b563 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_13.png b/docs/ja/integrations/data-visualization/images/powerbi_13.png new file mode 100644 index 00000000000..f5bce5166ae Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_14.png b/docs/ja/integrations/data-visualization/images/powerbi_14.png new file mode 100644 index 00000000000..de81379958e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_15.png b/docs/ja/integrations/data-visualization/images/powerbi_15.png new file mode 100644 index 00000000000..bff9861ba12 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_16.png b/docs/ja/integrations/data-visualization/images/powerbi_16.png new file mode 100644 index 00000000000..75d61fc7fac Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_01.png b/docs/ja/integrations/data-visualization/images/quicksight_01.png new file mode 100644 index 00000000000..6ff51aa17cf Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_02.png b/docs/ja/integrations/data-visualization/images/quicksight_02.png new file mode 100644 index 00000000000..06f386e1e2e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_03.png b/docs/ja/integrations/data-visualization/images/quicksight_03.png new file mode 100644 index 00000000000..78a7470f36d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_04.png b/docs/ja/integrations/data-visualization/images/quicksight_04.png new file mode 100644 index 00000000000..2989cc4ed3b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_05.png b/docs/ja/integrations/data-visualization/images/quicksight_05.png new file mode 100644 index 00000000000..742dc0d6715 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_06.png b/docs/ja/integrations/data-visualization/images/quicksight_06.png new file mode 100644 index 00000000000..03eac2f2561 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_07.png b/docs/ja/integrations/data-visualization/images/quicksight_07.png new file mode 100644 index 00000000000..9d9a444e402 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_01.gif b/docs/ja/integrations/data-visualization/images/rocketbi_01.gif new file mode 100644 index 00000000000..e3356da7747 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_01.gif differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_02.gif b/docs/ja/integrations/data-visualization/images/rocketbi_02.gif new file mode 100644 index 00000000000..5b2e9fd6a1f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_02.gif differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_03.png b/docs/ja/integrations/data-visualization/images/rocketbi_03.png new file mode 100644 index 00000000000..db9852d4cba Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_04.png b/docs/ja/integrations/data-visualization/images/rocketbi_04.png new file mode 100644 index 00000000000..6c5246b25cd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_05.png b/docs/ja/integrations/data-visualization/images/rocketbi_05.png new file mode 100644 index 00000000000..dfc2f805115 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_06.png b/docs/ja/integrations/data-visualization/images/rocketbi_06.png new file mode 100644 index 00000000000..9565506839c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_07.png b/docs/ja/integrations/data-visualization/images/rocketbi_07.png new file mode 100644 index 00000000000..45cb375761b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_08.png b/docs/ja/integrations/data-visualization/images/rocketbi_08.png new file mode 100644 index 00000000000..213a8298b0e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_09.png b/docs/ja/integrations/data-visualization/images/rocketbi_09.png new file mode 100644 index 00000000000..24494ec5084 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_10.png b/docs/ja/integrations/data-visualization/images/rocketbi_10.png new file mode 100644 index 00000000000..d986dacacf7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_11.png b/docs/ja/integrations/data-visualization/images/rocketbi_11.png new file mode 100644 index 00000000000..40844806ba7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_12.png b/docs/ja/integrations/data-visualization/images/rocketbi_12.png new file mode 100644 index 00000000000..8c34cee85db Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_13.png b/docs/ja/integrations/data-visualization/images/rocketbi_13.png new file mode 100644 index 00000000000..542cc0c5ef7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_14.png b/docs/ja/integrations/data-visualization/images/rocketbi_14.png new file mode 100644 index 00000000000..f85769f0ea4 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_15.png b/docs/ja/integrations/data-visualization/images/rocketbi_15.png new file mode 100644 index 00000000000..d57adf3cac1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_16.png b/docs/ja/integrations/data-visualization/images/rocketbi_16.png new file mode 100644 index 00000000000..bbf498a52ce Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_17.png b/docs/ja/integrations/data-visualization/images/rocketbi_17.png new file mode 100644 index 00000000000..ac2c9a5bc36 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_17.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_18.png b/docs/ja/integrations/data-visualization/images/rocketbi_18.png new file mode 100644 index 00000000000..e0db7cd199a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_18.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_01.png b/docs/ja/integrations/data-visualization/images/superset_01.png new file mode 100644 index 00000000000..52788b720b6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_02.png b/docs/ja/integrations/data-visualization/images/superset_02.png new file mode 100644 index 00000000000..6504d9f0ff9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_03.png b/docs/ja/integrations/data-visualization/images/superset_03.png new file mode 100644 index 00000000000..149b7e98dd8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_04.png b/docs/ja/integrations/data-visualization/images/superset_04.png new file mode 100644 index 00000000000..a98d7a36a36 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_05.png b/docs/ja/integrations/data-visualization/images/superset_05.png new file mode 100644 index 00000000000..aa6d01f95b6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_06.png b/docs/ja/integrations/data-visualization/images/superset_06.png new file mode 100644 index 00000000000..09a08d25c6a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_07.png b/docs/ja/integrations/data-visualization/images/superset_07.png new file mode 100644 index 00000000000..c231203f716 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_08.png b/docs/ja/integrations/data-visualization/images/superset_08.png new file mode 100644 index 00000000000..3d40c421718 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_09.png b/docs/ja/integrations/data-visualization/images/superset_09.png new file mode 100644 index 00000000000..a69e32d49fe Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_10.png b/docs/ja/integrations/data-visualization/images/superset_10.png new file mode 100644 index 00000000000..8ee9f50e6af Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_11.png b/docs/ja/integrations/data-visualization/images/superset_11.png new file mode 100644 index 00000000000..40060fc7fdd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_12.png b/docs/ja/integrations/data-visualization/images/superset_12.png new file mode 100644 index 00000000000..1251aa82179 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png b/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png new file mode 100644 index 00000000000..cc609279eca Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png b/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png new file mode 100644 index 00000000000..b5a6376e65a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png new file mode 100644 index 00000000000..c233dcdde7f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png new file mode 100644 index 00000000000..54bd68e390c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png new file mode 100644 index 00000000000..6587b7d99fd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png new file mode 100644 index 00000000000..28f80e067a3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png new file mode 100644 index 00000000000..650b90b4fce Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png b/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png new file mode 100644 index 00000000000..eefacd53250 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_01.png b/docs/ja/integrations/data-visualization/images/tableau_online_01.png new file mode 100644 index 00000000000..a169e606f5b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_02.png b/docs/ja/integrations/data-visualization/images/tableau_online_02.png new file mode 100644 index 00000000000..a5f856e7f14 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_03.png b/docs/ja/integrations/data-visualization/images/tableau_online_03.png new file mode 100644 index 00000000000..62ccc9d06b2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_04.png b/docs/ja/integrations/data-visualization/images/tableau_online_04.png new file mode 100644 index 00000000000..c6994773a7c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_showtables.png b/docs/ja/integrations/data-visualization/images/tableau_showtables.png new file mode 100644 index 00000000000..dc0b00b5599 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_showtables.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png b/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png new file mode 100644 index 00000000000..3c191b46fac Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook1.png b/docs/ja/integrations/data-visualization/images/tableau_workbook1.png new file mode 100644 index 00000000000..695097574d3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook1.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook2.png b/docs/ja/integrations/data-visualization/images/tableau_workbook2.png new file mode 100644 index 00000000000..fbac3f71e5d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook2.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook3.png b/docs/ja/integrations/data-visualization/images/tableau_workbook3.png new file mode 100644 index 00000000000..d5efed5ff13 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook3.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook4.png b/docs/ja/integrations/data-visualization/images/tableau_workbook4.png new file mode 100644 index 00000000000..4855d888c45 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook4.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook5.png b/docs/ja/integrations/data-visualization/images/tableau_workbook5.png new file mode 100644 index 00000000000..2b0cb26d9c9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook5.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook6.png b/docs/ja/integrations/data-visualization/images/tableau_workbook6.png new file mode 100644 index 00000000000..9f38512eb1f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook6.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook7.png b/docs/ja/integrations/data-visualization/images/tableau_workbook7.png new file mode 100644 index 00000000000..2ad5c8409c4 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook7.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_01.png b/docs/ja/integrations/data-visualization/images/zing_01.png new file mode 100644 index 00000000000..ffb8338b369 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_02.png b/docs/ja/integrations/data-visualization/images/zing_02.png new file mode 100644 index 00000000000..9b74019b5f5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_03.png b/docs/ja/integrations/data-visualization/images/zing_03.png new file mode 100644 index 00000000000..2f76d36070f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_04.png b/docs/ja/integrations/data-visualization/images/zing_04.png new file mode 100644 index 00000000000..02f5be00fd5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_05.png b/docs/ja/integrations/data-visualization/images/zing_05.png new file mode 100644 index 00000000000..08d7b845a09 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_06.png b/docs/ja/integrations/data-visualization/images/zing_06.png new file mode 100644 index 00000000000..f3522c5f242 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_07.png b/docs/ja/integrations/data-visualization/images/zing_07.png new file mode 100644 index 00000000000..771fcaa06ca Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_08.png b/docs/ja/integrations/data-visualization/images/zing_08.png new file mode 100644 index 00000000000..668028d211e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_09.png b/docs/ja/integrations/data-visualization/images/zing_09.png new file mode 100644 index 00000000000..3e88c504592 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_09.png differ diff --git a/docs/ja/integrations/data-visualization/looker-and-clickhouse.md b/docs/ja/integrations/data-visualization/looker-and-clickhouse.md new file mode 100644 index 00000000000..8e8387ac801 --- /dev/null +++ b/docs/ja/integrations/data-visualization/looker-and-clickhouse.md @@ -0,0 +1,60 @@ +--- +sidebar_label: Looker +slug: /ja/integrations/looker +keywords: [clickhouse, looker, connect, integrate, ui] +description: Lookerは、リアルタイムでインサイトを探索し共有するのに役立つエンタープライズプラットフォームであり、BI、データアプリケーション、および組み込み分析を提供します。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Looker + +Lookerは、公式のClickHouseデータソースを通じて、ClickHouse Cloudまたはオンプレミスのデプロイメントに接続できます。 + +## 1. 接続詳細の収集 + + +## 2. ClickHouseデータソースを作成する + +管理者 -> データベース -> 接続に移動し、右上の「接続を追加」ボタンをクリックします。 + +新しい接続を追加 +
+ +データソースの名前を選択し、方言のドロップダウンから `ClickHouse` を選びます。フォームに資格情報を入力します。 + +資格情報を指定 +
+ +ClickHouse Cloudを使用している場合やデプロイメントにSSLが必要な場合は、追加の設定でSSLをオンにしていることを確認してください。 + +SSLを有効化 +
+ +まず接続をテストし、それが完了したら、新しいClickHouseデータソースに接続します。 + +接続テスト完了 +
+ +これで、LookerプロジェクトにClickHouseデータソースをアタッチできるようになります。 + +## 3. 既知の制限事項 + +1. 以下のデータ型はデフォルトで文字列として処理されます: + * Array - JDBCドライバーの制限によりシリアル化が予期した通りに動作しません + * Decimal* - モデル内で数値に変更できます + * LowCardinality(...) - モデル内で適切な型に変更できます + * Enum8, Enum16 + * UUID + * Tuple + * Map + * JSON + * Nested + * FixedString + * Geo types + * MultiPolygon + * Polygon + * Point + * Ring +2. [対称集計機能](https://cloud.google.com/looker/docs/reference/param-explore-symmetric-aggregates)はサポートされていません +3. [フル外部結合](https://cloud.google.com/looker/docs/reference/param-explore-join-type#full_outer)はドライバーでまだ実装されていません diff --git a/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md b/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md new file mode 100644 index 00000000000..fb09f2736d2 --- /dev/null +++ b/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md @@ -0,0 +1,67 @@ +--- +sidebar_label: Looker Studio +slug: /ja/integrations/lookerstudio +keywords: [clickhouse, looker, studio, connect, mysql, integrate, ui] +description: Looker Studio(以前のGoogleデータスタジオ)は、データをカスタマイズ可能な情報報告書やダッシュボードに変換するオンラインツールです。 +--- + +import MySQLCloudSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx'; +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# Looker Studio + +Looker Studioは、公式のGoogle MySQLデータソースを使用して、MySQLインターフェース経由でClickHouseに接続できます。 + +## ClickHouse Cloudのセットアップ + + +## オンプレミスClickHouseサーバーのセットアップ + + +## Looker StudioをClickHouseに接続する + +まず、https://lookerstudio.google.com にGoogleアカウントでログインし、新しいデータソースを作成します。 + +新しいデータソースの作成 +
+ +Googleが提供する公式のMySQLコネクタ(名称は単に**MySQL**)を検索します。 + +MySQLコネクタの検索 +
+ +接続の詳細を指定します。MySQLインターフェースのポートはデフォルトで9004で、サーバーの設定によって異なる場合があります。 + +接続の詳細を指定 +
+ +次に、ClickHouseからデータを取得する方法を2つ選ぶことができます。まず、テーブルブラウザ機能を使用することができます。 + +テーブルブラウザの使用 +
+ +または、カスタムクエリを指定してデータを取得することもできます。 + +カスタムクエリを使用してデータを取得 +
+ +最後に、イントロスペクトされたテーブル構造を確認し、必要に応じてデータ型を調整できます。 + +イントロスペクトされたテーブル構造の表示 +
+ +これで、データの探査や新しいレポートの作成を進めることができます! + +## ClickHouse CloudでLooker Studioを使用する + +ClickHouse Cloudを使用する場合、最初にMySQLインターフェースを有効にする必要があります。接続ダイアログの「MySQL」タブでそれを行うことができます。 + +MySQLの有効化が必要 +
+ +Looker StudioのUIで「SSLを有効にする」オプションを選択します。ClickHouse CloudのSSL証明書は[Let's Encrypt](https://letsencrypt.org/certificates/)により署名されています。このルート証明書を[こちら](https://letsencrypt.org/certs/isrgrootx1.pem)からダウンロードできます。 + +ClickHouse CloudでのSSL設定 +
+ +その後の手順は、前述のセクションに記載されている手順と同じです。 diff --git a/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md b/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md new file mode 100644 index 00000000000..5a12200f8c8 --- /dev/null +++ b/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md @@ -0,0 +1,90 @@ +--- +sidebar_label: Metabase +sidebar_position: 131 +slug: /ja/integrations/metabase +keywords: [clickhouse, metabase, 接続, 統合, UI] +description: Metabaseは、データに関する質問をするための使いやすいオープンソースのUIツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# MetabaseをClickHouseに接続する + +Metabaseは、データに関する質問をするための使いやすいオープンソースのUIツールです。MetabaseはJavaアプリケーションであり、JARファイルをダウンロードして`java -jar metabase.jar`で実行するだけで動作します。Metabaseは、JDBCドライバーを使用してClickHouseに接続します。このドライバーはダウンロードして`plugins`フォルダに配置する必要があります。 + +## 目的 + +このガイドでは、Metabaseを使用してClickHouseのデータに関するいくつかの質問をして、回答を視覚化します。その回答の一例は次のようになります: + + Pie Chart +

+ +:::tip データを追加する +作業するデータセットがない場合は、例のデータセットを追加できます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用するため、それを選ぶこともできます。同じドキュメンテーションカテゴリには他にもいくつかの選択肢があります。 +::: + +## 1. 接続の詳細を集める + + +## 2. Metabase用のClickHouseプラグインをダウンロードする + +1. `plugins`フォルダがない場合は、`metabase.jar`が保存されている場所のサブフォルダとして作成してください。 + +2. プラグインは`clickhouse.metabase-driver.jar`という名前のJARファイルです。最新バージョンのJARファイルをhttps://github.com/clickhouse/metabase-clickhouse-driver/releases/latestからダウンロードしてください。 + +3. `clickhouse.metabase-driver.jar`を`plugins`フォルダに保存します。 + +4. ドライバーが正しく読み込まれるようにMetabaseを開始(または再起動)します。 + +5. Metabaseをhttp://hostname:3000でアクセスします。初回起動時にはウェルカム画面が表示され、一連の質問を通過する必要があります。データベースの選択を促された場合は、「**後でデータを追加します**」を選択してください: + +## 3. MetabaseをClickHouseに接続する + +1. 右上の歯車アイコンをクリックして、**Admin Settings**を選択し、Metabase管理ページにアクセスします。 + +2. **データベースを追加**をクリックします。または、**データベース**タブをクリックして、**データベースを追加**ボタンを選択します。 + +3. ドライバーのインストールが正常に行われた場合は、ドロップダウンメニューの**データベースタイプ**として**ClickHouse**が表示されます: + + Add a ClickHouse database + +4. データベースに**表示名**を付けます。これはMetabaseの設定であるため、任意の名前を使用できます。 + +5. ClickHouseデータベースの接続詳細を入力します。ClickHouseサーバーがSSLを使用するように設定されている場合は、セキュア接続を有効にします。例: + + Connection details + +6. **保存**ボタンをクリックすると、Metabaseはデータベースのテーブルをスキャンします。 + +## 4. SQLクエリを実行する + +1. 右上の**Exit admin**ボタンをクリックして**管理設定**を終了します。 + +2. 右上の**+ New**メニューをクリックすると、質問を行い、SQLクエリを実行し、ダッシュボードを作成することができます: + + New menu + +3. 例えば、1995年から2022年までの年ごとの平均価格を返す`uk_price_paid`テーブルに対して実行されたSQLクエリは次の通りです: + + Run a SQL query + +## 5. 質問をする + +1. **+ New**をクリックし、**Question**を選択します。データベースとテーブルを基に質問を構築できます。例えば、以下の質問は`default`データベース内の`uk_price_paid`テーブルに関するものです。グレーター・マンチェスター郡内の町ごとの平均価格を計算する簡単な質問です: + + New question + +2. **Visualize**ボタンをクリックして、結果を表形式で表示します。 + + New question + +3. 結果の下にある**Visualization**ボタンをクリックして、視覚化を棒グラフ(または他の利用可能なオプションのいずれか)に変更します: + + Pie Chart visualization + +## 詳しく学ぶ + +Metabaseおよびダッシュボードの構築方法についての詳細は、Metabaseのドキュメンテーションを訪問してください。 + +## 関連コンテンツ + +- ブログ: [データの視覚化 - 第3部 - Metabase](https://clickhouse.com/blog/visualizing-data-with-metabase) diff --git a/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md b/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md new file mode 100644 index 00000000000..1e088bc9c28 --- /dev/null +++ b/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md @@ -0,0 +1,161 @@ +--- +sidebar_label: Mitzu +slug: /ja/integrations/mitzu +keywords: [clickhouse, mitzu, connect, integrate, ui] +description: Mitzuはノーコードのデータウェアハウスネイティブ製品分析アプリケーションです。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# MitzuをClickHouseに接続する + +Mitzuはノーコードのデータウェアハウスネイティブ製品分析アプリケーションです。Amplitude、Mixpanel、Posthogと同様に、MitzuはユーザーがSQLやPythonの知識なしに製品使用データをクエリできるようにします。Mitzuは企業の製品使用データをコピーするのではなく、企業のデータウェアハウスやデータレイク上でネイティブなSQLクエリを生成します。 + +## 目的 + +本ガイドでは以下をカバーします: + +- データウェアハウスネイティブの製品分析 +- MitzuをClickHouseに統合する方法 + +:::tip サンプルデータセット +Mitzuで使用するデータセットがない場合は、NYC Taxi Dataを使用できます。このデータセットはClickhouse Cloudで利用可能です。 +::: + +## 1. 接続情報を集める + + + +## 2. Mitzuにサインインまたはサインアップ + +最初のステップとして[https://app.mitzu.io](https://app.mitzu.io)にアクセスしてサインアップしてください。 + +サインイン + +## 3. ワークスペースを作成する + +組織を作成した後、最初のワークスペースを作成するように求められます。 + +ワークスペースを作成 + +## 4. MitzuをClickHouseに接続する + +ワークスペースが作成されたら、接続情報を手動で設定する必要があります。 + +接続情報を設定 + +ガイド付きオンボーディングでは、Mitzuは単一のテーブルと統合することができます。 + +> ClickHouseセットアップで製品分析を行うには、テーブルのいくつかの重要なカラムを指定する必要があります。 +> +> 以下がそのカラムです: +> +> - **ユーザーID** - ユーザーのユニークな識別子のカラム。 +> - **イベント時間** - イベントのタイムスタンプのカラム。 +> - オプション[**イベント名**] - テーブルに複数のイベントタイプが含まれている場合、イベントをセグメントするカラム。 + +テーブル接続を設定 + +
+ +:::tip 追加のテーブルを追加 +最初のガイド付きセットアップが完了した後、追加のテーブルを追加することが可能です。以下を参照してください。 +::: + +## 5. イベントカタログを作成する + +オンボーディングの最終ステップは、`イベントカタログ`の作成です。 + +イベントカタログを作成 + +このステップでは、上記で定義されたテーブルからすべてのイベントとそのプロパティを見つけます。 +このステップはデータセットのサイズによりますが、数分かかる場合があります。 + +すべてがうまくいけば、イベントを探索する準備が整います。 +探索する + +## 6. セグメンテーションクエリを実行する + +Mitzuでのユーザーセグメンテーションは、Amplitude、Mixpanel、Posthogと同様に簡単です。 + +探索ページの左側でイベントを選択し、時間軸の設定は上部で行います。 + +セグメンテーション + +
+ +:::tip フィルターとブレークダウン +フィルタリングは期待通りに行えます。プロパティ(ClickHouseカラム)を選び、フィルターしたい値をドロップダウンから選択します。 +ブレークダウンの場合は、任意のイベントまたはユーザープロパティを選択します(ユーザープロパティを統合する方法は以下を参照)。 +::: + +## 7. ファネルクエリを実行する + +ファネルのために最大9ステップを選択します。ファネルがユーザーによって完了される時間枠を選択します。 +単一行のSQLコードを書くことなく、すぐにコンバージョン率の洞察を得ることができます。 + +ファネル + +
+ +:::tip 傾向を視覚化する +`ファネル傾向`を選択して、時間の経過とともにファネルの傾向を視覚化します。 +::: + +## 8. リテンションクエリを実行する + +リテンション率計算のために最大2ステップを選択します。再帰的なウィンドウを選択するためのリテンションウィンドウを選択します。 +単一のSQLコードを書くことなく、すぐにコンバージョン率の洞察を得ることができます。 + +リテンション + +
+ +:::tip コホートリテンション +`週間コホートリテンション`を選択して、リテンション率が時間の経過とともにどのように変化しているかを視覚化します。 +::: + +## 9. SQLネイティブ + +MitzuはSQLネイティブです。これにより、Exploreページで選択した構成に基づいてネイティブSQLコードを生成します。 + +SQLネイティブ + +
+ +:::tip BIツールで作業を続ける +MitzuのUIで制限に達した場合、SQLコードをコピーしてBIツールで作業を続けることができます。 +::: + +## 10. イベントテーブルを追加する + +複数のテーブルに製品使用イベントを保存している場合、それらをイベントカタログにも追加できます。 +ページ上部のギアアイコンからワークスペース設定ページに移動し、イベントテーブルタブを選択します。 + +ClickHouseウェアハウスから残りのイベントテーブルを追加します。 + +追加のテーブル + +
+ +すべての他のイベントテーブルをワークスペースに追加したら、それらも設定する必要があります。 +**ユーザーID**、**イベント時間**、およびオプションで**イベント名**カラムを設定します。 + +テーブルを設定 + +設定ボタンをクリックし、一括でこれらのカラムを設定します。 +Mitzuには最大5000テーブルを追加できます。 + +最後に、**イベントカタログを保存して更新**することを忘れないでください。 + +## Mitzuサポート + +迷った場合は、[support@mitzu.io](email://support@mitzu.io)までお気軽にお問い合わせください。 + +または、Slackコミュニティに[こちら](https://join.slack.com/t/mitzu-io/shared_invite/zt-1h1ykr93a-_VtVu0XshfspFjOg6sczKg)から参加できます。 + +## 詳細を学ぶ + +Mitzuに関する詳細情報は[mitzu.io](https://mitzu.io)をご覧ください。 + +ドキュメントページは[docs.mitzu.io](https://docs.mitzu.io)に訪問してください。 diff --git a/docs/ja/integrations/data-visualization/omni-and-clickhouse.md b/docs/ja/integrations/data-visualization/omni-and-clickhouse.md new file mode 100644 index 00000000000..286aa0e7c3f --- /dev/null +++ b/docs/ja/integrations/data-visualization/omni-and-clickhouse.md @@ -0,0 +1,30 @@ +--- +sidebar_label: Omni +slug: /ja/integrations/omni +keywords: [clickhouse, omni, connect, integrate, ui] +description: Omniは、BI、データアプリケーション、埋め込み分析のためのエンタープライズプラットフォームで、リアルタイムでインサイトを探索し共有するのに役立ちます。 +--- + +import ConnectionDetails from '@site/docs/ja/\_snippets/\_gather_your_details_http.mdx'; + +# Omni + +Omniは、公式のClickHouseデータソースを通じて、ClickHouse Cloudまたはオンプレミス展開に接続することができます。 + +## 1. 接続情報を収集する + + + +## 2. ClickHouseデータソースを作成する + +Admin -> Connectionsに移動し、右上の「Add Connection」ボタンをクリックします。 + +新しい接続の追加 +
+ +`ClickHouse`を選択し、フォームに資格情報を入力します。 + +資格情報の指定 +
+ +これで、OmniでClickHouseからデータのクエリを実行し、可視化できるようになります。 diff --git a/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md b/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md new file mode 100644 index 00000000000..1baa8b5e29b --- /dev/null +++ b/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md @@ -0,0 +1,168 @@ +--- +sidebar_label: Power BI +slug: /ja/integrations/powerbi +keywords: [ clickhouse, powerbi, connect, integrate, ui ] +description: Microsoft Power BIは、ビジネスインテリジェンスに主眼を置いてMicrosoftが開発したインタラクティブなデータ可視化ソフトウェア製品です。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Power BI + +Power BIは、[ODBCドライバー](https://github.com/ClickHouse/clickhouse-odbc)や[ClickHouseネイティブコネクタ](https://github.com/ClickHouse/power-bi-clickhouse)を使用して、ClickHouse Cloudまたはオンプレミスのデプロイメントからデータを読み込むことができます。どちらの方法もロードモードをサポートしていますが、後者はDirect Queryモードもサポートし、テーブル全体をロードする必要がありません。 + +このチュートリアルでは、これらの方法のどちらかを使用してデータを読み込むプロセスを案内します。 +
+
+
+ +# ClickHouseネイティブコネクタ + +## 1. 接続情報を集める + + + +## 2. ClickHouse ODBCクライアントをインストールする + +最新のClickHouse ODBCリリースを[こちら](https://github.com/ClickHouse/clickhouse-odbc/releases)からダウンロードしてください。付属の`.msi`インストーラーを実行し、ウィザードに従ってください。"デバッグシンボル"はオプションで必要ありませんので、デフォルトのままで大丈夫です。 + +ODBCドライバーのインストール +
+ +ドライバーのインストールが完了したら、インストールが成功したことを確認できます。スタートメニューでODBCを検索し、「ODBCデータソース **(64-bit)**」を選択します。 + +新しいODBCデータソースの作成 +
+ +ClickHouseドライバーがリストにあることを確認します。 + +ODBCの存在確認 +
+ +まだPower BIがインストールされていない場合は、[Power BI Desktopをダウンロードしてインストール](https://www.microsoft.com/en-us/download/details.aspx?id=58494)してください。 + +## 3. ClickHouseネイティブコネクタをインストールする + +* カスタムコネクター用に次のディレクトリを作成します:[Documents]\Power BI Desktop\Custom Connectors +* 最新のリリース (.mezファイル) を[Releases Section](https://github.com/ClickHouse/power-bi-clickhouse/releases)からダウンロードし、前のステップで作成したディレクトリに配置します。 +* Power BIを開き、署名されていないコネクタの読み込みを有効にします:ファイル -> オプションと設定 -> オプション -> セキュリティ -> データ拡張 -> 警告なしまたは検証なしで任意の拡張機能をロードすることを許可 + +署名されていないコネクタの読み込みを有効にする +
+ +* Power BIを再起動します。 + +## 4. Power BIにデータを取得する + +Power BI Desktopの開始画面で、「データ取得」をクリックします。 + +Power BI Desktopの開始 +
+ +「ClickHouseConnector (Beta)」を検索します。 + +データソースの選択 +
+ +コネクタを選択し、次のボックスを埋めます: + +* サーバー(必須フィールド) - インスタンスのドメイン/アドレス。プレフィックス/サフィックスなしで追加してください。 +* ポート(必須フィールド) - インスタンスのポート。 +* データベース - データベース名。 +* オプション - [ClickHouse ODBC GitHubページ](https://github.com/ClickHouse/clickhouse-odbc#configuration)にリストされている任意のODBCオプション +* データ接続モード - ClickHouseに直接クエリを行うためにDirectQueryを選択します。小さな負荷がある場合は、インポートモードを選択し、データ全体をPower BIにロードすることができます。 + +ClickHouseインスタンス情報の入力 +
+ +* ユーザー名とパスワードを指定します。 + +ユーザー名とパスワードのプロンプト +
+ +最後に、Navigatorビューでデータベースとテーブルが表示されるはずです。希望のテーブルを選択し、「ロード」をクリックしてClickHouseからデータをインポートします。 + +Navigatorビュー +
+ +インポートが完了すると、通常通りPower BIでClickHouseデータにアクセスできるようになります。 +
+ +## Power BIサービス + +クラウドでの使用については、Microsoftのドキュメントを参照してください。オンプレミスデータゲートウェイを使用して[カスタムデータコネクタを使用する](https://learn.microsoft.com/en-us/power-bi/connect-data/service-gateway-custom-connectors)方法をご覧ください。 +## +
+
+ +# ODBCドライバー + +上記のネイティブコネクタセクションのステップ1と2に従ってください。 + +## 3. 新しいユーザーDSNを作成する + +ドライバーのインストールが完了したら、ODBCデータソースを作成できます。スタートメニューでODBCを検索し、「ODBCデータソース (64-bit)」を選択します。 + +新しいODBCデータソースの作成 +
+ +ここで新しいユーザーDSNを追加する必要があります。左の「追加」ボタンをクリックします。 + +新しいユーザーDSNの追加 +
+ +ODBCドライバーのUnicodeバージョンを選択します。 + +Unicodeバージョンの選択 +
+ +接続情報を入力します。「ホスト」フィールドにはプロトコルを含めないでください(例: http:// や https:// 部分を省略)。ClickHouse Cloudを使用している場合やオンプレミスのデプロイメントでSSLが有効になっている場合、「SSLMode」フィールドにrequireと入力します。「タイムアウト」フィールド値は秒単位で設定され、省略された場合はデフォルト値の30秒になります。 + +接続情報 +
+ +## 4. Power BIにデータを取得する + +まだPower BIがインストールされていない場合は、[Power BI Desktopをダウンロードしてインストール](https://www.microsoft.com/en-us/download/details.aspx?id=58494)してください。 + +Power BI Desktopの開始画面で、「データ取得」をクリックします。 + +Power BI Desktopの開始 +
+ +「その他」 -> 「ODBC」を選択します。 + +データソースメニュー +
+ +リストから先ほど作成したデータソースを選択します。 + +ODBCデータソースの選択 +
+ +データソース作成時にすべての資格情報を指定した場合、すぐに接続するはずです。そうでない場合は、ユーザー名とパスワードを指定するよう求められます。 + +Navigatorビュー +
+ +最後に、Navigatorビューでデータベースとテーブルが表示されるはずです。希望のテーブルを選択し、「ロード」をクリックしてClickHouseからデータをインポートします。 + +Navigatorビュー +
+ +インポートが完了すると、通常通りPower BIでClickHouseデータにアクセスできるようになります。 +
+
+ +:::note +UInt64などの符号なし整数型は、自動的にはデータセットにロードされません。Power BIでサポートされている最大の整数型はInt64です。
+データを正しくインポートするには、Navigatorで「ロード」ボタンを押す前に、「データを変換」をクリックしてください。 +::: + +この例では、`pageviews`テーブルにUInt64カラムがあり、デフォルトでは「バイナリ」として認識されています。「データを変換」を行うことで、カラムの型を再割り当てし、例えばTextとして設定することができます。 + +Navigatorビュー +
+ +完了したら、左上の「閉じて適用」をクリックし、データのロードを続行します。 diff --git a/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md b/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md new file mode 100644 index 00000000000..18bb4954d4c --- /dev/null +++ b/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md @@ -0,0 +1,146 @@ +--- +sidebar_label: QuickSight +slug: /ja/integrations/quicksight +keywords: [clickhouse, aws, amazon, quicksight, mysql, connect, integrate, ui] +description: Amazon QuickSightは、ハイパースケールで統一されたビジネスインテリジェンス(BI)を提供するデータ駆動の組織をサポートします。 +--- + +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# QuickSight + +QuickSightは、公式のMySQLデータソースおよびDirect Queryモードを使用して、MySQLインターフェースを介してオンプレミスのClickHouseセットアップ(23.11+)に接続できます。 + +## オンプレミスClickHouseサーバーの設定 + +MySQLインターフェースを有効にしたClickHouseサーバーの設定方法については、[公式ドキュメント](https://clickhouse.com/docs/ja/interfaces/mysql)を参照してください。 + +サーバーの`config.xml`にエントリを追加することに加えて + +```xml + + 9004 + +``` + +Double SHA1パスワード暗号化を使用することが_必須_です。ユーザーがMySQLインターフェースを使用する際の設定です。 + +シェルからDouble SHA1で暗号化されたランダムパスワードを生成するには: + +```shell +PASSWORD=$(base64 < /dev/urandom | head -c16); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' +``` + +出力は次のようになります: + +``` +LZOQYnqQN4L/T6L0 +fbc958cc745a82188a51f30de69eebfc67c40ee4 +``` + +1行目が生成されたパスワードで、2行目がClickHouseを設定するために使用できるハッシュです。 + +以下は、生成されたハッシュを使用する`mysql_user`の設定例です: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + fbc958cc745a82188a51f30de69eebfc67c40ee4 + + ::/0 + + default + default + + +``` + +`password_double_sha1_hex`のエントリを、自分で生成したDouble SHA1ハッシュに置き換えてください。 + +QuickSightは、MySQLユーザーのプロファイルにいくつかの追加設定が必要です。 + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + 1 + 1 + 1 + 1 + + +``` + +ただし、これをデフォルトのものではなく、MySQLユーザーが使用できる別のプロファイルに割り当てることをお勧めします。 + +最後に、ClickHouseサーバーを希望するIPアドレスでリッスンするように設定します。 `config.xml`で、次の部分のコメントを解除して、すべてのアドレスでリッスンするように設定します: + +```bash +:: +``` + +`mysql`バイナリが利用可能な場合は、コマンドラインから接続をテストできます。 上記のサンプルユーザー名(`mysql_user`)とパスワード(`LZOQYnqQN4L/T6L0`)を使用してコマンドラインで次のようにします: + +```bash +mysql --protocol tcp -h localhost -u mysql_user -P 9004 --password=LZOQYnqQN4L/T6L0 +``` + +``` +mysql> show databases; ++--------------------+ +| name | ++--------------------+ +| INFORMATION_SCHEMA | +| default | +| information_schema | +| system | ++--------------------+ +4 rows in set (0.00 sec) +Read 4 rows, 603.00 B in 0.00156 sec., 2564 rows/sec., 377.48 KiB/sec. +``` + +## QuickSightとClickHouseの接続 + +まず、https://quicksight.aws.amazon.com にアクセスし、[データセット] に移動して、「新しいデータセット」をクリックします。 + +Creating a new dataset +
+ +QuickSightにバンドルされている公式のMySQLコネクタ(**MySQL**のみ)を検索します。 + +MySQL connector search +
+ +接続の詳細を指定します。 MySQLインターフェースのポートはデフォルトで9004で、サーバー構成により異なる場合があります。 + +Specifying the connection details +
+ +次に、ClickHouseからデータを取得する方法として2つのオプションがあります。 まず、リストからテーブルを選択する方法です。 + +Selecting a table from the list +
+ +あるいは、カスタムSQLを指定してデータを取得することもできます。 + +Using custom SQL to fetch the data +
+ +「データの編集/プレビュー」をクリックすると、イントロスペクトされたテーブル構造を確認するか、データを取得する方法としてカスタムSQLを使用する場合は調整を行うことができます。 + +Viewing the introspected table structure +
+ +UIの左下隅で「Direct Query」モードが選択されていることを確認してください。 + +Choosing the Direct Query mode +
+ +これでデータセットの公開と新しいビジュアル化の作成を進めることができます! + +## 既知の制限事項 + +- SPICEインポートは期待通りに動作しません。Direct Queryモードを使用してください。[#58553](https://github.com/ClickHouse/ClickHouse/issues/58553)を参照してください。 diff --git a/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md b/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md new file mode 100644 index 00000000000..71b887c70ec --- /dev/null +++ b/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md @@ -0,0 +1,134 @@ +--- +sidebar_label: Rocket BI +sidebar_position: 131 +slug: /ja/integrations/rocketbi +keywords: [clickhouse, rocketbi, connect, integrate, ui] +description: RocketBIは、データを迅速に分析し、ドラッグ&ドロップでビジュアライゼーションを構築し、ウェブブラウザ上で同僚と共同作業できるセルフサービスのビジネスインテリジェンスプラットフォームです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# 目標: 最初のダッシュボードを作成する + +このガイドでは、Rocket.BIをインストールして簡単なダッシュボードを作成します。 +以下がそのダッシュボードです: + +github_rocketbi2 +
+ +[こちらのリンクからダッシュボードを確認できます。](https://demo.rocket.bi/dashboard/sales-dashboard-7?token=7eecf750-cbde-4c53-8fa8-8b905fec667e) + +## インストール + +事前にビルドされたDockerイメージを使用してRocketBIを起動します。 + +docker-compose.ymlと設定ファイルを取得します: +``` +wget https://raw.githubusercontent.com/datainsider-co/rocket-bi/main/docker/docker-compose.yml +wget https://raw.githubusercontent.com/datainsider-co/rocket-bi/main/docker/.clickhouse.env +``` +.clickhouse.envを編集し、ClickHouseサーバーの情報を追加します。 + +以下のコマンドでRocketBIを開始します: ```docker-compose up -d``` + +ブラウザで```localhost:5050```を開き、こちらのアカウントでログインします: ```hello@gmail.com/123456``` + +ソースからのビルドや高度な設定については、[Rocket.BI Readme](https://github.com/datainsider-co/rocket-bi/blob/main/README.md)をご参照ください。 + +## ダッシュボードを作ってみましょう + +ダッシュボードでは、レポートを見つけることができ、**+New**をクリックして視覚化を開始します。 +ダッシュボードで**無制限のダッシュボード**と**無制限のチャート**を作成できます。 + +rocketbi_create_chart +
+ +YouTubeで高解像度のチュートリアルを見る:[https://www.youtube.com/watch?v=TMkdMHHfvqY](https://www.youtube.com/watch?v=TMkdMHHfvqY) + +### チャートコントロールを作成する + +#### メトリクスコントロールを作成 +タブフィルターで使用したいメトリックフィールドを選択します。集計設定を確認してください。 + +rocketbi_chart_6 +
+ +フィルタに名前を付け、コントロールをダッシュボードに保存します。 + +Metrics Control + +#### 日付型コントロールを作成 +メインの日付カラムとして日付フィールドを選択します: + +rocketbi_chart_4 +
+ +異なるルックアップ範囲で重複バリアントを追加します。例えば、年、月、日付や曜日など。 + +rocketbi_chart_5 +
+ +フィルタに名前を付け、コントロールをダッシュボードに保存します。 + +Date Range Control + +### さあ、チャートを作りましょう + +#### 円グラフ: 地域別売上指標 +新しいチャートを追加し、円グラフを選択します。 + +Add Pie Chart +
+ +まず、データセットからカラム「Region」をドラッグ&ドロップして凡例フィールドに配置します。 + +Drag-n-drop Column to Chart +
+ +その後、チャートコントロールタブに移動します。 + +Navigate to Chart Control in Visualization +
+ +メトリクスコントロールを値フィールドにドラッグ&ドロップします。 + +Use Metrics Control in Chart +
+ +(メトリクスコントロールはソートとしても使えます) + +さらなるカスタマイズのためにチャート設定に移動します。 + +Custom the Chart with Setting +
+ +例えば、データラベルをパーセンテージに変更します。 + +Chart Customization Example +
+ +チャートを保存してダッシュボードに追加します。 + +Overview Dashboard with Pie Chart + +#### 時系列チャートに日付コントロールを使用 +積み上げカラムチャートを使用しましょう。 + +Create a Time-series chart with Tab Control +
+ +チャートコントロールで、メトリクスコントロールをY軸、日付範囲をX軸に使用します。 + +Use Date Range as Controller +
+ +地域カラムをブレークダウンに追加します。 + +Add Region into Breakdown +
+ +KPIとしてナンバーチャートを追加し、ダッシュボードを目立たせます。 + +Screenshot 2022-11-17 at 10 43 29 +
+ +これで、rocket.BIを使って最初のダッシュボードを無事に作成しました。 diff --git a/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md b/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md new file mode 100644 index 00000000000..e4617b3d4ea --- /dev/null +++ b/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md @@ -0,0 +1,178 @@ +--- +sidebar_label: Splunk +sidebar_position: 198 +slug: /ja/integrations/splunk +keywords: [splunk, integration, data visualization] +description: SplunkダッシュボードをClickHouseに接続する +--- + +# SplunkをClickHouseに接続する + +Splunkはセキュリティと可観測性のための人気のある技術です。また、強力な検索エンジンとダッシュボーディングエンジンでもあります。さまざまなユースケースに対応するための数百のSplunkアプリが利用可能です。 + +ClickHouseに特化した利用として、[Splunk DB Connect App](https://splunkbase.splunk.com/app/2686)を活用し、ClickHouse JDBCドライバーを使ってClickHouseのテーブルを直接クエリします。 + +この統合の理想的なユースケースは、ClickHouseをnetflow、AvroまたはProtobufバイナリデータ、DNS、VPCフローログ、その他のOTELログのような大規模データソースのために使用している場合です。これらのデータはSplunk上で検索やダッシュボード作成を行うためにチームと共有できます。このアプローチを使用することで、データはSplunkのインデックスレイヤーに取り込まれず、[Metabase](https://www.metabase.com/)や[Superset](https://superset.apache.org/)のような他のビジュアライゼーション統合と同様にClickHouseから直接クエリされます。 + +## 目標 + +このガイドでは、ClickHouse JDBCドライバーを使用してClickHouseをSplunkに接続します。ローカル版のSplunk Enterpriseをインストールしますが、データはインデックス化されません。代わりに、DB Connectクエリエンジンを通して検索機能を使用します。 + +このガイドを使用すると、ClickHouseに接続された以下のようなダッシュボードを作成できます: + +![Splunk 1](../images/splunk/splunk-1.png) + +:::note +このガイドでは[ニューヨーク市タクシーデータセット](https://clickhouse.com/docs/ja/getting-started/example-datasets/nyc-taxi)を使用します。他にも使用可能なデータセットは[当社のドキュメント](http://localhost:3000/docs/en/getting-started/example-datasets)にあります。 +::: + +## 前提条件 + +開始する前に必要なもの: +- 検索ヘッド機能を使用するためのSplunk Enterprise +- お使いのOSまたはコンテナにインストールされている[Java Runtime Environment (JRE)](https://docs.splunk.com/Documentation/DBX/3.16.0/DeployDBX/Prerequisites) +- [Splunk DB Connect](https://splunkbase.splunk.com/app/2686) +- Splunk Enterprise OSインスタンスへの管理者アクセスまたはSSHアクセス +- ClickHouse接続の詳細 (ClickHouse Cloudを使用している場合の詳細は[こちら](https://clickhouse.com/docs/ja/integrations/metabase#1-gather-your-connection-details)を参照) + +## Splunk EnterpriseにDB Connectをインストールして設定する + +まず、Splunk EnterpriseインスタンスにJava Runtime Environmentをインストールする必要があります。Dockerを使用している場合、`microdnf install java-11-openjdk`コマンドを使用できます。 + +`java_home`パスをメモしておきます:`java -XshowSettings:properties -version`。 + +Splunk EnterpriseにDB Connect Appがインストールされていることを確認してください。Splunk Web UIのAppsセクションにあります。 +- Splunk WebにログインしてApps > Find More Appsに移動します。 +- 検索ボックスを使用してDB Connectを見つけます。 +- Splunk DB Connectの横の緑色の「Install」ボタンをクリックします。 +- 「Restart Splunk」をクリックします。 + +DB Connect Appのインストールに問題がある場合は、[こちらのリンク](https://splunkbase.splunk.com/app/2686)を参照して追加の指示を得てください。 + +DB Connect Appがインストールされていることを確認したら、java_homeパスをConfiguration -> SettingsでDB Connect Appに追加し、保存をクリックしてリセットします。 + +![Splunk 2](../images/splunk/splunk-2.png) + +## ClickHouse用のJDBCを設定する + +[ClickHouse JDBCドライバー](https://github.com/ClickHouse/clickhouse-java)をDB Connect Driversフォルダにダウンロードします: + +``` +$SPLUNK_HOME/etc/apps/splunk_app_db_connect/drivers +``` + +次に、ClickHouse JDBC Driverクラスの詳細を追加するために、`$SPLUNK_HOME/etc/apps/splunk_app_db_connect/default/db_connection_types.conf`ファイルで接続タイプの設定を編集する必要があります。 + +ファイルに次のセクションを追加します: + +``` +[ClickHouse] +displayName = ClickHouse +serviceClass = com.splunk.dbx2.DefaultDBX2JDBC +jdbcUrlFormat = jdbc:ch://:/ +jdbcUrlSSLFormat = jdbc:ch://:/?ssl=true +jdbcDriverClass = com.clickhouse.jdbc.ClickHouseDriver +ui_default_catalog = $database$ +``` + +`$SPLUNK_HOME/bin/splunk restart`を使ってSplunkを再起動します。 + +DB Connect Appに戻り、Configuration > Settings > Driversに移動します。ClickHouseの横に緑色のチェックマークが表示されているはずです: + +![Splunk 3](../images/splunk/splunk-3.png) + +## Splunk SearchをClickHouseに接続する + +DB Connect App Configuration -> Databases -> Identitiesに移動し、ClickHouseのIDを作成します。 + +Configuration -> Databases -> ConnectionsからClickHouseへの新しい接続を作成し、「New Connection」を選択します。 + + + +
+ +ClickHouseホストの詳細を追加し、「Enable SSL」にチェックを入れる: + +![Splunk 5](../images/splunk/splunk-5.png) + +接続を保存した後、SplunkにClickHouseに正常に接続されます! + +:::note +エラーが発生した場合は、SplunkインスタンスのIPアドレスがClickHouse Cloud IPアクセスリストに追加されていることを確認してください。詳細は[こちらのドキュメント](https://clickhouse.com/docs/ja/cloud/security/setting-ip-filters)を参照ください。 +::: + +## SQLクエリを実行する + +すべてが正常に動作するかテストするためにSQLクエリを実行します。 + +DB Connect AppのDataLabセクションからSQL Explorerで接続の詳細を選択します。このデモでは`trips`テーブルを使用します: + +![Splunk 6](../images/splunk/splunk-6.png) + +テーブル内のすべてのレコードのカウントを返すSQLクエリを`trips`テーブルで実行します: + +![Splunk 7](../images/splunk/splunk-7.png) + +クエリが成功した場合、結果が表示されるはずです。 + +## ダッシュボードを作成する + +SQLと強力なSplunk Processing Language (SPL)を組み合わせたダッシュボードを作成しましょう。 + +先に進む前に、まず[DPL Safeguardsを非アクティブ化](https://docs.splunk.com/Documentation/Splunk/9.2.1/Security/SPLsafeguards?ref=hk#Deactivate_SPL_safeguards)する必要があります。 + +最も頻繁にピックアップされたトップ10の地域を示す次のクエリを実行します: + +```sql +dbxquery query="SELECT pickup_ntaname, count(*) AS count +FROM default.trips GROUP BY pickup_ntaname +ORDER BY count DESC LIMIT 10;" connection="chc" +``` + +カラムチャートを作成するために可視化タブを選択します: + +![Splunk 8](../images/splunk/splunk-8.png) + +「Save As > Save to a Dashboard」をクリックしてダッシュボードを作成しましょう。 + +次に、乗客数に基づく平均料金を示すクエリを追加しましょう: + +```sql +dbxquery query="SELECT passenger_count,avg(total_amount) +FROM default.trips GROUP BY passenger_count;" connection="chc" +``` + +今回は、バーチャートの可視化を作成し、以前のダッシュボードに保存します。 + +![Splunk 9](../images/splunk/splunk-9.png) + +最後に、乗客数と旅行距離の相関を示すもう一つのクエリを追加します: + +```sql +dbxquery query="SELECT passenger_count, toYear(pickup_datetime) AS year, +round(trip_distance) AS distance, count(* FROM default.trips) +GROUP BY passenger_count, year, distance +ORDER BY year, count(*) DESC; " connection="chc" +``` + +最終的なダッシュボードは次のようになります: + +![Splunk 10](../images/splunk/splunk-10.png) + +## 時系列データ + +Splunkには、ダッシュボードで時系列データの可視化とプレゼンテーションに使用できる数百の組み込み関数があります。この例では、時系列データで動作するクエリをSplunkで作成するために、SQL + SPLを組み合わせます。 + +```sql +dbxquery query="SELECT time, orig_h, duration +FROM "demo"."conn" WHERE time >= now() - interval 1 HOURS" connection="chc" +| eval time = strptime(time, "%Y-%m-%d %H:%M:%S.%3Q") +| eval _time=time +| timechart avg(duration) as duration by orig_h +| eval duration=round(duration/60) +| sort - duration: +``` + +## 詳細を学ぶ + +Splunk DB Connectおよびダッシュボード構築に関する詳細情報をお探しの場合、[Splunkのドキュメント](https://docs.splunk.com/Documentation)をご覧ください。 diff --git a/docs/ja/integrations/data-visualization/superset-and-clickhouse.md b/docs/ja/integrations/data-visualization/superset-and-clickhouse.md new file mode 100644 index 00000000000..dbb06612e5a --- /dev/null +++ b/docs/ja/integrations/data-visualization/superset-and-clickhouse.md @@ -0,0 +1,100 @@ +--- +sidebar_label: Superset +sidebar_position: 198 +slug: /ja/integrations/superset +keywords: [clickhouse, superset, connect, integrate, ui] +description: Apache Supersetはオープンソースのデータ探索および視覚化プラットフォームです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# SupersetをClickHouseに接続する + +Apache Supersetは、Pythonで書かれたオープンソースのデータ探索および視覚化プラットフォームです。Supersetは、ClickHouseが提供するPythonドライバーを使用してClickHouseに接続します。それでは、その方法を見てみましょう... + +## 目的 + +このガイドでは、ClickHouseデータベースからデータを使用してSupersetでダッシュボードを作成します。ダッシュボードは次のようになります: + + New Dashboard +

+ +:::tip データを追加する +作業するデータセットがない場合は、例の1つを追加できます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用するので、それを選ぶこともできます。同じドキュメントカテゴリには他にもいくつかあります。 +::: + +## 1. 接続情報を収集する + + +## 2. ドライバをインストールする + +1. Supersetは`clickhouse-connect`ドライバーを使用してClickHouseに接続します。`clickhouse-connect`の詳細はhttps://pypi.org/project/clickhouse-connect/にあり、以下のコマンドでインストールできます: + + ```console + pip install clickhouse-connect + ``` + +2. Supersetを開始(または再起動)します。 + +## 3. SupersetをClickHouseに接続する + +1. Superset内で、上部メニューから**Data**を選択し、ドロップダウンメニューから**Databases**を選択します。**+ Database**ボタンをクリックして新しいデータベースを追加します: + + Add a new database + +2. 最初のステップでは、データベースのタイプとして**ClickHouse Connect**を選択します: + + Select ClickHouse + +3. 次のステップでは: + - SSLをオンまたはオフに設定します。 + - 先ほど収集した接続情報を入力します。 + - **DISPLAY NAME**を指定します。これは任意の名前にできます。複数のClickHouseデータベースに接続する場合は、名前をより説明的にします。 + + Test the connection + +4. **CONNECT**をクリックし、続けて**FINISH**ボタンをクリックしてセットアップウィザードを完了します。これで、データベースがデータベース一覧に表示されるはずです。 + +## 4. データセットを追加する + +1. SupersetでClickHouseのデータを操作するには、**_データセット_**を定義する必要があります。Supersetの上部メニューから**Data**を選択し、ドロップダウンメニューから**Datasets**を選択します。 + +2. データセットを追加するボタンをクリックします。データソースとして新しいデータベースを選択し、データベース内に定義されているテーブルが表示されます: + + New dataset + + +3. ダイアログウィンドウの下部にある**ADD**ボタンをクリックすると、テーブルがデータセットリストに表示されます。これでダッシュボードを作成してClickHouseデータを分析する準備が整いました! + + +## 5. Supersetでチャートとダッシュボードを作成する + +Supersetに慣れている場合、この次のセクションは簡単に感じるかもしれません。Supersetに初めて触れる方も、他の多くの視覚化ツールと似ており、始めるのに時間はかかりませんが、詳細と微妙な点は使用していく中で学んでいきます。 + +1. 最初にダッシュボードを作成します。Supersetの上部メニューから**Dashboards**を選択します。右上のボタンをクリックして新しいダッシュボードを追加します。次のダッシュボードは**UK property prices**という名前です: + + New dashboard + +2. 新しいチャートを作成するには、上部メニューから**Charts**を選択し、新しいチャートを追加するボタンをクリックします。多数のオプションが表示されます。次の例は、**uk_price_paid**データセットを使用した**Pie Chart**チャートを示しています: + + New chart + +3. Supersetの円グラフには、**Dimension**と**Metric**が必要で、他の設定はオプションです。次元とメトリックのフィールドを自分で選択でき、この例ではClickHouseフィールドの`district`を次元として、`AVG(price)`をメトリックとして使用しています。 + + The SUM metric + The SUM metric + +5. 円グラフではなくドーナツグラフを好む場合は、**CUSTOMIZE**でそれとその他のオプションを設定できます: + + Add Chart to Dashboard + +6. **SAVE**ボタンをクリックしてチャートを保存し、**ADD TO DASHBOARD**ドロップダウンから**UK property prices**を選び、**SAVE & GO TO DASHBOARD**を選択してチャートを保存し、ダッシュボードに追加します: + + Add Chart to Dashboard + +7. これで完了です。ClickHouseのデータに基づくSupersetでのダッシュボード作成は、非常に高速なデータ分析の世界を切り開きます! + + New Dashboard + +## 関連コンテンツ + +- ブログ: [ClickHouseでデータを視覚化する - Part 2 - Superset](https://clickhouse.com/blog/visualizing-data-with-superset) diff --git a/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md b/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md new file mode 100644 index 00000000000..6122be1cdf2 --- /dev/null +++ b/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md @@ -0,0 +1,126 @@ +--- +sidebar_label: Tableau +sidebar_position: 205 +slug: /ja/integrations/tableau +keywords: [clickhouse, tableau, 接続, 統合, ui] +description: Tableau は ClickHouse のデータベースとテーブルをデータソースとして使用できます。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Tableau と ClickHouse の接続 + +Tableau は ClickHouse のデータベースとテーブルをデータソースとして使用できます。これには、特別な JDBC ドライバーをダウンロードして、Tableau が見つけることができる特定の場所に保存する必要があります。 + +## 接続方法 + +1. 接続情報を収集します + + +2. Tableau デスクトップをダウンロードしてインストールします。 +3. 最新バージョンのclickhouse-tableau-connector-jdbc TACO コネクタをダウンロードします。 +4. TACO コネクタを次のフォルダに保存します(OS に基づく): + - macOS: `~/Documents/My Tableau Repository/Connectors` + - Windows: `C:\Users[Windows User]\Documents\My Tableau Repository\Connectors` +5. `clickhouse-tableau-connector-jdbc` の指示に従って、対応するバージョンのClickHouse JDBC ドライバー をダウンロードします。 + +:::note +必ず **clickhouse-jdbc-x.x.x-shaded.jar** JAR ファイルをダウンロードしてください。 +::: + +6. JDBC ドライバーを次のフォルダに保存します(OS に基づき、フォルダが存在しない場合は作成可能): + - macOS: `~/Library/Tableau/Drivers` + - Windows: `C:\Program Files\Tableau\Drivers` +7. Tableau で ClickHouse データソースを設定し、データビジュアライゼーションを始めましょう! + +## Tableau で ClickHouse データソースを設定 + +ドライバーとコネクタをマシン上の適切なフォルダに配置したので、ClickHouse の **TPCD** データベースに接続するデータソースを Tableau で定義する方法を見てみましょう。 + +1. Tableau を起動します。(すでに起動している場合は、再起動してください。) + +2. 左側のメニューから、**To a Server** セクションの **More** をクリックします。すべてが正常に動作している場合、インストール済みコネクタのリストに **ClickHouse JDBC** が表示されるはずです: + + ![ClickHouse JDBC](./images/tableau_connecttoserver.png) + +3. **ClickHouse JDBC** をクリックすると、ダイアログウィンドウが表示されます。接続情報を入力してください: + + | 設定 | 値 | + | ----------- | --------------------------------------------------- | + | サーバー | **w0vdp\**\**.europe-west4.gcp.clickhouse.cloud** | + | ポート | **8443** | + | データベース | **default** | + | ユーザー名 | **default** | + | パスワード | *\***** | + +:::note +ClickHouse cloud を使用する場合、安全な接続のために SSL チェックボックスを有効にする必要があります。 +::: +
+ +設定は次のようになります: + +!["ClickHouse Settings"](./images/tableau_clickhousesettings.png) + +:::note +私たちの ClickHouse データベースは **TPCD** と名付けられていますが、上記のダイアログでは **データベース** を **default** に設定し、次のステップで **スキーマ** に **TPCD** を選択する必要があります。(これはコネクタのバグによるものかもしれないので、この動作が変わる可能性がありますが、現在は **default** をデータベースとして使用しなければならない状況です。) +::: + +4. **Sign In** ボタンをクリックすると、新しい Tableau ワークブックが表示されるはずです: + + !["New Workbook"](./images/tableau_newworkbook.png) + +5. **スキーマ** ドロップダウンから **TPCD** を選択すると、**TPCD** 内のテーブルのリストが表示されます: + + !["Select TPCD for the Schema"](./images/tableau_tpcdschema.png) + +これで Tableau でのビジュアライゼーションの準備が整いました! + +## Tableau でのビジュアライゼーション作成 + +Tableau で ClickHouse データソースを設定したので、データを可視化してみましょう... + +1. **CUSTOMER** テーブルをワークブックにドラッグします。カラムは表示されますが、データテーブルは空のままです: + + ![""](./images/tableau_workbook1.png) + +2. **Update Now** ボタンをクリックすると、**CUSTOMER** から 100 行がテーブルに反映されます。 + +3. **ORDERS** テーブルをワークブックにドラッグし、**Custkey** を両テーブル間のリレーションシップフィールドとして設定します: + + ![""](./images/tableau_workbook2.png) + +4. これで **ORDERS** と **LINEITEM** テーブルがデータソースとして関連付けられ、データに関する質問を解決するためにこのリレーションシップを使用できます。ワークブック下部の **Sheet 1** タブを選択します。 + + ![""](./images/tableau_workbook3.png) + +5. 各年に注文された特定のアイテムの数量を知りたいとしましょう。**ORDERS** から **Orderdate** を **Columns** セクション(水平フィールド)にドラッグし、**LINEITEM** から **Quantity** を **Rows** にドラッグします。Tableau は以下の折れ線グラフを生成します: + + ![""](./images/tableau_workbook4.png) + +あまり興味深い折れ線グラフではありませんが、データセットはスクリプトによって生成され、クエリパフォーマンステスト用に構築されたため、TCPD データのシミュレートされた注文には変化があまり見られません。 + +6. 四半期ごと、および出荷モード(空輸、郵送、船舶、トラックなど)ごとの平均注文金額(ドル)を知りたいとしましょう: + + - **New Worksheet** タブをクリックして新しいシートを作成 + - **ORDERS** から **OrderDate** を **Columns** にドラッグし、**Year** から **Quarter** に変更 + - **LINEITEM** から **Shipmode** を **Rows** にドラッグ + +次のように表示されるはずです: + +![""](./images/tableau_workbook5.png) + +7. **Abc** の値は、メトリックをテーブルにドラッグするまでスペースを埋めるだけです。**ORDERS** から **Totalprice** をテーブルにドラッグします。デフォルトの計算は **SUM** され、**Totalpricess** が合計されます: + + ![""](./images/tableau_workbook6.png) + +8. **SUM** をクリックして、**Measure** を **Average** に変更します。同じドロップダウンメニューから **Format** を選択し、**Numbers** を **Currency (Standard)** に変更します: + + ![""](./images/tableau_workbook7.png) + + よくできました!Tableau を ClickHouse に接続し、ClickHouse データを分析・可視化するための可能性の全世界を開かれました。 + +:::note +Tableau は素晴らしいツールであり、ClickHouse との接続がスムーズであることを私たちは喜んでいます!Tableau を初めて使用する方は、ダッシュボードとビジュアライゼーションの構築に関するドキュメントを参照してください。 +::: + +**まとめ:** Tableau を ClickHouse に接続するには、一般的な ODBC/JDBC ClickHouse ドライバーを使用することが可能です。しかし、このコネクタは接続設定プロセスを簡素化します。コネクタに問題がある場合は、GitHubでお気軽にお問い合わせください。 diff --git a/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md b/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md new file mode 100644 index 00000000000..e6418520dbf --- /dev/null +++ b/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md @@ -0,0 +1,88 @@ +--- +sidebar_label: Tableau Online +slug: /ja/integrations/tableau-online +keywords: [clickhouse, tableau, online, mysql, connect, integrate, ui] +description: Tableau Onlineは、どこからでも人々がより早く、より自信を持って意思決定できるよう、データの力を簡素化します。 +--- + +import MySQLCloudSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx'; +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# Tableau Online + +Tableau Onlineは、公式のMySQLデータソースを使用して、MySQLインターフェース経由でClickHouse CloudまたはオンプレミスのClickHouseセットアップに接続できます。 + +## ClickHouse Cloud セットアップ + + +## オンプレミスのClickHouse サーバーセットアップ + + +## Tableau OnlineからClickHouseに接続する(SSLなしオンプレミスの場合) + +Tableau Cloudサイトにログインし、新しい公開データソースを追加します。 + +Creating a new published data source +
+ +利用可能なコネクタのリストから「MySQL」を選択します。 + +Selecting MySQL connector +
+ +ClickHouseのセットアップ中に収集した接続情報を指定します。 + +Specifying your connection details +
+ +Tableau Onlineはデータベースを調べ、利用可能なテーブルのリストを提供します。目的のテーブルを右側のキャンバスにドラッグします。さらに、「今すぐ更新」をクリックしてデータをプレビューしたり、調査したフィールドのタイプや名前を微調整することもできます。 + +Selecting the tables to use +
+ +その後、右上の「Publish As」をクリックすれば、新しく作成したデータセットをTableau Onlineで通常通り使用できるようになります。 + +注:Tableau OnlineをTableau Desktopと組み合わせて使用し、ClickHouseデータセットを共有する場合は、こちらに表示されるセットアップガイドに従い、デフォルトのMySQLコネクタを使用するTableau Desktopを使用することを確認してください。[こちら](https://www.tableau.com/support/drivers)のデータソースドロップダウンでMySQLを選択した場合のみ表示されます。また、M1 Macをお使いの方は、[こちらのトラブルシューティングスレッド](https://community.tableau.com/s/question/0D58b0000Ar6OhvCQE/unable-to-install-mysql-driver-for-m1-mac)でドライバインストールの方法を確認してください。 + +## Tableau OnlineからClickHouseに接続する(CloudまたはオンプレミスセットアップでSSL使用) + +Tableau OnlineのMySQL接続設定ウィザードではSSL証明書を提供することができないため、接続設定はTableau Desktopを使用して行い、それをTableau Onlineにエクスポートする必要があります。このプロセスは比較的簡単です。 + +WindowsまたはMacマシンでTableau Desktopを実行し、「接続」->「サーバーに接続」->「MySQL」を選択します。 +おそらく、最初にマシンにMySQLドライバをインストールする必要があります。[こちら](https://www.tableau.com/support/drivers)のデータソースドロップダウンでMySQLを選択した場合に表示されるセットアップガイドに従ってください。また、M1 Macをお使いの方は、[こちらのトラブルシューティングスレッド](https://community.tableau.com/s/question/0D58b0000Ar6OhvCQE/unable-to-install-mysql-driver-for-m1-mac)でドライバインストールの方法を確認してください。 + +Create a new data source +
+ +:::note +MySQL接続設定画面で、「SSL」オプションが有効になっていることを確認してください。 +ClickHouse CloudのSSL証明書は、[LetsEncrypt](https://letsencrypt.org/certificates/)によって署名されています。 +このルート証明書を[こちら](https://letsencrypt.org/certs/isrgrootx1.pem)からダウンロードできます。 +::: + +ClickHouse CloudインスタンスのMySQLユーザー資格情報と、ダウンロードしたルート証明書へのパスを提供します。 + +Specifying your credentials +
+ +通常通り、目的のテーブルを選択し(Tableau Onlineと同様)、サーバー -> データソースの公開 -> Tableau Cloudを選択します。 + +Publish data source +
+ +重要:認証オプションで「埋め込みパスワード」を選択する必要があります。 + +Data source publishing settings - embedding your credentials +
+ +さらに、「発行したデータソースを使用するようにワークブックを更新」を選択します。 + +Data source publishing settings - updating the workbook for online usage +
+ +最後に「発行」をクリックすると、埋め込まれた資格情報を持つデータソースがTableau Onlineで自動的に開かれます。 + + +## 既知の制限事項 (ClickHouse 23.11) + +既知の制限事項はすべてClickHouse `23.11`で修正されています。他の互換性の問題が発生した場合は、[こちら](https://clickhouse.com/company/contact)からご連絡いただくか、新しい[問題を作成](https://github.com/ClickHouse/ClickHouse/issues)してください。 diff --git a/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md b/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md new file mode 100644 index 00000000000..a58aba52dee --- /dev/null +++ b/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md @@ -0,0 +1,73 @@ +--- +sidebar_label: Zing Data +sidebar_position: 206 +slug: /ja/integrations/zingdata +keywords: [clickhouse, zingdata, connect, integrate, ui] +description: Zing DataはiOS、Android、ウェブ用に作られた、ClickHouse向けのシンプルなソーシャルビジネスインテリジェンスです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Zing DataをClickHouseに接続する + +Zing Dataは、データの探索と視覚化のためのプラットフォームです。Zing Dataは、ClickHouseが提供するJSドライバーを使用してClickHouseに接続します。 + +## 接続方法 +1. 接続情報を集めます。 + + +2. Zing Dataをダウンロードまたは訪問します。 + + * モバイルでZing Dataを使用するには、[Google Play Store](https://play.google.com/store/apps/details?id=com.getzingdata.android)または[Apple App Store](https://apps.apple.com/us/app/zing-data-collaborative-bi/id1563294091)からZing Dataアプリをダウンロードしてください。 + + * ウェブでZing Dataを使用するには、[Zing Webコンソール](https://console.getzingdata.com/)を訪問し、アカウントを作成します。 + +3. データソースを追加する + + * Zing DataとClickHouseデータを操作するためには、**_データソース_**を定義する必要があります。Zing Dataのモバイルアプリメニューで**Sources**を選択し、**Add a Datasource**をクリックします。 + + * ウェブでデータソースを追加するには、トップメニューの**Data Sources**をクリックし、**New Datasource**をクリックし、ドロップダウンメニューから**Clickhouse**を選択します。 + + ![""](./images/zing_01.png) + +4. 接続情報を入力し、**Check Connection**をクリックします。 + + ![](./images/zing_02.png) + +5. 接続が成功すると、Zingはテーブル選択画面に進みます。必要なテーブルを選択して**Save**をクリックします。Zingがデータソースに接続できない場合、資格情報を確認して再試行するようメッセージが表示されます。資格情報を確認して再試行しても問題が解決しない場合は、ここからZingサポートに連絡してください。 + + ![""](./images/zing_03.png) + +6. ClickHouseデータソースが追加されると、**Data Sources** / **Sources** タブの下で、Zing組織内のすべての人が利用可能になります。 + +## Zing Dataでのチャートとダッシュボードの作成 + +1. ClickHouseデータソースが追加された後、ウェブの**Zing App**をクリックするか、モバイルでデータソースをクリックしてチャートの作成を開始します。 + +2. チャートを作成するために、テーブルリストの中から任意のテーブルをクリックします。 + + ![""](./images/zing_04.png) + +3. 視覚的クエリ ビルダーを使用して、必要なフィールド、集計などを選び、**Run Question**をクリックします。 + + ![""](./images/zing_05.png) + +4. SQLに詳しい場合は、カスタムSQLを書くことでクエリを実行しチャートを作成することもできます。 + + ![""](./images/zing_06.png) + + ![""](./images/zing_07.png) + +5. チャートの例は以下のようになります。 質問は三点メニューを使って保存できます。チャートにコメントしたり、チームメンバーをタグ付けしたり、リアルタイムアラートを作成したり、チャートタイプを変更したりできます。 + + ![""](./images/zing_08.png) + +6. ダッシュボードはホーム画面の**Dashboards**の下にある「+」アイコンを使用して作成できます。既存の質問をドラッグして、ダッシュボードに表示することができます。 + + ![""](./images/zing_09.png) + +## 関連コンテンツ + +- ブログ: [ClickHouseでデータを視覚化する - Zing Data](https://getzingdata.com/blog/zing-adds-support-for-clickhouse-as-a-data-source/) +- [ドキュメント](https://docs.getzingdata.com/docs/) +- [クイックスタート](https://getzingdata.com/quickstart/) +- ダッシュボード作成ガイド [Create Dashboards](https://getzingdata.com/blog/new-feature-create-multi-question-dashboards/) diff --git a/docs/ja/integrations/deployment/easypanel/index.md b/docs/ja/integrations/deployment/easypanel/index.md new file mode 100644 index 00000000000..c10f9802286 --- /dev/null +++ b/docs/ja/integrations/deployment/easypanel/index.md @@ -0,0 +1,18 @@ +--- +sidebar_label: Easypanel +slug: /ja/integrations/easypanel +keywords: [clickhouse, easypanel, deployment, integrate, install] +description: 独自のサーバーにClickHouseをデプロイするために使用できます。 +--- +# EasypanelでClickHouseをデプロイする + +[Easypanel](https://easypanel.io)は、最新のサーバー管理パネルです。これを使用して、独自のサーバーにClickHouseをデプロイすることができます。 + +[![Deploy to Easypanel](https://easypanel.io/img/deploy-on-easypanel-40.svg)](https://easypanel.io/docs/templates/clickhouse) + +## 手順 + +1. クラウドプロバイダーでUbuntuを実行するVMを作成します。 +2. ウェブサイトの手順に従ってEasypanelをインストールします。 +3. 新しいプロジェクトを作成します。 +4. 専用のテンプレートを使用してClickHouseをインストールします。 diff --git a/docs/ja/integrations/images/logos/Apache_Spark_logo.svg b/docs/ja/integrations/images/logos/Apache_Spark_logo.svg new file mode 100644 index 00000000000..4fe9de52151 --- /dev/null +++ b/docs/ja/integrations/images/logos/Apache_Spark_logo.svg @@ -0,0 +1,13 @@ + + +Apache Spark logo + + + + image/svg+xml + + + + + + diff --git a/docs/ja/integrations/images/logos/Node.js_logo.svg b/docs/ja/integrations/images/logos/Node.js_logo.svg new file mode 100644 index 00000000000..96e278d43ca --- /dev/null +++ b/docs/ja/integrations/images/logos/Node.js_logo.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/Python-logo-notext.svg b/docs/ja/integrations/images/logos/Python-logo-notext.svg new file mode 100644 index 00000000000..c5b0258bb57 --- /dev/null +++ b/docs/ja/integrations/images/logos/Python-logo-notext.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/acceldata_logo.png b/docs/ja/integrations/images/logos/acceldata_logo.png new file mode 100644 index 00000000000..e0bc5ffde26 Binary files /dev/null and b/docs/ja/integrations/images/logos/acceldata_logo.png differ diff --git a/docs/ja/integrations/images/logos/adaptive_logo.png b/docs/ja/integrations/images/logos/adaptive_logo.png new file mode 100644 index 00000000000..07b69a05dd6 Binary files /dev/null and b/docs/ja/integrations/images/logos/adaptive_logo.png differ diff --git a/docs/ja/integrations/images/logos/airbyte-logo.png b/docs/ja/integrations/images/logos/airbyte-logo.png new file mode 100644 index 00000000000..4b79d89d62c Binary files /dev/null and b/docs/ja/integrations/images/logos/airbyte-logo.png differ diff --git a/docs/ja/integrations/images/logos/airbyte.svg b/docs/ja/integrations/images/logos/airbyte.svg new file mode 100644 index 00000000000..d9604d75cca --- /dev/null +++ b/docs/ja/integrations/images/logos/airbyte.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/airbyte_logo.png b/docs/ja/integrations/images/logos/airbyte_logo.png new file mode 100644 index 00000000000..de5b32da690 Binary files /dev/null and b/docs/ja/integrations/images/logos/airbyte_logo.png differ diff --git a/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg b/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg new file mode 100644 index 00000000000..c848407b742 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/amazon_msk.svg b/docs/ja/integrations/images/logos/amazon_msk.svg new file mode 100644 index 00000000000..c4ba73a0e63 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_msk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/amazon_redshift.png b/docs/ja/integrations/images/logos/amazon_redshift.png new file mode 100644 index 00000000000..0d4e42f8aa4 Binary files /dev/null and b/docs/ja/integrations/images/logos/amazon_redshift.png differ diff --git a/docs/ja/integrations/images/logos/amazon_s3_logo.png b/docs/ja/integrations/images/logos/amazon_s3_logo.png new file mode 100644 index 00000000000..91e007c0b59 Binary files /dev/null and b/docs/ja/integrations/images/logos/amazon_s3_logo.png differ diff --git a/docs/ja/integrations/images/logos/amazon_s3_logo.svg b/docs/ja/integrations/images/logos/amazon_s3_logo.svg new file mode 100644 index 00000000000..725199615b6 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_s3_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/apache-spark.png b/docs/ja/integrations/images/logos/apache-spark.png new file mode 100644 index 00000000000..619f4d0b54a Binary files /dev/null and b/docs/ja/integrations/images/logos/apache-spark.png differ diff --git a/docs/ja/integrations/images/logos/apache-streampark.png b/docs/ja/integrations/images/logos/apache-streampark.png new file mode 100644 index 00000000000..1bb845979ee Binary files /dev/null and b/docs/ja/integrations/images/logos/apache-streampark.png differ diff --git a/docs/ja/integrations/images/logos/atlas-logo.png b/docs/ja/integrations/images/logos/atlas-logo.png new file mode 100644 index 00000000000..880b918f469 Binary files /dev/null and b/docs/ja/integrations/images/logos/atlas-logo.png differ diff --git a/docs/ja/integrations/images/logos/automq.png b/docs/ja/integrations/images/logos/automq.png new file mode 100644 index 00000000000..d02521472e4 Binary files /dev/null and b/docs/ja/integrations/images/logos/automq.png differ diff --git a/docs/ja/integrations/images/logos/azure_event_hubs.svg b/docs/ja/integrations/images/logos/azure_event_hubs.svg new file mode 100644 index 00000000000..540f89c6b43 --- /dev/null +++ b/docs/ja/integrations/images/logos/azure_event_hubs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/blinkops_logo.png b/docs/ja/integrations/images/logos/blinkops_logo.png new file mode 100644 index 00000000000..32b40cdc358 Binary files /dev/null and b/docs/ja/integrations/images/logos/blinkops_logo.png differ diff --git a/docs/ja/integrations/images/logos/bytewax.svg b/docs/ja/integrations/images/logos/bytewax.svg new file mode 100644 index 00000000000..9ddaeaa60a0 --- /dev/null +++ b/docs/ja/integrations/images/logos/bytewax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/cassandra.png b/docs/ja/integrations/images/logos/cassandra.png new file mode 100644 index 00000000000..6e23e5d35f6 Binary files /dev/null and b/docs/ja/integrations/images/logos/cassandra.png differ diff --git a/docs/ja/integrations/images/logos/chdb.svg b/docs/ja/integrations/images/logos/chdb.svg new file mode 100644 index 00000000000..f72e534eecc --- /dev/null +++ b/docs/ja/integrations/images/logos/chdb.svg @@ -0,0 +1,168 @@ + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clickhouse-cl.png b/docs/ja/integrations/images/logos/clickhouse-cl.png new file mode 100644 index 00000000000..41bd16c7132 Binary files /dev/null and b/docs/ja/integrations/images/logos/clickhouse-cl.png differ diff --git a/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg b/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg new file mode 100644 index 00000000000..d5c3ac793f2 --- /dev/null +++ b/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clickhouse.svg b/docs/ja/integrations/images/logos/clickhouse.svg new file mode 100644 index 00000000000..adea893c397 --- /dev/null +++ b/docs/ja/integrations/images/logos/clickhouse.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/ja/integrations/images/logos/cloudquery_logo.svg b/docs/ja/integrations/images/logos/cloudquery_logo.svg new file mode 100644 index 00000000000..7a46be2aa6a --- /dev/null +++ b/docs/ja/integrations/images/logos/cloudquery_logo.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clougence.svg b/docs/ja/integrations/images/logos/clougence.svg new file mode 100644 index 00000000000..739a38a7db0 --- /dev/null +++ b/docs/ja/integrations/images/logos/clougence.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/confluent.svg b/docs/ja/integrations/images/logos/confluent.svg new file mode 100644 index 00000000000..51fba858d1b --- /dev/null +++ b/docs/ja/integrations/images/logos/confluent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/confluent_alt.svg b/docs/ja/integrations/images/logos/confluent_alt.svg new file mode 100644 index 00000000000..06bc03da60c --- /dev/null +++ b/docs/ja/integrations/images/logos/confluent_alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/csharp.svg b/docs/ja/integrations/images/logos/csharp.svg new file mode 100644 index 00000000000..f33e2d24538 --- /dev/null +++ b/docs/ja/integrations/images/logos/csharp.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/cubejs.svg b/docs/ja/integrations/images/logos/cubejs.svg new file mode 100644 index 00000000000..a1896d4a4a2 --- /dev/null +++ b/docs/ja/integrations/images/logos/cubejs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/data_grip.svg b/docs/ja/integrations/images/logos/data_grip.svg new file mode 100644 index 00000000000..c2b969968c0 --- /dev/null +++ b/docs/ja/integrations/images/logos/data_grip.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/dataease.png b/docs/ja/integrations/images/logos/dataease.png new file mode 100644 index 00000000000..5cfc76805e1 Binary files /dev/null and b/docs/ja/integrations/images/logos/dataease.png differ diff --git a/docs/ja/integrations/images/logos/datalens.png b/docs/ja/integrations/images/logos/datalens.png new file mode 100644 index 00000000000..d333cc345ac Binary files /dev/null and b/docs/ja/integrations/images/logos/datalens.png differ diff --git a/docs/ja/integrations/images/logos/dbeaver_logo.svg b/docs/ja/integrations/images/logos/dbeaver_logo.svg new file mode 100644 index 00000000000..f55e363df7a --- /dev/null +++ b/docs/ja/integrations/images/logos/dbeaver_logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/dbnet_logo.png b/docs/ja/integrations/images/logos/dbnet_logo.png new file mode 100644 index 00000000000..5efc05149cc Binary files /dev/null and b/docs/ja/integrations/images/logos/dbnet_logo.png differ diff --git a/docs/ja/integrations/images/logos/dbt.svg b/docs/ja/integrations/images/logos/dbt.svg new file mode 100644 index 00000000000..1e764ec4431 --- /dev/null +++ b/docs/ja/integrations/images/logos/dbt.svg @@ -0,0 +1,7 @@ + + + dbt + + + + diff --git a/docs/ja/integrations/images/logos/deep.png b/docs/ja/integrations/images/logos/deep.png new file mode 100644 index 00000000000..06f11c096c2 Binary files /dev/null and b/docs/ja/integrations/images/logos/deep.png differ diff --git a/docs/ja/integrations/images/logos/deepnote.svg b/docs/ja/integrations/images/logos/deepnote.svg new file mode 100644 index 00000000000..e0b8a4ac3b6 --- /dev/null +++ b/docs/ja/integrations/images/logos/deepnote.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/deltalake.png b/docs/ja/integrations/images/logos/deltalake.png new file mode 100644 index 00000000000..50287219024 Binary files /dev/null and b/docs/ja/integrations/images/logos/deltalake.png differ diff --git a/docs/ja/integrations/images/logos/dlthub_logo.svg b/docs/ja/integrations/images/logos/dlthub_logo.svg new file mode 100644 index 00000000000..db4bfa843be --- /dev/null +++ b/docs/ja/integrations/images/logos/dlthub_logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/draxlr.svg b/docs/ja/integrations/images/logos/draxlr.svg new file mode 100644 index 00000000000..2c468296edf --- /dev/null +++ b/docs/ja/integrations/images/logos/draxlr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/emqx.svg b/docs/ja/integrations/images/logos/emqx.svg new file mode 100644 index 00000000000..1b849cc76dd --- /dev/null +++ b/docs/ja/integrations/images/logos/emqx.svg @@ -0,0 +1,14 @@ + + + 320备份 + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/explo.png b/docs/ja/integrations/images/logos/explo.png new file mode 100644 index 00000000000..09d6fa12461 Binary files /dev/null and b/docs/ja/integrations/images/logos/explo.png differ diff --git a/docs/ja/integrations/images/logos/explo.svg b/docs/ja/integrations/images/logos/explo.svg new file mode 100644 index 00000000000..a2099e42eaf --- /dev/null +++ b/docs/ja/integrations/images/logos/explo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/fivetran.svg b/docs/ja/integrations/images/logos/fivetran.svg new file mode 100644 index 00000000000..33747d0ed88 --- /dev/null +++ b/docs/ja/integrations/images/logos/fivetran.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/gcs.svg b/docs/ja/integrations/images/logos/gcs.svg new file mode 100644 index 00000000000..afc4aaea59a --- /dev/null +++ b/docs/ja/integrations/images/logos/gcs.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/gigasheet.png b/docs/ja/integrations/images/logos/gigasheet.png new file mode 100644 index 00000000000..b90610047e3 Binary files /dev/null and b/docs/ja/integrations/images/logos/gigasheet.png differ diff --git a/docs/ja/integrations/images/logos/glassflow.svg b/docs/ja/integrations/images/logos/glassflow.svg new file mode 100644 index 00000000000..1f674071763 --- /dev/null +++ b/docs/ja/integrations/images/logos/glassflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/glue_logo.png b/docs/ja/integrations/images/logos/glue_logo.png new file mode 100644 index 00000000000..f076f4190af Binary files /dev/null and b/docs/ja/integrations/images/logos/glue_logo.png differ diff --git a/docs/ja/integrations/images/logos/golang.svg b/docs/ja/integrations/images/logos/golang.svg new file mode 100644 index 00000000000..c103808b45e --- /dev/null +++ b/docs/ja/integrations/images/logos/golang.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/goldsky.webp b/docs/ja/integrations/images/logos/goldsky.webp new file mode 100644 index 00000000000..3ea03458cc3 Binary files /dev/null and b/docs/ja/integrations/images/logos/goldsky.webp differ diff --git a/docs/ja/integrations/images/logos/goose_logo.png b/docs/ja/integrations/images/logos/goose_logo.png new file mode 100644 index 00000000000..470c5d9eb9d Binary files /dev/null and b/docs/ja/integrations/images/logos/goose_logo.png differ diff --git a/docs/ja/integrations/images/logos/grafana.svg b/docs/ja/integrations/images/logos/grafana.svg new file mode 100644 index 00000000000..c78f1104906 --- /dev/null +++ b/docs/ja/integrations/images/logos/grafana.svg @@ -0,0 +1,191 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/great-expectations.webp b/docs/ja/integrations/images/logos/great-expectations.webp new file mode 100644 index 00000000000..f6588b5e6db Binary files /dev/null and b/docs/ja/integrations/images/logos/great-expectations.webp differ diff --git a/docs/ja/integrations/images/logos/hadoop.svg b/docs/ja/integrations/images/logos/hadoop.svg new file mode 100644 index 00000000000..c1ce75ade0f --- /dev/null +++ b/docs/ja/integrations/images/logos/hadoop.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/hashboard.svg b/docs/ja/integrations/images/logos/hashboard.svg new file mode 100644 index 00000000000..969b33d86fa --- /dev/null +++ b/docs/ja/integrations/images/logos/hashboard.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/hive.svg b/docs/ja/integrations/images/logos/hive.svg new file mode 100644 index 00000000000..d271b347ad2 --- /dev/null +++ b/docs/ja/integrations/images/logos/hive.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/housewatch.png b/docs/ja/integrations/images/logos/housewatch.png new file mode 100644 index 00000000000..d16da2ea3f1 Binary files /dev/null and b/docs/ja/integrations/images/logos/housewatch.png differ diff --git a/docs/ja/integrations/images/logos/hudi.png b/docs/ja/integrations/images/logos/hudi.png new file mode 100644 index 00000000000..43bbdf0b7e6 Binary files /dev/null and b/docs/ja/integrations/images/logos/hudi.png differ diff --git a/docs/ja/integrations/images/logos/iceberg.png b/docs/ja/integrations/images/logos/iceberg.png new file mode 100644 index 00000000000..bae0f2a9175 Binary files /dev/null and b/docs/ja/integrations/images/logos/iceberg.png differ diff --git a/docs/ja/integrations/images/logos/java.svg b/docs/ja/integrations/images/logos/java.svg new file mode 100644 index 00000000000..a266da82834 --- /dev/null +++ b/docs/ja/integrations/images/logos/java.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/ja/integrations/images/logos/jdbc.svg b/docs/ja/integrations/images/logos/jdbc.svg new file mode 100644 index 00000000000..433302a9e56 --- /dev/null +++ b/docs/ja/integrations/images/logos/jdbc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/jitsu.svg b/docs/ja/integrations/images/logos/jitsu.svg new file mode 100644 index 00000000000..4488ec3aca6 --- /dev/null +++ b/docs/ja/integrations/images/logos/jitsu.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/jupyter.png b/docs/ja/integrations/images/logos/jupyter.png new file mode 100644 index 00000000000..e7a34e2c832 Binary files /dev/null and b/docs/ja/integrations/images/logos/jupyter.png differ diff --git a/docs/ja/integrations/images/logos/kafka.svg b/docs/ja/integrations/images/logos/kafka.svg new file mode 100644 index 00000000000..0f125035551 --- /dev/null +++ b/docs/ja/integrations/images/logos/kafka.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/kestra.svg b/docs/ja/integrations/images/logos/kestra.svg new file mode 100644 index 00000000000..aa30c11077e --- /dev/null +++ b/docs/ja/integrations/images/logos/kestra.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/logo-easypanel.png b/docs/ja/integrations/images/logos/logo-easypanel.png new file mode 100644 index 00000000000..ea909e265ed Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-easypanel.png differ diff --git a/docs/ja/integrations/images/logos/logo-hex.png b/docs/ja/integrations/images/logos/logo-hex.png new file mode 100644 index 00000000000..60e01dff4e1 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-hex.png differ diff --git a/docs/ja/integrations/images/logos/logo-vulcansql.png b/docs/ja/integrations/images/logos/logo-vulcansql.png new file mode 100644 index 00000000000..37dfdf59e21 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-vulcansql.png differ diff --git a/docs/ja/integrations/images/logos/logo_airflow.png b/docs/ja/integrations/images/logos/logo_airflow.png new file mode 100644 index 00000000000..ec97d14b737 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_airflow.png differ diff --git a/docs/ja/integrations/images/logos/logo_beam.png b/docs/ja/integrations/images/logos/logo_beam.png new file mode 100644 index 00000000000..2921261a91c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_beam.png differ diff --git a/docs/ja/integrations/images/logos/logo_bytebase.png b/docs/ja/integrations/images/logos/logo_bytebase.png new file mode 100644 index 00000000000..12fba79ef96 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_bytebase.png differ diff --git a/docs/ja/integrations/images/logos/logo_calyptia.png b/docs/ja/integrations/images/logos/logo_calyptia.png new file mode 100644 index 00000000000..4fef01c12a6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_calyptia.png differ diff --git a/docs/ja/integrations/images/logos/logo_cpp.png b/docs/ja/integrations/images/logos/logo_cpp.png new file mode 100644 index 00000000000..38d99684e06 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_cpp.png differ diff --git a/docs/ja/integrations/images/logos/logo_dataddo.png b/docs/ja/integrations/images/logos/logo_dataddo.png new file mode 100644 index 00000000000..1f6af662622 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_dataddo.png differ diff --git a/docs/ja/integrations/images/logos/logo_datahub.png b/docs/ja/integrations/images/logos/logo_datahub.png new file mode 100644 index 00000000000..64e84f7446a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_datahub.png differ diff --git a/docs/ja/integrations/images/logos/logo_dbvisualizer.png b/docs/ja/integrations/images/logos/logo_dbvisualizer.png new file mode 100644 index 00000000000..318362b081b Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_dbvisualizer.png differ diff --git a/docs/ja/integrations/images/logos/logo_decodable.png b/docs/ja/integrations/images/logos/logo_decodable.png new file mode 100644 index 00000000000..9defd326095 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_decodable.png differ diff --git a/docs/ja/integrations/images/logos/logo_deepflow.png b/docs/ja/integrations/images/logos/logo_deepflow.png new file mode 100644 index 00000000000..fd8201698f2 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_deepflow.png differ diff --git a/docs/ja/integrations/images/logos/logo_flink.png b/docs/ja/integrations/images/logos/logo_flink.png new file mode 100644 index 00000000000..ff83420f927 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_flink.png differ diff --git a/docs/ja/integrations/images/logos/logo_growthbook.png b/docs/ja/integrations/images/logos/logo_growthbook.png new file mode 100644 index 00000000000..c879a317f17 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_growthbook.png differ diff --git a/docs/ja/integrations/images/logos/logo_hightouch.png b/docs/ja/integrations/images/logos/logo_hightouch.png new file mode 100644 index 00000000000..492617c2415 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_hightouch.png differ diff --git a/docs/ja/integrations/images/logos/logo_holistics.png b/docs/ja/integrations/images/logos/logo_holistics.png new file mode 100644 index 00000000000..d41367dfb2f Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_holistics.png differ diff --git a/docs/ja/integrations/images/logos/logo_ibis.png b/docs/ja/integrations/images/logos/logo_ibis.png new file mode 100644 index 00000000000..515804f12bd Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_ibis.png differ diff --git a/docs/ja/integrations/images/logos/logo_inlong.png b/docs/ja/integrations/images/logos/logo_inlong.png new file mode 100644 index 00000000000..293aa09e065 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_inlong.png differ diff --git a/docs/ja/integrations/images/logos/logo_jaeger.png b/docs/ja/integrations/images/logos/logo_jaeger.png new file mode 100644 index 00000000000..b98e5b053d5 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_jaeger.png differ diff --git a/docs/ja/integrations/images/logos/logo_metabase.png b/docs/ja/integrations/images/logos/logo_metabase.png new file mode 100644 index 00000000000..2ee7383aa6a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_metabase.png differ diff --git a/docs/ja/integrations/images/logos/logo_metaplane.png b/docs/ja/integrations/images/logos/logo_metaplane.png new file mode 100644 index 00000000000..8811d257e1c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_metaplane.png differ diff --git a/docs/ja/integrations/images/logos/logo_mindsdb.png b/docs/ja/integrations/images/logos/logo_mindsdb.png new file mode 100644 index 00000000000..eb54d13e910 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mindsdb.png differ diff --git a/docs/ja/integrations/images/logos/logo_mitzu.png b/docs/ja/integrations/images/logos/logo_mitzu.png new file mode 100644 index 00000000000..8484a06b063 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mitzu.png differ diff --git a/docs/ja/integrations/images/logos/logo_mode.png b/docs/ja/integrations/images/logos/logo_mode.png new file mode 100644 index 00000000000..7fa819fa338 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mode.png differ diff --git a/docs/ja/integrations/images/logos/logo_mprove.png b/docs/ja/integrations/images/logos/logo_mprove.png new file mode 100644 index 00000000000..d4ab40947f0 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mprove.png differ diff --git a/docs/ja/integrations/images/logos/logo_nifi.png b/docs/ja/integrations/images/logos/logo_nifi.png new file mode 100644 index 00000000000..d8707bf11f9 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_nifi.png differ diff --git a/docs/ja/integrations/images/logos/logo_openBlocks.png b/docs/ja/integrations/images/logos/logo_openBlocks.png new file mode 100644 index 00000000000..2db869632c6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_openBlocks.png differ diff --git a/docs/ja/integrations/images/logos/logo_otel.png b/docs/ja/integrations/images/logos/logo_otel.png new file mode 100644 index 00000000000..62dc3426bcb Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_otel.png differ diff --git a/docs/ja/integrations/images/logos/logo_peerdb.jpg b/docs/ja/integrations/images/logos/logo_peerdb.jpg new file mode 100644 index 00000000000..1bb79bb37e6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_peerdb.jpg differ diff --git a/docs/ja/integrations/images/logos/logo_php.png b/docs/ja/integrations/images/logos/logo_php.png new file mode 100644 index 00000000000..21045d41067 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_php.png differ diff --git a/docs/ja/integrations/images/logos/logo_qryn.png b/docs/ja/integrations/images/logos/logo_qryn.png new file mode 100644 index 00000000000..12997b2fa5b Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_qryn.png differ diff --git a/docs/ja/integrations/images/logos/logo_r.png b/docs/ja/integrations/images/logos/logo_r.png new file mode 100644 index 00000000000..12694661597 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_r.png differ diff --git a/docs/ja/integrations/images/logos/logo_redash.png b/docs/ja/integrations/images/logos/logo_redash.png new file mode 100644 index 00000000000..1bfd80d7635 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_redash.png differ diff --git a/docs/ja/integrations/images/logos/logo_redpanda.png b/docs/ja/integrations/images/logos/logo_redpanda.png new file mode 100644 index 00000000000..f62aa4928d0 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_redpanda.png differ diff --git a/docs/ja/integrations/images/logos/logo_ruby.png b/docs/ja/integrations/images/logos/logo_ruby.png new file mode 100644 index 00000000000..a4b78fcea7c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_ruby.png differ diff --git a/docs/ja/integrations/images/logos/logo_rust.png b/docs/ja/integrations/images/logos/logo_rust.png new file mode 100644 index 00000000000..e3d6e9095af Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_rust.png differ diff --git a/docs/ja/integrations/images/logos/logo_scala.png b/docs/ja/integrations/images/logos/logo_scala.png new file mode 100644 index 00000000000..bd0498d9103 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_scala.png differ diff --git a/docs/ja/integrations/images/logos/logo_schemaspy.png b/docs/ja/integrations/images/logos/logo_schemaspy.png new file mode 100644 index 00000000000..b6b2ad7596a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_schemaspy.png differ diff --git a/docs/ja/integrations/images/logos/logo_seatunnel.png b/docs/ja/integrations/images/logos/logo_seatunnel.png new file mode 100644 index 00000000000..cc80d5090db Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_seatunnel.png differ diff --git a/docs/ja/integrations/images/logos/logo_sisense.png b/docs/ja/integrations/images/logos/logo_sisense.png new file mode 100644 index 00000000000..728451df802 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_sisense.png differ diff --git a/docs/ja/integrations/images/logos/logo_supabase.png b/docs/ja/integrations/images/logos/logo_supabase.png new file mode 100644 index 00000000000..843be59ca50 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_supabase.png differ diff --git a/docs/ja/integrations/images/logos/logo_tableau.png b/docs/ja/integrations/images/logos/logo_tableau.png new file mode 100644 index 00000000000..f59982b3404 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_tableau.png differ diff --git a/docs/ja/integrations/images/logos/logo_vs.png b/docs/ja/integrations/images/logos/logo_vs.png new file mode 100644 index 00000000000..40199ddbedd Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_vs.png differ diff --git a/docs/ja/integrations/images/logos/looker.svg b/docs/ja/integrations/images/logos/looker.svg new file mode 100644 index 00000000000..8ed1a7cb443 --- /dev/null +++ b/docs/ja/integrations/images/logos/looker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/looker_studio.svg b/docs/ja/integrations/images/logos/looker_studio.svg new file mode 100644 index 00000000000..952b9039d9b --- /dev/null +++ b/docs/ja/integrations/images/logos/looker_studio.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/mage.jpg b/docs/ja/integrations/images/logos/mage.jpg new file mode 100644 index 00000000000..b6a669376c9 Binary files /dev/null and b/docs/ja/integrations/images/logos/mage.jpg differ diff --git a/docs/ja/integrations/images/logos/metabase.svg b/docs/ja/integrations/images/logos/metabase.svg new file mode 100644 index 00000000000..9602f6703b7 --- /dev/null +++ b/docs/ja/integrations/images/logos/metabase.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/minio.png b/docs/ja/integrations/images/logos/minio.png new file mode 100644 index 00000000000..72c994c68d2 Binary files /dev/null and b/docs/ja/integrations/images/logos/minio.png differ diff --git a/docs/ja/integrations/images/logos/mongodb.svg b/docs/ja/integrations/images/logos/mongodb.svg new file mode 100644 index 00000000000..fa3837793e1 --- /dev/null +++ b/docs/ja/integrations/images/logos/mongodb.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/msk.svg b/docs/ja/integrations/images/logos/msk.svg new file mode 100644 index 00000000000..2f3d43de1ed --- /dev/null +++ b/docs/ja/integrations/images/logos/msk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/mysql.svg b/docs/ja/integrations/images/logos/mysql.svg new file mode 100644 index 00000000000..5361d2629db --- /dev/null +++ b/docs/ja/integrations/images/logos/mysql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/nats.svg b/docs/ja/integrations/images/logos/nats.svg new file mode 100644 index 00000000000..8694a2f33b0 --- /dev/null +++ b/docs/ja/integrations/images/logos/nats.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/nodejs-logo.svg b/docs/ja/integrations/images/logos/nodejs-logo.svg new file mode 100644 index 00000000000..8d788c57cb6 --- /dev/null +++ b/docs/ja/integrations/images/logos/nodejs-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/observable.svg b/docs/ja/integrations/images/logos/observable.svg new file mode 100644 index 00000000000..1b18a61be7b --- /dev/null +++ b/docs/ja/integrations/images/logos/observable.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/odbc.png b/docs/ja/integrations/images/logos/odbc.png new file mode 100644 index 00000000000..250fd8ce283 Binary files /dev/null and b/docs/ja/integrations/images/logos/odbc.png differ diff --git a/docs/ja/integrations/images/logos/omni.svg b/docs/ja/integrations/images/logos/omni.svg new file mode 100644 index 00000000000..e57a03e713f --- /dev/null +++ b/docs/ja/integrations/images/logos/omni.svg @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00A1FF + + Primary + + Secondary + + 3F4755 + + A3ACBB + + E8BF43 + + + AA3F6B + + + + + + + 6773A2 + + 3FF2DE + + 4EE8FF + + FF5789 + + 290E05 + + diff --git a/docs/ja/integrations/images/logos/ops_ramp_logo.png b/docs/ja/integrations/images/logos/ops_ramp_logo.png new file mode 100644 index 00000000000..3f634d529fe Binary files /dev/null and b/docs/ja/integrations/images/logos/ops_ramp_logo.png differ diff --git a/docs/ja/integrations/images/logos/pinax-logo.png b/docs/ja/integrations/images/logos/pinax-logo.png new file mode 100644 index 00000000000..1ed48192871 Binary files /dev/null and b/docs/ja/integrations/images/logos/pinax-logo.png differ diff --git a/docs/ja/integrations/images/logos/popsink.svg b/docs/ja/integrations/images/logos/popsink.svg new file mode 100644 index 00000000000..584374bfd79 --- /dev/null +++ b/docs/ja/integrations/images/logos/popsink.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/postgresql.svg b/docs/ja/integrations/images/logos/postgresql.svg new file mode 100644 index 00000000000..313b7982444 --- /dev/null +++ b/docs/ja/integrations/images/logos/postgresql.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/powerbi.png b/docs/ja/integrations/images/logos/powerbi.png new file mode 100644 index 00000000000..fab7e5385e5 Binary files /dev/null and b/docs/ja/integrations/images/logos/powerbi.png differ diff --git a/docs/ja/integrations/images/logos/prequel.svg b/docs/ja/integrations/images/logos/prequel.svg new file mode 100644 index 00000000000..8646aba2207 --- /dev/null +++ b/docs/ja/integrations/images/logos/prequel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/pulse.png b/docs/ja/integrations/images/logos/pulse.png new file mode 100644 index 00000000000..9dd518e7217 Binary files /dev/null and b/docs/ja/integrations/images/logos/pulse.png differ diff --git a/docs/ja/integrations/images/logos/python-logo.png b/docs/ja/integrations/images/logos/python-logo.png new file mode 100644 index 00000000000..838816beb73 Binary files /dev/null and b/docs/ja/integrations/images/logos/python-logo.png differ diff --git a/docs/ja/integrations/images/logos/python-logo.svg b/docs/ja/integrations/images/logos/python-logo.svg new file mode 100644 index 00000000000..938831f7ed7 --- /dev/null +++ b/docs/ja/integrations/images/logos/python-logo.svg @@ -0,0 +1,288 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/python.svg b/docs/ja/integrations/images/logos/python.svg new file mode 100644 index 00000000000..39d0d512db6 --- /dev/null +++ b/docs/ja/integrations/images/logos/python.svg @@ -0,0 +1,4571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@font-face{font-family:'Verdana';src:url("data:;base64,\ +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\ +ABUAFgAXABkAGwAcAAA=")} + + + + + + + + + + + + + + + + + + + + + + + + + 2006-06-28T15:19:32Z + 2006-06-28T15:19:32Z + Illustrator + + + + JPEG + 256 + 104 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAaAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh4LeBogTGpJr +UlR44qv+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYq7 +6tb/AO+k/wCBGKu+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYqp3FvbiMUiT7afsj+cYqqf +Vrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/A +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 +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + +image/svg+xml + + + + + + + + + + eJzUvYd++jyyP/zeAPcQEnq1TS8JmB4gCS2FJIRqCAktlN19ztW/I7libGPaOfv/PLv5JbasMhqN +pug7MhsrdTc9mPcYt89DXBnM5vSS6a7ny+gVfnp1P5lsVuslemSr2a9I0kNAIfo+3OYKvjDL1Xg+ +i+JX+GUOfW2rr5nFd3d2lWHGPWZiv7LZ4VVjvJ4w8HLxz/p7PnNP5qO5e9pdrZml+18+d+Ph6iM9 +n/2LsfP9gIoz3TV8EfRSYS8RhEaiZOSKfoACqflmNhjPRqn5f6JXFHHl9l0FCf8V5fPBy8K4xqxk +JTxU4MpNeYJUJAIlfR4yCL9QPnjiJ0j4JjPvb6bMbF1ZzvvMapWeT+bLVfQq/Q+M4qE7gjfdqyYz +mcz/fZWadPu/kk9y89kaFZ1vlmNm+cj8252aTwZQwHkF9Bl0Z11J4UeGGTADPZ/Q94F2bjxhgKLT +7voqhMhL3/vauGvPK+gTqgB+R49D7fspPKkz6zWMGapGc1HLp6TDgYf4P9tHjRmN8bwCiVt2ttoG +M11MgNyYXj6gJUlQnoD4G1cKOoRLuCn4X8QHJYIkceWPhPkSIiGZf42Zf0evHuczhh0NvVzXx/+D +JpSkrkIRin1a20yY5fNsjAiCH0XYIT7MB8wEOEv4Njfp4pHh/0jxJ1ug0V2OmDVM/HyyWWOeDBPc +q8fNtNz9h0Hz6WMbeFows8b8BffPTREwgIAfhkLCUFHXyOAVFcQNBK/8FNcSiVvjuoMqQJ/z9QZD +ISB4BabgaTkejWdRrl+hdn45HojTEqKuwuwP3HVPWPL/CP9/to8w3PWambFTmZ0N0vMpousKcT/M +3wymFpYQ+074Hb+B5jYLw4fBF/H+beZrZgVtT5irSNA7Wnb/xVyRsJzoATAevFl56SW89qb7zGA8 +mXS92W5/s2a8j+vxZMB4n/hiBu+z8EWXLdLFtXm7/fESpnw4Yf7j7Ypl2O+7uPI+XzmDvzR4GfZT +RvIpI3w6Zqsfs2XGkjJjocwMV2/wztmyc7bsXFJ2LpSds13ZsEU3bNGNWNTg3QhlB93RiFl6B9BB +hvH2gd5eJKAmaBQrpo8Yy9vbTCbM2rvoLhEFFt9e+GLanQ16E6DSEi8tqG3g7c8X/wAzfK+9sNQG +zLS7/PWyfRCa88zm6wEz9NJZ79Nq0l19G4RHCxC90/FsIxbi//2HmXmnG/ljw045/t/5cjBkoKrx +jEG/g8jtbyboD75AF55zrf9tmBUa5GD+75mX+U9/0p3iX4G7xv3uBD4QvhrCGh3Pdrsx2sBUM9M5 +CPvhWvyLpQRI0PECjXy16PYZL81OBs0xG/dP1jtHPDIbQJe8zBT/gxkZSIwr5f9g68R/ic/Zh4Px +v8aIQQSiCTRvCr8Nl112RrOb5Rz3FK8Uod/4L1ydwTscw4A59oCWvQtoZz5ADILnWlxnve6KETqI +/4CisOFtVsAiBi8tYdGs5Hea5Yys0LksS5p79vm9lF3vhUL3bKEnttCTpD5+3E9siWe2xLO0mmf2 +1QDN1Go19kq+Zidi2u0vEb+DJMfFun28INglza5og/d7Mxt1l5vppLtZwzoEYf/r7XfhO0Mji2Vl +oNhurGBLEHcCXxuLqeysP0c7dPSqLdsIdzbGD6+8iFf+CbstNN7ZBkAm8tVfNZYbpvHPgtHdG24L +FrZiaJ371cu/0tHaBxkkOUFyRYZ8XpgQ5m/TncAfQe94NoQFuf5HsszRJOACIKVB+4EZRn8YyDCJ +VjtIm/W4OxmMh0Mv9H+K927vYjkfbPogi8ZQ4xpJVag+HPE+TZlR98pARgJeED1o5V6RkZC3u4AP +/sP1IhL2ZpgJqDUU6eeWCyzz/2FmI+aK8hOo8AQWULv+z7Q3n7S97L9bIw+wpGsDKSvAFWiPMzwu +DFhDrEw28Cq/nG8W97Ph3GBjVcoK2tSWs6cZ/PJ9lVpuVt9Xjfkc6YhbBbhXbC3o5XItLa3ZBpRV +r1+s6Ki6012QYFjsj/tK1Su8F9pR+1azQVADloxYB/5T+Ffzy3ofk1Kpl9uvhMoVvtBuAbPEeDUV +K5Y8EX/fxxEwURMQ9yuhGvZPsWPl8b/4h9qVZZghqMuSqcVPs2BWTOYLCRmFJyCUr167y4Vatah3 +sFQHQJX6ZrxmxImeTxfIxLiqf3cX6PFOSXaFgGyQrg+3W3vhHPxBhH2DdOv1PyBDDN7SDHZs/MdV +FOgym8OAvY/dKXPlMnjrY1DzGf4tcfVkANMoGAyB3kmGwxT6JxBEWijhI/3wT4gIRGT/vHUNvP5N +XL39A38U4ZcfePTvK/8VmHEt4moAT99quNwb7HqVLvT5Kma4ApEzhH8V+njlD+7pJt8/KoI6BkYJ +6iVJhrfU6Et1LrSncyGfzwcd8IUJ1DmKjARR78IU/oulr5/wIRoGKDAvzt/ND3ja3UzWLe2OCuYT ++g/3omaQWlTQJK27a6RK1zBbAh+LTLmXsytd0KnBNECNVnqyLsktVvzq7X8MO88rfUMlJTTG13nI ++ilDdVJi7owFFzhmoZIE+4oVi6ia/497DBXJHqpUzvWVN7Ez3XXXYG57+b9hjtFfY6zUdpf/sH+/ +PZQfwZTGf9huBlxZ4JL6GmlyV7b/TEGvHzBu9GMGnGMH1jG3ld//qzvZcAUiV957aHPr9fqfBfcW +zMplV6kHU2bdHUDHT+8AeVwHVsN//9+1PRn3mdX/YvMxsUz/G5T6JTPjysjYRFIQdIDluAfmwoot +GmM/2B1IHVTwPoMdbf+VY9ru8n/2dpH1EnprDKjHar2k/ncpj3q9S/1/9g6Fd3X+dw3mH6XBfDPI +wt4/Ob6Ahwr9lw2I7/vuqP49Hqy/9w4qEKY8EfK/bp64zu+Oqjdfr+fTMjNcs27OvQOERZ0CM+K/ +ZmS7A3Dt+8Z1SOsykQPf7JeMNsts1YZdKaZS8v9S+rAD0EWj7aH/q7scd3sTFJH439wbVDvxf96H +/8od8tBJja66yKJAiuf/8sRefgX2NysQDf/di1BhcNF/6Rse8OHqv3VwaAyXlMMwdmDXR0yQfbTq +jXHYmPzvI5V0FLvMMJn3f5nB/vHN5jM1Kvwfjo3v/X/JbvzfvFjOTaT/pZqkrgf0hOBoR9+T5JXg +wcCh66tydzbadEfMVWW+2CxkmiT+oLJkVszyX8xVg/nP+io7GK+7vfFkvOYsjGAg4AsIDUSuust1 +b95dDq766GTBFXm15Jltb0kUv5npLNsTOCNA+amwelFK7MDekpIO7C3b29lYd4ttsy56v152Z6tF +F+a1/w80Nx5crcb/wwjTxJM9crXoLpglvJxuJtjjxhbxEQRvv6BCT5v1YrO+quGTPeP/wQWvxHMZ +XPcCW988MKvvPV8QW/PP89LVGEp11wyMnMFyW7Pw7wzEzBw6N0IOfm69fzwwg/FmKmmwJVn5SuzJ +ncwAUmA2XF9JZLJsSfg5MgPlOcKHeMoPFmOPrLfdyXglezTtrn45Mgd5ii26A1FU0vdX9GY9F6jH +zz8hWWDE1VDo8pI7ccX018Ayve6kO+vvzvXWJ0AxdF7gag1rTV/J1Xo5/+XXPqlSuD8ZL4AlkUL5 +nyt0bmI+2/PFgl/1838xywVyjQriBUjTny8HzGB3Gq68j/P1Ia/F2feKcsy7HCxXHlZJlCu3O8W6 +s9l8LYyFnbWdQvy4VqttibhbcDPr7ykCGxisgIEulpZ+/J+FR9z6lGqHAvPFYLOnwGpfDf35tliS +FUCsoF0AnQxcrlm+0myLKynyKhY1SiVBsG6LGB+hUnIpLxkKKBfcWk6KM79g51171qEQiJXtchIp +Ky/63R2g8yCa9U1ItNK6a81CQLs1Vg81y0zRMlxJBbNSuRkzAkH+L0Z9WqEQKNuwBrkBqnSc+Rc6 +QarW0nC29qw2vZXGwFCRwWSxHM4FeaHUHbbYFLQXbrdXJPdo+utBJ7lW8+HQw3qTdBdfis5CHaXX +84XusujIkkAAlcIgH5iBvNc6ikt6raO00GsdZbd6vTv3qCzWWHqgje8pt5TEAfcUXYBiOZ4N5/ta +XkpGolwED4QrI4kc7JQbMEO0K0q8qsrCGBf+mffW6KD03oLsVjQcT7TWKyq4QmHLPWW29g+lUv3l +wLMeTwQNS2kFoTKrfn+mtRjZMotJ/x+JnrJLN7ZYd8J4/qWz3LcG26FS8+WIr0uzDFePkoBHRRbz +1VibyVApmO/F93z5P9ql5ssxOle+p7rJ0iOoOz109Fy7LL9TLuZrjUWDSoqiTpnLgBP3KAeoRG+8 +nnYX8g1SrTQeRXfFfqTOSULRuTZ/C+V6XBBSq+CAWY1Hs33kXiyWHmwQafEKKvQNImzFaElGXOzf ++opJI0kale0VIVBInLNQhFIUSlBojOAC2xsYuafw3o1AKLlnExDKiRuARk+llNHoo4Q0isoGFBmw +hzo0RCEU2q/hr9YTrtRiMVBvERXjWhTKqVcIRdB6nCj5znfKIo5nlltRNs3m2fK8cSA5KKTUAmy5 +E/aku2jWxgS3CzroQ/OFr5AdpWD47ppUamsSNdZd71nh6PzxcsWg2pbaMmP1O16AjJz97pNrSAmA +RT5SHF9x3kOH/ySjE70pUChbqV89yQzQLR8IV6aMLGF0thSdMcR+Kk0vCPdVHh3YRb4G9BXrF1Ez +PoRvWNvf+8La9Ck1m57rOmejN0QLSbVMXc2OZ4ulkQWf5iz4mtSC1+NVQTVouFJIqedpNhdt/qvx +DLsN0E4sc8TWX/IIWlUHg4CF3GxPH/e6PO9LdgHJy+y0xwxYYm7bJPAO+tcfi1aPpEX+6Df7wi++ +wOfFGoI/WBgQvMJnSNFYMQ5i9z2Pxtp9UxkNdx++deVeUtT8ZNwXuhXbXZPiOb3tA2VoctiDZohF ++HcGL3oufYLWOV1P39+HAxmod4COHJqdd0G3Kbmyv11nSsX+MGevUnTyL/Vl8yeeOnehVx8xiDFR +8wz/GbsH6yXXKW+sOaPzg5A9cyZeel6CmqwDdK2RaySji1Yk+B6cvhvMcXcnN8eVQXuxFV3fPNvo +WW+04r65+5vSpdfszXJ5lx5k3nOzj+xriqnRhWDnMWqZjR35wIpaBH22hS3dut8soJbWXdZZ9hSc +ie+1L2BM26sGs39FrR7g1auNG0ain/PHq9HnXJZcmjKu7t8LvHXcZJhlapN1PpRfM6V7Yz1c26Qf +cplAwkQ36Nkz+qKSjDWqG493FSjEXwufFPTm5SHpXRM5gznpj8creEDOu7zR4l/5TFXcC73k0EEM +mFSOHF/TXONu9pTqPLxnkt7lYA1deShmEk7qni7XO41TOnLQvNz2aNfisZgsRVZ3YaCKJzd/979k +l5/vBExYs5G7pW/7XG9uF2axNwbz3cIeR1NWcKcp020n49kkn+nQZ7sZbC7ISs5SfZtw7fVpS2a4 +sJN0o7jeyJ+V3uxrqKW4yXievuPLpT8zJqjg9SL5Yq2bgJNxcZKodHP2taWbdbUevQ== + + + qaCLuubq6cyTy2Vs1YAeu+4J0v0TlRArVUszq3Bu/UJ9zX8twSrjcCKmekLM0HDe1oLfyxaxihvM +Hl85QnH0ZrntJQx8Es77w3+xH/jTbicGlmZmu9HPZevhs6rcaD70FYjef3nERoGTxWa/TI9l1UaD +41LerNxo3GhbrkjzUrnRCvkJrVxTUYfSWFdW14NbpdHAt61rbWaVG/XbP51xaiQZKbQiNnud+/Lf +PC8mZaVGiVyqlFRpNHhjmi3ttyqNNr8MZiI3fKwrjvU6b4xbyGK7odhovkA1VMlLvd81OrhR0kH3 +sjyP8bP6uvzc3JVRo7HdWbU1fR8T0g6Nul07rFQmUlyjFatV1qjBHAhM2wux2e1G28vW96yh0miy +GwzlTKRio1+JTk1sVJSWbLMFk88W+1RuNG5srW6+mZpyo9W0/e7PNC0rNQoUi02idypjDXw7Eu/J +J+VG/c0mkYsQj4qNXudGIVNtSj3hRoFiclZqtXIqjQZvzL+zh7Rao10i7+q8KDVqMAMrEbSVsYWa +igRe37gSXKNNt01G3sSj/5Yjb/bzN7fV6HucKIfcJGo0jnhMNtYCMw/Wum4KGiXc8pGWP967Ko0G +b0K/g9yXUqMGM2o2Qzw4WhHc7E6j93/R5M/ysabYaD1m9ak2WmLqPgI3ajDvjvXDTdTb9mvlRksF +5vHj3W5TbPTFOhspNQoyGTVb/652eioE/sgTL6VFXLnRss/8nEvGb5UbXRSvcaNIU9od60s7f71W +a/SJeE2UMsqNPtxl21/VVkvWKLSCm209/d6rEvinGRjkVBr9DBOt1cSt3Ojjz2L6FAmDTFYca/ve +PVNtdGmuO40qjTafiex4WpQ1ajBzAuLRfW1MttxZaNTnkS+aTTvU5hrt+eyyRWN/L3cduFHKemcr +bI+0THQcURokPzR7JxsrVPvzxwv9oFfe6GpuueUaXSecspEaP7sfdrbRVJO8x41CK7wodC1Xz3dG +1GhyVyrdu/mRxklZo85Y4TrINpogS26ZIHQt/I8dA7uV+0zRdGlb/pqWy25vhhpNyUe6pJk5z78p +n3wjD/xEuZ0mEa16cKO4FY7A13Om02B3VabbDm53qvBs+ZpHVd82q+T0Re0tSH6i0DFvVN+D6M1Y +VN7CHFicaU6vYX6YkOxtMEy2G5yEIZjVb1j+fvZ9/cZ9vfs2VLmPfqq+DVOOWkf2VqQYvP/ufllV +v6Ypy3tf9W3ZOUtQqm8N5nLvaRhTff903e8VVN6GC5ZC/HnFvh1a/yKyb5+dY045BYoNyeuo/H2v +WJ9xX+++fck4f5eqb1/NPa9R9lZKsdfPTPRW9euO+StkUn37s64sCqpvDebfFypVVX0//c3dfam9 +hR5WYwHVt0XKf/emTjFzf9arl9W+thgt958O1bdZ+qHHqFPMUqQS16Ta17SRMtmjKm8DBSJ76+DH +HLXFZG+hlUZ1leDepz1x2ftGJ++gpW/9rho2rllzLu12pIPrxVcrPfputFMThr69ixRMP9s2d5TT +YXbNvtVb8mX4XKcbDfMrFlJ042Hgz3aXH2Znar563Hr2bsVSLkqGjY9YmBkdpRhpdGVqr0bXy1fd +YDa62oOG0fZh36DfKsCEv2mju9QOiGYhbxQ2R3TVVw9Dv9NOsE/nv0FTKDKMux2UkbcrW+Fce/3Z +TcYW5HWm6LwJ4KHhebFM6XnmC9j0JnJNWW8rdxnGkTXjdYfMmQ+eihrlkK0VUS1nMIsl76Lpj+be +GsEM65lqvzrKOcxx41zkMdWSwRt9YwFbLFSzt3SMBVltvlhbR43mp/FDV0c5tKX3dY3Fet/zjPga +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 +PXf+Cylwi7g8HC7tlUP/F1gVhvo= + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/qryn.svg b/docs/ja/integrations/images/logos/qryn.svg new file mode 100644 index 00000000000..fc04e953b48 --- /dev/null +++ b/docs/ja/integrations/images/logos/qryn.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/qstudio.png b/docs/ja/integrations/images/logos/qstudio.png new file mode 100644 index 00000000000..38e2b4f3093 Binary files /dev/null and b/docs/ja/integrations/images/logos/qstudio.png differ diff --git a/docs/ja/integrations/images/logos/quesma.svg b/docs/ja/integrations/images/logos/quesma.svg new file mode 100644 index 00000000000..cb9c996e5c5 --- /dev/null +++ b/docs/ja/integrations/images/logos/quesma.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/quicksight.svg b/docs/ja/integrations/images/logos/quicksight.svg new file mode 100644 index 00000000000..66bb428daf9 --- /dev/null +++ b/docs/ja/integrations/images/logos/quicksight.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/rabbitmq.svg b/docs/ja/integrations/images/logos/rabbitmq.svg new file mode 100644 index 00000000000..17b4b6a60e7 --- /dev/null +++ b/docs/ja/integrations/images/logos/rabbitmq.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/redis.svg b/docs/ja/integrations/images/logos/redis.svg new file mode 100644 index 00000000000..90035f23c26 --- /dev/null +++ b/docs/ja/integrations/images/logos/redis.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/restack_logo.png b/docs/ja/integrations/images/logos/restack_logo.png new file mode 100644 index 00000000000..cccf00d650c Binary files /dev/null and b/docs/ja/integrations/images/logos/restack_logo.png differ diff --git a/docs/ja/integrations/images/logos/retool.svg b/docs/ja/integrations/images/logos/retool.svg new file mode 100644 index 00000000000..496e5e3d9d7 --- /dev/null +++ b/docs/ja/integrations/images/logos/retool.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/rill.svg b/docs/ja/integrations/images/logos/rill.svg new file mode 100644 index 00000000000..1545bc1b748 --- /dev/null +++ b/docs/ja/integrations/images/logos/rill.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/risingwave.svg b/docs/ja/integrations/images/logos/risingwave.svg new file mode 100644 index 00000000000..46c3c4b7b26 --- /dev/null +++ b/docs/ja/integrations/images/logos/risingwave.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/rocketbi-logo.svg b/docs/ja/integrations/images/logos/rocketbi-logo.svg new file mode 100644 index 00000000000..7428612a254 --- /dev/null +++ b/docs/ja/integrations/images/logos/rocketbi-logo.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/rocksdb.svg b/docs/ja/integrations/images/logos/rocksdb.svg new file mode 100644 index 00000000000..c6a9f2e1f1b --- /dev/null +++ b/docs/ja/integrations/images/logos/rocksdb.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/rsyslog.png b/docs/ja/integrations/images/logos/rsyslog.png new file mode 100644 index 00000000000..5d25c5df717 Binary files /dev/null and b/docs/ja/integrations/images/logos/rsyslog.png differ diff --git a/docs/ja/integrations/images/logos/rudderstack.svg b/docs/ja/integrations/images/logos/rudderstack.svg new file mode 100644 index 00000000000..6b03e8c07df --- /dev/null +++ b/docs/ja/integrations/images/logos/rudderstack.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/runreveal.png b/docs/ja/integrations/images/logos/runreveal.png new file mode 100644 index 00000000000..8813ed4c39c Binary files /dev/null and b/docs/ja/integrations/images/logos/runreveal.png differ diff --git a/docs/ja/integrations/images/logos/schemaspy_logo.png b/docs/ja/integrations/images/logos/schemaspy_logo.png new file mode 100644 index 00000000000..db244b3120a Binary files /dev/null and b/docs/ja/integrations/images/logos/schemaspy_logo.png differ diff --git a/docs/ja/integrations/images/logos/sematext_logo.png b/docs/ja/integrations/images/logos/sematext_logo.png new file mode 100644 index 00000000000..faf3bfe66cd Binary files /dev/null and b/docs/ja/integrations/images/logos/sematext_logo.png differ diff --git a/docs/ja/integrations/images/logos/signoz-logo.png b/docs/ja/integrations/images/logos/signoz-logo.png new file mode 100644 index 00000000000..8701ff89f85 Binary files /dev/null and b/docs/ja/integrations/images/logos/signoz-logo.png differ diff --git a/docs/ja/integrations/images/logos/signoz-logo.svg b/docs/ja/integrations/images/logos/signoz-logo.svg new file mode 100644 index 00000000000..7b18399c1bb --- /dev/null +++ b/docs/ja/integrations/images/logos/signoz-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/ja/integrations/images/logos/skywalking_logo.jpeg b/docs/ja/integrations/images/logos/skywalking_logo.jpeg new file mode 100644 index 00000000000..dba7df077c7 Binary files /dev/null and b/docs/ja/integrations/images/logos/skywalking_logo.jpeg differ diff --git a/docs/ja/integrations/images/logos/snappy_flow_logo.png b/docs/ja/integrations/images/logos/snappy_flow_logo.png new file mode 100644 index 00000000000..269ad7f6f5a Binary files /dev/null and b/docs/ja/integrations/images/logos/snappy_flow_logo.png differ diff --git a/docs/ja/integrations/images/logos/soda_logo.png b/docs/ja/integrations/images/logos/soda_logo.png new file mode 100644 index 00000000000..e2ed7da1143 Binary files /dev/null and b/docs/ja/integrations/images/logos/soda_logo.png differ diff --git a/docs/ja/integrations/images/logos/sqlite.svg b/docs/ja/integrations/images/logos/sqlite.svg new file mode 100644 index 00000000000..3887c50bc7c --- /dev/null +++ b/docs/ja/integrations/images/logos/sqlite.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/streamingfast.png b/docs/ja/integrations/images/logos/streamingfast.png new file mode 100644 index 00000000000..11494844416 Binary files /dev/null and b/docs/ja/integrations/images/logos/streamingfast.png differ diff --git a/docs/ja/integrations/images/logos/streamkap-logo.png b/docs/ja/integrations/images/logos/streamkap-logo.png new file mode 100644 index 00000000000..3de27de76e7 Binary files /dev/null and b/docs/ja/integrations/images/logos/streamkap-logo.png differ diff --git a/docs/ja/integrations/images/logos/superset.svg b/docs/ja/integrations/images/logos/superset.svg new file mode 100644 index 00000000000..812613aa70b --- /dev/null +++ b/docs/ja/integrations/images/logos/superset.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/ja/integrations/images/logos/tableau.svg b/docs/ja/integrations/images/logos/tableau.svg new file mode 100644 index 00000000000..7331f29908a --- /dev/null +++ b/docs/ja/integrations/images/logos/tableau.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/tablum.svg b/docs/ja/integrations/images/logos/tablum.svg new file mode 100644 index 00000000000..9ed2a703dc2 --- /dev/null +++ b/docs/ja/integrations/images/logos/tablum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/teleport_logo.png b/docs/ja/integrations/images/logos/teleport_logo.png new file mode 100644 index 00000000000..1ebdf14d3da Binary files /dev/null and b/docs/ja/integrations/images/logos/teleport_logo.png differ diff --git a/docs/ja/integrations/images/logos/tooljet.png b/docs/ja/integrations/images/logos/tooljet.png new file mode 100644 index 00000000000..64b2e77f773 Binary files /dev/null and b/docs/ja/integrations/images/logos/tooljet.png differ diff --git a/docs/ja/integrations/images/logos/trickster-logo.svg b/docs/ja/integrations/images/logos/trickster-logo.svg new file mode 100644 index 00000000000..fd9d7c7c4f6 --- /dev/null +++ b/docs/ja/integrations/images/logos/trickster-logo.svg @@ -0,0 +1 @@ +trickster-logo \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/upstash.svg b/docs/ja/integrations/images/logos/upstash.svg new file mode 100644 index 00000000000..dfed2937070 --- /dev/null +++ b/docs/ja/integrations/images/logos/upstash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/vector.png b/docs/ja/integrations/images/logos/vector.png new file mode 100644 index 00000000000..2ba6bccd389 Binary files /dev/null and b/docs/ja/integrations/images/logos/vector.png differ diff --git a/docs/ja/integrations/images/logos/warpstream.svg b/docs/ja/integrations/images/logos/warpstream.svg new file mode 100644 index 00000000000..9009d1c3011 --- /dev/null +++ b/docs/ja/integrations/images/logos/warpstream.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/yepcode.svg b/docs/ja/integrations/images/logos/yepcode.svg new file mode 100644 index 00000000000..062b3fcfed3 --- /dev/null +++ b/docs/ja/integrations/images/logos/yepcode.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/zing-logo.png b/docs/ja/integrations/images/logos/zing-logo.png new file mode 100644 index 00000000000..01f5ee1c712 Binary files /dev/null and b/docs/ja/integrations/images/logos/zing-logo.png differ diff --git a/docs/ja/integrations/images/mysql_table_engine_01.png b/docs/ja/integrations/images/mysql_table_engine_01.png new file mode 100644 index 00000000000..2737e8cd84d Binary files /dev/null and b/docs/ja/integrations/images/mysql_table_engine_01.png differ diff --git a/docs/ja/integrations/images/playui.png b/docs/ja/integrations/images/playui.png new file mode 100644 index 00000000000..57dae518505 Binary files /dev/null and b/docs/ja/integrations/images/playui.png differ diff --git a/docs/ja/integrations/images/prometheus-datadog.png b/docs/ja/integrations/images/prometheus-datadog.png new file mode 100644 index 00000000000..9537b27901c Binary files /dev/null and b/docs/ja/integrations/images/prometheus-datadog.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-alloy.png b/docs/ja/integrations/images/prometheus-grafana-alloy.png new file mode 100644 index 00000000000..1256f76e29a Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-alloy.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-chart.png b/docs/ja/integrations/images/prometheus-grafana-chart.png new file mode 100644 index 00000000000..bd5d2b99aae Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-chart.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-dropdown.png b/docs/ja/integrations/images/prometheus-grafana-dropdown.png new file mode 100644 index 00000000000..e8c80e27a2b Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-dropdown.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png b/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png new file mode 100644 index 00000000000..a702427422b Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png b/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png new file mode 100644 index 00000000000..b0c8e70e055 Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-1.png b/docs/ja/integrations/images/splunk/splunk-1.png new file mode 100644 index 00000000000..443f000c5db Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-1.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-10.png b/docs/ja/integrations/images/splunk/splunk-10.png new file mode 100644 index 00000000000..32fe77c11e7 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-10.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-2.png b/docs/ja/integrations/images/splunk/splunk-2.png new file mode 100644 index 00000000000..8bd43d27f57 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-2.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-3.png b/docs/ja/integrations/images/splunk/splunk-3.png new file mode 100644 index 00000000000..e9136637682 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-3.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-4.png b/docs/ja/integrations/images/splunk/splunk-4.png new file mode 100644 index 00000000000..341f160d5fe Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-4.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-5.png b/docs/ja/integrations/images/splunk/splunk-5.png new file mode 100644 index 00000000000..fd0a8a7f7b2 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-5.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-6.png b/docs/ja/integrations/images/splunk/splunk-6.png new file mode 100644 index 00000000000..1565adf518e Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-6.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-7.png b/docs/ja/integrations/images/splunk/splunk-7.png new file mode 100644 index 00000000000..ec8f2894b4d Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-7.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-8.png b/docs/ja/integrations/images/splunk/splunk-8.png new file mode 100644 index 00000000000..54808644dcb Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-8.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-9.png b/docs/ja/integrations/images/splunk/splunk-9.png new file mode 100644 index 00000000000..8ab8fddce00 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-9.png differ diff --git a/docs/ja/integrations/index.mdx b/docs/ja/integrations/index.mdx new file mode 100644 index 00000000000..f664db81f93 --- /dev/null +++ b/docs/ja/integrations/index.mdx @@ -0,0 +1,289 @@ +--- +slug: /ja/integrations +title: インテグレーション +keywords: [インテグレーション, 統合, 連携] +description: ClickHouseとのインテグレーション +hide_table_of_contents: true +--- + +import AccelDataPNG from "./images/logos/acceldata_logo.png"; +import AmazonMskSVG from "./images/logos/amazon_msk.svg"; +import ApacheStreamParkPNG from "./images/logos/apache-streampark.png"; +import AzureEventHubsSVG from "./images/logos/azure_event_hubs.svg"; +import BlinkOpsPNG from "./images/logos/blinkops_logo.png"; +import CHDBSVG from "./images/logos/chdb.svg"; +import ClickHouseSVG from "./images/logos/clickhouse.svg"; +import ClickHouseMonitoringDashboardSVG from "./images/logos/clickhouse-monitoring-dashboard.svg"; +import CloudCanalSVG from "./images/logos/clougence.svg"; +import CloudQuerySVG from "./images/logos/cloudquery_logo.svg"; +import ConfluentSVG from "./images/logos/confluent.svg"; +import CsharpSVG from "./images/logos/csharp.svg"; +import CubejsSVG from "./images/logos/cubejs.svg"; +import DatagripSVG from "./images/logos/data_grip.svg"; +import DatalensSVG from "./images/logos/datalens.svg"; +import DbeaverSVG from "./images/logos/dbeaver_logo.svg"; +import DbtSVG from "./images/logos/dbt.svg"; +import DeepnoteSVG from "./images/logos/deepnote.svg"; +import DlthubSVG from "./images/logos/dlthub_logo.svg"; +import DraxlrSVG from "./images/logos/draxlr.svg"; +import EmqxSVG from "./images/logos/emqx.svg"; +import ExploSVG from "./images/logos/explo.svg"; +import FivetranSVG from "./images/logos/fivetran.svg"; +import GcsSVG from "./images/logos/gcs.svg"; +import GlassFlowSVG from "./images/logos/glassflow.svg"; +import GoLangSVG from "./images/logos/golang.svg"; +import GrafanaSVG from "./images/logos/grafana.svg"; +import HashboardSVG from "./images/logos/hashboard.svg"; +import HdfsSVG from "./images/logos/hadoop.svg"; +import HiveSVG from "./images/logos/hive.svg"; +import JavaSVG from "./images/logos/java.svg"; +import JdbcSVG from "./images/logos/jdbc.svg"; +import JitsuSVG from "./images/logos/jitsu.svg"; +import KafkaSVG from "./images/logos/kafka.svg"; +import KinesisSVG from "./images/logos/amazon_kinesis_logo.svg"; +import KestraSVG from "./images/logos/kestra.svg"; +import LookerSVG from "./images/logos/looker.svg"; +import LookerStudioSVG from "./images/logos/looker_studio.svg"; +import MongodbSVG from "./images/logos/mongodb.svg"; +import MysqlSVG from "./images/logos/mysql.svg"; +import NatsSVG from "./images/logos/nats.svg"; +import NodeSVG from "./images/logos/Node.js_logo.svg"; +import OmniSVG from "./images/logos/omni.svg"; +import ObservableSVG from "./images/logos/observable.svg"; +import OpsRampPNG from "./images/logos/ops_ramp_logo.png"; +import PopsinkSVG from "./images/logos/popsink.svg"; +import PostgresqlSVG from "./images/logos/postgresql.svg"; +import PrequelSVG from "./images/logos/prequel.svg"; +import PythonSVG from "./images/logos/Python-logo-notext.svg"; +import QrynSVG from "./images/logos/qryn.svg"; +import QuesmaSVG from "./images/logos/quesma.svg"; +import QuickSightSVG from "./images/logos/quicksight.svg"; +import RabbitmqSVG from "./images/logos/rabbitmq.svg"; +import RedisSVG from "./images/logos/redis.svg"; +import RestackPNG from "./images/logos/restack_logo.png"; +import RetoolSVG from "./images/logos/retool.svg"; +import RillSVG from "./images/logos/rill.svg"; +import RisingWaveSVG from "./images/logos/risingwave.svg"; +import RocketbiSVG from "./images/logos/rocketbi-logo.svg"; +import RocksdbSVG from "./images/logos/rocksdb.svg"; +import RudderstackSVG from "./images/logos/rudderstack.svg"; +import S3SVG from "./images/logos/amazon_s3_logo.svg"; +import SematextPNG from "./images/logos/sematext_logo.png"; +import SkyWalkingJPEG from "./images/logos/skywalking_logo.jpeg"; +import SnappyFlowPNG from "./images/logos/snappy_flow_logo.png"; +import SparkSVG from "./images/logos/Apache_Spark_logo.svg"; +import SodaPNG from "./images/logos/soda_logo.png"; +import SqliteSVG from "./images/logos/sqlite.svg"; +import SupersetSVG from "./images/logos/superset.svg"; +import TablumSVG from "./images/logos/tablum.svg"; +import Teleport from "./images/logos/teleport.png"; +import TricksterCacheSVG from "./images/logos/trickster-logo.svg"; +import UpstashSVG from "./images/logos/upstash.svg"; +import YepcodeSVG from "./images/logos/yepcode.svg"; +import WarpStreamSVG from "./images/logos/warpstream.svg"; +import BytewaxSVG from "./images/logos/bytewax.svg"; + +ClickHouseのインテグレーションは、以下のサポートレベルで分類されています: + +- **コアインテグレーション:** ClickHouseによって構築または保守されており、ClickHouseによってサポートされています。これらはClickHouse GitHubオーガニゼーションに存在します。 +- **パートナーインテグレーション:** サードパーティのソフトウェアベンダーによって構築または保守され、サポートされているものです。 +- **コミュニティインテグレーション:** コミュニティメンバーによって構築または保守され、サポートされています。公開されたGitHubリポジトリやコミュニティSlackチャンネル以外に直接的なサポートはありません。 + +各インテグレーションはさらに**言語クライアント**、**データインジェスチョン**、**データビジュアライゼーション**、**SQLクライアント**のカテゴリーに分類されています。 + +:::note +以下に示すClickHouseのインテグレーションリストを積極的にまとめていますが、これは完全なものではありません。ご自由に[貢献](https://github.com/ClickHouse/clickhouse-docs#contributing)し、関連するClickHouseインテグレーションをリストに追加してください。 +::: + +コアインテグレーション + +

+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Amazon Kinesis||データインジェスチョン|Amazon Kinesisとのインテグレーション。|[ドキュメント](/docs/ja/integrations/clickpipes/kinesis/)| +|Amazon MSK||データインジェスチョン|Amazon Managed Streaming for Apache Kafka (MSK)とのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka/cloud/amazon-msk/)| +|Amazon S3||データインジェスチョン|ClickHouseの内蔵S3関数を使用して、S3データをインポート、エクスポート、トランスフォーム。|[ドキュメント](/docs/ja/integrations/data-ingestion/s3/index.md)| +|Amazon Glue|Amazon Glue logo|データインジェスチョン|ClickHouseにJDBCを介してクエリ。|[ドキュメント](/docs/ja/integrations/glue)| +|Apache Spark||データインジェスチョン|Spark ClickHouse Connectorは、Spark DataSource V2の上に構築された高性能コネクタです。|[GitHub](https://github.com/housepower/spark-clickhouse-connector),
[ドキュメント](/docs/ja/integrations/data-ingestion/apache-spark/index.md)| +|AutoMQ|AutoMQ logo|データインジェスチョン|S3とEBSに耐久性を分離するクラウドネイティブKafkaおよびRocketMQの代替。|[AutoMQ](https://www.automq.com/)| +|Cassandra|Cassandra logo|データインテグレーション|ClickHouseで[Cassandra](https://cassandra.apache.org/)をDictionaryソースとして使用可能。|[ドキュメント](/docs/ja/sql-reference/dictionaries/index.md#cassandra)| +|CHDB||SQLクライアント|組み込みのOLAP SQLエンジン。|[GitHub](https://github.com/chdb-io/chdb#/),
[ドキュメント](https://doc.chdb.io/)| +|ClickHouse Client||SQLクライアント|ClickHouseのネイティブコマンドラインクライアント。|[ドキュメント](/docs/ja/interfaces/cli.md)| +|DeltaLake|Delta Lake logo|データインテグレーション|Amazon S3にある既存の[Delta Lake](https://github.com/delta-io/delta)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/deltalake)| +|EmbeddedRocksDB||データインテグレーション|[rocksdb](http://rocksdb.org/)とClickHouseの統合を可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/embedded-rocksdb)| +|Fivetran||データインジェスチョン|[Fivetranデータムーブメントプラットフォーム](https://www.fivetran.com/)の[ClickHouse Cloud](https://clickhouse.com/cloud)宛先。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/fivetran/index.md)| +|Google Cloud Storage||データインジェスチョン|ClickHouseの内蔵`S3`関数を使用してGCSデータをインポート、エクスポート、トランスフォーム。|[ドキュメント](/docs/ja/integrations/data-ingestion/s3/index.md)| +|Go||言語クライアント|Goクライアントは、低オーバーヘッドでパフォーマンスの高い接続を提供します。|[ドキュメント](/docs/ja/integrations/language-clients/go/index.md)| +|HDFS||データインテグレーション|[Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop)エコシステムとの統合を提供し、[HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)でのデータ管理を可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hdfs)| +|Hive||データインテグレーション|Hiveエンジンを使用してHDFS Hiveテーブルに対して`SELECT`クエリを実行可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hive)| +|HouseWatch|HouseWatch logo|データ管理| ClickHouseクラスターを監視および管理するためのオープンソースツール。 |[GitHub](https://github.com/PostHog/HouseWatch)| +|Hudi|Apache Hudi logo|データインテグレーション|Amazon S3内の既存のApache [Hudi](https://hudi.apache.org/)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hudi)| +|Iceberg|Apache Iceberg logo|データインテグレーション|Amazon S3内の既存のApache [Iceberg](https://iceberg.apache.org/)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/iceberg)| +|JDBC||データインテグレーション|[JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity)テーブルエンジンを介して外部データベースに接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/jdbc)| +|Java, JDBC||言語クライアント|JavaクライアントおよびJDBCドライバ。|[ドキュメント](/docs/ja/integrations/language-clients/java/index.md)| +|Kafka||データインジェスチョン|オープンソースの分散イベントストリーミングプラットフォームであるApache Kafkaとのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka)| +|Looker Studio||データビジュアライゼーション|Looker Studioは、データをインフォーマティブで見やすく、共有しやすく、完全にカスタマイズ可能なダッシュボードとレポートに変換する無料ツールです。|[ドキュメント](/docs/ja/integrations/lookerstudio)| +|Looker||データビジュアライゼーション|Lookerは、リアルタイムで洞察を探索し、共有するのを助ける企業向けプラットフォームです。|[ドキュメント](/docs/ja/integrations/looker)| +|Metabase|Metabase logo|データビジュアライゼーション|Metabaseは、データに関する質問をするための使いやすいオープンソースUIツールです。|[ドキュメント](/docs/ja/integrations/metabase)| +|MinIO|Metabase logo|データインジェスチョン|MinIOは、Amazon S3クラウドストレージサービスとAPI互換性を持つ高性能オブジェクトストレージです。|[ドキュメント](/docs/ja/integrations/minio)| +|MongoDB||データインテグレーション|MongoDBエンジンは、リモートMongoDBコレクションからデータを読み取る(`SELECT`クエリ)ための読み取り専用テーブルエンジンです。|[ドキュメント](/docs/ja/engines/table-engines/integrations/mongodb)| +|MySQL||データインテグレーション|MySQLエンジンは、リモートMySQLサーバーに格納されているデータに対して`SELECT`および`INSERT`クエリを実行することができます。|[ドキュメント](/docs/ja/engines/table-engines/integrations/mysql)| +|NATS||データインテグレーション|ClickHouseと[NATS](https://nats.io/)とのインテグレーションを可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/nats)| +|Node.JS||言語クライアント|ClickHouseに接続する公式JSクライアントです。|[ドキュメント](/docs/ja/integrations/language-clients/js.md)| +|ODBC|ODBC logo|データインテグレーション|[ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity)テーブルエンジンを介して外部データベースに接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/odbc)| +|PostgreSQL||データインジェスチョン|PostgreSQLデータベースからClickHouse CloudへのスナップショットおよびリアルタイムCDCデータレプリケーション。|[ドキュメント](/docs/ja/integrations/postgresql)| +|PowerBI|PowerBI logo|データビジュアライゼーション|Microsoft Power BIは、ビジネスインテリジェンスに焦点を当てたインタラクティブなデータビジュアライゼーションソフトウェア製品。|[ドキュメント](/docs/ja/integrations/powerbi)| +|Python||言語クライアント|PythonとClickHouseを接続するための一連のPythonパッケージ。|[ドキュメント](/docs/ja/integrations/language-clients/python/index.md)| +|QuickSight||データビジュアライゼーション|Amazon QuickSightは、ユニファイドビジネスインテリジェンス(BI)をハイパースケールで提供するデータ駆動型組織を支えます。|[ドキュメント](/docs/ja/integrations/quicksight)| +|RabbitMQ||データインテグレーション|ClickHouseが[RabbitMQ](https://www.rabbitmq.com/)に接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/rabbitmq)| +|Redis||データインテグレーション|ClickHouseが[Redis](https://redis.io/)をDictionaryソースとして使用可能。|[ドキュメント](/docs/ja/sql-reference/dictionaries/index.md#redis)| +|Rust|Rust logo|言語クライアント|ClickHouse用の型付きクライアント。|[ドキュメント](/docs/ja/integrations/language-clients/rust.md)| +|SQLite||データインテグレーション|SQLiteへのデータのインポートおよびエクスポートを可能にし、ClickHouseから直接SQLiteテーブルにクエリが可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/sqlite)| +|Superset||データビジュアライゼーション|Apache Supersetを使用して、ClickHouseデータを探索および視覚化します。|[ドキュメント](/docs/ja/integrations/data-visualization/superset-and-clickhouse.md)| +|Tableau Online|Tableau Online logo|データビジュアライゼーション|Tableau Onlineは、データの力を活用して、どこからでも迅速かつ自信を持って意思決定できるよう支援します。|[ドキュメント](/docs/ja/integrations/tableau-online)| +|dbt||データインジェスチョン|dbt(データビルドツール)を使用して、ClickHouse内でデータを選択ステートメントを記述するだけで変換します。dbtはELTのTを担当します。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md)| + +
+
+ +パートナーインテグレーション + +
+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Airbyte|Airbyte logo|データインジェスチョン|Airbyteを使用して、140以上のコネクターとELTデータパイプラインを作成し、ClickHouseにデータをロードおよび同期します。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)| +|AccelData|AccelData Logo|データ管理|ADOCは、ユーザーが視覚化されたデータの信頼性と整合性を監視および保証し、リアルタイムのデータ処理と分析を促進します。|[ドキュメント](https://docs.acceldata.io/documentation/clickhouse) | +|Atlas|Atlas logo|スキーマ管理|ClickHouseのスキーマをコードとして管理します。|[ドキュメント](https://atlasgo.io/guides/clickhouse?utm_source=clickhouse&utm_term=docs)| +|Azure Event Hubs||データインジェスチョン|Apache Kafkaのネイティブプロトコルをサポートするデータストリーミングプラットフォーム。|[ウェブサイト](https://azure.microsoft.com/en-gb/products/event-hubs)| +|BlinkOps|BlinkOps Logo|セキュリティオートメーション|データとユーザー権限を管理する自動化を作成。|[ドキュメント](https://docs.blinkops.com/docs/integrations/clickhouse)| +|Bytewax||データインジェスチョン|Pythonストリームプロセッサをオープンソースとして提供し、データの変換とClickHouseへのインジェスチョンを可能にします。|[ドキュメント](https://bytewax.io/blog/building-a-click-house-sink-for-bytewax)| +|Calyptia (Fluent Bit)|Calyptia logo|データインジェスチョン|ログ、メトリクス、トレースの収集、処理、配信用のCNCF参加オープンソースプロジェクト。|[ブログ](https://clickhouse.com/blog/kubernetes-logs-to-clickhouse-fluent-bit)| +|CloudCanal||データインテグレーション|データ同期と移行ツール。|[ウェブサイト](https://www.cloudcanalx.com/us/)| +|CloudQuery||データインジェスチョン|オープンソースの高性能ELTフレームワーク。|[ドキュメント](https://www.cloudquery.io/docs/plugins/destinations/clickhouse/overview)| +|Confluent||データインジェスチョン|ConfluentプラットフォームでのApache Kafkaとのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka/cloud/confluent/custom-connector)| +|Cube.js||データビジュアライゼーション|Cubeはデータアプリ用のセマンティックレイヤーです。|[ウェブサイト](https://cube.dev/for/clickhouse-dashboard)| +|DBeaver||SQLクライアント|JDBCドライバを介してClickhouseに接続するマルチプラットフォームのデータベース管理ツール。|[ドキュメント](/docs/ja/integrations/sql-clients/dbeaver.md)| +|DataGrip||SQLクライアント|DataGripは、ClickHouse用の専用サポートを備えた強力なデータベースIDEです。|[ドキュメント](/docs/ja/integrations/sql-clients/datagrip.md)| +|Dataddo|Dataddo logo|データインテグレーション|データインテグレーションプラットフォーム|[ウェブサイト](https://www.dataddo.com/storage/clickhouse)| +|DbVisualizer|DbVisualizer logo|SQLクライアント|DbVisualizerは、ClickHouse向けの拡張サポートを提供するデータベースツールです。|[ドキュメント](/docs/ja/integrations/sql-clients/dbvisualizer.md)| +|Decodable|Decodable logo|データインジェスチョン|Apache Flink上の強力なストリームプロセッシング。|[ウェブサイト](https://www.decodable.co/connectors/clickhouse)| +|Deepnote||データビジュアライゼーション|Deepnoteは、チームでインサイトを発見し共有するために構築されたコラボレーティブなJupyter互換のデータノートブックです。|[ドキュメント](/docs/ja/integrations/data-visualization/deepnote.md)| +|DLT||データインテグレーション|データのロードを容易にするオープンソースのPythonライブラリ。|[ドキュメント](/docs/ja/integrations/dlt)| +|Draxlr||データビジュアライゼーション|Draxlrは、データのビジュアライゼーションと分析を提供するビジネスインテリジェンステゥールです。|[ドキュメント](/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md)| +|EMQX||データインジェスチョン|EMQXは、高性能のリアルタイムメッセージ処理エンジンを搭載し、大規模スケールでIoTデバイスのイベントストリーミングを実現するオープンソースMQTTブローカーです。|[ドキュメント](/docs/ja/integrations/emqx)| +|Explo|Explo logo|データビジュアライゼーション|Exploは、任意のプラットフォーム向けの顧客向け分析ツールです。|[ドキュメント](/docs/ja/integrations/explo)| +|Gigasheet|Gigasheet logo|データビジュアライゼーション|ビジネスユーザーが瞬時にClickHouseデータを分析および探索できるクラウドビッグデータ分析スプレッドシート。|[ウェブサイト](https://gigasheet.com/enterprise)| +|GlassFlow||データインジェスチョン|ClickHouse向けのPythonによるリアルタイムイベントストリーミングとデータ変換|[ドキュメント](https://docs.glassflow.dev/integrations/managed-connectors/sinks/clickhouse)| +|Goldsky||データインテグレーション|高性能Web3データインデクシング、サブグラフ、リアルタイムデータレプリケーションパイプライン。|[ドキュメント](https://docs.goldsky.com/introduction)| +|Grafana||データビジュアライゼーション|Grafanaを使用して、ダッシュボードを通じてデータを作成、探索、共有可能。|[ドキュメント](/docs/ja/integrations/data-visualization/grafana/index.md)| +|Great Expectations|Great Expectations logo|データ管理|オープンソースのデータ管理ツールで、有料のクラウドオファリングあり。|[ウェブサイト](https://greatexpectations.io/)| +|GrowthBook|GrowthBook logo|データビジュアライゼーション|データウェアハウスネイティブな実験プラットフォーム(機能フラグおよびA/Bテスト)。|[ドキュメント](https://docs.growthbook.io/warehouses/clickhouse)| +|HEX|HEX logo|データビジュアライゼーション|ノートブック、データアプリ、SQL、Python、コードなし、Rなどあらゆるものを備えたモダンで協力的なプラットフォーム。|[ドキュメント](https://learn.hex.tech/docs/connect-to-data/data-connections/overview)| +|Hashboard||データビジュアライゼーション|[Hashboard](https://hashboard.com)は、セルフサービスデータ探索とメトリクストラッキングを可能にするビジネスインテリジェンスプラットフォームです。|[ドキュメント](https://docs.hashboard.com/docs/database-connections/clickhouse)| +|HighTouch|HighTouch logo|データインテグレーション|データを直接ウェアハウスから140以上の宛先に同期|[ウェブサイト](https://hightouch.com/docs/sources/clickhouse)| +|Holistics|Holistics logo|データビジュアライゼーション|ClickHouseデータベース向けのビジネスインテリジェンス|[ウェブサイト](https://www.holistics.io/integrations/clickhouse/)| +|IBM Instana| |データ管理|InstanaはClickHouseサーバープロセスを自動検出して監視可能|[ドキュメント](https://www.ibm.com/docs/en/instana-observability/current?topic=technologies-monitoring-clickhouse)| +|Jitsu||データ分析|オープンソースのイベントコレクションプラットフォーム。|[ドキュメント](https://classic.jitsu.com/docs/destinations-configuration/clickhouse-destination)| +|LangChain|🦜️🔗|SDK|LangChainは言語モデルを利用したアプリケーション開発のためのフレームワーク|[ドキュメント](https://python.langchain.com/v0.2/docs/integrations/vectorstores/clickhouse/)| +|Mage|Metaplane logo|データインジェスチョン|データの変換と統合用オープンソースデータパイプラインツール|[ドキュメント](https://docs.mage.ai/integrations/databases/ClickHouse)| +|Metaplane|Metaplane logo|データ管理|すべてのデータチーム向けのデータ監視|[ウェブサイト](https://www.metaplane.dev/integrations)| +|MindsDB|MindsDB logo|AI/ML| 企業データからAIをカスタマイズするためのプラットフォーム |[ウェブサイト](https://mindsdb.com/clickhouse-machine-learning )| +|Mitzu|Mitzu logo|データビジュアライゼーション|Mitzuは、データをコピーせずにファネル、リテンション、ユーザーセグメンテーションの洞察を得るためのノーコードウェアハウスネイティブ製品分析アプリケーションです。|[ドキュメント](/docs/ja/integrations/mitzu)| +|Mode Analytics|Mode logo|データビジュアライゼーション|データチームを中心にしたビジネスインテリジェンス|[ウェブサイト](https://mode.com/)| +|Omni||データビジュアライゼーション|言語に対応したビジネスインテリジェンス。Omniと共にデータの探索、可視化、モデリングを自分の方法で行えます。スプレッドシートからSQLまで、一つのプラットフォームで。| [ウェブサイト](https://omni.co/)| +|Openblocks|Openblocks logo|SQLクライアント|OpenblocksはUIを構築するためのローコードプラットフォーム|[ドキュメント](https://docs.openblocks.dev/data-sources/connect-to-databases/clickhouse/)| +|OpsRamp (HP)| OpsRamp Logo|データ管理| ClickHouseに対する観測可能性メトリクスを提供|[ドキュメント](https://docs.opsramp.com/integrations/database-no-sql/automonitor-clickhouse-monitoring/)| +|Popsink||データインテグレーション|リアルタイムの変更データキャプチャ(CDC)パイプラインをClickHouseに構築。|[ドキュメント](https://docs.popsink.com/connectors/target/clickhouse/)| +|Prequel||データ共有|PrequelにClickHouseインスタンスを接続し、ユーザーやパートナーにデータを共有または同期。|[ドキュメント](https://docs.prequel.co/docs/sources-clickhouse-generic)| +|Quesma||データインテグレーション|KibanaおよびOpenSearch Dashboardsを使用してClickHouseのデータと組み合わせて使用。|[ウェブサイト](https://quesma.com/quesma-for-elk)| +|Redash|Redash logo|データビジュアライゼーション|データソースの接続とクエリの作成、ダッシュボードの作成、データの視覚化、および共有。|[ウェブサイト](https://redash.io/help/data-sources/querying/supported-data-sources)| +|Redpanda|Redpanda logo|データインジェスチョン|Redpandaは、開発者向けのストリーミングデータプラットフォームです。Apache KafkaにAPI互換であり、10倍速く、使いやすく、よりコスト効率的です。|[ブログ](https://redpanda.com/blog/real-time-olap-database-clickhouse-redpanda)| +|Restack Data Hub|Restack logo|データガバナンス|Restack Data Hubでより包括的なデータガバナンスおよび観測可能性フレームワークを実現可能。|[ドキュメント](https://www.restack.io/docs/datahub-knowledge-datahub-clickhouse-integration)| +|Restack OpenMetadata|Restack logo|データ品質|Restack OpenMetadataは、メタデータの抽出、クエリ使用状況の追跡、データプロファイリング、データ品質チェックをサポート。|[ドキュメント](https://www.restack.io/docs/openmetadata-knowledge-openmetadata-clickhouse-integration)| +|Retool||ノーコード|ドラッグアンドドロップインターフェースでアプリケーションを作成。|[ドキュメント](/docs/ja/integrations/retool)| +|Rill||データビジュアライゼーション|RillはOLAPエンジンと共にデータをスライス&ダイスするためのオペレーショナルBIツールです。|[ドキュメント](https://docs.rilldata.com/reference/olap-engines/clickhouse)| +|RisingWave||データインジェスチョン| ポストグレSQLのような体験のSQLストリーム処理。Apache Flinkより10倍速く、よりコスト効率的です。 |[ドキュメント](https://docs.risingwave.com/docs/current/sink-to-clickhouse/)| +|RudderStack||データインジェスチョン|RudderStackは、顧客データを簡単に収集し、必要とするツールとチームに送信します。|[ドキュメント](https://www.rudderstack.com/docs/destinations/warehouse-destinations/clickhouse/)| +|RunReveal|RunReveal logo|データインジェスチョン|あらゆるSaaSアプリケーションからの監査ログをClickHouseにインジェストおよび正規化。スケジュールされたクエリからアラートと検出を作成。|[ウェブサイト](https://runreveal.com)| +|Sematext|Sematext logo|データ管理|ClickHouseデータベースの観測可能性監視。|[ドキュメント](https://sematext.com/docs/integration/clickhouse/)| +|SiSense|SiSense logo|データビジュアライゼーション|あらゆるアプリケーションまたはワークフローに分析を埋め込み。|[ウェブサイト](https://www.sisense.com/data-connectors/)| +|SigNoz|SigNoz logo|データビジュアライゼーション|オープンソースの観測可能性プラットフォーム|[ドキュメント](https://www.signoz.io/docs/architecture/)| +|Snappy Flow|Snappy Flow logo|データ管理|プラグインを介してClickHouseデータベースのメトリクスを収集。|[ドキュメント](https://docs.snappyflow.io/docs/Integrations/clickhouse/instance)| +|Soda|Soda logo|データ品質|データがデータベースにロードされる前に品質を確認することにより、品質問題を検出、解決、防止できるSodaインテグレーション。|[ウェブサイト](https://www.soda.io/integrations/clickhouse)| +|StreamingFast|StreamingFast logo|データインジェスチョン| ブロックチェーンに依存しない、並列化された、ストリーミング優先のデータエンジン。|[ウェブサイト](https://www.streamingfast.io/)| +|Streamkap|Streamkap logo|データインジェスチョン|ClickHouseへのリアルタイムCDC(Change Data Capture)ストリーミングを数分で設定。|[ドキュメント](https://docs.streamkap.com/docs/clickhouse)| +|Supabase|Supabase logo|データインジェスチョン|オープンソースのFirebase代替|[GitHub](https://github.com/supabase/wrappers/tree/main/wrappers/src/fdw/clickhouse_fdw),[ブログ](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres)| +|Teleport|Teleport logo|セキュア接続|Teleport Database Serviceはx509証明書を用いてClickHouseに認証を行い、ClickHouseのHTTPとネイティブ(TCP)インターフェースで利用可能です。|[ドキュメント](https://goteleport.com/docs/database-access/enroll-self-hosted-databases/clickhouse-self-hosted/)| +|TABLUM.IO||SQLクライアント|様々なソースからデータをインジェストし、不整合を正規化・クレンジングし、SQLを通じてそれにアクセスできるようにします。|[ドキュメント](/docs/ja/integrations/sql-clients/tablum.md)| +|Tooljet|Tooljet logo|データビジュアライゼーション|ToolJetはカスタム内部ツールを作成してデプロイするためのオープンソースのローロードフレームワークです。|[ドキュメント](https://docs.tooljet.com/docs/1.x.x/data-sources/clickhouse/)| +|Upstash||データインジェスチョン|サーバーレスKafkaおよび他のソリューションを提供するデータプラットフォーム|[ウェブサイト](https://upstash.com/)| +|Vector|Vector logo|データインジェスチョン|ClickHouseとの組み込み互換性を備えた観測可能性パイプラインを構築するための軽量で超高速なツール。|[ドキュメント](/docs/ja/integrations/vector/)| +|WarpStream||データインジェスチョン|オブジェクトストレージ上に直接構築されたKafka互換のデータストリーミングプラットフォーム|[ウェブサイト](https://www.warpstream.com/)| +|YepCode||データインテグレーション|コードを書いて統合と自動化するためのツール。|[ドキュメント](https://yepcode.io/docs/integrations/clickhouse/)| +|Zing Data|Zing logo|データビジュアライゼーション|ClickHouse用のシンプルなソーシャルビジネスインテリジェンス。iOS、Android、ウェブ向けに設計されてます。|[ドキュメント](https://docs.getzingdata.com/docs/)| +
+ +
+ +コミュニティインテグレーション + +
+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Apache Airflow|Airflow logo|データインジェスチョン|データエンジニアリングパイプラインのためのオープンソースワークフローマネジメントプラットフォーム|[Github](https://github.com/bryzgaloff/airflow-clickhouse-plugin)| +|Apache Beam|Beam logo|データインジェスチョン|データ処理ワークフローの定義と実行のためのオープンソースで統一化されたモデルと言語固有のSDKセット。Google Dataflowと互換性あり。|[ドキュメント](https://clickhouse.com/docs/ja/integrations/apache-beam),
[例](https://github.com/ClickHouse/clickhouse-beam-connector/)| +|Apache InLong|InLong logo|データインジェスチョン|大規模データのためのワンストップの統合フレームワーク|[ドキュメント](https://inlong.apache.org/docs/data_node/load_node/clickhouse)| +|Apache Nifi|Nifi logo|データインジェスチョン|ソフトウェアシステム間のデータフローを自動化|[ドキュメント](/docs/ja/integrations/nifi)| +|Apache SeaTunnel|SeaTunnel logo|データインジェスチョン|SeaTunnelは非常に使いやすい超高性能の分散データ統合プラットフォーム|[ウェブサイト](https://seatunnel.apache.org/docs/2.3.0/connector-v2/sink/Clickhouse)| +|Apache SkyWalking|SkyWalking logo|データ管理|クラウドネイティブアーキテクチャ内の分散システム向けの監視、トレース、診断機能を提供するオープンソースAPMシステム。|[ブログ](https://skywalking.apache.org/blog/2024-03-12-monitoring-clickhouse-through-skywalking/)| +|Apache StreamPark|SeaTunnel logo|データインジェスチョン|ストリーム処理アプリケーション開発フレームワークとストリーム処理オペレーションプラットフォーム。|[ウェブサイト](https://streampark.apache.org/docs/intro)| +|Bytebase|ByteBase logo|データ管理|オープンソースのデータベースDevOpsツール。アプリケーション開発ライフサイクル全体でデータベースを管理するGitLabです。|[ドキュメント](https://www.bytebase.com/docs/introduction/supported-databases)| +|C#||言語クライアント|ClickHouse.Clientは、ClickHouseのための機能豊富なADO.NETクライアント実装|[ドキュメント](https://github.com/DarkWanderer/ClickHouse.Client/wiki/Quick-start)| +|C++|Cpp logo|言語クライアント|ClickHouse用のC++クライアント|[GitHub](https://github.com/ClickHouse/clickhouse-cpp)| +|CHProxy| |データ管理|ChproxyはClickHouseデータベースのためのHTTPプロキシおよびロードバランサ|[GitHub](https://github.com/ContentSquare/chproxy)| +|Chat-DBT| |AIインテグレーション|Chat GPTを利用してClickHouseクエリを作成。|[GitHub](https://github.com/plmercereau/chat-dbt)| +|ClickHouse Monitoring Dashboard||ダッシュボード|ClickHouseのためのシンプルな監視ダッシュボード|[Github](https://github.com/duyet/clickhouse-monitoring)| +|Common Lisp|clickhouse-cl Logo|言語クライアント|Common Lisp ClickHouseクライアントライブラリ|[GitHub](https://github.com/juliojimenez/clickhouse-cl)| +|DBNet|Airflow logo|ソフトウェアIDE|Goをバックエンド、ブラウザをフロントエンドとするWebベースのSQL IDE。|[Github](https://github.com/dbnet-io/dbnet)| +|DataLens|Datalens logo|データビジュアライゼーション|オープンソースのデータ分析およびビジュアライゼーションツール。|[ウェブサイト](https://datalens.tech/),
[ドキュメント](https://datalens.tech/docs/en/)| +|Dataease|Dataease logo|データビジュアライゼーション|データを分析してビジネストレンドの洞察を得るためのオープンソースのデータビジュアライゼーション解析ツール。|[ウェブサイト](https://dataease.io/)| +|Datahub|Datahub logo|データ管理|データ発見、データ監視、フェデレーションガバナンスを可能にするオープンソースデータカタログ|[ドキュメント](https://datahubproject.io/docs/generated/ingestion/sources/clickhouse/)| +|Dbmate| |データ管理|データベーススキーマを複数の開発者やサーバー間で同期するためのデータベース移行ツール|[GitHub](https://github.com/amacneil/dbmate#clickhouse)| +|DeepFlow|Deepflow logo|データインジェスチョン|eBPFを利用したアプリケーション観測可能性|[ウェブサイト](https://deepflow.io)| +|Easypanel|Easypanel logo|デプロイメント方法|モダンなサーバーコントロールパネル。自身のサーバーにClickHouseをデプロイするために使用可能。|[ウェブサイト](https://easypanel.io),
[ドキュメント](docs/en/integrations/deployment/easypanel/index.md)| +|Explo||データビジュアライゼーション|Exploは、柔軟なコンポーネントを提供することで企業がリアルタイム分析ダッシュボードを構築するのを助けます。|[ウェブサイト](https://www.explo.co/integrations/clickhouse)| +|Flink|Flink logo|データインジェスチョン|Async Http Clientを活用したClickHouseデータベース用Flinkシンク|[GitHub](https://github.com/itinycheng/flink-connector-clickhouse)| +|Goose|Goose logo|データマイグレーション|SQLマイグレーションとGo関数をサポートするデータベースマイグレーションツール。|[GitHub](https://github.com/pressly/goose),
[ドキュメント](https://pressly.github.io/goose/)| +|Ibis|Ibis logo|言語クライアント|モダンなSQLのスケールとパフォーマンスを持つPython分析の柔軟性|[ウェブサイト](https://ibis-project.org/backends/ClickHouse/)| +|Jaeger|Jaeger logo|データインジェスチョン|ClickHouseにトレースを保存するためのJaeger gRPCストレージプラグイン実装|[GitHub](https://github.com/jaegertracing/jaeger-clickhouse)| +|JupySQL|JupySQL logo|SQLクライアント|Jupyterノートブック用のネイティブSQLクライアント。|[ドキュメント](/docs/ja/integrations/jupysql)| +|Kestra||データオーケストレーション|オープンソースのデータオーケストレーションおよびスケジューリングプラットフォーム|[ウェブサイト](https://kestra.io/plugins/plugin-jdbc-clickhouse/)| +|Logchain|Adaptive Logchain logo|セキュリティ|データセキュリティと特権アクセス管理|[ウェブサイト](https://github.com/adaptive-scale/logchain)| +|Meltano||データインジェスチョン|Meltanoはオープンソースのフルスタックデータ統合プラットフォーム|[ドキュメント](https://hub.meltano.com/extractors/tap-clickhouse) +|Mprove|mprove logo|データビジュアライゼーション|バージョン管理機能を有するセルフサービスビジネスインテリジェンス|[ウェブサイト](https://mprove.io/)| +|Netobserv||データ管理|OpenShiftおよびKubernetes用のネットワーク観測可能性オペレーター。|[ブログ](https://cloud.redhat.com/blog/deploying-network-observability-without-loki-an-example-with-clickhouse) +|Observable||データビジュアライゼーション|オンラインでデータの探索、分析、可視化、通信が協力的に行えるプラットフォーム。|[ウェブサイト](https://observablehq.com/@stas-sl/clickhouse-playground)| +|OpenTelemetry|Otel logo|データインジェスチョン|ClickHouseにログ、メトリクス、トレースのOpenTelemetryデータを送信するエクスポーター|[GitHub](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter)| +|PHP|PHP logo|言語クライアント|この拡張機能は、Yiiフレームワーク2.0用のClickHouse統合を提供します。|[GitHub](https://github.com/smi2/phpClickHouse)| +|Pgwarehouse||データインジェスチョン|Postgresテーブルを迅速にClickHouseにレプリケートするためのシンプルツール|[GitHub](https://github.com/scottpersinger/pgwarehouse)| +|Pinax|Pinax logo|ブロックチェーン分析|ブロックチェーン向けのインデックス、分析、検索ツール。|[ブログ](https://blog.pinax.network/substreams/simplify-real-time-blockchain-analytics-with-clickhouse/)| +|Pulse|PulseUI logo|データ管理|内部データUI用のデベロッパープラットフォーム。|[ウェブサイト](https://www.timestored.com/pulse/)| +|QStudio|QStudio logo|GUI|ClickHouseデータベースを操作するためのシンプルに使えるGUI。|[ウェブサイト](https://www.timestored.com/qstudio/database/clickhouse)| +|QStudio|qStudio logo|SQLクライアント|qStudioは、SQLスクリプトの実行と結果のチャート化が可能な無料のSQL GUIです。|[ドキュメント](https://www.timestored.com/qstudio/database/clickhouse)| +|Qryn|qryn logo|データインジェスチョン、管理、ビジュアライゼーション | qrynはClickHouseの上に構築された多言語対応の観測可能性スタックであり、Loki、Prometheus、Tempo、Opentelemetryなどの多くのフォーマットや標準APIと透過的に互換性があり、カスタムクライアント、コード、プラグインを必要としません。|[ドキュメント](https://qryn.dev), [Github](https://github.com/metrico), [ウェブサイト](https://qryn.cloud)| +|RSyslog|RSyslog logo|データインジェスチョン|ClickHouseへのロギングをネイティブにサポートするモジュール。|[ドキュメント](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html)| +|Rocket.BI||データビジュアライゼーション|RocketBIは、データを迅速に分析し、ドラッグ&ドロップでビジュアライゼーションを構築し、コラボレーションするのを助ける自己完結型のビジネスインテリジェンスプラットフォーム。|[GitHub](https://github.com/datainsider-co/rocket-bi),
[ドキュメント](/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md)| + +|Ruby|Ruby logo|言語クライアント|ClickHouse用のモダンなRubyデータベースドライバ|[GitHub](https://github.com/shlima/click_house)| +|R|R logo|言語クライアント|RパッケージはClickHouseデータベース用のDBIインターフェースです|[GitHub](https://github.com/IMSMWU/RClickHouse)| +|SQLPad||SQLクライアント|SQLPadは、SQLクエリを書いて実行し、結果を視覚化するためのウェブアプリです|[Documentation](https://getsqlpad.com/en/connections/#clickhouse)| +|Scala|Scala logo|言語クライアント|Akka Httpを使用したClickHouseのScalaクライアント|[GitHub](https://github.com/crobox/clickhouse-scala-client)| +|SchemaSpy|SchemaSpy logo|データ可視化|SchemaSpyはClickHouseのスキーマ可視化をサポートします|[GitHub](https://github.com/schemaspy/schemaspy)| +|Tableau|Tableau logo|データ可視化|ビジネスインテリジェンスにフォーカスしたインタラクティブなデータ可視化ソフトウェア|[Documentation](/docs/ja/integrations/tableau)| +|TricksterCache||データ可視化| オープンソースのHTTPリバースプロキシキャッシュおよびタイムシリーズダッシュボードアクセラレーター |[Website](https://trickstercache.org/)| +|Visual Studio Client|VS logo|言語クライアント|Visual Studioの軽量クライアント|[Marketplace](https://marketplace.visualstudio.com/items?itemName=fanruten.clickhouse-light)| +|VulcanSQL|VulcanSQL logo|データAPIフレームワーク|データアプリケーション用のデータAPIフレームワークで、データ担当者がより速くデータAPIを作成し共有するのを支援します。SQLテンプレートをデータAPIに変換し、バックエンドスキルは不要です。|[Website](https://vulcansql.com/),
[Documentation](https://vulcansql.com/docs/connect/clickhouse)| +
diff --git a/docs/ja/integrations/language-clients/_category_.yml b/docs/ja/integrations/language-clients/_category_.yml new file mode 100644 index 00000000000..ced0e2470a4 --- /dev/null +++ b/docs/ja/integrations/language-clients/_category_.yml @@ -0,0 +1,8 @@ +position: 101 +label: 'Language clients' +collapsible: true +collapsed: true +link: + type: generated-index + title: Language clients + slug: /ja/integrations/language-clients diff --git a/docs/ja/integrations/language-clients/go/index.md b/docs/ja/integrations/language-clients/go/index.md new file mode 100644 index 00000000000..607e2ab4e85 --- /dev/null +++ b/docs/ja/integrations/language-clients/go/index.md @@ -0,0 +1,2619 @@ +--- +sidebar_label: Go +sidebar_position: 1 +keywords: [clickhouse, go, client, golang] +slug: /ja/integrations/go +description: ClickHouse用のGoクライアントにより、ユーザーはGo標準のdatabase/sqlインターフェースまたは最適化されたネイティブインターフェースを使用してClickHouseに接続することができます。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# ClickHouse Go + +## 簡単な例 +まずは簡単な例から始めましょう。これはClickHouseに接続し、システムデータベースからの選択を行います。始めるためには、接続情報が必要です。 + +### 接続情報 + + +### モジュールの初期化 + +```bash +mkdir clickhouse-golang-example +cd clickhouse-golang-example +go mod init clickhouse-golang-example +``` + +### サンプルコードをコピー + +このコードを`clickhouse-golang-example`ディレクトリに`main.go`としてコピーしてください。 + +```go title=main.go +package main + +import ( + "context" + "crypto/tls" + "fmt" + "log" + + "github.com/ClickHouse/clickhouse-go/v2" + "github.com/ClickHouse/clickhouse-go/v2/lib/driver" +) + +func main() { + conn, err := connect() + if err != nil { + panic((err)) + } + + ctx := context.Background() + rows, err := conn.Query(ctx, "SELECT name,toString(uuid) as uuid_str FROM system.tables LIMIT 5") + if err != nil { + log.Fatal(err) + } + + for rows.Next() { + var ( + name, uuid string + ) + if err := rows.Scan( + &name, + &uuid, + ); err != nil { + log.Fatal(err) + } + log.Printf("name: %s, uuid: %s", + name, uuid) + } + +} + +func connect() (driver.Conn, error) { + var ( + ctx = context.Background() + conn, err = clickhouse.Open(&clickhouse.Options{ + Addr: []string{":9440"}, + Auth: clickhouse.Auth{ + Database: "default", + Username: "default", + Password: "", + }, + ClientInfo: clickhouse.ClientInfo{ + Products: []struct { + Name string + Version string + }{ + {Name: "an-example-go-client", Version: "0.1"}, + }, + }, + + Debugf: func(format string, v ...interface{}) { + fmt.Printf(format, v) + }, + TLS: &tls.Config{ + InsecureSkipVerify: true, + }, + }) + ) + + if err != nil { + return nil, err + } + + if err := conn.Ping(ctx); err != nil { + if exception, ok := err.(*clickhouse.Exception); ok { + fmt.Printf("Exception [%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) + } + return nil, err + } + return conn, nil +} +``` + +### go mod tidyを実行 + +```bash +go mod tidy +``` +### 接続情報を設定 +以前に調べた接続情報を`main.go`の`connect()`関数で設定します: + +```go +func connect() (driver.Conn, error) { + var ( + ctx = context.Background() + conn, err = clickhouse.Open(&clickhouse.Options{ + #highlight-next-line + Addr: []string{":9440"}, + Auth: clickhouse.Auth{ + #highlight-start + Database: "default", + Username: "default", + Password: "", + #highlight-end + }, +``` + +### 例を実行 +```bash +go run . +``` +```response +2023/03/06 14:18:33 name: COLUMNS, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: SCHEMATA, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: TABLES, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: VIEWS, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: hourly_data, uuid: a4e36bd4-1e82-45b3-be77-74a0fe65c52b +``` + +### 詳細を学ぶ +このカテゴリーの残りのドキュメントでは、ClickHouse Goクライアントの詳細について説明します。 + +## ClickHouse Go クライアント + +ClickHouseは2つの公式Goクライアントをサポートしています。これらのクライアントは補完的であり、意図的に異なるユースケースをサポートしています。 + +* [clickhouse-go](https://github.com/ClickHouse/clickhouse-go) - 高レベルの言語クライアントで、Go標準のdatabase/sqlインターフェースまたはネイティブインターフェースのいずれかをサポートしています。 +* [ch-go](https://github.com/ClickHouse/ch-go) - 低レベルクライアント。ネイティブインターフェースのみ。 + +clickhouse-goは高レベルのインターフェースを提供し、行指向のセマンティクスを使用してデータのクエリと挿入を可能にし、データ型に対して寛容なバッチ処理を行います。ch-goは最適化された列指向のインターフェースを提供し、タイプの厳密さと複雑な使用を犠牲にして低CPUとメモリオーバーヘッドで高速なデータブロックのストリーミングを行います。 + +version 2.3から、clickhouse-goは低レベル関数(エンコーディング、デコーディング、圧縮など)にch-goを利用しています。clickhouse-goはまた、Goの`database/sql`インターフェース規格をサポートしています。どちらのクライアントもエンコードのためにネイティブフォーマットを使用して、最適なパフォーマンスを提供し、ネイティブClickHouseプロトコルを介して通信できます。clickhouse-goは、ユーザーがプロキシまたは負荷分散の要件を持っている場合にはHTTPを輸送機構としてもサポートしています。 + +クライアントライブラリを選択する際には、各クライアントの利点と欠点を認識しておく必要があります。詳細はChoosing a Client Libraryを参照してください。 + +| | ネイティブフォーマット | ネイティブプロトコル | HTTPプロトコル | 行指向API | 列指向API | タイプの柔軟性 | 圧縮 | クエリプレースホルダ | +|:-------------:|:------------------:|:------------------:|:--------------:|:--------------:|:-------------:|:------------------:|:-------------------:|:------------------:| +| clickhouse-go | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| ch-go | ✅ | ✅ | | | ✅ | | ✅ | | + +## クライアントの選択 + +クライアントライブラリの選択は、使用パターンと最適なパフォーマンスの要求に依存します。毎秒数百万件の挿入が必要な挿入中心のユースケースでは、低レベルクライアント[ch-go](https://github.com/ClickHouse/ch-go)の使用をお勧めします。このクライアントは、ClickHouseネイティブフォーマットが要求する行指向フォーマットから列へのデータ変換の関連オーバーヘッドを回避し、簡易化のために`interface{}`(`any`)タイプのリフレクションと使用を回避します。 + +集計を中心としたクエリワークロードまたはスループットが低い挿入ワークロードに関しては、[clickhouse-go](https://github.com/ClickHouse/clickhouse-go)が使い慣れた`database/sql`インターフェースとよりシンプルな行セマンティクスを提供します。ユーザーはオプションでHTTPを輸送プロトコルとして使用し、構造体との間で行をマーシャリングするためのヘルパー関数を利用することができます。 + +## clickhouse-go クライアント + +clickhouse-goクライアントは、ClickHouseと通信するための2つのAPIインターフェースを提供します: + +* ClickHouseクライアント専用API +* `database/sql`標準 - Golangが提供するSQLデータベース周りのジェネリックインターフェース。 + +`database/sql`は、データベースに依存しないインターフェースを提供し、開発者がデータストアを抽象化することを可能にしますが、パフォーマンスに影響を与えるいくつかのタイプとクエリセマンティクスを強制します。このため、パフォーマンスが重要な場合(https://github.com/clickHouse/clickHouse-go#benchmark)、クライアント専用APIの使用が推奨されます。ただし、複数データベースをサポートするツールにClickHouseを統合したいユーザーは標準インターフェースの使用を好むかもしれません。 + +いずれのインターフェースもデータをエンコードする際に[native format](/docs/ja/native-protocol/basics.md)とネイティブプロトコルを使用します。加えて、標準インターフェースはHTTPを介した通信もサポートしています。 + +| | ネイティブフォーマット | ネイティブプロトコル | HTTPプロトコル | バルク書き込みサポート | 構造体マーシャリング | 圧縮 | クエリプレースホルダ | +|:------------------:|:------------------:|:------------------:|:--------------:|:------------------:|:-----------------:|:-----------:|:------------------:| +| ClickHouse API | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ | +| `database/sql` API | ✅ | ✅ | ✅ | ✅ | | ✅ | ✅ | + +## インストール + +ドライバのv1は非推奨となっており、機能更新や新しいClickHouseタイプのサポートは行われません。ユーザーは、パフォーマンスが優れているv2への移行を推奨します。 + +2.xバージョンのクライアントをインストールするには、パッケージをgo.modファイルに追加してください: + +`require github.com/ClickHouse/clickhouse-go/v2 main` + +または、リポジトリをクローンしてください: + +```bash +git clone --branch v2 https://github.com/clickhouse/clickhouse-go.git $GOPATH/src/github +``` + +他のバージョンをインストールするには、パスまたはブランチ名を必要に応じて修正してください。 + +```bash +mkdir my-clickhouse-app && cd my-clickhouse-app + +cat > go.mod <<-END + module my-clickhouse-app + + go 1.18 + + require github.com/ClickHouse/clickhouse-go/v2 main +END + +cat > main.go <<-END + package main + + import ( + "fmt" + "github.com/ClickHouse/clickhouse-go/v2" + ) + + func main() { + conn, _ := clickhouse.Open(&clickhouse.Options{Addr: []string{"127.0.0.1:9000"}}) + v, _ := conn.ServerVersion() + fmt.Println(v.String()) + } +END + +go mod tidy +go run main.go + +``` + +### バージョニングと互換性 + +クライアントはClickHouseとは独立してリリースされます。2.xは現在の主な開発対象です。2.xの全バージョンは互いに互換性があるべきです。 + +#### ClickHouse互換性 + +クライアントは以下をサポートしています: + +- ここに記録されているClickHouseの全てのサポートされるバージョン。[ここ](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md)に記載されている通りです。ClickHouseのバージョンがもはやサポートされていない場合、それに対してクライアントリリースもアクティブにはテストされなくなります。 +- クライアントのリリース日から2年以内の全てのClickHouseバージョン。注意:LTSバージョンのみがアクティブにテストされます。 + +#### Golang互換性 + +| クライアントバージョン | Golangバージョン | +|:--------------:|:---------------:| +| => 2.0 <= 2.2 | 1.17, 1.18 | +| >= 2.3 | 1.18 | + + +## ClickHouse クライアント API + +ClickHouseクライアントAPI用の全てのコード例は[こちら](https://github.com/ClickHouse/clickhouse-go/tree/main/examples)にあります。 + +### 接続 + +以下の例はClickHouseに接続し、サーバーバージョンを返す例を示しています。ClickHouseがセキュリティ保護されておらず、デフォルトのユーザーでアクセス可能な場合を想定しています。 + +注意:デフォルトのネイティブポートを使用して接続しています。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +fmt.Println(v) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/connect.go) + +**後続の例では、明示的に示されていない限り、ClickHouseの`conn`変数が作成され、利用可能であると仮定します。** + +#### 接続設定 + +接続を開く際に、Options構造体を使用してクライアントの動作を制御できます。利用可能な設定は以下の通りです: + +* `Protocol` - ネイティブまたはHTTP。現在、HTTPは[database/sql API](#databasesql-api)のみサポートされています。 +* `TLS` - TLSオプション。非nilの値がTLSを有効にします。[Using TLS](#using-tls)を参照。 +* `Addr` - アドレス(ポート込み)のスライス。 +* `Auth` - 認証詳細。[Authentication](#authentication)を参照。 +* `DialContext` - 接続の確立方法を決定するカスタムダイヤル関数。 +* `Debug` - デバッグを有効にするためのtrue/false。 +* `Debugf` - デバッグ出力を消費する関数を提供します。`debug`がtrueに設定されている必要があります。 +* `Settings` - ClickHouseの設定のマップ。これらは全てのClickHouseクエリに適用されます。[Using Context](#using-context)を使用して、クエリごとに設定を設定できます。 +* `Compression` - ブロックの圧縮を有効にします。[Compression](#compression)を参照。 +* `DialTimeout` - 接続の確立にかかる最大時間。デフォルトは`1秒`。 +* `MaxOpenConns` - 任意の時点で使用できる最大接続数です。アイドルプールにある接続は増減する可能性がありますが、任意の時点で使用できる接続はこの数に限定されます。デフォルトはMaxIdleConns+5です。 +* `MaxIdleConns` - プールに保持する接続数。可能な場合、接続は再利用されます。デフォルトは`5`。 +* `ConnMaxLifetime` - 接続を利用可能な状態で保持する最長寿命。デフォルトは1時間です。この時間の後、接続は破棄され、必要に応じて新しい接続がプールに追加されます。 +* `ConnOpenStrategy` - ノードアドレスリストをどのように消費し、接続を確立するかを決定します。[Connecting to Multiple Nodes](#connecting-to-multiple-nodes)を参照。 +* `BlockBufferSize` - 一度にバッファにデコードするブロックの最大数。大きな値は並列化を増やしますが、メモリを犠牲にする可能性があります。ブロックサイズはクエリに依存するため、接続時にこれを設定できますが、返すデータに基づいてクエリごとにオーバーライドすることをお勧めします。デフォルトは`2`です。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + DialContext: func(ctx context.Context, addr string) (net.Conn, error) { + dialCount++ + var d net.Dialer + return d.DialContext(ctx, "tcp", addr) + }, + Debug: true, + Debugf: func(format string, v ...interface{}) { + fmt.Printf(format, v) + }, + Settings: clickhouse.Settings{ + "max_execution_time": 60, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionLZ4, + }, + DialTimeout: time.Duration(10) * time.Second, + MaxOpenConns: 5, + MaxIdleConns: 5, + ConnMaxLifetime: time.Duration(10) * time.Minute, + ConnOpenStrategy: clickhouse.ConnOpenInOrder, + BlockBufferSize: 10, +}) +if err != nil { + return err +} +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/connect_settings.go) + +#### 接続プール + +クライアントは接続プールを維持し、必要に応じてクエリ間でこれらを再利用します。任意の時点で使用される接続は`MaxOpenConns`で制御され、プールの最大サイズは`MaxIdleConns`で制御されます。クライアントはクエリの実行ごとにプールから接続を取得し、それを再利用のためにプールに返却します。接続はバッチの期間中使用され、`Send()`で解放されます。 + +プール内の同じ接続が後続のクエリに使用される保証はありませんが、ユーザーが`MaxOpenConns=1`を設定した場合は例外です。これはめったに必要ありませんが、一時テーブルを使用している場合には必要になる場合があります。 + +また`ConnMaxLifetime`はデフォルトで1時間であることに注意してください。このことが原因で、ノードがクラスターを離れる際にClickHouseへの負荷が不均衡になることがあります。これは、ノードが利用不能になると、他のノードに接続がバランスされるためです。これらの接続は持続し、問題のあるノードがクラスターに戻ってもデフォルトで1時間更新されません。負荷の高いワークロードの場合にはこの値を下げることを検討してください。 + +### TLSを使用する + +低レベルでは、全てのクライアント接続メソッド(DSN/OpenDB/Open)は安全な接続を確立するために[Go tls パッケージ](https://pkg.go.dev/crypto/tls)を使用します。Options構造体に非nilの`tls.Config`ポインターが含まれている場合、クライアントはTLSを使用します。 + +```go +env, err := GetNativeTestEnvironment() +if err != nil { + return err +} +cwd, err := os.Getwd() +if err != nil { + return err +} +t := &tls.Config{} +caCert, err := ioutil.ReadFile(path.Join(cwd, "../../tests/resources/CAroot.crt")) +if err != nil { + return err +} +caCertPool := x509.NewCertPool() +successful := caCertPool.AppendCertsFromPEM(caCert) +if !successful { + return err +} +t.RootCAs = caCertPool +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: t, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +fmt.Println(v.String()) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/ssl.go) + +この最小限の`TLS.Config`は通常、ClickHouseサーバーの安全なネイティブポート(通常は9440)に接続するのに十分です。ClickHouseサーバーに有効な証明書がない(期限切れ、ホスト名が間違っている、公開的に認識されるルート認証局によって署名されていない)場合は、InsecureSkipVerifyをtrueにすることもできますが、これは強く推奨されません。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: &tls.Config{ + InsecureSkipVerify: true, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/ssl_no_verify.go) + +追加のTLSパラメータが必要な場合は、アプリケーションコードで`tls.Config`構造体の必要なフィールドを設定する必要があります。これには、特定の暗号スイートの指定、特定のTLSバージョン(たとえば1.2または1.3)の強制、内部CA証明書チェーンの追加、ClickHouseサーバーによって要求された場合のクライアント証明書(および秘密鍵)の追加、そしてより専門的なセキュリティ設定の他のオプションが含まれます。 + +### 認証 + +接続情報でAuth構造体を指定して、ユーザー名とパスワードを指定します。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +if err != nil { + return err +} +v, err := conn.ServerVersion() +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/auth.go) + +### 複数のノードへの接続 + +`Addr`構造体を介して複数のアドレスを指定できます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +fmt.Println(v.String()) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/1c0d81d0b1388dbb9e09209e535667df212f4ae4/examples/clickhouse_api/multi_host.go#L26-L45) + +2つの接続戦略が利用可能です: + +* `ConnOpenInOrder`(デフォルト) - アドレスは順番に消費されます。後のアドレスは、リスト内のより早いアドレスを使用して接続できない場合にのみ利用されます。これは事実上のフェイルオーバー戦略です。 +* `ConnOpenRoundRobin` - ラウンドロビン戦略を使用してアドレス間の負荷をバランスします。 + +これはオプション`ConnOpenStrategy`を介して制御できます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + ConnOpenStrategy: clickhouse.ConnOpenRoundRobin, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/1c0d81d0b1388dbb9e09209e535667df212f4ae4/examples/clickhouse_api/multi_host.go#L50-L67) + +### 実行 + +任意のステートメントを`Exec`メソッドを介して実行できます。これはDDLや単純なステートメントに便利です。大きな挿入やクエリの繰り返しには使用しないでください。 + +```go +conn.Exec(context.Background(), `DROP TABLE IF EXISTS example`) +err = conn.Exec(context.Background(), ` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8, + Col2 String + ) engine=Memory +`) +if err != nil { + return err +} +conn.Exec(context.Background(), "INSERT INTO example VALUES (1, 'test-1')") +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/exec.go) + +クエリに特定の設定を渡すためにContextをクエリに渡す機能に注意してください。詳細は[Using Context](#using-context)でご覧ください。 + +### バッチ挿入 + +大量の行を挿入するために、クライアントはバッチセマンティクスを提供します。これには、バッチの準備と、それへの行の追加が必要です。送信は最終的に`Send()`メソッドを介して行われます。バッチはSendが実行されるまでメモリ内に保持されます。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8 + , Col2 String + , Col3 FixedString(3) + , Col4 UUID + , Col5 Map(String, UInt8) + , Col6 Array(String) + , Col7 Tuple(String, UInt8, Array(Map(String, String))) + , Col8 DateTime + ) Engine = Memory +`) +if err != nil { + return err +} + + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + err := batch.Append( + uint8(42), + "ClickHouse", + "Inc", + uuid.New(), + map[string]uint8{"key": 1}, // Map(String, UInt8) + []string{"Q", "W", "E", "R", "T", "Y"}, // Array(String) + []interface{}{ // Tuple(String, UInt8, Array(Map(String, String))) + "String Value", uint8(5), []map[string]string{ + {"key": "value"}, + {"key": "value"}, + {"key": "value"}, + }, + }, + time.Now(), + ) + if err != nil { + return err + } +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/batch.go) + +ClickHouseの推奨事項は[こちら](https://clickhouse.com/docs/ja/about-us/performance/#performance-when-inserting-data)を参照してください。バッチはgoルーチン間で共有しないでください - ルーチンごとに別々のバッチを構築してください。 + +上記の例から、行を追加する際には変数タイプがカラムタイプと一致する必要があることに注意してください。マッピングは通常明らかですが、このインターフェースは柔軟であるように努めており、精度の損失がない限り型が変換されます。たとえば、次の例では、datetime64に文字列を挿入することを示しています。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + err := batch.Append( + "2006-01-02 15:04:05.999", + ) + if err != nil { + return err + } +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/type_convert.go) + +各カラムタイプに対する対応するgoタイプの全体的な要約については、 [Type Conversions](#type-conversions)をご参照ください。 + +特定の変換のサポートが必要な場合は、問題を報告していただければと思います。 + +### クエリの実行 + +ユーザーは`QueryRow`メソッドを使用して単一の行をクエリするか、`Query`を介して結果セットを繰り返し処理するカーソルを取得することができます。前者はデータをシリアライズするための宛先を受け取るのに対し、後者は各行に対して`Scan`を呼び出す必要があります。 + +```go +row := conn.QueryRow(context.Background(), "SELECT * FROM example") +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 []interface{} + col8 time.Time +) +if err := row.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err +} +fmt.Printf("row: col1=%d, col2=%s, col3=%s, col4=%s, col5=%v, col6=%v, col7=%v, col8=%v\n", col1, col2, col3, col4, col5, col6, col7, col8) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/query_row.go) + +```go +rows, err := conn.Query(ctx, "SELECT Col1, Col2, Col3 FROM example WHERE Col1 >= 2") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + if err := rows.Scan(&col1, &col2, &col3); err != nil { + return err + } + fmt.Printf("row: col1=%d, col2=%s, col3=%s\n", col1, col2, col3) +} +rows.Close() +return rows.Err() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/query_rows.go) + +いずれの場合も、対応するカラム値をシリアライズするためにポインタを変数に渡す必要があることに注意してください。これらは`SELECT`ステートメントで指定された順序で渡す必要があります - デフォルトでは、上記のように`SELECT *`がある場合、カラムの宣言順序が使用されます。 + +挿入と同様に、`Scan`メソッドはターゲット変数が適切なタイプである必要があります。これも柔軟であるよう努めていますが、UUIDカラムを文字列変数に読み込むことなど、型が可能な限り変換されるようサポートしています。さまざまなカラムタイプに対するgolangタイプの一覧については、[Type Conversions](#type-conversions)をご参照ください。 + +最後に、`Query`と`QueryRow`メソッドにContextを渡す能力に注意してください。これは、クエリレベルの設定に使用できます。詳細は[Using Context](#using-context)で参照してください。 + +### 非同期挿入 + +非同期挿入はAsyncメソッドを介してサポートされています。これは、クライアントがデータを受信した後に応答するか、サーバーの挿入が完了するまで待機するかを指定することができます。これにより[wait_for_async_insert](https://clickhouse.com/docs/ja/operations/settings/settings/#wait-for-async-insert)を制御します。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +if err := clickhouse_tests.CheckMinServerServerVersion(conn, 21, 12, 0); err != nil { + return nil +} +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(ctx, `DROP TABLE IF EXISTS example`) +const ddl = ` + CREATE TABLE example ( + Col1 UInt64 + , Col2 String + , Col3 Array(UInt8) + , Col4 DateTime + ) ENGINE = Memory +` +if err := conn.Exec(ctx, ddl); err != nil { + return err +} +for i := 0; i < 100; i++ { + if err := conn.AsyncInsert(ctx, fmt.Sprintf(`INSERT INTO example VALUES ( + %d, '%s', [1, 2, 3, 4, 5, 6, 7, 8, 9], now() + )`, i, "Golang SQL database driver"), false); err != nil { + return err + } +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/async.go) + +### 列指向の挿入 + +カラム形式で挿入することができます。データが既にこの構造に整理されている場合において、パフォーマンスの改善が予想されます。 + +```go +batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example") +if err != nil { + return err +} +var ( + col1 []uint64 + col2 []string + col3 [][]uint8 + col4 []time.Time +) +for i := 0; i < 1_000; i++ { + col1 = append(col1, uint64(i)) + col2 = append(col2, "Golang SQL database driver") + col3 = append(col3, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9}) + col4 = append(col4, time.Now()) +} +if err := batch.Column(0).Append(col1); err != nil { + return err +} +if err := batch.Column(1).Append(col2); err != nil { + return err +} +if err := batch.Column(2).Append(col3); err != nil { + return err +} +if err := batch.Column(3).Append(col4); err != nil { + return err +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/columnar_insert.go) + +### 構造体の使用 + +ユーザーにとって、Golangの構造体はClickHouseのデータの行を論理的に表現するものです。ネイティブインターフェースは、これを支援するための便利な関数を提供しています。 + +#### シリアライズ付き選択 + +Selectメソッドを使用すると、応答行を単一の呼び出しで構造体のスライスにマーシャルできます。 + +```go +var result []struct { + Col1 uint8 + Col2 string + ColumnWithName time.Time `ch:"Col3"` +} + +if err = conn.Select(ctx, &result, "SELECT Col1, Col2, Col3 FROM example"); err != nil { + return err +} + +for _, v := range result { + fmt.Printf("row: col1=%d, col2=%s, col3=%s\n", v.Col1, v.Col2, v.ColumnWithName) +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/select_struct.go) + +#### Scan 構造体 + +ScanStructは、クエリから単一の行を構造体にマーシャルすることを可能にします。 + +```go +var result struct { + Col1 int64 + Count uint64 `ch:"count"` +} +if err := conn.QueryRow(context.Background(), "SELECT Col1, COUNT() AS count FROM example WHERE Col1 = 5 GROUP BY Col1").ScanStruct(&result); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/scan_struct.go) + +#### 構造体の追加 + +AppendStructは[batch](#batch-insert)に構造体を追加して解釈できます。これは、構造体のカラムが名前と型の両方でテーブルと一致する必要があります。全てのカラムが同等の構造体フィールドを持つ必要がありますが、一部の構造体フィールドは同等のカラム表現を持っていない場合もあります。これらは単に無視されます。 + +```go +batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1_000; i++ { + err := batch.AppendStruct(&row{ + Col1: uint64(i), + Col2: "Golang SQL database driver", + Col3: []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9}, + Col4: time.Now(), + ColIgnored: "this will be ignored", + }) + if err != nil { + return err + } +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/append_struct.go) + +### タイプ変換 + +クライアントは挿入とレスポンスのマーシャリングに関して可能な限り柔軟に対応することを目指しています。多くの場合、ClickHouseのカラムタイプに相当するGolangタイプが存在します。例:[UInt64](https://clickhouse.com/docs/ja/sql-reference/data-types/int-uint/) to [uint64](https://pkg.go.dev/builtin#uint64)。これらの論理的なマッピングは常にサポートされるべきです。ユーザーは、変数をカラムに挿入するか、受信データをまず変換することによって、その変換を行える場合において変数タイプを利用することを希望するかもしれません。この透明な変換は、精度の損失が許されない場合にのみ実行されます。例えば、uint32はUInt64カラムから受信データを得るために使用することはできません。逆に、指定フォーマット要件を満たせば、datetime64フィールドに文字列を挿入することもできます。 + +現在サポートされているプリミティブタイプの変換については[こちら](https://github.com/ClickHouse/clickhouse-go/blob/main/TYPES.md)を参照してください。 + +この作業は進行中であり、挿入タイミング(`Append`/`AppendRow`)と読み取り時(`Scan`でご利用いただけます)に分けられます。特定の変換のサポートが必要な場合は、問題を報告してください。 + +### 複雑なタイプ + +#### 日付/日時タイプ + +ClickHouse goクライアントは`Date`、`Date32`、`DateTime`、および`DateTime64`の日付/日時タイプをサポートしています。日付は`2006-01-02`の形式の文字列か、ネイティブGoの`time.Time{}`または`sql.NullTime`を使って挿入できます。日時も同様ですが、`2006-01-02 15:04:05`のフォーマットの文字列としてする必要があります。timezoneオフセットがある場合は、`2006-01-02 15:04:05 +08:00`のようにしてください。`time.Time{}`と`sql.NullTime`は読み取り時にもサポートされており、`sql.Scanner`インターフェースの任意の実装もサポートしています。 + +Timezone情報の扱いは、ClickHouseのタイプと値が挿入/読み取りされているかに依存します: + +* **DateTime/DateTime64** + * **挿入**時には、値はUNIXタイムスタンプ形式でClickHouseに送信されます。タイムゾーンが提供されない場合、クライアントのローカルタイムゾーンが仮定されます。`time.Time{}`や`sql.NullTime`は、対応する論理に変換されます。 + * **選択**時には、カラムのtimezoneが設定されている場合、そのtimezoneが`time.Time`値を返す際に使われます。されていない場合は、サーバーのtimezoneが使われます。 +* **Date/Date32** + * **挿入**時には、日付はUNIXタイムスタンプへの変換時にタイムゾーンを考慮されます、すなわち、タイムゾーンでオフセットされた上で日付として保存されます。日付はClickHouseにロケールがありません。これは、文字列内に指定されていない場合、ローカルタイムゾーンが使われます。 + * **選択**時には、日時が`time.Time{}`または`sql.NullTime{}`インスタンスに読み込まれるときにtimezone情報がありません。 + +#### 配列 + +配列はスライスとして挿入されるべきです。要素の型ルールは[プリミティブタイプ](#type-conversions)に対するものと一致し、可能な場合は要素が変換されます。 + +Scan時には、スライスへのポインタを指定する必要があります。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + []string{strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2)), strconv.Itoa(int(i + 3))}, + [][]int64{{i, i + 1}, {i + 2, i + 3}, {i + 4, i + 5}}, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 []string + col2 [][]int64 +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v\n", col1, col2) +} +rows.Close() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/array.go) + +#### マップ + +マップは、前述の[タイプ変換](#type-conversions)で定義された型ルールに準拠したGolangマップとして挿入されるべきです。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + map[string]uint64{strconv.Itoa(int(i)): uint64(i)}, + map[string][]string{strconv.Itoa(int(i)): {strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2)), strconv.Itoa(int(i + 3))}}, + map[string]map[string]uint64{strconv.Itoa(int(i)): {strconv.Itoa(int(i)): uint64(i)}}, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 map[string]uint64 + col2 map[string][]string + col3 map[string]map[string]uint64 +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2, &col3); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v, col3=%v\n", col1, col2, col3) +} +rows.Close() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/map.go) + +#### タプル + +タプルは任意の長さのカラムのグループを表します。カラムは明示的に名前を付けるか、型だけを指定することができます。例: + +```sql +// 非名 +Col1 Tuple(String, Int64) + +// 名 +Col2 Tuple(name String, id Int64, age uint8) +``` + +これらのアプローチの中で、名のタプルはより柔軟性があります。非名のタプルはスライスを使用して挿入および読み取りする必要がありますが、名のタプルはマップにも互換性があります。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Tuple(name String, age UInt8), + Col2 Tuple(String, UInt8), + Col3 Tuple(name String, id String) + ) + Engine Memory + `); err != nil { + return err +} + +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +// 名と非名のどちらもスライスで追加できる +if err = batch.Append([]interface{}{"Clicky McClickHouse", uint8(42)}, []interface{}{"Clicky McClickHouse Snr", uint8(78)}, []string{"Dale", "521211"}); err != nil { + return err +} +if err = batch.Append(map[string]interface{}{"name": "Clicky McClickHouse Jnr", "age": uint8(20)}, []interface{}{"Baby Clicky McClickHouse", uint8(1)}, map[string]string{"name": "Geoff", "id": "12123"}); err != nil { + return err +} +if err = batch.Send(); err != nil { + return err +} +var ( + col1 map[string]interface{} + col2 []interface{} + col3 map[string]string +) +// 名前付きのタプルはマップまたはスライスに取得可能、未命名はスライスのみ +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3); err != nil { + return err +} +fmt.Printf("row: col1=%v, col2=%v, col3=%v\n", col1, col2, col3) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/tuple.go) + +Note:型付きスライスとマップは、名前付きタプルのサブカラムが全て同一の型である場合にサポートされています。 + +#### ネストされたフィールド + +ネストされたフィールドは、名前付きのタプルの配列と同等です。使用法は、ユーザーが[flatten_nested](https://clickhouse.com/docs/ja/operations/settings/settings/#flatten-nested)を1に設定するか0に設定するかに依存します。 + +flatten_nestedを0に設定することで、ネストされたカラムは単一のタプルの配列として残ります。これにより、挿入と取得が簡単になります。マップのキーはカラムの名前と一致する必要があります。例: + +Note: マップはタプルを表現しているため`map[string]interface{}`でなければなりません。値は現在のところ強く型付けされていません。 + +```go +conn, err := GetNativeConnection(clickhouse.Settings{ + "flatten_nested": 0, +}, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Nested(Col1_1 String, Col1_2 UInt8), + Col2 Nested( + Col2_1 UInt8, + Col2_2 Nested( + Col2_2_1 UInt8, + Col2_2_2 UInt8 + ) + ) + ) Engine Memory +`) +if err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + []map[string]interface{}{ + { + "Col1_1": strconv.Itoa(int(i)), + "Col1_2": uint8(i), + }, + { + "Col1_1": strconv.Itoa(int(i + 1)), + "Col1_2": uint8(i + 1), + }, + { + "Col1_1": strconv.Itoa(int(i + 2)), + "Col1_2": uint8(i + 2), + }, + }, + []map[string]interface{}{ + { + "Col2_2": []map[string]interface{}{ + { + "Col2_2_1": uint8(i), + "Col2_2_2": uint8(i + 1), + }, + }, + "Col2_1": uint8(i), + }, + { + "Col2_2": []map[string]interface{}{ + { + "Col2_2_1": uint8(i + 2), + "Col2_2_2": uint8(i + 3), + }, + }, + "Col2_1": uint8(i + 1), + }, + }, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 []map[string]interface{} + col2 []map[string]interface{} +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v\n", col1, col2) +} +rows.Close() +``` + +[Full Example - `flatten_tested=0`](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nested.go#L28-L118) + +`flatten_nested`のデフォルト値1を使用する場合、ネストされたカラムは別々の配列にフラット化されます。これには挿入と取得にネストされたスライスを使用する必要があります。任意のレベルのネストが動作する可能性がありますが、公式にはサポートされていません。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(ctx, "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Nested(Col1_1 String, Col1_2 UInt8), + Col2 Nested( + Col2_1 UInt8, + Col2_2 Nested( + Col2_2_1 UInt8, + Col2_2_2 UInt8 + ) + ) + ) Engine Memory +`) +if err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i uint8 +for i = 0; i < 10; i++ { + col1_1_data := []string{strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2))} + col1_2_data := []uint8{i, i + 1, i + 2} + col2_1_data := []uint8{i, i + 1, i + 2} + col2_2_data := [][][]interface{}{ + { + {i, i + 1}, + }, + { + {i + 2, i + 3}, + }, + { + {i + 4, i + 5}, + }, + } + err := batch.Append( + col1_1_data, + col1_2_data, + col2_1_data, + col2_2_data, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +``` + +[Full Example - `flatten_nested=1`](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nested.go#L123-L180) + +Note: ネストされたカラムは同じ次元である必要があります。たとえば、上記の例では`Col_2_2`と`Col_2_1`は同一の要素数でなければなりません。 + +シンプルなインターフェースとネストに対する公式サポートのため、`flatten_nested=0`を推奨します。 + +#### 地理タイプ + +クライアントは、ジオタイプのポイント、リング、ポリゴン、およびマルチポリゴンをサポートします。これらのフィールドはGolangで[github.com/paulmach/orb](https://github.com/paulmach/orb)パッケージを使用して表現します。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + point Point, + ring Ring, + polygon Polygon, + mPolygon MultiPolygon + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} + +if err = batch.Append( + orb.Point{11, 22}, + orb.Ring{ + orb.Point{1, 2}, + orb.Point{1, 2}, + }, + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + orb.MultiPolygon{ + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + }, +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + point orb.Point + ring orb.Ring + polygon orb.Polygon + mPolygon orb.MultiPolygon +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&point, &ring, &polygon, &mPolygon); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/geo.go) + +#### UUID + +UUIDタイプは[github.com/google/uuid](https://github.com/google/uuid)パッケージでサポートされています。ユーザーはまた、文字列や`sql.Scanner`や`Stringify`を実装する任意のタイプとしてUUIDを送信およびマーシャルすることができます。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + col1 UUID, + col2 UUID + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +col1Data, _ := uuid.NewUUID() +if err = batch.Append( + col1Data, + "603966d6-ed93-11ec-8ea0-0242ac120002", +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 uuid.UUID + col2 uuid.UUID +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/uuid.go) + +#### 小数点タイプ + +小数点タイプは[github.com/shopspring/decimal](https://github.com/shopspring/decimal)パッケージでサポートされています。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Decimal32(3), + Col2 Decimal(18,6), + Col3 Decimal(15,7), + Col4 Decimal128(8), + Col5 Decimal256(9) + ) Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +if err = batch.Append( + decimal.New(25, 4), + decimal.New(30, 5), + decimal.New(35, 6), + decimal.New(135, 7), + decimal.New(256, 8), +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 decimal.Decimal + col2 decimal.Decimal + col3 decimal.Decimal + col4 decimal.Decimal + col5 decimal.Decimal +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v\n", col1, col2, col3, col4, col5) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/decimal.go) + +#### Nullableタイプ + +GoのNil値はClickHouseのNULL値を表します。これはフィールドがNullableとして宣言されている場合に使用できます。挿入時には、通常のカラムまたはNullableバージョンのどちらにもNilを渡すことができます。前者の場合、そのタイプのデフォルト値が保存され、NullableバージョンではClickHouseにNULL値が保存されます。 + +Scan時には、ユーザーはNil値を表現するためにNullableフィールドのためのNilをサポートする型へのポインタを渡す必要があります。例えば、以下の例ではcol1がNullable(String)であるため、これは**stringを受け取ります。これはnilを表現するための方法です。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + col1 Nullable(String), + col2 String, + col3 Nullable(Int8), + col4 Nullable(Int64) + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +if err = batch.Append( + nil, + nil, + nil, + sql.NullInt64{Int64: 0, Valid: false}, +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 *string + col2 string + col3 *int8 + col4 sql.NullInt64 +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nullable.go) + +クライアントはまた、`sql.Null*`タイプ、例えば`sql.NullInt64`もサポートしています。これらはその対になるClickHouseタイプと互換性があります。 + +#### 大きな整数 - Int128, Int256, UInt128, UInt256 + +64ビットを超える数値タイプは、ネイティブgoの[big](https://pkg.go.dev/math/big)パッケージを使用して表現されます。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Int128, + Col2 UInt128, + Col3 Array(Int128), + Col4 Int256, + Col5 Array(Int256), + Col6 UInt256, + Col7 Array(UInt256) + ) Engine Memory`); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} + +col1Data, _ := new(big.Int).SetString("170141183460469231731687303715884105727", 10) +col2Data := big.NewInt(128) +col3Data := []*big.Int{ + big.NewInt(-128), + big.NewInt(128128), + big.NewInt(128128128), +} +col4Data := big.NewInt(256) +col5Data := []*big.Int{ + big.NewInt(256), + big.NewInt(256256), + big.NewInt(256256256256), +} +col6Data := big.NewInt(256) +col7Data := []*big.Int{ + big.NewInt(256), + big.NewInt(256256), + big.NewInt(256256256256), +} + +if err = batch.Append(col1Data, col2Data, col3Data, col4Data, col5Data, col6Data, col7Data); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 big.Int + col2 big.Int + col3 []*big.Int + col4 big.Int + col5 []*big.Int + col6 big.Int + col7 []*big.Int +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v, col6=%v, col7=%v\n", col1, col2, col3, col4, col5, col6, col7) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/big_int.go) + +### 圧縮 + +サポートされる圧縮方法は、使用されているプロトコルに依存します。ネイティブプロトコルでは、クライアントは`LZ4`と`ZSTD`圧縮をサポートしています。その圧縮はブロックレベル上でのみ行われます。圧縮は接続時の`Compression`設定を含むことによって有効にできます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionZSTD, + }, + MaxOpenConns: 1, +}) +ctx := context.Background() +``` +```go +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Array(String) + ) Engine Memory + `); err != nil { + return err +} +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + if err := batch.Append([]string{strconv.Itoa(i), strconv.Itoa(i + 1), strconv.Itoa(i + 2), strconv.Itoa(i + 3)}); err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/compression.go) + +標準インターフェースをHTTP経由で使用する場合、追加の圧縮技術が利用可能です。詳細は[database/sql API - 圧縮](#compression)を参照してください。 + +### パラメータバインディング + +クライアントは、Exec、クエリ、そしてQueryRowメソッドのパラメータバインディングをサポートしています。以下の例で示すように、名前付き、番号付き、位置指定パラメータを使用してサポートされています。以下にそれらの例を示します。 + +```go +var count uint64 +// 位置バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 >= ? AND Col3 < ?", 500, now.Add(time.Duration(750)*time.Second)).Scan(&count); err != nil { + return err +} +// 250 +fmt.Printf("位置バインディングカウント: %d\n", count) +// 数値バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= $2 AND Col3 > $1", now.Add(time.Duration(150)*time.Second), 250).Scan(&count); err != nil { + return err +} +// 100 +fmt.Printf("数値バインディングカウント: %d\n", count) +// 名前付きバインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= @col1 AND Col3 > @col3", clickhouse.Named("col1", 100), clickhouse.Named("col3", now.Add(time.Duration(50)*time.Second))).Scan(&count); err != nil { + return err +} +// 50 +fmt.Printf("名前付きバインディングカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/bind.go) + +#### 特別なケース + +デフォルトでは、スライスはクエリへのパラメータとして渡された場合、コンマで区切られた値のリストに展開されます。ユーザーがラップの`[ ]`で値のセットを注入する必要がある場合、ArraySetを使用するべきです。 + +グループ/タプルが必要である場合、IN演算子と一緒に使用すると有用な`( )`でラップされたものが、GroupSetを使用することで可能です。特に複数のグループが必要な場合に便利です。以下の例に示します。 + +最後に、DateTime64フィールドは、パラメータが適切にレンダリングされるよう精度が必要です。フィールドの精度レベルはクライアントからは知られないため、ユーザーが提供する必要があります。これを容易にするために、`DateNamed`パラメータを提供します。 + +```go +var count uint64 +// 配列は展開されます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 IN (?)", []int{100, 200, 300, 400, 500}).Scan(&count); err != nil { + return err +} +fmt.Printf("配列展開カウント: %d\n", count) +// 配列は[]で保持されます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col4 = ?", clickhouse.ArraySet{300, 301}).Scan(&count); err != nil { + return err +} +fmt.Printf("配列カウント: %d\n", count) +// グループセットを使うことで( )リストを形成できます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 IN ?", clickhouse.GroupSet{[]interface{}{100, 200, 300, 400, 500}}).Scan(&count); err != nil { + return err +} +fmt.Printf("グループカウント: %d\n", count) +// ネストが必要な場合により有用です +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE (Col1, Col5) IN (?)", []clickhouse.GroupSet{{[]interface{}{100, 101}}, {[]interface{}{200, 201}}}).Scan(&count); err != nil { + return err +} +fmt.Printf("グループカウント: %d\n", count) +// タイムに精度が必要な場合はDateNamedを使用してください# +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col3 >= @col3", clickhouse.DateNamed("col3", now.Add(time.Duration(500)*time.Millisecond), clickhouse.NanoSeconds)).Scan(&count); err != nil { + return err +} +fmt.Printf("名前付き日付のカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/bind_special.go) + +### コンテキストの使用 + +Goのコンテキストは、デッドラインやキャンセルシグナル、その他のリクエストにスコープ化された値をAPI境界間で渡す手段を提供します。コネクションの全てのメソッドは、最初の変数としてコンテキストを受け取ります。以前の例ではcontext.Background()を使用しましたが、この機能を使って設定やデッドラインを渡したり、クエリをキャンセルすることができます。 + +`withDeadline`を作成したコンテキストを渡すと、クエリに対して実行時間の制限を設けることができます。これは絶対的な時間であり、有効期限はコネクションを解放し、ClickHouseにキャンセル信号を送ることによってのみ解除されます。代替として`WithCancel`を使用して、クエリを明示的にキャンセルすることができます。 + +`clickhouse.WithQueryID`と`clickhouse.WithQuotaKey`のヘルパーにより、クエリIDと割り当てキーを指定できます。クエリIDはログでのクエリの追跡やキャンセル目的で有用です。割り当てキーは、ユニークなキー値に基づいてClickHouseの使用を制限するために使用できます - 詳細は[クオータ管理 ](https://clickhouse.com/docs/ja/operations/access-rights#quotas-management)を参照ください。 + +ユーザーはまた、特定のクエリにのみ設定を適用するためにコンテキストを使用して、コネクション全体には適用しません。[コネクション設定](#connection-settings)で示すように。 + +最後に、`clickhouse.WithBlockSize`を使用して、ブロックバッファのサイズを制御することができます。これにより、接続レベルの設定`BlockBufferSize`を上書きし、デコードされてメモリに保持されるブロックの最大数を制御します。値が大きいほど並列化が向上する可能性がありますが、メモリの消費が増える点には注意が必要です。 + +以下にこれらの例を示します。 + +```go +dialCount := 0 +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + DialContext: func(ctx context.Context, addr string) (net.Conn, error) { + dialCount++ + var d net.Dialer + return d.DialContext(ctx, "tcp", addr) + }, +}) +if err != nil { + return err +} +if err := clickhouse_tests.CheckMinServerServerVersion(conn, 22, 6, 1); err != nil { + return nil +} +// 特定のAPIコールに設定を渡すためにコンテキストを使用できます +ctx := clickhouse.Context(context.Background(), clickhouse.WithSettings(clickhouse.Settings{ + "allow_experimental_object_type": "1", +})) + +conn.Exec(ctx, "DROP TABLE IF EXISTS example") + +// JSONカラムを作成するためにはallow_experimental_object_type=1が必要です +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 JSON + ) + Engine Memory + `); err != nil { + return err +} + +// コンテキストを使用してクエリをキャンセルできます +ctx, cancel := context.WithCancel(context.Background()) +go func() { + cancel() +}() +if err = conn.QueryRow(ctx, "SELECT sleep(3)").Scan(); err == nil { + return fmt.Errorf("キャンセルを期待していました") +} + +// クエリにデッドラインを設定した場合 - 絶対時間に達した後にクエリをキャンセルします。 +// ClickHouseではクエリが完了まで続行されます +ctx, cancel = context.WithDeadline(context.Background(), time.Now().Add(-time.Second)) +defer cancel() +if err := conn.Ping(ctx); err == nil { + return fmt.Errorf("デッドライン超過を期待していました") +} + +// ログでのクエリトレースを助けるためにクエリIDを設定します。例えば、system.query_logを参照してください。 +var one uint8 +queryId, _ := uuid.NewUUID() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQueryID(queryId.String())) +if err = conn.QueryRow(ctx, "SELECT 1").Scan(&one); err != nil { + return err +} + +conn.Exec(context.Background(), "DROP QUOTA IF EXISTS foobar") +defer func() { + conn.Exec(context.Background(), "DROP QUOTA IF EXISTS foobar") +}() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQuotaKey("abcde")) +// クォータキーを設定 - まずクォータを作成する +if err = conn.Exec(ctx, "CREATE QUOTA IF NOT EXISTS foobar KEYED BY client_key FOR INTERVAL 1 minute MAX queries = 5 TO default"); err != nil { + return err +} + +type Number struct { + Number uint64 `ch:"number"` +} +for i := 1; i <= 6; i++ { + var result []Number + if err = conn.Select(ctx, &result, "SELECT number FROM numbers(10)"); err != nil { + return err + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/context.go) + +### 進捗/プロファイル/ログ情報 + +クエリに関する進捗、プロファイル、およびログ情報を要求することができます。進捗情報は、ClickHouseで読み取られたおよび処理された行とバイトの統計を報告します。それに対して、プロファイル情報はクライアントに返されたデータのサマリーを提供し、バイト、行、およびブロックの合計を含みます。最後に、ログ情報はスレッドに関する統計を提供します。例えば、メモリ使用量やデータ速度などです。 + +この情報を取得するには、[コンテキスト](#using-context)を使用する必要があります。これにコールバック関数を渡すことができます。 + +```go +totalRows := uint64(0) +// コンテキストを使用して進捗およびプロファイル情報用のコールバックを渡します +ctx := clickhouse.Context(context.Background(), clickhouse.WithProgress(func(p *clickhouse.Progress) { + fmt.Println("進捗: ", p) + totalRows += p.Rows +}), clickhouse.WithProfileInfo(func(p *clickhouse.ProfileInfo) { + fmt.Println("プロファイル情報: ", p) +}), clickhouse.WithLogs(func(log *clickhouse.Log) { + fmt.Println("ログ情報: ", log) +})) + +rows, err := conn.Query(ctx, "SELECT number from numbers(1000000) LIMIT 1000000") +if err != nil { + return err +} +for rows.Next() { +} + +fmt.Printf("合計行数: %d\n", totalRows) +rows.Close() +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/progress.go) + +### 動的スキャン + +ユーザーは、返されるフィールドのスキーマやタイプが不明なテーブルを読み取る必要があるかもしれません。これは、アドホックなデータ分析が行われたり、汎用的なツールが書かれる場合に一般的です。これを達成するために、クエリ応答にカラムタイプ情報が利用可能です。これはGoのリフレクションと組み合わせて、正しく型付けされた変数のランタイムインスタンスを作成し、Scanに渡すことができます。 + +```go +const query = ` +SELECT + 1 AS Col1 + , 'Text' AS Col2 +` +rows, err := conn.Query(context.Background(), query) +if err != nil { + return err +} +var ( + columnTypes = rows.ColumnTypes() + vars = make([]interface{}, len(columnTypes)) +) +for i := range columnTypes { + vars[i] = reflect.New(columnTypes[i].ScanType()).Interface() +} +for rows.Next() { + if err := rows.Scan(vars...); err != nil { + return err + } + for _, v := range vars { + switch v := v.(type) { + case *string: + fmt.Println(*v) + case *uint8: + fmt.Println(*v) + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/dynamic_scan_types.go) + +### 外部テーブル + +[外部テーブル](https://clickhouse.com/docs/ja/engines/table-engines/special/external-data/)は、クライアントがクリックハウスにデータを送信できるようにし、SELECTクエリと共にそのデータを使用することができます。このデータは一時的なテーブルに配置され、クエリ自体で評価のために使用されます。 + +クエリでクライアントに送信する外部データを作成するには、ext.NewTableを介して外部テーブルを構築し、これをコンテキストに渡す必要があります。 + +```go +table1, err := ext.NewTable("external_table_1", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) +if err != nil { + return err +} + +for i := 0; i < 10; i++ { + if err = table1.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()); err != nil { + return err + } +} + +table2, err := ext.NewTable("external_table_2", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) + +for i := 0; i < 10; i++ { + table2.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()) +} +ctx := clickhouse.Context(context.Background(), + clickhouse.WithExternalTable(table1, table2), +) +rows, err := conn.Query(ctx, "SELECT * FROM external_table_1") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + rows.Scan(&col1, &col2, &col3) + fmt.Printf("col1=%d, col2=%s, col3=%v\n", col1, col2, col3) +} +rows.Close() + +var count uint64 +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM external_table_1").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1: %d\n", count) +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM external_table_2").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_2: %d\n", count) +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM (SELECT * FROM external_table_1 UNION ALL SELECT * FROM external_table_2)").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1 UNION external_table_2: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/external_data.go) + +### Open Telemetry + +ClickHouseはネイティブプロトコルの一部として[トレースコンテキスト](https://clickhouse.com/docs/ja/operations/opentelemetry/)を渡すことを許可しています。クライアントは`clickhouse.withSpan`関数を介してSpanを作成し、これをコンテキスト経由で渡すことによってこれを達成します。 + +```go +var count uint64 +rows := conn.QueryRow(clickhouse.Context(context.Background(), clickhouse.WithSpan( + trace.NewSpanContext(trace.SpanContextConfig{ + SpanID: trace.SpanID{1, 2, 3, 4, 5}, + TraceID: trace.TraceID{5, 4, 3, 2, 1}, + }), +)), "SELECT COUNT() FROM (SELECT number FROM system.numbers LIMIT 5)") +if err := rows.Scan(&count); err != nil { + return err +} +fmt.Printf("count: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/open_telemetry.go) + +トレースの利用についての詳細は[OpenTelemetryサポート](https://clickhouse.com/docs/ja/operations/opentelemetry/)で確認できます。 + +## データベース/SQL API + +`database/sql`または「標準」APIは、クライアントを異なるデータベースに接続する必要がある場合に標準的なインターフェースを遵守させ、クライアントアプリケーションが基礎となるデータベースについて認識していないシナリオで使用できます。これは一定のコストを伴います - 抽象化と間接の追加レイヤーおよびそれが必ずしもClickHouseと一致しないプリミティブです。しかし、このコストは、特に複数のデータベースに接続する必要があるツーリングシナリオで受け入れ可能であることが多いです。 + +さらに、このクライアントはHTTPをトランスポート層として使用するHTTP構文をサポートしています - データは依然として最適なパフォーマンスのためネイティブ形式でエンコードされます。 + +以下はClickHouse API文書の構造をミラーリングすることを目的としています。 + +標準APIの完全なコード例は[こちら](https://github.com/ClickHouse/clickhouse-go/tree/main/examples/std)で確認できます。 + +### 接続 + +DSN文字列`clickhouse://:?=`を使用した`Open`メソッドまたは`clickhouse.OpenDB`メソッドを通じて接続を確立できます。後者は`database/sql`仕様の一部ではありませんが、`sql.DB`インスタンスが返されます。 このメソッドはプロファイリングのような機能を提供し、`database/sql`仕様を通じて公開される明白な手段がありません。 + +```go +func Connect() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + }) + return conn.Ping() +} + +func ConnectDSN() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://%s:%d?username=%s&password=%s", env.Host, env.Port, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect.go) + +**以降の例では、明示的に示されない限り、ClickHouseの`conn`変数が作成され利用可能であることを仮定します。** + +#### 接続設定 + +次のパラメータは、DSN文字列に渡すことができます。 + +* `hosts` - ロードバランシングとフェイルオーバーのためのシングルアドレスホストのカンマ区切りリスト - [複数のノードへの接続](#connecting-to-multiple-nodes)を参照ください。 +* `username/password` - 認証情報 - [認証](#authentication)を参照ください。 +* `database` - デフォルトの現在のデータベースを選択 +* `dial_timeout` - 期間文字列は、オプションのフラクションと単位接尾辞を持つ、可能な限りサイン付きの一連の小数 - `300ms`、`1s`などです。 有効な時間単位は`ms`、`s`、`m`です。 +* `connection_open_strategy` - `random/in_order` (デフォルト `random`) - [複数のノードへの接続](#connecting-to-multiple-nodes)を参照ください。 + - `round_robin` - セットからラウンドロビンのサーバーを選択します + - `in_order` - 指定された順序で最初の生きているサーバーを選択します +* `debug` - デバッグ出力を有効にする (ブール値) +* `compress` - 圧縮アルゴリズムを指定 - `none`(デフォルト)、`zstd`、`lz4`、`gzip`、`deflate`、`br`。 `true`に設定されている場合、`lz4`が使われます。ネイティブ通信には`lz4`と`zstd`のみサポートされます。 +* `compress_level` - 圧縮レベル(デフォルトは`0`)。圧縮詳細を参照。これはアルゴリズムに特有: + - `gzip` - `-2`(最高速度)から`9`(最高圧縮) + - `deflate` - `-2`(最高速度)から`9`(最高圧縮) + - `br` - `0`(最高速度)から`11`(最高圧縮) + - `zstd`、`lz4` - 無視されます +* `secure` - セキュアなSSL接続を確立 (デフォルトは`false`) +* `skip_verify` - 証明書検証をスキップ (デフォルトは`false`) +* `block_buffer_size` - ユーザーがブロックバッファサイズを制御できるようにします。 [BlockBufferSize](#connection-settings)を参照してください。(デフォルトは`2`) + +```go +func ConnectSettings() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://127.0.0.1:9001,127.0.0.1:9002,%s:%d/%s?username=%s&password=%s&dial_timeout=10s&connection_open_strategy=round_robin&debug=true&compress=lz4", env.Host, env.Port, env.Database, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect_settings.go) + +#### コネクションプーリング + +[複数のノードへの接続](#connecting-to-multiple-nodes)に記載されている通りに、提供されたノードアドレスのリストの使用についてユーザーは影響を与えることができます。コネクション管理とプーリングは、意図的に`sql.DB`に委ねられます。 + +#### HTTP経由での接続 + +デフォルトでは、接続はネイティブプロトコルを介して確立されます。HTTPを必要とするユーザーは、HTTPプロトコルを含むようにDSNを変更するか、接続オプションでプロトコルを指定することでこれを有効にできます。 + +```go +func ConnectHTTP() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Protocol: clickhouse.HTTP, + }) + return conn.Ping() +} + +func ConnectDSNHTTP() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s", env.Host, env.HttpPort, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect_http.go) + +#### 複数のノードへの接続 + +`OpenDB`を使用する場合、ClickHouse APIで使用される同じオプションアプローチを使用して複数のホストに接続します - オプションで`ConnOpenStrategy`を指定します。 + +DSNベースの接続の場合、文字列は複数のホストと`connection_open_strategy`パラメータを受け入れるため、この値に`round_robin`または`in_order`を設定することができます。 + +```go +func MultiStdHost() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + ConnOpenStrategy: clickhouse.ConnOpenRoundRobin, + }) + if err != nil { + return err + } + v, err := conn.ServerVersion() + if err != nil { + return err + } + fmt.Println(v.String()) + return nil +} + +func MultiStdHostDSN() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://127.0.0.1:9001,127.0.0.1:9002,%s:%d?username=%s&password=%s&connection_open_strategy=round_robin", env.Host, env.Port, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/multi_host.go) + +### TLSの使用 + +DSN接続文字列を使用する場合、パラメータ"secure=true"でSSLを有効にできます。OpenDBメソッドは、非nil TLS構造の指定に依存して[ネイティブAPIのTLS](#using-tls)と同じアプローチを使用します。DSN接続文字列はSSL検証をスキップするためのskip_verifyパラメータをサポートしていますが、OpenDBメソッドは構成を渡すことを可能にしているため、より高度なTLS構成に必要です。 + +```go +func ConnectSSL() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + cwd, err := os.Getwd() + if err != nil { + return err + } + t := &tls.Config{} + caCert, err := ioutil.ReadFile(path.Join(cwd, "../../tests/resources/CAroot.crt")) + if err != nil { + return err + } + caCertPool := x509.NewCertPool() + successful := caCertPool.AppendCertsFromPEM(caCert) + if !successful { + return err + } + t.RootCAs = caCertPool + + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: t, + }) + return conn.Ping() +} + +func ConnectDSNSSL() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("https://%s:%d?secure=true&skip_verify=true&username=%s&password=%s", env.Host, env.HttpsPort, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/ssl.go) + +### 認証 + +OpenDBを使用する場合、通常のオプションで認証情報を渡すことができます。DSNベースの接続の場合、ユーザー名およびパスワードは接続文字列内に渡すことができ、パラメータとして、またはアドレスにエンコードされた資格情報として指定することができます。 + +```go +func ConnectAuth() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + }) + return conn.Ping() +} + +func ConnectDSNAuth() error { + env, err := GetStdTestEnvironment() + conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s", env.Host, env.HttpPort, env.Username, env.Password)) + if err != nil { + return err + } + if err = conn.Ping(); err != nil { + return err + } + conn, err = sql.Open("clickhouse", fmt.Sprintf("http://%s:%s@%s:%d", env.Username, env.Password, env.Host, env.HttpPort)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/auth.go) + +### 実行 + +接続が確立されると、ユーザーはExecメソッドを通じて`sql`文を実行することができます。 + +```go +conn.Exec(`DROP TABLE IF EXISTS example`) +_, err = conn.Exec(` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8, + Col2 String + ) engine=Memory +`) +if err != nil { + return err +} +_, err = conn.Exec("INSERT INTO example VALUES (1, 'test-1')") +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/exec.go) + +このメソッドはコンテキストの受信をサポートしていません - デフォルトではバックグラウンドコンテキストで実行されます。コンテキストが必要な場合は、ExecContextを使用してください - コンテキストの使用を参照してください。 + +### バッチインサート + +バッチのセマンティクスは`Being`メソッドを使用して`sql.Tx`を作成することによって達成できます。そこから`INSERT`文を指定して`Prepare`メソッドを使用してバッチを取得します。これにより、`sql.Stmt`が返され、`Exec`メソッドで行を追加できます。 バッチは`Commit`が最初の`sql.Tx`で実行されるまでメモリに蓄積されます。 + +```go +batch, err := scope.Prepare("INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + _, err := batch.Exec( + uint8(42), + "ClickHouse", "Inc", + uuid.New(), + map[string]uint8{"key": 1}, // Map(String, UInt8) + []string{"Q", "W", "E", "R", "T", "Y"}, // Array(String) + []interface{}{ // Tuple(String, UInt8, Array(Map(String, String))) + "String Value", uint8(5), []map[string]string{ + map[string]string{"key": "value"}, + map[string]string{"key": "value"}, + map[string]string{"key": "value"}, + }, + }, + time.Now(), + ) + if err != nil { + return err + } +} +return scope.Commit() +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/batch.go) + +### 行のクエリ + +単一の行をクエリする際は、QueryRowメソッドを使用できます。これは*sql.Rowを返し、Scanを変数へのポインタと共に呼び出してカラムをマーシャル化します。QueryRowContextバリアントは、バックグラウンド以外のコンテキストを渡すことを可能にします。 + +```go +row := conn.QueryRow("SELECT * FROM example") +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 interface{} + col8 time.Time +) +if err := row.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/query_row.go) + +次のメソッドを実行して複数の行を反復処理するには、`Query`メソッドを使用します。これは、行を反復処理するためにNextを呼び出せる`*sql.Rows`構造を返します。QueryContext相当は、コンテキストを渡すことを可能にします。 + +```go +rows, err := conn.Query("SELECT * FROM example") +if err != nil { + return err +} +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 interface{} + col8 time.Time +) +for rows.Next() { + if err := rows.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err + } + fmt.Printf("行: col1=%d, col2=%s, col3=%s, col4=%s, col5=%v, col6=%v, col7=%v, col8=%v\n", col1, col2, col3, col4, col5, col6, col7, col8) +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/query_rows.go) + +### 非同期インサート + +非同期インサートは、ExecContextメソッドを使用してインサートを実行することで達成できます。非同期モードを有効にしてコンテキストを渡す必要があります。 これにより、クライアントがサーバーがインサートを完了するのを待つか、データが受信されたら応答するかを指定できます。これにより、[wait_for_async_insert](https://clickhouse.com/docs/ja/operations/settings/settings/#wait-for-async-insert)パラメータが実質的に制御されます。 + +```go +const ddl = ` + CREATE TABLE example ( + Col1 UInt64 + , Col2 String + , Col3 Array(UInt8) + , Col4 DateTime + ) ENGINE = Memory + ` +if _, err := conn.Exec(ddl); err != nil { + return err +} +ctx := clickhouse.Context(context.Background(), clickhouse.WithStdAsync(false)) +{ + for i := 0; i < 100; i++ { + _, err := conn.ExecContext(ctx, fmt.Sprintf(`INSERT INTO example VALUES ( + %d, '%s', [1, 2, 3, 4, 5, 6, 7, 8, 9], now() + )`, i, "Golang SQL database driver")) + if err != nil { + return err + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/async.go) + +### カラム挿入 + +標準インターフェースを使用してのサポートはされていません。 + +### 構造体の使用 + +標準インターフェースを使用してのサポートはされていません。 + +### タイプ変換 + +標準`database/sql`インターフェースは、[ClickHouse API](#type-conversions)と同じタイプをサポートする必要があります。いくつかの例外、主に複雑なタイプについて、以下に記載します。ClickHouse APIと同様に、クライアントは挿入時の変数タイプの受け入れと応答のマーシャル化についてできるだけ柔軟であることを目指します。詳細は[タイプ変換](#type-conversions)を参照してください。 + +### 複雑なタイプ + +特に述べられていない限り、複雑なタイプの処理は[ClickHouse API](#complex-types)と同じである必要があります。違いは`database/sql`の内部によります。 + +#### マップ + +ClickHouse APIとは異なり、標準APIはスキャンタイプでマップの強い型付けを必要とします。例えば、`Map(String,String)`フィールドのために`map[string]interface{}`を渡すことはできず、代わりに`map[string]string`を使用する必要があります。 `interface{}`変数は常に互換性があり、より複雑な構造のために使用できます。構造体は読み取り時にサポートされていません。 + +```go +var ( + col1Data = map[string]uint64{ + "key_col_1_1": 1, + "key_col_1_2": 2, + } + col2Data = map[string]uint64{ + "key_col_2_1": 10, + "key_col_2_2": 20, + } + col3Data = map[string]uint64{} + col4Data = []map[string]string{ + {"A": "B"}, + {"C": "D"}, + } + col5Data = map[string]uint64{ + "key_col_5_1": 100, + "key_col_5_2": 200, + } +) +if _, err := batch.Exec(col1Data, col2Data, col3Data, col4Data, col5Data); err != nil { + return err +} +if err = scope.Commit(); err != nil { + return err +} +var ( + col1 interface{} + col2 map[string]uint64 + col3 map[string]uint64 + col4 []map[string]string + col5 map[string]uint64 +) +if err := conn.QueryRow("SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v", col1, col2, col3, col4, col5) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/map.go) + +挿入の動作はClickHouse APIと同じです。 + +### 圧縮 + +標準APIはネイティブ[ClickHouse API](#compression)と同様の圧縮アルゴリズムをサポートしています。たとえば、ブロックレベルの`lz4`と`zstd`圧縮です。さらに、HTTP接続にはgzip、deflate、brもサポートされています。これらが有効化されている場合、圧縮はインサート時のブロックとクエリ応答のために行われます。他のリクエスト、例えばpingやクエリリクエストは圧縮されません。これは`lz4`と`zstd`オプションと一致しています。 + +もし`OpenDB`メソッドを使用して接続を確立する場合、圧縮の設定を渡すことができます。これには圧縮レベルを指定する能力が含まれます(以下を参照)。`sql.Open`を使用してDSNを介して接続する場合、`compress`パラメータを利用してください。これは特定の圧縮アルゴリズム、たとえば`gzip`、`deflate`、`br`、`zstd`または`lz4`あるいはブールフラグになります。`true`に設定されている場合、`lz4`が使われます。デフォルトは`none`です。すなわち、圧縮は無効です。 + +```go +conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionBrotli, + Level: 5, + }, + Protocol: clickhouse.HTTP, +}) +``` +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/compression.go#L27-L76) + +```go +conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s&compress=gzip&compress_level=5", env.Host, env.HttpPort, env.Username, env.Password)) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/compression.go#L78-L115) + +適用された圧縮のレベルは、DSNパラメータcompress_levelまたはCompressionオプションのLevelフィールドによって制御されます。デフォルトは0ですが、これはアルゴリズムによって特有です: + +* `gzip` - `-2` (ベストスピード)から`9` (ベスト圧縮) +* `deflate` - `-2` (ベストスピード)から`9` (ベスト圧縮) +* `br` - `0` (ベストスピード)から`11` (ベスト圧縮) +* `zstd`, `lz4` - 無視されます + +### パラメータバインディング + +標準APIは、[ClickHouse API](#parameter-binding)と同様のパラメータバインディング機能をサポートしており、Exec、Query、QueryRowメソッド(および対応する[コンテキスト](#using-context)バリアント)にパラメータを渡すことができます。位置指定、名前付き、および番号付きのパラメータがサポートされています。 + +```go +var count uint64 +// 位置バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 >= ? AND Col3 < ?", 500, now.Add(time.Duration(750)*time.Second)).Scan(&count); err != nil { + return err +} +// 250 +fmt.Printf("位置バインディングカウント: %d\n", count) +// 数値バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= $2 AND Col3 > $1", now.Add(time.Duration(150)*time.Second), 250).Scan(&count); err != nil { + return err +} +// 100 +fmt.Printf("数値バインディングカウント: %d\n", count) +// 名前付きバインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= @col1 AND Col3 > @col3", clickhouse.Named("col1", 100), clickhouse.Named("col3", now.Add(time.Duration(50)*time.Second))).Scan(&count); err != nil { + return err +} +// 50 +fmt.Printf("名前付きバインディングカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/bind.go) + +[特別なケース](#special-cases)が適用されることに注意してください。 + +### コンテキストの使用 + +標準APIは、[ClickHouse API](#using-context)と同様に、デッドライン、キャンセルシグナル、および他のリクエストスコープの値をコンテキストを通じて渡す能力をサポートしています。ClickHouse APIとは異なり、これはメソッドの`Context`バリアントを使用することによって達成されます。たとえば、バックグラウンドコンテキストを使用する`Exec`メソッドは`ExecContext`バリアントを持ち、そこでコンテキストを最初のパラメータとして渡すことができます。これにより、アプリケーションフローの任意の段階でコンテキストを渡すことができ、たとえば、接続を確立する際に`ConnContext`またはクエリ行をリクエストする際に`QueryRowContext`を使用することができます。以下に利用可能なメソッドの例を示します。 + +デッドライン、キャンセルシグナル、クエリID、クォータキーおよび接続設定を渡すためにコンテキストを使用する詳細については、[ClickHouse API](#using-context)のコンテキストの使用を参照してください。 + +```go +ctx := clickhouse.Context(context.Background(), clickhouse.WithSettings(clickhouse.Settings{ + "allow_experimental_object_type": "1", +})) +conn.ExecContext(ctx, "DROP TABLE IF EXISTS example") +// JSONカラムを作成するためにはallow_experimental_object_type=1が必要です +if _, err = conn.ExecContext(ctx, ` + CREATE TABLE example ( + Col1 JSON + ) + Engine Memory + `); err != nil { + return err +} + +// コンテキストを使用してクエリをキャンセルできます +ctx, cancel := context.WithCancel(context.Background()) +go func() { + cancel() +}() +if err = conn.QueryRowContext(ctx, "SELECT sleep(3)").Scan(); err == nil { + return fmt.Errorf("キャンセルを期待していました") +} + +// クエリにデッドラインを設定した場合 - 絶対時間に達した後にクエリをキャンセルします。再びコネクションの解除のみを行い、 +// ClickHouseではクエリが完了まで続行されます +ctx, cancel = context.WithDeadline(context.Background(), time.Now().Add(-time.Second)) +defer cancel() +if err := conn.PingContext(ctx); err == nil { + return fmt.Errorf("デッドライン超過を期待していました") +} + +// ログでのクエリトレースを助けるためにクエリIDを設定します。たとえば、system.query_logを参照してください。 +var one uint8 +ctx = clickhouse.Context(context.Background(), clickhouse.WithQueryID(uuid.NewString())) +if err = conn.QueryRowContext(ctx, "SELECT 1").Scan(&one); err != nil { + return err +} + +conn.ExecContext(context.Background(), "DROP QUOTA IF EXISTS foobar") +defer func() { + conn.ExecContext(context.Background(), "DROP QUOTA IF EXISTS foobar") +}() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQuotaKey("abcde")) +// クォータキーを設定 - まずクォータを作成する +if _, err = conn.ExecContext(ctx, "CREATE QUOTA IF NOT EXISTS foobar KEYED BY client_key FOR INTERVAL 1 minute MAX queries = 5 TO default"); err != nil { + return err +} + +// クエリはコンテキストを使用してキャンセルできます +ctx, cancel = context.WithCancel(context.Background()) +// キャンセルの前に結果をいくつか取得します +ctx = clickhouse.Context(ctx, clickhouse.WithSettings(clickhouse.Settings{ + "max_block_size": "1", +})) +rows, err := conn.QueryContext(ctx, "SELECT sleepEachRow(1), number FROM numbers(100);") +if err != nil { + return err +} +var ( + col1 uint8 + col2 uint8 +) + +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + if col2 > 3 { + fmt.Println("キャンセルを期待していました") + return nil + } + return err + } + fmt.Printf("行: col2=%d\n", col2) + if col2 == 3 { + cancel() + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/context.go) + +### セッション + +ネイティブ接続は本質的にセッションを持っていますが、HTTP接続の場合、ユーザーはコンテキストを設定として渡すためにセッションIDを作成する必要があります。これにより、一時テーブルなどのセッションにバインドされた機能が使用可能になります。 + +```go +conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Protocol: clickhouse.HTTP, + Settings: clickhouse.Settings{ + "session_id": uuid.NewString(), + }, +}) +if _, err := conn.Exec(`DROP TABLE IF EXISTS example`); err != nil { + return err +} +_, err = conn.Exec(` + CREATE TEMPORARY TABLE IF NOT EXISTS example ( + Col1 UInt8 + ) +`) +if err != nil { + return err +} +scope, err := conn.Begin() +if err != nil { + return err +} +batch, err := scope.Prepare("INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 10; i++ { + _, err := batch.Exec( + uint8(i), + ) + if err != nil { + return err + } +} +rows, err := conn.Query("SELECT * FROM example") +if err != nil { + return err +} +var ( + col1 uint8 +) +for rows.Next() { + if err := rows.Scan(&col1); err != nil { + return err + } + fmt.Printf("行: col1=%d\n", col1) +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/session.go) + +### 動的スキャン + +[ClickHouse API](#dynamic-scanning)に似て、カラムタイプ情報は利用可能で、ユーザーが実行時に正しく型付けされた変数のインスタンスを作成し、Scanに渡すことができます。これにより、タイプが未知の場合でもカラムを読み取ることができます。 + +```go +const query = ` +SELECT + 1 AS Col1 + , 'Text' AS Col2 +` +rows, err := conn.QueryContext(context.Background(), query) +if err != nil { + return err +} +columnTypes, err := rows.ColumnTypes() +if err != nil { + return err +} +vars := make([]interface{}, len(columnTypes)) +for i := range columnTypes { + vars[i] = reflect.New(columnTypes[i].ScanType()).Interface() +} +for rows.Next() { + if err := rows.Scan(vars...); err != nil { + return err + } + for _, v := range vars { + switch v := v.(type) { + case *string: + fmt.Println(*v) + case *uint8: + fmt.Println(*v) + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/dynamic_scan_types.go) + +### 外部テーブル + +[外部テーブル](https://clickhouse.com/docs/ja/engines/table-engines/special/external-data/)は、クライアントがSELECTクエリと共にClickHouseにデータを送信できるようにします。このデータは一時的なテーブルに置かれ、クエリ自体での評価に使用可能です。 + +クエリでクライアントに送信する外部データを作成するためには、ext.NewTableを介して外部テーブルを構築し、これをコンテキストに渡す必要があります。 + +```go +table1, err := ext.NewTable("external_table_1", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) +if err != nil { + return err +} + +for i := 0; i < 10; i++ { + if err = table1.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()); err != nil { + return err + } +} + +table2, err := ext.NewTable("external_table_2", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) + +for i := 0; i < 10; i++ { + table2.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()) +} +ctx := clickhouse.Context(context.Background(), + clickhouse.WithExternalTable(table1, table2), +) +rows, err := conn.QueryContext(ctx, "SELECT * FROM external_table_1") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + rows.Scan(&col1, &col2, &col3) + fmt.Printf("col1=%d, col2=%s, col3=%v\n", col1, col2, col3) +} +rows.Close() + +var count uint64 +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM external_table_1").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1: %d\n", count) +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM external_table_2").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_2: %d\n", count) +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM (SELECT * FROM external_table_1 UNION ALL SELECT * FROM external_table_2)").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1 UNION external_table_2: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/external_data.go) + +### Open Telemetry + +ClickHouseはネイティブプロトコルの一部として[トレースコンテキスト](https://clickhouse.com/docs/ja/operations/opentelemetry/)を渡すことを許可しています。クライアントは`clickhouse.withSpan`関数を介してSpanを作成し、これをコンテキスト経由で渡すことによってこれを達成します。これはHTTPをトランスポートとして使用する場合にはサポートされていません。 + +```go +var count uint64 +rows := conn.QueryRowContext(clickhouse.Context(context.Background(), clickhouse.WithSpan( + trace.NewSpanContext(trace.SpanContextConfig{ + SpanID: trace.SpanID{1, 2, 3, 4, 5}, + TraceID: trace.TraceID{5, 4, 3, 2, 1}, + }), +)), "SELECT COUNT() FROM (SELECT number FROM system.numbers LIMIT 5)") +if err := rows.Scan(&count); err != nil { + return err +} +fmt.Printf("count: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/open_telemetry.go) + +## パフォーマンステップ + +* 可能であれば、ClickHouse APIを利用する。それにより、重要なリフレクションと間接を避けることができます。 +* 大規模なデータセットを読み取る場合、[BlockBufferSize](#connection-settings)を変更することを検討してください。これにより、メモリのフットプリントが増えますが、行の反復中により多くのブロックが並列にデコードされるようになります。デフォルト値の2は保守的で、メモリオーバーヘッドを最小限に抑えます。高い値はメモリ内のブロック数を増やします。これはテストが必要で、異なるクエリは異なるブロックサイズを生成する可能性があります。そのため、コンテキストを介して[クエリレベル](#using-context)で設定できます。 +* データを挿入する際には、できるだけ具体的に型を指定してください。クライアントはUUIDやIPのための文字列を許可するなどの柔軟さを目指していますが、これはデータの検証を必要とし、挿入時にコストを伴います。 +* 可能な限り列指向のインサートを利用してください。これらは強く型付けされており、クライアントがあなたの値を変換する必要を避けます。 +* ClickHouseの最適なインサートパフォーマンスのための[推奨](https://clickhouse.com/docs/ja/sql-reference/statements/insert-into/#performance-considerations)に従ってください。 +``` diff --git a/docs/ja/integrations/language-clients/java/client-v1.md b/docs/ja/integrations/language-clients/java/client-v1.md new file mode 100644 index 00000000000..7fdad530fa9 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/client-v1.md @@ -0,0 +1,348 @@ +--- +sidebar_label: クライアント V1 +sidebar_position: 3 +keywords: [clickhouse, java, client, integrate] +description: Java ClickHouse Connector v1 +slug: /ja/integrations/java/client-v1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# クライアント (V1) + +DBサーバとそのプロトコルを介して通信するためのJavaクライアントライブラリです。現在の実装では[HTTPインターフェース](/docs/ja/interfaces/http)のみをサポートしています。このライブラリは、サーバにリクエストを送信するための独自のAPIを提供します。 + +*注意*: このコンポーネントは間もなく非推奨になります。 + +## セットアップ + + + + +```xml + + + com.clickhouse + clickhouse-http-client + 0.6.5 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-http-client +implementation("com.clickhouse:clickhouse-http-client:0.6.5") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-http-client +implementation 'com.clickhouse:clickhouse-http-client:0.6.5' +``` + + + + +バージョン `0.5.0` 以降、ドライバーは新しいクライアントHTTPライブラリを使用し、それを依存関係として追加する必要があります。 + + + + +```xml + + + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 +implementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 +implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1' +``` + + + + +## 初期化 + +接続URL形式: `protocol://host[:port][/database][?param[=value][¶m[=value]][#tag[,tag]]`, 例として: + +- `http://localhost:8443?ssl=true&sslmode=NONE` +- `https://(https://explorer@play.clickhouse.com:443` + +単一ノードに接続: + +```java showLineNumbers +ClickHouseNode server = ClickHouseNode.of("http://localhost:8123/default?compress=0"); +``` +複数ノードのクラスタに接続: + +```java showLineNumbers +ClickHouseNodes servers = ClickHouseNodes.of( + "jdbc:ch:http://server1.domain,server2.domain,server3.domain/my_db" + + "?load_balancing_policy=random&health_check_interval=5000&failover=2"); +``` + +## クエリAPI + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from numbers limit :limit") + .params(1000) + .executeAndWait()) { + ClickHouseResponseSummary summary = response.getSummary(); + long totalRows = summary.getTotalRowsToRead(); +} +``` + +## ストリーミングクエリAPI + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from numbers limit :limit") + .params(1000) + .executeAndWait()) { + for (ClickHouseRecord r : response.records()) { + int num = r.getValue(0).asInteger(); + // 型変換 + String str = r.getValue(0).asString(); + LocalDate date = r.getValue(0).asDate(); + } +} +``` + +[リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client)内の[完全なコード例](https://github.com/ClickHouse/clickhouse-java/blob/main/examples/client/src/main/java/com/clickhouse/examples/jdbc/Main.java#L73)を参照してください。 + +## 挿入API + +```java showLineNumbers + +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers).write() + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("insert into my_table select c2, c3 from input('c1 UInt8, c2 String, c3 Int32')") + .data(myInputStream) // `myInputStream` はRowBinary形式のデータソース + .executeAndWait()) { + ClickHouseResponseSummary summary = response.getSummary(); + summary.getWrittenRows(); +} +``` + +[リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client)内の[完全なコード例](https://github.com/ClickHouse/clickhouse-java/blob/main/examples/client/src/main/java/com/clickhouse/examples/jdbc/Main.java#L39)を参照してください。 + +**RowBinary エンコーディング** + +RowBinary形式はその[ページ](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes)に記述されています。 + +[コード](https://github.com/ClickHouse/clickhouse-kafka-connect/blob/main/src/main/java/com/clickhouse/kafka/connect/sink/db/ClickHouseWriter.java#L622)の例があります。 + +## 機能 +### 圧縮 + +このクライアントはデフォルトでLZ4圧縮を使用します。それには以下の依存関係が必要です。 + + + + +```xml + + + org.lz4 + lz4-java + 1.8.0 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.lz4/lz4-java +implementation("org.lz4:lz4-java:1.8.0") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.lz4/lz4-java +implementation 'org.lz4:lz4-java:1.8.0' +``` + + + + +代わりにgzipを使用したい場合は、接続URLに`compress_algorithm=gzip`を設定してください。 + +また、数通りの方法で圧縮を無効にすることができます。 + +1. 接続URLに `compress=0` を設定して無効にする: `http://localhost:8123/default?compress=0` +2. クライアント設定経由で無効にする: + +```java showLineNumbers +ClickHouseClient client = ClickHouseClient.builder() + .config(new ClickHouseConfig(Map.of(ClickHouseClientOption.COMPRESS, false))) + .nodeSelector(ClickHouseNodeSelector.of(ClickHouseProtocol.HTTP)) + .build(); +``` + +異なる圧縮オプションについての詳細は、[圧縮ドキュメント](/ja/native-protocol/compression)を参照してください。 + +### 複数クエリ + +同じセッション内で、複数のクエリを一つづつワーカースレッドで実行します: + +```java showLineNumbers +CompletableFuture> future = ClickHouseClient.send(servers.apply(servers.getNodeSelector()), + "create database if not exists my_base", + "use my_base", + "create table if not exists test_table(s String) engine=Memory", + "insert into test_table values('1')('2')('3')", + "select * from test_table limit 1", + "truncate table test_table", + "drop table if exists test_table"); +List results = future.get(); +``` + +### 名前付きパラメータ + +パラメータリストの位置に依存する代わりに、名前でパラメータを渡すことができます。この機能は`params`機能を使用することで利用可能になります。 + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name limit :limit") + .params("Ben", 1000) + .executeAndWait()) { + //... + } +} +``` + +:::note パラメータ +`String`型を含む全ての`params`シグネチャ(`String`, `String[]`, `Map`)は、渡されるキーが有効なClickHouseのSQL文字列であると仮定します。たとえば: + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name") + .params(Map.of("name","'Ben'")) + .executeAndWait()) { + //... + } +} +``` + +Stringオブジェクトを手動でClickHouse SQLに解析したくない場合は、`com.clickhouse.data`にあるヘルパー関数`ClickHouseValues.convertToSqlExpression`を使用できます: + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name") + .params(Map.of("name", ClickHouseValues.convertToSqlExpression("Ben's"))) + .executeAndWait()) { + //... + } +} +``` + +上記の例では、`ClickHouseValues.convertToSqlExpression`が内部のシングルクォーテーションをエスケープし、変数を有効なシングルクォーテーションで囲みます。 + +他の型、例えば`Integer`、`UUID`、`Array`、`Enum`などは、`params`内で自動的に変換されます。 +::: + +## ノード検出 + +Javaクライアントは、ClickHouseノードを自動で検出する機能を提供します。自動検出はデフォルトで無効になっています。手動で有効にするには、`auto_discovery`を `true`に設定します: + +```java +properties.setProperty("auto_discovery", "true"); +``` + +または接続URL内で: + +```plaintext +jdbc:ch://my-server/system?auto_discovery=true +``` + +自動検出が有効な場合、接続URL内に全てのClickHouseノードを指定する必要はありません。URLに指定されたノードはシードとして扱われ、Javaクライアントはシステムテーブルやclickhouse-keeperもしくはzookeeperからさらに多くのノードを自動で検出します。 + +自動検出設定に関するオプションは以下の通りです: + +| プロパティ | デフォルト | 説明 | +|-------------------------|------------|-------------------------------------------------------------------------------------------------------| +| auto_discovery | `false` | クライアントがシステムテーブルまたはclickhouse-keeper/zookeeperからさらに多くのノードを検出するかどうか | +| node_discovery_interval | `0` | ノード検出の間隔をミリ秒で指定し、ゼロや負の値は一回限りの検出を意味します | +| node_discovery_limit | `100` | 一度に検出できるノードの最大数。ゼロや負の値は制限なしを意味します | + +### ロードバランシング + +Javaクライアントはロードバランシングポリシーに従って、リクエストを送信するClickHouseノードを選択します。一般に、ロードバランシングポリシーは以下のことを担当します: + +1. 管理されているノードリストからノードを取得する +2. ノードの状態を管理する +3. (もし自動検出が有効であれば)ノード検出のためのバックグラウンドプロセスをオプションでスケジュールし、ヘルスチェックを実行する + +ロードバランシングの設定に関するオプション一覧は以下の通りです: + +| プロパティ | デフォルト | 説明 | +|--------------------------|-------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| load_balancing_policy | `""` | ロードバランシングポリシーとして利用できるのは:
  • `firstAlive` - 管理ノードリストから最初の正常なノードにリクエストが送られます
  • `random` - 管理ノードリストからランダムに選ばれたノードにリクエストが送られます
  • `roundRobin` - 管理ノードリストの各ノードに順番にリクエストが送られます
  • `ClickHouseLoadBalancingPolicy`を実装した完全修飾クラス名 - カスタムロードバランシングポリシー
  • 指定がなければ、管理ノードリストの最初のノードにリクエストが送られます | +| load_balancing_tags | `""` | ノードをフィルタリングするためのロードバランシングタグ。指定されたタグを持つノードにのみリクエストが送られます | +| health_check_interval | `0` | ヘルスチェックの間隔をミリ秒で指定し、ゼロや負の値は一回限りを意味します | +| health_check_method | `ClickHouseHealthCheckMethod.SELECT_ONE` | ヘルスチェックの方法。以下のうち一つ:
  • `ClickHouseHealthCheckMethod.SELECT_ONE` - `select 1`クエリでのチェック
  • `ClickHouseHealthCheckMethod.PING` - 一般により高速なプロトコル固有のチェック
  • | +| node_check_interval | `0` | ノードチェックの間隔をミリ秒で指定し、負の数はゼロと見なされます。特定のノードの最後のチェックから指定された時間が経過している場合にノードの状態がチェックされます。
    `health_check_interval`と`node_check_interval`の違いは、`health_check_interval`はノードのリスト(すべてもしくは誤っているものに対して)の状態をチェックするバックグラウンドジョブをスケジュールするオプションであるのに対し、`node_check_interval`は特定のノードの最後のチェックから指定された時間が経過していることを指定するオプションです | +| check_all_nodes | `false` | すべてのノードと誤動作しているノードのどちらに対してヘルスチェックを実行するかを指定します | + + +### フェイルオーバーとリトライ + +Javaクライアントは、失敗したクエリに対するフェイルオーバーとリトライの動作をセットアップするための設定オプションを提供します: + +| プロパティ | デフォルト | 説明 | +|-----------------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| failover | `0` | リクエストに対してフェイルオーバーが発生できる最大回数。ゼロまたは負の値はフェイルオーバーなしを意味します。フェイルオーバーは負の値を意味し、異なるノードに失敗したリクエストを送信します。 | +| retry | `0` | リクエストに対してリトライが発生できる最大回数。ゼロまたは負の値はリトライなしを意味します。ClickHouseサーバが`NETWORK_ERROR`エラーコードを返した場合のみ、リトライが行われます。 | +| repeat_on_session_lock | `true` | セッションがロックされてタイムアウトする場合(`session_timeout` または `connect_timeout` に従う)の実行を繰り返すかどうかを指定します。ClickHouseサーバが`SESSION_IS_LOCKED`エラーコードを返した場合に、失敗したリクエストが繰り返されます。 | + +### カスタムHTTPヘッダーの追加 + +JavaクライアントはリクエストにカスタムHTTPヘッダーを追加するためのHTTP/Sトランスポートレイヤーをサポートしています。 +`custom_http_headers`プロパティを使用し、ヘッダーを`,`で区切って指定します。ヘッダーキー/値は`=`で分割する必要があります。 + +## Javaクライアントサポート + +```java +options.put("custom_http_headers", "X-ClickHouse-Quota=test, X-ClickHouse-Test=test"); +``` + +## JDBCドライバー + +```java +properties.setProperty("custom_http_headers", "X-ClickHouse-Quota=test, X-ClickHouse-Test=test"); +``` + + diff --git a/docs/ja/integrations/language-clients/java/client-v2.md b/docs/ja/integrations/language-clients/java/client-v2.md new file mode 100644 index 00000000000..4d9ae7af986 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/client-v2.md @@ -0,0 +1,538 @@ +--- +sidebar_label: Client V2 +sidebar_position: 2 +keywords: [clickhouse, java, client, integrate] +description: Java ClickHouse Connector v2 +slug: /ja/integrations/java/client-v2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# Java クライアント (V2) + +DBサーバーとそのプロトコルを介して通信するためのJavaクライアントライブラリです。現在の実装は[HTTPインターフェース](/docs/ja/interfaces/http)のみをサポートしています。このライブラリは、サーバーにリクエストを送信するための独自のAPIを提供します。また、さまざまなバイナリデータ形式(RowBinary* & Native*)で作業するためのツールも提供します。 + +## セットアップ + +- Maven Central (プロジェクトウェブページ): https://mvnrepository.com/artifact/com.clickhouse/client-v2 +- ナイトリービルド (リポジトリリンク): https://s01.oss.sonatype.org/content/repositories/snapshots/com/clickhouse/ + + + + +```xml + + com.clickhouse + client-v2 + 0.6.5 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/client-v2 +implementation("com.clickhouse:client-v2:0.6.5") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/client-v2 +implementation 'com.clickhouse:client-v2:0.6.5' +``` + + + + +## 初期化 + +`com.clickhouse.client.api.Client.Builder#build()`によってクライアントオブジェクトが初期化されます。各クライアントは独自のコンテキストを持ち、オブジェクト間で共有されません。ビルダーには便利な設定のためのメソッドが用意されています。 + +例: +```java showLineNumbers + Client client = new Client.Builder() + .addEndpoint("https://clickhouse-cloud-instance:8443/") + .setUsername(user) + .setPassword(password) + .build(); +``` + +`Client`は`AutoCloseable`であり、不要になったら閉じる必要があります。 + +## 設定 + +すべての設定はインスタンスメソッド(設定メソッドとして知られる)によって定義され、それぞれの値のスコープとコンテキストを明確にします。 +主要な設定パラメータは一つのスコープ(クライアントまたは操作)に定義され、互いにオーバーライドされません。 + +設定はクライアント作成時に定義されます。`com.clickhouse.client.api.Client.Builder`を参照してください。 + +## 共通定義 + +### ClickHouseFormat + +[サポートされるフォーマット](/docs/ja/interfaces/formats)の列挙です。ClickHouseがサポートするすべてのフォーマットを含みます。 + +* `raw` - ユーザーは生データをトランスコードする必要があります +* `full` - クライアントはデータを自分でトランスコードでき、生データストリームを受け入れます +* `-` - このフォーマットではClickHouseでは操作サポートされていません + +このクライアントバージョンがサポートするもの: + +| フォーマット | 入力 | 出力 | +|-----------------------------------------------------------------------------------------------------------------------------------|:------:|:------:| +| [TabSeparated](/docs/ja/interfaces/formats#tabseparated) | raw | raw | +| [TabSeparatedRaw](/docs/ja/interfaces/formats#tabseparatedraw) | raw | raw | +| [TabSeparatedWithNames](/docs/ja/interfaces/formats#tabseparatedwithnames) | raw | raw | +| [TabSeparatedWithNamesAndTypes](/docs/ja/interfaces/formats#tabseparatedwithnamesandtypes) | raw | raw | +| [TabSeparatedRawWithNames](/docs/ja/interfaces/formats#tabseparatedrawwithnames) | raw | raw | +| [TabSeparatedRawWithNamesAndTypes](/docs/ja/interfaces/formats#tabseparatedrawwithnamesandtypes) | raw | raw | +| [Template](/docs/ja/interfaces/formats#format-template) | raw | raw | +| [TemplateIgnoreSpaces](/docs/ja/interfaces/formats#templateignorespaces) | raw | - | +| [CSV](/docs/ja/interfaces/formats#csv) | raw | raw | +| [CSVWithNames](/docs/ja/interfaces/formats#csvwithnames) | raw | raw | +| [CSVWithNamesAndTypes](/docs/ja/interfaces/formats#csvwithnamesandtypes) | raw | raw | +| [CustomSeparated](/docs/ja/interfaces/formats#format-customseparated) | raw | raw | +| [CustomSeparatedWithNames](/docs/ja/interfaces/formats#customseparatedwithnames) | raw | raw | +| [CustomSeparatedWithNamesAndTypes](/docs/ja/interfaces/formats#customseparatedwithnamesandtypes) | raw | raw | +| [SQLInsert](/docs/ja/interfaces/formats#sqlinsert) | - | raw | +| [Values](/docs/ja/interfaces/formats#data-format-values) | raw | raw | +| [Vertical](/docs/ja/interfaces/formats#vertical) | - | raw | +| [JSON](/docs/ja/interfaces/formats#json) | raw | raw | +| [JSONAsString](/docs/ja/interfaces/formats#jsonasstring) | raw | - | +| [JSONAsObject](/docs/ja/interfaces/formats#jsonasobject) | raw | - | +| [JSONStrings](/docs/ja/interfaces/formats#jsonstrings) | raw | raw | +| [JSONColumns](/docs/ja/interfaces/formats#jsoncolumns) | raw | raw | +| [JSONColumnsWithMetadata](/docs/ja/interfaces/formats#jsoncolumnsmonoblock) | raw | raw | +| [JSONCompact](/docs/ja/interfaces/formats#jsoncompact) | raw | raw | +| [JSONCompactStrings](/docs/ja/interfaces/formats#jsoncompactstrings) | - | raw | +| [JSONCompactColumns](/docs/ja/interfaces/formats#jsoncompactcolumns) | raw | raw | +| [JSONEachRow](/docs/ja/interfaces/formats#jsoneachrow) | raw | raw | +| [PrettyJSONEachRow](/docs/ja/interfaces/formats#prettyjsoneachrow) | - | raw | +| [JSONEachRowWithProgress](/docs/ja/interfaces/formats#jsoneachrowwithprogress) | - | raw | +| [JSONStringsEachRow](/docs/ja/interfaces/formats#jsonstringseachrow) | raw | raw | +| [JSONStringsEachRowWithProgress](/docs/ja/interfaces/formats#jsonstringseachrowwithprogress) | - | raw | +| [JSONCompactEachRow](/docs/ja/interfaces/formats#jsoncompacteachrow) | raw | raw | +| [JSONCompactEachRowWithNames](/docs/ja/interfaces/formats#jsoncompacteachrowwithnames) | raw | raw | +| [JSONCompactEachRowWithNamesAndTypes](/docs/ja/interfaces/formats#jsoncompacteachrowwithnamesandtypes) | raw | raw | +| [JSONCompactStringsEachRow](/docs/ja/interfaces/formats#jsoncompactstringseachrow) | raw | raw | +| [JSONCompactStringsEachRowWithNames](/docs/ja/interfaces/formats#jsoncompactstringseachrowwithnames) | raw | raw | +| [JSONCompactStringsEachRowWithNamesAndTypes](/docs/ja/interfaces/formats#jsoncompactstringseachrowwithnamesandtypes) | raw | raw | +| [JSONObjectEachRow](/docs/ja/interfaces/formats#jsonobjecteachrow) | raw | raw | +| [BSONEachRow](/docs/ja/interfaces/formats#bsoneachrow) | raw | raw | +| [TSKV](/docs/ja/interfaces/formats#tskv) | raw | raw | +| [Pretty](/docs/ja/interfaces/formats#pretty) | - | raw | +| [PrettyNoEscapes](/docs/ja/interfaces/formats#prettynoescapes) | - | raw | +| [PrettyMonoBlock](/docs/ja/interfaces/formats#prettymonoblock) | - | raw | +| [PrettyNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettynoescapesmonoblock) | - | raw | +| [PrettyCompact](/docs/ja/interfaces/formats#prettycompact) | - | raw | +| [PrettyCompactNoEscapes](/docs/ja/interfaces/formats#prettycompactnoescapes) | - | raw | +| [PrettyCompactMonoBlock](/docs/ja/interfaces/formats#prettycompactmonoblock) | - | raw | +| [PrettyCompactNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettycompactnoescapesmonoblock) | - | raw | +| [PrettySpace](/docs/ja/interfaces/formats#prettyspace) | - | raw | +| [PrettySpaceNoEscapes](/docs/ja/interfaces/formats#prettyspacenoescapes) | - | raw | +| [PrettySpaceMonoBlock](/docs/ja/interfaces/formats#prettyspacemonoblock) | - | raw | +| [PrettySpaceNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettyspacenoescapesmonoblock) | - | raw | +| [Prometheus](/docs/ja/interfaces/formats#prometheus) | - | raw | +| [Protobuf](/docs/ja/interfaces/formats#protobuf) | raw | raw | +| [ProtobufSingle](/docs/ja/interfaces/formats#protobufsingle) | raw | raw | +| [ProtobufList](/docs/ja/interfaces/formats#protobuflist) | raw | raw | +| [Avro](/docs/ja/interfaces/formats#data-format-avro) | raw | raw | +| [AvroConfluent](/docs/ja/interfaces/formats#data-format-avro-confluent) | raw | - | +| [Parquet](/docs/ja/interfaces/formats#data-format-parquet) | raw | raw | +| [ParquetMetadata](/docs/ja/interfaces/formats#data-format-parquet-metadata) | raw | - | +| [Arrow](/docs/ja/interfaces/formats#data-format-arrow) | raw | raw | +| [ArrowStream](/docs/ja/interfaces/formats#data-format-arrow-stream) | raw | raw | +| [ORC](/docs/ja/interfaces/formats#data-format-orc) | raw | raw | +| [One](/docs/ja/interfaces/formats#data-format-one) | raw | - | +| [Npy](/docs/ja/interfaces/formats#data-format-npy) | raw | raw | +| [RowBinary](/docs/ja/interfaces/formats#rowbinary) | full | full | +| [RowBinaryWithNames](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes) | full | full | +| [RowBinaryWithNamesAndTypes](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes) | full | full | +| [RowBinaryWithDefaults](/docs/ja/interfaces/formats#rowbinarywithdefaults) | full | - | +| [Native](/docs/ja/interfaces/formats#native) | full | raw | +| [Null](/docs/ja/interfaces/formats#null) | - | raw | +| [XML](/docs/ja/interfaces/formats#xml) | - | raw | +| [CapnProto](/docs/ja/interfaces/formats#capnproto) | raw | raw | +| [LineAsString](/docs/ja/interfaces/formats#lineasstring) | raw | raw | +| [Regexp](/docs/ja/interfaces/formats#data-format-regexp) | raw | - | +| [RawBLOB](/docs/ja/interfaces/formats#rawblob) | raw | raw | +| [MsgPack](/docs/ja/interfaces/formats#msgpack) | raw | raw | +| [MySQLDump](/docs/ja/interfaces/formats#mysqldump) | raw | - | +| [DWARF](/docs/ja/interfaces/formats#dwarf) | raw | - | +| [Markdown](/docs/ja/interfaces/formats#markdown) | - | raw | +| [Form](/docs/ja/interfaces/formats#form) | raw | - | + + +## データ挿入API + +### insert(String tableName, InputStream data, ClickHouseFormat format) + +指定されたフォーマットでエンコードされたバイトの`InputStream`としてデータを受け入れます。`data`が`format`でエンコードされていることが期待されます。 + +**シグネチャ** + +```java +CompletableFuture insert(String tableName, InputStream data, ClickHouseFormat format, InsertSettings settings) +CompletableFuture insert(String tableName, InputStream data, ClickHouseFormat format) +``` + +**パラメータ** + +`tableName` - 対象テーブル名。 + +`data` - エンコードされたデータの入力ストリーム。 + +`format` - データがエンコードされた形式。 + +`settings` - リクエスト設定。 + +**戻り値** + +`InsertResponse`型のFuture - 操作結果とサーバサイドのメトリクスなどの追加情報。 + +**例** + +```java showLineNumbers +try (InputStream dataStream = getDataStream()) { + try (InsertResponse response = client.insert(TABLE_NAME, dataStream, ClickHouseFormat.JSONEachRow, + insertSettings).get(3, TimeUnit.SECONDS)) { + + log.info("Insert finished: {} rows written", response.getMetrics().getMetric(ServerMetrics.NUM_ROWS_WRITTEN).getLong()); + } catch (Exception e) { + log.error("Failed to write JSONEachRow data", e); + throw new RuntimeException(e); + } +} + +``` + +### insert(String tableName, List data, InsertSettings settings) + +データベースに書き込みリクエストを送信します。オブジェクトのリストは効率的な形式に変換され、その後サーバーに送信されます。リストアイテムのクラスは、事前に`register(Class, TableSchema)`メソッドを使用して登録する必要があります。 + +**シグネチャ** +```java +client.insert(String tableName, List data, InsertSettings settings) +client.insert(String tableName, List data) +``` + +**パラメータ** + +`tableName` - 対象のテーブル名。 + +`data` - DTO (Data Transfer Object) オブジェクトのコレクション。 + +`settings` - リクエスト設定。 + +**戻り値** + +`InsertResponse`型のFuture - 操作結果とサーバサイドのメトリクスなどの追加情報。 + +**例** + +```java showLineNumbers +// 重要なステップ(1回だけ実行):テーブルスキーマに従ってオブジェクトシリアライザを事前コンパイルするためにクラスを登録。 +client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME)); + + +List events = loadBatch(); + +try (InsertResponse response = client.insert(TABLE_NAME, events).get()) { + // 応答を処理し、リクエストをサーブした後に閉じられ、接続が解放されます。 +} +``` + +### InsertSettings + +挿入操作のための設定オプション。 + +**設定メソッド** + +
    +
    setQueryId(String queryId)
    +
    操作に割り当てられるクエリIDを設定します
    + +
    setDeduplicationToken(String token)
    +
    重複除外トークンを設定します。このトークンはサーバーに送信され、クエリを識別するために使用されます。
    + +
    waitEndOfQuery(Boolean waitEndOfQuery)
    +
    クエリの終了を待ってから応答を送信するようサーバーにリクエストします。
    + +
    setInputStreamCopyBufferSize(int size)
    +
    コピー時のバッファサイズ。ユーザー提供の入力ストリームから出力ストリームへの書き込み操作中に使用されるバッファです。
    +
    + +### InsertResponse + +挿入操作の結果を保持する応答オブジェクトです。このオブジェクトはサーバーから応答を受け取った場合にのみ利用可能です。 + +:::note +このオブジェクトは、前の応答のデータがすべて読み取られるまで接続が再利用できないため、できるだけ早く閉じて接続を解放する必要があります。 +::: + +
    +
    OperationMetrics getMetrics()
    +
    操作メトリクスを含むオブジェクトを返します
    +
    String getQueryId()
    +
    アプリケーションによって操作に割り当てられたクエリ ID(操作設定またはサーバーによって)を返します。
    +
    + +## クエリAPI + +### query(String sqlQuery) + +`sqlQuery`をそのまま送信します。応答フォーマットはクエリ設定によって設定されます。`QueryResponse`は、対応するフォーマットのリーダーが消費すべき応答ストリームへの参照を保持します。 + +**シグネチャ** + +```java +CompletableFuture query(String sqlQuery, QuerySettings settings) +CompletableFuture query(String sqlQuery) +``` + +**パラメータ** + +`sqlQuery` - 単一のSQLステートメント。クエリはそのままサーバーに送信されます。 + +`settings` - リクエスト設定。 + +**戻り値** + +`QueryResponse`型のFuture - 結果データセットとサーバサイドのメトリクスなどの追加情報を含みます。データセットを消費した後に応答オブジェクトを閉じる必要があります。 + +**例** + +```java +final String sql = "select * from " + TABLE_NAME + " where title <> '' limit 10"; + +// デフォルトフォーマットはRowBinaryWithNamesAndTypesFormatReaderであるため、リーダーはすべてのカラム情報を持っています +try (QueryResponse response = client.query(sql).get(3, TimeUnit.SECONDS);) { + + // データに便利にアクセスするためのリーダーを作成 + ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response); + + while (reader.hasNext()) { + reader.next(); // ストリームから次のレコードを読み取り、解析する + + // 値を取得 + double id = reader.getDouble("id"); + String title = reader.getString("title"); + String url = reader.getString("url"); + + // データを収集 + } +} catch (Exception e) { + log.error("Failed to read data", e); +} + +// ビジネスロジックは可能な限り早くHTTP接続を解放するように、読取りブロックの外に置いてください。 +``` + +### query(String sqlQuery, Map queryParams, QuerySettings settings) + +`sqlQuery`をそのまま送信します。さらに、クエリパラメータを送信し、サーバーがSQL式をコンパイルできるようにします。 + +**シグネチャ** +```java +CompletableFuture query(String sqlQuery, Map queryParams, QuerySettings settings) +``` + +**パラメータ** + +`sqlQuery` - `{}`を含むSQL式。 + +`queryParams` - サーバーでSQL式を完成させるための変数のマップ。 + +`settings` - リクエスト設定。 + +**戻り値** + +`QueryResponse`型のFuture - 結果データセットとサーバサイドのメトリクスなどの追加情報を含みます。データセットを消費した後に応答オブジェクトを閉じる必要があります。 + +**例** + +```java showLineNumbers + +// パラメータを定義。それらはリクエストと一緒にサーバーに送信されます。 +Map queryParams = new HashMap<>(); +queryParams.put("param1", 2); + +try (QueryResponse queryResponse = + client.query("SELECT * FROM " + table + " WHERE col1 >= {param1:UInt32}", queryParams, new QuerySettings()).get()) { + + // データに便利にアクセスするためのリーダーを作成 + ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response); + + while (reader.hasNext()) { + reader.next(); // ストリームから次のレコードを読み取り、解析する + + // データを読み取る + } + +} catch (Exception e) { + log.error("Failed to read data", e); +} + +``` + +### queryAll(String sqlQuery) + +`RowBinaryWithNamesAndTypes`形式でデータをクエリします。結果をコレクションとして返します。読み取りパフォーマンスはリーダーと同じですが、全データセットを保持するためにはより多くのメモリが必要です。 + +**シグネチャ** +```java +List queryAll(String sqlQuery) +``` + +**パラメータ** + +`sqlQuery` - サーバーからデータをクエリするためのSQL式。 + +**戻り値** + +結果データを行スタイルでアクセスするために`GenericRecord`オブジェクトのリストで表現された完全なデータセットを返します。 + +**例** + +```java showLineNumbers +try { + log.info("テーブル全体を読み取り、レコードごとに処理中"); + final String sql = "select * from " + TABLE_NAME + " where title <> ''"; + + // 完全な結果セットを読み取り、レコードごとに処理 + client.queryAll(sql).forEach(row -> { + double id = row.getDouble("id"); + String title = row.getString("title"); + String url = row.getString("url"); + + log.info("id: {}, title: {}, url: {}", id, title, url); + }); +} catch (Exception e) { + log.error("Failed to read data", e); +} +``` + +### QuerySettings + +クエリ操作のための設定オプション。 + +**設定メソッド** + +
    +
    setQueryId(String queryId)
    +
    操作に割り当てられるクエリIDを設定します
    +
    setFormat(ClickHouseFormat format)
    +
    応答フォーマットを設定します。完全なリストは`RowBinaryWithNamesAndTypes`を参照してください。
    +
    setMaxExecutionTime(Integer maxExecutionTime)
    +
    サーバーでの操作実行時間を設定します。読み取りタイムアウトには影響しません。
    +
    waitEndOfQuery(Boolean waitEndOfQuery)
    +
    クエリの終了を待ってから応答を送信するようサーバーにリクエストします。
    +
    setUseServerTimeZone(Boolean useServerTimeZone)
    +
    サーバーのタイムゾーン(クライアント設定を参照)が、操作の結果の日時型を解析するために使用されます。デフォルト`false`
    +
    setUseTimeZone(String timeZone)
    +
    時間の変換のためにサーバーに`timeZone`を使用するよう要求します。session_timezoneを参照してください。
    +
    + +### QueryResponse + +クエリ実行の結果を保持する応答オブジェクトです。このオブジェクトはサーバーからの応答を受け取った場合にのみ利用可能です。 + +:::note +このオブジェクトは、前の応答のデータが完全に読み込まれるまで接続を再利用できないため、できるだけ早く閉じて接続を解放する必要があります。 +::: + +
    +
    ClickHouseFormat getFormat()
    +
    応答のデータがエンコードされているフォーマットを返します。
    +
    InputStream getInputStream()
    +
    指定された形式での非圧縮バイトストリームを返します。
    +
    OperationMetrics getMetrics()
    +
    操作メトリクスを含むオブジェクトを返します
    +
    String getQueryId()
    +
    アプリケーションによって操作に割り当てられたクエリ ID(操作設定またはサーバーによって)を返します。
    +
    TimeZone getTimeZone()
    +
    応答でのDate/DateTime型を処理するために使用するタイムゾーンを返します。
    +
    + +### 例 + +- [リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client-v2)に例コードがあります +- 見本のSpring Service [実装](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-service) + +## 共通API + +### getTableSchema(String table) + +`table`のスキーマを取得します。 + +**シグネチャ** + +```java +TableSchema getTableSchema(String table) +TableSchema getTableSchema(String table, String database) +``` + +**パラメータ** + +`table` - スキーマデータを取得するためのテーブル名。 + +`database` - 対象のテーブルが定義されているデータベース。 + +**戻り値** + +テーブルカラムのリストを持つ`TableSchema`オブジェクトを返します。 + +### getTableSchemaFromQuery(String sql) + +SQLステートメントからスキーマを取得します。 + +**シグネチャ** + +```java +TableSchema getTableSchemaFromQuery(String sql) +``` + +**パラメータ** + +`sql` - スキーマを返すべき"SELECT" SQLステートメント。 + +**戻り値** + +`sql`式に一致するカラムを持つ`TableSchema`オブジェクトを返します。 + +### TableSchema + +### register(Class clazz, TableSchema schema) + +Javaクラス用に書き込み/読み込みデータとするSerDeレイヤーをコンパイルします。このメソッドは、ゲッター/セッターペアと対応するカラムのためにシリアライザとデシリアライザを作成します。 +カラムの一致はメソッド名からその名前を抽出することで見つけられます。例えば、`getFirstName`はカラム `first_name`または`firstname`に対応します。 + +**シグネチャ** + +```java +void register(Class clazz, TableSchema schema) +``` + +**パラメータ** + +`clazz` - データの読み書きに使用されるPOJOを表すクラス。 + +`schema` - POJOプロパティと一致させるためのデータスキーマ。 + +**例** + +```java showLineNumbers +client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME)); +``` + +## 使用例 + +完全な例のコードは、 `example` [フォルダ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples)にリポジトリ内に保存されています: + +- [client-v2](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client-v2) - 主な例のセット。 +- [demo-service](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-service) - Spring Bootアプリケーションでクライアントを使用する方法の例。 +- [demo-kotlin-service](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-kotlin-service) - Ktor (Kotlin) アプリケーションでクライアントを使用する方法の例。 diff --git a/docs/ja/integrations/language-clients/java/index.md b/docs/ja/integrations/language-clients/java/index.md new file mode 100644 index 00000000000..d44b004fa6c --- /dev/null +++ b/docs/ja/integrations/language-clients/java/index.md @@ -0,0 +1,119 @@ +--- +sidebar_label: Java +sidebar_position: 1 +keywords: [clickhouse, java, jdbc, client, integrate, r2dbc] +description: Java から ClickHouse への接続オプション +slug: /ja/integrations/java +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# Java クライアント概要 + +- [Client-V2](./client-v2.md) +- [Client-V1 (旧版)](./client-v1.md) +- [JDBC ドライバー](./jdbc-driver.md) +- [R2DBC ドライバー](./r2dbc.md) + +## ClickHouse クライアント + +Java クライアントは、ClickHouse サーバーとのネットワーク通信の詳細を抽象化する独自の API を実装するライブラリです。現在、HTTP インターフェースのみサポートされています。このライブラリは、様々な ClickHouse フォーマットおよび関連する機能を扱うためのユーティリティを提供します。 + +Java クライアントは 2015 年に開発されました。そのコードベースは非常に維持しにくく、API は混乱し、これ以上最適化するのが難しくなりました。そのため、2024 年に新しいコンポーネント `client-v2` へのリファクタリングを行いました。これには、明確な API、より軽量なコードベース、パフォーマンスの向上、より良い ClickHouse フォーマットサポート(主に RowBinary と Native)が含まれます。JDBC は近い将来このクライアントを使用する予定です。 + +### サポートされているデータタイプ + +|**データタイプ** |**Client V2 サポート**|**Client V1 サポート**| +|-----------------------|----------------------|----------------------| +|Int8 |✔ |✔ | +|Int16 |✔ |✔ | +|Int32 |✔ |✔ | +|Int64 |✔ |✔ | +|Int128 |✔ |✔ | +|Int256 |✔ |✔ | +|UInt8 |✔ |✔ | +|UInt16 |✔ |✔ | +|UInt32 |✔ |✔ | +|UInt64 |✔ |✔ | +|UInt128 |✔ |✔ | +|UInt256 |✔ |✔ | +|Float32 |✔ |✔ | +|Float64 |✔ |✔ | +|Decimal |✔ |✔ | +|Decimal32 |✔ |✔ | +|Decimal64 |✔ |✔ | +|Decimal128 |✔ |✔ | +|Decimal256 |✔ |✔ | +|Bool |✔ |✔ | +|String |✔ |✔ | +|FixedString |✔ |✔ | +|Nullable |✔ |✔ | +|Date |✔ |✔ | +|Date32 |✔ |✔ | +|DateTime |✔ |✔ | +|DateTime32 |✔ |✔ | +|DateTime64 |✔ |✔ | +|Interval |✗ |✗ | +|Enum |✔ |✔ | +|Enum8 |✔ |✔ | +|Enum16 |✔ |✔ | +|Array |✔ |✔ | +|Map |✔ |✔ | +|Nested |✔ |✔ | +|Tuple |✔ |✔ | +|UUID |✔ |✔ | +|IPv4 |✔ |✔ | +|IPv6 |✔ |✔ | +|Object |✗ |✔ | +|Point |✔ |✔ | +|Nothing |✔ |✔ | +|MultiPolygon |✔ |✔ | +|Ring |✔ |✔ | +|Polygon |✔ |✔ | +|SimpleAggregateFunction|✔ |✔ | +|AggregateFunction |✗ |✔ | + +[ClickHouse データタイプ](/docs/ja/sql-reference/data-types) + +:::note +- AggregatedFunction - :warning: `SELECT * FROM table ...` はサポートされていません +- Decimal - 一貫性のために 21.9+ で `SET output_format_decimal_trailing_zeros=1` を使用 +- Enum - 文字列および整数の両方として扱うことができます +- UInt64 - client-v1 では `long` にマッピングされます +::: + +### 機能 + +クライアントの機能の表: + +| 名称 | Client V2 | Client V1 | コメント | +|----------------------------------------------|:---------:|:---------:|:---------:| +| Http 接続 |✔ |✔ | | +| Http 圧縮(LZ4) |✔ |✔ | | +| サーバー応答の圧縮 - LZ4 |✔ |✔ | | +| クライアント要求の圧縮 - LZ4 |✔ |✔ | | +| HTTPs |✔ |✔ | | +| クライアント SSL 証明書 (mTLS) |✔ |✔ | | +| Http プロキシ |✔ |✔ | | +| POJO シリアライズ・デシリアライズ |✔ |✗ | | +| コネクションプール |✔ |✔ | Apache HTTP クライアントを使用する場合 | +| 名前付きパラメータ |✔ |✔ | | +| 失敗時のリトライ |✔ |✔ | | +| フェイルオーバー |✗ |✔ | | +| ロードバランシング |✗ |✔ | | +| サーバー自動検出 |✗ |✔ | | +| ログコメント |✗ |✔ | | +| セッションロール |✗ |✔ | V2 で導入予定 | +| SSL クライアント認証 |✗ |✔ | V2 で導入予定 | +| セッションタイムゾーン |✔ |✔ | | + +JDBC ドライバーは、基盤となるクライアント実装と同様の機能を継承します。他の JDBC の機能はその [ページ](/docs/ja/integrations/java/jdbc-driver#features) に記載されています。 + +### 互換性 + +- このリポジトリ内のすべてのプロジェクトは、すべての [アクティブな LTS バージョン](https://github.com/ClickHouse/ClickHouse/pulls?q=is%3Aopen+is%3Apr+label%3Arelease) の ClickHouse でテストされています。 +- [サポートポリシー](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md#security-change-log-and-support) +- セキュリティ修正や新たな改善を逃さないよう、クライアントを継続的にアップグレードすることをお勧めします +- v2 API への移行で問題がある場合は、[問題を作成](https://github.com/ClickHouse/clickhouse-java/issues/new?assignees=&labels=v2-feedback&projects=&template=v2-feedback.md&title=) していただければ対応します! diff --git a/docs/ja/integrations/language-clients/java/jdbc-driver.md b/docs/ja/integrations/language-clients/java/jdbc-driver.md new file mode 100644 index 00000000000..03b1515784d --- /dev/null +++ b/docs/ja/integrations/language-clients/java/jdbc-driver.md @@ -0,0 +1,401 @@ +--- +sidebar_label: JDBC ドライバー +sidebar_position: 4 +keywords: [clickhouse, java, jdbc, ドライバー, 統合] +description: ClickHouse JDBC ドライバー +slug: /ja/integrations/java/jdbc-driver +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + +# JDBC ドライバー + +`clickhouse-jdbc` は標準の JDBC インターフェースを実装しています。[clickhouse-client](/docs/ja/integrations/clickhouse-client-local.md) の上に構築されており、カスタムタイプマッピング、トランザクションサポート、標準的な同期 `UPDATE` および `DELETE` 文などの追加機能を提供します。これにより、レガシーアプリケーションやツールでも簡単に使用できます。 + +:::note +最新の JDBC (0.6.5) バージョンは Client-V1 を使用しています +::: + +`clickhouse-jdbc` API は同期的であり、一般により大きなオーバーヘッド(例:SQL パース、タイプマッピング/変換など)があります。パフォーマンスが重要な場合や、ClickHouse へのより直接的なアクセスを好む場合は、[clickhouse-client](/docs/ja/integrations/clickhouse-client-local.md) の使用を検討してください。 + +## 環境要件 + +- [OpenJDK](https://openjdk.java.net) バージョン >= 8 + + +### セットアップ + + + + +```xml + + + com.clickhouse + clickhouse-jdbc + 0.6.5 + + all + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc +// すべての依存関係を含む uber jar を使用し、より小さい jar のために分類子を http に変更 +implementation("com.clickhouse:clickhouse-jdbc:0.6.5:all") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc +// すべての依存関係を含む uber jar を使用し、より小さい jar のために分類子を http に変更 +implementation 'com.clickhouse:clickhouse-jdbc:0.6.5:all' +``` + + + + +バージョン `0.5.0` 以降、Apache HTTP クライアントを使用して Client がパックされています。パッケージに共有バージョンがないため、依存関係としてロガーを追加する必要があります。 + + + + +```xml + + + org.slf4j + slf4j-api + 2.0.16 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.slf4j/slf4j-api +implementation("org.slf4j:slf4j-api:2.0.16") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.slf4j/slf4j-api +implementation 'org.slf4j:slf4j-api:2.0.16' +``` + + + + +## 設定 + +**ドライバークラス**: `com.clickhouse.jdbc.ClickHouseDriver` + +**URL 構文**: `jdbc:(ch|clickhouse)[:]://endpoint1[,endpoint2,...][/][?param1=value1¶m2=value2][#tag1,tag2,...]`, 例: + +- `jdbc:ch://localhost` は `jdbc:clickhouse:http://localhost:8123` と同じです +- `jdbc:ch:https://localhost` は `jdbc:clickhouse:http://localhost:8443?ssl=true&sslmode=STRICT` と同じです +- `jdbc:ch:grpc://localhost` は `jdbc:clickhouse:grpc://localhost:9100` と同じです + +**接続プロパティ**: + +| プロパティ | デフォルト | 説明 | +| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| continueBatchOnError | `false` | エラーが発生したときにバッチ処理を続行するかどうか | +| createDatabaseIfNotExist | `false` | データベースが存在しない場合に作成するかどうか | +| custom_http_headers | | カンマ区切りのカスタム HTTP ヘッダー、例: `User-Agent=client1,X-Gateway-Id=123` | +| custom_http_params | | カンマ区切りのカスタム HTTP クエリパラメータ、例: `extremes=0,max_result_rows=100` | +| nullAsDefault | `0` | `0` - null 値をそのまま扱い、null 値を非null カラムに挿入する際に例外を投げる; `1` - null 値をそのまま扱い、挿入時のnull チェックを無効にする; `2` - クエリおよび挿入の両方でnull を対応するデータタイプのデフォルト値に置き換える | +| jdbcCompliance | `true` | 標準の同期UPDATE/DELETE およびフェイクトランザクションをサポートするかどうか | +| typeMappings | | ClickHouse データタイプと Java クラスとのマッピングをカスタマイズし、[getColumnType()](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html#getColumnType-int-) および [getObject(Class)](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-java.lang.String-java.lang.Class-) の結果に影響します。例: `UInt128=java.lang.String,UInt256=java.lang.String` | +| wrapperObject | `false` | [getObject()](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-int-) がArray /Tuple に対して java.sql.Array / java.sql.Struct を返すかどうか | + +注: 詳細は [JDBC specific configuration](https://github.com/ClickHouse/clickhouse-java/blob/main/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/JdbcConfig.java) を参照してください。 + +## サポートされているデータタイプ + +JDBC ドライバーはクライアントライブラリと同じデータフォーマットをサポートしています。 + +:::note +- AggregatedFunction - :warning: `SELECT * FROM table ...` はサポートされていません +- Decimal - 一貫性のために 21.9+ で `SET output_format_decimal_trailing_zeros=1` +- Enum - 文字列と整数の両方として扱われることができます +- UInt64 - `long` にマップされます (client-v1 では) +::: + +## 接続を作成する + +```java +String url = "jdbc:ch://my-server/system"; // デフォルトで http プロトコルとポート 8123 を使用 + +Properties properties = new Properties(); + +ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties); +try (Connection conn = dataSource.getConnection("default", "password"); + Statement stmt = conn.createStatement()) { +} +``` + +## シンプルなステートメント + +```java showLineNumbers + +try (Connection conn = dataSource.getConnection(...); + Statement stmt = conn.createStatement()) { + ResultSet rs = stmt.executeQuery("select * from numbers(50000)"); + while(rs.next()) { + // ... + } +} +``` + +## 挿入 + +:::note +- `PreparedStatement` を `Statement` の代わりに使用してください +::: + +使用は簡単ですが、入力関数(下記参照)と比較してパフォーマンスが遅くなります: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("insert into mytable(* except (description))")) { + ps.setString(1, "test"); // id + ps.setObject(2, LocalDateTime.now()); // タイムスタンプ + ps.addBatch(); // パラメータはバイナリ形式でバッファされたストリームに即座に書き込まれます + ... + ps.executeBatch(); // 手元のすべてをストリームして ClickHouse に送信します +} +``` + +### 入力テーブル関数を使用 + +優れたパフォーマンス特性を持つオプション: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement( + "insert into mytable select col1, col2 from input('col1 String, col2 DateTime64(3), col3 Int32')")) { + // カラム定義が解析され、ドライバーは 3 つのパラメータがあることを知ります: col1, col2 および col3 + ps.setString(1, "test"); // col1 + ps.setObject(2, LocalDateTime.now()); // col2, setTimestamp は遅いので推奨されません + ps.setInt(3, 123); // col3 + ps.addBatch(); // パラメータはバイナリ形式でバッファーされたストリームに即座に書き込まれます + ... + ps.executeBatch(); // 手元のすべてをストリームして ClickHouse に送信します +} +``` +- 可能な限り [入力関数ドキュメント](/ja/sql-reference/table-functions/input/) を参照してください + +### プレースホルダを使用した挿入 + +このオプションは、クライアント側で解析される長い SQL 式が必要になるため、小さな挿入の場合にのみ推奨されます: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("insert into mytable values(trim(?),?,?)")) { + ps.setString(1, "test"); // id + ps.setObject(2, LocalDateTime.now()); // タイムスタンプ + ps.setString(3, null); // description + ps.addBatch(); // クエリにパラメータを追加 + ... + ps.executeBatch(); // 構成されたクエリを発行: insert into mytable values(...)(...)...(...) +} +``` + +## DateTime とタイムゾーンの処理 + +`java.sql.Timestamp` ではなく `java.time.LocalDateTime` または `java.time.OffsetDateTime`、および `java.sql.Date` ではなく `java.time.LocalDate` を使用してください。 + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("select date_time from mytable where date_time > ?")) { + ps.setObject(2, LocalDateTime.now()); + ResultSet rs = ps.executeQuery(); + while(rs.next()) { + LocalDateTime dateTime = (LocalDateTime) rs.getObject(1); + } + ... +} +``` + +## `AggregateFunction` の処理 + +:::note +現時点では、`groupBitmap` のみがサポートされています。 +::: + +```java showLineNumbers +// 入力関数を使用したバッチ挿入 +try (ClickHouseConnection conn = newConnection(props); + Statement s = conn.createStatement(); + PreparedStatement stmt = conn.prepareStatement( + "insert into test_batch_input select id, name, value from input('id Int32, name Nullable(String), desc Nullable(String), value AggregateFunction(groupBitmap, UInt32)')")) { + s.execute("drop table if exists test_batch_input;" + + "create table test_batch_input(id Int32, name Nullable(String), value AggregateFunction(groupBitmap, UInt32))engine=Memory"); + Object[][] objs = new Object[][] { + new Object[] { 1, "a", "aaaaa", ClickHouseBitmap.wrap(1, 2, 3, 4, 5) }, + new Object[] { 2, "b", null, ClickHouseBitmap.wrap(6, 7, 8, 9, 10) }, + new Object[] { 3, null, "33333", ClickHouseBitmap.wrap(11, 12, 13) } + }; + for (Object[] v : objs) { + stmt.setInt(1, (int) v[0]); + stmt.setString(2, (String) v[1]); + stmt.setString(3, (String) v[2]); + stmt.setObject(4, v[3]); + stmt.addBatch(); + } + int[] results = stmt.executeBatch(); + ... +} + +// クエリパラメータとして bitmap を使用 +try (PreparedStatement stmt = conn.prepareStatement( + "SELECT bitmapContains(my_bitmap, toUInt32(1)) as v1, bitmapContains(my_bitmap, toUInt32(2)) as v2 from {tt 'ext_table'}")) { + stmt.setObject(1, ClickHouseExternalTable.builder().name("ext_table") + .columns("my_bitmap AggregateFunction(groupBitmap,UInt32)").format(ClickHouseFormat.RowBinary) + .content(new ByteArrayInputStream(ClickHouseBitmap.wrap(1, 3, 5).toBytes())) + .asTempTable() + .build()); + ResultSet rs = stmt.executeQuery(); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt(1), 1); + Assert.assertEquals(rs.getInt(2), 0); + Assert.assertFalse(rs.next()); +} +``` + +
    + +## HTTP ライブラリの設定 + +ClickHouse JDBC コネクターは、[HttpClient](https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html)、[HttpURLConnection](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpURLConnection.html)、[Apache HttpClient](https://hc.apache.org/httpcomponents-client-5.2.x/) の3つの HTTP ライブラリをサポートしています。 + +:::note +HttpClient は JDK 11 以上でのみサポートされています。 +::: + +JDBC ドライバーは、デフォルトで `HttpClient` を使用します。ClickHouse JDBC コネクターで使用する HTTP ライブラリを変更するには、次のプロパティを設定します。 + +```java +properties.setProperty("http_connection_provider", "APACHE_HTTP_CLIENT"); +``` + +対応する値の完全なリストは次の通りです: + +| プロパティ値 | HTTP ライブラリ | +| ------------------- | ----------------- | +| HTTP_CLIENT | HTTPClient | +| HTTP_URL_CONNECTION | HttpURLConnection | +| APACHE_HTTP_CLIENT | Apache HttpClient | + +
    + +## SSL を使用して ClickHouse に接続する + +SSL を用いて ClickHouse にセキュアに JDBC で接続するには、SSL パラメータを含むように JDBC プロパティを設定する必要があります。これは通常、JDBC URL またはプロパティオブジェクトに `sslmode` や `sslrootcert` などの SSL プロパティを指定することを含みます。 + +## SSL プロパティ + +| 名称 | デフォルト値 | オプション値 | 説明 | +| ------------------ | ------------- | --------------- | ---------------------------------------------------------------------------- | +| ssl | false | true, false | 接続で SSL/TLS を有効にするかどうか | +| sslmode | strict | strict, none | SSL/TLS 証明書を確認するかどうか | +| sslrootcert | | | SSL/TLS ルート証明書のパス | +| sslcert | | | SSL/TLS 証明書のパス | +| sslkey | | | PKCS#8 フォーマットの RSA キー | +| key_store_type | | JKS, PKCS12 | キーストア/トラストストアファイルのタイプまたはフォーマットを指定 | +| trust_store | | | トラストストアファイルのパス | +| key_store_password | | | キーストア設定で指定されたファイルにアクセスするためのパスワード | + +これらのプロパティは、Java アプリケーションが ClickHouse サーバーと暗号化された接続で通信し、データ転送中のセキュリティを強化します。 + +```java showLineNumbers + String url = "jdbc:ch://your-server:8443/system"; + + Properties properties = new Properties(); + properties.setProperty("ssl", "true"); + properties.setProperty("sslmode", "strict"); // NONE はすべてのサーバーを信用し、STRICT は信頼できるもののみ + properties.setProperty("sslrootcert", "/mine.crt"); + try (Connection con = DriverManager + .getConnection(url, properties)) { + + try (PreparedStatement stmt = con.prepareStatement( + + // ここにコードを記述 + + } + } +``` + +## 大規模挿入時の JDBC タイムアウトの解決 + +ClickHouse で実行時間の長い大規模挿入を行う場合、以下のような JDBC タイムアウトエラーに遭遇することがあります: + +```plaintext +Caused by: java.sql.SQLException: Read timed out, server myHostname [uri=https://hostname.aws.clickhouse.cloud:8443] +``` + +これらのエラーはデータ挿入プロセスを妨げ、システムの安定性に影響を与える可能性があります。この問題を解決するには、クライアントの OS のいくつかのタイムアウト設定を調整する必要があります。 + +### Mac OS + +Mac OS では、次の設定を調整して問題を解決できます: + +- `net.inet.tcp.keepidle`: 60000 +- `net.inet.tcp.keepintvl`: 45000 +- `net.inet.tcp.keepinit`: 45000 +- `net.inet.tcp.keepcnt`: 8 +- `net.inet.tcp.always_keepalive`: 1 + +### Linux + +Linux では、同等の設定だけでは問題が解決しない場合があります。ソケットのキープアライブ設定を扱う方法が異なるため、追加の手順が必要です。次の手順に従ってください: + +1. `/etc/sysctl.conf` や関連する設定ファイルで次の Linux カーネルパラメータを調整します: + + - `net.inet.tcp.keepidle`: 60000 + - `net.inet.tcp.keepintvl`: 45000 + - `net.inet.tcp.keepinit`: 45000 + - `net.inet.tcp.keepcnt`: 8 + - `net.inet.tcp.always_keepalive`: 1 + - `net.ipv4.tcp_keepalive_intvl`: 75 + - `net.ipv4.tcp_keepalive_probes`: 9 + - `net.ipv4.tcp_keepalive_time`: 60 (デフォルトの300秒からこの値を下げることを検討してください) + +2. カーネルパラメータを変更した後、次のコマンドを実行して変更を適用します: + + ```shell + sudo sysctl -p + ``` + +これらの設定を行った後、クライアントがソケットのキープアライブオプションを有効にしていることを確認する必要があります: + +```java +properties.setProperty("socket_keepalive", "true"); +``` + +:::note +現在、`clickhouse-java` によってサポートされている他の 2 つの HTTP クライアントライブラリでは、ソケットオプションの設定が許可されていないため、ソケットのキープアライブを設定する際は Apache HTTP クライアントライブラリを使用する必要があります。詳しくは [HTTP ライブラリの設定](/docs/ja/integrations/java#configuring-http-library) を参照してください。 +::: + +また、JDBC URL に同等のパラメータを追加することもできます。 + +JDBC ドライバーのデフォルトのソケットおよび接続タイムアウトは 30 秒です。このタイムアウトを大規模データ挿入操作をサポートするために拡大することができます。`ClickHouseClient` で `options` メソッドを使用し、`ClickHouseClientOption` によって定義された `SOCKET_TIMEOUT` および `CONNECTION_TIMEOUT` オプションと共に使用します: + +```java showLineNumbers +final int MS_12H = 12 * 60 * 60 * 1000; // 12 時間(ミリ秒) +final String sql = "insert into table_a (c1, c2, c3) select c1, c2, c3 from table_b;"; + +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP)) { + client.read(servers).write() + .option(ClickHouseClientOption.SOCKET_TIMEOUT, MS_12H) + .option(ClickHouseClientOption.CONNECTION_TIMEOUT, MS_12H) + .query(sql) + .executeAndWait(); +} +``` + diff --git a/docs/ja/integrations/language-clients/java/r2dbc.md b/docs/ja/integrations/language-clients/java/r2dbc.md new file mode 100644 index 00000000000..043ed26ab06 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/r2dbc.md @@ -0,0 +1,77 @@ +--- +sidebar_label: R2DBC Driver +sidebar_position: 5 +keywords: [clickhouse, java, driver, integrate, r2dbc] +description: ClickHouse R2DBC Driver +slug: /ja/integrations/java/r2dbc +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +## R2DBC ドライバー + +[R2DBC](https://r2dbc.io/) は、ClickHouse 向けの非同期 Java クライアントのラッパーです。 + +### 環境要件 + +- [OpenJDK](https://openjdk.java.net) バージョン >= 8 + +### セットアップ + +```xml + + com.clickhouse + + clickhouse-r2dbc + 0.6.5 + + all + + + * + * + + + +``` + +### ClickHouse に接続 + +```java showLineNumbers +ConnectionFactory connectionFactory = ConnectionFactories + .get("r2dbc:clickhouse:http://{username}:{password}@{host}:{port}/{database}"); + + Mono.from(connectionFactory.create()) + .flatMapMany(connection -> connection +``` + +### クエリ + +```java showLineNumbers +connection + .createStatement("select domain, path, toDate(cdate) as d, count(1) as count from clickdb.clicks where domain = :domain group by domain, path, d") + .bind("domain", domain) + .execute() + .flatMap(result -> result + .map((row, rowMetadata) -> String.format("%s%s[%s]:%d", row.get("domain", String.class), + row.get("path", String.class), + row.get("d", LocalDate.class), + row.get("count", Long.class))) + ) + .doOnNext(System.out::println) + .subscribe(); +``` + +### インサート + +```java showLineNumbers +connection + .createStatement("insert into clickdb.clicks values (:domain, :path, :cdate, :count)") + .bind("domain", click.getDomain()) + .bind("path", click.getPath()) + .bind("cdate", LocalDateTime.now()) + .bind("count", 1) + .execute(); +``` diff --git a/docs/ja/integrations/language-clients/js.md b/docs/ja/integrations/language-clients/js.md new file mode 100644 index 00000000000..8d407a244d2 --- /dev/null +++ b/docs/ja/integrations/language-clients/js.md @@ -0,0 +1,1273 @@ +--- +sidebar_label: JavaScript +sidebar_position: 4 +keywords: [clickhouse, js, javascript, nodejs, web, browser, cloudflare, workers, client, connect, integrate] +slug: /ja/integrations/javascript +description: The official JS client for connecting to ClickHouse. +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse JS + +ClickHouseに接続するための公式JSクライアントです。 +クライアントはTypeScriptで書かれており、クライアントの公開APIにタイピングを提供します。 + +依存関係ゼロで、最大限のパフォーマンスを発揮するよう最適化されており、様々なClickHouseのバージョンや構成(オンプレミスのシングルノード、オンプレミスクラスター、ClickHouse Cloud)でテストされています。 + +異なる環境に対応する二つのバージョンのクライアントが提供されています: +- `@clickhouse/client` - Node.js専用 +- `@clickhouse/client-web` - ブラウザ(Chrome/Firefox)、Cloudflare workers対応 + +TypeScriptを使用する際は、[インラインインポートとエクスポート構文](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-5.html#type-modifiers-on-import-names)を有効にするために、少なくとも[バージョン4.5](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-5.html)であることを確認してください。 + +クライアントのソースコードは[ClickHouse-JS GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-js)で確認できます。 + +## 環境要件(Node.js) + +クライアントを実行するためには、Node.jsが環境で利用可能である必要があります。 +クライアントは、すべての[維持されている](https://github.com/nodejs/release#readme)Node.jsリリースと互換性があります。 + +Node.jsのバージョンがEnd-Of-Lifeに近づいた場合、そのバージョンのサポートはクライアントから削除されます。これは古くなり、安全ではないと考えられるためです。 + +現在のNode.jsバージョンのサポート: + +| Node.js version | Supported? | +|-----------------|-------------| +| 22.x | ✔ | +| 20.x | ✔ | +| 18.x | ✔ | +| 16.x | Best effort | + +## 環境要件(Web) + +クライアントのWebバージョンは、最新のChrome/Firefoxブラウザで公式にテストされており、たとえばReact/Vue/AngularアプリケーションやCloudflare workersに依存関係として使用できます。 + +## インストール + +最新の安定版Node.jsクライアントバージョンをインストールするには、次のコマンドを実行します: + +```sh +npm i @clickhouse/client +``` + +Web版のインストール: + +```sh +npm i @clickhouse/client-web +``` + +## ClickHouseとの互換性 + +| Client version | ClickHouse | +|----------------|------------| +| 1.5.0 | 23.3+ | + +クライアントはおそらく古いバージョンでも動作するでしょう。ただし、これはベストエフォートのサポートであり、保証はできません。ClickHouseのバージョンが23.3よりも古い場合、[ClickHouseのセキュリティポリシー](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md)を参照し、アップグレードを検討してください。 + +## 例 + +クライアントリポジトリ内の[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples)でクライアント使用の様々なシナリオをカバーすることを目指しています。 + +概観は[例のREADME](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/README.md#overview)で確認できます。 + +例や以下のドキュメントで不明な点や不足している情報があれば、[お問い合わせ](./js.md#contact-us)ください。 + +# クライアントAPI + +特に明示されていない限り、ほとんどの例はNode.jsとWeb版のクライアントの両方に互換性があります。 + +#### クライアントインスタンスの作成 + +必要に応じて多くのクライアントインスタンスを`createClient`ファクトリで作成できます。 + +```ts +import { createClient } from '@clickhouse/client' // または '@clickhouse/client-web' + +const client = createClient({ + /* configuration */ +}) +``` + +ESMモジュールがサポートされていない環境では、CJS構文を使うこともできます: + +```ts +const { createClient } = require('@clickhouse/client'); + +const client = createClient({ + /* configuration */ +}) +``` + +クライアントインスタンスは、インスタンス化時に[事前設定](./js.md#configuration)することができます。 + +#### 設定 + +クライアントインスタンスを作成する際、以下の接続設定を調整できます: + +- **url?: string** - ClickHouseインスタンスURL。デフォルト値: `http://localhost:8123`。参考: [URL設定ドキュメント](./js.md#url-configuration)。 +- **pathname?: string** - ClickHouse URLに追加するオプションのパス名。デフォルト値: `''`。参考: [パス名付きプロキシドキュメント](./js.md#proxy-with-a-pathname)。 +- **request_timeout?: number** - リクエストタイムアウト(ミリ秒)。デフォルト値: `30_000`。 +- **compression?: { response?: boolean; request?: boolean }** - 圧縮を有効にする。[圧縮ドキュメント](./js.md#compression) +- **username?: string** - リクエストを行うユーザーの名前。デフォルト値: `default`。 +- **password?: string** - ユーザーパスワード。デフォルト: `''`。 +- **application?: string** - Node.jsクライアントを使用するアプリケーションの名前。デフォルト値: `clickhouse-js`。 +- **database?: string** - 使用するデータベース名。デフォルト値: `default` +- **clickhouse_settings?: ClickHouseSettings** - すべてのリクエストに適用されるClickHouse設定。デフォルト値: `{}`。 +- **log?: { LoggerClass?: Logger, level?: ClickHouseLogLevel }** - 内部クライアントログの設定。[ログドキュメント](./js.md#logging-nodejs-only) +- **session_id?: string** - 各リクエストに送信されるオプションのClickHouseセッションID。 +- **keep_alive?: { enabled?: boolean }** - Node.jsおよびWebバージョンでデフォルトで有効。 +- **http_headers?: Record** - ClickHouseリクエストのための追加のHTTPヘッダ。参考: [認証付きリバースプロキシドキュメント](./js.md#reverse-proxy-with-authentication) + +#### Node.js特有の設定パラメータ + +- **max_open_connections?: number** - ホストごとに許可される最大接続ソケット数。デフォルト値: `10`。 +- **tls?: { ca_cert: Buffer, cert?: Buffer, key?: Buffer }** - TLS証明書を設定する。[TLSドキュメント](./js.md#tls-certificates-nodejs-only) +- **keep_alive?: { enabled?: boolean, idle_socket_ttl?: number }** - [Keep Aliveドキュメント](./js.md#keep-alive-configuration-nodejs-only)参照 +- **http_agent?: http.Agent | https.Agent** - (エクスペリメンタル) クライアント用のカスタムHTTPエージェント。[HTTPエージェントドキュメント](./js.md#custom-httphttps-agent-experimental-nodejs-only) +- **set_basic_auth_header?: boolean** - (エクスペリメンタル) ベーシック認証資格情報で`Authorization`ヘッダを設定する。デフォルト値: `true`。参考: [この設定のHTTPエージェントドキュメントでの使用法](./js.md#custom-httphttps-agent-experimental-nodejs-only) + +### URLの設定 + +:::important +URL設定は常にハードコーディングされた値を上書きし、その場合には警告がログに記録されます。 +::: + +クライアントインスタンスパラメータの多くをURLで設定することが可能です。URLのフォーマットは`http[s]://[username:password@]hostname:port[/database][?param1=value1¶m2=value2]`です。ほとんどの場合、特定のパラメータの名前は、設定オプションインターフェース内のそのパスを反映していますが、いくつかの例外があります。サポートされているパラメータは次のとおりです: + +| Parameter | Type | +| ------------------------------------------- | ----------------------------------------------------------------- | +| `pathname` | 任意の文字列。 | +| `application_id` | 任意の文字列。 | +| `session_id` | 任意の文字列。 | +| `request_timeout` | 0以上の数値。 | +| `max_open_connections` | 0より大きい0以上の数値。 | +| `compression_request` | boolean。 詳細は下記参照 [1]。 | +| `compression_response` | boolean。 | +| `log_level` | 許可される値: `OFF`, `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`。 | +| `keep_alive_enabled` | boolean。 | +| `clickhouse_setting_*` や `ch_*` | 以下参照 [2]。 | +| `http_header_*` | 以下参照 [3]。 | +| (Node.jsのみ) `keep_alive_idle_socket_ttl` | 0以上の数値。 | + +[1] boolean の場合、有効な値は `true`/`1` および `false`/`0` になります。 + +[2] `clickhouse_setting_` または `ch_` で始まるパラメータは、この接頭辞が削除され、残りがクライアントの `clickhouse_settings` に追加されます。たとえば、 `?ch_async_insert=1&ch_wait_for_async_insert=1` は次のとおりです: + +```ts +createClient({ + clickhouse_settings: { + async_insert: 1, + wait_for_async_insert: 1, + }, +}) +``` + +注意: `clickhouse_settings` に対するboolean 値はURL内で `1`/`0` として渡されるべきです。 + +[3] [2]と同様ですが、 `http_header` 設定用です。たとえば、 `?http_header_x-clickhouse-auth=foobar` は次のように等価です: + +```ts +createClient({ + http_headers: { + 'x-clickhouse-auth': 'foobar', + }, +}) +``` + +### 接続 + +#### 接続詳細を収集 + + + +#### 接続概観 + +クライアントはHTTP(s)プロトコル経由で接続を実装しています。RowBinaryのサポートは進行中です。[関連issue](https://github.com/ClickHouse/clickhouse-js/issues/216)を参照してください。 + +以下の例は、ClickHouse Cloudに対する接続を設定する方法を示しています。`host`(プロトコルとポートを含む)と`password`の値が環境変数で指定され、`default`ユーザーが使用されているものとします。 + +**例:** 環境変数を使用してNode.jsクライアントインスタンスを作成する。 + +```ts +import { createClient } from '@clickhouse/client' + +const client = createClient({ + host: process.env.CLICKHOUSE_HOST ?? 'http://localhost:8123', + username: process.env.CLICKHOUSE_USER ?? 'default', + password: process.env.CLICKHOUSE_PASSWORD ?? '', +}) +``` + +クライアントリポジトリには、環境変数を使用する複数の例が含まれています。たとえば、[ClickHouse Cloudでテーブルを作成する](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_cloud.ts)、[非同期インサートを使う](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/async_insert.ts)など、他にも多くの例があります。 + +#### コネクションプール(Node.jsのみ) + +リクエストごとに接続を確立するオーバーヘッドを避けるために、クライアントはClickHouseへの接続プールを作成し、Keep-Aliveメカニズムを利用して再利用します。デフォルトでKeep-Aliveが有効で、接続プールのサイズは `10` に設定されていますが、`max_open_connections` [設定オプション](./js.md#configuration)で変更することができます。 + +ユーザーが `max_open_connections: 1` を設定しない限り、プール内の同じ接続が後続のクエリに使用される保証はありません。これはまれにしか必要とされませんが、一時的なテーブルを使用するユーザーにとって必要な場合があります。 + +また、[Keep-Alive設定](./js.md#keep-alive-configuration-nodejs-only)も参照してください。 + +### Query ID + +`query`や文を送信するすべてのメソッド(`command`、`exec`、`insert`、`select`)は、結果においてユニークな`query_id`を提供します。この識別子はクライアントがクエリごとに割り当て、`system.query_log`からデータを取得したり、長時間実行されるクエリをキャンセルするために役立ちます([例参照](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/cancel_query.ts))。必要に応じて、`query_id`は`command`/`query`/`exec`/`insert`メソッドのパラメータでユーザーによって上書きできます。 + +:::tip +もし`query_id`パラメータを上書きする場合、各呼び出しに対してそのユニーク性を保証する必要があります。ランダムなUUIDがおすすめです。 +::: + +### すべてのクライアントメソッドの基本パラメータ + +いくつかのパラメータはすべてのクライアントメソッド([query](./js.md#query-method)/[command](./js.md#command-method)/[insert](./js.md#insert-method)/[exec](./js.md#exec-method))に適用できます。 + +```ts +interface BaseQueryParams { + // Queryレベルで適用できるClickHouse設定。 + clickhouse_settings?: ClickHouseSettings + // クエリバインディング用のパラメータ。 + query_params?: Record + // 進行中のクエリをキャンセルするためのAbortSignalインスタンス。 + abort_signal?: AbortSignal + // query_idの上書き;指定されていない場合、ランダムな識別子が自動的に生成されます。 + query_id?: string + // session_idの上書き;指定されていない場合、クライアント設定からセッションIDが取得されます。 + session_id?: string + // 認証情報の上書き;指定されていない場合、クライアントの認証情報が使用されます。 + auth?: { username: string, password: string } +} +``` + +### クエリメソッド + +`SELECT`のような応答を持つ大部分の文、または`CREATE TABLE`のようなDDLを送信するために使用されます。これはアプリケーション内で消費されることを意図した戻り結果セットを伴います。 + +:::note +データ挿入には専用の[insert](./js.md#insert-method)メソッドがあり、DDL用には[command](./js.md#command-method)があります。 +::: + +```ts +interface QueryParams extends BaseQueryParams { + // 実行するクエリで、何らかのデータを返す可能性があります。 + query: string + // 結果データセットのフォーマット。デフォルト: JSON。 + format?: DataFormat +} + +interface ClickHouseClient { + query(params: QueryParams): Promise +} +``` + +「すべてのクライアントメソッドの基本パラメータ」を参照してください。(./js.md#base-parameters-for-all-client-methods)。 + +:::tip +クエリ内にFORMAT句を指定せず、`format`パラメータを使用してください。 +::: + +#### ResultSetとRowの抽象化 + +ResultSetはアプリケーションでのデータ処理に便利なメソッドをいくつか提供します。 + +Node.jsのResultSet実装は内部で`Stream.Readable`を使用し、Web版はWeb APIの`ReadableStream`を使用します。 + +ResultSetを消費するには、`text`または`json`メソッドを呼び出してクエリが返すすべての行をメモリにロードします。 + +同時に、多すぎて一度にメモリに収まらない場合は、`stream`メソッドを呼び出してストリーミングモードでデータを処理出来ます。受け取った各応答チャンクは、特定のチャンクがサーバーからクライアントに送信されるサイズ(これにより個々の行のサイズが決まる)と同程度の比較的小さな配列の行に変換されます。 + +ストリーミング時に最適なフォーマットを決めるための[サポートされているデータフォーマット](./js.md#supported-data-formats)のリストを参照してください。JSONオブジェクトをストリーミングしたい場合は、[JSONEachRow](https://clickhouse.com/docs/ja/sql-reference/formats#jsoneachrow) を選択し、各行がJSオブジェクトとしてパースされます。あるいは、よりコンパクトな[JSONCompactColumns](https://clickhouse.com/docs/ja/sql-reference/formats#jsoncompactcolumns)フォーマットを選択して、各行をコンパクトな値の配列として受け取ることもできます。次に、[ファイルのストリーミング](./js.md#streaming-files-nodejs-only)を参照してください。 + +:::important +ResultSet またはそのストリームが完全に消費されない場合、`request_timeout` の非アクティブ期間の後、破棄されます。 +::: + +```ts +interface BaseResultSet { + // 前述の "Query ID" 部分を参照 + query_id: string + + // ストリーム全体を消費してその内容を文字列として取得 + // どの DataFormat でも使用可能 + // 1回だけ呼び出し + text(): Promise + + // ストリーム全体を消費し、JSオブジェクトとして内容を解析 + // JSON フォーマットのみで使用可能 + // 1回だけ呼び出し + json(): Promise + + // ストリーミングできる応答用にリーダブルストリームを返す + // ストリームの各反復処理では、選択した DataFormat のRow[]の配列を提供 + // 1回だけ呼び出し + stream(): Stream +} + +interface Row { + // 行の内容をプレーン文字列として取得 + text: string + + // 行の内容をJSオブジェクトとして解析する + json(): T +} +``` + +**例:** (Node.js/Web) `JSONEachRow`形式の結果データセットを伴うクエリを実行し、ストリーム全体を消費して内容をJSオブジェクトとして解析します。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/array_json_each_row.ts)。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * FROM my_table', + format: 'JSONEachRow', +}) +const dataset = await resultSet.json() // JSONの解析を避けるために`row.text`を使用することもできます +``` + +**例:** (Node.jsのみ) `on('data')` アプローチを使用した `JSONEachRow` フォーマットによるストリーミングクエリ結果。この方法は `for await const` 構文と交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_json_each_row.ts)。 + +```ts +const rows = await client.query({ + query: 'SELECT number FROM system.numbers_mt LIMIT 5', + format: 'JSONEachRow', // または、JSONCompactEachRow, JSONStringsEachRow など +}) +const stream = rows.stream() +stream.on('data', (rows: Row[]) => { + rows.forEach((row: Row) => { + console.log(row.json()) // JSONの解析を避けるために `row.text`を使用 + }) +}) +await new Promise((resolve, reject) => { + stream.on('end', () => { + console.log('Completed!') + resolve(0) + }) + stream.on('error', reject) +}) +``` + +**例:** (Node.jsのみ) `CSV`フォーマットでストリーミングクエリ結果を取得し、それを `on('data')` アプローチを使用してストリーム送りする。この方法は `for await const` 構文と交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_text_line_by_line.ts) + +```ts +const resultSet = await client.query({ + query: 'SELECT number FROM system.numbers_mt LIMIT 5', + format: 'CSV', // または、TabSeparated, CustomSeparated など +}) +const stream = resultSet.stream() +stream.on('data', (rows: Row[]) => { + rows.forEach((row: Row) => { + console.log(row.text) + }) +}) +await new Promise((resolve, reject) => { + stream.on('end', () => { + console.log('Completed!') + resolve(0) + }) + stream.on('error', reject) +}) +``` + +**例:** (Node.jsのみ) `for await const` 構文を使用して取得した `JSONEachRow` フォーマットのJSオブジェクトとしてストリーミングクエリ結果。 この方法は `on('data')` アプローチと交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_json_each_row_for_await.ts)。 + +```ts +const resultSet = await client.query({ + query: 'SELECT number FROM system.numbers LIMIT 10', + format: 'JSONEachRow', // または、JSONCompactEachRow, JSONStringsEachRow など +}) +for await (const rows of resultSet.stream()) { + rows.forEach(row => { + console.log(row.json()) + }) +} +``` + +:::note +`for await const` 構文は、`on('data')` アプローチに比べてコードが少ないですが、パフォーマンスに負の影響を与える可能性があります。詳細は[Node.jsリポジトリ内のこのissue](https://github.com/nodejs/node/issues/31979)を参照してください。 +::: + +**例:** (Webのみ) `ReadableStream`でのオブジェクトの反復処理。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * FROM system.numbers LIMIT 10', + format: 'JSONEachRow' +}) + +const reader = resultSet.stream().getReader() +while (true) { + const { done, value: rows } = await reader.read() + if (done) { break } + rows.forEach(row => { + console.log(row.json()) + }) +} +``` + +### Insertメソッド + +これはデータ挿入の主要な方法です。 + +```ts +export interface InsertResult { + query_id: string + executed: boolean +} + +interface ClickHouseClient { + insert(params: InsertParams): Promise +} +``` + +戻り値の型は最小限であり、サーバーからのデータを返さないことを前提としており、応答ストリームを直ちにドレインします。 + +空の配列が Insert メソッドに提供された場合、インサート文はサーバーに送信されません。代わりに、`{ query_id: '...', executed: false }`で即座に解決されます。この場合、メソッドパラメータで `query_id` が指定されていない場合、結果は空文字列になります。これは、クエリログテーブルにそのような`query_id`を持つクエリが存在しないため、クライアントが生成したランダムUUIDが混乱を招く可能性があるためです。 + +インサート文がサーバーに送信された場合、`executed` フラグは `true` になります。 + +#### InsertメソッドとNode.jsでのストリーミング + +これは、指定されたデータフォーマットに応じて `Stream.Readable` または単純な `Array` のいずれかで動作します。[サポートされているデータフォーマット](./js.md#supported-data-formats)も参照してください。このセクションについては[ファイルストリーミング](./js.md#streaming-files-nodejs-only)にも関連します。 + +Insertメソッドはawaitされることを前提としています。ただし、入力ストリームを指定し、ストリームが完了した後にのみ`insert`操作をawaitすることが可能です(これにより`insert`プロミスが解決されます)。これは潜在的にイベントリスナーや類似のシナリオで有用ですが、エラーハンドリングはクライアント側で多くのエッジケースに対応するため簡単ではないかもしれません。それよりも、例えばこの[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/async_insert_without_waiting.ts)のように[非同期インサート](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)を使用することを検討してください。 + +:::tip +カスタムのINSERTステートメントを持っていて、これをこのメソッドでモデル化するのが困難な場合、[command](./js.md#command-method)を使用することを検討してください。[INSERT INTO ... VALUES](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_values_and_functions.ts)や[INSERT INTO ... SELECT](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_from_select.ts)での使用方法を参照してください。 +::: + +```ts +interface InsertParams extends BaseQueryParams { + // データを挿入するテーブル名 + table: string + // 挿入するデータセット。 + values: ReadonlyArray | Stream.Readable + // 挿入するデータセットのフォーマット。 + format?: DataFormat + // データを挿入するカラムを指定できます。 + // - `['a', 'b']` のような配列は: `INSERT INTO table (a, b) FORMAT DataFormat` を生成 + // - `{ except: ['a', 'b']}` のようなオブジェクトは: `INSERT INTO table (* EXCEPT (a, b)) FORMAT DataFormat` を生成 + // デフォルトでは、データはテーブルのすべてのカラムに挿入されます。 + // 生成される文は: `INSERT INTO table FORMAT DataFormat` となります。 + columns?: NonEmptyArray | { except: NonEmptyArray } +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +:::important +`abort_signal` でリクエストをキャンセルしても、データ挿入が行われなかったことを保証するものではありません。サーバーはキャンセル前にストリーミングされたデータの一部を受信している可能性があります。 +::: + +**例:** (Node.js/Web) 配列の値を挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/array_json_each_row.ts)。 + +```ts +await client.insert({ + table: 'my_table', + // 構造は望むフォーマットと一致している必要があります。この例では JSONEachRow + values: [ + { id: 42, name: 'foo' }, + { id: 42, name: 'bar' }, + ], + format: 'JSONEachRow', +}) +``` + +**例:** (Node.jsのみ) CSVファイルからストリームを挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_csv.ts)。次に参照: [ファイルストリーミング](./js.md#streaming-files-nodejs-only)。 + +```ts +await client.insert({ + table: 'my_table', + values: fs.createReadStream('./path/to/a/file.csv'), + format: 'CSV', +}) +``` + +**例**: インサート文から特定のカラムを除外する。 + +テーブル定義を仮定して: + +```sql +CREATE OR REPLACE TABLE mytable +(id UInt32, message String) +ENGINE MergeTree() +ORDER BY (id) +``` + +特定のカラムのみを挿入します。 + +```ts +// 生成された文: INSERT INTO mytable (message) FORMAT JSONEachRow +await client.insert({ + table: 'mytable', + values: [{ message: 'foo' }], + format: 'JSONEachRow', + // この行の`id`カラム値はゼロになります(UInt32のデフォルト) + columns: ['message'], +}) +``` + +特定のカラムを除外: + +```ts +// 生成された文: INSERT INTO mytable (* EXCEPT (message)) FORMAT JSONEachRow +await client.insert({ + table: tableName, + values: [{ id: 144 }], + format: 'JSONEachRow', + // この行の`message`カラム値は空の文字列になります + columns: { + except: ['message'], + }, +}) +``` + +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_exclude_columns.ts) を参照して追加の詳細を確認してください。 + +**例**: クライアントインスタンスに提供されたものとは異なるデータベースに挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_into_different_db.ts)。 + +```ts +await client.insert({ + table: 'mydb.mytable', // データベースを含む完全な名前 + values: [{ id: 42, message: 'foo' }], + format: 'JSONEachRow', +}) +``` + +#### Web版の制限事項 + +現在、`@clickhouse/client-web` での挿入は `Array` および `JSON*` フォーマットでのみ機能します。 +ストリームの挿入はまだWeb版でサポートされていないため、ブラウザの互換性が低いです。 + +その結果、Web版の`InsertParams`インターフェースはNode.js版とは少し異なり、 +`values`は`ReadonlyArray`型に制限されています: + +```ts +interface InsertParams extends BaseQueryParams { + // データを挿入するテーブル名 + table: string + // 挿入するデータセット。 + values: ReadonlyArray + // 挿入するデータセットのフォーマット。 + format?: DataFormat + // データを挿入するカラムを指定することができます。 + // - `['a', 'b']` のような配列は: `INSERT INTO table (a, b) FORMAT DataFormat` を生成します + // - `{ except: ['a', 'b']}` のようなオブジェクトは: `INSERT INTO table (* EXCEPT (a, b)) FORMAT DataFormat` を生成します + // デフォルトでは、すべてのカラムにデータを挿入し、 + // 生成された文は: `INSERT INTO table FORMAT DataFormat` になります。 + columns?: NonEmptyArray | { except: NonEmptyArray } +} +``` + +これは将来的に変更される可能性があります。次も参照してください: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +### Commandメソッド + +Commandメソッドは、FORMAT句が適用できない文や、応答を特に必要としない状況で使用します。 +例としては、`CREATE TABLE` や `ALTER TABLE` があります。 + +このメソッドはawaitすべきです。 + +応答ストリームは即座に破棄され、その結果、基盤となるソケットも解放されます。 + +```ts +interface CommandParams extends BaseQueryParams { + // 実行する文。 + query: string +} + +interface CommandResult { + query_id: string +} + +interface ClickHouseClient { + command(params: CommandParams): Promise +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +**例:** (Node.js/Web) ClickHouse Cloudでテーブルを作成する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_cloud.ts)。 + +```ts +await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS my_cloud_table + (id UInt64, name String) + ORDER BY (id) + `, + // クラスター使用時に、HTTPヘッダーが既にクライアントに送られた後にクエリ処理エラーが発生した状況を避けるために推奨されます。 + // https://clickhouse.com/docs/ja/interfaces/http/#response-bufferingを参照 + clickhouse_settings: { + wait_end_of_query: 1, + }, +}) +``` + +**例:** (Node.js/Web) セルフマネージドのClickHouseインスタンスでテーブルを作成する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_single_node.ts)。 + +```ts +await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS my_table + (id UInt64, name String) + ENGINE MergeTree() + ORDER BY (id) + `, +}) +``` + +**例:** (Node.js/Web) INSERT FROM SELECT + +```ts +await client.command({ + query: `INSERT INTO my_table SELECT '42'`, +}) +``` + +:::important +`abort_signal` でリクエストをキャンセルしても、サーバーがステートメントを実行していないことを保証するものではありません。 +::: + +### Execメソッド + +カスタムクエリがあって、`query`/`insert`に適合せず、結果に関心がある場合、`exec`を`command`の代替として使用できます。 + +`exec`はリーダブルストリームを返し、アプリケーション側で消費または破棄しなければなりません。 + +```ts +interface ExecParams extends BaseQueryParams { + // 実行する文。 + query: string +} + +interface ClickHouseClient { + exec(params: ExecParams): Promise +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +ストリームの戻り型は、Node.js版とWeb版で異なります。 + +Node.js: + +```ts +export interface QueryResult { + stream: Stream.Readable + query_id: string +} +``` + +Web: + +```ts +export interface QueryResult { + stream: ReadableStream + query_id: string +} +``` + +### Ping + +`ping`メソッドはサーバに到達可能かチェックするために提供されており、サーバが到達可能であると `true` を返します。 + +サーバに到達できない場合、基盤となるエラーが結果に含まれます。 + +```ts +type PingResult = + | { success: true } + | { success: false; error: Error } + +interface ClickHouseClient { + ping(): Promise +} +``` + +Pingはアプリケーション開始時にサーバが使用可能か確認するための便利なツールであり、とりわけClickHouse Cloudでは、インスタンスがアイドル状態からPingで目覚めます。 + +**例:** (Node.js/Web) ClickHouseサーバインスタンスにPingする。注意:Web版では、捕捉されたエラーが異なります。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/ping.ts)。 + +```ts +const result = await client.ping(); +if (!result.success) { + // result.errorを処理する +} +``` + +注意: `/ping` エンドポイントがCORSを実装していないため、Web版では、簡単な `SELECT 1` を使用して類似した結果を達成します。 + +### クローズ (Node.jsのみ) + +すべてのオープンな接続を閉じてリソースを解放します。Web版ではNo-opです。 + +```ts +await client.close() +``` + +## ファイルのストリーミング (Node.jsのみ) + +クライアントリポジトリには、人気のあるデータフォーマット(NDJSON、CSV、Parquet)でのファイルストリーミングのいくつかの例があります。 + +- [NDJSONファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_ndjson.ts) +- [CSVファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_csv.ts) +- [Parquetファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_parquet.ts) +- [ファイルとしてのParquetへのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_parquet_as_file.ts) + +別の形式をファイルにストリーミングすることはParquetの場合と同様です。 +`query`呼び出しに使用するフォーマット(`JSONEachRow`、`CSV`など)と出力ファイル名が異なるだけです。 + +## サポートされているデータフォーマット + +クライアントはデータフォーマットとしてJSONまたはテキストを処理します。 + +もし`format`としてJSONファミリーのいずれかを指定した場合(`JSONEachRow`、`JSONCompactEachRow` など)、クライアントは通信中にデータをシリアル化およびデシリアル化します。 + +「生」のテキストフォーマットで提供されたデータ(`CSV`、`TabSeparated`および`CustomSeparated`ファミリー)は、追加の変換なしで通信線上を送信されます。 + +:::tip +JSON一般形式と[ClickHouse JSON形式](https://clickhouse.com/docs/ja/sql-reference/formats#json)の間で混乱する可能性があります。 + +クライアントは`JSONEachRow`などの形式でJSONオブジェクトをストリーミングすることをサポートしています(ストリーミングに適した他の形式の概要についてはこの表を参照してください;クライアントリポジトリの`select_streaming_`[例を参照してください](https://github.com/ClickHouse/clickhouse-js/tree/main/examples/node))。 + +ただし、[ClickHouse JSON](https://clickhouse.com/docs/ja/sql-reference/formats#json)のような形式やいくつかの他の形式は、応答で単一オブジェクトとして表現され、クライアントによってストリーミングすることはできません。 +::: + +| Format | Input (array) | Input (object) | Input/Output (Stream) | Output (JSON) | Output (text) | +|--------------------------------------------|---------------|----------------|-----------------------|---------------|----------------| +| JSON | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONCompact | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONObjectEachRow | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONColumnsWithMetadata | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONStrings | ❌ | ❌️ | ❌ | ✔️ | ✔️ | +| JSONCompactStrings | ❌ | ❌ | ❌ | ✔️ | ✔️ | +| JSONEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONStringsEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRowWithNames | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRowWithNamesAndTypes | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRowWithNames | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRowWithNamesAndTypes | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| CSV | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CSVWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CSVWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparated | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedRaw | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparated | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparatedWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparatedWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| Parquet | ❌ | ❌ | ✔️ | ❌ | ✔️❗- 次を参照 | + +Parquetの場合、selectの主なユースケースは結果ストリームをファイルに書き込むことです。[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_parquet_as_file.ts)をクライアントリポジトリで参照してください。 + +ClickHouseの入力および出力形式の完全なリストは[ここ](https://clickhouse.com/docs/ja/interfaces/formats)で確認できます。 + +## サポートされているClickHouseデータ型 + +| Type | Status | JS type | +|----------------|----------------|-----------------------| +| UInt8/16/32 | ✔️ | number | +| UInt64/128/256 | ✔️❗- 次参照 | string | +| Int8/16/32 | ✔️ | number | +| Int64/128/256 | ✔️❗- 次参照 | string | +| Float32/64 | ✔️ | number | +| Decimal | ✔️❗- 次参照 | number | +| Boolean | ✔️ | boolean | +| String | ✔️ | string | +| FixedString | ✔️ | string | +| UUID | ✔️ | string | +| Date32/64 | ✔️ | string | +| DateTime32/64 | ✔️❗- 次参照 | string | +| Enum | ✔️ | string | +| LowCardinality | ✔️ | string | +| Array(T) | ✔️ | T[] | +| JSON | ✔️ | object | +| Nested | ✔️ | T[] | +| Tuple | ✔️ | Tuple | +| Nullable(T) | ✔️ | JS type for T or null | +| IPv4 | ✔️ | string | +| IPv6 | ✔️ | string | +| Point | ✔️ | [ number, number ] | +| Ring | ✔️ | Array | +| Polygon | ✔️ | Array | +| MultiPolygon | ✔️ | Array | +| Map(K, V) | ✔️ | Record | + +サポートされているClickHouse形式の完全なリストは、 +[こちら](https://clickhouse.com/docs/ja/sql-reference/data-types/)で確認できます。 + +### Date/Date32型についての注意点 + +クライアントは追加の型変換をせずに値を挿入するため、`Date`/`Date32`型のカラムは文字列としてのみ挿入できます。 + +**例:** `Date`型の値を挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/ba387d7f4ce375a60982ac2d99cb47391cf76cec/__tests__/integration/date_time.test.ts)。 + +```ts +await client.insert({ + table: 'my_table', + values: [ { date: '2022-09-05' } ], + format: 'JSONEachRow', +}) +``` + +ただし、`DateTime`または`DateTime64`カラムを使用している場合、文字列とJS Dateオブジェクトの両方を使用できます。JS Dateオブジェクトは`date_time_input_format`を`best_effort`として`insert`にそのまま渡すことができます。この[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_js_dates.ts)を参照して詳細を確認してください。 + +### Decimal\* 型についての注意点 + +`JSON*`ファミリーフォーマットを用いてDecimalを挿入することが可能です。たとえば、以下のようなテーブルが定義されているとします: + +```sql +CREATE TABLE my_table +( + id UInt32, + dec32 Decimal(9, 2), + dec64 Decimal(18, 3), + dec128 Decimal(38, 10), + dec256 Decimal(76, 20) +) +ENGINE MergeTree() +ORDER BY (id) +``` + +次のように、精度を失うことなくString表現を用いて値を挿入できます: + +```ts +await client.insert({ + table: 'my_table', + values: [{ + id: 1, + dec32: '1234567.89', + dec64: '123456789123456.789', + dec128: '1234567891234567891234567891.1234567891', + dec256: '12345678912345678912345678911234567891234567891234567891.12345678911234567891', + }], + format: 'JSONEachRow', +}) +``` + +ただし、`JSON*`形式でデータをクエリする場合、ClickHouseはデフォルトでDecimalを数値として返すため、精度が失われる可能性があります。これを避けるには、クエリ内でDecimalを文字列にキャストします: + +```ts +await client.query({ + query: ` + SELECT toString(dec32) AS decimal32, + toString(dec64) AS decimal64, + toString(dec128) AS decimal128, + toString(dec256) AS decimal256 + FROM my_table + `, + format: 'JSONEachRow', +}) +``` + +詳細については[この例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_decimals.ts)を参照してください。 + +### 整数型:Int64、Int128、Int256、UInt64、UInt128、UInt256 + +サーバーは数値として受け入れることができますが、クライアントでは整数オーバーフローを避けるため、これらの型は`JSON*`ファミリー出力フォーマットで文字列として返されます。これらの型の最大値は `Number.MAX_SAFE_INTEGER` よりも大きいです。 + +ただし、この動作は +[`output_format_json_quote_64bit_integers` 設定](https://clickhouse.com/docs/ja/operations/settings/formats#output_format_json_quote_64bit_integers)を使用して変更できます。 + +**例:** 64ビット数値のためにJSON出力フォーマットを調整する。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * from system.numbers LIMIT 1', + format: 'JSONEachRow', +}) + +expect(await resultSet.json()).toEqual([ { number: '0' } ]) +``` + +```ts +const resultSet = await client.query({ + query: 'SELECT * from system.numbers LIMIT 1', + format: 'JSONEachRow', + clickhouse_settings: { output_format_json_quote_64bit_integers: 0 }, +}) + +expect(await resultSet.json()).toEqual([ { number: 0 } ]) +``` + +## ClickHouse設定 + +クライアントは、[設定](https://clickhouse.com/docs/ja/operations/settings/settings/)メカニズムを介してClickHouseの動作を調整することができます。 +これらの設定は、クライアントインスタンスレベルで設定でき、ClickHouseへのすべての要求に適用されます: + +```ts +const client = createClient({ + clickhouse_settings: {} +}) +``` + +または、リクエストレベルで設定を構成することもできます: + +```ts +client.query({ + clickhouse_settings: {} +}) +``` + +すべてのサポートされているClickHouse設定を含む型宣言ファイルは +[こちら](https://github.com/ClickHouse/clickhouse-js/blob/main/packages/client-common/src/settings.ts)で見つけることができます。 + +:::important +クエリが行われるユーザーが、設定を変更するための十分な権限を持っていることを確認してください。 +::: + +## 高度なトピック + +### パラメータ付きクエリ + +クエリにパラメータを作成し、クライアントアプリケーションからそれらに値を渡すことができます。これにより、クライアント側で特定の動的値でクエリをフォーマットする必要がなくなります。 + +通常のフォーマットでクエリを作成し、クエリのアプリパラメータから値を渡したい場所に次のフォーマットで中括弧に入れてください: + +``` +{: } +``` + +ここで: + +- `name` — プレースホルダー識別子。 +- `data_type` - アプリケーションパラメータ値の[データ型](https://clickhouse.com/docs/ja/sql-reference/data-types/)。 + +**例:**: パラメータ付きクエリ。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/query_with_parameter_binding.ts)。 + +```ts +await client.query({ + query: 'SELECT plus({val1: Int32}, {val2: Int32})', + format: 'CSV', + query_params: { + val1: 10, + val2: 20, + }, +}) +``` + +さらに詳しい情報は、https://clickhouse.com/docs/ja/interfaces/cli#cli-queries-with-parameters-syntax を確認してください。 + +### 圧縮 + +注意: リクエスト圧縮は現在Web版では利用できません。レスポンス圧縮は通常どおり機能します。Node.js版は両方をサポートしています。 + +大きなデータセットを通信するアプリケーションは、圧縮を有効にすることで利益を得ることができます。現在、[zlib](https://nodejs.org/docs/latest-v14.x/api/zlib.html)を使用した`GZIP`のみがサポートされています。 + +```typescript +createClient({ + compression: { + response: true, + request: true + } +}) +``` + +設定パラメータは次のとおりです: + +- `response: true` はClickHouseサーバに圧縮されたレスポンスボディを返すよう指示します。デフォルト値: `response: false` +- `request: true` クライアントリクエストボディの圧縮を有効にします。デフォルト値: `request: false` + +### ロギング (Node.jsのみ) + +:::important +ロギングはエクスペリメンタルな機能であり、将来的に変更される可能性があります。 +::: + +デフォルトのロガー実装は、 `console.debug/info/warn/error` メソッドを介して`stdout`にログレコードを出力します。 +`LoggerClass`を提供してログロジックをカスタマイズし、 `level`パラメータで希望するログレベルを選ぶことができます(デフォルトは`OFF`です): + +```typescript +import type { Logger } from '@clickhouse/client' + +// クライアントによってエクスポートされる3つのすべてのLogParams型 +interface LogParams { + module: string + message: string + args?: Record +} +type ErrorLogParams = LogParams & { err: Error } +type WarnLogParams = LogParams & { err?: Error } + +class MyLogger implements Logger { + trace({ module, message, args }: LogParams) { + // ... + } + debug({ module, message, args }: LogParams) { + // ... + } + info({ module, message, args }: LogParams) { + // ... + } + warn({ module, message, args }: WarnLogParams) { + // ... + } + error({ module, message, args, err }: ErrorLogParams) { + // ... + } +} + +const client = createClient({ + log: { + LoggerClass: MyLogger, + level: ClickHouseLogLevel + } +}) +``` + +現在、クライアントは以下のイベントをログに記録します: + +- `TRACE` - Keep-Aliveソケットのライフサイクルに関する低レベルの情報 +- `DEBUG` - 応答情報(認証ヘッダーやホスト情報を除く) +- `INFO` - 主に使用されない、クライアントが初期化される時に現在のログレベルを表示する +- `WARN` - 致命的でないエラー;失敗した`ping`リクエストは警告としてログに記録され、基盤となるエラーは結果に含まれる +- `ERROR` - `query`/`insert`/`exec`/`command`メソッドからの致命的なエラー、例えば失敗したリクエスト + +デフォルトのロガー実装は[ここ](https://github.com/ClickHouse/clickhouse-js/blob/main/packages/client-common/src/logger.ts)で確認できます。 + +### TLS証明書 (Node.jsのみ) + +Node.jsクライアントはオプションで基本的な(認証局のみ)および相互(認証局とクライアント証明書)TLSをサポートしています。 + +`certs`フォルダ内に証明書を持ち、CAファイル名が`CA.pem`であることを前提とした基本的なTLS設定例: + +```ts +const client = createClient({ + host: 'https://:', + username: '', + password: '', // 必要な場合 + tls: { + ca_cert: fs.readFileSync('certs/CA.pem'), + }, +}) +``` + +クライアント証明書を使った相互TLS設定例: + +```ts +const client = createClient({ + host: 'https://:', + username: '', + tls: { + ca_cert: fs.readFileSync('certs/CA.pem'), + cert: fs.readFileSync(`certs/client.crt`), + key: fs.readFileSync(`certs/client.key`), + }, +}) +``` + +クライアントリポジトリの[基本TLS例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/basic_tls.ts)および[相互TLS例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/mutual_tls.ts)を参照してください。 + +### Keep-Alive設定 (Node.jsのみ) + +クライアントは基盤となるHTTPエージェントでKeep-Aliveをデフォルトで有効にします。つまり、接続されたソケットは後続のリクエストで再利用され、`Connection: keep-alive` ヘッダが送信されます。アイドル状態のソケットはデフォルトで2500ミリ秒間接続プールに残ります([このオプションの調整についてのメモ](./js.md#adjusting-idle_socket_ttl)を参照してください)。 + +`keep_alive.idle_socket_ttl`はその値がサーバー/LB設定を大幅に下回る必要があります。主な理由は、HTTP/1.1がクライアントに通知せずにサーバーがソケットを閉じることを許可するため、サーバーやロードバランサーがクライアントより先にコネクションを閉じると、クライアントが閉じたソケットを再利用しようとして`socket hang up`エラーが発生する可能性があるからです。 + +`keep_alive.idle_socket_ttl`を変更する場合、常にサーバー/LBのKeep-Alive設定と同期している必要があり、常にそれより低くなければなりません。これにより、サーバーがクライアントより先にオープンな接続を閉じることはないことが保証されます。 + +#### `idle_socket_ttl`の調整 + +クライアントは `keep_alive.idle_socket_ttl` を 2500ミリ秒に設定しています。これは最も安全なデフォルトとみなされ、その間に`keep_alive_timeout`が[23.11より前のバージョンのClickHouseで設定なしで3秒ほどに設定されるかもしれない](https://github.com/ClickHouse/ClickHouse/commit/1685cdcb89fe110b45497c7ff27ce73cc03e82d1)ためです。 + +:::warning +パフォーマンスに満足していて、問題が発生していない場合、`keep_alive.idle_socket_ttl`設定の値を増やさないことをお勧めします。そうしないと"Socket hang-up"エラーが発生する可能性があるからです。また、アプリケーションが多くのクエリを送信し、それらの間に多くのダウンタイムがない場合、そのデフォルト値で十分であるはずです。ソケットは長時間アイドルすることなく、クライアントがそれらをプールに保持するからです。 +::: + +次のコマンドを実行することでサーバー応答ヘッダの中で正しいKeep-Aliveタイムアウト値を見つけることができます: + +```sh +curl -v --data-binary "SELECT 1" +``` + +応答の中の`Connection`と`Keep-Alive`ヘッダの値を確認してください。たとえば: + +``` +< Connection: Keep-Alive +< Keep-Alive: timeout=10 +``` + +この場合、`keep_alive_timeout`は10秒です。アイドルソケットをデフォルトよりも少し長く開いておくために、`keep_alive.idle_socket_ttl`を9000または9500ミリ秒に増やしてみることができます。"Socket hang-up"エラーが発生しないか確認してください。これらが発生する場合、サーバーがクライアントより先に接続を閉じていることを示し、エラーが消えるまで値を下げます。 + +#### Keep-Aliveのトラブルシューティング + +Keep-Aliveを使用中に`socket hang up`エラーが発生する場合、次のオプションでこの問題を解決できます: + +* ClickHouseサーバー設定で `keep_alive.idle_socket_ttl` 設定をわずかに減少させる。特定の状況、たとえばクライアントとサーバーの間の高いネットワーク遅延がある場合、送信中のリクエストがサーバーが閉じる予定のソケットを取得する状況を避けるために、`keep_alive.idle_socket_ttl`を200〜500ミリ秒ほどさらに減少させることが有益かもしれません。 +* このエラーがデータの入出力なしで長時間実行されるクエリ中に発生している場合(たとえば、長時間実行される `INSERT FROM SELECT`)、ロードバランサがアイドル状態の接続を閉じるためかもしれません。このような長時間実行されるクエリ中に一部のデータの入出力を強制することを試みるためには、以下のClickHouse設定を組み合わせて使用できます。 + + ```ts + const client = createClient({ + // ここでは、実行時間が5分以上かかるクエリがあると想定しています + request_timeout: 400_000, + /** これらの設定を組み合わせることで、データの入出力がない長時間実行されるクエリを実行する際のLBのタイムアウトの問題を回避できます。 + * 例えば、 `INSERT FROM SELECT` などのように。LBが接続をアイドル状態と見なして突然切断する可能性があります。 + * この場合、LBのアイドル接続タイムアウトが120秒であると想定し、安全な値として110秒に設定します。 */ + clickhouse_settings: { + send_progress_in_http_headers: 1, + http_headers_progress_interval_ms: '110000', // UInt64、文字列として渡す必要があります + }, + }) + ``` + しかしながら、受信ヘッダーの総サイズには最近のNode.jsバージョンで16KBの制限があることを覚えておいてください。テストでは約70〜80の進捗ヘッダーを受信すると例外が発生しました。 + + また、完全に異なる方法を使用することも可能です。これは、HTTPインターフェイスの「機能」を利用することで、接続が失われてもミューテーションがキャンセルされないため、待機時間を完全に回避できます。[この例(パート2)](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/long_running_queries_timeouts.ts)を参照してください。 + +* Keep-Alive機能を完全に無効にすることができます。この場合、クライアントはすべてのリクエストに `Connection: close` ヘッダーを追加し、基盤のHTTPエージェントは接続を再利用しないようにします。`keep_alive.idle_socket_ttl` 設定は無視されます。これは、アイドル状態のソケットがないためです。これにより、すべてのリクエストに対して新しい接続が確立されるため、追加のオーバーヘッドが発生します。 + + ```ts + const client = createClient({ + keep_alive: { + enabled: false, + }, + }) + ``` + +### 読み取り専用ユーザー + +クライアントを[readonly=1のユーザー](https://clickhouse.com/docs/ja/operations/settings/permissions-for-queries#readonly)で使用する場合、`enable_http_compression`設定が必要なため、レスポンス圧縮を有効にすることはできません。以下の設定はエラーを引き起こします: + +```ts +const client = createClient({ + compression: { + response: true, // readonly=1のユーザーでは機能しません + }, +}) +``` + +readonly=1のユーザーの制限についての詳細は[こちらの例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/read_only_user.ts)を参照してください。 + +### パスネームを持つプロキシ + +ClickHouseインスタンスがプロキシの背後にあり、URLにパスネームがある場合(たとえば、http://proxy:8123/clickhouse_server)、`clickhouse_server` を `pathname` 設定オプションとして指定してください(先頭にスラッシュがあってもなくても構いません)。さもなければ、`url` に直接指定されている場合、それが `database` オプションとして考慮されます。複数のセグメントがサポートされています。例:`/my_proxy/db`。 + +```ts +const client = createClient({ + url: 'http://proxy:8123', + pathname: '/clickhouse_server', +}) +``` + +### 認証付きのリバースプロキシ + +ClickHouse配置の前に認証付きのリバースプロキシがある場合、必要なヘッダーを提供するために `http_headers` 設定を使用できます: + +```ts +const client = createClient({ + http_headers: { + 'My-Auth-Header': '...', + }, +}) +``` + +### カスタムHTTP/HTTPSエージェント(エクスペリメンタル、Node.jsのみ) + +:::warning +これは将来的なリリースでの後方互換性のない方法で変更される可能性のあるエクスペリメンタルな機能です。クライアントが提供するデフォルトの実装と設定は、ほとんどのユースケースで十分です。この機能は、必要があることを確信している場合にのみ使用してください。 +::: + +デフォルトでは、クライアントはクライアント設定で提供された設定(`max_open_connections`、`keep_alive.enabled`、`tls`など)を使用して基盤のHTTP(s)エージェントを構成し、ClickHouseサーバーへの接続を管理します。さらに、TLS証明書が使用される場合、基盤のエージェントは必要な証明書で構成され、正しいTLS認証ヘッダーが強制されます。 + +バージョン1.2.0以降、デフォルトの基盤エージェントを置き換えるカスタムHTTP(s)エージェントをクライアントに提供することが可能です。これは、ネットワーク構成が複雑な場合に役立ちます。カスタムエージェントが提供される場合、次の条件が適用されます: +- `max_open_connections`と`tls`オプションはクライアントによって無視され、効果はありません。これらは基盤エージェントの設定の一部です。 +- `keep_alive.enabled`はデフォルトの`Connection`ヘッダーの値のみを規制します(`true` -> `Connection: keep-alive`、`false` -> `Connection: close`)。 +- アイドル状態のキープアライブソケット管理は引き続き動作します(これはエージェントではなく特定のソケット自体に関連付けられています)が、`keep_alive.idle_socket_ttl`値を`0`に設定して完全に無効にすることもできます。 + +#### カスタムエージェント使用例 + +証明書なしのカスタムHTTP(s)エージェントを使用: + +```ts +const agent = new http.Agent({ // または https.Agent + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, +}) +const client = createClient({ + http_agent: agent, +}) +``` + +基本的なTLSとCA証明書を使用したカスタムHTTPSエージェント: + +```ts +const agent = new https.Agent({ + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, + ca: fs.readFileSync('./ca.crt'), +}) +const client = createClient({ + url: 'https://myserver:8443', + http_agent: agent, + // カスタムHTTPSエージェントを使用する場合、クライアントはデフォルトのHTTPS接続実装を使用しません。ヘッダーは手動で提供する必要があります + http_headers: { + 'X-ClickHouse-User': 'username', + 'X-ClickHouse-Key': 'password', + }, + // 重要:認可ヘッダーがTLSヘッダーと衝突します。これを無効にします。 + set_basic_auth_header: false, +}) +``` + +相互TLSを使用したカスタムHTTPSエージェント: + +```ts +const agent = new https.Agent({ + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, + ca: fs.readFileSync('./ca.crt'), + cert: fs.readFileSync('./client.crt'), + key: fs.readFileSync('./client.key'), +}) +const client = createClient({ + url: 'https://myserver:8443', + http_agent: agent, + // カスタムHTTPSエージェントを使用する場合、クライアントはデフォルトのHTTPS接続実装を使用しません。ヘッダーは手動で提供する必要があります + http_headers: { + 'X-ClickHouse-User': 'username', + 'X-ClickHouse-Key': 'password', + 'X-ClickHouse-SSL-Certificate-Auth': 'on', + }, + // 重要:認可ヘッダーがTLSヘッダーと衝突します。これを無効にします。 + set_basic_auth_header: false, +}) +``` + +証明書およびカスタムHTTPSエージェントを使用する場合、TLSヘッダーと衝突するため、`set_basic_auth_header`設定(バージョン1.2.0で導入)を使用してデフォルトの認証ヘッダーを無効にする必要がある可能性があります。すべてのTLSヘッダーは手動で提供する必要があります。 + +## 既知の制限事項(Node.js/ウェブ) + +- 結果セットのデータマッパーがなく、言語のプリミティブのみが使用されます。特定のデータタイプマッパーは[RowBinary形式サポート](https://github.com/ClickHouse/clickhouse-js/issues/216)が予定されています。 +- [Decimal*とDate\* / DateTime\*データ型の制限事項](./js.md#datedate32-types-caveats)があります。 +- JSON*ファミリ形式を使用する場合、Int32より大きな数値は文字列として表示されます。これは、Int64+型の最大値が`Number.MAX_SAFE_INTEGER`よりも大きいためです。[Integral types](./js.md#integral-types-int64-int128-int256-uint64-uint128-uint256)セクションを参照してください。 + +## 既知の制限事項(ウェブ) + +- セレクトクエリのストリーミングは動作しますが、インサートでは無効になっています(型レベルでも)。 +- リクエスト圧縮は無効化され、設定は無視されます。レスポンス圧縮は機能します。 +- ロギングサポートはまだありません。 + +## パフォーマンス最適化のためのヒント + +- アプリケーションのメモリ消費を削減するために、(ファイルからの)大規模なインサートやセレクトでストリームを使用することを検討してください。イベントリスナーや同様のユースケースでは、[非同期インサート](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)が良い選択肢になる可能性があります。これにより、クライアント側でのバッチ処理を最小化、または完全に回避できます。非同期インサートの例は、[クライアントリポジトリ](https://github.com/ClickHouse/clickhouse-js/tree/main/examples)のファイル名プレフィックス`async_insert_`で提供されています。 +- クライアントはデフォルトでリクエストやレスポンスの圧縮を有効にしません。しかし、大規模なデータセットを選択または挿入する場合、`ClickHouseClientConfigOptions.compression`で圧縮を有効にすることができます(`request`または`response`のどちらか、または両方で)。 +- 圧縮は重要なパフォーマンスのペナルティを伴います。`request`または`response`に対して有効にすると、それぞれ選択または挿入の速度に悪影響を及ぼしますが、アプリケーションによって転送されるネットワークトラフィックの量は減少します。 + +## ご相談・お問い合わせ + +質問やサポートが必要な場合は、[Community Slack](https://clickhouse.com/slack)(`#clickhouse-js`チャンネル)または[GitHub issues](https://github.com/ClickHouse/clickhouse-js/issues)を通じてお気軽にご連絡ください。 diff --git a/docs/ja/integrations/language-clients/python/index.md b/docs/ja/integrations/language-clients/python/index.md new file mode 100644 index 00000000000..c706353b989 --- /dev/null +++ b/docs/ja/integrations/language-clients/python/index.md @@ -0,0 +1,926 @@ +--- +sidebar_label: Python +sidebar_position: 10 +keywords: [clickhouse, python, client, connect, integrate] +slug: /ja/integrations/python +description: ClickHouseにPythonを接続するためのClickHouse Connectプロジェクトスイート +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse Connectを使用したPythonの統合 + +## イントロダクション + +ClickHouse Connectは、非常に多くのPythonアプリケーションとの相互運用性を提供するコアデータベースドライバです。 + +- 主なインターフェイスはパッケージ`clickhouse_connect.driver`内の`Client`オブジェクトです。このコアパッケージには、ClickHouseサーバーとの通信や挿入と選択クエリの高度な管理のための"コンテクスト"実装に使用されるさまざまなヘルパークラスとユーティリティ関数も含まれています。 +- `clickhouse_connect.datatypes`パッケージは、エクスペリメンタルでないすべてのClickHouseデータタイプの基本実装とサブクラスを提供します。その主な機能は、ClickHouseとクライアントアプリケーション間で最も効率的な転送を達成するために使用されるClickHouseの"ネイティブ"バイナリ列形式へのデータのシリアライズとデシリアライズです。 +- `clickhouse_connect.cdriver`パッケージ内のCython/Cクラスは、最も一般的なシリアル化とデシリアル化のいくつかを最適化し、純粋なPythonのパフォーマンスを大幅に向上させます。 +- パッケージ`clickhouse_connect.cc_sqlalchemy`には、[SQLAlchemy](https://www.sqlalchemy.org/)方言が限られています。この制限された実装は、クエリ/カーソル機能に焦点を当て、通常SQLAlchemy DDLおよびORM操作はサポートしません(SQLAlchemyはOLTPデータベース向けであり、ClickHouse OLAP指向のデータベースを管理するためにより専門的なツールやフレームワークをお勧めします)。 +- コアドライバおよびClickHouse Connect SQLAlchemy実装は、ClickHouseをApache Supersetに接続するための推奨方法です。`ClickHouse Connect`データベース接続または`clickhousedb` SQLAlchemy方言接続文字列を使用してください。 + +このドキュメントは、ベータリリース0.8.2の時点で有効です。 + +:::note +公式のClickHouse Connect Pythonドライバは、ClickHouseサーバーとの通信にHTTPプロトコルを使用します。 +これは、柔軟性の向上、HTTPバランサのサポート、JDBCベースのツールとの互換性の向上などの利点がありますが、圧縮率やパフォーマンスのやや低下、ネイティブTCPベースのプロトコルの一部の複雑な機能のサポートの欠如などのデメリットもあります。 +一部のユースケースでは、ネイティブTCPベースのプロトコルを使用する[コミュニティPythonドライバ](/docs/ja/interfaces/third-party/client-libraries.md)の使用を検討することもできます。 +::: + +### 要件と互換性 + +| Python | | Platform¹ | | ClickHouse | | SQLAlchemy² | | Apache Superset | | +|----------:|:--|----------------:|:--|-----------:|:---|------------:|:--|----------------:|:--| +| 2.x, <3.8 | ❌ | Linux (x86) | ✅ | <24.3³ | 🟡 | <1.3 | ❌ | <1.4 | ❌ | +| 3.8.x | ✅ | Linux (Aarch64) | ✅ | 24.3.x | ✅ | 1.3.x | ✅ | 1.4.x | ✅ | +| 3.9.x | ✅ | macOS (x86) | ✅ | 24.4-24.6³ | 🟡 | 1.4.x | ✅ | 1.5.x | ✅ | +| 3.10.x | ✅ | macOS (ARM) | ✅ | 24.7.x | ✅ | >=2.x | ❌ | 2.0.x | ✅ | +| 3.11.x | ✅ | Windows | ✅ | 24.8.x | ✅ | | | 2.1.x | ✅ | +| 3.12.x | ✅ | | | 24.9.x | ✅ | | | 3.0.x | ✅ | + +¹ClickHouse Connectは、リストされたプラットフォームに対して明示的にテストされています。さらに、未テストのバイナリホイール(Cの最適化を含む)は、優れた[cibuildwheel](https://cibuildwheel.readthedocs.io/en/stable/)プロジェクトがサポートするすべてのアーキテクチャ用にビルドされます。 +最後に、ClickHouse Connectは純粋なPythonとしても実行できるため、ソースインストールは最近のPythonインストールで動作するはずです。 + +²再度、SQLAlchemyサポートは主にクエリ機能に制限されています。SQLAlchemy API全体はサポートされていません。 + +³ClickHouse Connectは、現在サポートされているすべてのClickHouseバージョンに対してテストされています。HTTPプロトコルを使用しているため、他のバージョンのClickHouseでも正しく動作するはずですが、一部の高度なデータ型との非互換性が存在する可能性があります。 + +### インストール + +PyPIからpipを通じてClickHouse Connectをインストールします: + +`pip install clickhouse-connect` + +ClickHouse Connectをソースからインストールすることもできます: +* `git clone`で[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-connect)をクローンします。 +* (オプション)`pip install cython`を実行してC/Cythonの最適化をビルドおよび有効化 +* プロジェクトのルートディレクトリに移動して`pip install .`を実行 + +### サポートポリシー + +ClickHouse Connectは現在ベータですので、現在のベータリリースのみが積極的にサポートされています。問題を報告する前に最新バージョンに更新してください。問題は[GitHubプロジェクト](https://github.com/ClickHouse/clickhouse-connect/issues)に報告してください。ClickHouse Connectの将来のリリースは、リリース時点でアクティブにサポートされているClickHouseバージョンと互換性を持つことが保証されています(一般に、最新の`stable` 3つと`lts`の最近の2つのリリース)。 + +### 基本的な使用法 + +### 接続の詳細を集める + + + +#### 接続を確立する + +ClickHouseに接続するための2つの例を示します: +- ローカルホストのClickHouseサーバーに接続する。 +- ClickHouse Cloudサービスに接続する。 + +##### ローカルホストのClickHouseサーバーに接続するためにClickHouse Connectクライアントインスタンスを使用: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='localhost', username='default', password='password') +``` + +##### ClickHouse Cloudサービスに接続するためにClickHouse Connectクライアントインスタンスを使用: + +:::tip +接続の詳細を前もって集めてください。ClickHouse CloudサービスはTLSを必要とするため、ポート8443を使用します。 +::: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='HOSTNAME.clickhouse.cloud', port=8443, username='default', password='your password') +``` + +#### データベースと対話する + +ClickHouse SQLコマンドを実行するには、クライアントの`command`メソッドを使用します: + +```python +client.command('CREATE TABLE new_table (key UInt32, value String, metric Float64) ENGINE MergeTree ORDER BY key') +``` + +バッチデータを挿入するには、クライアントの`insert`メソッドを使用し、行と値の2次元配列を指定します: + +```python +row1 = [1000, 'String Value 1000', 5.233] +row2 = [2000, 'String Value 2000', -107.04] +data = [row1, row2] +client.insert('new_table', data, column_names=['key', 'value', 'metric']) +``` + +ClickHouse SQLを使用してデータを取得するには、クライアントの`query`メソッドを使用します: + +```python +result = client.query('SELECT max(key), avg(metric) FROM new_table') +result.result_rows +Out[13]: [(2000, -50.9035)] +``` + +## ClickHouse Connect ドライバAPI + +***注:*** ほとんどのAPIメソッドには多くの引数があり、その多くはオプションであるため、キーワード引数を渡すことをお勧めします。 + +*ここに文書化されていないメソッドはAPIの一部と見なされず、削除または変更される可能性があります。* + +### クライアントの初期化 + +`clickhouse_connect.driver.client`クラスは、PythonアプリケーションとClickHouseデータベースサーバー間の主要なインターフェイスを提供します。`clickhouse_connect.get_client`関数を使用してClientインスタンスを取得します。この関数は以下の引数を受け取ります: + +#### 接続引数 + +| パラメータ | タイプ | デフォルト | 説明 | +|-----------------------|-------------|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| interface | str | http | httpまたはhttpsである必要があります。 | +| host | str | localhost | ClickHouseサーバーのホスト名またはIPアドレス。設定しない場合、`localhost`が使用されます。 | +| port | int | 8123または8443 | ClickHouse HTTPまたはHTTPSポート。設定しない場合はデフォルトで8123、*secure*=*True*または*interface*=*https*が指定されている場合は8443が使用されます。 | +| username | str | default | ClickHouseのユーザー名。設定しない場合は、`default` ClickHouseユーザーが使用されます。 | +| password | str | *<空の文字列>* | *username*のパスワード。 | +| database | str | *None* | 接続のデフォルトデータベース。設定しない場合、ClickHouse Connectは*username*のデフォルトデータベースを使用します。 | +| secure | bool | False | https/TLSを使用します。これは、インターフェイスまたはポート引数から派生した値を上書きします。 | +| dsn | str | *None* | 標準DSN(データソース名)形式の文字列。この文字列から、設定されていない他の接続値(ホストやユーザーなど)が抽出されます。 | +| compress | bool or str | True | ClickHouse HTTPの挿入とクエリ結果の圧縮を有効にする。 [追加オプション(圧縮)](#compression) を参照 | +| query_limit | int | 0(無制限) | `query`応答の行数の最大数。0に設定すると無制限の行が返されます。大きなクエリ制限は、結果がストリーミングされないときに一度にすべての結果がメモリにロードされるため、メモリ不足の例外を引き起こす可能性があります。 | +| query_retries | int | 2 | `query`リクエストの最大リトライ回数。リトライ可能なHTTPレスポンスのみがリトライされます。`command`または`insert`リクエストは、意図しない重複リクエストを防ぐため、ドライバによって自動的にリトライされません。 | +| connect_timeout | int | 10 | HTTP接続タイムアウト(秒)。 | +| send_receive_timeout | int | 300 | HTTP接続の送受信タイムアウト(秒)。 | +| client_name | str | *None* | HTTPのUser Agentヘッダーに先行するclient_nameあります。ClickHouseのsystem.query_logでクライアントクエリを追跡するためにこれを設定します。 | +| pool_mgr | obj | *<デフォルトのPoolManager>* | `urllib3`ライブラリのPoolManagerを使用します。異なるホストへの複数の接続プールを必要とする高度な使い方が必要な場合に使用します。 | +| http_proxy | str | *None* | HTTPプロキシアドレス(HTTP_PROXY環境変数を設定するのと同様)。 | +| https_proxy | str | *None* | HTTPSプロキシアドレス(HTTPS_PROXY環境変数を設定するのと同様)。 | +| apply_server_timezone | bool | True | タイムゾーン対応のクエリ結果にサーバーのタイムゾーンを使用します。 [Timezone Precedence](#time-zones) を参照 | + +#### HTTPS/TLS 引数 + +| パラメータ | タイプ | デフォルト | 説明 | +|------------------|------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| verify | bool | True | HTTPS/TLSを使用する場合、ClickHouseサーバーTLS/SSL証明書(ホスト名、有効期限など)を検証します。 | +| ca_cert | str | *None* | *verify*=*True*の場合、ClickHouseサーバー証明書を検証するための認証局ルートのファイルパス(.pem形式)。verifyがFalseの場合は無視されます。ClickHouseサーバー証明書がグローバルに信頼されているルートである場合、認証が不要です。 | +| client_cert | str | *None* | TLSクライアント証明書のファイルパス(.pem形式)。(双方向TLS認証用)。ファイルには中間証明書を含む完全な証明書チェーンが含まれている必要があります。 | +| client_cert_key | str | *None* | クライアント証明書の秘密鍵のファイルパス。秘密鍵がクライアント証明書ファイルに含まれていない場合に必要です。 | +| server_host_name | str | *None* | プロキシまたは異なるホスト名のトンネルを介して接続する際にSSLエラーを回避するために設定するTLS証明書のCNまたはSNIとして識別されるClickHouseサーバーのホスト名 | +| tls_mode | str | *None* | 高度なTLS 動作を制御します。`proxy` および `strict` は ClickHouse の双方向 TLS 接続を呼び出しませんが、クライアント証明書とキーを送信します。 `mutual` はクライアント証明書による ClickHouse 双方向TLS認証を想定しています。*None*/デフォルトの動作は `mutual` です。 | + +#### 設定引数 + +最後に、`get_client`の`settings`引数は、クライアントリクエストごとにサーバーに追加のClickHouse設定を渡すために使用されます。ほとんどのクエリで*readonly*=*1*アクセスを持つユーザーは設定を変更できないので注意してください。そのため、ClickHouse Connectはそのような設定を最終リクエストでドロップし、警告をログに記録します。以下の設定は、ClickHouse Connectによって使用されるHTTPクエリ/セッションにのみ適用され、一般的なClickHouse設定としては文書化されていません。 + +| 設定 | 説明 | +|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| buffer_size | ClickHouseサーバーがHTTPチャネルに書き込む前に使用するバッファサイズ(バイト単位)。 | +| session_id | サーバー上の関連クエリを関連付けるための一意のセッションID。仮のテーブルに必要。 | +| compress | ClickHouseサーバーがPOST応答データを圧縮する必要があるかどうか。この設定は、"raw"クエリにのみ使用する必要があります。 | +| decompress | ClickHouseサーバーに送信されたデータを解凍する必要があるかどうか。この設定は、"raw"挿入にのみ使用する必要があります。 | +| quota_key | このリクエストに関連付けられたクォータキー。ClickHouseサーバーのドキュメント内のクォータを参照してください。 | +| session_check | セッションステータスをチェックするために使用されます。 | +| session_timeout | セッションIDで識別されるセッションがタイムアウトし、有効でなくなったとみなされるまでの非アクティブ状態の秒数。デフォルトは60秒です。 | +| wait_end_of_query | ClickHouseサーバーで応答全体をバッファリングします。この設定は、サマリー情報を返すために必要で、ストリーミングされないクエリで自動的に設定されます。 | + +クエリとともに送信できる他のClickHouse設定については、[ClickHouseのドキュメント](/docs/ja/operations/settings/settings.md)を参照してください。 + +#### クライアント作成例 + +- すべてのパラメータを指定しない場合、ClickHouse Connect クライアントは、デフォルトのHTTPポートで`localhost`にデフォルトのユーザーで接続します: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client() +client.server_version +Out[2]: '22.10.1.98' +``` + +- セキュアな(https)外部ClickHouseサーバーへの接続 + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='play.clickhouse.com', secure=True, port=443, user='play', password='clickhouse') +client.command('SELECT timezone()') +Out[2]: 'Etc/UTC' +``` + +- セッションIDやその他のカスタム接続パラメータ、ClickHouse設定を使用した接続。 + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='play.clickhouse.com', + user='play', + password='clickhouse', + port=443, + session_id='example_session_1', + connect_timeout=15, + database='github', + settings={'distributed_ddl_task_timeout':300}) +client.database +Out[2]: 'github' +``` + +### 共通メソッド引数 + +いくつかのクライアントメソッドは、共通の`parameters`および`settings`引数を使用します。これらのキーワード引数は以下のように説明されています。 + +#### パラメータ引数 + +ClickHouse Connect Clientの`query*`および`command`メソッドは、ClickHouse値式にPython表現をバインドするために使用されるオプションの`parameters`キーワード引数を受け取ります。二つのバインド方法があります。 + +##### サーバーサイドバインディング + +ClickHouseはほとんどのクエリ値に対して[サーバーサイドバインディング](/docs/ja/interfaces/cli.md#cli-queries-with-parameters)をサポートしており、バインドされた値はクエリとは別にHTTPクエリパラメータとして送信されます。ClickHouse Connectは、バインド式が{<name>:<datatype>}の形式であることを検出した場合、適切なクエリパラメータを追加します。サーバーサイドバインディングの場合、`parameters`引数はPythonのDictionaryであるべきです。 + +- PythonDictionaryを使用したサーバーサイドバインディング、DateTime値、および文字列値 + +```python +import datetime + +my_date = datetime.datetime(2022, 10, 1, 15, 20, 5) + +parameters = {'table': 'my_table', 'v1': my_date, 'v2': "a string with a single quote'"} +client.query('SELECT * FROM {table:Identifier} WHERE date >= {v1:DateTime} AND string ILIKE {v2:String}', parameters=parameters) + +# サーバーで生成されるクエリは次のとおりです。 +# SELECT * FROM my_table WHERE date >= '2022-10-01 15:20:05' AND string ILIKE 'a string with a single quote\'' +``` + +**重要** -- サーバーサイドバインディングは、ClickHouseサーバーによって`SELECT`クエリのみにサポートされています。他のクエリタイプ(`ALTER`、`DELETE`、`INSERT`など)には対応していません。この点は将来的に変更される可能性があります:https://github.com/ClickHouse/ClickHouse/issues/42092 を参照。 + +##### クライアントサイドバインディング + +ClickHouse Connectはクライアントサイドのパラメータバインディングもサポートしており、テンプレート化されたSQLクエリを生成する際の柔軟性を向上させます。クライアントサイドバインディングの場合、`parameters`引数はDictionaryまたはシーケンスであるべきです。クライアントサイドバインディングは、Pythonの[「printf」スタイル](https://docs.python.org/3/library/stdtypes.html#old-string-formatting)文字列フォーマットを使用してパラメータを置換します。 + +サーバーサイドバインディングとは異なり、データベース識別子(データベース、テーブル、カラム名など)にはクライアントサイドバインディングが機能しないため注意が必要です。Pythonスタイルのフォーマットは異なるタイプの文字列を区別できないため、これらは異なる方法でフォーマットする必要があります(データベース識別子には逆アクセントまたはダブルクォート、データ値にはシングルクォートが使用されます)。 + +- PythonDictionary、DateTime値、文字列エスケープを用いた例 + +```python +import datetime + +my_date = datetime.datetime(2022, 10, 1, 15, 20, 5) + +parameters = {'v1': my_date, 'v2': "a string with a single quote'"} +client.query('SELECT * FROM some_table WHERE date >= %(v1)s AND string ILIKE %(v2)s', parameters=parameters) + +# 以下のクエリを生成: +# SELECT * FROM some_table WHERE date >= '2022-10-01 15:20:05' AND string ILIKE 'a string with a single quote\'' +``` + +- Pythonシーケンス(タプル)、Float64、およびIPv4Addressを用いた例 + +```python +import ipaddress + +parameters = (35200.44, ipaddress.IPv4Address(0x443d04fe)) +client.query('SELECT * FROM some_table WHERE metric >= %s AND ip_address = %s', parameters=parameters) + +# 以下のクエリを生成: +# SELECT * FROM some_table WHERE metric >= 35200.44 AND ip_address = '68.61.4.254'' +``` + +:::note +DateTime64引数(サブ秒精度を含むClickHouseタイプ)をバインドするには、次のいずれかのカスタムアプローチが必要です: +- Pythonの`datetime.datetime`値を新しいDT64Paramクラスでラップします。例 + ```python + query = 'SELECT {p1:DateTime64(3)}' # Dictionaryを使ったサーバーサイドバインディング + parameters={'p1': DT64Param(dt_value)} + + query = 'SELECT %s as string, toDateTime64(%s,6) as dateTime' # リストを使ったクライアントサイドバインディング + parameters=['a string', DT64Param(datetime.now())] + ``` + - パラメータ値のDictionaryを使う場合、パラメータ名に文字列 `_64` を付加します + ```python + query = 'SELECT {p1:DateTime64(3)}, {a1:Array(DateTime(3))}' # Dictionaryを使ったサーバーサイドバインディング + + parameters={'p1_64': dt_value, 'a1_64': [dt_value1, dt_value2]} + ``` +::: + +#### 設定引数 + +すべての主要なClickHouse Connectクライアントの「挿入」と「選択」メソッドは、渡されたSQL文に対するClickHouseサーバーの[ユーザー設定](/docs/ja/operations/settings/settings.md)を渡すためのオプションの`settings`キーワード引数を受け取ります。`settings`引数はDictionaryであるべきです。各アイテムは、ClickHouse設定名とその関連する値であるべきです。設定がサーバーにクエリパラメータとして送信される際に、値は文字列に変換されます。 + +クライアントレベル設定と同様に、ClickHouse Connectは、サーバーによって*readonly*=*1*とマークされた設定をドロップし、関連するログメッセージを出力します。HTTPインターフェースを介したクエリにのみ適用される設定は常に有効です。それらの設定については`get_client` [API](#settings-argument)を参照してください。 + +ClickHouse設定を使用した例: + +```python +settings = {'merge_tree_min_rows_for_concurrent_read': 65535, + 'session_id': 'session_1234', + 'use_skip_indexes': False} +client.query("SELECT event_type, sum(timeout) FROM event_errors WHERE event_time > '2022-08-01'", settings=settings) +``` + +### クライアント_command_ メソッド + +`Client.command`メソッドを使用して、通常データを返さないまたは単一のプリミティブまたは配列値を返すSQLクエリをClickHouseサーバーに送信します。このメソッドは以下のパラメータを取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|---------------|------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| +| cmd | str | *必須* | 単一の値または単一行の値を返すClickHouse SQLステートメント。 | | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| data | strまたはbytes | *None* | コマンドとともにPOST本文として含めるオプションのデータ。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| use_database | bool | True | クライアントデータベース(クライアントを作成する際に指定された)を使用します。Falseの場合、コマンドは接続されたユーザーのデフォルトClickHouseサーバーデータベースを使用します。 | +| external_data | ExternalData | *None* | クエリで使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。 | + +- _command_は、DDLステートメントに使用できます。SQL "コマンド"がデータを返さない場合、ClickHouse X-ClickHouse-SummaryおよびX-ClickHouse-Query-Idヘッダーのキー/値ペア`written_rows`、`written_bytes`、および`query_id`を含む"クエリサマリー"Dictionaryが代わりに返されます。 + +```python +client.command('CREATE TABLE test_command (col_1 String, col_2 DateTime) Engine MergeTree ORDER BY tuple()') +client.command('SHOW CREATE TABLE test_command') +Out[6]: 'CREATE TABLE default.test_command\\n(\\n `col_1` String,\\n `col_2` DateTime\\n)\\nENGINE = MergeTree\\nORDER BY tuple()\\nSETTINGS index_granularity = 8192' +``` + +- _command_は、単一行のみを返す単純なクエリにも使用できます。 + +```python +result = client.command('SELECT count() FROM system.tables') +result +Out[7]: 110 +``` + +### クライアント_query_ メソッド + +`Client.query`メソッドは、ClickHouseサーバーから単一の"バッチ"データセットを取得するための主要な方法です。 +これは、ClickHouseのネイティブ形式をHTTP経由で使用して、大規模なデータセット(最大約100万行)を効率的に転送します。このメソッドは以下のパラメータを取ります。 + +| パラメータ | タイプ | デフォルト | 説明 | +|-----------------------|------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| query | str | *必須* | ClickHouse SQLのSELECTまたはDESCRIBEクエリ。 | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| query_formats | dict | *None* | 結果値のデータ型フォーマット指定。Advanced Usage (Read Formats)を参照。 | +| column_formats | dict | *None* | カラムごとのデータ型フォーマット。Advanced Usage (Read Formats)を参照。 | +| encoding | str | *None* | ClickHouse StringカラムをPython文字列にエンコードするためのエンコーディング。Pythonは設定していない場合、`UTF-8`を使用します。 | +| use_none | bool | True | ClickHouseのNULLに対してPythonの*None*タイプを使用します。Falseの場合、ClickHouseのNULLに対してデータ型のデフォルト(たとえば0)を使用します。注:パフォーマンス上の理由からnumpy/PandasではデフォルトはFalseです。 | +| column_oriented | bool | False | 結果を列のシーケンスとして返します。Pythonデータを他の列指向データ形式に変換する際に便利です。 | +| query_tz | str | *None* | zoneinfoデータベースからのタイムゾーン名。このタイムゾーンはクエリによって返されるすべてのdatetimeまたはPandas Timestampオブジェクトに適用されます。 | +| column_tzs | dict | *None* | カラム名とタイムゾーン名のDictionary。`query_tz`に似ていますが、異なるカラムに異なるタイムゾーンを指定できます。 | +| use_extended_dtypes | bool | True | Pandasの拡張データ型(StringArrayなど)およびClickHouseのNULL値に対するpandas.NAおよびpandas.NaTを使用します。主に`query_df`および`query_df_stream`メソッドに適用されます。 | +| external_data | ExternalData | *None* | クエリに使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。 | +| context | QueryContext | *None* | 上記のメソッド引数をカプセル化する再利用可能なQueryContextオブジェクトを使用できます。 [Advanced Queries (QueryContexts)](#querycontexts)を参照してください。 | + +#### QueryResult オブジェクト + +基本的な`query`メソッドは、以下の公開プロパティを持つQueryResultオブジェクトを返します: + +- `result_rows` -- シーケンスとしてデータを返します。各行要素が列値のシーケンスである行のシーケンス。 +- `result_columns` -- シーケンスとしてデータを返します。各列要素がそのカラムに対する行値のシーケンスである列のシーケンス。 +- `column_names` -- `result_set`内の列名を表す文字列のタプル +- `column_types` -- `result_columns`内の各列に対するClickHouseデータ型を表すClickHouseTypeインスタンスのタプル +- `query_id` -- ClickHouseのquery_id(`system.query_log`テーブルでのクエリ表示に便利です) +- `summary` -- `X-ClickHouse-Summary` HTTPレスポンスヘッダーによって返されたデータ +- `first_item` -- 応答の最初の行をDictionaryとして取得するための便利なプロパティ(キーはカラム名です) +- `first_row` -- 結果の最初の行を返すための便利なプロパティ +- `column_block_stream` -- 列指向フォーマットでクエリ結果を返すジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `row_block_stream` -- 行指向フォーマットでクエリ結果を返すジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `rows_stream` -- クエリ結果を1回の呼び出しで1行ずつ生成するジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `summary` -- `command`メソッドで説明されている通り、ClickHouseから返されるサマリー情報のDictionary + +`*_stream`プロパティは、返されたデータのイテレータとして使用できるPython Contextを返します。それらはクライアント`*_stream`メソッドを使用して間接的にのみアクセスする必要があります。 + +ストリーミングクエリ結果(StreamContextオブジェクトを使用)を完全に理解するには、[Advanced Queries (Streaming Queries)](#streaming-queries)を参照してください。 + +### Numpy、Pandas、またはArrowを使用したクエリ結果の消費 + +主要な`query`メソッドの派生バージョンが3つあります: + +- `query_np` -- このバージョンは、ClickHouse Connect QueryResultの代わりにNumpy配列を返します。 +- `query_df` -- このバージョンは、ClickHouse Connect QueryResultの代わりにPandasデータフレームを返します。 +- `query_arrow` -- このバージョンはPyArrowのテーブルを返します。ClickHouseの`Arrow`フォーマットを直接使用し、主要な`query`メソッドと共通の3つの引数のみを受け取ります:`query`、`parameters`、および`settings`。また、`use_strings`という追加の引数があり、ArrowテーブルがClickHouseの文字列型を文字列(Trueの場合)またはバイト(Falseの場合)として表現するかどうかを決定します。 + +### クライアントストリーミングクエリメソッド + +ClickHouse Connect クライアントはストリームとしてデータを取得する(Pythonのジェネレータとして実装された)ための複数のメソッドを提供します: + +- `query_column_block_stream` -- ネイティブPythonオブジェクトを使用して、列のシーケンスとしてクエリデータをブロックで返します。 +- `query_row_block_stream` -- ネイティブPythonオブジェクトを使用して、行のブロックとしてクエリデータを返します。 +- `query_rows_stream` -- ネイティブPythonオブジェクトを使用して、行のシーケンスとしてクエリデータを返します。 +- `query_np_stream` -- 各ClickHouseクエリデータブロックをNumpy配列として返します。 +- `query_df_stream` -- 各ClickHouseブロックのクエリデータをPandasデータフレームとして返します。 +- `query_arrow_stream` -- PyArrow RecordBlocksとしてクエリデータを返します。 + +これらのメソッドの各々は、消費を開始するために`with`ステートメントを通して開く必要がある`ContextStream`オブジェクトを返します。詳細と例は[Advanced Queries (Streaming Queries)](#streaming-queries)を参照してください。 + +### クライアント_insert_ メソッド + +ClickHouseに複数のレコードを挿入する一般的なユースケースのために、`Client.insert`メソッドがあります。このメソッドは以下のパラメータを受け取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|-------------------|-----------------------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| table | str | *必須* | 挿入するClickHouseテーブル。データベースを含む完全なテーブル名が許可されます。 | +| data | シーケンスのシーケンス | *必須* | データを挿入する行のシーケンスまたは列のシーケンス。各行は列値のシーケンス、または列は行値のシーケンスで構成されます。 | +| column_names | strまたはstrのシーケンス | '*' | データマトリックスの列名のリスト。'*'が使用されている場合、ClickHouse Connectはすべての列名をテーブルから取得するための"pre-query"を実行します。 | +| database | str | '' | 挿入先のデータベース。指定されていない場合、クライアントのデータベースが使用されます。 | +| column_types | ClickHouseTypeのシーケンス | *None* | ClickHouseTypeインスタンスのリスト。column_typesまたはcolumn_type_namesのどちらも指定されていない場合、ClickHouse Connectはテーブルのすべての列型を取得するための"pre-query"を実行します。 | +| column_type_names | ClickHouse型名のシーケンス | *None* | ClickHouseデータタイプ名のリスト。column_typesまたはcolumn_type_namesのどちらも指定されていない場合、ClickHouse Connectはテーブルのすべての列型を取得するための"pre-query"を実行します。 | +| column_oriented | bool | False | Trueの場合、`data`引数は列のシーケンスとして仮定され(折り返しは必要ない)、そうでない場合は`data`は行のシーケンスとして解釈されます。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| insert_context | InsertContext | *None* | 上記のメソッド引数をカプセル化する再利用可能なInsertContextオブジェクト。 [Advanced Inserts (InsertContexts)](#insertcontexts)を参照してください。 | + +このメソッドは"クエリサマリー"Dictionaryを返します。"command"メソッドで説明された通りです。挿入が何らかの理由で失敗した場合、例外が発生します。 + +主要な`insert`メソッドの派生バージョンが2つあります: + +- `insert_df` -- Pythonのシーケンスの代わりに、このメソッドの2番目のパラメータは`df`引数を要求し、それはPandas Dataframeインスタンスである必要があります。ClickHouse Connectは、Dataframeを列指向のデータソースとして自動的に処理するため、`column_oriented`パラメータは不要です。 +- `insert_arrow` -- Pythonのシーケンスの代わりに、このメソッドは`arrow_table`を要求します。ClickHouse ConnectはArrowテーブルを未変更のままClickHouseサーバーに渡し、`table`と`arrow_table`の他に`database`および`settings`引数のみが利用可能です。 + +*注意:* Numpy 配列は有効なシーケンスのシーケンスであり、主要な`insert`メソッドの`data`引数として使用できます。そのため、特化されたメソッドは不要です。 + +### ファイル挿入 + +`clickhouse_connect.driver.tools`には、既存のClickHouseテーブルに直接ファイルシステムからデータを挿入するための`insert_file`メソッドが含まれています。解析はClickHouseサーバーに委ねられます。`insert_file`は次のパラメータを受け取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|--------------|-----------------|-------------------|------------------------------------------------------------------------------------------------------------------------| +| client | Client | *必須* | 挿入を行う`driver.Client ` | +| table | str | *必須* | 挿入するClickHouseテーブル。データベースを含む完全なテーブル名が許可されます。 | +| file_path | str | *必須* | データファイルのネイティブなファイルパス | +| fmt | str | CSV, CSVWithNames | ファイルのClickHouse入力フォーマット。 `column_names`が提供されていない場合はCSVWithNamesが想定されます。 | +| column_names | strのシーケンス | *None* | データファイル内の列名リスト。列名を含むフォーマットには必須ではありません。 | +| database | str | *None* | テーブルのデータベース。 テーブルが完全に資格化されている場合は無視されます。指定されていない場合、挿入はクライアントデータベースを使用します。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| compression | str | *None* | Content-Encoding HTTPヘッダーに使用される、認識されたClickHouse圧縮タイプ(zstd, lz4, gzip) | + +データが不整合であるか、日付/時刻の形式が異常な形式であるファイルの場合、設定(`input_format_allow_errors_num`または`input_format_allow_errors_ratio`など)はこのメソッドで認識されます。 + +```python +import clickhouse_connect +from clickhouse_connect.driver.tools import insert_file + +client = clickhouse_connect.get_client() +insert_file(client, 'example_table', 'my_data.csv', + settings={'input_format_allow_errors_ratio': .2, + 'input_format_allow_errors_num': 5}) +``` + +### クエリ結果のファイルとして保存する + +ClickHouseからローカルファイルシステムに直接ファイルをストリーミングすることができます。このために`raw_stream`メソッドを使用します。例として、クエリ結果をCSVファイルに保存したい場合、以下のコードスニペットを使用できます: + +```python +import clickhouse_connect + +if __name__ == '__main__': + client = clickhouse_connect.get_client() + query = 'SELECT number, toString(number) AS number_as_str FROM system.numbers LIMIT 5' + fmt = 'CSVWithNames' # または、CSV, CSVWithNamesAndTypes, TabSeparated, etc. + stream = client.raw_stream(query=query, fmt=fmt) + with open("output.csv", "wb") as f: + for chunk in stream: + f.write(chunk) +``` + +上記のコードは、以下の内容を持つ`output.csv`ファイルを生成します: + +```csv +"number","number_as_str" +0,"0" +1,"1" +2,"2" +3,"3" +4,"4" +``` + +これと同様に、[TabSeparated](https://clickhouse.com/docs/ja/interfaces/formats#tabseparated)やその他のフォーマットでデータを保存することができます。[データの入力と出力フォーマット](https://clickhouse.com/docs/ja/interfaces/formats)で利用可能なすべてのフォーマットオプションの概要を参照してください。 + +### 生のAPI + +ClickHouseデータとネイティブまたはサードパーティーデータタイプおよび構造間の変換を必要としないユースケースに対して、ClickHouse Connectクライアントは ClickHouse接続の直接使用のための2つのメソッドを提供します。 + +#### クライアント_raw_query_ メソッド + +`Client.raw_query`メソッドは、クライアント接続を使用してClickHouse HTTPクエリインターフェースを直接使用できるようにします。戻り値は未処理の`bytes`オブジェクトです。パラメータバインディング、エラー処理、リトライおよび設定管理を最小限のインターフェースで提供する便利なラッパーです: + +| パラメータ | タイプ | デフォルト | 説明 | +|---------------|------------------|------------|----------------------------------------------------------------------------------------------------------| +| query | str | *必須* | 有効なClickHouseクエリ | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| fmt | str | *None* | 結果のbytesのClickHouse出力フォーマット。 (指定されない場合、ClickHouseはTSVを使用します) | +| use_database | bool | True | クエリコンテキストのためにclickhouse-connectクライアントが割り当てたデータベースを使用 | +| external_data | ExternalData | *None* | クエリで使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。| + +結果の`bytes`オブジェクトを処理するのは呼び出し側の責任です。`Client.query_arrow`はClickHouseの`Arrow`出力フォーマットを使用して、このメソッドの薄いラッパーにすぎないことに注意してください。 + +#### クライアント_raw_stream_ メソッド + +`Client.raw_stream`メソッドは、`raw_query`メソッドと同じAPIを持ちますが、`bytes`オブジェクトのジェネレータ/ストリームソースとして使用できる`io.IOBase`オブジェクトを返します。現在では`query_arrow_stream`メソッドによって利用されています。 + +#### クライアント_raw_insert_ メソッド + +`Client.raw_insert`メソッドはクライアント接続を使用して`bytes`オブジェクトまたは`bytes`オブジェクトジェネレータの直接挿入を可能にします。挿入ペイロードを処理しないため、非常に高性能です。このメソッドは設定および挿入フォーマットの指定にオプションを提供します: + +| パラメータ | タイプ | デフォルト | 説明 | +|--------------|----------------------------------------|------------|-------------------------------------------------------------------------------------------| +| table | str | *必須* | 単一のテーブル名またはデータベース修飾されたテーブル名 | +| column_names | Sequence[str] | *None* | 挿入ブロックの列名。`fmt`から名前が含まれていない場合は必須 | +| insert_block | str, bytes, Generator[bytes], BinaryIO | *必須* | 挿入するデータ。文字列はクライアントのエンコーディングでエンコードされます。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| fmt | str | *None* | `insert_block` bytesのClickHouse入力フォーマット。(指定されない場合、ClickHouseはTSVを使用します) | + +の呼び出し側の責任は、`insert_block`が指定されたフォーマットであることと指定された圧縮方法を使用していることです。ClickHouse ConnectはファイルのアップロードやPyArrowテーブルにこれらのraw insertsを使用し、解析をClickHouseサーバーに委ねます。 + +### ユーティリティクラスと機能 + +以下のクラスと関数も"パブリック"の`clickhouse-connect` APIの一部と見なされ、上記のクラスとメソッドと同様に、マイナリリース間で安定しています。これらのクラスと関数の重大な変更は、マイナ(ではなくパッチ)リリースでのみ発生し、少なくとも1つのマイナリリースで廃止ステータスのままで使用可能です。 + +#### 例外 + +すべてのカスタム例外(DB API 2.0仕様で定義されているものを含む)は、`clickhouse_connect.driver.exceptions`モジュールに定義されています。 +ドライバが実際に検出した例外はこれらのタイプを使用します。 + +#### Clickhouse SQLユーティリティ + +`clickhouse_connect.driver.binding`モジュールの関数およびDT64Paramクラスは、ClickHouse SQLクエリを適切に構築し、エスケープするために使用できます。同様に、`clickhouse_connect.driver.parser`モジュールの関数は、ClickHouseデータ型の名前を解析するために使用できます。 + +### マルチスレッド、マルチプロセス、および非同期/イベント駆動型の使用例 + +ClickHouse Connectは、マルチスレッド、マルチプロセス、およびイベントループ駆動/非同期アプリケーションでうまく機能します。すべてのクエリおよび挿入処理は単一スレッド内で行われるため、これらの操作は一般にスレッドセーフです。 +(いくつかの操作を低レベルで並列処理することは、単一スレッドのパフォーマンスペナルティを克服するための今後の改良可能性ですが、それでもスレッドセーフは維持されます。) + +各クエリまたは挿入が、それぞれ独自のQueryContextまたはInsertContextオブジェクト内で状態を維持するため、これらのヘルパーオブジェクトはスレッドセーフではなく、複数の処理ストリーム間で共有してはなりません。 +以下のセクションでは、コンテキストオブジェクトについての追加の議論が続きます。 + +さらに、同時に複数のクエリやインサートが「飛行中」になるアプリケーションの場合、考慮すべき2つの要素があります。1つ目は、クエリ/インサートに関連するClickHouseの「セッション」であり、2つ目はClickHouse Connect Clientインスタンスによって使用されるHTTP接続プールです。 + +### AsyncClientラッパー + +バージョン0.7.16以降、ClickHouse Connectは通常の`Client`の上に非同期ラッパーを提供しており、これにより`asyncio`環境でクライアントを使用することが可能です。 + +`AsyncClient`のインスタンスを取得するには、標準の`get_client`と同じパラメータを受け取る`get_async_client`ファクトリ関数を使用できます: + +```python +import asyncio + +import clickhouse_connect + + +async def main(): + client = await clickhouse_connect.get_async_client() + result = await client.query("SELECT name FROM system.databases LIMIT 1") + print(result.result_rows) + + +asyncio.run(main()) +``` + +`AsyncClient`は、標準の`Client`と同じメソッドを同じパラメータで持っていますが、適用可能な場合はコルーチンとして動作します。内部的には、I/O操作を行う`Client`のこれらのメソッドは、[run_in_executor](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor)呼び出しでラップされています。 + +`AsyncClient`ラッパーを使用すると、I/O操作の完了を待つ間、実行スレッドとGILが解放されるため、マルチスレッドの性能が向上します。 + +注意:通常の`Client`と異なり、`AsyncClient`はデフォルトで`autogenerate_session_id`を`False`に強制します。 + +関連リンク:[run_async example](https://github.com/ClickHouse/clickhouse-connect/blob/main/examples/run_async.py). + +### ClickHouseセッションIDの管理 + +各ClickHouseクエリは、ClickHouseの「セッション」のコンテキスト内で実行されます。セッションは現在2つの目的で使用されます: +- 複数のクエリに特定のClickHouse設定を関連付けるため([ユーザー設定](/docs/ja/operations/settings/settings.md)を参照)。ClickHouseの`SET`コマンドを使用してユーザーセッションのスコープにおける設定を変更します。 +- [一時テーブル](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#temporary-tables)を追跡するため。 + +デフォルトでは、ClickHouse Connect Clientインスタンスを使用して実行される各クエリは、このセッション機能を有効にするために同じセッションIDを使用します。つまり、`SET`ステートメントと一時テーブルは、単一のClickHouseクライアントを使用する際に期待通りに機能します。しかし、設計上、ClickHouseサーバーは同じセッション内での同時クエリを許可しません。その結果、同時クエリを実行するClickHouse Connectアプリケーションには2つのオプションがあります。 + +- 実行の各スレッド(スレッド、プロセス、またはイベントハンドラ)に対して個別の`Client`インスタンスを作成し、自身のセッションIDを持たせます。これが最良のアプローチであり、各クライアントのセッション状態を保持します。 +- 各クエリにユニークなセッションIDを使用します。この方法は、一時テーブルや共有セッション設定が不要な状況で同時セッション問題を回避します。(共有設定はクライアント作成時にも提供できますが、これらは各リクエストで送信され、セッションに関連付けられません)。ユニークなsession_idは各リクエストの`settings`ディクショナリに追加するか、`autogenerate_session_id`共通設定を無効にすることができます: + +```python +from clickhouse_connect import common + +common.set_setting('autogenerate_session_id', False) # これはクライアントを作成する前に常に設定する必要があります。 +client = clickhouse_connect.get_client(host='somehost.com', user='dbuser', password=1234) +``` + +この場合、ClickHouse ConnectはセッションIDを送信せず、ClickHouseサーバーによってランダムなセッションIDが生成されます。再度、一時テーブルとセッションレベルの設定は利用できません。 + +### HTTP接続プールのカスタマイズ + +ClickHouse Connectは、`urllib3`接続プールを使用してサーバーへの基礎的なHTTP接続を処理します。デフォルトでは、すべてのクライアントインスタンスは同じ接続プールを共有しており、これはほとんどの使用例で十分です。このデフォルトプールは、アプリケーションで使用される各ClickHouseサーバーに最大8つのHTTP Keep Alive接続を維持します。 + +大規模なマルチスレッドアプリケーションでは、個別の接続プールが適切である場合があります。カスタマイズされた接続プールは、メインの`clickhouse_connect.get_client`関数への`pool_mgr`キーワード引数として提供できます: + +```python +import clickhouse_connect +from clickhouse_connect.driver import httputil + +big_pool_mgr = httputil.get_pool_manager(maxsize=16, num_pools=12) + +client1 = clickhouse_connect.get_client(pool_mgr=big_pool_mgr) +client2 = clickhouse_connect.get_client(pool_mgr=big_pool_mgr) +``` + +上記の例が示すように、クライアントはプールマネージャを共有することができ、各クライアント用に別々のプールマネージャを作成することもできます。PoolManagerを作成する際のオプションについて詳細を知りたい場合は、[urllib3 ドキュメンテーション](https://urllib3.readthedocs.io/en/stable/advanced-usage.html#customizing-pool-behavior)を参照してください。 + +## ClickHouse Connectを使ったデータのクエリ:上級利用法 + +### QueryContexts + +ClickHouse Connectは標準のクエリをQueryContext内で実行します。QueryContextには、ClickHouseデータベースに対するクエリを構築するために使用される主要な構造と、QueryResultや他の応答データ構造に結果を処理するために使用される設定が含まれています。これには、クエリそのもの、パラメータ、設定、読み取りフォーマット、その他のプロパティが含まれます。 + +QueryContextは、クライアントの`create_query_context`メソッドを使用して取得できます。このメソッドはコアクエリメソッドと同じパラメータを取ります。このクエリコンテキストは、`query`、`query_df`、または`query_np`メソッドに`context`キーワード引数として渡すことができ、これらのメソッドへの他の引数をすべてもしくは一部の代わりとして渡すことができます。メソッド呼び出しのために指定された追加の引数は、QueryContextのプロパティを上書きします。 + +最も明確なQueryContextの使用例は、異なるバインディングパラメータ値で同じクエリを送信することです。すべてのパラメータ値はディクショナリを使用して`QueryContext.set_parameters`メソッドを呼び出すことによって更新でき、`QueryContext.set_parameter`を使用して好きな`key`、`value`ペアを更新することもできます。 + +```python +client.create_query_context(query='SELECT value1, value2 FROM data_table WHERE key = {k:Int32}', + parameters={'k': 2}, + column_oriented=True) +result = client.query(context=qc) +assert result.result_set[1][0] == 'second_value2' +qc.set_parameter('k', 1) +result = test_client.query(context=qc) +assert result.result_set[1][0] == 'first_value2' +``` + +QueryContextsはスレッドセーフではないことに注意してくださいが、`QueryContext.updated_copy`メソッドを呼び出すことによってマルチスレッド環境でコピーを取得することができます。 + +### ストリーミングクエリ + +#### データブロック +ClickHouse Connectは、主要な`query`メソッドから取得するすべてのデータを、ClickHouseサーバーから受信したブロックのストリームとして処理します。これらのブロックは、ClickHouse独自の「ネイティブ」フォーマットで送受信されます。「ブロック」とは、単にバイナリデータのカラム列のシーケンスであり、各カラムは指定されたデータ型のデータ値を等しく含みます。(列指向データベースであるClickHouseは、このデータを同様の形式で保存します。)クエリから返されるブロックのサイズは、いくつかのレベル(ユーザープロファイル、ユーザー、セッション、またはクエリ)で設定できる2つのユーザー設定によって決まります。それらは次の通りです: + +- [max_block_size](/docs/ja/operations/settings/settings.md/#setting-max_block_size) -- ブロックの行数の制限。デフォルトは65536です。 +- [preferred_block_size_bytes](/docs/ja/operations/settings/settings.md/#preferred-block-size-bytes) -- ブロックのサイズのバイト数のソフト制限。デフォルトは1,000,000です。 + +`preferred_block_size_setting`に関わらず、各ブロックは`max_block_size`行を超えることはありません。クエリの種類によっては、返される実際のブロックのサイズは任意です。たとえば、多くのシャードをカバーする分散テーブルへのクエリは、各シャードから直接取得される小さなブロックを含むことがあります。 + +クライアントの`query_*_stream`メソッドの1つを使用する場合、結果はブロックごとに返されます。ClickHouse Connectは常に1つのブロックのみを読み込みます。これにより、大量のデータをメモリにすべて読み込むことなく処理することができます。アプリケーションは任意の数のブロックを処理する準備ができているはずで、各ブロックの正確なサイズは制御できません。 + +#### 遅延処理のためのHTTPデータバッファ + +HTTPプロトコルの制約により、ブロックがClickHouseサーバーがデータをストリーミングする速度よりも著しく遅い速度で処理されると、ClickHouseサーバーは接続を閉じ、処理スレッドで例外がスローされます。これをある程度緩和するためには、HTTPストリーミングバッファのバッファサイズを増やすことができます(デフォルトは10メガバイト)`http_buffer_size`設定を使用します。この状況で十分なメモリがアプリケーション利用可能であれば、大きな`http_buffer_size`値は問題ありません。バッファ内のデータは`lz4`や`zstd`圧縮を使用している場合は圧縮されて保存されるため、これらの圧縮タイプを使用すると利用可能なバッファ全体が増えます。 + +#### StreamContexts + +各`query_*_stream`メソッド(例えば`query_row_block_stream`)は、ClickHouseの`StreamContext`オブジェクトを返します。これはPythonのコンテキスト/ジェネレータを組み合わせたものです。基本的な使用法は以下の通りです: + +```python +with client.query_row_block_stream('SELECT pickup, dropoff, pickup_longitude, pickup_latitude FROM taxi_trips') as stream: + for block in stream: + for row in block: + +``` + +この例では、`StreamContext`を`with`文なしで使用しようとするとエラーが発生します。Pythonコンテキストを使用することで、すべてのデータが消費されなかった場合や、処理中に例外が発生した場合でもストリーム(この場合はストリーミングHTTPレスポンス)が適切に閉じられることが保証されます。さらに、`StreamContext`はストリームを消費するために一度だけ使用できます。`StreamContext`が終了した後に使用しようとすると、`StreamClosedError`が発生します。 + +StreamContextの`source`プロパティを使用して、親`QueryResult`オブジェクトにアクセスすることができ、そこにはカラム名やタイプが含まれています。 + +#### ストリームタイプ + +`query_column_block_stream`メソッドは、ネイティブのPythonデータタイプとして保存されたカラムデータのシーケンスとしてブロックを返します。上記の`taxi_trips`クエリを使用すると、返されるデータはリストで、リストの各要素は関連するカラムのすべてのデータを含む別のリスト(またはタプル)になります。したがって、`block[0]`は文字列だけを含むタプルとなります。列指向フォーマットは、カラム中のすべての値を集計操作する際に最も多く使用されます。 + +`query_row_block_stream`メソッドは、従来のリレーショナルデータベースのように行ごとのシーケンスとしてブロックを返します。タクシートリップの場合、返されるデータはリストで、リストの各要素はデータ行を表す別のリストです。したがって、`block[0]`は最初のタクシートリップのすべてのフィールド(順番に)を含み、`block[1]`は2番目のタクシートリップのすべてのフィールドを含む行となります。行指向の結果は通常、表示や変換プロセスに使用されます。 + +`query_row_stream`は便利なメソッドで、ストリームを通してiteratingする際に自動的に次のブロックに移動します。それ以外は`query_row_block_stream`と同じです。 + +`query_np_stream`メソッドは、各ブロックを2次元Numpy配列として返します。内部的にNumpy配列は(通常)カラムとして保存されているため、特定の行またはカラムメソッドは必要ありません。Numpy配列の「形状」は(columns, rows)として表現されます。NumpyライブラリはNumpy配列を操作するための多くのメソッドを提供します。なお、クエリ中のすべてのカラムが同じNumpy dtypeを共有している場合、返されるNumpy配列も1つのdtypeだけを持ち、内部構造を変更することなくreshape/rotateできることができます。 + +`query_df_stream`メソッドは、各ClickHouseブロックを2次元のPandas Dataframeとして返します。この例では、StreamContextオブジェクトが延期された形式でコンテキストとして使用できることを示していますが(ただし一度だけ) + +最後に、`query_arrow_stream`メソッドはClickHouse`ArrowStream`形式の結果をpyarrow.ipc.RecordBatchStreamReaderとして返し、StreamContextでラップします。各ストリームの反復はPyArrow RecordBlockを返します。 + +```python +df_stream = client.query_df_stream('SELECT * FROM hits') +column_names = df_stream.source.column_names +with df_stream: + for df in df_stream: + +``` + +### 読取りフォーマット + +読み取りフォーマットは、クライアントの`query`、`query_np`、および`query_df`メソッドから返される値のデータタイプを制御します。(`raw_query`および`query_arrow`はClickHouseからのデータを変更しないため、フォーマット制御は適用されません。)たとえば、UUIDを`native`フォーマットから`string`フォーマットに変更すると、ClickHouseの`UUID`カラムのクエリは標準の8-4-4-4-12RFC1422形式で文字列値として返されます。 + +データタイプのフォーマットとしては、ワイルドカードを含むことができます。フォーマットは1つの小文字の文字列です。 + +読み取りフォーマットは、複数のレベルで設定できます: + +- グローバルに、`clickhouse_connect.datatypes.format`パッケージ内で定義されているメソッドを使用して。これにより、構成されたデータタイプのフォーマットがすべてのクエリで制御されます。 +```python +from clickhouse_connect.datatypes.format import set_read_format + +# IPv6およびIPv4の両方の値を文字列として返します +set_read_format('IPv*', 'string') + +# すべてのDateタイプを基礎的なエポック秒またはエポック日として返します +set_read_format('Date*', 'int') +``` +- クエリ全体、オプションの`query_formats`ディクショナリアーギュメントを使用して。この場合、特定のデータタイプ(またはサブカラム)のカラムごとに設定されたフォーマットが使用されます。 +```python +# 任意のUUIDカラムを文字列として返します +client.query('SELECT user_id, user_uuid, device_uuid from users', query_formats={'UUID': 'string'}) +``` +- 特定のカラムに含まれる値の場合、オプションの`column_formats`ディクショナリアーギュメントを使用して。キーはClickHouseによって返されるカラム名で、フォーマットはデータカラムに対してのものであり、またはClickHouseのタイプ名とクエリフォーマットの値である2次レベルの「フォーマット」ディクショナリです。この2次ディクショナリは、タプルやマップなどのネストされたカラムタイプに使用できます。 +```python +# dev_addressカラムのIPv6値を文字列として返します +client.query('SELECT device_id, dev_address, gw_address from devices', column_formats={'dev_address':'string'}) +``` + +#### 読み取りフォーマットオプション(Pythonタイプ) + +| ClickHouse Type | Native Python Type | Read Formats | Comments | +|-----------------------|-----------------------|--------------|-------------------------------------------------------------------------------------------------------------------| +| Int[8-64], UInt[8-32] | int | - | | +| UInt64 | int | signed | Supersetは現在大きな符号なしUInt64値を処理できません | +| [U]Int[128,256] | int | string | PandasとNumpyのint値は最大64ビットであるため、これらは文字列として返すことができます | +| Float32 | float | - | すべてのPythonのfloatは内部で64ビットです | +| Float64 | float | - | | +| Decimal | decimal.Decimal | - | | +| String | string | bytes | ClickHouseのStringカラムは固有のエンコーディングを持っていないため、可変長のバイナリデータにも使用されます | +| FixedString | bytes | string | FixedStringは固定サイズのバイト配列ですが、時にはPythonの文字列として扱われることもあります | +| Enum[8,16] | string | string, int | Pythonのenumは空の文字列を許容しないため、すべてのenumは文字列か基本のint値としてレンダリングされます | +| Date | datetime.date | int | ClickHouseはDateを1970年1月1日からの日数として保存します。この値はintとして提供されます | +| Date32 | datetime.date | int | Dateと同じですが、より広い日付の範囲を持ちます | +| DateTime | datetime.datetime | int | ClickHouseはDateTimeをエポック秒で保存します。この値はintとして提供されます | +| DateTime64 | datetime.datetime | int | Pythonのdatetime.datetimeはマイクロ秒精度に制限されています。生の64ビットのint値が利用可能です | +| IPv4 | ipaddress.IPv4Address | string | IPアドレスは文字列として読み込まれ、適切にフォーマットされた文字列がIPアドレスとして挿入されることができます | +| IPv6 | ipaddress.IPv6Address | string | IPアドレスは文字列として読み込まれ、適切にフォーマットされた文字列がIPアドレスとして挿入されることができます | +| Tuple | dict or tuple | tuple, json | 名前付きタプルはデフォルトでDictionaryとして返されます。また、名前付きタプルはJSON文字列としても返されます | +| Map | dict | - | | +| Nested | Sequence[dict] | - | | +| UUID | uuid.UUID | string | UUIDはRFC 4122の標準形式を使用して文字列として読み込まれることができます | +| JSON | dict | string | デフォルトではPythonのDictionaryが返されます。`string`フォーマットではJSON文字列が返されます | +| Variant | object | - | 保存されている値のClickHouseデータタイプに一致するPythonタイプが返されます | +| Dynamic | object | - | 保存されている値のClickHouseデータタイプに一致するPythonタイプが返されます | + + +### 外部データ + +ClickHouseのクエリは、任意のClickHouseフォーマットで外部データを受け入れることができます。このバイナリデータはクエリ文字列と共に送信され、データを処理するために使用されます。外部データ機能の詳細は[こちら](/docs/ja/engines/table-engines/special/external-data.md)です。クライアントの`query*`メソッドは、この機能を利用するためにオプションの`external_data`パラメータを受け入れます。`external_data`パラメータの値は`clickhouse_connect.driver.external.ExternalData`オブジェクトである必要があります。このオブジェクトのコンストラクタは、以下の引数を受け入れます: + +| Name | Type | Description | +|-----------|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| +| file_path | str | 外部データを読み込むためのローカルシステムパスのファイルパス。`file_path`または`data`のいずれかが必要です | +| file_name | str | 外部データ「ファイル」の名前。提供されない場合は、(拡張子なしの)`file_path`から決定されます | +| data | bytes | バイナリ形式の外部データ(ファイルから読み込む代わりに)。`data`または`file_path`のいずれかが必要です | +| fmt | str | データのClickHouse [入力フォーマット](/docs/ja/sql-reference/formats.mdx)。デフォルトは`TSV` | +| types | str or seq of str | 外部データのカラムデータタイプのリスト。文字列の場合、型はコンマで区切られるべきです。`types`または`structure`のいずれかが必要です | +| structure | str or seq of str | データのカラム名+データタイプのリスト(例を参照)。`structure`または`types`のいずれかが必要です | +| mime_type | str | ファイルデータのオプションのMIMEタイプ。現在、ClickHouseはこのHTTPサブヘッダを無視します | + + +外部CSVファイルを含む「映画」データをクエリに送信し、ClickHouseサーバー上に既に存在する`directors`テーブルとそのデータを結合する: + +```python +import clickhouse_connect +from clickhouse_connect.driver.external import ExternalData + +client = clickhouse_connect.get_client() +ext_data = ExternalData(file_path='/data/movies.csv', + fmt='CSV', + structure=['movie String', 'year UInt16', 'rating Decimal32(3)', 'director String']) +result = client.query('SELECT name, avg(rating) FROM directors INNER JOIN movies ON directors.name = movies.director GROUP BY directors.name', + external_data=ext_data).result_rows +``` + +追加の外部データファイルは、コンストラクタと同じパラメータを取る`add_file`メソッドを使用して初期ExternalDataオブジェクトに追加できます。HTTPの場合、すべての外部データは`multi-part/form-data`ファイルアップロードの一部として送信されます。 + +### タイムゾーン +ClickHouse DateTimeおよびDateTime64の値には複数の方法でタイムゾーンを適用できます。内部的に、ClickHouseサーバーは常に任意のDateTimeまたはDateTime64オブジェクトをタイムゾーンナイーブな数値、つまり1970-01-01 00:00:00 UTC時間からの秒数として保存します。DateTime64値の場合、表現は精度に依存してエポックからのミリ秒、マイクロ秒、またはナノ秒です。その結果、いかなるタイムゾーン情報の適用も常にクライアント側で行われます。これには有意義な追加計算が伴うため、パフォーマンスが重要なアプリケーションでは、DateTimeタイプをエポックタイムスタンプとして扱うことをお勧めします。ユーザー表示や変換を除き、Pandas TimestampなどのPandasデータ型はパフォーマンスを向上させるために常にエポックナノ秒を表す64ビット整数となるためです。 + +クエリでタイムゾーンアウェアなデータタイプ、特にPythonの`datetime.datetime`オブジェクトを使用する際、`clickhouse-connect`はクライアント側タイムゾーンを以下の優先順位ルールに従って適用します: + +1. クエリメソッドパラメータ`client_tzs`がクエリに指定されている場合、その特定のカラムタイムゾーンが適用されます。 +2. ClickHouseカラムにタイムゾーンメタデータが含まれている場合(例えば、DateTime64(3, 'America/Denver')のようなタイプ)、ClickHouseカラムタイムゾーンが適用されます。(このタイムゾーンメタデータはClickHouseバージョン23.2以前のDateTimeカラムには利用できません) +3. クエリメソッドパラメータ`query_tz`がクエリに指定されている場合、「クエリタイムゾーン」が適用されます。 +4. クエリまたはセッションにタイムゾーン設定が適用されている場合、そのタイムゾーンが適用されます。(この機能はClickHouseサーバーでまだリリースされていません) +5. 最後に、クライアントの`apply_server_timezone`パラメータがTrue(デフォルトの設定)に設定されている場合、ClickHouseサーバータイムゾーンが適用されます。 + +これらのルールに基づいて適用されたタイムゾーンがUTCである場合、`clickhouse-connect`は常にタイムゾーンナイーブなPython`datetime.datetime`オブジェクトを返します。このタイムゾーンナイーブなオブジェクトには、必要に応じてアプリケーションコードで追加のタイムゾーン情報を加えることができます。 + +## ClickHouse Connectを使ったデータのインサート:上級利用法 + +### InsertContexts + +ClickHouse ConnectはすべてのインサートをInsertContext内で実行します。InsertContextには、クライアントの`insert`メソッドに引数として渡されたすべての値が含まれています。さらに、InsertContextが最初に構築されたとき、ClickHouse Connectはネイティブフォーマットの効率的なインサートのために必要なインサートカラムのデータタイプを取得します。このInsertContextを複数のインサートで再使用することにより、この「事前クエリ」を回避し、インサートをより迅速かつ効率的に実行します。 + +InsertContextは、クライアントの`create_insert_context`メソッドを使用して取得できます。このメソッドは、`insert`関数と同じ引数を受け取ります。再利用のために修正すべきはInsertContextsの`data`プロパティのみであることに注意してください。これによって、同じテーブルに新しいデータを繰り返しインサートするための再利用可能なオブジェクトが提供されることと一致しています。 + +```python +test_data = [[1, 'v1', 'v2'], [2, 'v3', 'v4']] +ic = test_client.create_insert_context(table='test_table', data='test_data') +client.insert(context=ic) +assert client.command('SELECT count() FROM test_table') == 2 +new_data = [[3, 'v5', 'v6'], [4, 'v7', 'v8']] +ic.data = new_data +client.insert(context=ic) +qr = test_client.query('SELECT * FROM test_table ORDER BY key DESC') +assert qr.row_count == 4 +assert qr[0][0] == 4 +``` + +InsertContextsはインサートプロセス中に更新される可変の状態を持つため、スレッドセーフではありません。 + +### 書き込みフォーマット + +書き込みフォーマットは、現在限られた数のタイプに対して実装されています。ほとんどの場合、ClickHouse Connectは最初の(nullでない)データ値の型をチェックすることによって、カラムに対して適切な書き込みフォーマットを自動的に判断しようとします。たとえば、DateTimeカラムに挿入する場合、カラムの最初のインサート値がPython整数である場合、ClickHouse Connectはそれが実際にはエポック秒であると仮定して整数値を直接挿入します。 + +ほとんどのケースで、データタイプの書き込みフォーマットを上書きする必要はありませんが、`clickhouse_connect.datatypes.format`パッケージの関連メソッドを使用してグローバルレベルで行うことができます。 + +#### 書き込みフォーマットオプション + +| ClickHouse Type | Native Python Type | Write Formats | Comments | +|-----------------------|-----------------------|---------------|-------------------------------------------------------------------------------------------------------------| +| Int[8-64], UInt[8-32] | int | - | | +| UInt64 | int | | | +| [U]Int[128,256] | int | | | +| Float32 | float | | | +| Float64 | float | | | +| Decimal | decimal.Decimal | | | +| String | string | | | +| FixedString | bytes | string | 文字列として挿入された場合、追加のバイトはゼロに設定されます | +| Enum[8,16] | string | | | +| Date | datetime.date | int | ClickHouseは日付を1970年1月1日からの「エポック日」値として保存します。整数型はこれを仮定します | +| Date32 | datetime.date | int | 日付と同じですが、より広い日付の範囲を持ちます | +| DateTime | datetime.datetime | int | ClickHouseはDateTimeをエポック秒で保存します。int型はこの「エポック秒」値と仮定されます | +| DateTime64 | datetime.datetime | int | Pythonのdatetime.datetimeはマイクロ秒の精度に制限されています。生の64ビットint値が利用可能です | +| IPv4 | ipaddress.IPv4Address | string | 正しくフォーマットされた文字列はIPv4アドレスとして挿入されることができます | +| IPv6 | ipaddress.IPv6Address | string | 正しくフォーマットされた文字列はIPv6アドレスとして挿入されることができます | +| Tuple | dict or tuple | | | +| Map | dict | | | +| Nested | Sequence[dict] | | | +| UUID | uuid.UUID | string | 正しくフォーマットされた文字列はClickHouse UUIDとして挿入されることができます | +| JSON/Object('json') | dict | string | DictionaryまたはJSON文字列をJSONカラムに挿入することができます(注意: `Object('json')` は非推奨です) | +| Variant | object | | 現時点ではすべてのバリアントが文字列として挿入され、ClickHouseサーバーによって解析されます | +| Dynamic | object | | 警告 - 現時点では、Dynamicカラムへの挿入はClickHouse文字列として永続化されます | + + +## 追加オプション + +ClickHouse Connectは、上級のユースケースのためにいくつかの追加オプションを提供します + +### グローバル設定 + +ClickHouse Connectの動作をグローバルに制御する設定が少数あります。それらはトップレベルの`common`パッケージからアクセス可能です: + +```python +from clickhouse_connect import common + +common.set_setting('autogenerate_session_id', False) +common.get_setting('invalid_setting_action') +'drop' +``` + +:::note +これらの共通設定 `autogenerate_session_id`, `product_name`, および `readonly` は、常にクライアントを作成する前に +`clickhouse_connect.get_client` メソッドを使用して変更する必要があります。クライアント作成後にこれらの設定を変更しても +既存のクライアントの動作に影響を及ぼしません。 +::: + +現在定義されているグローバル設定は10個です: + +| Setting Name | Default | Options | Description | +|-------------------------|---------|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| autogenerate_session_id | True | True, False | 各クライアントセッションのために新しいUUID(1)セッションIDを自動生成(指定されていない場合)。クライアントまたはクエリレベルでセッションIDが提供されない場合(ClickHouseは内部ランダムIDを各クエリに生成します) | +| invalid_setting_action | 'error' | 'drop', 'send', 'error' | 無効または読み取り専用の設定が提供された場合のアクション(クライアントセッションまたはクエリのいずれか)。`drop`の場合は設定が無視され、`send`の場合は設定がClickHouseへ送信され、`error`の場合はクライアント側でProgrammingErrorが発生します | +| dict_parameter_format | 'json' | 'json', 'map' | これはパラメータ化を行ったクエリがPythonのDictionaryをJSONまたはClickHouseのMap構文に変換するかどうかを制御します。JSONカラムへの挿入には`json`、ClickHouseのMapカラム用には`map`を使用します | +| product_name | | | クエリと共にClickHouseに渡される文字列で、ClickHouse Connectを使用しているアプリをトラッキングするために使用されます。形式&gl/;product name;≷<product version>であるべきです | +| max_connection_age | 600 | | HTTP Keep Alive接続がオープン/再利用され続ける最大の秒数。ロードバランサ/プロキシの背後の単一のClickHouseノードへの接続の集まりを防ぎます(デフォルト10分です)。 | +| readonly | 0 | 0, 1 | ClickHouseバージョン19.17以前の操作を許可するために"read_only"設定と一致するよう設定可能。非常に古いClickHouseバージョンでの操作を許可するために使用。 | +| use_protocol_version | True | True, False | クライアントプロトコルバージョンを使用します。 これはDateTimeタイムゾーンカラムに必要ですが、chproxyの現在のバージョンでは動作しません。 | +| max_error_size | 1024 | | クライアントエラーメッセージに返される最大文字数。ClickHouseのエラーメッセージ全体を取得する設定としては0を使用します。デフォルトは1024文字。 | +| send_os_user | True | True, False | クライアント情報でClickHouseに送信されるオペレーティングシステムユーザー(HTTP User-Agent文字列)を含める。 | +| http_buffer_size | 10MB | | HTTPストリーミングクエリに使用される「インメモリ」バッファのサイズ(バイト単位) | + +### 圧縮 + +ClickHouse Connectは、クエリ結果とインサートの両方に対してlz4、zstd、brotli、およびgzip圧縮をサポートしています。圧縮を使用することは、多くの場合、ネットワーク帯域幅/転送速度とCPU使用量(クライアントとサーバーの両方)の間のトレードオフがあることを常に覚えておいてください。 + +圧縮データを受信するには、ClickHouseサーバーの`enable_http_compression`を1に設定するか、ユーザーが「クエリごと」に設定を変更する権限を持っている必要があります。 + +圧縮は、`clickhouse_connect.get_client`ファクトリメソッドを呼び出す場合の`compress`パラメータで制御されます。デフォルトでは`compress`は `True` に設定されており、これによりデフォルトの圧縮設定がトリガーされます。`query`、`query_np`、および`query_df`クライアントメソッドを使用して実行されるクエリでは、ClickHouse Connectは`query`クライアントメソッドを使用して実行されるクエリに対して、`Accept-Encoding`ヘッダーを`lz4`、 `zstd`、`br`(brotliライブラリがインストールされている場合)、`gzip` および`deflate`エンコーディングとともにクエリを実行します。(クリックハウスサーバーの大多数のリクエストでは、`zstd`圧縮ペイロードが返されます。)インサートの場合、デフォルトでClickHouse Connectはlz4圧縮を使ってインサートブロックを圧縮し、`Content-Encoding: lz4` HTTP ヘッダーを送信します。 + +`get_client`の`compress`パラメータは、特定の圧縮メソッド、`lz4`、`zstd`、`br` または`gzip`のいずれかに設定することもできます。そのメソッドは、インサートとクエリ結果(クライアントサーバーによってサポートされている場合)の両方で使用されます。`zstd`および`lz4`圧縮ライブラリは、現在ClickHouse Connectとともにデフォルトでインストールされています。`br`/brotliが指定されている場合、brotliライブラリは別途インストールする必要があります。 + +`raw*`クライアントメソッドは、クライアント設定によって指定された圧縮を使用しないことに注意してください。 + +また、`gzip`圧縮の使用を推奨しません。データの圧縮と解凍の両方で代替手段と比較してかなり遅いためです。 + +### HTTPプロキシサポート + +ClickHouse Connect では、urllib3ライブラリを使用した基本的なHTTPプロキシサポートが追加されています。標準的な`HTTP_PROXY`と`HTTPS_PROXY`環境変数を認識します。これらの環境変数を使用することで、`clickhouse_connect.get_client`メソッドを使用して作成されるすべてのクライアントになります。または、クライアントごとに設定するために、get_clientメソッドの`http_proxy`や`https_proxy`引数を使用することができます。詳細なHTTPプロキシサポートの実装については、[urllib3](https://urllib3.readthedocs.io/en/stable/advanced-usage.html#http-and-https-proxies) +のドキュメントを参照してください。 + +Socksプロキシを使用するには、urllib3 SOCKSProxyManagerを`pool_mgr`引数として`get_client`に送ることができます。これにはPySocksライブラリを直接インストールするか、urllib3の依存関係として`[socks]`オプションを使用する必要があります。 + +### 古いJSONデータタイプ + +エクスペリメンタルな`Object`(または`Object('json')`)データタイプは非推奨とされており、製品化環境には避けるべきです。ClickHouse Connectはこのデータタイプに対する限定的なサポートを引き続き提供しており、過去との互換性のためのものです。このサポートには、ディクショナリまたはそれに相当する「トップレベル」または「親」JSON値を返すと想定されるクエリは含まれておらず、そのようなクエリは例外を発生させます。 + +### 新しい Variant/Dynamic/JSON データタイプ(エクスペリメンタル機能) + +バージョン0.8.0のリリースから、クリックハウスコネクトは新しい(まだエクスペリメンタルな)ClickHouseタイプVariant、Dynamic、およびJSONに対するエクスペリメンタルサポートを提供しています。 + +#### 使用上の注意事項 +- JSONデータは、PythonDictionaryまたはJSON文字列(例えば`{}`)として挿入できます。他の形式のJSONデータはサポートされていません。 +- これらのタイプのサブカラム/パスを使用したクエリは、サブカラムの型を返します。 +- 他の使用上の注意については、メインのClickHouseドキュメントを参照してください。 + +#### 既知の制限: +- これらのタイプを使用する前に、ClickHouseの設定で有効化する必要があります。 +- 新しいJSONタイプはClickHouse 24.8リリースから利用可能です。 +- 内部フォーマットの変更のため、クリックハウスコネクトはClickHouse 24.7リリース以降のVariantタイプとしか互換性がありません。 +- 返されるJSONオブジェクトは最大で`max_dynamic_paths`の要素数しか返されません(デフォルトで1024)。これは将来のリリースで修正されます。 +- `Dynamic`カラムへの挿入は常にPython値の文字列表現となります。これについては、https://github.com/ClickHouse/ClickHouse/issues/70395の修正後、将来のリリースで修正される予定です。 +- 新しいタイプの実装はCコードでの最適化がされていないため、シンプルで確立されたデータタイプと比べて若干パフォーマンスが遅い可能性があります。 diff --git a/docs/ja/integrations/language-clients/rust.md b/docs/ja/integrations/language-clients/rust.md new file mode 100644 index 00000000000..20024dbce1d --- /dev/null +++ b/docs/ja/integrations/language-clients/rust.md @@ -0,0 +1,550 @@ +--- +sidebar_label: Rust +sidebar_position: 4 +keywords: [clickhouse, rs, rust, cargo, crate, http, client, connect, integrate] +slug: /ja/integrations/rust +description: ClickHouseに接続するための公式Rustクライアント。 +--- + +# ClickHouse Rust クライアント + +ClickHouseに接続するための公式Rustクライアントは、もともと[Paul Loyd](https://github.com/loyd)によって開発されました。クライアントのソースコードは[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-rs)で利用可能です。 + +## 概要 + +* 行をエンコード/デコードするために`serde`を使用します。 +* `serde`属性をサポート:`skip_serializing`, `skip_deserializing`, `rename`。 +* HTTPトランスポート上で[`RowBinary`](https://clickhouse.com/docs/ja/interfaces/formats#rowbinary)フォーマットを使用します。 + * TCP上で[`Native`](https://clickhouse.com/docs/ja/interfaces/formats#native)に切り替える計画があります。 +* TLSをサポートします(`native-tls`および`rustls-tls`機能を通じて)。 +* 圧縮と解凍(LZ4)をサポートします。 +* データの選択や挿入、DDLの実行、クライアント側でのバッチ処理のためのAPIを提供します。 +* 単体テスト用の便利なモックを提供します。 + +## インストール + +クレートを使用するには、`Cargo.toml`に次のように追加してください: + +```toml +[dependencies] +clickhouse = "0.12.2" + +[dev-dependencies] +clickhouse = { version = "0.12.2", features = ["test-util"] } +``` + +参考: [crates.ioページ](https://crates.io/crates/clickhouse)。 + +## Cargo機能 + +* `lz4`(デフォルトで有効) — `Compression::Lz4`と`Compression::Lz4Hc(_)`のバリアントを有効にします。有効にすると、`Compression::Lz4`が`WATCH`を除くすべてのクエリに対してデフォルトで使用されます。 +* `native-tls` — `HTTPS`スキーマを持つURLを`hyper-tls`を通じてサポートし、OpenSSLにリンクします。 +* `rustls-tls` — `HTTPS`スキーマを持つURLを`hyper-rustls`を通じてサポートし、OpenSSLにリンクしません。 +* `inserter` — `client.inserter()`を有効にします。 +* `test-util` — モックを追加します。詳しくは[例](https://github.com/ClickHouse/clickhouse-rs/tree/main/examples/mock.rs)を参照してください。`dev-dependencies`のみに使用してください。 +* `watch` — `client.watch`機能を有効にします。詳細については該当セクションを参照してください。 +* `uuid` — `serde::uuid`を追加し、[uuid](https://docs.rs/uuid)クレートと連携します。 +* `time` — `serde::time`を追加し、[time](https://docs.rs/time)クレートと連携します。 + +:::important +`HTTPS` URL経由でClickHouseに接続する場合は、`native-tls`または`rustls-tls`機能を有効にする必要があります。 +両方を有効にした場合、`rustls-tls`機能が優先されます。 +::: + +## ClickHouseバージョンの互換性 + +クライアントはClickHouseのLTSまたはそれ以降のバージョン、およびClickHouse Cloudと互換性があります。 + +ClickHouseサーバーv22.6より前のバージョンは、[いくつかの稀なケースでRowBinaryを正しく処理しません](https://github.com/ClickHouse/ClickHouse/issues/37420)。 +この問題を解決するには、v0.11+を使用し、`wa-37420`機能を有効にできます。この機能は新しいClickHouseバージョンでは使用しないでください。 + +## 例 + +クライアントリポジトリの[例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples)でクライアント利用のさまざまなシナリオをカバーすることを目指しています。概要は[examples README](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/README.md#overview)で利用可能です。 + +例や以下のドキュメントで不明な点や不足がある場合は、[お問い合わせください](./rust.md#contact-us)。 + +## 使用方法 + +:::note +`ch2rs` crateは、ClickHouseから行タイプを生成するのに便利です。 +::: + +### クライアントインスタンスの作成 + +:::tip +作成されたクライアントを再利用するか、基礎のhyper接続プールを再利用するためにクローンしてください。 +::: + +```rust +use clickhouse::Client; + +let client = Client::default() + // プロトコルとポートの両方を含める必要があります + .with_url("http://localhost:8123") + .with_user("name") + .with_password("123") + .with_database("test"); +``` + +### HTTPSまたはClickHouse Cloud接続 + +HTTPSは`rustls-tls`または`native-tls`のcargo機能で動作します。 + +その後、通常の方法でクライアントを作成します。この例では、環境変数を使用して接続の詳細を保存しています: + +:::important +URLはプロトコルとポートの両方を含める必要があります。例:`https://instance.clickhouse.cloud:8443`。 +::: + +```rust +fn read_env_var(key: &str) -> String { + env::var(key).unwrap_or_else(|_| panic!("{key} env variable should be set")) +} + +let client = Client::default() + .with_url(read_env_var("CLICKHOUSE_URL")) + .with_user(read_env_var("CLICKHOUSE_USER")) + .with_password(read_env_var("CLICKHOUSE_PASSWORD")); +``` + +参考: +- クライアントリポジトリの[ClickHouse CloudのHTTPS使用例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/clickhouse_cloud.rs)。これはオンプレミスのHTTPS接続でも適用可能です。 + +### 行の選択 + +```rust +use serde::Deserialize; +use clickhouse::Row; +use clickhouse::sql::Identifier; + +#[derive(Row, Deserialize)] +struct MyRow<'a> { + no: u32, + name: &'a str, +} + +let table_name = "some"; +let mut cursor = client + .query("SELECT ?fields FROM ? WHERE no BETWEEN ? AND ?") + .bind(Identifier(table_name)) + .bind(500) + .bind(504) + .fetch::>()?; + +while let Some(row) = cursor.next().await? { .. } +``` + +* プレースホルダー`?fields`は、`Row`のフィールド`no, name`に置き換えられます。 +* プレースホルダー`?`は、以下の`bind()`呼び出しで値に置き換えられます。 +* 便利な`fetch_one::()`と`fetch_all::()`メソッドは、それぞれ最初の行またはすべての行を取得するために使用できます。 +* `sql::Identifier`はテーブル名をバインドするために使用できます。 + +注意:応答全体がストリーミングされるため、カーソルは一部の行を生成した後でもエラーを返す場合があります。この場合、サーバー側の応答バッファリングを有効にするために`query(...).with_option("wait_end_of_query", "1")`を試すことができます。[詳細はこちら](https://clickhouse.com/docs/ja/interfaces/http/#response-buffering)。`buffer_size`オプションも役立ちます。 + +:::warning +行を選択するときに`wait_end_of_query`を慎重に使用してください。サーバー側でのメモリ消費が増加し、パフォーマンス全体が低下する可能性があります。 +::: + +### 行の挿入 + +```rust +use serde::Serialize; +use clickhouse::Row; + +#[derive(Row, Serialize)] +struct MyRow { + no: u32, + name: String, +} + +let mut insert = client.insert("some")?; +insert.write(&MyRow { no: 0, name: "foo".into() }).await?; +insert.write(&MyRow { no: 1, name: "bar".into() }).await?; +insert.end().await?; +``` + +* `end()`が呼び出されないと、`INSERT`は中止されます。 +* 行はネットワーク負荷を分配するストリームとして順次送信されます。 +* ClickHouseは、すべての行が同じパーティションに適合し、その数が[`max_insert_block_size`](https://clickhouse.tech/docs/en/operations/settings/settings/#settings-max_insert_block_size)以下である場合にのみバッチをアトミックに挿入します。 + +### 非同期挿入(サーバー側バッチ処理) + +クライアント側でデータのバッチ処理を避けるために[ClickHouse非同期挿入](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)を利用できます。これは、`async_insert`オプションを`insert`メソッドに(またはクライアントインスタンス自体に)提供することで実現できます。これにより、すべての`insert`呼び出しに影響します。 + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_option("async_insert", "1") + .with_option("wait_for_async_insert", "0"); +``` + +参考: +- クライアントリポジトリの[非同期挿入の例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/async_insert.rs)。 + +### インサータ機能(クライアント側バッチ処理) + +`inserter` cargo機能が必要です。 + +```rust +let mut inserter = client.inserter("some")? + .with_timeouts(Some(Duration::from_secs(5)), Some(Duration::from_secs(20))) + .with_max_bytes(50_000_000) + .with_max_rows(750_000) + .with_period(Some(Duration::from_secs(15))); + +inserter.write(&MyRow { no: 0, name: "foo".into() })?; +inserter.write(&MyRow { no: 1, name: "bar".into() })?; +let stats = inserter.commit().await?; +if stats.rows > 0 { + println!( + "{} bytes, {} rows, {} transactions have been inserted", + stats.bytes, stats.rows, stats.transactions, + ); +} + +// アプリケーション終了時にinserterを最終化し、残りの行をコミットすることを忘れないでください。. `end()`は統計も提供します。 +inserter.end().await?; +``` + +* `Inserter`は、いずれかのしきい値(`max_bytes`、`max_rows`、`period`)に達した場合に`commit()`でアクティブな挿入を終了します。 +* パラレルインサータによる負荷スパイクを避けるために、`with_period_bias`を使用してアクティブな`INSERT`間の間隔がバイアスされます。 +* `Inserter::time_left()`を使用して、現在の期間が終了した時を検出できます。項目がまれに生成される場合は、再び`Inserter::commit()`を呼び出して制限をチェックしてください。 +* 時間しきい値は、インサータを高速にするために[quanta](https://docs.rs/quanta)クレートを使用して実装されています。`test-util`が有効な場合、使用されません(したがって、カスタムテストで`tokio::time::advance()`によって時間を管理できます)。 +* `commit()`呼び出し間のすべての行は、同じ`INSERT`ステートメントで挿入されます。 + +:::warning +挿入を終了/最終化する場合にフラッシュすることを忘れないでください: +```rust +inserter.end().await?; +``` +::: + +### DDLの実行 + +単一ノードの展開では、次のようにDDLを実行するだけで十分です: + +```rust +client.query("DROP TABLE IF EXISTS some").execute().await?; +``` + +しかし、負荷分散装置やClickHouse Cloudを使用している場合、すべてのレプリカでDDLが適用されるのを待つことが推奨されます。これは`wait_end_of_query`オプションを使用して行うことができます: + +```rust +client + .query("DROP TABLE IF EXISTS some") + .with_option("wait_end_of_query", "1") + .execute() + .await?; +``` + +### ClickHouse設定 + +`with_option`メソッドを使用して、さまざまな[ClickHouse設定](https://clickhouse.com/docs/ja/operations/settings/settings)を適用できます。例えば: + +```rust +let numbers = client + .query("SELECT number FROM system.numbers") + // この設定はこの特定のクエリにのみ適用されます。グローバルなクライアント設定を上書きします。 + .with_option("limit", "3") + .fetch_all::() + .await?; +``` + +`query`と同様に、`insert`および`inserter` メソッドでも同様に機能します。さらに、`Client`インスタンスでこのメソッドを呼び出して、すべてのクエリに対するグローバル設定を行うことができます。 + +### クエリID + +`with_option`を使用して、ClickHouseのクエリログでクエリを識別するために`query_id`オプションを設定できます。 + +```rust +let numbers = client + .query("SELECT number FROM system.numbers LIMIT 1") + .with_option("query_id", "some-query-id") + .fetch_all::() + .await?; +``` + +`query`と同様に、`insert`および`inserter` メソッドでも同様に機能します。 + +:::danger +`query_id`を手動で設定する場合は、それが一意であることを確認してください。UUIDはそのための良い選択肢です。 +::: + +参考:クライアントリポジトリの[query_idの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/query_id.rs)。 + +### セッションID + +`query_id`と同様に、同じセッションでステートメントを実行するために`session_id`を設定できます。`session_id`は、クライアントレベルでグローバルに、または`query`、`insert`、`inserter`呼び出しごとに設定することができます。 + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_option("session_id", "my-session"); +``` + +:::danger +クラスター化されたデプロイメントでは、「スティッキーセッション」がないため、この機能を適切に利用するには特定のクラスター ノードに接続する必要があります。たとえば、ラウンドロビンの負荷分散装置は、後続のリクエストが同じ ClickHouse ノードによって処理されることを保証しません。 +::: + +参考:クライアントリポジトリの[session_idの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/session_id.rs)。 + +### カスタムHTTPヘッダー + +プロキシ認証を使用している場合やカスタムヘッダーを渡す必要がある場合、次のように行うことができます: + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_header("X-My-Header", "hello"); +``` + +参考:クライアントリポジトリの[カスタムHTTPヘッダーの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/custom_http_headers.rs)。 + +### カスタムHTTPクライアント + +基礎となるHTTP接続プールの設定を微調整するのに役立ちます。 + +```rust +use hyper_util::client::legacy::connect::HttpConnector; +use hyper_util::client::legacy::Client as HyperClient; +use hyper_util::rt::TokioExecutor; + +let connector = HttpConnector::new(); // またはHttpsConnectorBuilder +let hyper_client = HyperClient::builder(TokioExecutor::new()) + // クライアント側で特定のアイドルソケットを生かす時間(ミリ秒単位)。 + // これはClickHouseサーバーのKeepAliveタイムアウトよりもかなり短いことが想定されています。 + // これは、デフォルトで23.11バージョン以前の3秒、以降のバージョンの後10秒でした。 + .pool_idle_timeout(Duration::from_millis(2_500)) + // プール内で許可される最大のアイドルKeep-Alive接続。 + .pool_max_idle_per_host(4) + .build(connector); + +let client = Client::with_http_client(hyper_client).with_url("http://localhost:8123"); +``` + +:::warning +この例はレガシーなHyper APIに依存しており、将来変更される可能性があります。 +::: + +参考:クライアントリポジトリの[カスタムHTTPクライアントの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/custom_http_client.rs)。 + +## データ型 + +:::info +追加の例も参照してください: +* [シンプルなClickHouseデータ型](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/data_types_derive_simple.rs) +* [コンテナ型のClickHouseデータ型](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/data_types_derive_containers.rs) +::: + +* `(U)Int(8|16|32|64|128)`は対応する`(u|i)(8|16|32|64|128)`型またはその周りの新しい型にマッピングします。 +* `(U)Int256`は直接サポートされていませんが、[回避策があります](https://github.com/ClickHouse/clickhouse-rs/issues/48)。 +* `Float(32|64)`は対応する`f(32|64)`またはその周りの新しい型にマッピングします。 +* `Decimal(32|64|128)`は対応する`i(32|64|128)`またはその周りの新しい型にマッピングします。[fixnum](https://github.com/loyd/fixnum)や他の実装のサイン付き固定小数点数を使用することがより便利です。 +* `Boolean`は`bool`またはその周りの新しい型にマッピングします。 +* `String`は任意の文字列またはバイト型にマッピングします。例:`&str`, `&[u8]`, `String`, `Vec`または[`SmartString`](https://docs.rs/smartstring/latest/smartstring/struct.SmartString.html)。新しい型もサポートされます。バイトを保存するには、[serde_bytes](https://docs.rs/serde_bytes/latest/serde_bytes/)を使用することを考慮してください。これはより効率的です。 + +```rust +#[derive(Row, Debug, Serialize, Deserialize)] +struct MyRow<'a> { + str: &'a str, + string: String, + #[serde(with = "serde_bytes")] + bytes: Vec, + #[serde(with = "serde_bytes")] + byte_slice: &'a [u8], +} +``` + +* `FixedString(N)`はバイトの配列としてサポートされます。例:`[u8; N]`。 + +```rust +#[derive(Row, Debug, Serialize, Deserialize)] +struct MyRow { + fixed_str: [u8; 16], // FixedString(16) +} +``` +* `Enum(8|16)`は[serde_repr](https://docs.rs/serde_repr/latest/serde_repr/)を使用してサポートされています。 + +```rust +use serde_repr::{Deserialize_repr, Serialize_repr}; + +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + level: Level, +} + +#[derive(Debug, Serialize_repr, Deserialize_repr)] +#[repr(u8)] +enum Level { + Debug = 1, + Info = 2, + Warn = 3, + Error = 4, +} +``` +* `UUID`は`serde::uuid`を使用して[`uuid::Uuid`](https://docs.rs/uuid/latest/uuid/struct.Uuid.html)にマッピングされます。`uuid`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::uuid")] + uuid: uuid::Uuid, +} +``` +* `IPv6`は[`std::net::Ipv6Addr`](https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html)にマッピングされます。 +* `IPv4`は`serde::ipv4`を使用して[`std::net::Ipv4Addr`](https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html)にマッピングされます。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::ipv4")] + ipv4: std::net::Ipv4Addr, +} +``` +* `Date`は`u16`またはその周りの新しい型にマッピングされ、 `1970-01-01`から経過した日数を表します。また、`serde::time::date`を使用して、[`time::Date`](https://docs.rs/time/latest/time/struct.Date.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + days: u16, + #[serde(with = "clickhouse::serde::time::date")] + date: Date, +} +``` +* `Date32`は`i32`またはその周りの新しい型にマッピングされ、`1970-01-01`から経過した日数を表します。また、`serde::time::date32`を使用して、[`time::Date`](https://docs.rs/time/latest/time/struct.Date.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + days: i32, + #[serde(with = "clickhouse::serde::time::date32")] + date: Date, +} +``` +* `DateTime`は`u32`またはその周りの新しい型にマッピングされ、UNIX時代から経過した秒数を表します。また、`serde::time::datetime`を使用して、[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + ts: u32, + #[serde(with = "clickhouse::serde::time::datetime")] + dt: OffsetDateTime, +} +``` + +* `DateTime64(_)`は`i32`またはその周りの新しい型にマッピングされ、UNIX時代から経過した時間を表します。また、`serde::time::datetime64::*`を使用して、[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + ts: i64, // `DateTime64(X)`に応じた経過秒/μs/ms/ns + #[serde(with = "clickhouse::serde::time::datetime64::secs")] + dt64s: OffsetDateTime, // `DateTime64(0)` + #[serde(with = "clickhouse::serde::time::datetime64::millis")] + dt64ms: OffsetDateTime, // `DateTime64(3)` + #[serde(with = "clickhouse::serde::time::datetime64::micros")] + dt64us: OffsetDateTime, // `DateTime64(6)` + #[serde(with = "clickhouse::serde::time::datetime64::nanos")] + dt64ns: OffsetDateTime, // `DateTime64(9)` +} +``` + +* `Tuple(A, B, ...)`は`(A, B, ...)`またはその周りの新しい型にマッピングされます。 +* `Array(_)`は任意のスライス、例:`Vec<_>`, `&[_]`にマッピングされます。新しい型もサポートされます。 +* `Map(K, V)`は`Array((K, V))`のように動作します。 +* `LowCardinality(_)`はシームレスにサポートされます。 +* `Nullable(_)`は`Option<_>`にマッピングされます。`clickhouse::serde::*`ヘルパーに対しては`::option`を追加します。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::ipv4::option")] + ipv4_opt: Option, +} +``` +* `Nested`はリネーミングを使用して複数の配列を提供することでサポートされます。 +```rust +// CREATE TABLE test(items Nested(name String, count UInt32)) +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(rename = "items.name")] + items_name: Vec, + #[serde(rename = "items.count")] + items_count: Vec, +} +``` +* `Geo`型はサポートされています。 `Point`はタプル`(f64, f64)`として動作し、その他の型は単に点のスライスです。 +```rust +type Point = (f64, f64); +type Ring = Vec; +type Polygon = Vec; +type MultiPolygon = Vec; +type LineString = Vec; +type MultiLineString = Vec; + +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + point: Point, + ring: Ring, + polygon: Polygon, + multi_polygon: MultiPolygon, + line_string: LineString, + multi_line_string: MultiLineString, +} +``` + +* `Variant`、`Dynamic`、(新しい)`JSON`データ型はまだサポートされていません。 + +## モック + +このクレートは、CHサーバーをモックし、DDL、`SELECT`、`INSERT`、`WATCH`クエリをテストするためのユーティリティを提供します。この機能は`test-util`機能で有効になります。**dev-dependency**としてのみ使用してください。 + +参考:[例](https://github.com/ClickHouse/clickhouse-rs/tree/main/examples/mock.rs)。 + +## トラブルシューティング + +### CANNOT_READ_ALL_DATA + +`CANNOT_READ_ALL_DATA`エラーの最も一般的な原因は、アプリケーション側の行定義がClickHouseのものと一致していないことです。 + +次のようなテーブルを考えてみます: + +``` +CREATE OR REPLACE TABLE event_log (id UInt32) +ENGINE = MergeTree +ORDER BY timestamp +``` + +そして、アプリケーション側で`EventLog`が次のように定義されている場合、型が一致していません: + +```rust +#[derive(Debug, Serialize, Deserialize, Row)] +struct EventLog { + id: String, // <- 本来はu32であるべき! +} +``` + +データを挿入すると、次のエラーが発生する可能性があります: + +``` +Error: BadResponse("Code: 33. DB::Exception: Cannot read all data. Bytes read: 5. Bytes expected: 23.: (at row 1)\n: While executing BinaryRowInputFormat. (CANNOT_READ_ALL_DATA)") +``` + +この例を正確にするためには、`EventLog`構造体を次のように正しく定義します: + +```rust +#[derive(Debug, Serialize, Deserialize, Row)] +struct EventLog { + id: u32 +} +``` + +## 既知の制限 + +* `Variant`、`Dynamic`、(新しい)`JSON`データ型はまだサポートされていません。 +* サーバー側のパラメータバインディングはまだサポートされていません。追跡するために[この問題](https://github.com/ClickHouse/clickhouse-rs/issues/142)を参照してください。 + +## お問い合わせ + +質問がある場合や手助けが必要な場合は、[Community Slack](https://clickhouse.com/slack)や[GitHub issues](https://github.com/ClickHouse/clickhouse-rs/issues)を通じてお気軽にお問い合わせください。 diff --git a/docs/ja/integrations/migration/_category_.yml b/docs/ja/integrations/migration/_category_.yml new file mode 100644 index 00000000000..da1d794d41b --- /dev/null +++ b/docs/ja/integrations/migration/_category_.yml @@ -0,0 +1,8 @@ +position: 500 +label: 'Migration' +collapsible: true +collapsed: true +link: + type: generated-index + title: Migration + slug: /ja/cloud/migration diff --git a/docs/ja/integrations/migration/clickhouse-local-etl.md b/docs/ja/integrations/migration/clickhouse-local-etl.md new file mode 100644 index 00000000000..bf377ac5e8e --- /dev/null +++ b/docs/ja/integrations/migration/clickhouse-local-etl.md @@ -0,0 +1,165 @@ +--- +sidebar_label: clickhouse-localの使用 +sidebar_position: 20 +keywords: [clickhouse, 移行, マイグレーション, データ, etl, elt, clickhouse-local, clickhouse-client] +slug: '/ja/cloud/migration/clickhouse-local' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +import AddARemoteSystem from '@site/docs/ja/_snippets/_add_remote_ip_access_list_detail.md'; + + +# clickhouse-localを使用したClickHouseへの移行 + +セルフマネージド ClickHouse の移行 + + +ClickHouse、より具体的には[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)をETLツールとして使用し、現在のデータベースシステムからClickHouse Cloudにデータを移行することができます。これは、現在のデータベースシステムにClickHouseが提供する[インテグレーションエンジン](/docs/ja/engines/table-engines/#integration-engines)または[テーブル関数](/docs/ja/sql-reference/table-functions/)があるか、またはベンダーが提供するJDBCドライバまたはODBCドライバが利用可能である限りです。 + +この移行方法を「ピボット」方式と呼ぶこともあります。中間のピボットポイントまたはハブを使用して、ソースデータベースから宛先データベースにデータを移動するためです。たとえば、この方法は、セキュリティ要件のためにプライベートまたは内部ネットワークからの外向き接続のみが許可されている場合に必要になるかもしれません。そのため、clickhouse-localを使用してソースデータベースからデータを取得し、clickhouse-localがピボットポイントとして機能することで、データを宛先のClickHouseデータベースへプッシュする必要があります。 + +ClickHouseは、[MySQL](/docs/ja/engines/table-engines/integrations/mysql/)、[PostgreSQL](/docs/ja/engines/table-engines/integrations/postgresql)、[MongoDB](/docs/ja/engines/table-engines/integrations/mongodb)、そして[SQLite](/docs/ja/engines/table-engines/integrations/sqlite)のインテグレーションエンジンとテーブル関数(即座にインテグレーションエンジンを作成する)を提供しています。他のすべての一般的なデータベースシステムには、ベンダーから利用可能なJDBCドライバまたはODBCドライバがあります。 + +## clickhouse-localとは? + +セルフマネージド ClickHouse の移行 + +通常、ClickHouseはクラスタ形式で実行され、いくつかのClickHouseデータベースエンジンのインスタンスが異なるサーバで分散的に実行されます。 + +シングルサーバでは、ClickHouseデータベースエンジンは`clickhouse-server`プログラムの一部として実行されます。データベースアクセス(パス、ユーザー、セキュリティなど)はサーバー構成ファイルで設定されます。 + +`clickhouse-local`ツールは、ClickHouseサーバーを設定したり起動したりすることなく、多くの入力と出力に対して超高速SQLデータ処理が可能な、コマンドラインユーティリティの形式でClickHouseデータベースエンジンを使用できるようにします。 + +## clickhouse-localのインストール + +`clickhouse-local`を使用するには、現在のソースデータベースシステムとClickHouse Cloudターゲットサービスの両方にネットワークアクセスできるホストマシンが必要です。 + +そのホストマシンで、コンピュータのオペレーティングシステムに基づいて`clickhouse-local`の適切なビルドをダウンロードします: + + + + +1. `clickhouse-local`をローカルにダウンロードする最も簡単な方法は、次のコマンドを実行することです: + ```bash + curl https://clickhouse.com/ | sh + ``` + +1. `clickhouse-local`を実行します(バージョンが表示されるだけです): + ```bash + ./clickhouse-local + ``` + + + + +1. `clickhouse-local`をローカルにダウンロードする最も簡単な方法は、次のコマンドを実行することです: + ```bash + curl https://clickhouse.com/ | sh + ``` + +1. `clickhouse-local`を実行します(バージョンが表示されるだけです): + ```bash + ./clickhouse local + ``` + + + + +:::info 重要 +このガイド全体での例は、`clickhouse-local`を実行するためにLinuxコマンド(`./clickhouse-local`)を使用しています。Macで`clickhouse-local`を実行する場合は、`./clickhouse local`を使用してください。 +::: + + +:::tip リモートシステムをClickHouse CloudサービスのIPアクセスリストに追加する +`remoteSecure`関数がClickHouse Cloudサービスに接続するためには、リモートシステムのIPアドレスがIPアクセスリストで許可されている必要があります。このヒントの下にある**Manage your IP Access List**を展開して詳細を確認してください。 +::: + + + +## 例1: MySQLからClickHouse Cloudへのインテグレーションエンジンによる移行 + +ソースのMySQLデータベースからデータを読み取るために[インテグレーションテーブルエンジン](/docs/ja/engines/table-engines/integrations/mysql/)([mysqlテーブル関数](/docs/ja/sql-reference/table-functions/mysql/)によって即座に作成)を使用し、ClickHouseクラウドサービス上の宛先テーブルにデータを書き込むために[remoteSecureテーブル関数](/docs/ja/sql-reference/table-functions/remote/)を使用します。 + +セルフマネージド ClickHouse の移行 + + +### 宛先ClickHouse Cloudサービス上で: + +#### 宛先データベースを作成する: + + ```sql + CREATE DATABASE db + ``` + +#### MySQLテーブルと等価なスキーマを持つ宛先テーブルを作成する: + + ```sql + CREATE TABLE db.table ... + ``` + +:::note +ClickHouse Cloud宛先テーブルのスキーマとソースMySQLテーブルのスキーマは一致している必要があります(カラム名と順序が同じであり、カラムのデータ型が互換性がある必要があります)。 +::: + +### clickhouse-localホストマシンで: + +#### マイグレーションクエリでclickhouse-localを実行する: + + ```sql + ./clickhouse-local --query " +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') +SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');" + ``` + +:::note +データは`clickhouse-local`ホストマシンにローカルで保存されません。代わりに、データはソースMySQLテーブルから読み取られ、即座にClickHouse Cloudサービス上の宛先テーブルに書き込まれます。 +::: + + +## 例2: MySQLからClickHouse CloudへのJDBCブリッジによる移行 + +ソースMySQLデータベースからデータを読み取るために[ClickHouse JDBC Bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge)およびMySQL JDBCドライバとともに[JDBCインテグレーションテーブルエンジン](/docs/ja/engines/table-engines/integrations/jdbc.md)([jdbcテーブル関数](/docs/ja/sql-reference/table-functions/jdbc.md)によって即座に作成)を使用し、ClickHouseクラウドサービス上の宛先テーブルにデータを書き込むために[remoteSecureテーブル関数](/docs/ja/sql-reference/table-functions/remote.md)を使用します。 + +セルフマネージド ClickHouse の移行 + +### 宛先ClickHouse Cloudサービスで: + +#### 宛先データベースを作成する: + ```sql + CREATE DATABASE db + ``` + +#### MySQLテーブルと等価なスキーマを持つ宛先テーブルを作成する: + + ```sql + CREATE TABLE db.table ... + ``` + +:::note +ClickHouse Cloud宛先テーブルのスキーマとソースMySQLテーブルのスキーマは一致している必要があります。例えば、カラム名と順序が同じである必要があり、カラムのデータ型は互換性がある必要があります。 +::: + +### clickhouse-localホストマシンで: + +#### ClickHouse JDBC Bridgeをローカルにインストール、設定、開始する: + +[ガイド](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md#install-the-clickhouse-jdbc-bridge-locally)での手順に従ってください。このガイドにはMySQLからのデータソースを設定するための手順も含まれています。 + +#### マイグレーションクエリでclickhouse-localを実行する: + + ```sql + ./clickhouse-local --query " +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') +SELECT * FROM jdbc('datasource', 'database', 'table');" + ``` + +:::note +データは`clickhouse-local`ホストマシンにローカルで保存されません。代わりに、データはMySQLソーステーブルから読み取られ、即座にClickHouse Cloudサービス上の宛先テーブルに書き込まれます。 +::: + + diff --git a/docs/ja/integrations/migration/clickhouse-to-cloud.md b/docs/ja/integrations/migration/clickhouse-to-cloud.md new file mode 100644 index 00000000000..f29aba8b556 --- /dev/null +++ b/docs/ja/integrations/migration/clickhouse-to-cloud.md @@ -0,0 +1,194 @@ +--- +sidebar_position: 10 +sidebar_label: ClickHouseからClickHouse Cloudへの移行 +slug: /ja/cloud/migration/clickhouse-to-cloud +--- +import AddARemoteSystem from '@site/docs/ja/_snippets/_add_remote_ip_access_list_detail.md'; + +# セルフマネージドのClickHouseからClickHouse Cloudへの移行 + +セルフマネージドのClickHouseの移行 + +このガイドでは、セルフマネージドのClickHouseサーバーからClickHouse Cloudへの移行方法、およびClickHouse Cloudサービス間の移行方法を示します。`SELECT`および`INSERT`クエリで[`remoteSecure`](../../sql-reference/table-functions/remote.md)関数を使用すると、リモートのClickHouseサーバーへのアクセスが可能となり、テーブルの移行が`INSERT INTO`クエリに`SELECT`を埋め込むだけで簡単になります。 + +## セルフマネージドのClickHouseからClickHouse Cloudへの移行 + +セルフマネージドのClickHouseの移行 + +:::note +ソーステーブルがシャードされているかレプリケートされているかに関係なく、ClickHouse Cloudでは宛先テーブルを作成するだけです(このテーブルに対するエンジンパラメータは省略可能で、自動的にReplicatedMergeTreeテーブルになります)。ClickHouse Cloudは垂直および水平スケーリングを自動的に処理します。レプリケーションやシャードの管理について考える必要はありません。 +::: + +この例では、セルフマネージドのClickHouseサーバーが*ソース*であり、ClickHouse Cloudサービスが*宛先*です。 + +### 概要 + +プロセスは以下の通りです: + +1. ソースサービスに読み取り専用ユーザーを追加 +2. 宛先サービスにソーステーブル構造を複製 +3. ソースから宛先にデータを取り込むか、ネットワークの可用性に応じてソースからデータをプッシュ +4. 宛先のIPアクセスリストからソースサーバーを削除 (該当する場合) +5. ソースサービスから読み取り専用ユーザーを削除 + +### システム間でのテーブル移行: +この例では、セルフマネージドのClickHouseサーバーからClickHouse Cloudに1つのテーブルを移行します。 + +### ソースClickHouseシステムの場合 (現在データがホストされているシステム) + +- ソーステーブル (`db.table` という例) を読み取る権限を持つ読み取り専用ユーザーを追加 +```sql +CREATE USER exporter +IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' +SETTINGS readonly = 1; +``` + +```sql +GRANT SELECT ON db.table TO exporter; +``` + +- テーブル定義をコピー +```sql +select create_table_query +from system.tables +where database = 'db' and table = 'table' +``` + +### 宛先ClickHouse Cloudシステムで: + +- 宛先データベースを作成: +```sql +CREATE DATABASE db +``` + +- ソースからのCREATE TABLE文を使用して宛先を作成。 + +:::tip +CREATE文を実行するとき、ENGINEをパラメータなしのReplicatedMergeTreeに変更します。ClickHouse Cloudは常にテーブルをレプリケートし、正しいパラメータを提供します。ただし、`ORDER BY`、`PRIMARY KEY`、`PARTITION BY`、`SAMPLE BY`、`TTL`、`SETTINGS`句は保持してください。 +::: + +```sql +CREATE TABLE db.table ... +``` + +- `remoteSecure` 関数を使用して、セルフマネージドのソースからデータを取得 + +セルフマネージドのClickHouseの移行 + +```sql +INSERT INTO db.table SELECT * FROM +remoteSecure('source-hostname', db, table, 'exporter', 'password-here') +``` + +:::note +ソースシステムが外部ネットワークから利用できない場合は、データをプルするのではなくプッシュすることができます。`remoteSecure` 関数はSELECTとINSERTの両方で機能します。次のオプションをご覧ください。 +::: + +- `remoteSecure` 関数を使用して、データをClickHouse Cloudサービスにプッシュ + +セルフマネージドのClickHouseの移行 + +:::tip リモートシステムをClickHouse CloudサービスのIPアクセスリストに追加する +`remoteSecure` 関数がClickHouse Cloudサービスに接続できるように、リモートシステムのIPアドレスをIPアクセスリストで許可する必要があります。このチップの下の**IPアクセスリストの管理**を展開して詳細を確認してください。 +::: + + + +```sql +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', +'default', 'PASS') SELECT * FROM db.table +``` + +## ClickHouse Cloudサービス間の移行 + +セルフマネージドのClickHouseの移行 + +ClickHouse Cloudサービス間でデータを移行する際の例: +- 復元したバックアップからデータを移行 +- 開発サービスからステージングサービスへのデータのコピー (またはステージングから本番へ) + +この例では、二つのClickHouse Cloudサービスがあり、それらは*ソース*と*宛先*と呼ばれます。データはソースから宛先にプルされます。プッシュすることもできますが、ここでは読み取り専用ユーザーを使用するプルを示します。 + +セルフマネージドのClickHouseの移行 + +移行にはいくつかのステップがあります: +1. 一つのClickHouse Cloudサービスを*ソース*として識別し、他方を*宛先*として識別 +1. ソースサービスに読み取り専用ユーザーを追加 +1. 宛先サービスにソーステーブル構造を複製 +1. 一時的にソースサービスのIPアクセスを許可 +1. ソースから宛先にデータをコピー +1. 宛先でIPアクセスリストを再設定 +1. ソースサービスから読み取り専用ユーザーを削除 + +#### ソースサービスに読み取り専用ユーザーを追加 + +- ソーステーブル (`db.table` という例) を読み取る権限を持つ読み取り専用ユーザーを追加 + ```sql + CREATE USER exporter + IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' + SETTINGS readonly = 1; + ``` + + ```sql + GRANT SELECT ON db.table TO exporter; + ``` + +- テーブル定義をコピー + ```sql + select create_table_query + from system.tables + where database = 'db' and table = 'table' + ``` + +#### 宛先サービスでテーブル構造を複製 + +宛先にデータベースが存在しない場合は、作成します: + +- 宛先データベースを作成: + ```sql + CREATE DATABASE db + ``` + +- ソースからのCREATE TABLE文を使用して宛先を作成。 + + 宛先でソースからの`select create_table_query...` の出力を使用してテーブルを作成します: + + ```sql + CREATE TABLE db.table ... + ``` + +#### ソースサービスへのリモートアクセスを許可 + +ソースから宛先へデータをプルするには、ソースサービスが接続を許可する必要があります。一時的にソースサービスの「IPアクセスリスト」機能を無効にします。 + +:::tip +ソースClickHouse Cloudサービスを引き続き使用する場合、データを移行する前に既存のIPアクセスリストをJSONファイルにエクスポートすると、移行後にアクセスリストをインポートできます。 +::: + +許可リストを変更し、一時的に**Anywhere**からのアクセスを許可します。[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントで詳細を確認してください。 + +#### ソースから宛先へのデータコピー + +- `remoteSecure` 関数を使用して、ソースClickHouse Cloudサービスからデータをプルします + 宛先に接続します。このコマンドを宛先ClickHouse Cloudサービスで実行してください: + + ```sql + INSERT INTO db.table SELECT * FROM + remoteSecure('source-hostname', db, table, 'exporter', 'password-here') + ``` + +- 宛先サービスでデータを確認 + +#### ソースでIPアクセスリストを再設定 + + 以前にアクセスリストをエクスポートしておいた場合は、**Share**を使用して再インポートできます。そうでない場合は、アクセスリストにエントリを再追加します。 + +#### 読み取り専用の`exporter`ユーザーを削除 + +```sql +DROP USER exporter +``` + +- サービスIPアクセスリストをスイッチしてアクセスを制限 + diff --git a/docs/ja/integrations/migration/etl-tool-to-clickhouse.md b/docs/ja/integrations/migration/etl-tool-to-clickhouse.md new file mode 100644 index 00000000000..945593e038c --- /dev/null +++ b/docs/ja/integrations/migration/etl-tool-to-clickhouse.md @@ -0,0 +1,18 @@ +--- +sidebar_label: サードパーティETLツールの使用 +sidebar_position: 20 +keywords: [clickhouse, 移行, データ, etl, elt, clickhouse-local, clickhouse-client] +slug: '/ja/cloud/migration/etl-tool-to-clickhouse' +--- + +# サードパーティETLツールの使用 + +セルフマネージドClickHouseの移行 + +外部データソースからClickHouseにデータを移動するには、多くの人気のあるETLおよびELTツールの1つを使用するのが最適な選択です。以下のツールに関するドキュメントを用意しています: + +- [Airbyte](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) +- [dbt](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md) +- [Vector](/docs/ja/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) + +しかし、ClickHouseと統合する多くの他のETL/ELTツールも存在するため、お気に入りのツールのドキュメントで詳細を確認してください。 diff --git a/docs/ja/integrations/migration/images/Migrations.excalidraw b/docs/ja/integrations/migration/images/Migrations.excalidraw new file mode 100644 index 00000000000..096af376c09 --- /dev/null +++ b/docs/ja/integrations/migration/images/Migrations.excalidraw @@ -0,0 +1,18373 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 5186, + "versionNonce": 1551391109, + "isDeleted": false, + "id": "eocVgawgE_cK_xyDcJv0W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2842.709746204976, + "y": -274.4604295479421, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1763430219, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5105, + "versionNonce": 150449483, + "isDeleted": false, + "id": "sTZiJekZz3cYz0HSNumAX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2757.533239606998, + "y": -398.61601543652614, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 583261925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5507, + "versionNonce": 1704780005, + "isDeleted": false, + "id": "GyPY_fHYVk-JJoS-CJBXo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2893.2381823224323, + "y": -307.6648304251157, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1125756395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5436, + "versionNonce": 2009713643, + "isDeleted": false, + "id": "JdoN_xAxm5QVElBgTICsV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2815.280023741235, + "y": -363.9679449559899, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1460714053, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5218, + "versionNonce": 460946501, + "isDeleted": false, + "id": "JBfYHzpGaD-BRmURVWyye", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2618.9409576848384, + "y": -280.23510796135633, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1797437579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4484, + "versionNonce": 270472843, + "isDeleted": false, + "id": "ijf3lbGjrEa38HDrGEUaD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2874.88135150373, + "y": -289.9208719248545, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1475029413, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4184, + "versionNonce": 1441508261, + "isDeleted": false, + "id": "2-_WUjfO_mVgZHDNNpYT4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2703.458111081255, + "y": -337.601508333757, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1324445483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4383, + "versionNonce": 280104235, + "isDeleted": false, + "id": "QHMoWc59857j-vkBXHbUi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2650.3358601947557, + "y": -279.56542918561354, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1719708933, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4276, + "versionNonce": 354479877, + "isDeleted": false, + "id": "uF0nkkqh1ak24hajhXNfQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2778.384825438113, + "y": -359.17132004254927, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1089491403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4255, + "versionNonce": 2095919051, + "isDeleted": false, + "id": "CRELD-37FidPGtMVIrm3F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2830.8724634921937, + "y": -327.65021775716195, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1112458341, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7338, + "versionNonce": 2006369893, + "isDeleted": false, + "id": "AB6imHeOWWcp-MfhCKiHI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2806.4435724536715, + "y": -269.48501592462526, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1647960171, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7155, + "versionNonce": 116063851, + "isDeleted": false, + "id": "3Ouuh95Kcw0u-fPjBrk7W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2737.9568731650625, + "y": -288.2714401303292, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1596125125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 681, + "versionNonce": 1880797637, + "isDeleted": false, + "id": "zbuG_G2z3ThbiIoyaxsn8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2695.5133568786378, + "y": 31.82104502994298, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 1285069579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "eocVgawgE_cK_xyDcJv0W" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7565, + "versionNonce": 964032779, + "isDeleted": false, + "id": "udUxQz16RLyBPUa0j18RV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2677.281267769821, + "y": -72.82190872671163, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 1528475429, + "groupIds": [ + "w2iuN8CTMVUY9BjPJRX8u" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "line", + "version": 6624, + "versionNonce": 1003106597, + "isDeleted": false, + "id": "El4-N3Ym3m9sIeV9AGvEO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2773.0104719014153, + "y": 70.28378667186553, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 2089222571, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4414, + "versionNonce": 1644732331, + "isDeleted": false, + "id": "gDp4XjcF_Xd0Q9h5hyO-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2774.2247959700353, + "y": 127.78800947936907, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 883131013, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7420, + "versionNonce": 403883141, + "isDeleted": false, + "id": "1gOaZ_nGpKcOwWSpadN6y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2776.944777815187, + "y": 56.294857446613605, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 2066715723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4513, + "versionNonce": 986542667, + "isDeleted": false, + "id": "M35kZCSgO9fZjHLn4yCEC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2773.778389975453, + "y": 184.60078512451946, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1081797093, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8065, + "versionNonce": 951184357, + "isDeleted": false, + "id": "WK9ynhswSkPGfIyLfT4b0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2710.341212876384, + "y": 102.73601224218874, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 1215091435, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8118, + "versionNonce": 1419702507, + "isDeleted": false, + "id": "MSirq4VMsqUkQnwOfAPBY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2761.8606995699693, + "y": 155.20284832872676, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 1605264709, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5154, + "versionNonce": 2109024069, + "isDeleted": false, + "id": "Rl4NqisZYihc_o2Hk139d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1757.3637013374182, + "y": -261.9365779856453, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 80297355, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "WhT5JlYLdzlyd9Pi3bUto", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5076, + "versionNonce": 1091017611, + "isDeleted": false, + "id": "FhjjWIjuQGmHe4su5k2Xz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1673.0257465779605, + "y": -386.0921638742293, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1973122213, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5472, + "versionNonce": 1769600677, + "isDeleted": false, + "id": "icSPEVTd0G4t84Cwf0bC-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1807.8921374548745, + "y": -295.1409788628189, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1535071275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5405, + "versionNonce": 2084696619, + "isDeleted": false, + "id": "LaB84OqavriGXtx-shONK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1729.933978873677, + "y": -351.44409339369304, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 502241285, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5187, + "versionNonce": 1454234117, + "isDeleted": false, + "id": "x3B7uQvD162Iwb0kqwlJb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1533.5949128172806, + "y": -267.7112563990595, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 746165963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4453, + "versionNonce": 389575883, + "isDeleted": false, + "id": "j6uIEGeWZsUqlBoW8dB0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1789.5353066361722, + "y": -277.39702036255767, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 581455717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4154, + "versionNonce": 1850626405, + "isDeleted": false, + "id": "i0FZzUR07Iiy9zPcP5jL5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1618.1120662136973, + "y": -325.07765677146017, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1985119595, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4352, + "versionNonce": 562406251, + "isDeleted": false, + "id": "1xtlEvx9E5nqa3-paE4h9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1564.9898153271943, + "y": -267.0415776233167, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 840112837, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4245, + "versionNonce": 1571347653, + "isDeleted": false, + "id": "9w-kLgt59DSi5zp2Ch9De", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1693.038780570555, + "y": -346.6474684802524, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 5545995, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4224, + "versionNonce": 1400110603, + "isDeleted": false, + "id": "ISaEXrsMC_ePrLeAywQjz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1745.5264186246359, + "y": -315.1263661948651, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1422752293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7308, + "versionNonce": 1281031205, + "isDeleted": false, + "id": "Q_otGc_AL1WdWBY571rsI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1721.0975275861138, + "y": -256.9611643623284, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1148872363, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7125, + "versionNonce": 2013136043, + "isDeleted": false, + "id": "mUdjt5JX1AzOmUxfCOeGS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1652.6108282975047, + "y": -275.74758856803237, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 600108421, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 616, + "versionNonce": 307376005, + "isDeleted": false, + "id": "WhT5JlYLdzlyd9Pi3bUto", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1610.16731201108, + "y": 44.34489659223982, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 426662219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "Rl4NqisZYihc_o2Hk139d" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7682, + "versionNonce": 382613323, + "isDeleted": false, + "id": "T_BVRKbMs0CxFyatCwNDo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1584.0047749786709, + "y": -132.42288696904507, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 75, + "seed": 1043789029, + "groupIds": [ + "Z_jvRKw_9nTn-fN3zJ6jR" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "pull data with\nremoteSecure\n", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pull data with\nremoteSecure\n" + }, + { + "type": "line", + "version": 6593, + "versionNonce": 768341733, + "isDeleted": false, + "id": "9x1I_AbIM-1bYyNyxe0Up", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1687.6644270338556, + "y": 82.80763823416419, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 478869483, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4383, + "versionNonce": 1581192683, + "isDeleted": false, + "id": "ln1F2DhOgCovBFTa3Frmc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1688.8787511024757, + "y": 140.31186104166773, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 2142310469, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7390, + "versionNonce": 2035667525, + "isDeleted": false, + "id": "G5Sp4Zc0Bs8Y0rXgm5Es1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1691.5987329476275, + "y": 68.81870900891226, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1541063307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4482, + "versionNonce": 1297817739, + "isDeleted": false, + "id": "Sr7DK7mCEjE6OERpLkQa-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1688.4323451078935, + "y": 197.12463668681812, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1980809125, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8035, + "versionNonce": 567099813, + "isDeleted": false, + "id": "3WZkbAKG-wCOldcaclPZZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1624.9951680088243, + "y": 115.2598638044874, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 1075329323, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8088, + "versionNonce": 501012267, + "isDeleted": false, + "id": "3DzCSsBHphljQROyKj5Qm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1676.5146547024096, + "y": 167.72669989102542, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 394494725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5189, + "versionNonce": 1549780229, + "isDeleted": false, + "id": "u_-uiKhnzobkX8T9ukZmq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1145.2510040923016, + "y": -252.7058343503686, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 917363659, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "Qzp2LNJVkLt1RJnx6nWoY", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5110, + "versionNonce": 1848555979, + "isDeleted": false, + "id": "tSapz3XOF_PQIRt5yJxbN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1060.0744974943236, + "y": -376.86142023895263, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 948361829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5506, + "versionNonce": 1552604261, + "isDeleted": false, + "id": "NxwoJzgeWmSj09AEdK2Mf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1195.779440209758, + "y": -285.9102352275422, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 464923243, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5439, + "versionNonce": 728451179, + "isDeleted": false, + "id": "_O7ylbKjzJpy7H68b0hEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1117.8212816285604, + "y": -342.21334975841637, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1105741253, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5221, + "versionNonce": 169609157, + "isDeleted": false, + "id": "_-xAWwWHtGgybNXX4g82Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -921.482215572164, + "y": -258.4805127637828, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1677436171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4487, + "versionNonce": 995951371, + "isDeleted": false, + "id": "suC9KO1YfMU2mqA6jR2k2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1177.4226093910556, + "y": -268.166276727281, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 650462501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4189, + "versionNonce": 1999685413, + "isDeleted": false, + "id": "TVFyNDR1jkMdLunKsAILq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1005.9993689685807, + "y": -315.8469131361835, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 116968363, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4386, + "versionNonce": 1719560619, + "isDeleted": false, + "id": "x8pysprjdXw4LXOaRj-yK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -952.8771180820777, + "y": -257.81083398804003, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 445339781, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4279, + "versionNonce": 372677253, + "isDeleted": false, + "id": "Scw7oQwCDZCupck6Ohjze", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1080.9260833254384, + "y": -337.41672484497576, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 685252171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4258, + "versionNonce": 33160267, + "isDeleted": false, + "id": "XW86ilQOOHjHpIXKfagrJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1133.4137213795193, + "y": -305.89562255958845, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 116916197, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7343, + "versionNonce": 803930597, + "isDeleted": false, + "id": "ei-HgI1Ngrq16it8ioscm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1108.9848303409972, + "y": -247.73042072705175, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 74718443, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7160, + "versionNonce": 1504328427, + "isDeleted": false, + "id": "mLI03EMP_MlhZ9xVv8Ebn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1040.498131052388, + "y": -266.5168449327557, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1108917061, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 686, + "versionNonce": 425426245, + "isDeleted": false, + "id": "Qzp2LNJVkLt1RJnx6nWoY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -998.0546147659634, + "y": 53.57564022751467, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 358041483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155348, + "gap": 23.15195627043613, + "elementId": "u_-uiKhnzobkX8T9ukZmq" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7741, + "versionNonce": 1511630219, + "isDeleted": false, + "id": "F0P9ewab_cGXeVa_S24JB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -976.8352852052221, + "y": 8.516873875832971, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 75, + "seed": 72026789, + "groupIds": [ + "poP2XKPcypx4veilY02Nq" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "push data with\nremoteSecure\n", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "push data with\nremoteSecure\n" + }, + { + "type": "line", + "version": 6627, + "versionNonce": 702909605, + "isDeleted": false, + "id": "kF504rmjDJYjNm1dxF6Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1075.5517297887354, + "y": 92.03838186943904, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 29105707, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4417, + "versionNonce": 2055388203, + "isDeleted": false, + "id": "ZH7P7PZtdtIfH6qJZyyNm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1076.7660538573555, + "y": 149.54260467694257, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 507276805, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7425, + "versionNonce": 1899409413, + "isDeleted": false, + "id": "oozdvqxDuu2ORxX7UeIA3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1079.486035702511, + "y": 78.04945264418711, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1150099659, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4516, + "versionNonce": 1724907211, + "isDeleted": false, + "id": "tOm4XoP6DuVVQK2K56LOE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1076.3196478627733, + "y": 206.35538032209297, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1860855141, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8070, + "versionNonce": 759981925, + "isDeleted": false, + "id": "q89ljFsdB2yUYTrPK8XAd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1012.8824707637041, + "y": 124.49060743976224, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 392482667, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8123, + "versionNonce": 1771826539, + "isDeleted": false, + "id": "vmd-fNJzjeCXPn6ynHcjy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1064.4019574572894, + "y": 176.9574435263021, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 430076101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5340, + "versionNonce": 7615173, + "isDeleted": false, + "id": "bnpnAwTJnvGRDpq-8H6T-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1472.8303859983316, + "y": -292.15458962978846, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 479046155, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5263, + "versionNonce": 372312075, + "isDeleted": false, + "id": "HHJx4DC7seOBEmq6s6fB0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1558.0068925963096, + "y": -416.3101755183725, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 2080509989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5660, + "versionNonce": 1733005861, + "isDeleted": false, + "id": "GSa1VYpyUjmVoVOwxwJN8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1422.3019498808753, + "y": -325.3589905069621, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1224880299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5593, + "versionNonce": 847892139, + "isDeleted": false, + "id": "C6CpZKvDq0iL-6dRTAHoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1500.2601084620728, + "y": -381.6621050378362, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1677116293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5375, + "versionNonce": 1858078085, + "isDeleted": false, + "id": "UGXmM8ucVPa0kyo3UCyJq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1696.5991745184692, + "y": -297.9292680432063, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 242017099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4641, + "versionNonce": 1632682315, + "isDeleted": false, + "id": "ETMfS6RcMoYiZdlNRXeAo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1440.6587806995703, + "y": -307.6150320067045, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 96340709, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4343, + "versionNonce": 705629413, + "isDeleted": false, + "id": "hfvCtJ700vnry5KILpb-5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.0820211220525, + "y": -355.295668415607, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1160266219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "V88bOY9ZubeXG4qX1OI5_", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4542, + "versionNonce": 199253995, + "isDeleted": false, + "id": "RCxiSv0zMo3ndKzZsBAih", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1665.4389237700925, + "y": -297.39775277623085, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 837117509, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "V88bOY9ZubeXG4qX1OI5_", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4433, + "versionNonce": 1757816901, + "isDeleted": false, + "id": "1JzKblajkQOfcg5CHbIY8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1537.1553067651948, + "y": -376.86548012439926, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1446956171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4415, + "versionNonce": 205728395, + "isDeleted": false, + "id": "9Vlq7mUBfahl8YSdJIOxR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1484.667668711114, + "y": -345.34437783901194, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1263162789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7496, + "versionNonce": 750966693, + "isDeleted": false, + "id": "3uA3h2WT8qCj-gW9xmOWJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1509.096559749636, + "y": -287.1791760064716, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 627770155, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7312, + "versionNonce": 389259563, + "isDeleted": false, + "id": "ob6WnA_AmpL_lsbkEtUNu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1577.5832590382452, + "y": -305.78515545770097, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 2098878725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6313, + "versionNonce": 1613929221, + "isDeleted": false, + "id": "Igw1HfRPwlhyp17tCUbPI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.7692621506467, + "y": 278.4652444342846, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 991389131, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4105, + "versionNonce": 1713128395, + "isDeleted": false, + "id": "s2OyvZ10eSEAL0vmsshSB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.3851770212677, + "y": 299.760970549376, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 819130469, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7112, + "versionNonce": 1267921509, + "isDeleted": false, + "id": "KrDr7i37_0Kxs03RvEl15", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.5851766978558, + "y": 273.07196242930695, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 777942123, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4205, + "versionNonce": 555192939, + "isDeleted": false, + "id": "jThqKMmpWCJnOGfX0PEOS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.4839813555045, + "y": 320.80254944088847, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1145150405, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7141, + "versionNonce": 1269915077, + "isDeleted": false, + "id": "S1jOdSJMTbq9wgWpy9fwM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1493.0954385670557, + "y": 365.0270381715054, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 326, + "height": 91, + "seed": 1326100235, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 78, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + }, + { + "type": "text", + "version": 8746, + "versionNonce": 149949707, + "isDeleted": false, + "id": "S-sZwKi50-fROp5QFyjP7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1677.0535132131336, + "y": 82.01172657008647, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 2139347749, + "groupIds": [ + "0s7_yes783KRQ5j50YqxQ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "integration \ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "integration \ntable function" + }, + { + "type": "arrow", + "version": 849, + "versionNonce": 1202412837, + "isDeleted": false, + "id": "5tRpfhGO8OWl6LGOfw5wn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1641.2572484387238, + "y": 245.87294916599603, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.5211604095256916, + "height": 168.25096705689975, + "seed": 261526955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.5211604095256916, + -168.25096705689975 + ] + ] + }, + { + "type": "arrow", + "version": 1034, + "versionNonce": 1629500331, + "isDeleted": false, + "id": "V88bOY9ZubeXG4qX1OI5_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1640.58312300724, + "y": -19.02142211849423, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 1258761861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658855, + "gap": 31.83950144560427, + "elementId": "hfvCtJ700vnry5KILpb-5" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9182, + "versionNonce": 1726902405, + "isDeleted": false, + "id": "_3nfG2YPKVAhsRCxBr43E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1505.3776948841005, + "y": 4.141482113112943, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 791455819, + "groupIds": [ + "4I0L8FmtpVsxnNC_Fy2mw", + "veL8ggdzzKtJ7oWiaquYo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "5tRpfhGO8OWl6LGOfw5wn", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7538, + "versionNonce": 433227339, + "isDeleted": false, + "id": "gpKHumwb4BuS1AygU0vL2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1519.521153854581, + "y": 14.599447256006897, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 629741029, + "groupIds": [ + "veL8ggdzzKtJ7oWiaquYo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7799, + "versionNonce": 121116645, + "isDeleted": false, + "id": "CDx2eRTNYvC2evLn9UA9Y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1666.8904060179666, + "y": -67.1317816833689, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 598173419, + "groupIds": [ + "QlLkMVTnyWZ9AaG1CZkul" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5360, + "versionNonce": 971080939, + "isDeleted": false, + "id": "Y9Xqr6Hy5XTR71BUgQgtI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2038.3863150015131, + "y": -266.15304282011493, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1511461189, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5284, + "versionNonce": 1922421573, + "isDeleted": false, + "id": "89UPmv7lFKYI3Dfcrz9PT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2123.562821599491, + "y": -390.30862870869896, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1133597067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5680, + "versionNonce": 148352907, + "isDeleted": false, + "id": "XC6beEp1xJkgCVgVYEuBd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1987.8578788840568, + "y": -299.3574436972849, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1980670117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5613, + "versionNonce": 1432691365, + "isDeleted": false, + "id": "3lVFjqbVZDDRNRgWp43yq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2065.8160374652543, + "y": -355.6605582281627, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 807725099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5395, + "versionNonce": 2028963371, + "isDeleted": false, + "id": "U9hirGwh1u7iI66-g7-3N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2262.1551035216507, + "y": -271.92772123352916, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 2132624389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4661, + "versionNonce": 1951630853, + "isDeleted": false, + "id": "UaM69jwZZ6lRQlZOYy7cP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2006.2147097027519, + "y": -281.61348519702733, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2135730891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4364, + "versionNonce": 1360234699, + "isDeleted": false, + "id": "Uxld2hRW7kAuMwWQ4lVbD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2177.637950125234, + "y": -329.29412160593347, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1765833573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4563, + "versionNonce": 576617829, + "isDeleted": false, + "id": "whBDXrKjTQ3QWHPQJZAgT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2230.994852773274, + "y": -271.3962059665573, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 631445867, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4453, + "versionNonce": 383661931, + "isDeleted": false, + "id": "k783u8fAZ_mgwtupTn84w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2102.7112357683764, + "y": -350.8639333147221, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1288029893, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4435, + "versionNonce": 1993574597, + "isDeleted": false, + "id": "w-pb3wv9qjcYWq0jmnUrP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2050.2235977142955, + "y": -319.3428310293384, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 544388107, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7517, + "versionNonce": 949621259, + "isDeleted": false, + "id": "VpBlYoCVWDmjl-YigSE1z", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2074.6524887528176, + "y": -261.1776291967981, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1548396069, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7333, + "versionNonce": 1129326629, + "isDeleted": false, + "id": "CD67JjmSWvTnG5NIzlLt2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2143.1391880414267, + "y": -279.7836086480238, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1605761707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6333, + "versionNonce": 2000787627, + "isDeleted": false, + "id": "RXPCvzbV9dqKVVmm-1iJq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2179.325191153828, + "y": 304.4667912439618, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 448567685, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4125, + "versionNonce": 1237441413, + "isDeleted": false, + "id": "zjFANKNYkK2BOd3X8Dnph", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2178.9411060244493, + "y": 325.7625173590495, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1880583499, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7133, + "versionNonce": 276777803, + "isDeleted": false, + "id": "cX9egqgHLeCp8W9PSgELZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2178.1411057010373, + "y": 299.0735092389805, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1364795621, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4225, + "versionNonce": 845554405, + "isDeleted": false, + "id": "TYS5fmiO2X1phq2TnRClT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2179.039910358686, + "y": 346.804096250562, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1693551595, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7211, + "versionNonce": 682469867, + "isDeleted": false, + "id": "d48czVWIK1q_na8G8Qtiz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2155.187992491814, + "y": 393.7710367462041, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 114, + "height": 46, + "seed": 1169013829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "MySQL", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL" + }, + { + "type": "arrow", + "version": 869, + "versionNonce": 1103789637, + "isDeleted": false, + "id": "Ti6G6VOeKpQE33Ru5yLlo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2206.8131774419053, + "y": 271.8744959756732, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.5211604095256916, + "height": 168.25096705689975, + "seed": 38721163, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.5211604095256916, + -168.25096705689975 + ] + ] + }, + { + "type": "arrow", + "version": 1075, + "versionNonce": 1960260747, + "isDeleted": false, + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2206.1390520104214, + "y": 6.980124691181118, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 798485413, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658858, + "gap": 31.839501445607468, + "elementId": "Uxld2hRW7kAuMwWQ4lVbD" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9203, + "versionNonce": 1322020261, + "isDeleted": false, + "id": "Q7DMddDx1R1RM3Cwr97KG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2070.933623887282, + "y": 30.14302892278647, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 652856619, + "groupIds": [ + "X12ICvFt26Q_43ALKdjMs", + "uZ7ohDSs6TS9Y-UYFGOs6" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "Ti6G6VOeKpQE33Ru5yLlo", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7559, + "versionNonce": 615934763, + "isDeleted": false, + "id": "9xrFHPBViBJps8xzsbYw_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2085.0770828577624, + "y": 40.600994065680425, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 1866804997, + "groupIds": [ + "uZ7ohDSs6TS9Y-UYFGOs6" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7838, + "versionNonce": 2023321861, + "isDeleted": false, + "id": "RLoWdGCEB3nVJ-UXuqLXB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.446335021148, + "y": -35.40711569906671, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 1982656459, + "groupIds": [ + "DOzl9sP535w5t2EIYZN9Y" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5453, + "versionNonce": 213241291, + "isDeleted": false, + "id": "QLRQNqM0DekkRV72VDElL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2710.962700345579, + "y": -307.19632612158784, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 53675621, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5378, + "versionNonce": 481232997, + "isDeleted": false, + "id": "JskpHRhct7wBEOBorxYoV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2796.139206943557, + "y": -431.3519120101719, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1110621803, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5773, + "versionNonce": 267377771, + "isDeleted": false, + "id": "9b3mEEiZk47sVt5Wr9F5t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2660.4342642281226, + "y": -340.4007269987578, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1043263941, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5706, + "versionNonce": 215659461, + "isDeleted": false, + "id": "zqUP79CRucvginaHyPgC3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2738.39242280932, + "y": -396.7038415296356, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 902150411, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5488, + "versionNonce": 1244600075, + "isDeleted": false, + "id": "H-uyNDWn1T1Pa1der-m1c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2934.7314888657165, + "y": -312.97100453500207, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1029075237, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4754, + "versionNonce": 87683877, + "isDeleted": false, + "id": "-A3yB5iFEO21LAiMEYdWE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2678.7910950468176, + "y": -322.65676849850024, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1046503339, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4458, + "versionNonce": 2045640107, + "isDeleted": false, + "id": "k41TkBJzazUTgviBbyZxh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2850.2143354693, + "y": -370.3374049074064, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 504824965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4657, + "versionNonce": 1647986309, + "isDeleted": false, + "id": "lPNF9B7qRFiDLbPpPVwnn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2903.57123811734, + "y": -312.43948926803023, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 908931659, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4546, + "versionNonce": 710348875, + "isDeleted": false, + "id": "vDJ3KEtLjVJPfAp6yFBtg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2775.287621112442, + "y": -391.907216616195, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1949182949, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4528, + "versionNonce": 379137509, + "isDeleted": false, + "id": "EKa41LuMplksaAk8BpXDo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2722.7999830583612, + "y": -360.3861143308113, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1309061355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7611, + "versionNonce": 491048683, + "isDeleted": false, + "id": "EhaoZGhA3P_mIUh2FUSZv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.2288740968834, + "y": -302.220912498271, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 2141808453, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7427, + "versionNonce": 1633954117, + "isDeleted": false, + "id": "-vRDnb_uQe56L_f9fi3-R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2815.7155733854925, + "y": -320.8268919494967, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 930569099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6574, + "versionNonce": 1967241611, + "isDeleted": false, + "id": "9MMeH5E8djM0p03TcIQ0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.783341449118, + "y": 321.1264044694417, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 585512613, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4366, + "versionNonce": 1140373669, + "isDeleted": false, + "id": "sWDXZfkaJyPY2d6aTcBke", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.399256319739, + "y": 342.42213058452944, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 247050795, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7375, + "versionNonce": 529027115, + "isDeleted": false, + "id": "c4HBnBmcMOU0sHu8O5mkA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2848.599255996327, + "y": 315.7331224644604, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 412228101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4466, + "versionNonce": 939809797, + "isDeleted": false, + "id": "BjQvC8uOs8L7_2OFfRaSo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.4980606539757, + "y": 363.4637094760419, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 79181003, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7461, + "versionNonce": 2114130635, + "isDeleted": false, + "id": "uZ57dMk6euTNZSrBOdeYj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2826.266764169861, + "y": 410.4567813983231, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 114, + "height": 46, + "seed": 1772786021, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "MySQL", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL" + }, + { + "type": "text", + "version": 9094, + "versionNonce": 629445477, + "isDeleted": false, + "id": "RLLvzclZKk2Y7wCoZXt7W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2913.2424719004193, + "y": 54.49551966997387, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 187, + "height": 25, + "seed": 1225614187, + "groupIds": [ + "G9KYceRCtj8BCf9udXOjc" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "jdbc table function", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "jdbc table function" + }, + { + "type": "arrow", + "version": 1216, + "versionNonce": 1363968363, + "isDeleted": false, + "id": "RXRWX_I5avcBD3syyLpzW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2875.213477889116, + "y": 294.4659430489519, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.0821727133607055, + "height": 120.69869142340576, + "seed": 595401925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.10198627796379695, + "gap": 13.013592838166915, + "elementId": "AQ7Eq4Z-ixVZgP25gx4qf" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.0821727133607055, + -120.69869142340576 + ] + ] + }, + { + "type": "arrow", + "version": 1264, + "versionNonce": 415686341, + "isDeleted": false, + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2878.715437354487, + "y": -34.063158610291794, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 872660491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658853, + "gap": 31.83950144560427, + "elementId": "k41TkBJzazUTgviBbyZxh" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9298, + "versionNonce": 1655643147, + "isDeleted": false, + "id": "XIU7OgxZhON1vg7mGWK4K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2743.510009231348, + "y": -10.90025437868644, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 1302805541, + "groupIds": [ + "rItIqxNjuNH8uQjDDwqEh", + "z8lSyLtuUq2RjhK3vt_ki" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "RXRWX_I5avcBD3syyLpzW", + "type": "arrow" + }, + { + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7653, + "versionNonce": 946388517, + "isDeleted": false, + "id": "glOJivpvcygQ5DiFZO_Bx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2757.653468201828, + "y": -0.4422892357924866, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 815121579, + "groupIds": [ + "z8lSyLtuUq2RjhK3vt_ki" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7914, + "versionNonce": 1847943851, + "isDeleted": false, + "id": "1pZvoCk_Fpp8xhXPSb4w1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2905.022720365214, + "y": -82.17351817516646, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 538341253, + "groupIds": [ + "SgAZ3oMeBmqZk2Rjv2wES" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 9476, + "versionNonce": 2069344645, + "isDeleted": false, + "id": "AQ7Eq4Z-ixVZgP25gx4qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2744.4668338726988, + "y": 105.9007050823675, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 1718482763, + "groupIds": [ + "Mrsd76BfO04f1N4VjwGb_", + "C4NNTepDJg6S_j-UE6oOv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "RXRWX_I5avcBD3syyLpzW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7846, + "versionNonce": 1280955723, + "isDeleted": false, + "id": "i8HTBNgjAKi9zonBo2CCS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.285848004449, + "y": 116.17779521062039, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 181, + "height": 34, + "seed": 2030581477, + "groupIds": [ + "C4NNTepDJg6S_j-UE6oOv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "JDBC Bridge", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "JDBC Bridge" + }, + { + "type": "text", + "version": 9263, + "versionNonce": 517028069, + "isDeleted": false, + "id": "XkvZi9TJUONQJEKIa5q7M", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2911.32246934891, + "y": 171.4618948866555, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 25, + "seed": 602330603, + "groupIds": [ + "wec4QXViWCf2eUO2oJME9" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "MySQL JDBC driver", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL JDBC driver" + }, + { + "type": "arrow", + "version": 1453, + "versionNonce": 1554445291, + "isDeleted": false, + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2878.6953643592533, + "y": 104.42438689604387, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.2500900222476048, + "height": 52.22630397311332, + "seed": 319427141, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.13195639242293994, + "gap": 11.753408314576518, + "elementId": "i8HTBNgjAKi9zonBo2CCS" + }, + "endBinding": { + "focus": 0.08460500628444809, + "gap": 8.245383596607098, + "elementId": "XIU7OgxZhON1vg7mGWK4K" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.2500900222476048, + -52.22630397311332 + ] + ] + }, + { + "type": "text", + "version": 7887, + "versionNonce": 1549980741, + "isDeleted": false, + "id": "dksJxnPJX1FBxQP0ApYfr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2237.965571990844, + "y": 105.16392976127827, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 134930571, + "groupIds": [ + "7yOV8wGEwhUqtHYeGO88h" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "mysql\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "mysql\ntable function" + }, + { + "type": "rectangle", + "version": 5586, + "versionNonce": 790052491, + "isDeleted": false, + "id": "7VdIZrL59PIsP71N1QzeJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3411.669643334031, + "y": -271.35471878549833, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 2063172005, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5508, + "versionNonce": 1609171877, + "isDeleted": false, + "id": "nSgv45NFeLQ-bqcIzf0hj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3326.493136736053, + "y": -395.51030467408236, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1821677355, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5902, + "versionNonce": 1852126507, + "isDeleted": false, + "id": "iiPkjs4Cho1bcLMTDnnuf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3462.1980794514875, + "y": -304.5591196626756, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1174668549, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5835, + "versionNonce": 2106869509, + "isDeleted": false, + "id": "XM_rwAZojOUqEn-QL-LTR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3384.23992087029, + "y": -360.8622341935461, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 267286987, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5617, + "versionNonce": 167466955, + "isDeleted": false, + "id": "l1k49jq0YF3UgAAAkY4Yw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3187.9008548138936, + "y": -277.12939719891256, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 128392293, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4883, + "versionNonce": 668933733, + "isDeleted": false, + "id": "hc2CNF7LyvvFjKUOBTDOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3443.841248632785, + "y": -286.81516116241073, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2134050923, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4586, + "versionNonce": 536094315, + "isDeleted": false, + "id": "AHCGqMCshju3TA4qrVVu8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3272.4180082103103, + "y": -334.49579757131687, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 128993221, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4786, + "versionNonce": 630720965, + "isDeleted": false, + "id": "8UfeXjyv1bn1axxHip1Dq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3219.2957573238073, + "y": -276.4597184231734, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1076675339, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4675, + "versionNonce": 656023819, + "isDeleted": false, + "id": "6tFsdZeQfqqJ69y4vuJ1Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3347.344722567168, + "y": -356.0656092801055, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 943523621, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4654, + "versionNonce": 131893541, + "isDeleted": false, + "id": "CzE3x9ZyOtv3cmjUXKtQU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3399.832360621249, + "y": -324.5445069947218, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 995502507, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7740, + "versionNonce": 1491584939, + "isDeleted": false, + "id": "Gq3mlAQK143s3dN97AB6t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3375.4034695827268, + "y": -266.3793051621815, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1807407749, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7558, + "versionNonce": 1612323973, + "isDeleted": false, + "id": "Rt6mXmiq9xOLhnVdvSimd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3307.733963257864, + "y": -284.7681760341711, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1708768331, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 988, + "versionNonce": 1535613515, + "isDeleted": false, + "id": "Ia_We5W4appXeHh8tUHML", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3052.171869192357, + "y": -230.066113271605, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 145.7814330403453, + "height": 2.387487505808167, + "seed": 1256669669, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.1470189008902115, + "gap": 21.42349255452723, + "elementId": "8UfeXjyv1bn1axxHip1Dq" + }, + "endBinding": { + "focus": -0.054202581905544625, + "gap": 13.318412802223108, + "elementId": "GyPY_fHYVk-JJoS-CJBXo" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.7814330403453, + -2.387487505808167 + ] + ] + }, + { + "type": "text", + "version": 7677, + "versionNonce": 906904549, + "isDeleted": false, + "id": "sj3g87N1YYUr9L-hK7w8X", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3054.5375325110317, + "y": -302.35859420909765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 730987243, + "groupIds": [ + "HZcAgq3ZliGzaHNhBeld1" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5251, + "versionNonce": 735320299, + "isDeleted": false, + "id": "hdWykLSX5pm3Kznfr37KP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2316.457289635463, + "y": -258.6342258254499, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 181386565, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "l1yPE0_hFtqgj_iTE6pr_", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5170, + "versionNonce": 1036418885, + "isDeleted": false, + "id": "JkHi4SEll_ZZFKZyTV_Gf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2231.280783037485, + "y": -382.78981171403393, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 420046219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5572, + "versionNonce": 1196934027, + "isDeleted": false, + "id": "p8hfQELunDW-RcloGPmxy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2366.9857257529193, + "y": -291.8386267026235, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1657916581, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5500, + "versionNonce": 1302351525, + "isDeleted": false, + "id": "Z9Y6Mioy1b4frkR1g28RN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2289.027567171722, + "y": -348.14174123349767, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1165655083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5282, + "versionNonce": 374151723, + "isDeleted": false, + "id": "I5b1HaGcAJbW8nqBVfHmi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2092.6885011153254, + "y": -264.4089042388641, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1117450245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4548, + "versionNonce": 340341253, + "isDeleted": false, + "id": "fl1UhNgfYttf_53GO_Nj6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2348.628894934217, + "y": -274.0946682023623, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2093989579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4249, + "versionNonce": 362716363, + "isDeleted": false, + "id": "pIE95rc6PqwKYNe_Ayn9B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2177.205654511742, + "y": -321.7753046112648, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1210623845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4447, + "versionNonce": 247376229, + "isDeleted": false, + "id": "Hj1PTYHrR1mDh_mdYrFUP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2124.0834036252427, + "y": -263.73922546312133, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 698592619, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4340, + "versionNonce": 1088867179, + "isDeleted": false, + "id": "4OK0yV1DXeHrnrhOEJwVK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2252.1323688685998, + "y": -343.34511632005706, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1976070853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4319, + "versionNonce": 1045312709, + "isDeleted": false, + "id": "rSyo9MG4Stvbpis0T7IAj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2304.6200069226807, + "y": -311.82401403466974, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 2134951947, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7403, + "versionNonce": 1013982731, + "isDeleted": false, + "id": "bHBtQPU29vbCRgFR7A3bI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2280.1911158841585, + "y": -253.65881220213305, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 672649765, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7220, + "versionNonce": 513102885, + "isDeleted": false, + "id": "KKZBzGEThhkzasd3WFrcp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2211.7044165955494, + "y": -272.445236407837, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1671532203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 811, + "versionNonce": 1060449451, + "isDeleted": false, + "id": "l1yPE0_hFtqgj_iTE6pr_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2169.2609003091247, + "y": 47.64724875243519, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 1275348357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "hdWykLSX5pm3Kznfr37KP" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7630, + "versionNonce": 1535215493, + "isDeleted": false, + "id": "ikrVYnuIfskkjAEtLC8ts", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2151.028811200308, + "y": -56.99570500421942, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 426803531, + "groupIds": [ + "BbvhFtoTdHDywZsEGoFIC" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "line", + "version": 6688, + "versionNonce": 1021337419, + "isDeleted": false, + "id": "4rWThdkE9NcLOVotrJ6mz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2246.758015331904, + "y": 86.10999039435592, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 1422609637, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4478, + "versionNonce": 1196445413, + "isDeleted": false, + "id": "geZkKJOZdhyrggQ7qazU8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2247.972339400524, + "y": 143.61421320185946, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 705175531, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7485, + "versionNonce": 1338785259, + "isDeleted": false, + "id": "ehbDxEiRf_uFTOq1oLka9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2250.6923212456722, + "y": 72.12106116910763, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1912236101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4577, + "versionNonce": 277817925, + "isDeleted": false, + "id": "IUWTUS2AQPGLoJUpWh2rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2247.525933405942, + "y": 200.42698884700985, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 259189387, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8130, + "versionNonce": 1661159563, + "isDeleted": false, + "id": "SOGsF7zsparRJTeljGmJc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2184.0887563068727, + "y": 118.56221596468276, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 91166629, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8183, + "versionNonce": 941332901, + "isDeleted": false, + "id": "w__t4vd79SSk8wNtXWgm8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2235.608243000458, + "y": 171.02905205121897, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 510353707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5245, + "versionNonce": 473956139, + "isDeleted": false, + "id": "wZWqwlbGVmv_3REfU_-V8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 72.53530425621375, + "y": -78.33831423580341, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1498864389, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5164, + "versionNonce": 1193483525, + "isDeleted": false, + "id": "jrqM_ilDD8rJ2VVBqrBO3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 157.71181085419175, + "y": -202.49390012438744, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 811336651, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5566, + "versionNonce": 99410379, + "isDeleted": false, + "id": "vPToa6FdwoLyJdILu5COt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 22.006868138757454, + "y": -111.54271511297338, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 372191845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7_HcUZOHbIY1UTDIRXGOr", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5494, + "versionNonce": 1159935077, + "isDeleted": false, + "id": "Vfuy5whpmukORwoxPV_ZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 99.96502671995495, + "y": -167.84582964385118, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 224350827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5276, + "versionNonce": 2032431211, + "isDeleted": false, + "id": "H216n5THNRqzZzfGZOCEp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 296.30409277635135, + "y": -84.11299264921763, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 2026216901, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4542, + "versionNonce": 1844010949, + "isDeleted": false, + "id": "JWL80PaYAkMuTLBIFT13A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 40.36369895745975, + "y": -93.7987566127158, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 373280011, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4243, + "versionNonce": 1202793227, + "isDeleted": false, + "id": "OJQZgw4mHPpyoq4K3Jmyo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 211.78693937993467, + "y": -141.47939302161467, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1211604261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4441, + "versionNonce": 663953189, + "isDeleted": false, + "id": "VTcOWqSYHjLKC2Db2hVMR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 264.90919026643405, + "y": -83.4433138734712, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 779613099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4334, + "versionNonce": 638423467, + "isDeleted": false, + "id": "Od7MzAHJWoVlupwHzHs4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 136.86022502307696, + "y": -163.04920473041057, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 200454277, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4313, + "versionNonce": 948826757, + "isDeleted": false, + "id": "S_zvmjmRGJRN--_X-781R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 84.37258696899607, + "y": -131.5281024450196, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1714570827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7397, + "versionNonce": 1432626251, + "isDeleted": false, + "id": "HynFmorjXHuDafQLe1vz7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 108.8014780075182, + "y": -73.36290061248656, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 28596197, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7214, + "versionNonce": 1033329125, + "isDeleted": false, + "id": "qSbLMG7pnZ2tt6nKAULY4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 177.2881772961273, + "y": -92.14932481819051, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1682523371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "rectangle", + "version": 5645, + "versionNonce": 227500779, + "isDeleted": false, + "id": "c5LxUAmYxjw7NIjMdvp-3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -496.42459287284055, + "y": -75.23260347335963, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1401557829, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5567, + "versionNonce": 1606210885, + "isDeleted": false, + "id": "_pE1fcw_qvGHy7u58Wps9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -411.24808627486254, + "y": -199.38818936194366, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 273117067, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5960, + "versionNonce": 656002443, + "isDeleted": false, + "id": "M3A6eayRqfci6_fQLGuCc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -546.9530289902968, + "y": -108.43700435053688, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 231826085, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5893, + "versionNonce": 1247536293, + "isDeleted": false, + "id": "qYH-NnUq0Yn-aPb4P-42Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -468.99487040909935, + "y": -164.7401188814074, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 2087142955, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5675, + "versionNonce": 87942187, + "isDeleted": false, + "id": "fpjGYlmtPWgk2EMHT6R62", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -272.65580435270294, + "y": -81.00728188677385, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1429718533, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4941, + "versionNonce": 1629620229, + "isDeleted": false, + "id": "fVOX95mu6E9-WYP1Z22Mz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -528.5961981715946, + "y": -90.69304585027203, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 261310667, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4645, + "versionNonce": 1072047819, + "isDeleted": false, + "id": "NtNAz-pNECma9x2G_pxFz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -357.17295774911963, + "y": -138.37368225917817, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1555742053, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4845, + "versionNonce": 906805093, + "isDeleted": false, + "id": "ATmXuvYlXL4i4rBFJnn-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -304.0507068626166, + "y": -80.3376031110347, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1868953451, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7_HcUZOHbIY1UTDIRXGOr", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4733, + "versionNonce": 229447019, + "isDeleted": false, + "id": "U8JCs_X1xzl2DrXkdsPkp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -432.09967210597733, + "y": -159.9434939679668, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 463980741, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4712, + "versionNonce": 1063881413, + "isDeleted": false, + "id": "XywoMS8apBgAgb-bHXyTz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -484.5873101600582, + "y": -128.4223916825831, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 707383819, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7799, + "versionNonce": 1843212299, + "isDeleted": false, + "id": "jYjk1VVjSGIyX_3NYhu-M", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -460.1584191215361, + "y": -70.25718985004278, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1134323749, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7617, + "versionNonce": 1305864741, + "isDeleted": false, + "id": "YMMr7CQZ_Q_5iQnC25Fyz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -392.4889127966735, + "y": -88.64606072203242, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 551114923, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 1165, + "versionNonce": 309393067, + "isDeleted": false, + "id": "7_HcUZOHbIY1UTDIRXGOr", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.92681873116726, + "y": -33.94399795946447, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 145.7814330403453, + "height": 2.387487505808167, + "seed": 1988500357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.14701890089017966, + "gap": 21.423492554524714, + "elementId": "ATmXuvYlXL4i4rBFJnn-Y" + }, + "endBinding": { + "focus": -0.05420258190551906, + "gap": 13.318412802221175, + "elementId": "vPToa6FdwoLyJdILu5COt" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.7814330403453, + -2.387487505808167 + ] + ] + }, + { + "type": "text", + "version": 7736, + "versionNonce": 1111448965, + "isDeleted": false, + "id": "plfMnxwGm3mHl6DrB2XOY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -139.29248204984015, + "y": -106.23647889695712, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 824118091, + "groupIds": [ + "Kd-Ab3YPuapFFMQHjjeRy" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5326, + "versionNonce": 169011531, + "isDeleted": false, + "id": "rjmTXa-owLXE_vN03orWW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 106.1187098426808, + "y": 360.7418043474863, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1017275109, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5245, + "versionNonce": 65234149, + "isDeleted": false, + "id": "EKW3dDelTCBlbIGW3kf4k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 191.2952164406588, + "y": 236.5862184589023, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 525691371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5647, + "versionNonce": 706578411, + "isDeleted": false, + "id": "HiiD5S4sPVdQsG7tv7JS-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 55.590273725224506, + "y": 327.53740347031635, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 981384773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "wB2S7HvWGXAfhfyzZJliu", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5574, + "versionNonce": 911179845, + "isDeleted": false, + "id": "9wr_SoYrP8LZqONOlKro-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 133.548432306422, + "y": 271.23428893943856, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1082586251, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5356, + "versionNonce": 949703307, + "isDeleted": false, + "id": "wYb1u3p7YLkDfBkdUiaf2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 329.8874983628184, + "y": 354.9671259340721, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 653831589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4622, + "versionNonce": 794898341, + "isDeleted": false, + "id": "GgRBfq3WjFGuXfTM9Lyoe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 73.9471045439268, + "y": 345.2813619705739, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1684941611, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4324, + "versionNonce": 1447479595, + "isDeleted": false, + "id": "kL-CDc6-O0jV_X0sLwuUy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 245.37034496640172, + "y": 297.60072556167506, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 20820229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4521, + "versionNonce": 759558917, + "isDeleted": false, + "id": "y5-Ck5mrLP6GRmzFcfhun", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 298.49259585289747, + "y": 355.63680470981853, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 2138410443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4414, + "versionNonce": 680160203, + "isDeleted": false, + "id": "LU9Jda4q6oLTkQYv8-fF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 170.44363060954402, + "y": 276.03091385287917, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 113985637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4393, + "versionNonce": 1283148389, + "isDeleted": false, + "id": "qVMnQcxHBQv8cli8AGnuw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 117.95599255546313, + "y": 307.5520161382701, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 347577451, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7478, + "versionNonce": 1132509803, + "isDeleted": false, + "id": "3sCda1Ba7vwDKQwgiNx1m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 142.38488359398525, + "y": 365.7172179708032, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1768879045, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7365, + "versionNonce": 1036957125, + "isDeleted": false, + "id": "YlPWZi87SXRGq0XIaUtQY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 210.66548600575425, + "y": 370.70641225843974, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 158, + "height": 36, + "seed": 1610536715, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Destination", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Destination" + }, + { + "type": "rectangle", + "version": 5851, + "versionNonce": 1408513291, + "isDeleted": false, + "id": "PZZfU07Fz7658lCtDAuJM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -530.2659176429997, + "y": 364.3299894533011, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1162228517, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5773, + "versionNonce": 1012774181, + "isDeleted": false, + "id": "5O92161RK_hfDtw0g_hI7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -445.08941104502173, + "y": 240.17440356471707, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1069923755, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6123, + "versionNonce": 157244331, + "isDeleted": false, + "id": "6Gvy8J4igkVq6yLtsC19k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -580.794353760456, + "y": 331.12558857612385, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1455326853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6098, + "versionNonce": 1133889669, + "isDeleted": false, + "id": "35zIwykMdV-ua1HGxDB6V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -502.83619517925854, + "y": 274.82247404525333, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1597427787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5880, + "versionNonce": 1072475723, + "isDeleted": false, + "id": "KcnXprTx4G3RFbGh45cUN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -306.49712912286213, + "y": 358.5553110398869, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1888841189, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5104, + "versionNonce": 87322597, + "isDeleted": false, + "id": "nrsLdUIac10vyqx2LAERL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -562.4375229417537, + "y": 348.8695470763887, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 539791083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4851, + "versionNonce": 1786162411, + "isDeleted": false, + "id": "2mcALtn_Jpe8oU0fVg742", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -391.0142825192788, + "y": 301.18891066748256, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 836266309, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5051, + "versionNonce": 524757829, + "isDeleted": false, + "id": "OdoEJPUUjjpm3wkZyaUby", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -337.8920316327758, + "y": 359.22498981562603, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1160870283, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "wB2S7HvWGXAfhfyzZJliu", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4938, + "versionNonce": 1015535499, + "isDeleted": false, + "id": "K_Mb-Ei7K-MMMB6K0UW7t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -465.9409968761365, + "y": 279.61909895869394, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 2078603429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4917, + "versionNonce": 304839333, + "isDeleted": false, + "id": "t6lbfCFxQlbVuZhDofbE_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -518.4286349302174, + "y": 311.1402012440776, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1535119403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8005, + "versionNonce": 341487147, + "isDeleted": false, + "id": "R06ERP8NpJTYVwIrec4eJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -493.9997438916953, + "y": 369.30540307661795, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 677944325, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7884, + "versionNonce": 1989074437, + "isDeleted": false, + "id": "THA16tSc-D1o3XgBExhNZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -409.3998157948654, + "y": 369.1646870977329, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 91, + "height": 36, + "seed": 1694683851, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Source", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Source" + }, + { + "type": "arrow", + "version": 1658, + "versionNonce": 618246347, + "isDeleted": false, + "id": "wB2S7HvWGXAfhfyzZJliu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -170.7543140350963, + "y": 405.7758149384408, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 213.1839646328135, + "height": 3.1598516889071107, + "seed": 2137052005, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.14682192295464302, + "gap": 21.413555760747784, + "elementId": "OdoEJPUUjjpm3wkZyaUby" + }, + "endBinding": { + "focus": -0.05420258190550621, + "gap": 13.318393240498267, + "elementId": "HiiD5S4sPVdQsG7tv7JS-" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 213.1839646328135, + -3.1598516889071107 + ] + ] + }, + { + "type": "text", + "version": 7965, + "versionNonce": 1936643429, + "isDeleted": false, + "id": "sJTx0Ba2ovrRNuR2HeFUm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -79.37936725138297, + "y": 286.59799742132054, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 130, + "height": 125, + "seed": 1112818027, + "groupIds": [ + "1HFR7Ei8MXpm-rFjcELuN" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "pull data \nfrom Source\nwith \nremoteSecure\n", + "baseline": 118, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pull data \nfrom Source\nwith \nremoteSecure\n" + }, + { + "type": "rectangle", + "version": 8137, + "versionNonce": 1604280171, + "isDeleted": false, + "id": "8o5d6LTypxQ8rCasaSBD_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -626.5480510568605, + "y": -2211.1328222176408, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 149.93149863847913, + "seed": 855330981, + "groupIds": [ + "L-ntX2Ybuoz63aPG94gYe" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7989, + "versionNonce": 1947787461, + "isDeleted": false, + "id": "IfhDKrrSyh5x4Z9wePwZD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1314.2783841270584, + "y": -2477.641544159903, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 161167403, + "groupIds": [ + "uHpShOIDYE8Fdg4MD0AyX" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8604, + "versionNonce": 519453195, + "isDeleted": false, + "id": "lOlHuzp_Bro1f80c_5cNq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2434.008438051972, + "y": -2839.48752327043, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 1525937157, + "groupIds": [ + "XDrUJY93osCRJu9SnBsUk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8425, + "versionNonce": 506101797, + "isDeleted": false, + "id": "owHDN4M6MPDZVxWkmlr31", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2315.1169344429827, + "y": -2540.8198024434214, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 1970862795, + "groupIds": [ + "TzVb1rYGyv6CoPeU5WaTR" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + }, + { + "id": "zgSfFJcjgXYvLLCAvnkV6", + "type": "arrow" + }, + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6156, + "versionNonce": 265863339, + "isDeleted": false, + "id": "fCZ78dlKsWB3LHYeTjsV-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.1278443875717, + "y": -2783.5686647175507, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1992371045, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3948, + "versionNonce": 126956421, + "isDeleted": false, + "id": "7JOyMXo41znrPsMV0493B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.5119295169434, + "y": -2762.2729386024557, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 835021163, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6954, + "versionNonce": 1542550347, + "isDeleted": false, + "id": "CggrI2uulJ9_pAZkMKg3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2000.3119298403626, + "y": -2788.9619467225248, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1185969861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4048, + "versionNonce": 747272933, + "isDeleted": false, + "id": "-Pi5MqguOGFoJ1g3XDKED", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.4131251827066, + "y": -2741.231359710947, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 332071947, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6107, + "versionNonce": 328913387, + "isDeleted": false, + "id": "du9sSXuxvj6INm7ctNc0z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2030.6655592523284, + "y": -2747.1359239737985, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 627004965, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3899, + "versionNonce": 631494213, + "isDeleted": false, + "id": "F_ZxA64nXfaCQz11e3ttr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2031.0496443817037, + "y": -2725.8401978587035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1669614251, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6904, + "versionNonce": 1474256011, + "isDeleted": false, + "id": "ubrEXPq51KMZnVZr5nJOt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2031.8496447051193, + "y": -2752.5292059787726, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1035684229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3999, + "versionNonce": 498779557, + "isDeleted": false, + "id": "3KmShGA8VpZg3r1L_nxcu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2030.950840047467, + "y": -2704.798618967191, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 94092619, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5968, + "versionNonce": 1148818219, + "isDeleted": false, + "id": "vo2FuZyVXE4kxU5zDafW6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.3237015834484, + "y": -2718.7109320403843, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 16896229, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3760, + "versionNonce": 134007045, + "isDeleted": false, + "id": "VA3YXVsEbA12Ce-gjYuoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.7077867128237, + "y": -2697.415205925293, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1701567467, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6764, + "versionNonce": 433321419, + "isDeleted": false, + "id": "90ol4Dx2NQLv4dbdfaUat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2069.5077870362393, + "y": -2724.104214045362, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1556114501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3860, + "versionNonce": 367485029, + "isDeleted": false, + "id": "cWerttJv5C9YhfOQDo6B7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.608982378587, + "y": -2676.3736270337804, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 520038027, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 6470, + "versionNonce": 654902379, + "isDeleted": false, + "id": "thD28xk-4mxO0w_Gul7mP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2125.130287433395, + "y": -2641.427641902789, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 226, + "height": 36, + "seed": 819239845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "local databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "local databases" + }, + { + "type": "image", + "version": 7108, + "versionNonce": 1833438149, + "isDeleted": false, + "id": "lJNyMtyhWww3bsnkrDxvf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2274.392192420676, + "y": -2524.7127932699814, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1762663723, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 3336, + "versionNonce": 1944272651, + "isDeleted": false, + "id": "4g0WqdIPD6miHNNmQIkbK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2254.2810782844635, + "y": -2775.069802607545, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 90955525, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1400, + "versionNonce": 507267877, + "isDeleted": false, + "id": "Ebtrlwu6f6s_oTpUl4skk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2254.3213866165743, + "y": -2775.013669603247, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1057570763, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 1456, + "versionNonce": 719136171, + "isDeleted": false, + "id": "fOcFgdbU5tM8S6CFAhn6x", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2335.7610500894907, + "y": -2775.0129332344522, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 17020517, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 1411, + "versionNonce": 1496424069, + "isDeleted": false, + "id": "41TQ0eTXw8jeobeYFfQdg", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2335.9078927799374, + "y": -2617.397442653256, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1258622571, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 1414, + "versionNonce": 1126250571, + "isDeleted": false, + "id": "wUvsqNUUs95IZc_6RrtKP", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2225.739013846326, + "y": -2616.8406136278836, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 510239173, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 1369, + "versionNonce": 1692763621, + "isDeleted": false, + "id": "R6W--oEOcjCTl9C43tEFT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2255.01231520493, + "y": -2775.24723089887, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 265160971, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2691, + "versionNonce": 1787426539, + "isDeleted": false, + "id": "Fdcn78xbgeOSnj7CoQbbk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2363.4190810240425, + "y": -2685.0483800056472, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 582689061, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1533, + "versionNonce": 1415938373, + "isDeleted": false, + "id": "dMHJjXGe9guXMXrK-EYFJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2358.1173754919027, + "y": -2681.4355958478964, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1390325675, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 1226, + "versionNonce": 799138187, + "isDeleted": false, + "id": "g87gFrurQUavEi63bWE9Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.2634283468024, + "y": -2747.3133525753483, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1399174277, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 1471, + "versionNonce": 2098139301, + "isDeleted": false, + "id": "ElBPOU2qrPpFter7yuhWl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.1874112357864, + "y": -2736.2068479769196, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1180795467, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1485, + "versionNonce": 1805875243, + "isDeleted": false, + "id": "skOtVgeZIfPXuV9pJF6Dd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.1600029541178, + "y": -2724.879259809947, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1814485989, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1530, + "versionNonce": 747615237, + "isDeleted": false, + "id": "8APrtNgnN5V9YNdGuY9KU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.153860521051, + "y": -2713.5416287968264, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1932591339, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1547, + "versionNonce": 1819884235, + "isDeleted": false, + "id": "e1iSkYCjVO1Z7oGY9xLs_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.2481182261063, + "y": -2700.8752080621643, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1426855749, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6716, + "versionNonce": 518318949, + "isDeleted": false, + "id": "p95-LgGntL-KQaYF7hN_n", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2207.349379832528, + "y": -2519.883290156843, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1658301323, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 1783, + "versionNonce": 1589487979, + "isDeleted": false, + "id": "DLLu8qJxF24-v8VR3aTuM", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2278.6531810373754, + "y": -2614.1771529124717, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033, + "height": 69.40972855836844, + "seed": 410183333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.6882118099130294, + "gap": 11.151214588133826, + "elementId": "2IJ0D70LQc4E7GBchXo4Y" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033, + 69.40972855836844 + ] + ] + }, + { + "type": "arrow", + "version": 1878, + "versionNonce": 878458565, + "isDeleted": false, + "id": "zgSfFJcjgXYvLLCAvnkV6", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2054.711098371644, + "y": -2605.4727323626003, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 21.171898020946173, + "height": 60.90873194937376, + "seed": 160432683, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.17799632636425824, + "gap": 3.7441979698051, + "elementId": "owHDN4M6MPDZVxWkmlr31" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -21.171898020946173, + 60.90873194937376 + ] + ] + }, + { + "type": "rectangle", + "version": 7810, + "versionNonce": 2008761355, + "isDeleted": false, + "id": "9xGjafV3vr3k4QjWOoZl7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1195.6070062758836, + "y": -2178.973823332891, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 420006405, + "groupIds": [ + "q8BAAGEs7VgjlP3TlbgV5" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + }, + { + "id": "MsQOvDI0B0vHVxpY1itjF", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5550, + "versionNonce": 1737692709, + "isDeleted": false, + "id": "C_ff__dpNEYjPWzj8x7qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.3977904626563, + "y": -2421.722685607024, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1883538635, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3342, + "versionNonce": 1600948907, + "isDeleted": false, + "id": "z1x4uq2iKYVksIjr67LFm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.7818755920316, + "y": -2400.4269594919324, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 130761061, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6345, + "versionNonce": 58132869, + "isDeleted": false, + "id": "-IRYwunN3-LHQeU_Mqiuq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -880.5818759154472, + "y": -2427.1159676120014, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 512734059, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3442, + "versionNonce": 1518075211, + "isDeleted": false, + "id": "LPgKzYud4xjEI3SrfTIww", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.6830712577948, + "y": -2379.38538060042, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 436718789, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5501, + "versionNonce": 423989477, + "isDeleted": false, + "id": "-nlSvDoxV24uIt8EvhvJb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -910.9355053274166, + "y": -2385.289944863268, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1153175051, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3293, + "versionNonce": 876878827, + "isDeleted": false, + "id": "Lrl2c88T-b0-CzfgcQjC0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -911.319590456792, + "y": -2363.9942187481765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 2136730661, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6295, + "versionNonce": 915156037, + "isDeleted": false, + "id": "Pq1a2mHMny48WxACyoviR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -912.1195907802075, + "y": -2390.6832268682456, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 633607339, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3393, + "versionNonce": 1758422667, + "isDeleted": false, + "id": "kox69SzM1UYi2K90cG-Rw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -911.2207861225552, + "y": -2342.9526398566677, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 397746053, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5362, + "versionNonce": 1529371557, + "isDeleted": false, + "id": "WTYe4F3Uwv12Mg1UKU6EK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.5936476585348, + "y": -2356.8649529298573, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1095911243, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3154, + "versionNonce": 249060651, + "isDeleted": false, + "id": "AF25pl3vV8MpUK1w4GQef", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.9777327879101, + "y": -2335.5692268147623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1766909669, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6155, + "versionNonce": 793222917, + "isDeleted": false, + "id": "m6-9zYuql8_uOvmQ677Xk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -949.7777331113257, + "y": -2362.2582349348313, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1036068331, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3254, + "versionNonce": 29982667, + "isDeleted": false, + "id": "KGPZOq2fKhP8g-iXm5gKO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.8789284536733, + "y": -2314.5276479232534, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1455211077, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 5864, + "versionNonce": 2036823653, + "isDeleted": false, + "id": "7u8QGBy2yXZZHlgiJxYq8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -967.0651813436962, + "y": -2279.5816627922623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 36, + "seed": 303771787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "databases" + }, + { + "type": "image", + "version": 6500, + "versionNonce": 1270697579, + "isDeleted": false, + "id": "UE-lXJ75LD3ut7MQ8LB0t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1154.6621384957625, + "y": -2162.8668141594544, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 349581733, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 2731, + "versionNonce": 1414881733, + "isDeleted": false, + "id": "eni9frbYUCh26lLp9P91N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1134.55102435955, + "y": -2413.223823497018, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 1880811307, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 794, + "versionNonce": 1333676299, + "isDeleted": false, + "id": "qo52KSrQz2Kp_NMVFvAJy", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1134.5913326916607, + "y": -2413.1676904927162, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1623897349, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 850, + "versionNonce": 623829285, + "isDeleted": false, + "id": "q65ecq1UCsaaRRT5xFQU6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1216.0309961645735, + "y": -2413.1669541239253, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 1848297931, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 805, + "versionNonce": 847703979, + "isDeleted": false, + "id": "ot3cmlGfx6olNKg7B_EPM", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1216.1778388550238, + "y": -2255.551463542729, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1981271141, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 808, + "versionNonce": 1365341317, + "isDeleted": false, + "id": "i4aG1wwhE1qIMqB79RSKq", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1106.0089599214089, + "y": -2254.9946345173566, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 1902467179, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 763, + "versionNonce": 117555787, + "isDeleted": false, + "id": "-48LMYLMQKlmphs3CsegD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1135.2822612800164, + "y": -2413.4012517883393, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 1149958085, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2086, + "versionNonce": 883596261, + "isDeleted": false, + "id": "leoRf9zelCB40OVcpDG3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1243.689027099129, + "y": -2323.2024008951203, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 1469387531, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 925, + "versionNonce": 902381803, + "isDeleted": false, + "id": "kT6GiFMZmJAHGfQ8r00_N", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1238.3873215669892, + "y": -2319.5896167373694, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1715582757, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 620, + "versionNonce": 1461180229, + "isDeleted": false, + "id": "l2NCpRyjNaEBL_tyLF61N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.5333744218851, + "y": -2385.4673734648177, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1630828971, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 865, + "versionNonce": 677899147, + "isDeleted": false, + "id": "ZaCZ8v6BqbBfjT2w95s6z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4573573108728, + "y": -2374.360868866389, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1437174405, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 879, + "versionNonce": 1661380261, + "isDeleted": false, + "id": "wxOmkWcSJPBx1-K3oL3mG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4299490292042, + "y": -2363.03328069942, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1533938763, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 924, + "versionNonce": 857227819, + "isDeleted": false, + "id": "o9HHNCuZXX7qEny2rQo-r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4238065961372, + "y": -2351.6956496862995, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1669329381, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 941, + "versionNonce": 1529121285, + "isDeleted": false, + "id": "6UIQWH7tXvdBD-vWnmKyU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.518064301189, + "y": -2339.0292289516374, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 169626347, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6109, + "versionNonce": 1053082827, + "isDeleted": false, + "id": "Zw3Q4k7LAawCjJpC01mGn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1087.6193259076144, + "y": -2158.0373110463124, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1825729861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 391, + "versionNonce": 275710309, + "isDeleted": false, + "id": "1WQ2iSmfSDsYi77fBC6D1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1157.9424821553775, + "y": -2251.670750881972, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 30.543190647570555, + "height": 68.97537186588124, + "seed": 1372173707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.4742441762028566, + "gap": 3.7215556831997674, + "elementId": "9xGjafV3vr3k4QjWOoZl7" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 30.543190647570555, + 68.97537186588124 + ] + ] + }, + { + "type": "arrow", + "version": 711, + "versionNonce": 856159083, + "isDeleted": false, + "id": "MsQOvDI0B0vHVxpY1itjF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -929.1710124087094, + "y": -2244.199945035819, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 27.00154789127282, + "height": 61.48192373312122, + "seed": 1358855333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.15452720968572006, + "gap": 3.744197969806919, + "elementId": "9xGjafV3vr3k4QjWOoZl7" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -27.00154789127282, + 61.48192373312122 + ] + ] + }, + { + "type": "rectangle", + "version": 7944, + "versionNonce": 1479773381, + "isDeleted": false, + "id": "PX9bdLR5yM01mzEzgVkkY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -498.52377385314594, + "y": -2175.897587804234, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 565234731, + "groupIds": [ + "nMjbdAw5na12mCX8CXtL_" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 6635, + "versionNonce": 539774475, + "isDeleted": false, + "id": "bsVBCXA748FSATArbCkum", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -458.0167475576445, + "y": -2159.5662654577254, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 665952261, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 6244, + "versionNonce": 34581541, + "isDeleted": false, + "id": "UUEqDhCh-gcse_FwzByhj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -390.8107114416007, + "y": -2154.9610755176554, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 498863819, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "text", + "version": 6229, + "versionNonce": 690771115, + "isDeleted": false, + "id": "Ew02QnfdHLCLjdtzreHXt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1181.9094389344873, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 360, + "height": 44, + "seed": 921261925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "clickhouse-server", + "baseline": 35, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-server" + }, + { + "type": "text", + "version": 6344, + "versionNonce": 233889669, + "isDeleted": false, + "id": "tof5mYrfcrFk1yW2Kkf7C", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -493.7546811131933, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 339, + "height": 44, + "seed": 142998891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 35, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 6283, + "versionNonce": 766674763, + "isDeleted": false, + "id": "gwshLyWLuynSAj1I4DGMa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1898.7704829782697, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 359, + "height": 46, + "seed": 687022789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "A ClickHouse cluster", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "A ClickHouse cluster" + }, + { + "type": "rectangle", + "version": 8771, + "versionNonce": 571778789, + "isDeleted": false, + "id": "2IJ0D70LQc4E7GBchXo4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2236.2062122382094, + "y": -2657.4604490531865, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 1834555403, + "groupIds": [ + "U0h2rmvhxA2gwH1s-q5xK" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + }, + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 874079723, + "isDeleted": false, + "id": "w6lV85637T8vrQnLtQo0h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2117.31470862922, + "y": -2358.792728226178, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 40665637, + "groupIds": [ + "rufko5ZiQVhaQIYHNmSaH" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + }, + { + "id": "sKcHbfBhkzgjKfvYE_7GJ", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6321, + "versionNonce": 1091076677, + "isDeleted": false, + "id": "vMqGIVkP_P4qA4lq7uZVX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.3256185738092, + "y": -2601.5415905003074, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 170909355, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4113, + "versionNonce": 325808267, + "isDeleted": false, + "id": "xz2OkFtyOky0242nkEq-R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.7097037031808, + "y": -2580.2458643852124, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1480783237, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7120, + "versionNonce": 1068102053, + "isDeleted": false, + "id": "oPYEfDHa3usT3Yh_9hbNG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1802.5097040266, + "y": -2606.9348725052814, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 2041893195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4213, + "versionNonce": 1566779179, + "isDeleted": false, + "id": "uPueOipKG6P9QxFSZ74Ck", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.610899368944, + "y": -2559.2042854937035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1169423589, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6272, + "versionNonce": 2066117893, + "isDeleted": false, + "id": "hMsiCnXNSIotMym_Ltblx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1832.8633334385677, + "y": -2565.108849756555, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 490893291, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4064, + "versionNonce": 141232587, + "isDeleted": false, + "id": "NbKOwIRa0uNLPX4qQM-uz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1833.247418567943, + "y": -2543.81312364146, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 575477829, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7070, + "versionNonce": 1325108325, + "isDeleted": false, + "id": "wCX7A_I4NX1TASBumw2zS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1834.0474188913586, + "y": -2570.502131761529, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1189296779, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4164, + "versionNonce": 1503500395, + "isDeleted": false, + "id": "Z87gu7b7LzxDOuq9g9FAw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1833.1486142337062, + "y": -2522.7715447499477, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 2011940773, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6133, + "versionNonce": 1257682885, + "isDeleted": false, + "id": "VFDI5b6VToCAXDifZJdln", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.5214757696858, + "y": -2536.683857823141, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 592556331, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3925, + "versionNonce": 247812875, + "isDeleted": false, + "id": "52kKBUaqBC5sVlQeaSGJA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.9055608990611, + "y": -2515.3881317080495, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 951945989, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6930, + "versionNonce": 691369765, + "isDeleted": false, + "id": "4s-741RvQPWHUR05TYqNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1871.7055612224767, + "y": -2542.0771398281186, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1677218763, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4025, + "versionNonce": 1214036395, + "isDeleted": false, + "id": "wSBgiro_O9_eVryQts-TX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.8067565648244, + "y": -2494.346552816537, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 893379173, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 6636, + "versionNonce": 69552773, + "isDeleted": false, + "id": "KLYPzHaY43-bmD0sAtqPz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1927.3280616196325, + "y": -2459.400567685546, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 226, + "height": 36, + "seed": 686924395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "local databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "local databases" + }, + { + "type": "image", + "version": 7274, + "versionNonce": 864963659, + "isDeleted": false, + "id": "x4jX_Ey9XsbLNZZvPTMwl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2076.5899666069135, + "y": -2342.685719052738, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1379945925, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 3501, + "versionNonce": 1283699173, + "isDeleted": false, + "id": "PmkLIhEEA4XbCS_C3J0o_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2056.478852470701, + "y": -2593.042728390302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 721952011, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1565, + "versionNonce": 1949600491, + "isDeleted": false, + "id": "CQtmCNBpcJmZJI-m5QZCb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2056.5191608028117, + "y": -2592.9865953860035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 2128366885, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 1621, + "versionNonce": 2136878405, + "isDeleted": false, + "id": "mvM9Pu5Qhb2jut2eEYBXi", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2137.958824275728, + "y": -2592.985859017209, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 632701867, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 1576, + "versionNonce": 1322907019, + "isDeleted": false, + "id": "HhOfE7St0DWqnMwsY0ZCH", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2138.105666966175, + "y": -2435.3703684360125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1786863749, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 1579, + "versionNonce": 470957221, + "isDeleted": false, + "id": "VosRxAhvb_iTjI81IL--5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2027.9367880325635, + "y": -2434.8135394106403, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 19306059, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 1534, + "versionNonce": 314117163, + "isDeleted": false, + "id": "VNO0Nktk4AygV_4FDIMsP", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2057.2100893911675, + "y": -2593.2201566816266, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 2062354405, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2856, + "versionNonce": 1515020293, + "isDeleted": false, + "id": "Pu9qPDHkRhNtvX0s-tNvR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2165.61685521028, + "y": -2503.021305788404, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 1010013419, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1698, + "versionNonce": 1136414411, + "isDeleted": false, + "id": "8A95rXiMD0Ja17NcrANJI", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2160.31514967814, + "y": -2499.408521630653, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 36488005, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 1391, + "versionNonce": 537728869, + "isDeleted": false, + "id": "FhyDVuTQ36snnXtmO3L6k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.46120253304, + "y": -2565.286278358105, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 375897995, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 1636, + "versionNonce": 75382123, + "isDeleted": false, + "id": "wPCKhup0thT5yVa4ZfzHw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.385185422024, + "y": -2554.179773759676, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 882774693, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1650, + "versionNonce": 933159621, + "isDeleted": false, + "id": "Ffko5vqrQfbbzaIZ9-yxH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.357777140355, + "y": -2542.852185592704, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 2046662187, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1695, + "versionNonce": 1078548491, + "isDeleted": false, + "id": "wXOkeFLKsR6ZbcUYToiX4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.351634707288, + "y": -2531.514554579583, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1592686085, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1712, + "versionNonce": 1168130597, + "isDeleted": false, + "id": "iKZaxGY-1-uDuIbHPu5P3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.4458924123437, + "y": -2518.848133844921, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 635410635, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6882, + "versionNonce": 353902251, + "isDeleted": false, + "id": "jR9YUhC2QGrb_Sj_ZC5Fu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2009.5471540187655, + "y": -2337.8562159395997, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1545301349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 2195, + "versionNonce": 2130621829, + "isDeleted": false, + "id": "oQUHRqs2QGzG4h5w2xgHi", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2080.850955223613, + "y": -2432.1500786952283, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033454, + "height": 69.3604978411513, + "seed": 396904299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.08713030619764997, + "gap": 21.694499958552115, + "elementId": "owHDN4M6MPDZVxWkmlr31" + }, + "endBinding": { + "focus": -0.6956229250733946, + "gap": 14.324279522642883, + "elementId": "Hv-bEvtN4bPONYgD1cW4_" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033454, + 69.3604978411513 + ] + ] + }, + { + "type": "arrow", + "version": 2210, + "versionNonce": 2106921291, + "isDeleted": false, + "id": "sKcHbfBhkzgjKfvYE_7GJ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1856.9088725578831, + "y": -2423.445658145357, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 21.171898020946173, + "height": 60.90873194937376, + "seed": 1265793221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.1779963263642492, + "gap": 3.7441979698051, + "elementId": "w6lV85637T8vrQnLtQo0h" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -21.171898020946173, + 60.90873194937376 + ] + ] + }, + { + "type": "rectangle", + "version": 8107, + "versionNonce": 519552229, + "isDeleted": false, + "id": "Hv-bEvtN4bPONYgD1cW4_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2035.230921489937, + "y": -2475.253020304618, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 899817995, + "groupIds": [ + "0dpL5qfWTpkqvPyKpGsyG" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "type": "arrow" + }, + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7926, + "versionNonce": 991604715, + "isDeleted": false, + "id": "e4D-rDmMszcmdTLp_xpUJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1916.3394178809476, + "y": -2176.585299477606, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 110172197, + "groupIds": [ + "RWYJMjak8rzA1Wrw0oc9P" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5665, + "versionNonce": 488167493, + "isDeleted": false, + "id": "MDVsilsQYlVZ8plmoFD6a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.3503278255384, + "y": -2419.3341617517353, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 952608939, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3457, + "versionNonce": 2142468747, + "isDeleted": false, + "id": "SiXpZm_zmcRTc7JdoX_y4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.73441295491, + "y": -2398.038435636644, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1466223493, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6461, + "versionNonce": 591366053, + "isDeleted": false, + "id": "Jn4c1-g771eXf3stxzTL3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1601.5344132783293, + "y": -2424.727443756713, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1455643467, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3557, + "versionNonce": 1478095147, + "isDeleted": false, + "id": "horI9wNnxozy4FQxWry7r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.6356086206733, + "y": -2376.996856745135, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1848316645, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5616, + "versionNonce": 1134119685, + "isDeleted": false, + "id": "9hW_e28QUxAnAVHXoQixp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1631.8880426902952, + "y": -2382.901421007983, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 737130987, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3408, + "versionNonce": 1438159819, + "isDeleted": false, + "id": "VrrLyxIFQHqfZvyRNSOFo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1632.2721278196705, + "y": -2361.605694892888, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 393309765, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6411, + "versionNonce": 1856217701, + "isDeleted": false, + "id": "aD8FHkoO8tj4Mw1By8ekB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1633.072128143086, + "y": -2388.294703012957, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1700217995, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3508, + "versionNonce": 2024399467, + "isDeleted": false, + "id": "Auk6Fine-mzeYXs45fr8g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1632.1733234854337, + "y": -2340.5641160013793, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 840261029, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5477, + "versionNonce": 690752965, + "isDeleted": false, + "id": "OoB5Lf23xkJ5HXPUyrQPZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.5461850214133, + "y": -2354.4764290745725, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 716471083, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3269, + "versionNonce": 1505254667, + "isDeleted": false, + "id": "F7fqeBv3BXgUBHewMqG3n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.9302701507886, + "y": -2333.1807029594775, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1698980101, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6271, + "versionNonce": 38800677, + "isDeleted": false, + "id": "vMSCqHqG8CNqJtRXuxuDI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1670.7302704742042, + "y": -2359.8697110795465, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1215421899, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3369, + "versionNonce": 341738411, + "isDeleted": false, + "id": "tmZF-8nwfo9xmcmy1QXXr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.8314658165518, + "y": -2312.139124067965, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 377223269, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 5978, + "versionNonce": 1232937093, + "isDeleted": false, + "id": "12__p2EERUjpFQKzOHo91", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1687.85277087136, + "y": -2277.1931389369774, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 36, + "seed": 430566507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "databases" + }, + { + "type": "image", + "version": 6615, + "versionNonce": 1892079179, + "isDeleted": false, + "id": "UyJgmTtraYE64GA2UeWLn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1875.614675858641, + "y": -2160.4782903041696, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 529114053, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 2845, + "versionNonce": 74500069, + "isDeleted": false, + "id": "HADzMX9ibWYhgnGgWbNvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1855.5035617224285, + "y": -2410.8352996417298, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 841426699, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 909, + "versionNonce": 1305203947, + "isDeleted": false, + "id": "6u9bCIBr_auHuJMQJJpoj", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1855.5438700545392, + "y": -2410.7791666374314, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1149952805, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 965, + "versionNonce": 624460613, + "isDeleted": false, + "id": "1tRqjMTwFhmN4iC2sjzyK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1936.9835335274556, + "y": -2410.7784302686405, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 1214516651, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 920, + "versionNonce": 1257766795, + "isDeleted": false, + "id": "3fFdtOziIgPP2jXLo5faW", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1937.1303762179023, + "y": -2253.162939687444, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1777153669, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 923, + "versionNonce": 3265189, + "isDeleted": false, + "id": "GFAoCsgsvjYoQAkFT4op6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1826.961497284291, + "y": -2252.606110662068, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 1602953291, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 878, + "versionNonce": 847631915, + "isDeleted": false, + "id": "wgVw9ld8GCwduJkcOpmVc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1856.234798642895, + "y": -2411.0127279330545, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 174988773, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2200, + "versionNonce": 34223621, + "isDeleted": false, + "id": "VSwI2ddlHozaITCXQGMGr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1964.6415644620074, + "y": -2320.8138770398355, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 829873899, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1042, + "versionNonce": 593483979, + "isDeleted": false, + "id": "wpsc6PgLwwnTlEPBUR1NH", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1959.3398589298677, + "y": -2317.2010928820846, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1830492485, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 735, + "versionNonce": 633285989, + "isDeleted": false, + "id": "fh2ZhrDeu23hyYMpxBhBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4859117847673, + "y": -2383.078849609533, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1488046475, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 980, + "versionNonce": 2065729387, + "isDeleted": false, + "id": "wRexc-gyHIaWTd2pRtHU9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4098946737513, + "y": -2371.972345011104, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 458336421, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 994, + "versionNonce": 715012293, + "isDeleted": false, + "id": "p7mnZ1VDsNTL0Lc2U7sHk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.3824863920827, + "y": -2360.6447568441354, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 980836395, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1039, + "versionNonce": 1204747, + "isDeleted": false, + "id": "P22_gMUKA8RbPs9b-rEzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.3763439590157, + "y": -2349.3071258310147, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 381635589, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1056, + "versionNonce": 172283941, + "isDeleted": false, + "id": "6B5AcruXgH-nCyLD3MVJ0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4706016640712, + "y": -2336.6407050963526, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 816784075, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6225, + "versionNonce": 1261430955, + "isDeleted": false, + "id": "ykhBGUSVx8_gAhJjltiHL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1808.571863270493, + "y": -2155.6487871910276, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1331790693, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 1004, + "versionNonce": 782273413, + "isDeleted": false, + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1879.8756644753403, + "y": -2249.9426499466563, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033, + "height": 69.63579478585052, + "seed": 1945538923, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.47424417620283493, + "gap": 3.7215556831997674, + "elementId": "e4D-rDmMszcmdTLp_xpUJ" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033, + 69.63579478585052 + ] + ] + }, + { + "type": "arrow", + "version": 972, + "versionNonce": 1914936139, + "isDeleted": false, + "id": "to7w8wQvUflVpas8AZ72I", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1648.8446611065237, + "y": -2241.950183904267, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 28.505962040905615, + "height": 61.62068645685258, + "seed": 1501941445, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.1462681295898969, + "gap": 3.744197969808738, + "elementId": "e4D-rDmMszcmdTLp_xpUJ" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -28.505962040905615, + 61.62068645685258 + ] + ] + }, + { + "type": "text", + "version": 656, + "versionNonce": 1743704805, + "isDeleted": false, + "id": "gbadPz-4zj3IDJdO5qfsX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -2029.567502425948, + "y": -1948.406668685543, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 622, + "height": 140, + "seed": 1167535115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "Typically, ClickHouse is run in the form \nof a cluster, where several instances of \nthe ClickHouse database engine are running \nin a distributed fashion on different servers.", + "baseline": 130, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Typically, ClickHouse is run in the form \nof a cluster, where several instances of \nthe ClickHouse database engine are running \nin a distributed fashion on different servers." + }, + { + "type": "text", + "version": 1313, + "versionNonce": 1900542443, + "isDeleted": false, + "id": "Z5vcHpNlFJ6NtIedQaSF5", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -1332.568992691742, + "y": -1943.9070466637686, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 665, + "height": 140, + "seed": 1674161701, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "On a single server, the database engine is \nrun as part of the clickhouse-server program.\nDatabase access (paths, users, security, ...) \nis configured with a server-configuration file.", + "baseline": 130, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On a single server, the database engine is \nrun as part of the clickhouse-server program.\nDatabase access (paths, users, security, ...) \nis configured with a server-configuration file." + }, + { + "type": "text", + "version": 2097, + "versionNonce": 582823493, + "isDeleted": false, + "id": "udp3EAZO5LoiAoBsvIk50", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -623.3794925498278, + "y": -1962.1812713616519, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 583, + "height": 210, + "seed": 1502311083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "The database engine can also be used \nisolated in a command line utility fashion.\nEnabling blazing fast SQL data processing\non an ample amount of input and output \nformats without having to configure, and\n start a ClickHouse server program. ", + "baseline": 200, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "The database engine can also be used \nisolated in a command line utility fashion.\nEnabling blazing fast SQL data processing\non an ample amount of input and output \nformats without having to configure, and\n start a ClickHouse server program. " + }, + { + "type": "text", + "version": 8616, + "versionNonce": 323754245, + "isDeleted": false, + "id": "aj8v9PRA-2I7IADOUYim9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5595.347266367396, + "y": -136.89640861599423, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148, + "height": 50, + "seed": 598984005, + "groupIds": [ + "XQ3S1IL0Opx7UqJFzxHpY" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "objectStorage \ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "objectStorage \ntable function" + }, + { + "type": "rectangle", + "version": 5436, + "versionNonce": 702653899, + "isDeleted": false, + "id": "Zux-4PqGRMyYJPQ6Z-4qU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5795.523769562579, + "y": -120.55567942307403, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1984552331, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5358, + "versionNonce": 449622117, + "isDeleted": false, + "id": "rcS2ZPTKNchUYBD_6zgEF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5880.700276160557, + "y": -244.71126531165805, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1374999717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5756, + "versionNonce": 1239463019, + "isDeleted": false, + "id": "zLHrPiNtSWD_QDGM6H8Dx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5744.995333445123, + "y": -153.76008030024764, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 334230571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5689, + "versionNonce": 1224956869, + "isDeleted": false, + "id": "aAaf6PBrwP7ezaIQWZRzz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5822.95349202632, + "y": -210.0631948311218, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1746728965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5471, + "versionNonce": 1078259467, + "isDeleted": false, + "id": "xS5nrW3VhvMgaR9QgGRZ-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 6019.292558082717, + "y": -126.33035783649007, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1850881739, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4738, + "versionNonce": 101554981, + "isDeleted": false, + "id": "VdZechBBkrOZ_441x_Cr4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5763.352164263818, + "y": -136.01612179998824, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2731877, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4437, + "versionNonce": 1515777669, + "isDeleted": false, + "id": "W3UGSeNjOjNhQvHhldFSL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5934.7754046863, + "y": -183.69675820889074, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 873932139, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4637, + "versionNonce": 1188489291, + "isDeleted": false, + "id": "OBd58xqxFN65d0dtexpk1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5988.13230733434, + "y": -125.79884256951641, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 409500357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4529, + "versionNonce": 1688393189, + "isDeleted": false, + "id": "2BwfV9PQtMuRudSOPiRVi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5859.848690329442, + "y": -205.266569917683, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1552236555, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4514, + "versionNonce": 1275700971, + "isDeleted": false, + "id": "aHt9_XQM55rCi5aVzRXwB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5807.495713518243, + "y": -173.74546763229569, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 158784037, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7591, + "versionNonce": 267964741, + "isDeleted": false, + "id": "knCf-ZQD0ALgd2Z-cqphV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5831.789943313884, + "y": -115.58026579975717, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 295110315, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7408, + "versionNonce": 632000907, + "isDeleted": false, + "id": "AIDIOXhlfP_7oo3S-8gbI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5899.974674966939, + "y": -134.1862452509847, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1010978181, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "rectangle", + "version": 5855, + "versionNonce": 163078309, + "isDeleted": false, + "id": "vFGv81WkxKtPQ5X38ZadY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5189.821570528773, + "y": -95.6046773766202, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 323.289754704958, + "height": 115.3522129463697, + "seed": 537416933, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "SUB74Pc_Jt6aHbUsXNbl0", + "type": "arrow" + }, + { + "id": "B4Y35dz_jcqbVyYWUHWzl", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5777, + "versionNonce": 2005861381, + "isDeleted": false, + "id": "VD36wqiRE-ThZwm-eFVkh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5279.371314789765, + "y": -226.13481307908205, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 218.56208768785902, + "height": 210.97312630980835, + "seed": 50305003, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "6jIP_lvnGFudlMlYzXDPE", + "type": "arrow" + }, + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6177, + "versionNonce": 1339484875, + "isDeleted": false, + "id": "1ZwXxjyr1uyZbcIqrBnT3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5136.698840882411, + "y": -130.5138997156455, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 151.77922756101336, + "height": 147.22585073418284, + "seed": 1616277573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "qyS2BP83H-q9I6nU1KncI", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6105, + "versionNonce": 1836727141, + "isDeleted": false, + "id": "wO8PyKOrN8hKcDTvbqAOI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5218.65962376535, + "y": -189.7077984644411, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 104.19060205803729, + "height": 93.65945873034212, + "seed": 1253794443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5888, + "versionNonce": 1793415531, + "isDeleted": false, + "id": "JwCDP4TqU6pqh2QXY9vsN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5425.079373248344, + "y": -101.67584647905369, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 129.01234342686138, + "height": 121.42338204881058, + "seed": 1527390117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5187, + "versionNonce": 600278725, + "isDeleted": false, + "id": "zzH_FfUftotnQAMXSaMCr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5155.998170837505, + "y": -111.85890892838779, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 133.6765724777816, + "height": 130.09595000069802, + "seed": 1239734571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4855, + "versionNonce": 57472011, + "isDeleted": false, + "id": "68MJ3v5kD6_DzvOEBWiWz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5336.222835517365, + "y": -161.987623607557, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 161.12801146875478, + "height": 173.06341972569936, + "seed": 1448141573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5052, + "versionNonce": 1830053413, + "isDeleted": false, + "id": "stHr2fYbdhqfgKynO3zjw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5392.319254324998, + "y": -101.11704149714478, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 153.96676651458776, + "height": 118.16054174375324, + "seed": 501644235, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4945, + "versionNonce": 1817074053, + "isDeleted": false, + "id": "pmztsjTvb2BWm2UKNG3ZY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5257.44914102152, + "y": -184.66489929575891, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 128.90240917500367, + "height": 130.0959500006982, + "seed": 1990736485, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4962, + "versionNonce": 159493451, + "isDeleted": false, + "id": "CddnCjgoRgdtBpZqH7699", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5202.266617666923, + "y": -151.52540154899452, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 177.83758302847713, + "height": 162.32155229444905, + "seed": 1390070379, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 2155, + "versionNonce": 1249900811, + "isDeleted": false, + "id": "1dwqI7QoSbvZbReXTfO5n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5561.095621174024, + "y": -65.96652494199247, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 179.0962977170202, + "height": 2.485330077484832, + "seed": 336504101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781482, + "link": null, + "locked": false, + "startBinding": { + "elementId": "stHr2fYbdhqfgKynO3zjw", + "focus": -0.3834145353939106, + "gap": 19.34860912005938 + }, + "endBinding": { + "elementId": "VdZechBBkrOZ_441x_Cr4", + "focus": -0.07255204687762361, + "gap": 23.354374344341224 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 179.0962977170202, + -2.485330077484832 + ] + ] + }, + { + "type": "text", + "version": 7817, + "versionNonce": 1460915179, + "isDeleted": false, + "id": "32jlX2gHh3ER_kGBZf5aS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5196.863567453697, + "y": -83.3887370971446, + "strokeColor": "#31303d", + "backgroundColor": "transparent", + "width": 299, + "height": 36, + "seed": 1951083813, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "arrow", + "version": 2488, + "versionNonce": 1104322475, + "isDeleted": false, + "id": "B4Y35dz_jcqbVyYWUHWzl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5342.075955953225, + "y": 180.57591323724202, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.7522594107804252, + "height": 142.2152528531183, + "seed": 227296523, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781482, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KFgM-xHaTKSm1297aN4H0", + "focus": -0.11551418679492209, + "gap": 14.436652669988725 + }, + "endBinding": { + "elementId": "vFGv81WkxKtPQ5X38ZadY", + "focus": 0.041256740436980056, + "gap": 18.61312481437421 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.7522594107804252, + -142.2152528531183 + ] + ] + }, + { + "type": "text", + "version": 9029, + "versionNonce": 1982404235, + "isDeleted": false, + "id": "D7fz6J2ac4Owm7PnpkrSf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5360.141669976354, + "y": 111.9664732674006, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 217, + "height": 75, + "seed": 1970629547, + "groupIds": [ + "3S7SevEcncXcvETkqB3ds" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "write directly or use\nThird-Party ETL/ELT\nor clickhouse-local", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write directly or use\nThird-Party ETL/ELT\nor clickhouse-local" + }, + { + "type": "line", + "version": 6947, + "versionNonce": 763472805, + "isDeleted": false, + "id": "y1BRz0qKn4DJ340_LsN6I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.394985932922, + "y": 200.3753845145077, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1470675077, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4770, + "versionNonce": 628886827, + "isDeleted": false, + "id": "AVBMRUJIRARqCHeLtnNYJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.010900803543, + "y": 221.67111062959907, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1589689931, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7746, + "versionNonce": 167177989, + "isDeleted": false, + "id": "KFgM-xHaTKSm1297aN4H0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5316.210900480131, + "y": 194.98210250953002, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 2036948965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + }, + { + "id": "B4Y35dz_jcqbVyYWUHWzl", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4839, + "versionNonce": 1638712933, + "isDeleted": false, + "id": "JZHSpLi6wEbEXBbjM_ePr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.10970513778, + "y": 242.71268952111154, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 877182187, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7830, + "versionNonce": 1899298411, + "isDeleted": false, + "id": "sesYiqxQJUxTK33hzHVHW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5230.178682355667, + "y": 283.06071990086707, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 254, + "height": 71, + "seed": 1440459589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + }, + { + "type": "rectangle", + "version": 5299, + "versionNonce": 2125111915, + "isDeleted": false, + "id": "aV3RfkC3wKVHUp5tEuK4y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3914.6656124197557, + "y": -213.78282066465408, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1870277611, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5221, + "versionNonce": 278351301, + "isDeleted": false, + "id": "ESggzWW8hpId86StwqGIy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3999.8421190177332, + "y": -337.9384065532381, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 2105482309, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5619, + "versionNonce": 1637948683, + "isDeleted": false, + "id": "SuFibC9OVLAF-qoNFbdnT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3864.137176302292, + "y": -246.9872215418277, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1925412491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5552, + "versionNonce": 1515408677, + "isDeleted": false, + "id": "rPMbhTwIX5HmCsQGwDR4i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3942.095334883497, + "y": -303.29033607270185, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 641551269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5334, + "versionNonce": 556745643, + "isDeleted": false, + "id": "Fr-byLWoClrS2ys5fV0mN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4138.434400939896, + "y": -219.55749907807194, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1607101739, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4600, + "versionNonce": 1058562181, + "isDeleted": false, + "id": "xZe_s-joyqzf-mVky8ssf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3882.4940071209944, + "y": -229.24326304157012, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 708742917, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4300, + "versionNonce": 629118539, + "isDeleted": false, + "id": "mbRnZVRIVh6yjdsIToG0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4053.9172475434752, + "y": -276.9238994504726, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 167350219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4500, + "versionNonce": 614729701, + "isDeleted": false, + "id": "75o7ItMDxgLNIXgFRKss9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4107.274150191517, + "y": -219.02598381109647, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1476421221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4392, + "versionNonce": 1835832555, + "isDeleted": false, + "id": "iZ2Y3qLn6kDnzoRUghExn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3978.990533186611, + "y": -298.4937111592649, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1936416363, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4374, + "versionNonce": 1560527685, + "isDeleted": false, + "id": "QZ0PTcljG3MhNtupabSrN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3926.502895132538, + "y": -266.97260887387756, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1380995525, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7454, + "versionNonce": 479531685, + "isDeleted": false, + "id": "ZGzwzOZ3SZXkwq9n4VqSm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3950.931786171053, + "y": -208.80740704133723, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1995069707, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7270, + "versionNonce": 1895208491, + "isDeleted": false, + "id": "N_-kZOPZyIGUXg5-gQuTs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4019.4184854596683, + "y": -227.4133864925666, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 105632037, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6303, + "versionNonce": 805664261, + "isDeleted": false, + "id": "bXXuSkoYNNOnn7HcPY7NH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4047.254178949017, + "y": 354.44827728594237, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 837877675, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4095, + "versionNonce": 1438161099, + "isDeleted": false, + "id": "VH8Xejonbm_38fYTwDxqm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.870093819638, + "y": 375.7440034010342, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1633707141, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7101, + "versionNonce": 1918004581, + "isDeleted": false, + "id": "dLk_CBZv2f3yKNsSsqAR2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.070093496226, + "y": 349.0549952809647, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 782881355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4195, + "versionNonce": 1684096875, + "isDeleted": false, + "id": "WqP7iPI7ioVNPWL5WG2Ks", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.9688981538748, + "y": 396.7855822925467, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1196133349, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "arrow", + "version": 1207, + "versionNonce": 1799908933, + "isDeleted": false, + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4079.3577135319933, + "y": 43.97406724185157, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 2.203425141327898, + "height": 144.25589993564154, + "seed": 1209714501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778930, + "link": null, + "locked": false, + "startBinding": { + "elementId": "UBUv4y9VmqvaUUjtShHGU", + "focus": 0.003982939178254775, + "gap": 18.36147820106453 + }, + "endBinding": { + "elementId": "QZ0PTcljG3MhNtupabSrN", + "focus": -0.7650101167593557, + "gap": 31.585170739477093 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.203425141327898, + -144.25589993564154 + ] + ] + }, + { + "type": "rectangle", + "version": 9426, + "versionNonce": 54206987, + "isDeleted": false, + "id": "UBUv4y9VmqvaUUjtShHGU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3977.893746935334, + "y": 62.3355454429161, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 204.09321695970974, + "height": 93.15707154311905, + "seed": 371955365, + "groupIds": [ + "qtKMV9h0lOMGFiAtutCDp", + "_TdSGw-5yrTILOnABrer3" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "ZsjkxeMfY7suqvLayroRm", + "type": "arrow" + }, + { + "id": "iuYv_lMtKD64ophwryuXG", + "type": "arrow" + }, + { + "id": "KK-tLtm7eSZaQRA0Z0wWk", + "type": "arrow" + }, + { + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7725, + "versionNonce": 1694223237, + "isDeleted": false, + "id": "q96ejHCXzB3TmAz1pvi2B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4000.2958985848754, + "y": 72.58167909483882, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 174, + "height": 71, + "seed": 1694126635, + "groupIds": [ + "_TdSGw-5yrTILOnABrer3" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Third-Party \nETL/ELT", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Third-Party \nETL/ELT" + }, + { + "type": "arrow", + "version": 1135, + "versionNonce": 510674059, + "isDeleted": false, + "id": "KK-tLtm7eSZaQRA0Z0wWk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4080.1237631640865, + "y": 327.4391234447171, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.8930321127918432, + "height": 154.77472373480487, + "seed": 1009482245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778931, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "UBUv4y9VmqvaUUjtShHGU", + "focus": -0.014115883975155083, + "gap": 17.171782723877072 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.8930321127918432, + -154.77472373480487 + ] + ] + }, + { + "type": "text", + "version": 7303, + "versionNonce": 820122341, + "isDeleted": false, + "id": "AwGOiLT64Jrk_aQlWn83w", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3929.561885157685, + "y": 434.9120378208687, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 326, + "height": 91, + "seed": 1646045131, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 78, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/migration/images/ch-local-01.png b/docs/ja/integrations/migration/images/ch-local-01.png new file mode 100644 index 00000000000..cec2d481dee Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-01.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-02.png b/docs/ja/integrations/migration/images/ch-local-02.png new file mode 100644 index 00000000000..e95cae0916d Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-02.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-03.png b/docs/ja/integrations/migration/images/ch-local-03.png new file mode 100644 index 00000000000..6525eccd67b Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-03.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-04.png b/docs/ja/integrations/migration/images/ch-local-04.png new file mode 100644 index 00000000000..bab1739aee7 Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-04.png differ diff --git a/docs/ja/integrations/migration/images/object-storage-01.png b/docs/ja/integrations/migration/images/object-storage-01.png new file mode 100644 index 00000000000..6f6108ac334 Binary files /dev/null and b/docs/ja/integrations/migration/images/object-storage-01.png differ diff --git a/docs/ja/integrations/migration/images/rockset_0.png b/docs/ja/integrations/migration/images/rockset_0.png new file mode 100644 index 00000000000..63f23d18fae Binary files /dev/null and b/docs/ja/integrations/migration/images/rockset_0.png differ diff --git a/docs/ja/integrations/migration/images/rockset_1.png b/docs/ja/integrations/migration/images/rockset_1.png new file mode 100644 index 00000000000..928cee91af7 Binary files /dev/null and b/docs/ja/integrations/migration/images/rockset_1.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-01.png b/docs/ja/integrations/migration/images/self-managed-01.png new file mode 100644 index 00000000000..8c3d1253fad Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-01.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-02.png b/docs/ja/integrations/migration/images/self-managed-02.png new file mode 100644 index 00000000000..473d131bc3a Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-02.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-03.png b/docs/ja/integrations/migration/images/self-managed-03.png new file mode 100644 index 00000000000..8dd838958c4 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-03.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-04.png b/docs/ja/integrations/migration/images/self-managed-04.png new file mode 100644 index 00000000000..8e0e740a280 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-04.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-05.png b/docs/ja/integrations/migration/images/self-managed-05.png new file mode 100644 index 00000000000..651bc5993da Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-05.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-06.png b/docs/ja/integrations/migration/images/self-managed-06.png new file mode 100644 index 00000000000..b0c718157d1 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-06.png differ diff --git a/docs/ja/integrations/migration/images/third-party-01.png b/docs/ja/integrations/migration/images/third-party-01.png new file mode 100644 index 00000000000..420c980c9f8 Binary files /dev/null and b/docs/ja/integrations/migration/images/third-party-01.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv1.png b/docs/ja/integrations/migration/images/uploadcsv1.png new file mode 100644 index 00000000000..b73de7ed3ca Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv1.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv2.png b/docs/ja/integrations/migration/images/uploadcsv2.png new file mode 100644 index 00000000000..76bf0de8a87 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv2.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv3.png b/docs/ja/integrations/migration/images/uploadcsv3.png new file mode 100644 index 00000000000..b138c33b426 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv3.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv4.png b/docs/ja/integrations/migration/images/uploadcsv4.png new file mode 100644 index 00000000000..a8b8c811be9 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv4.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv5.png b/docs/ja/integrations/migration/images/uploadcsv5.png new file mode 100644 index 00000000000..b3eeea8fc64 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv5.png differ diff --git a/docs/ja/integrations/migration/index.md b/docs/ja/integrations/migration/index.md new file mode 100644 index 00000000000..cd7bfff418f --- /dev/null +++ b/docs/ja/integrations/migration/index.md @@ -0,0 +1,30 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, 移行, マイグレーション, データ] +--- + +# ClickHouse へのデータ移行 + +
    + +
    + +
    + +現在のデータの場所に応じて、ClickHouse Cloud にデータを移行するためのいくつかのオプションがあります。 + +- [セルフマネージドからクラウドへ](./clickhouse-to-cloud.md): `remoteSecure` 関数を使用してデータを転送 +- [他のDBMS](./clickhouse-local-etl.md): [clickhouse-local] ETL ツールと現在のDBMS用の適切なClickHouseテーブル関数を使用 +- [どこからでも!](./etl-tool-to-clickhouse.md): 様々なデータソースに接続できる人気のETL/ELTツールの一つを使用 +- [オブジェクトストレージ](./object-storage-to-clickhouse.md): S3からClickHouseにデータを簡単に挿入 + +例として、[Redshiftからの移行](/docs/ja/integrations/data-ingestion/redshift/index.md)において、ClickHouseへのデータ移行の3つの方法を紹介しています。 diff --git a/docs/ja/integrations/migration/object-storage-to-clickhouse.md b/docs/ja/integrations/migration/object-storage-to-clickhouse.md new file mode 100644 index 00000000000..5215502c3ba --- /dev/null +++ b/docs/ja/integrations/migration/object-storage-to-clickhouse.md @@ -0,0 +1,21 @@ +--- +title: オブジェクトストレージからClickHouse Cloudへ +description: オブジェクトストレージからClickHouse Cloudへのデータ移行 +keywords: [オブジェクトストレージ, s3, azure blob, gcs, マイグレーション] +--- + +# クラウドオブジェクトストレージからClickHouse Cloudにデータを移動する + +セルフマネージドのClickHouseのマイグレーション + +クラウドオブジェクトストレージをデータレイクとして使用し、このデータをClickHouse Cloudにインポートしたい場合や、現在のデータベースシステムがデータをクラウドオブジェクトストレージに直接オフロードできる場合、Cloud Object Storageに格納されたデータをClickHouse Cloudのテーブルに移行するために、以下のテーブル関数を使用できます: + +- [s3](/docs/ja/sql-reference/table-functions/s3.md) または [s3Cluster](/docs/ja/sql-reference/table-functions/s3Cluster.md) +- [gcs](/docs/ja/sql-reference/table-functions/gcs) +- [azureBlobStorage](/docs/ja/sql-reference/table-functions/azureBlobStorage) + +現在のデータベースシステムがクラウドオブジェクトストレージにデータを直接オフロードできない場合は、[サードパーティのETL/ELTツール](./etl-tool-to-clickhouse.md) や [clickhouse-local](./clickhouse-local-etl.md) を使用して、現在のデータベースシステムからクラウドオブジェクトストレージにデータを移動し、その後、第二段階でClickHouse Cloudのテーブルにデータを移行することができます。 + +これは、データをクラウドオブジェクトストレージにオフロードし、その後ClickHouseにロードするという2段階のプロセスですが、この方法の利点は、クラウドオブジェクトストレージからの高度に並列化された読み込みをサポートする[堅牢なClickHouse Cloud](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3) により、ペタバイト規模までスケールできることです。また、[Parquet](https://clickhouse.com/docs/ja/interfaces/formats/#data-format-parquet) のような高度な圧縮フォーマットを活用することもできます。 + +S3を使用してClickHouse Cloudにデータを取り込む方法を具体的なコード例で示した[ブログ記事](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3)があります。 diff --git a/docs/ja/integrations/migration/rockset.md b/docs/ja/integrations/migration/rockset.md new file mode 100644 index 00000000000..39229aeb9b6 --- /dev/null +++ b/docs/ja/integrations/migration/rockset.md @@ -0,0 +1,145 @@ +--- +title: Rocksetからの移行 +slug: /ja/migrations/rockset +description: RocksetからClickHouseへの移行 +keywords: [migrate, migration, migrating, data, etl, elt, rockset] +--- + +# Rocksetからの移行 + +Rocksetはリアルタイム分析データベースであり、[2024年6月にOpenAIに買収されました](https://rockset.com/blog/openai-acquires-rockset/)。 +ユーザーは2024年9月30日午後5時PDTまでに[サービスからオフボードする](https://docs.rockset.com/documentation/docs/faq)必要があります。 + +私たちは、ClickHouse CloudがRocksetユーザーにとって素晴らしい選択肢となると考えています。このガイドでは、RocksetからClickHouseに移行する際に考慮すべきポイントについて説明します。 + +では、始めましょう! + +## 即時のサポート + +即時のサポートが必要な場合は、[このフォーム](https://clickhouse.com/company/contact?loc=docs-rockest-migrations)にご記入いただき、人間の担当者が対応いたします! + + +## ClickHouseとRocksetの比較 - 概要 + +まず、ClickHouseの強みと、Rocksetとの比較で期待される利点について簡単に説明します。 + +ClickHouseは、スキーマファーストアプローチを通じてリアルタイムパフォーマンスとコスト効率に焦点を当てています。 +半構造化データもサポートしていますが、ユーザーはデータの構造をどのように設定するかを決定することで、性能とリソースの効率を最大化するという哲学を持っています。 +上記のスキーマファーストアプローチの結果として、ベンチマークでは、ClickHouseはRocksetを上回るスケーラビリティ、インジェスショントラフプット、クエリパフォーマンス、およびコスト効率を実現しています。 + +他のデータシステムとの統合に関しては、ClickHouseにはRocksetを超える[広範な機能](/ja/integrations)があります。 + +RocksetとClickHouseの両方は、クラウドベースの製品と関連するサポートサービスを提供しています。 +Rocksetとは異なり、ClickHouseにはオープンソース製品とコミュニティがあります。 +ClickHouseのソースコードは[github.com/clickhouse/clickhouse](https://github.com/clickhouse/clickhouse)で見つけることができ、執筆時点で1,500人を超える貢献者がいます。 +[ClickHouse Community Slack](https://clickhouse.com/slack)には、7,000人以上のメンバーが経験やベストプラクティスを共有し、問題に対する支援をしています。 + +この移行ガイドはRocksetからClickHouse Cloudへの移行に焦点を当てていますが、ユーザーはオープンソース機能に関する[その他のドキュメント](/)も参照できます。 + +## Rocksetのキーポイント + +まず、[Rocksetのキーポイント](https://docs.rockset.com/documentation/docs/key-concepts)を見て、ClickHouse Cloudでの同等の機能(存在する場合)を説明します。 + +### データソース + +RocksetとClickHouseの両方が様々なソースからデータのロードをサポートしています。 + +Rocksetでは、データソースを作成し、そのデータソースに基づいて_コレクション_を作成します。 +イベントストリーミングプラットフォーム、OLTPデータベース、クラウドバケットストレージに対する完全管理された統合があります。 + +ClickHouse Cloudでは、完全管理された統合の同等物は[ClickPipes](/ja/integrations/ClickPipes)です。 +ClickPipesはイベントストリーミングプラットフォームとクラウドバケットストレージから継続的にデータをロードすることをサポートしています。 +ClickPipesはデータを_テーブル_にロードします。 + +### インジェスト変換 + +Rocksetのインジェスト変換は、Rocksetに入ってくる生データをコレクションに保存する前に変換することができます。 +ClickHouse CloudでもClickPipesを通じて同様のことができ、ClickHouseの[Materialized View機能](/ja/guides/developer/cascading-materialized-views)を使用してデータを変換します。 + +### コレクション + +Rocksetでは、クエリをコレクションに対して実行します。ClickHouse Cloudでは、クエリをテーブルに対して実行します。 +どちらのサービスでも、クエリはSQLを使用して実行されます。 +ClickHouseは、データを操作および変換するためのSQL標準の関数に加えて、さらなる関数を追加しています。 + +### クエリ ラムダ + +Rocksetは、専用のRESTエンドポイントから実行できる名前付きのパラメータ化されたクエリであるクエリ ラムダをサポートしています。 +ClickHouse Cloudの[クエリAPIエンドポイント](/ja/get-started/query-endpoints)は同様の機能を提供しています。 + +### ビュー + +Rocksetでは、SQLクエリで定義された仮想的なコレクションであるビューを作成できます。 +ClickHouse Cloudはさまざまな[ビュー](/ja/sql-reference/statements/create/view)をサポートしています: + +* _通常のビュー_ はデータを保持しません。クエリ時に別のテーブルからの読み取りを行います。 +* _パラメータ化されたビュー_ は通常のビューと似ていますが、クエリ時に解決されるパラメータと共に作成できます。 +* _Materialized View_ は対応する`SELECT`クエリによって変換されたデータを格納します。関連するソースデータに新しいデータが追加されたときにトリガーとして機能します。 + +### エイリアス + +Rocksetのエイリアスは、複数の名前をコレクションに関連付けるために使用されます。 +ClickHouse Cloudでは、同等の機能はサポートされていません。 + +### ワークスペース + +Rocksetのワークスペースは、リソース(例:コレクション、クエリラムダ、ビュー、およびエイリアス)および他のワークスペースを保持するコンテナです。 + +ClickHouse Cloudでは、完全な分離を実現するために異なるサービスを利用できます。 +また、異なるテーブル/ビューへのRBACアクセスを簡素化するためにデータベースを作成することもできます。 + +## 設計上の考慮事項 + +このセクションでは、Rocksetのキーフィーチャーをいくつか確認し、ClickHouse Cloudを使用する際の対応方法を学びます。 + +### JSONサポート + +Rocksetは、Rockset固有の型をサポートする拡張版JSON形式をサポートしています。 + +ClickHouseでJSONを操作するための方法はいくつかあります: + +* JSON推論 +* クエリ時のJSON抽出 +* インサート時のJSON抽出 + +ユーザーケースに最適なアプローチを理解するには、[JSONに関するドキュメント](/docs/ja/integrations/data-formats/json)をご覧ください。 + +さらに、ClickHouseにはまもなく[半構造化カラムデータ型](https://github.com/ClickHouse/ClickHouse/issues/54864)が追加されます。 +この新しい型は、RocksetのJSON型が提供する柔軟性をユーザーに提供するはずです。 + +### フルテキスト検索 + +Rocksetは`SEARCH`関数でフルテキスト検索をサポートしています。 +ClickHouseは検索エンジンではありませんが、[文字列検索用のさまざまな関数](/ja/sql-reference/functions/string-search-functions)を持っています。 +ClickHouseはまた、多くのシナリオで役立つ[ブルームフィルター](/ja/optimize/skipping-indexes)をサポートしています。 + +### ベクトル検索 + +Rocksetには類似度インデックスがあり、ベクトル検索アプリケーションで使用される埋め込みをインデックスするために使用できます。 + +ClickHouseも線形スキャンを使用してベクトル検索を実行できます: +- [ClickHouseでのベクトル検索 - パート1](https://clickhouse.com/blog/vector-search-clickhouse-p1?loc=docs-rockest-migrations) +- [ClickHouseでのベクトル検索 - パート2](https://clickhouse.com/blog/vector-search-clickhouse-p2?loc=docs-rockest-migrations) + +ClickHouseには[ベクトル検索類似度インデックス](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/annindexes)もありますが、このアプローチは現在実験中であり、[新しいクエリアナライザー](https://clickhouse.com/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer)とはまだ互換性がありません。 + +### OLTPデータベースからのデータのインジェスト + +Rocksetの管理された統合は、MongoDBやDynamoDBなどのOLTPデータベースからのデータのインジェストをサポートしています。 + +DynamoDBからデータをインジェストする場合は、[こちらのDynamoDB統合ガイド](/docs/ja/integrations/data-ingestion/dbms/dynamodb/index.md)を参照してください。 + +### コンピュート・コンピュート分離 + +コンピュート・コンピュート分離は、リアルタイム分析システムにおけるアーキテクチャデザインパターンで、突然のデータ流入やクエリに対応できるようにするものです。 +単一のコンポーネントがインジェストとクエリの両方を処理する場合、クエリの急増があるとインジェスト待機時間が増加し、データ流入が急増するとクエリ待機時間が増加します。 + +コンピュート・コンピュート分離は、この問題を回避するためにデータインジェストとクエリ処理のコードパスを分離します。この機能は2023年3月にRocksetで実装されました。 + +この機能は現在ClickHouse Cloudで実装中であり、プライベートプレビューに近づいています。サポートに連絡して有効化してください。 + +## 無料移行サービス + +Rocksetユーザーにとってストレスの多い時期であることを私たちは理解しています - 誰も短期間で本番データベースを移行したいとは思わないでしょう! + +ClickHouseがあなたに適しているかもしれない場合、移行をスムーズに行うために[無料移行サービス](https://clickhouse.com/comparison/rockset?loc=docs-rockest-migrations)を提供しています。 diff --git a/docs/ja/integrations/migration/upload-a-csv-file.md b/docs/ja/integrations/migration/upload-a-csv-file.md new file mode 100644 index 00000000000..98882ec3d91 --- /dev/null +++ b/docs/ja/integrations/migration/upload-a-csv-file.md @@ -0,0 +1,29 @@ +--- +title: "CSVファイルのアップロード" +--- + +# CSVファイルのアップロード + +ヘッダー行にカラム名を含むCSVまたはTSVファイルをアップロードすると、ClickHouseはカラムのデータ型を推測するために一連の行を事前処理し、その後新しいテーブルに行を挿入します。 + +1. **ClickHouse Cloud**サービスの**詳細**ページに移動します。 + + ![詳細ページ](./images/uploadcsv1.png) + +2. **アクション**ドロップダウンメニューから**データの読み込み**を選択します。 + + ![データの追加](./images/uploadcsv2.png) + +3. **データソース**ページで**ファイルアップロード**ボタンをクリックし、表示されるダイアログウィンドウでアップロードしたいファイルを選択します。**開く**をクリックして続行します(以下の例はmacOSですが、他のオペレーティングシステムでは異なる場合があります)。 + + ![アップロードするファイルを選択](./images/uploadcsv3.png) + +4. ClickHouseが推測したデータ型が表示されます。 + + ![推測されたデータ型](./images/uploadcsv4.png) + +5. ***新しいテーブル名を入力***して、データを挿入する準備ができたら、**ClickHouseにインポート**ボタンをクリックします。 + + ![アップロードするファイルを選択](./images/uploadcsv5.png) + +6. ClickHouseサービスに接続し、テーブルが正常に作成されたことを確認してください。データが準備完了です! データを可視化したい場合は、簡単にClickHouseに接続できるいくつかの[BIツール](../data-visualization.md)をチェックしてください。 diff --git a/docs/ja/integrations/no-code/_category_.yml b/docs/ja/integrations/no-code/_category_.yml new file mode 100644 index 00000000000..95665c8dc01 --- /dev/null +++ b/docs/ja/integrations/no-code/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'No-Code platforms' +collapsible: true +collapsed: true +link: + type: generated-index + title: No-Code platforms + slug: /ja/integrations/no-code diff --git a/docs/ja/integrations/no-code/images/retool_01.png b/docs/ja/integrations/no-code/images/retool_01.png new file mode 100644 index 00000000000..89219697453 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_01.png differ diff --git a/docs/ja/integrations/no-code/images/retool_02.png b/docs/ja/integrations/no-code/images/retool_02.png new file mode 100644 index 00000000000..e6d02e41ba6 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_02.png differ diff --git a/docs/ja/integrations/no-code/images/retool_03.png b/docs/ja/integrations/no-code/images/retool_03.png new file mode 100644 index 00000000000..1ed2cfa91c8 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_03.png differ diff --git a/docs/ja/integrations/no-code/images/retool_04.png b/docs/ja/integrations/no-code/images/retool_04.png new file mode 100644 index 00000000000..959103a7b83 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_04.png differ diff --git a/docs/ja/integrations/no-code/images/retool_05.png b/docs/ja/integrations/no-code/images/retool_05.png new file mode 100644 index 00000000000..3726cfd40fd Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_05.png differ diff --git a/docs/ja/integrations/no-code/retool.md b/docs/ja/integrations/no-code/retool.md new file mode 100644 index 00000000000..65b8de193d0 --- /dev/null +++ b/docs/ja/integrations/no-code/retool.md @@ -0,0 +1,41 @@ +--- +sidebar_label: Retool +slug: /ja/integrations/retool +keywords: [clickhouse, retool, connect, integrate, ui, admin, panel, dashboard, nocode, no-code] +description: 豊富なユーザーインターフェースを備えたウェブやモバイルアプリをすばやく構築し、複雑なタスクを自動化し、AIを統合する—すべてデータによって支えられています。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# RetoolをClickHouseに接続する + +## 1. 接続情報を収集する + + +## 2. ClickHouseリソースを作成する + +Retoolアカウントにログインし、_Resources_ タブに移動します。「Create New」 -> 「Resource」を選択してください: + +新しいリソースを作成 +
    + +利用可能なコネクタのリストから「JDBC」を選択します: + +JDBCコネクタを選択 +
    + +セットアップウィザードで、「Driver name」として `com.clickhouse.jdbc.ClickHouseDriver` を必ず選択してください: + +正しいドライバを選択 +
    + +ClickHouseの認証情報を次の形式で入力します: `jdbc:clickhouse://HOST:PORT/DATABASE?user=USERNAME&password=PASSWORD`。インスタンスがSSLを必要とする場合やClickHouse Cloudを使用している場合は、接続文字列に `&ssl=true` を追加してください。このようになります: `jdbc:clickhouse://HOST:PORT/DATABASE?user=USERNAME&password=PASSWORD&ssl=true` + +認証情報を指定 +
    + +その後、接続をテストしてください: + +接続をテスト +
    + +これで、あなたのアプリでClickHouseリソースを使用して進めることができます。 diff --git a/docs/ja/integrations/prometheus.md b/docs/ja/integrations/prometheus.md new file mode 100644 index 00000000000..793c29427f2 --- /dev/null +++ b/docs/ja/integrations/prometheus.md @@ -0,0 +1,263 @@ +--- +slug: /ja/integrations/prometheus +sidebar_label: Prometheus +title: Prometheus +description: ClickHouseのメトリクスをPrometheusにエクスポートします +keywords: [prometheus, grafana, 監視, メトリクス, エクスポーター] +--- + +# Prometheus統合 + +この機能は、[Prometheus](https://prometheus.io/)を統合してClickHouse Cloudサービスを監視することをサポートします。Prometheusメトリクスへのアクセスは、[ClickHouse Cloud API](/ja/cloud/manage/api/api-overview) エンドポイントを介して公開され、ユーザーが安全に接続し、メトリクスをPrometheusメトリクスコレクターにエクスポートすることを可能にします。これらのメトリクスは、GrafanaやDatadogなどのダッシュボードに統合して可視化することができます。 + +開始するには、[APIキーを生成](/ja/cloud/manage/openapi)してください。 + +## PrometheusエンドポイントAPIでClickHouse Cloudメトリクスを取得する + +### APIリファレンス + +|Method|Path| +|---|---| +|GET|https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus| + +**リクエストパラメータ** + +|Name|Type| +|---|---| +|Organization ID|uuid| +|Service ID|uuid| + +### 認証 + +基本認証にはClickHouse Cloud APIキーを使用します: + +```bash +Username: +Password: + +例: +export KEY_SECRET= +export KEY_ID= +export ORG_ID= +export SERVICE_ID= +curl --silent --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services/$SERVICE_ID/prometheus +``` + +### サンプルレスポンス + +``` +# HELP ClickHouse_ServiceInfo サービスに関する情報、クラスタステータスおよびClickHouseバージョンを含む +# TYPE ClickHouse_ServiceInfo untyped +ClickHouse_ServiceInfo{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",clickhouse_cluster_status="running",clickhouse_version="24.5",scrape="full"} 1 + +# HELP ClickHouseProfileEvents_Query 解釈されるクエリ数および潜在的に実行されるクエリ数。解析に失敗したクエリや、ASTサイズ制限、クォータ制限、または同時実行クエリ数の制限により拒否されたクエリは含まれません。ClickHouseによって内部的に開始されたクエリを含むことがあります。サブクエリはカウントしません。 +# TYPE ClickHouseProfileEvents_Query counter +ClickHouseProfileEvents_Query{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 6 + +# HELP ClickHouseProfileEvents_QueriesWithSubqueries すべてのサブクエリを含むクエリの数 +# TYPE ClickHouseProfileEvents_QueriesWithSubqueries counter +ClickHouseProfileEvents_QueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 230 + +# HELP ClickHouseProfileEvents_SelectQueriesWithSubqueries すべてのサブクエリを含むSELECTクエリの数 +# TYPE ClickHouseProfileEvents_SelectQueriesWithSubqueries counter +ClickHouseProfileEvents_SelectQueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 224 + +# HELP ClickHouseProfileEvents_FileOpen 開かれたファイルの数。 +# TYPE ClickHouseProfileEvents_FileOpen counter +ClickHouseProfileEvents_FileOpen{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 4157 + +# HELP ClickHouseProfileEvents_Seek 'lseek' 関数が呼び出された回数。 +# TYPE ClickHouseProfileEvents_Seek counter +ClickHouseProfileEvents_Seek{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 1840 +``` + +### メトリクスラベル + +すべてのメトリクスには以下のラベルがあります: + +|Label|Description| +|---|---| +|clickhouse_org|組織ID| +|clickhouse_service|サービスID| +|clickhouse_service_name|サービス名| + +### 情報メトリクス + +ClickHouse Cloudは特別なメトリクス`ClickHouse_ServiceInfo`を提供しています。これは常に値`1`を持つ`gauge`です。このメトリクスにはすべての**メトリクスラベル**と以下のラベルが含まれます: + +|Label|Description| +|---|---| +|clickhouse_cluster_status|サービスのステータス。以下のいずれかになります:[`awaking` \| `running` \| `degraded` \| `idle` \| `stopped`]| +|clickhouse_version|サービスが実行しているClickHouseサーバーのバージョン| +|scrape|最後のスクレイプのステータスを示します。`full`または`partial`のいずれかになります| +|full|最後のメトリクススクレイプ中にエラーがなかったことを示します| +|partial|最後のメトリクススクレイプ中にいくつかのエラーがあり、`ClickHouse_ServiceInfo`メトリクスのみが返されたことを示します| + +メトリクスを取得するリクエストは、アイドル状態のサービスを再開させません。サービスが`idle`状態の場合、`ClickHouse_ServiceInfo`メトリクスのみが返されます。 + +### Prometheusの設定 + +Prometheusサーバーは、指定された間隔で設定されたターゲットからメトリクスを収集します。以下は、ClickHouse Cloud Prometheusエンドポイントを使用するためのPrometheusサーバーの設定例です: + +```yaml +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "clickhouse" + static_configs: + - targets: ["api.clickhouse.cloud"] + scheme: https + metrics_path: "/v1/organizations//services//prometheus" + basic_auth: + username: + password: + honor_labels: true +``` + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +## Grafanaとの統合 + +ユーザーは、Grafanaと統合するための主な方法が2つあります: + +- **Metrics Endpoint** – この方法は、追加のコンポーネントやインフラを必要としない利点があります。この提供はGrafana Cloudに限定されており、ClickHouse Cloud PrometheusエンドポイントURLと認証情報のみが必要です。 +- **Grafana Alloy** - Grafana Alloyは、Grafana Agentに代わるOpenTelemetry (OTel) Collectorのベンダー中立なディストリビューションです。これはスクレーパーとして使用可能で、独自のインフラストラクチャにデプロイ可能で、どのPrometheusエンドポイントとも互換性があります。 + +これらのオプションを使用する方法についての指示を以下に示します。ClickHouse Cloud Prometheusエンドポイントに特化した詳細に焦点を当てています。 + +### Grafana CloudとMetrics Endpoint + +- Grafana Cloudアカウントにログイン +- **Metrics Endpoint**を選択して新しい接続を追加 +- Prometheusエンドポイントを指すようにScrape URLを設定し、基本認証を使用してAPIキー/シークレットで接続を設定 +- 接続ができることを確認するためにテスト + +Grafana Metrics Endpointを設定 + +
    + +設定後、ダッシュボードを設定するメトリクスを選択するためのドロップダウンが表示されるはずです: + +Grafana Metrics Explorerドロップダウン + +
    + +Grafana Metrics Explorerチャート + +### Grafana CloudとAlloy + +Grafana Cloudを使用している場合、AlloyをGrafanaのAlloyメニューに移動して画面の指示に従うことでインストールできます: + +Grafana Alloy + +
    + +これにより、認証トークンを用いてGrafana Cloudエンドポイントにデータを送信するための`prometheus.remote_write`コンポーネントを持つようにAlloyが設定されます。ユーザーはAlloyの設定(Linuxでは`/etc/alloy/config.alloy`にあります)を変更して、ClickHouse Cloud Prometheusエンドポイント用のスクレーパーを含める必要があります。 + +以下は、ClickHouse Cloudエンドポイントからメトリクスをスクレイプするための`prometheus.scrape`コンポーネントを含むAlloyの設定例です。また自動的に設定された`prometheus.remote_write`コンポーネントも含まれています。`basic_auth`設定コンポーネントには私たちのCloud APIキーIDおよびシークレットがそれぞれユーザー名とパスワードとして含まれていることに注意してください。 + +```yaml +prometheus.scrape "clickhouse_cloud" { + // 通常のリッスンアドレスからメトリクスを収集します。 + targets = [{ + __address__ = "https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus", +// 例: https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus + }] + + honor_labels = true + + basic_auth { + username = "KEY_ID" + password = "KEY_SECRET" + } + + forward_to = [prometheus.remote_write.metrics_service.receiver] + // follows to metrics_service below +} + +prometheus.remote_write "metrics_service" { + endpoint { + url = "https://prometheus-prod-10-prod-us-central-0.grafana.net/api/prom/push" + basic_auth { + username = "" + password = "" + } + } +} +``` + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +### セルフマネージドのGrafanaとAlloy + +セルフマネージドのGrafanaユーザーは、[こちら](https://grafana.com/docs/alloy/latest/get-started/install/)でAlloyエージェントをインストールするための手順を見つけることができます。ユーザーがPrometheusメトリクスを送りたい目的の場所にAlloyを設定していることを前提としています。以下の`prometheus.scrape`コンポーネントは、AlloyがClickHouse Cloudエンドポイントをスクレイプする原因となります。`prometheus.remote_write`がスクレイプされたメトリクスを受け取ると想定しています。この設定が存在しない場合は、フォワード先を希望のデスティネーションに調整してください。 + +```yaml +prometheus.scrape "clickhouse_cloud" { + // 通常のリッスンアドレスからメトリクスを収集します。 + targets = [{ + __address__ = "https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus", +// 例: https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus + }] + + honor_labels = true + + basic_auth { + username = "KEY_ID" + password = "KEY_SECRET" + } + + forward_to = [prometheus.remote_write.metrics_service.receiver] + // preferred receiverに転送。修正してください。 +} +``` + +設定すると、メトリクスエクスプローラーにClickHouse関連のメトリクスが表示されるはずです: + +Grafana Metrics Explorer + +
    + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +## Datadogとの統合 + +Datadog [Agent](https://docs.datadoghq.com/agent/?tab=Linux)および[OpenMetrics統合](https://docs.datadoghq.com/integrations/openmetrics/)を使用して、ClickHouse Cloudエンドポイントからメトリクスを収集することができます。以下は、このエージェントと統合のための簡単な設定例です。ただし、最も関心があるメトリクスのみを選択したいかもしれませんことに注意してください。以下のキャッチオールの例は、多くのメトリクスインスタンスの組み合わせをエクスポートし、Datadogはそれをカスタムメトリクスとして扱います。 + +```yaml +init_config: + +instances: + - openmetrics_endpoint: 'https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus' + namespace: 'clickhouse' + metrics: + - '^ClickHouse.*' + username: username + password: password +``` + +
    + +Prometheus Datadog Integration diff --git a/docs/ja/integrations/sql-clients/_category_.yml b/docs/ja/integrations/sql-clients/_category_.yml new file mode 100644 index 00000000000..e69789ad1c0 --- /dev/null +++ b/docs/ja/integrations/sql-clients/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'SQL clients' +collapsible: true +collapsed: true +link: + type: generated-index + title: SQL clients + slug: /ja/integrations/sql-clients diff --git a/docs/ja/integrations/sql-clients/datagrip.md b/docs/ja/integrations/sql-clients/datagrip.md new file mode 100644 index 00000000000..19cc22fd876 --- /dev/null +++ b/docs/ja/integrations/sql-clients/datagrip.md @@ -0,0 +1,53 @@ +--- +sidebar_label: DataGrip +slug: /ja/integrations/datagrip +description: DataGrip は、ClickHouse を標準でサポートするデータベース IDE です。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DataGrip を ClickHouse に接続する + +## DataGrip を開始またはダウンロード + +DataGrip は https://www.jetbrains.com/datagrip/ で入手できます。 + +## 1. 接続情報を集める + + +## 2. ClickHouse ドライバーをロードする + +1. DataGrip を起動し、**Data Sources and Drivers** ダイアログの **Data Sources** タブで **+** アイコンをクリックします。 + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-5.png) + + **ClickHouse** を選択します。 + + :::tip + 接続を確立するにつれて順序が変わるため、ClickHouse がリストの一番上にまだ表示されていない場合があります。 + ::: + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-6.png) + +- **Drivers** タブに切り替えて ClickHouse ドライバーをロードします。 + + DataGrip には、ダウンロードサイズを最小限に抑えるためにドライバーが付属していません。**Drivers** タブで **Complete Support** リストから **ClickHouse** を選択し、**+** 記号を展開します。**Provided Driver** オプションから **Latest stable** ドライバーを選択します。 + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-1.png) + +## 3. ClickHouse に接続する + +- データベースの接続情報を指定し、**Test Connection** をクリックします: + + 手順1で接続情報を集めました。ホストの URL、ポート、ユーザー名、パスワード、データベース名を入力し、接続をテストします。 + + :::tip + DataGrip ダイアログの **HOST** エントリーは実際には URL です。以下の画像を参照してください。 + + JDBC URL 設定の詳細については、[ClickHouse JDBC ドライバー](https://github.com/ClickHouse/clickhouse-java) リポジトリを参照してください。 + ::: + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-7.png) + +## 詳細情報 + +DataGrip の詳細については、DataGrip ドキュメントを参照してください。 diff --git a/docs/ja/integrations/sql-clients/dbeaver.md b/docs/ja/integrations/sql-clients/dbeaver.md new file mode 100644 index 00000000000..2d5966b6d00 --- /dev/null +++ b/docs/ja/integrations/sql-clients/dbeaver.md @@ -0,0 +1,70 @@ +--- +slug: /ja/integrations/dbeaver +sidebar_label: DBeaver +description: DBeaverはマルチプラットフォームデータベースツールです。 +--- + +# DBeaverをClickHouseに接続する + +DBeaverには複数の提供形態があります。このガイドでは、[DBeaver Community](https://dbeaver.io/)を使用します。さまざまな提供形態と機能については[こちら](https://dbeaver.com/edition/)をご覧ください。DBeaverはJDBCを使用してClickHouseに接続します。 + +:::note +ClickHouseの`Nullable`カラムのサポートを改善するため、DBeaverバージョン23.1.0以上を使用してください。 +::: + +## 1. ClickHouseの詳細を収集する + +DBeaverはJDBCをHTTP(S)経由で使用してClickHouseに接続します。以下の情報が必要です: + +- エンドポイント +- ポート番号 +- ユーザー名 +- パスワード + +## 2. DBeaverをダウンロードする + +DBeaverはhttps://dbeaver.io/download/ から入手できます。 + +## 3. データベースを追加する + +- **Database > New Database Connection** メニューまたは **Database Navigator** 内の **New Database Connection** アイコンを使用して、**Connect to a database** ダイアログを表示します: + +![Add a new database](./images/dbeaver-add-database.png) + +- **Analytical**を選択し、続けて**ClickHouse**を選択します: + +- JDBC URLを構築します。**Main**タブでホスト、ポート、ユーザー名、パスワード、データベースを設定します: + +![Set the hostname, port, user, password, and database name](./images/dbeaver-host-port.png) + +- デフォルトでは、**SSL > Use SSL**プロパティは未設定になっています。ClickHouse CloudやHTTPポートでSSLを要求するサーバーに接続する場合は、**SSL > Use SSL**をオンにします: + +![Enable SSL if required](./images/dbeaver-use-ssl.png) + +- 接続をテストします: + +![Test the connection](./images/dbeaver-test-connection.png) + +もしDBeaverがClickHouseドライバがインストールされていないと検出した場合、ダウンロードを案内します: + +![Download the ClickHouse driver](./images/dbeaver-download-driver.png) + +- ドライバをダウンロードした後、再度**Test**接続を行います: + +![Test the connection](./images/dbeaver-test-connection.png) + +## 4. ClickHouseにクエリを実行する + +クエリエディタを開いてクエリを実行します。 + +- 接続を右クリックして**SQL Editor > Open SQL Script**を選び、クエリエディタを開きます: + +![Open the SQL editor](./images/dbeaver-sql-editor.png) + +- `system.query_log`に対する例のクエリ: + + ![A sample query](./images/dbeaver-query-log-select.png) + +## 次のステップ + +DBeaverの機能について学ぶには[DBeaver wiki](https://github.com/dbeaver/dbeaver/wiki)を、ClickHouseの機能について学ぶには[ClickHouseのドキュメント](https://clickhouse.com/docs)をご覧ください。 diff --git a/docs/ja/integrations/sql-clients/dbvisualizer.md b/docs/ja/integrations/sql-clients/dbvisualizer.md new file mode 100644 index 00000000000..2890db8f59a --- /dev/null +++ b/docs/ja/integrations/sql-clients/dbvisualizer.md @@ -0,0 +1,49 @@ +--- +sidebar_label: DbVisualizer +slug: /ja/integrations/dbvisualizer +description: DbVisualizerはClickHouseに対する拡張サポートを備えたデータベースツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DbVisualizerをClickHouseに接続 + +## DbVisualizerの開始またはダウンロード + +DbVisualizerは https://www.dbvis.com/download/ で入手可能です。 + +## 1. 接続詳細を集める + + + +## 2. 組み込みJDBCドライバ管理 + +DbVisualizerには、ClickHouse用の最新のJDBCドライバが含まれています。最新のリリースや過去のバージョンへの完全なJDBCドライバ管理が組み込まれています。 + +![](@site/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png) + +## 3. ClickHouseに接続 + +DbVisualizerでデータベースに接続するには、まずデータベース接続を作成し設定する必要があります。 + +1. **Database->Create Database Connection**から新しい接続を作成し、ポップアップメニューからデータベースのドライバを選びます。 + +2. 新しい接続のための**Object View**タブが開かれます。 + +3. **Name**フィールドに接続の名前を入力し、オプションで**Notes**フィールドに接続の説明を入力します。 + +4. **Database Type**は**Auto Detect**のままにしておきます。 + +5. **Driver Type**内で選択したドライバに緑のチェックマークが付いている場合、それは使用可能です。緑のチェックマークが付いていない場合は、**Driver Manager**でドライバを構成する必要があるかもしれません。 + +6. 残りのフィールドにデータベースサーバーの情報を入力します。 + +7. **Ping Server**ボタンをクリックして、指定されたアドレスとポートにネットワーク接続を確立できることを確認します。 + +8. Ping Serverの結果がサーバーに到達できることを示している場合は、**Connect**をクリックしてデータベースサーバーに接続します。 + +:::tip +データベースへの接続に問題がある場合は、[Fixing Connection Issues](https://confluence.dbvis.com/display/UG231/Fixing+Connection+Issues)を参照してください。 + +## 詳細情報 + +DbVisualizerの詳細については、[DbVisualizer のドキュメント](https://confluence.dbvis.com/display/UG231/Users+Guide)を参照してください。 diff --git a/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png b/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png new file mode 100644 index 00000000000..6e34d348505 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-1.png b/docs/ja/integrations/sql-clients/images/datagrip-1.png new file mode 100644 index 00000000000..db671163a5a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-2.png b/docs/ja/integrations/sql-clients/images/datagrip-2.png new file mode 100644 index 00000000000..e46de6f229f Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-3.png b/docs/ja/integrations/sql-clients/images/datagrip-3.png new file mode 100644 index 00000000000..c99fa6ed34e Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-3.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-4.png b/docs/ja/integrations/sql-clients/images/datagrip-4.png new file mode 100644 index 00000000000..0ce6be5f35a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-4.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-5.png b/docs/ja/integrations/sql-clients/images/datagrip-5.png new file mode 100644 index 00000000000..dd8edfb7afb Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-5.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-6.png b/docs/ja/integrations/sql-clients/images/datagrip-6.png new file mode 100644 index 00000000000..a51e34f6f0b Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-6.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-7.png b/docs/ja/integrations/sql-clients/images/datagrip-7.png new file mode 100644 index 00000000000..f30d7414d08 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-7.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png b/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png new file mode 100644 index 00000000000..629bc272b76 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png b/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png new file mode 100644 index 00000000000..5268926e997 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png b/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png new file mode 100644 index 00000000000..d3df12a39e9 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png b/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png new file mode 100644 index 00000000000..217e7c1dbcc Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png b/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png new file mode 100644 index 00000000000..01f6e70286c Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png b/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png new file mode 100644 index 00000000000..94d84f0ff94 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png b/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png new file mode 100644 index 00000000000..5143fcc1127 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png b/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png new file mode 100644 index 00000000000..97f850f0a82 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png b/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png new file mode 100644 index 00000000000..8963183f498 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png b/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png new file mode 100644 index 00000000000..208ea5cf26c Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png b/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png new file mode 100644 index 00000000000..a3ab9a9b192 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png b/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png new file mode 100644 index 00000000000..03c5df28acb Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png differ diff --git a/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png b/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png new file mode 100644 index 00000000000..477b7c2834a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png b/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png new file mode 100644 index 00000000000..f850c67a4a5 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png b/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png new file mode 100644 index 00000000000..71f01e97f35 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png differ diff --git a/docs/ja/integrations/sql-clients/images/qstudio-running-query.png b/docs/ja/integrations/sql-clients/images/qstudio-running-query.png new file mode 100644 index 00000000000..ea35291a640 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/qstudio-running-query.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-0.png b/docs/ja/integrations/sql-clients/images/tablum-ch-0.png new file mode 100644 index 00000000000..e813098736f Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-0.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-1.png b/docs/ja/integrations/sql-clients/images/tablum-ch-1.png new file mode 100644 index 00000000000..bae9f90579b Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-2.png b/docs/ja/integrations/sql-clients/images/tablum-ch-2.png new file mode 100644 index 00000000000..e09ea11d3e5 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-3.png b/docs/ja/integrations/sql-clients/images/tablum-ch-3.png new file mode 100644 index 00000000000..d165d77837e Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-3.png differ diff --git a/docs/ja/integrations/sql-clients/jupysql.md b/docs/ja/integrations/sql-clients/jupysql.md new file mode 100644 index 00000000000..38702438008 --- /dev/null +++ b/docs/ja/integrations/sql-clients/jupysql.md @@ -0,0 +1,430 @@ +--- +slug: /ja/integrations/jupysql +sidebar_label: Jupyter notebooks +description: JupysqlはJupyter向けのマルチプラットフォームデータベースツールです。 +--- + +# ClickHouseでJupySQLを使用する +このガイドでは、ClickHouseとの統合について説明します。 + +Jupysqlを使ってClickHouse上でクエリを実行します。データがロードされた後、SQLプロットでデータを可視化します。 + +JupysqlとClickHouseの統合は、clickhouse_sqlalchemyライブラリを使用することで可能になります。このライブラリは、両システム間のコミュニケーションを容易にし、ClickHouseに接続してSQL方言を渡すことを可能にします。接続されたら、ClickhouseのネイティブUIまたはJupyterノートブックから直接SQLクエリを実行できます。 + +```python +# 必要なパッケージをインストール +%pip install --quiet jupysql clickhouse_sqlalchemy +``` + + 注: 更新されたパッケージを使用するにはカーネルを再起動する必要があるかもしれません。 + + + +```python +import pandas as pd +from sklearn_evaluation import plot + +# jupysql Jupyter拡張機能をインポートしてSQLセルを作成 +%load_ext sql +%config SqlMagic.autocommit=False +``` + +**次の段階に進むには、Clickhouseが起動してアクセス可能であることを確認してください。ローカル版またはクラウド版のどちらでも利用できます。** + +**注:** 接続文字列は、接続しようとしているインスタンスタイプ(URL、ユーザー、パスワード)に応じて調整する必要があります。以下の例ではローカルインスタンスを使用しています。詳しくは、[こちらのガイド](https://clickhouse.com/docs/ja/getting-started/quick-start)をご覧ください。 + +```python +%sql clickhouse://default:@localhost:8123/default +``` + +```sql +%%sql +CREATE TABLE trips +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + +
    + + +
    + + + + +```sql +%%sql +INSERT INTO trips +SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{1..2}.gz', + 'TabSeparatedWithNames', " + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +") SETTINGS input_format_try_infer_datetimes = 0 +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + +
    + + + + +```python +%sql SELECT count() FROM trips limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + +
    count()
    1999657
    + + + + +```python +%sql SELECT DISTINCT(pickup_ntaname) FROM trips limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + +
    pickup_ntaname
    Morningside Heights
    Hudson Yards-Chelsea-Flatiron-Union Square
    Midtown-Midtown South
    SoHo-TriBeCa-Civic Center-Little Italy
    Murray Hill-Kips Bay
    + + + + +```python +%sql SELECT round(avg(tip_amount), 2) FROM trips +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + +
    round(avg(tip_amount), 2)
    1.68
    + + + + +```sql +%%sql +SELECT + passenger_count, + ceil(avg(total_amount),2) AS average_total_amount +FROM trips +GROUP BY passenger_count +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    passenger_countaverage_total_amount
    022.69
    115.97
    217.15
    316.76
    417.33
    516.35
    616.04
    759.8
    836.41
    99.81
    + + + + +```sql +%%sql +SELECT + pickup_date, + pickup_ntaname, + SUM(1) AS number_of_trips +FROM trips +GROUP BY pickup_date, pickup_ntaname +ORDER BY pickup_date ASC +limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    pickup_datepickup_ntanamenumber_of_trips
    2015-07-01Bushwick North2
    2015-07-01Brighton Beach1
    2015-07-01Briarwood-Jamaica Hills3
    2015-07-01Williamsburg1
    2015-07-01Queensbridge-Ravenswood-Long Island City9
    + + + + +```python +# %sql DESCRIBE trips; +``` + + +```python +# %sql SELECT DISTINCT(trip_distance) FROM trips limit 50; +``` + + +```sql +%%sql --save short-trips --no-execute +SELECT * +FROM trips +WHERE trip_distance < 6.3 +``` + + * clickhouse://default:***@localhost:8123/default + Skipping execution... + + + +```python +%sqlplot histogram --table short-trips --column trip_distance --bins 10 --with short-trips +``` + + + + + + + + + + +![histogram example](images/jupysql-plot-1.png) + + + + +```python +ax = %sqlplot histogram --table short-trips --column trip_distance --bins 50 --with short-trips +ax.grid() +ax.set_title("Trip distance from trips < 6.3") +_ = ax.set_xlabel("Trip distance") +``` + + + +![histogram second example](images/jupysql-plot-1.png) diff --git a/docs/ja/integrations/sql-clients/qstudio.md b/docs/ja/integrations/sql-clients/qstudio.md new file mode 100644 index 00000000000..e67232e24e1 --- /dev/null +++ b/docs/ja/integrations/sql-clients/qstudio.md @@ -0,0 +1,58 @@ +--- +slug: /ja/integrations/qstudio +sidebar_label: qStudio +description: qStudioは無料のSQLツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +qStudioは無料のSQL GUIで、SQLスクリプトの実行、テーブルの簡単なブラウジング、結果のグラフ化やエクスポートが可能です。すべてのオペレーティングシステムで、すべてのデータベースで動作します。 + +# qStudioをClickHouseに接続する + +qStudioはJDBCを使用してClickHouseに接続します。 + +## 1. ClickHouseの詳細情報を収集する + +qStudioはJDBC over HTTP(S)を使ってClickHouseに接続します。必要な情報は次の通りです: + +- エンドポイント +- ポート番号 +- ユーザー名 +- パスワード + + + +## 2. qStudioをダウンロードする + +qStudioはhttps://www.timestored.com/qstudio/download/ で入手可能です。 + +## 3. データベースを追加する + +- qStudioを初めて開くとき、メニューオプションの**Server->Add Server**やツールバーのサーバー追加ボタンをクリックしてください。 +- 次に詳細を設定します: + +![新しいデータベースを設定する](./images/qstudio-add-connection.png) + +1. サーバータイプ: Clickhouse.com +2. ホストには**https://**を必ず含めてください。 + ホスト: https://abc.def.clickhouse.cloud + ポート: 8443 +3. ユーザー名: default + パスワード: XXXXXXXXXXX +4. 「追加」をクリック + +qStudioがClickHouse JDBCドライバーがインストールされていないと判断した場合は、ダウンロードを促します: + +## 4. ClickHouseにクエリを実行する + +- クエリエディタを開いてクエリを実行します。クエリは次の方法で実行できます: +- Ctrl + e - ハイライトされたテキストを実行 +- Ctrl + Enter - 現在の行を実行 + +- クエリの例: + + ![サンプルクエリ](./images/qstudio-running-query.png) + +## 次のステップ + +QStudioの機能については[QStudio](https://www.timestored.com/qstudio)を参照し、ClickHouseの機能については[ClickHouseのドキュメント](https://clickhouse.com/docs)を参照してください。 diff --git a/docs/ja/integrations/sql-clients/sql-console.md b/docs/ja/integrations/sql-clients/sql-console.md new file mode 100644 index 00000000000..4a3ac421631 --- /dev/null +++ b/docs/ja/integrations/sql-clients/sql-console.md @@ -0,0 +1,365 @@ +--- +sidebar_label: SQLコンソール +sidebar_position: 1 +--- + +# SQLコンソール + +SQLコンソールは、ClickHouse Cloudでデータベースを探索しクエリを実行する最速かつ最も簡単な方法です。SQLコンソールでは以下のことができます: +- ClickHouse Cloudサービスへの接続 +- テーブルデータの表示、フィルタリング、並び替え +- クエリの実行と結果データの数クリックでの視覚化 +- クエリをチームメンバーと共有し、より効果的にコラボレーション + +## コントロールプレーンからSQLコンソールを開く + +SQLコンソールは、サービスの概要画面から直接開くことができます。「接続」ボタンをクリックし、「SQLコンソールを開く」を選択してください。 + + ![サービスからSQLコンソールを開く](@site/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png) + +SQLコンソールは新しいタブで開き、サービスの認証情報を入力するよう促されます: + + ![認証情報を入力](@site/docs/ja/cloud/images/sqlconsole/enter-credentials.png) + +認証情報を入力した後、「接続」をクリックすると、SQLコンソールは接続と認証を試みます。成功すると、SQLコンソールのインターフェースが表示されます: + + ![認証成功](@site/docs/ja/cloud/images/sqlconsole/authentication-success.png) + +### SQLコンソールを直接読み込む + +SQLコンソールは、https://console.clickhouse.cloud にアクセスして直接読み込むことも可能です。ClickHouse Cloudアカウントにログインした後、サービスの一覧が表示されます。1つ選択し、サービス認証画面で認証情報を入力してください: + + ![サービスを選択](@site/docs/ja/cloud/images/sqlconsole/select-a-service.png) + +:::note +組織にサービスが1つしか存在しない場合、SQLコンソールは直ちにサービス認証画面に移動します。 +::: + +### サービススイッチャーを使用する + +SQLコンソールから直接サービスを簡単に切り替えることができます。コンソールの右上隅にあるサービススイッチャーを開き、別のサービスを選択してください: + + ![サービスを切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-services.png) + +## テーブルの探索 + +### テーブルリストとスキーマ情報の表示 +ClickHouseインスタンス内のテーブルの概要は、左のサイドバーエリアに表示されます。左上のデータベースセレクターを使用して、特定のデータベース内のテーブルを表示します + + ![テーブルリストとスキーマ](@site/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png) + +リスト内のテーブルは展開して、カラムとタイプを確認することもできます + + ![カラムの表示](@site/docs/ja/cloud/images/sqlconsole/view-columns.png) + +### テーブルデータの探索 + +リスト内のテーブルをクリックすると、新しいタブで開きます。テーブルビューでは、データを簡単に表示、選択、コピーできます。Microsoft ExcelやGoogle Sheetsのようなスプレッドシートアプリケーションにコピー&ペーストする際も、構造とフォーマットは維持されます。テーブルデータのページをフリップする(30行単位でページネーションされています)際は、フッタのナビゲーションを使用してください。 + + ![abc](@site/docs/ja/cloud/images/sqlconsole/abc.png) + +### セルデータの検査 +セルインスペクターツールを使用して、1つのセルに含まれる大量のデータを表示できます。セルを右クリックして「セルを検査」を選択することで開けます。セルインスペクタの内容は、上部右隅のコピーアイコンをクリックすることでコピーできます。 + + ![セルコンテンツの検査](@site/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png) + +## テーブルのフィルタリングとソート + +### テーブルのソート +SQLコンソールでテーブルをソートするには、テーブルを開き、ツールバーで「ソート」ボタンを選択します。このボタンをクリックすると、ソートを構成するメニューが開きます。ソートするカラムを選択し、ソート順(昇順または降順)を構成できます。「適用」を選択するかEnterキーを押してテーブルをソートします + + ![カラムで降順にソート](@site/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png) + +SQLコンソールでは、テーブルに複数のソートを追加することもできます。再度「ソート」ボタンをクリックして別のソートを追加します。注意:ソートは、ソートペインに表示される順(上から下)に適用されます。ソートを削除するには、ソートの横にある「x」ボタンをクリックします。 + +### テーブルのフィルタリング + +SQLコンソールでテーブルをフィルタリングするには、テーブルを開き「フィルタ」ボタンを選択します。このボタンをクリックすると、フィルタを構成するメニューが開きます。フィルタリングするカラムと必要な条件を選択します。SQLコンソールはカラムに含まれるデータのタイプに応じたフィルタオプションをインテリジェントに表示します。 + + ![ラジオカラムがGSMと等しいフィルタ](@site/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png) + +フィルタに満足したら、「適用」を選択してデータをフィルタリングします。以下のように追加のフィルタを追加することもできます。 + + ![2000より大きい範囲でフィルタを追加する](@site/docs/ja/cloud/images/sqlconsole/add-more-filters.png) + +ソート機能と同様に、フィルタの横にある「x」ボタンをクリックして削除します。 + +### 一緒にフィルタリングとソート + +SQLコンソールでは、同時にテーブルのフィルタリングとソートが可能です。上記の手順を使用してすべてのフィルタとソートを追加し、「適用」ボタンをクリックしてください。 + + ![一緒にフィルタリングとソート](@site/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png) + +### フィルタとソートからクエリを作成 + +SQLコンソールは、一度のクリックでソートとフィルタをクエリに直接変換できます。ツールバーからお好みのソートとフィルタパラメータを使用して「クエリを作成」ボタンを選択するだけです。「クエリを作成」をクリックした後、テーブルビューに含まれるデータに対応するSQLコマンドが事前に入力された新しいクエリタブが開きます。 + + ![ソートとフィルタからクエリを作成する](@site/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png) + +:::note +「クエリを作成」機能の使用時にフィルタとソートは必須ではありません。 +::: + +SQLコンソールでのクエリに関する詳細は、(リンク)クエリドキュメントをご覧ください。 + +## クエリの作成と実行 + +### クエリの作成 +SQLコンソールで新しいクエリを作成する方法は2つあります。 +* タブバーの「+」ボタンをクリック +* 左サイドバーのクエリリストから「新しいクエリ」ボタンを選択 + + ![クエリの作成](@site/docs/ja/cloud/images/sqlconsole/creating-a-query.png) + +### クエリの実行 +クエリを実行するには、SQLエディタにSQLコマンドを入力し、「実行」ボタンをクリックするか、ショートカット `cmd / ctrl + enter` を使用してください。複数のコマンドを順次記述して実行するには、各コマンドの後にセミコロンを追加してください。 + +クエリ実行オプション +デフォルトでは、「実行」ボタンをクリックするとSQLエディタに含まれるすべてのコマンドが実行されます。SQLコンソールは他の2つのクエリ実行オプションをサポートしています: +* 選択したコマンドを実行 +* カーソルのある位置のコマンドを実行 + +選択したコマンドを実行するには、目的のコマンドまたはシーケンスを選択し、「実行」ボタンをクリックする(または `cmd / ctrl + enter` ショートカットを使用)。選択がある場合、SQLエディタのコンテキストメニュー(エディタ内の任意の場所を右クリックして開く)から「選択したものを実行」を選択することもできます。 + + ![選択したクエリを実行](@site/docs/ja/cloud/images/sqlconsole/run-selected-query.png) + +カーソルの現在位置にあるコマンドを実行するには、2つの方法があります: +* 拡張実行オプションメニューから「カーソル位置で実行」を選択する(または対応する `cmd / ctrl + shift + enter` キーボードショートカットを使用) + + ![カーソル位置で実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png) + + * SQLエディタのコンテキストメニューから「カーソル位置で実行」を選択 + + ![カーソル位置で実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor.png) + +:::note +カーソル位置にあるコマンドは、実行時に黄色で点滅します。 +::: + +### クエリのキャンセル + +クエリが実行中の場合、クエリエディタのツールバーの「実行」ボタンは「キャンセル」ボタンに置き換えられます。このボタンをクリックするか `Esc` を押してクエリをキャンセルするだけです。注意:キャンセル後も既に返されている結果は持続します。 + + ![クエリをキャンセル](@site/docs/ja/cloud/images/sqlconsole/cancel-a-query.png) + +### クエリの保存 + +クエリに名前が付けられていない場合、クエリは「無題クエリ」と呼ばれるべきです。クエリ名をクリックして変更してください。クエリの名前を変更すると、クエリが保存されます。 + + ![クエリに名前を付ける](@site/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png) + +また、保存ボタンまたは `cmd / ctrl + s` キーボードショートカットを使用してクエリを保存することもできます。 + + ![クエリを保存する](@site/docs/ja/cloud/images/sqlconsole/save-the-query.png) + +## GenAIを使用したクエリの管理 + +この機能を使用すると、ユーザーはクエリを自然言語の質問形式で作成し、そのコンテキストに基づいてSQLクエリを生成できます。GenAIはクエリのデバッグも支援します。 + +GenAIに関する詳細は、[ClickHouse CloudのGenAI対応クエリ提案の発表ブログ記事](https://clickhouse.com/blog/announcing-genai-powered-query-suggestions-clickhouse-cloud)をご覧ください。 + +### テーブルセットアップ + +UK Price Paidの例のデータセットをインポートし、それを使用してGenAIクエリを作成しましょう。 + +1. ClickHouse Cloudサービスを開く。 +2. *+* アイコンをクリックして新しいクエリを作成。 +3. 次のコードを貼り付けて実行: + + ```sql + CREATE TABLE uk_price_paid + ( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0), + is_new UInt8, + duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) + ) + ENGINE = MergeTree + ORDER BY (postcode1, postcode2, addr1, addr2); + ``` + + このクエリは約1秒で完了するはずです。完了したら、`uk_price_paid`という空のテーブルができているはずです。 + +4. 新しいクエリを作成して、次のクエリを貼り付けてください: + + ```sql + INSERT INTO uk_price_paid + WITH + splitByChar(' ', postcode) AS p + SELECT + toUInt32(price_string) AS price, + parseDateTimeBestEffortUS(time) AS date, + p[1] AS postcode1, + p[2] AS postcode2, + transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type, + b = 'Y' AS is_new, + transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration, + addr1, + addr2, + street, + locality, + town, + district, + county + FROM url( + 'http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', + 'CSV', + 'uuid_string String, + price_string String, + time String, + postcode String, + a String, + b String, + c String, + addr1 String, + addr2 String, + street String, + locality String, + town String, + district String, + county String, + d String, + e String' + ) SETTINGS max_http_get_redirects=10; + ``` + +このクエリは、`gov.uk` ウェブサイトからデータセットを取得します。このファイルは約4GBの大きさがあるため、クエリの完了には数分かかります。クエリが処理されると、`uk_price_paid`テーブル内にデータセット全体が含まれているはずです。 + +#### クエリ作成 + +自然言語を使用してクエリを生成しましょう。 + +1. **uk_price_paid** テーブルを選択し、**クエリを作成** をクリックします。 +2. **SQLを生成** をクリックします。Chat-GPTにクエリを送信することに同意を求められる場合があります。この場合は **同意する** と選択してください。 +3. このプロンプトを使用して自然言語のクエリを入力し、ChatGPTにSQLクエリに変換させることができます。今回の例では次のように入力します: + + > Show me the total price and total number of all uk_price_paid transactions by year. + +4. コンソールは求めているクエリを生成し、新しいタブに表示します。今回の例では、GenAIが以下のクエリを作成しました: + + ```sql + -- Show me the total price and total number of all uk_price_paid transactions by year. + SELECT year(date), sum(price) as total_price, Count(*) as total_transactions + FROM uk_price_paid + GROUP BY year(date) + ``` + +5. 作成されたクエリが正しいことを確認したら、**実行** をクリックして実行します。 + +GenAIはエクスペリメンタルな機能であることに注意してください。GenAIによって生成されたクエリを任何のデータセットで実行する際は注意してください。 + +### デバッグ + +次に、GenAIのクエリデバッグ機能をテストしましょう。 + +1. *+* アイコンをクリックして新しいクエリを作成し、次のコードを貼り付けます: + + ```sql + -- Show me the total price and total number of all uk_price_paid transactions by year. + SELECT year(date), sum(pricee) as total_price, Count(*) as total_transactions + FROM uk_price_paid + GROUP BY year(date) + ``` + +2. **実行** をクリックします。このクエリは`pricee`を参照しようとしているため失敗します。 +3. **クエリを修正** をクリックします。 +4. GenAIはクエリを修正しようとします。この場合、`pricee`を`price`に変更しました。また、このシナリオでは`toYear`がより適していると認識しました。 +5. **適用** を選択して、提案された変更をクエリに反映し、**実行** をクリックします。 + +GenAIはエクスペリメンタルな機能であることに注意してください。GenAIによって生成されたクエリを任何のデータセットで実行する際は注意してください。 + +## 高度なクエリ機能 + +### クエリ結果の検索 + +クエリを実行した後、結果ペインの検索入力を使用して、返された結果セットを迅速に検索することができます。この機能は、追加の`WHERE`句の結果をプレビューしたり、特定のデータが結果セットに含まれていることを確認したりするのに便利です。検索入力に値を入力すると、結果ペインが更新され、その値と一致するエントリを含むレコードが返されます。この例では、ClickHouseリポジトリの`github_events`テーブル内の`alexey-milovidov`の全インスタンスを探してみましょう: + + ![GitHubデータを検索](@site/docs/ja/cloud/images/sqlconsole/search-github.png) + +注:入力された値と一致するフィールドが返されます。たとえば、上記のスクリーンショットの3つ目のレコードは`actor_login`フィールドで`alexey-milovidov`と一致していませんが、`body`フィールドで一致しています: + + ![本文で一致](@site/docs/ja/cloud/images/sqlconsole/match-in-body.png) + +### ページネーション設定の調整 + +デフォルトでは、クエリ結果ペインはすべての結果レコードを1つのページに表示します。より大きな結果セットでは、結果をページネーションして表示する方が見やすい場合があります。これは、結果ペインの右下隅にあるページネーションセレクターを使用して実現できます: + ![ページネーションオプション](@site/docs/ja/cloud/images/sqlconsole/pagination.png) + +ページサイズを選択すると、すぐに結果セットにページネーションが適用され、結果ペインフッタの中央にナビゲーションオプションが表示されます + + ![ページネーションナビゲーション](@site/docs/ja/cloud/images/sqlconsole/pagination-nav.png) + +### クエリ結果データのエクスポート + +クエリ結果セットは、SQLコンソールから直接CSV形式で簡単にエクスポートできます。右側の結果ペインツールバーの`•••`メニューを開き、「CSVとしてダウンロード」を選択してください。 + + ![CSVとしてダウンロード](@site/docs/ja/cloud/images/sqlconsole/download-as-csv.png) + +## クエリデータの視覚化 + +データの一部はチャート形式でより簡単に解釈できます。クエリ結果データからSQLコンソールで数クリックで視覚化を迅速に作成できます。例として、NYCタクシートリップの週次統計を計算するクエリを使用します: + +```sql +select + toStartOfWeek(pickup_datetime) as week, + sum(total_amount) as fare_total, + sum(trip_distance) as distance_total, + count(*) as trip_total +from + nyc_taxi +group by + 1 +order by + 1 asc +``` + + ![表形式のクエリ結果](@site/docs/ja/cloud/images/sqlconsole/tabular-query-results.png) + +視覚化がないと、これらの結果は解釈が困難です。これをチャートに変換しましょう。 + +### チャートの作成 + +視覚化の作成を開始するには、クエリ結果ペインツールバーから「チャート」オプションを選択します。チャート構成ペインが表示されます: + + ![クエリからチャートへ切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png) + +`week`ごとの`trip_total`を追跡する単純な棒グラフを作成してみましょう。これを実現するには、`week`フィールドをx軸に、`trip_total`フィールドをy軸にドラッグします: + + ![週ごとのトリップ合計](@site/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png) + +ほとんどのチャートタイプは、数値軸に複数のフィールドを持つことをサポートしています。例として、`fare_total`フィールドをy軸にドラッグしてみましょう: + + ![棒グラフ](@site/docs/ja/cloud/images/sqlconsole/bar-chart.png) + +### チャートのカスタマイズ + +SQLコンソールは10種類のチャートタイプをサポートしており、チャート構成ペインにあるチャートタイプセレクターから選択できます。たとえば、前述のチャートタイプを棒チャートからエリアチャートに簡単に変更できます: + + ![棒グラフからエリアに変更](@site/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png) + +チャートタイトルは、データを供給しているクエリの名前に一致します。クエリ名を更新すると、チャートタイトルも更新されます: + + ![クエリ名を更新](@site/docs/ja/cloud/images/sqlconsole/update-query-name.png) + +「詳細」セクションのチャート構成ペインで、より高度なチャート特性を調整することもできます。以下の設定を調整してみましょう: +- サブタイトル +- 軸タイトル +- x軸のラベルの向き + +チャートはそれに応じて更新されます: + + ![サブタイトルなどを更新](@site/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png) + +一部のシナリオでは、各フィールドの軸スケールを個別に調整する必要がある場合があります。これもチャート構成ペインの「詳細」セクションで、軸範囲の最小値と最大値を指定することで実現できます。上記のチャートは良好に見えますが、`trip_total`と`fare_total`フィールドの相関を示すためには、軸範囲にいくつかの調整が必要です: + + ![軸スケールの調整](@site/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png) diff --git a/docs/ja/integrations/sql-clients/tablum.md b/docs/ja/integrations/sql-clients/tablum.md new file mode 100644 index 00000000000..3a9da5422d3 --- /dev/null +++ b/docs/ja/integrations/sql-clients/tablum.md @@ -0,0 +1,62 @@ +--- +sidebar_label: TABLUM.IO +slug: /ja/integrations/tablumio +description: TABLUM.IOは、ClickHouseをすぐにサポートするデータ管理SaaSです。 +--- + +# TABLUM.IOをClickHouseに接続する + +## TABLUM.IOのスタートアップページを開く + +TABLUM.IOのクラウド版は[https://go.tablum.io/](https://go.tablum.io/)で利用可能です。 + +:::note + TABLUM.IOの自己ホスト版をLinuxサーバーにDockerでインストールすることもできます。 +::: + +## 1. サービスにサインアップまたはサインインする + + 最初に、メールを使用してTABLUM.IOにサインアップするか、GoogleまたはFacebookのアカウントを使用してクイックログインを行ってください。 + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-0.png) + +## 2. ClickHouseコネクタを追加する + +ClickHouseの接続情報を準備し、**Connector**タブに移動して、ホストのURL、ポート、ユーザー名、パスワード、データベース名、コネクタの名前を入力します。これらのフィールドを入力後、**Test connection**ボタンをクリックして情報を検証し、その後、**Save connector for me**をクリックして永続化します。 + +:::tip +正しい**HTTP**ポートを指定し、接続情報に応じて**SSL**モードを切り替えることを確認してください。 +::: + +:::tip +通常、TLSを使用する場合はポートが8443で、使用しない場合は8123です。 +::: + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-1.png) + +## 3. コネクタを選択する + +**Dataset**タブに移動します。ドロップダウンで最近作成したClickHouseコネクタを選択します。右側のパネルには利用可能なテーブルとスキーマのリストが表示されます。 + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-2.png) + +## 4. SQLクエリを入力して実行する + +SQLコンソールにクエリを入力し、**Run Query**を押します。結果はスプレッドシートとして表示されます。 + +:::tip +カラム名を右クリックすると、ソート、フィルタ、その他のアクションを含むドロップダウンメニューが開きます。 +::: + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-3.png) + +:::note +TABLUM.IOを使用すると、 +* あなたのTABLUM.IOアカウント内で複数のClickHouseコネクタを作成および利用でき、 +* データソースに関係なくロードされたデータでクエリを実行でき、 +* 結果を新しいClickHouseデータベースとして共有することができます。 +::: + +## 詳しく学ぶ + +TABLUM.IOに関する詳細情報はhttps://tablum.ioで見つけることができます。 diff --git a/docs/ja/interfaces/cli.md b/docs/ja/interfaces/cli.md new file mode 100644 index 00000000000..1a21c238815 --- /dev/null +++ b/docs/ja/interfaces/cli.md @@ -0,0 +1,405 @@ +--- +slug: /ja/interfaces/cli +sidebar_position: 17 +sidebar_label: コマンドラインクライアント +title: コマンドラインクライアント +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +## clickhouse-client + +ClickHouseはネイティブのコマンドラインクライアント、`clickhouse-client`を提供しています。このクライアントはコマンドラインオプションと設定ファイルをサポートしています。詳細は[設定](#interfaces_cli_configuration)をご覧ください。 + +`clickhouse-client`パッケージから[インストール](../getting-started/install.md)し、`clickhouse-client`コマンドで実行します。 + +```bash +$ clickhouse-client +ClickHouse client version 20.13.1.5273 (official build). +Connecting to localhost:9000 as user default. +Connected to ClickHouse server version 20.13.1. + +:) +``` + +異なるクライアントとサーバーバージョンは互換性がありますが、一部の機能は古いクライアントでは使用できない可能性があります。クライアントとサーバーアプリの同じバージョンを使用することをお勧めします。古いバージョンのクライアントを使用しようとすると、サーバーは`clickhouse-client`が以下のメッセージを表示します: + +```response +ClickHouse client version is older than ClickHouse server. +It may lack support for new features. +``` + +## 使用法 {#cli_usage} + +クライアントは、インタラクティブモードと非インタラクティブ(バッチ)モードで使用できます。 + +### 接続の詳細を集める + + +### インタラクティブ + +ClickHouse CloudサービスまたはTLSおよびパスワードを使用する任意のClickHouseサーバーに接続するには、インタラクティブに`--secure`、ポート9440、およびユーザー名とパスワードを指定します: + +```bash +clickhouse-client --host \ + --secure \ + --port 9440 \ + --user \ + --password +``` + +セルフマネージドのClickHouseサーバーに接続するには、そのサーバーの詳細が必要です。TLSが使用されるかどうか、ポート番号、パスワードもすべて設定可能です。ClickHouse Cloudの例を出発点として使用してください。 + +### バッチ + +バッチモードを使用するには、`query`パラメーターを指定するか、`stdin`にデータを送信します(`stdin`がターミナルでないことを確認します)。両方を行うこともできます。HTTPインターフェースに似ていますが、`query`パラメーターを使用し`stdin`にデータを送信する場合、リクエストは`query`パラメーター、改行、`stdin`のデータの連結です。これは大きなINSERTクエリに便利です。 + +クライアントを使用してデータを挿入する例: + +#### リモートClickHouseサービスにCSVファイルを挿入する + +この例はTLSとパスワードを使用するClickHouse Cloudまたは任意のClickHouseサーバーに適しています。この例ではサンプルデータセットのCSVファイル`cell_towers.csv`を既存の`default`データベース内の`cell_towers`テーブルに挿入します: + +```bash +clickhouse-client --host HOSTNAME.clickhouse.cloud \ + --secure \ + --port 9440 \ + --user default \ + --password PASSWORD \ + --query "INSERT INTO cell_towers FORMAT CSVWithNames" \ + < cell_towers.csv +``` + +:::note +クエリの構文に集中するために、他の例では接続の詳細(`--host`、`--port`など)を省略しています。コマンドを試す際にはこれらを追加してください。 +::: + +#### データを挿入する三つの方法 + +```bash +echo -ne "1, 'some text', '2016-08-14 00:00:00'\n2, 'some more text', '2016-08-14 00:00:01'" | \ + clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; +``` + +```bash +cat <<_EOF | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; +3, 'some text', '2016-08-14 00:00:00' +4, 'some more text', '2016-08-14 00:00:01' +_EOF +``` + +```bash +cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"; +``` + +### 注意事項 + +バッチモードでは、デフォルトのデータフォーマットはTabSeparatedです。クエリのFORMAT句でフォーマットを設定できます。 + +デフォルトでは、バッチモードでは単一のクエリしか処理できません。“スクリプト”から複数のクエリを作成するには、`--multiquery`パラメータを使用します。これはINSERTを除くすべてのクエリに有効です。クエリ結果は連続して無分別に出力されます。同様に、大量のクエリを処理するには、各クエリに対して‘clickhouse-client’を実行することができます。‘clickhouse-client’プログラムの起動に数十ミリ秒かかることに注意してください。 + +インタラクティブモードでは、クエリを入力するためのコマンドラインが得られます。 + +‘multiline’が指定されていない場合(デフォルト):クエリを実行するにはEnterキーを押します。クエリの最後にセミコロンは必要ありません。複数行のクエリを入力するには、改行前にバックスラッシュ`\`を入力します。Enterキーを押した後、次の行のクエリを入力するように求められます。 + +multilineが指定されている場合:クエリを実行するには、最後にセミコロンを付けてEnterキーを押します。入力した行の最後にセミコロンを付けなかった場合、次の行のクエリを入力するように求められます。 + +単一のクエリのみが実行されるため、セミコロン以降のすべては無視されます。 + +`\G`をセミコロンとして、または後に指定することができます。これはVerticalフォーマットを示します。このフォーマットでは、各値が別々の行に印刷されるため、幅広いテーブルに便利です。この珍しい機能はMySQL CLIとの互換性のために追加されました。 + +コマンドラインは‘replxx’(‘readline’に似ています)に基づいています。つまり、慣れ親しんだキーボードショートカットを使用し、履歴を保持します。履歴は`~/.clickhouse-client-history`に書き込まれます。 + +デフォルトでは、使用されるフォーマットはPrettyCompactです。クエリのFORMAT句でフォーマットを変更するか、クエリの最後に`\G`を指定したり、コマンドラインで`--format`または`--vertical`引数を使用したり、クライアントの設定ファイルを使用したりすることでフォーマットを変更できます。 + +クライアントを終了するには、Ctrl+Dを押すか、クエリの代わりに次のいずれかを入力します:「exit」、「quit」、「logout」、「exit;」、「quit;」、「logout;」、「q」、「Q」、「:q」 + +クエリを処理する際に、クライアントは次を表示します: + +1. プログレスは、1秒間に最大10回(デフォルト)更新されます。クエリが迅速な場合、プログレスは表示されない可能性があります。 +2. デバッグのために、解析後のフォーマットされたクエリ。 +3. 指定されたフォーマットでの結果。 +4. 結果の行数、経過時間、クエリ処理の平均速度。すべてのデータ量は圧縮されていないデータを指します。 + +長いクエリをキャンセルするには、Ctrl+Cを押します。ただし、サーバーがリクエストを中断するのを待つ必要があります。一部のステージではクエリをキャンセルすることはできません。待たずに2回目のCtrl+Cを押すと、クライアントは終了します。 + +コマンドラインクライアントは外部データ(外部一時テーブル)をクエリに渡すことができます。詳細については、「クエリ処理のための外部データ」セクションをご覧ください。 + +### パラメータ付きクエリ {#cli-queries-with-parameters} + +クライアントアプリケーションから値を渡してパラメータ付きクエリを作成できます。これにより、クライアント側で特定の動的値を持つクエリをフォーマットする必要がなくなります。 例えば: + +```bash +$ clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}" +``` + +インタラクティブセッション内からパラメータを設定することもできます: +```bash +$ clickhouse-client -nq " + SET param_parName='[1, 2]'; + SELECT {parName:Array(UInt16)}" +``` + +#### クエリ構文 {#cli-queries-with-parameters-syntax} + +通常どおりにクエリをフォーマットし、次にアプリのパラメータからクエリに渡したい値を以下の形式で中括弧に入れます: + +```sql +{:} +``` + +- `name` — プレースホルダー識別子。コンソールクライアントでは`--param_ = value`としてアプリパラメータで使用されます。 +- `data type` — アプリパラメータ値の[データ型](../sql-reference/data-types/index.md)。例えば、`(integer, ('string', integer))`のようなデータ構造は、`Tuple(UInt8, Tuple(String, UInt8))`データ型を持つことができます(他の[整数](../sql-reference/data-types/int-uint.md)タイプも使用できます)。テーブル、データベース、カラム名をパラメータとして渡すことも可能で、その場合`Identifier`をデータ型として使用する必要があります。 + +#### 例 {#example} + +```bash +$ clickhouse-client --param_tuple_in_tuple="(10, ('dt', 10))" -q "SELECT * FROM table WHERE val = {tuple_in_tuple:Tuple(UInt8, Tuple(String, UInt8))}" +$ clickhouse-client --param_tbl="numbers" --param_db="system" --param_col="number" --param_alias="top_ten" --query "SELECT {col:Identifier} as {alias:Identifier} FROM {db:Identifier}.{tbl:Identifier} LIMIT 10" +``` + +## 設定 {#interfaces_cli_configuration} + +`clickhouse-client`にパラメータを渡すことができ(すべてのパラメータにはデフォルト値があります)、以下の方法を使用します: + +- コマンドラインから + + コマンドラインオプションは、設定ファイル内でのデフォルト値と設定を上書きします。 + +- 設定ファイルから。 + + 設定ファイルの設定はデフォルト値を上書きします。 + +### コマンドラインオプション {#command-line-options} + +- `--host, -h` – サーバー名(デフォルトは 'localhost')。名前またはIPv4もしくはIPv6アドレスを使用できます。 +- `--port` – 接続先のポート。デフォルト値: 9000。HTTPインターフェースとネイティブインターフェースは異なるポートを使用することに注意してください。 +- `--user, -u` – ユーザー名。デフォルト値: default。 +- `--password` – パスワード。デフォルト値: 空文字列。 +- `--ask-password` - ユーザーにパスワードの入力を促します。 +- `--query, -q` – 非インタラクティブモード使用時の処理クエリ。`--query`は複数回指定できます(例:`--query "SELECT 1" --query "SELECT 2"`)。`--queries-file`とは同時に使用できません。 +- `--queries-file` – 実行するクエリが記述されたファイルパス。`--queries-file`は複数回指定できます(例:`--queries-file queries1.sql --queries-file queries2.sql`)。`--query`とは同時に使用できません。 +- `--multiquery, -n` – 指定された場合、セミコロンで区切られた複数のクエリを`--query`オプションの後にリストできます。便利なことに、`--query`を省略し、`--multiquery`の後にクエリを直接渡すことも可能です。 +- `--multiline, -m` – 指定された場合、複数行のクエリを許可します(Enterでクエリを送信しません)。 +- `--database, -d` – 現在のデフォルトデータベースを選択します。デフォルト値: サーバー設定からの現在のデータベース(デフォルトは ‘default’)。 +- `--format, -f` – 結果を出力するためのデフォルトのフォーマットを指定します。 +- `--vertical, -E` – 指定された場合、結果を出力するためにデフォルトで[Verticalフォーマット](../interfaces/formats.md#vertical)を使用します。これは`–format=Vertical`と同じです。このフォーマットでは、各値が別々の行に印刷されるため、幅広いテーブルの表示に役立ちます。 +- `--time, -t` – 指定された場合、非インタラクティブモードでクエリ実行時間を‘stderr’に出力します。 +- `--memory-usage` – 指定された場合、非インタラクティブモードでメモリ使用量を‘stderr’に出力します。可能な値は:'none' - メモリ使用量を出力しない、'default' - バイト数を出力、'readable' - メモリ使用量を人間が読みやすい形式で出力。 +- `--stacktrace` – 指定された場合、例外が発生したときにスタックトレースも出力します。 +- `--config-file` – 設定ファイルの名前。 +- `--secure` – 指定された場合、セキュア接続(TLS)を介してサーバーに接続します。CA証明書を[設定ファイル](#configuration_files)で設定する必要があるかもしれません。利用可能な設定は[サーバー側のTLS設定](../operations/server-configuration-parameters/settings.md#openssl)と同じです。 +- `--history_file` — コマンド履歴を含むファイルのパス。 +- `--history_max_entries` — 履歴ファイルの最大エントリー数。デフォルト値:1 000 000。 +- `--param_` — [パラメータ付きクエリ](#cli-queries-with-parameters)のための値。 +- `--hardware-utilization` — プログレスバーでハードウェア利用情報を表示。 +- `--print-profile-events` – `ProfileEvents`パケットを出力。 +- `--profile-events-delay-ms` – `ProfileEvents`パケットの出力間隔(-1 - 合計のみ出力、0 - 単一パケットごとに出力)。 +- `--jwt` – 指定された場合、JSON Web Tokenを介して認証を有効にします。サーバーJWT認証はClickHouse Cloudでのみ利用可能です。 +- `--progress` – クエリ実行の進捗を表示。可能な値: 'tty|on|1|true|yes' - インタラクティブモードでTTYに出力; 'err' - 非インタラクティブモードでSTDERRに出力; 'off|0|false|no' - 進捗表示を無効にします。デフォルト:インタラクティブモードではTTY、非インタラクティブモードでは無効。 +- `--progress-table` – クエリ実行中に変化するメトリクスを持つ進捗テーブルを表示。可能な値: 'tty|on|1|true|yes' - インタラクティブモードでTTYに出力; 'err' - 非インタラクティブモードでSTDERRに出力; 'off|0|false|no' - 進捗テーブルを無効にします。デフォルト:インタラクティブモードではTTY、非インタラクティブモードでは無効。 +- `--enable-progress-table-toggle` – 進捗テーブル印刷が有効なインタラクティブモードで、コントロールキー(スペース)を押して進捗テーブルを切り替えることを有効にします。デフォルト:'true'。 + +`--host`、`--port`、`--user`、`--password`オプションの代わりに、ClickHouseクライアントは接続文字列もサポートしています(次のセクションを参照)。 + +## エイリアス {#cli_aliases} + +- `\l` - SHOW DATABASES +- `\d` - SHOW TABLES +- `\c ` - USE DATABASE +- `.` - 最後のクエリを繰り返す + +## ショートキー {#shortkeys_aliases} + +- `Alt (Option) + Shift + e` - 現在のクエリをエディタで開く。環境変数を設定できます(デフォルトはvim)。 +- `Alt (Option) + #` - 行をコメントアウト。 +- `Ctrl + r` - あいまい履歴検索。 + +:::tip +MacOSでメタキー(Option)の正しい動作を設定するには: + +iTerm2: Preferences -> Profile -> Keys -> Left Option keyへ行き、Esc+をクリックします。 +::: + +使用可能なすべてのショートキーの完全なリストは[replxx](https://github.com/AmokHuginnsson/replxx/blob/1f149bf/src/replxx_impl.cxx#L262)をご覧ください。 + +## 接続文字列 {#connection_string} + +clickhouse-clientはまた、`MongoDB`や`PostgreSQL`、`MySQL`と似た接続文字列を使用してclickhouseサーバーに接続することをサポートしています。以下の構文で接続文字列を記述します: + +```text +clickhouse:[//[user[:password]@][hosts_and_ports]][/database][?query_parameters] +``` + +ここで + +- `user` - (オプション)ユーザー名, +- `password` - (オプション)ユーザーパスワード。`:`が指定され、パスワードが空白ならば、クライアントはユーザーにパスワードを入力するように促します。 +- `hosts_and_ports` - (オプション)ホストとポートのリスト `host[:port] [, host:[port]], ...`, +- `database` - (オプション)データベース名, +- `query_parameters` - (オプション)キーと値のペアのリスト `param1=value1[,¶m2=value2], ...`。一部のパラメータには値が必要ありません。パラメータ名と値は大文字小文字を区別します。 + +ユーザーが指定されていない場合、`default`ユーザーがパスワードなしで使用されます。 +ホストが指定されていない場合、`localhost`が使用されます。 +ポートが指定されていない場合、デフォルトで`9000`が使用されます。 +データベースが指定されていない場合、`default`データベースが使用されます。 + +ユーザー名、パスワード、またはデータベースが接続文字列で指定されている場合、`--user`、`--password`、または`--database`で指定することはできません(その逆も同様です)。 + +ホストコンポーネントは、ホスト名とIPアドレスのどちらかを指定できます。IPv6アドレスを指定するには、角括弧内に記載します: + +```text +clickhouse://[2001:db8::1234] +``` + +URIでは複数のホストへの接続が可能です。接続文字列には複数のホストを含めることができます。ClickHouse-clientはこれらのホストに順に接続を試みます(つまり、左から右へ)。接続が確立されると、残りのホストへの接続は行われません。 + +接続文字列はclickhouse-clientの最初の引数として指定する必要があります。接続文字列は任意の他の[command-line-options](#command-line-options)と組み合わせて使用できますが、`--host/-h`および`--port`は除きます。 + +`query_parameters`コンポーネントに許可されるキーは以下の通りです: + +- `secure`またはショートハンド` s` - 値なし。指定された場合、クライアントはセキュア接続(TLS)を介してサーバーに接続します。[コマンドラインオプション](#command-line-options)の`secure`を参照してください + +### パーセントエンコーディング {#connection_string_uri_percent_encoding} + +`user`、`password`、`hosts`、`database`、`query parameters`内の非ASCII、スペース、特殊文字は[パーセントエンコーディング](https://en.wikipedia.org/wiki/URL_encoding)する必要があります。 + +### 例 {#connection_string_examples} + +ポート9000でlocalhostに接続し、クエリ`SELECT 1`を実行します。 + +```bash +clickhouse-client clickhouse://localhost:9000 --query "SELECT 1" +``` + +ユーザー`john`、パスワード`secret`、ホスト`127.0.0.1`、ポート`9000`を使用してlocalhostに接続します。 + +```bash +clickhouse-client clickhouse://john:secret@127.0.0.1:9000 +``` + +デフォルトユーザーを使用し、ホストにIPV6アドレス`[::1]`、ポート`9000`を使用してlocalhostに接続します。 + +```bash +clickhouse-client clickhouse://[::1]:9000 +``` + +ポート9000を使用し、複数行モードでlocalhostに接続します。 + +```bash +clickhouse-client clickhouse://localhost:9000 '-m' +``` + +ユーザー`default`を使用してポート9000でlocalhostに接続します。 + +```bash +clickhouse-client clickhouse://default@localhost:9000 + +# equivalent to: +clickhouse-client clickhouse://localhost:9000 --user default +``` + +ポート9000でlocalhostに接続し、`my_database`データベースを使用します。 + +```bash +clickhouse-client clickhouse://localhost:9000/my_database + +# equivalent to: +clickhouse-client clickhouse://localhost:9000 --database my_database +``` + +ショートカット's' URIパラメータを使用して、接続文字列で指定された`my_database`データベースとセキュア接続を使用してlocalhostに接続します。 + +```bash +clickhouse-client clickhouse://localhost/my_database?s + +# equivalent to: +clickhouse-client clickhouse://localhost/my_database -s +``` + +デフォルトのホスト、デフォルトのポート、デフォルトユーザー、デフォルトのデータベースに接続します。 + +```bash +clickhouse-client clickhouse: +``` + +デフォルトホスト、デフォルトポートを使用し、ユーザー`my_user`を使用して接続し、パスワードなしで接続します。 + +```bash +clickhouse-client clickhouse://my_user@ + +# Using a blank password between : and @ means to asking user to enter the password before starting the connection. +clickhouse-client clickhouse://my_user:@ +``` + +ユーザー名としてメールアドレスを使用してlocalhostに接続します。'@' シンボルはパーセントエンコードされ、'%40'になります。 + +```bash +clickhouse-client clickhouse://some_user%40some_mail.com@localhost:9000 +``` + +指定されたホストの一つに接続します:`192.168.1.15`、`192.168.1.25`。 + +```bash +clickhouse-client clickhouse://192.168.1.15,192.168.1.25 +``` + +### 設定ファイル {#configuration_files} + +`clickhouse-client`は以下の最初に存在するファイルを使用します: + +- `--config-file`パラメータで定義された。 +- `./clickhouse-client.xml`, `.yaml`, `.yml` +- `~/.clickhouse-client/config.xml`, `.yaml`, `.yml` +- `/etc/clickhouse-client/config.xml`, `.yaml`, `.yml` + +設定ファイルの例: + +```xml + + username + password + true + + + /etc/ssl/cert.pem + + + +``` + +または、YAML形式で同じ設定: + +```yaml +user: username +password: 'password' +secure: true +openSSL: + client: + caConfig: '/etc/ssl/cert.pem' +``` + +### クエリIDフォーマット {#query-id-format} + +インタラクティブモードでは`clickhouse-client`は各クエリのクエリIDを表示します。デフォルトでは、IDは次のようにフォーマットされています: + +```sql +Query id: 927f137d-00f1-4175-8914-0dd066365e96 +``` + +カスタムフォーマットは設定ファイル内の`query_id_formats`タグで指定できます。フォーマット文字列内の`{query_id}`プレースホルダーはクエリのIDに置き換えられます。タグ内に複数のフォーマット文字列を指定することができます。この機能は、クエリのプロファイリングを促進するURLを生成するために使用できます。 + +**例** + +```xml + + + http://speedscope-host/#profileURL=qp%3Fid%3D{query_id} + + +``` + +上記の設定が適用されると、クエリのIDは次のように表示されます: + +```response +speedscope:http://speedscope-host/#profileURL=qp%3Fid%3Dc8ecc783-e753-4b38-97f1-42cddfb98b7d +``` diff --git a/docs/ja/interfaces/cpp.md b/docs/ja/interfaces/cpp.md new file mode 100644 index 00000000000..2c869e93708 --- /dev/null +++ b/docs/ja/interfaces/cpp.md @@ -0,0 +1,13 @@ +--- +slug: /ja/interfaces/cpp +sidebar_position: 24 +sidebar_label: C++ クライアントライブラリ +--- + +# C++ クライアントライブラリ + +[clickhouse-cpp](https://github.com/ClickHouse/clickhouse-cpp) リポジトリのREADMEを参照してください。 + +# userver 非同期フレームワーク + +[userver (ベータ版)](https://github.com/userver-framework/userver) はClickHouseを標準でサポートしています。 diff --git a/docs/ja/interfaces/formats.md b/docs/ja/interfaces/formats.md new file mode 100644 index 00000000000..e678b6c02db --- /dev/null +++ b/docs/ja/interfaces/formats.md @@ -0,0 +1,2966 @@ +--- +slug: /ja/interfaces/formats +sidebar_position: 21 +sidebar_label: すべてのフォーマットを表示… +title: 入出力データのフォーマット +--- + +ClickHouseは様々なフォーマットでデータを受け入れることができ、返すことができます。入力をサポートするフォーマットは、`INSERT`に提供するデータの解析、FileやURL、HDFSにバックアップされたテーブルからの`SELECT`の実行、もしくはDictionaryの読み込みに使用できます。出力をサポートするフォーマットは、`SELECT`の結果を整形するのに使用できます。また、ファイルにバックアップされたテーブルへの`INSERT`を実行するためにも使用できます。すべてのフォーマット名は大文字小文字を区別しません。 + +サポートされているフォーマットは以下の通りです: + +| フォーマット | 入力 | 出力 | +|-----------------------------------------------------------------------------------------------|------|-------| +| [TabSeparated](#tabseparated) | ✔ | ✔ | +| [TabSeparatedRaw](#tabseparatedraw) | ✔ | ✔ | +| [TabSeparatedWithNames](#tabseparatedwithnames) | ✔ | ✔ | +| [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes) | ✔ | ✔ | +| [TabSeparatedRawWithNames](#tabseparatedrawwithnames) | ✔ | ✔ | +| [TabSeparatedRawWithNamesAndTypes](#tabseparatedrawwithnamesandtypes) | ✔ | ✔ | +| [Template](#format-template) | ✔ | ✔ | +| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ | +| [CSV](#csv) | ✔ | ✔ | +| [CSVWithNames](#csvwithnames) | ✔ | ✔ | +| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ | +| [CustomSeparated](#format-customseparated) | ✔ | ✔ | +| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ | +| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ | +| [SQLInsert](#sqlinsert) | ✗ | ✔ | +| [Values](#data-format-values) | ✔ | ✔ | +| [Vertical](#vertical) | ✗ | ✔ | +| [JSON](#json) | ✔ | ✔ | +| [JSONAsString](#jsonasstring) | ✔ | ✗ | +| [JSONAsObject](#jsonasobject) | ✔ | ✗ | +| [JSONStrings](#jsonstrings) | ✔ | ✔ | +| [JSONColumns](#jsoncolumns) | ✔ | ✔ | +| [JSONColumnsWithMetadata](#jsoncolumnsmonoblock) | ✔ | ✔ | +| [JSONCompact](#jsoncompact) | ✔ | ✔ | +| [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | +| [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | +| [JSONEachRow](#jsoneachrow) | ✔ | ✔ | +| [PrettyJSONEachRow](#prettyjsoneachrow) | ✗ | ✔ | +| [JSONEachRowWithProgress](#jsoneachrowwithprogress) | ✗ | ✔ | +| [JSONStringsEachRow](#jsonstringseachrow) | ✔ | ✔ | +| [JSONStringsEachRowWithProgress](#jsonstringseachrowwithprogress) | ✗ | ✔ | +| [JSONCompactEachRow](#jsoncompacteachrow) | ✔ | ✔ | +| [JSONCompactEachRowWithNames](#jsoncompacteachrowwithnames) | ✔ | ✔ | +| [JSONCompactEachRowWithNamesAndTypes](#jsoncompacteachrowwithnamesandtypes) | ✔ | ✔ | +| [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | +| [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | +| [JSONCompactStringsEachRowWithNamesAndTypes](#jsoncompactstringseachrowwithnamesandtypes) | ✔ | ✔ | +| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | +| [BSONEachRow](#bsoneachrow) | ✔ | ✔ | +| [TSKV](#tskv) | ✔ | ✔ | +| [Pretty](#pretty) | ✗ | ✔ | +| [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | +| [PrettyMonoBlock](#prettymonoblock) | ✗ | ✔ | +| [PrettyNoEscapesMonoBlock](#prettynoescapesmonoblock) | ✗ | ✔ | +| [PrettyCompact](#prettycompact) | ✗ | ✔ | +| [PrettyCompactNoEscapes](#prettycompactnoescapes) | ✗ | ✔ | +| [PrettyCompactMonoBlock](#prettycompactmonoblock) | ✗ | ✔ | +| [PrettyCompactNoEscapesMonoBlock](#prettycompactnoescapesmonoblock) | ✗ | ✔ | +| [PrettySpace](#prettyspace) | ✗ | ✔ | +| [PrettySpaceNoEscapes](#prettyspacenoescapes) | ✗ | ✔ | +| [PrettySpaceMonoBlock](#prettyspacemonoblock) | ✗ | ✔ | +| [PrettySpaceNoEscapesMonoBlock](#prettyspacenoescapesmonoblock) | ✗ | ✔ | +| [Prometheus](#prometheus) | ✗ | ✔ | +| [Protobuf](#protobuf) | ✔ | ✔ | +| [ProtobufSingle](#protobufsingle) | ✔ | ✔ | +| [ProtobufList](-format-avro-confluent) | ✔ | ✔ | +| [Avro](#data-format-avro) | ✔ | ✔ | +| [AvroConfluent](#data-format-avro-confluent) | ✔ | ✗ | +| [Parquet](#data-format-parquet) | ✔ | ✔ | +| [ParquetMetadata](#data-format-parquet-metadata) | ✔ | ✗ | +| [Arrow](#data-format-arrow) | ✔ | ✔ | +| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ | +| [ORC](#data-format-orc) | ✔ | ✔ | +| [One](#data-format-one) | ✔ | ✗ | +| [Npy](#data-format-npy) | ✔ | ✔ | +| [RowBinary](#rowbinary) | ✔ | ✔ | +| [RowBinaryWithNames](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ | +| [RowBinaryWithDefaults](#rowbinarywithdefaults) | ✔ | ✗ | +| [Native](#native) | ✔ | ✔ | +| [Null](#null) | ✗ | ✔ | +| [XML](#xml) | ✗ | ✔ | +| [CapnProto](#capnproto) | ✔ | ✔ | +| [LineAsString](#lineasstring) | ✔ | ✔ | +| [Regexp](#data-format-regexp) | ✔ | ✗ | +| [RawBLOB](#rawblob) | ✔ | ✔ | +| [MsgPack](#msgpack) | ✔ | ✔ | +| [MySQLDump](#mysqldump) | ✔ | ✗ | +| [DWARF](#dwarf) | ✔ | ✗ | +| [Markdown](#markdown) | ✗ | ✔ | +| [Form](#form) | ✔ | ✗ | + +ClickHouse設定により、いくつかのフォーマット処理パラメータを制御することができます。詳細については、[設定](/docs/ja/operations/settings/settings-formats.md) セクションを参照してください。 + +## TabSeparated {#tabseparated} + +TabSeparatedフォーマットでは、データは行ごとに書き込まれます。各行の値はタブで区切られ、最後の値には改行が必須です。ユニックス形式の改行が必要です。最後の行も改行を含める必要があります。値はテキスト形式で書かれ、囲み文字はありません。特別な文字はエスケープされます。 + +このフォーマットは`TSV`という名前でも利用できます。 + +`TabSeparated`フォーマットは、カスタムプログラムやスクリプトを使用してデータを処理するのに便利です。HTTPインターフェイスや、コマンドラインクライアントのバッチモードでデフォルトで使用されます。このフォーマットを使用して、異なるDBMS間でデータを転送することもできます。例えば、MySQLからダンプを取得し、それをClickHouseにアップロードすることができます。 + +`TabSeparated`フォーマットは、総計値(WITH TOTALSを使用時)や極値(`extremes`を1に設定時)の出力をサポートしています。この場合、総計値と極値はメインデータの後に出力されます。メイン結果、総計値、極値は、空行で分けられます。例: + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated +``` + +``` response +2014-03-17 1406958 +2014-03-18 1383658 +2014-03-19 1405797 +2014-03-20 1353623 +2014-03-21 1245779 +2014-03-22 1031592 +2014-03-23 1046491 + +1970-01-01 8873898 + +2014-03-17 1031592 +2014-03-23 1406958 +``` + +### データフォーマティング {#tabseparated-data-formatting} + +整数は10進法で書かれます。数値の先頭には「+」記号を含めることができます(解析時に無視され、フォーマット時には記録されません)。非負の数値には負符号をつけることはできません。解析時には空の文字列を0と解釈することが許され、また(符号付きタイプの場合)マイナス記号だけの文字列を0と解釈します。該当するデータタイプに収まらない数字は、エラーメッセージなしに別の数として解析されることがあります。 + +浮動小数点数は10進法で書かれます。小数点は小数の区切り記号として使われます。指数表記や `inf`, `+inf`, `-inf`, `nan` がサポートされています。浮動小数点数のエントリは、小数点で始まるか終わることがあります。 +フォーマット時に、浮動小数点数の精度が失われる場合があります。 +解析時には、機械で表現可能な最も近い数値を必ずしも読まなければならないわけではありません。 + +日付はYYYY-MM-DD形式で書かれ、任意の文字を区切り文字として解析されます。 +日時付きの日付は、`YYYY-MM-DD hh:mm:ss`形式で書かれ、任意の文字を区切り文字として解析されます。 +これは、クライアントまたはサーバーが起動したときのシステムタイムゾーンで行われます(データをフォーマットする側に依存します)。夏時間の時は指定されません。したがって、ダンプに夏時間中の時間が含まれていると、ダンプがデータと一致しないことがあり、解析時には2つの時間のうち1つが選ばれます。 +読み取り操作中に、不正な日付や日時付きの日付は、自然なオーバーフローまたはnullの日付や時間として解析され、エラーメッセージはされません。 + +例外として、日時の解析が10進数桁が10個だけから成るUnixタイムスタンプ形式でもサポートされています。結果はタイムゾーンに依存しません。`YYYY-MM-DD hh:mm:ss`と `NNNNNNNNNN` の形式は自動的に区別されます。 + +文字列は、バックスラッシュでエスケープされた特殊文字と共に出力されます。出力には以下のエスケープシーケンスを使用します: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\'`, `\\`. 解析もまた、シーケンス `\a`, `\v`, `\xHH` (16進エスケープシーケンス)および任意の`\c`シーケンスをサポートし、ここで`c`は任意の文字です(これらのシーケンスは`c`に変換されます)。したがって、データの読み取りは、改行が`\n`または `\`、または改行として書かれる形式をサポートします。例えば、単語間のスペースの代わりに改行を使用した`Hello world`文字列は、以下のどのバリエーションでも解析できます: + +```text +Hello\nworld + +Hello\ +world +``` + +2番目のバリアントは、MySQLがタブ分割されたダンプを書き込むときに使用するためサポートされています。 + +TabSeparatedフォーマットでデータを渡すときにエスケープする必要がある文字の最小セット:タブ、改行(LF)、およびバックスラッシュ。 + +ごく少数の記号のみがエスケープされます。出力時にあなたのターミナルを損ねる文字列値に簡単に行き当たることがあります。 + +配列は四角い括弧で囲まれたコンマ区切りの値リストとして書かれます。配列内の番号アイテムは通常通り書式が設定されます。`Date` と `DateTime` 型はシングルクォートで囲まれます。文字列は上記と同じエスケープルールでシングルクォートで囲まれます。 + +[NULL](/docs/ja/sql-reference/syntax.md)は[format_tsv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation)設定(デフォルト値は`\N`)に従ってフォーマットされます。 + +入力データにおいて、ENUMの値は名前またはidとして表現できます。まず、入力値をENUM名にマッチしようとします。失敗した場合でかつ入力値が数字である場合、その数字をENUM idにマッチさせようとします。 +入力データがENUM idのみを含む場合、ENUM解析を最適化するために、[input_format_tsv_enum_as_number](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_enum_as_number)設定を有効化することをお勧めします。 + +[Nested](/docs/ja/sql-reference/data-types/nested-data-structures/index.md)構造の各要素は配列として表現されます。 + +例えば: + +``` sql +CREATE TABLE nestedt +( + `id` UInt8, + `aux` Nested( + a UInt8, + b String + ) +) +ENGINE = TinyLog +``` + +``` sql +INSERT INTO nestedt Values ( 1, [1], ['a']) +``` + +``` sql +SELECT * FROM nestedt FORMAT TSV +``` + +``` response +1 [1] ['a'] +``` + +### TabSeparatedフォーマット設定 {#tabseparated-format-settings} + +- [format_tsv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation) - TSVフォーマットでのNULLのカスタム表現。デフォルト値 - `\N`。 +- [input_format_tsv_empty_as_default](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_empty_as_default) - TSV入力の空フィールドをデフォルト値として扱います。デフォルト値 - `false`。複雑なデフォルト式の場合、[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)も有効にする必要があります。 +- [input_format_tsv_enum_as_number](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_enum_as_number) - TSV形式で挿入されたenum値をenumインデックスとして扱います。デフォルト値 - `false`。 +- [input_format_tsv_use_best_effort_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_use_best_effort_in_schema_inference) - TSV形式でスキーマを推測するためにいくつかの調整とヒューリスティックを使用します。無効化されると、すべてのフィールドは文字列として推測されます。デフォルト値 - `true`。 +- [output_format_tsv_crlf_end_of_line](/docs/ja/operations/settings/settings-formats.md/#output_format_tsv_crlf_end_of_line) - TSV出力形式で行末を`\r\n`にする場合はtrueに設定。デフォルト値 - `false`。 +- [input_format_tsv_crlf_end_of_line](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_crlf_end_of_line) - TSV入力形式で行末を`\r\n`にする場合はtrueに設定。デフォルト値 - `false`。 +- [input_format_tsv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_skip_first_lines) - データの最初の行を指定された数だけスキップします。デフォルト値 - `0`。 +- [input_format_tsv_detect_header](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_detect_header) - TSV形式で名前とタイプを含むヘッダーを自動的に検出します。デフォルト値 - `true`。 +- [input_format_tsv_skip_trailing_empty_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_skip_trailing_empty_lines) - データの末尾の空行をスキップします。デフォルト値 - `false`。 +- [input_format_tsv_allow_variable_number_of_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_allow_variable_number_of_columns) - TSV形式でカラム数を変動可能にします。余分なカラムを無視し、欠落したカラムはデフォルト値を使用。デフォルト値 - `false`。 + +## TabSeparatedRaw {#tabseparatedraw} + +`TabSeparated`フォーマットと異なり、行はエスケープなしで書き込まれる。 +このフォーマットでの解析では、各フィールドにタブや改行を含むことは許可されていません。 + +このフォーマットは`TSVRaw`、`Raw`という名前でも利用できます。 + +## TabSeparatedWithNames {#tabseparatedwithnames} + +`TabSeparated`フォーマットと異なり、カラム名が最初の行に書かれます。 + +解析中、最初の行はカラム名を含むことを期待されています。カラム名を使用して位置を決定したり、正確性を確認することができます。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +::: + +このフォーマットは`TSVWithNames`という名前でも利用できます。 + +## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes} + +`TabSeparated`フォーマットと異なり、カラム名は最初の行に書かれ、カラムタイプは2行目に書かれます。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +設定 [input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header) が1に設定されている場合、 +入力データのタイプは対応するテーブルのカラムタイプと比較されます。それ以外の場合、2行目はスキップされます。 +::: + +このフォーマットは`TSVWithNamesAndTypes`という名前でも利用できます。 + +## TabSeparatedRawWithNames {#tabseparatedrawwithnames} + +`TabSeparatedWithNames`フォーマットと異なり、行はエスケープなしで書かれます。 +このフォーマットでの解析では、各フィールドにタブや改行を含むことは許可されていません。 + +このフォーマットは`TSVRawWithNames`、`RawWithNames`という名前でも利用できます。 + +## TabSeparatedRawWithNamesAndTypes {#tabseparatedrawwithnamesandtypes} + +`TabSeparatedWithNamesAndTypes`フォーマットと異なり、行はエスケープなしで書かれます。 +このフォーマットでの解析では、各フィールドにタブや改行を含むことは許可されていません。 + +このフォーマットは`TSVRawWithNamesAndNames`、`RawWithNamesAndNames`という名前でも利用できます。 + +## Template {#format-template} + +このフォーマットは、指定されたエスケープルールを持つ値のプレースホルダーを使用して、カスタムフォーマット文字列を指定できることを可能にします。 + +設定は`format_template_resultset`、`format_template_row`(`format_template_row_format`)、`format_template_rows_between_delimiter`と、その他のいくつかの形式の設定(例:`JSON`エスケープ使用時の`output_format_json_quote_64bit_integers`)。 + +設定`format_template_row`は、次のシンタックスを持つ行に対するフォーマット文字列を含むファイルのパスを指定します: + +`delimiter_1${column_1:serializeAs_1}delimiter_2${column_2:serializeAs_2} ... delimiter_N`、 + +ここで`delimiter_i`は値間のデリミタ(`$`シンボルは `$$`でエスケープ可能)、 +`column_i`は選択または挿入される値のカラム名またはインデックス(空の場合、そのカラムはスキップされる)、 +`serializeAs_i`はカラム値のエスケープルールを意味します。サポートされるエスケープルールは以下の通りです: + +- `CSV`, `JSON`, `XML`(同じ名前のフォーマットに類似) +- `Escaped`(`TSV`に類似) +- `Quoted`(`Values`に類似) +- `Raw`(エスケープなし、`TSVRaw`に類似) +- `None`(エスケープルールなし、詳細は後述) + +エスケープルールが省略された場合、`None`が利用されます。`XML`は出力にのみ適しています。 + +したがって、次のフォーマット文字列: + + `Search phrase: ${SearchPhrase:Quoted}, count: ${c:Escaped}, ad price: $$${price:JSON};` + +では、`SearchPhrase`、`c`、`price`カラムの値が `Quoted`、`Escaped`、`JSON` としてエスケープされ、`Search phrase:`、`, count:`、`, ad price: $`、`;`のデリミタ間に(選択/挿入フォーマット時に)出力されます。例えば: + +`Search phrase: 'bathroom interior design', count: 2166, ad price: $3;` + +クラスタ内のすべてのノードにテンプレートフォーマットの出力設定を配置することが挑戦的または可能でない場合や、フォーマットが簡単な場合は、`format_template_row_format`を使用して、ファイルのパスではなく、クエリ内で直接テンプレート文字列を設定できます。 + +設定`format_template_rows_between_delimiter`は、行間のデリミタを指定し、最後の行以外のすべての行の後に印刷される(もしくは期待される)(デフォルトは`\n`)設定です。 + +設定`format_template_resultset`は、結果セットのフォーマット文字列を含むファイルのパスを指定します。設定`format_template_resultset_format`は、結果セットのテンプレート文字列をクエリ内で直接設定することも可能にします。結果セットのフォーマット文字列には、行用のフォーマット文字列と同じシンタックスがあります。プレフィックス、サフィックス、追加情報の方法を指定することができます。カラム名の代わりに次のプレースホルダーを含む: + +- `data`は、`format_template_row`フォーマットでデータを持つ行で、`format_template_rows_between_delimiter`で分割されます。このプレースホルダーはフォーマット文字列で最初のプレースホルダーでなければなりません。 +- `totals`は、`format_template_row`フォーマットの合計値の行です(WITH TOTALS使用時) +- `min`は、`format_template_row`フォーマットの最小値の行です(極限が1に設定されているとき) +- `max`は、`format_template_row`フォーマットの最大値の行です(極限が1に設定されているとき) +- `rows`は、出力行の総数 +- `rows_before_limit`は、LIMITなしの場合でも少なくともある行数。クエリにLIMITが含まれる場合のみ出力します。GROUP BYが含まれる場合、LIMITがなければ、`rows_before_limit_at_least`は正確な行数です。 +- `time`は、リクエストの実行時間(秒) +- `rows_read`は、読み取られた行の数 +- `bytes_read`は、読み取られたバイト数(非圧縮) + +プレースホルダー`data`、`totals`、`min`、および`max`には、エス케ープルールが指定されてはなりません(または`None`が明示的に指定される必要があります)。残りのプレースホルダーには、任意のエスケープルールが指定できます。 +`format_template_resultset`設定が空の文字列の場合、`${data}`がデフォルト値として使用されます。 +挿入クエリに対するフォーマットでは、プレフィックスやサフィックスがあれば、一部のカラムやフィールドをスキップできるようにしています(例を参照)。 + +選択例: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase ORDER BY c DESC LIMIT 5 FORMAT Template SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = '\n ' +``` + +`/some/path/resultset.format`: + +``` text + + Search phrases + + + + ${data} +
    Search phrases
    Search phrase Count
    + + ${max} +
    Max
    + Processed ${rows_read:XML} rows in ${time:XML} sec + + +``` + +`/some/path/row.format`: + +``` text + ${0:XML} ${1:XML} +``` + +結果: + +``` html + + Search phrases + + + + + + + +
    Search phrases
    Search phrase Count
    bathroom interior design 2166
    clickhouse 1655
    spring 2014 fashion 1549
    freeform photos 1480
    + + +
    Max
    8873898
    + Processed 3095973 rows in 0.1569913 sec + + +``` + +挿入例: + +``` text +Some header +Page views: 5, User id: 4324182021466249494, Useless field: hello, Duration: 146, Sign: -1 +Page views: 6, User id: 4324182021466249494, Useless field: world, Duration: 185, Sign: 1 +Total rows: 2 +``` + +``` sql +INSERT INTO UserActivity SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format' +FORMAT Template +``` + +`/some/path/resultset.format`: + +``` text +Some header\n${data}\nTotal rows: ${:CSV}\n +``` + +`/some/path/row.format`: + +``` text +Page views: ${PageViews:CSV}, User id: ${UserID:CSV}, Useless field: ${:CSV}, Duration: ${Duration:CSV}, Sign: ${Sign:CSV} +``` + +`PageViews`、`UserID`、`Duration`、および`Sign`はテーブル内のカラム名です。行内の`Useless field`の後やサフィックスの`\nTotal rows:`の後の値は無視されます。 +入力データのすべてのデリミタは、指定されたフォーマット文字列のデリミタと厳密に等しい必要があります。 + +## TemplateIgnoreSpaces {#templateignorespaces} + +このフォーマットは入力専用です。 +`Template`に似ていますが、入力ストリームのデリミタと値の間の空白文字をスキップします。ただし、フォーマット文字列に空白文字が含まれている場合、これらの文字は、入力ストリームで期待されます。また、いくつかのデリミタを別々に分けるために、空のプレースホルダー(`${}`または`${:None}`)を指定することも許可します。このようなプレースホルダーは、空白文字をスキップするだけに使用されます。そのため、すべての行でのカラム値の順序が同じ場合、`JSON`を読み取ることができます。例えば、JSONフォーマットの例から出力されたデータを挿入するための形式として、以下のリクエストが使用されることがあります: + +``` sql +INSERT INTO table_name SETTINGS +format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = ',' +FORMAT TemplateIgnoreSpaces +``` + +`/some/path/resultset.format`: + +``` text +{${}"meta"${}:${:JSON},${}"data"${}:${}[${data}]${},${}"totals"${}:${:JSON},${}"extremes"${}:${:JSON},${}"rows"${}:${:JSON},${}"rows_before_limit_at_least"${}:${:JSON}${}} +``` + +`/some/path/row.format`: + +``` text +{${}"SearchPhrase"${}:${}${phrase:JSON}${},${}"c"${}:${}${cnt:JSON}${}} +``` + +## TSKV {#tskv} + +TabSeparatedに似ていますが、値を名前=value形式で出力します。名前はTabSeparatedフォーマットと同様にエスケープされ、=`記号もエスケープされます。 + +``` text +SearchPhrase= count()=8267016 +SearchPhrase=bathroom interior design count()=2166 +SearchPhrase=clickhouse count()=1655 +SearchPhrase=2014 spring fashion count()=1549 +SearchPhrase=freeform photos count()=1480 +SearchPhrase=angelina jolie count()=1245 +SearchPhrase=omsk count()=1112 +SearchPhrase=photos of dog breeds count()=1091 +SearchPhrase=curtain designs count()=1064 +SearchPhrase=baku count()=1000 +``` + +[NULL](/docs/ja/sql-reference/syntax.md)は`\N`としてフォーマットされます。 + +``` sql +SELECT * FROM t_null FORMAT TSKV +``` + +``` text +x=1 y=\N +``` + +小さなカラムが多数ある場合、このフォーマットは非効率的ですし、通常使用する理由はありません。それにもかかわらず、効率においてJSONEachRowに劣ることはありません。 + +データの出力と解析の両方がこのフォーマットでサポートされています。解析中は、異なるカラムの値の順序は任意です。一部の値が省略されていることが許可されており、それらはデフォルト値と同等と見なされます。この場合、零や空白行がデフォルト値として使用されます。テーブルに指定されうる複雑な値はデフォルトとしてサポートされていません。 + +解析が`tskv`という追加フィールドの存在を許可します。このフィールドは実際には無視されます。 + +インポート中に、不明な名前のカラムは、設定[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)が1に設定されている場合、スキップされます。 + +## CSV {#csv} + +コンマ区切り値形式([RFC](https://tools.ietf.org/html/rfc4180))。 + +書式設定時、行は二重引用符で囲まれます。文字列内の二重引用符は、二重引用符列として出力されます。他のエスケープ文字に関するルールはありません。日付と日時は二重引用符で囲まれます。数値は引用符なしで出力されます。値はデリミタ文字で分割され、デフォルトは`,`です。デリミタ文字は設定[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)で定義されます。行の区切りにはUnixの改行(LF)が使用されます。配列は、最初にTabSeparated形式で文字列としてシリアライズした後、結果の文字列を二重引用符で囲んで出力します。CSV形式では、タプルは別のカラムとしてシリアライズされます(故に、タプル内部のネストは失われます)。 + +```bash +$ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv +``` + +\*デフォルトでは、デリミタは`,`です。詳細については[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)設定を参照してください。 + +解析時、すべての値は引用符ありまたは引用符なしで解析できます。ダブル引用符およびシングル引用符の両方がサポートされています。行も引用符なしで配置することができ、それを区切り文字または改行(CRまたはLF)まで解析します。RFCに違反して、引用符なしの行解析中に、先頭および末尾のスペースおよびタブは無視されます。改行の種類に関しては、Unix(LF)、Windows(CR LF)、およびMac OS Classic(CR LF)がすべてサポートされています。 + +`NULL`は設定[format_csv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation)(デフォルト値は`\N`)に従ってフォーマットされます。 + +入力データにおいて、ENUMの値は名前またはidとして表現できます。最初に入力値をENUM名に合わせようとし、失敗し、値が数値である場合、ENUM idに合わせようとします。 +入力データがENUM idのみを含む場合、ENUM解析を最適化するために、[input_format_csv_enum_as_number](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_enum_as_number)設定を有効化することをお勧めします。 + +CSV形式は、`TabSeparated`と同様に、合計や極値の出力をサポートしています。 + +### CSVフォーマット設定 {#csv-format-settings} + +- [format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter) - CSVデータでデリミタと見なされる文字。デフォルト値 - `,`。 +- [format_csv_allow_single_quotes](/docs/ja/operations/settings/settings-formats.md/#format_csv_allow_single_quotes) - シングルクォート内の文字列を許可。デフォルト値 - `true`。 +- [format_csv_allow_double_quotes](/docs/ja/operations/settings/settings-formats.md/#format_csv_allow_double_quotes) - ダブルクォート内の文字列を許可。デフォルト値 - `true`。 +- [format_csv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation) - CSVフォーマット内のNULLのカスタム表現。デフォルト値 - `\N`。 +- [input_format_csv_empty_as_default](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_empty_as_default) - CSV入力の空フィールドをデフォルト値として扱う。デフォルト値 - `true`。複雑なデフォルト式の場合、[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)も有効にする必要があります。 +- [input_format_csv_enum_as_number](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_enum_as_number) - CSV形式で挿入されたenum値をenumインデックスとして扱います。デフォルト値 - `false`。 +- [input_format_csv_use_best_effort_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_use_best_effort_in_schema_inference) - CSV形式でスキーマを推測するためのいくつかの調整やヒューリスティックを使用します。無効化されると、すべてのフィールドは文字列として推測されます。デフォルト値 - `true`。 +- [input_format_csv_arrays_as_nested_csv](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_arrays_as_nested_csv) - CSVからArrayを読み取る際に、それの要素がネストされたCSVとしてシリアライズされ、それから文字列に入れられると仮定します。デフォルト値 - `false`。 +- [output_format_csv_crlf_end_of_line](/docs/ja/operations/settings/settings-formats.md/#output_format_csv_crlf_end_of_line) - trueに設定されている場合、CSV出力形式の行の終了は`\r\n`となり、`\n`ではありません。デフォルト値 - `false`。 +- [input_format_csv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_skip_first_lines) - データの最初に指定された数の行をスキップします。デフォルト値 - `0`。 +- [input_format_csv_detect_header](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_detect_header) - CSV形式で名前とタイプを含むヘッダーを自動的に検出します。デフォルト値 - `true`。 +- [input_format_csv_skip_trailing_empty_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_skip_trailing_empty_lines) - データの末尾の空行をスキップします。デフォルト値 - `false`。 +- [input_format_csv_trim_whitespaces](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_trim_whitespaces) - 非引用されたCSV文字列内のスペースやタブをトリムします。デフォルト値 - `true`。 +- [input_format_csv_allow_whitespace_or_tab_as_delimiter](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_allow_whitespace_or_tab_as_delimiter) - CSV文字列内でのフィールドデリミタとしてホワイトスペースやタブを使用できるようにします。デフォルト値 - `false`。 +- [input_format_csv_allow_variable_number_of_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_allow_variable_number_of_columns) - CSV形式でカラム数を変動可能にし、余分なカラムは無視し、欠落したカラムにはデフォルト値を使用。デフォルト値 - `false`。 +- [input_format_csv_use_default_on_bad_values](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_use_default_on_bad_values) - CSVフィールドの不正な値のデシリアライズが失敗したとき、カラムにデフォルト値を設定できるようにします。デフォルト値 - `false`。 +- [input_format_csv_try_infer_numbers_from_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_try_infer_numbers_from_strings) - スキーマ推測中に文字列フィールドから数値を推測しようとします。デフォルト値 - `false`。 + +## CSVWithNames {#csvwithnames} + +カラム名でヘッダー行も出力します。[TabSeparatedWithNames](#tabseparatedwithnames)に似ています。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +::: + +## CSVWithNamesAndTypes {#csvwithnamesandtypes} + +カラム名とタイプと共に2つのヘッダー行を書き込みます。これは[TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes)に似ています。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +設定 [input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header) が1に設定されている場合、 +入力データのタイプは対応するテーブルのカラムタイプと比較されます。それ以外の場合、2行目はスキップされます。 +::: + +## CustomSeparated {#format-customseparated} + +[Template](#format-template)に似ていますが、すべてのカラムの名前とタイプを印刷もしくは読み取り、エスケープルールは[format_custom_escaping_rule](/docs/ja/operations/settings/settings-formats.md/#format_custom_escaping_rule)設定、デリミタは[format_custom_field_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_field_delimiter)、[format_custom_row_before_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_row_before_delimiter)、[format_custom_row_after_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_row_after_delimiter)、[format_custom_row_between_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_row_between_delimiter)、[format_custom_result_before_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_result_before_delimiter)および[format_custom_result_after_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_custom_result_after_delimiter)から取得しますが、フォーマット文字列からは取得しません。 + +追加設定: +- [input_format_custom_detect_header](/docs/ja/operations/settings/settings-formats.md/#input_format_custom_detect_header) - ヘッダを自動的に検出することを有効にします。デフォルト値 - `true`。 +- [input_format_custom_skip_trailing_empty_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_custom_skip_trailing_empty_lines) - ファイル末尾の空行をスキップします。デフォルト値 - `false`。 +- [input_format_custom_allow_variable_number_of_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_custom_allow_variable_number_of_columns) - カスタムセパレーテッド形式でカラム数を変動可能にし、余分なカラムは無視し、欠落したカラムにはデフォルト値を使用。デフォルト値 - `false`。 + +また、[TemplateIgnoreSpaces](#templateignorespaces)に類似する`CustomSeparatedIgnoreSpaces`フォーマットもあります。 + +## CustomSeparatedWithNames {#customseparatedwithnames} + +カラム名でヘッダー行も出力します。[TabSeparatedWithNames](#tabseparatedwithnames)に似ています。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +::: + +## CustomSeparatedWithNamesAndTypes {#customseparatedwithnamesandtypes} + +カラム名とタイプと共に2つのヘッダー行を書き込みます。これは[TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes)に似ています。 + +:::note +設定 [input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header) が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされ、不明な名前のカラムは、設定 [input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields) が1に設定されている場合にスキップされます。 +それ以外の場合、最初の行はスキップされます。 +設定 [input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header) が1に設定されている場合、入力データのタイプは対応するテーブルのカラムタイプと比較されます。それ以外の場合、2行目はスキップされます。 +::: + +## SQLInsert {#sqlinsert} + +データを`INSERT INTO table (columns...) VALUES (...), (...) ...;`ステートメントのシーケンスとして出力します。 + +例: + +```sql +SELECT number AS x, number + 1 AS y, 'Hello' AS z FROM numbers(10) FORMAT SQLInsert SETTINGS output_format_sql_insert_max_batch_size = 2 +``` + +```sql +INSERT INTO table (x, y, z) VALUES (0, 1, 'Hello'), (1, 2, 'Hello'); +INSERT INTO table (x, y, z) VALUES (2, 3, 'Hello'), (3, 4, 'Hello'); +INSERT INTO table (x, y, z) VALUES (4, 5, 'Hello'), (5, 6, 'Hello'); +INSERT INTO table (x, y, z) VALUES (6, 7, 'Hello'), (7, 8, 'Hello'); +INSERT INTO table (x, y, z) VALUES (8, 9, 'Hello'), (9, 10, 'Hello'); +``` + +この形式で出力されたデータを読み取るには、[MySQLDump](#mysqldump)入力形式を使用できます。 + +### SQLInsertフォーマット設定 {#sqlinsert-format-settings} + +- [output_format_sql_insert_max_batch_size](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_max_batch_size) - 1つのINSERTステートメント内の最大行数。デフォルト値 - `65505`。 +- [output_format_sql_insert_table_name](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_table_name) - 出力INSERTクエリのテーブル名。デフォルト値 - `'table'`。 +- [output_format_sql_insert_include_column_names](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_include_column_names) - INSERTクエリにカラム名を含めます。デフォルト値 - `true`。 +- [output_format_sql_insert_use_replace](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_use_replace) - INSERTの代わりにREPLACEステートメントを使用します。デフォルト値 - `false`。 +- [output_format_sql_insert_quote_names](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_quote_names) - カラム名を"\`"文字で引用します。デフォルト値 - `true`。 + +## JSON {#json} + +データをJSON形式で出力します。データテーブル以外にも、カラム名とタイプのほか、出力された行の総数、LIMITがなければ出力可能だった行数などの追加情報も出力されます。例: + +``` sql +SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase WITH TOTALS ORDER BY c DESC LIMIT 5 FORMAT JSON +``` + +``` json +{ + "meta": + [ + { + "name": "num", + "type": "Int32" + }, + { + "name": "str", + "type": "String" + }, + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + [ + { + "num": 42, + "str": "hello", + "arr": [0,1] + }, + { + "num": 43, + "str": "hello", + "arr": [0,1,2] + }, + { + "num": 44, + "str": "hello", + "arr": [0,1,2,3] + } + ], + + "rows": 3, + + "rows_before_limit_at_least": 3, + + "statistics": + { + "elapsed": 0.001137687, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +このJSONはJavaScriptと互換性があります。これを保証するために、いくつかの文字はさらにエスケープされています:スラッシュ `/` は `\/` としてエスケープされます。ブラウザの問題を引き起こす`U+2028`と`U+2029`の特殊な改行は、`\uXXXX`としてエスケープされます。ASCII制御文字はエスケープされます:バックスペース、フォームフィード、ラインフィード、キャリッジリターン、および水平タブは `\b`, `\f`, `\n`, `\r`, `\t` として、00-1F範囲にある残りのバイトは `\uXXXX` シーケンスとして置き換えます。無効なUTF-8シーケンスは置き換え文字に変更されるので、出力テキストは有効なUTF-8シーケンスで構成されます。JavaScriptとの互換性のため、Int64 および UInt64 の整数はデフォルトで引用符で囲まれています。引用符を除去するには、設定パラメータ[output_format_json_quote_64bit_integers](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_64bit_integers)を0に設定します。 + +`rows` – 出力行の総数。 + +`rows_before_limit_at_least` – LIMITがなければ最低限残っていた行数。クエリにLIMITが含まれる場合のみ出力されます。 +クエリにGROUP BYが含まれる場合、`rows_before_limit_at_least`はLIMITがない場合の正確な行数です。 + +`totals` – 合計値(WITH TOTALSを使用時)。 + +`extremes` – 極値(`extremes`が1に設定時)。 + +ClickHouseは[NULL](/docs/ja/sql-reference/syntax.md)をサポートしており、JSON出力で`null`として表示されます。出力で`+nan`、`-nan`、`+inf`、および`-inf`を有効にするには、出力形式の引数を変更してください[output_format_json_quote_denormals](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_denormals)を1に設定します。 + +**関連項目** + +- [JSONEachRow](#jsoneachrow)フォーマット +- [output_format_json_array_of_rows](/docs/ja/operations/settings/settings-formats.md/#output_format_json_array_of_rows)設定 + +JSON入力形式では、設定[input_format_json_validate_types_from_metadata](/docs/ja/operations/settings/settings-formats.md/#input_format_json_validate_types_from_metadata)が1に設定されている場合、入力データのメタデータから検証されたタイプが、対応するテーブルのカラムのタイプと比較されます。 + +## JSONStrings {#jsonstrings} + +JSONと異なり、データフィールドが文字列として出力され、型つきJSON値ではありません。 + +例: + +```json +{ + "meta": + [ + { + "name": "num", + "type": "Int32" + }, + { + "name": "str", + "type": "String" + }, + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + [ + { + "num": "42", + "str": "hello", + "arr": "[0,1]" + }, + { + "num": "43", + "str": "hello", + "arr": "[0,1,2]" + }, + { + "num": "44", + "str": "hello", + "arr": "[0,1,2,3]" + } + ], + + "rows": 3, + + "rows_before_limit_at_least": 3, + + "statistics": + { + "elapsed": 0.001403233, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +## JSONColumns {#jsoncolumns} + +:::tip +JSONColumns*形式の出力は、ClickHouseフィールド名とそのフィールドのテーブルの各行の内容を提供します。視覚的には、データが左90度回転したように見えます。 +::: + +このフォーマットでは、すべてのデータが1つのJSONオブジェクトとして表現されます。 +JSONColumns出力形式はすべてのデータをメモリにバッファリングして、単一ブロックとして出力するため、高メモリ消費につながる可能性があります。 + +例: +```json +{ + "num": [42, 43, 44], + "str": ["hello", "hello", "hello"], + "arr": [[0,1], [0,1,2], [0,1,2,3]] +} +``` + +インポート中、設定[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)が1に設定されていると、不明な名前のカラムはスキップされます。 +ブロックに存在しないカラムは、デフォルト値で満たされます(ここで[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)設定を使用できます) + +## JSONColumnsWithMetadata {#jsoncolumnsmonoblock} + +JSONColumns形式と異なり、いくつかのメタデータや統計情報(JSON形式と類似)も含んでいます。 +出力形式はすべてのデータをメモリにバッファリングして、単一ブロックとして出力するため、高メモリ消費につながる可能性があります。 + +例: +```json +{ + "meta": + [ + { + "name": "num", + "type": "Int32" + }, + { + "name": "str", + "type": "String" + }, + + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + { + "num": [42, 43, 44], + "str": ["hello", "hello", "hello"], + "arr": [[0,1], [0,1,2], [0,1,2,3]] + }, + + "rows": 3, + + "rows_before_limit_at_least": 3, + + "statistics": + { + "elapsed": 0.000272376, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +JSONColumnsWithMetadata入力形式において、[input_format_json_validate_types_from_metadata](/docs/ja/operations/settings/settings-formats.md/#input_format_json_validate_types_from_metadata)の設定が1に設定されている場合は、入力データのメタデータからの型をテーブルの対応するカラムの型と比較します。 + +## JSONAsString {#jsonasstring} + +この形式では、単一のJSONオブジェクトを単一の値として解釈します。入力に複数のJSONオブジェクト(カンマで区切られる)がある場合、それらは別々の行として解釈されます。入力データが角括弧で囲まれている場合、それはJSONの配列として解釈されます。 + +この形式は、[String](/docs/ja/sql-reference/data-types/string.md)型の単一フィールドのテーブルに対してのみ解析できます。残りのカラムは[DEFAULT](/docs/ja/sql-reference/statements/create/table.md/#default)または[MATERIALIZED](/docs/ja/sql-reference/statements/create/table.md/#materialized)として設定するか、省略する必要があります。全体のJSONオブジェクトを文字列として収集した後に、[JSON関数](/docs/ja/sql-reference/functions/json-functions.md)を使用して処理できます。 + +**例** + +クエリ: + +``` sql +DROP TABLE IF EXISTS json_as_string; +CREATE TABLE json_as_string (json String) ENGINE = Memory; +INSERT INTO json_as_string (json) FORMAT JSONAsString {"foo":{"bar":{"x":"y"},"baz":1}},{},{"any json stucture":1} +SELECT * FROM json_as_string; +``` + +結果: + +``` response +┌─json──────────────────────────────┐ +│ {"foo":{"bar":{"x":"y"},"baz":1}} │ +│ {} │ +│ {"any json stucture":1} │ +└───────────────────────────────────┘ +``` + +**複数のJSONオブジェクトからなる配列** + +クエリ: + +``` sql +CREATE TABLE json_square_brackets (field String) ENGINE = Memory; +INSERT INTO json_square_brackets FORMAT JSONAsString [{"id": 1, "name": "name1"}, {"id": 2, "name": "name2"}]; + +SELECT * FROM json_square_brackets; +``` + +結果: + +```response +┌─field──────────────────────┐ +│ {"id": 1, "name": "name1"} │ +│ {"id": 2, "name": "name2"} │ +└────────────────────────────┘ +``` + +## JSONAsObject {#jsonasobject} + +この形式では、単一のJSONオブジェクトを単一の[JSON](/docs/ja/sql-reference/data-types/newjson.md)値として解釈します。入力に複数のJSONオブジェクト(カンマで区切られる)がある場合、それらは別々の行として解釈されます。入力データが角括弧で囲まれている場合、それはJSONの配列として解釈されます。 + +この形式は、[JSON](/docs/ja/sql-reference/data-types/newjson.md)型の単一フィールドのテーブルに対してのみ解析できます。残りのカラムは[DEFAULT](/docs/ja/sql-reference/statements/create/table.md/#default)または[MATERIALIZED](/docs/ja/sql-reference/statements/create/table.md/#materialized)として設定する必要があります。 + +**例** + +クエリ: + +``` sql +SET allow_experimental_json_type = 1; +CREATE TABLE json_as_object (json JSON) ENGINE = Memory; +INSERT INTO json_as_object (json) FORMAT JSONAsObject {"foo":{"bar":{"x":"y"},"baz":1}},{},{"any json stucture":1} +SELECT * FROM json_as_object FORMAT JSONEachRow; +``` + +結果: + +``` response +{"json":{"foo":{"bar":{"x":"y"},"baz":"1"}}} +{"json":{}} +{"json":{"any json stucture":"1"}} +``` + +**複数のJSONオブジェクトからなる配列** + +クエリ: + +``` sql +SET allow_experimental_json_type = 1; +CREATE TABLE json_square_brackets (field JSON) ENGINE = Memory; +INSERT INTO json_square_brackets FORMAT JSONAsObject [{"id": 1, "name": "name1"}, {"id": 2, "name": "name2"}]; +SELECT * FROM json_square_brackets FORMAT JSONEachRow; +``` + +結果: + +```response +{"field":{"id":"1","name":"name1"}} +{"field":{"id":"2","name":"name2"}} +``` + +**デフォルト値を持つカラム** + +```sql +SET allow_experimental_json_type = 1; +CREATE TABLE json_as_object (json JSON, time DateTime MATERIALIZED now()) ENGINE = Memory; +INSERT INTO json_as_object (json) FORMAT JSONAsObject {"foo":{"bar":{"x":"y"},"baz":1}}; +INSERT INTO json_as_object (json) FORMAT JSONAsObject {}; +INSERT INTO json_as_object (json) FORMAT JSONAsObject {"any json stucture":1} +SELECT time, json FROM json_as_object FORMAT JSONEachRow +``` + +```response +{"time":"2024-09-16 12:18:10","json":{}} +{"time":"2024-09-16 12:18:13","json":{"any json stucture":"1"}} +{"time":"2024-09-16 12:18:08","json":{"foo":{"bar":{"x":"y"},"baz":"1"}}} +``` + +## JSONCompact {#jsoncompact} + +データ行をオブジェクトではなく配列で出力する点でJSONとは異なります。 + +例: + +```json +{ + "meta": + [ + { + "name": "num", + "type": "Int32" + }, + { + "name": "str", + "type": "String" + }, + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + [ + [42, "hello", [0,1]], + [43, "hello", [0,1,2]], + [44, "hello", [0,1,2,3]] + ], + + "rows": 3, + + "rows_before_limit_at_least": 3, + + "statistics": + { + "elapsed": 0.001222069, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +## JSONCompactStrings {#jsoncompactstrings} + +データ行をオブジェクトではなく配列で出力する点でJSONStringsとは異なります。 + +例: + +```json +{ + "meta": + [ + { + "name": "num", + "type": "Int32" + }, + { + "name": "str", + "type": "String" + }, + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + [ + ["42", "hello", "[0,1]"], + ["43", "hello", "[0,1,2]"], + ["44", "hello", "[0,1,2,3]"] + ], + + "rows": 3, + + "rows_before_limit_at_least": 3, + + "statistics": + { + "elapsed": 0.001572097, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +## JSONCompactColumns {#jsoncompactcolumns} + +この形式では、すべてのデータが単一のJSON配列として表現されます。 +JSONCompactColumns出力形式は、すべてのデータをメモリにバッファーして単一のブロックとして出力するため、高メモリ消費につながる可能性があります。 + +例: + +```json +[ + [42, 43, 44], + ["hello", "hello", "hello"], + [[0,1], [0,1,2], [0,1,2,3]] +] +``` + +ブロックに存在しないカラムはデフォルト値で埋められます(ここで[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)設定を使用できます)。 + +## JSONEachRow {#jsoneachrow} + +この形式では、ClickHouseは各行を区切り、新しい行ごとに区切られたJSONオブジェクトとして出力します。 + +例: + +```json +{"num":42,"str":"hello","arr":[0,1]} +{"num":43,"str":"hello","arr":[0,1,2]} +{"num":44,"str":"hello","arr":[0,1,2,3]} +``` + +データをインポートすると、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)が1に設定されている場合に、名前の知られていないカラムはスキップされます。 + +## PrettyJSONEachRow {#prettyjsoneachrow} + +JSONEachRowと異なる点は、JSONが改行デリミタと4つのスペースのインデントで整形されて出力される点です。出力専用に適しています。 + +例: + +```json +{ + "num": "42", + "str": "hello", + "arr": [ + "0", + "1" + ], + "tuple": { + "num": 42, + "str": "world" + } +} +{ + "num": "43", + "str": "hello", + "arr": [ + "0", + "1", + "2" + ], + "tuple": { + "num": 43, + "str": "world" + } +} +``` + +## JSONStringsEachRow {#jsonstringseachrow} + +JSONEachRowと異なる点は、データフィールドが文字列として出力され、型付きJSON値としてではないことです。 + +例: + +```json +{"num":"42","str":"hello","arr":"[0,1]"} +{"num":"43","str":"hello","arr":"[0,1,2]"} +{"num":"44","str":"hello","arr":"[0,1,2,3]"} +``` + +## JSONCompactEachRow {#jsoncompacteachrow} + +JSONEachRowとは異なる点は、データ行がオブジェクトではなく配列で出力されることです。 + +例: + +```json +[42, "hello", [0,1]] +[43, "hello", [0,1,2]] +[44, "hello", [0,1,2,3]] +``` + +## JSONCompactStringsEachRow {#jsoncompactstringseachrow} + +JSONCompactEachRowと異なる点は、データフィールドが文字列として出力され、型付きJSON値としてではないことです。 + +例: + +```json +["42", "hello", "[0,1]"] +["43", "hello", "[0,1,2]"] +["44", "hello", "[0,1,2,3]"] +``` + +## JSONEachRowWithProgress {#jsoneachrowwithprogress} +## JSONStringsEachRowWithProgress {#jsonstringseachrowwithprogress} + +`JSONEachRow`/`JSONStringsEachRow`と異なる点は、ClickHouseが進捗情報もJSON値として提供することです。 + +```json +{"row":{"num":42,"str":"hello","arr":[0,1]}} +{"row":{"num":43,"str":"hello","arr":[0,1,2]}} +{"row":{"num":44,"str":"hello","arr":[0,1,2,3]}} +{"progress":{"read_rows":"3","read_bytes":"24","written_rows":"0","written_bytes":"0","total_rows_to_read":"3"}} +``` + +## JSONCompactEachRowWithNames {#jsoncompacteachrowwithnames} + +`JSONCompactEachRow`形式と異なる点は、カラム名を含むヘッダー行も出力されることです。[TabSeparatedWithNames](#tabseparatedwithnames)形式に似ています。 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +::: + +## JSONCompactEachRowWithNamesAndTypes {#jsoncompacteachrowwithnamesandtypes} + +`JSONCompactEachRow`形式と異なる点は、カラム名と型を含む2つのヘッダー行も出力されることです。[TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes)形式に似ています。 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +[settings-formats-input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header)の設定が1に設定されている場合、 +入力データの型はテーブルの対応するカラムの型と比較されます。そうでない場合、2番目の行はスキップされます。 +::: + +## JSONCompactStringsEachRowWithNames {#jsoncompactstringseachrowwithnames} + +`JSONCompactStringsEachRow`とは異なる点は、カラム名を含むヘッダー行も出力されることです。[TabSeparatedWithNames](#tabseparatedwithnames)形式に似ています。 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +::: + +## JSONCompactStringsEachRowWithNamesAndTypes {#jsoncompactstringseachrowwithnamesandtypes} + +`JSONCompactStringsEachRow`とは異なる点は、カラム名と型を含む2つのヘッダー行も出力されることです。[TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes)形式に似ています。 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +[settings-formats-input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header)の設定が1に設定されている場合、 +入力データの型はテーブルの対応するカラムの型と比較されます。そうでない場合、2番目の行はスキップされます。 +::: + +```json +["num", "str", "arr"] +["Int32", "String", "Array(UInt8)"] +[42, "hello", [0,1]] +[43, "hello", [0,1,2]] +[44, "hello", [0,1,2,3]] +``` + +## JSONObjectEachRow {#jsonobjecteachrow} + +この形式では、すべてのデータが単一のJSONオブジェクトとして表現され、各行がこのオブジェクトの個別のフィールドとして表され、JSONEachRow形式に似ています。 + +例: + +```json +{ + "row_1": {"num": 42, "str": "hello", "arr": [0,1]}, + "row_2": {"num": 43, "str": "hello", "arr": [0,1,2]}, + "row_3": {"num": 44, "str": "hello", "arr": [0,1,2,3]} +} +``` + +オブジェクト名をカラム値として使用するには、特別な設定[format_json_object_each_row_column_for_object_name](/docs/ja/operations/settings/settings-formats.md/#format_json_object_each_row_column_for_object_name)を使用できます。この設定の値は、結果のオブジェクトで行のJSONキーとして使用されるカラムの名前に設定されます。 + +例: + +出力の場合: + +テーブル`test`を次のように仮定します。2つのカラムがあります: +``` +┌─object_name─┬─number─┐ +│ first_obj │ 1 │ +│ second_obj │ 2 │ +│ third_obj │ 3 │ +└─────────────┴────────┘ +``` +`JSONObjectEachRow`形式で出力し、`format_json_object_each_row_column_for_object_name`設定を使用しましょう: + +```sql +select * from test settings format_json_object_each_row_column_for_object_name='object_name' +``` + +出力: +```json +{ + "first_obj": {"number": 1}, + "second_obj": {"number": 2}, + "third_obj": {"number": 3} +} +``` + +入力の場合: + +前の例からの出力を`data.json`というファイルに保存したと仮定します: +```sql +select * from file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') settings format_json_object_each_row_column_for_object_name='object_name' +``` + +``` +┌─object_name─┬─number─┐ +│ first_obj │ 1 │ +│ second_obj │ 2 │ +│ third_obj │ 3 │ +└─────────────┴────────┘ +``` + +スキーマ推論でも動作します: + +```sql +desc file('data.json', JSONObjectEachRow) settings format_json_object_each_row_column_for_object_name='object_name' +``` + +``` +┌─name────────┬─type────────────┐ +│ object_name │ String │ +│ number │ Nullable(Int64) │ +└─────────────┴─────────────────┘ +``` + +### データの挿入 {#json-inserting-data} + +``` sql +INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +ClickHouseは以下を許可します: + +- オブジェクト内のキーと値のペアの順序は任意です。 +- 一部の値の省略。 + +ClickHouseは要素間の空白やオブジェクト後のカンマを無視します。すべてのオブジェクトを1行で渡すことができます。行区切りは必要ありません。 + +**省略された値の処理** + +ClickHouseは、省略された値を対応する[データ型](/docs/ja/sql-reference/data-types/index.md)のデフォルト値で補います。 + +`DEFAULT expr`が指定されている場合、ClickHouseは、[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)設定に応じて異なる置換ルールを使用します。 + +次のテーブルを考慮してください: + +``` sql +CREATE TABLE IF NOT EXISTS example_table +( + x UInt32, + a DEFAULT x * 2 +) ENGINE = Memory; +``` + +- `input_format_defaults_for_omitted_fields = 0`の場合、`x`と`a`のデフォルト値はともに`0`(`UInt32`データ型のデフォルト値)です。 +- `input_format_defaults_for_omitted_fields = 1`の場合、`x`のデフォルト値は`0`ですが、`a`のデフォルト値は`x * 2`です。 + +:::note +`input_format_defaults_for_omitted_fields = 1`でデータを挿入すると、`input_format_defaults_for_omitted_fields = 0`での挿入に比べて、ClickHouseはより多くの計算資源を消費します。 +::: + +### データの選択 {#json-selecting-data} + +`UserActivity`テーブルを例として考慮しましょう: + +``` response +┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ +│ 4324182021466249494 │ 5 │ 146 │ -1 │ +│ 4324182021466249494 │ 6 │ 185 │ 1 │ +└─────────────────────┴───────────┴──────────┴──────┘ +``` + +クエリ`SELECT * FROM UserActivity FORMAT JSONEachRow`は以下を返します: + +``` response +{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1} +{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1} +``` + +[JSON](#json)形式と異なり、無効なUTF-8シーケンスの置換はありません。値は`JSON`と同じようにエスケープされます。 + +:::info +任意のバイトセットは文字列に出力できます。データが情報を失うことなくJSONとしてフォーマット可能であると確信している場合は、`JSONEachRow`形式を使用してください。 +::: + +### ネスト構造の使用 {#jsoneachrow-nested} + +[Nested](/docs/ja/sql-reference/data-types/nested-data-structures/index.md)データ型カラムを持つテーブルがある場合、同じ構造のJSONデータを挿入できます。[input_format_import_nested_json](/docs/ja/operations/settings/settings-formats.md/#input_format_import_nested_json)設定を有効にしてください。 + +例として、次のテーブルを考慮してください: + +``` sql +CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory +``` + +`Nested`データ型の説明で示すように、ClickHouseはネストされた構造の各要素を別々のカラムとして扱います(我々のテーブルでは`n.s`と`n.i`)。次のようにデータを挿入できます: + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]} +``` + +データを階層型JSONオブジェクトとして挿入するには、[input_format_import_nested_json=1](/docs/ja/operations/settings/settings-formats.md/#input_format_import_nested_json)に設定します。 + +``` json +{ + "n": { + "s": ["abc", "def"], + "i": [1, 23] + } +} +``` + +この設定なしでは、ClickHouseは例外を投げます。 + +``` sql +SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json' +``` + +``` response +┌─name────────────────────────────┬─value─┐ +│ input_format_import_nested_json │ 0 │ +└─────────────────────────────────┴───────┘ +``` + +``` sql +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +``` + +``` response +Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1) +``` + +``` sql +SET input_format_import_nested_json=1 +INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}} +SELECT * FROM json_each_row_nested +``` + +``` response +┌─n.s───────────┬─n.i────┐ +│ ['abc','def'] │ [1,23] │ +└───────────────┴────────┘ +``` + +### JSON形式の設定 {#json-formats-settings} + +- [input_format_import_nested_json](/docs/ja/operations/settings/settings-formats.md/#input_format_import_nested_json) - ネストされたJSONデータをネストされたテーブルにマップします(これはJSONEachRow形式で機能します)。デフォルト値 - `false`。 +- [input_format_json_read_bools_as_numbers](/docs/ja/operations/settings/settings-formats.md/#input_format_json_read_bools_as_numbers) - JSON入力形式でブール値を数値として解析します。デフォルト値 - `true`。 +- [input_format_json_read_bools_as_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_read_bools_as_strings) - JSON入力形式でブール値を文字列として解析します。デフォルト値 - `true`。 +- [input_format_json_read_numbers_as_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_read_numbers_as_strings) - JSON入力形式で数値を文字列として解析します。デフォルト値 - `true`。 +- [input_format_json_read_arrays_as_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_read_arrays_as_strings) - JSON入力形式で配列を文字列として解析します。デフォルト値 - `true`。 +- [input_format_json_read_objects_as_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_read_objects_as_strings) - JSON入力形式でオブジェクトを文字列として解析します。デフォルト値 - `true`。 +- [input_format_json_named_tuples_as_objects](/docs/ja/operations/settings/settings-formats.md/#input_format_json_named_tuples_as_objects) - 名前付きタプルカラムをJSONオブジェクトとして解析します。デフォルト値 - `true`。 +- [input_format_json_try_infer_numbers_from_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_try_infer_numbers_from_strings) - スキーマ推論中に文字列フィールドから数値を推測しようとします。デフォルト値 - `false`。 +- [input_format_json_try_infer_named_tuples_from_objects](/docs/ja/operations/settings/settings-formats.md/#input_format_json_try_infer_named_tuples_from_objects) - スキーマ推論中にJSONオブジェクトから名前付きタプルを推測しようとします。デフォルト値 - `true`。 +- [input_format_json_infer_incomplete_types_as_strings](/docs/ja/operations/settings/settings-formats.md/#input_format_json_infer_incomplete_types_as_strings) - JSON入力形式でスキーマ推論中にNullまたは空のオブジェクト/配列のみを含むKeysにString型を使用します。デフォルト値 - `true`。 +- [input_format_json_defaults_for_missing_elements_in_named_tuple](/docs/ja/operations/settings/settings-formats.md/#input_format_json_defaults_for_missing_elements_in_named_tuple) - 名前付きタプル解析中に、JSONオブジェクト内で欠けている要素に対してデフォルト値を挿入します。デフォルト値 - `true`。 +- [input_format_json_ignore_unknown_keys_in_named_tuple](/docs/ja/operations/settings/settings-formats.md/#input_format_json_ignore_unknown_keys_in_named_tuple) - 名前付きタプルのjsonオブジェクト内で未知のキーを無視します。デフォルト値 - `false`。 +- [input_format_json_compact_allow_variable_number_of_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_json_compact_allow_variable_number_of_columns) - JSONCompact/JSONCompactEachRow形式で変動するカラム数を許可し、余分なカラムを無視し、欠けているカラムにデフォルト値を使用します。デフォルト値 - `false`。 +- [input_format_json_throw_on_bad_escape_sequence](/docs/ja/operations/settings/settings-formats.md/#input_format_json_throw_on_bad_escape_sequence) - JSON文字列に誤ったエスケープシーケンスが含まれている場合に例外をスローします。無効化された場合、誤ったエスケープシーケンスはデータ内でそのまま残ります。デフォルト値 - `true`。 +- [input_format_json_empty_as_default](/docs/ja/operations/settings/settings-formats.md/#input_format_json_empty_as_default) - JSON入力で空のフィールドをデフォルト値として処理します。デフォルト値 - `false`。複雑なデフォルト式の場合は、[input_format_defaults_for_omitted_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_defaults_for_omitted_fields)も有効にする必要があります。 +- [output_format_json_quote_64bit_integers](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_64bit_integers) - JSON出力形式で64ビット整数の引用を制御します。デフォルト値 - `true`。 +- [output_format_json_quote_64bit_floats](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_64bit_floats) - JSON出力形式で64ビット浮動小数点数の引用を制御します。デフォルト値 - `false`。 +- [output_format_json_quote_denormals](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_denormals) - JSON出力形式での`+nan`、`-nan`、`+inf`、`-inf` の出力を有効にします。デフォルト値 - `false`。 +- [output_format_json_quote_decimals](/docs/ja/operations/settings/settings-formats.md/#output_format_json_quote_decimals) - JSON出力形式での小数の引用を制御します。デフォルト値 - `false`。 +- [output_format_json_escape_forward_slashes](/docs/ja/operations/settings/settings-formats.md/#output_format_json_escape_forward_slashes) - JSON出力形式での文字列出力のスラッシュのエスケープを制御します。デフォルト値 - `true`。 +- [output_format_json_named_tuples_as_objects](/docs/ja/operations/settings/settings-formats.md/#output_format_json_named_tuples_as_objects) - 名前付きタプルカラムをJSONオブジェクトとしてシリアライズします。デフォルト値 - `true`。 +- [output_format_json_array_of_rows](/docs/ja/operations/settings/settings-formats.md/#output_format_json_array_of_rows) - JSONEachRow(Compact)形式で全行のJSON配列を出力します。デフォルト値 - `false`。 +- [output_format_json_validate_utf8](/docs/ja/operations/settings/settings-formats.md/#output_format_json_validate_utf8) - JSON出力形式でのUTF-8シーケンスの検証を有効にします(それはJSON/JSONCompact/JSONColumnsWithMetadata形式に影響しません、それらは常にutf8を検証します)。デフォルト値 - `false`。 + +## BSONEachRow {#bsoneachrow} + +この形式では、ClickHouseはデータを区分なしでBSONドキュメントのシーケンスとしてフォーマット/解析します。 +各行は単一のドキュメントとしてフォーマットされ、各カラムはカラム名をキーとして単一のBSONドキュメントフィールドとしてフォーマットされます。 + +出力のために、ClickHouseのタイプとBSONタイプの対応関係は次の通りです: + +| ClickHouseのタイプ | BSONタイプ | +|-----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| +| [Bool](/docs/ja/sql-reference/data-types/boolean.md) | `\x08` boolean | +| [Int8/UInt8](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum8](/docs/ja/sql-reference/data-types/enum.md) | `\x10` int32 | +| [Int16/UInt16](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum16](/docs/ja/sql-reference/data-types/enum.md) | `\x10` int32 | +| [Int32](/docs/ja/sql-reference/data-types/int-uint.md) | `\x10` int32 | +| [UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `\x12` int64 | +| [Int64/UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `\x12` int64 | +| [Float32/Float64](/docs/ja/sql-reference/data-types/float.md) | `\x01` double | +| [Date](/docs/ja/sql-reference/data-types/date.md)/[Date32](/docs/ja/sql-reference/data-types/date32.md) | `\x10` int32 | +| [DateTime](/docs/ja/sql-reference/data-types/datetime.md) | `\x12` int64 | +| [DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | `\x09` datetime | +| [Decimal32](/docs/ja/sql-reference/data-types/decimal.md) | `\x10` int32 | +| [Decimal64](/docs/ja/sql-reference/data-types/decimal.md) | `\x12` int64 | +| [Decimal128](/docs/ja/sql-reference/data-types/decimal.md) | `\x05` binary, `\x00` binary subtype, size = 16 | +| [Decimal256](/docs/ja/sql-reference/data-types/decimal.md) | `\x05` binary, `\x00` binary subtype, size = 32 | +| [Int128/UInt128](/docs/ja/sql-reference/data-types/int-uint.md) | `\x05` binary, `\x00` binary subtype, size = 16 | +| [Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `\x05` binary, `\x00` binary subtype, size = 32 | +| [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `\x05` binary, `\x00` binary subtype or \x02 string if setting output_format_bson_string_as_string is enabled | +| [UUID](/docs/ja/sql-reference/data-types/uuid.md) | `\x05` binary, `\x04` uuid subtype, size = 16 | +| [Array](/docs/ja/sql-reference/data-types/array.md) | `\x04` array | +| [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `\x04` array | +| [Named Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `\x03` document | +| [Map](/docs/ja/sql-reference/data-types/map.md) | `\x03` document | +| [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `\x10` int32 | +| [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `\x05` binary, `\x00` binary subtype | + +入力のために、BSONタイプとClickHouseのタイプの対応関係は次の通りです: + +| BSONタイプ | ClickHouseタイプ | +|------------------------------|------------------------------------------------------------------------------------------------------| +| `\x01` double | [Float32/Float64](/docs/ja/sql-reference/data-types/float.md) | +| `\x02` string | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | +| `\x03` document | [Map](/docs/ja/sql-reference/data-types/map.md)/[Named Tuple](/docs/ja/sql-reference/data-types/tuple.md) | +| `\x04` array | [Array](/docs/ja/sql-reference/data-types/array.md)/[Tuple](/docs/ja/sql-reference/data-types/tuple.md) | +| `\x05` binary, `\x00` | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md)/[IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | +| `\x05` binary, `\x02` old | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | +| `\x05` binary, `\x03` old | [UUID](/docs/ja/sql-reference/data-types/uuid.md) | +| `\x05` binary, `\x04` | [UUID](/docs/ja/sql-reference/data-types/uuid.md) | +| `\x07` ObjectId | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | +| `\x08` boolean | [Bool](/docs/ja/sql-reference/data-types/boolean.md) | +| `\x09` datetime | [DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | +| `\x0A` null value | [NULL](/docs/ja/sql-reference/data-types/nullable.md) | +| `\x0D` JavaScript code | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | +| `\x0E` symbol | [String](/docs/ja/sql-reference/data-types/string.md)/[FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | +| `\x10` int32 | [Int32/UInt32](/docs/ja/sql-reference/data-types/int-uint.md)/[Decimal32](/docs/ja/sql-reference/data-types/decimal.md)/[IPv4](/docs/ja/sql-reference/data-types/ipv4.md)/[Enum8/Enum16](/docs/ja/sql-reference/data-types/enum.md) | +| `\x12` int64 | [Int64/UInt64](/docs/ja/sql-reference/data-types/int-uint.md)/[Decimal64](/docs/ja/sql-reference/data-types/decimal.md)/[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | + +他のBSONタイプはサポートされていません。また、異なる整数型間の変換を行います(たとえば、BSON int32値をClickHouse UInt8に挿入できます)。 +大きな整数および小数(Int128/UInt128/Int256/UInt256/Decimal128/Decimal256)は、`\x00`バイナリサブタイプを持つBSONバイナリ値から解析できます。この場合、この形式はバイナリデータのサイズが予想値のサイズと等しいことを検証します。 + +注: この形式は、ビッグエンディアンプラットフォームでは適切に動作しません。 + +### BSON形式の設定 {#bson-format-settings} + +- [output_format_bson_string_as_string](/docs/ja/operations/settings/settings-formats.md/#output_format_bson_string_as_string) - Stringカラムに対してBSON Stringタイプを使用します。デフォルト値 - `false`。 +- [input_format_bson_skip_fields_with_unsupported_types_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_bson_skip_fields_with_unsupported_types_in_schema_inference) - フォーマットBSONEachRowのスキーマ推論中にサポートされていない型を持つカラムをスキップすることを許可します。デフォルト値 - `false`。 + +## Native {#native} + +最も効率的な形式です。データはバイナリ形式でブロックごとに書き込まれ読み取られます。各ブロックについて、行数、カラム数、カラム名と型、そしてこのブロックのカラム部分が次々に記録されます。言い換えれば、この形式は「カラム型」であり、カラムを行に変換しません。これは、サーバー間のインターフェイスで使用される形式であり、コマンドラインクライアントやC++クライアントで使用するためのものです。 + +この形式を使用して、ClickHouse DBMSでのみ読み取ることができるダンプを迅速に生成することができます。この形式を自分で操作する意味はありません。 + +## Null {#null} + +何も出力しません。ただし、クエリは処理され、コマンドラインクライアントを使用している場合には、データがクライアントに伝送されます。これは、テスト、特にパフォーマンステストに使用されます。 +当然ながら、この形式は出力専用であり、解析には適していません。 + +## Pretty {#pretty} + +Unicodeアートテーブルとしてデータを出力し、ANSIエスケープシーケンスを使用して端末内の色を設定します。 +テーブルの完全なグリッドが描画され、各行は端末内で2行を占有します。 +各結果ブロックは個別のテーブルとして出力されます。これは、結果をバッファリングせずにブロックを出力するために必要です(値の可視幅をすべて事前に計算するためにはバッファリングが必要になります)。 + +[NULL](/docs/ja/sql-reference/syntax.md)は`ᴺᵁᴸᴸ`として出力されます。 + +例([PrettyCompact](#prettycompact)形式で表示): + +``` sql +SELECT * FROM t_null +``` + +``` response +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +行はPretty*形式ではエスケープされません。例は[PrettyCompact](#prettycompact)形式で表示されます: + +``` sql +SELECT 'String with \'quotes\' and \t character' AS Escaping_test +``` + +``` response +┌─Escaping_test────────────────────────┐ +│ String with 'quotes' and character │ +└──────────────────────────────────────┘ +``` + +端末にあまりにも多くのデータをダンプしないように、最初の10,000行のみが印刷されます。行数が10,000以上の場合、「Showed first 10 000」というメッセージが印刷されます。この形式は、クエリ結果を出力するためにのみ適しており、解析には適していません(テーブルに挿入するためにデータを取得する)。 + +Pretty形式は、総合値(WITH TOTALSを使用した場合)と極端値('extremes'が1に設定されている場合)の出力をサポートします。この場合、総合値と極端値はメインデータの後に個別のテーブルで出力されます。例([PrettyCompact](#prettycompact)形式で表示): + +``` sql +SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact +``` + +``` response +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1406958 │ +│ 2014-03-18 │ 1383658 │ +│ 2014-03-19 │ 1405797 │ +│ 2014-03-20 │ 1353623 │ +│ 2014-03-21 │ 1245779 │ +│ 2014-03-22 │ 1031592 │ +│ 2014-03-23 │ 1046491 │ +└────────────┴─────────┘ + +Totals: +┌──EventDate─┬───────c─┐ +│ 1970-01-01 │ 8873898 │ +└────────────┴─────────┘ + +Extremes: +┌──EventDate─┬───────c─┐ +│ 2014-03-17 │ 1031592 │ +│ 2014-03-23 │ 1406958 │ +└────────────┴─────────┘ +``` + +## PrettyNoEscapes {#prettynoescapes} + +[Pretty](#pretty)とは異なりANSIエスケープシーケンスは使用されません。これはブラウザでこの形式を表示するのに必要であり、また、「watch」コマンドラインユーティリティを使用する際にも役立ちます。 + +例: + +``` bash +$ watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'" +``` + +ブラウザで表示するためには、HTTPインターフェイスを使用することができます。 + +## PrettyMonoBlock {#prettymonoblock} + +[Pretty](#pretty)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + +## PrettyNoEscapesMonoBlock {#prettynoescapesmonoblock} + +[PrettyNoEscapes](#prettynoescapes)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + + +## PrettyCompact {#prettycompact} + +[Pretty](#pretty)とは異なり、行間にグリッドが描画され、結果がよりコンパクトになります。 +この形式は、対話モードのコマンドラインクライアントでデフォルトで使用されます。 + +## PrettyCompactNoEscapes {#prettycompactnoescapes} + +[PrettyCompact](#prettycompact)とは異なり、ANSIエスケープシーケンスは使用されません。これはブラウザでこの形式を表示するのに必要であり、「watch」コマンドラインユーティリティを使用する際にも役立ちます。 + +## PrettyCompactMonoBlock {#prettycompactmonoblock} + +[PrettyCompact](#prettycompact)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + +## PrettyCompactNoEscapesMonoBlock {#prettycompactnoescapesmonoblock} + +[PrettyCompactNoEscapes](#prettycompactnoescapes)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + +## PrettySpace {#prettyspace} + +[PrettyCompact](#prettycompact)とは異なり、グリッドの代わりにホワイトスペース(スペース文字)が使用されます。 + +## PrettySpaceNoEscapes {#prettyspacenoescapes} + +[PrettySpace](#prettyspace)とは異なり、ANSIエスケープシーケンスは使用されません。これはブラウザでこの形式を表示するのに必要であり、「watch」コマンドラインユーティリティを使用する際にも役立ちます。 + +## PrettySpaceMonoBlock {#prettyspacemonoblock} + +[PrettySpace](#prettyspace)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + +## PrettySpaceNoEscapesMonoBlock {#prettyspacenoescapesmonoblock} + +[PrettySpaceNoEscapes](#prettyspacenoescapes)とは異なり、最大10,000行がバッファリングされ、ブロックではなく単一のテーブルとして出力されます。 + +## Pretty形式の設定 {#pretty-formats-settings} + +- [output_format_pretty_max_rows](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_max_rows) - Prettyフォーマットの行のリミット。デフォルト値 - `10000`。 +- [output_format_pretty_max_column_pad_width](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_max_column_pad_width) - Prettyフォーマットでカラム内のすべての値をパッドする最大幅。デフォルト値 - `250`。 +- [output_format_pretty_max_value_width](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_max_value_width) - Prettyフォーマットで表示する最大の値の幅。これを超える場合は切り捨てられます。デフォルト値 - `10000`。 +- [output_format_pretty_color](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_color) - PrettyフォーマットでANSIエスケープシーケンスを使用して色を塗る。デフォルト値 - `true`。 +- [output_format_pretty_grid_charset](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_grid_charset) - グリッドの罫線を印刷するための文字セット。使用可能な文字セット: ASCII, UTF-8。デフォルト値 - `UTF-8`。 +- [output_format_pretty_row_numbers](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_row_numbers) - Pretty出力形式で各行の前に行番号を追加する。デフォルト値 - `true`。 +- [output_format_pretty_display_footer_column_names](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_display_footer_column_names) - テーブル内に多くの行がある場合、フッターでカラム名を表示する。デフォルト値 - `true`。 +- [output_format_pretty_display_footer_column_names_min_rows](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_display_footer_column_names_min_rows) - フッターが表示される最小行数を設定します。[output_format_pretty_display_footer_column_names](/docs/ja/operations/settings/settings-formats.md/#output_format_pretty_display_footer_column_names)が有効な場合に適用されます。デフォルト値 - 50。 + +## RowBinary {#rowbinary} + +データを行ごとにバイナリ形式でフォーマットおよび解析します。行と値は区切りなしで列挙されます。データがバイナリ形式であるため、`FORMAT RowBinary`の後の区切り文字は次のように厳密に指定されます:任意の数の空白(スペース`' '` - スペース、コード`0x20`; タブ`'\t'` - タブ、コード`0x09`; 改ページ`'\f'` - 改ページ、コード`0x0C`)に続いて正確に1つの新しい行シーケンス(Windowsスタイル`"\r\n"`またはUnixスタイル`'\n'`)であり、そのすぐ後にバイナリデータがあります。 +この形式は、ネイティブ形式よりも効率が悪く、行ベースであるためです。 + +整数は固定長リトルエンディアン表現を使用します。たとえば、UInt64は8バイトを使用します。 +DateTimeはUnixタイムスタンプを値として格納するUInt32として表現されます。 +Dateは1970-01-01からの日数を値として格納するUInt16オブジェクトとして表現されます。 +Stringは可変長(符号なし[LEB128](https://en.wikipedia.org/wiki/LEB128))として表現され、文字列のバイトが続きます。 +FixedStringは単にバイトのシーケンスとして表されます。 + +Arrayは可変長(符号なし[LEB128](https://en.wikipedia.org/wiki/LEB128))として表現され、配列の連続する要素が続きます。 + +[NULL](/docs/ja/sql-reference/syntax.md/#null-literal)サポートのため、各[Nullable](/docs/ja/sql-reference/data-types/nullable.md)値の前に1または0を含む追加のバイトが追加されます。1の場合、値は`NULL`とされ、このバイトは別の値として解釈されます。0の場合、このバイトの後の値は`NULL`ではありません。 + +## RowBinaryWithNames {#rowbinarywithnames} + +[RowBinary](#rowbinary)と類似しますが、ヘッダーが追加されています: + +- [LEB128](https://en.wikipedia.org/wiki/LEB128)でエンコードされたカラム数(N) +- N個の`String`がカラム名を指定 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +::: + +## RowBinaryWithNamesAndTypes {#rowbinarywithnamesandtypes} + +[RowBinary](#rowbinary)と類似しますが、ヘッダーが追加されています: + +- [LEB128](https://en.wikipedia.org/wiki/LEB128)でエンコードされたカラム数(N) +- N個の`String`がカラム名を指定 +- N個の`String`がカラム型を指定 + +:::note +[settings-formats-input_format_with_names_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_names_use_header)の設定が1に設定されている場合、 +入力データのカラムは名前でテーブルのカラムにマッピングされます。未知の名前のカラムは、[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)の設定が1に設定されている場合、スキップされます。 +それ以外の場合は、最初の行がスキップされます。 +[settings-formats-input_format_with_types_use_header](/docs/ja/operations/settings/settings-formats.md/#input_format_with_types_use_header)の設定が1に設定されている場合、 +入力データの型はテーブルの対応するカラムの型と比較されます。そうでない場合、2番目の行はスキップされます。 +::: + +## RowBinaryWithDefaults {#rowbinarywithdefaults} + +[RowBinary](#rowbinary)と類似しますが、各カラムの前にデフォルト値を使用するかどうかを示す追加のバイトがあります。 + +例: + +```sql +:) select * from format('RowBinaryWithDefaults', 'x UInt32 default 42, y UInt32', x'010001000000') + +┌──x─┬─y─┐ +│ 42 │ 1 │ +└────┴───┘ +``` + +カラム`x`の場合、唯一の1バイト`01`がデフォルト値が使用されるべきであることを示し、その後のデータは提供されません。 +カラム`y`の場合、データは`00`のバイトで始まり、これはカラムに実際の値があることを示し、その後のデータ`01000000`から読む必要があります。 + +## RowBinary形式の設定 {#row-binary-format-settings} + +- [format_binary_max_string_size](/docs/ja/operations/settings/settings-formats.md/#format_binary_max_string_size) - RowBinary形式でのStringに対する最大許容サイズ。デフォルト値 - `1GiB`。 +- [output_format_binary_encode_types_in_binary_format](/docs/ja/operations/settings/settings-formats.md/#output_format_binary_encode_types_in_binary_format) - ヘッダー内での型の名前を持つ文字列の代わりに、[バイナリエンコーディング](/docs/ja/sql-reference/data-types/data-types-binary-encoding.md)を使用してRowBinaryWithNamesAndTypes出力形式で型を記述します。デフォルト値 - `false`。 +- [input_format_binary_encode_types_in_binary_format](/docs/ja/operations/settings/settings-formats.md/#input_format_binary_encode_types_in_binary_format) - RowBinaryWithNamesAndTypes入力形式で型名を文字列としてではなく、[バイナリエンコーディング](/docs/ja/sql-reference/data-types/data-types-binary-encoding.md)を使用してヘッダー内の型を読み取ることを許可します。デフォルト値 - `false`. +- [output_format_binary_write_json_as_string](/docs/ja/operations/settings/settings-formats.md/#output_format_binary_write_json_as_string) - RowBinary出力形式で[JSON](/docs/ja/sql-reference/data-types/newjson.md)データ型の値をJSON [String](/docs/ja/sql-reference/data-types/string.md)値として書き込むことを許可します。デフォルト値 - `false`. +- [input_format_binary_read_json_as_string](/docs/ja/operations/settings/settings-formats.md/#input_format_binary_read_json_as_string) - RowBinary入力形式で[JSON](/docs/ja/sql-reference/data-types/newjson.md)データ型の値をJSON [String](/docs/ja/sql-reference/data-types/string.md)値として読み取ることを許可します。デフォルト値 - `false`. + +## 値 {#data-format-values} + +各行を括弧で囲んで出力します。行はカンマで区切られ、最後の行の後にはカンマはありません。括弧内の値もカンマで区切られています。数値は引用符なしの10進形式で出力されます。配列は角括弧で出力されます。文字列、日付、および時間を伴う日付は引用符で出力されます。エスケープルールと解析は[TabSeparated](#tabseparated)形式と似ています。フォーマット中、余分なスペースは挿入されませんが、解析中には許可されスキップされます(配列値内のスペースを除く、これは許可されません)。[NULL](/docs/ja/sql-reference/syntax.md)は`NULL`として表現されます。 + +Values形式でデータを渡す際にエスケープが必要な最小限の文字セット:シングルクオートとバックスラッシュ。 + +この形式は`INSERT INTO t VALUES ...`で使用されますが、クエリの結果をフォーマットするために使用することもできます。 + +## 値形式の設定 {#values-format-settings} + +- [input_format_values_interpret_expressions](/docs/ja/operations/settings/settings-formats.md/#input_format_values_interpret_expressions) - ストリーミングパーサがフィールドを解析できない場合、SQLパーサを実行し、SQL式として解釈しようとします。デフォルト値 - `true`. +- [input_format_values_deduce_templates_of_expressions](/docs/ja/operations/settings/settings-formats.md/#input_format_values_deduce_templates_of_expressions) - ストリーミングパーサがフィールドを解析できない場合、SQLパーサを実行し、SQL式のテンプレートを導出し、テンプレートを使用してすべての行を解析し、すべての行に対して式を解釈しようとします。デフォルト値 - `true`. +- [input_format_values_accurate_types_of_literals](/docs/ja/operations/settings/settings-formats.md/#input_format_values_accurate_types_of_literals) - テンプレートを使用して式を解析し解釈する際に、リテラルの実際の型をチェックして、オーバーフローや精度の問題を回避します。デフォルト値 - `true`. + +## 垂直 {#vertical} + +各値を指定されたカラム名とともに別の行に出力します。この形式は、各行が多数のカラムで構成されている場合に、1行または数行だけを出力するのに便利です。 + +[NULL](/docs/ja/sql-reference/syntax.md)は`ᴺᵁᴸᴸ`として出力されます。 + +例: + +``` sql +SELECT * FROM t_null FORMAT Vertical +``` + +``` response +Row 1: +────── +x: 1 +y: ᴺᵁᴸᴸ +``` + +Vertical形式では行はエスケープされません: + +``` sql +SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT Vertical +``` + +``` response +Row 1: +────── +test: string with 'quotes' and with some special + characters +``` + +この形式はクエリ結果の出力にのみ適していますが、テーブルに挿入するデータを解析する(取得する)ためには適していません。 + +## XML {#xml} + +XML形式は出力専用であり、解析には適していません。例: + +``` xml + + + + + + SearchPhrase + String + + + count() + UInt64 + + + + + + + 8267016 + + + bathroom interior design + 2166 + + + clickhouse + 1655 + + + 2014 spring fashion + 1549 + + + freeform photos + 1480 + + + angelina jolie + 1245 + + + omsk + 1112 + + + photos of dog breeds + 1091 + + + curtain designs + 1064 + + + baku + 1000 + + + 10 + 141137 + +``` + +カラム名が受け入れ可能な形式でない場合、単に‘field’が要素名として使用されます。一般に、XML構造はJSON構造に従います。JSONと同様に、無効なUTF-8シーケンスは置換文字�に変更されるため、出力テキストは有効なUTF-8シーケンスで構成されます。 + +文字列値内の文字`<`と`&`はそれぞれ`<`と`&`としてエスケープされます。 + +配列は`HelloWorld...`として、タプルは`HelloWorld...`として出力されます。 + +## CapnProto {#capnproto} + +CapnProtoは、[Protocol Buffers](https://developers.google.com/protocol-buffers/)や[Thrift](https://en.wikipedia.org/wiki/Apache_Thrift)に似たバイナリメッセージ形式ですが、[JSON](#json)や[MessagePack](https://msgpack.org/)とは異なります。 + +CapnProtoメッセージは厳密に型付けされており、自己記述的ではありません。したがって、外部スキーマの記述が必要です。スキーマはクエリごとにキャッシュされその場で適用されます。 + +また、[Format Schema](#formatschema)も参照してください。 + +### データ型のマッチング {#data_types-matching-capnproto} + +以下の表は、`INSERT`および`SELECT`クエリにおけるClickHouseの[データ型](/docs/ja/sql-reference/data-types/index.md)と対応するサポートされているデータ型を示しています。 + +| CapnProto データ型 (`INSERT`) | ClickHouse データ型 | CapnProto データ型 (`SELECT`) | +|----------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------| +| `UINT8`, `BOOL` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT8` | +| `INT8` | [Int8](/docs/ja/sql-reference/data-types/int-uint.md) | `INT8` | +| `UINT16` | [UInt16](/docs/ja/sql-reference/data-types/int-uint.md), [Date](/docs/ja/sql-reference/data-types/date.md) | `UINT16` | +| `INT16` | [Int16](/docs/ja/sql-reference/data-types/int-uint.md) | `INT16` | +| `UINT32` | [UInt32](/docs/ja/sql-reference/data-types/int-uint.md), [DateTime](/docs/ja/sql-reference/data-types/datetime.md) | `UINT32` | +| `INT32` | [Int32](/docs/ja/sql-reference/data-types/int-uint.md), [Decimal32](/docs/ja/sql-reference/data-types/decimal.md) | `INT32` | +| `UINT64` | [UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT64` | +| `INT64` | [Int64](/docs/ja/sql-reference/data-types/int-uint.md), [DateTime64](/docs/ja/sql-reference/data-types/datetime.md), [Decimal64](/docs/ja/sql-reference/data-types/decimal.md) | `INT64` | +| `FLOAT32` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `FLOAT32` | +| `FLOAT64` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `FLOAT64` | +| `TEXT, DATA` | [String](/docs/ja/sql-reference/data-types/string.md), [FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `TEXT, DATA` | +| `union(T, Void), union(Void, T)` | [Nullable(T)](/docs/ja/sql-reference/data-types/date.md) | `union(T, Void), union(Void, T)` | +| `ENUM` | [Enum(8/16)](/docs/ja/sql-reference/data-types/enum.md) | `ENUM` | +| `LIST` | [Array](/docs/ja/sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `STRUCT` | +| `UINT32` | [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `UINT32` | +| `DATA` | [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `DATA` | +| `DATA` | [Int128/UInt128/Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `DATA` | +| `DATA` | [Decimal128/Decimal256](/docs/ja/sql-reference/data-types/decimal.md) | `DATA` | +| `STRUCT(entries LIST(STRUCT(key Key, value Value)))` | [Map](/docs/ja/sql-reference/data-types/map.md) | `STRUCT(entries LIST(STRUCT(key Key, value Value)))` | + +整数型は入力/出力の際に相互に変換可能です。 + +CapnProto形式で`Enum`を扱うには[format_capn_proto_enum_comparising_mode](/docs/ja/operations/settings/settings-formats.md/#format_capn_proto_enum_comparising_mode)設定を使用してください。 + +配列はネスト可能であり、`Nullable`型を引数として持つことができます。`Tuple`と`Map`型もネストできます。 + +### データの挿入と選択 {#inserting-and-selecting-data-capnproto} + +ファイルからCapnProtoデータをClickHouseテーブルに挿入するには、以下のコマンドを使用します: + +``` bash +$ cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits SETTINGS format_schema = 'schema:Message' FORMAT CapnProto" +``` + +ここで、`schema.capnp`は以下のようになります: + +``` capnp +struct Message { + SearchPhrase @0 :Text; + c @1 :Uint64; +} +``` + +ClickHouseテーブルからデータを選択し、CapnProto形式でファイルに保存するには、以下のコマンドを使用します: + +``` bash +$ clickhouse-client --query = "SELECT * FROM test.hits FORMAT CapnProto SETTINGS format_schema = 'schema:Message'" +``` + +### 自動生成スキーマの使用 {#using-autogenerated-capn-proto-schema} + +データの外部CapnProtoスキーマがない場合でも、自動生成スキーマを使用してCapnProto形式でデータを入力/出力することができます。例: + +```sql +SELECT * FROM test.hits format CapnProto SETTINGS format_capn_proto_use_autogenerated_schema=1 +``` + +この場合、ClickHouseはテーブルの構造に従ってCapnProtoスキーマを自動生成し、このスキーマを使用してCapnProto形式でデータをシリアル化します。 + +自動生成スキーマでCapnProtoファイルを読み込むこともできます(この場合、ファイルは同じスキーマを使用して作成する必要があります): + +```bash +$ cat hits.bin | clickhouse-client --query "INSERT INTO test.hits SETTINGS format_capn_proto_use_autogenerated_schema=1 FORMAT CapnProto" +``` + +設定[format_capn_proto_use_autogenerated_schema](../operations/settings/settings-formats.md#format_capn_proto_use_autogenerated_schema)はデフォルトで有効になっており、[format_schema](../operations/settings/settings-formats.md#formatschema-format-schema)が設定されていない場合に適用されます。 + +入力/出力中に自動生成スキーマをファイルに保存することもでき、設定[output_format_schema](../operations/settings/settings-formats.md#outputformatschema-output-format-schema)を使用します。例: + +```sql +SELECT * FROM test.hits format CapnProto SETTINGS format_capn_proto_use_autogenerated_schema=1, output_format_schema='path/to/schema/schema.capnp' +``` + +この場合、自動生成されたCapnProtoスキーマはファイル`path/to/schema/schema.capnp`に保存されます。 + +## Prometheus {#prometheus} + +[Prometheusのテキスト形式](https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format)でメトリックを公開します。 + +出力テーブルには適切な構造が必要です。 +カラム`name`([String](/docs/ja/sql-reference/data-types/string.md))と`value`(数値)は必須です。 +行にはオプションで`help`([String](/docs/ja/sql-reference/data-types/string.md))と`timestamp`(数値)を含めることができます。 +カラム`type`([String](/docs/ja/sql-reference/data-types/string.md))は`counter`、`gauge`、`histogram`、`summary`、`untyped`または空です。 +各メトリックの値にはいくつかの`labels`([Map(String, String)](/docs/ja/sql-reference/data-types/map.md))を持たせることができます。 +いくつかの連続した行は、異なるラベルで1つのメトリックに参照される場合があります。テーブルは(例:`ORDER BY name`で)メトリック名でソートする必要があります。 + +[`histogram`]と[`summary`]のラベルには特別な要件があります。詳細は[Prometheus文書](https://prometheus.io/docs/instrumenting/exposition_formats/#histograms-and-summaries)を参照してください。ラベルが`{'count':''}`および`{'sum':''}`である行には特別なルールが適用され、それぞれ`_count`と`_sum`に変換されます。 + +**例:** + +``` +┌─name────────────────────────────────┬─type──────┬─help──────────────────────────────────────┬─labels─────────────────────────┬────value─┬─────timestamp─┐ +│ http_request_duration_seconds │ histogram │ A histogram of the request duration. │ {'le':'0.05'} │ 24054 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'le':'0.1'} │ 33444 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'le':'0.2'} │ 100392 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'le':'0.5'} │ 129389 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'le':'1'} │ 133988 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'le':'+Inf'} │ 144320 │ 0 │ +│ http_request_duration_seconds │ histogram │ │ {'sum':''} │ 53423 │ 0 │ +│ http_requests_total │ counter │ Total number of HTTP requests │ {'method':'post','code':'200'} │ 1027 │ 1395066363000 │ +│ http_requests_total │ counter │ │ {'method':'post','code':'400'} │ 3 │ 1395066363000 │ +│ metric_without_timestamp_and_labels │ │ │ {} │ 12.47 │ 0 │ +│ rpc_duration_seconds │ summary │ A summary of the RPC duration in seconds. │ {'quantile':'0.01'} │ 3102 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'quantile':'0.05'} │ 3272 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'quantile':'0.5'} │ 4773 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'quantile':'0.9'} │ 9001 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'quantile':'0.99'} │ 76656 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'count':''} │ 2693 │ 0 │ +│ rpc_duration_seconds │ summary │ │ {'sum':''} │ 17560473 │ 0 │ +│ something_weird │ │ │ {'problem':'division by zero'} │ inf │ -3982045 │ +└─────────────────────────────────────┴───────────┴───────────────────────────────────────────┴────────────────────────────────┴──────────┴───────────────┘ +``` + +次のようにフォーマットされます: + +``` +# HELP http_request_duration_seconds A histogram of the request duration. +# TYPE http_request_duration_seconds histogram +http_request_duration_seconds_bucket{le="0.05"} 24054 +http_request_duration_seconds_bucket{le="0.1"} 33444 +http_request_duration_seconds_bucket{le="0.5"} 129389 +http_request_duration_seconds_bucket{le="1"} 133988 +http_request_duration_seconds_bucket{le="+Inf"} 144320 +http_request_duration_seconds_sum 53423 +http_request_duration_seconds_count 144320 + +# HELP http_requests_total Total number of HTTP requests +# TYPE http_requests_total counter +http_requests_total{code="200",method="post"} 1027 1395066363000 +http_requests_total{code="400",method="post"} 3 1395066363000 + +metric_without_timestamp_and_labels 12.47 + +# HELP rpc_duration_seconds A summary of the RPC duration in seconds. +# TYPE rpc_duration_seconds summary +rpc_duration_seconds{quantile="0.01"} 3102 +rpc_duration_seconds{quantile="0.05"} 3272 +rpc_duration_seconds{quantile="0.5"} 4773 +rpc_duration_seconds{quantile="0.9"} 9001 +rpc_duration_seconds{quantile="0.99"} 76656 +rpc_duration_seconds_sum 17560473 +rpc_duration_seconds_count 2693 + +something_weird{problem="division by zero"} +Inf -3982045 +``` + +## Protobuf {#protobuf} + +Protobufとは、[Protocol Buffers](https://protobuf.dev/)形式です。 + +この形式は外部フォーマットスキーマが必要です。スキーマはクエリ間でキャッシュされます。 +ClickHouseは`proto2`と`proto3`の両方のシンタックスをサポートしています。繰り返し/オプション/必須フィールドがサポートされています。 + +使用例: + +``` sql +SELECT * FROM test.table FORMAT Protobuf SETTINGS format_schema = 'schemafile:MessageType' +``` + +``` bash +cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table SETTINGS format_schema='schemafile:MessageType' FORMAT Protobuf" +``` + +ファイル`schemafile.proto`は以下のようになります: + +``` capnp +syntax = "proto3"; + +message MessageType { + string name = 1; + string surname = 2; + uint32 birthDate = 3; + repeated string phoneNumbers = 4; +}; +``` + +テーブルカラムとProtocol Buffersのメッセージ型のフィールドの間の対応を見つけるために、ClickHouseはその名前を比較します。 +この比較は大文字と小文字を区別せず、`_`(アンダースコア)と`.`(ドット)は等しいとみなされます。 +カラムとProtocol Buffersのメッセージのフィールドの型が異なる場合は、必要な変換が適用されます。 + +ネストされたメッセージがサポートされています。以下のメッセージタイプでフィールド `z` の場合 + +``` capnp +message MessageType { + message XType { + message YType { + int32 z; + }; + repeated YType y; + }; + XType x; +}; +``` + +ClickHouseは`x.y.z`(または`x_y_z`や`X.y_Z`など)という名前のカラムを探そうとします。 +ネストされたメッセージは、[ネストされたデータ構造](/docs/ja/sql-reference/data-types/nested-data-structures/index.md)を入力または出力するのに適しています。 + +プロトコルバッファのスキーマで次のように定義されたデフォルト値 + +``` capnp +syntax = "proto2"; + +message MessageType { + optional int32 result_per_page = 3 [default = 10]; +} +``` + +は適用されず、[テーブルデフォルト](/docs/ja/sql-reference/statements/create/table.md/#create-default-values)が代わりに使用されます。 + +ClickHouseは`length-delimited`形式でプロトコルバッファメッセージを入出力します。 +つまり、各メッセージの前に、その長さが[varint](https://developers.google.com/protocol-buffers/docs/encoding#varints)として書かれている必要があります。 +また、[一般的な言語で長さ区切りのプロトコルバッファメッセージを読み書きする方法](https://cwiki.apache.org/confluence/display/GEODE/Delimiting+Protobuf+Messages)も参照してください。 + +### 自動生成スキーマの使用 {#using-autogenerated-protobuf-schema} + +データの外部プロトコルバッファスキーマがない場合でも、自動生成スキーマを使用してプロトコルバッファ形式でデータを入力/出力することができます。例: + +```sql +SELECT * FROM test.hits format Protobuf SETTINGS format_protobuf_use_autogenerated_schema=1 +``` + +この場合、ClickHouseはテーブルの構造に従ってプロトコルバッファスキーマを自動生成し、このスキーマを使用してプロトコルバッファ形式でデータをシリアル化します。 + +自動生成スキーマでプロトコルバッファファイルを読み込むこともできます(この場合、ファイルは同じスキーマを使用して作成する必要があります): + +```bash +$ cat hits.bin | clickhouse-client --query "INSERT INTO test.hits SETTINGS format_protobuf_use_autogenerated_schema=1 FORMAT Protobuf" +``` + +設定[format_protobuf_use_autogenerated_schema](../operations/settings/settings-formats.md#format_protobuf_use_autogenerated_schema)はデフォルトで有効になっており、[format_schema](../operations/settings/settings-formats.md#formatschema-format-schema)が設定されていない場合に適用されます。 + +入力/出力中に自動生成スキーマをファイルに保存することもでき、設定[output_format_schema](../operations/settings/settings-formats.md#outputformatschema-output-format-schema)を使用します。例: + +```sql +SELECT * FROM test.hits format Protobuf SETTINGS format_protobuf_use_autogenerated_schema=1, output_format_schema='path/to/schema/schema.proto' +``` + +この場合、自動生成されたプロトコルバッファスキーマはファイル`path/to/schema/schema.capnp`に保存されます。 + +### プロトコルバッファキャッシュの削除 + +[format_schema_path](../operations/server-configuration-parameters/settings.md/#format_schema_path)からロードしたプロトコルバッファスキーマをリロードするには、[SYSTEM DROP ... FORMAT CACHE](../sql-reference/statements/system.md/#system-drop-schema-format)ステートメントを使用します。 + +```sql +SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf +``` + +## ProtobufSingle {#protobufsingle} + +[Protobuf](#protobuf)と同様ですが、長さ区切りがない単一のプロトコルバッファメッセージを保存/解析するためのものです。 + +## ProtobufList {#protobuflist} + +Protobufに似ていますが、行は固定名が「Envelope」であるメッセージ内のサブメッセージのシーケンスとして表現されます。 + +使用例: + +``` sql +SELECT * FROM test.table FORMAT ProtobufList SETTINGS format_schema = 'schemafile:MessageType' +``` + +``` bash +cat protobuflist_messages.bin | clickhouse-client --query "INSERT INTO test.table FORMAT ProtobufList SETTINGS format_schema='schemafile:MessageType'" +``` + +ファイル`schemafile.proto`は以下のようになります: + +``` capnp +syntax = "proto3"; +message Envelope { + message MessageType { + string name = 1; + string surname = 2; + uint32 birthDate = 3; + repeated string phoneNumbers = 4; + }; + MessageType row = 1; +}; +``` + +## Avro {#data-format-avro} + +[Apache Avro](https://avro.apache.org/)は、ApacheのHadoopプロジェクト内で開発された行指向のデータシリアル化フレームワークです。 + +ClickHouseのAvro形式は[Avroデータファイル](https://avro.apache.org/docs/current/spec.html#Object+Container+Files)の読み取りおよび書き込みをサポートしています。 + +### データ型のマッチング {#data_types-matching} + +以下の表は、`INSERT`および`SELECT`クエリにおけるClickHouseの[データ型](/docs/ja/sql-reference/data-types/index.md)とのマッチングを示しています。 + +| Avro データ型 `INSERT` | ClickHouse データ型 | Avro データ型 `SELECT` | +|-------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|--------------------------------| +| `boolean`, `int`, `long`, `float`, `double` | [Int(8\16\32)](/docs/ja/sql-reference/data-types/int-uint.md), [UInt(8\16\32)](/docs/ja/sql-reference/data-types/int-uint.md) | `int` | +| `boolean`, `int`, `long`, `float`, `double` | [Int64](/docs/ja/sql-reference/data-types/int-uint.md), [UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `long` | +| `boolean`, `int`, `long`, `float`, `double` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `float` | +| `boolean`, `int`, `long`, `float`, `double` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `double` | +| `bytes`, `string`, `fixed`, `enum` | [String](/docs/ja/sql-reference/data-types/string.md) | `bytes` または `string` \* | +| `bytes`, `string`, `fixed` | [FixedString(N)](/docs/ja/sql-reference/data-types/fixedstring.md) | `fixed(N)` | +| `enum` | [Enum(8\16)](/docs/ja/sql-reference/data-types/enum.md) | `enum` | +| `array(T)` | [Array(T)](/docs/ja/sql-reference/data-types/array.md) | `array(T)` | +| `map(V, K)` | [Map(V, K)](/docs/ja/sql-reference/data-types/map.md) | `map(string, K)` | +| `union(null, T)`, `union(T, null)` | [Nullable(T)](/docs/ja/sql-reference/data-types/date.md) | `union(null, T)` | +| `union(T1, T2, …)` \** | [Variant(T1, T2, …)](/docs/ja/sql-reference/data-types/variant.md) | `union(T1, T2, …)` \** | +| `null` | [Nullable(Nothing)](/docs/ja/sql-reference/data-types/special-data-types/nothing.md) | `null` | +| `int (date)` \**\* | [Date](/docs/ja/sql-reference/data-types/date.md), [Date32](docs/en/sql-reference/data-types/date32.md) | `int (date)` \**\* | +| `long (timestamp-millis)` \**\* | [DateTime64(3)](/docs/ja/sql-reference/data-types/datetime.md) | `long (timestamp-millis)` \**\*| +| `long (timestamp-micros)` \**\* | [DateTime64(6)](/docs/ja/sql-reference/data-types/datetime.md) | `long (timestamp-micros)` \**\*| +| `bytes (decimal)` \**\* | [DateTime64(N)](/docs/ja/sql-reference/data-types/datetime.md) | `bytes (decimal)` \**\* | +| `int` | [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `int` | +| `fixed(16)` | [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `fixed(16)` | +| `bytes (decimal)` \**\* | [Decimal(P, S)](/docs/ja/sql-reference/data-types/decimal.md) | `bytes (decimal)` \**\* | +| `string (uuid)` \**\* | [UUID](/docs/ja/sql-reference/data-types/uuid.md) | `string (uuid)` \**\* | +| `fixed(16)` | [Int128/UInt128](/docs/ja/sql-reference/data-types/int-uint.md) | `fixed(16)` | +| `fixed(32)` | [Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `fixed(32)` | +| `record` | [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `record` | + +\* `bytes`はデフォルトです。これは[output_format_avro_string_column_pattern](/docs/ja/operations/settings/settings-formats.md/#output_format_avro_string_column_pattern)によって制御されます。 + +\** [Variant型](/docs/ja/sql-reference/data-types/variant)はフィールド値として`null`を暗黙的に受け入れるため、例えばAvro `union(T1, T2, null)`は`Variant(T1, T2)`に変換されます。 +結果として、ClickHouseからAvroを生成する際には、スキーマ推論中に任意の値が実際に`null`かどうか不明なため、`union`型セットに常に`null`型を含める必要があります。 + +\**\* [Avro論理型](https://avro.apache.org/docs/current/spec.html#Logical+Types) + +サポートされていないAvro論理データ型:`time-millis`, `time-micros`, `duration` + +### データ挿入 {#inserting-data-1} + +AvroファイルからClickHouseテーブルにデータを挿入するには: + +``` bash +$ cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro" +``` + +入力Avroファイルのルートスキーマは`record`型でなければなりません。 + +テーブルカラムとAvroスキーマのフィールドの間の対応を見つけるために、ClickHouseはその名前を比較します。比較は大文字と小文字を区別します。 +使用されていないフィールドはスキップされます。 + +ClickHouseテーブルカラムのデータ型は、挿入されるAvroデータの対応するフィールドの型と異なる可能性があります。データを挿入する際、ClickHouseは上記の表に従ってデータ型を解釈し、その後、ClickHouseテーブルカラムに対応する型にデータを[キャスト](/docs/ja/sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast)します。 + +データをインポートする際、スキーマ内でフィールドが見つからず、設定[inform_format_avro_allow_missing_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_avro_allow_missing_fields)が有効の場合、デフォルト値がエラーの代わりに使用されます。 + +### データ選択 {#selecting-data-1} + +ClickHouseテーブルからAvroファイルにデータを選択するには: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro +``` + +カラム名は以下を満たす必要があります: + +- `[A-Za-z_]`で始まる +- 次に`[A-Za-z0-9_]`のみを含む + +出力Avroファイルの圧縮と同期インターバルは[output_format_avro_codec](/docs/ja/operations/settings/settings-formats.md/#output_format_avro_codec)と[output_format_avro_sync_interval](/docs/ja/operations/settings/settings-formats.md/#output_format_avro_sync_interval)でそれぞれ設定できます。 + +### データ例 {#example-data-avro} + +ClickHouseの[DESCRIBE](/docs/ja/sql-reference/statements/describe-table)機能を使用して、次の例のようなAvroファイルの推論形式をすばやく表示できます。この例にはClickHouse S3パブリックバケット内の公開アクセス可能なAvroファイルのURLが含まれています: + +``` +DESCRIBE url('https://clickhouse-public-datasets.s3.eu-central-1.amazonaws.com/hits.avro','Avro); +``` +``` +┌─name───────────────────────┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ WatchID │ Int64 │ │ │ │ │ │ +│ JavaEnable │ Int32 │ │ │ │ │ │ +│ Title │ String │ │ │ │ │ │ +│ GoodEvent │ Int32 │ │ │ │ │ │ +│ EventTime │ Int32 │ │ │ │ │ │ +│ EventDate │ Date32 │ │ │ │ │ │ +│ CounterID │ Int32 │ │ │ │ │ │ +│ ClientIP │ Int32 │ │ │ │ │ │ +│ ClientIP6 │ FixedString(16) │ │ │ │ │ │ +│ RegionID │ Int32 │ │ │ │ │ │ +... +│ IslandID │ FixedString(16) │ │ │ │ │ │ +│ RequestNum │ Int32 │ │ │ │ │ │ +│ RequestTry │ Int32 │ │ │ │ │ │ +└────────────────────────────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## AvroConfluent {#data-format-avro-confluent} + +AvroConfluentは、[Kafka](https://kafka.apache.org/)および[Confluent Schema Registry](https://docs.confluent.io/current/schema-registry/index.html)で一般的に使用されるシングルオブジェクトAvroメッセージのデコードをサポートしています。 + +各AvroメッセージにはスキーマIDが埋め込まれており、スキーマレジストリの助けを借りて実際のスキーマに解決できます。 + +スキーマは一度解決されるとキャッシュされます。 + +スキーマレジストリURLは[format_avro_schema_registry_url](/docs/ja/operations/settings/settings-formats.md/#format_avro_schema_registry_url)で設定されます。 + +### データ型のマッチング {#data_types-matching-1} + +[Avro](#data-format-avro)と同様です。 + +### 使用方法 {#usage} + +スキーマ解決をすばやく確認するには、[kafkacat](https://github.com/edenhill/kafkacat)と[clickhouse-local](/docs/ja/operations/utilities/clickhouse-local.md)を使用できます: + +``` bash +$ kafkacat -b kafka-broker -C -t topic1 -o beginning -f '%s' -c 3 | clickhouse-local --input-format AvroConfluent --format_avro_schema_registry_url 'http://schema-registry' -S "field1 Int64, field2 String" -q 'select * from table' +1 a +2 b +3 c +``` + +[Kafka](/docs/ja/engines/table-engines/integrations/kafka.md)で`AvroConfluent`を使用するには: + +``` sql +CREATE TABLE topic1_stream +( + field1 String, + field2 String +) +ENGINE = Kafka() +SETTINGS +kafka_broker_list = 'kafka-broker', +kafka_topic_list = 'topic1', +kafka_group_name = 'group1', +kafka_format = 'AvroConfluent'; + +-- デバッグ目的の場合、セッションでformat_avro_schema_registry_urlを設定できます。 +-- この方法は本番環境では使用できません。 +SET format_avro_schema_registry_url = 'http://schema-registry'; + +SELECT * FROM topic1_stream; +``` + +:::note +`format_avro_schema_registry_url`の設定値は再起動後も維持するために`users.xml`で設定する必要があります。また、`Kafka`テーブルエンジンの`format_avro_schema_registry_url`設定を使用することもできます。 +::: + +## Parquet {#data-format-parquet} + +[Apache Parquet](https://parquet.apache.org/)は、Hadoopエコシステムで広く使用されている列指向のストレージ形式です。ClickHouseはこの形式の読み取りおよび書き込み操作をサポートしています。 + +### データ型のマッチング {#data-types-matching-parquet} + +以下の表は、`INSERT`および`SELECT`クエリにおけるClickHouseの[データ型](/docs/ja/sql-reference/data-types/index.md)とのマッチングを示しています。 + +| Parquet データ型 (`INSERT`) | ClickHouse データ型 | Parquet データ型 (`SELECT`) | +|-----------------------------------------------|------------------------------------------------------------------------------------------------------------|-------------------------------| +| `BOOL` | [Bool](/docs/ja/sql-reference/data-types/boolean.md) | `BOOL` | +| `UINT8`, `BOOL` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT8` | +| `INT8` | [Int8](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum8](/docs/ja/sql-reference/data-types/enum.md) | `INT8` | +| `UINT16` | [UInt16](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT16` | +| `INT16` | [Int16](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum16](/docs/ja/sql-reference/data-types/enum.md) | `INT16` | +| `UINT32` | [UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT32` | +| `INT32` | [Int32](/docs/ja/sql-reference/data-types/int-uint.md) | `INT32` | +| `UINT64` | [UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT64` | +| `INT64` | [Int64](/docs/ja/sql-reference/data-types/int-uint.md) | `INT64` | +| `FLOAT` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `FLOAT` | +| `DOUBLE` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `DOUBLE` | +| `DATE` | [Date32](/docs/ja/sql-reference/data-types/date.md) | `DATE` | +| `TIME (ms)` | [DateTime](/docs/ja/sql-reference/data-types/datetime.md) | `UINT32` | +| `TIMESTAMP`, `TIME (us, ns)` | [DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | `TIMESTAMP` | +| `STRING`, `BINARY` | [String](/docs/ja/sql-reference/data-types/string.md) | `BINARY` | +| `STRING`, `BINARY`, `FIXED_LENGTH_BYTE_ARRAY` | [FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `FIXED_LENGTH_BYTE_ARRAY` | +| `DECIMAL` | [Decimal](/docs/ja/sql-reference/data-types/decimal.md) | `DECIMAL` | +| `LIST` | [Array](/docs/ja/sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](/docs/ja/sql-reference/data-types/map.md) | `MAP` | +| `UINT32` | [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `UINT32` | +| `FIXED_LENGTH_BYTE_ARRAY`, `BINARY` | [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `FIXED_LENGTH_BYTE_ARRAY` | +| `FIXED_LENGTH_BYTE_ARRAY`, `BINARY` | [Int128/UInt128/Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `FIXED_LENGTH_BYTE_ARRAY` | + +配列はネスト可能であり、`Nullable`型を引数として持つことができます。`Tuple`と`Map`型もネストできます。 + +サポートされていないParquetデータ型:`FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`。 + +ClickHouseテーブルカラムのデータ型は、挿入されるParquetデータの対応するフィールドのデータ型と異なる可能性があります。データを挿入する際、ClickHouseは上記の表に従ってデータ型を解釈し、その後、[キャスト](/docs/ja/sql-reference/functions/type-conversion-functions/#type_conversion_function-cast)を行い、ClickHouseテーブルカラムに設定されたデータ型に変換します。 + +### データの挿入と選択 {#inserting-and-selecting-data-parquet} + +ファイルからParquetデータをClickHouseテーブルに挿入するには、以下のコマンドを使用します: + +``` bash +$ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT Parquet" +``` + +ClickHouseテーブルからデータを選択し、それをParquet形式でファイルに保存するには、以下のコマンドを使用します: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq} +``` + +Hadoopとのデータ交換には、[HDFSテーブルエンジン](/docs/ja/engines/table-engines/integrations/hdfs.md)を使用できます。 + +### Parquet形式の設定 {#parquet-format-settings} + +- [output_format_parquet_row_group_size](/docs/ja/operations/settings/settings-formats.md/#output_format_parquet_row_group_size) - データ出力の際の行グループサイズ(行単位)。デフォルト値 - `1000000`. +- [output_format_parquet_string_as_string](/docs/ja/operations/settings/settings-formats.md/#output_format_parquet_string_as_string) - Parquet String型を使用してStringカラムをBinaryでなく出力します。デフォルト値 - `false`. +- [input_format_parquet_import_nested](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_import_nested) - Parquet入力形式でネストされたデータを[Nested](/docs/ja/sql-reference/data-types/nested-data-structures/index.md)テーブルに挿入することを許可します。デフォルト値 - `false`. +- [input_format_parquet_case_insensitive_column_matching](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_case_insensitive_column_matching) - ParquetカラムとClickHouseカラムの照合を大文字と小文字を区別せずに処理します。デフォルト値 - `false`. +- [input_format_parquet_allow_missing_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_allow_missing_columns) - Parquetデータを読み取る際にカラムが欠損しても許可します。デフォルト値 - `false`. +- [input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference) - Parquet形式のスキーマ推論中にサポートされていない型のカラムをスキップすることを許可します。デフォルト値 - `false`. +- [input_format_parquet_local_file_min_bytes_for_seek](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_local_file_min_bytes_for_seek) - Parquet入力形式でシークを実行する際に必要な最小バイト数(ローカル読み取りファイル)を定義します。デフォルト値 - `8192`. +- [output_format_parquet_fixed_string_as_fixed_byte_array](/docs/ja/operations/settings/settings-formats.md/#output_format_parquet_fixed_string_as_fixed_byte_array) - FixedStringカラムにParquet FIXED_LENGTH_BYTE_ARRAY型を使用します。デフォルト値 - `true`. +- [output_format_parquet_version](/docs/ja/operations/settings/settings-formats.md/#output_format_parquet_version) - 出力形式で使用されるParquetフォーマットのバージョン。デフォルト値 - `2.latest`. +- [output_format_parquet_compression_method](/docs/ja/operations/settings/settings-formats.md/#output_format_parquet_compression_method) - 出力Parquet形式に使用される圧縮方法。デフォルト値 - `lz4`. +- [input_format_parquet_max_block_size](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_max_block_size) - Parquetリーダーの最大ブロック行サイズ。デフォルト値 - `65409`. +- [input_format_parquet_prefer_block_bytes](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_prefer_block_bytes) - Parquetリーダーが出力する平均ブロックバイト数。デフォルト値 - `16744704`. +- [output_format_parquet_write_page_index](/docs/ja/operations/settings/settings-formats.md/#input_format_parquet_max_block_size) - Parquetファイルにページインデックスを書き込む可能性を追加します。現在は`output_format_parquet_use_custom_encoder`を無効にする必要があります。デフォルト値 - `true`. + +## ParquetMetadata {data-format-parquet-metadata} + +Parquetファイルメタデータ(https://parquet.apache.org/docs/file-format/metadata/)を読むための特別な形式です。常に以下の構造/内容で1行を出力します: +- num_columns - カラムの数 +- num_rows - 合計行数 +- num_row_groups - 合計行グループ数 +- format_version - parquetフォーマットのバージョン、常に1.0または2.6 +- total_uncompressed_size - データの総非圧縮バイトサイズ、すべての行グループのtotal_byte_sizeの合計として計算 +- total_compressed_size - データの総圧縮バイトサイズ、すべての行グループのtotal_compressed_sizeの合計として計算 +- columns - 次の構造を持つカラムメタデータのリスト: + - name - カラム名 + - path - カラムパス(ネストされたカラムの場合にはnameと異なる) + - max_definition_level - 最大定義レベル + - max_repetition_level - 最大繰り返しレベル + - physical_type - カラムの物理型 + - logical_type - カラムの論理型 +- compression - このカラムで使用されている圧縮 +- total_uncompressed_size - 行グループすべてのカラムの total_uncompressed_size を合計して得られる、カラムの総非圧縮バイトサイズ +- total_compressed_size - 行グループすべてのカラムの total_compressed_size を合計して得られる、カラムの総圧縮バイトサイズ +- space_saved - 圧縮によって節約されたスペースの割合(パーセント)、(1 - total_compressed_size/total_uncompressed_size)として計算される +- encodings - このカラムで使用されるエンコーディングのリスト +- row_groups - 次の構造を持つ行グループのメタデータリスト: + - num_columns - 行グループ内のカラム数 + - num_rows - 行グループ内の行数 + - total_uncompressed_size - 行グループの総非圧縮バイトサイズ + - total_compressed_size - 行グループの総圧縮バイトサイズ + - columns - 次の構造を持つカラムチャンクメタデータのリスト: + - name - カラム名 + - path - カラムパス + - total_compressed_size - カラムの総圧縮バイトサイズ + - total_uncompressed_size - 行グループの総非圧縮バイトサイズ + - have_statistics - カラムチャンクメタデータにカラム統計が含まれるかどうかを示す真偽値 + - statistics - カラムチャンクの統計情報 (have_statistics が false の場合、すべてのフィールドは NULL) 次の構造を持つ: + - num_values - カラムチャンク内の非 NULL 値の数 + - null_count - カラムチャンク内の NULL 値の数 + - distinct_count - カラムチャンク内の異なる値の数 + - min - カラムチャンクの最小値 + - max - カラムチャンクの最大値 + +例: + +```sql +SELECT * FROM file(data.parquet, ParquetMetadata) format PrettyJSONEachRow +``` + +```json +{ + "num_columns": "2", + "num_rows": "100000", + "num_row_groups": "2", + "format_version": "2.6", + "metadata_size": "577", + "total_uncompressed_size": "282436", + "total_compressed_size": "26633", + "columns": [ + { + "name": "number", + "path": "number", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "INT32", + "logical_type": "Int(bitWidth=16, isSigned=false)", + "compression": "LZ4", + "total_uncompressed_size": "133321", + "total_compressed_size": "13293", + "space_saved": "90.03%", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + }, + { + "name": "concat('Hello', toString(modulo(number, 1000)))", + "path": "concat('Hello', toString(modulo(number, 1000)))", + "max_definition_level": "0", + "max_repetition_level": "0", + "physical_type": "BYTE_ARRAY", + "logical_type": "None", + "compression": "LZ4", + "total_uncompressed_size": "149115", + "total_compressed_size": "13340", + "space_saved": "91.05%", + "encodings": [ + "RLE_DICTIONARY", + "PLAIN", + "RLE" + ] + } + ], + "row_groups": [ + { + "num_columns": "2", + "num_rows": "65409", + "total_uncompressed_size": "179809", + "total_compressed_size": "14163", + "columns": [ + { + "name": "number", + "path": "number", + "total_compressed_size": "7070", + "total_uncompressed_size": "85956", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "0", + "max": "999" + } + }, + { + "name": "concat('Hello', toString(modulo(number, 1000)))", + "path": "concat('Hello', toString(modulo(number, 1000)))", + "total_compressed_size": "7093", + "total_uncompressed_size": "93853", + "have_statistics": true, + "statistics": { + "num_values": "65409", + "null_count": "0", + "distinct_count": null, + "min": "Hello0", + "max": "Hello999" + } + } + ] + }, + ... + ] +} +``` + +## Arrow {#data-format-arrow} + +[Apache Arrow](https://arrow.apache.org/)には2つの組み込みの列指向ストレージフォーマットがあります。ClickHouseはこれらのフォーマットの読み書きをサポートしています。 + +`Arrow`は、Apache Arrowの"file mode"フォーマットです。これはインメモリランダムアクセス用に設計されています。 + +### データ型のマッチング {#data-types-matching-arrow} + +下記の表は、`INSERT`および`SELECT`クエリにおいてサポートされるデータ型とClickHouse [データ型](/docs/ja/sql-reference/data-types/index.md)のマッチングの方法を示しています。 + +| Arrow データ型 (`INSERT`) | ClickHouse データ型 | Arrow データ型 (`SELECT`) | +|-----------------------------------------|------------------------------------------------------------------------------------------------------------|----------------------------| +| `BOOL` | [Bool](/docs/ja/sql-reference/data-types/boolean.md) | `BOOL` | +| `UINT8`, `BOOL` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT8` | +| `INT8` | [Int8](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum8](/docs/ja/sql-reference/data-types/enum.md) | `INT8` | +| `UINT16` | [UInt16](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT16` | +| `INT16` | [Int16](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum16](/docs/ja/sql-reference/data-types/enum.md) | `INT16` | +| `UINT32` | [UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT32` | +| `INT32` | [Int32](/docs/ja/sql-reference/data-types/int-uint.md) | `INT32` | +| `UINT64` | [UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `UINT64` | +| `INT64` | [Int64](/docs/ja/sql-reference/data-types/int-uint.md) | `INT64` | +| `FLOAT`, `HALF_FLOAT` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `FLOAT32` | +| `DOUBLE` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `FLOAT64` | +| `DATE32` | [Date32](/docs/ja/sql-reference/data-types/date32.md) | `UINT16` | +| `DATE64` | [DateTime](/docs/ja/sql-reference/data-types/datetime.md) | `UINT32` | +| `TIMESTAMP`, `TIME32`, `TIME64` | [DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | `UINT32` | +| `STRING`, `BINARY` | [String](/docs/ja/sql-reference/data-types/string.md) | `BINARY` | +| `STRING`, `BINARY`, `FIXED_SIZE_BINARY` | [FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `FIXED_SIZE_BINARY` | +| `DECIMAL` | [Decimal](/docs/ja/sql-reference/data-types/decimal.md) | `DECIMAL` | +| `DECIMAL256` | [Decimal256](/docs/ja/sql-reference/data-types/decimal.md) | `DECIMAL256` | +| `LIST` | [Array](/docs/ja/sql-reference/data-types/array.md) | `LIST` | +| `STRUCT` | [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `STRUCT` | +| `MAP` | [Map](/docs/ja/sql-reference/data-types/map.md) | `MAP` | +| `UINT32` | [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `UINT32` | +| `FIXED_SIZE_BINARY`, `BINARY` | [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `FIXED_SIZE_BINARY` | +| `FIXED_SIZE_BINARY`, `BINARY` | [Int128/UInt128/Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `FIXED_SIZE_BINARY` | + +配列はネスト可能であり、引数として`Nullable`型を持つことができます。`Tuple`と`Map`型もネスト可能です。 + +`INSERT`クエリには`DICTIONARY`型がサポートされており、`SELECT`クエリでは、[LowCardinality](/docs/ja/sql-reference/data-types/lowcardinality.md)型を`DICTIONARY`型として出力することを可能にする設定 [output_format_arrow_low_cardinality_as_dictionary](/docs/ja/operations/settings/settings-formats.md/#output-format-arrow-low-cardinality-as-dictionary)があります。 + +サポートされていないArrowデータ型: `FIXED_SIZE_BINARY`, `JSON`, `UUID`, `ENUM`. + +ClickHouseのテーブルカラムのデータ型は、対応するArrowのデータフィールドと一致する必要はありません。データを挿入する際、ClickHouseは上記の表に従ってデータ型を解釈し、その後、ClickHouseのテーブルカラムに設定されたデータ型に[キャスト](/docs/ja/sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast)します。 + +### データ挿入 {#inserting-data-arrow} + +ArrowデータをファイルからClickHouseテーブルに挿入するには、次のコマンドを使用します: + +``` bash +$ cat filename.arrow | clickhouse-client --query="INSERT INTO some_table FORMAT Arrow" +``` + +### データの選択 {#selecting-data-arrow} + +ClickHouseテーブルからデータを選択し、それをArrowフォーマットのファイルに保存するには、次のコマンドを使用します: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Arrow" > {filename.arrow} +``` + +### Arrowフォーマットの設定 {#arrow-format-settings} + +- [output_format_arrow_low_cardinality_as_dictionary](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_low_cardinality_as_dictionary) - ClickHouse LowCardinality型をDictionary Arrow型として出力することを有効にします。デフォルト値は`false`です。 +- [output_format_arrow_use_64_bit_indexes_for_dictionary](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_use_64_bit_indexes_for_dictionary) - Dictionaryのインデックスに64ビット整数型を使用します。デフォルト値は`false`です。 +- [output_format_arrow_use_signed_indexes_for_dictionary](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_use_signed_indexes_for_dictionary) - Dictionaryのインデックスに符号付き整数型を使用します。デフォルト値は`true`です。 +- [output_format_arrow_string_as_string](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_string_as_string) - StringカラムにBinaryではなくArrow String型を使用します。デフォルト値は`false`です。 +- [input_format_arrow_case_insensitive_column_matching](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_case_insensitive_column_matching) - ArrowカラムとClickHouseカラムのマッチングにおいて大文字小文字を無視します。デフォルト値は`false`です。 +- [input_format_arrow_allow_missing_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_allow_missing_columns) - Arrowデータを読み取る際に欠落しているカラムを許可します。デフォルト値は`false`です。 +- [input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference) - Arrowフォーマットのスキーマ推論時にサポートされていない型のカラムをスキップすることを許可します。デフォルト値は`false`です。 +- [output_format_arrow_fixed_string_as_fixed_byte_array](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_fixed_string_as_fixed_byte_array) - FixedStringカラムにByte/StringではなくArrow FIXED_SIZE_BINARY型を使用します。デフォルト値は`true`です。 +- [output_format_arrow_compression_method](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_compression_method) - 出力Arrowフォーマットに使用される圧縮メソッド。デフォルト値は`lz4_frame`です。 + +## ArrowStream {#data-format-arrow-stream} + +`ArrowStream`はApache Arrowの「stream mode」フォーマットです。これはインメモリストリーム処理用に設計されています。 + +## ORC {#data-format-orc} + +[Apache ORC](https://orc.apache.org/)は[Hadoop](https://hadoop.apache.org/)エコシステムで広く使用されている列指向ストレージフォーマットです。 + +### データ型のマッチング {#data-types-matching-orc} + +下記の表は、`INSERT`および`SELECT`クエリにおいてサポートされるデータ型とClickHouse [データ型](/docs/ja/sql-reference/data-types/index.md)のマッチングの方法を示しています。 + +| ORC データ型 (`INSERT`) | ClickHouse データ型 | ORC データ型 (`SELECT`) | +|---------------------------------------|-------------------------------------------------------------------------------------------------------------------|--------------------------| +| `Boolean` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `Boolean` | +| `Tinyint` | [Int8/UInt8](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum8](/docs/ja/sql-reference/data-types/enum.md) | `Tinyint` | +| `Smallint` | [Int16/UInt16](/docs/ja/sql-reference/data-types/int-uint.md)/[Enum16](/docs/ja/sql-reference/data-types/enum.md) | `Smallint` | +| `Int` | [Int32/UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `Int` | +| `Bigint` | [Int64/UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `Bigint` | +| `Float` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `Float` | +| `Double` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `Double` | +| `Decimal` | [Decimal](/docs/ja/sql-reference/data-types/decimal.md) | `Decimal` | +| `Date` | [Date32](/docs/ja/sql-reference/data-types/date32.md) | `Date` | +| `Timestamp` | [DateTime64](/docs/ja/sql-reference/data-types/datetime64.md) | `Timestamp` | +| `String`, `Char`, `Varchar`, `Binary` | [String](/docs/ja/sql-reference/data-types/string.md) | `Binary` | +| `List` | [Array](/docs/ja/sql-reference/data-types/array.md) | `List` | +| `Struct` | [Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `Struct` | +| `Map` | [Map](/docs/ja/sql-reference/data-types/map.md) | `Map` | +| `Int` | [IPv4](/docs/ja/sql-reference/data-types/int-uint.md) | `Int` | +| `Binary` | [IPv6](/docs/ja/sql-reference/data-types/ipv6.md) | `Binary` | +| `Binary` | [Int128/UInt128/Int256/UInt256](/docs/ja/sql-reference/data-types/int-uint.md) | `Binary` | +| `Binary` | [Decimal256](/docs/ja/sql-reference/data-types/decimal.md) | `Binary` | + +その他の型はサポートされていません。 + +配列はネスト可能で、引数として`Nullable`型を持つことができます。`Tuple`と`Map`型もネスト可能です。 + +ClickHouseのテーブルカラムのデータ型は、対応するORCデータフィールドと一致する必要はありません。データを挿入する際、ClickHouseは上記の表に従ってデータ型を解釈し、その後、ClickHouseのテーブルカラムに設定されたデータ型に[キャスト](/docs/ja/sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast)します。 + +### データ挿入 {#inserting-data-orc} + +ORCデータをファイルからClickHouseテーブルに挿入するには、次のコマンドを使用します: + +``` bash +$ cat filename.orc | clickhouse-client --query="INSERT INTO some_table FORMAT ORC" +``` + +### データの選択 {#selecting-data-orc} + +ClickHouseテーブルからデータを選択し、それをORCフォーマットのファイルに保存するには、次のコマンドを使用します: + +``` bash +$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT ORC" > {filename.orc} +``` + +### Arrowフォーマットの設定 {#parquet-format-settings} + +- [output_format_arrow_string_as_string](/docs/ja/operations/settings/settings-formats.md/#output_format_arrow_string_as_string) - StringカラムにBinaryではなくArrow String型を使用します。デフォルト値は`false`です。 +- [output_format_orc_compression_method](/docs/ja/operations/settings/settings-formats.md/#output_format_orc_compression_method) - 出力ORCフォーマットに使用される圧縮メソッド。デフォルト値は`none`です。 +- [input_format_arrow_case_insensitive_column_matching](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_case_insensitive_column_matching) - ArrowカラムとClickHouseカラムのマッチングにおいて大文字小文字を無視します。デフォルト値は`false`です。 +- [input_format_arrow_allow_missing_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_allow_missing_columns) - Arrowデータを読み取る際に欠落しているカラムを許可します。デフォルト値は`false`です。 +- [input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference](/docs/ja/operations/settings/settings-formats.md/#input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference) - Arrowフォーマットのスキーマ推論時にサポートされていない型のカラムをスキップすることを許可します。デフォルト値は`false`です。 + +Hadoopとデータを交換するには、[HDFSテーブルエンジン](/docs/ja/engines/table-engines/integrations/hdfs.md)を使用できます。 + +## One {#data-format-one} + +ファイルからデータを読み取らず、`UInt8`型、名前`dummy`、値`0`を持つカラムを含む行のみを返す特殊な入力フォーマット。 +仮想カラム`_file/_path`を使用して、実際のデータを読み取らずにすべてのファイルをリストするために使用できます。 + +例: + +クエリ: +```sql +SELECT _file FROM file('path/to/files/data*', One); +``` + +結果: +```text +┌─_file────┐ +│ data.csv │ +└──────────┘ +┌─_file──────┐ +│ data.jsonl │ +└────────────┘ +┌─_file────┐ +│ data.tsv │ +└──────────┘ +┌─_file────────┐ +│ data.parquet │ +└──────────────┘ +``` + +## Npy {#data-format-npy} + +この機能は、NumPyの.npyファイルからNumPy配列をClickHouseにロードするように設計されています。NumPyファイルフォーマットは、数値データの配列を効率的に保存するためのバイナリフォーマットです。インポート中、ClickHouseは最上位次元を単一カラムを持つ行の配列として扱います。サポートされているNpyデータ型と、それに対応するClickHouseの型は以下の通りです。 + +| Npy データ型 (`INSERT`) | ClickHouse データ型 | Npy データ型 (`SELECT`) | +|--------------------------|-----------------------------------------------------------------|--------------------------| +| `i1` | [Int8](/docs/ja/sql-reference/data-types/int-uint.md) | `i1` | +| `i2` | [Int16](/docs/ja/sql-reference/data-types/int-uint.md) | `i2` | +| `i4` | [Int32](/docs/ja/sql-reference/data-types/int-uint.md) | `i4` | +| `i8` | [Int64](/docs/ja/sql-reference/data-types/int-uint.md) | `i8` | +| `u1`, `b1` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `u1` | +| `u2` | [UInt16](/docs/ja/sql-reference/data-types/int-uint.md) | `u2` | +| `u4` | [UInt32](/docs/ja/sql-reference/data-types/int-uint.md) | `u4` | +| `u8` | [UInt64](/docs/ja/sql-reference/data-types/int-uint.md) | `u8` | +| `f2`, `f4` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `f4` | +| `f8` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `f8` | +| `S`, `U` | [String](/docs/ja/sql-reference/data-types/string.md) | `S` | +| | [FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `S` | + +**Pythonを使用して.npy形式で配列を保存する例** + +```Python +import numpy as np +arr = np.array([[[1],[2],[3]],[[4],[5],[6]]]) +np.save('example_array.npy', arr) +``` + +**ClickHouseでNumPyファイルを読む例** + +クエリ: +```sql +SELECT * +FROM file('example_array.npy', Npy) +``` + +結果: +``` +┌─array─────────┐ +│ [[1],[2],[3]] │ +│ [[4],[5],[6]] │ +└───────────────┘ +``` + +**データの選択** + +ClickHouseテーブルからデータを選択し、それをNpyフォーマットのファイルに保存するには、次のコマンドを使用します: + +```bash +$ clickhouse-client --query="SELECT {column} FROM {some_table} FORMAT Npy" > {filename.npy} +``` + +## LineAsString {#lineasstring} + +このフォーマットでは、入力データの各行が単一の文字列値として解釈されます。このフォーマットは、型[String](/docs/ja/sql-reference/data-types/string.md)の単一フィールドを持つテーブルのみ解析できます。他のカラムは[DEFAULT](/docs/ja/sql-reference/statements/create/table.md/#default)または[MATERIALIZED](/docs/ja/sql-reference/statements/create/table.md/#materialized)に設定されるか、省略される必要があります。 + +**例** + +クエリ: + +``` sql +DROP TABLE IF EXISTS line_as_string; +CREATE TABLE line_as_string (field String) ENGINE = Memory; +INSERT INTO line_as_string FORMAT LineAsString "I love apple", "I love banana", "I love orange"; +SELECT * FROM line_as_string; +``` + +結果: + +``` text +┌─field─────────────────────────────────────────────┐ +│ "I love apple", "I love banana", "I love orange"; │ +└───────────────────────────────────────────────────┘ +``` + +## Regexp {#data-format-regexp} + +インポートされたデータの各行は、正規表現に従って解析されます。 + +`Regexp`フォーマットを使用する際には、以下の設定を利用できます: + +- `format_regexp` — [String](/docs/ja/sql-reference/data-types/string.md)。[re2](https://github.com/google/re2/wiki/Syntax)形式の正規表現を含みます。 + +- `format_regexp_escaping_rule` — [String](/docs/ja/sql-reference/data-types/string.md)。以下のエスケープルールがサポートされています: + + - CSV (類似 [CSV](#csv)) + - JSON (類似 [JSONEachRow](#jsoneachrow)) + - Escaped (類似 [TSV](#tabseparated)) + - Quoted (類似 [Values](#data-format-values)) + - Raw (サブパターンを丸ごと抽出、エスケープルールなし、[TSVRaw](#tabseparatedraw)に類似) + +- `format_regexp_skip_unmatched` — [UInt8](/docs/ja/sql-reference/data-types/int-uint.md)。インポートされたデータが `format_regexp` 式に一致しなかった場合に例外をスローする必要性を定義します。`0`または`1`に設定できます。 + +**使用方法** + +[format_regexp](/docs/ja/operations/settings/settings-formats.md/#format_regexp)設定からの正規表現は、インポートされたデータの各行に適用されます。正規表現のサブパターン数は、インポートされたデータセット内のカラム数と一致しなければなりません。 + +インポートされたデータの各行は、改行文字 `'\n'` 又は DOSスタイルの改行 `"\r\n"` で区切られる必要があります。 + +各サブパターンの内容は、[format_regexp_escaping_rule](/docs/ja/operations/settings/settings-formats.md/#format_regexp_escaping_rule)設定に従って、対応するデータ型のメソッドで解析されます。 + +正規表現が行に一致せず、[format_regexp_skip_unmatched](/docs/ja/operations/settings/settings-formats.md/#format_regexp_escaping_rule)が1に設定されている場合、その行は静かにスキップされます。それ以外の場合、例外がスローされます。 + +**例** + +ファイル data.tsvを考えてみましょう: + +```text +id: 1 array: [1,2,3] string: str1 date: 2020-01-01 +id: 2 array: [1,2,3] string: str2 date: 2020-01-02 +id: 3 array: [1,2,3] string: str3 date: 2020-01-03 +``` +そしてテーブル: + +```sql +CREATE TABLE imp_regex_table (id UInt32, array Array(UInt32), string String, date Date) ENGINE = Memory; +``` + +インポートコマンド: + +```bash +$ cat data.tsv | clickhouse-client --query "INSERT INTO imp_regex_table SETTINGS format_regexp='id: (.+?) array: (.+?) string: (.+?) date: (.+?)', format_regexp_escaping_rule='Escaped', format_regexp_skip_unmatched=0 FORMAT Regexp;" +``` + +クエリ: + +```sql +SELECT * FROM imp_regex_table; +``` + +結果: + +```text +┌─id─┬─array───┬─string─┬───────date─┐ +│ 1 │ [1,2,3] │ str1 │ 2020-01-01 │ +│ 2 │ [1,2,3] │ str2 │ 2020-01-02 │ +│ 3 │ [1,2,3] │ str3 │ 2020-01-03 │ +└────┴─────────┴────────┴────────────┘ +``` + +## フォーマットスキーマ {#formatschema} + +フォーマットスキーマを含むファイル名は、設定 `format_schema` で設定されます。 +`Cap'n Proto` および `Protobuf` のフォーマットが使用されている場合、この設定の設定が必要です。 +フォーマットスキーマは、ファイル名とこのファイル内のメッセージタイプの名前をコロンで区切った組み合わせです、 +例えば `schemafile.proto:MessageType` です。 +ファイルがフォーマットの標準拡張子(例えば、`Protobuf`の場合は`.proto`)を持っている場合、その拡張子を省略でき、この場合、フォーマットスキーマは `schemafile:MessageType` となります。 + +[client](/docs/ja/interfaces/cli.md) で [インタラクティブモード](/docs/ja/interfaces/cli.md/#cli_usage) でデータを入出力する場合、フォーマットスキーマに指定されたファイル名にはクライアント上の現在のディレクトリからの絶対パスまたは相対パスを含めることができます。 +[バッチモード](/docs/ja/interfaces/cli.md/#cli_usage) でクライアントを使用する場合、セキュリティ上の理由からスキーマへのパスは相対でなければなりません。 + +[HTTPインターフェイス](/docs/ja/interfaces/http.md)を使用してデータを入出力する場合、フォーマットスキーマに指定されたファイル名は、サーバー設定の[format_schema_path](/docs/ja/operations/server-configuration-parameters/settings.md/#format_schema_path)に指定されたディレクトリに存在する必要があります。 + +## エラーのスキップ {#skippingerrors} + +`CSV`, `TabSeparated`, `TSKV`, `JSONEachRow`, `Template`, `CustomSeparated`, `Protobuf`などの形式では、パースエラーが発生した場合に壊れた行をスキップし、次の行の最初からパースを続行できます。[input_format_allow_errors_num](/docs/ja/operations/settings/settings-formats.md/#input_format_allow_errors_num)と +[input_format_allow_errors_ratio](/docs/ja/operations/settings/settings-formats.md/#input_format_allow_errors_ratio)の設定を参照してください。 +制限事項: +- `JSONEachRow`の場合、パースエラー時にすべてのデータを新しい行(またはEOF)までスキップするため、正確にエラーをカウントするには`\\n`で行を区切る必要があります。 +- `Template`および`CustomSeparated`は、次の行の開始を見つけるために最後のカラム後の区切り文字と行間の区切り文字を使用するため、少なくともどちらか一つが空でない場合にのみエラーのスキップが機能します。 + +## RawBLOB {#rawblob} + +このフォーマットでは、入力データは単一の値に読み込まれます。型[String](/docs/ja/sql-reference/data-types/string.md)または類似の単一フィールドのテーブルのみを解析することができます。 +結果は、バイナリ形式で区切りやエスケープなしで出力されます。複数の値が出力される場合、フォーマットは曖昧になり、データを再度読み取ることができなくなります。 + +以下は、`RawBLOB`フォーマットと[TabSeparatedRaw](#tabseparatedraw)フォーマットの比較です。 + +`RawBLOB`: +- データはバイナリフォーマットで出力され、エスケープなし; +- 値間の区切りなし; +- 各値の最後に改行なし。 + +`TabSeparatedRaw`: +- データはエスケープなしで出力される; +- 行にはタブで区切られた値が含まれる; +- 各行の最後の値の後には改行がある。 + +以下は`RawBLOB`と[RowBinary](#rowbinary)フォーマットの比較です。 + +`RawBLOB`: +- Stringフィールドは長さをプレフィックスに持たずに出力される。 + +`RowBinary`: +- Stringフィールドはvarint形式(符号なし[LEB128](https://ja.wikipedia.org/wiki/LEB128))で長さが表され、その後に文字列のバイトが続く。 + +`RawBLOB`入力に空のデータを渡すと、ClickHouseは例外をスローします: + +``` text +Code: 108. DB::Exception: No data to insert +``` + +**例** + +``` bash +$ clickhouse-client --query "CREATE TABLE {some_table} (a String) ENGINE = Memory;" +$ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT RawBLOB" +$ clickhouse-client --query "SELECT * FROM {some_table} FORMAT RawBLOB" | md5sum +``` + +結果: + +``` text +f9725a22f9191e064120d718e26862a9 - +``` + +## MsgPack {#msgpack} + +ClickHouseは[MessagePack](https://msgpack.org/)データファイルの読み書きをサポートしています。 + +### データ型のマッチング {#data-types-matching-msgpack} + +| MessagePack データ型 (`INSERT`) | ClickHouse データ型 | MessagePack データ型 (`SELECT`) | +|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|----------------------------------| +| `uint N`, `positive fixint` | [UIntN](/docs/ja/sql-reference/data-types/int-uint.md) | `uint N` | +| `int N`, `negative fixint` | [IntN](/docs/ja/sql-reference/data-types/int-uint.md) | `int N` | +| `bool` | [UInt8](/docs/ja/sql-reference/data-types/int-uint.md) | `uint 8` | +| `fixstr`, `str 8`, `str 16`, `str 32`, `bin 8`, `bin 16`, `bin 32` | [String](/docs/ja/sql-reference/data-types/string.md) | `bin 8`, `bin 16`, `bin 32` | +| `fixstr`, `str 8`, `str 16`, `str 32`, `bin 8`, `bin 16`, `bin 32` | [FixedString](/docs/ja/sql-reference/data-types/fixedstring.md) | `bin 8`, `bin 16`, `bin 32` | +| `float 32` | [Float32](/docs/ja/sql-reference/data-types/float.md) | `float 32` | +| `float 64` | [Float64](/docs/ja/sql-reference/data-types/float.md) | `float 64` | +| `uint 16` | [Date](/docs/ja/sql-reference/data-types/date.md) | `uint 16` | +| `int 32` | [Date32](/docs/ja/sql-reference/data-types/date32.md) | `int 32` | +| `uint 32` | [DateTime](/docs/ja/sql-reference/data-types/datetime.md) | `uint 32` | +| `uint 64` | [DateTime64](/docs/ja/sql-reference/data-types/datetime.md) | `uint 64` | +| `fixarray`, `array 16`, `array 32` | [Array](/docs/ja/sql-reference/data-types/array.md)/[Tuple](/docs/ja/sql-reference/data-types/tuple.md) | `fixarray`, `array 16`, `array 32` | +| `fixmap`, `map 16`, `map 32` | [Map](/docs/ja/sql-reference/data-types/map.md) | `fixmap`, `map 16`, `map 32` | +| `uint 32` | [IPv4](/docs/ja/sql-reference/data-types/ipv4.md) | `uint 32` | +| `bin 8` | [String](/docs/ja/sql-reference/data-types/string.md) | `bin 8` | +| `int 8` | [Enum8](/docs/ja/sql-reference/data-types/enum.md) | `int 8` | +| `bin 8` | [(U)Int128/(U)Int256](/docs/ja/sql-reference/data-types/int-uint.md) | `bin 8` | +| `int 32` | [Decimal32](/docs/ja/sql-reference/data-types/decimal.md) | `int 32` | +| `int 64` | [Decimal64](/docs/ja/sql-reference/data-types/decimal.md) | `int 64` | +| `bin 8` | [Decimal128/Decimal256](/docs/ja/sql-reference/data-types/decimal.md) | `bin 8 ` | + +例: + +".msgpk"ファイルへの書き込み: + +```sql +$ clickhouse-client --query="CREATE TABLE msgpack (array Array(UInt8)) ENGINE = Memory;" +$ clickhouse-client --query="INSERT INTO msgpack VALUES ([0, 1, 2, 3, 42, 253, 254, 255]), ([255, 254, 253, 42, 3, 2, 1, 0])"; +$ clickhouse-client --query="SELECT * FROM msgpack FORMAT MsgPack" > tmp_msgpack.msgpk; +``` + +### MsgPackフォーマットの設定 {#msgpack-format-settings} + +- [input_format_msgpack_number_of_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_msgpack_number_of_columns) - 挿入されたMsgPackデータ内のカラム数。データからの自動スキーマ推論に使用。デフォルト値は`0`。 +- [output_format_msgpack_uuid_representation](/docs/ja/operations/settings/settings-formats.md/#output_format_msgpack_uuid_representation) - MsgPackフォーマットでUUIDを出力する方法。デフォルト値は`EXT`。 + +## MySQLDump {#mysqldump} + +ClickHouseはMySQL [ダンプ](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)の読み取りをサポートしています。 +ダンプ内の1つのテーブルに属するINSERTクエリからすべてのデータを読み取ります。複数のテーブルがある場合、デフォルトでは最初のテーブルからデータを読み取ります。 +[input_format_mysql_dump_table_name](/docs/ja/operations/settings/settings-formats.md/#input_format_mysql_dump_table_name)設定を使用して、データを読み取るテーブルの名前を指定できます。 +[input_format_mysql_dump_map_columns](/docs/ja/operations/settings/settings-formats.md/#input_format_mysql_dump_map_columns)設定が1に設定されており、指定されたテーブルのCREATEクエリまたはINSERTクエリ内のカラム名がダンプに含まれている場合、入力データのカラムはその名前でテーブルのカラムにマップされます、 +未知の名前のカラムは、設定[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)が1に設定されている場合、スキップされます。 +このフォーマットはスキーマ推論をサポートしています:ダンプが指定されたテーブルのCREATEクエリを含む場合、構造はそこから抽出されます。そうでなければ、スキーマはINSERTクエリのデータから推論されます。 + +例: + +ファイル dump.sql: +```sql +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `x` int DEFAULT NULL, + `y` int DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +INSERT INTO `test` VALUES (1,NULL),(2,NULL),(3,NULL),(3,NULL),(4,NULL),(5,NULL),(6,7); +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test 3` ( + `y` int DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +INSERT INTO `test 3` VALUES (1); +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test2` ( + `x` int DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +INSERT INTO `test2` VALUES (1),(2),(3); +``` + +クエリ: + +```sql +DESCRIBE TABLE file(dump.sql, MySQLDump) SETTINGS input_format_mysql_dump_table_name = 'test2' +``` + +```text +┌─name─┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ x │ Nullable(Int32) │ │ │ │ │ │ +└──────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +```sql +SELECT * +FROM file(dump.sql, MySQLDump) + SETTINGS input_format_mysql_dump_table_name = 'test2' +``` + +```text +┌─x─┐ +│ 1 │ +│ 2 │ +│ 3 │ +└───┘ +``` + +## DWARF {#dwarf} + +ELFファイル(実行ファイル、ライブラリ、オブジェクトファイル)からDWARFデバッグシンボルを解析します。`dwarfdump`に似ていますが、はるかに速く(数百MB/秒)、SQLと共に利用できます。.debug_infoセクション内の各デバッグ情報エントリ(DIE)に対して1行を生成します。DIEを終端するためにDWARFエンコーディングが使用する"null"エントリも含まれます。 + +簡単な背景: `.debug_info` は *ユニット* で構成されており、それぞれがコンパイルユニットに対応します。各ユニットは、`compile_unit` DIEをルートとする *DIE* のツリーです。各DIEは *タグ* を持ち、*属性* のリストを持ちます。各属性は *名前* と *値*(およびその値がどのようにエンコードされているかを指定する *form*)を持ちます。DIEはソースコードからの内容を表し、そのタグがどのような内容であるかを示しています。例えば、関数は(タグ= `subprogram`)、クラス/構造体/列挙型(`class_type`/`structure_type`/`enumeration_type`)、変数(`variable`)、関数の引数(`formal_parameter`)などです。ツリー構造は対応するソースコードを反映しています。例えば、`class_type` DIE はクラスのメソッドを表す `subprogram` DIE を含むことがあります。 + +以下のカラムを出力します: + - `offset` - `.debug_info` セクション内のDIEの位置 + - `size` - エンコードされたDIEのバイト数(属性を含む) + - `tag` - DIEのタイプ; 通常の "DW_TAG_" プレフィックスは省略されます + - `unit_name` - このDIEを含むコンパイルユニットの名前 + - `unit_offset` - `.debug_info` セクション内でこのDIEを含むコンパイルユニットの位置 + - 現在のDIEのツリー内の先祖のタグを順に含む配列: + - `ancestor_tags` + - `ancestor_offsets` - `ancestor_tags`と並行する補Offset + - 利便性のために属性配列から重複したいくつかの一般的な属性: + - `name` + - `linkage_name` - マングルされた完全修飾名; 通常、関数のみがそれを持ちます(すべての関数が持っているわけではありません) + - `decl_file` - このエンティティが宣言されたソースコードファイルの名前 + - `decl_line` - このエンティティが宣言されたソースコード内の行番号 + - 属性を説明する並行配列: + - `attr_name` - 属性の名前; 通常の "DW_AT_" プレフィックスは省略 + - `attr_form` - 属性がどのようにエンコードされ、解釈されるか; 通常のDW_FORM_プレフィックスは省略 + - `attr_int` - 属性の整数値; 属性が数値を持たない場合は0 + - `attr_str` - 属性の文字列値; 属性が文字列値を持たない場合は空 + +例:最も多くの関数定義を持つコンパイルユニットを見つける(テンプレートのインスタンス化やインクルードされたヘッダファイルからの関数を含む): +```sql +SELECT + unit_name, + count() AS c +FROM file('programs/clickhouse', DWARF) +WHERE tag = 'subprogram' AND NOT has(attr_name, 'declaration') +GROUP BY unit_name +ORDER BY c DESC +LIMIT 3 +``` +```text +┌─unit_name──────────────────────────────────────────────────┬─────c─┐ +│ ./src/Core/Settings.cpp │ 28939 │ +│ ./src/AggregateFunctions/AggregateFunctionSumMap.cpp │ 23327 │ +│ ./src/AggregateFunctions/AggregateFunctionUniqCombined.cpp │ 22649 │ +└────────────────────────────────────────────────────────────┴───────┘ + +3 rows in set. Elapsed: 1.487 sec. Processed 139.76 million rows, 1.12 GB (93.97 million rows/s., 752.77 MB/s.) +Peak memory usage: 271.92 MiB. +``` + +## Markdown {#markdown} + +結果を[Markdown](https://en.wikipedia.org/wiki/Markdown)フォーマットを利用してエクスポートし、自分の`.md`ファイルに貼り付ける準備を整えることができます: + +```sql +SELECT + number, + number * 2 +FROM numbers(5) +FORMAT Markdown +``` +```results +| number | multiply(number, 2) | +|-:|-:| +| 0 | 0 | +| 1 | 2 | +| 2 | 4 | +| 3 | 6 | +| 4 | 8 | +``` + +Markdownテーブルは自動的に生成され、GithubのようなMarkdown対応プラットフォームで使用することができます。このフォーマットは出力専用です。 + +## Form {#form} + +Formフォーマットは、データを `key1=value1&key2=value2` の形式でフォーマットされた `application/x-www-form-urlencoded` フォーマットで単一のレコードを読み書きするために使用できます。 + +例: + +ユーザーファイルパスに配置されたファイル `data.tmp` には、URLエンコードされたデータがあります: + +```text +t_page=116&c.e=ls7xfkpm&c.tti.m=raf&rt.start=navigation&rt.bmr=390%2C11%2C10 +``` + +```sql +SELECT * FROM file(data.tmp, Form) FORMAT vertical; +``` + +結果: + +```text +Row 1: +────── +t_page: 116 +c.e: ls7xfkpm +c.tti.m: raf +rt.start: navigation +rt.bmr: 390,11,10 +``` diff --git a/docs/ja/interfaces/grpc.md b/docs/ja/interfaces/grpc.md new file mode 100644 index 00000000000..2113bc858f1 --- /dev/null +++ b/docs/ja/interfaces/grpc.md @@ -0,0 +1,99 @@ +--- +slug: /ja/interfaces/grpc +sidebar_position: 19 +sidebar_label: gRPC インターフェース +--- + +# gRPC インターフェース + +## 概要 {#grpc-interface-introduction} + +ClickHouseは[gRPC](https://grpc.io/) インターフェースをサポートしています。これは、HTTP/2と[Protocol Buffers](https://en.wikipedia.org/wiki/Protocol_Buffers)を使用するオープンソースのリモートプロシージャコールシステムです。ClickHouseにおけるgRPCの実装は次の機能をサポートしています: + +- SSL; +- 認証; +- セッション; +- 圧縮; +- 同じチャネルを通じた並列クエリ; +- クエリのキャンセル; +- 進捗とログ取得; +- 外部テーブル。 + +インターフェースの仕様は[clickhouse_grpc.proto](https://github.com/ClickHouse/ClickHouse/blob/master/src/Server/grpc_protos/clickhouse_grpc.proto)に記載されています。 + +## gRPC 設定 {#grpc-interface-configuration} + +gRPCインターフェースを使用するには、メイン[サーバー設定](../operations/configuration-files.md)で `grpc_port` を設定します。その他の設定オプションは次の例で確認してください: + +```xml +9100 + + false + + + /path/to/ssl_cert_file + /path/to/ssl_key_file + + + false + + + /path/to/ssl_ca_cert_file + + + deflate + + + medium + + + -1 + -1 + + + false + +``` + +## 組み込みクライアント {#grpc-client} + +提供される[仕様](https://github.com/ClickHouse/ClickHouse/blob/master/src/Server/grpc_protos/clickhouse_grpc.proto)を使用して、gRPCがサポートする任意のプログラミング言語でクライアントを開発できます。または、組み込みのPythonクライアントを使用することもできます。このクライアントはリポジトリ内の[utils/grpc-client/clickhouse-grpc-client.py](https://github.com/ClickHouse/ClickHouse/blob/master/utils/grpc-client/clickhouse-grpc-client.py)に配置されています。組み込みクライアントには、[grpcioとgrpcio-tools](https://grpc.io/docs/languages/python/quickstart)のPythonモジュールが必要です。 + +クライアントは次の引数をサポートしています: + +- `--help` – ヘルプメッセージを表示して終了します。 +- `--host HOST, -h HOST` – サーバー名。デフォルト値: `localhost`。IPv4またはIPv6アドレスも使用できます。 +- `--port PORT` – 接続するポート。このポートはClickHouseサーバーの設定で有効にする必要があります(`grpc_port`を参照)。デフォルト値: `9100`。 +- `--user USER_NAME, -u USER_NAME` – ユーザー名。デフォルト値: `default`。 +- `--password PASSWORD` – パスワード。デフォルト値: 空の文字列。 +- `--query QUERY, -q QUERY` – 非対話モードで使用するクエリ。 +- `--database DATABASE, -d DATABASE` – デフォルトデータベース。指定されていない場合、サーバー設定でセットされた現在のデータベースが使用されます(デフォルトは`default`)。 +- `--format OUTPUT_FORMAT, -f OUTPUT_FORMAT` – 結果の出力[形式](formats.md)。対話モードのデフォルト値: `PrettyCompact`。 +- `--debug` – デバッグ情報の表示を有効にします。 + +`--query`引数なしで呼び出すことでクライアントを対話モードで開始できます。 + +バッチモードでは、`stdin`を通じてクエリデータを渡すことができます。 + +**クライアント使用例** + +以下の例では、テーブルを作成し、CSVファイルからデータをロードします。その後、テーブルの内容をクエリします。 + +``` bash +./clickhouse-grpc-client.py -q "CREATE TABLE grpc_example_table (id UInt32, text String) ENGINE = MergeTree() ORDER BY id;" +echo -e "0,Input data for\n1,gRPC protocol example" > a.csv +cat a.csv | ./clickhouse-grpc-client.py -q "INSERT INTO grpc_example_table FORMAT CSV" + +./clickhouse-grpc-client.py --format PrettyCompact -q "SELECT * FROM grpc_example_table;" +``` + +結果: + +``` text +┌─id─┬─text──────────────────┐ +│ 0 │ Input data for │ +│ 1 │ gRPC protocol example │ +└────┴───────────────────────┘ +``` diff --git a/docs/ja/interfaces/http.md b/docs/ja/interfaces/http.md new file mode 100644 index 00000000000..f30e21d19f7 --- /dev/null +++ b/docs/ja/interfaces/http.md @@ -0,0 +1,872 @@ +--- +slug: /ja/interfaces/http +sidebar_position: 19 +sidebar_label: HTTP インターフェース +--- + +# HTTP インターフェース + +HTTP インターフェースを使用すると、ClickHouse を任意のプラットフォームで任意のプログラミング言語から REST API の形式で利用できます。HTTP インターフェースはネイティブインターフェースよりも制限がありますが、言語サポートが優れています。 + +デフォルトでは、`clickhouse-server` は HTTP のためにポート 8123 でリスンしています(これは設定で変更可能です)。 +HTTPS も有効化可能で、デフォルトポートは 8443 です。 + +パラメータなしで `GET /` リクエストを行うと、200 のレスポンスコードと [http_server_default_response](../operations/server-configuration-parameters/settings.md#http_server_default_response) に定義されたデフォルト値「Ok.」の文字列(行末に改行付き)が返されます。 + +``` bash +$ curl 'http://localhost:8123/' +Ok. +``` + +また参照してください: [HTTP レスポンスコードの注意事項](#http_response_codes_caveats)。 + +ユーザーのオペレーティングシステムで `curl` コマンドが利用できない場合もあります。Ubuntu や Debian では、`sudo apt install curl` を実行してください。例を実行する前に、この[ドキュメント](https://curl.se/download.html)を参照してインストールしてください。 + +Web UI は次のURLでアクセス可能です: `http://localhost:8123/play`。 + +![Web UI](../images/play.png) + +ヘルスチェックスクリプトでは `GET /ping` リクエストを使用します。このハンドラは常に「Ok.」(行末に改行付き)を返します。バージョン 18.12.13 から利用可能です。レプリカの遅延をチェックするには `/replicas_status` も参照してください。 + +``` bash +$ curl 'http://localhost:8123/ping' +Ok. +$ curl 'http://localhost:8123/replicas_status' +Ok. +``` + +リクエストをURLの `query` パラメータとして、またはPOSTとして送信します。または `query` パラメータにクエリの最初の部分を送り、残りをPOSTで送信します(後でこれが必要な理由を説明します)。URLのサイズはデフォルトで1 MiBに制限されており、これは `http_max_uri_size` 設定で変更可能です。 + +成功すると、200 のレスポンスコードとレスポンスボディに結果が返されます。 +エラーが発生すると、500 のレスポンスコードとエラーの説明文がレスポンスボディに含まれます。 + +GET メソッドを使用する際は、`readonly` が設定されます。つまり、データを修正するクエリの場合は、POST メソッドのみを使用できます。クエリ自体を POST ボディまたは URL パラメータに送信できます。 + +例: + +``` bash +$ curl 'http://localhost:8123/?query=SELECT%201' +1 + +$ wget -nv -O- 'http://localhost:8123/?query=SELECT 1' +1 + +$ echo -ne 'GET /?query=SELECT%201 HTTP/1.0\r\n\r\n' | nc localhost 8123 +HTTP/1.0 200 OK +Date: Wed, 27 Nov 2019 10:30:18 GMT +Connection: Close +Content-Type: text/tab-separated-values; charset=UTF-8 +X-ClickHouse-Server-Display-Name: clickhouse.ru-central1.internal +X-ClickHouse-Query-Id: 5abe861c-239c-467f-b955-8a201abb8b7f +X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} + +1 +``` + +ご覧のとおり、`curl` はスペースを URL エスケープしなければならず、やや不便です。 +`wget` はすべてを自動でエスケープしますが、保持接続 `keep-alive` や `Transfer-Encoding: chunked` を使う際に HTTP 1.1 でうまく動作しないため、使用をお勧めしません。 + +``` bash +$ echo 'SELECT 1' | curl 'http://localhost:8123/' --data-binary @- +1 + +$ echo 'SELECT 1' | curl 'http://localhost:8123/?query=' --data-binary @- +1 + +$ echo '1' | curl 'http://localhost:8123/?query=SELECT' --data-binary @- +1 +``` + +一部のクエリがパラメータとして送信され、一部が POST で送信されると、これらのデータ部分間に改行が挿入されます。 +例(これは動作しません): + +``` bash +$ echo 'ECT 1' | curl 'http://localhost:8123/?query=SEL' --data-binary @- +Code: 59, e.displayText() = DB::Exception: Syntax error: failed at position 0: SEL +ECT 1 +, expected One of: SHOW TABLES, SHOW DATABASES, SELECT, INSERT, CREATE, ATTACH, RENAME, DROP, DETACH, USE, SET, OPTIMIZE., e.what() = DB::Exception +``` + +デフォルトでは、データは [TabSeparated](formats.md#tabseparated) 形式で返されます。 + +クエリの FORMAT 句を使用して、他の任意の形式をリクエストできます。 + +または、`default_format` URL パラメータまたは `X-ClickHouse-Format` ヘッダーを使用して、TabSeparated 以外のデフォルト形式を指定することもできます。 + +``` bash +$ echo 'SELECT 1 FORMAT Pretty' | curl 'http://localhost:8123/?' --data-binary @- +┏━━━┓ +┃ 1 ┃ +┡━━━┩ +│ 1 │ +└───┘ +``` + +`INSERT` クエリではデータの送信に POST メソッドが必要です。この場合、クエリの開始部分を URL パラメータに書き、POST を使用してデータを渡すことができます。挿入するデータは、たとえば MySQL のタブ区切りダンプかもしれません。このようにして、`INSERT` クエリは MySQL の `LOAD DATA LOCAL INFILE` を置き換えます。 + +**例** + +テーブルの作成: + +``` bash +$ echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @- +``` + +おなじみの INSERT クエリを使用したデータ挿入: + +``` bash +$ echo 'INSERT INTO t VALUES (1),(2),(3)' | curl 'http://localhost:8123/' --data-binary @- +``` + +データをクエリと別に送信: + +``` bash +$ echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @- +``` + +任意のデータ形式を指定できます。「Values」形式は、INSERT INTO t VALUES と同じです: + +``` bash +$ echo '(7),(8),(9)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20Values' --data-binary @- +``` + +タブ区切りのダンプからデータを挿入するには、対応する形式を指定します: + +``` bash +$ echo -ne '10\n11\n12\n' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20TabSeparated' --data-binary @- +``` + +テーブル内容を読み出します。データは並列クエリ処理によりランダムな順序で出力されます: + +``` bash +$ curl 'http://localhost:8123/?query=SELECT%20a%20FROM%20t' +7 +8 +9 +10 +11 +12 +1 +2 +3 +4 +5 +6 +``` + +テーブルを削除します。 + +``` bash +$ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @- +``` + +データテーブルを返さない成功したリクエストの場合、空のレスポンスボディが返されます。 + + +## 圧縮 {#compression} + +大量のデータを送信する際のネットワークトラフィックを削減したり、圧縮済みのダンプを作成するために圧縮を使用できます。 + +データを送信する際に、ClickHouse の内部圧縮形式を使用できます。圧縮データは非標準の形式を持ち、`clickhouse-compressor` プログラムを使用して操作する必要があります。これは `clickhouse-client` パッケージとともにインストールされます。データ挿入の効率を高めるために、[http_native_compression_disable_checksumming_on_decompress](../operations/settings/settings.md#http_native_compression_disable_checksumming_on_decompress) 設定を使用してサーバー側のチェックサム検証を無効にできます。 + +URLに `compress=1` を指定すると、サーバーは送信するデータを圧縮します。URLに `decompress=1` を指定すると、サーバーは POST 方法で渡されたデータを解凍します。 + +また、[HTTP圧縮](https://en.wikipedia.org/wiki/HTTP_compression)を使用することもできます。ClickHouse は次の[圧縮方式](https://en.wikipedia.org/wiki/HTTP_compression#Content-Encoding_tokens)をサポートしています: + +- `gzip` +- `br` +- `deflate` +- `xz` +- `zstd` +- `lz4` +- `bz2` +- `snappy` + +圧縮された `POST` リクエストを送信するには、リクエストヘッダー `Content-Encoding: compression_method` を追加します。 +ClickHouse に応答を圧縮させるためには、[enable_http_compression](../operations/settings/settings.md#enable_http_compression) 設定で圧縮を有効化し、`Accept-Encoding: compression_method` ヘッダーをリクエストに追加してください。全ての圧縮方法に対するデータ圧縮レベルは [http_zlib_compression_level](../operations/settings/settings.md#http_zlib_compression_level) 設定で設定可能です。 + +:::info +一部の HTTP クライアントはデフォルトでサーバーからのデータを解凍する場合があり(`gzip` や `deflate`)、正しく圧縮設定を使用した場合でも解凍済みのデータを受け取ることがあります。 +::: + +**例** + +``` bash +# 圧縮データをサーバーに送信する +$ echo "SELECT 1" | gzip -c | \ + curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/' +``` + +``` bash +# サーバーから圧縮されたデータアーカイブを受け取る +$ curl -vsS "http://localhost:8123/?enable_http_compression=1" \ + -H 'Accept-Encoding: gzip' --output result.gz -d 'SELECT number FROM system.numbers LIMIT 3' +$ zcat result.gz +0 +1 +2 +``` + +```bash +# サーバーから圧縮されたデータを受け取り、gunzipを使用して解凍されたデータを受け取る +$ curl -sS "http://localhost:8123/?enable_http_compression=1" \ + -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 3' | gunzip - +0 +1 +2 +``` + +## デフォルトデータベース {#default-database} + +`database` URL パラメータまたは `X-ClickHouse-Database` ヘッダーを使用してデフォルトデータベースを指定できます。 + +``` bash +$ echo 'SELECT number FROM numbers LIMIT 10' | curl 'http://localhost:8123/?database=system' --data-binary @- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` + +デフォルトでは、サーバー設定に登録されているデータベースがデフォルトデータベースとして使用されます。デフォルトでは「default」という名前のデータベースです。あるいは、常にテーブル名の前にドットを付けてデータベースを指定することもできます。 + +ユーザー名とパスワードは次の方法のいずれかで指定できます: + +1. HTTP 基本認証を使用します。例: + + + +``` bash +$ echo 'SELECT 1' | curl 'http://user:password@localhost:8123/' -d @- +``` + +2. `user` および `password` URL パラメータで指定する(*この方法は、パラメータがウェブプロキシによってログ記録され、ブラウザでキャッシュされる可能性があるため推奨されません*)。例: + + + +``` bash +$ echo 'SELECT 1' | curl 'http://localhost:8123/?user=user&password=password' -d @- +``` + +3. `X-ClickHouse-User` および `X-ClickHouse-Key` ヘッダーを使用します。例: + + + +``` bash +$ echo 'SELECT 1' | curl -H 'X-ClickHouse-User: user' -H 'X-ClickHouse-Key: password' 'http://localhost:8123/' -d @- +``` + +ユーザー名が指定されていない場合は、`default` 名が使用されます。パスワードが指定されていない場合は、空のパスワードが使用されます。 +また、問い合わせの処理に関する任意の設定や設定プロファイル全体を URL パラメータで指定することもできます。例: http://localhost:8123/?profile=web&max_rows_to_read=1000000000&query=SELECT+1 + +詳細については、[設定](../operations/settings/index.md)セクションを参照してください。 + +``` bash +$ echo 'SELECT number FROM system.numbers LIMIT 10' | curl 'http://localhost:8123/?' --data-binary @- +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` + +その他のパラメータについては、「SET」セクションを参照してください。 + +同様に、HTTP プロトコルで ClickHouse セッションを使用することができます。これを行うには、`session_id` GET パラメータをリクエストに追加する必要があります。任意の文字列をセッション ID として使用できます。デフォルトでは、セッションは非アクティブ状態が 60 秒続くと終了します。このタイムアウトを変更するには、サーバー構成で `default_session_timeout` 設定を変更するか、リクエストに `session_timeout` GET パラメータを追加します。セッションステータスを確認するには、`session_check=1` パラメータを使用します。単一セッション内では、一度に一つのクエリしか実行できません。 + +クエリの進行状況についての情報を `X-ClickHouse-Progress` レスポンスヘッダーで受信できます。これを行うには、[send_progress_in_http_headers](../operations/settings/settings.md#send_progress_in_http_headers) を有効にします。ヘッダーシーケンスの例: + +``` text +X-ClickHouse-Progress: {"read_rows":"2752512","read_bytes":"240570816","total_rows_to_read":"8880128","elapsed_ns":"662334"} +X-ClickHouse-Progress: {"read_rows":"5439488","read_bytes":"482285394","total_rows_to_read":"8880128","elapsed_ns":"992334"} +X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_rows_to_read":"8880128","elapsed_ns":"1232334"} +``` + +可能なヘッダーフィールド: + +- `read_rows` — 読み取った行数。 +- `read_bytes` — バイト単位で読み取ったデータのボリューム。 +- `total_rows_to_read` — 読み取るべき総行数。 +- `written_rows` — 書き込まれた行数。 +- `written_bytes` — バイト単位で書き込まれたデータのボリューム。 + +実行中のリクエストは、HTTP 接続が失われても自動的には停止しません。解析とデータフォーマットはサーバー側で実行され、ネットワークの使用が非効率的になる場合があります。 +オプションの `query_id` パラメータはクエリ ID(任意の文字列)として渡すことができます。詳細については、「設定、replace_running_query」セクションを参照してください。 + +オプションの `quota_key` パラメータは、クォータキーとして(任意の文字列)渡すことができます。詳細については、「クォータ」セクションを参照してください。 + +HTTP インターフェースは、クエリのために外部データ(外部一時テーブル)を渡すことを可能にします。詳細については、「クエリ処理のための外部データ」セクションを参照してください。 + +## レスポンスバッファリング {#response-buffering} + +サーバー側でレスポンスバッファリングを有効にできます。この目的のために `buffer_size` と `wait_end_of_query` URL パラメータが提供されています。 +または、設定 `http_response_buffer_size` と `http_wait_end_of_query` を使用できます。 + +`buffer_size` は、サーバーメモリ内でバッファリングする結果のバイト数を決定します。結果本体がこのしきい値を超える場合、バッファは HTTP チャネルに書き込まれ、残りのデータは直接 HTTP チャネルに送信されます。 + +レスポンス全体がバッファリングされるようにするには、`wait_end_of_query=1` を設定します。この場合、メモリに保存されないデータは一時的なサーバーファイルにバッファリングされます。 + +例: + +``` bash +$ curl -sS 'http://localhost:8123/?max_result_bytes=4000000&buffer_size=3000000&wait_end_of_query=1' -d 'SELECT toUInt8(number) FROM system.numbers LIMIT 9000000 FORMAT RowBinary' +``` + +バッファリングを使用して、レスポンスコードと HTTP ヘッダーがクライアントに送信された後にクエリ処理エラーが発生した場合の状況を回避します。この状況では、エラーメッセージがレスポンス本体の末尾に書き込まれ、クライアント側では解析段階でのみエラーを検出できます。 + +## クエリパラメータによるロール設定 {#setting-role-with-query-parameters} + +これは ClickHouse 24.4 に追加された新機能です。 + +特定のシナリオでは、文自体を実行する前に付与されたロールを設定する必要がある場合があります。 +しかし、`SET ROLE` と文を一緒に送信することは不可能です。マルチステートメントは許可されていません: + +``` +curl -sS "http://localhost:8123" --data-binary "SET ROLE my_role;SELECT * FROM my_table;" +``` + +この結果、次のエラーが発生します: + +``` +Code: 62. DB::Exception: Syntax error (Multi-statements are not allowed) +``` + +この制限を克服するために、`role` クエリパラメータを使用できます: + +``` +curl -sS "http://localhost:8123?role=my_role" --data-binary "SELECT * FROM my_table;" +``` + +これにより、文の前に `SET ROLE my_role` を実行するのと同等になります。 + +さらに、複数の `role` クエリパラメータを指定することも可能です: + +``` +curl -sS "http://localhost:8123?role=my_role&role=my_other_role" --data-binary "SELECT * FROM my_table;" +``` + +この場合、`?role=my_role&role=my_other_role` は文の前に `SET ROLE my_role, my_other_role` を実行するのと同様に機能します。 + +## HTTP レスポンスコードの注意事項 {#http_response_codes_caveats} + +HTTP プロトコルの制限のため、HTTP 200 のレスポンスコードはクエリが成功したことを保証しません。 + +例を示します: + +``` +curl -v -Ss "http://localhost:8123/?max_block_size=1&query=select+sleepEachRow(0.001),throwIf(number=2)from+numbers(5)" +* Trying 127.0.0.1:8123... +... +< HTTP/1.1 200 OK +... +Code: 395. DB::Exception: Value passed to 'throwIf' function is non-zero: while executing 'FUNCTION throwIf(equals(number, 2) :: 1) -> throwIf(equals(number, 2)) +``` + +この動作の原因は HTTP プロトコルの特性によるものです。HTTP ヘッダーが最初に HTTP コード 200 で送信され、続いて HTTP 本体が送信され、エラーがプレーンテキストとして本体に注入されます。 +この動作は、使用される形式に関係なく、`Native`、`TSV`、`JSON` のいずれであっても、エラーメッセージはレスポンスストリームの途中に常に挿入されます。 +この問題を軽減するには、[レスポンスバッファリング](#response-buffering)を有効にしてください。この場合、HTTP ヘッダーの送信がクエリ全体が解決されるまで遅延します。 +ただし、これでは問題が完全に解決されるわけではありません。結果が `http_response_buffer_size` に収まらなければならず、`send_progress_in_http_headers` のような他の設定がヘッダーの遅延に干渉する可能性があります。 +すべてのエラーをキャッチする唯一の方法は、必要な形式を使用して解析する前に HTTP 本体を分析することです。 + +## パラメータを持つクエリ {#cli-queries-with-parameters} + +パラメータを持つクエリを作成し、それらに対応する HTTP リクエストパラメータから値を渡すことができます。詳しくは [CLI 用のパラメータ付きクエリ](../interfaces/cli.md#cli-queries-with-parameters) を参照してください。 + +### 例 {#example} + +``` bash +$ curl -sS "
    ?param_id=2¶m_phrase=test" -d "SELECT * FROM table WHERE int_column = {id:UInt8} and string_column = {phrase:String}" +``` + +### URL パラメータ内のタブ + +クエリパラメータは「エスケープ」形式から解析されます。これには、`\N` としてヌルを明確に解析する可能性があるという利点があります。つまり、タブ文字は `\t`(または `\` とタブ)としてエンコードする必要があります。たとえば、次の例では `abc` と `123` の間に実際のタブが含まれており、入力文字列が2つの値に分割されます: + +```bash +curl -sS "http://localhost:8123" -d "SELECT splitByChar('\t', 'abc 123')" +``` + +```response +['abc','123'] +``` + +しかし、URLパラメータで実際のタブを `%09` を使用してエンコードしようとすると、正しく解析されません: + +```bash +curl -sS "http://localhost:8123?param_arg1=abc%09123" -d "SELECT splitByChar('\t', {arg1:String})" +Code: 457. DB::Exception: Value abc 123 cannot be parsed as String for query parameter 'arg1' because it isn't parsed completely: only 3 of 7 bytes was parsed: abc. (BAD_QUERY_PARAMETER) (version 23.4.1.869 (official build)) +``` + +URLパラメータを使用する場合、`\t` を `%5C%09` としてエンコードする必要があります。例えば: + +```bash +curl -sS "http://localhost:8123?param_arg1=abc%5C%09123" -d "SELECT splitByChar('\t', {arg1:String})" +``` + +```response +['abc','123'] +``` + +## 事前定義された HTTP インターフェース {#predefined_http_interface} + +ClickHouse は HTTP インターフェースを介して特定のクエリをサポートしています。例えば、次のようにしてテーブルにデータを書き込むことができます: + +``` bash +$ echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @- +``` + +ClickHouse は、[Prometheus エクスポーター](https://github.com/ClickHouse/clickhouse_exporter)のようなサードパーティツールと簡単に統合できる事前定義された HTTP インターフェースもサポートしています。 + +例: + +- まず、サーバー設定ファイルに次のセクションを追加します: + + + +``` xml + + + /predefined_query + POST,GET + + predefined_query_handler + SELECT * FROM system.metrics LIMIT 5 FORMAT Template SETTINGS format_template_resultset = 'prometheus_template_output_format_resultset', format_template_row = 'prometheus_template_output_format_row', format_template_rows_between_delimiter = '\n' + + + ... + ... + +``` + +- Prometheus 形式でデータを直接リクエストすることができます: + + + +``` bash +$ curl -v 'http://localhost:8123/predefined_query' +* Trying ::1... +* Connected to localhost (::1) port 8123 (#0) +> GET /predefined_query HTTP/1.1 +> Host: localhost:8123 +> User-Agent: curl/7.47.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Date: Tue, 28 Apr 2020 08:52:56 GMT +< Connection: Keep-Alive +< Content-Type: text/plain; charset=UTF-8 +< X-ClickHouse-Server-Display-Name: i-mloy5trc +< Transfer-Encoding: chunked +< X-ClickHouse-Query-Id: 96fe0052-01e6-43ce-b12a-6b7370de6e8a +< X-ClickHouse-Format: Template +< X-ClickHouse-Timezone: Asia/Shanghai +< Keep-Alive: timeout=10 +< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} +< +# HELP "Query" "Number of executing queries" +# TYPE "Query" counter +"Query" 1 + +# HELP "Merge" "Number of executing background merges" +# TYPE "Merge" counter +"Merge" 0 + +# HELP "PartMutation" "Number of mutations (ALTER DELETE/UPDATE)" +# TYPE "PartMutation" counter +"PartMutation" 0 + +# HELP "ReplicatedFetch" "Number of data parts being fetched from replica" +# TYPE "ReplicatedFetch" counter +"ReplicatedFetch" 0 + +# HELP "ReplicatedSend" "Number of data parts being sent to replicas" +# TYPE "ReplicatedSend" counter +"ReplicatedSend" 0 + +* Connection #0 to host localhost left intact + +* Connection #0 to host localhost left intact +``` + +例からもわかるように、`http_handlers` が config.xml ファイルで設定されている場合、`http_handlers` には多くの `rules` を含めることができます。ClickHouse は受信したHTTPリクエストを事前定義された型と一致させ、一致すれば最初の処理が実行されます。そして、ClickHouse は一致が成功した場合に対応する事前定義されたクエリを実行します。 + +現在、`rule` は `method`、`headers`、`url`、`handler` を設定できます: +- `method` は HTTP リクエストのメソッド部分をマッチングする役割を持ちます。`method` は HTTP プロトコルでの[メソッド](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) の定義を完全に遵守しています。この設定はオプションです。設定ファイルに定義されていない場合、HTTP リクエストのメソッド部分とは一致しません。 + +- `url` は HTTP リクエストの URL 部分をマッチングする役割を持ち、[RE2](https://github.com/google/re2) の正規表現と互換性があります。この設定はオプションです。設定ファイルに定義されていない場合、HTTP リクエストの URL 部分とは一致しません。 + +- `headers` は HTTP リクエストのヘッダー部分をマッチングする役割を持ち、RE2 の正規表現と互換性があります。この設定はオプションです。設定ファイルに定義されていない場合、HTTP リクエストのヘッダー部分とは一致しません。 + +- `handler` はメインの処理部分を含みます。現在、`handler` は `type`、`status`、`content_type`、`http_response_headers`、`response_content`、`query`、`query_param_name` を設定できます。 + `type` は現在、次の3種類をサポートしています: [predefined_query_handler](#predefined_query_handler)、[dynamic_query_handler](#dynamic_query_handler)、[static](#static)。 + + - `query` — `predefined_query_handler` タイプで使用され、ハンドラが呼び出されたときにクエリを実行します。 + + - `query_param_name` — `dynamic_query_handler` タイプで使用され、HTTP リクエストパラメータ内の `query_param_name` 値に対応する値を抽出して実行します。 + + - `status` — `static` タイプで使用され、レスポンスステータスコードを返します。 + + - `content_type` — どのタイプでも使用可能です。レスポンスの[コンテンツタイプ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)を返します。 + + - `http_response_headers` — どのタイプでも使用可能です。レスポンスヘッダーのマップです。コンテンツタイプを設定するにも使用できます。 + + - `response_content` — `static` タイプで使用され、クライアントに送信されるレスポンスコンテンツです。接頭辞 'file://' または 'config://' を使用する場合、クライアントに送信するコンテンツをファイルまたは設定から探します。 + +次に、異なる `type` に対する設定方法を説明します。 + +### predefined_query_handler {#predefined_query_handler} + +`predefined_query_handler` は `Settings` および `query_params` 値を設定することをサポートしています。`predefined_query_handler` タイプで `query` を設定できます。 + +`query` の値は、`predefined_query_handler` の事前定義されたクエリであり、HTTP リクエストがマッチしたときに ClickHouse によって実行され、クエリの結果が返されます。これは必須の設定です。 + +次の例では、[max_threads](../operations/settings/settings.md#max_threads) および `max_final_threads` 設定の値を定義し、それらの設定が正常に設定されたかどうかをクエリで確認します。 + +:::注意 +デフォルトの `handlers` である `query`、`play`、`ping` を保持するには、`` ルールを追加してください。 +::: + +例: + +``` xml + + + [^/]+)]]> + GET + + TEST_HEADER_VALUE + [^/]+)]]> + + + predefined_query_handler + + SELECT name, value FROM system.settings + WHERE name IN ({name_1:String}, {name_2:String}) + + + + + +``` + +``` bash +$ curl -H 'XXX:TEST_HEADER_VALUE' -H 'PARAMS_XXX:max_final_threads' 'http://localhost:8123/query_param_with_url/max_threads?max_threads=1&max_final_threads=2' +max_final_threads 2 +max_threads 1 +``` + +:::注意 +1 つの `predefined_query_handler` には 1 つの `query` のみがサポートされています。 +::: + +### dynamic_query_handler {#dynamic_query_handler} + +`dynamic_query_handler` では、クエリは HTTP リクエストのパラメータの形で書かれています。`predefined_query_handler` では、クエリは設定ファイルに書かれています。`dynamic_query_handler` で `query_param_name` を設定できます。 + +ClickHouse は HTTP リクエスト URL での `query_param_name` の値に対応する値を抽出して実行します。`query_param_name` のデフォルト値は `/query` です。これはオプションの設定です。設定ファイルに定義がない場合、パラメータは渡されません。 + +この機能を試すために、例では [max_threads](../operations/settings/settings.md#max_threads) および `max_final_threads` の値を定義し、設定が正常に設定されたかどうかをクエリします。 + +例: + +``` xml + + + + TEST_HEADER_VALUE_DYNAMIC + + dynamic_query_handler + query_param + + + + +``` + +``` bash +$ curl -H 'XXX:TEST_HEADER_VALUE_DYNAMIC' 'http://localhost:8123/own?max_threads=1&max_final_threads=2¶m_name_1=max_threads¶m_name_2=max_final_threads&query_param=SELECT%20name,value%20FROM%20system.settings%20where%20name%20=%20%7Bname_1:String%7D%20OR%20name%20=%20%7Bname_2:String%7D' +max_threads 1 +max_final_threads 2 +``` + +### static {#static} + +`static` は [content_type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)、[status](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) および `response_content` を返すことができます。`response_content` は指定されたコンテンツを返します。 + +例: + +メッセージを返す。 + +``` xml + + + GET + xxx + /hi + + static + 402 + text/html; charset=UTF-8 + + en + 43 + + Say Hi! + + + + +``` + +`http_response_headers` は `content_type` ではなく、コンテンツタイプを設定するために使用できます。 + +``` xml + + + GET + xxx + /hi + + static + 402 + + text/html; charset=UTF-8 + en + 43 + + Say Hi! + + + + +``` + +``` bash +$ curl -vv -H 'XXX:xxx' 'http://localhost:8123/hi' +* Trying ::1... +* Connected to localhost (::1) port 8123 (#0) +> GET /hi HTTP/1.1 +> Host: localhost:8123 +> User-Agent: curl/7.47.0 +> Accept: */* +> XXX:xxx +> +< HTTP/1.1 402 Payment Required +< Date: Wed, 29 Apr 2020 03:51:26 GMT +< Connection: Keep-Alive +< Content-Type: text/html; charset=UTF-8 +< Transfer-Encoding: chunked +< Keep-Alive: timeout=10 +< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} +< +* Connection #0 to host localhost left intact +Say Hi!% +``` + +設定からクライアントに送信するコンテンツを探します。 + +``` xml +
    ]]>
    + + + + GET + xxx + /get_config_static_handler + + static + config://get_config_static_handler + + + +``` + +``` bash +$ curl -v -H 'XXX:xxx' 'http://localhost:8123/get_config_static_handler' +* Trying ::1... +* Connected to localhost (::1) port 8123 (#0) +> GET /get_config_static_handler HTTP/1.1 +> Host: localhost:8123 +> User-Agent: curl/7.47.0 +> Accept: */* +> XXX:xxx +> +< HTTP/1.1 200 OK +< Date: Wed, 29 Apr 2020 04:01:24 GMT +< Connection: Keep-Alive +< Content-Type: text/plain; charset=UTF-8 +< Transfer-Encoding: chunked +< Keep-Alive: timeout=10 +< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} +< +* Connection #0 to host localhost left intact +
    % +``` + +ファイルからクライアントに送信するコンテンツを探します。 + +``` xml + + + GET + xxx + /get_absolute_path_static_handler + + static + text/html; charset=UTF-8 + + 737060cd8c284d8af7ad3082f209582d + + file:///absolute_path_file.html + + + + GET + xxx + /get_relative_path_static_handler + + static + text/html; charset=UTF-8 + + 737060cd8c284d8af7ad3082f209582d + + file://./relative_path_file.html + + + +``` + +``` bash +$ user_files_path='/var/lib/clickhouse/user_files' +$ sudo echo "Relative Path File" > $user_files_path/relative_path_file.html +$ sudo echo "Absolute Path File" > $user_files_path/absolute_path_file.html +$ curl -vv -H 'XXX:xxx' 'http://localhost:8123/get_absolute_path_static_handler' +* Trying ::1... +* Connected to localhost (::1) port 8123 (#0) +> GET /get_absolute_path_static_handler HTTP/1.1 +> Host: localhost:8123 +> User-Agent: curl/7.47.0 +> Accept: */* +> XXX:xxx +> +< HTTP/1.1 200 OK +< Date: Wed, 29 Apr 2020 04:18:16 GMT +< Connection: Keep-Alive +< Content-Type: text/html; charset=UTF-8 +< Transfer-Encoding: chunked +< Keep-Alive: timeout=10 +< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} +< +Absolute Path File +* Connection #0 to host localhost left intact +$ curl -vv -H 'XXX:xxx' 'http://localhost:8123/get_relative_path_static_handler' +* Trying ::1... +* Connected to localhost (::1) port 8123 (#0) +> GET /get_relative_path_static_handler HTTP/1.1 +> Host: localhost:8123 +> User-Agent: curl/7.47.0 +> Accept: */* +> XXX:xxx +> +< HTTP/1.1 200 OK +< Date: Wed, 29 Apr 2020 04:18:31 GMT +< Connection: Keep-Alive +< Content-Type: text/html; charset=UTF-8 +< Transfer-Encoding: chunked +< Keep-Alive: timeout=10 +< X-ClickHouse-Summary: {"read_rows":"0","read_bytes":"0","written_rows":"0","written_bytes":"0","total_rows_to_read":"0","elapsed_ns":"662334"} +< +Relative Path File +* Connection #0 to host localhost left intact +``` + +## HTTP ストリーミング中に発生した例外での有効な JSON/XML 応答 {valid-output-on-exception-http-streaming} + +HTTP 経由でのクエリ実行中、データの一部が既に送信されたときに例外が発生する可能性があります。通常、特定のデータ形式が使用されてデータを出力し、出力が指定されたデータ形式において無効になる場合でも、例外はプレーンテキストでクライアントに送信されます。 +これを防ぐために、指定されたフォーマットで例外を記述する `http_write_exception_in_output_format` 設定(デフォルトで有効)が使用できます(現在、XML および JSON* 形式でサポートされています)。 + +例: + +```bash +$ curl 'http://localhost:8123/?query=SELECT+number,+throwIf(number>3)+from+system.numbers+format+JSON+settings+max_block_size=1&http_write_exception_in_output_format=1' +{ + "meta": + [ + { + "name": "number", + "type": "UInt64" + }, + { + "name": "throwIf(greater(number, 2))", + "type": "UInt8" + } + ], + + "data": + [ + { + "number": "0", + "throwIf(greater(number, 2))": 0 + }, + { + "number": "1", + "throwIf(greater(number, 2))": 0 + }, + { + "number": "2", + "throwIf(greater(number, 2))": 0 + } + ], + + "rows": 3, + + "exception": "Code: 395. DB::Exception: Value passed to 'throwIf' function is non-zero: while executing 'FUNCTION throwIf(greater(number, 2) :: 2) -> throwIf(greater(number, 2)) UInt8 : 1'. (FUNCTION_THROW_IF_VALUE_IS_NON_ZERO) (version 23.8.1.1)" +} +``` + +```bash +$ curl 'http://localhost:8123/?query=SELECT+number,+throwIf(number>2)+from+system.numbers+format+XML+settings+max_block_size=1&http_write_exception_in_output_format=1' + + + + + + number + UInt64 + + + throwIf(greater(number, 2)) + UInt8 + + + + + + 0 + 0 + + + 1 + 0 + + + 2 + 0 + + + 3 + Code: 395. DB::Exception: Value passed to 'throwIf' function is non-zero: while executing 'FUNCTION throwIf(greater(number, 2) :: 2) -> throwIf(greater(number, 2)) UInt8 : 1'. (FUNCTION_THROW_IF_VALUE_IS_NON_ZERO) (version 23.8.1.1) + +``` + diff --git a/docs/ja/interfaces/images/mysql1.png b/docs/ja/interfaces/images/mysql1.png new file mode 100644 index 00000000000..f5ac85b6e2c Binary files /dev/null and b/docs/ja/interfaces/images/mysql1.png differ diff --git a/docs/ja/interfaces/images/mysql2.png b/docs/ja/interfaces/images/mysql2.png new file mode 100644 index 00000000000..7b999e41665 Binary files /dev/null and b/docs/ja/interfaces/images/mysql2.png differ diff --git a/docs/ja/interfaces/images/mysql3.png b/docs/ja/interfaces/images/mysql3.png new file mode 100644 index 00000000000..be6cb963003 Binary files /dev/null and b/docs/ja/interfaces/images/mysql3.png differ diff --git a/docs/ja/interfaces/images/mysql4.png b/docs/ja/interfaces/images/mysql4.png new file mode 100644 index 00000000000..3b5ce1e844d Binary files /dev/null and b/docs/ja/interfaces/images/mysql4.png differ diff --git a/docs/ja/interfaces/images/mysql5.png b/docs/ja/interfaces/images/mysql5.png new file mode 100644 index 00000000000..fc026a8b753 Binary files /dev/null and b/docs/ja/interfaces/images/mysql5.png differ diff --git a/docs/ja/interfaces/jdbc.md b/docs/ja/interfaces/jdbc.md new file mode 100644 index 00000000000..a748a613a19 --- /dev/null +++ b/docs/ja/interfaces/jdbc.md @@ -0,0 +1,13 @@ +--- +slug: /ja/interfaces/jdbc +sidebar_position: 22 +sidebar_label: JDBC ドライバー +--- + +# JDBC ドライバー + +JavaアプリケーションからClickHouseにアクセスするために、[公式JDBCドライバー](https://github.com/ClickHouse/clickhouse-jdbc)(およびJavaクライアント)を使用してください。 + +- サードパーティ製ドライバー: + - [ClickHouse-Native-JDBC](https://github.com/housepower/ClickHouse-Native-JDBC) + - [clickhouse4j](https://github.com/blynkkk/clickhouse4j) diff --git a/docs/ja/interfaces/mysql.md b/docs/ja/interfaces/mysql.md new file mode 100644 index 00000000000..d82a70e8259 --- /dev/null +++ b/docs/ja/interfaces/mysql.md @@ -0,0 +1,162 @@ +--- +slug: /ja/interfaces/mysql +sidebar_position: 20 +sidebar_label: MySQL Interface +--- + +# MySQL インターフェース + +ClickHouseは、MySQLのワイヤープロトコルをサポートしています。これにより、ネイティブなClickHouseコネクタを持たない一部のクライアントがMySQLプロトコルを利用でき、以下のBIツールで検証済みです: + +- [Looker Studio](../integrations/data-visualization/looker-studio-and-clickhouse.md) +- [Tableau Online](../integrations/tableau-online) +- [QuickSight](../integrations/quicksight) + +他の未検証のクライアントまたは統合を試みる場合、以下の制限があることをご了承ください: + +- SSLの実装が完全に互換性がない可能性があり、[TLS SNI](https://www.cloudflare.com/learning/ssl/what-is-sni/)に関連した問題が発生する可能性があります。 +- 特定のツールが必要とする方言の機能(例えば、MySQL特有の関数や設定)が未実装の場合があります。 + +ネイティブドライバが利用可能な場合(例: [DBeaver](../integrations/dbeaver))、MySQLインターフェースの代わりにそちらを使用することを推奨します。また、多くのMySQL言語クライアントが問題なく動作するはずですが、MySQLインターフェースが既存のMySQLクエリを持つコードベースのドロップイン代替であることは保証されません。 + +特定のツールでネイティブClickHouseドライバが利用できず、MySQLインターフェースを通じて使用したいが、いくつかの非互換性が見つかった場合は、ClickHouseリポジトリで[問題を作成](https://github.com/ClickHouse/ClickHouse/issues)してください。 + +::::note +上記のBIツールのSQL方言をより良くサポートするために、ClickHouseのMySQLインターフェースは、設定[prefer_column_name_to_alias = 1](../operations/settings/settings.md#prefer-column-name-to-alias)でクエリを実行します。これはオフにすることができず、稀なケースでClickHouseの通常のクエリインターフェースとMySQLクエリインターフェースの間で異なる動作を引き起こす可能性があります。 +:::: + +## ClickHouse CloudでのMySQLインターフェースの有効化 + +1. ClickHouse Cloudサービスを作成した後、クレデンシャル画面でMySQLタブを選択します。 + +![Credentials screen - Prompt](./images/mysql1.png) + +2. 特定のサービス用にMySQLインターフェースを有効化するようにスイッチを切り替えます。これにより、このサービスに対してポート`3306`が公開され、独自のMySQLユーザー名を含むMySQL接続画面が表示されます。パスワードはサービスのデフォルトユーザーパスワードと同じになります。 + +![Credentials screen - Enabled MySQL](./images/mysql2.png) + +既存のサービス用にMySQLインターフェースを有効化する場合: + +1. サービスを`Running`状態にして、MySQLインターフェースを有効化したいサービスの"View connection string"ボタンをクリックします。 + +![Connection screen - Prompt MySQL](./images/mysql3.png) + +2. 特定のサービス用にMySQLインターフェースを有効化するようにスイッチを切り替えます。これにより、デフォルトのパスワードを入力するように促されます。 + +![Connection screen - Prompt MySQL](./images/mysql4.png) + +3. パスワードを入力すると、このサービスのMySQL接続文字列が表示されます。 +![Connection screen - MySQL Enabled](./images/mysql5.png) + +## ClickHouse Cloudで複数のMySQLユーザーを作成する + +デフォルトで、`mysql4` ユーザーが組み込まれており、このユーザーは`default`ユーザーと同じパスワードを使用します。`` の部分はClickHouse Cloudのホスト名の最初のセグメントです。この形式は、安全な接続を実装しているツールで[SNI情報がTLSハンドシェイクで提供されない場合](https://www.cloudflare.com/learning/ssl/what-is-sni)に必要となり、ユーザー名に追加のヒントがないと内部ルーティングを行うことができません(MySQLコンソールクライアントがそのようなツールのひとつです)。 + +このため、MySQLインターフェース用に新しいユーザーを作成する際には、`mysql4_` 形式に従うことを_強く推奨_します。ここで``はCloudサービスを識別するためのヒントで、``は任意の接尾語です。 + +:::tip +ClickHouse Cloudのホスト名が`foobar.us-east1.aws.clickhouse.cloud`の場合、``部分は`foobar`に相当し、カスタムMySQLユーザー名は`mysql4foobar_team1`のようになります。 +::: + +MySQLインターフェースと共に使用するために追加のユーザーを作成できます。例えば、追加の設定を適用する必要がある場合などです。 + +1. オプション - カスタムユーザーに適用する[設定プロファイルを作成](https://clickhouse.com/docs/ja/sql-reference/statements/create/settings-profile)します。例えば、`my_custom_profile` を追加の設定と共に作成し、後で作成するユーザーに接続した際にデフォルトで適用されます: + + ```sql + CREATE SETTINGS PROFILE my_custom_profile SETTINGS prefer_column_name_to_alias=1; + ``` + + `prefer_column_name_to_alias`は例として使用されています。ここに他の設定を使用できます。 +2. 以下の形式を使用して[ユーザーを作成](https://clickhouse.com/docs/ja/sql-reference/statements/create/user)します:`mysql4_`([上記参照](#creating-multiple-mysql-users-in-clickhouse-cloud))。パスワードはダブルSHA1形式である必要があります。例えば: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$'; + ``` + + また、このユーザーのためにカスタムプロファイルを使用したい場合は: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$' SETTINGS PROFILE 'my_custom_profile'; + ``` + + ここで`my_custom_profile`は先に作成したプロファイルの名前です。 +3. 新しいユーザーに必要な権限を[付与](https://clickhouse.com/docs/ja/sql-reference/statements/grant)して、要求されたテーブルやデータベースと対話できるようにします。例えば、`system.query_log`へのアクセス権を付与したい場合: + + ```sql + GRANT SELECT ON system.query_log TO mysql4foobar_team1; + ``` + +4. 作成したユーザーを使用して、MySQLインターフェースと共にClickHouse Cloudサービスに接続します。 + +### ClickHouse Cloudでの複数のMySQLユーザーのトラブルシューティング + +新しいMySQLユーザーを作成し、MySQL CLIクライアント経由で接続中に以下のエラーが表示された場合: + +``` +ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 54 +``` + +このケースでは、ユーザー名が`mysql4_`形式に従っていることを確認してください([上記参照](#creating-multiple-mysql-users-in-clickhouse-cloud))。 + +## セルフマネージドのClickHouseでMySQLインターフェースを有効化 + +サーバーの設定ファイルに[mysql_port](../operations/server-configuration-parameters/settings.md#mysql_port)設定を追加します。たとえば、`config.d/`[フォルダ](../operations/configuration-files)内に新しいXMLファイルにポートを定義できます: + +``` xml + + 9004 + +``` + +ClickHouseサーバーを起動し、次のようなMySQL互換プロトコルをリッスンしていることを示すログメッセージを探します: + +``` +{} Application: Listening for MySQL compatibility protocol: 127.0.0.1:9004 +``` + +## MySQLをClickHouseに接続する + +以下のコマンドは、MySQLクライアント`mysql`をClickHouseに接続する方法を示しています: + +```bash +mysql --protocol tcp -h [hostname] -u [username] -P [port_number] [database_name] +``` + +例: + +``` bash +$ mysql --protocol tcp -h 127.0.0.1 -u default -P 9004 default +``` + +接続が成功した場合の出力: + +``` text +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 20.2.1.1-ClickHouse + +Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> +``` + +すべてのMySQLクライアントとの互換性のために、設定ファイルでユーザーパスワードを[ダブルSHA1](../operations/settings/settings-users.md#password_double_sha1_hex)で指定することをお勧めします。 +ユーザーパスワードが[SHA256](../operations/settings/settings-users.md#password_sha256_hex)で指定されている場合、一部のクライアントは認証できません(mysqljsおよびコマンドラインツールの古いバージョンのMySQLおよびMariaDB)。 + +制限事項: + +- プリペアドクエリはサポートされていません + +- 一部のデータタイプは文字列として送信されます + +長いクエリをキャンセルするには、`KILL QUERY connection_id`文を使用します(これは処理中に`KILL QUERY WHERE query_id = connection_id`に置き換えられます)。例: + +``` bash +$ mysql --protocol tcp -h mysql_server -P 9004 default -u default --password=123 -e "KILL QUERY 123456;" +``` diff --git a/docs/ja/interfaces/odbc.md b/docs/ja/interfaces/odbc.md new file mode 100644 index 00000000000..3a29bb3f073 --- /dev/null +++ b/docs/ja/interfaces/odbc.md @@ -0,0 +1,9 @@ +--- +slug: /ja/interfaces/odbc +sidebar_position: 23 +sidebar_label: ODBC ドライバー +--- + +# ODBC ドライバー + +ClickHouseをデータソースとして利用するには、[公式のODBCドライバー](https://github.com/ClickHouse/clickhouse-odbc)を使用します。 diff --git a/docs/ja/interfaces/overview.md b/docs/ja/interfaces/overview.md new file mode 100644 index 00000000000..588ea6fce7a --- /dev/null +++ b/docs/ja/interfaces/overview.md @@ -0,0 +1,34 @@ +--- +slug: /ja/interfaces/overview +sidebar_label: Overview +sidebar_position: 1 +keywords: [clickhouse, network, interfaces, http, tcp, grpc, command-line, client, jdbc, odbc, driver] +description: ClickHouse は 3つのネットワークインターフェースを提供します +--- + +# ドライバーとインターフェース + +ClickHouse は3つのネットワークインターフェースを提供します(追加のセキュリティのためにTLSでラッピングすることができます): + +- [HTTP](http.md)、これは文書化されており直接使用するのが簡単です。 +- オーバーヘッドが少ない[ネイティブTCP](../interfaces/tcp.md)。 +- [gRPC](grpc.md)。 + +ほとんどのケースでは、これらに直接対話するのではなく、適切なツールやライブラリを使用することが推奨されます。ClickHouse が公式にサポートしているものは以下の通りです: + +- [コマンドラインクライアント](../interfaces/cli.md) +- [JDBCドライバー](../interfaces/jdbc.md) +- [ODBCドライバー](../interfaces/odbc.md) +- [C++クライアントライブラリ](../interfaces/cpp.md) + +ClickHouseサーバーはパワーユーザー向けの埋め込みビジュアルインターフェースを提供しています: + +- Play UI: ブラウザで`/play`を開く; +- 高度なダッシュボード: ブラウザで`/dashboard`を開く; +- ClickHouseエンジニア向けのバイナリシンボルビューアー: ブラウザで`/binary`を開く; + +ClickHouseと連携するためのサードパーティ製ライブラリも多数あります: + +- [クライアントライブラリ](../interfaces/third-party/client-libraries.md) +- [統合](../interfaces/third-party/integrations.md) +- [ビジュアルインターフェース](../interfaces/third-party/gui.md) diff --git a/docs/ja/interfaces/postgresql.md b/docs/ja/interfaces/postgresql.md new file mode 100644 index 00000000000..9f0e2326878 --- /dev/null +++ b/docs/ja/interfaces/postgresql.md @@ -0,0 +1,71 @@ +--- +slug: /ja/interfaces/postgresql +sidebar_position: 20 +sidebar_label: PostgreSQL インターフェース +--- + +# PostgreSQL インターフェース + +ClickHouse は PostgreSQL のワイヤープロトコルをサポートしており、Postgres クライアントを使用して ClickHouse に接続することが可能です。ある意味、ClickHouse は PostgreSQL インスタンスのように振る舞うことができ、Amazon Redshift など、ClickHouse に直接サポートされていない PostgreSQL クライアントアプリケーションを ClickHouse に接続することができます。 + +PostgreSQL ワイヤープロトコルを有効にするには、サーバーの設定ファイルに [postgresql_port](../operations/server-configuration-parameters/settings.md#postgresql_port) 設定を追加します。例えば、`config.d` フォルダ内に新しい XML ファイルを作成し、ポートを定義します: + +```xml + + 9005 + +``` + +ClickHouse サーバーを起動し、**PostgreSQL compatibility protocol をリスニング中** というメッセージを含むログを確認します: + +```response +{} Application: Listening for PostgreSQL compatibility protocol: 127.0.0.1:9005 +``` + +## psql を ClickHouse に接続する + +次のコマンドは、PostgreSQL クライアント `psql` を ClickHouse に接続する方法を示します: + +```bash +psql -p [port] -h [hostname] -U [username] [database_name] +``` + +例: + +```bash +psql -p 9005 -h 127.0.0.1 -U alice default +``` + +:::note +`psql` クライアントはパスワードでのログインを要求するため、パスワードなしでは `default` ユーザーを使用して接続することはできません。`default` ユーザーにパスワードを設定するか、別のユーザーでログインしてください。 +::: + +`psql` クライアントはパスワードを求めます: + +```response +Password for user alice: +psql (14.2, server 22.3.1.1) +WARNING: psql major version 14, server major version 22. + Some psql features might not work. +Type "help" for help. + +default=> +``` + +以上で完了です!PostgreSQL クライアントが ClickHouse に接続され、すべてのコマンドとクエリは ClickHouse 上で実行されます。 + +:::note +現在、PostgreSQL プロトコルはプレーンテキストパスワードのみをサポートしています。 +::: + +## SSL の使用 + +ClickHouse インスタンスで SSL/TLS が設定されている場合、`postgresql_port` は同じ設定を使用します(ポートはセキュアなクライアントと非セキュアなクライアントの両方で共有されます)。 + +各クライアントは、SSL を使用して接続するための独自の方法があります。次のコマンドは、証明書とキーを渡して `psql` を ClickHouse にセキュアに接続する方法を示しています: + +```bash +psql "port=9005 host=127.0.0.1 user=alice dbname=default sslcert=/path/to/certificate.pem sslkey=/path/to/key.pem sslrootcert=/path/to/rootcert.pem sslmode=verify-ca" +``` + +詳細な SSL 設定については、[PostgreSQL ドキュメント](https://jdbc.postgresql.org/documentation/head/ssl-client.html)を参照してください。 diff --git a/docs/ja/interfaces/prometheus.md b/docs/ja/interfaces/prometheus.md new file mode 100644 index 00000000000..48f1129b48f --- /dev/null +++ b/docs/ja/interfaces/prometheus.md @@ -0,0 +1,160 @@ +--- +slug: /ja/interfaces/prometheus +sidebar_position: 19 +sidebar_label: Prometheusプロトコル +--- + +# Prometheusプロトコル + +## メトリクスの公開 {#expose} + +:::note +ClickHouse Cloudを使用している場合、[Prometheus Integration](/ja/integrations/prometheus)を使用してPrometheusにメトリクスを公開できます。 +::: + +ClickHouseはその自身のメトリクスをPrometheusからのスクレイピングのために公開できます: + +```xml + + 9363 + /metrics + true + true + true + true + +``` + +``セクションを使用して、より詳細なハンドラーを作成できます。 +このセクションは[](/ja/interfaces/http)に似ていますが、Prometheusプロトコル用に機能します: + +```xml + + 9363 + + + /metrics + + expose_metrics + true + true + true + true + + + + +``` + +設定: + +| 名前 | デフォルト | 説明 | +|---|---|---| +| `port` | なし | メトリクス公開プロトコルを提供するためのポート。 | +| `endpoint` | `/metrics` | Prometheusサーバーによるメトリクスのスクレイピング用HTTPエンドポイント。`/`で始まります。``セクションと併用してはいけません。 | +| `url` / `headers` / `method` | なし | リクエストに対する適合ハンドラーを見つけるために使用されるフィルター。[](/ja/interfaces/http)セクションの同じ名前のフィールドに似ています。 | +| `metrics` | true | [system.metrics](/ja/operations/system-tables/metrics)テーブルからのメトリクスを公開します。 | +| `asynchronous_metrics` | true | [system.asynchronous_metrics](/ja/operations/system-tables/asynchronous_metrics)テーブルから現在のメトリクス値を公開します。 | +| `events` | true | [system.events](/ja/operations/system-tables/events)テーブルからのメトリクスを公開します。 | +| `errors` | true | 最後のサーバー再起動以降に発生したエラーコードごとのエラー数を公開します。この情報は[system.errors](/ja/operations/system-tables/errors)からも取得できます。 | + +チェック(`127.0.0.1`をClickHouseサーバーのIPアドレスまたはホスト名に置き換えてください): +```bash +curl 127.0.0.1:9363/metrics +``` + +## リモート書き込みプロトコル {#remote-write} + +ClickHouseは[remote-write](https://prometheus.io/docs/specs/remote_write_spec/)プロトコルをサポートしています。 +このプロトコルによって受信したデータは、(あらかじめ作成しておく必要がある)[TimeSeries](/ja/engines/table-engines/special/time_series)テーブルに書き込まれます。 + +```xml + + 9363 + + + /write + + remote_write + db_name + time_series_table
    +
    +
    +
    +
    +``` + +設定: + +| 名前 | デフォルト | 説明 | +|---|---|---| +| `port` | なし | `remote-write`プロトコルを提供するためのポート。 | +| `url` / `headers` / `method` | なし | リクエストに対する適合ハンドラーを見つけるために使用されるフィルター。[](/ja/interfaces/http)セクションの同じ名前のフィールドに似ています。 | +| `table` | なし | `remote-write`プロトコルで受信したデータを書き込む[TimeSeries](/ja/engines/table-engines/special/time_series)テーブルの名前。この名前にはオプションでデータベース名を含めることができます。 | +| `database` | なし | `table`設定で指定されていない場合、`table`設定で指定されたテーブルがあるデータベースの名前。 | + +## リモート読み取りプロトコル {#remote-read} + +ClickHouseは[remote-read](https://prometheus.io/docs/prometheus/latest/querying/remote_read_api/)プロトコルをサポートしています。 +このプロトコルを通じて、[TimeSeries](/ja/engines/table-engines/special/time_series)テーブルからデータを読み取り、送信します。 + +```xml + + 9363 + + + /read + + remote_read + db_name + time_series_table
    +
    +
    +
    +
    +``` + +設定: + +| 名前 | デフォルト | 説明 | +|---|---|---| +| `port` | なし | `remote-read`プロトコルを提供するためのポート。 | +| `url` / `headers` / `method` | なし | リクエストに対する適合ハンドラーを見つけるために使用されるフィルター。[](/ja/interfaces/http)セクションの同じ名前のフィールドに似ています。 | +| `table` | なし | `remote-read`プロトコルで送信するために読み取る[TimeSeries](/ja/engines/table-engines/special/time_series)テーブルの名前。この名前にはオプションでデータベース名を含めることができます。 | +| `database` | なし | `table`設定で指定されていない場合、`table`設定で指定されたテーブルがあるデータベースの名前。 | + +## 複数プロトコル用の設定 {#multiple-protocols} + +複数のプロトコルを一つの場所に一緒に指定することができます: + +```xml + + 9363 + + + /metrics + + expose_metrics + true + true + true + true + + + + /write + + remote_write + db_name.time_series_table
    +
    +
    + + /read + + remote_read + db_name.time_series_table
    +
    +
    +
    +
    +``` diff --git a/docs/ja/interfaces/schema-inference.md b/docs/ja/interfaces/schema-inference.md new file mode 100644 index 00000000000..930e7af0110 --- /dev/null +++ b/docs/ja/interfaces/schema-inference.md @@ -0,0 +1,2094 @@ +--- +slug: /ja/interfaces/schema-inference +sidebar_position: 21 +sidebar_label: スキーマの推測 +title: 入力データからの自動スキーマの推測 +--- + +ClickHouseは、ほぼすべての対応する[入力フォーマット](formats.md)で、入力データの構造を自動的に決定できます。このドキュメントでは、スキーマの推測が使用されるとき、その動作、およびそれを制御することができる設定について説明します。 + +## 使用法 {#usage} + +スキーマの推測は、ClickHouseが特定のデータフォーマットでデータを読み取る必要があり、その構造が不明なときに使用されます。 + +## テーブル関数 [file](../sql-reference/table-functions/file.md), [s3](../sql-reference/table-functions/s3.md), [url](../sql-reference/table-functions/url.md), [hdfs](../sql-reference/table-functions/hdfs.md), [azureBlobStorage](../sql-reference/table-functions/azureBlobStorage.md). + +これらのテーブル関数は、入力データの構造を持つオプションの引数 `structure` を持っています。この引数が指定されていないか `auto` に設定されている場合、データから構造が推測されます。 + +**例:** + +ディレクトリ `user_files` に JSONEachRow 形式のファイル `hobbies.jsonl` があり、内容は次の通りです: +```json +{"id" : 1, "age" : 25, "name" : "Josh", "hobbies" : ["football", "cooking", "music"]} +{"id" : 2, "age" : 19, "name" : "Alan", "hobbies" : ["tennis", "art"]} +{"id" : 3, "age" : 32, "name" : "Lana", "hobbies" : ["fitness", "reading", "shopping"]} +{"id" : 4, "age" : 47, "name" : "Brayan", "hobbies" : ["movies", "skydiving"]} +``` + +ClickHouseは構造を指定せずにこのデータを読み取ることができます: +```sql +SELECT * FROM file('hobbies.jsonl') +``` +```response +┌─id─┬─age─┬─name───┬─hobbies──────────────────────────┐ +│ 1 │ 25 │ Josh │ ['football','cooking','music'] │ +│ 2 │ 19 │ Alan │ ['tennis','art'] │ +│ 3 │ 32 │ Lana │ ['fitness','reading','shopping'] │ +│ 4 │ 47 │ Brayan │ ['movies','skydiving'] │ +└────┴─────┴────────┴──────────────────────────────────┘ +``` + +注: フォーマット `JSONEachRow` は自動的にファイル拡張子 `.jsonl` から決定されました。 + +`DESCRIBE` クエリを使用して自動的に決定された構造を確認できます: +```sql +DESCRIBE file('hobbies.jsonl') +``` +```response +┌─name────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ age │ Nullable(Int64) │ │ │ │ │ │ +│ name │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(Nullable(String)) │ │ │ │ │ │ +└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## テーブルエンジン [File](../engines/table-engines/special/file.md), [S3](../engines/table-engines/integrations/s3.md), [URL](../engines/table-engines/special/url.md), [HDFS](../engines/table-engines/integrations/hdfs.md), [azureBlobStorage](../engines/table-engines/integrations/azureBlobStorage.md) + +`CREATE TABLE` クエリでカラムのリストが指定されていない場合、テーブルの構造はデータから自動的に推測されます。 + +**例:** + +ファイル `hobbies.jsonl` を使用します。このファイルからデータを持つエンジン `File` のテーブルを作成できます: +```sql +CREATE TABLE hobbies ENGINE=File(JSONEachRow, 'hobbies.jsonl') +``` +```response +Ok. +``` +```sql +SELECT * FROM hobbies +``` +```response +┌─id─┬─age─┬─name───┬─hobbies──────────────────────────┐ +│ 1 │ 25 │ Josh │ ['football','cooking','music'] │ +│ 2 │ 19 │ Alan │ ['tennis','art'] │ +│ 3 │ 32 │ Lana │ ['fitness','reading','shopping'] │ +│ 4 │ 47 │ Brayan │ ['movies','skydiving'] │ +└────┴─────┴────────┴──────────────────────────────────┘ +``` +```sql +DESCRIBE TABLE hobbies +``` +```response +┌─name────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ age │ Nullable(Int64) │ │ │ │ │ │ +│ name │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(Nullable(String)) │ │ │ │ │ │ +└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## clickhouse-local + +`clickhouse-local` は入力データの構造を持つオプションのパラメータ `-S/--structure` を持っています。このパラメータが指定されていないか `auto` に設定されている場合、データから構造が推測されます。 + +**例:** + +ファイル `hobbies.jsonl` を使用します。このファイルから `clickhouse-local` を使用してデータをクエリすることができます: +```shell +clickhouse-local --file='hobbies.jsonl' --table='hobbies' --query='DESCRIBE TABLE hobbies' +``` +```response +id Nullable(Int64) +age Nullable(Int64) +name Nullable(String) +hobbies Array(Nullable(String)) +``` +```shell +clickhouse-local --file='hobbies.jsonl' --table='hobbies' --query='SELECT * FROM hobbies' +``` +```response +1 25 Josh ['football','cooking','music'] +2 19 Alan ['tennis','art'] +3 32 Lana ['fitness','reading','shopping'] +4 47 Brayan ['movies','skydiving'] +``` + +## 挿入テーブルからの構造の使用 {#using-structure-from-insertion-table} + +テーブル関数 `file/s3/url/hdfs` を使用してテーブルにデータを挿入するとき、データから抽出する代わりに挿入テーブルの構造を使用するオプションがあります。スキーマの推測には時間がかかることがあるため、挿入のパフォーマンスが向上します。また、テーブルが最適化されたスキーマを持っている場合には、型の変換が行われないので役立ちます。 + +この動作を制御する特別な設定 [use_structure_from_insertion_table_in_table_functions](/docs/ja/operations/settings/settings.md/#use_structure_from_insertion_table_in_table_functions) があります。これは3つの値を持ちます: +- 0 - テーブル関数はデータから構造を抽出します。 +- 1 - テーブル関数は挿入テーブルの構造を使用します。 +- 2 - ClickHouseは挿入テーブルの構造を使用できるかスキーマの推測を使用するか自動的に判断します。デフォルト値。 + +**例 1:** + +次の構造でテーブル `hobbies1` を作成しましょう: +```sql +CREATE TABLE hobbies1 +( + `id` UInt64, + `age` LowCardinality(UInt8), + `name` String, + `hobbies` Array(String) +) +ENGINE = MergeTree +ORDER BY id; +``` + +ファイル `hobbies.jsonl` からデータを挿入します: + +```sql +INSERT INTO hobbies1 SELECT * FROM file(hobbies.jsonl) +``` + +この場合、ファイルからのすべてのカラムが変更なしでテーブルに挿入されるため、ClickHouseはスキーマの推測を使用せず、挿入テーブルの構造を使用します。 + +**例 2:** + +次の構造でテーブル `hobbies2` を作成しましょう: +```sql +CREATE TABLE hobbies2 +( + `id` UInt64, + `age` LowCardinality(UInt8), + `hobbies` Array(String) +) + ENGINE = MergeTree +ORDER BY id; +``` + +ファイル `hobbies.jsonl` からデータを挿入します: + +```sql +INSERT INTO hobbies2 SELECT id, age, hobbies FROM file(hobbies.jsonl) +``` + +この場合、`SELECT` クエリで使用されるすべてのカラムがテーブルに存在するため、ClickHouseは挿入テーブルの構造を使用します。ただし、これは JSONEachRow、TSKV、Parquet などの一部のカラムの読み取りをサポートする入力形式でのみ動作します(例えばTSV形式では動作しません)。 + +**例 3:** + +次の構造でテーブル `hobbies3` を作成しましょう: + +```sql +CREATE TABLE hobbies3 +( + `identifier` UInt64, + `age` LowCardinality(UInt8), + `hobbies` Array(String) +) + ENGINE = MergeTree +ORDER BY identifier; +``` + +ファイル `hobbies.jsonl` からデータを挿入します: + +```sql +INSERT INTO hobbies3 SELECT id, age, hobbies FROM file(hobbies.jsonl) +``` + +この場合、`SELECT` クエリでカラム `id` が使用されていますが、テーブルにはこのカラムが存在しません(`identifier` という名前のカラムがあります)、したがって ClickHouse は挿入テーブルの構造を使用できず、スキーマの推測が使用されます。 + +**例 4:** + +次の構造でテーブル `hobbies4` を作成しましょう: + +```sql +CREATE TABLE hobbies4 +( + `id` UInt64, + `any_hobby` Nullable(String) +) + ENGINE = MergeTree +ORDER BY id; +``` + +ファイル `hobbies.jsonl` からデータを挿入します: + +```sql +INSERT INTO hobbies4 SELECT id, empty(hobbies) ? NULL : hobbies[1] FROM file(hobbies.jsonl) +``` + +この場合、カラム `hobbies` に対して `SELECT` クエリ内でテーブルに挿入するためのいくつかの操作が行われているため、ClickHouse は挿入テーブルの構造を使用できず、スキーマの推測が使用されます。 + +## スキーマ推測キャッシュ {#schema-inference-cache} + +ほとんどの入力形式のスキーマ推測では、その構造を決定するためにデータをいくつか読み込み、このプロセスには時間がかかることがあります。 +ClickHouseが同じファイルからデータを読み取るたびに同じスキーマの推測を防ぐために、推測されたスキーマはキャッシュされ、再度同じファイルにアクセスする場合、ClickHouseはキャッシュからスキーマを使用します。 + +このキャッシュを制御する特別な設定があります: +- `schema_inference_cache_max_elements_for_{file/s3/hdfs/url/azure}` - 対応するテーブル関数のキャッシュされたスキーマの最大数。デフォルト値は `4096` です。これらの設定はサーバー構成で設定する必要があります。 +- `schema_inference_use_cache_for_{file,s3,hdfs,url,azure}` - スキーマ推測のためのキャッシュをオン/オフすることができます。これらの設定はクエリ内で使用できます。 + +ファイルの形式設定を変更することによりファイルのスキーマを変更できます。 +この理由から、スキーマ推測キャッシュはファイルソース、フォーマット名、使用されたフォーマット設定、ファイルの最終変更時刻によってスキーマを識別します。 + +注: `url` テーブル関数でアクセスした一部のファイルには最終修正時間に関する情報が含まれていない場合があります。このケースに特別な設定 `schema_inference_cache_require_modification_time_for_url` があります。この設定を無効にすることで、最終変更時間なしにキャッシュからのスキーマを使用することができます。 + +現在のキャッシュ内のすべてのスキーマとキャッシュをクリーンにするシステムクエリ `SYSTEM DROP SCHEMA CACHE [FOR File/S3/URL/HDFS]` を提供するシステムテーブル [schema_inference_cache](../operations/system-tables/schema_inference_cache.md) もあります。 + +**例:** + +s3 のサンプルデータセット `github-2022.ndjson.gz` の構造を推測して、スキーマ推測キャッシュがどのように機能するかを見てみましょう: + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/github/github-2022.ndjson.gz') +SETTINGS allow_experimental_object_type = 1 +``` +```response +┌─name───────┬─type─────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ type │ Nullable(String) │ │ │ │ │ │ +│ actor │ Object(Nullable('json')) │ │ │ │ │ │ +│ repo │ Object(Nullable('json')) │ │ │ │ │ │ +│ created_at │ Nullable(String) │ │ │ │ │ │ +│ payload │ Object(Nullable('json')) │ │ │ │ │ │ +└────────────┴──────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ + +5 rows in set. Elapsed: 0.601 sec. +``` +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/github/github-2022.ndjson.gz') +SETTINGS allow_experimental_object_type = 1 +``` +```response +┌─name───────┬─type─────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ type │ Nullable(String) │ │ │ │ │ │ +│ actor │ Object(Nullable('json')) │ │ │ │ │ │ +│ repo │ Object(Nullable('json')) │ │ │ │ │ │ +│ created_at │ Nullable(String) │ │ │ │ │ │ +│ payload │ Object(Nullable('json')) │ │ │ │ │ │ +└────────────┴──────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ + +5 rows in set. Elapsed: 0.059 sec. +``` + +ご覧のとおり、2回目のクエリはほぼ即座に成功しました。 + +スキーマに影響を与える可能性のある設定を変更してみましょう: + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/github/github-2022.ndjson.gz') +SETTINGS input_format_json_read_objects_as_strings = 1 + +┌─name───────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ type │ Nullable(String) │ │ │ │ │ │ +│ actor │ Nullable(String) │ │ │ │ │ │ +│ repo │ Nullable(String) │ │ │ │ │ │ +│ created_at │ Nullable(String) │ │ │ │ │ │ +│ payload │ Nullable(String) │ │ │ │ │ │ +└────────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ + +5 rows in set. Elapsed: 0.611 sec +``` + +キャッシュされたスキーマは、推測されたスキーマに影響を与える可能性がある設定が変更されたため、同じファイルには使用されませんでした。 + +`system.schema_inference_cache` テーブルの内容を確認してみましょう: + +```sql +SELECT schema, format, source FROM system.schema_inference_cache WHERE storage='S3' +``` +```response +┌─schema──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─format─┬─source───────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ type Nullable(String), actor Object(Nullable('json')), repo Object(Nullable('json')), created_at Nullable(String), payload Object(Nullable('json')) │ NDJSON │ datasets-documentation.s3.eu-west-3.amazonaws.com443/datasets-documentation/github/github-2022.ndjson.gz │ +│ type Nullable(String), actor Nullable(String), repo Nullable(String), created_at Nullable(String), payload Nullable(String) │ NDJSON │ datasets-documentation.s3.eu-west-3.amazonaws.com443/datasets-documentation/github/github-2022.ndjson.gz │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +同じファイルに対して2つの異なるスキーマがあることがわかります。 + +システムクエリを使用してスキーマキャッシュをクリアできます: +```sql +SYSTEM DROP SCHEMA CACHE FOR S3 +``` +```response +Ok. +``` +```sql +SELECT count() FROM system.schema_inference_cache WHERE storage='S3' +``` +```response +┌─count()─┐ +│ 0 │ +└─────────┘ +``` + +## テキストフォーマット {#text-formats} + +テキストフォーマットの場合、ClickHouseはデータを行ごとに読み取り、フォーマットに従ってカラム値を抽出し、その後、一部の再帰的なパーサーとヒューリスティックを使用して各値のタイプを決定します。スキーマ推測でデータから読み取る最大行数およびバイト数は、`input_format_max_rows_to_read_for_schema_inference`(デフォルトで 25000)および `input_format_max_bytes_to_read_for_schema_inference`(デフォルトで 32Mb)で制御されます。 +デフォルトでは、すべての推測されたタイプは[Nullable](../sql-reference/data-types/nullable.md)ですが、`schema_inference_make_columns_nullable` を設定することでこれを変更できます(例は[テキストフォーマット用の設定](#settings-for-text-formats)セクションにあります)。 + +### JSONフォーマット {#json-formats} + +JSONフォーマットでは、ClickHouse は JSON 仕様に従って値を解析し、その後、それらに最適なデータ型を見つけようとします。 + +どのように機能するか、どの型を推測できるのか、および JSONフォーマットで使用できる特定の設定を見てみましょう。 + +**例** + +ここでは、[format](../sql-reference/table-functions/format.md) テーブル関数が例で使用されます。 + +整数、浮動小数点数、ブール値、文字列: +```sql +DESC format(JSONEachRow, '{"int" : 42, "float" : 42.42, "string" : "Hello, World!"}'); +``` +```response +┌─name───┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ int │ Nullable(Int64) │ │ │ │ │ │ +│ float │ Nullable(Float64) │ │ │ │ │ │ +│ bool │ Nullable(Bool) │ │ │ │ │ │ +│ string │ Nullable(String) │ │ │ │ │ │ +└────────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +日付、日付時刻: + +```sql +DESC format(JSONEachRow, '{"date" : "2022-01-01", "datetime" : "2022-01-01 00:00:00", "datetime64" : "2022-01-01 00:00:00.000"}') +``` +```response +┌─name───────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ date │ Nullable(Date) │ │ │ │ │ │ +│ datetime │ Nullable(DateTime) │ │ │ │ │ │ +│ datetime64 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└────────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列: +```sql +DESC format(JSONEachRow, '{"arr" : [1, 2, 3], "nested_arrays" : [[1, 2, 3], [4, 5, 6], []]}') +``` +```response +┌─name──────────┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ arr │ Array(Nullable(Int64)) │ │ │ │ │ │ +│ nested_arrays │ Array(Array(Nullable(Int64))) │ │ │ │ │ │ +└───────────────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列に `null` が含まれている場合、ClickHouseは他の配列要素からの型を使用します: +```sql +DESC format(JSONEachRow, '{"arr" : [null, 42, null]}') +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ arr │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +名前付きタプル: + +設定 `input_format_json_try_infer_named_tuples_from_objects` が有効な場合、スキーマ推測の際に ClickHouseはJSONオブジェクトから名前付きタプルを推測しようとします。 +できた名前付きタプルにはサンプルデータのすべての対応するJSONオブジェクトのすべての要素が含まれます。 + +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}') +``` + +```response +┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │ +└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +名前なしタプル: + +JSONフォーマットでは、異なるタイプの要素を持つ配列を名前なしタプルとして扱います。 +```sql +DESC format(JSONEachRow, '{"tuple" : [1, "Hello, World!", [1, 2, 3]]}') +``` +```response +┌─name──┬─type─────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ tuple │ Tuple(Nullable(Int64), Nullable(String), Array(Nullable(Int64))) │ │ │ │ │ │ +└───────┴──────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +一部の値が `null` や空の場合、他の行の対応する値の型を使用します: +```sql +DESC format(JSONEachRow, $$ + {"tuple" : [1, null, null]} + {"tuple" : [null, "Hello, World!", []]} + {"tuple" : [null, null, [1, 2, 3]]} + $$) +``` +```response +┌─name──┬─type─────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ tuple │ Tuple(Nullable(Int64), Nullable(String), Array(Nullable(Int64))) │ │ │ │ │ │ +└───────┴──────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +マップ: + +JSONでは、同じ型の値を持つオブジェクトをMap型として読み取ることができます。 +注意: これは設定 `input_format_json_read_objects_as_strings` および `input_format_json_try_infer_named_tuples_from_objects` が無効の場合にのみ機能します。 + +```sql +SET input_format_json_read_objects_as_strings = 0, input_format_json_try_infer_named_tuples_from_objects = 0; +DESC format(JSONEachRow, '{"map" : {"key1" : 42, "key2" : 24, "key3" : 4}}') +``` +```response +┌─name─┬─type─────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ map │ Map(String, Nullable(Int64)) │ │ │ │ │ │ +└──────┴──────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +JSONオブジェクト型(設定 `allow_experimental_object_type` が有効な場合): + +```sql +SET allow_experimental_object_type = 1 +DESC format(JSONEachRow, $$ + {"obj" : {"key1" : 42}} + {"obj" : {"key2" : "Hello, World!"}} + {"obj" : {"key1" : 24, "key3" : {"a" : 42, "b" : null}}} + $$) +``` +```response +┌─name─┬─type─────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Object(Nullable('json')) │ │ │ │ │ │ +└──────┴──────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ネストした複雑な型: +```sql +DESC format(JSONEachRow, '{"value" : [[[42, 24], []], {"key1" : 42, "key2" : 24}]}') +``` +```response +┌─name──┬─type─────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ value │ Tuple(Array(Array(Nullable(String))), Tuple(key1 Nullable(Int64), key2 Nullable(Int64))) │ │ │ │ │ │ +└───────┴──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseがあるキーの型を決定できない場合、データがnull/空のオブジェクト/空の配列だけを含む場合、`input_format_json_infer_incomplete_types_as_strings` 設定が有効な場合は型 `String` が使用され、そうでない場合は例外がスローされます: +```sql +DESC format(JSONEachRow, '{"arr" : [null, null]}') SETTINGS input_format_json_infer_incomplete_types_as_strings = 1; +``` +```response +┌─name─┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ arr │ Array(Nullable(String)) │ │ │ │ │ │ +└──────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(JSONEachRow, '{"arr" : [null, null]}') SETTINGS input_format_json_infer_incomplete_types_as_strings = 0; +``` +```response +Code: 652. DB::Exception: Received from localhost:9000. DB::Exception: +Cannot determine type for column 'arr' by first 1 rows of data, +most likely this column contains only Nulls or empty Arrays/Maps. +... +``` + +#### JSON設定 {#json-settings} + +##### input_format_json_try_infer_numbers_from_strings + +この設定を有効にすると、文字列値から数値を推測できます。 + +この設定はデフォルトで無効です。 + +**例:** + +```sql +SET input_format_json_try_infer_numbers_from_strings = 1; +DESC format(JSONEachRow, $$ + {"value" : "42"} + {"value" : "424242424242"} + $$) +``` +```response +┌─name──┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ value │ Nullable(Int64) │ │ │ │ │ │ +└───────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +##### input_format_json_try_infer_named_tuples_from_objects + +この設定を有効にすると、JSONオブジェクトから名前付きタプルを推測できます。結果の名前付きタプルには、サンプルデータの対応するJSONオブジェクトのすべての要素が含まれます。 +JSONデータがスパースでない場合には、この設定が有効になります。 + +この設定はデフォルトで有効です。 + +**例** + +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}') +``` + +結果: + +``` +┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │ +└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +DESC format(JSONEachRow, '{"array" : [{"a" : 42, "b" : "Hello"}, {}, {"c" : [1,2,3]}, {"d" : "2020-01-01"}]}') +``` + +結果: + +``` +┌─name──┬─type────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ array │ Array(Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Nullable(Date))) │ │ │ │ │ │ +└───────┴─────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +##### input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects + +この設定を有効にすると、名前付きタプルの推測中に曖昧なパスに対して例外の代わりにString型を使用することができます(`input_format_json_try_infer_named_tuples_from_objects`が有効な場合)。 +これにより、曖昧なパスがあってもJSONオブジェクトを名前付きタプルとして読み取ることができます。 + +デフォルトでは無効です。 + +**例** + +設定無効時: +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +SET input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects = 0; +DESC format(JSONEachRow, '{"obj" : {"a" : 42}}, {"obj" : {"a" : {"b" : "Hello"}}}'); +``` +結果: + +```text +Code: 636. DB::Exception: The table structure cannot be extracted from a JSONEachRow format file. Error: +Code: 117. DB::Exception: JSON objects have ambiguous data: in some objects path 'a' has type 'Int64' and in some - 'Tuple(b String)'. You can enable setting input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects to use String type for path 'a'. (INCORRECT_DATA) (version 24.3.1.1). +You can specify the structure manually. (CANNOT_EXTRACT_TABLE_STRUCTURE) +``` + +設定有効時: +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +SET input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects = 1; +DESC format(JSONEachRow, '{"obj" : "a" : 42}, {"obj" : {"a" : {"b" : "Hello"}}}'); +SELECT * FROM format(JSONEachRow, '{"obj" : {"a" : 42}}, {"obj" : {"a" : {"b" : "Hello"}}}'); +``` + +結果: +```text +┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Nullable(String)) │ │ │ │ │ │ +└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +┌─obj─────────────────┐ +│ ('42') │ +│ ('{"b" : "Hello"}') │ +└─────────────────────┘ +``` + +##### input_format_json_read_objects_as_strings + +この設定を有効にすると、入れ子になったJSONオブジェクトを文字列として読み取ることができます。 +この設定は、JSONオブジェクト型を使用せずに入れ子になったJSONオブジェクトを読み取るために使用できます。 + +この設定はデフォルトで有効です。 + +注意: この設定を有効にする場合は、`input_format_json_try_infer_named_tuples_from_objects`も無効にする必要があります。 + +```sql +SET input_format_json_read_objects_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 0; +DESC format(JSONEachRow, $$ + {"obj" : {"key1" : 42, "key2" : [1,2,3,4]}} + {"obj" : {"key3" : {"nested_key" : 1}}} + $$) +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + + +##### input_format_json_read_numbers_as_strings + +この設定を有効にすると、数値値を文字列として読み取ることができます。 + +この設定はデフォルトで有効です。 + +**例** + +```sql +SET input_format_json_read_numbers_as_strings = 1; +DESC format(JSONEachRow, $$ + {"value" : 1055} + {"value" : "unknown"} + $$) +``` +```response +┌─name──┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ value │ Nullable(String) │ │ │ │ │ │ +└───────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +##### input_format_json_read_bools_as_numbers + +この設定を有効にすると、Bool値を数値として読み取ることができます。 + +この設定はデフォルトで有効です。 + +**例:** + +```sql +SET input_format_json_read_bools_as_numbers = 1; +DESC format(JSONEachRow, $$ + {"value" : true} + {"value" : 42} + $$) +``` +```response +┌─name──┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ value │ Nullable(Int64) │ │ │ │ │ │ +└───────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +##### input_format_json_read_bools_as_strings + +この設定を有効にすると、Bool値を文字列として読み取ることができます。 + +この設定はデフォルトで有効です。 + +**例:** + +```sql +SET input_format_json_read_bools_as_strings = 1; +DESC format(JSONEachRow, $$ + {"value" : true} + {"value" : "Hello, World"} + $$) +``` +```response +┌─name──┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ value │ Nullable(String) │ │ │ │ │ │ +└───────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +##### input_format_json_read_arrays_as_strings + +この設定を有効にすると、JSON配列値を文字列として読み取ることができます。 + +この設定はデフォルトで有効です。 + +**例** + +```sql +SET input_format_json_read_arrays_as_strings = 1; +SELECT arr, toTypeName(arr), JSONExtractArrayRaw(arr)[3] from format(JSONEachRow, 'arr String', '{"arr" : [1, "Hello", [1,2,3]]}'); +``` +```response +┌─arr───────────────────┬─toTypeName(arr)─┬─arrayElement(JSONExtractArrayRaw(arr), 3)─┐ +│ [1, "Hello", [1,2,3]] │ String │ [1,2,3] │ +└───────────────────────┴─────────────────┴───────────────────────────────────────────┘ +``` + +##### input_format_json_infer_incomplete_types_as_strings + +この設定を有効にすると、スキーマ推測時にサンプルデータに `Null`/`{}`/`[]` のみを含むJSONキーに対してString型を使用できます。 +JSONフォーマットでは、すべての対応する設定が有効であれば、任意の値を文字列として読み取ることができ、スキーマ推測中に`Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` のようなエラーを回避するためにキーの型が不明な場合に文字列型を使用できます。 + +例: + +```sql +SET input_format_json_infer_incomplete_types_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 1; +DESCRIBE format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}'); +SELECT * FROM format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}'); +``` + +結果: +``` +┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Array(Nullable(Int64)), b Nullable(String), c Nullable(String), d Nullable(String), e Array(Nullable(String))) │ │ │ │ │ │ +└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ + +┌─obj────────────────────────────┐ +│ ([1,2,3],'hello',NULL,'{}',[]) │ +└────────────────────────────────┘ +``` + +### CSV {#csv} + +CSVフォーマットでは、ClickHouseはデリミタに従って行からカラム値を抽出します。ClickHouseは、数値や文字列以外の全ての型をダブルクオートで囲むことを期待しています。値がダブルクオートで囲まれている場合、ClickHouseは中のデータを再帰パーサーを使用して解析し、その後、最も適切なデータ型を見つけようとします。値がダブルクオートで囲まれていない場合、ClickHouseはそれを数値として解析し、数値でない場合、ClickHouseはそれを文字列として扱います。 + +ClickHouseがパーサーとヒューリスティックを使って複雑な型を決定しないようにしたい場合は、設定 `input_format_csv_use_best_effort_in_schema_inference` を無効にすることができ、ClickHouseはすべてのカラムを文字列として扱います。 + +設定 `input_format_csv_detect_header` が有効な場合、ClickHouseはスキーマ推論中にカラム名(おそらく型も)を含むヘッダを検出しようとします。この設定はデフォルトで有効です。 + +**例:** + +整数、浮動小数点数、ブール値、文字列: +```sql +DESC format(CSV, '42,42.42,true,"Hello,World!"') +``` +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Int64) │ │ │ │ │ │ +│ c2 │ Nullable(Float64) │ │ │ │ │ │ +│ c3 │ Nullable(Bool) │ │ │ │ │ │ +│ c4 │ Nullable(String) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +引用符なしの文字列: +```sql +DESC format(CSV, 'Hello world!,World hello!') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +日付、日付時刻: + +```sql +DESC format(CSV, '"2020-01-01","2020-01-01 00:00:00","2022-01-01 00:00:00.000"') +``` +```response +┌─name─┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Date) │ │ │ │ │ │ +│ c2 │ Nullable(DateTime) │ │ │ │ │ │ +│ c3 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└──────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列: +```sql +DESC format(CSV, '"[1,2,3]","[[1, 2], [], [3, 4]]"') +``` +```response +┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +│ c2 │ Array(Array(Nullable(Int64))) │ │ │ │ │ │ +└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(CSV, $$"['Hello', 'world']","[['Abc', 'Def'], []]"$$) +``` +```response +┌─name─┬─type───────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(String)) │ │ │ │ │ │ +│ c2 │ Array(Array(Nullable(String))) │ │ │ │ │ │ +└──────┴────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列にnullが含まれている場合、ClickHouseは他の配列要素からの型を使用します: +```sql +DESC format(CSV, '"[NULL, 42, NULL]"') +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +マップ: +```sql +DESC format(CSV, $$"{'key1' : 42, 'key2' : 24}"$$) +``` +```response +┌─name─┬─type─────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Map(String, Nullable(Int64)) │ │ │ │ │ │ +└──────┴──────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ネストした配列とマップ: +```sql +DESC format(CSV, $$"[{'key1' : [[42, 42], []], 'key2' : [[null], [42]]}]"$$) +``` +```response +┌─name─┬─type──────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Map(String, Array(Array(Nullable(Int64))))) │ │ │ │ │ │ +└──────┴───────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseが引用符内の型を決定できない場合、データにnullしか含まれていない場合、ClickHouseはそれをStringとして扱います: +```sql +DESC format(CSV, '"[NULL, NULL]"') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +設定 `input_format_csv_use_best_effort_in_schema_inference` を無効にした例: +```sql +SET input_format_csv_use_best_effort_in_schema_inference = 0 +DESC format(CSV, '"[1,2,3]",42.42,Hello World!') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +│ c3 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ヘッダー自動検出の例(`input_format_csv_detect_header` が有効な場合): + +名前のみ: +```sql +SELECT * FROM format(CSV, +$$"number","string","array" +42,"Hello","[1, 2, 3]" +43,"World","[4, 5, 6]" +$$) +``` + +```response +┌─number─┬─string─┬─array───┐ +│ 42 │ Hello │ [1,2,3] │ +│ 43 │ World │ [4,5,6] │ +└────────┴────────┴─────────┘ +``` + +名前と型: + +```sql +DESC format(CSV, +$$"number","string","array" +"UInt32","String","Array(UInt16)" +42,"Hello","[1, 2, 3]" +43,"World","[4, 5, 6]" +$$) +``` + +```response +┌─name───┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ UInt32 │ │ │ │ │ │ +│ string │ String │ │ │ │ │ │ +│ array │ Array(UInt16) │ │ │ │ │ │ +└────────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +注意: ヘッダーは、少なくとも1つのカラムが非文字列型である場合のみ検出されます。すべてのカラムが文字列型である場合、ヘッダーは検出されません: + +```sql +SELECT * FROM format(CSV, +$$"first_column","second_column" +"Hello","World" +"World","Hello" +$$) +``` + +```response +┌─c1───────────┬─c2────────────┐ +│ first_column │ second_column │ +│ Hello │ World │ +│ World │ Hello │ +└──────────────┴───────────────┘ +``` + +#### CSV設定 {#csv-settings} + +##### input_format_csv_try_infer_numbers_from_strings + +この設定を有効にすると、文字列値から数値を推測できます。 + +この設定はデフォルトで無効です。 + +**例:** + +```sql +SET input_format_json_try_infer_numbers_from_strings = 1; +DESC format(CSV, '42,42.42'); +``` +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Int64) │ │ │ │ │ │ +│ c2 │ Nullable(Float64) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### TSV/TSKV {#tsv-tskv} + +TSV/TSKVフォーマットでは、ClickHouseはタブ区切り文字に従って行からカラム値を抽出し、その後、再帰パーサーを使用して抽出された値を解析し、最も適切な型を決定します。型が決定できない場合、ClickHouseはこの値を文字列として扱います。 + +ClickHouseがパーサーとヒューリスティックを使って複雑な型を決定しないようにしたい場合は、設定 `input_format_tsv_use_best_effort_in_schema_inference` を無効にすることができ、ClickHouseはすべてのカラムを文字列として扱います。 + +設定 `input_format_tsv_detect_header` が有効な場合、ClickHouseはスキーマ推論中にカラム名(おそらく型も)を含むヘッダを検出しようとします。この設定はデフォルトで有効です。 + +**例:** + +整数、浮動小数点数、ブール値、文字列: +```sql +DESC format(TSV, '42\t42.42\ttrue\tHello,World!') +``` +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Int64) │ │ │ │ │ │ +│ c2 │ Nullable(Float64) │ │ │ │ │ │ +│ c3 │ Nullable(Bool) │ │ │ │ │ │ +│ c4 │ Nullable(String) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(TSKV, 'int=42\tfloat=42.42\tbool=true\tstring=Hello,World!\n') +``` +```response +┌─name───┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ int │ Nullable(Int64) │ │ │ │ │ │ +│ float │ Nullable(Float64) │ │ │ │ │ │ +│ bool │ Nullable(Bool) │ │ │ │ │ │ +│ string │ Nullable(String) │ │ │ │ │ │ +└────────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +日付、日付時刻: + +```sql +DESC format(TSV, '2020-01-01\t2020-01-01 00:00:00\t2022-01-01 00:00:00.000') +``` +```response +┌─name─┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Date) │ │ │ │ │ │ +│ c2 │ Nullable(DateTime) │ │ │ │ │ │ +│ c3 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└──────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列: +```sql +DESC format(TSV, '[1,2,3]\t[[1, 2], [], [3, 4]]') +``` +```response +┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +│ c2 │ Array(Array(Nullable(Int64))) │ │ │ │ │ │ +└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(TSV, '[''Hello'', ''world'']\t[[''Abc'', ''Def''], []]') +``` +```response +┌─name─┬─type───────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(String)) │ │ │ │ │ │ +│ c2 │ Array(Array(Nullable(String))) │ │ │ │ │ │ +└──────┴────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列にnullが含まれている場合、ClickHouseは他の配列要素からの型を使用します: +```sql +DESC format(TSV, '[NULL, 42, NULL]') +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + + +Tuples: +```sql +DESC format(TSV, $$(42, 'Hello, world!')$$) +``` +```response +┌─name─┬─type─────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Tuple(Nullable(Int64), Nullable(String)) │ │ │ │ │ │ +└──────┴──────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +Maps: +```sql +DESC format(TSV, $${'key1' : 42, 'key2' : 24}$$) +``` +```response +┌─name─┬─type─────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Map(String, Nullable(Int64)) │ │ │ │ │ │ +└──────┴──────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ネストされた配列、タプル、マップ: +```sql +DESC format(TSV, $$[{'key1' : [(42, 'Hello'), (24, NULL)], 'key2' : [(NULL, ','), (42, 'world!')]}]$$) +``` +```response +┌─name─┬─type────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Map(String, Array(Tuple(Nullable(Int64), Nullable(String))))) │ │ │ │ │ │ +└──────┴─────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseが型を判別できない場合、データがnullのみを含むため、ClickHouseはそれをStringとして扱います: +```sql +DESC format(TSV, '[NULL, NULL]') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +設定 `input_format_tsv_use_best_effort_in_schema_inference` が無効になっている場合の例: +```sql +SET input_format_tsv_use_best_effort_in_schema_inference = 0 +DESC format(TSV, '[1,2,3] 42.42 Hello World!') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +│ c3 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ヘッダーの自動検出の例(`input_format_tsv_detect_header` が有効な場合): + +名前のみ: +```sql +SELECT * FROM format(TSV, +$$number string array +42 Hello [1, 2, 3] +43 World [4, 5, 6] +$$); +``` + +```response +┌─number─┬─string─┬─array───┐ +│ 42 │ Hello │ [1,2,3] │ +│ 43 │ World │ [4,5,6] │ +└────────┴────────┴─────────┘ +``` + +名前と型: + +```sql +DESC format(TSV, +$$number string array +UInt32 String Array(UInt16) +42 Hello [1, 2, 3] +43 World [4, 5, 6] +$$) +``` + +```response +┌─name───┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ UInt32 │ │ │ │ │ │ +│ string │ String │ │ │ │ │ │ +│ array │ Array(UInt16) │ │ │ │ │ │ +└────────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +すべてのカラムがString型の場合、ヘッダーは検出されないことに注意してください: + +```sql +SELECT * FROM format(TSV, +$$first_column second_column +Hello World +World Hello +$$) +``` + +```response +┌─c1───────────┬─c2────────────┐ +│ first_column │ second_column │ +│ Hello │ World │ +│ World │ Hello │ +└──────────────┴───────────────┘ +``` + +### Values {#values} + +Values形式では、ClickHouseは行からカラム値を抽出し、その後リテラルを解析するのに似た再帰的なパーサーを使用して解析します。 + +**例:** + +整数、浮動小数点、ブール、文字列: +```sql +DESC format(Values, $$(42, 42.42, true, 'Hello,World!')$$) +``` +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Int64) │ │ │ │ │ │ +│ c2 │ Nullable(Float64) │ │ │ │ │ │ +│ c3 │ Nullable(Bool) │ │ │ │ │ │ +│ c4 │ Nullable(String) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +日付、日時: + +```sql + DESC format(Values, $$('2020-01-01', '2020-01-01 00:00:00', '2022-01-01 00:00:00.000')$$) + ``` +```response +┌─name─┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Date) │ │ │ │ │ │ +│ c2 │ Nullable(DateTime) │ │ │ │ │ │ +│ c3 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└──────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列: +```sql +DESC format(Values, '([1,2,3], [[1, 2], [], [3, 4]])') +``` +```response +┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +│ c2 │ Array(Array(Nullable(Int64))) │ │ │ │ │ │ +└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +配列にnullが含まれる場合、ClickHouseは他の配列要素からタイプを使用します: +```sql +DESC format(Values, '([NULL, 42, NULL])') +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +タプル: +```sql +DESC format(Values, $$((42, 'Hello, world!'))$$) +``` +```response +┌─name─┬─type─────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Tuple(Nullable(Int64), Nullable(String)) │ │ │ │ │ │ +└──────┴──────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +マップ: +```sql +DESC format(Values, $$({'key1' : 42, 'key2' : 24})$$) +``` +```response +┌─name─┬─type─────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Map(String, Nullable(Int64)) │ │ │ │ │ │ +└──────┴──────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ネストされた配列、タプル、およびマップ: +```sql +DESC format(Values, $$([{'key1' : [(42, 'Hello'), (24, NULL)], 'key2' : [(NULL, ','), (42, 'world!')]}])$$) +``` +```response +┌─name─┬─type────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Array(Map(String, Array(Tuple(Nullable(Int64), Nullable(String))))) │ │ │ │ │ │ +└──────┴─────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseが型を判別できない場合、データがnullのみを含むため、例外がスローされます: +```sql +DESC format(Values, '([NULL, NULL])') +``` +```response +Code: 652. DB::Exception: Received from localhost:9000. DB::Exception: +Cannot determine type for column 'c1' by first 1 rows of data, +most likely this column contains only Nulls or empty Arrays/Maps. +... +``` + +設定 `input_format_tsv_use_best_effort_in_schema_inference` が無効になっている場合の例: +```sql +SET input_format_tsv_use_best_effort_in_schema_inference = 0 +DESC format(TSV, '[1,2,3] 42.42 Hello World!') +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +│ c3 │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### CustomSeparated {#custom-separated} + +CustomSeparated形式では、ClickHouseはまず行から指定された区切り文字に従ってカラム値をすべて抽出し、次にエスケープルールに従ってそれぞれの値のデータ型を推測しようとします。 + +設定 `input_format_custom_detect_header` が有効であれば、ClickHouseはスキーマ推測中にカラム名(および場合によっては型)を含むヘッダーを検出しようとします。この設定はデフォルトで有効になっています。 + +**例** + +```sql +SET format_custom_row_before_delimiter = '', + format_custom_row_after_delimiter = '\n', + format_custom_row_between_delimiter = '\n', + format_custom_result_before_delimiter = '\n', + format_custom_result_after_delimiter = '\n', + format_custom_field_delimiter = '', + format_custom_escaping_rule = 'Quoted' + +DESC format(CustomSeparated, $$ +42.42'Some string 1'[1, NULL, 3] + +NULL'Some string 3'[1, 2, NULL] + +$$) +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Float64) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +│ c3 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ヘッダー自動検出の例(`input_format_custom_detect_header` が有効な場合) + +```sql +SET format_custom_row_before_delimiter = '', + format_custom_row_after_delimiter = '\n', + format_custom_row_between_delimiter = '\n', + format_custom_result_before_delimiter = '\n', + format_custom_result_after_delimiter = '\n', + format_custom_field_delimiter = '', + format_custom_escaping_rule = 'Quoted' + +DESC format(CustomSeparated, $$ +'number''string''array' + +42.42'Some string 1'[1, NULL, 3] + +NULL'Some string 3'[1, 2, NULL] + +$$) +``` + +```response +┌─number─┬─string────────┬─array──────┐ +│ 42.42 │ Some string 1 │ [1,NULL,3] │ +│ ᴺᵁᴸᴸ │ Some string 3 │ [1,2,NULL] │ +└────────┴───────────────┴────────────┘ +``` + +### Template {#template} + +Template形式では、ClickHouseはまず指定されたテンプレートに従って行からすべてのカラム値を抽出し、その後、そのエスケープルールに従ってそれぞれの値のデータ型を推測します。 + +**例** + +次の内容のファイル `resultset` があるとします: +``` + +${data} +``` + +そして次の内容のファイル `row_format` があるとします: +``` +${column_1:CSV}${column_2:Quoted}${column_3:JSON} +``` + +次のクエリを実行できます: + +```sql +SET format_template_rows_between_delimiter = '\n', + format_template_row = 'row_format', + format_template_resultset = 'resultset_format' + +DESC format(Template, $$ +42.42'Some string 1'[1, null, 2] + +\N'Some string 3'[1, 2, null] + +$$) +``` +```response +┌─name─────┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ column_1 │ Nullable(Float64) │ │ │ │ │ │ +│ column_2 │ Nullable(String) │ │ │ │ │ │ +│ column_3 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### Regexp {#regexp} + +Templateと同様に、Regexp形式ではClickHouseが正規表現に従って行からすべてのカラム値を抽出し、その後、指定されたエスケープルールに従ってそれぞれの値のデータ型を推測します。 + +**例** + +```sql +SET format_regexp = '^Line: value_1=(.+?), value_2=(.+?), value_3=(.+?)', + format_regexp_escaping_rule = 'CSV' + +DESC format(Regexp, $$Line: value_1=42, value_2="Some string 1", value_3="[1, NULL, 3]" +Line: value_1=2, value_2="Some string 2", value_3="[4, 5, NULL]"$$) +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Int64) │ │ │ │ │ │ +│ c2 │ Nullable(String) │ │ │ │ │ │ +│ c3 │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### テキストフォーマット用の設定 {#settings-for-text-formats} + +#### input_format_max_rows_to_read_for_schema_inference/input_format_max_bytes_to_read_for_schema_inference + +これらの設定は、スキーマ推測中に読み込むデータの量を制御します。 +より多くの行/バイトを読み込むほど、スキーマ推測に費やされる時間が増えますが、型を正しく判別できる可能性が高まります(特にデータに多くのnullが含まれている場合)。 + +デフォルト値: +- `input_format_max_rows_to_read_for_schema_inference` は `25000`。 +- `input_format_max_bytes_to_read_for_schema_inference` は `33554432` (32 Mb)。 + +#### column_names_for_schema_inference + +明示的なカラム名がない形式でスキーマ推測に使用するカラム名のリスト。指定された名前はデフォルトの `c1,c2,c3,...` の代わりに使用されます。形式: `column1,column2,column3,...`。 + +**例** + +```sql +DESC format(TSV, 'Hello, World! 42 [1, 2, 3]') settings column_names_for_schema_inference = 'str,int,arr' +``` +```response +┌─name─┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ str │ Nullable(String) │ │ │ │ │ │ +│ int │ Nullable(Int64) │ │ │ │ │ │ +│ arr │ Array(Nullable(Int64)) │ │ │ │ │ │ +└──────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### schema_inference_hints + +自動的に判別された型の代わりにスキーマ推測で使用するカラム名と型のリスト。形式: 'column_name1 column_type1, column_name2 column_type2, ...'。 +この設定は、自動的に判別できなかったカラムの型を指定するか、スキーマ最適化のために使用できます。 + +**例** + +```sql +DESC format(JSONEachRow, '{"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]}') SETTINGS schema_inference_hints = 'age LowCardinality(UInt8), status Nullable(String)', allow_suspicious_low_cardinality_types=1 +``` +```response +┌─name────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ age │ LowCardinality(UInt8) │ │ │ │ │ │ +│ name │ Nullable(String) │ │ │ │ │ │ +│ status │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(Nullable(String)) │ │ │ │ │ │ +└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### schema_inference_make_columns_nullable + +null可能性に関する情報がない形式のスキーマ推測で、推測された型を `Nullable` にするかを制御します。 +この設定が有効な場合、すべての推測された型は `Nullable` になります。無効な場合、推測された型は決して `Nullable` にはなりません。`auto` に設定されている場合、スキーマ推測中に解析されたサンプルでカラムに `NULL` が含まれている場合、またはファイルメタデータにカラムのnull可能性に関する情報が含まれている場合のみ、推測された型は `Nullable` になります。 + +デフォルトで有効です。 + +**例** + +```sql +SET schema_inference_make_columns_nullable = 1 +DESC format(JSONEachRow, $$ + {"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]} + {"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]} + $$) +``` +```response +┌─name────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ age │ Nullable(Int64) │ │ │ │ │ │ +│ name │ Nullable(String) │ │ │ │ │ │ +│ status │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(Nullable(String)) │ │ │ │ │ │ +└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +SET schema_inference_make_columns_nullable = 'auto'; +DESC format(JSONEachRow, $$ + {"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]} + {"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]} + $$) +``` +```response +┌─name────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Int64 │ │ │ │ │ │ +│ age │ Int64 │ │ │ │ │ │ +│ name │ String │ │ │ │ │ │ +│ status │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(String) │ │ │ │ │ │ +└─────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +```sql +SET schema_inference_make_columns_nullable = 0; +DESC format(JSONEachRow, $$ + {"id" : 1, "age" : 25, "name" : "Josh", "status" : null, "hobbies" : ["football", "cooking"]} + {"id" : 2, "age" : 19, "name" : "Alan", "status" : "married", "hobbies" : ["tennis", "art"]} + $$) +``` +```response + +┌─name────┬─type──────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Int64 │ │ │ │ │ │ +│ age │ Int64 │ │ │ │ │ │ +│ name │ String │ │ │ │ │ │ +│ status │ String │ │ │ │ │ │ +│ hobbies │ Array(String) │ │ │ │ │ │ +└─────────┴───────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### input_format_try_infer_integers + +有効にすると、ClickHouseはテキスト形式のスキーマ推測で整数を浮動小数点の代わりに推測しようとします。 +サンプルデータのカラム内のすべての数値が整数であれば、結果の型は `Int64` になります。少なくとも1つの数値が浮動小数点である場合、結果の型は `Float64` になります。 +サンプルデータが整数のみを含み、少なくとも1つの整数が正で `Int64` をオーバーフローする場合、ClickHouseは `UInt64` を推測します。 + +デフォルトで有効です。 + +**例** + +```sql +SET input_format_try_infer_integers = 0 +DESC format(JSONEachRow, $$ + {"number" : 1} + {"number" : 2} + $$) +``` +```response +┌─name───┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ Nullable(Float64) │ │ │ │ │ │ +└────────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +SET input_format_try_infer_integers = 1 +DESC format(JSONEachRow, $$ + {"number" : 1} + {"number" : 2} + $$) +``` +```response +┌─name───┬─type────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ Nullable(Int64) │ │ │ │ │ │ +└────────┴─────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(JSONEachRow, $$ + {"number" : 1} + {"number" : 18446744073709551615} + $$) +``` +```response +┌─name───┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ Nullable(UInt64) │ │ │ │ │ │ +└────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(JSONEachRow, $$ + {"number" : 1} + {"number" : 2.2} + $$) +``` +```response +┌─name───┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ number │ Nullable(Float64) │ │ │ │ │ │ +└────────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### input_format_try_infer_datetimes + +有効にすると、ClickHouseはテキスト形式のスキーマ推測で `DateTime` または `DateTime64` 型を文字列フィールドから推測しようとします。 +サンプルデータ内のカラムからすべてのフィールドが日時として正常に解析された場合、結果の型は `DateTime` または(任意の日時が少数部を持っている場合)`DateTime64(9)` になります。 +少なくとも1つのフィールドが日時として解析されなかった場合、結果の型は `String` になります。 + +デフォルトで有効です。 + +**例** + +```sql +SET input_format_try_infer_datetimes = 0; +DESC format(JSONEachRow, $$ + {"datetime" : "2021-01-01 00:00:00", "datetime64" : "2021-01-01 00:00:00.000"} + {"datetime" : "2022-01-01 00:00:00", "datetime64" : "2022-01-01 00:00:00.000"} + $$) +``` +```response +┌─name───────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ datetime │ Nullable(String) │ │ │ │ │ │ +│ datetime64 │ Nullable(String) │ │ │ │ │ │ +└────────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +SET input_format_try_infer_datetimes = 1; +DESC format(JSONEachRow, $$ + {"datetime" : "2021-01-01 00:00:00", "datetime64" : "2021-01-01 00:00:00.000"} + {"datetime" : "2022-01-01 00:00:00", "datetime64" : "2022-01-01 00:00:00.000"} + $$) +``` +```response +┌─name───────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ datetime │ Nullable(DateTime) │ │ │ │ │ │ +│ datetime64 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└────────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(JSONEachRow, $$ + {"datetime" : "2021-01-01 00:00:00", "datetime64" : "2021-01-01 00:00:00.000"} + {"datetime" : "unknown", "datetime64" : "unknown"} + $$) +``` +```response +┌─name───────┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ datetime │ Nullable(String) │ │ │ │ │ │ +│ datetime64 │ Nullable(String) │ │ │ │ │ │ +└────────────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### input_format_try_infer_datetimes_only_datetime64 + +有効にすると、`input_format_try_infer_datetimes` が有効な場合、日時の値が小数部を含まない場合でもClickHouseは常に `DateTime64(9)` を推測します。 + +デフォルトでは無効です。 + +**例** + +```sql +SET input_format_try_infer_datetimes = 1; +SET input_format_try_infer_datetimes_only_datetime64 = 1; +DESC format(JSONEachRow, $$ + {"datetime" : "2021-01-01 00:00:00", "datetime64" : "2021-01-01 00:00:00.000"} + {"datetime" : "2022-01-01 00:00:00", "datetime64" : "2022-01-01 00:00:00.000"} + $$) +``` + +```text +┌─name───────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ datetime │ Nullable(DateTime64(9)) │ │ │ │ │ │ +│ datetime64 │ Nullable(DateTime64(9)) │ │ │ │ │ │ +└────────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +注意: スキーマ推測中の日時の解析は、設定 [date_time_input_format](/docs/ja/operations/settings/settings-formats.md#date_time_input_format) に影響されます + +#### input_format_try_infer_dates + +有効にすると、ClickHouseはテキスト形式のスキーマ推測で `Date` 型を文字列フィールドから推測しようとします。 +サンプルデータ内のカラムからすべてのフィールドが日付として正常に解析された場合、結果の型は `Date` になります。 +少なくとも1つのフィールドが日付として解析されなかった場合、結果の型は `String` になります。 + +デフォルトで有効です。 + +**例** + +```sql +SET input_format_try_infer_datetimes = 0, input_format_try_infer_dates = 0 +DESC format(JSONEachRow, $$ + {"date" : "2021-01-01"} + {"date" : "2022-01-01"} + $$) +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ date │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +SET input_format_try_infer_dates = 1 +DESC format(JSONEachRow, $$ + {"date" : "2021-01-01"} + {"date" : "2022-01-01"} + $$) +``` +```response +┌─name─┬─type───────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ date │ Nullable(Date) │ │ │ │ │ │ +└──────┴────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` +```sql +DESC format(JSONEachRow, $$ + {"date" : "2021-01-01"} + {"date" : "unknown"} + $$) +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ date │ Nullable(String) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +#### input_format_try_infer_exponent_floats + +有効にすると、ClickHouseはテキスト形式(JSONを除く)で指数形式の浮動小数点を推測しようとします(指数形式の数値は常に推測されます)。 + +デフォルトでは無効です。 + +**例** + +```sql +SET input_format_try_infer_exponent_floats = 1; +DESC format(CSV, +$$1.1E10 +2.3e-12 +42E00 +$$) +``` +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(Float64) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## 自己記述型フォーマット {#self-describing-formats} + +自己記述型フォーマットには、データそのものにデータの構造に関する情報が含まれています。 +たとえば、説明を含むヘッダー、バイナリ型ツリー、またはテーブルのようなものがあります。 +ClickHouseはこうした形式のファイルから自動的にスキーマを推測するため、タイプに関する情報を含む部分を読み込み、 +ClickHouseテーブルのスキーマにそれを変換します。 + +### -WithNamesAndTypes サフィックスがあるフォーマット {#formats-with-names-and-types} + +ClickHouseは、一部のテキストフォーマットにサフィックス -WithNamesAndTypes をサポートしています。このサフィックスは、データが実際のデータの前にカラム名と型を含む2つの追加行を持っていることを意味します。 +このような形式のスキーマ推測中に、ClickHouseは最初の2行を読み、カラム名と型を抽出します。 + +**例** + +```sql +DESC format(TSVWithNamesAndTypes, +$$num str arr +UInt8 String Array(UInt8) +42 Hello, World! [1,2,3] +$$) +``` +```response +┌─name─┬─type─────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ num │ UInt8 │ │ │ │ │ │ +│ str │ String │ │ │ │ │ │ +│ arr │ Array(UInt8) │ │ │ │ │ │ +└──────┴──────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### メタデータを持つJSONフォーマット {#json-with-metadata} + +いくつかのJSON入力形式 ([JSON](formats.md#json), [JSONCompact](formats.md#json-compact), [JSONColumnsWithMetadata](formats.md#jsoncolumnswithmetadata)) は、カラム名と型のメタデータを含んでいます。 +このようなフォーマットのスキーマ推測では、ClickHouseはこのメタデータを読み込みます。 + +**例** +```sql +DESC format(JSON, $$ +{ + "meta": + [ + { + "name": "num", + "type": "UInt8" + }, + { + "name": "str", + "type": "String" + }, + { + "name": "arr", + "type": "Array(UInt8)" + } + ], + + "data": + [ + { + "num": 42, + "str": "Hello, World", + "arr": [1,2,3] + } + ], + + "rows": 1, + + "statistics": + { + "elapsed": 0.005723915, + "rows_read": 1, + "bytes_read": 1 + } +} +$$) +``` +```response +┌─name─┬─type─────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ num │ UInt8 │ │ │ │ │ │ +│ str │ String │ │ │ │ │ │ +│ arr │ Array(UInt8) │ │ │ │ │ │ +└──────┴──────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### Avro {#avro} + +Avro形式では、ClickHouseがデータからそのスキーマを読み込み、次の型のマッチングを使用してClickHouseスキーマに変換します。 + +| Avroデータ型 | ClickHouseデータ型 | +|------------------------------------|--------------------------------------------------------------------------------| +| `boolean` | [Bool](../sql-reference/data-types/boolean.md) | +| `int` | [Int32](../sql-reference/data-types/int-uint.md) | +| `int (date)` \* | [Date32](../sql-reference/data-types/date32.md) | +| `long` | [Int64](../sql-reference/data-types/int-uint.md) | +| `float` | [Float32](../sql-reference/data-types/float.md) | +| `double` | [Float64](../sql-reference/data-types/float.md) | +| `bytes`, `string` | [String](../sql-reference/data-types/string.md) | +| `fixed` | [FixedString(N)](../sql-reference/data-types/fixedstring.md) | +| `enum` | [Enum](../sql-reference/data-types/enum.md) | +| `array(T)` | [Array(T)](../sql-reference/data-types/array.md) | +| `union(null, T)`, `union(T, null)` | [Nullable(T)](../sql-reference/data-types/date.md) | +| `null` | [Nullable(Nothing)](../sql-reference/data-types/special-data-types/nothing.md) | +| `string (uuid)` \* | [UUID](../sql-reference/data-types/uuid.md) | +| `binary (decimal)` \* | [Decimal(P, S)](../sql-reference/data-types/decimal.md) | + +\* [Avro論理型](https://avro.apache.org/docs/current/spec.html#Logical+Types) + +その他のAvro型はサポートされていません。 + +### Parquet {#parquet} + +Parquet形式では、ClickHouseがそのスキーマをデータから読み込み、次の型のマッチングを使用してClickHouseスキーマに変換します。 + +| Parquetデータ型 | ClickHouseデータ型 | +|------------------------------|---------------------------------------------------------| +| `BOOL` | [Bool](../sql-reference/data-types/boolean.md) | +| `UINT8` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `INT8` | [Int8](../sql-reference/data-types/int-uint.md) | +| `UINT16` | [UInt16](../sql-reference/data-types/int-uint.md) | +| `INT16` | [Int16](../sql-reference/data-types/int-uint.md) | +| `UINT32` | [UInt32](../sql-reference/data-types/int-uint.md) | +| `INT32` | [Int32](../sql-reference/data-types/int-uint.md) | +| `UINT64` | [UInt64](../sql-reference/data-types/int-uint.md) | +| `INT64` | [Int64](../sql-reference/data-types/int-uint.md) | +| `FLOAT` | [Float32](../sql-reference/data-types/float.md) | +| `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | +| `DATE` | [Date32](../sql-reference/data-types/date32.md) | +| `TIME (ms)` | [DateTime](../sql-reference/data-types/datetime.md) | +| `TIMESTAMP`, `TIME (us, ns)` | [DateTime64](../sql-reference/data-types/datetime64.md) | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | +| `DECIMAL` | [Decimal](../sql-reference/data-types/decimal.md) | +| `LIST` | [Array](../sql-reference/data-types/array.md) | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | +| `MAP` | [Map](../sql-reference/data-types/map.md) | + +その他のParquet型はサポートされていません。デフォルトでは、すべての推測された型は `Nullable` 内にありますが、設定 `schema_inference_make_columns_nullable` を使用して変更できます。 + +### Arrow {#arrow} + +Arrow形式では、ClickHouseがそのスキーマをデータから読み込み、次の型のマッチングを使用してClickHouseスキーマに変換します。 + +| Arrowデータ型 | ClickHouseデータ型 | +|---------------------------------|---------------------------------------------------------| +| `BOOL` | [Bool](../sql-reference/data-types/boolean.md) | +| `UINT8` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `INT8` | [Int8](../sql-reference/data-types/int-uint.md) | +| `UINT16` | [UInt16](../sql-reference/data-types/int-uint.md) | +| `INT16` | [Int16](../sql-reference/data-types/int-uint.md) | +| `UINT32` | [UInt32](../sql-reference/data-types/int-uint.md) | +| `INT32` | [Int32](../sql-reference/data-types/int-uint.md) | +| `UINT64` | [UInt64](../sql-reference/data-types/int-uint.md) | +| `INT64` | [Int64](../sql-reference/data-types/int-uint.md) | +| `FLOAT`, `HALF_FLOAT` | [Float32](../sql-reference/data-types/float.md) | +| `DOUBLE` | [Float64](../sql-reference/data-types/float.md) | +| `DATE32` | [Date32](../sql-reference/data-types/date32.md) | +| `DATE64` | [DateTime](../sql-reference/data-types/datetime.md) | +| `TIMESTAMP`, `TIME32`, `TIME64` | [DateTime64](../sql-reference/data-types/datetime64.md) | +| `STRING`, `BINARY` | [String](../sql-reference/data-types/string.md) | +| `DECIMAL128`, `DECIMAL256` | [Decimal](../sql-reference/data-types/decimal.md) | +| `LIST` | [Array](../sql-reference/data-types/array.md) | +| `STRUCT` | [Tuple](../sql-reference/data-types/tuple.md) | +| `MAP` | [Map](../sql-reference/data-types/map.md) | + +その他のArrow型はサポートされていません。デフォルトでは、すべての推測された型は `Nullable` 内にありますが、設定 `schema_inference_make_columns_nullable` を使用して変更できます。 + +### ORC {#orc} + +ORC形式では、ClickHouseがそのスキーマをデータから読み込み、次の型のマッチングを使用してClickHouseスキーマに変換します。 + +| ORCデータ型 | ClickHouseデータ型 | +|--------------------------------------|---------------------------------------------------------| +| `Boolean` | [Bool](../sql-reference/data-types/boolean.md) | +| `Tinyint` | [Int8](../sql-reference/data-types/int-uint.md) | +| `Smallint` | [Int16](../sql-reference/data-types/int-uint.md) | +| `Int` | [Int32](../sql-reference/data-types/int-uint.md) | +| `Bigint` | [Int64](../sql-reference/data-types/int-uint.md) | +| `Float` | [Float32](../sql-reference/data-types/float.md) | +| `Double` | [Float64](../sql-reference/data-types/float.md) | +| `Date` | [Date32](../sql-reference/data-types/date32.md) | +| `Timestamp` | [DateTime64](../sql-reference/data-types/datetime64.md) | +| `String`, `Char`, `Varchar`,`BINARY` | [String](../sql-reference/data-types/string.md) | +| `Decimal` | [Decimal](../sql-reference/data-types/decimal.md) | +| `List` | [Array](../sql-reference/data-types/array.md) | +| `Struct` | [Tuple](../sql-reference/data-types/tuple.md) | +| `Map` | [Map](../sql-reference/data-types/map.md) | + +その他のORC型はサポートされていません。デフォルトでは、すべての推測された型は `Nullable` 内にありますが、設定 `schema_inference_make_columns_nullable` を使用して変更できます。 + +### Native {#native} + +ネイティブ形式はClickHouse内部で使用され、データにスキーマを含んでいます。 +スキーマ推測では、ClickHouseはデータからスキーマを変換なしに読み取ります。 + +## 外部スキーマを持つフォーマット {#formats-with-external-schema} + +そのようなフォーマットでは、特定のスキーマ言語での外部ファイルでデータを記述するスキーマが必要です。 +ClickHouseは自動的にこうした形式のファイルからスキーマを推測するために、外部スキーマを別ファイルから読み取り、それをClickHouseテーブルスキーマに変換します。 + +### Protobuf {#protobuf} + +Protobuf形式のスキーマ推測では、次の型のマッチングを使用します: + +| Protobufデータ型 | ClickHouseデータ型 | +|-------------------------------|---------------------------------------------------| +| `bool` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `float` | [Float32](../sql-reference/data-types/float.md) | +| `double` | [Float64](../sql-reference/data-types/float.md) | +| `int32`, `sint32`, `sfixed32` | [Int32](../sql-reference/data-types/int-uint.md) | +| `int64`, `sint64`, `sfixed64` | [Int64](../sql-reference/data-types/int-uint.md) | +| `uint32`, `fixed32` | [UInt32](../sql-reference/data-types/int-uint.md) | +| `uint64`, `fixed64` | [UInt64](../sql-reference/data-types/int-uint.md) | +| `string`, `bytes` | [String](../sql-reference/data-types/string.md) | +| `enum` | [Enum](../sql-reference/data-types/enum.md) | +| `repeated T` | [Array(T)](../sql-reference/data-types/array.md) | +| `message`, `group` | [Tuple](../sql-reference/data-types/tuple.md) | + +### CapnProto {#capnproto} + +CapnProto形式のスキーマ推測では、次の型のマッチングを使用します: + +| CapnProtoデータ型 | ClickHouseデータ型 | +|------------------------------------|--------------------------------------------------------| +| `Bool` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `Int8` | [Int8](../sql-reference/data-types/int-uint.md) | +| `UInt8` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `Int16` | [Int16](../sql-reference/data-types/int-uint.md) | +| `UInt16` | [UInt16](../sql-reference/data-types/int-uint.md) | +| `Int32` | [Int32](../sql-reference/data-types/int-uint.md) | +| `UInt32` | [UInt32](../sql-reference/data-types/int-uint.md) | +| `Int64` | [Int64](../sql-reference/data-types/int-uint.md) | +| `UInt64` | [UInt64](../sql-reference/data-types/int-uint.md) | +| `Float32` | [Float32](../sql-reference/data-types/float.md) | +| `Float64` | [Float64](../sql-reference/data-types/float.md) | +| `Text`, `Data` | [String](../sql-reference/data-types/string.md) | +| `enum` | [Enum](../sql-reference/data-types/enum.md) | +| `List` | [Array](../sql-reference/data-types/array.md) | +| `struct` | [Tuple](../sql-reference/data-types/tuple.md) | +| `union(T, Void)`, `union(Void, T)` | [Nullable(T)](../sql-reference/data-types/nullable.md) | + +## 強い型のバイナリ形式 {#strong-typed-binary-formats} + +このような形式では、各シリアライズされた値にその型に関する情報(および場合によってはそれに関する名前)が含まれていますが、テーブル全体に関する情報はありません。 +ClickHouseはこのような形式のスキーマ推測を行うため、データを行ごとに読み込み(`input_format_max_rows_to_read_for_schema_inference` 行または `input_format_max_bytes_to_read_for_schema_inference` バイトまで)、 +データから各値に対する型(および場合によっては名前)を抽出し、これらの型をClickHouseの型に変換します。 + +### MsgPack {#msgpack} + +MsgPack形式では、行間の区切りがないため、この形式のスキーマ推測を行う場合は、テーブルのカラム数を設定 `input_format_msgpack_number_of_columns` を使用して指定してください。ClickHouseは次の型のマッチングを使用します: + +| MessagePackデータ型 (`INSERT`) | ClickHouseデータ型 | +|--------------------------------------------------------------------|-----------------------------------------------------------| +| `int N`, `uint N`, `negative fixint`, `positive fixint` | [Int64](../sql-reference/data-types/int-uint.md) | +| `bool` | [UInt8](../sql-reference/data-types/int-uint.md) | +| `fixstr`, `str 8`, `str 16`, `str 32`, `bin 8`, `bin 16`, `bin 32` | [String](../sql-reference/data-types/string.md) | +| `float 32` | [Float32](../sql-reference/data-types/float.md) | +| `float 64` | [Float64](../sql-reference/data-types/float.md) | +| `uint 16` | [Date](../sql-reference/data-types/date.md) | +| `uint 32` | [DateTime](../sql-reference/data-types/datetime.md) | +| `uint 64` | [DateTime64](../sql-reference/data-types/datetime.md) | +| `fixarray`, `array 16`, `array 32` | [Array](../sql-reference/data-types/array.md) | +| `fixmap`, `map 16`, `map 32` | [Map](../sql-reference/data-types/map.md) | + +デフォルトでは、すべての推測された型は `Nullable` 内にありますが、設定 `schema_inference_make_columns_nullable` を使用して変更できます。 +### BSONEachRow {#bsoneachrow} + +BSONEachRowでは、データの各行がBSONドキュメントとして表示されます。スキーマ推論において、ClickHouseはBSONドキュメントを一つずつ読み取り、データから値、名前、タイプを抽出して、次のタイプマッチを使用してこれらのタイプをClickHouseタイプに変換します: + +| BSON Type | ClickHouse type | +|-----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| `\x08` boolean | [Bool](../sql-reference/data-types/boolean.md) | +| `\x10` int32 | [Int32](../sql-reference/data-types/int-uint.md) | +| `\x12` int64 | [Int64](../sql-reference/data-types/int-uint.md) | +| `\x01` double | [Float64](../sql-reference/data-types/float.md) | +| `\x09` datetime | [DateTime64](../sql-reference/data-types/datetime64.md) | +| `\x05` binary with`\x00` binary subtype, `\x02` string, `\x0E` symbol, `\x0D` JavaScript code | [String](../sql-reference/data-types/string.md) | +| `\x07` ObjectId, | [FixedString(12)](../sql-reference/data-types/fixedstring.md) | +| `\x05` binary with `\x04` uuid subtype, size = 16 | [UUID](../sql-reference/data-types/uuid.md) | +| `\x04` array | [Array](../sql-reference/data-types/array.md)/[Tuple](../sql-reference/data-types/tuple.md) (if nested types are different) | +| `\x03` document | [Named Tuple](../sql-reference/data-types/tuple.md)/[Map](../sql-reference/data-types/map.md) (with String keys) | + +デフォルトでは、すべての推論されたタイプは`Nullable`内にありますが、設定`schema_inference_make_columns_nullable`を使用して変更することができます。 + +## 定数スキーマを持つフォーマット {#formats-with-constant-schema} + +このようなフォーマットのデータは常に同じスキーマを持ちます。 + +### LineAsString {#line-as-string} + +このフォーマットでは、ClickHouseはデータから行全体を`String`データ型の単一のカラムとして読み取ります。このフォーマットで推論されたタイプは常に`String`であり、カラム名は`line`です。 + +**例** + +```sql +DESC format(LineAsString, 'Hello\nworld!') +``` +```response +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ line │ String │ │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### JSONAsString {#json-as-string} + +このフォーマットでは、ClickHouseはデータからJSONオブジェクト全体を`String`データ型の単一のカラムとして読み取ります。このフォーマットで推論されたタイプは常に`String`であり、カラム名は`json`です。 + +**例** + +```sql +DESC format(JSONAsString, '{"x" : 42, "y" : "Hello, World!"}') +``` +```response +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ json │ String │ │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +### JSONAsObject {#json-as-object} + +このフォーマットでは、ClickHouseはデータからJSONオブジェクト全体を`Object('json')`データ型の単一のカラムとして読み取ります。推論されたタイプは常に`String`であり、カラム名は`json`です。 + +注意: このフォーマットは`allow_experimental_object_type`が有効になっている場合のみ動作します。 + +**例** + +```sql +DESC format(JSONAsString, '{"x" : 42, "y" : "Hello, World!"}') SETTINGS allow_experimental_object_type=1 +``` +```response +┌─name─┬─type───────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ json │ Object('json') │ │ │ │ │ │ +└──────┴────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## スキーマ推論モード {#schema-inference-modes} + +データファイルのセットからのスキーマ推論は2つの異なるモードで動作します:`default`および`union`。このモードは設定`schema_inference_mode`によって制御されます。 + +### デフォルトモード {#default-schema-inference-mode} + +デフォルトモードでは、ClickHouseはすべてのファイルが同じスキーマを持つと仮定し、ファイルを一つずつ読み取り、成功するまでスキーマを推論しようとします。 + +例: + +次の内容を持つ3つのファイル`data1.jsonl`、`data2.jsonl`、`data3.jsonl`があるとします: + +`data1.jsonl`: +```json +{"field1" : 1, "field2" : null} +{"field1" : 2, "field2" : null} +{"field1" : 3, "field2" : null} +``` + +`data2.jsonl`: +```json +{"field1" : 4, "field2" : "Data4"} +{"field1" : 5, "field2" : "Data5"} +{"field1" : 6, "field2" : "Data5"} +``` + +`data3.jsonl`: +```json +{"field1" : 7, "field2" : "Data7", "field3" : [1, 2, 3]} +{"field1" : 8, "field2" : "Data8", "field3" : [4, 5, 6]} +{"field1" : 9, "field2" : "Data9", "field3" : [7, 8, 9]} +``` + +これら3つのファイルにスキーマ推論を試みましょう: +```sql +:) DESCRIBE file('data{1,2,3}.jsonl') SETTINGS schema_inference_mode='default' +``` + +結果: +```text +┌─name───┬─type─────────────┐ +│ field1 │ Nullable(Int64) │ +│ field2 │ Nullable(String) │ +└────────┴──────────────────┘ +``` + +見てわかるように、ファイル`data3.jsonl`の`field3`はありません。これは、ClickHouseが最初にファイル`data1.jsonl`からスキーマを推論しようとし、フィールド`field2`のためにnullのみで失敗し、その後`data2.jsonl`からスキーマを推論して成功したため、ファイル`data3.jsonl`からのデータが読み取られなかったためです。 + +### ユニオンモード {#default-schema-inference-mode} + +ユニオンモードでは、ClickHouseはファイルが異なるスキーマを持つ可能性があると仮定し、それぞれのファイルのスキーマを推論し、それらを共通のスキーマに結合します。 + +次の内容を持つ3つのファイル`data1.jsonl`、`data2.jsonl`、`data3.jsonl`があるとします: + +`data1.jsonl`: +```json +{"field1" : 1} +{"field1" : 2} +{"field1" : 3} +``` + +`data2.jsonl`: +```json +{"field2" : "Data4"} +{"field2" : "Data5"} +{"field2" : "Data5"} +``` + +`data3.jsonl`: +```json +{"field3" : [1, 2, 3]} +{"field3" : [4, 5, 6]} +{"field3" : [7, 8, 9]} +``` + +これら3つのファイルにスキーマ推論を試みましょう: +```sql +:) DESCRIBE file('data{1,2,3}.jsonl') SETTINGS schema_inference_mode='union' +``` + +結果: +```text +┌─name───┬─type───────────────────┐ +│ field1 │ Nullable(Int64) │ +│ field2 │ Nullable(String) │ +│ field3 │ Array(Nullable(Int64)) │ +└────────┴────────────────────────┘ +``` + +見てわかるように、すべてのファイルからすべてのフィールドが含まれています。 + +注意: +- 一部のファイルには、結果のスキーマから欠けているカラムが含まれていない場合があるため、ユニオンモードは一部のカラムの読み取りをサポートするフォーマット(JSONEachRow、Parquet、TSVWithNamesなど)のみでサポートされています。他のフォーマット(CSV、TSV、JSONCompactEachRowなど)では動作しません。 +- ClickHouseがファイルの一つからスキーマを推論できない場合、例外がスローされます。 +- 多くのファイルがある場合、すべてからスキーマを読み取るのに多くの時間がかかることがあります。 + +## 自動フォーマット検出 {#automatic-format-detection} + +データフォーマットが指定されず、ファイル拡張子では決定できない場合、ClickHouseはその内容によってファイルフォーマットを検出しようとします。 + +**例:** + +次のコンテンツを持つ`data`があるとします: +``` +"a","b" +1,"Data1" +2,"Data2" +3,"Data3" +``` + +フォーマットや構造を指定せずにこのファイルを調べたりクエリを行ったりできます: +```sql +:) desc file(data); +``` + +```text +┌─name─┬─type─────────────┐ +│ a │ Nullable(Int64) │ +│ b │ Nullable(String) │ +└──────┴──────────────────┘ +``` + +```sql +:) select * from file(data); +``` + +```text +┌─a─┬─b─────┐ +│ 1 │ Data1 │ +│ 2 │ Data2 │ +│ 3 │ Data3 │ +└───┴───────┘ +``` + +:::note +ClickHouseは一部のフォーマットのみを検出可能であり、検出には時間がかかるため、フォーマットを明示的に指定することが常に望ましいです。 +::: diff --git a/docs/ja/interfaces/tcp.md b/docs/ja/interfaces/tcp.md new file mode 100644 index 00000000000..5de1eebdea3 --- /dev/null +++ b/docs/ja/interfaces/tcp.md @@ -0,0 +1,9 @@ +--- +slug: /ja/interfaces/tcp +sidebar_position: 18 +sidebar_label: ネイティブ インターフェース (TCP) +--- + +# ネイティブ インターフェース (TCP) + +ネイティブプロトコルは、[コマンドラインクライアント](../interfaces/cli.md)で使用され、分散クエリ処理中のサーバー間通信や他のC++プログラムでも使用されます。残念ながら、ネイティブClickHouseプロトコルにはまだ正式な仕様がありませんが、ClickHouseのソースコード([こちら](https://github.com/ClickHouse/ClickHouse/tree/master/src/Client)あたりから)をリバースエンジニアリングすることや、TCPトラフィックを傍受して分析することで理解できます。 diff --git a/docs/ja/interfaces/third-party/client-libraries.md b/docs/ja/interfaces/third-party/client-libraries.md new file mode 100644 index 00000000000..91cd823e3a8 --- /dev/null +++ b/docs/ja/interfaces/third-party/client-libraries.md @@ -0,0 +1,81 @@ +--- +slug: /ja/interfaces/third-party/client-libraries +sidebar_position: 26 +sidebar_label: クライアントライブラリ +description: サードパーティのクライアントライブラリ +--- + +# サードパーティ製開発者によるクライアントライブラリ + +:::note +ClickHouse Inc は以下にリストされたライブラリを**維持しておらず**、その品質を保証するための広範なテストも行っていません。 +::: + +### Python + - [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm) + - [clickhouse-driver](https://github.com/mymarilyn/clickhouse-driver) + - [clickhouse-client](https://github.com/yurial/clickhouse-client) + - [aiochclient](https://github.com/maximdanilchenko/aiochclient) + - [asynch](https://github.com/long2ice/asynch) +### PHP + - [smi2/phpclickhouse](https://packagist.org/packages/smi2/phpClickHouse) + - [8bitov/clickhouse-php-client](https://packagist.org/packages/8bitov/clickhouse-php-client) + - [bozerkins/clickhouse-client](https://packagist.org/packages/bozerkins/clickhouse-client) + - [simpod/clickhouse-client](https://packagist.org/packages/simpod/clickhouse-client) + - [seva-code/php-click-house-client](https://packagist.org/packages/seva-code/php-click-house-client) + - [SeasClick C++ client](https://github.com/SeasX/SeasClick) + - [one-ck](https://github.com/lizhichao/one-ck) + - [glushkovds/phpclickhouse-laravel](https://packagist.org/packages/glushkovds/phpclickhouse-laravel) + - [kolya7k ClickHouse PHP extension](https://github.com//kolya7k/clickhouse-php) + - [hyvor/clickhouse-php](https://github.com/hyvor/clickhouse-php) +### Go + - [clickhouse](https://github.com/kshvakov/clickhouse/) + - [go-clickhouse](https://github.com/roistat/go-clickhouse) + - [chconn](https://github.com/vahid-sohrabloo/chconn) + - [mailrugo-clickhouse](https://github.com/mailru/go-clickhouse) + - [golang-clickhouse](https://github.com/leprosus/golang-clickhouse) + - [uptrace/go-clickhouse](https://clickhouse.uptrace.dev/) +### Swift + - [ClickHouseNIO](https://github.com/patrick-zippenfenig/ClickHouseNIO) + - [ClickHouseVapor ORM](https://github.com/patrick-zippenfenig/ClickHouseVapor) +### NodeJs + - [clickhouse (NodeJs)](https://github.com/TimonKK/clickhouse) + - [node-clickhouse](https://github.com/apla/node-clickhouse) + - [nestjs-clickhouse](https://github.com/depyronick/nestjs-clickhouse) + - [clickhouse-client](https://github.com/depyronick/clickhouse-client) + - [node-clickhouse-orm](https://github.com/zimv/node-clickhouse-orm) + - [clickhouse-ts](https://github.com/bytadaniel/clickhouse-ts) + - [clickcache](https://github.com/bytadaniel/clickcache) +### Perl + - [perl-DBD-ClickHouse](https://github.com/elcamlost/perl-DBD-ClickHouse) + - [HTTP-ClickHouse](https://metacpan.org/release/HTTP-ClickHouse) + - [AnyEvent-ClickHouse](https://metacpan.org/release/AnyEvent-ClickHouse) +### Ruby + - [ClickHouse (Ruby)](https://github.com/shlima/click_house) + - [clickhouse-activerecord](https://github.com/PNixx/clickhouse-activerecord) +### Rust + - [clickhouse.rs](https://github.com/loyd/clickhouse.rs) + - [clickhouse-rs](https://github.com/suharev7/clickhouse-rs) + - [Klickhouse](https://github.com/Protryon/klickhouse) +### R + - [RClickHouse](https://github.com/IMSMWU/RClickHouse) +### Java + - [clickhouse-client-java](https://github.com/VirtusAI/clickhouse-client-java) + - [clickhouse-client](https://github.com/Ecwid/clickhouse-client) +### Scala + - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) +### Kotlin + - [AORM](https://github.com/TanVD/AORM) +### C# + - [Octonica.ClickHouseClient](https://github.com/Octonica/ClickHouseClient) + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) +### Elixir + - [clickhousex](https://github.com/appodeal/clickhousex/) + - [pillar](https://github.com/sofakingworld/pillar) + - [ecto_ch](https://github.com/plausible/ecto_ch) +### Nim + - [nim-clickhouse](https://github.com/leonardoce/nim-clickhouse) +### Haskell + - [hdbc-clickhouse](https://github.com/zaneli/hdbc-clickhouse) diff --git a/docs/ja/interfaces/third-party/gui.md b/docs/ja/interfaces/third-party/gui.md new file mode 100644 index 00000000000..8417d5cd140 --- /dev/null +++ b/docs/ja/interfaces/third-party/gui.md @@ -0,0 +1,367 @@ +--- +slug: /ja/interfaces/third-party/gui +sidebar_position: 28 +sidebar_label: Visual Interfaces +--- + +# サードパーティ開発者による視覚的インターフェース + +## オープンソース {#open-source} + +### ch-ui {#ch-ui} + +[ch-ui](https://github.com/caioricciuti/ch-ui)は、クエリの実行とデータの可視化を目的としたClickHouseデータベース用の簡単なReact.jsアプリインターフェースです。Reactとウェブ用ClickHouseクライアントで構築され、スムーズでユーザーフレンドリーなUIを提供し、データベースとの簡単なインタラクションを実現します。 + +機能: + +- ClickHouse統合: 接続を簡単に管理し、クエリを実行。 +- レスポンシブなタブ管理: クエリおよびテーブルタブのような複数のタブを動的に管理。 +- パフォーマンス最適化: 効率的なキャッシングと状態管理のためにIndexed DBを利用。 +- ローカルデータストレージ: すべてのデータはブラウザ内でローカルに保存され、他の場所には送信されません。 + +### ChartDB {#chartdb} + +[ChartDB](https://chartdb.io)は、クエリひとつでClickHouseを含むデータベーススキーマの可視化と設計ができる無料のオープンソースツールです。Reactで構築されており、データベース資格情報やサインアップなしで簡単に始められます。 + +機能: + +- スキーマの可視化: Materialized Viewや標準Viewで、テーブルへの参照を一緒に示す、ClickHouseスキーマをインポートして視覚化。 +- AI駆動のDDLエクスポート: スキーマ管理とドキュメント化を容易にするDDLスクリプトを生成。 +- マルチSQL方言サポート: さまざまなデータベース環境で使える。 +- サインアップや資格情報が不要: すべての機能がブラウザで直接アクセス可能。 + +[ChartDB ソースコード](https://github.com/chartdb/chartdb). + +### Tabix {#tabix} + +[Tabix](https://github.com/tabixio/tabix)プロジェクトのClickHouse用ウェブインターフェース。 + +機能: + +- 追加ソフトウェアをインストールすることなく、ブラウザから直接ClickHouseと連携。 +- シンタックスハイライト付きのクエリエディター。 +- コマンドのオートコンプリート機能。 +- クエリ実行のグラフィカル解析ツール。 +- カラースキームオプション。 + +[Tabix ドキュメント](https://tabix.io/doc/). + +### HouseOps {#houseops} + +[HouseOps](https://github.com/HouseOps/HouseOps) は、OSX、Linux、Windows対応のUI/IDEです。 + +機能: + +- シンタックスハイライト付きのクエリービルダー。テーブルまたはJSONビューで応答を表示。 +- クエリ結果をCSVまたはJSONとしてエクスポート。 +- 説明付きのプロセスリスト。書き込みモード。プロセスを停止(`KILL`)する機能。 +- データベースのグラフ。全テーブルとそのカラムが追加情報とともに表示。 +- カラムサイズのクイックビュー。 +- サーバー設定。 + +開発予定の機能: + +- データベース管理。 +- ユーザー管理。 +- リアルタイムデータ分析。 +- クラスターモニタリング。 +- クラスターマネジメント。 +- レプリケートされたテーブルおよびKafkaテーブルのモニタリング。 + +### LightHouse {#lighthouse} + +[LightHouse](https://github.com/VKCOM/lighthouse)は、ClickHouse用の軽量なウェブインターフェースです。 + +機能: + +- フィルターとメタデータによるテーブルリスト。 +- フィルターとソートによるテーブルプレビュー。 +- 読み取り専用のクエリ実行。 + +### Redash {#redash} + +[Redash](https://github.com/getredash/redash)はデータの視覚化プラットフォームです。 + +ClickHouseを含む複数のデータソースをサポートし、異なるデータソースからのクエリ結果を1つの最終データセットに結合できます。 + +機能: + +- 強力なクエリエディタ。 +- データベースエクスプローラー。 +- データを異なる形式で表現する視覚化ツール。 + +### Grafana {#grafana} + +[Grafana](https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/)は、監視と視覚化のためのプラットフォームです。 + +Grafanaは、どこに保管された指標でもクエリし、視覚化し、アラートを設定し、理解することを可能にします。チームとダッシュボードを作成、探索、共有し、データ駆動型の文化を促進します。コミュニティに信頼され、愛されています — grafana.com。 + +ClickHouseデータソースプラグインは、バックエンドデータベースとしてClickHouseをサポートします。 + +### qryn {#qryn} + +[qryn](https://metrico.in)は、ClickHouse用の高性能オブザーバビリティスタックで、ネイティブGrafana統合を備え、Loki/LogQL、Prometheus/PromQL、OTLP/Tempo、Elastic、InfluxDBなどをサポートする任意のエージェントからのログ、メトリクス、テレメトリトレースをインジェストして分析することができます。 + +機能: + +- クエリ、抽出、データの視覚化のための内蔵Explore UIとLogQL CLI +- プラグインなしでクエリ、処理、インジェスト、トレース、アラートのネイティブGrafana APIサポート +- ログ、イベント、トレースなどから動的にデータを検索、フィルタリング、抽出する強力なパイプライン +- LogQL、PromQL、InfluxDB、Elasticなどと互換性のあるインジェストとPUSH API +- Promtail、Grafana-Agent、Vector、Logstash、Telegrafなどのエージェントと即時使用可能 + +### DBeaver {#dbeaver} + +[DBeaver](https://dbeaver.io/) - ClickHouseサポートを持つユニバーサルデスクトップデータベースクライアント。 + +機能: + +- シンタックスハイライトとオートコンプリート付きのクエリ開発。 +- フィルターとメタデータ検索付きのテーブルリスト。 +- テーブルデータプレビュー。 +- 全文検索。 + +デフォルトでは、DBeaverはセッション(例としてCLIが行うような)を使用して接続しません。セッションサポートが必要な場合(例えば、セッションの設定を行うため)、ドライバー接続プロパティを編集して`session_id`をランダムな文字列に設定してください(内部ではhttp接続を使用します)。その後、クエリウィンドウから任意の設定を使用できます。 + +### clickhouse-cli {#clickhouse-cli} + +[clickhouse-cli](https://github.com/hatarist/clickhouse-cli)は、Python 3で書かれたClickHouse用の代替コマンドラインクライアントです。 + +機能: + +- オートコンプリート。 +- クエリとデータ出力のシンタックスハイライト。 +- データ出力のページャーサポート。 +- カスタムPostgreSQLライクなコマンド。 + +### clickhouse-flamegraph {#clickhouse-flamegraph} + +[clickhouse-flamegraph](https://github.com/Slach/clickhouse-flamegraph)は、`system.trace_log`を[flamegraph](http://www.brendangregg.com/flamegraphs.html)として視覚化するための特殊なツールです。 + +### clickhouse-plantuml {#clickhouse-plantuml} + +[clickhouse-plantuml](https://pypi.org/project/clickhouse-plantuml/)は、テーブルのスキームの[PlantUML](https://plantuml.com/)ダイアグラムを生成するスクリプトです。 + +### xeus-clickhouse {#xeus-clickhouse} + +[xeus-clickhouse](https://github.com/wangfenjin/xeus-clickhouse)は、ClickHouse用のJupyterカーネルであり、JupyterでSQLを使ってCHデータにクエリを実行することをサポートします。 + +### MindsDB Studio {#mindsdb} + +[MindsDB](https://mindsdb.com/)は、最先端の機械学習モデルを簡単に開発、トレーニング、デプロイできる、ClickHouseを含むデータベース用のオープンソースAI層です。MindsDB Studio(GUI)は、データベースから新しいモデルをトレーニングし、モデルが行った予測を解釈し、潜在的なデータバイアスを識別し、Explainable AI機能を使用してモデルの正確性を評価および視覚化することで、機械学習モデルをより迅速に適応および調整することができます。 + +### DBM {#dbm} + +[DBM](https://github.com/devlive-community/dbm) DBMは、ClickHouse用の視覚管理ツールです! + +機能: + +- クエリ履歴のサポート(ページネーション、すべてクリアなど) +- 選択したSQL句クエリをサポート +- クエリの終了をサポート +- テーブル管理(メタデータ、削除、プレビュー)のサポート +- データベース管理(削除、作成)のサポート +- カスタムクエリのサポート +- 複数データソースの管理(接続テスト、監視)のサポート +- モニター(プロセッサー、接続、クエリ)サポート +- データの移行サポート + +### Bytebase {#bytebase} + +[Bytebase](https://bytebase.com)は、チーム向けのウェブベースでオープンソースのスキーマ変更とバージョン管理ツールです。ClickHouseを含むさまざまなデータベースをサポートしています。 + +機能: + +- 開発者とDBA間のスキーマレビュー。 +- Database-as-Code、スキーマをGitLabのようなVCSでバージョン管理し、コードコミット時にデプロイメントをトリガー。 +- 環境ごとのポリシー付きストリームラインドデプロイ。 +- 完全な移行履歴。 +- スキーマのドリフト検出。 +- バックアップとリストア。 +- RBAC。 + +### Zeppelin-Interpreter-for-ClickHouse {#zeppelin-interpreter-for-clickhouse} + +[Zeppelin-Interpreter-for-ClickHouse](https://github.com/SiderZhang/Zeppelin-Interpreter-for-ClickHouse)は、ClickHouse用の[Zeppelin](https://zeppelin.apache.org)インタープリターです。JDBCインタープリターと比較すると、長時間実行されるクエリに対してより良いタイムアウト制御を提供できます。 + +### ClickCat {#clickcat} + +[ClickCat](https://github.com/clickcat-project/ClickCat)は、ClickHouseデータを検索、探索、可視化するのに役立つフレンドリーなユーザーインターフェースです。 + +機能: + +- インストールなしでSQLコードを実行できるオンラインSQLエディター。 +- 全プロセスと変異を観察可能。未完のプロセスはUIから殺すことができます。 +- メトリクスには、クラスタ解析、データ解析、クエリ解析が含まれます。 + +### ClickVisual {#clickvisual} + +[ClickVisual](https://clickvisual.net/) はClickVisualは軽量のオープンソースのログクエリ、分析、アラームビジュアル化プラットフォームです。 + +機能: + +- 分析ログライブラリのワンクリック作成をサポート +- ログ収集設定の管理をサポート +- ユーザー定義のインデックス設定をサポート +- アラーム設定をサポート +- ライブラリとテーブルの権限設定のサポート + +### ClickHouse-Mate {#clickmate} + +[ClickHouse-Mate](https://github.com/metrico/clickhouse-mate)は、ClickHouseでデータを検索し、探索するためのAngularウェブクライアント+ユーザーインターフェースです。 + +機能: + +- ClickHouse SQLクエリオートコンプリート +- 高速のデータベースおよびテーブルツリーナビゲーション +- 高度な結果フィルタリングおよびソート +- インラインClickHouse SQLドキュメント +- クエリプリセットと履歴 +- 100%ブラウザベース、サーバー/バックエンドなし + +クライアントはGitHubページを通じて即時使用可能: https://metrico.github.io/clickhouse-mate/ + +### Uptrace {#uptrace} + +[Uptrace](https://github.com/uptrace/uptrace)は、OpenTelemetryとClickHouseにより分散トレースとメトリクスを提供するAPMツールです。 + +機能: + +- [OpenTelemetryトレース](https://uptrace.dev/opentelemetry/distributed-tracing.html)、メトリクス、およびログ。 +- AlertManagerを使用したEmail/Slack/PagerDuty通知。 +- スパンを集約するためのSQLライクなクエリ言語。 +- メトリクスをクエリするためのPromqlライクな言語。 +- 事前構築されたメトリクスダッシュボード。 +- YAML設定による複数ユーザー/プロジェクト。 + +### clickhouse-monitoring {#clickhouse-monitoring} + +[clickhouse-monitoring](https://github.com/duyet/clickhouse-monitoring)は、`system.*`テーブルに基づいてClickHouseクラスターを監視し、その概要を提供するシンプルなNext.jsダッシュボードです。 + +機能: + +- クエリモニター: 現在のクエリ、クエリ履歴、クエリリソース(メモリ、読み取り部、file_openなど)、最も高コストのクエリ、最も使用されるテーブルまたはカラムなど。 +- クラスターモニター: 合計メモリ/CPU使用量、分散キュー、グローバル設定、mergetree設定、指標など。 +- テーブルとパーツの情報: サイズ、行数、圧縮、パーツサイズなど、カラムレベルの詳細。 +- 有用なツール: Zookeeperデータ探査、クエリEXPLAIN、クエリのキルなど。 +- 視覚化メトリックチャート: クエリとリソース使用量、マージ/ミューテーションの数、マージパフォーマンス、クエリパフォーマンスなど。 + +### CKibana {#ckibana} + +[CKibana](https://github.com/TongchengOpenSource/ckibana)は、ネイティブKibana UIを使用してClickHouseデータを検索、探索、可視化できる軽量サービスです。 + +機能: + +- ネイティブKibana UIからのチャートリクエストをClickHouseクエリ構文に変換。 +- サンプリングやキャッシングなどの高度な機能をサポートし、クエリパフォーマンスを向上。 +- ElasticSearchからClickHouseに移行後の学習コストを最小限に。 + +## コマーシャル {#commercial} + +### DataGrip {#datagrip} + +[DataGrip](https://www.jetbrains.com/datagrip/)はJetBrains提供のデータベースIDEで、ClickHouseに特化したサポートがあります。これはその他のIntelliJベースのツールにも組み込まれています: PyCharm、IntelliJ IDEA、GoLand、PhpStormなど。 + +機能: + +- 非常に高速なコード補完。 +- ClickHouseのシンタックスハイライト。 +- ClickHouseに特有の機能、例えば入れ子になったカラムやテーブルエンジンのサポート。 +- データエディタ。 +- リファクタリング。 +- 検索とナビゲーション。 + +### Yandex DataLens {#yandex-datalens} + +[Yandex DataLens](https://cloud.yandex.ru/services/datalens)はデータの視覚化と分析サービスです。 + +機能: + +- シンプルな棒グラフから複雑なダッシュボードまで幅広い視覚化が可能。 +- ダッシュボードは公開可能。 +- ClickHouseを含む複数のデータソースのサポート。 +- Materialized Viewに基づいたデータのストレージ。 + +DataLensは、[商用利用においても低負荷プロジェクトに対して無料](https://cloud.yandex.com/docs/datalens/pricing)で利用可能です。 + +- [DataLens ドキュメント](https://cloud.yandex.com/docs/datalens/)。 +- [チュートリアル](https://cloud.yandex.com/docs/solutions/datalens/data-from-ch-visualization)で、ClickHouseデータベースからのデータの視覚化について学ぶ。 + +### Holistics Software {#holistics-software} + +[Holistics](https://www.holistics.io/)は全スタックのデータプラットフォームとビジネスインテリジェンスツールです。 + +機能: + +- レポートの自動メール、Slack、Googleシートスケジュール。 +- バージョン管理、オートコンプリート、再利用可能なクエリコンポーネント、動的フィルター付きの視覚化付きSQLエディタ。 +- iframeを介したレポートとダッシュボードの埋め込み分析。 +- データ準備とETL機能。 +- 関連付けによるデータモデリングのためのSQLデータモデリングサポート。 + +### Looker {#looker} + +[Looker](https://looker.com)は、ClickHouseを含む50以上のデータベース方言をサポートするデータプラットフォームおよびビジネスインテリジェンスツールです。LookerはSaaSプラットフォームとして利用できるほか、自社でホスティングすることもできます。ユーザーはブラウザを介してLookerを使用し、データを探索し、ビジュアライゼーションとダッシュボードを構築し、レポートをスケジュールし、同僚と洞察を共有できます。Lookerはこれらの機能を他のアプリケーションに埋め込むための豊富なツールセットを提供し、データを他のアプリケーションと統合するためのAPIも提供します。 + +機能: + +- [データモデリング](https://looker.com/platform/data-modeling)をサポートするLookMLの使用による簡単で機敏な開発。 +- Lookerの[Data Actions](https://looker.com/platform/actions)を介した強力なワークフロー統合。 + +[LookerでClickHouseを設定する方法](https://docs.looker.com/setup-and-management/database-config/clickhouse)。 + +### SeekTable {#seektable} + +[SeekTable](https://www.seektable.com)はデータ探索と運用レポートのためのセルフサービスBIツールです。クラウドサービスとセルフホステッドバージョンの両方で利用可能です。SeekTableからのレポートは任意のウェブアプリに埋め込むことができます。 + +機能: + +- ビジネスユーザーに優しいレポートビルダー。 +- SQLフィルタリングとレポート特有のクエリカスタマイズのための強力なレポートパラメータ。 +- ClickHouseにはネイティブなTCP/IPエンドポイントとHTTP(S)インターフェースのどちらも接続可能(2つの異なるドライバー)。 +- ClickHouse SQL方言のすべての力をディメンション/メジャーの定義で使用可能。 +- レポートの自動生成のための[Web API](https://www.seektable.com/help/web-api-integration)を提供。 +- アカウントデータの[バックアップ/リストア](https://www.seektable.com/help/self-hosted-backup-restore)により、レポート開発のフローをサポート; データモデル(キューブ)/レポート構成は人間が読めるXMLであり、バージョン管理システムで管理可能。 + +SeekTableは、個人または個人利用のために[無料](https://www.seektable.com/help/cloud-pricing)です。 + +[SeekTableでのClickHouse接続設定方法。](https://www.seektable.com/help/clickhouse-pivot-table) + +### Chadmin {#chadmin} + +[Chadmin](https://github.com/bun4uk/chadmin)は、ClickHouseクラスターで現在実行されているクエリを視覚化し、それらの情報を表示し、必要に応じてクエリを停止できるシンプルなUIです。 + +### TABLUM.IO {#tablum_io} + +[TABLUM.IO](https://tablum.io/) は、ETLと視覚化のためのオンラインクエリおよび分析ツールです。ClickHouseに接続し、用途の広いSQLコンソールを介してデータをクエリしたり、静的ファイルやサードパーティサービスからデータをロードすることができます。TABLUM.IOはデータ結果をチャートやテーブルとして視覚化できます。 + +機能: +- ETL: 人気のあるデータベース、ローカルおよびリモートファイル、API呼び出しからのデータロード。 +- シンタックスハイライト付きの用途の広いSQLコンソールとビジュアルクエリビルダー。 +- チャートおよびテーブルとしてのデータ視覚化。 +- データのマテリアライズおよびサブクエリ。 +- Slack、Telegram、メールへのデータレポート。 +- 独自のAPIを介したデータパイプライン。 +- JSON、CSV、SQL、HTML形式でのデータエクスポート。 +- ウェブベースインターフェース。 + +TABLUM.IOは、セルフホストソリューション(Dockerイメージとして)またはクラウドで実行可能です。 +ライセンス: 3ヶ月無料期間の[商用製品](https://tablum.io/pricing)。 + +クラウドで無料で試用する [クラウドで試用](https://tablum.io/try)。 +詳しくは、[TABLUM.IO](https://tablum.io/)で製品について学ぶ。 + +### CKMAN {#ckman} + +[CKMAN](https://www.github.com/housepower/ckman)は、ClickHouseクラスタの管理と監視のためのツールです! + +機能: + +- ブラウザインターフェイスを通じた便利で迅速なクラスタの自動展開 +- クラスタのスケールまたはスケールダウン +- クラスターデータのロードバランス +- クラスターをオンラインでアップグレード +- ページでクラスタ設定を変更 +- クラスタノードの監視とZookeeper監視を提供 +- テーブルとパーティションの状態や遅いSQLステートメントを監視 +- 使いやすいSQL実行ページを提供 diff --git a/docs/ja/interfaces/third-party/index.md b/docs/ja/interfaces/third-party/index.md new file mode 100644 index 00000000000..114abf9817f --- /dev/null +++ b/docs/ja/interfaces/third-party/index.md @@ -0,0 +1,18 @@ +--- +slug: /ja/interfaces/third-party/ +toc_folder_title: Third-Party +sidebar_position: 24 +--- + +# サードパーティ製インターフェース + +これは、ClickHouse に対する何らかのインターフェースを提供するサードパーティ製ツールへのリンク集です。視覚的インターフェース、コマンドラインインターフェース、または API のいずれかとすることができます: + +- [クライアントライブラリ](../../interfaces/third-party/client-libraries.md) +- [統合](../../interfaces/third-party/integrations.md) +- [GUI](../../interfaces/third-party/gui.md) +- [プロキシ](../../interfaces/third-party/proxy.md) + +:::note +[ODBC](../../interfaces/odbc.md) や [JDBC](../../interfaces/jdbc.md) などの共通 API をサポートしている汎用ツールは通常 ClickHouse でも動作しますが、あまりに多すぎるためここには一覧されていません。 +::: diff --git a/docs/ja/interfaces/third-party/integrations.md b/docs/ja/interfaces/third-party/integrations.md new file mode 100644 index 00000000000..086d0929027 --- /dev/null +++ b/docs/ja/interfaces/third-party/integrations.md @@ -0,0 +1,115 @@ +--- +slug: /ja/interfaces/third-party/integrations +sidebar_position: 27 +sidebar_label: インテグレーション +--- + +# サードパーティ開発者によるインテグレーションライブラリ + +:::note 免責事項 +ClickHouse, Inc. は、以下にリストされているツールやライブラリを**管理しておらず**、その品質を保証するために広範なテストを行っているわけではありません。 +::: + +## インフラ製品 {#infrastructure-products} + +- リレーショナルデータベース管理システム + - [MySQL](https://www.mysql.com) + - [mysql2ch](https://github.com/long2ice/mysql2ch) + - [ProxySQL](https://github.com/sysown/proxysql/wiki/ClickHouse-Support) + - [clickhouse-mysql-data-reader](https://github.com/Altinity/clickhouse-mysql-data-reader) + - [horgh-replicator](https://github.com/larsnovikov/horgh-replicator) + - [PostgreSQL](https://www.postgresql.org) + - [clickhousedb_fdw](https://github.com/Percona-Lab/clickhousedb_fdw) + - [infi.clickhouse_fdw](https://github.com/Infinidat/infi.clickhouse_fdw) (使用 [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [pg2ch](https://github.com/mkabilov/pg2ch) + - [clickhouse_fdw](https://github.com/adjust/clickhouse_fdw) + - [MSSQL](https://en.wikipedia.org/wiki/Microsoft_SQL_Server) + - [ClickHouseMigrator](https://github.com/zlzforever/ClickHouseMigrator) +- メッセージキュー + - [Kafka](https://kafka.apache.org) + - [clickhouse_sinker](https://github.com/housepower/clickhouse_sinker) (使用 [Go client](https://github.com/ClickHouse/clickhouse-go/)) + - [stream-loader-clickhouse](https://github.com/adform/stream-loader) +- バッチ処理 + - [Spark](https://spark.apache.org) + - [spark-clickhouse-connector](https://github.com/housepower/spark-clickhouse-connector) +- ストリーム処理 + - [Flink](https://flink.apache.org) + - [flink-clickhouse-sink](https://github.com/ivi-ru/flink-clickhouse-sink) +- オブジェクトストレージ + - [S3](https://en.wikipedia.org/wiki/Amazon_S3) + - [clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup) +- コンテナオーケストレーション + - [Kubernetes](https://kubernetes.io) + - [clickhouse-operator](https://github.com/Altinity/clickhouse-operator) +- 構成管理 + - [puppet](https://puppet.com) + - [innogames/clickhouse](https://forge.puppet.com/innogames/clickhouse) + - [mfedotov/clickhouse](https://forge.puppet.com/mfedotov/clickhouse) +- モニタリング + - [Graphite](https://graphiteapp.org) + - [graphouse](https://github.com/ClickHouse/graphouse) + - [carbon-clickhouse](https://github.com/lomik/carbon-clickhouse) + - [graphite-clickhouse](https://github.com/lomik/graphite-clickhouse) + - [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer) - staledパーティションを最適化し、[ロールアップ設定](../../engines/table-engines/mergetree-family/graphitemergetree.md#rollup-configuration)のルールが適用可能か確認 + - [Grafana](https://grafana.com/) + - [clickhouse-grafana](https://github.com/Vertamedia/clickhouse-grafana) + - [Prometheus](https://prometheus.io/) + - [clickhouse_exporter](https://github.com/f1yegor/clickhouse_exporter) + - [PromHouse](https://github.com/Percona-Lab/PromHouse) + - [clickhouse_exporter](https://github.com/hot-wifi/clickhouse_exporter) (使用 [Go client](https://github.com/kshvakov/clickhouse/)) + - [Nagios](https://www.nagios.org/) + - [check_clickhouse](https://github.com/exogroup/check_clickhouse/) + - [check_clickhouse.py](https://github.com/innogames/igmonplugins/blob/master/src/check_clickhouse.py) + - [Zabbix](https://www.zabbix.com) + - [clickhouse-zabbix-template](https://github.com/Altinity/clickhouse-zabbix-template) + - [Sematext](https://sematext.com/) + - [clickhouse integration](https://github.com/sematext/sematext-agent-integrations/tree/master/clickhouse) +- ロギング + - [rsyslog](https://www.rsyslog.com/) + - [omclickhouse](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html) + - [fluentd](https://www.fluentd.org) + - [loghouse](https://github.com/flant/loghouse) (for [Kubernetes](https://kubernetes.io)) + - [logagent](https://www.sematext.com/logagent) + - [logagent output-plugin-clickhouse](https://sematext.com/docs/logagent/output-plugin-clickhouse/) +- 地理情報 + - [MaxMind](https://dev.maxmind.com/geoip/) + - [clickhouse-maxmind-geoip](https://github.com/AlexeyKupershtokh/clickhouse-maxmind-geoip) +- AutoML + - [MindsDB](https://mindsdb.com/) + - [MindsDB](https://github.com/mindsdb/mindsdb) - ClickHouseとの統合により、ClickHouseのデータを多様なAI/MLモデルで利用可能にします。 + +## プログラミング言語エコシステム {#programming-language-ecosystems} + +- Python + - [SQLAlchemy](https://www.sqlalchemy.org) + - [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) (使用 [infi.clickhouse_orm](https://github.com/Infinidat/infi.clickhouse_orm)) + - [PyArrow/Pandas](https://pandas.pydata.org) + - [Ibis](https://github.com/ibis-project/ibis) +- PHP + - [Doctrine](https://www.doctrine-project.org/) + - [dbal-clickhouse](https://packagist.org/packages/friendsofdoctrine/dbal-clickhouse) +- R + - [dplyr](https://db.rstudio.com/dplyr/) + - [RClickHouse](https://github.com/IMSMWU/RClickHouse) (使用 [clickhouse-cpp](https://github.com/artpaul/clickhouse-cpp)) +- Java + - [Hadoop](http://hadoop.apache.org) + - [clickhouse-hdfs-loader](https://github.com/jaykelin/clickhouse-hdfs-loader) (使用 [JDBC](../../sql-reference/table-functions/jdbc.md)) +- Scala + - [Akka](https://akka.io) + - [clickhouse-scala-client](https://github.com/crobox/clickhouse-scala-client) +- C# + - [ADO.NET](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-overview) + - [ClickHouse.Ado](https://github.com/killwort/ClickHouse-Net) + - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) + - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) + - [ClickHouse.Net.Migrations](https://github.com/ilyabreev/ClickHouse.Net.Migrations) + - [Linq To DB](https://github.com/linq2db/linq2db) +- Elixir + - [Ecto](https://github.com/elixir-ecto/ecto) + - [clickhouse_ecto](https://github.com/appodeal/clickhouse_ecto) +- Ruby + - [Ruby on Rails](https://rubyonrails.org/) + - [activecube](https://github.com/bitquery/activecube) + - [ActiveRecord](https://github.com/PNixx/clickhouse-activerecord) + - [GraphQL](https://github.com/graphql) + - [activecube-graphql](https://github.com/bitquery/activecube-graphql) diff --git a/docs/ja/interfaces/third-party/proxy.md b/docs/ja/interfaces/third-party/proxy.md new file mode 100644 index 00000000000..697ed26cb35 --- /dev/null +++ b/docs/ja/interfaces/third-party/proxy.md @@ -0,0 +1,43 @@ +--- +slug: /ja/interfaces/third-party/proxy +sidebar_position: 29 +sidebar_label: プロキシ +--- + +# サードパーティ開発者によるプロキシサーバー + +## chproxy {#chproxy} + +[chproxy](https://github.com/Vertamedia/chproxy) は、ClickHouseデータベース用のHTTPプロキシおよびロードバランサです。 + +特徴: + +- ユーザーごとのルーティングとレスポンスキャッシュ。 +- 柔軟な制限。 +- 自動SSL証明書の更新。 + +Goで実装されています。 + +## KittenHouse {#kittenhouse} + +[KittenHouse](https://github.com/VKCOM/kittenhouse) は、アプリケーション側でINSERTデータをバッファリングすることが不可能または不便な場合に、ClickHouseとアプリケーションサーバー間のローカルプロキシとして設計されています。 + +特徴: + +- メモリ内およびディスク上でのデータバッファリング。 +- テーブルごとのルーティング。 +- ロードバランシングとヘルスチェック。 + +Goで実装されています。 + +## ClickHouse-Bulk {#clickhouse-bulk} + +[ClickHouse-Bulk](https://github.com/nikepan/clickhouse-bulk) は、シンプルなClickHouseインサートコレクターです。 + +特徴: + +- リクエストをグループ化し、しきい値または間隔で送信。 +- 複数のリモートサーバー。 +- 基本認証。 + +Goで実装されています。 diff --git a/docs/ja/intro.md b/docs/ja/intro.md new file mode 100644 index 00000000000..8837dfd48ad --- /dev/null +++ b/docs/ja/intro.md @@ -0,0 +1,69 @@ +--- +slug: /ja +sidebar_label: ClickHouseとは? +description: "ClickHouse®は、オンライン分析処理(OLAP)向けの列指向SQLデータベース管理システム(DBMS)です。オープンソースソフトウェアとしても、クラウド提供としても利用可能です。" +title: ClickHouseとは? +--- + +ClickHouse®は、オンライン分析処理(OLAP)向けの高性能な列指向SQLデータベース管理システム(DBMS)です。これには、[オープンソースソフトウェア](https://github.com/ClickHouse/ClickHouse)としての提供と、[クラウド提供](https://clickhouse.com/cloud)の両方があります。 + +## 分析とは? + +分析、またはOLAP(オンライン分析処理)は、大規模なデータセットに対して複雑な計算(例:集計、文字列処理、算術演算)を行うSQLクエリを指します。 + +トランザクションクエリ(またはOLTP、オンライン・トランザクション処理)は、1クエリあたり数行のみを読み書きし、ミリ秒で完了するのに対し、分析クエリは通常、数十億、数兆の行を処理します。 + +多くのユースケースでは、[分析クエリは「リアルタイム」でなければならない](https://clickhouse.com/engineering-resources/what-is-real-time-analytics)、つまり1秒未満で結果を返す必要があります。 + +## 行指向ストレージと列指向ストレージ + +そのようなパフォーマンスレベルは、適切なデータの「指向」でのみ達成できます。 + +データベースはデータを行指向または列指向で格納します。 + +行指向データベースでは、連続するテーブル行が順次に格納されます。このレイアウトにより、行のカラム値が一緒に格納されているため、行を迅速に取得することができます。 + +ClickHouseは列指向データベースです。こうしたシステムでは、テーブルはカラムのコレクションとして格納されます。つまり、各カラムの値が順次に格納されます。このレイアウトは、単一の行を復元するのが困難(行の値の間にギャップがあるため)ですが、フィルタリングや集計といったカラム操作が行指向データベースよりもはるかに速くなります。 + +この違いは、3つのカラムでフィルタリングを行う例のクエリで最もよく説明できます: + +```sql +SELECT * +FROM table +WHERE time > ‘2024-09-01 13:14:15’ +AND location = ‘Berlin’ +AND `Mobile Phone` LIKE ‘%61010%` +``` + +**行指向DBMS** + +![Row-oriented](@site/docs/ja/images/row-oriented.gif#) + +**列指向DBMS** + +![Column-oriented](@site/docs/ja/images/column-oriented.gif#) + +## データのレプリケーションと整合性 + +ClickHouseは、非同期のマルチマスターレプリケーション方式を使用して、データが複数のノードに冗長的に格納されることを保証します。任意の利用可能なレプリカに書き込まれた後、残りのレプリカがバックグラウンドでコピーを取得します。システムは異なるレプリカ間で同一のデータを維持します。ほとんどの障害からの復旧は自動的に、あるいは複雑なケースでは半自動的に行われます。 + +## ロールベースのアクセス制御 + +ClickHouseは、SQLクエリを使用したユーザーアカウント管理を実装し、ANSI SQL標準や一般的なリレーショナルデータベース管理システムで見られるようなロールベースのアクセス制御設定を可能にします。 + +## SQLサポート + +ClickHouseは、ANSI SQL標準と多くの場合同一である[SQLに基づく宣言的クエリ言語](/docs/ja/sql-reference)をサポートします。サポートされているクエリ句には、[GROUP BY](/docs/ja/sql-reference/statements/select/group-by)、[ORDER BY](/docs/ja/sql-reference/statements/select/order-by)、[FROM](/docs/ja/sql-reference/statements/select/from)でのサブクエリ、[JOIN](/docs/ja/sql-reference/statements/select/join)句、[IN](/docs/ja/sql-reference/operators/in)演算子、[ウィンドウ関数](/docs/ja/sql-reference/window-functions)、スカラーサブクエリが含まれます。 + +## 近似計算 + +ClickHouseはパフォーマンスを向上させるために正確さを犠牲にする方法を提供します。例えば、一部の集計関数は、異なる値のカウント、中央値、分位点を近似的に計算します。また、クエリはデータのサンプルに対して実行され、迅速に近似結果を計算できます。最後に、すべてのキーではなく、限られた数のキーで集計を実行できます。キーの分布の偏りによっては、正確な計算よりもはるかに少ないリソースを使用しつつ、合理的に正確な結果を提供できます。 + +## アダプティブ結合アルゴリズム + +ClickHouseは結合アルゴリズムを適応的に選択し、最初に高速なハッシュ結合を使用し、大きなテーブルが複数ある場合にマージ結合にフォールバックします。 + +## 優れたクエリパフォーマンス + +ClickHouseは極めて高速なクエリパフォーマンスで知られています。 +ClickHouseがなぜこれほど速いのかを知るには、[ClickHouseはなぜ速いのか?](/docs/ja/concepts/why-clickhouse-is-so-fast.md)ガイドを参照してください。 diff --git a/docs/ja/managing-data/deletes.md b/docs/ja/managing-data/deletes.md new file mode 100644 index 00000000000..19a4d04f577 --- /dev/null +++ b/docs/ja/managing-data/deletes.md @@ -0,0 +1,71 @@ +--- +slug: /ja/deletes +title: データの削除 +description: ClickHouseでデータを削除する方法 +keywords: [削除, トランケート, ドロップ, 論理削除] +--- + +ClickHouseではデータを削除するためのいくつかの方法があり、それぞれに利点とパフォーマンス特性があります。データモデルと削除する予定のデータ量に基づいて適切な方法を選択する必要があります。 + +| 方法 | 構文 | 使用のタイミング | +| --- | --- | --- | +| [論理削除](/ja/guides/developer/lightweight-delete) | `DELETE FROM [table]` | 小規模なデータを削除する場合に使用します。`SELECT`クエリからすぐにフィルタリングされますが、最初は内部的に削除済みとしてマークされるだけで、ディスクからは削除されません。 | +| [物理削除](/ja/sql-reference/statements/alter/delete) | `ALTER TABLE [table] DELETE` | ディスクからすぐにデータを削除する必要がある場合に使用します(例:コンプライアンス目的)。`SELECT`のパフォーマンスに悪影響を及ぼします。 | +| [テーブルをトランケート](/ja/sql-reference/statements/truncate) | `TRUNCATE TABLE [db.table]` | テーブルからすべてのデータを効率的に削除します。 | +| [パーティションをドロップ](/ja/sql-reference/statements/alter/partition#drop-partitionpart) | `DROP PARTITION` | パーティションからすべてのデータを効率的に削除します。 | + +ClickHouseでデータを削除するさまざまな方法の概要は以下の通りです。 + +## 論理削除 + +論理削除により、行は削除済みとしてマークされ、すべての後続の`SELECT`クエリから自動的にフィルタリングされます。削除された行のその後の削除は自然なマージサイクル中に行われるため、I/Oが少なくなります。そのため、未指定の期間、データは実際にはストレージから削除されず、削除としてマークされるのみです。データが確実に削除されることを保証する必要がある場合は、上記のミューテーションコマンドを検討してください。 + +```sql +-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。 +DELETE FROM posts WHERE toYear(CreationDate) = 2018 +``` + +論理削除ステートメントを使用して大量のデータを削除すると、`SELECT`クエリのパフォーマンスに悪影響を及ぼす可能性もあります。このコマンドは、プロジェクションを持つテーブルには互換性がありません。 + +操作には削除された行を[マークするためのミューテーション](/ja/sql-reference/statements/delete#how-lightweight-deletes-work-internally-in-clickhouse)(`_row_exists`カラムを追加)に関連したI/Oが生じます。 + +一般に、削除されたデータがディスク上に存在することが許容される場合(非コンプライアンスケースなど)、論理削除を物理削除よりも優先するべきです。すべてのデータを削除する必要がある場合は、このアプローチは避けるべきです。 + +[論理削除](/ja/guides/developer/lightweight-delete)について詳しく読む。 + +## 物理削除 + +論理削除は`ALTER TABLE … DELETE`コマンドを通じて発行できます。例: + +```sql +-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。 +ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018 +``` + +これらは同期的に(非レプリケートのデフォルト)、または非同期的に([mutations_sync](/ja/operations/settings/settings#mutations_sync)設定により決定)実行できます。`WHERE`式に一致するすべての部分を再書き込みするため、非常にI/Oが多くなります。このプロセスにはアトミック性がなく、部分が準備ができ次第、ミューテーションされた部分に置き換えられます。ミューテーション中に実行される`SELECT`クエリは、すでにミューテーションされた部分のデータとまだミューテーションされていない部分のデータの両方を観察します。進行状況の状態は[systems.mutations](/ja/operations/system-tables/mutations#system_tables-mutations)テーブルを通して確認できます。これらはI/Oが多い操作であり、クラスタの`SELECT`パフォーマンスに影響を与える可能性があるため、慎重に使用するべきです。 + +[論理削除](/ja/sql-reference/statements/alter/delete)について詳しく読む。 + +## テーブルをトランケート + +テーブル内のすべてのデータを削除する必要がある場合は、以下の`TRUNCATE TABLE`コマンドを使用してください。これは論理な操作です。 + +```sql +TRUNCATE TABLE posts +``` + +[TRUNCATE TABLE](/ja/sql-reference/statements/truncate)について詳しく読む。 + +## パーティションをドロップ + +データにカスタムパーティションキーを指定している場合、パーティションを効率的にドロップできます。高カーディナリティのパーティショニングは避けてください。 + +```sql +ALTER TABLE posts (DROP PARTITION '2008') +``` + +[DROP PARTITION](/ja/sql-reference/statements/alter/partition)について詳しく読む。 + +## その他のリソース + +- [ClickHouseでのアップデートと削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/managing-data/updates.md b/docs/ja/managing-data/updates.md new file mode 100644 index 00000000000..56571504cc4 --- /dev/null +++ b/docs/ja/managing-data/updates.md @@ -0,0 +1,81 @@ +--- +slug: /ja/updating-data +title: データの更新 +description: ClickHouseでデータを更新する方法 +keywords: [更新, データ更新] +--- + +## ClickHouseとOLTPデータベースにおけるデータ更新の違い + +更新を処理する際、ClickHouseとOLTPデータベースは、その基礎となる設計理念とターゲットユースケースの違いにより大きく分かれます。例えば、PostgreSQLは行指向でACID準拠のリレーショナルデータベースであり、マルチバージョン同時実行制御(MVCC)などのメカニズムを通じて、堅牢かつトランザクション性のある更新および削除操作をサポートし、データの整合性を確保します。これにより、高い同時実行環境でも安全かつ信頼性のある修正が可能です。 + +一方、ClickHouseは読み込みが多い分析と高スループットの追加のみの操作に最適化された列指向のデータベースです。インプレース更新と削除をネイティブでサポートしていますが、高いI/Oを避けるため注意して使用する必要があります。別の方法として、削除や更新を非同期的または読み取り時に処理される追加操作に変換するようにテーブルを再構築することができ、リアルタイムのデータ操作よりも高スループットのデータ取り込みと効率的なクエリパフォーマンスに重点を置いています。 + +## ClickHouseでデータを更新する方法 + +ClickHouseでは、データを更新する方法がいくつかあり、それぞれに利点とパフォーマンスの特徴があります。使用するデータモデルと更新予定量に基づいて適切な方法を選択する必要があります。 + +どちらの操作においても、一定の時間内に処理される追加操作よりも送信された追加操作の数が絶えず上回る場合、適用されなければならない非マテリアライズされた追加操作のキューが成長し続けます。これにより、最終的に`SELECT`クエリのパフォーマンスが低下する可能性があります。 + +まとめると、更新操作は慎重に発行する必要があり、`system.mutations`テーブルを使用して追加操作のキューを注意深く追跡する必要があります。OLTPデータベースのように頻繁に更新を行わないでください。頻繁に更新する必要がある場合は、[ReplacingMergeTree](/ja/engines/table-engines/mergetree-family/replacingmergetree)を参照してください。 + +| 方法 | 構文 | 使用時期 | +| --- | --- | --- | +| [物理更新](/ja/sql-reference/statements/alter/update) | `ALTER TABLE [table] UPDATE` | データをディスクに即時更新する必要がある場合(例:コンプライアンスのため)。`SELECT`パフォーマンスに悪影響を与えます。 | +| [論理更新](/ja/guides/developer/lightweight-update) | `ALTER TABLE [table] UPDATE` | `SET apply_mutations_on_fly = 1;`を使用して有効化。少量のデータを更新する場合に使用します。更新されたデータが即座に次のすべての`SELECT`クエリで返されますが、最初はディスク上で内部的に更新済みとしてマークされるだけです。 | +| [ReplacingMergeTree](/ja/engines/table-engines/mergetree-family/replacingmergetree) | `ENGINE = ReplacingMergeTree` | 大量のデータを更新する場合に使用します。このテーブルエンジンはマージ時のデータ重複削除に最適化されています。 | + +以下は、ClickHouseでデータを更新するさまざまな方法の概要です: + +## 物理更新 + +物理更新は、例えば`ALTER TABLE … UPDATE`コマンドを通じて発行できます。 + +```sql +ALTER TABLE posts_temp + (UPDATE AnswerCount = AnswerCount + 1 WHERE AnswerCount = 0) +``` +これらは非常にI/Oヘビーであり、`WHERE`式に一致するすべてのパーツを再書き込みします。このプロセスには原子性がなく、準備が整い次第、変更されたパーツが置き換えられ、追加操作中に実行される`SELECT`クエリは既に変更されたパーツとまだ変更されていないパーツの両方からデータを表示します。ユーザーは[systems.mutations](/ja/operations/system-tables/mutations#system_tables-mutations)テーブルを通じて進捗状況を追跡することができます。これらはI/Oを多く消費する操作であり、クラスタの`SELECT`パフォーマンスに影響を与える可能性があるため、節度を持って使用すべきです。 + +[物理更新](/ja/sql-reference/statements/alter/update)について詳しく読む。 + +## 論理更新 (ClickHouseクラウドでのみ利用可能) + +論理更新は、行を即座に更新し、その後の`SELECT`クエリで自動的に変更された値を返すメカニズムを提供します(これはオーバーヘッドを伴い、クエリを遅くします)。これにより、通常の追加操作の原子性制限が効果的に解決されます。以下に例を示します: + +```sql +SET apply_mutations_on_fly = 1; + +SELECT ViewCount +FROM posts +WHERE Id = 404346 + +┌─ViewCount─┐ +│ 26762 │ +└───────────┘ + +1 row in set. Elapsed: 0.115 sec. Processed 59.55 million rows, 238.25 MB (517.83 million rows/s., 2.07 GB/s.) +Peak memory usage: 113.65 MiB. + +-increment count +ALTER TABLE posts + (UPDATE ViewCount = ViewCount + 1 WHERE Id = 404346) + +SELECT ViewCount +FROM posts +WHERE Id = 404346 + +┌─ViewCount─┐ +│ 26763 │ +└───────────┘ + +1 row in set. Elapsed: 0.149 sec. Processed 59.55 million rows, 259.91 MB (399.99 million rows/s., 1.75 GB/s.) +``` + +論理更新では、データを更新するために追加操作が使用されることに注意してください。これは即座にマテリアライズされず、`SELECT`クエリの際に適用されます。バックグラウンドで非同期的に適用されるため、通常の追加操作と同様に重いオーバーヘッドがかかり、I/Oを多く消費する操作であり、節度を持って使用すべきです。この操作で使用できる式にも制限があります([詳細](/ja/guides/developer/lightweight-update#support-for-subqueries-and-non-deterministic-functions)を参照)。 + +[論理更新](/ja/guides/developer/lightweight-update)について詳しく読む。 + +## 追加資料 + +- [ClickHouseにおける更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/materialized-view/images/materialized-view-diagram.png b/docs/ja/materialized-view/images/materialized-view-diagram.png new file mode 100644 index 00000000000..4836b0d8ec5 Binary files /dev/null and b/docs/ja/materialized-view/images/materialized-view-diagram.png differ diff --git a/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png b/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png new file mode 100644 index 00000000000..f64760e9b94 Binary files /dev/null and b/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png differ diff --git a/docs/ja/materialized-view/index.md b/docs/ja/materialized-view/index.md new file mode 100644 index 00000000000..7d70214e9ed --- /dev/null +++ b/docs/ja/materialized-view/index.md @@ -0,0 +1,348 @@ +--- +slug: /ja/materialized-view +title: Materialized View +description: Materialized Viewを使用してクエリを高速化する方法 +keywords: [materialized views, クエリを高速化, クエリ最適化] +--- + +# Materialized View + +Materialized Viewを使用すると、計算のコストをクエリ時から挿入時に移行し、`SELECT`クエリを高速化できます。 + +Postgresなどのトランザクショナルデータベースとは異なり、ClickHouseのMaterialized Viewは、データがテーブルに挿入される際にクエリを実行するトリガーに過ぎません。このクエリの結果は、2つ目の「ターゲット」テーブルに挿入されます。さらに多くの行が挿入されると、その結果がターゲットテーブルに送られ、中間結果が更新およびマージされます。このマージされた結果は、元のデータ全体に対してクエリを実行したときと同等です。 + +Materialized Viewの主な動機は、ターゲットテーブルに挿入される結果が、行に対する集計、フィルタリング、または変換の結果を表していることです。これらの結果は、しばしば元のデータの小さな表現(集計の場合は部分的なスケッチ)になります。これにより、ターゲットテーブルから結果を読み取るためのクエリが単純であるため、元のデータに対して同じ計算を行った場合よりもクエリ時間が短くなることが保証され、計算(したがってクエリの遅延)がクエリ時から挿入時に移行されます。 + +ClickHouseのMaterialized Viewは、ベースにしたテーブルにデータが流入するとリアルタイムで更新され、継続的に更新され続けるインデックスのように機能します。これは、多くのデータベースにおいてMaterialized Viewがクエリの静的なスナップショットであり、新しくリフレッシュする必要があること(ClickHouseの[リフレッシャブルMaterialized View](/ja/sql-reference/statements/create/view#refreshable-materialized-view)と似ています)とは対照的です。 + +Materialized view diagram + +## 例 + +1日の投稿に対するアップ投票とダウン投票の数を取得したいとします。 + +ClickHouseの[`toStartOfDay`](/ja/sql-reference/functions/date-time-functions#tostartofday)関数のおかげで、これはかなり簡単なクエリです: + +```sql +SELECT toStartOfDay(CreationDate) AS day, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY day +ORDER BY day ASC +LIMIT 10 + +┌─────────────────day─┬─UpVotes─┬─DownVotes─┐ +│ 2008-07-31 00:00:00 │ 6 │ 0 │ +│ 2008-08-01 00:00:00 │ 182 │ 50 │ +│ 2008-08-02 00:00:00 │ 436 │ 107 │ +│ 2008-08-03 00:00:00 │ 564 │ 100 │ +│ 2008-08-04 00:00:00 │ 1306 │ 259 │ +│ 2008-08-05 00:00:00 │ 1368 │ 269 │ +│ 2008-08-06 00:00:00 │ 1701 │ 211 │ +│ 2008-08-07 00:00:00 │ 1544 │ 211 │ +│ 2008-08-08 00:00:00 │ 1241 │ 212 │ +│ 2008-08-09 00:00:00 │ 576 │ 46 │ +└─────────────────────┴─────────┴───────────┘ + +10 rows in set. Elapsed: 0.133 sec. Processed 238.98 million rows, 2.15 GB (1.79 billion rows/s., 16.14 GB/s.) +Peak memory usage: 363.22 MiB. +``` + +このクエリは、すでにClickHouseのおかげで高速ですが、さらに改善できるでしょうか? + +Materialized Viewを使用してこれを挿入時に計算したい場合、結果を受け取るテーブルが必要です。このテーブルは、1日につき1行だけを保持する必要があります。既存の日のデータが更新される場合、他のカラムは既存の日の行にマージされるべきです。このインクリメンタルな状態のマージを行うためには、他のカラムの部分的な状態を保持する必要があります。 + +これは、ClickHouseにおける特別なエンジンタイプを必要とします: [SummingMergeTree](/ja/engines/table-engines/mergetree-family/summingmergetree)。これは、全ての数値カラムの合計値を含む1つの行に置き換えます。以下のテーブルは、同じ日付を持つ行をマージし、数値カラムを合計します: + +``` +CREATE TABLE up_down_votes_per_day +( + `Day` Date, + `UpVotes` UInt32, + `DownVotes` UInt32 +) +ENGINE = SummingMergeTree +ORDER BY Day +``` + +Materialized Viewを示すために、votesテーブルが空であり、まだデータを受け取っていないと仮定します。我々のMaterialized Viewは、`votes`に挿入されたデータに対して上記の`SELECT`を実行し、その結果を`up_down_votes_per_day`に送ります: + +```sql +CREATE MATERIALIZED VIEW up_down_votes_per_day_mv TO up_down_votes_per_day AS +SELECT toStartOfDay(CreationDate)::Date AS Day, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY Day +``` + +ここでの`TO`句は重要で、結果が送られる場所、すなわち`up_down_votes_per_day`を示しています。 + +以前の挿入からvotesテーブルを再度ポピュレートできます: + +```sql +INSERT INTO votes SELECT toUInt32(Id) AS Id, toInt32(PostId) AS PostId, VoteTypeId, CreationDate, UserId, BountyAmount +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes.parquet') + +0 rows in set. Elapsed: 111.964 sec. Processed 477.97 million rows, 3.89 GB (4.27 million rows/s., 34.71 MB/s.) +Peak memory usage: 283.49 MiB. +``` + +完了後、`up_down_votes_per_day`のサイズを確認できます - 1日につき1行になるはずです: + +``` +SELECT count() +FROM up_down_votes_per_day +FINAL + +┌─count()─┐ +│ 5723 │ +└─────────┘ +``` + +ここで、`votes`における238百万行から、このクエリの結果を保存することによって5000に行数を効果的に減少させました。ここでの鍵は、`votes`テーブルに新しい投票が挿入されるたびに、新しい値がその日に対して`up_down_votes_per_day`に送られ、それらはバックグラウンドで自動的に非同期でマージされることです - 1日につき1行のみを保持します。`up_down_votes_per_day`は常に小さく、最新の状態に保たれます。 + +行のマージが非同期で行われるため、ユーザーがクエリする際に1日あたり複数の投票が存在する可能性があります。クエリ時に未結合の行を確実にマージするために、以下の2つのオプションがあります: + +- テーブル名に`FINAL`修飾子を使用する。これは上記のカウントクエリで行いました。 +- 最終テーブルで使用した並び替えキー(例: `CreationDate`)で集約し、メトリックを合計します。これは通常、より効率的で柔軟ですが(テーブルが他のことにも使用できます)、前者は一部のクエリにとっては単純かもしれません。以下で両方を示します: + +```sql +SELECT + Day, + UpVotes, + DownVotes +FROM up_down_votes_per_day +FINAL +ORDER BY Day ASC +LIMIT 10 + +10 rows in set. Elapsed: 0.004 sec. Processed 8.97 thousand rows, 89.68 KB (2.09 million rows/s., 20.89 MB/s.) +Peak memory usage: 289.75 KiB. + +SELECT Day, sum(UpVotes) AS UpVotes, sum(DownVotes) AS DownVotes +FROM up_down_votes_per_day +GROUP BY Day +ORDER BY Day ASC +LIMIT 10 +┌────────Day─┬─UpVotes─┬─DownVotes─┐ +│ 2008-07-31 │ 6 │ 0 │ +│ 2008-08-01 │ 182 │ 50 │ +│ 2008-08-02 │ 436 │ 107 │ +│ 2008-08-03 │ 564 │ 100 │ +│ 2008-08-04 │ 1306 │ 259 │ +│ 2008-08-05 │ 1368 │ 269 │ +│ 2008-08-06 │ 1701 │ 211 │ +│ 2008-08-07 │ 1544 │ 211 │ +│ 2008-08-08 │ 1241 │ 212 │ +│ 2008-08-09 │ 576 │ 46 │ +└────────────┴─────────┴───────────┘ + +10 rows in set. Elapsed: 0.010 sec. Processed 8.97 thousand rows, 89.68 KB (907.32 thousand rows/s., 9.07 MB/s.) +Peak memory usage: 567.61 KiB. +``` + +これにより、クエリ時間を0.133秒から0.004秒 - 25倍以上の改善になりました! + +### より複雑な例 + +上記の例では、Dailyの合計値を2つ取り扱うためにMaterialized Viewを使用しています。合計は、部分的な状態を維持するための最も簡単な集計形式です - 新しい値が到着したときに既存の値に追加するだけで済みます。しかし、ClickHouseのMaterialized Viewは、あらゆるタイプの集計に使用することができます。 + +たとえば、投稿の統計を各日数に対して計算したいとしましょう: `Score`の99.9パーセンタイルと`CommentCount`の平均です。この計算のためのクエリは以下のようになるかもしれません: + +```sql +SELECT + toStartOfDay(CreationDate) AS Day, + quantile(0.999)(Score) AS Score_99th, + avg(CommentCount) AS AvgCommentCount +FROM posts +GROUP BY Day +ORDER BY Day DESC +LIMIT 10 + + ┌─────────────────Day─┬────────Score_99th─┬────AvgCommentCount─┐ + 1. │ 2024-03-31 00:00:00 │ 5.23700000000008 │ 1.3429811866859624 │ + 2. │ 2024-03-30 00:00:00 │ 5 │ 1.3097158891616976 │ + 3. │ 2024-03-29 00:00:00 │ 5.78899999999976 │ 1.2827635327635327 │ + 4. │ 2024-03-28 00:00:00 │ 7 │ 1.277746158224246 │ + 5. │ 2024-03-27 00:00:00 │ 5.738999999999578 │ 1.2113264918282023 │ + 6. │ 2024-03-26 00:00:00 │ 6 │ 1.3097536945812809 │ + 7. │ 2024-03-25 00:00:00 │ 6 │ 1.2836721018539201 │ + 8. │ 2024-03-24 00:00:00 │ 5.278999999999996 │ 1.2931667891256429 │ + 9. │ 2024-03-23 00:00:00 │ 6.253000000000156 │ 1.334061135371179 │ +10. │ 2024-03-22 00:00:00 │ 9.310999999999694 │ 1.2388059701492538 │ + └─────────────────────┴───────────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.113 sec. Processed 59.82 million rows, 777.65 MB (528.48 million rows/s., 6.87 GB/s.) +Peak memory usage: 658.84 MiB. +``` + +前述のように、postsテーブルに新しい投稿が挿入されるとき、上記のクエリを実行するMaterialized Viewを作成できます。 + +例の目的で、S3からの投稿データのロードを避けるために、`posts`と同じスキーマを持つ重複テーブル`posts_null`を作成します。ただし、このテーブルはデータを保存せず、Materialized Viewが行を挿入する際に使用されます。データの保存を防ぐために、[`Null`テーブルエンジンタイプ](/ja/engines/table-engines/special/null)を使用できます。 + +```sql +CREATE TABLE posts_null AS posts ENGINE = Null +``` + +Nullテーブルエンジンは強力な最適化です - `/dev/null`のようなものです。我々のMaterialized Viewは、挿入時に`posts_null`テーブルが行を受け取ると統計を計算して格納します - ただのトリガーに過ぎません。ただし、生データは保存されません。実際には、元の投稿を保存する必要があるかもしれませんが、このアプローチは集計を計算しながら生データのストレージオーバーヘッドを回避するために使用できます。 + +それゆえ、Materialized Viewは以下のようになります: + +```sql +CREATE MATERIALIZED VIEW post_stats_mv TO post_stats_per_day AS + SELECT toStartOfDay(CreationDate) AS Day, + quantileState(0.999)(Score) AS Score_quantiles, + avgState(CommentCount) AS AvgCommentCount +FROM posts_null +GROUP BY Day +``` + +注: ここでは、集約関数の末尾に`State`サフィックスを付けています。これにより、関数の集約状態が返され、最終的な結果ではなく、他の状態とマージするための追加情報を持つ部分状態が含まれます。たとえば平均の場合、これはカウントとカラムの合計を含みます。 + +> 部分的な集計状態は正しい結果を計算するために必要です。たとえば、平均を計算する場合、サブレンジの平均を単純に平均化することは誤った結果をもたらします。 + +次に、このビューのターゲットテーブル`post_stats_per_day`を作成し、これらの部分的集計状態を保存します: + +```sql +CREATE TABLE post_stats_per_day +( + `Day` Date, + `Score_quantiles` AggregateFunction(quantile(0.999), Int32), + `AvgCommentCount` AggregateFunction(avg, UInt8) +) +ENGINE = AggregatingMergeTree +ORDER BY Day +``` + +以前は、カウントを保存するための`SummingMergeTree`が十分でしたが、他の関数にはより高度なエンジンタイプが必要です: [`AggregatingMergeTree`](/ja/engines/table-engines/mergetree-family/aggregatingmergetree)。 +ClickHouseに集約状態が保存されることを確実に知らせるために、`Score_quantiles`と`AvgCommentCount`を`AggregateFunction`タイプとして定義し、部分的状態とソースカラムのタイプの関数ソースを指定します。`SummingMergeTree`のように、同じ`ORDER BY`キー値を持つ行がマージされます(この例の`Day`) + +Materialized Viewを経由して`post_stats_per_day`をポピュレートするには、`posts`から`posts_null`にすべての行を挿入するだけです: + +```sql +INSERT INTO posts_null SELECT * FROM posts + +0 rows in set. Elapsed: 13.329 sec. Processed 119.64 million rows, 76.99 GB (8.98 million rows/s., 5.78 GB/s.) +``` + +> プロダクションでは、おそらくMaterialized Viewを`posts`テーブルにアタッチすることになります。ここでは、nullテーブルを示すために`posts_null`を使用しました。 + +最終クエリは、関数に`Merge`サフィックスを使用する必要があります(カラムが部分的な集計状態を格納しているため): + +```sql +SELECT + Day, + quantileMerge(0.999)(Score_quantiles), + avgMerge(AvgCommentCount) +FROM post_stats_per_day +GROUP BY Day +ORDER BY Day DESC +LIMIT 10 +``` + +ここでは、`FINAL`を使用する代わりに`GROUP BY`を使用します。 + +## 他の用途 + +上記では主に、データの部分集計をインクリメンタルに更新する目的でMaterialized Viewを使用し、クエリ時間から挿入時間へと計算を移行することに焦点を当てています。この一般的な使用ケースを超え、Materialized Viewには他の多くの用途があります。 + +### フィルタリングと変換 + +場合によっては、挿入時に行とカラムのサブセットのみを挿入したい場合があります。この場合、`posts_null`テーブルは挿入を受け、`posts`テーブルへの挿入前に`SELECT` クエリで行をフィルタリングできます。たとえば、`posts`テーブルの`Tags`カラムを変換したいとします。これはタグ名のパイプ区切りリストを含んでいます。これらを配列に変換することで、個々のタグ値による集計がより簡単になります。 + +> この変換は、`INSERT INTO SELECT` を実行するときにも実行できます。Materialized ViewはこのロジックをClickHouse DDLにカプセル化し、`INSERT`をシンプルに保ちながら、新しい行に変換を適用できます。 + +この変換のためのMaterialized Viewは以下のようになります: + +```sql +CREATE MATERIALIZED VIEW posts_mv TO posts AS + SELECT * EXCEPT Tags, arrayFilter(t -> (t != ''), splitByChar('|', Tags)) as Tags FROM posts_null +``` + +### 参照テーブル + +ユーザーはClickHouseの順序付けキーを選択する際に、そのフィルタリングや集計句で頻繁に使用されるカラムを選択する必要があります。しかし、これは単一のカラムセットでカプセル化できない、より多様なアクセスパターンを持つシナリオにおいて制約を与える可能性があります。たとえば、次の`comments`テーブルを考えてみましょう: + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY PostId + +0 rows in set. Elapsed: 46.357 sec. Processed 90.38 million rows, 11.14 GB (1.95 million rows/s., 240.22 MB/s.) +``` + +ここでの順序付けキーは、`PostId` でフィルタリングするクエリに対してテーブルを最適化しています。 + +特定の`UserId`でフィルタリングし、平均`Score`を計算したい状況を考えてみましょう: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.778 sec. Processed 90.38 million rows, 361.59 MB (116.16 million rows/s., 464.74 MB/s.) +Peak memory usage: 217.08 MiB. +``` + +高速です(データはClickHouseにとって小さい)が、プロセスされた行数 - 90.38百万からフルテーブルスキャンを必要とすることがわかります。より大きなデータセットに対して、フィルタリングカラム`UserId`のための順序付けキー値`PostId`を参照するMaterialized Viewを使用して、このクエリを効率的に加速することができます。これらの値は効率的な参照に使用できます。 + +この例では、Materialized Viewはとてもシンプルで、挿入時に`comments`から`PostId`と`UserId`のみを選択します。これらの結果は、`UserId`で並び替えられた`comments_posts_users`テーブルに送られます。以下で`comments`テーブルのnullバージョンを作成し、このビューと`comments_posts_users`テーブルをポピュレートするために使用します: + +```sql +CREATE TABLE comments_posts_users ( + PostId UInt32, + UserId Int32 +) ENGINE = MergeTree ORDER BY UserId + + +CREATE TABLE comments_null AS comments +ENGINE = Null + +CREATE MATERIALIZED VIEW comments_posts_users_mv TO comments_posts_users AS +SELECT PostId, UserId FROM comments_null + +INSERT INTO comments_null SELECT * FROM comments + +0 rows in set. Elapsed: 5.163 sec. Processed 90.38 million rows, 17.25 GB (17.51 million rows/s., 3.34 GB/s.) +``` + +このビューをサブクエリで使用して前のクエリを加速できます: + +```sql +SELECT avg(Score) +FROM comments +WHERE PostId IN ( + SELECT PostId + FROM comments_posts_users + WHERE UserId = 8592047 +) AND UserId = 8592047 + + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.012 sec. Processed 88.61 thousand rows, 771.37 KB (7.09 million rows/s., 61.73 MB/s.) +``` + +### チェイン化 + +Materialized Viewはチェイン化可能で、複雑なワークフローを確立できます。実際の例については、この[ブログ投稿](https://clickhouse.com/blog/chaining-materialized-views)をお勧めします。 diff --git a/docs/ja/materialized-view/refreshable-materialized-view.md b/docs/ja/materialized-view/refreshable-materialized-view.md new file mode 100644 index 00000000000..9d51e717565 --- /dev/null +++ b/docs/ja/materialized-view/refreshable-materialized-view.md @@ -0,0 +1,70 @@ +--- +slug: /ja/materialized-view/refreshable-materialized-view +title: リフレッシュ可能なMaterialized View(エクスペリメンタル機能) +description: クエリを高速化するためのMaterialized Viewの使い方 +keywords: [refreshable materialized view, refresh, materialized views, speed up queries, query optimization] +--- + +import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; + + + +リフレッシュ可能なMaterialized Viewは、伝統的なOLTPデータベースにおけるMaterialized Viewと概念的に類似しており、指定されたクエリの結果を保存して迅速に取得することで、リソース集約的なクエリを繰り返し実行する必要を減らします。ClickHouseの[インクリメンタルMaterialized View](/ja/materialized-view)とは異なり、完全なデータセットに対して定期的にクエリを実行する必要があり、その結果がクエリ用のターゲットテーブルに保存されます。この結果セットは、理論的には元のデータセットより小さくなり、後続のクエリの実行を高速化します。 + +リフレッシュ可能なMaterialized Viewの図 + +## リフレッシュ可能なMaterialized Viewを使用するべき場合 + +ClickHouseのインクリメンタルMaterialized Viewは非常に強力で、特に単一テーブルに対する集計を行う場合、リフレッシュ可能なMaterialized Viewの手法よりも通常、大規模にスケールします。データが挿入される各ブロックごとに集計を計算し、最終テーブルでインクリメンタルな状態をマージすることにより、クエリは常にデータの一部に対してのみ実行されます。この方法はペタバイト単位のデータにまでスケールする可能性があり、通常は好まれる方法です。 + +しかし、このインクリメンタルなプロセスが必要でない場合や適用できない場合もあります。いくつかの問題はインクリメンタルアプローチと互換性がなかったり、リアルタイムでの更新を必要としなかったりし、定期的な再構築の方が適切である場合があります。たとえば、複雑なジョインを使用するためインクリメンタルアプローチと互換性がないケースでは、データセット全体に対してビューの完全な再計算を定期的に実行したい場合があります。 + +> リフレッシュ可能なMaterialized Viewは、非正規化といったタスクを行うバッチプロセスを実行するために使用されます。リフレッシュ可能なMaterialized Viewの間に依存関係を作成することで、あるビューが別のビューの結果に依存し、そのビューが完了すると実行されるようにすることができます。これを使用して、スケジュールされたワークフローや[dbt](https://www.getdbt.com/)ジョブのような単純なDAGを置き換えることができます。 + +## 例 + +例として、StackOverflowデータセットの`postlinks`データセットを`posts`テーブルに非正規化する以下のクエリを考えます。なぜユーザーがこれを行いたがるかについては、[非正規化データガイド](/ja/data-modeling/denormalization)で探っています。 + +```sql +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts_types_codecs_ordered.Id = postlinks.PostId +``` + +`posts`と`postlinks`の両方のテーブルは更新される可能性があります。このジョインをインクリメンタルMaterialized Viewで実装する代わりに、このクエリを1時間ごとに実行し、その結果を`post_with_links`テーブルに保存するスケジュールを設定することで十分かもしれません。 + +ここでの構文はインクリメンタルMaterialized Viewと同一ですが、[`REFRESH`](/ja/sql-reference/statements/create/view#refreshable-materialized-view)句を含めています: + +```sql +-- エクスペリメンタル機能を有効化 +SET allow_experimental_refreshable_materialized_view = 1 + +CREATE MATERIALIZED VIEW posts_with_links_mv +REFRESH EVERY 1 HOUR TO posts_with_links AS +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts_types_codecs_ordered.Id = postlinks.PostId +``` + +このビューは、ソーステーブルへの更新が反映されるように設定されており、即時に実行され、その後も毎時間実行されます。特に、クエリが再実行されるとき、結果セットは原子かつ透過的に更新されます。 diff --git a/docs/ja/migrations/bigquery/equivalent-concepts.md b/docs/ja/migrations/bigquery/equivalent-concepts.md new file mode 100644 index 00000000000..86909ff402f --- /dev/null +++ b/docs/ja/migrations/bigquery/equivalent-concepts.md @@ -0,0 +1,478 @@ +--- +title: BigQuery と ClickHouse Cloud の比較 +slug: /ja/migrations/bigquery +description: BigQuery と ClickHouse Cloud の違い +keywords: [移行, データ, etl, elt, bigquery] +--- + +# BigQuery と ClickHouse Cloud: 同等概念と異なる概念 + +## リソースの組織化 + +ClickHouse Cloud 内のリソースの組織化は、[BigQuery のリソース階層](https://cloud.google.com/bigquery/docs/resource-hierarchy) に似ています。以下の ClickHouse Cloud のリソース階層を示す図を基にした特定の違いを説明します。 + +NEEDS ALT + +
    + +### 組織 + +BigQuery と同様に、組織は ClickHouse Cloud リソース階層のルートノードです。ClickHouse Cloud アカウントで最初に設定したユーザーは、ユーザーが所有する組織に自動的に割り当てられます。ユーザーは他のユーザーをその組織に招待することができます。 + +### BigQuery プロジェクト vs ClickHouse Cloud サービス + +組織内では、ClickHouse Cloud でのデータがサービスに関連付けられるため、BigQuery プロジェクトに緩やかに相当するサービスを作成できます。ClickHouse Cloud では[いくつかのサービスタイプが利用可能](/ja/cloud/manage/service-types)です。各 ClickHouse Cloud サービスは特定の地域にデプロイされ、以下を含みます: + +1. コンピュートノードのグループ(現在、開発ティアサービスには 2 ノード、運用ティアサービスには 3 ノード)。これらのノードに対して、ClickHouse Cloud は[垂直および水平スケーリング](/ja/manage/scaling#vertical-and-horizontal-scaling)の両方を手動および自動でサポートしています。 +2. サービスがすべてのデータを保存するオブジェクトストレージフォルダ。 +3. エンドポイント(または ClickHouse Cloud UI コンソールを通じて作成される複数のエンドポイント)- サービスに接続するためのサービス URL(例:`https://dv2fzne24g.us-east-1.aws.clickhouse.cloud:8443`)。 + +### BigQuery データセット vs ClickHouse Cloud データベース + +ClickHouse はテーブルをデータベースに論理的にグループ化します。BigQuery データセットと同様に、ClickHouse データベースはテーブルデータへのアクセスを組織し制御する論理コンテナです。 + +### BigQuery フォルダ + +ClickHouse Cloud には現在、BigQuery フォルダに相当する概念はありません。 + +### BigQuery スロット予約とクォータ + +BigQuery スロット予約と同様に、ClickHouse Cloud では[垂直および水平のオートスケーリングを設定](/ja/manage/scaling#configuring-vertical-auto-scaling)できます。垂直オートスケーリングでは、サービスのコンピュートノードのメモリと CPU コアの最小および最大サイズを設定することができます。この設定は、初期のサービス作成のフローでも利用可能です。各コンピュートノードは同じサイズを持っています。[水平スケーリング](/ja/manage/scaling#self-serve-horizontal-scaling)を使用して、サービス内のコンピュートノードの数を変更できます。 + +さらに、BigQuery クォータに類似して、ClickHouse Cloud は並行制御、メモリ使用量制限、および I/O スケジューリングを提供し、クエリをワークロードクラスに隔離することを可能にします。特定のワークロードクラスに対する共有リソース(CPU コア、DRAM、ディスクおよびネットワーク I/O)の制限を設定することで、これらのクエリが他の重要なビジネスクエリに影響を与えないようにします。並行制御は、多数の同時クエリがある状況でのスレッドの過剰なサブスクリプションを防ぎます。 + +ClickHouse は、サーバ、ユーザー、およびクエリレベルでメモリアロケーションのバイトサイズを追跡し、柔軟なメモリ使用量制限を設定できます。メモリオーバーコミットにより、クエリは保証されたメモリを超える追加の空きメモリを使用できる一方で、他のクエリのメモリ制限を保証します。加えて、集約、ソート、および結合句のためのメモリ使用量を制限し、メモリ制限が超えられた場合には外部アルゴリズムにフォールバックすることができます。 + +最後に、I/O スケジューリングによりユーザーは、最大帯域幅、インフライトリクエスト、およびポリシーに基づいて、ワークロードクラスのローカルおよびリモートディスクアクセスを制限することができます。 + +### 権限 + +ClickHouse Cloud は[クラウドコンソール](/ja/get-started/sql-console)およびデータベースを通じて[ユーザーアクセスを管理](/ja/cloud/security/cloud-access-management)します。コンソールアクセスは [clickhouse.cloud](https://clickhouse.cloud) のユーザーインターフェイスを通じて管理されます。データベースアクセスは、データベースのユーザーアカウントとロールを通じて管理されます。さらに、コンソールのユーザーには、SQL コンソールを通じてデータベースと対話することを可能にするデータベース内の役割を付与することができます。 + +## データ型 + +ClickHouse は数値に関してより詳細な精度を提供します。たとえば、BigQuery は[INT64, NUMERIC, BIGNUMERIC および FLOAT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)の数値型を提供しています。これに対して ClickHouse は、デシマル、フロート、整数に対して複数の精度を提供しています。これらのデータ型により、ClickHouse ユーザーはストレージおよびメモリのオーバーヘッドを最適化し、より高速なクエリとリソース消費を低減します。以下に、各 BigQuery 型に対する ClickHouse の同等型を示します: + +| BigQuery | ClickHouse | +|----------|------------| +| [ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#array_type) | [Array(t)](/ja/sql-reference/data-types/array) | +| [NUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types) | [Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S)](/ja/sql-reference/data-types/decimal) | +| [BIG NUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types) | [Decimal256(S)](/ja/sql-reference/data-types/decimal) | +| [BOOL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#boolean_type) | [Bool](/ja/sql-reference/data-types/boolean) | +| [BYTES](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type) | [FixedString](/ja/sql-reference/data-types/fixedstring) | +| [DATE](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#date_type) | [Date32](/ja/sql-reference/data-types/date32) (より狭い範囲) | +| [DATETIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#datetime_type) | [DateTime](/ja/sql-reference/data-types/datetime), [DateTime64](/ja/sql-reference/data-types/datetime64) (狭い範囲で高精度) | +| [FLOAT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#floating_point_types) | [Float64](/ja/sql-reference/data-types/float) | +| [GEOGRAPHY](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#geography_type) | [Geo Data Types](/ja/sql-reference/data-types/float) | +| [INT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types) | [UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256](/ja/sql-reference/data-types/int-uint) | +| [INTERVAL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types) | 該当なし - [式としてサポート](/ja/sql-reference/data-types/special-data-types/interval#usage-remarks)または[関数を通じて](/ja/sql-reference/functions/date-time-functions#addyears-addmonths-addweeks-adddays-addhours-addminutes-addseconds-addquarters) | +| [JSON](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#json_type) | [JSON](/ja/integrations/data-formats/json/overview#relying-on-schema-inference) | +| [STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#string_type) | [String (bytes)](/ja/sql-reference/data-types/string) | +| [STRUCT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct) | [Tuple](/ja/sql-reference/data-types/tuple), [Nested](/ja/sql-reference/data-types/nested-data-structures/nested) | +| [TIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#time_type) | [DateTime64](/ja/sql-reference/data-types/datetime64) | +| [TIMESTAMP](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#timestamp_type) | [DateTime64](/ja/sql-reference/data-types/datetime64) | + +ClickHouse 型が複数のオプションで提示された場合、データの実際の範囲を考慮し、必要最低限のものを選択してください。また、さらなる圧縮のために[適切なコーデック](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)の利用を検討してください。 + +## クエリ高速化技術 + +### 主キーおよび外部キーと主インデックス + +BigQuery では、テーブルに[主キーおよび外部キーの制約](https://cloud.google.com/bigquery/docs/information-schema-table-constraints)を持たせることができます。通常、主キーおよび外部キーは、リレーショナルデータベースでデータの整合性を確保するために使用されます。主キーの値は通常、各行のユニークな値であり `NULL` ではありません。外部キー値は、主キー表の主キー列で存在するか `NULL` でなければなりません。BigQuery では、これらの制約は強制されませんが、クエリオプティマイザはこの情報を用いてクエリの最適化を行うことができます。 + +ClickHouse でもテーブルに主キーが設定可能です。BigQuery と同様に、ClickHouse はテーブルの主キーカラムの値の一意性を強制しません。BigQuery とは異なり、テーブルのデータは主キーカラムによって[ディスクに順序付けされて](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)保存されます。クエリオプティマイザはこの並び順を用いてリゾートを防ぎ、結合時のメモリ使用量を最小化し、リミット句に対してショートサーキットを可能にします。BigQuery と異なり、ClickHouse は自動的に[(スパースな)プライマリインデックス](/ja/optimize/sparse-primary-indexes#an-index-design-for-massive-data-scales)を主キーのカラムの値に基づいて作成します。このインデックスは、主キーカラムのフィルタを含むすべてのクエリを高速化するために使用されます。ClickHouse は現在、外部キーの制約をサポートしていません。 + +## セカンダリインデックス(ClickHouse のみに存在) + +テーブルの主キーカラムとは異なるカラムにセカンダリインデックスを作成することが ClickHouse ではできます。ClickHouse はクエリの種類に応じたさまざまなセカンダリインデックスを提供しています: + +- **ブルームフィルターインデックス**: + - 等価条件(例:=、IN)でクエリを高速化するために使用されます。 + - 値がデータブロックに存在するかどうかを決定するための確率的なデータ構造を使用します。 +- **トークンブルームフィルターインデックス**: + - トークン化された文字列、およびフルテキスト検索クエリに適したブルームフィルターインデックス。 +- **Min-Max インデックス**: + - 各データ部分のカラムの最小値と最大値を維持します。指定された範囲に入らないデータ部分の読み取りをスキップするのに役立ちます。 + +## 検索インデックス + +BigQuery の[検索インデックス](https://cloud.google.com/bigquery/docs/search-index)と同様に、ClickHouse のテーブルには文字列値を有するカラムに対して[全文検索インデックス](/ja/engines/table-engines/mergetree-family/invertedindexes)を作成することができます。 + +## ベクトルインデックス + +BigQuery は最近、[ベクトルインデックス](https://cloud.google.com/bigquery/docs/vector-index)をプリ GA 機能として導入しました。同様に、ClickHouse にはベクトル検索の使用ケースを高速化するエクスペリメンタルな[インデックスのサポート](/ja/engines/table-engines/mergetree-family/annindexes)があります。 + +## パーティショニング +   +BigQuery と同様に、ClickHouse は大規模テーブルのパフォーマンスと管理性を向上させるために、テーブルをパーティションと呼ばれる小さく管理しやすい部分に分割するためのテーブルパーティショニングを使用します。ClickHouse のパーティショニングについての詳細は[こちら](/ja/engines/table-engines/mergetree-family/custom-partitioning-key)で説明しています。 + +## クラスタリング + +BigQuery のクラスタリングは、指定されたカラムの値に基づいてテーブルデータを自動的にソートし、適切なサイズのブロックに配置します。クラスタリングはクエリのパフォーマンスを向上させ、BigQuery がクエリの実行コストをより良く見積もることを可能にします。クラスタリングされたカラムにより、クエリは不要なデータのスキャンを排除します。 + +ClickHouse では、データはテーブルの主キーカラムに基づいてディスク上に自動的に[クラスタリング](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)され、クエリが主インデックスデータ構造を利用するために迅速に検索またはプルーニングされ得るブロックに論理的に整理されます。 + +## マテリアライズドビュー + +BigQuery と ClickHouse の両方がマテリアライズドビューをサポートしています。これは、パフォーマンスと効率を向上させるために、ベーステーブルに対しての変換クエリの結果に基づいた事前計算された結果です。 + +## マテリアライズドビューのクエリ + +BigQuery マテリアライズドビューは直接クエリされるか、オプティマイザによってベーステーブルをクエリする際に使用されます。ベーステーブルへの変更がマテリアライズドビューを無効にする可能性がある場合、データはベーステーブルから直接読み取られます。ベーステーブルへの変更がマテリアライズドビューを無効にしない場合、残りのデータはマテリアライズドビューから読み取られ、変更のみがベーステーブルから読み取られます。 + +ClickHouse では、マテリアライズドビューは直接クエリのみ可能です。しかし、BigQuery とは異なり(マテリアライズドビューは通常 5 分以内に自動的に更新され、[30 分おき](https://cloud.google.com/bigquery/docs/materialized-views-manage#refresh)より頻繁には更新されません)、ClickHouse のマテリアライズドビューは常にベーステーブルと同期しています。 + +**マテリアライズドビューの更新** + +BigQuery は定期的にベーステーブルに対するビューの変換クエリを実行することでマテリアライズドビューを完全に更新します。更新間隔には、マテリアライズドビューのデータをベーステーブルの新しいデータと組み合わせて一貫性のあるクエリ結果を提供しながら依然としてマテリアライズドビューを使用します。 + +ClickHouse では、マテリアライズドビューは増分で更新されます。この増分更新機構は高いスケーラビリティと低い計算コストを提供します。特にベーステーブルに数十億または数兆の行が含まれるシナリオに対して設計されています。マテリアライズドビューをベーステーブル全体から繰り返し更新する代わりに、ClickHouse は(新たに挿入されたベーステーブルの行の)値のみから部分結果を計算します。この部分結果は、バックグラウンドで以前に計算された部分結果とインクリメンタルにつながります。これにより、完全なベーステーブルから繰り返しマテリアライズドビューを更新する場合に比べて計算コストが劇的に低下します。 + +## トランザクション + +ClickHouse とは対照的に、BigQuery はセッションを使用する際、単一のクエリ内または複数のクエリにまたがるマルチステートメントトランザクションをサポートしています。マルチステートメントトランザクションにより、1 つまたは複数のテーブルで行の挿入または削除などの変異操作を実行し、変更を原子的にコミットまたはロールバックすることができます。マルチステートメントトランザクションは[ClickHouse のロードマップに2024年の予定](https://github.com/ClickHouse/ClickHouse/issues/58392)としてあります。 + +## 集約関数 + +BigQuery と比較して、ClickHouse はかなり多くの組み込み集約関数を提供しています: + +- BigQuery は [18 の集約関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions) と、[4 つの近似集約関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions) を持っています。 +- ClickHouse は [150 以上の組み込み集計関数](https://clickhouse.com/docs/ja/sql-reference/aggregate-functions/reference)を備えており、組み込み集計関数の挙動を[拡張](/ja/sql-reference/aggregate-functions/combinators)する強力な[集約コンビネータ](/ja/sql-reference/aggregate-functions/combinators)も備えています。たとえば、150 以上の組み込み集計関数をテーブルの行ではなく配列に適用することができ、[-Array サフィックス](/ja/sql-reference/aggregate-functions/combinators#-array)を使用するだけで済みます。[-Map サフィックス](/ja/sql-reference/aggregate-functions/combinators#-map)を使用すれば、マップに対して任意の集約関数を適用できます。[-ForEach サフィックス](/ja/sql-reference/aggregate-functions/combinators#-foreach)を使用して配列に対して任意の集約関数を適用することが可能です。 + +## データソースとファイルフォーマット + +BigQuery と比較して、ClickHouse は圧倒的に多くのファイルフォーマットとデータソースをサポートしています: + +- ClickHouse には、あらゆるデータソースから 90 以上のファイルフォーマットでデータをロードするネイティブサポートがあります。 +- BigQuery は 5 つのファイルフォーマットと 19 のデータソースをサポートしています。 + +## SQL 言語の特徴 + +ClickHouse は標準 SQL を提供しており、分析タスクに対してよりフレンドリーな多くの拡張機能と改善点を備えています。例えば、ClickHouse SQL では [ラムダ関数](/ja/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function) および高次関数をサポートしており、配列に変換を適用する際にアンネス化/爆発処理を行う必要がありません。これはBigQueryのような他のシステムに対する大きな利点です。 + +## 配列 + +BigQuery の 8 つの配列関数と比較して、ClickHouse には幅広い問題をエレガントかつシンプルにモデリングおよび解決するための 80 以上の[組み込み配列関数](/ja/sql-reference/functions/array-functions)があります。 + +ClickHouse における典型的なデザインパターンは、特定のテーブルの行の値を(暫定的に)配列に変換するために[`groupArray`](/ja/sql-reference/aggregate-functions/reference/grouparray)集計関数を使用することです。これにより、配列関数を通じて便利に処理し、[`arrayJoin`](/ja/sql-reference/functions/array-join)集計関数を通じてその結果を個別のテーブル行に戻すことができます。 + +ClickHouse SQL は[高次ラムダ関数](/ja/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function)をサポートしているため、多くの高度な配列操作がビルトイン配列関数の一つを単に呼び出すことで実現可能です。多くの場合、BigQuery ではそれが必要です。BigQuery では、配列の[フィルタリング](https://cloud.google.com/bigquery/docs/arrays#filtering_arrays)や[ジッピング](https://cloud.google.com/bigquery/docs/arrays#zipping_arrays)を行う際に、配列表を一時的に元に戻すことが必要でしたが、ClickHouse ではこれらの操作は高次関数[`arrayFilter`](/ja/sql-reference/functions/array-functions#arrayfilterfunc-arr1-)および[`arrayZip`](/ja/sql-reference/functions/array-functions#arrayzip)の単なる関数呼び出しです。 + +以下に、BigQuery から ClickHouse への配列操作のマッピングを示します: + +| BigQuery | ClickHouse | +|----------|------------| +| [ARRAY_CONCAT](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_concat) | [arrayConcat](/ja/sql-reference/functions/array-functions#arrayconcat) | +| [ARRAY_LENGTH](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_length) | [length](/ja/sql-reference/functions/array-functions#length) | +| [ARRAY_REVERSE](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_reverse) | [arrayReverse](/ja/sql-reference/functions/array-functions#arrayreverse) | +| [ARRAY_TO_STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_to_string) | [arrayStringConcat](/ja/sql-reference/functions/splitting-merging-functions#arraystringconcat) | +| [GENERATE_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_array) | [range](/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) | + +**サブクエリの各行に1つの要素が含まれる配列を作成** + +_BigQuery_ + +[ARRAY 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array) + +```sql +SELECT ARRAY + (SELECT 1 UNION ALL + SELECT 2 UNION ALL + SELECT 3) AS new_array; + +/*-----------* + | new_array | + +-----------+ + | [1, 2, 3] | + *-----------*/ +``` + +_ClickHouse_ + +[groupArray](/ja/sql-reference/aggregate-functions/reference/grouparray) 集計関数 + +```sql +SELECT groupArray(*) AS new_array +FROM +( + SELECT 1 + UNION ALL + SELECT 2 + UNION ALL + SELECT 3 +) + ┌─new_array─┐ +1. │ [1,2,3] │ + └───────────┘ +``` + +**配列をセットに変換** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーター + +```sql +SELECT * +FROM UNNEST(['foo', 'bar', 'baz', 'qux', 'corge', 'garply', 'waldo', 'fred']) + AS element +WITH OFFSET AS offset +ORDER BY offset; + +/*----------+--------* + | element | offset | + +----------+--------+ + | foo | 0 | + | bar | 1 | + | baz | 2 | + | qux | 3 | + | corge | 4 | + | garply | 5 | + | waldo | 6 | + | fred | 7 | + *----------+--------*/ +``` + +_ClickHouse_ + +[ARRAY JOIN](/ja/sql-reference/statements/select/array-join) 節 + +```sql +WITH ['foo', 'bar', 'baz', 'qux', 'corge', 'garply', 'waldo', 'fred'] AS values +SELECT element, num-1 AS offset +FROM (SELECT values AS element) AS subquery +ARRAY JOIN element, arrayEnumerate(element) AS num; + +/*----------+--------* + | element | offset | + +----------+--------+ + | foo | 0 | + | bar | 1 | + | baz | 2 | + | qux | 3 | + | corge | 4 | + | garply | 5 | + | waldo | 6 | + | fred | 7 | + *----------+--------*/ +``` + +**日付を返す配列** + +_BigQuery_ + +[GENERATE_DATE_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_date_array) 関数 + +```sql +SELECT GENERATE_DATE_ARRAY('2016-10-05', '2016-10-08') AS example; + +/*--------------------------------------------------* + | example | + +--------------------------------------------------+ + | [2016-10-05, 2016-10-06, 2016-10-07, 2016-10-08] | + *--------------------------------------------------*/ +``` + +[range](https://clickhouse.com/docs/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) + [arrayMap](/ja/sql-reference/functions/array-functions#arraymapfunc-arr1-) 関数 + +_ClickHouse_ + +```sql +SELECT arrayMap(x -> (toDate('2016-10-05') + x), range(toUInt32((toDate('2016-10-08') - toDate('2016-10-05')) + 1))) AS example + + ┌─example───────────────────────────────────────────────┐ +1. │ ['2016-10-05','2016-10-06','2016-10-07','2016-10-08'] │ + └───────────────────────────────────────────────────────┘ +``` + +**タイムスタンプを返す配列** + +_BigQuery_ + +[GENERATE_TIMESTAMP_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_timestamp_array) 関数 + +```sql +SELECT GENERATE_TIMESTAMP_ARRAY('2016-10-05 00:00:00', '2016-10-07 00:00:00', + INTERVAL 1 DAY) AS timestamp_array; + +/*--------------------------------------------------------------------------* + | timestamp_array | + +--------------------------------------------------------------------------+ + | [2016-10-05 00:00:00+00, 2016-10-06 00:00:00+00, 2016-10-07 00:00:00+00] | + *--------------------------------------------------------------------------*/ +``` + +_ClickHouse_ + +[range](https://clickhouse.com/docs/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) + [arrayMap](/ja/sql-reference/functions/array-functions#arraymapfunc-arr1-) 関数 + +```sql +SELECT arrayMap(x -> (toDateTime('2016-10-05 00:00:00') + toIntervalDay(x)), range(dateDiff('day', toDateTime('2016-10-05 00:00:00'), toDateTime('2016-10-07 00:00:00')) + 1)) AS timestamp_array + +Query id: b324c11f-655b-479f-9337-f4d34fd02190 + + ┌─timestamp_array─────────────────────────────────────────────────────┐ +1. │ ['2016-10-05 00:00:00','2016-10-06 00:00:00','2016-10-07 00:00:00'] │ + └─────────────────────────────────────────────────────────────────────┘ +``` + +**配列のフィルタリング** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた一時的な配列をテーブルに戻すことが必要 + +```sql +WITH Sequences AS + (SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL SELECT [5, 10] AS some_numbers) +SELECT + ARRAY(SELECT x * 2 + FROM UNNEST(some_numbers) AS x + WHERE x < 5) AS doubled_less_than_five +FROM Sequences; + +/*------------------------* + | doubled_less_than_five | + +------------------------+ + | [0, 2, 2, 4, 6] | + | [4, 8] | + | [] | + *------------------------*/ +``` + +_ClickHouse_ + +[arrayFilter](/ja/sql-reference/functions/array-functions#arrayfilterfunc-arr1-) 関数 + +```sql +WITH Sequences AS + ( + SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL + SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL + SELECT [5, 10] AS some_numbers + ) +SELECT arrayMap(x -> (x * 2), arrayFilter(x -> (x < 5), some_numbers)) AS doubled_less_than_five +FROM Sequences; + ┌─doubled_less_than_five─┐ +1. │ [0,2,2,4,6] │ + └────────────────────────┘ + ┌─doubled_less_than_five─┐ +2. │ [] │ + └────────────────────────┘ + ┌─doubled_less_than_five─┐ +3. │ [4,8] │ + └────────────────────────┘ +``` + +**配列のジッピング** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた配列をテーブルすることが必要 + +```sql +WITH + Combinations AS ( + SELECT + ['a', 'b'] AS letters, + [1, 2, 3] AS numbers + ) +SELECT + ARRAY( + SELECT AS STRUCT + letters[SAFE_OFFSET(index)] AS letter, + numbers[SAFE_OFFSET(index)] AS number + FROM Combinations + CROSS JOIN + UNNEST( + GENERATE_ARRAY( + 0, + LEAST(ARRAY_LENGTH(letters), ARRAY_LENGTH(numbers)) - 1)) AS index + ORDER BY index + ); + +/*------------------------------* + | pairs | + +------------------------------+ + | [{ letter: "a", number: 1 }, | + | { letter: "b", number: 2 }] | + *------------------------------*/ +``` + +_ClickHouse_ + +[arrayZip](/ja/sql-reference/functions/array-functions#arrayzip) 関数 + +```sql +WITH Combinations AS + ( + SELECT + ['a', 'b'] AS letters, + [1, 2, 3] AS numbers + ) +SELECT arrayZip(letters, arrayResize(numbers, length(letters))) AS pairs +FROM Combinations; + ┌─pairs─────────────┐ +1. │ [('a',1),('b',2)] │ + └───────────────────┘ +``` + +**配列の集計** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた配列テーブルへの変換が必要 + +```sql +WITH Sequences AS + (SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL SELECT [5, 10] AS some_numbers) +SELECT some_numbers, + (SELECT SUM(x) + FROM UNNEST(s.some_numbers) AS x) AS sums +FROM Sequences AS s; + +/*--------------------+------* + | some_numbers | sums | + +--------------------+------+ + | [0, 1, 1, 2, 3, 5] | 12 | + | [2, 4, 8, 16, 32] | 62 | + | [5, 10] | 15 | + *--------------------+------*/ +``` + +_ClickHouse_ + +[arraySum](/ja/sql-reference/functions/array-functions#arraysum), [arrayAvg](/ja/sql-reference/functions/array-functions#arrayavg), … 関数、または任意の 90 以上の集約関数名を[arrayReduce](/ja/sql-reference/functions/array-functions#arrayreduce)関数の引数として使用 + +```sql +WITH Sequences AS + ( + SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL + SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL + SELECT [5, 10] AS some_numbers + ) +SELECT + some_numbers, + arraySum(some_numbers) AS sums +FROM Sequences; + ┌─some_numbers──┬─sums─┐ +1. │ [0,1,1,2,3,5] │ 12 │ + └───────────────┴──────┘ + ┌─some_numbers──┬─sums─┐ +2. │ [2,4,8,16,32] │ 62 │ + └───────────────┴──────┘ + ┌─some_numbers─┬─sums─┐ +3. │ [5,10] │ 15 │ + └──────────────┴──────┘ +``` diff --git a/docs/ja/migrations/bigquery/loading-data.md b/docs/ja/migrations/bigquery/loading-data.md new file mode 100644 index 00000000000..3aa9b9e8f8a --- /dev/null +++ b/docs/ja/migrations/bigquery/loading-data.md @@ -0,0 +1,128 @@ +--- +sidebar_label: データのロード +title: BigQuery から ClickHouse へのデータのロード +slug: /ja/migrations/bigquery/loading-data +description: BigQuery から ClickHouse へのデータのロード方法 +keywords: [移行, データ, etl, elt, bigquery] +--- + +_このガイドは、ClickHouse Cloud およびセルフマネージドの場合は ClickHouse v23.5+ に対応しています。_ + +このガイドでは、[BigQuery](https://cloud.google.com/bigquery) から ClickHouse へのデータ移行の方法を説明します。 + +まず、テーブルを [Google のオブジェクトストア(GCS)](https://cloud.google.com/storage) にエクスポートし、そのデータを [ClickHouse Cloud](https://clickhouse.com/cloud) にインポートします。この手順は、BigQuery から ClickHouse にエクスポートしたい各テーブルに対して繰り返す必要があります。 + +## ClickHouseへのデータエクスポートにはどのくらい時間がかかりますか? + +BigQuery から ClickHouse へのデータエクスポートは、データセットのサイズに依存します。参考までに、このガイドを使用して [4TB の公開 Ethereum データセット](https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics) を BigQuery から ClickHouse にエクスポートするのに約1時間かかります。 + +| テーブル | 行数 | エクスポートファイル数 | データサイズ | BigQuery エクスポート | スロット時間 | ClickHouse インポート | +| --------------------------------------------------------------------------------------------------- | ------------- | ----------------- | --------- | --------------- | --------------- | ----------------- | +| [blocks](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/blocks.md) | 16,569,489 | 73 | 14.53GB | 23 秒 | 37 分 | 15.4 秒 | +| [transactions](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/transactions.md) | 1,864,514,414 | 5169 | 957GB | 1 分 38 秒 | 1 日 8 時間 | 18 分 5 秒 | +| [traces](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/traces.md) | 6,325,819,306 | 17,985 | 2.896TB | 5 分 46 秒 | 5 日 19 時間 | 34 分 55 秒 | +| [contracts](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/contracts.md) | 57,225,837 | 350 | 45.35GB | 16 秒 | 1 時間 51 分 | 39.4 秒 | +| 合計 | 8.26 billion | 23,577 | 3.982TB | 8 分 3 秒 | \> 6 日 5 時間 | 53 分 45 秒 | + +## 1. GCS へのテーブルデータのエクスポート + +このステップでは、[BigQuery SQL ワークスペース](https://cloud.google.com/bigquery/docs/bigquery-web-ui) を利用して SQL コマンドを実行します。以下では、`EXPORT DATA` ステートメントを使用して、`mytable` という BigQuery テーブルを GCS バケットにエクスポートします。 + +```sql +DECLARE export_path STRING; +DECLARE n INT64; +DECLARE i INT64; +SET i = 0; + +-- n を x billion 行に設定することを推奨します。例えば、5 billion 行なら n = 5 +SET n = 100; + +WHILE i < n DO + SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet'); + EXPORT DATA + OPTIONS ( + uri = export_path, + format = 'PARQUET', + overwrite = true + ) + AS ( + SELECT * FROM mytable WHERE export_id = i + ); + SET i = i + 1; +END WHILE; +``` + +上記のクエリでは、BigQuery テーブルを [Parquet データフォーマット](https://parquet.apache.org/) にエクスポートしています。また、`uri` パラメータに `*` 文字を使用しています。これにより、エクスポートが 1GB を超える場合、出力が複数のファイルに分散され、数値が増加するサフィックスが付与されます。 + +このアプローチには以下の利点があります: + +- Google は 1 日あたり最大 50TB を無料で GCS にエクスポートできます。ユーザは GCS ストレージの料金のみを支払います。 +- エクスポートは複数のファイルを自動的に生成し、それぞれ最大 1GB のテーブルデータに制限されます。これにより、Import 時に並列化が可能になるので ClickHouse にとって有益です。 +- Parquet は列指向フォーマットのため、圧縮されており、BigQuery がより速くエクスポートし、ClickHouse がより速くクエリ できるため、より良い交換フォーマットになります。 + +## 2. GCS から ClickHouse へのデータインポート + +エクスポートが完了したら、このデータを ClickHouse テーブルにインポートすることができます。以下のコマンドを実行するには、[ClickHouse SQL コンソール](/docs/ja/integrations/sql-clients/sql-console) または [`clickhouse-client`](/docs/ja/integrations/sql-clients/cli) を使用してください。 + +最初に、ClickHouse にテーブルを[作成](/docs/ja/sql-reference/statements/create/table)する必要があります: + +```sql +-- BigQuery テーブルに STRUCT 型のカラムが含まれている場合、 +-- そのカラムを ClickHouse の Nested 型のカラムにマップする設定を有効にする必要があります。 +SET input_format_parquet_import_nested = 1; + +CREATE TABLE default.mytable +( + `timestamp` DateTime64(6), + `some_text` String +) +ENGINE = MergeTree +ORDER BY (timestamp); +``` + +テーブルを作成したら、エクスポートを加速するために、クラスター内に複数の ClickHouse レプリカがある場合は、設定 `parallel_distributed_insert_select` を有効にします。ClickHouse ノードが1つしかない場合は、この手順をスキップできます: + +```sql +SET parallel_distributed_insert_select = 1; +``` + +最後に、`SELECT` クエリの結果に基づいてテーブルにデータを挿入する [`INSERT INTO SELECT` コマンド](/docs/ja/sql-reference/statements/insert-into#inserting-the-results-of-select) を使用して、GCS から ClickHouse テーブルにデータを挿入できます。 + +データを `INSERT` するためには、[s3Cluster 関数](/docs/ja/sql-reference/table-functions/s3Cluster) を使用して GCS バケットからデータを取得します。GCS は [Amazon S3](https://aws.amazon.com/s3/) と互換性があります。ClickHouse ノードが1つしかない場合は、`s3Cluster` 関数の代わりに [s3 テーブル関数](/ja/sql-reference/table-functions/s3) を使うことができます。 + +```sql +INSERT INTO mytable +SELECT + timestamp, + ifNull(some_text, '') as some_text +FROM s3Cluster( + 'default', + 'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz', + '', + '' +); +``` + +上記のクエリで使用されている `ACCESS_ID` と `SECRET` は、GCS バケットに関連付けられた [HMAC キー](https://cloud.google.com/storage/docs/authentication/hmackeys) です。 + +:::note NULL 可能なカラムをエクスポートする場合は `ifNull` を使用 +上記のクエリでは、[`ifNull` 関数](/docs/ja/sql-reference/functions/functions-for-nulls#ifnull) を使用して `some_text` カラムのデフォルト値を指定して ClickHouse テーブルにデータを挿入しています。ClickHouse のカラムを [`Nullable`](/docs/ja/sql-reference/data-types/nullable) にすることもできますが、パフォーマンスに悪影響を及ぼす可能性があるため推奨されません。 + +別の方法として、`SET input_format_null_as_default=1` を設定すると、欠落している値や NULL 値がそれぞれのカラムのデフォルト値に置き換えられます(そのデフォルトが指定されている場合)。 +::: + +## 3. データエクスポートの成功確認 + +データが正しく挿入されたかどうかを確認するには、新しいテーブルで `SELECT` クエリを実行してください: + +```sql +SELECT * FROM mytable limit 10; +``` + +他の BigQuery テーブルをエクスポートするには、上記の手順を追加の各テーブルに対して繰り返してください。 + +## さらに詳しい情報とサポート + +このガイドに加えて、[ClickHouse を使用して BigQuery を高速化し増分インポートを扱う方法](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries)を示すブログ記事もお勧めです。 + +BigQuery から ClickHouse へのデータ転送に問題がある場合は、support@clickhouse.com までお問い合わせください。 diff --git a/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md b/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md new file mode 100644 index 00000000000..71132f2a95d --- /dev/null +++ b/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md @@ -0,0 +1,593 @@ +--- +title: BigQueryからClickHouse Cloudへの移行 +slug: /ja/migrations/bigquery/migrating-to-clickhouse-cloud +description: BigQueryからClickHouse Cloudへのデータ移行方法 +keywords: [migrate, migration, migrating, data, etl, elt, bigquery] +--- + +## なぜBigQueryよりもClickHouse Cloudを選ぶのか? + +TL;DR: ClickHouseは、現代のデータ分析においてBigQueryよりも高速で、安価で、強力です。 + +
    + +NEEDS ALT + +
    + +## BigQueryからClickHouse Cloudへのデータロード + +### データセット + +BigQueryからClickHouse Cloudへの典型的な移行を示すためのサンプルデータセットとして、[こちら](/ja/getting-started/example-datasets/stackoverflow)で説明されているStack Overflowデータセットを使用します。これは、2008年から2024年4月までのStack Overflow上のすべての`post`、`vote`、`user`、`comment`、および`badge`を含んでいます。このデータのBigQueryスキーマは以下の通りです: + +
    + +NEEDS ALT + +
    + +移行手順をテストするために、このデータセットをBigQueryインスタンスで構築したいユーザーのために、GCSバケットでParquet形式のデータを提供しており、BigQueryでのテーブル作成およびロード用のDDLコマンドは[こちら](https://pastila.nl/?003fd86b/2b93b1a2302cfee5ef79fd374e73f431#hVPC52YDsUfXg2eTLrBdbA==)にあります。 + +### データ移行 + +BigQueryとClickHouse Cloud間のデータ移行には、主に2つのワークロードタイプがあります: + +- **初回の一括ロードと定期的な更新** - 初回データセットの移行が必要で、その後は一定間隔での定期更新(例えば、毎日)が必要です。ここでの更新は、変更された行を再送信することで処理され、比較に使用できるカラム(例えば、日付)またはXMIN値によって識別されます。削除は、データセットの完全な定期的なリロードによって処理されます。 +- **リアルタイムレプリケーションまたはCDC** - 初回データセットの移行が必要です。このデータセットへの変更は、数秒の遅延のみが許容される状態で、ClickHouseにほぼリアルタイムで反映される必要があります。これは実質的に[Change Data Capture (CDC)プロセス](https://en.wikipedia.org/wiki/Change_data_capture)であり、BigQueryのテーブルはClickHouseと同期される必要があります、すなわちBigQueryテーブルでの挿入、更新および削除は、ClickHouse内の同等のテーブルに適用されます。 + +#### Google Cloud Storage (GCS)による一括ロード + +BigQueryはGoogleのオブジェクトストア(GCS)へのデータエクスポートをサポートしています。我々のサンプルデータセットの場合: + +1. 7つのテーブルをGCSにエクスポートします。そのためのコマンドは[こちら](https://pastila.nl/?014e1ae9/cb9b07d89e9bb2c56954102fd0c37abd#0Pzj52uPYeu1jG35nmMqRQ==)にあります。 + +2. データをClickHouse Cloudにインポートします。ここで、[gcsテーブル関数](/ja/sql-reference/table-functions/gcs)を使用します。DDLとインポートクエリは[こちら](https://pastila.nl/?00531abf/f055a61cc96b1ba1383d618721059976#Wf4Tn43D3VCU5Hx7tbf1Qw==)にあります。ClickHouse Cloudインスタンスが複数のコンピュートノードから構成されているため、`gcs`テーブル関数の代わりに、gcsバケットでも動作しデータを並列でロードする[すべてのノードを利用するs3Clusterテーブル関数](/ja/sql-reference/table-functions/s3Cluster)を使用しています。 + +
    + +NEEDS ALT + +
    + +このアプローチには以下の利点があります: + +- BigQueryエクスポート機能は、データサブセットのエクスポートをフィルタリングするためのサポートが付いています。 +- BigQueryは[Parquet, Avro, JSON, CSV](https://cloud.google.com/bigquery/docs/exporting-data)形式およびいくつかの[圧縮タイプ](https://cloud.google.com/bigquery/docs/exporting-data)へのエクスポートをサポートしており、ClickHouseはこれらすべてをサポートしています。 +- GCSは[オブジェクトライフサイクル管理](https://cloud.google.com/storage/docs/lifecycle)をサポートしており、指定した期間後にClickHouseにエクスポートおよびインポートされたデータを削除できます。 +- [Googleは1日50TBまでGCSへのエクスポートを無料で許可しています](https://cloud.google.com/bigquery/quotas#export_jobs)。ユーザーはGCSストレージのみに支払いを行います。 +- エクスポートは自動的に複数のファイルを生成し、テーブルデータを最大1GBに制限します。これにより、Importを並列化することができます。 + +以下の例を試す前に、ユーザーは[エクスポートに必要な権限](https://cloud.google.com/bigquery/docs/exporting-data#required_permissions)およびエクスポートとインポートのパフォーマンスを最大化するための[地域推薦](https://cloud.google.com/bigquery/docs/exporting-data#data-locations)をレビューすることをお勧めします。 + +### スケジュールされたクエリによるリアルタイムレプリケーションまたはCDC + +Change Data Capture (CDC) は、2つのデータベース間でテーブルを同期させておくプロセスです。更新や削除をほぼリアルタイムで処理する場合、これは非常に複雑です。1つのアプローチは、BigQueryの[スケジュールされクエリ機能](https://cloud.google.com/bigquery/docs/scheduling-queries)を使って単純に定期的なエクスポートをスケジュールすることです。ClickHouseへのデータ挿入に若干の遅延を許容できるなら、このアプローチは実装が容易で維持が簡単です。[このブログ投稿](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries#using-scheduled-queries)では、一例が示されています。 + +## スキーマの設計 + +Stack Overflowデータセットには多数の関連テーブルが含まれています。まず主となるテーブルの移行に集中することをお勧めします。これが必ずしも最大のテーブルではなく、最も分析クエリを受けると予想されるテーブルかもしれません。これはClickHouseの主要な概念に精通するための手段となるでしょう。このテーブルは、ClickHouseの特性を最大限利用し、最適なパフォーマンスを得るためにさらなるテーブルを追加する際に再モデリングが必要になるかもしれません。このモデリングプロセスは[データモデリングドキュメント](/ja/data-modeling/schema-design#next-data-modelling-techniques)で探求しています。 + +この原則に従い、主な`posts`テーブルに焦点を当てます。このためのBigQueryスキーマは以下の通りです: + +```sql +CREATE TABLE stackoverflow.posts ( + id INTEGER, + posttypeid INTEGER, + acceptedanswerid STRING, + creationdate TIMESTAMP, + score INTEGER, + viewcount INTEGER, + body STRING, + owneruserid INTEGER, + ownerdisplayname STRING, + lasteditoruserid STRING, + lasteditordisplayname STRING, + lasteditdate TIMESTAMP, + lastactivitydate TIMESTAMP, + title STRING, + tags STRING, + answercount INTEGER, + commentcount INTEGER, + favoritecount INTEGER, + conentlicense STRING, + parentid STRING, + communityowneddate TIMESTAMP, + closeddate TIMESTAMP +); +``` + +### 型の最適化 + +このプロセスを適用すると、以下のスキーマが得られます: + +```sql +CREATE TABLE stackoverflow.posts +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT 'Optimized types' +``` + +このテーブルには、GCSからエクスポートされたデータを[`INSERT INTO SELECT`](/ja/sql-reference/statements/insert-into)を使って簡単に投入できます。ClickHouse Cloud上では、`gcs`互換の[s3Clusterテーブル関数](/ja/sql-reference/table-functions/s3Cluster)を使って、複数ノード経由でのロードを並列化することも可能です: + +```sql +INSERT INTO stackoverflow.posts SELECT * FROM gcs( 'gs://clickhouse-public-datasets/stackoverflow/parquet/posts/*.parquet', NOSIGN); +``` + +新しいスキーマにnullは保持されていません。上記のインサートは、これらをそれぞれのタイプに対するデフォルト値に自動的に変換します- 整数の場合は0、文字列の場合は空の値です。ClickHouseは、数値を自動的に対象精度に変換します。 + +## ClickHouseの主キーはどのように異なるのか? + +[こちら](/ja/migrations/bigquery)で説明されているように、BigQueryと同様に、ClickHouseはテーブルの主キーのカラム値の一意性を強制しません。 + +BigQueryのクラスタリングと似ていて、ClickHouseテーブルのデータは主キーのカラムによりディスク上で並べ替えられて保存されます。このソート順序は、クエリオプティマイザによってソートを回避し、結合のメモリ使用を最小化し、リミット句のショートカットを可能にします。 +BigQueryとは対照的に、ClickHouseは主キーのカラム値に基づいて[(スパースな)主インデックス](/ja/optimize/sparse-primary-indexes)を自動的に作成します。このインデックスは主キーのカラム上でフィルタがあるすべてのクエリを高速化するために利用されます。具体的には: + +- メモリとディスクの効率性は、ClickHouseがしばしば使用されるスケールの重要な要素です。データは部分と呼ばれるチャンクに分かれてClickHouseテーブルに書き込まれ、バックグラウンドで結合のルールが適用されます。ClickHouseでは、各部分は自分自身の主インデックスを持ちます。部分が結合されるとき、結合した部分の主インデックスも結合されます。これらのインデックスは各行ごとに構築されていません。代わりに、部分の主インデックスは行のグループごとに1つのインデックスエントリを持ちます- これはスパースインデキシングと呼ばれる技術です。 +- スパースインデキシングは、ClickHouseが指定されたキーによってディスク上の部分を並べて保存するため可能です。単一行を直接特定する(B-Treeベースのインデックスのように)のではなく、スパース主インデックスはクエリに一致する可能性のある行のグループをすばやくバイナリ検索によって特定します。一致する可能性のある行のグループは並列でClickHouseエンジンにストリームされ、マッチを見つけます。このインデックス設計により、主インデックスが小さく(主メモリに完全に収まる)なりつつ、特にデータ分析の使用例で典型的な範囲クエリの実行時間を大幅に短縮します。詳しい情報については、[この詳細ガイド](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +
    + +NEEDS ALT + +
    + +選択されたClickHouseの主キーは、インデックスだけでなく、データのディスクへの書き込み順序も決定します。このため、これは圧縮レベルに大きな影響を与える可能性があります。そして、それはクエリパフォーマンスに影響を与えることができます。すべてのカラムは指定された順序キーの値に基づいてソートされます。例えば`CreationDate`がキーとして使われる場合、すべての他のカラムの値の順序は`CreationDate`カラムの値の順序に対応します。複数の順序キーを指定することができます - これは`SELECT`クエリの`ORDER BY`句と同じセマンティクスで順序付けされます。 + +### 順序キーの選択 + +順序キーの選択における考慮事項とステップについて、例としてpostsテーブルを使用した場合は[こちら](/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 + +## データモデリング技術 + +BigQueryから移行するユーザーには、[ClickHouseでのデータモデリングガイド](/ja/data-modeling/schema-design)を読むことをお勧めします。このガイドは同じStack Overflowデータセットを使用し、ClickHouseの機能を使用した複数のアプローチを探ります。 + +### パーティション + +BigQueryのユーザーは、テーブルを小さく管理しやすいパーツ(パーティション)に分割することで、大規模なデータベースのパフォーマンスと管理を向上させる方法であるテーブルパーティションの概念に親しんでいるでしょう。このパーティションは、指定されたカラムの範囲(例:日付)、定義されたリスト、またはキーに基づくハッシュによって達成されます。これにより、管理者は特定の基準(例:日付範囲や地理的な位置)に基づいてデータを整理できます。 + +パーティション化は、パーティションプルーニングを通じて迅速なデータアクセスと効率的なインデックス作成を実現し、クエリ性能を向上させます。また、バックアップやデータ削除などの保守タスクを個別のパーティション上で実行できるようにし、テーブル全体に対して操作せずに済むようにします。それにより、パーティション化は複数のパーティション間で負荷を分散することで、BigQueryデータベースのスケーラビリティを大幅に向上させます。 + +ClickHouseでは、パーティション化は最初に表を定義する際に[`PARTITION BY`](/ja/engines/table-engines/mergetree-family/custom-partitioning-key)句によって指定されます。この句は、任意のカラムのSQL式を含むことができ、この結果によって行がどのパーティションに送られるかが定義されます。 + +
    + +NEEDS ALT + +
    + +データパーツはディスク上で各パーティションに論理的に関連付き、単独でクエリを実行できます。以下の例では、[`toYear(CreationDate)`](/ja/sql-reference/functions/date-time-functions#toyear)を使用して年ごとに投稿テーブルをパーティション化しています。行がClickHouseに挿入されるとき、この式は各行に対して評価され、クエリ中に結果パーティションにルーティングされます。 + +```sql +CREATE TABLE posts +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), +... + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) +PARTITION BY toYear(CreationDate) +``` + +#### アプリケーション + +ClickHouseのパーティション化は、BigQueryにおける同様のアプリケーションを持っていますが、いくつかの微妙な違いがあります。具体的には: + +- **データ管理** - ClickHouseでは、ユーザーは主にパーティションをデータ管理機能と見なすべきです。データを特定のキーに基づいて論理的に分割することで、各パーティションに個別に操作を加えられるようになります。これにより、ユーザーはパーティションを権利により迅速に移動したり、[ストレージティアにデータを動かしたり](/ja/integrations/s3#storage-tiers)するなどの効率的な操作が可能になります。例として、古いポストを削除する場合: + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'posts' + +┌─partition─┐ +│ 2008 │ +│ 2009 │ +│ 2010 │ +│ 2011 │ +│ 2012 │ +│ 2013 │ +│ 2014 │ +│ 2015 │ +│ 2016 │ +│ 2017 │ +│ 2018 │ +│ 2019 │ +│ 2020 │ +│ 2021 │ +│ 2022 │ +│ 2023 │ +│ 2024 │ +└───────────┘ + +17 rows in set. Elapsed: 0.002 sec. + + ALTER TABLE posts + (DROP PARTITION '2008') + +Ok. + +0 rows in set. Elapsed: 0.103 sec. +``` + +- **クエリ最適化** - パーティションはクエリ性能に役立つ可能性がありますが、これがどの程度の利点をもたらすかはアクセスパターンに大きく依存します。クエリが少数のパーティション(理想的にはひとつ)に限定されている場合、パフォーマンスが向上する可能性があります。これは、通常、主キーにないパーティションキーでフィルタリングする場合に役立ちます。しかし、多くのパーティションをカバーするクエリは、パーティションが使用されない場合よりもクエリ性能が低下する可能性があります(パーティションによって可能な部分が増加するため)。パーティションを利用して`GROUP BY`クエリを最適化することができますが、これは各パーティション内の値がユニークである場合のみ効果的です。しかし、一般的には主キーが最適化されていることを確認し、アクセスパターンが特定の予測可能なサブセットに絞られている特別な場合にのみクエリ最適化技法としてパーティション化を検討すべきです、例えば日付でパーティション化し、最近の日付のクエリが多い場合に有用です。 + +#### 推奨事項 + +パーティション化はデータ管理技術であると考えるべきです。これは、時系列データの操作時、例えば最も古いパーティションを[単に削除する](/ja/sql-reference/statements/alter/partition#alter_drop-partition)といった方法でクラスタからデータを削除する必要がある場合に理想的です。 + +重要:パーティションキーの式が高いカーディナリティのセットを生成しないようにしてください、すなわち100以上のパーティションの作成は避けるべきです。例えば、クライアント識別子や名前といった高カーディナリティカラムでデータをパーティション化しないでください。代わりに、クライアント識別子や名前を`ORDER BY`式の最初のカラムにします。 + +> 内部的に、ClickHouseは挿入されたデータの[部分を作成](/ja/optimize/sparse-primary-indexes#clickhouse-index-design)します。より多くのデータが挿入されると、部分の数が増加します。部分の数が指定された制限を超えた場合、ClickHouseは["too many parts"エラー](/docs/knowledgebase/exception-too-many-parts)として設定されたルールに従って挿入時に例外を投げます。これは通常の操作下では発生しません。ClickHouseが不適切に設定されている場合や間違って使用されている場合(例:多くの小さい挿入)だけです。部分はパーティションごとに分離して作成されるため、パーティション数を増やすことは部分の数も増加させます。高カーディナリティのパーティションキーはこのエラーを引き起こす可能性があるので避けるべきです。 + +## Materialized ViewとProjectionの違い + +ClickHouseのプロジェクションの概念により、ユーザーはテーブルの複数の`ORDER BY`句を指定できます。 + +[ClickHouseのデータモデリング](/ja/data-modeling/schema-design)では、ClickHouseにおいて集計を事前計算するためにMaterialized Viewを使用し、行を変換し、異なるアクセスパターンのクエリを最適化する方法について探ります。後者については、Materialized Viewが行を異なる順序のターゲットテーブルに送信する場合の[例を提供しました](/ja/materialized-view#lookup-table)。 + +例えば、次のクエリを考えてみてください: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ + │ 0.18181818181818182 │ + └────────────────────┘ + +1 row in set. Elapsed: 0.040 sec. Processed 90.38 million rows, 361.59 MB (2.25 billion rows/s., 9.01 GB/s.) +Peak memory usage: 201.93 MiB. +``` + +このクエリは`UserId`が順序キーではないため、すべての90m行をスキャンする必要があります。以前は、リッチアップ用のMaterialized Viewを使って`PostId`のLOOKUPを提供しました。プロジェクションを用いても同じ問題を解決できます。以下のコマンドは`ORDER BY user_id`のプロジェクションを追加します。 + +```sql +ALTER TABLE comments ADD PROJECTION comments_user_id ( +SELECT * ORDER BY UserId +) + +ALTER TABLE comments MATERIALIZE PROJECTION comments_user_id +``` + +最初にプロジェクションを作成し、その後にマテリアライズしなければなりません。この後者のコマンドはデータを2回異なる順序でディスクに保存させます。プロジェクションは、以下に示すようにデータが作成されるときに定義することもでき、挿入されるデータに応じて自動的に保守されます。 + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String), + PROJECTION comments_user_id + ( + SELECT * + ORDER BY UserId + ) +) +ENGINE = MergeTree +ORDER BY PostId +``` + +プロジェクションが`ALTER`コマンドを介して作成される場合、`MATERIALIZE PROJECTION`コマンドが発行されたときに作成は非同期です。ユーザーは次のクエリを使ってこの操作の進捗を確認し、`is_done=1`を待つことができます。 + +```sql +SELECT + parts_to_do, + is_done, + latest_fail_reason +FROM system.mutations +WHERE (`table` = 'comments') AND (command LIKE '%MATERIALIZE%') + + ┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +1. │ 1 │ 0 │ │ + └─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +このクエリを繰り返すと、追加のストレージを使用する代わりにパフォーマンスが大幅に向上していることが確認できます。 + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. Processed 16.36 thousand rows, 98.17 KB (2.15 million rows/s., 12.92 MB/s.) +Peak memory usage: 4.06 MiB. +``` + +[`EXPLAIN`コマンド](/ja/sql-reference/statements/explain)を使用して、このクエリにプロジェクションが使用されたことを確認することもできます: + +```sql +EXPLAIN indexes = 1 +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌─explain─────────────────────────────────────────────┐ + 1. │ Expression ((Projection + Before ORDER BY)) │ + 2. │ Aggregating │ + 3. │ Filter │ + 4. │ ReadFromMergeTree (comments_user_id) │ + 5. │ Indexes: │ + 6. │ PrimaryKey │ + 7. │ Keys: │ + 8. │ UserId │ + 9. │ Condition: (UserId in [8592047, 8592047]) │ +10. │ Parts: 2/2 │ +11. │ Granules: 2/11360 │ + └─────────────────────────────────────────────────────┘ + +11 rows in set. Elapsed: 0.004 sec. +``` + +### プロジェクションの使用時期 + +プロジェクションは自動的に保守されるため、新しいユーザーには魅力的です。さらに、一つのテーブルに単にクエリを送信し、プロジェクションによって可能な場合に応じて応答時間を短縮できます。 + +
    + +NEEDS ALT + +
    + +これは、ユーザーが適切な最適化済ターゲットテーブルを選ぶか、フィルタに応じてクエリを書き換える必要があるMaterialized Viewとは対照的です。これにより、ユーザーアプリケーションにより大きな重点が置かれ、クライアント側の複雑さが増します。 + +これらの利点にもかかわらず、プロジェクションにはいくつかの制約があり、ユーザーはこれを認識し、慎重に展開するべきです: + +- プロジェクションは、元のテーブルと異なる有効期限(TTL)を使用することはできません。Materialized viewで異なるTTLを使用することができます。 +- プロジェクションは、(サードテーブル)において現在[`optimize_read_in_order`](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)をサポートしていません。 +- プロジェクションを持つテーブルには論理更新や削除がサポートされていません。 +- Materialized viewはチェーン可能:あるMaterialized viewのターゲットテーブルが別のMaterialized viewのソーステーブルになることができ、さらに続けることができます。プロジェクションではこれは不可能です。 +- プロジェクションはジョインをサポートしていませんが、Materialized viewはサポートしています。 +- プロジェクションはフィルタ(`WHERE`句)をサポートしていませんが、Materialized viewはサポートしています。 + +プロジェクションを使うことをお勧めする場合: + +- データの完全な並べ替えが必要です。プロジェクション内の式は理論的には`GROUP BY`を用いることができますが、Materialized viewの方が集計を保守するにはより効果的です。クエリオプティマイザも単純な並べ替えを使用するプロジェクションの方が`SELECT * ORDER BY x`によるものとして利用しやすくなっています。ユーザーはストレージフットプリントを削減するために、この式で一部のカラムを選択することができます。 +- データを2回書き込むことによるストレージフットプリントの拡大、およびオーバーヘッドに慣れている。挿入速度への影響をテストし、[ストレージオーバーヘッドを評価](/ja/data-compression/compression-in-clickhouse)します。 + +## BigQueryクエリのClickHouseへの書き換え + +以下は、BigQueryとClickHouseを比較するクエリの例を提供します。このリストは、ClickHouseの機能を利用してクエリを大幅に簡素化する方法を示しています。以下の例は、Stack Overflowデータセット(2024年4月まで)を使用しています。 + +**10個以上の質問を持つユーザーで最も多くビューを得たもの:** + +_BigQuery_ + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +SELECT + OwnerDisplayName, + sum(ViewCount) AS total_views +FROM stackoverflow.posts +WHERE (PostTypeId = 'Question') AND (OwnerDisplayName != '') +GROUP BY OwnerDisplayName +HAVING count() > 10 +ORDER BY total_views DESC +LIMIT 5 + + ┌─OwnerDisplayName─┬─total_views─┐ +1. │ Joan Venge │ 25520387 │ +2. │ Ray Vega │ 21576470 │ +3. │ anon │ 19814224 │ +4. │ Tim │ 19028260 │ +5. │ John │ 17638812 │ + └──────────────────┴─────────────┘ + +5 rows in set. Elapsed: 0.076 sec. Processed 24.35 million rows, 140.21 MB (320.82 million rows/s., 1.85 GB/s.) +Peak memory usage: 323.37 MiB. +``` + +**最も多くのビューを受けたタグ:** + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +-- ClickHouse +SELECT + arrayJoin(arrayFilter(t -> (t != ''), splitByChar('|', Tags))) AS tags, + sum(ViewCount) AS views +FROM stackoverflow.posts +GROUP BY tags +ORDER BY views DESC +LIMIT 5 + + + ┌─tags───────┬──────views─┐ +1. │ javascript │ 8190916894 │ +2. │ python │ 8175132834 │ +3. │ java │ 7258379211 │ +4. │ c# │ 5476932513 │ +5. │ android │ 4258320338 │ + └────────────┴────────────┘ + +5 rows in set. Elapsed: 0.318 sec. Processed 59.82 million rows, 1.45 GB (188.01 million rows/s., 4.54 GB/s.) +Peak memory usage: 567.41 MiB. +``` + +## 集計関数 + +可能な限り、ユーザーはClickHouseの集計関数を利用すべきです。以下では、各年で最もビューの多い質問を計算するために[`argMax`関数](/ja/sql-reference/aggregate-functions/reference/argmax)を使用する例を示しています。 + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +-- ClickHouse +SELECT + toYear(CreationDate) AS Year, + argMax(Title, ViewCount) AS MostViewedQuestionTitle, + max(ViewCount) AS MaxViewCount +FROM stackoverflow.posts +WHERE PostTypeId = 'Question' +GROUP BY Year +ORDER BY Year ASC +FORMAT Vertical + + +Row 1: +────── +Year: 2008 +MostViewedQuestionTitle: How to find the index for a given item in a list? +MaxViewCount: 6316987 + +Row 2: +────── +Year: 2009 +MostViewedQuestionTitle: How do I undo the most recent local commits in Git? +MaxViewCount: 13962748 + +… + +Row 16: +─────── +Year: 2023 +MostViewedQuestionTitle: How do I solve "error: externally-managed-environment" every time I use pip 3? +MaxViewCount: 506822 + +Row 17: +─────── +Year: 2024 +MostViewedQuestionTitle: Warning "Third-party cookie will be blocked. Learn more in the Issues tab" +MaxViewCount: 66975 + +17 rows in set. Elapsed: 0.225 sec. Processed 24.35 million rows, 1.86 GB (107.99 million rows/s., 8.26 GB/s.) +Peak memory usage: 377.26 MiB. +``` + +## 条件式と配列 + +条件式と配列関数はクエリを大幅に簡素化します。次のクエリは、2022年から2023年にかけて最も割合増加したタグ(10000件以上の出現数があるもの)を計算します。次のClickHouseクエリは、条件式、配列関数、および`HAVING`や`SELECT`句でのエイリアス再利用の能力により簡潔です。 + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +SELECT + arrayJoin(arrayFilter(t -> (t != ''), splitByChar('|', Tags))) AS tag, + countIf(toYear(CreationDate) = 2023) AS count_2023, + countIf(toYear(CreationDate) = 2022) AS count_2022, + ((count_2023 - count_2022) / count_2022) * 100 AS percent_change +FROM stackoverflow.posts +WHERE toYear(CreationDate) IN (2022, 2023) +GROUP BY tag +HAVING (count_2022 > 10000) AND (count_2023 > 10000) +ORDER BY percent_change DESC +LIMIT 5 + +┌─tag─────────┬─count_2023─┬─count_2022─┬──────percent_change─┐ +│ next.js │ 13788 │ 10520 │ 31.06463878326996 │ +│ spring-boot │ 16573 │ 17721 │ -6.478189718413183 │ +│ .net │ 11458 │ 12968 │ -11.644046884639112 │ +│ azure │ 11996 │ 14049 │ -14.613139725247349 │ +│ docker │ 13885 │ 16877 │ -17.72826924216389 │ +└─────────────┴────────────┴────────────┴─────────────────────┘ + +5 rows in set. Elapsed: 0.096 sec. Processed 5.08 million rows, 155.73 MB (53.10 million rows/s., 1.63 GB/s.) +Peak memory usage: 410.37 MiB. +``` + +これで、BigQueryからClickHouseへのユーザー移行用の基本ガイドが終了します。BigQueryからの移行を行うユーザーには、[ClickHouseでのデータモデリングガイド](/ja/data-modeling/schema-design)を読み、高度なClickHouseの機能を学ぶことをお勧めします。 +``` diff --git a/docs/ja/migrations/images/bigquery-1.png b/docs/ja/migrations/images/bigquery-1.png new file mode 100644 index 00000000000..413f5edfce5 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-1.png differ diff --git a/docs/ja/migrations/images/bigquery-10.png b/docs/ja/migrations/images/bigquery-10.png new file mode 100644 index 00000000000..250ba4635f6 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-10.png differ diff --git a/docs/ja/migrations/images/bigquery-11.png b/docs/ja/migrations/images/bigquery-11.png new file mode 100644 index 00000000000..aa09b54513e Binary files /dev/null and b/docs/ja/migrations/images/bigquery-11.png differ diff --git a/docs/ja/migrations/images/bigquery-12.png b/docs/ja/migrations/images/bigquery-12.png new file mode 100644 index 00000000000..c57f50b6413 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-12.png differ diff --git a/docs/ja/migrations/images/bigquery-2.png b/docs/ja/migrations/images/bigquery-2.png new file mode 100644 index 00000000000..a1613c3268f Binary files /dev/null and b/docs/ja/migrations/images/bigquery-2.png differ diff --git a/docs/ja/migrations/images/bigquery-3.png b/docs/ja/migrations/images/bigquery-3.png new file mode 100644 index 00000000000..6547a43d4cc Binary files /dev/null and b/docs/ja/migrations/images/bigquery-3.png differ diff --git a/docs/ja/migrations/images/bigquery-4.png b/docs/ja/migrations/images/bigquery-4.png new file mode 100644 index 00000000000..53d05579c52 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-4.png differ diff --git a/docs/ja/migrations/images/bigquery-5.png b/docs/ja/migrations/images/bigquery-5.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/migrations/images/bigquery-5.png differ diff --git a/docs/ja/migrations/images/bigquery-6.png b/docs/ja/migrations/images/bigquery-6.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/migrations/images/bigquery-6.png differ diff --git a/docs/ja/migrations/images/bigquery-7.png b/docs/ja/migrations/images/bigquery-7.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-7.png differ diff --git a/docs/ja/migrations/images/bigquery-8.png b/docs/ja/migrations/images/bigquery-8.png new file mode 100644 index 00000000000..1411c2f771a Binary files /dev/null and b/docs/ja/migrations/images/bigquery-8.png differ diff --git a/docs/ja/migrations/images/bigquery-9.png b/docs/ja/migrations/images/bigquery-9.png new file mode 100644 index 00000000000..4d3a686bb58 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-9.png differ diff --git a/docs/ja/migrations/images/migrate_snowflake_clickhouse.png b/docs/ja/migrations/images/migrate_snowflake_clickhouse.png new file mode 100644 index 00000000000..9367121610a Binary files /dev/null and b/docs/ja/migrations/images/migrate_snowflake_clickhouse.png differ diff --git a/docs/ja/migrations/images/postgres-b-tree.png b/docs/ja/migrations/images/postgres-b-tree.png new file mode 100644 index 00000000000..9198fc18489 Binary files /dev/null and b/docs/ja/migrations/images/postgres-b-tree.png differ diff --git a/docs/ja/migrations/images/postgres-partitions.png b/docs/ja/migrations/images/postgres-partitions.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/migrations/images/postgres-partitions.png differ diff --git a/docs/ja/migrations/images/postgres-projections.png b/docs/ja/migrations/images/postgres-projections.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/migrations/images/postgres-projections.png differ diff --git a/docs/ja/migrations/images/postgres-replacingmergetree.png b/docs/ja/migrations/images/postgres-replacingmergetree.png new file mode 100644 index 00000000000..4c72c61a71d Binary files /dev/null and b/docs/ja/migrations/images/postgres-replacingmergetree.png differ diff --git a/docs/ja/migrations/images/postgres-sparse-index.png b/docs/ja/migrations/images/postgres-sparse-index.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/migrations/images/postgres-sparse-index.png differ diff --git a/docs/ja/migrations/images/postgres-stackoverflow-schema.png b/docs/ja/migrations/images/postgres-stackoverflow-schema.png new file mode 100644 index 00000000000..6e3f7595a93 Binary files /dev/null and b/docs/ja/migrations/images/postgres-stackoverflow-schema.png differ diff --git a/docs/ja/migrations/postgres/data-modeling-techniques.md b/docs/ja/migrations/postgres/data-modeling-techniques.md new file mode 100644 index 00000000000..22743c4be38 --- /dev/null +++ b/docs/ja/migrations/postgres/data-modeling-techniques.md @@ -0,0 +1,238 @@ +--- +slug: /ja/migrations/postgresql/data-modeling-techniques +title: データモデリング手法 +description: PostgreSQLからClickHouseへの移行のためのデータモデリング +keywords: [postgres, postgresql, migrate, migration, data modeling] +--- + +> これは、PostgreSQLからClickHouseへの移行に関するガイドの**パート3**です。このコンテンツは入門的なものであり、ユーザーがClickHouseのベストプラクティスに準拠した初期の機能的なシステムを展開するのを助けることを目的としています。複雑なトピックを避け、完全に最適化されたスキーマにはなりませんが、本番システムを構築し、学習をベースにするための堅実な基盤を提供します。 + +Postgresから移行するユーザーには、[ClickHouseでのデータモデリングに関するガイド](/ja/data-modeling/schema-design)を読むことをお勧めします。このガイドでは、同じStack Overflowデータセットを使用し、ClickHouseの機能を使用した複数のアプローチを探求します。 + +## パーティション + +Postgresユーザーは、大規模なデータベースのパフォーマンスと管理性を向上させるために、テーブルをより小さく管理しやすい部分に分割するテーブルパーティショニングの概念に慣れています。パーティショニングは、指定されたカラム(例:日付)の範囲、定義されたリスト、またはキーのハッシュを使用して達成されます。これにより、管理者は日付範囲や地理的な位置などの特定の基準に基づいてデータを整理することができます。パーティショニングは、パーティションプルーニングによるより高速なデータアクセスとより効率的なインデックス化を可能にすることでクエリのパフォーマンスを向上させます。また、バックアップやデータのパージのような保守作業を個々のパーティションで実行できるようにすることで効率を高めます。さらに、複数のパーティションに負荷を分散することで、PostgreSQLデータベースのスケーラビリティを大幅に向上させることができます。 + +ClickHouseでは、パーティショニングはテーブルが最初に定義される際に`PARTITION BY`句を通じて指定されます。この句には、任意のカラムに対するSQL式を含むことができ、その結果がどのパーティションに行を送るかを決定します。 + +
    + +NEEDS ALT + +
    + +データパーツはディスク上で各パーティションに論理的に関連付けられ、個別にクエリを実行することができます。以下の例では、`posts`テーブルを`toYear(CreationDate)`という式を使用して年ごとにパーティション分割します。行がClickHouseに挿入されると、この式が各行に対して評価され、該当するパーティションが存在する場合にルーティングされます(もし行がその年の最初のものであれば、パーティションが作成されます)。 + +```sql +CREATE TABLE posts +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), +... + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) +PARTITION BY toYear(CreationDate) +``` + +## パーティションの利用法 + +ClickHouseにおけるパーティショニングには、Postgresと同様の利用法がありますが、いくつか微妙な違いがあります。具体的には以下の通りです: + +- **データ管理** - ClickHouseでは、ユーザーは主にパーティショニングをデータ管理の機能と考えるべきであり、クエリの最適化技術とは考えないでください。キーに基づいてデータを論理的に分離することで、それぞれのパーティションを独立して操作することができます(例:削除)。これにより、パーティションを移動させることができるため、時間に応じて効率的に[ストレージ階層間で](/ja/integrations/s3#storage-tiers)サブネットを移動させたり、[データを期限切れにする/効率的にクラスターから削除する](/ja/sql-reference/statements/alter/partition)ことができます。例えば、以下では2008年の投稿を削除します。 + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'posts' + +┌─partition─┐ +│ 2008 │ +│ 2009 │ +│ 2010 │ +│ 2011 │ +│ 2012 │ +│ 2013 │ +│ 2014 │ +│ 2015 │ +│ 2016 │ +│ 2017 │ +│ 2018 │ +│ 2019 │ +│ 2020 │ +│ 2021 │ +│ 2022 │ +│ 2023 │ +│ 2024 │ +└───────────┘ + +17 rows in set. Elapsed: 0.002 sec. + + ALTER TABLE posts + (DROP PARTITION '2008') + +Ok. + +0 rows in set. Elapsed: 0.103 sec. +``` + +- **クエリの最適化** - パーティションはクエリのパフォーマンスに役立つことがありますが、これはアクセスパターンに大きく依存します。クエリが数個(理想的には1つ)のパーティションのみをターゲットとする場合、性能が向上する可能性があります。これは通常、パーティショニングキーが主キーに含まれておらず、それでフィルタリングを行う場合に有用です。しかし、多くのパーティションをカバーする必要があるクエリは、パーティショニングを使用しない場合よりも性能が悪化する可能性があります(その結果、より多くのパーツが発生する可能性があるため)。特定のパーティションをターゲットとするメリットは、既に主キーの初期エントリとしてパーティショニングキーがある場合、存在しないかのように低下します。パーティショニングはまた、各パーティションの値がユニークである場合に[GROUP BYクエリを最適化](/ja/engines/table-engines/mergetree-family/custom-partitioning-key#group-by-optimisation-using-partition-key)するためにも使用できます。しかし一般的に、ユーザーは主キーが最適化されていることを確認し、特定の予測可能なサブセットへのアクセスパターンがある例外的な場合にのみ、クエリ最適化技術としてパーティショニングを検討すべきです。例:日ごとにパーティショニングし、ほとんどのクエリが過去1日以内に行われる場合。 + +## パーティションに関する推奨事項 + +ユーザーはパーティショニングをデータ管理の技術として考慮すべきです。これは、タイムシリーズデータを扱う際にクラスタからデータを期限切れにする必要がある場合に理想的です。例:最古のパーティションを[単に削除](/ja/sql-reference/statements/alter/partition#alter_drop-partition)することができます。 + +**重要:** パーティショニングキーの式が高カーディナリティのセットつまり100を超えるパーティションを生成しないことを確認してください。例えば、クライアント識別子や名前のような高カーディナリティのカラムでデータをパーティショニングしないでください。代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにしてください。 + +> 内部的には、ClickHouseは挿入されたデータに対して[パーツを生成します](/ja/optimize/sparse-primary-indexes#clickhouse-index-design)。データが多く挿入されるにつれて、パーツの数が増加します。クエリの性能を低下させる非常に多くのパーツを防ぐために、パーツはバックグラウンドの非同期プロセスで統合されます。パーツの数が設定された制限を超えると、ClickHouseは挿入時に例外をスローします。この問題は通常の操作下で発生せず、ClickHouseが誤って設定されているか誤って使用されている場合にのみ発生します。例:多くの小さな挿入。 + +> パーツはパーティションごとに個別に作成されるため、パーティションの数が増えるとパーツの数も増えます。これはパーティション数の倍数です。したがって、高カーディナリティのパーティショニングキーはこのエラーを引き起こす可能性があるため、避けるべきです。 + +## マテリアライズドビューとプロジェクション + +Postgresでは、単一のテーブルに複数のインデックスを作成することで、さまざまなアクセスパターンを最適化できます。この柔軟性により、管理者と開発者は特定のクエリと運用ニーズに合わせてデータベースのパフォーマンスを調整することができます。ClickHouseのプロジェクションの概念はそれと完全に同一ではありませんが、テーブルに対して複数の`ORDER BY`句を指定することができます。 + +ClickHouse [データモデリングドキュメント](/ja/data-modeling/schema-design)では、ClickHouseにおいてマテリアライズドビューがどのようにして集計を事前計算したり、行を変換したり、さまざまなアクセスパターンに基づいてクエリを最適化するために使用できるかを探求しています。 + +これに関連して、[前述の例](/ja/materialized-view#lookup-table)では、マテリアライズドビューが挿入を受ける元のテーブルとは別の順序キーで行をターゲットテーブルに送信する使い方を示しました。 + +例えば、次のクエリを考えてみてください: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.040 sec. Processed 90.38 million rows, 361.59 MB (2.25 billion rows/s., 9.01 GB/s.) +Peak memory usage: 201.93 MiB. +``` + +このクエリは`UserId`がオーダリングキーではないため、全90m行を(比較的高速に)スキャンする必要があります。以前は、PostIdのルックアップとして機能するマテリアライズドビューを使用してこの問題を解決しました。同じ問題はプロジェクションを使用して解決することができます。以下のコマンドは`ORDER BY user_id`のプロジェクションを追加します。 + +```sql +ALTER TABLE comments ADD PROJECTION comments_user_id ( +SELECT * ORDER BY UserId +) + +ALTER TABLE comments MATERIALIZE PROJECTION comments_user_id +``` + +プロジェクションを最初に作成し、それをマテリアライズする必要があることに注意してください。この後者のコマンドは、データをディスク上に2回異なる順序で保持します。以下に示すように、データが作成される際にプロジェクションを定義することも可能であり、データが挿入されると自動的に維持されます。 + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String), + PROJECTION comments_user_id + ( + SELECT * + ORDER BY UserId + ) +) +ENGINE = MergeTree +ORDER BY PostId +``` + +`ALTER`でプロジェクションが作成される場合、`MATERIALIZE PROJECTION`コマンドが発行されると、作成は非同期になります。ユーザーは以下のクエリを使用してこの操作の進行状況を確認し、`is_done=1`を待ちます。 + +```sql +SELECT + parts_to_do, + is_done, + latest_fail_reason +FROM system.mutations +WHERE (`table` = 'comments') AND (command LIKE '%MATERIALIZE%') + + ┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +1. │ 1 │ 0 │ │ + └─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +上記のクエリを再実行すると、追加のストレージが必要となる代わりにパフォーマンスが大幅に改善されたことがわかります。 + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. Processed 16.36 thousand rows, 98.17 KB (2.15 million rows/s., 12.92 MB/s.) +Peak memory usage: 4.06 MiB. +``` + +`EXPLAIN`コマンドを使用して、このクエリを供給するためにプロジェクションが使用されたことも確認できます: + +```sql +EXPLAIN indexes = 1 +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌─explain─────────────────────────────────────────────┐ + 1. │ Expression ((Projection + Before ORDER BY)) │ + 2. │ Aggregating │ + 3. │ Filter │ + 4. │ ReadFromMergeTree (comments_user_id) │ + 5. │ Indexes: │ + 6. │ PrimaryKey │ + 7. │ Keys: │ + 8. │ UserId │ + 9. │ Condition: (UserId in [8592047, 8592047]) │ +10. │ Parts: 2/2 │ +11. │ Granules: 2/11360 │ + └─────────────────────────────────────────────────────┘ + +11 rows in set. Elapsed: 0.004 sec. +``` + +## プロジェクションを使用するタイミング + +プロジェクションは自動的にデータが挿入されると維持されるため、新しいユーザーには魅力的な機能です。さらに、クエリを単一のテーブルに送るだけで、それに応じてプロジェクションが活用され、応答時間が高速化されます。 + +
    + +NEEDS ALT + +
    + +これはマテリアライズドビューと対照的であり、その場合、ユーザーはフィルタに応じて適切な最適化されたターゲットテーブルを選ぶか、クエリを書き換える必要があります。これはユーザーアプリケーションにより大きな重みを置き、クライアント側の複雑さを増します。 + +これらの利点にもかかわらず、プロジェクションには内部的な制限があり、ユーザーはそれを認識した上で、慎重に配備すべきです。 + +- プロジェクションは、ソーステーブルと(非表示の)ターゲットテーブルで異なるTTLを使用することはできませんが、マテリアライズドビューでは可能です。 +- プロジェクションは、`optimize_read_in_order`を(非表示の)ターゲットテーブルで[現時点ではサポートしていません](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)。 +- プロジェクションを持つテーブルでは軽量な更新や削除はサポートされていません。 +- マテリアライズドビューは連鎖可能であり、あるマテリアライズドビューのターゲットテーブルを別のマテリアライズドビューのソーステーブルにすることができますが、プロジェクションではそれができません。 +- プロジェクションはジョインをサポートしていませんが、マテリアライズドビューはサポートします。 +- プロジェクションはフィルタ(WHERE句)をサポートしていませんが、マテリアライズドビューはサポートします。 + +プロジェクションを使用することをお勧めする状況は以下の場合です: + +- データの完全な再順序が必要である場合。プロジェクションの中の式は理論的には`GROUP BY`を使用できますが、集計を維持するにはマテリアライズドビューの方が効果的です。クエリオプティマイザーは、単純な再順序付け、すなわち`SELECT * ORDER BY x`を使用するプロジェクションをより多く利用しやすいです。これにより、ユーザーはこの式の中でカラムのサブセットを選んでストレージのフットプリントを減らすことができます。 +- データを二重に書き込むことによるストレージフットプリントの増加に慣れています。挿入速度への影響をテストし、[ストレージのオーバーヘッドを評価](/ja/data-compression/compression-in-clickhouse)してください。 + +[パート4はこちらをクリック](/ja/migrations/postgresql/rewriting-queries)。 diff --git a/docs/ja/migrations/postgres/dataset.md b/docs/ja/migrations/postgres/dataset.md new file mode 100644 index 00000000000..3668ad99df2 --- /dev/null +++ b/docs/ja/migrations/postgres/dataset.md @@ -0,0 +1,113 @@ +--- +slug: /ja/migrations/postgresql/dataset +title: PostgreSQLからClickHouseへのデータロード +description: PostgreSQLからClickHouseへ移行するためのデータセット例 +keywords: [postgres, postgresql, 移行, マイグレーション] +--- + +> これは、PostgreSQLからClickHouseへの移行に関するガイドの**パート1**です。この内容は入門編と見なされ、ユーザーがClickHouseのベストプラクティスに従った初期の機能的なシステムをデプロイするのを支援することを目的としています。複雑なトピックを避け、完全に最適化されたスキーマにはなりませんが、ユーザーが本番環境のシステムを構築し、学習の基盤を築くための堅実な基礎を提供します。 + +## データセット + +PostgresからClickHouseへの典型的な移行を示す例として、[こちら](/ja/getting-started/example-datasets/stackoverflow)で文書化されているStack Overflowのデータセットを使用します。これには、2008年から2024年4月までにStack Overflowで行われたすべての`post`、`vote`、`user`、`comment`、および`badge`が含まれています。このデータのPostgreSQLスキーマは以下の通りです: + +
    + +NEEDS ALT + +
    + +*PostgreSQLでテーブルを作成するためのDDLコマンドは[こちら](https://pastila.nl/?001c0102/eef2d1e4c82aab78c4670346acb74d83#TeGvJWX9WTA1V/5dVVZQjg==)にあります。* + +このスキーマは必ずしも最も最適ではありませんが、主キー、外部キー、パーティショニング、およびインデックスを含むいくつかの人気のあるPostgreSQLの機能を活用しています。 + +これらの概念を、それぞれClickHouseの同等のものに移行します。 + +移行手順をテストするためにこのデータセットをPostgreSQLインスタンスに投入したいユーザーには、`pg_dump`形式でデータを提供しており、DDLおよびその後のデータロードコマンドは以下に示されています: + +```bash +# users +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/users.sql.gz +gzip -d users.sql.gz +psql < users.sql + +# posts +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/posts.sql.gz +gzip -d posts.sql.gz +psql < posts.sql + +# posthistory +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/posthistory.sql.gz +gzip -d posthistory.sql.gz +psql < posthistory.sql + +# comments +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/comments.sql.gz +gzip -d comments.sql.gz +psql < comments.sql + +# votes +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/votes.sql.gz +gzip -d votes.sql.gz +psql < votes.sql + +# badges +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/badges.sql.gz +gzip -d badges.sql.gz +psql < badges.sql + +# postlinks +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz +gzip -d postlinks.sql.gz +psql < postlinks.sql +``` + +このデータセットはClickHouseにとっては小規模ですが、Postgresにとっては大規模です。上記は2024年の最初の3か月をカバーするサブセットを表しています。 + +> 我々の例では、PostgresとClickHouseのパフォーマンス差を示すために完全なデータセットを使用していますが、以下に記載されているすべての手順は、小さなサブセットでも機能的に同一です。Postgresに完全なデータセットをロードしたいユーザーは[こちら](https://pastila.nl/?00d47a08/1c5224c0b61beb480539f15ac375619d#XNj5vX3a7ZjkdiX7In8wqA==)を参照してください。上記のスキーマによって課される外部制約のため、PostgreSQLの完全なデータセットには参照整合性を満たす行のみが含まれます。[Parquetバージョン](/ja/getting-started/example-datasets/stackoverflow)は、そのような制約なしでClickHouseに直接簡単にロードできます。 + +## データの移行 + +ClickHouseとPostgres間のデータ移行は、2つの主要なワークロードタイプに分かれます: + +- **初回の一括ロードと定期更新** - 初期データセットを移行し、毎日などの設定された間隔で定期更新を行います。ここでの更新は、変更された行を再送信することで処理されます。これは、比較に使用できるカラム(例:日付)やXMIN値によって識別できます。削除操作はデータセットの完全な定期リロードで処理されます。 +- **リアルタイムレプリケーションまたはCDC** - 初期データセットを移行する必要があります。このデータセットへの変更は、数秒の遅延が許容される近リアルタイムでClickHouseに反映される必要があります。これは実質的に、PostgresのテーブルをClickHouseと同期させるChange Data Capture (CDC)プロセスです。つまり、Postgresテーブルの挿入、更新、削除がClickHouseの同等のテーブルに適用される必要があります。 + +### 初回の一括ロードと定期更新 + +このワークロードは、上記のワークロードの中でも簡単な方です。変更は定期的に適用できます。データセットの初回の一括ロードは以下で達成できます: + +- **テーブル関数** - ClickHouseで[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)を使用してPostgresからデータを`SELECT`し、ClickHouseテーブルに`INSERT`します。数百GBのデータセットまでの一括ロードに関連しています。 +- **エクスポート** - CSVやSQLスクリプトファイルなどの中間形式にエクスポートします。これらのファイルは、クライアントからの`INSERT FROM INFILE`句を使用して、またはオブジェクトストレージとその関連機能(例:s3, gcs)を使用してClickHouseにロードできます。 + +増分ロードは、スケジュールして行うことができます。Postgresテーブルが挿入のみを受け取り、増加するIDまたはタイムスタンプが存在する場合、上記のテーブル関数アプローチを使用してインクリメントをロードできます。つまり、`SELECT`に`WHERE`句を適用できます。このアプローチは、同じカラムが更新されることが保証されている場合に更新をサポートするためにも使用できます。ただし、削除をサポートするためには完全なリロードが必要になり、テーブルが成長するにつれて困難になる可能性があります。 + +`CreationDate`を使用して初回ロードと増分ロードを示します(行が更新された場合、これが更新されると仮定します)。 + +```sql +-- 初回ロード +INSERT INTO stackoverflow.posts SELECT * FROM postgresql('', 'postgres', 'posts', 'postgres', '', 'postgres', 'posts', 'postgres', ' ( SELECT (max(CreationDate) FROM stackoverflow.posts) +``` + +> ClickHouseは、`=`, `!=`, `>`, `>=`, `<`, `<=`, `IN`のような単純な`WHERE`句をPostgreSQLサーバーにプッシュダウンします。したがって、インクリメンタルロードは、変更セットを識別するために使用されるカラムにインデックスが存在することを確認することで、より効率的に行えます。 + +> クエリレプリケーションを使用してUPDATE操作を検出する可能な方法は、[XMINシステムカラム](https://www.postgresql.org/docs/9.1/ddl-system-columns.html)(トランザクションID)をウォーターマークとして使用することです。このカラムの変更は変化を示し、したがって宛先テーブルに適用することができます。このアプローチを使用するユーザーは、XMIN値がラップアラウンドする可能性があり、全表スキャンが必要であるため、変更を追跡することがより複雑になることを認識している必要があります。このアプローチの詳細については、「Change Data Capture (CDC)」を参照してください。 + +### リアルタイムレプリケーションまたはCDC + +Change Data Capture (CDC)は、表が2つのデータベース間で同期されるプロセスです。これは、更新および削除をリアルタイムで処理する場合、かなり複雑になります。 + +いくつかのソリューションがあります: +1. **[ClickHouseによるPeerDB](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)** - PeerDBはユーザーがセルフマネージドまたはSaaSソリューションとして実行できるオープンコード専門Postgres CDCソリューションを提供し、PostgresおよびClickHouseでスケールでの優れたパフォーマンスを示しています。このソリューションは、PostgresとClickHouse間の高性能なデータ転送および信頼性保証を実現するために低レベルの最適化に焦点を当てています。オンラインおよびオフラインの両方のロードをサポートします。 + +2. **独自に構築** - これは**Debezium + Kafka**で実現できます。DebeziumはPostgresテーブルのすべての変更をキャプチャし、これらをイベントとしてKafkaキューにフォワードできます。これらのイベントはその後、ClickHouse Kafkaコネクタまたは[Clickpipes in ClickHouse Cloud](https://clickhouse.com/cloud/clickpipes)によって消費され、ClickHouseへの挿入が行われます。これはChange Data Capture (CDC)を表しており、Debeziumは表の初回コピーを行うだけでなく、後続のすべての更新、削除、および挿入がPostgresで検出され、下流のイベントが発生することを保証します。これは、Postgres、Debezium、およびClickHouseの注意深い設定を必要とします。例は[こちら](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-2)にあります。 + +このガイドの例では、データ探索と他のアプローチで使用可能な本番スキーマへの簡単な反復に焦点を当て、初回の一括ロードのみを前提としています。 + +[パート2はこちら](/ja/migrations/postgresql/designing-schemas). + diff --git a/docs/ja/migrations/postgres/designing-schemas.md b/docs/ja/migrations/postgres/designing-schemas.md new file mode 100644 index 00000000000..e39a8cf0065 --- /dev/null +++ b/docs/ja/migrations/postgres/designing-schemas.md @@ -0,0 +1,249 @@ +--- +slug: /ja/migrations/postgresql/designing-schemas +title: スキーマの設計 +description: PostgreSQLからClickHouseへの移行時のスキーマ設計 +keywords: [postgres, postgresql, 移行, マイグレーション, スキーマ] +--- + +> これは、PostgreSQLからClickHouseへの移行ガイドの**パート2**です。このコンテンツは入門的なものであり、ClickHouseのベストプラクティスに従った初期の機能的なシステムを展開するのに役立ちます。複雑なトピックは避け、完全に最適化されたスキーマにはなりませんが、ユーザーが本番システムを構築し、その学習の基礎を築くのに役立つ堅実な基盤を提供します。 + +Stack Overflowデータセットには、関連する複数のテーブルが含まれています。移行では、主要なテーブルを最初に移行することをお勧めします。これは必ずしも最大のテーブルではなく、むしろ最も多くの分析クエリを受けると期待されるテーブルです。これにより、特にOLTP中心のバックグラウンドを持つ場合、ClickHouseの主要な概念に慣れることができます。このテーブルは、ClickHouseの機能を最大限に活用し、最適なパフォーマンスを得るために、追加のテーブルが追加されるたびにリモデリングを必要とするかもしれません。このモデリングプロセスについては、[データモデリングのドキュメント](/ja/data-modeling/schema-design#next-data-modelling-techniques)で探ります。 + +## 初期スキーマの設定 + +この原則に従い、主要な`posts`テーブルに焦点を当てます。Postgresスキーマは以下のように示されています: + +```sql +CREATE TABLE posts ( + Id int, + PostTypeId int, + AcceptedAnswerId text, + CreationDate timestamp, + Score int, + ViewCount int, + Body text, + OwnerUserId int, + OwnerDisplayName text, + LastEditorUserId text, + LastEditorDisplayName text, + LastEditDate timestamp, + LastActivityDate timestamp, + Title text, + Tags text, + AnswerCount int, + CommentCount int, + FavoriteCount int, + ContentLicense text, + ParentId text, + CommunityOwnedDate timestamp, + ClosedDate timestamp, + PRIMARY KEY (Id), + FOREIGN KEY (OwnerUserId) REFERENCES users(Id) +) +``` + +上記の各カラムに対応するTypeを確立するには、[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)と共に`DESCRIBE`コマンドを使用できます。次のコマンドをPostgresインスタンスに合わせて変更してください: + +```sql +DESCRIBE TABLE postgresql(':', 'postgres', 'posts', '', '') +SETTINGS describe_compact_output = 1 + +┌─name──────────────────┬─type────────────────────┐ +│ id │ Int32 │ +│ posttypeid │ Nullable(Int32) │ +│ acceptedanswerid │ Nullable(String) │ +│ creationdate │ Nullable(DateTime64(6)) │ +│ score │ Nullable(Int32) │ +│ viewcount │ Nullable(Int32) │ +│ body │ Nullable(String) │ +│ owneruserid │ Nullable(Int32) │ +│ ownerdisplayname │ Nullable(String) │ +│ lasteditoruserid │ Nullable(String) │ +│ lasteditordisplayname │ Nullable(String) │ +│ lasteditdate │ Nullable(DateTime64(6)) │ +│ lastactivitydate │ Nullable(DateTime64(6)) │ +│ title │ Nullable(String) │ +│ tags │ Nullable(String) │ +│ answercount │ Nullable(Int32) │ +│ commentcount │ Nullable(Int32) │ +│ favoritecount │ Nullable(Int32) │ +│ contentlicense │ Nullable(String) │ +│ parentid │ Nullable(String) │ +│ communityowneddate │ Nullable(DateTime64(6)) │ +│ closeddate │ Nullable(DateTime64(6)) │ +└───────────────────────┴─────────────────────────┘ + +22 rows in set. Elapsed: 0.478 sec. +``` + +これにより、初期の非最適化スキーマが提供されます。 + +> `NOT NULL 制約`がなければ、PostgresのカラムにはNull値が含まれる可能性があります。行の値を調べずに、ClickHouseはこれらを同等のNullable型にマッピングします。Postgresでは、主キーはNullでないことが要求事項です。 + +これらの型を使用して、ClickHouseでテーブルを作成するには、`CREATE AS EMPTY SELECT`コマンドをシンプルに使用できます。 + +```sql +CREATE TABLE posts +ENGINE = MergeTree +ORDER BY () EMPTY AS +SELECT * FROM postgresql(':', 'postgres', 'posts', '', '') +``` + +このアプローチは、他のフォーマットでs3からデータをロードするためにも使用できます。同等の例として、このデータをParquetフォーマットからロードする例を参照してください。 + +## 初期ロード + +作成されたテーブルを使用して、PostgresからClickHouseに行を挿入します。[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)を使用します。 + +```sql +INSERT INTO posts SELECT * +FROM postgresql(':', 'postgres', 'posts', '', '') + +0 rows in set. Elapsed: 1136.841 sec. Processed 58.89 million rows, 80.85 GB (51.80 thousand rows/s., 71.12 MB/s.) +Peak memory usage: 2.51 GiB. +``` + +> この操作はPostgresにかなりの負荷をかける可能性があります。ユーザーは、運用ワークロードに影響を与えないように、SQLスクリプトをエクスポートするような代替操作でバックフィルすることを検討するかもしれません。この操作のパフォーマンスは、PostgresとClickHouseのクラスターサイズ、およびそのネットワークインターコネクトに依存します。 + +> ClickHouseからPostgresへの各`SELECT`は、単一の接続を使用します。この接続は、設定`postgresql_connection_pool_size`(デフォルト16)でサイズ指定されたサーバー側の接続プールから取られます。 + +フルデータセットを使用している場合、例では59mの投稿がロードされるはずです。ClickHouseでの簡単なカウントで確認します: + +```sql +SELECT count() +FROM posts + +┌──count()─┐ +│ 58889566 │ +└──────────┘ +``` + +## 型の最適化 + +このスキーマの型を最適化する手順は、他のソースからデータがロードされた場合と同じです(例: S3のParquet)。[Parquetを使用した代替ガイド](/ja/data-modeling/schema-design)で説明されているプロセスを適用すると、以下のスキーマが生成されます: + +```sql +CREATE TABLE posts_v2 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT '最適化されたタイプ' +``` + +このテーブルを埋めるには、以前のテーブルからデータを読み取り、このテーブルに挿入するシンプルな`INSERT INTO SELECT`を使用できます: + +```sql +INSERT INTO posts_v2 SELECT * FROM posts + +0 rows in set. Elapsed: 146.471 sec. Processed 59.82 million rows, 83.82 GB (408.40 thousand rows/s., 572.25 MB/s.) +``` + +新しいスキーマでは、nullは保持されません。上記の挿入では、これらをそれぞれのタイプのデフォルト値に暗黙的に変換します。整数は0、文字列は空の値となります。ClickHouseはまた、任意の数値をその目標精度に自動的に変換します。 + +## ClickHouseにおける主(順序)キー + +OLTPデータベースから来たユーザーは、多くの場合、ClickHouseでの同等の概念を探します。ClickHouseが`PRIMARY KEY`構文をサポートしていることに気付くと、ユーザーはOLTPデータベースのソースと同じキーを使用してテーブルスキーマを定義しようとするかもしれませんが、これは適切ではありません。 + +### ClickHouseの主キーはどのように異なるか? + +OLTP主キーをClickHouseで使用するのが不適切である理由を理解するには、ClickHouseのインデックス付けの基本を理解する必要があります。ここではPostgresを例として比較しますが、これらの一般的な概念は他のOLTPデータベースにも適用されます。 + +- Postgresの主キーは、定義上、行ごとに一意です。[B-tree構造](/ja/optimize/sparse-primary-indexes#an-index-design-for-massive-data-scales)を使用することで、このキーによる単一行の効率的な検索を可能にします。ClickHouseは単一行の値の検索に最適化できますが、分析ワークロードでは通常、多くの行に対して一部のカラムを読み取ることが求められます。フィルターは、集計が行われる行のサブセットを特定する必要があります。 +- メモリとディスクの効率は、ClickHouseが頻繁に使用されるスケールでは非常に重要です。データは、ClickHouseテーブルにパーツとして知られるチャンクに書き込まれ、バックグラウンドでパーツをマージするルールが適用されます。ClickHouseでは、各パーツに独自の主インデックスがあります。パーツがマージされると、マージされたパーツの主インデックスもマージされます。Postgresとは異なり、これらのインデックスは各行に対して構築されません。代わりに、パーツの主インデックスは、行のグループごとに1つのインデックスエントリを持ち、この技術は**スパースインデックス**と呼ばれます。 +- **スパースインデックス**は、ClickHouseがゆえに可能です。ClickHouseは、指定されたキーによってディスク上に並べられたデータを記憶します。その結果、スパース主インデックスは、インデックスエントリに対してバイナリサーチを介してクエリと一致する可能性のある行のグループを迅速に特定できます。特定された可能性のあるマッチング行のグループは、その後、ClickHouseエンジンに並行してストリーミングされ、マッチを見つけます。このインデックス設計により、主インデックスが小さく(完全にメインメモリに収まる)状態を保ちながら、特にデータ分析のユースケースに典型的な範囲クエリの実行時間を大幅に高速化します。詳細については、この[詳細なガイド](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +
    + +NEEDS ALT + +
    + +NEEDS ALT + +
    + +ClickHouseで選択されたキーは、インデックスだけでなく、ディスクに書き込まれるデータの順序も決定します。したがって、圧縮レベルに大きな影響を与える可能性があり、それが結果的にクエリのパフォーマンスに影響を与える可能性があります。大部分のカラムの値が連続して書き込まれるような順序キーは、選択された圧縮アルゴリズム(およびコーデック)がデータをより効果的に圧縮するのを可能にします。 + +> テーブル内の全てのカラムは、指定された順序キーの値に基づいてソートされます。たとえそれがキー自体には含まれていなくてもです。例えば、`CreationDate`がキーとして使用されている場合、他の全てのカラムの値の順序は、`CreationDate`カラムの値の順序と一致します。複数の順序キーを指定することができ、これは`SELECT`クエリの`ORDER BY`句と同じセマンティクスで順序付けされます。 + +### 順序キーの選択 + +順序キーの選択における考慮事項とステップについては、postsテーブルを例に[こちら](/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 + +## 圧縮 + +ClickHouseの列指向ストレージは、Postgresと比較して圧縮が大幅に向上することがあります。以下は、両方のデータベースでStack Overflowテーブル全体のストレージ要件を比較したものです: + +```sql +--Postgres +SELECT + schemaname, + tablename, + pg_total_relation_size(schemaname || '.' || tablename) AS total_size_bytes, + pg_total_relation_size(schemaname || '.' || tablename) / (1024 * 1024 * 1024) AS total_size_gb +FROM + pg_tables s +WHERE + schemaname = 'public'; + schemaname | tablename | total_size_bytes | total_size_gb | +------------+-----------------+------------------+---------------+ + public | users | 4288405504 | 3 | + public | posts | 68606214144 | 63 | + public | votes | 20525654016 | 19 | + public | comments | 22888538112 | 21 | + public | posthistory | 125899735040 | 117 | + public | postlinks | 579387392 | 0 | + public | badges | 4989747200 | 4 | +(7 rows) + +--ClickHouse +SELECT + `table`, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size +FROM system.parts +WHERE (database = 'stackoverflow') AND active +GROUP BY `table` + +┌─table───────┬─compressed_size─┐ +│ posts │ 25.17 GiB │ +│ users │ 846.57 MiB │ +│ badges │ 513.13 MiB │ +│ comments │ 7.11 GiB │ +│ votes │ 1.28 GiB │ +│ posthistory │ 40.44 GiB │ +│ postlinks │ 79.22 MiB │ +└─────────────┴─────────────────┘ +``` + +圧縮を最適化し、測定する方法についての詳細は[こちら](/ja/data-compression/compression-in-clickhouse)にて確認できます。 + +[Part 3はこちら](/ja/migrations/postgresql/data-modeling-techniques). diff --git a/docs/ja/migrations/postgres/overview.md b/docs/ja/migrations/postgres/overview.md new file mode 100644 index 00000000000..ba5a5c9f128 --- /dev/null +++ b/docs/ja/migrations/postgres/overview.md @@ -0,0 +1,22 @@ +--- +slug: /ja/migrations/postgresql/overview +title: PostgreSQLからClickHouseへの移行 +description: PostgreSQLからClickHouseへの移行ガイド +keywords: [postgres, postgresql, 移行, マイグレーション] +--- + +## なぜPostgresよりClickHouseを使用するのか? + +TLDR: ClickHouseはOLAPデータベースとして、特に`GROUP BY`クエリを用いた高速分析用に設計されており、Postgresはトランザクションワークロード向けのOLTPデータベースとして設計されています。 + +OLTP、すなわちオンライン・トランザクション処理データベースは、トランザクション情報を管理するように設計されています。Postgresが典型的な例であるこれらのデータベースの主な目的は、エンジニアがデータベースに対して更新ブロックを送り込み、それが全体として成功するか失敗するかを保証することです。これらのタイプのトランザクション保証は、ACID特性を持つOLTPデータベースの主な焦点であり、Postgresの大きな強みです。これらの要件を考慮すると、OLTPデータベースは通常、大規模なデータセットに対する分析クエリの実行時に性能の限界に達します。 + +OLAP、すなわちオンライン分析処理データベースは、分析ワークロードを管理するために設計されています。これらのデータベースの主な目的は、エンジニアが膨大なデータセットに対して効率的にクエリを実行し、集計できるようにすることです。ClickHouseのようなリアルタイムOLAPシステムは、データがリアルタイムで取り込まれる際にこの分析を可能にします。 + +より詳細な比較については、[こちらのブログ投稿](https://clickhouse.com/blog/adding-real-time-analytics-to-a-supabase-application)をご覧ください。 + +ClickHouseとPostgresの分析クエリにおける性能の違いを確認するには、[PostgreSQLクエリをClickHouseで書き換える](/ja/migrations/postgresql/rewriting-queries)を参照してください。 + +--- + +**[PostgreSQL移行ガイドをここから始める](/ja/migrations/postgresql/dataset)。** diff --git a/docs/ja/migrations/postgres/replacing-merge-tree.md b/docs/ja/migrations/postgres/replacing-merge-tree.md new file mode 100644 index 00000000000..50809f8fcab --- /dev/null +++ b/docs/ja/migrations/postgres/replacing-merge-tree.md @@ -0,0 +1,324 @@ +--- +slug: /ja/guides/replacing-merge-tree +title: ReplacingMergeTree +description: ClickHouseでのReplacingMergeTreeエンジンの使用 +keywords: [replacingmergetree, 挿入, 重複排除] +--- + +トランザクションデータベースはトランザクションの更新や削除のワークロードに最適化されていますが、OLAPデータベースはそのような操作の保証を減少させ、高速な分析クエリを実現するために不変データをバッチで挿入することに最適化されています。ClickHouseは、突然変異を通じて更新操作を提供し、行を軽量に削除する手段も提供していますが、その列指向の構造により、これらの操作は注意深くスケジュールされるべきです。これらの操作は非同期で処理され、単一のスレッドで行われ、(更新の場合は)データがディスクに書き直される必要があります。そのため、少数の小規模な変更には使用すべきではありません。 + +上記の使用パターンを避けつつ更新と削除の行を処理するために、ClickHouseのテーブルエンジンReplaceingMergeTreeを使用できます。 + +## 挿入された行の自動アップサート + +[ReplacingMergeTreeテーブルエンジン](/ja/engines/table-engines/mergetree-family/replacingmergetree)は、非効率的な`ALTER`や`DELETE`文を使用せずに行に対して更新操作を適用することを可能にし、ユーザーが同じ行の複数のコピーを挿入し、最新バージョンを指定できるようにします。このプロセスはバックグラウンドで非同期に古いバージョンの行を削除し、不変の挿入を使用して効率的に更新操作を模倣します。 +これは、テーブルエンジンが重複行を識別する能力に依存しています。これは、`ORDER BY`句を使用して一意性を決定することによって達成されます。つまり、`ORDER BY`で指定されたカラムの値が同じである場合、2行は重複と見なされます。テーブルを定義する際に指定される`バージョン`カラムは、重複として識別された2行の場合、より高いバージョンの値を持つ行が保持されることを可能にします。 + +以下の例でこのプロセスを示します。ここでは、行はAカラム(テーブルの`ORDER BY`)によって一意に識別されます。これらの行は2つのバッチとして挿入されたと仮定し、ディスク上に2つのデータパーツを形成しています。後で、非同期のバックグラウンドプロセス中に、これらのパーツは一緒にマージされます。 + +ReplacingMergeTreeはさらに、削除されたカラムを指定することができます。これは0または1を含み、値が1である場合、行(およびその重複)が削除されたことを示し、それ以外はゼロとして使用されます。**注:削除された行はマージ時に削除されません。** + +このプロセス中に、パーツのマージ中に次のことが行われます: + +- カラムAの値1で識別された行は、バージョン2の更新行と、バージョン3の削除行(および削除カラムの値1)を持っています。削除された最新の行が保持されます。 +- カラムAの値2で識別された行は2つの更新行を持っており、後者の行が価格カラムの値6で保持されます。 +- カラムAの値3で識別された行は、バージョン1の行とバージョン2の削除行があります。この削除行が保持されます。 + +このマージプロセスの結果として、最終状態を表す4行が得られます。 + +
    + +NEEDS ALT + +
    + +削除された行は決して削除されないことに注意してください。これらは`OPTIMIZE table FINAL CLEANUP`で強制的に削除することができます。これにはエクスペリメンタルな設定`allow_experimental_replacing_merge_with_cleanup=1`が必要です。これは次の条件下でのみ発行されるべきです: + +1. クリーンアップで削除された行に対して古いバージョンの行が操作発行後に挿入されないことを確認できる場合。これらが挿入された場合、削除された行がもはや存在しないため、誤って保持されます。 +2. クリーンアップを発行する前にすべてのレプリカが同期されていることを確認します。これは次のコマンドで達成できます: + +
    + +```sql +SYSTEM SYNC REPLICA table +``` + +このコマンドと後続のクリーンアップが完了するまで、挿入を一時停止することをお勧めします。 + +> ReplacingMergeTreeで削除を扱うことは、クリーンアップを上記の条件でスケジュールできる期間を除き、削除数が少から中程度(10%未満)のテーブルにのみ推奨されます。 + +> ヒント: ユーザーは、変更がない選択的なパーティションに対して`OPTIMIZE FINAL CLEANUP`を発行することもできます。 + +## 主キー/重複排除キーの選択 + +上記で説明したように、ReplacingMergeTreeの場合には満たされるべき重要な追加の制約があります:`ORDER BY`カラムの値が変更をまたいで行を一意に識別しなければならないことです。Postgresのようなトランザクションデータベースから移行する場合、オリジナルのPostgres主キーはClickHouseの`ORDER BY`句に含める必要があります。 + +ClickHouseのユーザーは、自分のテーブルの`ORDER BY`句でカラムを選択することに[クエリパフォーマンスを最適化する](/ja/data-modeling/schema-design#choosing-an-ordering-key)ことに慣れています。一般的に、これらのカラムは、[頻繁なクエリに基づいて選択され、増加するカーディナリティに応じてリストされるべきです](/ja/optimize/sparse-primary-indexes)。重要なポイントとして、ReplacingMergeTreeは追加の制約を課します - これらのカラムは不変でなければならず、つまりPostgresからのレプリケーションの場合、基になるPostgresデータで変更されないカラムのみをこの句に追加する必要があります。他のカラムは変更できるが、これらは一意の行識別のために一貫している必要があります。 + +分析ワークロードではポストグレスの主キーは一般的にあまり役立たないことがあります、なぜならユーザーはまれにポイント行のルックアップを行うからです。カラムは増加するカーディナリティの順に並べられるべきと述べた通り、および[ORDER BYでリストされているカラムのマッチングが通常より高速である](/ja/optimize/sparse-primary-indexes#secondary-key-columns-can-not-be-inefficient)ため、Postgres主キーは`ORDER BY`の最後に追加されるべきです(分析的価値がある場合を除きます)。Postgresで複数のカラムが主キーを形成する場合は、カーディナリティとクエリ値の可能性を考慮して、`ORDER BY`に追加されるべきです。また、ユーザーは`MATERIALIZED`カラムを通じて値の連結を使用して一意の主キーを生成することを考慮するかもしれません。 + +Stack Overflowデータセットからのポストテーブルを考えてみましょう。 + +```sql +CREATE TABLE stackoverflow.posts_updateable +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), + `Score` Int32, + `ViewCount` UInt32 CODEC(Delta(4), ZSTD(1)), + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `LastActivityDate` DateTime64(3, 'UTC'), + `Title` String, + `Tags` String, + `AnswerCount` UInt16 CODEC(Delta(2), ZSTD(1)), + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime64(3, 'UTC'), + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = ReplacingMergeTree(Version, Deleted) +PARTITION BY toYear(CreationDate) +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) +``` + +`ORDER BY`キーとして`(PostTypeId, toDate(CreationDate), CreationDate, Id)`を使用しています。各投稿に一意の`Id`カラムは、行が重複排除されることを保証します。スキーマに必要に応じて`Version`および`Deleted`カラムを追加します。 + +## ReplacingMergeTreeのクエリ + +マージ時に、ReplacingMergeTreeは`ORDER BY`カラムの値を一意の識別子として使用して重複行を識別し、最高のバージョンを保持するか、最新バージョンが削除を示す場合はすべての重複を削除します。ただし、これは最終的な正確性のみを提供し、行が重複排除される保証はありません。また、それに依存するべきではありません。そのため、クエリは更新および削除行がクエリで考慮されるため、誤った回答を生成する可能性があります。 + +正確な回答を得るためには、ユーザーはクエリタイムでの重複排除および削除削除とバックグラウンドのマージを補完する必要があります。これは`FINAL`オペレーターを使用して実現できます。 + +上記の投稿テーブルを考えてみましょう。このデータセットをロードする通常の方法を使用できますが、削除されたカラムとバージョンカラムを指定し、値を0に加えます。例として、10000行のみをロードします。 + +```sql +INSERT INTO stackoverflow.posts_updateable SELECT 0 AS Version, 0 AS Deleted, * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') WHERE AnswerCount > 0 LIMIT 10000 + +0 rows in set. Elapsed: 1.980 sec. Processed 8.19 thousand rows, 3.52 MB (4.14 thousand rows/s., 1.78 MB/s.) +``` + +行数を確認しましょう: + +```sql +SELECT count() FROM stackoverflow.posts_updateable + +┌─count()─┐ +│ 10000 │ +└─────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +投稿回答の統計を更新します。これらの値を更新するのではなく、5000行の新しいコピーを挿入し、そのバージョン番号を1つ追加します(これにより、テーブル内に150行の行が存在します)。 `INSERT INTO SELECT`を使用してこれをシミュレートできます: + +```sql +INSERT INTO posts_updateable SELECT + Version + 1 AS Version, + Deleted, + Id, + PostTypeId, + AcceptedAnswerId, + CreationDate, + Score, + ViewCount, + Body, + OwnerUserId, + OwnerDisplayName, + LastEditorUserId, + LastEditorDisplayName, + LastEditDate, + LastActivityDate, + Title, + Tags, + AnswerCount, + CommentCount, + FavoriteCount, + ContentLicense, + ParentId, + CommunityOwnedDate, + ClosedDate +FROM posts_updateable --select 100 random rows +WHERE (Id % toInt32(floor(randUniform(1, 11)))) = 0 +LIMIT 5000 + +0 rows in set. Elapsed: 4.056 sec. Processed 1.42 million rows, 2.20 GB (349.63 thousand rows/s., 543.39 MB/s.) +``` + +さらに、削除カラムの値1で行を再挿入することにより、1000個のランダムな投稿を削除します。これもシンプルな`INSERT INTO SELECT`でシミュレートできます。 + +```sql +INSERT INTO posts_updateable SELECT + Version + 1 AS Version, + 1 AS Deleted, + Id, + PostTypeId, + AcceptedAnswerId, + CreationDate, + Score, + ViewCount, + Body, + OwnerUserId, + OwnerDisplayName, + LastEditorUserId, + LastEditorDisplayName, + LastEditDate, + LastActivityDate, + Title, + Tags, + AnswerCount + 1 AS AnswerCount, + CommentCount, + FavoriteCount, + ContentLicense, + ParentId, + CommunityOwnedDate, + ClosedDate +FROM posts_updateable --select 100 random rows +WHERE (Id % toInt32(floor(randUniform(1, 11)))) = 0 AND AnswerCount > 0 +LIMIT 1000 + +0 rows in set. Elapsed: 0.166 sec. Processed 135.53 thousand rows, 212.65 MB (816.30 thousand rows/s., 1.28 GB/s.) +``` + +上記の操作の結果として16,000行を持つことになります。つまり、10,000 + 5000 + 1000です。ここでの正しい合計は、実際には元の合計から1000行少ないはずです。つまり、10,000 - 1000 = 9000です。 + +```sql +SELECT count() +FROM posts_updateable + +┌─count()─┐ +│ 10000 │ +└─────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +ここでの結果は、発生したマージによって異なる場合があります。テーブルに`FINAL`を適用すると、正しい結果が得られます。 + +```sql +SELECT count() +FROM posts_updateable +FINAL + +┌─count()─┐ +│ 9000 │ +└─────────┘ + +1 row in set. Elapsed: 0.006 sec. Processed 11.81 thousand rows, 212.54 KB (2.14 million rows/s., 38.61 MB/s.) +Peak memory usage: 8.14 MiB. +``` + +## FINALのパフォーマンス + +`FINAL`オペレーターはクエリにパフォーマンスのオーバーヘッドを生じます。これに対する進行中の改善にもかかわらず、特にプライマリキーのカラムにフィルタリングしないクエリの場合に顕著です。これにより、より多くのデータが読み込まれ、重複排除のオーバーヘッドが増加します。ユーザーが`WHERE`条件でキーのカラムをフィルタリングする場合、読み込まれるデータが減少し、重複排除の対象となる部分も減少します。 + +`WHERE`条件にキーのカラムが使用されていない場合、ClickHouseは現在のところ`FINAL`を使用して`PREWHERE`最適化を活用していません。この最適化は、フィルタリングされていないカラムの読み取る行を減少させることを目的としています。`PREWHERE`を模倣し、潜在的にパフォーマンスを向上させる方法の例は、[こちら](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-1#final-performance)をご覧ください。 + +## ReplacingMergeTreeでのパーティションの活用 + +ClickHouseでのデータのマージは、パーティションレベルで行われます。ReplacingMergeTreeを使用する場合、ユーザーは最善のパーティションの実践に従ってテーブルを分散させることをお勧めします。ただし、特に**行に対してこのパーティショニングキーが変更されないことを確認できる場合に限ります**。これにより、同じ行に関連する更新が同じClickHouseのパーティションに送信されることが保証されます。Postgresの同じパーティションキーを再利用してもよいが、ここで概説されたベストプラクティスに従うことを条件とします。 + +この場合、ユーザーは`do_not_merge_across_partitions_select_final=1`設定を使用して`FINAL`クエリのパフォーマンスを向上させることができます。この設定により、`FINAL`を使用しているときにパーティションが個別にマージされて処理されるようになります。 + +パーティショニングを使用しない投稿テーブルを考えてみましょう: + +```sql +CREATE TABLE stackoverflow.posts_no_part +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + … +) +ENGINE = ReplacingMergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) + +INSERT INTO stackoverflow.posts_no_part SELECT 0 AS Version, 0 AS Deleted, * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 182.895 sec. Processed 59.82 million rows, 38.07 GB (327.07 thousand rows/s., 208.17 MB/s.) +``` + +`FINAL`がいくつかの作業を行うことを必要とするために、1mの行を更新し、その`AnswerCount`を重複行を挿入してインクリメントします。 + +```sql +INSERT INTO posts_no_part SELECT Version + 1 AS Version, Deleted, Id, PostTypeId, AcceptedAnswerId, CreationDate, Score, ViewCount, Body, OwnerUserId, OwnerDisplayName, LastEditorUserId, LastEditorDisplayName, LastEditDate, LastActivityDate, Title, Tags, AnswerCount + 1 AS AnswerCount, CommentCount, FavoriteCount, ContentLicense, ParentId, CommunityOwnedDate, ClosedDate +FROM posts_no_part +LIMIT 1000000 +``` + +`FINAL`で年ごとの回答の合計を計算する: + +```sql +SELECT toYear(CreationDate) AS year, sum(AnswerCount) AS total_answers +FROM posts_no_part +FINAL +GROUP BY year +ORDER BY year ASC + +┌─year─┬─total_answers─┐ +│ 2008 │ 371480 │ +… +│ 2024 │ 127765 │ +└──────┴───────────────┘ + +17 rows in set. Elapsed: 2.338 sec. Processed 122.94 million rows, 1.84 GB (52.57 million rows/s., 788.58 MB/s.) +Peak memory usage: 2.09 GiB. +``` + +パーティションを年ごとに区切るテーブルに対して同じ手順を繰り返し、`do_not_merge_across_partitions_select_final=1`を使用して上記のクエリを再度実行します。 + +```sql +CREATE TABLE stackoverflow.posts_with_part +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... +) +ENGINE = ReplacingMergeTree +PARTITION BY toYear(CreationDate) +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) + +// populate & update omitted + +SELECT toYear(CreationDate) AS year, sum(AnswerCount) AS total_answers +FROM posts_with_part +FINAL +GROUP BY year +ORDER BY year ASC + +┌─year─┬─total_answers─┐ +│ 2008 │ 387832 │ +│ 2009 │ 1165506 │ +│ 2010 │ 1755437 │ +... +│ 2023 │ 787032 │ +│ 2024 │ 127765 │ +└──────┴───────────────┘ + +17 rows in set. Elapsed: 0.994 sec. Processed 64.65 million rows, 983.64 MB (65.02 million rows/s., 989.23 MB/s.) +``` + +示されているように、パーティショニングにより、この場合、重複排除プロセスがパーティションレベルで並行して行われることが可能になり、クエリパフォーマンスが大幅に向上しました。 + +## 大きなパートのマージ動作 + +ClickHouseのReplacingMergeTreeエンジンは、データパーツをマージして重複行を管理し、指定された一意のキーに基づいて各行の最新バージョンのみを保持するように最適化されています。しかし、マージされたパートが[`max_bytes_to_merge_at_max_space_in_pool`](/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool)のしきい値に達すると、さらにマージされる対象として選択されなくなります。たとえ[`min_age_to_force_merge_seconds`](/docs/ja/operations/settings/merge-tree-settings#min_age_to_force_merge_seconds)が設定されていたとしてもです。その結果、自動マージに頼って進行中のデータ挿入で累積する重複を削除することができなくなります。 + +この問題に対処するために、ユーザーは`OPTIMIZE FINAL`を呼び出して手動でパーツをマージし、重複を削除することができます。自動的なマージとは異なり、`OPTIMIZE FINAL`は`max_bytes_to_merge_at_max_space_in_pool`しきい値を無視し、利用可能なリソース、特にディスクスペースに基づいて、各パーティションに単一のパートが残るまでパーツをマージします。ただし、このアプローチは大きなテーブルでメモリを集中的に使用し、新しいデータが追加されると再度実行する必要があるかもしれません。 + +パフォーマンスを維持しつつ、より持続可能な解決策として、テーブルをパーティショニングすることをお勧めします。これにより、データパーツが最大マージサイズに達するのを防ぎ、継続的な手動の最適化の必要性が減少します。 diff --git a/docs/ja/migrations/snowflake.md b/docs/ja/migrations/snowflake.md new file mode 100644 index 00000000000..9fc6bc8ab76 --- /dev/null +++ b/docs/ja/migrations/snowflake.md @@ -0,0 +1,110 @@ +--- +sidebar_label: Snowflake +sidebar_position: 20 +slug: /ja/migrations/snowflake +description: SnowflakeからClickHouseへの移行 +keywords: [migrate, migration, migrating, data, etl, elt, snowflake] +--- + +# SnowflakeからClickHouseへの移行 + +このガイドでは、SnowflakeからClickHouseへのデータ移行方法を紹介します。 + +SnowflakeとClickHouse間でのデータ移行には、転送用の中間ストレージとしてS3などのオブジェクトストアを使用する必要があります。この移行プロセスでは、Snowflakeの`COPY INTO`コマンドとClickHouseの`INSERT INTO SELECT`コマンドを使用します。 + +## 1. Snowflakeからのデータエクスポート + +Migrating from Snowflake to ClickHouse + +上記の図に示されているように、Snowflakeからデータをエクスポートするには外部ステージを使用する必要があります。 + +次のようなスキーマを持つSnowflakeテーブルをエクスポートする場合を考えてみましょう。 + +```sql +CREATE TABLE MYDATASET ( + timestamp TIMESTAMP, + some_text varchar, + some_file OBJECT, + complex_data VARIANT, +) DATA_RETENTION_TIME_IN_DAYS = 0; +``` + +このテーブルのデータをClickHouseデータベースに移動するには、まずこのデータを外部ステージにコピーする必要があります。データのコピー時には、タイプ情報の共有、精度の保持、効率的な圧縮、分析で一般的なネスト構造のネイティブサポートが可能なParquet形式を推奨します。 + +以下の例では、Parquetと希望するファイルオプションを表す名前付きファイルフォーマットをSnowflakeで作成します。そしてどのバケットにデータセットをコピーするかを指定し、最後にデータセットをバケットにコピーします。 + +```sql +CREATE FILE FORMAT my_parquet_format TYPE = parquet; + +-- S3バケットへのコピーを指定する外部ステージを作成します +CREATE OR REPLACE STAGE external_stage +URL='s3://mybucket/mydataset' +CREDENTIALS=(AWS_KEY_ID='' AWS_SECRET_KEY='') +FILE_FORMAT = my_parquet_format; + +-- すべてのファイルに"mydataset"プレフィックスを付け、ファイルの最大サイズを150MBに指定します。 +-- `header=true`パラメータはカラム名を取得するために必要です +COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 header=true; +``` + +約5TBのデータセットで最大ファイルサイズ150MB、同じAWS `us-east-1`地域にある2X-Large Snowflake warehouseを使用した場合、S3バケットへのデータコピーは約30分かかります。 + +## 2. ClickHouseへのインポート + +データが中間のオブジェクトストレージにステージングされたら、ClickHouseの[s3 テーブル関数](/docs/ja/sql-reference/table-functions/s3)などの機能を使用して、データをテーブルに挿入できます。 + +以下の例では、AWS S3用の[s3 テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用していますが、Google Cloud Storageには[gcs テーブル関数](/docs/ja/sql-reference/table-functions/gcs)、Azure Blob Storageには[azureBlobStorage テーブル関数](/docs/ja/sql-reference/table-functions/azureBlobStorage)を使用できます。 + +次のテーブルのターゲットスキーマを想定しています: + +```sql +CREATE TABLE default.mydataset +( + `timestamp` DateTime64(6), + `some_text` String, + `some_file` Tuple(filename String, version String), + `complex_data` Tuple(name String, description String), +) +ENGINE = MergeTree +ORDER BY (timestamp) +``` + +この場合、S3からClickHouseテーブルにデータを挿入するために`INSERT INTO SELECT`コマンドを使用できます: + +```sql +INSERT INTO mydataset +SELECT + timestamp, + some_text, + JSONExtract( + ifNull(some_file, '{}'), + 'Tuple(filename String, version String)' + ) AS some_file, + JSONExtract( + ifNull(complex_data, '{}'), + 'Tuple(filename String, description String)' + ) AS complex_data, +FROM s3('https://mybucket.s3.amazonaws.com/mydataset/mydataset*.parquet') +SETTINGS input_format_null_as_default = 1, -- 値がnullの場合にデフォルトとしてカラムを挿入する +input_format_parquet_case_insensitive_column_matching = 1 -- ソースデータとターゲットテーブル間のカラムマッチングが大文字小文字を区別しない +``` + +:::note ネスト構造のカラムについての注意 +オリジナルのSnowflakeテーブルスキーマにおける`VARIANT`および`OBJECT`カラムは、デフォルトでJSON文字列として出力され、ClickHouseに挿入する際にキャストする必要があります。 + +`some_file`のようなネスト構造は、Snowflakeによるコピー時にJSON文字列に変換されます。ClickHouseにインポートする際には、これらの構造を[JSONExtract関数](/docs/ja/sql-reference/functions/json-functions#jsonextractjson-indices_or_keys-return_type)を使用してClickHouse挿入時にTuplesに変換する必要があります。 +::: + +## 3. 正しいデータエクスポートのテスト + +データが正しく挿入されたかどうかをテストするには、単に新しいテーブルに対して`SELECT`クエリを実行します: + +```sql +SELECT * FROM mydataset limit 10; +``` + +## さらなる読み物とサポート + +このガイドに加えて、[SnowflakeとClickHouseの比較](https://clickhouse.com/blog/clickhouse-vs-snowflake-for-real-time-analytics-comparison-migration-guide)に関するブログ記事を読むことをお勧めします。 + +SnowflakeからClickHouseへのデータ転送に問題がある場合は、support@clickhouse.comまでお気軽にお問い合わせください。 diff --git a/docs/ja/native-protocol/_category_.yml b/docs/ja/native-protocol/_category_.yml new file mode 100644 index 00000000000..f4032af5727 --- /dev/null +++ b/docs/ja/native-protocol/_category_.yml @@ -0,0 +1,3 @@ +label: 'Native Protocol' +collapsible: true +collapsed: true diff --git a/docs/ja/native-protocol/basics.md b/docs/ja/native-protocol/basics.md new file mode 100644 index 00000000000..dea61d7166b --- /dev/null +++ b/docs/ja/native-protocol/basics.md @@ -0,0 +1,150 @@ +--- +slug: /ja/native-protocol/basics +sidebar_position: 1 +--- + +# 基本 + +:::note +クライアントプロトコルのリファレンスは作成中です。 + +ほとんどの例はGoでのみです。 +::: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +このドキュメントは、ClickHouse TCPクライアントのバイナリプロトコルについて説明します。 + +## Varint + +長さ、パケットコード、その他の場合には*unsigned varint*エンコーディングが使用されます。 [binary.PutUvarint](https://pkg.go.dev/encoding/binary#PutUvarint) と [binary.ReadUvarint](https://pkg.go.dev/encoding/binary#ReadUvarint) を使用します。 + +:::note +*Signed* varintは使用されません。 +::: + +## 文字列 + +可変長文字列は *(length, value)* としてエンコードされ、*length* は [varint](#varint) で、*value* はutf8文字列です。 + +:::important +OOMを防ぐために長さを検証してください: + +`0 ≤ len < MAX` +::: + + + + +```go +s := "Hello, world!" + +// 文字列の長さをuvarintとして書き込む。 +buf := make([]byte, binary.MaxVarintLen64) +n := binary.PutUvarint(buf, uint64(len(s))) +buf = buf[:n] + +// 文字列の値を書き込む。 +buf = append(buf, s...) +``` + + + + +```go +r := bytes.NewReader([]byte{ + 0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, + 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, +}) + +// 長さを読み込む。 +n, err := binary.ReadUvarint(r) +if err != nil { + panic(err) +} + +// OOMやmake()でのランタイム例外を防ぐためにnをチェックする。 +const maxSize = 1024 * 1024 * 10 // 10 MB +if n > maxSize || n < 0 { + panic("invalid n") +} + +buf := make([]byte, n) +if _, err := io.ReadFull(r, buf); err != nil { + panic(err) +} + +fmt.Println(string(buf)) +// Hello, world! +``` + + + + + + + +```hexdump +00000000 0d 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 |.Hello, world!| +``` + + + + +```text +DUhlbGxvLCB3b3JsZCE +``` + + + + +```go +data := []byte{ + 0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, + 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, +} +``` + + + + +## 整数 + +:::tip +ClickHouseは固定サイズの整数に対して**リトルエンディアン**を使用します。 +::: + +### Int32 +```go +v := int32(1000) + +// エンコード。 +buf := make([]byte, 8) +binary.LittleEndian.PutUint32(buf, uint32(v)) + +// デコード。 +d := int32(binary.LittleEndian.Uint32(buf)) +fmt.Println(d) // 1000 +``` + + + + +```hexdump +00000000 e8 03 00 00 00 00 00 00 |........| +``` + + + + +```text +6AMAAAAAAAA +``` + + + + +## ブール値 + +ブール値は単一バイトで表され、`1` は `true`、`0` は `false` です。 diff --git a/docs/ja/native-protocol/client.md b/docs/ja/native-protocol/client.md new file mode 100644 index 00000000000..5f6b8b93878 --- /dev/null +++ b/docs/ja/native-protocol/client.md @@ -0,0 +1,121 @@ +--- +slug: /ja/native-protocol/client +sidebar_position: 2 +--- + +# クライアントパケット + +| 値 | 名前 | 説明 | +|-------|---------------------|---------------------------| +| 0 | [Hello](#hello) | クライアントハンドシェイク開始 | +| 1 | [Query](#query) | クエリリクエスト | +| 2 | [Data](#data) | データを含むブロック | +| 3 | [Cancel](#cancel) | クエリをキャンセル | +| 4 | [Ping](#ping) | Pingリクエスト | +| 5 | TableStatus | テーブルステータスリクエスト | + +`Data`は圧縮可能です。 + +## Hello + +たとえば、`Go Client` v1.10で`54451`プロトコルバージョンをサポートし、`default`データベースに`default`ユーザーで`secret`パスワードを使って接続したい場合です。 + +| フィールド | タイプ | 値 | 説明 | +|----------------------|------------|----------------|----------------------------| +| client_name | String | `"Go Client"` | クライアント実装名 | +| version_major | UVarInt | `1` | クライアントメジャーバージョン | +| version_minor | UVarInt | `10` | クライアントマイナーバージョン | +| protocol_version | UVarInt | `54451` | TCPプロトコルバージョン | +| database | String | `"default"` | データベース名 | +| username | String | `"default"` | ユーザー名 | +| password | String | `"secret"` | パスワード | + +### プロトコルバージョン + +プロトコルバージョンはクライアント側のTCPプロトコルバージョンです。 + +通常は最新の互換性のあるサーバーリビジョンと同じですが、これと混同しないでください。 + +### デフォルト + +すべての値は**明示的に設定**する必要があります。サーバー側にデフォルト値はありません。クライアント側では、デフォルトとして`"default"`データベース、`"default"`ユーザー名、および`""`(空の文字列)パスワードを使用します。 + +## クエリ + +| フィールド | タイプ | 値 | 説明 | +|---------------------|-------------------------------|------------|------------------------------| +| query_id | String | `1ff-a123` | クエリID, UUIDv4可能 | +| client_info | [ClientInfo](#client-info) | タイプを参照| クライアントに関するデータ | +| settings | [Settings](#settings) | タイプを参照| 設定のリスト | +| secret | String | `secret` | サーバー間の秘密 | +| [stage](#stage) | UVarInt | `2` | クエリステージまで実行 | +| compression | UVarInt | `0` | 無効=0、有効=1 | +| body | String | `SELECT 1` | クエリテキスト | + +### クライアント情報 + +| フィールド | タイプ | 説明 | +|-----------------------|-------------------|---------------------------------| +| query_kind | byte | None=0, Initial=1, Secondary=2 | +| initial_user | String | 初期ユーザー | +| initial_query_id | String | 初期クエリID | +| initial_address | String | 初期アドレス | +| initial_time | Int64 | 初期時間 | +| interface | byte | TCP=1, HTTP=2 | +| os_user | String | OSユーザー | +| client_hostname | String | クライアントホスト名 | +| client_name | String | クライアント名 | +| version_major | UVarInt | クライアントメジャーバージョン | +| version_minor | UVarInt | クライアントマイナーバージョン | +| protocol_version | UVarInt | クライアントプロトコルバージョン | +| quota_key | String | クオータキー | +| distributed_depth | UVarInt | 分散深度 | +| version_patch | UVarInt | クライアントパッチバージョン | +| otel | Bool | トレースフィールドの有無 | +| trace_id | FixedString(16) | トレースID | +| span_id | FixedString(8) | スパンID | +| trace_state | String | トレース状態 | +| trace_flags | Byte | トレースフラグ | + +### 設定 + +| フィールド | タイプ | 値 | 説明 | +|---------------|---------|------------------|----------------------| +| key | String | `send_logs_level`| 設定のキー | +| value | String | `trace` | 設定の値 | +| important | Bool | `true` | 無視可能かどうか | + +リストとしてエンコードされ、キーと値が空の場合はリストの終わりを示します。 + +### ステージ + +| 値 | 名前 | 説明 | +|-------|---------------------|-----------------------------------------------| +| 0 | FetchColumns | カラムタイプのみ取得 | +| 1 | WithMergeableState | マージ可能な状態まで | +| 2 | Complete | 完全な完了まで(デフォルトが推奨) | + +## データ + +| フィールド | タイプ | 説明 | +|-----------|--------------------|------------------------| +| info | BlockInfo | エンコードされたブロック情報 | +| columns | UVarInt | カラム数 | +| rows | UVarInt | 行数 | +| columns | [[]Column](#column)| データを含むカラム | + +### カラム + +| フィールド | タイプ | 値 | 説明 | +|-----------|---------|-----------------|-------------------| +| name | String | `foo` | カラム名 | +| type | String | `DateTime64(9)` | カラムタイプ | +| data | bytes | ~ | カラムデータ | + +## キャンセル + +パケットボディなし。サーバーはクエリをキャンセルする必要があります。 + +## ピング + +パケットボディなし。サーバーは[pongで応答する](./server.md#pong)必要があります。 diff --git a/docs/ja/native-protocol/columns.md b/docs/ja/native-protocol/columns.md new file mode 100644 index 00000000000..f80834c344e --- /dev/null +++ b/docs/ja/native-protocol/columns.md @@ -0,0 +1,96 @@ +--- +slug: /ja/native-protocol/columns +sidebar_position: 4 +--- + +# カラムタイプ + +一般的な情報については、[データタイプ](https://clickhouse.com/docs/ja/sql-reference/data-types/)を参照してください。 + +## 数値タイプ + +:::tip + +数値タイプのエンコーディングは、AMD64やARM64のようなリトルエンディアンCPUのメモリレイアウトと一致しています。 + +これにより、非常に効率的なエンコーディングとデコーディングを実現できます。 + +::: + +### 整数 + +IntとUIntの8, 16, 32, 64, 128または256ビットの文字列で、リトルエンディアン形式です。 + +### 浮動小数点数 + +IEEE 754のバイナリ表現でのFloat32とFloat64です。 + +## 文字列 + +単なる文字列の配列です。つまり、(len, value)。 + +## FixedString(N) + +Nバイトシーケンスの配列です。 + +## IP + +IPv4は`UInt32`数値型のエイリアスで、UInt32として表現されます。 + +IPv6は`FixedString(16)`のエイリアスで、バイナリで直接表現されます。 + +## Tuple + +Tupleは単にカラムの配列です。例えば、Tuple(String, UInt8)は2つのカラムが連続してエンコードされたものです。 + +## Map + +`Map(K, V)`は3つのカラムから成ります: `Offsets ColUInt64, Keys K, Values V`。 + +`Keys`と`Values`カラムの行数は`Offsets`の最後の値です。 + +## 配列 + +`Array(T)`は2つのカラムから成ります: `Offsets ColUInt64, Data T`。 + +`Data`の行数は`Offsets`の最後の値です。 + +## Nullable + +`Nullable(T)`は`Nulls ColUInt8, Values T`という同じ行数を持つ内容で構成されています。 + +```go +// NullsはValuesカラムに対するnullableの「マスク」です。 +// 例えば、[null, "", "hello", null, "world"]をエンコードする場合 +// Values: ["", "", "hello", "", "world"] (len: 5) +// Nulls: [ 1, 0, 0, 1, 0] (len: 5) +``` + +## UUID + +`FixedString(16)`のエイリアスで、UUID値はバイナリで表現されます。 + +## Enum + +`Int8`または`Int16`のエイリアスですが、それぞれの整数がいくつかの`String`値にマッピングされています。 + +## Low Cardinality + +`LowCardinality(T)`は`Index T, Keys K`から成り、`K`は`Index`のサイズに応じて(UInt8, UInt16, UInt32, UInt64)のいずれかです。 + +```go +// インデックス(すなわち、Dictionary)カラムはユニークな値を含み、Keysカラムは +// インデックスカラムのインデックスのシーケンスを含み、それが実際の値を表します。 +// +// 例えば、["Eko", "Eko", "Amadela", "Amadela", "Amadela", "Amadela"]は +// 以下のようにエンコードできます: +// Index: ["Eko", "Amadela"] (String) +// Keys: [0, 0, 1, 1, 1, 1] (UInt8) +// +// CardinalityKeyはIndexサイズに応じて選択されます。選択されたタイプの最大値は、 +// Index要素のインデックスを表現できる必要があります。 +``` + +## Bool + +`UInt8`のエイリアスであり、`0`はfalse、`1`はtrueを表します。 diff --git a/docs/ja/native-protocol/hash.md b/docs/ja/native-protocol/hash.md new file mode 100644 index 00000000000..506cc6ff270 --- /dev/null +++ b/docs/ja/native-protocol/hash.md @@ -0,0 +1,39 @@ +--- +slug: /ja/native-protocol/hash +sidebar_position: 5 +--- + +# CityHash + +ClickHouseは、**古いバージョンの** [GoogleのCityHash](https://github.com/google/cityhash) を使用しています。 + +:::info +CityHashは、ClickHouseに追加された後にアルゴリズムが変更されました。 + +CityHashのドキュメントでは、特定のハッシュ値に依存せず、保存やシャーディングキーとしての使用を控えるべきであると特に注意されています。 + +しかし、この関数をユーザーに公開したため、CityHashのバージョン(1.0.2)を固定する必要がありました。現在、SQLで使用可能なCityHash関数の動作は変わらないことを保証しています。 + +— Alexey Milovidov +::: + +:::note 注意 + +Googleの現在のCityHashのバージョンは、ClickHouseの`cityHash64`バリアントと[異なります](https://github.com/ClickHouse/ClickHouse/issues/8354)。 + +GoogleのCityHashの値を取得する目的で`farmHash64`を使用しないでください![FarmHash](https://opensource.googleblog.com/2014/03/introducing-farmhash.html)はCityHashの後継ですが、完全に互換性があるわけではありません。 + +| 文字列 | ClickHouse64 | CityHash64 | FarmHash64 | +|------------------------------------------------------------|----------------------|---------------------|----------------------| +| `Moscow` | 12507901496292878638 | 5992710078453357409 | 5992710078453357409 | +| `How can you write a big system without C++? -Paul Glick` | 6237945311650045625 | 749291162957442504 | 11716470977470720228 | + +::: + +また、作成理由や説明については[Introducing CityHash](https://opensource.googleblog.com/2011/04/introducing-cityhash.html)も参照してください。要約すると、**非暗号学的な**ハッシュで、[MurmurHash](http://en.wikipedia.org/wiki/MurmurHash)よりも高速ですが、より複雑です。 + +## 実装 + +### Go + +両方のバリアントを実装しているGoパッケージ[go-faster/city](https://github.com/go-faster/city)を使用できます。 diff --git a/docs/ja/native-protocol/images/ch_compression_block.drawio.svg b/docs/ja/native-protocol/images/ch_compression_block.drawio.svg new file mode 100644 index 00000000000..a5ebbe5e368 --- /dev/null +++ b/docs/ja/native-protocol/images/ch_compression_block.drawio.svg @@ -0,0 +1,4 @@ + + + +
    Checksum
    (16 bytes)
    Checksum...
    Data size
    (uint32, 4 bytes)
    Data size...
    Raw size
    (uint32, 4 bytes)
    Raw size...
    Mode
    (1 byte)
    Mode...
    Compressed 
    Data
    Compressed...
    Raw size length
    Raw size length
    Header, 9 bytes
    Header, 9 bytes
    Checksum input
    Checksum input
    0
    0
    15
    15
    16
    16
    20
    20
    21
    21
    25
    25
    26
    26
    ~
    ~
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/ja/native-protocol/server.md b/docs/ja/native-protocol/server.md new file mode 100644 index 00000000000..eb53c72a89e --- /dev/null +++ b/docs/ja/native-protocol/server.md @@ -0,0 +1,131 @@ +--- +slug: /ja/native-protocol/server +sidebar_position: 3 +--- + +# サーバーパケット + +| 値 | 名前 | 説明 | +|-------|--------------------------------|----------------------------------------------------------------| +| 0 | [Hello](#hello) | サーバーのハンドシェイク応答 | +| 1 | Data | [クライアントデータ](./client.md#data) と同様 | +| 2 | [Exception](#exception) | クエリ処理の例外 | +| 3 | [Progress](#progress) | クエリの進捗 | +| 4 | [Pong](#pong) | ピン応答 | +| 5 | [EndOfStream](#end-of-stream) | すべてのパケットが転送された | +| 6 | [ProfileInfo](#profile-info) | プロファイリングデータ | +| 7 | Totals | 合計値 | +| 8 | Extremes | 極値 (最小, 最大) | +| 9 | TablesStatusResponse | TableStatus リクエストへの応答 | +| 10 | [Log](#log) | クエリシステムログ | +| 11 | TableColumns | カラムの詳細 | +| 12 | UUIDs | 一意なパーツIDのリスト | +| 13 | ReadTaskRequest | 次に必要なタスクを記述するためのリクエストを説明する文字列(UUID)| +| 14 | [ProfileEvents](#profile-events) | サーバーからのプロファイルイベントを含むパケット | + +`Data`、`Totals`、および `Extremes` は圧縮可能です。 + +## Hello + +[クライアントの hello](./client.md#hello) に対する応答。 + +| フィールド | タイプ | 値 | 説明 | +|----------------|----------|----------------|-----------------------| +| name | String | `Clickhouse` | サーバー名 | +| version_major | UVarInt | `21` | サーバーメジャーバージョン | +| version_minor | UVarInt | `12` | サーバーマイナーバージョン | +| revision | UVarInt | `54452` | サーバーリビジョン | +| tz | String | `Europe/Moscow`| サーバータイムゾーン | +| display_name | String | `Clickhouse` | UI用サーバー名 | +| version_patch | UVarInt | `3` | サーバーパッチバージョン | + +## Exception + +クエリ処理中のサーバー例外。 + +| フィールド | タイプ | 値 | 説明 | +|---------------|----------|----------------------------------------|------------------------------| +| code | Int32 | `60` | [ErrorCodes.cpp][codes] を参照してください。| +| name | String | `DB::Exception` | サーバーメジャーバージョン | +| message | String | `DB::Exception: Table X doesn't exist` | サーバーマイナーバージョン | +| stack_trace | String | ~ | C++ スタックトレース | +| nested | Bool | `true` | 追加のエラー | + +`nested` が `false` になるまで、例外の連続リストになることがあります。 + +[codes]: https://clickhouse.com/codebrowser/ClickHouse/src/Common/ErrorCodes.cpp.html "エラーコードのリスト" + +## Progress + +サーバーが定期的に報告するクエリ実行の進捗。 + +:::tip +**デルタ**で報告されます。合計はクライアント側で蓄積してください。 +::: + +| フィールド | タイプ | 値 | 説明 | +|---------------|----------|--------|---------------------| +| rows | UVarInt | `65535`| 行数 | +| bytes | UVarInt | `871799`| バイト数 | +| total_rows | UVarInt | `0` | 合計行数 | +| wrote_rows | UVarInt | `0` | クライアントからの行数| +| wrote_bytes | UVarInt | `0` | クライアントからのバイト数 | + +## Pong + +[クライアントの ping](./client.md#ping) に対する応答、パケットボディなし。 + +## End of stream + +**Data** パケットはもう送信されなくなり、クエリ結果が完全にサーバーからクライアントへストリームされました。 + +パケットボディなし。 + +## Profile info + +| フィールド | タイプ | +|---------------------------|----------| +| rows | UVarInt | +| blocks | UVarInt | +| bytes | UVarInt | +| applied_limit | Bool | +| rows_before_limit | UVarInt | +| calculated_rows_before_limit | Bool | + +## Log + +サーバーログを含む **Data block**。 + +:::tip +カラムの **data block** としてエンコードされますが、圧縮されません。 +::: + +| カラム | タイプ | +|--------------|-----------| +| time | DateTime | +| time_micro | UInt32 | +| host_name | String | +| query_id | String | +| thread_id | UInt64 | +| priority | Int8 | +| source | String | +| text | String | + +## Profile events + +プロファイルイベントを含む **Data block**。 + +:::tip +カラムの **data block** としてエンコードされますが、圧縮されません。 + +`value` のタイプはサーバーリビジョンによって `UInt64` または `Int64` です。 +::: + +| カラム | タイプ | +|--------------|------------------| +| host_name | String | +| current_time | DateTime | +| thread_id | UInt64 | +| type | Int8 | +| name | String | +| value | UInt64 または Int64 | diff --git a/docs/ja/operations/_category_.yml b/docs/ja/operations/_category_.yml new file mode 100644 index 00000000000..352809f663b --- /dev/null +++ b/docs/ja/operations/_category_.yml @@ -0,0 +1,4 @@ +position: 70 +label: 'Operations' +collapsible: true +collapsed: true diff --git a/docs/ja/operations/_troubleshooting.md b/docs/ja/operations/_troubleshooting.md new file mode 100644 index 00000000000..132daa898bf --- /dev/null +++ b/docs/ja/operations/_troubleshooting.md @@ -0,0 +1,218 @@ +[//]: # (このファイルはFAQ > トラブルシューティングに含まれます) + +- [インストール](#troubleshooting-installation-errors) +- [サーバーへの接続](#troubleshooting-accepts-no-connections) +- [クエリ処理](#troubleshooting-does-not-process-queries) +- [クエリ処理の効率](#troubleshooting-too-slow) + +## インストール {#troubleshooting-installation-errors} + +### Apt-getでClickHouseリポジトリからDebパッケージを取得できない {#you-cannot-get-deb-packages-from-clickhouse-repository-with-apt-get} + +- ファイアウォールの設定を確認してください。 +- 何らかの理由でリポジトリにアクセスできない場合は、[インストールガイド](../getting-started/install.md)の記事で説明されているようにパッケージをダウンロードし、`sudo dpkg -i `コマンドを使って手動でインストールしてください。`tzdata`パッケージも必要です。 + +### Apt-getでClickHouseリポジトリからDebパッケージを更新できない {#you-cannot-update-deb-packages-from-clickhouse-repository-with-apt-get} + +- GPGキーが変更された場合に問題が発生することがあります。 + +リポジトリ設定を更新するには、[セットアップ](../getting-started/install.md#setup-the-debian-repository)ページの手順に従ってください。 + +### `apt-get update`で異なる警告が表示される {#you-get-different-warnings-with-apt-get-update} + +- 完全な警告メッセージは以下のいずれかです: + +``` +N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://packages.clickhouse.com/deb stable InRelease' doesn't support architecture 'i386' +``` + +``` +E: Failed to fetch https://packages.clickhouse.com/deb/dists/stable/main/binary-amd64/Packages.gz File has unexpected size (30451 != 28154). Mirror sync in progress? +``` + +``` +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Origin' value from 'Artifactory' to 'ClickHouse' +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Label' value from 'Artifactory' to 'ClickHouse' +N: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Suite' value from 'stable' to '' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. +``` + +``` +Err:11 https://packages.clickhouse.com/deb stable InRelease + 400 Bad Request [IP: 172.66.40.249 443] +``` + +上記の問題を解決するには、以下のスクリプトを使用してください: + +```bash +sudo rm /var/lib/apt/lists/packages.clickhouse.com_* /var/lib/dpkg/arch /var/lib/apt/lists/partial/packages.clickhouse.com_* +sudo apt-get clean +sudo apt-get autoclean +``` + +### 誤った署名のためにYumでパッケージを取得できない + +可能な問題:キャッシュが誤っており、2022年9月にGPGキーが更新された後に壊れた可能性があります。 + +解決策はyumのキャッシュおよびlibディレクトリをクリアすることです: + +``` +sudo find /var/lib/yum/repos/ /var/cache/yum/ -name 'clickhouse-*' -type d -exec rm -rf {} + +sudo rm -f /etc/yum.repos.d/clickhouse.repo +``` + +その後、[インストールガイド](../getting-started/install.md#from-rpm-packages)に従ってください。 + +### Dockerコンテナを実行できない + +単純な`docker run clickhouse/clickhouse-server`を実行すると、以下のようなスタックトレースでクラッシュします: + +``` +$ docker run -it clickhouse/clickhouse-server +........ +2024.11.06 21:04:48.912036 [ 1 ] {} SentryWriter: Sending crash reports is disabled +Poco::Exception. Code: 1000, e.code() = 0, System exception: cannot start thread, Stack trace (when copying this message, always include the lines below): + +0. Poco::ThreadImpl::startImpl(Poco::SharedPtr>) @ 0x00000000157c7b34 +1. Poco::Thread::start(Poco::Runnable&) @ 0x00000000157c8a0e +2. BaseDaemon::initializeTerminationAndSignalProcessing() @ 0x000000000d267a14 +3. BaseDaemon::initialize(Poco::Util::Application&) @ 0x000000000d2652cb +4. DB::Server::initialize(Poco::Util::Application&) @ 0x000000000d128b38 +5. Poco::Util::Application::run() @ 0x000000001581cfda +6. DB::Server::run() @ 0x000000000d1288f0 +7. Poco::Util::ServerApplication::run(int, char**) @ 0x0000000015825e27 +8. mainEntryClickHouseServer(int, char**) @ 0x000000000d125b38 +9. main @ 0x0000000007ea4eee +10. ? @ 0x00007f67ff946d90 +11. ? @ 0x00007f67ff946e40 +12. _start @ 0x00000000062e802e + (version 24.10.1.2812 (official build)) +``` + +理由は、バージョン`20.10.10`未満の古いDockerデーモンです。修正方法はそれをアップグレードするか、`docker run [--privileged | --security-opt seccomp=unconfined]`を実行することです。後者にはセキュリティ上の影響があります。 + +## サーバーへの接続 {#troubleshooting-accepts-no-connections} + +可能な問題: + +- サーバーが動作していない。 +- 予期しない、または誤った構成パラメータ。 + +### サーバーが動作していない {#server-is-not-running} + +**サーバーが動作しているか確認する** + +コマンド: + +``` bash +$ sudo service clickhouse-server status +``` + +サーバーが動作していない場合、以下のコマンドで開始してください: + +``` bash +$ sudo service clickhouse-server start +``` + +**ログを確認する** + +`clickhouse-server`のメインログはデフォルトで`/var/log/clickhouse-server/clickhouse-server.log`にあります。 + +サーバーが正常に起動した場合、以下の文字列が表示されるはずです: + +- ` Application: starting up.` — サーバーが起動しました。 +- ` Application: Ready for connections.` — サーバーが実行中で接続待機中です。 + +もし`clickhouse-server`の起動が構成エラーで失敗した場合、``文字列とエラーの説明が表示されるはずです。例えば: + +``` text +2019.01.11 15:23:25.549505 [ 45 ] {} ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused +``` + +もしファイルの最後にエラーが表示されない場合、以下の文字列から始まる全ファイルを確認してください: + +``` text + Application: starting up. +``` + +サーバーの2番目のインスタンスを起動しようとすると、以下のログが表示されます: + +``` text +2019.01.11 15:25:11.151730 [ 1 ] {} : Starting ClickHouse 19.1.0 with revision 54413 +2019.01.11 15:25:11.154578 [ 1 ] {} Application: starting up +2019.01.11 15:25:11.156361 [ 1 ] {} StatusFile: Status file ./status already exists - unclean restart. Contents: +PID: 8510 +Started at: 2019-01-11 15:24:23 +Revision: 54413 + +2019.01.11 15:25:11.156673 [ 1 ] {} Application: DB::Exception: Cannot lock file ./status. Another server instance in same directory is already running. +2019.01.11 15:25:11.156682 [ 1 ] {} Application: shutting down +2019.01.11 15:25:11.156686 [ 1 ] {} Application: Uninitializing subsystem: Logging Subsystem +2019.01.11 15:25:11.156716 [ 2 ] {} BaseDaemon: Stop SignalListener thread +``` + +**system.dログを見る** + +`clickhouse-server`のログに有用な情報がない、またはログが存在しない場合、以下のコマンドを使用して`system.d`ログを見ることができます: + +``` bash +$ sudo journalctl -u clickhouse-server +``` + +**インタラクティブモードでclickhouse-serverを起動する** + +``` bash +$ sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml +``` + +このコマンドは標準の自動起動スクリプトのパラメータでサーバーをインタラクティブアプリとして起動します。このモードでは`clickhouse-server`はすべてのイベントメッセージをコンソールに出力します。 + +### 設定パラメータ {#configuration-parameters} + +確認事項: + +- Docker設定。 + + IPv6ネットワークでDocker内にClickHouseを実行する場合、`network=host`が設定されていることを確認してください。 + +- エンドポイント設定。 + + [listen_host](../operations/server-configuration-parameters/settings.md#listen_host)と[tcp_port](../operations/server-configuration-parameters/settings.md#tcp_port)の設定を確認してください。 + + ClickHouseサーバーはデフォルトでローカルホストからの接続のみを受け付けます。 + +- HTTPプロトコル設定。 + + HTTP APIのプロトコル設定を確認してください。 + +- 安全な接続設定。 + + 以下の項目について確認してください: + + - [tcp_port_secure](../operations/server-configuration-parameters/settings.md#tcp_port_secure)の設定。 + - [SSL証明書](../operations/server-configuration-parameters/settings.md#openssl)の設定。 + + 接続時に適切なパラメータを使用してください。例えば、`clickhouse_client`で`port_secure`パラメータを使用してください。 + +- ユーザー設定。 + + 誤ったユーザー名やパスワードを使用している可能性があります。 + +## クエリ処理 {#troubleshooting-does-not-process-queries} + +ClickHouseがクエリを処理できない場合、エラーの説明をクライアントに送信します。`clickhouse-client`では、コンソールにエラーの説明が表示されます。HTTPインターフェースを使用している場合、ClickHouseはエラーメッセージをレスポンスボディに送信します。例えば: + +``` bash +$ curl 'http://localhost:8123/' --data-binary "SELECT a" +Code: 47, e.displayText() = DB::Exception: Unknown identifier: a. Note that there are no tables (FROM clause) in your query, context: required_names: 'a' source_tables: table_aliases: private_aliases: column_aliases: public_columns: 'a' masked_columns: array_join_columns: source_columns: , e.what() = DB::Exception +``` + +`stack-trace`パラメータを使用して`clickhouse-client`を起動すると、ClickHouseはエラーの説明と共にサーバーのスタックトレースを返します。 + +接続が切れたというメッセージが表示された場合、そのクエリを再実行することができます。それでも毎回クエリを実行するたびに接続が切れる場合、サーバーログを確認してエラーをチェックしてください。 + +## クエリ処理の効率 {#troubleshooting-too-slow} + +ClickHouseの動作が遅すぎる場合、クエリのためにサーバーリソースとネットワークに負荷をかけている可能性があります。 + +クエリのプロファイルを行うために`clickhouse-benchmark`ユーティリティを使用できます。これは、1秒あたり処理したクエリの数、1秒あたり処理した行の数、およびクエリ処理時間の百分位を示します。 diff --git a/docs/ja/operations/allocation-profiling.md b/docs/ja/operations/allocation-profiling.md new file mode 100644 index 00000000000..71833e9ea90 --- /dev/null +++ b/docs/ja/operations/allocation-profiling.md @@ -0,0 +1,207 @@ +--- +slug: /ja/operations/allocation-profiling +sidebar_label: "アロケーションプロファイリング" +title: "アロケーションプロファイリング" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# アロケーションプロファイリング + +ClickHouseは、[jemalloc](https://github.com/jemalloc/jemalloc)をグローバルアロケーターとして使用しており、これはアロケーションのサンプリングやプロファイリング用のいくつかのツールを提供しています。 +アロケーションプロファイリングをより便利にするために、Keeperには`SYSTEM`コマンドと4LWコマンドが提供されています。 + +## アロケーションのサンプリングとヒーププロファイルのフラッシュ + +`jemalloc`でアロケーションをサンプリングしてプロファイルするためには、環境変数`MALLOC_CONF`を使用してプロファイリングを有効にしてClickHouse/Keeperを起動する必要があります。 + +```sh +MALLOC_CONF=background_thread:true,prof:true +``` + +`jemalloc`はアロケーションをサンプリングし、情報を内部に保持します。 + +現在のプロファイルをフラッシュするように`jemalloc`に指示するには、次のように実行します: + + + + + SYSTEM JEMALLOC FLUSH PROFILE + + + + + echo jmfp | nc localhost 9181 + + + + +デフォルトでは、ヒーププロファイルファイルは`/tmp/jemalloc_clickhouse._pid_._seqnum_.heap`に生成され、`_pid_`はClickHouseのPID、`_seqnum_`は現在のヒーププロファイルのグローバルシーケンス番号です。 +Keeperの場合、デフォルトのファイルは同じルールに従って`/tmp/jemalloc_keeper._pid_._seqnum_.heap`になります。 + +別の場所を指定するには、`MALLOC_CONF`環境変数に`prof_prefix`オプションを追加します。 +たとえば、`/data`フォルダにプロファイルを生成したい場合、ファイル名のプレフィックスを`my_current_profile`とするには、ClickHouse/Keeperを以下の環境変数で実行します: +```sh +MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile +``` +生成されたファイルにはプレフィックスにPIDとシーケンス番号が追加されます。 + +## ヒーププロファイルの分析 + +ヒーププロファイルを生成した後、それを分析する必要があります。 +これには、`jemalloc`のツールである[jeprof](https://github.com/jemalloc/jemalloc/blob/dev/bin/jeprof.in)を使用する必要があります。このツールは以下の方法でインストールできます: +- システムのパッケージマネージャーを使用して`jemalloc`をインストールする +- [jemallocリポジトリ](https://github.com/jemalloc/jemalloc)をクローンし、ルートフォルダーからautogen.shを実行すると、`bin`フォルダ内に`jeprof`スクリプトが用意されます + +:::note +`jeprof`は`addr2line`を使用してスタックトレースを生成しますが、これが非常に遅い場合があります。 +その場合は、[代替実装](https://github.com/gimli-rs/addr2line)のインストールをお勧めします。 + +``` +git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0 +cd addr2line +cargo build --features bin --release +cp ./target/release/addr2line path/to/current/addr2line +``` +::: + +`jeprof`を使用してヒーププロファイルから生成できる多くの異なる形式があります。 +`jeprof --help`を実行し、利用法およびツールが提供する多くの異なるオプションを確認することをお勧めします。 + +一般に、`jeprof`コマンドは次のようになります: + +```sh +jeprof path/to/binary path/to/heap/profile --output_format [ > output_file] +``` + +2つのプロファイル間でどのアロケーションが発生したかを比較したい場合、ベース引数を設定できます: + +```sh +jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file] +``` + +例えば: + +- 各手続きが1行ごとに書かれたテキストファイルを生成したい場合: + +```sh +jeprof path/to/binary path/to/heap/profile --text > result.txt +``` + +- コールグラフ付きのPDFファイルを生成したい場合: + +```sh +jeprof path/to/binary path/to/heap/profile --pdf > result.pdf +``` + +### フレームグラフの生成 + +`jeprof`を使用してフレームグラフを作成するために折りたたまれたスタックを生成できます。 + +`--collapsed`引数を使用する必要があります: + +```sh +jeprof path/to/binary path/to/heap/profile --collapsed > result.collapsed +``` + +その後、多くの異なるツールを使用して折りたたまれたスタックを視覚化できます。 + +最も人気があるのは、`flamegraph.pl`スクリプトを含む[FlameGraph](https://github.com/brendangregg/FlameGraph)です: + +```sh +cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg +``` + +さらに、収集されたスタックをよりインタラクティブに分析するためのツールである[speedscope](https://www.speedscope.app/)も興味深いです。 + +## 実行時にアロケーションプロファイラーを制御する + +ClickHouse/Keeperがプロファイラーを有効にして開始された場合、実行時にアロケーションプロファイリングを無効/有効にするための追加コマンドがサポートされています。 +これらのコマンドを使用することで、特定の間隔だけをプロファイル化するのが容易になります。 + +プロファイラーを無効にする: + + + + + SYSTEM JEMALLOC DISABLE PROFILE + + + + + echo jmdp | nc localhost 9181 + + + + +プロファイラーを有効にする: + + + + + SYSTEM JEMALLOC ENABLE PROFILE + + + + + echo jmep | nc localhost 9181 + + + + +プロファイラーの初期状態を制御することも可能で、デフォルトで有効になっている`prof_active`オプションを設定することができます。 +たとえば、起動時にアロケーションのサンプリングを行わず、プロファイラーを有効にした後でのみ行いたい場合、以下の環境変数を使用してClickHouse/Keeperを起動することができます: +```sh +MALLOC_CONF=background_thread:true,prof:true,prof_active:false +``` + +その後、後の段階でプロファイラーを有効にすることができます。 + +## プロファイラーの追加オプション + +`jemalloc`にはプロファイラーに関連するさまざまなオプションがあり、これを変更することで`MALLOC_CONF`環境変数を通じて制御できます。 +たとえば、アロケーションサンプルの間隔は`lg_prof_sample`で制御できます。 +Nバイトごとにヒーププロファイルをダンプする場合、`lg_prof_interval`を使用して有効にできます。 + +これらのオプションについては、`jemalloc`の[リファレンスページ](https://jemalloc.net/jemalloc.3.html)を確認することをお勧めします。 + +## その他のリソース + +ClickHouse/Keeperは、`jemalloc`関連のメトリクスをさまざまな方法で公開しています。 + +:::warning 警告 +これらのメトリクスのいずれも互いに同期されておらず、値がずれる可能性があることを意識してください。 +::: + +### システムテーブル `asynchronous_metrics` + +```sql +SELECT * +FROM system.asynchronous_metrics +WHERE metric ILIKE '%jemalloc%' +FORMAT Vertical +``` + +[参照](/ja/operations/system-tables/asynchronous_metrics) + +### システムテーブル `jemalloc_bins` + +異なるサイズクラス(ビン)でのjemallocアロケーターを介して行われたメモリアロケーションに関する情報を、すべてのアリーナから集約したものを含みます。 + +[参照](/ja/operations/system-tables/jemalloc_bins) + +### Prometheus + +`asynchronous_metrics`からのすべての`jemalloc`関連メトリクスは、ClickHouseとKeeperの両方でPrometheusエンドポイントを使用して公開されています。 + +[参照](/ja/operations/server-configuration-parameters/settings#prometheus) + +### Keeperの`jmst` 4LWコマンド + +Keeperは、[基本アロケーター統計](https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Basic-Allocator-Statistics)を返す`jmst` 4LWコマンドをサポートしています。 + +例: +```sh +echo jmst | nc localhost 9181 +``` diff --git a/docs/ja/operations/analyzer.md b/docs/ja/operations/analyzer.md new file mode 100644 index 00000000000..f7759a20440 --- /dev/null +++ b/docs/ja/operations/analyzer.md @@ -0,0 +1,184 @@ +--- +slug: /ja/operations/analyzer +sidebar_label: アナライザー +title: アナライザー +description: ClickHouseのクエリアナライザーについての詳細 +keywords: [アナライザー] +--- + +# アナライザー + + + +## 既知の非互換性 + +ClickHouseバージョン`24.3`では、新しいクエリアナライザーがデフォルトで有効になりました。多くのバグを修正し新たな最適化を導入した一方で、ClickHouseの動作にいくつかの破壊的変更が加わっています。新しいアナライザーに合わせてクエリを書き直す方法を理解するために、以下の変更をお読みください。 + +### 無効なクエリは最適化されなくなりました + +以前のクエリプランニングインフラストラクチャでは、クエリの検証ステップよりも前にASTレベルの最適化が適用されていました。この最適化により、初期のクエリが書き換えられ、実行可能になっていました。 + +新しいアナライザーでは、最適化ステップの前にクエリの検証が行われます。これにより、以前は実行可能だった無効なクエリはサポートされなくなりました。このような場合、クエリを手動で修正する必要があります。 + +**例1:** + +```sql +SELECT number +FROM numbers(1) +GROUP BY toString(number) +``` + +このクエリでは、`number`カラムが集計後に利用可能な`toString(number)`だけでプロジェクションリストに使用されています。古いアナライザーでは、`GROUP BY toString(number)`が`GROUP BY number`に最適化され、クエリが有効になっていました。 + +**例2:** + +```sql +SELECT + number % 2 AS n, + sum(number) +FROM numbers(10) +GROUP BY n +HAVING number > 5 +``` + +このクエリでも同じ問題が発生します。カラム`number`が異なるキーで集計後に使用されています。以前のクエリアナライザーはこのクエリを修正し、`HAVING`句から`WHERE`句に`number > 5`フィルタを移動しました。 + +クエリを修正するには、非集計カラムに適用されるすべての条件を標準SQL構文に従って`WHERE`セクションに移動する必要があります。 +```sql +SELECT + number % 2 AS n, + sum(number) +FROM numbers(10) +WHERE number > 5 +GROUP BY n +``` + +### 無効なクエリでのCREATE VIEW + +新しいアナライザーでは常に型チェックが行われます。以前は、無効な`SELECT`クエリで`VIEW`を作成することが可能でした。最初の`SELECT`または`INSERT`(`MATERIALIZED VIEW`の場合)で失敗していました。 + +今では、そのような`VIEW`を作成することはできません。 + +**例:** + +```sql +CREATE TABLE source (data String) ENGINE=MergeTree ORDER BY tuple(); + +CREATE VIEW some_view +AS SELECT JSONExtract(data, 'test', 'DateTime64(3)') +FROM source; +``` + +### `JOIN`句の既知の非互換性 + +#### プロジェクションからカラムを使用するジョイン + +デフォルトでは、エイリアスは`SELECT`リストから`JOIN USING`キーとして使用できません。 + +新しい設定`analyzer_compatibility_join_using_top_level_identifier`を有効にすると、`JOIN USING`の動作が変わり、`SELECT`クエリのプロジェクションリストからの式に基づいて識別子を解決するのが優先され、左テーブルから直接カラムを使用しません。 + +**例:** + +```sql +SELECT a + 1 AS b, t2.s +FROM Values('a UInt64, b UInt64', (1, 1)) AS t1 +JOIN Values('b UInt64, s String', (1, 'one'), (2, 'two')) t2 +USING (b); +``` + +`analyzer_compatibility_join_using_top_level_identifier`を`true`に設定すると、ジョイン条件は`t1.a + 1 = t2.b`と解釈され、従来のバージョンの動作と一致します。結果は`2, 'two'`となります。 +設定が`false`の場合、ジョイン条件は`t1.b = t2.b`にデフォルト設定され、クエリは`2, 'one'`を返します。 +`t1`に`b`が存在しない場合、クエリはエラーで失敗します。 + +#### `JOIN USING`と`ALIAS`/`MATERIALIZED`カラムの動作変更 + +新しいアナライザーでは、`ALIAS`や`MATERIALIZED`カラムを含む`JOIN USING`クエリで`*`を使用すると、デフォルトでこれらのカラムが結果セットに含まれます。 + +**例:** + +```sql +CREATE TABLE t1 (id UInt64, payload ALIAS sipHash64(id)) ENGINE = MergeTree ORDER BY id; +INSERT INTO t1 VALUES (1), (2); + +CREATE TABLE t2 (id UInt64, payload ALIAS sipHash64(id)) ENGINE = MergeTree ORDER BY id; +INSERT INTO t2 VALUES (2), (3); + +SELECT * FROM t1 +FULL JOIN t2 USING (payload); +``` + +新しいアナライザーでは、このクエリの結果には両方のテーブルから`id`とともに`payload`カラムが含まれます。これに対し、以前のアナライザーはこれらの`ALIAS`カラムを含めるために特定の設定(`asterisk_include_alias_columns`または`asterisk_include_materialized_columns`)を有効にする必要があり、カラムの順序が異なる場合がありました。 + +特に古いクエリを新しいアナライザーに移行する際には、`*`の代わりに`SELECT`句で明示的にカラムを指定することを推奨します。 + +#### `USING`句におけるタイプ修飾子の処理 + +新しいアナライザーでは、`USING`句で指定されたカラムの共通スーパータイプを求めるルールが標準化され、特に`LowCardinality`や`Nullable`のようなタイプ修飾子を扱う際に、より予測可能な結果を生み出します。 + +- `LowCardinality(T)`と`T`:`LowCardinality(T)`型のカラムが`T`型のカラムと結合される場合、共通のスーパータイプは`T`となり、`LowCardinality`修飾子は破棄されます。 + +- `Nullable(T)`と`T`:`Nullable(T)`型のカラムが`T`型のカラムと結合される場合、共通のスーパータイプは`Nullable(T)`となり、nullableの特性は保持されます。 + +**例:** + +```sql +SELECT id, toTypeName(id) FROM Values('id LowCardinality(String)', ('a')) AS t1 +FULL OUTER JOIN Values('id String', ('b')) AS t2 +USING (id); +``` + +このクエリでは、`id`の共通スーパータイプは`String`と判断され、`t1`の`LowCardinality`修飾子は破棄されます。 + +### プロジェクションカラム名の変更 + +プロジェクション名の計算中、エイリアスは置き換えられません。 + +```sql +SELECT + 1 + 1 AS x, + x + 1 +SETTINGS enable_analyzer = 0 +FORMAT PrettyCompact + + ┌─x─┬─plus(plus(1, 1), 1)─┐ +1. │ 2 │ 3 │ + └───┴─────────────────────┘ + +SELECT + 1 + 1 AS x, + x + 1 +SETTINGS enable_analyzer = 1 +FORMAT PrettyCompact + + ┌─x─┬─plus(x, 1)─┐ +1. │ 2 │ 3 │ + └───┴────────────┘ +``` + +### 非互換の関数引数タイプ + +新しいアナライザーでは、初期クエリアナリシス中に型推論が行われます。この変更により、型チェックはショートサーキット評価の前に行われ、`if`関数の引数は常に共通のスーパータイプを持たなければなりません。 + +**例:** + +次のクエリは`There is no supertype for types Array(UInt8), String because some of them are Array and some of them are not`というエラーで失敗します: + +```sql +SELECT toTypeName(if(0, [2, 3, 4], 'String')) +``` + +### 異種クラスター + +新しいアナライザーはクラスタ内のサーバー間の通信プロトコルを大幅に変更しました。そのため、異なる`enable_analyzer`設定値を持つサーバーで分散クエリを実行することは不可能です。 + +### ミューテーションは以前のアナライザーによって解釈されます + +ミューテーションはまだ古いアナライザーを使用しており、このため、新しいClickHouse SQL機能はミューテーションで使用できません。例えば、`QUALIFY`句です。ステータスは[こちら](https://github.com/ClickHouse/ClickHouse/issues/61563)で確認できます。 + +### サポートされていない機能 + +新しいアナライザーが現時点でサポートしていない機能の一覧: + +- Annoyインデックス。 +- Hypothesisインデックス。進行中の作業は[こちら](https://github.com/ClickHouse/ClickHouse/pull/48381)。 +- ウィンドウビューはサポートされていません。将来的にサポートされる予定はありません。 diff --git a/docs/ja/operations/backup.md b/docs/ja/operations/backup.md new file mode 100644 index 00000000000..1f8aa8bf3b7 --- /dev/null +++ b/docs/ja/operations/backup.md @@ -0,0 +1,494 @@ +--- +slug: /ja/operations/backup +description: 人為的ミスを効果的に軽減するために、データのバックアップと復元の戦略を慎重に準備する必要があります。 +--- + +# バックアップと復元 + +- [ローカルディスクへのバックアップ](#backup-to-a-local-disk) +- [S3エンドポイントを使用するためのバックアップ/リストアの設定](#configuring-backuprestore-to-use-an-s3-endpoint) +- [S3ディスクを使用したバックアップ/リストア](#backuprestore-using-an-s3-disk) +- [代替案](#alternatives) + +## コマンド概要 + +```bash + BACKUP|RESTORE + TABLE [db.]table_name [AS [db.]table_name_in_backup] + [PARTITION[S] partition_expr [,...]] | + DICTIONARY [db.]dictionary_name [AS [db.]name_in_backup] | + DATABASE database_name [AS database_name_in_backup] + [EXCEPT TABLES ...] | + TEMPORARY TABLE table_name [AS table_name_in_backup] | + VIEW view_name [AS view_name_in_backup] + ALL TEMPORARY TABLES [EXCEPT ...] | + ALL [EXCEPT ...] } [,...] + [ON CLUSTER 'cluster_name'] + TO|FROM File('/') | Disk('', '/') | S3('/', '', '') + [SETTINGS base_backup = File('/') | Disk(...) | S3('/', '', '')] + +``` + +:::note ALL +ClickHouseのバージョン23.4以前では、`ALL`は`RESTORE`コマンドにのみ適用されました。 +::: + +## 背景 + +[レプリケーション](../engines/table-engines/mergetree-family/replication.md)はハードウェアの障害からデータを保護しますが、人為的ミスに対しては保護しません。たとえば、データの誤削除や、不適切なテーブルの削除、または間違ったクラスター上での削除、ソフトウェアのバグによる誤ったデータ処理やデータ破損が含まれます。これらのミスは多くの場合、すべてのレプリカに影響します。ClickHouseは、一部の誤りを防ぐための組み込みのセーフガードを持っています。たとえば、デフォルトでは、[50GBを超えるデータを含むMergeTreeのようなエンジンを持つテーブルを簡単に削除できない](server-configuration-parameters/settings.md#max-table-size-to-drop)ようにすることができます。しかし、これらのセーフガードではすべてのケースをカバーしきれず、回避される可能性があります。 + +人為的ミスを効果的に軽減するために、**事前に**データのバックアップと復元の戦略を慎重に準備する必要があります。 + +企業ごとに利用可能なリソースやビジネス要件が異なるため、すべての状況に合うClickHouseのバックアップと復元の万能な解決策は存在しません。1GBのデータに対して機能するものが、数十ペタバイトには効かない可能性があります。それぞれに独自の利点と欠点があるさまざまなアプローチがあります。以下でこれについて説明します。さまざまな欠点を補うために、1つのアプローチだけでなくいくつかのアプローチを使用するのが良い考えです。 + +:::note +何かをバックアップしたが復元を試したことがない場合、実際に必要な時に復元が正常に動作しない可能性があります(少なくともビジネスが許容できる以上に時間がかかります)。したがって、どのバックアップアプローチを選択するにしても、復元プロセスも自動化し、定期的に予備のClickHouseクラスター上で実行することを確認してください。 +::: + +## ローカルディスクへのバックアップ + +### バックアップ先の設定 + +以下の例では、バックアップの宛先が`Disk('backups', '1.zip')`のように指定されていることがわかります。目的地を準備するには、/etc/clickhouse-server/config.d/backup_disk.xmlにバックアップ先を指定するファイルを追加します。たとえば、このファイルは`backups`という名前のディスクを定義し、そのディスクを**backups > allowed_disk**リストに追加します: + +```xml + + + + + + local + /backups/ + + + + + + backups + /backups/ + + + +``` + +### パラメータ + +バックアップはフルまたは増分バックアップで行うことができ、テーブル(マテリアライズドビュー、プロジェクション、およびDictionaryを含む)やデータベースを含めることができます。バックアップは同期(デフォルト)または非同期にすることができ、圧縮することもできます。バックアップにはパスワード保護を設定できます。 + +BACKUPおよびRESTOREステートメントは、データベースおよびテーブル名のリスト、宛先(またはソース)、オプションと設定を取ります: +- バックアップの宛先、または復元のソース。これは以前に定義されたディスクに基づいています。たとえば`Disk('backups', 'filename.zip')` +- ASYNC: バックアップまたは復元を非同期に行う +- PARTITIONS: 復元するパーティションのリスト +- SETTINGS: + - `id`: バックアップまたは復元操作のIDを指定し、指定しない場合はランダムに生成されます。既に同じ`id`で実行されている操作がある場合、例外が発生します。 + - [`compression_method`](/docs/ja/sql-reference/statements/create/table.md/#column-compression-codecs)およびcompression_level + - ディスク上のファイルの`password` + - `base_backup`: このソースの前回のバックアップの宛先。たとえば、`Disk('backups', '1.zip')` + - `use_same_s3_credentials_for_base_backup`: ベースバックアップをS3に対してクエリの資格情報を継承するかどうか。`S3`でのみ機能。 + - `use_same_password_for_base_backup`: ベースバックアップアーカイブがクエリのパスワードを継承するかどうか。 + - `structure_only`: 有効にすると、テーブルのデータなしでCREATEステートメントのみをバックアップまたは復元できます + - `storage_policy`: 復元されるテーブルのストレージポリシー。参照:[データストレージ用の複数のブロックデバイスの使用](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes)。この設定は`RESTORE`コマンドにのみ適用されます。指定されたストレージポリシーは`MergeTree`ファミリーのエンジンを持つテーブルにのみ適用されます。 + - `s3_storage_class`: S3バックアップに使用されるストレージクラス。たとえば、`STANDARD` + - `azure_attempt_to_create_container`: Azure Blob Storageを使用する際、指定されたコンテナが存在しない場合に作成を試みるかどうか。デフォルトはtrueです。 + +### 使用例 + +テーブルをバックアップし、その後復元する: +``` +BACKUP TABLE test.table TO Disk('backups', '1.zip') +``` + +対応する復元: +``` +RESTORE TABLE test.table FROM Disk('backups', '1.zip') +``` + +:::note +上記の`RESTORE`はテーブル`test.table`にデータが含まれている場合に失敗します。復元をテストするためには、テーブルを削除する必要があります。または、`allow_non_empty_tables=true`という設定を使用してください: +``` +RESTORE TABLE test.table FROM Disk('backups', '1.zip') +SETTINGS allow_non_empty_tables=true +``` +::: + +テーブルを新しい名前で復元またはバックアップすることができます: +``` +RESTORE TABLE test.table AS test.table2 FROM Disk('backups', '1.zip') +``` + +``` +BACKUP TABLE test.table3 AS test.table4 TO Disk('backups', '2.zip') +``` + +### 増分バックアップ + +増分バックアップは、`base_backup`を指定することで取得できます。 +:::note +増分バックアップはベースバックアップに依存しています。増分バックアップから復元するためには、ベースバックアップを利用可能に保つ必要があります。 +::: + +新しいデータを増分で保存します。`base_backup`の設定により、以前のバックアップからのデータが`Disk('backups', 'd.zip')`から`Disk('backups', 'incremental-a.zip')`に保存されます: +``` +BACKUP TABLE test.table TO Disk('backups', 'incremental-a.zip') + SETTINGS base_backup = Disk('backups', 'd.zip') +``` + +増分バックアップとベースバックアップからのすべてのデータを新しいテーブル`test.table2`に復元します: +``` +RESTORE TABLE test.table AS test.table2 + FROM Disk('backups', 'incremental-a.zip'); +``` + +### バックアップにパスワードを設定する + +ディスクに書き込まれたバックアップには、ファイルにパスワードを適用することができます: +``` +BACKUP TABLE test.table + TO Disk('backups', 'password-protected.zip') + SETTINGS password='qwerty' +``` + +復元: +``` +RESTORE TABLE test.table + FROM Disk('backups', 'password-protected.zip') + SETTINGS password='qwerty' +``` + +### 圧縮設定 + +圧縮方法またはレベルを指定したい場合: +``` +BACKUP TABLE test.table + TO Disk('backups', 'filename.zip') + SETTINGS compression_method='lzma', compression_level=3 +``` + +### 特定のパーティションを復元する +テーブルに関連付けられた特定のパーティションを復元する必要がある場合、これを指定することができます。バックアップからパーティション1と4を復元するには: +``` +RESTORE TABLE test.table PARTITIONS '2', '3' + FROM Disk('backups', 'filename.zip') +``` + +### tarアーカイブとしてのバックアップ + +バックアップはzipと同様にtarアーカイブとして保存することもできます。ただし、パスワードはサポートされていません。 + +tarとしてバックアップを書く: +``` +BACKUP TABLE test.table TO Disk('backups', '1.tar') +``` + +対応する復元: +``` +RESTORE TABLE test.table FROM Disk('backups', '1.tar') +``` + +圧縮方法を変更するには、バックアップ名に適切なファイルサフィックスを付ける必要があります。gzipを使用してtarアーカイブを圧縮するには: +``` +BACKUP TABLE test.table TO Disk('backups', '1.tar.gz') +``` + +サポートされている圧縮ファイルサフィックスは`tar.gz`、`.tgz`、`tar.bz2`、`tar.lzma`、`.tar.zst`、`.tzst`および`.tar.xz`です。 + +### バックアップのステータスを確認する + +バックアップコマンドは`id`および`status`を返し、その`id`を使用してバックアップのステータスを取得できます。これは、長時間のASYNCバックアップの進行状況を確認するのに非常に便利です。以下の例では、既存のバックアップファイルを上書きしようとしたときに発生した失敗を示しています: +```sql +BACKUP TABLE helloworld.my_first_table TO Disk('backups', '1.zip') ASYNC +``` +```response +┌─id───────────────────────────────────┬─status──────────┐ +│ 7678b0b3-f519-4e6e-811f-5a0781a4eb52 │ CREATING_BACKUP │ +└──────────────────────────────────────┴─────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +``` +SELECT + * +FROM system.backups +where id='7678b0b3-f519-4e6e-811f-5a0781a4eb52' +FORMAT Vertical +``` +```response +Row 1: +────── +id: 7678b0b3-f519-4e6e-811f-5a0781a4eb52 +name: Disk('backups', '1.zip') +#highlight-next-line +status: BACKUP_FAILED +num_files: 0 +uncompressed_size: 0 +compressed_size: 0 +#highlight-next-line +error: Code: 598. DB::Exception: Backup Disk('backups', '1.zip') already exists. (BACKUP_ALREADY_EXISTS) (version 22.8.2.11 (official build)) +start_time: 2022-08-30 09:21:46 +end_time: 2022-08-30 09:21:46 + +1 row in set. Elapsed: 0.002 sec. +``` + +`system.backups`テーブルと共に、すべてのバックアップおよびリストア操作はシステムログテーブル[backup_log](../operations/system-tables/backup_log.md)でも追跡されます: +``` +SELECT * +FROM system.backup_log +WHERE id = '7678b0b3-f519-4e6e-811f-5a0781a4eb52' +ORDER BY event_time_microseconds ASC +FORMAT Vertical +``` +```response +Row 1: +────── +event_date: 2023-08-18 +event_time_microseconds: 2023-08-18 11:13:43.097414 +id: 7678b0b3-f519-4e6e-811f-5a0781a4eb52 +name: Disk('backups', '1.zip') +status: CREATING_BACKUP +error: +start_time: 2023-08-18 11:13:43 +end_time: 1970-01-01 03:00:00 +num_files: 0 +total_size: 0 +num_entries: 0 +uncompressed_size: 0 +compressed_size: 0 +files_read: 0 +bytes_read: 0 + +Row 2: +────── +event_date: 2023-08-18 +event_time_microseconds: 2023-08-18 11:13:43.174782 +id: 7678b0b3-f519-4e6e-811f-5a0781a4eb52 +name: Disk('backups', '1.zip') +status: BACKUP_FAILED +#highlight-next-line +error: Code: 598. DB::Exception: Backup Disk('backups', '1.zip') already exists. (BACKUP_ALREADY_EXISTS) (version 23.8.1.1) +start_time: 2023-08-18 11:13:43 +end_time: 2023-08-18 11:13:43 +num_files: 0 +total_size: 0 +num_entries: 0 +uncompressed_size: 0 +compressed_size: 0 +files_read: 0 +bytes_read: 0 + +2 rows in set. Elapsed: 0.075 sec. +``` + +## S3エンドポイントを使用するためのBACKUP/RESTOREの設定 + +S3バケットにバックアップを書くためには、次の情報が必要です: +- S3エンドポイント, + たとえば `https://mars-doc-test.s3.amazonaws.com/backup-S3/` +- アクセスキーID, + たとえば `ABC123` +- シークレットアクセスキー, + たとえば `Abc+123` + +:::note +S3バケットの作成については[ClickHouseディスクとしてのS3オブジェクトストレージの使用](/docs/ja/integrations/data-ingestion/s3/index.md#configuring-s3-for-clickhouse-use)でカバーされていますが、ポリシーを保存した後にこのドキュメントに戻るだけでよく、ClickHouseをS3バケットで使用するように設定する必要はありません。 +::: + +バックアップの宛先は次のように指定されます: +``` +S3('/<ディレクトリ>', '<アクセスキーID>', '<シークレットアクセスキー>') +``` + +```sql +CREATE TABLE data +( + `key` Int, + `value` String, + `array` Array(String) +) +ENGINE = MergeTree +ORDER BY tuple() +``` + +```sql +INSERT INTO data SELECT * +FROM generateRandom('key Int, value String, array Array(String)') +LIMIT 1000 +``` + +### ベース(初期)バックアップの作成 + +増分バックアップには開始するための_ベース_バックアップが必要です。この例を後でベースバックアップとして使用します。S3の宛先の最初のパラメータはS3エンドポイントで、その後はこのバックアップ用のバケット内のディレクトリです。この例ではディレクトリを`my_backup`としています。 + +```sql +BACKUP TABLE data TO S3('https://mars-doc-test.s3.amazonaws.com/backup-S3/my_backup', 'ABC123', 'Abc+123') +``` + +```response +┌─id───────────────────────────────────┬─status─────────┐ +│ de442b75-a66c-4a3c-a193-f76f278c70f3 │ BACKUP_CREATED │ +└──────────────────────────────────────┴────────────────┘ +``` + +### データを追加する + +増分バックアップは、ベースバックアップと現在のテーブル内容との間の差分で構成されます。増分バックアップを取る前にデータをさらに追加します: + +```sql +INSERT INTO data SELECT * +FROM generateRandom('key Int, value String, array Array(String)') +LIMIT 100 +``` +### 増分バックアップを取る + +このバックアップコマンドはベースバックアップと似ていますが、`SETTINGS base_backup`とベースバックアップの場所を追加します。増分バックアップの宛先はベースと同じディレクトリではなく、バケット内の異なるターゲットディレクトリであることに注意してください。ベースバックアップは`my_backup`にあり、増分バックアップは`my_incremental`に書き込まれます: +```sql +BACKUP TABLE data TO S3('https://mars-doc-test.s3.amazonaws.com/backup-S3/my_incremental', 'ABC123', 'Abc+123') SETTINGS base_backup = S3('https://mars-doc-test.s3.amazonaws.com/backup-S3/my_backup', 'ABC123', 'Abc+123') +``` + +```response +┌─id───────────────────────────────────┬─status─────────┐ +│ f6cd3900-850f-41c9-94f1-0c4df33ea528 │ BACKUP_CREATED │ +└──────────────────────────────────────┴────────────────┘ +``` +### 増分バックアップから復元する + +このコマンドは、増分バックアップを新しいテーブル`data3`に復元します。増分バックアップが復元されるとき、ベースバックアップも同様に含まれることに注意してください。復元する際には増分バックアップのみを指定します: +```sql +RESTORE TABLE data AS data3 FROM S3('https://mars-doc-test.s3.amazonaws.com/backup-S3/my_incremental', 'ABC123', 'Abc+123') +``` + +```response +┌─id───────────────────────────────────┬─status───┐ +│ ff0c8c39-7dff-4324-a241-000796de11ca │ RESTORED │ +└──────────────────────────────────────┴──────────┘ +``` + +### 行数を確認する + +元のテーブル`data`には最初に1,000行、次に100行のデータが挿入され、合計1,100行となります。復元されたテーブルが1,100行あることを確認します: +```sql +SELECT count() +FROM data3 +``` +```response +┌─count()─┐ +│ 1100 │ +└─────────┘ +``` + +### 内容を確認する +これにより、元のテーブル`data`と復元されたテーブル`data3`の内容が比較されます: +```sql +SELECT throwIf(( + SELECT groupArray(tuple(*)) + FROM data + ) != ( + SELECT groupArray(tuple(*)) + FROM data3 + ), 'Data does not match after BACKUP/RESTORE') +``` +## S3ディスクを使用してのバックアップ/復元 + +ClickHouseのストレージ設定でS3ディスクを設定することにより、S3への`BACKUP`/`RESTORE`を行うことも可能です。以下のようにディスクを設定するために、/etc/clickhouse-server/config.dにファイルを追加します: + +```xml + + + + + s3_plain + + + + + + + + +
    + s3_plain +
    +
    +
    +
    +
    + + + s3_plain + +
    +``` + +そして、通常通り`BACKUP`/`RESTORE`を実行します: + +```sql +BACKUP TABLE data TO Disk('s3_plain', 'cloud_backup'); +RESTORE TABLE data AS data_restored FROM Disk('s3_plain', 'cloud_backup'); +``` + +:::note +しかし、次のことを覚えておいてください: +- このディスクは`MergeTree`自体には使用せず、`BACKUP`/`RESTORE`のみに使用するべきです。 +- テーブルがS3ストレージでサポートされており、ディスクの種類が異なる場合、パーツを宛先バケットにコピーするための`CopyObject`コールを使用せず、ダウンロードおよびアップロードを行います。これは非常に非効率的です。このユースケースには`BACKUP ... TO S3()`の構文を使用することを優先します。 +::: + +## 代替案 + +ClickHouseはデータをディスクに保存しており、ディスクのバックアップ方法はさまざまです。これらは過去に使用されてきた代替案であり、あなたの環境に適しているかもしれません。 + +### ソースデータを別の場所に複製する {#duplicating-source-data-somewhere-else} + +ClickHouseに取り込まれるデータは、しばしば[Apache Kafka](https://kafka.apache.org)のような永続的なキューを通して配信されます。この場合、ClickHouseに書き込まれる間に同じデータストリームを読み取り、どこかに保存する追加のサブスクライバーセットを設定することが可能です。多くの企業はすでにオブジェクトストアや[HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)のような分散ファイルシステムの、デフォルトの推奨コールドストレージを持っています。 + +### ファイルシステムのスナップショット {#filesystem-snapshots} + +一部のローカルファイルシステムにはスナップショット機能があります(例:[ZFS](https://en.wikipedia.org/wiki/ZFS))。ただし、これらはライブクエリの処理には最適でない場合があります。ある解決策は、このようなファイルシステムを持つ追加のレプリカを作成し、それを`SELECT`クエリに使用される[分散テーブル](../engines/table-engines/special/distributed.md)から除外することです。このようなレプリカ上のスナップショットは、データを変更するクエリの範囲外にあります。ボーナスとして、これらのレプリカは特別なハードウェア設定で、サーバー毎に多くのディスクが接続されている場合があり、コスト効果があります。 + +データ量が小さい場合、リモートテーブルへの単純な`INSERT INTO ... SELECT ...`がうまく機能することもあります。 + +### パーツの操作 {#manipulations-with-parts} + +ClickHouseは`ALTER TABLE ... FREEZE PARTITION ...`クエリを使用してテーブルパーティションのローカルコピーを作成することを許可します。これは`/var/lib/clickhouse/shadow/`フォルダへのハードリンクを使用して実装されているため、通常は古いデータのために追加のディスクスペースを消費しません。作成されたファイルのコピーはClickHouseサーバーによって管理されないため、そこに残しておくことができます:追加の外部システムを必要とせずに単純なバックアップを持つことができ、しかしそれはハードウェアの問題に対しては依然として脆弱です。このため、それらを他の場所にリモートでコピーしてからローカルのコピーを削除するのが良いです。分散ファイルシステムとオブジェクトストアは依然として良い選択ですが、通常接続されているファイルサーバーの容量で十分であることもあります(この場合、転送はネットワークファイルシステムまたは[rsync](https://en.wikipedia.org/wiki/Rsync)経由で行われます)。 +データは`ALTER TABLE ... ATTACH PARTITION ...`クエリを使用してバックアップから復元することができます。 + +パーティション操作に関連するクエリについて詳しくは、[ALTERドキュメント](../sql-reference/statements/alter/partition.md#alter_manipulations-with-partitions)を参照してください。 + +このアプローチを自動化するためのサードパーティツールが利用可能です:[clickhouse-backup](https://github.com/AlexAkulov/clickhouse-backup)。 + +## 同時バックアップ/リストアを許可しない設定 + +同時バックアップ/リストアを許可しないようにするためには、それぞれの設定を使用することができます。 + +```xml + + + false + false + + +``` + +デフォルト値はどちらもtrueであり、デフォルトでは同時バックアップ/リストアが許可されています。 +これらの設定がfalseの場合、クラスターで1度に実行できるバックアップ/リストアは1つのみです。 + +## AzureBlobStorage エンドポイントを使用するためのバックアップ/リストアの設定 + +AzureBlobStorageコンテナにバックアップを書くためには、次の情報が必要です: +- AzureBlobStorageのエンドポイント接続文字列 / URL, +- コンテナ, +- パス, +- アカウント名 (URLが指定された場合) +- アカウントキー (URLが指定された場合) + +バックアップの宛先は次のように指定されます: +``` +AzureBlobStorage('<接続文字列>/', '<コンテナ>', '<パス>', '<アカウント名>', '<アカウントキー>') +``` + +```sql +BACKUP TABLE data TO AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', + 'test_container', 'data_backup'); +RESTORE TABLE data AS data_restored FROM AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', + 'test_container', 'data_backup'); +``` diff --git a/docs/ja/operations/caches.md b/docs/ja/operations/caches.md new file mode 100644 index 00000000000..6964a49ab6f --- /dev/null +++ b/docs/ja/operations/caches.md @@ -0,0 +1,28 @@ +--- +slug: /ja/operations/caches +sidebar_position: 65 +sidebar_label: キャッシュ +title: "キャッシュタイプ" +description: クエリを実行する際、ClickHouseは異なるキャッシュを使用します。 +--- + +クエリを実行する際、ClickHouseは異なるキャッシュを使用します。 + +主なキャッシュタイプ: + +- `mark_cache` — [MergeTree](../engines/table-engines/mergetree-family/mergetree.md)ファミリのテーブルエンジンで使用されるマークのキャッシュ。 +- `uncompressed_cache` — [MergeTree](../engines/table-engines/mergetree-family/mergetree.md)ファミリのテーブルエンジンで使用される、非圧縮データのキャッシュ。 +- オペレーティングシステムのページキャッシュ(実際のデータを含むファイルに対して間接的に使用されます)。 + +追加のキャッシュタイプ: + +- DNSキャッシュ。 +- [Regexp](../interfaces/formats.md#data-format-regexp)キャッシュ。 +- コンパイルされた式のキャッシュ。 +- [Avroフォーマット](../interfaces/formats.md#data-format-avro)スキーマのキャッシュ。 +- [Dictionary](../sql-reference/dictionaries/index.md)データキャッシュ。 +- スキーマ推論キャッシュ。 +- S3、Azure、ローカルディスクなどに対する[ファイルシステムキャッシュ](storing-data.md)。 +- [クエリキャッシュ](query-cache.md)。 + +キャッシュの一つを削除するには、[SYSTEM DROP ... CACHE](../sql-reference/statements/system.md#drop-mark-cache)ステートメントを使用します。 diff --git a/docs/ja/operations/cluster-discovery.md b/docs/ja/operations/cluster-discovery.md new file mode 100644 index 00000000000..6f36b4d4f28 --- /dev/null +++ b/docs/ja/operations/cluster-discovery.md @@ -0,0 +1,179 @@ +--- +slug: /ja/operations/cluster-discovery +sidebar_label: クラスター検出 +--- +# クラスター検出 + +## 概要 + +ClickHouseのクラスター検出機能は、ノードを自動で検出・登録できるようにすることで、クラスターの設定を簡素化します。設定ファイルでノードを明示的に定義する必要がなくなり、特に各ノードを手動で定義することが負担になる場合に便利です。 + +:::note + +クラスター検出はエクスペリメンタルな機能であり、将来のバージョンで変更または削除される可能性があります。 +この機能を有効にするには、次の設定を設定ファイルに含めてください: + +```xml + + + 1 + + +``` +::: + +## リモートサーバーの設定 + +### 従来の手動設定 + +従来、ClickHouseではクラスター内の各シャードとレプリカを設定で手動で指定する必要がありました: + +```xml + + + + + node1 + 9000 + + + node2 + 9000 + + + + + node3 + 9000 + + + node4 + 9000 + + + + +``` + +### クラスター検出の使用 + +クラスター検出を使用すると、ZooKeeperでパスを指定するだけで、すべてのノードが自動的に検出され、クラスターに追加されます。 + +```xml + + + + /clickhouse/discovery/cluster_name + + + + + + + + + + + + + + + + + +``` + +特定のノードにシャード番号を指定したい場合は、``セクション内に``タグを含めます: + +`node1` と `node2` 用: + +```xml + + /clickhouse/discovery/cluster_name + 1 + +``` + +`node3` と `node4` 用: + +```xml + + /clickhouse/discovery/cluster_name + 2 + +``` + +### オブザーバーモード + +オブザーバーモードで設定されたノードは、レプリカとして自分自身を登録しません。 +クラスター内の他のアクティブなレプリカを観察・検出するだけで、積極的に参加しません。 +オブザーバーモードを有効にするには、``セクション内に``タグを含めます: + +```xml + + /clickhouse/discovery/cluster_name + + +``` + +## 使用例と制限事項 + +指定したZooKeeperのパスにノードが追加または削除されると、それに応じてクラスターに自動的に追加または削除され、設定変更やサーバー再起動は必要ありません。 + +ただし、変更はクラスター設定にのみ影響し、データや既存のデータベースおよびテーブルには影響を与えません。 + +3ノードのクラスターの例を考えてみましょう: + +```xml + + + + /clickhouse/discovery/default_cluster + + + +``` + +``` +SELECT * EXCEPT (default_database, errors_count, slowdowns_count, estimated_recovery_time, database_shard_name, database_replica_name) +FROM system.clusters WHERE cluster = 'default'; + +┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐ +│ default │ 1 │ 1 │ 1 │ 92d3c04025e8 │ 172.26.0.5 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │ +│ default │ 1 │ 1 │ 2 │ a6a68731c21b │ 172.26.0.4 │ 9000 │ 1 │ │ ᴺᵁᴸᴸ │ +│ default │ 1 │ 1 │ 3 │ 8e62b9cb17a1 │ 172.26.0.2 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │ +└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘ +``` + +```sql +CREATE TABLE event_table ON CLUSTER default (event_time DateTime, value String) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/event_table', '{replica}') +ORDER BY event_time PARTITION BY toYYYYMM(event_time); + +INSERT INTO event_table ... +``` + +次に新しいノードをクラスターに追加し、設定ファイルの`remote_servers`セクションに同じエントリを持つ新しいノードを起動します: + +``` +┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐ +│ default │ 1 │ 1 │ 1 │ 92d3c04025e8 │ 172.26.0.5 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │ +│ default │ 1 │ 1 │ 2 │ a6a68731c21b │ 172.26.0.4 │ 9000 │ 1 │ │ ᴺᵁᴸᴸ │ +│ default │ 1 │ 1 │ 3 │ 8e62b9cb17a1 │ 172.26.0.2 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │ +│ default │ 1 │ 1 │ 4 │ b0df3669b81f │ 172.26.0.6 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │ +└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘ +``` + +4番目のノードがクラスターに参加していますが、テーブル`event_table`はまだ最初の3つのノードにのみ存在しています: + +```sql +SELECT hostname(), database, table FROM clusterAllReplicas(default, system.tables) WHERE table = 'event_table' FORMAT PrettyCompactMonoBlock + +┌─hostname()───┬─database─┬─table───────┐ +│ a6a68731c21b │ default │ event_table │ +│ 92d3c04025e8 │ default │ event_table │ +│ 8e62b9cb17a1 │ default │ event_table │ +└──────────────┴──────────┴─────────────┘ +``` + +テーブルがすべてのノードでレプリケートされる必要がある場合は、クラスター検出の代わりに[レプリケートされた](../engines/database-engines/replicated.md)データベースエンジンを使用することをお勧めします。 diff --git a/docs/ja/operations/configuration-files.md b/docs/ja/operations/configuration-files.md new file mode 100644 index 00000000000..5ced547e8a0 --- /dev/null +++ b/docs/ja/operations/configuration-files.md @@ -0,0 +1,363 @@ +--- +slug: /ja/operations/configuration-files +sidebar_position: 50 +sidebar_label: 設定ファイル +--- + +# 設定ファイル + +ClickHouseサーバーは、XMLまたはYAML構文の設定ファイルで構成できます。ほとんどのインストールタイプでは、ClickHouseサーバーはデフォルトの設定ファイルとして `/etc/clickhouse-server/config.xml` で実行されますが、サーバーの起動時にコマンドラインオプション `--config-file=` または `-C` を使用して設定ファイルの場所を手動で指定することも可能です。追加の設定ファイルは、メインの設定ファイルの相対ディレクトリ `config.d/` に配置することができます。例えば、ディレクトリ `/etc/clickhouse-server/config.d/` に配置します。このディレクトリとメインの設定がClickHouseサーバーで設定を適用する前に前処理ステップでマージされます。設定ファイルはアルファベット順でマージされます。更新を簡素化し、モジュール化を改善するためには、デフォルトの `config.xml` ファイルを変更せず、追加のカスタマイズを `config.d/` に配置するのが最良のプラクティスです。 +(ClickHouse keeper の設定は `/etc/clickhouse-keeper/keeper_config.xml` に存在するため、追加ファイルは `/etc/clickhouse-keeper/keeper_config.d/` に配置する必要があります。) + +XML および YAML 設定ファイルを混在させることが可能です。例えば、メイン設定ファイル `config.xml` と追加の設定ファイル `config.d/network.xml`、`config.d/timezone.yaml`、`config.d/keeper.yaml` を持つことができます。単一の設定ファイル内で XML と YAML を混在させることはサポートされていません。XML 設定ファイルは `...` をトップレベルタグとして使用する必要があります。YAML 設定ファイルでは、`clickhouse:` はオプションであり、存在しない場合にはパーサーが自動的に補完します。 + +## 設定のマージ {#merging} + +通常、2つの設定ファイル(メインの設定ファイルと `config.d/` からの他の設定ファイル)が次のようにマージされます: + +- ノード(つまり、要素へのパス)が両方のファイルに存在し、`replace` または `remove` 属性を持たない場合、マージされた設定ファイルに含まれ、両方のノードの子が含まれて再帰的にマージされます。 +- もしどちらかのノードが `replace` 属性を含んでいた場合、そのノードのみがマージされた設定ファイルに含まれますが、`replace` 属性を持つノードの子要素のみが含まれます。 +- もしどちらかのノードが `remove` 属性を含んでいた場合、そのノードはマージされた設定ファイルには含まれません(既に存在する場合は削除されます)。 + +例: + +```xml + + + + 1 + + + 2 + + + 3 + + +``` + +および + +```xml + + + + 4 + + + 5 + + + 6 + + +``` + +生成されたマージされた設定ファイル: + +```xml + + + 1 + 4 + + + 5 + + +``` + +### from_env と from_zk の使用 + +要素の値を環境変数の値に置き換えるために、属性 `from_env` を使用できます。 + +例:`$MAX_QUERY_SIZE = 150000` の場合: + +```xml + + + + + + + +``` + +これは次のようになります: + +``` xml + + + + 150000 + + + +``` + +同様に `from_zk` を使用することも可能です: + +``` xml + + + +``` + +``` +# clickhouse-keeper-client +/ :) touch /zk_configs +/ :) create /zk_configs/postgresql_port "9005" +/ :) get /zk_configs/postgresql_port +9005 +``` + +これも次のようになります: + +``` xml + + 9005 + +``` + +#### from_env と from_zk 属性のデフォルト値 + +デフォルト値を設定し、環境変数またはZooKeeperノードが設定されている場合にのみ置き換えることができます。`replace="1"` を使用してください(from_env より前に宣言する必要があります)。 + +前の例を使用し、`MAX_QUERY_SIZE` が設定されていない場合: + +``` xml + + + + 150000 + + + +``` + +デフォルト値を使用します: + +``` xml + + + + 150000 + + + +``` + +## 設定の置換 {#substitution} + +設定ファイルは置換を定義できます。置換には2つのタイプがあります: + +- 要素に `incl` 属性がある場合、ファイルから対応する置換をその値として使用します。デフォルトでは、置換が記述されたファイルへのパスは `/etc/metrika.xml` です。これはサーバー設定の [include_from](../operations/server-configuration-parameters/settings.md#include_from) 要素で変更可能です。置換値は、このファイル内の `/clickhouse/substitution_name` 要素で指定されます。 `incl` で指定された置換が存在しない場合、その内容がログに記録されます。ClickHouseが不足している置換をログに記録しないようにするには、`optional="true"` 属性を指定してください(例:[macros](../operations/server-configuration-parameters/settings.md#macros) の設定)。 + +- 要素全体を置換で置き換えたい場合は、要素名として `include` を使用してください。Zookeeperからの置換も、属性 `from_zk = "/path/to/node"` を指定することで行うことができます。この場合、要素の値は `/path/to/node` のZookeeperノードの内容に置き換えられます。XMLサブツリー全体をZookeeperノードとして保存している場合も同様に、ソース要素に完全に挿入されます。 + +XML置換の例: + +```xml + + + + + + + + + + +``` + +既存の構成と置換内容をマージしたい場合は、属性 `merge="true"` を使用することができます。例えば:``。この場合、既存の設定は置換の内容とマージされ、既存の設定が置換からの値に置き換えられます。 + +## 設定の暗号化と隠蔽 {#encryption} + +構成要素、例えばプレーンテキストのパスワードや秘密鍵を暗号化するために対称暗号化を使用することができます。そのためには、まず[暗号化コーデック](../sql-reference/statements/create/table.md#encryption-codecs)を設定し、暗号化する要素に `encrypted_by` 属性と暗号化コーデックの名前を追加します。 + +`from_zk`、`from_env` および `incl` 属性(または要素 `include`)とは異なり、置換、すなわち暗号化された値の復号化は前処理ファイルで行われません。復号化はサーバープロセスで実行時にのみ行われます。 + +例: + +```xml + + + + + 00112233445566778899aabbccddeeff + + + + + admin + 961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85 + + + +``` + +値を暗号化するには、(例の)プログラム `encrypt_decrypt` を使用できます: + +例: + +``` bash +./encrypt_decrypt /etc/clickhouse-server/config.xml -e AES_128_GCM_SIV abcd +``` + +``` text +961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85 +``` + +暗号化された設定要素であっても、暗号化された要素は前処理済みの設定ファイルに表示されます。これがClickHouseの展開に問題を引き起こす場合は、二つの代替案を提案します:1. 前処理済みファイルのファイル権限を600に設定する、もしくは 2. `hide_in_preprocessed` 属性を使用することです。 + +例: + +```xml + + + + admin + secret + + + +``` + +## ユーザー設定 {#user-settings} + +`config.xml` ファイルには、ユーザー設定、プロファイル、およびクォータを含む別の設定を指定することができます。この設定への相対パスは `users_config` 要素に設定されます。デフォルトでは `users.xml` です。`users_config` が省略された場合は、ユーザー設定、プロファイル、およびクォータは `config.xml` に直接記載されます。 + +ユーザー設定は、`config.xml` および `config.d/` と同様に、別々のファイルに分割することができます。ディレクトリ名は、`.xml` 接尾辞を除いた `users_config` 設定と `.d` を連結して定義されます。デフォルトでは `users.d` が使用され、`users_config` は `users.xml` にデフォルト設定されています。 + +設定ファイルはまず [マージ](#merging) され、設定を考慮し、その後でインクルードが処理されることに留意してください。 + +## XML例 {#example} + +たとえば、以下のように各ユーザー用に個別の設定ファイルを用意することができます: + +``` bash +$ cat /etc/clickhouse-server/users.d/alice.xml +``` + +``` xml + + + + analytics + + ::/0 + + ... + analytics + + + +``` + +## YAML例 {#example} + +ここでは、YAMLで書かれたデフォルト設定を見ることができます:[config.yaml.example](https://github.com/ClickHouse/ClickHouse/blob/master/programs/server/config.yaml.example)。 + +ClickHouse の設定に関して、YAML と XML フォーマットにはいくつかの違いがあります。ここでは、YAML フォーマットでの設定を書くためのいくつかのヒントを示します。 + +テキスト値を持つ XML タグは、YAML のキーと値のペアで表されます +``` yaml +key: value +``` + +対応する XML: +``` xml +value +``` + +ネストされた XML ノードは YAML マップで表されます: +``` yaml +map_key: + key1: val1 + key2: val2 + key3: val3 +``` + +対応する XML: +``` xml + + val1 + val2 + val3 + +``` + +同じXMLタグを複数回作成するには、YAMLシーケンスを使用します: +``` yaml +seq_key: + - val1 + - val2 + - key1: val3 + - map: + key2: val4 + key3: val5 +``` + +対応する XML: +```xml +val1 +val2 + + val3 + + + + val4 + val5 + + +``` + +XML属性を指定するには、`@` プレフィックスを付けた属性キーを使用できます。`@` は YAML 標準で予約されているため、ダブルクォートで囲む必要があります: +``` yaml +map: + "@attr1": value1 + "@attr2": value2 + key: 123 +``` + +対応する XML: +``` xml + + 123 + +``` + +YAML シーケンスに属性を使用することも可能です: +``` yaml +seq: + - "@attr1": value1 + - "@attr2": value2 + - 123 + - abc +``` + +対応する XML: +``` xml +123 +abc +``` + +前述の構文では、XMLテキストノードをXML属性としてYAMLで表現することはできません。この特殊なケースは、`#text` 属性キーを使用して実現できます: +```yaml +map_key: + "@attr1": value1 + "#text": value2 +``` + +対応する XML: +```xml +value2 +``` + +## 実装の詳細 {#implementation-details} + +各設定ファイルについて、サーバーは起動時に `file-preprocessed.xml` ファイルも生成します。これらのファイルは、すべての置換とオーバーライドが完了した状態を含んでおり、情報提供用に意図されています。設定ファイルでZooKeeperの置換が使用されているがサーバー起動時にZooKeeperが利用できない場合、サーバーは前処理済みファイルから設定をロードします。 + +サーバーは設定ファイルの変更や、置換やオーバーライドを行う際に使用されたファイルおよびZooKeeperノードを追跡し、ユーザーやクラスターの設定を自動でリロードします。これにより、サーバーを再起動せずにクラスターやユーザーの設定を変更することが可能です。 diff --git a/docs/ja/operations/external-authenticators/http.md b/docs/ja/operations/external-authenticators/http.md new file mode 100644 index 00000000000..aebcdc3df37 --- /dev/null +++ b/docs/ja/operations/external-authenticators/http.md @@ -0,0 +1,91 @@ +--- +slug: /ja/operations/external-authenticators/http +title: "HTTP" +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +HTTPサーバーは、ClickHouseユーザーの認証に使用できます。HTTP認証は、既存の`users.xml`やローカルアクセス制御パスで定義されたユーザーに対してのみ外部認証器として使用できます。現在、GETメソッドを使用する[Basic](https://datatracker.ietf.org/doc/html/rfc7617)認証方式がサポートされています。 + +## HTTP認証サーバーの定義 {#http-auth-server-definition} + +HTTP認証サーバーを定義するには、`config.xml`に`http_authentication_servers`セクションを追加する必要があります。 + +**例** +```xml + + + + + http://localhost:8000/auth + 1000 + 1000 + 1000 + 3 + 50 + 1000 + + + + +``` + +`http_authentication_servers`セクション内に異なる名前を使用して複数のHTTPサーバーを定義できます。 + +**パラメータ** +- `uri` - 認証リクエストを行うためのURI + +サーバーと通信するために使用されるソケットのミリ秒単位のタイムアウト: +- `connection_timeout_ms` - デフォルト: 1000 ms +- `receive_timeout_ms` - デフォルト: 1000 ms +- `send_timeout_ms` - デフォルト: 1000 ms + +リトライのパラメータ: +- `max_tries` - 認証リクエストを行う最大試行回数。デフォルト: 3 +- `retry_initial_backoff_ms` - リトライ時の初期バックオフ間隔。デフォルト: 50 ms +- `retry_max_backoff_ms` - 最大バックオフ間隔。デフォルト: 1000 ms + +### `users.xml`でのHTTP認証の有効化 {#enabling-http-auth-in-users-xml} + +ユーザーに対してHTTP認証を有効化するには、ユーザー定義で`password`や類似セクションの代わりに`http_authentication`セクションを指定します。 + +パラメータ: +- `server` - 主な`config.xml`ファイルで前述のように設定したHTTP認証サーバーの名前。 +- `scheme` - HTTP認証方式。現在は`Basic`のみサポートされています。デフォルト: Basic + +例 (`users.xml`に記述): +```xml + + + + + + basic_server + basic + + + +``` + +:::note +HTTP認証は他の認証メカニズムと併用することはできません。`http_authentication`と並んで`password`のような他のセクションが存在する場合、ClickHouseはシャットダウンします。 +::: + +### SQLを使用したHTTP認証の有効化 {#enabling-http-auth-using-sql} + +ClickHouseで[SQLによるアクセス制御とアカウント管理](/docs/ja/guides/sre/user-management/index.md#access-control)が有効になっている場合、HTTP認証で認識されたユーザーをSQL文を使用して作成することもできます。 + +```sql +CREATE USER my_user IDENTIFIED WITH HTTP SERVER 'basic_server' SCHEME 'Basic' +``` + +...もしくは、`scheme`を明示的に定義せずデフォルトの`Basic`を使用 + +```sql +CREATE USER my_user IDENTIFIED WITH HTTP SERVER 'basic_server' +``` + +### セッション設定の伝達 {#passing-session-settings} + +HTTP認証サーバーからの応答ボディがJSON形式で`settings`サブオブジェクトを持っている場合、ClickHouseはそのキー: 値ペアを文字列値として解析し、認証されたユーザーの現在のセッションの設定としてセットしようとします。解析が失敗した場合、サーバーからの応答ボディは無視されます。 diff --git a/docs/ja/operations/external-authenticators/index.md b/docs/ja/operations/external-authenticators/index.md new file mode 100644 index 00000000000..d6e44a92632 --- /dev/null +++ b/docs/ja/operations/external-authenticators/index.md @@ -0,0 +1,19 @@ +--- +slug: /ja/operations/external-authenticators/ +sidebar_position: 48 +sidebar_label: 外部ユーザー認証者とディレクトリ +title: "外部ユーザー認証者とディレクトリ" +pagination_next: 'en/operations/external-authenticators/kerberos' +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +ClickHouseは、外部サービスを使用してユーザーの認証と管理をサポートしています。 + +サポートされる外部認証者とディレクトリは以下の通りです: + +- [LDAP](./ldap.md#external-authenticators-ldap) [認証者](./ldap.md#ldap-external-authenticator) および [ディレクトリ](./ldap.md#ldap-external-user-directory) +- Kerberos [認証者](./kerberos.md#external-authenticators-kerberos) +- [SSL X.509 認証](./ssl-x509.md#ssl-external-authentication) +- HTTP [認証者](./http.md) diff --git a/docs/ja/operations/external-authenticators/kerberos.md b/docs/ja/operations/external-authenticators/kerberos.md new file mode 100644 index 00000000000..c5867efb56c --- /dev/null +++ b/docs/ja/operations/external-authenticators/kerberos.md @@ -0,0 +1,125 @@ +--- +slug: /ja/operations/external-authenticators/kerberos +--- +# Kerberos +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +既存で適切に設定されたClickHouseユーザーは、Kerberos認証プロトコルを通じて認証できます。 + +現在、Kerberosは既存ユーザーの外部認証装置としてのみ使用でき、そのユーザーは`users.xml`またはローカルアクセス制御経路で定義されます。これらのユーザーはHTTPリクエストしか使用できず、GSS-SPNEGOメカニズムを使用して認証できなければなりません。 + +このアプローチを取るには、システム内でKerberosが適切に設定され、ClickHouseの設定で有効にされている必要があります。 + +## ClickHouseでのKerberosの有効化 {#enabling-kerberos-in-clickhouse} + +Kerberosを有効にするには、`config.xml`に`kerberos`セクションを含める必要があります。このセクションには追加のパラメータを含めることができます。 + +#### パラメータ: + +- `principal` - セキュリティコンテキストを受け入れる際に取得および使用される正規のサービスプリンシパル名。 + - このパラメータは省略可能で、省略された場合はデフォルトのプリンシパルが使用されます。 + +- `realm` - 認証を、発信者のレルムが一致する要求に制限するために使用されるレルム。 + - このパラメータは省略可能で、省略された場合はレルムによる追加のフィルタリングは行われません。 + +- `keytab` - サービスのkeytabファイルへのパス。 + - このパラメータは省略可能で、省略された場合は、`KRB5_KTNAME`環境変数に設定されたサービスのkeytabファイルのパスを使用する必要があります。 + +例(`config.xml`に記述): + +```xml + + + + +``` + +プリンシパルを指定する場合: + +```xml + + + + HTTP/clickhouse.example.com@EXAMPLE.COM + + +``` + +レルムによるフィルタリングを行う場合: + +```xml + + + + EXAMPLE.COM + + +``` + +:::note +`kerberos`セクションは一つだけ定義可能です。複数の`kerberos`セクションが存在すると、ClickHouseはKerberos認証を無効にします。 +::: + +:::note +`principal`と`realm`セクションを同時に指定することはできません。両方のセクションを指定すると、ClickHouseはKerberos認証を無効にします。 +::: + +## 既存ユーザーの外部認証装置としてのKerberos {#kerberos-as-an-external-authenticator-for-existing-users} + +Kerberosは、ローカルに定義されたユーザー(`users.xml`またはローカルアクセス制御経路で定義されたユーザー)の識別を確認する方法として使用できます。現在、**HTTPインターフェース上の要求のみ**が*kerberized*(GSS-SPNEGOメカニズムを介して)されることが可能です。 + +Kerberosプリンシパル名の形式は通常、次のパターンに従います: + +- *primary/instance@REALM* + +*/instance*部分は0回以上発生することがあります。**認証が成功するためには、発信者の正規のプリンシパル名の*primary*部分がkerberizedユーザー名と一致する必要があります**。 + +### `users.xml`でのKerberos有効化 {#enabling-kerberos-in-users-xml} + +ユーザーに対してKerberos認証を有効にするには、ユーザー定義で`password`やそれに類似するセクションの代わりに`kerberos`セクションを指定します。 + +パラメータ: + +- `realm` - 認証を、発信者のレルムが一致する要求に制限するために使用されるレルム。 + - このパラメータは省略可能で、省略された場合はレルムによる追加のフィルタリングは行われません。 + +例(`users.xml`に記述): + +```xml + + + + + + + + EXAMPLE.COM + + + + +``` + +:::note +Kerberos認証は他の認証メカニズムと併用することはできません。`kerberos`と一緒に`password`のようなセクションが存在すると、ClickHouseは停止します。 +::: + +:::info Reminder +ユーザー`my_user`が`kerberos`を使用するようになった場合、前述の通り、メインの`config.xml`ファイルでKerberosを有効にする必要があります。 +::: + +### SQLを使用したKerberosの有効化 {#enabling-kerberos-using-sql} + +ClickHouseで[SQL駆動のアクセス制御とアカウント管理](/docs/ja/guides/sre/user-management/index.md#access-control)が有効な場合、Kerberosで識別されるユーザーもSQL文を使用して作成できます。 + +```sql +CREATE USER my_user IDENTIFIED WITH kerberos REALM 'EXAMPLE.COM' +``` + +レルムによるフィルタリングを行わない場合: + +```sql +CREATE USER my_user IDENTIFIED WITH kerberos +``` diff --git a/docs/ja/operations/external-authenticators/ldap.md b/docs/ja/operations/external-authenticators/ldap.md new file mode 100644 index 00000000000..586a9f08862 --- /dev/null +++ b/docs/ja/operations/external-authenticators/ldap.md @@ -0,0 +1,186 @@ +--- +slug: /ja/operations/external-authenticators/ldap +title: "LDAP" +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +LDAPサーバーはClickHouseユーザーの認証に使用できます。このために二つの異なるアプローチがあります: + +- 既存のユーザーに対して、`users.xml`やローカルアクセスコントロールパスに定義されているユーザーに対して、LDAPを外部認証器として使用する。 +- ローカルに定義されていないユーザーを、LDAPサーバー上に存在する場合に認証するため、LDAPを外部ユーザーディレクトリとして使用する。 + +これらのアプローチのどちらも、ClickHouseの設定内で他の部分が参照可能な内部名称のLDAPサーバーを定義する必要があります。 + +## LDAP サーバーの定義 {#ldap-server-definition} + +LDAPサーバーを定義するには、`config.xml`に`ldap_servers`セクションを追加する必要があります。 + +**例** + +```xml + + + + + + localhost + 636 + uid={user_name},ou=users,dc=example,dc=com + 300 + yes + tls1.2 + demand + /path/to/tls_cert_file + /path/to/tls_key_file + /path/to/tls_ca_cert_file + /path/to/tls_ca_cert_dir + ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384 + + + + + localhost + 389 + EXAMPLE\{user_name} + + CN=Users,DC=example,DC=com + (&(objectClass=user)(sAMAccountName={user_name})) + + no + + + +``` + +注意: `ldap_servers`セクション内で異なる名前を使用して複数のLDAPサーバーを定義できます。 + +**パラメーター** + +- `host` — LDAPサーバーのホスト名またはIP。このパラメーターは必須で空にはできません。 +- `port` — LDAPサーバーのポート。`enable_tls`が`true`に設定されている場合のデフォルトは`636`、それ以外の場合は`389`です。 +- `bind_dn` — バインドに使用されるDNを構築するためのテンプレート。 + - 各認証試行時に、テンプレート中のすべての`{user_name}`サブストリングは実際のユーザー名に置き換えられ、この結果得られたDNが構築されます。 +- `user_dn_detection` — バインドされたユーザーの実際のユーザーDNを検出するためのLDAP検索パラメータのセクション。 + - これは主にActive Directoryサーバーでのロールマッピングをさらに進めるための検索フィルタです。結果のユーザーDNは、許可される場所で`{user_dn}`サブストリングを置き換えるために使用されます。デフォルトでは、ユーザーDNはバインドDNと同等に設定されていますが、検索が行われた場合は、検出された実際のユーザーDNの値で更新されます。 + - `base_dn` — LDAP検索のためのベースDNを構築するためのテンプレート。 + - 実際のユーザー名とバインドDNでテンプレート中のすべての`{user_name}`および`{bind_dn}`サブストリングを置き換えることにより構築されます。 + - `scope` — LDAP検索のスコープ。 + - 許容値は: `base`, `one_level`, `children`, `subtree`(デフォルト)です。 + - `search_filter` — LDAP検索のための検索フィルタを構築するためのテンプレート。 + - LDAP検索中に実際のユーザー名、バインドDN、およびベースDNでテンプレート中の`{user_name}`、`{bind_dn}`、および`{base_dn}`サブストリングをすべて置き換えることにより構築されます。 + - 特殊文字はXMLで適切にエスケープされる必要があります。 +- `verification_cooldown` — 成功したバインド試行後、LDAPサーバーに接触せずに、すべての連続したリクエストでユーザーが成功したと見なされる秒数。 + - キャッシュを無効にして各認証要求でLDAPサーバーに接触を強制するには`0`(デフォルト)を指定します。 +- `enable_tls` — LDAPサーバーへのセキュアな接続を行うかどうかのフラグ。 + - プレーンテキストの`ldap://`プロトコルを指定するには`no`(推奨されません)。 + - SSL/TLSを介したLDAP `ldaps://`プロトコルを指定するには`yes`(推奨、デフォルト)を指定します。 + - レガシーのStartTLSプロトコル(プレーンテキストの`ldap://`プロトコルをTLSにアップグレード)を指定するには`starttls`を指定します。 +- `tls_minimum_protocol_version` — SSL/TLSの最小プロトコルバージョン。 + - 許容値は: `ssl2`, `ssl3`, `tls1.0`, `tls1.1`, `tls1.2`(デフォルト)です。 +- `tls_require_cert` — SSL/TLSピア証明書の検証動作。 + - 許容値は: `never`, `allow`, `try`, `demand`(デフォルト)です。 +- `tls_cert_file` — 証明書ファイルへのパス。 +- `tls_key_file` — 証明書キーのファイルパス。 +- `tls_ca_cert_file` — CA証明書ファイルへのパス。 +- `tls_ca_cert_dir` — CA証明書が含まれるディレクトリへのパス。 +- `tls_cipher_suite` — 許可される暗号スイート(OpenSSL表記で)。 + +## LDAP 外部認証器 {#ldap-external-authenticator} + +リモートLDAPサーバーを使用して、ローカルに定義されたユーザー(`users.xml`やローカルアクセスコントロールパスで定義されたユーザー)に対するパスワードを検証することができます。このためには、ユーザー定義の中の`password`や類似セクションの代わりに、前述のLDAPサーバー名を指定します。 + +各ログイン試行時に、ClickHouseは[LDAPサーバーの定義](#ldap-server-definition)に定義されている`bind_dn`パラメータで指定されたDNに、提供された資格情報を使用して「バインド」しようとし、成功した場合にはユーザーが認証されたと見なされます。これはしばしば単純バインドメソッドと呼ばれます。 + +**例** + +```xml + + + + + + + + my_ldap_server + + + + +``` + +注意: ユーザー`my_user`は`my_ldap_server`を参照しています。このLDAPサーバーは、前述のようにメインの`config.xml`ファイルに設定されていなければなりません。 + +SQL駆動の[アクセスコントロールとアカウント管理](/docs/ja/guides/sre/user-management/index.md#access-control)が有効になっている場合、LDAPサーバーによって認証されたユーザーは[CREATE USER](/docs/ja/sql-reference/statements/create/user.md#create-user-statement)文を使用して作成することもできます。 + +クエリ: + +```sql +CREATE USER my_user IDENTIFIED WITH ldap SERVER 'my_ldap_server'; +``` + +## LDAP 外部ユーザーディレクトリ {#ldap-external-user-directory} + +ローカルに定義されたユーザーに加えて、リモートLDAPサーバーをユーザー定義のソースとして使用することもできます。このためには、`config.xml`ファイルの`users_directories`セクション内の`ldap`セクションで、前述のLDAPサーバー名を指定します([LDAPサーバーの定義](#ldap-server-definition)を参照)。 + +各ログイン試行時に、ClickHouseはユーザー定義をローカルで見つけ、それを通常どおり認証しようとします。ユーザーが定義されていない場合、ClickHouseは外部LDAPディレクトリにその定義が存在すると仮定し、提供された資格情報でLDAPサーバーの指定されたDNに「バインド」しようとします。これに成功した場合、ユーザーは存在し、認証されたと見なされます。ユーザーには`roles`セクションで指定されたリストからロールが割り当てられます。さらに、LDAP「検索」が実行され、その結果を役割名として変換し、`role_mapping`セクションも設定されている場合にはユーザーに割り当てることもできます。これらはすべて、SQL駆動の[アクセスコントロールとアカウント管理](/docs/ja/guides/sre/user-management/index.md#access-control)が有効になっており、[CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md#create-role-statement)ステートメントを使用してロールが作成されていることを前提としています。 + +**例** + +`config.xml`に入ります。 + +```xml + + + + + + my_ldap_server + + + + + + ou=groups,dc=example,dc=com + subtree + (&(objectClass=groupOfNames)(member={bind_dn})) + cn + clickhouse_ + + + + + + my_ad_server + + CN=Users,DC=example,DC=com + CN + subtree + (&(objectClass=group)(member={user_dn})) + clickhouse_ + + + + +``` + +注意: `user_directories`セクション内の`ldap`セクションで参照されている`my_ldap_server`は、前述のように`config.xml`で設定された事前に定義されたLDAPサーバーでなければなりません([LDAPサーバーの定義](#ldap-server-definition)を参照)。 + +**パラメーター** + +- `server` — 上記の`ldap_servers`構成セクションで定義されたLDAPサーバー名の1つ。このパラメーターは必須で、空にすることはできません。 +- `roles` — LDAPサーバーから取得した各ユーザーに割り当てられる、ローカルに定義されたロールのリストを含むセクション。 + - ここで指定されたロールがない場合、または下記のロールマッピング中に割り当てられたロールがない場合、ユーザーは認証後にいかなる操作も行うことができません。 +- `role_mapping` — LDAP検索パラメーターとマッピングルールを持つセクション。 + - ユーザーが認証される際、LDAPにバインドされたまま、`search_filter`とログインしたユーザーの名前を使用してLDAP検索が実行されます。その検索中に見つかった各エントリに対して、指定された属性の値が抽出されます。指定されたプレフィックスを持つ各属性値について、プレフィックスが削除され、結果の値がClickHouseで定義されたローカルロールの名前になります。これは[CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md#create-role-statement)ステートメントで事前に作成されていることが期待されます。 + - 同じ`ldap`セクション内に複数の`role_mapping`セクションを定義することができます。それらはすべて適用されます。 + - `base_dn` — LDAP検索のためのベースDNを構築するためのテンプレート。 + - LDAP検索中に実際のユーザー名、バインドDN、およびユーザーDNでテンプレート中の`{user_name}`、`{bind_dn}`、および`{user_dn}`サブストリングをすべて置き換えることにより構築されます。 + - `scope` — LDAP検索のスコープ。 + - 許容値は: `base`, `one_level`, `children`, `subtree`(デフォルト)です。 + - `search_filter` — LDAP検索のための検索フィルタを構築するためのテンプレート。 + - LDAP検索中に実際のユーザー名、バインドDN、ユーザーDN、およびベースDNでテンプレート中の`{user_name}`、`{bind_dn}`、`{user_dn}`、および`{base_dn}`サブストリングをすべて置き換えることにより構築されます。 + - 特殊文字はXMLで適切にエスケープされる必要があります。 + - `attribute` — LDAP検索によって返される値を持つ属性名。デフォルトでは`cn`です。 + - `prefix` — LDAP検索によって返される元の文字列リストの各文字列の前に存在すると予想されるプレフィックス。プレフィックスは元の文字列から削除され、その結果得られた文字列はローカルロール名として扱われます。デフォルトでは空です。 diff --git a/docs/ja/operations/external-authenticators/ssl-x509.md b/docs/ja/operations/external-authenticators/ssl-x509.md new file mode 100644 index 00000000000..6aa7a059596 --- /dev/null +++ b/docs/ja/operations/external-authenticators/ssl-x509.md @@ -0,0 +1,43 @@ +--- +slug: /ja/operations/external-authenticators/ssl-x509 +title: "SSL X.509証明書認証" +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +[SSL 'strict' オプション](../server-configuration-parameters/settings.md#openssl)は、受信接続に対する証明書の厳格な検証を有効にします。この場合、信頼された証明書を持つ接続のみが確立され、信頼されていない証明書の接続は拒否されます。したがって、証明書の検証により、受信接続を一意に認証することが可能となります。証明書の`Common Name`あるいは`subjectAltName extension`フィールドを用いて、接続されたユーザーを識別します。`subjectAltName extension`はサーバー設定でワイルドカード '*' の使用をサポートしています。これにより、複数の証明書を同じユーザーに関連付けることが可能です。さらに、証明書の再発行および失効はClickHouseの設定に影響を与えません。 + +SSL証明書認証を有効にするには、各ClickHouseユーザーに対応した`Common Name`または`Subject Alt Name`のリストを設定ファイル`users.xml`に指定する必要があります。 + +**例** +```xml + + + + + + host.domain.com:example_user + host.domain.com:example_user_dev + + + + + + + DNS:host.domain.com + + + + + + + + URI:spiffe://foo.com/*/bar + + + + +``` + +SSLの[`信頼の連鎖`](https://en.wikipedia.org/wiki/Chain_of_trust)を正しく機能させるためには、[`caConfig`](../server-configuration-parameters/settings.md#openssl)パラメータが適切に設定されていることを確認することも重要です。 diff --git a/docs/ja/operations/monitoring.md b/docs/ja/operations/monitoring.md new file mode 100644 index 00000000000..e13ee4de999 --- /dev/null +++ b/docs/ja/operations/monitoring.md @@ -0,0 +1,68 @@ +--- +slug: /ja/operations/monitoring +sidebar_position: 45 +sidebar_label: 監視 +description: ハードウェアリソースの利用状況とClickHouseサーバーメトリクスを監視できます。 +keywords: [監視, 観測性, 高度なダッシュボード, ダッシュボード, 観測性ダッシュボード] +--- + +# 監視 +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + + + +監視できる内容: + +- ハードウェアリソースの利用状況。 +- ClickHouseサーバーメトリクス。 + +## 組み込みの高度な観測性ダッシュボード + +Screenshot 2023-11-12 at 6 08 58 PM + +ClickHouseには組み込みの高度な観測性ダッシュボード機能があり、`$HOST:$PORT/dashboard`(ユーザーとパスワードが必要)でアクセスできます。このダッシュボードでは以下のメトリクスを表示します: +- クエリ数/秒 +- CPU使用率 (コア) +- 実行中のクエリ +- 実行中マージ +- 選択されたバイト/秒 +- IO待機 +- CPU待機 +- OS CPU使用率 (ユーザースペース) +- OS CPU使用率 (カーネル) +- ディスクからの読み込み +- ファイルシステムからの読み込み +- メモリ(トラッキング済み) +- 挿入された行数/秒 +- 合計MergeTreeパーツ +- パーティションごとの最大パーツ + +## リソース利用状況 {#resource-utilization} + +ClickHouseはハードウェアリソースの状態を自動で監視します。例えば以下のようなものがあります: + +- プロセッサの負荷と温度。 +- ストレージシステム、RAM、ネットワークの利用状況。 + +このデータは`system.asynchronous_metric_log`テーブルに収集されます。 + +## ClickHouseサーバーメトリクス {#clickhouse-server-metrics} + +ClickHouseサーバーには自己状態監視用の組み込み計器があります。 + +サーバーイベントを追跡するには、サーバーログを使用します。設定ファイルの[logger](../operations/server-configuration-parameters/settings.md#logger)セクションを参照してください。 + +ClickHouseでは以下を収集します: + +- サーバーが計算リソースを使用する際のさまざまなメトリクス。 +- クエリ処理に関する一般的な統計。 + +メトリクスは[system.metrics](../operations/system-tables/metrics.md#system_tables-metrics)、[system.events](../operations/system-tables/events.md#system_tables-events)、および[system.asynchronous_metrics](../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics)テーブルにあります。 + +ClickHouseを[Graphite](https://github.com/graphite-project)にメトリクスをエクスポートするよう設定できます。ClickHouseサーバーの構成ファイルの[Graphiteセクション](../operations/server-configuration-parameters/settings.md#graphite)を参照してください。メトリクスのエクスポートを設定する前に、公式[ガイド](https://graphite.readthedocs.io/en/latest/install.html)に従ってGraphiteをセットアップする必要があります。 + +ClickHouseを[Prometheus](https://prometheus.io)にメトリクスをエクスポートするよう設定できます。ClickHouseサーバーの構成ファイルの[Prometheusセクション](../operations/server-configuration-parameters/settings.md#prometheus)を参照してください。メトリクスのエクスポートを設定する前に、Prometheusの公式[ガイド](https://prometheus.io/docs/prometheus/latest/installation/)に従ってセットアップする必要があります。 + +さらに、HTTP APIを通じてサーバーの可用性を監視できます。`/ping`に`HTTP GET`リクエストを送信すると、サーバーが利用可能であれば`200 OK`が返されます。 + +クラスター構成でサーバーを監視するには、[max_replica_delay_for_distributed_queries](../operations/settings/settings.md#max_replica_delay_for_distributed_queries)パラメータを設定し、HTTPリソース`/replicas_status`を使用する必要があります。`/replicas_status`へのリクエストは、レプリカが利用可能で他のレプリカより遅れていない場合、`200 OK`を返します。レプリカが遅れている場合は、遅延に関する情報を含む`503 HTTP_SERVICE_UNAVAILABLE`を返します。 diff --git a/docs/ja/operations/named-collections.md b/docs/ja/operations/named-collections.md new file mode 100644 index 00000000000..2390554286a --- /dev/null +++ b/docs/ja/operations/named-collections.md @@ -0,0 +1,533 @@ +--- +slug: /ja/operations/named-collections +sidebar_position: 69 +sidebar_label: "Named collections" +title: "Named collections" +--- + +import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; + + + +Named collectionsは外部ソースとの統合を構成するためのキー・バリューのペアのコレクションを保存する方法を提供します。Dictionary、テーブル、テーブル関数、およびオブジェクトストレージでNamed collectionsを使用できます。 + +Named collectionsはDDLまたは構成ファイルで構成可能で、ClickHouse起動時に適用されます。オブジェクトの作成を簡素化し、管理アクセス権のないユーザーから資格情報を隠すことができます。 + +Named collectionのキーは、対応する関数、テーブルエンジン、データベースなどのパラメータ名と一致する必要があります。以下の例では、各タイプにリンクされたパラメータリストがあります。 + +Named collectionで設定されたパラメータはSQLで上書き可能であることが、以下の例で示されています。この機能は`[NOT] OVERRIDABLE`キーワードおよびXML属性、または構成オプション`allow_named_collection_override_by_default`を使用して制限できます。 + +:::warning +上書きを許可すると、管理アクセス権のないユーザーが隠そうとしている資格情報を推測する可能性があります。 +Named collectionsをその目的で使用している場合、`allow_named_collection_override_by_default`(デフォルトで有効)は無効にしてください。 +::: + +## システムデータベースでのNamed collectionsの保存 + +### DDL例 + +```sql +CREATE NAMED COLLECTION name AS +key_1 = 'value' OVERRIDABLE, +key_2 = 'value2' NOT OVERRIDABLE, +url = 'https://connection.url/' +``` + +上記の例では: + + * `key_1`は常に上書き可能です。 + * `key_2`は上書きできません。 + * `url`は、`allow_named_collection_override_by_default`の値に応じて上書き可能です。 + +### DDLを使用したNamed collections作成のための権限 + +DDLによってNamed collectionsを管理するには、ユーザーが`named_collection_control`特権を持っている必要があります。これを割り当てるには、`/etc/clickhouse-server/users.d/`にファイルを追加します。以下の例では、ユーザー`default`に`access_management`および`named_collection_control`の両方の特権を与えています: + +```xml title='/etc/clickhouse-server/users.d/user_default.xml' + + + + 65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5 + 1 + + 1 + + + + +``` + +:::tip +上記の例では、`password_sha256_hex`の値はパスワードのSHA256ハッシュの16進数表現です。この設定では、ユーザー`default`の`replace=true`属性があります。そのため、デフォルト設定ではプレーンテキストの`password`が設定されており、プレーンテキストとsha256 hexの両方のパスワードを1人のユーザーに設定することはできません。 +::: + +### Named collectionsの保存 + +Named collectionsは、ローカルディスクまたはZooKeeper/Keeperに保存できます。デフォルトではローカルストレージが使用されます。 +また、[disk encryption](storing-data#encrypted-virtual-file-system)で使用されるのと同じアルゴリズムで暗号化して保存することもできます。デフォルトでは`aes_128_ctr`が使用されます。 + +Named collectionsのストレージを構成するには、`type`を指定する必要があります。これは`local`または`keeper`/`zookeeper`のいずれかです。暗号化されたストレージの場合、`local_encrypted`または`keeper_encrypted`/`zookeeper_encrypted`を使用できます。 + +ZooKeeper/Keeperを使用するには、ZooKeeper/KeeperでNamed collectionsが保存されるパスである`path`を設定する必要があります。以下の例では、暗号化とZooKeeper/Keeperを使用しています: +``` + + + zookeeper_encrypted + bebec0cabebec0cabebec0cabebec0ca + aes_128_ctr + /named_collections_path/ + 1000 + + +``` + +オプションの構成パラメータである`update_timeout_ms`のデフォルトは`5000`です。 + +## 構成ファイルでのNamed collectionsの保存 + +### XML例 + +```xml title='/etc/clickhouse-server/config.d/named_collections.xml' + + + + value + value_2 + https://connection.url/ + + + +``` + +上記の例では: + + * `key_1`は常に上書き可能です。 + * `key_2`は上書きできません。 + * `url`は、`allow_named_collection_override_by_default`の値に応じて上書き可能です。 + +## Named collectionsの修正 + +DDLクエリで作成されたNamed collectionsは、DDLを使用して変更または削除できます。XMLファイルで作成されたNamed collectionsは、対応するXMLを編集または削除して管理できます。 + +### DDL Named collectionの変更 + +コレクション`collection2`のキー`key1`と`key3`を変更または追加します +(これにより、そのキーの`overridable`フラグの値は変更されません): +```sql +ALTER NAMED COLLECTION collection2 SET key1=4, key3='value3' +``` + +キー`key1`を変更または追加し、常に上書き可能にします: +```sql +ALTER NAMED COLLECTION collection2 SET key1=4 OVERRIDABLE +``` + +コレクション`collection2`からキー`key2`を削除します: +```sql +ALTER NAMED COLLECTION collection2 DELETE key2 +``` + +コレクション`collection2`のキー`key1`を変更または追加し、キー`key3`を削除します: +```sql +ALTER NAMED COLLECTION collection2 SET key1=4, DELETE key3 +``` + +`overridable`フラグのデフォルト設定を使用するようにキーを強制するには、キーを削除して再追加する必要があります。 +```sql +ALTER NAMED COLLECTION collection2 DELETE key1; +ALTER NAMED COLLECTION collection2 SET key1=4; +``` + +### DDL Named collection `collection2`の削除: +```sql +DROP NAMED COLLECTION collection2 +``` + +## S3へのアクセスのためのNamed collections + +パラメータの説明は[s3 Table Function](../sql-reference/table-functions/s3.md)を参照してください。 + +### DDL例 + +```sql +CREATE NAMED COLLECTION s3_mydata AS +access_key_id = 'AKIAIOSFODNN7EXAMPLE', +secret_access_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', +format = 'CSV', +url = 'https://s3.us-east-1.amazonaws.com/yourbucket/mydata/' +``` + +### XML例 + +```xml + + + + AKIAIOSFODNN7EXAMPLE + wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + CSV + https://s3.us-east-1.amazonaws.com/yourbucket/mydata/ + + + +``` + +### s3()関数とS3テーブルのNamed collection例 + +以下の例はどちらも同じNamed collection `s3_mydata`を使用しています: + +#### s3()関数 + +```sql +INSERT INTO FUNCTION s3(s3_mydata, filename = 'test_file.tsv.gz', + format = 'TSV', structure = 'number UInt64', compression_method = 'gzip') +SELECT * FROM numbers(10000); +``` + +:::tip +上記の`s3()`関数の最初の引数はコレクション名、`s3_mydata`です。Named collectionsがなければ、アクセスキーID、シークレット、フォーマット、URLを`s3()`関数への各呼び出しで渡す必要があります。 +::: + +#### S3テーブル + +```sql +CREATE TABLE s3_engine_table (number Int64) +ENGINE=S3(s3_mydata, url='https://s3.us-east-1.amazonaws.com/yourbucket/mydata/test_file.tsv.gz', format = 'TSV') +SETTINGS input_format_with_names_use_header = 0; + +SELECT * FROM s3_engine_table LIMIT 3; +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +└────────┘ +``` + +## MySQLデータベースへのアクセスのためのNamed collections + +パラメータの説明は[mysql](../sql-reference/table-functions/mysql.md)を参照してください。 + +### DDL例 + +```sql +CREATE NAMED COLLECTION mymysql AS +user = 'myuser', +password = 'mypass', +host = '127.0.0.1', +port = 3306, +database = 'test', +connection_pool_size = 8, +replace_query = 1 +``` + +### XML例 + +```xml + + + + myuser + mypass + 127.0.0.1 + 3306 + test + 8 + 1 + + + +``` + +### mysql()関数、MySQLテーブル、MySQLデータベース、およびDictionaryのNamed collection例 + +以下の4つの例は、すべて同じNamed collection `mymysql`を使用しています: + +#### mysql()関数 + +```sql +SELECT count() FROM mysql(mymysql, table = 'test'); + +┌─count()─┐ +│ 3 │ +└─────────┘ +``` +:::note +Named collectionは`table`パラメータを指定していないため、関数呼び出しで`table = 'test'`として指定されています。 +::: + +#### MySQLテーブル + +```sql +CREATE TABLE mytable(A Int64) ENGINE = MySQL(mymysql, table = 'test', connection_pool_size=3, replace_query=0); +SELECT count() FROM mytable; + +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +:::note +DDLがconnection_pool_sizeのNamed collection設定を上書きします。 +::: + +#### MySQLデータベース + +```sql +CREATE DATABASE mydatabase ENGINE = MySQL(mymysql); + +SHOW TABLES FROM mydatabase; + +┌─name───┐ +│ source │ +│ test │ +└────────┘ +``` + +#### MySQL Dictionary + +```sql +CREATE DICTIONARY dict (A Int64, B String) +PRIMARY KEY A +SOURCE(MYSQL(NAME mymysql TABLE 'source')) +LIFETIME(MIN 1 MAX 2) +LAYOUT(HASHED()); + +SELECT dictGet('dict', 'B', 2); + +┌─dictGet('dict', 'B', 2)─┐ +│ two │ +└─────────────────────────┘ +``` + +## PostgreSQLデータベースへのアクセスのためのNamed collections + +パラメータの説明は[postgresql](../sql-reference/table-functions/postgresql.md)を参照してください。さらに、以下のエイリアスがあります: + +- `username`は`user`のエイリアス +- `db`は`database`のエイリアス + +パラメータ`addresses_expr`は、コレクション内で`host:port`の代わりに使用されます。パラメータはオプションであり、他のオプションもあります:`host`、`hostname`、`port`。以下の疑似コードは優先順位を説明します: + +```sql +CASE + WHEN collection['addresses_expr'] != '' THEN collection['addresses_expr'] + WHEN collection['host'] != '' THEN collection['host'] || ':' || if(collection['port'] != '', collection['port'], '5432') + WHEN collection['hostname'] != '' THEN collection['hostname'] || ':' || if(collection['port'] != '', collection['port'], '5432') +END +``` + +作成例: +```sql +CREATE NAMED COLLECTION mypg AS +user = 'pguser', +password = 'jw8s0F4', +host = '127.0.0.1', +port = 5432, +database = 'test', +schema = 'test_schema' +``` + +構成例: +```xml + + + + pguser + jw8s0F4 + 127.0.0.1 + 5432 + test + test_schema + + + +``` + +### postgresql関数でのNamed collectionsの使用例 + +```sql +SELECT * FROM postgresql(mypg, table = 'test'); + +┌─a─┬─b───┐ +│ 2 │ two │ +│ 1 │ one │ +└───┴─────┘ + + +SELECT * FROM postgresql(mypg, table = 'test', schema = 'public'); + +┌─a─┐ +│ 1 │ +│ 2 │ +│ 3 │ +└───┘ +``` + +### エンジンPostgreSQLを使用したデータベースでのNamed collectionsの使用例 + +```sql +CREATE TABLE mypgtable (a Int64) ENGINE = PostgreSQL(mypg, table = 'test', schema = 'public'); + +SELECT * FROM mypgtable; + +┌─a─┐ +│ 1 │ +│ 2 │ +│ 3 │ +└───┘ +``` + +:::note +PostgreSQLはテーブル作成時にNamed collectionからデータをコピーします。コレクションの変更は既存のテーブルに影響を与えません。 +::: + +### エンジンPostgreSQLを使用したデータベースでのNamed collectionsの使用例 + +```sql +CREATE DATABASE mydatabase ENGINE = PostgreSQL(mypg); + +SHOW TABLES FROM mydatabase + +┌─name─┐ +│ test │ +└──────┘ +``` + +### ソースPOSTGRESQLを使用したDictionaryでのNamed collectionsの使用例 + +```sql +CREATE DICTIONARY dict (a Int64, b String) +PRIMARY KEY a +SOURCE(POSTGRESQL(NAME mypg TABLE test)) +LIFETIME(MIN 1 MAX 2) +LAYOUT(HASHED()); + +SELECT dictGet('dict', 'b', 2); + +┌─dictGet('dict', 'b', 2)─┐ +│ two │ +└─────────────────────────┘ +``` + +## リモートClickHouseデータベースへのアクセスのためのNamed collections + +パラメータの説明は[remote](../sql-reference/table-functions/remote.md/#parameters)を参照してください。 + +構成例: + +```sql +CREATE NAMED COLLECTION remote1 AS +host = 'remote_host', +port = 9000, +database = 'system', +user = 'foo', +password = 'secret', +secure = 1 +``` + +```xml + + + + remote_host + 9000 + system + foo + secret + 1 + + + +``` +`secure`は接続に必要ありませんが、dictionariesに使用できます。 + +### `remote`/`remoteSecure`関数でのNamed collectionsの使用例 + +```sql +SELECT * FROM remote(remote1, table = one); +┌─dummy─┐ +│ 0 │ +└───────┘ + +SELECT * FROM remote(remote1, database = merge(system, '^one')); +┌─dummy─┐ +│ 0 │ +└───────┘ + +INSERT INTO FUNCTION remote(remote1, database = default, table = test) VALUES (1,'a'); + +SELECT * FROM remote(remote1, database = default, table = test); +┌─a─┬─b─┐ +│ 1 │ a │ +└───┴───┘ +``` + +### ソースClickHouseを使用したDictionaryでのNamed collectionsの使用例 + +```sql +CREATE DICTIONARY dict(a Int64, b String) +PRIMARY KEY a +SOURCE(CLICKHOUSE(NAME remote1 TABLE test DB default)) +LIFETIME(MIN 1 MAX 2) +LAYOUT(HASHED()); + +SELECT dictGet('dict', 'b', 1); +┌─dictGet('dict', 'b', 1)─┐ +│ a │ +└─────────────────────────┘ +``` + +## KafkaへのアクセスのためのNamed collections + +パラメータの説明は[Kafka](../engines/table-engines/integrations/kafka.md)を参照してください。 + +### DDL例 + +```sql +CREATE NAMED COLLECTION my_kafka_cluster AS +kafka_broker_list = 'localhost:9092', +kafka_topic_list = 'kafka_topic', +kafka_group_name = 'consumer_group', +kafka_format = 'JSONEachRow', +kafka_max_block_size = '1048576'; + +``` +### XML例 + +```xml + + + + localhost:9092 + kafka_topic + consumer_group + JSONEachRow + 1048576 + + + +``` + +### KafkaテーブルでのNamed collectionsの使用例 + +以下の例はどちらも同じNamed collection `my_kafka_cluster`を使用しています: + +```sql +CREATE TABLE queue +( + timestamp UInt64, + level String, + message String +) +ENGINE = Kafka(my_kafka_cluster) + +CREATE TABLE queue +( + timestamp UInt64, + level String, + message String +) +ENGINE = Kafka(my_kafka_cluster) +SETTINGS kafka_num_consumers = 4, + kafka_thread_per_consumer = 1; +``` diff --git a/docs/ja/operations/opentelemetry.md b/docs/ja/operations/opentelemetry.md new file mode 100644 index 00000000000..44325596c16 --- /dev/null +++ b/docs/ja/operations/opentelemetry.md @@ -0,0 +1,67 @@ +--- +slug: /ja/operations/opentelemetry +sidebar_position: 62 +sidebar_label: OpenTelemetryでClickHouseをトレースする +title: "OpenTelemetryでClickHouseをトレースする" +--- + +[OpenTelemetry](https://opentelemetry.io/)は、分散アプリケーションからトレースやメトリクスを収集するためのオープン標準です。ClickHouseはOpenTelemetryをサポートしています。 + +## ClickHouseへのトレースコンテキストの提供 + +ClickHouseは、[W3Cの勧告](https://www.w3.org/TR/trace-context/)で説明されているトレースコンテキストHTTPヘッダーを受け入れます。また、ClickHouseサーバー間やクライアントとサーバー間で通信するために使用されるネイティブプロトコルを介してトレースコンテキストを受け入れます。手動テストのために、`clickhouse-client`に対して`--opentelemetry-traceparent`および`--opentelemetry-tracestate`フラグを使用してトレースコンテキストのヘッダーを指定することができます。 + +提供されたトレースコンテキストがW3C標準に準拠していないか、トレースコンテキストが提供されていない場合、ClickHouseは[opentelemetry_start_trace_probability](../operations/settings/settings.md#opentelemetry-start-trace-probability)設定で制御される確率で新しいトレースを開始できます。 + +## トレースコンテキストの伝播 + +トレースコンテキストは以下のケースで下流サービスに伝播されます: + +* [分散テーブル](../engines/table-engines/special/distributed.md)エンジンを使用する際のリモートのClickHouseサーバーへのクエリ。 + +* [url](../sql-reference/table-functions/url.md)テーブル関数。トレースコンテキスト情報はHTTPヘッダーに送信されます。 + +## ClickHouse自体のトレース + +ClickHouseは各クエリおよびクエリの実行ステージ(クエリプランニングや分散クエリなど)ごとに`トレーススパン`を作成します。 + +トレース情報を有用にするには、OpenTelemetryをサポートする監視システム(例えば、[Jaeger](https://jaegertracing.io/)や[Prometheus](https://prometheus.io/))にエクスポートする必要があります。ClickHouseは特定の監視システムへの依存を避けるため、システムテーブルを介してトレースデータを提供するだけです。OpenTelemetryのトレーススパン情報は、[標準で要求される情報](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/overview.md#span)が[system.opentelemetry_span_log](../operations/system-tables/opentelemetry_span_log.md)テーブルに格納されます。 + +このテーブルはサーバー構成で有効にする必要があります。デフォルトの構成ファイル`config.xml`の`opentelemetry_span_log`要素を参照してください。デフォルトでは有効になっています。 + +タグや属性はキーと値を含む2つの並列配列として保存されます。それらを操作するには[ARRAY JOIN](../sql-reference/statements/select/array-join.md)を使用します。 + +## Log-query-settings + +[log_query_settings](settings/settings.md)設定を使用すると、クエリ実行中にクエリ設定の変更をログに記録できます。有効にすると、クエリ設定に加えられた変更がOpenTelemetryスパンログに記録されます。この機能は、クエリパフォーマンスに影響を与える可能性のある設定変更を追跡するために、特に本番環境で便利です。 + +## 監視システムとの統合 + +現在、ClickHouseから監視システムへのトレースデータをエクスポートするための準備されたツールはありません。 + +テストのために、[system.opentelemetry_span_log](../operations/system-tables/opentelemetry_span_log.md)テーブルを使用して、[URL](../engines/table-engines/special/url.md)エンジンを使用したマテリアライズドビューをセットアップすることでエクスポートすることが可能です。これにより、到着したログデータをトレースコレクタのHTTPエンドポイントにプッシュします。例えば、`http://localhost:9411`で実行されているZipkinのインスタンスに、Zipkin v2 JSON形式で最小限のスパンデータをプッシュするには、次のようにします。 + +```sql +CREATE MATERIALIZED VIEW default.zipkin_spans +ENGINE = URL('http://127.0.0.1:9411/api/v2/spans', 'JSONEachRow') +SETTINGS output_format_json_named_tuples_as_objects = 1, + output_format_json_array_of_rows = 1 AS +SELECT + lower(hex(trace_id)) AS traceId, + case when parent_span_id = 0 then '' else lower(hex(parent_span_id)) end AS parentId, + lower(hex(span_id)) AS id, + operation_name AS name, + start_time_us AS timestamp, + finish_time_us - start_time_us AS duration, + cast(tuple('clickhouse'), 'Tuple(serviceName text)') AS localEndpoint, + cast(tuple( + attribute.values[indexOf(attribute.names, 'db.statement')]), + 'Tuple("db.statement" text)') AS tags +FROM system.opentelemetry_span_log +``` + +エラーが発生した場合、エラーが発生したログデータの一部は静かに失われます。データが届かない場合は、サーバーログでエラーメッセージを確認してください。 + +## 関連コンテンツ + +- ブログ: [ClickHouseでの観測性ソリューションの構築 - パート2 - トレース](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) diff --git a/docs/ja/operations/optimizing-performance/profile-guided-optimization.md b/docs/ja/operations/optimizing-performance/profile-guided-optimization.md new file mode 100644 index 00000000000..84b07d3ec99 --- /dev/null +++ b/docs/ja/operations/optimizing-performance/profile-guided-optimization.md @@ -0,0 +1,25 @@ +--- +sidebar_position: 54 +sidebar_label: プロファイルガイド最適化 (PGO) +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + +# プロファイルガイド最適化 + +プロファイルガイド最適化(PGO)は、プログラムの実行時プロファイルに基づいて最適化を行うコンパイラの最適化技術です。 + +テストによれば、PGOはClickHouseのパフォーマンス向上に役立ちます。テストによると、ClickBenchテストスイートでQPSが最大15%向上します。より詳細な結果は[こちら](https://pastebin.com/xbue3HMU)にあります。パフォーマンスの利点は、通常のワークロードに依存しますので、結果は良くも悪くもなります。 + +ClickHouseにおけるPGOの詳細については、関連するGitHubの[課題](https://github.com/ClickHouse/ClickHouse/issues/44567)をご覧ください。 + +## PGOを使用してClickHouseをビルドするには? + +PGOには主に2つの種類があります:[インストルメンテーション](https://clang.llvm.org/docs/UsersManual.html#using-sampling-profilers)と[サンプリング](https://clang.llvm.org/docs/UsersManual.html#using-sampling-profilers)(AutoFDOとも呼ばれます)。このガイドでは、ClickHouseにおけるインストルメンテーションPGOについて説明します。 + +1. インストルメントモードでClickHouseをビルドします。Clangでは、`CXXFLAGS`に`-fprofile-generate`オプションを渡すことで実行できます。 +2. サンプルワークロードでインストルメントされたClickHouseを実行します。ここでは、通常のワークロードを使用する必要があります。アプローチの一つとして、サンプルワークロードとして[ClickBench](https://github.com/ClickHouse/ClickBench)を使用することが考えられます。インストルメンテーションモードのClickHouseは動作が遅いかもしれないので、それに備えて、パフォーマンスが重要な環境では実行しないでください。 +3. 前のステップで収集したプロファイルを使用して、`-fprofile-use`コンパイラフラグを用いて再度ClickHouseをコンパイルします。 + +PGOの適用方法についての詳細なガイドは、Clangの[ドキュメント](https://clang.llvm.org/docs/UsersManual.html#profile-guided-optimization)にあります。 + +生産環境から直接サンプルワークロードを収集する場合は、サンプリングPGOの使用を試みることをお勧めします。 diff --git a/docs/ja/operations/optimizing-performance/sampling-query-profiler.md b/docs/ja/operations/optimizing-performance/sampling-query-profiler.md new file mode 100644 index 00000000000..e3f0f358dcf --- /dev/null +++ b/docs/ja/operations/optimizing-performance/sampling-query-profiler.md @@ -0,0 +1,77 @@ +--- +slug: /ja/operations/optimizing-performance/sampling-query-profiler +sidebar_position: 54 +sidebar_label: クエリプロファイリング +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + +# サンプリングクエリプロファイラー + +ClickHouseは、クエリ実行を分析するためのサンプリングプロファイラーを実行します。プロファイラーを使用すると、クエリ実行中に最も頻繁に使用されるソースコードルーチンを特定できます。CPU時間およびアイドル時間を含む壁時計時間をトレースできます。 + +クエリプロファイラーはClickHouse Cloudで自動的に有効化されており、以下のようにサンプルクエリを実行することができます。 + +:::note 以下のクエリをClickHouse Cloudで実行する場合は、クラスタの全ノードから選択するために`FROM system.trace_log`を`FROM clusterAllReplicas(default, system.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 +SETTINGS allow_introspection_functions = 1 +``` + +セルフマネージドのデプロイメント環境でクエリプロファイラーを使用するには: + +- サーバー設定の[trace_log](../../operations/server-configuration-parameters/settings.md#trace_log)セクションをセットアップします。 + + このセクションは、プロファイラーの動作結果を含む[trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log)システムテーブルを設定します。これはデフォルトで設定されています。このテーブルのデータは実行中のサーバーに対してのみ有効であり、サーバーが再起動すると、ClickHouseはテーブルをクリアせず、すべての保存された仮想メモリアドレスが無効になる可能性があります。 + +- [query_profiler_cpu_time_period_ns](../../operations/settings/settings.md#query_profiler_cpu_time_period_ns) または [query_profiler_real_time_period_ns](../../operations/settings/settings.md#query_profiler_real_time_period_ns)設定をセットアップします。これらの設定は同時に使用可能です。 + + これらの設定により、プロファイラーのタイマーを構成できます。セッション設定なので、サーバー全体、個々のユーザーまたはユーザープロファイル、インタラクティブなセッション、および各個別のクエリに対して異なるサンプリング頻度を得ることができます。 + +デフォルトのサンプリング頻度は1秒ごとのサンプルで、CPUタイマーと実時間タイマーの両方が有効です。この頻度により、ClickHouseクラスタに関する十分な情報を収集できます。同時に、この頻度で作業する場合、プロファイラーはClickHouseサーバーのパフォーマンスに影響を与えません。各個別のクエリをプロファイルする必要がある場合は、より高いサンプリング頻度を試してください。 + +`trace_log`システムテーブルを分析するには: + +- `clickhouse-common-static-dbg`パッケージをインストールします。[DEBパッケージからのインストール](../../getting-started/install.md#install-from-deb-packages)を参照してください。 + +- [allow_introspection_functions](../../operations/settings/settings.md#allow_introspection_functions)設定により内省関数を許可します。 + + セキュリティ上の理由から、内省関数はデフォルトで無効になっています。 + +- `addressToLine`、`addressToLineWithInlines`、`addressToSymbol`、および`demangle` [内省関数](../../sql-reference/functions/introspection.md)を使用して、ClickHouseコード内の関数名とその位置を取得します。特定のクエリのプロファイルを取得するには、`trace_log`テーブルからデータを集約する必要があります。個別の関数やスタックトレース全体でデータを集約することができます。 + +`trace_log`情報を視覚化する必要がある場合は、[flamegraph](../../interfaces/third-party/gui.md#clickhouse-flamegraph-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 +``` diff --git a/docs/ja/operations/performance-test.md b/docs/ja/operations/performance-test.md new file mode 100644 index 00000000000..d4e31898dbc --- /dev/null +++ b/docs/ja/operations/performance-test.md @@ -0,0 +1,32 @@ +--- +slug: /ja/operations/performance-test +sidebar_position: 54 +sidebar_label: ハードウェアのテスト +title: "ClickHouseでハードウェアをテストする方法" +--- + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +ClickHouseパッケージをインストールせずに、任意のサーバーで基本的なClickHouseのパフォーマンステストを実行できます。 + + +## 自動実行 + +ベンチマークを単一のスクリプトで実行することができます。 + +1. スクリプトをダウンロードします。 +``` +wget https://raw.githubusercontent.com/ClickHouse/ClickBench/main/hardware/hardware.sh +``` + +2. スクリプトを実行します。 +``` +chmod a+x ./hardware.sh +./hardware.sh +``` + +3. 出力をコピーして、feedback@clickhouse.com に送信してください。 + +すべての結果はここに公開されています: https://clickhouse.com/benchmark/hardware/ diff --git a/docs/ja/operations/query-cache.md b/docs/ja/operations/query-cache.md new file mode 100644 index 00000000000..c5beff9c00e --- /dev/null +++ b/docs/ja/operations/query-cache.md @@ -0,0 +1,174 @@ +--- +slug: /ja/operations/query-cache +sidebar_position: 65 +sidebar_label: クエリキャッシュ +--- + +# クエリキャッシュ + +クエリキャッシュは、`SELECT` クエリを一度計算し、同じクエリの再実行をキャッシュから直接提供できるようにします。 +クエリの種類によっては、ClickHouseサーバーのレイテンシーとリソース消費を劇的に削減できます。 + +## 背景、設計、および制限 + +クエリキャッシュは、一般的にトランザクション的に整合性があるか、一貫性がないものと見なされます。 + +- トランザクション的に一貫性のあるキャッシュでは、`SELECT` クエリの結果が変化した場合、または変化する可能性がある場合、データベースはキャッシュされたクエリ結果を無効にします(破棄します)。 + ClickHouseにおけるデータを変更する操作は、テーブルへの挿入/更新/削除またはコラプシングマージなどです。トランザクション的に整合性のあるキャッシュは、特にOLTPデータベースに適しており、 + 例えば [MySQL](https://dev.mysql.com/doc/refman/5.6/en/query-cache.html)(v8.0以降クエリキャッシュを削除)や + [Oracle](https://docs.oracle.com/database/121/TGDBA/tune_result_cache.htm)などがあります。 +- トランザクション的に整合性のないキャッシュでは、クエリ結果のわずかな不正確さが許容され、キャッシュエントリが一定の有効期間(例:1分)を持ち、その期間中に基礎となるデータがほとんど変化しないという仮定の下でキャッシュが機能します。 + このアプローチは全体としてOLAPデータベースにより適していると言えます。トランザクション的に整合性のないキャッシュが十分な例として、報告ツールで複数のユーザーが同時にアクセスする毎時売上報告を考えてみましょう。 + 売上データは通常ゆっくりと変化するため、データベースはレポートを一度計算するだけで済みます(最初の`SELECT`クエリで表されます)。その後のクエリはクエリキャッシュから直接提供されます。 + この例では、妥当な有効期間は30分になるかもしれません。 + +トランザクション的に整合性のないキャッシングは、通常、クライアントツールやデータベースと対話するプロキシパッケージ(例: +[chproxy](https://www.chproxy.org/configuration/caching/))によって提供されます。その結果、同じキャッシングロジックと構成がしばしば重複されます。 +ClickHouseのクエリキャッシュでは、キャッシングロジックがサーバー側に移動します。これにより、メンテナンスの手間が減り、冗長性が回避されます。 + +## 設定と使用法 + +:::note +ClickHouse Cloudでは、クエリキャッシュ設定を編集するために[クエリレベル設定](/ja/operations/settings/query-level)を使用する必要があります。[コンフィグレベル設定](/ja/operations/configuration-files)の編集は現在サポートされていません。 +::: + +[use_query_cache](settings/settings.md#use-query-cache) 設定を使用して、特定のクエリまたは現在のセッションのすべてのクエリがクエリキャッシュを利用するかどうかを制御できます。たとえば、以下のクエリの最初の実行は、 + +```sql +SELECT some_expensive_calculation(column_1, column_2) +FROM table +SETTINGS use_query_cache = true; +``` + +クエリの結果をクエリキャッシュに保存します。同じクエリの後続の実行(パラメータ`use_query_cache = true`も指定したもの)は、計算済みの結果をキャッシュから読み込み、即座に返します。 + +:::note +`use_query_cache` 設定と他のクエリキャッシュ関連の設定は、単独の`SELECT`文に対してのみ効果があります。特に、`CREATE VIEW AS SELECT [...] SETTINGS use_query_cache = true`によって作成されたビューへの`SELECT`の結果は、その`SELECT`文が`SETTINGS use_query_cache = true`で実行されない限りキャッシュされません。 +::: + +キャッシュの利用方法は、[enable_writes_to_query_cache](settings/settings.md#enable-writes-to-query-cache)と[enable_reads_from_query_cache](settings/settings.md#enable-reads-from-query-cache)(どちらもデフォルトで`true`)の設定を使用して詳細に構成できます。 +前者の設定はクエリ結果がキャッシュに保存されるかどうかを制御し、後者の設定はデータベースがキャッシュからクエリ結果を取得しようとするかどうかを決定します。たとえば、次のクエリはキャッシュをパッシブにのみ使用し、キャッシュから読み込むことを試みますが、その結果をキャッシュに保存しません: + +```sql +SELECT some_expensive_calculation(column_1, column_2) +FROM table +SETTINGS use_query_cache = true, enable_writes_to_query_cache = false; +``` + +最大限の制御を行うために、特定のクエリに対してのみ`use_query_cache`, `enable_writes_to_query_cache`, `enable_reads_from_query_cache`の設定を行うことが一般的に推奨されます。 +また、ユーザーやプロファイルレベルでキャッシュを有効にすることもできます(例:`SET use_query_cache = true`)。ただし、その場合、すべての`SELECT`クエリがキャッシュされた結果を返すことがあることに注意してください。 + +クエリキャッシュは、文`SYSTEM DROP QUERY CACHE`を使用してクリアできます。クエリキャッシュの内容はシステムテーブル[system.query_cache](system-tables/query_cache.md)に表示されます。 +データベース開始以降のクエリキャッシュヒットとミスの数は、システムテーブル[system.events](system-tables/events.md)のイベント"QueryCacheHits"および"QueryCacheMisses"として示されています。両方のカウンターは、`use_query_cache = true`設定で実行された`SELECT`クエリに対してのみ更新され、それ以外のクエリは"QueryCacheMisses"に影響を与えません。 +システムテーブル[system.query_log](system-tables/query_log.md)のフィールド`query_cache_usage`は、実行されたクエリごとに、そのクエリ結果がクエリキャッシュに書き込まれたか、もしくはキャッシュから読み取られたかを示しています。 +システムテーブル[system.asynchronous_metrics](system-tables/asynchronous_metrics.md)の非同期メトリック"QueryCacheEntries"および"QueryCacheBytes"は、クエリキャッシュが現在含んでいるエントリ/バイト数を示しています。 + +クエリキャッシュは、ClickHouseサーバープロセスごとに1つ存在します。ただし、デフォルトではキャッシュ結果はユーザー間で共有されません。セキュリティ上の理由から、これを変更することもできますが(下記参照)、推奨されません。 + +クエリキャッシュ内のクエリ結果は、クエリの[抽象構文木 (AST)](https://en.wikipedia.org/wiki/Abstract_syntax_tree)によって参照されます。これは、キャッシングが大文字/小文字に依存しないことを意味し、例えば`SELECT 1`と`select 1`が同じクエリとして扱われます。 +キャッシュのマッチングをより自然にするために、クエリキャッシュに関連するすべてのクエリレベル設定はASTから削除されます。 + +クエリが例外やユーザーのキャンセルにより中止された場合、エントリはクエリキャッシュに書き込まれません。 + +クエリキャッシュのサイズ(バイト単位)、最大キャッシュエントリ数、および個々のキャッシュエントリの最大サイズ(バイトおよびレコード数)は、異なる[サーバーコンフィグレーションオプション](server-configuration-parameters/settings.md#server_configuration_parameters_query-cache)を使用して構成できます。 + +```xml + + 1073741824 + 1024 + 1048576 + 30000000 + +``` + +また、[設定プロファイル](settings/settings-profiles.md)および[設定制約](settings/constraints-on-settings.md)を使用して、個々のユーザーのキャッシュ使用量を制限することもできます。 +より具体的には、ユーザーがクエリキャッシュで割り当てることができるメモリの最大量(バイト単位)と、ストアされるクエリ結果の最大数を制限できます。 +そのためには、まずユーザープロファイル内の`users.xml`で[query_cache_max_size_in_bytes](settings/settings.md#query-cache-max-size-in-bytes)と[query_cache_max_entries](settings/settings.md#query-cache-max-entries)の設定を行い、次に両方の設定を読み取り専用にします: + +``` xml + + + + 10000 + + 100 + + + + + + + + + + + +``` + +クエリの結果がキャッシュされるには一定時間以上の実行が必要な場合、設定[query_cache_min_query_duration](settings/settings.md#query-cache-min-query-duration)を使用できます。 +たとえば、以下のクエリの結果は、 + +``` sql +SELECT some_expensive_calculation(column_1, column_2) +FROM table +SETTINGS use_query_cache = true, query_cache_min_query_duration = 5000; +``` + +クエリが5秒以上実行される場合にのみキャッシュされます。また、クエリの結果がキャッシュされるまでに何回実行される必要があるかを指定することも可能です。それには設定[query_cache_min_query_runs](settings/settings.md#query-cache-min-query-runs)を使用します。 + +クエリキャッシュ内のエントリは、一定期間(有効期限 (TTL))が経過すると古くなります。デフォルトでは、この期間は60秒ですが、設定[query_cache_ttl](settings/settings.md#query-cache-ttl)を使用して、セッション、プロファイル、またはクエリレベルで異なる値を指定できます。 +クエリキャッシュは「遅延」エントリ追放を行います。つまり、エントリが古くなった場合、すぐにキャッシュから削除されるわけではありません。 +代わりに、新しいエントリをクエリキャッシュに挿入する必要がある場合、データベースはキャッシュが新しいエントリのために十分な空きスペースを持っているかどうかを確認します。 +これが行われない場合、データベースはすべての古いエントリを削除しようとします。それでもキャッシュに十分な空きスペースがない場合、新しいエントリは挿入されません。 + +クエリキャッシュ内のエントリはデフォルトで圧縮されます。これにより、クエリキャッシュへの読み書きが遅くなりますが、全体のメモリ消費量が削減されます。 +圧縮を無効化するには、設定[query_cache_compress_entries](settings/settings.md#query-cache-compress-entries)を使用します。 + +時には、同じクエリに対する複数の結果をキャッシュしておくと便利です。これを実現するために、クエリキャッシュエントリのタグ(またはネームスペース)として機能する設定[query_cache_tag](settings/settings.md#query-cache-tag)が使用できます。 +クエリキャッシュは、異なるタグを持つ同じクエリの結果を異なるものとして扱います。 + +同じクエリに対して3つの異なるクエリキャッシュエントリを作成する例: + +```sql +SELECT 1 SETTINGS use_query_cache = true; -- query_cache_tagは暗黙的に''(空文字列) +SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'tag 1'; +SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'tag 2'; +``` + +クエリキャッシュからタグ`tag`のエントリのみを削除するには、文`SYSTEM DROP QUERY CACHE TAG 'tag'`を使用します。 + +ClickHouseは、[max_block_size](settings/settings.md#setting-max_block_size)行のブロックでテーブルデータを読み込みます。 +フィルタリングや集約などにより、結果ブロックは通常'max_block_size'よりもはるかに小さくなりますが、場合によっては非常に大きくなることもあります。 +設定[query_cache_squash_partial_results](settings/settings.md#query-cache-squash-partial-results)(デフォルトで有効)は、結果ブロックが(極小の場合)'max_block_size'のサイズにスクワッシュされるか、(大きい場合)にブロックがスプリットされるかを制御します。 +これにより、クエリキャッシュへの書き込みのパフォーマンスは低下しますが、キャッシュエントリの圧縮率は改善され、後でクエリキャッシュから結果が提供される際に、より自然なブロック粒度が得られます。 + +結果として、クエリキャッシュはクエリごとに複数の(部分的な)結果ブロックを保存します。この振る舞いは良いデフォルトですが、設定[query_cache_squash_partial_results](settings/settings.md#query-cache-squash-partial-results)を使用して抑制することも可能です。 + +また、非決定的な関数を含むクエリの結果はデフォルトでキャッシュされません。これには、 +- Dictionaryアクセス用関数: [`dictGet()`](../sql-reference/functions/ext-dict-functions.md#dictGet) など、 +- [ユーザー定義関数](../sql-reference/statements/create/function.md)、 +- 現在の日付や時刻を返す関数: [`now()`](../sql-reference/functions/date-time-functions.md#now), + [`today()`](../sql-reference/functions/date-time-functions.md#today), + [`yesterday()`](../sql-reference/functions/date-time-functions.md#yesterday) など、 +- ランダムな値を返す関数: [`randomString()`](../sql-reference/functions/random-functions.md#randomString), + [`fuzzBits()`](../sql-reference/functions/random-functions.md#fuzzBits) など、 +- クエリ処理に使用される内部チャンクのサイズと順序に依存する関数: + [`nowInBlock()`](../sql-reference/functions/date-time-functions.md#nowInBlock) など、 + [`rowNumberInBlock()`](../sql-reference/functions/other-functions.md#rowNumberInBlock), + [`runningDifference()`](../sql-reference/functions/other-functions.md#runningDifference), + [`blockSize()`](../sql-reference/functions/other-functions.md#blockSize) など、 +- 環境に依存する関数: [`currentUser()`](../sql-reference/functions/other-functions.md#currentUser), + [`queryID()`](../sql-reference/functions/other-functions.md#queryID), + [`getMacro()`](../sql-reference/functions/other-functions.md#getMacro) などが含まれます。 + +非決定的な関数を含むクエリの結果を強制的にキャッシュする場合は、設定[query_cache_nondeterministic_function_handling](settings/settings.md#query-cache-nondeterministic-function-handling)を使用します。 + +システムテーブル(例:[system.processes](system-tables/processes.md)または[information_schema.tables](system-tables/information_schema.md))を含むクエリの結果はデフォルトでキャッシュされません。 +システムテーブルを含むクエリの結果を強制的にキャッシュするには、設定[query_cache_system_table_handling](settings/settings.md#query-cache-system-table-handling)を使用します。 + +最後に、セキュリティ上の理由からクエリキャッシュ内のエントリはユーザー間で共有されません。たとえば、ユーザーAは、ユーザーB(そのようなポリシーが存在しないユーザー)のために同じクエリを実行することにより、テーブル上の行ポリシーを回避することができません。しかし、必要に応じて、キャッシュエントリは他のユーザーによってアクセス可能(すなわち共有可能)としてマークすることができますが、設定 +[query_cache_share_between_users](settings/settings.md#query-cache-share-between-users)を供給することにより実現できます。 + +## 関連コンテンツ + +- ブログ: [Introducing the ClickHouse Query Cache](https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design) diff --git a/docs/ja/operations/quotas.md b/docs/ja/operations/quotas.md new file mode 100644 index 00000000000..13390de00de --- /dev/null +++ b/docs/ja/operations/quotas.md @@ -0,0 +1,115 @@ +--- +slug: /ja/operations/quotas +sidebar_position: 51 +sidebar_label: Quotas +title: Quotas +--- + +クォータは、リソース使用量を一定期間内で制限したり、リソースの使用を追跡することを可能にします。クォータは通常「users.xml」に設定されるユーザー設定に含まれます。 + +システムには、単一のクエリの複雑さを制限する機能もあります。詳細は、[クエリの複雑さに関する制限](../operations/settings/query-complexity.md)のセクションを参照してください。 + +クエリの複雑さの制限とは対照的に、クォータは以下を特徴とします: + +- 単一のクエリを制限するのではなく、一定期間内で実行できるクエリのセットに対して制限をかけます。 +- 分散クエリ処理のための全てのリモートサーバーで消費されたリソースを考慮します。 + +次に、クォータを定義する「users.xml」ファイルのセクションを見てみましょう。 + +``` xml + + + + + + + + 3600 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + +``` + +デフォルトでは、クォータは毎時のリソース消費を追跡し、使用を制限しません。 +各インターバルごとに計算されたリソース消費は、リクエストごとにサーバーログに出力されます。 + +``` xml + + + + + 3600 + + 1000 + 100 + 100 + 100 + 1000000000 + 100000000000 + 900 + + + + 86400 + + 10000 + 10000 + 10000 + 1000 + 5000000000 + 500000000000 + 7200 + + +``` + +‘statbox’ クォータの場合、1時間ごとおよび24時間(86,400秒)ごとに制限が設定されています。時間間隔は、実装で定義された固定の時点から始まるため、24時間のインターバルは必ずしも深夜に始まるわけではありません。 + +インターバルが終了すると、すべての収集された値はクリアされます。次の時間のクォータ計算は再び始まります。 + +次の制限可能な項目があります: + +`queries` – リクエストの総数。 + +`query_selects` – selectリクエストの総数。 + +`query_inserts` – insertリクエストの総数。 + +`errors` – 例外をスローしたクエリの数。 + +`result_rows` – 結果として与えられた行の総数。 + +`read_rows` – すべてのリモートサーバーでクエリを実行するためにテーブルから読み取られたソース行の総数。 + +`execution_time` – 合計のクエリ実行時間(秒:ウォールタイム)。 + +少なくとも1つの時間間隔で制限を超えると、どの制限がどのインターバルで超えられたか、新しいインターバルがいつ始まるかについてのメッセージが添えられた例外がスローされます(クエリが再び送信できる場合)。 + +クォータは「クォータキー」機能を使用して、複数のキーに対して独立してリソースを報告することができます。以下にその例を示します: + +``` xml + + + + +``` + +クォータは設定の「users」セクションでユーザーに割り当てられます。「アクセス権」のセクションを参照してください。 + +分散クエリ処理では、蓄積された量は要求者のサーバーに保存されます。そのため、ユーザーが別のサーバーに移動すると、そのサーバーでのクォータは「やり直し」になります。 + +サーバーが再起動されると、クォータはリセットされます。 diff --git a/docs/ja/operations/server-configuration-parameters/settings.md b/docs/ja/operations/server-configuration-parameters/settings.md new file mode 100644 index 00000000000..446099eecde --- /dev/null +++ b/docs/ja/operations/server-configuration-parameters/settings.md @@ -0,0 +1,3203 @@ +--- +slug: /ja/operations/server-configuration-parameters/settings +sidebar_position: 57 +sidebar_label: グローバルサーバー設定 +description: このセクションには、セッションまたはクエリレベルで変更できないサーバー設定の説明が含まれています。 +--- + +# グローバルサーバー設定 + +このセクションには、セッションまたはクエリレベルで変更できないサーバー設定の説明が含まれています。 + +これらの設定はClickHouseサーバーの`config.xml`ファイルに保存されています。 + +その他の設定は「[設定](../../operations/settings/index.md#session-settings-intro)」セクションに説明されています。 + +設定を学ぶ前に、[設定ファイル](../../operations/configuration-files.md#configuration_files)セクションを読み、置換の使用(`incl`および`optional`属性)に注意してください。 + +## allow_use_jemalloc_memory + +jemallocメモリを使用することを許可します。 + +タイプ: Bool + +デフォルト: 1 + +## asynchronous_heavy_metrics_update_period_s + +非同期メトリックを更新する期間(秒単位)。 + +タイプ: UInt32 + +デフォルト: 120 + +## asynchronous_metrics_update_period_s + +非同期メトリックを更新する期間(秒単位)。 + +タイプ: UInt32 + +デフォルト: 1 + +## auth_use_forwarded_address + +プロキシを介して接続されたクライアントの認証に元のアドレスを使用します。 + +:::note +この設定は、転送されたアドレスが容易に偽装される可能性があるため、特に注意して使用する必要があります。したがって、そのような認証を受け入れるサーバーは、信頼できるプロキシ経由でのみアクセスされるべきです。 +::: + +タイプ: Bool + +デフォルト: 0 + +## background_buffer_flush_schedule_pool_size + +バックグラウンドでBufferエンジンテーブルのフラッシュ操作を実行するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## background_common_pool_size + +バックグラウンドで\*MergeTreeエンジンテーブルのさまざまな操作(主にガベージコレクション)を実行するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 8 + +## background_distributed_schedule_pool_size + +分散送信を実行するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## background_fetches_pool_size + +バックグラウンドで\*MergeTreeエンジンテーブルの他のレプリカからデータパーツをフェッチするために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## background_merges_mutations_concurrency_ratio + +スレッド数とバックグラウンドのマージおよびミューテーションを並行して実行することができる数の比率を設定します。例えば、この比率が2に等しく、`background_pool_size`が16に設定されている場合、ClickHouseはバックグラウンドで32個のマージを同時に実行できます。これは、バックグラウンド操作が一時停止して延期される可能性があるため可能です。小さなマージにより高い実行優先順位を与えるために必要です。この比率を増やすことは実行時にのみ可能です。これを下げるには、サーバーを再起動する必要があります。`background_pool_size`設定と同様に、後方互換性のために`default`プロファイルから`background_merges_mutations_concurrency_ratio`を適用することができます。 + +タイプ: Float + +デフォルト: 2 + +## background_merges_mutations_scheduling_policy + +バックグラウンドマージとミューテーションのスケジューリングを行う方針。可能な値は`round_robin`と`shortest_task_first`です。 + +バックグラウンドスレッドプールによって実行される次のマージまたはミューテーションを選択するために使用されるアルゴリズム。ポリシーは、サーバーを再起動せずに実行時に変更可能です。後方互換性のために`default`プロファイルから適用できます。 + +可能な値: + +- 「round_robin」— すべての同時マージとミューテーションは、枯渇のない操作を保証するためにラウンドロビン順に実行されます。小さなマージは、単にマージするブロックが少ないため、より大きなものよりも早く完了します。 +- 「shortest_task_first」— 常に小さなマージまたはミューテーションを実行します。マージとミューテーションは、結果のサイズに基づいて優先順位が割り当てられます。小さいサイズのマージは、大きなものに対して厳密に優先されます。このポリシーは、小さなパーツを可能な限り早くマージすることを保証しますが、INSERTsで過度に負荷がかかると、大きなマージが無期限に遅れる可能性があります。 + +タイプ: String + +デフォルト: round_robin + +## background_message_broker_schedule_pool_size + +メッセージストリーミングのバックグラウンド操作を実行するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## background_move_pool_size + +バックグラウンドで\*MergeTreeエンジンテーブルのデータパーツを他のディスクまたはボリュームに移動するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 8 + +## background_pool_size + +MergeTreeエンジンを持つテーブルのバックグラウンドマージとミューテーションを実行するスレッド数を設定します。このスレッド数を実行時に増やすことだけが可能です。スレッド数を減らすには、サーバーを再起動する必要があります。この設定を調整することで、CPUとディスクの負荷を管理します。プールサイズが小さいほどCPUとディスクリソースの使用が少なくなりますが、バックグラウンドプロセスの進行が遅くなり、最終的にはクエリのパフォーマンスに影響を与える可能性があります。 + +変更する前に、関連するMergeTreeの設定、たとえば`number_of_free_entries_in_pool_to_lower_max_size_of_merge`や`number_of_free_entries_in_pool_to_execute_mutation`なども参照してください。 + +タイプ: UInt64 + +デフォルト: 16 + +## background_schedule_pool_size + +レプリカーテーブル、Kafkaストリーミング、DNSキャッシュの更新のための軽量な周期的操作を常時実行するために使用される最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 512 + +## backup_threads + +BACKUPリクエストを実行するための最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## backups_io_thread_pool_queue_size + +Backups IO スレッドプールでスケジュールできるジョブの最大数。現在のS3バックアップロジックのため、キューを無制限(0)に保つことが推奨されます。 + +タイプ: UInt64 + +デフォルト: 0 + +## cache_size_to_ram_max_ratio + +RAM最大比に対するキャッシュサイズを設定します。この設定は低メモリシステムでキャッシュサイズを減少させることができます。 + +タイプ: Double + +デフォルト: 0.5 + +## concurrent_threads_soft_limit_num + +リモートサーバーからデータを取得するスレッドを除く、すべてのクエリを実行するために許可される最大クエリ処理スレッド数。これは厳しい制限ではありません。制限に達した場合でも、クエリは少なくとも1つのスレッドを取得して実行され続けます。実行中にさらに多くのスレッドが使用可能になると、クエリは希望するスレッド数にスケールアップすることができます。 + +ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## concurrent_threads_soft_limit_ratio_to_cores + +concurrent_threads_soft_limit_numと同じですが、コアと比率で指定します。 + +タイプ: UInt64 + +デフォルト: 0 + +## default_database + +デフォルトのデータベース名。 + +タイプ: String + +デフォルト: default + +## disable_internal_dns_cache + +内部DNSキャッシュを無効にします。ClickHouseを頻繁に変更されるインフラストラクチャ(例: Kubernetes)で運用する際に推奨されます。 + +タイプ: Bool + +デフォルト: 0 + +## dns_cache_max_entries + +内部DNSキャッシュの最大エントリ数。 + +タイプ: UInt64 + +デフォルト: 10000 + +## dns_cache_update_period + +内部DNSキャッシュの更新期間(秒単位)。 + +タイプ: Int32 + +デフォルト: 15 + +## dns_max_consecutive_failures + +ClickHouseのDNSキャッシュからホストを削除する前の最大連続解決失敗数 + +タイプ: UInt32 + +デフォルト: 10 + +## index_mark_cache_policy + +インデックスマークキャッシュポリシー名。 + +タイプ: String + +デフォルト: SLRU + +## index_mark_cache_size + +インデックスマークのキャッシュサイズ。ゼロは無効を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## index_mark_cache_size_ratio + +キャッシュの合計サイズに対するインデックスマークキャッシュ内の保護されたキューのサイズ。 + +タイプ: Double + +デフォルト: 0.5 + +## index_uncompressed_cache_policy + +インデックス非圧縮キャッシュポリシー名。 + +タイプ: String + +デフォルト: SLRU + +## index_uncompressed_cache_size + +MergeTreeインデックスの非圧縮ブロックのキャッシュサイズ。ゼロは無効を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## index_uncompressed_cache_size_ratio + +キャッシュの合計サイズに対するインデックス非圧縮キャッシュ内の保護されたキューのサイズ。 + +タイプ: Double + +デフォルト: 0.5 + +## io_thread_pool_queue_size + +IOスレッドプールのキューサイズ。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 10000 + +## mark_cache_policy + +マークキャッシュポリシー名。 + +タイプ: String + +デフォルト: SLRU + +## mark_cache_size + +マーク(MergeTreeファミリーのテーブルのインデックス)のキャッシュサイズ。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。 +::: + +タイプ: UInt64 + +デフォルト: 5368709120 + +## mark_cache_size_ratio + +キャッシュの合計サイズに対するマークキャッシュ内の保護されたキューのサイズ。 + +タイプ: Double + +デフォルト: 0.5 + +## max_backup_bandwidth_for_server + +サーバー上のすべてのバックアップに対する最大読み取り速度(バイト毎秒)。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_backups_io_thread_pool_free_size + +バックアップIOスレッドプール内の**アイドル**スレッド数が`max_backup_io_thread_pool_free_size`を超える場合、ClickHouseはアイドル状態のスレッドが占めているリソースを解放し、プールサイズを減少させます。必要に応じてスレッドを再作成できます。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_backups_io_thread_pool_size + +BACKUPクエリのためのIO操作に使用される最大スレッド数 + +タイプ: UInt64 + +デフォルト: 1000 + +## max_concurrent_queries + +同時に実行されるクエリの総数の制限。ゼロは無制限を意味します。挿入および選択クエリの制限、ユーザーの最大クエリ数の制限も考慮する必要があります。max_concurrent_insert_queries, max_concurrent_select_queries, max_concurrent_queries_for_all_usersも参照してください。ゼロは無制限を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。既に実行中のクエリは変更されません。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## max_concurrent_insert_queries + +同時に実行される挿入クエリの総数の制限。ゼロは無制限を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。既に実行中のクエリは変更されません。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## max_concurrent_select_queries + +同時に実行される選択クエリの総数の制限。ゼロは無制限を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。既に実行中のクエリは変更されません。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## max_waiting_queries + +同時待機クエリの総数の制限。待機中のクエリの実行は、必要なテーブルが非同期に読み込まれる間(`async_load_databases`を参照)ブロックされます。待機中のクエリは、`max_concurrent_queries`、`max_concurrent_insert_queries`、`max_concurrent_select_queries`、`max_concurrent_queries_for_user`、`max_concurrent_queries_for_all_users`の制限をチェックする際にカウントされません。この修正は、サーバーの起動直後にこれらの制限に達することを避けるために行われます。ゼロは無制限を意味します。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。既に実行中のクエリは変更されません。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## max_connections + +サーバーの最大接続数。 + +タイプ: Int32 + +デフォルト: 1024 + +## max_io_thread_pool_free_size + +IOスレッドプールの最大フリーサイズ。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_io_thread_pool_size + +IO操作に使用される最大スレッド数 + +タイプ: UInt64 + +デフォルト: 100 + +## max_local_read_bandwidth_for_server + +ローカル読み取りの最大速度(1秒あたりのバイト数)。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_local_write_bandwidth_for_server + +ローカル書き込みの最大速度(1秒あたりのバイト数)。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_partition_size_to_drop + +パーティション削除の制限。 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)テーブルのサイズが`max_partition_size_to_drop`(バイト単位)を超える場合、[DROP PARTITION](../../sql-reference/statements/alter/partition.md#drop-partitionpart)クエリを使用してパーティションを削除することはできません。この設定は適用するためにClickHouseサーバーの再起動を必要としません。もう一つの制限を解除する方法は、`/flags/force_drop_table`ファイルを作成することです。デフォルト値: 50 GB。値が0の場合、制限なしでパーティションを削除できます。 + +:::note +この制限は、テーブルの削除やテーブルの切り捨てを制限しません。詳細は[max_table_size_to_drop](#max-table-size-to-drop)を参照してください。 +::: + +## max_remote_read_network_bandwidth_for_server + +ネットワーク経由でのデータ交換の最大速度(バイト毎秒)での読み取り。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_remote_write_network_bandwidth_for_server + +ネットワーク経由でのデータ交換の最大速度(バイト毎秒)での書き込み。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_server_memory_usage + +サーバー全体のメモリ使用量の制限。ゼロは無制限を意味します。 + +デフォルトの`max_server_memory_usage`値は`memory_amount * max_server_memory_usage_to_ram_ratio`として計算されます。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_server_memory_usage_to_ram_ratio + +max_server_memory_usageと同じですが、物理RAMに対する比率で設定します。低メモリシステムでのメモリ使用率を下げることができます。ゼロは無制限を意味します。 + +RAMとスワップが低いホストでは、`max_server_memory_usage_to_ram_ratio`を1より大きく設定する必要があります。 + +タイプ: Double + +デフォルト: 0.9 + +## max_build_vector_similarity_index_thread_pool_size {#server_configuration_parameters_max_build_vector_similarity_index_thread_pool_size} + +ベクトルインデックスの構築に使用する最大スレッド数。0はすべてのコアを意味します。 + +タイプ: UInt64 + +デフォルト: 16 + +## cgroups_memory_usage_observer_wait_time + +cgroupsのしきい値でサーバーの最大許容メモリ消費を調整する間隔(秒単位)。 (`cgroup_memory_watcher_hard_limit_ratio`と`cgroup_memory_watcher_soft_limit_ratio` の設定を参照)。 + +cgroupオブザーバーを無効にするには、この値を`0`に設定します。 + +タイプ: UInt64 + +デフォルト: 15 + +## cgroup_memory_watcher_hard_limit_ratio + +cgroupsに従ったサーバープロセスのメモリ消費に関する「ハード」しきい値を指定します。このしきい値を超えると、サーバーの最大メモリ消費がしきい値の値に調整されます。 + +`cgroups_memory_usage_observer_wait_time`および`cgroup_memory_watcher_soft_limit_ratio`の設定を参照してください。 + +タイプ: Double + +デフォルト: 0.95 + +## cgroup_memory_watcher_soft_limit_ratio + +cgroupsに従ったサーバープロセスのメモリ消費に関する「ソフト」しきい値を指定し、jemallocのアリーナをパージします。 + +`cgroups_memory_usage_observer_wait_time`と`cgroup_memory_watcher_hard_limit_ratio`の設定を参照してください。 + +タイプ: Double + +デフォルト: 0.9 + +## max_table_size_to_drop + +テーブル削除の制限。 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)テーブルのサイズが`max_table_size_to_drop`(バイト単位)を超える場合、[DROP](../../sql-reference/statements/drop.md)クエリや[TRUNCATE](../../sql-reference/statements/truncate.md)クエリを使用して削除できません。 + +この設定は適用するためにClickHouseサーバーの再起動を必要としません。もう一つの制限を解除する方法は、`/flags/force_drop_table`ファイルを作成することです。 + +デフォルト値: 50 GB。値が0の場合、すべてのテーブルを制限なしで削除できます。 +**例** +``` xml +0 +``` + +## max\_database\_num\_to\_warn {#max-database-num-to-warn} +アタッチされたデータベースの数が指定された値を超えた場合、clickhouseサーバーは`system.warnings`テーブルに警告メッセージを追加します。 +デフォルト値: 1000 + +**例** + +``` xml +50 +``` + +## max\_table\_num\_to\_warn {#max-table-num-to-warn} +アタッチされたテーブルの数が指定された値を超えた場合、clickhouseサーバーは`system.warnings`テーブルに警告メッセージを追加します。 +デフォルト値: 5000 + +**例** + +``` xml +400 +``` + +## max\_view\_num\_to\_warn {#max-view-num-to-warn} +アタッチされたビューの数が指定された値を超えた場合、clickhouseサーバーは`system.warnings`テーブルに警告メッセージを追加します。 +デフォルト値: 10000 + +**例** + +``` xml +400 +``` + +## max\_dictionary\_num\_to\_warn {#max-dictionary-num-to-warn} +アタッチされたディクショナリの数が指定された値を超えた場合、clickhouseサーバーは`system.warnings`テーブルに警告メッセージを追加します。 +デフォルト値: 1000 + +**例** + +``` xml +400 +``` + +## max\_part\_num\_to\_warn {#max-part-num-to-warn} +アクティブパーツの数が指定された値を超えた場合、clickhouseサーバーは`system.warnings`テーブルに警告メッセージを追加します。 +デフォルト値: 100000 + +**例** + +``` xml +400 +``` + +## max\_table\_num\_to\_throw {#max-table-num-to-throw} +テーブルの数がこの値を超える場合、サーバーは例外をスローします。0は制限がないことを意味します。ビュー、リモートテーブル、ディクショナリ、システムテーブルはカウントされません。Atomic/Ordinary/Replicated/Lazyデータベースエンジンのテーブルだけがカウントされます。デフォルト値: 0 + +**例** +```xml +400 +``` + +## max\_database\_num\_to\_throw {#max-table-num-to-throw} +データベースの数がこの値を超える場合、サーバーは例外をスローします。0は制限がないことを意味します。 +デフォルト値: 0 + +**例** +```xml +400 +``` + +## max_temporary_data_on_disk_size + +外部集計、結合、またはソートに使用できる最大ストレージ量。 +この制限を超えたクエリは例外で失敗します。ゼロは無制限を意味します。 + +`max_temporary_data_on_disk_size_for_user`や`max_temporary_data_on_disk_size_for_query`も参照。 + +タイプ: UInt64 + +デフォルト: 0 + +## max_thread_pool_free_size + +グローバルスレッドプールの**アイドル**スレッド数が`max_thread_pool_free_size`を超える場合、ClickHouseは一部のスレッドが占めているリソースを解放し、プールサイズを減少させます。必要に応じてスレッドを再作成できます。 + +タイプ: UInt64 + +デフォルト: 1000 + +## max_thread_pool_size + +OSから割り当てられ、クエリ実行やバックグラウンド操作に使用できる最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 10000 + +## mmap_cache_size + +マップされたファイルのキャッシュサイズ(バイト単位)を設定します。この設定は頻繁な開閉呼び出し(それに伴うページフォールトのため非常に高価)を回避し、複数のスレッドやクエリからのマッピングを再利用できます。設定値はマップされた領域の数です(通常はマップされたファイルの数に等しい)。マップされたファイル内のデータの量は、システムテーブル`system.metrics`と`system.metric_log`で`MMappedFiles`と`MMappedFileBytes`メトリクスでモニタリングできます。また、`system.asynchronous_metrics`と`system.asynchronous_metrics_log`で`MMapCacheCells`メトリクス、`system.events`、`system.processes`、`system.query_log`、`system.query_thread_log`、`system.query_views_log`で`CreatedReadBufferMMap`、`CreatedReadBufferMMapFailed`、`MMappedFileCacheHits`、`MMappedFileCacheMisses`イベントでもモニタリングできます。 + +注意: マップされたファイル内のデータ量はメモリを直接消費せず、クエリやサーバーのメモリ使用量にカウントされません。これはOSページキャッシュと同様に破棄可能なためです。キャッシュは、MergeTreeファミリーのテーブル内の古いパーツが削除されると自動的に削除され、`SYSTEM DROP MMAP CACHE`クエリで手動で削除することもできます。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。 +::: + +タイプ: UInt64 + +デフォルト: 1000 + +## restore_threads + +RESTOREリクエストを実行するための最大スレッド数。 + +タイプ: UInt64 + +デフォルト: 16 + +## show_addresses_in_stack_traces + +真に設定されている場合、スタックトレースでアドレスを表示します + +タイプ: Bool + +デフォルト: 1 + +## shutdown_wait_unfinished_queries + +真に設定されている場合、ClickHouseはシャットダウン前に実行中のクエリが終了するのを待ちます。 + +タイプ: Bool + +デフォルト: 0 + +## temporary_data_in_cache + +このオプションにより、一時データは特定のディスクのキャッシュ内に保存されます。 +このセクションでは、タイプが`cache`のディスク名を指定する必要があります。 +この場合、キャッシュと一時データは同じスペースを共有し、一時データを作成するためにディスクキャッシュを退避させることができます。 + +:::note +一時データストレージを構成するために使用できるオプションは、`tmp_path` 、`tmp_policy` 、`temporary_data_in_cache` のいずれかの一つのみです。 +::: + +**例** + +`local_disk`用のキャッシュと一時データは、ファイルシステム上の`/tiny_local_cache`に保存され、`tiny_local_cache`で管理されます。 + +```xml + + + + + local + /local_disk/ + + + + + cache + local_disk + /tiny_local_cache/ + 10M + 1M + 1 + + + + + + + tiny_local_cache + + +``` + +タイプ: String + +デフォルト: + +## thread_pool_queue_size + +グローバルスレッドプールでスケジュールできるジョブの最大数。キューサイズを増やすと、より多くのメモリが使用されます。この値を`max_thread_pool_size`と等しく保つことが推奨されます。ゼロは無制限を意味します。 + +タイプ: UInt64 + +デフォルト: 10000 + +## tmp_policy + +一時データを含むストレージのポリシー。MergeTreeテーブルエンジンのドキュメントも参照してください。 + +:::note +- 一時データストレージを構成するために使用できるオプションは、`tmp_path` 、`tmp_policy` 、`temporary_data_in_cache` のいずれかの一つのみです。 +- `move_factor`、`keep_free_space_bytes`、`max_data_part_size_bytes`などは無視されます。 +- ポリシーには正確に*1つのボリューム*と*ローカル*ディスクを含むべきです。 +::: + +**例** + +`/disk1`が満杯になると、一時データは`/disk2`に保存されます。 + +```xml + + + + + /disk1/ + + + /disk2/ + + + + + + + +
    + disk1 + disk2 +
    +
    +
    + +
    +
    + + + tmp_two_disks + +
    +``` +タイプ: String + +デフォルト: + +## uncompressed_cache_policy + +非圧縮キャッシュポリシー名。 + +タイプ: String + +デフォルト: SLRU + +## uncompressed_cache_size + +MergeTreeファミリーのテーブルエンジンによって使用される非圧縮データのキャッシュサイズ(バイト単位)。ゼロは無効を意味します。 + +サーバーには1つの共有キャッシュがあります。メモリはオンデマンドで割り当てられます。キャッシュは、オプションuse_uncompressed_cacheが有効になっている場合に使用されます。 + +非常に短いクエリに対して個別のケースで非圧縮キャッシュが有利です。 + +:::note +この設定は実行時に変更可能で、すぐに適用されます。 +::: + +タイプ: UInt64 + +デフォルト: 0 + +## uncompressed_cache_size_ratio + +キャッシュの合計サイズに対する非圧縮キャッシュ内の保護されたキューのサイズ。 + +タイプ: Double + +デフォルト: 0.5 + +## builtin_dictionaries_reload_interval {#builtin-dictionaries-reload-interval} + +組み込みディクショナリを再読み込みする前の間隔(秒単位)。 + +ClickHouseは指定された秒数ごとに組み込みディクショナリを再読み込みします。これにより、サーバーを再起動することなくディクショナリを「オンザフライ」で編集することができます。 + +デフォルト値: 3600。 + +**例** + +```xml +3600 +``` + +## compression {#server-settings-compression} + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)-エンジンテーブルのデータ圧縮設定。 + +:::note +ClickHouseを使い始めたばかりの場合は使用しないでください。 +::: + +設定テンプレート: + +```xml + + + ... + ... + ... + ... + + ... + +``` + +``フィールド: + +- `min_part_size` – データパートの最小サイズ。 +- `min_part_size_ratio` – データパートのサイズとテーブルサイズの比率。 +- `method` – 圧縮方法。許可される値は: `lz4`, `lz4hc`, `zstd`,`deflate_qpl`. +- `level` – 圧縮レベル。[Codecs](../../sql-reference/statements/create/table.md#create-query-general-purpose-codecs)を参照。 + +複数の``セクションを設定できます。 + +条件が満たされた場合の動作: + +- データパートが条件セットと一致する場合、ClickHouseは指定された圧縮方法を使用します。 +- データパートが複数の条件セットと一致する場合、ClickHouseは最初に一致した条件セットを使用します。 + +データパートに対する条件が満たされない場合、ClickHouseは`lz4`圧縮を使用します。 + +**例** + +```xml + + + 10000000000 + 0.01 + zstd + 1 + + +``` + +## encryption {#server-settings-encryption} + +[暗号化コーデック](../../sql-reference/statements/create/table.md#create-query-encryption-codecs)で使用するキーを取得するコマンドを構成します。キー(またはキー)は、環境変数に書き込むか、設定ファイルに設定する必要があります。 + +キーは16バイトの長さの16進数または文字列にできます。 + +**例** + +設定から読み込み: + +```xml + + + 1234567812345678 + + +``` + +:::note +設定ファイルにキーを格納することは推奨されません。これは安全ではありません。鍵を安全なディスク上の別の設定ファイルに移動し、それに対するシンボリックリンクを`config.d/`フォルダーに置くことを検討してください。 +::: + +16進数のキーを設定から読み込む場合: + +```xml + + + 00112233445566778899aabbccddeeff + + +``` + +環境変数からキーを読み込む場合: + +```xml + + + + + +``` + +ここで`current_key_id`は暗号化のための現在のキーを設定し、指定されたすべてのキーが復号化に使用されることができます。 + +これらの方法のそれぞれは、複数のキーにも適用可能です: + +```xml + + + 00112233445566778899aabbccddeeff + + 1 + + +``` + +ここで`current_key_id`は暗号化のための現在のキーを示しています。 + +またユーザーは12バイト長のnonceを追加することができます(デフォルトの暗号化および復号化プロセスではゼロバイトで構成されるnonceが使用されます): + +```xml + + + 012345678910 + + +``` + +または16進数で設定できます: + +```xml + + + abcdefabcdef + + +``` + +上記のすべてのことは、`aes_256_gcm_siv`にも適用されます(ただしキーは32バイト長でなければなりません)。 + +## error_log {#error_log} + +デフォルトでは無効です。 + +**有効化** + +エラーログの履歴収集[`system.error_log`](../../operations/system-tables/error_log.md)を手動でオンにするには、次の内容で`/etc/clickhouse-server/config.d/error_log.xml`を作成してください: + +```xml + + + system + error_log
    + 7500 + 1000 + 1048576 + 8192 + 524288 + false +
    +
    +``` + +**無効化** + +`error_log`設定を無効にするには、次の内容で`/etc/clickhouse-server/config.d/disable_error_log.xml`を作成してください: + +```xml + + + +``` + +## custom_settings_prefixes {#custom_settings_prefixes} + +[カスタム設定](../../operations/settings/index.md#custom_settings)のプレフィックスのリスト。プレフィックスはカンマで区切る必要があります。 + +**例** + +```xml +custom_ +``` + +**関連項目** + +- [カスタム設定](../../operations/settings/index.md#custom_settings) + +## core_dump {#core_dump} + +コアダンプファイルサイズのソフトリミットを設定します。 + +可能な値: + +- 正の整数。 + +デフォルト値: `1073741824` (1 GB)。 + +:::note +ハードリミットはシステムツールを使用して設定されます +::: + +**例** + +```xml + + 1073741824 + +``` + +## database_atomic_delay_before_drop_table_sec {#database_atomic_delay_before_drop_table_sec} + +削除されたテーブルを[UNDROP](/docs/ja/sql-reference/statements/undrop.md)ステートメントを使用して復元できるまでの遅延時間。この設定は`SYNC`モディファイア付きで`DROP TABLE`が実行された場合、無視されます。 + +デフォルト値: `480` (8分)。 + +## database_catalog_unused_dir_hide_timeout_sec {#database_catalog_unused_dir_hide_timeout_sec} + +`store/`ディレクトリのガベージをクリーンアップするタスクのパラメータ。 +ClickHouseサーバーで使用されていないサブディレクトリが +最後に`database_catalog_unused_dir_hide_timeout_sec`秒の間に変更されていない場合、タスクは +このディレクトリを「隠す」(すべてのアクセス権を削除することによって)ことを行います。 +`store/`内にClickHouseサーバーが予期しないことも期待されるディレクトリにも適用されます。ゼロは「即時」を意味します。 + +デフォルト値: `3600` (1時間)。 + +## database_catalog_unused_dir_rm_timeout_sec {#database_catalog_unused_dir_rm_timeout_sec} + +`store/`ディレクトリのガベージをクリーンアップするタスクのパラメータ。 +ClickHouseサーバーで使用されておらず、以前に「隠された」 +(`database_catalog_unused_dir_hide_timeout_sec`を参照) +最後に`database_catalog_unused_dir_rm_timeout_sec`秒の間に変更されていない場合、タスクはこのディレクトリを削除します。 +`store/`内にClickHouseサーバーが予期しないことも期待されるディレクトリにも適用されます。ゼロは「決して」を意味します。 + +デフォルト値: `2592000` (30日)。 + +## database_catalog_unused_dir_cleanup_period_sec {#database_catalog_unused_dir_cleanup_period_sec} + +`store/`ディレクトリのガベージをクリーンアップするタスクのパラメータ。 +タスクのスケジューリング期間を設定します。ゼロは「決して」を意味します。 + +デフォルト値: `86400` (1日)。 + +## default_profile {#default-profile} + +デフォルトの設定プロファイル。 + +設定プロファイルはパラメータ`user_config`で指定されたファイルに配置されます。 + +**例** + +```xml +default +``` + +## default_replica_path {#default_replica_path} + +ZooKeeper内のテーブルへのパス。 + +**例** + +```xml +/clickhouse/tables/{uuid}/{shard} +``` + +## default_replica_name {#default_replica_name} + +ZooKeeper内のレプリカ名。 + +**例** + +```xml +{replica} +``` + +## dictionaries_config {#dictionaries_config} + +ディクショナリの設定ファイルへのパス。 + +パス: + +- 絶対パスまたはサーバー設定ファイルからの相対パスを指定してください。 +- パスはワイルドカード\*と?を含むことができます。 + +「[ディクショナリ](../../sql-reference/dictionaries/index.md)」も参照してください。 + +**例** + +```xml +*_dictionary.xml +``` + +## user_defined_executable_functions_config {#user_defined_executable_functions_config} + +実行可能なユーザー定義関数の設定ファイルへのパス。 + +パス: + +- 絶対パスまたはサーバー設定ファイルからの相対パスを指定してください。 +- パスはワイルドカード\*と?を含むことができます。 + +「[実行可能ユーザー定義関数](../../sql-reference/functions/index.md#executable-user-defined-functions)」。も参照してください。 + +**例** + +```xml +*_function.xml +``` + +## dictionaries_lazy_load {#dictionaries_lazy_load} + +ディクショナリの遅延読み込み。 + +`true`の場合、各ディクショナリは初めて使用されたときに読み込まれます。読み込みが失敗した場合、ディクショナリを使用していた関数が例外をスローします。 + +`false`の場合、サーバーは起動時にすべてのディクショナリを読み込みます。 +サーバーは接続を受ける前にすべてのディクショナリが読み込みを完了するまで起動を待ちます +(例外: `wait_dictionaries_load_at_startup`が`false`に設定されている場合 - 下記を参照)。 + +デフォルトは`true`です。 + +**例** + +```xml +true +``` + +## format_schema_path {#format_schema_path} + +入力データのスキームを含むディレクトリへのパス、例えば[CapnProto](../../interfaces/formats.md#capnproto)フォーマットのスキーマ。 + +**例** + +```xml + + format_schemas/ +``` + +## graphite {#graphite} + +データを[Graphite](https://github.com/graphite-project)に送信します。 + +設定: + +- host – Graphiteサーバー。 +- port – Graphiteサーバーのポート。 +- interval – 送信の間隔(秒単位)。 +- timeout – データ送信のタイムアウト(秒単位)。 +- root_path – キーのプレフィックス。 +- metrics – [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics)テーブルからのデータを送信します。 +- events – 規定された期間のデルタデータを[system.events](../../operations/system-tables/events.md#system_tables-events)テーブルから送信します。 +- events_cumulative – [system.events](../../operations/system-tables/events.md#system_tables-events)テーブルから累積データを送信します。 +- asynchronous_metrics – [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics)テーブルからのデータを送信します。 + +複数の``句を設定することができます。例えば、異なるデータを異なる間隔で送信するために使用できます。 + +**例** + +```xml + + localhost + 42000 + 0.1 + 60 + one_min + true + true + false + true + +``` + +## graphite_rollup {#graphite-rollup} + +Graphite用のデータのスリム化の設定。 + +詳細については、[GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md)を参照してください。 + +**例** + +```xml + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + +``` + +## http_port/https_port {#http-porthttps-port} + +サーバーにHTTP(s)で接続するためのポート。 + +`https_port`が指定されている場合は、[openSSL](#openssl)を設定する必要があります。 + +`http_port`が指定されている場合は、セキュリティ設定が無効になります(設定されていれば)。 + +**例** + +```xml +9999 +``` + +## http_server_default_response {#http_server_default_response} + +ClickHouse HTTP(s)サーバーにアクセスした際にデフォルトで表示されるページ。 +デフォルト値は「Ok.」(改行付き)。 + +**例** + +`http://localhost: http_port`にアクセスすると`https://tabix.io/`を開く。 + +```xml + +
    ]]> +
    +``` + +## hsts_max_age {#hsts-max-age} + +HSTSの期限切れ時間を秒単位で設定します。デフォルト値は0で、ClickHouseはHSTSを無効にしています。正の数を設定すると、HSTSが有効になり、max-ageは設定された数になります。 + +**例** + +```xml +600000 +``` + +## mlock_executable {#mlock_executable} + +起動後にmlockallを実行し、最初のクエリのレイテンシーを低下させ、高IO負荷時にClickHouse実行ファイルがページアウトされるのを防ぎます。このオプションを有効にすることをお勧めしますが、起動時間が最大で数秒増加することになります。このパラメータは「CAP_IPC_LOCK」能力がないと機能しませんのでご注意ください。 +**例** + +```xml +false +``` + +## include_from {#include_from} + +置換を含むファイルへのパス。XMLおよびYAML形式がサポートされています。 + +詳細については、「[設定ファイル](../../operations/configuration-files.md#configuration_files)」セクションを参照してください。 + +**例** + +```xml +/etc/metrica.xml +``` + +## interserver_listen_host {#interserver-listen-host} + +ClickHouseサーバー間でデータを交換できるホストの制限。 +Keeperが使用されている場合、異なるKeeperインスタンス間の通信にも同じ制限が適用されます。 +デフォルト値は`listen_host`設定と等しいです。 + +例: + +```xml +::ffff:a00:1 +10.0.0.1 +``` + +## interserver_http_port {#interserver-http-port} + +ClickHouseサーバー間でデータを交換するためのポート。 + +**例** + +```xml +9009 +``` + +## interserver_http_host {#interserver-http-host} + +他のサーバーがこのサーバーにアクセスするために使用できるホスト名。 + +指定しない場合は、`hostname -f`コマンドと同じ方法で定義されます。 + +特定のネットワークインターフェイスからの切り離しに役立ちます。 + +**例** + +```xml +example.clickhouse.com +``` + +## interserver_https_port {#interserver-https-port} + +ClickHouseサーバー間のデータ交換用の`HTTPS`ポート。 + +**例** + +```xml +9010 +``` + +## interserver_https_host {#interserver-https-host} + +`interserver_http_host`に類似しており、`HTTPS`を介して他のサーバーがこのサーバーにアクセスするために使用できるホスト名です。 + +**例** + +```xml +example.clickhouse.com +``` + +## interserver_http_credentials {#server-settings-interserver-http-credentials} + +[レプリケーション](../../engines/table-engines/mergetree-family/replication.md)の間に他のサーバーに接続するために使用されるユーザー名とパスワード。また、サーバーはこれらの資格情報を使用して他のレプリカを認証します。したがって、`interserver_http_credentials`はクラスター内のすべてのレプリカで同じでなければなりません。 + +デフォルトで`interserver_http_credentials`セクションが省略されている場合、レプリケーション中の認証は使用されません。 + +:::note +`interserver_http_credentials`設定は、ClickHouseクライアントの資格情報[設定](../../interfaces/cli.md#configuration_files)には関連しません。 +::: + +:::note +これらの資格情報は、`HTTP`および`HTTPS`を介したレプリケーションに共通です。 +::: + +セクションは次のパラメータを含みます: + +- `user` — ユーザー名。 +- `password` — パスワード。 +- `allow_empty` — `true`の場合、資格情報が設定されていても、他のレプリカが認証なしで接続することが許可されます。`false`の場合、認証なしの接続は拒否されます。デフォルト値は`false`です。 +- `old` — 資格情報を回転させる際に使用される古い`user`と`password`を含みます。複数の`old`セクションを指定可能です。 + +**資格情報のローテーション** + +ClickHouseはすべてのレプリカを停止することなく動的なインタサーバー資格情報のローテーションをサポートします。資格情報は数ステップで変更できます。 + +認証を有効にするには、`interserver_http_credentials.allow_empty`を`true`に設定し、資格情報を追加します。これにより、認証ありおよびなしの接続が許可されます。 + +```xml + + admin + 111 + true + +``` + +すべてのレプリカを構成した後、`allow_empty`を`false`に設定するか、この設定を削除します。これにより、新しい資格情報を使用した認証が必須となります。 + +既存の資格情報を変更するには、ユーザー名とパスワードを`interserver_http_credentials.old`セクションに移動し、新しい値で`user`と`password`を更新します。この時点で、サーバーは新しい資格情報を使用して他のレプリカに接続し、新しい資格情報または古い資格情報のいずれかで接続を受け入れます。 + +```xml + + admin + 222 + + admin + 111 + + + temp + 000 + + +``` + +新しい資格情報がすべてのレプリカに適用されたら、古い資格情報を削除できます。 + +## keep_alive_timeout {#keep-alive-timeout} + +ClickHouseが接続を閉じる前に着信要求を待機する秒数。デフォルトは10秒です。 + +**例** + +```xml +10 +``` + +## max_keep_alive_requests {#max-keep-alive-requests} + +1つのキープアライブ接続を介しての最大リクエスト数。クリックハウスサーバーによって接続が閉じられるまでの数。デフォルトは10000です。 + +**例** + +```xml +10 +``` + +## listen_host {#listen_host} + +リクエストが来ることができるホストの制限。サーバーがすべてに応答するためには、`::`を指定してください。 + +例: + +```xml +::1 +127.0.0.1 +``` + +## listen_try {#listen_try} + +IPv6またはIPv4ネットワークが使用できない場合でも、リスンしようとする際にサーバーが終了しないようにします。 + +例: + +```xml +0 +``` + +## listen_reuse_port {#listen_reuse_port} + +複数のサーバーが同じアドレス:ポートでリスンすることを許可します。リクエストはOSによってランダムなサーバーにルーティングされます。この設定を有効にすることは推奨されません。 + +例: + +```xml +0 +``` + +## listen_backlog {#listen_backlog} + +リスンソケットのバックログ(保留中の接続のキューサイズ)。 + +デフォルト値: `4096`(linux [5.4+](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=19f92a030ca6d772ab44b22ee6a01378a8cb32d4)に準拠)。 + +通常、この値を変更する必要はありません。なぜなら: +- デフォルト値は十分大きく、 +- クライアントの接続を受け入れるためにサーバーには個別のスレッドがあるからです。 + +したがって、ClickHouseサーバーの場合に`TcpExtListenOverflows`(`nstat`から)がゼロ以外で、このカウンタが成長しても、この値を増やす必要があるという意味ではありません。なぜなら: +- 通常、4096が十分でない場合、それは内部のClickHouseスケーリング問題を示しており、問題を報告する方が良いです。 +- その時点でクライアントがいないか、切断されている可能性があるため、その後にサーバーがより多くの接続を処理できるという意味ではありません。 + +例: + +```xml +4096 +``` + +## logger {#logger} + +ログメッセージの位置と形式。 + +キー: + +- `level` – ログレベル。許容される値: `none`(ログをオフにします)、`fatal`、`critical`、`error`、`warning`、`notice`、`information`、 + `debug`、`trace`、`test` +- `log` – ログファイルへのパス。 +- `errorlog` – エラーログファイルへのパス。 +- `size` – 回転ポリシー: ログファイルの最大サイズ(バイト単位)。ログファイルサイズがこのしきい値を超えると、名前が変更されてアーカイブされ、新しいログファイルが作成されます。 +- `count` – 回転ポリシー: ClickHouseが保持する過去のログファイルの最大数。 +- `stream_compress` – ログメッセージをLZ4で圧縮します。有効にするには`1`または`true`を設定します。 +- `console` – ログメッセージをログファイルに書き込まず、代わりにコンソールに表示します。有効にするには`1`または`true`を設定します。デフォルトは + ClickHouseがデーモンモードで実行されていない場合に`1`です。それ以外の場合は`0`。 +- `console_log_level` – コンソール出力のログレベル。`level`にデフォルトします。 +- `formatting` – コンソール出力のログ形式。現在は`json`のみがサポートされています。 +- `use_syslog` - ログ出力をsyslogにも転送します。 +- `syslog_level` - syslogへのログのログレベル。 +- `message_regexp` - この正規表現に一致するメッセージのみをログに記録します。デフォルトは`""`で、フィルタリングなしを示します。 +- `message_regexp_negative` - この正規表現に一致しないメッセージのみをログに記録します。デフォルトは`""`で、フィルタリングなしを示します。 + +**ログ形式の指定子** + +`log`および`errorLog`パス内のファイル名は、生成されるファイル名の下の形式指定子をサポートします(ディレクトリ部分ではサポートされていません)。 + +列「例」は`2023-07-06 18:32:07`時点での出力を示します。 + +| 指定子 | 説明 | 例 | +|-------------|---------------------------------------------------------------------------------------------------------------------|--------------------------| +| %% | リテラル% | % | +| %n | 改行文字 | | +| %t | 水平タブ文字 | | +| %Y | 年を10進数で表したもの, 例: 2017 | 2023 | +| %y | 年の最後の2桁(範囲 [00,99]) | 23 | +| %C | 年の最初の2桁(範囲 [00,99]) | 20 | +| %G | [ISO 8601週ベースの年](https://en.wikipedia.org/wiki/ISO_8601#Week_dates)の4桁, すなわち指定された週が含まれる年。通常%Vと組み合わせて使用します。 | 2023 | +| %g | [ISO 8601週ベースの年](https://en.wikipedia.org/wiki/ISO_8601#Week_dates)の最後の2桁, すなわち指定された週が含まれる年。 | 23 | +| %b | 略称月名, 例: Oct(ロケール依存) | Jul | +| %h | %bの同義 | Jul | +| %B | 完全月名, 例: October(ロケール依存) | July | +| %m | 月を10進数で表したもの(範囲 [01,12]) | 07 | +| %U | 年のうちの週を10進数で表したもの(週の最初の日は日曜日) (範囲 [00,53]) | 27 | +| %W | 年のうちの週を10進数で表したもの(週の最初の日は月曜日) (範囲 [00,53]) | 27 | +| %V | ISO 8601週番号(範囲 [01,53]) | 27 | +| %j | 年のうちの1日を10進数で表したもの(範囲 [001,366]) | 187 | +| %d | 月の1日を0パディングされた10進数で表したもの(範囲 [01,31])。1桁はゼロで前方埋めされます。 | 06 | +| %e | 月の1日をスペースでパディングされた10進数で表したもの(範囲 [1,31])。1桁はスペースで前方埋めされます。 |   6 | +| %a | 略称曜日名, 例: Fri(ロケール依存) | Thu | +| %A | 完全曜日名, 例: Friday(ロケール依存) | Thursday | +| %w | 週の日を整数で表したもの(0が日曜日) (範囲 [0-6]) | 4 | +| %u | 週の日を10進数で表したもの(ISO 8601フォーマット, 月曜日が1) (範囲 [1-7]) | 4 | +| %H | 時間を10進数で表したもの (24時間制)(範囲 [00-23]) | 18 | +| %I | 時間を10進数で表したもの (12時間制)(範囲 [01-12]) | 06 | +| %M | 分を10進数で表したもの(範囲 [00-59]) | 32 | +| %S | 秒を10進数で表したもの(範囲 [00-60]) | 07 | +| %c | 標準日付と時間文字列、例: Sun Oct 17 04:41:13 2010(ロケール依存) | Thu Jul 6 18:32:07 2023 | +| %x | ローカライズされた日付表現(ロケール依存) | 07/06/23 | +| %X | ローカライズされた時刻表現、例: 18:40:20 もしくは 6:40:20 PM(ロケール依存) | 18:32:07 | +| %D | 短い形式の MM/DD/YY 日付、%m/%d/%y と同等 | 07/06/23 | +| %F | 短い形式の YYYY-MM-DD 日付、%Y-%m-%d と同等 | 2023-07-06 | +| %r | ローカライズされた12時間形式の時刻(ロケール依存) | 06:32:07 PM | +| %R | "%H:%M" に相当 | 18:32 | +| %T | "%H:%M:%S" に相当(ISO 8601時間形式) | 18:32:07 | +| %p | ローカライズされた午前午後の指定(ロケール依存) | PM | +| %z | ISO 8601形式でUTCからのオフセット(例: -0430)、タイムゾーン情報がない場合は文字なし | +0800 | +| %Z | ロケール依存のタイムゾーン名または略称、タイムゾーン情報がない場合は文字なし | Z AWST | + +**例** + +``` xml + + trace + /var/log/clickhouse-server/clickhouse-server-%F-%T.log + /var/log/clickhouse-server/clickhouse-server-%F-%T.err.log + 1000M + 10 + true + +``` + +ログメッセージをコンソールにのみ出力するには: + +``` xml + + information + true + +``` + +**レベル別のオーバーライド** + +個々のログ名のログレベルをオーバーライドできます。例えば、"Backup" と "RBAC" の全てのメッセージをミュートにするには。 + +```xml + + + + Backup + none + + + RBAC + none + + + +``` + +**正規表現フィルタリング** + +ログメッセージは `message_regexp` と `message_regexp_negative` を使用して正規表現でフィルタリングできます。これをレベルごとに、または全体として実行できます。グローバルとロガー固有のパターンが指定された場合は、グローバルパターンがオーバーライドされ(無視され)、ロガー固有のパターンのみが適用されます。この状況では、肯定パターンと否定パターンは独立して考慮されます。注意: この機能の使用は若干のパフォーマンス低下を引き起こす可能性があります。 + +```xml + + trace + + .*Trace.* + + + + + executeQuery + .*Read.* + .*from.* + + + +``` + +### syslog + +ログメッセージを syslog にも書き込むには: + +``` xml + + 1 + +
    syslog.remote:10514
    + myhost.local + LOG_LOCAL6 + syslog +
    +
    +``` + +`` のキー: + +- `address` — syslog のアドレスの形式 `host\[:port\]` 。省略された場合、ローカルデーモンが使用されます。 +- `hostname` — ログを送信するホストの名前。オプション。 +- `facility` — syslog の [facility keyword](https://en.wikipedia.org/wiki/Syslog#Facility)。大文字で "LOG_" プレフィックス付きで指定する必要があります。例: `LOG_USER`, `LOG_DAEMON`, `LOG_LOCAL3` など。デフォルト値: `address` が指定された場合 `LOG_USER`, 指定されない場合 `LOG_DAEMON`。 +- `format` - ログメッセージの形式。使用可能な値: `bsd` と `syslog.` + +### ログ形式 + +コンソールログに出力されるログ形式を指定できます。現在、JSONのみがサポートされています。以下はJSONログの出力例です。 + +```json +{ + "date_time": "1650918987.180175", + "thread_name": "#1", + "thread_id": "254545", + "level": "Trace", + "query_id": "", + "logger_name": "BaseDaemon", + "message": "受信した信号 2", + "source_file": "../base/daemon/BaseDaemon.cpp; virtual void SignalListener::run()", + "source_line": "192" +} +``` + +JSONロギングサポートを有効にするには、以下のスニペットを使用します。 + +```xml + + + json + + date_time + thread_name + thread_id + level + query_id + logger_name + message + source_file + source_line + + + +``` + +**JSONログのキー名の変更** + +キー名は、`` タグ内のタグ値を変更することで修正できます。例えば、`DATE_TIME` を `MY_DATE_TIME` に変更するには、`MY_DATE_TIME` を使用します。 + +**JSONログのキーの省略** + +ログプロパティは、プロパティをコメントアウトすることで省略できます。例えば、`query_id` をログに出力したくない場合、`` タグをコメントアウトします。 + +## send_crash_reports {#send_crash_reports} + +[Send] ClickHouse Core Developers Team via [Sentry](https://sentry.io)中の設定を使用して、クラッシュレポートをオプトインで送信する設定。 + +特にプレプロダクション環境での有効化が推奨されます。 + +この機能が正常に動作するには、サーバーがIPv4を介してパブリックインターネットにアクセスできる必要があります(執筆時点ではIPv6はSentryによってサポートされていません)。 + +キー: + +- `enabled` – この機能を有効にするためのブールフラグ。デフォルトは `false`。クラッシュレポートの送信を許可するには `true` に設定します。 +- `send_logical_errors` – `LOGICAL_ERROR` は `assert` のようなもので、ClickHouse のバグです。このブールフラグはこの例外をsentryに送信することを可能にします(デフォルト: `false`)。 +- `endpoint` – クラッシュレポートを送信するためのsentryエンドポイントURLをオーバーライドできます。これには個別のSentryアカウントまたは自己ホスト済みのSentryインスタンスを使用できます。 [Sentry DSN](https://docs.sentry.io/error-reporting/quickstart/?platform=native#configure-the-sdk) 構文を使用します。 +- `anonymize` - クラッシュレポートにサーバーホスト名を添付するのを回避します。 +- `http_proxy` - クラッシュレポート送信用のHTTPプロキシを設定します。 +- `debug` - Sentryクライアントをデバッグモードに設定します。 +- `tmp_path` - 一時的なクラッシュレポート状態を保存するためのファイルシステムパス。 +- `environment` - ClickHouseサーバーが動作している環境の任意の名前。各クラッシュレポートに記載されます。デフォルト値はClickHouseのバージョンに応じて `test` か `prod` です。 + +**推奨使用方法** + +``` xml + + true + +``` + +## macros {#macros} + +レプリケートテーブルのパラメータ置換。 + +レプリケートテーブルが使用されていない場合は省略可能。 + +詳しくは、[Creating replicated tables](../../engines/table-engines/mergetree-family/replication.md#creating-replicated-tables) のセクションを参照してください。 + +**例** + +``` xml + +``` + +## replica_group_name {#replica_group_name} + +データベースReplicatedのレプリカグループ名。 + +Replicatedデータベースによって作成されたクラスターは同じグループ内のレプリカで構成されます。 +DDLクエリは同じグループ内のレプリカのみを待ちます。 + +デフォルトでは空です。 + +**例** + +``` xml +backups +``` + +デフォルト値: ``。 + +## max_open_files {#max-open-files} + +最大のオープンファイル数。 + +デフォルト: `maximum`。 + +このオプションは、macOSで `getrlimit()` 関数が不正確な値を返すために使用を推奨します。 + +**例** + +``` xml +262144 +``` + +## max_table_size_to_drop {#max-table-size-to-drop} + +テーブル削除の制限。 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのサイズが `max_table_size_to_drop`(バイト単位)を超える場合、[DROP](../../sql-reference/statements/drop.md) クエリや [TRUNCATE](../../sql-reference/statements/truncate.md) クエリを使用して削除することはできません。 + +この設定は、ClickHouseサーバーの再起動なしで適用されます。制限を解除する別の方法は、 `/flags/force_drop_table` ファイルを作成することです。 + +デフォルト値: 50 GB。 + +値が0の場合、すべてのテーブルを制限なしに削除できます。 + +**例** + +``` xml +0 +``` + +## max_partition_size_to_drop {#max-partition-size-to-drop} + +パーティションの削除の制限。 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのサイズが `max_partition_size_to_drop`(バイト単位)を超える場合、[DROP PARTITION](../../sql-reference/statements/alter/partition.md#drop-partitionpart) クエリを使用してパーティションを削除できません。 + +この設定は、ClickHouseサーバーの再起動なしで適用されます。制限を解除するもう一つの方法は、 `/flags/force_drop_table` ファイルを作成することです。 + +デフォルト値: 50 GB。 + +値が0の場合、パーティションを制限なしに削除できます。 + +:::note +この制限は、テーブルの削除やテーブルの切り捨てには制限を設けません。詳しくは、[max_table_size_to_drop](#max-table-size-to-drop) を参照してください。 +::: + +**例** + +``` xml +0 +``` + +## max_thread_pool_size {#max-thread-pool-size} + +ClickHouseは、グローバルスレッドプールからクエリを処理するためのスレッドを使用します。クエリを処理するためのアイドルスレッドがない場合、プールに新しいスレッドが作成されます。`max_thread_pool_size` は、プール内の最大スレッド数を制限します。 + +可能な値: + +- 正の整数。 + +デフォルト値: `10000`。 + +**例** + +``` xml +12000 +``` + +## max_thread_pool_free_size {#max-thread-pool-free-size} + +グローバルスレッドプール内の**アイドル**スレッドの数が `max_thread_pool_free_size` を超える場合、ClickHouseは一部のスレッドが占有するリソースを解放し、プールサイズを減少させます。必要に応じてスレッドを再作成できます。 + +可能な値: + +- 正の整数。 + +デフォルト値: `1000`。 + +**例** + +``` xml +1200 +``` + +## thread_pool_queue_size {#thread-pool-queue-size} + +グローバルスレッドプールでスケジュールできるジョブの最大数。キューサイズを増やすと、より大きなメモリ使用につながります。この値を [max_thread_pool_size](#max-thread-pool-size) と同じにしておくことが推奨されます。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +デフォルト値: `10000`。 + +**例** + +``` xml +12000 +``` + +## max_io_thread_pool_size {#max-io-thread-pool-size} + +ClickHouseはIO操作を行うためにIOスレッドプールのスレッドを使用します(例: S3とのインタラクション)。`max_io_thread_pool_size` はプール内のスレッドの最大数を制限します。 + +可能な値: + +- 正の整数。 + +デフォルト値: `100`。 + +## max_io_thread_pool_free_size {#max-io-thread-pool-free-size} + +IOスレッドプール内の**アイドル**スレッドの数が `max_io_thread_pool_free_size` を超える場合、ClickHouseはアイドルスレッドが占有するリソースを解放し、プールサイズを減少させます。必要に応じてスレッドを再作成できます。 + +可能な値: + +- 正の整数。 + +デフォルト値: `0`。 + +## io_thread_pool_queue_size {#io-thread-pool-queue-size} + +IOスレッドプールでスケジュールできるジョブの最大数。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +デフォルト値: `10000`。 + +## max_backups_io_thread_pool_size {#max-backups-io-thread-pool-size} + +ClickHouseはS3バックアップのIO操作を行うためにバックアップIOスレッドプールのスレッドを使用します。`max_backups_io_thread_pool_size` はプール内のスレッドの最大数を制限します。 + +可能な値: + +- 正の整数。 + +デフォルト値: `1000`。 + +## max_backups_io_thread_pool_free_size {#max-backups-io-thread-pool-free-size} + +バックアップIOスレッドプール内の**アイドル**スレッドの数が `max_backup_io_thread_pool_free_size` を超える場合、ClickHouseはアイドルスレッドが占有するリソースを解放し、プールサイズを減少させます。必要に応じてスレッドを再作成できます。 + +可能な値: + +- 正の整数。 +- ゼロ。 + +デフォルト値: `0`。 + +## backups_io_thread_pool_queue_size {#backups-io-thread-pool-queue-size} + +バックアップIOスレッドプールでスケジュールできるジョブの最大数。現在のS3バックアップロジックのため、このキューを無制限にしておくことが推奨されます。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +デフォルト値: `0`。 + +## background_pool_size {#background_pool_size} + +MergeTreeエンジンを使用するテーブルのバックグラウンドマージと変異を実行するスレッド数を設定します。この設定はClickHouseサーバーの起動時に `default` プロファイル設定から後方互換性のためにも適用できます。ランタイム中にスレッド数を増やすことしかできません。スレッド数を減らすにはサーバーを再起動する必要があります。この設定を調整することで、CPUとディスクの負荷を管理できます。プールサイズが小さいほど、CPUとディスクのリソースをより少なく利用しますが、バックグラウンドプロセスはより遅く進行し、最終的にはクエリ性能に影響を与える可能性があります。 + +変更する前に、[number_of_free_entries_in_pool_to_lower_max_size_of_merge](../../operations/settings/merge-tree-settings.md#number-of-free-entries-in-pool-to-lower-max-size-of-merge) や [number_of_free_entries_in_pool_to_execute_mutation](../../operations/settings/merge-tree-settings.md#number-of-free-entries-in-pool-to-execute-mutation) などの関連するMergeTree設定も確認してください。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 16。 + +**例** + +```xml +16 +``` + +## background_merges_mutations_concurrency_ratio {#background_merges_mutations_concurrency_ratio} + +スレッド数と同時に実行できるバックグラウンドマージと変異の数との比率を設定します。例えば、比率が2で `background_pool_size` が16に設定されている場合、ClickHouseは32のバックグラウンドマージを同時に実行できます。これは、バックグラウンド操作が一時停止され延期される可能性があるからです。これにより小さなマージにより高い実行優先度が与えられる必要があります。この比率をランタイム中に増やすことしかできません。比率を下げるにはサーバーを再起動する必要があります。`background_pool_size` 設定と同様に、`background_merges_mutations_concurrency_ratio` は `default` プロファイルから適用でき、後方互換性を保ちます。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 2。 + +**例** + +```xml +3 +``` + +## merges_mutations_memory_usage_soft_limit {#merges_mutations_memory_usage_soft_limit} + +マージと変異の操作を実行するために使用が許可されているRAMの制限を設定します。ゼロは無制限を意味します。ClickHouseがこの制限に達すると、新しいバックグラウンドマージまたは変異操作をスケジュールしませんが、すでにスケジュールされているタスクは実行し続けます。 + +可能な値: + +- 任意の正の整数。 + +**例** + +```xml +0 +``` + +## merges_mutations_memory_usage_to_ram_ratio {#merges_mutations_memory_usage_to_ram_ratio} + +デフォルトの `merges_mutations_memory_usage_soft_limit` 値は `memory_amount * merges_mutations_memory_usage_to_ram_ratio` として計算されます。 + +デフォルト値: `0.5`。 + +**関連項目** + +- [max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) +- [merges_mutations_memory_usage_soft_limit](#merges_mutations_memory_usage_soft_limit) + +## async_load_databases {#async_load_databases} + +データベースとテーブルの非同期ロード。 + +`true` の場合、`Ordinary`、`Atomic`、`Replicated` エンジンを持つすべての非システムデータベースがClickHouseサーバーの起動後に非同期でロードされます。`system.asynchronous_loader` テーブル、`tables_loader_background_pool_size`、`tables_loader_foreground_pool_size` サーバー設定を参照してください。まだロードされていないテーブルにアクセスしようとするクエリは、正確にこのテーブルが起動されるまで待機します。ロードジョブが失敗した場合、そのクエリはエラーを再スローします(`async_load_databases = false` の場合にサーバー全体をシャットダウンする代わりに)。少なくとも1つのクエリによって待機されているテーブルは高い優先度でロードされます。データベースに関するDDLクエリは正確にそのデータベースが起動するまで待機します。待機クエリの総数を制限するために `max_waiting_queries` 設定を考慮してください。 + +`false` の場合、サーバーが起動した際にすべてのデータベースがロードされます。 + +デフォルトは `false` です。 + +**例** + +``` xml +true +``` + +## async_load_system_database {#async_load_system_database} + +システムテーブルの非同期ロード。`system` データベース内に大量のログテーブルやパーツがある場合に便利です。`async_load_databases` 設定とは独立しています。 + +`true` に設定すると、`Ordinary`、`Atomic`、`Replicated` エンジンを持つすべてのシステムデータベースがClickHouseサーバーの起動後に非同期でロードされます。`system.asynchronous_loader` テーブル、`tables_loader_background_pool_size` 、 `tables_loader_foreground_pool_size` サーバー設定を参照してください。まだロードされていないシステムテーブルにアクセスしようとするクエリは、正確にこのテーブルが起動されるまで待機します。少なくとも1つのクエリによって待機されているテーブルは高い優先度でロードされます。また、待機クエリの総数を制限するために `max_waiting_queries` 設定を考慮してください。 + +`false` の場合、システムデータベースはサーバーの開始前にロードされます。 + +デフォルトは `false` です。 + +**例** + +``` xml +true +``` + +## tables_loader_foreground_pool_size {#tables_loader_foreground_pool_size} + +フォアグラウンドプールでロードジョブを実行するスレッド数を設定します。フォアグラウンドプールは、サーバーがポートのリッスンを開始する前にテーブルを同期的にロードし、テーブルのロードを待機しているクエリを処理するために使用されます。フォアグラウンドプールはバックグラウンドプールよりも優先度が高いです。フォアグラウンドプールでジョブが実行中の場合、バックグラウンドプールでジョブが開始されません。 + +可能な値: + +- 任意の正の整数。 +- ゼロ。利用可能なすべてのCPUを使用します。 + +デフォルト値: 0。 + +## tables_loader_background_pool_size {#tables_loader_background_pool_size} + +バックグラウンドプールで非同期ロードジョブを実行するスレッド数を設定します。バックグラウンドプールは、サーバーの開始後に、テーブルのロードが待機されていない場合にテーブルを非同期でロードするために使用されます。テーブルが多い場合、バックグラウンドプールのスレッド数を低く保つことが利益をもたらす可能性があります。この場合、同時クエリ実行のためのCPUリソースが確保されます。 + +可能な値: + +- 任意の正の整数。 +- ゼロ。利用可能なすべてのCPUを使用します。 + +デフォルト値: 0。 + +## merge_tree {#merge_tree} + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの微調整。 + +詳しくは、MergeTreeSettings.h ヘッダーファイルを参照してください。 + +**例** + +``` xml + + 5 + +``` + +## metric_log {#metric_log} + +デフォルトでは無効です。 + +**有効化** + +メトリクス履歴収集を手動でオンにするには [`system.metric_log`](../../operations/system-tables/metric_log.md) を使用し、次の内容で `/etc/clickhouse-server/config.d/metric_log.xml` を作成します。 + +``` xml + + + system + metric_log
    + 7500 + 1000 + 1048576 + 8192 + 524288 + false +
    +
    +``` + +**無効化** + +`metric_log` 設定を無効にするには、次の内容で `/etc/clickhouse-server/config.d/disable_metric_log.xml` を作成します。 + +``` xml + + + +``` + +## replicated_merge_tree {#replicated_merge_tree} + +[ReplicatedMergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの微調整。 + +この設定は優先順位が高いです。 + +詳しくは、MergeTreeSettings.h ヘッダーファイルを参照してください。 + +**例** + +``` xml + + 5 + +``` + +## openSSL {#openssl} + +SSLクライアント/サーバー設定。 + +SSLのサポートは `libpoco` ライブラリにより提供されます。利用可能な設定オプションは [SSLManager.h](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/SSLManager.h) に説明されています。デフォルト値は [SSLManager.cpp](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/src/SSLManager.cpp) にあります。 + +サーバー/クライアント設定のキー: + +- privateKeyFile – PEM証明書の秘密鍵ファイルへのパス。このファイルには同時に鍵と証明書が含まれることがあります。 +- certificateFile – PEM形式のクライアント/サーバー証明書ファイルへのパス。`privateKeyFile` が証明書を含む場合は省略可能です。 +- caConfig (デフォルト: なし) – 信頼できるCA証明書を含むファイルまたはディレクトリへのパス。これがファイルを指す場合、PEM形式であり複数のCA証明書を含むことが可能です。ディレクトリを指す場合、CA証明書ごとに一つの.pemファイルを含む必要があります。ファイル名はCAサブジェクト名のハッシュ値で検索されます。詳細は [SSL_CTX_load_verify_locations](https://www.openssl.org/docs/man3.0/man3/SSL_CTX_load_verify_locations.html) のマニュアルページを参照してください。 +- verificationMode (デフォルト: relaxed) – ノードの証明書を確認する方法。詳細は [Context](https://github.com/ClickHouse-Extras/poco/blob/master/NetSSL_OpenSSL/include/Poco/Net/Context.h) クラスの説明を参照してください。使用可能な値: `none`, `relaxed`, `strict`, `once`. +- verificationDepth (デフォルト: 9) – 検証チェーンの最大長。証明書チェーンの長さが設定値を超えると検証は失敗します。 +- loadDefaultCAFile (デフォルト: true) – OpenSSLのビルトインCA証明書を使用するかどうか。ClickHouseはビルトインCA証明書がファイル `/etc/ssl/cert.pem`(もしくはディレクトリ `/etc/ssl/certs`)にある、または環境変数 `SSL_CERT_FILE`(もしくは `SSL_CERT_DIR`)で指定されたファイル(もしくはディレクトリ)にあると見なします。 +- cipherList (デフォルト: `ALL:!ADH:!LOW:!EXP:!MD5:!3DES:@STRENGTH`) - 対応するOpenSSLの暗号化方式。 +- cacheSessions (デフォルト: false) – セッションのキャッシュを有効または無効にします。`sessionIdContext` と組み合わせて使用する必要があります。受容可能な値: `true`, `false`. +- sessionIdContext (デフォルト: `${application.name}`) – サーバーが各生成された識別子に追加するランダム文字列のユニークセット。文字列の長さは `SSL_MAX_SSL_SESSION_ID_LENGTH` を超えてはなりません。このパラメータは、セッションをキャッシュするサーバーとクライアントがキャッシュを要求する場合に役立ちます。デフォルト値: `${application.name}`. +- sessionCacheSize (デフォルト: [1024\*20](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1978)) – サーバーがキャッシュするセッションの最大数。値が0の場合、無制限になります。 +- sessionTimeout (デフォルト: [2h](https://github.com/ClickHouse/boringssl/blob/master/include/openssl/ssl.h#L1926)) – サーバーでセッションをキャッシュする時間。 +- extendedVerification (デフォルト: false) – 有効化されている場合、証明書のCNまたはSANがピアのホスト名と一致することを確認します。 +- requireTLSv1 (デフォルト: false) – TLSv1接続を要求します。受容可能な値: `true`, `false`. +- requireTLSv1_1 (デフォルト: false) – TLSv1.1接続を要求します。受容可能な値: `true`, `false`. +- requireTLSv1_2 (デフォルト: false) – TLSv1.2接続を要求します。受容可能な値: `true`, `false`. +- fips (デフォルト: false) – OpenSSLのFIPSモードをアクティブにします。ライブラリのOpenSSLバージョンがFIPSをサポートしている場合に対応しています。 +- privateKeyPassphraseHandler (デフォルト: `KeyConsoleHandler`)– 秘密鍵にアクセスするためのパスフレーズを要求するクラス(PrivateKeyPassphraseHandlerサブクラス)。例: ``, `KeyFileHandler`, `test`, ``. +- invalidCertificateHandler (デフォルト: `RejectCertificateHandler`) – 無効な証明書を確認するためのクラス(CertificateHandlerサブクラス)。例: ` RejectCertificateHandler `. +- disableProtocols (デフォルト: "") – 使用が許可されていないプロトコル。 +- preferServerCiphers (デフォルト: false) – クライアントに対してサーバー暗号化方式を優先します。 + +**設定例** + +``` xml + + + + /etc/clickhouse-server/server.crt + /etc/clickhouse-server/server.key + + /etc/clickhouse-server/dhparam.pem + none + true + true + sslv2,sslv3 + true + + + true + true + sslv2,sslv3 + true + + + + RejectCertificateHandler + + + +``` + +## part_log {#part-log} + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) に関連するイベントのロギング。たとえば、データの追加やマージ。このログを使用してマージアルゴリズムをシミュレートし、その特性を比較できます。また、マージプロセスを視覚化できます。 + +ログは [system.part_log](../../operations/system-tables/part_log.md#system_tables-part-log) テーブルに記録され、別のファイルには記録されません。このテーブルの名前は `table` パラメーターで構成可能です(以下を参照)。 + +ロギングを構成するには、以下のパラメーターを使用します: + +- `database` – データベース名。 +- `table` – システムテーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` – メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプすべきかどうかを示す。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +**例** + +``` xml + + system + part_log
    + toMonday(event_date) + 7500 + 1048576 + 8192 + 524288 + false +
    +``` + +## path {#path} + +データを含むディレクトリへのパス。 + +:::note +トレイリングスラッシュは必須です。 +::: + +**例** + +``` xml +/var/lib/clickhouse/ +``` + +## query_log {#query-log} + +[log_queries=1](../../operations/settings/settings.md) 設定を使用して受信したクエリのロギング設定。 + +クエリは、 [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) テーブルに記録され、別のファイルには記録されません。テーブルの名前を以下の `table` パラメーターで変更できます。 + +ロギングを構成するには、以下のパラメーターを使用します: + +- `database` – データベース名。 +- `table` – クエリが記録されるシステムテーブルの名前。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` – メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかの指示。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +テーブルが存在しない場合、ClickHouseはそれを作成します。ClickHouseサーバーが更新された際にクエリログの構造が変更された場合、古い構造のテーブルはリネームされ、新しいテーブルが自動的に作成されます。 + +**例** + +``` xml + + system + query_log
    + Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 30 day + 7500 + 1048576 + 8192 + 524288 + false +
    +``` + +# query_metric_log {#query_metric_log} + +デフォルトでは無効です。 + +**有効化** + +メトリクス履歴収集を手動でオンにするには [`system.query_metric_log`](../../operations/system-tables/query_metric_log.md) を使用し、次の内容で `/etc/clickhouse-server/config.d/query_metric_log.xml` を作成します。 + +``` xml + + + system + query_metric_log
    + 7500 + 1000 + 1048576 + 8192 + 524288 + false +
    +
    +``` + +**無効化** + +`query_metric_log` 設定を無効にするには、次の内容で `/etc/clickhouse-server/config.d/disable_query_metric_log.xml` を作成します。 + +``` xml + + + +``` + +## query_cache {#server_configuration_parameters_query-cache} + +[クエリキャッシュ](../query-cache.md) の設定。 + +次の設定が使用可能です: + +- `max_size_in_bytes`: キャッシュの最大サイズ(バイト単位)。0はクエリキャッシュが無効であることを意味します。デフォルト値: `1073741824`(1 GiB)。 +- `max_entries`: キャッシュに保存される `SELECT` クエリ結果の最大数。デフォルト値: `1024`。 +- `max_entry_size_in_bytes`: キャッシュに保存される `SELECT` クエリ結果が持つ可能な最大サイズ(バイト単位)。デフォルト値: `1048576`(1 MiB)。 +- `max_entry_size_in_rows`: キャッシュに保存される `SELECT` クエリ結果が持つ可能な最大行数。デフォルト値: `30000000`(3000万)。 + +変更された設定は直ちに適用されます。 + +:::note +クエリキャッシュのデータはDRAMに割り当てられます。メモリが不足している場合は、`max_size_in_bytes` の値を小さく設定するか、クエリキャッシュを完全に無効にしてください。 +::: + +**例** + +```xml + + 1073741824 + 1024 + 1048576 + 30000000 + +``` + +## query_thread_log {#query_thread_log} + +[log_query_threads=1](../../operations/settings/settings.md#log-query-threads) 設定を使用して受信したクエリのスレッドをロギングするための設定。 + +クエリは [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) テーブルに記録され、別のファイルには記録されません。テーブルの名前を以下の `table` パラメーターで変更できます。 + +ロギングを構成するには、以下のパラメーターを使用します: + +- `database` – データベース名。 +- `table` – クエリが記録されるシステムテーブルの名前。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` – メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかの指示。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +テーブルが存在しない場合、ClickHouseはそれを作成します。ClickHouseサーバーが更新された際にクエリスレッドログの構造が変更された場合、古い構造のテーブルはリネームされ、新しいテーブルが自動的に作成されます。 + +**例** + +``` xml + + system + query_thread_log
    + toMonday(event_date) + 7500 + 1048576 + 8192 + 524288 + false +
    +``` + +## query_views_log {#query_views_log} + +[log_query_views=1](../../operations/settings/settings.md#log-query-views) 設定を使用して受信したクエリに依存するビュー(ライブビュー、Materialized View など)をロギングするための設定。 + +クエリは [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) テーブルに記録され、別のファイルには記録されません。テーブルの名前を以下の `table` パラメーターで変更できます。 + +ロギングを構成するには、以下のパラメーターを使用します: + +- `database` – データベース名。 +- `table` – クエリが記録されるシステムテーブルの名前。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` – メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかの指示。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +テーブルが存在しない場合、ClickHouseはそれを作成します。ClickHouseサーバーが更新された際にクエリビューのログの構造が変更された場合、古い構造のテーブルはリネームされ、新しいテーブルが自動的に作成されます。 + +**例** + +``` xml + + system + query_views_log
    + toYYYYMM(event_date) + 7500 + 1048576 + 8192 + 524288 + false +
    +``` + +## text_log {#text_log} + +テキストメッセージをログに記録するための [text_log](../../operations/system-tables/text_log.md#system_tables-text_log) システムテーブルの設定。 + +パラメータ: + +- `level` — テーブルに保存される最大メッセージレベル(デフォルトは `Trace`)。 +- `database` — データベース名。 +- `table` — テーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` — メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかを示す。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +**例** +```xml + + + notice + system + text_log
    + 7500 + 1048576 + 8192 + 524288 + false + + Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 30 day +
    +
    +``` + +## trace_log {#trace_log} + +[trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log) システムテーブルの操作に関する設定。 + +パラメータ: + +- `database` — テーブルを保存するためのデータベース。 +- `table` — テーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/index.md)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` — メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +デフォルトのサーバー構成ファイル `config.xml` には、以下の設定セクションが含まれます。 + +``` xml + + system + trace_log
    + toYYYYMM(event_date) + 7500 + 1048576 + 8192 + 524288 + false +
    +``` + +## asynchronous_insert_log {#asynchronous_insert_log} + +非同期インサートを記録するための [asynchronous_insert_log](../../operations/system-tables/asynchronous_insert_log.md#system_tables-asynchronous_insert_log) システムテーブルの設定。 + +パラメータ: + +- `database` — データベース名。 +- `table` — テーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` — メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかを示す。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) + +**例** + +```xml + + + system + asynchronous_insert_log
    + 7500 + toYYYYMM(event_date) + 1048576 + 8192 + 524288 + false + +
    +
    +``` + +## crash_log {#crash_log} + +[crash_log](../../operations/system-tables/crash-log.md) システムテーブルの操作に関する設定。 + +パラメータ: + +- `database` — テーブルを保存するためのデータベース。 +- `table` — テーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/index.md)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` — メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかを示す。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション) +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md/#settings)(オプション)。 + +デフォルトのサーバー構成ファイル `config.xml` には、以下の設定セクションが含まれます。 + +``` xml + + system + crash_log
    + toYYYYMM(event_date) + 7500 + 1024 + 1024 + 512 + false +
    +``` + +## backup_log {#backup_log} + +`BACKUP` および `RESTORE` 操作を記録するための [backup_log](../../operations/system-tables/backup_log.md) システムテーブルの設定。 + +パラメータ: + +- `database` — データベース名。 +- `table` — テーブル名。 +- `partition_by` — システムテーブルの [カスタムパーティションキー](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)。`engine` が定義されている場合は使用できません。 +- `order_by` - システムテーブルの [カスタムソートキー](../../engines/table-engines/mergetree-family/mergetree.md#order_by)。`engine` が定義されている場合は使用できません。 +- `engine` - システムテーブルの [MergeTreeエンジン定義](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。`partition_by` または `order_by` が定義されている場合は使用できません。 +- `flush_interval_milliseconds` — メモリ中のバッファからテーブルにデータをフラッシュするための間隔。 +- `max_size_rows` – ログの最大行数。未フラッシュのログ数が最大サイズに達すると、ログはディスクにダンプされます。 +デフォルト: 1048576。 +- `reserved_size_rows` – ログのために事前に割り当てられたメモリサイズ(行数)。 +デフォルト: 8192。 +- `buffer_size_rows_flush_threshold` – 行数のしきい値で、これに達すると、ログをバックグラウンドでディスクにフラッシュします。 +デフォルト: `max_size_rows / 2`。 +- `flush_on_crash` - クラッシュ時にログをディスクにダンプするかどうかを示す。 +デフォルト: false。 +- `storage_policy` – テーブルで使用するストレージポリシーの名前(オプション)。 +- `settings` - MergeTreeの動作を制御する [追加パラメーター](../../engines/table-engines/mergetree-family/mergetree.md#settings)(オプション)。 + +**例** + +```xml + + +``` +```xml +system +backup_log
    +1000 +toYYYYMM(event_date) +1048576 +8192 +524288 +false + +
    +
    +``` + +## query_masking_rules {#query-masking-rules} + +正規表現に基づくルールで、クエリや全てのログメッセージに適用され、サーバーログである`system.query_log`、`system.text_log`、`system.processes`テーブル、およびクライアントに送信されるログに保存される前に適用されます。これにより、SQLクエリからの機密データ(名前、メール、個人識別子やクレジットカード番号など)がログに漏洩するのを防ぐことができます。 + +**例** + +```xml + + + hide SSN + (^|\D)\d{3}-\d{2}-\d{4}($|\D) + 000-00-0000 + + +``` + +設定フィールド: +- `name` - ルールの名前(オプショナル) +- `regexp` - RE2互換の正規表現(必須) +- `replace` - 機密データのための置換文字列(オプショナル、デフォルトでは六つのアスタリスク) + +マスキングルールは、誤った形式のクエリや非解析可能なクエリからの機密データの漏洩を防ぐために、クエリ全体に適用されます。 + +`system.events`テーブルには、全体のクエリマスキングルールの一致数を示すカウンター`QueryMaskingRulesMatch`があります。 + +分散クエリ用には、各サーバーを別々に設定する必要があります。そうしないと、他のノードに渡されるサブクエリがマスキングされずに保存されます。 + +## remote_servers {#server-settings-remote-servers} + +[分散テーブル](../../engines/table-engines/special/distributed.md)エンジンおよび`cluster`テーブル関数で使用されるクラスターの設定。 + +**例** + +```xml + +``` + +`incl`属性の値については、セクション「[設定ファイル](../../operations/configuration-files.md#configuration_files)」を参照してください。 + +**参照** + +- [skip_unavailable_shards](../../operations/settings/settings.md#skip_unavailable_shards) +- [クラスター検出](../../operations/cluster-discovery.md) +- [レプリケーテッドデータベースエンジン](../../engines/database-engines/replicated.md) + +## timezone {#timezone} + +サーバーのタイムゾーン。 + +UTCのタイムゾーンまたは地理的な場所のIANA識別子として指定します(例えば、Africa/Abidjan)。 + +タイムゾーンは、DateTimeフィールドをテキスト形式で出力する際(画面表示やファイルへの出力)や、文字列からDateTimeを取得する際に、文字列とDateTime形式の間の変換に必要です。また、入力パラメータにタイムゾーンが指定されていない場合は、時間と日付を操作する関数で使用されます。 + +**例** + +```xml +Asia/Istanbul +``` + +**関連情報** + +- [session_timezone](../settings/settings.md#session_timezone) + +## tcp_port {#tcp_port} + +TCPプロトコルを介してクライアントと通信するためのポート。 + +**例** + +```xml +9000 +``` + +## tcp_port_secure {#tcp_port_secure} + +クライアントとのセキュア通信のためのTCPポート。[OpenSSL](#openssl)設定とともに使用してください。 + +**可能な値** + +正の整数。 + +**デフォルト値** + +```xml +9440 +``` + +## mysql_port {#mysql_port} + +MySQLプロトコルを介してクライアントと通信するためのポート。 + +**可能な値** + +リッスンするポート番号を指定する正の整数、または無効にするための空の値。 + +例 + +```xml +9004 +``` + +## postgresql_port {#postgresql_port} + +PostgreSQLプロトコルを介してクライアントと通信するためのポート。 + +**可能な値** + +リッスンするポート番号を指定する正の整数、または無効にするための空の値。 + +例 + +```xml +9005 +``` + +## tmp_path {#tmp-path} + +大規模なクエリ処理のための一時データを保存するローカルファイルシステム上のパス。 + +:::note +- 一時データの保存先を設定するためのオプションは、`tmp_path` 、`tmp_policy`、`temporary_data_in_cache`の一つしか使用できません。 +- トレーリングスラッシュは必須です。 +::: + +**例** + +```xml +/var/lib/clickhouse/tmp/ +``` + +## user_files_path {#user_files_path} + +ユーザーファイルを含むディレクトリ。[file()](../../sql-reference/table-functions/file.md)テーブル関数、[fileCluster()](../../sql-reference/table-functions/fileCluster.md)テーブル関数で使用されます。 + +**例** + +```xml +/var/lib/clickhouse/user_files/ +``` + +## user_scripts_path {#user_scripts_path} + +ユーザースクリプトファイルを含むディレクトリ。可執行ユーザー定義関数[Executable User Defined Functions](../../sql-reference/functions/index.md#executable-user-defined-functions)で使用されます。 + +**例** + +```xml +/var/lib/clickhouse/user_scripts/ +``` + +## user_defined_path {#user_defined_path} + +ユーザー定義ファイルを含むディレクトリ。[SQLユーザー定義関数](../../sql-reference/functions/index.md#user-defined-functions)で使用されます。 + +**例** + +```xml +/var/lib/clickhouse/user_defined/ +``` + +## users_config {#users-config} + +以下を含むファイルのパス: + +- ユーザー設定。 +- アクセス権。 +- 設定プロファイル。 +- クオータ設定。 + +**例** + +```xml +users.xml +``` + +## wait_dictionaries_load_at_startup {#wait_dictionaries_load_at_startup} + +この設定により、`dictionaries_lazy_load`が`false`の場合の動作を指定できます。 +(`dictionaries_lazy_load`が`true`の場合、この設定は何にも影響しません。) + +`wait_dictionaries_load_at_startup`が`false`の場合、サーバーは起動時にすべてのDictionaryの読み込みを開始し、読み込みと並行して接続を受け入れます。 +Dictionaryが初めてクエリに使用されると、そのクエリはDictionaryが読み込まれるまで待機します。 +`wait_dictionaries_load_at_startup`を`false`に設定すると、ClickHouseの起動が速くなる可能性がありますが、一部のクエリは遅く実行される可能性があります(Dictionaryの読み込みを待機する必要があるためです)。 + +`wait_dictionaries_load_at_startup`が`true`の場合、サーバーはすべてのDictionaryの読み込みが完了するまで起動時に待機し(正常に読み込まれるかどうかは問わず)、その後に接続を受け入れるようになります。 + +デフォルトは`true`です。 + +**例** + +```xml +true +``` + +## zookeeper {#server-settings_zookeeper} + +ClickHouseが[ZooKeeper](http://zookeeper.apache.org/)クラスターと連携するために必要な設定を含んでいます。 + +ClickHouseは、レプリケーテッドテーブルを使用する際にレプリカのメタデータを保存するためにZooKeeperを使用します。レプリケーテッドテーブルを使用しない場合、このパラメータセクションは省略できます。 + +このセクションには以下のパラメータが含まれます: + +- `node` — ZooKeeperエンドポイント。複数のエンドポイントを設定できます。 + + 例: + +```xml + + example_host + 2181 + +``` + + `index`属性は、ZooKeeperクラスターに接続しようとするときのノードの順序を指定します。 + +- `session_timeout_ms` — クライアントセッションの最大タイムアウトをミリ秒で指定。 +- `operation_timeout_ms` — 1つの操作の最大タイムアウトをミリ秒で指定。 +- `root` — ClickHouseサーバーが使用するznodeのルートとして使用される[znode](http://zookeeper.apache.org/doc/r3.5.5/zookeeperOver.html#Nodes+and+ephemeral+nodes)。オプション。 +- `fallback_session_lifetime.min` - zookeeper_load_balancing戦略によって解決された最初のzookeeperホストが利用できない場合、zookeeperセッションの寿命をフォールバックノードに限定。これは負荷分散目的で、特定のzookeeperホストへの過剰な負荷を避けるために行われます。この設定はフォールバックセッションの最小期間を設定します。秒で設定。オプション。デフォルトは3時間。 +- `fallback_session_lifetime.max` - zookeeper_load_balancing戦略によって解決された最初のzookeeperホストが利用できない場合、zookeeperセッションの寿命をフォールバックノードに限定。これは負荷分散目的で、特定のzookeeperホストへの過剰な負荷を避けるために行われます。この設定はフォールバックセッションの最大期間を設定します。秒で設定。オプション。デフォルトは6時間。 +- `identity` — ClickHouseサーバーが要求されたznodeにアクセスするために必要なユーザーとパスワード。オプション。 +- zookeeper_load_balancing - ZooKeeperノードの選択アルゴリズムを指定。 + * random - ZooKeeperノードをランダムに選択。 + * in_order - 最初のZooKeeperノードを選択し、利用できない場合は次のノードを選択。 + * nearest_hostname - サーバーのホスト名に最も近いホスト名を持つZooKeeperノードを選択、ホスト名は名前の接頭辞で比較されます。 + * hostname_levenshtein_distance - nearest_hostnameと同じですが、レーベンシュタイン距離形式でホスト名を比較。 + * first_or_random - 最初のZooKeeperノードを選択し、利用できない場合は残るZooKeeperノードをランダムに選択。 + * round_robin - 最初のZooKeeperノードを選択し、再接続が発生すると次のノードを選択。 +- `use_compression` — セキュリティープロトコルにおいて、Keeperプロトコル内の圧縮を有効にします。 + +**設定の例** + +```xml + + + example1 + 2181 + + + example2 + 2181 + + 30000 + 10000 + + /path/to/zookeeper/node + + user:password + + random + +``` + +**関連リンク** + +- [レプリケーション](../../engines/table-engines/mergetree-family/replication.md) +- [ZooKeeperプログラマーズガイド](http://zookeeper.apache.org/doc/current/zookeeperProgrammers.html) +- [ClickHouseとZookeeper間のオプションでのセキュア通信](../ssl-zookeeper.md#secured-communication-with-zookeeper) + +## use_minimalistic_part_header_in_zookeeper {#server-settings-use_minimalistic_part-header-in-zookeeper} + +ZooKeeperにおけるデータパートヘッダーの保存方法。 + +この設定は`MergeTree`ファミリーにのみ適用されます。次の方法で指定できます: + +- `config.xml`ファイルの[merge_tree](#merge_tree)セクションでのグローバル指定。 + + ClickHouseはサーバー上の全てのテーブルに対してこの設定を使用します。いつでも設定を変更できます。既存のテーブルは設定が変更されたときに動作を変更します。 + +- 各テーブルごと。 + + テーブルを作成するときに、対応する[エンジン設定](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)を指定します。この設定を持つ既存のテーブルの動作は、グローバル設定が変更されても変わりません。 + +**可能な値** + +- 0 — 機能はオフです。 +- 1 — 機能はオンです。 + +`use_minimalistic_part_header_in_zookeeper = 1`の場合、[レプリケーテッド](../../engines/table-engines/mergetree-family/replication.md)テーブルは、単一の`znode`を使用してデータパートのヘッダーをコンパクトに保存します。テーブルに多くのカラムが含まれている場合、この保存方法はZooKeeper内で保存されるデータのボリュームを大幅に減少させます。 + +:::note +`use_minimalistic_part_header_in_zookeeper = 1`を適用した後、ClickHouseサーバーをこの設定をサポートしないバージョンにダウングレードすることはできません。クラスター内のサーバーをアップグレードする際には慎重に行ってください。一度にすべてのサーバーをアップグレードすることは避けてください。ClickHouseの新しいバージョンをテスト環境またはクラスター内の一部のサーバーでテストすることがより安全です。 + +この設定で既に保存されたデータパートヘッダーは、以前の(非コンパクトな)表現に復元することはできません。 +::: + +**デフォルト値:** 0。 + +## distributed_ddl {#server-settings-distributed_ddl} + +クラスター上で[分散DDLクエリ](../../sql-reference/distributed-ddl.md)(CREATE、DROP、ALTER、RENAME)を実行します。 +[ZooKeeper](#server-settings_zookeeper)が有効な場合にのみ機能します。 + +``内で構成可能な設定は次のとおりです: + +- **path**: Keeper内で分散DDLクエリのための`task_queue`のパス +- **profile**: DDLクエリを実行するために使用されるプロファイル +- **pool_size**: 同時に実行できる`ON CLUSTER`クエリの数 +- **max_tasks_in_queue**: キュー内に存在できるタスクの最大数。デフォルトは1,000 +- **task_max_lifetime**: ノードの年齢がこの値を超えた場合に削除。デフォルトは`7 * 24 * 60 * 60`(1週間) +- **cleanup_delay_period**: 最後のクリーンアップがこの期間以来行われていない場合、新しいノードイベントを受信した後に清掃が開始されます。デフォルトは60秒 + +**例** + +```xml + + + /clickhouse/task_queue/ddl + + + default + + + 1 + + + + 604800 + + + 60 + + + 1000 + +``` + +## access_control_path {#access_control_path} + +SQLコマンドによって作成されたユーザーやロールの設定をClickHouseサーバーが保存するフォルダへのパス。 + +デフォルト値: `/var/lib/clickhouse/access/`。 + +**関連情報** + +- [アクセス制御とアカウント管理](../../guides/sre/user-management/index.md#access-control) + +## user_directories {#user_directories} + +設定ファイルに含まれるセクション: +- 事前定義されたユーザーを含む設定ファイルへのパス。 +- SQLコマンドによって作成されたユーザーが保存されるフォルダへのパス。 +- SQLコマンドによって作成され、複製されたユーザーが保存されるZooKeeperノードのパス(エクスペリメンタル)。 + +このセクションが指定されている場合、[`users_config`](../../operations/server-configuration-parameters/settings.md#users-config)および[`access_control_path`](../../operations/server-configuration-parameters/settings.md#access_control_path)のパスは使用されません。 + +`user_directories`セクションは任意の数の項目を含むことができ、項目の順序はその優先順位を意味します(上位の項目は優先順位が高い)。 + +**例** + +```xml + + + /etc/clickhouse-server/users.xml + + + /var/lib/clickhouse/access/ + + +``` + +ユーザー、ロール、行ポリシー、クオータ、プロファイルはZooKeeperにも保存できます: + +```xml + + + /etc/clickhouse-server/users.xml + + + /clickhouse/access/ + + +``` + +`memory`セクション — 情報の保存をメモリにのみ行い、ディスクへの書き込みを行わない、`ldap`セクション — 情報の保存をLDAPサーバーに依存する、というセクションも定義できます。 + +LDAPサーバーをリモートユーザーディレクトリとして、ローカルに定義されていないユーザーとして追加するには、単一の`ldap`セクションを指定し、以下のパラメータを定義します: +- `server` — `ldap_servers`設定セクションで定義されたLDAPサーバー名の一つ。このパラメータは必須で空にできません。 +- `roles` — LDAPサーバーから取得した各ユーザーに割り当てられるローカルで定義されたロールのリストを持つセクション。ロールが指定されていない場合、認証後ユーザーは何のアクションも実行できません。列挙されたロールのいずれかが認証時にローカルで定義されていない場合、認証は不正なパスワードであるかのように失敗します。 + +**例** + +```xml + + my_ldap_server + + + + + +``` + +## total_memory_profiler_step {#total-memory-profiler-step} + +メモリのピーク割り当て手順ごとにスタックトレースを取得するメモリサイズ(バイト単位)を設定します。データは`query_id`が空文字列に等しい`system.trace_log`システムテーブルに保存されます。 + +可能な値: + +- 正の整数。 + +デフォルト値:`4194304`。 + +## total_memory_tracker_sample_probability {#total-memory-tracker-sample-probability} + +ランダム割り当ておよび開放の収集を有効にし、`system.trace_log`システムテーブルに`MemorySample`として指定された確率で書き込みます。確率は、割り当てまたは開放時のサイズに関係なく、各操作に適用されます。事前にトラッキングされていないメモリ量が無視されないメモリ制限(デフォルト値は`4`MiB)を超えるときにのみサンプリングが行われます。`total_memory_profiler_step`が低い場合、これをさらに低くすることができます。非常に詳細にサンプリングするには、`total_memory_profiler_step`を`1`に設定できます。 + +可能な値: + +- 正の整数。 +- 0 — ランダムな割り当ておよび開放の`system.trace_log`システムテーブルへの書き込みは無効。 + +デフォルト値:`0`。 + +## compiled_expression_cache_size {#compiled-expression-cache-size} + +[コンパイルされた式](../../operations/caches.md)のキャッシュサイズ(バイト単位)を設定します。 + +可能な値: + +- 正の整数。 + +デフォルト値:`134217728`。 + +## compiled_expression_cache_elements_size {#compiled_expression_cache_elements_size} + +[コンパイルされた式](../../operations/caches.md)のキャッシュサイズ(要素単位)を設定します。 + +可能な値: + +- 正の整数。 + +デフォルト値:`10000`。 + +## display_secrets_in_show_and_select {#display_secrets_in_show_and_select} + +`SHOW`および`SELECT`クエリで、テーブル、データベース、テーブル関数、およびDictionaryの機密情報の表示を有効または無効にします。 + +機密情報を表示したいユーザーは +[`format_display_secrets_in_show_and_select`フォーマット設定](../settings/formats#format_display_secrets_in_show_and_select) +をオンにし、 +[`displaySecretsInShowAndSelect`](../../sql-reference/statements/grant#display-secrets)特権を持たねばなりません。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +デフォルト値:0。 + +## proxy {#proxy} + +S3ストレージ、S3テーブル関数、そしてURL関数で現在サポートされているHTTPおよびHTTPSリクエストのプロキシサーバーを定義します。 + +プロキシサーバーは、環境変数、プロキシリスト、リモートプロキシリゾルバで定義できます。 + +特定のホストに対するプロキシサーバーのバイパスも、`no_proxy`を使用してサポートされています。 + +### 環境変数 + +`http_proxy`と`https_proxy`の環境変数を指定してください。これにより、特定のプロトコル用のプロキシサーバーを指定できます。システム上で設定されている場合は、シームレスに機能します。 + +これは、特定のプロトコルに対して1つのプロキシサーバーがあり、そのプロキシサーバーが変更されない場合に最もシンプルなアプローチです。 + +### プロキシリスト + +このアプローチでは、1つまたは複数のプロトコルに対するプロキシサーバーを指定することができます。複数のプロキシサーバーが定義されている場合、ClickHouseはサーバー間で負荷を分散するためにラウンドロビンベースでさまざまなプロキシを使用します。特定のプロトコルに対して複数のプロキシサーバーがあり、プロキシサーバーのリストが変更されない場合には、最もシンプルなアプローチです。 + +### 設定テンプレート + +```xml + + + http://proxy1 + http://proxy2:3128 + + + http://proxy1:3128 + + +``` + +`` フィールド + +* `` - 1つ以上のHTTPプロキシのリスト +* `` - 1つ以上のHTTPSプロキシのリスト + +``および``フィールド + +* `` - プロキシのURI + +### リモートプロキシリゾルバ + +プロキシサーバーが動的に変わる可能性があります。その場合、リゾルバのエンドポイントを定義できます。ClickHouseはそのエンドポイントに空のGETリクエストを送信し、リモートリゾルバはプロキシのホストを返すべきです。それをClickHouseは次のテンプレートを使用してプロキシURIを形成します: `{proxy_scheme}://{proxy_host}:{proxy_port}` + +### 設定テンプレート + +```xml + + + + http://resolver:8080/hostname + http + 80 + 10 + + + + + + http://resolver:8080/hostname + http + 3128 + 10 + + + +``` + +`` フィールド + +* `` - 1つ以上のリゾルバのリスト +* `` - 1つ以上のリゾルバのリスト + +``および``フィールド + +* `` - リゾルバのエンドポイントなどの詳細情報。 + 複数の``要素を配置できますが、特定のプロトコルに対しては最初の``のみが使用されます。それ以降の``要素は無視されます。つまり、必要であれば、ロードバランシングはリモートリゾルバによって実装する必要があります。 + +`` フィールド + +* `` - プロキシリゾルバのURI +* `` - 最終プロキシURIのプロトコル。 `http`か`https`のいずれかが使用可能です。 +* `` - プロキシリゾルバのポート番号 +* `` - リゾルバからの値をClickHouseがキャッシュする時間(秒単位)。この値を0に設定すると、ClickHouseは各HTTPまたはHTTPSリクエストごとにリゾルバにアクセスします。 + +### 優先順位 + +プロキシ設定の優先順位は以下の通りです: + +1. リモートプロキシリゾルバ +2. プロキシリスト +3. 環境変数 + +ClickHouseは要求されたプロトコルについて最も優先されるリゾルバタイプを確認します。それが定義されていない場合、次に優先されるリゾルバタイプを確認し、環境リゾルバに到達します。よって、リゾルバタイプはミックスで使用できます。 + +### disable_tunneling_for_https_requests_over_http_proxy {#disable_tunneling_for_https_requests_over_http_proxy} + +デフォルトでは、トンネリング(すなわち`HTTP CONNECT`)は`HTTP`プロキシ経由での`HTTPS`リクエスト作成に使用されます。この設定でそれを無効にできます。 + +### no_proxy +デフォルトでは、すべてのリクエストはプロキシを通じて行われます。特定のホストに対してそれを無効にするために、`no_proxy`変数を設定する必要があります。 +プロキシ設定でリストおよびリモートリゾルバと一緒に使うためには``句の中で設定し、環境リゾルバには環境変数として設定できます。 +IPアドレス、ドメイン、サブドメイン、そして完全バイパス用の`'*'`ワイルドカードをサポートしています。先頭のドットはカールと同様に削除されます。 + +例: + +以下の設定では、`clickhouse.cloud`とそのすべてのサブドメイン(例、`auth.clickhouse.cloud`)へのプロキシリクエストがバイパスされます。 +GitLabに関しても、先頭にドットがあっても同様です。`gitlab.com`および`about.gitlab.com`はどちらもプロキシをバイパスします。 + +```xml + + clickhouse.cloud,.gitlab.com + + http://proxy1 + http://proxy2:3128 + + + http://proxy1:3128 + + +``` + +## max_materialized_views_count_for_table {#max_materialized_views_count_for_table} + +テーブルにアタッチされたマテリアライズドビューの数の制限。 +ここでは直接依存するビューのみが考慮されており、1つのビューの上にもう1つのビューを作成することは考慮されません。 + +デフォルト値:`0`。 + +## format_alter_operations_with_parentheses {#format_alter_operations_with_parentheses} + +真の場合、フォーマットされたクエリで変更操作が括弧で囲まれます。これにより、フォーマットされた変更クエリの解析が曖昧さを減少させます。 + +タイプ: Bool + +デフォルト: 0 + +## ignore_empty_sql_security_in_create_view_query {#ignore_empty_sql_security_in_create_view_query} + +真の場合、ClickHouseはCREATE VIEWクエリの空のSQLセキュリティステートメントのデフォルトを書き込みません。 + +:::note +この設定は移行期間にのみ必要であり、24.4で廃止予定です。 +::: + +タイプ: Bool + +デフォルト: 1 + +## merge_workload {#merge_workload} + +マージと他のワークロード間でのリソースの利用および共有方法を調整するために使用されます。指定された値はすべてのバックグラウンドマージに対して`workload`設定値として使用されます。マージツリー設定によってオーバーライド可能です。 + +デフォルト値: "default" + +**参照** +- [ワークロードスケジューリング](/docs/ja/operations/workload-scheduling.md) + +## mutation_workload {#mutation_workload} + +突然のトランスフォーメーションと他のワークロード間でのリソースの利用および共有方法を調整するために使用されます。指定された値はすべてのバックグラウンド突然のトランスフォーメーションに対して`workload`設定値として使用されます。マージツリー設定によってオーバーライド可能です。 + +デフォルト値: "default" + +**参照** +- [ワークロードスケジューリング](/docs/ja/operations/workload-scheduling.md) + +## workload_path {#workload_path} + +すべての`CREATE WORKLOAD`および`CREATE RESOURCE`クエリのためのストレージとして使用されるディレクトリ。デフォルトでは、サーバーの作業ディレクトリ内の`/workload/`フォルダが使用されます。 + +**例** + +```xml +/var/lib/clickhouse/workload/ +``` + +**参照** +- [ワークロード階層](/docs/ja/operations/workload-scheduling.md#workloads) +- [workload_zookeeper_path](#workload_zookeeper_path) + +## workload_zookeeper_path {#workload_zookeeper_path} + +すべての`CREATE WORKLOAD`および`CREATE RESOURCE`クエリを保存するために使用されるZooKeeperノードへのパス。整合性のために、すべてのSQL定義がこの単一のznodeの値として保存されます。デフォルトでは、ZooKeeperは使用されず、定義は[ディスク](#workload_path)に保存されます。 + +**例** + +```xml +/clickhouse/workload/definitions.sql +``` + +**参照** +- [ワークロード階層](/docs/ja/operations/workload-scheduling.md#workloads) +- [workload_path](#workload_path) + +## max_authentication_methods_per_user {#max_authentication_methods_per_user} + +ユーザーが作成される際や認証メソッドを変更する際に指定できる認証メソッドの最大数。 +この設定を変更しても既存のユーザーには影響しません。制限を超える認証に関連する作成/変更クエリは失敗しますが、認証に関連しない作成/変更クエリは成功します。 + +タイプ: UInt64 + +デフォルト値: 100 + +0は無制限を意味します + +## use_legacy_mongodb_integration + +レガシーMongoDB統合実装を使用します。非推奨です。 + +タイプ: Bool + +デフォルト値: `true`。 +``` diff --git a/docs/ja/operations/settings/composable-protocols.md b/docs/ja/operations/settings/composable-protocols.md new file mode 100644 index 00000000000..f64c4580522 --- /dev/null +++ b/docs/ja/operations/settings/composable-protocols.md @@ -0,0 +1,155 @@ +--- +slug: /ja/operations/settings/composable-protocols +sidebar_position: 64 +sidebar_label: Composable Protocols +--- + +# Composable Protocols + +Composable Protocolsは、ClickHouseサーバーへのTCPアクセスの設定をより柔軟に構成できます。この設定は、従来の設定と共存するか、置き換えることができます。 + +## Composable Protocolsセクションは設定xml内で`protocols`として表されます +**例:** +``` xml + + + +``` + +## 基本モジュールによってプロトコル層を定義します +**例:** +``` xml + + + + + http + + + +``` +ここで: +- `plain_http` - 他の層から参照されることができる名前 +- `type` - データを処理するためにインスタンス化されるプロトコルハンドラを示し、プロトコルハンドラのセットは事前に定義されています: + * `tcp` - ネイティブclickhouseプロトコルハンドラ + * `http` - http clickhouseプロトコルハンドラ + * `tls` - TLS暗号化層 + * `proxy1` - PROXYv1層 + * `mysql` - MySQL互換プロトコルハンドラ + * `postgres` - PostgreSQL互換プロトコルハンドラ + * `prometheus` - Prometheusプロトコルハンドラ + * `interserver` - clickhouseインターサーバーハンドラ + +:::note +`Composable Protocols`には`gRPC`プロトコルハンドラは実装されていません。 +::: + +## エンドポイント(リスニングポート)は``タグおよび(オプションで)``タグで表されます +**例:** +``` xml + + + + + http + + 127.0.0.1 + 8123 + + + + +``` +``が省略された場合、ルート設定の``が使用されます。 + +## 階層のシーケンスは、他のモジュールを参照する``タグによって定義されます +**例:** HTTPSプロトコルの定義 +``` xml + + + + + http + + + + + tls + plain_http + 127.0.0.1 + 8443 + + + +``` + +## エンドポイントは任意の階層にアタッチできます +**例:** HTTP(ポート8123)およびHTTPS(ポート8443)エンドポイントの定義 +``` xml + + + + http + 127.0.0.1 + 8123 + + + + tls + plain_http + 127.0.0.1 + 8443 + + + +``` + +## 追加のエンドポイントは任意のモジュールを参照し、``タグを省略することで定義できます +**例:** `plain_http`モジュールのために定義された`another_http`エンドポイント +``` xml + + + + http + 127.0.0.1 + 8123 + + + + tls + plain_http + 127.0.0.1 + 8443 + + + + plain_http + 127.0.0.1 + 8223 + + + +``` + +## 一部のモジュールはその層に特有のパラメーターを含めることができます +**例:** TLS層のためにプライベートキー(`privateKeyFile`)および証明書ファイル(`certificateFile`)を指定できます +``` xml + + + + http + 127.0.0.1 + 8123 + + + + tls + plain_http + 127.0.0.1 + 8443 + another_server.key + another_server.crt + + + +``` diff --git a/docs/ja/operations/settings/constraints-on-settings.md b/docs/ja/operations/settings/constraints-on-settings.md new file mode 100644 index 00000000000..29180ca8a3d --- /dev/null +++ b/docs/ja/operations/settings/constraints-on-settings.md @@ -0,0 +1,108 @@ +--- +slug: /ja/operations/settings/constraints-on-settings +sidebar_position: 62 +sidebar_label: 設定の制約 +--- + +# 設定の制約 + +設定の制約は、`user.xml`構成ファイルの`profiles`セクションで定義でき、ユーザーが`SET`クエリで一部の設定を変更することを禁止します。 +制約は次のように定義されます: + +``` xml + + + + + lower_boundary + + + upper_boundary + + + lower_boundary + upper_boundary + + + + + + lower_boundary + upper_boundary + + + + + +``` + +ユーザーが制約を違反しようとする場合、例外が投げられ、設定は変更されません。 +サポートされている制約タイプには、`min`、`max`、`readonly`(別名`const`)および`changeable_in_readonly`があります。`min`と`max`制約は数値設定に対して上下限を指定し、組み合わせて使用することができます。`readonly`または`const`制約は、ユーザーがその設定を全く変更できないことを指定します。`changeable_in_readonly`制約タイプは、`readonly`設定が1に設定されている場合でも、`min`/`max`範囲内で設定を変更することを許可します。それ以外の場合、設定は`readonly=1`モードで変更できません。`changeable_in_readonly`は、`settings_constraints_replace_previous`が有効になっている場合にのみサポートされます: +``` xml + + true + +``` + +複数のプロファイルがユーザーに対してアクティブになっている場合、制約はマージされます。マージプロセスは`settings_constraints_replace_previous`に依存します: +- **true**(推奨): 同じ設定に対する制約はマージ中に置き換えられ、最後の制約が使用され、前のすべては無視され、新しい制約に設定されていないフィールドも含まれます。 +- **false**(デフォルト): 同じ設定に対する制約は、設定されていない制約タイプが前のプロファイルから取得され、設定された制約タイプが新しいプロファイルの値に置き換えられる方法でマージされます。 + +読み取り専用モードは`readonly`設定によって有効化されます(`readonly`制約タイプと混同しないでください): +- `readonly=0`: 読み取り専用の制限はありません。 +- `readonly=1`: 読み取りクエリのみ許可され、`changeable_in_readonly`が設定されていない限り設定は変更できません。 +- `readonly=2`: 読み取りクエリのみ許可されますが、設定は変更可能です。ただし、`readonly`設定自体は変更できません。 + +**例:** `users.xml`に次の行が含まれているとします: + +``` xml + + + 10000000000 + 0 + ... + + + 5000000000 + 20000000000 + + + + + + + +``` + +次のクエリはすべて例外を投げます: + +``` sql +SET max_memory_usage=20000000001; +SET max_memory_usage=4999999999; +SET force_index_by_date=1; +``` + +``` text +Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be greater than 20000000000. +Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be less than 5000000000. +Code: 452, e.displayText() = DB::Exception: Setting force_index_by_date should not be changed. +``` + +**注:** `default`プロファイルは特別な処理がされます: `default`プロファイルに定義されたすべての制約はデフォルト制約となり、これらのユーザーに対して明示的に上書きされるまで、すべてのユーザーを制限します。 + +## MergeTree設定の制約 +[MergeTree設定](merge-tree-settings.md)に制約を設定することができます。これらの制約は、MergeTreeエンジンを使用してテーブルを作成する際や、そのストレージ設定を変更する際に適用されます。MergeTree設定の名前は、``セクションで参照する際に`merge_tree_`プレフィックスを追加する必要があります。 + +**例:** 明示的に指定された`storage_policy`を持つ新しいテーブルの作成を禁止します。 + +``` xml + + + + + + + + + +``` diff --git a/docs/ja/operations/settings/index.md b/docs/ja/operations/settings/index.md new file mode 100644 index 00000000000..11887607c12 --- /dev/null +++ b/docs/ja/operations/settings/index.md @@ -0,0 +1,48 @@ +--- +title: "設定の概要" +sidebar_position: 1 +slug: /ja/operations/settings/ +--- + +# 設定の概要 + +:::note +XMLベースの設定プロファイルと[設定ファイル](https://clickhouse.com/docs/ja/operations/configuration-files)は、現在のところClickHouse Cloudではサポートされていません。ClickHouse Cloudサービスの設定を指定するには、[SQL駆動の設定プロファイル](https://clickhouse.com/docs/ja/operations/access-rights#settings-profiles-management)を使用する必要があります。 +::: + +ClickHouseの設定は主に2つのグループに分かれています: + +- グローバルサーバー設定 +- クエリレベルの設定 + +グローバルサーバー設定とクエリレベルの設定の主な違いは、グローバルサーバー設定は設定ファイルで設定する必要があり、クエリレベルの設定は設定ファイルまたはSQLクエリで設定できるという点です。 + +ClickHouseサーバーをグローバルサーバーレベルで設定する方法については、[グローバルサーバー設定](/docs/ja/operations/server-configuration-parameters/settings.md)を参照してください。 + +ClickHouseサーバーをクエリレベルで設定する方法については、[クエリレベルの設定](/docs/ja/operations/settings/settings-query-level.md)を参照してください。 + +## デフォルト以外の設定を確認する + +デフォルトの値から変更された設定を確認するには、次のクエリを使用します: + +```sql +SELECT name, value FROM system.settings WHERE changed +``` + +デフォルトの値から設定を変更していない場合、ClickHouseは何も返しません。 + +特定の設定の値を確認するには、クエリ内で設定の`name`を指定します: + +```sql +SELECT name, value FROM system.settings WHERE name = 'max_threads' +``` + +このコマンドは以下のような結果を返します: + +```response +┌─name────────┬─value─────┐ +│ max_threads │ 'auto(8)' │ +└─────────────┴───────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` diff --git a/docs/ja/operations/settings/memory-overcommit.md b/docs/ja/operations/settings/memory-overcommit.md new file mode 100644 index 00000000000..50b574261c7 --- /dev/null +++ b/docs/ja/operations/settings/memory-overcommit.md @@ -0,0 +1,34 @@ +--- +slug: /ja/operations/settings/memory-overcommit +--- +# メモリーオーバーコミット + +メモリーオーバーコミットは、クエリのより柔軟なメモリー制限を設定するためのエクスペリメンタルな技術です。 + +この技術のアイデアは、クエリが使用できるメモリーの保証された量を表す設定を導入することです。メモリーオーバーコミットが有効になり、メモリー制限に達した場合、ClickHouseは最もオーバーコミットされたクエリを選択し、このクエリを終了させてメモリーを解放しようとします。 + +メモリー制限に達した場合、クエリは新しいメモリーを割り当てようとする際に一定時間待機します。タイムアウトが発生し、メモリーが解放されれば、クエリは実行を続行します。それ以外の場合、例外がスローされ、クエリが終了されます。 + +クエリを停止または終了する選択は、グローバルまたはユーザーのオーバーコミットトラッカーによって行われ、どのメモリー制限に到達したかに依存します。オーバーコミットトラッカーが停止すべきクエリを選べない場合、MEMORY_LIMIT_EXCEEDEDの例外がスローされます。 + +## ユーザーオーバーコミットトラッカー + +ユーザーオーバーコミットトラッカーは、ユーザーのクエリリスト内で最もオーバーコミット率の高いクエリを見つけます。クエリのオーバーコミット率は、割り当てられたバイト数を`memory_overcommit_ratio_denominator`設定値で割ったものとして計算されます。 + +クエリの`memory_overcommit_ratio_denominator`がゼロの場合、オーバーコミットトラッカーはこのクエリを選択しません。 + +待機タイムアウトは`memory_usage_overcommit_max_wait_microseconds`設定で設定されます。 + +**例** + +```sql +SELECT number FROM numbers(1000) GROUP BY number SETTINGS memory_overcommit_ratio_denominator=4000, memory_usage_overcommit_max_wait_microseconds=500 +``` + +## グローバルオーバーコミットトラッカー + +グローバルオーバーコミットトラッカーは、すべてのクエリのリスト内で最もオーバーコミット率の高いクエリを見つけます。この場合、オーバーコミット率は割り当てられたバイト数を`memory_overcommit_ratio_denominator_for_user`設定値で割ったものとして計算されます。 + +クエリの`memory_overcommit_ratio_denominator_for_user`がゼロの場合、オーバーコミットトラッカーはこのクエリを選択しません。 + +待機タイムアウトは、設定ファイル内の`memory_usage_overcommit_max_wait_microseconds`パラメータで設定されます。 diff --git a/docs/ja/operations/settings/merge-tree-settings.md b/docs/ja/operations/settings/merge-tree-settings.md new file mode 100644 index 00000000000..d744716a28f --- /dev/null +++ b/docs/ja/operations/settings/merge-tree-settings.md @@ -0,0 +1,1087 @@ +--- +slug: /ja/operations/settings/merge-tree-settings +title: "MergeTree テーブルの設定" +--- + +システムテーブル `system.merge_tree_settings` には、グローバルに設定された MergeTree の設定が表示されます。 + +MergeTree の設定はサーバーの設定ファイルの `merge_tree` セクションで設定できます。また、`CREATE TABLE` ステートメントの `SETTINGS` 句で個々の `MergeTree` テーブルに対して指定することもできます。 + +`max_suspicious_broken_parts` の設定をカスタマイズする例: + +サーバー設定ファイルで、すべての `MergeTree` テーブルに対するデフォルトを設定します。 + +``` text + + 5 + +``` + +特定のテーブルに対して設定する場合: + +``` sql +CREATE TABLE tab +( + `A` Int64 +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS max_suspicious_broken_parts = 500; +``` + +特定のテーブルの設定を `ALTER TABLE ... MODIFY SETTING` で変更する場合: + +```sql +ALTER TABLE tab MODIFY SETTING max_suspicious_broken_parts = 100; + +-- グローバルなデフォルト(system.merge_tree_settings からの値)にリセット +ALTER TABLE tab RESET SETTING max_suspicious_broken_parts; +``` + +## index_granularity + +インデックスのマーク間のデータ行の最大数。 + +デフォルト値: 8192。 + +## index_granularity_bytes + +データ粒度の最大サイズ(バイト単位)。 + +デフォルト値: 10485760 (約10 MiB)。 + +行数のみで粒度サイズを制限するには、0に設定します(推奨されません)。 + +## min_index_granularity_bytes + +許容されるデータ粒度の最小サイズ(バイト単位)。 + +デフォルト値: 1024バイト。 + +非常に低い index_granularity_bytes を持つテーブルの誤作成を防ぐための保護手段です。 + +## enable_mixed_granularity_parts + +`index_granularity_bytes` 設定で粒度サイズを管理するための遷移を有効または無効にします。バージョン 19.11 以前では、粒度サイズを制限するために `index_granularity` 設定のみがありました。`index_granularity_bytes` 設定は、巨大な行(数十メガバイト、数百メガバイト)があるテーブルからデータを選択する際の ClickHouse のパフォーマンスを向上させます。大型の行を持つテーブルがある場合、この設定をテーブルに対して有効にすると、`SELECT` クエリの効率性が向上します。 + +## use_minimalistic_part_header_in_zookeeper + +ZooKeeper におけるデータパーツヘッダーの格納方法。これを有効にすると、ZooKeeper はより少ないデータを保存します。詳細は[こちら](../server-configuration-parameters/settings.md/#server-settings-use_minimalistic_part_header_in_zookeeper)を参照してください。 + +## min_merge_bytes_to_use_direct_io + +ストレージディスクへのダイレクトI/Oアクセスを使用するために必要なマージ操作の最小データ量。データパーツをマージする際、ClickHouse はマージするすべてのデータの総ストレージ量を計算します。 +もし量が `min_merge_bytes_to_use_direct_io` バイトを超える場合、ClickHouse はデータをストレージディスクに読み書きします。このとき、ダイレクトI/Oインターフェースを使用します(`O_DIRECT` オプション)。 +もし `min_merge_bytes_to_use_direct_io = 0` 場合、ダイレクトI/Oは無効になります。 + +デフォルト値: `10 * 1024 * 1024 * 1024` バイト。 + +## merge_with_ttl_timeout + +有効期限 (TTL) による削除と共にマージを繰り返すまでの最小遅延時間(秒単位)。 + +デフォルト値: `14400` 秒(4時間)。 + +## merge_with_recompression_ttl_timeout + +再圧縮 TTL を使用するマージを繰り返すまでの最小遅延時間(秒単位)。 + +デフォルト値: `14400` 秒(4時間)。 + +## write_final_mark + +データパートの最後(最終バイト後)に最終インデックスマークを書き込むかどうかを設定します。 + +デフォルト値: 1。 + +変更しないでください。悪いことが起こります。 + +## storage_policy + +ストレージポリシー。 + +## min_bytes_for_wide_part + +`Wide` フォーマットで保存できるデータパートに含まれる最小のバイト/行数。 +これらの設定の一つ、両方、またはどちらも設定できます。 + +## max_compress_block_size + +テーブルに書き込む前に圧縮される未圧縮データのブロックの最大サイズ。 +この設定はグローバル設定にも指定できます([max_compress_block_size](/docs/ja/operations/settings/settings.md/#max-compress-block-size)設定を参照)。 +テーブル作成時に指定した値が、この設定のグローバル値を上書きします。 + +## min_compress_block_size + +次のマークを記録する際に圧縮が必要な未圧縮データのブロックの最小サイズ。 +この設定はグローバル設定にも指定できます([min_compress_block_size](/docs/ja/operations/settings/settings.md/#min-compress-block-size)設定を参照)。 +テーブル作成時に指定した値が、この設定のグローバル値を上書きします。 + +## max_suspicious_broken_parts + +単一のパーティション内で破損したパーツの数が `max_suspicious_broken_parts` の値を超えると、 自動削除が拒否されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 100。 + +## parts_to_throw_insert {#parts-to-throw-insert} + +単一のパーティション内のアクティブなパーツの数が `parts_to_throw_insert` の値を超えると、`INSERT` は `Too many parts (N). Merges are processing significantly slower than inserts` という例外で中断されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 3000。 + +`SELECT` クエリの最大パフォーマンスを達成するには、処理されるパーツの数を最小限に抑える必要があります。詳細は [Merge Tree](../../development/architecture.md#merge-tree) を参照してください。 + +バージョン 23.6 より前では、この設定は 300 に設定されていました。異なる高い値を設定することもできますが、`Too many parts` エラーの発生確率を低くする一方で、`SELECT` のパフォーマンスが低下する可能性があります。また、マージの問題が発生した場合(例: ディスク容量の不足)、元の 300 での設定よりも気づくのが遅れます。 + +## parts_to_delay_insert {#parts-to-delay-insert} + +単一のパーティション内のアクティブなパーツの数が `parts_to_delay_insert` の値を超えると、`INSERT` が意図的に遅延されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 1000。 + +ClickHouse は、バックグラウンドのマージプロセスがパーツを追加するよりも速くマージできるように、`INSERT` を遅延(「スリープ」を追加)して実行します。 + +## inactive_parts_to_throw_insert {#inactive-parts-to-throw-insert} + +単一のパーティションにおける非アクティブなパーツの数が `inactive_parts_to_throw_insert` の値を超える場合、`INSERT` は "Too many inactive parts (N). Parts cleaning are processing significantly slower than inserts" という例外で中断されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 0(無制限)。 + +## inactive_parts_to_delay_insert {#inactive-parts-to-delay-insert} + +単一のパーティションにおける非アクティブなパーツの数が `inactive_parts_to_delay_insert` の値に達すると、`INSERT` は意図的に遅延されます。これは、サーバーがパーツを速やかにクリーンアップできない場合に役立ちます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 0(無制限)。 + +## max_delay_to_insert {#max-delay-to-insert} + +単一のパーティション内のアクティブなパーツの数が [parts_to_delay_insert](#parts-to-delay-insert) の値を超えた場合に `INSERT` 遅延を計算するために使用される秒単位の値。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 1。 + +`INSERT` の遅延(ミリ秒単位)は次の式で計算されます: +```code +max_k = parts_to_throw_insert - parts_to_delay_insert +k = 1 + parts_count_in_partition - parts_to_delay_insert +delay_milliseconds = pow(max_delay_to_insert * 1000, k / max_k) +``` +例えば、パーティションに 299 のアクティブなパーツがあり、parts_to_throw_insert = 300, parts_to_delay_insert = 150, max_delay_to_insert = 1 の場合、`INSERT` は `pow( 1 * 1000, (1 + 299 - 150) / (300 - 150) ) = 1000` ミリ秒遅延されます。 + +バージョン 23.1 から式が変更されました: +```code +allowed_parts_over_threshold = parts_to_throw_insert - parts_to_delay_insert +parts_over_threshold = parts_count_in_partition - parts_to_delay_insert + 1 +delay_milliseconds = max(min_delay_to_insert_ms, (max_delay_to_insert * 1000) * parts_over_threshold / allowed_parts_over_threshold) +``` +例えば、パーティションに 224 のアクティブなパーツがあり、parts_to_throw_insert = 300, parts_to_delay_insert = 150, max_delay_to_insert = 1, min_delay_to_insert_ms = 10 の場合、`INSERT` は `max( 10, 1 * 1000 * (224 - 150 + 1) / (300 - 150) ) = 500` ミリ秒遅延されます。 + +## max_parts_in_total {#max-parts-in-total} + +テーブルのすべてのパーティションのアクティブなパーツの総数が `max_parts_in_total` の値を超えた場合、`INSERT` は `Too many parts (N)` という例外で中断されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 100000。 + +テーブル中のパーツの数が多いと、ClickHouse クエリのパフォーマンスが低下し、ClickHouse の起動時間が長くなります。通常、これはパーティション戦略の選択ミス(あまりに小さなパーティション)が原因で誤った設計の結果です。 + +## simultaneous_parts_removal_limit {#simultaneous-parts-removal-limit} + +古いパーツが大量にある場合、クリーンスレッドは同じイテレーションで `simultaneous_parts_removal_limit` パーツを削除しようとします。 +`simultaneous_parts_removal_limit` が `0` に設定されている場合は無制限を意味します。 + +デフォルト値: 0。 + +## replicated_deduplication_window {#replicated-deduplication-window} + +ClickHouse Keeper が重複をチェックするためにハッシュを保存する最近挿入されたブロックの数。 + +許容される値: + +- 任意の正の整数。 +- 0(重複排除を無効にする) + +デフォルト値: 1000。 + +`Insert` コマンドは1つ以上のブロック(パーツ)を作成します。レプリケートされたテーブルに書き込む際の[挿入重複排除](../../engines/table-engines/mergetree-family/replication.md)のために、ClickHouse は作成されたパーツのハッシュをClickHouse Keeperに書き込みます。ハッシュは、最新の `replicated_deduplication_window` ブロックのみに保存されます。古いハッシュはClickHouse Keeperから削除されます。 +`replicated_deduplication_window` が多いほど、`Inserts` の実行が遅くなります。なぜなら、より多くのエントリと比較する必要があるからです。 +ハッシュはフィールド名と型の組成および挿入されたパーツのデータ(バイトのストリーム)から計算されます。 + +## non_replicated_deduplication_window {#non-replicated-deduplication-window} + +重複をチェックするためにハッシュが保存される、非レプリケート[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの最近挿入されたブロックの数。 + +許容される値: + +- 任意の正の整数。 +- 0(重複排除を無効にする)。 + +デフォルト値: 0。 + +レプリケートされたテーブルに似た重複排除機構を使用します([replicated_deduplication_window](#replicated-deduplication-window)の設定を参照)。作成されたパーツのハッシュはディスク上のローカルファイルに書き込まれます。 + +## replicated_deduplication_window_seconds {#replicated-deduplication-window-seconds} + +挿入されたブロックのハッシュがClickHouse Keeperから削除されるまでの秒数。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 604800 (1週間)。 + +[replicated_deduplication_window](#replicated-deduplication-window)に似ていますが、`replicated_deduplication_window_seconds` は挿入重複排除のためのブロックハッシュを保存する期間を指定します。`replicated_deduplication_window_seconds`より古いハッシュは、`replicated_deduplication_window`未満であってもClickHouse Keeperから削除されます。 + +時間は最新のレコードの時間に対して相対的であり、実際の時間に対してではありません。もしそれが唯一のレコードであれば、永遠に保存されます。 + +## replicated_deduplication_window_for_async_inserts {#replicated-deduplication-window-for-async-inserts} + +ClickHouse Keeper が重複をチェックするためにハッシュを保存する最近の非同期挿入ブロックの数。 + +許容される値: + +- 任意の正の整数。 +- 0(非同期挿入の重複排除を無効にする) + +デフォルト値: 10000。 + +[非同期インサート](./settings.md#async-insert) コマンドは一つ以上のブロック(パーツ)にキャッシュされていきます。レプリケートされたテーブルに書き込む際の [挿入重複排除](../../engines/table-engines/mergetree-family/replication.md) のために、ClickHouse は各挿入のハッシュをClickHouse Keeperに書き込みます。ハッシュは、最新の `replicated_deduplication_window_for_async_inserts` ブロックのみに保存されます。古いハッシュはClickHouse Keeperから削除されます。 +`replicated_deduplication_window_for_async_inserts` が多いほど、`Async Inserts` の実行が遅くなります。なぜなら、より多くのエントリと比較する必要があるからです。 +ハッシュはフィールド名と型の組成および挿入データ(バイトのストリーム)から計算されます。 + +## replicated_deduplication_window_seconds_for_async_inserts {#replicated-deduplication-window-seconds-for-async_inserts} + +非同期の挿入のハッシュがClickHouse Keeperから削除されるまでの秒数。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 604800 (1週間)。 + +[replicated_deduplication_window_for_async_inserts](#replicated-deduplication-window-for-async-inserts) に似ており、非同期挿入重複排除のためのブロックのハッシュを保存する期間を指定します。`replicated_deduplication_window_seconds_for_async_inserts` より古いハッシュは、`replicated_deduplication_window_for_async_inserts` より少なくても ClickHouse Keeper から削除されます。 + +時間は最新のレコードの時間に対して相対的であり、実際の時間に対してではありません。もしそれが唯一のレコードであれば、永遠に保存されます。 + +## use_async_block_ids_cache {#use-async-block-ids-cache} + +`true` の場合、非同期挿入のハッシュをキャッシュします。 + +許容される値: + +- true, false + +デフォルト値: false。 + +複数の非同期挿入を持つブロックは、複数のハッシュを生成します。一部の挿入が重複している場合、Keeper は1つのRPCで1つの重複したハッシュのみを返し、不要なRPCリトライを引き起こします。このキャッシュはKeeperのハッシュパスを監視します。Keeperで更新が監視されている場合、キャッシュは可能な限り早く更新され、メモリ内で重複した挿入をフィルタリングできるようになります。 + +## async_block_ids_cache_min_update_interval_ms + +`use_async_block_ids_cache` を更新するための最小間隔(ミリ秒単位) + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 100。 + +通常、`use_async_block_ids_cache` は監視されているKeeperパスで更新があるとすぐに更新されます。ただし、キャッシュの更新が頻繁すぎると負担がかかる可能性があります。この最小間隔がキャッシュの更新が過度に速くなるのを防ぎます。この値を長く設定しすぎると、重複した挿入を含むブロックのリトライ時間が長くなる可能性があります。 + +## max_replicated_logs_to_keep + +非アクティブなレプリカがある場合、ClickHouse Keeper のログに存在できる最大記録数。非アクティブなレプリカは、この数を超えると失われます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 1000 + +## min_replicated_logs_to_keep + +ZooKeeper ログにある最後の記録をこの数まで保持します。テーブルの作業には影響を与えません: ZooKeeper ログのクリーンアップ前に診断するためだけに使用されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 10 + +## prefer_fetch_merged_part_time_threshold + +レプリケーションログ(ClickHouse Keeper または ZooKeeper)のエントリ作成からの経過時間が指定されたしきい値を超え、パーツのサイズの合計が `prefer_fetch_merged_part_size_threshold` を超える場合、ローカルでマージを行う代わりに、レプリカからマージされたパーツをフェッチすることが推奨されます。これにより非常に長いマージを高速化します。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 3600 + +## prefer_fetch_merged_part_size_threshold + +パーツサイズの合計がこのしきい値を超え、レプリケーションログエントリの作成からの経過時間が `prefer_fetch_merged_part_time_threshold` を超える場合、ローカルでマージを行う代わりにレプリカからマージされたパーツをフェッチすることが推奨されます。これにより非常に長いマージを高速化します。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 10,737,418,240 + +## execute_merges_on_single_replica_time_threshold + +この設定の値がゼロより大きい場合、1つのレプリカのみがすぐにマージを開始し、他のレプリカはその結果をダウンロードするためにその時間まで待ちます。その時間内に選ばれたレプリカがマージを完了しない場合は、標準の動作にフォールバックします。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 0(秒) + +## remote_fs_execute_merges_on_single_replica_time_threshold + +この設定の値がゼロより大きい場合、マージされたパーツが共有ストレージ上にあり、`allow_remote_fs_zero_copy_replication` が有効になっている場合、1つのレプリカのみがマージをすぐに開始します。 + +:::note ゼロコピー レプリケーションはまだ本番環境では使用できません +ゼロコピー レプリケーションは ClickHouse バージョン 22.8 以降でデフォルトで無効になっています。この機能は本番環境での使用を推奨しません。 +::: + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 10800 + +## try_fetch_recompressed_part_timeout + +再圧縮を伴うマージを開始する前のタイムアウト(秒単位)。この期間、新しい圧縮パーツを取得しようとします。この期間中、再圧縮を伴うマージをクリックハウスが割り当てられている場合のレプリカからフェッチしようとします。 + +再圧縮は多くの場合遅く動作するため、このタイムアウトまで再圧縮を伴うマージを開始することなく、再圧縮された部分をレプリカからフェッチしようとします。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 7200 + +## always_fetch_merged_part + +`true` の場合、このレプリカはパーツをマージせず、常に他のレプリカからマージされたパーツをダウンロードします。 + +許容される値: + +- true, false + +デフォルト値: false + +## max_suspicious_broken_parts + +最大破損パーツ数、これを超えると自動削除が拒否されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 100 + +## max_suspicious_broken_parts_bytes + +全部の破損パーツの最大サイズ、これを超える場合、自動削除が拒否されます。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 1,073,741,824 + +## max_files_to_modify_in_alter_columns + +ファイルの変更(削除、追加)数がこの設定値を超える場合 `ALTER` を適用しません。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 75 + +## max_files_to_remove_in_alter_columns + +削除ファイル数がこの設定値を超える場合、 `ALTER` を適用しません。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 50 + +## replicated_max_ratio_of_wrong_parts + +不正なパーツの比率が総パーツ数を基準としてこの値を下回っている場合に開始を許可します。 + +許容される値: + +- 浮動小数点数、0.0 - 1.0 + +デフォルト値: 0.5 + +## replicated_max_parallel_fetches_for_host + +エンドポイントからの並列フェッチの制限(実際のプールサイズ)。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 15 + +## replicated_fetches_http_connection_timeout + +部分フェッチリクエストの HTTP 接続タイムアウト。デフォルトプロファイル `http_connection_timeout` より継承され、明示的に設定されていない場合。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 明示的に設定されていない場合はデフォルトプロファイル `http_connection_timeout` より継承されます。 + +## replicated_can_become_leader + +`true` の場合、このノード上のレプリカーテーブルのレプリカがリーダーシップを取得しようとします。 + +許容される値: + +- true, false + +デフォルト値: true + +## zookeeper_session_expiration_check_period + +ZooKeeper セッションの有効期限チェック期間、秒単位。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 60 + +## detach_old_local_parts_when_cloning_replica + +失われたレプリカを修復する際に古いローカルパーツを削除しません。 + +許容される値: + +- true, false + +デフォルト値: true + +## replicated_fetches_http_connection_timeout {#replicated_fetches_http_connection_timeout} + +部分フェッチリクエストの HTTP 接続タイムアウト(秒単位)。明示的に設定されていない場合は、デフォルトプロファイル[http_connection_timeout](./settings.md#http_connection_timeout)より継承されます。 + +許容される値: + +- 任意の正の整数。 +- 0 - `http_connection_timeout` の値を使用します。 + +デフォルト値: 0。 + +## replicated_fetches_http_send_timeout {#replicated_fetches_http_send_timeout} + +部分フェッチリクエストの HTTP 送信タイムアウト(秒単位)。明示的に設定されていない場合は、デフォルトプロファイル[http_send_timeout](./settings.md#http_send_timeout)より継承されます。 + +許容される値: + +- 任意の正の整数。 +- 0 - `http_send_timeout` の値を使用します。 + +デフォルト値: 0。 + +## replicated_fetches_http_receive_timeout {#replicated_fetches_http_receive_timeout} + +フェッチ部分リクエストの HTTP 受信タイムアウト(秒単位)。明示的に設定されていない場合は、デフォルトプロファイル[http_receive_timeout](./settings.md#http_receive_timeout)より継承されます。 + +許容される値: + +- 任意の正の整数。 +- 0 - `http_receive_timeout` の値を使用します。 + +デフォルト値: 0。 + +## max_replicated_fetches_network_bandwidth {#max_replicated_fetches_network_bandwidth} + +[レプリケートされた](../../engines/table-engines/mergetree-family/replication.md) フェッチのためのネットワークの最大速度を秒あたりのバイト数で制限します。この設定は特定のテーブルに適用され、[max_replicated_fetches_network_bandwidth_for_server](settings.md#max_replicated_fetches_network_bandwidth_for_server) 設定はサーバに対して適用されます。 + +サーバーネットワークと特定のテーブル用ネットワークは両方設定することができますが、このためにはテーブルレベル設定の値がサーバレベルのものよりも小さくなければなりません。そうでない場合、サーバーは`max_replicated_fetches_network_bandwidth_for_server` 設定だけを考慮します。 + +この設定は正確に順守されていません。 + +許容される値: + +- 正の整数。 +- 0 — 無制限。 + +デフォルト値: `0`. + +**使用方法** + +新しいノードを追加または置換する際にデータをレプリケートする速度を制限するために使用される。 + +## max_replicated_sends_network_bandwidth {#max_replicated_sends_network_bandwidth} + +[レプリケートされた](../../engines/table-engines/mergetree-family/replication.md) 送信のためのネットワークの最大速度を秒あたりのバイト数で制限します。この設定は特定のテーブルに適用され、[max_replicated_sends_network_bandwidth_for_server](settings.md#max_replicated_sends_network_bandwidth_for_server) 設定はサーバに対して適用されます。 + +サーバーネットワークと特定のテーブル用ネットワークは両方設定することができますが、このためにはテーブルレベル設定の値がサーバレベルのものよりも小さくなければなりません。そうでない場合、サーバーは`max_replicated_sends_network_bandwidth_for_server` 設定だけを考慮します。 + +この設定は正確に順守されていません。 + +許容される値: + +- 正の整数。 +- 0 — 無制限。 + +デフォルト値: `0`. + +**使用方法** + +新しいノードを追加または置換する際にデータをレプリケートする速度を制限するために使用される。 + +## old_parts_lifetime {#old-parts-lifetime} + +サーバの予期しない再起動中のデータ損失を防ぐための非アクティブパーツの保持時間(秒単位)。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 480。 + +いくつかのパーツを新しいパーツにマージした後、ClickHouse は元のパーツを非アクティブとしてマークし、`old_parts_lifetime` 秒後にのみそれらを削除します。 +非アクティブパーツは現在のクエリで使用されていない場合に削除されます。すなわち、パーツの `refcount` が 1 の場合です。 + +新しいパーツには `fsync` が呼び出されないため、新しいパーツは一時的にサーバのRAM(OSキャッシュ)にのみ存在します。サーバが予期せず再起動された場合、新しいパーツが失われたり損傷を受けたりする可能性があります。 +データを保護するために、非アクティブパーツはすぐに削除されません。 + +起動時、ClickHouse はパーツの整合性を確認します。 +マージされたパーツが損傷している場合、ClickHouse は非アクティブパーツをアクティブリストに戻し、それらを再びマージします。その後、損傷したパーツはリネームされ(`broken_` 接頭辞が追加)、`detached` フォルダに移動されます。 +マージされたパーツが損傷していない場合、元の非アクティブパーツはリネームされ(`ignored_` 接頭辞が追加)、`detached` フォルダに移動されます。 + +デフォルトの `dirty_expire_centisecs` 値(Linux カーネル設定)は 30 秒(書き込まれたデータがRAMにのみ保存される最大時間)ですが、ディスクシステムに負荷がかかると、データははるか後に書き込まれます。エクスペリメンタルに、`old_parts_lifetime` の値として 480 秒が選ばれ、新しいパーツがディスクに確実に書き込まれる時間となります。 + +## max_bytes_to_merge_at_max_space_in_pool {#max-bytes-to-merge-at-max-space-in-pool} + +十分なリソースが利用可能な場合に1つのパーツにマージされる最大トータルパーツサイズ(バイト単位)。`max_bytes_to_merge_at_max_space_in_pool`は、自動バックグラウンドマージによって作成される最大可能パーツサイズにおおよそ対応しています。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 161061273600 (150 GB)。 + +マージスケジューラは定期的にパーティション内のパーツサイズと数を分析し、プール内に十分な空きリソースがある場合、バックグラウンドマージを開始します。マージは、ソースパーツの総サイズが `max_bytes_to_merge_at_max_space_in_pool` を超えるまで行われます。 + +[OPTIMIZE FINAL](../../sql-reference/statements/optimize.md)によって開始されたマージは、`max_bytes_to_merge_at_max_space_in_pool` を無視し、利用可能なリソース(空きディスク容量)を考慮して、パーティション内に1つのパーツが残るまでパーツをマージします。 + +## max_bytes_to_merge_at_min_space_in_pool {#max-bytes-to-merge-at-min-space-in-pool} + +バックグラウンドプールで最小の利用可能リソースで1つのパーツにマージされる最大トータルパーツサイズ(バイト単位)。 + +許容される値: + +- 任意の正の整数。 + +デフォルト値: 1048576 (1 MB) + +`max_bytes_to_merge_at_min_space_in_pool`は、ディスク空き容量不足の状況でも小さなパーツの数を減らすために、最大トータルパーツサイズを定義します。これにより、小さなパーツの数を減らし、`Too many parts` エラーの可能性を減らします。 +マージは、マージされたトータルパーツサイズを2倍にすることでディスクスペースを予約します。したがって、ディスク空きスペースが少ない場合、フリースペースは多くありますが、このスペースは進行中の大規模なマージによって既に予約されており、他のマージを開始できないため、小さなパーツの数が増え続けます。 + +## merge_max_block_size {#merge-max-block-size} + +メモリに読み込まれるパーツからの行数。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 8192 + +マージが `merge_max_block_size` 行単位のブロックで行を読み取って、マージおよび新しいパーツに書き込みます。読み取りブロックはRAM内に配置されるため、`merge_max_block_size` はマージのために必要とされるRAMのサイズに影響を与えます。このため、マージは非常に広い行を持つテーブルに対して大量のRAMを消費する可能性があります(平均行サイズが100kbの場合、10個のパーツをマージするとき、(100kb * 10 * 8192) = 約 8GBのRAM)。`merge_max_block_size` を減少させることによって、必要とされるRAMの量を減少させることができますが、マージを遅くします。 + +## number_of_free_entries_in_pool_to_lower_max_size_of_merge {#number-of-free-entries-in-pool-to-lower-max-size-of-merge} + +プール(またはレプリケートされたキュー)に指定された数値以下の空きエントリがある場合、処理する最大マージサイズを縮小し始めます(もしくはキューに投入します)。 +これは長時間実行されるマージでプールを埋め尽くさないように、小さなマージを処理させるためです。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 8 + +## number_of_free_entries_in_pool_to_execute_mutation {#number-of-free-entries-in-pool-to-execute-mutation} + +プールに指定された数値以下の空きエントリがある場合、パーツの変異を実行しません。 +これは通常のマージのための空きスレッドを残すため、"パーツが多すぎる"のを避けるためです。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 20 + +**使用方法** + +`number_of_free_entries_in_pool_to_execute_mutation` の設定値は [background_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_pool_size) * [background_merges_mutations_concurrency_ratio](/docs/ja/operations/server-configuration-parameters/settings.md/#background_merges_mutations_concurrency_ratio) の値未満である必要があります。そうでない場合、ClickHouse は例外をスローします。 + +## max_part_loading_threads {#max-part-loading-threads} + +ClickHouse が起動する際にパーツを読み込む最大スレッド数。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 自動(CPUコア数)。 + +起動時、ClickHouse はすべてのテーブルのすべてのパーツを読み取ります(パーツのメタデータを持つファイルを読み取る)し、メモリにすべてのパーツのリストを作成します。このプロセスは、パーツの数が多いシステムでは時間がかかることがあり、`max_part_loading_threads` を増やすことにより、このプロセスを短縮することができます(この処理がCPUとディスクI/Oによって制約されていない場合)。 + +## max_partitions_to_read {#max-partitions-to-read} + +一つのクエリでアクセスできる最大パーティション数を制限します。 + +テーブル作成時に指定した設定値はクエリレベルの設定で上書きできます。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: -1(無制限)。 + +また、クエリ複雑性設定 [max_partitions_to_read](query-complexity#max-partitions-to-read) をクエリ / セッション / プロファイルレベルで指定できます。 + +## min_age_to_force_merge_seconds {#min_age_to_force_merge_seconds} + +すべてのパートが `min_age_to_force_merge_seconds` の値より古い場合にパーツをマージします。 + +可能な値: + +- 正の整数。 + +デフォルト値: 0 — 無効。 + +## min_age_to_force_merge_on_partition_only {#min_age_to_force_merge_on_partition_only} + +`min_age_to_force_merge_seconds` をパーティション全体にのみ適用し、部分セットには適用しないかどうか。 + +可能な値: + +- true, false + +デフォルト値: false + +## number_of_free_entries_in_pool_to_execute_optimize_entire_partition {#number_of_free_entries_in_pool_to_execute_optimize_entire_partition} + +プールに指定された数よりも少ない空きエントリがある場合、バックグラウンドでパーティション全体を最適化する操作を実行しません(`min_age_to_force_merge_seconds` を設定し、`min_age_to_force_merge_on_partition_only` を有効にした場合に生成されるタスク)。これにより通常のマージ用の空きスレッドを残し、"パーツが多すぎる"のを避けるためです。 + +可能な値: + +- 正の整数。 + +デフォルト値: 25 + +`number_of_free_entries_in_pool_to_execute_optimize_entire_partition` 設定の値は [background_pool_size](/docs/ja/operations/server-configuration-parameters/settings.md/#background_pool_size) * [background_merges_mutations_concurrency_ratio](/docs/ja/operations/server-configuration-parameters/settings.md/#background_merges_mutations_concurrency_ratio) の値より少なくする必要があります。そうでない場合、ClickHouse は例外をスローします。 + +## allow_floating_point_partition_key {#allow_floating_point_partition_key} + +パーティションキーとして浮動小数点数を許可するかどうかを設定します。 + +可能な値: + +- 0 — 浮動小数点パーティションキーを許可しない。 +- 1 — 浮動小数点パーティションキーを許可する。 + +デフォルト値: `0`. + +## check_sample_column_is_correct {#check_sample_column_is_correct} + +テーブル作成時にサンプリング用のカラムまたはサンプリング式のデータタイプが正しいかどうかを確認するチェックを有効にします。データタイプは、`UInt8`、`UInt16`、`UInt32`、`UInt64` のいずれかの符号なし [整数型](../../sql-reference/data-types/int-uint.md)でなければなりません。 + +可能な値: + +- true — チェックが有効です。 +- false — テーブル作成時のチェックが無効です。 + +デフォルト値: `true`. + +デフォルトでは、ClickHouse サーバはテーブル作成時にサンプリング用のカラムまたはサンプリング式のデータタイプをチェックします。すでに不正なサンプリング式を持つテーブルがあり、サーバが起動中に例外を発生させたくない場合は `check_sample_column_is_correct` を `false` に設定してください。 + +## min_bytes_to_rebalance_partition_over_jbod {#min-bytes-to-rebalance-partition-over-jbod} + +新しい大型パーツをボリュームディスク [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures) 上に分散させる際のバランシングを有効にするための最小バイト数を設定します。 + +可能な値: + +- 正の整数。 +- 0 — バランシングが無効です。 + +デフォルト値: `0`. + +**使用例** + +`min_bytes_to_rebalance_partition_over_jbod` 設定の値は [max_bytes_to_merge_at_max_space_in_pool](../../operations/settings/merge-tree-settings.md#max-bytes-to-merge-at-max-space-in-pool) / 1024 の値より多くなければなりません。そうでない場合、 ClickHouse は例外をスローします。 + +## detach_not_byte_identical_parts {#detach_not_byte_identical_parts} + +マージまたは変異後、他のレプリカのデータパーツとバイト単位で一致しない場合に、データパーツをデタッチするかどうかを設定します。無効な場合、データパーツは削除されます。この設定を有効にすると、後でそのようなパーツを分析することができます。 + +この設定は、[データレプリケーション](../../engines/table-engines/mergetree-family/replication.md)が有効な `MergeTree` テーブルに適用されます。 + +可能な値: + +- 0 — パーツは削除されます。 +- 1 — パーツはデタッチされます。 + +デフォルト値: `0`. + +## merge_tree_clear_old_temporary_directories_interval_seconds {#setting-merge-tree-clear-old-temporary-directories-interval-seconds} + +古い一時ディレクトリのクリーンアップを実行するための秒単位での間隔をClickHouseに設定します。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: `60` 秒。 + +## merge_tree_clear_old_parts_interval_seconds {#setting-merge-tree-clear-old-parts-interval-seconds} + +古いパーツ、WAL、および変異のクリーンアップを実行するための秒単位での間隔をClickHouseに設定します。 + +可能な値: + +- 任意の正の整数。 + +デフォルト値: `1` 秒。 + +## max_concurrent_queries {#max-concurrent-queries} + +MergeTree テーブルに関連する最大同時実行クエリ数。クエリは他の `max_concurrent_queries` 設定でも制限されます。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +デフォルト値: `0`(無制限)。 + +**例** + +``` xml +50 +``` + +## min_marks_to_honor_max_concurrent_queries {#min-marks-to-honor-max-concurrent-queries} + +クエリが [max_concurrent_queries](#max-concurrent-queries) 設定を適用できるようにするために読み取る必要のある最小マーク数。クエリは他の `max_concurrent_queries` 設定でも制限されることに注意してください。 + +可能な値: + +- 正の整数。 +- 0 — 無効(`max_concurrent_queries` 制限はクエリには適用されません)。 + +デフォルト値: `0`(制限は適用されません)。 + +**例** + +``` xml +10 +``` + +## ratio_of_defaults_for_sparse_serialization {#ratio-of-defaults-for-sparse-serialization} + +カラム内の *_all_ 値に対する _default_ 値の比率の最小限を設定します。この値を設定することで、カラムがスパースなシリアライゼーションを使用して保存されます。 + +カラムがスパース(ほとんどゼロを含む)の場合、ClickHouse はそれをスパースな形式でエンコードすることができ、計算が自動的に最適化されます。これは、クエリ中にデータが完全に展開される必要がないためです。スパースなシリアライゼーションを有効にするためには、`ratio_of_defaults_for_sparse_serialization` 設定を 1.0 未満に定義します。値が 1.0 以上の場合、通常の完全シリアライゼーションを使用して常に書き込みが行われます。 + +可能な値: + +- 0 と 1 の間の浮動小数点数、スパースなシリアライゼーションを有効にする +- 1.0(またはそれ以上)、スパースなシリアライゼーションを使用したくない場合 + +デフォルト値: `0.9375` + +**例** + +次のテーブル内の `s` カラムには、行の95%が空の文字列です。`my_regular_table` ではスパースなシリアライゼーションを使用せず、`my_sparse_table` では `ratio_of_defaults_for_sparse_serialization` を 0.95 に設定します。 + +```sql +CREATE TABLE my_regular_table +( + `id` UInt64, + `s` String +) +ENGINE = MergeTree +ORDER BY id; + +INSERT INTO my_regular_table +SELECT + number AS id, + number % 20 = 0 ? toString(number): '' AS s +FROM + numbers(10000000); + + +CREATE TABLE my_sparse_table +( + `id` UInt64, + `s` String +) +ENGINE = MergeTree +ORDER BY id +SETTINGS ratio_of_defaults_for_sparse_serialization = 0.95; + +INSERT INTO my_sparse_table +SELECT + number, + number % 20 = 0 ? toString(number): '' +FROM + numbers(10000000); +``` + +`my_sparse_table` の `s` カラムがディスク上でより少ないストレージスペースを使用していることに注意してください。 + +```sql +SELECT table, name, data_compressed_bytes, data_uncompressed_bytes FROM system.columns +WHERE table LIKE 'my_%_table'; +``` + +```response +┌─table────────────┬─name─┬─data_compressed_bytes─┬─data_uncompressed_bytes─┐ +│ my_regular_table │ id │ 37790741 │ 75488328 │ +│ my_regular_table │ s │ 2451377 │ 12683106 │ +│ my_sparse_table │ id │ 37790741 │ 75488328 │ +│ my_sparse_table │ s │ 2283454 │ 9855751 │ +└──────────────────┴──────┴───────────────────────┴─────────────────────────┘ +``` + +カラムがスパースなエンコーディングを使用しているかどうかを確認するには、`system.parts_columns` テーブルの `serialization_kind` カラムを表示します。 + +```sql +SELECT column, serialization_kind FROM system.parts_columns +WHERE table LIKE 'my_sparse_table'; +``` + +スパースなシリアライゼーションを使用してストレージされた `s` の部分を見ることができます。 + +```response +┌─column─┬─serialization_kind─┐ +│ id │ Default │ +│ s │ Default │ +│ id │ Default │ +│ s │ Default │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +│ id │ Default │ +│ s │ Sparse │ +└────────┴────────────────────┘ +``` + +## replace_long_file_name_to_hash {#replace_long_file_name_to_hash} +カラムのファイル名が `max_file_name_length` バイトを超える場合、SipHash128 に置き換えます。デフォルト値: `false`. + +## max_file_name_length {#max_file_name_length} + +ハッシュを適用せずに元のままにしておくファイル名の最大長。`replace_long_file_name_to_hash` が有効になっている場合のみ影響します。この設定の値はファイル拡張子の長さを含みません。したがって、ファイルシステムのエラーを避けるために、通常 255 バイト以下の最大ファイル名長よりもある程度の余裕を持って設定することをお勧めします。デフォルト値: 127。 + +## allow_experimental_block_number_column + +マージにおいて仮想カラム `_block_number` を永続化します。 + +デフォルト値: false. + +## exclude_deleted_rows_for_part_size_in_merge {#exclude_deleted_rows_for_part_size-in-merge} + +有効にすると、`DELETE FROM` を使用して削除された行を除外して、データパーツの実際の推定サイズを使用してパーツを選択してマージを行います。この動作は、この設定が有効化された `DELETE FROM` の影響を受けるデータパーツにのみトリガーされることに注意してください。 + +可能な値: + +- true, false + +デフォルト値: false + +**関連項目** + +- [load_existing_rows_count_for_old_parts](#load_existing_rows_count-for-old-parts) 設定 + +## load_existing_rows_count_for_old_parts {#load_existing_rows_count_for_old_parts} + +[exclude_deleted_rows_for_part_size_in_merge](#exclude_deleted_rows_for_part_size_in_merge) とともに有効にされている場合、既存のデータパーツの削除された行数がテーブルの起動時に計算されます。これは、テーブルの起動時に遅延が発生する可能性があります。 + +可能な値: + +- true, false + +デフォルト値: false + +**関連項目** + +- [exclude_deleted_rows_for_part_size_in_merge](#exclude_deleted_rows_for_part_size_in_merge) 設定 + +## use_compact_variant_discriminators_serialization {#use_compact_variant_discriminators_serialization} + +Variant データ型でのバイナリシリアライゼーションのディスクリミネータのためのコンパクトモードを有効化します。 +このモードでは、大多数が1つのバリアントまたは多くのNULL値がある場合に、パーツにディスクリミネータが保存されるために大幅にメモリを節約できます。 + +デフォルト値: true + +## merge_workload + +マージおよび他のワークロード間でのリソース利用と共有を調整するために使用されます。特定のテーブルのバックグラウンドマージのための `workload` 設定値として使用します。指定されていない場合(空の文字列)、サーバー設定 `merge_workload` が代わりに使用されます。 + +デフォルト値: 空の文字列 + +**関連項目** +- [ワークロードスケジューリング](/docs/ja/operations/workload-scheduling.md) + +## mutation_workload + +変異および他のワークロード間でのリソース利用と共有を調整するために使用されます。特定のテーブルのバックグラウンド変異のための `workload` 設定値として使用します。指定されていない場合(空の文字列)、サーバー設定 `mutation_workload` が代わりに使用されます。 + +デフォルト値: 空の文字列 + +**関連項目** +- [ワークロードスケジューリング](/docs/ja/operations/workload-scheduling.md) + +### optimize_row_order + +新しく挿入されたテーブルパートの圧縮性を向上させるために行順序を最適化すべきかどうかを制御します。 + +これは通常の MergeTree エンジン テーブルにのみ影響します。専用の MergeTree エンジンテーブル(例: CollapsingMergeTree)には影響しません。 + +MergeTree テーブルは(任意で)[圧縮コーデック](../../sql-reference/statements/create/table.md#column_compression_codec)を使用して圧縮されます。 +LZ4 や ZSTD などの一般的な圧縮コーデックは、データがパターンを示す場合、最大の圧縮率を達成します。 +同じ値の長く続くランは通常非常によく圧縮されます。 + +この設定が有効になっている場合、ClickHouse は新しく挿入されたパーツ内のデータを、テーブルの新しいパーツのカラム全体で等値ランの数を最小化するような行順序で保存しようとします。 +言い換えれば、少ない数の等値ランは個々のランが長くなり、よく圧縮されることを意味します。 + +最適な行順序を見つけることは計算上不可能(NPハード)です。 +そのため、ClickHouse は依然として元の行順序よりも圧縮率を改善する行順序を迅速に見つけるためにヒューリスティックスを使用します。 + +
    + +行順序を見つけるためのヒューリスティックス + +SQLでは、異なる行順序の同じテーブル(テーブルパート)が同等であると見なされるため、テーブル(またはテーブルパート)に対して自由に行をシャッフルすることが一般に可能です。 + +テーブルの主キーが定義されている場合、この行のシャッフルの自由度は制限されます。 +ClickHouse では、主キー `C1, C2, ..., CN` は、テーブルの行により `C1`, `C2`, ..., `Cn` のカラムでソートされていることが求められます([クラスタインデックス](https://en.wikipedia.org/wiki/Database_index#Clustered))。 +その結果、プライマリキーカラムと同じ値を持つ行、すなわち行の"等値クラス"内でのみ行のシャッフルが許可されます。 +直感的には、高カードのプライマリキー、例: `DateTime64` タイムスタンプカラムを含む主キーは多数の小さな等値クラスを生じます。 +それに対して、低カードのプライマリキーを持つテーブルは少数の大きな等値クラスを生成します。 +主キーなしのテーブルは、すべての行を一つの等値クラスとして表現する極端なケースです。 + +等値クラスが少なく、大きいほど、行の再シャッフル時の自由度が高くなります。 + +それぞれの等値クラスにおける最適な行順序を見つけるヒューリスティックスは、D. Lemire, O. Kaserが[Reordering columns for smaller indexes](https://doi.org/10.1016/j.ins.2011.02.002)で提案し、主キー以外のカラムの昇順で行を並べ替えます。 +次の3つの手順を実行します。 +1. 主キーカラムの行値に基づいてすべての等値クラスを見つけます。 +2. 各等値クラスに対して、主キー以外のカラムのカーディナリティを計算(通常は推定)します。 +3. 各等値クラスに対して、主キー以外のカラムのカーディナリティの昇順で行を並べ替えます。 + +
    + +有効にすると、新しいデータの行順序を分析および最適化するための追加のCPUコストが発生します。 +INSERTの実行は、データ特性に応じて30〜50%長くなることが予想されます。 +LZ4 または ZSTD の圧縮率は平均20〜40%改善します。 + +この設定は、低カードの主キーを持つテーブルに最適です。すなわち、少数の異なる主キー値を持つテーブルです。 +高カードの主キー、例: `DateTime64` 型のタイムスタンプカラムを含む主キーは、この設定からの利益を期待されません。 + +## lightweight_mutation_projection_mode + +デフォルトでは、論理削除の `DELETE` は、プロジェクションを持つテーブルには機能しません。これは、プロジェクション中の行が `DELETE` 操作によって影響を受ける可能性があるためです。したがって、デフォルト値は `throw` となります。 +しかし、このオプションにより動作を変更できます。`drop` または `rebuild` のいずれかの値を使用した場合、削除がプロジェクションに伴います。`drop` はプロジェクションを削除するため、プロジェクションが削除されたがために現在のクエリで高速ですが、将来のクエリで遅くなる可能性があります。 +`rebuild` はプロジェクションを再構築し、現在のクエリのパフォーマンスに影響を与えますが、将来のクエリのスピードアップが期待されます。良いことは、これらのオプションは部分レベルでのみ動作するため、 +タッチしない部分のプロジェクションは、削除や再構築のアクションをトリガーすることなくそのまま残ります。 + +可能な値: + +- throw, drop, rebuild + +デフォルト値: throw + +## deduplicate_merge_projection_mode + +非クラシック MergeTree で非クラシック MergeTree を持つテーブルのためにプロジェクションを作成することを許可するかどうか。無視するオプションは、純粋に互換性のためのもので、誤った回答をもたらす可能性があります。許可される場合、マージプロジェクションのアクション(削除または再構築)です。そのため、クラシック MergeTree はこの設定を無視します。 +`OPTIMIZE DEDUPLICATE` も制御し、すべての MergeTree ファミリメンバーに影響を及ぼします。`lightweight_mutation_projection_mode` オプションと同様に、部分レベルです。 + +可能な値: + +- ignore, throw, drop, rebuild + +デフォルト値: throw + +## min_free_disk_bytes_to_perform_insert + +データを挿入するためにディスクスペースに空いているべき最小バイト数。利用可能なバイトが `min_free_disk_bytes_to_throw_insert` 未満の場合は例外がスローされ、挿入が実行されません。この設定は以下を念頭に置いています。 +- `keep_free_space_bytes` 設定を考慮します。 +- `INSERT` 操作によって書き込まれるデータ量は考慮しません。 +- 正の(ゼロでない)バイト数が指定された場合にのみチェックされます + +可能な値: + +- 任意の正の整数。 + +デフォルト値: 0 バイト。 + +`min_free_disk_bytes_to_perform_insert` と `min_free_disk_ratio_to_perform_insert` の両方が指定されている場合、ClickHouse は空きメモリの大きさで入力を許可する値を考慮します。 + +## min_free_disk_ratio_to_perform_insert + +`INSERT` を実行するためのディスクスペースの最小の空き対合計比率。0と1の間の浮動小数点値である必要があります。この設定は以下を考慮します。 +- `keep_free_space_bytes` 設定を考慮します。 +- `INSERT` 操作によって書き込まれるデータ量は考慮しません。 +- 正の(ゼロでない)比率が指定された場合にのみチェックされます + +可能な値: + +- 浮動小数点、0.0 - 1.0 + +デフォルト値: 0.0 + +`min_free_disk_ratio_to_perform_insert` と `min_free_disk_bytes_to_perform_insert` の両方が指定されている場合、ClickHouse は空きメモリの大きな部分で挿入を実行することを許可する値を考慮します。 diff --git a/docs/ja/operations/settings/permissions-for-queries.md b/docs/ja/operations/settings/permissions-for-queries.md new file mode 100644 index 00000000000..375fcfe71b2 --- /dev/null +++ b/docs/ja/operations/settings/permissions-for-queries.md @@ -0,0 +1,66 @@ +--- +slug: /ja/operations/settings/permissions-for-queries +sidebar_position: 58 +sidebar_label: クエリの権限 +--- + +# クエリの権限 + +ClickHouseのクエリは以下のいくつかのタイプに分けられます。 + +1. データ読み取りクエリ: `SELECT`、`SHOW`、`DESCRIBE`、`EXISTS` +2. データ書き込みクエリ: `INSERT`、`OPTIMIZE` +3. 設定変更クエリ: `SET`、`USE` +4. [DDL](https://en.wikipedia.org/wiki/Data_definition_language) クエリ: `CREATE`、`ALTER`、`RENAME`、`ATTACH`、`DETACH`、`DROP`、`TRUNCATE` +5. `KILL QUERY` + +以下の設定は、クエリのタイプによってユーザー権限を調整します。 + +## readonly +データの読み取り、データの書き込み、および設定変更クエリに対する権限を制限します。 + +1に設定すると、以下が許可されます: + +- 全てのタイプの読み取りクエリ(`SELECT`や同等のクエリなど) +- セッションコンテキストのみを変更するクエリ(`USE`など) + +2に設定すると、上記に加えて以下も許可されます: +- `SET` と `CREATE TEMPORARY TABLE` + + :::tip + `EXISTS`、`DESCRIBE`、`EXPLAIN`、`SHOW PROCESSLIST` などのクエリは、システムテーブルからの選択を行うだけなので、`SELECT` と同等です。 + ::: + +可能な値: +- 0 — 読み取り、書き込み、設定変更クエリが許可されます。 +- 1 — データ読み取りクエリのみが許可されます。 +- 2 — データ読み取りおよび設定変更クエリが許可されます。 + +デフォルト値: 0 + +:::note +`readonly = 1` を設定した後、現在のセッションで `readonly` および `allow_ddl` の設定を変更することはできません。 + +[HTTPインターフェース](../../interfaces/http.md)で`GET`メソッドを使用する場合、`readonly = 1` が自動的に設定されます。データを変更するには、`POST`メソッドを使用してください。 + +`readonly = 1` を設定すると、ユーザーは設定を変更できなくなります。特定の設定のみの変更を禁止する方法もあります。また、`readonly = 1` の制限下で特定の設定のみの変更を許可する方法もあります。詳細は[設定の制約](../../operations/settings/constraints-on-settings.md)を参照してください。 +::: + +## allow_ddl {#allow_ddl} + +[DDL](https://en.wikipedia.org/wiki/Data_definition_language)クエリを許可または禁止します。 + +可能な値: + +- 0 — DDLクエリは許可されません。 +- 1 — DDLクエリは許可されます。 + +デフォルト値: 1 + +:::note +現在のセッションで `allow_ddl = 0` の場合、`SET allow_ddl = 1` を実行することはできません。 +::: + +:::note KILL QUERY +`KILL QUERY` は、`readonly` と `allow_ddl` の設定のいかなる組み合わせでも実行可能です。 +::: diff --git a/docs/ja/operations/settings/query-complexity.md b/docs/ja/operations/settings/query-complexity.md new file mode 100644 index 00000000000..1f247bd6343 --- /dev/null +++ b/docs/ja/operations/settings/query-complexity.md @@ -0,0 +1,423 @@ +--- +slug: /ja/operations/settings/query-complexity +sidebar_position: 59 +sidebar_label: クエリの複雑さの制限 +--- + +# クエリの複雑さの制限 + +クエリの複雑さの制限は設定の一部です。これらはユーザーインターフェースからの安全な実行を提供するために使用されます。ほとんどの制限は`SELECT`にのみ適用されます。分散クエリ処理のために、制限は各サーバーごとに個別に適用されます。 + +ClickHouse はデータパーツの制限をチェックし、各行ごとではありません。つまり、制限の値をデータパーツのサイズで超えることができます。 + +「何かの最大量」の制限は 0 の値を取ることができ、これは「制限なし」を意味します。ほとんどの制限には、制限を超えた場合にどうするかを決定する「overflow_mode」設定もあります。それは 2 つの値のいずれかを取ることができます: `throw`または`break`。集計(group_by_overflow_mode)の制限には、`any`の値もあります。 + +`throw` – 例外を投げる(デフォルト)。 + +`break` – クエリの実行を停止し、部分的な結果を返す(ソースデータが尽きたかのように)。 + +`any(group_by_overflow_mode のみ)` – 集約のキーがセットに入ったキーに対してのみ継続し、新しいキーをセットに追加しない。 + +## max_memory_usage {#settings_max_memory_usage} + +単一サーバーでクエリの実行に使用される最大RAM量。 + +デフォルト設定は無制限(`0`に設定)。 + +クラウドのデフォルト値:レプリカのRAM量に依存。 + +この設定は、利用可能なメモリの容量やマシンのメモリの合計容量を考慮しません。この制限は単一サーバー内の単一クエリに適用されます。`SHOW PROCESSLIST`を使用すると、各クエリの現在のメモリ消費を確認できます。さらに、各クエリのピークメモリ消費が追跡され、ログに書き込まれます。 + +特定の集計関数の状態のメモリ使用量は監視されません。 + +`min`、`max`、`any`、`anyLast`、`argMin`、`argMax`の集計関数の状態のメモリ使用量は完全には追跡されていません。 + +メモリ消費は`max_memory_usage_for_user`および[max_server_memory_usage](../../operations/server-configuration-parameters/settings.md#max_server_memory_usage)のパラメータによっても制限されます。 + +## max_memory_usage_for_user {#max-memory-usage-for-user} + +単一サーバーでユーザーのクエリの実行に使用される最大RAM量。 + +デフォルト値は[Settings.h](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.h#L288)で定義されています。デフォルトでは、量は制限されていません(`max_memory_usage_for_user = 0`)。 + +[max_memory_usage](#settings_max_memory_usage)の説明も参照してください。 + +たとえば、`clickhouse_read`という名前のユーザーに対して`max_memory_usage_for_user`を1000バイトに設定したい場合は、次のステートメントを使用します。 + +``` sql +ALTER USER clickhouse_read SETTINGS max_memory_usage_for_user = 1000; +``` + +それが機能したことを確認するには、クライアントからログアウトし、再度ログインしてから、`getSetting`関数を使用します: + +```sql +SELECT getSetting('max_memory_usage_for_user'); +``` + +## max_rows_to_read {#max-rows-to-read} + +次の制限は各ブロックでチェックされる場合があります(各行ではありません)。つまり、制限を少し超えることができます。 + +クエリを実行する際にテーブルから読み取ることができる最大行数。 + +## max_bytes_to_read {#max-bytes-to-read} + +クエリを実行する際にテーブルから読み取ることができる最大バイト数(非圧縮データ)。 + +## read_overflow_mode {#read-overflow-mode} + +読み取りデータボリュームが制限を超えた場合にどうするか:`throw`または`break`。デフォルトは`trow`。 + +## max_rows_to_read_leaf {#max-rows-to-read-leaf} + +次の制限は各ブロックでチェックされる場合があります(各行ではありません)。つまり、制限を少し超えることができます。 + +分散クエリを実行する際にリーフノード上のローカルテーブルから読み取ることができる最大行数です。分散クエリは各シャード(リーフ)に対する複数のサブクエリを発行することができます - この制限はリーフノードでの読み取り段階でのみチェックされ、ルートノードでの結果マージ段階では無視されます。たとえば、2つのシャードから成るクラスターがあり、各シャードに100行のテーブルがあるとします。それから分散クエリは両方のテーブルからすべてのデータを読み取ろうとしているので、`max_rows_to_read=150`を設定するとトータルで200行になるため失敗します。一方で`max_rows_to_read_leaf=150`を設定したクエリは成功します、なぜならリーフノードが最大で100行を読み取るからです。 + +## max_bytes_to_read_leaf {#max-bytes-to-read-leaf} + +分散クエリを実行する際にリーフノード上のローカルテーブルから読み取ることができる最大バイト数(非圧縮データ)。分散クエリは各シャード(リーフ)に対する複数のサブクエリを発行することができます - この制限はリーフノードでの読み取り段階でのみチェックされ、ルートノードでの結果マージ段階では無視されます。たとえば、2つのシャードから成るクラスターがあり、各シャードに100バイトのデータテーブルがあるとします。それから分散クエリがすべてのデータを両方のテーブルから読み取ろうとしているので、`max_bytes_to_read=150`を設定するとトータルで200バイトになるため失敗します。一方で`max_bytes_to_read_leaf=150`を設定したクエリは成功します、なぜならリーフノードが最大で100バイトを読み取るからです。 + +## read_overflow_mode_leaf {#read-overflow-mode-leaf} + +リーフ制限を超えるデータ量で読み取りが行われた場合にどのようにするか:`throw`または`break`です。デフォルトは`trow`です。 + +## max_rows_to_group_by {#settings-max-rows-to-group-by} + +集計から受け取るユニークなキーの最大数。この設定は集計時のメモリ消費を制限することを可能にします。 + +## group_by_overflow_mode {#group-by-overflow-mode} + +集計のユニークなキー数が制限を超えた場合にどうするか:`throw`、 `break`、または `any`。 デフォルトは `throw` です。 `any` 値を使用すると、GROUP BY の近似値を実行できます。この近似値の精度はデータの統計的性質に依存します。 + +## max_bytes_before_external_group_by {#settings-max_bytes_before_external_group_by} + +`GROUP BY`句の外部メモリでの実行を有効または無効にします。 詳細は[外部メモリでのGROUP BY](../../sql-reference/statements/select/group-by.md#select-group-by-in-external-memory)を参照してください。 + +可能な値: + +- 単一の[GROUP BY](../../sql-reference/statements/select/group-by.md#select-group-by-clause)操作で使用できる最大のRAMボリューム(バイト単位)。 +- 0 — 外部メモリでの`GROUP BY`が無効。 + +デフォルト値:`0`. + +クラウドのデフォルト値:レプリカあたりのメモリ量の半分。 + +## max_bytes_before_external_sort {#settings-max_bytes_before_external_sort} + +`ORDER BY`句の外部メモリでの実行を有効または無効にします。 詳細は[ORDER BY の実装方法](../../sql-reference/statements/select/order-by.md#implementation-details)を参照してください。 + +- 単一の[ORDER BY](../../sql-reference/statements/select/order-by.md)操作で使用可能な最大RAMボリューム(バイト単位)。 推奨値は、利用可能なシステムメモリの半分です。 +- 0 — 外部メモリでの`ORDER BY`が無効。 + +デフォルト値:0。 + +クラウドのデフォルト値:レプリカあたりのメモリ量の半分。 + +## max_rows_to_sort {#max-rows-to-sort} + +ソート前の最大行数。これにより、ソート時のメモリ消費を制限することができます。 + +## max_bytes_to_sort {#max-bytes-to-sort} + +ソート前の最大バイト数。 + +## sort_overflow_mode {#sort-overflow-mode} + +ソートする前に受け取った行の数が制限を超えた場合にどうするか:`throw`または`break`。 デフォルトは`throw`です。 + +## max_result_rows {#setting-max_result_rows} + +結果の行数の制限。サブクエリでもチェックされ、分散クエリの一部を実行する際のリモートサーバーでもチェックされます。値が`0`の場合は制限は適用されません。 + +デフォルト値:`0`. + +クラウドのデフォルト値:`0`. + +## max_result_bytes {#max-result-bytes} + +結果のバイト数の制限。前の設定と同様。 + +## result_overflow_mode {#result-overflow-mode} + +結果のボリュームがいずれかの制限を超えた場合にどうするか:`throw`または`break`。 + +`break`を使用することは、LIMITを使用することと似ています。`Break`はブロックレベルでのみ実行を中断します。これは、返される行数が[max_result_rows](#setting-max_result_rows)より多いことを意味し、[max_block_size](../../operations/settings/settings.md#setting-max_block_size)の倍数であり、[max_threads](../../operations/settings/settings.md#max_threads)に依存します。 + +デフォルト値:`throw`. + +クラウドのデフォルト値:`throw`. + +例: + +``` sql +SET max_threads = 3, max_block_size = 3333; +SET max_result_rows = 3334, result_overflow_mode = 'break'; + +SELECT * +FROM numbers_mt(100000) +FORMAT Null; +``` + +結果: + +``` text +6666 rows in set. ... +``` + +## max_execution_time {#max-execution-time} + +クエリの最大実行時間(秒単位)。この時間、ソート段階のいずれか、または集計関数のマージや最終化時にはチェックされません。 + +`max_execution_time`パラメータは理解しづらい場合があります。これは現在のクエリ実行速度に対する補間に基づいて動作します(この動作は[timeout_before_checking_execution_speed](#timeout-before-checking-execution-speed)によって制御されます)。ClickHouseは、指定された`max_execution_time`を超えると予測される実行時間がある場合、クエリを中断します。デフォルトで、timeout_before_checking_execution_speedは10秒に設定されています。これは、クエリの実行開始から10秒後に、ClickHouseが総実行時間を見積もり始めることを意味します。たとえば、`max_execution_time`が3600秒(1時間)に設定されている場合、見積もり時間がこの3600秒の制限を超えると、ClickHouseはクエリを終了します。`timeout_before_checking_execution_speed`を0に設定すると、ClickHouseはクロック時間を`max_execution_time`の基準として使用します。 + +## timeout_overflow_mode {#timeout-overflow-mode} + +クエリが`max_execution_time`を超えて実行された場合または見積もり実行時間が`max_estimated_execution_time`を超えている場合にどうするか:`throw`または`break`。デフォルトは`throw`。 + +## max_execution_time_leaf + +`max_execution_time`と同様の意味ですが、分散またはリモートクエリのリーフノードにのみ適用されます。 + +たとえば、リーフノードの実行時間を`10s`に制限して、初期ノードには制限をかけない場合、入れ子のサブクエリ設定の中で`max_execution_time`を持つ代わりに: + +``` sql +SELECT count() FROM cluster(cluster, view(SELECT * FROM t SETTINGS max_execution_time = 10)); +``` + +クエリ設定として`max_execution_time_leaf`を使用できます: + +``` sql +SELECT count() FROM cluster(cluster, view(SELECT * FROM t)) SETTINGS max_execution_time_leaf = 10; +``` + +## timeout_overflow_mode_leaf + +リーフノードのクエリが`max_execution_time_leaf`より長く実行された場合にどうするか:`throw`または`break`。デフォルトは`throw`。 + +## min_execution_speed {#min-execution-speed} + +秒あたりの行数での最小実行速度。‘timeout_before_checking_execution_speed’が期限切れになった時点で各データブロックでチェックされます。実行速度が低い場合、例外がスローされます。 + +## min_execution_speed_bytes {#min-execution-speed-bytes} + +1秒あたりの最小実行バイト数。‘timeout_before_checking_execution_speed’が期限切れになった時点で各データブロックでチェックされます。実行速度が低い場合、例外がスローされます。 + +## max_execution_speed {#max-execution-speed} + +1秒あたりの最大実行行数。‘timeout_before_checking_execution_speed’が期限切れになった時点で各データブロックでチェックされます。実行速度が高い場合、実行速度は低減されます。 + +## max_execution_speed_bytes {#max-execution-speed-bytes} + +1秒あたりの最大実行バイト数。‘timeout_before_checking_execution_speed’が期限切れになった時点で各データブロックでチェックされます。実行速度が高い場合、実行速度は低減されます。 + +## timeout_before_checking_execution_speed {#timeout-before-checking-execution-speed} + +指定された秒数が過ぎた後に、実行速度が遅すぎないこと(‘min_execution_speed’以上であること)をチェックします。 + +## max_estimated_execution_time {#max_estimated_execution_time} + +秒単位のクエリ推定実行時間の最大値。‘timeout_before_checking_execution_speed’が期限切れになった時点で各データブロックでチェックされます。 + +## max_columns_to_read {#max-columns-to-read} + +1つのクエリでテーブルから読み取れるカラムの最大数。クエリがより多くのカラムを読み取る必要がある場合、例外がスローされます。 + +## max_temporary_columns {#max-temporary-columns} + +クエリ実行中に同時にRAMに保持される一時カラムの最大数で、定数カラムを含みます。一時カラムがこの数を超えた場合、例外がスローされます。 + +## max_temporary_non_const_columns {#max-temporary-non-const-columns} + +‘max_temporary_columns’と同じですが、定数カラムをカウントしません。クエリ実行中、一時的に生成される定数カラムは非常に頻繁に形成されますが、計算資源はほとんど必要としません。 + +## max_subquery_depth {#max-subquery-depth} + +サブクエリの最大ネスト深度。サブクエリがより深い場合、例外がスローされます。デフォルトで100です。 + +## max_pipeline_depth {#max-pipeline-depth} + +最大パイプライン深度。クエリ処理中に各データブロックが通過する変換の数に対応します。単一サーバー内での制限内でカウントされます。パイプラインの深さが大きい場合、例外がスローされます。デフォルトで1000です。 + +## max_ast_depth {#max-ast-depth} + +クエリの構文木の最大ネスト深度。超過すると、例外がスローされます。この時点では、解析中ではなく、クエリの解析後にのみチェックされます。つまり、解析中に深すぎる構文木を作成することができるが、クエリは失敗します。デフォルトで1000です。 + +## max_ast_elements {#max-ast-elements} + +クエリの構文木の要素の最大数。超過すると、例外がスローされます。前の設定と同様に、クエリの解析後にのみチェックされます。デフォルトで50,000です。 + +## max_rows_in_set {#max-rows-in-set} + +サブクエリから作成されたIN句のデータセットの最大行数。 + +## max_bytes_in_set {#max-bytes-in-set} + +サブクエリから作成されたIN句で使用されるセットの最大バイト数(非圧縮データ)。 + +## set_overflow_mode {#set-overflow-mode} + +データ量が制限を超えた場合にどうするか:`throw`または`break`。デフォルトで`trow`。 + +## max_rows_in_distinct {#max-rows-in-distinct} + +DISTINCTを使用する際の異なる行数の最大数。 + +## max_bytes_in_distinct {#max-bytes-in-distinct} + +DISTINCTを使用する際にハッシュテーブルで使用される最大バイト数。 + +## distinct_overflow_mode {#distinct-overflow-mode} + +データ量が制限を超えた場合にどうするか:`throw`または`break`。デフォルトで`trow`。 + +## max_rows_to_transfer {#max-rows-to-transfer} + +GLOBAL INを使用する際にリモートサーバーに渡されるか、一時テーブルに保存される最大行数。 + +## max_bytes_to_transfer {#max-bytes-to-transfer} + +GLOBAL INを使用する際にリモートサーバーに渡されるか、一時テーブルに保存される最大バイト数(非圧縮データ)。 + +## transfer_overflow_mode {#transfer-overflow-mode} + +データ量が制限を超えた場合にどうするか:'throw'または'break'。デフォルトで`throw`。 + +## max_rows_in_join {#settings-max_rows_in_join} + +テーブル結合時に使用されるハッシュテーブルの行数を制限します。 + +この設定は[SELECT ... JOIN](../../sql-reference/statements/select/join.md#select-join)操作および[Join](../../engines/table-engines/special/join.md)テーブルエンジンに適用されます。 + +クエリに複数の結合が含まれる場合、ClickHouseはこの設定を各中間結果に対してチェックします。 + +制限に達した場合、ClickHouseは異なるアクションを実行することができます。アクションを選択するには[join_overflow_mode](#settings-join_overflow_mode)設定を使用します。 + +可能な値: + +- 正の整数 +- 0 — 無制限の行数 + +デフォルト値:0 + +## max_bytes_in_join {#settings-max_bytes_in_join} + +テーブル結合時に使用されるハッシュテーブルのサイズをバイト単位で制限します。 + +この設定は[SELECT ... JOIN](../../sql-reference/statements/select/join.md#select-join)操作および[Joinテーブルエンジン](../../engines/table-engines/special/join.md)に適用されます。 + +クエリに結合が含まれている場合、ClickHouseはこの設定を各中間結果に対してチェックします。 + +制限に達した場合、ClickHouseは異なるアクションを実行することができます。アクションを選択するには[join_overflow_mode](#settings-join_overflow_mode)設定を使用します。 + +可能な値: + +- 正の整数 +- 0 — メモリ管理が無効 + +デフォルト値:0 + +## join_overflow_mode {#settings-join_overflow_mode} + +次の結合制限のいずれかに達した場合にClickHouseがどのアクションを実行するかを定義します: + +- [max_bytes_in_join](#settings-max_bytes_in_join) +- [max_rows_in_join](#settings-max_rows_in_join) + +可能な値: + +- `THROW` — ClickHouseが例外をスローし、操作を中断。 +- `BREAK` — ClickHouseが操作を中断し、例外をスローしない。 + +デフォルト値:`THROW`。 + +**関連情報** + +- [JOIN句](../../sql-reference/statements/select/join.md#select-join) +- [Joinテーブルエンジン](../../engines/table-engines/special/join.md) + +## max_partitions_per_insert_block {#settings-max_partitions_per_insert_block} + +単一の挿入ブロックにおける最大パーティション数を制限します。 + +- 正の整数 +- 0 — パーティション数無制限。 + +デフォルト値:100 + +**詳細** + +データを挿入すると、ClickHouseは挿入ブロックのパーティション数を計算します。もしパーティション数が`max_partitions_per_insert_block`より多い場合、`throw_on_max_partitions_per_insert_block`に基づいて、ClickHouseは警告をログするか、例外をスローします。例外のテキストは次のとおりです: + +> “1つのINSERTブロックに対してパーティションが多すぎます(`partitions_count`パーティション、制限は” + toString(max_partitions) + “)。制限は‘max_partitions_per_insert_block’設定で制御されます。大量のパーティションは一般的な誤解であり、深刻なパフォーマンスの悪影響をもたらします、例えばサーバーの起動時間が遅くなったり、INSERTクエリとSELECTクエリが遅くなったりします。推奨されるテーブルのパーティションの合計数は1000〜10000以下です。SELECTクエリを高速化するためにパーティションが意図されていないことに注意してください(ORDER BYキーは範囲クエリを高速化するのに十分です)。パーティションはデータ操作(DROP PARTITIONなど)のために意図されています。” + +## throw_on_max_partitions_per_insert_block {#settings-throw_on_max_partition_per_insert_block} + +`max_partitions_per_insert_block`に達した場合の動作を制御します。 + +- `true` - 挿入ブロックが`max_partitions_per_insert_block`に達した場合、例外を発生します。 +- `false` - `max_partitions_per_insert_block`に達した場合に警告をログします。 + +デフォルト値:`true` + +## max_temporary_data_on_disk_size_for_user {#settings_max_temporary_data_on_disk_size_for_user} + +すべての同時実行されているユーザークエリのためにディスク上で消費される一時ファイルのデータの最大量(バイト単位)。ゼロは無制限を意味します。 + +デフォルト値:0。 + +## max_temporary_data_on_disk_size_for_query {#settings_max_temporary_data_on_disk_size_for_query} + +すべての同時実行されているクエリのためにディスク上で消費される一時ファイルのデータの最大量(バイト単位)。ゼロは無制限を意味します。 + +デフォルト値:0。 + +## max_sessions_for_user {#max-sessions-per-user} + +ClickHouseサーバーへの認証済みユーザーごとの同時セッションの最大数。 + +例: + +``` xml + + + 1 + + + 2 + + + 0 + + + + + + single_session_user + + + + two_sessions_profile + + + + unlimited_sessions_profile + + +``` + +デフォルト値:0(無制限の同時セッション数)。 + +## max_partitions_to_read {#max-partitions-to-read} + +1つのクエリでアクセスできる最大パーティション数を制限します。 + +テーブルが作成されたときに指定された設定値は、クエリレベルの設定で上書きできます。 + +可能な値: + +- 任意の正の整数 + +デフォルト値:-1(無制限)。 + +テーブルの設定でMergeTree設定[max_partitions_to_read](merge-tree-settings#max-partitions-to-read)を指定することもできます。 diff --git a/docs/ja/operations/settings/settings-formats.md b/docs/ja/operations/settings/settings-formats.md new file mode 100644 index 00000000000..6ba3d2fffcd --- /dev/null +++ b/docs/ja/operations/settings/settings-formats.md @@ -0,0 +1,2350 @@ +--- +title: フォーマット設定 +sidebar_label: フォーマット設定 +slug: /ja/operations/settings/formats +toc_max_heading_level: 2 +--- + +これらの設定は、[source](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/FormatFactorySettings.h) から自動生成されています。 + +## bool_false_representation {#bool_false_representation} + +タイプ: String + +デフォルト値: false + +TSV/CSV/Vertical/Pretty フォーマットで false のブール値を表現するテキスト。 + +## bool_true_representation {#bool_true_representation} + +タイプ: String + +デフォルト値: true + +TSV/CSV/Vertical/Pretty フォーマットで true のブール値を表現するテキスト。 + +## column_names_for_schema_inference {#column_names_for_schema_inference} + +タイプ: String + +デフォルト値: + +カラム名なしでフォーマットのスキーマ推論に使用するカラム名のリスト。形式: 'column1,column2,column3,...' + +## cross_to_inner_join_rewrite {#cross_to_inner_join_rewrite} + +タイプ: UInt64 + +デフォルト値: 1 + +WHERE セクションに結合式がある場合、カンマ/クロス結合の代わりに内部結合を使用します。値: 0 - 書き換えなし, 1 - カンマ/クロスで可能なら適用, 2 - 全てのカンマ結合を強制的に書き換え, クロス - 可能なら + +## date_time_64_output_format_cut_trailing_zeros_align_to_groups_of_thousands {#date_time_64_output_format_cut_trailing_zeros_align_to_groups_of_thousands} + +タイプ: Bool + +デフォルト値: 0 + +datetime64 値の終端のゼロを動的に削除して、出力スケールを '秒'、'ミリ秒'、'マイクロ秒' に対応する [0, 3, 6] に調整します。 + +## date_time_input_format {#date_time_input_format} + +タイプ: DateTimeInputFormat + +デフォルト値: basic + +日付と時刻のテキスト表現のパーサーを選択可能。 + +この設定は[日付と時間の関数](../../sql-reference/functions/date-time-functions.md)には適用されません。 + +利用可能な値: + +- `'best_effort'` — 拡張解析を有効にします。 + + ClickHouse は基本の `YYYY-MM-DD HH:MM:SS` 形式およびすべての [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) の日付と時刻の形式を解析できます。例えば、`'2018-06-08T01:02:03.000Z'`。 + +- `'basic'` — 基本的なパーサーを使用。 + + ClickHouse は基本の `YYYY-MM-DD HH:MM:SS` または `YYYY-MM-DD` の形式のみ解析できます。例えば、`2019-08-20 10:18:56` または `2019-08-20`。 + +クラウドのデフォルト値: `'best_effort'`。 + +参照: + +- [DateTime データ型。](../../sql-reference/data-types/datetime.md) +- [日付と時間を扱うための関数。](../../sql-reference/functions/date-time-functions.md) + +## date_time_output_format {#date_time_output_format} + +タイプ: DateTimeOutputFormat + +デフォルト値: simple + +日付と時刻のテキスト表現の異なる出力フォーマットを選択可能。 + +利用可能な値: + +- `simple` - シンプルな出力フォーマット。 + + ClickHouse は日付と時刻を `YYYY-MM-DD hh:mm:ss` 形式で出力します。例えば、`2019-08-20 10:18:56`。計算はデータ型のタイムゾーン(存在する場合)またはサーバーのタイムゾーンに基づいて行われます。 + +- `iso` - ISO 出力フォーマット。 + + ClickHouse は日付と時刻を [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) `YYYY-MM-DDThh:mm:ssZ` 形式で出力します。例えば、`2019-08-20T10:18:56Z`。出力は UTC (`Z` は UTC を意味します) です。 + +- `unix_timestamp` - Unix タイムスタンプ出力フォーマット。 + + ClickHouse は日付と時刻を [Unix タイムスタンプ](https://en.wikipedia.org/wiki/Unix_time)形式で出力します。例えば `1566285536`。 + +参照: + +- [DateTime データ型。](../../sql-reference/data-types/datetime.md) +- [日付と時間を扱うための関数。](../../sql-reference/functions/date-time-functions.md) + +## date_time_overflow_behavior {#date_time_overflow_behavior} + +タイプ: DateTimeOverflowBehavior + +デフォルト値: ignore + +Date, Date32, DateTime, DateTime64 型のオーバーフローモード。利用可能な値: 'ignore', 'throw', 'saturate'。 + +## dictionary_use_async_executor {#dictionary_use_async_executor} + +タイプ: Bool + +デフォルト値: 0 + +複数のスレッドでディクショナリソースを読むパイプラインを実行します。これはローカル CLICKHOUSE ソースのディクショナリでのみサポートされています。 + +## errors_output_format {#errors_output_format} + +タイプ: String + +デフォルト値: CSV + +エラーをテキスト出力に書き出す方法。 + +## exact_rows_before_limit {#exact_rows_before_limit} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、ClickHouse は rows_before_limit_at_least 統計の正確な値を提供しますが、リミット前のデータを完全に読み取る必要があります。 + +## format_avro_schema_registry_url {#format_avro_schema_registry_url} + +タイプ: URI + +デフォルト値: + +AvroConfluent フォーマット用: Confluent スキーマレジストリ URL。 + +## format_binary_max_array_size {#format_binary_max_array_size} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +RowBinary フォーマットで Array に許可される最大サイズです。破損したデータの際に大量のメモリを割り当てないようにします。0 は制限がないことを意味します。 + +## format_binary_max_string_size {#format_binary_max_string_size} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +RowBinary フォーマットで String に許可される最大サイズです。破損したデータの際に大量のメモリを割り当てないようにします。0 は制限がないことを意味します。 + +## format_capn_proto_enum_comparising_mode {#format_capn_proto_enum_comparising_mode} + +タイプ: CapnProtoEnumComparingMode + +デフォルト値: by_values + +ClickHouse Enum と CapnProto Enum のマッピング方法 + +## format_capn_proto_use_autogenerated_schema {#format_capn_proto_use_autogenerated_schema} + +タイプ: Bool + +デフォルト値: 1 + +format_schema が設定されていない場合、自動生成された CapnProto スキーマを使用 + +## format_csv_allow_double_quotes {#format_csv_allow_double_quotes} + +タイプ: Bool + +デフォルト値: 1 + +true に設定されている場合、二重引用符で囲まれた文字列を許可します。 + +## format_csv_allow_single_quotes {#format_csv_allow_single_quotes} + +タイプ: Bool + +デフォルト値: 0 + +true に設定されている場合、単一引用符で囲まれた文字列を許可します。 + +## format_csv_delimiter {#format_csv_delimiter} + +タイプ: Char + +デフォルト値: , + +CSV データで区切り文字と見なされる文字。文字列で設定する場合、文字列の長さは 1 でなければなりません。 + +## format_csv_null_representation {#format_csv_null_representation} + +タイプ: String + +デフォルト値: \N + +CSV フォーマットでのカスタム NULL 表現 + +## format_custom_escaping_rule {#format_custom_escaping_rule} + +タイプ: EscapingRule + +デフォルト値: Escaped + +フィールドのエスケープルール (CustomSeparated フォーマット用) + +## format_custom_field_delimiter {#format_custom_field_delimiter} + +タイプ: String + +デフォルト値: + +フィールド間の区切り文字 (CustomSeparated フォーマット用) + +## format_custom_result_after_delimiter {#format_custom_result_after_delimiter} + +タイプ: String + +デフォルト値: + +結果セットの後に付けるサフィックス (CustomSeparated フォーマット用) + +## format_custom_result_before_delimiter {#format_custom_result_before_delimiter} + +タイプ: String + +デフォルト値: + +結果セットの前に付けるプレフィックス (CustomSeparated フォーマット用) + +## format_custom_row_after_delimiter {#format_custom_row_after_delimiter} + +タイプ: String + +デフォルト値: + +最後のカラムのフィールドの後の区切り文字 (CustomSeparated フォーマット用) + +## format_custom_row_before_delimiter {#format_custom_row_before_delimiter} + +タイプ: String + +デフォルト値: + +最初のカラムのフィールドの前の区切り文字 (CustomSeparated フォーマット用) + +## format_custom_row_between_delimiter {#format_custom_row_between_delimiter} + +タイプ: String + +デフォルト値: + +行間の区切り文字 (CustomSeparated フォーマット用) + +## format_display_secrets_in_show_and_select {#format_display_secrets_in_show_and_select} + +タイプ: Bool + +デフォルト値: 0 + +テーブル、データベース、テーブル関数、ディクショナリの `SHOW` と `SELECT` クエリで秘密を表示するかどうかを有効または無効にします。 + +秘密を見るユーザーは、[`display_secrets_in_show_and_select` サーバー設定](../server-configuration-parameters/settings#display_secrets_in_show_and_select) をオンにし、 +[`displaySecretsInShowAndSelect`](../../sql-reference/statements/grant#display-secrets) 特権を持つ必要があります。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## format_json_object_each_row_column_for_object_name {#format_json_object_each_row_column_for_object_name} + +タイプ: String + +デフォルト値: + +[JSONObjectEachRow](../../interfaces/formats.md/#jsonobjecteachrow) フォーマットでオブジェクト名の保存/書き込みに使用されるカラムの名前。 +カラムタイプは String でなければなりません。値が空の場合、デフォルトの名前 `row_{i}`がオブジェクト名として使用されます。 + +### input_format_json_compact_allow_variable_number_of_columns {#input_format_json_compact_allow_variable_number_of_columns} + +JSONCompact/JSONCompactEachRow 入力フォーマットで行のカラム数を変動可能に許可する。 +予想より多いカラムを持つ行では余分なカラムを無視し、欠けているカラムをデフォルト値として扱います。 + +デフォルトでは無効。 + +### output_format_markdown_escape_special_characters {#output_format_markdown_escape_special_characters} + +有効にすると、Markdown の特殊文字をエスケープします。 + +[Common Mark](https://spec.commonmark.org/0.30/#example-12)は以下の特殊文字を \ でエスケープできると定義しています: + +``` +! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ +``` + +可能な値: + ++ 0 — 無効。 ++ 1 — 有効。 + +### input_format_json_empty_as_default {#input_format_json_empty_as_default} + +有効にすると、JSON の空の入力フィールドをデフォルト値で置き換えます。複雑なデフォルト式に対しては `input_format_defaults_for_omitted_fields` も有効にする必要があります。 + +可能な値: + ++ 0 — 無効。 ++ 1 — 有効。 + +## format_protobuf_use_autogenerated_schema {#format_protobuf_use_autogenerated_schema} + +タイプ: Bool + +デフォルト値: 1 + +format_schema が設定されていない場合、自動生成された Protobuf を使用 + +## format_regexp {#format_regexp} + +タイプ: String + +デフォルト値: + +正規表現 (Regexp フォーマット用) + +## format_regexp_escaping_rule {#format_regexp_escaping_rule} + +タイプ: EscapingRule + +デフォルト値: Raw + +フィールドのエスケープルール (Regexp フォーマット用) + +## format_regexp_skip_unmatched {#format_regexp_skip_unmatched} + +タイプ: Bool + +デフォルト値: 0 + +正規表現によって一致しない行をスキップする (Regexp フォーマット用) + +## format_schema {#format_schema} + +タイプ: String + +デフォルト値: + +[Cap’n Proto](https://capnproto.org/) や [Protobuf](https://developers.google.com/protocol-buffers/) のようにスキーマ定義を必要とするフォーマットを使用する場合に便利です。値はフォーマットによります。 + +## format_template_resultset {#format_template_resultset} + +タイプ: String + +デフォルト値: + +結果セット用のフォーマット文字列が含まれるファイルのパス (Template フォーマット用) + +## format_template_resultset_format {#format_template_resultset_format} + +タイプ: String + +デフォルト値: + +結果セットのフォーマット文字列 (Template フォーマット用) + +## format_template_row {#format_template_row} + +タイプ: String + +デフォルト値: + +行用のフォーマット文字列が含まれるファイルのパス (Template フォーマット用) + +## format_template_row_format {#format_template_row_format} + +タイプ: String + +デフォルト値: + +行のフォーマット文字列 (Template フォーマット用) + +## format_template_rows_between_delimiter {#format_template_rows_between_delimiter} + +タイプ: String + +デフォルト値: + +行間の区切り文字 (Template フォーマット用) + +## format_tsv_null_representation {#format_tsv_null_representation} + +タイプ: String + +デフォルト値: \N + +TSV フォーマットでのカスタム NULL 表現 + +## input_format_allow_errors_num {#input_format_allow_errors_num} + +タイプ: UInt64 + +デフォルト値: 0 + +テキストフォーマット (CSV, TSV, など) の読み取り時に許容される最大エラー数を設定します。 + +デフォルト値は 0 です。 + +常に `input_format_allow_errors_ratio` とペアで使用してください。 + +行の読み取り中にエラーが発生してもエラーカウンターが `input_format_allow_errors_num` をまだ下回っている場合、ClickHouse はその行を無視し次の行へ進みます。 + +`input_format_allow_errors_num` と `input_format_allow_errors_ratio` が両方とも超過した場合、ClickHouse は例外をスローします。 + +## input_format_allow_errors_ratio {#input_format_allow_errors_ratio} + +タイプ: Float + +デフォルト値: 0 + +テキストフォーマット (CSV, TSV, など) の読み取り時に許容されるエラーの最大割合を設定します。 +エラーの割合は 0 と 1 の間の浮動小数点数で設定されます。 + +デフォルト値は 0 です。 + +常に `input_format_allow_errors_num` とペアで使用してください。 + +行の読み取り中にエラーが発生してもエラーカウンターが `input_format_allow_errors_ratio` をまだ下回っている場合、ClickHouse はその行を無視し次の行へ進みます。 + +`input_format_allow_errors_num` と `input_format_allow_errors_ratio` が両方とも超過した場合、ClickHouse は例外をスローします。 + +## input_format_allow_seeks {#input_format_allow_seeks} + +タイプ: Bool + +デフォルト値: 1 + +ORC/Parquet/Arrow 入力フォーマットで読み取り時のシークを許可します。 + +デフォルトで有効。 + +## input_format_arrow_allow_missing_columns {#input_format_arrow_allow_missing_columns} + +タイプ: Bool + +デフォルト値: 1 + +Arrow 入力フォーマットの読み取り時に欠損カラムを許可します。 + +## input_format_arrow_case_insensitive_column_matching {#input_format_arrow_case_insensitive_column_matching} + +タイプ: Bool + +デフォルト値: 0 + +Arrow のカラムと CH のカラムを一致させるときに大文字と小文字を無視します。 + +## input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference {#input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +Arrow フォーマットのスキーマ推論でサポートされない型のカラムをスキップします。 + +## input_format_avro_allow_missing_fields {#input_format_avro_allow_missing_fields} + +タイプ: Bool + +デフォルト値: 0 + +Avro/AvroConfluent フォーマット用: フィールドがスキーマに見つからない場合、エラーの代わりにデフォルト値を使用 + +## input_format_avro_null_as_default {#input_format_avro_null_as_default} + +タイプ: Bool + +デフォルト値: 0 + +Avro/AvroConfluent フォーマット用: null の場合、Nullable でないカラムにデフォルトを挿入 + +## input_format_binary_decode_types_in_binary_format {#input_format_binary_decode_types_in_binary_format} + +タイプ: Bool + +デフォルト値: 0 + +RowBinaryWithNamesAndTypes 入力フォーマットで型名の代わりにバイナリ形式でデータ型を読み取る + +## input_format_binary_read_json_as_string {#input_format_binary_read_json_as_string} + +タイプ: Bool + +デフォルト値: 0 + +RowBinary 入力フォーマットで [JSON](../../sql-reference/data-types/newjson.md) データ型の値を JSON [String](../../sql-reference/data-types/string.md) 値として読み取る。 + +## input_format_bson_skip_fields_with_unsupported_types_in_schema_inference {#input_format_bson_skip_fields_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +BSON フォーマットのスキーマ推論でサポートされない型のフィールドをスキップします。 + +## input_format_capn_proto_skip_fields_with_unsupported_types_in_schema_inference {#input_format_capn_proto_skip_fields_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +CapnProto フォーマットのスキーマ推論でサポートされない型のカラムをスキップします。 + +## input_format_csv_allow_cr_end_of_line {#input_format_csv_allow_cr_end_of_line} + +タイプ: Bool + +デフォルト値: 0 + +true に設定すると、\\r が \\n の後に続かなくても行末に許可されます。 + +## input_format_csv_allow_variable_number_of_columns {#input_format_csv_allow_variable_number_of_columns} + +タイプ: Bool + +デフォルト値: 0 + +CSV 入力 (ファイルが予想より多くのカラムを持つ場合) で余分なカラムを無視し、CSV 入力で欠けているフィールドをデフォルト値として扱います。 + +## input_format_csv_allow_whitespace_or_tab_as_delimiter {#input_format_csv_allow_whitespace_or_tab_as_delimiter} + +タイプ: Bool + +デフォルト値: 0 + +CSV 文字列でフィールドの区切り文字としてスペースやタブ (\\t) を使用可能にします。 + +## input_format_csv_arrays_as_nested_csv {#input_format_csv_arrays_as_nested_csv} + +タイプ: Bool + +デフォルト値: 0 + +CSV から Array を読み取る際、要素がネストされた CSV にシリアライズされてから文字列に格納されたと仮定します。例: \"[\"\"Hello\"\", \"\"world\"\", \"\"42\"\"\"\" TV\"\"]\"。配列の括弧は省略可能です。 + +## input_format_csv_deserialize_separate_columns_into_tuple {#input_format_csv_deserialize_separate_columns_into_tuple} + +タイプ: Bool + +デフォルト値: 1 + +true に設定されている場合、CSV フォーマットに書かれた別々のカラムを Tuple カラムにデシリアライズ可能です。 + +## input_format_csv_detect_header {#input_format_csv_detect_header} + +タイプ: Bool + +デフォルト値: 1 + +CSV フォーマットで名前と型のヘッダーを自動的に検出 + +## input_format_csv_empty_as_default {#input_format_csv_empty_as_default} + +タイプ: Bool + +デフォルト値: 1 + +CSV 入力で空のフィールドをデフォルト値として扱う。 + +## input_format_csv_enum_as_number {#input_format_csv_enum_as_number} + +タイプ: Bool + +デフォルト値: 0 + +CSV フォーマットで挿入された enum 値を enum インデックスとして扱う + +## input_format_csv_skip_first_lines {#input_format_csv_skip_first_lines} + +タイプ: UInt64 + +デフォルト値: 0 + +CSV フォーマットのデータの先頭でスキップする行数を指定します。 + +## input_format_csv_skip_trailing_empty_lines {#input_format_csv_skip_trailing_empty_lines} + +タイプ: Bool + +デフォルト値: 0 + +CSV フォーマットで末尾の空行をスキップ + +## input_format_csv_trim_whitespaces {#input_format_csv_trim_whitespaces} + +タイプ: Bool + +デフォルト値: 1 + +CSV 文字列の先頭と末尾のスペースとタブ (\\t) 文字をトリムします。 + +## input_format_csv_try_infer_numbers_from_strings {#input_format_csv_try_infer_numbers_from_strings} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、スキーマ推論中に ClickHouse は文字列フィールドから数値を推論しようとします。 +CSV データが引用符付きの UInt64 数値を含む場合に有効です。 + +デフォルトで無効。 + +## input_format_csv_try_infer_strings_from_quoted_tuples {#input_format_csv_try_infer_strings_from_quoted_tuples} + +タイプ: Bool + +デフォルト値: 1 + +入力データ内の引用されたタプルを String 型の値として解釈します。 + +## input_format_csv_use_best_effort_in_schema_inference {#input_format_csv_use_best_effort_in_schema_inference} + +タイプ: Bool + +デフォルト値: 1 + +CSV フォーマットでスキーマを推論するためにいくつかの調整とヒューリスティックを使用する + +## input_format_csv_use_default_on_bad_values {#input_format_csv_use_default_on_bad_values} + +タイプ: Bool + +デフォルト値: 0 + +CSV フィールドのデシリアライズに失敗した不良値にカラムのデフォルト値を設定可能にする + +## input_format_custom_allow_variable_number_of_columns {#input_format_custom_allow_variable_number_of_columns} + +タイプ: Bool + +デフォルト値: 0 + +CustomSeparated 入力 (ファイルが予想より多くのカラムを持つ場合) で余分なカラムを無視し、CustomSeparated 入力で欠けているフィールドをデフォルト値として扱います + +## input_format_custom_detect_header {#input_format_custom_detect_header} + +タイプ: Bool + +デフォルト値: 1 + +CustomSeparated フォーマットで名前と型のヘッダーを自動的に検出 + +## input_format_custom_skip_trailing_empty_lines {#input_format_custom_skip_trailing_empty_lines} + +タイプ: Bool + +デフォルト値: 0 + +CustomSeparated フォーマットで末尾の空行をスキップ + +## input_format_defaults_for_omitted_fields {#input_format_defaults_for_omitted_fields} + +タイプ: Bool + +デフォルト値: 1 + +`INSERT` クエリを実行するとき、省略された入力カラムの値をそれぞれのカラムのデフォルト値に置き換えます。このオプションは、[JSONEachRow](../../interfaces/formats.md/#jsoneachrow)(および他の JSON フォーマット)、[CSV](../../interfaces/formats.md/#csv)、[TabSeparated](../../interfaces/formats.md/#tabseparated)、[TSKV](../../interfaces/formats.md/#tskv)、[Parquet](../../interfaces/formats.md/#parquet)、[Arrow](../../interfaces/formats.md/#arrow)、[Avro](../../interfaces/formats.md/#avro)、[ORC](../../interfaces/formats.md/#orc)、[Native](../../interfaces/formats.md/#native) フォーマット、および `WithNames`/`WithNamesAndTypes` サフィックス付きのフォーマットに適用されます。 + +:::note +このオプションが有効であるとき、拡張されたテーブルメタデータがサーバーからクライアントに送信されます。サーバー上で追加の計算リソースを消費し、パフォーマンスを低下させる可能性があります。 +::: + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## input_format_force_null_for_omitted_fields {#input_format_force_null_for_omitted_fields} + +タイプ: Bool + +デフォルト値: 0 + +省略されたフィールドを null 値で強制初期化 + +## input_format_hive_text_allow_variable_number_of_columns {#input_format_hive_text_allow_variable_number_of_columns} + +タイプ: Bool + +デフォルト値: 1 + +Hive Text 入力 (ファイルが予想より多くのカラムを持つ場合) で余分なカラムを無視し、Hive Text 入力で欠けているフィールドをデフォルト値として扱います + +## input_format_hive_text_collection_items_delimiter {#input_format_hive_text_collection_items_delimiter} + +タイプ: Char + +デフォルト値:  + +Hive テキストファイルのコレクション(配列またはマップ)アイテム間の区切り文字 + +## input_format_hive_text_fields_delimiter {#input_format_hive_text_fields_delimiter} + +タイプ: Char + +デフォルト値:  + +Hive テキストファイルのフィールド間の区切り文字 + +## input_format_hive_text_map_keys_delimiter {#input_format_hive_text_map_keys_delimiter} + +タイプ: Char + +デフォルト値:  + +Hive テキストファイルのマップキー/値ペア間の区切り文字 + +## input_format_import_nested_json {#input_format_import_nested_json} + +タイプ: Bool + +デフォルト値: 0 + +ネストされたオブジェクトを持つ JSON データの挿入を有効または無効にします。 + +サポートされているフォーマット: + +- [JSONEachRow](../../interfaces/formats.md/#jsoneachrow) + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +関連情報: + +- JSONEachRow フォーマットでの[ネストされた構造の使用](../../interfaces/formats.md/#jsoneachrow-nested) + +## input_format_ipv4_default_on_conversion_error {#input_format_ipv4_default_on_conversion_error} + +タイプ: Bool + +デフォルト値: 0 + +IPv4 のデシリアライズ中の変換エラーをデフォルト値に置き換えます。 + +デフォルトでは無効。 + +## input_format_ipv6_default_on_conversion_error {#input_format_ipv6_default_on_conversion_error} + +タイプ: Bool + +デフォルト値: 0 + +IPV6 のデシリアライズ中の変換エラーをデフォルト値に置き換えます。 + +デフォルトでは無効。 + +## input_format_json_compact_allow_variable_number_of_columns {#input_format_json_compact_allow_variable_number_of_columns} + +タイプ: Bool + +デフォルト値: 0 + +JSONCompact(EachRow) 入力 (ファイルが予想より多くのカラムを持つ場合) で余分なカラムを無視し、JSONCompact(EachRow) 入力で欠けているフィールドをデフォルト値として扱います + +## input_format_json_defaults_for_missing_elements_in_named_tuple {#input_format_json_defaults_for_missing_elements_in_named_tuple} + +タイプ: Bool + +デフォルト値: 1 + +名前付きタプルを解析するときに、JSON オブジェクトの欠けている要素にデフォルト値を挿入します。 +この設定は、`input_format_json_named_tuples_as_objects` 設定が有効になっている場合にのみ動作します。 + +デフォルトで有効。 + +## input_format_json_empty_as_default {#input_format_json_empty_as_default} + +タイプ: Bool + +デフォルト値: 0 + +JSON 入力で空のフィールドをデフォルト値として扱う。 + +## input_format_json_ignore_unknown_keys_in_named_tuple {#input_format_json_ignore_unknown_keys_in_named_tuple} + +タイプ: Bool + +デフォルト値: 1 + +名前付きタプルの JSON オブジェクトで未知のキーを無視する。 + +デフォルトで有効。 + +## input_format_json_ignore_unnecessary_fields {#input_format_json_ignore_unnecessary_fields} + +タイプ: Bool + +デフォルト値: 1 + +不要なフィールドを無視し、解析しない。これを有効にすると、不正な形式の JSON 文字列や重複するフィールドを持つ JSON 文字列で例外をスローしない可能性があります。 + +## input_format_json_infer_incomplete_types_as_strings {#input_format_json_infer_incomplete_types_as_strings} + +タイプ: Bool + +デフォルト値: 1 + +スキーマ推論中にデータサンプルで `Null`/`{}`/`[]` のみを含む JSON キーに対して String 型を使用可能にします。 +JSON フォーマットでは、任意の値を String として読み取ることができ、スキーマ推論中に `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` のようなエラーを回避できます。 +未知の型のキーに String 型を使用して、エラーを回避できます。 + +例: + +```sql +SET input_format_json_infer_incomplete_types_as_strings = 1, input_format_json_try_infer_named_tuples_from_objects = 1; +DESCRIBE format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}'); +SELECT * FROM format(JSONEachRow, '{"obj" : {"a" : [1,2,3], "b" : "hello", "c" : null, "d" : {}, "e" : []}}'); +``` + +結果: +``` +┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Array(Nullable(Int64)), b Nullable(String), c Nullable(String), d Nullable(String), e Array(Nullable(String))) │ │ │ │ │ │ +└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ + +┌─obj────────────────────────────┐ +│ ([1,2,3],'hello',NULL,'{}',[]) │ +└────────────────────────────────┘ +``` + +デフォルトで有効。 + +## input_format_json_max_depth {#input_format_json_max_depth} + +タイプ: UInt64 + +デフォルト値: 1000 + +JSON 内のフィールドの最大深度。この制限は厳密なものではなく、正確に適用される必要はありません。 + +## input_format_json_named_tuples_as_objects {#input_format_json_named_tuples_as_objects} + +タイプ: Bool + +デフォルト値: 1 + +名前付きタプルカラムを JSON オブジェクトとして解析。 + +デフォルトで有効。 + +## input_format_json_read_arrays_as_strings {#input_format_json_read_arrays_as_strings} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットで JSON 配列を文字列として解析を許可。 + +例: + +```sql +SET input_format_json_read_arrays_as_strings = 1; +SELECT arr, toTypeName(arr), JSONExtractArrayRaw(arr)[3] from format(JSONEachRow, 'arr String', '{"arr" : [1, "Hello", [1,2,3]]}'); +``` + +結果: +``` +┌─arr───────────────────┬─toTypeName(arr)─┬─arrayElement(JSONExtractArrayRaw(arr), 3)─┐ +│ [1, "Hello", [1,2,3]] │ String │ [1,2,3] │ +└───────────────────────┴─────────────────┴───────────────────────────────────────────┘ +``` + +デフォルトで有効。 + +## input_format_json_read_bools_as_numbers {#input_format_json_read_bools_as_numbers} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットでブールを数値として解析を許可。 + +デフォルトで有効。 + +## input_format_json_read_bools_as_strings {#input_format_json_read_bools_as_strings} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットでブールを文字列として解析を許可。 + +デフォルトで有効。 + +## input_format_json_read_numbers_as_strings {#input_format_json_read_numbers_as_strings} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットで数値を文字列として解析を許可。 + +デフォルトで有効。 + +## input_format_json_read_objects_as_strings {#input_format_json_read_objects_as_strings} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットで JSON オブジェクトを文字列として解析を許可。 + +例: + +```sql +SET input_format_json_read_objects_as_strings = 1; +CREATE TABLE test (id UInt64, obj String, date Date) ENGINE=Memory(); +INSERT INTO test FORMAT JSONEachRow {"id" : 1, "obj" : {"a" : 1, "b" : "Hello"}, "date" : "2020-01-01"}; +SELECT * FROM test; +``` + +結果: + +``` +┌─id─┬─obj──────────────────────┬───────date─┐ +│ 1 │ {"a" : 1, "b" : "Hello"} │ 2020-01-01 │ +└────┴──────────────────────────┴────────────┘ +``` + +デフォルトで有効。 + +## input_format_json_throw_on_bad_escape_sequence {#input_format_json_throw_on_bad_escape_sequence} + +タイプ: Bool + +デフォルト値: 1 + +JSON 入力フォーマットで、JSON 文字列に不正なエスケープシーケンスが含まれている場合に例外をスローします。無効にすると、不正なエスケープシーケンスはデータ内にそのまま残ります。 + +デフォルトで有効。 + +## input_format_json_try_infer_named_tuples_from_objects {#input_format_json_try_infer_named_tuples_from_objects} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、スキーマ推論中に ClickHouse は JSON オブジェクトから名前付きタプルを推論しようとします。 +結果の名前付きタプルには、サンプルデータからすべての対応する JSON オブジェクトからのすべての要素が含まれます。 + +例: + +```sql +SET input_format_json_try_infer_named_tuples_from_objects = 1; +DESC format(JSONEachRow, '{"obj" : {"a" : 42, "b" : "Hello"}}, {"obj" : {"a" : 43, "c" : [1, 2, 3]}}, {"obj" : {"d" : {"e" : 42}}}') +``` + +結果: + +``` +┌─name─┬─type───────────────────────────────────────────────────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ obj │ Tuple(a Nullable(Int64), b Nullable(String), c Array(Nullable(Int64)), d Tuple(e Nullable(Int64))) │ │ │ │ │ │ +└──────┴────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +デフォルトで有効。 + +## input_format_json_try_infer_numbers_from_strings {#input_format_json_try_infer_numbers_from_strings} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、スキーマ推論中に ClickHouse は文字列フィールドから数値を推論しようとします。 +JSON データが引用符付きの UInt64 数値を含む場合に有効です。 + +デフォルトで無効。 + +## input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects {#input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects} + +タイプ: Bool + +デフォルト値: 0 + +JSON オブジェクトの名前付きタプル推論中にあいまいなパスの場合、例外の代わりに String 型を使用します + +## input_format_json_validate_types_from_metadata {#input_format_json_validate_types_from_metadata} + +タイプ: Bool + +デフォルト値: 1 + +JSON/JSONCompact/JSONColumnsWithMetadata 入力フォーマットの場合、この設定が 1 に設定されている場合、 +入力データのメタデータの型がテーブルの対応するカラムの型と比較されます。 + +デフォルトで有効。 + +## input_format_max_bytes_to_read_for_schema_inference {#input_format_max_bytes_to_read_for_schema_inference} + +タイプ: UInt64 + +デフォルト値: 33554432 + +自動スキーマ推論のために読み取るデータの最大バイト数。 + +## input_format_max_rows_to_read_for_schema_inference {#input_format_max_rows_to_read_for_schema_inference} + +タイプ: UInt64 + +デフォルト値: 25000 + +自動スキーマ推論のために読み取るデータの最大行数。 + +## input_format_msgpack_number_of_columns {#input_format_msgpack_number_of_columns} + +タイプ: UInt64 + +デフォルト値: 0 + +挿入された MsgPack データのカラム数。データからの自動スキーマ推論に使用されます。 + +## input_format_mysql_dump_map_column_names {#input_format_mysql_dump_map_column_names} + +タイプ: Bool + +デフォルト値: 1 + +MySQL ダンプのテーブルからのカラムと ClickHouse テーブルからのカラムを名前で一致させる + +## input_format_mysql_dump_table_name {#input_format_mysql_dump_table_name} + +タイプ: String + +デフォルト値: + +MySQL ダンプからデータを読み取るテーブルの名前 + +## input_format_native_allow_types_conversion {#input_format_native_allow_types_conversion} + +タイプ: Bool + +デフォルト値: 1 + +Native 入力フォーマットでのデータ型の変換を許可する + +## input_format_native_decode_types_in_binary_format {#input_format_native_decode_types_in_binary_format} + +タイプ: Bool + +デフォルト値: 0 + +Native 入力フォーマットで型名の代わりにバイナリ形式でデータ型を読み取る + +## input_format_null_as_default {#input_format_null_as_default} + +タイプ: Bool + +デフォルト値: 1 + +データ型が[nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable)でない [NULL](../../sql-reference/syntax.md/#null-literal) フィールドに[デフォルト値](../../sql-reference/statements/create/table.md/#create-default-values)での初期化を有効または無効にします。 +カラムタイプが nullable でなく、この設定が無効な場合、`NULL` を挿入すると例外が発生します。カラムタイプが nullable の場合、この設定に関わらず `NULL` 値がそのまま挿入されます。 + +この設定は、ほとんどの入力フォーマットに適用されます。 + +複雑なデフォルト式に対しては `input_format_defaults_for_omitted_fields` も有効にする必要があります。 + +可能な値: + +- 0 — nullable でないカラムに `NULL` を挿入すると例外が発生します。 +- 1 — `NULL` フィールドがデフォルトのカラム値で初期化されます。 + +## input_format_orc_allow_missing_columns {#input_format_orc_allow_missing_columns} + +タイプ: Bool + +デフォルト値: 1 + +ORC 入力フォーマットの読み取り時に欠損カラムを許可します。 + +## input_format_orc_case_insensitive_column_matching {#input_format_orc_case_insensitive_column_matching} + +タイプ: Bool + +デフォルト値: 0 + +ORC のカラムと CH のカラムを一致させるときに大文字と小文字を無視します。 + +## input_format_orc_dictionary_as_low_cardinality {#input_format_orc_dictionary_as_low_cardinality} + +タイプ: Bool + +デフォルト値: 1 + +ORC Dictionaryエンコードされたカラムを ORC ファイルの読み取り中に LowCardinality カラムとして扱います。 + +## input_format_orc_filter_push_down {#input_format_orc_filter_push_down} + +タイプ: Bool + +デフォルト値: 1 + +ORC ファイルを読み取るとき、ORC メタデータの WHERE/PREWHERE 式、最小/最大統計、ブルームフィルタに基づいて、全ストライプまたは行グループをスキップします。 + +## input_format_orc_reader_time_zone_name {#input_format_orc_reader_time_zone_name} + +タイプ: String + +デフォルト値: GMT + +ORC 行リーダーのタイムゾーン名、デフォルトの ORC 行リーダーのタイムゾーンは GMT です。 + +## input_format_orc_row_batch_size {#input_format_orc_row_batch_size} + +タイプ: Int64 + +デフォルト値: 100000 + +ORC ストライプを読み取るときのバッチサイズ。 + +## input_format_orc_skip_columns_with_unsupported_types_in_schema_inference {#input_format_orc_skip_columns_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +ORC フォーマットのスキーマ推論でサポートされない型のカラムをスキップします + +## input_format_orc_use_fast_decoder {#input_format_orc_use_fast_decoder} + +タイプ: Bool + +デフォルト値: 1 + +より高速な ORC デコーダー実装を使用します。 + +## input_format_parquet_allow_missing_columns {#input_format_parquet_allow_missing_columns} + +タイプ: Bool + +デフォルト値: 1 + +Parquet 入力フォーマットの読み取り時に欠損カラムを許可します。 + +## input_format_parquet_bloom_filter_push_down {#input_format_parquet_bloom_filter_push_down} + +タイプ: Bool + +デフォルト値: 0 + +Parquet ファイルを読み取るとき、WHERE 式と Parquet メタデータのブルームフィルタに基づいて、全行グループをスキップします。 + +## input_format_parquet_case_insensitive_column_matching {#input_format_parquet_case_insensitive_column_matching} + +タイプ: Bool + +デフォルト値: 0 + +Parquet のカラムと CH のカラムを一致させるときに大文字と小文字を無視します。 + +## input_format_parquet_enable_row_group_prefetch {#input_format_parquet_enable_row_group_prefetch} + +タイプ: Bool + +デフォルト値: 1 + +パーケット解析中に行グループのプリフェッチを有効にします。現在、単一スレッドの解析のみがプリフェッチを行えます。 + +## input_format_parquet_filter_push_down {#input_format_parquet_filter_push_down} + +タイプ: Bool + +デフォルト値: 1 + +Parquet ファイルを読み取るとき、WHERE/PREWHERE 式と Parquet メタデータの最小/最大統計に基づいて、全行グループをスキップします。 + +## input_format_parquet_local_file_min_bytes_for_seek {#input_format_parquet_local_file_min_bytes_for_seek} + +タイプ: UInt64 + +デフォルト値: 8192 + +Parquet 入力フォーマットで無視することなく、シークを行うためのローカル読み取り (ファイル) に必要な最小バイト数 + +## input_format_parquet_max_block_size {#input_format_parquet_max_block_size} + +タイプ: UInt64 + +デフォルト値: 65409 + +Parquet リーダーの最大ブロックサイズ。 + +## input_format_parquet_prefer_block_bytes {#input_format_parquet_prefer_block_bytes} + +タイプ: UInt64 + +デフォルト値: 16744704 + +Parquet リーダーによる平均ブロックバイト出力 + +## input_format_parquet_preserve_order {#input_format_parquet_preserve_order} + +タイプ: Bool + +デフォルト値: 0 + +Parquet ファイルの読み取り時に行の順序を保持します。通常は非常に遅くなります。 + +## input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference {#input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +Parquet フォーマットのスキーマ推論でサポートされない型のカラムをスキップします。 + +## input_format_parquet_use_native_reader {#input_format_parquet_use_native_reader} + +タイプ: Bool + +デフォルト値: 0 + +Parquet ファイルを読み取るとき、ネイティブリーダーを使用する代わりにアローリーダーを使用します。 + +## input_format_protobuf_flatten_google_wrappers {#input_format_protobuf_flatten_google_wrappers} + +タイプ: Bool + +デフォルト値: 0 + +通常の非ネストカラムに対して Google ラッパーを有効にします。例えば、google.protobuf.StringValue 'str' は String カラム 'str' に対応します。Nullable カラムの場合、空のラッパーはデフォルトとして認識され、欠けた場合は null として認識されます + +## input_format_protobuf_skip_fields_with_unsupported_types_in_schema_inference {#input_format_protobuf_skip_fields_with_unsupported_types_in_schema_inference} + +タイプ: Bool + +デフォルト値: 0 + +Protobuf フォーマットのスキーマ推論でサポートされない型のフィールドをスキップします。 + +## input_format_record_errors_file_path {#input_format_record_errors_file_path} + +タイプ: String + +デフォルト値: + +テキストフォーマット (CSV、TSV) の読み取り中にエラーを記録するファイルのパス。 + +## input_format_skip_unknown_fields {#input_format_skip_unknown_fields} + +タイプ: Bool + +デフォルト値: 1 + +追加データの挿入をスキップするか否かを有効または無効にします。 + +データを書き込むとき、ClickHouse は入力データにターゲットテーブルに存在しないカラムが含まれている場合、例外をスローします。スキップが有効な場合、ClickHouse は追加データを挿入せず、例外をスローしません。 + +サポートフォーマット: + +- [JSONEachRow](../../interfaces/formats.md/#jsoneachrow)(およびその他の JSON フォーマット) +- [BSONEachRow](../../interfaces/formats.md/#bsoneachrow)(およびその他の JSON フォーマット) +- [TSKV](../../interfaces/formats.md/#tskv) +- WithNames/WithNamesAndTypes のサフィックス付き全フォーマット +- [MySQLDump](../../interfaces/formats.md/#mysqldump) +- [Native](../../interfaces/formats.md/#native) + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## input_format_try_infer_dates {#input_format_try_infer_dates} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、ClickHouse はテキストフォーマットのスキーマ推論中に文字列フィールドから `Date` 型を推論しようとします。入力データのカラムからすべての日付が正常にパースされた場合、結果の型は `Date` になります。少なくとも1つの日付がパースされなかった場合、結果の型は `String` になります。 + +デフォルトで有効。 + +## input_format_try_infer_datetimes {#input_format_try_infer_datetimes} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、ClickHouse はテキストフォーマットのスキーマ推論中に文字列フィールドから `DateTime64` 型を推論しようとします。入力データのカラムからすべてのフィールドが正常に日時としてパースされた場合、結果の型は `DateTime64` になります。少なくとも1つのフィールドが日時としてパースされなかった場合、結果の型は `String` になります。 + +デフォルトで有効。 + +## input_format_try_infer_datetimes_only_datetime64 {#input_format_try_infer_datetimes_only_datetime64} + +タイプ: Bool + +デフォルト値: 0 + +input_format_try_infer_datetimes が有効なときのみ、DateTime 型ではなく DateTime64 型を推論します。 + +## input_format_try_infer_exponent_floats {#input_format_try_infer_exponent_floats} + +タイプ: Bool + +デフォルト値: 0 + +JSON を除くテキストフォーマットのスキーマ推論で指数表記による浮動小数点数を推論しようとします (JSONでは指数数が常に推論されます) + +## input_format_try_infer_integers {#input_format_try_infer_integers} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、ClickHouse はテキストフォーマットのスキーマ推論中に整数を浮動小数点数の代わりに推論しようとします。入力データのカラムのすべての数が整数である場合、結果のタイプは `Int64` になります。少なくとも1つの数が浮動小数点数である場合、結果のタイプは `Float64` になります。 + +デフォルトで有効。 + +## input_format_try_infer_variants {#input_format_try_infer_variants} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、ClickHouse はテキストフォーマットのスキーマ推論中にカラム/配列要素に対して可能な型が複数ある場合に [`Variant`](../../sql-reference/data-types/variant.md) 型を推論しようとします。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## input_format_tsv_allow_variable_number_of_columns {#input_format_tsv_allow_variable_number_of_columns} + +タイプ: Bool + +デフォルト値: 0 + +TSV 入力 (ファイルが予想より多くのカラムを持つ場合) で余分なカラムを無視し、TSV 入力で欠けているフィールドをデフォルト値として扱います。 + +## input_format_tsv_crlf_end_of_line {#input_format_tsv_crlf_end_of_line} + +タイプ: Bool + +デフォルト値: 0 + +true に設定されている場合、ファイル関数は \\n の代わりに \\r\\n で TSV フォーマットを読み取ります。 + +## input_format_tsv_detect_header {#input_format_tsv_detect_header} + +タイプ: Bool + +デフォルト値: 1 + +TSV フォーマットで名前と型のヘッダーを自動的に検出 + +## input_format_tsv_empty_as_default {#input_format_tsv_empty_as_default} + +タイプ: Bool + +デフォルト値: 0 + +TSV 入力で空のフィールドをデフォルト値として扱う。 + +## input_format_tsv_enum_as_number {#input_format_tsv_enum_as_number} + +タイプ: Bool + +デフォルト値: 0 + +TSV フォーマットで挿入された enum 値を enum インデックスとして扱う。 + +## input_format_tsv_skip_first_lines {#input_format_tsv_skip_first_lines} + +タイプ: UInt64 + +デフォルト値: 0 + +TSV フォーマットのデータの先頭でスキップする行数を指定します。 + +## input_format_tsv_skip_trailing_empty_lines {#input_format_tsv_skip_trailing_empty_lines} + +タイプ: Bool + +デフォルト値: 0 + +TSV フォーマットで末尾の空行をスキップ + +## input_format_tsv_use_best_effort_in_schema_inference {#input_format_tsv_use_best_effort_in_schema_inference} + +タイプ: Bool + +デフォルト値: 1 + +TSV フォーマットでスキーマを推論するためにいくつかの調整とヒューリスティックを使用する + +## input_format_values_accurate_types_of_literals {#input_format_values_accurate_types_of_literals} + +タイプ: Bool + +デフォルト値: 1 + +Values フォーマット用: テンプレートを使用して式を解析し解釈する際、オーバーフローや精度の問題を避けるためにリテラルの実際の型を確認します。 + +## input_format_values_deduce_templates_of_expressions {#input_format_values_deduce_templates_of_expressions} + +タイプ: Bool + +デフォルト値: 1 + +Values フォーマット用: フィールドがストリーミングパーサーによって解析できなかった場合、SQL パーサーを実行し、SQL 式のテンプレートを推論し、テンプレートを使用してすべての行を解析し、それから全行で式を解釈しようとします。 + +## input_format_values_interpret_expressions {#input_format_values_interpret_expressions} + +タイプ: Bool + +デフォルト値: 1 + +Values フォーマット用: フィールドがストリーミングパーサーによって解析できなかった場合、SQL パーサーを実行し、SQL 式として解釈しようとします。 + +## input_format_with_names_use_header {#input_format_with_names_use_header} + +タイプ: Bool + +デフォルト値: 1 + +データ挿入時のカラム順序の確認を有効または無効にします。 + +挿入性能を向上させるために、入力データのカラム順がターゲットテーブルと同じであることがわかっている場合は、このチェックを無効にすることをお勧めします。 + +サポートされているフォーマット: + +- [CSVWithNames](../../interfaces/formats.md/#csvwithnames) +- [CSVWithNamesAndTypes](../../interfaces/formats.md/#csvwithnamesandtypes) +- [TabSeparatedWithNames](../../interfaces/formats.md/#tabseparatedwithnames) +- [TabSeparatedWithNamesAndTypes](../../interfaces/formats.md/#tabseparatedwithnamesandtypes) +- [JSONCompactEachRowWithNames](../../interfaces/formats.md/#jsoncompacteachrowwithnames) +- [JSONCompactEachRowWithNamesAndTypes](../../interfaces/formats.md/#jsoncompacteachrowwithnamesandtypes) +- [JSONCompactStringsEachRowWithNames](../../interfaces/formats.md/#jsoncompactstringseachrowwithnames) +- [JSONCompactStringsEachRowWithNamesAndTypes](../../interfaces/formats.md/#jsoncompactstringseachrowwithnamesandtypes) +- [RowBinaryWithNames](../../interfaces/formats.md/#rowbinarywithnames) +- [RowBinaryWithNamesAndTypes](../../interfaces/formats.md/#rowbinarywithnamesandtypes) +- [CustomSeparatedWithNames](../../interfaces/formats.md/#customseparatedwithnames) +- [CustomSeparatedWithNamesAndTypes](../../interfaces/formats.md/#customseparatedwithnamesandtypes) + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## input_format_with_types_use_header {#input_format_with_types_use_header} + +タイプ: Bool + +デフォルト値: 1 + +フォーマットパーサーが入力データのデータ型とターゲットテーブルのデータ型が一致するかをチェックするかどうかを制御します。 + +サポートされているフォーマット: + +- [CSVWithNamesAndTypes](../../interfaces/formats.md/#csvwithnamesandtypes) +- [TabSeparatedWithNamesAndTypes](../../interfaces/formats.md/#tabseparatedwithnamesandtypes) +- [JSONCompactEachRowWithNamesAndTypes](../../interfaces/formats.md/#jsoncompacteachrowwithnamesandtypes) +- [JSONCompactStringsEachRowWithNamesAndTypes](../../interfaces/formats.md/#jsoncompactstringseachrowwithnamesandtypes) +- [RowBinaryWithNamesAndTypes](../../interfaces/formats.md/#rowbinarywithnamesandtypes-rowbinarywithnamesandtypes) +- [CustomSeparatedWithNamesAndTypes](../../interfaces/formats.md/#customseparatedwithnamesandtypes) + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## insert_distributed_one_random_shard {#insert_distributed_one_random_shard} + +タイプ: Bool + +デフォルト値: 0 + +[分散](../../engines/table-engines/special/distributed.md/#distributed)テーブルに分散キーがない場合にランダムシャード挿入を有効または無効にします。 + +デフォルトでは、分散キーがない場合に、複数のシャードを持つ `Distributed` テーブルへのデータ挿入を ClickHouse サーバーは拒否します。`insert_distributed_one_random_shard = 1` の場合、挿入が許可され、すべてのシャードの間でランダムにデータが転送されます。 + +可能な値: + +- 0 — 複数のシャードがあり分散キーが与えられていない場合、挿入は拒否されます。 +- 1 — 分散キーが与えられていない場合、利用可能なすべてのシャード間でランダムに挿入されます。 + +## interval_output_format {#interval_output_format} + +タイプ: IntervalOutputFormat + +デフォルト値: numeric + +インターバル型のテキスト表現の異なる出力フォーマットを選択可能。 + +可能な値: + +- `kusto` - KQL スタイルの出力フォーマット。 + + ClickHouse はインターバルを [KQL フォーマット](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings#the-constant-c-format-specifier)で出力します。例えば、`toIntervalDay(2)` は `2.00:00:00` としてフォーマットされます。インターバル型が異なる長さである場合(例えば、`IntervalMonth` と `IntervalYear`)、インターバルあたりの平均秒数が考慮されます。 + +- `numeric` - 数字による出力フォーマット。 + + ClickHouse はインターバルをその基礎となる数字表現として出力します。例えば、`toIntervalDay(2)` は `2` としてフォーマットされます。 + +参照: + +- [Interval](../../sql-reference/data-types/special-data-types/interval.md) + +## output_format_arrow_compression_method {#output_format_arrow_compression_method} + +タイプ: ArrowCompression + +デフォルト値: lz4_frame + +Arrow 出力フォーマットの圧縮方法。サポートされているコーデック: lz4_frame, zstd, none (非圧縮) + +## output_format_arrow_fixed_string_as_fixed_byte_array {#output_format_arrow_fixed_string_as_fixed_byte_array} + +タイプ: Bool + +デフォルト値: 1 + +FixedString カラムに対して Binary の代わりに Arrow FIXED_SIZE_BINARY タイプを使用します。 + +## output_format_arrow_low_cardinality_as_dictionary {#output_format_arrow_low_cardinality_as_dictionary} + +タイプ: Bool + +デフォルト値: 0 + +LowCardinality 型を Dictionary Arrow 型として出力することを可能にする + +## output_format_arrow_string_as_string {#output_format_arrow_string_as_string} + +タイプ: Bool + +デフォルト値: 1 + +String カラムに対して Binary の代わりに Arrow String タイプを使用します + +## output_format_arrow_use_64_bit_indexes_for_dictionary {#output_format_arrow_use_64_bit_indexes_for_dictionary} + +タイプ: Bool + +デフォルト値: 0 + +Arrow フォーマットでDictionaryインデックスに常に 64 ビット整数を使用する + +## output_format_arrow_use_signed_indexes_for_dictionary {#output_format_arrow_use_signed_indexes_for_dictionary} + +タイプ: Bool + +デフォルト値: 1 + +Arrow フォーマットでDictionaryインデックスに符号付き整数を使用する + +## output_format_avro_codec {#output_format_avro_codec} + +タイプ: String + +デフォルト値: + +出力に使用する圧縮コーデック。可能な値: 'null', 'deflate', 'snappy', 'zstd'。 + +## output_format_avro_rows_in_file {#output_format_avro_rows_in_file} + +タイプ: UInt64 + +デフォルト値: 1 + +ファイル内の最大行数 (ストレージで許可されている場合) + +## output_format_avro_string_column_pattern {#output_format_avro_string_column_pattern} + +タイプ: String + +デフォルト値: + +Avro フォーマット用: Avro 文字列として選択する String カラムの正規表現。 + +## output_format_avro_sync_interval {#output_format_avro_sync_interval} + +タイプ: UInt64 + +デフォルト値: 16384 + +同期間隔(バイト単位)。 + +## output_format_binary_encode_types_in_binary_format {#output_format_binary_encode_types_in_binary_format} + +タイプ: Bool + +デフォルト値: 0 + +RowBinaryWithNamesAndTypes 出力フォーマットで、型名の代わりにバイナリ形式でデータ型を書き込む + +## output_format_binary_write_json_as_string {#output_format_binary_write_json_as_string} + +タイプ: Bool + +デフォルト値: 0 + +RowBinary 出力フォーマットで、[JSON](../../sql-reference/data-types/newjson.md) データ型の値を JSON [String](../../sql-reference/data-types/string.md) 値として書き込む。 + +## output_format_bson_string_as_string {#output_format_bson_string_as_string} + +タイプ: Bool + +デフォルト値: 0 + +String カラムに対して Binary の代わりに BSON String 型を使用します。 + +## output_format_csv_crlf_end_of_line {#output_format_csv_crlf_end_of_line} + +タイプ: Bool + +デフォルト値: 0 + +true に設定されている場合、CSV フォーマットの行末は \\n の代わりに \\r\\n になります。 + +## output_format_csv_serialize_tuple_into_separate_columns {#output_format_csv_serialize_tuple_into_separate_columns} + +タイプ: Bool + +デフォルト値: 1 + +true に設定されている場合、CSV フォーマットのタプルは別々のカラムとしてシリアライズされます(つまり、タプル内のネストが失われます) + +## output_format_decimal_trailing_zeros {#output_format_decimal_trailing_zeros} + +タイプ: Bool + +デフォルト値: 0 + +Decimal 値を出力する際に終端のゼロを出力します。例: 1.230000 の代わりに 1.23。 + +デフォルトでは無効。 + +## output_format_enable_streaming {#output_format_enable_streaming} + +タイプ: Bool + +デフォルト値: 0 + +ストリーミングをサポートする出力フォーマットでストリーミングを有効にします。 + +デフォルトでは無効。 + +## output_format_json_array_of_rows {#output_format_json_array_of_rows} + +タイプ: Bool + +デフォルト値: 0 + +[JSONEachRow](../../interfaces/formats.md/#jsoneachrow) フォーマットで全行を JSON 配列として出力する機能を有効にします。 + +可能な値: + +- 1 — ClickHouse はすべての行を `JSONEachRow` フォーマットの配列として出力します。 +- 0 — ClickHouse は各行を `JSONEachRow` フォーマットで個別に出力します。 + +**設定を有効にしたクエリの例** + +クエリ: + +```sql +SET output_format_json_array_of_rows = 1; +SELECT number FROM numbers(3) FORMAT JSONEachRow; +``` + +結果: + +```text +[ +{"number":"0"}, +{"number":"1"}, +{"number":"2"} +] +``` + +**設定を無効にしたクエリの例** + +クエリ: + +```sql +SET output_format_json_array_of_rows = 0; +SELECT number FROM numbers(3) FORMAT JSONEachRow; +``` + +結果: + +```text +{"number":"0"} +{"number":"1"} +{"number":"2"} +``` + + +## output_format_json_escape_forward_slashes {#output_format_json_escape_forward_slashes} + +タイプ: Bool + +デフォルト値: 1 + +文字列出力をJSON形式で出力する際に、スラッシュのエスケープを制御します。これはJavaScriptとの互換性を意図したものです。常にエスケープされるバックスラッシュとは混同しないでください。 + +デフォルトで有効になっています。 + +## output_format_json_named_tuples_as_objects {#output_format_json_named_tuples_as_objects} + +タイプ: Bool + +デフォルト値: 1 + +名前付きタプルカラムをJSONオブジェクトとしてシリアライズします。 + +デフォルトで有効になっています。 + +## output_format_json_quote_64bit_floats {#output_format_json_quote_64bit_floats} + +タイプ: Bool + +デフォルト値: 0 + +64ビット[浮動小数点数](../../sql-reference/data-types/float.md)のJSON形式におけるクォートを制御します。 + +デフォルトでは無効になっています。 + +## output_format_json_quote_64bit_integers {#output_format_json_quote_64bit_integers} + +タイプ: Bool + +デフォルト値: 1 + +64ビット以上の[整数](../../sql-reference/data-types/int-uint.md)(例: `UInt64` や `Int128`)を[JSON](../../interfaces/formats.md/#json)形式で出力する際のクォートを制御します。 +これらの整数はデフォルトでクォートに囲まれます。この動作は多くのJavaScriptの実装と互換性があります。 + +可能な値: + +- 0 — 整数はクォートなしで出力されます。 +- 1 — 整数はクォートで囲まれて出力されます。 + +## output_format_json_quote_decimals {#output_format_json_quote_decimals} + +タイプ: Bool + +デフォルト値: 0 + +JSON出力形式での小数点数のクォートを制御します。 + +デフォルトでは無効になっています。 + +## output_format_json_quote_denormals {#output_format_json_quote_denormals} + +タイプ: Bool + +デフォルト値: 0 + +[JSON](../../interfaces/formats.md/#json)出力形式で`+nan`、`-nan`、`+inf`、`-inf`の出力を有効にします。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +**例** + +次のテーブル `account_orders` を考えてみます: + +```text +┌─id─┬─name───┬─duration─┬─period─┬─area─┐ +│ 1 │ Andrew │ 20 │ 0 │ 400 │ +│ 2 │ John │ 40 │ 0 │ 0 │ +│ 3 │ Bob │ 15 │ 0 │ -100 │ +└────┴────────┴──────────┴────────┴──────┘ +``` + +`output_format_json_quote_denormals = 0` の場合、クエリは出力に `null` 値を返します: + +```sql +SELECT area/period FROM account_orders FORMAT JSON; +``` + +```json +{ + "meta": + [ + { + "name": "divide(area, period)", + "type": "Float64" + } + ], + + "data": + [ + { + "divide(area, period)": null + }, + { + "divide(area, period)": null + }, + { + "divide(area, period)": null + } + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.003648093, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +`output_format_json_quote_denormals = 1` の場合、クエリは以下のように返します: + +```json +{ + "meta": + [ + { + "name": "divide(area, period)", + "type": "Float64" + } + ], + + "data": + [ + { + "divide(area, period)": "inf" + }, + { + "divide(area, period)": "-nan" + }, + { + "divide(area, period)": "-inf" + } + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.000070241, + "rows_read": 3, + "bytes_read": 24 + } +} +``` + +## output_format_json_skip_null_value_in_named_tuples {#output_format_json_skip_null_value_in_named_tuples} + +タイプ: Bool + +デフォルト値: 0 + +名前付きタプルカラムをJSONオブジェクトとしてシリアライズする際に、nullの値を持つキーと値のペアをスキップします。`output_format_json_named_tuples_as_objects`がtrueのときにのみ有効です。 + +## output_format_json_validate_utf8 {#output_format_json_validate_utf8} + +タイプ: Bool + +デフォルト値: 0 + +UTF-8シーケンスの検証をJSON出力形式で制御します。ただし、JSON/JSONCompact/JSONColumnsWithMetadata形式には影響しません。これらは常にUTF-8を検証します。 + +デフォルトでは無効になっています。 + +## output_format_markdown_escape_special_characters {#output_format_markdown_escape_special_characters} + +タイプ: Bool + +デフォルト値: 0 + +Markdown内の特殊文字をエスケープします。 + +## output_format_msgpack_uuid_representation {#output_format_msgpack_uuid_representation} + +タイプ: MsgPackUUIDRepresentation + +デフォルト値: ext + +MsgPack形式でUUIDを出力する方法。 + +## output_format_native_encode_types_in_binary_format {#output_format_native_encode_types_in_binary_format} + +タイプ: Bool + +デフォルト値: 0 + +Native出力形式でタイプ名ではなくデータ型をバイナリ形式で記述。 + +## output_format_native_write_json_as_string {#output_format_native_write_json_as_string} + +タイプ: Bool + +デフォルト値: 0 + +[JSON](../../sql-reference/data-types/newjson.md)カラムのデータをデフォルトのネイティブJSONシリアライゼーションの代わりに、JSON文字列を含む[String](../../sql-reference/data-types/string.md)カラムとして記述。 + +## output_format_orc_compression_method {#output_format_orc_compression_method} + +タイプ: ORCCompression + +デフォルト値: zstd + +ORC出力形式の圧縮方法。サポートされているコーデック: lz4, snappy, zlib, zstd, none (無圧縮) + +## output_format_orc_dictionary_key_size_threshold {#output_format_orc_dictionary_key_size_threshold} + +タイプ: Double + +デフォルト値: 0 + +ORC出力形式の文字列カラムにおいて、一意の値の数が非null行の総数のこの割合を超える場合、Dictionaryエンコーディングをオフにします。そうでなければDictionaryエンコーディングを有効にします。 + +## output_format_orc_row_index_stride {#output_format_orc_row_index_stride} + +タイプ: UInt64 + +デフォルト値: 10000 + +ORC出力形式でのターゲット行インデックスのストライド + +## output_format_orc_string_as_string {#output_format_orc_string_as_string} + +タイプ: Bool + +デフォルト値: 1 + +Stringカラムに対してBinaryの代わりにORC String型を使用 + +## output_format_parquet_batch_size {#output_format_parquet_batch_size} + +タイプ: UInt64 + +デフォルト値: 1024 + +指定された行数ごとにページサイズを確認します。カラムの平均値のサイズが数KBを超える場合は、考慮してサイズを減らしてください。 + +## output_format_parquet_compliant_nested_types {#output_format_parquet_compliant_nested_types} + +タイプ: Bool + +デフォルト値: 1 + +Parquetファイルのスキーマにおいて、リスト要素に対して'item'の代わりに'element'という名前を使用します。これはArrowライブラリの実装の歴史的遺産です。一般的には互換性が向上しますが、古いバージョンのArrowには例外があるかもしれません。 + +## output_format_parquet_compression_method {#output_format_parquet_compression_method} + +タイプ: ParquetCompression + +デフォルト値: zstd + +Parquet出力形式の圧縮方法。サポートされているコーデック: snappy, lz4, brotli, zstd, gzip, none (無圧縮) + +## output_format_parquet_data_page_size {#output_format_parquet_data_page_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +圧縮前のターゲットページサイズ(バイト単位)。 + +## output_format_parquet_fixed_string_as_fixed_byte_array {#output_format_parquet_fixed_string_as_fixed_byte_array} + +タイプ: Bool + +デフォルト値: 1 + +FixedStringカラムに対してBinaryの代わりにParquet FIXED_LENGTH_BYTE_ARRAY型を使用。 + +## output_format_parquet_parallel_encoding {#output_format_parquet_parallel_encoding} + +タイプ: Bool + +デフォルト値: 1 + +複数のスレッドでParquetエンコードを行います。`output_format_parquet_use_custom_encoder`が必要です。 + +## output_format_parquet_row_group_size {#output_format_parquet_row_group_size} + +タイプ: UInt64 + +デフォルト値: 1000000 + +行グループサイズのターゲット(行単位)。 + +## output_format_parquet_row_group_size_bytes {#output_format_parquet_row_group_size_bytes} + +タイプ: UInt64 + +デフォルト値: 536870912 + +圧縮前の行グループサイズのターゲット(バイト単位)。 + +## output_format_parquet_string_as_string {#output_format_parquet_string_as_string} + +タイプ: Bool + +デフォルト値: 1 + +Stringカラムに対してBinaryの代わりにParquet String型を使用。 + +## output_format_parquet_use_custom_encoder {#output_format_parquet_use_custom_encoder} + +タイプ: Bool + +デフォルト値: 1 + +より高速なParquetエンコーダ実装を使用。 + +## output_format_parquet_version {#output_format_parquet_version} + +タイプ: ParquetVersion + +デフォルト値: 2.latest + +出力形式のParquetフォーマットバージョン。サポートされているバージョン: 1.0, 2.4, 2.6 および 2.latest (デフォルト) + +## output_format_parquet_write_page_index {#output_format_parquet_write_page_index} + +タイプ: Bool + +デフォルト値: 1 + +Parquetファイルにページインデックスを書き込むための機能を追加。 + +## output_format_pretty_color {#output_format_pretty_color} + +タイプ: UInt64Auto + +デフォルト値: auto + +Pretty形式でANSIエスケープシーケンスを使用。0 - 無効, 1 - 有効, 'auto' - 端末で有効。 + +## output_format_pretty_display_footer_column_names {#output_format_pretty_display_footer_column_names} + +タイプ: UInt64 + +デフォルト値: 1 + +テーブル行が多い場合、フッターにカラム名を表示。 + +可能な値: + +- 0 — フッターにはカラム名を表示しない。 +- 1 — フッターには行数が設定されたしきい値(デフォルトで50)以上の場合にカラム名を表示する。 + +**例** + +クエリ: + +```sql +SELECT *, toTypeName(*) FROM (SELECT * FROM system.numbers LIMIT 1000); +``` + +結果: + +```response + ┌─number─┬─toTypeName(number)─┐ + 1. │ 0 │ UInt64 │ + 2. │ 1 │ UInt64 │ + 3. │ 2 │ UInt64 │ + ... + 999. │ 998 │ UInt64 │ +1000. │ 999 │ UInt64 │ + └─number─┴─toTypeName(number)─┘ +``` + +## output_format_pretty_display_footer_column_names_min_rows {#output_format_pretty_display_footer_column_names_min_rows} + +タイプ: UInt64 + +デフォルト値: 50 + +設定 [output_format_pretty_display_footer_column_names](#output_format_pretty_display_footer_column_names) が有効な場合、フッターにカラム名を表示するための行の最小数を設定します。 + +## output_format_pretty_grid_charset {#output_format_pretty_grid_charset} + +タイプ: String + +デフォルト値: UTF-8 + +グリッドの枠線を印刷するための文字セットです。利用可能な文字セット: ASCII, UTF-8 (デフォルト)。 + +## output_format_pretty_highlight_digit_groups {#output_format_pretty_highlight_digit_groups} + +タイプ: Bool + +デフォルト値: 1 + +もし有効であり、出力が端末の場合、千、百万などの桁に対応する桁を下線でハイライトします。 + +## output_format_pretty_max_column_pad_width {#output_format_pretty_max_column_pad_width} + +タイプ: UInt64 + +デフォルト値: 250 + +Pretty形式でカラム内のすべての値をパディングする最大幅。 + +## output_format_pretty_max_rows {#output_format_pretty_max_rows} + +タイプ: UInt64 + +デフォルト値: 10000 + +Pretty形式の行数制限。 + +## output_format_pretty_max_value_width {#output_format_pretty_max_value_width} + +タイプ: UInt64 + +デフォルト値: 10000 + +Pretty形式で表示する値の最大幅。これを超えると切り取られる。 + +## output_format_pretty_max_value_width_apply_for_single_value {#output_format_pretty_max_value_width_apply_for_single_value} + +タイプ: UInt64 + +デフォルト値: 0 + +値を切り取るのは単一の値がブロックにない場合のみに制限します。それ以外の場合、完全に出力します。これは `SHOW CREATE TABLE` クエリに有用です。 + +## output_format_pretty_row_numbers {#output_format_pretty_row_numbers} + +タイプ: Bool + +デフォルト値: 1 + +Pretty出力形式のために各行の前に行番号を追加。 + +## output_format_pretty_single_large_number_tip_threshold {#output_format_pretty_single_large_number_tip_threshold} + +タイプ: UInt64 + +デフォルト値: 1000000 + +ブロックが唯一の大きな数を含む場合、その数がこの値(0を除く)を超える場合はテーブルの右側に読みやすい数を表示。 + +## output_format_protobuf_nullables_with_google_wrappers {#output_format_protobuf_nullables_with_google_wrappers} + +タイプ: Bool + +デフォルト値: 0 + +Googleラッパーを使用してNullableカラムをシリアライズする際、デフォルト値を空のラッパーとしてシリアライズします。無効にすると、デフォルト値とnull値はシリアライズされません。 + +## output_format_schema {#output_format_schema} + +タイプ: String + +デフォルト値: + +自動生成されたスキーマを [Cap’n Proto](../../interfaces/formats.md#capnproto-capnproto) または [Protobuf](../../interfaces/formats.md#protobuf-protobuf) 形式で保存するファイルへのパス。 + +## output_format_sql_insert_include_column_names {#output_format_sql_insert_include_column_names} + +タイプ: Bool + +デフォルト値: 1 + +INSERTクエリ内にカラム名を含める + +## output_format_sql_insert_max_batch_size {#output_format_sql_insert_max_batch_size} + +タイプ: UInt64 + +デフォルト値: 65409 + +1つのINSERT文での行数の最大数。 + +## output_format_sql_insert_quote_names {#output_format_sql_insert_quote_names} + +タイプ: Bool + +デフォルト値: 1 + +カラム名を '`' 文字でクォート + +## output_format_sql_insert_table_name {#output_format_sql_insert_table_name} + +タイプ: String + +デフォルト値: table + +出力INSERTクエリ内のテーブル名 + +## output_format_sql_insert_use_replace {#output_format_sql_insert_use_replace} + +タイプ: Bool + +デフォルト値: 0 + +INSERTの代わりにREPLACE文を使用 + +## output_format_tsv_crlf_end_of_line {#output_format_tsv_crlf_end_of_line} + +タイプ: Bool + +デフォルト値: 0 + +真に設定すると、TSV形式で行の終端が\\r\\nになります。そうでなければ\\nです。 + +## output_format_values_escape_quote_with_quote {#output_format_values_escape_quote_with_quote} + +タイプ: Bool + +デフォルト値: 0 + +真なら'を''でエスケープし、そうでなければ\\'でクォート + +## output_format_write_statistics {#output_format_write_statistics} + +タイプ: Bool + +デフォルト値: 1 + +読み取った行、バイト、経過時間に関する統計を適切な出力形式で書き込みます。 + +デフォルトで有効 + +## precise_float_parsing {#precise_float_parsing} + +タイプ: Bool + +デフォルト値: 0 + +より正確(しかし遅い)浮動小数点数の解析アルゴリズムを優先 + +## regexp_dict_allow_hyperscan {#regexp_dict_allow_hyperscan} + +タイプ: Bool + +デフォルト値: 1 + +Hyperscanライブラリを使用したregexp_treeDictionaryを許可する。 + +## regexp_dict_flag_case_insensitive {#regexp_dict_flag_case_insensitive} + +タイプ: Bool + +デフォルト値: 0 + +regexp_tree Dictionaryに対して大文字小文字を区別しないマッチングを使用する。個々の表現で(?i)と(?-i)で上書き可能。 + +## regexp_dict_flag_dotall {#regexp_dict_flag_dotall} + +タイプ: Bool + +デフォルト値: 0 + +regexp_tree Dictionaryに対して'.'が改行文字にマッチすることを許可。 + +## rows_before_aggregation {#rows_before_aggregation} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、ClickHouseは集計前に読み取った行数を表す`rows_before_aggregation`統計の正確な値を提供します。 + +## schema_inference_hints {#schema_inference_hints} + +タイプ: String + +デフォルト値: + +スキーマなしのフォーマットに対してスキーマ推論でヒントとして使用するカラム名とタイプのリスト。 + +例: + +クエリ: +```sql +desc format(JSONEachRow, '{"x" : 1, "y" : "String", "z" : "0.0.0.0" }') settings schema_inference_hints='x UInt8, z IPv4'; +``` + +結果: +```sql +x UInt8 +y Nullable(String) +z IPv4 +``` + +:::note +`schema_inference_hints` が正しくフォーマットされていない場合、またはタイプミスや誤ったデータ型がある場合、全体の`s**chema_inference_hints**` が無視されます。 +::: + +## schema_inference_make_columns_nullable {#schema_inference_make_columns_nullable} + +タイプ: UInt64Auto + +デフォルト値: 1 + +スキーマ推論で推論された型を `Nullable` にすることを制御します。設定が有効な場合、すべての推論された型は `Nullable` になり、無効の場合、推論された型は決して `Nullable` ではなく、 `auto` に設定されると、スキーマ推論中に解析されたサンプルでカラムに `NULL` が含まれている場合、またはファイルメタデータにカラムのヌル可能性に関する情報が含まれている場合にのみ、推論された型は`Nullable` になります。 + +## schema_inference_mode {#schema_inference_mode} + +タイプ: SchemaInferenceMode + +デフォルト値: default + +スキーマ推論のモード。 'default' - すべてのファイルが同じスキーマを持っていると仮定し、どのファイルからもスキーマを推論できることを仮定する、 'union' - ファイルのスキーマは異なっても良く、結果として得られるスキーマはすべてのファイルのスキーマの集合でなければならない + +## show_create_query_identifier_quoting_rule {#show_create_query_identifier_quoting_rule} + +タイプ: IdentifierQuotingRule + +デフォルト値: when_necessary + +SHOW CREATEクエリにおける識別子のクォートルールを設定 + +## show_create_query_identifier_quoting_style {#show_create_query_identifier_quoting_style} + +タイプ: IdentifierQuotingStyle + +デフォルト値: Backticks + +SHOW CREATEクエリにおける識別子のクォートスタイルを設定 + +## type_json_skip_duplicated_paths {#type_json_skip_duplicated_paths} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、JSONオブジェクトをJSON型に解析する際に重複したパスが無視され、例外の代わりに最初のもののみが挿入されます + +## validate_experimental_and_suspicious_types_inside_nested_types {#validate_experimental_and_suspicious_types_inside_nested_types} + +タイプ: Bool + +デフォルト値: 1 + +Array/Map/Tupleのようなネストされた型の内部でエクスペリメンタルおよび怪しい型の使用を検証する diff --git a/docs/ja/operations/settings/settings-profiles.md b/docs/ja/operations/settings/settings-profiles.md new file mode 100644 index 00000000000..e373b6e40b9 --- /dev/null +++ b/docs/ja/operations/settings/settings-profiles.md @@ -0,0 +1,81 @@ +--- +slug: /ja/operations/settings/settings-profiles +sidebar_position: 61 +sidebar_label: 設定プロファイル +--- + +# 設定プロファイル + +設定プロファイルは、同じ名前でグループ化された設定のコレクションです。 + +:::note +ClickHouseは、設定プロファイルを管理するための[SQL駆動のワークフロー](../../guides/sre/user-management/index.md#access-control)もサポートしています。これの使用をお勧めします。 +::: + +プロファイルには任意の名前を付けることができます。異なるユーザーに同じプロファイルを指定することも可能です。設定プロファイルで最も重要なことは、`readonly=1`と記述して読み取り専用アクセスを確保することです。 + +設定プロファイルは互いに継承できます。継承を使用するには、プロファイル内にリストされた他の設定の前に、1つまたは複数の`profile`設定を示します。同じ設定が異なるプロファイルで定義されている場合、最後に定義されたものが使用されます。 + +プロファイル内のすべての設定を適用するには、`profile`設定をセットします。 + +例: + +`web`プロファイルをインストールします。 + +``` sql +SET profile = 'web' +``` + +設定プロファイルはユーザー設定ファイルで宣言されます。通常、これは`users.xml`です。 + +例: + +``` xml + + + + + + 8 + + + + + 1000000000 + 100000000000 + + 1000000 + any + + 1000000 + 1000000000 + + 100000 + 100000000 + break + + 600 + 1000000 + 15 + + 25 + 100 + 50 + + 2 + 25 + 50 + 100 + + 4 + + 1 + + +``` + +この例では、2つのプロファイル: `default`と`web`を指定しています。 + +`default`プロファイルには特別な目的があります。それは、常に存在し、サーバーの開始時に適用されることです。言い換えれば、`default`プロファイルにはデフォルトの設定が含まれています。 + +`web`プロファイルは、`SET`クエリを使用するか、HTTPクエリにURLパラメータを使用して設定できる通常のプロファイルです。 diff --git a/docs/ja/operations/settings/settings-query-level.md b/docs/ja/operations/settings/settings-query-level.md new file mode 100644 index 00000000000..055a6d586d3 --- /dev/null +++ b/docs/ja/operations/settings/settings-query-level.md @@ -0,0 +1,208 @@ +--- +sidebar_label: クエリレベルの設定 +title: クエリレベルの設定 +slug: /ja/operations/settings/query-level +--- + +ClickHouseのクエリレベル設定を設定する方法はいくつかあります。設定はレイヤーとして構成され、後のレイヤーは前の設定値を再定義します。 + +設定を定義する際の優先順位は以下の通りです: + +1. ユーザーに直接、または設定プロファイル内で設定を適用する + + - SQL(推奨) + - 一つまたは複数のXMLまたはYAMLファイルを`/etc/clickhouse-server/users.d`に追加する + +2. セッション設定 + + - ClickHouse Cloud SQLコンソールまたはインタラクティブモードの`clickhouse client`から`SET setting=value`を送信する。同様に、HTTPプロトコルでClickHouseセッションを使用することもできます。これを行うには、`session_id` HTTPパラメータを指定する必要があります。 + +3. クエリ設定 + + - 非インタラクティブモードで`clickhouse client`を起動する際に、スタートパラメータ`--setting=value`を設定する。 + - HTTP APIを使用する場合、CGIパラメータを渡す(`URL?setting_1=value&setting_2=value...`)。 + - SELECTクエリの[SETTINGS](../../sql-reference/statements/select/index.md#settings-in-select-query)句で設定を定義する。設定値はそのクエリに対してのみ適用され、クエリ実行後にデフォルトまたは前の値にリセットされます。 + +## 例 + +これらの例ではすべて、`async_insert`設定の値を`1`に設定し、実行中のシステムでの設定の確認方法を示します。 + +### SQLを使用してユーザーに直接設定を適用する + +これは、設定`async_inset = 1`を持つユーザー`ingester`を作成します: + +```sql +CREATE USER ingester +IDENTIFIED WITH sha256_hash BY '7e099f39b84ea79559b3e85ea046804e63725fd1f46b37f281276aae20f86dc3' +# highlight-next-line +SETTINGS async_insert = 1 +``` + +#### 設定プロファイルと割り当てを確認 + +```sql +SHOW ACCESS +``` + +```response +┌─ACCESS─────────────────────────────────────────────────────────────────────────────┐ +│ ... │ +# highlight-next-line +│ CREATE USER ingester IDENTIFIED WITH sha256_password SETTINGS async_insert = true │ +│ ... │ +└────────────────────────────────────────────────────────────────────────────────────┘ +``` +### SQLを使用して設定プロファイルを作成しユーザーに割り当てる + +これは、設定`async_inset = 1`を持つプロファイル`log_ingest`を作成します: + +```sql +CREATE +SETTINGS PROFILE log_ingest SETTINGS async_insert = 1 +``` + +これは、ユーザー`ingester`を作成し、ユーザーに設定プロファイル`log_ingest`を割り当てます: + +```sql +CREATE USER ingester +IDENTIFIED WITH sha256_hash BY '7e099f39b84ea79559b3e85ea046804e63725fd1f46b37f281276aae20f86dc3' +# highlight-next-line +SETTINGS PROFILE log_ingest +``` + + +### XMLを使用して設定プロファイルとユーザーを作成する + +```xml title=/etc/clickhouse-server/users.d/users.xml + +# highlight-start + + + 1 + + +# highlight-end + + + + 7e099f39b84ea79559b3e85ea046804e63725fd1f46b37f281276aae20f86dc3 +# highlight-start + log_ingest +# highlight-end + + + 7e099f39b84ea79559b3e85ea046804e63725fd1f46b37f281276aae20f86dc3 + 1 + 1 + + + +``` + +#### 設定プロファイルと割り当てを確認 + +```sql +SHOW ACCESS +``` + +```response +┌─ACCESS─────────────────────────────────────────────────────────────────────────────┐ +│ CREATE USER default IDENTIFIED WITH sha256_password │ +# highlight-next-line +│ CREATE USER ingester IDENTIFIED WITH sha256_password SETTINGS PROFILE log_ingest │ +│ CREATE SETTINGS PROFILE default │ +# highlight-next-line +│ CREATE SETTINGS PROFILE log_ingest SETTINGS async_insert = true │ +│ CREATE SETTINGS PROFILE readonly SETTINGS readonly = 1 │ +│ ... │ +└────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### セッションに設定を割り当てる + +```sql +SET async_insert = 1; +SELECT value FROM system.settings where name='async_insert'; +``` + +```response +┌─value──┐ +│ 1 │ +└────────┘ +``` + +### クエリ中に設定を割り当てる + +```sql +INSERT INTO YourTable +# highlight-next-line +SETTINGS async_insert=1 +VALUES (...) +``` + +## 設定をデフォルト値に戻す + +設定を変更し、それをデフォルト値に戻したい場合、値を`DEFAULT`に設定します。その構文は以下の通りです: + +```sql +SET setting_name = DEFAULT +``` + +例えば、`async_insert`のデフォルト値は`0`です。値を`1`に変更したとします: + +```sql +SET async_insert = 1; + +SELECT value FROM system.settings where name='async_insert'; +``` + +レスポンスは以下の通りです: + +```response +┌─value──┐ +│ 1 │ +└────────┘ +``` + +次のコマンドはその値を0に戻します: + +```sql +SET async_insert = DEFAULT; + +SELECT value FROM system.settings where name='async_insert'; +``` + +設定はデフォルトに戻りました: + +```response +┌─value───┐ +│ 0 │ +└─────────┘ +``` + +## カスタム設定 {#custom_settings} + +共通の[設定](../../operations/settings/settings.md)に加えて、ユーザーはカスタム設定を定義することができます。 + +カスタム設定名は、指定されたプレフィックスのいずれかで始める必要があります。これらのプレフィックスのリストは、サーバー設定ファイルの[custom_settings_prefixes](../../operations/server-configuration-parameters/settings.md#custom_settings_prefixes)パラメータで宣言する必要があります。 + +```xml +custom_ +``` + +カスタム設定を定義するには`SET`コマンドを使用します: + +```sql +SET custom_a = 123; +``` + +カスタム設定の現在の値を取得するには、`getSetting()`関数を使用します: + +```sql +SELECT getSetting('custom_a'); +``` + +**関連情報** + +- ClickHouse設定の説明については、[設定](./settings.md)ページを参照してください。 +- [グローバルサーバー設定](../../operations/server-configuration-parameters/settings.md) diff --git a/docs/ja/operations/settings/settings-users.md b/docs/ja/operations/settings/settings-users.md new file mode 100644 index 00000000000..8e91286cfa1 --- /dev/null +++ b/docs/ja/operations/settings/settings-users.md @@ -0,0 +1,250 @@ +--- +slug: /ja/operations/settings/settings-users +sidebar_position: 63 +sidebar_label: ユーザー設定 +--- + +# ユーザーとロールの設定 + +`users.xml` の `users` セクションにはユーザー設定が含まれています。 + +:::note +ClickHouseは、ユーザー管理のための[SQL駆動のワークフロー](../../guides/sre/user-management/index.md#access-control)もサポートしています。利用をお勧めします。 +::: + +`users` セクションの構造: + +``` xml + + + + + + + + + + ssh-ed25519 + AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj + + + ecdsa-sha2-nistp256 + AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNxeV2uN5UY6CUbCzTA1rXfYimKQA5ivNIqxdax4bcMXz4D0nSk2l5E1TkR5mG8EBWtmExSPbcEPJ8V7lyWWbA8= + + + ssh-rsa + AAAAB3NzaC1yc2EAAAADAQABAAABgQCpgqL1SHhPVBOTFlOm0pu+cYBbADzC2jL41sPMawYCJHDyHuq7t+htaVVh2fRgpAPmSEnLEC2d4BEIKMtPK3bfR8plJqVXlLt6Q8t4b1oUlnjb3VPA9P6iGcW7CV1FBkZQEVx8ckOfJ3F+kI5VsrRlEDgiecm/C1VPl0/9M2llW/mPUMaD65cM9nlZgM/hUeBrfxOEqM11gDYxEZm1aRSbZoY4dfdm3vzvpSQ6lrCrkjn3X2aSmaCLcOWJhfBWMovNDB8uiPuw54g3ioZ++qEQMlfxVsqXDGYhXCrsArOVuW/5RbReO79BvXqdssiYShfwo+GhQ0+aLWMIW/jgBkkqx/n7uKLzCMX7b2F+aebRYFh+/QXEj7SnihdVfr9ud6NN3MWzZ1ltfIczlEcFLrLJ1Yq57wW6wXtviWh59WvTWFiPejGjeSjjJyqqB49tKdFVFuBnIU5u/bch2DXVgiAEdQwUrIp1ACoYPq22HFFAYUJrL32y7RxX3PGzuAv3LOc= + + + + 0|1 + + + + + profile_name + + default + default + + + + expression + + + + + + GRANT SELECT ON system.* + + + + +``` + +### user_name/password {#user-namepassword} + +パスワードはプレーンテキストまたはSHA256(16進形式)で指定できます。 + +- プレーンテキストでパスワードを割り当てるには(**非推奨**)、`password` 要素に置きます。 + + 例: `qwerty`。パスワードは空白にすることもできます。 + + + +- SHA256ハッシュを使用してパスワードを割り当てるには、`password_sha256_hex` 要素に置きます。 + + 例: `65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5`。 + + シェルからパスワードを生成する例: + + PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-' + + 結果の最初の行がパスワードです。第2行は対応するSHA256ハッシュです。 + + + +- MySQLクライアントとの互換性のために、パスワードはダブルSHA1ハッシュでも指定できます。`password_double_sha1_hex` 要素に置きます。 + + 例: `08b4a0f1de6ad37da17359e592c8d74788a83eb0`。 + + シェルからパスワードを生成する例: + + PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' + + 結果の最初の行がパスワードです。第2行は対応するダブルSHA1ハッシュです。 + +### username/ssh-key {#user-sshkey} + +この設定はSSHキーによる認証を許可します。 + +例えば、`ssh-keygen` によって生成されたSSH鍵が次のような形式の場合 +``` +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj john@example.com +``` +`ssh_key` 要素は次のように指定します +``` + + ssh-ed25519 + AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj + +``` + +他のサポートされているアルゴリズムに対しては、`ssh-ed25519` を `ssh-rsa` や `ecdsa-sha2-nistp256` に置き換えてください。 + +### access_management {#access_management-user-setting} + +この設定は、SQL駆動の[アクセス制御とアカウント管理](../../guides/sre/user-management/index.md#access-control)の使用を、ユーザーに対して有効または無効にします。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +デフォルト値: 0。 + +### grants {#grants-user-setting} + +この設定は、選択したユーザーに任意の権限を付与することを許可します。 +リストの各要素は、被授与者を指定しない `GRANT` クエリであるべきです。 + +例: + +```xml + + + GRANT SHOW ON *.* + GRANT CREATE ON *.* WITH GRANT OPTION + GRANT SELECT ON system.* + + +``` + +この設定は、`dictionaries`、`access_management`、`named_collection_control`、`show_named_collections_secrets` +および `allow_databases` 設定と同時に指定することはできません。 + +### user_name/networks {#user-namenetworks} + +ユーザーがClickHouseサーバーに接続できるネットワークのリストです。 + +リストの各要素は次の形式のいずれかになります: + +- `` — IPアドレスまたはネットワークマスク。 + + 例: `213.180.204.3`, `10.0.0.1/8`, `10.0.0.1/255.255.255.0`, `2a02:6b8::3`, `2a02:6b8::3/64`, `2a02:6b8::3/ffff:ffff:ffff:ffff::`。 + +- `` — ホスト名。 + + 例: `example01.host.ru`。 + + アクセスを確認するために、DNSクエリが実行され、帰ってきたすべてのIPアドレスがピアアドレスと比較されます。 + +- `` — ホスト名の正規表現。 + + 例、`^example\d\d-\d\d-\d\.host\.ru$` + + アクセスを確認するために、[DNS PTRクエリ](https://en.wikipedia.org/wiki/Reverse_DNS_lookup)がピアアドレスに対して行われ、指定された正規表現が適用されます。その後、PTRクエリの結果に対してもう一つのDNSクエリが行われ、得られたすべてのアドレスがピアアドレスと比較されます。正規表現が $ で終わることを強くお勧めします。 + +すべてのDNSリクエストの結果はサーバーが再起動されるまでキャッシュされます。 + +**例** + +任意のネットワークからのユーザーアクセスを開放するには、次のように指定します: + +``` xml +::/0 +``` + +:::note +適切に構成されたファイアウォールを持っているか、またはサーバーがインターネットに直接接続されていない限り、任意のネットワークからのアクセスを許可するのは安全ではありません。 +::: + +localhostのみにアクセスを許可するには、次のように指定します: + +``` xml +::1 +127.0.0.1 +``` + +### user_name/profile {#user-nameprofile} + +ユーザーに設定プロファイルを割り当てることができます。設定プロファイルは `users.xml` ファイルの別のセクションで設定されます。詳しくは [設定のプロファイル](../../operations/settings/settings-profiles.md) を参照してください。 + +### user_name/quota {#user-namequota} + +クォータにより、一定期間内に使用されるリソースの使用を追跡または制限することができます。クォータは `users.xml` の `quotas` セクションで設定されます。 + +ユーザーにクォータセットを割り当てることができます。クォータ構成の詳細については [クォータ](../../operations/quotas.md#quotas) を参照してください。 + +### user_name/databases {#user-namedatabases} + +このセクションでは、現在のユーザーが `SELECT` クエリを通じてClickHouseから返される行を制限することができます。基本的な行レベルのセキュリティを実装することができます。 + +**例** + +次の設定は、ユーザー `user1` が `table1` の `SELECT` クエリ結果として、`id` フィールドの値が1000である行のみを見ることができることを強制します。 + +``` xml + + + + + id = 1000 + + + + +``` + +`filter` は [UInt8](../../sql-reference/data-types/int-uint.md) 型の値を持つ任意の式であることができます。通常、比較および論理演算子を含みます。`database_name.table1` の行で `filter` が0になるものは、このユーザーには返されません。フィルタリングは `PREWHERE` 操作とは互換性がなく、`WHERE→PREWHERE` 最適化を無効にします。 + +## ロール + +`user.xml` の `roles` セクションを使用して、任意の事前定義されたロールを作成することができます。 + +`roles` セクションの構造: + +```xml + + + + GRANT SHOW ON *.* + REVOKE SHOW ON system.* + GRANT CREATE ON *.* WITH GRANT OPTION + + + +``` + +これらのロールは `users` セクションからユーザーに付与することもできます: + +```xml + + + ... + + GRANT test_role + + + +``` diff --git a/docs/ja/operations/settings/settings.md b/docs/ja/operations/settings/settings.md new file mode 100644 index 00000000000..ed3c720044e --- /dev/null +++ b/docs/ja/operations/settings/settings.md @@ -0,0 +1,9657 @@ +--- +title: コア設定 +sidebar_label: コア設定 +slug: /ja/operations/settings/settings +toc_max_heading_level: 2 +--- + +すべての設定は、テーブル [system.settings](/docs/ja/operations/system-tables/settings) で利用可能です。これらの設定は、[source](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp) から自動生成されています。 +## add_http_cors_header {#add_http_cors_header} + +タイプ: Bool + +デフォルト値: 0 + +HTTP CORS ヘッダーを追加します。 + +## additional_result_filter {#additional_result_filter} + +タイプ: String + +デフォルト値: + +`SELECT` クエリの結果に適用される追加のフィルター式です。この設定は、いかなるサブクエリにも適用されません。 + +**例** + +``` sql +INSERT INTO table_1 VALUES (1, 'a'), (2, 'bb'), (3, 'ccc'), (4, 'dddd'); +SElECT * FROM table_1; +``` +```response +┌─x─┬─y────┐ +│ 1 │ a │ +│ 2 │ bb │ +│ 3 │ ccc │ +│ 4 │ dddd │ +└───┴──────┘ +``` +```sql +SELECT * +FROM table_1 +SETTINGS additional_result_filter = 'x != 2' +``` +```response +┌─x─┬─y────┐ +│ 1 │ a │ +│ 3 │ ccc │ +│ 4 │ dddd │ +└───┴──────┘ +``` + +## additional_table_filters {#additional_table_filters} + +タイプ: Map + +デフォルト値: {} + +指定されたテーブルから読み取った後に適用される追加のフィルター式です。 + +**例** + +``` sql +INSERT INTO table_1 VALUES (1, 'a'), (2, 'bb'), (3, 'ccc'), (4, 'dddd'); +SELECT * FROM table_1; +``` +```response +┌─x─┬─y────┐ +│ 1 │ a │ +│ 2 │ bb │ +│ 3 │ ccc │ +│ 4 │ dddd │ +└───┴──────┘ +``` +```sql +SELECT * +FROM table_1 +SETTINGS additional_table_filters = {'table_1': 'x != 2'} +``` +```response +┌─x─┬─y────┐ +│ 1 │ a │ +│ 3 │ ccc │ +│ 4 │ dddd │ +└───┴──────┘ +``` + +## aggregate_functions_null_for_empty {#aggregate_functions_null_for_empty} + +タイプ: Bool + +デフォルト値: 0 + +クエリ内のすべての集約関数を書き換える機能を有効または無効にします。また、[-OrNull](../../sql-reference/aggregate-functions/combinators.md/#agg-functions-combinator-ornull) サフィックスが追加されます。SQL 標準の互換性のために有効にします。分散クエリの一貫した結果を得るために、クエリのリライトを介して実装されています([count_distinct_implementation](#count_distinct_implementation) 設定に類似)。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +**例** + +次の集約関数を使用したクエリを考えてみます。 +```sql +SELECT SUM(-1), MAX(0) FROM system.one WHERE 0; +``` + +`aggregate_functions_null_for_empty = 0` の場合、次の結果が表示されます: +```text +┌─SUM(-1)─┬─MAX(0)─┐ +│ 0 │ 0 │ +└─────────┴────────┘ +``` + +`aggregate_functions_null_for_empty = 1` の場合、結果は次のようになります: +```text +┌─SUMOrNull(-1)─┬─MAXOrNull(0)─┐ +│ NULL │ NULL │ +└───────────────┴──────────────┘ +``` + +## aggregation_in_order_max_block_bytes {#aggregation_in_order_max_block_bytes} + +タイプ: UInt64 + +デフォルト値: 50000000 + +プライマリーキーの順序で集約中に蓄積されるブロックの最大サイズ(バイト数)です。小さなブロックサイズは、集約の最終マージステージをより並列化することを可能にします。 + +## aggregation_memory_efficient_merge_threads {#aggregation_memory_efficient_merge_threads} + +タイプ: UInt64 + +デフォルト値: 0 + +メモリ効率の良いモードで中間集約結果をマージするために使用するスレッド数です。大きいほど、メモリが消費されます。0は「max_threads」と同じ意味です。 + +## allow_aggregate_partitions_independently {#allow_aggregate_partitions_independently} + +タイプ: Bool + +デフォルト値: 0 + +パーティションキーがグループ化キーに適合する場合、別々のスレッドでパーティションの独立した集約を有効にします。パーティションの数がコアの数に近く、パーティションのサイズが大まかに同じである場合に有益です。 + +## allow_archive_path_syntax {#allow_archive_path_syntax} + +タイプ: Bool + +デフォルト値: 1 + +ファイル/S3 エンジン/テーブル関数は、アーカイブが正しい拡張子を持っている場合、'::' を '\\ :: \\' としてパスを解析します。 + +## allow_asynchronous_read_from_io_pool_for_merge_tree {#allow_asynchronous_read_from_io_pool_for_merge_tree} + +タイプ: Bool + +デフォルト値: 0 + +MergeTree テーブルから読み取るためにバックグラウンド I/O プールを使用します。この設定は、I/O 処理に制約のあるクエリの性能を向上させる可能性があります。 + +## allow_changing_replica_until_first_data_packet {#allow_changing_replica_until_first_data_packet} + +タイプ: Bool + +デフォルト値: 0 + +これが有効になっていると、ヘッジリクエストでは、最初のデータパケットを受信するまで新しい接続を開始できます。進行中でも、最初の進行が更新されていない場合 (ただし、`receive_data_timeout` タイムアウトが適用されている場合)、そうでなければ、進行が進んだ後はレプリカの変更を無効にします。 + +## allow_create_index_without_type {#allow_create_index_without_type} + +タイプ: Bool + +デフォルト値: 0 + +TYPE なしで CREATE INDEX クエリを許可します。クエリは無視されます。SQL 互換性テストのために行われています。 + +## allow_custom_error_code_in_throwif {#allow_custom_error_code_in_throwif} + +タイプ: Bool + +デフォルト値: 0 + +throwIf() 関数にカスタムエラーコードを有効にします。これが真の場合、投げられた例外が予期しないエラーコードを持つ可能性があります。 + +## allow_ddl {#allow_ddl} + +タイプ: Bool + +デフォルト値: 1 + +これが真に設定されている場合、ユーザーは DDL クエリを実行することが許可されます。 + +## allow_deprecated_database_ordinary {#allow_deprecated_database_ordinary} + +タイプ: Bool + +デフォルト値: 0 + +非推奨の Ordinary エンジンを使用してデータベースを作成することを許可します。 + +## allow_deprecated_error_prone_window_functions {#allow_deprecated_error_prone_window_functions} + +タイプ: Bool + +デフォルト値: 0 + +エラーが発生しやすいウィンドウ関数(neighbor, runningAccumulate, runningDifferenceStartingWithFirstValue, runningDifference)の使用を許可します。 + +## allow_deprecated_snowflake_conversion_functions {#allow_deprecated_snowflake_conversion_functions} + +タイプ: Bool + +デフォルト値: 0 + +`snowflakeToDateTime`、`snowflakeToDateTime64`、`dateTimeToSnowflake`、および `dateTime64ToSnowflake` 関数は非推奨で、デフォルトで無効にされています。代わりに `snowflakeIDToDateTime`、`snowflakeIDToDateTime64`、`dateTimeToSnowflakeID`、および `dateTime64ToSnowflakeID` 関数を使用してください。 + +非推奨の関数を再度有効にするには(例:移行期間中)、この設定を `true` に設定してください。 + +## allow_deprecated_syntax_for_merge_tree {#allow_deprecated_syntax_for_merge_tree} + +タイプ: Bool + +デフォルト値: 0 + +非推奨のエンジン定義構文を使用して *MergeTree テーブルを作成することを許可します。 + +## allow_distributed_ddl {#allow_distributed_ddl} + +タイプ: Bool + +デフォルト値: 1 + +これが真に設定されている場合、ユーザーは分散 DDL クエリを実行することが許可されます。 + +## allow_drop_detached {#allow_drop_detached} + +タイプ: Bool + +デフォルト値: 0 + +ALTER TABLE ... DROP DETACHED PART[ITION] ... クエリを許可します。 + +## allow_execute_multiif_columnar {#allow_execute_multiif_columnar} + +タイプ: Bool + +デフォルト値: 1 + +multiIf 関数をカラム形式で実行することを許可します。 + +## allow_experimental_analyzer {#allow_experimental_analyzer} + +タイプ: Bool + +デフォルト値: 1 + +新しいクエリアナライザーを許可します。 + +## allow_experimental_codecs {#allow_experimental_codecs} + +タイプ: Bool + +デフォルト値: 0 + +これが真に設定されている場合、エクスペリメンタルな圧縮コーデックを指定することを許可します(ただし、現時点ではそれは存在せず、このオプションは何も実行されません)。 + +## allow_experimental_database_materialized_mysql {#allow_experimental_database_materialized_mysql} + +タイプ: Bool + +デフォルト値: 0 + +Engine=MaterializedMySQL(...) を使用してデータベースを作成することを許可します。 + +## allow_experimental_database_materialized_postgresql {#allow_experimental_database_materialized_postgresql} + +タイプ: Bool + +デフォルト値: 0 + +Engine=MaterializedPostgreSQL(...) を使用してデータベースを作成することを許可します。 + +## allow_experimental_dynamic_type {#allow_experimental_dynamic_type} + +タイプ: Bool + +デフォルト値: 0 + +Dynamic データ型を許可します。 + +## allow_experimental_full_text_index {#allow_experimental_full_text_index} + +タイプ: Bool + +デフォルト値: 0 + +これが真に設定されている場合、エクスペリメンタルなフルテキストインデックスを使用することを許可します。 + +## allow_experimental_funnel_functions {#allow_experimental_funnel_functions} + +タイプ: Bool + +デフォルト値: 0 + +ファunnel 分析のためのエクスペリメンタルな関数を有効にします。 + +## allow_experimental_hash_functions {#allow_experimental_hash_functions} + +タイプ: Bool + +デフォルト値: 0 + +エクスペリメンタルなハッシュ関数を有効にします。 + +## allow_experimental_inverted_index {#allow_experimental_inverted_index} + +タイプ: Bool + +デフォルト値: 0 + +これが真に設定されている場合、エクスペリメンタルなインバーテッドインデックスを使用することを許可します。 + +## allow_experimental_join_condition {#allow_experimental_join_condition} + +タイプ: Bool + +デフォルト値: 0 + +左テーブルと右テーブルの両方のカラムを含む非等式条件での結合をサポートします。例: t1.y < t2.y。 + +## allow_experimental_join_right_table_sorting {#allow_experimental_join_right_table_sorting} + +タイプ: Bool + +デフォルト値: 0 + +これが真に設定されている場合、`join_to_sort_minimum_perkey_rows` と `join_to_sort_maximum_table_rows` の条件が満たされていると、右テーブルをキーで並べ替え、左または内部ハッシュ結合でパフォーマンスを向上させます。 + +## allow_experimental_json_type {#allow_experimental_json_type} + +タイプ: Bool + +デフォルト値: 0 + +JSON データ型を許可します。 + +## allow_experimental_kafka_offsets_storage_in_keeper {#allow_experimental_kafka_offsets_storage_in_keeper} + +タイプ: Bool + +デフォルト値: 0 + +ClickHouse Keeper に Kafka 関連のオフセットを保存するためのエクスペリメンタルな機能を許可します。有効にすると、ClickHouse Keeper パスとレプリカ名を Kafka テーブルエンジンに指定できます。この結果、通常の Kafka エンジンの代わりに、コミットされたオフセットを主に ClickHouse Keeper に保存する新しいタイプのストレージエンジンが使用されます。 + +## allow_experimental_live_view {#allow_experimental_live_view} + +タイプ: Bool + +デフォルト値: 0 + +非推奨の LIVE VIEW の作成を許可します。 + +可能な値: + +- 0 — ライブビューでの操作が無効です。 +- 1 — ライブビューでの操作が有効です。 + +## allow_experimental_materialized_postgresql_table {#allow_experimental_materialized_postgresql_table} + +タイプ: Bool + +デフォルト値: 0 + +MaterializedPostgreSQL テーブルエンジンを使用することを許可します。デフォルトでは無効です。この機能はエクスペリメンタルです。 + +## allow_experimental_nlp_functions {#allow_experimental_nlp_functions} + +タイプ: Bool + +デフォルト値: 0 + +自然言語処理のためのエクスペリメンタルな関数を有効にします。 + +## allow_experimental_object_type {#allow_experimental_object_type} + +タイプ: Bool + +デフォルト値: 0 + +Object および JSON データ型を許可します。 + +## allow_experimental_parallel_reading_from_replicas {#allow_experimental_parallel_reading_from_replicas} + +タイプ: UInt64 + +デフォルト値: 0 + +SELECT クエリの実行のために、各シャードから `max_parallel_replicas` の数だけのレプリカを使用します。読み取りは、動的に並列化され、調整されます。0 - オフ、1 - 有効、失敗した場合は静かに無効化、2 - 有効、失敗した場合に例外をスローします。 + +## allow_experimental_query_deduplication {#allow_experimental_query_deduplication} + +タイプ: Bool + +デフォルト値: 0 + +部分 UUID に基づく SELECT クエリのエクスペリメンタルなデータ重複排除です。 + +## allow_experimental_shared_set_join {#allow_experimental_shared_set_join} + +タイプ: Bool + +デフォルト値: 1 + +ClickHouse Cloud のみ。ShareSet および SharedJoin の作成を許可します。 + +## allow_experimental_statistics {#allow_experimental_statistics} + +タイプ: Bool + +デフォルト値: 0 + +[統計](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)を持つカラムの定義および[統計を操作](../../engines/table-engines/mergetree-family/mergetree.md#column-statistics)を許可します。 + +## allow_experimental_time_series_table {#allow_experimental_time_series_table} + +タイプ: Bool + +デフォルト値: 0 + +[TimeSeries](../../engines/table-engines/integrations/time-series.md) テーブルエンジンを持つテーブルの作成を許可します。 + +可能な値: + +- 0 — [TimeSeries](../../engines/table-engines/integrations/time-series.md) テーブルエンジンは無効です。 +- 1 — [TimeSeries](../../engines/table-engines/integrations/time-series.md) テーブルエンジンは有効です。 + +## allow_experimental_variant_type {#allow_experimental_variant_type} + +タイプ: Bool + +デフォルト値: 0 + +エクスペリメンタルな [Variant](../../sql-reference/data-types/variant.md) の作成を許可します。 + +## allow_experimental_vector_similarity_index {#allow_experimental_vector_similarity_index} + +タイプ: Bool + +デフォルト値: 0 + +エクスペリメンタルなベクトル類似度インデックスを許可します。 + +## allow_experimental_window_view {#allow_experimental_window_view} + +タイプ: Bool + +デフォルト値: 0 + +WINDOW VIEW を有効にします。成熟していません。 + +## allow_get_client_http_header {#allow_get_client_http_header} + +タイプ: Bool + +デフォルト値: 0 + +現在の HTTP リクエストのヘッダーの値を取得するための `getClientHTTPHeader` 関数を使用することを許可します。セキュリティ上の理由からデフォルトでは有効になっていません。一部のヘッダー(`Cookie` など)には機密情報が含まれる可能性があります。この関数で取得できないヘッダーは、`X-ClickHouse-*` および `Authentication` ヘッダーです。 + +## allow_hyperscan {#allow_hyperscan} + +タイプ: Bool + +デフォルト値: 1 + +Hyperscan ライブラリを使用する関数を許可します。長いコンパイル時間や過剰なリソース使用を避けるために無効にします。 + +## allow_introspection_functions {#allow_introspection_functions} + +タイプ: Bool + +デフォルト値: 0 + +クエリプロファイリングのための [イントロスペクション関数](../../sql-reference/functions/introspection.md) を有効または無効にします。 + +可能な値: + +- 1 — インストロスペクション関数有効。 +- 0 — インストロスペクション関数無効。 + +**参照** + +- [Sampling Query Profiler](../../operations/optimizing-performance/sampling-query-profiler.md) +- システムテーブル [trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) + +## allow_materialized_view_with_bad_select {#allow_materialized_view_with_bad_select} + +タイプ: Bool + +デフォルト値: 1 + +存在しないテーブルやカラムを参照する SELECT クエリを使用して CREATE MATERIALIZED VIEW を許可します。それは依然として構文的に有効でなければなりません。リフレッシュ可能な MV には適用されません。SELECT クエリから MV スキーマを推測する必要がある場合(すなわち、CREATE にカラムリストがなく TO テーブルがない場合)には適用されません。MV のソーステーブルを作成するために使用できます。 + +## allow_named_collection_override_by_default {#allow_named_collection_override_by_default} + +タイプ: Bool + +デフォルト値: 1 + +デフォルトで名前付きコレクションのフィールドをオーバーライドすることを許可します。 + +## allow_non_metadata_alters {#allow_non_metadata_alters} + +タイプ: Bool + +デフォルト値: 1 + +テーブルメタデータだけでなく、ディスク上のデータにも影響を与える ALTER を実行することを許可します。 + +## allow_nonconst_timezone_arguments {#allow_nonconst_timezone_arguments} + +タイプ: Bool + +デフォルト値: 0 + +toTimeZone()、fromUnixTimestamp*()、snowflakeToDateTime*() のような特定の時間関連関数で非定数のタイムゾーン引数を許可します。 + +## allow_nondeterministic_mutations {#allow_nondeterministic_mutations} + +タイプ: Bool + +デフォルト値: 0 + +ユーザーレベルの設定で、レプリケートされたテーブルが `dictGet` のような非決定的関数を使用するための変更を許可します。 + +例えば、Dictionaryがノード間で同期していない可能性があるため、Dictionaryから値を引っ張る変更がデフォルメでレプリケートされたテーブルでは許可されていません。この設定を有効にすると、この動作が許可されます。このデータがすべてのノード間で同期されていることをユーザーが確認する責任があります。 + +**例** + +``` xml + + + 1 + + + + + + + +``` + +## allow_nondeterministic_optimize_skip_unused_shards {#allow_nondeterministic_optimize_skip_unused_shards} + +タイプ: Bool + +デフォルト値: 0 + +シャーディングキー内の非決定的(例えば、`rand` または `dictGet`、後者には更新に関していくつかの注意事項があります)機能を許可します。 + +可能な値: + +- 0 — 不許可。 +- 1 — 許可。 + +## allow_prefetched_read_pool_for_local_filesystem {#allow_prefetched_read_pool_for_local_filesystem} + +タイプ: Bool + +デフォルト値: 0 + +すべての部分がローカルファイルシステムにある場合、プリフェッチスレッドプールを優先します。 + +## allow_prefetched_read_pool_for_remote_filesystem {#allow_prefetched_read_pool_for_remote_filesystem} + +タイプ: Bool + +デフォルト値: 1 + +すべての部分がリモートファイルシステムにある場合、プリフェッチスレッドプールを優先します。 + +## allow_push_predicate_when_subquery_contains_with {#allow_push_predicate_when_subquery_contains_with} + +タイプ: Bool + +デフォルト値: 1 + +サブクエリに WITH 句が含まれている場合、プッシュ述語を許可します。 + +## allow_reorder_prewhere_conditions {#allow_reorder_prewhere_conditions} + +タイプ: Bool + +デフォルト値: 1 + +WHERE から PREWHERE に条件を移動する際、最適化フィルタリングのためにそれらを再順序にすることを許可します。 + +## allow_settings_after_format_in_insert {#allow_settings_after_format_in_insert} + +タイプ: Bool + +デフォルト値: 0 + +INSERT クエリ内の FORMAT の後に `SETTINGS` が許可されるかどうかを制御します。これは推奨されておらず、これにより `SETTINGS` の一部が値として解釈される可能性があります。 + +例: + +```sql +INSERT INTO FUNCTION null('foo String') SETTINGS max_threads=1 VALUES ('bar'); +``` + +しかし、次のクエリは `allow_settings_after_format_in_insert` のみで機能します: + +```sql +SET allow_settings_after_format_in_insert=1; +INSERT INTO FUNCTION null('foo String') VALUES ('bar') SETTINGS max_threads=1; +``` + +可能な値: + +- 0 — 不許可。 +- 1 — 許可。 + +:::note +この設定は、旧構文に依存するユースケースの場合にのみ、後方互換性のために使用します。 +::: + +## allow_simdjson {#allow_simdjson} + +タイプ: Bool + +デフォルト値: 1 + +AVX2 命令が利用可能な場合、'JSON*' 関数で simdjson ライブラリを使用することを許可します。無効にすると、rapidjson が使用されます。 + +## allow_statistics_optimize {#allow_statistics_optimize} + +タイプ: Bool + +デフォルト値: 0 + +クエリを最適化するために統計を使用することを許可します。 + +## allow_suspicious_codecs {#allow_suspicious_codecs} + +タイプ: Bool + +デフォルト値: 0 + +これが真に設定されている場合、意味のない圧縮コーデックを指定することを許可します。 + +## allow_suspicious_fixed_string_types {#allow_suspicious_fixed_string_types} + +タイプ: Bool + +デフォルト値: 0 + +CREATE TABLE ステートメントにおいて、n > 256 の FixedString(n) タイプのカラムを作成することを許可します。長さが 256 以上の FixedString は疑わしく、誤用を示す可能性が高いです。 + +## allow_suspicious_indices {#allow_suspicious_indices} + +タイプ: Bool + +デフォルト値: 0 + +同一の式を持つプライマリ/セカンダリインデックスおよびソートキーを拒否します。 + +## allow_suspicious_low_cardinality_types {#allow_suspicious_low_cardinality_types} + +タイプ: Bool + +デフォルト値: 0 + +8 バイト以下の固定サイズのデータ型と一緒に [LowCardinality](../../sql-reference/data-types/lowcardinality.md) を使用することを許可または制限します。数値データ型および `FixedString(8_bytes_or_less)`。 + +小さな固定値に対して `LowCardinality` の使用は通常非効率的です。なぜなら、ClickHouse は各行に対して数値インデックスを保存するからです。その結果: + +- ディスクスペースの使用量が増加する可能性があります。 +- RAM 消費が高くなる可能性があります。Dictionaryのサイズに依存します。 +- 一部の関数は、追加のコーディング/エンコーディング操作のために遅くなることがあります。 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) エンジンテーブル内でのマージ時間は、上記のすべての理由により増加する可能性があります。 + +可能な値: + +- 1 — `LowCardinality` の使用は制限されません。 +- 0 — `LowCardinality` の使用は制限されます。 + +## allow_suspicious_primary_key {#allow_suspicious_primary_key} + +タイプ: Bool + +デフォルト値: 0 + +MergeTree の疑わしい `PRIMARY KEY`/`ORDER BY` を許可します(すなわち、SimpleAggregateFunction)。 + +## allow_suspicious_ttl_expressions {#allow_suspicious_ttl_expressions} + +タイプ: Bool + +デフォルト値: 0 + +テーブルのカラムに依存しない TTL 式を拒否します。これはほとんどの場合、ユーザーエラーを示しています。 + +## allow_suspicious_types_in_group_by {#allow_suspicious_types_in_group_by} + +タイプ: Bool + +デフォルト値: 0 + +GROUP BY キーで [Variant](../../sql-reference/data-types/variant.md) および [Dynamic](../../sql-reference/data-types/dynamic.md) タイプの使用を許可または制限します。 + +## allow_suspicious_types_in_order_by {#allow_suspicious_types_in_order_by} + +タイプ: Bool + +デフォルト値: 0 + +ORDER BY キーで [Variant](../../sql-reference/data-types/variant.md) および [Dynamic](../../sql-reference/data-types/dynamic.md) タイプの使用を許可または制限します。 + +## allow_suspicious_variant_types {#allow_suspicious_variant_types} + +タイプ: Bool + +デフォルト値: 0 + +CREATE TABLE ステートメントで、類似のバリアントタイプ(例えば、異なる数値または日付型)を持つバリアントタイプを指定することを許可します。この設定を有効にすると、類似のタイプを持つ値で作業する際に若干の曖昧性を引き起こす可能性があります。 + +## allow_unrestricted_reads_from_keeper {#allow_unrestricted_reads_from_keeper} + +タイプ: Bool + +デフォルト値: 0 + +条件なしで system.zookeeper テーブルからの無制限の読み取りを許可します。便利ですが、zookeeper に対して安全ではありません。 + +## alter_move_to_space_execute_async {#alter_move_to_space_execute_async} + +タイプ: Bool + +デフォルト値: 0 + +ALTER TABLE MOVE ... TO [DISK|VOLUME] を非同期に実行します。 + +## alter_partition_verbose_result {#alter_partition_verbose_result} + +タイプ: Bool + +デフォルト値: 0 + +パーティションおよび部品の操作が正常に適用された部品に関する情報の表示を有効または無効にします。これは [ATTACH PARTITION|PART](../../sql-reference/statements/alter/partition.md/#alter_attach-partition) および [FREEZE PARTITION](../../sql-reference/statements/alter/partition.md/#alter_freeze-partition) に適用されます。 + +可能な値: + +- 0 — 詳細表示を無効にします。 +- 1 — 詳細表示を有効にします。 + +**例** + +```sql +CREATE TABLE test(a Int64, d Date, s String) ENGINE = MergeTree PARTITION BY toYYYYMDECLARE(d) ORDER BY a; +INSERT INTO test VALUES(1, '2021-01-01', ''); +INSERT INTO test VALUES(1, '2021-01-01', ''); +ALTER TABLE test DETACH PARTITION ID '202101'; + +ALTER TABLE test ATTACH PARTITION ID '202101' SETTINGS alter_partition_verbose_result = 1; + +┌─command_type─────┬─partition_id─┬─part_name────┬─old_part_name─┐ +│ ATTACH PARTITION │ 202101 │ 202101_7_7_0 │ 202101_5_5_0 │ +│ ATTACH PARTITION │ 202101 │ 202101_8_8_0 │ 202101_6_6_0 │ +└──────────────────┴──────────────┴──────────────┴───────────────┘ + +ALTER TABLE test FREEZE SETTINGS alter_partition_verbose_result = 1; + +┌─command_type─┬─partition_id─┬─part_name────┬─backup_name─┬─backup_path───────────────────┬─part_backup_path────────────────────────────────────────────┐ +│ FREEZE ALL │ 202101 │ 202101_7_7_0 │ 8 │ /var/lib/clickhouse/shadow/8/ │ /var/lib/clickhouse/shadow/8/data/default/test/202101_7_7_0 │ +│ FREEZE ALL │ 202101 │ 202101_8_8_0 │ 8 │ /var/lib/clickhouse/shadow/8/ │ /var/lib/clickhouse/shadow/8/data/default/test/202101_8_8_0 │ +└──────────────┴──────────────┴──────────────┴─────────────┴───────────────────────────────┴─────────────────────────────────────────────────────────────┘ +``` + +## alter_sync {#alter_sync} + +タイプ: UInt64 + +デフォルト値: 1 + +[ALTER](../../sql-reference/statements/alter/index.md)、[OPTIMIZE](../../sql-reference/statements/optimize.md)、または [TRUNCATE](../../sql-reference/statements/truncate.md) クエリによってレプリカでのアクションが実行されるのを待つ設定を行うことができます。 + +可能な値: + +- 0 — 待機しない。 +- 1 — 自分の実行を待つ。 +- 2 — すべてを待つ。 + +クラウドデフォルト値: `0`。 + +:::note +`alter_sync` は `Replicated` テーブルにのみ適用され、`Replicated` でないテーブルの変更には無効です。 +::: + +## analyze_index_with_space_filling_curves {#analyze_index_with_space_filling_curves} + +タイプ: Bool + +デフォルト値: 1 + +テーブルのインデックスに空間充填曲線がある場合(例: `ORDER BY mortonEncode(x, y)` または `ORDER BY hilbertEncode(x, y)`)、およびクエリがその引数に条件を持つ場合(例: `x >= 10 AND x <= 20 AND y >= 20 AND y <= 30`)、インデックス分析のために空間充填曲線を使用します。 + +## analyzer_compatibility_join_using_top_level_identifier {#analyzer_compatibility_join_using_top_level_identifier} + +タイプ: Bool + +デフォルト値: 0 + +プロジェクションからの JOIN USING での識別子の解決を強制します(例えば、`SELECT a + 1 AS b FROM t1 JOIN t2 USING (b)` の場合、結合は `t1.a + 1 = t2.b` によって行われ、`t1.b = t2.b` ではありません)。 + +## any_join_distinct_right_table_keys {#any_join_distinct_right_table_keys} + +タイプ: Bool + +デフォルト値: 0 + +`ANY INNER|LEFT JOIN` 操作における従来の ClickHouse サーバの動作を有効にします。 + +:::note +この設定は、従来の `JOIN` の動作に依存するユースケースがある場合のみ使用してください。 +::: + +従来の動作が有効な場合: + +- `t1 ANY LEFT JOIN t2` と `t2 ANY RIGHT JOIN t1` 操作の結果は等しくありません。なぜなら、ClickHouse は多対一の左から右にマッピングされたテーブルキーのロジックを使用するからです。 +- `ANY INNER JOIN` 操作の結果は、`SEMI LEFT JOIN` 操作と同様に、左テーブルのすべての行を含みます。 + +従来の動作が無効な場合: + +- `t1 ANY LEFT JOIN t2` と `t2 ANY RIGHT JOIN t1` 操作の結果は等しいことが保証されます。ClickHouse は `ANY RIGHT JOIN` 操作での一対多のキーのマッピングを提供するロジックを使用するためです。 +- `ANY INNER JOIN` 操作の結果は、左および右の両方のテーブルからキーごとに一行を含みます。 + +可能な値: + +- 0 — 従来の動作が無効。 +- 1 — 従来の動作が有効。 + +参照: + +- [JOIN の厳密さ](../../sql-reference/statements/select/join.md/#join-settings) + +## apply_deleted_mask {#apply_deleted_mask} + +タイプ: Bool + +デフォルト値: 1 + +論理削除で削除された行をフィルタリングする機能を有効または無効にします。これが無効になっている場合、クエリはこれらの行を読み取ることができます。これはデバッグや「未削除」シナリオに便利です。 + +## apply_mutations_on_fly {#apply_mutations_on_fly} + +タイプ: Bool + +デフォルト値: 0 + +これが真の場合、データ部分にマテリアライズされていない変異(UPDATE および DELETE)が SELECT に適用されます。ClickHouse Cloud のみで利用可能です。 + +## asterisk_include_alias_columns {#asterisk_include_alias_columns} + +タイプ: Bool + +デフォルト値: 0 + +ワイルドカードクエリ(`SELECT *`)のために [ALIAS](../../sql-reference/statements/create/table.md#alias) カラムを含めます。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## asterisk_include_materialized_columns {#asterisk_include_materialized_columns} + +タイプ: Bool + +デフォルト値: 0 + +ワイルドカードクエリ(`SELECT *`)のために [MATERIALIZED](../../sql-reference/statements/create/table.md#materialized) カラムを含めます。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## async_insert {#async_insert} + +タイプ: Bool + +デフォルト値: 0 + +これが真の場合、INSERT クエリからのデータはキューに保存され、その後バックグラウンドでテーブルにフラッシュされます。wait_for_async_insert が false の場合、INSERT クエリはほぼ瞬時に処理されます。そうでない場合、クライアントはデータがテーブルにフラッシュされるまで待機します。 + +## async_insert_busy_timeout_decrease_rate {#async_insert_busy_timeout_decrease_rate} + +タイプ: Double + +デフォルト値: 0.2 + +適応的な非同期挿入タイムアウトが減少する際の指数成長率。 + +## async_insert_busy_timeout_increase_rate {#async_insert_busy_timeout_increase_rate} + +タイプ: Double + +デフォルト値: 0.2 + +適応的な非同期挿入タイムアウトが増加する際の指数成長率。 + +## async_insert_busy_timeout_max_ms {#async_insert_busy_timeout_max_ms} + +タイプ: ミリ秒 + +デフォルト値: 200 + +最初のデータが現れた後、クエリごとに収集されたデータをダンプするまで待機する最大時間。 + +## async_insert_busy_timeout_min_ms {#async_insert_busy_timeout_min_ms} + +タイプ: ミリ秒 + +デフォルト値: 50 + +自動調整が async_insert_use_adaptive_busy_timeout を通じて有効になっている場合、最初のデータが現れてからクエリごとに収集されたデータをダンプするまでの最小時間。この値は、適応アルゴリズムの初期値としても機能します。 + +## async_insert_deduplicate {#async_insert_deduplicate} + +タイプ: Bool + +デフォルト値: 0 + +レプリケートされたテーブルでの非同期 INSERT クエリの場合、挿入ブロックの重複排除が行われるべきことを示します。 + +## async_insert_max_data_size {#async_insert_max_data_size} + +タイプ: UInt64 + +デフォルト値: 10485760 + +挿入される前のクエリごとに収集された未解析データの最大サイズ(バイト数)。 + +## async_insert_max_query_number {#async_insert_max_query_number} + +タイプ: UInt64 + +デフォルト値: 450 + +挿入される前の最大クエリ数。 + +## async_insert_poll_timeout_ms {#async_insert_poll_timeout_ms} + +タイプ: ミリ秒 + +デフォルト値: 10 + +非同期挿入キューからデータをポーリングするためのタイムアウト。 + +## async_insert_use_adaptive_busy_timeout {#async_insert_use_adaptive_busy_timeout} + +タイプ: Bool + +デフォルト値: 1 + +これが真に設定されている場合、非同期挿入のために適応的ビジータイムアウトを使用します。 + +## async_query_sending_for_remote {#async_query_sending_for_remote} + +タイプ: Bool + +デフォルト値: 1 + +リモートクエリを実行する際の非同期接続作成およびクエリ送信を有効にします。 + +デフォルトで有効です。 + +## async_socket_for_remote {#async_socket_for_remote} + +タイプ: Bool + +デフォルト値: 1 + +リモートクエリを実行する際のソケットからの非同期読み取りを有効にします。 + +デフォルトで有効です。 + +## azure_allow_parallel_part_upload {#azure_allow_parallel_part_upload} + +タイプ: Bool + +デフォルト値: 1 + +複数のスレッドで Azure マルチパートアップロードを使用します。 + +## azure_check_objects_after_upload {#azure_check_objects_after_upload} + +タイプ: Bool + +デフォルト値: 0 + +アップロードが成功したことを確認するために、Azure Blob ストレージにアップロードされた各オブジェクトをチェックします。 + +## azure_create_new_file_on_insert {#azure_create_new_file_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +Azure エンジンテーブルに各挿入時に新しいファイルを作成することを有効または無効にします。 + +## azure_ignore_file_doesnt_exist {#azure_ignore_file_doesnt_exist} + +タイプ: Bool + +デフォルト値: 0 + +特定のキーを読み取る際にファイルが存在しない場合、その不在を無視します。 + +可能な値: +- 1 — `SELECT` は空の結果を返します。 +- 0 — `SELECT` は例外をスローします。 + +## azure_list_object_keys_size {#azure_list_object_keys_size} + +タイプ: UInt64 + +デフォルト値: 1000 + +ListObject リクエストによってバッチで返される可能性のあるファイルの最大数。 + +## azure_max_blocks_in_multipart_upload {#azure_max_blocks_in_multipart_upload} + +タイプ: UInt64 + +デフォルト値: 50000 + +Azure のマルチパートアップロードでの最大ブロック数。 + +## azure_max_inflight_parts_for_one_file {#azure_max_inflight_parts_for_one_file} + +タイプ: UInt64 + +デフォルト値: 20 + +マルチパートアップロードリクエストで同時に読み込まれる部品の最大数。0 は無制限を意味します。 + +## azure_max_single_part_copy_size {#azure_max_single_part_copy_size} + +タイプ: UInt64 + +デフォルト値: 268435456 + +Azure Blob ストレージに単一のパートコピーを使用してコピーする際のオブジェクトの最大サイズ。 + +## azure_max_single_part_upload_size {#azure_max_single_part_upload_size} + +タイプ: UInt64 + +デフォルト値: 104857600 + +以下は、単一パートアップロードを使用して Azure Blob ストレージにアップロードするオブジェクトの最大サイズに関する ClickHouse ドキュメントの翻訳です。 + +## azure_max_single_read_retries {#azure_max_single_read_retries} + +タイプ: UInt64 + +デフォルト値: 4 + +単一の Azure Blob ストレージリード中の最大リトライ回数。 + +## azure_max_unexpected_write_error_retries {#azure_max_unexpected_write_error_retries} + +タイプ: UInt64 + +デフォルト値: 4 + +Azure Blob ストレージへの書き込み中に予期しないエラーが発生した場合の最大リトライ回数。 + +## azure_max_upload_part_size {#azure_max_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 5368709120 + +マルチパートアップロード中に Azure Blob ストレージにアップロードするパートの最大サイズ。 + +## azure_min_upload_part_size {#azure_min_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 16777216 + +マルチパートアップロード中に Azure Blob ストレージにアップロードするパートの最小サイズ。 + +## azure_sdk_max_retries {#azure_sdk_max_retries} + +タイプ: UInt64 + +デフォルト値: 10 + +Azure SDK の最大リトライ回数。 + +## azure_sdk_retry_initial_backoff_ms {#azure_sdk_retry_initial_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 10 + +Azure SDK におけるリトライ間の最小バックオフ時間(ミリ秒)。 + +## azure_sdk_retry_max_backoff_ms {#azure_sdk_retry_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 1000 + +Azure SDK におけるリトライ間の最大バックオフ時間(ミリ秒)。 + +## azure_skip_empty_files {#azure_skip_empty_files} + +タイプ: Bool + +デフォルト値: 0 + +S3 エンジンで空のファイルをスキップするかどうかを有効または無効にします。 + +可能な値: +- 0 — 空のファイルが要求されたフォーマットと互換性がない場合、`SELECT` は例外をスローします。 +- 1 — 空のファイルに対して `SELECT` は空の結果を返します。 + +## azure_strict_upload_part_size {#azure_strict_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 0 + +Azure Blob ストレージにマルチパートアップロード中にアップロードするパートの正確なサイズ。 + +## azure_throw_on_zero_files_match {#azure_throw_on_zero_files_match} + +タイプ: Bool + +デフォルト値: 0 + +グロブ拡張ルールに基づいて一致するファイルがゼロの場合にエラーをスローします。 + +可能な値: +- 1 — `SELECT` は例外をスローします。 +- 0 — `SELECT` は空の結果を返します。 + +## azure_truncate_on_insert {#azure_truncate_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +Azure エンジンテーブルに挿入する前に切り捨てを有効または無効にします。 + +## azure_upload_part_size_multiply_factor {#azure_upload_part_size_multiply_factor} + +タイプ: UInt64 + +デフォルト値: 2 + +Azure Blob ストレージに一度の書き込みからアップロードされた azure_multiply_parts_count_threshold パーツごとに azure_min_upload_part_size に掛ける係数。 + +## azure_upload_part_size_multiply_parts_count_threshold {#azure_upload_part_size_multiply_parts_count_threshold} + +タイプ: UInt64 + +デフォルト値: 500 + +この数のパーツが Azure Blob ストレージにアップロードされるたびに、azure_min_upload_part_size は azure_upload_part_size_multiply_factor で掛け算されます。 + +## backup_restore_batch_size_for_keeper_multi {#backup_restore_batch_size_for_keeper_multi} + +タイプ: UInt64 + +デフォルト値: 1000 + +バックアップまたはリストア中の [Zoo]Keeper へのマルチリクエストの最大バッチサイズ。 + +## backup_restore_batch_size_for_keeper_multiread {#backup_restore_batch_size_for_keeper_multiread} + +タイプ: UInt64 + +デフォルト値: 10000 + +バックアップまたはリストア中の [Zoo]Keeper へのマルチリードリクエストの最大バッチサイズ。 + +## backup_restore_failure_after_host_disconnected_for_seconds {#backup_restore_failure_after_host_disconnected_for_seconds} + +タイプ: UInt64 + +デフォルト値: 3600 + +`BACKUP ON CLUSTER` または `RESTORE ON CLUSTER` 操作中にホストがこの時間内に ZooKeeper 内の一時的な 'alive' ノードを再作成しない場合、全体のバックアップまたはリストアは失敗と見なされます。 +この値は、ホストが障害後に ZooKeeper に再接続するのに十分な合理的な時間より大きい必要があります。 +ゼロは無制限を意味します。 + +## backup_restore_finish_timeout_after_error_sec {#backup_restore_finish_timeout_after_error_sec} + +タイプ: UInt64 + +デフォルト値: 180 + +イニシエーターが他のホストの 'error' ノードへの反応を待っている間の時間。 + +## backup_restore_keeper_fault_injection_probability {#backup_restore_keeper_fault_injection_probability} + +タイプ: Float + +デフォルト値: 0 + +バックアップまたはリストア中の keeper リクエストの障害挿入の近似確率。有効な値は [0.0f, 1.0f] の範囲です。 + +## backup_restore_keeper_fault_injection_seed {#backup_restore_keeper_fault_injection_seed} + +タイプ: UInt64 + +デフォルト値: 0 + +0 - ランダムシード、そうでなければ設定値。 + +## backup_restore_keeper_max_retries {#backup_restore_keeper_max_retries} + +タイプ: UInt64 + +デフォルト値: 1000 + +バックアップまたはリストア操作中の [Zoo]Keeper 操作の最大リトライ回数。 +一時的な [Zoo]Keeper 障害のために操作全体が失敗しないように十分大きい必要があります。 + +## backup_restore_keeper_max_retries_while_handling_error {#backup_restore_keeper_max_retries_while_handling_error} + +タイプ: UInt64 + +デフォルト値: 20 + +`BACKUP ON CLUSTER` または `RESTORE ON CLUSTER` 操作のエラーを処理する際の [Zoo]Keeper 操作の最大リトライ回数。 + +## backup_restore_keeper_max_retries_while_initializing {#backup_restore_keeper_max_retries_while_initializing} + +タイプ: UInt64 + +デフォルト値: 20 + +`BACKUP ON CLUSTER` または `RESTORE ON CLUSTER` 操作の初期化中の [Zoo]Keeper 操作の最大リトライ回数。 + +## backup_restore_keeper_retry_initial_backoff_ms {#backup_restore_keeper_retry_initial_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 100 + +バックアップまたはリストア中の [Zoo]Keeper 操作の初期バックオフタイムアウト。 + +## backup_restore_keeper_retry_max_backoff_ms {#backup_restore_keeper_retry_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 5000 + +バックアップまたはリストア中の [Zoo]Keeper 操作の最大バックオフタイムアウト。 + +## backup_restore_keeper_value_max_size {#backup_restore_keeper_value_max_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +バックアップ中の [Zoo]Keeper のノードのデータの最大サイズ。 + +## backup_restore_s3_retry_attempts {#backup_restore_s3_retry_attempts} + +タイプ: UInt64 + +デフォルト値: 1000 + +Aws::Client::RetryStrategy の設定。Aws::Client は自動的にリトライを行い、0 はリトライを行わないことを意味します。これはバックアップ/リストアにのみ適用されます。 + +## cache_warmer_threads {#cache_warmer_threads} + +タイプ: UInt64 + +デフォルト値: 4 + +ClickHouse Cloud のみで使用可能。キャッシュがフェッチによってポピュレートされるときに、新しいデータパーツをファイルキャッシュに推測的にダウンロードするためのバックグラウンドスレッドの数。ゼロは無効にします。 + +## calculate_text_stack_trace {#calculate_text_stack_trace} + +タイプ: Bool + +デフォルト値: 1 + +クエリ実行中の例外発生時にテキストスタックトレースを計算します。これはデフォルトです。シンボル解決を必要とし、大量の誤ったクエリを実行する場合、ファジングテストが遅くなる可能性があります。通常の場合、これは無効にしないでください。 + +## cancel_http_readonly_queries_on_client_close {#cancel_http_readonly_queries_on_client_close} + +タイプ: Bool + +デフォルト値: 0 + +クライアントが応答を待たずに接続を閉じるときに HTTP 読取り専用クエリ(例: SELECT)をキャンセルします。 + +クラウドデフォルト値: `1`。 + +## cast_ipv4_ipv6_default_on_conversion_error {#cast_ipv4_ipv6_default_on_conversion_error} + +タイプ: Bool + +デフォルト値: 0 + +IPv4 への CAST 演算子、IPv6 への CAST 演算子、toIPv4、toIPv6 関数は、変換エラー時に例外をスローする代わりにデフォルト値を返します。 + +## cast_keep_nullable {#cast_keep_nullable} + +タイプ: Bool + +デフォルト値: 0 + +[CAST](../../sql-reference/functions/type-conversion-functions.md/#castx-t) 操作における `Nullable` データ型の保持を有効または無効にします。 + +設定が有効になっている場合、`CAST` 関数の引数が `Nullable` であれば、結果も `Nullable` 型に変換されます。設定が無効の場合、結果は常に正確に宛先型になります。 + +可能な値: + +- 0 — `CAST` 結果は指定された宛先型と正確に一致します。 +- 1 — 引数の型が `Nullable` の場合、`CAST` 結果は `Nullable(DestinationDataType)` に変換されます。 + +**例** + +以下のクエリは、宛先データ型を正確に返します。 + +```sql +SET cast_keep_nullable = 0; +SELECT CAST(toNullable(toInt32(0)) AS Int32) as x, toTypeName(x); +``` + +結果: + +```text +┌─x─┬─toTypeName(CAST(toNullable(toInt32(0)), 'Int32'))─┐ +│ 0 │ Int32 │ +└───┴───────────────────────────────────────────────────┘ +``` + +以下のクエリは、宛先データ型に `Nullable` 修飾が適用されます。 + +```sql +SET cast_keep_nullable = 1; +SELECT CAST(toNullable(toInt32(0)) AS Int32) as x, toTypeName(x); +``` + +結果: + +```text +┌─x─┬─toTypeName(CAST(toNullable(toInt32(0)), 'Int32'))─┐ +│ 0 │ Nullable(Int32) │ +└───┴───────────────────────────────────────────────────┘ +``` + +**参照** + +- [CAST](../../sql-reference/functions/type-conversion-functions.md/#type_conversion_function-cast) 関数 + +## cast_string_to_dynamic_use_inference {#cast_string_to_dynamic_use_inference} + +タイプ: Bool + +デフォルト値: 0 + +文字列から動的への変換中に型の推論を使用します。 + +## check_query_single_value_result {#check_query_single_value_result} + +タイプ: Bool + +デフォルト値: 1 + +`MergeTree` ファミリーエンジンの [CHECK TABLE](../../sql-reference/statements/check-table.md/#checking-mergetree-tables) クエリ結果に対する詳細レベルを定義します。 + +可能な値: + +- 0 — クエリはテーブルの各データパートのチェックステータスを表示します。 +- 1 — クエリは一般的なテーブルチェックステータスを表示します。 + +## check_referential_table_dependencies {#check_referential_table_dependencies} + +タイプ: Bool + +デフォルト値: 0 + +DDL クエリ(例えば DROP TABLE や RENAME)が参照依存関係を壊さないことを確認します。 + +## check_table_dependencies {#check_table_dependencies} + +タイプ: Bool + +デフォルト値: 1 + +DDL クエリ(例えば DROP TABLE や RENAME)が依存関係を壊さないことを確認します。 + +## checksum_on_read {#checksum_on_read} + +タイプ: Bool + +デフォルト値: 1 + +読み取り時にチェックサムを検証します。これはデフォルトで有効になっており、本番環境では常に有効にしておくべきです。設定を無効にしても利点は期待できません。これは実験やベンチマークにのみ使用される可能性があります。この設定は MergeTree ファミリーのテーブルにのみ適用され、他のテーブルエンジンやネットワーク経由でデータを受信する場合は常にチェックサムが検証されます。 + +## cloud_mode {#cloud_mode} + +タイプ: Bool + +デフォルト値: 0 + +クラウドモード。 + +## cloud_mode_database_engine {#cloud_mode_database_engine} + +タイプ: UInt64 + +デフォルト値: 1 + +クラウドで許可されるデータベースエンジン。1 - DDL を使用して Replicated データベースに書き換える、2 - DDL を使用して Shared データベースに書き換える。 + +## cloud_mode_engine {#cloud_mode_engine} + +タイプ: UInt64 + +デフォルト値: 1 + +クラウドで許可されるエンジンファミリー。0 - すべてを許可、1 - DDL を使用して *ReplicatedMergeTree に書き換え、2 - DDL を使用して SharedMergeTree に書き換え。UInt64 により公開部分を最小化します。 + +## cluster_for_parallel_replicas {#cluster_for_parallel_replicas} + +タイプ: String + +デフォルト値: + +現在のサーバーが位置するシャードのクラスター。 + +## collect_hash_table_stats_during_aggregation {#collect_hash_table_stats_during_aggregation} + +タイプ: Bool + +デフォルト値: 1 + +メモリ割り当てを最適化するために、ハッシュテーブルの統計を収集することを有効にします。 + +## collect_hash_table_stats_during_joins {#collect_hash_table_stats_during_joins} + +タイプ: Bool + +デフォルト値: 1 + +メモリ割り当てを最適化するために、ハッシュテーブルの統計を収集することを有効にします。 + +## compatibility {#compatibility} + +タイプ: String + +デフォルト値: + +`compatibility` 設定は ClickHouse に前のバージョンのデフォルト設定を使用させます。前のバージョンは設定として提供されます。 + +設定がデフォルト値以外に設定されている場合、それらの設定は尊重されます(修正されていない設定のみが `compatibility` 設定の影響を受けます)。 + +この設定は ClickHouse バージョン番号を文字列として受け取ります。例えば、`22.3`、`22.8` 等。空の値はこの設定が無効であることを意味します。 + +デフォルトでは無効です。 + +:::note +ClickHouse Cloud では、互換性設定は ClickHouse Cloud サポートによって設定されなければなりません。設定を行うには [ケースを開いてください](https://clickhouse.cloud/support)。 +::: + +## compatibility_ignore_auto_increment_in_create_table {#compatibility_ignore_auto_increment_in_create_table} + +タイプ: Bool + +デフォルト値: 0 + +true の場合、カラム宣言の AUTO_INCREMENT キーワードを無視します。そうでなければエラーを返します。これは MySQL からの移行を簡素化します。 + +## compatibility_ignore_collation_in_create_table {#compatibility_ignore_collation_in_create_table} + +タイプ: Bool + +デフォルト値: 1 + +テーブル作成時の照合の互換性を無視します。 + +## compile_aggregate_expressions {#compile_aggregate_expressions} + +タイプ: Bool + +デフォルト値: 1 + +集計関数をネイティブコードに JIT コンパイルすることを有効または無効にします。この設定を有効にすると、パフォーマンスが向上する可能性があります。 + +可能な値: + +- 0 — 集計は JIT コンパイルなしで行われます。 +- 1 — 集計は JIT コンパイルを使用して行われます。 + +**参照** + +- [min_count_to_compile_aggregate_expression](#min_count_to_compile_aggregate_expression) + +## compile_expressions {#compile_expressions} + +タイプ: Bool + +デフォルト値: 0 + +いくつかのスカラー関数と演算子をネイティブコードにコンパイルします。LLVM コンパイラインフラストラクチャのバグにより、AArch64 マシンで nullptr 参照解除を引き起こし、その結果、サーバーがクラッシュすることが知られています。この設定は有効にしないでください。 + +## compile_sort_description {#compile_sort_description} + +タイプ: Bool + +デフォルト値: 1 + +ソート説明をネイティブコードにコンパイルします。 + +## connect_timeout {#connect_timeout} + +タイプ: Seconds + +デフォルト値: 10 + +レプリカがない場合の接続タイムアウト。 + +## connect_timeout_with_failover_ms {#connect_timeout_with_failover_ms} + +タイプ: Milliseconds + +デフォルト値: 1000 + +分散テーブルエンジンにおけるリモートサーバー接続のタイムアウト(ミリ秒)。`shard` および `replica` セクションがクラスター定義に使用されている場合。 +接続に失敗した場合、さまざまなレプリカへの複数の接続試行が行われます。 + +## connect_timeout_with_failover_secure_ms {#connect_timeout_with_failover_secure_ms} + +タイプ: Milliseconds + +デフォルト値: 1000 + +最初の健全なレプリカを選択するための接続タイムアウト(セキュアな接続用)。 + +## connection_pool_max_wait_ms {#connection_pool_max_wait_ms} + +タイプ: Milliseconds + +デフォルト値: 0 + +接続プールが満杯のときに接続を待つ時間(ミリ秒)。 + +可能な値: + +- 正の整数。 +- 0 — 無限タイムアウト。 + +## connections_with_failover_max_tries {#connections_with_failover_max_tries} + +タイプ: UInt64 + +デフォルト値: 3 + +分散テーブルエンジンにおける各レプリカとの接続試行の最大数。 + +## convert_query_to_cnf {#convert_query_to_cnf} + +タイプ: Bool + +デフォルト値: 0 + +`true` に設定すると、`SELECT` クエリが結合標準形(CNF)に変換されます。CNF にクエリを書き換えることで実行が速くなるシナリオがあります(変更の説明についてはこの [Github issue](https://github.com/ClickHouse/ClickHouse/issues/11749) を参照してください)。 + +以下の `SELECT` クエリが変更されないことに注意してください(デフォルト動作): + +```sql +EXPLAIN SYNTAX +SELECT * +FROM +( + SELECT number AS x + FROM numbers(20) +) AS a +WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) +SETTINGS convert_query_to_cnf = false; +``` + +結果は次のようになります: + +```response +┌─explain────────────────────────────────────────────────────────┐ +│ SELECT x │ +│ FROM │ +│ ( │ +│ SELECT number AS x │ +│ FROM numbers(20) │ +│ WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) │ +│ ) AS a │ +│ WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) │ +│ SETTINGS convert_query_to_cnf = 0 │ +└────────────────────────────────────────────────────────────────┘ +``` + +`convert_query_to_cnf` を `true` に設定して、変更を確認しましょう: + +```sql +EXPLAIN SYNTAX +SELECT * +FROM +( + SELECT number AS x + FROM numbers(20) +) AS a +WHERE ((x >= 1) AND (x <= 5)) OR ((x >= 10) AND (x <= 15)) +SETTINGS convert_query_to_cnf = true; +``` + +`WHERE` 句が CNF で書き換えられていることに気づきますが、結果セットは同じです。論理は変更されていません: + +```response +┌─explain───────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ SELECT x │ +│ FROM │ +│ ( │ +│ SELECT number AS x │ +│ FROM numbers(20) │ +│ WHERE ((x <= 15) OR (x <= 5)) AND ((x <= 15) OR (x >= 1)) AND ((x >= 10) OR (x <= 5)) AND ((x >= 10) OR (x >= 1)) │ +│ ) AS a │ +│ WHERE ((x >= 10) OR (x >= 1)) AND ((x >= 10) OR (x <= 5)) AND ((x <= 15) OR (x >= 1)) AND ((x <= 15) OR (x <= 5)) │ +│ SETTINGS convert_query_to_cnf = 1 │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +可能な値: true, false + +## count_distinct_implementation {#count_distinct_implementation} + +タイプ: String + +デフォルト値: uniqExact + +[CATEGORY(DISTINCT ...)](../../sql-reference/aggregate-functions/reference/count.md/#agg_function-count) 構文を実行するために使用する `uniq*` 関数の指定を行います。 + +可能な値: + +- [uniq](../../sql-reference/aggregate-functions/reference/uniq.md/#agg_function-uniq) +- [uniqCombined](../../sql-reference/aggregate-functions/reference/uniqcombined.md/#agg_function-uniqcombined) +- [uniqCombined64](../../sql-reference/aggregate-functions/reference/uniqcombined64.md/#agg_function-uniqcombined64) +- [uniqHLL12](../../sql-reference/aggregate-functions/reference/uniqhll12.md/#agg_function-uniqhll12) +- [uniqExact](../../sql-reference/aggregate-functions/reference/uniqexact.md/#agg_function-uniqexact) + +## count_distinct_optimization {#count_distinct_optimization} + +タイプ: Bool + +デフォルト値: 0 + +distinct のカウントを書き換えてグループ化のサブクエリとします。 + +## create_if_not_exists {#create_if_not_exists} + +タイプ: Bool + +デフォルト値: 0 + +`CREATE` 文でデフォルトで `IF NOT EXISTS` を有効にします。この設定または `IF NOT EXISTS` が指定され、提供された名前のテーブルがすでに存在する場合、例外はスローされません。 + +## create_index_ignore_unique {#create_index_ignore_unique} + +タイプ: Bool + +デフォルト値: 0 + +CREATE UNIQUE INDEX における UNIQUE キーワードを無視します。SQL 互換性のテスト用に作成されました。 + +## create_replicated_merge_tree_fault_injection_probability {#create_replicated_merge_tree_fault_injection_probability} + +タイプ: Float + +デフォルト値: 0 + +メタデータを ZooKeeper に作成した後にテーブルを作成する際の障害挿入の確率。 + +## create_table_empty_primary_key_by_default {#create_table_empty_primary_key_by_default} + +タイプ: Bool + +デフォルト値: 0 + +ORDER BY および PRIMARY KEY が指定されない場合に、*MergeTree テーブルを空の主キーで作成することを許可します。 + +## cross_join_min_bytes_to_compress {#cross_join_min_bytes_to_compress} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +CROSS JOIN で圧縮するためのブロックの最小サイズ。ゼロ値はこのしきい値を無効にします。このブロックは、行またはバイトのいずれかのしきい値に達したときに圧縮されます。 + +## cross_join_min_rows_to_compress {#cross_join_min_rows_to_compress} + +タイプ: UInt64 + +デフォルト値: 10000000 + +CROSS JOIN で圧縮するブロックの最小行数。ゼロ値はこのしきい値を無効にします。このブロックは、行またはバイトのいずれかのしきい値に達したときに圧縮されます。 + +## data_type_default_nullable {#data_type_default_nullable} + +タイプ: Bool + +デフォルト値: 0 + +カラム定義に明示的な修飾子 [NULL または NOT NULL](../../sql-reference/statements/create/table.md/#null-modifiers) がないデータ型が [Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable) であることを許可します。 + +可能な値: + +- 1 — カラム定義のデータ型がデフォルトで `Nullable` に設定されます。 +- 0 — カラム定義のデータ型がデフォルトで `Nullable` ではないように設定されます。 + +## database_atomic_wait_for_drop_and_detach_synchronously {#database_atomic_wait_for_drop_and_detach_synchronously} + +タイプ: Bool + +デフォルト値: 0 + +すべての `DROP` および `DETACH` クエリに `SYNC` 修飾子を追加します。 + +可能な値: + +- 0 — クエリは遅延して実行されます。 +- 1 — クエリは遅延なしで実行されます。 + +## database_replicated_allow_explicit_uuid {#database_replicated_allow_explicit_uuid} + +タイプ: UInt64 + +デフォルト値: 0 + +0 - 複製データベース内のテーブルに対して UUID を明示的に指定することを許可しません。1 - 許可します。2 - 許可しますが、指定された UUID を無視してランダムなものを生成します。 + +## database_replicated_allow_heavy_create {#database_replicated_allow_heavy_create} + +タイプ: Bool + +デフォルト値: 0 + +複製データベースエンジンでの長時間実行される DDL クエリ(CREATE AS SELECT および POPULATE)を許可します。これは DDL キューを長時間ブロックする可能性があります。 + +## database_replicated_allow_only_replicated_engine {#database_replicated_allow_only_replicated_engine} + +タイプ: Bool + +デフォルト値: 0 + +Replicated エンジンのデータベース内でのみ Replicated テーブルを作成することを許可します。 + +## database_replicated_allow_replicated_engine_arguments {#database_replicated_allow_replicated_engine_arguments} + +タイプ: UInt64 + +デフォルト値: 0 + +0 - 複製データベース内の *MergeTree テーブルに対して ZooKeeper パスとレプリカ名を明示的に指定することを許可しません。1 - 許可します。2 - 許可しますが、指定されたパスを無視してデフォルトのものを使用します。3 - 許可し、警告をログに記録しません。 + +## database_replicated_always_detach_permanently {#database_replicated_always_detach_permanently} + +タイプ: Bool + +デフォルト値: 0 + +データベースエンジンが Replicated の場合、DETACH TABLE を DETACH TABLE PERMANENTLY として実行します。 + +## database_replicated_enforce_synchronous_settings {#database_replicated_enforce_synchronous_settings} + +タイプ: Bool + +デフォルト値: 0 + +一部のクエリに対する同期待機を強制します(データベースの原子的な削除と切り離し、mutation_sync、alter_sync も参照)。これらの設定を有効にすることは推奨されません。 + +## database_replicated_initial_query_timeout_sec {#database_replicated_initial_query_timeout_sec} + +タイプ: UInt64 + +デフォルト値: 300 + +初期 DDL クエリが複製データベースにおいて前の DDL キューエントリを処理するのを待つ時間を秒単位で設定します。 + +可能な値: + +- 正の整数。 +- 0 — 無限。 + +## decimal_check_overflow {#decimal_check_overflow} + +タイプ: Bool + +デフォルト値: 1 + +小数の算術/比較操作のオーバーフローをチェックします。 + +## deduplicate_blocks_in_dependent_materialized_views {#deduplicate_blocks_in_dependent_materialized_views} + +タイプ: Bool + +デフォルト値: 0 + +Replicated* テーブルからデータを受け取るマテリアライズドビューに対する重複排除チェックを有効または無効にします。 + +可能な値: + +0 — 無効。 +1 — 有効。 + +使用 + +デフォルトでは、マテリアライズドビューに対する重複排除は行われませんが、ソーステーブルで行われます。 +ソーステーブルで重複排除のために挿入されたブロックがスキップされると、付随的なマテリアライズドビューへの挿入は行われません。この動作は、集約されたデータが異なる INSERT から得られている場合でもマテリアライズドビューに挿入できることを可能にします。 +同時に、この挙動は `INSERT` の冪等性を「破ります」。主テーブルへの `INSERT` が成功し、マテリアライズドビューへの `INSERT` が失敗した場合(例: ClickHouse Keeper との通信に失敗)、クライアントはエラーを受け取り操作を再試行できます。しかし、最初の失敗により失われた行を挿入することは、ソーステーブルの重複排除によって棄却されます。設定 `deduplicate_blocks_in_dependent_materialized_views` は、この動作を変更することを可能にします。再試行時に、マテリアライズドビューは再挿入を受け取り、自身で重複排除チェックを行います。 +ソーステーブルのチェック結果を無視し、最初の失敗により失った行を挿入します。 + +## default_materialized_view_sql_security {#default_materialized_view_sql_security} + +タイプ: SQLSecurityType + +デフォルト値: DEFINER + +マテリアライズドビュー作成時に SQL SECURITY オプションのデフォルト値を設定することを許可します。 [SQL セキュリティの詳細](../../sql-reference/statements/create/view.md#sql_security) + +デフォルト値は `DEFINER` です。 + +## default_max_bytes_in_join {#default_max_bytes_in_join} + +タイプ: UInt64 + +デフォルト値: 1000000000 + +制限が必要な場合、右側のテーブルの最大サイズ。ただし max_bytes_in_join が設定されていない場合。 + +## default_normal_view_sql_security {#default_normal_view_sql_security} + +タイプ: SQLSecurityType + +デフォルト値: INVOKER + +通常のビューを作成する際のデフォルト `SQL SECURITY` オプションを設定することを許可します。 [SQL セキュリティの詳細](../../sql-reference/statements/create/view.md#sql_security)。 + +デフォルト値は `INVOKER` です。 + +## default_table_engine {#default_table_engine} + +タイプ: DefaultTableEngine + +デフォルト値: MergeTree + +`CREATE` 文で `ENGINE` が設定されていない場合のデフォルトテーブルエンジン。 + +可能な値: + +- 有効なテーブルエンジン名を表す文字列。 + +クラウドのデフォルト値: `SharedMergeTree`。 + +**例** + +クエリ: + +```sql +SET default_table_engine = 'Log'; + +SELECT name, value, changed FROM system.settings WHERE name = 'default_table_engine'; +``` + +結果: + +```response +┌─name─────────────────┬─value─┬─changed─┐ +│ default_table_engine │ Log │ 1 │ +└──────────────────────┴───────┴─────────┘ +``` + +この例では、エンジンを指定していない新しいテーブルは、`Log` テーブルエンジンを使用します: + +クエリ: + +```sql +CREATE TABLE my_table ( + x UInt32, + y UInt32 +); + +SHOW CREATE TABLE my_table; +``` + +結果: + +```response +┌─statement────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE default.my_table +( + `x` UInt32, + `y` UInt32 +) +ENGINE = Log +└──────────────────────────────────────────────────────────────────────────┘ +``` + +## default_temporary_table_engine {#default_temporary_table_engine} + +タイプ: DefaultTableEngine + +デフォルト値: Memory + +一時テーブルのための [default_table_engine](#default_table_engine) と同じ。 + +この例では、エンジンを指定していない新しい一時テーブルは、`Log` テーブルエンジンを使用します: + +クエリ: + +```sql +SET default_temporary_table_engine = 'Log'; + +CREATE TEMPORARY TABLE my_table ( + x UInt32, + y UInt32 +); + +SHOW CREATE TEMPORARY TABLE my_table; +``` + +結果: + +```response +┌─statement────────────────────────────────────────────────────────────────┐ +│ CREATE TEMPORARY TABLE default.my_table +( + `x` UInt32, + `y` UInt32 +) +ENGINE = Log +└──────────────────────────────────────────────────────────────────────────┘ +``` + +## default_view_definer {#default_view_definer} + +タイプ: String + +デフォルト値: CURRENT_USER + +ビュー作成時にデフォルト `DEFINER` オプションを設定することを許可します。 [SQL セキュリティの詳細](../../sql-reference/statements/create/view.md#sql_security) + +デフォルト値は `CURRENT_USER` です。 + +## describe_compact_output {#describe_compact_output} + +タイプ: Bool + +デフォルト値: 0 + +true の場合、DESCRIBE クエリの結果に列名と型のみを含めます。 + +## describe_extend_object_types {#describe_extend_object_types} + +タイプ: Bool + +デフォルト値: 0 + +DESCRIBE クエリでオブジェクト型の列の具体的な型を推測します。 + +## describe_include_subcolumns {#describe_include_subcolumns} + +タイプ: Bool + +デフォルト値: 0 + +[DESCRIBE](../../sql-reference/statements/describe-table.md) クエリのためにサブカラムの記述を有効にします。例えば、[Tuple](../../sql-reference/data-types/tuple.md) のメンバーや、[Map](../../sql-reference/data-types/map.md/#map-subcolumns)、[Nullable](../../sql-reference/data-types/nullable.md/#finding-null) または [Array](../../sql-reference/data-types/array.md/#array-size) データ型のサブカラム。 + +可能な値: + +- 0 — サブカラムは `DESCRIBE` クエリに含まれません。 +- 1 — サブカラムは `DESCRIBE` クエリに含まれます。 + +**例** + +[DESCRIBE](../../sql-reference/statements/describe-table.md) ステートメントの例を参照。 + +## describe_include_virtual_columns {#describe_include_virtual_columns} + +タイプ: Bool + +デフォルト値: 0 + +true の場合、DESCRIBE クエリの結果にテーブルの仮想カラムが含まれます。 + +## dialect {#dialect} + +タイプ: Dialect + +デフォルト値: clickhouse + +クエリを解析する際に使用されるダイアレクト。 + +## dictionary_validate_primary_key_type {#dictionary_validate_primary_key_type} + +タイプ: Bool + +デフォルト値: 0 + +Dictionaryのプライマリキータイプを検証します。デフォルトでは、シンプルなレイアウトの場合、id タイプは暗黙的に UInt64 に変換されます。 + +## distinct_overflow_mode {#distinct_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた場合の動作を指定します。 + +## distributed_aggregation_memory_efficient {#distributed_aggregation_memory_efficient} + +タイプ: Bool + +デフォルト値: 1 + +分散集計のメモリ節約モードが有効になっています。 + +## distributed_background_insert_batch {#distributed_background_insert_batch} + +タイプ: Bool + +デフォルト値: 0 + +挿入データのバッチ送信を有効または無効にします。 + +バッチ送信が有効な場合、[Distributed](../../engines/table-engines/special/distributed.md) テーブルエンジンは、挿入データの複数のファイルを1つの操作で送信しようとします。バッチ送信はネットワークおよびサーバーリソースの効率を高め、クラスターのパフォーマンスを向上させます。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 +## distributed_background_insert_max_sleep_time_ms {#distributed_background_insert_max_sleep_time_ms} + +タイプ: ミリ秒 + +デフォルト値: 30000 + +[分散](../../engines/table-engines/special/distributed.md)テーブルエンジンがデータを送信するための最大間隔です。これは、[distributed_background_insert_sleep_time_ms](#distributed_background_insert_sleep_time_ms)設定で設定された間隔の指数的な成長を制限します。 + +可能な値: + +- 正の整数のミリ秒。 + +## distributed_background_insert_sleep_time_ms {#distributed_background_insert_sleep_time_ms} + +タイプ: ミリ秒 + +デフォルト値: 100 + +[分散](../../engines/table-engines/special/distributed.md)テーブルエンジンがデータを送信するための基本間隔です。エラーが発生した場合、実際の間隔は指数的に増加します。 + +可能な値: + +- 正の整数のミリ秒。 + +## distributed_background_insert_split_batch_on_failure {#distributed_background_insert_split_batch_on_failure} + +タイプ: ブール + +デフォルト値: 0 + +失敗時にバッチを分割するかどうかを有効または無効にします。 + +特定のバッチをリモートシャードに送信する際に、`Memory limit exceeded`や類似のエラーによって失敗することがあります。この場合、リトライしても解決しない(このためテーブルの分散送信が停止します)が、そのバッチからのファイルを1つずつ送信してINSERTを成功させることができるかもしれません。 + +したがって、この設定を`1`にすると、そのようなバッチについてバッチ処理を無効にします(すなわち、失敗したバッチのために一時的に`distributed_background_insert_batch`を無効化します)。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 + +:::note +この設定は、異常なサーバー(マシン)の停止と[分散](../../engines/table-engines/special/distributed.md)テーブルエンジンの`fsync_after_insert` / `fsync_directories`がない場合に発生する可能性のある壊れたバッチにも影響します。 +::: + +:::note +自動バッチ分割に依存しない方が良いでしょう。これはパフォーマンスに悪影響を及ぼす可能性があります。 +::: + +## distributed_background_insert_timeout {#distributed_background_insert_timeout} + +タイプ: UInt64 + +デフォルト値: 0 + +分散へのINSERTクエリのタイムアウトです。この設定は、insert_distributed_syncが有効な場合にのみ使用されます。ゼロ値はタイムアウトなしを意味します。 + +## distributed_cache_bypass_connection_pool {#distributed_cache_bypass_connection_pool} + +タイプ: ブール + +デフォルト値: 0 + +ClickHouse Cloudのみ。分散キャッシュ接続プールをバイパスすることを許可します。 + +## distributed_cache_connect_max_tries {#distributed_cache_connect_max_tries} + +タイプ: UInt64 + +デフォルト値: 100 + +ClickHouse Cloudのみ。分散キャッシュへの接続が失敗した場合の接続試行回数です。 + +## distributed_cache_data_packet_ack_window {#distributed_cache_data_packet_ack_window} + +タイプ: UInt64 + +デフォルト値: 5 + +ClickHouse Cloudのみ。単一の分散キャッシュ読み取りリクエストにおけるDataPacketシーケンスのACK送信に対するウィンドウサイズです。 + +## distributed_cache_discard_connection_if_unread_data {#distributed_cache_discard_connection_if_unread_data} + +タイプ: ブール + +デフォルト値: 1 + +ClickHouse Cloudのみ。一部のデータが未読の場合、接続を破棄します。 + +## distributed_cache_fetch_metrics_only_from_current_az {#distributed_cache_fetch_metrics_only_from_current_az} + +タイプ: ブール + +デフォルト値: 1 + +ClickHouse Cloudのみ。system.distributed_cache_metricsやsystem.distributed_cache_eventsから現在のアベイラビリティゾーンのみからメトリクスを取得します。 + +## distributed_cache_log_mode {#distributed_cache_log_mode} + +タイプ: DistributedCacheLogMode + +デフォルト値: on_error + +ClickHouse Cloudのみ。system.distributed_cache_logへの書き込みモードです。 + +## distributed_cache_max_unacked_inflight_packets {#distributed_cache_max_unacked_inflight_packets} + +タイプ: UInt64 + +デフォルト値: 10 + +ClickHouse Cloudのみ。単一の分散キャッシュ読み取りリクエストにおける未確認の飛行中パケットの最大数です。 + +## distributed_cache_pool_behaviour_on_limit {#distributed_cache_pool_behaviour_on_limit} + +タイプ: DistributedCachePoolBehaviourOnLimit + +デフォルト値: allocate_bypassing_pool + +ClickHouse Cloudのみ。プールの制限に達したときの分散キャッシュ接続の動作を特定します。 + +## distributed_cache_read_alignment {#distributed_cache_read_alignment} + +タイプ: UInt64 + +デフォルト値: 0 + +ClickHouse Cloudのみ。テスト目的の設定であり、変更しないでください。 + +## distributed_cache_receive_response_wait_milliseconds {#distributed_cache_receive_response_wait_milliseconds} + +タイプ: UInt64 + +デフォルト値: 60000 + +ClickHouse Cloudのみ。分散キャッシュからリクエストのデータを受信するための待機時間(ミリ秒単位)です。 + +## distributed_cache_receive_timeout_milliseconds {#distributed_cache_receive_timeout_milliseconds} + +タイプ: UInt64 + +デフォルト値: 10000 + +ClickHouse Cloudのみ。分散キャッシュからの応答を受信するための待機時間(ミリ秒単位)です。 + +## distributed_cache_throw_on_error {#distributed_cache_throw_on_error} + +タイプ: ブール + +デフォルト値: 0 + +ClickHouse Cloudのみ。分散キャッシュとの通信中に発生した例外または分散キャッシュから受信した例外を再スローします。そうでない場合は、エラー時に分散キャッシュのスキップにフォールバックします。 + +## distributed_cache_wait_connection_from_pool_milliseconds {#distributed_cache_wait_connection_from_pool_milliseconds} + +タイプ: UInt64 + +デフォルト値: 100 + +ClickHouse Cloudのみ。分散_cache_pool_behaviour_on_limitがwaitの場合に、接続プールから接続を受け取るための待機時間(ミリ秒単位)です。 + +## distributed_connections_pool_size {#distributed_connections_pool_size} + +タイプ: UInt64 + +デフォルト値: 1024 + +分散されたすべてのクエリを単一のDistributedテーブルに対してリモートサーバーとの同時接続の最大数です。クラスタ内のサーバーの数以上の値を設定することをお勧めします。 + +## distributed_ddl_entry_format_version {#distributed_ddl_entry_format_version} + +タイプ: UInt64 + +デフォルト値: 5 + +分散DDL (ON CLUSTER)クエリの互換性バージョンです。 + +## distributed_ddl_output_mode {#distributed_ddl_output_mode} + +タイプ: DistributedDDLOutputMode + +デフォルト値: throw + +分散DDLクエリ結果のフォーマットを設定します。 + +可能な値: + +- `throw` — クエリが終了したすべてのホストに対してクエリ実行ステータスを持つ結果セットを返します。クエリが一部のホストで失敗した場合、最初の例外を再スローします。すべてのホストでクエリがまだ終了していない場合、[distributed_ddl_task_timeout](#distributed_ddl_task_timeout)を超えた場合、`TIMEOUT_EXCEEDED`例外をスローします。 +- `none` — throwに似ていますが、分散DDLクエリは結果セットを返しません。 +- `null_status_on_timeout` — 一部の結果セットの行で実行ステータスとして`NULL`を返します。これは、クエリが対応するホストでまだ終了していない場合、`TIMEOUT_EXCEEDED`をスローするのではなく返します。 +- `never_throw` — `TIMEOUT_EXCEEDED`をスローせず、一部のホストでクエリが失敗した場合も例外を再スローしません。 +- `none_only_active` — `none`に似ていますが、`Replicated`データベースの非アクティブなレプリカを待ちません。注意: このモードでは、クエリが一部のレプリカで実行されないことを特定することはできず、バックグラウンドで実行されます。 +- `null_status_on_timeout_only_active` — `null_status_on_timeout`に似ていますが、`Replicated`データベースの非アクティブなレプリカを待ちません。 +- `throw_only_active` — `throw`に似ていますが、`Replicated`データベースの非アクティブなレプリカを待ちません。 + +クラウドのデフォルト値: `none`。 + +## distributed_ddl_task_timeout {#distributed_ddl_task_timeout} + +タイプ: Int64 + +デフォルト値: 180 + +クラスタ内のすべてのホストからのDDLクエリ応答のタイムアウトを設定します。すべてのホストでDDLリクエストが実行されなかった場合、応答にはタイムアウトエラーが含まれ、リクエストは非同期モードで実行されます。負の値は無限を意味します。 + +可能な値: + +- 正の整数。 +- 0 — 非同期モード。 +- 負の整数 — 無限タイムアウト。 + +## distributed_foreground_insert {#distributed_foreground_insert} + +タイプ: ブール + +デフォルト値: 0 + +[分散](../../engines/table-engines/special/distributed.md/#distributed)テーブルへの同期データ挿入を有効または無効にします。 + +デフォルトでは、`Distributed`テーブルにデータを挿入する際にClickHouseサーバーはバックグラウンドモードでクラスターノードにデータを送信します。`distributed_foreground_insert=1`の場合、データは同期処理され、すべてのデータがすべてのシャードに保存されるまで`INSERT`操作は成功しません(`internal_replication`がtrueの場合、各シャードに少なくとも1つのレプリカが必要です)。 + +可能な値: + +- 0 — データはバックグラウンドモードで挿入されます。 +- 1 — データは同期モードで挿入されます。 + +クラウドのデフォルト値: `1`。 + +**関連項目** + +- [分散テーブルエンジン](../../engines/table-engines/special/distributed.md/#distributed) +- [分散テーブルの管理](../../sql-reference/statements/system.md/#query-language-system-distributed) + +## distributed_group_by_no_merge {#distributed_group_by_no_merge} + +タイプ: UInt64 + +デフォルト値: 0 + +分散クエリ処理のために異なるサーバーからの集計状態をマージしないようにします。異なるシャードに異なるキーがあることが確実な場合に使用できます。 + +可能な値: + +- `0` — 無効(最終クエリ処理はイニシエータノードで行われます)。 +- `1` - 異なるサーバーからの集計状態をマージせずに分散クエリ処理を行います(クエリはシャード上で完全に処理され、イニシエータはデータをリレーします)。これは、異なるシャードに異なるキーがあることが確実な場合に使用できます。 +- `2` - `1`と同じですが、イニシエータの上で`ORDER BY`と`LIMIT`を適用します(クエリがリモートノードで完全に処理される場合には不可能です。例: `distributed_group_by_no_merge=1`)。 + +**例** + +```sql +SELECT * +FROM remote('127.0.0.{2,3}', system.one) +GROUP BY dummy +LIMIT 1 +SETTINGS distributed_group_by_no_merge = 1 +FORMAT PrettyCompactMonoBlock + +┌─dummy─┐ +│ 0 │ +│ 0 │ +└───────┘ +``` + +```sql +SELECT * +FROM remote('127.0.0.{2,3}', system.one) +GROUP BY dummy +LIMIT 1 +SETTINGS distributed_group_by_no_merge = 2 +FORMAT PrettyCompactMonoBlock + +┌─dummy─┐ +│ 0 │ +└───────┘ +``` + +## distributed_insert_skip_read_only_replicas {#distributed_insert_skip_read_only_replicas} + +タイプ: ブール + +デフォルト値: 0 + +DistributedへのINSERTクエリ用に読み取り専用レプリカをスキップすることを有効または無効にします。 + +可能な値: + +- 0 — 通常通りINSERTが行われ、読み取り専用レプリカに送信されると失敗します。 +- 1 — イニシエータはデータをシャードに送信する前に、読み取り専用レプリカをスキップします。 + +## distributed_product_mode {#distributed_product_mode} + +タイプ: DistributedProductMode + +デフォルト値: deny + +[分散サブクエリ](../../sql-reference/operators/in.md)の動作を変更します。 + +ClickHouseは、クエリが分散テーブルの非GLOBALサブクエリを含む場合にこの設定を適用します。 + +制限: + +- INおよびJOINサブクエリにのみ適用されます。 +- FROMセクションが複数のシャードを含む分散テーブルを使用している場合にのみ適用されます。 +- サブクエリが複数のシャードを含む分散テーブルに関係する場合。 +- テーブル値[remote](../../sql-reference/table-functions/remote.md)関数には使用されません。 + +可能な値: + +- `deny` — デフォルト値。これらのタイプのサブクエリの使用を禁止します(「Double-distributed in/JOIN subqueries is denied」例外を返します)。 +- `local` — サブクエリ内のデータベースとテーブルを宛先サーバー(シャード)のローカルテーブルに置き換えます(通常の`IN`/`JOIN`を置き換えます)。 +- `global` — `IN`/`JOIN`クエリを`GLOBAL IN`/`GLOBAL JOIN`に置き換えます。 +- `allow` — これらのタイプのサブクエリの使用を許可します。 + +## distributed_push_down_limit {#distributed_push_down_limit} + +タイプ: UInt64 + +デフォルト値: 1 + +各シャードに別々に[LIMIT](#limit)を適用するかどうかを有効または無効にします。 + +これにより、次のことを回避できます: +- ネットワーク越しに追加の行を送信すること。 +- イニシエータでリミットの後に行を処理すること。 + +21.9バージョンから、少なくとも1つの条件が満たされた場合にのみ`distributed_push_down_limit`がクエリ実行を変更します: +- [distributed_group_by_no_merge](#distributed_group_by_no_merge) > 0。 +- クエリが`GROUP BY`/`DISTINCT`/`LIMIT BY`を持たず、ですが`ORDER BY`/`LIMIT`を持つ。 +- クエリが`ORDER BY`/`LIMIT`を持つ`GROUP BY`/`DISTINCT`/`LIMIT BY`を持ち、且つ: + - [optimize_skip_unused_shards](#optimize-skip-unused-shards)が有効です。 + - [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key)が有効です。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +関連項目: + +- [distributed_group_by_no_merge](#distributed_group_by_no_merge) +- [optimize_skip_unused_shards](#optimize-skip-unused-shards) +- [optimize_distributed_group_by_sharding_key](#optimize-distributed-group-by-sharding-key) + +## distributed_replica_error_cap {#distributed_replica_error_cap} + +タイプ: UInt64 + +デフォルト値: 1000 + +- タイプ: 符号なし整数 +- デフォルト値: 1000 + +各レプリカのエラー数がこの値に制限され、1つのレプリカがあまりにも多くのエラーを蓄積するのを防ぎます。 + +関連項目: + +- [load_balancing](#load_balancing-round_robin) +- [テーブルエンジン分散](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_half_life](#distributed_replica_error_half_life) +- [distributed_replica_max_ignored_errors](#distributed_replica_max_ignored_errors) + +## distributed_replica_error_half_life {#distributed_replica_error_half_life} + +タイプ: 秒 + +デフォルト値: 60 + +- タイプ: 秒 +- デフォルト値: 60秒 + +分散テーブルでのエラーがゼロになる速度を制御します。レプリカがしばらく利用できない場合、5つのエラーを蓄積し、distributed_replica_error_half_lifeが1秒に設定されている場合、最後のエラーの後3秒後にレプリカは正常と見なされます。 + +関連項目: + +- [load_balancing](#load_balancing-round_robin) +- [テーブルエンジン分散](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap](#distributed_replica_error_cap) +- [distributed_replica_max_ignored_errors](#distributed_replica_max_ignored_errors) + +## distributed_replica_max_ignored_errors {#distributed_replica_max_ignored_errors} + +タイプ: UInt64 + +デフォルト値: 0 + +- タイプ: 符号なし整数 +- デフォルト値: 0 + +レプリカを選択する際に無視されるエラーの数(`load_balancing`アルゴリズムに従って)。 + +関連項目: + +- [load_balancing](#load_balancing-round_robin) +- [テーブルエンジン分散](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap](#distributed_replica_error_cap) +- [distributed_replica_error_half_life](#distributed_replica_error_half_life) + +## do_not_merge_across_partitions_select_final {#do_not_merge_across_partitions_select_final} + +タイプ: ブール + +デフォルト値: 0 + +SELECT FINALで1つのパーティション内のみでパーツをマージします。 + +## empty_result_for_aggregation_by_constant_keys_on_empty_set {#empty_result_for_aggregation_by_constant_keys_on_empty_set} + +タイプ: ブール + +デフォルト値: 1 + +空セットに対して定数キーによる集計時、空の結果を返します。 + +## empty_result_for_aggregation_by_empty_set {#empty_result_for_aggregation_by_empty_set} + +タイプ: ブール + +デフォルト値: 0 + +空セットに対してキーなしに集計を行うと、空の結果を返します。 + +## enable_blob_storage_log {#enable_blob_storage_log} + +タイプ: ブール + +デフォルト値: 1 + +blobストレージ操作に関する情報をsystem.blob_storage_logテーブルに書き込みます。 + +## enable_early_constant_folding {#enable_early_constant_folding} + +タイプ: ブール + +デフォルト値: 1 + +関数やサブクエリの結果を分析し、定数が含まれる場合にクエリを書き換えることで、クエリ最適化を有効にします。 + +## enable_extended_results_for_datetime_functions {#enable_extended_results_for_datetime_functions} + +タイプ: ブール + +デフォルト値: 0 + +次の型の結果を返すことを有効または無効にします: +- `Date32`は、[toStartOfYear](../../sql-reference/functions/date-time-functions.md#tostartofyear)、[toStartOfISOYear](../../sql-reference/functions/date-time-functions.md#tostartofisoyear)、[toStartOfQuarter](../../sql-reference/functions/date-time-functions.md#tostartofquarter)、[toStartOfMonth](../../sql-reference/functions/date-time-functions.md#tostartofmonth)、[toLastDayOfMonth](../../sql-reference/functions/date-time-functions.md#tolastdayofmonth)、[toStartOfWeek](../../sql-reference/functions/date-time-functions.md#tostartofweek)、[toLastDayOfWeek](../../sql-reference/functions/date-time-functions.md#tolastdayofweek)、および[toMonday](../../sql-reference/functions/date-time-functions.md#tomonday)の関数に対して拡張された範囲(`Date`型と比較して)。 +- `DateTime64`は、[toStartOfDay](../../sql-reference/functions/date-time-functions.md#tostartofday)、[toStartOfHour](../../sql-reference/functions/date-time-functions.md#tostartofhour)、[toStartOfMinute](../../sql-reference/functions/date-time-functions.md#tostartofminute)、[toStartOfFiveMinutes](../../sql-reference/functions/date-time-functions.md#tostartoffiveminutes)、[toStartOfTenMinutes](../../sql-reference/functions/date-time-functions.md#tostartoftenminutes)、[toStartOfFifteenMinutes](../../sql-reference/functions/date-time-functions.md#tostartoffifteenminutes)、および[timeSlot](../../sql-reference/functions/date-time-functions.md#timeslot)の関数に対して拡張された範囲(`DateTime`型と比較して)。 + +可能な値: + +- 0 — 関数はすべての型の引数に対して`Date`または`DateTime`を返します。 +- 1 — 関数は`Date32`または`DateTime64`引数に対して`Date32`または`DateTime64`を返し、そうでない場合は`Date`または`DateTime`を返します。 + +## enable_filesystem_cache {#enable_filesystem_cache} + +タイプ: ブール + +デフォルト値: 1 + +リモートファイルシステムのキャッシュを使用します。この設定は、ディスクのキャッシュのON/OFFを切り替えるものではありません(ディスク設定で行う必要があります)が、意図した場合に一部のクエリでキャッシュをバイパスできるようにします。 + +## enable_filesystem_cache_log {#enable_filesystem_cache_log} + +タイプ: ブール + +デフォルト値: 0 + +各クエリに対するファイルシステムキャッシュのログを記録することを許可します。 + +## enable_filesystem_cache_on_write_operations {#enable_filesystem_cache_on_write_operations} + +タイプ: ブール + +デフォルト値: 0 + +書き込み操作中にキャッシュに書き込む。実際に機能するためには、この設定もディスク設定に追加される必要があります。 + +## enable_filesystem_read_prefetches_log {#enable_filesystem_read_prefetches_log} + +タイプ: ブール + +デフォルト値: 0 + +クエリ中にsystem.filesystemのprefetch_logにログを記録します。テストまたはデバッグのみに使用することを推奨し、デフォルトでオンにしないことをお勧めします。 + +## enable_global_with_statement {#enable_global_with_statement} + +タイプ: ブール + +デフォルト値: 1 + +UNIONクエリおよびすべてのサブクエリにWITHステートメントを伝播させます。 + +## enable_http_compression {#enable_http_compression} + +タイプ: ブール + +デフォルト値: 0 + +HTTPリクエストに対する応答でのデータ圧縮を有効または無効にします。 + +詳細については、[HTTPインターフェースの説明](../../interfaces/http.md)を参照してください。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## enable_job_stack_trace {#enable_job_stack_trace} + +タイプ: ブール + +デフォルト値: 1 + +ジョブの作成者によるスタックトレースを出力し、ジョブが例外を引き起こした場合。 + +## enable_lightweight_delete {#enable_lightweight_delete} + +タイプ: ブール + +デフォルト値: 1 + +MergeTreeテーブルに対して論理削除を有効にします。 + +## enable_memory_bound_merging_of_aggregation_results {#enable_memory_bound_merging_of_aggregation_results} + +タイプ: ブール + +デフォルト値: 1 + +集計のためのメモリバウンドマージ戦略を有効にします。 + +## enable_multiple_prewhere_read_steps {#enable_multiple_prewhere_read_steps} + +タイプ: ブール + +デフォルト値: 1 + +WHEREからPREWHEREへの条件をより多く移動させ、複数の条件がANDで組み合わされている場合にディスクからの読み取りとフィルタリングを複数のステップで行います。 + +## enable_named_columns_in_function_tuple {#enable_named_columns_in_function_tuple} + +タイプ: ブール + +デフォルト値: 0 + +すべての名前がユニークで、引用なし識別子として扱える場合、function tuple()で名前付きタプルを生成します。 + +## enable_optimize_predicate_expression {#enable_optimize_predicate_expression} + +タイプ: ブール + +デフォルト値: 1 + +`SELECT`クエリでの述語プッシュダウンをオンにします。 + +述語プッシュダウンは、分散クエリでのネットワークトラフィックを大幅に削減する可能性があります。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +使用法 + +次のクエリを考えてみてください: + +1. `SELECT count() FROM test_table WHERE date = '2018-10-10'` +2. `SELECT count() FROM (SELECT * FROM test_table) WHERE date = '2018-10-10'` + +`enable_optimize_predicate_expression = 1`の場合、これらのクエリの実行時間は等しくなります。ClickHouseはサブクエリを処理する際に`WHERE`を適用します。 + +`enable_optimize_predicate_expression = 0`の場合、2番目のクエリの実行時間ははるかに長くなります。なぜなら、サブクエリが終了した後で、`WHERE`句がすべてのデータに適用されるからです。 + +## enable_optimize_predicate_expression_to_final_subquery {#enable_optimize_predicate_expression_to_final_subquery} + +タイプ: ブール + +デフォルト値: 1 + +最終サブクエリに述語のプッシュを許可します。 + +## enable_order_by_all {#enable_order_by_all} + +タイプ: ブール + +デフォルト値: 1 + +`ORDER BY ALL`構文を使用したソートを有効または無効にします。詳細は[ORDER BY](../../sql-reference/statements/select/order-by.md)を参照してください。 + +可能な値: + +- 0 — ORDER BY ALLを無効にします。 +- 1 — ORDER BY ALLを有効にします。 + +**例** + +クエリ: + +```sql +CREATE TABLE TAB(C1 Int, C2 Int, ALL Int) ENGINE=Memory(); + +INSERT INTO TAB VALUES (10, 20, 30), (20, 20, 10), (30, 10, 20); + +SELECT * FROM TAB ORDER BY ALL; -- ALLが曖昧であるというエラーが返されます。 + +SELECT * FROM TAB ORDER BY ALL SETTINGS enable_order_by_all = 0; +``` + +結果: + +```text +┌─C1─┬─C2─┬─ALL─┐ +│ 20 │ 20 │ 10 │ +│ 30 │ 10 │ 20 │ +│ 10 │ 20 │ 30 │ +└────┴─────┴───────┘ +``` + +## enable_parsing_to_custom_serialization {#enable_parsing_to_custom_serialization} + +タイプ: ブール + +デフォルト値: 1 + +真の場合、データはテーブルから得られたシリアル化のヒントに従ってカスタムシリアル化(例:Sparse)を持つ列に直接解析されます。 + +## enable_positional_arguments {#enable_positional_arguments} + +タイプ: ブール + +デフォルト値: 1 + +[GROUP BY](../../sql-reference/statements/select/group-by.md)、[LIMIT BY](../../sql-reference/statements/select/limit-by.md)、[ORDER BY](../../sql-reference/statements/select/order-by.md)ステートメントに対する位置引数をサポートするかどうかを有効または無効にします。 + +可能な値: + +- 0 — 位置引数はサポートされません。 +- 1 — 位置引数がサポートされます: 列番号を列名の代わりに使用できます。 + +**例** + +クエリ: + +```sql +CREATE TABLE positional_arguments(one Int, two Int, three Int) ENGINE=Memory(); + +INSERT INTO positional_arguments VALUES (10, 20, 30), (20, 20, 10), (30, 10, 20); + +SELECT * FROM positional_arguments ORDER BY 2,3; +``` + +結果: + +```text +┌─one─┬─two─┬─three─┐ +│ 30 │ 10 │ 20 │ +│ 20 │ 20 │ 10 │ +│ 10 │ 20 │ 30 │ +└─────┴─────┴───────┘ +``` + +## enable_reads_from_query_cache {#enable_reads_from_query_cache} + +タイプ: ブール + +デフォルト値: 1 + +オンの場合、`SELECT`クエリの結果は[クエリキャッシュ](../query-cache.md)から取得されます。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## enable_s3_requests_logging {#enable_s3_requests_logging} + +タイプ: ブール + +デフォルト値: 0 + +S3リクエストの非常に明示的なログ記録を有効にします。デバッグ専用で意味があります。 + +## enable_scalar_subquery_optimization {#enable_scalar_subquery_optimization} + +タイプ: ブール + +デフォルト値: 1 + +真に設定されている場合、大きなスカラ値のスカラーサブクエリの(非)シリアル化を防止し、同じサブクエリを複数回実行するのを回避できます。 + +## enable_sharing_sets_for_mutations {#enable_sharing_sets_for_mutations} + +タイプ: ブール + +デフォルト値: 1 + +INサブクエリのために構築された共有セットオブジェクトを異なるミューテーションのタスク間で共有できます。これにより、メモリ使用量とCPU消費が削減されます。 + +## enable_software_prefetch_in_aggregation {#enable_software_prefetch_in_aggregation} + +タイプ: ブール + +デフォルト値: 1 + +集計でソフトウェアプリフェッチを使用することを有効にします。 + +## enable_unaligned_array_join {#enable_unaligned_array_join} + +タイプ: ブール + +デフォルト値: 0 + +異なるサイズの複数の配列を使用したARRAY JOINを許可します。この設定が有効な場合、配列は最も長いものにサイズ変更されます。 + +## enable_url_encoding {#enable_url_encoding} + +タイプ: ブール + +デフォルト値: 1 + +[URL](../../engines/table-engines/special/url.md)エンジンのテーブルのURIのパスのデコード/エンコードを有効または無効にします。 + +デフォルトでオンです。 + +## enable_vertical_final {#enable_vertical_final} + +タイプ: ブール + +デフォルト値: 1 + +これを有効にすると、最終的に行をマージするのではなく、削除されたとして行をマークし、後でフィルタリングして重複行を削除します。 + +## enable_writes_to_query_cache {#enable_writes_to_query_cache} + +タイプ: ブール + +デフォルト値: 1 + +オンの場合、`SELECT`クエリの結果は[クエリキャッシュ](../query-cache.md)に格納されます。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## enable_zstd_qat_codec {#enable_zstd_qat_codec} + +タイプ: ブール + +デフォルト値: 0 + +オンの場合、ZSTD_QATコーデックを使用して列を圧縮できます。 + +## enforce_strict_identifier_format {#enforce_strict_identifier_format} + +タイプ: ブール + +デフォルト値: 0 + +有効な場合、英数字とアンダースコアを含む識別子のみを許可します。 + +## engine_file_allow_create_multiple_files {#engine_file_allow_create_multiple_files} + +タイプ: ブール + +デフォルト値: 0 + +ファイルエンジンのテーブルで、フォーマットがサフィックス(`JSON`、`ORC`、`Parquet`など)を持つ場合、各挿入時に新しいファイルを作成することを有効または無効にします。有効な場合、各挿入ごとに次のパターンに従った名前の新しいファイルが作成されます: + +`data.Parquet` -> `data.1.Parquet` -> `data.2.Parquet` など。 + +可能な値: +- 0 — `INSERT`クエリはファイルの末尾に新しいデータを追加します。 +- 1 — `INSERT`クエリは新しいファイルを作成します。 + +## engine_file_empty_if_not_exists {#engine_file_empty_if_not_exists} + +タイプ: ブール + +デフォルト値: 0 + +ファイルのないファイルエンジンテーブルからデータを選択することを許可します。 + +可能な値: +- 0 — `SELECT`は例外をスローします。 +- 1 — `SELECT`は空の結果を返します。 + +## engine_file_skip_empty_files {#engine_file_skip_empty_files} + +タイプ: ブール + +デフォルト値: 0 + +[File](../../engines/table-engines/special/file.md)エンジンのテーブルで空のファイルをスキップすることを有効または無効にします。 + +可能な値: +- 0 — 空のファイルが要求されたフォーマットに適合しない場合、`SELECT`は例外をスローします。 +- 1 — 空のファイルの場合、`SELECT`は空の結果を返します。 + +## engine_file_truncate_on_insert {#engine_file_truncate_on_insert} + +タイプ: ブール + +デフォルト値: 0 + +[File](../../engines/table-engines/special/file.md)エンジンのテーブルで、挿入時に切り捨てを有効または無効にします。 + +可能な値: +- 0 — `INSERT`クエリはファイルの末尾に新しいデータを追加します。 +- 1 — `INSERT`クエリは新しいデータでファイルの既存の内容を置き換えます。 + +## engine_url_skip_empty_files {#engine_url_skip_empty_files} + +タイプ: ブール + +デフォルト値: 0 + +[URL](../../engines/table-engines/special/url.md)エンジンのテーブルで空のファイルをスキップすることを有効または無効にします。 + +可能な値: +- 0 — 空のファイルが要求されたフォーマットに適合しない場合、`SELECT`は例外をスローします。 +- 1 — 空のファイルの場合、`SELECT`は空の結果を返します。 + +## except_default_mode {#except_default_mode} + +タイプ: SetOperationMode + +デフォルト値: ALL + +EXCEPTクエリのデフォルトモードを設定します。可能な値: 空文字列、'ALL'、'DISTINCT'。空の場合、モードなしでクエリが例外をスローします。 + +## external_storage_connect_timeout_sec {#external_storage_connect_timeout_sec} + +タイプ: UInt64 + +デフォルト値: 10 + +接続のタイムアウト(秒単位)。現在はMySQLのみにサポートされています。 + +## external_storage_max_read_bytes {#external_storage_max_read_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +外部エンジンを持つテーブルが履歴データをフラッシュする際の最大バイト数を制限します。これは現在、MySQLテーブルエンジン、データベースエンジン、Dictionary、およびMaterializedMySQLにのみサポートされています。0に等しい場合、この設定は無効になります。 + +## external_storage_max_read_rows {#external_storage_max_read_rows} + +タイプ: UInt64 + +デフォルト値: 0 + +外部エンジンを持つテーブルが履歴データをフラッシュする際の最大行数を制限します。これは現在、MySQLテーブルエンジン、データベースエンジン、Dictionary、およびMaterializedMySQLにのみサポートされています。0に等しい場合、この設定は無効になります。 + +## external_storage_rw_timeout_sec {#external_storage_rw_timeout_sec} + +タイプ: UInt64 + +デフォルト値: 300 + +読み取り/書き込みのタイムアウト(秒単位)。現在はMySQLのみにサポートされています。 + +## external_table_functions_use_nulls {#external_table_functions_use_nulls} + +タイプ: ブール + +デフォルト値: 1 + +[mysql](../../sql-reference/table-functions/mysql.md)、[postgresql](../../sql-reference/table-functions/postgresql.md)、および[odbc](../../sql-reference/table-functions/odbc.md)テーブル関数がNullableカラムを使用する方法を定義します。 + +可能な値: + +- 0 — テーブル関数は明示的にNullableカラムを使用します。 +- 1 — テーブル関数は暗黙的にNullableカラムを使用します。 + +**使用法** + +設定が`0`に設定されている場合、テーブル関数はNullableカラムを作成せず、NULLの代わりにデフォルト値を挿入します。これは配列内のNULL値にも適用されます。 + +## external_table_strict_query {#external_table_strict_query} + +タイプ: ブール + +デフォルト値: 0 + +真に設定されている場合、外部テーブルへのクエリのローカルフィルターへの変換が禁止されます。 + +## extract_key_value_pairs_max_pairs_per_row {#extract_key_value_pairs_max_pairs_per_row} + +タイプ: UInt64 + +デフォルト値: 1000 + +`extractKeyValuePairs`関数で生成できるペアの最大数です。これは、過剰なメモリ消費を防ぐためのセーフガードとして使用されます。 + +## extremes {#extremes} + +タイプ: ブール + +デフォルト値: 0 + +クエリ結果の列の極端な値(最小値および最大値)をカウントするかどうか。0または1を受け入れます。デフォルトは0(無効)です。 +極端な値に関する詳細は、「極端な値」セクションを参照してください。 + +## fallback_to_stale_replicas_for_distributed_queries {#fallback_to_stale_replicas_for_distributed_queries} + +タイプ: ブール + +デフォルト値: 1 + +更新されたデータが利用できない場合、古いレプリカに対してクエリを強制します。[レプリケーション](../../engines/table-engines/mergetree-family/replication.md)を参照してください。 + +ClickHouseは、テーブルの古いレプリカの中から最も関連性の高いものを選択します。 + +これは、レプリケーションされたテーブルを指す分散テーブルからの`SELECT`を実行する際に使用されます。 + +デフォルトでは1(有効)です。 + +## filesystem_cache_enable_background_download_during_fetch {#filesystem_cache_enable_background_download_during_fetch} + +タイプ: ブール + +デフォルト値: 1 +Only in ClickHouse Cloud. ファイルシステムキャッシュにおけるスペース予約のためのキャッシュロック待機時間 + +## filesystem_cache_enable_background_download_for_metadata_files_in_packed_storage {#filesystem_cache_enable_background_download_for_metadata_files_in_packed_storage} + +タイプ: Bool + +デフォルト値: 1 + +Only in ClickHouse Cloud. ファイルシステムキャッシュにおけるスペース予約のためのキャッシュロック待機時間 + +## filesystem_cache_max_download_size {#filesystem_cache_max_download_size} + +タイプ: UInt64 + +デフォルト値: 137438953472 + +単一のクエリでダウンロードできる最大リモートファイルシステムキャッシュサイズ + +## filesystem_cache_name {#filesystem_cache_name} + +タイプ: String + +デフォルト値: + +ステートレステーブルエンジンまたはデータレイクに使用するファイルシステムキャッシュ名 + +## filesystem_cache_reserve_space_wait_lock_timeout_milliseconds {#filesystem_cache_reserve_space_wait_lock_timeout_milliseconds} + +タイプ: UInt64 + +デフォルト値: 1000 + +ファイルシステムキャッシュにおけるスペース予約のためのキャッシュロック待機時間 + +## filesystem_cache_segments_batch_size {#filesystem_cache_segments_batch_size} + +タイプ: UInt64 + +デフォルト値: 20 + +読み取りバッファがキャッシュから要求できる単一バッチのファイルセグメントのサイズ制限。値が低すぎるとキャッシュへのリクエストが過剰になり、高すぎるとキャッシュのエビクションを遅くする可能性がある。 + +## filesystem_prefetch_max_memory_usage {#filesystem_prefetch_max_memory_usage} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +プリフェッチの最大メモリ使用量。 + +## filesystem_prefetch_step_bytes {#filesystem_prefetch_step_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +バイト単位のプリフェッチステップ。ゼロは`auto`を意味し、最適なプリフェッチステップは自動的に推測されるが、100%最良とは限らない。実際の値は、`filesystem_prefetch_min_bytes_for_single_read_task`の設定によって異なる可能性がある。 + +## filesystem_prefetch_step_marks {#filesystem_prefetch_step_marks} + +タイプ: UInt64 + +デフォルト値: 0 + +マーク単位のプリフェッチステップ。ゼロは`auto`を意味し、最適なプリフェッチステップは自動的に推測されるが、100%最良とは限らない。実際の値は、`filesystem_prefetch_min_bytes_for_single_read_task`の設定によって異なる可能性がある。 + +## filesystem_prefetches_limit {#filesystem_prefetches_limit} + +タイプ: UInt64 + +デフォルト値: 200 + +最大プリフェッチ数。ゼロは無制限を意味する。プリフェッチ数を制限したい場合は、`filesystem_prefetches_max_memory_usage`の設定を使用することが推奨される。 + +## final {#final} + +タイプ: Bool + +デフォルト値: 0 + +クエリ内のすべてのテーブルに自動的に[FINAL](../../sql-reference/statements/select/from.md#final-modifier)修飾子を適用し、[FINAL](../../sql-reference/statements/select/from.md#final-modifier)が適用可能なテーブル、結合テーブルおよびサブクエリ内のテーブル、分散テーブルにも適用される。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +例: + +```sql +CREATE TABLE test +( + key Int64, + some String +) +ENGINE = ReplacingMergeTree +ORDER BY key; + +INSERT INTO test FORMAT Values (1, 'first'); +INSERT INTO test FORMAT Values (1, 'second'); + +SELECT * FROM test; +┌─key─┬─some───┐ +│ 1 │ second │ +└─────┴────────┘ +┌─key─┬─some──┐ +│ 1 │ first │ +└─────┴───────┘ + +SELECT * FROM test SETTINGS final = 1; +┌─key─┬─some───┐ +│ 1 │ second │ +└─────┴────────┘ + +SET final = 1; +SELECT * FROM test; +┌─key─┬─some───┐ +│ 1 │ second │ +└─────┴────────┘ +``` + +## flatten_nested {#flatten_nested} + +タイプ: Bool + +デフォルト値: 1 + +[ネスト](../../sql-reference/data-types/nested-data-structures/index.md)カラムのデータ形式を設定します。 + +可能な値: + +- 1 — ネストされたカラムは別々の配列にフラット化される。 +- 0 — ネストされたカラムはタプルの単一配列のままとなる。 + +**使用法** + +設定が`0`に設定されている場合、任意のネストレベルを使用することができます。 + +**例** + +クエリ: + +``` sql +SET flatten_nested = 1; +CREATE TABLE t_nest (`n` Nested(a UInt32, b UInt32)) ENGINE = MergeTree ORDER BY tuple(); + +SHOW CREATE TABLE t_nest; +``` + +結果: + +``` text +┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE default.t_nest +( + `n.a` Array(UInt32), + `n.b` Array(UInt32) +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS index_granularity = 8192 │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SET flatten_nested = 0; + +CREATE TABLE t_nest (`n` Nested(a UInt32, b UInt32)) ENGINE = MergeTree ORDER BY tuple(); + +SHOW CREATE TABLE t_nest; +``` + +結果: + +``` text +┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE default.t_nest +( + `n` Nested(a UInt32, b UInt32) +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS index_granularity = 8192 │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## force_aggregate_partitions_independently {#force_aggregate_partitions_independently} + +タイプ: Bool + +デフォルト値: 0 + +適用可能な場合に最適化の使用を強制しますが、ヒューリスティックの判断により使用されない場合があります。 + +## force_aggregation_in_order {#force_aggregation_in_order} + +タイプ: Bool + +デフォルト値: 0 + +この設定は、サーバー自身が分散クエリをサポートするために使用します。通常の操作を破るため、手動で変更しないでください。(分散集計中にリモートノードで順序での集計の使用を強制します)。 + +## force_data_skipping_indices {#force_data_skipping_indices} + +タイプ: String + +デフォルト値: + +指定されたデータスキッピングインデックスが使用されない場合、クエリの実行を無効にします。 + +以下の例を考えてみてください。 + +```sql +CREATE TABLE data +( + key Int, + d1 Int, + d1_null Nullable(Int), + INDEX d1_idx d1 TYPE minmax GRANULARITY 1, + INDEX d1_null_idx assumeNotNull(d1_null) TYPE minmax GRANULARITY 1 +) +Engine=MergeTree() +ORDER BY key; + +SELECT * FROM data_01515; +SELECT * FROM data_01515 SETTINGS force_data_skipping_indices=''; -- クエリは CANNOT_PARSE_TEXT エラーを生成します。 +SELECT * FROM data_01515 SETTINGS force_data_skipping_indices='d1_idx'; -- クエリは INDEX_NOT_USED エラーを生成します。 +SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='d1_idx'; -- Ok. +SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='`d1_idx`'; -- Ok (完全なパーサの例)。 +SELECT * FROM data_01515 WHERE d1 = 0 SETTINGS force_data_skipping_indices='`d1_idx`, d1_null_idx'; -- d1_null_idx が使用されていないため、クエリは INDEX_NOT_USED エラーを生成します。 +SELECT * FROM data_01515 WHERE d1 = 0 AND assumeNotNull(d1_null) = 0 SETTINGS force_data_skipping_indices='`d1_idx`, d1_null_idx'; -- Ok. +``` + +## force_grouping_standard_compatibility {#force_grouping_standard_compatibility} + +タイプ: Bool + +デフォルト値: 1 + +GROUPING 関数が引数が集約キーとして使用されていない場合に 1 を返すようにします。 + +## force_index_by_date {#force_index_by_date} + +タイプ: Bool + +デフォルト値: 0 + +インデックスが日付によって使用できない場合、クエリの実行を無効にします。 + +MergeTree ファミリーのテーブルで機能します。 + +`force_index_by_date=1`の場合、ClickHouse は、クエリにデータ範囲を制限するために使用できる日付キー条件があるかどうかを確認します。適切な条件がない場合、例外がスローされます。ただし、条件が読み取るデータ量を減少させるかどうかは確認しません。たとえば、条件 `Date != ' 2000-01-01 '` は、テーブル内のすべてのデータに一致する場合でも受け入れられます(つまり、クエリの実行にフルスキャンが必要です)。MergeTree テーブル内のデータ範囲の詳細については、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)を参照してください。 + +## force_optimize_projection {#force_optimize_projection} + +タイプ: Bool + +デフォルト値: 0 + +`SELECT` クエリ内で[プロジェクション](../../engines/table-engines/mergetree-family/mergetree.md/#projections)の必須使用を有効または無効にします。プロジェクション最適化が有効な場合([optimize_use_projections](#optimize_use_projections)設定を参照)。 + +可能な値: + +- 0 — プロジェクション最適化は必須ではありません。 +- 1 — プロジェクション最適化は必須です。 + +## force_optimize_projection_name {#force_optimize_projection_name} + +タイプ: String + +デフォルト値: + +非空の文字列に設定されている場合、このプロジェクションがクエリ内で少なくとも一度使用されていることを確認します。 + +可能な値: + +- 文字列: クエリ内で使用されるプロジェクションの名前 + +## force_optimize_skip_unused_shards {#force_optimize_skip_unused_shards} + +タイプ: UInt64 + +デフォルト値: 0 + +[optimize_skip_unused_shards](#optimize-skip-unused-shards) が有効で、未使用のシャードをスキップできない場合にクエリの実行を有効または無効にします。スキップが不可能で、設定が有効な場合は、例外がスローされます。 + +可能な値: + +- 0 — 無効。ClickHouse は例外をスローしません。 +- 1 — 有効。テーブルにシャーディングキーがある場合のみクエリの実行が無効になります。 +- 2 — 有効。テーブルにシャーディングキーが定義されているかどうかにかかわらず、クエリの実行が無効になります。 + +## force_optimize_skip_unused_shards_nesting {#force_optimize_skip_unused_shards_nesting} + +タイプ: UInt64 + +デフォルト値: 0 + +分散クエリのネストレベルに応じて[`force_optimize_skip_unused_shards`](#force-optimize-skip-unused-shards)を制御します(別の`Distributed`テーブルが別の`Distributed`テーブルを参照している場合)。 + +可能な値: + +- 0 - 無効。`force_optimize_skip_unused_shards`は常に機能します。 +- 1 — 最初のレベルのみに対して`force_optimize_skip_unused_shards`を有効にします。 +- 2 — 第二レベルまで`force_optimize_skip_unused_shards`を有効にします。 + +## force_primary_key {#force_primary_key} + +タイプ: Bool + +デフォルト値: 0 + +プライマリキーによるインデックス作成が不可能な場合、クエリの実行を無効にします。 + +MergeTree ファミリーのテーブルで機能します。 + +`force_primary_key=1`の場合、ClickHouse は、クエリにデータ範囲を制限するために使用できるプライマリキー条件があるかどうかを確認します。適切な条件がない場合は例外がスローされます。ただし、条件が読み取るデータ量を減少させるかどうかは確認しません。MergeTree テーブル内のデータ範囲に関する詳細については、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)を参照してください。 + +## force_remove_data_recursively_on_drop {#force_remove_data_recursively_on_drop} + +タイプ: Bool + +デフォルト値: 0 + +DROP クエリでデータを再帰的に削除します。'Directory not empty' エラーを回避しますが、デタッチされたデータを静かに削除する可能性があります。 + +## formatdatetime_f_prints_single_zero {#formatdatetime_f_prints_single_zero} + +タイプ: Bool + +デフォルト値: 0 + +関数 'formatDateTime()' のフォーマッタ '%f' は、フォーマットされた値に小数秒がない場合、六つのゼロの代わりに一つのゼロを印刷します。 + +## formatdatetime_format_without_leading_zeros {#formatdatetime_format_without_leading_zeros} + +タイプ: Bool + +デフォルト値: 0 + +関数 'formatDateTime()' のフォーマッタ '%c', '%l' および '%k' は、月と時間を先頭ゼロなしで印刷します。 + +## formatdatetime_parsedatetime_m_is_month_name {#formatdatetime_parsedatetime_m_is_month_name} + +タイプ: Bool + +デフォルト値: 1 + +関数 'formatDateTime()' および 'parseDateTime()' のフォーマッタ '%M' は、分の代わりに月名を印刷/解析します。 + +## fsync_metadata {#fsync_metadata} + +タイプ: Bool + +デフォルト値: 1 + +.sql ファイルを書き込む際に[fSync](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html)を有効または無効にします。デフォルトでは有効です。 + +サーバーに数百万の小さなテーブルがあり、それらが絶えず作成されて削除される場合は、無効にする意味があります。 + +## function_implementation {#function_implementation} + +タイプ: String + +デフォルト値: + +特定のターゲットまたはバリアントの関数実装を選択します(エクスペリメンタル)。空の場合はすべて有効になります。 + +## function_json_value_return_type_allow_complex {#function_json_value_return_type_allow_complex} + +タイプ: Bool + +デフォルト値: 0 + +json_value 関数に対して複雑なタイプ(構造体、配列、マップなど)の返却を許可するか制御します。 + +```sql +SELECT JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_value_return_type_allow_complex=true + +┌─JSON_VALUE('{"hello":{"world":"!"}}', '$.hello')─┐ +│ {"world":"!"} │ +└──────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +可能な値: + +- true — 許可。 +- false — 不許可。 + +## function_json_value_return_type_allow_nullable {#function_json_value_return_type_allow_nullable} + +タイプ: Bool + +デフォルト値: 0 + +JSON_VALUE 関数に対して値が存在しない場合に`NULL`を返すことを許可するか制御します。 + +```sql +SELECT JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_return_type_allow_nullable=true; + +┌─JSON_VALUE('{"hello":"world"}', '$.b')─┐ +│ ᴺᵁᴸᴸ │ +└────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +可能な値: + +- true — 許可。 +- false — 不許可。 + +## function_locate_has_mysql_compatible_argument_order {#function_locate_has_mysql_compatible_argument_order} + +タイプ: Bool + +デフォルト値: 1 + +関数[locate](../../sql-reference/functions/string-search-functions.md#locate)の引数の順序を制御します。 + +可能な値: + +- 0 — 関数 `locate` は引数 `(haystack, needle[, start_pos])`を受け入れます。 +- 1 — 関数 `locate` は引数 `(needle, haystack, [, start_pos])`(MySQL互換の動作)を受け入れます。 + +## function_range_max_elements_in_block {#function_range_max_elements_in_block} + +タイプ: UInt64 + +デフォルト値: 500000000 + +関数[range](../../sql-reference/functions/array-functions.md/#range)によって生成されるデータボリュームの安全閾値を設定します。データブロックごとに関数によって生成される値の最大数(ブロック内のすべての行の配列サイズの合計)を定義します。 + +可能な値: + +- 正の整数。 + +**参照も参照** + +- [max_block_size](#setting-max_block_size) +- [min_insert_block_size_rows](#min-insert-block-size-rows) + +## function_sleep_max_microseconds_per_block {#function_sleep_max_microseconds_per_block} + +タイプ: UInt64 + +デフォルト値: 3000000 + +関数 `sleep` が各ブロックごとに許可される最大マイクロ秒数です。ユーザーがそれより大きな値で呼び出した場合、例外がスローされます。これは安全閾値です。 + +## function_visible_width_behavior {#function_visible_width_behavior} + +タイプ: UInt64 + +デフォルト値: 1 + +`visibleWidth` の動作のバージョン。0 - コードポイントの数だけをカウント; 1 - ゼロ幅および組み合わせ文字を正しくカウントし、全角文字を2つとしてカウントし、タブ幅を見積もり、削除文字をカウントします。 + +## geo_distance_returns_float64_on_float64_arguments {#geo_distance_returns_float64_on_float64_arguments} + +タイプ: Bool + +デフォルト値: 1 + +`geoDistance`、`greatCircleDistance`、`greatCircleAngle` 関数の全ての引数が Float64 の場合、Float64 を返し、内部計算で倍精度を使用します。以前の ClickHouse バージョンでは、これらの関数は常に Float32 を返しました。 + +## glob_expansion_max_elements {#glob_expansion_max_elements} + +タイプ: UInt64 + +デフォルト値: 1000 + +許可されている最大アドレス数(外部ストレージ、テーブル関数など)。 + +## grace_hash_join_initial_buckets {#grace_hash_join_initial_buckets} + +タイプ: UInt64 + +デフォルト値: 1 + +グレースハッシュ結合の初期バケット数 + +## grace_hash_join_max_buckets {#grace_hash_join_max_buckets} + +タイプ: UInt64 + +デフォルト値: 1024 + +グレースハッシュ結合のバケット数の制限 + +## group_by_overflow_mode {#group_by_overflow_mode} + +タイプ: OverflowModeGroupBy + +デフォルト値: throw + +制限が超過された場合に何をするか。 + +## group_by_two_level_threshold {#group_by_two_level_threshold} + +タイプ: UInt64 + +デフォルト値: 100000 + +2階層の集計が始まるキーの数から。0 - 閾値が設定されていません。 + +## group_by_two_level_threshold_bytes {#group_by_two_level_threshold_bytes} + +タイプ: UInt64 + +デフォルト値: 50000000 + +集計状態のサイズがバイト単位で、2階層の集計が使用されるようになる最小サイズ。0 - 閾値が設定されていません。いずれかの閾値がトリガーされたときに2階層の集計が使用されます。 + +## group_by_use_nulls {#group_by_use_nulls} + +タイプ: Bool + +デフォルト値: 0 + +[GROUP BY句](/docs/ja/sql-reference/statements/select/group-by.md)が集約キーのタイプを扱う方法を変更します。 +`ROLLUP`、`CUBE`、または `GROUPING SETS` 指定子が使用される場合、いくつかの集約キーは特定の結果行を生成するために使用されない可能性があります。 +これらのキーの列は、この設定に応じて、デフォルト値または `NULL` で相応の行に満たされます。 + +可能な値: + +- 0 — 集約キータイプのデフォルト値が欠落値を生成するために使用されます。 +- 1 — ClickHouse は SQL 標準で述べられている通りに `GROUP BY` を実行します。集約キーのタイプは[Nullable](/docs/ja/sql-reference/data-types/nullable.md/#data_type-nullable)に変換されます。該当する集約キーの列は、使用されなかった行の[NULL](/docs/ja/sql-reference/syntax.md)で満たされます。 + +参照も参照: + +- [GROUP BY句](/docs/ja/sql-reference/statements/select/group-by.md) + +## handshake_timeout_ms {#handshake_timeout_ms} + +タイプ: ミリ秒 + +デフォルト値: 10000 + +ハンドシェイク中にレプリカから Hello パケットを受信するためのタイムアウト(ミリ秒)。 + +## hdfs_create_new_file_on_insert {#hdfs_create_new_file_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +HDFS エンジンテーブルに対する各挿入時に新しいファイルを作成するかどうかを有効または無効にします。有効な場合、各挿入時に次のような名前で新しい HDFS ファイルが作成されます。 + +初期: `data.Parquet.gz` -> `data.1.Parquet.gz` -> `data.2.Parquet.gz` など。 + +可能な値: +- 0 — `INSERT` クエリはファイルの最後に新しいデータを追加します。 +- 1 — `INSERT` クエリは新しいファイルを作成します。 + +## hdfs_ignore_file_doesnt_exist {#hdfs_ignore_file_doesnt_exist} + +タイプ: Bool + +デフォルト値: 0 + +特定のキーを読み取る際にファイルが存在しない場合にその不在を無視します。 + +可能な値: +- 1 — `SELECT` は空の結果を返します。 +- 0 — `SELECT` は例外をスローします。 + +## hdfs_replication {#hdfs_replication} + +タイプ: UInt64 + +デフォルト値: 0 + +hdfs ファイルが作成される際に指定できる実際のレプリケーション数。 + +## hdfs_skip_empty_files {#hdfs_skip_empty_files} + +タイプ: Bool + +デフォルト値: 0 + +[HDFS](../../engines/table-engines/integrations/hdfs.md) エンジンテーブルで空のファイルをスキップするかどうかを有効または無効にします。 + +可能な値: +- 0 — 空のファイルがリクエストされたフォーマットと互換性がない場合、`SELECT` は例外をスローします。 +- 1 — 空のファイルに対する`SELECT` は空の結果を返します。 + +## hdfs_throw_on_zero_files_match {#hdfs_throw_on_zero_files_match} + +タイプ: Bool + +デフォルト値: 0 + +グロブ展開規則に従って一致するゼロファイルがある場合にエラーをスローします。 + +可能な値: +- 1 — `SELECT` は例外をスローします。 +- 0 — `SELECT` は空の結果を返します。 + +## hdfs_truncate_on_insert {#hdfs_truncate_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +hdfs エンジンテーブルでの挿入前に切り詰めを有効または無効にします。無効の場合、HDFS にファイルが既に存在する場合に挿入を試みると例外がスローされます。 + +可能な値: +- 0 — `INSERT` クエリはファイルの最後に新しいデータを追加します。 +- 1 — `INSERT` クエリは既存のファイルの内容を新しいデータで置き換えます。 + +## hedged_connection_timeout_ms {#hedged_connection_timeout_ms} + +タイプ: ミリ秒 + +デフォルト値: 50 + +ヘッジ要求のためにレプリカとの接続を確立する際の接続タイムアウト。 + +## hnsw_candidate_list_size_for_search {#hnsw_candidate_list_size_for_search} + +タイプ: UInt64 + +デフォルト値: 256 + +ベクトル類似性インデックスを探索する際の動的候補リストのサイズ、別名 'ef_search'。 + +## hsts_max_age {#hsts_max_age} + +タイプ: UInt64 + +デフォルト値: 0 + +HSTS の有効期限。0 は HSTS を無効にします。 + +## http_connection_timeout {#http_connection_timeout} + +タイプ: 秒 + +デフォルト値: 1 + +HTTP 接続タイムアウト(秒単位)。 + +可能な値: + +- 任意の正の整数。 +- 0 - 無効(無限のタイムアウト)。 + +## http_headers_progress_interval_ms {#http_headers_progress_interval_ms} + +タイプ: UInt64 + +デフォルト値: 100 + +指定された間隔ごとに、X-ClickHouse-Progress HTTP ヘッダーをそれ以上送信しない。 + +## http_make_head_request {#http_make_head_request} + +タイプ: Bool + +デフォルト値: 1 + +`http_make_head_request` 設定は、HTTP からデータを読み取る際にファイルのサイズなどの情報を取得するために `HEAD` リクエストを実行できるようにします。有効になっているため、`HEAD` リクエストをサポートしないサーバーではこの設定を無効にすることが望ましい場合があります。 + +## http_max_field_name_size {#http_max_field_name_size} + +タイプ: UInt64 + +デフォルト値: 131072 + +HTTP ヘッダー内のフィールド名の最大長 + +## http_max_field_value_size {#http_max_field_value_size} + +タイプ: UInt64 + +デフォルト値: 131072 + +HTTP ヘッダー内のフィールド値の最大長 + +## http_max_fields {#http_max_fields} + +タイプ: UInt64 + +デフォルト値: 1000000 + +HTTP ヘッダー内のフィールドの最大数 + +## http_max_multipart_form_data_size {#http_max_multipart_form_data_size} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +multipart/form-data コンテンツのサイズの制限。この設定は URL パラメータから解析することはできず、ユーザープロファイルに設定する必要があります。コンテンツは、クエリの実行が開始される前にメモリ内で解析され、外部テーブルが作成されます。そして、これはその段階に影響を与える唯一の制限です(最大メモリ使用量と最大実行時間に関する制限は、HTTP フォームデータの読み取り中には影響がありません)。 + +## http_max_request_param_data_size {#http_max_request_param_data_size} + +タイプ: UInt64 + +デフォルト値: 10485760 + +事前定義された HTTP リクエストでクエリパラメータとして使用されるリクエストデータのサイズの制限。 + +## http_max_tries {#http_max_tries} + +タイプ: UInt64 + +デフォルト値: 10 + +HTTP 経由で読み込む最大試行回数。 + +## http_max_uri_size {#http_max_uri_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +HTTP リクエストの最大 URI 長を設定します。 + +可能な値: + +- 正の整数。 + +## http_native_compression_disable_checksumming_on_decompress {#http_native_compression_disable_checksumming_on_decompress} + +タイプ: Bool + +デフォルト値: 0 + +クライアントからの HTTP POST データを解凍する際のチェックサム検証を有効または無効にします。 ClickHouse 独自の圧縮フォーマットにのみ使用されます(`gzip` や `deflate` には使用されません)。 + +詳細については、[HTTP インターフェースの説明](../../interfaces/http.md)を読んでください。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## http_receive_timeout {#http_receive_timeout} + +タイプ: 秒 + +デフォルト値: 30 + +HTTP 受信タイムアウト(秒単位)。 + +可能な値: + +- 任意の正の整数。 +- 0 - 無効(無限のタイムアウト)。 + +## http_response_buffer_size {#http_response_buffer_size} + +タイプ: UInt64 + +デフォルト値: 0 + +HTTP レスポンスをクライアントに送信する前にサーバーメモリ内でバッファリングするバイト数(http_wait_end_of_queryが有効な場合のディスクへのフラッシュも含む)。 + +## http_retry_initial_backoff_ms {#http_retry_initial_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 100 + +HTTP 経由で読み込む際のバックオフ初期最小マイクロ秒数。 + +## http_retry_max_backoff_ms {#http_retry_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 10000 + +HTTP 経由で読み込む際のバックオフ最大マイクロ秒数。 + +## http_send_timeout {#http_send_timeout} + +タイプ: 秒 + +デフォルト値: 30 + +HTTP 送信タイムアウト(秒単位)。 + +可能な値: + +- 任意の正の整数。 +- 0 - 無効(無限のタイムアウト)。 + +:::note +これはデフォルトプロファイルにのみ適用されます。変更を有効にするには、サーバーの再起動が必要です。 +::: + +## http_skip_not_found_url_for_globs {#http_skip_not_found_url_for_globs} + +タイプ: Bool + +デフォルト値: 1 + +HTTP_NOT_FOUND エラーを伴うグローブ用の URL をスキップします。 + +## http_wait_end_of_query {#http_wait_end_of_query} + +タイプ: Bool + +デフォルト値: 0 + +サーバー側での HTTP レスポンスバッファリングを有効にします。 + +## http_write_exception_in_output_format {#http_write_exception_in_output_format} + +タイプ: Bool + +デフォルト値: 1 + +有効な出力を生成するために、出力形式に例外を書き込みます。JSON および XML 形式で動作します。 + +## http_zlib_compression_level {#http_zlib_compression_level} + +タイプ: Int64 + +デフォルト値: 3 + +[enable_http_compression = 1](#enable_http_compression) の場合、HTTP リクエストへの応答でデータ圧縮のレベルを設定します。 + +可能な値: 1 から 9 の数値。 + +## iceberg_engine_ignore_schema_evolution {#iceberg_engine_ignore_schema_evolution} + +タイプ: Bool + +デフォルト値: 0 + +Iceberg テーブルエンジンでスキーマの進化を無視し、テーブル作成時に指定されたスキーマまたはメタデータから解析された最新スキーマを使用してすべてのデータを読み取ることを許可します。 + +:::note +この設定を有効にすると、進化したスキーマのすべてのデータファイルが同じスキーマを使用して読み込まれるため、誤った結果につながる場合があります。 +::: + +## idle_connection_timeout {#idle_connection_timeout} + +タイプ: UInt64 + +デフォルト値: 3600 + +指定された秒数後にアイドル TCP 接続を閉じるタイムアウト。 + +可能な値: + +- 正の整数(0 - すぐに閉じる、0秒後)。 + +## ignore_cold_parts_seconds {#ignore_cold_parts_seconds} + +タイプ: Int64 + +デフォルト値: 0 + +Only in ClickHouse Cloud. プリウォームされるまで(see cache_populated_by_fetch)またはこの秒数古くなるまで、SELECT クエリから新しいデータパーツを除外します。Replicated-/SharedMergeTree のみ。 + +## ignore_data_skipping_indices {#ignore_data_skipping_indices} + +タイプ: String + +デフォルト値: + +クエリで使用されている場合に指定されたスキッピングインデックスを無視します。 + +以下の例を考えてみてください。 + +```sql +CREATE TABLE data +( + key Int, + x Int, + y Int, + INDEX x_idx x TYPE minmax GRANULARITY 1, + INDEX y_idx y TYPE minmax GRANULARITY 1, + INDEX xy_idx (x,y) TYPE minmax GRANULARITY 1 +) +Engine=MergeTree() +ORDER BY key; + +INSERT INTO data VALUES (1, 2, 3); + +SELECT * FROM data; +SELECT * FROM data SETTINGS ignore_data_skipping_indices=''; -- クエリは CANNOT_PARSE_TEXT エラーを生成します。 +SELECT * FROM data SETTINGS ignore_data_skipping_indices='x_idx'; -- Ok. +SELECT * FROM data SETTINGS ignore_data_skipping_indices='na_idx'; -- Ok。 + +SELECT * FROM data WHERE x = 1 AND y = 1 SETTINGS ignore_data_skipping_indices='xy_idx',force_data_skipping_indices='xy_idx' ; -- クエリは INDEX_NOT_USED エラーを生成します。なぜなら xy_idx が明示的に無視されているからです。 +SELECT * FROM data WHERE x = 1 AND y = 2 SETTINGS ignore_data_skipping_indices='xy_idx'; +``` + +無視せずにインデックスを使用していないクエリ: +```sql +EXPLAIN indexes = 1 SELECT * FROM data WHERE x = 1 AND y = 2; + +Expression ((Projection + Before ORDER BY)) + Filter (WHERE) + ReadFromMergeTree (default.data) + Indexes: + PrimaryKey + Condition: true + Parts: 1/1 + Granules: 1/1 + Skip + Name: x_idx + Description: minmax GRANULARITY 1 + Parts: 0/1 + Granules: 0/1 + Skip + Name: y_idx + Description: minmax GRANULARITY 1 + Parts: 0/0 + Granules: 0/0 + Skip + Name: xy_idx + Description: minmax GRANULARITY 1 + Parts: 0/0 + Granules: 0/0 +``` + +`xy_idx` インデックスを無視: +```sql +EXPLAIN indexes = 1 SELECT * FROM data WHERE x = 1 AND y = 2 SETTINGS ignore_data_skipping_indices='xy_idx'; + +Expression ((Projection + Before ORDER BY)) + Filter (WHERE) + ReadFromMergeTree (default.data) + Indexes: + PrimaryKey + Condition: true + Parts: 1/1 + Granules: 1/1 + Skip + Name: x_idx + Description: minmax GRANULARITY 1 + Parts: 0/1 + Granules: 0/1 + Skip + Name: y_idx + Description: minmax GRANULARITY 1 + Parts: 0/0 + Granules: 0/0 +``` + +MergeTree ファミリーのテーブルで機能します。 + +## ignore_drop_queries_probability {#ignore_drop_queries_probability} + +タイプ: Float + +デフォルト値: 0 + +有効な場合、サーバーは指定された確率ですべての DROP テーブルクエリを無視します(Memory および JOIN エンジンの場合、DROP を TRUNCATE に置き換えます)。テスト目的で使用されます。 + +## ignore_materialized_views_with_dropped_target_table {#ignore_materialized_views_with_dropped_target_table} + +タイプ: Bool + +デフォルト値: 0 + +ビューへのプッシュ中にターゲットテーブルが削除された状態のMVを無視します。 + +## ignore_on_cluster_for_replicated_access_entities_queries {#ignore_on_cluster_for_replicated_access_entities_queries} + +タイプ: Bool + +デフォルト値: 0 + +レプリケートアクセスエンティティ管理クエリのための ON CLUSTER 句を無視します。 + +## ignore_on_cluster_for_replicated_named_collections_queries {#ignore_on_cluster_for_replicated_named_collections_queries} + +タイプ: Bool + +デフォルト値: 0 + +レプリケートされた名前付きコレクション管理クエリのための ON CLUSTER 句を無視します。 + +## ignore_on_cluster_for_replicated_udf_queries {#ignore_on_cluster_for_replicated_udf_queries} + +タイプ: Bool + +デフォルト値: 0 + +レプリケーションされた UDF 管理クエリのための ON CLUSTER 句を無視します。 + +## implicit_select {#implicit_select} + +タイプ: Bool + +デフォルト値: 0 + +先頭の SELECT キーワードなしに単純な SELECT クエリを書くことを許可し、それにより電卓スタイルの使用が簡単になります。例: `1 + 2` が有効なクエリになります。 + +`clickhouse-local` ではデフォルトで有効であり、明示的に無効にすることができます。 + +## implicit_transaction {#implicit_transaction} + +タイプ: Bool + +デフォルト値: 0 + +有効にされていて、すでにトランザクション内でない場合、クエリ全体をトランザクション内にラップします(開始 + コミットまたはロールバック)。 + +## input_format_parallel_parsing {#input_format_parallel_parsing} + +タイプ: Bool + +デフォルト値: 1 + +データフォーマットの順序を保持する並列解析を有効または無効にします。サポートされているのは [TSV](../../interfaces/formats.md/#tabseparated)、[TSKV](../../interfaces/formats.md/#tskv)、[CSV](../../interfaces/formats.md/#csv)、および [JSONEachRow](../../interfaces/formats.md/#jsoneachrow) 形式だけです。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 + +## insert_allow_materialized_columns {#insert_allow_materialized_columns} + +タイプ: Bool + +デフォルト値: 0 + +設定が有効な場合、INSERT にマテリアライズドカラムを許可します。 + +## insert_deduplicate {#insert_deduplicate} + +タイプ: Bool + +デフォルト値: 1 + +`INSERT` のブロック重複(Replicated* テーブル用)を有効または無効にします。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 +デフォルトでは、`INSERT`ステートメントによってレプリケートされたテーブルに挿入されたブロックは重複排除されます([データレプリケーション](../../engines/table-engines/mergetree-family/replication.md)を参照してください)。レプリケートされたテーブルでは、デフォルトで各パーティションの最近の100ブロックのみが重複排除されます([replicated_deduplication_window](merge-tree-settings.md/#replicated-deduplication-window)、[replicated_deduplication_window_seconds](merge-tree-settings.md/#replicated-deduplication-window-seconds)を参照してください)。レプリケートされていないテーブルについては、[non_replicated_deduplication_window](merge-tree-settings.md/#non-replicated-deduplication-window)を参照してください。 + +## insert_deduplication_token {#insert_deduplication_token} + +タイプ: 文字列 + +デフォルト値: + +この設定により、ユーザーはMergeTree/ReplicatedMergeTreeにおける独自の重複排除セマンティクスを提供できます。たとえば、各INSERTステートメントで設定のユニークな値を提供することにより、ユーザーは同じデータが重複排除されるのを回避できます。 + +可能な値: + +- 任意の文字列 + +`insert_deduplication_token`は空でない場合にのみ重複排除に使用されます。 + +レプリケートされたテーブルでは、デフォルトで各パーティションの最近の挿入のうち100のみが重複排除されます([replicated_deduplication_window](merge-tree-settings.md/#replicated-deduplication-window)、[replicated_deduplication_window_seconds](merge-tree-settings.md/#replicated-deduplication-window-seconds)を参照してください)。レプリケートされていないテーブルについては、[non_replicated_deduplication_window](merge-tree-settings.md/#non-replicated-deduplication-window)を参照してください。 + +:::note +`insert_deduplication_token`はパーティションレベルで機能します(`insert_deduplication`チェックサムと同様)。複数のパーティションは同じ`insert_deduplication_token`を持つことができます。 +::: + +例: + +```sql +CREATE TABLE test_table +( A Int64 ) +ENGINE = MergeTree +ORDER BY A +SETTINGS non_replicated_deduplication_window = 100; + +INSERT INTO test_table SETTINGS insert_deduplication_token = 'test' VALUES (1); + +-- 次の挿入は、insert_deduplication_tokenが異なるため、重複排除されません +INSERT INTO test_table SETTINGS insert_deduplication_token = 'test1' VALUES (1); + +-- 次の挿入は、insert_deduplication_tokenが以前のものの1つと同じであるため、重複排除されます +INSERT INTO test_table SETTINGS insert_deduplication_token = 'test' VALUES (2); + +SELECT * FROM test_table + +┌─A─┐ +│ 1 │ +└───┘ +┌─A─┐ +│ 1 │ +└───┘ +``` + +## insert_keeper_fault_injection_probability {#insert_keeper_fault_injection_probability} + +タイプ: Float + +デフォルト値: 0 + +挿入中のkeeperリクエストの失敗確率の概算。有效な値は[0.0f, 1.0f]の範囲です。 + +## insert_keeper_fault_injection_seed {#insert_keeper_fault_injection_seed} + +タイプ: UInt64 + +デフォルト値: 0 + +0 - ランダムシード、それ以外は設定値。 + +## insert_keeper_max_retries {#insert_keeper_max_retries} + +タイプ: UInt64 + +デフォルト値: 20 + +この設定は、レプリケートされたMergeTreeへの挿入中にClickHouse Keeper(またはZooKeeper)リクエストの最大再試行回数を設定します。ネットワークエラー、Keeperセッションタイムアウト、またはリクエストタイムアウトによって失敗したKeeperリクエストのみが再試行の対象とされます。 + +可能な値: + +- 正の整数。 +- 0 — 再試行は無効 + +クラウドのデフォルト値: `20`。 + +Keeperリクエストの再試行は、あるタイムアウトの後に行われます。タイムアウトは次の設定によって制御されます: `insert_keeper_retry_initial_backoff_ms`, `insert_keeper_retry_max_backoff_ms`。最初の再試行は`insert_keeper_retry_initial_backoff_ms`のタイムアウト後に行われます。その後のタイムアウトは次のように計算されます: +``` +timeout = min(insert_keeper_retry_max_backoff_ms, latest_timeout * 2) +``` + +例えば、`insert_keeper_retry_initial_backoff_ms=100`、`insert_keeper_retry_max_backoff_ms=10000`、および`insert_keeper_max_retries=8`の場合、タイムアウトは`100, 200, 400, 800, 1600, 3200, 6400, 10000`になります。 + +障害耐性の他に、再試行はより良いユーザーエクスペリエンスを提供する目的もあります - 例えば、Keeperが再起動中(アップグレードによる)にINSERT実行中にエラーを返さずに済むようにします。 + +## insert_keeper_retry_initial_backoff_ms {#insert_keeper_retry_initial_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 100 + +INSERTクエリ実行中に失敗したKeeperリクエストを再試行するための初期タイムアウト(ミリ秒)。 + +可能な値: + +- 正の整数。 +- 0 — タイムアウトなし。 + +## insert_keeper_retry_max_backoff_ms {#insert_keeper_retry_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 10000 + +INSERTクエリ実行中に失敗したKeeperリクエストを再試行するための最大タイムアウト(ミリ秒)。 + +可能な値: + +- 正の整数。 +- 0 — 最大タイムアウトは無制限。 + +## insert_null_as_default {#insert_null_as_default} + +タイプ: Bool + +デフォルト値: 1 + +[NULL](../../sql-reference/syntax.md/#null-literal)の代わりに、[デフォルト値](../../sql-reference/statements/create/table.md/#create-default-values)を挿入するかどうかを有効または無効にします。NULLでないデータ型のカラムに対しては、カラムタイプがNULLでない場合、この設定が無効のときに`NULL`を挿入すると例外が発生します。カラムタイプがNULL可能な場合、`NULL`値はこの設定に関係なくそのまま挿入されます。 + +この設定は[INSERT ... SELECT](../../sql-reference/statements/insert-into.md/#inserting-the-results-of-select)クエリに適用されます。`SELECT`サブクエリは`UNION ALL`句で連結可能であることに注意してください。 + +可能な値: + +- 0 — NULLをNULLでないカラムに挿入すると例外が発生します。 +- 1 — NULLの代わりにデフォルトカラム値が挿入されます。 + +## insert_quorum {#insert_quorum} + +タイプ: UInt64Auto + +デフォルト値: 0 + +:::note +この設定はSharedMergeTreeには適用されません。詳しくは[SharedMergeTreeの整合性](/docs/ja/cloud/reference/shared-merge-tree/#consistency)を参照してください。 +::: + +クォーラム書き込みを有効にします。 + +- `insert_quorum < 2`の場合、クォーラム書き込みは無効です。 +- `insert_quorum >= 2`の場合、クォーラム書き込みは有効です。 +- `insert_quorum = 'auto'`の場合、過半数の数(`number_of_replicas / 2 + 1`)をクォーラム数として使用します。 + +クォーラム書き込み + +`INSERT`は、ClickHouseが`insert_quorum_timeout`の間に`insert_quorum`のレプリカにデータを書き込むことに成功した場合にのみ成功します。何らかの理由で成功した書き込みのレプリカ数が`insert_quorum`に達しない場合、書き込みは失敗と見なされ、ClickHouseはすでに書き込まれたレプリカから挿入されたブロックを削除します。 + +`insert_quorum_parallel`が無効の場合、クォーラム内のすべてのレプリカは一貫性があります。つまり、すべての以前の`INSERT`クエリのデータを含んでいます(`INSERT`シーケンスは線形化されます)。`insert_quorum`および`insert_quorum_parallel`を使用して書き込まれたデータを読み取る際には、[select_sequential_consistency](#select_sequential_consistency)を使用して`SELECT`クエリの順次整合性を有効にすることができます。 + +ClickHouseは次の場合に例外を生成します: + +- クエリの時点での利用可能なレプリカの数が`insert_quorum`未満の場合。 +- `insert_quorum_parallel`が無効であり、前のブロックが`insert_quorum`のレプリカにまだ挿入されていないときにデータを書き込もうとした場合。この状況は、ユーザーが以前の`insert_quorum`の`INSERT`クエリが完了する前に同じテーブルに別の`INSERT`クエリを実行しようとした場合に発生することがあります。 + +その他の情報は以下を参照してください: + +- [insert_quorum_timeout](#insert_quorum_timeout) +- [insert_quorum_parallel](#insert_quorum_parallel) +- [select_sequential_consistency](#select_sequential_consistency) + +## insert_quorum_parallel {#insert_quorum_parallel} + +タイプ: Bool + +デフォルト値: 1 + +:::note +この設定はSharedMergeTreeには適用されません。詳しくは[SharedMergeTreeの整合性](/docs/ja/cloud/reference/shared-merge-tree/#consistency)を参照してください。 +::: + +クォーラム`INSERT`クエリに対して並列性を有効または無効にします。これが有効な場合、前のクエリがまだ終了していない間に追加の`INSERT`クエリを送信できます。無効にした場合、同じテーブルに対する追加の書き込みは拒否されます。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +その他の情報は以下を参照してください: + +- [insert_quorum](#insert_quorum) +- [insert_quorum_timeout](#insert_quorum_timeout) +- [select_sequential_consistency](#select_sequential_consistency) + +## insert_quorum_timeout {#insert_quorum_timeout} + +タイプ: ミリ秒 + +デフォルト値: 600000 + +クォーラムへの書き込みタイムアウト(ミリ秒)。タイムアウトが経過し、まだ書き込みが行われていない場合、ClickHouseは例外を生成し、クライアントは同じブロックを同じまたは他のレプリカに書き込むためにクエリを再試行する必要があります。 + +その他の情報は以下を参照してください: + +- [insert_quorum](#insert_quorum) +- [insert_quorum_parallel](#insert_quorum_parallel) +- [select_sequential_consistency](#select_sequential_consistency) + +## insert_shard_id {#insert_shard_id} + +タイプ: UInt64 + +デフォルト値: 0 + +`0`でない場合、データが同期的に挿入される[分散テーブル](../../engines/table-engines/special/distributed.md/#distributed)のシャードを指定します。 + +`insert_shard_id`の値が無効な場合、サーバーは例外を投げます。 + +`requested_cluster`のシャード数を取得するには、サーバーの設定を確認するか、次のクエリを使用できます: + +``` sql +SELECT uniq(shard_num) FROM system.clusters WHERE cluster = 'requested_cluster'; +``` + +可能な値: + +- 0 — 無効。 +- 対応する[分散テーブル](../../engines/table-engines/special/distributed.md/#distributed)の`1`から`shards_num`の任意の数。 + +**例** + +クエリ: + +```sql +CREATE TABLE x AS system.numbers ENGINE = MergeTree ORDER BY number; +CREATE TABLE x_dist AS x ENGINE = Distributed('test_cluster_two_shards_localhost', currentDatabase(), x); +INSERT INTO x_dist SELECT * FROM numbers(5) SETTINGS insert_shard_id = 1; +SELECT * FROM x_dist ORDER BY number ASC; +``` + +結果: + +``` text +┌─number─┐ +│ 0 │ +│ 0 │ +│ 1 │ +│ 1 │ +│ 2 │ +│ 2 │ +│ 3 │ +│ 3 │ +│ 4 │ +│ 4 │ +└────────┘ +``` + +## interactive_delay {#interactive_delay} + +タイプ: UInt64 + +デフォルト値: 100000 + +リクエストの実行がキャンセルされたかどうかをチェックし、進捗を送信するためのマイクロ秒単位の間隔。 + +## intersect_default_mode {#intersect_default_mode} + +タイプ: SetOperationMode + +デフォルト値: ALL + +INTERSECTクエリのデフォルトモードを設定します。可能な値: 空の文字列、'ALL'、'DISTINCT'。空の場合、モードなしでのクエリは例外をスローします。 + +## join_algorithm {#join_algorithm} + +タイプ: JoinAlgorithm + +デフォルト値: default + +使用される[JOIN](../../sql-reference/statements/select/join.md)アルゴリズムを指定します。 + +複数のアルゴリズムを指定でき、適切なものが特定のクエリの種類/厳密性およびテーブルエンジンに基づいて選択されます。 + +可能な値: + +- default + + これは、可能であれば`hash`または`direct`の同等です(`direct,hash`と同じ)。 + +- grace_hash + + [Grace hash join](https://en.wikipedia.org/wiki/Hash_join#Grace_hash_join)が使用されます。Grace hashは、メモリの使用を制限しながらパフォーマンスの良い複雑な結合を提供するアルゴリズムオプションを提供します。 + + grace joinの最初のフェーズでは、右側のテーブルを読み取り、それをキー列のハッシュ値に基づいてNバケットに分割します(最初はNは`grace_hash_join_initial_buckets`です)。各バケットが独立して処理できることを保証する方法でこれが行われます。最初のバケットの行はメモリ内ハッシュテーブルに追加され、他の行はディスクに保存されます。ハッシュテーブルがメモリ制限を超えた場合(例: [`max_bytes_in_join`](/docs/ja/operations/settings/query-complexity.md/#max_bytes_in_join)で設定されたもの)、バケットの数が増加し、各行の割り当てバケットも増えます。現在のバケットに属さない行はフラッシュされ、再割り当てされます。 + + `INNER/LEFT/RIGHT/FULL ALL/ANY JOIN`をサポートします。 + +- hash + + [Hash join algorithm](https://en.wikipedia.org/wiki/Hash_join)が使用されます。すべての種類および厳密性の組み合わせと、`JOIN ON`セクションで`OR`で結合された複数の結合キーをサポートする最も一般的な実装です。 + +- parallel_hash + + `hash`の変種で、データをバケットに分割し、プロセスを加速するために同時に複数のハッシュテーブルを構築します。 + + `hash`アルゴリズムを使用する際、右側の`JOIN`の部分がRAMにアップロードされます。 + +- partial_merge + + [sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join)の変種で、右側のテーブルのみが完全にソートされています。 + + `RIGHT JOIN`および`FULL JOIN`は、厳密さのすべてが`ALL`である場合にのみサポートされます(`SEMI`、`ANTI`、`ANY`、および`ASOF`はサポートされていません)。 + + `partial_merge`アルゴリズムを使用する際、ClickHouseはデータをソートし、ディスクにダンプします。ClickHouseの`partial_merge`アルゴリズムは、古典的な実現とは少し異なります。最初に、ClickHouseは結合キーでブロックごとに右のテーブルをソートし、ソートされたブロックに対して最小-最大インデックスを作成します。次に、左側のテーブルの部分を`join key`でソートし、それを右のテーブルに対して結合します。最小-最大インデックスも必要ない右テーブルのブロックをスキップするために使用されます。 + +- direct + + このアルゴリズムは、右のテーブルがキー-バリューリクエストをサポートするストレージのために適用できます。 + + `direct`アルゴリズムは、左のテーブルの行をキーとして使用して右のテーブルでルックアップを行います。これは、[Dictionary](../../engines/table-engines/special/dictionary.md/#dictionary)や[EmbeddedRocksDB](../../engines/table-engines/integrations/embedded-rocksdb.md)などの特別なストレージによってのみサポートされており、`LEFT`及び`INNER`JOINだけがサポートされています。 + +- auto + + `auto`に設定されている場合、最初に`hash`結合が試みられ、メモリ制限が違反された場合は、動的に他のアルゴリズムに切り替えられます。 + +- full_sorting_merge + + [Sort-merge algorithm](https://en.wikipedia.org/wiki/Sort-merge_join)を完全にソートされた結合テーブルを結合する前に使用します。 + +- prefer_partial_merge + + ClickHouseは可能であれば常に`partial_merge`結合を使用しようとし、そうでなければ`hash`を使用します。*非推奨*、`partial_merge,hash`と同じです。 + +## join_any_take_last_row {#join_any_take_last_row} + +タイプ: Bool + +デフォルト値: 0 + +`ANY`の厳密さを使用した結合操作の動作を変更します。 + +:::note +この設定は、[Join](../../engines/table-engines/special/join.md)エンジンのテーブルのみの`JOIN`操作に適用されます。 +::: + +可能な値: + +- 0 — 右のテーブルに一致する行が複数ある場合、最初に見つかった行のみが結合されます。 +- 1 — 右のテーブルに一致する行が複数ある場合、最後に見つかった行のみが結合されます。 + +その他の情報は以下を参照してください: + +- [JOIN句](../../sql-reference/statements/select/join.md/#select-join) +- [Joinテーブルエンジン](../../engines/table-engines/special/join.md) +- [join_default_strictness](#join_default_strictness) + +## join_default_strictness {#join_default_strictness} + +タイプ: JoinStrictness + +デフォルト値: ALL + +[JOIN句](../../sql-reference/statements/select/join.md/#select-join)のデフォルトの厳密さを設定します。 + +可能な値: + +- `ALL` — 右のテーブルに一致する行が複数ある場合、ClickHouseは一致する行から[デカルト積](https://en.wikipedia.org/wiki/Cartesian_product)を生成します。これが標準SQLからの通常の`JOIN`の動作です。 +- `ANY` — 右のテーブルに一致する行が複数ある場合、最初に見つかった行のみが結合されます。右のテーブルに一致する行が1つしかない場合、`ANY`と`ALL`の結果は同じです。 +- `ASOF` — 不確実な一致を持つシーケンスの結合に使用されます。 +- 空の文字列 — クエリに`ALL`または`ANY`が指定されていない場合、ClickHouseは例外をスローします。 + +## join_on_disk_max_files_to_merge {#join_on_disk_max_files_to_merge} + +タイプ: UInt64 + +デフォルト値: 64 + +ディスク上で実行されるMergeJoin操作の並列ソートのために許可されるファイルの数を制限します。 + +設定値が大きいほど、使用されるRAMが多く、ディスクI/Oが少なくなります。 + +可能な値: + +- 2から始まる正の整数。 + +## join_output_by_rowlist_perkey_rows_threshold {#join_output_by_rowlist_perkey_rows_threshold} + +タイプ: UInt64 + +デフォルト値: 5 + +ハッシュ結合において、行リストで出力するかどうかを決定するための右のテーブルのキーごとの平均行数の下限。 + +## join_overflow_mode {#join_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた場合に何をするかを指定します。 + +## join_to_sort_maximum_table_rows {#join_to_sort_maximum_table_rows} + +タイプ: UInt64 + +デフォルト値: 10000 + +左または内部結合において、右のテーブルをキーによって再整理するかどうかを決定するための右のテーブルの最大行数。 + +## join_to_sort_minimum_perkey_rows {#join_to_sort_minimum_perkey_rows} + +タイプ: UInt64 + +デフォルト値: 40 + +左または内部結合において、右のテーブルをキーによって再整理するかどうかを決定するための右のテーブルのキーごとの平均行数の下限。この設定は、スパーステーブルキーに対して最適化が適用されないようにします。 + +## join_use_nulls {#join_use_nulls} + +タイプ: Bool + +デフォルト値: 0 + +[JOIN](../../sql-reference/statements/select/join.md)の動作タイプを設定します。テーブルをマージする際に空のセルが出現することがあります。ClickHouseは、この設定に基づいてそれらを異なる方法で埋めます。 + +可能な値: + +- 0 — 空のセルは対応するフィールドタイプのデフォルト値で埋まります。 +- 1 — `JOIN`は標準SQLと同様の動作をします。対応するフィールドの型は[Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable)に変換され、空のセルは[NULL](../../sql-reference/syntax.md)で埋まります。 + +## joined_subquery_requires_alias {#joined_subquery_requires_alias} + +タイプ: Bool + +デフォルト値: 1 + +正しい名前の資格のために、結合サブクエリとテーブル関数に別名を付けることを強制します。 + +## kafka_disable_num_consumers_limit {#kafka_disable_num_consumers_limit} + +タイプ: Bool + +デフォルト値: 0 + +利用可能なCPUコアの数に依存するkafka_num_consumersの制限を無効にします。 + +## kafka_max_wait_ms {#kafka_max_wait_ms} + +タイプ: ミリ秒 + +デフォルト値: 5000 + +再試行前に[Kafka](../../engines/table-engines/integrations/kafka.md/#kafka)からメッセージを読み取るための待機時間(ミリ秒)。 + +可能な値: + +- 正の整数。 +- 0 — 無限のタイムアウト。 + +その他の情報は以下を参照してください: + +- [Apache Kafka](https://kafka.apache.org/) + +## keeper_map_strict_mode {#keeper_map_strict_mode} + +タイプ: Bool + +デフォルト値: 0 + +KeeperMapに対する操作中に追加のチェックを強制します。例えば、既存のキーに対する挿入に対して例外をスローします。 + +## keeper_max_retries {#keeper_max_retries} + +タイプ: UInt64 + +デフォルト値: 10 + +一般的なkeeper操作の最大再試行回数。 + +## keeper_retry_initial_backoff_ms {#keeper_retry_initial_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 100 + +一般的なkeeper操作のための初期のバックオフタイムアウト。 + +## keeper_retry_max_backoff_ms {#keeper_retry_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 5000 + +一般的なkeeper操作のための最大バックオフタイムアウト。 + +## legacy_column_name_of_tuple_literal {#legacy_column_name_of_tuple_literal} + +タイプ: Bool + +デフォルト値: 0 + +大きなタプルリテラルの要素のすべての名前をハッシュの代わりにそのカラム名でリストします。この設定は互換性の理由のみで存在します。これを'true'に設定することは、21.7よりも低いバージョンからより高いバージョンへのクラスターのローリングアップデートを行う際に意味があります。 + +## lightweight_deletes_sync {#lightweight_deletes_sync} + +タイプ: UInt64 + +デフォルト値: 2 + +これは[`mutations_sync`](#mutations_sync)と同じですが、論理削除の実行のみを制御します。 + +可能な値: + +- 0 - 削除は非同期に実行されます。 +- 1 - クエリは現在のサーバーで論理削除が完了するのを待機します。 +- 2 - クエリはすべてのレプリカ(存在する場合)で論理削除が完了するのを待機します。 + +**その他の情報** + +- [ALTERクエリの同期性](../../sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [ミューテーション](../../sql-reference/statements/alter/index.md#mutations) + +## limit {#limit} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリ結果から取得する最大行数を設定します。これは、[LIMIT](../../sql-reference/statements/select/limit.md/#limit-clause)句で設定された値を調整し、クエリに指定された制限がこの設定で設定された制限を超えることがないようにします。 + +可能な値: + +- 0 — 行数に制限はありません。 +- 正の整数。 + +## live_view_heartbeat_interval {#live_view_heartbeat_interval} + +タイプ: 秒 + +デフォルト値: 15 + +ライブクエリが生きていることを示すハートビート間隔(秒)。 + +## load_balancing {#load_balancing} + +タイプ: LoadBalancing + +デフォルト値: random + +分散クエリ処理に使用されるレプリカ選択のアルゴリズムを指定します。 + +ClickHouseは、次のようなレプリカの選択アルゴリズムをサポートしています: + +- [Random](#load_balancing-random)(デフォルト) +- [Nearest hostname](#load_balancing-nearest_hostname) +- [Hostname levenshtein distance](#load_balancing-hostname_levenshtein_distance) +- [In order](#load_balancing-in_order) +- [First or random](#load_balancing-first_or_random) +- [Round robin](#load_balancing-round_robin) + +その他の情報は以下を参照してください: + +- [distributed_replica_max_ignored_errors](#distributed_replica_max_ignored_errors) + +### Random (デフォルト) {#load_balancing-random} + +``` sql +load_balancing = random +``` + +各レプリカのエラーの数がカウントされます。クエリは、最も少ないエラーを持つレプリカに送信され、同じエラー数のレプリカが複数ある場合は、そのうちのどれかに送信されます。 +欠点: サーバーの近接性は考慮されず、レプリカが異なるデータを持っている場合、異なるデータが返される可能性があります。 + +### Nearest Hostname {#load_balancing-nearest_hostname} + +``` sql +load_balancing = nearest_hostname +``` + +各レプリカのエラーの数がカウントされます。5分ごとに、エラーの数は2で統合的に割り算されます。これにより、最近の時間に基づいてエラーの数が指数的にスムージングされて計算されます。エラー数が最も少ないレプリカが1つある場合(すなわち、他のレプリカでは最近エラーが発生している)、クエリはそのレプリカに送信されます。同じ最小エラー数のレプリカが複数ある場合は、設定ファイルのサーバーのホスト名に最も類似したホスト名のレプリカにクエリが送信されます(同じ位置に異なる文字数による)。 + +たとえば、example01-01-1とexample01-01-2は1箇所で異なり、example01-01-1とexample01-02-2は2箇所で異なります。 +この方法は単純に見えるかもしれませんが、ネットワークトポロジーに関する外部データを必要とせず、IPアドレスを比較することも難しいIPv6アドレスに対しても対処します。 + +したがって、等価なレプリカが存在する場合、名前によって最も近いものが優先されます。 +さらに、同じサーバーにクエリを送信する場合、障害がない場合、分散クエリも同じサーバーに送信されると考えられます。そのため、レプリカに異なるデータが格納されていても、クエリはほとんど同じ結果を返します。 + +### Hostname levenshtein distance {#load_balancing-hostname_levenshtein_distance} + +``` sql +load_balancing = hostname_levenshtein_distance +``` + +`nearest_hostname`と同様ですが、ホスト名を[levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance)の方式で比較します。例えば: + +``` text +example-clickhouse-0-0 ample-clickhouse-0-0 +1 + +example-clickhouse-0-0 example-clickhouse-1-10 +2 + +example-clickhouse-0-0 example-clickhouse-12-0 +3 +``` + +### In Order {#load_balancing-in_order} + +``` sql +load_balancing = in_order +``` + +同じエラー数のレプリカには、設定ファイルに記載された順序のままアクセスされます。 +この方法は、どのレプリカが優先されるかが明確にわかっているときに適切です。 + +### First or Random {#load_balancing-first_or_random} + +``` sql +load_balancing = first_or_random +``` + +このアルゴリズムは、設定された最初のレプリカを選択します。最初のレプリカが利用できない場合はランダムなレプリカを選択します。これは、クロスレプリケーショントポロジーのセットアップで効果的ですが、他の構成では役に立ちません。 + +`first_or_random`アルゴリズムは、`in_order`アルゴリズムの問題を解決します。`in_order`の場合、あるレプリカがダウンすると次のレプリカに二重負荷がかかり、残りのレプリカは通常のトラフィックの量を処理します。`first_or_random`アルゴリズムを使用する場合、まだ利用可能なレプリカの間で負荷が均等に分散されます。 + +`first_or_random`アルゴリズムを使用して、最初のレプリカを明示的に定義することもできます。この設定を使用すると、レプリカ間でクエリのワークロードを再バランスするより多くの制御が可能になります。 + +### Round Robin {#load_balancing-round_robin} + +``` sql +load_balancing = round_robin +``` + +このアルゴリズムは、同じエラー数のレプリカに対してラウンドロビンポリシーを使用します(`round_robin`ポリシーのクエリのみがカウントされます)。 + +## load_balancing_first_offset {#load_balancing_first_offset} + +タイプ: UInt64 + +デフォルト値: 0 + +FIRST_OR_RANDOMロードバランシング戦略が使用されているときに、優先的にクエリを送信するレプリカを指定します。 + +## load_marks_asynchronously {#load_marks_asynchronously} + +タイプ: Bool + +デフォルト値: 0 + +MergeTreeマークを非同期にロードします。 + +## local_filesystem_read_method {#local_filesystem_read_method} + +タイプ: 文字列 + +デフォルト値: pread_threadpool + +ローカルファイルシステムからデータを読み取るためのメソッド。選択肢: read, pread, mmap, io_uring, pread_threadpool。'io_uring'メソッドはエクスペリメンタルで、Log、TinyLog、StripeLog、File、Set、および同時読み書きがある場合は他のテーブルでは機能しません。 + +## local_filesystem_read_prefetch {#local_filesystem_read_prefetch} + +タイプ: Bool + +デフォルト値: 0 + +ローカルファイルシステムからデータを読み取る際にプリフェッチを使用するかどうか。 + +## lock_acquire_timeout {#lock_acquire_timeout} + +タイプ: 秒 + +デフォルト値: 120 + +ロックリクエストが失敗するまでに待機する秒数を定義します。 + +ロックタイムアウトは、テーブルでの読み取り/書き込み操作を実行中にデッドロックから保護するために使用されます。タイムアウトが経過するとロックリクエストが失敗し、ClickHouseサーバーは「ロック試行がタイムアウトしました!デッドロックの回避が可能です。クライアントは再試行する必要があります。」という例外を投げます。エラーコードは`DEADLOCK_AVOIDED`です。 + +可能な値: + +- 正の整数(秒単位)。 +- 0 — ロックタイムアウトなし。 + +## log_comment {#log_comment} + +タイプ: 文字列 + +デフォルト値: + +[system.query_log](../system-tables/query_log.md)テーブルの`log_comment`フィールドの値と、サーバーログのコメントテキストを指定します。 + +これにより、サーバーログの可読性を向上させることができます。さらに、[clickhouse-test](../../development/tests.md)を実行した後に、テストに関連するクエリを`system.query_log`から選択するのにも役立ちます。 + +可能な値: + +- [max_query_size](#max_query_size)を超えない任意の文字列。max_query_sizeを超えると、サーバーは例外をスローします。 + +**例** + +クエリ: + +``` sql +SET log_comment = 'log_comment test', log_queries = 1; +SELECT 1; +SYSTEM FLUSH LOGS; +SELECT type, query FROM system.query_log WHERE log_comment = 'log_comment test' AND event_date >= yesterday() ORDER BY event_time DESC LIMIT 2; +``` + +結果: + +``` text +┌─type────────┬─query─────┐ +│ QueryStart │ SELECT 1; │ +│ QueryFinish │ SELECT 1; │ +└─────────────┴───────────┘ +``` + +## log_formatted_queries {#log_formatted_queries} + +タイプ: Bool + +デフォルト値: 0 + +[system.query_log](../../operations/system-tables/query_log.md)システムテーブルにフォーマットされたクエリをログすることを許可します([system.query_log](../../operations/system-tables/query_log.md)の`formatted_query`列にデータを埋め込みます)。 + +可能な値: + +- 0 — フォーマットされたクエリはシステムテーブルにログされません。 +- 1 — フォーマットされたクエリはシステムテーブルにログされます。 + +## log_processors_profiles {#log_processors_profiles} + +タイプ: Bool + +デフォルト値: 1 + +実行中にプロセッサが費やした時間を`system.processors_profile_log`テーブルに書き込みます。 + +その他の情報は以下を参照してください: + +- [`system.processors_profile_log`](../../operations/system-tables/processors_profile_log.md) +- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) + +## log_profile_events {#log_profile_events} + +タイプ: Bool + +デフォルト値: 1 + +クエリパフォーマンス統計を`query_log`、`query_thread_log`、および`query_views_log`にログします。 + +## log_queries {#log_queries} + +タイプ: Bool + +デフォルト値: 1 + +クエリログを設定します。 + +この設定でClickHouseに送信されたクエリは、[query_log](../../operations/server-configuration-parameters/settings.md/#query-log)サーバー設定パラメータのルールに従ってログされます。 + +例: + +``` text +log_queries=1 +``` + +## log_queries_cut_to_length {#log_queries_cut_to_length} + +タイプ: UInt64 + +デフォルト値: 100000 + +クエリの長さが指定された閾値(バイト単位)を超える場合、クエリはクエリログに書き込む際にカットされます。また、通常のテキストログに印刷されるクエリの長さも制限されます。 + +## log_queries_min_query_duration_ms {#log_queries_min_query_duration_ms} + +タイプ: ミリ秒 + +デフォルト値: 0 + +無効にした場合(0以外)、この設定の値よりも早く実行されたクエリはログに記録されません(これは[MySQLのスロークエリログ](https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)の`long_query_time`のように考えられます)。基本的に、次のテーブルには表示されません。 + +- `system.query_log` +- `system.query_thread_log` + +次のタイプのクエリのみがログに記載されます。 + +- `QUERY_FINISH` +- `EXCEPTION_WHILE_PROCESSING` + +- タイプ: ミリ秒 +- デフォルト値: 0(すべてのクエリ) + +## log_queries_min_type {#log_queries_min_type} + +タイプ: LogQueriesType + +デフォルト値: QUERY_START + +`query_log`に記録する最小タイプです。 + +可能な値: +- `QUERY_START`(`=1`) +- `QUERY_FINISH`(`=2`) +- `EXCEPTION_BEFORE_START`(`=3`) +- `EXCEPTION_WHILE_PROCESSING`(`=4`) + +これを使用して、`query_log`にどのエンティティをログに記録するかを制限できます。たとえば、エラーのみに関心がある場合は、`EXCEPTION_WHILE_PROCESSING`を使用できます: + +``` text +log_queries_min_type='EXCEPTION_WHILE_PROCESSING' +``` + +## log_queries_probability {#log_queries_probability} + +タイプ: Float + +デフォルト値: 1 + +ユーザーが[query_log](../../operations/system-tables/query_log.md)、[query_thread_log](../../operations/system-tables/query_thread_log.md)、および[query_views_log](../../operations/system-tables/query_views_log.md)システムテーブルに、指定された確率でランダムに選択されたクエリのサンプルのみをログに記録できるようにします。これにより、1秒あたり大量のクエリが発生する際の負荷を削減できます。 + +可能な値: + +- 0 — クエリはシステムテーブルにログされません。 +- 正の浮動小数点数で範囲は [0..1]。例えば、設定値が `0.5` の場合、クエリの約半分がシステムテーブルに記録されます。 +- 1 — すべてのクエリがシステムテーブルに記録されます。 + +## log_query_settings {#log_query_settings} + +タイプ: Bool + +デフォルト値: 1 + +クエリログと OpenTelemetry span ログにクエリ設定を記録します。 + +## log_query_threads {#log_query_threads} + +タイプ: Bool + +デフォルト値: 0 + +クエリスレッドのロギングを設定します。 + +クエリスレッドは [system.query_thread_log](../../operations/system-tables/query_thread_log.md) テーブルにログとして記録されます。この設定は、[log_queries](#log-queries) が true の場合のみ効果があります。この設定で ClickHouse によって実行されるクエリのスレッドは、[query_thread_log](../../operations/server-configuration-parameters/settings.md/#query_thread_log) サーバー設定パラメーターのルールに従って記録されます。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +**例** + +``` text +log_query_threads=1 +``` + +## log_query_views {#log_query_views} + +タイプ: Bool + +デフォルト値: 1 + +クエリビューのロギングを設定します。 + +この設定が有効な状態で ClickHouse によって実行されるクエリに関連するビュー(物化ビューまたはライブビュー)があれば、それらは [query_views_log](../../operations/server-configuration-parameters/settings.md/#query_views_log) サーバー設定パラメーターに記録されます。 + +例: + +``` text +log_query_views=1 +``` + +## low_cardinality_allow_in_native_format {#low_cardinality_allow_in_native_format} + +タイプ: Bool + +デフォルト値: 1 + +[LowCardinality](../../sql-reference/data-types/lowcardinality.md) データ型を [Native](../../interfaces/formats.md/#native) 形式で使用することを許可または制限します。 + +`LowCardinality` の使用が制限されている場合、ClickHouse サーバーは `SELECT` クエリのために `LowCardinality` カラムを通常のカラムに変換し、`INSERT` クエリのために通常のカラムを `LowCardinality` カラムに変換します。 + +この設定は、`LowCardinality` データ型をサポートしないサードパーティクライアント向けに主に必要です。 + +可能な値: + +- 1 — `LowCardinality` の使用は制限されません。 +- 0 — `LowCardinality` の使用は制限されます。 + +## low_cardinality_max_dictionary_size {#low_cardinality_max_dictionary_size} + +タイプ: UInt64 + +デフォルト値: 8192 + +[LowCardinality](../../sql-reference/data-types/lowcardinality.md) データ型のためにストレージファイルシステムに書き込むことができる共有グローバルDictionaryの最大サイズ(行数)を設定します。この設定は、無制限のDictionary成長によるRAMの問題を防ぎます。最大Dictionaryサイズの制限によりエンコードできないすべてのデータは、ClickHouse が通常の方法で書き込みます。 + +可能な値: + +- 任意の正の整数。 + +## low_cardinality_use_single_dictionary_for_part {#low_cardinality_use_single_dictionary_for_part} + +タイプ: Bool + +デフォルト値: 0 + +データパートのために単一Dictionaryの使用をオンまたはオフにします。 + +デフォルトでは、ClickHouse サーバーはDictionaryのサイズを監視し、Dictionaryがオーバーフローした場合に次のDictionaryの書き込みを開始します。複数のDictionaryの作成を禁止するには `low_cardinality_use_single_dictionary_for_part = 1` を設定します。 + +可能な値: + +- 1 — データパートのための複数のDictionaryの作成が禁止されます。 +- 0 — データパートのための複数のDictionaryの作成は禁止されません。 + +## materialize_skip_indexes_on_insert {#materialize_skip_indexes_on_insert} + +タイプ: Bool + +デフォルト値: 1 + +true の場合、挿入時にスキップインデックスが計算されます。そうでない場合、スキップインデックスはマージ時にのみ計算されます。 + +## materialize_statistics_on_insert {#materialize_statistics_on_insert} + +タイプ: Bool + +デフォルト値: 1 + +true の場合、挿入時に統計が計算されます。そうでない場合、統計はマージ時にのみ計算されます。 + +## materialize_ttl_after_modify {#materialize_ttl_after_modify} + +タイプ: Bool + +デフォルト値: 1 + +ALTER MODIFY TTL クエリの後に古いデータに TTL を適用します。 + +## materialized_views_ignore_errors {#materialized_views_ignore_errors} + +タイプ: Bool + +デフォルト値: 0 + +MATERIALIZED VIEW のエラーを無視し、MV に関わらず元のブロックをテーブルに配信することを許可します。 + +## max_analyze_depth {#max_analyze_depth} + +タイプ: UInt64 + +デフォルト値: 5000 + +インタープリタによって実行される最大分析数。 + +## max_ast_depth {#max_ast_depth} + +タイプ: UInt64 + +デフォルト値: 1000 + +クエリ構文木の最大深さ。解析後にチェックされます。 + +## max_ast_elements {#max_ast_elements} + +タイプ: UInt64 + +デフォルト値: 50000 + +構文木の最大ノード数。解析後にチェックされます。 + +## max_backup_bandwidth {#max_backup_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +サーバー上の特定のバックアップ用の最大読み取り速度(バイト毎秒)。ゼロは無制限を意味します。 + +## max_block_size {#max_block_size} + +タイプ: UInt64 + +デフォルト値: 65409 + +ClickHouse では、データは列の部分のセットであるブロックによって処理されます。単一ブロックの内部処理サイクルは効率的ですが、各ブロックを処理する際には目に見えるコストが発生します。 + +`max_block_size` 設定は、テーブルからデータをロードする際に単一ブロックに含める推奨最大行数を示します。 `max_block_size` サイズのブロックは常にテーブルからロードされるわけではありません。もし ClickHouse が必要なデータが少ないと判断した場合は、小さいブロックが処理されます。 + +ブロックサイズが小さすぎると、各ブロックを処理する際に目に見えるコストが発生するので注意が必要です。大きすぎると、最初のブロックの処理後に LIMIT 句を持つクエリが迅速に実行されない可能性があります。`max_block_size` を設定する際の目標は、多くのカラムを複数のスレッドで取り出す際にメモリを使いすぎないようにしつつ、少なくともある程度のキャッシュの局所性を保つことです。 + +## max_bytes_before_external_group_by {#max_bytes_before_external_group_by} + +タイプ: UInt64 + +デフォルト値: 0 + +GROUP BY 操作中のメモリ使用量がこのバイト数の閾値を超えた場合は、'external aggregation' モードを有効にします(データをディスクにスピルします)。推奨値はシステムメモリの半分です。 + +## max_bytes_before_external_sort {#max_bytes_before_external_sort} + +タイプ: UInt64 + +デフォルト値: 0 + +ORDER BY 操作中のメモリ使用量がこのバイト数の閾値を超えた場合は、'external sorting' モードを有効にします(データをディスクにスピルします)。推奨値はシステムメモリの半分です。 + +## max_bytes_before_remerge_sort {#max_bytes_before_remerge_sort} + +タイプ: UInt64 + +デフォルト値: 1000000000 + +ORDER BY で LIMIT がある場合、メモリ使用量が指定された閾値を超えた場合、最終的なマージに向けてブロックを追加的にマージする手順を実行し、上位 LIMIT 行のみを保持します。 + +## max_bytes_in_distinct {#max_bytes_in_distinct} + +タイプ: UInt64 + +デフォルト値: 0 + +DISTINCT の実行中の状態の最大合計サイズ(圧縮されていないバイト単位)をメモリ内で管理します。 + +## max_bytes_in_join {#max_bytes_in_join} + +タイプ: UInt64 + +デフォルト値: 0 + +JOIN のためのハッシュテーブルの最大サイズ(メモリ内のバイト数)。 + +## max_bytes_in_set {#max_bytes_in_set} + +タイプ: UInt64 + +デフォルト値: 0 + +IN セクションの実行結果の最大サイズ(メモリ内のバイト数)です。 + +## max_bytes_to_read {#max_bytes_to_read} + +タイプ: UInt64 + +デフォルト値: 0 + +最も「深い」ソースからの読み取りバイト数の制限(解凍後)。つまり、最も深いサブクエリのみ。リモートサーバーから読み取るときは、この制限はリモートサーバーでのみ確認されます。 + +## max_bytes_to_read_leaf {#max_bytes_to_read_leaf} + +タイプ: UInt64 + +デフォルト値: 0 + +分散クエリの葉ノードでの読み取りバイト数の制限。この制限はローカルリードのみに適用され、ルートノードでの最終的なマージステージを除外します。この設定は、prefer_localhost_replica=1 の場合に不安定です。 + +## max_bytes_to_sort {#max_bytes_to_sort} + +タイプ: UInt64 + +デフォルト値: 0 + +ORDER BY 操作のために処理しなければならないバイト数が指定された量を超えた場合、その動作は 'sort_overflow_mode' によって決まります。デフォルトでは例外がスローされます。 + +## max_bytes_to_transfer {#max_bytes_to_transfer} + +タイプ: UInt64 + +デフォルト値: 0 + +GLOBAL IN/JOIN セクションが実行されるときに、転送される外部テーブルの最大サイズ(圧縮されていないバイト単位)。 + +## max_columns_to_read {#max_columns_to_read} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリが指定された数のカラムを読み取る必要がある場合、例外がスローされます。ゼロの値は無制限を意味します。この設定は、あまりにも複雑なクエリを防ぐために便利です。 + +## max_compress_block_size {#max_compress_block_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +テーブルに書き込むために圧縮する前の未圧縮データのブロックの最大サイズ。デフォルトは1,048,576(1 MiB)。一般に小さいブロックサイズを指定すると圧縮率がわずかに低下し、キャッシュの局所性により圧縮および解凍速度がわずかに向上し、メモリ消費が減少します。 + +:::note +これは専門的な設定であり、ClickHouse を始めたばかりの場合は変更しないでください。 +::: + +圧縮用のブロック(バイトのチャンクからなるメモリの断片)とクエリ処理用のブロック(テーブルからの行のセット)を混同しないでください。 + +## max_concurrent_queries_for_all_users {#max_concurrent_queries_for_all_users} + +タイプ: UInt64 + +デフォルト値: 0 + +この設定の値が同時に処理されているクエリの現在の数以下の場合、例外をスローします。 + +例: `max_concurrent_queries_for_all_users` を99に設定し、データベース管理者は自身が100に設定することで、サーバーがオーバーロードされている場合でも調査のためのクエリを実行できます。 + +1つのクエリまたはユーザーの設定を変更しても、他のクエリには影響しません。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +**例** + +``` xml +99 +``` + +**関連情報** + +- [max_concurrent_queries](/docs/ja/operations/server-configuration-parameters/settings.md/#max_concurrent_queries) + +## max_concurrent_queries_for_user {#max_concurrent_queries_for_user} + +タイプ: UInt64 + +デフォルト値: 0 + +ユーザーごとに同時に処理されるクエリの最大数。 + +可能な値: + +- 正の整数。 +- 0 — 制限なし。 + +**例** + +``` xml +5 +``` + +## max_distributed_connections {#max_distributed_connections} + +タイプ: UInt64 + +デフォルト値: 1024 + +単一の分散テーブルに対して単一のクエリのためのリモートサーバーとの同時接続の最大数。クラスター内のサーバーの数以上の値を設定することを推奨します。 + +次のパラメータは、分散テーブルを作成する際とサーバーを起動する際のみ使用されるため、実行時に変更する理由はありません。 + +## max_distributed_depth {#max_distributed_depth} + +タイプ: UInt64 + +デフォルト値: 5 + +[Distributed](../../engines/table-engines/special/distributed.md) テーブルの再帰クエリの最大深さを制限します。 + +値が超えた場合、サーバーは例外をスローします。 + +可能な値: + +- 正の整数。 +- 0 — 深さ制限なし。 + +## max_download_buffer_size {#max_download_buffer_size} + +タイプ: UInt64 + +デフォルト値: 10485760 + +各スレッドのための並行ダウンロード用バッファの最大サイズ(例: URL エンジン用)。 + +## max_download_threads {#max_download_threads} + +タイプ: MaxThreads + +デフォルト値: 4 + +データをダウンロードするための最大スレッド数(例: URL エンジン用)。 + +## max_estimated_execution_time {#max_estimated_execution_time} + +タイプ: Seconds + +デフォルト値: 0 + +クエリの推定最大実行時間(秒単位)。 + +## max_execution_speed {#max_execution_speed} + +タイプ: UInt64 + +デフォルト値: 0 + +1秒あたりの実行行数の最大数。 + +## max_execution_speed_bytes {#max_execution_speed_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +1秒あたりの実行バイト数の最大数。 + +## max_execution_time {#max_execution_time} + +タイプ: Seconds + +デフォルト値: 0 + +クエリの実行時間が指定された秒数を超えた場合、その動作は 'timeout_overflow_mode' によって決まります。デフォルトでは例外がスローされます。このタイムアウトはチェックされ、クエリはデータ処理の指定された場所でのみ停止できます。現在、集計状態のマージやクエリ分析中に停止することはできず、実際の実行時間はこの設定の値を超える可能性があります。 + +## max_execution_time_leaf {#max_execution_time_leaf} + +タイプ: Seconds + +デフォルト値: 0 + +max_execution_time に類似の意味を持ちますが、分散クエリの葉ノードでのみ適用されます。タイムアウトは 'timeout_overflow_mode_leaf' によって決定され、デフォルトでは例外がスローされます。 + +## max_expanded_ast_elements {#max_expanded_ast_elements} + +タイプ: UInt64 + +デフォルト値: 500000 + +エイリアスとアスタリスクを拡張した後のクエリ構文木の最大サイズ(ノード数)。 + +## max_fetch_partition_retries_count {#max_fetch_partition_retries_count} + +タイプ: UInt64 + +デフォルト値: 5 + +別のホストからパーティションを取得する際のリトライ回数。 + +## max_final_threads {#max_final_threads} + +タイプ: MaxThreads + +デフォルト値: 'auto(12)' + +[FINAL](../../sql-reference/statements/select/from.md#select-from-final) 修飾子を持つ `SELECT` クエリのデータ読み取りフェーズに対する最大並列スレッド数を設定します。 + +可能な値: + +- 正の整数。 +- 0 または 1 — 無効。 `SELECT` クエリは単一スレッドで実行されます。 + +## max_http_get_redirects {#max_http_get_redirects} + +タイプ: UInt64 + +デフォルト値: 0 + +許可される最大数のHTTP GETリダイレクトホップ。悪意のあるサーバーがリクエストを予期しないサービスにリダイレクトするのを防ぐために、追加のセキュリティ対策が講じられています。\n\nこれは、外部サーバーが他のアドレスにリダイレクトする場合ですが、そのアドレスが企業のインフラに内部的に見える場合に該当します。内部サーバーにHTTPリクエストを送信すると、認証をバイパスして内部ネットワークから内部APIを要求したり、Redis や Memcached などの他のサービスをクエリしたりすることができます。内部のインフラストラクチャ(ローカルホストで動作しているものを含む)を持っていない場合や、サーバーを信頼する場合は、リダイレクトを許可するのは安全です。ただし、URLがHTTPを使用している場合は、リモートサーバーだけでなく、ISPや中間のすべてのネットワークも信頼しなければなりません。 + +## max_hyperscan_regexp_length {#max_hyperscan_regexp_length} + +タイプ: UInt64 + +デフォルト値: 0 + +[hyperscan マルチマッチ関数](../../sql-reference/functions/string-search-functions.md/#multimatchanyhaystack-pattern1-pattern2-patternn)での各正規表現の最大長を定義します。 + +可能な値: + +- 正の整数。 +- 0 — 長さに制限なし。 + +**例** + +クエリ: + +```sql +SELECT multiMatchAny('abcd', ['ab','bcd','c','d']) SETTINGS max_hyperscan_regexp_length = 3; +``` + +結果: + +```text +┌─multiMatchAny('abcd', ['ab', 'bcd', 'c', 'd'])─┐ +│ 1 │ +└────────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT multiMatchAny('abcd', ['ab','bcd','c','d']) SETTINGS max_hyperscan_regexp_length = 2; +``` + +結果: + +```text +Exception: Regexp length too large. +``` + +**関連情報** + +- [max_hyperscan_regexp_total_length](#max-hyperscan-regexp-total-length) + +## max_hyperscan_regexp_total_length {#max_hyperscan_regexp_total_length} + +タイプ: UInt64 + +デフォルト値: 0 + +[hyperscan マルチマッチ関数](../../sql-reference/functions/string-search-functions.md/#multimatchanyhaystack-pattern1-pattern2-patternn)内のすべての正規表現の合計最大長を設定します。 + +可能な値: + +- 正の整数。 +- 0 — 長さに制限なし。 + +**例** + +クエリ: + +```sql +SELECT multiMatchAny('abcd', ['a','b','c','d']) SETTINGS max_hyperscan_regexp_total_length = 5; +``` + +結果: + +```text +┌─multiMatchAny('abcd', ['a', 'b', 'c', 'd'])─┐ +│ 1 │ +└─────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT multiMatchAny('abcd', ['ab','bc','c','d']) SETTINGS max_hyperscan_regexp_total_length = 5; +``` + +結果: + +```text +Exception: Total regexp lengths too large. +``` + +**関連情報** + +- [max_hyperscan_regexp_length](#max-hyperscan-regexp-length) + +## max_insert_block_size {#max_insert_block_size} + +タイプ: UInt64 + +デフォルト値: 1048449 + +テーブルに挿入するために形成されるブロックのサイズ(行数)です。この設定は、サーバーがブロックを形成する場合にのみ適用されます。例えば、HTTP インターフェース経由のINSERTの場合、サーバーはデータ形式を解析し、指定されたサイズのブロックを形成します。しかし、clickhouse-clientを使用する場合、クライアントはデータを独自に解析し、サーバーでの `max_insert_block_size` 設定は挿入されるブロックのサイズに影響を与えません。この設定は、INSERT SELECT を使用する場合には目的がありません。SELECT の後に形成される同じブロックを使用してデータが挿入されるためです。 + +デフォルト値は `max_block_size` よりわずかに大きくなっています。これは、特定のテーブルエンジン(`*MergeTree`)がディスクに挿入された各ブロックのデータパートを形成するため、かなり大きなエンティティになるためです。同様に、`*MergeTree` テーブルは挿入中にデータをソートし、十分に大きなブロックサイズによってメモリ内でより多くのデータをソートできるようにします。 + +## max_insert_delayed_streams_for_parallel_write {#max_insert_delayed_streams_for_parallel_write} + +タイプ: UInt64 + +デフォルト値: 0 + +最終パートフラッシュを遅らせるための最大ストリーム(カラム)の数。デフォルトは自動(基盤となるストレージが並列書き込みをサポートしている場合は1000、それ以外は無効)。 + +## max_insert_threads {#max_insert_threads} + +タイプ: UInt64 + +デフォルト値: 0 + +`INSERT SELECT` クエリを実行するための最大スレッド数。 + +可能な値: + +- 0(または 1) — `INSERT SELECT` は並列実行されません。 +- 正の整数。1より大きい。 + +クラウドデフォルト値: サービスのサイズに応じて2〜4。 + +並列 `INSERT SELECT` は、`SELECT` 部分が並列で実行されている場合にのみ効果があります。詳細については [max_threads](#max_threads) 設定を参照してください。より高い値は、より多くのメモリ使用量につながります。 + +## max_joined_block_size_rows {#max_joined_block_size_rows} + +タイプ: UInt64 + +デフォルト値: 65409 + +JOIN 結果の最大ブロックサイズ(結合アルゴリズムがサポートしている場合)。0は無制限を意味します。 + +## max_limit_for_ann_queries {#max_limit_for_ann_queries} + +タイプ: UInt64 + +デフォルト値: 1000000 + +この設定を超える LIMIT を持つ SELECT クエリは、ベクトル類似インデックスを使用できません。ベクトル類似インデックスでのメモリオーバーフローを防ぐのに役立ちます。 + +## max_live_view_insert_blocks_before_refresh {#max_live_view_insert_blocks_before_refresh} + +タイプ: UInt64 + +デフォルト値: 64 + +マージ可能なブロックがドロップされ、クエリが再実行される前の最大挿入ブロック数を制限します。 + +## max_local_read_bandwidth {#max_local_read_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +ローカルリードの最大速度(バイト毎秒)。 + +## max_local_write_bandwidth {#max_local_write_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +ローカル書き込みの最大速度(バイト毎秒)。 + +## max_memory_usage {#max_memory_usage} + +タイプ: UInt64 + +デフォルト値: 0 + +単一クエリの処理に対する最大メモリ使用量。ゼロは無制限を意味します。 + +## max_memory_usage_for_user {#max_memory_usage_for_user} + +タイプ: UInt64 + +デフォルト値: 0 + +ユーザーによるすべての同時実行クエリの処理に対する最大メモリ使用量。ゼロは無制限を意味します。 + +## max_network_bandwidth {#max_network_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +ネットワーク越しのデータ交換の速度を制限します(バイト毎秒)。この設定は、すべてのクエリに適用されます。 + +可能な値: + +- 正の整数。 +- 0 — 帯域幅制御が無効です。 + +## max_network_bandwidth_for_all_users {#max_network_bandwidth_for_all_users} + +タイプ: UInt64 + +デフォルト値: 0 + +ネットワーク越しのデータ交換の速度を制限します(バイト毎秒)。この設定は、サーバー上のすべての同時実行クエリに適用されます。 + +可能な値: + +- 正の整数。 +- 0 — データ速度制御が無効です。 + +## max_network_bandwidth_for_user {#max_network_bandwidth_for_user} + +タイプ: UInt64 + +デフォルト値: 0 + +ユーザーによるネットワーク越しのデータ交換の速度を制限します(バイト毎秒)。この設定は、単一のユーザーが実行するすべての同時実行クエリに適用されます。 + +可能な値: + +- 正の整数。 +- 0 — データ速度制御が無効です。 + +## max_network_bytes {#max_network_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリを実行する際に、ネットワーク越しに受信または送信されるデータ量(バイト単位)を制限します。この設定は、各個別のクエリに適用されます。 + +可能な値: + +- 正の整数。 +- 0 — データ量制御が無効です。 + +## max_number_of_partitions_for_independent_aggregation {#max_number_of_partitions_for_independent_aggregation} + +タイプ: UInt64 + +デフォルト値: 128 + +最適化を適用するためのテーブル内の最大パーティション数。 + +## max_parallel_replicas {#max_parallel_replicas} + +タイプ: NonZeroUInt64 + +デフォルト値: 1 + +クエリを実行する際の各シャードに対する最大のレプリカ数。 + +可能な値: + +- 正の整数。 + +**追加情報** + +このオプションは使用される設定に応じて異なる結果を生じます。 + +:::note +この設定は、結合またはサブクエリが関与している場合や、すべてのテーブルが特定の要件を満たしていない場合に不正確な結果を生じます。詳細については、[Distributed Subqueries and max_parallel_replicas](../../sql-reference/operators/in.md/#max_parallel_replica-subqueries) を参照してください。 +::: + +### `SAMPLE` キーを使用した並列処理 + +クエリは、複数のサーバーで同時に実行される場合、より速く処理されることがあります。しかし、次のような場合にはクエリのパフォーマンスが低下する可能性があります。 + +- サンプリングキーの位置がパーティショニングキー内にあり、効率的な範囲スキャンができない。 +- テーブルにサンプリングキーを追加することで、他のカラムによるフィルタリングの効率が低下する。 +- サンプリングキーが計算コストの高い式である。 +- クラスタのレイテンシ分布にロングテールがあるため、サーバーを増やすと全体のレイテンシが増加する。 + +### [parallel_replicas_custom_key](#parallel_replicas_custom_key) を使用した並列処理 + +この設定は、任意のレプリケートテーブルに便利です。 + +## max_parser_backtracks {#max_parser_backtracks} + +タイプ: UInt64 + +デフォルト値: 1000000 + +再帰下降解析プロセス中に異なる代替を試みる最大バックトラック数。 + +## max_parser_depth {#max_parser_depth} + +タイプ: UInt64 + +デフォルト値: 1000 + +再帰下降パーサーでの再帰の最大深さを制限します。スタックサイズを制御できます。 + +可能な値: + +- 正の整数。 +- 0 — 再帰の深さに制限なし。 + +## max_parsing_threads {#max_parsing_threads} + +タイプ: MaxThreads + +デフォルト値: 'auto(12)' + +並行解析をサポートする入力形式のデータを解析するための最大スレッド数。デフォルトでは自動的に決定されます。 + +## max_partition_size_to_drop {#max_partition_size_to_drop} + +タイプ: UInt64 + +デフォルト値: 50000000000 + +クエリ時のパーティション削除に対する制限。値が0の場合、制限なしでパーティションを削除できます。 + +クラウドデフォルト値: 1 TB。 + +:::note +このクエリ設定は、そのサーバー設定の同等のものを上書きします。詳細については、[max_partition_size_to_drop](/docs/ja/operations/server-configuration-parameters/settings.md/#max-partition-size-to-drop) を参照してください。 +::: + +## max_partitions_per_insert_block {#max_partitions_per_insert_block} + +タイプ: UInt64 + +デフォルト値: 100 + +単一の INSERT されたブロック内の最大パーティション数を制限します。ゼロは無制限を意味します。ブロックにパーティションが多すぎる場合は例外をスローします。この設定は安全閾値です。多くのパーティションを使用することは一般的な誤解です。 + +## max_partitions_to_read {#max_partitions_to_read} + +タイプ: Int64 + +デフォルト値: -1 + +1つのクエリでアクセスできる最大パーティション数を制限します。 <= 0 は無制限を意味します。 + +## max_parts_to_move {#max_parts_to_move} + +タイプ: UInt64 + +デフォルト値: 1000 + +1つのクエリで移動できるパーツの数を制限します。ゼロは無制限を意味します。 + +## max_query_size {#max_query_size} + +タイプ: UInt64 + +デフォルト値: 262144 + +SQL パーサーによって解析されるクエリ文字列の最大バイト数。 +INSERT クエリの VALUES 句内のデータは、別のストリームパーサー(O(1) RAM を消費)によって処理され、この制限には影響しません。 + +:::note +`max_query_size` は SQL クエリ内(例えば、`SELECT now() SETTINGS max_query_size=10000`)では設定できません。ClickHouse はクエリを解析するためにバッファを割り当てる必要がありますが、このバッファサイズは実行前に設定する必要がある `max_query_size` 設定によって決まります。 +::: + +## max_read_buffer_size {#max_read_buffer_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +ファイルシステムから読み取るためのバッファの最大サイズ。 + +## max_read_buffer_size_local_fs {#max_read_buffer_size_local_fs} + +タイプ: UInt64 + +デフォルト値: 131072 + +ローカルファイルシステムから読み取るためのバッファの最大サイズ。 0 に設定した場合、max_read_buffer_size が使用されます。 + +## max_read_buffer_size_remote_fs {#max_read_buffer_size_remote_fs} + +タイプ: UInt64 + +デフォルト値: 0 + +リモートファイルシステムから読み取るためのバッファの最大サイズ。 0 に設定した場合、max_read_buffer_size が使用されます。 + +## max_recursive_cte_evaluation_depth {#max_recursive_cte_evaluation_depth} + +タイプ: UInt64 + +デフォルト値: 1000 + +再帰 CTE 評価深度の最大限度。 + +## max_remote_read_network_bandwidth {#max_remote_read_network_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +読み取りのためのネットワーク越しのデータ交換の最大速度(バイト毎秒)。 + +## max_remote_write_network_bandwidth {#max_remote_write_network_bandwidth} + +タイプ: UInt64 + +デフォルト値: 0 + +書き込みのためのネットワーク越しのデータ交換の最大速度(バイト毎秒)。 + +## max_replica_delay_for_distributed_queries {#max_replica_delay_for_distributed_queries} + +タイプ: UInt64 + +デフォルト値: 300 + +分散クエリに対する遅延レプリカを無効にします。詳細は [Replication](../../engines/table-engines/mergetree-family/replication.md) を参照してください。 + +秒単位で時間を設定します。レプリカの遅延が設定値以上に大きい場合は、このレプリカは使用されません。 + +可能な値: + +- 正の整数。 +- 0 — レプリカの遅延はチェックされません。 + +非ゼロの遅延を持つレプリカを使用しないようにするには、このパラメータを1に設定します。 + +レプリケートされたテーブルを指す分散テーブルから `SELECT` を実行する際に使用されます。 + +## max_result_bytes {#max_result_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +結果のサイズ(バイト)が制限されます(未圧縮)。閾値に達すると、データのブロックを処理した後にクエリは停止しますが、結果の最後のブロックは切り捨てられません。したがって、結果のサイズは閾値を超える可能性があります。注意事項: 結果のメモリ内サイズがこの閾値にカウントされます。結果のサイズが小さくても、LowCardinality カラムのDictionaryや、AggregateFunction カラムのアリーナのように、大きなデータ構造をメモリ内で参照している場合、この閾値を超える可能性があります。この設定は非常に低レベルであり、注意して使用する必要があります。 + +## max_result_rows {#max_result_rows} + +タイプ: UInt64 + +デフォルト値: 0 + +結果サイズに関する制限(行)。閾値に達すると、データのブロックを処理した後にクエリは停止しますが、結果の最後のブロックは切り捨てられません。したがって、結果のサイズは閾値を超える可能性があります。 + +## max_rows_in_distinct {#max_rows_in_distinct} + +タイプ: UInt64 + +デフォルト値: 0 + +DISTINCT の実行中の最大要素数。 + +## max_rows_in_join {#max_rows_in_join} + +タイプ: UInt64 + +デフォルト値: 0 + +JOIN のためのハッシュテーブルの最大サイズ(行数)。 + +## max_rows_in_set {#max_rows_in_set} + +タイプ: UInt64 + +デフォルト値: 0 + +IN セクションの実行結果の最大サイズ(要素数)。 + +## max_rows_in_set_to_optimize_join {#max_rows_in_set_to_optimize_join} + +タイプ: UInt64 + +デフォルト値: 0 + +結合テーブルをお互いの行セットでフィルタリングするための最大セットサイズ。 + +可能な値: + +- 0 — 無効。 +- 任意の正の整数。 + +## max_rows_to_group_by {#max_rows_to_group_by} + +タイプ: UInt64 + +デフォルト値: 0 + +GROUP BY中に指定された行数(ユニークなGROUP BYキー)が生成される場合、その動作は 'group_by_overflow_mode' によって決まります。デフォルトでは例外をスローされますが、大まかなGROUP BYモードに切り替えることもできます。 + +## max_rows_to_read {#max_rows_to_read} + +タイプ: UInt64 + +デフォルト値: 0 + +最も「深い」ソースから読み取る行数の制限。つまり、最も深いサブクエリでのみ。リモートサーバーから読み取るときは、この制限はリモートサーバーでのみ確認されます。 + +## max_rows_to_read_leaf {#max_rows_to_read_leaf} + +タイプ: UInt64 + +デフォルト値: 0 + +分散クエリの葉ノードでの読み取り行数の制限。この制限はローカルリードのみに適用され、ルートノードでの最終的なマージステージを除外します。この設定は、prefer_localhost_replica=1 の場合に不安定です。 + +## max_rows_to_sort {#max_rows_to_sort} + +タイプ: UInt64 + +デフォルト値: 0 + +ORDER BY 操作のために処理しなければならないレコード数が指定された量を超えた場合、その動作は 'sort_overflow_mode' によって決まります。デフォルトでは例外がスローされます。 + +## max_rows_to_transfer {#max_rows_to_transfer} + +タイプ: UInt64 + +デフォルト値: 0 + +GLOBAL IN/JOIN セクションが実行される際に伝達される外部テーブルの最大サイズ(行数)。 + +## max_sessions_for_user {#max_sessions_for_user} + +タイプ: UInt64 + +デフォルト値: 0 + +ユーザーのための同時セッションの最大数。 + +## max_size_to_preallocate_for_aggregation {#max_size_to_preallocate_for_aggregation} + +タイプ: UInt64 + +デフォルト値: 100000000 + +集約前に全ハッシュテーブルに合計で事前に確保を許可する要素数。 + +## max_size_to_preallocate_for_joins {#max_size_to_preallocate_for_joins} + +タイプ: UInt64 + +デフォルト値: 100000000 + +結合前に全ハッシュテーブルに合計で事前に確保を許可する要素数。 + +## max_streams_for_merge_tree_reading {#max_streams_for_merge_tree_reading} + +タイプ: UInt64 + +デフォルト値: 0 + +ゼロでない場合、MergeTree テーブルのための読み取りストリームの数を制限します。 +## max_streams_multiplier_for_merge_tables {#max_streams_multiplier_for_merge_tables} + +タイプ: Float + +デフォルト値: 5 + +マージテーブルから読み込む際にストリームを追加します。ストリームは、マージテーブルが使用するテーブルに分散されます。これにより、スレッド間での作業の均等な分配が可能になり、特にマージされたテーブルのサイズが異なる場合に役立ちます。 + +## max_streams_to_max_threads_ratio {#max_streams_to_max_threads_ratio} + +タイプ: Float + +デフォルト値: 1 + +スレッドの数以上のソースを使用できるようにし、作業をスレッド間で均等に分配します。将来的には、ソースの数とスレッドの数を等しくし、それぞれのソースが自ら利用可能な作業を動的に選択できるようになると想定されています。 + +## max_subquery_depth {#max_subquery_depth} + +タイプ: UInt64 + +デフォルト値: 100 + +クエリに指定された数以上のネストされたサブクエリが含まれている場合、例外を投げます。これにより、クラスターのユーザーがクエリで苦しむのを防ぐサニティチェックを提供します。 + +## max_table_size_to_drop {#max_table_size_to_drop} + +タイプ: UInt64 + +デフォルト値: 50000000000 + +クエリ実行時にテーブルを削除する際の制限。値0は、制限なしで全てのテーブルを削除することを意味します。 + +クラウドのデフォルト値: 1 TB。 + +:::note +このクエリ設定は、サーバー設定の同等のものを上書きします。詳細は[こちら](docs/ja/operations/server-configuration-parameters/settings.md/#max-table-size-to-drop)を参照してください。 +::: + +## max_temporary_columns {#max_temporary_columns} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリが中間計算の結果としてメモリ内に指定された数以上の一時カラムを生成した場合、例外が投げられます。ゼロの値は無制限を意味します。この設定は、あまりにも複雑なクエリを防ぐのに役立ちます。 + +## max_temporary_data_on_disk_size_for_query {#max_temporary_data_on_disk_size_for_query} + +タイプ: UInt64 + +デフォルト値: 0 + +すべての同時実行クエリに対して、ディスク上の一時ファイルによって消費されるデータの最大量(バイト単位)。ゼロは無制限を意味します。 + +## max_temporary_data_on_disk_size_for_user {#max_temporary_data_on_disk_size_for_user} + +タイプ: UInt64 + +デフォルト値: 0 + +すべての同時実行ユーザークエリに対して、ディスク上の一時ファイルによって消費されるデータの最大量(バイト単位)。ゼロは無制限を意味します。 + +## max_temporary_non_const_columns {#max_temporary_non_const_columns} + +タイプ: UInt64 + +デフォルト値: 0 + +`max_temporary_columns`設定に類似していますが、非定数カラムのみに適用されます。定数カラムはコストが低いため、より多くの定数カラムを許可するのが合理的です。 + +## max_threads {#max_threads} + +タイプ: MaxThreads + +デフォルト値: 'auto(12)' + +クエリ処理スレッドの最大数。リモートサーバーからデータを取得するためのスレッドは除外されます(`max_distributed_connections`パラメータを参照)。 + +このパラメータは、クエリ処理パイプラインの同じ段階を並行して実行するスレッドに適用されます。例えば、テーブルから読み込む際、関数を用いた式の評価、WHEREでのフィルタリング、およびGROUP BYのための事前集計を最低でも`max_threads`の数のスレッドを使用して並行して実行可能であれば、`max_threads`が使用されます。 + +LIMITによって早く完了するクエリの場合、より少ない`max_threads`を設定できます。例えば、必要な数のエントリが各ブロックに存在し、max_threads = 8であれば、8つのブロックが取得されますが、実際には1つを読むだけで済みます。 + +`max_threads`の値が小さいほど、消費されるメモリは少なくなります。 + +## max_threads_for_indexes {#max_threads_for_indexes} + +タイプ: UInt64 + +デフォルト値: 0 + +インデックスを処理するためのスレッドの最大数。 + +## max_untracked_memory {#max_untracked_memory} + +タイプ: UInt64 + +デフォルト値: 4194304 + +小さなメモリの割り当てと解放はスレッドローカル変数にグループ化され、指定された値よりも大きくなるまでは追跡またはプロファイリングされません。値が'memory_profiler_step'を超える場合、実質的には'memory_profiler_step'に制限されます。 + +## memory_overcommit_ratio_denominator {#memory_overcommit_ratio_denominator} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +これは、グローバルレベルでハードリミットに達したときのソフトメモリリミットを表します。この値は、クエリのオーバーコミット比を計算するために使用されます。ゼロはクエリをスキップすることを意味します。 +[メモリオーバーコミット](memory-overcommit.md)についての詳細をお読みください。 + +## memory_overcommit_ratio_denominator_for_user {#memory_overcommit_ratio_denominator_for_user} + +タイプ: UInt64 + +デフォルト値: 1073741824 + +これは、ユーザーレベルでハードリミットに達したときのソフトメモリリミットを表します。この値は、クエリのオーバーコミット比を計算するために使用されます。ゼロはクエリをスキップすることを意味します。 +[メモリオーバーコミット](memory-overcommit.md)についての詳細をお読みください。 + +## memory_profiler_sample_max_allocation_size {#memory_profiler_sample_max_allocation_size} + +タイプ: UInt64 + +デフォルト値: 0 + +指定された値以下のサイズのランダムな割り当てを`memory_profiler_sample_probability`の確率で収集します。0は無効を意味します。これが期待通りに動作するために、`max_untracked_memory`を0に設定することをお勧めします。 + +## memory_profiler_sample_min_allocation_size {#memory_profiler_sample_min_allocation_size} + +タイプ: UInt64 + +デフォルト値: 0 + +指定された値以上のサイズのランダムな割り当てを`memory_profiler_sample_probability`の確率で収集します。0は無効を意味します。これが期待通りに動作するために、`max_untracked_memory`を0に設定することをお勧めします。 + +## memory_profiler_sample_probability {#memory_profiler_sample_probability} + +タイプ: Float + +デフォルト値: 0 + +ランダムな割り当てと解放を収集し、'MemorySample'トレースタイプでsystem.trace_logに書き込みます。この確率は、サイズに関係なくすべての割り当て/解放に対して適用されます(`memory_profiler_sample_min_allocation_size`と`memory_profiler_sample_max_allocation_size`で変更可能です)。追跡されていないメモリの量が'max_untracked_memory'を超えたときのみサンプリングは行われます。追加の詳細なサンプリングのために`max_untracked_memory`を0に設定することをお勧めします。 + +## memory_profiler_step {#memory_profiler_step} + +タイプ: UInt64 + +デフォルト値: 4194304 + +メモリプロファイラのステップを設定します。クエリのメモリ使用量が次のステップのバイト数よりも大きくなると、メモリプロファイラは割り当てスタックトレースを収集し、それを[trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log)に書き込みます。 + +可能な値: + +- 正の整数(バイト単位)。 + +- メモリプロファイラをオフにするには0を設定します。 + +## memory_tracker_fault_probability {#memory_tracker_fault_probability} + +タイプ: Float + +デフォルト値: 0 + +`exception safety`のテスト - 指定された確率でメモリを割り当てるたびに例外を投げます。 + +## memory_usage_overcommit_max_wait_microseconds {#memory_usage_overcommit_max_wait_microseconds} + +タイプ: UInt64 + +デフォルト値: 5000000 + +ユーザーレベルでのメモリオーバーコミットの場合、スレッドがメモリの解放を待つ最大時間。 +タイムアウトに達し、メモリが解放されない場合、例外が投げられます。 +[メモリオーバーコミット](memory-overcommit.md)についての詳細をお読みください。 + +## merge_tree_coarse_index_granularity {#merge_tree_coarse_index_granularity} + +タイプ: UInt64 + +デフォルト値: 8 + +データを検索する際、ClickHouseはインデックスファイルのデータマークを確認します。必要なキーが特定の範囲に存在する場合、ClickHouseはこの範囲を`merge_tree_coarse_index_granularity`のサブ範囲に分割し、再帰的にそこに必要なキーを探索します。 + +可能な値: + +- 任意の正の偶数整数。 + +## merge_tree_compact_parts_min_granules_to_multibuffer_read {#merge_tree_compact_parts_min_granules_to_multibuffer_read} + +タイプ: UInt64 + +デフォルト値: 16 + +ClickHouse Cloud専用。MergeTreeテーブルのコンパクト部のストライプ内のグラニュール数で、マルチバッファリーダーを使用して並行読み込みとプリフェッチをサポートします。リモートfsから読み込む際にマルチバッファリーダーを使用すると、読み取り要求の数が増加します。 + +## merge_tree_determine_task_size_by_prewhere_columns {#merge_tree_determine_task_size_by_prewhere_columns} + +タイプ: Bool + +デフォルト値: 1 + +読み取りタスクのサイズを決定するためにのみ、前に指定されたカラムのサイズを使用するかどうか。 + +## merge_tree_max_bytes_to_use_cache {#merge_tree_max_bytes_to_use_cache} + +タイプ: UInt64 + +デフォルト値: 2013265920 + +ClickHouseが1つのクエリで`merge_tree_max_bytes_to_use_cache`バイトを超えて読み込む必要がある場合、未圧縮ブロックのキャッシュは使用されません。 + +未圧縮ブロックのキャッシュは、クエリのために抽出されたデータを格納します。ClickHouseは、このキャッシュを使用して繰り返される小さなクエリへの応答を迅速化します。この設定は、大量のデータを読み込むクエリによってキャッシュが破壊されるのを防ぎます。[uncompressed_cache_size](../../operations/server-configuration-parameters/settings.md/#server-settings-uncompressed_cache_size)サーバー設定は、未圧縮ブロックのキャッシュのサイズを定義します。 + +可能な値: + +- 任意の正の整数。 + +## merge_tree_max_rows_to_use_cache {#merge_tree_max_rows_to_use_cache} + +タイプ: UInt64 + +デフォルト値: 1048576 + +ClickHouseが1つのクエリで`merge_tree_max_rows_to_use_cache`行を超えて読み込む必要がある場合、未圧縮ブロックのキャッシュは使用されません。 + +未圧縮ブロックのキャッシュは、クエリのために抽出されたデータを格納します。ClickHouseは、このキャッシュを使用して繰り返される小さなクエリへの応答を迅速化します。この設定は、大量のデータを読み込むクエリによってキャッシュが破壊されるのを防ぎます。[uncompressed_cache_size](../../operations/server-configuration-parameters/settings.md/#server-settings-uncompressed_cache_size)サーバー設定は、未圧縮ブロックのキャッシュのサイズを定義します。 + +可能な値: + +- 任意の正の整数。 + +## merge_tree_min_bytes_for_concurrent_read {#merge_tree_min_bytes_for_concurrent_read} + +タイプ: UInt64 + +デフォルト値: 251658240 + +MergeTreeエンジンテーブルの1ファイルから読み取るバイト数が`merge_tree_min_bytes_for_concurrent_read`を超える場合、ClickHouseはこのファイルから複数のスレッドでの並行読み取りを試みます。 + +可能な値: + +- 正の整数。 + +## merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem {#merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem} + +タイプ: UInt64 + +デフォルト値: 0 + +リモートファイルシステムからの読み取り時に、MergeTreeエンジンが読み取りを並列化できるようにする前に、1ファイルから読み取るバイト数の最小値です。この設定の使用は推奨されません。 + +可能な値: + +- 正の整数。 + +## merge_tree_min_bytes_for_seek {#merge_tree_min_bytes_for_seek} + +タイプ: UInt64 + +デフォルト値: 0 + +1ファイル内の2つのデータブロックの間の距離が`merge_tree_min_bytes_for_seek`バイト未満である場合、ClickHouseは両方のブロックを含むファイルの範囲を sequentiallyに読み込み、余分なシークを回避します。 + +可能な値: + +- 任意の正の整数。 + +## merge_tree_min_bytes_per_task_for_remote_reading {#merge_tree_min_bytes_per_task_for_remote_reading} + +タイプ: UInt64 + +デフォルト値: 2097152 + +タスクごとに読み取るバイト数の最小値。 + +## merge_tree_min_read_task_size {#merge_tree_min_read_task_size} + +タイプ: UInt64 + +デフォルト値: 8 + +タスクサイズの絶対下限(グラニュール数が少なく、利用可能なスレッド数が多くても小さなタスクを割り当てません)。 + +## merge_tree_min_rows_for_concurrent_read {#merge_tree_min_rows_for_concurrent_read} + +タイプ: UInt64 + +デフォルト値: 163840 + +1ファイルから読み取る行数が`merge_tree_min_rows_for_concurrent_read`を超える場合、ClickHouseはこのファイルから複数のスレッドでの並行読み取りを試みます。 + +可能な値: + +- 正の整数。 + +## merge_tree_min_rows_for_concurrent_read_for_remote_filesystem {#merge_tree_min_rows_for_concurrent_read_for_remote_filesystem} + +タイプ: UInt64 + +デフォルト値: 0 + +リモートファイルシステムからの読み取り時に、MergeTreeエンジンが読み取りを並列化できるようにする前に、1ファイルから読み取る行数の最小値です。この設定の使用は推奨されません。 + +可能な値: + +- 正の整数。 + +## merge_tree_min_rows_for_seek {#merge_tree_min_rows_for_seek} + +タイプ: UInt64 + +デフォルト値: 0 + +1ファイル内の2つのデータブロックの間の距離が`merge_tree_min_rows_for_seek`行未満である場合、ClickHouseはファイルをシークせず、データを逐次読み込みます。 + +可能な値: + +- 任意の正の整数。 + +## merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_injection_probability {#merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_injection_probability} + +タイプ: Float + +デフォルト値: 0 + +`PartsSplitter`のテスト - MergeTreeからデータを読み取る際に、指定された確率で範囲を交差するものと交差しないものに分割します。 + +## merge_tree_use_const_size_tasks_for_remote_reading {#merge_tree_use_const_size_tasks_for_remote_reading} + +タイプ: Bool + +デフォルト値: 1 + +リモートテーブルから読み取る際に、固定サイズのタスクを使用するかどうか。 + +## metrics_perf_events_enabled {#metrics_perf_events_enabled} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、クエリの実行中に一部のパフォーマンスイベントが測定されます。 + +## metrics_perf_events_list {#metrics_perf_events_list} + +タイプ: String + +デフォルト値: + +クエリの実行中に測定されるパフォーマンスメトリクスをコンマで区切ったリスト。空はすべてのイベントを意味します。利用可能なイベントについては、ソースのPerfEventInfoを参照してください。 + +## min_bytes_to_use_direct_io {#min_bytes_to_use_direct_io} + +タイプ: UInt64 + +デフォルト値: 0 + +ストレージディスクに対してダイレクトI/Oアクセスを使用するために必要な最小データボリューム。 + +ClickHouseは、テーブルからデータを読み込む際にこの設定を使用します。読み取るデータの総ストレージボリュームが`min_bytes_to_use_direct_io`バイトを超える場合、ClickHouseは`O_DIRECT`オプションを使ってストレージディスクからデータを読み取ります。 + +可能な値: + +- 0 — ダイレクトI/Oは無効。 +- 正の整数。 + +## min_bytes_to_use_mmap_io {#min_bytes_to_use_mmap_io} + +タイプ: UInt64 + +デフォルト値: 0 + +これはエクスペリメンタルな設定です。カーネルからユーザースペースにデータをコピーしないで大きなファイルを読み取るための最小メモリ量を設定します。推奨されるしきい値は約64 MBです。なぜなら、[mmap/munmap](https://en.wikipedia.org/wiki/Mmap)は遅いからです。これは大きなファイルのみに意味があり、データがページキャッシュに存在する場合にのみ役立ちます。 + +可能な値: + +- 正の整数。 +- 0 — 大きなファイルはカーネルからユーザースペースにデータをコピーするのみで読み込まれます。 + +## min_chunk_bytes_for_parallel_parsing {#min_chunk_bytes_for_parallel_parsing} + +タイプ: UInt64 + +デフォルト値: 10485760 + +- タイプ: 正の整数 +- デフォルト値: 1 MiB + +各スレッドが並行して解析する最小チャンクサイズ(バイト単位)。 + +## min_compress_block_size {#min_compress_block_size} + +タイプ: UInt64 + +デフォルト値: 65536 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)テーブル用。クエリ処理時のレイテンシを減少させるために、次のマークを書き込む際、そのサイズが`min_compress_block_size`以上であればブロックが圧縮されます。デフォルトは65,536です。 + +未圧縮データの実際のサイズが`max_compress_block_size`未満であれば、ブロックのサイズはこの値以上、かつ1マーク分のデータ量以上でなければなりません。 + +例を見てみましょう。`index_granularity`がテーブル作成時に8192に設定されていたとします。 + +UInt32型のカラム(値あたり4バイト)を書き込む場合。8192行を書き込むと、合計32 KBのデータになります。`min_compress_block_size`が65,536であるため、2マークごとに圧縮ブロックが形成されます。 + +URL型のカラム(平均サイズ60バイト)の場合も見てみましょう。8192行を書き込むと、平均で500 KB弱のデータになります。これは65,536を超えているため、各マークごとに圧縮ブロックが形成されます。この場合、ディスクから単一のマークの範囲を読み込むときに余分なデータは解凍されません。 + +:::note +これは専門家向けの設定であり、ClickHouseを使用し始めたばかりの人が変更するべきではありません。 +::: + +## min_count_to_compile_aggregate_expression {#min_count_to_compile_aggregate_expression} + +タイプ: UInt64 + +デフォルト値: 3 + +JITコンパイルを開始するための同一の集約式の最小数。この設定は、[compile_aggregate_expressions](#compile_aggregate_expressions)が有効になっている場合にのみ機能します。 + +可能な値: + +- 正の整数。 +- 0 — 同一の集約式は常にJITコンパイルされます。 + +## min_count_to_compile_expression {#min_count_to_compile_expression} + +タイプ: UInt64 + +デフォルト値: 3 + +コンパイルが開始される前に実行される同じ式の最小カウント。 + +## min_count_to_compile_sort_description {#min_count_to_compile_sort_description} + +タイプ: UInt64 + +デフォルト値: 3 + +JITコンパイルされる前の同一のソート説明の数。 + +## min_execution_speed {#min_execution_speed} + +タイプ: UInt64 + +デフォルト値: 0 + +1秒あたりの実行行数の最小値。 + +## min_execution_speed_bytes {#min_execution_speed_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +1秒あたりの実行バイト数の最小値。 + +## min_external_table_block_size_bytes {#min_external_table_block_size_bytes} + +タイプ: UInt64 + +デフォルト値: 268402944 + +外部テーブルに渡されるブロックを指定されたバイトサイズに圧縮します。ブロックが十分に大きくない場合。 + +## min_external_table_block_size_rows {#min_external_table_block_size_rows} + +タイプ: UInt64 + +デフォルト値: 1048449 + +外部テーブルに渡されたブロックを指定された行数に圧縮します。ブロックが十分に大きくない場合。 + +## min_free_disk_bytes_to_perform_insert {#min_free_disk_bytes_to_perform_insert} + +タイプ: UInt64 + +デフォルト値: 0 + +挿入を行うために必要な最小空きディスク容量 (バイト単位)。 + +## min_free_disk_ratio_to_perform_insert {#min_free_disk_ratio_to_perform_insert} + +タイプ: Float + +デフォルト値: 0 + +挿入を行うために必要な最小空きディスクスペースの比率。 + +## min_free_disk_space_for_temporary_data {#min_free_disk_space_for_temporary_data} + +タイプ: UInt64 + +デフォルト値: 0 + +外部ソートや集約で使用される一時データの書き込み中に保持する必要がある最小ディスクスペース。 + +## min_hit_rate_to_use_consecutive_keys_optimization {#min_hit_rate_to_use_consecutive_keys_optimization} + +タイプ: Float + +デフォルト値: 0.5 + +合計キー最適化を保持するために使用されるキャッシュの最小ヒット率。 + +## min_insert_block_size_bytes {#min_insert_block_size_bytes} + +タイプ: UInt64 + +デフォルト値: 268402944 + +`INSERT`クエリによってテーブルに挿入できるブロック内の最小バイト数を設定します。小さいサイズのブロックは大きなブロックに圧縮されます。 + +可能な値: + +- 正の整数。 +- 0 — 圧縮無効。 + +## min_insert_block_size_bytes_for_materialized_views {#min_insert_block_size_bytes_for_materialized_views} + +タイプ: UInt64 + +デフォルト値: 0 + +`INSERT`クエリによってテーブルに挿入できるブロック内の最小バイト数を設定します。小さいサイズのブロックは大きなブロックに圧縮されます。この設定は、[マテリアライズドビュー](../../sql-reference/statements/create/view.md)に挿入されるブロックのみに適用されます。この設定を調整することで、マテリアライズドビューにプッシュする際のブロック圧縮を制御し、過剰なメモリ使用を回避します。 + +可能な値: + +- 任意の正の整数。 +- 0 — 圧縮無効。 + +**詳細情報** + +- [min_insert_block_size_bytes](#min-insert-block-size-bytes) + +## min_insert_block_size_rows {#min_insert_block_size_rows} + +タイプ: UInt64 + +デフォルト値: 1048449 + +`INSERT`クエリによってテーブルに挿入できるブロック内の最小行数を設定します。小さいサイズのブロックは大きなブロックに圧縮されます。 + +可能な値: + +- 正の整数。 +- 0 — 圧縮無効。 + +## min_insert_block_size_rows_for_materialized_views {#min_insert_block_size_rows_for_materialized_views} + +タイプ: UInt64 + +デフォルト値: 0 + +`INSERT`クエリによってテーブルに挿入できるブロック内の最小行数を設定します。小さいサイズのブロックは大きなブロックに圧縮されます。この設定は、[マテリアライズドビュー](../../sql-reference/statements/create/view.md)に挿入されるブロックのみに適用されます。この設定を調整することで、マテリアライズドビューにプッシュする際のブロック圧縮を制御し、過剰なメモリ使用を回避します。 + +可能な値: + +- 任意の正の整数。 +- 0 — 圧縮無効。 + +**詳細情報** + +- [min_insert_block_size_rows](#min-insert-block-size-rows) + +## mongodb_throw_on_unsupported_query {#mongodb_throw_on_unsupported_query} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、MongoDBクエリを構築できない場合、MongoDBテーブルはエラーを返します。そうでない場合、ClickHouseはテーブル全体を読み込み、ローカルで処理します。このオプションは、レガシー実装や`allow_experimental_analyzer=0`のときには適用されません。 + +## move_all_conditions_to_prewhere {#move_all_conditions_to_prewhere} + +タイプ: Bool + +デフォルト値: 1 + +WHEREからPREWHEREにすべての適用可能な条件を移動します。 + +## move_primary_key_columns_to_end_of_prewhere {#move_primary_key_columns_to_end_of_prewhere} + +タイプ: Bool + +デフォルト値: 1 + +主キー列を含むPREWHERE条件をANDチェーンの最後に移動します。これらの条件は主キー分析中に考慮される可能性が高く、PREWHEREフィルタリングには多く寄与しないと考えられます。 + +## multiple_joins_try_to_keep_original_names {#multiple_joins_try_to_keep_original_names} + +タイプ: Bool + +デフォルト値: 0 + +複数の結合のリライト時にトップレベルの式リストにエイリアスを追加しない。 + +## mutations_execute_nondeterministic_on_initiator {#mutations_execute_nondeterministic_on_initiator} + +タイプ: Bool + +デフォルト値: 0 + +この値がtrueの場合、定数非決定性関数(例えば、関数`now()`)はイニシエーター上で実行され、`UPDATE`および`DELETE`クエリのリテラルに置き換えられます。これは、定数非決定性関数を含む変異を実行中にデータをレプリカ間で同期させるのに役立ちます。デフォルト値: `false`。 + +## mutations_execute_subqueries_on_initiator {#mutations_execute_subqueries_on_initiator} + +タイプ: Bool + +デフォルト値: 0 + +この値がtrueの場合、スカラサブクエリはイニシエーター上で実行され、`UPDATE`および`DELETE`クエリのリテラルに置き換えられます。デフォルト値: `false`。 + +## mutations_max_literal_size_to_replace {#mutations_max_literal_size_to_replace} + +タイプ: UInt64 + +デフォルト値: 16384 + +`UPDATE`および`DELETE`クエリで置換されるシリアライズされたリテラルの最大サイズ(バイト単位)。上記の2つの設定のうち少なくとも1つが有効な場合にのみ有効です。デフォルト値: 16384(16 KiB)。 + +## mutations_sync {#mutations_sync} + +タイプ: UInt64 + +デフォルト値: 0 + +`ALTER TABLE ... UPDATE|DELETE|MATERIALIZE INDEX|MATERIALIZE PROJECTION|MATERIALIZE COLUMN`クエリ([変異](../../sql-reference/statements/alter/index.md#mutations))を同期的に実行することを許可します。 + +可能な値: + +- 0 - 変異は非同期で実行されます。 +- 1 - クエリは現在のサーバー上で全ての変異が完了するのを待ちます。 +- 2 - クエリは全てのレプリカ(存在する場合)で全ての変異が完了するのを待ちます。 + +## mysql_datatypes_support_level {#mysql_datatypes_support_level} + +タイプ: MySQLDataTypesSupport + +デフォルト値: + +MySQLデータ型がそれに対応するClickHouseデータ型に変換される方法を定義します。`decimal`、`datetime64`、`date2Date32`または`date2String`のいずれかの組み合わせにコンマで区切られたリスト。 +- `decimal`: 精度が許す限り、`NUMERIC`および`DECIMAL`型を`Decimal`に変換します。 +- `datetime64`: 精度が`0`でない場合、`DATETIME`および`TIMESTAMP`型を`DateTime64`に変換します。 +- `date2Date32`: `DATE`を`Date32`に変換します(`Date`の代わりに)。これは`date2String`より優先されます。 +- `date2String`: `DATE`を`String`に変換します(`Date`の代わりに)。`datetime64`によって上書きされます。 + +## mysql_map_fixed_string_to_text_in_show_columns {#mysql_map_fixed_string_to_text_in_show_columns} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、[FixedString](../../sql-reference/data-types/fixedstring.md)のClickHouseデータ型は、[SHOW COLUMNS](../../sql-reference/statements/show.md#show_columns)で`TEXT`として表示されます。 + +これは、MySQLワイヤプロトコルを介して接続されている場合にのみ有効です。 + +- 0 - `BLOB`を使用。 +- 1 - `TEXT`を使用。 + +## mysql_map_string_to_text_in_show_columns {#mysql_map_string_to_text_in_show_columns} + +タイプ: Bool + +デフォルト値: 1 + +有効にすると、[String](../../sql-reference/data-types/string.md)のClickHouseデータ型は、[SHOW COLUMNS](../../sql-reference/statements/show.md#show_columns)で`TEXT`として表示されます。 + +これは、MySQLワイヤプロトコルを介して接続されている場合にのみ有効です。 + +- 0 - `BLOB`を使用。 +- 1 - `TEXT`を使用。 + +## mysql_max_rows_to_insert {#mysql_max_rows_to_insert} + +タイプ: UInt64 + +デフォルト値: 65536 + +MySQLストレージエンジンのMySQLバッチ挿入における最大行数。 + +## network_compression_method {#network_compression_method} + +タイプ: String + +デフォルト値: LZ4 + +サーバー間およびサーバーと[clickhouse-client](../../interfaces/cli.md)間の通信に使用されるデータ圧縮方式を設定します。 + +可能な値: + +- `LZ4` — LZ4圧縮方式を設定。 +- `ZSTD` — ZSTD圧縮方式を設定。 + +**詳細情報** + +- [network_zstd_compression_level](#network_zstd_compression_level) + +## network_zstd_compression_level {#network_zstd_compression_level} + +タイプ: Int64 + +デフォルト値: 1 + +ZSTD圧縮のレベルを調整します。[network_compression_method](#network_compression_method)が`ZSTD`に設定されているときのみ使用されます。 + +可能な値: + +- 1から15までの正の整数。 + +## normalize_function_names {#normalize_function_names} + +タイプ: Bool + +デフォルト値: 1 + +関数名をその正規名に正規化します。 + +## number_of_mutations_to_delay {#number_of_mutations_to_delay} + +タイプ: UInt64 + +デフォルト値: 0 + +変異したテーブルに未処理の変異が少なくともその数ある場合、テーブルの変異を人工的に遅らせる。0 - 無効。 + +## number_of_mutations_to_throw {#number_of_mutations_to_throw} + +タイプ: UInt64 + +デフォルト値: 0 + +変異したテーブルに未処理の変異が少なくともその数ある場合、 'Too many mutations ...' 例外を投げる。0 - 無効。 + +## odbc_bridge_connection_pool_size {#odbc_bridge_connection_pool_size} + +タイプ: UInt64 + +デフォルト値: 16 + +ODBCブリッジ内の各接続設定文字列の接続プールサイズ。 + +## odbc_bridge_use_connection_pooling {#odbc_bridge_use_connection_pooling} + +タイプ: Bool + +デフォルト値: 1 + +ODBCブリッジで接続プールを使用します。falseに設定すると、毎回新しい接続が作成されます。 + +## offset {#offset} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリから返される行の前にスキップする行数を設定します。[OFFSET](../../sql-reference/statements/select/offset.md/#offset-fetch)句によって設定されたオフセットを調整し、これら2つの値を合計します。 + +可能な値: + +- 0 — 行はスキップされません。 +- 正の整数。 + +**例** + +入力テーブル: + +``` sql +CREATE TABLE test (i UInt64) ENGINE = MergeTree() ORDER BY i; +INSERT INTO test SELECT number FROM numbers(500); +``` + +クエリ: + +``` sql +SET limit = 5; +SET offset = 7; +SELECT * FROM test LIMIT 10 OFFSET 100; +``` +結果: + +``` text +┌───i─┐ +│ 107 │ +│ 108 │ +│ 109 │ +└─────┘ +``` + +## opentelemetry_start_trace_probability {#opentelemetry_start_trace_probability} + +タイプ: Float + +デフォルト値: 0 + +ClickHouseが実行されたクエリのトレースを開始できる確率を設定します(親[トレースコンテキスト](https://www.w3.org/TR/trace-context/)が提供されていない場合)。 + +可能な値: + +- 0 — 実行されたすべてのクエリのトレースが無効になります(親トレースコンテキストが提供されていない場合)。 +- 0..1の範囲内の正の浮動小数点数。例えば、設定値が`0.5`の場合、ClickHouseは平均して半分のクエリでトレースを開始することができます。 +- 1 — 実行されたすべてのクエリのトレースが有効になります。 + +## opentelemetry_trace_processors {#opentelemetry_trace_processors} + +タイプ: Bool + +デフォルト値: 0 + +プロセッサのためにOpenTelemetryスパンを収集します。 + +## optimize_aggregation_in_order {#optimize_aggregation_in_order} + +タイプ: Bool + +デフォルト値: 0 + +MergeTreeテーブルのデータを対応する順序で集約するために[SELECT](../../sql-reference/statements/select/index.md)クエリの`GROUP BY`最適化を有効にします。 + +可能な値: + +- 0 — `GROUP BY`最適化は無効。 +- 1 — `GROUP BY`最適化は有効。 + +**詳細情報** + +- [GROUP BY最適化](../../sql-reference/statements/select/group-by.md/#aggregation-in-order) + +## optimize_aggregators_of_group_by_keys {#optimize_aggregators_of_group_by_keys} + +タイプ: Bool + +デフォルト値: 1 + +SELECTセクションでGROUP BYキーの最小/最大/any/anyLastアグリゲーターを排除します。 + +## optimize_append_index {#optimize_append_index} + +タイプ: Bool + +デフォルト値: 0 + +インデックス条件を追加するために[制約](../../sql-reference/statements/create/table.md#constraints)を使用します。デフォルトは`false`です。 + +可能な値: + +- true, false + +## optimize_arithmetic_operations_in_aggregate_functions {#optimize_arithmetic_operations_in_aggregate_functions} + +タイプ: Bool + +デフォルト値: 1 + +集約関数の外で算術演算を移動します。 + +## optimize_count_from_files {#optimize_count_from_files} + +タイプ: Bool + +デフォルト値: 1 + +異なる入力形式のファイルからの行数のカウントの最適化を有効または無効にします。これはテーブル関数/エンジン`file`/`s3`/`url`/`hdfs`/`azureBlobStorage`に適用されます。 + +可能な値: + +- 0 — 最適化無効。 +- 1 — 最適化有効。 + +## optimize_distinct_in_order {#optimize_distinct_in_order} + +タイプ: Bool + +デフォルト値: 1 + +DISTINCTの最適化を有効にし、DISTINCTの一部のカラムがソートのプレフィックスを形成する場合に適用されます。例えば、マージツリーまたはORDER BYステートメントのソートキーのプレフィックス。 + +## optimize_distributed_group_by_sharding_key {#optimize_distributed_group_by_sharding_key} + +タイプ: Bool + +デフォルト値: 1 + +コストのかかるイニシエーターサーバーでの集約を避けることにより、`GROUP BY sharding_key`クエリを最適化します。これにより、イニシエーターサーバーでのメモリ使用量が削減されます。 +以下のタイプのクエリがサポートされています(そのすべての組み合わせも含まれます): + +- `SELECT DISTINCT [..., ]sharding_key[, ...] FROM dist` +- `SELECT ... FROM dist GROUP BY sharding_key[, ...]` +- `SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY x` +- `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1` +- `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x` + +次の種類のクエリはサポートされていません(いくつかは後でサポートされる可能性があります): + +- `SELECT ... GROUP BY sharding_key[, ...] WITH TOTALS` +- `SELECT ... GROUP BY sharding_key[, ...] WITH ROLLUP` +- `SELECT ... GROUP BY sharding_key[, ...] WITH CUBE` +- `SELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1` + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +参照: + +- [distributed_group_by_no_merge](#distributed-group-by-no-merge) +- [distributed_push_down_limit](#distributed-push-down-limit) +- [optimize_skip_unused_shards](#optimize-skip-unused-shards) + +:::note +現在のところ、`optimize_skip_unused_shards`が必要です(これには、データが分散テーブル経由で挿入され、そのためデータがsharding_keyに従って分散されている場合にのみ正しく動作するという理由があります)。 +::: + +## optimize_functions_to_subcolumns {#optimize_functions_to_subcolumns} + +タイプ: Bool + +デフォルト値: 1 + +サブカラムの読み込みに変換することによって最適化を有効または無効にします。これにより、読み込むデータの量が減ります。 + +これらの関数は変換可能です: + +- [length](../../sql-reference/functions/array-functions.md/#array_functions-length)を[サイズ0](../../sql-reference/data-types/array.md/#array-size)サブカラムを読み込むために使用。 +- [empty](../../sql-reference/functions/array-functions.md/#function-empty)を[サイズ0](../../sql-reference/data-types/array.md/#array-size)サブカラムを読み込むために使用。 +- [notEmpty](../../sql-reference/functions/array-functions.md/#function-notempty)を[サイズ0](../../sql-reference/data-types/array.md/#array-size)サブカラムを読み込むために使用。 +- [isNull](../../sql-reference/operators/index.md#operator-is-null)を[nullable](../../sql-reference/data-types/nullable.md/#finding-null)サブカラムを読み込むために使用。 +- [isNotNull](../../sql-reference/operators/index.md#is-not-null)を[nullable](../../sql-reference/data-types/nullable.md/#finding-null)サブカラムを読み込むために使用。 +- [count](../../sql-reference/aggregate-functions/reference/count.md)を[nullable](../../sql-reference/data-types/nullable.md/#finding-null)サブカラムを読み込むために使用。 +- [mapKeys](../../sql-reference/functions/tuple-map-functions.md/#mapkeys)を[keys](../../sql-reference/data-types/map.md/#map-subcolumns)サブカラムを読み込むために使用。 +- [mapValues](../../sql-reference/functions/tuple-map-functions.md/#mapvalues)を[values](../../sql-reference/data-types/map.md/#map-subcolumns)サブカラムを読み込むために使用。 + +可能な値: + +- 0 — 最適化無効。 +- 1 — 最適化有効。 + +## optimize_group_by_constant_keys {#optimize_group_by_constant_keys} + +タイプ: Bool + +デフォルト値: 1 + +すべてのキーが定数である場合のGROUP BYを最適化します。 + +## optimize_group_by_function_keys {#optimize_group_by_function_keys} + +タイプ: Bool + +デフォルト値: 1 + +GROUP BYセクションの他のキーの関数を排除します。 + +## optimize_if_chain_to_multiif {#optimize_if_chain_to_multiif} + +タイプ: Bool + +デフォルト値: 0 + +if(cond1, then1, if(cond2, ...))のチェーンをmultiIfに置き換えます。現在、数値型には有益ではありません。 + +## optimize_if_transform_strings_to_enum {#optimize_if_transform_strings_to_enum} + +タイプ: Bool + +デフォルト値: 0 + +IfおよびTransformの文字列型引数をenumに置き換えます。デフォルトでは無効です。これは、分散クエリに矛盾した変更をもたらし、それが失敗につながる可能性があるためです。 + +## optimize_injective_functions_in_group_by {#optimize_injective_functions_in_group_by} + +タイプ: Bool + +デフォルト値: 1 + +GROUP BYセクションで引数によって射影関数を置き換えます。 + +## optimize_injective_functions_inside_uniq {#optimize_injective_functions_inside_uniq} + +タイプ: Bool + +デフォルト値: 1 + +uniq*()関数内の単一引数の射影関数を削除します。 + +## optimize_min_equality_disjunction_chain_length {#optimize_min_equality_disjunction_chain_length} + +タイプ: UInt64 + +デフォルト値: 3 + +最適化のための式`expr = x1 OR ... expr = xN`の最小長さ。 + +## optimize_min_inequality_conjunction_chain_length {#optimize_min_inequality_conjunction_chain_length} + +タイプ: UInt64 + +デフォルト値: 3 + +最適化のための式`expr <> x1 AND ... expr <> xN`の最小長さ。 + +## optimize_move_to_prewhere {#optimize_move_to_prewhere} + +タイプ: Bool + +デフォルト値: 1 + +[SELECT](../../sql-reference/statements/select/index.md)クエリでの自動[PREFIX](../../sql-reference/statements/select/prewhere.md)最適化を有効または無効にします。 + +これは[*MergeTree](../../engines/table-engines/mergetree-family/index.md)テーブルにのみ適用されます。 + +可能な値: + +- 0 — 自動`PREWHERE`最適化無効。 +- 1 — 自動`PREWHERE`最適化有効。 + +## optimize_move_to_prewhere_if_final {#optimize_move_to_prewhere_if_final} + +タイプ: Bool + +デフォルト値: 0 + +[FINAL](../../sql-reference/statements/select/from.md#select-from-final)修飾子を持つ[SELECT](../../sql-reference/statements/select/index.md)クエリにおける自動[PREFIX](../../sql-reference/statements/select/prewhere.md)最適化を有効または無効にします。 + +これは[*MergeTree](../../engines/table-engines/mergetree-family/index.md)テーブルにのみ適用されます。 + +可能な値: + +- 0 — `FINAL`修飾子のある`SELECT`クエリでの自動`PREWHERE`最適化無効。 +- 1 — `FINAL`修飾子のある`SELECT`クエリでの自動`PREWHERE`最適化有効。 + +**参照** + +- [optimize_move_to_prewhere](#optimize_move_to_prewhere)設定 + +## optimize_multiif_to_if {#optimize_multiif_to_if} + +タイプ: Bool + +デフォルト値: 1 + +`multiIf`の条件を1つに置き換えます。 + +## optimize_normalize_count_variants {#optimize_normalize_count_variants} + +タイプ: Bool + +デフォルト値: 1 + +semantically equal count()として集計関数を再記述します。 + +## optimize_on_insert {#optimize_on_insert} + +タイプ: Bool + +デフォルト値: 1 + +挿入の前にデータ変換を有効または無効にします。これは、テーブルエンジンに従って(マージがこのブロックで実行されたかのように)行われます。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +**例** + +有効と無効の違い: + +クエリ: + +```sql +SET optimize_on_insert = 1; + +CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable; + +INSERT INTO test1 SELECT number % 2 FROM numbers(5); + +SELECT * FROM test1; + +SET optimize_on_insert = 0; + +CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable; + +INSERT INTO test2 SELECT number % 2 FROM numbers(5); + +SELECT * FROM test2; +``` + +結果: + +``` text +┌─FirstTable─┐ +│ 0 │ +│ 1 │ +└────────────┘ + +┌─SecondTable─┐ +│ 0 │ +│ 0 │ +│ 0 │ +│ 1 │ +│ 1 │ +└─────────────┘ +``` + +この設定は[Materialized view](../../sql-reference/statements/create/view.md/#materialized)や[MaterializedMySQL](../../engines/database-engines/materialized-mysql.md)の動作に影響を与えることに注意してください。 + +## optimize_or_like_chain {#optimize_or_like_chain} + +タイプ: Bool + +デフォルト値: 0 + +複数のOR LIKEをmultiMatchAnyに最適化します。この最適化はデフォルトでは無効にすべきです。なぜなら、場合によってはインデックス分析を無効にするためです。 + +## optimize_read_in_order {#optimize_read_in_order} + +タイプ: Bool + +デフォルト値: 1 + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)テーブルからデータを読み取るための[ORDER BY](../../sql-reference/statements/select/order-by.md/#optimize_read_in_order)最適化を有効または無効にします。 + +可能な値: + +- 0 — `ORDER BY`最適化無効。 +- 1 — `ORDER BY`最適化有効。 + +**参照** + +- [ORDER BY句](../../sql-reference/statements/select/order-by.md/#optimize_read_in_order) + +## optimize_read_in_window_order {#optimize_read_in_window_order} + +タイプ: Bool + +デフォルト値: 1 + +MergeTreeテーブルでのウィンドウ句におけるORDER BY最適化を有効にします。 + +## optimize_redundant_functions_in_order_by {#optimize_redundant_functions_in_order_by} + +タイプ: Bool + +デフォルト値: 1 + +ORDER BY内の引数がORDER BYに含まれている場合、ORDER BYから関数を削除します。 + +## optimize_respect_aliases {#optimize_respect_aliases} + +タイプ: Bool + +デフォルト値: 1 + +この設定がtrueに設定されている場合、WHERE/GROUP BY/ORDER BY内のエイリアスを尊重し、パーティションプルーニング/セカンダリインデックス/optimize_aggregation_in_order/optimize_read_in_order/optimize_trivial_countで助けになります。 + +## optimize_rewrite_aggregate_function_with_if {#optimize_rewrite_aggregate_function_with_if} + +タイプ: Bool + +デフォルト値: 1 + +論理的に等しい場合、if式を引数とする集計関数を再記述します。たとえば、`avg(if(cond, col, null))`は`avgOrNullIf(cond, col)`に再記述できます。性能を改善する可能性があります。 + +:::note +これは分析器(`enable_analyzer = 1`)でのみサポートされます。 +::: + +## optimize_rewrite_array_exists_to_has {#optimize_rewrite_array_exists_to_has} + +タイプ: Bool + +デフォルト値: 0 + +論理的に等しい場合、arrayExists()関数をhas()に再記述します。たとえば、arrayExists(x -> x = 1, arr)はhas(arr, 1)に再記述できます。 + +## optimize_rewrite_sum_if_to_count_if {#optimize_rewrite_sum_if_to_count_if} + +タイプ: Bool + +デフォルト値: 1 + +論理的に等しい場合、sumIf()およびsum(if())関数をcountIf()関数に再記述します。 + +## optimize_skip_merged_partitions {#optimize_skip_merged_partitions} + +タイプ: Bool + +デフォルト値: 0 + +一つのパーティションにアクティブなパーツが1つだけあり、期限切れのTTLがない場合に、[OPTIMIZE TABLE ... FINAL](../../sql-reference/statements/optimize.md)クエリのための最適化を有効または無効にします。 + +- `OPTIMIZE TABLE ... FINAL SETTINGS optimize_skip_merged_partitions=1` + +デフォルトでは、`OPTIMIZE TABLE ... FINAL`クエリは、単一の部分があっても書き換えられます。 + +可能な値: + +- 1 - 最適化有効。 +- 0 - 最適化無効。 + +## optimize_skip_unused_shards {#optimize_skip_unused_shards} + +タイプ: Bool + +デフォルト値: 0 + +`WHERE/PREWHERE`の条件にsharding keyが含まれている[SELECT](../../sql-reference/statements/select/index.md)クエリに対して未使用のシャードのスキップを有効または無効にします(データがsharding keyによって分散されていると仮定)。さもなければ、クエリは不正確な結果を返します。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## optimize_skip_unused_shards_limit {#optimize_skip_unused_shards_limit} + +タイプ: UInt64 + +デフォルト値: 1000 + +sharding key値の制限で、制限に達することによって`optimize_skip_unused_shards`をオフにします。 + +あまりにも多くの値があると処理に多大な時間がかかる可能性がありますが、利益は疑わしいです。なぜなら、`IN (...)`内に大量の値がある場合、ほとんどの場合、クエリはすべてのシャードに送信されるためです。 + +## optimize_skip_unused_shards_nesting {#optimize_skip_unused_shards_nesting} + +タイプ: UInt64 + +デフォルト値: 0 + +分散クエリのネストレベルに応じて[`optimize_skip_unused_shards`](#optimize-skip-unused-shards)を制御します(たとえば、別の`Distributed`テーブルを参照する`Distributed`テーブルがある場合)。 + +可能な値: + +- 0 — 無効、`optimize_skip_unused_shards`は常に動作します。 +- 1 — 最初のレベルに対してのみ`optimize_skip_unused_shards`を有効にします。 +- 2 — 2番目のレベルまで`optimize_skip_unused_shards`を有効にします。 + +## optimize_skip_unused_shards_rewrite_in {#optimize_skip_unused_shards_rewrite_in} + +タイプ: Bool + +デフォルト値: 1 + +リモートシャードのクエリ内のINを再記述し、シャードに属さない値を除外します(`optimize_skip_unused_shards`が必要です)。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## optimize_sorting_by_input_stream_properties {#optimize_sorting_by_input_stream_properties} + +タイプ: Bool + +デフォルト値: 1 + +入力ストリームのプロパティによるソートを最適化します。 + +## optimize_substitute_columns {#optimize_substitute_columns} + +タイプ: Bool + +デフォルト値: 0 + +[制約](../../sql-reference/statements/create/table.md#constraints)を使用してカラムの代替を行います。デフォルト値は`false`です。 + +可能な値: + +- true, false + +## optimize_syntax_fuse_functions {#optimize_syntax_fuse_functions} + +タイプ: Bool + +デフォルト値: 0 + +同一引数を持つ集計関数を融合させます。これは、`sum`、`count`、または`avg`の同一引数を持つ少なくとも2つの集計関数を`sumCount`に書き換えます。 + +可能な値: + +- 0 — 同一引数を持つ関数は融合されない。 +- 1 — 同一引数を持つ関数は融合される。 + +**例** + +クエリ: + +``` sql +CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log; +SET optimize_syntax_fuse_functions = 1; +EXPLAIN SYNTAX SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSV; +``` + +結果: + +``` text +SELECT + sum(a), + sumCount(b).1, + sumCount(b).2, + (sumCount(b).1) / (sumCount(b).2) +FROM fuse_tbl +``` + +## optimize_throw_if_noop {#optimize_throw_if_noop} + +タイプ: Bool + +デフォルト値: 0 + +マージを実行しなかった場合、[OPTIMIZE](../../sql-reference/statements/optimize.md)クエリが例外をスローするかどうかを有効または無効にします。 + +デフォルトでは、`OPTIMIZE`は何も行わなかった場合でも正常に戻ります。この設定を使用すると、これらの状況を区別し、例外メッセージで理由を取得できます。 + +可能な値: + +- 1 — 例外をスローすることを有効にします。 +- 0 — 例外をスローすることを無効にします。 + +## optimize_time_filter_with_preimage {#optimize_time_filter_with_preimage} + +タイプ: Bool + +デフォルト値: 1 + +変換なしで関数を同等の比較に変換することによって、日付および日時の述語を最適化します(例:toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')。 + +## optimize_trivial_approximate_count_query {#optimize_trivial_approximate_count_query} + +タイプ: Bool + +デフォルト値: 0 + +この最適化をサポートするストレージのトリビアルカウントの近似値を使用します。たとえば、EmbeddedRocksDB。 + +可能な値: + +- 0 — 最適化無効。 +- 1 — 最適化有効。 + +## optimize_trivial_count_query {#optimize_trivial_count_query} + +タイプ: Bool + +デフォルト値: 1 + +MergeTreeのメタデータを使用して、テーブルから`SELECT count()`のトリビアルクエリの最適化を有効または無効にします。行レベルのセキュリティを使用する必要がある場合は、この設定を無効にしてください。 + +可能な値: + +- 0 — 最適化無効。 +- 1 — 最適化有効。 + +参照: + +- [optimize_functions_to_subcolumns](#optimize-functions-to-subcolumns) + +## optimize_trivial_insert_select {#optimize_trivial_insert_select} + +タイプ: Bool + +デフォルト値: 0 + +トリビアルな'INSERT INTO table SELECT ... FROM TABLES'クエリを最適化します。 + +## optimize_uniq_to_count {#optimize_uniq_to_count} + +タイプ: Bool + +デフォルト値: 1 + +uniqおよびそのバリアント(uniqUpToを除く)を、サブクエリにdistinctまたはgroup by句がある場合にcountに書き換えます。 + +## optimize_use_implicit_projections {#optimize_use_implicit_projections} + +タイプ: Bool + +デフォルト値: 1 + +SELECTクエリを実行するために暗黙の投影を自動的に選択します。 + +## optimize_use_projections {#optimize_use_projections} + +タイプ: Bool + +デフォルト値: 1 + +`SELECT`クエリを処理する際の[プロジェクション](../../engines/table-engines/mergetree-family/mergetree.md/#projections)最適化を有効または無効にします。 + +可能な値: + +- 0 — プロジェクション最適化無効。 +- 1 — プロジェクション最適化有効。 + +## optimize_using_constraints {#optimize_using_constraints} + +タイプ: Bool + +デフォルト値: 0 + +クエリ最適化のために[制約](../../sql-reference/statements/create/table.md#constraints)を使用します。デフォルトでは`false`です。 + +可能な値: + +- true, false + +## os_thread_priority {#os_thread_priority} + +タイプ: Int64 + +デフォルト値: 0 + +クエリを実行するスレッドの優先度([nice](https://en.wikipedia.org/wiki/Nice_(Unix)))を設定します。OSスケジューラーは、この優先度を考慮して、各利用可能なCPUコアで次に実行するスレッドを選択します。 + +:::note +この設定を使用するには、`CAP_SYS_NICE` の能力を設定する必要があります。`clickhouse-server`パッケージは、インストール中にこれを設定します。一部の仮想環境では、`CAP_SYS_NICE`の設定が許可されていません。この場合、`clickhouse-server`は起動時にそのメッセージを表示します。 +::: + +可能な値: + +- 値は`[-20, 19]`の範囲で設定できます。 + +値が低いほど、優先度が高くなります。優先度の低い`nice`のスレッドは、優先度の高いスレッドよりも頻繁に実行されます。高い値は、長期間実行される非対話型クエリに好ましいです。なぜなら、これにより、短期間の対話型クエリが到着したときに、リソースをすばやく譲渡できるからです。 + +## output_format_compression_level {#output_format_compression_level} + +タイプ: UInt64 + +デフォルト値: 3 + +クエリ出力が圧縮されている場合のデフォルトの圧縮レベル。この設定は、`SELECT`クエリが`INTO OUTFILE`を持っている場合、またはテーブル関数`file`、`url`、`hdfs`、`s3`、または`azureBlobStorage`に書き込む場合に適用されます。 + +可能な値:1から22まで。 + +## output_format_compression_zstd_window_log {#output_format_compression_zstd_window_log} + +タイプ: UInt64 + +デフォルト値: 0 + +出力圧縮メソッドが`zstd`の場合に使用できます。0より大きい場合、この設定は圧縮ウィンドウのサイズ(2の冪)を明示的に設定し、zstd圧縮のロングレンジモードを有効にします。これにより、圧縮率が向上する可能性があります。 + +可能な値:非負の数。ただし、値が小さすぎるか大きすぎると、`zstdlib`は例外をスローします。典型的な値は`20`(ウィンドウサイズ=`1MB`)から`30`(ウィンドウサイズ=`1GB`)までです。 + +## output_format_parallel_formatting {#output_format_parallel_formatting} + +タイプ: Bool + +デフォルト値: 1 + +データフォーマットの並列フォーマットを有効または無効にします。サポートされるのは、[TSV](../../interfaces/formats.md/#tabseparated)、[TSKV](../../interfaces/formats.md/#tskv)、[CSV](../../interfaces/formats.md/#csv)および[JSONEachRow](../../interfaces/formats.md/#jsoneachrow)フォーマットのみです。 + +可能な値: + +- 1 — 有効。 +- 0 — 無効。 + +## page_cache_inject_eviction {#page_cache_inject_eviction} + +タイプ: Bool + +デフォルト値: 0 + +ユーザースペースのページキャッシュは、ランダムにいくつかのページを無効にする場合があります。テスト用です。 + +## parallel_distributed_insert_select {#parallel_distributed_insert_select} + +タイプ: UInt64 + +デフォルト値: 0 + +並列分散`INSERT ... SELECT`クエリを有効にします。 + +`INSERT INTO distributed_table_a SELECT ... FROM distributed_table_b`クエリを実行した場合、両方のテーブルが同じクラスタを使用し、両方のテーブルが[レプリケートされた](../../engines/table-engines/mergetree-family/replication.md)または非レプリケートである場合、このクエリは各シャードでローカルに処理されます。 + +可能な値: + +- 0 — 無効。 +- 1 — `SELECT`が分散エンジンの基になるテーブルの各シャードで実行されます。 +- 2 — `SELECT`および`INSERT`が分散エンジンの基になるテーブルの各シャードで実行されます。 + +## parallel_replica_offset {#parallel_replica_offset} + +タイプ: UInt64 + +デフォルト値: 0 + +これは内部設定であり、直接使用すべきではなく、'parallel replicas'モードの実装の詳細を表します。この設定は、並列レプリカの中でクエリ処理に参加しているレプリカのインデックスを示すために、分散クエリのイニシエーターサーバーによって自動的に設定されます。 + +## parallel_replicas_allow_in_with_subquery {#parallel_replicas_allow_in_with_subquery} + +タイプ: Bool + +デフォルト値: 1 + +trueの場合、INのサブクエリはすべてのフォロワーレプリカで実行されます。 + +## parallel_replicas_count {#parallel_replicas_count} + +タイプ: UInt64 + +デフォルト値: 0 + +これは内部設定であり、直接使用すべきではなく、'parallel replicas'モードの実装の詳細を表します。この設定は、分散クエリのイニシエーターサーバーによって、クエリ処理に参加する並列レプリカの数を自動的に設定されます。 + +## parallel_replicas_custom_key {#parallel_replicas_custom_key} + +タイプ: String + +デフォルト値: + +特定のテーブル間でレプリカ間の作業を分割するために使用できる任意の整数式。 +値は任意の整数式を取ることができます。 + +主キーを使用した単純な式が推奨されます。 + +この設定が、複数のレプリカを持つ単一のシャードで構成されるクラスタで使用されている場合、これらのレプリカは仮想シャードに変換されます。 +そうでなければ、それは`SAMPLE`キーと同じように動作し、各シャードの複数のレプリカを使用します。 + +## parallel_replicas_custom_key_range_lower {#parallel_replicas_custom_key_range_lower} + +タイプ: UInt64 + +デフォルト値: 0 + +フィルタータイプ`range`がカスタム範囲`[parallel_replicas_custom_key_range_lower, INT_MAX]`に基づいてレプリカ間で作業を均等に分割できるようにします。 + +[parallel_replicas_custom_key_range_upper](#parallel_replicas_custom_key_range_upper)と併用することで、カスタムキー範囲に基づいてレプリカ間で作業を均等に分割することができます。 + +注意:この設定は、クエリ処理中に追加のデータがフィルタリングされることはなく、並列処理のために範囲`[0, INT_MAX]`が分割されるポイントを変更します。 + +## parallel_replicas_custom_key_range_upper {#parallel_replicas_custom_key_range_upper} + +タイプ: UInt64 + +デフォルト値: 0 + +フィルタータイプ`range`がカスタム範囲`[0, parallel_replicas_custom_key_range_upper]`に基づいてレプリカ間で作業を均等に分割できるようにします。0の値は上限を無効にし、カスタムキー式の最大値を設定します。 + +[parallel_replicas_custom_key_range_lower](#parallel_replicas_custom_key_range_lower)と併用することで、カスタムキー範囲`[parallel_replicas_custom_key_range_lower, parallel_replicas_custom_key_range_upper]`でレプリカ間で作業を均等に分割できます。 + +注意:この設定は、クエリ処理中に追加のデータがフィルタリングされることはなく、並列処理のために範囲`[0, INT_MAX]`が分割されるポイントを変更します。 + +## parallel_replicas_for_non_replicated_merge_tree {#parallel_replicas_for_non_replicated_merge_tree} + +タイプ: Bool + +デフォルト値: 0 + +trueの場合、ClickHouseは非レプリケートのMergeTreeテーブルにも並列レプリカアルゴリズムを使用します。 + +## parallel_replicas_local_plan {#parallel_replicas_local_plan} + +タイプ: Bool + +デフォルト値: 1 + +ローカルレプリカのためのローカルプランを構築します。 + +## parallel_replicas_mark_segment_size {#parallel_replicas_mark_segment_size} + +タイプ: UInt64 + +デフォルト値: 0 + +パーツが仮想的にセグメントに分割され、レプリカ間で並列読み取りのために配布されます。この設定は、これらのセグメントのサイズを制御します。確実な場合を除いて変更することはお勧めしません。値は[128; 16384]の範囲であるべきです。 + +## parallel_replicas_min_number_of_rows_per_replica {#parallel_replicas_min_number_of_rows_per_replica} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリで使用されるレプリカの数を(読み取る推定行数 / min_number_of_rows_per_replica)に制限します。制限は、'max_parallel_replicas'によって引き続き制限されます。 + +## parallel_replicas_mode {#parallel_replicas_mode} + +タイプ: ParallelReplicasMode + +デフォルト値: read_tasks + +カスタムキーに対して並列レプリカで使用するフィルタのタイプ。デフォルト - カスタムキーでモジュロ演算を使用する、範囲 - カスタムキーに対して範囲フィルタを使用する。 + +## parallel_replicas_prefer_local_join {#parallel_replicas_prefer_local_join} + +タイプ: Bool + +デフォルト値: 1 + +trueの場合、JOINが並列レプリカアルゴリズムで実行でき、右JOIN部分のすべてのストレージが*MergeTreeの場合、ローカルJOINが使用され、GLOBAL JOINの代わりに使用されます。 + +## parallel_replicas_single_task_marks_count_multiplier {#parallel_replicas_single_task_marks_count_multiplier} + +タイプ: Float + +デフォルト値: 2 + +コーディネーターから取得する最小マーク数を計算する際に追加される乗数。これは、リモートレプリカにのみ適用されます。 + +## parallel_view_processing {#parallel_view_processing} + +タイプ: Bool + +デフォルト値: 0 + +添付されたビューに対して逐次的ではなく並行してプッシュすることを有効にします。 + +## parallelize_output_from_storages {#parallelize_output_from_storages} + +タイプ: Bool + +デフォルト値: 1 + +ストレージからの読み取りステップの出力を並列化します。これは、可能であれば、ストレージからの読み取りの直後にクエリ処理の並列化を許可します。 + +## parsedatetime_parse_without_leading_zeros {#parsedatetime_parse_without_leading_zeros} + +タイプ: Bool + +デフォルト値: 1 + +関数'parseDateTime()'内のフォーマッタ'%c'、'%l'および'%k'は、ゼロ埋めなしで月と時を解析します。 + +## partial_merge_join_left_table_buffer_bytes {#partial_merge_join_left_table_buffer_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +0でない場合、部分的なマージJOINの左側テーブルのために、左側テーブルのブロックを大きくグループ化します。結合スレッドごとに指定メモリの最大2倍を使用します。 + +## partial_merge_join_rows_in_right_blocks {#partial_merge_join_rows_in_right_blocks} + +タイプ: UInt64 + +デフォルト値: 65536 + +[JOIN](../../sql-reference/statements/select/join.md)クエリの部分的マージJOINアルゴリズムで、右側のJOINデータブロックのサイズを制限します。 + +ClickHouseサーバーは: + +1. 右側のJOINデータを指定された行数のブロックに分割します。 +2. 各ブロックをその最小値と最大値でインデックス化します。 +3. 可能であれば準備されたブロックをディスクにアンロードします。 + +可能な値: + +- 任意の正の整数。推奨される値の範囲:\[1000, 100000\]。 + +## partial_result_on_first_cancel {#partial_result_on_first_cancel} + +タイプ: Bool + +デフォルト値: 0 + +キャンセル後に部分結果を返すことを許可します。 + +## parts_to_delay_insert {#parts_to_delay_insert} + +タイプ: UInt64 + +デフォルト値: 0 + +宛先テーブルにアクティブなパーツが1つのパーティション内に少なくともこの数存在する場合、テーブルへの挿入を人工的に遅延させます。 + +## parts_to_throw_insert {#parts_to_throw_insert} + +タイプ: UInt64 + +デフォルト値: 0 + +宛先テーブルの単一パーティション内にアクティブなパーツがこの数を超える場合、'Too many parts ...'例外をスローします。 + +## periodic_live_view_refresh {#periodic_live_view_refresh} + +タイプ: Seconds + +デフォルト値: 60 + +定期的に更新されたライブビューが強制的にリフレッシュされる間隔。 + +## poll_interval {#poll_interval} + +タイプ: UInt64 + +デフォルト値: 10 + +サーバー上のクエリ待機ループで指定された秒数ブロックします。 + +## postgresql_connection_attempt_timeout {#postgresql_connection_attempt_timeout} + +タイプ: UInt64 + +デフォルト値: 2 + +PostgreSQLエンドポイントへの単一接続試行の秒単位接続タイムアウト。 +この値は接続URLの`connect_timeout`パラメータとして渡されます。 + +## postgresql_connection_pool_auto_close_connection {#postgresql_connection_pool_auto_close_connection} + +タイプ: Bool + +デフォルト値: 0 + +プールに返す前に接続を閉じます。 + +## postgresql_connection_pool_retries {#postgresql_connection_pool_retries} + +タイプ: UInt64 + +デフォルト値: 2 + +PostgreSQLテーブルエンジンおよびデータベースエンジンに対する接続プールのプッシュ/ポップリトライ数。 + +## postgresql_connection_pool_size {#postgresql_connection_pool_size} + +タイプ: UInt64 + +デフォルト値: 16 + +PostgreSQLテーブルエンジンおよびデータベースエンジンのための接続プールサイズ。 + +## postgresql_connection_pool_wait_timeout {#postgresql_connection_pool_wait_timeout} + +タイプ: UInt64 + +デフォルト値: 5000 + +PostgreSQLテーブルエンジンおよびデータベースエンジンの空のプールに対する接続プールのプッシュ/ポップタイムアウト。デフォルトでは、空のプールの上でブロックします。 + +## prefer_column_name_to_alias {#prefer_column_name_to_alias} + +タイプ: Bool + +デフォルト値: 0 + +クエリ式および句内でエイリアスの代わりに元のカラム名を使用するかどうかを有効または無効にします。これは、エイリアスがカラム名と同じである場合に特に重要です。[Expression Aliases](../../sql-reference/syntax.md/#notes-on-usage)を参照してください。この設定を有効にすると、ClickHouseのエイリアス構文ルールはほとんどの他のデータベースエンジンとより互換性が高くなります。 + +可能な値: + +- 0 — カラム名はエイリアスに置き換えられます。 +- 1 — カラム名はエイリアスに置き換えられません。 + +**例** + +有効と無効の違い: + +クエリ: + +```sql +SET prefer_column_name_to_alias = 0; +SELECT avg(number) AS number, max(number) FROM numbers(10); +``` + +結果: + +```text +Received exception from server (version 21.5.1): +Code: 184. DB::Exception: Received from localhost:9000. DB::Exception: Aggregate function avg(number) is found inside another aggregate function in query: While processing avg(number) AS number. +``` + +クエリ: + +```sql +SET prefer_column_name_to_alias = 1; +SELECT avg(number) AS number, max(number) FROM numbers(10); +``` + +結果: + +```text +┌─number─┬─max(number)─┐ +│ 4.5 │ 9 │ +└────────┴─────────────┘ +``` + +## prefer_external_sort_block_bytes {#prefer_external_sort_block_bytes} + +タイプ: UInt64 + +デフォルト値: 16744704 + +外部ソートのための最大ブロックバイトを優先し、マージ時のメモリ使用量を削減します。 + +## prefer_global_in_and_join {#prefer_global_in_and_join} + +タイプ: Bool + +デフォルト値: 0 + +`IN`/`JOIN`演算子を`GLOBAL IN`/`GLOBAL JOIN`に置き換えることを有効または無効にします。 + +可能な値: + +- 0 — 無効。 `IN`/`JOIN`演算子は`GLOBAL IN`/`GLOBAL JOIN`に置き換えられません。 +- 1 — 有効。 `IN`/`JOIN`演算子は`GLOBAL IN`/`GLOBAL JOIN`に置き換えられます。 + +**使用方法** + +`SET distributed_product_mode=global`が分散テーブルに対するクエリの動作を変更することがありますが、ローカルテーブルや外部リソースのテーブルには適していません。この時に`prefer_global_in_and_join`設定が登場します。 + +たとえば、ローカルテーブルが含まれるクエリ処理ノードがあり、これらは分散処理に適していません。`GLOBAL`キーワードを使用して分散処理中にデータをその場で散らばらせる必要があります—`GLOBAL IN`/`GLOBAL JOIN`を使用します。 +```html +`prefer_global_in_and_join`のもう一つの使用例は、外部エンジンによって作成されたテーブルにアクセスすることです。この設定は、そのようなテーブルを結合する際に外部ソースへの呼び出し回数を減らすのに役立ちます:クエリごとに1回の呼び出しのみです。 + +**参照:** + +- `GLOBAL IN`/`GLOBAL JOIN`の使用方法についての詳細は、[分散サブクエリ](../../sql-reference/operators/in.md/#select-distributed-subqueries)を参照してください。 + +## prefer_localhost_replica {#prefer_localhost_replica} + +タイプ: Bool + +デフォルト値: 1 + +分散クエリを処理する際に、ローカルホストのレプリカを優先的に使用するかどうかを有効/無効にします。 + +可能な値: + +- 1 — ClickHouseはローカルホストのレプリカが存在する場合、常にクエリをそのレプリカに送信します。 +- 0 — ClickHouseは、[load_balancing](#load_balancing)設定で指定されたバランス戦略を使用します。 + +:::note +[parallel_replicas_custom_key](#parallel_replicas_custom_key)を使用せずに[max_parallel_replicas](#max_parallel_replicas)を使用している場合は、この設定を無効にしてください。 +[parallel_replicas_custom_key](#parallel_replicas_custom_key)が設定されている場合、複数のレプリカを含む複数のシャードを持つクラスターで使用する場合にのみ、この設定を無効にしてください。 +単一のシャードと複数のレプリカを持つクラスターで使用する場合、この設定を無効にすると悪影響があります。 +::: + +## prefer_warmed_unmerged_parts_seconds {#prefer_warmed_unmerged_parts_seconds} + +タイプ: Int64 + +デフォルト値: 0 + +ClickHouse Cloudでのみ利用可能です。マージされていない部分がこの秒数未満で古く、プリウォームされていない場合(cache_populated_by_fetchを参照)、かつすべてのソース部分が利用可能でプリウォームされている場合、SELECTクエリはそれらの部分から読み取ります。ReplicatedMergeTree専用です。この設定は、CacheWarmerがその部分を処理したかどうかのみをチェックします。もしその部分が他の何かによってキャッシュに取得されていても、CacheWarmerがそれを処理するまで「コールド」と見なされます。もしプリウォームされてキャッシュから排除された場合も、「ウォーム」と見なされます。 + +## preferred_block_size_bytes {#preferred_block_size_bytes} + +タイプ: UInt64 + +デフォルト値: 1000000 + +この設定は、クエリ処理のためのデータブロックサイズを調整し、粗い 'max_block_size' 設定に対する追加的な微調整を表します。カラムが大きく、'max_block_size' 行が指定されたバイト数よりも大きい場合、そのサイズはCPUキャッシュの局所性を改善するために低くされます。 + +## preferred_max_column_in_block_size_bytes {#preferred_max_column_in_block_size_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +読み取り時のブロック内の最大カラムサイズの制限です。キャッシュミスの回数を減少させるのに役立ちます。L2キャッシュサイズに近い必要があります。 + +## preferred_optimize_projection_name {#preferred_optimize_projection_name} + +タイプ: String + +デフォルト値: + +空でない文字列に設定されている場合、ClickHouseはクエリで指定されたプロジェクションを適用しようとします。 + +可能な値: + +- 文字列: 好みのプロジェクションの名前 + +## prefetch_buffer_size {#prefetch_buffer_size} + +タイプ: UInt64 + +デフォルト値: 1048576 + +ファイルシステムから読み取るためのプリフェッチバッファの最大サイズです。 + +## print_pretty_type_names {#print_pretty_type_names} + +タイプ: Bool + +デフォルト値: 1 + +`DESCRIBE`クエリおよび`toTypeName()`関数内で、深くネストされたタイプの名前をインデントを付けて整形して印刷できるようにします。 + +例: + +```sql +CREATE TABLE test (a Tuple(b String, c Tuple(d Nullable(UInt64), e Array(UInt32), f Array(Tuple(g String, h Map(String, Array(Tuple(i String, j UInt64))))), k Date), l Nullable(String))) ENGINE=Memory; +DESCRIBE TABLE test FORMAT TSVRaw SETTINGS print_pretty_type_names=1; +``` + +``` +a Tuple( + b String, + c Tuple( + d Nullable(UInt64), + e Array(UInt32), + f Array(Tuple( + g String, + h Map( + String, + Array(Tuple( + i String, + j UInt64 + )) + ) + )), + k Date + ), + l Nullable(String) +) +``` + +## priority {#priority} + +タイプ: UInt64 + +デフォルト値: 0 + +クエリの優先度。1 - 最も高い、値が高いほど優先度は低い;0 - 優先度を使用しない。 + +## query_cache_compress_entries {#query_cache_compress_entries} + +タイプ: Bool + +デフォルト値: 1 + +[クエリキャッシュ](../query-cache.md)内のエントリを圧縮します。クエリキャッシュのメモリ消費を抑えますが、挿入や読み取りの速度は低下します。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_cache_max_entries {#query_cache_max_entries} + +タイプ: UInt64 + +デフォルト値: 0 + +現在のユーザーが[クエリキャッシュ](../query-cache.md)に格納できるクエリ結果の最大数。0は無制限を意味します。 + +可能な値: + +- 0以上の正の整数。 + +## query_cache_max_size_in_bytes {#query_cache_max_size_in_bytes} + +タイプ: UInt64 + +デフォルト値: 0 + +現在のユーザーが[クエリキャッシュ](../query-cache.md)に割り当てられる最大メモリ量(バイト単位)。0は無制限を意味します。 + +可能な値: + +- 0以上の正の整数。 + +## query_cache_min_query_duration {#query_cache_min_query_duration} + +タイプ: ミリ秒 + +デフォルト値: 0 + +クエリの結果を[クエリキャッシュ](../query-cache.md)に保存するために、クエリが実行されなければならない最小の時間(ミリ秒単位)。 + +可能な値: + +- 0以上の正の整数。 + +## query_cache_min_query_runs {#query_cache_min_query_runs} + +タイプ: UInt64 + +デフォルト値: 0 + +`SELECT`クエリが結果を[クエリキャッシュ](../query-cache.md)に保存する前に、実行する必要がある最小回数。 + +可能な値: + +- 0以上の正の整数。 + +## query_cache_nondeterministic_function_handling {#query_cache_nondeterministic_function_handling} + +タイプ: QueryCacheNondeterministicFunctionHandling + +デフォルト値: throw + +非決定論的関数(例えば、`rand()`や`now()`)を含む`SELECT`クエリに対して[クエリキャッシュ](../query-cache.md)がどのように処理するかを制御します。 + +可能な値: + +- `'throw'` - 例外をスローし、クエリ結果をキャッシュしない。 +- `'save'` - クエリ結果をキャッシュする。 +- `'ignore'` - クエリ結果をキャッシュせず、例外をスローしない。 + +## query_cache_share_between_users {#query_cache_share_between_users} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、[クエリキャッシュ](../query-cache.md)にキャッシュされた`SELECT`クエリの結果を他のユーザーが読み取れるようになります。この設定を有効にすることは、セキュリティ上の理由から推奨されません。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_cache_squash_partial_results {#query_cache_squash_partial_results} + +タイプ: Bool + +デフォルト値: 1 + +部分結果ブロックを[max_block_size](#setting-max_block_size)のサイズのブロックに圧縮します。[クエリキャッシュ](../query-cache.md)への挿入のパフォーマンスを低下させますが、キャッシュエントリの圧縮性を向上させます([query_cache_compress-entries](#query_cache_compress-entries)を参照)。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_cache_system_table_handling {#query_cache_system_table_handling} + +タイプ: QueryCacheSystemTableHandling + +デフォルト値: throw + +システムテーブル(すなわち、`system.*`および`information_schema.*`データベースのテーブル)に対する`SELECT`クエリに対して、[クエリキャッシュ](../query-cache.md)がどのように処理するかを制御します。 + +可能な値: + +- `'throw'` - 例外をスローし、クエリ結果をキャッシュしない。 +- `'save'` - クエリ結果をキャッシュする。 +- `'ignore'` - クエリ結果をキャッシュせず、例外をスローしない。 + +## query_cache_tag {#query_cache_tag} + +タイプ: String + +デフォルト値: + +[クエリキャッシュ](../query-cache.md)エントリにラベルとして機能する文字列です。同じクエリが異なるタグを持つ場合、クエリキャッシュでは異なるものと見なされます。 + +可能な値: + +- 任意の文字列 + +## query_cache_ttl {#query_cache_ttl} + +タイプ: 秒 + +デフォルト値: 60 + +この時間(秒単位)を経過すると、[クエリキャッシュ](../query-cache.md)のエントリが古くなります。 + +可能な値: + +- 0以上の正の整数。 + +## query_metric_log_interval {#query_metric_log_interval} + +タイプ: Int64 + +デフォルト値: -1 + +個々のクエリに対する[query_metric_log](../../operations/system-tables/query_metric_log.md)の収集間隔(ミリ秒単位)です。 + +任意の負の値に設定された場合、[query_metric_log設定](../../operations/server-configuration-parameters/settings.md#query_metric_log)から`collect_interval_milliseconds`の値を使用するか、存在しない場合は1000にデフォルトされます。 + +単一クエリの収集を無効にするには、`query_metric_log_interval`を0に設定します。 + +デフォルト値: -1 + +## query_plan_aggregation_in_order {#query_plan_aggregation_in_order} + +タイプ: Bool + +デフォルト値: 1 + +集約を順序通りに処理するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_convert_outer_join_to_inner_join {#query_plan_convert_outer_join_to_inner_join} + +タイプ: Bool + +デフォルト値: 1 + +JOINの後にフィルタが常にデフォルト値をフィルタリングする場合、OUTER JOINをINNER JOINに変換することを許可します。 + +## query_plan_enable_multithreading_after_window_functions {#query_plan_enable_multithreading_after_window_functions} + +タイプ: Bool + +デフォルト値: 1 + +ウィンドウ関数を評価した後にマルチスレッド処理を可能にします。 + +## query_plan_enable_optimizations {#query_plan_enable_optimizations} + +タイプ: Bool + +デフォルト値: 1 + +クエリプランレベルでのクエリ最適化を切り替えます。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - クエリプランレベルでのすべての最適化を無効 +- 1 - クエリプランレベルでの最適化を有効(ただし、個々の最適化は個別の設定で無効にされる可能性があります) + +## query_plan_execute_functions_after_sorting {#query_plan_execute_functions_after_sorting} + +タイプ: Bool + +デフォルト値: 1 + +ソート処理の後に式を移動するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_filter_push_down {#query_plan_filter_push_down} + +タイプ: Bool + +デフォルト値: 1 + +実行プランでフィルタを下に移動するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_lift_up_array_join {#query_plan_lift_up_array_join} + +タイプ: Bool + +デフォルト値: 1 + +ARRAY JOINを実行プランの上部に移動するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_lift_up_union {#query_plan_lift_up_union} + +タイプ: Bool + +デフォルト値: 1 + +クエリプランの大きな部分木を一つのユニオンに移動するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_max_optimizations_to_apply {#query_plan_max_optimizations_to_apply} + +タイプ: UInt64 + +デフォルト値: 10000 + +クエリプランに適用される最適化の総数を制限します。[query_plan_enable_optimizations](#query_plan_enable_optimizations)設定を参照してください。 +複雑なクエリについて長時間の最適化を避けるのに役立ちます。 +この設定を超える最適化の実際の数がある場合、例外がスローされます。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +## query_plan_merge_expressions {#query_plan_merge_expressions} + +タイプ: Bool + +デフォルト値: 1 + +連続するフィルタをマージするクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_merge_filters {#query_plan_merge_filters} + +タイプ: Bool + +デフォルト値: 0 + +クエリプラン内のフィルタをマージすることを許可します。 + +## query_plan_optimize_prewhere {#query_plan_optimize_prewhere} + +タイプ: Bool + +デフォルト値: 1 + +サポートされているストレージのためにフィルタをPREWHERE式にプッシュダウンすることを許可します。 + +## query_plan_push_down_limit {#query_plan_push_down_limit} + +タイプ: Bool + +デフォルト値: 1 + +実行プランでLIMITを下に移動するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_read_in_order {#query_plan_read_in_order} + +タイプ: Bool + +デフォルト値: 1 + +順序通りに読み取る最適化クエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_remove_redundant_distinct {#query_plan_remove_redundant_distinct} + +タイプ: Bool + +デフォルト値: 1 + +冗長なDISTINCTステップを削除するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_remove_redundant_sorting {#query_plan_remove_redundant_sorting} + +タイプ: Bool + +デフォルト値: 1 + +冗長なソートステップを削除するクエリプランレベルの最適化を切り替えます(例えば、サブクエリ内など)。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_reuse_storage_ordering_for_window_functions {#query_plan_reuse_storage_ordering_for_window_functions} + +タイプ: Bool + +デフォルト値: 1 + +ウィンドウ関数のソート時にストレージソートを再使用するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_plan_split_filter {#query_plan_split_filter} + +タイプ: Bool + +デフォルト値: 1 + +:::note +これは専門家レベルの設定であり、開発者によるデバッグのためにのみ使用するべきです。この設定は、将来的に後方互換性のない方法で変更されたり、削除されたりする可能性があります。 +::: + +フィルタを式に分割するクエリプランレベルの最適化を切り替えます。設定[query_plan_enable_optimizations](#query_plan_enable_optimizations)が1の場合にのみ効果があります。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## query_profiler_cpu_time_period_ns {#query_profiler_cpu_time_period_ns} + +タイプ: UInt64 + +デフォルト値: 1000000000 + +[クエリプロファイラ](../../operations/optimizing-performance/sampling-query-profiler.md)のCPUクロックタイマーの期間を設定します。このタイマーはCPU時間のみをカウントします。 + +可能な値: + +- 正の整数のナノ秒。 + + 推奨値: + + - 単一クエリに対しては10000000(秒に100回)のナノ秒以上。 + - クラスター全体のプロファイリングには1000000000(1秒に1回)。 + +- タイマーをオフにするには0。 + +**ClickHouse Cloudでは一時的に無効です。** + +参照: + +- システムテーブル[trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) + +## query_profiler_real_time_period_ns {#query_profiler_real_time_period_ns} + +タイプ: UInt64 + +デフォルト値: 1000000000 + +[クエリプロファイラ](../../operations/optimizing-performance/sampling-query-profiler.md)の実際のクロックタイマーの期間を設定します。実際のクロックタイマーは壁時計時間をカウントします。 + +可能な値: + +- 正の整数数(ナノ秒)。 + + 推奨値: + + - 単一クエリに対しては10000000(秒に100回)ナノ秒未満。 + - クラスター全体のプロファイリングには1000000000(1秒に1回)。 + +- タイマーをオフにするには0。 + +**ClickHouse Cloudでは一時的に無効です。** + +参照: + +- システムテーブル[trace_log](../../operations/system-tables/trace_log.md/#system_tables-trace_log) + +## queue_max_wait_ms {#queue_max_wait_ms} + +タイプ: ミリ秒 + +デフォルト値: 0 + +同時リクエストの数が最大を超えた場合の、リクエストキュー内の待機時間です。 + +## rabbitmq_max_wait_ms {#rabbitmq_max_wait_ms} + +タイプ: ミリ秒 + +デフォルト値: 5000 + +リトライ前にRabbitMQから読み取る際の待機時間です。 + +## read_backoff_max_throughput {#read_backoff_max_throughput} + +タイプ: UInt64 + +デフォルト値: 1048576 + +遅い読み取りが発生した場合にスレッドの数を減らすための設定です。読み取り帯域幅がこのバイト数/秒を下回るイベントをカウントします。 + +## read_backoff_min_concurrency {#read_backoff_min_concurrency} + +タイプ: UInt64 + +デフォルト値: 1 + +遅い読み取りが発生した場合に最小限のスレッド数を維持しようとする設定です。 + +## read_backoff_min_events {#read_backoff_min_events} + +タイプ: UInt64 + +デフォルト値: 2 + +遅い読み取りが発生した場合にスレッドの数を減らすための設定です。スレッド数を減少させる前にカウントされるイベント数です。 + +## read_backoff_min_interval_between_events_ms {#read_backoff_min_interval_between_events_ms} + +タイプ: ミリ秒 + +デフォルト値: 1000 + +遅い読み取りが発生した場合にスレッドの数を減らすための設定です。前のイベントが一定の時間未満しか経過していない場合、そのイベントを無視します。 + +## read_backoff_min_latency_ms {#read_backoff_min_latency_ms} + +タイプ: ミリ秒 + +デフォルト値: 1000 + +遅い読み取りが発生した場合にスレッドの数を減らすための設定です。この時間以上かかる読み取りのみに注意します。 + +## read_from_filesystem_cache_if_exists_otherwise_bypass_cache {#read_from_filesystem_cache_if_exists_otherwise_bypass_cache} + +タイプ: Bool + +デフォルト値: 0 + +ファイルシステムキャッシュを受動モードで使用することを許可します - 既存のキャッシュエントリからの利益を得るが、新しいエントリをキャッシュに入れません。この設定を重いアドホッククエリに設定し、短いリアルタイムクエリに対して無効にすることで、過度のクエリによるキャッシュのスラッシングを避け、全体のシステム効率を改善できます。 + +## read_from_page_cache_if_exists_otherwise_bypass_cache {#read_from_page_cache_if_exists_otherwise_bypass_cache} + +タイプ: Bool + +デフォルト値: 0 + +受動モードでユーザースペースのページキャッシュを使用します。read_from_filesystem_cache_if_exists_otherwise_bypass_cacheに類似しています。 + +## read_in_order_two_level_merge_threshold {#read_in_order_two_level_merge_threshold} + +タイプ: UInt64 + +デフォルト値: 100 + +プライマリキーの順序で複数スレッドで読み取る際にプレリミナリマージステップを実行するために読み取る必要がある部分の最小数です。 + +## read_in_order_use_buffering {#read_in_order_use_buffering} + +タイプ: Bool + +デフォルト値: 1 + +プライマリキーの順序で読み取る際にマージ前にバッファリングを使用します。クエリ実行の並列性が向上します。 + +## read_overflow_mode {#read_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた場合の処理の方法です。 + +## read_overflow_mode_leaf {#read_overflow_mode_leaf} + +タイプ: OverflowMode + +デフォルト値: throw + +リーフ制限を超えた場合の処理の方法です。 + +## read_priority {#read_priority} + +タイプ: Int64 + +デフォルト値: 0 + +ローカルファイルシステムまたはリモートファイルシステムからデータを読み取る優先度。ローカルファイルシステムの`pread_threadpool`メソッドとリモートファイルシステムの`threadpool`メソッドに対してのみサポートされています。 + +## read_through_distributed_cache {#read_through_distributed_cache} + +タイプ: Bool + +デフォルト値: 0 + +ClickHouse Cloudでのみ。分散キャッシュからの読み取りを許可します。 + +## readonly {#readonly} + +タイプ: UInt64 + +デフォルト値: 0 + +0 - 読み取り専用制限なし。1 - 読み取りリクエストのみ、および明示的に許可された設定のみ変更可能。2 - 読み取りリクエストのみ、および設定を変更可能('readonly'設定を除く)。 + +## receive_data_timeout_ms {#receive_data_timeout_ms} + +タイプ: ミリ秒 + +デフォルト値: 2000 + +最初のデータパケットまたはレプリカからの進行状況を示すパケットを受信するための接続タイムアウトです。 + +## receive_timeout {#receive_timeout} + +タイプ: 秒 + +デフォルト値: 300 + +ネットワークからデータを受信するためのタイムアウト(秒単位)。この間にバイトが受信されなかった場合、例外がスローされます。クライアントでこの設定を設定すると、ソケットの'send_timeout'もサーバーの対応する接続の終端で設定されます。 + +## regexp_max_matches_per_row {#regexp_max_matches_per_row} + +タイプ: UInt64 + +デフォルト値: 1000 + +行ごとに単一の正規表現の最大マッチ数を設定します。[extractAllGroupsHorizontal](../../sql-reference/functions/string-search-functions.md/#extractallgroups-horizontal)関数で欲張りな正規表現を使用する際のメモリ過負荷から保護するために使用します。 + +可能な値: + +- 正の整数。 + +## reject_expensive_hyperscan_regexps {#reject_expensive_hyperscan_regexps} + +タイプ: Bool + +デフォルト値: 1 + +ハイパースキャンで評価するのが高コストになると考えられるパターンを拒否します(NFA状態の爆発による)。 + +## remerge_sort_lowered_memory_bytes_ratio {#remerge_sort_lowered_memory_bytes_ratio} + +タイプ: Float + +デフォルト値: 2 + +再マージ後のメモリ使用量がこの比率で減少しない場合、再マージは無効化されます。 + +## remote_filesystem_read_method {#remote_filesystem_read_method} + +タイプ: String + +デフォルト値: threadpool + +リモートファイルシステムからデータを読み取る方法。readまたはthreadpoolのいずれか。 + +## remote_filesystem_read_prefetch {#remote_filesystem_read_prefetch} + +タイプ: Bool + +デフォルト値: 1 + +リモートファイルシステムからデータを読み取る際にプリフェッチを使用すべきかどうかを示します。 + +## remote_fs_read_backoff_max_tries {#remote_fs_read_backoff_max_tries} + +タイプ: UInt64 + +デフォルト値: 5 + +バックオフのための最大読み取り試行回数です。 + +## remote_fs_read_max_backoff_ms {#remote_fs_read_max_backoff_ms} + +タイプ: UInt64 + +デフォルト値: 10000 + +リモートディスクからデータを読み取ろうとする際の最大待機時間です。 + +## remote_read_min_bytes_for_seek {#remote_read_min_bytes_for_seek} + +タイプ: UInt64 + +デフォルト値: 4194304 + +リモート読み取り(URL、S3)でseekを実行するために必要な最小バイト数であり、無視して読み取らずに実行します。 + +## rename_files_after_processing {#rename_files_after_processing} + +タイプ: String + +デフォルト値: + +- **タイプ:** String + +- **デフォルト値:** 空の文字列 + +この設定により、`file`テーブル関数によって処理されたファイルのリネームパターンを指定できます。オプションが設定されると、`file`テーブル関数によって読み取られたすべてのファイルは、処理が成功した場合に指定されたパターンに従ってプレースホルダ付きでリネームされます。 + +### プレースホルダ + +- `%a` — 完全な元のファイル名(例: "sample.csv")。 +- `%f` — 拡張子なしの元のファイル名(例: "sample")。 +- `%e` — 元のファイルの拡張子(例: ".csv")。 +- `%t` — タイムスタンプ(マイクロ秒)。 +- `%%` — パーセント記号 ("%")。 + +### 例 +- オプション: `--rename_files_after_processing="processed_%f_%t%e"` + +- クエリ: `SELECT * FROM file('sample.csv')` + +`sample.csv`の読み取りが成功した場合、ファイルは`processed_sample_1683473210851438.csv`にリネームされます。 + +## replace_running_query {#replace_running_query} + +タイプ: Bool + +デフォルト値: 0 + +HTTPインターフェースを使用する際、'query_id'パラメータを渡すことができます。これは、クエリの識別子として機能する任意の文字列です。 +この時、同じユーザーから同じ'query_id'のクエリがすでに存在する場合、動作は'replace_running_query'パラメータによって異なります。 + +`0`(デフォルト) – 例外をスローし、同じ'query_id'のクエリがすでに実行中の場合、そのクエリを実行できません。 + +`1` – 古いクエリをキャンセルし、新しいクエリを実行し始めます。 + +このパラメータを1に設定するとセグメンテーション条件の提案を実装することができます。次の文字を入力すると、古いクエリがまだ完了していなければキャンセルされるべきです。 + +## replace_running_query_max_wait_ms {#replace_running_query_max_wait_ms} + +タイプ: ミリ秒 + +デフォルト値: 5000 + +[replace_running_query](#replace-running-query)設定がアクティブな場合、同じ`query_id`のクエリを実行するのを待つための時間です。 + +可能な値: + +- 正の整数。 +- 0 — 同じ`query_id`のクエリが既に実行されている場合、新しいクエリを実行することを許可しない例外をスローします。 + +## replication_wait_for_inactive_replica_timeout {#replication_wait_for_inactive_replica_timeout} + +タイプ: Int64 + +デフォルト値: 120 + +非アクティブなレプリカが[ALTER](../../sql-reference/statements/alter/index.md)、[OPTIMIZE](../../sql-reference/statements/optimize.md)、または[TRUNCATE](../../sql-reference/statements/truncate.md)クエリを実行するのを待つ時間(秒単位)を指定します。 + +可能な値: + +- 0 — 待機しない。 +- 負の整数 — 無制限に待機。 +- 正の整数 — 待機する秒数。 + +## restore_replace_external_dictionary_source_to_null {#restore_replace_external_dictionary_source_to_null} + +タイプ: Bool + +デフォルト値: 0 + +復元時に外部DictionaryソースをNullに置き換えます。テスト目的に有用です。 + +## restore_replace_external_engines_to_null {#restore_replace_external_engines_to_null} + +タイプ: Bool + +デフォルト値: 0 + +テスト目的のため。すべての外部エンジンをNullに置き換え、外部接続を開始しないようにします。 + +## restore_replace_external_table_functions_to_null {#restore_replace_external_table_functions_to_null} + +タイプ: Bool + +デフォルト値: 0 + +テスト目的のため。すべての外部テーブル関数をNullに置き換え、外部接続を開始しないようにします。 + +## result_overflow_mode {#result_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた場合の処理の方法です。 + +## rewrite_count_distinct_if_with_count_distinct_implementation {#rewrite_count_distinct_if_with_count_distinct_implementation} + +タイプ: Bool + +デフォルト値: 0 + +`countDistcintIf`を[count_distinct_implementation](#count_distinct_implementation)設定で書き換えることを許可します。 + +可能な値: + +- true — 許可。 +- false — 不許可。 + +## s3_allow_parallel_part_upload {#s3_allow_parallel_part_upload} + +タイプ: Bool + +デフォルト値: 1 + +S3のマルチパートアップロードに複数スレッドを使用します。これにより、わずかにメモリ使用量が増加する可能性があります。 + +## s3_check_objects_after_upload {#s3_check_objects_after_upload} + +タイプ: Bool + +デフォルト値: 0 + +アップロードが成功したことを確認するために、HEADリクエストでアップロードされた各オブジェクトをS3にチェックします。 + +## s3_connect_timeout_ms {#s3_connect_timeout_ms} + +タイプ: UInt64 + +デフォルト値: 1000 + +S3ディスクのホストへの接続タイムアウトです。 + +## s3_create_new_file_on_insert {#s3_create_new_file_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +S3エンジンテーブルへの各挿入時に新しいファイルを作成するかどうかを有効または無効にします。有効にすると、各挿入で次のパターンに似た新しいS3オブジェクトが作成されます: + +初期: `data.Parquet.gz` -> `data.1.Parquet.gz` -> `data.2.Parquet.gz`など。 + +可能な値: +- 0 — `INSERT`クエリはファイルの最後に新しいデータを追加します。 +- 1 — `INSERT`クエリは新しいファイルを作成します。 + +## s3_disable_checksum {#s3_disable_checksum} + +タイプ: Bool + +デフォルト値: 0 + +ファイルをS3に送信する際にチェックサムを計算しない。これにより、ファイルに過剰な処理がかかるのを避け、書き込み速度が向上します。MergeTreeテーブルのデータはClickHouseによってすでにチェックサムされているため、主に安全です。また、S3にHTTPSでアクセスする場合、TLSレイヤーはネットワークを介しての転送中に整合性を提供します。S3に追加のチェックサムを計算することで、深層防御を提供します。 + +## s3_ignore_file_doesnt_exist {#s3_ignore_file_doesnt_exist} + +タイプ: Bool + +デフォルト値: 0 + +特定のキーを読み取るときにファイルが存在しない場合の無視動作です。 + +可能な値: +- 1 — `SELECT`は空の結果を返します。 +- 0 — `SELECT`は例外をスローします。 + +## s3_list_object_keys_size {#s3_list_object_keys_size} + +タイプ: UInt64 + +デフォルト値: 1000 + +ListObjectリクエストによってバッチで返される可能性のある最大ファイル数です。 + +## s3_max_connections {#s3_max_connections} + +タイプ: UInt64 + +デフォルト値: 1024 + +サーバーごとの最大接続数です。 + +## s3_max_get_burst {#s3_max_get_burst} + +タイプ: UInt64 + +デフォルト値: 0 + +リクエストごとの秒の制限に達する前に同時に発行できるリクエストの最大数。デフォルト(0)は`s3_max_get_rps`に等しいです。 + +## s3_max_get_rps {#s3_max_get_rps} + +タイプ: UInt64 + +デフォルト値: 0 + +スロットリングの前のS3 GETリクエストの毎秒の制限。ゼロは無限を意味します。 + +## s3_max_inflight_parts_for_one_file {#s3_max_inflight_parts_for_one_file} + +タイプ: UInt64 + +デフォルト値: 20 + +マルチパートアップロードリクエストで同時に読み込まれる部分の最大数。0は無制限を意味します。 + +## s3_max_part_number {#s3_max_part_number} + +タイプ: UInt64 + +デフォルト値: 10000 +``` +```html +最大部分番号数のs3アップロード部分。 + +## s3_max_put_burst {#s3_max_put_burst} + +タイプ: UInt64 + +デフォルト値: 0 + +リクエスト毎秒制限に達する前に同時に発行できる最大リクエスト数。デフォルト値は(0)は`s3_max_put_rps`と等しい。 + +## s3_max_put_rps {#s3_max_put_rps} + +タイプ: UInt64 + +デフォルト値: 0 + +スロットリング前のS3 PUTリクエスト毎秒の制限。ゼロは無制限を意味します。 + +## s3_max_redirects {#s3_max_redirects} + +タイプ: UInt64 + +デフォルト値: 10 + +許可される最大S3リダイレクトホップ数。 + +## s3_max_single_operation_copy_size {#s3_max_single_operation_copy_size} + +タイプ: UInt64 + +デフォルト値: 33554432 + +s3における単一コピー操作の最大サイズ。 + +## s3_max_single_part_upload_size {#s3_max_single_part_upload_size} + +タイプ: UInt64 + +デフォルト値: 33554432 + +S3に対して単一部分アップロードを使用してアップロードするオブジェクトの最大サイズ。 + +## s3_max_single_read_retries {#s3_max_single_read_retries} + +タイプ: UInt64 + +デフォルト値: 4 + +単一のS3読み取り中の最大リトライ回数。 + +## s3_max_unexpected_write_error_retries {#s3_max_unexpected_write_error_retries} + +タイプ: UInt64 + +デフォルト値: 4 + +S3書き込み中の予期しないエラーが発生した場合の最大リトライ回数。 + +## s3_max_upload_part_size {#s3_max_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 5368709120 + +マルチパートアップロード中にS3にアップロードする部分の最大サイズ。 + +## s3_min_upload_part_size {#s3_min_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 16777216 + +マルチパートアップロード中にS3にアップロードする部分の最小サイズ。 + +## s3_request_timeout_ms {#s3_request_timeout_ms} + +タイプ: UInt64 + +デフォルト値: 30000 + +S3とのデータの送受信に関するアイドリングタイムアウト。単一のTCP読み取りまたは書き込み呼び出しがこの時間ブロックされると失敗します。 + +## s3_retry_attempts {#s3_retry_attempts} + +タイプ: UInt64 + +デフォルト値: 100 + +Aws::Client::RetryStrategyの設定。Aws::Clientは自動的にリトライを行い、0はリトライなしを意味します。 + +## s3_skip_empty_files {#s3_skip_empty_files} + +タイプ: Bool + +デフォルト値: 0 + +[S3](../../engines/table-engines/integrations/s3.md)エンジンテーブルで空のファイルをスキップするかどうかの設定。 + +可能な値: +- 0 — 空のファイルが要求された形式と互換性がない場合、`SELECT`は例外をスローします。 +- 1 — 空のファイルに対して空の結果を返します。 + +## s3_strict_upload_part_size {#s3_strict_upload_part_size} + +タイプ: UInt64 + +デフォルト値: 0 + +マルチパートアップロード中にS3にアップロードする部分の正確なサイズ(いくつかの実装は可変サイズ部分をサポートしていません)。 + +## s3_throw_on_zero_files_match {#s3_throw_on_zero_files_match} + +タイプ: Bool + +デフォルト値: 0 + +ListObjectsリクエストがファイルに一致しない場合にエラーをスローします。 + +## s3_truncate_on_insert {#s3_truncate_on_insert} + +タイプ: Bool + +デフォルト値: 0 + +s3エンジンテーブルへの挿入の前にトランケートを有効または無効にします。無効にすると、既にS3オブジェクトが存在する場合、挿入試行時に例外がスローされます。 + +可能な値: +- 0 — `INSERT`クエリはファイルの末尾に新しいデータを追加します。 +- 1 — `INSERT`クエリはファイルの既存の内容を新しいデータで置き換えます。 + +## s3_upload_part_size_multiply_factor {#s3_upload_part_size_multiply_factor} + +タイプ: UInt64 + +デフォルト値: 2 + +s3_multiply_parts_count_thresholdからの単一書き込みでアップロードされた各回のs3_min_upload_part_sizeをこの係数で掛けます。 + +## s3_upload_part_size_multiply_parts_count_threshold {#s3_upload_part_size_multiply_parts_count_threshold} + +タイプ: UInt64 + +デフォルト値: 500 + +この数の部分がS3にアップロードされるたびに、s3_min_upload_part_sizeはs3_upload_part_size_multiply_factorで乗算されます。 + +## s3_use_adaptive_timeouts {#s3_use_adaptive_timeouts} + +タイプ: Bool + +デフォルト値: 1 + +`true`に設定すると、すべてのs3リクエストに対して最初の2回の試行が低い送信および受信タイムアウトで行われます。 +`false`に設定すると、すべての試行が同一のタイムアウトで行われます。 + +## s3_validate_request_settings {#s3_validate_request_settings} + +タイプ: Bool + +デフォルト値: 1 + +s3リクエスト設定の検証を有効にします。 + +可能な値: +- 1 — 設定を検証します。 +- 0 — 設定を検証しません。 + +## s3queue_default_zookeeper_path {#s3queue_default_zookeeper_path} + +タイプ: String + +デフォルト値: /clickhouse/s3queue/ + +S3QueueエンジンのデフォルトのZooKeeperパスプレフィックス。 + +## s3queue_enable_logging_to_s3queue_log {#s3queue_enable_logging_to_s3queue_log} + +タイプ: Bool + +デフォルト値: 0 + +system.s3queue_logへの書き込みを有効にします。この値はテーブル設定で上書きできます。 + +## schema_inference_cache_require_modification_time_for_url {#schema_inference_cache_require_modification_time_for_url} + +タイプ: Bool + +デフォルト値: 1 + +最終変更時刻の検証が必要なURLのキャッシュからスキーマを使用します(Last-Modifiedヘッダーを持つURLの場合)。 + +## schema_inference_use_cache_for_azure {#schema_inference_use_cache_for_azure} + +タイプ: Bool + +デフォルト値: 1 + +Azureテーブル関数を使用している間、スキーマ推論でキャッシュを使用します。 + +## schema_inference_use_cache_for_file {#schema_inference_use_cache_for_file} + +タイプ: Bool + +デフォルト値: 1 + +ファイルテーブル関数を使用している間、スキーマ推論でキャッシュを使用します。 + +## schema_inference_use_cache_for_hdfs {#schema_inference_use_cache_for_hdfs} + +タイプ: Bool + +デフォルト値: 1 + +HDFSテーブル関数を使用している間、スキーマ推論でキャッシュを使用します。 + +## schema_inference_use_cache_for_s3 {#schema_inference_use_cache_for_s3} + +タイプ: Bool + +デフォルト値: 1 + +S3テーブル関数を使用している間、スキーマ推論でキャッシュを使用します。 + +## schema_inference_use_cache_for_url {#schema_inference_use_cache_for_url} + +タイプ: Bool + +デフォルト値: 1 + +URLテーブル関数を使用している間、スキーマ推論でキャッシュを使用します。 + +## select_sequential_consistency {#select_sequential_consistency} + +タイプ: UInt64 + +デフォルト値: 0 + +:::note +この設定はSharedMergeTreeとReplicatedMergeTreeでの挙動が異なります。[SharedMergeTreeの整合性](/docs/ja/cloud/reference/shared-merge-tree/#consistency)を参照して、SharedMergeTreeにおける`select_sequential_consistency`の挙動についての詳細を確認してください。 +::: + +`SELECT`クエリに対する連続整合性を有効または無効にします。`insert_quorum_parallel`が無効である必要があります(デフォルトでは有効)。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +使用方法 + +連続整合性が有効になっている場合、ClickHouseはクライアントが`insert_quorum`で実行されたすべての前回の`INSERT`クエリでデータを含むレプリカに対してのみ`SELECT`クエリを実行することを許可します。クライアントが部分的なレプリカを参照する場合、ClickHouseは例外を生成します。SELECTクエリは、まだレプリカのクォラムに書き込まれていないデータを含めません。 + +`insert_quorum_parallel`が有効(デフォルト)である場合、`select_sequential_consistency`は機能しません。これは、並行する`INSERT`クエリが異なるレプリカのセットに書き込まれる可能性があるため、単一のレプリカがすべての書き込みを受け取った保証がないからです。 + +関連情報: + +- [insert_quorum](#insert_quorum) +- [insert_quorum_timeout](#insert_quorum_timeout) +- [insert_quorum_parallel](#insert_quorum_parallel) + +## send_logs_level {#send_logs_level} + +タイプ: LogsLevel + +デフォルト値: fatal + +指定された最小レベルのサーバーテキストログをクライアントに送信します。有効な値: 'trace', 'debug', 'information', 'warning', 'error', 'fatal', 'none' + +## send_logs_source_regexp {#send_logs_source_regexp} + +タイプ: String + +デフォルト値: + +指定された正規表現に一致するログソース名を持つサーバーテキストログを送信します。空はすべてのソースを意味します。 + +## send_progress_in_http_headers {#send_progress_in_http_headers} + +タイプ: Bool + +デフォルト値: 0 + +`clickhouse-server`のレスポンスに`X-ClickHouse-Progress` HTTPレスポンスヘッダーを有効または無効にします。 + +詳細については、[HTTPインターフェースの説明](../../interfaces/http.md)を参照してください。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## send_timeout {#send_timeout} + +タイプ: 秒 + +デフォルト値: 300 + +ネットワークへのデータ送信のタイムアウト(秒単位)。クライアントがデータを送信する必要があるが、このインターバル内にバイトを送信できない場合、例外がスローされます。この設定をクライアントで設定すると、ソケットの'receive_timeout'もサーバーの対応する接続側に設定されます。 + +## session_timezone {#session_timezone} + +タイプ: タイムゾーン + +デフォルト値: + +現在のセッションまたはクエリの暗黙のタイムゾーンを設定します。 +暗黙のタイムゾーンは、明示的に指定されたタイムゾーンがないDateTime/DateTime64型の値に適用されるタイムゾーンです。 +この設定は、グローバルに設定された(サーバーレベルの)暗黙のタイムゾーンよりも優先されます。 +''(空の文字列)の値は、現在のセッションまたはクエリの暗黙のタイムゾーンが[サーバーのタイムゾーン](../server-configuration-parameters/settings.md#timezone)と等しいことを意味します。 + +`timeZone()`および`serverTimeZone()`関数を使用して、セッションタイムゾーンとサーバータイムゾーンを取得できます。 + +可能な値: + +- `system.time_zones`からの任意のタイムゾーン名、例えば`Europe/Berlin`、`UTC`、または`Zulu`。 + +例: + +```sql +SELECT timeZone(), serverTimeZone() FORMAT CSV + +"Europe/Berlin","Europe/Berlin" +``` + +```sql +SELECT timeZone(), serverTimeZone() SETTINGS session_timezone = 'Asia/Novosibirsk' FORMAT CSV + +"Asia/Novosibirsk","Europe/Berlin" +``` + +セッションタイムゾーン'America/Denver'を明示的に指定されていない内側のDateTimeに割り当て: + +```sql +SELECT toDateTime64(toDateTime64('1999-12-12 23:23:23.123', 3), 3, 'Europe/Zurich') SETTINGS session_timezone = 'America/Denver' FORMAT TSV + +1999-12-13 07:23:23.123 +``` + +:::warning +DateTime/DateTime64を解析するすべての関数が`session_timezone`を尊重するわけではありません。これにより微妙なエラーが生じる可能性があります。 +以下の例と説明を参照してください。 +::: + +```sql +CREATE TABLE test_tz (`d` DateTime('UTC')) ENGINE = Memory AS SELECT toDateTime('2000-01-01 00:00:00', 'UTC'); + +SELECT *, timeZone() FROM test_tz WHERE d = toDateTime('2000-01-01 00:00:00') SETTINGS session_timezone = 'Asia/Novosibirsk' +0 rows in set. + +SELECT *, timeZone() FROM test_tz WHERE d = '2000-01-01 00:00:00' SETTINGS session_timezone = 'Asia/Novosibirsk' +┌───────────────────d─┬─timeZone()───────┐ +│ 2000-01-01 00:00:00 │ Asia/Novosibirsk │ +└─────────────────────┴──────────────────┘ +``` + +これは異なる解析パイプラインによるものです: + +- 明示的に与えられたタイムゾーンなしで使用される`toDateTime()`は、最初の`SELECT`クエリで`session_timezone`とグローバルタイムゾーンの設定を尊重します。 +- 2番目のクエリでは、文字列からDateTimeが解析され、既存のカラム`d`の型とタイムゾーンを引き継ぎます。したがって、`session_timezone`とグローバルタイムゾーンの設定は尊重されません。 + +**関連情報** + +- [timezone](../server-configuration-parameters/settings.md#timezone) + +## set_overflow_mode {#set_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた際に何をするか。 + +## short_circuit_function_evaluation {#short_circuit_function_evaluation} + +タイプ: ShortCircuitFunctionEvaluation + +デフォルト値: enable + +[if](../../sql-reference/functions/conditional-functions.md/#if)、[multiIf](../../sql-reference/functions/conditional-functions.md/#multiif)、[and](../../sql-reference/functions/logical-functions.md/#logical-and-function)、および[or](../../sql-reference/functions/logical-functions.md/#logical-or-function)関数を短絡的に計算できるようにします。これにより、これらの関数内の複雑な式の実行を最適化し、予期しない例外(ゼロ除算など)を防ぐのに役立ちます。 + +可能な値: + +- `enable` — 適用可能な関数に対して短絡評価が有効になります(例外をスローする可能性があるか、計算コストの高い場合)。 +- `force_enable` — すべての関数に対して短絡評価が有効になります。 +- `disable` — 短絡評価が無効になります。 + +## show_table_uuid_in_table_create_query_if_not_nil {#show_table_uuid_in_table_create_query_if_not_nil} + +タイプ: Bool + +デフォルト値: 0 + +`SHOW TABLE`クエリの表示を設定します。 + +可能な値: + +- 0 — クエリはテーブルUUIDなしで表示されます。 +- 1 — クエリはテーブルUUID付きで表示されます。 + +## single_join_prefer_left_table {#single_join_prefer_left_table} + +タイプ: Bool + +デフォルト値: 1 + +識別子の曖昧さがある場合、単一JOINの場合は左側のテーブルを優先します。 + +## skip_download_if_exceeds_query_cache {#skip_download_if_exceeds_query_cache} + +タイプ: Bool + +デフォルト値: 1 + +クエリキャッシュサイズを超える場合、リモートファイルシステムからのダウンロードをスキップします。 + +## skip_unavailable_shards {#skip_unavailable_shards} + +タイプ: Bool + +デフォルト値: 0 + +使用できないシャードを静かにスキップするかどうかを有効または無効にします。 + +シャードはすべてのレプリカが使用できない場合、使用できないと見なされます。レプリカは以下の状況で使用できません: + +- ClickHouseが何らかの理由でレプリカに接続できない。 + + レプリカに接続する際、ClickHouseは何度か試みます。これらのすべての試みが失敗した場合、そのレプリカは使用できないと見なされます。 + +- レプリカがDNS経由で解決できない。 + + レプリカのホスト名がDNSを介して解決できない場合、次の状況が考えられます: + + - レプリカのホストにDNSレコードがない。これはダイナミックDNSを持つシステムで発生することがあります。たとえば、[Kubernetes](https://kubernetes.io)のように、ノードがダウンタイム中に解決できないことがあるが、これはエラーではありません。 + + - 設定エラー。ClickHouseの構成ファイルに誤ったホスト名が含まれています。 + +可能な値: + +- 1 — スキップが有効。 + + シャードが利用できなくなった場合、ClickHouseは部分的なデータに基づいた結果を返し、ノードの可用性の問題を報告しません。 + +- 0 — スキップが無効。 + + シャードが利用できない場合、ClickHouseは例外をスローします。 + +## sleep_after_receiving_query_ms {#sleep_after_receiving_query_ms} + +タイプ: ミリ秒 + +デフォルト値: 0 + +TCPHandler内でクエリを受信した後のスリープ時間。 + +## sleep_in_send_data_ms {#sleep_in_send_data_ms} + +タイプ: ミリ秒 + +デフォルト値: 0 + +TCPHandler内でデータを送信する際のスリープ時間。 + +## sleep_in_send_tables_status_ms {#sleep_in_send_tables_status_ms} + +タイプ: ミリ秒 + +デフォルト値: 0 + +TCPHandler内でテーブルステータス応答を送信する際のスリープ時間。 + +## sort_overflow_mode {#sort_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた際に何をするか。 + +## split_intersecting_parts_ranges_into_layers_final {#split_intersecting_parts_ranges_into_layers_final} + +タイプ: Bool + +デフォルト値: 1 + +FINAL最適化中に交差する部分範囲をレイヤーに分割します。 + +## split_parts_ranges_into_intersecting_and_non_intersecting_final {#split_parts_ranges_into_intersecting_and_non_intersecting_final} + +タイプ: Bool + +デフォルト値: 1 + +FINAL最適化中に部分範囲を交差する部分と交差しない部分に分割します。 + +## splitby_max_substrings_includes_remaining_string {#splitby_max_substrings_includes_remaining_string} + +タイプ: Bool + +デフォルト値: 0 + +引数`max_substrings` > 0の[splitBy*()](../../sql-reference/functions/splitting-merging-functions.md)関数が残りの文字列を結果配列の最後の要素に含めるかどうかを制御します。 + +可能な値: + +- `0` - 残りの文字列は結果配列の最後の要素には含まれません。 +- `1` - 残りの文字列は結果配列の最後の要素に含まれます。これはSparkの[`split()`](https://spark.apache.org/docs/3.1.2/api/python/reference/api/pyspark.sql.functions.split.html)関数やPythonの['string.split()'](https://docs/ja/interfaces/cli)または[gRPCインターフェース](/docs/ja/interfaces/grpc)の動作です。 + +## throw_on_error_from_cache_on_write_operations {#throw_on_error_from_cache_on_write_operations} + +タイプ: Bool + +デフォルト値: 0 + +書き込み操作中(INSERT、マージ)のキャッシュのエラーを無視します。 + +## throw_on_max_partitions_per_insert_block {#throw_on_max_partitions_per_insert_block} + +タイプ: Bool + +デフォルト値: 1 + +max_partitions_per_insert_blockと共に使用されます。true(デフォルト)の場合、max_partitions_per_insert_blockに達したときに例外がスローされます。falseの場合、この限界に達した挿入クエリの詳細がログに記録されます。これは、max_partitions_per_insert_blockを変更した場合のユーザーへの影響を理解するのに役立ちます。 + +## throw_on_unsupported_query_inside_transaction {#throw_on_unsupported_query_inside_transaction} + +タイプ: Bool + +デフォルト値: 1 + +トランザクション内でサポートされていないクエリが使用されると例外をスローします。 + +## timeout_before_checking_execution_speed {#timeout_before_checking_execution_speed} + +タイプ: 秒 + +デフォルト値: 10 + +指定された時間が経過した後、速度があまりにも低くないことを確認します。 + +## timeout_overflow_mode {#timeout_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた際に何をするか。 + +## timeout_overflow_mode_leaf {#timeout_overflow_mode_leaf} + +タイプ: OverflowMode + +デフォルト値: throw + +葉制限が超えた際に何をするか。 + +## totals_auto_threshold {#totals_auto_threshold} + +タイプ: Float + +デフォルト値: 0.5 + +`totals_mode = 'auto'`の閾値。 +「WITH TOTALS修飾子」セクションを参照してください。 + +## totals_mode {#totals_mode} + +タイプ: TotalsMode + +デフォルト値: after_having_exclusive + +HAVINGが存在する場合、またはmax_rows_to_group_byおよびgroup_by_overflow_mode = 'any'が存在する場合、どのようにTOTALSを計算するか。 +「WITH TOTALS修飾子」セクションを参照してください。 + +## trace_profile_events {#trace_profile_events} + +タイプ: Bool + +デフォルト値: 0 + +プロファイルイベントの各更新時のスタックトレースを収集し、プロファイルイベントの名前とインクリメントの値を含むことを有効または無効にします。この情報は[trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log)に送信されます。 + +可能な値: + +- 1 — プロファイルイベントのトレースが有効。 +- 0 — プロファイルイベントのトレースが無効。 + +## transfer_overflow_mode {#transfer_overflow_mode} + +タイプ: OverflowMode + +デフォルト値: throw + +制限を超えた際に何をするか。 + +## transform_null_in {#transform_null_in} + +タイプ: Bool + +デフォルト値: 0 + +[IN](../../sql-reference/operators/in.md)演算子に対する[NULL](../../sql-reference/syntax.md/#null-literal)値の平等性を有効にします。 + +デフォルトでは、`NULL`値は比較できません。なぜなら、`NULL`は未定義の値を意味するからです。したがって、比較`expr = NULL`は常に`false`を返さなければなりません。この設定が有効な場合、`NULL = NULL`は`IN`演算子に対して`true`を返します。 + +可能な値: + +- 0 — `IN`演算子における`NULL`値の比較は`false`を返します。 +- 1 — `IN`演算子における`NULL`値の比較は`true`を返します。 + +**例** + +`null_in`テーブルを考えます: + +``` text +┌──idx─┬─────i─┐ +│ 1 │ 1 │ +│ 2 │ NULL │ +│ 3 │ 3 │ +└──────┴───────┘ +``` + +クエリ: + +``` sql +SELECT idx, i FROM null_in WHERE i IN (1, NULL) SETTINGS transform_null_in = 0; +``` + +結果: + +``` text +┌──idx─┬────i─┐ +│ 1 │ 1 │ +└──────┴──────┘ +``` + +クエリ: + +``` sql +SELECT idx, i FROM null_in WHERE i IN (1, NULL) SETTINGS transform_null_in = 1; +``` + +結果: + +``` text +┌──idx─┬─────i─┐ +│ 1 │ 1 │ +│ 2 │ NULL │ +└──────┴───────┘ +``` + +**関連情報** + +- [IN演算子におけるNULL処理](../../sql-reference/operators/in.md/#in-null-processing) + +## traverse_shadow_remote_data_paths {#traverse_shadow_remote_data_paths} + +タイプ: Bool + +デフォルト値: 0 + +system.remote_data_pathsクエリを実行するときに、実際のテーブルデータに加えて凍結データ(シャドウディレクトリ)をトラバースします。 + +## union_default_mode {#union_default_mode} + +タイプ: SetOperationMode + +デフォルト値: + +`SELECT`クエリの結果を結合するモードを設定します。この設定は、`UNION`を使用する際に明示的に`UNION ALL`または`UNION DISTINCT`を指定しない場合にのみ使用されます。 + +可能な値: + +- `'DISTINCT'` — ClickHouseは重複行を削除し、クエリを結合した結果を出力します。 +- `'ALL'` — ClickHouseは重複行を含むすべての行を出力します。 +- `''` — ClickHouseは`UNION`で使用されたときに例外を生成します。 + +[UNION](../../sql-reference/statements/select/union.md)の例を参照してください。 + +## unknown_packet_in_send_data {#unknown_packet_in_send_data} + +タイプ: UInt64 + +デフォルト値: 0 + +N番目のデータパケットの代わりに不明なパケットを送信します。 + +## use_cache_for_count_from_files {#use_cache_for_count_from_files} + +タイプ: Bool + +デフォルト値: 1 + +テーブル関数`file` / `s3` / `url` / `hdfs` / `azureBlobStorage`からのカウント時に行数のキャッシュを有効にします。 + +デフォルトで有効です。 + +## use_client_time_zone {#use_client_time_zone} + +タイプ: Bool + +デフォルト値: 0 + +サーバーのタイムゾーンを採用するのではなく、DateTime文字列値を解釈するためにクライアントタイムゾーンを使用します。 + +## use_compact_format_in_distributed_parts_names {#use_compact_format_in_distributed_parts_names} + +タイプ: Bool + +デフォルト値: 1 + +Distributedエンジンを持つテーブルに対するバックグラウンド(`distributed_foreground_insert`)INSERTのためのブロックを格納するためにコンパクトな形式を使用します。 + +可能な値: + +- 0 — `user[:password]@host:port#default_database`ディレクトリ形式を使用します。 +- 1 — `[shard{shard_index}[_replica{replica_index}]]`ディレクトリ形式を使用します。 + +:::note +- `use_compact_format_in_distributed_parts_names=0`の場合、クラスタ定義の変更は、バックグラウンドINSERTでは適用されません。 +- `use_compact_format_in_distributed_parts_names=1`の場合、クラスタ定義のノードの順序を変更すると、`shard_index` / `replica_index`が変更されるため、注意が必要です。 +::: + +## use_concurrency_control {#use_concurrency_control} + +タイプ: Bool + +デフォルト値: 1 + +サーバーの同時実行制御を遵守します(`concurrent_threads_soft_limit_num`および`concurrent_threads_soft_limit_ratio_to_cores` グローバルサーバー設定を参照)。無効にすると、サーバーが過負荷であってもより多くのスレッドを使用することができます(通常の使用には推奨されず、主にテストに必要です)。 + +## use_hedged_requests {#use_hedged_requests} + +タイプ: Bool + +デフォルト値: 1 + +リモートクエリのためのヘッジリクエストロジックを有効にします。これにより、クエリのために異なるレプリカと多くの接続を確立することができます。 +既存の接続が`hedged_connection_timeout`内に確立されなかった場合や、`receive_data_timeout`内にデータが受信されなかった場合に新しい接続が有効になります。クエリは最初に非空の進行状況パケット(またはデータパケット)を送信する接続を使用し、他の接続はキャンセルされます。`max_parallel_replicas > 1`のクエリもサポートされています。 + +デフォルトで有効です。 + +クラウドではデフォルトで無効です。 + +## use_hive_partitioning {#use_hive_partitioning} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、ClickHouseはファイル関連のテーブルエンジンのパス中でのHiveスタイルのパーティショニングを検出します(`/name=value/`)。これにより、クエリ内でパーティション列を仮想列として使用することができます。これらの仮想列は、パーティション化されたパスで同じ名前を持ちますが、`_`で始まります。 + +## use_index_for_in_with_subqueries {#use_index_for_in_with_subqueries} + +タイプ: Bool + +デフォルト値: 1 + +IN演算子の右側にサブクエリまたはテーブル式がある場合、インデックスを使用してみます。 + +## use_index_for_in_with_subqueries_max_values {#use_index_for_in_with_subqueries_max_values} + +タイプ: UInt64 + +デフォルト値: 0 + +フィルタリングにテーブルインデックスを使用するためのIN演算子の右側のセットの最大サイズ。これにより、大きなクエリに対して追加のデータ構造の準備によるパフォーマンス劣化と高いメモリ使用を回避できます。ゼロは制限なしを意味します。 + +## use_json_alias_for_old_object_type {#use_json_alias_for_old_object_type} + +タイプ: Bool + +デフォルト値: 0 + +有効にすると、`JSON`データ型エイリアスは新しい[JSON](../../sql-reference/data-types/newjson.md)型の代わりに古い[Object('json')](../../sql-reference/data-types/json.md)型を作成するために使用されます。 + +## use_local_cache_for_remote_storage {#use_local_cache_for_remote_storage} + +タイプ: Bool + +デフォルト値: 1 + +HDFSやS3のようなリモートストレージのためにローカルキャッシュを使用します。この設定はリモートテーブルエンジンのみに使用されます。 + +## use_page_cache_for_disks_without_file_cache {#use_page_cache_for_disks_without_file_cache} + +タイプ: Bool + +デフォルト値: 0 + +ファイルキャッシュが有効になっていないリモートディスク用にユーザースペースページキャッシュを使用します。 + +## use_query_cache {#use_query_cache} + +タイプ: Bool + +デフォルト値: 0 + +オンになっている場合、`SELECT`クエリは[クエリキャッシュ](../query-cache.md)を利用できる可能性があります。[enable_reads_from_query_cache](#enable-reads-from-query-cache)および[enable_writes_to_query_cache](#enable-writes-to-query-cache)パラメーターが、キャッシュの使用方法に関してより詳細に制御します。 + +可能な値: + +- 0 - 無効 +- 1 - 有効 + +## use_skip_indexes {#use_skip_indexes} + +タイプ: Bool + +デフォルト値: 1 + +クエリ実行中にデータスキッピングインデックスを使用します。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## use_skip_indexes_if_final {#use_skip_indexes_if_final} + +タイプ: Bool + +デフォルト値: 0 + +FINAL修飾子を使用したクエリを実行する際にスキップインデックスを使用するかどうかを制御します。 + +デフォルトでは、この設定は無効です。なぜなら、スキップインデックスは、最近のデータを含む行(グラニュール)を除外する可能性があり、不正確な結果につながる可能性があるからです。有効にすると、FINAL修飾子を持つクエリでもスキップインデックスが適用され、パフォーマンスが向上する可能性がありますが、最近の更新を見逃すリスクがあります。 + +可能な値: + +- 0 — 無効。 +- 1 — 有効。 + +## use_structure_from_insertion_table_in_table_functions {#use_structure_from_insertion_table_in_table_functions} + +タイプ: UInt64 + +デフォルト値: 2 + +データからのスキーマ推論の代わりに、挿入テーブルからの構造を使用します。可能な値: 0 - 無効、1 - 有効、2 - 自動。 + +## use_uncompressed_cache {#use_uncompressed_cache} + +タイプ: Bool + +デフォルト値: 0 + +未圧縮ブロックのキャッシュを使用するかどうか。0または1を受け入れます。デフォルトでは0(無効)。 +未圧縮キャッシュの使用(MergeTreeファミリのテーブルにのみ)は、多数の短いクエリを扱う際にレイテンシを大幅に減少させ、スループットを増加させることができます。頻繁に短いリクエストを送信するユーザーにはこの設定を有効にします。また、未圧縮キャッシュブロックのサイズを設定する[uncompressed_cache_size](../../operations/server-configuration-parameters/settings.md/#server-settings-uncompressed_cache_size)構成パラメーターに注意してください(構成ファイル内のみ設定) – デフォルトは8GiBです。未圧縮キャッシュは必要に応じて充填され、最も使用されていないデータは自動的に削除されます。 + +少なくともある程度の大量データ(100万行以上)を読み取るクエリについては、スペースを節約するために自動的に未圧縮キャッシュが無効になります。つまり、`use_uncompressed_cache`設定は常に1に設定しておくことができます。 + +## use_variant_as_common_type {#use_variant_as_common_type} + +タイプ: Bool + +デフォルト値: 0 + +引数型に共通の型がない場合、[if](../../sql-reference/functions/conditional-functions.md/#if)/[multiIf](../../sql-reference/functions/conditional-functions.md/#multiif)/[array](../../sql-reference/functions/array-functions.md)/[map](../../sql-reference/functions/tuple-map-functions.md)関数の結果型として`Variant`型を使用することを許可します。 + +例: + +```sql +SET use_variant_as_common_type = 1; +SELECT toTypeName(if(number % 2, number, range(number))) as variant_type FROM numbers(1); +SELECT if(number % 2, number, range(number)) as variant FROM numbers(5); +``` + +```text +┌─variant_type───────────────────┐ +│ Variant(Array(UInt64), UInt64) │ +└────────────────────────────────┘ +┌─variant───┐ +│ [] │ +│ 1 │ +│ [0,1] │ +│ 3 │ +│ [0,1,2,3] │ +└───────────┘ +``` + +```sql +SET use_variant_as_common_type = 1; +SELECT toTypeName(multiIf((number % 4) = 0, 42, (number % 4) = 1, [1, 2, 3], (number % 4) = 2, 'Hello, World!', NULL)) AS variant_type FROM numbers(1); +SELECT multiIf((number % 4) = 0, 42, (number % 4) = 1, [1, 2, 3], (number % 4) = 2, 'Hello, World!', NULL) AS variant FROM numbers(4); +``` + +```text +─variant_type─────────────────────────┐ +│ Variant(Array(UInt8), String, UInt8) │ +└──────────────────────────────────────┘ + +┌─variant───────┐ +│ 42 │ +│ [1,2,3] │ +│ Hello, World! │ +│ ᴺᵁᴸᴸ │ +└───────────────┘ +``` + +```sql +SET use_variant_as_common_type = 1; +SELECT toTypeName(array(range(number), number, 'str_' || toString(number))) as array_of_variants_type from numbers(1); +SELECT array(range(number), number, 'str_' || toString(number)) as array_of_variants FROM numbers(3); +``` + +```text +┌─array_of_variants_type────────────────────────┐ +│ Array(Variant(Array(UInt64), String, UInt64)) │ +└───────────────────────────────────────────────┘ + +┌─array_of_variants─┐ +│ [[],0,'str_0'] │ +│ [[0],1,'str_1'] │ +│ [[0,1],2,'str_2'] │ +└───────────────────┘ +``` + +```sql +SET use_variant_as_common_type = 1; +SELECT toTypeName(map('a', range(number), 'b', number, 'c', 'str_' || toString(number))) as map_of_variants_type from numbers(1); +SELECT map('a', range(number), 'b', number, 'c', 'str_' || toString(number)) as map_of_variants FROM numbers(3); +``` + +```text +┌─map_of_variants_type────────────────────────────────┐ +│ Map(String, Variant(Array(UInt64), String, UInt64)) │ +└─────────────────────────────────────────────────────┘ + +┌─map_of_variants───────────────┐ +│ {'a':[],'b':0,'c':'str_0'} │ +│ {'a':[0],'b':1,'c':'str_1'} │ +│ {'a':[0,1],'b':2,'c':'str_2'} │ +└───────────────────────────────┘ +``` + +## use_with_fill_by_sorting_prefix {#use_with_fill_by_sorting_prefix} + +タイプ: Bool + +デフォルト値: 1 + +ORDER BY句でFILL列より前のカラムがソーティングプレフィックスを形成します。ソーティングプレフィックス内で異なる値を持つ行は独立して埋められます。 + +## validate_polygons {#validate_polygons} + +タイプ: Bool + +デフォルト値: 1 + +多角形が自己交差または自己接触している場合、[pointInPolygon](../../sql-reference/functions/geo/index.md#pointinpolygon)関数で例外をスローするかどうかを有効または無効にします。 + +可能な値: + +- 0 — 例外をスローすることを無効にします。`pointInPolygon`は無効な多角形を受け入れ、それらに対して不正確な結果を返す可能性があります。 +- 1 — 例外をスローすることを有効にします。 +``` +## wait_changes_become_visible_after_commit_mode {#wait_changes_become_visible_after_commit_mode} + +タイプ: TransactionsWaitCSNMode + +デフォルト値: wait_unknown + +コミットされた変更が最新のスナップショットで実際に見えるようになるまで待機します。 + +## wait_for_async_insert {#wait_for_async_insert} + +タイプ: Bool + +デフォルト値: 1 + +trueの場合、非同期挿入処理の完了を待機します。 + +## wait_for_async_insert_timeout {#wait_for_async_insert_timeout} + +タイプ: 秒 + +デフォルト値: 120 + +非同期挿入処理の完了を待つためのタイムアウト。 + +## wait_for_window_view_fire_signal_timeout {#wait_for_window_view_fire_signal_timeout} + +タイプ: 秒 + +デフォルト値: 10 + +イベント時間処理においてウィンドウビューの信号発火を待つためのタイムアウト。 + +## window_view_clean_interval {#window_view_clean_interval} + +タイプ: 秒 + +デフォルト値: 60 + +古いデータを解放するためのウィンドウビューのクリーン間隔(秒)。 + +## window_view_heartbeat_interval {#window_view_heartbeat_interval} + +タイプ: 秒 + +デフォルト値: 15 + +ウォッチクエリが生存していることを示すためのハートビート間隔(秒)。 + +## workload {#workload} + +タイプ: 文字列 + +デフォルト値: default + +リソースにアクセスするために使用されるワークロードの名前。 + +## write_through_distributed_cache {#write_through_distributed_cache} + +タイプ: Bool + +デフォルト値: 0 + +ClickHouse Cloud のみ。分散キャッシュへの書き込みを許可します(S3への書き込みも分散キャッシュによって行われます)。 + +## zstd_window_log_max {#zstd_window_log_max} + +タイプ: Int64 + +デフォルト値: 0 + +ZSTD の最大ウィンドウログを選択することができます(これは MergeTree ファミリーには使用されません)。 diff --git a/docs/ja/operations/ssl-zookeeper.md b/docs/ja/operations/ssl-zookeeper.md new file mode 100644 index 00000000000..16312c55cba --- /dev/null +++ b/docs/ja/operations/ssl-zookeeper.md @@ -0,0 +1,77 @@ +--- +slug: /ja/operations/ssl-zookeeper +sidebar_position: 45 +sidebar_label: Zookeeperとの安全な通信 +--- + +# ClickHouseとZookeeper間のオプションの安全な通信 +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + + + +ClickHouse クライアントとのSSL通信用に `ssl.keyStore.location`、`ssl.keyStore.password`、`ssl.trustStore.location`、`ssl.trustStore.password` を指定する必要があります。これらのオプションはZookeeperバージョン3.5.2から利用可能です。 + +`zookeeper.crt`を信頼された証明書に追加できます。 + +``` bash +sudo cp zookeeper.crt /usr/local/share/ca-certificates/zookeeper.crt +sudo update-ca-certificates +``` + +`config.xml`のクライアントセクションは以下のようになります: + +``` xml + + /etc/clickhouse-server/client.crt + /etc/clickhouse-server/client.key + true + true + sslv2,sslv3 + true + + RejectCertificateHandler + + +``` + +ClickHouseの設定にZookeeperを、いくつかのクラスタとマクロと共に追加します: + +``` xml + + + + localhost + 2281 + 1 + + + +``` + +`clickhouse-server`を起動します。ログには以下のように出力されるはずです: + +```text + ZooKeeper: initialized, hosts: secure://localhost:2281 +``` + +プレフィックス `secure://` は接続がSSLで保護されていることを示しています。 + +トラフィックが暗号化されていることを確認するために、セキュアポートで`tcpdump`を実行します: + +```bash +tcpdump -i any dst port 2281 -nnXS +``` + +`clickhouse-client`でクエリを実行します: + +```sql +SELECT * FROM system.zookeeper WHERE path = '/'; +``` + +暗号化されていない接続では、`tcpdump`の出力に次のようなものが表示されます: + +```text +..../zookeeper/quota. +``` + +暗号化された接続ではこれが表示されません。 diff --git a/docs/ja/operations/startup-scripts.md b/docs/ja/operations/startup-scripts.md new file mode 100644 index 00000000000..6237f4a4879 --- /dev/null +++ b/docs/ja/operations/startup-scripts.md @@ -0,0 +1,31 @@ +--- +slug: /ja/operations/startup-scripts +sidebar_label: スタートアップスクリプト +--- + +# スタートアップスクリプト + +ClickHouse は、起動時にサーバー設定から任意の SQL クエリを実行できます。これは、マイグレーションや自動スキーマ作成に役立ちます。 + +```xml + + + + CREATE ROLE OR REPLACE test_role + + + CREATE TABLE TestTable (id UInt64) ENGINE=TinyLog + SELECT 1; + + + +``` + +ClickHouse は `startup_scripts` からのすべてのクエリを指定された順序で順番に実行します。どのクエリが失敗しても、その後のクエリの実行は中断されません。 + +設定ファイル内で条件付きクエリを指定することができます。この場合、該当するクエリは条件クエリが `1` または `true` を返す場合にのみ実行されます。 + +:::note +条件クエリが `1` または `true` 以外の値を返した場合、結果は `false` と解釈され、該当するクエリは実行されません。 +::: + diff --git a/docs/ja/operations/storing-data.md b/docs/ja/operations/storing-data.md new file mode 100644 index 00000000000..8be855d5946 --- /dev/null +++ b/docs/ja/operations/storing-data.md @@ -0,0 +1,977 @@ +--- +slug: /ja/operations/storing-data +sidebar_position: 68 +sidebar_label: "データ保存用の外部ディスク" +title: "データ保存用の外部ディスク" +--- + +ClickHouseで処理されたデータは、通常、ClickHouseサーバーと同じマシンにあるローカルファイルシステムに保存されます。これは大容量のディスクを必要とし、これらはかなり高価になることがあります。それを避けるために、データをリモートに保存することもできます。様々なストレージがサポートされています: +1. [Amazon S3](https://aws.amazon.com/s3/) オブジェクトストレージ。 +2. [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs)。 +3. 非サポート: Hadoop 分散ファイルシステム ([HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)) + +:::note ClickHouseは外部テーブルエンジンもサポートしており、このページで説明する外部ストレージオプションとは異なります。これらは、一般的なファイルフォーマット(例: Parquet)で保存されたデータを読み取ることができますが、このページではClickHouseの`MergeTree`ファミリまたは`Log`ファミリテーブルのストレージ設定を説明しています。 +1. `Amazon S3`ディスクに保存されているデータを操作するには、[S3](/docs/ja/engines/table-engines/integrations/s3.md)テーブルエンジンを使用してください。 +2. Azure Blob Storageに保存されているデータを操作するには、[AzureBlobStorage](/docs/ja/engines/table-engines/integrations/azureBlobStorage.md)テーブルエンジンを使用してください。 +3. 非サポート: Hadoop 分散ファイルシステムのデータを操作するには、[HDFS](/docs/ja/engines/table-engines/integrations/hdfs.md)テーブルエンジンを使用してください。 +::: + +## 外部ストレージの設定 {#configuring-external-storage} + +[MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)と[Log](/docs/ja/engines/table-engines/log-family/log.md)ファミリテーブルエンジンは、`s3`、`azure_blob_storage`、`hdfs` (非サポート)のタイプを持つディスクを使用してデータを`S3`、`AzureBlobStorage`、`HDFS`(非サポート)に保存できます。 + +ディスク設定には以下が必要です: +1. `type`セクションは`s3`、`azure_blob_storage`、`hdfs`(非サポート)、`local_blob_storage`、`web`のいずれかと等しくする。 +2. 特定の外部ストレージタイプの設定。 + +24.1バージョンのclickhouseからは、新しい設定オプションを使用できるようになりました。 +これは以下を指定する必要があります: +1. `type`が`object_storage`と等しいこと +2. `object_storage_type`が`s3`、`azure_blob_storage`(24.3以降は単に`azure`)、`hdfs`(非サポート)、`local_blob_storage`(24.3以降は単に`local`)、`web`のいずれかと等しいこと。オプションで、`metadata_type`を指定できます(デフォルトで`local`と等しい)が、`plain`、`web`、そして24.4以降は`plain_rewritable`に設定することもできます。`plain`メタデータタイプの使用法については、[plain storage section](/docs/ja/operations/storing-data.md/#storing-data-on-webserver)を参照してください。 `web`メタデータタイプは`web`オブジェクトストレージタイプでのみ使用可能で、`local`メタデータタイプはメタデータファイルをローカルに保存します(各メタデータファイルには、オブジェクトストレージ内のファイルへのマッピングとそれらについての追加のメタ情報が含まれます)。 + +例としての設定オプション +``` xml + + s3 + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +は、(24.1以降のバージョンの)設定と等しい: +``` xml + + object_storage + s3 + local + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +設定 +``` xml + + s3_plain + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +は以下と等しい +``` xml + + object_storage + s3 + plain + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +完全なストレージ設定の例は次のようになるでしょう: +``` xml + + + + + s3 + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + + + + + +
    + s3 +
    +
    +
    +
    +
    +
    +``` + +24.1バージョンのclickhouseからは以下のようにも設定できます: +``` xml + + + + + object_storage + s3 + local + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + + + + + +
    + s3 +
    +
    +
    +
    +
    +
    +``` + +特定の種類のストレージをすべての`MergeTree`テーブルのデフォルトオプションにするには、 次のセクションを設定ファイルに追加します: + +``` xml + + + s3 + + +``` + +特定のストレージポリシーを特定のテーブルにのみ設定したい場合は、テーブルを作成する際に設定で定義できます: + +``` sql +CREATE TABLE test (a Int32, b String) +ENGINE = MergeTree() ORDER BY a +SETTINGS storage_policy = 's3'; +``` + +`storage_policy`の代わりに`disk`を使用することもできます。この場合、`storage_policy`セクションは設定ファイルに不要で、`disk`セクションだけで十分です。 + +``` sql +CREATE TABLE test (a Int32, b String) +ENGINE = MergeTree() ORDER BY a +SETTINGS disk = 's3'; +``` + +## 動的設定 {#dynamic-configuration} + +設定ファイル内にあらかじめ定義されたディスクなしでストレージ設定を指定することも可能ですが、`CREATE`/`ATTACH`クエリ設定に設定できます。 + +次のクエリア例は、上述の動的ディスク設定を基に構築されており、URLに保存されているテーブルからデータをキャッシュするためにローカルディスクを使用する方法を示しています。 + +```sql +ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7' +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4), + is_new UInt8, + duration Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (postcode1, postcode2, addr1, addr2) + # highlight-start + SETTINGS disk = disk( + type=web, + endpoint='https://raw.githubusercontent.com/ClickHouse/web-tables-demo/main/web/' + ); + # highlight-end +``` + +以下の例では外部ストレージにキャッシュを追加します。 + +```sql +ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7' +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4), + is_new UInt8, + duration Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (postcode1, postcode2, addr1, addr2) + # highlight-start + SETTINGS disk = disk( + type=cache, + max_size='1Gi', + path='/var/lib/clickhouse/custom_disk_cache/', + disk=disk( + type=web, + endpoint='https://raw.githubusercontent.com/ClickHouse/web-tables-demo/main/web/' + ) + ); + # highlight-end +``` + +以下の設定に注目してください。`type=web`のディスクが`type=cache`のディスク内にネストされています。 + +:::note +例では`type=web`を使用していますが、任意のディスクタイプを動的に設定可能です。ローカルディスクの場合、`custom_local_disks_base_directory`設定パラメータ内で`path`引数が必要です。このデフォルトはありませんので、ローカルディスクを使用する場合はその設定も忘れずに行ってください。 +::: + +設定に基づく設定とSQL定義された設定の組み合わせも可能です: + +```sql +ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7' +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4), + is_new UInt8, + duration Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (postcode1, postcode2, addr1, addr2) + # highlight-start + SETTINGS disk = disk( + type=cache, + max_size='1Gi', + path='/var/lib/clickhouse/custom_disk_cache/', + disk=disk( + type=web, + endpoint='https://raw.githubusercontent.com/ClickHouse/web-tables-demo/main/web/' + ) + ); + # highlight-end +``` + +ここで`web`はサーバー設定ファイルから来るものです: + +``` xml + + + + web + 'https://raw.githubusercontent.com/ClickHouse/web-tables-demo/main/web/' + + + +``` + +### S3ストレージの使用 {#s3-storage} + +必要なパラメーター: + +- `endpoint` — `path`または`virtual hosted`[スタイル](https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html)のS3エンドポイントURL。エンドポイントURLにはデータを保存するバケットとルートパスを含める必要があります。 +- `access_key_id` — S3アクセスキーID。 +- `secret_access_key` — S3シークレットアクセスキー。 + +オプションのパラメーター: + +- `region` — S3リージョン名。 +- `support_batch_delete` — バッチ削除がサポートされているかのチェックを制御します。Google Cloud Storage (GCS)を使用する場合、バッチ削除はサポートされていないため、このチェックを予防することでログにエラーメッセージが表示されないよう`false`に設定します。 +- `use_environment_credentials` — 環境変数AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、およびAWS_SESSION_TOKEN(存在する場合)からAWS資格情報を読み取ります。デフォルト値は`false`です。 +- `use_insecure_imds_request` — `true`に設定すると、S3クライアントはAmazon EC2メタデータから資格情報を取得する際に非セキュアなIMDS リクエストを使用します。デフォルト値は`false`です。 +- `expiration_window_seconds` — 有効期限ベースの資格情報の有効期限を確認するための猶予期間。オプションで、デフォルト値は`120`です。 +- `proxy` — S3エンドポイントのためのプロキシ設定。`proxy`ブロック内の各`uri`要素はプロキシURLを含める必要があります。 +- `connect_timeout_ms` — ソケット接続タイムアウト(ミリ秒単位)。デフォルト値は`10秒`です。 +- `request_timeout_ms` — リクエストタイムアウト(ミリ秒単位)。デフォルト値は`5秒`です。 +- `retry_attempts` — リクエストが失敗した場合の再試行回数。デフォルト値は`10`です。 +- `single_read_retries` — 読み取り中の接続ドロップ時に再試行する回数。デフォルト値は`4`です。 +- `min_bytes_for_seek` — 順次読み取りの代わりにシーク操作を使用する最小バイト数。デフォルト値は`1 Mb`です。 +- `metadata_path` — S3のメタデータファイルを保存するローカルFSパス。デフォルト値は`/var/lib/clickhouse/disks//`です。 +- `skip_access_check` — trueの場合、ディスクの起動時にアクセスチェックは実行されません。デフォルト値は`false`です。 +- `header` — 指定されたHTTPヘッダーを指定されたエンドポイントへのリクエストに追加します。オプションで、複数回指定可能です。 +- `server_side_encryption_customer_key_base64` — 指定されている場合、SSE-C暗号化によるS3オブジェクトへのアクセスに必要なヘッダーが設定されます。 +- `server_side_encryption_kms_key_id` - 指定された場合、[SSE-KMS暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)のために必要なヘッダーが設定されます。空の文字列が指定された場合、AWS管理のS3キーが使用されます。オプションです。 +- `server_side_encryption_kms_encryption_context` - `server_side_encryption_kms_key_id`と共に指定された場合、SSE-KMSのための暗号化コンテキストヘッダーが設定されます。オプションです。 +- `server_side_encryption_kms_bucket_key_enabled` - `server_side_encryption_kms_key_id`と共に指定された場合、SSE-KMSのためのS3バケットキーを有効にするためのヘッダーが設定されます。オプションで、`true`または`false`を指定でき、デフォルトでは何も指定されていません(バケットレベルの設定に一致します)。 +- `s3_max_put_rps` — スロットリング前の最大PUTリクエスト/秒レート。デフォルト値は`0`(無制限)です。 +- `s3_max_put_burst` — リクエスト/秒の制限に達する前に同時に発行できる最大リクエスト数。デフォルトでは (`0`値) `s3_max_put_rps`に等しい。 +- `s3_max_get_rps` — スロットリング前の最大GETリクエスト/秒レート。デフォルト値は`0`(無制限)です。 +- `s3_max_get_burst` — リクエスト/秒の制限に達する前に同時に発行できる最大リクエスト数。デフォルトでは (`0`値) `s3_max_get_rps`に等しい。 +- `read_resource` — このディスクへの読み取りリクエストの[スケジューリング](/docs/ja/operations/workload-scheduling.md)に使用されるリソース名。デフォルト値は空文字列(IOスケジューリングはこのディスクに対して有効ではありません)。 +- `write_resource` — このディスクへの書き込みリクエストの[スケジューリング](/docs/ja/operations/workload-scheduling.md)に使用されるリソース名。デフォルト値は空文字列(IOスケジューリングはこのディスクに対して有効ではありません)。 +- `key_template` — オブジェクトのキーが生成される形式を定義します。デフォルトでは、ClickHouseは`endpoint`オプションの`root path`を取得し、ランダムに生成されたサフィックスを追加します。そのサフィックスは3つのランダム記号を持つディレクトリと29のランダム記号を持つファイル名です。このオプションでは、オブジェクトキーがどのように生成されるかを完全に制御できます。いくつかの使用シナリオでは、プレフィックスまたはオブジェクトキーの中央にランダム記号を保持する必要があります。たとえば、`[a-z]{3}-prefix-random/constant-part/random-middle-[a-z]{3}/random-suffix-[a-z]{29}`。値は[`re2`](https://github.com/google/re2/wiki/Syntax)で解析されます。サフィックスがサポートされているかどうかを確認してください。`key_compatibility_prefix`オプションの定義が必要です。この機能を使用するには、[storage_metadata_write_full_object_key](/docs/ja/operations/settings/settings#storage_metadata_write_full_object_key)の機能フラグを有効にする必要があります。`endpoint`オプションに`root path`を宣言することは禁止されています。`key_compatibility_prefix`のオプションの定義が必要です。 +- `key_compatibility_prefix` — `key_template`オプションが使用されている場合、このオプションが必要です。メタデータバージョンが`VERSION_FULL_OBJECT_KEY`より低いメタデータファイルで保存されたオブジェクトキーを読み取ることができるようにするために、以前の`endpoint`オプションの`root path`をここに設定する必要があります。 + +:::note +Google Cloud Storage (GCS) も`type`を`s3`として使用することでサポートされています。詳細は[GCSバッキングされたMergeTree](/docs/ja/integrations/gcs)を参照してください。 +::: + +### プレーンストレージの使用 {#plain-storage} + +`22.10`から導入された新しいディスクタイプ`s3_plain`は、書き込みのみのストレージを提供します。構成パラメータは`s3`ディスクタイプと同じです。 +`s3`ディスクタイプとは異なり、データはそのまま記憶されます。つまり、ランダムに生成されたブロブ名の代わりに通常のファイル名が使用され(clickhouseがローカルディスクにファイルを保存する方法と同じ)、`s3`内のデータから派生したメタデータがローカルに保存されません。 + +このディスクタイプは、既存のデータに対するマージを実行したり、新しいデータの挿入を許可しないため、テーブルの静的なバージョンを保持することを可能にします。このディスクタイプのユースケースとしては、`BACKUP TABLE data TO Disk('plain_disk_name', 'backup_name')` を使用してバックアップを作成し、その後 `RESTORE TABLE data AS data_restored FROM Disk('plain_disk_name', 'backup_name')` または `ATTACH TABLE data (...) ENGINE = MergeTree() SETTINGS disk = 'plain_disk_name'` を使用する方法があります。 + +設定: +``` xml + + s3_plain + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +`24.1`以降、任意のオブジェクトストレージディスク(`s3`、`azure`、`hdfs`(非サポート)、`local`)を使用して`plain`メタデータタイプを構成することが可能です。 + +設定: +``` xml + + object_storage + azure + plain + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +### S3 プレーンリライト可能ストレージの使用 {#s3-plain-rewritable-storage} + +新しいディスクタイプ`s3_plain_rewritable`は`24.4`で導入されました。 +`s3_plain`ディスクタイプと同様に、追加のメタデータファイルを必要とせず、メタデータはS3に保存されます。 +`s3_plain`ディスクタイプとは異なり、`s3_plain_rewritable`はマージの実行を許可し、INSERT操作をサポートします。 +ただし、[ミューテーション](/docs/ja/sql-reference/statements/alter#mutations)とレプリケーションはサポートされていません。 + +このディスクタイプのユースケースとしては、非レプリケート`MergeTree`テーブルがあります。`s3`ディスクタイプも非レプリケート`MergeTree`テーブルに適していますが、このディスクタイプを選択することで、テーブルのローカルメタデータが不要で、制限された操作セットに満足できる場合に役立ちます。これはたとえば、システムテーブルに役立つかもしれません。 + +設定: +``` xml + + s3_plain_rewritable + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +これは以下と等しい +``` xml + + object_storage + s3 + plain_rewritable + https://s3.eu-west-1.amazonaws.com/clickhouse-eu-west-1.clickhouse.com/data/ + 1 + +``` + +`24.5`以降、任意のオブジェクトストレージディスク(`s3`、`azure`、`local`)を使って`plain_rewritable`メタデータタイプを構成することが可能です。 + +### Azure Blob Storage の使用 {#azure-blob-storage} + +`MergeTree`ファミリテーブルエンジンは、`azure_blob_storage`タイプのディスクを使用して[Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs/)にデータを保存することができます。 + +2022年2月現在、この機能はまだ新しい追加機能なので、Azure Blob Storageの一部の機能が未実装である可能性があります。 + +設定マークアップ: +``` xml + + ... + + + azure_blob_storage + http://account.blob.core.windows.net + container + account + pass123 + /var/lib/clickhouse/disks/blob_storage_disk/ + /var/lib/clickhouse/disks/blob_storage_disk/cache/ + false + + + ... + +``` + +接続パラメータ: +* `storage_account_url` - **必須**、Azure Blob StorageアカウントURL。`http://account.blob.core.windows.net`や`http://azurite1:10000/devstoreaccount1`のような形式。 +* `container_name` - 対象のコンテナ名、デフォルトは`default-container`。 +* `container_already_exists` - `false`に設定すると、新しいコンテナ`container_name`がストレージアカウントに作成されます。`true`に設定すると、コンテナに直接接続されます。設定されていない場合、ディスクはアカウントに接続してコンテナ`container_name`が存在するかチェックし、まだ存在しない場合は作成します。 + +認証パラメータ(ディスクは使用可能な全てのメソッド**と**管理対象ID資格情報を試みます): +* `connection_string` - 接続文字列を用いた認証用。 +* `account_name`と`account_key` - 共有キーを用いた認証用。 + +制限パラメータ(主に内部使用向け): +* `s3_max_single_part_upload_size` - Blob Storageに単一のブロックアップロードのサイズを制限します。 +* `min_bytes_for_seek` - シーク可能な領域のサイズを制限します。 +* `max_single_read_retries` - Blob Storageからのデータチャンクの読み取り試行回数を制限します。 +* `max_single_download_retries` - Blob Storageからの読み取り可能なバッファのダウンロード試行回数を制限します。 +* `thread_pool_size` - `IDiskRemote`がインスタンス化する際のスレッド数を制限します。 +* `s3_max_inflight_parts_for_one_file` - 一つのオブジェクトに対して同時に実行可能なputリクエストの数を制限します。 + +その他のパラメータ: +* `metadata_path` - Blob Storageのメタデータファイルを保存するローカルFSパス。デフォルト値は`/var/lib/clickhouse/disks//`です。 +* `skip_access_check` - trueの場合、ディスクの起動時にアクセスチェックは実行されません。デフォルト値は`false`です。 +* `read_resource` — このディスクへの読み取りリクエストの[スケジューリング](/docs/ja/operations/workload-scheduling.md)に使用されるリソース名。デフォルト値は空文字列(IOスケジューリングはこのディスクに対して有効ではありません)。 +* `write_resource` — このディスクへの書き込みリクエストの[スケジューリング](/docs/ja/operations/workload-scheduling.md)に使用されるリソース名。デフォルト値は空文字列(IOスケジューリングはこのディスクに対して有効ではありません)。 +* `metadata_keep_free_space_bytes` - メタデータディスクに予約される空き領域の量。 + +動作する設定例は、統合テストディレクトリにあります(例: [test_merge_tree_azure_blob_storage](https://github.com/ClickHouse/ClickHouse/blob/master/tests/integration/test_merge_tree_azure_blob_storage/configs/config.d/storage_conf.xml)または[test_azure_blob_storage_zero_copy_replication](https://github.com/ClickHouse/ClickHouse/blob/master/tests/integration/test_azure_blob_storage_zero_copy_replication/configs/config.d/storage_conf.xml)を参照)。 + +:::note Zero-copy レプリケーションは本番環境には対応していません +Zero-copy レプリケーションはClickHouseバージョン22.8以降でデフォルトで無効になっています。この機能は本番環境での使用を推奨しません。 +::: + +## HDFS ストレージの使用(非対応) + +このサンプル設定では: +- ディスクタイプは`hdfs`(非サポート) +- データは`hdfs://hdfs1:9000/clickhouse/`にホストされています。 + +ちなみに、HDFSはサポートされていないため、使用時に問題が発生する可能性があります。問題が発生した場合は、修正のためのプルリクエストを自由に行ってください。 + +```xml + + + + + hdfs + hdfs://hdfs1:9000/clickhouse/ + true + + + local + / + + + + + +
    + hdfs +
    + + hdd + +
    +
    +
    +
    +
    +``` + +HDFSは、コーナーケースで動作しない場合があります。 + +### データ暗号化の使用 {#encrypted-virtual-file-system} + +[S3](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)、またはオンプレミスディスクに保存されたデータを暗号化することができます。暗号化モードをオンにするには、設定ファイルで`encrypted`タイプのディスクを定義し、データが保存されるディスクを選択する必要があります。`encrypted`ディスクは書き込み中にすべてのファイルをオンザフライで暗号化し、ファイルを読む際には自動的に復号します。したがって、通常のディスクと同様に`encrypted`ディスクを操作できます。 + +ディスク設定の例: + +``` xml + + + local + /path1/ + + + encrypted + disk1 + path2/ + _16_ascii_chars_ + + +``` + +例えば、ClickHouseがあるテーブルからファイル`store/all_1_1_0/data.bin`を`disk1`に書き込む場合、実際にはこのファイルは物理ディスクにパス`/path1/store/all_1_1_0/data.bin`として書き込まれます。 + +同じファイルを`disk2`に書き込む際には、実際には物理ディスクにパス`/path1/path2/store/all_1_1_0/data.bin`として暗号化モードで書き込まれます。 + +必須パラメータ: + +- `type` — `encrypted`。暗号化されたディスクを作成するにはこれが必要です。 +- `disk` — データを保存するためのディスクのタイプ。 +- `key` — 暗号化と復号化のためのキー。タイプ: [Uint64](/docs/ja/sql-reference/data-types/int-uint.md)。キーを16進形式でエンコードするためには`key_hex`パラメータを使用できます。 +keyを複数指定する場合、`id`属性を使用して識別できます(下記の例を参照)。 + +オプションパラメータ: + +- `path` — ディスク上でデータが保存される場所へのパス。指定されていない場合は、データはルートディレクトリに保存されます。 +- `current_key_id` — 暗号化に使用されるキーです。指定されたすべてのキーは復号化に使用でき、以前に暗号化されたデータへのアクセスを維持しつつ、いつでも別のキーに切り替えられます。 +- `algorithm` — 暗号化に使用する[アルゴリズム](/docs/ja/sql-reference/statements/create/table.md/#create-query-encryption-codecs)。可能な値:`AES_128_CTR`、`AES_192_CTR`、または`AES_256_CTR`。デフォルト値:`AES_128_CTR`。アルゴリズムによってキーの長さは異なります:`AES_128_CTR` — 16バイト、`AES_192_CTR` — 24バイト、`AES_256_CTR` — 32バイト。 + +ディスク設定の例: + +``` xml + + + + + s3 + ... + + + encrypted + disk_s3 + AES_128_CTR + 00112233445566778899aabbccddeeff + ffeeddccbbaaa99887766554433221100 + 1 + + + + +``` + +### ローカルキャッシュの使用 {#using-local-cache} + +バージョン22.3以降、ストレージ設定内でディスクに対してローカルキャッシュを設定することが可能です。 +バージョン22.3から22.7の間は、`s3`ディスクタイプに対してのみキャッシュがサポートされています。バージョン>=22.8では、任意のディスクタイプ(S3、Azure、ローカル、暗号化など)に対してキャッシュがサポートされています。 +バージョン>=23.5では、リモートディスクタイプ(S3、Azure、HDFS 非対応)のみキャッシュがサポートされています。 +キャッシュは`LRU`キャッシュポリシーを使用しています。 + + +次にバージョン22.8以降の構成例です: + +``` xml + + + + + s3 + ... + ... s3 configuration ... + + + cache + s3 + /s3_cache/ + 10Gi + + + + + +
    + cache +
    +
    +
    + +
    +``` + +バージョン22.8以前の構成例: + +``` xml + + + + + s3 + ... + ... s3 configuration ... + 1 + 10737418240 + + + + + +
    + s3 +
    +
    +
    + +
    +``` + +ファイルキャッシュ**ディスク設定の設定**: + +これらの設定は、ディスク設定セクションで定義する必要があります。 + +- `path` - キャッシュを保存するディレクトリへのパス。デフォルト:None、この設定は必須です。 + +- `max_size` - バイト単位または読み取り可能な形式でのキャッシュの最大サイズ(例:`ki, Mi, Gi`など、例`10Gi`(この形式はバージョン`22.10`以降で使用可能))。制限に達した場合、キャッシュファイルはキャッシュエビクションポリシーに従って削除されます。デフォルト:None、この設定は必須です。 + +- `cache_on_write_operations` - `write-through`キャッシュ(すべての書き込み操作(`INSERT`クエリ、バックグラウンドマージ)でデータがキャッシュされます)をオンにすることができます。デフォルト:`false`です。`write-through`キャッシュは、設定`enable_filesystem_cache_on_write_operations`を使用してクエリごとに無効にすることができます(データは、キャッシュ設定と対応するクエリ設定が両方とも有効な場合にのみキャッシュされます)。 + +- `enable_filesystem_query_cache_limit` - 各クエリ内でダウンロードされたキャッシュのサイズを制限することを許可します(ユーザー設定`max_query_cache_size`に依存します)。デフォルト:`false`です。 + +- `enable_cache_hits_threshold` - データがキャッシュされる前に必要な読み取り回数を定義します。デフォルト:`false`です。このしきい値は、`cache_hits_threshold`によって定義できます。デフォルト:`0`、つまり最初の試行でデータがキャッシュされます。 + +- `enable_bypass_cache_with_threshold` - 要求された読み取り範囲がしきい値を超えた場合にキャッシュを完全にスキップすることを許可します。デフォルト:`false`です。このしきい値は、`bypass_cache_threashold`によって定義できます。デフォルト:`268435456`(`256Mi`)。 + +- `max_file_segment_size` - 単一キャッシュファイルの最大サイズ(バイト単位または読み取り可能な形式(`ki, Mi, Gi`など、例`10Gi`))。デフォルト:`8388608`(`8Mi`)。 + +- `max_elements` - キャッシュファイルの数の制限。デフォルト:`10000000`。 + +- `load_metadata_threads` - 起動時にキャッシュメタデータをロードするために使用されるスレッドの数。デフォルト:`16`. + +ファイルキャッシュ**クエリ/プロファイル設定**: + +これらの設定の一部は、デフォルトまたはディスク設定の設定で有効にされているキャッシュ機能をクエリ/プロファイルごとに無効にします。 たとえば、キャッシュをディスク設定で有効にし、クエリ/プロファイル設定を`enable_filesystem_cache`として`false`に設定してクエリごとに無効にすることができます。また、 `write-through`キャッシュが有効であることを意味します。特定のクエリごとにこの一般的な設定を無効にする必要がある場合は、`enable_filesystem_cache_on_write_operations`を`false`にすることができます。 + +- `enable_filesystem_cache` - クエリごとにディスクタイプが`cache`で構成されているストレージポリシーの場合でもキャッシュを無効にすることを許可します。デフォルト:`true`。 + +- `read_from_filesystem_cache_if_exists_otherwise_bypass_cache` - 既に存在する場合にのみクエリでキャッシュを利用し、それ以外の場合はクエリデータがローカルキャッシュストレージに書き込まれないようにすることを許可します。デフォルト:`false`。 + +- `enable_filesystem_cache_on_write_operations` - `write-through`キャッシュをオンにします。この設定は、キャッシュ設定で`cache_on_write_operations`がオンになっている場合にのみ機能します。デフォルト:`false`。クラウドのデフォルト値:`true`。 + +- `enable_filesystem_cache_log` - `system.filesystem_cache_log`テーブルへのログ記録をオンにします。クエリごとに、またはプロファイル内で有効にすることができます。デフォルト:`false`。 + +- `max_query_cache_size` - ローカルキャッシュストレージに書き込める最大キャッシュサイズの制限。キャッシュ設定で`enable_filesystem_query_cache_limit`が有効な場合にのみ機能します。デフォルト:`false`。 + +- `skip_download_if_exceeds_query_cache` - `max_query_cache_size`設定の動作を変更します。デフォルト:`true`。この設定がオンで、クエリ中にキャッシュダウンロード制限に達した場合、キャッシュはこれ以上ダウンロードされません。この設定がオフで、クエリ中にキャッシュダウンロード制限が達した場合、キャッシュはそれでも現在のクエリ内でダウンロードされたデータを以前にエビクトすることで書き込まれます。つまり、2番目の動作はクエリキャッシュ制限を維持しながら、`last recently used`の振る舞いを維持します。 + +**警告** +キャッシュ設定の設定とキャッシュクエリ設定は最新のClickHouseバージョンに対応していますが、以前のバージョンでは何かがサポートされていない可能性があります。 + +キャッシュ**システムテーブル**: + +- `system.filesystem_cache` - キャッシュの現在の状況を表示するシステムテーブル。 + +- `system.filesystem_cache_log` - クエリごとのキャッシュ使用の詳細を表示するシステムテーブル。`enable_filesystem_cache_log`設定が`true`であることが必要です。 + +キャッシュ**コマンド**: + +- `SYSTEM DROP FILESYSTEM CACHE () (ON CLUSTER)` -- `ON CLUSTER`は``が指定されていない時のみサポートされます + +- `SHOW FILESYSTEM CACHES` -- サーバーで構成されているファイルシステムキャッシュのリストを表示します。(バージョン<= `22.8`では`SHOW CACHES`というコマンド名が使用されます) + +```sql +SHOW FILESYSTEM CACHES +``` + +結果: + +``` text +┌─Caches────┐ +│ s3_cache │ +└───────────┘ +``` + +- `DESCRIBE FILESYSTEM CACHE ''` - 特定のキャッシュの構成といくつかの一般的な統計を表示します。キャッシュ名は`SHOW FILESYSTEM CACHES`コマンドから取得できます。(バージョン<= `22.8`では`DESCRIBE CACHE`というコマンド名が使用されます) + +```sql +DESCRIBE FILESYSTEM CACHE 's3_cache' +``` + +``` text +┌────max_size─┬─max_elements─┬─max_file_segment_size─┬─boundary_alignment─┬─cache_on_write_operations─┬─cache_hits_threshold─┬─current_size─┬─current_elements─┬─path───────┬─background_download_threads─┬─enable_bypass_cache_with_threshold─┐ +│ 10000000000 │ 1048576 │ 104857600 │ 4194304 │ 1 │ 0 │ 3276 │ 54 │ /s3_cache/ │ 2 │ 0 │ +└─────────────┴──────────────┴───────────────────────┴────────────────────┴───────────────────────────┴──────────────────────┴──────────────┴──────────────────┴────────────┴─────────────────────────────┴────────────────────────────────────┘ +``` + +キャッシュの現在のメトリクス: + +- `FilesystemCacheSize` + +- `FilesystemCacheElements` + +キャッシュの非同期メトリクス: + +- `FilesystemCacheBytes` + +- `FilesystemCacheFiles` + +キャッシュプロファイルイベント: + +- `CachedReadBufferReadFromSourceBytes`, `CachedReadBufferReadFromCacheBytes,` + +- `CachedReadBufferReadFromSourceMicroseconds`, `CachedReadBufferReadFromCacheMicroseconds` + +- `CachedReadBufferCacheWriteBytes`, `CachedReadBufferCacheWriteMicroseconds` + +- `CachedWriteBufferCacheWriteBytes`, `CachedWriteBufferCacheWriteMicroseconds` + +### 静的Webストレージの使用(読み取り専用) {#web-storage} + +これは読み取り専用ディスクです。そのデータは読み取られるだけで、変更されることはありません。新しいテーブルは `ATTACH TABLE` クエリを介してこのディスクにロードされます(以下の例を参照)。ローカルディスクは実際には使用されず、各`SELECT`クエリは必要なデータを取得するための`http`リクエストを発生させます。テーブルデータの変更はすべて例外となり、以下のタイプのクエリは許可されません:[CREATE TABLE](/docs/ja/sql-reference/statements/create/table.md), [ALTER TABLE](/docs/ja/sql-reference/statements/alter/index.md), [RENAME TABLE](/docs/ja/sql-reference/statements/rename.md/#misc_operations-rename_table), [DETACH TABLE](/docs/ja/sql-reference/statements/detach.md), [TRUNCATE TABLE](/docs/ja/sql-reference/statements/truncate.md)。 +ウェブストレージは読み取り専用目的で使用できます。例として、サンプルデータのホスティングやデータの移行があります。 +データディレクトリを特定のテーブル(`SELECT data_paths FROM system.tables WHERE name = 'table_name'`)に対して準備するツール`clickhouse-static-files-uploader`があります。必要な各テーブルについて、ファイルのディレクトリが得られます。これらのファイルは、たとえば静的ファイルを持つウェブサーバーにアップロードできます。この準備の後、任意のClickHouseサーバにこのテーブルを`DiskWeb`経由でロードすることができます。 + +このサンプル構成では: +- ディスクタイプは`web` +- データは`http://nginx:80/test1/`にホストされています +- ローカルストレージにキャッシュが使用されます + +```xml + + + + + web + http://nginx:80/test1/ + + + cache + web + cached_web_cache/ + 100000000 + + + + + +
    + web +
    +
    +
    + + +
    + cached_web +
    +
    +
    +
    +
    +
    +``` + +:::tip +通常使用されないWebデータセットの場合、クエリ内で一時的にストレージを設定できるので、設定ファイルを編集する手間が省けます。詳細は[dynamic configuration](#dynamic-configuration)を参照。 +::: + +:::tip +デモデータセットがGitHubにホストされています。自分のテーブルをWebストレージに準備する方法については、ツール[clickhouse-static-files-uploader](/docs/ja/operations/storing-data.md/#storing-data-on-webserver)を参照してください。 +::: + +この`ATTACH TABLE`クエリでは、指定された`UUID`がデータのディレクトリ名に一致し、エンドポイントは生のGitHubコンテンツのURLです。 + +```sql +# highlight-next-line +ATTACH TABLE uk_price_paid UUID 'cf712b4f-2ca8-435c-ac23-c4393efe52f7' +( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('other' = 0, 'terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4), + is_new UInt8, + duration Enum8('unknown' = 0, 'freehold' = 1, 'leasehold' = 2), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY (postcode1, postcode2, addr1, addr2) + # highlight-start + SETTINGS disk = disk( + type=web, + endpoint='https://raw.githubusercontent.com/ClickHouse/web-tables-demo/main/web/' + ); + # highlight-end +``` + +すぐにテストケースを準備します。この設定をコンフィグに追加する必要があります: + +``` xml + + + + + web + https://clickhouse-datasets.s3.yandex.net/disk-with-static-files-tests/test-hits/ + + + + + +
    + web +
    +
    +
    +
    +
    +
    +``` + +次にこのクエリを実行します: + +```sql +ATTACH TABLE test_hits UUID '1ae36516-d62d-4218-9ae3-6516d62da218' +( + 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 storage_policy='web'; +``` + +必須パラメーター: + +- `type` — `web`。これ以外ではディスクは作成されません。 +- `endpoint` — `path`形式でのエンドポイントURL。エンドポイントURLには、データがアップロードされたルートパスを含める必要があります。 + +オプションパラメーター: + +- `min_bytes_for_seek` — シーク操作を使用する最小バイト数。デフォルト値:`1` Mb。 +- `remote_fs_read_backoff_threashold` — リモートディスクのデータを読み取る際の最大待機時間。デフォルト値:`10000`秒。 +- `remote_fs_read_backoff_max_tries` — バックオフの最大リトライ回数。デフォルト値:`5`。 + +クエリが`DB:Exception Unreachable URL`の例外で失敗した場合は、設定を調整してみてください:[http_connection_timeout](/docs/ja/operations/settings/settings.md/#http_connection_timeout), [http_receive_timeout](/docs/ja/operations/settings/settings.md/#http_receive_timeout), [keep_alive_timeout](/docs/ja/operations/server-configuration-parameters/settings.md/#keep-alive-timeout)。 + +アップロードするファイルを取得するには、以下を実行します: +`clickhouse static-files-disk-uploader --metadata-path --output-dir `(`--metadata-path` はクエリ`SELECT data_paths FROM system.tables WHERE name = 'table_name'`で確認できます)。 + +ロードする際にはファイルは`/store/`パスにアップロードされる必要がありますが、コンフィグには`endpoint`だけを含める必要があります。 + +ディスクロード時にURLに到達できない場合、つまりサーバが起動してテーブルを開始する時に、すべてのエラーがキャッチされます。この場合、テーブルは再ロード(可視化)されることがあります。`DETACH TABLE table_name` -> `ATTACH TABLE table_name`。サーバ起動時にメタデータが正常にロードされた場合、テーブルはすぐに利用可能です。 + +設定が`HTTP接続の最大再試行`で制限されている場合、単一のHTTP読み取り中の最大再試行回数を制限するためにこの設定を使用してください。[http_max_single_read_retries](/docs/ja/operations/settings/settings.md/#http-max-single-read-retries)。 + +### ゼロコピー レプリケーション(生産環境には不適) {#zero-copy} + +ゼロコピー レプリケーションは、`S3`および`HDFS`(非対応)ディスクで可能ですが、推奨されていません。ゼロコピー レプリケーションとは、データが複数のマシン上のリモートに保存されていて同期する必要がある場合、データそのものではなく、メタデータ(データ部のパス)だけがレプリケートされることを意味します。 + +:::note ゼロコピー レプリケーションは、本番環境には不向きです +ゼロコピー レプリケーションは、ClickHouseバージョン22.8以降でデフォルトで無効になっています。この機能は、本番環境での使用を推奨しません。 +::: + diff --git a/docs/ja/operations/system-tables/asynchronous_insert_log.md b/docs/ja/operations/system-tables/asynchronous_insert_log.md new file mode 100644 index 00000000000..c5f38443ff3 --- /dev/null +++ b/docs/ja/operations/system-tables/asynchronous_insert_log.md @@ -0,0 +1,66 @@ +--- +slug: /ja/operations/system-tables/asynchronous_insert_log +--- +# asynchronous_insert_log + +非同期インサートに関する情報を含みます。各エントリは、非同期インサートクエリとしてバッファに保存されたインサートクエリを表します。 + +ログを開始するには、[asynchronous_insert_log](../../operations/server-configuration-parameters/settings.md#asynchronous_insert_log) セクションでパラメーターを設定してください。 + +データのフラッシュ期間は、[asynchronous_insert_log](../../operations/server-configuration-parameters/settings.md#asynchronous_insert_log) サーバー設定セクションの `flush_interval_milliseconds` パラメーターで設定されています。フラッシュを強制するには、[SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) クエリを使用してください。 + +ClickHouseはテーブルから自動的にデータを削除しません。詳細は[概要](../../operations/system-tables/index.md#system-tables-introduction)を参照してください。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — 非同期インサートが発生した日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 非同期インサートが終了した日時。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度で非同期インサートが終了した日時。 +- `query` ([String](../../sql-reference/data-types/string.md)) — クエリ文字列。 +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブルが所属するデータベースの名前。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `format` ([String](/docs/ja/sql-reference/data-types/string.md)) — フォーマット名。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — 初期クエリのID。 +- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 挿入されたバイト数。 +- `exception` ([String](../../sql-reference/data-types/string.md)) — 例外メッセージ。 +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — ビューのステータス。値: + - `'Ok' = 1` — 成功したインサート。 + - `'ParsingError' = 2` — データの解析中の例外。 + - `'FlushError' = 3` — データのフラッシュ中の例外。 +- `flush_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — フラッシュが発生した日時。 +- `flush_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度でフラッシュが発生した日時。 +- `flush_query_id` ([String](../../sql-reference/data-types/string.md)) — フラッシュクエリのID。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.asynchronous_insert_log LIMIT 1 \G; +``` + +結果: + +``` text +hostname: clickhouse.eu-central1.internal +event_date: 2023-06-08 +event_time: 2023-06-08 10:08:53 +event_time_microseconds: 2023-06-08 10:08:53.199516 +query: INSERT INTO public.data_guess (user_id, datasource_id, timestamp, path, type, num, str) FORMAT CSV +database: public +table: data_guess +format: CSV +query_id: b46cd4c4-0269-4d0b-99f5-d27668c6102e +bytes: 133223 +exception: +status: Ok +flush_time: 2023-06-08 10:08:55 +flush_time_microseconds: 2023-06-08 10:08:55.139676 +flush_query_id: cd2c1e43-83f5-49dc-92e4-2fbc7f8d3716 +``` + +**関連項目** + +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — クエリの実行に関する一般的な情報を含む `query_log` システムテーブルの説明。 +- [system.asynchronous_inserts](../../operations/system-tables/asynchronous_inserts.md#system_tables-asynchronous_inserts) — キュー内の保留中の非同期インサートに関する情報を含むテーブル。 diff --git a/docs/ja/operations/system-tables/asynchronous_inserts.md b/docs/ja/operations/system-tables/asynchronous_inserts.md new file mode 100644 index 00000000000..72a2d5e6f12 --- /dev/null +++ b/docs/ja/operations/system-tables/asynchronous_inserts.md @@ -0,0 +1,45 @@ +--- +slug: /ja/operations/system-tables/asynchronous_inserts +--- +# asynchronous_inserts + +キュー内で保留している非同期挿入に関する情報を含んでいます。 + +カラム: + +- `query` ([String](../../sql-reference/data-types/string.md)) — クエリ文字列。 +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブルが存在するデータベースの名前。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `format` ([String](/docs/ja/sql-reference/data-types/string.md)) — フォーマット名。 +- `first_update` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度の最初の挿入時間。 +- `total_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — キュー内で待機している全バイト数。 +- `entries.query_id` ([Array(String)](../../sql-reference/data-types/array.md)) - キュー内で待機している挿入クエリのクエリIDの配列。 +- `entries.bytes` ([Array(UInt64)](../../sql-reference/data-types/array.md)) - キュー内で待機している各挿入クエリのバイト数の配列。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.asynchronous_inserts LIMIT 1 \G; +``` + +結果: + +``` text +Row 1: +────── +query: INSERT INTO public.data_guess (user_id, datasource_id, timestamp, path, type, num, str) FORMAT CSV +database: public +table: data_guess +format: CSV +first_update: 2023-06-08 10:08:54.199606 +total_bytes: 133223 +entries.query_id: ['b46cd4c4-0269-4d0b-99f5-d27668c6102e'] +entries.bytes: [133223] +``` + +**関連項目** + +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — クエリ実行に関する一般的な情報を含む `query_log` システムテーブルの説明。 +- [system.asynchronous_insert_log](../../operations/system-tables/asynchronous_insert_log.md#system_tables-asynchronous_insert_log) — 実行された非同期挿入に関する情報を含むテーブル。 diff --git a/docs/ja/operations/system-tables/asynchronous_loader.md b/docs/ja/operations/system-tables/asynchronous_loader.md new file mode 100644 index 00000000000..2aab2296421 --- /dev/null +++ b/docs/ja/operations/system-tables/asynchronous_loader.md @@ -0,0 +1,54 @@ +--- +slug: /ja/operations/system-tables/asynchronous_loader +--- +# asynchronous_loader + +最近の非同期ジョブ(例:テーブルのロード)の情報とステータスを含んでいます。このテーブルには各ジョブごとに行が含まれています。このテーブルからの情報を視覚化するツールとして `utils/async_loader_graph` があります。 + +例: + +``` sql +SELECT * +FROM system.asynchronous_loader +FORMAT Vertical +LIMIT 1 +``` + +``` text +``` + +カラム: + +- `job` (`String`) - ジョブ名(ユニークでない場合があります)。 +- `job_id` (`UInt64`) - ジョブのユニークID。 +- `dependencies` (`Array(UInt64)`) - このジョブの前に完了する必要があるジョブのIDリスト。 +- `dependencies_left` (`UInt64`) - 現在残っている依存関係の数。 +- `status` (`Enum`) - ジョブの現在のロードステータス: + `PENDING`: ロードジョブはまだ開始されていません。 + `OK`: ロードジョブは実行され、成功しました。 + `FAILED`: ロードジョブは実行され、失敗しました。 + `CANCELED`: ロードジョブは削除または依存関係の失敗により実行されません。 + +保留中のジョブは以下のいずれかの状態になっている可能性があります: +- `is_executing` (`UInt8`) - ジョブは現在ワーカーによって実行されています。 +- `is_blocked` (`UInt8`) - ジョブは依存関係が完了するのを待ちます。 +- `is_ready` (`UInt8`) - ジョブは実行準備ができており、ワーカーの待機状態です。 +- `elapsed` (`Float64`) - 実行開始から経過した秒数。ジョブが開始されていない場合はゼロ。ジョブが終了した場合は総実行時間。 + +各ジョブには関連するプールがあり、このプールで開始されます。各プールには一定の優先順位と可変の最大ワーカー数があります。優先順位が高い(`priority` 値が低い)のジョブが先に実行されます。少なくとも1つの高優先順位ジョブが準備完了または実行中である限り、低い優先順位のジョブは開始されません。ジョブの優先順位は引き上げることができますが(下げることはできません)、実行中に優先順位を高めることができます。たとえば、テーブルのロードおよびスタートアップのジョブは、受信クエリがこのテーブルを必要とする場合、優先されます。実行中にジョブを優先しても、ジョブはその `execution_pool` から新しく指定された `pool` に移動しません。ジョブは優先度の逆転を避けるために新しいジョブを作成する場合に `pool` を使用します。既に開始されたジョブは、高優先順位のジョブによって中断されず、開始後は常に完了まで実行されます。 +- `pool_id` (`UInt64`) - 現在ジョブに割り当てられているプールのID。 +- `pool` (`String`) - `pool_id` プールの名前。 +- `priority` (`Int64`) - `pool_id` プールの優先順位。 +- `execution_pool_id` (`UInt64`) - ジョブが実行されるプールのID。実行開始前の初めに割り当てられたプールと一致します。 +- `execution_pool` (`String`) - `execution_pool_id` プールの名前。 +- `execution_priority` (`Int64`) - `execution_pool_id` プールの優先順位。 + +- `ready_seqno` (`Nullable(UInt64)`) - 準備完了状態のジョブに対して null ではありません。ワーカーはそのプールの準備キューから次のジョブを実行のために取得します。準備完了ジョブが複数ある場合は、`ready_seqno` の値が最も低いジョブが選ばれます。 +- `waiters` (`UInt64`) - このジョブを待機しているスレッドの数。 +- `exception` (`Nullable(String)`) - 失敗およびキャンセルされたジョブに対して null ではありません。クエリ実行中に発生したエラーメッセージや、このジョブの依存関係失敗チェーンと共にキャンセルを引き起こしたエラーを保持します。 + +ジョブのライフタイム中の時間インスタンス: +- `schedule_time` (`DateTime64`) - ジョブが作成され、実行するためにスケジュールされた時間(通常すべての依存関係と共に)。 +- `enqueue_time` (`Nullable(DateTime64)`) - ジョブが準備完了となり、そのプールの準備キューに入れられた時間。ジョブが未準備の場合は null。 +- `start_time` (`Nullable(DateTime64)`) - ワーカーが準備キューからジョブをデキューし、実行を開始した時間。ジョブが開始されていない場合は null。 +- `finish_time` (`Nullable(DateTime64)`) - ジョブの実行が終了した時間。ジョブが終了していない場合は null。 diff --git a/docs/ja/operations/system-tables/asynchronous_metric_log.md b/docs/ja/operations/system-tables/asynchronous_metric_log.md new file mode 100644 index 00000000000..fabad432c6b --- /dev/null +++ b/docs/ja/operations/system-tables/asynchronous_metric_log.md @@ -0,0 +1,51 @@ +--- +slug: /ja/operations/system-tables/asynchronous_metric_log +--- +# asynchronous_metric_log + +`system.asynchronous_metrics`の履歴値を保持し、一定の時間間隔で(一秒ごとにデフォルト設定)保存します。デフォルトで有効になっています。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `metric` ([String](../../sql-reference/data-types/string.md)) — メトリクスの名前。 +- `value` ([Float64](../../sql-reference/data-types/float.md)) — メトリクスの値。 + +**例** + +``` sql +SELECT * FROM system.asynchronous_metric_log LIMIT 3 \G +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-11-14 +event_time: 2023-11-14 14:39:07 +metric: AsynchronousHeavyMetricsCalculationTimeSpent +value: 0.001 + +Row 2: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-11-14 +event_time: 2023-11-14 14:39:08 +metric: AsynchronousHeavyMetricsCalculationTimeSpent +value: 0 + +Row 3: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-11-14 +event_time: 2023-11-14 14:39:09 +metric: AsynchronousHeavyMetricsCalculationTimeSpent +value: 0 +``` + +**関連項目** + +- [system.asynchronous_metrics](../system-tables/asynchronous_metrics.md) — バックグラウンドで定期的に計算されるメトリクスを含む。 +- [system.metric_log](../system-tables/metric_log.md) — テーブル`system.metrics`と`system.events`からのメトリクス値の履歴を保持し、定期的にディスクに書き込まれる。 diff --git a/docs/ja/operations/system-tables/asynchronous_metrics.md b/docs/ja/operations/system-tables/asynchronous_metrics.md new file mode 100644 index 00000000000..76c5fba5197 --- /dev/null +++ b/docs/ja/operations/system-tables/asynchronous_metrics.md @@ -0,0 +1,648 @@ +--- +slug: /ja/operations/system-tables/asynchronous_metrics +--- +# asynchronous_metrics + +バックグラウンドで定期的に計算されるメトリクスを含みます。例えば、使用中のRAMの量などです。 + +カラム: + +- `metric` ([String](../../sql-reference/data-types/string.md)) — メトリクス名。 +- `value` ([Float64](../../sql-reference/data-types/float.md)) — メトリクスの値。 +- `description` ([String](../../sql-reference/data-types/string.md) - メトリクスの説明) + +**例** + +``` sql +SELECT * FROM system.asynchronous_metrics LIMIT 10 +``` + +``` text +┌─metric──────────────────────────────────┬──────value─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ AsynchronousMetricsCalculationTimeSpent │ 0.00179053 │ 時間(秒単位)非同期メトリクスの計算に費やされた時間(これは非同期メトリクスのオーバーヘッドです)。 │ +│ NumberOfDetachedByUserParts │ 0 │ `ALTER TABLE DETACH`クエリを使用してユーザーによってMergeTreeテーブルから分離されたパーツの総数(予期しない、壊れた、または無視されたパーツとは対照的に)。サーバーは分離されたパーツを気にしません、それらは削除される可能性があります。 │ +│ NumberOfDetachedParts │ 0 │ MergeTreeテーブルから分離されたパーツの総数。パーツは、ユーザーが`ALTER TABLE DETACH`クエリを使用するか、サーバー自身によって壊れた、予期しない、または不要な場合に分離される可能性があります。サーバーは分離されたパーツを気にしません、それらは削除される可能性があります。 │ +│ TotalRowsOfMergeTreeTables │ 2781309 │ MergeTreeファミリーのすべてのテーブルに格納されている行(レコード)の総数。 │ +│ TotalBytesOfMergeTreeTables │ 7741926 │ MergeTreeファミリーのすべてのテーブルに格納されているバイト数(データとインデックスを含む圧縮)。 │ +│ NumberOfTables │ 93 │ サーバー上のデータベース全体のテーブル総数、MergeTreeテーブルを含むことができないデータベースを除外。`Lazy`、`MySQL`、`PostgreSQL`、`SQlite`のように動的にテーブルセットを生成するデータベースエンジンは除外されます。 │ +│ NumberOfDatabases │ 6 │ サーバー上のデータベースの総数。 │ +│ MaxPartCountForPartition │ 6 │ MergeTreeファミリーのすべてのテーブルの各パーティションにおけるパーツの最大数。値が300を超えると、設定ミス、過負荷、大規模なデータロードを示します。 │ +│ ReplicasSumMergesInQueue │ 0 │ レプリケートされたテーブル全体でキュー(まだ適用されていない)にあるマージ操作の合計。 │ +│ ReplicasSumInsertsInQueue │ 0 │ レプリケートされたテーブル全体でキュー(まだレプリケートされていない)にあるINSERT操作の合計。 │ +└─────────────────────────────────────────┴────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + + + +## メトリクスの説明 + +### AsynchronousHeavyMetricsCalculationTimeSpent + +非同期の重い(テーブル関連の)メトリクス計算に費やされた時間(秒単位)(これは非同期メトリクスのオーバーヘッドです)。 + +### AsynchronousHeavyMetricsUpdateInterval + +重い(テーブル関連の)メトリクス更新間隔 + +### AsynchronousMetricsCalculationTimeSpent + +非同期メトリクス計算に費やされた時間(秒単位)(これは非同期メトリクスのオーバーヘッドです)。 + +### AsynchronousMetricsUpdateInterval + +メトリクス更新間隔 + +### BlockActiveTime_*name* + +ブロックデバイス上でIOリクエストがキューされていた時間(秒単位)。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockDiscardBytes_*name* + +ブロックデバイス上で破棄されたバイト数。これらの操作はSSDに関連しています。破棄操作はClickHouseで使用されませんが、システム内の他のプロセスで使用される可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockDiscardMerges_*name* + +ブロックデバイスから要求され、OS IOスケジューラによってマージされた破棄操作の数。これらの操作はSSDに関連しています。破棄操作はClickHouseで使用されませんが、システム内の他のプロセスで使用される可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockDiscardOps_*name* + +ブロックデバイスから要求された破棄操作の数。これらの操作はSSDに関連しています。破棄操作はClickHouseで使用されませんが、システム内の他のプロセスで使用される可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockDiscardTime_*name* + +ブロックデバイスから要求された破棄操作に費やされた時間(秒単位)、すべての操作に渡って合計されたもの。これらの操作はSSDに関連しています。破棄操作はClickHouseで使用されませんが、システム内の他のプロセスで使用される可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockInFlightOps_*name* + +デバイスドライバに発行されたがまだ完了していないI/Oリクエストの数をカウントします。これは、キューにありまだデバイスドライバに発行されていないI/Oリクエストは含まれません。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockQueueTime_*name* + +このブロックデバイスでIOリクエストが待機していたミリ秒数をカウントします。複数のIOリクエストが待機している場合、この値はミリ秒数と待機しているリクエスト数の積として増加します。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockReadBytes_*name* + +ブロックデバイスから読み取られたバイト数。OSページキャッシュの使用により、ファイルシステムから読み取られるバイト数よりも少なくなる可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockReadMerges_*name* + +ブロックデバイスから要求され、OS IOスケジューラによってマージされた読み取り操作の数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockReadOps_*name* + +ブロックデバイスから要求された読み取り操作の数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockReadTime_*name* + +ブロックデバイスからの読み取り操作に費やされた時間(秒単位)、すべての操作に渡って合計されたもの。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockWriteBytes_*name* + +ブロックデバイスに書き込まれたバイト数。OSページキャッシュの使用により、ファイルシステムへの書き込みと比べて少ない場合があります。また、書き込みスルーキャッシングのため、対応するファイルシステムへの書き込みよりも後にブロックデバイスへの書き込みが発生する可能性があります。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン全体のプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockWriteMerges_*name* + +ブロックデバイスから要求され、OS IOスケジューラによってマージされた書き込み操作の数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン全体のプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockWriteOps_*name* + +ブロックデバイスから要求された書き込み操作の数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン全体のプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### BlockWriteTime_*name* + +ブロックデバイスからの書き込み操作に費やされた時間(秒単位)、すべての操作に渡って合計されたもの。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン全体のプロセスが含まれます。出典:`/sys/block`。詳細はhttps://www.kernel.org/doc/Documentation/block/stat.txtを参照。 + +### CPUFrequencyMHz_*name* + +CPUの現在の周波数(MHz)。ほとんどの最新のCPUは、電力節約とターボブーストのために周波数を動的に調整します。 + +### CompiledExpressionCacheBytes + +JITコンパイルコードキャッシュに使用されている総バイト数。 + +### CompiledExpressionCacheCount + +JITコンパイルコードキャッシュの総エントリー数。 + +### DiskAvailable_*name* + +ディスク(仮想ファイルシステム)で使用可能なバイト数。リモートファイルシステムは、16 EiBのような大きな値を示すことがあります。 + +### DiskTotal_*name* + +ディスク(仮想ファイルシステム)の総サイズ(バイト単位)。リモートファイルシステムは、16 EiBのような大きな値を示すことがあります。 + +### DiskUnreserved_*name* + +マージ、フェッチ、移動のための予約なしでディスク(仮想ファイルシステム)で使用可能なバイト数。リモートファイルシステムは、16 EiBのような大きな値を示すことがあります。 + +### DiskUsed_*name* + +ディスク(仮想ファイルシステム)で使用されているバイト数。リモートファイルシステムは、常にこの情報を提供するとは限りません。 + +### FilesystemCacheBytes + +`cache`仮想ファイルシステム内の総バイト数。このキャッシュはディスク上に保持されます。 + +### FilesystemCacheFiles + +`cache`仮想ファイルシステム内のキャッシュされたファイルセグメントの総数。このキャッシュはディスク上に保持されます。 + +### FilesystemLogsPathAvailableBytes + +ClickHouseログパスがマウントされているボリュームで使用可能なバイト数。この値がゼロに近づくと、設定ファイルでログのローテーションを調整する必要があります。 + +### FilesystemLogsPathAvailableINodes + +ClickHouseログパスがマウントされているボリュームで利用可能なinodeの数。 + +### FilesystemLogsPathTotalBytes + +ClickHouseログパスがマウントされているボリュームのサイズ(バイト単位)。ログのために少なくとも10 GBを確保することが推奨されます。 + +### FilesystemLogsPathTotalINodes + +ClickHouseログパスがマウントされているボリューム上のinodeの総数。 + +### FilesystemLogsPathUsedBytes + +ClickHouseログパスがマウントされているボリュームで使用されているバイト数。 + +### FilesystemLogsPathUsedINodes + +ClickHouseログパスがマウントされているボリュームで使用されているinodeの数。 + +### FilesystemMainPathAvailableBytes + +メインClickHouseパスがマウントされているボリュームで使用可能なバイト数。 + +### FilesystemMainPathAvailableINodes + +メインClickHouseパスがマウントされているボリュームで利用可能なinodeの数。それがゼロに近づいている場合、設定ミスを示しており、ディスクがいっぱいでなくても'no space left on device'エラーを引き起こします。 + +### FilesystemMainPathTotalBytes + +メインClickHouseパスがマウントされているボリュームのサイズ(バイト単位)。 + +### FilesystemMainPathTotalINodes + +メインClickHouseパスがマウントされているボリューム上のinodeの総数。それが2500万未満である場合、設定ミスを示しています。 + +### FilesystemMainPathUsedBytes + +メインClickHouseパスがマウントされているボリュームで使用されているバイト数。 + +### FilesystemMainPathUsedINodes + +メインClickHouseパスがマウントされているボリュームで使用されているinodeの数。この値は主にファイル数に対応しています。 + +### HTTPThreads + +HTTPインターフェースのサーバー上のスレッド数(TLSなし)。 + +### InterserverThreads + +レプリカ通信プロトコルのサーバー上のスレッド数(TLSなし)。 + +### Jitter + +非同期メトリクスの計算用スレッドが起床するようにスケジュールされた時刻と実際に起床した時刻の時間差。全体的なシステムのレイテンシーと応答性の代理指標。 + +### LoadAverage_*N* + +指数平滑化で1分間平滑化された全システムの負荷。この負荷は、現在CPUが実行中であるか、IOを待っているか、またはこの時点でスケジュールされていないが実行可能なOSカーネルのスレッド数を表しています。この数値はClickhouse-serverだけでなく全てのプロセスを含んでいます。システムが過負荷状態にある場合、特に数十個のプロセスが実行可能であるがCPUまたはIOを待っている場合、数値はCPUコア数を超えることがあります。 + +### MMapCacheCells + +`mmap`(メモリマップ)で開かれたファイルの数。この設定は、`local_filesystem_read_method`を`mmap`に設定したクエリに使用されます。`mmap`で開かれたファイルは、費用がかかるTLBフラッシュを避けるためにキャッシュに保持されます。 + +### MarkCacheBytes + +マークキャッシュ内の総サイズ(バイト単位) + +### MarkCacheFiles + +マークキャッシュ内にキャッシュされたマークファイルの総数 + +### MaxPartCountForPartition + +MergeTreeファミリーのすべてのテーブルの各パーティションにおけるパーツの最大数。値が300を超えると、設定ミス、過負荷、大規模データロードを示します。 + +### MemoryCode + +サーバープロセスの機械コードページのためにマップされた仮想メモリの量(バイト単位)。 + +### MemoryDataAndStack + +スタックおよび割り当てられたメモリの使用のためにマップされた仮想メモリの量(バイト単位)。これは、スレッドごとのスタックと'mmap'システムコールで割り当てられたメモリのほとんどが含まれているかどうかは不特定です。このメトリクスは完全性のために存在します。モニタリングには`MemoryResident`メトリクスを使用することをお勧めします。 + +### MemoryResidentMax + +サーバープロセスによって使用される物理メモリの最大量(バイト単位)。 + +### MemoryResident + +サーバープロセスによって使用される物理メモリの量(バイト単位)。 + +### MemoryShared + +サーバープロセスによって使用されるメモリの量であり、他のプロセスと共有されています(バイト単位)。ClickHouseは共有メモリを使用しませんが、一部のメモリはOSによって独自の理由で共有としてラベル付けされることがあります。このメトリクスは、監視する意味はあまりなく、完全性のために存在します。 + +### MemoryVirtual + +サーバープロセスによって割り当てられた仮想アドレススペースのサイズ(バイト単位)。仮想アドレススペースのサイズは通常、物理メモリ消費よりもはるかに大きく、メモリ消費の見積もりとして使用されるべきではありません。このメトリクスの大きな値は完全に正常であり、技術的な意味しか持たない。 + +### MySQLThreads + +MySQL互換性プロトコルのサーバー内のスレッド数。 + +### NetworkReceiveBytes_*name* + +ネットワークインターフェースを介して受信されたバイト数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkReceiveDrop_*name* + +ネットワークインターフェースを介して受信中にパケットがドロップされたバイト数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkReceiveErrors_*name* + +ネットワークインターフェースを介して受信中に発生したエラーの回数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkReceivePackets_*name* + +ネットワークインターフェースを介して受信されたネットワークパケットの数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkSendBytes_*name* + +ネットワークインターフェースを介して送信されたバイト数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkSendDrop_*name* + +ネットワークインターフェースを介して送信中にパケットがドロップされた回数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkSendErrors_*name* + +ネットワークインターフェースを介して送信中にエラー(例:TCP再送信)が発生した回数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NetworkSendPackets_*name* + +ネットワークインターフェースを介して送信されたネットワークパケットの数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### NumberOfDatabases + +サーバー上のデータベースの総数。 + +### NumberOfDetachedByUserParts + +ユーザーによって`ALTER TABLE DETACH`クエリを使用してMergeTreeテーブルから分離されたパーツの合計(予期しない、壊れた、または無視されたパーツとは対照的)。サーバーは分離されたパーツを気にせず、それらは削除可能です。 + +### NumberOfDetachedParts + +MergeTreeテーブルから分離されたパーツの合計。ユーザーが`ALTER TABLE DETACH`クエリを使ってパーツを分離するか、サーバー自身が壊れた、予期しない、または不要な場合に分離されます。サーバーは分離されたパーツを気にせず、それらは削除可能です。 + +### NumberOfTables + +サーバー上のデータベース全体のテーブル総数、MergeTreeテーブルを含むことができないデータベースを除外。`Lazy`、`MySQL`、`PostgreSQL`、`SQlite`のように動的にテーブルセットを生成するデータベースエンジンは除外されます。 + +### OSContextSwitches + +ホストマシンが経験したコンテキストスイッチの数。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。 + +### OSGuestNiceTime + +Linuxカーネルの制御下で、ゲストが優先度を高く設定されたとき(`man procfs`参照)、仮想CPUを実行するために費やされた時間の割合です。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。このメトリクスはClickHouseには無関係ですが、完全性のために存在します。単一のCPUコアの値は[0..1]の範囲内にあります。全CPUコアの値はそれらの合計として計算され、[0..数コア]の範囲になります。 + +### OSGuestNiceTimeCPU_*N* + +Linuxカーネルの制御下で、ゲストが優先度を高く設定されたとき(`man procfs`参照)、仮想CPUを実行するために費やされた時間の割合です。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスを含んでいます、Clickhouse-serverだけではありません。このメトリクスはClickHouseには無関係ですが、完全性のために存在します。単一のCPUコアの値は[0..1]の範囲内にあります。全CPUコアの値はそれらの合計として計算され、[0..数コア]の範囲になります。 + +### OSGuestNiceTimeNormalized + +この値は`OSGuestNiceTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であってもクラスタ内の複数のサーバー間でこのメトリクスの平均値を算出し、平均リソース使用率メトリクスを得ることができます。 + +### OSGuestTime + +Linuxカーネルの制御下で、仮想CPUを実行するために費やされた時間の割合です(`man procfs`参照)。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。このメトリクスはClickHouseには無関係ですが、完全性のために存在します。単一のCPUコアの値は[0..1]の範囲内にあり、全CPUコアの値はそれらの合計として計算され、[0..コアの数]の範囲になります。 + +### OSGuestTimeCPU_*N* + +Linuxカーネルの制御下で、仮想CPUを実行するために費やされた時間の割合です(`man procfs`参照)。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。このメトリクスはClickHouseには無関係ですが、完全性のために存在します。単一のCPUコアの値は[0..1]の範囲内にあり、全CPUコアの値はそれらの合計として計算され、[0..コアの数]の範囲になります。 + +### OSGuestTimeNormalized + +この値は`OSGuestTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であってもクラスタ内の複数のサーバー間でこのメトリクスの平均値を算出し、平均リソース使用率メトリクスを得ることができます。 + +### OSIOWaitTime + +プロセスがI/Oを待っている際に、OSカーネルがこのCPUで他のプロセスを実行しなかった時間の割合です。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。単一のCPUコアの値は[0..1]の範囲内にあり、全CPUコアの値はそれらの合計として計算され、[0..コアの数]の範囲になります。 + +### OSIOWaitTimeCPU_*N* + +プロセスがI/Oを待っている際に、OSカーネルがこのCPUで他のプロセスを実行しなかった時間の割合です。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなくホストマシン上のすべてのプロセスが含まれます。単一のCPUコアの値は[0..1]の範囲内にあり、全CPUコアの値はそれらの合計として計算され、[0..コアの数]の範囲になります。 + +### OSIOWaitTimeNormalized + +この値は`OSIOWaitTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であってもクラスタ内の複数のサーバー間でこのメトリクスの平均値を算出し、平均リソース使用率メトリクスを得ることができます。 + +### OSIdleTime + +CPUコアがアイドル状態(I/Oを待っているプロセスを実行する準備ができていない状態)の時間の割合をOSカーネルの観点から示します。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれます、Clickhouse-serverだけではありません。これには、CPUが内部で要因(メモリロード、パイプラインの停止、分岐予測の失敗、他のSMTコアの実行など)によって十分に利用されていなかった時間は含まれません。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..コア数]の範囲内になります。 + +### OSIdleTimeCPU_*N* + +CPUコアがアイドル状態(I/Oを待っているプロセスを実行する準備ができていない状態)の時間の割合をOSカーネルの観点から示します。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれます、Clickhouse-serverだけではありません。これには、CPUが内部で要因(メモリロード、パイプラインの停止、分岐予測の失敗、他のSMTコアの実行など)によって十分に利用されていなかった時間は含まれません。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..コア数]の範囲内になります。 + +### OSIdleTimeNormalized + +この値は`OSIdleTime`と類似しており、コア数で割られるため、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であっても、クラスタ内の複数のサーバー間でのこのメトリクスの平均化が可能になり、平均リソース利用率メトリクスを得ることができます。 + +### OSInterrupts + +ホストマシン上で発生した割り込みの総数です。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。 + +### OSIrqTime + +CPUでハードウェア割込み要求の実行に費やされた時間の割合を示します。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスの高い値は、ハードウェアの設定ミスや非常に高いネットワーク負荷を示している可能性があります。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSIrqTimeCPU_*N* + +CPUでハードウェア割込み要求の実行に費やされた時間の割合を示します。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスの高い値は、ハードウェアの設定ミスや非常に高いネットワーク負荷を示している可能性があります。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSIrqTimeNormalized + +この値は`OSIrqTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であってもクラスタ内の複数のサーバー間でこのメトリクスの平均化が可能になり、平均リソース使用率メトリクスを得ることができます。 + +### OSMemoryAvailable + +プログラムが使用できるメモリの量(バイト単位)。これは`OSMemoryFreePlusCached`メトリクスと非常に似ています。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれています。 + +### OSMemoryBuffers + +OSカーネルバッファに使用されているメモリの量(バイト単位)。これは通常、小さいはずであり、大きな値はOSの設定ミスを示している可能性があります。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれています。 + +### OSMemoryCached + +OSページキャッシュによって使用されているメモリの量(バイト単位)。一般に、ほぼすべての利用可能なメモリがOSページキャッシュによって使用され、高い値は正常かつ予期されるものです。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれています。 + +### OSMemoryFreePlusCached + +ホストシステムの自由メモリとOSページキャッシュメモリの合計量(バイト単位)。このメモリはプログラムで使用可能です。この値は`OSMemoryAvailable`と非常に似ているはずです。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれています。 + +### OSMemoryFreeWithoutCached + +ホストシステムの自由メモリの量(バイト単位)。OSページキャッシュメモリは含まれていません。ページキャッシュメモリはプログラムで使用可能であるため、このメトリクスの値は混乱を招く可能性があります。代わりに`OSMemoryAvailable`メトリクスを参照してください。便宜上、`OSMemoryFreePlusCached`メトリクスも提供しており、OSMemoryAvailableとほぼ似ているはずです。詳細はhttps://www.linuxatemyram.com/を参照してください。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれています。 + +### OSMemoryTotal + +ホストシステムの総メモリ量(バイト単位)。 + +### OSNiceTime + +CPUコアが高い優先度でユーザースペースコードを実行していた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSNiceTimeCPU_*N* + +CPUコアが高い優先度でユーザースペースコードを実行していた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSNiceTimeNormalized + +この値は`OSNiceTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であっても、クラスタ内の複数のサーバー間でこのメトリクスの平均値を算出し、平均リソース使用率メトリクスを得ることができます。 + +### OSOpenFiles + +ホストマシン上で開かれているファイルの総数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。 + +### OSProcessesBlocked + +I/O完了待ちでブロックされているスレッドの数(`man procfs`参照)。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。 + +### OSProcessesCreated + +作成されたプロセスの数。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。 + +### OSProcessesRunning + +オペレーティングシステムによって実行可能と見なされるスレッドの数(実行中か、実行準備中か)。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。 + +### OSSoftIrqTime + +CPUでソフトウェア割込み要求の実行に費やされた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスの高い値は、システム上で非効率的なソフトウェアが実行されている可能性を示しています。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSSoftIrqTimeCPU_*N* + +CPUでソフトウェア割込み要求の実行に費やされた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけではなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスの高い値は、システム上で非効率的なソフトウェアが実行されている可能性を示しています。単一のCPUコアの値は[0..1]の範囲にあります。全CPUコアの値はそれらの合計で計算され、[0..num cores]の範囲になります。 + +### OSSoftIrqTimeNormalized + +この値は`OSSoftIrqTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であってもクラスタ内の複数のサーバー間でこのメトリクスの平均化が可能になり、平均リソース使用率メトリクスを得ることができます。 + +### OSStealTime + +仮想化環境で実行中のCPUが他のオペレーティングシステムに費やされた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスを提示する仮想化環境はすべてではなく、ほとんどの環境にはこのメトリクスがありません。単一のCPUコアの値は[0..1]の範囲にあります。すべてのCPUコアの値は、それらすべての合計として計算されます、[0..num cores]の範囲にあります。 + +### OSStealTimeCPU_*N* + +仮想化環境で実行中のCPUが他のオペレーティングシステムに費やされた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれます。このメトリクスを提示する仮想化環境はすべてではなく、ほとんどの環境にはこのメトリクスがありません。単一のCPUコアの値は[0..1]の範囲にあります。すべてのCPUコアの値は、それらすべての合計として計算されます、[0..num cores]の範囲にあります。 + +### OSStealTimeNormalized + +この値は`OSStealTime`と類似していますが、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であっても、クラスタ内の複数のサーバー間でこのメトリクスの平均値を算出し、平均リソース使用率メトリクスを得ることができます。 + +### OSSystemTime + +CPUコアがOSカーネル(システム)コードを実行していた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれています。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..num cores]の範囲内になります。 + +### OSSystemTimeCPU_*N* + +CPUコアがOSカーネル(システム)コードを実行していた時間の割合。これはシステム全体のメトリクスであり、Clickhouse-serverだけでなく、ホストマシン上のすべてのプロセスが含まれています。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..num cores]の範囲内になります。 + +### OSSystemTimeNormalized + +この値は`OSSystemTime`と類似しており、コア数で割られるため、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であっても、クラスタ内の複数のサーバー間でのこのメトリクスの平均化が可能になり、平均リソース使用率メトリクスを得ることができます。 + +### OSThreadsRunnable + +OSカーネルスケジューラが認識している'runnable'スレッドの総数。 + +### OSThreadsTotal + +OSカーネルスケジューラが認識しているスレッドの総数。 + +### OSUptime + +ホストサーバー(ClickHouseが実行されているマシン)の稼働時間(秒単位)。 + +### OSUserTime + +CPUコアがユーザースペースコードを実行していた時間の割合。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれ、Clickhouse-serverだけではありません。これは、CPUが内部で要因(メモリロード、パイプラインの停止、分岐予測の失敗など)によって十分に利用されていない時間も含まれます。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..num cores]の範囲内になります。 + +### OSUserTimeCPU_*N* + +CPUコアがユーザースペースコードを実行していた時間の割合。これはシステム全体のメトリクスであり、ホストマシン上のすべてのプロセスが含まれ、Clickhouse-serverだけではありません。これは、CPUが内部で要因(メモリロード、パイプラインの停止、分岐予測の失敗など)によって十分に利用されていない時間も含まれます。単一のCPUコアの値は[0..1]の範囲内にあります。すべてのCPUコアの値は、これらすべてのコアの合計として計算されるため、[0..num cores]の範囲内になります。 + +### OSUserTimeNormalized + +この値は`OSUserTime`と類似しており、コア数で割られており、コア数に関係なく[0..1]の範囲で測定されます。これにより、コア数が非一様であっても、クラスタ内の複数のサーバー間でこのメトリクスの平均値を測定し、平均リソース使用率メトリクスを得ることができます。 + +### PostgreSQLThreads + +PostgreSQL互換プロトコルのサーバー内のスレッド数。 + +### QueryCacheBytes + +クエリキャッシュの総サイズ(バイト単位)。 + +### QueryCacheEntries + +クエリキャッシュ内の総エントリー数。 + +### ReplicasMaxAbsoluteDelay + +レプリケートされたテーブル全体での最新のレプリケートされたパーツとまだレプリケートされていない最も新しいデータパーツの間の秒単位の最大差。非常に高い値はデータのないレプリカを示します。 + +### ReplicasMaxInsertsInQueue + +レプリケートされたテーブル全体でのキュー(まだレプリケートされていない)にあるINSERT操作の最大数。 + +### ReplicasMaxMergesInQueue + +レプリケートされたテーブル全体でのキュー(まだ適用されていない)にあるマージ操作の最大数。 + +### ReplicasMaxQueueSize + +レプリケートされたテーブル全体でのキューサイズ(取得、マージなどの操作数)。 + +### ReplicasMaxRelativeDelay + +レプリケートされたテーブル全体でのレプリカ遅延と同じテーブルの最新のレプリカの遅延との相対差の最大値。 + +### ReplicasSumInsertsInQueue + +レプリケートされたテーブル全体でのキュー(まだレプリケートされていない)にあるINSERT操作の合計数。 + +### ReplicasSumMergesInQueue + +レプリケートされたテーブル全体でのキュー(まだ適用されていない)にあるマージ操作の合計数。 + +### ReplicasSumQueueSize + +レプリケートされたテーブル全体でのキューサイズ(取得、マージなどの操作数)。 + +### TCPThreads + +TCPプロトコル(TLSなし)のサーバー上のスレッド数。 + +### Temperature_*N* + +対応するデバイスの温度(℃)。センサーは非現実的な値を返すことがあります。ソース:`/sys/class/thermal` + +### Temperature_*name* + +対応するハードウェアモニタおよび対応するセンサーによって報告された温度(℃)。センサーは非現実的な値を返すことがあります。ソース:`/sys/class/hwmon` + +### TotalBytesOfMergeTreeTables + +MergeTreeファミリーのすべてのテーブルに保存されているバイト数(圧縮データとインデックスを含む)の合計。 + +### TotalPartsOfMergeTreeTables + +MergeTreeファミリーのすべてのテーブル内のデータパーツの合計数。10,000を超える数値は、サーバーの起動時間に悪影響を及ぼし、パーティションキーの選択が不合理であることを示している可能性があります。 + +### TotalPrimaryKeyBytesInMemory + +主キー値が使用するメモリの総量(バイト単位)(アクティブパーツのみが対象)。 + +### TotalPrimaryKeyBytesInMemoryAllocated + +主キー値のために予約されたメモリの総量(バイト単位)(アクティブパーツのみが対象)。 + +### TotalRowsOfMergeTreeTables + +MergeTreeファミリーのすべてのテーブルに保存されている行(レコード)の合計数。 + +### UncompressedCacheBytes + +非圧縮キャッシュの総サイズ(バイト単位)。非圧縮キャッシュは通常、性能を向上させることはなく、ほとんどの場合避けるべきです。 + +### UncompressedCacheCells + +非圧縮キャッシュ内のエントリーの総数。各エントリーはデータの非圧縮ブロックを表します。非圧縮キャッシュは通常、性能改善に役立たず、ほとんどの場合避けるべきです。 + +### Uptime + +サーバーの稼働時間(秒単位)。これは、接続を受け入れる前のサーバー初期化に費やされた時間も含まれます。 + +### jemalloc.active + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.allocated + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.arenas.all.dirty_purged + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.arenas.all.muzzy_purged + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.arenas.all.pactive + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.arenas.all.pdirty + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.arenas.all.pmuzzy + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.background_thread.num_runs + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.background_thread.num_threads + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.background_thread.run_intervals + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.epoch + +jemalloc(Jason Evansのメモリアロケータ)の統計の内部増分更新番号であり、他のすべての`jemalloc`メトリクスに使われます。 + +### jemalloc.mapped + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.metadata + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.metadata_thp + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.resident + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.retained + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +### jemalloc.prof.active + +ローレベルメモリアロケータ(jemalloc)の内部メトリクス。詳細はhttps://jemalloc.net/jemalloc.3.htmlを参照。 + +**関連項目** + +- [モニタリング](../../operations/monitoring.md) — ClickHouseモニタリングの基本概念。 +- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — 即時計算されるメトリクスを含む。 +- [system.events](../../operations/system-tables/events.md#system_tables-events) — 発生したイベント数を含む。 +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — テーブル`system.metrics`および`system.events`のメトリック値の履歴を含む。 diff --git a/docs/ja/operations/system-tables/azure_queue_settings.md b/docs/ja/operations/system-tables/azure_queue_settings.md new file mode 100644 index 00000000000..bdc09f2f073 --- /dev/null +++ b/docs/ja/operations/system-tables/azure_queue_settings.md @@ -0,0 +1,20 @@ +--- +slug: /ja/operations/system-tables/azure_queue_settings +--- +# azure_queue_settings + +[AzureQueue](../../engines/table-engines/integrations/azure-queue.md)テーブルの設定に関する情報を含みます。 +`24.10` サーバーバージョンから利用可能です。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブル名. +- `table` ([String](../../sql-reference/data-types/string.md)) — データベース名. +- `name` ([String](../../sql-reference/data-types/string.md)) — 設定名. +- `value` ([String](../../sql-reference/data-types/string.md)) — 設定値. +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 設定が明示的にコンフィグで定義されたか、変更されたか. +- `description` ([String](../../sql-reference/data-types/string.md)) — 設定の説明. +- `alterable` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `ALTER TABLE ... MODIFY SETTING`によって設定を変更できるかどうかを示します。 + - `0` — 現在のユーザーが設定を変更できます。 + - `1` — 現在のユーザーは設定を変更できません。 +- `type` ([String](../../sql-reference/data-types/string.md)) — 設定タイプ(実装固有の文字列値)。 diff --git a/docs/ja/operations/system-tables/backup_log.md b/docs/ja/operations/system-tables/backup_log.md new file mode 100644 index 00000000000..b1c1c7d7437 --- /dev/null +++ b/docs/ja/operations/system-tables/backup_log.md @@ -0,0 +1,152 @@ +--- +slug: /ja/operations/system-tables/backup_log +--- +# backup_log + +`BACKUP`および`RESTORE`操作に関するログエントリを含んでいます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — エントリの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — エントリの日付と時刻。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度のエントリの時刻。 +- `id` ([String](../../sql-reference/data-types/string.md)) — バックアップまたはリストア操作の識別子。 +- `name` ([String](../../sql-reference/data-types/string.md)) — バックアップストレージの名前 (`FROM`または`TO`句の内容)。 +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — 操作ステータス。可能な値: + - `'CREATING_BACKUP'` + - `'BACKUP_CREATED'` + - `'BACKUP_FAILED'` + - `'RESTORING'` + - `'RESTORED'` + - `'RESTORE_FAILED'` +- `error` ([String](../../sql-reference/data-types/string.md)) —操作が失敗した場合のエラーメッセージ(成功した場合は空文字列)。 +- `start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 操作の開始時刻。 +- `end_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 操作の終了時刻。 +- `num_files` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — バックアップに保存されたファイルの数。 +- `total_size` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — バックアップに保存されたファイルの合計サイズ。 +- `num_entries` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — バックアップのエントリ数。フォルダーとして保存されている場合はフォルダー内のファイル数、アーカイブとして保存されている場合はアーカイブ内のファイル数です。インクリメンタルバックアップや空ファイルまたは重複が含まれている場合、これは`num_files`とは異なる場合があります。常に次が成り立ちます: `num_entries <= num_files`。 +- `uncompressed_size` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — バックアップの非圧縮サイズ。 +- `compressed_size` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — バックアップの圧縮サイズ。バックアップがアーカイブとして保存されていない場合は`uncompressed_size`と同じです。 +- `files_read` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — リストア操作中に読み取られたファイルの数。 +- `bytes_read` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — リストア操作中に読み取られたファイルの総サイズ。 + +**例** + +```sql +BACKUP TABLE test_db.my_table TO Disk('backups_disk', '1.zip') +``` +```response +┌─id───────────────────────────────────┬─status─────────┐ +│ e5b74ecb-f6f1-426a-80be-872f90043885 │ BACKUP_CREATED │ +└──────────────────────────────────────┴────────────────┘ +``` +```sql +SELECT * FROM system.backup_log WHERE id = 'e5b74ecb-f6f1-426a-80be-872f90043885' ORDER BY event_date, event_time_microseconds \G +``` +```response +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-08-19 +event_time_microseconds: 2023-08-19 11:05:21.998566 +id: e5b74ecb-f6f1-426a-80be-872f90043885 +name: Disk('backups_disk', '1.zip') +status: CREATING_BACKUP +error: +start_time: 2023-08-19 11:05:21 +end_time: 1970-01-01 03:00:00 +num_files: 0 +total_size: 0 +num_entries: 0 +uncompressed_size: 0 +compressed_size: 0 +files_read: 0 +bytes_read: 0 + +Row 2: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-08-19 +event_time: 2023-08-19 11:08:56 +event_time_microseconds: 2023-08-19 11:08:56.916192 +id: e5b74ecb-f6f1-426a-80be-872f90043885 +name: Disk('backups_disk', '1.zip') +status: BACKUP_CREATED +error: +start_time: 2023-08-19 11:05:21 +end_time: 2023-08-19 11:08:56 +num_files: 57 +total_size: 4290364870 +num_entries: 46 +uncompressed_size: 4290362365 +compressed_size: 3525068304 +files_read: 0 +bytes_read: 0 +``` +```sql +RESTORE TABLE test_db.my_table FROM Disk('backups_disk', '1.zip') +``` +```response +┌─id───────────────────────────────────┬─status───┐ +│ cdf1f731-52ef-42da-bc65-2e1bfcd4ce90 │ RESTORED │ +└──────────────────────────────────────┴──────────┘ +``` +```sql +SELECT * FROM system.backup_log WHERE id = 'cdf1f731-52ef-42da-bc65-2e1bfcd4ce90' ORDER BY event_date, event_time_microseconds \G +``` +```response +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-08-19 +event_time_microseconds: 2023-08-19 11:09:19.718077 +id: cdf1f731-52ef-42da-bc65-2e1bfcd4ce90 +name: Disk('backups_disk', '1.zip') +status: RESTORING +error: +start_time: 2023-08-19 11:09:19 +end_time: 1970-01-01 03:00:00 +num_files: 0 +total_size: 0 +num_entries: 0 +uncompressed_size: 0 +compressed_size: 0 +files_read: 0 +bytes_read: 0 + +Row 2: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-08-19 +event_time_microseconds: 2023-08-19 11:09:29.334234 +id: cdf1f731-52ef-42da-bc65-2e1bfcd4ce90 +name: Disk('backups_disk', '1.zip') +status: RESTORED +error: +start_time: 2023-08-19 11:09:19 +end_time: 2023-08-19 11:09:29 +num_files: 57 +total_size: 4290364870 +num_entries: 46 +uncompressed_size: 4290362365 +compressed_size: 4290362365 +files_read: 57 +bytes_read: 4290364870 +``` + +これはシステムテーブル`system.backups`に書き込まれる基本的に同じ情報です: + +```sql +SELECT * FROM system.backups ORDER BY start_time +``` +```response +┌─id───────────────────────────────────┬─name──────────────────────────┬─status─────────┬─error─┬──────────start_time─┬────────────end_time─┬─num_files─┬─total_size─┬─num_entries─┬─uncompressed_size─┬─compressed_size─┬─files_read─┬─bytes_read─┐ +│ e5b74ecb-f6f1-426a-80be-872f90043885 │ Disk('backups_disk', '1.zip') │ BACKUP_CREATED │ │ 2023-08-19 11:05:21 │ 2023-08-19 11:08:56 │ 57 │ 4290364870 │ 46 │ 4290362365 │ 3525068304 │ 0 │ 0 │ +│ cdf1f731-52ef-42da-bc65-2e1bfcd4ce90 │ Disk('backups_disk', '1.zip') │ RESTORED │ │ 2023-08-19 11:09:19 │ 2023-08-19 11:09:29 │ 57 │ 4290364870 │ 46 │ 4290362365 │ 4290362365 │ 57 │ 4290364870 │ +└──────────────────────────────────────┴───────────────────────────────┴────────────────┴───────┴─────────────────────┴─────────────────────┴───────────┴────────────┴─────────────┴───────────────────┴─────────────────┴────────────┴────────────┘ +``` + +**関連項目** + +- [バックアップとリストア](../../operations/backup.md) diff --git a/docs/ja/operations/system-tables/blob_storage_log.md b/docs/ja/operations/system-tables/blob_storage_log.md new file mode 100644 index 00000000000..7268df21a92 --- /dev/null +++ b/docs/ja/operations/system-tables/blob_storage_log.md @@ -0,0 +1,61 @@ +--- +slug: /ja/operations/system-tables/blob_storage_log +--- +# blob_storage_log + +アップロードや削除など、さまざまなblobストレージ操作に関するログエントリを含みます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度のイベントの時刻。 +- `event_type` ([Enum8](../../sql-reference/data-types/enum.md)) — イベントの種類。可能な値: + - `'Upload'` + - `'Delete'` + - `'MultiPartUploadCreate'` + - `'MultiPartUploadWrite'` + - `'MultiPartUploadComplete'` + - `'MultiPartUploadAbort'` +- `query_id` ([String](../../sql-reference/data-types/string.md)) — イベントに関連するクエリの識別子(該当する場合)。 +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 操作を行うスレッドの識別子。 +- `thread_name` ([String](../../sql-reference/data-types/string.md)) — 操作を行うスレッドの名前。 +- `disk_name` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — 関連するディスクの名前。 +- `bucket` ([String](../../sql-reference/data-types/string.md)) — バケットの名前。 +- `remote_path` ([String](../../sql-reference/data-types/string.md)) — リモートリソースへのパス。 +- `local_path` ([String](../../sql-reference/data-types/string.md)) — リモートリソースを参照するローカルシステム上のメタデータファイルへのパス。 +- `data_size` ([UInt32](../../sql-reference/data-types/int-uint.md#uint-ranges)) — アップロードイベントに関与するデータのサイズ。 +- `error` ([String](../../sql-reference/data-types/string.md)) — イベントに関連するエラーメッセージ(該当する場合)。 + +**例** + +あるblobストレージ操作がファイルをアップロードし、イベントがログに記録されたとします: + +```sql +SELECT * FROM system.blob_storage_log WHERE query_id = '7afe0450-504d-4e4b-9a80-cd9826047972' ORDER BY event_date, event_time_microseconds \G +``` + +```text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2023-10-31 +event_time: 2023-10-31 16:03:40 +event_time_microseconds: 2023-10-31 16:03:40.481437 +event_type: Upload +query_id: 7afe0450-504d-4e4b-9a80-cd9826047972 +thread_id: 2381740 +disk_name: disk_s3 +bucket: bucket1 +remote_path: rrr/kxo/tbnqtrghgtnxkzgtcrlutwuslgawe +local_path: store/654/6549e8b3-d753-4447-8047-d462df6e6dbe/tmp_insert_all_1_1_0/checksums.txt +data_size: 259 +error: +``` + +この例では、アップロード操作はクエリID `7afe0450-504d-4e4b-9a80-cd9826047972` の`INSERT`クエリに関連していました。ローカルメタデータファイル `store/654/6549e8b3-d753-4447-8047-d462df6e6dbe/tmp_insert_all_1_1_0/checksums.txt` はバケット `bucket1` のディスク `disk_s3` 上のリモートパス `rrr/kxo/tbnqtrghgtnxkzgtcrlutwuslgawe` を参照しており、サイズは259バイトです。 + +**参照** + +- [データを保存するための外部ディスク](../../operations/storing-data.md) diff --git a/docs/ja/operations/system-tables/build_options.md b/docs/ja/operations/system-tables/build_options.md new file mode 100644 index 00000000000..aea1e72f337 --- /dev/null +++ b/docs/ja/operations/system-tables/build_options.md @@ -0,0 +1,27 @@ +--- +slug: /ja/operations/system-tables/build_options +--- +# build_options + +ClickHouseサーバーのビルドオプションに関する情報が含まれています。 + +カラム: + +- `name` (String) — ビルドオプションの名前、例えば `USE_ODBC` +- `value` (String) — ビルドオプションの値、例えば `1` + +**例** + +``` sql +SELECT * FROM system.build_options LIMIT 5 +``` + +``` text +┌─name─────────────┬─value─┐ +│ USE_BROTLI │ 1 │ +│ USE_BZIP2 │ 1 │ +│ USE_CAPNP │ 1 │ +│ USE_CASSANDRA │ 1 │ +│ USE_DATASKETCHES │ 1 │ +└──────────────────┴───────┘ +``` diff --git a/docs/ja/operations/system-tables/clusters.md b/docs/ja/operations/system-tables/clusters.md new file mode 100644 index 00000000000..d128203a0e4 --- /dev/null +++ b/docs/ja/operations/system-tables/clusters.md @@ -0,0 +1,82 @@ +--- +slug: /ja/operations/system-tables/clusters +--- +# clusters + +コンフィグファイルに記載されている利用可能なクラスターとそのサーバーについての情報を含んでいます。 + +カラム: + +- `cluster` ([String](../../sql-reference/data-types/string.md)) — クラスター名。 +- `shard_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — クラスター内のシャード番号。1から始まります。 +- `shard_weight` ([UInt32](../../sql-reference/data-types/int-uint.md)) — データを書き込む際のシャードの相対的な重み。 +- `replica_num` ([UInt32](../../sql-reference/data-types/int-uint.md)) — シャード内のレプリカ番号。1から始まります。 +- `host_name` ([String](../../sql-reference/data-types/string.md)) — コンフィグで指定されたホスト名。 +- `host_address` ([String](../../sql-reference/data-types/string.md)) — DNSから取得したホストIPアドレス。 +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — サーバーへの接続に使用するポート。 +- `is_local` ([UInt8](../../sql-reference/data-types/int-uint.md)) — ホストがローカルであるかどうかを示すフラグ。 +- `user` ([String](../../sql-reference/data-types/string.md)) — サーバーへの接続に使用するユーザー名。 +- `default_database` ([String](../../sql-reference/data-types/string.md)) — デフォルトのデータベース名。 +- `errors_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — このホストでレプリカに到達するのに失敗した回数。 +- `slowdowns_count` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ヘッジリクエストで接続を確立する際にレプリカを変更することになった遅延の回数。 +- `estimated_recovery_time` ([UInt32](../../sql-reference/data-types/int-uint.md)) — レプリカエラーカウントがゼロになり、正常に戻るまでの残り秒数。 +- `database_shard_name` ([String](../../sql-reference/data-types/string.md)) — `Replicated` データベースシャードの名前(`Replicated` データベースに属するクラスターの場合)。 +- `database_replica_name` ([String](../../sql-reference/data-types/string.md)) — `Replicated` データベースレプリカの名前(`Replicated` データベースに属するクラスターの場合)。 +- `is_active` ([Nullable(UInt8)](../../sql-reference/data-types/int-uint.md)) — `Replicated` データベースレプリカの状態(`Replicated` データベースに属するクラスターの場合)。1は「レプリカがオンライン」、0は「レプリカがオフライン」、`NULL` は「不明」を示します。 +- `name` ([String](../../sql-reference/data-types/string.md)) - クラスターへのエイリアス。 + +**例** + +クエリ: + +```sql +SELECT * FROM system.clusters LIMIT 2 FORMAT Vertical; +``` + +結果: + +```text +行 1: +──── +cluster: test_cluster_two_shards +shard_num: 1 +shard_weight: 1 +replica_num: 1 +host_name: 127.0.0.1 +host_address: 127.0.0.1 +port: 9000 +is_local: 1 +user: default +default_database: +errors_count: 0 +slowdowns_count: 0 +estimated_recovery_time: 0 +database_shard_name: +database_replica_name: +is_active: NULL + +行 2: +──── +cluster: test_cluster_two_shards +shard_num: 2 +shard_weight: 1 +replica_num: 1 +host_name: 127.0.0.2 +host_address: 127.0.0.2 +port: 9000 +is_local: 0 +user: default +default_database: +errors_count: 0 +slowdowns_count: 0 +estimated_recovery_time: 0 +database_shard_name: +database_replica_name: +is_active: NULL +``` + +**参照** + +- [テーブルエンジン Distributed](../../engines/table-engines/special/distributed.md) +- [distributed_replica_error_cap 設定](../../operations/settings/settings.md#distributed_replica_error_cap) +- [distributed_replica_error_half_life 設定](../../operations/settings/settings.md#distributed_replica_error_half_life) diff --git a/docs/ja/operations/system-tables/columns.md b/docs/ja/operations/system-tables/columns.md new file mode 100644 index 00000000000..0eb2b0c09b7 --- /dev/null +++ b/docs/ja/operations/system-tables/columns.md @@ -0,0 +1,90 @@ +--- +slug: /ja/operations/system-tables/columns +--- +# columns + +すべてのテーブルのカラムに関する情報を含んでいます。 + +このテーブルを使用すると、複数のテーブルに対して一度に[DESCRIBE TABLE](../../sql-reference/statements/describe-table.md)クエリに似た情報を取得できます。 + +[一時テーブル](../../sql-reference/statements/create/table.md#temporary-tables)のカラムは、それが作成されたセッションでのみ `system.columns` に表示されます。これらは `database` フィールドが空の状態で表示されます。 + +`system.columns` テーブルには以下のカラムが含まれています(カラムタイプは括弧内に示されています): + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベース名。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `name` ([String](../../sql-reference/data-types/string.md)) — カラム名。 +- `type` ([String](../../sql-reference/data-types/string.md)) — カラムタイプ。 +- `position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — テーブル内のカラムの序数、1から開始。 +- `default_kind` ([String](../../sql-reference/data-types/string.md)) — デフォルト値の式タイプ (`DEFAULT`, `MATERIALIZED`, `ALIAS`)、未定義の場合は空の文字列。 +- `default_expression` ([String](../../sql-reference/data-types/string.md)) — デフォルト値の式、未定義の場合は空の文字列。 +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 圧縮されたデータのサイズ(バイト単位)。 +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 解凍されたデータのサイズ(バイト単位)。 +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マークのサイズ(バイト単位)。 +- `comment` ([String](../../sql-reference/data-types/string.md)) — カラムに関するコメント、未定義の場合は空の文字列。 +- `is_in_partition_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — カラムがパーティション式に含まれているかどうかを示すフラグ。 +- `is_in_sorting_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — カラムがソートキー式に含まれているかどうかを示すフラグ。 +- `is_in_primary_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — カラムが主キー式に含まれているかどうかを示すフラグ。 +- `is_in_sampling_key` ([UInt8](../../sql-reference/data-types/int-uint.md)) — カラムがサンプリングキー式に含まれているかどうかを示すフラグ。 +- `compression_codec` ([String](../../sql-reference/data-types/string.md)) — 圧縮コーデック名。 +- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — バイナリデータ、文字データ、またはテキストデータと画像の最大バイト長。ClickHouseでは `FixedString` データ型にのみ意味があります。それ以外の場合は `NULL` 値が返されます。 +- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似数値データ、正確な数値データ、整数データ、または貨幣データの精度。ClickHouseでは整数型に対するビット幅と `Decimal` 型に対する小数精度です。それ以外の場合は `NULL` 値が返されます。 +- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似数値データ、正確な数値データ、整数データ、または貨幣データの正確さを表す数値システムの基数です。ClickHouseでは整数型に対しては2、`Decimal` 型に対しては10です。それ以外の場合は `NULL` 値が返されます。 +- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似数値データ、正確な数値データ、整数データ、または貨幣データのスケール。ClickHouseでは `Decimal` 型にのみ意味があります。それ以外の場合は `NULL` 値が返されます。 +- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — `DateTime64` データ型の小数精度。他のデータ型の場合は `NULL` 値が返されます。 + +**例** + +```sql +SELECT * FROM system.columns LIMIT 2 FORMAT Vertical; +``` + +```text +Row 1: +────── +database: INFORMATION_SCHEMA +table: COLUMNS +name: table_catalog +type: String +position: 1 +default_kind: +default_expression: +data_compressed_bytes: 0 +data_uncompressed_bytes: 0 +marks_bytes: 0 +comment: +is_in_partition_key: 0 +is_in_sorting_key: 0 +is_in_primary_key: 0 +is_in_sampling_key: 0 +compression_codec: +character_octet_length: ᴺᵁᴸᴸ +numeric_precision: ᴺᵁᴸᴸ +numeric_precision_radix: ᴺᵁᴸᴸ +numeric_scale: ᴺᵁᴸᴸ +datetime_precision: ᴺᵁᴸᴸ + +Row 2: +────── +database: INFORMATION_SCHEMA +table: COLUMNS +name: table_schema +type: String +position: 2 +default_kind: +default_expression: +data_compressed_bytes: 0 +data_uncompressed_bytes: 0 +marks_bytes: 0 +comment: +is_in_partition_key: 0 +is_in_sorting_key: 0 +is_in_primary_key: 0 +is_in_sampling_key: 0 +compression_codec: +character_octet_length: ᴺᵁᴸᴸ +numeric_precision: ᴺᵁᴸᴸ +numeric_precision_radix: ᴺᵁᴸᴸ +numeric_scale: ᴺᵁᴸᴸ +datetime_precision: ᴺᵁᴸᴸ +``` diff --git a/docs/ja/operations/system-tables/contributors.md b/docs/ja/operations/system-tables/contributors.md new file mode 100644 index 00000000000..a4026027533 --- /dev/null +++ b/docs/ja/operations/system-tables/contributors.md @@ -0,0 +1,43 @@ +--- +slug: /ja/operations/system-tables/contributors +--- +# contributors + +寄稿者に関する情報を含んでいます。順序はクエリ実行時にランダムです。 + +カラム: + +- `name` (String) — git logからの寄稿者(著者)の名前。 + +**例** + +``` sql +SELECT * FROM system.contributors LIMIT 10 +``` + +``` text +┌─name─────────────┐ +│ Olga Khvostikova │ +│ Max Vetrov │ +│ LiuYangkuan │ +│ svladykin │ +│ zamulla │ +│ Šimon Podlipský │ +│ BayoNet │ +│ Ilya Khomutov │ +│ Amy Krishnevsky │ +│ Loud_Scream │ +└──────────────────┘ +``` + +表で自分自身を見つけ出すには、次のクエリを使用します: + +``` sql +SELECT * FROM system.contributors WHERE name = 'Olga Khvostikova' +``` + +``` text +┌─name─────────────┐ +│ Olga Khvostikova │ +└──────────────────┘ +``` diff --git a/docs/ja/operations/system-tables/crash-log.md b/docs/ja/operations/system-tables/crash-log.md new file mode 100644 index 00000000000..dba10b76216 --- /dev/null +++ b/docs/ja/operations/system-tables/crash-log.md @@ -0,0 +1,52 @@ +--- +slug: /ja/operations/system-tables/crash-log +--- +# crash_log + +致命的なエラーに関するスタックトレースの情報が含まれています。このテーブルはデフォルトではデータベースに存在しておらず、致命的なエラーが発生したときにのみ作成されます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ナノ秒単位のイベントのタイムスタンプ。 +- `signal` ([Int32](../../sql-reference/data-types/int-uint.md)) — シグナル番号。 +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — スレッドID。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — クエリID。 +- `trace` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クラッシュ時のスタックトレース。各要素はClickHouseサーバープロセス内の仮想メモリアドレスです。 +- `trace_full` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — クラッシュ時のスタックトレース。各要素はClickHouseサーバープロセス内で呼び出されたメソッドを含みます。 +- `version` ([String](../../sql-reference/data-types/string.md)) — ClickHouseサーバーのバージョン。 +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouseサーバーのリビジョン。 +- `build_id` ([String](../../sql-reference/data-types/string.md)) — コンパイラによって生成されるBuildID。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.crash_log ORDER BY event_time DESC LIMIT 1; +``` + +結果(完全ではありません): + +``` text +行 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2020-10-14 +event_time: 2020-10-14 15:47:40 +timestamp_ns: 1602679660271312710 +signal: 11 +thread_id: 23624 +query_id: 428aab7c-8f5c-44e9-9607-d16b44467e69 +trace: [188531193,...] +trace_full: ['3. DB::(anonymous namespace)::FunctionFormatReadableTimeDelta::executeImpl(std::__1::vector >&, std::__1::vector > const&, unsigned long, unsigned long) const @ 0xb3cc1f9 in /home/username/work/ClickHouse/build/programs/clickhouse',...] +version: ClickHouse 20.11.1.1 +revision: 54442 +build_id: +``` + +**関連項目** +- [trace_log](../../operations/system-tables/trace_log.md) システムテーブル + diff --git a/docs/ja/operations/system-tables/current-roles.md b/docs/ja/operations/system-tables/current-roles.md new file mode 100644 index 00000000000..9d76875b453 --- /dev/null +++ b/docs/ja/operations/system-tables/current-roles.md @@ -0,0 +1,12 @@ +--- +slug: /ja/operations/system-tables/current-roles +--- +# current_roles + +このテーブルには、現在のユーザーのアクティブなロールが含まれています。`SET ROLE` により、このテーブルの内容が変更されます。 + +カラム: + + - `role_name` ([String](../../sql-reference/data-types/string.md)) — ロール名。 + - `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `current_role` が `ADMIN OPTION` 権限を持つロールかどうかを示すフラグ。 + - `is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `current_role` がデフォルトのロールかどうかを示すフラグ。 diff --git a/docs/ja/operations/system-tables/dashboards.md b/docs/ja/operations/system-tables/dashboards.md new file mode 100644 index 00000000000..bef16ad45ec --- /dev/null +++ b/docs/ja/operations/system-tables/dashboards.md @@ -0,0 +1,66 @@ +--- +slug: /ja/operations/system-tables/dashboards +--- +# dashboards + +[HTTPインターフェース](/docs/ja/interfaces/http.md)を介してアクセス可能な`/dashboard`ページで使用されるクエリを含んでいます。このテーブルは、監視やトラブルシューティングに役立ちます。ダッシュボード内の各チャートに対して行が含まれています。 + +:::note +`/dashboard`ページは`system.dashboards`だけでなく、同じスキーマを持つ任意のテーブルからクエリをレンダリングできます。これにより、カスタムダッシュボードを作成することができます。 +::: + +例: + +``` sql +SELECT * +FROM system.dashboards +WHERE title ILIKE '%CPU%' +``` + +``` text +Row 1: +────── +dashboard: overview +title: CPU Usage (cores) +query: SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(ProfileEvent_OSCPUVirtualTimeMicroseconds) / 1000000 +FROM system.metric_log +WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} +GROUP BY t +ORDER BY t WITH FILL STEP {rounding:UInt32} + +Row 2: +────── +dashboard: overview +title: CPU Wait +query: SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(ProfileEvent_OSCPUWaitMicroseconds) / 1000000 +FROM system.metric_log +WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} +GROUP BY t +ORDER BY t WITH FILL STEP {rounding:UInt32} + +Row 3: +────── +dashboard: overview +title: OS CPU Usage (Userspace) +query: SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(value) +FROM system.asynchronous_metric_log +WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} AND metric = 'OSUserTimeNormalized' +GROUP BY t +ORDER BY t WITH FILL STEP {rounding:UInt32} + +Row 4: +────── +dashboard: overview +title: OS CPU Usage (Kernel) +query: SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(value) +FROM system.asynchronous_metric_log +WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} AND metric = 'OSSystemTimeNormalized' +GROUP BY t +ORDER BY t WITH FILL STEP {rounding:UInt32} +``` + +カラム: + +- `dashboard` (`String`) - ダッシュボード名。 +- `title` (`String`) - チャートのタイトル。 +- `query` (`String`) - 表示するデータを取得するためのクエリ。 diff --git a/docs/ja/operations/system-tables/data_skipping_indices.md b/docs/ja/operations/system-tables/data_skipping_indices.md new file mode 100644 index 00000000000..9dcc1cc8201 --- /dev/null +++ b/docs/ja/operations/system-tables/data_skipping_indices.md @@ -0,0 +1,53 @@ +--- +slug: /ja/operations/system-tables/data_skipping_indices +--- +# data_skipping_indices + +全てのテーブルに存在するデータスキッピングインデックスに関する情報を含みます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベース名。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `name` ([String](../../sql-reference/data-types/string.md)) — インデックス名。 +- `type` ([String](../../sql-reference/data-types/string.md)) — インデックスタイプ。 +- `type_full` ([String](../../sql-reference/data-types/string.md)) — 作成文からのインデックスタイプ式。 +- `expr` ([String](../../sql-reference/data-types/string.md)) — インデックス計算のための式。 +- `granularity` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ブロック内のグラニュール数。 +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 圧縮されたデータのサイズ(バイト単位)。 +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 解凍されたデータのサイズ(バイト単位)。 +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マークのサイズ(バイト単位)。 + +**例** + +```sql +SELECT * FROM system.data_skipping_indices LIMIT 2 FORMAT Vertical; +``` + +```text +Row 1: +────── +database: default +table: user_actions +name: clicks_idx +type: minmax +type_full: minmax +expr: clicks +granularity: 1 +data_compressed_bytes: 58 +data_uncompressed_bytes: 6 +marks: 48 + +Row 2: +────── +database: default +table: users +name: contacts_null_idx +type: minmax +type_full: minmax +expr: assumeNotNull(contacts_null) +granularity: 1 +data_compressed_bytes: 58 +data_uncompressed_bytes: 6 +marks: 48 +``` diff --git a/docs/ja/operations/system-tables/data_type_families.md b/docs/ja/operations/system-tables/data_type_families.md new file mode 100644 index 00000000000..28c60714cde --- /dev/null +++ b/docs/ja/operations/system-tables/data_type_families.md @@ -0,0 +1,37 @@ +--- +slug: /ja/operations/system-tables/data_type_families +--- +# data_type_families + +サポートされている[データ型](../../sql-reference/data-types/index.md)に関する情報が含まれています。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — データ型の名前。 +- `case_insensitive` ([UInt8](../../sql-reference/data-types/int-uint.md)) — データ型の名前をクエリ内で大文字小文字を区別せずに使用できるかどうかを示すプロパティ。例えば、`Date` と `date` はどちらも有効です。 +- `alias_to` ([String](../../sql-reference/data-types/string.md)) — `name`がエイリアスとなっているデータ型の名前。 + +**例** + +``` sql +SELECT * FROM system.data_type_families WHERE alias_to = 'String' +``` + +``` text +┌─name───────┬─case_insensitive─┬─alias_to─┐ +│ LONGBLOB │ 1 │ String │ +│ LONGTEXT │ 1 │ String │ +│ TINYTEXT │ 1 │ String │ +│ TEXT │ 1 │ String │ +│ VARCHAR │ 1 │ String │ +│ MEDIUMBLOB │ 1 │ String │ +│ BLOB │ 1 │ String │ +│ TINYBLOB │ 1 │ String │ +│ CHAR │ 1 │ String │ +│ MEDIUMTEXT │ 1 │ String │ +└────────────┴──────────────────┴──────────┘ +``` + +**関連項目** + +- [構文](../../sql-reference/syntax.md) — サポートされている構文に関する情報。 diff --git a/docs/ja/operations/system-tables/database_engines.md b/docs/ja/operations/system-tables/database_engines.md new file mode 100644 index 00000000000..25e554c773e --- /dev/null +++ b/docs/ja/operations/system-tables/database_engines.md @@ -0,0 +1,26 @@ +--- +slug: /ja/operations/system-tables/database_engines +--- +# database_engines + +サーバーでサポートされているデータベースエンジンのリストを含みます。 + +このテーブルには以下のカラムが含まれます(カラムの型は括弧内に示されています): + +- `name` (String) — データベースエンジンの名前。 + +例: + +``` sql +SELECT * +FROM system.database_engines +WHERE name in ('Atomic', 'Lazy', 'Ordinary') +``` + +``` text +┌─name─────┐ +│ Ordinary │ +│ Atomic │ +│ Lazy │ +└──────────┘ +``` diff --git a/docs/ja/operations/system-tables/databases.md b/docs/ja/operations/system-tables/databases.md new file mode 100644 index 00000000000..3d252fe21c7 --- /dev/null +++ b/docs/ja/operations/system-tables/databases.md @@ -0,0 +1,44 @@ +--- +slug: /ja/operations/system-tables/databases +--- +# databases + +現在のユーザーが利用可能なデータベースに関する情報を含みます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — データベース名。 +- `engine` ([String](../../sql-reference/data-types/string.md)) — [データベースエンジン](../../engines/database-engines/index.md)。 +- `data_path` ([String](../../sql-reference/data-types/string.md)) — データパス。 +- `metadata_path` ([String](../../sql-reference/data-types/enum.md)) — メタデータパス。 +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — データベースUUID。 +- `comment` ([String](../../sql-reference/data-types/enum.md)) — データベースコメント。 +- `engine_full` ([String](../../sql-reference/data-types/enum.md)) — データベースエンジンのパラメータ。 +- `database` ([String](../../sql-reference/data-types/string.md)) – `name`のエイリアス。 + +このシステムテーブルの`name`カラムは、`SHOW DATABASES`クエリの実装に使用されます。 + +**例** + +データベースの作成。 + +``` sql +CREATE DATABASE test; +``` + +ユーザーが利用可能なすべてのデータベースを確認します。 + +``` sql +SELECT * FROM system.databases; +``` + +``` text +┌─name────────────────┬─engine─────┬─data_path────────────────────┬─metadata_path─────────────────────────────────────────────────────────┬─uuid─────────────────────────────────┬─engine_full────────────────────────────────────────────┬─comment─┐ +│ INFORMATION_SCHEMA │ Memory │ /data/clickhouse_data/ │ │ 00000000-0000-0000-0000-000000000000 │ Memory │ │ +│ default │ Atomic │ /data/clickhouse_data/store/ │ /data/clickhouse_data/store/f97/f97a3ceb-2e8a-4912-a043-c536e826a4d4/ │ f97a3ceb-2e8a-4912-a043-c536e826a4d4 │ Atomic │ │ +│ information_schema │ Memory │ /data/clickhouse_data/ │ │ 00000000-0000-0000-0000-000000000000 │ Memory │ │ +│ replicated_database │ Replicated │ /data/clickhouse_data/store/ │ /data/clickhouse_data/store/da8/da85bb71-102b-4f69-9aad-f8d6c403905e/ │ da85bb71-102b-4f69-9aad-f8d6c403905e │ Replicated('some/path/database', 'shard1', 'replica1') │ │ +│ system │ Atomic │ /data/clickhouse_data/store/ │ /data/clickhouse_data/store/b57/b5770419-ac7a-4b67-8229-524122024076/ │ b5770419-ac7a-4b67-8229-524122024076 │ Atomic │ │ +└─────────────────────┴────────────┴──────────────────────────────┴───────────────────────────────────────────────────────────────────────┴──────────────────────────────────────┴────────────────────────────────────────────────────────┴─────────┘ + +``` diff --git a/docs/ja/operations/system-tables/detached_parts.md b/docs/ja/operations/system-tables/detached_parts.md new file mode 100644 index 00000000000..a86790b85fd --- /dev/null +++ b/docs/ja/operations/system-tables/detached_parts.md @@ -0,0 +1,12 @@ +--- +slug: /ja/operations/system-tables/detached_parts +--- +# detached_parts + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの分離されたパーツに関する情報を含みます。`reason`カラムは、パーツが分離された理由を指定します。 + +ユーザーによって分離されたパーツの場合、理由は空です。そのようなパーツは、[ALTER TABLE ATTACH PARTITION\|PART](../../sql-reference/statements/alter/partition.md#alter_attach-partition) コマンドでアタッチできます。 + +他のカラムの説明については、[system.parts](../../operations/system-tables/parts.md#system_tables-parts)を参照してください。 + +パーツ名が無効な場合、一部のカラムの値は`NULL`になることがあります。そのようなパーツは、[ALTER TABLE DROP DETACHED PART](../../sql-reference/statements/alter/partition.md#alter_drop-detached)で削除できます。 diff --git a/docs/ja/operations/system-tables/detached_tables.md b/docs/ja/operations/system-tables/detached_tables.md new file mode 100644 index 00000000000..3ae2b59793d --- /dev/null +++ b/docs/ja/operations/system-tables/detached_tables.md @@ -0,0 +1,35 @@ +--- +slug: /ja/operations/system-tables/detached_tables +--- +# detached_tables + +各分離されたテーブルの情報を含みます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブルが所属するデータベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 + +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — テーブルのUUID(Atomicデータベース)。 + +- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - ファイルシステム内のテーブルメタデータへのパス。 + +- `is_permanently` ([UInt8](../../sql-reference/data-types/int-uint.md)) - テーブルがPERMANENTLYで分離されたことを示すフラグ。 + + +**例** + +```sql +SELECT * FROM system.detached_tables FORMAT Vertical; +``` + +```text +Row 1: +────── +database: base +table: t1 +uuid: 81b1c20a-b7c6-4116-a2ce-7583fb6b6736 +metadata_path: /var/lib/clickhouse/store/461/461cf698-fd0b-406d-8c01-5d8fd5748a91/t1.sql +is_permanently: 1 +``` diff --git a/docs/ja/operations/system-tables/dictionaries.md b/docs/ja/operations/system-tables/dictionaries.md new file mode 100644 index 00000000000..446d6678b49 --- /dev/null +++ b/docs/ja/operations/system-tables/dictionaries.md @@ -0,0 +1,91 @@ +--- +slug: /ja/operations/system-tables/dictionaries +--- +# dictionaries + +[Dictionary](../../sql-reference/dictionaries/index.md)に関する情報を含んでいます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — DDLクエリによって作成されたDictionaryを含むデータベースの名前。他のDictionaryの場合は空文字列。 +- `name` ([String](../../sql-reference/data-types/string.md)) — [Dictionary名](../../sql-reference/dictionaries/index.md)。 +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — DictionaryのUUID。 +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — Dictionaryのステータス。可能な値は以下の通りです: + - `NOT_LOADED` — 使用されなかったためDictionaryはロードされませんでした。 + - `LOADED` — Dictionaryが正常にロードされました。 + - `FAILED` — エラーが原因でDictionaryをロードできませんでした。 + - `LOADING` — 現在、Dictionaryがロード中です。 + - `LOADED_AND_RELOADING` — Dictionaryが正常にロードされ、現在リロード中です(頻繁な理由: [SYSTEM RELOAD DICTIONARY](../../sql-reference/statements/system.md#query_language-system-reload-dictionary)クエリ、タイムアウト、Dictionary設定の変更)。 + - `FAILED_AND_RELOADING` — エラーが原因でDictionaryをロードできず、現在ロード中です。 +- `origin` ([String](../../sql-reference/data-types/string.md)) — Dictionaryを記述する設定ファイルへのパス。 +- `type` ([String](../../sql-reference/data-types/string.md)) — Dictionaryの割り当てタイプ。[メモリにDictionaryを保存](../../sql-reference/dictionaries/index.md#storig-dictionaries-in-memory)。 +- `key.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Dictionaryによって提供される[キーの名前](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key)の配列。 +- `key.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Dictionaryによって提供される[キーのタイプ](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-key)の対応する配列。 +- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Dictionaryによって提供される[属性の名前](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes)の配列。 +- `attribute.types` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — Dictionaryによって提供される[属性のタイプ](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes)の対応する配列。 +- `bytes_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Dictionaryに割り当てられたRAMの量。 +- `query_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Dictionaryのロードまたは最後の正常な再起動以来のクエリの数。 +- `hit_rate` ([Float64](../../sql-reference/data-types/float.md)) — キャッシュDictionaryの場合、キャッシュ内に値があった使用回数の割合。 +- `found_rate` ([Float64](../../sql-reference/data-types/float.md)) — 値が見つかった使用回数の割合。 +- `element_count` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — Dictionaryに格納されているアイテムの数。 +- `load_factor` ([Float64](../../sql-reference/data-types/float.md)) — Dictionary (ハッシュベースのDictionaryではハッシュテーブル)の充填率。 +- `source` ([String](../../sql-reference/data-types/string.md)) — Dictionaryの[データソース](../../sql-reference/dictionaries/index.md#dictionary-sources)を説明するテキスト。 +- `lifetime_min` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — メモリ内のDictionaryの最小[有効期限](../../sql-reference/dictionaries/index.md#dictionary-updates)、この後ClickHouseはDictionaryをリロードしようとします(`invalidate_query`が設定されている場合、変わっていればのみ)。秒単位で設定。 +- `lifetime_max` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — メモリ内のDictionaryの最大[有効期限](../../sql-reference/dictionaries/index.md#dictionary-updates)、この後ClickHouseはDictionaryをリロードしようとします(`invalidate_query`が設定されている場合、変わっていればのみ)。秒単位で設定。 +- `loading_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Dictionaryのロード開始時間。 +- `last_successful_update_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — Dictionaryのロードまたは更新の終了時間。Dictionaryソースに関連する問題の監視と原因調査に役立ちます。 +- `loading_duration` ([Float32](../../sql-reference/data-types/float.md)) — Dictionaryロードの期間。 +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — Dictionaryを作成またはリロードする際に発生するエラーのテキスト、Dictionaryが作成できなかった場合。 +- `comment` ([String](../../sql-reference/data-types/string.md)) — Dictionaryへのコメントのテキスト。 + +**例** + +Dictionaryを構成します: + +``` sql +CREATE DICTIONARY dictionary_with_comment +( + id UInt64, + value String +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(HOST 'localhost' PORT tcpPort() TABLE 'source_table')) +LAYOUT(FLAT()) +LIFETIME(MIN 0 MAX 1000) +COMMENT 'The temporary dictionary'; +``` + +Dictionaryがロードされていることを確認します。 + +``` sql +SELECT * FROM system.dictionaries LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +database: default +name: dictionary_with_comment +uuid: 4654d460-0d03-433a-8654-d4600d03d33a +status: NOT_LOADED +origin: 4654d460-0d03-433a-8654-d4600d03d33a +type: +key.names: ['id'] +key.types: ['UInt64'] +attribute.names: ['value'] +attribute.types: ['String'] +bytes_allocated: 0 +query_count: 0 +hit_rate: 0 +found_rate: 0 +element_count: 0 +load_factor: 0 +source: +lifetime_min: 0 +lifetime_max: 0 +loading_start_time: 1970-01-01 00:00:00 +last_successful_update_time: 1970-01-01 00:00:00 +loading_duration: 0 +last_exception: +comment: The temporary dictionary +``` diff --git a/docs/ja/operations/system-tables/disks.md b/docs/ja/operations/system-tables/disks.md new file mode 100644 index 00000000000..3900ffe48b8 --- /dev/null +++ b/docs/ja/operations/system-tables/disks.md @@ -0,0 +1,29 @@ +--- +slug: /ja/operations/system-tables/disks +--- +# disk + +[サーバー設定](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes_configure)で定義されたディスクの情報を含みます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — サーバー設定内のディスクの名前。 +- `path` ([String](../../sql-reference/data-types/string.md)) — ファイルシステム内のマウントポイントへのパス。 +- `free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ディスク上の空き容量(バイト単位)。 +- `total_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ディスク容量(バイト単位)。 +- `unreserved_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 予約されていない空き容量。(`free_space`から、現在実行中のマージやインサート及びその他のディスク書き込み操作によって取られている予約サイズを引いた値。) +- `keep_free_space` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ディスク上で常に空けておくべきディスク容量(バイト単位)。ディスク設定の`keep_free_space_bytes`パラメーターで定義。 + +**例** + +```sql +SELECT * FROM system.disks; +``` + +```response +┌─name────┬─path─────────────────┬───free_space─┬──total_space─┬─keep_free_space─┐ +│ default │ /var/lib/clickhouse/ │ 276392587264 │ 490652508160 │ 0 │ +└─────────┴──────────────────────┴──────────────┴──────────────┴─────────────────┘ + +1 rows in set. Elapsed: 0.001 sec. +``` diff --git a/docs/ja/operations/system-tables/distributed_ddl_queue.md b/docs/ja/operations/system-tables/distributed_ddl_queue.md new file mode 100644 index 00000000000..d93b318d782 --- /dev/null +++ b/docs/ja/operations/system-tables/distributed_ddl_queue.md @@ -0,0 +1,74 @@ +--- +slug: /ja/operations/system-tables/distributed_ddl_queue +--- +# distributed_ddl_queue + +クラスタで実行された[分散DDLクエリ(ON CLUSTER句)](../../sql-reference/distributed-ddl.md)に関する情報を含みます。 + +カラム: + +- `entry` ([String](../../sql-reference/data-types/string.md)) — クエリID。 +- `entry_version` ([Nullable(UInt8)](../../sql-reference/data-types/int-uint.md)) - エントリのバージョン +- `initiator_host` ([Nullable(String)](../../sql-reference/data-types/string.md)) - DDL操作を開始したホスト +- `initiator_port` ([Nullable(UInt16)](../../sql-reference/data-types/int-uint.md)) - イニシエーターが使用したポート +- `cluster` ([String](../../sql-reference/data-types/string.md)) — クラスター名。 +- `query` ([String](../../sql-reference/data-types/string.md)) — 実行されたクエリ。 +- `settings` ([Map(String, String)](../../sql-reference/data-types/map.md)) - DDL操作で使用された設定 +- `query_create_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリ生成時刻。 +- `host` ([String](../../sql-reference/data-types/string.md)) — ホスト名 +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — ホストポート。 +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — クエリのステータス。 +- `exception_code` ([Enum8](../../sql-reference/data-types/enum.md)) — 例外コード。 +- `exception_text` ([Nullable(String)](../../sql-reference/data-types/string.md)) - 例外メッセージ +- `query_finish_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリ終了時刻。 +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — クエリ実行時間(ミリ秒単位)。 + +**例** + +``` sql +SELECT * +FROM system.distributed_ddl_queue +WHERE cluster = 'test_cluster' +LIMIT 2 +FORMAT Vertical + +Query id: f544e72a-6641-43f1-836b-24baa1c9632a + +Row 1: +────── +entry: query-0000000000 +entry_version: 5 +initiator_host: clickhouse01 +initiator_port: 9000 +cluster: test_cluster +query: CREATE DATABASE test_db UUID '4a82697e-c85e-4e5b-a01e-a36f2a758456' ON CLUSTER test_cluster +settings: {'max_threads':'16','use_uncompressed_cache':'0'} +query_create_time: 2023-09-01 16:15:14 +host: clickhouse-01 +port: 9000 +status: Finished +exception_code: 0 +exception_text: +query_finish_time: 2023-09-01 16:15:14 +query_duration_ms: 154 + +Row 2: +────── +entry: query-0000000001 +entry_version: 5 +initiator_host: clickhouse01 +initiator_port: 9000 +cluster: test_cluster +query: CREATE DATABASE test_db UUID '4a82697e-c85e-4e5b-a01e-a36f2a758456' ON CLUSTER test_cluster +settings: {'max_threads':'16','use_uncompressed_cache':'0'} +query_create_time: 2023-09-01 16:15:14 +host: clickhouse-01 +port: 9000 +status: Finished +exception_code: 630 +exception_text: Code: 630. DB::Exception: Cannot drop or rename test_db, because some tables depend on it: +query_finish_time: 2023-09-01 16:15:14 +query_duration_ms: 154 + +2 rows in set. Elapsed: 0.025 sec. +``` diff --git a/docs/ja/operations/system-tables/distribution_queue.md b/docs/ja/operations/system-tables/distribution_queue.md new file mode 100644 index 00000000000..404da9a7d5b --- /dev/null +++ b/docs/ja/operations/system-tables/distribution_queue.md @@ -0,0 +1,51 @@ +--- +slug: /ja/operations/system-tables/distribution_queue +--- +# distribution_queue + +このテーブルはシャードに送信されるキューにあるローカルファイルに関する情報を含んでいます。これらのローカルファイルは、新しいデータを非同期モードで分散テーブルに挿入することによって生成された新しいパーツを含んでいます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブルの名前。 + +- `data_path` ([String](../../sql-reference/data-types/string.md)) — ローカルファイルが格納されているフォルダへのパス。 + +- `is_blocked` ([UInt8](../../sql-reference/data-types/int-uint.md)) — ローカルファイルをサーバーに送信することがブロックされているかを示すフラグ。 + +- `error_count` ([UInt64](../../sql-reference/data-types/int-uint.md)) — エラーの回数。 + +- `data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — フォルダ内のローカルファイルの数。 + +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ローカルファイル内の圧縮データのサイズ(バイト単位)。 + +- `broken_data_files` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 壊れている(エラーがあるため)とマークされたファイルの数。 + +- `broken_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 壊れたファイル内の圧縮データのサイズ(バイト単位)。 + +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — 発生した最後のエラーに関するテキストメッセージ(もしあれば)。 + +**例** + +``` sql +SELECT * FROM system.distribution_queue LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +database: default +table: dist +data_path: ./store/268/268bc070-3aad-4b1a-9cf2-4987580161af/default@127%2E0%2E0%2E2:9000/ +is_blocked: 1 +error_count: 0 +data_files: 1 +data_compressed_bytes: 499 +last_exception: +``` + +**関連項目** + +- [分散テーブルエンジン](../../engines/table-engines/special/distributed.md) diff --git a/docs/ja/operations/system-tables/dns_cache.md b/docs/ja/operations/system-tables/dns_cache.md new file mode 100644 index 00000000000..6f82f5a3ad7 --- /dev/null +++ b/docs/ja/operations/system-tables/dns_cache.md @@ -0,0 +1,38 @@ +--- +slug: /ja/operations/system-tables/dns_cache +--- +# dns_cache + +キャッシュされたDNSレコードに関する情報を含みます。 + +カラム: + +- `hostname` ([String](../../sql-reference/data-types/string.md)) — キャッシュされたホスト名 +- `ip_address` ([String](../../sql-reference/data-types/string.md)) — ホスト名に対応するIPアドレス +- `ip_family` ([Enum](../../sql-reference/data-types/enum.md)) — IPアドレスのファミリー、可能な値: + - 'IPv4' + - 'IPv6' + - 'UNIX_LOCAL' +- `cached_at` ([DateTime](../../sql-reference/data-types/datetime.md)) - レコードがキャッシュされた日時 + +**例** + +クエリ: + +```sql +SELECT * FROM system.dns_cache; +``` + +結果: + +| hostname | ip\_address | ip\_family | cached\_at | +| :--- | :--- | :--- | :--- | +| localhost | ::1 | IPv6 | 2024-02-11 17:04:40 | +| localhost | 127.0.0.1 | IPv4 | 2024-02-11 17:04:40 | + +**関連項目** + +- [disable_internal_dns_cache 設定](../../operations/server-configuration-parameters/settings.md#disable_internal_dns_cache) +- [dns_cache_max_entries 設定](../../operations/server-configuration-parameters/settings.md#dns_cache_max_entries) +- [dns_cache_update_period 設定](../../operations/server-configuration-parameters/settings.md#dns_cache_update_period) +- [dns_max_consecutive_failures 設定](../../operations/server-configuration-parameters/settings.md#dns_max_consecutive_failures) diff --git a/docs/ja/operations/system-tables/dropped_tables.md b/docs/ja/operations/system-tables/dropped_tables.md new file mode 100644 index 00000000000..62788bbe234 --- /dev/null +++ b/docs/ja/operations/system-tables/dropped_tables.md @@ -0,0 +1,37 @@ +--- +slug: /ja/operations/system-tables/dropped_tables +--- +# dropped_tables + +このテーブルには、ドロップされたテーブルに関する情報が含まれており、実際のデータクリーンアップがまだ実施されていない状態です。 + +カラム: + +- `index` ([UInt32](../../sql-reference/data-types/int-uint.md)) — marked_dropped_tables キュー内のインデックス。 +- `database` ([String](../../sql-reference/data-types/string.md)) — データベース。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — テーブルのUUID。 +- `engine` ([String](../../sql-reference/data-types/string.md)) — テーブルエンジン名。 +- `metadata_dropped_path` ([String](../../sql-reference/data-types/string.md)) — metadata_dropped ディレクトリ内のテーブルメタデータファイルのパス。 +- `table_dropped_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 次にテーブルのデータ削除を試みる予定の時刻。通常、テーブルがドロップされた時刻に `database_atomic_delay_before_drop_table_sec` を加えたものです。 + +**例** + +以下の例は、dropped_tables についての情報を取得する方法を示しています。 + +``` sql +SELECT * +FROM system.dropped_tables\G +``` + +``` text +Row 1: +────── +index: 0 +database: default +table: test +uuid: 03141bb2-e97a-4d7c-a172-95cc066bb3bd +engine: MergeTree +metadata_dropped_path: /data/ClickHouse/build/programs/data/metadata_dropped/default.test.03141bb2-e97a-4d7c-a172-95cc066bb3bd.sql +table_dropped_time: 2023-03-16 23:43:31 +``` diff --git a/docs/ja/operations/system-tables/dropped_tables_parts.md b/docs/ja/operations/system-tables/dropped_tables_parts.md new file mode 100644 index 00000000000..7f5b1253ca9 --- /dev/null +++ b/docs/ja/operations/system-tables/dropped_tables_parts.md @@ -0,0 +1,14 @@ +--- +slug: /ja/operations/system-tables/dropped_tables_parts +--- +# dropped_tables_parts {#system_tables-dropped_tables_parts} + +[system.dropped_tables](./dropped_tables.md) から削除された [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのパーツに関する情報を含んでいます。 + +このテーブルのスキーマは [system.parts](./parts.md) と同じです。 + +**関連項目** + +- [MergeTree ファミリー](../../engines/table-engines/mergetree-family/mergetree.md) +- [system.parts](./parts.md) +- [system.dropped_tables](./dropped_tables.md) diff --git a/docs/ja/operations/system-tables/enabled-roles.md b/docs/ja/operations/system-tables/enabled-roles.md new file mode 100644 index 00000000000..8941d13980a --- /dev/null +++ b/docs/ja/operations/system-tables/enabled-roles.md @@ -0,0 +1,13 @@ +--- +slug: /ja/operations/system-tables/enabled-roles +--- +# enabled_roles + +現在アクティブなすべてのロールを含み、現在のユーザーの現在のロールやそのロールに対して付与されたロールも含まれます。 + +カラム: + +- `role_name` ([String](../../sql-reference/data-types/string.md)) — ロール名。 +- `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `enabled_role` が `ADMIN OPTION` 特権を持つロールかどうかを示すフラグ。 +- `is_current` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `enabled_role` が現在のユーザーの現在のロールかどうかを示すフラグ。 +- `is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `enabled_role` がデフォルトのロールかどうかを示すフラグ。 diff --git a/docs/ja/operations/system-tables/error_log.md b/docs/ja/operations/system-tables/error_log.md new file mode 100644 index 00000000000..24f18380b8d --- /dev/null +++ b/docs/ja/operations/system-tables/error_log.md @@ -0,0 +1,39 @@ +--- +slug: /ja/operations/system-tables/error_log +--- +# error_log + +`system.errors`テーブルから得られるエラー値の履歴を保持しており、一定間隔でディスクに書き出されます。 + +カラム: +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行したサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `code` ([Int32](../../sql-reference/data-types/int-uint.md)) — エラーのコード番号。 +- `error` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) - エラーの名称。 +- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — このエラーが発生した回数。 +- `remote` ([UInt8](../../sql-reference/data-types/int-uint.md)) — リモート例外(すなわち、分散クエリの一つで受け取られたもの)。 + +**例** + +``` sql +SELECT * FROM system.error_log LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2024-06-18 +event_time: 2024-06-18 07:32:39 +code: 999 +error: KEEPER_EXCEPTION +value: 2 +remote: 0 +``` + +**関連項目** + +- [error_log 設定](../../operations/server-configuration-parameters/settings.md#error_log) — 設定の有効化および無効化について。 +- [system.errors](../../operations/system-tables/errors.md) — エラーコードとそれがトリガーされた回数を含む。 +- [監視](../../operations/monitoring.md) — ClickHouseの監視の基本概念。 diff --git a/docs/ja/operations/system-tables/errors.md b/docs/ja/operations/system-tables/errors.md new file mode 100644 index 00000000000..55907d04302 --- /dev/null +++ b/docs/ja/operations/system-tables/errors.md @@ -0,0 +1,42 @@ +--- +slug: /ja/operations/system-tables/errors +--- +# errors + +エラーコードとその発生回数を含みます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — エラーの名前 (`errorCodeToName`)。 +- `code` ([Int32](../../sql-reference/data-types/int-uint.md)) — エラーのコード番号。 +- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — このエラーが発生した回数。 +- `last_error_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 最後にエラーが発生した時刻。 +- `last_error_message` ([String](../../sql-reference/data-types/string.md)) — 最後のエラーメッセージ。 +- `last_error_trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — 呼び出されたメソッドが保存されている物理アドレスのリストを表す[スタックトレース](https://en.wikipedia.org/wiki/Stack_trace)。 +- `remote` ([UInt8](../../sql-reference/data-types/int-uint.md)) — リモート例外(すなわち、分散クエリの一つで受け取られたもの)。 + +:::note +いくつかのエラーのカウンターは、クエリが正常に実行された場合でも増加することがあります。該当するエラーが誤検知でないと確信しない限り、このテーブルをサーバー監視の目的で使用することは推奨されません。 +::: + +**例** + +``` sql +SELECT name, code, value +FROM system.errors +WHERE value > 0 +ORDER BY code ASC +LIMIT 1 + +┌─name─────────────┬─code─┬─value─┐ +│ CANNOT_OPEN_FILE │ 76 │ 1 │ +└──────────────────┴──────┴───────┘ +``` + +``` sql +WITH arrayMap(x -> demangle(addressToSymbol(x)), last_error_trace) AS all +SELECT name, arrayStringConcat(all, '\n') AS res +FROM system.errors +LIMIT 1 +SETTINGS allow_introspection_functions=1\G +``` diff --git a/docs/ja/operations/system-tables/events.md b/docs/ja/operations/system-tables/events.md new file mode 100644 index 00000000000..a3f95611133 --- /dev/null +++ b/docs/ja/operations/system-tables/events.md @@ -0,0 +1,38 @@ +--- +slug: /ja/operations/system-tables/events +--- +# events + +システムで発生したイベントの数に関する情報を含んでいます。例えば、このテーブルでは、ClickHouseサーバーが起動してから処理された`SELECT`クエリの数を確認できます。 + +カラム: + +- `event` ([String](../../sql-reference/data-types/string.md)) — イベント名。 +- `value` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 発生したイベントの数。 +- `description` ([String](../../sql-reference/data-types/string.md)) — イベントの説明。 +- `name` ([String](../../sql-reference/data-types/string.md)) — `event`の別名。 + +サポートされているすべてのイベントはソースファイル [src/Common/ProfileEvents.cpp](https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/ProfileEvents.cpp) で確認できます。 + +**例** + +``` sql +SELECT * FROM system.events LIMIT 5 +``` + +``` text +┌─event─────────────────────────────────┬─value─┬─description────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Query │ 12 │ クエリを解釈し、実行される可能性のあるクエリの数。パースに失敗したクエリや、ASTサイズ制限、クォータ制限、同時実行クエリ数の制限により拒否されたクエリは含まれません。ClickHouse自身によって開始された内部クエリを含む場合があります。サブクエリはカウントされません。 │ +│ SelectQuery │ 8 │ Queryと同じですが、SELECTクエリのみです。 │ +│ FileOpen │ 73 │ 開かれたファイルの数。 │ +│ ReadBufferFromFileDescriptorRead │ 155 │ ファイルディスクリプタからの読み込み(read/pread)の数。ソケットは含まれません。 │ +│ ReadBufferFromFileDescriptorReadBytes │ 9931 │ ファイルディスクリプタから読み取られたバイト数。ファイルが圧縮されている場合、これは圧縮データサイズを示します。 │ +└───────────────────────────────────────┴───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — 定期的に計算されるメトリクスを含んでいます。 +- [system.metrics](../../operations/system-tables/metrics.md#system_tables-metrics) — 瞬時に計算されるメトリクスを含んでいます。 +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — テーブル `system.metrics` と `system.events` のメトリクス値の履歴を含んでいます。 +- [Monitoring](../../operations/monitoring.md) — ClickHouseモニタリングの基本概念。 diff --git a/docs/ja/operations/system-tables/functions.md b/docs/ja/operations/system-tables/functions.md new file mode 100644 index 00000000000..912fae37616 --- /dev/null +++ b/docs/ja/operations/system-tables/functions.md @@ -0,0 +1,39 @@ +--- +slug: /ja/operations/system-tables/functions +--- +# functions + +通常の関数と集計関数に関する情報を含んでいます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) – 関数の名前。 +- `is_aggregate` ([UInt8](../../sql-reference/data-types/int-uint.md)) — 関数が集計関数であるかどうか。 +- `case_insensitive`, ([UInt8](../../sql-reference/data-types/int-uint.md)) - 関数名が大文字小文字を区別せずに使用できるかどうか。 +- `alias_to`, ([String](../../sql-reference/data-types/string.md)) - 関数名がエイリアスである場合の元の関数名。 +- `create_query`, ([String](../../sql-reference/data-types/enum.md)) - 未使用。 +- `origin`, ([Enum8](../../sql-reference/data-types/string.md)) - 未使用。 +- `description`, ([String](../../sql-reference/data-types/string.md)) - 関数が何をするかの高レベルな説明。 +- `syntax`, ([String](../../sql-reference/data-types/string.md)) - 関数のシグネチャ。 +- `arguments`, ([String](../../sql-reference/data-types/string.md)) - 関数が取る引数。 +- `returned_value`, ([String](../../sql-reference/data-types/string.md)) - 関数が返す値。 +- `examples`, ([String](../../sql-reference/data-types/string.md)) - 関数の使用例。 +- `categories`, ([String](../../sql-reference/data-types/string.md)) - 関数のカテゴリー。 + +**例** + +```sql + SELECT name, is_aggregate, is_deterministic, case_insensitive, alias_to FROM system.functions LIMIT 5; +``` + +```text +┌─name─────────────────────┬─is_aggregate─┬─is_deterministic─┬─case_insensitive─┬─alias_to─┐ +│ BLAKE3 │ 0 │ 1 │ 0 │ │ +│ sipHash128Reference │ 0 │ 1 │ 0 │ │ +│ mapExtractKeyLike │ 0 │ 1 │ 0 │ │ +│ sipHash128ReferenceKeyed │ 0 │ 1 │ 0 │ │ +│ mapPartialSort │ 0 │ 1 │ 0 │ │ +└──────────────────────────┴──────────────┴──────────────────┴──────────────────┴──────────┘ + +5 rows in set. Elapsed: 0.002 sec. +``` diff --git a/docs/ja/operations/system-tables/grants.md b/docs/ja/operations/system-tables/grants.md new file mode 100644 index 00000000000..600399f7894 --- /dev/null +++ b/docs/ja/operations/system-tables/grants.md @@ -0,0 +1,25 @@ +--- +slug: /ja/operations/system-tables/grants +--- +# grants + +ClickHouseユーザーアカウントに付与された特権。 + +カラム: +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ユーザー名。 + +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ユーザーアカウントに割り当てられたロール。 + +- `access_type` ([Enum8](../../sql-reference/data-types/enum.md)) — ClickHouseユーザーアカウントのアクセスパラメーター。 + +- `database` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — データベースの名前。 + +- `table` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — テーブルの名前。 + +- `column` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — アクセスが許可されたカラムの名前。 + +- `is_partial_revoke` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 論理値。いくつかの特権が取り消されたかどうかを示します。可能な値: +- `0` — 行は付与を示します。 +- `1` — 行は部分的な取り消しを示します。 + +- `grant_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `WITH GRANT OPTION`とともに許可が付与されていることを示します。[GRANT](../../sql-reference/statements/grant.md#granting-privilege-syntax)を参照してください。 diff --git a/docs/ja/operations/system-tables/graphite_retentions.md b/docs/ja/operations/system-tables/graphite_retentions.md new file mode 100644 index 00000000000..3d0b89ffffd --- /dev/null +++ b/docs/ja/operations/system-tables/graphite_retentions.md @@ -0,0 +1,18 @@ +--- +slug: /ja/operations/system-tables/graphite_retentions +--- +# graphite_retentions + +[graphite_rollup](../../operations/server-configuration-parameters/settings.md#graphite)パラメータの情報を含んでおり、[\*GraphiteMergeTree](../../engines/table-engines/mergetree-family/graphitemergetree.md)エンジンを使用したテーブルで利用されます。 + +カラム: + +- `config_name` (String) - `graphite_rollup`パラメータ名。 +- `regexp` (String) - メトリック名のパターン。 +- `function` (String) - 集約関数の名前。 +- `age` (UInt64) - データが存在する最低年齢(秒単位)。 +- `precision` (UInt64) - データの年齢を秒単位でどれだけ正確に定義するか。 +- `priority` (UInt16) - パターンの優先度。 +- `is_default` (UInt8) - パターンがデフォルトであるかどうか。 +- `Tables.database` (Array(String)) - `config_name`パラメータを使用するデータベーステーブルの名前の配列。 +- `Tables.table` (Array(String)) - `config_name`パラメータを使用するテーブル名の配列。 diff --git a/docs/ja/operations/system-tables/index.md b/docs/ja/operations/system-tables/index.md new file mode 100644 index 00000000000..52cc94c0470 --- /dev/null +++ b/docs/ja/operations/system-tables/index.md @@ -0,0 +1,90 @@ +--- +slug: /ja/operations/system-tables/ +sidebar_position: 52 +sidebar_label: 概要 +pagination_next: 'en/operations/system-tables/asynchronous_metric_log' +--- + +# システムテーブル + +## はじめに {#system-tables-introduction} + +システムテーブルは次の情報を提供します: + +- サーバーの状態、プロセス、環境。 +- サーバーの内部プロセス。 +- ClickHouseバイナリがビルドされたときのオプション。 + +システムテーブル: + +- `system`データベースに配置されています。 +- データの読み取り専用で利用可能です。 +- 削除や変更はできませんが、デタッチすることは可能です。 + +ほとんどのシステムテーブルはそのデータをRAMに保存します。ClickHouseサーバーは起動時にそのようなシステムテーブルを作成します。 + +他のシステムテーブルとは異なり、システムログテーブルである[metric_log](../../operations/system-tables/metric_log.md)、[query_log](../../operations/system-tables/query_log.md)、[query_thread_log](../../operations/system-tables/query_thread_log.md)、[trace_log](../../operations/system-tables/trace_log.md)、[part_log](../../operations/system-tables/part_log.md)、[crash_log](../../operations/system-tables/crash-log.md)、[text_log](../../operations/system-tables/text_log.md)、[backup_log](../../operations/system-tables/backup_log.md)は、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)テーブルエンジンによって提供され、デフォルトでデータをファイルシステムに保存します。ファイルシステムからテーブルを削除すると、次回のデータ書き込み時にClickHouseサーバーが新しい空のテーブルを再作成します。新しいリリースでシステムテーブルのスキーマが変更された場合、ClickHouseは現在のテーブルの名前を変更し、新しいものを作成します。 + +システムログテーブルは、`/etc/clickhouse-server/config.d/`にテーブルと同じ名前の構成ファイルを作成するか、`/etc/clickhouse-server/config.xml`に対応する要素を設定することでカスタマイズできます。カスタマイズ可能な要素は次のとおりです: + +- `database`: システムログテーブルが属するデータベース。このオプションは現在非推奨です。すべてのシステムログテーブルは `system` データベースにあります。 +- `table`: データを挿入するテーブル。 +- `partition_by`: [PARTITION BY](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)式を指定します。 +- `ttl`: テーブルの[有効期限 (TTL)](../../sql-reference/statements/alter/ttl.md)式を指定します。 +- `flush_interval_milliseconds`: ディスクへのデータフラッシュの間隔を設定します。 +- `engine`: パラメータを含む完全なエンジン式(`ENGINE =` から始まる)を指定します。このオプションは `partition_by` および `ttl` と衝突します。両方が設定されている場合、サーバーは例外を発生させて終了します。 + +例: + +```xml + + + system + query_log
    + toYYYYMM(event_date) + event_date + INTERVAL 30 DAY DELETE + + 7500 + 1048576 + 8192 + 524288 + false +
    +
    +``` + +デフォルトでは、テーブルの成長は無制限です。テーブルのサイズを制御するには、古いログレコードを削除するために[TTL](../../sql-reference/statements/alter/ttl.md#manipulations-with-table-ttl)設定を使用できます。また、`MergeTree` エンジンテーブルのパーティショニング機能を使用することもできます。 + +## システムメトリックの情報源 {#system-tables-sources-of-system-metrics} + +システムメトリックを収集するためにClickHouseサーバーは次を使用します: + +- `CAP_NET_ADMIN`の権限。 +- [procfs](https://en.wikipedia.org/wiki/Procfs)(Linuxのみ)。 + +**procfs** + +ClickHouseサーバーが`CAP_NET_ADMIN`の権限を持っていない場合、`ProcfsMetricsProvider`にフォールバックしようとします。`ProcfsMetricsProvider`は、CPUおよびI/Oのクエリごとのシステムメトリックを収集します。 + +システムでprocfsがサポートされ、有効化されている場合、ClickHouseサーバーはこれらのメトリックを収集します: + +- `OSCPUVirtualTimeMicroseconds` +- `OSCPUWaitMicroseconds` +- `OSIOWaitMicroseconds` +- `OSReadChars` +- `OSWriteChars` +- `OSReadBytes` +- `OSWriteBytes` + +:::note +Linuxカーネルの5.14.x以降では、`OSIOWaitMicroseconds`はデフォルトで無効です。 +`sudo sysctl kernel.task_delayacct=1`を使用するか、`/etc/sysctl.d/`内に`.conf`ファイルを作成し、`kernel.task_delayacct = 1`と設定して有効にできます。 +::: + +## 関連コンテンツ + +- ブログ: [ClickHouseの内部を視覚化するシステムテーブル](https://clickhouse.com/blog/clickhouse-debugging-issues-with-system-tables) +- ブログ: [重要な監視クエリ - パート1 - INSERTクエリ](https://clickhouse.com/blog/monitoring-troubleshooting-insert-queries-clickhouse) +- ブログ: [重要な監視クエリ - パート2 - SELECTクエリ](https://clickhouse.com/blog/monitoring-troubleshooting-select-queries-clickhouse) diff --git a/docs/ja/operations/system-tables/information_schema.md b/docs/ja/operations/system-tables/information_schema.md new file mode 100644 index 00000000000..91155be116d --- /dev/null +++ b/docs/ja/operations/system-tables/information_schema.md @@ -0,0 +1,400 @@ +--- +slug: /ja/operations/system-tables/information_schema +--- +# INFORMATION_SCHEMA + +`INFORMATION_SCHEMA`(または`information_schema`)は、データベースオブジェクトのメタデータに関する(多少)標準化された[DBMSに依存しないビュー](https://en.wikipedia.org/wiki/Information_schema)を提供するシステムデータベースです。`INFORMATION_SCHEMA`のビューは通常のシステムテーブルに比べて性能が劣ることがありますが、ツールはこれを使用して複数のDBMSにまたがって基本情報を取得することができます。`INFORMATION_SCHEMA`内のビューの構造と内容は後方互換性を持ちながら進化することが想定されており、新しい機能が追加されるだけで、既存の機能は変更されたり削除されたりしません。内部実装に関しては、`INFORMATION_SCHEMA`内のビューは通常、[system.columns](../../operations/system-tables/columns.md)、[system.databases](../../operations/system-tables/databases.md)、そして[system.tables](../../operations/system-tables/tables.md)のような通常のシステムテーブルにマッピングされます。 + +``` sql +SHOW TABLES FROM INFORMATION_SCHEMA; + +-- または: +SHOW TABLES FROM information_schema; +``` + +``` text +┌─name────────────────────┐ +│ COLUMNS │ +│ KEY_COLUMN_USAGE │ +│ REFERENTIAL_CONSTRAINTS │ +│ SCHEMATA │ +| STATISTICS | +│ TABLES │ +│ VIEWS │ +│ columns │ +│ key_column_usage │ +│ referential_constraints │ +│ schemata │ +| statistics | +│ tables │ +│ views │ +└─────────────────────────┘ +``` + +`INFORMATION_SCHEMA`には以下のビューが含まれます: + +- [COLUMNS](#columns) +- [KEY_COLUMN_USAGE](#key_column_usage) +- [REFERENTIAL_CONSTRAINTS](#referential_constraints) +- [SCHEMATA](#schemata) +- [STATISTICS](#statistics) +- [TABLES](#tables) +- [VIEWS](#views) + +互換性のため、大文字と小文字を区別しない等価なビュー、例:`INFORMATION_SCHEMA.columns`が提供されています。このことは、これらのビュー内のすべてのカラムにも当てはまり、小文字(例:`table_name`)と大文字(例:`TABLE_NAME`)のバリエーションが提供されています。 + +## COLUMNS {#columns} + +[system.columns](../../operations/system-tables/columns.md)システムテーブルから読み取ったカラムと、ClickHouseでサポートされていないか、意味をなさない(常に`NULL`)が、標準によって必要なカラムを含みます。 + +カラム: + +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `column_name` ([String](../../sql-reference/data-types/string.md)) — カラム名。 +- `ordinal_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — カラムがテーブル内で何番目にあるかを示す位置。1から始まります。 +- `column_default` ([String](../../sql-reference/data-types/string.md)) — デフォルト値の式、または定義されていない場合は空文字列。 +- `is_nullable` ([UInt8](../../sql-reference/data-types/int-uint.md)) — カラムタイプが`Nullable`かどうかを示すフラグ。 +- `data_type` ([String](../../sql-reference/data-types/string.md)) — カラムタイプ。 +- `character_maximum_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — バイナリデータ、文字データ、またはテキストデータおよび画像の最大長(バイト)。ClickHouseでは`FixedString`データタイプにのみ意味を持ちます。それ以外の場合は`NULL`が返されます。 +- `character_octet_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — バイナリデータ、文字データ、またはテキストデータおよび画像の最大長(バイト)。ClickHouseでは`FixedString`データタイプにのみ意味を持ちます。それ以外の場合は`NULL`が返されます。 +- `numeric_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似的または正確な数値データ、整数データ、または金額データの精度。ClickHouseでは整数型のビット幅および`Decimal`型の精度。その他の場合は`NULL`が返されます。 +- `numeric_precision_radix` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似的または正確な数値データ、整数データまたは金額データの精度の基。ClickHouseでは整数型の基が2、`Decimal`型の基が10です。その他の場合は`NULL`が返されます。 +- `numeric_scale` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 近似的または正確な数値データ、整数データ、または金額データのスケール。ClickHouseでは`Decimal`型にのみ意味があります。それ以外の場合は`NULL`が返されます。 +- `datetime_precision` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — `DateTime64`データタイプの小数の精度。その他のデータタイプの場合は`NULL`が返されます。 +- `character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `collation_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `collation_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `collation_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `domain_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `domain_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `domain_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `extra` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `MATERIALIZED`型カラムの場合は`STORED GENERATED`、`ALIAS`型カラムの場合は`VIRTUAL GENERATED`、`DEFAULT`型カラムの場合は`DEFAULT_GENERATED`、または`NULL`。 + +**例** + +クエリ: + +``` sql +SELECT table_catalog, + table_schema, + table_name, + column_name, + ordinal_position, + column_default, + is_nullable, + data_type, + character_maximum_length, + character_octet_length, + numeric_precision, + numeric_precision_radix, + numeric_scale, + datetime_precision, + character_set_catalog, + character_set_schema, + character_set_name, + collation_catalog, + collation_schema, + collation_name, + domain_catalog, + domain_schema, + domain_name, + column_comment, + column_type +FROM INFORMATION_SCHEMA.COLUMNS +WHERE (table_schema = currentDatabase() OR table_schema = '') + AND table_name NOT LIKE '%inner%' +LIMIT 1 +FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +table_catalog: default +table_schema: default +table_name: describe_example +column_name: id +ordinal_position: 1 +column_default: +is_nullable: 0 +data_type: UInt64 +character_maximum_length: ᴺᵁᴸᴸ +character_octet_length: ᴺᵁᴸᴸ +numeric_precision: 64 +numeric_precision_radix: 2 +numeric_scale: 0 +datetime_precision: ᴺᵁᴸᴸ +character_set_catalog: ᴺᵁᴸᴸ +character_set_schema: ᴺᵁᴸᴸ +character_set_name: ᴺᵁᴸᴸ +collation_catalog: ᴺᵁᴸᴸ +collation_schema: ᴺᵁᴸᴸ +collation_name: ᴺᵁᴸᴸ +domain_catalog: ᴺᵁᴸᴸ +domain_schema: ᴺᵁᴸᴸ +domain_name: ᴺᵁᴸᴸ +``` + +## SCHEMATA {#schemata} + +[system.databases](../../operations/system-tables/databases.md)システムテーブルから読み取ったカラムを含み、ClickHouseでサポートされていないか、意味をなさない(常に`NULL`)が標準によって必要なカラムを含みます。 + +カラム: + +- `catalog_name` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 +- `schema_name` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 +- `schema_owner` ([String](../../sql-reference/data-types/string.md)) — スキーマの所有者名。常に`'default'`。 +- `default_character_set_catalog` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `default_character_set_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `default_character_set_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 +- `sql_path` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — `NULL`、サポートされていません。 + +**例** + +クエリ: + +``` sql +SELECT catalog_name, + schema_name, + schema_owner, + default_character_set_catalog, + default_character_set_schema, + default_character_set_name, + sql_path +FROM information_schema.schemata +WHERE schema_name ilike 'information_schema' +LIMIT 1 +FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +catalog_name: INFORMATION_SCHEMA +schema_name: INFORMATION_SCHEMA +schema_owner: default +default_character_set_catalog: ᴺᵁᴸᴸ +default_character_set_schema: ᴺᵁᴸᴸ +default_character_set_name: ᴺᵁᴸᴸ +sql_path: ᴺᵁᴸᴸ +``` + +## TABLES {#tables} + +[system.tables](../../operations/system-tables/tables.md)システムテーブルから読み取ったカラムを含みます。 + +カラム: + +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `table_type` ([String](../../sql-reference/data-types/string.md)) — テーブルタイプ。可能な値: + - `BASE TABLE` + - `VIEW` + - `FOREIGN TABLE` + - `LOCAL TEMPORARY` + - `SYSTEM VIEW` +- `table_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 行の総数。NULLの場合、決定できなかったことを示します。 +- `data_length` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — ディスク上にデータのサイズ。NULLの場合、決定できなかったことを示します。 +- `table_collation` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — テーブルのデフォルト照合順序。常に`utf8mb4_0900_ai_ci`。 +- `table_comment` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — テーブル作成時に使用されたコメント。 + +**例** + +クエリ: + +``` sql +SELECT table_catalog, + table_schema, + table_name, + table_type, + table_collation, + table_comment +FROM INFORMATION_SCHEMA.TABLES +WHERE (table_schema = currentDatabase() OR table_schema = '') + AND table_name NOT LIKE '%inner%' +LIMIT 1 +FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +table_catalog: default +table_schema: default +table_name: describe_example +table_type: BASE TABLE +table_collation: utf8mb4_0900_ai_ci +table_comment: +``` + +## VIEWS {#views} + +[system.tables](../../operations/system-tables/tables.md)システムテーブルから読み取ったカラムで、テーブルエンジン[View](../../engines/table-engines/special/view.md)が使用されている場合。 + +カラム: + +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `view_definition` ([String](../../sql-reference/data-types/string.md)) — ビューの`SELECT`クエリ。 +- `check_option` ([String](../../sql-reference/data-types/string.md)) — `NONE`、チェックなし。 +- `is_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`、ビューは更新されません。 +- `is_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — 作成されたビューが[マテリアライズド](../../sql-reference/statements/create/view.md/#materialized-view)かどうかを示します。可能な値: + - `NO` — 作成されたビューはマテリアライズドではありません。 + - `YES` — 作成されたビューはマテリアライズドです。 +- `is_trigger_updatable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`、トリガーは更新されません。 +- `is_trigger_deletable` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`、トリガーは削除されません。 +- `is_trigger_insertable_into` ([Enum8](../../sql-reference/data-types/enum.md)) — `NO`、トリガーにデータは挿入されません。 + +**例** + +クエリ: + +``` sql +CREATE VIEW v (n Nullable(Int32), f Float64) AS SELECT n, f FROM t; +CREATE MATERIALIZED VIEW mv ENGINE = Null AS SELECT * FROM system.one; +SELECT table_catalog, + table_schema, + table_name, + view_definition, + check_option, + is_updatable, + is_insertable_into, + is_trigger_updatable, + is_trigger_deletable, + is_trigger_insertable_into +FROM information_schema.views +WHERE table_schema = currentDatabase() +LIMIT 1 +FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +table_catalog: default +table_schema: default +table_name: mv +view_definition: SELECT * FROM system.one +check_option: NONE +is_updatable: NO +is_insertable_into: YES +is_trigger_updatable: NO +is_trigger_deletable: NO +is_trigger_insertable_into: NO +``` + +## KEY_COLUMN_USAGE {#key_column_usage} + +制約により制限された[system.tables](../../operations/system-tables/tables.md)システムテーブルからのカラムを含みます。 + +カラム: + +- `constraint_catalog` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。常に`def`。 +- `constraint_schema` ([String](../../sql-reference/data-types/string.md)) — 制約が属するスキーマ(データベース)の名前。 +- `constraint_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 制約の名前。 +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。常に`def`。 +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — テーブルが属するスキーマ(データベース)の名前。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — 制約を持つテーブルの名前。 +- `column_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 制約を持つカラムの名前。 +- `ordinal_position` ([UInt32](../../sql-reference/data-types/int-uint.md)) — 現在は未使用。常に`1`。 +- `position_in_unique_constraint` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt32](../../sql-reference/data-types/int-uint.md))) — 現在は未使用。常に`NULL`。 +- `referenced_table_schema` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。常にNULL。 +- `referenced_table_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。常にNULL。 +- `referenced_column_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。常にNULL。 + +**例** + +```sql +CREATE TABLE test (i UInt32, s String) ENGINE MergeTree ORDER BY i; +SELECT constraint_catalog, + constraint_schema, + constraint_name, + table_catalog, + table_schema, + table_name, + column_name, + ordinal_position, + position_in_unique_constraint, + referenced_table_schema, + referenced_table_name, + referenced_column_name +FROM information_schema.key_column_usage +WHERE table_name = 'test' +FORMAT Vertical; +``` + +結果: + +``` +Row 1: +────── +constraint_catalog: def +constraint_schema: default +constraint_name: PRIMARY +table_catalog: def +table_schema: default +table_name: test +column_name: i +ordinal_position: 1 +position_in_unique_constraint: ᴺᵁᴸᴸ +referenced_table_schema: ᴺᵁᴸᴸ +referenced_table_name: ᴺᵁᴸᴸ +referenced_column_name: ᴺᵁᴸᴸ +``` + +## REFERENTIAL_CONSTRAINTS {#referential_constraints} + +外部キーに関する情報を含みます。現在、外部ツール(例:Tableau Online)との互換性を提供するのに十分な空の結果(行なし)を返します。 + +カラム: + +- `constraint_catalog` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `constraint_schema` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `constraint_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `unique_constraint_catalog` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `unique_constraint_schema` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `unique_constraint_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `match_option` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `update_rule` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `delete_rule` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `referenced_table_name` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 + +## STATISTICS {#statistics} + +テーブルのインデックスに関する情報を提供します。現在は、外部ツール(例:Tableau Online)との互換性を提供するのに十分な空の結果(行なし)を返します。 + +カラム: + +- `table_catalog` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `table_schema` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `table_name` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `non_unique` ([Int32](../../sql-reference/data-types/int-uint.md)) — 現在は未使用。 +- `index_schema` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `index_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `seq_in_index` ([UInt32](../../sql-reference/data-types/int-uint.md)) — 現在は未使用。 +- `column_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `collation` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `cardinality` ([Nullable](../../sql-reference/data-types/nullable.md)([Int64](../../sql-reference/data-types/int-uint.md))) — 現在は未使用。 +- `sub_part` ([Nullable](../../sql-reference/data-types/nullable.md)([Int64](../../sql-reference/data-types/int-uint.md))) — 現在は未使用。 +- `packed` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 +- `nullable` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `index_type` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `comment` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `index_comment` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `is_visible` ([String](../../sql-reference/data-types/string.md)) — 現在は未使用。 +- `expression` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 現在は未使用。 diff --git a/docs/ja/operations/system-tables/jemalloc_bins.md b/docs/ja/operations/system-tables/jemalloc_bins.md new file mode 100644 index 00000000000..747c6c83824 --- /dev/null +++ b/docs/ja/operations/system-tables/jemalloc_bins.md @@ -0,0 +1,44 @@ +--- +slug: /ja/operations/system-tables/jemalloc_bins +--- +# jemalloc_bins + +これは、jemalloc アロケーターによるさまざまなサイズクラス (ビン) でのメモリアロケーションに関する情報を、すべてのアリーナから集計したものを含んでいます。これらの統計情報は、jemalloc におけるスレッドローカルキャッシュのため、必ずしも完全に正確ではない可能性があります。 + +カラム: + +- `index` (UInt64) — サイズ順に並べられたビンのインデックス +- `large` (Bool) — 大きなアロケーションの場合は True、小さな場合は False +- `size` (UInt64) — このビンのアロケーションサイズ +- `allocations` (UInt64) — アロケーションの数 +- `deallocations` (UInt64) — デアロケーションの数 + +**例** + +現在の全体的なメモリ使用量に最も貢献しているアロケーションサイズを見つける。 + +``` sql +SELECT + *, + allocations - deallocations AS active_allocations, + size * active_allocations AS allocated_bytes +FROM system.jemalloc_bins +WHERE allocated_bytes > 0 +ORDER BY allocated_bytes DESC +LIMIT 10 +``` + +``` text +┌─index─┬─large─┬─────size─┬─allocactions─┬─deallocations─┬─active_allocations─┬─allocated_bytes─┐ +│ 82 │ 1 │ 50331648 │ 1 │ 0 │ 1 │ 50331648 │ +│ 10 │ 0 │ 192 │ 512336 │ 370710 │ 141626 │ 27192192 │ +│ 69 │ 1 │ 5242880 │ 6 │ 2 │ 4 │ 20971520 │ +│ 3 │ 0 │ 48 │ 16938224 │ 16559484 │ 378740 │ 18179520 │ +│ 28 │ 0 │ 4096 │ 122924 │ 119142 │ 3782 │ 15491072 │ +│ 61 │ 1 │ 1310720 │ 44569 │ 44558 │ 11 │ 14417920 │ +│ 39 │ 1 │ 28672 │ 1285 │ 913 │ 372 │ 10665984 │ +│ 4 │ 0 │ 64 │ 2837225 │ 2680568 │ 156657 │ 10026048 │ +│ 6 │ 0 │ 96 │ 2617803 │ 2531435 │ 86368 │ 8291328 │ +│ 36 │ 1 │ 16384 │ 22431 │ 21970 │ 461 │ 7553024 │ +└───────┴───────┴──────────┴──────────────┴───────────────┴────────────────────┴─────────────────┘ +``` diff --git a/docs/ja/operations/system-tables/kafka_consumers.md b/docs/ja/operations/system-tables/kafka_consumers.md new file mode 100644 index 00000000000..d30b3455273 --- /dev/null +++ b/docs/ja/operations/system-tables/kafka_consumers.md @@ -0,0 +1,59 @@ +--- +slug: /ja/operations/system-tables/kafka_consumers +--- +# kafka_consumers + +Kafkaコンシューマに関する情報を含んでいます。 +[Kafkaテーブルエンジン](../../engines/table-engines/integrations/kafka)(ネイティブClickHouse統合)に適用されます。 + +カラム: + +- `database` (String) - Kafkaエンジンを持つテーブルのデータベース。 +- `table` (String) - Kafkaエンジンを持つテーブルの名前。 +- `consumer_id` (String) - Kafkaコンシューマの識別子。テーブルには多くのコンシューマが存在する可能性があります。`kafka_num_consumers`パラメータで指定されます。 +- `assignments.topic` (Array(String)) - Kafkaトピック。 +- `assignments.partition_id` (Array(Int32)) - KafkaのパーティションID。なお、パーティションには1つのコンシューマしか割り当てられません。 +- `assignments.current_offset` (Array(Int64)) - 現在のオフセット。 +- `exceptions.time` (Array(DateTime)) - 最近10件の例外が発生したタイムスタンプ。 +- `exceptions.text` (Array(String)) - 最近10件の例外のテキスト。 +- `last_poll_time` (DateTime) - 最近のポーリングのタイムスタンプ。 +- `num_messages_read` (UInt64) - コンシューマによって読み取られたメッセージの数。 +- `last_commit_time` (DateTime) - 最近のポーリングのタイムスタンプ。 +- `num_commits` (UInt64) - コンシューマのコミットの総数。 +- `last_rebalance_time` (DateTime) - 最近のKafkaリバランスのタイムスタンプ。 +- `num_rebalance_revocations` (UInt64) - コンシューマからパーティションが取り消された回数。 +- `num_rebalance_assignments` (UInt64) - コンシューマがKafkaクラスターに割り当てられた回数。 +- `is_currently_used` (UInt8) - コンシューマが使用中かどうか。 +- `last_used` (UInt64) - このコンシューマが最後に使用された時間、マイクロ秒でのUnix時間。 +- `rdkafka_stat` (String) - ライブラリ内部の統計情報。詳しくはhttps://github.com/ClickHouse/librdkafka/blob/master/STATISTICS.md を参照してください。`statistics_interval_ms`を0に設定すると無効になり、デフォルトは3000(3秒ごとに1回)です。 + +例: + +``` sql +SELECT * +FROM system.kafka_consumers +FORMAT Vertical +``` + +``` text +行 1: +────── +database: test +table: kafka +consumer_id: ClickHouse-instance-test-kafka-1caddc7f-f917-4bb1-ac55-e28bd103a4a0 +assignments.topic: ['system_kafka_cons'] +assignments.partition_id: [0] +assignments.current_offset: [18446744073709550615] +exceptions.time: [] +exceptions.text: [] +last_poll_time: 2006-11-09 18:47:47 +num_messages_read: 4 +last_commit_time: 2006-11-10 04:39:40 +num_commits: 1 +last_rebalance_time: 1970-01-01 00:00:00 +num_rebalance_revocations: 0 +num_rebalance_assignments: 1 +is_currently_used: 1 +rdkafka_stat: {...} + +``` diff --git a/docs/ja/operations/system-tables/licenses.md b/docs/ja/operations/system-tables/licenses.md new file mode 100644 index 00000000000..8faaeb3164b --- /dev/null +++ b/docs/ja/operations/system-tables/licenses.md @@ -0,0 +1,29 @@ +--- +slug: /ja/operations/system-tables/licenses +--- +# licenses + +ClickHouseソースの[contrib](https://github.com/ClickHouse/ClickHouse/tree/master/contrib)ディレクトリにあるサードパーティライブラリのライセンスを含みます。 + +カラム: + +- `library_name` ([String](../../sql-reference/data-types/string.md)) — ライセンスが関連しているライブラリの名前。 +- `license_type` ([String](../../sql-reference/data-types/string.md)) — ライセンスタイプ — 例えば、Apache、MITなど。 +- `license_path` ([String](../../sql-reference/data-types/string.md)) — ライセンステキストが含まれているファイルへのパス。 +- `license_text` ([String](../../sql-reference/data-types/string.md)) — ライセンステキスト。 + +**例** + +``` sql +SELECT library_name, license_type, license_path FROM system.licenses LIMIT 15 +``` + +``` text +┌─library_name───────┬─license_type─┬─license_path────────────────────────┐ +│ aws-c-common │ Apache │ /contrib/aws-c-common/LICENSE │ +│ base64 │ BSD 2-clause │ /contrib/aklomp-base64/LICENSE │ +│ brotli │ MIT │ /contrib/brotli/LICENSE │ +│ [...] │ [...] │ [...] │ +└────────────────────┴──────────────┴─────────────────────────────────────┘ + +``` diff --git a/docs/ja/operations/system-tables/merge_tree_settings.md b/docs/ja/operations/system-tables/merge_tree_settings.md new file mode 100644 index 00000000000..51be77c1124 --- /dev/null +++ b/docs/ja/operations/system-tables/merge_tree_settings.md @@ -0,0 +1,82 @@ +--- +slug: /ja/operations/system-tables/merge_tree_settings +title: merge_tree_settings +--- + +`MergeTree` テーブルの設定に関する情報を含みます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — 設定名。 +- `value` ([String](../../sql-reference/data-types/string.md)) — 設定値。 +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 設定が設定ファイルで明示的に定義されたか、明示的に変更されたかどうか。 +- `description` ([String](../../sql-reference/data-types/string.md)) — 設定の説明。 +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — [制約](../../operations/settings/constraints-on-settings.md#constraints-on-settings)により設定される最小値がある場合、その最小値。最小値がない場合、[NULL](../../sql-reference/syntax.md#null-literal)を含む。 +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — [制約](../../operations/settings/constraints-on-settings.md#constraints-on-settings)により設定される最大値がある場合、その最大値。最大値がない場合、[NULL](../../sql-reference/syntax.md#null-literal)を含む。 +- `readonly` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 現在のユーザーが設定を変更できるかどうかを示す: + - `0` — 現在のユーザーは設定を変更できる。 + - `1` — 現在のユーザーは設定を変更できない。 +- `type` ([String](../../sql-reference/data-types/string.md)) — 設定タイプ(実装に特有の文字列値)。 +- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - 設定が廃止されているかどうかを示す。 +- `tier` ([Enum8](../../sql-reference/data-types/enum.md)) — この機能のサポートレベル。ClickHouseの機能は、開発の現状と利用時の期待に応じた異なる段階に整理される。値: + - `'Production'` — 機能は安定しており、安全に使用できる。**プロダクション**の他の機能と相互作用する際に問題はない。 + - `'Beta'` — 機能は安定しており、安全である。他の機能と一緒に使用した場合の結果は未知であり、正確性は保証されていない。テストと報告が歓迎される。 + - `'Experimental'` — 機能は開発中である。開発者とClickHouse愛好者のためにのみ意図されている。機能は動作するかもしれず、されないかもしれず、いつでも削除される可能性がある。 + - `'Obsolete'` — もはやサポートされない。すでに削除されているか、将来のリリースで削除される予定である。 + +**例** +```sql +SELECT * FROM system.merge_tree_settings LIMIT 4 FORMAT Vertical; +``` + +```response +Row 1: +────── +name: min_compress_block_size +value: 0 +changed: 0 +description: グラニュールが書き込まれるとき、保留中の非圧縮データのサイズが指定された閾値以上またはそれ以上の場合、バッファ内のデータを圧縮します。この設定が設定されていない場合、対応するグローバル設定が使用されます。 +min: ____ +max: ____ +readonly: 0 +type: UInt64 +is_obsolete: 0 + +Row 2: +────── +name: max_compress_block_size +value: 0 +changed: 0 +description: バッファ内の保留中の非圧縮データが指定された閾値以上のサイズである場合、それを圧縮します。データブロックは現在のグラニュールが終了していなくても圧縮されます。この設定が設定されていない場合、対応するグローバル設定が使用されます。 +min: ____ +max: ____ +readonly: 0 +type: UInt64 +is_obsolete: 0 + +Row 3: +────── +name: index_granularity +value: 8192 +changed: 0 +description: 1つの主キー値に対応する行数。 +min: ____ +max: ____ +readonly: 0 +type: UInt64 +is_obsolete: 0 + +Row 4: +────── +name: max_digestion_size_per_segment +value: 268435456 +changed: 0 +description: GINインデックスを構築するためにセグメントごとに消化する最大バイト数。 +min: ____ +max: ____ +readonly: 0 +type: UInt64 +is_obsolete: 0 + +4 rows in set. Elapsed: 0.009 sec. +``` diff --git a/docs/ja/operations/system-tables/merges.md b/docs/ja/operations/system-tables/merges.md new file mode 100644 index 00000000000..c71b8346bba --- /dev/null +++ b/docs/ja/operations/system-tables/merges.md @@ -0,0 +1,26 @@ +--- +slug: /ja/operations/system-tables/merges +--- +# merges + +MergeTree ファミリーのテーブルに対して、現在進行中のマージやパートのミューテーションに関する情報を含んでいます。 + +カラム: + +- `database` (String) — テーブルが属するデータベースの名前。 +- `table` (String) — テーブル名。 +- `elapsed` (Float64) — マージが開始されてからの経過時間(秒)。 +- `progress` (Float64) — 完了した作業の割合で、0から1までの値。 +- `num_parts` (UInt64) — マージされるパーツの数。 +- `result_part_name` (String) — マージの結果として形成されるパートの名前。 +- `is_mutation` (UInt8) — このプロセスがパートのミューテーションである場合は1。 +- `total_size_bytes_compressed` (UInt64) — マージされたチャンクの圧縮データの合計サイズ。 +- `total_size_marks` (UInt64) — マージされたパーツのマークの総数。 +- `bytes_read_uncompressed` (UInt64) — 読み込まれた未圧縮のバイト数。 +- `rows_read` (UInt64) — 読み込まれた行数。 +- `bytes_written_uncompressed` (UInt64) — 書き込まれた未圧縮のバイト数。 +- `rows_written` (UInt64) — 書き込まれた行数。 +- `memory_usage` (UInt64) — マージプロセスのメモリ消費量。 +- `thread_id` (UInt64) — マージプロセスのスレッドID。 +- `merge_type` — 現在のマージのタイプ。ミューテーションの場合は空。 +- `merge_algorithm` — 現在のマージで使用されているアルゴリズム。ミューテーションの場合は空。 diff --git a/docs/ja/operations/system-tables/metric_log.md b/docs/ja/operations/system-tables/metric_log.md new file mode 100644 index 00000000000..49d261f4ed5 --- /dev/null +++ b/docs/ja/operations/system-tables/metric_log.md @@ -0,0 +1,54 @@ +--- +slug: /ja/operations/system-tables/metric_log +--- +# metric_log + +`system.metrics`および`system.events`テーブルからのメトリクス値の履歴を含み、定期的にディスクにフラッシュされます。 + +カラム: +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒単位の解像度のイベント時刻。 + +**例** + +``` sql +SELECT * FROM system.metric_log LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2020-09-05 +event_time: 2020-09-05 16:22:33 +event_time_microseconds: 2020-09-05 16:22:33.196807 +milliseconds: 196 +ProfileEvent_Query: 0 +ProfileEvent_SelectQuery: 0 +ProfileEvent_InsertQuery: 0 +ProfileEvent_FailedQuery: 0 +ProfileEvent_FailedSelectQuery: 0 +... +... +CurrentMetric_Revision: 54439 +CurrentMetric_VersionInteger: 20009001 +CurrentMetric_RWLockWaitingReaders: 0 +CurrentMetric_RWLockWaitingWriters: 0 +CurrentMetric_RWLockActiveReaders: 0 +CurrentMetric_RWLockActiveWriters: 0 +CurrentMetric_GlobalThread: 74 +CurrentMetric_GlobalThreadActive: 26 +CurrentMetric_LocalThread: 0 +CurrentMetric_LocalThreadActive: 0 +CurrentMetric_DistributedFilesToInsert: 0 +``` + +**関連項目** + +- [metric_log 設定](../../operations/server-configuration-parameters/settings.md#metric_log) — 設定の有効化と無効化。 +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md) — 定期的に計算されるメトリクスを含みます。 +- [system.events](../../operations/system-tables/events.md#system_tables-events) — 発生したイベント数を含みます。 +- [system.metrics](../../operations/system-tables/metrics.md) — 即座に計算されるメトリクスを含みます。 +- [モニタリング](../../operations/monitoring.md) — ClickHouseモニタリングの基本概念。 diff --git a/docs/ja/operations/system-tables/metrics.md b/docs/ja/operations/system-tables/metrics.md new file mode 100644 index 00000000000..be92f021908 --- /dev/null +++ b/docs/ja/operations/system-tables/metrics.md @@ -0,0 +1,753 @@ +--- +slug: /ja/operations/system-tables/metrics +--- +# metrics + +即時に計算できる、または現在の値を持つメトリクスを含んでいます。例えば、同時に処理されているクエリの数や現在のレプリカ遅延があります。このテーブルは常に最新です。 + +カラム: + +- `metric` ([String](../../sql-reference/data-types/string.md)) — メトリクス名。 +- `value` ([Int64](../../sql-reference/data-types/int-uint.md)) — メトリクスの値。 +- `description` ([String](../../sql-reference/data-types/string.md)) — メトリクスの説明。 +- `name` ([String](../../sql-reference/data-types/string.md)) — `metric`の別名。 + +サポートされているすべてのメトリクスは、ソースファイル [src/Common/CurrentMetrics.cpp](https://github.com/ClickHouse/ClickHouse/blob/master/src/Common/CurrentMetrics.cpp) で確認できます。 + +**例** + +``` sql +SELECT * FROM system.metrics LIMIT 10 +``` + +``` text +┌─metric───────────────────────────────┬─value─┬─description────────────────────────────────────────────────────────────┐ +│ Query │ 1 │ Number of executing queries │ +│ Merge │ 0 │ Number of executing background merges │ +│ PartMutation │ 0 │ Number of mutations (ALTER DELETE/UPDATE) │ +│ ReplicatedFetch │ 0 │ Number of data parts being fetched from replicas │ +│ ReplicatedSend │ 0 │ Number of data parts being sent to replicas │ +│ ReplicatedChecks │ 0 │ Number of data parts checking for consistency │ +│ BackgroundMergesAndMutationsPoolTask │ 0 │ Number of active merges and mutations in an associated background pool │ +│ BackgroundFetchesPoolTask │ 0 │ Number of active fetches in an associated background pool │ +│ BackgroundCommonPoolTask │ 0 │ Number of active tasks in an associated background pool │ +│ BackgroundMovePoolTask │ 0 │ Number of active tasks in BackgroundProcessingPool for moves │ +└──────────────────────────────────────┴───────┴────────────────────────────────────────────────────────────────────────┘ +``` + +## メトリクスの説明 + +### AggregatorThreads + +Aggregatorスレッドプール内のスレッドの数。 + +### AggregatorThreadsActive + +Aggregatorスレッドプールでタスクを実行しているスレッドの数。 + +### TablesLoaderForegroundThreads + +非同期ローダー前景スレッドプール内のスレッドの数。 + +### TablesLoaderForegroundThreadsActive + +非同期ローダー前景スレッドプールでタスクを実行しているスレッドの数。 + +### TablesLoaderBackgroundThreads + +非同期ローダー背景スレッドプール内のスレッドの数。 + +### TablesLoaderBackgroundThreadsActive + +非同期ローダー背景スレッドプールでタスクを実行しているスレッドの数。 + +### AsyncInsertCacheSize + +キャッシュ内の非同期挿入ハッシュIDの数。 + +### AsynchronousInsertThreads + +非同期挿入スレッドプール内のスレッドの数。 + +### AsynchronousInsertThreadsActive + +非同期挿入スレッドプールでタスクを実行しているスレッドの数。 + +### AsynchronousReadWait + +非同期読み込みを待機しているスレッドの数。 + +### BackgroundBufferFlushSchedulePoolSize + +BackgroundBufferFlushSchedulePoolでのタスク数の制限。 + +### BackgroundBufferFlushSchedulePoolTask + +BackgroundBufferFlushSchedulePoolでのアクティブなタスクの数。このプールは一定周期でのBufferフラッシュに使用されます。 + +### BackgroundCommonPoolSize + +関連する背景プールでのタスク数の制限。 + +### BackgroundCommonPoolTask + +関連する背景プールでのアクティブなタスクの数。 + +### BackgroundDistributedSchedulePoolSize + +BackgroundDistributedSchedulePoolでのタスク数の制限。 + +### BackgroundDistributedSchedulePoolTask + +BackgroundDistributedSchedulePoolでのアクティブなタスクの数。このプールは分散送信を背景で実行するために使用されます。 + +### BackgroundFetchesPoolSize + +関連する背景プールでの同時フェッチ数の制限。 + +### BackgroundFetchesPoolTask + +関連する背景プールでのアクティブなフェッチ数。 + +### BackgroundMergesAndMutationsPoolSize + +関連する背景プールでのアクティブなマージとミューテーションの制限。 + +### BackgroundMergesAndMutationsPoolTask + +関連する背景プールでのアクティブなマージとミューテーションの数。 + +### BackgroundMessageBrokerSchedulePoolSize + +メッセージストリーミングのためのBackgroundProcessingPoolでのタスク数の制限。 + +### BackgroundMessageBrokerSchedulePoolTask + +メッセージストリーミングのためのBackgroundProcessingPoolでのアクティブなタスクの数。 + +### BackgroundMovePoolSize + +移動のためのBackgroundProcessingPoolでのタスク数の制限。 + +### BackgroundMovePoolTask + +移動のためのBackgroundProcessingPoolでのアクティブなタスクの数。 + +### BackgroundSchedulePoolSize + +BackgroundSchedulePoolでのタスク数の制限。このプールは古いデータパーツのクリーニング、データパーツの変更、レプリカの再初期化などの定期的なReplicatedMergeTreeタスクに使用されます。 + +### BackgroundSchedulePoolTask + +BackgroundSchedulePoolでのアクティブなタスクの数。このプールは古いデータパーツのクリーニング、データパーツの変更、レプリカの再初期化などの定期的なReplicatedMergeTreeタスクに使用されます。 + +### BackupsIOThreads + +BackupsIOスレッドプール内のスレッドの数。 + +### BackupsIOThreadsActive + +BackupsIOスレッドプールでタスクを実行しているスレッドの数。 + +### BackupsThreads + +BACKUP用のスレッドプール内のスレッドの数。 + +### BackupsThreadsActive + +BACKUP用のスレッドプールでタスクを実行しているスレッドの数。 + +### BrokenDistributedFilesToInsert + +破損としてマークされた分散テーブルへの非同期挿入ファイルの数。このメトリクスは開始時0から始まります。各シャードのファイル数を合算します。 + +### CacheDetachedFileSegments + +既存の切り離されたキャッシュファイルセグメントの数。 + +### CacheDictionaryThreads + +CacheDictionaryスレッドプール内のスレッドの数。 + +### CacheDictionaryThreadsActive + +CacheDictionaryスレッドプールでタスクを実行しているスレッドの数。 + +### CacheDictionaryUpdateQueueBatches + +CacheDictionaries内の更新キューの「バッチ」(キーのセット)数。 + +### CacheDictionaryUpdateQueueKeys + +CacheDictionaries内の更新キューにある正確なキーの数。 + +### CacheFileSegments + +既存のキャッシュファイルセグメントの数。 + +### ContextLockWait + +Context内のロックを待っているスレッドの数。これはグローバルロックです。 + +### DDLWorkerThreads + +ON CLUSTERクエリ用のDDLWorkerスレッドプール内のスレッドの数。 + +### DDLWorkerThreadsActive + +ON CLUSTERクエリ用のDDLWorkerスレッドプールでタスクを実行しているスレッドの数。 + +### DatabaseCatalogThreads + +DatabaseCatalogスレッドプール内のスレッドの数。 + +### DatabaseCatalogThreadsActive + +DatabaseCatalogスレッドプールでタスクを実行しているスレッドの数。 + +### DatabaseOnDiskThreads + +DatabaseOnDiskスレッドプール内のスレッドの数。 + +### DatabaseOnDiskThreadsActive + +DatabaseOnDiskスレッドプールでタスクを実行しているスレッドの数。 + +### DelayedInserts + +MergeTreeテーブルのパーティションに対してアクティブなデータパーツが多いため、調整されているINSERTクエリの数。 + +### DestroyAggregatesThreads + +アグリゲート状態の破棄用スレッドプール内のスレッドの数。 + +### DestroyAggregatesThreadsActive + +アグリゲート状態の破棄用スレッドプールでタスクを実行しているスレッドの数。 + +### DictCacheRequests + +キャッシュタイプのディクショナリのデータソースへのフライリクエスト数。 + +### DiskObjectStorageAsyncThreads + +DiskObjectStorage用の非同期スレッドプール内のスレッドの数。 + +### DiskObjectStorageAsyncThreadsActive + +DiskObjectStorage用非同期スレッドプールでタスクを実行しているスレッドの数。 + +### DiskSpaceReservedForMerge + +現在行っている背景マージ用に予約されたディスクスペース。これは現在マージしているパーツの合計サイズより若干大きくなります。 + +### DistributedFilesToInsert + +分散テーブルへの非同期挿入に処理される保留中のファイルの数。各シャードのファイル数を合算します。 + +### DistributedSend + +分散テーブルにINSERTされたデータを遠隔サーバへ送信する接続数。同期および非同期モードの両方を含みます。 + +### EphemeralNode + +ZooKeeper内で保持するエフェメラルノードの数。 + +### FilesystemCacheElements + +ファイルシステムキャッシュ要素(ファイルセグメント)。 + +### FilesystemCacheReadBuffers + +アクティブなキャッシュバッファの数。 + +### FilesystemCacheSize + +ファイルシステムキャッシュのサイズ(バイト単位)。 + +### GlobalThread + +グローバルスレッドプール内のスレッドの数。 + +### GlobalThreadActive + +グローバルスレッドプールでタスクを実行しているスレッドの数。 + +### HTTPConnection + +HTTPサーバへの接続数。 + +### HashedDictionaryThreads + +HashedDictionaryスレッドプール内のスレッドの数。 + +### HashedDictionaryThreadsActive + +HashedDictionaryスレッドプールでタスクを実行しているスレッドの数。 + +### IOPrefetchThreads + +IOプリフェッチスレッドプール内のスレッドの数。 + +### IOPrefetchThreadsActive + +IOプリフェッチスレッドプールでタスクを実行しているスレッドの数。 + +### IOThreads + +IOスレッドプール内のスレッドの数。 + +### IOThreadsActive + +IOスレッドプールでタスクを実行しているスレッドの数。 + +### IOUringInFlightEvents + +フライト中のio_uring SQEの数。 + +### IOUringPendingEvents + +送信待ちのio_uring SQEの数。 + +### IOWriterThreads + +IO書き込みスレッドプール内のスレッドの数。 + +### IOWriterThreadsActive + +IO書き込みスレッドプールでタスクを実行しているスレッドの数。 + +### InterserverConnection + +部品をフェッチするための他のレプリカからの接続数。 + +### KafkaAssignedPartitions + +Kafkaテーブルに現在割り当てられているパーティションの数。 + +### KafkaBackgroundReads + +バックグラウンドリード(Kafkaからのマテリアライズドビューの補充)に現在作業中の数。 + +### KafkaConsumers + +アクティブなKafkaコンシューマの数。 + +### KafkaConsumersInUse + +直接またはバックグラウンドリードにより現在利用されているコンシューマの数。 + +### KafkaConsumersWithAssignment + +割り当てられたパーティションを持つアクティブなKafkaコンシューマの数。 + +### KafkaLibrdkafkaThreads + +アクティブなlibrdkafkaスレッドの数。 + +### KafkaProducers + +作成されたアクティブなKafkaプロデューサの数。 + +### KafkaWrites + +Kafkaに挿入を実行中の数。 + +### KeeperAliveConnections + +アライブ接続の数。 + +### KeeperOutstandingRequests + +未処理のリクエストの数。 + +### LocalThread + +ローカルスレッドプール内のスレッドの数。ローカルスレッドプール内のスレッドはグローバルスレッドプールから取得されます。 + +### LocalThreadActive + +ローカルスレッドプールでタスクを実行しているスレッドの数。 + +### MMappedAllocBytes + +mmappedアロケーションの合計バイト数。 + +### MMappedAllocs + +mmappedアロケーションの総数。 + +### MMappedFileBytes + +mmappedファイル領域の合計サイズ。 + +### MMappedFiles + +mmappedファイルの総数。 + +### MarksLoaderThreads + +マークのロード用スレッドプール内のスレッドの数。 + +### MarksLoaderThreadsActive + +マークのロード用スレッドプールでタスクを実行しているスレッドの数。 + +### MaxDDLEntryID + +DDLWorkerが処理した最大のDDLエントリ。 + +### MaxPushedDDLEntryID + +ZooKeeperにプッシュされたDDLWorkerの最大DDLエントリ。 + +### MemoryTracking + +サーバによって割り当てられたメモリ(バイト単位)の総量。 + +### Merge + +実行中の背景マージの数。 + +### MergeTreeAllRangesAnnouncementsSent + +リモートサーバから起動サーバへデータパーツのセットについて送信中のアナウンスメントの現在数(MergeTreeテーブル用)。リモートサーバ側で測定されます。 + +### MergeTreeBackgroundExecutorThreads + +MergeTreeBackgroundExecutorスレッドプール内のスレッドの数。 + +### MergeTreeBackgroundExecutorThreadsActive + +MergeTreeBackgroundExecutorスレッドプールでタスクを実行しているスレッドの数。 + +### MergeTreeDataSelectExecutorThreads + +MergeTreeDataSelectExecutorスレッドプール内のスレッドの数。 + +### MergeTreeDataSelectExecutorThreadsActive + +MergeTreeDataSelectExecutorスレッドプールでタスクを実行しているスレッドの数。 + +### MergeTreePartsCleanerThreads + +MergeTreeパーツクリーナースレッドプール内のスレッドの数。 + +### MergeTreePartsCleanerThreadsActive + +MergeTreeパーツクリーナースレッドプールでタスクを実行しているスレッドの数。 + +### MergeTreePartsLoaderThreads + +MergeTreeパーツローダースレッドプール内のスレッドの数。 + +### MergeTreePartsLoaderThreadsActive + +MergeTreeパーツローダースレッドプールでタスクを実行しているスレッドの数。 + +### MergeTreeReadTaskRequestsSent + +リモートサーバ側で読み取りタスクを選択するため、リモートサーバから起動サーバ側へフライト中のコールバックリクエストの数(MergeTreeテーブル用)。リモートサーバ側で測定されます。 + +### Move + +現在実行中の移動の数。 + +### MySQLConnection + +MySQLプロトコルを使用しているクライアント接続の数。 + +### NetworkReceive + +ネットワークからデータを受信するスレッドの数。ClickHouse関連のネットワーク相互作用のみが含まれ、サードパーティライブラリは含まれません。 + +### NetworkSend + +ネットワークにデータを送信するスレッドの数。ClickHouse関連のネットワーク相互作用のみが含まれ、サードパーティライブラリは含まれません。 + +### OpenFileForRead + +読み取り用に開かれたファイルの数。 + +### OpenFileForWrite + +書き込み用に開かれたファイルの数。 + +### ParallelFormattingOutputFormatThreads + +ParallelFormattingOutputFormatThreadsスレッドプール内のスレッドの数。 + +### ParallelFormattingOutputFormatThreadsActive + +ParallelFormattingOutputFormatThreadsスレッドプールでタスクを実行しているスレッドの数。 + +### ParallelParsingInputFormatThreads + +ParallelParsingInputFormatスレッドプール内のスレッドの数。 + +### ParallelParsingInputFormatThreadsActive + +ParallelParsingInputFormatスレッドプールでタスクを実行しているスレッドの数。 + +### PartMutation + +ミューテーション(ALTER DELETE/UPDATE)の数。 + +### PartsActive + +現在および今後のSELECTによって使用されるアクティブデータパート。 + +### PartsCommitted + +廃止されました。PartsActiveを参照してください。 + +### PartsCompact + +コンパクトなパーツ。 + +### PartsDeleteOnDestroy + +別のディスクに移動され、独自のデストラクタで削除されるパート。 + +### PartsDeleting + +アイデンティティ参照カウンタを持つ非アクティブデータパートで、現在クリーナーによって削除中。 + +### PartsOutdated + +非アクティブデータパートですが、現在のSELECTによってのみ使用可能で、SELECTが終了したら削除可能。 + +### PartsPreActive + +データパーツに存在しますが、SELECTでは使用されていない。 + +### PartsPreCommitted + +廃止されました。PartsPreActiveを参照してください。 + +### PartsTemporary + +現在生成中で、data_partsリストには存在しません。 + +### PartsWide + +ワイドパーツ。 + +### PendingAsyncInsert + +フラッシュ待機中の非同期挿入の数。 + +### PostgreSQLConnection + +PostgreSQLプロトコルを使用しているクライアント接続の数。 + +### Query + +実行中のクエリの数。 + +### QueryPreempted + +「priority」設定のために停止し、待機中のクエリの数。 + +### QueryThread + +クエリ処理スレッドの数。 + +### RWLockActiveReaders + +テーブルのRWLockで読み取りロックを保持しているスレッドの数。 + +### RWLockActiveWriters + +テーブルのRWLockで書き込みロックを保持しているスレッドの数。 + +### RWLockWaitingReaders + +テーブルのRWLockで読み取り待機中のスレッドの数。 + +### RWLockWaitingWriters + +テーブルのRWLockで書き込み待機中のスレッドの数。 + +### Read + +リード(read、pread、io_geteventsなど)システムコールのフライト中の数。 + +### ReadTaskRequestsSent + +リモートサーバから起動サーバへフライト中のコールバックリクエストの数(s3Clusterテーブル関数など用)。リモートサーバ側で測定されます。 + +### ReadonlyReplica + +ZooKeeperセッションの喪失後の再初期化、またはZooKeeper未設定での起動により、現在readonly状態のレプリケートテーブルの数。 + +### RemoteRead + +リモートリーダーでのフライト中のリードの数。 + +### ReplicatedChecks + +一貫性をチェックするためのデータパーツの数。 + +### ReplicatedFetch + +レプリカからフェッチ中のデータパーツの数。 + +### ReplicatedSend + +レプリカへ送信中のデータパーツの数。 + +### RestartReplicaThreads + +RESTART REPLICAスレッドプール内のスレッドの数。 + +### RestartReplicaThreadsActive + +RESTART REPLICAスレッドプールでタスクを実行しているスレッドの数。 + +### RestoreThreads + +RESTORE用スレッドプール内のスレッドの数。 + +### RestoreThreadsActive + +RESTORE用スレッドプールでタスクを実行しているスレッドの数。 + +### Revision + +サーバのリビジョン。パッチリリースを除く、すべてのリリースまたはリリース候補でインクリメントされる数。 + +### S3Requests + +S3リクエスト。 + +### SendExternalTables + +リモートサーバへ外部テーブルのデータを送信中の接続数。外部テーブルは、分散サブクエリを使用したGLOBAL INおよびGLOBAL JOIN演算子を実装するために使用されます。 + +### SendScalars + +リモートサーバへスカラーのデータを送信中の接続数。 + +### StorageBufferBytes + +Bufferテーブルのバッファ内のバイト数。 + +### StorageBufferRows + +Bufferテーブルのバッファ内の行数。 + +### StorageDistributedThreads + +StorageDistributedスレッドプール内のスレッドの数。 + +### StorageDistributedThreadsActive + +StorageDistributedスレッドプールでタスクを実行しているスレッドの数。 + +### StorageHiveThreads + +StorageHiveスレッドプール内のスレッドの数。 + +### StorageHiveThreadsActive + +StorageHiveスレッドプールでタスクを実行しているスレッドの数。 + +### StorageS3Threads + +StorageS3スレッドプール内のスレッドの数。 + +### StorageS3ThreadsActive + +StorageS3スレッドプールでタスクを実行しているスレッドの数。 + +### SystemReplicasThreads + +system.replicasスレッドプール内のスレッドの数。 + +### SystemReplicasThreadsActive + +system.replicasスレッドプールでタスクを実行しているスレッドの数。 + +### TCPConnection + +TCPサーバへの接続数(ネイティブインターフェースを持つクライアント)、サーバ間の分散クエリ接続も含まれる。 + +### TablesToDropQueueSize + +背景でのデータ削除を待機している削除テーブルの数。 + +### TemporaryFilesForAggregation + +外部集計のために作成された一時ファイルの数。 + +### TemporaryFilesForJoin + +JOINのために作成された一時ファイルの数。 + +### TemporaryFilesForSort + +外部ソートのために作成された一時ファイルの数。 + +### TemporaryFilesUnknown + +目的不明で作成された一時ファイルの数。 + +### ThreadPoolFSReaderThreads + +local_filesystem_read_method=threadpool用スレッドプール内のスレッドの数。 + +### ThreadPoolFSReaderThreadsActive + +local_filesystem_read_method=threadpool用スレッドプールでタスクを実行しているスレッドの数。 + +### ThreadPoolRemoteFSReaderThreads + +remote_filesystem_read_method=threadpool用スレッドプール内のスレッドの数。 + +### ThreadPoolRemoteFSReaderThreadsActive + +remote_filesystem_read_method=threadpool用スレッドプールでタスクを実行しているスレッドの数。 + +### ThreadsInOvercommitTracker + +OvercommitTracker内で待機中のスレッド数。 + +### TotalTemporaryFiles + +作成された一時ファイルの数。 + +### VersionInteger + +バージョンを基数1000の単一整数で表したサーバのバージョン。例えば、バージョン11.22.33は11022033に変換されます。 + +### Write + +書き込み(write、pwrite、io_geteventsなど)システムコールのフライト中の数。 + +### ZooKeeperRequest + +フライト中のZooKeeperへのリクエスト数。 + +### ZooKeeperSession + +ZooKeeperへのセッション(接続)数。バグの原因となる可能性があるため、ZooKeeperへの複数接続を使用しない限り、1を超えないようにしてください。これはZooKeeperの一貫性モデルが許す直線化性の欠如(古い読み取り)によるものです。 + +### ZooKeeperWatch + +ZooKeeperでのウォッチ(イベント購読)の数。 + +### ConcurrencyControlAcquired + +取得されたCPUスロットの総数。 + +### ConcurrencyControlSoftLimit + +CPUスロット数のソフトリミット値。 + +**参照** + +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md#system_tables-asynchronous_metrics) — 定期的に計算されるメトリクスを含みます。 +- [system.events](../../operations/system-tables/events.md#system_tables-events) — 発生したイベントの数を含みます。 +- [system.metric_log](../../operations/system-tables/metric_log.md#system_tables-metric_log) — テーブル `system.metrics` と `system.events` からのメトリクス値の履歴を含みます。 +- [モニタリング](../../operations/monitoring.md) — ClickHouseモニタリングの基本概念。 diff --git a/docs/ja/operations/system-tables/moves.md b/docs/ja/operations/system-tables/moves.md new file mode 100644 index 00000000000..531fe1af5e7 --- /dev/null +++ b/docs/ja/operations/system-tables/moves.md @@ -0,0 +1,42 @@ +--- +slug: /ja/operations/system-tables/moves +--- +# moves + +このテーブルには、[MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md) テーブルの進行中の[データパート移動](/docs/ja/sql-reference/statements/alter/partition#move-partitionpart)に関する情報が格納されています。各データパートの移動は単一の行で表現されます。 + +カラム: + +- `database` ([String](/docs/ja/sql-reference/data-types/string.md)) — データベースの名前。 + +- `table` ([String](/docs/ja/sql-reference/data-types/string.md)) — データパートが移動中のテーブルの名前。 + +- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — データパートの移動が始まってから経過した時間(秒)。 + +- `target_disk_name` ([String](disks.md)) — データパートが移動する[ディスク](/docs/ja/operations/system-tables/disks/)の名前。 + +- `target_disk_path` ([String](disks.md)) — ファイルシステム内の[ディスク](/docs/ja/operations/system-tables/disks/)のマウントポイントへのパス。 + +- `part_name` ([String](/docs/ja/sql-reference/data-types/string.md)) — 移動中のデータパートの名前。 + +- `part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパートのサイズ。 + +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 移動を行っているスレッドの識別子。 + +**例** + +```sql +SELECT * FROM system.moves +``` + +```response +┌─database─┬─table─┬─────elapsed─┬─target_disk_name─┬─target_disk_path─┬─part_name─┬─part_size─┬─thread_id─┐ +│ default │ test2 │ 1.668056039 │ s3 │ ./disks/s3/ │ all_3_3_0 │ 136 │ 296146 │ +└──────────┴───────┴─────────────┴──────────────────┴──────────────────┴───────────┴───────────┴───────────┘ +``` + +**関連項目** + +- [MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md) テーブルエンジン +- [データストレージのための複数のブロックデバイスの使用](/docs/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes) +- [ALTER TABLE ... MOVE PART](/docs/ja/sql-reference/statements/alter/partition#move-partitionpart) コマンド diff --git a/docs/ja/operations/system-tables/mutations.md b/docs/ja/operations/system-tables/mutations.md new file mode 100644 index 00000000000..593966e93f5 --- /dev/null +++ b/docs/ja/operations/system-tables/mutations.md @@ -0,0 +1,63 @@ +--- +slug: /ja/operations/system-tables/mutations +--- +# mutations + +このテーブルには、[MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)テーブルの[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)とその進捗状況に関する情報が含まれています。各ミューテーションコマンドは単一の行で表されます。 + +## カラム: + +- `database` ([String](/docs/ja/sql-reference/data-types/string.md)) — ミューテーションが適用されたデータベースの名前。 + +- `table` ([String](/docs/ja/sql-reference/data-types/string.md)) — ミューテーションが適用されたテーブルの名前。 + +- `mutation_id` ([String](/docs/ja/sql-reference/data-types/string.md)) — ミューテーションのID。レプリケートされたテーブルの場合、これらのIDはClickHouse Keeperの`/mutations/`ディレクトリ内のznode名に対応します。非レプリケートされたテーブルの場合、IDはテーブルのデータディレクトリ内のファイル名に対応します。 + +- `command` ([String](/docs/ja/sql-reference/data-types/string.md)) — ミューテーションコマンド文字列(`ALTER TABLE [db.]table`の後のクエリ部分)。 + +- `create_time` ([DateTime](/docs/ja/sql-reference/data-types/datetime.md)) — ミューテーションコマンドが実行のために送信された日時。 + +- `block_numbers.partition_id` ([Array](/docs/ja/sql-reference/data-types/array.md)([String](/docs/ja/sql-reference/data-types/string.md))) — レプリケートされたテーブルのミューテーションの場合、配列はパーティションのIDを含みます(各パーティションに1つのレコード)。非レプリケートされたテーブルのミューテーションの場合、配列は空です。 + +- `block_numbers.number` ([Array](/docs/ja/sql-reference/data-types/array.md)([Int64](/docs/ja/sql-reference/data-types/int-uint.md))) — レプリケートされたテーブルのミューテーションの場合、配列は各パーティションに1つのレコードを含み、そのミューテーションによって取得されたブロック番号を示しています。この番号より小さい番号を持つブロックを含むパーツのみがパーティションでミューテーションされます。 + + 非レプリケートされたテーブルでは、すべてのパーティションでブロック番号が単一のシーケンスを形成します。したがって、非レプリケートされたテーブルのミューテーションの場合、カラムはミューテーションによって取得された単一ブロック番号を持つ1つのレコードを含みます。 + +- `parts_to_do_names` ([Array](/docs/ja/sql-reference/data-types/array.md)([String](/docs/ja/sql-reference/data-types/string.md))) — ミューテーションを完了するためにミューテートする必要のあるデータパーツの名前の配列。 + +- `parts_to_do` ([Int64](/docs/ja/sql-reference/data-types/int-uint.md)) — ミューテーションを完了するためにミューテートが必要なデータパーツの数。 + +- `is_done` ([UInt8](/docs/ja/sql-reference/data-types/int-uint.md)) — ミューテーションが完了しているかどうかのフラグ。可能な値: + - ミューテーションが完了している場合は`1`、 + - ミューテーションがまだ進行中の場合は`0`。 + +:::note +`parts_to_do = 0`であっても、レプリケートされたテーブルのミューテーションがまだ完了していない可能性があります。それは、新しいデータパーツを作成し、ミューテートが必要な長時間実行されている`INSERT`クエリのためです。 +::: + +いくつかのデータパーツのミューテートに問題があった場合、次のカラムに追加情報が含まれます: + +- `latest_failed_part` ([String](/docs/ja/sql-reference/data-types/string.md)) — ミューテートできなかった最新のパーツの名前。 + +- `latest_fail_time` ([DateTime](/docs/ja/sql-reference/data-types/datetime.md)) — 最新のパーツミューテーションの失敗日時。 + +- `latest_fail_reason` ([String](/docs/ja/sql-reference/data-types/string.md)) — 最新のパーツミューテーション失敗を引き起こした例外メッセージ。 + +## ミューテーションの監視 + +`system.mutations`テーブルで進捗を追跡するには、次のようなクエリを使用します - これには`system.*`テーブルの読み取り権限が必要です: + +``` sql +SELECT * FROM clusterAllReplicas('cluster_name', 'db', system.mutations) +WHERE is_done=0 AND table='tmp'; +``` + +:::tip +`table='tmp'`の`tmp`を、ミューテーションを確認しているテーブルの名前に置き換えてください。 +::: + +**関連情報** + +- [ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations) +- [MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)テーブルエンジン +- [ReplicatedMergeTree](/docs/ja/engines/table-engines/mergetree-family/replication.md)ファミリー diff --git a/docs/ja/operations/system-tables/numbers.md b/docs/ja/operations/system-tables/numbers.md new file mode 100644 index 00000000000..7bf5f3de2f1 --- /dev/null +++ b/docs/ja/operations/system-tables/numbers.md @@ -0,0 +1,57 @@ +--- +slug: /ja/operations/system-tables/numbers +--- +# numbers + +このテーブルは、ゼロから始まるほぼすべての自然数を含む単一のUInt64カラム`number`を含んでいます。 + +このテーブルはテスト用、またはブルートフォース検索が必要な場合に使用できます。 + +このテーブルからの読み取りは並列化されていません。 + +**例** + +```sql +SELECT * FROM system.numbers LIMIT 10; +``` + +```response +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ + +10 rows in set. Elapsed: 0.001 sec. +``` + +出力を条件で制限することもできます。 + +```sql +SELECT * FROM system.numbers < 10; +``` + +```response +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ + +10 rows in set. Elapsed: 0.001 sec. +``` + diff --git a/docs/ja/operations/system-tables/numbers_mt.md b/docs/ja/operations/system-tables/numbers_mt.md new file mode 100644 index 00000000000..6cc69afe181 --- /dev/null +++ b/docs/ja/operations/system-tables/numbers_mt.md @@ -0,0 +1,31 @@ +--- +slug: /ja/operations/system-tables/numbers_mt +--- +# numbers_mt + +[system.numbers](../../operations/system-tables/numbers.md) と同様ですが、読み込みが並列化されています。数値は任意の順序で返される可能性があります。 + +テストに使用されます。 + +**例** + +```sql +SELECT * FROM system.numbers_mt LIMIT 10; +``` + +```response +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ + +10 rows in set. Elapsed: 0.001 sec. +``` diff --git a/docs/ja/operations/system-tables/one.md b/docs/ja/operations/system-tables/one.md new file mode 100644 index 00000000000..ecf8c86e2ee --- /dev/null +++ b/docs/ja/operations/system-tables/one.md @@ -0,0 +1,24 @@ +--- +slug: /ja/operations/system-tables/one +--- +# one + +このテーブルは、値が0の`dummy`という単一のUInt8型のカラムを持つ、1つの行を含んでいます。 + +このテーブルは、`SELECT`クエリが`FROM`句を指定しない場合に使用されます。 + +これは、他のDBMSに見られる`DUAL`テーブルと似ています。 + +**例** + +```sql +SELECT * FROM system.one LIMIT 10; +``` + +```response +┌─dummy─┐ +│ 0 │ +└───────┘ + +1 rows in set. Elapsed: 0.001 sec. +``` diff --git a/docs/ja/operations/system-tables/opentelemetry_span_log.md b/docs/ja/operations/system-tables/opentelemetry_span_log.md new file mode 100644 index 00000000000..8da6a0084af --- /dev/null +++ b/docs/ja/operations/system-tables/opentelemetry_span_log.md @@ -0,0 +1,53 @@ +--- +slug: /ja/operations/system-tables/opentelemetry_span_log +--- +# opentelemetry_span_log + +クエリが実行された際の[トレーススパン](https://opentracing.io/docs/overview/spans/)に関する情報を含みます。 + +カラム: + +- `trace_id` ([UUID](../../sql-reference/data-types/uuid.md)) — 実行されたクエリのトレースID。 +- `span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `トレーススパン`のID。 +- `parent_span_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 親の`トレーススパン`のID。 +- `operation_name` ([String](../../sql-reference/data-types/string.md)) — 操作の名前。 +- `kind` ([Enum8](../../sql-reference/data-types/enum.md)) — スパンの[SpanKind](https://opentelemetry.io/docs/reference/specification/trace/api/#spankind)。 + - `INTERNAL` — スパンがアプリケーション内の内部操作を表していることを示します。 + - `SERVER` — スパンが同期RPCまたは他のリモートリクエストのサーバー側処理をカバーしていることを示します。 + - `CLIENT` — スパンが何らかのリモートサービスへのリクエストを記述していることを示します。 + - `PRODUCER` — スパンが非同期リクエストの開始を記述していることを示します。この親スパンは、しばしば対応する子CONSUMERスパンが始まる前に終了することがあります。 + - `CONSUMER` - スパンが非同期PRODUCERリクエストの子を記述していることを示します。 +- `start_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `トレーススパン`の開始時間(マイクロ秒単位)。 +- `finish_time_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `トレーススパン`の終了時間(マイクロ秒単位)。 +- `finish_date` ([Date](../../sql-reference/data-types/date.md)) — `トレーススパン`の終了日。 +- `attribute.names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — `トレーススパン`に依存する[属性](https://opentelemetry.io/docs/go/instrumentation/#attributes)名。`OpenTelemetry`標準の推奨に従って記入されます。 +- `attribute.values` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — `トレーススパン`に依存する属性値。`OpenTelemetry`標準の推奨に従って記入されます。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.opentelemetry_span_log LIMIT 1 FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +trace_id: cdab0847-0d62-61d5-4d38-dd65b19a1914 +span_id: 701487461015578150 +parent_span_id: 2991972114672045096 +operation_name: DB::Block DB::InterpreterSelectQuery::getSampleBlockImpl() +kind: INTERNAL +start_time_us: 1612374594529090 +finish_time_us: 1612374594529108 +finish_date: 2021-02-03 +attribute.names: [] +attribute.values: [] +``` + +**関連情報** + +- [OpenTelemetry](../../operations/opentelemetry.md) diff --git a/docs/ja/operations/system-tables/part_log.md b/docs/ja/operations/system-tables/part_log.md new file mode 100644 index 00000000000..d565411680d --- /dev/null +++ b/docs/ja/operations/system-tables/part_log.md @@ -0,0 +1,85 @@ +--- +slug: /ja/operations/system-tables/part_log +--- +# part_log + +`system.part_log`テーブルは、[part_log](../../operations/server-configuration-parameters/settings.md#part-log)サーバー設定が指定されている場合のみ作成されます。 + +このテーブルは、データを追加したりマージするなど、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md)ファミリーのテーブルで[データパーツ](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)に発生したイベントに関する情報を含んでいます。 + +`system.part_log`テーブルには次のカラムが含まれています: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — このデータパーツを作成した`INSERT`クエリの識別子。 +- `event_type` ([Enum8](../../sql-reference/data-types/enum.md)) — データパーツに発生したイベントのタイプ。次のいずれかの値を持つことができます: + - `NewPart` — 新しいデータパーツの挿入。 + - `MergePartsStart` — データパーツのマージが開始された。 + - `MergeParts` — データパーツのマージが完了した。 + - `DownloadPart` — データパーツのダウンロード。 + - `RemovePart` — [DETACH PARTITION](../../sql-reference/statements/alter/partition.md#alter_detach-partition)を使用したデータパーツの削除またはデタッチ。 + - `MutatePartStart` — データパーツの変異が開始された。 + - `MutatePart` — データパーツの変異が完了した。 + - `MovePart` — データパーツをあるディスクから別のディスクに移動する。 +- `merge_reason` ([Enum8](../../sql-reference/data-types/enum.md)) — `MERGE_PARTS`タイプのイベントの理由。次のいずれかの値を持つことができます: + - `NotAMerge` — 現在のイベントは`MERGE_PARTS`以外のタイプです。 + - `RegularMerge` — 通常のマージ。 + - `TTLDeleteMerge` — 有効期限切れデータのクリーンアップ。 + - `TTLRecompressMerge` — データパーツの再圧縮。 +- `merge_algorithm` ([Enum8](../../sql-reference/data-types/enum.md)) — `MERGE_PARTS`タイプのイベントのマージアルゴリズム。次のいずれかの値を持つことができます: + - `Undecided` + - `Horizontal` + - `Vertical` +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時刻。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒単位の精度でのイベントの時刻。 +- `duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 所要時間。 +- `database` ([String](../../sql-reference/data-types/string.md)) — データパーツが存在するデータベースの名前。 +- `table` ([String](../../sql-reference/data-types/string.md)) — データパーツが存在するテーブルの名前。 +- `part_name` ([String](../../sql-reference/data-types/string.md)) — データパーツの名前。 +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — データパーツが挿入されたパーティションのID。パーティショニングが`tuple()`の場合、このカラムは`all`の値を取ります。 +- `path_on_disk` ([String](../../sql-reference/data-types/string.md)) — データパーツファイルを含むフォルダーへの絶対パス。 +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパーツ内の行数。 +- `size_in_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパーツのバイト単位のサイズ。 +- `merged_from` ([Array(String)](../../sql-reference/data-types/array.md)) — 現在のパーツがマージ後に作られた元のパーツの名前の配列。 +- `bytes_uncompressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 非圧縮バイトのサイズ。 +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マージ中に読み取られた行数。 +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マージ中に読み取られたバイト数。 +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — このスレッドのコンテキストでの割り当てられたメモリと解放されたメモリの差の最大値。 +- `error` ([UInt16](../../sql-reference/data-types/int-uint.md)) — 発生したエラーのコード番号。 +- `exception` ([String](../../sql-reference/data-types/string.md)) — 発生したエラーのテキストメッセージ。 + +`system.part_log`テーブルは、最初のデータが`MergeTree`テーブルに挿入された後に作成されます。 + +**例** + +``` sql +SELECT * FROM system.part_log LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +query_id: 983ad9c7-28d5-4ae1-844e-603116b7de31 +event_type: NewPart +merge_reason: NotAMerge +merge_algorithm: Undecided +event_date: 2021-02-02 +event_time: 2021-02-02 11:14:28 +event_time_microseconds: 2021-02-02 11:14:28.861919 +duration_ms: 35 +database: default +table: log_mt_2 +part_name: all_1_1_0 +partition_id: all +path_on_disk: db/data/default/log_mt_2/all_1_1_0/ +rows: 115418 +size_in_bytes: 1074311 +merged_from: [] +bytes_uncompressed: 0 +read_rows: 0 +read_bytes: 0 +peak_memory_usage: 0 +error: 0 +exception: +``` diff --git a/docs/ja/operations/system-tables/parts.md b/docs/ja/operations/system-tables/parts.md new file mode 100644 index 00000000000..45c657b1ced --- /dev/null +++ b/docs/ja/operations/system-tables/parts.md @@ -0,0 +1,171 @@ +--- +slug: /ja/operations/system-tables/parts +--- +# parts {#system_tables-parts} + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのパーツに関する情報を含みます。 + +各行が一つのデータパーツを説明します。 + +カラム: + +- `partition` ([String](../../sql-reference/data-types/string.md)) – パーティション名。パーティションとは何かを知るには、[ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) クエリの説明をご覧ください。 + + フォーマット: + + - `YYYYMM` 自動的に月ごとにパーティション分割されます。 + - `any_string` 手動でパーティション分割された場合。 + +- `name` ([String](../../sql-reference/data-types/string.md)) – データパーツの名前。 + +- `part_type` ([String](../../sql-reference/data-types/string.md)) — データパーツの保存フォーマット。 + + 値の可能性: + + - `Wide` — 各カラムがファイルシステム内の別々のファイルに保存されます。 + - `Compact` — すべてのカラムがファイルシステム内の1つのファイルに保存されます。 + + データの保存フォーマットは、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの `min_bytes_for_wide_part` および `min_rows_for_wide_part` 設定によって制御されます。 + +- `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) – データパーツがアクティブであるかを示すフラグ。データパーツがアクティブであれば、テーブルで使用されます。アクティブでない場合は削除されます。非アクティブなデータパーツはマージ後に残ります。 + +- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) – マークの数。データパーツ内の行数をおおよそ求めるには、`marks` にインデックス粒度(通常8192)を掛けます(このヒントはアダプティブ粒度には適用されません)。 + +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) – 行数。 + +- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツファイル全体のバイト単位のサイズ。 + +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツ内の圧縮データの総サイズ。補助ファイル(例: マーク付きのファイル)は含まれていません。 + +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツ内の非圧縮データの総サイズ。補助ファイル(例: マーク付きのファイル)は含まれていません。 + +- `primary_key_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) – ディスク上の primary.idx/cidx ファイル内で主キー値に使用されるメモリ量(バイト単位)。 + +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – マーク付きファイルのサイズ。 + +- `secondary_indices_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツ内のセカンダリインデックス用の圧縮データの総サイズ。補助ファイル(例: マーク付きのファイル)は含まれていません。 + +- `secondary_indices_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツ内のセカンダリインデックス用の非圧縮データの総サイズ。補助ファイル(例: マーク付きのファイル)は含まれていません。 + +- `secondary_indices_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – セカンダリインデックス用のマーク付きファイルのサイズ。 + +- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – データパーツのディレクトリが変更された時間。通常はデータパーツの作成時間に対応します。 + +- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – データパーツが非アクティブになった時間。 + +- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) – データパーツが使用されている場所の数。2以上の値は、データパーツがクエリやマージで使用されていることを示します。 + +- `min_date` ([Date](../../sql-reference/data-types/date.md)) – データパーツ内の日付キーの最小値。 + +- `max_date` ([Date](../../sql-reference/data-types/date.md)) – データパーツ内の日付キーの最大値。 + +- `min_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – データパーツ内の日付と時間キーの最小値。 + +- `max_time` ([DateTime](../../sql-reference/data-types/datetime.md)) – データパーツ内の日付と時間キーの最大値。 + +- `partition_id` ([String](../../sql-reference/data-types/string.md)) – パーティションのID。 + +- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – マージ後の現在のパーツを構成する最小のデータパーツ数。 + +- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) – マージ後の現在のパーツを構成する最大のデータパーツ数。 + +- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) – マージツリーの深さ。0は、現在のパーツが他のパーツとのマージではなく挿入によって作成されたことを意味します。 + +- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) – データパーツに適用すべきミューテーションを判断するために使用される番号(`data_version` より高いバージョンのミューテーションが適用される)。 + +- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) – 主キー値のメモリ使用量(バイト単位)。 + +- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) – 主キー値のために予約されたメモリ量(バイト単位)。 + +- `is_frozen` ([UInt8](../../sql-reference/data-types/int-uint.md)) – パーティションデータのバックアップが存在することを示すフラグ。1は存在することを示し、0は存在しないことを示します。詳細は [FREEZE PARTITION](../../sql-reference/statements/alter/partition.md/#alter_freeze-partition) を参照してください。 + +- `database` ([String](../../sql-reference/data-types/string.md)) – データベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) – テーブルの名前。 + +- `engine` ([String](../../sql-reference/data-types/string.md)) – パラメータを含まないテーブルエンジンの名前。 + +- `path` ([String](../../sql-reference/data-types/string.md)) – データパーツファイルのフォルダへの絶対パス。 + +- `disk_name` ([String](../../sql-reference/data-types/string.md)) – データパーツを保存しているディスクの名前。 + +- `hash_of_all_files` ([String](../../sql-reference/data-types/string.md)) – 圧縮ファイルの [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128)。 + +- `hash_of_uncompressed_files` ([String](../../sql-reference/data-types/string.md)) – 非圧縮ファイル(マーク付きのファイル、インデックスファイルなど)の [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128)。 + +- `uncompressed_hash_of_compressed_files` ([String](../../sql-reference/data-types/string.md)) – 圧縮ファイルが非圧縮であるかのようにデータ内の [sipHash128](../../sql-reference/functions/hash-functions.md/#hash_functions-siphash128)。 + +- `delete_ttl_info_min` ([DateTime](../../sql-reference/data-types/datetime.md)) — [TTL DELETE ルール](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl)のための日付と時間キーの最小値。 + +- `delete_ttl_info_max` ([DateTime](../../sql-reference/data-types/datetime.md)) — [TTL DELETE ルール](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl)のための日付と時間キーの最大値。 + +- `move_ttl_info.expression` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — 式の配列。各式は[TLL MOVE ルール](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl)を定義します。 + +:::note +`move_ttl_info.expression` 配列は主に後方互換性のために保持されています。現在、`TTL MOVE` ルールを確認する最も簡単な方法は `move_ttl_info.min` と `move_ttl_info.max` フィールドを使用することです。 +::: + +- `move_ttl_info.min` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — 日付と時間の値の配列。各要素は [TTL MOVE ルール](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl)のためのキー値の最小値を示します。 + +- `move_ttl_info.max` ([Array](../../sql-reference/data-types/array.md)([DateTime](../../sql-reference/data-types/datetime.md))) — 日付と時間の値の配列。各要素は [TTL MOVE ルール](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl)のためのキー値の最大値を示します。 + +- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) – `bytes_on_disk` の別名。 + +- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) – `marks_bytes` の別名。 + +**例** + +``` sql +SELECT * FROM system.parts LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +partition: tuple() +name: all_1_4_1_6 +part_type: Wide +active: 1 +marks: 2 +rows: 6 +bytes_on_disk: 310 +data_compressed_bytes: 157 +data_uncompressed_bytes: 91 +secondary_indices_compressed_bytes: 58 +secondary_indices_uncompressed_bytes: 6 +secondary_indices_marks_bytes: 48 +marks_bytes: 144 +modification_time: 2020-06-18 13:01:49 +remove_time: 1970-01-01 00:00:00 +refcount: 1 +min_date: 1970-01-01 +max_date: 1970-01-01 +min_time: 1970-01-01 00:00:00 +max_time: 1970-01-01 00:00:00 +partition_id: all +min_block_number: 1 +max_block_number: 4 +level: 1 +data_version: 6 +primary_key_bytes_in_memory: 8 +primary_key_bytes_in_memory_allocated: 64 +is_frozen: 0 +database: default +table: months +engine: MergeTree +disk_name: default +path: /var/lib/clickhouse/data/default/months/all_1_4_1_6/ +hash_of_all_files: 2d0657a16d9430824d35e327fcbd87bf +hash_of_uncompressed_files: 84950cc30ba867c77a408ae21332ba29 +uncompressed_hash_of_compressed_files: 1ad78f1c6843bbfb99a2c931abe7df7d +delete_ttl_info_min: 1970-01-01 00:00:00 +delete_ttl_info_max: 1970-01-01 00:00:00 +move_ttl_info.expression: [] +move_ttl_info.min: [] +move_ttl_info.max: [] +``` + +**関連項目** + +- [MergeTree ファミリー](../../engines/table-engines/mergetree-family/mergetree.md) +- [カラムとテーブルのTTL](../../engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-ttl) diff --git a/docs/ja/operations/system-tables/parts_columns.md b/docs/ja/operations/system-tables/parts_columns.md new file mode 100644 index 00000000000..f367368cab8 --- /dev/null +++ b/docs/ja/operations/system-tables/parts_columns.md @@ -0,0 +1,149 @@ +--- +slug: /ja/operations/system-tables/parts_columns +--- +# parts_columns + +[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのパーツとカラムに関する情報を含みます。 + +各行は一つのデータパーツを示します。 + +カラム: + +- `partition` ([String](../../sql-reference/data-types/string.md)) — パーティション名。[ALTER](../../sql-reference/statements/alter/index.md#query_language_queries_alter) クエリの説明を参照して、パーティションが何かを学んでください。 + + フォーマット: + + - `YYYYMM` 自動月ごとのパーティション分割の場合。 + - `any_string` 手動でのパーティション分割の場合。 + +- `name` ([String](../../sql-reference/data-types/string.md)) — データパーツの名前。 + +- `part_type` ([String](../../sql-reference/data-types/string.md)) — データパーツの保存フォーマット。 + + 可能な値: + + - `Wide` — 各カラムがファイルシステム内の別個のファイルに保存されています。 + - `Compact` — 全カラムがファイルシステム内の一つのファイルに保存されています。 + + データ保存フォーマットは、[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルの `min_bytes_for_wide_part` と `min_rows_for_wide_part` 設定によって制御されます。 + +- `active` ([UInt8](../../sql-reference/data-types/int-uint.md)) — データパーツがアクティブかどうかを示すフラグ。データパーツがアクティブであればテーブルで使用され、そうでなければ削除されます。非アクティブなデータパーツはマージ後に残ります。 + +- `marks` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マークの数。データパーツ内の行数を概算するためには、`marks` をインデックス粒度(通常8192)と掛けてください(このヒントは適応的な粒度では機能しません)。 + +- `rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 行数。 + +- `bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — すべてのデータパーツファイルの合計サイズ(バイト単位)。 + +- `data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパーツ内の圧縮データの総サイズ。補助ファイル(例えば、マークファイルなど)は含まれていません。 + +- `data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパーツ内の非圧縮データの総サイズ。補助ファイル(例えば、マークファイルなど)は含まれていません。 + +- `marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マークを含むファイルのサイズ。 + +- `modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — データパーツが含まれるディレクトリが変更された時間。これは通常、データパーツの作成時間に相当します。 + +- `remove_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — データパーツが非アクティブになった時間。 + +- `refcount` ([UInt32](../../sql-reference/data-types/int-uint.md)) — データパーツが使用されている場所の数。2より大きい値は、データパーツがクエリやマージで使用されていることを示します。 + +- `min_date` ([Date](../../sql-reference/data-types/date.md)) — データパーツ内の日付キーの最小値。 + +- `max_date` ([Date](../../sql-reference/data-types/date.md)) — データパーツ内の日付キーの最大値。 + +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — パーティションのID。 + +- `min_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マージ後に現在のパーツを構成するデータパーツの最小数。 + +- `max_block_number` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マージ後に現在のパーツを構成するデータパーツの最大数。 + +- `level` ([UInt32](../../sql-reference/data-types/int-uint.md)) — マージツリーの深さ。ゼロは、現在のパーツが他のパーツと合併されたのではなく、挿入によって作成されたことを意味します。 + +- `data_version` ([UInt64](../../sql-reference/data-types/int-uint.md)) — データパーツに適用されるべき変更を決定するために使用される番号(`data_version` よりもバージョンが高い変更)。 + +- `primary_key_bytes_in_memory` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 主キー値に使用されるメモリの量(バイト単位)。 + +- `primary_key_bytes_in_memory_allocated` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 主キー値のために予約されているメモリの量(バイト単位)。 + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブルの名前。 + +- `engine` ([String](../../sql-reference/data-types/string.md)) — パラメータなしのテーブルエンジンの名前。 + +- `disk_name` ([String](../../sql-reference/data-types/string.md)) — データパーツを保存するディスク名。 + +- `path` ([String](../../sql-reference/data-types/string.md)) — データパーツファイルが含まれるフォルダへの絶対パス。 + +- `column` ([String](../../sql-reference/data-types/string.md)) — カラムの名前。 + +- `type` ([String](../../sql-reference/data-types/string.md)) — カラムタイプ。 + +- `column_position` ([UInt64](../../sql-reference/data-types/int-uint.md)) — テーブル内のカラムの序数位置(1から始まる)。 + +- `default_kind` ([String](../../sql-reference/data-types/string.md)) — デフォルト値の式タイプ(`DEFAULT`、`MATERIALIZED`、`ALIAS`)、または定義されていない場合は空文字列。 + +- `default_expression` ([String](../../sql-reference/data-types/string.md)) — デフォルト値の式、または定義されていない場合は空文字列。 + +- `column_bytes_on_disk` ([UInt64](../../sql-reference/data-types/int-uint.md)) — カラムの合計サイズ(バイト単位)。 + +- `column_data_compressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — カラム内の圧縮データの総サイズ(バイト単位)。 + +- `column_data_uncompressed_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — カラム内の非圧縮データの総サイズ(バイト単位)。 + +- `column_marks_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — マークを含むカラムのサイズ(バイト単位)。 + +- `bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `bytes_on_disk` のエイリアス。 + +- `marks_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `marks_bytes` のエイリアス。 + +**例** + +``` sql +SELECT * FROM system.parts_columns LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +partition: tuple() +name: all_1_2_1 +part_type: Wide +active: 1 +marks: 2 +rows: 2 +bytes_on_disk: 155 +data_compressed_bytes: 56 +data_uncompressed_bytes: 4 +marks_bytes: 96 +modification_time: 2020-09-23 10:13:36 +remove_time: 2106-02-07 06:28:15 +refcount: 1 +min_date: 1970-01-01 +max_date: 1970-01-01 +partition_id: all +min_block_number: 1 +max_block_number: 2 +level: 1 +data_version: 1 +primary_key_bytes_in_memory: 2 +primary_key_bytes_in_memory_allocated: 64 +database: default +table: 53r93yleapyears +engine: MergeTree +disk_name: default +path: /var/lib/clickhouse/data/default/53r93yleapyears/all_1_2_1/ +column: id +type: Int8 +column_position: 1 +default_kind: +default_expression: +column_bytes_on_disk: 76 +column_data_compressed_bytes: 28 +column_data_uncompressed_bytes: 2 +column_marks_bytes: 48 +``` + +**関連項目** + +- [MergeTree ファミリー](../../engines/table-engines/mergetree-family/mergetree.md) diff --git a/docs/ja/operations/system-tables/processes.md b/docs/ja/operations/system-tables/processes.md new file mode 100644 index 00000000000..e41efd3abde --- /dev/null +++ b/docs/ja/operations/system-tables/processes.md @@ -0,0 +1,65 @@ +--- +slug: /ja/operations/system-tables/processes +--- +# processes + +このシステムテーブルは、`SHOW PROCESSLIST` クエリを実装するために使用されます。 + +カラム: + +- `user` (String) – クエリを実行したユーザー。分散処理の場合、クエリは `default` ユーザーでリモートサーバーに送信されます。このフィールドには特定のクエリのユーザー名が含まれ、このクエリが起動したクエリのユーザー名は含まれません。 +- `address` (String) – リクエストが行われたIPアドレス。分散処理でも同様です。分散クエリが最初にどこで行われたかを追跡するには、クエリをリクエストしたサーバーの `system.processes` を確認してください。 +- `elapsed` (Float64) – リクエスト実行が開始されてからの経過時間(秒)。 +- `read_rows` (UInt64) – テーブルから読み取った行の数。分散処理の場合、リクエスタサーバーでは、すべてのリモートサーバーの合計となります。 +- `read_bytes` (UInt64) – テーブルから読み取った非圧縮バイト数。分散処理の場合、リクエスタサーバーでは、すべてのリモートサーバーの合計となります。 +- `total_rows_approx` (UInt64) – 読み取るべき総行数の概算。分散処理の場合、リクエスタサーバーでは、すべてのリモートサーバーの合計となります。新しい処理対象が判明したときに、リクエスト処理中に更新されることがあります。 +- `memory_usage` (Int64) – リクエストが使用するRAMの量。専用メモリの一部のタイプは含まれない場合があります。[max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) 設定を参照してください。 +- `query` (String) – クエリテキスト。`INSERT`の場合、挿入するデータは含まれません。 +- `query_id` (String) – クエリIDが定義されている場合。 +- `is_cancelled` (UInt8) – クエリがキャンセルされたかどうか。 +- `is_all_data_sent` (UInt8) – クライアントにすべてのデータが送信されたかどうか(つまり、クエリがサーバー上で完了したかどうか)。 + +```sql +SELECT * FROM system.processes LIMIT 10 FORMAT Vertical; +``` + +```response +Row 1: +────── +is_initial_query: 1 +user: default +query_id: 35a360fa-3743-441d-8e1f-228c938268da +address: ::ffff:172.23.0.1 +port: 47588 +initial_user: default +initial_query_id: 35a360fa-3743-441d-8e1f-228c938268da +initial_address: ::ffff:172.23.0.1 +initial_port: 47588 +interface: 1 +os_user: bharatnc +client_hostname: tower +client_name: ClickHouse +client_revision: 54437 +client_version_major: 20 +client_version_minor: 7 +client_version_patch: 2 +http_method: 0 +http_user_agent: +quota_key: +elapsed: 0.000582537 +is_cancelled: 0 +is_all_data_sent: 0 +read_rows: 0 +read_bytes: 0 +total_rows_approx: 0 +written_rows: 0 +written_bytes: 0 +memory_usage: 0 +peak_memory_usage: 0 +query: SELECT * from system.processes LIMIT 10 FORMAT Vertical; +thread_ids: [67] +ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'CompressedReadBufferBlocks':1,'CompressedReadBufferBytes':10,'IOBufferAllocs':1,'IOBufferAllocBytes':89,'ContextLock':15,'RWLockAcquiredReadLocks':1} +Settings: {'background_pool_size':'32','load_balancing':'random','allow_suspicious_low_cardinality_types':'1','distributed_aggregation_memory_efficient':'1','skip_unavailable_shards':'1','log_queries':'1','max_bytes_before_external_group_by':'20000000000','max_bytes_before_external_sort':'20000000000','allow_introspection_functions':'1'} + +1 rows in set. Elapsed: 0.002 sec. +``` diff --git a/docs/ja/operations/system-tables/processors_profile_log.md b/docs/ja/operations/system-tables/processors_profile_log.md new file mode 100644 index 00000000000..c86bebd8fbf --- /dev/null +++ b/docs/ja/operations/system-tables/processors_profile_log.md @@ -0,0 +1,80 @@ +# processors_profile_log + +このテーブルはプロセッサーレベルのプロファイリングを含んでいます([`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline)で確認できます)。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントが発生した日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントが発生した日時。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — イベントが発生した日時(マイクロ秒精度)。 +- `id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — プロセッサーのID。 +- `parent_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — 親プロセッサーのID。 +- `plan_step` ([UInt64](../../sql-reference/data-types/int-uint.md)) — このプロセッサーを作成したクエリプランステップのID。プロセッサーが任意のステップから追加されていない場合はゼロ。 +- `plan_group` ([UInt64](../../sql-reference/data-types/int-uint.md)) — クエリプランステップによって作成された場合のプロセッサーのグループ。同じクエリプランステップから追加されたプロセッサーの論理的な区分で、美化されたEXPLAIN PIPELINEの結果に使用される。 +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — 初期クエリのID(分散クエリ実行のため)。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — クエリのID。 +- `name` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — プロセッサーの名前。 +- `elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — このプロセッサーが実行されたマイクロ秒の数。 +- `input_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 他のプロセッサーからのデータを待機していたマイクロ秒の数。 +- `output_wait_elapsed_us` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 出力ポートがいっぱいのため待機していたマイクロ秒の数。 +- `input_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — プロセッサーによって消費された行の数。 +- `input_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — プロセッサーによって消費されたバイト数。 +- `output_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — プロセッサーによって生成された行の数。 +- `output_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — プロセッサーによって生成されたバイト数。 + +**例** + +クエリ: + +``` sql +EXPLAIN PIPELINE +SELECT sleep(1) +┌─explain─────────────────────────┐ +│ (Expression) │ +│ ExpressionTransform │ +│ (SettingQuotaAndLimits) │ +│ (ReadFromStorage) │ +│ SourceFromSingleChunk 0 → 1 │ +└─────────────────────────────────┘ + +SELECT sleep(1) +SETTINGS log_processors_profiles = 1 +Query id: feb5ed16-1c24-4227-aa54-78c02b3b27d4 +┌─sleep(1)─┐ +│ 0 │ +└──────────┘ +1 rows in set. Elapsed: 1.018 sec. + +SELECT + name, + elapsed_us, + input_wait_elapsed_us, + output_wait_elapsed_us +FROM system.processors_profile_log +WHERE query_id = 'feb5ed16-1c24-4227-aa54-78c02b3b27d4' +ORDER BY name ASC +``` + +結果: + +``` text +┌─name────────────────────┬─elapsed_us─┬─input_wait_elapsed_us─┬─output_wait_elapsed_us─┐ +│ ExpressionTransform │ 1000497 │ 2823 │ 197 │ +│ LazyOutputFormat │ 36 │ 1002188 │ 0 │ +│ LimitsCheckingTransform │ 10 │ 1002994 │ 106 │ +│ NullSource │ 5 │ 1002074 │ 0 │ +│ NullSource │ 1 │ 1002084 │ 0 │ +│ SourceFromSingleChunk │ 45 │ 4736 │ 1000819 │ +└─────────────────────────┴────────────┴───────────────────────┴────────────────────────┘ +``` + +ここで見ることができるのは: + +- `ExpressionTransform` は `sleep(1)` 関数を実行しており、そのため `work` は1e6を取り、`elapsed_us` > 1e6。 +- `SourceFromSingleChunk` は待機が必要で、`ExpressionTransform` は `sleep(1)` の実行中にデータを受け入れないため、`PortFull` 状態で1e6 us待機する必要があり、`output_wait_elapsed_us` > 1e6。 +- `LimitsCheckingTransform`/`NullSource`/`LazyOutputFormat` は、`ExpressionTransform` が `sleep(1)` を実行して結果を処理するまで待機する必要があるため、`input_wait_elapsed_us` > 1e6。 + +**参照** + +- [`EXPLAIN PIPELINE`](../../sql-reference/statements/explain.md#explain-pipeline) diff --git a/docs/ja/operations/system-tables/projections.md b/docs/ja/operations/system-tables/projections.md new file mode 100644 index 00000000000..28e4be9708d --- /dev/null +++ b/docs/ja/operations/system-tables/projections.md @@ -0,0 +1,41 @@ +--- +slug: /ja/operations/system-tables/projections +--- +# projections + +すべてのテーブルにおける既存のプロジェクションに関する情報を含みます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベース名。 +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `name` ([String](../../sql-reference/data-types/string.md)) — プロジェクション名。 +- `type` ([Enum](../../sql-reference/data-types/enum.md)) — プロジェクションのタイプ ('Normal' = 0, 'Aggregate' = 1)。 +- `sorting_key` ([Array(String)](../../sql-reference/data-types/array.md)) — プロジェクションのソートキー。 +- `query` ([String](../../sql-reference/data-types/string.md)) — プロジェクションのクエリ。 + +**例** + +```sql +SELECT * FROM system.projections LIMIT 2 FORMAT Vertical; +``` + +```text +Row 1: +────── +database: default +table: landing +name: improved_sorting_key +type: Normal +sorting_key: ['user_id','date'] +query: SELECT * ORDER BY user_id, date + +Row 2: +────── +database: default +table: landing +name: agg_no_key +type: Aggregate +sorting_key: [] +query: SELECT count() +``` diff --git a/docs/ja/operations/system-tables/query_cache.md b/docs/ja/operations/system-tables/query_cache.md new file mode 100644 index 00000000000..86d5bf76a29 --- /dev/null +++ b/docs/ja/operations/system-tables/query_cache.md @@ -0,0 +1,38 @@ +--- +slug: /ja/operations/system-tables/query_cache +--- +# query_cache + +[クエリキャッシュ](../query-cache.md)の内容を表示します。 + +カラム: + +- `query` ([String](../../sql-reference/data-types/string.md)) — クエリ文字列。 +- `result_size` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリキャッシュエントリのサイズ。 +- `tag` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — クエリキャッシュエントリのタグ。 +- `stale` ([UInt8](../../sql-reference/data-types/int-uint.md)) — クエリキャッシュエントリが古いかどうか。 +- `shared` ([UInt8](../../sql-reference/data-types/int-uint.md)) — クエリキャッシュエントリが複数ユーザー間で共有されているかどうか。 +- `compressed` ([UInt8](../../sql-reference/data-types/int-uint.md)) — クエリキャッシュエントリが圧縮されているかどうか。 +- `expires_at` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリキャッシュエントリが古くなる時刻。 +- `key_hash` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ文字列のハッシュで、クエリキャッシュエントリを見つけるためのキーとして使用される。 + +**例** + +``` sql +SELECT * FROM system.query_cache FORMAT Vertical; +``` + +``` text +Row 1: +────── +query: SELECT 1 SETTINGS use_query_cache = 1 +result_size: 128 +tag: +stale: 0 +shared: 0 +compressed: 1 +expires_at: 2023-10-13 13:35:45 +key_hash: 12188185624808016954 + +1 row in set. Elapsed: 0.004 sec. +``` diff --git a/docs/ja/operations/system-tables/query_log.md b/docs/ja/operations/system-tables/query_log.md new file mode 100644 index 00000000000..510edb6bccd --- /dev/null +++ b/docs/ja/operations/system-tables/query_log.md @@ -0,0 +1,206 @@ +--- +slug: /ja/operations/system-tables/query_log +--- +# query_log + +実行されたクエリに関する情報を含んでいます。例えば、開始時間、処理の持続時間、エラーメッセージなどがあります。 + +:::note +このテーブルは `INSERT` クエリの投入データを含んでいません。 +::: + +クエリのロギング設定はサーバー構成の[query_log](../../operations/server-configuration-parameters/settings.md#query-log)セクションで変更できます。 + +クエリのロギングを無効にするには、[log_queries = 0](../../operations/settings/settings.md#log-queries)を設定します。しかし、問題解決のためにこのテーブルの情報は重要であるため、ロギングをオフにすることは推奨しません。 + +データのフラッシュ期間は、サーバー設定の[query_log](../../operations/server-configuration-parameters/settings.md#query-log)セクションの `flush_interval_milliseconds` パラメータで設定されています。強制的にフラッシュするには、[SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) クエリを使用してください。 + +ClickHouseはテーブルからデータを自動的に削除しません。詳細は[導入](../../operations/system-tables/index.md#system-tables-introduction)を参照してください。 + +`system.query_log` テーブルは2種類のクエリを登録します: + +1. クライアントによって直接実行された初期クエリ。 +2. 他のクエリによって開始された子クエリ(分散クエリ実行のため)。これらのタイプのクエリについては、親クエリに関する情報が `initial_*` カラムに表示されます。 + +各クエリは、そのステータス(`type` カラムを参照)に応じて、`query_log` テーブルに1または2行を生成します: + +1. クエリ実行が成功した場合、`QueryStart` および `QueryFinish` タイプの2行が生成されます。 +2. クエリ処理中にエラーが発生した場合、`QueryStart` および `ExceptionWhileProcessing` タイプの2つのイベントが生成されます。 +3. クエリ開始前にエラーが発生した場合、`ExceptionBeforeStart` タイプの単一のイベントが生成されます。 + +[log_queries_probability](../../operations/settings/settings.md#log-queries-probability) 設定を使用して、`query_log` テーブルに登録されるクエリ数を減らすことができます。 + +[log_formatted_queries](../../operations/settings/settings.md#log-formatted-queries) 設定を使用して、フォーマットされたクエリを `formatted_query` カラムにログできます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — クエリの実行時に発生したイベントのタイプ。値: + - `'QueryStart' = 1` — クエリ実行の成功した開始。 + - `'QueryFinish' = 2` — クエリ実行の成功した終了。 + - `'ExceptionBeforeStart' = 3` — クエリ実行の開始前に発生した例外。 + - `'ExceptionWhileProcessing' = 4` — クエリ実行中に発生した例外。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — クエリの開始日。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリの開始時間。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度のクエリの開始時間。 +- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリ実行の開始時間。 +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度のクエリ実行開始時間。 +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ実行の持続時間(ミリ秒)。 +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ実行に参加するすべてのテーブルおよびテーブル関数から読み取られた行の合計数。通常のサブクエリ、`IN` および `JOIN` のサブクエリを含む。分散クエリに対して `read_rows` はすべてのレプリカで読み取られた行の合計数を含む。各レプリカは `read_rows` 値を送信し、クエリのサーバー発信者はすべての受信およびローカル値をまとめる。キャッシュのボリュームはこの値に影響を与えません。 +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ実行に参加するすべてのテーブルおよびテーブル関数から読み取られたバイト数の合計。通常のサブクエリ、`IN` および `JOIN` のサブクエリを含む。分散クエリに対して `read_bytes` はすべてのレプリカで読み取られた行の合計数を含む。各レプリカは `read_bytes` 値を送信し、クエリのサーバー発信者はすべての受信およびローカル値をまとめる。キャッシュのボリュームはこの値に影響を与えません。 +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `INSERT` クエリに対して、書き込まれた行の数。その他のクエリでは0。 +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `INSERT` クエリに対して、書き込まれたバイト数(未圧縮)。その他のクエリでは0。 +- `result_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `SELECT` クエリの結果の行数、または `INSERT` クエリの行数。 +- `result_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ結果を保存するために使用されるRAMのバイト数。 +- `memory_usage` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリによるメモリ消費。 +- `current_database` ([String](../../sql-reference/data-types/string.md)) — 現在のデータベースの名前。 +- `query` ([String](../../sql-reference/data-types/string.md)) — クエリ文字列。 +- `formatted_query` ([String](../../sql-reference/data-types/string.md)) — フォーマットされたクエリ文字列。 +- `normalized_query_hash` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 類似したクエリのリテラル値を除いた同一のハッシュ値。 +- `query_kind` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) — クエリの種類。 +- `databases` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — クエリに存在するデータベースの名前。 +- `tables` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — クエリに存在するテーブルの名前。 +- `columns` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — クエリに存在するカラムの名前。 +- `partitions` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — クエリに存在するパーティションの名前。 +- `projections` ([String](../../sql-reference/data-types/string.md)) — クエリ実行中に使用されたプロジェクションの名前。 +- `views` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — クエリに存在する (マテリアライズドまたはライブ) ビューの名前。 +- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — 例外コード。 +- `exception` ([String](../../sql-reference/data-types/string.md)) — 例外メッセージ。 +- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [スタックトレース](https://en.wikipedia.org/wiki/Stack_trace)。クエリが正常に完了した場合は空文字列。 +- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md)) — クエリタイプ。可能な値: + - 1 — クライアントによって開始されたクエリ。 + - 0 — 他のクエリによって開始されたクエリ(分散クエリ実行の一部)。 +- `user` ([String](../../sql-reference/data-types/string.md)) — 現在のクエリを開始したユーザーの名前。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — クエリのID。 +- `address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — クエリを行うために使用されたIPアドレス。 +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — クエリを行うために使用されたクライアントポート。 +- `initial_user` ([String](../../sql-reference/data-types/string.md)) — 初期クエリ(分散クエリ実行)の実行者であるユーザーの名前。 +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — 初期クエリ(分散クエリ実行)のID。 +- `initial_address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — 親クエリが起動されたIPアドレス。 +- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — 親クエリを行うために使用されたクライアントポート。 +- `initial_query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 初期クエリの開始時間(分散クエリ実行)。 +- `initial_query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度の初期クエリ開始時間(分散クエリ実行)。 +- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md)) — クエリが開始されたインターフェイス。可能な値: + - 1 — TCP。 + - 2 — HTTP。 +- `os_user` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md)を実行するOSユーザー名。 +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントが実行されているクライアントマシンのホスト名。 +- `client_name` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントの名前。 +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントのリビジョン。 +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントの主バージョン。 +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントの副バージョン。 +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md)または別のTCPクライアントのパッチバージョン。 +- `http_method` (UInt8) — クエリを開始したHTTPメソッド。可能な値: + - 0 — クエリはTCPインターフェースから起動。 + - 1 — `GET` メソッドが使用された。 + - 2 — `POST` メソッドが使用された。 +- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — HTTPクエリで渡されたHTTPヘッダー `UserAgent`。 +- `http_referer` ([String](../../sql-reference/data-types/string.md)) — HTTPクエリで渡されたHTTPヘッダー `Referer`(クエリを行うページの絶対または部分アドレスを含む)。 +- `forwarded_for` ([String](../../sql-reference/data-types/string.md)) — HTTPクエリで渡されたHTTPヘッダー `X-Forwarded-For`。 +- `quota_key` ([String](../../sql-reference/data-types/string.md)) — [quotas](../../operations/quotas.md) 設定で指定された `quota key`(`keyed` を参照)。 +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouseのリビジョン。 +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/map.md)) — 異なるメトリクスを測定するProfileEvents。それらの説明はテーブル [system.events](../../operations/system-tables/events.md#system_tables-events) で見つけることができます。 +- `Settings` ([Map(String, String)](../../sql-reference/data-types/map.md)) — クライアントがクエリを実行したときに変更された設定。設定の変更をログに記録するには、`log_query_settings` パラメータを1に設定してください。 +- `log_comment` ([String](../../sql-reference/data-types/string.md)) — ログコメント。[max_query_size](../../operations/settings/settings.md#max_query_size) より長くない任意の文字列に設定できます。定義されていない場合は空文字列。 +- `thread_ids` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — クエリ実行に参加するスレッドID。これらのスレッドは必ずしも同時に動作していたとは限りません。 +- `peak_threads_usage` ([UInt64)](../../sql-reference/data-types/int-uint.md)) — クエリを実行する同時スレッドの最大数。 +- `used_aggregate_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `集約関数` の標準名。 +- `used_aggregate_function_combinators` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `集約関数コンビネータ` の標準名。 +- `used_database_engines` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `データベースエンジン` の標準名。 +- `used_data_type_families` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `データタイプファミリー` の標準名。 +- `used_dictionaries` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `Dictionary` の標準名。XMLファイルを使用して設定されたDictionaryの場合、Dictionaryの名前となり、SQL文で作成されたDictionaryの場合、標準名は完全修飾されたオブジェクト名となります。 +- `used_formats` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `フォーマット` の標準名。 +- `used_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `関数` の標準名。 +- `used_storages` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `ストレージ` の標準名。 +- `used_table_functions` ([Array(String)](../../sql-reference/data-types/array.md)) — クエリ実行中に使用された `テーブル関数` の標準名。 +- `used_privileges` ([Array(String)](../../sql-reference/data-types/array.md)) - クエリ実行中に正常にチェックされた権限。 +- `missing_privileges` ([Array(String)](../../sql-reference/data-types/array.md)) - クエリ実行中に不足している権限。 +- `query_cache_usage` ([Enum8](../../sql-reference/data-types/enum.md)) — クエリ実行中の[クエリキャッシュ](../query-cache.md)の使用。値: + - `'Unknown'` = ステータス不明。 + - `'None'` = クエリ結果がクエリキャッシュに書き込まれず、または読み出されない。 + - `'Write'` = クエリ結果がクエリキャッシュに書き込まれた。 + - `'Read'` = クエリ結果がクエリキャッシュから読み出された。 + +**例** + +``` sql +SELECT * FROM system.query_log WHERE type = 'QueryFinish' ORDER BY query_start_time DESC LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +type: QueryFinish +event_date: 2021-11-03 +event_time: 2021-11-03 16:13:54 +event_time_microseconds: 2021-11-03 16:13:54.953024 +query_start_time: 2021-11-03 16:13:54 +query_start_time_microseconds: 2021-11-03 16:13:54.952325 +query_duration_ms: 0 +read_rows: 69 +read_bytes: 6187 +written_rows: 0 +written_bytes: 0 +result_rows: 69 +result_bytes: 48256 +memory_usage: 0 +current_database: default +query: DESCRIBE TABLE system.query_log +formatted_query: +normalized_query_hash: 8274064835331539124 +query_kind: +databases: [] +tables: [] +columns: [] +projections: [] +views: [] +exception_code: 0 +exception: +stack_trace: +is_initial_query: 1 +user: default +query_id: 7c28bbbb-753b-4eba-98b1-efcbe2b9bdf6 +address: ::ffff:127.0.0.1 +port: 40452 +initial_user: default +initial_query_id: 7c28bbbb-753b-4eba-98b1-efcbe2b9bdf6 +initial_address: ::ffff:127.0.0.1 +initial_port: 40452 +initial_query_start_time: 2021-11-03 16:13:54 +initial_query_start_time_microseconds: 2021-11-03 16:13:54.952325 +interface: 1 +os_user: sevirov +client_hostname: clickhouse.eu-central1.internal +client_name: ClickHouse +client_revision: 54449 +client_version_major: 21 +client_version_minor: 10 +client_version_patch: 1 +http_method: 0 +http_user_agent: +http_referer: +forwarded_for: +quota_key: +revision: 54456 +log_comment: +thread_ids: [30776,31174] +ProfileEvents: {'Query':1,'NetworkSendElapsedMicroseconds':59,'NetworkSendBytes':2643,'SelectedRows':69,'SelectedBytes':6187,'ContextLock':9,'RWLockAcquiredReadLocks':1,'RealTimeMicroseconds':817,'UserTimeMicroseconds':427,'SystemTimeMicroseconds':212,'OSCPUVirtualTimeMicroseconds':639,'OSReadChars':894,'OSWriteChars':319} +Settings: {'load_balancing':'random','max_memory_usage':'10000000000'} +used_aggregate_functions: [] +used_aggregate_function_combinators: [] +used_database_engines: [] +used_data_type_families: [] +used_dictionaries: [] +used_formats: [] +used_functions: [] +used_storages: [] +used_table_functions: [] +used_privileges: [] +missing_privileges: [] +query_cache_usage: None +``` + +**関連項目** + +- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — 各クエリ実行スレッドに関する情報を含むテーブルです。 diff --git a/docs/ja/operations/system-tables/query_metric_log.md b/docs/ja/operations/system-tables/query_metric_log.md new file mode 100644 index 00000000000..7759581b729 --- /dev/null +++ b/docs/ja/operations/system-tables/query_metric_log.md @@ -0,0 +1,48 @@ +--- +slug: /ja/operations/system-tables/query_metric_log +--- +# query_metric_log + +個別のクエリに関するメモリとメトリック値の履歴を、`system.events` テーブルから取得し、定期的にディスクにフラッシュします。 + +クエリが開始されると、データは `query_metric_log_interval` ミリ秒ごとの間隔で収集されます(デフォルトでは1000に設定されています)。クエリが `query_metric_log_interval` より長く続く場合、クエリ終了時にもデータが収集されます。 + +カラム: +- `query_id` ([String](../../sql-reference/data-types/string.md)) — クエリのID。 +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — イベントの時間。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒単位の解像度を持つイベント時間。 + +**例** + +``` sql +SELECT * FROM system.query_metric_log LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +query_id: 97c8ba04-b6d4-4bd7-b13e-6201c5c6e49d +hostname: clickhouse.eu-central1.internal +event_date: 2020-09-05 +event_time: 2020-09-05 16:22:33 +event_time_microseconds: 2020-09-05 16:22:33.196807 +memory_usage: 313434219 +peak_memory_usage: 598951986 +ProfileEvent_Query: 0 +ProfileEvent_SelectQuery: 0 +ProfileEvent_InsertQuery: 0 +ProfileEvent_FailedQuery: 0 +ProfileEvent_FailedSelectQuery: 0 +... +``` + +**関連情報** + +- [query_metric_log 設定](../../operations/server-configuration-parameters/settings.md#query_metric_log) — 設定の有効化と無効化。 +- [query_metric_log_interval](../../operations/settings/settings.md#query_metric_log_interval) +- [system.asynchronous_metrics](../../operations/system-tables/asynchronous_metrics.md) — 定期的に計算されるメトリックを含んでいます。 +- [system.events](../../operations/system-tables/events.md#system_tables-events) — 発生したイベントの数を含んでいます。 +- [system.metrics](../../operations/system-tables/metrics.md) — 即時に計算されるメトリックを含んでいます。 +- [モニタリング](../../operations/monitoring.md) — ClickHouseモニタリングの基本概念。 diff --git a/docs/ja/operations/system-tables/query_thread_log.md b/docs/ja/operations/system-tables/query_thread_log.md new file mode 100644 index 00000000000..aa2f65bf1f5 --- /dev/null +++ b/docs/ja/operations/system-tables/query_thread_log.md @@ -0,0 +1,121 @@ +--- +slug: /ja/operations/system-tables/query_thread_log +--- +# query_thread_log + +クエリを実行するスレッドに関する情報を含んでいます。例えば、スレッド名、スレッドの開始時間、クエリ処理の所要時間などです。 + +ログ記録を開始するには: + +1. [query_thread_log](../../operations/server-configuration-parameters/settings.md#query_thread_log) セクションでパラメーターを設定します。 +2. [log_query_threads](../../operations/settings/settings.md#log-query-threads) を1に設定します。 + +データのフラッシュ期間は、[query_thread_log](../../operations/server-configuration-parameters/settings.md#query_thread_log) サーバー設定セクションの `flush_interval_milliseconds` パラメーターで設定します。フラッシュを強制するには、[SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) クエリを使用します。 + +ClickHouse はテーブルからデータを自動的に削除しません。詳細は[紹介](../../operations/system-tables/index.md#system-tables-introduction)を参照してください。 + +`query_thread_log` テーブルに登録されるクエリの数を減らすには、[log_queries_probability](../../operations/settings/settings.md#log-queries-probability) 設定を使用できます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — スレッドがクエリの実行を終了した日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — スレッドがクエリの実行を終了した日時。 +- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — マイクロ秒精度でスレッドがクエリの実行を終了した日時。 +- `query_start_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — クエリ実行の開始時間。 +- `query_start_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度でのクエリ実行の開始時間。 +- `query_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリ実行の所要時間。 +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 読み取られた行数。 +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 読み取られたバイト数。 +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `INSERT` クエリの場合、書き込まれた行数。他のクエリの場合は、このカラムの値は0です。 +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `INSERT` クエリの場合、書き込まれたバイト数。他のクエリの場合は、このカラムの値は0です。 +- `memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — このスレッドのコンテキストで割り当てられたメモリと解放されたメモリの差。 +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — このスレッドのコンテキストで割り当てられたメモリと解放されたメモリの最大差。 +- `thread_name` ([String](../../sql-reference/data-types/string.md)) — スレッド名。 +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — OSスレッドID。 +- `master_thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 初期スレッドのOS初期ID。 +- `query` ([String](../../sql-reference/data-types/string.md)) — クエリ文字列。 +- `is_initial_query` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリタイプ。可能な値: + - 1 — クライアントによって開始されたクエリ。 + - 0 — 分散クエリ実行のために別のクエリによって開始されたクエリ。 +- `user` ([String](../../sql-reference/data-types/string.md)) — 現在のクエリを開始したユーザー名。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — クエリのID。 +- `address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — クエリの実行に使用されたIPアドレス。 +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリの実行に使用されたクライアントポート。 +- `initial_user` ([String](../../sql-reference/data-types/string.md)) — 初期クエリを実行したユーザー名(分散クエリ実行の場合)。 +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — 初期クエリのID(分散クエリ実行の場合)。 +- `initial_address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — 親クエリが起動されたIPアドレス。 +- `initial_port` ([UInt16](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 親クエリの実行に使用されたクライアントポート。 +- `interface` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリが開始されたインターフェース。可能な値: + - 1 — TCP。 + - 2 — HTTP。 +- `os_user` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md) を実行しているOSのユーザー名。 +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアントが実行されているクライアントマシンのホスト名。 +- `client_name` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアント名。 +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアントのリビジョン。 +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアントのメジャーバージョン。 +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアントのマイナーバージョン。 +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — [clickhouse-client](../../interfaces/cli.md) または別のTCPクライアントのパッチバージョン。 +- `http_method` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — クエリを開始したHTTPメソッド。可能な値: + - 0 — クエリがTCPインターフェースから開始されました。 + - 1 — `GET` メソッドが使用されました。 + - 2 — `POST` メソッドが使用されました。 +- `http_user_agent` ([String](../../sql-reference/data-types/string.md)) — HTTPリクエストで渡された `UserAgent` ヘッダー。 +- `quota_key` ([String](../../sql-reference/data-types/string.md)) — [quota](../../operations/quotas.md) 設定で指定された「クオータキー」(`keyed` を参照)。 +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouseのリビジョン。 +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — このスレッドの異なるメトリクスを測定するProfileEvents。これらの説明は、[system.events](#system_tables-events) テーブルで見つけることができます。 + +**例** + +``` sql + SELECT * FROM system.query_thread_log LIMIT 1 \G +``` + +``` text +行 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2020-09-11 +event_time: 2020-09-11 10:08:17 +event_time_microseconds: 2020-09-11 10:08:17.134042 +query_start_time: 2020-09-11 10:08:17 +query_start_time_microseconds: 2020-09-11 10:08:17.063150 +query_duration_ms: 70 +read_rows: 0 +read_bytes: 0 +written_rows: 1 +written_bytes: 12 +memory_usage: 4300844 +peak_memory_usage: 4300844 +thread_name: TCPHandler +thread_id: 638133 +master_thread_id: 638133 +query: INSERT INTO test1 VALUES +is_initial_query: 1 +user: default +query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef +address: ::ffff:127.0.0.1 +port: 33452 +initial_user: default +initial_query_id: 50a320fd-85a8-49b8-8761-98a86bcbacef +initial_address: ::ffff:127.0.0.1 +initial_port: 33452 +interface: 1 +os_user: bharatnc +client_hostname: tower +client_name: ClickHouse +client_revision: 54437 +client_version_major: 20 +client_version_minor: 7 +client_version_patch: 2 +http_method: 0 +http_user_agent: +quota_key: +revision: 54440 +ProfileEvents: {'Query':1,'SelectQuery':1,'ReadCompressedBytes':36,'CompressedReadBufferBlocks':1,'CompressedReadBufferBytes':10,'IOBufferAllocs':1,'IOBufferAllocBytes':89,'ContextLock':15,'RWLockAcquiredReadLocks':1} +``` + +**関連項目** + +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — クエリ実行に関する一般情報を含む `query_log` システムテーブルの説明。 +- [system.query_views_log](../../operations/system-tables/query_views_log.md#system_tables-query_views_log) — クエリ中に実行された各ビューに関する情報を含むテーブル。 diff --git a/docs/ja/operations/system-tables/query_views_log.md b/docs/ja/operations/system-tables/query_views_log.md new file mode 100644 index 00000000000..c4c44fc15ba --- /dev/null +++ b/docs/ja/operations/system-tables/query_views_log.md @@ -0,0 +1,89 @@ +--- +slug: /ja/operations/system-tables/query_views_log +--- +# query_views_log + +クエリを実行した際に実行された依存ビューに関する情報を含みます。例えば、ビューの種類や実行時間を示します。 + +ログを開始するには次の手順に従います: + +1. [query_views_log](../../operations/server-configuration-parameters/settings.md#query_views_log) セクションでパラメータを設定します。 +2. [log_query_views](../../operations/settings/settings.md#log-query-views) を1に設定します。 + +データのフラッシュ間隔は、サーバー設定セクションの [query_views_log](../../operations/server-configuration-parameters/settings.md#query_views_log) の `flush_interval_milliseconds` パラメータで設定します。強制的にフラッシュするには、[SYSTEM FLUSH LOGS](../../sql-reference/statements/system.md#query_language-system-flush_logs) クエリを使用します。 + +ClickHouseはテーブルからデータを自動的に削除しません。詳細は[概要](../../operations/system-tables/index.md#system-tables-introduction)を参照してください。 + +`query_views_log` テーブルに登録されるクエリの数を減らすには、[log_queries_probability](../../operations/settings/settings.md#log-queries-probability) 設定を使用できます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — ビューの最後のイベントが発生した日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — ビューが実行を終了した日時。 +- `event_time_microseconds` ([DateTime](../../sql-reference/data-types/datetime.md)) — マイクロ秒精度でビューが実行を終了した日時。 +- `view_duration_ms` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — ビューの実行時間 (各ステージの合計) をミリ秒単位で。 +- `initial_query_id` ([String](../../sql-reference/data-types/string.md)) — 初期クエリのID (分散クエリ実行のため)。 +- `view_name` ([String](../../sql-reference/data-types/string.md)) — ビューの名前。 +- `view_uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — ビューのUUID。 +- `view_type` ([Enum8](../../sql-reference/data-types/enum.md)) — ビューの種類。値: + - `'Default' = 1` — [デフォルトビュー](../../sql-reference/statements/create/view.md#normal)。このログには表示されません。 + - `'Materialized' = 2` — [マテリアライズドビュー](../../sql-reference/statements/create/view.md#materialized)。 + - `'Live' = 3` — [ライブビュー](../../sql-reference/statements/create/view.md#live-view)。 +- `view_query` ([String](../../sql-reference/data-types/string.md)) — ビューが実行したクエリ。 +- `view_target` ([String](../../sql-reference/data-types/string.md)) — ビューのターゲットテーブルの名前。 +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 読み取った行数。 +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 読み取ったバイト数。 +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 書き込まれた行数。 +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 書き込まれたバイト数。 +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint.md)) — このビューのコンテキスト内で割り当てられたメモリと解放されたメモリの最大差。 +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/array.md)) — 異なるメトリクスを測定するProfileEvents。詳細は [system.events](../../operations/system-tables/events.md#system_tables-events) テーブルで見つかります。 +- `status` ([Enum8](../../sql-reference/data-types/enum.md)) — ビューのステータス。値: + - `'QueryStart' = 1` — ビュー実行の成功した開始。表示されません。 + - `'QueryFinish' = 2` — ビュー実行の成功した終了。 + - `'ExceptionBeforeStart' = 3` — ビュー実行開始前の例外。 + - `'ExceptionWhileProcessing' = 4` — ビュー実行中の例外。 +- `exception_code` ([Int32](../../sql-reference/data-types/int-uint.md)) — 例外コード。 +- `exception` ([String](../../sql-reference/data-types/string.md)) — 例外メッセージ。 +- `stack_trace` ([String](../../sql-reference/data-types/string.md)) — [スタックトレース](https://en.wikipedia.org/wiki/Stack_trace)。クエリが正常に完了した場合は空。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.query_views_log LIMIT 1 \G; +``` + +結果: + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2021-06-22 +event_time: 2021-06-22 13:23:07 +event_time_microseconds: 2021-06-22 13:23:07.738221 +view_duration_ms: 0 +initial_query_id: c3a1ac02-9cad-479b-af54-9e9c0a7afd70 +view_name: default.matview_inner +view_uuid: 00000000-0000-0000-0000-000000000000 +view_type: Materialized +view_query: SELECT * FROM default.table_b +view_target: default.`.inner.matview_inner` +read_rows: 4 +read_bytes: 64 +written_rows: 2 +written_bytes: 32 +peak_memory_usage: 4196188 +ProfileEvents: {'FileOpen':2,'WriteBufferFromFileDescriptorWrite':2,'WriteBufferFromFileDescriptorWriteBytes':187,'IOBufferAllocs':3,'IOBufferAllocBytes':3145773,'FunctionExecute':3,'DiskWriteElapsedMicroseconds':13,'InsertedRows':2,'InsertedBytes':16,'SelectedRows':4,'SelectedBytes':48,'ContextLock':16,'RWLockAcquiredReadLocks':1,'RealTimeMicroseconds':698,'SoftPageFaults':4,'OSReadChars':463} +status: QueryFinish +exception_code: 0 +exception: +stack_trace: +``` + +**参照** + +- [system.query_log](../../operations/system-tables/query_log.md#system_tables-query_log) — クエリ実行に関する一般情報を含む `query_log` システムテーブルの説明。 +- [system.query_thread_log](../../operations/system-tables/query_thread_log.md#system_tables-query_thread_log) — 各クエリ実行スレッドに関する情報を含むこのテーブル。 diff --git a/docs/ja/operations/system-tables/quota_limits.md b/docs/ja/operations/system-tables/quota_limits.md new file mode 100644 index 00000000000..3df34f09454 --- /dev/null +++ b/docs/ja/operations/system-tables/quota_limits.md @@ -0,0 +1,22 @@ +--- +slug: /ja/operations/system-tables/quota_limits +--- +# quota_limits + +すべてのクォータのすべての間隔に対する最大値の情報を含みます。クォータには、任意の数またはゼロの行が対応します。 + +カラム: +- `quota_name` ([String](../../sql-reference/data-types/string.md)) — クォータ名。 +- `duration` ([UInt32](../../sql-reference/data-types/int-uint.md)) — リソース消費を計算するための時間間隔の長さ(秒単位)。 +- `is_randomized_interval` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 論理値。この間隔がランダム化されているかを示します。ランダム化されていない場合、間隔は常に同じ時間に開始されます。たとえば、1分間の間隔は、整数の分数で常に開始されます(例: 11:20:00に開始することはありますが、11:20:01に開始することはありません)。1日の間隔は常にUTCの午前0時に開始されます。ランダム化されている場合、最初の間隔はランダムな時間に開始され、その後は連続して開始します。値: +- `0` — 間隔はランダム化されていません。 +- `1` — 間隔はランダム化されています。 +- `max_queries` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリの最大数。 +- `max_query_selects` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — SELECTクエリの最大数。 +- `max_query_inserts` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — INSERTクエリの最大数。 +- `max_errors` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — エラーの最大数。 +- `max_result_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 結果の行の最大数。 +- `max_result_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリの結果を保存するために使用されるRAMボリュームの最大バイト数。 +- `max_read_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに参加したすべてのテーブルおよびテーブル関数から読み取られた行の最大数。 +- `max_read_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに参加したすべてのテーブルおよびテーブル関数から読み取られたバイト数の最大値。 +- `max_execution_time` ([Nullable](../../sql-reference/data-types/nullable.md)([Float64](../../sql-reference/data-types/float.md))) — クエリの実行時間の最大値(秒単位)。 diff --git a/docs/ja/operations/system-tables/quota_usage.md b/docs/ja/operations/system-tables/quota_usage.md new file mode 100644 index 00000000000..ca004f5dce7 --- /dev/null +++ b/docs/ja/operations/system-tables/quota_usage.md @@ -0,0 +1,35 @@ +--- +slug: /ja/operations/system-tables/quota_usage +--- +# quota_usage + +現在のユーザーによるクォータの使用状況: 使用量と残りの量。 + +カラム: +- `quota_name` ([String](../../sql-reference/data-types/string.md)) — クォータ名。 +- `quota_key`([String](../../sql-reference/data-types/string.md)) — キーの値。例えば、keys =\[‘IPアドレス’\]の場合、`quota_key`は‘192.168.1.1’のような値を持つ場合があります。 +- `start_time`([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md))) — リソース消費量を計算するための開始時刻。 +- `end_time`([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md))) — リソース消費量を計算するための終了時刻。 +- `duration` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — リソース消費量を計算するための時間間隔の長さ(秒)。 +- `queries` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのリクエストの総数。 +- `query_selects` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのセレクトリクエストの総数。 +- `query_inserts` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのインサートリクエストの総数。 +- `max_queries` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — リクエストの最大数。 +- `errors` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 例外を投げたクエリの数。 +- `max_errors` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — エラーの最大数。 +- `result_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 結果として得られた行の総数。 +- `max_result_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 結果行の最大数。 +- `result_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリ結果を保存するために使用されたRAMのボリューム(バイト単位)。 +- `max_result_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリ結果の保存に使用された最大RAMボリューム(バイト単位)。 +- `read_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — すべてのリモートサーバーでクエリを実行するためにテーブルから読み取ったソース行の総数。 +- `max_read_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに関与したすべてのテーブルおよびテーブル関数から読み取られた行の最大数。 +- `read_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに関与したすべてのテーブルおよびテーブル関数から読み取られたバイト数の総数。 +- `max_read_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — すべてのテーブルおよびテーブル関数から読み取られたバイトの最大数。 +- `failed_sequential_authentications` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/float.md))) — 連続する認証失敗の総数。ユーザーが `failed_sequential_authentications` の閾値を超える前に正しいパスワードを入力した場合、カウンターはリセットされます。 +- `max_failed_sequential_authentications` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/float.md))) — 連続する認証失敗の最大数。 +- `execution_time` ([Nullable](../../sql-reference/data-types/nullable.md)([Float64](../../sql-reference/data-types/float.md))) — クエリの総実行時間(秒、実時間)。 +- `max_execution_time` ([Nullable](../../sql-reference/data-types/nullable.md)([Float64](../../sql-reference/data-types/float.md))) — クエリ実行時間の最大値。 + +## 関連項目 {#see-also} + +- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) diff --git a/docs/ja/operations/system-tables/quotas.md b/docs/ja/operations/system-tables/quotas.md new file mode 100644 index 00000000000..6a842aacbb5 --- /dev/null +++ b/docs/ja/operations/system-tables/quotas.md @@ -0,0 +1,28 @@ +--- +slug: /ja/operations/system-tables/quotas +--- +# quotas + +[クォータ](../../operations/system-tables/quotas.md)に関する情報を含みます。 + +カラム: +- `name` ([String](../../sql-reference/data-types/string.md)) — クォータ名。 +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — クォータID。 +- `storage`([String](../../sql-reference/data-types/string.md)) — クォータのストレージ。可能な値は、users.xmlファイルで設定された場合は「users.xml」、SQLクエリで設定された場合は「disk」です。 +- `keys` ([Array](../../sql-reference/data-types/array.md)([Enum8](../../sql-reference/data-types/enum.md))) — クォータがどのように共有されるかを指定するキー。同じクォータとキーを使用する2つの接続は、同じリソース量を共有します。値: + - `[]` — すべてのユーザーが同じクォータを共有します。 + - `['user_name']` — 同じユーザー名を持つ接続は同じクォータを共有します。 + - `['ip_address']` — 同じIPからの接続は同じクォータを共有します。 + - `['client_key']` — 同じキーを持つ接続は同じクォータを共有します。キーはクライアントによって明示的に提供される必要があります。[clickhouse-client](../../interfaces/cli.md)を使用する場合は、`--quota_key`パラメータでキー値を渡すか、クライアント構成ファイルに`quota_key`パラメータを使用します。HTTPインターフェースを使用する場合は、`X-ClickHouse-Quota`ヘッダーを使用します。 + - `['user_name', 'client_key']` — 同じ`client_key`を持つ接続は同じクォータを共有します。キーがクライアントによって提供されない場合、クォータは`user_name`で追跡されます。 + - `['client_key', 'ip_address']` — 同じ`client_key`を持つ接続は同じクォータを共有します。キーがクライアントによって提供されない場合、クォータは`ip_address`で追跡されます。 +- `durations` ([Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 秒単位の時間間隔の長さ。 +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 論理値。この値はクォータが適用されるユーザーを示します。値: + - `0` — クォータは`apply_to_list`に指定されたユーザーに適用されます。 + - `1` — クォータは`apply_to_except`に記載されていないすべてのユーザーに適用されます。 +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — クォータを適用すべきユーザー名/[ロール](../../guides/sre/user-management/index.md#role-management)のリスト。 +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — クォータを適用しないユーザー名/ロールのリスト。 + +## 参照 {#see-also} + +- [SHOW QUOTAS](../../sql-reference/statements/show.md#show-quotas-statement) diff --git a/docs/ja/operations/system-tables/quotas_usage.md b/docs/ja/operations/system-tables/quotas_usage.md new file mode 100644 index 00000000000..37b5d44a2e5 --- /dev/null +++ b/docs/ja/operations/system-tables/quotas_usage.md @@ -0,0 +1,38 @@ +--- +slug: /ja/operations/system-tables/quotas_usage +--- +# quotas_usage + +全ユーザーのクオータ使用量。 + +カラム: +- `quota_name` ([String](../../sql-reference/data-types/string.md)) — クオータ名。 +- `quota_key` ([String](../../sql-reference/data-types/string.md)) — キーの値。 +- `is_current` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 現在のユーザーのクオータ使用量。 +- `start_time` ([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md)))) — リソース消費の計算開始時刻。 +- `end_time` ([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md)))) — リソース消費の計算終了時刻。 +- `duration` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt32](../../sql-reference/data-types/int-uint.md))) — リソース消費計算のための時間間隔の長さ(秒単位)。 +- `queries` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのリクエスト総数。 +- `max_queries` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — リクエストの最大数。 +- `query_selects` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのSELECTリクエスト総数。 +- `max_query_selects` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — SELECTリクエストの最大数。 +- `query_inserts` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — この間隔でのINSERTリクエスト総数。 +- `max_query_inserts` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — INSERTリクエストの最大数。 +- `errors` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 例外を発生させたクエリ数。 +- `max_errors` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — エラーの最大数。 +- `result_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 結果として返された行の総数。 +- `max_result_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — テーブルから読み取られたソース行の最大数。 +- `result_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリの結果を保存するために使用されたRAMバイト数。 +- `max_result_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリの結果を保存するために使用されたRAMの最大バイト数。 +- `read_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md)))) — すべてのリモートサーバー上でクエリを実行するためにテーブルから読み取られたソース行の総数。 +- `max_read_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに関与したすべてのテーブルおよびテーブル関数から読み取られた行の最大数。 +- `read_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに関与したすべてのテーブルおよびテーブル関数から読み取られたバイト数の総数。 +- `max_read_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — クエリに関与したすべてのテーブルおよびテーブル関数から読み取られたバイト数の最大値。 +- `failed_sequential_authentications` ([Nullable](../../sql-reference/data-types/nullable.md)([Float64](../../sql-reference/data-types/float.md))) — 連続した認証失敗の総数。ユーザーが`failed_sequential_authentications`のしきい値を超える前に正しいパスワードを入力した場合、カウンタはリセットされます。 +- `max_failed_sequential_authentications` ([Nullable](../../sql-reference/data-types/nullable.md)([Float64](../../sql-reference/data-types/float.md))) — 連続した認証失敗の最大数。 +- `execution_time` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/float.md))) — クエリの総実行時間(秒単位の壁時計時間)。 +- `max_execution_time` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/float.md))) — クエリの実行時間の最大値。 + +## 参照 {#see-also} + +- [SHOW QUOTA](../../sql-reference/statements/show.md#show-quota-statement) diff --git a/docs/ja/operations/system-tables/replicas.md b/docs/ja/operations/system-tables/replicas.md new file mode 100644 index 00000000000..916b3291b28 --- /dev/null +++ b/docs/ja/operations/system-tables/replicas.md @@ -0,0 +1,132 @@ +--- +slug: /ja/operations/system-tables/replicas +--- +# replicas + +このテーブルには、ローカルサーバーにあるレプリケーションされたテーブルの情報とステータスが含まれています。このテーブルは監視に利用できます。テーブルにはすべてのReplicated\*テーブルについて行が含まれています。 + +例: + +``` sql +SELECT * +FROM system.replicas +WHERE table = 'test_table' +FORMAT Vertical +``` + +``` text +クエリID: dc6dcbcb-dc28-4df9-ae27-4354f5b3b13e + +行1: +─────── +database: db +table: test_table +engine: ReplicatedMergeTree +is_leader: 1 +can_become_leader: 1 +is_readonly: 0 +is_session_expired: 0 +future_parts: 0 +parts_to_check: 0 +zookeeper_path: /test/test_table +replica_name: r1 +replica_path: /test/test_table/replicas/r1 +columns_version: -1 +queue_size: 27 +inserts_in_queue: 27 +merges_in_queue: 0 +part_mutations_in_queue: 0 +queue_oldest_time: 2021-10-12 14:48:48 +inserts_oldest_time: 2021-10-12 14:48:48 +merges_oldest_time: 1970-01-01 03:00:00 +part_mutations_oldest_time: 1970-01-01 03:00:00 +oldest_part_to_get: 1_17_17_0 +oldest_part_to_merge_to: +oldest_part_to_mutate_to: +log_max_index: 206 +log_pointer: 207 +last_queue_update: 2021-10-12 14:50:08 +absolute_delay: 99 +total_replicas: 5 +active_replicas: 5 +lost_part_count: 0 +last_queue_update_exception: +zookeeper_exception: +replica_is_active: {'r1':1,'r2':1} +``` + +カラム: + +- `database` (`String`) - データベース名 +- `table` (`String`) - テーブル名 +- `engine` (`String`) - テーブルエンジン名 +- `is_leader` (`UInt8`) - レプリカがリーダーかどうか。 + 複数のレプリカが同時にリーダーになることができます。レプリカがリーダーになるのを防ぐために`merge_tree`設定`replicated_can_become_leader`を使用できます。リーダーはバックグラウンドでのマージをスケジュールする責任を持ちます。 + Zookeeperにセッションを持ち利用可能である限り、リーダーであるかどうかに関わらず、任意のレプリカに書き込みができます。 +- `can_become_leader` (`UInt8`) - レプリカがリーダーになれるかどうか。 +- `is_readonly` (`UInt8`) - レプリカが読み取り専用モードかどうか。 + このモードは、ClickHouse Keeperのセクションが設定に存在しない場合、セッションをClickHouse Keeperで再初期化する際に未知のエラーが発生した場合、またはClickHouse Keeperでセッションを再初期化する際に有効になります。 +- `is_session_expired` (`UInt8`) - ClickHouse Keeperとのセッションが期限切れになったかどうか。基本的には`is_readonly`と同じです。 +- `future_parts` (`UInt32`) - 挿入や未完了のマージの結果として現れるデータパーツの数。 +- `parts_to_check` (`UInt32`) - 検証中のデータパーツの数。破損している可能性がある場合に検証キューに登録されます。 +- `zookeeper_path` (`String`) - ClickHouse Keeperにおけるテーブルデータへのパス。 +- `replica_name` (`String`) - ClickHouse Keeperにおけるレプリカ名。同じテーブルの異なるレプリカは異なる名前を持ちます。 +- `replica_path` (`String`) - ClickHouse Keeperにおけるレプリカデータへのパス。これは‘zookeeper_path/replicas/replica_path’を連結したものと同じです。 +- `columns_version` (`Int32`) - テーブル構造のバージョン番号。ALTERが実行された回数を示します。レプリカが異なるバージョンを持っている場合、一部のレプリカがまだすべてのALTERを行っていないことを意味します。 +- `queue_size` (`UInt32`) - 実行待ちの操作のキューのサイズ。操作にはデータブロックの挿入、マージ、および特定の他のアクションが含まれます。通常は`future_parts`と一致します。 +- `inserts_in_queue` (`UInt32`) - 挿入される必要のあるデータブロックの挿入数。挿入は通常かなり迅速にレプリケートされます。この数が大きい場合、何か問題があります。 +- `merges_in_queue` (`UInt32`) - 実行待ちのマージの数。マージは時折長引くため、この値がしばらくゼロを超えることがあります。 +- `part_mutations_in_queue` (`UInt32`) - 実行待ちの変異の数。 +- `queue_oldest_time` (`DateTime`) - `queue_size`がゼロを超える場合、最も古い操作がキューに追加された時刻を示します。 +- `inserts_oldest_time` (`DateTime`) - `queue_oldest_time`を参照 +- `merges_oldest_time` (`DateTime`) - `queue_oldest_time`を参照 +- `part_mutations_oldest_time` (`DateTime`) - `queue_oldest_time`を参照 + +次の4つのカラムは、Zookeeperとのアクティブなセッションがある場合にのみ非ゼロの値を持ちます。 + +- `log_max_index` (`UInt64`) - 一般活動のログにおける最大のエントリ番号。 +- `log_pointer` (`UInt64`) - レプリカが実行キューにコピーした一般活動のログの最大エントリ番号に1を加えたもの。`log_pointer`が`log_max_index`よりはるかに小さい場合、何かがおかしいです。 +- `last_queue_update` (`DateTime`) - キューが最後に更新された時刻。 +- `absolute_delay` (`UInt64`) - 現在のレプリカが持つ遅延秒数。 +- `total_replicas` (`UInt8`) - このテーブルの既知のレプリカの総数。 +- `active_replicas` (`UInt8`) - ClickHouse Keeperにセッションのある、このテーブルのレプリカ数(つまり、稼働中のレプリカの数)。 +- `lost_part_count` (`UInt64`) - テーブルが作成されて以来、全レプリカで合計としてテーブル内で失われたデータパーツの数。値はClickHouse Keeperに保存され増加のみされます。 +- `last_queue_update_exception` (`String`) - キューに壊れたエントリが含まれている場合。特に、ClickHouseがバージョン間で後方互換性を破る際に重要であり、新しいバージョンで書かれたログエントリが古いバージョンで解析できない場合に特に注意します。 +- `zookeeper_exception` (`String`) - ClickHouse Keeperから情報を取得する際にエラーが発生した場合に得られた最後の例外メッセージ。 +- `replica_is_active` ([Map(String, UInt8)](../../sql-reference/data-types/map.md)) — レプリカ名とレプリカがアクティブかどうかのマップ。 + +すべてのカラムをリクエストすると、各行ごとにClickHouse Keeperから複数回の読み取りが行われるため、テーブルの動作が多少遅くなる場合があります。最後の4つのカラム(log_max_index, log_pointer, total_replicas, active_replicas)をリクエストしなければ、テーブルは速く動作します。 + +例えば、すべてが正常に動作しているかを次のようにチェックできます: + +``` sql +SELECT + database, + table, + is_leader, + is_readonly, + is_session_expired, + future_parts, + parts_to_check, + columns_version, + queue_size, + inserts_in_queue, + merges_in_queue, + log_max_index, + log_pointer, + total_replicas, + active_replicas +FROM system.replicas +WHERE + is_readonly + OR is_session_expired + OR future_parts > 20 + OR parts_to_check > 10 + OR queue_size > 20 + OR inserts_in_queue > 10 + OR log_max_index - log_pointer > 10 + OR total_replicas < 2 + OR active_replicas < total_replicas +``` + +このクエリが何も返さなければ、すべてが正常です。 diff --git a/docs/ja/operations/system-tables/replicated_fetches.md b/docs/ja/operations/system-tables/replicated_fetches.md new file mode 100644 index 00000000000..8c66020fc9a --- /dev/null +++ b/docs/ja/operations/system-tables/replicated_fetches.md @@ -0,0 +1,71 @@ +--- +slug: /ja/operations/system-tables/replicated_fetches +--- +# replicated_fetches + +現在実行中のバックグラウンドフェッチに関する情報を含みます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブルの名前。 + +- `elapsed` ([Float64](../../sql-reference/data-types/float.md)) — 現在実行中のバックグラウンドフェッチの開始から経過した時間(秒単位)。 + +- `progress` ([Float64](../../sql-reference/data-types/float.md)) — 完了した作業の割合を0から1の範囲で示します。 + +- `result_part_name` ([String](../../sql-reference/data-types/string.md)) — 現在実行中のバックグラウンドフェッチの結果として形成されるパートの名前。 + +- `result_part_path` ([String](../../sql-reference/data-types/string.md)) — 現在実行中のバックグラウンドフェッチの結果として形成されるパートへの絶対パス。 + +- `partition_id` ([String](../../sql-reference/data-types/string.md)) — パーティションのID。 + +- `total_size_bytes_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 結果パート内の圧縮データの総サイズ(バイト単位)。 + +- `bytes_read_compressed` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 結果パートから読み取られた圧縮バイト数。 + +- `source_replica_path` ([String](../../sql-reference/data-types/string.md)) — ソースレプリカへの絶対パス。 + +- `source_replica_hostname` ([String](../../sql-reference/data-types/string.md)) — ソースレプリカのホスト名。 + +- `source_replica_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — ソースレプリカのポート番号。 + +- `interserver_scheme` ([String](../../sql-reference/data-types/string.md)) — インターサーバースキームの名前。 + +- `URI` ([String](../../sql-reference/data-types/string.md)) — 統一リソース識別子。 + +- `to_detached` ([UInt8](../../sql-reference/data-types/int-uint.md)) — 現在実行中のバックグラウンドフェッチが `TO DETACHED` 式を使用して実行されているかどうかを示すフラグ。 + +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — スレッド識別子。 + +**例** + +``` sql +SELECT * FROM system.replicated_fetches LIMIT 1 FORMAT Vertical; +``` + +``` text +行 1: +────── +database: default +table: t +elapsed: 7.243039876 +progress: 0.41832135995612835 +result_part_name: all_0_0_0 +result_part_path: /var/lib/clickhouse/store/700/70080a04-b2de-4adf-9fa5-9ea210e81766/all_0_0_0/ +partition_id: all +total_size_bytes_compressed: 1052783726 +bytes_read_compressed: 440401920 +source_replica_path: /clickhouse/test/t/replicas/1 +source_replica_hostname: node1 +source_replica_port: 9009 +interserver_scheme: http +URI: http://node1:9009/?endpoint=DataPartsExchange%3A%2Fclickhouse%2Ftest%2Ft%2Freplicas%2F1&part=all_0_0_0&client_protocol_version=4&compress=false +to_detached: 0 +thread_id: 54 +``` + +**参照** + +- [ReplicatedMergeTreeテーブルの管理](../../sql-reference/statements/system.md/#managing-replicatedmergetree-tables) diff --git a/docs/ja/operations/system-tables/replication_queue.md b/docs/ja/operations/system-tables/replication_queue.md new file mode 100644 index 00000000000..18f810f4464 --- /dev/null +++ b/docs/ja/operations/system-tables/replication_queue.md @@ -0,0 +1,92 @@ +--- +slug: /ja/operations/system-tables/replication_queue +--- +# replication_queue + +`ClickHouse Keeper` または `ZooKeeper` に格納されているレプリケーションキューからのタスク情報を、`ReplicatedMergeTree` ファミリーのテーブル用に含んでいます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベースの名前。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブルの名前。 + +- `replica_name` ([String](../../sql-reference/data-types/string.md)) — ClickHouse Keeper 内でのレプリカの名前。同じテーブルの異なるレプリカには異なる名前があります。 + +- `position` ([UInt32](../../sql-reference/data-types/int-uint.md)) — キュー内でのタスクの位置。 + +- `node_name` ([String](../../sql-reference/data-types/string.md)) — ClickHouse Keeper 内のノードの名前。 + +- `type` ([String](../../sql-reference/data-types/string.md)) — キュー内のタスクのタイプ、以下のいずれか: + + - `GET_PART` — 他のレプリカからパーツを取得。 + - `ATTACH_PART` — パーツをアタッチ、おそらく自分のレプリカから(`detached` フォルダー内で見つかった場合)。`GET_PART` とほぼ同一ですが、いくつかの最適化があります。 + - `MERGE_PARTS` — パーツをマージ。 + - `DROP_RANGE` — 指定されたパーティション内の指定された番号範囲のパーツを削除。 + - `CLEAR_COLUMN` — 注意: 廃止予定。指定されたパーティションからの特定のカラムを削除。 + - `CLEAR_INDEX` — 注意: 廃止予定。指定されたパーティションからの特定のインデックスを削除。 + - `REPLACE_RANGE` — 特定のパーツ範囲を削除し、新しいものと置き換え。 + - `MUTATE_PART` — パーツに一つまたは複数のミューテーションを適用。 + - `ALTER_METADATA` — グローバルな /metadata および /columns パスに従ってアルターモディフィケーションを適用。 + +- `create_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — タスクが実行のために提出された日時。 + +- `required_quorum` ([UInt32](../../sql-reference/data-types/int-uint.md)) — タスクの完了確認を待っているレプリカの数。このカラムは `GET_PARTS` タスクにのみ関連します。 + +- `source_replica` ([String](../../sql-reference/data-types/string.md)) — ソースレプリカの名前。 + +- `new_part_name` ([String](../../sql-reference/data-types/string.md)) — 新しいパーツの名前。 + +- `parts_to_merge` ([Array](../../sql-reference/data-types/array.md) ([String](../../sql-reference/data-types/string.md))) — マージまたは更新するパーツの名前。 + +- `is_detach` ([UInt8](../../sql-reference/data-types/int-uint.md)) — キューに `DETACH_PARTS` タスクがあるかどうかを示すフラグ。 + +- `is_currently_executing` ([UInt8](../../sql-reference/data-types/int-uint.md)) — 特定のタスクが現在実行されているかどうかを示すフラグ。 + +- `num_tries` ([UInt32](../../sql-reference/data-types/int-uint.md)) — タスクの完了に失敗した試行回数。 + +- `last_exception` ([String](../../sql-reference/data-types/string.md)) — 発生した最後のエラーについてのメッセージ(あれば)。 + +- `last_attempt_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — タスクが最後に試みられた日時。 + +- `num_postponed` ([UInt32](../../sql-reference/data-types/int-uint.md)) — アクションが延期された回数。 + +- `postpone_reason` ([String](../../sql-reference/data-types/string.md)) — タスクが延期された理由。 + +- `last_postpone_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — タスクが最後に延期された日時。 + +- `merge_type` ([String](../../sql-reference/data-types/string.md)) — 現在のマージのタイプ。ミューテーションの場合、空です。 + +**例** + +``` sql +SELECT * FROM system.replication_queue LIMIT 1 FORMAT Vertical; +``` + +``` text +Row 1: +────── +database: merge +table: visits_v2 +replica_name: mtgiga001-1t +position: 15 +node_name: queue-0009325559 +type: MERGE_PARTS +create_time: 2020-12-07 14:04:21 +required_quorum: 0 +source_replica: mtgiga001-1t +new_part_name: 20201130_121373_121384_2 +parts_to_merge: ['20201130_121373_121378_1','20201130_121379_121379_0','20201130_121380_121380_0','20201130_121381_121381_0','20201130_121382_121382_0','20201130_121383_121383_0','20201130_121384_121384_0'] +is_detach: 0 +is_currently_executing: 0 +num_tries: 36 +last_exception: Code: 226, e.displayText() = DB::Exception: Marks file '/opt/clickhouse/data/merge/visits_v2/tmp_fetch_20201130_121373_121384_2/CounterID.mrk' does not exist (version 20.8.7.15 (official build)) +last_attempt_time: 2020-12-08 17:35:54 +num_postponed: 0 +postpone_reason: +last_postpone_time: 1970-01-01 03:00:00 +``` + +**参照** + +- [ReplicatedMergeTree テーブルの管理](../../sql-reference/statements/system.md#query-language-system-replicated) diff --git a/docs/ja/operations/system-tables/resources.md b/docs/ja/operations/system-tables/resources.md new file mode 100644 index 00000000000..bb75284f4c8 --- /dev/null +++ b/docs/ja/operations/system-tables/resources.md @@ -0,0 +1,37 @@ +--- +slug: /ja/operations/system-tables/resources +--- +# resources + +ローカルサーバー上に存在する[リソース](/docs/ja/operations/workload-scheduling.md#workload_entity_storage)に関する情報を含みます。このテーブルには各リソースごとに行が含まれています。 + +例: + +``` sql +SELECT * +FROM system.resources +FORMAT Vertical +``` + +``` text +Row 1: +────── +name: io_read +read_disks: ['s3'] +write_disks: [] +create_query: CREATE RESOURCE io_read (READ DISK s3) + +Row 2: +────── +name: io_write +read_disks: [] +write_disks: ['s3'] +create_query: CREATE RESOURCE io_write (WRITE DISK s3) +``` + +カラム: + +- `name` (`String`) - リソース名。 +- `read_disks` (`Array(String)`) - 読み取り操作にこのリソースを使用するディスク名の配列。 +- `write_disks` (`Array(String)`) - 書き込み操作にこのリソースを使用するディスク名の配列。 +- `create_query` (`String`) - リソースの定義。 diff --git a/docs/ja/operations/system-tables/role-grants.md b/docs/ja/operations/system-tables/role-grants.md new file mode 100644 index 00000000000..6c56ed07623 --- /dev/null +++ b/docs/ja/operations/system-tables/role-grants.md @@ -0,0 +1,22 @@ +--- +slug: /ja/operations/system-tables/role-grants +--- +# role_grants + +ユーザーとロールのためのロール付与情報を含みます。このテーブルにエントリを追加するには、`GRANT role TO user`を使用します。 + +カラム: + +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ユーザー名。 + +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ロール名。 + +- `granted_role_name` ([String](../../sql-reference/data-types/string.md)) — `role_name`ロールに付与されたロールの名前。あるロールに別のロールを付与するには、`GRANT role1 TO role2`を使用します。 + +- `granted_role_is_default` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `granted_role`がデフォルトロールであるかを示すフラグ。可能な値: + - 1 — `granted_role`はデフォルトロールです。 + - 0 — `granted_role`はデフォルトロールではありません。 + +- `with_admin_option` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `granted_role`が[ADMIN OPTION](../../sql-reference/statements/grant.md#admin-option-privilege)特権を持つロールかを示すフラグ。可能な値: + - 1 — ロールは`ADMIN OPTION`特権を持ちます。 + - 0 — ロールは`ADMIN OPTION`特権を持ちません。 diff --git a/docs/ja/operations/system-tables/roles.md b/docs/ja/operations/system-tables/roles.md new file mode 100644 index 00000000000..8d6fed01a09 --- /dev/null +++ b/docs/ja/operations/system-tables/roles.md @@ -0,0 +1,16 @@ +--- +slug: /ja/operations/system-tables/roles +--- +# roles + +設定された[ロール](../../guides/sre/user-management/index.md#role-management)に関する情報を含みます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — ロール名。 +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — ロールID。 +- `storage` ([String](../../sql-reference/data-types/string.md)) — ロールのストレージへのパス。`access_control_path` パラメータで設定されています。 + +## 参照 {#see-also} + +- [SHOW ROLES](../../sql-reference/statements/show.md#show-roles-statement) diff --git a/docs/ja/operations/system-tables/row_policies.md b/docs/ja/operations/system-tables/row_policies.md new file mode 100644 index 00000000000..06fb527fb70 --- /dev/null +++ b/docs/ja/operations/system-tables/row_policies.md @@ -0,0 +1,35 @@ +--- +slug: /ja/operations/system-tables/row_policies +--- +# row_policies + +特定のテーブルに対するフィルターと、この行ポリシーを使用するべき役割やユーザーのリストを含んでいます。 + +カラム: +- `name` ([String](../../sql-reference/data-types/string.md)) — 行ポリシーの名前。 + +- `short_name` ([String](../../sql-reference/data-types/string.md)) — 行ポリシーの短縮名。行ポリシーの名前は複合的であり、例えば: myfilter ON mydb.mytable。ここでの「myfilter ON mydb.mytable」が行ポリシーの名前であり、「myfilter」がその短縮名です。 + +- `database` ([String](../../sql-reference/data-types/string.md)) — データベース名。 + +- `table` ([String](../../sql-reference/data-types/string.md)) — テーブル名。データベースに対するポリシーの場合は空。 + +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — 行ポリシーID。 + +- `storage` ([String](../../sql-reference/data-types/string.md)) — 行ポリシーが保存されているディレクトリの名前。 + +- `select_filter` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 行をフィルターするために使用される条件。 + +- `is_restrictive` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 行ポリシーが行へのアクセスを制限するかを示します。[CREATE ROW POLICY](../../sql-reference/statements/create/row-policy.md#create-row-policy-as)を参照してください。値: + - `0` — 行ポリシーが `AS PERMISSIVE` 句で定義されている。 + - `1` — 行ポリシーが `AS RESTRICTIVE` 句で定義されている。 + +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — すべての役割および/またはユーザーに設定された行ポリシーを示します。 + +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — 行ポリシーが適用される役割および/またはユーザーのリスト。 + +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — 記載されている役割および/またはユーザーを除き、行ポリシーが適用されているすべての役割および/またはユーザー。 + +## 参照 {#see-also} + +- [SHOW POLICIES](../../sql-reference/statements/show.md#show-policies-statement) diff --git a/docs/ja/operations/system-tables/s3_queue_settings.md b/docs/ja/operations/system-tables/s3_queue_settings.md new file mode 100644 index 00000000000..06442dc477c --- /dev/null +++ b/docs/ja/operations/system-tables/s3_queue_settings.md @@ -0,0 +1,19 @@ +--- +slug: /ja/operations/system-tables/s3_queue_settings +--- +# s3_queue_settings + +[S3Queue](../../engines/table-engines/integrations/s3queue.md)テーブルの設定情報を含んでいます。`24.10`サーバーバージョンから利用可能です。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `table` ([String](../../sql-reference/data-types/string.md)) — データベース名。 +- `name` ([String](../../sql-reference/data-types/string.md)) — 設定名。 +- `value` ([String](../../sql-reference/data-types/string.md)) — 設定値。 +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 設定が設定ファイルで明示的に定義されたか、または明示的に変更されたかどうか。 +- `description` ([String](../../sql-reference/data-types/string.md)) — 設定の説明。 +- `alterable` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — `ALTER TABLE ... MODIFY SETTING`を使用して設定を変更できるかどうかを示します。 + - `0` — 現在のユーザーが設定を変更できる。 + - `1` — 現在のユーザーが設定を変更できない。 +- `type` ([String](../../sql-reference/data-types/string.md)) — 設定のタイプ(実装固有の文字列値)。 diff --git a/docs/ja/operations/system-tables/scheduler.md b/docs/ja/operations/system-tables/scheduler.md new file mode 100644 index 00000000000..507886ec50e --- /dev/null +++ b/docs/ja/operations/system-tables/scheduler.md @@ -0,0 +1,75 @@ +--- +slug: /ja/operations/system-tables/scheduler +--- +# scheduler + +ローカルサーバーに存在する[スケジューリングノード](/docs/ja/operations/workload-scheduling.md/#hierarchy)の情報とステータスを含んでいます。このテーブルはモニタリングに利用できます。テーブルには各スケジューリングノードごとに行が含まれています。 + +例: + +``` sql +SELECT * +FROM system.scheduler +WHERE resource = 'network_read' AND path = '/prio/fair/prod' +FORMAT Vertical +``` + +``` text +Row 1: +────── +resource: network_read +path: /prio/fair/prod +type: fifo +weight: 5 +priority: 0 +is_active: 0 +active_children: 0 +dequeued_requests: 67 +canceled_requests: 0 +dequeued_cost: 4692272 +canceled_cost: 0 +busy_periods: 63 +vruntime: 938454.1999999989 +system_vruntime: ᴺᵁᴸᴸ +queue_length: 0 +queue_cost: 0 +budget: -60524 +is_satisfied: ᴺᵁᴸᴸ +inflight_requests: ᴺᵁᴸᴸ +inflight_cost: ᴺᵁᴸᴸ +max_requests: ᴺᵁᴸᴸ +max_cost: ᴺᵁᴸᴸ +max_speed: ᴺᵁᴸᴸ +max_burst: ᴺᵁᴸᴸ +throttling_us: ᴺᵁᴸᴸ +tokens: ᴺᵁᴸᴸ +``` + +カラム: + +- `resource` (`String`) - リソース名 +- `path` (`String`) - このリソーススケジューリング階層内のスケジューリングノードへのパス +- `type` (`String`) - スケジューリングノードのタイプ。 +- `weight` (`Float64`) - `fair`タイプの親ノードで使用されるノードの重み。 +- `priority` (`Int64`) - 'priority'タイプの親ノードで使用されるノードの優先度(値が低いほど優先度が高い)。 +- `is_active` (`UInt8`) - このノードが現在アクティブであるかどうか(リソース要求をデキューして制約を満たすことが可能か)。 +- `active_children` (`UInt64`) - アクティブ状態の子ノードの数。 +- `dequeued_requests` (`UInt64`) - このノードからデキューされたリソース要求の総数。 +- `canceled_requests` (`UInt64`) - このノードからキャンセルされたリソース要求の総数。 +- `dequeued_cost` (`UInt64`) - このノードからデキューされたすべての要求のコスト(例: バイト単位サイズ)の合計。 +- `canceled_cost` (`UInt64`) - このノードからキャンセルされたすべての要求のコスト(例: バイト単位サイズ)の合計。 +- `busy_periods` (`UInt64`) - このノードの非アクティブ化の総数。 +- `vruntime` (`Nullable(Float64)`) - `fair`ノードの子ノードのみ。最大最小公平方式で次の子ノードを処理するためにSFQアルゴリズムによって使用されるノードの仮想ランタイム。 +- `system_vruntime` (`Nullable(Float64)`) - `fair`ノードのみ。最後に処理されたリソース要求の`vruntime`を表示する仮想ランタイム。子ノードのアクティブ化時に`vruntime`の新しい値として使用。 +- `queue_length` (`Nullable(UInt64)`) - `fifo`ノードのみ。キュー内にあるリソース要求の現在の数。 +- `queue_cost` (`Nullable(UInt64)`) - `fifo`ノードのみ。キュー内にあるすべての要求のコスト(例: バイト単位サイズ)の合計。 +- `budget` (`Nullable(Int64)`) - `fifo`ノードのみ。新しいリソース要求のための利用可能な「コスト単位」の数。リソース要求の予想と実際のコストの不一致の場合に現れることがあります(例: 読み取り/書き込みエラーの後)。 +- `is_satisfied` (`Nullable(UInt8)`) - 制約ノードのみ(例: `inflight_limit`)。このノードのすべての制約が満たされている場合に`1`。 +- `inflight_requests` (`Nullable(Int64)`) - `inflight_limit`ノードのみ。このノードからデキューされ、現在消費状態にあるリソース要求の数。 +- `inflight_cost` (`Nullable(Int64)`) - `inflight_limit`ノードのみ。このノードからデキューされ、現在消費状態にあるすべてのリソース要求のコスト(例: バイト単位)の合計。 +- `max_requests` (`Nullable(Int64)`) - `inflight_limit`ノードのみ。制約違反につながる`inflight_requests`の上限。 +- `max_cost` (`Nullable(Int64)`) - `inflight_limit`ノードのみ。制約違反につながる`inflight_cost`の上限。 +- `max_speed` (`Nullable(Float64)`) - `bandwidth_limit`ノードのみ。1秒あたりのトークンでの帯域幅の上限。 +- `max_burst` (`Nullable(Float64)`) - `bandwidth_limit`ノードのみ。トークンバケットスロットリングで利用可能な`tokens`の上限。 +- `throttling_us` (`Nullable(Int64)`) - `bandwidth_limit`ノードのみ。このノードがスロットリング状態にあった合計マイクロ秒数。 +- `tokens` (`Nullable(Float64)`) - `bandwidth_limit`ノードのみ。トークンバケットスロットリングで現在利用可能なトークンの数。 diff --git a/docs/ja/operations/system-tables/schema_inference_cache.md b/docs/ja/operations/system-tables/schema_inference_cache.md new file mode 100644 index 00000000000..68cb26c88fd --- /dev/null +++ b/docs/ja/operations/system-tables/schema_inference_cache.md @@ -0,0 +1,67 @@ +--- +slug: /ja/operations/system-tables/schema_inference_cache +--- +# schema_inference_cache + +すべてのキャッシュされたファイルスキーマに関する情報を含んでいます。 + +カラム: +- `storage` ([String](/docs/ja/sql-reference/data-types/string.md)) — ストレージ名: File、URL、S3 または HDFS。 +- `source` ([String](/docs/ja/sql-reference/data-types/string.md)) — ファイルソース。 +- `format` ([String](/docs/ja/sql-reference/data-types/string.md)) — フォーマット名。 +- `additional_format_info` ([String](/docs/ja/sql-reference/data-types/string.md)) - スキーマを識別するために必要な追加情報。例えば、フォーマット固有の設定。 +- `registration_time` ([DateTime](/docs/ja/sql-reference/data-types/datetime.md)) — スキーマがキャッシュに追加されたタイムスタンプ。 +- `schema` ([String](/docs/ja/sql-reference/data-types/string.md)) - キャッシュされたスキーマ。 + +**例** + +例えば、このような内容のファイル `data.jsonl` があるとしましょう: +```json +{"id" : 1, "age" : 25, "name" : "Josh", "hobbies" : ["football", "cooking", "music"]} +{"id" : 2, "age" : 19, "name" : "Alan", "hobbies" : ["tennis", "art"]} +{"id" : 3, "age" : 32, "name" : "Lana", "hobbies" : ["fitness", "reading", "shopping"]} +{"id" : 4, "age" : 47, "name" : "Brayan", "hobbies" : ["movies", "skydiving"]} +``` + +:::tip +`data.jsonl` を `user_files_path` ディレクトリに配置します。ClickHouse の設定ファイルを確認すると、デフォルトは以下の通りです: +``` +/var/lib/clickhouse/user_files/ +``` +::: + +`clickhouse-client` を開き、`DESCRIBE` クエリを実行します: + +```sql +DESCRIBE file('data.jsonl') SETTINGS input_format_try_infer_integers=0; +``` + +```response +┌─name────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Float64) │ │ │ │ │ │ +│ age │ Nullable(Float64) │ │ │ │ │ │ +│ name │ Nullable(String) │ │ │ │ │ │ +│ hobbies │ Array(Nullable(String)) │ │ │ │ │ │ +└─────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +`system.schema_inference_cache` テーブルの内容を見てみましょう: + +```sql +SELECT * +FROM system.schema_inference_cache +FORMAT Vertical +``` +```response +Row 1: +────── +storage: File +source: /home/droscigno/user_files/data.jsonl +format: JSONEachRow +additional_format_info: schema_inference_hints=, max_rows_to_read_for_schema_inference=25000, schema_inference_make_columns_nullable=true, try_infer_integers=false, try_infer_dates=true, try_infer_datetimes=true, try_infer_numbers_from_strings=true, read_bools_as_numbers=true, try_infer_objects=false +registration_time: 2022-12-29 17:49:52 +schema: id Nullable(Float64), age Nullable(Float64), name Nullable(String), hobbies Array(Nullable(String)) +``` + +**関連項目** +- [入力データからの自動スキーマ推論](/docs/ja/interfaces/schema-inference.md) diff --git a/docs/ja/operations/system-tables/server_settings.md b/docs/ja/operations/system-tables/server_settings.md new file mode 100644 index 00000000000..4ec7ca9bded --- /dev/null +++ b/docs/ja/operations/system-tables/server_settings.md @@ -0,0 +1,64 @@ +--- +slug: /ja/operations/system-tables/server_settings +--- +# server_settings + +このテーブルには、`config.xml`で指定されたサーバーのグローバル設定に関する情報が含まれています。現在、このテーブルは`config.xml`の第一階層の設定のみを表示しており、ネストされた設定(例: [logger](../../operations/server-configuration-parameters/settings.md#logger))には対応していません。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — サーバー設定の名前。 +- `value` ([String](../../sql-reference/data-types/string.md)) — サーバー設定の値。 +- `default` ([String](../../sql-reference/data-types/string.md)) — サーバー設定のデフォルト値。 +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 設定が`config.xml`で指定されたかどうかを示します。 +- `description` ([String](../../sql-reference/data-types/string.md)) — サーバー設定の短い説明。 +- `type` ([String](../../sql-reference/data-types/string.md)) — サーバー設定の値のタイプ。 +- `changeable_without_restart` ([Enum8](../../sql-reference/data-types/enum.md)) — サーバーの実行中に設定を変更できるかどうかを示します。値: + - `'No' ` + - `'IncreaseOnly'` + - `'DecreaseOnly'` + - `'Yes'` +- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - 設定が廃止されているかどうかを示します。 + +**例** + +以下の例は、`thread_pool`を名前に含むサーバー設定に関する情報を取得する方法を示しています。 + +``` sql +SELECT * +FROM system.server_settings +WHERE name LIKE '%thread_pool%' +``` + +``` text +┌─name──────────────────────────────────────────┬─value─┬─default─┬─changed─┬─description─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─type───┬─changeable_without_restart─┬─is_obsolete─┐ +│ max_thread_pool_size │ 10000 │ 10000 │ 0 │ クエリ実行とバックグラウンド操作のためにOSから割り当てられるスレッドの最大数。 │ UInt64 │ No │ 0 │ +│ max_thread_pool_free_size │ 1000 │ 1000 │ 0 │ 一度割り当てられるとグローバルスレッドプールに常に残り、タスクの不足時にアイドル状態でいるスレッドの最大数。 │ UInt64 │ No │ 0 │ +│ thread_pool_queue_size │ 10000 │ 10000 │ 0 │ 実行待ちのタスクをキューに置くことができる最大数。 │ UInt64 │ No │ 0 │ +│ max_io_thread_pool_size │ 100 │ 100 │ 0 │ IO操作に使用されるスレッドの最大数。 │ UInt64 │ No │ 0 │ +│ max_io_thread_pool_free_size │ 0 │ 0 │ 0 │ IOスレッドプールの最大フリーサイズ。 │ UInt64 │ No │ 0 │ +│ io_thread_pool_queue_size │ 10000 │ 10000 │ 0 │ IOスレッドプールのキューサイズ。 │ UInt64 │ No │ 0 │ +│ max_active_parts_loading_thread_pool_size │ 64 │ 64 │ 0 │ 起動時にアクティブなデータパーツを読み込むスレッドの数。 │ UInt64 │ No │ 0 │ +│ max_outdated_parts_loading_thread_pool_size │ 32 │ 32 │ 0 │ 起動時に非アクティブなデータパーツを読み込むスレッドの数。 │ UInt64 │ No │ 0 │ +│ max_unexpected_parts_loading_thread_pool_size │ 32 │ 32 │ 0 │ 起動時に予期しないデータパーツを読み込むスレッドの数。 │ UInt64 │ No │ 0 │ +│ max_parts_cleaning_thread_pool_size │ 128 │ 128 │ 0 │ 非アクティブなデータパーツを同時に削除するためのスレッド数。 │ UInt64 │ No │ 0 │ +│ max_backups_io_thread_pool_size │ 1000 │ 1000 │ 0 │ BACKUPクエリのIO操作に使用されるスレッドの最大数。 │ UInt64 │ No │ 0 │ +│ max_backups_io_thread_pool_free_size │ 0 │ 0 │ 0 │ バックアップIOスレッドプールの最大フリーサイズ。 │ UInt64 │ No │ 0 │ +│ backups_io_thread_pool_queue_size │ 0 │ 0 │ 0 │ バックアップIOスレッドプールのキューサイズ。 │ UInt64 │ No │ 0 │ +└───────────────────────────────────────────────┴───────┴─────────┴─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴────────────────────────────┴─────────────┘ + +``` + +`WHERE changed`を使用することは、たとえば、構成ファイル内の設定が正しく読み込まれているか、使用されているかを確認したい場合に有用です。 + + + +``` sql +SELECT * FROM system.server_settings WHERE changed AND name='max_thread_pool_size' +``` + +**関連項目** + +- [設定](../../operations/system-tables/settings.md) +- [構成ファイル](../../operations/configuration-files.md) +- [サーバー設定](../../operations/server-configuration-parameters/settings.md) diff --git a/docs/ja/operations/system-tables/session_log.md b/docs/ja/operations/system-tables/session_log.md new file mode 100644 index 00000000000..1a974399e90 --- /dev/null +++ b/docs/ja/operations/system-tables/session_log.md @@ -0,0 +1,83 @@ +--- +slug: /ja/operations/system-tables/session_log +--- +# session_log + +すべての成功および失敗したログインとログアウトイベントに関する情報を含みます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `type` ([Enum8](../../sql-reference/data-types/enum.md)) — ログイン/ログアウト結果。可能な値: + - `LoginFailure` — ログインエラー。 + - `LoginSuccess` — 成功したログイン。 + - `Logout` — システムからのログアウト。 +- `auth_id` ([UUID](../../sql-reference/data-types/uuid.md)) — 認証ID。ユーザーがログインするたびに自動生成されるUUID。 +- `session_id` ([String](../../sql-reference/data-types/string.md)) — クライアントが[HTTP](../../interfaces/http.md)インターフェースを介して渡すセッションID。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — ログイン/ログアウトの日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — ログイン/ログアウトの時間。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度でのログイン/ログアウト開始時間。 +- `user` ([String](../../sql-reference/data-types/string.md)) — ユーザー名。 +- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)) — 認証の種類。可能な値: + - `NO_PASSWORD` + - `PLAINTEXT_PASSWORD` + - `SHA256_PASSWORD` + - `DOUBLE_SHA1_PASSWORD` + - `LDAP` + - `KERBEROS` + - `SSL_CERTIFICATE` +- `profiles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — すべてのロールおよび/またはユーザーに設定されたプロファイルのリスト。 +- `roles` ([Array](../../sql-reference/data-types/array.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md))) — プロファイルが適用されるロールのリスト。 +- `settings` ([Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md), [String](../../sql-reference/data-types/string.md)))) — クライアントがログイン/ログアウトしたときに変更された設定。 +- `client_address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — ログイン/ログアウト時に使用されたIPアドレス。 +- `client_port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — ログイン/ログアウト時に使用されたクライアントポート。 +- `interface` ([Enum8](../../sql-reference/data-types/enum.md)) — ログインが開始されたインターフェース。可能な値: + - `TCP` + - `HTTP` + - `gRPC` + - `MySQL` + - `PostgreSQL` +- `client_hostname` ([String](../../sql-reference/data-types/string.md)) — [clickhouse-client](../../interfaces/cli.md) または他のTCPクライアントが実行されているクライアントマシンのホスト名。 +- `client_name` ([String](../../sql-reference/data-types/string.md)) — `clickhouse-client` または他のTCPクライアント名。 +- `client_revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — `clickhouse-client` または他のTCPクライアントのリビジョン。 +- `client_version_major` ([UInt32](../../sql-reference/data-types/int-uint.md)) — `clickhouse-client` または他のTCPクライアントのメジャーバージョン。 +- `client_version_minor` ([UInt32](../../sql-reference/data-types/int-uint.md)) — `clickhouse-client` または他のTCPクライアントのマイナーバージョン。 +- `client_version_patch` ([UInt32](../../sql-reference/data-types/int-uint.md)) — `clickhouse-client` または他のTCPクライアントバージョンのパッチコンポーネント。 +- `failure_reason` ([String](../../sql-reference/data-types/string.md)) — ログイン/ログアウト失敗の理由を含む例外メッセージ。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.session_log LIMIT 1 FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +type: LoginSuccess +auth_id: 45e6bd83-b4aa-4a23-85e6-bd83b4aa1a23 +session_id: +event_date: 2021-10-14 +event_time: 2021-10-14 20:33:52 +event_time_microseconds: 2021-10-14 20:33:52.104247 +user: default +auth_type: PLAINTEXT_PASSWORD +profiles: ['default'] +roles: [] +settings: [('load_balancing','random'),('max_memory_usage','10000000000')] +client_address: ::ffff:127.0.0.1 +client_port: 38490 +interface: TCP +client_hostname: +client_name: ClickHouse client +client_revision: 54449 +client_version_major: 21 +client_version_minor: 10 +client_version_patch: 0 +failure_reason: +``` diff --git a/docs/ja/operations/system-tables/settings.md b/docs/ja/operations/system-tables/settings.md new file mode 100644 index 00000000000..18d19642a7e --- /dev/null +++ b/docs/ja/operations/system-tables/settings.md @@ -0,0 +1,144 @@ +--- +slug: /ja/operations/system-tables/settings +--- +# settings + +現在のユーザーのセッション設定に関する情報を含んでいます。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — 設定名。 +- `value` ([String](../../sql-reference/data-types/string.md)) — 設定値。 +- `changed` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 設定がデフォルト値から変更されているかどうかを示します。 +- `description` ([String](../../sql-reference/data-types/string.md)) — 設定の簡単な説明。 +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — [制約](../../operations/settings/constraints-on-settings.md#constraints-on-settings)を通じて設定された最小値があればその値。最小値がない場合は[NULL](../../sql-reference/syntax.md#null-literal)が含まれます。 +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — [制約](../../operations/settings/constraints-on-settings.md#constraints-on-settings)を通じて設定された最大値があればその値。最大値がない場合は[NULL](../../sql-reference/syntax.md#null-literal)が含まれます。 +- `readonly` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — 現在のユーザーが設定を変更できるかどうかを示します: + - `0` — 現在のユーザーは設定を変更できます。 + - `1` — 現在のユーザーは設定を変更できません。 +- `default` ([String](../../sql-reference/data-types/string.md)) — 設定のデフォルト値。 +- `is_obsolete` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) - 設定が廃止されているかどうかを示します。 +- `tier` ([Enum8](../../sql-reference/data-types/enum.md)) — この機能のサポートレベル。ClickHouseの機能は階層に組織化されており、開発の現在の状況と使用時の期待に応じて変化します。値: + - `'Production'` — 機能は安定しており、安全に使用でき、他の**本番用**機能と問題なく相互作用します。 + - `'Beta'` — 機能は安定しており安全です。他の機能と一緒に使用する際の結果は未知であり、正確性は保証されません。テストや報告が歓迎されます。 + - `'Experimental'` — 機能は開発中です。開発者やClickHouseの愛好者のみが対象です。機能が動作するかどうかは不明であり、いつでも削除される可能性があります。 + - `'Obsolete'` — もはやサポートされていません。すでに削除されているか、将来のリリースで削除される予定です。 + +**例** + +次の例は、名前に`min_i`を含む設定に関する情報を取得する方法を示しています。 + +``` sql +SELECT * +FROM system.settings +WHERE name LIKE '%min_insert_block_size_%' +FORMAT Vertical +``` + +``` text +Row 1: +────── +name: min_insert_block_size_rows +value: 1048449 +changed: 0 +description: テーブルに`INSERT`クエリによって挿入できるブロック内の最小行数を設定します。小さなサイズのブロックは大きなものに圧縮されます。 + +可能な値: + +- 正の整数。 +- 0 — 圧縮無効。 +min: ᴺᵁᴸᴸ +max: ᴺᵁᴸᴸ +readonly: 0 +type: UInt64 +default: 1048449 +alias_for: +is_obsolete: 0 +tier: Production + +Row 2: +────── +name: min_insert_block_size_bytes +value: 268402944 +changed: 0 +description: テーブルに`INSERT`クエリによって挿入できるブロック内の最小バイト数を設定します。小さなサイズのブロックは大きなものに圧縮されます。 + +可能な値: + +- 正の整数。 +- 0 — 圧縮無効。 +min: ᴺᵁᴸᴸ +max: ᴺᵁᴸᴸ +readonly: 0 +type: UInt64 +default: 268402944 +alias_for: +is_obsolete: 0 +tier: Production + +Row 3: +────── +name: min_insert_block_size_rows_for_materialized_views +value: 0 +changed: 0 +description: テーブルに`INSERT`クエリによって挿入できるブロック内の最小行数を設定します。小さなサイズのブロックは大きなものに圧縮されます。この設定は[materialized view](../../sql-reference/statements/create/view.md)に挿入されるブロックにのみ適用されます。この設定を調整することで、materialized viewへのプッシュ中のブロック圧縮を制御し、過剰なメモリ使用を避けることができます。 + +可能な値: + +- 任意の正の整数。 +- 0 — 圧縮無効。 + +**関連項目** + +- [min_insert_block_size_rows](#min-insert-block-size-rows) +min: ᴺᵁᴸᴸ +max: ᴺᵁᴸᴸ +readonly: 0 +type: UInt64 +default: 0 +alias_for: +is_obsolete: 0 +tier: Production + +Row 4: +────── +name: min_insert_block_size_bytes_for_materialized_views +value: 0 +changed: 0 +description: テーブルに`INSERT`クエリによって挿入できるブロック内の最小バイト数を設定します。小さなサイズのブロックは大きなものに圧縮されます。この設定は[materialized view](../../sql-reference/statements/create/view.md)に挿入されるブロックにのみ適用されます。この設定を調整することで、materialized viewへのプッシュ中のブロック圧縮を制御し、過剰なメモリ使用を避けることができます。 + +可能な値: + +- 任意の正の整数。 +- 0 — 圧縮無効。 + +**関連項目** + +- [min_insert_block_size_bytes](#min-insert-block-size-bytes) +min: ᴺᵁᴸᴸ +max: ᴺᵁᴸᴸ +readonly: 0 +type: UInt64 +default: 0 +alias_for: +is_obsolete: 0 +tier: Production + ``` + +`WHERE changed`の使用は、例えば以下の内容を確認したいときに有効です。 + +- 設定ファイル内の設定が正しく読み込まれて使用されているかどうか。 +- 現在のセッションで変更された設定。 + + + +``` sql +SELECT * FROM system.settings WHERE changed AND name='load_balancing' +``` + +**関連項目** + +- [Settings](../../operations/settings/index.md#session-settings-intro) +- [クエリの権限](../../operations/settings/permissions-for-queries.md#settings_readonly) +- [設定に対する制約](../../operations/settings/constraints-on-settings.md) +- [SHOW SETTINGS](../../sql-reference/statements/show.md#show-settings) ステートメント diff --git a/docs/ja/operations/system-tables/settings_changes.md b/docs/ja/operations/system-tables/settings_changes.md new file mode 100644 index 00000000000..b390286f2e2 --- /dev/null +++ b/docs/ja/operations/system-tables/settings_changes.md @@ -0,0 +1,32 @@ +--- +slug: /ja/operations/system-tables/settings_changes +--- +# settings_changes + +以前のClickHouseバージョンでの設定の変更に関する情報を含みます。 + +カラム: + +- `version` ([String](../../sql-reference/data-types/string.md)) — 設定が変更されたClickHouseバージョン +- `changes` ([Array](../../sql-reference/data-types/array.md) of [Tuple](../../sql-reference/data-types/tuple.md)) — 設定変更の説明: (設定名、以前の値、新しい値、変更理由) + +**例** + +``` sql +SELECT * +FROM system.settings_changes +WHERE version = '23.5' +FORMAT Vertical +``` + +``` text +行 1: +────── +version: 23.5 +changes: [('input_format_parquet_preserve_order','1','0','Parquetリーダーがより良い並列性のために行を並べ替えることを許可する。'),('parallelize_output_from_storages','0','1','ファイル/url/s3/etcから読み取るクエリの実行時に並列性を許可する。これにより行を並べ替える可能性がある。'),('use_with_fill_by_sorting_prefix','0','1','ORDER BY句でWITH FILLカラムの前にあるカラムはソートプレフィックスを形成する。ソートプレフィックスで異なる値を持つ行は独立して埋められる。'),('output_format_parquet_compliant_nested_types','0','1','出力Parquetファイルスキーマの内部フィールド名を変更する。')] +``` + +**関連項目** + +- [設定](../../operations/settings/index.md#session-settings-intro) +- [system.settings](settings.md) diff --git a/docs/ja/operations/system-tables/settings_profile_elements.md b/docs/ja/operations/system-tables/settings_profile_elements.md new file mode 100644 index 00000000000..54e0eff309c --- /dev/null +++ b/docs/ja/operations/system-tables/settings_profile_elements.md @@ -0,0 +1,31 @@ +--- +slug: /ja/operations/system-tables/settings_profile_elements +--- +# settings_profile_elements + +設定プロファイルの内容を説明します: + +- 制約。 +- 設定が適用されるロールおよびユーザー。 +- 親設定プロファイル。 + +カラム: +- `profile_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 設定プロファイル名。 + +- `user_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ユーザー名。 + +- `role_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — ロール名。 + +- `index` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 設定プロファイル要素の連続番号。 + +- `setting_name` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 設定名。 + +- `value` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 設定値。 + +- `min` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 設定の最小値。設定されていない場合は `NULL`。 + +- `max` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — 設定の最大値。設定されていない場合は NULL。 + +- `writability` ([Nullable](../../sql-reference/data-types/nullable.md)([Enum8](../../sql-reference/data-types/enum.md)('WRITABLE' = 0, 'CONST' = 1, 'CHANGEABLE_IN_READONLY' = 2))) — 設定制約の書き込み可能性の種類を設定します。 + +- `inherit_profile` ([Nullable](../../sql-reference/data-types/nullable.md)([String](../../sql-reference/data-types/string.md))) — この設定プロファイルの親プロファイル。設定されていない場合は `NULL`。設定プロファイルは親プロファイルからすべての設定値および制約 (`min`, `max`, `readonly`) を継承します。 diff --git a/docs/ja/operations/system-tables/settings_profiles.md b/docs/ja/operations/system-tables/settings_profiles.md new file mode 100644 index 00000000000..e537320c8ca --- /dev/null +++ b/docs/ja/operations/system-tables/settings_profiles.md @@ -0,0 +1,25 @@ +--- +slug: /ja/operations/system-tables/settings_profiles +--- +# settings_profiles + +設定プロファイルのプロパティを含みます。 + +カラム: +- `name` ([String](../../sql-reference/data-types/string.md)) — 設定プロファイル名。 + +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — 設定プロファイルID。 + +- `storage` ([String](../../sql-reference/data-types/string.md)) — 設定プロファイルの保存場所へのパス。`access_control_path` パラメータで設定されます。 + +- `num_elements` ([UInt64](../../sql-reference/data-types/int-uint.md)) — `system.settings_profile_elements` テーブル内のこのプロファイルに対する要素の数。 + +- `apply_to_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — すべてのロールおよび/またはユーザーに設定プロファイルが適用されることを示します。 + +- `apply_to_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — 設定プロファイルが適用されるロールおよび/またはユーザーのリスト。 + +- `apply_to_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — このリストに記載されているものを除くすべてのロールおよび/またはユーザーに設定プロファイルが適用されます。 + +## 参照 {#see-also} + +- [SHOW PROFILES](../../sql-reference/statements/show.md#show-profiles-statement) diff --git a/docs/ja/operations/system-tables/stack_trace.md b/docs/ja/operations/system-tables/stack_trace.md new file mode 100644 index 00000000000..229d30ac542 --- /dev/null +++ b/docs/ja/operations/system-tables/stack_trace.md @@ -0,0 +1,96 @@ +--- +slug: /ja/operations/system-tables/stack_trace +--- +# stack_trace + +すべてのサーバースレッドのスタックトレースを含みます。開発者がサーバーの状態を調査するのを可能にします。 + +スタックフレームを解析するには、`addressToLine`、`addressToLineWithInlines`、`addressToSymbol` そして `demangle` [イントロスペクション関数](../../sql-reference/functions/introspection.md)を使用します。 + +カラム: + +- `thread_name` ([String](../../sql-reference/data-types/string.md)) — スレッド名。 +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — スレッド識別子。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — [query_log](../system-tables/query_log.md) システムテーブルから実行中のクエリの詳細を取得するために使用できるクエリ識別子。 +- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — メソッドが格納されている物理アドレスのリストを表す[スタックトレース](https://en.wikipedia.org/wiki/Stack_trace)。 + +:::tip +いくつかの便利なクエリ(たとえば[現在実行中のスレッドを確認する方法](https://clickhouse.com/docs/knowledgebase/find-expensive-queries) と [トラブルシューティングに役立つクエリ](https://clickhouse.com/docs/knowledgebase/useful-queries-for-troubleshooting))については、ナレッジベースを確認してください。 +::: + +**例** + +イントロスペクション関数を有効にする: + +``` sql +SET allow_introspection_functions = 1; +``` + +ClickHouseオブジェクトファイルからシンボルを取得する: + +``` sql +WITH arrayMap(x -> demangle(addressToSymbol(x)), trace) AS all SELECT thread_name, thread_id, query_id, arrayStringConcat(all, '\n') AS res FROM system.stack_trace LIMIT 1 \G; +``` + +``` text +Row 1: +────── +thread_name: QueryPipelineEx +thread_id: 743490 +query_id: dc55a564-febb-4e37-95bb-090ef182c6f1 +res: memcpy +large_ralloc +arena_ralloc +do_rallocx +Allocator::realloc(void*, unsigned long, unsigned long, unsigned long) +HashTable, HashTableNoState, PairNoInit>, HashCRC32, HashTableGrowerWithPrecalculation<8ul>, Allocator>::resize(unsigned long, unsigned long) +void DB::Aggregator::executeImplBatch, HashTableNoState, PairNoInit>, HashCRC32, HashTableGrowerWithPrecalculation<8ul>, Allocator>, true, false>>(DB::AggregationMethodOneNumber, HashTableNoState, PairNoInit>, HashCRC32, HashTableGrowerWithPrecalculation<8ul>, Allocator>, true, false>&, DB::AggregationMethodOneNumber, HashTableNoState, PairNoInit>, HashCRC32, HashTableGrowerWithPrecalculation<8ul>, Allocator>, true, false>::State&, DB::Arena*, unsigned long, unsigned long, DB::Aggregator::AggregateFunctionInstruction*, bool, char*) const +DB::Aggregator::executeImpl(DB::AggregatedDataVariants&, unsigned long, unsigned long, std::__1::vector>&, DB::Aggregator::AggregateFunctionInstruction*, bool, bool, char*) const +DB::Aggregator::executeOnBlock(std::__1::vector::immutable_ptr, std::__1::allocator::immutable_ptr>>, unsigned long, unsigned long, DB::AggregatedDataVariants&, std::__1::vector>&, std::__1::vector>, std::__1::allocator>>>&, bool&) const +DB::AggregatingTransform::work() +DB::ExecutionThreadContext::executeTask() +DB::PipelineExecutor::executeStepImpl(unsigned long, std::__1::atomic*) +void std::__1::__function::__policy_invoker::__call_impl>(std::__1::__function::__policy_storage const*) +ThreadPoolImpl>::worker(std::__1::__list_iterator, void*>) +void std::__1::__function::__policy_invoker::__call_impl::ThreadFromGlobalPoolImpl>::scheduleImpl(std::__1::function, Priority, std::__1::optional, bool)::'lambda0'()>(void&&)::'lambda'(), void ()>>(std::__1::__function::__policy_storage const*) +void* std::__1::__thread_proxy[abi:v15000]>, void ThreadPoolImpl::scheduleImpl(std::__1::function, Priority, std::__1::optional, bool)::'lambda0'()>>(void*) +``` + +ClickHouseソースコード内のファイル名と行番号を取得する: + +``` sql +WITH arrayMap(x -> addressToLine(x), trace) AS all, arrayFilter(x -> x LIKE '%/dbms/%', all) AS dbms SELECT thread_name, thread_id, query_id, arrayStringConcat(notEmpty(dbms) ? dbms : all, '\n') AS res FROM system.stack_trace LIMIT 1 \G; +``` + +``` text +Row 1: +────── +thread_name: clickhouse-serv + +thread_id: 686 +query_id: cad353e7-1c29-4b2e-949f-93e597ab7a54 +res: /lib/x86_64-linux-gnu/libc-2.27.so +/build/obj-x86_64-linux-gnu/../src/Storages/System/StorageSystemStackTrace.cpp:182 +/build/obj-x86_64-linux-gnu/../contrib/libcxx/include/vector:656 +/build/obj-x86_64-linux-gnu/../src/Interpreters/InterpreterSelectQuery.cpp:1338 +/build/obj-x86_64-linux-gnu/../src/Interpreters/InterpreterSelectQuery.cpp:751 +/build/obj-x86_64-linux-gnu/../contrib/libcxx/include/optional:224 +/build/obj-x86_64-linux-gnu/../src/Interpreters/InterpreterSelectWithUnionQuery.cpp:192 +/build/obj-x86_64-linux-gnu/../src/Interpreters/executeQuery.cpp:384 +/build/obj-x86_64-linux-gnu/../src/Interpreters/executeQuery.cpp:643 +/build/obj-x86_64-linux-gnu/../src/Server/TCPHandler.cpp:251 +/build/obj-x86_64-linux-gnu/../src/Server/TCPHandler.cpp:1197 +/build/obj-x86_64-linux-gnu/../contrib/poco/Net/src/TCPServerConnection.cpp:57 +/build/obj-x86_64-linux-gnu/../contrib/libcxx/include/atomic:856 +/build/obj-x86_64-linux-gnu/../contrib/poco/Foundation/include/Poco/Mutex_POSIX.h:59 +/build/obj-x86_64-linux-gnu/../contrib/poco/Foundation/include/Poco/AutoPtr.h:223 +/lib/x86_64-linux-gnu/libpthread-2.27.so +/lib/x86_64-linux-gnu/libc-2.27.so +``` + +**関連項目** + +- [イントロスペクション関数](../../sql-reference/functions/introspection.md) — 利用可能なイントロスペクション関数とその使用法について。 +- [system.trace_log](../system-tables/trace_log.md) — サンプリングクエリプロファイラによって収集されたスタックトレースを含む。 +- [arrayMap](../../sql-reference/functions/array-functions.md#array-map) — `arrayMap` 関数の説明と使用例。 +- [arrayFilter](../../sql-reference/functions/array-functions.md#array-filter) — `arrayFilter` 関数の説明と使用例。 diff --git a/docs/ja/operations/system-tables/storage_policies.md b/docs/ja/operations/system-tables/storage_policies.md new file mode 100644 index 00000000000..cadd9288b68 --- /dev/null +++ b/docs/ja/operations/system-tables/storage_policies.md @@ -0,0 +1,26 @@ +--- +slug: /ja/operations/system-tables/storage_policies +--- +# storage_policies + +[サーバー設定](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes_configure)で定義されたストレージポリシーとボリュームに関する情報を含みます。 + +カラム: + +- `policy_name` ([String](../../sql-reference/data-types/string.md)) — ストレージポリシーの名前。 +- `volume_name` ([String](../../sql-reference/data-types/string.md)) — ストレージポリシーで定義されたボリュームの名前。 +- `volume_priority` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 設定内でのボリューム順序番号、この順序に従ってデータがボリュームに記入されます。すなわち、データの挿入とマージ時に優先度の低いボリュームにデータが書き込まれます(他のルール: 有効期限 (TTL)、`max_data_part_size`、`move_factor`も考慮)。 +- `disks` ([Array(String)](../../sql-reference/data-types/array.md)) — ストレージポリシーで定義されたディスク名。 +- `volume_type` ([Enum8](../../sql-reference/data-types/enum.md)) — ボリュームのタイプ。以下の値のいずれかを持つことができます: + - `JBOD` + - `SINGLE_DISK` + - `UNKNOWN` +- `max_data_part_size` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ボリュームディスクに格納可能なデータパートの最大サイズ(0 — 制限なし)。 +- `move_factor` ([Float64](../../sql-reference/data-types/float.md)) — 空きディスクスペースの比率。この比率が設定パラメーターの値を超えると、ClickHouseはデータを次のボリュームへ移動し始めます。 +- `prefer_not_to_merge` ([UInt8](../../sql-reference/data-types/int-uint.md)) — `prefer_not_to_merge`設定の値。常にfalseであるべきです。この設定が有効の場合、誤りました。 +- `perform_ttl_move_on_insert` ([UInt8](../../sql-reference/data-types/int-uint.md)) — `perform_ttl_move_on_insert`設定の値。データパートINSERT時のTTL移動を無効化します。デフォルトでは、TTL移動ルールによってすでに期限切れのデータパートを挿入すると、それは即座に移動ルールで宣言されたボリューム/ディスクに移動します。移動先のボリューム/ディスクが遅い場合(例えばS3)、これが挿入を著しく遅くする可能性があります。 +- `load_balancing` ([Enum8](../../sql-reference/data-types/enum.md)) — ディスクバランジングのポリシー。以下の値のいずれかを持つことができます: + - `ROUND_ROBIN` + - `LEAST_USED` + +ストレージポリシーに複数のボリュームが含まれる場合、各ボリュームの情報はテーブルの個別の行に保存されます。 diff --git a/docs/ja/operations/system-tables/symbols.md b/docs/ja/operations/system-tables/symbols.md new file mode 100644 index 00000000000..3df9e251a9a --- /dev/null +++ b/docs/ja/operations/system-tables/symbols.md @@ -0,0 +1,34 @@ +--- +slug: /ja/operations/system-tables/symbols +--- +# symbols + +`clickhouse` バイナリの内部構造のための情報を含んでいます。アクセスするにはイントロスペクション特権が必要です。このテーブルは C++ の専門家や ClickHouse のエンジニアにのみ役立ちます。 + +カラム: + +- `symbol` ([String](../../sql-reference/data-types/string.md)) — バイナリ内のシンボル名です。これはマングルされています。`demangle(symbol)` を適用すると可読性のある名前を取得できます。 +- `address_begin` ([UInt64](../../sql-reference/data-types/int-uint.md)) — バイナリ内のシンボルの開始アドレス。 +- `address_end` ([UInt64](../../sql-reference/data-types/int-uint.md)) — バイナリ内のシンボルの終了アドレス。 +- `name` ([String](../../sql-reference/data-types/string.md)) — `event` のエイリアス。 + +**例** + +``` sql +SELECT address_begin, address_end - address_begin AS size, demangle(symbol) FROM system.symbols ORDER BY size DESC LIMIT 10 +``` + +``` text +┌─address_begin─┬─────size─┬─demangle(symbol)──────────────────────────────────────────────────────────────────┐ +│ 25000976 │ 29466000 │ icudt70_dat │ +│ 400605288 │ 2097272 │ arena_emap_global │ +│ 18760592 │ 1048576 │ CLD2::kQuadChrome1015_2 │ +│ 9807152 │ 884808 │ TopLevelDomainLookupHash::isValid(char const*, unsigned long)::wordlist │ +│ 57442432 │ 850608 │ llvm::X86Insts │ +│ 55682944 │ 681360 │ (anonymous namespace)::X86DAGToDAGISel::SelectCode(llvm::SDNode*)::MatcherTable │ +│ 55130368 │ 502840 │ (anonymous namespace)::X86InstructionSelector::getMatchTable() const::MatchTable0 │ +│ 402930616 │ 404032 │ qpl::ml::dispatcher::hw_dispatcher::get_instance()::instance │ +│ 274131872 │ 356795 │ DB::SettingsTraits::Accessor::instance()::$_0::operator()() const │ +│ 58293040 │ 249424 │ llvm::X86InstrNameData │ +└───────────────┴──────────┴───────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/operations/system-tables/table_engines.md b/docs/ja/operations/system-tables/table_engines.md new file mode 100644 index 00000000000..94cfda67395 --- /dev/null +++ b/docs/ja/operations/system-tables/table_engines.md @@ -0,0 +1,39 @@ +--- +slug: /ja/operations/system-tables/table_engines +--- +# table_engines + +サーバーでサポートされているテーブルエンジンの説明と、その機能サポート情報を含んでいます。 + +このテーブルには次のカラム(カラムタイプが括弧内に示されています)が含まれています: + +- `name` (String) — テーブルエンジンの名前。 +- `supports_settings` (UInt8) — テーブルエンジンが`SETTINGS`句をサポートするかを示すフラグ。 +- `supports_skipping_indices` (UInt8) — テーブルエンジンが[スキッピングインデックス](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-data_skipping-indexes)をサポートするかを示すフラグ。 +- `supports_ttl` (UInt8) — テーブルエンジンが[有効期限 (TTL)](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl)をサポートするかを示すフラグ。 +- `supports_sort_order` (UInt8) — テーブルエンジンが`PARTITION_BY`、`PRIMARY_KEY`、`ORDER_BY`、および`SAMPLE_BY`句をサポートするかを示すフラグ。 +- `supports_replication` (UInt8) — テーブルエンジンが[データレプリケーション](../../engines/table-engines/mergetree-family/replication.md)をサポートするかを示すフラグ。 +- `supports_deduplication` (UInt8) — テーブルエンジンがデータの重複除去をサポートするかを示すフラグ。 +- `supports_parallel_insert` (UInt8) — テーブルエンジンが並列挿入をサポートするかを示すフラグ([`max_insert_threads`](../../operations/settings/settings.md#max-insert-threads)設定を参照)。 + +例: + +``` sql +SELECT * +FROM system.table_engines +WHERE name in ('Kafka', 'MergeTree', 'ReplicatedCollapsingMergeTree') +``` + +``` text +┌─name──────────────────────────┬─supports_settings─┬─supports_skipping_indices─┬─supports_sort_order─┬─supports_ttl─┬─supports_replication─┬─supports_deduplication─┬─supports_parallel_insert─┐ +│ MergeTree │ 1 │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ +│ Kafka │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ +│ ReplicatedCollapsingMergeTree │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ 1 │ +└───────────────────────────────┴───────────────────┴───────────────────────────┴─────────────────────┴──────────────┴──────────────────────┴────────────────────────┴──────────────────────────┘ +``` + +**関連項目** + +- MergeTree ファミリーの[クエリ句](../../engines/table-engines/mergetree-family/mergetree.md#mergetree-query-clauses) +- Kafkaの[設定](../../engines/table-engines/integrations/kafka.md#table_engine-kafka-creating-a-table) +- Joinの[設定](../../engines/table-engines/special/join.md#join-limitations-and-settings) diff --git a/docs/ja/operations/system-tables/tables.md b/docs/ja/operations/system-tables/tables.md new file mode 100644 index 00000000000..8f26af16045 --- /dev/null +++ b/docs/ja/operations/system-tables/tables.md @@ -0,0 +1,150 @@ +--- +slug: /ja/operations/system-tables/tables +--- +# tables + +サーバーが認識している各テーブルのメタデータを含みます。 + +[Detach](../../sql-reference/statements/detach.md)されたテーブルは`system.tables`には表示されません。 + +[一時テーブル](../../sql-reference/statements/create/table.md#temporary-tables)は、それが作成されたセッション内でのみ`system.tables`に表示されます。それらは空の`database`フィールドと`is_temporary`フラグがオンの状態で示されます。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブルが所属するデータベースの名前。 + +- `name` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 + +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — テーブルのUUID(Atomicデータベース)。 + +- `engine` ([String](../../sql-reference/data-types/string.md)) — テーブルエンジン名(パラメータなし)。 + +- `is_temporary` ([UInt8](../../sql-reference/data-types/int-uint.md)) - テーブルが一時的であるかを示すフラグ。 + +- `data_paths` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - ファイルシステム内のテーブルデータのパス。 + +- `metadata_path` ([String](../../sql-reference/data-types/string.md)) - ファイルシステム内のテーブルメタデータのパス。 + +- `metadata_modification_time` ([DateTime](../../sql-reference/data-types/datetime.md)) - テーブルメタデータの最新修正時間。 + +- `metadata_version` ([Int32](../../sql-reference/data-types/int-uint.md)) - ReplicatedMergeTreeテーブルのメタデータバージョン、非ReplicatedMergeTreeテーブルの場合は0。 + +- `dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - データベースの依存関係。 + +- `dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - テーブルの依存関係(現行テーブルの[Materialized View](../../sql-reference/statements/create/view.md#materialized-view))。 + +- `create_table_query` ([String](../../sql-reference/data-types/string.md)) - テーブルを作成するために使用されたクエリ。 + +- `engine_full` ([String](../../sql-reference/data-types/string.md)) - テーブルエンジンのパラメータ。 + +- `as_select` ([String](../../sql-reference/data-types/string.md)) - ビュー用の`SELECT`クエリ。 + +- `partition_key` ([String](../../sql-reference/data-types/string.md)) - テーブルで指定されたパーティションキー表現。 + +- `sorting_key` ([String](../../sql-reference/data-types/string.md)) - テーブルで指定されたソーティングキー表現。 + +- `primary_key` ([String](../../sql-reference/data-types/string.md)) - テーブルで指定された主キー表現。 + +- `sampling_key` ([String](../../sql-reference/data-types/string.md)) - テーブルで指定されたサンプリングキー表現。 + +- `storage_policy` ([String](../../sql-reference/data-types/string.md)) - ストレージポリシー: + + - [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) + - [Distributed](../../engines/table-engines/special/distributed.md#distributed) + +- `total_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - テーブル内の正確な行数を迅速に特定できる場合、合計行数。できない場合は`NULL`(基礎となる`Buffer`テーブルを含む)。 + +- `total_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - ストレージ上のテーブルに対して正確なバイト数を迅速に特定できる場合、合計バイト数。できない場合は`NULL`(基礎となるストレージを含まない)。 + + - ディスクにデータを保存するテーブルの場合、ディスク上の使用済みスペース(圧縮状態)を返します。 + - メモリにデータを保存するテーブルの場合、メモリで使用されているおおよそのバイト数を返します。 + +- `total_bytes_uncompressed` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - ストレージ上のテーブルに対してパートのチェックサムから正確なバイト数を迅速に特定できる場合の非圧縮バイト総数。できない場合は`NULL`(基礎となるストレージを考慮しない)。 + +- `lifetime_rows` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - サーバ起動以来INSERTされた行の総数(`Buffer`テーブルのみ)。 + +- `lifetime_bytes` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) - サーバ起動以来INSERTされたバイトの総数(`Buffer`テーブルのみ)。 + +- `comment` ([String](../../sql-reference/data-types/string.md)) - テーブルへのコメント。 + +- `has_own_data` ([UInt8](../../sql-reference/data-types/int-uint.md)) — テーブル自身がディスク上にデータを保存しているか、別のソースにのみアクセスしているかを示すフラグ。 + +- `loading_dependencies_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - データベースの読み込み依存関係(現行オブジェクトの前に読み込まれるべきオブジェクトのリスト)。 + +- `loading_dependencies_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - テーブルの読み込み依存関係(現行オブジェクトの前に読み込まれるべきオブジェクトのリスト)。 + +- `loading_dependent_database` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - 依存しているデータベースの読み込み。 + +- `loading_dependent_table` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) - 依存しているテーブルの読み込み。 + +`system.tables` テーブルは`SHOW TABLES`クエリの実装で使用されます。 + +**例** + +```sql +SELECT * FROM system.tables LIMIT 2 FORMAT Vertical; +``` + +```text +Row 1: +────── +database: base +name: t1 +uuid: 81b1c20a-b7c6-4116-a2ce-7583fb6b6736 +engine: MergeTree +is_temporary: 0 +data_paths: ['/var/lib/clickhouse/store/81b/81b1c20a-b7c6-4116-a2ce-7583fb6b6736/'] +metadata_path: /var/lib/clickhouse/store/461/461cf698-fd0b-406d-8c01-5d8fd5748a91/t1.sql +metadata_modification_time: 2021-01-25 19:14:32 +dependencies_database: [] +dependencies_table: [] +create_table_query: CREATE TABLE base.t1 (`n` UInt64) ENGINE = MergeTree ORDER BY n SETTINGS index_granularity = 8192 +engine_full: MergeTree ORDER BY n SETTINGS index_granularity = 8192 +as_select: SELECT database AS table_catalog +partition_key: +sorting_key: n +primary_key: n +sampling_key: +storage_policy: default +total_rows: 1 +total_bytes: 99 +lifetime_rows: ᴺᵁᴸᴸ +lifetime_bytes: ᴺᵁᴸᴸ +comment: +has_own_data: 0 +loading_dependencies_database: [] +loading_dependencies_table: [] +loading_dependent_database: [] +loading_dependent_table: [] + +Row 2: +────── +database: default +name: 53r93yleapyears +uuid: 00000000-0000-0000-0000-000000000000 +engine: MergeTree +is_temporary: 0 +data_paths: ['/var/lib/clickhouse/data/default/53r93yleapyears/'] +metadata_path: /var/lib/clickhouse/metadata/default/53r93yleapyears.sql +metadata_modification_time: 2020-09-23 09:05:36 +dependencies_database: [] +dependencies_table: [] +create_table_query: CREATE TABLE default.`53r93yleapyears` (`id` Int8, `febdays` Int8) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192 +engine_full: MergeTree ORDER BY id SETTINGS index_granularity = 8192 +as_select: SELECT name AS catalog_name +partition_key: +sorting_key: id +primary_key: id +sampling_key: +storage_policy: default +total_rows: 2 +total_bytes: 155 +lifetime_rows: ᴺᵁᴸᴸ +lifetime_bytes: ᴺᵁᴸᴸ +comment: +has_own_data: 0 +loading_dependencies_database: [] +loading_dependencies_table: [] +loading_dependent_database: [] +loading_dependent_table: [] +``` diff --git a/docs/ja/operations/system-tables/text_log.md b/docs/ja/operations/system-tables/text_log.md new file mode 100644 index 00000000000..6bc239eb894 --- /dev/null +++ b/docs/ja/operations/system-tables/text_log.md @@ -0,0 +1,78 @@ +--- +slug: /ja/operations/system-tables/text_log +--- +# text_log + +ログエントリを含んでいます。このテーブルに出力されるログレベルは、`text_log.level`サーバー設定で制限することができます。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `event_date` (Date) — エントリの日付。 +- `event_time` (DateTime) — エントリの時刻。 +- `event_time_microseconds` (DateTime64) — マイクロ秒単位の精度でのエントリの時刻。 +- `microseconds` (UInt32) — エントリのマイクロ秒。 +- `thread_name` (String) — ロギングが行われたスレッドの名前。 +- `thread_id` (UInt64) — OSのスレッドID。 +- `level` (`Enum8`) — エントリのレベル。可能な値: + - `1` または `'Fatal'`。 + - `2` または `'Critical'`。 + - `3` または `'Error'`。 + - `4` または `'Warning'`。 + - `5` または `'Notice'`。 + - `6` または `'Information'`。 + - `7` または `'Debug'`。 + - `8` または `'Trace'`。 +- `query_id` (String) — クエリのID。 +- `logger_name` (LowCardinality(String)) — ロガーの名前(例: `DDLWorker`)。 +- `message` (String) — メッセージ自体。 +- `revision` (UInt32) — ClickHouseのリビジョン。 +- `source_file` (LowCardinality(String)) — ロギングが行われたソースファイル。 +- `source_line` (UInt64) — ロギングが行われたソース行。 +- `message_format_string` (LowCardinality(String)) — メッセージのフォーマットに使用されたフォーマット文字列。 +- `value1` (String) - メッセージのフォーマットに使用された引数1。 +- `value2` (String) - メッセージのフォーマットに使用された引数2。 +- `value3` (String) - メッセージのフォーマットに使用された引数3。 +- `value4` (String) - メッセージのフォーマットに使用された引数4。 +- `value5` (String) - メッセージのフォーマットに使用された引数5。 +- `value6` (String) - メッセージのフォーマットに使用された引数6。 +- `value7` (String) - メッセージのフォーマットに使用された引数7。 +- `value8` (String) - メッセージのフォーマットに使用された引数8。 +- `value9` (String) - メッセージのフォーマットに使用された引数9。 +- `value10` (String) - メッセージのフォーマットに使用された引数10。 + +**例** + +``` sql +SELECT * FROM system.text_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2020-09-10 +event_time: 2020-09-10 11:23:07 +event_time_microseconds: 2020-09-10 11:23:07.871397 +microseconds: 871397 +thread_name: clickhouse-serv +thread_id: 564917 +level: Information +query_id: +logger_name: DNSCacheUpdater +message: Update period 15 seconds +revision: 54440 +source_file: /ClickHouse/src/Interpreters/DNSCacheUpdater.cpp; void DB::DNSCacheUpdater::start() +source_line: 45 +message_format_string: Update period {} seconds +value1: 15 +value2: +value3: +value4: +value5: +value6: +value7: +value8: +value9: +value10: +``` diff --git a/docs/ja/operations/system-tables/time_zones.md b/docs/ja/operations/system-tables/time_zones.md new file mode 100644 index 00000000000..13923d92498 --- /dev/null +++ b/docs/ja/operations/system-tables/time_zones.md @@ -0,0 +1,31 @@ +--- +slug: /ja/operations/system-tables/time_zones +title: time_zones +--- + +ClickHouseサーバーがサポートしているタイムゾーンのリストを含みます。このタイムゾーンのリストは、ClickHouseのバージョンによって異なる場合があります。 + +カラム: + +- `time_zone` (String) — サポートされているタイムゾーンのリスト。 + +**例** + +``` sql +SELECT * FROM system.time_zones LIMIT 10 +``` + +``` text +┌─time_zone──────────┐ +│ Africa/Abidjan │ +│ Africa/Accra │ +│ Africa/Addis_Ababa │ +│ Africa/Algiers │ +│ Africa/Asmara │ +│ Africa/Asmera │ +│ Africa/Bamako │ +│ Africa/Bangui │ +│ Africa/Banjul │ +│ Africa/Bissau │ +└────────────────────┘ +``` diff --git a/docs/ja/operations/system-tables/trace_log.md b/docs/ja/operations/system-tables/trace_log.md new file mode 100644 index 00000000000..66641a1dea2 --- /dev/null +++ b/docs/ja/operations/system-tables/trace_log.md @@ -0,0 +1,57 @@ +--- +slug: /ja/operations/system-tables/trace_log +--- +# trace_log + +[sampling query profiler](../../operations/optimizing-performance/sampling-query-profiler.md) によって収集されたスタックトレースが含まれています。 + +このテーブルは、[trace_log](../../operations/server-configuration-parameters/settings.md#trace_log) サーバー設定セクションがセットされると ClickHouse によって作成されます。設定も参照してください:[query_profiler_real_time_period_ns](../../operations/settings/settings.md#query_profiler_real_time_period_ns)、[query_profiler_cpu_time_period_ns](../../operations/settings/settings.md#query_profiler_cpu_time_period_ns)、[memory_profiler_step](../../operations/settings/settings.md#memory_profiler_step)、[memory_profiler_sample_probability](../../operations/settings/settings.md#memory_profiler_sample_probability)、[trace_profile_events](../../operations/settings/settings.md#trace_profile_events)。 + +ログを解析するには、`addressToLine`、`addressToLineWithInlines`、`addressToSymbol`、および `demangle` のイントロスペクション関数を使用します。 + +カラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行しているサーバーのホスト名。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — サンプリング時点の日付。 +- `event_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — サンプリング時点のタイムスタンプ。 +- `event_time_microseconds` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — マイクロ秒精度のサンプリング時点のタイムスタンプ。 +- `timestamp_ns` ([UInt64](../../sql-reference/data-types/int-uint.md)) — ナノ秒精度のサンプリング時点のタイムスタンプ。 +- `revision` ([UInt32](../../sql-reference/data-types/int-uint.md)) — ClickHouse サーバーのビルドリビジョン。 + + `clickhouse-client` でサーバーに接続すると、`Connected to ClickHouse server version 19.18.1.` のような文字列が表示されます。このフィールドにはサーバーの `revision` が含まれており、`version` は含まれていません。 + +- `trace_type` ([Enum8](../../sql-reference/data-types/enum.md)) — トレースの種類: + - `Real` は、ウォールクロック時間でのスタックトレースの収集を表します。 + - `CPU` は、CPU時間でのスタックトレースの収集を表します。 + - `Memory` は、メモリアロケーションがサブシークエントウォーターマークを超えたときのアロケーションとデアロケーションの収集を表します。 + - `MemorySample` は、ランダムなアロケーションとデアロケーションの収集を表します。 + - `MemoryPeak` は、ピークメモリ使用量の更新の収集を表します。 + - `ProfileEvent` は、プロフィールイベントのインクリメントの収集を表します。 +- `thread_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — スレッド識別子。 +- `query_id` ([String](../../sql-reference/data-types/string.md)) — 実行中のクエリの詳細を [query_log](#system_tables-query_log) システムテーブルから取得するためのクエリ識別子。 +- `trace` ([Array(UInt64)](../../sql-reference/data-types/array.md)) — サンプリング時点のスタックトレース。各要素は ClickHouse サーバープロセス内の仮想メモリアドレスです。 +- `size` ([Int64](../../sql-reference/data-types/int-uint.md)) - `Memory`、`MemorySample` または `MemoryPeak` のトレースタイプではアロケートされたメモリの量、他のトレースタイプでは0です。 +- `event` ([LowCardinality(String)](../../sql-reference/data-types/lowcardinality.md)) - `ProfileEvent` のトレースタイプでは更新されたプロフィールイベントの名前、他のトレースタイプでは空文字列です。 +- `increment` ([UInt64](../../sql-reference/data-types/int-uint.md)) - `ProfileEvent` のトレースタイプではプロフィールイベントの増加量、他のトレースタイプでは0です。 + +**例** + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G +``` + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +event_date: 2020-09-10 +event_time: 2020-09-10 11:23:09 +event_time_microseconds: 2020-09-10 11:23:09.872924 +timestamp_ns: 1599762189872924510 +revision: 54440 +trace_type: Memory +thread_id: 564963 +query_id: +trace: [371912858,371912789,371798468,371799717,371801313,371790250,624462773,566365041,566440261,566445834,566460071,566459914,566459842,566459580,566459469,566459389,566459341,566455774,371993941,371988245,372158848,372187428,372187309,372187093,372185478,140222123165193,140222122205443] +size: 5244400 +``` diff --git a/docs/ja/operations/system-tables/user_processes.md b/docs/ja/operations/system-tables/user_processes.md new file mode 100644 index 00000000000..2e6fa7eadec --- /dev/null +++ b/docs/ja/operations/system-tables/user_processes.md @@ -0,0 +1,28 @@ +--- +slug: /ja/operations/system-tables/user_processes +--- +# user_processes + +このシステムテーブルは、ユーザーのメモリ使用量とProfileEventsの概要を取得するために利用できます。 + +カラム: + +- `user` ([String](../../sql-reference/data-types/string.md)) — ユーザー名。 +- `memory_usage` ([Int64](../../sql-reference/data-types/int-uint#int-ranges)) – ユーザーの全プロセスによって使用されているRAMの合計。一部の専用メモリのタイプを含まない場合があります。[max_memory_usage](../../operations/settings/query-complexity.md#settings_max_memory_usage) 設定を参照してください。 +- `peak_memory_usage` ([Int64](../../sql-reference/data-types/int-uint#int-ranges)) — ユーザーのメモリ使用量のピーク。この値は、ユーザーのクエリが実行されない状態でリセットされることがあります。 +- `ProfileEvents` ([Map(String, UInt64)](../../sql-reference/data-types/map)) – ユーザーの異なるメトリクスを計測するProfileEventsの概要。それらの説明は、テーブル[system.events](../../operations/system-tables/events.md#system_tables-events)で確認できます。 + +```sql +SELECT * FROM system.user_processes LIMIT 10 FORMAT Vertical; +``` + +```response +Row 1: +────── +user: default +memory_usage: 9832 +peak_memory_usage: 9832 +ProfileEvents: {'Query':5,'SelectQuery':5,'QueriesWithSubqueries':38,'SelectQueriesWithSubqueries':38,'QueryTimeMicroseconds':842048,'SelectQueryTimeMicroseconds':842048,'ReadBufferFromFileDescriptorRead':6,'ReadBufferFromFileDescriptorReadBytes':234,'IOBufferAllocs':3,'IOBufferAllocBytes':98493,'ArenaAllocChunks':283,'ArenaAllocBytes':1482752,'FunctionExecute':670,'TableFunctionExecute':16,'DiskReadElapsedMicroseconds':19,'NetworkSendElapsedMicroseconds':684,'NetworkSendBytes':139498,'SelectedRows':6076,'SelectedBytes':685802,'ContextLock':1140,'RWLockAcquiredReadLocks':193,'RWLockReadersWaitMilliseconds':4,'RealTimeMicroseconds':1585163,'UserTimeMicroseconds':889767,'SystemTimeMicroseconds':13630,'SoftPageFaults':1947,'OSCPUWaitMicroseconds':6,'OSCPUVirtualTimeMicroseconds':903251,'OSReadChars':28631,'OSWriteChars':28888,'QueryProfilerRuns':3,'LogTrace':79,'LogDebug':24} + +1 row in set. Elapsed: 0.010 sec. +``` diff --git a/docs/ja/operations/system-tables/users.md b/docs/ja/operations/system-tables/users.md new file mode 100644 index 00000000000..06a1c42a054 --- /dev/null +++ b/docs/ja/operations/system-tables/users.md @@ -0,0 +1,35 @@ +--- +slug: /ja/operations/system-tables/users +--- +# users + +サーバーで設定されている[ユーザーアカウント](../../guides/sre/user-management/index.md#user-account-management)の一覧を含みます。 + +カラム: +- `name` ([String](../../sql-reference/data-types/string.md)) — ユーザー名。 + +- `id` ([UUID](../../sql-reference/data-types/uuid.md)) — ユーザー ID。 + +- `storage` ([String](../../sql-reference/data-types/string.md)) — ユーザーのストレージへのパス。`access_control_path` パラメーターで設定されます。 + +- `auth_type` ([Enum8](../../sql-reference/data-types/enum.md)('no_password' = 0, 'plaintext_password' = 1, 'sha256_password' = 2, 'double_sha1_password' = 3, 'ldap' = 4, 'kerberos' = 5, 'ssl_certificate' = 6, 'bcrypt_password' = 7)) — 認証タイプを示します。ユーザー認証には、パスワードなし、プレーンテキストパスワード、[SHA256](https://en.wikipedia.org/wiki/SHA-2) エンコードされたパスワード、[ダブルSHA-1](https://en.wikipedia.org/wiki/SHA-1) エンコードされたパスワード、または [bcrypt](https://en.wikipedia.org/wiki/Bcrypt) エンコードされたパスワードの方法があります。 + +- `auth_params` ([String](../../sql-reference/data-types/string.md)) — `auth_type` に応じたJSON形式の認証パラメーター。 + +- `host_ip` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — ClickHouseサーバーに接続することを許可されているホストのIPアドレス。 + +- `host_names` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — ClickHouseサーバーに接続することを許可されているホストの名前。 + +- `host_names_regexp` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — ClickHouseサーバーに接続することを許可されているホスト名の正規表現。 + +- `host_names_like` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — LIKE述語を使って設定された、ClickHouseサーバーへの接続が許可されているホストの名前。 + +- `default_roles_all` ([UInt8](../../sql-reference/data-types/int-uint.md#uint-ranges)) — デフォルトでユーザーに設定されたすべての付与されたロールを示します。 + +- `default_roles_list` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — デフォルトで提供される付与されたロールのリスト。 + +- `default_roles_except` ([Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md))) — デフォルトで設定された付与されたすべてのロール。ただし、指定されたものを除きます。 + +## See Also {#see-also} + +- [SHOW USERS](../../sql-reference/statements/show.md#show-users-statement) diff --git a/docs/ja/operations/system-tables/view_refreshes.md b/docs/ja/operations/system-tables/view_refreshes.md new file mode 100644 index 00000000000..68aa1e9c822 --- /dev/null +++ b/docs/ja/operations/system-tables/view_refreshes.md @@ -0,0 +1,44 @@ +--- +slug: /ja/operations/system-tables/view_refreshes +--- +# view_refreshes + +[更新可能なMaterialized View](../../sql-reference/statements/create/view.md#refreshable-materialized-view)に関する情報を提供します。サーバー起動時やテーブル作成時以降、更新が進行中かどうかに関わらず、すべての更新可能なMaterialized Viewが含まれています。 + +カラム: + +- `database` ([String](../../sql-reference/data-types/string.md)) — テーブルが所在するデータベースの名前。 +- `view` ([String](../../sql-reference/data-types/string.md)) — テーブル名。 +- `uuid` ([UUID](../../sql-reference/data-types/uuid.md)) — テーブルのUUID (Atomicデータベース)。 +- `status` ([String](../../sql-reference/data-types/string.md)) — 現在の更新の状態。 +- `last_success_time` ([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md))) — 最新の成功した更新が開始された時間。サーバー起動以降またはテーブル作成以降成功した更新がなければNULL。 +- `last_success_duration_ms` ([Nullable](../../sql-reference/data-types/nullable.md)([UInt64](../../sql-reference/data-types/int-uint.md))) — 最新の更新にどれくらい時間がかかったか。 +- `last_refresh_time` ([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md))) — 最新の更新の試行が終了した(既知の場合)か開始された(不明な場合または実行中の場合)時間。サーバー起動以降またはテーブル作成以降更新の試行がなければNULL。 +- `last_refresh_replica` ([String](../../sql-reference/data-types/string.md)) — 調整が有効化されている場合、現在の(実行中の場合)または前回の(実行中でない場合の)更新の試行を行ったレプリカの名前。 +- `next_refresh_time` ([Nullable](../../sql-reference/data-types/nullable.md)([DateTime](../../sql-reference/data-types/datetime.md))) — statusがScheduledの場合に、次の更新が開始される予定の時間。 +- `exception` ([String](../../sql-reference/data-types/string.md)) — 前回の試行が失敗した場合のエラーメッセージ。 +- `retry` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新においてこれまでに失敗した試行の回数。 +- `progress` ([Float64](../../sql-reference/data-types/float.md)) — 現在の更新の進行状況(0から1の間)。statusが`RunningOnAnotherReplica`の場合は利用不可。 +- `read_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新でこれまでに読み取られた行数。statusが`RunningOnAnotherReplica`の場合は利用不可。 +- `read_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新中に読み取られたバイト数。statusが`RunningOnAnotherReplica`の場合は利用不可。 +- `total_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新に必要な行の推定総数。statusが`RunningOnAnotherReplica`の場合は利用不可。 +- `written_rows` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新中に書き込まれた行数。statusが`RunningOnAnotherReplica`の場合は利用不可。 +- `written_bytes` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 現在の更新中に書き込まれたバイト数。statusが`RunningOnAnotherReplica`の場合は利用不可。 + +**例** + +```sql +SELECT + database, + view, + status, + last_refresh_result, + last_refresh_time, + next_refresh_time +FROM system.view_refreshes + +┌─database─┬─view───────────────────────┬─status────┬─last_refresh_result─┬───last_refresh_time─┬───next_refresh_time─┐ +│ default │ hello_documentation_reader │ Scheduled │ Finished │ 2023-12-01 01:24:00 │ 2023-12-01 01:25:00 │ +└──────────┴────────────────────────────┴───────────┴─────────────────────┴─────────────────────┴─────────────────────┘ +``` + diff --git a/docs/ja/operations/system-tables/workloads.md b/docs/ja/operations/system-tables/workloads.md new file mode 100644 index 00000000000..0ad848a649f --- /dev/null +++ b/docs/ja/operations/system-tables/workloads.md @@ -0,0 +1,40 @@ +--- +slug: /ja/operations/system-tables/workloads +--- +# workloads + +ローカルサーバーに存在する[ワークロード](/docs/ja/operations/workload-scheduling.md#workload_entity_storage)に関する情報を含んでいます。このテーブルには、各ワークロードごとに行が含まれています。 + +例: + +``` sql +SELECT * +FROM system.workloads +FORMAT Vertical +``` + +``` text +Row 1: +────── +name: production +parent: all +create_query: CREATE WORKLOAD production IN `all` SETTINGS weight = 9 + +Row 2: +────── +name: development +parent: all +create_query: CREATE WORKLOAD development IN `all` + +Row 3: +────── +name: all +parent: +create_query: CREATE WORKLOAD `all` +``` + +カラム: + +- `name` (`String`) - ワークロード名。 +- `parent` (`String`) - 親ワークロード名。 +- `create_query` (`String`) - ワークロードの定義。 diff --git a/docs/ja/operations/system-tables/zookeeper.md b/docs/ja/operations/system-tables/zookeeper.md new file mode 100644 index 00000000000..df2080e93ba --- /dev/null +++ b/docs/ja/operations/system-tables/zookeeper.md @@ -0,0 +1,72 @@ +--- +slug: /ja/operations/system-tables/zookeeper +--- +# zookeeper + +このテーブルは、ClickHouse Keeper または ZooKeeper が設定されていない限り存在しません。`system.zookeeper` テーブルは、configで定義された Keeper クラスターからのデータを公開します。以下に示すように、クエリには `WHERE` 条項で `path =` 条件または `path IN` 条件を設定する必要があります。これは、データを取得したい子ノードのパスに対応します。 + +クエリ `SELECT * FROM system.zookeeper WHERE path = '/clickhouse'` は、`/clickhouse` ノードのすべての子に関するデータを出力します。すべてのルートノードに対するデータを出力するには、`path = '/'` と書きます。`path` で指定したパスが存在しない場合、例外がスローされます。 + +クエリ `SELECT * FROM system.zookeeper WHERE path IN ('/', '/clickhouse')` は、`/` と `/clickhouse` ノードのすべての子に対するデータを出力します。指定した `path` コレクション内に存在しないパスがある場合、例外がスローされます。これは、複数の Keeper パス クエリを実行するために使用できます。 + +カラム: + +- `name` (String) — ノードの名前。 +- `path` (String) — ノードへのパス。 +- `value` (String) — ノードの値。 +- `dataLength` (Int32) — 値のサイズ。 +- `numChildren` (Int32) — 子孫の数。 +- `czxid` (Int64) — ノードを作成したトランザクションのID。 +- `mzxid` (Int64) — 最後にノードを変更したトランザクションのID。 +- `pzxid` (Int64) — 最後に子孫を削除または追加したトランザクションのID。 +- `ctime` (DateTime) — ノード作成の時間。 +- `mtime` (DateTime) — ノードの最後の変更時間。 +- `version` (Int32) — ノードのバージョン: ノードが変更された回数。 +- `cversion` (Int32) — 追加または削除された子孫の数。 +- `aversion` (Int32) — ACLの変更回数。 +- `ephemeralOwner` (Int64) — 一時ノードの場合、このノードを所有するセッションのID。 + +例: + +``` sql +SELECT * +FROM system.zookeeper +WHERE path = '/clickhouse/tables/01-08/visits/replicas' +FORMAT Vertical +``` + +``` text +行 1: +────── +name: example01-08-1 +value: +czxid: 932998691229 +mzxid: 932998691229 +ctime: 2015-03-27 16:49:51 +mtime: 2015-03-27 16:49:51 +version: 0 +cversion: 47 +aversion: 0 +ephemeralOwner: 0 +dataLength: 0 +numChildren: 7 +pzxid: 987021031383 +path: /clickhouse/tables/01-08/visits/replicas + +行 2: +────── +name: example01-08-2 +value: +czxid: 933002738135 +mzxid: 933002738135 +ctime: 2015-03-27 16:57:01 +mtime: 2015-03-27 16:57:01 +version: 0 +cversion: 37 +aversion: 0 +ephemeralOwner: 0 +dataLength: 0 +numChildren: 7 +pzxid: 987021252247 +path: /clickhouse/tables/01-08/visits/replicas +``` diff --git a/docs/ja/operations/system-tables/zookeeper_connection.md b/docs/ja/operations/system-tables/zookeeper_connection.md new file mode 100644 index 00000000000..d2dabec2121 --- /dev/null +++ b/docs/ja/operations/system-tables/zookeeper_connection.md @@ -0,0 +1,31 @@ +--- +slug: /ja/operations/system-tables/zookeeper_connection +--- +# zookeeper_connection + +ZooKeeperが設定されていない場合、このテーブルは存在しません。`system.zookeeper_connection`テーブルは、ZooKeeper(補助ZooKeeperを含む)への現在の接続を表示します。各行は1つの接続に関する情報を示します。 + +カラム: + +- `name` ([String](../../sql-reference/data-types/string.md)) — ZooKeeperクラスタの名前。 +- `host` ([String](../../sql-reference/data-types/string.md)) — ClickHouseが接続したZooKeeperノードのホスト名/IP。 +- `port` ([String](../../sql-reference/data-types/string.md)) — ClickHouseが接続したZooKeeperノードのポート。 +- `index` ([UInt8](../../sql-reference/data-types/int-uint.md)) — ClickHouseが接続したZooKeeperノードのインデックス。インデックスはZooKeeperの設定からのものです。 +- `connected_time` ([DateTime](../../sql-reference/data-types/datetime.md)) — 接続が確立された時間。 +- `session_uptime_elapsed_seconds` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 接続が確立されてから経過した秒数。 +- `is_expired` ([UInt8](../../sql-reference/data-types/int-uint.md)) — 現在の接続が期限切れかどうか。 +- `keeper_api_version` ([String](../../sql-reference/data-types/string.md)) — Keeper APIのバージョン。 +- `client_id` ([UInt64](../../sql-reference/data-types/int-uint.md)) — 接続のセッションID。 +- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — 現在のセッションのXid。 + +例: + +``` sql +SELECT * FROM system.zookeeper_connection; +``` + +``` text +┌─name────┬─host──────┬─port─┬─index─┬──────connected_time─┬─session_uptime_elapsed_seconds─┬─is_expired─┬─keeper_api_version─┬─client_id─┐ +│ default │ 127.0.0.1 │ 9181 │ 0 │ 2023-06-15 14:36:01 │ 3058 │ 0 │ 3 │ 5 │ +└─────────┴───────────┴──────┴───────┴─────────────────────┴────────────────────────────────┴────────────┴────────────────────┴───────────┘ +``` diff --git a/docs/ja/operations/system-tables/zookeeper_log.md b/docs/ja/operations/system-tables/zookeeper_log.md new file mode 100644 index 00000000000..c8f01aede25 --- /dev/null +++ b/docs/ja/operations/system-tables/zookeeper_log.md @@ -0,0 +1,134 @@ +--- +slug: /ja/operations/system-tables/zookeeper_log +--- +# zookeeper_log + +このテーブルは、ZooKeeperサーバーへのリクエストのパラメーターとそこからの応答に関する情報を含んでいます。 + +リクエストの場合、リクエストパラメーターがあるカラムのみが填められ、残りのカラムはデフォルト値(`0` または `NULL`)で埋められます。応答が到着すると、応答のデータが他のカラムに追加されます。 + +リクエストパラメーターを持つカラム: + +- `hostname` ([LowCardinality(String)](../../sql-reference/data-types/string.md)) — クエリを実行するサーバーのホスト名。 +- `type` ([Enum](../../sql-reference/data-types/enum.md)) — ZooKeeperクライアントのイベントタイプ。以下の値を持つことができます: + - `Request` — リクエストが送信されました。 + - `Response` — 応答が受信されました。 + - `Finalize` — 接続が失われ、応答が受信されませんでした。 +- `event_date` ([Date](../../sql-reference/data-types/date.md)) — イベントが発生した日付。 +- `event_time` ([DateTime64](../../sql-reference/data-types/datetime64.md)) — イベントが発生した日時。 +- `address` ([IPv6](../../sql-reference/data-types/ipv6.md)) — リクエストを行ったZooKeeperサーバーのIPアドレス。 +- `port` ([UInt16](../../sql-reference/data-types/int-uint.md)) — リクエストを行ったZooKeeperサーバーのポート。 +- `session_id` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeperサーバーが接続ごとに設定するセッションID。 +- `xid` ([Int32](../../sql-reference/data-types/int-uint.md)) — セッション内のリクエストのID。通常は連続したリクエスト番号です。リクエスト行と対応する `response`/`finalize` 行で同じ。 +- `has_watch` ([UInt8](../../sql-reference/data-types/int-uint.md)) — [watch](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#ch_zkWatches)が設定されているかどうか。 +- `op_num` ([Enum](../../sql-reference/data-types/enum.md)) — リクエストまたは応答のタイプ。 +- `path` ([String](../../sql-reference/data-types/string.md)) — リクエストで指定されたZooKeeperノードのパス、またはパスの指定が不要なリクエストの場合は空文字列。 +- `data` ([String](../../sql-reference/data-types/string.md)) — ZooKeeperノードへのデータ(`SET`および`CREATE`リクエストの場合は書き込もうとしたデータ、`GET`リクエストへの応答の場合は読み取られたデータ)または空文字列。 +- `is_ephemeral` ([UInt8](../../sql-reference/data-types/int-uint.md)) — ZooKeeperノードが[ephemeral](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Ephemeral+Nodes)として作成されているか。 +- `is_sequential` ([UInt8](../../sql-reference/data-types/int-uint.md)) — ZooKeeperノードが[sequential](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html#Sequence+Nodes+--+Unique+Naming)として作成されているか。 +- `version` ([Nullable(Int32)](../../sql-reference/data-types/nullable.md)) — リクエスト実行時に期待されるZooKeeperノードのバージョン。この情報は`CHECK`, `SET`, `REMOVE`リクエストでサポートされます(リクエストがバージョンをチェックしない場合は`-1`、バージョンチェックをサポートしていない他のリクエストの場合は `NULL`)。 +- `requests_size` ([UInt32](../../sql-reference/data-types/int-uint.md)) — マルチリクエストに含まれるリクエストの数(複数の連続した通常のリクエストから構成され、これらを原子的に実行する特別なリクエスト)。マルチリクエストに含まれるすべてのリクエストは同じ `xid` を持ちます。 +- `request_idx` ([UInt32](../../sql-reference/data-types/int-uint.md)) — マルチリクエストに含まれるリクエストの番号(マルチリクエストの場合 `0`、その後は順番に`1`から)。 + +リクエスト応答パラメータを持つカラム: + +- `zxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — ZooKeeperトランザクションID。正常に実行されたリクエストに応答してZooKeeperサーバーから発行されたシリアル番号(リクエストが実行されなかった/エラーが返された/クライアントがリクエストの実行を知っていない場合は`0`)。 +- `error` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — エラーコード。多くの値を持つことができますが、以下はその一部です: + - `ZOK` — リクエストは正常に実行されました。 + - `ZCONNECTIONLOSS` — 接続が失われました。 + - `ZOPERATIONTIMEOUT` — リクエスト実行のタイムアウトが切れました。 + - `ZSESSIONEXPIRED` — セッションが失効しました。 + - `NULL` — リクエストは完了しました。 +- `watch_type` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — `watch`イベントのタイプ(`op_num`が`Watch`の応答の場合)、それ以外の応答の場合:`NULL`。 +- `watch_state` ([Nullable(Enum)](../../sql-reference/data-types/nullable.md)) — `watch`イベントのステータス(`op_num`が`Watch`の応答の場合)、それ以外の応答の場合:`NULL`。 +- `path_created` ([String](../../sql-reference/data-types/string.md)) — 作成されたZooKeeperノードのパス(`CREATE`リクエストへの応答の場合)、ノードが`sequential`として作成された場合は`path`と異なることがあります。 +- `stat_czxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードの作成を引き起こした変更の`zxid`。 +- `stat_mzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードの最後の変更を行った`zxid`。 +- `stat_pzxid` ([Int64](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードの子の最後の変更のトランザクションID。 +- `stat_version` ([Int32](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードのデータの変更回数。 +- `stat_cversion` ([Int32](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードの子の変更回数。 +- `stat_dataLength` ([Int32](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードのデータフィールドの長さ。 +- `stat_numChildren` ([Int32](../../sql-reference/data-types/int-uint.md)) — このZooKeeperノードの子の数。 +- `children` ([Array(String)](../../sql-reference/data-types/array.md)) — 子ZooKeeperノードのリスト(`LIST`リクエストへの応答の場合)。 + +**例** + +クエリ: + +``` sql +SELECT * FROM system.zookeeper_log WHERE (session_id = '106662742089334927') AND (xid = '10858') FORMAT Vertical; +``` + +結果: + +``` text +Row 1: +────── +hostname: clickhouse.eu-central1.internal +type: Request +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.291792 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 0 +error: ᴺᵁᴸᴸ +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 0 +stat_mzxid: 0 +stat_pzxid: 0 +stat_version: 0 +stat_cversion: 0 +stat_dataLength: 0 +stat_numChildren: 0 +children: [] + +Row 2: +────── +type: Response +event_date: 2021-08-09 +event_time: 2021-08-09 21:38:30.292086 +address: :: +port: 2181 +session_id: 106662742089334927 +xid: 10858 +has_watch: 1 +op_num: List +path: /clickhouse/task_queue/ddl +data: +is_ephemeral: 0 +is_sequential: 0 +version: ᴺᵁᴸᴸ +requests_size: 0 +request_idx: 0 +zxid: 16926267 +error: ZOK +watch_type: ᴺᵁᴸᴸ +watch_state: ᴺᵁᴸᴸ +path_created: +stat_czxid: 16925469 +stat_mzxid: 16925469 +stat_pzxid: 16926179 +stat_version: 0 +stat_cversion: 7 +stat_dataLength: 0 +stat_numChildren: 7 +children: ['query-0000000006','query-0000000005','query-0000000004','query-0000000003','query-0000000002','query-0000000001','query-0000000000'] +``` + +**関連項目** + +- [ZooKeeper](../../operations/tips.md#zookeeper) +- [ZooKeeperガイド](https://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html) diff --git a/docs/ja/operations/tips.md b/docs/ja/operations/tips.md new file mode 100644 index 00000000000..056cdb2f784 --- /dev/null +++ b/docs/ja/operations/tips.md @@ -0,0 +1,284 @@ +--- +slug: /ja/operations/tips +sidebar_position: 58 +sidebar_label: 使用推奨事項 +title: "使用推奨事項" +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + + + +## CPU スケーリングガバナー + +常に `performance` スケーリングガバナーを使用してください。`on-demand` スケーリングガバナーは、常に高い需要に対してはるかに劣っています。 + +``` bash +$ echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor +``` + +## CPU 制限 {#cpu-limitations} + +プロセッサは過熱する可能性があります。`dmesg` を使用して、CPUのクロックレートが過熱により制限されたかどうかを確認します。この制限はデータセンターレベルで外部から設定されることもあります。負荷下で `turbostat` を使用して監視できます。 + +## RAM {#ram} + +小規模なデータ(圧縮で約200 GBまで)の場合、データの容量と同じくらいのメモリを使用するのが最適です。大規模なデータとインタラクティブ(オンライン)クエリを処理する場合は、合理的な量のRAM(128 GB以上)を使用し、キャッシュにホットデータのサブセットを収めるべきです。サーバーごとに約50 TBのデータボリュームの場合でも、128 GBのRAMを使用すると、64 GBと比較してクエリのパフォーマンスが大幅に向上します。 + +オーバーコミットを無効にしないでください。`cat /proc/sys/vm/overcommit_memory` の値は0か1であるべきです。以下を実行します。 + +``` bash +$ echo 0 | sudo tee /proc/sys/vm/overcommit_memory +``` + +メモリ管理におけるカーネルでの時間を監視するには、 `perf top` を使用します。永続的な大きなページを割り当てる必要はありません。 + +### 16GB未満のRAMを使用する場合 + +推奨されるRAMの量は32GB以上です。 + +システムが16GB未満のRAMを持っている場合、デフォルト設定がこのメモリ量に一致しないため、様々なメモリエラーが発生する可能性があります。最小で2GBほどのRAMを持つシステムでもClickHouseを使用できますが、このようなセットアップでは追加の調整が必要であり、低速のデータ取り込みしか行えません。 + +16GB未満のRAMでClickHouseを使用する場合、次を推奨します: + +- `config.xml` 内のマークキャッシュのサイズを下げます。それは500 MBまで下げることができますが、ゼロに設定することはできません。 +- クエリ処理スレッドの数を `1` まで下げます。 +- `max_block_size` を `8192` に下げます。 `1024` まで下げても実用的です。 +- `max_download_threads` を `1` に下げます。 +- `input_format_parallel_parsing` と `output_format_parallel_formatting` を `0` に設定します。 + +追加の注意事項: +- メモリアロケーターによってキャッシュされたメモリをフラッシュするには、 `SYSTEM JEMALLOC PURGE` コマンドを実行できます。 +- メモリが少ないマシンでS3やKafkaの統合を使用することは推奨されません。これらはバッファに多くのメモリを必要とするためです。 + +## ストレージサブシステム {#storage-subsystem} + +予算が許すなら、SSDを使ってください。そうでない場合はHDDを使用します。SATA HDDs 7200 RPMで十分です。 + +ローカルハードドライブを持つ多数のサーバーを、ディスクシェルフが付いている少数のサーバーより優先してください。ただし、まれにクエリが実行されるアーカイブを保存する場合は、シェルフでも問題ありません。 + +## RAID {#raid} + +HDDを使用する場合、RAID-10、RAID-5、RAID-6、RAID-50で結合することができます。Linuxのためには、ソフトウェアRAID(`mdadm`)がより良いです。RAID-10を作成する場合、`far` レイアウトを選択してください。予算が許すならば、RAID-10を選んでください。 + +LVM自体(RAIDや`mdadm`なし)は問題ありませんが、それと組み合わせてRAIDを作成することや、`mdadm`と組み合わせることは、あまり探られていない選択肢であり、間違ったチャンクサイズの選択、チャンクの整列のミス、間違ったRAIDタイプの選択、ディスクのクリーンアップを忘れるなどの間違いの可能性が増します。LVMの使用に自信があるなら、それを使うことに反対する理由はありません。 + +もし4つ以上のディスクを持っている場合、RAID-6(推奨)またはRAID-50を使用してください。RAID-5を使用する代わりにRAID-6やRAID-50を使用する場合、ストライプキャッシュサイズを必ず増やしてください。デフォルトの値は通常最適な選択ではありません。 + +``` bash +$ echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size +``` + +正確な数値は、デバイスの数とブロックサイズから次の式を使って計算します:`2 * num_devices * chunk_size_in_bytes / 4096`。 + +たいていのRAID設定に対して64KBのブロックサイズで十分です。平均的なClickHouseサーバの書き込みサイズは約1MB(1024KB)なので、推奨されるストライプサイズも1MBです。ブロックサイズは必要に応じて最適化でき、非パリティディスクの数で1MBを割った値にセットし、各書き込みが全ての利用可能な非パリティディスクに対して並列化されるようにします。ブロックサイズを小さすぎたり大きすぎたりしないようにしてください。 + +SSDでRAID-0を使用できます。RAIDの使用にかかわらず、データのセキュリティのために常にレプリケーションを使用してください。 + +HDDではmq-deadlineまたはCFQスケジューラを、SSDではnoopを選択し、‘readahead’設定を減らさないでください。HDDでは書き込みキャッシュを有効にしてください。 + +NVMEとSSDディスクに対して、OSで[`fstrim`](https://en.wikipedia.org/wiki/Trim_(computing))が有効であることを確認してください(通常、cronjobまたはsystemdサービスを使用して実装されています)。 + +## ファイルシステム {#file-system} + +Ext4が最も信頼性のあるオプションです。マウントオプションで`noatime`を設定します。XFSも良好に動作します。他のほとんどのファイルシステムも問題なく動作するはずです。 + +ハードリンクが不足しているため、FAT-32とexFATはサポートされていません。 + +ClickHouseは独自に圧縮を行い、それがより良いため、圧縮されたファイルシステムを使用しないでください。暗号化されたファイルシステムを使用することは推奨されませんが、ClickHouseの組み込みの暗号化を使用することがより望ましいです。 + +ClickHouseはNFS上でも動作しますが、それは最良のアイデアではありません。 + +## Linuxカーネル {#linux-kernel} + +古いLinuxカーネルを使用しないでください。 + +## ネットワーク {#network} + +IPv6を使用している場合は、ルートキャッシュのサイズを増やしてください。Linuxカーネル3.2以前には、IPv6実装に多数の問題がありました。 + +可能であれば少なくとも10 GBのネットワークを使用してください。1 Gbも動作しますが、テラバイト単位のデータを持つレプリカのパッチ適用や、大量の中間データを持つ分散クエリの処理では大幅に劣ります。 + +## Huge Pages {#huge-pages} + +古いLinuxカーネルを使用している場合は、透過的な大きなページを無効にしてください。これは、メモリアロケーターに干渉し、パフォーマンスの大幅な低下を引き起こします。新しいLinuxカーネルでは、透過的な大きなページは問題ありません。 + +``` bash +$ echo 'madvise' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled +``` + +透過的な大きなページ設定を恒久的に変更したい場合は、`/etc/default/grub`を編集し、`GRUB_CMDLINE_LINUX_DEFAULT`オプションに`transparent_hugepage=madvise`を追加します: + +```bash +$ GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=madvise ..." +``` + +その後、`sudo update-grub`コマンドを実行し、再起動して有効にします。 + +## ハイパーバイザー設定 + +OpenStackを使用している場合、`nova.conf`に次を設定します: + +``` +cpu_mode=host-passthrough +``` + +libvirtを使用している場合、XML設定に次を設定します: + +``` + +``` + +これは、ClickHouseが`cpuid`命令で正しい情報を取得できるようにするために重要です。そうしないと、ハイパーバイザーが古いCPUモデルで動作していると`Illegal instruction`クラッシュが発生する可能性があります。 + +## ClickHouse KeeperとZooKeeper {#zookeeper} + +ClickHouseクラスタのZooKeeperの代わりにClickHouse Keeperを使用することを推奨します。 [ClickHouse Keeper](../guides/sre/keeper/index.md) のドキュメントを参照してください。 + +ZooKeeperを使い続けたい場合は、ZooKeeperの新しいバージョン(3.4.9以降)を使用するのが最適です。安定したLinuxディストリビューションのバージョンは古い可能性があります。 + +異なるZooKeeperクラスター間でデータを転送するための手動で書かれたスクリプトは決して使用しないでください。結果が逐次ノードに対して正しくありません。同じ理由で“zkcopy”ユーティリティも使用しないでください:https://github.com/ksprojects/zkcopy/issues/15 + +既存のZooKeeperクラスターを二つに分割したい場合は、その数を増やしてから二つの独立したクラスターとして再構成するのが正しい方法です。 + +テスト環境またはインジェストレートが低い環境では、ClickHouseと同じサーバーでClickHouse Keeperを実行できます。生産環境ではClickHouseとZooKeeper/Keeperのために別々のサーバーを使用するか、ClickHouseファイルとKeeperファイルを別々のディスクに配置することをお勧めします。ZooKeeper/Keeperはディスクの待ち時間に非常に敏感であり、ClickHouseが使用可能なシステムリソースの全てを活用する場合があるためです。 + +ZooKeeperのアンサンブルにオブザーバーを持つことができますが、ClickHouseサーバーはオブザーバーと対話しないでください。 + +`minSessionTimeout`設定を変更しないでください。大きな値はClickHouseの再起動の安定性に影響を与える可能性があります。 + +デフォルト設定では、ZooKeeperは時限爆弾です: + +> ZooKeeperサーバーはデフォルト設定のままだと古いスナップショットやログのファイルを削除しないため(`autopurge`参照)、この責任は運用者にあります。 + +この爆弾を解除する必要があります。 + +以下のZooKeeper(3.5.1)設定は大規模な生産環境で使用されています: + +zoo.cfg: + +``` bash +# http://hadoop.apache.org/zookeeper/docs/current/zookeeperAdmin.html + +# 各ティックのミリ秒数 +tickTime=2000 +# 初期同期フェーズにかかることができるティック数 +# この値はそれほど動機付けられていない +initLimit=300 +# 要求を送信して応答を受け取るまでにかかることができるティックの数 +syncLimit=10 + +maxClientCnxns=2000 + +# クライアントが要求することができ、サーバーが受け入れる可能性がある最大値です。 +# サーバーで高いmaxSessionTimeoutを持つことは、高いセッションタイムアウトで動作したい場合にクライアントが使用できるようにするために問題ありません。 +# ただし、デフォルトではセッションタイムアウトを30秒(ClickHouseの設定でsession_timeout_msで変更可能)に要求します。 +maxSessionTimeout=60000000 +# スナップショットが保存されるディレクトリ。 +dataDir=/opt/zookeeper/{{ '{{' }} cluster['name'] {{ '}}' }}/data +# パフォーマンス向上のためにdataLogDirを別の物理ディスクに配置します +dataLogDir=/opt/zookeeper/{{ '{{' }} cluster['name'] {{ '}}' }}/logs + +autopurge.snapRetainCount=10 +autopurge.purgeInterval=1 + +# シークを避けるために、ZooKeeperはトランザクションログファイルにプレアロケーションサイズキロバイト単位でスペースを確保します。 +# デフォルトのブロックサイズは64Mです。ブロックサイズを変更する一つの理由は、スナップショットがより頻繁に行われる場合にブロックサイズを減らすことです。(snapCountも参照) +preAllocSize=131072 + +# クライアントは、特に多くのクライアントがいる場合、ZooKeeperが処理できる速度よりも速くリクエストを提出できます。 +# メモリが足りなくなるのを防ぐために、システムのグローバル出願制限に応じて、システムでの未処理リクエストがグローバル出願制限を超えないようにクライアントを制限します。 +# デフォルトの制限は1000です。 +# globalOutstandingLimit=1000 + +# ZooKeeperはトランザクションをトランザクションログに記録します。 +# snapCountトランザクションがログファイルに書き込まれるとスナップショットが始まり、新しいトランザクションログファイルが始まります。デフォルトのsnapCountは100000です。 +snapCount=3000000 + +# このオプションが定義されている場合、リクエストはtraceFile.year.month.dayという名前のトレースファイルにログされます。 +#traceFile= + +# リーダーはクライアント接続を受け入れます。デフォルト値は「yes」です。リーダーマシンは更新を調整します。 +# 少しの読み取りスループットの犠牲で高い更新スループットを取得するために、リーダーをクライアントを受け入れず、調整に集中するように構成できます。 +leaderServes=yes + +standaloneEnabled=false +dynamicConfigFile=/etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/zoo.cfg.dynamic +``` + +Java バージョン: + +``` text +openjdk 11.0.5-shenandoah 2019-10-15 +OpenJDK Runtime Environment (build 11.0.5-shenandoah+10-adhoc.heretic.src) +OpenJDK 64-Bit Server VM (build 11.0.5-shenandoah+10-adhoc.heretic.src, mixed mode) +``` + +JVM パラメータ: + +``` bash +NAME=zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} +ZOOCFGDIR=/etc/$NAME/conf + +# TODO this is really ugly +# How to find out, which jars are needed? +# seems, that log4j requires the log4j.properties file to be in the classpath +CLASSPATH="$ZOOCFGDIR:/usr/build/classes:/usr/build/lib/*.jar:/usr/share/zookeeper-3.6.2/lib/audience-annotations-0.5.0.jar:/usr/share/zookeeper-3.6.2/lib/commons-cli-1.2.jar:/usr/share/zookeeper-3.6.2/lib/commons-lang-2.6.jar:/usr/share/zookeeper-3.6.2/lib/jackson-annotations-2.10.3.jar:/usr/share/zookeeper-3.6.2/lib/jackson-core-2.10.3.jar:/usr/share/zookeeper-3.6.2/lib/jackson-databind-2.10.3.jar:/usr/share/zookeeper-3.6.2/lib/javax.servlet-api-3.1.0.jar:/usr/share/zookeeper-3.6.2/lib/jetty-http-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jetty-io-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jetty-security-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jetty-server-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jetty-servlet-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jetty-util-9.4.24.v20191120.jar:/usr/share/zookeeper-3.6.2/lib/jline-2.14.6.jar:/usr/share/zookeeper-3.6.2/lib/json-simple-1.1.1.jar:/usr/share/zookeeper-3.6.2/lib/log4j-1.2.17.jar:/usr/share/zookeeper-3.6.2/lib/metrics-core-3.2.5.jar:/usr/share/zookeeper-3.6.2/lib/netty-buffer-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-codec-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-common-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-handler-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-resolver-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-transport-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-transport-native-epoll-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/netty-transport-native-unix-common-4.1.50.Final.jar:/usr/share/zookeeper-3.6.2/lib/simpleclient-0.6.0.jar:/usr/share/zookeeper-3.6.2/lib/simpleclient_common-0.6.0.jar:/usr/share/zookeeper-3.6.2/lib/simpleclient_hotspot-0.6.0.jar:/usr/share/zookeeper-3.6.2/lib/simpleclient_servlet-0.6.0.jar:/usr/share/zookeeper-3.6.2/lib/slf4j-api-1.7.25.jar:/usr/share/zookeeper-3.6.2/lib/slf4j-log4j12-1.7.25.jar:/usr/share/zookeeper-3.6.2/lib/snappy-java-1.1.7.jar:/usr/share/zookeeper-3.6.2/lib/zookeeper-3.6.2.jar:/usr/share/zookeeper-3.6.2/lib/zookeeper-jute-3.6.2.jar:/usr/share/zookeeper-3.6.2/lib/zookeeper-prometheus-metrics-3.6.2.jar:/usr/share/zookeeper-3.6.2/etc" + +ZOOCFG="$ZOOCFGDIR/zoo.cfg" +ZOO_LOG_DIR=/var/log/$NAME +USER=zookeeper +GROUP=zookeeper +PIDDIR=/var/run/$NAME +PIDFILE=$PIDDIR/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +JAVA=/usr/local/jdk-11/bin/java +ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" +ZOO_LOG4J_PROP="INFO,ROLLINGFILE" +JMXLOCALONLY=false +JAVA_OPTS="-Xms{{ '{{' }} cluster.get('xms','128M') {{ '}}' }} \ + -Xmx{{ '{{' }} cluster.get('xmx','1G') {{ '}}' }} \ + -Xlog:safepoint,gc*=info,age*=debug:file=/var/log/$NAME/zookeeper-gc.log:time,level,tags:filecount=16,filesize=16M + -verbose:gc \ + -XX:+UseG1GC \ + -Djute.maxbuffer=8388608 \ + -XX:MaxGCPauseMillis=50" +``` + +Saltの初期化: + +``` text +description "zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} 中央集権的コーディネーションサービス" + +start on runlevel [2345] +stop on runlevel [!2345] + +respawn + +limit nofile 8192 8192 + +pre-start script + [ -r "/etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment" ] || exit 0 + . /etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment + [ -d $ZOO_LOG_DIR ] || mkdir -p $ZOO_LOG_DIR + chown $USER:$GROUP $ZOO_LOG_DIR +end script + +script + . /etc/zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }}/conf/environment + [ -r /etc/default/zookeeper ] && . /etc/default/zookeeper + if [ -z "$JMXDISABLE" ]; then + JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY" + fi + exec start-stop-daemon --start -c $USER --exec $JAVA --name zookeeper-{{ '{{' }} cluster['name'] {{ '}}' }} \ + -- -cp $CLASSPATH $JAVA_OPTS -Dzookeeper.log.dir=${ZOO_LOG_DIR} \ + -Dzookeeper.root.logger=${ZOO_LOG4J_PROP} $ZOOMAIN $ZOOCFG +end script +``` + +## アンチウイルスソフトウェア {#antivirus-software} + +アンチウイルスソフトウェアを使用している場合は、ClickHouseデータファイル(`/var/lib/clickhouse`)があるフォルダをスキップするように設定してください。そうしないとパフォーマンスが低下し、データインジェストやバックグラウンドマージ中に予期しないエラーが発生する可能性があります。 + +## 関連コンテンツ + +- [ClickHouseの始め方?13の「致命的な過ち」とその回避方法](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse) diff --git a/docs/ja/operations/update.md b/docs/ja/operations/update.md new file mode 100644 index 00000000000..604bacc980b --- /dev/null +++ b/docs/ja/operations/update.md @@ -0,0 +1,101 @@ +--- +slug: /ja/operations/update +sidebar_title: セルフマネージドアップグレード +title: セルフマネージドアップグレード +--- + +## ClickHouseアップグレード概要 + +このドキュメントには以下が含まれます: +- 一般的なガイドライン +- 推奨される計画 +- システム上のバイナリアップグレードの詳細 + +## 一般的なガイドライン + +これらの注意事項は、計画を立てるのに役立ち、なぜ後述するような推奨を行うのかを理解するのに役立ちます。 + +### ClickHouseサーバーをClickHouse KeeperまたはZooKeeperとは別にアップグレード +ClickHouse KeeperまたはApache ZooKeeperに対するセキュリティ修正が必要でない限り、ClickHouseサーバーをアップグレードする際にKeeperをアップグレードする必要はありません。アップグレード中はKeeperの安定性が必要なため、ClickHouseサーバーのアップグレードを完了してからKeeperのアップグレードを検討してください。 + +### マイナーバージョンのアップグレードは頻繁に採用すべき +常に最新のマイナーバージョンにアップグレードすることを強くお勧めします。マイナーリリースには破壊的な変更はありませんが、重要なバグ修正(およびセキュリティ修正が含まれる場合もあります)が含まれています。 + +### ターゲットバージョンを実行する別のClickHouseサーバーでエクスペリメンタルな機能をテスト + +エクスペリメンタルな機能の互換性は、いつでもどのようにでも無効になる可能性があります。エクスペリメンタルな機能を使用している場合は、変更履歴を確認し、ターゲットバージョンをインストールした別のClickHouseサーバーをセットアップし、そこでエクスペリメンタルな機能の使用をテストすることを検討してください。 + +### ダウングレード +新しいバージョンが依存している機能と互換性がないと気付いた場合、まだ新しい機能を使用し始めていなければ、最近の(1年未満の)バージョンにダウングレードすることができます。新しい機能を使用し始めると、ダウングレードは機能しません。 + +### クラスター内の複数のClickHouseサーバーバージョン + +1年の互換性ウィンドウ(2つのLTSバージョンを含む)を維持する努力をしています。これにより、バージョン間の差が1年未満であれば、または2つのLTSバージョンの間隔が1年未満であれば、どの2つのバージョンもクラスター内で一緒に動作するはずです。しかし、クラスター内の全メンバーをできるだけ早く同じバージョンにアップグレードすることをお勧めします。例えば、分散クエリの遅延、ReplicatedMergeTreeにおける一部のバックグラウンド操作での再試行可能なエラーなど、いくつかの小さな問題が発生する可能性があります。 + +リリース日が1年以上のバージョンを同じクラスターで実行することは決して推奨しません。データ損失は予期していませんが、クラスターが使用不能になる可能性があります。バージョン間の差が1年以上ある場合に予期される問題は次のとおりです: + +- クラスターが動作しない可能性がある +- 一部またはすべてのクエリが任意のエラーで失敗する可能性がある +- 任意のエラー/警告がログに表示される可能性がある +- ダウングレードが不可能になる可能性がある + +### インクリメンタルアップグレード + +現在のバージョンとターゲットバージョンの差が1年以上ある場合、以下のいずれかを推奨します: +- ダウンタイムを伴うアップグレード(すべてのサーバーを停止し、すべてのサーバーをアップグレードし、すべてのサーバーを実行)。 +- または中間バージョンを経由してアップグレード(現在のバージョンより1年以上新しいバージョン)。 + +## 推奨計画 + +ゼロダウンタイムのClickHouseアップグレードのための推奨ステップは次の通りです: + +1. 設定の変更がデフォルトの`/etc/clickhouse-server/config.xml`ファイルではなく、`/etc/clickhouse-server/config.d/`にあることを確認してください。`/etc/clickhouse-server/config.xml`はアップグレード中に上書きされる可能性があります。 +2. 対象リリースから現在のリリースまでの[変更履歴](/docs/ja/whats-new/changelog/index.md)を読んで、破壊的変更を確認してください。 +3. アップグレード前に実施可能な破壊的変更に基づく更新を行い、アップグレード後に必要な変更のリストを作成します。 +4. 各シャードの残りのレプリカをアップグレードする間に維持する1つ以上のレプリカを特定します。 +5. アップグレードするレプリカについて、1つずつ: + - ClickHouseサーバーをシャットダウンします。 + - ターゲットバージョンにサーバーをアップグレードします。 + - ClickHouseサーバーを立ち上げます。 + - Keeperメッセージがシステムが安定していることを示すまで待ちます。 + - 次のレプリカに進みます。 +6. KeeperログおよびClickHouseログでエラーを確認します。 +7. ステップ4で特定したレプリカを新しいバージョンにアップグレードします。 +8. ステップ1から3で行った変更のリストを参照し、アップグレード後に行う必要のある変更を行います。 + +:::note +複数のバージョンのClickHouseがレプリケーション環境で実行されている場合、このエラーメッセージが期待されます。すべてのレプリカが同じバージョンにアップグレードされると、これらのエラーはなくなります。 +``` +MergeFromLogEntryTask: Code: 40. DB::Exception: Checksums of parts don't match: +hash of uncompressed files doesn't match. (CHECKSUM_DOESNT_MATCH) Data after merge is not +byte-identical to data on another replicas. +``` +::: + +## ClickHouseサーバーバイナリアップグレードプロセス + +ClickHouseを`deb`パッケージからインストールした場合、次のコマンドをサーバーで実行します: + +```bash +$ sudo apt-get update +$ sudo apt-get install clickhouse-client clickhouse-server +$ sudo service clickhouse-server restart +``` + +推奨される`deb`パッケージ以外の方法でClickHouseをインストールした場合は、適切な更新方法を使用してください。 + +:::note +シャードのすべてのレプリカがオフラインになる瞬間がない限り、複数のサーバーを一度に更新することができます。 +::: + +古いバージョンのClickHouseを特定のバージョンにアップグレードする方法: + +例として: + +`xx.yy.a.b`は現在の安定バージョンです。最新の安定バージョンは[ここ](https://github.com/ClickHouse/ClickHouse/releases)で見つけることができます。 + +```bash +$ sudo apt-get update +$ sudo apt-get install clickhouse-server=xx.yy.a.b clickhouse-client=xx.yy.a.b clickhouse-common-static=xx.yy.a.b +$ sudo service clickhouse-server restart +``` diff --git a/docs/ja/operations/utilities/backupview.md b/docs/ja/operations/utilities/backupview.md new file mode 100644 index 00000000000..f8d51c5c1ba --- /dev/null +++ b/docs/ja/operations/utilities/backupview.md @@ -0,0 +1,49 @@ +--- +slug: /ja/operations/utilities/backupview +title: clickhouse_backupview +--- + +# clickhouse_backupview {#clickhouse_backupview} + +[BACKUP](https://clickhouse.com/docs/ja/operations/backup) コマンドで作成されたバックアップを分析するのに役立つ Python モジュールです。このモジュールの主な目的は、実際にバックアップを復元せずに、バックアップからいくつかの情報を取得できるようにすることです。 + +このモジュールは以下の機能を提供します: +- バックアップに含まれるファイルを列挙する +- バックアップからファイルを読み取る +- バックアップに含まれるデータベース、テーブル、パーツについて人間が読みやすい形で有用な情報を取得する +- バックアップの整合性を確認する + +## 例: + +```python +from clickhouse_backupview import open_backup, S3, FileInfo + +# バックアップを開きます。ローカルパスも使用できます: +# backup = open_backup("/backups/my_backup_1/") +backup = open_backup(S3("uri", "access_key_id", "secret_access_key")) + +# バックアップ内のデータベースのリストを取得します。 +print(backup.get_databases())) + +# バックアップ内のテーブルのリストを取得し、 +# 各テーブルについて作成クエリとパーツやパーティションのリストを取得します。 +for db in backup.get_databases(): + for tbl in backup.get_tables(database=db): + print(backup.get_create_query(database=db, table=tbl)) + print(backup.get_partitions(database=db, table=tbl)) + print(backup.get_parts(database=db, table=tbl)) + +# バックアップからすべてを抽出します。 +backup.extract_all(table="mydb.mytable", out='/tmp/my_backup_1/all/') + +# 特定のテーブルのデータを抽出します。 +backup.extract_table_data(table="mydb.mytable", out='/tmp/my_backup_1/mytable/') + +# 単一のパーティションを抽出します。 +backup.extract_table_data(table="mydb.mytable", partition="202201", out='/tmp/my_backup_1/202201/') + +# 単一のパートを抽出します。 +backup.extract_table_data(table="mydb.mytable", part="202201_100_200_3", out='/tmp/my_backup_1/202201_100_200_3/') +``` + +詳細な例は、[テスト](https://github.com/ClickHouse/ClickHouse/blob/master/utils/backupview/test/test.py)をご覧ください。 diff --git a/docs/ja/operations/utilities/clickhouse-benchmark.md b/docs/ja/operations/utilities/clickhouse-benchmark.md new file mode 100644 index 00000000000..0985b6bca1f --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-benchmark.md @@ -0,0 +1,143 @@ +--- +slug: /ja/operations/utilities/clickhouse-benchmark +sidebar_position: 61 +sidebar_label: clickhouse-benchmark +--- + +# clickhouse-benchmark + +ClickHouseサーバーに接続し、指定されたクエリを繰り返し送信します。 + +**構文** + +``` bash +$ clickhouse-benchmark --query ["single query"] [keys] +``` + +または + +``` 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} + +- `--query=QUERY` — 実行するクエリ。このパラメーターが渡されない場合、`clickhouse-benchmark`は標準入力からクエリを読み取ります。 +- `-c N`, `--concurrency=N` — `clickhouse-benchmark`が同時に送信するクエリの数。デフォルト値: 1。 +- `-d N`, `--delay=N` — 中間レポート間の秒単位の間隔(レポートを無効にするには0を設定)。デフォルト値: 1。 +- `-h HOST`, `--host=HOST` — サーバーホスト。デフォルト値: `localhost`。[比較モード](#clickhouse-benchmark-comparison-mode)では複数の`-h`キーを使用できます。 +- `-i N`, `--iterations=N` — 総クエリ数。デフォルト値: 0(無限に繰り返す)。 +- `-r`, `--randomize` — 複数の入力クエリがある場合、クエリ実行の順序をランダムにします。 +- `-s`, `--secure` — `TLS`接続の使用。 +- `-t N`, `--timelimit=N` — 秒単位の時間制限。指定された時間制限に達すると`clickhouse-benchmark`はクエリの送信を停止します。デフォルト値: 0(時間制限なし)。 +- `--port=N` — サーバーポート。デフォルト値: 9000。[比較モード](#clickhouse-benchmark-comparison-mode)では複数の`--port`キーを使用できます。 +- `--confidence=N` — T検定の信頼レベル。可能な値: 0 (80%), 1 (90%), 2 (95%), 3 (98%), 4 (99%), 5 (99.5%)。デフォルト値: 5。[比較モード](#clickhouse-benchmark-comparison-mode)では、`clickhouse-benchmark`は指定された信頼レベルで[独立二標本のスチューデントのt検定](https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test)を実行して、2つの分布に違いがないかを判断します。 +- `--cumulative` — 各間隔のデータの代わりに累積データを表示します。 +- `--database=DATABASE_NAME` — ClickHouseデータベース名。デフォルト値: `default`。 +- `--user=USERNAME` — ClickHouseユーザー名。デフォルト値: `default`。 +- `--password=PSWD` — ClickHouseユーザーパスワード。デフォルト値: 空文字列。 +- `--stacktrace` — スタックトレースの出力。このキーが設定されている場合、`clickhouse-benchmark`は例外のスタックトレースを出力します。 +- `--stage=WORD` — サーバーでのクエリ処理段階。ClickHouseは指定された段階でクエリ処理を停止し、`clickhouse-benchmark`に回答を返します。可能な値: `complete`, `fetch_columns`, `with_mergeable_state`。デフォルト値: `complete`。 +- `--help` — ヘルプメッセージを表示します。 + +クエリにいくつかの[設定](../../operations/settings/index.md)を適用したい場合は、`--=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: `--delay`引数で指定された期間中、サーバーが1秒あたりに実行したクエリ数。 + - RPS: `--delay`引数で指定された期間中、サーバーが1秒あたりに読み取った行数。 + - MiB/s: `--delay`引数で指定された期間中、サーバーが1秒あたりに読み取ったMebibytes数。 + - result RPS: `--delay`引数で指定された期間中、サーバーがクエリの結果に1秒あたりに配置した行数。 + - result MiB/s: `--delay`引数で指定された期間中、サーバーがクエリの結果に1秒あたりに配置したMebibytes数。 + +- クエリ実行時間のパーセンタイル。 + +## 比較モード {#clickhouse-benchmark-comparison-mode} + +`clickhouse-benchmark`は2つの稼働中のClickHouseサーバーのパフォーマンスを比較できます。 + +比較モードを使用するには、両方のサーバーのエンドポイントを`--host`、`--port`キーの2組で指定します。キーは引数リスト内での位置によって組み合わされます。最初の`--host`は最初の`--port`と組み合わされる、というように。`clickhouse-benchmark`は両方のサーバーに接続を確立し、クエリを送信します。各クエリはランダムに選ばれたサーバーに送信されます。結果は表として表示されます。 + +## 例 {#clickhouse-benchmark-example} + +``` bash +$ echo "SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000" | clickhouse-benchmark --host=localhost --port=9001 --host=localhost --port=9000 -i 10 +``` + +``` text +Loaded 1 queries. + +Queries executed: 5. + +localhost:9001, queries 2, QPS: 3.764, RPS: 75446929.370, MiB/s: 575.614, result RPS: 37639659.982, result MiB/s: 287.168. +localhost:9000, queries 3, QPS: 3.815, RPS: 76466659.385, MiB/s: 583.394, result RPS: 38148392.297, result MiB/s: 291.049. + +0.000% 0.258 sec. 0.250 sec. +10.000% 0.258 sec. 0.250 sec. +20.000% 0.258 sec. 0.250 sec. +30.000% 0.258 sec. 0.267 sec. +40.000% 0.258 sec. 0.267 sec. +50.000% 0.273 sec. 0.267 sec. +60.000% 0.273 sec. 0.267 sec. +70.000% 0.273 sec. 0.267 sec. +80.000% 0.273 sec. 0.269 sec. +90.000% 0.273 sec. 0.269 sec. +95.000% 0.273 sec. 0.269 sec. +99.000% 0.273 sec. 0.269 sec. +99.900% 0.273 sec. 0.269 sec. +99.990% 0.273 sec. 0.269 sec. + +No difference proven at 99.5% confidence +``` diff --git a/docs/ja/operations/utilities/clickhouse-compressor.md b/docs/ja/operations/utilities/clickhouse-compressor.md new file mode 100644 index 00000000000..7e3b5673be4 --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-compressor.md @@ -0,0 +1,30 @@ +--- +slug: /ja/operations/utilities/clickhouse-compressor +title: clickhouse-compressor +--- + +データの圧縮および解凍のためのシンプルなプログラム。 + +### 例 + +LZ4でデータを圧縮する: +``` +$ ./clickhouse-compressor < input_file > output_file +``` + +LZ4形式からデータを解凍する: +``` +$ ./clickhouse-compressor --decompress < input_file > output_file +``` + +レベル5でデータをZSTDで圧縮する: + +``` +$ ./clickhouse-compressor --codec 'ZSTD(5)' < input_file > output_file +``` + +4バイトのDeltaとZSTDレベル10でデータを圧縮する: + +``` +$ ./clickhouse-compressor --codec 'Delta(4)' --codec 'ZSTD(10)' < input_file > output_file +``` diff --git a/docs/ja/operations/utilities/clickhouse-disks.md b/docs/ja/operations/utilities/clickhouse-disks.md new file mode 100644 index 00000000000..cfeafd25a47 --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-disks.md @@ -0,0 +1,58 @@ +--- +slug: /ja/operations/utilities/clickhouse-disks +sidebar_position: 59 +sidebar_label: clickhouse-disks +--- + +# Clickhouse-disks + +ClickHouse ディスクのためのファイルシステムのような操作を提供するユーティリティです。インタラクティブモードと非インタラクティブモードの両方で動作します。 + +## プログラム全体のオプション + +* `--config-file, -C` -- ClickHouse の設定ファイルへのパス。デフォルトは `/etc/clickhouse-server/config.xml`。 +* `--save-logs` -- 実行したコマンドの進行状況を `/var/log/clickhouse-server/clickhouse-disks.log` に記録。 +* `--log-level` -- 記録する [イベントのタイプ](../server-configuration-parameters/settings#logger)。デフォルトは `none`。 +* `--disk` -- `mkdir, move, read, write, remove` コマンドで使用するディスク。デフォルトは `default`。 +* `--query, -q` -- インタラクティブモードを起動せずに実行できる単一のクエリ +* `--help, -h` -- 説明付きで全てのオプションとコマンドを表示 + +## デフォルトディスク +起動後、2つのディスクが初期化されます。最初のディスクは `local` で、clickhouse-disks ユーティリティが起動されたローカルファイルシステムを模倣することを意図しています。2つ目のディスクは `default` で、設定でパラメーター `clickhouse/path` として見つけることができるディレクトリにローカルファイルシステムにマウントされています(デフォルト値は `/var/lib/clickhouse`)。 + +## Clickhouse-disks の状態 +追加された各ディスクについて、ユーティリティは通常のファイルシステムと同様に現在のディレクトリを保持します。ユーザーは現在のディレクトリを変更したり、ディスクを切り替えたりできます。 + +状態はプロンプト "`disk_name`:`path_name`" に反映されます + +## コマンド + +このドキュメンテーションファイルでは、すべての必須の位置引数は ``、名前付き引数は `[--parameter value]` として示されています。すべての位置指定パラメータは対応する名前の名前付きパラメータとして言及できます。 + +* `cd (change-dir, change_dir) [--disk disk] ` + ディスク `disk` の `path` にディレクトリを変更(デフォルト値は現在のディスク)。ディスクの切り替えは行われません。 +* `copy (cp) [--disk-from disk_1] [--disk-to disk_2] `. + `path-from` のデータをディスク `disk_1`(デフォルトでは現在のディスク(非インタラクティブモードではパラメータ `disk`))から再帰的に `path-to` のディスク `disk_2`(デフォルトでは現在のディスク(非インタラクティブモードではパラメータ `disk`))にコピー。 +* `current_disk_with_path (current, current_disk, current_path)` + 現在の状態を以下の形式で表示: + `Disk: "current_disk" Path: "current path on current disk"` +* `help []` + コマンド `command` に関するヘルプメッセージを表示。`command` が指定されていない場合は、すべてのコマンドに関する情報を表示。 +* `move (mv) `. + 現在のディスク内で `path-from` から `path-to` へファイルまたはディレクトリを移動。 +* `remove (rm, delete) `. + 現在のディスク上で `path` を再帰的に削除。 +* `link (ln) `. + 現在のディスク上で `path-from` から `path-to` へのハードリンクを作成。 +* `list (ls) [--recursive] ` + 現在のディスク上で `path` にあるファイルをリスト。デフォルトでは非再帰的。 +* `list-disks (list_disks, ls-disks, ls_disks)`. + ディスク名をリスト。 +* `mkdir [--recursive] ` 現在のディスク上。 + ディレクトリを作成。デフォルトでは非再帰的。 +* `read (r) [--path-to path]` + `path-from` からファイルを読み込み `path` に出力(指定されていない場合は `stdout` に出力)。 +* `switch-disk [--path path] ` + パス `path`(指定されていない場合はディスク `disk` 上の以前のパスがデフォルト)でディスク `disk` に切り替え。 +* `write (w) [--path-from path] `. + `path` からファイルを書き込み(`path` が指定されていない場合は `stdin` から読み込み、入力は Ctrl+D で終了)`path-to` に出力。 diff --git a/docs/ja/operations/utilities/clickhouse-format.md b/docs/ja/operations/utilities/clickhouse-format.md new file mode 100644 index 00000000000..4e352f3de75 --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-format.md @@ -0,0 +1,112 @@ +--- +slug: /ja/operations/utilities/clickhouse-format +title: clickhouse-format +--- + +入力されたクエリをフォーマットします。 + +キー: + +- `--help` または `-h` — ヘルプメッセージを生成します。 +- `--query` — 任意の長さと複雑さのクエリをフォーマットします。 +- `--hilite` — ANSI端末のエスケープシーケンスを使用して構文を強調表示します。 +- `--oneline` — 1行でフォーマットします。 +- `--max_line_length` — 指定された長さより短いクエリを1行でフォーマットします。 +- `--comments` — 出力にコメントを保持します。 +- `--quiet` または `-q` — 成功した場合は出力せずに構文だけをチェックします。 +- `--multiquery` または `-n` — 同一ファイル内で複数のクエリを許可します。 +- `--obfuscate` — フォーマットの代わりに難読化します。 +- `--seed ` — 難読化の結果を決定する任意の文字列を設定します。 +- `--backslash` — フォーマットされたクエリの各行の最後にバックスラッシュを追加します。Webや他のソースから複数行でクエリをコピーしてコマンドラインで実行したい場合に便利です。 + +## 例 {#examples} + +1. クエリのフォーマット: + +```bash +$ clickhouse-format --query "select number from numbers(10) where number%2 order by number desc;" +``` + +結果: + +```bash +SELECT number +FROM numbers(10) +WHERE number % 2 +ORDER BY number DESC +``` + +2. ハイライトと1行表示: + +```bash +$ clickhouse-format --oneline --hilite <<< "SELECT sum(number) FROM numbers(5);" +``` + +結果: + +```sql +SELECT sum(number) FROM numbers(5) +``` + +3. 複数クエリ: + +```bash +$ clickhouse-format -n <<< "SELECT min(number) FROM numbers(5); SELECT max(number) FROM numbers(5);" +``` + +結果: + +``` +SELECT min(number) +FROM numbers(5) +; + +SELECT max(number) +FROM numbers(5) +; + +``` + +4. 難読化: + +```bash +$ clickhouse-format --seed Hello --obfuscate <<< "SELECT cost_first_screen BETWEEN a AND b, CASE WHEN x >= 123 THEN y ELSE NULL END;" +``` + +結果: + +``` +SELECT treasury_mammoth_hazelnut BETWEEN nutmeg AND span, CASE WHEN chive >= 116 THEN switching ELSE ANYTHING END; +``` + +同じクエリで別のシード文字列の場合: + +```bash +$ clickhouse-format --seed World --obfuscate <<< "SELECT cost_first_screen BETWEEN a AND b, CASE WHEN x >= 123 THEN y ELSE NULL END;" +``` + +結果: + +``` +SELECT horse_tape_summer BETWEEN folklore AND moccasins, CASE WHEN intestine >= 116 THEN nonconformist ELSE FORESTRY END; +``` + +5. バックスラッシュの追加: + +```bash +$ clickhouse-format --backslash <<< "SELECT * FROM (SELECT 1 AS x UNION ALL SELECT 1 UNION DISTINCT SELECT 3);" +``` + +結果: + +``` +SELECT * \ +FROM \ +( \ + SELECT 1 AS x \ + UNION ALL \ + SELECT 1 \ + UNION DISTINCT \ + SELECT 3 \ +) +``` diff --git a/docs/ja/operations/utilities/clickhouse-keeper-client.md b/docs/ja/operations/utilities/clickhouse-keeper-client.md new file mode 100644 index 00000000000..dbf8f2b13a0 --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-keeper-client.md @@ -0,0 +1,68 @@ +--- +slug: /ja/operations/utilities/clickhouse-keeper-client +sidebar_label: clickhouse-keeper-client +--- + +# clickhouse-keeper-client + +ネイティブプロトコルを通じてclickhouse-keeperとやりとりするためのクライアントアプリケーションです。 + +## キー {#clickhouse-keeper-client} + +- `-q QUERY`, `--query=QUERY` — 実行するクエリ。 このパラメータが渡されない場合、`clickhouse-keeper-client`はインタラクティブモードで開始されます。 +- `-h HOST`, `--host=HOST` — サーバーホスト。デフォルト値:`localhost`。 +- `-p N`, `--port=N` — サーバーポート。デフォルト値:9181。 +- `-c FILE_PATH`, `--config-file=FILE_PATH` — 接続文字列を取得するための設定ファイルのパスを設定します。デフォルト値:`config.xml`。 +- `--connection-timeout=TIMEOUT` — 接続タイムアウトを秒単位で設定します。デフォルト値:10秒。 +- `--session-timeout=TIMEOUT` — セッションタイムアウトを秒単位で設定します。デフォルト値:10秒。 +- `--operation-timeout=TIMEOUT` — 操作タイムアウトを秒単位で設定します。デフォルト値:10秒。 +- `--history-file=FILE_PATH` — 履歴ファイルのパスを設定します。デフォルト値:`~/.keeper-client-history`。 +- `--log-level=LEVEL` — ログレベルを設定します。デフォルト値:`information`。 +- `--no-confirmation` — 設定すると、いくつかのコマンドで確認を必要としません。インタラクティブではデフォルト値`false`、クエリでは`true`です。 +- `--help` — ヘルプメッセージを表示します。 + +## 例 {#clickhouse-keeper-client-example} + +```bash +./clickhouse-keeper-client -h localhost -p 9181 --connection-timeout 30 --session-timeout 30 --operation-timeout 30 +Connected to ZooKeeper at [::1]:9181 with session_id 137 +/ :) ls +keeper foo bar +/ :) cd 'keeper' +/keeper :) ls +api_version +/keeper :) cd 'api_version' +/keeper/api_version :) ls + +/keeper/api_version :) cd 'xyz' +Path /keeper/api_version/xyz does not exist +/keeper/api_version :) cd ../../ +/ :) ls +keeper foo bar +/ :) get 'keeper/api_version' +2 +``` + +## コマンド {#clickhouse-keeper-client-commands} + +- `ls '[path]'` -- 指定されたパスのノードを一覧表示します(デフォルト: 作業ディレクトリ)。 +- `cd '[path]'` -- 作業パスを変更します(デフォルト `.`)。 +- `cp '' ''` -- 'src'ノードを'dest'パスにコピーします。 +- `mv '' ''` -- 'src'ノードを'dest'パスに移動します。 +- `exists ''` -- ノードが存在する場合は`1`を返し、存在しない場合は`0`を返します。 +- `set '' [version]` -- ノードの値を更新します。バージョンが一致する場合のみ更新されます(デフォルト: -1)。 +- `create '' [mode]` -- 設定された値で新しいノードを作成します。 +- `touch ''` -- ノードを空の文字列として作成します。ノードが既に存在する場合は例外をスローしません。 +- `get ''` -- ノードの値を返します。 +- `rm '' [version]` -- バージョンが一致する場合のみノードを削除します(デフォルト: -1)。 +- `rmr '' [limit]` -- サブツリーのサイズがリミットよりも小さい場合にパスを再帰的に削除します。確認が必要です(デフォルトのリミット = 100)。 +- `flwc ` -- 4文字コマンドを実行します。 +- `help` -- このメッセージをプリントします。 +- `get_direct_children_number '[path]'` -- 特定のパスの直下の子ノードの数を取得します。 +- `get_all_children_number '[path]'` -- 特定のパスのすべての子ノード数を取得します。 +- `get_stat '[path]'` -- ノードのステータスを返します(デフォルト `.`)。 +- `find_super_nodes '[path]'` -- 指定されたパスで子ノードの数がしきい値を超えるノードを探します(デフォルト `.`)。 +- `delete_stale_backups` -- 非アクティブなバックアップに使用されたClickHouseノードを削除します。 +- `find_big_family [path] [n]` -- サブツリーで最大のファミリーを持つトップnノードを返します(デフォルトパス = `.`、n = 10)。 +- `sync ''` -- プロセス間およびリーダー間でノードを同期します。 +- `reconfig "" [version]` -- Keeperクラスタを再構成します。詳しくは https://clickhouse.com/docs/ja/guides/sre/keeper/clickhouse-keeper#reconfiguration を参照してください。 diff --git a/docs/ja/operations/utilities/clickhouse-local.md b/docs/ja/operations/utilities/clickhouse-local.md new file mode 100644 index 00000000000..2962e31af3b --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-local.md @@ -0,0 +1,311 @@ +--- +slug: /ja/operations/utilities/clickhouse-local +sidebar_position: 60 +sidebar_label: clickhouse-local +--- + +# clickhouse-local + +## 関連コンテンツ + +- ブログ: [clickhouse-localを使用してローカルファイルのデータを抽出、変換、およびクエリ](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) + +## clickhouse-localとClickHouseのどちらを使用するか + +`clickhouse-local` は、SQLを使用してローカルおよびリモートファイルを高速に処理する必要がある開発者にとって、完全なデータベースサーバーをインストールすることなく使用できる、簡単なClickHouseのバージョンです。`clickhouse-local` を使用することで、開発者はコマンドラインから直接SQLコマンドを使用することができ、完全なClickHouseのインストールを必要とせずにClickHouse機能にアクセスするための簡単で効率的な方法を提供します。`clickhouse-local` の主な利点のひとつは、[clickhouse-client](https://clickhouse.com/docs/ja/integrations/sql-clients/clickhouse-client-local) をインストールする際にすでに含まれていることです。これにより、複雑なインストールプロセスを必要とせずに、開発者はすぐに `clickhouse-local` を使用開始できます。 + +`clickhouse-local` は開発とテスト目的、およびファイル処理に関して非常に便利なツールですが、エンドユーザーやアプリケーション向けのサーバーとしては適していません。これらのシナリオでは、オープンソースの [ClickHouse](https://clickhouse.com/docs/ja/install) の使用が推奨されます。ClickHouseは大規模な分析ワークロードを処理するよう設計された強力なOLAPデータベースであり、大規模データセットに対する複雑なクエリの迅速かつ効率的な処理を提供し、ハイパフォーマンスが重要な本番環境での使用に最適です。さらに、ClickHouseはレプリケーション、シャーディング、高可用性など、アプリケーションをサポートするためにスケールアップするために不可欠な機能を幅広く提供しています。より大きなデータセットを扱ったり、エンドユーザーやアプリケーションをサポートする必要がある場合は、`clickhouse-local` の代わりにオープンソースのClickHouseを使用することをお勧めします。 + +以下のドキュメントを参照して、`clickhouse-local` の使用例([ローカルファイルへのクエリ](#query_data_in_file) や [S3のParquetファイルを読み取る](#query-data-in-a-parquet-file-in-aws-s3))をご覧ください。 + +## clickhouse-localのダウンロード + +`clickhouse-local` はClickHouseサーバーと `clickhouse-client` を実行する同じ `clickhouse` バイナリを使用して実行されます。最新バージョンをダウンロードする最も簡単な方法は、次のコマンドを使用することです。 + +```bash +curl https://clickhouse.com/ | sh +``` + +:::note +ダウンロードしたばかりのバイナリは、さまざまなClickHouseツールとユーティリティを実行できます。データベースサーバーとしてClickHouseを実行したい場合は、[クイックスタート](../../quick-start.mdx)を参照してください。 +::: + +## ファイル内のデータにSQLでクエリを実行する {#query_data_in_file} + +`clickhouse-local` の一般的な使用方法は、ファイルに対してアドホッククエリを実行することです。データをテーブルに挿入する必要はありません。`clickhouse-local` は、ファイルからデータを一時テーブルにストリームし、SQLを実行することができます。 + +ファイルが `clickhouse-local` と同じマシン上にある場合、ロードするファイルを指定するだけで済みます。以下の `reviews.tsv` ファイルには、Amazon製品レビューのサンプルが含まれています。 + +```bash +./clickhouse local -q "SELECT * FROM 'reviews.tsv'" +``` + +このコマンドは、次のコマンドのショートカットです。 + +```bash +./clickhouse local -q "SELECT * FROM file('reviews.tsv')" +``` + +ClickHouseはファイルの拡張子からタブ区切り形式を知っています。形式を明示的に指定する必要がある場合、[ClickHouseの多くの入力形式](../../interfaces/formats.md)のいずれかを追加するだけで済みます。 + +```bash +./clickhouse local -q "SELECT * FROM file('reviews.tsv', 'TabSeparated')" +``` + +`file` テーブル関数はテーブルを作成し、`DESCRIBE` を使用して推測されたスキーマを見ることができます。 + +```bash +./clickhouse local -q "DESCRIBE file('reviews.tsv')" +``` + +:::tip +ファイル名でグロブを使用することが許可されています([グロブの置換](/docs/ja/sql-reference/table-functions/file.md/#globs-in-path) を参照)。 + +例: + +```bash +./clickhouse local -q "SELECT * FROM 'reviews*.jsonl'" +./clickhouse local -q "SELECT * FROM 'review_?.csv'" +./clickhouse local -q "SELECT * FROM 'review_{1..3}.csv'" +``` + +::: + +```response +marketplace Nullable(String) +customer_id Nullable(Int64) +review_id Nullable(String) +product_id Nullable(String) +product_parent Nullable(Int64) +product_title Nullable(String) +product_category Nullable(String) +star_rating Nullable(Int64) +helpful_votes Nullable(Int64) +total_votes Nullable(Int64) +vine Nullable(String) +verified_purchase Nullable(String) +review_headline Nullable(String) +review_body Nullable(String) +review_date Nullable(Date) +``` + +最高評価の製品を見つけましょう。 + +```bash +./clickhouse local -q "SELECT + argMax(product_title,star_rating), + max(star_rating) +FROM file('reviews.tsv')" +``` + +```response +Monopoly Junior Board Game 5 +``` + +## AWS S3のParquetファイルにクエリを実行する + +S3にファイルがある場合、`clickhouse-local` と `s3` テーブル関数を使用して、ファイルをClickHouseテーブルに挿入せずにクエリを実行できます。イギリスで売られた不動産の価格情報を含む `house_0.parquet` という名前のファイルが公開バケットにあります。行数を確認してみましょう。 + +```bash +./clickhouse local -q " +SELECT count() +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_parquet/house_0.parquet')" +``` + +このファイルには270万行あります。 + +```response +2772030 +``` + +ClickHouseがファイルから推測するスキーマを見ることは常に有用です。 + +```bash +./clickhouse local -q "DESCRIBE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_parquet/house_0.parquet')" +``` + +```response +price Nullable(Int64) +date Nullable(UInt16) +postcode1 Nullable(String) +postcode2 Nullable(String) +type Nullable(String) +is_new Nullable(UInt8) +duration Nullable(String) +addr1 Nullable(String) +addr2 Nullable(String) +street Nullable(String) +locality Nullable(String) +town Nullable(String) +district Nullable(String) +county Nullable(String) +``` + +最も高価な地域を見てみましょう。 + +```bash +./clickhouse local -q " +SELECT + town, + district, + count() AS c, + round(avg(price)) AS price, + bar(price, 0, 5000000, 100) +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_parquet/house_0.parquet') +GROUP BY + town, + district +HAVING c >= 100 +ORDER BY price DESC +LIMIT 10" +``` + +```response +LONDON CITY OF LONDON 886 2271305 █████████████████████████████████████████████▍ +LEATHERHEAD ELMBRIDGE 206 1176680 ███████████████████████▌ +LONDON CITY OF WESTMINSTER 12577 1108221 ██████████████████████▏ +LONDON KENSINGTON AND CHELSEA 8728 1094496 █████████████████████▉ +HYTHE FOLKESTONE AND HYTHE 130 1023980 ████████████████████▍ +CHALFONT ST GILES CHILTERN 113 835754 ████████████████▋ +AMERSHAM BUCKINGHAMSHIRE 113 799596 ███████████████▉ +VIRGINIA WATER RUNNYMEDE 356 789301 ███████████████▊ +BARNET ENFIELD 282 740514 ██████████████▊ +NORTHWOOD THREE RIVERS 184 731609 ██████████████▋ +``` + +:::tip +ファイルをClickHouseに挿入する準備が整ったら、ClickHouseサーバーを起動し、ファイルと `s3` テーブル関数の結果を `MergeTree` テーブルに挿入します。詳細については、[クイックスタート](../../quick-start.mdx)を参照してください。 +::: + +## フォーマットの変換 + +`clickhouse-local` を使用して、データを異なる形式に変換できます。例: + +``` bash +$ clickhouse-local --input-format JSONLines --output-format CSV --query "SELECT * FROM table" < data.json > data.csv +``` + +形式はファイルの拡張子から自動検出されます: + +``` bash +$ clickhouse-local --query "SELECT * FROM table" < data.json > data.csv +``` + +ショートカットとして `--copy` 引数を使用して以下のように書くことができます。 + +``` bash +$ clickhouse-local --copy < data.json > data.csv +``` + +## 使用法 {#usage} + +デフォルトでは、`clickhouse-local` は同じホスト上のClickHouseサーバーのデータにアクセスでき、サーバーの設定には依存しません。また、`--config-file` 引数を使用してサーバー設定を読み込むこともサポートしています。テンポラリデータには、デフォルトで一意のテンポラリデータディレクトリが作成されます。 + +基本的な使用法 (Linux): + +``` bash +$ clickhouse-local --structure "table_structure" --input-format "format_of_incoming_data" --query "query" +``` + +基本的な使用法 (Mac): + +``` bash +$ ./clickhouse local --structure "table_structure" --input-format "format_of_incoming_data" --query "query" +``` + +:::note +`clickhouse-local` はWSL2を介してWindowsでもサポートされています。 +::: + +引数: + +- `-S`, `--structure` — 入力データのテーブル構造。 +- `--input-format` — 入力フォーマット、デフォルトは `TSV`。 +- `-F`, `--file` — データへのパス、デフォルトは `stdin`。 +- `-q`, `--query` — `;` で区切られる実行するクエリ。`--query` は複数回指定可能、例: `--query "SELECT 1" --query "SELECT 2"`。`--queries-file`と同時に使用することはできません。 +- `--queries-file` - 実行するクエリを持つファイルパス。`--queries-file` は複数回指定可能、例: `--query queries1.sql --query queries2.sql`。`--query` と同時に使用することはできません。 +- `--multiquery, -n` – このオプションが指定されている場合、セミコロンで区切られた複数のクエリを `--query` オプションの後にリストすることができます。便利な点として、`--query` を省略し、`--multiquery` の直後にクエリを直接渡すことが可能です。 +- `-N`, `--table` — 出力データを置くテーブル名、デフォルトは `table`。 +- `-f`, `--format`, `--output-format` — 出力フォーマット、デフォルトは `TSV`。 +- `-d`, `--database` — デフォルトデータベース、デフォルトは `_local`。 +- `--stacktrace` — 例外の際にデバッグ出力をダンプするかどうか。 +- `--echo` — 実行前にクエリを表示。 +- `--verbose` — クエリ実行に関する詳細情報。 +- `--logger.console` — コンソールへのログ。 +- `--logger.log` — ログファイル名。 +- `--logger.level` — ログレベル。 +- `--ignore-error` — クエリが失敗しても処理を停止しない。 +- `-c`, `--config-file` — ClickHouseサーバー用のものと同じ形式の設定ファイルのパス。デフォルトは設定なし。 +- `--no-system-tables` — システムテーブルをアタッチしない。 +- `--help` — `clickhouse-local` の引数リファレンス。 +- `-V`, `--version` — バージョン情報を表示して終了。 + +また、より一般的に使用されるClickHouseの設定変数用の引数もあります。 + +## 例 {#examples} + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local --structure "a Int64, b Int64" \ + --input-format "CSV" --query "SELECT * FROM table" +Read 2 rows, 32.00 B in 0.000 sec., 5182 rows/sec., 80.97 KiB/sec. +1 2 +3 4 +``` + +前述の例は以下と同じです。 + +``` bash +$ echo -e "1,2\n3,4" | clickhouse-local -n --query " + CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); + SELECT a, b FROM table; + DROP TABLE table;" +Read 2 rows, 32.00 B in 0.000 sec., 4987 rows/sec., 77.93 KiB/sec. +1 2 +3 4 +``` + +`stdin` や `--file` 引数を使用する必要はなく、[`file` テーブル関数](../../sql-reference/table-functions/file.md)を使用して任意の数のファイルを開くことができます。 + +``` bash +$ echo 1 | tee 1.tsv +1 + +$ echo 2 | tee 2.tsv +2 + +$ clickhouse-local --query " + select * from file('1.tsv', TSV, 'a int') t1 + cross join file('2.tsv', TSV, 'b int') t2" +1 2 +``` + +次に、各Unixユーザーのメモリユーザーを出力してみましょう。 + +クエリ: + +``` bash +$ ps aux | tail -n +2 | awk '{ printf("%s\t%s\n", $1, $4) }' \ + | clickhouse-local --structure "user String, mem Float64" \ + --query "SELECT user, round(sum(mem), 2) as memTotal + FROM table GROUP BY user ORDER BY memTotal DESC FORMAT Pretty" +``` + +結果: + +``` text +Read 186 rows, 4.15 KiB in 0.035 sec., 5302 rows/sec., 118.34 KiB/sec. +┏━━━━━━━━━━┳━━━━━━━━━━┓ +┃ user ┃ memTotal ┃ +┡━━━━━━━━━━╇━━━━━━━━━━┩ +│ bayonet │ 113.5 │ +├──────────┼──────────┤ +│ root │ 8.8 │ +├──────────┼──────────┤ +... +``` + +## 関連コンテンツ + +- [clickhouse-localを使用してローカルファイルのデータを抽出、変換、およびクエリ](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) +- [ClickHouseへのデータ投入 - パート1](https://clickhouse.com/blog/getting-data-into-clickhouse-part-1) +- [巨大な実世界のデータセットを探索する: 100年以上の気象記録をClickHouseで](https://clickhouse.com/blog/real-world-data-noaa-climate-data) diff --git a/docs/ja/operations/utilities/clickhouse-obfuscator.md b/docs/ja/operations/utilities/clickhouse-obfuscator.md new file mode 100644 index 00000000000..08f01f8c82b --- /dev/null +++ b/docs/ja/operations/utilities/clickhouse-obfuscator.md @@ -0,0 +1,43 @@ +--- +slug: /ja/operations/utilities/clickhouse-obfuscator +title: clickhouse-obfuscator +--- + +テーブルデータの難読化のためのシンプルなツールです。 + +このツールは入力テーブルを読み込み、一部の特性を保持しつつ異なるデータを含む出力テーブルを生成します。 +この方法は、ベンチマークで使用するために実際の本番データに近いデータを公開することを可能にします。 + +このツールは以下のデータの特性を保持するように設計されています: +- 各カラムおよびカラムの組の値の基数(異なる値の数) +- 条件付き基数:別のカラムの値を条件にした場合のあるカラムの異なる値の数 +- 整数の絶対値の確率分布;符号付き整数の符号;浮動小数点数の指数と符号 +- 文字列の長さの確率分布 +- 数値のゼロ値、空文字列と配列、`NULL`の確率 + +- LZ77やエントロピー系のコーデックで圧縮された場合のデータ圧縮率 +- テーブル内の時間値の連続性(差異の大きさ);浮動小数点値の連続性 +- `DateTime`値の日付要素 + +- 文字列値のUTF-8の妥当性 +- 文字列値が自然に見えること + +上記の特性の多くはパフォーマンステストに有効です: + +データの読み取り、フィルタリング、集計、およびソートは、基数、大小、圧縮率などが保存されているため、元のデータとほぼ同じ速度で動作します。 + +動作は決定的です:シード値を定義し、変換は入力データとシードによって決定されます。 +いくつかの変換は一対一で逆にすることができるため、大きなシードを持ち、それを秘密にしておく必要があります。 + +データを変換するためにいくつかの暗号化プリミティブを使用していますが、暗号化の観点からは適切に行われていないため、他の理由がない限り結果を安全とみなすべきではありません。結果は公開したくないデータを一部保持している可能性があります。 + +0, 1, -1の数値、日付、配列の長さ、ヌルフラグは常にソースデータとまったく同じになります。 +例えば、テーブル内に`IsMobile`というカラムがあり、値が0と1である場合、変換されたデータでも同じ値を保持します。 + +したがって、ユーザーは正確なモバイルトラフィックの割合をカウントすることができます。 + +別の例を示します。テーブル内にユーザーのメールアドレスのようなプライベートデータがあり、単一のメールアドレスを公開したくない場合、 +テーブルが十分に大きく、複数の異なるメールを含み、他のすべてよりも非常に高い頻度を持つメールがない場合、すべてのデータが匿名化されます。しかし、カラム内の異なる値の数が少ない場合、いくつかを再現することができる場合があります。 +このツールがどのように動作するか、そのアルゴリズムを理解し、コマンドラインパラメータを詳細に調整することをお勧めします。 + +このツールは、少なくとも中程度のデータ量(少なくとも1000行)でのみ正常に機能します。 diff --git a/docs/ja/operations/utilities/index.md b/docs/ja/operations/utilities/index.md new file mode 100644 index 00000000000..fc324c26a46 --- /dev/null +++ b/docs/ja/operations/utilities/index.md @@ -0,0 +1,16 @@ +--- +slug: /ja/operations/utilities/ +sidebar_position: 56 +sidebar_label: ツールとユーティリティの一覧 +--- + +# ツールとユーティリティの一覧 + +- [clickhouse-local](../../operations/utilities/clickhouse-local.md) — ClickHouseサーバーを起動せずにデータに対してSQLクエリを実行できるツールで、`awk`のような動作をします。 +- [clickhouse-benchmark](../../operations/utilities/clickhouse-benchmark.md) — サーバーにカスタムクエリや設定を読み込ませます。 +- [clickhouse-format](../../operations/utilities/clickhouse-format.md) — 入力クエリのフォーマットを整えることができます。 +- [ClickHouse obfuscator](../../operations/utilities/clickhouse-obfuscator.md) — データを難読化します。 +- [ClickHouse compressor](../../operations/utilities/clickhouse-compressor.md) — データを圧縮・解凍します。 +- [clickhouse-disks](../../operations/utilities/clickhouse-disks.md) — 異なるClickHouseディスク間でファイルに対するファイルシステムのような操作を提供します。 +- [clickhouse-odbc-bridge](../../operations/utilities/odbc-bridge.md) — ODBCドライバーのためのプロキシサーバーです。 +- [clickhouse_backupview](../../operations/utilities/backupview.md) — ClickHouseのバックアップを分析するためのPythonモジュールです。 diff --git a/docs/ja/operations/utilities/odbc-bridge.md b/docs/ja/operations/utilities/odbc-bridge.md new file mode 100644 index 00000000000..8f65826b5c9 --- /dev/null +++ b/docs/ja/operations/utilities/odbc-bridge.md @@ -0,0 +1,35 @@ +--- +slug: /ja/operations/utilities/odbc-bridge +title: clickhouse-odbc-bridge +--- + +ODBCドライバーのプロキシとして機能するシンプルなHTTPサーバーです。主な動機は、ODBC実装で可能性のあるセグメンテーションフォルトや他のフォルトが原因で、clickhouse-serverプロセス全体をクラッシュさせることがあるためです。 + +このツールはHTTP経由で動作し、パイプ、共有メモリ、TCPでは動作しません。理由は以下の通りです: +- 実装が簡単であること +- デバッグがしやすいこと +- jdbc-bridgeも同様に実装することができること + +## 使用方法 + +`clickhouse-server`は、このツールをODBCテーブル関数およびStorageODBCの内部で使用します。しかしながら、以下のパラメータをPOSTリクエストのURLで指定することにより、コマンドラインからスタンドアロンツールとして使用することもできます: +- `connection_string` -- ODBC接続文字列。 +- `sample_block` -- ClickHouse NamesAndTypesList形式でのカラムの説明、名前はバッククォート、型は文字列として記述します。名前と型はスペースで区切り、行は改行で区切ります。 +- `max_block_size` -- オプションのパラメータで、単一ブロックの最大サイズを設定します。クエリはポストボディで送信されます。レスポンスはRowBinary形式で返されます。 + +## 例: + +```bash +$ clickhouse-odbc-bridge --http-port 9018 --daemon + +$ curl -d "query=SELECT PageID, ImpID, AdType FROM Keys ORDER BY PageID, ImpID" --data-urlencode "connection_string=DSN=ClickHouse;DATABASE=stat" --data-urlencode "sample_block=columns format version: 1 +3 columns: +\`PageID\` String +\`ImpID\` String +\`AdType\` String +" "http://localhost:9018/" > result.txt + +$ cat result.txt +12246623837185725195925621517 +``` + diff --git a/docs/ja/operations/workload-scheduling.md b/docs/ja/operations/workload-scheduling.md new file mode 100644 index 00000000000..4bc467050b6 --- /dev/null +++ b/docs/ja/operations/workload-scheduling.md @@ -0,0 +1,215 @@ +--- +slug: /ja/operations/workload-scheduling +sidebar_position: 69 +sidebar_label: "ワークロードスケジューリング" +title: "ワークロードスケジューリング" +--- + +ClickHouseが複数のクエリを同時に実行する場合、それらは共有リソース(例:ディスク)を使用している可能性があります。スケジューリング制約とポリシーを適用することで、異なるワークロード間でリソースがどのように利用され共有されるのかを調整できます。各リソースにはスケジューリング階層を設定できます。階層のルートはリソースを表し、リーフはリソースキャパシティを超えたリクエストを保持するキューです。 + +:::note +現在、説明された方法を使用してスケジューリングできるのはリモートディスクIOのみです。CPUスケジューリングについては、スレッドプールと[`concurrent_threads_soft_limit_num`](server-configuration-parameters/settings.md#concurrent_threads_soft_limit_num)の設定を参照してください。柔軟なメモリ制限については[メモリオーバーコミット](settings/memory-overcommit.md)を参照してください。 +::: + +## ディスク設定 {#disk-config} + +特定のディスクでIOスケジューリングを有効にするには、ストレージ設定で`read_resource`または`write_resource`を指定する必要があります。これにより、指定されたディスクでの読み取りおよび書き込みリクエストに対して、ClickHouseがどのリソースを使用するべきかを示します。ローカルSSDやHDDの場合、読み取りおよび書き込みリソースは同じリソース名を参照できます。リモートディスクの場合も同様に、複数の異なるディスクが同じリソースを参照することができ、「プロダクション」や「開発」ワークロード間でネットワーク帯域幅を適切に分配したい場合に便利です。 + +例: +```xml + + + ... + + + s3 + https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/root-path/ + your_access_key_id + your_secret_access_key + network_read + network_write + + + + + +
    + s3 +
    +
    +
    +
    +
    +
    +``` + +リソースで使用されるディスクを指定するもう一つの方法としてSQL構文があります: + +```sql +CREATE RESOURCE resource_name (WRITE DISK disk1, READ DISK disk2) +``` + +リソースは、読み取りまたは書き込み、またはその両方のために任意の数のディスクに使用できます。すべてのディスクにリソースを使用することを表現する構文もあります: + +```sql +CREATE RESOURCE all_io (READ ANY DISK, WRITE ANY DISK); +``` + +サーバーの構成オプションは、SQLによるリソースの定義方法よりも優先されることに注意してください。 + +## ワークロードマークアップ {#workload_markup} + +クエリには設定`workload`を使用して異なるワークロードを識別するマークを付けることができます。`workload`が設定されていない場合、「default」の値が使用されます。設定プロファイルを使用して他の値を指定できることに注意してください。ユーザーからのすべてのクエリを`workload`設定の固定値でマークしたい場合、設定制約を使用して`workload`を一定にすることができます。 + +バックグラウンドアクティビティに対して`workload`設定を割り当てることも可能です。マージとマテーションにはそれぞれ`merge_workload`と`mutation_workload`のサーバー設定が使用されます。これらの値は、特定のテーブルに対して`merge_workload`と`mutation_workload`のMergeTree設定を使用してオーバーライドすることもできます。 + +ここで、「プロダクション」と「開発」という2つの異なるワークロードを持つシステムの例を考えてみましょう。 + +```sql +SELECT count() FROM my_table WHERE value = 42 SETTINGS workload = 'production' +SELECT count() FROM my_table WHERE value = 13 SETTINGS workload = 'development' +``` + +## リソースのスケジューリング階層 {#hierarchy} + +スケジューリングサブシステムの観点から、リソースはスケジューリングノードの階層を表します。 + +```mermaid +graph TD + subgraph network_read + nr_root(("/")) + -->|100 concurrent requests| nr_fair("fair") + -->|75% bandwidth| nr_prod["prod"] + nr_fair + -->|25% bandwidth| nr_dev["dev"] + end + + subgraph network_write + nw_root(("/")) + -->|100 concurrent requests| nw_fair("fair") + -->|75% bandwidth| nw_prod["prod"] + nw_fair + -->|25% bandwidth| nw_dev["dev"] + end +``` + +**可能なノードタイプ:** +* `inflight_limit`(制約) - 同時に飛んでいるリクエストの数が`max_requests`を超えるか、またはその合計コストが`max_cost`を超える場合にブロックされます。唯一の子ノードを持たねばなりません。 +* `bandwidth_limit`(制約) - 現在の帯域幅が`max_speed`(0は無制限を意味)またはバーストが`max_burst`(デフォルトは`max_speed`に等しい)を超える場合にブロックされます。唯一の子ノードを持たねばなりません。 +* `fair`(ポリシー) - マックスミンフェアネスに従って次にサービスを提供するリクエストを子ノードから選択します。子ノードは`weight`(デフォルトは1)を指定できます。 +* `priority`(ポリシー) - 静的な優先順位(値が低いほど優先順位が高い)に従って次にサービスを提供するリクエストを子ノードから選択します。子ノードは`priority`(デフォルトは0)を指定できます。 +* `fifo`(キュー) - リソースキャパシティを超えたリクエストを保持できる階層のリーフ。 + +基礎となるリソースのフルキャパシティを使用するためには、`inflight_limit`を使用すべきです。`max_requests`や`max_cost`の値が低すぎると、リソースのフル利用がなされず、反対に値が高すぎるとスケジューラー内のキューが空になり、結果としてサブツリー内でポリシーが無視される(不公平または優先順位の無視)ことにつながります。一方で、リソースの過度の利用からの保護が必要な場合、`bandwidth_limit`を使用すべきです。これは、`duration`秒で消費されるリソース量が`max_burst + max_speed * duration`バイトを超えた場合にスロットリングを行います。同一リソース上にある2つの`bandwidth_limit`ノードを使用して、短期間のピーク帯域幅と長期間の平均帯域幅を制限することができます。 + +以下の例は、図に示されているIOスケジューリング階層を定義する方法の一例です: + +```xml + + + + + inflight_limit + 100 + + + fair + + + fifo + 3 + + + fifo + + + + + inflight_limit + 100 + + + fair + + + fifo + 3 + + + fifo + + + + +``` + +## ワークロード分類子 {#workload_classifiers} + +ワークロード分類子は、クエリで指定された`workload`から特定のリソースに使用するリーフキューへのマッピングを定義するために使用されます。現時点では、ワークロード分類は単純です:静的マッピングのみが使用可能です。 + +例: +```xml + + + + /fair/prod + /fair/prod + + + /fair/dev + /fair/dev + + + /fair/dev + /fair/dev + + + +``` + +## ワークロード階層(SQLのみ) {#workloads} + +XMLでリソースと分類子を定義するのは難しいことがあります。ClickHouseはより便利なSQL構文を提供しています。`CREATE RESOURCE`で作成されたすべてのリソースは同じ構造の階層を共有しますが、いくつかの点で異なることがあります。`CREATE WORKLOAD`で作成された各ワークロードは、それぞれのリソースに対していくつかのスケジューリングノードを自動的に保持します。一つの親ワークロードの中に子ワークロードを作成することができます。以下は、上記のXML設定と全く同じ階層を定義する例です: + +```sql +CREATE RESOURCE network_write (WRITE DISK s3) +CREATE RESOURCE network_read (READ DISK s3) +CREATE WORKLOAD all SETTINGS max_requests = 100 +CREATE WORKLOAD development IN all +CREATE WORKLOAD production IN all SETTINGS weight = 3 +``` + +子供のいないリーフワークロードの名前は、クエリ設定の`SETTINGS workload = 'name'`で使用できます。SQL構文を使用する際、ワークロード分類子も自動的に作成されることに注意してください。 + +ワークロードをカスタマイズするためには、以下の設定が使用できます: +* `priority` - 同階層のワークロードは、静的優先順位値に従ってサービスされます(値が低いほど優先順位が高い)。 +* `weight` - 同階層のワークロードが同じ静的優先順位を持つ場合、リソースは重みに基づいて共有されます。 +* `max_requests` - このワークロードでの同時リソースリクエストの数の制限。 +* `max_cost` - このワークロードでの同時リソースリクエストの合計インフライトバイト数の制限。 +* `max_speed` - このワークロードのバイト処理速度の制限(各リソースに対して独立しています)。 +* `max_burst` - ワークロードがスロットリングされることなく処理できる最大バイト数(各リソースに対して独立しています)。 + +ワークロード設定は、適切なスケジューリングノードセットに変換されることに注意してください。詳細については、スケジューリングノードの[タイプとオプション](#hierarchy)の説明を参照してください。 + +異なるリソースに対して異なるワークロードの階層を指定する方法はありません。しかし、特定のリソースに対して異なるワークロード設定値を指定する方法はあります: + +```sql +CREATE OR REPLACE WORKLOAD all SETTINGS max_requests = 100, max_speed = 1000000 FOR network_read, max_speed = 2000000 FOR network_write +``` + +また、ワークロードまたはリソースが他のワークロードから参照されている場合は削除できません。ワークロードの定義を更新するには、`CREATE OR REPLACE WORKLOAD`クエリを使用してください。 + +## ワークロードとリソースのストレージ {#workload_entity_storage} + +すべてのワークロードとリソースの定義は、`CREATE WORKLOAD`および`CREATE RESOURCE`クエリの形式で永続的に保存されます。保存先はディスク上の`workload_path`またはZooKeeper上の`workload_zookeeper_path`です。ノード間での一貫性を達成するためにはZooKeeperストレージが推奨されます。代わりに`ON CLUSTER`句をディスクストレージと一緒に使用することも可能です。 + +## 参照先 + - [system.scheduler](/docs/ja/operations/system-tables/scheduler.md) + - [system.workloads](/docs/ja/operations/system-tables/workloads.md) + - [system.resources](/docs/ja/operations/system-tables/resources.md) + - [merge_workload](/docs/ja/operations/settings/merge-tree-settings.md#merge_workload) MergeTree設定 + - [merge_workload](/docs/ja/operations/server-configuration-parameters/settings.md#merge_workload) グローバルサーバー設定 + - [mutation_workload](/docs/ja/operations/settings/merge-tree-settings.md#mutation_workload) MergeTree設定 + - [mutation_workload](/docs/ja/operations/server-configuration-parameters/settings.md#mutation_workload) グローバルサーバー設定 + - [workload_path](/docs/ja/operations/server-configuration-parameters/settings.md#workload_path) グローバルサーバー設定 + - [workload_zookeeper_path](/docs/ja/operations/server-configuration-parameters/settings.md#workload_zookeeper_path) グローバルサーバー設定 diff --git a/docs/ja/quick-start.mdx b/docs/ja/quick-start.mdx new file mode 100644 index 00000000000..2d9cfe49879 --- /dev/null +++ b/docs/ja/quick-start.mdx @@ -0,0 +1,299 @@ +--- +slug: /ja/getting-started/quick-start +sidebar_label: クイックスタート +sidebar_position: 1 +keywords: [clickhouse, インストール, スタートガイド, クイックスタート] +pagination_next: 'en/getting-started/index' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# ClickHouse クイックスタート + +:::tip +このページでは、オープンソースのClickHouseを自分のマシンにセットアップする方法を説明します。最速でClickHouseをデプロイし、専用のSQLコンソールにアクセスする方法は、ClickHouse Cloudを使用することです。 + +新しいユーザーは、$300の無料トライアルクレジットを受け取ることができます。サインアップは[こちら](https://clickhouse.cloud/signUp?loc=docs-quick-start)からどうぞ。 +::: + +## 1. バイナリのダウンロード + +ClickHouseは、Linux、FreeBSD、macOSでネイティブに動作し、Windowsでは[WSL](https://learn.microsoft.com/en-us/windows/wsl/about)を通じて動作します。ClickHouseをローカルにダウンロードする最も簡単な方法は、以下の`curl`コマンドを実行することです。このコマンドは、オペレーティングシステムがサポートされているかどうかを確認し、適切なClickHouseバイナリをダウンロードします。 + + ```bash + curl https://clickhouse.com/ | sh + ``` + +## 2. サーバーの起動 + +ClickHouseサーバーを開始するには、次のコマンドを実行します。 + + ```bash + ./clickhouse server + ``` + +## 3. クライアントの起動 + +`clickhouse-client`を使用して、ClickHouseサービスに接続します。新しいターミナルを開き、`clickhouse`バイナリが保存されているディレクトリに移動し、次のコマンドを実行してください。 + +```bash +./clickhouse client +``` + +ローカルホストで実行中のサービスに接続されると、笑顔の顔文字が表示されます。 + + ```response + my-host :) + ``` + +## 4. テーブルの作成 + +`CREATE TABLE`を使用して新しいテーブルを定義します。一般的なSQLのDDLコマンドがClickHouseでも機能しますが、ClickHouseのテーブルには`ENGINE`句が必要です。ClickHouseのパフォーマンス向上効果を活用するために、`MergeTree`を使用します。 + +```sql +CREATE TABLE my_first_table +( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 +) +ENGINE = MergeTree +PRIMARY KEY (user_id, timestamp) +``` + +## 5. データの挿入 + +ClickHouseでは、`INSERT INTO TABLE`コマンドを使うことができます。ただし、`MergeTree`テーブルにデータを挿入するたびに**パーツ**(フォルダ)がストレージに作成されることを理解しておくことが重要です。パーツを最小限にするために、大量の行を一度にバルクインサートすることをお勧めします(数万行以上、または数百万行)。 + +```sql +INSERT INTO my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) +``` + +## 6. 新しいテーブルにクエリを実行 + +他のSQLデータベースと同様に、`SELECT`クエリを書くことができます。 + + ```sql + SELECT * + FROM my_first_table + ORDER BY timestamp + ``` + 結果はすっきりしたテーブル形式で返されます。 + ```response + ┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ + │ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ + │ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ + │ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ + │ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ + └─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + + 4 rows in set. Elapsed: 0.008 sec. + ``` + +## 7. 独自のデータを挿入 + +次のステップは、現在のデータをClickHouseに取り込むことです。データを取り込むための[テーブル関数](/docs/ja/sql-reference/table-functions/index.md)や[統合](/docs/ja/integrations)が多数あります。以下のタブにいくつかの例を示しますが、ClickHouseとの統合の長いリストを[統合ガイド](/docs/ja/integrations)で確認できます。 + + + + +[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3.md)を使用して、S3からファイルを読み取ります。これはテーブル関数です。このため、結果は以下のようにテーブルとして使用できます。 + +1. `SELECT`クエリのソースとして使用できます(これによりアドホッククエリを実行し、データをS3に残したままにできます)。 +2. 結果のテーブルを`MergeTree`テーブルに挿入する(データをClickHouseに移行する準備ができたとき)。 + +アドホッククエリの例は以下の通りです。 + +```sql +SELECT + passenger_count, + avg(toFloat32(total_amount)) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', + 'TabSeparatedWithNames' +) +GROUP BY passenger_count +ORDER BY passenger_count; +``` + +ClickHouseテーブルにデータを移行するには、次のようにします。`nyc_taxi`が`MergeTree`テーブルの場合: + +```sql +INSERT INTO nyc_taxi + SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', + 'TabSeparatedWithNames' +) +SETTINGS input_format_allow_errors_num=25000; +``` + +S3をClickHouseと一緒に使用する例と詳細については、[AWS S3ドキュメントページのコレクション](/docs/ja/integrations/data-ingestion/s3/index.md)を参照してください。 + + + + +AWS S3でのデータ読み取りに使用される[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3.md)は、Google Cloud Storageのファイルでも動作します。例えば: + +```sql +SELECT + * +FROM s3( + 'https://storage.googleapis.com/my-bucket/trips.parquet', + 'MY_GCS_HMAC_KEY', + 'MY_GCS_HMAC_SECRET_KEY', + 'Parquet' +) +LIMIT 1000 +``` + +詳細は[`s3`テーブル関数ページ](/docs/ja/sql-reference/table-functions/s3.md)を参照してください。 + + + + +[`url`テーブル関数](/docs/ja/sql-reference/table-functions/url)は、Webからアクセス可能なファイルを読み取ります。 + +```sql +--デフォルトでは、ClickHouseはSSRF攻撃から保護するためにリダイレクトを防止します。 +--以下のURLはリダイレクトを必要とするため、max_http_get_redirects > 0に設定する必要があります。 +SET max_http_get_redirects=10; + +SELECT * +FROM url( + 'http://prod2.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', + 'CSV' + ); +``` + +[`url`テーブル関数ページ](/docs/ja/sql-reference/table-functions/url)を参照して詳細をご覧ください。 + + + + +[`file`テーブルエンジン](/docs/ja/sql-reference/table-functions/file)を使用してローカルファイルを読み取ります。簡単のため、ファイルを`user_files`ディレクトリにコピーします(ClickHouseバイナリをダウンロードしたディレクトリにあります)。 + +```sql +DESCRIBE TABLE file('comments.tsv') + +Query id: 8ca9b2f9-65a2-4982-954a-890de710a336 + +┌─name──────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ type │ Nullable(String) │ │ │ │ │ │ +│ author │ Nullable(String) │ │ │ │ │ │ +│ timestamp │ Nullable(DateTime64(9)) │ │ │ │ │ │ +│ comment │ Nullable(String) │ │ │ │ │ │ +│ children │ Array(Nullable(Int64)) │ │ │ │ │ │ +└───────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseは、大量の行を分析してカラムの名前とデータ型を推測することに注意してください。 +ClickHouseがファイル名からストレージタイプを決定できない場合、第2引数として指定できます。 + +```sql +SELECT count() +FROM file( + 'comments.tsv', + 'TabSeparatedWithNames' +) +``` + +詳細は[`file`テーブル関数ページ](/docs/ja/sql-reference/table-functions/file)を確認してください。 + + + + +[`postgresql`テーブル関数](/ja/sql-reference/table-functions/postgresql)を使用して、PostgreSQLのテーブルからデータを読み取ります。 + +```sql +SELECT * +FROM + postgresql( + 'localhost:5432', + 'my_database', + 'my_table', + 'postgresql_user', + 'password') +; +``` + +詳細は[`postgresql`テーブル関数ページ](/docs/ja/sql-reference/table-functions/postgresql)を参照してください。 + + + + +[`mysql`テーブル関数](/docs/ja/sql-reference/table-functions/mysql)を使用して、MySQLのテーブルからデータを読み取ります。 + +```sql +SELECT * +FROM + mysql( + 'localhost:3306', + 'my_database', + 'my_table', + 'postgresql_user', + 'password') +; +``` + +詳細は[`mysql`テーブル関数ページ](/docs/ja/sql-reference/table-functions/mysql)を参照してください。 + + + + +ClickHouseは、任意のODBCまたはJDBCデータソースからデータを読み取ることができます。 + +```sql +SELECT * +FROM + odbc( + 'DSN=mysqlconn', + 'my_database', + 'my_table' + ); +``` + +詳細は[`odbc`テーブル関数ページ](/docs/ja/sql-reference/table-functions/odbc)および[`jdbc`テーブル関数ページ](/docs/ja/sql-reference/table-functions/jdbc)を参照してください。 + + + + +メッセージキューは、対応するテーブルエンジンを使用して、ClickHouseにデータをストリーミングできます。 + +- **Kafka**: [`Kafka`テーブルエンジン](/docs/ja/engines/table-engines/integrations/kafka)を使用してKafkaと統合 +- **Amazon MSK**: [Amazon Managed Streaming for Apache Kafka (MSK)](/docs/ja/integrations/kafka/cloud/amazon-msk/)と統合 +- **RabbitMQ**: [`RabbitMQ`テーブルエンジン](/docs/ja/engines/table-engines/integrations/rabbitmq)を使用してRabbitMQと統合 + + + + +ClickHouseは、以下のソースからデータを読み取るためのテーブル関数を備えています。 + +- **Hadoop**: [`hdfs`テーブル関数](/docs/ja/sql-reference/table-functions/hdfs)を使用してApache Hadoopと統合 +- **Hudi**: [`hudi`テーブル関数](/docs/ja/sql-reference/table-functions/hudi)を使用してS3の既存のApache Hudiテーブルを読み取り +- **Iceberg**: [`iceberg`テーブル関数](/docs/ja/sql-reference/table-functions/iceberg)を使用してS3の既存のApache Icebergテーブルを読み取り +- **DeltaLake**: [`deltaLake`テーブル関数](/docs/ja/sql-reference/table-functions/deltalake)を使用してS3の既存のDelta Lakeテーブルを読み取り + + + + +ClickHouseとの既存のフレームワークやデータソースを接続する方法については、[ClickHouse統合リスト](/docs/ja/integrations)を確認してください。 + + + + +## 次のステップは? + +- ClickHouseの主要な概念と機能をさらに詳しく探求する[上級者向けチュートリアル](tutorial.md)をご覧ください +- [ClickHouseアカデミー](https://learn.clickhouse.com/visitor_class_catalog)で無料のオンデマンドトレーニングコースを受講して学習を続けましょう +- [サンプルデータセット](/docs/ja/getting-started/example-datasets/)と、それらを挿入する方法に関する説明があります +- データが外部ソースから来る場合、メッセージキュー、データベース、パイプラインなどへの接続方法について[統合ガイドのコレクション](/docs/ja/integrations/)を参照してください +- UI/BIビジュアライゼーションツールを使用している場合、[ClickHouseにUIを接続するためのユーザーガイド](/docs/ja/integrations/data-visualization/)を参照してください +- [主キー](/docs/ja/guides/best-practices/sparse-primary-indexes.md)に関するユーザーガイドで、主キーについて知っておくべきすべての情報を確認し、定義方法を理解しましょう diff --git a/docs/ja/settings/beta-and-experimental-features.md b/docs/ja/settings/beta-and-experimental-features.md new file mode 100644 index 00000000000..d494983244d --- /dev/null +++ b/docs/ja/settings/beta-and-experimental-features.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 1 +sidebar_label: ベータ機能とエクスペリメンタル機能 +title: ベータおよびエクスペリメンタル機能 +description: "ClickHouseにはベータ版およびエクスペリメンタル機能があります。このドキュメントページではその定義を説明します。" +slug: /ja/beta-and-experimental-features +--- + +ClickHouseはオープンソースであるため、ClickHouseの社員だけでなくコミュニティからも多くの貢献を受けています。これらの貢献はしばしば異なるスピードで開発され、ある機能は一般提供 (GA) と見なされるまでに、長い試作段階やコミュニティからの十分なフィードバックと反復が必要です。 + +機能が一般提供として分類される時期の不確実性のために、機能を2つのカテゴリに分類しています: **ベータ**と**エクスペリメンタル**。 + +**ベータ**機能はClickHouseチームにより公式にサポートされています。**エクスペリメンタル**機能はClickHouseチームまたはコミュニティによる初期のプロトタイプで、公式にはサポートされていません。 + +以下のセクションでは、**ベータ**および**エクスペリメンタル**機能の特性を明確に説明しています。 + +## ベータ機能 + +- 一般提供 (GA) に向けて活発に開発中 +- 主な既知の問題はGitHubで追跡可能 +- 機能は将来的に変更される可能性あり +- ClickHouse Cloudで有効化される可能性あり +- ClickHouseチームがベータ機能をサポート + +以下の機能は、ClickHouse Cloudでベータとみなされ、まだClickHouseのSETTINGで```allow_experimental_*```と名付けられているものでも、ClickHouse Cloud Servicesで使用可能です。 + +注意: 最近導入された機能を使用するには、ClickHouse [互換性](https://clickhouse.com/docs/ja/operations/settings/settings#compatibility)設定の最新バージョンを使用していることを確認してください。 + +## エクスペリメンタル機能 + +- GAになることがないかもしれない +- 削除される可能性がある +- 破壊的変更を導入することがある +- 機能は将来的に変更される可能性がある +- 意図的に有効化する必要がある +- ClickHouseチームはエクスペリメンタル機能を**サポートしない** +- 重要な機能やドキュメントが欠如しているかもしれない +- クラウドで有効化することはできない + +注意: 上記でベータとしてリストされているもの以外のエクスペリメンタルな機能は、ClickHouse Cloudで有効化することはできません。 diff --git a/docs/ja/sql-reference/_category_.yml b/docs/ja/sql-reference/_category_.yml new file mode 100644 index 00000000000..ab8f628709d --- /dev/null +++ b/docs/ja/sql-reference/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'SQL Reference' +collapsible: true +collapsed: true +link: + type: generated-index + slug: /ja/sql-reference diff --git a/docs/ja/sql-reference/aggregate-functions/_category_.yml b/docs/ja/sql-reference/aggregate-functions/_category_.yml new file mode 100644 index 00000000000..9e289e6c83b --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/_category_.yml @@ -0,0 +1,9 @@ +position: 5 +label: 'Aggregate Functions' +collapsible: true +collapsed: true +link: + type: doc + id: en/sql-reference/aggregate-functions/index +customProps: + description: List of Aggregate Fucntions in ClickHouse diff --git a/docs/ja/sql-reference/aggregate-functions/combinators.md b/docs/ja/sql-reference/aggregate-functions/combinators.md new file mode 100644 index 00000000000..d58a4a0b34c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/combinators.md @@ -0,0 +1,331 @@ +--- +slug: /ja/sql-reference/aggregate-functions/combinators +sidebar_position: 37 +sidebar_label: Combinators +--- + +# 集約関数コンビネータ + +集約関数の名前にはサフィックスを付けることができます。これにより集約関数の動作が変更されます。 + +## -If + +サフィックス -If は任意の集約関数の名前に付けることができます。この場合、集約関数は追加の引数として条件(Uint8 型)を受け取ります。集約関数は条件を満たした行のみを処理します。条件が一度も満たされなかった場合、デフォルト値(通常はゼロまたは空の文字列)を返します。 + +例: `sumIf(column, cond)`, `countIf(cond)`, `avgIf(x, cond)`, `quantilesTimingIf(level1, level2)(x, cond)`, `argMinIf(arg, val, cond)` など。 + +条件付き集約関数を使用することで、サブクエリや `JOIN` を使用せずに複数の条件に対して集約を計算することができます。例えば、条件付き集約関数を使用してセグメント比較機能を実装できます。 + +## -Array + +-Array サフィックスは、任意の集約関数の名前に付けることができます。この場合、集約関数は ‘T’ 型の引数ではなく、‘Array(T)’ 型(配列)の引数を取ります。集約関数が複数の引数を受け取る場合、これらは同じ長さの配列でなければなりません。配列を処理する際、集約関数は元の集約関数が各配列要素に対して動作するように機能します。 + +例1: `sumArray(arr)` - すべての ‘arr’ 配列の要素を合計します。この例では、より簡単に `sum(arraySum(arr))` と書くことができます。 + +例2: `uniqArray(arr)` – すべての ‘arr’ 配列内のユニークな要素の数を数えます。これは `uniq(arrayJoin(arr))` という方法でも行うことができますが、クエリに ‘arrayJoin’ を追加できない場合があります。 + +-If と -Array は組み合わせ可能です。しかしながら、‘Array’ は最初に、次に‘If’の順序でなければなりません。例: `uniqArrayIf(arr, cond)`, `quantilesTimingArrayIf(level1, level2)(arr, cond)`。この順序のため、‘cond’ 引数は配列ではありません。 + +## -Map + +-Map サフィックスは、任意の集約関数に付けることができます。これにより、集約関数は引数として Map 型を取得し、マップの各キーの値を指定された集約関数を使用して個別に集約します。結果も Map 型となります。 + +**例** + +```sql +CREATE TABLE map_map( + date Date, + timeslot DateTime, + status Map(String, UInt64) +) ENGINE = Log; + +INSERT INTO map_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', (['a', 'b', 'c'], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:00:00', (['c', 'd', 'e'], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', (['d', 'e', 'f'], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', (['f', 'g', 'g'], [10, 10, 10])); + +SELECT + timeslot, + sumMap(status), + avgMap(status), + minMap(status) +FROM map_map +GROUP BY timeslot; + +┌────────────timeslot─┬─sumMap(status)───────────────────────┬─avgMap(status)───────────────────────┬─minMap(status)───────────────────────┐ +│ 2000-01-01 00:00:00 │ {'a':10,'b':10,'c':20,'d':10,'e':10} │ {'a':10,'b':10,'c':10,'d':10,'e':10} │ {'a':10,'b':10,'c':10,'d':10,'e':10} │ +│ 2000-01-01 00:01:00 │ {'d':10,'e':10,'f':20,'g':20} │ {'d':10,'e':10,'f':10,'g':10} │ {'d':10,'e':10,'f':10,'g':10} │ +└─────────────────────┴──────────────────────────────────────┴──────────────────────────────────────┴──────────────────────────────────────┘ +``` + +## -SimpleState + +このコンビネータを適用すると、集約関数は同じ値を異なる型で返します。これは、[SimpleAggregateFunction(...)](../../sql-reference/data-types/simpleaggregatefunction.md) で、[AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md) テーブルで使用できるようにテーブルに保存できます。 + +**構文** + +``` sql +SimpleState(x) +``` + +**引数** + +- `x` — 集約関数のパラメータ。 + +**返される値** + +`SimpleAggregateFunction(...)` 型の集約関数の値。 + +**例** + +クエリ: + +``` sql +WITH anySimpleState(number) AS c SELECT toTypeName(c), c FROM numbers(1); +``` + +結果: + +``` text +┌─toTypeName(c)────────────────────────┬─c─┐ +│ SimpleAggregateFunction(any, UInt64) │ 0 │ +└──────────────────────────────────────┴───┘ +``` + +## -State + +このコンビネータを適用すると、集約関数は最終的な値(例えば、[uniq](../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) 関数のユニークな値の数)ではなく、中間の集約状態を返します(`uniq` の場合、ユニークな値の数を計算するためのハッシュテーブルです)。これは、後処理に使用したり、テーブルに保存して後で集約を完了するために使用できる `AggregateFunction(...)` です。 + +:::note +-MapState は、同じデータに対する不変性を保証しません。これは中間状態でのデータ順序が変わる可能性があるためですが、データの取り込みには影響を与えません。 +::: + +これらの状態を操作するには、次を使用します: + +- [AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md) テーブルエンジン。 +- [finalizeAggregation](../../sql-reference/functions/other-functions.md#function-finalizeaggregation) 関数。 +- [runningAccumulate](../../sql-reference/functions/other-functions.md#runningaccumulate) 関数。 +- [-Merge](#-merge) コンビネータ。 +- [-MergeState](#-mergestate) コンビネータ。 + +## -Merge + +このコンビネータを適用すると、集約関数は中間の集約状態を引数として受け取り、状態を結合して集計を完了し、結果の値を返します。 + +## -MergeState + +-Merge コンビネータと同じ方法で中間集計状態をマージします。ただし、結果の値を返さず、-State コンビネータと同様に中間集約状態を返します。 + +## -ForEach + +テーブルの集約関数を配列の集約関数に変換し、対応する配列のアイテムを集約して結果の配列を返します。例えば、配列 `[1, 2]`, `[3, 4, 5]`, `[6, 7]` に対して `sumForEach` を使うと、対応する配列のアイテムを加算して `[10, 13, 5]` という結果を返します。 + +## -Distinct + +あらゆる引数のユニークな組み合わせを一度だけ集約します。繰り返しの値は無視されます。例: `sum(DISTINCT x)` (または `sumDistinct(x)`), `groupArray(DISTINCT x)` (または `groupArrayDistinct(x)`) , `corrStable(DISTINCT x, y)` (または `corrStableDistinct(x, y)`) など。 + +## -OrDefault + +集約関数の動作を変更します。 + +集約関数が入力値を持たない場合、このコンビネータを使うと、集約関数の戻りデータ型に対するデフォルト値を返します。空の入力データを受け取ることができる集約関数に適用されます。 + +`-OrDefault` は他のコンビネータと一緒に使用することができます。 + +**構文** + +``` sql +OrDefault(x) +``` + +**引数** + +- `x` — 集約関数のパラメータ。 + +**返される値** + +集約するものがない場合、集約関数の戻り型のデフォルト値を返します。 + +型は使用する集約関数に依存します。 + +**例** + +クエリ: + +``` sql +SELECT avg(number), avgOrDefault(number) FROM numbers(0) +``` + +結果: + +``` text +┌─avg(number)─┬─avgOrDefault(number)─┐ +│ nan │ 0 │ +└─────────────┴──────────────────────┘ +``` + +`-OrDefault` は他のコンビネータと一緒に使用することもできます。これは集約関数が空の入力を受け付けない場合に便利です。 + +クエリ: + +``` sql +SELECT avgOrDefaultIf(x, x > 10) +FROM +( + SELECT toDecimal32(1.23, 2) AS x +) +``` + +結果: + +``` text +┌─avgOrDefaultIf(x, greater(x, 10))─┐ +│ 0.00 │ +└───────────────────────────────────┘ +``` + +## -OrNull + +集約関数の動作を変更します。 + +このコンビネータは集約関数の結果を [Nullable](../../sql-reference/data-types/nullable.md) データ型に変換します。集約関数に値がない場合は、[NULL](../../sql-reference/syntax.md#null-literal) を返します。 + +`-OrNull` は他のコンビネータと一緒に使用することができます。 + +**構文** + +``` sql +OrNull(x) +``` + +**引数** + +- `x` — 集約関数のパラメータ。 + +**返される値** + +- 集約関数の結果を `Nullable` データ型に変換されたもの。 +- 集約するものがない場合は `NULL`。 + +型: `Nullable(集約関数の戻り型)`。 + +**例** + +集約関数の末尾に `-orNull` を追加します。 + +クエリ: + +``` sql +SELECT sumOrNull(number), toTypeName(sumOrNull(number)) FROM numbers(10) WHERE number > 10 +``` + +結果: + +``` text +┌─sumOrNull(number)─┬─toTypeName(sumOrNull(number))─┐ +│ ᴺᵁᴸᴸ │ Nullable(UInt64) │ +└───────────────────┴───────────────────────────────┘ +``` + +また `-OrNull` は他のコンビネータと一緒に使用できます。これは集約関数が空の入力を受け付けない場合に便利です。 + +クエリ: + +``` sql +SELECT avgOrNullIf(x, x > 10) +FROM +( + SELECT toDecimal32(1.23, 2) AS x +) +``` + +結果: + +``` text +┌─avgOrNullIf(x, greater(x, 10))─┐ +│ ᴺᵁᴸᴸ │ +└────────────────────────────────┘ +``` + +## -Resample + +データをグループに分け、そのグループごとにデータを個別に集約できます。グループは、ひとつのカラムの値を間隔に分割することによって作られます。 + +``` sql +Resample(start, end, step)(, resampling_key) +``` + +**引数** + +- `start` — `resampling_key` 値の全体の必要な間隔の開始値。 +- `stop` — `resampling_key` 値の全体の必要な間隔の終了値。全体の間隔には終了値 `stop` が含まれません `[start, stop)`。 +- `step` — 全体の間隔をサブ間隔に分ける間隔。`aggFunction` はこれらのサブ間隔ごとに独立して実行されます。 +- `resampling_key` — 間隔にデータを分けるために使用されるカラムの値。 +- `aggFunction_params` — `aggFunction` のパラメータ。 + +**返される値** + +- 各サブ間隔の `aggFunction` の結果の配列。 + +**例** + +以下のデータを持つ `people` テーブルを考えます: + +``` text +┌─name───┬─age─┬─wage─┐ +│ John │ 16 │ 10 │ +│ Alice │ 30 │ 15 │ +│ Mary │ 35 │ 8 │ +│ Evelyn │ 48 │ 11.5 │ +│ David │ 62 │ 9.9 │ +│ Brian │ 60 │ 16 │ +└────────┴─────┴──────┘ +``` + +年齢が `[30,60)` と `[60,75)` の範囲にある人々の名前を取得します。年齢を整数表現で使用するため、`[30, 59]` と `[60,74]` の範囲になります。 + +配列に名前を集約するために、[groupArray](../../sql-reference/aggregate-functions/reference/grouparray.md#agg_function-grouparray) 集約関数を使用します。この関数は1つの引数を取ります。この場合、`name` カラムです。`groupArrayResample` 関数は `age` カラムを使用して年齢ごとに名前を集約する必要があります。必要な間隔を定義するために、`30, 75, 30` の引数を `groupArrayResample` 関数に渡します。 + +``` sql +SELECT groupArrayResample(30, 75, 30)(name, age) FROM people +``` + +``` text +┌─groupArrayResample(30, 75, 30)(name, age)─────┐ +│ [['Alice','Mary','Evelyn'],['David','Brian']] │ +└───────────────────────────────────────────────┘ +``` + +結果を考えます。 + +`John` は若すぎるためサンプルから除外されます。その他の人々は指定された年齢の間隔に従って分配されています。 + +次に、指定された年齢範囲における総人口数と平均賃金を数えます。 + +``` sql +SELECT + countResample(30, 75, 30)(name, age) AS amount, + avgResample(30, 75, 30)(wage, age) AS avg_wage +FROM people +``` + +``` text +┌─amount─┬─avg_wage──────────────────┐ +│ [3,2] │ [11.5,12.949999809265137] │ +└────────┴──────────────────────────┘ +``` + +## -ArgMin + +サフィックス -ArgMin は任意の集約関数の名前に付けることができます。この場合、集約関数は追加の引数として、任意の比較可能な式を受け取ります。集約関数は特定の追加式の最小値を持つ行のみを処理します。 + +例: `sumArgMin(column, expr)`, `countArgMin(expr)`, `avgArgMin(x, expr)` など。 + +## -ArgMax + +サフィックス -ArgMin と似ていますが、特定の追加式で最大値を持つ行のみを処理します。 + +## 関連コンテンツ + +- ブログ: [Using Aggregate Combinators in ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/docs/ja/sql-reference/aggregate-functions/grouping_function.md b/docs/ja/sql-reference/aggregate-functions/grouping_function.md new file mode 100644 index 00000000000..8a7cffde219 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/grouping_function.md @@ -0,0 +1,348 @@ +--- +slug: /ja/sql-reference/aggregate-functions/grouping_function +--- + +# GROUPING + +## GROUPING + +[ROLLUP](../statements/select/group-by.md/#rollup-modifier) と [CUBE](../statements/select/group-by.md/#cube-modifier) は、GROUP BY に対する修飾子です。これらの修飾子は、いずれも小計を計算します。ROLLUP はカラムの並べられたリスト、例えば `(day, month, year)` を取り、集計の各レベルで小計を計算した後、総計を算出します。CUBE は、指定されたカラムの全ての可能な組み合わせにわたって小計を計算します。GROUPING は、ROLLUP または CUBE によって戻された行がスーパー集計であるかどうかを識別し、修飾されていない GROUP BY で戻される行であるかどうかを識別します。 + +GROUPING 関数は、複数のカラムを引数として受け取り、ビットマスクを返します。 +- `1` は、`GROUP BY` に対する `ROLLUP` または `CUBE` 修飾子によって戻された行が小計であることを示します +- `0` は、`ROLLUP` または `CUBE` によって戻された行が小計でないことを示します + +## GROUPING SETS + +デフォルトでは、CUBE 修飾子は、CUBE に渡されたカラムのすべての可能な組み合わせに対して小計を計算します。GROUPING SETS を使用すると、計算する特定の組み合わせを指定できます。 + +階層データの分析には、ROLLUP、CUBE、および GROUPING SETS 修飾子を使用することがおすすめです。ここでのサンプルは、2つのデータセンターにインストールされている Linux ディストリビューションとそのバージョンに関するデータを含むテーブルです。このデータをディストリビューション、バージョン、および場所別で見ることが有益かもしれません。 + +### サンプルデータのロード + +```sql +CREATE TABLE servers ( datacenter VARCHAR(255), + distro VARCHAR(255) NOT NULL, + version VARCHAR(50) NOT NULL, + quantity INT + ) + ORDER BY (datacenter, distro, version) +``` + +```sql +INSERT INTO servers(datacenter, distro, version, quantity) +VALUES ('Schenectady', 'Arch','2022.08.05',50), + ('Westport', 'Arch','2022.08.05',40), + ('Schenectady','Arch','2021.09.01',30), + ('Westport', 'Arch','2021.09.01',20), + ('Schenectady','Arch','2020.05.01',10), + ('Westport', 'Arch','2020.05.01',5), + ('Schenectady','RHEL','9',60), + ('Westport','RHEL','9',70), + ('Westport','RHEL','7',80), + ('Schenectady','RHEL','7',80) +``` + +```sql +SELECT + * +FROM + servers; +``` +```response +┌─datacenter──┬─distro─┬─version────┬─quantity─┐ +│ Schenectady │ Arch │ 2020.05.01 │ 10 │ +│ Schenectady │ Arch │ 2021.09.01 │ 30 │ +│ Schenectady │ Arch │ 2022.08.05 │ 50 │ +│ Schenectady │ RHEL │ 7 │ 80 │ +│ Schenectady │ RHEL │ 9 │ 60 │ +│ Westport │ Arch │ 2020.05.01 │ 5 │ +│ Westport │ Arch │ 2021.09.01 │ 20 │ +│ Westport │ Arch │ 2022.08.05 │ 40 │ +│ Westport │ RHEL │ 7 │ 80 │ +│ Westport │ RHEL │ 9 │ 70 │ +└─────────────┴────────┴────────────┴──────────┘ + +10 rows in set. Elapsed: 0.409 sec. +``` + +### シンプルなクエリ + +ディストリビューションごとに各データセンターのサーバー数を取得: + +```sql +SELECT + datacenter, + distro, + SUM (quantity) qty +FROM + servers +GROUP BY + datacenter, + distro; +``` +```response +┌─datacenter──┬─distro─┬─qty─┐ +│ Schenectady │ RHEL │ 140 │ +│ Westport │ Arch │ 65 │ +│ Schenectady │ Arch │ 90 │ +│ Westport │ RHEL │ 150 │ +└─────────────┴────────┴─────┘ + +4 rows in set. Elapsed: 0.212 sec. +``` + +```sql +SELECT + datacenter, + SUM (quantity) qty +FROM + servers +GROUP BY + datacenter; +``` +```response +┌─datacenter──┬─qty─┐ +│ Westport │ 215 │ +│ Schenectady │ 230 │ +└─────────────┴─────┘ + +2 rows in set. Elapsed: 0.277 sec. +``` + +```sql +SELECT + distro, + SUM (quantity) qty +FROM + servers +GROUP BY + distro; +``` + +```response +┌─distro─┬─qty─┐ +│ Arch │ 155 │ +│ RHEL │ 290 │ +└────────┴─────┘ + +2 rows in set. Elapsed: 0.352 sec. +``` + +```sql +SELECT + SUM(quantity) qty +FROM + servers; +``` +```response +┌─qty─┐ +│ 445 │ +└─────┘ + +1 row in set. Elapsed: 0.244 sec. +``` + +### 複数の GROUP BY 文と GROUPING SETS の比較 + +CUBE、ROLLUP、または GROUPING SETS を使用せずにデータを分解: + +```sql +SELECT + datacenter, + distro, + SUM (quantity) qty +FROM + servers +GROUP BY + datacenter, + distro +UNION ALL +SELECT + datacenter, + null, + SUM (quantity) qty +FROM + servers +GROUP BY + datacenter +UNION ALL +SELECT + null, + distro, + SUM (quantity) qty +FROM + servers +GROUP BY + distro +UNION ALL +SELECT + null, + null, + SUM(quantity) qty +FROM + servers; +``` +```response +┌─datacenter─┬─distro─┬─qty─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 445 │ +└────────────┴────────┴─────┘ +┌─datacenter──┬─distro─┬─qty─┐ +│ Westport │ ᴺᵁᴸᴸ │ 215 │ +│ Schenectady │ ᴺᵁᴸᴸ │ 230 │ +└─────────────┴────────┴─────┘ +┌─datacenter──┬─distro─┬─qty─┐ +│ Schenectady │ RHEL │ 140 │ +│ Westport │ Arch │ 65 │ +│ Schenectady │ Arch │ 90 │ +│ Westport │ RHEL │ 150 │ +└─────────────┴────────┴─────┘ +┌─datacenter─┬─distro─┬─qty─┐ +│ ᴺᵁᴸᴸ │ Arch │ 155 │ +│ ᴺᵁᴸᴸ │ RHEL │ 290 │ +└────────────┴────────┴─────┘ + +9 rows in set. Elapsed: 0.527 sec. +``` + +GROUPING SETS を使用して同じ情報を取得: +```sql +SELECT + datacenter, + distro, + SUM (quantity) qty +FROM + servers +GROUP BY + GROUPING SETS( + (datacenter,distro), + (datacenter), + (distro), + () + ) +``` +```response +┌─datacenter──┬─distro─┬─qty─┐ +│ Schenectady │ RHEL │ 140 │ +│ Westport │ Arch │ 65 │ +│ Schenectady │ Arch │ 90 │ +│ Westport │ RHEL │ 150 │ +└─────────────┴────────┴─────┘ +┌─datacenter──┬─distro─┬─qty─┐ +│ Westport │ │ 215 │ +│ Schenectady │ │ 230 │ +└─────────────┴────────┴─────┘ +┌─datacenter─┬─distro─┬─qty─┐ +│ │ │ 445 │ +└────────────┴────────┴─────┘ +┌─datacenter─┬─distro─┬─qty─┐ +│ │ Arch │ 155 │ +│ │ RHEL │ 290 │ +└────────────┴────────┴─────┘ + +9 rows in set. Elapsed: 0.427 sec. +``` + +### CUBE と GROUPING SETS の比較 + +次のクエリにおける CUBE `CUBE(datacenter,distro,version)` は、意味をなさない階層を提供しています。2つのディストリビューションにわたってバージョンを見ることは意味をなさないかもしれません(なぜなら Arch と RHEL は同じリリースサイクルやバージョン命名標準を持っていないためです)。次の例で示すように、GROUPING SETS を使用すると、`distro` と `version` を同じセットでグループ化することができ、より適切です。 + +```sql +SELECT + datacenter, + distro, + version, + SUM(quantity) +FROM + servers +GROUP BY + CUBE(datacenter,distro,version) +ORDER BY + datacenter, + distro; +``` +```response +┌─datacenter──┬─distro─┬─version────┬─sum(quantity)─┐ +│ │ │ 7 │ 160 │ +│ │ │ 2020.05.01 │ 15 │ +│ │ │ 2021.09.01 │ 50 │ +│ │ │ 2022.08.05 │ 90 │ +│ │ │ 9 │ 130 │ +│ │ │ │ 445 │ +│ │ Arch │ 2021.09.01 │ 50 │ +│ │ Arch │ 2022.08.05 │ 90 │ +│ │ Arch │ 2020.05.01 │ 15 │ +│ │ Arch │ │ 155 │ +│ │ RHEL │ 9 │ 130 │ +│ │ RHEL │ 7 │ 160 │ +│ │ RHEL │ │ 290 │ +│ Schenectady │ │ 9 │ 60 │ +│ Schenectady │ │ 2021.09.01 │ 30 │ +│ Schenectady │ │ 7 │ 80 │ +│ Schenectady │ │ 2022.08.05 │ 50 │ +│ Schenectady │ │ 2020.05.01 │ 10 │ +│ Schenectady │ │ │ 230 │ +│ Schenectady │ Arch │ 2022.08.05 │ 50 │ +│ Schenectady │ Arch │ 2021.09.01 │ 30 │ +│ Schenectady │ Arch │ 2020.05.01 │ 10 │ +│ Schenectady │ Arch │ │ 90 │ +│ Schenectady │ RHEL │ 7 │ 80 │ +│ Schenectady │ RHEL │ 9 │ 60 │ +│ Schenectady │ RHEL │ │ 140 │ +│ Westport │ │ 9 │ 70 │ +│ Westport │ │ 2020.05.01 │ 5 │ +│ Westport │ │ 2022.08.05 │ 40 │ +│ Westport │ │ 7 │ 80 │ +│ Westport │ │ 2021.09.01 │ 20 │ +│ Westport │ │ │ 215 │ +│ Westport │ Arch │ 2020.05.01 │ 5 │ +│ Westport │ Arch │ 2021.09.01 │ 20 │ +│ Westport │ Arch │ 2022.08.05 │ 40 │ +│ Westport │ Arch │ │ 65 │ +│ Westport │ RHEL │ 9 │ 70 │ +│ Westport │ RHEL │ 7 │ 80 │ +│ Westport │ RHEL │ │ 150 │ +└─────────────┴────────┴────────────┴───────────────┘ + +39 rows in set. Elapsed: 0.355 sec. +``` +:::note + +上記の例のバージョンは、distro に関連していない場合には意味をなさないかもしれませんが、カーネルバージョンを追跡している場合には意味をなすかもしれません。なぜなら、カーネルバージョンはどちらのディストリビューションにも関連付けられる可能性があるからです。次の例のように GROUPING SETS を使用する方が適している場合があります。 + +::: + +```sql +SELECT + datacenter, + distro, + version, + SUM(quantity) +FROM servers +GROUP BY + GROUPING SETS ( + (datacenter, distro, version), + (datacenter, distro)) +``` +```response +┌─datacenter──┬─distro─┬─version────┬─sum(quantity)─┐ +│ Westport │ RHEL │ 9 │ 70 │ +│ Schenectady │ Arch │ 2022.08.05 │ 50 │ +│ Schenectady │ Arch │ 2021.09.01 │ 30 │ +│ Schenectady │ RHEL │ 7 │ 80 │ +│ Westport │ Arch │ 2020.05.01 │ 5 │ +│ Westport │ RHEL │ 7 │ 80 │ +│ Westport │ Arch │ 2021.09.01 │ 20 │ +│ Westport │ Arch │ 2022.08.05 │ 40 │ +│ Schenectady │ RHEL │ 9 │ 60 │ +│ Schenectady │ Arch │ 2020.05.01 │ 10 │ +└─────────────┴────────┴────────────┴───────────────┘ +┌─datacenter──┬─distro─┬─version─┬─sum(quantity)─┐ +│ Schenectady │ RHEL │ │ 140 │ +│ Westport │ Arch │ │ 65 │ +│ Schenectady │ Arch │ │ 90 │ +│ Westport │ RHEL │ │ 150 │ +└─────────────┴────────┴─────────┴───────────────┘ + +14 rows in set. Elapsed: 1.036 sec. +``` diff --git a/docs/ja/sql-reference/aggregate-functions/index.md b/docs/ja/sql-reference/aggregate-functions/index.md new file mode 100644 index 00000000000..c5f146cd8fc --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/index.md @@ -0,0 +1,135 @@ +--- +slug: /ja/sql-reference/aggregate-functions/ +sidebar_label: 集約関数 +sidebar_position: 33 +--- + +# 集約関数 + +集約関数は、データベースの専門家が期待する[通常](http://www.sql-tutorial.com/sql-aggregate-functions-sql-tutorial)の方法で動作します。 + +ClickHouseは以下もサポートしています: + +- カラムに加えて他のパラメータを受け入れる[パラメトリック集約関数](../../sql-reference/aggregate-functions/parametric-functions.md#aggregate_functions_parametric)。 +- 集約関数の動作を変える[コンビネータ](../../sql-reference/aggregate-functions/combinators.md#aggregate_functions_combinators)。 + +## NULL の処理 + +集約中に、すべての `NULL` 引数はスキップされます。集約に複数の引数がある場合、いずれかが `NULL` の行は無視されます。 + +この規則には例外があり、それが[`first_value`](../../sql-reference/aggregate-functions/reference/first_value.md)、[`last_value`](../../sql-reference/aggregate-functions/reference/last_value.md)およびそのエイリアス(それぞれ `any` と `anyLast`)で、修飾子 `RESPECT NULLS` が続く場合です。例として、`FIRST_VALUE(b) RESPECT NULLS` があります。 + +**例:** + +次のテーブルを考えてみましょう: + +``` text +┌─x─┬────y─┐ +│ 1 │ 2 │ +│ 2 │ ᴺᵁᴸᴸ │ +│ 3 │ 2 │ +│ 3 │ 3 │ +│ 3 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +`y` カラムの値を合計する必要があるとしましょう: + +``` sql +SELECT sum(y) FROM t_null_big +``` + +```text +┌─sum(y)─┐ +│ 7 │ +└────────┘ +``` + +次に、`y` カラムから配列を作成するために `groupArray` 関数を使用できます: + +``` sql +SELECT groupArray(y) FROM t_null_big +``` + +``` text +┌─groupArray(y)─┐ +│ [2,2,3] │ +└───────────────┘ +``` + +`groupArray` は結果の配列に `NULL` を含めません。 + +[COALESCE](../../sql-reference/functions/functions-for-nulls.md#coalesce) を使用して `NULL` をユースケースに合った値に変更できます。例として、`avg(COALESCE(column, 0))` を使用すると、カラムの値が集約に使われ、`NULL` の場合はゼロが使われます: + +``` sql +SELECT + avg(y), + avg(coalesce(y, 0)) +FROM t_null_big +``` + +``` text +┌─────────────avg(y)─┬─avg(coalesce(y, 0))─┐ +│ 2.3333333333333335 │ 1.4 │ +└────────────────────┴─────────────────────┘ +``` + +また、`Tuple` を使用して `NULL` スキップ動作を回避することもできます。`NULL` 値のみを含む `Tuple` は `NULL` ではないため、その`NULL` 値のために行がスキップされません。 + +```sql +SELECT + groupArray(y), + groupArray(tuple(y)).1 +FROM t_null_big; + +┌─groupArray(y)─┬─tupleElement(groupArray(tuple(y)), 1)─┐ +│ [2,2,3] │ [2,NULL,2,3,NULL] │ +└───────────────┴───────────────────────────────────────┘ +``` + +列が集約関数の引数として使用される場合、集約はスキップされます。例えば、パラメータなしの `count()` や定数のもの (`count(1)`) はブロック内のすべての行をカウントします(これは `GROUP BY` カラムの値に依存しないため、引数ではない)が、`count(column)` は列が `NULL` でない行の数のみを返します。 + +```sql +SELECT + v, + count(1), + count(v) +FROM +( + SELECT if(number < 10, NULL, number % 3) AS v + FROM numbers(15) +) +GROUP BY v + +┌────v─┬─count()─┬─count(v)─┐ +│ ᴺᵁᴸᴸ │ 10 │ 0 │ +│ 0 │ 1 │ 1 │ +│ 1 │ 2 │ 2 │ +│ 2 │ 2 │ 2 │ +└──────┴─────────┴──────────┘ +``` + +`RESPECT NULLS` を伴う `first_value` の例として、`NULL` 入力が尊重され、`NULL` かどうかにかかわらず最初に読み取られた値が返されることを確認できます: + +```sql +SELECT + col || '_' || ((col + 1) * 5 - 1) as range, + first_value(odd_or_null) as first, + first_value(odd_or_null) IGNORE NULLS as first_ignore_null, + first_value(odd_or_null) RESPECT NULLS as first_respect_nulls +FROM +( + SELECT + intDiv(number, 5) AS col, + if(number % 2 == 0, NULL, number) as odd_or_null + FROM numbers(15) +) +GROUP BY col +ORDER BY col + +┌─range─┬─first─┬─first_ignore_null─┬─first_respect_nulls─┐ +│ 0_4 │ 1 │ 1 │ ᴺᵁᴸᴸ │ +│ 1_9 │ 5 │ 5 │ 5 │ +│ 2_14 │ 11 │ 11 │ ᴺᵁᴸᴸ │ +└───────┴───────┴───────────────────┴─────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/parametric-functions.md b/docs/ja/sql-reference/aggregate-functions/parametric-functions.md new file mode 100644 index 00000000000..504d8c597d7 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/parametric-functions.md @@ -0,0 +1,875 @@ +--- +slug: /ja/sql-reference/aggregate-functions/parametric-functions +sidebar_position: 38 +sidebar_label: Parametric +--- + +# パラメトリック集計関数 + +いくつかの集計関数は、引数カラム(圧縮のために使用)だけでなく、初期化のためのパラメータのセットを受け入れることができます。構文は、1組ではなく2組の括弧を使用します。1つはパラメータ用で、もう1つは引数用です。 + +## histogram + +順応型ヒストグラムを計算します。正確な結果は保証されません。 + +``` sql +histogram(number_of_bins)(values) +``` + +この関数は、[A Streaming Parallel Decision Tree Algorithm](http://jmlr.org/papers/volume11/ben-haim10a/ben-haim10a.pdf)を使用します。ヒストグラムのビンの境界は新しいデータが関数に入ると調整されます。一般的な場合、ビンの幅は等しくありません。 + +**引数** + +`values` — 入力値を結果する[式](../../sql-reference/syntax.md#syntax-expressions)。 + +**パラメータ** + +`number_of_bins` — ヒストグラム内のビンの数の上限。関数は自動的にビンの数を計算します。指定されたビンの数に達しようとしますが、失敗した場合は少ないビンを使用します。 + +**返される値** + +- 次の形式の[タプル](../../sql-reference/data-types/tuple.md)の[配列](../../sql-reference/data-types/array.md): + + ``` + [(lower_1, upper_1, height_1), ... (lower_N, upper_N, height_N)] + ``` + + - `lower` — ビンの下限。 + - `upper` — ビンの上限。 + - `height` — ビンの計算された高さ。 + +**例** + +``` sql +SELECT histogram(5)(number + 1) +FROM ( + SELECT * + FROM system.numbers + LIMIT 20 +) +``` + +``` text +┌─histogram(5)(plus(number, 1))───────────────────────────────────────────┐ +│ [(1,4.5,4),(4.5,8.5,4),(8.5,12.75,4.125),(12.75,17,4.625),(17,20,3.25)] │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +[bar](../../sql-reference/functions/other-functions.md#function-bar)関数を使用してヒストグラムを視覚化することができます。例えば: + +``` sql +WITH histogram(5)(rand() % 100) AS hist +SELECT + arrayJoin(hist).3 AS height, + bar(height, 0, 6, 5) AS bar +FROM +( + SELECT * + FROM system.numbers + LIMIT 20 +) +``` + +``` text +┌─height─┬─bar───┐ +│ 2.125 │ █▋ │ +│ 3.25 │ ██▌ │ +│ 5.625 │ ████▏ │ +│ 5.625 │ ████▏ │ +│ 3.375 │ ██▌ │ +└────────┴───────┘ +``` + +この場合、ヒストグラムビンの境界を知らないことを覚えておく必要があります。 + +## sequenceMatch + +シーケンスにパターンに一致するイベントチェーンが含まれているかどうかをチェックします。 + +**構文** + +``` sql +sequenceMatch(pattern)(timestamp, cond1, cond2, ...) +``` + +:::note +同じ秒に発生するイベントは、結果に影響を与える不明な順序でシーケンス内に存在する可能性があります。 +::: + +**引数** + +- `timestamp` — 時間データを含んでいると見なされるカラム。一般的なデータ型は`Date`と`DateTime`です。また、サポートされている[UInt](../../sql-reference/data-types/int-uint.md)データ型のいずれかを使用することもできます。 + +- `cond1`, `cond2` — イベントチェーンを記述する条件。データ型:`UInt8`。最大32の条件引数を渡すことができます。関数は、これらの条件で説明されているイベントのみ考慮します。シーケンスに条件で説明されていないデータが含まれている場合、関数はそれらをスキップします。 + +**パラメータ** + +- `pattern` — パターン文字列。[パターン構文](#pattern-syntax)を参照してください。 + +**返される値** + +- パターンが一致する場合は1。 +- パターンが一致しない場合は0。 + +型:`UInt8`。 + +#### パターン構文 + +- `(?N)` — 位置`N`の条件引数に一致します。条件は`[1, 32]`の範囲で番号が付けられています。たとえば、`(?1)`は`cond1`パラメータに渡された引数に一致します。 + +- `.*` — 任意の数のイベントに一致します。このパターン要素に一致するために条件引数を必要としません。 + +- `(?t operator value)` — 2つのイベントを隔てる秒数を設定します。たとえば、パターン`(?1)(?t>1800)(?2)`は1800秒以上離れて発生するイベントに一致します。これらのイベントの間に任意の数のイベントが存在することができます。`>=`, `>`, `<`, `<=`, `==`演算子を使用できます。 + +**例** + +`t`テーブル内のデータを考えます: + +``` text +┌─time─┬─number─┐ +│ 1 │ 1 │ +│ 2 │ 3 │ +│ 3 │ 2 │ +└──────┴────────┘ +``` + +クエリを実行します: + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2))─┐ +│ 1 │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +関数は、2番目のイベントが1に続くイベントチェーンを発見しました。その間の3番はイベントとして記述されていないため、スキップされました。例で示されたイベントチェーンを検索するときにこの番号を考慮に入れたい場合は、そのための条件を設定する必要があります。 + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 3) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2), equals(number, 3))─┐ +│ 0 │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +この場合、関数はパターンに一致するイベントチェーンを見つけられませんでした。なぜなら、3のイベントが1と2の間に発生したからです。同じ場合に4の番号が条件としてチェックされた場合、シーケンスはパターンに一致します。 + +``` sql +SELECT sequenceMatch('(?1)(?2)')(time, number = 1, number = 2, number = 4) FROM t +``` + +``` text +┌─sequenceMatch('(?1)(?2)')(time, equals(number, 1), equals(number, 2), equals(number, 4))─┐ +│ 1 │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**参照** + +- [sequenceCount](#sequencecount) + +## sequenceCount + +パターンに一致したイベントチェーンの数をカウントします。関数は重ならないイベントチェーンを検索します。現在のチェーンが一致した後に次のチェーンの検索を開始します。 + +:::note +同じ秒に発生するイベントは、結果に影響を与える不明な順序でシーケンス内に存在する可能性があります。 +::: + +**構文** + +``` sql +sequenceCount(pattern)(timestamp, cond1, cond2, ...) +``` + +**引数** + +- `timestamp` — 時間データを含んでいると見なされるカラム。一般的なデータ型は`Date`と`DateTime`です。また、サポートされている[UInt](../../sql-reference/data-types/int-uint.md)データ型のいずれかを使用することもできます。 + +- `cond1`, `cond2` — イベントチェーンを記述する条件。データ型:`UInt8`。最大32の条件引数を渡すことができます。関数は、これらの条件で説明されているイベントのみ考慮します。シーケンスに条件で説明されていないデータが含まれている場合、関数はそれらをスキップします。 + +**パラメータ** + +- `pattern` — パターン文字列。[パターン構文](#pattern-syntax)を参照してください。 + +**返される値** + +- 一致した重ならないイベントチェーンの数。 + +型:`UInt64` + +**例** + +`t`テーブル内のデータを考えます: + +``` text +┌─time─┬─number─┐ +│ 1 │ 1 │ +│ 2 │ 3 │ +│ 3 │ 2 │ +│ 4 │ 1 │ +│ 5 │ 3 │ +│ 6 │ 2 │ +└──────┴────────┘ +``` + +任意の他の番号がそれらの間に存在しても、番号1の後に番号2が何回発生するかを数えます: + +``` sql +SELECT sequenceCount('(?1).*(?2)')(time, number = 1, number = 2) FROM t +``` + +``` text +┌─sequenceCount('(?1).*(?2)')(time, equals(number, 1), equals(number, 2))─┐ +│ 2 │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +**参照** + +- [sequenceMatch](#sequencematch) + +## windowFunnel + +スライディングタイムウィンドウでイベントチェーンを検索し、チェーンから発生したイベントの最大数を計算します。 + +関数は次のアルゴリズムに従って動作します: + +- 関数はチェーンの最初の条件をトリガーするデータを検索し、イベントカウンターを1に設定します。これはスライディングウィンドウが始まる瞬間です。 + +- ウィンドウ内でチェーンのイベントが順次発生する場合、カウンターはインクリメントされます。イベントのシーケンスが中断された場合、カウンターはインクリメントされません。 + +- データに異なる完了点を持つ複数のイベントチェーンが存在する場合、関数は最長のチェーンのサイズのみ出力します。 + +**構文** + +``` sql +windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN) +``` + +**引数** + +- `timestamp` — タイムスタンプを含むカラムの名前。サポートされているデータ型:[Date](../../sql-reference/data-types/date.md)、[DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime)およびその他の符号なし整数型(タイムスタンプは`UInt64`型をサポートしていますが、その値はInt64の最大値(2^63 - 1)を超えない必要があります) +- `cond` — イベントチェーンを記述する条件またはデータ。[UInt8](../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `window` — スライディングウィンドウの長さ、これは最初と最後の条件の間の時間間隔です。`window`の単位は`timestamp`自体に依存し、異なります。式`timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window`を使用して決定されます。 +- `mode` — これはオプションの引数です。1つ以上のモードを設定できます。 + - `'strict_deduplication'` — イベントのシーケンスで同じ条件が成立している場合、そのような繰り返しイベントはさらに処理を中断します。注:複数の条件が同じイベントに対して成立した場合、予期しない動作が発生する可能性があります。 + - `'strict_order'` — 他のイベントの介入を許可しません。例:`A->B->D->C`の場合、`A->B->C`を見つけるのを`D`で止め、最大イベントレベルは2です。 + - `'strict_increase'` — 厳密に増加するタイムスタンプのイベントにのみ条件を適用します。 + - `'strict_once'` — 条件に複数回一致しても、チェーン内で各イベントを一度だけカウントします。 + +**返される値** + +スライディングタイムウィンドウ内のチェーンから連続してトリガーされた最大条件数。 +選択内のすべてのチェーンが分析されます。 + +型:`Integer` + +**例** + +オンラインストアでユーザーが電話を2回選択して購入するのに十分な期間があるかどうかを判断します。 + +次のイベントチェーンを設定します: + +1. ユーザーがストアのアカウントにログインしました(`eventID = 1003`)。 +2. ユーザーが電話を検索しました(`eventID = 1007, product = 'phone'`)。 +3. ユーザーが注文をしました(`eventID = 1009`)。 +4. ユーザーが再度注文をしました(`eventID = 1010`)。 + +入力テーブル: + +``` text +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-28 │ 1 │ 2019-01-29 10:00:00 │ 1003 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-31 │ 1 │ 2019-01-31 09:00:00 │ 1007 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-01-30 │ 1 │ 2019-01-30 08:00:00 │ 1009 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +┌─event_date─┬─user_id─┬───────────timestamp─┬─eventID─┬─product─┐ +│ 2019-02-01 │ 1 │ 2019-02-01 08:00:00 │ 1010 │ phone │ +└────────────┴─────────┴─────────────────────┴─────────┴─────────┘ +``` + +2019年1月〜2月の期間に、ユーザー`user_id`がどこまでチェーンを進むことができたかを調べます。 + +クエリ: + +``` sql +SELECT + level, + count() AS c +FROM +( + SELECT + user_id, + windowFunnel(6048000000000000)(timestamp, eventID = 1003, eventID = 1009, eventID = 1007, eventID = 1010) AS level + FROM trend + WHERE (event_date >= '2019-01-01') AND (event_date <= '2019-02-02') + GROUP BY user_id +) +GROUP BY level +ORDER BY level ASC; +``` + +結果: + +``` text +┌─level─┬─c─┐ +│ 4 │ 1 │ +└───────┴───┘ +``` + +## retention + +この関数は、イベントに対して特定の条件が満たされたかどうかを示す`UInt8`型の1から32の引数からなる条件のセットを引数として受け取ります。 +どんな条件でも引数として指定できます([WHERE](../../sql-reference/statements/select/where.md#select-where)のように)。 + +最初の条件を除いて、条件はペアで適用されます:2番目の結果が真になるのは、最初と2番目がともに真の場合、3番目の場合は最初と3番目がともに真の場合などです。 + +**構文** + +``` sql +retention(cond1, cond2, ..., cond32); +``` + +**引数** + +- `cond` — `UInt8`の結果(1または0)を返す式。 + +**返される値** + +1または0の配列。 + +- 1 — イベントに対して条件が満たされた。 +- 0 — イベントに対して条件が満たされなかった。 + +型:`UInt8`。 + +**例** + +サイトトラフィックを判断するための`retention`関数の計算例を考えてみましょう。 + +**1.** 例を示すためにテーブルを作成します。 + +``` sql +CREATE TABLE retention_test(date Date, uid Int32) ENGINE = Memory; + +INSERT INTO retention_test SELECT '2020-01-01', number FROM numbers(5); +INSERT INTO retention_test SELECT '2020-01-02', number FROM numbers(10); +INSERT INTO retention_test SELECT '2020-01-03', number FROM numbers(15); +``` + +入力テーブル: + +クエリ: + +``` sql +SELECT * FROM retention_test +``` + +結果: + +``` text +┌───────date─┬─uid─┐ +│ 2020-01-01 │ 0 │ +│ 2020-01-01 │ 1 │ +│ 2020-01-01 │ 2 │ +│ 2020-01-01 │ 3 │ +│ 2020-01-01 │ 4 │ +└────────────┴─────┘ +┌───────date─┬─uid─┐ +│ 2020-01-02 │ 0 │ +│ 2020-01-02 │ 1 │ +│ 2020-01-02 │ 2 │ +│ 2020-01-02 │ 3 │ +│ 2020-01-02 │ 4 │ +│ 2020-01-02 │ 5 │ +│ 2020-01-02 │ 6 │ +│ 2020-01-02 │ 7 │ +│ 2020-01-02 │ 8 │ +│ 2020-01-02 │ 9 │ +└────────────┴─────┘ +┌───────date─┬─uid─┐ +│ 2020-01-03 │ 0 │ +│ 2020-01-03 │ 1 │ +│ 2020-01-03 │ 2 │ +│ 2020-01-03 │ 3 │ +│ 2020-01-03 │ 4 │ +│ 2020-01-03 │ 5 │ +│ 2020-01-03 │ 6 │ +│ 2020-01-03 │ 7 │ +│ 2020-01-03 │ 8 │ +│ 2020-01-03 │ 9 │ +│ 2020-01-03 │ 10 │ +│ 2020-01-03 │ 11 │ +│ 2020-01-03 │ 12 │ +│ 2020-01-03 │ 13 │ +│ 2020-01-03 │ 14 │ +└────────────┴─────┘ +``` + +**2.** `retention`関数を使用して`uid`をユニークなユーザーIDでグループ化します。 + +クエリ: + +``` sql +SELECT + uid, + retention(date = '2020-01-01', date = '2020-01-02', date = '2020-01-03') AS r +FROM retention_test +WHERE date IN ('2020-01-01', '2020-01-02', '2020-01-03') +GROUP BY uid +ORDER BY uid ASC +``` + +結果: + +``` text +┌─uid─┬─r───────┐ +│ 0 │ [1,1,1] │ +│ 1 │ [1,1,1] │ +│ 2 │ [1,1,1] │ +│ 3 │ [1,1,1] │ +│ 4 │ [1,1,1] │ +│ 5 │ [0,0,0] │ +│ 6 │ [0,0,0] │ +│ 7 │ [0,0,0] │ +│ 8 │ [0,0,0] │ +│ 9 │ [0,0,0] │ +│ 10 │ [0,0,0] │ +│ 11 │ [0,0,0] │ +│ 12 │ [0,0,0] │ +│ 13 │ [0,0,0] │ +│ 14 │ [0,0,0] │ +└─────┴─────────┘ +``` + +**3.** 日ごとのサイト訪問数の合計を計算します。 + +クエリ: + +``` sql +SELECT + sum(r[1]) AS r1, + sum(r[2]) AS r2, + sum(r[3]) AS r3 +FROM +( + SELECT + uid, + retention(date = '2020-01-01', date = '2020-01-02', date = '2020-01-03') AS r + FROM retention_test + WHERE date IN ('2020-01-01', '2020-01-02', '2020-01-03') + GROUP BY uid +) +``` + +結果: + +``` text +┌─r1─┬─r2─┬─r3─┐ +│ 5 │ 5 │ 5 │ +└────┴────┴────┘ +``` + +それぞれ: + +- `r1` - 2020-01-01にサイトを訪れたユニークビジターの数(`cond1`条件)。 +- `r2` - 特定の期間2020-01-01から2020-01-02の間にサイトを訪れたユニークビジターの数(`cond1`および`cond2`条件)。 +- `r3` - 特定の期間2020-01-01と2020-01-03にサイトを訪れたユニークビジターの数(`cond1`および`cond3`条件)。 + +## uniqUpTo(N)(x) + +引数の異なる値の数を指定された制限`N`まで計算します。引数の異なる値の数が`N`を超える場合、この関数は`N`+1を返し、それ以外の場合は正確な値を計算します。 + +小さい`N`(最大10まで)での使用を推奨します。`N`の最大値は100です。 + +集計関数の状態のため、この関数は1 + `N` \* バイトの値の一つのサイズのメモリを使用します。 +文字列を扱う場合、この関数は8バイトの非暗号化ハッシュを保存します。文字列の計算は近似的になります。 + +たとえば、あなたのウェブサイトでユーザーによって行われたすべての検索クエリを記録するテーブルがあったとします。テーブルの各行は単一の検索クエリを表し、ユーザーID、検索クエリ、クエリのタイムスタンプのカラムがあります。このデータを使用して、少なくとも5人のユニークユーザーが使用したキーワードのみを表示するレポートを生成するために`uniqUpTo`を使用できます。 + +```sql +SELECT SearchPhrase +FROM SearchLog +GROUP BY SearchPhrase +HAVING uniqUpTo(4)(UserID) >= 5 +``` + +`uniqUpTo(4)(UserID)`は各`SearchPhrase`に対するユニークな`UserID`値の数を計算しますが、最大4つのユニークな値だけを数えます。もしある`SearchPhrase`に対するユニークな`UserID`値が4を超える場合、この関数は5(4 + 1)を返します。その後、`HAVING`句はユニークな`UserID`値が5未満の`SearchPhrase`値をフィルタリングします。これにより、少なくとも5人のユニークユーザーが使用した検索キーワードのリストを取得することができます。 + +## sumMapFiltered + +この関数は、[sumMap](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap)と同じ動作をしますが、フィルタリングに使用するキーの配列をパラメータとして受け取ることができます。これは、高いキーのカーディナリティを扱う際に特に役立ちます。 + +**構文** + +`sumMapFiltered(keys_to_keep)(keys, values)` + +**パラメータ** + +- `keys_to_keep`: フィルタするための[配列](../data-types/array.md)。 +- `keys`: [配列](../data-types/array.md)。 +- `values`: [配列](../data-types/array.md)。 + +**返される値** + +- ソートされた順序のキーと、対応するキーに対して合計された値を持つ2つの配列のタプルを返します。 + +**例** + +クエリ: + +```sql +CREATE TABLE sum_map +( + `date` Date, + `timeslot` DateTime, + `statusMap` Nested(status UInt16, requests UInt64) +) +ENGINE = Log + +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10]); +``` + +```sql +SELECT sumMapFiltered([1, 4, 8])(statusMap.status, statusMap.requests) FROM sum_map; +``` + +結果: + +```response + ┌─sumMapFiltered([1, 4, 8])(statusMap.status, statusMap.requests)─┐ +1. │ ([1,4,8],[10,20,10]) │ + └─────────────────────────────────────────────────────────────────┘ +``` + +## sumMapFilteredWithOverflow + +この関数は、[sumMap](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap)と同じ動作をしますが、フィルタリングに使用するキーの配列をパラメータとして受け取ることができます。これは、高いキーのカーディナリティを扱う際に特に役立ちます。[sumMapFiltered](#summapfiltered)関数とは異なり、オーバーフローを含む加算を行います - つまり、加算の結果のデータ型として引数のデータ型を返します。 + +**構文** + +`sumMapFilteredWithOverflow(keys_to_keep)(keys, values)` + +**パラメータ** + +- `keys_to_keep`: フィルタするための[配列](../data-types/array.md)。 +- `keys`: [配列](../data-types/array.md)。 +- `values`: [配列](../data-types/array.md)。 + +**返される値** + +- ソートされた順序のキーと、対応するキーに対して合計された値を持つ2つの配列のタプルを返します。 + +**例** + +この例では、テーブル`sum_map`を作成し、データを挿入してから`sumMapFilteredWithOverflow`と`sumMapFiltered`を`toTypeName`関数と共に比較に使用します。作成したテーブルで`requests`は`UInt8`型であった場合、`sumMapFiltered`はオーバーフローを避けるために合計された値の型を`UInt64`に昇格させたのに対し、`sumMapFilteredWithOverflow`は型を引き続き`UInt8`としており、これは結果を格納するには十分ではありません - つまり、オーバーフローが発生しています。 + +クエリ: + +```sql +CREATE TABLE sum_map +( + `date` Date, + `timeslot` DateTime, + `statusMap` Nested(status UInt8, requests UInt8) +) +ENGINE = Log + +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10]), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10]); +``` + +```sql +SELECT sumMapFilteredWithOverflow([1, 4, 8])(statusMap.status, statusMap.requests) as summap_overflow, toTypeName(summap_overflow) FROM sum_map; +``` + +```sql +SELECT sumMapFiltered([1, 4, 8])(statusMap.status, statusMap.requests) as summap, toTypeName(summap) FROM sum_map; +``` + +結果: + +```response + ┌─sum──────────────────┬─toTypeName(sum)───────────────────┐ +1. │ ([1,4,8],[10,20,10]) │ Tuple(Array(UInt8), Array(UInt8)) │ + └──────────────────────┴───────────────────────────────────┘ +``` + +```response + ┌─summap───────────────┬─toTypeName(summap)─────────────────┐ +1. │ ([1,4,8],[10,20,10]) │ Tuple(Array(UInt8), Array(UInt64)) │ + └──────────────────────┴────────────────────────────────────┘ +``` + +## sequenceNextNode + +一致したイベントチェーンの次のイベントの値を返します。 + +_エクスペリメンタルな関数、`SET allow_experimental_funnel_functions = 1`で有効にします。_ + +**構文** + +``` sql +sequenceNextNode(direction, base)(timestamp, event_column, base_condition, event1, event2, event3, ...) +``` + +**パラメータ** + +- `direction` — 移動の方向を指定します。 + - forward — 前進。 + - backward — 後退。 + +- `base` — 基準点を設定するために使用します。 + - head — 基準点を最初のイベントに設定します。 + - tail — 基準点を最後のイベントに設定します。 + - first_match — 基準点を最初に一致した`event1`に設定します。 + - last_match — 基準点を最後の一致した`event1`に設定します。 + +**引数** + +- `timestamp` — タイムスタンプを含むカラムの名前。サポートされているデータ型:[Date](../../sql-reference/data-types/date.md)、[DateTime](../../sql-reference/data-types/datetime.md#data_type-datetime) およびその他の符号なし整数型。 +- `event_column` — 次に返されるイベントの値を含むカラムの名前。サポートされているデータ型:[String](../../sql-reference/data-types/string.md) と [Nullable(String)](../../sql-reference/data-types/nullable.md)。 +- `base_condition` — 基準点が満たすべき条件。 +- `event1`, `event2`, ... — イベントチェーンを記述する条件。[UInt8](../../sql-reference/data-types/int-uint.md)。 + +**返される値** + +- `event_column[next_index]` — パターンが一致し、次の値が存在する場合。 +- `NULL` - パターンが一致しないか次の値が存在しない場合。 + +型:[Nullable(String)](../../sql-reference/data-types/nullable.md)。 + +**例** + +イベントがA->B->C->D->Eである場合、B->Cに続くイベントDを知りたいときに使用できます。 + +A->Bの後のイベントを検索するクエリステートメント: + +``` sql +CREATE TABLE test_flow ( + dt DateTime, + id int, + page String) +ENGINE = MergeTree() +PARTITION BY toYYYYMMDD(dt) +ORDER BY id; + +INSERT INTO test_flow VALUES (1, 1, 'A') (2, 1, 'B') (3, 1, 'C') (4, 1, 'D') (5, 1, 'E'); + +SELECT id, sequenceNextNode('forward', 'head')(dt, page, page = 'A', page = 'A', page = 'B') as next_flow FROM test_flow GROUP BY id; +``` + +結果: + +``` text +┌─id─┬─next_flow─┐ +│ 1 │ C │ +└────┴───────────┘ +``` + +**`forward`と`head`の動作** + +``` sql +ALTER TABLE test_flow DELETE WHERE 1 = 1 settings mutations_sync = 1; + +INSERT INTO test_flow VALUES (1, 1, 'Home') (2, 1, 'Gift') (3, 1, 'Exit'); +INSERT INTO test_flow VALUES (1, 2, 'Home') (2, 2, 'Home') (3, 2, 'Gift') (4, 2, 'Basket'); +INSERT INTO test_flow VALUES (1, 3, 'Gift') (2, 3, 'Home') (3, 3, 'Gift') (4, 3, 'Basket'); +``` + +``` sql +SELECT id, sequenceNextNode('forward', 'head')(dt, page, page = 'Home', page = 'Home', page = 'Gift') FROM test_flow GROUP BY id; + + dt id page + 1970-01-01 09:00:01 1 Home // 基準点、一致したHome + 1970-01-01 09:00:02 1 Gift // Giftと一致 + 1970-01-01 09:00:03 1 Exit // 結果 + + 1970-01-01 09:00:01 2 Home // 基準点、一致したHome + 1970-01-01 09:00:02 2 Home // Giftと一致しない + 1970-01-01 09:00:03 2 Gift + 1970-01-01 09:00:04 2 Basket + + 1970-01-01 09:00:01 3 Gift // 基準点、Homeと一致しない + 1970-01-01 09:00:02 3 Home + 1970-01-01 09:00:03 3 Gift + 1970-01-01 09:00:04 3 Basket +``` + +**`backward`と`tail`の動作** + +``` sql +SELECT id, sequenceNextNode('backward', 'tail')(dt, page, page = 'Basket', page = 'Basket', page = 'Gift') FROM test_flow GROUP BY id; + + dt id page +1970-01-01 09:00:01 1 Home +1970-01-01 09:00:02 1 Gift +1970-01-01 09:00:03 1 Exit // 基準点、Basketと一致しない + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home // 結果 +1970-01-01 09:00:03 2 Gift // Giftと一致 +1970-01-01 09:00:04 2 Basket // 基準点、Basketと一致 + +1970-01-01 09:00:01 3 Gift +1970-01-01 09:00:02 3 Home // 結果 +1970-01-01 09:00:03 3 Gift // 基準点、Giftと一致 +1970-01-01 09:00:04 3 Basket // 基準点、Basketと一致 +``` + +**`forward`と`first_match`の動作** + +``` sql +SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', page = 'Gift') FROM test_flow GROUP BY id; + + dt id page +1970-01-01 09:00:01 1 Home +1970-01-01 09:00:02 1 Gift // 基準点 +1970-01-01 09:00:03 1 Exit // 結果 + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home +1970-01-01 09:00:03 2 Gift // 基準点 +1970-01-01 09:00:04 2 Basket // 結果 + +1970-01-01 09:00:01 3 Gift // 基準点 +1970-01-01 09:00:02 3 Home // 結果 +1970-01-01 09:00:03 3 Gift +1970-01-01 09:00:04 3 Basket +``` + +``` sql +SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, page = 'Gift', page = 'Gift', page = 'Home') FROM test_flow GROUP BY id; + + dt id page +1970-01-01 09:00:01 1 Home +1970-01-01 09:00:02 1 Gift // 基準点 +1970-01-01 09:00:03 1 Exit // Homeと一致しない + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home +1970-01-01 09:00:03 2 Gift // 基準点 +1970-01-01 09:00:04 2 Basket // Homeと一致しない + +1970-01-01 09:00:01 3 Gift // 基準点 +1970-01-01 09:00:02 3 Home // Homeと一致 +1970-01-01 09:00:03 3 Gift // 結果 +1970-01-01 09:00:04 3 Basket +``` + +**`backward`と`last_match`の動作** + +``` sql +SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', page = 'Gift') FROM test_flow GROUP BY id; + + dt id page +1970-01-01 09:00:01 1 Home // 結果 +1970-01-01 09:00:02 1 Gift // 基準点 +1970-01-01 09:00:03 1 Exit + +1970-01-01 09:00:01 2 Home +1970-01-01 09:00:02 2 Home // 結果 +1970-01-01 09:00:03 2 Gift // 基準点 +1970-01-01 09:00:04 2 Basket + +1970-01-01 09:00:01 3 Gift +1970-01-01 09:00:02 3 Home // 結果 +1970-01-01 09:00:03 3 Gift // 基準点 +1970-01-01 09:00:04 3 Basket +``` + +``` sql +SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, page = 'Gift', page = 'Gift', page = 'Home') FROM test_flow GROUP BY id; + + dt id page +1970-01-01 09:00:01 1 Home // Homeと一致、結果はnull +1970-01-01 09:00:02 1 Gift // 基準点 +1970-01-01 09:00:03 1 Exit + +1970-01-01 09:00:01 2 Home // 結果 +1970-01-01 09:00:02 2 Home // Homeと一致 +1970-01-01 09:00:03 2 Gift // 基準点 +1970-01-01 09:00:04 2 Basket + +1970-01-01 09:00:01 3 Gift // 結果 +1970-01-01 09:00:02 3 Home // Homeと一致 +1970-01-01 09:00:03 3 Gift // 基準点 +1970-01-01 09:00:04 3 Basket +``` + +**`base_condition`の動作** + +``` sql +CREATE TABLE test_flow_basecond +( + `dt` DateTime, + `id` int, + `page` String, + `ref` String +) +ENGINE = MergeTree +PARTITION BY toYYYYMMDD(dt) +ORDER BY id; + +INSERT INTO test_flow_basecond VALUES (1, 1, 'A', 'ref4') (2, 1, 'A', 'ref3') (3, 1, 'B', 'ref2') (4, 1, 'B', 'ref1'); +``` + +``` sql +SELECT id, sequenceNextNode('forward', 'head')(dt, page, ref = 'ref1', page = 'A') FROM test_flow_basecond GROUP BY id; + + dt id page ref + 1970-01-01 09:00:01 1 A ref4 // 基準点をヘッドにすることはできません。refカラムが'ref1'と一致しないため。 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:04 1 B ref1 + ``` + +``` sql +SELECT id, sequenceNextNode('backward', 'tail')(dt, page, ref = 'ref4', page = 'B') FROM test_flow_basecond GROUP BY id; + + dt id page ref + 1970-01-01 09:00:01 1 A ref4 + 1970-01-01 09:00:02 1 A ref3 + 1970-01-01 09:00:03 1 B ref2 + 1970-01-01 09:00:04 1 B ref1 // テールを基準点にすることはできません。refカラムが'ref4'と一致しないため。 +``` + +``` sql +SELECT id, sequenceNextNode('forward', 'first_match')(dt, page, ref = 'ref3', page = 'A') FROM test_flow_basecond GROUP BY id; + + dt id page ref + 1970-01-01 09:00:01 1 A ref4 // この行は基準点にはなりません。refカラムが'ref3'と一致しないため。 + 1970-01-01 09:00:02 1 A ref3 // 基準点 + 1970-01-01 09:00:03 1 B ref2 // 結果 + 1970-01-01 09:00:04 1 B ref1 +``` + +``` sql +SELECT id, sequenceNextNode('backward', 'last_match')(dt, page, ref = 'ref2', page = 'B') FROM test_flow_basecond GROUP BY id; + + dt id page ref + 1970-01-01 09:00:01 1 A ref4 + 1970-01-01 09:00:02 1 A ref3 // 結果 + 1970-01-01 09:00:03 1 B ref2 // 基準点 + 1970-01-01 09:00:04 1 B ref1 // この行は基準点にはなりません。refカラムが'ref2'と一致しないため。 +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/aggthrow.md b/docs/ja/sql-reference/aggregate-functions/reference/aggthrow.md new file mode 100644 index 00000000000..0a6501c6a66 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/aggthrow.md @@ -0,0 +1,37 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/aggthrow +sidebar_position: 101 +--- + +# aggThrow + +この関数は例外の安全性をテストするために使用できます。指定された確率で生成時に例外をスローします。 + +**構文** + +```sql +aggThrow(throw_prob) +``` + +**引数** + +- `throw_prob` — 生成時にスローする確率。[Float64](../../data-types/float.md)。 + +**戻り値** + +- 例外: `Code: 503. DB::Exception: Aggregate function aggThrow has thrown exception successfully`. + +**例** + +クエリ: + +```sql +SELECT number % 2 AS even, aggThrow(number) FROM numbers(10) GROUP BY even; +``` + +結果: + +```response +例外を受信: +Code: 503. DB::Exception: Aggregate function aggThrow has thrown exception successfully: While executing AggregatingTransform. (AGGREGATE_FUNCTION_THROW) +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/analysis_of_variance.md b/docs/ja/sql-reference/aggregate-functions/reference/analysis_of_variance.md new file mode 100644 index 00000000000..6f4b1abf6f5 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/analysis_of_variance.md @@ -0,0 +1,45 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/analysis_of_variance +sidebar_position: 101 +--- + +# analysisOfVariance + +一元配置分散分析(ANOVAテスト)を行うための統計的テストを提供します。これは、複数の正規分布に従う観測値のグループに対して、全てのグループが同じ平均を持つかどうかを調べるテストです。 + +**構文** + +```sql +analysisOfVariance(val, group_no) +``` + +エイリアス: `anova` + +**パラメータ** +- `val`: 値。 +- `group_no`: `val`が属するグループ番号。 + +:::note +グループは0から列挙され、テストを実行するには少なくとも2つのグループが必要です。 +観測値の数が1つ以上のグループが少なくとも1つ存在する必要があります。 +::: + +**返される値** + +- `(f_statistic, p_value)`。[タプル](../../data-types/tuple.md)([Float64](../../data-types/float.md), [Float64](../../data-types/float.md))。 + +**例** + +クエリ: + +```sql +SELECT analysisOfVariance(number, number % 2) FROM numbers(1048575); +``` + +結果: + +```response +┌─analysisOfVariance(number, modulo(number, 2))─┐ +│ (0,1) │ +└───────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/any.md b/docs/ja/sql-reference/aggregate-functions/reference/any.md new file mode 100644 index 00000000000..2b28946b301 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/any.md @@ -0,0 +1,58 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/any +sidebar_position: 102 +--- + +# any + +`NULL` 値を無視し、カラムの最初に出現する値を選択します。 + +**構文** + +```sql +any(column) [RESPECT NULLS] +``` + +別名: `any_value`, [`first_value`](../reference/first_value.md)。 + +**パラメータ** +- `column`: カラム名。 + +**戻り値** + +:::note +この関数名の後に `RESPECT NULLS` 修飾子を使用することができます。この修飾子を使用すると、関数は `NULL` かどうかに関係なく、渡された最初の値を選択します。 +::: + +:::note +関数の戻り値の型は、入力と同じですが、LowCardinality は無視されます。つまり、入力として行がない場合、その型のデフォルト値(整数の場合は0、Nullable() カラムの場合は Null)を返します。この動作を変更するためには `-OrNull` [コンビネータ](../../../sql-reference/aggregate-functions/combinators.md) を使用することができます。 +::: + +:::warning +クエリは任意の順序で、さらには毎回異なる順序で実行される可能性があるため、この関数の結果は不確定です。 +確定的な結果を得るには、`any` の代わりに [`min`](../reference/min.md) または [`max`](../reference/max.md) 関数を使用することをお勧めします。 +::: + +**実装の詳細** + +いくつかのケースでは、実行順序に依存することができます。これは、`ORDER BY` を使用したサブクエリから `SELECT` が来る場合に適用されます。 + +`SELECT` クエリが `GROUP BY` 句または少なくとも1つの集約関数を持つ場合、ClickHouse は(MySQL とは対照的に) `SELECT`、`HAVING`、および `ORDER BY` 句のすべての式がキーまたは集約関数から計算されることを要求します。言い換えると、テーブルから選択された各カラムは、キーまたは集約関数内で使用されなければなりません。MySQL のような動作を得るには、他のカラムを `any` 集約関数に入れることができます。 + +**例** + +クエリ: + +```sql +CREATE TABLE any_nulls (city Nullable(String)) ENGINE=Log; + +INSERT INTO any_nulls (city) VALUES (NULL), ('Amsterdam'), ('New York'), ('Tokyo'), ('Valencia'), (NULL); + +SELECT any(city) FROM any_nulls; +``` + +```response +┌─any(city)─┐ +│ Amsterdam │ +└───────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/anyheavy.md b/docs/ja/sql-reference/aggregate-functions/reference/anyheavy.md new file mode 100644 index 00000000000..3ef582ed0b6 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/anyheavy.md @@ -0,0 +1,31 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/anyheavy +sidebar_position: 104 +--- + +# anyHeavy + +[heavy hitters](https://doi.org/10.1145/762471.762473) アルゴリズムを使用して頻繁に出現する値を選択します。クエリの各実行スレッドで半分以上のケースで発生する値がある場合、その値が返されます。通常、結果は非決定的です。 + +``` sql +anyHeavy(column) +``` + +**引数** + +- `column` – カラム名。 + +**例** + +[OnTime](../../../getting-started/example-datasets/ontime.md) データセットを使用して、`AirlineID` カラム内で頻繁に出現する値を選択します。 + +``` sql +SELECT anyHeavy(AirlineID) AS res +FROM ontime +``` + +``` text +┌───res─┐ +│ 19690 │ +└───────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/anylast.md b/docs/ja/sql-reference/aggregate-functions/reference/anylast.md new file mode 100644 index 00000000000..36ac7ff985e --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/anylast.md @@ -0,0 +1,43 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/anylast +sidebar_position: 105 +--- + +# anyLast + +最後に遭遇した値を選択し、デフォルトではいかなる `NULL` 値も無視します。結果は [any](../../../sql-reference/aggregate-functions/reference/any.md) 関数の場合と同様に不確定です。 + +**構文** + +```sql +anyLast(column) [RESPECT NULLS] +``` + +**パラメータ** +- `column`: カラム名。 + +:::note +関数名の後に `RESPECT NULLS` 修飾子をサポートしています。この修飾子を使用すると、`NULL` であるかどうかに関わらず、最後に渡された値を確実に選択します。 +::: + +**返される値** + +- 最後に遭遇した値。 + +**例** + +クエリ: + +```sql +CREATE TABLE any_last_nulls (city Nullable(String)) ENGINE=Log; + +INSERT INTO any_last_nulls (city) VALUES ('Amsterdam'),(NULL),('New York'),('Tokyo'),('Valencia'),(NULL); + +SELECT anyLast(city) FROM any_last_nulls; +``` + +```response +┌─anyLast(city)─┐ +│ Valencia │ +└───────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/approxtopk.md b/docs/ja/sql-reference/aggregate-functions/reference/approxtopk.md new file mode 100644 index 00000000000..acfb7715e9f --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/approxtopk.md @@ -0,0 +1,53 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/approxtopk +sidebar_position: 107 +--- + +# approx_top_k + +指定されたカラムで最も頻度の高い値とそのカウントを近似的に配列で返します。結果の配列は、値自体ではなく、値の近似頻度の降順でソートされます。 + +``` sql +approx_top_k(N)(column) +approx_top_k(N, reserved)(column) +``` + +この関数は保証された結果を提供するものではありません。特定の状況では、エラーが発生し、最も頻度の高い値ではない頻繁な値を返すことがあります。 + +`N < 10` の値を使用することをお勧めします。`N` の値が大きいとパフォーマンスが低下します。`N` の最大値は 65536 です。 + +**パラメーター** + +- `N` — 返す要素の数。オプション。デフォルト値: 10。 +- `reserved` — 値のために予約されるセルの数を定義します。もし uniq(column) > reserved であれば、topK 関数の結果は近似的なものになります。オプション。デフォルト値: N * 3。 + +**引数** + +- `column` — 頻度を計算する値。 + +**例** + +クエリ: + +``` sql +SELECT approx_top_k(2)(k) +FROM VALUES('k Char, w UInt64', ('y', 1), ('y', 1), ('x', 5), ('y', 1), ('z', 10)); +``` + +結果: + +``` text +┌─approx_top_k(2)(k)────┐ +│ [('y',3,0),('x',1,0)] │ +└───────────────────────┘ +``` + +# approx_top_count + +`approx_top_k` 関数の別名です + +**関連項目** + +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) +- [approx_top_sum](../../../sql-reference/aggregate-functions/reference/approxtopsum.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/approxtopsum.md b/docs/ja/sql-reference/aggregate-functions/reference/approxtopsum.md new file mode 100644 index 00000000000..83c2868d0de --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/approxtopsum.md @@ -0,0 +1,50 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/approxtopsum +sidebar_position: 108 +--- + +# approx_top_sum + +指定されたカラム内で最も頻度の高い値とそのカウントを約算で返します。結果の配列は、値自体ではなく、その値の頻度の降順でソートされます。さらに、値の重みも考慮されます。 + +``` sql +approx_top_sum(N)(column, weight) +approx_top_sum(N, reserved)(column, weight) +``` + +この関数は保証された結果を提供しません。特定の状況では、エラーが発生する可能性があり、最も頻繁な値ではない値を返すことがあります。 + +`N < 10` の値を使用することを推奨します。`N` の値が大きいとパフォーマンスが低下します。`N` の最大値は 65536 です。 + +**パラメータ** + +- `N` — 返す要素の数。オプション。デフォルト値: 10。 +- `reserved` — 値のために予約されるセルの数を定義します。もし uniq(column) > reserved の場合、topK 関数の結果は概算になります。オプション。デフォルト値: N * 3。 + +**引数** + +- `column` — 頻度を計算する値。 +- `weight` — 重み。各値は頻度計算のために `weight` 回考慮されます。[UInt64](../../../sql-reference/data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT approx_top_sum(2)(k, w) +FROM VALUES('k Char, w UInt64', ('y', 1), ('y', 1), ('x', 5), ('y', 1), ('z', 10)) +``` + +結果: + +``` text +┌─approx_top_sum(2)(k, w)─┐ +│ [('z',10,0),('x',5,0)] │ +└─────────────────────────┘ +``` + +**関連項目** + +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) +- [approx_top_k](../../../sql-reference/aggregate-functions/reference/approxtopk.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/argmax.md b/docs/ja/sql-reference/aggregate-functions/reference/argmax.md new file mode 100644 index 00000000000..92d0285732a --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/argmax.md @@ -0,0 +1,108 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/argmax +sidebar_position: 109 +--- + +# argMax + +`val` の最大値に対応する `arg` の値を計算します。同じ `val` で最大値を持つ複数の行がある場合、どの関連する `arg` が返されるかは決定的ではありません。`arg` と `max` の両方の部分は[集約関数](/docs/ja/sql-reference/aggregate-functions/index.md)として動作し、処理中に[`Null` をスキップします](/docs/ja/sql-reference/aggregate-functions/index.md#null-processing)が、`Null` 値が利用可能でない場合は `Null` 以外の値を返します。 + +**構文** + +``` sql +argMax(arg, val) +``` + +**引数** + +- `arg` — 引数。 +- `val` — 値。 + +**返される値** + +- 最大の `val` に対応する `arg` の値。 + +型: `arg` の型に一致します。 + +**例** + +入力テーブル: + +``` text +┌─user─────┬─salary─┐ +│ director │ 5000 │ +│ manager │ 3000 │ +│ worker │ 1000 │ +└──────────┴────────┘ +``` + +クエリ: + +``` sql +SELECT argMax(user, salary) FROM salary; +``` + +結果: + +``` text +┌─argMax(user, salary)─┐ +│ director │ +└──────────────────────┘ +``` + +**拡張例** + +```sql +CREATE TABLE test +( + a Nullable(String), + b Nullable(Int64) +) +ENGINE = Memory AS +SELECT * +FROM VALUES(('a', 1), ('b', 2), ('c', 2), (NULL, 3), (NULL, NULL), ('d', NULL)); + +select * from test; +┌─a────┬────b─┐ +│ a │ 1 │ +│ b │ 2 │ +│ c │ 2 │ +│ ᴺᵁᴸᴸ │ 3 │ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ d │ ᴺᵁᴸᴸ │ +└──────┴──────┘ + +SELECT argMax(a, b), max(b) FROM test; +┌─argMax(a, b)─┬─max(b)─┐ +│ b │ 3 │ -- argMax = 'b' は Null 以外の最初の値だから、max(b) は別の行からです! +└──────────────┴────────┘ + +SELECT argMax(tuple(a), b) FROM test; +┌─argMax(tuple(a), b)─┐ +│ (NULL) │ -- `Tuple` 内に唯一 `NULL` を含む場合、`NULL` にはならないので、集約関数はその `NULL` が原因で行をスキップしません +└─────────────────────┘ + +SELECT (argMax((a, b), b) as t).1 argMaxA, t.2 argMaxB FROM test; +┌─argMaxA─┬─argMaxB─┐ +│ ᴺᵁᴸᴸ │ 3 │ -- タプルを使用して max(b) に対応する両方の (すべての - tuple(*)) カラムを取得できます +└─────────┴─────────┘ + +SELECT argMax(a, b), max(b) FROM test WHERE a IS NULL AND b IS NULL; +┌─argMax(a, b)─┬─max(b)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ -- フィルターにより集計されたすべての行に少なくとも1つの `NULL` が含まれ、そのためすべての行がスキップされ、結果は `NULL` になります +└──────────────┴────────┘ + +SELECT argMax(a, (b,a)) FROM test; +┌─argMax(a, tuple(b, a))─┐ +│ c │ -- b=2 の行が2つあり、`Max` に `Tuple` を使用することで最初の `arg` 以外を取得できます +└────────────────────────┘ + +SELECT argMax(a, tuple(b)) FROM test; +┌─argMax(a, tuple(b))─┐ +│ b │ -- `Tuple` を `Max` で使用して、`Max` の中で Null をスキップしないようにできます +└─────────────────────┘ +``` + +**関連項目** + +- [Tuple](/docs/ja/sql-reference/data-types/tuple.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/argmin.md b/docs/ja/sql-reference/aggregate-functions/reference/argmin.md new file mode 100644 index 00000000000..3a02e85329d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/argmin.md @@ -0,0 +1,113 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/argmin +sidebar_position: 110 +--- + +# argMin + +`val` の最小値に対応する `arg` の値を計算します。最大となる `val` が同じ値を持つ複数の行がある場合、返される `arg` は非決定的です。`arg` と `min` の両方は[集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)として動作し、処理中に[`Null` をスキップします](/docs/ja/sql-reference/aggregate-functions/index.md#null-processing) 。 `Null` でない値が利用可能な場合、`Null` でない値を返します。 + +**構文** + +``` sql +argMin(arg, val) +``` + +**引数** + +- `arg` — 引数。 +- `val` — 値。 + +**戻り値** + +- 最小の `val` 値に対応する `arg` 値。 + +型:`arg` の型と一致。 + +**例** + +入力テーブル: + +``` text +┌─user─────┬─salary─┐ +│ director │ 5000 │ +│ manager │ 3000 │ +│ worker │ 1000 │ +└──────────┴────────┘ +``` + +クエリ: + +``` sql +SELECT argMin(user, salary) FROM salary +``` + +結果: + +``` text +┌─argMin(user, salary)─┐ +│ worker │ +└──────────────────────┘ +``` + +**拡張例** + +```sql +CREATE TABLE test +( + a Nullable(String), + b Nullable(Int64) +) +ENGINE = Memory AS +SELECT * +FROM VALUES((NULL, 0), ('a', 1), ('b', 2), ('c', 2), (NULL, NULL), ('d', NULL)); + +select * from test; +┌─a────┬────b─┐ +│ ᴺᵁᴸᴸ │ 0 │ +│ a │ 1 │ +│ b │ 2 │ +│ c │ 2 │ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ d │ ᴺᵁᴸᴸ │ +└──────┴──────┘ + +SELECT argMin(a, b), min(b) FROM test; +┌─argMin(a, b)─┬─min(b)─┐ +│ a │ 0 │ -- argMin = a は最初の `NULL` でない値であり、min(b) は別の行から来ています! +└──────────────┴────────┘ + +SELECT argMin(tuple(a), b) FROM test; +┌─argMin(tuple(a), b)─┐ +│ (NULL) │ -- `Tuple` に含まれる唯一の `NULL` 値は `NULL` ではないので、集計関数はその `NULL` 値によってその行をスキップしません +└─────────────────────┘ + +SELECT (argMin((a, b), b) as t).1 argMinA, t.2 argMinB from test; +┌─argMinA─┬─argMinB─┐ +│ ᴺᵁᴸᴸ │ 0 │ -- `Tuple` を使用して、最大の b に対応するすべての (すなわち tuple(*)) カラムを取得できます +└─────────┴─────────┘ + +SELECT argMin(a, b), min(b) FROM test WHERE a IS NULL and b IS NULL; +┌─argMin(a, b)─┬─min(b)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ -- すべての集約行はフィルターのために少なくとも1つの `NULL` 値を含むため、すべての行がスキップされ、その結果 `NULL` になります +└──────────────┴────────┘ + +SELECT argMin(a, (b, a)), min(tuple(b, a)) FROM test; +┌─argMin(a, tuple(b, a))─┬─min(tuple(b, a))─┐ +│ d │ (NULL,NULL) │ -- 'd' は最小の `NULL` でない値です +└────────────────────────┴──────────────────┘ + +SELECT argMin((a, b), (b, a)), min(tuple(b, a)) FROM test; +┌─argMin(tuple(a, b), tuple(b, a))─┬─min(tuple(b, a))─┐ +│ (NULL,NULL) │ (NULL,NULL) │ -- `Tuple` が `NULL` をスキップしないように許可するため、argMin は (NULL,NULL) を返し、min(tuple(b, a)) はこのデータセットの最小値になります +└──────────────────────────────────┴──────────────────┘ + +SELECT argMin(a, tuple(b)) FROM test; +┌─argMin(a, tuple(b))─┐ +│ d │ -- `Tuple` は `NULL` な値を持つ行をスキップしないように `min` に使用できます。 +└─────────────────────┘ +``` + +**参照** + +- [Tuple](/docs/ja/sql-reference/data-types/tuple.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/arrayconcatagg.md b/docs/ja/sql-reference/aggregate-functions/reference/arrayconcatagg.md new file mode 100644 index 00000000000..05ed70a2b30 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/arrayconcatagg.md @@ -0,0 +1,32 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/array_concat_agg +sidebar_position: 111 +--- + +# array_concat_agg +- `groupArrayArray`のエイリアスです。この関数は大文字小文字を区別しません。 + +**例** + +```text +SELECT * +FROM t + +┌─a───────┐ +│ [1,2,3] │ +│ [4,5] │ +│ [6] │ +└─────────┘ + +``` + +クエリ: + +```sql +SELECT array_concat_agg(a) AS a +FROM t + +┌─a─────────────┐ +│ [1,2,3,4,5,6] │ +└───────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/avg.md b/docs/ja/sql-reference/aggregate-functions/reference/avg.md new file mode 100644 index 00000000000..74f2b7eb0df --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/avg.md @@ -0,0 +1,65 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/avg +sidebar_position: 112 +--- + +# avg + +算術平均を計算します。 + +**構文** + +``` sql +avg(x) +``` + +**引数** + +- `x` — 入力値で、[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または [Decimal](../../../sql-reference/data-types/decimal.md) である必要があります。 + +**戻り値** + +- 算術平均は常に [Float64](../../../sql-reference/data-types/float.md) として返されます。 +- 入力パラメータ `x` が空の場合、`NaN` となります。 + +**例** + +クエリ: + +``` sql +SELECT avg(x) FROM values('x Int8', 0, 1, 2, 3, 4, 5); +``` + +結果: + +``` text +┌─avg(x)─┐ +│ 2.5 │ +└────────┘ +``` + +**例** + +一時テーブルを作成: + +クエリ: + +``` sql +CREATE table test (t UInt8) ENGINE = Memory; +``` + +算術平均を取得: + +クエリ: + +``` +SELECT avg(t) FROM test; +``` + +結果: + +``` text +┌─avg(x)─┐ +│ nan │ +└────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/avgweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/avgweighted.md new file mode 100644 index 00000000000..0bbcf793332 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/avgweighted.md @@ -0,0 +1,98 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/avgweighted +sidebar_position: 113 +--- + +# avgWeighted + +[加重算術平均](https://en.wikipedia.org/wiki/Weighted_arithmetic_mean)を計算します。 + +**構文** + +``` sql +avgWeighted(x, weight) +``` + +**引数** + +- `x` — 値。 +- `weight` — 値の重み。 + +`x` と `weight` の両方が +[整数](../../../sql-reference/data-types/int-uint.md)または[浮動小数点](../../../sql-reference/data-types/float.md) +である必要がありますが、異なる型を持つことが可能です。 + +**返される値** + +- すべての重みが0または指定された重みパラメータが空の場合は`NaN`。 +- それ以外の場合は加重平均。 + +**戻り値の型**は常に[Float64](../../../sql-reference/data-types/float.md)です。 + +**例** + +クエリ: + +``` sql +SELECT avgWeighted(x, w) +FROM values('x Int8, w Int8', (4, 1), (1, 0), (10, 2)) +``` + +結果: + +``` text +┌─avgWeighted(x, weight)─┐ +│ 8 │ +└────────────────────────┘ +``` + +**例** + +クエリ: + +``` sql +SELECT avgWeighted(x, w) +FROM values('x Int8, w Float64', (4, 1), (1, 0), (10, 2)) +``` + +結果: + +``` text +┌─avgWeighted(x, weight)─┐ +│ 8 │ +└────────────────────────┘ +``` + +**例** + +クエリ: + +``` sql +SELECT avgWeighted(x, w) +FROM values('x Int8, w Int8', (0, 0), (1, 0), (10, 0)) +``` + +結果: + +``` text +┌─avgWeighted(x, weight)─┐ +│ nan │ +└────────────────────────┘ +``` + +**例** + +クエリ: + +``` sql +CREATE table test (t UInt8) ENGINE = Memory; +SELECT avgWeighted(t) FROM test +``` + +結果: + +``` text +┌─avgWeighted(x, weight)─┐ +│ nan │ +└────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/boundrat.md b/docs/ja/sql-reference/aggregate-functions/reference/boundrat.md new file mode 100644 index 00000000000..d92b0951f28 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/boundrat.md @@ -0,0 +1,45 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/boundingRatio +sidebar_position: 114 +title: boundingRatio +--- + +グループの値の中で最も左と最も右の点間の勾配を計算する集計関数。 + +例: + +サンプルデータ: +```sql +SELECT + number, + number * 1.5 +FROM numbers(10) +``` +```response +┌─number─┬─multiply(number, 1.5)─┐ +│ 0 │ 0 │ +│ 1 │ 1.5 │ +│ 2 │ 3 │ +│ 3 │ 4.5 │ +│ 4 │ 6 │ +│ 5 │ 7.5 │ +│ 6 │ 9 │ +│ 7 │ 10.5 │ +│ 8 │ 12 │ +│ 9 │ 13.5 │ +└────────┴───────────────────────┘ +``` + +`boundingRatio()` 関数は、最も左の点と最も右の点の間の線の勾配を返します。上記のデータでのこれらの点は `(0,0)` と `(9,13.5)` です。 + +```sql +SELECT boundingRatio(number, number * 1.5) +FROM numbers(10) +``` +```response +┌─boundingRatio(number, multiply(number, 1.5))─┐ +│ 1.5 │ +└──────────────────────────────────────────────┘ +``` + + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/categoricalinformationvalue.md b/docs/ja/sql-reference/aggregate-functions/reference/categoricalinformationvalue.md new file mode 100644 index 00000000000..5829d41cd69 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/categoricalinformationvalue.md @@ -0,0 +1,13 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/categoricalinformationvalue +sidebar_position: 115 +title: categoricalInformationValue +--- + +各カテゴリーに対して `(P(tag = 1) - P(tag = 0))(log(P(tag = 1)) - log(P(tag = 0)))` の値を計算します。 + +``` sql +categoricalInformationValue(category1, category2, ..., tag) +``` + +この結果は、離散的(カテゴリカル)フィーチャー `[category1, category2, ...]` が `tag` の値を予測する学習モデルにどのように寄与するかを示します。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/contingency.md b/docs/ja/sql-reference/aggregate-functions/reference/contingency.md new file mode 100644 index 00000000000..76307e4b7f5 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/contingency.md @@ -0,0 +1,50 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/contingency +sidebar_position: 116 +--- + +# contingency + +`contingency` 関数は、2つのカラム間の関係を測定する値である [連関係数](https://en.wikipedia.org/wiki/Contingency_table#Cram%C3%A9r's_V_and_the_contingency_coefficient_C) を計算します。この計算は [ `cramersV` 関数](./cramersv.md) と類似していますが、平方根の分母が異なります。 + +**構文** + +``` sql +contingency(column1, column2) +``` + +**引数** + +- `column1` と `column2` は比較するカラムです。 + +**返される値** + +- 0から1の範囲の値を返します。結果が大きいほど、2つのカラムの関係が密接です。 + +**戻り値の型** は常に [Float64](../../../sql-reference/data-types/float.md) です。 + +**例** + +以下の例では、比較している2つのカラムがそれぞれあまり関係がないことを示しています。また、比較のために `cramersV` の結果も含めています。 + +``` sql +SELECT + cramersV(a, b), + contingency(a ,b) +FROM + ( + SELECT + number % 10 AS a, + number % 4 AS b + FROM + numbers(150) + ); +``` + +結果: + +```response +┌──────cramersV(a, b)─┬───contingency(a, b)─┐ +│ 0.41171788506213564 │ 0.05812725261759165 │ +└─────────────────────┴─────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/corr.md b/docs/ja/sql-reference/aggregate-functions/reference/corr.md new file mode 100644 index 00000000000..73752f94e53 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/corr.md @@ -0,0 +1,60 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/corr +sidebar_position: 117 +--- + +# corr + +[ピアソン積率相関係数](https://en.wikipedia.org/wiki/Pearson_correlation_coefficient)を計算します: + +$$ +\frac{\Sigma{(x - \bar{x})(y - \bar{y})}}{\sqrt{\Sigma{(x - \bar{x})^2} * \Sigma{(y - \bar{y})^2}}} +$$ + +:::note +この関数は数値的に不安定なアルゴリズムを使用しています。計算において[数値的安定性](https://en.wikipedia.org/wiki/Numerical_stability)が必要な場合は、[`corrStable`](../reference/corrstable.md) 関数を使用してください。こちらは遅いですが、より正確な結果を提供します。 +::: + +**構文** + +```sql +corr(x, y) +``` + +**引数** + +- `x` — 最初の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 +- `y` — 二番目の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- ピアソン積率相関係数。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series +( + i UInt32, + x_value Float64, + y_value Float64 +) +ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6, -4.4),(2, -9.6, 3),(3, -1.3, -4),(4, 5.3, 9.7),(5, 4.4, 0.037),(6, -8.6, -7.8),(7, 5.1, 9.3),(8, 7.9, -3.6),(9, -8.2, 0.62),(10, -3, 7.3); +``` + +```sql +SELECT corr(x_value, y_value) +FROM series; +``` + +結果: + +```response +┌─corr(x_value, y_value)─┐ +│ 0.1730265755453256 │ +└────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/corrmatrix.md b/docs/ja/sql-reference/aggregate-functions/reference/corrmatrix.md new file mode 100644 index 00000000000..facc6f9ba4d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/corrmatrix.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/corrmatrix +sidebar_position: 118 +--- + +# corrMatrix + +N個の変数に対する相関行列を計算します。 + +**構文** + +```sql +corrMatrix(x[, ...]) +``` + +**引数** + +- `x` — 可変個のパラメータ。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**返される値** + +- 相関行列。 [Array](../../data-types/array.md)([Array](../../data-types/array.md)([Float64](../../data-types/float.md)))。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test +( + a UInt32, + b Float64, + c Float64, + d Float64 +) +ENGINE = Memory; +INSERT INTO test(a, b, c, d) VALUES (1, 5.6, -4.4, 2.6), (2, -9.6, 3, 3.3), (3, -1.3, -4, 1.2), (4, 5.3, 9.7, 2.3), (5, 4.4, 0.037, 1.222), (6, -8.6, -7.8, 2.1233), (7, 5.1, 9.3, 8.1222), (8, 7.9, -3.6, 9.837), (9, -8.2, 0.62, 8.43555), (10, -3, 7.3, 6.762); +``` + +```sql +SELECT arrayMap(x -> round(x, 3), arrayJoin(corrMatrix(a, b, c, d))) AS corrMatrix +FROM test; +``` + +結果: + +```response + ┌─corrMatrix─────────────┐ +1. │ [1,-0.096,0.243,0.746] │ +2. │ [-0.096,1,0.173,0.106] │ +3. │ [0.243,0.173,1,0.258] │ +4. │ [0.746,0.106,0.258,1] │ + └────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/corrstable.md b/docs/ja/sql-reference/aggregate-functions/reference/corrstable.md new file mode 100644 index 00000000000..cabee97d020 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/corrstable.md @@ -0,0 +1,58 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/corrstable +sidebar_position: 119 +--- + +# corrStable + +[ピアソン相関係数](https://en.wikipedia.org/wiki/Pearson_correlation_coefficient)を計算します: + +$$ +\frac{\Sigma{(x - \bar{x})(y - \bar{y})}}{\sqrt{\Sigma{(x - \bar{x})^2} * \Sigma{(y - \bar{y})^2}}} +$$ + +`corr`関数と似ていますが、数値的に安定したアルゴリズムを使用します。その結果、`corrStable`は`corr`よりも遅いですが、より正確な結果を生成します。 + +**構文** + +```sql +corrStable(x, y) +``` + +**引数** + +- `x` — 第一変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 +- `y` — 第二変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- ピアソン相関係数。[Float64](../../data-types/float.md)。 + +***例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series +( + i UInt32, + x_value Float64, + y_value Float64 +) +ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6, -4.4),(2, -9.6, 3),(3, -1.3, -4),(4, 5.3, 9.7),(5, 4.4, 0.037),(6, -8.6, -7.8),(7, 5.1, 9.3),(8, 7.9, -3.6),(9, -8.2, 0.62),(10, -3, 7.3); +``` + +```sql +SELECT corrStable(x_value, y_value) +FROM series; +``` + +結果: + +```response +┌─corrStable(x_value, y_value)─┐ +│ 0.17302657554532558 │ +└──────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/count.md b/docs/ja/sql-reference/aggregate-functions/reference/count.md new file mode 100644 index 00000000000..250a241e3ae --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/count.md @@ -0,0 +1,77 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/count +sidebar_position: 120 +--- + +# count + +行数またはNULL以外の値を数えます。 + +ClickHouseは`count`に対して以下の構文をサポートしています: + +- `count(expr)` または `COUNT(DISTINCT expr)`。 +- `count()` または `COUNT(*)`。`count()`構文はClickHouse固有のものです。 + +**引数** + +この関数は以下を受け取れます: + +- パラメータを一つも取らない。 +- 一つの[式](../../../sql-reference/syntax.md#syntax-expressions)。 + +**戻り値** + +- 関数がパラメータなしで呼び出された場合、行数を数えます。 +- [式](../../../sql-reference/syntax.md#syntax-expressions)が渡された場合、その式がNULL以外を返した回数を数えます。式が[Nullable](../../../sql-reference/data-types/nullable.md)型の値を返す場合でも、`count`の結果は`Nullable`にはなりません。式がすべての行で`NULL`を返した場合、関数は0を返します。 + +いずれの場合も、戻り値の型は[UInt64](../../../sql-reference/data-types/int-uint.md)です。 + +**詳細** + +ClickHouseは`COUNT(DISTINCT …)`構文をサポートします。この構文の動作は、[count_distinct_implementation](../../../operations/settings/settings.md#count_distinct_implementation)設定によって決まります。これは、操作を実行するために使用される[uniq\*](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq)関数を定義します。デフォルトは[uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact)関数です。 + +`SELECT count() FROM table`クエリは、デフォルトでMergeTreeのメタデータを使用して最適化されます。行レベルのセキュリティを使用する必要がある場合、[optimize_trivial_count_query](../../../operations/settings/settings.md#optimize-trivial-count-query)設定を使用して最適化を無効にします。 + +ただし、`SELECT count(nullable_column) FROM table`クエリは、[optimize_functions_to_subcolumns](../../../operations/settings/settings.md#optimize-functions-to-subcolumns)設定を有効にすることで最適化できます。`optimize_functions_to_subcolumns = 1`の設定では、全体のカラムデータを読み込んで処理するのではなく、[null](../../../sql-reference/data-types/nullable.md#finding-null)サブカラムのみを読み取ります。このクエリは`SELECT count(n) FROM table`から`SELECT sum(NOT n.null) FROM table`に変換されます。 + +**COUNT(DISTINCT expr)のパフォーマンス向上** + +`COUNT(DISTINCT expr)`クエリが遅い場合、並列化を改善するために[`GROUP BY`](../../../sql-reference/statements/select/group-by.md)句を追加することを検討してください。また、[projection](../../../sql-reference/statements/alter/projection.md)を使用して、`COUNT(DISTINCT target_col)`と一緒に使用する対象カラムにインデックスを作成することもできます。 + +**例** + +例1: + +``` sql +SELECT count() FROM t +``` + +``` text +┌─count()─┐ +│ 5 │ +└─────────┘ +``` + +例2: + +``` sql +SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation' +``` + +``` text +┌─name──────────────────────────┬─value─────┐ +│ count_distinct_implementation │ uniqExact │ +└───────────────────────────────┴───────────┘ +``` + +``` sql +SELECT count(DISTINCT num) FROM t +``` + +``` text +┌─uniqExact(num)─┐ +│ 3 │ +└────────────────┘ +``` + +この例は、`count(DISTINCT num)`が`count_distinct_implementation`設定の値に従って`uniqExact`関数によって実行されることを示しています。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarpop.md b/docs/ja/sql-reference/aggregate-functions/reference/covarpop.md new file mode 100644 index 00000000000..b089277837c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarpop.md @@ -0,0 +1,54 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarpop +sidebar_position: 121 +--- + +# covarPop + +母集団分散共分散を計算します: + +$$ +\frac{\Sigma{(x - \bar{x})(y - \bar{y})}}{n} +$$ + +:::note +この関数は数値的に不安定なアルゴリズムを使用します。計算において[数値的安定性](https://en.wikipedia.org/wiki/Numerical_stability)が必要な場合は、[`covarPopStable`](../reference/covarpopstable.md)関数を使用してください。これは計算速度が遅くなりますが、計算誤差が少なくなります。 +::: + +**構文** + +```sql +covarPop(x, y) +``` + +**引数** + +- `x` — 最初の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 +- `y` — 2番目の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**返される値** + +- `x` と `y` の母集団共分散。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series(i UInt32, x_value Float64, y_value Float64) ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6, -4.4),(2, -9.6, 3),(3, -1.3, -4),(4, 5.3, 9.7),(5, 4.4, 0.037),(6, -8.6, -7.8),(7, 5.1, 9.3),(8, 7.9, -3.6),(9, -8.2, 0.62),(10, -3, 7.3); +``` + +```sql +SELECT covarPop(x_value, y_value) +FROM series; +``` + +結果: + +```reference +┌─covarPop(x_value, y_value)─┐ +│ 6.485648 │ +└────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarpopmatrix.md b/docs/ja/sql-reference/aggregate-functions/reference/covarpopmatrix.md new file mode 100644 index 00000000000..8d251b0e37b --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarpopmatrix.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarpopmatrix +sidebar_position: 122 +--- + +# covarPopMatrix + +N個の変数に対する母集団分散共分散行列を返します。 + +**構文** + +```sql +covarPopMatrix(x[, ...]) +``` + +**引数** + +- `x` — 可変個数のパラメータ。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- 母集団分散共分散行列。[Array](../../data-types/array.md)([Array](../../data-types/array.md)([Float64](../../data-types/float.md)))。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test +( + a UInt32, + b Float64, + c Float64, + d Float64 +) +ENGINE = Memory; +INSERT INTO test(a, b, c, d) VALUES (1, 5.6, -4.4, 2.6), (2, -9.6, 3, 3.3), (3, -1.3, -4, 1.2), (4, 5.3, 9.7, 2.3), (5, 4.4, 0.037, 1.222), (6, -8.6, -7.8, 2.1233), (7, 5.1, 9.3, 8.1222), (8, 7.9, -3.6, 9.837), (9, -8.2, 0.62, 8.43555), (10, -3, 7.3, 6.762); +``` + +```sql +SELECT arrayMap(x -> round(x, 3), arrayJoin(covarPopMatrix(a, b, c, d))) AS covarPopMatrix +FROM test; +``` + +結果: + +```reference + ┌─covarPopMatrix────────────┐ +1. │ [8.25,-1.76,4.08,6.748] │ +2. │ [-1.76,41.07,6.486,2.132] │ +3. │ [4.08,6.486,34.21,4.755] │ +4. │ [6.748,2.132,4.755,9.93] │ + └───────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarpopstable.md b/docs/ja/sql-reference/aggregate-functions/reference/covarpopstable.md new file mode 100644 index 00000000000..504762e174e --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarpopstable.md @@ -0,0 +1,58 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarpopstable +sidebar_position: 123 +--- + +# covarPopStable + +母集団共分散の値を計算します: + +$$ +\frac{\Sigma{(x - \bar{x})(y - \bar{y})}}{n} +$$ + +これは[covarPop](../reference/covarpop.md)関数に似ていますが、数値的に安定したアルゴリズムを使用します。その結果、`covarPopStable`は`covarPop`よりも遅いですが、より正確な結果を出します。 + +**構文** + +```sql +covarPop(x, y) +``` + +**引数** + +- `x` — 最初の変数。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal](../../data-types/decimal.md)。 +- `y` — 二番目の変数。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- `x`と`y`の間の母集団共分散。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series(i UInt32, x_value Float64, y_value Float64) ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6,-4.4),(2, -9.6,3),(3, -1.3,-4),(4, 5.3,9.7),(5, 4.4,0.037),(6, -8.6,-7.8),(7, 5.1,9.3),(8, 7.9,-3.6),(9, -8.2,0.62),(10, -3,7.3); +``` + +```sql +SELECT covarPopStable(x_value, y_value) +FROM +( + SELECT + x_value, + y_value + FROM series +); +``` + +結果: + +```reference +┌─covarPopStable(x_value, y_value)─┐ +│ 6.485648 │ +└──────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarsamp.md b/docs/ja/sql-reference/aggregate-functions/reference/covarsamp.md new file mode 100644 index 00000000000..bc4da63e465 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarsamp.md @@ -0,0 +1,78 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarsamp +sidebar_position: 124 +--- + +# covarSamp + +`Σ((x - x̅)(y - y̅)) / (n - 1)` の値を計算します。 + +:::note +この関数は数値的に不安定なアルゴリズムを使用します。計算における[数値安定性](https://en.wikipedia.org/wiki/Numerical_stability)が必要な場合は、`covarSampStable` 関数を使用してください。この関数は動作が遅くなりますが、計算誤差を抑えます。 +::: + +**構文** + +```sql +covarSamp(x, y) +``` + +**引数** + +- `x` — 第一の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 +- `y` — 第二の変数。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- `x` と `y` 間のサンプル共分散。`n <= 1` の場合、`nan` が返されます。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series(i UInt32, x_value Float64, y_value Float64) ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6,-4.4),(2, -9.6,3),(3, -1.3,-4),(4, 5.3,9.7),(5, 4.4,0.037),(6, -8.6,-7.8),(7, 5.1,9.3),(8, 7.9,-3.6),(9, -8.2,0.62),(10, -3,7.3); +``` + +```sql +SELECT covarSamp(x_value, y_value) +FROM +( + SELECT + x_value, + y_value + FROM series +); +``` + +結果: + +```reference +┌─covarSamp(x_value, y_value)─┐ +│ 7.206275555555556 │ +└─────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT covarSamp(x_value, y_value) +FROM +( + SELECT + x_value, + y_value + FROM series LIMIT 1 +); + +``` + +結果: + +```reference +┌─covarSamp(x_value, y_value)─┐ +│ nan │ +└─────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarsampmatrix.md b/docs/ja/sql-reference/aggregate-functions/reference/covarsampmatrix.md new file mode 100644 index 00000000000..a5fe5a0d9a1 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarsampmatrix.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarsampmatrix +sidebar_position: 125 +--- + +# covarSampMatrix + +N個の変数に対するサンプル共分散行列を返します。 + +**構文** + +```sql +covarSampMatrix(x[, ...]) +``` + +**引数** + +- `x` — 可変数のパラメータ。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- サンプル共分散行列。[Array](../../data-types/array.md)([Array](../../data-types/array.md)([Float64](../../data-types/float.md)))。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test +( + a UInt32, + b Float64, + c Float64, + d Float64 +) +ENGINE = Memory; +INSERT INTO test(a, b, c, d) VALUES (1, 5.6, -4.4, 2.6), (2, -9.6, 3, 3.3), (3, -1.3, -4, 1.2), (4, 5.3, 9.7, 2.3), (5, 4.4, 0.037, 1.222), (6, -8.6, -7.8, 2.1233), (7, 5.1, 9.3, 8.1222), (8, 7.9, -3.6, 9.837), (9, -8.2, 0.62, 8.43555), (10, -3, 7.3, 6.762); +``` + +```sql +SELECT arrayMap(x -> round(x, 3), arrayJoin(covarSampMatrix(a, b, c, d))) AS covarSampMatrix +FROM test; +``` + +結果: + +```reference + ┌─covarSampMatrix─────────────┐ +1. │ [9.167,-1.956,4.534,7.498] │ +2. │ [-1.956,45.634,7.206,2.369] │ +3. │ [4.534,7.206,38.011,5.283] │ +4. │ [7.498,2.369,5.283,11.034] │ + └─────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/covarsampstable.md b/docs/ja/sql-reference/aggregate-functions/reference/covarsampstable.md new file mode 100644 index 00000000000..5c6e38a216c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/covarsampstable.md @@ -0,0 +1,73 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/covarsampstable +sidebar_position: 126 +--- + +# covarSampStable + +`Σ((x - x̅)(y - y̅)) / (n - 1)` の値を計算します。 [covarSamp](../reference/covarsamp.md) と類似していますが、計算誤差を減少させる一方で、動作速度は遅くなります。 + +**構文** + +```sql +covarSampStable(x, y) +``` + +**引数** + +- `x` — 第一の変数。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal](../../data-types/decimal.md)。 +- `y` — 第二の変数。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal](../../data-types/decimal.md)。 + +**戻り値** + +- `x`と`y`のサンプル共分散。`n <= 1`の場合は、`inf`が返されます。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS series; +CREATE TABLE series(i UInt32, x_value Float64, y_value Float64) ENGINE = Memory; +INSERT INTO series(i, x_value, y_value) VALUES (1, 5.6,-4.4),(2, -9.6,3),(3, -1.3,-4),(4, 5.3,9.7),(5, 4.4,0.037),(6, -8.6,-7.8),(7, 5.1,9.3),(8, 7.9,-3.6),(9, -8.2,0.62),(10, -3,7.3); +``` + +```sql +SELECT covarSampStable(x_value, y_value) +FROM +( + SELECT + x_value, + y_value + FROM series +); +``` + +結果: + +```reference +┌─covarSampStable(x_value, y_value)─┐ +│ 7.206275555555556 │ +└───────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT covarSampStable(x_value, y_value) +FROM +( + SELECT + x_value, + y_value + FROM series LIMIT 1 +); +``` + +結果: + +```reference +┌─covarSampStable(x_value, y_value)─┐ +│ inf │ +└───────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/cramersv.md b/docs/ja/sql-reference/aggregate-functions/reference/cramersv.md new file mode 100644 index 00000000000..4853a189613 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/cramersv.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/cramersv +sidebar_position: 127 +--- + +# cramersV + +[Cramer's V](https://en.wikipedia.org/wiki/Cram%C3%A9r%27s_V)(Cramer's phiとも呼ばれることがあります)は、テーブル内の2つの**カラム**間の関連性を測定する指標です。`cramersV`関数の結果は、(変数間に関連がないことに対応する)0から1までの範囲を取り、各値が他の値によって完全に決定される場合にのみ1に達します。これは、2つの変数間の関連性を、最大可能な変動の割合として見ることができます。 + +:::note +Cramer's V のバイアス修正バージョンについては、[cramersVBiasCorrected](./cramersvbiascorrected.md)を参照してください。 +::: + +**構文** + +``` sql +cramersV(column1, column2) +``` + +**パラメータ** + +- `column1`: 比較する最初のカラム。 +- `column2`: 比較する2番目のカラム。 + +**返される値** + +- 0(カラムの値間に関連がないことに対応)から1(完全な関連性)までの値。 + +タイプ: 常に [Float64](../../../sql-reference/data-types/float.md)。 + +**例** + +以下の2つの**カラム**は互いに関連がないため、`cramersV`の結果は0です。 + +クエリ: + +``` sql +SELECT + cramersV(a, b) +FROM + ( + SELECT + number % 3 AS a, + number % 5 AS b + FROM + numbers(150) + ); +``` + +結果: + +```response +┌─cramersV(a, b)─┐ +│ 0 │ +└────────────────┘ +``` + +以下の2つの**カラム**はかなり密接に関連しているため、`cramersV`の結果は高い値になります。 + +```sql +SELECT + cramersV(a, b) +FROM + ( + SELECT + number % 10 AS a, + number % 5 AS b + FROM + numbers(150) + ); +``` + +結果: + +```response +┌─────cramersV(a, b)─┐ +│ 0.8944271909999159 │ +└────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md b/docs/ja/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md new file mode 100644 index 00000000000..b49ac72bb6c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/cramersvbiascorrected.md @@ -0,0 +1,53 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/cramersvbiascorrected +sidebar_position: 128 +--- + +# cramersVBiasCorrected + +Cramer's Vは、テーブル内の二つのカラム間の関連性を測定する指標です。[`cramersV`関数](./cramersv.md)の結果は0(変数間に関連性がないことを示す)から1(各値が他方の値によって完全に決定される場合)までの範囲を持ちます。この関数は大きなバイアスを持つ可能性があるため、このバージョンのCramer's Vでは[バイアス補正](https://en.wikipedia.org/wiki/Cram%C3%A9r%27s_V#Bias_correction)を使用します。 + +**構文** + +``` sql +cramersVBiasCorrected(column1, column2) +``` + +**パラメータ** + +- `column1`: 比較する最初のカラム。 +- `column2`: 比較する2番目のカラム。 + +**返される値** + +- 0(カラムの値間に関連性がないことを示す)から1(完全な関連性)までの値。 + +型: 常に[Float64](../../../sql-reference/data-types/float.md)。 + +**例** + +以下の二つのカラムは互いに小さな関連性を持っています。`cramersVBiasCorrected`の結果は`cramersV`の結果よりも小さいことに注目してください: + +クエリ: + +``` sql +SELECT + cramersV(a, b), + cramersVBiasCorrected(a ,b) +FROM + ( + SELECT + number % 10 AS a, + number % 4 AS b + FROM + numbers(150) + ); +``` + +結果: + +```response +┌──────cramersV(a, b)─┬─cramersVBiasCorrected(a, b)─┐ +│ 0.41171788506213564 │ 0.33369281784141364 │ +└─────────────────────┴─────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/deltasum.md b/docs/ja/sql-reference/aggregate-functions/reference/deltasum.md new file mode 100644 index 00000000000..3938bc766b2 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/deltasum.md @@ -0,0 +1,74 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/deltasum +sidebar_position: 129 +--- + +# deltaSum + +連続する行の間の算術差を合計します。差が負の場合は無視されます。 + +:::note +この関数が正しく動作するためには、基になるデータがソートされている必要があります。この関数を[Materialized View](../../../sql-reference/statements/create/view.md#materialized)で使用したい場合、代わりに[deltaSumTimestamp](../../../sql-reference/aggregate-functions/reference/deltasumtimestamp.md#agg_functions-deltasumtimestamp)メソッドを使用することをお勧めします。 +::: + +**構文** + +``` sql +deltaSum(value) +``` + +**引数** + +- `value` — 入力値。型は[Integer](../../data-types/int-uint.md)または[Float](../../data-types/float.md)でなければなりません。 + +**返される値** + +- 算術差の合計で、`Integer`または`Float`型です。 + +**例** + +クエリ: + +``` sql +SELECT deltaSum(arrayJoin([1, 2, 3])); +``` + +結果: + +``` text +┌─deltaSum(arrayJoin([1, 2, 3]))─┐ +│ 2 │ +└────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT deltaSum(arrayJoin([1, 2, 3, 0, 3, 4, 2, 3])); +``` + +結果: + +``` text +┌─deltaSum(arrayJoin([1, 2, 3, 0, 3, 4, 2, 3]))─┐ +│ 7 │ +└───────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT deltaSum(arrayJoin([2.25, 3, 4.5])); +``` + +結果: + +``` text +┌─deltaSum(arrayJoin([2.25, 3, 4.5]))─┐ +│ 2.25 │ +└─────────────────────────────────────┘ +``` + +## 関連項目 + +- [runningDifference](../../functions/other-functions.md#other_functions-runningdifference) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/deltasumtimestamp.md b/docs/ja/sql-reference/aggregate-functions/reference/deltasumtimestamp.md new file mode 100644 index 00000000000..b6afd1fa3f3 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/deltasumtimestamp.md @@ -0,0 +1,45 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/deltasumtimestamp +sidebar_position: 130 +title: deltaSumTimestamp +--- + +連続する行間の差を加算します。差が負の場合は無視されます。 + +この関数は主に、`toStartOfMinute` バケットのような時間バケットに揃ったタイムスタンプでデータを順序付けて保存する[マテリアライズドビュー](../../../sql-reference/statements/create/view.md#materialized)用です。このようなマテリアライズドビュー内の行は全て同じタイムスタンプを持つため、元の丸められていないタイムスタンプ値を保存せずに正しい順序でマージすることは不可能です。`deltaSumTimestamp` 関数は、見た値の元の `timestamp` を追跡し、そのため関数の値(状態)はパーツのマージ中に正しく計算されます。 + +順序付けられたコレクション全体のデルタサムを計算するには、単に [deltaSum](../../../sql-reference/aggregate-functions/reference/deltasum.md#agg_functions-deltasum) 関数を使うことができます。 + +**構文** + +``` sql +deltaSumTimestamp(value, timestamp) +``` + +**引数** + +- `value` — 入力値。いくつかの [Integer](../../data-types/int-uint.md) 型または [Float](../../data-types/float.md) 型、または [Date](../../data-types/date.md) もしくは [DateTime](../../data-types/datetime.md) 型でなければなりません。 +- `timestamp` — 値を順序付けるためのパラメータ。いくつかの [Integer](../../data-types/int-uint.md) 型または [Float](../../data-types/float.md) 型、または [Date](../../data-types/date.md) もしくは [DateTime](../../data-types/datetime.md) 型でなければなりません。 + +**返される値** + +- `timestamp` パラメータで順序付けられた、連続する値間の累積差。 + +型: [Integer](../../data-types/int-uint.md) または [Float](../../data-types/float.md) または [Date](../../data-types/date.md) または [DateTime](../../data-types/datetime.md)。 + +**例** + +クエリ: + +```sql +SELECT deltaSumTimestamp(value, timestamp) +FROM (SELECT number AS timestamp, [0, 4, 8, 3, 0, 0, 0, 1, 3, 5][number] AS value FROM numbers(1, 10)); +``` + +結果: + +``` text +┌─deltaSumTimestamp(value, timestamp)─┐ +│ 13 │ +└─────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/distinctdynamictypes.md b/docs/ja/sql-reference/aggregate-functions/reference/distinctdynamictypes.md new file mode 100644 index 00000000000..a3344b7feaa --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/distinctdynamictypes.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/distinctdynamictypes +sidebar_position: 215 +--- + +# distinctDynamicTypes + +[Dynamic](../../data-types/dynamic.md)カラムに格納された異なるデータ型のリストを計算します。 + +**構文** + +```sql +distinctDynamicTypes(dynamic) +``` + +**引数** + +- `dynamic` — [Dynamic](../../data-types/dynamic.md)カラム。 + +**戻り値** + +- データ型名のソートされたリスト [Array(String)](../../data-types/array.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_dynamic; +CREATE TABLE test_dynamic(d Dynamic) ENGINE = Memory; +INSERT INTO test_dynamic VALUES (42), (NULL), ('Hello'), ([1, 2, 3]), ('2020-01-01'), (map(1, 2)), (43), ([4, 5]), (NULL), ('World'), (map(3, 4)) +``` + +```sql +SELECT distinctDynamicTypes(d) FROM test_dynamic; +``` + +結果: + +```reference +┌─distinctDynamicTypes(d)──────────────────────────────────────┐ +│ ['Array(Int64)','Date','Int64','Map(UInt8, UInt8)','String'] │ +└──────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/distinctjsonpaths.md b/docs/ja/sql-reference/aggregate-functions/reference/distinctjsonpaths.md new file mode 100644 index 00000000000..107a752744c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/distinctjsonpaths.md @@ -0,0 +1,125 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/distinctjsonpaths +sidebar_position: 216 +--- + +# distinctJSONPaths + +[JSON](../../data-types/newjson.md) カラムに格納されている異なるパスのリストを計算します。 + +**構文** + +```sql +distinctJSONPaths(json) +``` + +**引数** + +- `json` — [JSON](../../data-types/newjson.md) カラム。 + +**返される値** + +- ソートされたパスのリスト [Array(String)](../../data-types/array.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_json; +CREATE TABLE test_json(json JSON) ENGINE = Memory; +INSERT INTO test_json VALUES ('{"a" : 42, "b" : "Hello"}'), ('{"b" : [1, 2, 3], "c" : {"d" : {"e" : "2020-01-01"}}}'), ('{"a" : 43, "c" : {"d" : {"f" : [{"g" : 42}]}}}') +``` + +```sql +SELECT distinctJSONPaths(json) FROM test_json; +``` + +結果: + +```reference +┌─distinctJSONPaths(json)───┐ +│ ['a','b','c.d.e','c.d.f'] │ +└───────────────────────────┘ +``` + +# distinctJSONPathsAndTypes + +[JSON](../../data-types/newjson.md) カラムに格納されている異なるパスとその型のリストを計算します。 + +**構文** + +```sql +distinctJSONPathsAndTypes(json) +``` + +**引数** + +- `json` — [JSON](../../data-types/newjson.md) カラム。 + +**返される値** + +- ソートされたパスと型のマップ [Map(String, Array(String))](../../data-types/map.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_json; +CREATE TABLE test_json(json JSON) ENGINE = Memory; +INSERT INTO test_json VALUES ('{"a" : 42, "b" : "Hello"}'), ('{"b" : [1, 2, 3], "c" : {"d" : {"e" : "2020-01-01"}}}'), ('{"a" : 43, "c" : {"d" : {"f" : [{"g" : 42}]}}}') +``` + +```sql +SELECT distinctJSONPathsAndTypes(json) FROM test_json; +``` + +結果: + +```reference +┌─distinctJSONPathsAndTypes(json)───────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {'a':['Int64'],'b':['Array(Nullable(Int64))','String'],'c.d.e':['Date'],'c.d.f':['Array(JSON(max_dynamic_types=16, max_dynamic_paths=256))']} │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**注意** + +JSON 宣言に指定された型のパスが含まれている場合、入力データにこれらのパスの値が含まれていなくても、`distinctJSONPaths/distinctJSONPathsAndTypes` 関数の結果に常に含まれます。 + +```sql +DROP TABLE IF EXISTS test_json; +CREATE TABLE test_json(json JSON(a UInt32)) ENGINE = Memory; +INSERT INTO test_json VALUES ('{"b" : "Hello"}'), ('{"b" : "World", "c" : [1, 2, 3]}'); +``` + +```sql +SELECT json FROM test_json; +``` + +```text +┌─json──────────────────────────────────┐ +│ {"a":0,"b":"Hello"} │ +│ {"a":0,"b":"World","c":["1","2","3"]} │ +└───────────────────────────────────────┘ +``` + +```sql +SELECT distinctJSONPaths(json) FROM test_json; +``` + +```text +┌─distinctJSONPaths(json)─┐ +│ ['a','b','c'] │ +└─────────────────────────┘ +``` + +```sql +SELECT distinctJSONPathsAndTypes(json) FROM test_json; +``` + +```text +┌─distinctJSONPathsAndTypes(json)────────────────────────────────┐ +│ {'a':['UInt32'],'b':['String'],'c':['Array(Nullable(Int64))']} │ +└────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/entropy.md b/docs/ja/sql-reference/aggregate-functions/reference/entropy.md new file mode 100644 index 00000000000..8ae164ac1f3 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/entropy.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/entropy +sidebar_position: 131 +--- + +# entropy + +カラムの値の[シャノンエントロピー](https://en.wikipedia.org/wiki/Entropy_(information_theory))を計算します。 + +**構文** + +``` sql +entropy(val) +``` + +**引数** + +- `val` — 任意の型の値のカラム。 + +**返される値** + +- シャノンエントロピー。 + +型: [Float64](../../../sql-reference/data-types/float.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE entropy (`vals` UInt32,`strings` String) ENGINE = Memory; + +INSERT INTO entropy VALUES (1, 'A'), (1, 'A'), (1, 'A'), (1, 'A'), (2, 'B'), (2, 'B'), (2, 'C'), (2, 'D'); + +SELECT entropy(vals), entropy(strings) FROM entropy; +``` + +結果: + +``` text +┌─entropy(vals)─┬─entropy(strings)─┐ +│ 1 │ 1.75 │ +└───────────────┴──────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md b/docs/ja/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md new file mode 100644 index 00000000000..9969b3c60b9 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/exponentialmovingaverage.md @@ -0,0 +1,205 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/exponentialMovingAverage +sidebar_position: 132 +title: exponentialMovingAverage +--- + +## exponentialMovingAverage + +指定された時間の値の指数移動平均を計算します。 + +**構文** + +```sql +exponentialMovingAverage(x)(value, timeunit) +``` + +各 `value` は、決定された `timeunit` に対応します。半減期 `x` は、指数的な重みが半分に減衰する時間遅れです。この関数は重み付けされた平均を返します:時間が経つほど、対応する値は低い重みで考慮されます。 + +**引数** + +- `value` — 値。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `timeunit` — 時間単位。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または [Decimal](../../../sql-reference/data-types/decimal.md)。時間単位はタイムスタンプ(秒)ではなく、時間間隔のインデックスです。[intDiv](../../functions/arithmetic-functions.md#intdiva-b)を使用して計算できます。 + +**パラメータ** + +- `x` — 半減期。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または [Decimal](../../../sql-reference/data-types/decimal.md)。 + +**戻り値** + +- 最新の時点での過去 `x` 時間の[指数平滑移動平均](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average)を返します。 + +型: [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 + +**例** + +入力テーブル: + +``` text +┌──temperature─┬─timestamp──┐ +│ 95 │ 1 │ +│ 95 │ 2 │ +│ 95 │ 3 │ +│ 96 │ 4 │ +│ 96 │ 5 │ +│ 96 │ 6 │ +│ 96 │ 7 │ +│ 97 │ 8 │ +│ 97 │ 9 │ +│ 97 │ 10 │ +│ 97 │ 11 │ +│ 98 │ 12 │ +│ 98 │ 13 │ +│ 98 │ 14 │ +│ 98 │ 15 │ +│ 99 │ 16 │ +│ 99 │ 17 │ +│ 99 │ 18 │ +│ 100 │ 19 │ +│ 100 │ 20 │ +└──────────────┴────────────┘ +``` + +クエリ: + +```sql +SELECT exponentialMovingAverage(5)(temperature, timestamp); +``` + +結果: + +``` text +┌──exponentialMovingAverage(5)(temperature, timestamp)──┐ +│ 92.25779635374204 │ +└───────────────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT + value, + time, + round(exp_smooth, 3), + bar(exp_smooth, 0, 1, 50) AS bar +FROM +( + SELECT + (number = 0) OR (number >= 25) AS value, + number AS time, + exponentialMovingAverage(10)(value, time) OVER (Rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS exp_smooth + FROM numbers(50) +) +``` + +結果: + +``` text +┌─value─┬─time─┬─round(exp_smooth, 3)─┬─bar────────────────────────────────────────┐ +│ 1 │ 0 │ 0.067 │ ███▎ │ +│ 0 │ 1 │ 0.062 │ ███ │ +│ 0 │ 2 │ 0.058 │ ██▊ │ +│ 0 │ 3 │ 0.054 │ ██▋ │ +│ 0 │ 4 │ 0.051 │ ██▌ │ +│ 0 │ 5 │ 0.047 │ ██▎ │ +│ 0 │ 6 │ 0.044 │ ██▏ │ +│ 0 │ 7 │ 0.041 │ ██ │ +│ 0 │ 8 │ 0.038 │ █▊ │ +│ 0 │ 9 │ 0.036 │ █▋ │ +│ 0 │ 10 │ 0.033 │ █▋ │ +│ 0 │ 11 │ 0.031 │ █▌ │ +│ 0 │ 12 │ 0.029 │ █▍ │ +│ 0 │ 13 │ 0.027 │ █▎ │ +│ 0 │ 14 │ 0.025 │ █▎ │ +│ 0 │ 15 │ 0.024 │ █▏ │ +│ 0 │ 16 │ 0.022 │ █ │ +│ 0 │ 17 │ 0.021 │ █ │ +│ 0 │ 18 │ 0.019 │ ▊ │ +│ 0 │ 19 │ 0.018 │ ▊ │ +│ 0 │ 20 │ 0.017 │ ▋ │ +│ 0 │ 21 │ 0.016 │ ▋ │ +│ 0 │ 22 │ 0.015 │ ▋ │ +│ 0 │ 23 │ 0.014 │ ▋ │ +│ 0 │ 24 │ 0.013 │ ▋ │ +│ 1 │ 25 │ 0.079 │ ███▊ │ +│ 1 │ 26 │ 0.14 │ ███████ │ +│ 1 │ 27 │ 0.198 │ █████████▊ │ +│ 1 │ 28 │ 0.252 │ ████████████▌ │ +│ 1 │ 29 │ 0.302 │ ███████████████ │ +│ 1 │ 30 │ 0.349 │ █████████████████▍ │ +│ 1 │ 31 │ 0.392 │ ███████████████████▌ │ +│ 1 │ 32 │ 0.433 │ █████████████████████▋ │ +│ 1 │ 33 │ 0.471 │ ███████████████████████▌ │ +│ 1 │ 34 │ 0.506 │ █████████████████████████▎ │ +│ 1 │ 35 │ 0.539 │ ██████████████████████████▊ │ +│ 1 │ 36 │ 0.57 │ ████████████████████████████▌ │ +│ 1 │ 37 │ 0.599 │ █████████████████████████████▊ │ +│ 1 │ 38 │ 0.626 │ ███████████████████████████████▎ │ +│ 1 │ 39 │ 0.651 │ ████████████████████████████████▌ │ +│ 1 │ 40 │ 0.674 │ █████████████████████████████████▋ │ +│ 1 │ 41 │ 0.696 │ ██████████████████████████████████▋ │ +│ 1 │ 42 │ 0.716 │ ███████████████████████████████████▋ │ +│ 1 │ 43 │ 0.735 │ ████████████████████████████████████▋ │ +│ 1 │ 44 │ 0.753 │ █████████████████████████████████████▋ │ +│ 1 │ 45 │ 0.77 │ ██████████████████████████████████████▍ │ +│ 1 │ 46 │ 0.785 │ ███████████████████████████████████████▎ │ +│ 1 │ 47 │ 0.8 │ ███████████████████████████████████████▊ │ +│ 1 │ 48 │ 0.813 │ ████████████████████████████████████████▋ │ +│ 1 │ 49 │ 0.825 │ █████████████████████████████████████████▎ │ +└───────┴──────┴──────────────────────┴────────────────────────────────────────────┘ +``` + +```sql +CREATE TABLE data +ENGINE = Memory AS +SELECT + 10 AS value, + toDateTime('2020-01-01') + (3600 * number) AS time +FROM numbers_mt(10); + + +-- intDivを使用してtimeunitを計算 +SELECT + value, + time, + exponentialMovingAverage(1)(value, intDiv(toUInt32(time), 3600)) OVER (ORDER BY time ASC) AS res, + intDiv(toUInt32(time), 3600) AS timeunit +FROM data +ORDER BY time ASC; + +┌─value─┬────────────────time─┬─────────res─┬─timeunit─┐ +│ 10 │ 2020-01-01 00:00:00 │ 5 │ 438288 │ +│ 10 │ 2020-01-01 01:00:00 │ 7.5 │ 438289 │ +│ 10 │ 2020-01-01 02:00:00 │ 8.75 │ 438290 │ +│ 10 │ 2020-01-01 03:00:00 │ 9.375 │ 438291 │ +│ 10 │ 2020-01-01 04:00:00 │ 9.6875 │ 438292 │ +│ 10 │ 2020-01-01 05:00:00 │ 9.84375 │ 438293 │ +│ 10 │ 2020-01-01 06:00:00 │ 9.921875 │ 438294 │ +│ 10 │ 2020-01-01 07:00:00 │ 9.9609375 │ 438295 │ +│ 10 │ 2020-01-01 08:00:00 │ 9.98046875 │ 438296 │ +│ 10 │ 2020-01-01 09:00:00 │ 9.990234375 │ 438297 │ +└───────┴─────────────────────┴─────────────┴──────────┘ + + +-- toRelativeHourNumを使用してtimeunitを計算 +SELECT + value, + time, + exponentialMovingAverage(1)(value, toRelativeHourNum(time)) OVER (ORDER BY time ASC) AS res, + toRelativeHourNum(time) AS timeunit +FROM data +ORDER BY time ASC; + +┌─value─┬────────────────time─┬─────────res─┬─timeunit─┐ +│ 10 │ 2020-01-01 00:00:00 │ 5 │ 438288 │ +│ 10 │ 2020-01-01 01:00:00 │ 7.5 │ 438289 │ +│ 10 │ 2020-01-01 02:00:00 │ 8.75 │ 438290 │ +│ 10 │ 2020-01-01 03:00:00 │ 9.375 │ 438291 │ +│ 10 │ 2020-01-01 04:00:00 │ 9.6875 │ 438292 │ +│ 10 │ 2020-01-01 05:00:00 │ 9.84375 │ 438293 │ +│ 10 │ 2020-01-01 06:00:00 │ 9.921875 │ 438294 │ +│ 10 │ 2020-01-01 07:00:00 │ 9.9609375 │ 438295 │ +│ 10 │ 2020-01-01 08:00:00 │ 9.98046875 │ 438296 │ +│ 10 │ 2020-01-01 09:00:00 │ 9.990234375 │ 438297 │ +└───────┴─────────────────────┴─────────────┴──────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedavg.md b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedavg.md new file mode 100644 index 00000000000..5477418f863 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedavg.md @@ -0,0 +1,105 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/exponentialTimeDecayedAvg +sidebar_position: 133 +title: exponentialTimeDecayedAvg +--- + +## exponentialTimeDecayedAvg + +時点 `t` での時系列データの指数平滑加重移動平均を返します。 + +**構文** + +```sql +exponentialTimeDecayedAvg(x)(v, t) +``` + +**引数** + +- `v` — 値。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `t` — 時間。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md), [DateTime](../../data-types/datetime.md), [DateTime64](../../data-types/datetime64.md)。 + +**パラメータ** + +- `x` — 半減期。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 + +**戻り値** + +- 時点 `t` における指数平滑加重移動平均を返します。 [Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT + value, + time, + round(exp_smooth, 3), + bar(exp_smooth, 0, 5, 50) AS bar +FROM + ( + SELECT + (number = 0) OR (number >= 25) AS value, + number AS time, + exponentialTimeDecayedAvg(10)(value, time) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS exp_smooth + FROM numbers(50) + ); +``` + +応答: + +```sql + ┌─value─┬─time─┬─round(exp_smooth, 3)─┬─bar────────┐ +1. │ 1 │ 0 │ 1 │ ██████████ │ +2. │ 0 │ 1 │ 0.475 │ ████▊ │ +3. │ 0 │ 2 │ 0.301 │ ███ │ +4. │ 0 │ 3 │ 0.214 │ ██▏ │ +5. │ 0 │ 4 │ 0.162 │ █▌ │ +6. │ 0 │ 5 │ 0.128 │ █▎ │ +7. │ 0 │ 6 │ 0.104 │ █ │ +8. │ 0 │ 7 │ 0.086 │ ▊ │ +9. │ 0 │ 8 │ 0.072 │ ▋ │ +0. │ 0 │ 9 │ 0.061 │ ▌ │ +1. │ 0 │ 10 │ 0.052 │ ▌ │ +2. │ 0 │ 11 │ 0.045 │ ▍ │ +3. │ 0 │ 12 │ 0.039 │ ▍ │ +4. │ 0 │ 13 │ 0.034 │ ▎ │ +5. │ 0 │ 14 │ 0.03 │ ▎ │ +6. │ 0 │ 15 │ 0.027 │ ▎ │ +7. │ 0 │ 16 │ 0.024 │ ▏ │ +8. │ 0 │ 17 │ 0.021 │ ▏ │ +9. │ 0 │ 18 │ 0.018 │ ▏ │ +0. │ 0 │ 19 │ 0.016 │ ▏ │ +1. │ 0 │ 20 │ 0.015 │ ▏ │ +2. │ 0 │ 21 │ 0.013 │ ▏ │ +3. │ 0 │ 22 │ 0.012 │ │ +4. │ 0 │ 23 │ 0.01 │ │ +5. │ 0 │ 24 │ 0.009 │ │ +6. │ 1 │ 25 │ 0.111 │ █ │ +7. │ 1 │ 26 │ 0.202 │ ██ │ +8. │ 1 │ 27 │ 0.283 │ ██▊ │ +9. │ 1 │ 28 │ 0.355 │ ███▌ │ +0. │ 1 │ 29 │ 0.42 │ ████▏ │ +1. │ 1 │ 30 │ 0.477 │ ████▊ │ +2. │ 1 │ 31 │ 0.529 │ █████▎ │ +3. │ 1 │ 32 │ 0.576 │ █████▊ │ +4. │ 1 │ 33 │ 0.618 │ ██████▏ │ +5. │ 1 │ 34 │ 0.655 │ ██████▌ │ +6. │ 1 │ 35 │ 0.689 │ ██████▉ │ +7. │ 1 │ 36 │ 0.719 │ ███████▏ │ +8. │ 1 │ 37 │ 0.747 │ ███████▍ │ +9. │ 1 │ 38 │ 0.771 │ ███████▋ │ +0. │ 1 │ 39 │ 0.793 │ ███████▉ │ +1. │ 1 │ 40 │ 0.813 │ ████████▏ │ +2. │ 1 │ 41 │ 0.831 │ ████████▎ │ +3. │ 1 │ 42 │ 0.848 │ ████████▍ │ +4. │ 1 │ 43 │ 0.862 │ ████████▌ │ +5. │ 1 │ 44 │ 0.876 │ ████████▊ │ +6. │ 1 │ 45 │ 0.888 │ ████████▉ │ +7. │ 1 │ 46 │ 0.898 │ ████████▉ │ +8. │ 1 │ 47 │ 0.908 │ █████████ │ +9. │ 1 │ 48 │ 0.917 │ █████████▏ │ +0. │ 1 │ 49 │ 0.925 │ █████████▏ │ + └───────┴──────┴──────────────────────┴────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedcount.md b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedcount.md new file mode 100644 index 00000000000..d57a4fdd9f4 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedcount.md @@ -0,0 +1,104 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/exponentialTimeDecayedCount +sidebar_position: 134 +title: exponentialTimeDecayedCount +--- + +## exponentialTimeDecayedCount + +時系列において、時刻のインデックス `t` での累積指数減衰を返します。 + +**構文** + +```sql +exponentialTimeDecayedCount(x)(t) +``` + +**引数** + +- `t` — 時間。 [Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)、[DateTime](../../data-types/datetime.md)、[DateTime64](../../data-types/datetime64.md)。 + +**パラメーター** + +- `x` — 半減期。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 + +**返される値** + +- 指定された時刻における累積指数減衰を返します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT + value, + time, + round(exp_smooth, 3), + bar(exp_smooth, 0, 20, 50) AS bar +FROM +( + SELECT + (number % 5) = 0 AS value, + number AS time, + exponentialTimeDecayedCount(10)(time) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS exp_smooth + FROM numbers(50) +); +``` + +結果: + +```response + ┌─value─┬─time─┬─round(exp_smooth, 3)─┬─bar────────────────────────┐ + 1. │ 1 │ 0 │ 1 │ ██▌ │ + 2. │ 0 │ 1 │ 1.905 │ ████▊ │ + 3. │ 0 │ 2 │ 2.724 │ ██████▊ │ + 4. │ 0 │ 3 │ 3.464 │ ████████▋ │ + 5. │ 0 │ 4 │ 4.135 │ ██████████▎ │ + 6. │ 1 │ 5 │ 4.741 │ ███████████▊ │ + 7. │ 0 │ 6 │ 5.29 │ █████████████▏ │ + 8. │ 0 │ 7 │ 5.787 │ ██████████████▍ │ + 9. │ 0 │ 8 │ 6.236 │ ███████████████▌ │ +10. │ 0 │ 9 │ 6.643 │ ████████████████▌ │ +11. │ 1 │ 10 │ 7.01 │ █████████████████▌ │ +12. │ 0 │ 11 │ 7.343 │ ██████████████████▎ │ +13. │ 0 │ 12 │ 7.644 │ ███████████████████ │ +14. │ 0 │ 13 │ 7.917 │ ███████████████████▊ │ +15. │ 0 │ 14 │ 8.164 │ ████████████████████▍ │ +16. │ 1 │ 15 │ 8.387 │ ████████████████████▉ │ +17. │ 0 │ 16 │ 8.589 │ █████████████████████▍ │ +18. │ 0 │ 17 │ 8.771 │ █████████████████████▉ │ +19. │ 0 │ 18 │ 8.937 │ ██████████████████████▎ │ +20. │ 0 │ 19 │ 9.086 │ ██████████████████████▋ │ +21. │ 1 │ 20 │ 9.222 │ ███████████████████████ │ +22. │ 0 │ 21 │ 9.344 │ ███████████████████████▎ │ +23. │ 0 │ 22 │ 9.455 │ ███████████████████████▋ │ +24. │ 0 │ 23 │ 9.555 │ ███████████████████████▉ │ +25. │ 0 │ 24 │ 9.646 │ ████████████████████████ │ +26. │ 1 │ 25 │ 9.728 │ ████████████████████████▎ │ +27. │ 0 │ 26 │ 9.802 │ ████████████████████████▌ │ +28. │ 0 │ 27 │ 9.869 │ ████████████████████████▋ │ +29. │ 0 │ 28 │ 9.93 │ ████████████████████████▊ │ +30. │ 0 │ 29 │ 9.985 │ ████████████████████████▉ │ +31. │ 1 │ 30 │ 10.035 │ █████████████████████████ │ +32. │ 0 │ 31 │ 10.08 │ █████████████████████████▏ │ +33. │ 0 │ 32 │ 10.121 │ █████████████████████████▎ │ +34. │ 0 │ 33 │ 10.158 │ █████████████████████████▍ │ +35. │ 0 │ 34 │ 10.191 │ █████████████████████████▍ │ +36. │ 1 │ 35 │ 10.221 │ █████████████████████████▌ │ +37. │ 0 │ 36 │ 10.249 │ █████████████████████████▌ │ +38. │ 0 │ 37 │ 10.273 │ █████████████████████████▋ │ +39. │ 0 │ 38 │ 10.296 │ █████████████████████████▋ │ +40. │ 0 │ 39 │ 10.316 │ █████████████████████████▊ │ +41. │ 1 │ 40 │ 10.334 │ █████████████████████████▊ │ +42. │ 0 │ 41 │ 10.351 │ █████████████████████████▉ │ +43. │ 0 │ 42 │ 10.366 │ █████████████████████████▉ │ +44. │ 0 │ 43 │ 10.379 │ █████████████████████████▉ │ +45. │ 0 │ 44 │ 10.392 │ █████████████████████████▉ │ +46. │ 1 │ 45 │ 10.403 │ ██████████████████████████ │ +47. │ 0 │ 46 │ 10.413 │ ██████████████████████████ │ +48. │ 0 │ 47 │ 10.422 │ ██████████████████████████ │ +49. │ 0 │ 48 │ 10.43 │ ██████████████████████████ │ +50. │ 0 │ 49 │ 10.438 │ ██████████████████████████ │ + └───────┴──────┴──────────────────────┴────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedmax.md b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedmax.md new file mode 100644 index 00000000000..382a173fc77 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedmax.md @@ -0,0 +1,105 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/exponentialTimeDecayedMax +sidebar_position: 135 +title: exponentialTimeDecayedMax +--- + +## exponentialTimeDecayedMax + +時間における指数平滑移動平均のインデックス `t` とその前のインデックス `t-1` で最大値を返します。 + +**構文** + +```sql +exponentialTimeDecayedMax(x)(value, timeunit) +``` + +**引数** + +- `value` — 値。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `timeunit` — 時間単位。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)、[DateTime](../../data-types/datetime.md)、[DateTime64](../../data-types/datetime64.md)。 + +**パラメータ** + +- `x` — 半減期。[Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 + +**返される値** + +- 指数平滑加重移動平均の `t` と `t-1` での最大値を返します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT + value, + time, + round(exp_smooth, 3), + bar(exp_smooth, 0, 5, 50) AS bar +FROM + ( + SELECT + (number = 0) OR (number >= 25) AS value, + number AS time, + exponentialTimeDecayedMax(10)(value, time) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS exp_smooth + FROM numbers(50) + ); +``` + +結果: + +```response + ┌─value─┬─time─┬─round(exp_smooth, 3)─┬─bar────────┐ + 1. │ 1 │ 0 │ 1 │ ██████████ │ + 2. │ 0 │ 1 │ 0.905 │ █████████ │ + 3. │ 0 │ 2 │ 0.819 │ ████████▏ │ + 4. │ 0 │ 3 │ 0.741 │ ███████▍ │ + 5. │ 0 │ 4 │ 0.67 │ ██████▋ │ + 6. │ 0 │ 5 │ 0.607 │ ██████ │ + 7. │ 0 │ 6 │ 0.549 │ █████▍ │ + 8. │ 0 │ 7 │ 0.497 │ ████▉ │ + 9. │ 0 │ 8 │ 0.449 │ ████▍ │ +10. │ 0 │ 9 │ 0.407 │ ████ │ +11. │ 0 │ 10 │ 0.368 │ ███▋ │ +12. │ 0 │ 11 │ 0.333 │ ███▎ │ +13. │ 0 │ 12 │ 0.301 │ ███ │ +14. │ 0 │ 13 │ 0.273 │ ██▋ │ +15. │ 0 │ 14 │ 0.247 │ ██▍ │ +16. │ 0 │ 15 │ 0.223 │ ██▏ │ +17. │ 0 │ 16 │ 0.202 │ ██ │ +18. │ 0 │ 17 │ 0.183 │ █▊ │ +19. │ 0 │ 18 │ 0.165 │ █▋ │ +20. │ 0 │ 19 │ 0.15 │ █▍ │ +21. │ 0 │ 20 │ 0.135 │ █▎ │ +22. │ 0 │ 21 │ 0.122 │ █▏ │ +23. │ 0 │ 22 │ 0.111 │ █ │ +24. │ 0 │ 23 │ 0.1 │ █ │ +25. │ 0 │ 24 │ 0.091 │ ▉ │ +26. │ 1 │ 25 │ 1 │ ██████████ │ +27. │ 1 │ 26 │ 1 │ ██████████ │ +28. │ 1 │ 27 │ 1 │ ██████████ │ +29. │ 1 │ 28 │ 1 │ ██████████ │ +30. │ 1 │ 29 │ 1 │ ██████████ │ +31. │ 1 │ 30 │ 1 │ ██████████ │ +32. │ 1 │ 31 │ 1 │ ██████████ │ +33. │ 1 │ 32 │ 1 │ ██████████ │ +34. │ 1 │ 33 │ 1 │ ██████████ │ +35. │ 1 │ 34 │ 1 │ ██████████ │ +36. │ 1 │ 35 │ 1 │ ██████████ │ +37. │ 1 │ 36 │ 1 │ ██████████ │ +38. │ 1 │ 37 │ 1 │ ██████████ │ +39. │ 1 │ 38 │ 1 │ ██████████ │ +40. │ 1 │ 39 │ 1 │ ██████████ │ +41. │ 1 │ 40 │ 1 │ ██████████ │ +42. │ 1 │ 41 │ 1 │ ██████████ │ +43. │ 1 │ 42 │ 1 │ ██████████ │ +44. │ 1 │ 43 │ 1 │ ██████████ │ +45. │ 1 │ 44 │ 1 │ ██████████ │ +46. │ 1 │ 45 │ 1 │ ██████████ │ +47. │ 1 │ 46 │ 1 │ ██████████ │ +48. │ 1 │ 47 │ 1 │ ██████████ │ +49. │ 1 │ 48 │ 1 │ ██████████ │ +50. │ 1 │ 49 │ 1 │ ██████████ │ + └───────┴──────┴──────────────────────┴────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedsum.md b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedsum.md new file mode 100644 index 00000000000..a001f630bb8 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/exponentialtimedecayedsum.md @@ -0,0 +1,105 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/exponentialTimeDecayedSum +sidebar_position: 136 +title: exponentialTimeDecayedSum +--- + +## exponentialTimeDecayedSum + +時系列のインデックス `t` における指数平滑移動平均値の合計を返します。 + +**構文** + +```sql +exponentialTimeDecayedSum(x)(v, t) +``` + +**引数** + +- `v` — 値。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `t` — 時間。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md), [DateTime](../../data-types/datetime.md), [DateTime64](../../data-types/datetime64.md)。 + +**パラメータ** + +- `x` — 半減期。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 + +**戻り値** + +- 指定された時間点における指数平滑移動平均値の合計を返します。 [Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT + value, + time, + round(exp_smooth, 3), + bar(exp_smooth, 0, 10, 50) AS bar +FROM + ( + SELECT + (number = 0) OR (number >= 25) AS value, + number AS time, + exponentialTimeDecayedSum(10)(value, time) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS exp_smooth + FROM numbers(50) + ); +``` + +結果: + +```response + ┌─value─┬─time─┬─round(exp_smooth, 3)─┬─bar───────────────────────────────────────────────┐ + 1. │ 1 │ 0 │ 1 │ █████ │ + 2. │ 0 │ 1 │ 0.905 │ ████▌ │ + 3. │ 0 │ 2 │ 0.819 │ ████ │ + 4. │ 0 │ 3 │ 0.741 │ ███▋ │ + 5. │ 0 │ 4 │ 0.67 │ ███▎ │ + 6. │ 0 │ 5 │ 0.607 │ ███ │ + 7. │ 0 │ 6 │ 0.549 │ ██▋ │ + 8. │ 0 │ 7 │ 0.497 │ ██▍ │ + 9. │ 0 │ 8 │ 0.449 │ ██▏ │ +10. │ 0 │ 9 │ 0.407 │ ██ │ +11. │ 0 │ 10 │ 0.368 │ █▊ │ +12. │ 0 │ 11 │ 0.333 │ █▋ │ +13. │ 0 │ 12 │ 0.301 │ █▌ │ +14. │ 0 │ 13 │ 0.273 │ █▎ │ +15. │ 0 │ 14 │ 0.247 │ █▏ │ +16. │ 0 │ 15 │ 0.223 │ █ │ +17. │ 0 │ 16 │ 0.202 │ █ │ +18. │ 0 │ 17 │ 0.183 │ ▉ │ +19. │ 0 │ 18 │ 0.165 │ ▊ │ +20. │ 0 │ 19 │ 0.15 │ ▋ │ +21. │ 0 │ 20 │ 0.135 │ ▋ │ +22. │ 0 │ 21 │ 0.122 │ ▌ │ +23. │ 0 │ 22 │ 0.111 │ ▌ │ +24. │ 0 │ 23 │ 0.1 │ ▌ │ +25. │ 0 │ 24 │ 0.091 │ ▍ │ +26. │ 1 │ 25 │ 1.082 │ █████▍ │ +27. │ 1 │ 26 │ 1.979 │ █████████▉ │ +28. │ 1 │ 27 │ 2.791 │ █████████████▉ │ +29. │ 1 │ 28 │ 3.525 │ █████████████████▋ │ +30. │ 1 │ 29 │ 4.19 │ ████████████████████▉ │ +31. │ 1 │ 30 │ 4.791 │ ███████████████████████▉ │ +32. │ 1 │ 31 │ 5.335 │ ██████████████████████████▋ │ +33. │ 1 │ 32 │ 5.827 │ █████████████████████████████▏ │ +34. │ 1 │ 33 │ 6.273 │ ███████████████████████████████▎ │ +35. │ 1 │ 34 │ 6.676 │ █████████████████████████████████▍ │ +36. │ 1 │ 35 │ 7.041 │ ███████████████████████████████████▏ │ +37. │ 1 │ 36 │ 7.371 │ ████████████████████████████████████▊ │ +38. │ 1 │ 37 │ 7.669 │ ██████████████████████████████████████▎ │ +39. │ 1 │ 38 │ 7.939 │ ███████████████████████████████████████▋ │ +40. │ 1 │ 39 │ 8.184 │ ████████████████████████████████████████▉ │ +41. │ 1 │ 40 │ 8.405 │ ██████████████████████████████████████████ │ +42. │ 1 │ 41 │ 8.605 │ ███████████████████████████████████████████ │ +43. │ 1 │ 42 │ 8.786 │ ███████████████████████████████████████████▉ │ +44. │ 1 │ 43 │ 8.95 │ ████████████████████████████████████████████▊ │ +45. │ 1 │ 44 │ 9.098 │ █████████████████████████████████████████████▍ │ +46. │ 1 │ 45 │ 9.233 │ ██████████████████████████████████████████████▏ │ +47. │ 1 │ 46 │ 9.354 │ ██████████████████████████████████████████████▊ │ +48. │ 1 │ 47 │ 9.464 │ ███████████████████████████████████████████████▎ │ +49. │ 1 │ 48 │ 9.563 │ ███████████████████████████████████████████████▊ │ +50. │ 1 │ 49 │ 9.653 │ ████████████████████████████████████████████████▎ │ + └───────┴──────┴──────────────────────┴───────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/first_value.md b/docs/ja/sql-reference/aggregate-functions/reference/first_value.md new file mode 100644 index 00000000000..f39d4939258 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/first_value.md @@ -0,0 +1,81 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/first_value +sidebar_position: 137 +--- + +# first_value + +これは、[`any`](../../../sql-reference/aggregate-functions/reference/any.md)のエイリアスですが、[ウィンドウ関数](../../window-functions/index.md)との互換性のために導入されました。ここでは、`NULL`値を処理する必要がある場合があります(デフォルトでは、すべてのClickHouse集計関数はNULL値を無視します)。 + +ウィンドウ関数および通常の集計の両方でNULLを尊重する修飾子(`RESPECT NULLS`)を宣言することをサポートしています。 + +`any`と同様に、ウィンドウ関数なしではソースストリームが注文されていない場合、結果はランダムになり、戻りの型は入力の型と一致します(入力がNullableまたは-OrNullコンビネータが追加されている場合のみNullが返されます)。 + +## 例 + +```sql +CREATE TABLE test_data +( + a Int64, + b Nullable(Int64) +) +ENGINE = Memory; + +INSERT INTO test_data (a, b) Values (1,null), (2,3), (4, 5), (6,null); +``` + +### 例1 +デフォルトでは、NULL値は無視されます。 +```sql +select first_value(b) from test_data; +``` + +```text +┌─any(b)─┐ +│ 3 │ +└────────┘ +``` + +### 例2 +NULL値は無視されます。 +```sql +select first_value(b) ignore nulls from test_data +``` + +```text +┌─any(b) IGNORE NULLS ─┐ +│ 3 │ +└──────────────────────┘ +``` + +### 例3 +NULL値が受け入れられます。 +```sql +select first_value(b) respect nulls from test_data +``` + +```text +┌─any(b) RESPECT NULLS ─┐ +│ ᴺᵁᴸᴸ │ +└───────────────────────┘ +``` + +### 例4 +`ORDER BY`を使用したサブクエリで安定した結果。 +```sql +SELECT + first_value_respect_nulls(b), + first_value(b) +FROM +( + SELECT * + FROM test_data + ORDER BY a ASC +) +``` + +```text +┌─any_respect_nulls(b)─┬─any(b)─┐ +│ ᴺᵁᴸᴸ │ 3 │ +└──────────────────────┴────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/flame_graph.md b/docs/ja/sql-reference/aggregate-functions/reference/flame_graph.md new file mode 100644 index 00000000000..9ce36f607b4 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/flame_graph.md @@ -0,0 +1,94 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/flame_graph +sidebar_position: 138 +--- + +# flameGraph + +スタックトレースのリストを使用して[フレームグラフ](https://www.brendangregg.com/flamegraphs.html)を構築する集約関数です。フレームグラフのSVGを生成するために[flamegraph.pl ユーティリティ](https://github.com/brendangregg/FlameGraph)で使用できる文字列の配列を出力します。 + +## 構文 + +```sql +flameGraph(traces, [size], [ptr]) +``` + +## パラメータ + +- `traces` — スタックトレース。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 +- `size` — メモリプロファイリングのための割り当てサイズ。(オプション - デフォルトは`1`)[UInt64](../../data-types/int-uint.md)。 +- `ptr` — 割り当てアドレス。(オプション - デフォルトは`0`)[UInt64](../../data-types/int-uint.md)。 + +:::note +`ptr != 0`の場合、flameGraphは同じサイズとptrでの割り当て(size > 0)および解放(size < 0)をマッピングします。解放されていない割り当てのみが表示されます。マッピングされていない解放は無視されます。 +::: + +## 戻り値 + +- [flamegraph.pl ユーティリティ](https://github.com/brendangregg/FlameGraph)で使用するための文字列の配列。[Array](../../data-types/array.md)([String](../../data-types/string.md))。 + +## 使用例 + +### CPUクエリプロファイラに基づいたフレームグラフの構築 + +```sql +SET query_profiler_cpu_time_period_ns=10000000; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +``` + +```text +clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(arrayReverse(trace))) from system.trace_log where trace_type = 'CPU' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl > flame_cpu.svg +``` + +### メモリクエリプロファイラに基づき、すべての割り当てを表示するフレームグラフの構築 + +```sql +SET memory_profiler_sample_probability=1, max_untracked_memory=1; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +``` + +```text +clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(trace, size)) from system.trace_log where trace_type = 'MemorySample' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem.svg +``` + +### クエリコンテキストで解放されていない割り当てを示すメモリクエリプロファイラに基づいたフレームグラフの構築 + +```sql +SET memory_profiler_sample_probability=1, max_untracked_memory=1, use_uncompressed_cache=1, merge_tree_max_rows_to_use_cache=100000000000, merge_tree_max_bytes_to_use_cache=1000000000000; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +``` + +```text +clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_untracked.svg +``` + +### 一定時点でのアクティブ割り当てを表示するメモリクエリプロファイラに基づいたフレームグラフの構築 + +```sql +SET memory_profiler_sample_probability=1, max_untracked_memory=1; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +``` + +- 1 - 秒単位のメモリ使用量 + +```sql +SELECT event_time, m, formatReadableSize(max(s) as m) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample') GROUP BY event_time ORDER BY event_time; +``` + +- 2 - 最大メモリ使用量の時点を見つける + +```sql +SELECT argMax(event_time, s), max(s) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample'); +``` + +- 3 - 一定時点でのアクティブな割り当てを固定する + +```text +clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time <= 'yyy' ORDER BY event_time)" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_pos.svg +``` + +- 4 - 一定時点での解放を見つける + +```text +clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, -size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time > 'yyy' ORDER BY event_time desc)" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_neg.svg +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparray.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparray.md new file mode 100644 index 00000000000..e058b348071 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparray.md @@ -0,0 +1,47 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparray +sidebar_position: 139 +--- + +# groupArray + +構文: `groupArray(x)` または `groupArray(max_size)(x)` + +引数の値の配列を作成します。値は任意の(不確定な)順序で配列に追加されます。 + +第2のバージョン(`max_size`パラメータを使用)では、結果の配列のサイズを`max_size`要素に制限します。例えば、`groupArray(1)(x)`は`[any (x)]`と同等です。 + +場合によっては、実行順序に依存することが可能です。これは、サブクエリ結果が十分に小さい場合、`ORDER BY`を使用するサブクエリから`SELECT`が来る場合に適用されます。 + +**例** + +``` text +SELECT * FROM default.ck; + +┌─id─┬─name─────┐ +│ 1 │ zhangsan │ +│ 1 │ ᴺᵁᴸᴸ │ +│ 1 │ lisi │ +│ 2 │ wangwu │ +└────┴──────────┘ + +``` + +クエリ: + +``` sql +select id, groupArray(10)(name) from default.ck group by id; +``` + +結果: + +``` text +┌─id─┬─groupArray(10)(name)─┐ +│ 1 │ ['zhangsan','lisi'] │ +│ 2 │ ['wangwu'] │ +└────┴──────────────────────┘ +``` + +groupArray関数は、上記の結果に基づいてᴺᵁᴸᴸ値を削除します。 + +- エイリアス: `array_agg`. diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparrayinsertat.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparrayinsertat.md new file mode 100644 index 00000000000..ebb96abbddd --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparrayinsertat.md @@ -0,0 +1,92 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparrayinsertat +sidebar_position: 140 +--- + +# groupArrayInsertAt + +指定された位置に値を配列に挿入します。 + +**構文** + +``` sql +groupArrayInsertAt(default_x, size)(x, pos) +``` + +1つのクエリで同じ位置に複数の値が挿入された場合、関数は次のように動作します: + +- クエリが単一スレッドで実行される場合、挿入された値のうち最初のものが使用されます。 +- クエリが複数スレッドで実行される場合、結果として得られる値は挿入された値の中から不確定のものです。 + +**引数** + +- `x` — 挿入される値。[サポートされているデータ型](../../../sql-reference/data-types/index.md)の1つの[式](../../../sql-reference/syntax.md#syntax-expressions)。 +- `pos` — 指定された要素 `x` を挿入する位置。配列のインデックス番号はゼロから始まります。[UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges)。 +- `default_x` — 空の位置に代入するためのデフォルト値。オプションのパラメータ。[式](../../../sql-reference/syntax.md#syntax-expressions)で `x` パラメータに設定されたデータ型を結果とします。`default_x` が定義されていない場合、[デフォルト値](../../../sql-reference/statements/create/table.md#create-default-values)が使用されます。 +- `size` — 結果となる配列の長さ。オプションのパラメータ。このパラメータを使用する場合、デフォルト値 `default_x` を指定する必要があります。[UInt32](../../../sql-reference/data-types/int-uint.md#uint-ranges)。 + +**返される値** + +- 挿入された値を含む配列。 + +型: [Array](../../../sql-reference/data-types/array.md#data-type-array)。 + +**例** + +クエリ: + +``` sql +SELECT groupArrayInsertAt(toString(number), number * 2) FROM numbers(5); +``` + +結果: + +``` text +┌─groupArrayInsertAt(toString(number), multiply(number, 2))─┐ +│ ['0','','1','','2','','3','','4'] │ +└───────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT groupArrayInsertAt('-')(toString(number), number * 2) FROM numbers(5); +``` + +結果: + +``` text +┌─groupArrayInsertAt('-')(toString(number), multiply(number, 2))─┐ +│ ['0','-','1','-','2','-','3','-','4'] │ +└────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT groupArrayInsertAt('-', 5)(toString(number), number * 2) FROM numbers(5); +``` + +結果: + +``` text +┌─groupArrayInsertAt('-', 5)(toString(number), multiply(number, 2))─┐ +│ ['0','-','1','-','2'] │ +└───────────────────────────────────────────────────────────────────┘ +``` + +1つの位置に対するマルチスレッド挿入。 + +クエリ: + +``` sql +SELECT groupArrayInsertAt(number, 0) FROM numbers_mt(10) SETTINGS max_block_size = 1; +``` + +このクエリの結果として `[0,9]` 範囲のランダムな整数が得られます。例: + +``` text +┌─groupArrayInsertAt(number, 0)─┐ +│ [7] │ +└───────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparrayintersect.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparrayintersect.md new file mode 100644 index 00000000000..6bf1e83727a --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparrayintersect.md @@ -0,0 +1,50 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparrayintersect +sidebar_position: 141 +--- + +# groupArrayIntersect + +与えられた配列の共通部分を返します(すべての配列に含まれるアイテムを返します)。 + +**構文** + +``` sql +groupArrayIntersect(x) +``` + +**引数** + +- `x` — 引数(カラム名や式)。 + +**戻り値** + +- すべての配列に含まれる要素を持つ配列。 + +タイプ: [Array](../../data-types/array.md)。 + +**例** + +テーブル `numbers` を考えます: + +``` text +┌─a──────────────┐ +│ [1,2,4] │ +│ [1,5,2,8,-1,0] │ +│ [1,5,7,5,8,2] │ +└────────────────┘ +``` + +カラム名を引数として使用したクエリ: + +``` sql +SELECT groupArrayIntersect(a) as intersection FROM numbers; +``` + +結果: + +```text +┌─intersection──────┐ +│ [1, 2] │ +└───────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparraylast.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparraylast.md new file mode 100644 index 00000000000..96d53e88361 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparraylast.md @@ -0,0 +1,41 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparraylast +sidebar_position: 142 +--- + +# groupArrayLast + +構文: `groupArrayLast(max_size)(x)` + +最後の引数の値の配列を作成します。 +例えば、`groupArrayLast(1)(x)` は `[anyLast (x)]` に相当します。 + +場合によっては、実行順序に依存することも可能です。これは、`SELECT` が結果が十分に小さいサブクエリから `ORDER BY` を使用している場合に適用されます。 + +**例** + +クエリ: + +```sql +select groupArrayLast(2)(number+1) numbers from numbers(10) +``` + +結果: + +```text +┌─numbers─┐ +│ [9,10] │ +└─────────┘ +``` + +`groupArray` と比較すると: + +```sql +select groupArray(2)(number+1) numbers from numbers(10) +``` + +```text +┌─numbers─┐ +│ [1,2] │ +└─────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingavg.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingavg.md new file mode 100644 index 00000000000..9d96a0f0850 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingavg.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparraymovingavg +sidebar_position: 143 +--- + +# groupArrayMovingAvg + +入力値の移動平均を計算します。 + +``` sql +groupArrayMovingAvg(numbers_for_summing) +groupArrayMovingAvg(window_size)(numbers_for_summing) +``` + +この関数はウィンドウサイズをパラメーターとして取ることができます。指定しない場合、関数はカラム内の行数と同じサイズのウィンドウを取ります。 + +**引数** + +- `numbers_for_summing` — 数値データ型の値を結果とする[式](../../../sql-reference/syntax.md#syntax-expressions)。 +- `window_size` — 計算ウィンドウのサイズ。 + +**返される値** + +- 入力データと同じサイズと型の配列。 + +この関数は[ゼロに向かう丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。結果のデータ型にとって重要でない小数点以下の桁数を切り捨てます。 + +**例** + +サンプルテーブル `b`: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +クエリ: + +``` sql +SELECT + groupArrayMovingAvg(int) AS I, + groupArrayMovingAvg(float) AS F, + groupArrayMovingAvg(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F───────────────────────────────────┬─D─────────────────────┐ +│ [0,0,1,3] │ [0.275,0.82500005,1.9250001,3.8675] │ [0.27,0.82,1.92,3.86] │ +└───────────┴─────────────────────────────────────┴───────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingAvg(2)(int) AS I, + groupArrayMovingAvg(2)(float) AS F, + groupArrayMovingAvg(2)(dec) AS D +FROM t +``` + +``` text +┌─I─────────┬─F────────────────────────────────┬─D─────────────────────┐ +│ [0,1,3,5] │ [0.55,1.6500001,3.3000002,6.085] │ [0.55,1.65,3.30,6.08] │ +└───────────┴──────────────────────────────────┴───────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingsum.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingsum.md new file mode 100644 index 00000000000..9181d465bb5 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparraymovingsum.md @@ -0,0 +1,77 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparraymovingsum +sidebar_position: 144 +--- + +# groupArrayMovingSum + +入力値の移動合計を計算します。 + +``` sql +groupArrayMovingSum(numbers_for_summing) +groupArrayMovingSum(window_size)(numbers_for_summing) +``` + +この関数はウィンドウサイズをパラメータとして取ることができます。指定しない場合、関数はカラムの行数と同じウィンドウサイズを取ります。 + +**引数** + +- `numbers_for_summing` — 数値データ型の値を生成する[式](../../../sql-reference/syntax.md#syntax-expressions)。 +- `window_size` — 計算ウィンドウのサイズ。 + +**返される値** + +- 入力データと同じサイズと型の配列。 + +**例** + +サンプルテーブル: + +``` sql +CREATE TABLE t +( + `int` UInt8, + `float` Float32, + `dec` Decimal32(2) +) +ENGINE = TinyLog +``` + +``` text +┌─int─┬─float─┬──dec─┐ +│ 1 │ 1.1 │ 1.10 │ +│ 2 │ 2.2 │ 2.20 │ +│ 4 │ 4.4 │ 4.40 │ +│ 7 │ 7.77 │ 7.77 │ +└─────┴───────┴──────┘ +``` + +クエリ: + +``` sql +SELECT + groupArrayMovingSum(int) AS I, + groupArrayMovingSum(float) AS F, + groupArrayMovingSum(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,7,14] │ [1.1,3.3000002,7.7000003,15.47] │ [1.10,3.30,7.70,15.47] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` + +``` sql +SELECT + groupArrayMovingSum(2)(int) AS I, + groupArrayMovingSum(2)(float) AS F, + groupArrayMovingSum(2)(dec) AS D +FROM t +``` + +``` text +┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐ +│ [1,3,6,11] │ [1.1,3.3000002,6.6000004,12.17] │ [1.10,3.30,6.60,12.17] │ +└────────────┴─────────────────────────────────┴────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparraysample.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparraysample.md new file mode 100644 index 00000000000..8df22c38761 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparraysample.md @@ -0,0 +1,82 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparraysample +sidebar_position: 145 +--- + +# groupArraySample + +サンプル引数値の配列を作成します。生成される配列のサイズは `max_size` 要素に制限されています。引数値はランダムに選択され、配列に追加されます。 + +**構文** + +``` sql +groupArraySample(max_size[, seed])(x) +``` + +**引数** + +- `max_size` — 生成される配列の最大サイズ。 [UInt64](../../data-types/int-uint.md)。 +- `seed` — 乱数生成器のシード。オプション。[UInt64](../../data-types/int-uint.md)。デフォルト値: `123456`。 +- `x` — 引数(カラム名または式)。 + +**返される値** + +- ランダムに選ばれた `x` 引数の配列。 + +型: [Array](../../data-types/array.md)。 + +**例** + +テーブル `colors` を考えます: + +``` text +┌─id─┬─color──┐ +│ 1 │ red │ +│ 2 │ blue │ +│ 3 │ green │ +│ 4 │ white │ +│ 5 │ orange │ +└────┴────────┘ +``` + +カラム名を引数とするクエリ: + +``` sql +SELECT groupArraySample(3)(color) as newcolors FROM colors; +``` + +結果: + +```text +┌─newcolors──────────────────┐ +│ ['white','blue','green'] │ +└────────────────────────────┘ +``` + +異なるシードを指定したカラム名を引数とするクエリ: + +``` sql +SELECT groupArraySample(3, 987654321)(color) as newcolors FROM colors; +``` + +結果: + +```text +┌─newcolors──────────────────┐ +│ ['red','orange','green'] │ +└────────────────────────────┘ +``` + +式を引数とするクエリ: + +``` sql +SELECT groupArraySample(3)(concat('light-', color)) as newcolors FROM colors; +``` + +結果: + +```text +┌─newcolors───────────────────────────────────┐ +│ ['light-blue','light-orange','light-green'] │ +└─────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/grouparraysorted.md b/docs/ja/sql-reference/aggregate-functions/reference/grouparraysorted.md new file mode 100644 index 00000000000..d669012a2cd --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/grouparraysorted.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/grouparraysorted +sidebar_position: 146 +--- + +# groupArraySorted {#groupArraySorted} + +昇順で最初のN項目を含む配列を返します。 + +``` sql +groupArraySorted(N)(column) +``` + +**引数** + +- `N` – 返す要素の数。 + +- `column` – 値(整数、文字列、浮動小数点数、その他の汎用型)。 + +**例** + +最初の10個の数値を取得します。 + +``` sql +SELECT groupArraySorted(10)(number) FROM numbers(100) +``` + +``` text +┌─groupArraySorted(10)(number)─┐ +│ [0,1,2,3,4,5,6,7,8,9] │ +└──────────────────────────────┘ +``` + +カラム内のすべての数値の文字列実装を取得します: + +``` sql +SELECT groupArraySorted(5)(str) FROM (SELECT toString(number) as str FROM numbers(5)); +``` + +``` text +┌─groupArraySorted(5)(str)─┐ +│ ['0','1','2','3','4'] │ +└──────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitand.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitand.md new file mode 100644 index 00000000000..cef00ef8f07 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitand.md @@ -0,0 +1,47 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitand +sidebar_position: 147 +--- + +# groupBitAnd + +一連の数値に対してビット単位の`AND`を適用します。 + +``` sql +groupBitAnd(expr) +``` + +**引数** + +`expr` – `UInt*`または`Int*`型の結果となる式。 + +**戻り値** + +`UInt*`または`Int*`型の値。 + +**例** + +テストデータ: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +クエリ: + +``` sql +SELECT groupBitAnd(num) FROM t +``` + +ここで、`num`はテストデータを含むカラムです。 + +結果: + +``` text +binary decimal +00000100 = 4 +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitmap.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmap.md new file mode 100644 index 00000000000..0821d2b6057 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmap.md @@ -0,0 +1,45 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitmap +sidebar_position: 148 +--- + +# groupBitmap + +ビットマップまたは符号なし整数カラムからの集計計算を行い、`UInt64`型の基数を返します。`-State`のサフィックスを追加すると、[ビットマップオブジェクト](../../../sql-reference/functions/bitmap-functions.md)を返します。 + +``` sql +groupBitmap(expr) +``` + +**引数** + +`expr` – `UInt*` 型の結果をもたらす式。 + +**戻り値** + +`UInt64` 型の値。 + +**例** + +テストデータ: + +``` text +UserID +1 +1 +2 +3 +``` + +クエリ: + +``` sql +SELECT groupBitmap(UserID) as num FROM t +``` + +結果: + +``` text +num +3 +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapand.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapand.md new file mode 100644 index 00000000000..9712f495c27 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapand.md @@ -0,0 +1,47 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitmapand +sidebar_position: 149 +title: groupBitmapAnd +--- + +ビットマップカラムのAND計算を行い、戻り値は`UInt64`型の基数を返します。サフィックス`-State`を付加すると、[ビットマップオブジェクト](../../../sql-reference/functions/bitmap-functions.md)を返します。 + +``` sql +groupBitmapAnd(expr) +``` + +**引数** + +`expr` – `AggregateFunction(groupBitmap, UInt*)`型になる式。 + +**戻り値** + +`UInt64`型の値。 + +**例** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapAnd(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapAnd(z)─┐ +│ 3 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapAndState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapAndState(z)))─┐ +│ [6,8,10] │ +└──────────────────────────────────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapor.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapor.md new file mode 100644 index 00000000000..d62d4eecb5c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapor.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitmapor +sidebar_position: 150 +title: groupBitmapOr +--- + +ビットマップカラムのORを計算し、`UInt64`型の基数を返します。`-State`サフィックスを追加すると、[bitmap object](../../../sql-reference/functions/bitmap-functions.md)を返します。これは`groupBitmapMerge`に相当します。 + +``` sql +groupBitmapOr(expr) +``` + +**引数** + +`expr` – `AggregateFunction(groupBitmap, UInt*)`型を結果として得る式。 + +**戻り値** + +`UInt64`型の値。 + +**例** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapOr(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapOr(z)─┐ +│ 15 │ +└──────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapOrState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapOrState(z)))─┐ +│ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] │ +└─────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapxor.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapxor.md new file mode 100644 index 00000000000..df7ae63aaf2 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitmapxor.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitmapxor +sidebar_position: 151 +title: groupBitmapXor +--- + +ビットマップカラムのXORを計算し、UInt64型の基数を返します。サフィックス-Stateを追加すると、[ビットマップオブジェクト](../../../sql-reference/functions/bitmap-functions.md)を返します。 + +``` sql +groupBitmapOr(expr) +``` + +**引数** + +`expr` – `AggregateFunction(groupBitmap, UInt*)`型を返す式。 + +**返される値** + +`UInt64`型の値。 + +**例** + +``` sql +DROP TABLE IF EXISTS bitmap_column_expr_test2; +CREATE TABLE bitmap_column_expr_test2 +( + tag_id String, + z AggregateFunction(groupBitmap, UInt32) +) +ENGINE = MergeTree +ORDER BY tag_id; + +INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32)))); +INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32)))); + +SELECT groupBitmapXor(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─groupBitmapXor(z)─┐ +│ 10 │ +└───────────────────┘ + +SELECT arraySort(bitmapToArray(groupBitmapXorState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%'); +┌─arraySort(bitmapToArray(groupBitmapXorState(z)))─┐ +│ [1,3,5,6,8,10,11,13,14,15] │ +└──────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitor.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitor.md new file mode 100644 index 00000000000..566914abc29 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitor.md @@ -0,0 +1,47 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitor +sidebar_position: 152 +--- + +# groupBitOr + +一連の数値に対してビット単位の`OR`を適用します。 + +``` sql +groupBitOr(expr) +``` + +**引数** + +`expr` – 結果が`UInt*`または`Int*`型となる式。 + +**戻り値** + +`UInt*`または`Int*`型の値。 + +**例** + +テストデータ: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +クエリ: + +``` sql +SELECT groupBitOr(num) FROM t +``` + +ここで、`num`はテストデータを含むカラムです。 + +結果: + +``` text +binary decimal +01111101 = 125 +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupbitxor.md b/docs/ja/sql-reference/aggregate-functions/reference/groupbitxor.md new file mode 100644 index 00000000000..c14c98a66cc --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupbitxor.md @@ -0,0 +1,47 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupbitxor +sidebar_position: 153 +--- + +# groupBitXor + +一連の数値に対してビットごとの`XOR`を適用します。 + +``` sql +groupBitXor(expr) +``` + +**引数** + +`expr` – `UInt*`または`Int*`型の結果をもたらす式。 + +**戻り値** + +`UInt*`または`Int*`型の値。 + +**例** + +テストデータ: + +``` text +binary decimal +00101100 = 44 +00011100 = 28 +00001101 = 13 +01010101 = 85 +``` + +クエリ: + +``` sql +SELECT groupBitXor(num) FROM t +``` + +ここで、`num`はテストデータを持つカラムです。 + +結果: + +``` text +binary decimal +01101000 = 104 +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupconcat.md b/docs/ja/sql-reference/aggregate-functions/reference/groupconcat.md new file mode 100644 index 00000000000..89d59bf3123 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupconcat.md @@ -0,0 +1,90 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupconcat +sidebar_position: 363 +sidebar_label: groupConcat +title: groupConcat +--- + +文字列のグループから連結された文字列を計算します。区切り文字で区切ることも可能で、要素の最大数を制限することもできます。 + +**構文** + +``` sql +groupConcat[(delimiter [, limit])](expression); +``` + +**引数** + +- `expression` — 連結される文字列を出力する式またはカラム名。 +- `delimiter` — 連結される値を区切るために使われる[文字列](../../../sql-reference/data-types/string.md)。このパラメータはオプションで、指定しない場合は空の文字列がデフォルトとなります。 +- `limit` — 連結する要素の最大数を指定する正の[整数](../../../sql-reference/data-types/int-uint.md)。もし要素がそれ以上ある場合、超過した要素は無視されます。このパラメータもオプションです。 + +:::note +区切り文字が指定され、limitが指定されていない場合、区切り文字は最初のパラメータでなければなりません。区切り文字とlimitの両方が指定されている場合、区切り文字はlimitよりも前に指定する必要があります。 +::: + +**返される値** + +- カラムまたは式の連結された値からなる[文字列](../../../sql-reference/data-types/string.md)を返します。グループに要素がない、またはすべての要素がnullの場合、かつ関数がnull値のみの処理を指定していない場合、結果はnull値を持つnullableな文字列となります。 + +**例** + +入力テーブル: + +``` text +┌─id─┬─name─┐ +│ 1 │ John│ +│ 2 │ Jane│ +│ 3 │ Bob│ +└────┴──────┘ +``` + +1. 区切り文字なしの基本的な使用法: + +クエリ: + +``` sql +SELECT groupConcat(Name) FROM Employees; +``` + +結果: + +``` text +JohnJaneBob +``` + +すべての名前を区切りなしで一つの連続した文字列に連結します。 + + +2. 区切り文字としてカンマを使用する場合: + +クエリ: + +``` sql +SELECT groupConcat(', ')(Name) FROM Employees; +``` + +結果: + +``` text +John, Jane, Bob +``` + +この出力では、カンマとスペースで名前が区切られています。 + + +3. 連結する要素数の制限 + +クエリ: + +``` sql +SELECT groupConcat(', ', 2)(Name) FROM Employees; +``` + +結果: + +``` text +John, Jane +``` + +このクエリでは、テーブルにもっと名前があっても、最初の2つの名前だけが結果として表示されます。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/groupuniqarray.md b/docs/ja/sql-reference/aggregate-functions/reference/groupuniqarray.md new file mode 100644 index 00000000000..139b805b7f7 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/groupuniqarray.md @@ -0,0 +1,12 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/groupuniqarray +sidebar_position: 154 +--- + +# groupUniqArray + +構文: `groupUniqArray(x)` または `groupUniqArray(max_size)(x)` + +異なる引数の値から配列を作成します。メモリ消費は [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md) 関数と同じです。 + +第二のバージョン(`max_size` パラメータ付き)は、結果の配列のサイズを `max_size` 要素に制限します。例えば、`groupUniqArray(1)(x)` は `[any(x)]` と同等です。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/index.md b/docs/ja/sql-reference/aggregate-functions/reference/index.md new file mode 100644 index 00000000000..7a86030c56f --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/index.md @@ -0,0 +1,125 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/ +toc_folder_title: Reference +sidebar_position: 36 +toc_hidden: true +--- + +# 集約関数のリスト + +標準の集約関数: + +- [count](../reference/count.md) +- [min](../reference/min.md) +- [max](../reference/max.md) +- [sum](../reference/sum.md) +- [avg](../reference/avg.md) +- [any](../reference/any.md) +- [stddevPop](../reference/stddevpop.md) +- [stddevPopStable](../reference/stddevpopstable.md) +- [stddevSamp](../reference/stddevsamp.md) +- [stddevSampStable](../reference/stddevsampstable.md) +- [varPop](../reference/varpop.md) +- [varSamp](../reference/varsamp.md) +- [corr](../reference/corr.md) +- [corr](../reference/corrstable.md) +- [corrMatrix](../reference/corrmatrix.md) +- [covarPop](../reference/covarpop.md) +- [covarStable](../reference/covarpopstable.md) +- [covarPopMatrix](../reference/covarpopmatrix.md) +- [covarSamp](../reference/covarsamp.md) +- [covarSampStable](../reference/covarsampstable.md) +- [covarSampMatrix](../reference/covarsampmatrix.md) +- [entropy](../reference/entropy.md) +- [exponentialMovingAverage](../reference/exponentialmovingaverage.md) +- [intervalLengthSum](../reference/intervalLengthSum.md) +- [kolmogorovSmirnovTest](../reference/kolmogorovsmirnovtest.md) +- [mannwhitneyutest](../reference/mannwhitneyutest.md) +- [median](../reference/median.md) +- [rankCorr](../reference/rankCorr.md) +- [sumKahan](../reference/sumkahan.md) +- [studentTTest](../reference/studentttest.md) +- [welchTTest](../reference/welchttest.md) + +ClickHouse特有の集約関数: + +- [aggThrow](../reference/aggthrow.md) +- [analysisOfVariance](../reference/analysis_of_variance.md) +- [any](../reference/any.md) +- [anyHeavy](../reference/anyheavy.md) +- [anyLast](../reference/anylast.md) +- [boundingRatio](../reference/boundrat.md) +- [first_value](../reference/first_value.md) +- [last_value](../reference/last_value.md) +- [argMin](../reference/argmin.md) +- [argMax](../reference/argmax.md) +- [avgWeighted](../reference/avgweighted.md) +- [topK](../reference/topk.md) +- [topKWeighted](../reference/topkweighted.md) +- [deltaSum](../reference/deltasum.md) +- [deltaSumTimestamp](../reference/deltasumtimestamp.md) +- [flameGraph](../reference/flame_graph.md) +- [groupArray](../reference/grouparray.md) +- [groupArrayLast](../reference/grouparraylast.md) +- [groupUniqArray](../reference/groupuniqarray.md) +- [groupArrayInsertAt](../reference/grouparrayinsertat.md) +- [groupArrayMovingAvg](../reference/grouparraymovingavg.md) +- [groupArrayMovingSum](../reference/grouparraymovingsum.md) +- [groupArraySample](../reference/grouparraysample.md) +- [groupArraySorted](../reference/grouparraysorted.md) +- [groupArrayIntersect](../reference/grouparrayintersect.md) +- [groupBitAnd](../reference/groupbitand.md) +- [groupBitOr](../reference/groupbitor.md) +- [groupBitXor](../reference/groupbitxor.md) +- [groupBitmap](../reference/groupbitmap.md) +- [groupBitmapAnd](../reference/groupbitmapand.md) +- [groupBitmapOr](../reference/groupbitmapor.md) +- [groupBitmapXor](../reference/groupbitmapxor.md) +- [sumWithOverflow](../reference/sumwithoverflow.md) +- [sumMap](../reference/summap.md) +- [sumMapWithOverflow](../reference/summapwithoverflow.md) +- [sumMapFiltered](../parametric-functions.md/#summapfiltered) +- [sumMapFilteredWithOverflow](../parametric-functions.md/#summapfilteredwithoverflow) +- [minMap](../reference/minmap.md) +- [maxMap](../reference/maxmap.md) +- [skewSamp](../reference/skewsamp.md) +- [skewPop](../reference/skewpop.md) +- [kurtSamp](../reference/kurtsamp.md) +- [kurtPop](../reference/kurtpop.md) +- [uniq](../reference/uniq.md) +- [uniqExact](../reference/uniqexact.md) +- [uniqCombined](../reference/uniqcombined.md) +- [uniqCombined64](../reference/uniqcombined64.md) +- [uniqHLL12](../reference/uniqhll12.md) +- [uniqTheta](../reference/uniqthetasketch.md) +- [quantile](../reference/quantile.md) +- [quantiles](../reference/quantiles.md) +- [quantileExact](../reference/quantileexact.md) +- [quantileExactLow](../reference/quantileexact.md#quantileexactlow) +- [quantileExactHigh](../reference/quantileexact.md#quantileexacthigh) +- [quantileExactWeighted](../reference/quantileexactweighted.md) +- [quantileTiming](../reference/quantiletiming.md) +- [quantileTimingWeighted](../reference/quantiletimingweighted.md) +- [quantileDeterministic](../reference/quantiledeterministic.md) +- [quantileTDigest](../reference/quantiletdigest.md) +- [quantileTDigestWeighted](../reference/quantiletdigestweighted.md) +- [quantileBFloat16](../reference/quantilebfloat16.md#quantilebfloat16) +- [quantileBFloat16Weighted](../reference/quantilebfloat16.md#quantilebfloat16weighted) +- [quantileDD](../reference/quantileddsketch.md#quantileddsketch) +- [simpleLinearRegression](../reference/simplelinearregression.md) +- [singleValueOrNull](../reference/singlevalueornull.md) +- [stochasticLinearRegression](../reference/stochasticlinearregression.md) +- [stochasticLogisticRegression](../reference/stochasticlogisticregression.md) +- [categoricalInformationValue](../reference/categoricalinformationvalue.md) +- [contingency](../reference/contingency.md) +- [cramersV](../reference/cramersv.md) +- [cramersVBiasCorrected](../reference/cramersvbiascorrected.md) +- [theilsU](../reference/theilsu.md) +- [maxIntersections](../reference/maxintersections.md) +- [maxIntersectionsPosition](../reference/maxintersectionsposition.md) +- [meanZTest](../reference/meanztest.md) +- [quantileGK](../reference/quantileGK.md) +- [quantileInterpolatedWeighted](../reference/quantileinterpolatedweighted.md) +- [sparkBar](../reference/sparkbar.md) +- [sumCount](../reference/sumcount.md) +- [largestTriangleThreeBuckets](../reference/largestTriangleThreeBuckets.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/intervalLengthSum.md b/docs/ja/sql-reference/aggregate-functions/reference/intervalLengthSum.md new file mode 100644 index 00000000000..d7bd7ac1cd7 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/intervalLengthSum.md @@ -0,0 +1,108 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/intervalLengthSum +sidebar_position: 155 +sidebar_label: intervalLengthSum +title: intervalLengthSum +--- + +すべての範囲(数軸上のセグメント)の合併の総長を計算します。 + +**構文** + +``` sql +intervalLengthSum(start, end) +``` + +**引数** + +- `start` — インターバルの開始値。 [Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) または [Date](../../../sql-reference/data-types/date.md#data_type-date)。 +- `end` — インターバルの終了値。[Int32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Int64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt32](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64), [Float32](../../../sql-reference/data-types/float.md#float32-float64), [Float64](../../../sql-reference/data-types/float.md#float32-float64), [DateTime](../../../sql-reference/data-types/datetime.md#data_type-datetime) または [Date](../../../sql-reference/data-types/date.md#data_type-date)。 + +:::note +引数は同じデータ型である必要があります。そうでない場合、例外がスローされます。 +::: + +**戻り値** + +- すべての範囲(数軸上のセグメント)の合併の総長。引数の型に応じて、戻り値は [UInt64](../../../sql-reference/data-types/int-uint.md#uint8-uint16-uint32-uint64-int8-int16-int32-int64) または [Float64](../../../sql-reference/data-types/float.md#float32-float64) 型になります。 + +**例** + +1. 入力テーブル: + +``` text +┌─id─┬─start─┬─end─┐ +│ a │ 1.1 │ 2.9 │ +│ a │ 2.5 │ 3.2 │ +│ a │ 4 │ 5 │ +└────┴───────┴─────┘ +``` + +この例では、Float32 型の引数が使用されています。関数は Float64 型の値を返します。 + +結果は、インターバル `[1.1, 3.2]` (`[1.1, 2.9]` と `[2.5, 3.2]` の合併)と `[4, 5]` の長さの合計です。 + +クエリ: + +``` sql +SELECT id, intervalLengthSum(start, end), toTypeName(intervalLengthSum(start, end)) FROM fl_interval GROUP BY id ORDER BY id; +``` + +結果: + +``` text +┌─id─┬─intervalLengthSum(start, end)─┬─toTypeName(intervalLengthSum(start, end))─┐ +│ a │ 3.1 │ Float64 │ +└────┴───────────────────────────────┴───────────────────────────────────────────┘ +``` + +2. 入力テーブル: + +``` text +┌─id─┬───────────────start─┬─────────────────end─┐ +│ a │ 2020-01-01 01:12:30 │ 2020-01-01 02:10:10 │ +│ a │ 2020-01-01 02:05:30 │ 2020-01-01 02:50:31 │ +│ a │ 2020-01-01 03:11:22 │ 2020-01-01 03:23:31 │ +└────┴─────────────────────┴─────────────────────┘ +``` + +この例では、DateTime 型の引数が使用されています。関数は秒単位の値を返します。 + +クエリ: + +``` sql +SELECT id, intervalLengthSum(start, end), toTypeName(intervalLengthSum(start, end)) FROM dt_interval GROUP BY id ORDER BY id; +``` + +結果: + +``` text +┌─id─┬─intervalLengthSum(start, end)─┬─toTypeName(intervalLengthSum(start, end))─┐ +│ a │ 6610 │ UInt64 │ +└────┴───────────────────────────────┴───────────────────────────────────────────┘ +``` + +3. 入力テーブル: + +``` text +┌─id─┬──────start─┬────────end─┐ +│ a │ 2020-01-01 │ 2020-01-04 │ +│ a │ 2020-01-12 │ 2020-01-18 │ +└────┴────────────┴────────────┘ +``` + +この例では、Date 型の引数が使用されています。関数は日数単位の値を返します。 + +クエリ: + +``` sql +SELECT id, intervalLengthSum(start, end), toTypeName(intervalLengthSum(start, end)) FROM date_interval GROUP BY id ORDER BY id; +``` + +結果: + +``` text +┌─id─┬─intervalLengthSum(start, end)─┬─toTypeName(intervalLengthSum(start, end))─┐ +│ a │ 9 │ UInt64 │ +└────┴───────────────────────────────┴───────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/kolmogorovsmirnovtest.md b/docs/ja/sql-reference/aggregate-functions/reference/kolmogorovsmirnovtest.md new file mode 100644 index 00000000000..b0741890d21 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/kolmogorovsmirnovtest.md @@ -0,0 +1,114 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/kolmogorovsmirnovtest +sidebar_position: 156 +sidebar_label: kolmogorovSmirnovTest +--- + +# kolmogorovSmirnovTest + +2つの母集団からのサンプルにコルモゴロフ-スミルノフ検定を適用します。 + +**構文** + +``` sql +kolmogorovSmirnovTest([alternative, computation_method])(sample_data, sample_index) +``` + +両方のサンプルの値は `sample_data` カラムにあります。`sample_index` が0の場合、その行の値は最初の母集団からのサンプルに属します。それ以外の場合は、2番目の母集団からのサンプルに属します。 +サンプルは連続した一次元の確率分布に属している必要があります。 + +**引数** + +- `sample_data` — サンプルデータ。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `sample_index` — サンプルインデックス。 [Integer](../../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `alternative` — 代替仮説。(オプション、デフォルト: `'two-sided'`。)[String](../../../sql-reference/data-types/string.md)。 + F(x) と G(x) をそれぞれ最初と2番目の分布のCDFとします。 + - `'two-sided'` + 帰無仮説はサンプルが同じ分布から来ていることで、つまり F(x) = G(x) がすべての x において成り立つことです。 + 代替仮説は分布が同一でないということです。 + - `'greater'` + 帰無仮説は、最初のサンプル内の値が2番目のサンプルのものより*確率的に小さい*ということで、 + つまり最初の分布のCDFが2番目のものの上側(よって左側)にあるということです。 + これにより、すべての x において F(x) >= G(x) となります。この場合の代替は F(x) < G(x) の x が少なくとも1つ存在することです。 + - `'less'`。 + 帰無仮説は、最初のサンプル内の値が2番目のサンプルのものより*確率的に大きい*ということで、 + つまり最初の分布のCDFが2番目のものの下側(よって右側)にあるということです。 + これにより、すべての x において F(x) <= G(x) となります。この場合の代替は F(x) > G(x) の x が少なくとも1つ存在することです。 +- `computation_method` — p値を計算するために使用される方法。(オプション、デフォルト: `'auto'`。)[String](../../../sql-reference/data-types/string.md)。 + - `'exact'` - 検定統計量の正確な確率分布を使用して計算されます。計算量が多く、少量のサンプル以外では非効率です。 + - `'asymp'`(`'asymptotic'`) - 近似によって計算されます。大サンプルサイズの場合、正確p値と漸近p値は非常に似ています。 + - `'auto'` - サンプルの最大数が10,000未満の場合に `'exact'` メソッドを使用します。 + +**返される値** + +2つの要素を持つ[Tuple](../../../sql-reference/data-types/tuple.md): + +- 計算された統計量。 [Float64](../../../sql-reference/data-types/float.md)。 +- 計算されたp値。 [Float64](../../../sql-reference/data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT kolmogorovSmirnovTest('less', 'exact')(value, num) +FROM +( + SELECT + randNormal(0, 10) AS value, + 0 AS num + FROM numbers(10000) + UNION ALL + SELECT + randNormal(0, 10) AS value, + 1 AS num + FROM numbers(10000) +) +``` + +結果: + +``` text +┌─kolmogorovSmirnovTest('less', 'exact')(value, num)─┐ +│ (0.009899999999999996,0.37528595205132287) │ +└────────────────────────────────────────────────────┘ +``` + +注意: +p値が0.05より大きい(信頼レベル95%の場合)ため、帰無仮説は棄却されません。 + +クエリ: + +``` sql +SELECT kolmogorovSmirnovTest('two-sided', 'exact')(value, num) +FROM +( + SELECT + randStudentT(10) AS value, + 0 AS num + FROM numbers(100) + UNION ALL + SELECT + randNormal(0, 10) AS value, + 1 AS num + FROM numbers(100) +) +``` + +結果: + +``` text +┌─kolmogorovSmirnovTest('two-sided', 'exact')(value, num)─┐ +│ (0.4100000000000002,6.61735760482795e-8) │ +└─────────────────────────────────────────────────────────┘ +``` + +注意: +p値が0.05より小さい(信頼レベル95%の場合)ため、帰無仮説は棄却されます。 + +**参照** + +- [Kolmogorov-Smirnov'test](https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/kurtpop.md b/docs/ja/sql-reference/aggregate-functions/reference/kurtpop.md new file mode 100644 index 00000000000..d7056da5b95 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/kurtpop.md @@ -0,0 +1,26 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/kurtpop +sidebar_position: 157 +--- + +# kurtPop + +シーケンスの[尖度](https://en.wikipedia.org/wiki/Kurtosis)を計算します。 + +``` sql +kurtPop(expr) +``` + +**引数** + +`expr` — 数値を返す[式](../../../sql-reference/syntax.md#syntax-expressions)。 + +**戻り値** + +与えられた分布の尖度。型 — [Float64](../../../sql-reference/data-types/float.md) + +**例** + +``` sql +SELECT kurtPop(value) FROM series_with_value_column; +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/kurtsamp.md b/docs/ja/sql-reference/aggregate-functions/reference/kurtsamp.md new file mode 100644 index 00000000000..c3227b4b5d8 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/kurtsamp.md @@ -0,0 +1,28 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/kurtsamp +sidebar_position: 158 +--- + +# kurtSamp + +シーケンスの[標本尖度](https://en.wikipedia.org/wiki/Kurtosis)を計算します。 + +これは渡された値が標本を形成する場合、確率変数の尖度の無偏推定量を表します。 + +``` sql +kurtSamp(expr) +``` + +**引数** + +`expr` — 数値を返す[式](../../../sql-reference/syntax.md#syntax-expressions)。 + +**返される値** + +与えられた分布の尖度。型 — [Float64](../../../sql-reference/data-types/float.md)。もし `n <= 1`(`n` は標本のサイズ)なら、関数は `nan` を返します。 + +**例** + +``` sql +SELECT kurtSamp(value) FROM series_with_value_column; +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/largestTriangleThreeBuckets.md b/docs/ja/sql-reference/aggregate-functions/reference/largestTriangleThreeBuckets.md new file mode 100644 index 00000000000..87069e917cf --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/largestTriangleThreeBuckets.md @@ -0,0 +1,68 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/largestTriangleThreeBuckets +sidebar_position: 159 +sidebar_label: largestTriangleThreeBuckets +--- + +# largestTriangleThreeBuckets + +入力データに[Largest-Triangle-Three-Buckets](https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf)アルゴリズムを適用します。 +このアルゴリズムは、時系列データの可視化のためのダウンサンプリングに使用されます。x座標でソートされた系列に対して動作するように設計されています。 +ソートされた系列をバケットに分割し、各バケットで最も大きな三角形を見つけることで動作します。バケットの数は、結果のシリーズに含まれるポイントの数に等しいです。 +この関数は、データを`x`でソートし、その後ソートされたデータにダウンサンプリングアルゴリズムを適用します。 + +**構文** + +``` sql +largestTriangleThreeBuckets(n)(x, y) +``` + +エイリアス: `lttb`. + +**引数** + +- `x` — x座標。 [Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、[Decimal](../../../sql-reference/data-types/decimal.md)、[Date](../../../sql-reference/data-types/date.md)、[Date32](../../../sql-reference/data-types/date32.md)、[DateTime](../../../sql-reference/data-types/datetime.md)、[DateTime64](../../../sql-reference/data-types/datetime64.md)。 +- `y` — y座標。 [Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、[Decimal](../../../sql-reference/data-types/decimal.md)、[Date](../../../sql-reference/data-types/date.md)、[Date32](../../../sql-reference/data-types/date32.md)、[DateTime](../../../sql-reference/data-types/datetime.md)、[DateTime64](../../../sql-reference/data-types/datetime64.md)。 + +NaNは提供される系列から無視されます。つまり、NaN値は分析から除外されます。これにより、関数が有効な数値データのみに対して動作することが保証されます。 + +**パラメータ** + +- `n` — 結果の系列に含まれるポイント数。 [UInt64](../../../sql-reference/data-types/int-uint.md)。 + +**返される値** + +[Tuple](../../../sql-reference/data-types/tuple.md)と2つの要素を持つ[Array](../../../sql-reference/data-types/array.md)。 + +**例** + +入力テーブル: + +``` text +┌─────x───────┬───────y──────┐ +│ 1.000000000 │ 10.000000000 │ +│ 2.000000000 │ 20.000000000 │ +│ 3.000000000 │ 15.000000000 │ +│ 8.000000000 │ 60.000000000 │ +│ 9.000000000 │ 55.000000000 │ +│ 10.00000000 │ 70.000000000 │ +│ 4.000000000 │ 30.000000000 │ +│ 5.000000000 │ 40.000000000 │ +│ 6.000000000 │ 35.000000000 │ +│ 7.000000000 │ 50.000000000 │ +└─────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SELECT largestTriangleThreeBuckets(4)(x, y) FROM largestTriangleThreeBuckets_test; +``` + +結果: + +``` text +┌────────largestTriangleThreeBuckets(4)(x, y)───────────┐ +│ [(1,10),(3,15),(9,55),(10,70)] │ +└───────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/last_value.md b/docs/ja/sql-reference/aggregate-functions/reference/last_value.md new file mode 100644 index 00000000000..bc0c1af3105 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/last_value.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/last_value +sidebar_position: 160 +--- + +# last_value + +`anyLast` に似た最後に遭遇した値を選択しますが、NULL を受け入れることができます。 +主に[ウィンドウ関数](../../window-functions/index.md)と共に使用されます。 +ウィンドウ関数を使用しない場合、ソースストリームが順序付けされていない場合、結果はランダムになります。 + +## 例 + +```sql +CREATE TABLE test_data +( + a Int64, + b Nullable(Int64) +) +ENGINE = Memory; + +INSERT INTO test_data (a, b) Values (1,null), (2,3), (4, 5), (6,null) +``` + +### 例1 +デフォルトで NULL 値は無視されます。 +```sql +select last_value(b) from test_data +``` + +```text +┌─last_value_ignore_nulls(b)─┐ +│ 5 │ +└────────────────────────────┘ +``` + +### 例2 +NULL 値が無視されます。 +```sql +select last_value(b) ignore nulls from test_data +``` + +```text +┌─last_value_ignore_nulls(b)─┐ +│ 5 │ +└────────────────────────────┘ +``` + +### 例3 +NULL 値が受け入れられます。 +```sql +select last_value(b) respect nulls from test_data +``` + +```text +┌─last_value_respect_nulls(b)─┐ +│ ᴺᵁᴸᴸ │ +└─────────────────────────────┘ +``` + +### 例4 +`ORDER BY` を使ったサブクエリによる安定化した結果。 +```sql +SELECT + last_value_respect_nulls(b), + last_value(b) +FROM +( + SELECT * + FROM test_data + ORDER BY a ASC +) +``` + +```text +┌─last_value_respect_nulls(b)─┬─last_value(b)─┐ +│ ᴺᵁᴸᴸ │ 5 │ +└─────────────────────────────┴───────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/mannwhitneyutest.md b/docs/ja/sql-reference/aggregate-functions/reference/mannwhitneyutest.md new file mode 100644 index 00000000000..ffc4b286067 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/mannwhitneyutest.md @@ -0,0 +1,72 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/mannwhitneyutest +sidebar_position: 161 +sidebar_label: mannWhitneyUTest +--- + +# mannWhitneyUTest + +2つの母集団からのサンプルに対してMann-Whitney順位検定を適用します。 + +**構文** + +``` sql +mannWhitneyUTest[(alternative[, continuity_correction])](sample_data, sample_index) +``` + +両方のサンプルの値は`sample_data`カラムにあります。`sample_index`が0の場合、その行の値は最初の母集団からのサンプルに属します。それ以外の場合は、2番目の母集団からのサンプルに属します。帰無仮説は、2つの母集団が確率的に等しいというものです。また、片側の仮説をテストすることもできます。このテストはデータが正規分布していると仮定しません。 + +**引数** + +- `sample_data` — サンプルデータ。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `sample_index` — サンプルインデックス。 [Integer](../../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `alternative` — 対立仮説。(オプション、デフォルト: `'two-sided'`。) [String](../../../sql-reference/data-types/string.md)。 + - `'two-sided'`; + - `'greater'`; + - `'less'`。 +- `continuity_correction` — 0でない場合、p値の正規近似において連続性修正が適用されます。(オプション、デフォルト: 1。)[UInt64](../../../sql-reference/data-types/int-uint.md)。 + +**返される値** + +2つの要素を持つ[Tuple](../../../sql-reference/data-types/tuple.md): + +- 計算されたU統計量。 [Float64](../../../sql-reference/data-types/float.md)。 +- 計算されたp値。 [Float64](../../../sql-reference/data-types/float.md)。 + + +**例** + +入力テーブル: + +``` text +┌─sample_data─┬─sample_index─┐ +│ 10 │ 0 │ +│ 11 │ 0 │ +│ 12 │ 0 │ +│ 1 │ 1 │ +│ 2 │ 1 │ +│ 3 │ 1 │ +└─────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SELECT mannWhitneyUTest('greater')(sample_data, sample_index) FROM mww_ttest; +``` + +結果: + +``` text +┌─mannWhitneyUTest('greater')(sample_data, sample_index)─┐ +│ (9,0.04042779918503192) │ +└────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [Mann–Whitney U test](https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test) +- [確率順序](https://en.wikipedia.org/wiki/Stochastic_ordering) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/max.md b/docs/ja/sql-reference/aggregate-functions/reference/max.md new file mode 100644 index 00000000000..2b9735c0fca --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/max.md @@ -0,0 +1,23 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/max +sidebar_position: 162 +title: max +--- + +値のグループから最大値を計算する集計関数。 + +例: + +``` +SELECT max(salary) FROM employees; +``` + +``` +SELECT department, max(salary) FROM employees GROUP BY department; +``` + +集計関数ではない2つの値の最大を選択する必要がある場合は、`greatest`を参照してください: + +``` +SELECT greatest(a, b) FROM table; +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/maxintersections.md b/docs/ja/sql-reference/aggregate-functions/reference/maxintersections.md new file mode 100644 index 00000000000..99be72cdafa --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/maxintersections.md @@ -0,0 +1,64 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/maxintersections +sidebar_position: 163 +title: maxIntersections +--- + +# maxIntersections + +グループ内のインターバルがどれだけ多く交差するか(すべてのインターバルが少なくとも1回交差する場合)の最大数を計算する集約関数です。 + +構文は以下の通りです: + +```sql +maxIntersections(start_column, end_column) +``` + +**引数** + +- `start_column` – 各インターバルの開始を表す数値カラム。この`start_column`が`NULL`または0の場合、そのインターバルはスキップされます。 + +- `end_column` - 各インターバルの終了を表す数値カラム。この`end_column`が`NULL`または0の場合、そのインターバルはスキップされます。 + +**戻り値** + +交差しているインターバルの最大数を返します。 + +**例** + +```sql +CREATE TABLE my_events ( + start UInt32, + end UInt32 +) +Engine = MergeTree +ORDER BY tuple(); + +INSERT INTO my_events VALUES + (1, 3), + (1, 6), + (2, 5), + (3, 7); +``` + +それぞれのインターバルは以下のようになります: + +```response +1 - 3 +1 - - - - 6 + 2 - - 5 + 3 - - - 7 +``` + +これらのインターバルのうち3つが共通の値を持っています(値は`4`ですが、その共通の値自体は重要ではありません。交差の回数を測定しています)。インターバル`(1,3)`と`(3,7)`は終点を共有していますが、`maxIntersections`関数では交差しているとは見なされません。 + +```sql +SELECT maxIntersections(start, end) FROM my_events; +``` + +結果: +```response +3 +``` + +最大インターバルが複数回出現する場合は、[`maxIntersectionsPosition`関数](./maxintersectionsposition.md)を使用してそれらの出現回数と場所を特定できます。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/maxintersectionsposition.md b/docs/ja/sql-reference/aggregate-functions/reference/maxintersectionsposition.md new file mode 100644 index 00000000000..75c93aa8bad --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/maxintersectionsposition.md @@ -0,0 +1,64 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/maxintersectionsposition +sidebar_position: 164 +title: maxIntersectionsPosition +--- + +# maxIntersectionsPosition + +[`maxIntersections` 関数](./maxintersections.md) の出現位置を計算する集約関数です。 + +この構文は以下の通りです: + +```sql +maxIntersectionsPosition(start_column, end_column) +``` + +**引数** + +- `start_column` – 各区間の開始を表す数値のカラム。`start_column` が `NULL` または 0 の場合、その区間はスキップされます。 + +- `end_column` - 各区間の終了を表す数値のカラム。`end_column` が `NULL` または 0 の場合、その区間はスキップされます。 + +**返される値** + +最大数の区間が重なる開始位置を返します。 + +**例** + +```sql +CREATE TABLE my_events ( + start UInt32, + end UInt32 +) +Engine = MergeTree +ORDER BY tuple(); + +INSERT INTO my_events VALUES + (1, 3), + (1, 6), + (2, 5), + (3, 7); +``` + +区間は次のようになります: + +```response +1 - 3 +1 - - - - 6 + 2 - - 5 + 3 - - - 7 +``` + +これらの区間のうち3つが値4を共有しており、それは2番目の区間から始まっています: + +```sql +SELECT maxIntersectionsPosition(start, end) FROM my_events; +``` + +出力: +```response +2 +``` + +言い換えれば、`(1,6)` の行が3つの交差する区間の開始であり、3が交差する最大数の区間です。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/maxmap.md b/docs/ja/sql-reference/aggregate-functions/reference/maxmap.md new file mode 100644 index 00000000000..6a859c9f449 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/maxmap.md @@ -0,0 +1,51 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/maxmap +sidebar_position: 165 +--- + +# maxMap + +`key` 配列で指定されたキーに基づいて、`value` 配列からの最大値を計算します。 + +**構文** + +```sql +maxMap(key, value) +``` +または +```sql +maxMap(Tuple(key, value)) +``` + +エイリアス: `maxMappedArrays` + +:::note +- キーと値の配列のタプルを渡すことは、2つの配列(キーと値)を渡すことと同じです。 +- `key` と `value` の要素数は、合計される各行で同じでなければなりません。 +::: + +**パラメータ** + +- `key` — キーの配列。 [Array](../../data-types/array.md)。 +- `value` — 値の配列。 [Array](../../data-types/array.md)。 + +**返される値** + +- ソート順のキーの配列と、それに対応するキーに対する計算値の配列を持つタプルを返します。 [Tuple](../../data-types/tuple.md)([Array](../../data-types/array.md), [Array](../../data-types/array.md))。 + +**例** + +クエリ: + +``` sql +SELECT maxMap(a, b) +FROM values('a Array(Char), b Array(Int64)', (['x', 'y'], [2, 2]), (['y', 'z'], [3, 1])) +``` + +結果: + +``` text +┌─maxMap(a, b)───────────┐ +│ [['x','y','z'],[2,3,1]]│ +└────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/meanztest.md b/docs/ja/sql-reference/aggregate-functions/reference/meanztest.md new file mode 100644 index 00000000000..a8295f6f2c6 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/meanztest.md @@ -0,0 +1,66 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/meanztest +sidebar_position: 166 +sidebar_label: meanZTest +--- + +# meanZTest + +2つの母集団からのサンプルに平均z検定を適用します。 + +**構文** + +``` sql +meanZTest(population_variance_x, population_variance_y, confidence_level)(sample_data, sample_index) +``` + +両サンプルの値は `sample_data` カラムに入っています。`sample_index` が0の場合、その行の値は最初の母集団からのサンプルに属します。それ以外の場合、2番目の母集団からのサンプルに属します。帰無仮説は母集団の平均が等しいというものです。正規分布が仮定されます。母集団は不等分散かもしれず、分散は既知です。 + +**引数** + +- `sample_data` — サンプルデータ。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md) または [Decimal](../../../sql-reference/data-types/decimal.md)。 +- `sample_index` — サンプルインデックス。 [Integer](../../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `population_variance_x` — 母集団xの分散。 [Float](../../../sql-reference/data-types/float.md)。 +- `population_variance_y` — 母集団yの分散。 [Float](../../../sql-reference/data-types/float.md)。 +- `confidence_level` — 信頼区間を計算するための信頼水準。 [Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +4つの要素を持つ[Tuple](../../../sql-reference/data-types/tuple.md): + +- 計算されたt統計量。 [Float64](../../../sql-reference/data-types/float.md)。 +- 計算されたp値。 [Float64](../../../sql-reference/data-types/float.md)。 +- 計算された信頼区間下限。 [Float64](../../../sql-reference/data-types/float.md)。 +- 計算された信頼区間上限。 [Float64](../../../sql-reference/data-types/float.md)。 + +**例** + +入力テーブル: + +``` text +┌─sample_data─┬─sample_index─┐ +│ 20.3 │ 0 │ +│ 21.9 │ 0 │ +│ 22.1 │ 0 │ +│ 18.9 │ 1 │ +│ 19 │ 1 │ +│ 20.3 │ 1 │ +└─────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SELECT meanZTest(0.7, 0.45, 0.95)(sample_data, sample_index) FROM mean_ztest +``` + +結果: + +``` text +┌─meanZTest(0.7, 0.45, 0.95)(sample_data, sample_index)────────────────────────────┐ +│ (3.2841296025548123,0.0010229786769086013,0.8198428246768334,3.2468238419898365) │ +└──────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/median.md b/docs/ja/sql-reference/aggregate-functions/reference/median.md new file mode 100644 index 00000000000..3e2ce80d8b0 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/median.md @@ -0,0 +1,48 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/median +sidebar_position: 167 +--- + +# median + +`median*` 関数は、対応する `quantile*` 関数のエイリアスです。これらは数値データサンプルの中央値を計算します。 + +関数: + +- `median` — [quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile) のエイリアス。 +- `medianDeterministic` — [quantileDeterministic](../../../sql-reference/aggregate-functions/reference/quantiledeterministic.md#quantiledeterministic) のエイリアス。 +- `medianExact` — [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact) のエイリアス。 +- `medianExactWeighted` — [quantileExactWeighted](../../../sql-reference/aggregate-functions/reference/quantileexactweighted.md#quantileexactweighted) のエイリアス。 +- `medianTiming` — [quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming) のエイリアス。 +- `medianTimingWeighted` — [quantileTimingWeighted](../../../sql-reference/aggregate-functions/reference/quantiletimingweighted.md#quantiletimingweighted) のエイリアス。 +- `medianTDigest` — [quantileTDigest](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md#quantiletdigest) のエイリアス。 +- `medianTDigestWeighted` — [quantileTDigestWeighted](../../../sql-reference/aggregate-functions/reference/quantiletdigestweighted.md#quantiletdigestweighted) のエイリアス。 +- `medianBFloat16` — [quantileBFloat16](../../../sql-reference/aggregate-functions/reference/quantilebfloat16.md#quantilebfloat16) のエイリアス。 +- `medianDD` — [quantileDD](../../../sql-reference/aggregate-functions/reference/quantileddsketch.md#quantileddsketch) のエイリアス。 + +**例** + +入力テーブル: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +クエリ: + +``` sql +SELECT medianDeterministic(val, 1) FROM t; +``` + +結果: + +``` text +┌─medianDeterministic(val, 1)─┐ +│ 1.5 │ +└─────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/min.md b/docs/ja/sql-reference/aggregate-functions/reference/min.md new file mode 100644 index 00000000000..2d75117bab7 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/min.md @@ -0,0 +1,23 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/min +sidebar_position: 168 +title: min +--- + +グループ内の値の中から最小値を計算する集約関数です。 + +例: + +``` +SELECT min(salary) FROM employees; +``` + +``` +SELECT department, min(salary) FROM employees GROUP BY department; +``` + +2つの値から最小値を選択する非集約関数が必要な場合は、`least`を参照してください: + +``` +SELECT least(a, b) FROM table; +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/minmap.md b/docs/ja/sql-reference/aggregate-functions/reference/minmap.md new file mode 100644 index 00000000000..fda0493f083 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/minmap.md @@ -0,0 +1,51 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/minmap +sidebar_position: 169 +--- + +# minMap + +`key` 配列で指定されたキーに基づいて、`value` 配列から最小値を計算します。 + +**構文** + +```sql +`minMap(key, value)` +``` +または +```sql +minMap(Tuple(key, value)) +``` + +別名: `minMappedArrays` + +:::note +- キーのタプルと値の配列を渡すことは、キーの配列と値の配列を渡すことと同じです。 +- 合計される各行で、`key` と `value` の要素数は同じでなければなりません。 +::: + +**パラメータ** + +- `key` — キーの配列。[Array](../../data-types/array.md)。 +- `value` — 値の配列。[Array](../../data-types/array.md)。 + +**返される値** + +- ソート順に並べられたキーと、それに対応するキーのために計算された値の2つの配列を持つタプルを返します。[Tuple](../../data-types/tuple.md)([Array](../../data-types/array.md), [Array](../../data-types/array.md))。 + +**例** + +クエリ: + +``` sql +SELECT minMap(a, b) +FROM values('a Array(Int32), b Array(Int64)', ([1, 2], [2, 2]), ([2, 3], [1, 1])) +``` + +結果: + +``` text +┌─minMap(a, b)──────┐ +│ ([1,2,3],[2,1,1]) │ +└───────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantile.md b/docs/ja/sql-reference/aggregate-functions/reference/quantile.md new file mode 100644 index 00000000000..ab1a4d6171c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantile.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantile +sidebar_position: 170 +--- + +# quantile + +数値データ列の近似[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +この関数は、最大8192のリザーバーサイズを持つ[リザーバーサンプリング](https://en.wikipedia.org/wiki/Reservoir_sampling)とサンプリング用の乱数生成器を適用します。結果は非決定的です。正確な分位数を取得するには、[quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact)関数を使用してください。 + +`クエリ`で異なるレベルの複数の`quantile*`関数を使用する場合、内部状態は結合されません(つまり、`クエリ`は本来可能な効率で動作しません)。この場合は、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +空の数値列の場合、`quantile`はNaNを返しますが、`quantile*`のバリエーションはNaNまたは列型のデフォルト値を返します(バリエーションによります)。 + +**構文** + +``` sql +quantile(level)(expr) +``` + +別名: `median`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータ。0から1までの定数の浮動小数点数。`level`値として`[0.01, 0.99]`の範囲を使用することをお勧めします。デフォルト値: 0.5。`level=0.5`の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値型、[Date](../../../sql-reference/data-types/date.md)または[DateTime](../../../sql-reference/data-types/datetime.md)の結果となるカラム値への式。 + +**返される値** + +- 指定されたレベルの近似分位数。 + +型: + +- 数値データ型入力の場合は[Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が`Date`型の場合は[Date](../../../sql-reference/data-types/date.md)。 +- 入力値が`DateTime`型の場合は[DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +入力テーブル: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +クエリ: + +``` sql +SELECT quantile(val) FROM t +``` + +結果: + +``` text +┌─quantile(val)─┐ +│ 1.5 │ +└───────────────┘ +``` + +**参照** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileGK.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileGK.md new file mode 100644 index 00000000000..80533236537 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileGK.md @@ -0,0 +1,73 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileGK +sidebar_position: 175 +--- + +# quantileGK + +数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を[Greenwald-Khanna](http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf)アルゴリズムを使用して計算します。Greenwald-Khannaアルゴリズムはデータストリーム上で分位数を非常に効率的に計算するためのアルゴリズムです。2001年にMichael GreenwaldとSanjeev Khannaによって発表されました。このアルゴリズムは、リアルタイムで大規模なデータストリーム上で正確な分位数を計算する必要があるデータベースやビッグデータシステムで広く使用されています。アルゴリズムは非常に効率的で、O(log n)の空間とO(log log n)の時間で項目を処理します(ここでnは入力のサイズです)。また非常に正確で、高い確率で近似分位数の値を提供します。 + +`quantileGK`は、ClickHouseの他の分位数関数とは異なり、ユーザーが近似分位数結果の精度を制御することができます。 + +**構文** + +``` sql +quantileGK(accuracy, level)(expr) +``` + +エイリアス: `medianGK`. + +**引数** + +- `accuracy` — 分位数の精度。定数の正の整数。大きな精度値はエラーが少ないことを意味します。例えば、精度引数を100に設定すると、高い確率で計算された分位数のエラーは1%を超えません。計算された分位数の精度とアルゴリズムの計算複雑性との間にはトレードオフがあります。高い精度は、分位数を正確に計算するためにより多くのメモリと計算リソースを必要としますが、低い精度引数は、わずかに精度が低いものの、より高速でメモリエフィシェントな計算を可能にします。 + +- `level` — 分位数のレベル。オプションのパラメータ。0から1の範囲の定数浮動小数点数。デフォルト値: 0.5。`level=0.5`のとき、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 + +- `expr` — 数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)または[DateTime](../../../sql-reference/data-types/datetime.md)になるカラム値に対する式です。 + +**返される値** + +- 指定したレベルと精度の分位数。 + +タイプ: + +- 数値データ型入力の場合は[Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が`Date`型の場合は[Date](../../../sql-reference/data-types/date.md)。 +- 入力値が`DateTime`型の場合は[DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +``` sql +SELECT quantileGK(1, 0.25)(number + 1) +FROM numbers(1000) + +┌─quantileGK(1, 0.25)(plus(number, 1))─┐ +│ 1 │ +└──────────────────────────────────────┘ + +SELECT quantileGK(10, 0.25)(number + 1) +FROM numbers(1000) + +┌─quantileGK(10, 0.25)(plus(number, 1))─┐ +│ 156 │ +└───────────────────────────────────────┘ + +SELECT quantileGK(100, 0.25)(number + 1) +FROM numbers(1000) + +┌─quantileGK(100, 0.25)(plus(number, 1))─┐ +│ 251 │ +└────────────────────────────────────────┘ + +SELECT quantileGK(1000, 0.25)(number + 1) +FROM numbers(1000) + +┌─quantileGK(1000, 0.25)(plus(number, 1))─┐ +│ 249 │ +└─────────────────────────────────────────┘ +``` + +**参照** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantilebfloat16.md b/docs/ja/sql-reference/aggregate-functions/reference/quantilebfloat16.md new file mode 100644 index 00000000000..e216a738807 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantilebfloat16.md @@ -0,0 +1,66 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantilebfloat16 +sidebar_position: 171 +title: quantileBFloat16 +--- + +[bfloat16](https://en.wikipedia.org/wiki/Bfloat16_floating-point_format) 数値のサンプルから近似的な[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。`bfloat16` は、1ビットの符号ビット、8ビットの指数ビット、および7ビットの仮数ビットを持つ浮動小数点データ型です。関数は入力値を32ビット浮動小数点に変換し、最上位の16ビットを取り出します。次に `bfloat16` の分位数を計算し、結果を64ビットの浮動小数点にゼロビットを追加して変換します。関数は相対誤差が0.390625%以下の高速な分位数推定器です。 + +**構文** + +``` sql +quantileBFloat16[(level)](expr) +``` + +エイリアス: `medianBFloat16` + +**引数** + +- `expr` — 数値データを持つカラム。[整数](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md)。 + +**パラメータ** + +- `level` — 分位数のレベル。任意項目。可能な値は0から1までの範囲です。デフォルト値: 0.5。 [Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +- 指定されたレベルの近似的な分位数。 + +タイプ: [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 + +**例** + +入力テーブルには整数カラムと浮動小数点カラムがあります: + +``` text +┌─a─┬─────b─┐ +│ 1 │ 1.001 │ +│ 2 │ 1.002 │ +│ 3 │ 1.003 │ +│ 4 │ 1.004 │ +└───┴───────┘ +``` + +0.75分位数(第3四分位)を計算するクエリ: + +``` sql +SELECT quantileBFloat16(0.75)(a), quantileBFloat16(0.75)(b) FROM example_table; +``` + +結果: + +``` text +┌─quantileBFloat16(0.75)(a)─┬─quantileBFloat16(0.75)(b)─┐ +│ 3 │ 1 │ +└───────────────────────────┴───────────────────────────┘ +``` +例では、浮動小数点値がすべて `bfloat16` に変換されるときに1.0に切り捨てられていることに注意してください。 + +# quantileBFloat16Weighted + +`quantileBFloat16` に似ていますが、シーケンスメンバーの重みを考慮します。 + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileddsketch.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileddsketch.md new file mode 100644 index 00000000000..80db65da015 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileddsketch.md @@ -0,0 +1,61 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileddsketch +sidebar_position: 171 +title: quantileDD +--- + +サンプルの近似[分位数](https://en.wikipedia.org/wiki/Quantile)を相対誤差保証付きで計算します。これは[DD](https://www.vldb.org/pvldb/vol12/p2195-masson.pdf)を構築することで動作します。 + +**構文** + +``` sql +quantileDD(relative_accuracy, [level])(expr) +``` + +**引数** + +- `expr` — 数値データを含むカラム。 [Integer](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md). + +**パラメータ** + +- `relative_accuracy` — 分位数の相対精度。可能な値は0から1の範囲です。[Float](../../../sql-reference/data-types/float.md)。スケッチのサイズはデータの範囲と相対精度に依存します。範囲が大きく相対精度が小さいほど、スケッチは大きくなります。スケッチの大まかなメモリサイズは `log(max_value/min_value)/relative_accuracy` です。推奨値は0.001以上です。 + +- `level` — 分位数のレベル。省略可能。可能な値は0から1の範囲です。デフォルト値:0.5。[Float](../../../sql-reference/data-types/float.md). + +**返される値** + +- 指定されたレベルの近似分位数。 + +型: [Float64](../../../sql-reference/data-types/float.md#float32-float64). + +**例** + +入力テーブルは整数カラムと浮動小数点カラムを持ちます: + +``` text +┌─a─┬─────b─┐ +│ 1 │ 1.001 │ +│ 2 │ 1.002 │ +│ 3 │ 1.003 │ +│ 4 │ 1.004 │ +└───┴───────┘ +``` + +0.75-分位数(第3四分位)を計算するクエリ: + +``` sql +SELECT quantileDD(0.01, 0.75)(a), quantileDD(0.01, 0.75)(b) FROM example_table; +``` + +結果: + +``` text +┌─quantileDD(0.01, 0.75)(a)─┬─quantileDD(0.01, 0.75)(b)─┐ +│ 2.974233423476717 │ 1.01 │ +└─────────────────────────────────┴─────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiledeterministic.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiledeterministic.md new file mode 100644 index 00000000000..c49c552bdb8 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiledeterministic.md @@ -0,0 +1,68 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiledeterministic +sidebar_position: 172 +--- + +# quantileDeterministic + +数値データシーケンスの近似的な[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +この関数は、最大8192のリザーバサイズを持つ[リザーバサンプリング](https://en.wikipedia.org/wiki/Reservoir_sampling)とサンプリングの決定的なアルゴリズムを適用します。結果は決定論的です。正確な分位数を得るには、[quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact)関数を使用してください。 + +クエリで異なるレベルの複数の`quantile*`関数を使用する場合、内部状態は結合されません(つまり、クエリは効率的に動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +**構文** + +``` sql +quantileDeterministic(level)(expr, determinator) +``` + +エイリアス: `medianDeterministic`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータ。0から1までの定数浮動小数点数。`level`値は `[0.01, 0.99]` の範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5`では、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)または[DateTime](../../../sql-reference/data-types/datetime.md)のカラム値に基づく式。 +- `determinator` — リザーバサンプリングアルゴリズムでランダム数生成器の代わりに用いるハッシュが使用される数値。サンプリング結果を決定論的にするために利用されます。任意の決定論的な正の数値、例えばユーザーIDやイベントIDを使用できます。同じ`determinator`値が頻繁に出現する場合、関数は正しく動作しません。 + +**戻り値** + +- 指定されたレベルの近似的な分位数。 + +型: + +- 数値データ型入力の場合は[Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が`Date`型の場合は[Date](../../../sql-reference/data-types/date.md)。 +- 入力値が`DateTime`型の場合は[DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +入力テーブル: + +``` text +┌─val─┐ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +└─────┘ +``` + +クエリ: + +``` sql +SELECT quantileDeterministic(val, 1) FROM t +``` + +結果: + +``` text +┌─quantileDeterministic(val, 1)─┐ +│ 1.5 │ +└───────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileexact.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileexact.md new file mode 100644 index 00000000000..eee9d86fc6a --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileexact.md @@ -0,0 +1,271 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileexact +sidebar_position: 173 +--- + +# quantileExact 関数 + +## quantileExact + +数値データ列の[分位数](https://en.wikipedia.org/wiki/Quantile)を正確に計算します。 + +正確な値を取得するために、渡された全ての値は配列に結合され、部分的にソートされます。そのため、関数は `O(n)` のメモリを消費し、ここで `n` は渡された値の数です。ただし、少数の値の場合、この関数は非常に効果的です。 + +異なるレベルの複数の `quantile*` 関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) 関数を使用してください。 + +**構文** + +``` sql +quantileExact(level)(expr) +``` + +エイリアス: `medianExact`。 + +**引数** + +- `level` — 分位数のレベル。オプションのパラメーター。0から1までの定数の浮動小数点数。`level` 値を `[0.01, 0.99]` 範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値型の[データタイプ](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に結果するカラム値に対する式。 + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +SELECT quantileExact(number) FROM numbers(10) +``` + +結果: + +``` text +┌─quantileExact(number)─┐ +│ 5 │ +└───────────────────────┘ +``` + +## quantileExactLow + +`quantileExact` と同様に、数値データ列の正確な[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +正確な値を取得するために、渡された全ての値は配列に結合され、完全にソートされます。ソート[アルゴリズム](https://en.cppreference.com/w/cpp/algorithm/sort)の複雑さは `O(N·log(N))` であり、ここで `N = std::distance(first, last)` 比較があります。 + +返される値は分位数のレベルと選択内の要素数に依存します。例えば、レベルが0.5の場合、偶数個の要素には下位の中央値を返し、奇数個の要素には中央の中央値を返します。中央値は、pythonで使用される [median_low](https://docs.python.org/3/library/statistics.html#statistics.median_low) 実装と同様に計算されます。 + +他の全てのレベルでは、`level * size_of_array` の値に対応するインデックスの要素が返されます。例えば: + +``` sql +SELECT quantileExactLow(0.1)(number) FROM numbers(10) + +┌─quantileExactLow(0.1)(number)─┐ +│ 1 │ +└───────────────────────────────┘ +``` + +異なるレベルの複数の `quantile*` 関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) 関数を使用してください。 + +**構文** + +``` sql +quantileExactLow(level)(expr) +``` + +エイリアス: `medianExactLow`。 + +**引数** + +- `level` — 分位数のレベル。オプションのパラメーター。0から1までの定数の浮動小数点数。`level` 値を `[0.01, 0.99]` 範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値型の[データタイプ](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に結果するカラム値に対する式。 + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +SELECT quantileExactLow(number) FROM numbers(10) +``` + +結果: + +``` text +┌─quantileExactLow(number)─┐ +│ 4 │ +└──────────────────────────┘ +``` +## quantileExactHigh + +`quantileExact` と同様に、数値データ列の正確な[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +渡された全ての値は配列に結合され、正確な値を取得するために完全にソートされます。ソート[アルゴリズム](https://en.cppreference.com/w/cpp/algorithm/sort)の複雑さは `O(N·log(N))` であり、ここで `N = std::distance(first, last)` 比較があります。 + +返される値は分位数のレベルと選択内の要素数に依存します。例えば、レベルが0.5の場合、偶数個の要素には上位の中央値を返し、奇数個の要素には中央の中央値を返します。中央値は、pythonで使用される [median_high](https://docs.python.org/3/library/statistics.html#statistics.median_high) 実装と同様に計算されます。他の全てのレベルでは、`level * size_of_array` の値に対応するインデックスの要素が返されます。 + +この実装は、現在の `quantileExact` 実装と完全に同じように動作します。 + +異なるレベルの複数の `quantile*` 関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) 関数を使用してください。 + +**構文** + +``` sql +quantileExactHigh(level)(expr) +``` + +エイリアス: `medianExactHigh`。 + +**引数** + +- `level` — 分位数のレベル。オプションのパラメーター。0から1までの定数の浮動小数点数。`level` 値を `[0.01, 0.99]` 範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値型の[データタイプ](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に結果するカラム値に対する式。 + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +SELECT quantileExactHigh(number) FROM numbers(10) +``` + +結果: + +``` text +┌─quantileExactHigh(number)─┐ +│ 5 │ +└──────────────────────────┘ +``` + +## quantileExactExclusive + +数値データ列の[分位数](https://en.wikipedia.org/wiki/Quantile)を正確に計算します。 + +正確な値を取得するために、渡された全ての値は配列に結合され、部分的にソートされます。そのため、関数は `O(n)` のメモリを消費し、ここで `n` は渡された値の数です。ただし、少数の値の場合、この関数は非常に効果的です。 + +この関数は、Excel の [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba) 関数と同等であり、([タイプ R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample))です。 + +異なるレベルの `quantileExactExclusive` 関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合、[quantilesExactExclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactexclusive) 関数を使用してください。 + +**構文** + +``` sql +quantileExactExclusive(level)(expr) +``` + +**引数** + +- `expr` — 数値型の[データタイプ](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に結果するカラム値に対する式。 + +**パラメーター** + +- `level` — 分位数のレベル。オプション。(0, 1) — 範囲は含まれません。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。[Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantileExactExclusive(0.6)(x) FROM (SELECT number AS x FROM num); +``` + +結果: + +``` text +┌─quantileExactExclusive(0.6)(x)─┐ +│ 599.6 │ +└────────────────────────────────┘ +``` + +## quantileExactInclusive + +数値データ列の[分位数](https://en.wikipedia.org/wiki/Quantile)を正確に計算します。 + +正確な値を取得するために、渡された全ての値は配列に結合され、部分的にソートされます。そのため、関数は `O(n)` のメモリを消費し、ここで `n` は渡された値の数です。ただし、少数の値の場合、この関数は非常に効果的です。 + +この関数は、Excel の [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed) 関数と同等であり、([タイプ R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample))です。 + +異なるレベルの `quantileExactInclusive` 関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合、[quantilesExactInclusive](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantilesexactinclusive) 関数を使用してください。 + +**構文** + +``` sql +quantileExactInclusive(level)(expr) +``` + +**引数** + +- `expr` — 数値型の[データタイプ](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に結果するカラム値に対する式。 + +**パラメーター** + +- `level` — 分位数のレベル。オプション。[0, 1] — 範囲は含まれます。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。[Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantileExactInclusive(0.6)(x) FROM (SELECT number AS x FROM num); +``` + +結果: + +``` text +┌─quantileExactInclusive(0.6)(x)─┐ +│ 599.4 │ +└────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweighted.md new file mode 100644 index 00000000000..0911ef556cb --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweighted.md @@ -0,0 +1,68 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileexactweighted +sidebar_position: 174 +--- + +# quantileExactWeighted + +数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を各要素の重みを考慮して正確に計算します。 + +正確な値を取得するために、渡されたすべての値を配列に結合し、部分的にソートされます。各値はその重みとともにカウントされ、まるで `weight` 回出現するかのように扱われます。アルゴリズムではハッシュテーブルが使用されます。このため、渡された値が頻繁に繰り返される場合、関数は [quantileExact](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexact) よりもRAMを少なく消費します。この関数を `quantileExact` の代わりに使用し、重みを1に指定することができます。 + +クエリ内で異なるレベルの複数の `quantile*` 関数を使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的には動作しません)。その場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) 関数を使用してください。 + +**構文** + +``` sql +quantileExactWeighted(level)(expr, weight) +``` + +別名: `medianExactWeighted`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータ。0から1までの定数浮動小数点数。`level` 値は `[0.01, 0.99]` の範囲で使用することを推奨します。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[日付](../../../sql-reference/data-types/date.md)または[日時](../../../sql-reference/data-types/datetime.md)に結果を持つカラム値に対する式。 +- `weight` — シーケンスメンバーの重みを持つカラム。重みは [非負整数型](../../../sql-reference/data-types/int-uint.md)として値の出現回数です。 + +**返される値** + +- 指定されたレベルの分位数。 + +型: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力が `Date` 型の場合は [日付](../../../sql-reference/data-types/date.md)。 +- 入力が `DateTime` 型の場合は [日時](../../../sql-reference/data-types/datetime.md)。 + +**例** + +入力テーブル: + +``` text +┌─n─┬─val─┐ +│ 0 │ 3 │ +│ 1 │ 2 │ +│ 2 │ 1 │ +│ 5 │ 4 │ +└───┴─────┘ +``` + +クエリ: + +``` sql +SELECT quantileExactWeighted(n, val) FROM t +``` + +結果: + +``` text +┌─quantileExactWeighted(n, val)─┐ +│ 1 │ +└───────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweightedinterpolated.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweightedinterpolated.md new file mode 100644 index 00000000000..5e484a731d9 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileexactweightedinterpolated.md @@ -0,0 +1,77 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileExactWeightedInterpolated +sidebar_position: 176 +--- + +# quantileExactWeightedInterpolated + +数値データシーケンスの[quantile](https://en.wikipedia.org/wiki/Quantile)を線形補間を用いて計算し、各要素の重みを考慮します。 + +補間値を得るために、渡されたすべての値が配列に結合され、それらの対応する重みによってソートされます。その後、[加重パーセンタイル法](https://en.wikipedia.org/wiki/Percentile#The_weighted_percentile_method)を使用して重みに基づく累積分布を構築し、重みと値を用いた線形補間を行い、パーセンタイルを計算します。 + +異なる水準の複数の`quantile*`関数をクエリ内で使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的には動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +`quantileInterpolatedWeighted`よりも`quantileExactWeightedInterpolated`の方が正確なので、`quantileExactWeightedInterpolated`を使用することを強くお勧めします。以下に例を示します: + +``` sql +SELECT + quantileExactWeightedInterpolated(0.99)(number, 1), + quantile(0.99)(number), + quantileInterpolatedWeighted(0.99)(number, 1) +FROM numbers(9) + + +┌─quantileExactWeightedInterpolated(0.99)(number, 1)─┬─quantile(0.99)(number)─┬─quantileInterpolatedWeighted(0.99)(number, 1)─┐ +│ 7.92 │ 7.92 │ 8 │ +└────────────────────────────────────────────────────┴────────────────────────┴───────────────────────────────────────────────┘ +``` + +**構文** + +``` sql +quantileExactWeightedInterpolated(level)(expr, weight) +``` + +エイリアス: `medianExactWeightedInterpolated`. + +**引数** + +- `level` — パーセンタイルのレベル。オプションのパラメータ。0から1の間の定数浮動小数点数。`level`の値には `[0.01, 0.99]` の範囲を使用することをお勧めします。デフォルト値:0.5。`level=0.5` の場合、この関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)、または[DateTime](../../../sql-reference/data-types/datetime.md)に帰結するカラム値の式。 +- `weight` — シーケンスメンバーの重みを持つカラム。重みは[Unsigned integer型](../../../sql-reference/data-types/int-uint.md)の値の出現回数です。 + +**戻り値** + +- 指定されたレベルのパーセンタイル。 + +型: + +- 数値データ型入力の場合は[Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が`Date`型の場合は[Date](../../../sql-reference/data-types/date.md)。 +- 入力値が`DateTime`型の場合は[DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +入力テーブル: + +``` text +┌─n─┬─val─┐ +│ 0 │ 3 │ +│ 1 │ 2 │ +│ 2 │ 1 │ +│ 5 │ 4 │ +└───┴─────┘ +``` + +結果: + +``` text +┌─quantileExactWeightedInterpolated(n, val)─┐ +│ 1.5 │ +└───────────────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md new file mode 100644 index 00000000000..206f10d695b --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantileinterpolatedweighted.md @@ -0,0 +1,68 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantileInterpolatedWeighted +sidebar_position: 176 +--- + +# quantileInterpolatedWeighted + +数値データシーケンスの[分位](https://en.wikipedia.org/wiki/Quantile)を、各要素の重みを考慮して線形補間を用いて計算します。 + +補間された値を得るためには、渡されたすべての値を配列に結合し、それらを対応する重みによってソートします。その後、重みに基づく累積分布を構築し、[重み付きパーセンタイル法](https://en.wikipedia.org/wiki/Percentile#The_weighted_percentile_method)を使用して分位の線形補間を行います。 + +**複数の `quantile*` 関数を異なるレベルでクエリ内で使用する場合、内部状態は結合されません(つまり、クエリは効率的に動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) 関数を使用してください。** + +**構文** + +``` sql +quantileInterpolatedWeighted(level)(expr, weight) +``` + +エイリアス: `medianInterpolatedWeighted`. + +**引数** + +- `level` — 分位のレベル。オプションのパラメータ。0から1の範囲での定数浮動小数点数。`level` の値は `[0.01, 0.99]` の範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5` の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — カラム値に対する式で、数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md) または [DateTime](../../../sql-reference/data-types/datetime.md)を結果とします。 +- `weight` — シーケンスメンバーの重みを示すカラム。重みは値の出現回数を表します。 + +**返される値** + +- 指定されたレベルの分位。 + +型: + +- 数値データ型入力に対しては [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +入力テーブル: + +``` text +┌─n─┬─val─┐ +│ 0 │ 3 │ +│ 1 │ 2 │ +│ 2 │ 1 │ +│ 5 │ 4 │ +└───┴─────┘ +``` + +クエリ: + +``` sql +SELECT quantileInterpolatedWeighted(n, val) FROM t +``` + +結果: + +``` text +┌─quantileInterpolatedWeighted(n, val)─┐ +│ 1 │ +└──────────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiles.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiles.md new file mode 100644 index 00000000000..9d18171bfb8 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiles.md @@ -0,0 +1,171 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiles +sidebar_position: 177 +--- + +# quantiles 関数 + +## quantiles + +構文: `quantiles(level1, level2, ...)(x)` + +すべての分位関数には、対応する分位関数もあります: `quantiles`, `quantilesDeterministic`, `quantilesTiming`, `quantilesTimingWeighted`, `quantilesExact`, `quantilesExactWeighted`, `quantileExactWeightedInterpolated`, `quantileInterpolatedWeighted`, `quantilesTDigest`, `quantilesBFloat16`, `quantilesDD`。これらの関数は、指定されたレベルのすべての分位数を一度で計算し、結果の値の配列を返します。 + +## quantilesExactExclusive + +数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を正確に計算します。 + +正確な値を取得するために、すべての渡された値を配列に結合し、その後一部をソートします。そのため、この関数は渡された値の数 `n` に比例して `O(n)` のメモリを消費します。ただし、値の数が少ない場合、この関数は非常に効果的です。 + +この関数は Excel の [PERCENTILE.EXC](https://support.microsoft.com/en-us/office/percentile-exc-function-bbaa7204-e9e1-4010-85bf-c31dc5dce4ba) 関数に相当し、([型 R6](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)) に相当します。 + +[quantileExactExclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactexclusive) よりもセットレベルで効率的に動作します。 + +**構文** + +``` sql +quantilesExactExclusive(level1, level2, ...)(expr) +``` + +**引数** + +- `expr` — 数値 [データ型](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) または [DateTime](../../../sql-reference/data-types/datetime.md) 結果をもたらすカラム値に対する式。 + +**パラメータ** + +- `level` — 分位数のレベル。可能な値: (0, 1) — 境界を含まない。 [Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +- 指定されたレベルの分位数の [Array](../../../sql-reference/data-types/array.md)。 + +配列値の型: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantilesExactExclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x) FROM (SELECT number AS x FROM num); +``` + +結果: + +``` text +┌─quantilesExactExclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x)─┐ +│ [249.25,499.5,749.75,899.9,949.9499999999999,989.99,998.999] │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +## quantilesExactInclusive + +数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を正確に計算します。 + +正確な値を取得するために、すべての渡された値を配列に結合し、その後一部をソートします。そのため、この関数は渡された値の数 `n` に比例して `O(n)` のメモリを消費します。ただし、値の数が少ない場合、この関数は非常に効果的です。 + +この関数は Excel の [PERCENTILE.INC](https://support.microsoft.com/en-us/office/percentile-inc-function-680f9539-45eb-410b-9a5e-c1355e5fe2ed) 関数に相当し、([型 R7](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample)) に相当します。 + +[quantileExactInclusive](../../../sql-reference/aggregate-functions/reference/quantileexact.md#quantileexactinclusive) よりもセットレベルで効率的に動作します。 + +**構文** + +``` sql +quantilesExactInclusive(level1, level2, ...)(expr) +``` + +**引数** + +- `expr` — 数値 [データ型](../../../sql-reference/data-types/index.md#data_types), [Date](../../../sql-reference/data-types/date.md) または [DateTime](../../../sql-reference/data-types/datetime.md) 結果をもたらすカラム値に対する式。 + +**パラメータ** + +- `level` — 分位数のレベル。可能な値: [0, 1] — 境界を含む。 [Float](../../../sql-reference/data-types/float.md)。 + +**返される値** + +- 指定されたレベルの分位数の [Array](../../../sql-reference/data-types/array.md)。 + +配列値の型: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE num AS numbers(1000); + +SELECT quantilesExactInclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x) FROM (SELECT number AS x FROM num); +``` + +結果: + +``` text +┌─quantilesExactInclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x)─┐ +│ [249.75,499.5,749.25,899.1,949.05,989.01,998.001] │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +## quantilesGK + +`quantilesGK` は `quantileGK` に似た動作をし、異なるレベルでの分位数を同時に計算し、配列を返します。 + +**構文** + +``` sql +quantilesGK(accuracy, level1, level2, ...)(expr) +``` + +**返される値** + +- 指定されたレベルの分位数の [Array](../../../sql-reference/data-types/array.md)。 + +配列値の型: + +- 数値データ型入力の場合は [Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が `Date` 型の場合は [Date](../../../sql-reference/data-types/date.md)。 +- 入力値が `DateTime` 型の場合は [DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) +FROM numbers(1000) + +┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [1,1,1] │ +└──────────────────────────────────────────────────┘ + +SELECT quantilesGK(10, 0.25, 0.5, 0.75)(number + 1) +FROM numbers(1000) + +┌─quantilesGK(10, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [156,413,659] │ +└───────────────────────────────────────────────────┘ + + +SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) +FROM numbers(1000) + +┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [251,498,741] │ +└────────────────────────────────────────────────────┘ + +SELECT quantilesGK(1000, 0.25, 0.5, 0.75)(number + 1) +FROM numbers(1000) + +┌─quantilesGK(1000, 0.25, 0.5, 0.75)(plus(number, 1))─┐ +│ [249,499,749] │ +└─────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigest.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigest.md new file mode 100644 index 00000000000..7a495244070 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigest.md @@ -0,0 +1,58 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiletdigest +sidebar_position: 178 +--- + +# quantileTDigest + +[t-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf)アルゴリズムを使用して、数値データ列の近似的な[分位](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +メモリ消費は`log(n)`であり、ここで`n`は値の数です。結果はクエリの実行順序に依存しており、非決定的です。 + +この関数のパフォーマンスは、[quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile)や[quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming)のパフォーマンスよりも低くなっています。ステートサイズと精度の比率の観点では、この関数は`quantile`よりも優れています。 + +異なるレベルの`quantile*`関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは本来可能な効率よりも低効率で動作します)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +**構文** + +``` sql +quantileTDigest(level)(expr) +``` + +エイリアス: `medianTDigest`. + +**引数** + +- `level` — 分位のレベル。オプションのパラメータです。0から1までの定数浮動小数点数。`level`値を`[0.01, 0.99]`の範囲で使用することをお勧めします。デフォルト値は0.5です。`level=0.5`の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値[データ型](../../../sql-reference/data-types/index.md#data_types)、[Date](../../../sql-reference/data-types/date.md)または[DateTime](../../../sql-reference/data-types/datetime.md)を結果とするカラム値に対する式。 + +**返される値** + +- 指定されたレベルの近似的な分位。 + +型: + +- 数値データ型入力の場合: [Float64](../../../sql-reference/data-types/float.md) +- 入力値が`Date`型の場合: [Date](../../../sql-reference/data-types/date.md) +- 入力値が`DateTime`型の場合: [DateTime](../../../sql-reference/data-types/datetime.md) + +**例** + +クエリ: + +``` sql +SELECT quantileTDigest(number) FROM numbers(10) +``` + +結果: + +``` text +┌─quantileTDigest(number)─┐ +│ 4.5 │ +└─────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md new file mode 100644 index 00000000000..9b0d260c724 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiletdigestweighted.md @@ -0,0 +1,63 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiletdigestweighted +sidebar_position: 179 +--- + +# quantileTDigestWeighted + +数値データ列の近似的な[分位数](https://en.wikipedia.org/wiki/Quantile)を[t-digest](https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf)アルゴリズムを使用して計算します。この関数は各列要素の重みを考慮に入れます。最大誤差は1%です。メモリ消費は`log(n)`であり、ここで`n`は値の数です。 + +この関数のパフォーマンスは、[quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile)や[quantileTiming](../../../sql-reference/aggregate-functions/reference/quantiletiming.md#quantiletiming)のパフォーマンスよりも低いです。ただし、状態サイズと精度の比率に関しては、この関数は`quantile`よりも優れています。 + +結果はクエリを実行する順序に依存し、非決定的です。 + +異なるレベルの複数の`quantile*`関数をクエリに使用する場合、内部状態は結合されません(つまり、クエリは効率的には動作しません)。この場合、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +:::note +`quantileTDigestWeighted`を小さなデータセットで使用することは[推奨されません](https://github.com/tdunning/t-digest/issues/167#issuecomment-828650275)し、重大な誤差を引き起こす可能性があります。この場合、[`quantileTDigest`](../../../sql-reference/aggregate-functions/reference/quantiletdigest.md)の使用を考慮してください。 +::: + +**構文** + +``` sql +quantileTDigestWeighted(level)(expr, weight) +``` + +別名: `medianTDigestWeighted`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータです。0から1までの定数の浮動小数点数。`level`の値を`[0.01, 0.99]`の範囲で使用することをお勧めします。デフォルト値: 0.5。`level=0.5`では、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 +- `expr` — 数値データ型、[Date](../../../sql-reference/data-types/date.md)または[DateTime](../../../sql-reference/data-types/datetime.md)のカラム値の式。 +- `weight` — 列要素の重みを持つカラム。重みは値の出現回数です。 + +**返される値** + +- 指定されたレベルの近似的な分位数。 + +型: + +- 数値データ型入力の場合は[Float64](../../../sql-reference/data-types/float.md)。 +- 入力値が`Date`型の場合は[Date](../../../sql-reference/data-types/date.md)。 +- 入力値が`DateTime`型の場合は[DateTime](../../../sql-reference/data-types/datetime.md)。 + +**例** + +クエリ: + +``` sql +SELECT quantileTDigestWeighted(number, 1) FROM numbers(10) +``` + +結果: + +``` text +┌─quantileTDigestWeighted(number, 1)─┐ +│ 4.5 │ +└────────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiletiming.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiletiming.md new file mode 100644 index 00000000000..1150dfc6cf1 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiletiming.md @@ -0,0 +1,89 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiletiming +sidebar_position: 180 +--- + +# quantileTiming + +定められた精度で数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +結果は決定論的です(クエリ処理の順序には依存しません)。この関数は、ウェブページの読み込み時間やバックエンドの応答時間のような分布を説明するシーケンスでの動作に最適化されています。 + +異なるレベルの複数の`quantile*`関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは可能な限り効率的に動作しません)。この場合は、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +**構文** + +``` sql +quantileTiming(level)(expr) +``` + +エイリアス: `medianTiming`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータです。0から1までの定数の浮動小数点数。`level`の値は `[0.01, 0.99]` の範囲を使用することをお勧めします。デフォルト値は0.5です。`level=0.5`では、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 + +- `expr` — [カラム](../../../sql-reference/syntax.md#syntax-expressions)値に対する式で、[Float\*](../../../sql-reference/data-types/float.md)-タイプの数を返します。 + + - 負の値が関数に渡された場合、動作は未定義です。 + - 値が30,000を超える場合(ページ読み込み時間が30秒を超える場合)、30,000と見なされます。 + +**精度** + +計算は以下の場合に正確です: + +- 値の総数が5670を超えない場合。 +- 値の総数が5670を超えていても、ページ読み込み時間が1024ms未満の場合。 + +そうでない場合、計算結果は16msの倍数まで丸められます。 + +:::note +ページ読み込み時間の分位数を計算するには、この関数は[quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile)よりも効果的かつ正確です。 +::: + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: `Float32`. + +:::note +関数に値が渡されない場合(`quantileTimingIf`を使用している場合)、[NaN](../../../sql-reference/data-types/float.md#data_type-float-nan-inf)が返されます。これは、ゼロに至る結果と区別することを目的としています。`NaN`値の並べ替えに関する注意事項については、[ORDER BY句](../../../sql-reference/statements/select/order-by.md#select-order-by)を参照してください。 +::: + +**例** + +入力テーブル: + +``` text +┌─response_time─┐ +│ 72 │ +│ 112 │ +│ 126 │ +│ 145 │ +│ 104 │ +│ 242 │ +│ 313 │ +│ 168 │ +│ 108 │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT quantileTiming(response_time) FROM t +``` + +結果: + +``` text +┌─quantileTiming(response_time)─┐ +│ 126 │ +└───────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/quantiletimingweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/quantiletimingweighted.md new file mode 100644 index 00000000000..4335a1a6244 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/quantiletimingweighted.md @@ -0,0 +1,121 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/quantiletimingweighted +sidebar_position: 181 +--- + +# quantileTimingWeighted + +決定された精度で、それぞれのシーケンスメンバーの重みに基づいて、数値データシーケンスの[分位数](https://en.wikipedia.org/wiki/Quantile)を計算します。 + +この結果は決定論的(クエリ処理順序に依存しない)です。この関数は、ウェブページの読み込み時間やバックエンドの応答時間のような分布を記述するシーケンスでの作業に最適化されています。 + +異なるレベルの複数の`quantile*`関数をクエリで使用する場合、内部状態は結合されません(つまり、クエリは本来の効率より低下します)。この場合には、[quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles)関数を使用してください。 + +**構文** + +``` sql +quantileTimingWeighted(level)(expr, weight) +``` + +別名: `medianTimingWeighted`. + +**引数** + +- `level` — 分位数のレベル。オプションのパラメータ。0から1の範囲の定数の浮動小数点数。`level`の値は`[0.01, 0.99]`の範囲を推奨します。デフォルト値:0.5。`level=0.5`の場合、関数は[中央値](https://en.wikipedia.org/wiki/Median)を計算します。 + +- `expr` — [カラム](../../../sql-reference/syntax.md#syntax-expressions)値に対する式で、[Float\*](../../../sql-reference/data-types/float.md)型の番号を返します。 + + - 負の値が関数に渡された場合、その動作は未定義です。 + - 値が30,000(ページ読み込み時間が30秒以上)を超える場合、30,000とみなされます。 + +- `weight` — シーケンス要素の重みを持つカラム。重みは値の出現回数です。 + +**精度** + +計算は以下の場合に正確です: + +- 値の総数が5670を超えない場合。 +- 値の総数が5670を超えるが、ページ読み込み時間が1024ms未満の場合。 + +それ以外の場合、計算の結果は16msの倍数に丸められます。 + +:::note +ページ読み込み時間の分位数を計算するには、この関数は[quantile](../../../sql-reference/aggregate-functions/reference/quantile.md#quantile)よりも効率的で正確です。 +::: + +**返される値** + +- 指定されたレベルの分位数。 + +タイプ: `Float32`. + +:::note +関数に値が渡されない場合(`quantileTimingIf`を使用する場合)、[NaN](../../../sql-reference/data-types/float.md#data_type-float-nan-inf)が返されます。これは、結果がゼロとなる場合と区別するためです。`NaN`値のソートに関しては、[ORDER BY句](../../../sql-reference/statements/select/order-by.md#select-order-by)を参照してください。 +::: + +**例** + +入力テーブル: + +``` text +┌─response_time─┬─weight─┐ +│ 68 │ 1 │ +│ 104 │ 2 │ +│ 112 │ 3 │ +│ 126 │ 2 │ +│ 138 │ 1 │ +│ 162 │ 1 │ +└───────────────┴────────┘ +``` + +クエリ: + +``` sql +SELECT quantileTimingWeighted(response_time, weight) FROM t +``` + +結果: + +``` text +┌─quantileTimingWeighted(response_time, weight)─┐ +│ 112 │ +└───────────────────────────────────────────────┘ +``` + +# quantilesTimingWeighted + +`quantileTimingWeighted`と同様ですが、分位数レベルの複数のパラメータを受け取り、それらの分位数の多くの値で満たされた配列を返します。 + +**例** + +入力テーブル: + +``` text +┌─response_time─┬─weight─┐ +│ 68 │ 1 │ +│ 104 │ 2 │ +│ 112 │ 3 │ +│ 126 │ 2 │ +│ 138 │ 1 │ +│ 162 │ 1 │ +└───────────────┴────────┘ +``` + +クエリ: + +``` sql +SELECT quantilesTimingWeighted(0,5, 0.99)(response_time, weight) FROM t +``` + +結果: + +``` text +┌─quantilesTimingWeighted(0.5, 0.99)(response_time, weight)─┐ +│ [112,162] │ +└───────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [median](../../../sql-reference/aggregate-functions/reference/median.md#median) +- [quantiles](../../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/rankCorr.md b/docs/ja/sql-reference/aggregate-functions/reference/rankCorr.md new file mode 100644 index 00000000000..b96bdb9e20f --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/rankCorr.md @@ -0,0 +1,59 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/rankCorr +sidebar_position: 182 +--- + +# rankCorr + +順位相関係数を計算します。 + +**構文** + +``` sql +rankCorr(x, y) +``` + +**引数** + +- `x` — 任意の値。[Float32](../../../sql-reference/data-types/float.md#float32-float64) または [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 +- `y` — 任意の値。[Float32](../../../sql-reference/data-types/float.md#float32-float64) または [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 + +**返される値** + +- `x` と `y` のランクの順位相関係数を返します。相関係数の値は -1 から +1 の範囲です。2つ以上の引数が渡されない場合、関数は例外を返します。+1 に近い値は高い線形関係を示し、一つのランダム変数が増加するともう一つのランダム変数も増加します。-1 に近い値は高い線形関係を示し、一つのランダム変数が増加するともう一つのランダム変数が減少します。0 に近いまたは 0 の値は、2つのランダム変数間に関係がないことを示します。 + +型: [Float64](../../../sql-reference/data-types/float.md#float32-float64)。 + +**例** + +クエリ: + +``` sql +SELECT rankCorr(number, number) FROM numbers(100); +``` + +結果: + +``` text +┌─rankCorr(number, number)─┐ +│ 1 │ +└──────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT roundBankers(rankCorr(exp(number), sin(number)), 3) FROM numbers(100); +``` + +結果: + +``` text +┌─roundBankers(rankCorr(exp(number), sin(number)), 3)─┐ +│ -0.037 │ +└─────────────────────────────────────────────────────┘ +``` + +**参照** + +- [スピアマンの順位相関係数](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/simplelinearregression.md b/docs/ja/sql-reference/aggregate-functions/reference/simplelinearregression.md new file mode 100644 index 00000000000..e355ef7151b --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/simplelinearregression.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/simplelinearregression +sidebar_position: 183 +--- + +# simpleLinearRegression + +シンプル(一次元)の線形回帰を実行します。 + +``` sql +simpleLinearRegression(x, y) +``` + +パラメータ: + +- `x` — 説明変数の値を持つカラム。 +- `y` — 従属変数の値を持つカラム。 + +返される値: + +結果の直線 `y = k*x + b` の定数 `(k, b)`。 + +**例** + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])─┐ +│ (1,0) │ +└───────────────────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6]) +``` + +``` text +┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])─┐ +│ (1,3) │ +└───────────────────────────────────────────────────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/singlevalueornull.md b/docs/ja/sql-reference/aggregate-functions/reference/singlevalueornull.md new file mode 100644 index 00000000000..957efed270f --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/singlevalueornull.md @@ -0,0 +1,58 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/singlevalueornull +sidebar_position: 184 +--- + +# singleValueOrNull + +集計関数 `singleValueOrNull` は、`x = ALL (SELECT ...)` のようなサブクエリオペレーターを実装するために使用されます。データ内に一意の非NULL値が唯一あるかどうかを確認します。 +もし一意の値が一つだけある場合、その値を返します。ゼロまたは少なくとも二つ以上の異なる値がある場合、NULLを返します。 + +**構文** + +``` sql +singleValueOrNull(x) +``` + +**パラメーター** + +- `x` — 任意の[データ型](../../data-types/index.md)([Map](../../data-types/map.md)、[Array](../../data-types/array.md)、または[Tuple](../../data-types/tuple)で[Nullable](../../data-types/nullable.md)型になれないものを除く)のカラム。 + +**返される値** + +- 一意の非NULL値が一つだけある場合、その値。 +- ゼロまたは少なくとも二つ以上の異なる値がある場合、`NULL`。 + +**例** + +クエリ: + +``` sql +CREATE TABLE test (x UInt8 NULL) ENGINE=Log; +INSERT INTO test (x) VALUES (NULL), (NULL), (5), (NULL), (NULL); +SELECT singleValueOrNull(x) FROM test; +``` + +結果: + +```response +┌─singleValueOrNull(x)─┐ +│ 5 │ +└──────────────────────┘ +``` + +クエリ: + +```sql +INSERT INTO test (x) VALUES (10); +SELECT singleValueOrNull(x) FROM test; +``` + +結果: + +```response +┌─singleValueOrNull(x)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/skewpop.md b/docs/ja/sql-reference/aggregate-functions/reference/skewpop.md new file mode 100644 index 00000000000..913e0b12e70 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/skewpop.md @@ -0,0 +1,27 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/skewpop +sidebar_position: 185 +--- + +# skewPop + +シーケンスの[歪度](https://en.wikipedia.org/wiki/Skewness)を計算します。 + +``` sql +skewPop(expr) +``` + +**引数** + +`expr` — 数値を返す[式](../../../sql-reference/syntax.md#syntax-expressions)。 + +**戻り値** + +与えられた分布の歪度。型 — [Float64](../../../sql-reference/data-types/float.md) + +**例** + +``` sql +SELECT skewPop(value) FROM series_with_value_column; +``` + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/skewsamp.md b/docs/ja/sql-reference/aggregate-functions/reference/skewsamp.md new file mode 100644 index 00000000000..c638abc78c8 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/skewsamp.md @@ -0,0 +1,29 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/skewsamp +sidebar_position: 186 +--- + +# skewSamp + +シーケンスの[標本歪度](https://en.wikipedia.org/wiki/Skewness)を計算します。 + +渡された値がランダム変数の標本を形成する場合、その歪度の不偏推定量を表します。 + +``` sql +skewSamp(expr) +``` + +**引数** + +`expr` — 数値を返す[式](../../../sql-reference/syntax.md#syntax-expressions)。 + +**戻り値** + +指定された分布の歪度。型 — [Float64](../../../sql-reference/data-types/float.md)。`n <= 1`(`n`は標本のサイズ)の場合、関数は`nan`を返します。 + +**例** + +``` sql +SELECT skewSamp(value) FROM series_with_value_column; +``` + diff --git a/docs/ja/sql-reference/aggregate-functions/reference/sparkbar.md b/docs/ja/sql-reference/aggregate-functions/reference/sparkbar.md new file mode 100644 index 00000000000..eb8856e1477 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/sparkbar.md @@ -0,0 +1,63 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/sparkbar +sidebar_position: 187 +sidebar_label: sparkbar +--- + +# sparkbar + +この関数は、値 `x` とこれらの値の繰り返し頻度 `y` に基づいて、区間 `[min_x, max_x]` の頻度ヒストグラムをプロットします。 +同じバケットに入るすべての `x` の繰り返しは平均されるため、事前にデータを集約しておく必要があります。 +負の繰り返しは無視されます。 + +もし区間が指定されていない場合、最小の `x` が区間の開始として使われ、最大の `x` が区間の終了として使われます。 +それ以外の場合、区間外の値は無視されます。 + +**構文** + +``` sql +sparkbar(buckets[, min_x, max_x])(x, y) +``` + +**パラメータ** + +- `buckets` — セグメント数。型: [Integer](../../../sql-reference/data-types/int-uint.md)。 +- `min_x` — 区間の開始。オプションのパラメータ。 +- `max_x` — 区間の終了。オプションのパラメータ。 + +**引数** + +- `x` — 値のフィールド。 +- `y` — 値の頻度のフィールド。 + +**戻り値** + +- 頻度ヒストグラム。 + +**例** + +クエリ: + +``` sql +CREATE TABLE spark_bar_data (`value` Int64, `event_date` Date) ENGINE = MergeTree ORDER BY event_date; + +INSERT INTO spark_bar_data VALUES (1,'2020-01-01'), (3,'2020-01-02'), (4,'2020-01-02'), (-3,'2020-01-02'), (5,'2020-01-03'), (2,'2020-01-04'), (3,'2020-01-05'), (7,'2020-01-06'), (6,'2020-01-07'), (8,'2020-01-08'), (2,'2020-01-11'); + +SELECT sparkbar(9)(event_date,cnt) FROM (SELECT sum(value) as cnt, event_date FROM spark_bar_data GROUP BY event_date); + +SELECT sparkbar(9, toDate('2020-01-01'), toDate('2020-01-10'))(event_date,cnt) FROM (SELECT sum(value) as cnt, event_date FROM spark_bar_data GROUP BY event_date); +``` + +結果: + +``` text +┌─sparkbar(9)(event_date, cnt)─┐ +│ ▂▅▂▃▆█ ▂ │ +└──────────────────────────────┘ + +┌─sparkbar(9, toDate('2020-01-01'), toDate('2020-01-10'))(event_date, cnt)─┐ +│ ▂▅▂▃▇▆█ │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +この関数の別名は sparkBar です。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stddevpop.md b/docs/ja/sql-reference/aggregate-functions/reference/stddevpop.md new file mode 100644 index 00000000000..0dc069cadb1 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stddevpop.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stddevpop +sidebar_position: 188 +--- + +# stddevPop + +結果は [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) の平方根と等しいです。 + +別名: `STD`, `STDDEV_POP`. + +:::note +この関数は数値的に不安定なアルゴリズムを使用します。計算において[数値安定性](https://en.wikipedia.org/wiki/Numerical_stability)が必要な場合は、[`stddevPopStable`](../reference/stddevpopstable.md) 関数を使用してください。この関数はより遅く動作しますが、計算誤差が低くなります。 +::: + +**構文** + +```sql +stddevPop(x) +``` + +**パラメーター** + +- `x`: 標準偏差を求める値の集合。 [(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**戻り値** + +- `x` の標準偏差の平方根。 [Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + population UInt8, +) +ENGINE = Log; + +INSERT INTO test_data VALUES (3),(3),(3),(4),(4),(5),(5),(7),(11),(15); + +SELECT + stddevPop(population) AS stddev +FROM test_data; +``` + +結果: + +```response +┌────────────stddev─┐ +│ 3.794733192202055 │ +└───────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stddevpopstable.md b/docs/ja/sql-reference/aggregate-functions/reference/stddevpopstable.md new file mode 100644 index 00000000000..7d861d03413 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stddevpopstable.md @@ -0,0 +1,49 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stddevpopstable +sidebar_position: 189 +--- + +# stddevPopStable + +この結果は [varPop](../../../sql-reference/aggregate-functions/reference/varpop.md) の平方根に等しいです。[`stddevPop`](../reference/stddevpop.md) と異なり、この関数は数値的に安定したアルゴリズムを使用します。計算速度は遅くなりますが、計算誤差を少なく抑えることができます。 + +**構文** + +```sql +stddevPopStable(x) +``` + +**パラメータ** + +- `x`: 標準偏差を求める値の母集団。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**返される値** + +`x` の標準偏差の平方根。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + population Float64, +) +ENGINE = Log; + +INSERT INTO test_data SELECT randUniform(5.5, 10) FROM numbers(1000000) + +SELECT + stddevPopStable(population) AS stddev +FROM test_data; +``` + +結果: + +```response +┌─────────────stddev─┐ +│ 1.2999977786592576 │ +└────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stddevsamp.md b/docs/ja/sql-reference/aggregate-functions/reference/stddevsamp.md new file mode 100644 index 00000000000..e3f3f009a1e --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stddevsamp.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stddevsamp +sidebar_position: 190 +--- + +# stddevSamp + +この結果は [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) の平方根に等しいです。 + +別名: `STDDEV_SAMP` + +:::note +この関数は数値的に不安定なアルゴリズムを使用しています。計算において[数値的安定性](https://en.wikipedia.org/wiki/Numerical_stability)が必要な場合は、[`stddevSampStable`](../reference/stddevsampstable.md) 関数を使用してください。この関数は速度が遅くなりますが、計算誤差が小さくなります。 +::: + +**構文** + +```sql +stddevSamp(x) +``` + +**パラメーター** + +- `x`: 標本分散の平方根を求めるための値。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**戻り値** + +`x` の標本分散の平方根。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + population UInt8, +) +ENGINE = Log; + +INSERT INTO test_data VALUES (3),(3),(3),(4),(4),(5),(5),(7),(11),(15); + +SELECT + stddevSamp(population) +FROM test_data; +``` + +結果: + +```response +┌─stddevSamp(population)─┐ +│ 4 │ +└────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stddevsampstable.md b/docs/ja/sql-reference/aggregate-functions/reference/stddevsampstable.md new file mode 100644 index 00000000000..8aea160d2f5 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stddevsampstable.md @@ -0,0 +1,49 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stddevsampstable +sidebar_position: 191 +--- + +# stddevSampStable + +結果は [varSamp](../../../sql-reference/aggregate-functions/reference/varsamp.md) の平方根と等しいです。 [`stddevSamp`](../reference/stddevsamp.md) とは異なり、この関数は数値的に安定したアルゴリズムを使用します。動作は遅いですが、計算誤差が少ないです。 + +**構文** + +```sql +stddevSampStable(x) +``` + +**パラメータ** + +- `x`: 標本分散の平方根を求める値。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**返される値** + +`x` の標本分散の平方根。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + population UInt8, +) +ENGINE = Log; + +INSERT INTO test_data VALUES (3),(3),(3),(4),(4),(5),(5),(7),(11),(15); + +SELECT + stddevSampStable(population) +FROM test_data; +``` + +結果: + +```response +┌─stddevSampStable(population)─┐ +│ 4 │ +└──────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stochasticlinearregression.md b/docs/ja/sql-reference/aggregate-functions/reference/stochasticlinearregression.md new file mode 100644 index 00000000000..a3c6fc9f19d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stochasticlinearregression.md @@ -0,0 +1,76 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stochasticlinearregression +sidebar_position: 192 +--- + +# stochasticLinearRegression {#agg_functions_stochasticlinearregression_parameters} + +この関数は確率的線形回帰を実装します。学習率、L2正則化係数、ミニバッチサイズのカスタムパラメータをサポートし、重み更新のためにいくつかの方法を持っています(デフォルトで使用される[Adam](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Adam)、[simple SGD](https://en.wikipedia.org/wiki/Stochastic_gradient_descent)、[Momentum](https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum)、および[Nesterov](https://mipt.ru/upload/medialibrary/d7e/41-91.pdf))。 + +### パラメータ + +4つのカスタマイズ可能なパラメータがあります。これらは順番に関数に渡されますが、すべてを渡す必要はありません - デフォルト値が使用されますが、良いモデルにはパラメータの調整が必要です。 + +``` text +stochasticLinearRegression(0.00001, 0.1, 15, 'Adam') +``` + +1. `学習率` は勾配降下法のステップが行われる際のステップ長の係数です。学習率が大きすぎるとモデルの重みが無限大になる可能性があります。デフォルトは `0.00001` です。 +2. `L2正則化係数` で、過学習を防ぐのに役立つかもしれません。デフォルトは `0.1` です。 +3. `ミニバッチサイズ` は勾配が計算されて1ステップの勾配降下を実行する要素の数を設定します。純粋な確率的降下は1つの要素を使用しますが、小さなバッチ(約10要素)を使用することで勾配ステップがより安定します。デフォルトは `15` です。 +4. `重み更新のための方法` は、`Adam`(デフォルト)、`SGD`、`Momentum`、`Nesterov` です。`Momentum`と`Nesterov`は計算とメモリが少し多く必要ですが、収束の速さと確率的勾配法の安定性において有用であることがあります。 + +### 使用法 + +`stochasticLinearRegression`は、モデルのフィッティングと新しいデータへの予測の2つのステップで使用されます。モデルをフィットしてその状態を後で使用するために保存するには、`-State` コンビネータを使用します。これは状態(例:モデルの重み)を保存します。 +予測するためには、[evalMLMethod](../../../sql-reference/functions/machine-learning-functions.md#machine_learning_methods-evalmlmethod)関数を使用します。この関数は、予測する特徴とともに状態を引数として受け取ります。 + + + +**1.** フィッティング + +以下のようなクエリを使用することができます。 + +``` sql +CREATE TABLE IF NOT EXISTS train_data +( + param1 Float64, + param2 Float64, + target Float64 +) ENGINE = Memory; + +CREATE TABLE your_model ENGINE = Memory AS SELECT +stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, param1, param2) +AS state FROM train_data; +``` + +ここでは、`train_data` テーブルにデータを挿入する必要があります。パラメータの数は固定されておらず、`linearRegressionState`に渡される引数の数にのみ依存します。すべて数値でなければなりません。 +予測したい対象値を持つカラムは、最初の引数として挿入されます。 + +**2.** 予測 + +テーブルに状態を保存した後、それを複数回使用して予測を行うことができますし、他の状態と結合して新しい、さらに優れたモデルを作成することもできます。 + +``` sql +WITH (SELECT state FROM your_model) AS model SELECT +evalMLMethod(model, param1, param2) FROM test_data +``` + +このクエリは予測値のカラムを返します。`evalMLMethod` の最初の引数は `AggregateFunctionState` オブジェクトであり、その後が特徴のカラムです。 + +`test_data`は`train_data`と同様のテーブルですが、対象値が含まれていない可能性があります。 + +### 注意 + +1. 2つのモデルをマージするためにユーザーはこのようなクエリを作成できます: + `sql SELECT state1 + state2 FROM your_models` + ここで `your_models` テーブルは両方のモデルを含みます。このクエリは新しい `AggregateFunctionState` オブジェクトを返します。 + +2. ユーザーは、`-State` コンビネータが使用されていない場合作成したモデルの重みを保存せずに取得することができます。 + `sql SELECT stochasticLinearRegression(0.01)(target, param1, param2) FROM train_data` + このようなクエリはモデルをフィットし、その重みを返します - 最初はモデルのパラメータに対応する重みで、最後がバイアスです。上記の例では、クエリは3つの値を持つカラムを返します。 + +**参照** + +- [stochasticLogisticRegression](../../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#stochasticlogisticregression) +- [線形回帰とロジスティック回帰の違い](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md b/docs/ja/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md new file mode 100644 index 00000000000..2c62ac2b2ef --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/stochasticlogisticregression.md @@ -0,0 +1,55 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/stochasticlogisticregression +sidebar_position: 193 +--- + +# stochasticLogisticRegression + +この関数は確率的ロジスティック回帰を実装します。これは二値分類問題に使用でき、stochasticLinearRegressionと同じカスタムパラメータをサポートし、同様に動作します。 + +### パラメータ + +パラメータはstochasticLinearRegressionと全く同じです: +`学習率`、`L2正則化係数`、`ミニバッチサイズ`、`重みを更新する方法`。詳細については[パラメータ](../reference/stochasticlinearregression.md/#parameters)を参照してください。 + +``` text +stochasticLogisticRegression(1.0, 1.0, 10, 'SGD') +``` + +**1.** フィッティング + + + + `Fitting`セクションの説明については、[stochasticLinearRegression](#stochasticlinearregression-usage-fitting)を参照してください。 + + 予測されるラベルは\[-1, 1\]でなければなりません。 + +**2.** 予測 + + + + 保存された状態を使用して、オブジェクトがラベル`1`を持つ確率を予測できます。 + + ``` sql + WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) FROM test_data + ``` + + クエリは確率のカラムを返します。`evalMLMethod`の最初の引数は`AggregateFunctionState`オブジェクトであり、その次に特徴のカラムが続きます。 + + また、異なるラベルを要素に割り当てる確率の境界を設定することもできます。 + + ``` sql + SELECT ans < 1.1 AND ans > 0.5 FROM + (WITH (SELECT state FROM your_model) AS model SELECT + evalMLMethod(model, param1, param2) AS ans FROM test_data) + ``` + + これにより、結果はラベルになります。 + + `test_data`は`train_data`のようなテーブルですが、目標値を含まない場合もあります。 + +**関連項目** + +- [stochasticLinearRegression](../../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md#agg_functions-stochasticlinearregression) +- [線形回帰とロジスティック回帰の違い。](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/studentttest.md b/docs/ja/sql-reference/aggregate-functions/reference/studentttest.md new file mode 100644 index 00000000000..e04e64f3b33 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/studentttest.md @@ -0,0 +1,71 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/studentttest +sidebar_position: 194 +sidebar_label: studentTTest +--- + +# studentTTest + +2つの母集団のサンプルに対してスチューデントのt検定を適用します。 + +**構文** + +``` sql +studentTTest([confidence_level])(sample_data, sample_index) +``` + +両サンプルの値は`sample_data`カラムにあります。`sample_index`が0の場合、その行の値は最初の母集団からのサンプルに属します。それ以外の場合は2番目の母集団からのサンプルに属します。帰無仮説は母集団の平均が等しいとしています。正規分布で等しい分散を仮定します。 + +**引数** + +- `sample_data` — サンプルデータ。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)または[Decimal](../../../sql-reference/data-types/decimal.md)。 +- `sample_index` — サンプルインデックス。[Integer](../../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `confidence_level` — 信頼区間を計算するための信頼水準。[Float](../../../sql-reference/data-types/float.md)。 + + +**返される値** + +2つまたは4つの要素を持つ[Tuple](../../../sql-reference/data-types/tuple.md)(オプションの`confidence_level`が指定されている場合): + +- 計算されたt統計量。[Float64](../../../sql-reference/data-types/float.md)。 +- 計算されたp値。[Float64](../../../sql-reference/data-types/float.md)。 +- [計算された信頼区間の下側。[Float64](../../../sql-reference/data-types/float.md)。] +- [計算された信頼区間の上側。[Float64](../../../sql-reference/data-types/float.md)。] + + +**例** + +入力テーブル: + +``` text +┌─sample_data─┬─sample_index─┐ +│ 20.3 │ 0 │ +│ 21.1 │ 0 │ +│ 21.9 │ 1 │ +│ 21.7 │ 0 │ +│ 19.9 │ 1 │ +│ 21.8 │ 1 │ +└─────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SELECT studentTTest(sample_data, sample_index) FROM student_ttest; +``` + +結果: + +``` text +┌─studentTTest(sample_data, sample_index)───┐ +│ (-0.21739130434783777,0.8385421208415731) │ +└───────────────────────────────────────────┘ +``` + +**関連項目** + +- [スチューデントのt検定](https://en.wikipedia.org/wiki/Student%27s_t-test) +- [welchTTest関数](welchttest.md#welchttest) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/sum.md b/docs/ja/sql-reference/aggregate-functions/reference/sum.md new file mode 100644 index 00000000000..fd9c9f4c0e9 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/sum.md @@ -0,0 +1,61 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/sum +sidebar_position: 195 +--- + +# sum + +合計を計算します。数値に対してのみ機能します。 + +**構文** + +```sql +sum(num) +``` + +**パラメータ** +- `num`: 数値のカラム。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal*](../../data-types/decimal.md)。 + +**戻り値** + +- 値の合計。[(U)Int*](../../data-types/int-uint.md)、[Float*](../../data-types/float.md)、[Decimal*](../../data-types/decimal.md)。 + +**例** + +まず、`employees`というテーブルを作成し、いくつかの架空の従業員データを挿入します。 + +クエリ: + +```sql +CREATE TABLE employees +( + `id` UInt32, + `name` String, + `salary` UInt32 +) +ENGINE = Log +``` + +```sql +INSERT INTO employees VALUES + (87432, 'John Smith', 45680), + (59018, 'Jane Smith', 72350), + (20376, 'Ivan Ivanovich', 58900), + (71245, 'Anastasia Ivanovna', 89210); +``` + +`sum`関数を使用して、従業員の給与の合計を求めます。 + +クエリ: + +```sql +SELECT sum(salary) FROM employees; +``` + +結果: + +```response + ┌─sum(salary)─┐ +1. │ 266140 │ + └─────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/sumcount.md b/docs/ja/sql-reference/aggregate-functions/reference/sumcount.md new file mode 100644 index 00000000000..a81e19ecd59 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/sumcount.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/sumcount +sidebar_position: 196 +title: sumCount +--- + +数値の合計を計算し、同時に行数をカウントします。この関数はClickHouseのクエリオプティマイザによって使用されます。クエリ内に複数の`sum`、`count`、または`avg`関数がある場合、それらを単一の`sumCount`関数に置き換えて計算を再利用することができます。この関数を明示的に使用する必要はほとんどありません。 + +**構文** + +``` sql +sumCount(x) +``` + +**引数** + +- `x` — 入力値。データ型は[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または[Decimal](../../../sql-reference/data-types/decimal.md)でなければなりません。 + +**戻り値** + +- タプル `(sum, count)`。ここで`sum`は数値の合計であり、`count`はNULLでない値を持つ行の数です。 + +型: [Tuple](../../../sql-reference/data-types/tuple.md)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE s_table (x Int8) Engine = Log; +INSERT INTO s_table SELECT number FROM numbers(0, 20); +INSERT INTO s_table VALUES (NULL); +SELECT sumCount(x) from s_table; +``` + +結果: + +``` text +┌─sumCount(x)─┐ +│ (190,20) │ +└─────────────┘ +``` + +**関連項目** + +- [optimize_syntax_fuse_functions](../../../operations/settings/settings.md#optimize_syntax_fuse_functions) 設定。 diff --git a/docs/ja/sql-reference/aggregate-functions/reference/sumkahan.md b/docs/ja/sql-reference/aggregate-functions/reference/sumkahan.md new file mode 100644 index 00000000000..3a9a04fd45e --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/sumkahan.md @@ -0,0 +1,39 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/sumkahan +sidebar_position: 197 +title: sumKahan +--- + +[Kahanの加算アルゴリズム](https://en.wikipedia.org/wiki/Kahan_summation_algorithm)を使用して数値の合計を計算します。 +[sum](./sum.md) 関数よりも遅いです。 +補償は[Float](../../../sql-reference/data-types/float.md)型に対してのみ機能します。 + +**構文** + +``` sql +sumKahan(x) +``` + +**引数** + +- `x` — 入力値。型は[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または[Decimal](../../../sql-reference/data-types/decimal.md)である必要があります。 + +**返される値** + +- 数値の合計。入力引数の型に応じて、型は[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または[Decimal](../../../sql-reference/data-types/decimal.md)になります。 + +**例** + +クエリ: + +``` sql +SELECT sum(0.1), sumKahan(0.1) FROM numbers(10); +``` + +結果: + +``` text +┌───────────sum(0.1)─┬─sumKahan(0.1)─┐ +│ 0.9999999999999999 │ 1 │ +└────────────────────┴───────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/summap.md b/docs/ja/sql-reference/aggregate-functions/reference/summap.md new file mode 100644 index 00000000000..56ac2ad03a7 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/summap.md @@ -0,0 +1,82 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/summap +sidebar_position: 198 +--- + +# sumMap + +`key` 配列で指定されたキーに従って `value` 配列を合計します。ソートされた順のキーと、対応するキーの合計値をオーバーフローせずに返す2つの配列のタプルを返します。 + +**構文** + +- `sumMap(key , value )` [配列型](../../data-types/array.md)。 +- `sumMap(Tuple(key , value ))` [タプル型](../../data-types/tuple.md)。 + +エイリアス: `sumMappedArrays`。 + +**引数** + +- `key`: キーの[配列](../../data-types/array.md)。 +- `value`: 値の[配列](../../data-types/array.md)。 + +キーと値の配列のタプルを渡すことは、キーの配列と値の配列を個別に渡すことと同義です。 + +:::note +`key` と `value` の要素数は合計される各行で同じでなければなりません。 +::: + +**戻り値** + +- ソートされた順のキーと、対応するキーの合計値を含む2つの配列のタプルを返します。 + +**例** + +まず、`sum_map` というテーブルを作成し、いくつかのデータを挿入します。キーの配列と値の配列は、[Nested](../../data-types/nested-data-structures/index.md) 型の `statusMap` というカラムに個別に保存され、この関数の2つの異なる構文の使用方法を説明するために、[タプル](../../data-types/tuple.md) 型の `statusMapTuple` というカラムに一緒に保存されています。 + +クエリ: + +``` sql +CREATE TABLE sum_map( + date Date, + timeslot DateTime, + statusMap Nested( + status UInt16, + requests UInt64 + ), + statusMapTuple Tuple(Array(Int32), Array(Int32)) +) ENGINE = Log; +``` +```sql +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10], ([1, 2, 3], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10], ([3, 4, 5], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10], ([4, 5, 6], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10], ([6, 7, 8], [10, 10, 10])); +``` + +次に、テーブルに対して `sumMap` 関数を使い、配列とタプル型の構文の両方を利用してクエリを行います: + +クエリ: + +``` sql +SELECT + timeslot, + sumMap(statusMap.status, statusMap.requests), + sumMap(statusMapTuple) +FROM sum_map +GROUP BY timeslot +``` + +結果: + +``` text +┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┬─sumMap(statusMapTuple)─────────┐ +│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10]) │ ([1,2,3,4,5],[10,10,20,10,10]) │ +│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10]) │ ([4,5,6,7,8],[10,10,20,10,10]) │ +└─────────────────────┴──────────────────────────────────────────────┴────────────────────────────────┘ +``` + +**関連情報** + +- [Map データ型のための Map コンビネーター](../combinators.md#-map) +- [sumMapWithOverflow](../reference/summapwithoverflow.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/summapwithoverflow.md b/docs/ja/sql-reference/aggregate-functions/reference/summapwithoverflow.md new file mode 100644 index 00000000000..b15d3d93161 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/summapwithoverflow.md @@ -0,0 +1,90 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/summapwithoverflow +sidebar_position: 199 +--- + +# sumMapWithOverflow + +`key` 配列で指定されたキーに基づいて `value` 配列の合計を求めます。ソートされた順序でのキーと、それに対応するキーの合計値の二つの配列のタプルを返します。この関数は [sumMap](../reference/summap.md) 関数と異なり、オーバーフローによる加算を行います。つまり、引数のデータ型と同じデータ型で結果を返します。 + +**構文** + +- `sumMapWithOverflow(key , value )` [Array 型](../../data-types/array.md)。 +- `sumMapWithOverflow(Tuple(key , value ))` [Tuple 型](../../data-types/tuple.md)。 + +**引数** + +- `key`: [Array](../../data-types/array.md) 型のキー。 +- `value`: [Array](../../data-types/array.md) 型の値。 + +キーと値の配列のタプルを渡すことは、キーの配列と値の配列を別々に渡すことと同義です。 + +:::note +合計される各行において、`key` と `value` の要素数は同じでなければなりません。 +::: + +**戻り値** + +- ソートされた順序でのキーと、それに対応するキーの合計値の二つの配列のタプルを返します。 + +**例** + +まず、`sum_map` というテーブルを作成し、そこにデータを挿入します。キーと値の配列は [Nested](../../data-types/nested-data-structures/index.md) 型の `statusMap` というカラムと、[tuple](../../data-types/tuple.md) 型の `statusMapTuple` というカラムに分けて保存されます。この例では、上記のこの関数の二つの異なる構文の使用方法を示します。 + +クエリ: + +``` sql +CREATE TABLE sum_map( + date Date, + timeslot DateTime, + statusMap Nested( + status UInt8, + requests UInt8 + ), + statusMapTuple Tuple(Array(Int8), Array(Int8)) +) ENGINE = Log; +``` +```sql +INSERT INTO sum_map VALUES + ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10], ([1, 2, 3], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10], ([3, 4, 5], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10], ([4, 5, 6], [10, 10, 10])), + ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10], ([6, 7, 8], [10, 10, 10])); +``` + +`sumMap`、`sumMapWithOverflow` の配列型構文、および `toTypeName` 関数を使用してテーブルをクエリすると、`sumMapWithOverflow` 関数の場合、合計された値の配列のデータ型が引数の型と同じ `UInt8` であることがわかります(つまり、オーバーフローを伴う加算が行われました)。一方、`sumMap` では、合計された値の配列のデータ型が `UInt8` から `UInt64` に変更され、オーバーフローが発生しないようになっています。 + +クエリ: + +``` sql +SELECT + timeslot, + toTypeName(sumMap(statusMap.status, statusMap.requests)), + toTypeName(sumMapWithOverflow(statusMap.status, statusMap.requests)), +FROM sum_map +GROUP BY timeslot +``` + +同じ結果を得るために、タプル構文を使うこともできました。 + +``` sql +SELECT + timeslot, + toTypeName(sumMap(statusMapTuple)), + toTypeName(sumMapWithOverflow(statusMapTuple)), +FROM sum_map +GROUP BY timeslot +``` + +結果: + +``` text + ┌────────────timeslot─┬─toTypeName(sumMap(statusMap.status, statusMap.requests))─┬─toTypeName(sumMapWithOverflow(statusMap.status, statusMap.requests))─┐ +1. │ 2000-01-01 00:01:00 │ Tuple(Array(UInt8), Array(UInt64)) │ Tuple(Array(UInt8), Array(UInt8)) │ +2. │ 2000-01-01 00:00:00 │ Tuple(Array(UInt8), Array(UInt64)) │ Tuple(Array(UInt8), Array(UInt8)) │ + └─────────────────────┴──────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [sumMap](../reference/summap.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/sumwithoverflow.md b/docs/ja/sql-reference/aggregate-functions/reference/sumwithoverflow.md new file mode 100644 index 00000000000..006d1129cce --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/sumwithoverflow.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/sumwithoverflow +sidebar_position: 200 +--- + +# sumWithOverflow + +数値の合計を計算し、結果には入力パラメータと同じデータ型を使用します。このデータ型の最大値を超える場合は、オーバーフロー計算を行います。 + +数値に対してのみ動作します。 + +**構文** + +```sql +sumWithOverflow(num) +``` + +**パラメータ** +- `num`: 数値のカラム。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**返される値** + +- 値の合計。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**例** + +まず、`employees` というテーブルを作成し、いくつかの架空の従業員データを挿入します。この例では、合計がオーバーフローを引き起こす可能性のある `UInt16` 型の `salary` を選択します。 + +クエリ: + +```sql +CREATE TABLE employees +( + `id` UInt32, + `name` String, + `monthly_salary` UInt16 +) +ENGINE = Log +``` + +```sql +SELECT + sum(monthly_salary) AS no_overflow, + sumWithOverflow(monthly_salary) AS overflow, + toTypeName(no_overflow), + toTypeName(overflow) +FROM employees +``` + +`sum` と `sumWithOverflow` 関数を使用して従業員の給料の合計をクエリし、`toTypeName` 関数を使用してその型を表示します。`sum` 関数では結果の型は `UInt64` となり、合計を収めるのに十分なサイズです。一方、`sumWithOverflow` の結果の型は `UInt16` のままです。 + +クエリ: + +```sql +SELECT + sum(monthly_salary) AS no_overflow, + sumWithOverflow(monthly_salary) AS overflow, + toTypeName(no_overflow), + toTypeName(overflow), +FROM employees; +``` + +結果: + +```response + ┌─no_overflow─┬─overflow─┬─toTypeName(no_overflow)─┬─toTypeName(overflow)─┐ +1. │ 118700 │ 53164 │ UInt64 │ UInt16 │ + └─────────────┴──────────┴─────────────────────────┴──────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/theilsu.md b/docs/ja/sql-reference/aggregate-functions/reference/theilsu.md new file mode 100644 index 00000000000..6adb067375d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/theilsu.md @@ -0,0 +1,49 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/theilsu +sidebar_position: 201 +--- + +# theilsU + +`theilsU` 関数は、[Theil's U 不確実性係数](https://en.wikipedia.org/wiki/Contingency_table#Uncertainty_coefficient)を計算します。この値は、テーブル内の2つのカラム間の関連性を測定します。この値は−1.0(100%の負の関連性、または完全な逆転)から+1.0(100%の正の関連性、または完全な一致)までの範囲です。0.0 の値は関連性がないことを示します。 + +**構文** + +``` sql +theilsU(column1, column2) +``` + +**引数** + +- `column1` と `column2` は比較するカラムです + +**戻り値** + +- -1 と 1 の間の値 + +**戻り値の型** は常に [Float64](../../../sql-reference/data-types/float.md) です。 + +**例** + +以下の比較される2つのカラムはお互いに少しの関連性しかないため、`theilsU` の値は負になります: + +``` sql +SELECT + theilsU(a, b) +FROM + ( + SELECT + number % 10 AS a, + number % 4 AS b + FROM + numbers(150) + ); +``` + +結果: + +```response +┌────────theilsU(a, b)─┐ +│ -0.30195720557678846 │ +└──────────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/topk.md b/docs/ja/sql-reference/aggregate-functions/reference/topk.md new file mode 100644 index 00000000000..884d0a10ffb --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/topk.md @@ -0,0 +1,51 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/topk +sidebar_position: 202 +--- + +# topK + +指定されたカラム内で最も頻繁に出現する値を近似的に配列として返します。生成された配列は、値自体ではなく、近似頻度の降順でソートされます。 + +TopKを分析するための[Filtered Space-Saving](https://doi.org/10.1016/j.ins.2010.08.024)アルゴリズムを実装しており、[Parallel Space Saving](https://doi.org/10.1016/j.ins.2015.09.003)のreduce-and-combineアルゴリズムに基づいています。 + +``` sql +topK(N)(column) +topK(N, load_factor)(column) +topK(N, load_factor, 'counts')(column) +``` + +この関数は結果を保証するものではありません。特定の状況では、エラーが発生し、最も頻繁に出現する値ではない値が返されることがあります。 + +`N < 10`の値を使用することをお勧めします。`N`の値が大きい場合、パフォーマンスが低下します。`N` の最大値は 65536 です。 + +**パラメータ** + +- `N` — 返す要素の数。オプション。デフォルト値: 10。 +- `load_factor` — 値のために予約されるセルの数を定義します。uniq(column) > N * load_factorの場合、topK関数の結果は近似値になります。オプション。デフォルト値: 3。 +- `counts` — 結果に近似的なカウントとエラー値を含めるかどうかを定義します。 + +**引数** + +- `column` — 頻度を計算するための値。 + +**例** + +[OnTime](../../../getting-started/example-datasets/ontime.md) データセットを使用し、`AirlineID` カラムで最も頻繁に出現する3つの値を選択します。 + +``` sql +SELECT topK(3)(AirlineID) AS res +FROM ontime +``` + +``` text +┌─res─────────────────┐ +│ [19393,19790,19805] │ +└─────────────────────┘ +``` + +**関連項目** + +- [topKWeighted](../../../sql-reference/aggregate-functions/reference/topkweighted.md) +- [approx_top_k](../../../sql-reference/aggregate-functions/reference/approxtopk.md) +- [approx_top_sum](../../../sql-reference/aggregate-functions/reference/approxtopsum.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/topkweighted.md b/docs/ja/sql-reference/aggregate-functions/reference/topkweighted.md new file mode 100644 index 00000000000..903520222de --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/topkweighted.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/topkweighted +sidebar_position: 203 +--- + +# topKWeighted + +指定したカラム内で約最頻値を含む配列を返します。結果の配列は、値そのものではなく、約頻度に基づいて降順にソートされます。さらに、値の重みも考慮されます。 + +**構文** + +``` sql +topKWeighted(N)(column, weight) +topKWeighted(N, load_factor)(column, weight) +topKWeighted(N, load_factor, 'counts')(column, weight) +``` + +**パラメータ** + +- `N` — 返す要素の数。オプション。デフォルト値は10です。 +- `load_factor` — 値のために予約されるセルの数を定義します。もし uniq(column) > N * load_factor なら、topK関数の結果は概算になります。オプション。デフォルト値は3です。 +- `counts` — 結果に概算のカウントと誤差値を含めるかを定義します。 + +**引数** + +- `column` — 値を表します。 +- `weight` — 重みを表します。すべての値は、頻度計算のために`weight`回考慮されます。[UInt64](../../../sql-reference/data-types/int-uint.md). + +**返される値** + +最大の重みの概算合計を持つ値の配列を返します。 + +**例** + +クエリ: + +``` sql +SELECT topKWeighted(2)(k, w) FROM +VALUES('k Char, w UInt64', ('y', 1), ('y', 1), ('x', 5), ('y', 1), ('z', 10)) +``` + +結果: + +``` text +┌─topKWeighted(2)(k, w)──┐ +│ ['z','x'] │ +└────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT topKWeighted(2, 10, 'counts')(k, w) +FROM VALUES('k Char, w UInt64', ('y', 1), ('y', 1), ('x', 5), ('y', 1), ('z', 10)) +``` + +結果: + +``` text +┌─topKWeighted(2, 10, 'counts')(k, w)─┐ +│ [('z',10,0),('x',5,0)] │ +└─────────────────────────────────────┘ +``` + +**参照** + +- [topK](../../../sql-reference/aggregate-functions/reference/topk.md) +- [approx_top_k](../../../sql-reference/aggregate-functions/reference/approxtopk.md) +- [approx_top_sum](../../../sql-reference/aggregate-functions/reference/approxtopsum.md) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniq.md b/docs/ja/sql-reference/aggregate-functions/reference/uniq.md new file mode 100644 index 00000000000..79cede0b245 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniq.md @@ -0,0 +1,40 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniq +sidebar_position: 204 +--- + +# uniq + +引数の異なる値の概算数を計算します。 + +``` sql +uniq(x[, ...]) +``` + +**引数** + +この関数は可変数のパラメータを受け取ります。パラメータは `Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型です。 + +**返される値** + +- [UInt64](../../../sql-reference/data-types/int-uint.md) 型の数値。 + +**実装の詳細** + +この関数は以下を行います: + +- 集計中のすべてのパラメータのハッシュを計算し、それをもとに計算を行います。 + +- 適応的なサンプリングアルゴリズムを使用します。計算状態のため、最大65536の要素ハッシュ値のサンプルを使用します。このアルゴリズムは非常に正確で、CPU上で非常に効率的です。クエリに複数のこの関数が含まれている場合でも、`uniq` の使用は他の集計関数を使用するのとほぼ同じ速さです。 + +- 結果を決定論的に提供します(クエリ処理の順序に依存しません)。 + +この関数はほとんどすべてのシナリオでの使用を推奨します。 + +**関連項目** + +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined.md b/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined.md new file mode 100644 index 00000000000..3720b4ff386 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined.md @@ -0,0 +1,70 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniqcombined +sidebar_position: 205 +--- + +# uniqCombined + +異なる引数値の近似数を計算します。 + +``` sql +uniqCombined(HLL_precision)(x[, ...]) +``` + +`uniqCombined`関数は、異なる値の数を計算するのに適した選択です。 + +**引数** + +- `HLL_precision`: [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog) のセル数の2を底とする対数。省略可能で、`uniqCombined(x[, ...])`として関数を使用できます。`HLL_precision`のデフォルト値は17で、実質的には96 KiBのスペース(2^17セル、各セル6ビット)です。 +- `X`: 可変個数のパラメータ。パラメータは`Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型を指定できます。 + +**戻り値** + +- [UInt64](../../../sql-reference/data-types/int-uint.md)型の数値。 + +**実装の詳細** + +`uniqCombined`関数は以下を行います: + +- 集約内のすべてのパラメータに対して、ハッシュ(`String`は64ビットハッシュ、それ以外は32ビット)を計算し、そのハッシュを使用して計算を行います。 +- 配列、ハッシュテーブル、エラー補正テーブル付きHyperLogLogの3つのアルゴリズムを組み合わせて使用します。 + - 異なる要素の数が少ない場合は、配列を使用します。 + - セットサイズが大きくなると、ハッシュテーブルを使用します。 + - より多くの要素の場合には、一定量のメモリを消費するHyperLogLogを使用します。 +- 結果は決定論的に提供されます(クエリの処理順序に依存しません)。 + +:::note +非`String`型に対して32ビットハッシュを使用するため、`UINT_MAX`を大きく超える基数の場合、結果の誤差が非常に高くなります(数十億の異なる値を超えたあたりから誤差が急激に上がります)。この場合は[uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64)を使用すべきです。 +::: + +[uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq)関数と比較して、`uniqCombined`関数は: + +- メモリ消費が数倍少ないです。 +- 精度が数倍高く計算されます。 +- 通常、パフォーマンスがやや低いです。一部のシナリオでは、`uniqCombined`が`uniq`よりも優れたパフォーマンスを発揮することがあります。例えば、大量の集約状態をネットワーク経由で送信する分散クエリの場合です。 + +**例** + +クエリ: + +```sql +SELECT uniqCombined(number) FROM numbers(1e6); +``` + +結果: + +```response +┌─uniqCombined(number)─┐ +│ 1001148 │ -- 1.00百万 +└──────────────────────┘ +``` + +より大きな入力の例として、`uniqCombined`と`uniqCombined64`の違いについては、[uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64)の例のセクションを参照してください。 + +**関連項目** + +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined64.md b/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined64.md new file mode 100644 index 00000000000..7b91231595d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniqcombined64.md @@ -0,0 +1,82 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniqcombined64 +sidebar_position: 206 +--- + +# uniqCombined64 + +異なる引数値の概算数を計算します。これは、すべてのデータ型に対して64ビットハッシュを使用する点を除けば、[uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined)と同じです。 + +``` sql +uniqCombined64(HLL_precision)(x[, ...]) +``` + +**パラメータ** + +- `HLL_precision`: [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog)のセル数の2進対数。オプションとして、関数を`uniqCombined64(x[, ...])`として使用できます。`HLL_precision`のデフォルト値は17で、実際には96 KiBのスペース(2^17セル、各6ビット)です。 +- `X`: 可変数のパラメータ。パラメータには`Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型を使用できます。 + +**返される値** + +- 数値型[UInt64](../../../sql-reference/data-types/int-uint.md)。 + +**実装の詳細** + +`uniqCombined64`関数は以下のように動作します: +- 集約内のすべてのパラメータに対してハッシュ(すべてのデータ型に対して64ビットハッシュ)を計算し、それを計算に使用します。 +- 3つのアルゴリズムの組み合わせを使用します:配列、ハッシュテーブル、エラー訂正テーブル付きのHyperLogLog。 + - 個別の要素が少数の場合、配列を使用します。 + - セットサイズが大きくなると、ハッシュテーブルを使用します。 + - より多くの要素がある場合、HyperLogLogが使用され、固定量のメモリを占有します。 +- 結果は決定論的に提供されます(クエリ処理の順序に依存しません)。 + +:::note +すべての型に対して64ビットハッシュを使用するため、[uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md)が非`String`型に対して32ビットハッシュを使用している場合のように、`UINT_MAX`を大幅に超えるカーディナリティに対して非常に高い誤差が発生することはありません。 +::: + +[uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq)関数と比較して、`uniqCombined64`関数は: + +- 数倍少ないメモリを消費します。 +- 数倍高い精度で計算します。 + +**例** + +以下の例では、`uniqCombined64`が`1e10`の異なる数値に対して実行され、異なる引数値の数に非常に近い概算を返します。 + +クエリ: + +```sql +SELECT uniqCombined64(number) FROM numbers(1e10); +``` + +結果: + +```response +┌─uniqCombined64(number)─┐ +│ 9998568925 │ -- 10.00 billion +└────────────────────────┘ +``` + +比較すると、`uniqCombined`関数はこのサイズの入力に対してかなり低い精度の概算を返します。 + +クエリ: + +```sql +SELECT uniqCombined(number) FROM numbers(1e10); +``` + +結果: + +```response +┌─uniqCombined(number)─┐ +│ 5545308725 │ -- 5.55 billion +└──────────────────────┘ +``` + +**関連項目** + +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniqexact.md b/docs/ja/sql-reference/aggregate-functions/reference/uniqexact.md new file mode 100644 index 00000000000..f7e5558f861 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniqexact.md @@ -0,0 +1,27 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniqexact +sidebar_position: 207 +--- + +# uniqExact + +異なる引数の値の正確な数を計算します。 + +``` sql +uniqExact(x[, ...]) +``` + +絶対に正確な結果が必要な場合に `uniqExact` 関数を使用します。それ以外の場合は [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) 関数を使用してください。 + +`uniqExact` 関数は、`uniq` よりも多くのメモリを使用します。なぜなら、異なる値の数が増えるにつれて、状態のサイズが無制限に増大するためです。 + +**引数** + +この関数は可変個のパラメータを取ります。パラメータは `Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型であることができます。 + +**関連項目** + +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqcombined) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniqhll12) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniqhll12.md b/docs/ja/sql-reference/aggregate-functions/reference/uniqhll12.md new file mode 100644 index 00000000000..bd713c4ba7d --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniqhll12.md @@ -0,0 +1,41 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniqhll12 +sidebar_position: 208 +--- + +# uniqHLL12 + +[HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog) アルゴリズムを使用して、異なる引数値の概算数を計算します。 + +``` sql +uniqHLL12(x[, ...]) +``` + +**引数** + +この関数は可変数のパラメータを取ります。パラメータは `Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型である可能性があります。 + +**戻り値** + +- [UInt64](../../../sql-reference/data-types/int-uint.md)型の数値。 + +**実装の詳細** + +この関数は次のように実装されています: + +- 集計内のすべてのパラメータに対しハッシュ計算を行い、それを用いて計算を実行します。 + +- HyperLogLog アルゴリズムを使用して、異なる引数値の数を概算します。 + + 2^12 の5ビットセルが使用されます。状態のサイズはわずかに2.5KBを超えます。小さなデータセット(<10K要素)の場合、結果はあまり正確ではありません(最大約10%の誤差)。しかし、高いカーディナリティを持つデータセット(10K-100M)の場合、結果は非常に正確で、最大誤差は約1.6%です。100M以上では、推定誤差が増加し、非常に高いカーディナリティを持つデータセット(1B+要素)に対しては非常に不正確な結果を返します。 + +- 決定的な結果を提供します(クエリ処理の順序に依存しない)。 + +この関数の使用はお勧めしません。ほとんどの場合、[uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) または [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) 関数を使用してください。 + +**関連項目** + +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) +- [uniqTheta](../../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/uniqthetasketch.md b/docs/ja/sql-reference/aggregate-functions/reference/uniqthetasketch.md new file mode 100644 index 00000000000..c6fde5afd74 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/uniqthetasketch.md @@ -0,0 +1,39 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/uniqthetasketch +sidebar_position: 209 +title: uniqTheta +--- + +[Theta Sketch Framework](https://datasketches.apache.org/docs/Theta/ThetaSketchFramework.html) を使用して、異なる引数値の概算数を計算します。 + +``` sql +uniqTheta(x[, ...]) +``` + +**引数** + +この関数は可変数のパラメータを取ります。パラメータには `Tuple`、`Array`、`Date`、`DateTime`、`String`、または数値型を指定できます。 + +**戻り値** + +- [UInt64](../../../sql-reference/data-types/int-uint.md) 型の数値。 + +**実装の詳細** + +関数: + +- 集計内のすべてのパラメータにハッシュを計算し、それを計算に使用します。 + +- 異なる引数値の数を近似するために [KMV](https://datasketches.apache.org/docs/Theta/InverseEstimate.html) アルゴリズムを使用します。 + + 4096(2^12) 個の64ビットスケッチが使用されます。状態のサイズは約41 KBです。 + +- 相対誤差は3.125%(95%の信頼区間)です。詳細は[相対誤差のテーブル](https://datasketches.apache.org/docs/Theta/ThetaErrorTable.html)を参照してください。 + +**関連項目** + +- [uniq](../../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq) +- [uniqCombined](../../../sql-reference/aggregate-functions/reference/uniqcombined.md#agg_function-uniqcombined) +- [uniqCombined64](../../../sql-reference/aggregate-functions/reference/uniqcombined64.md#agg_function-uniqcombined64) +- [uniqHLL12](../../../sql-reference/aggregate-functions/reference/uniqhll12.md#agg_function-uniqhll12) +- [uniqExact](../../../sql-reference/aggregate-functions/reference/uniqexact.md#agg_function-uniqexact) diff --git a/docs/ja/sql-reference/aggregate-functions/reference/varpop.md b/docs/ja/sql-reference/aggregate-functions/reference/varpop.md new file mode 100644 index 00000000000..2c21f9660fa --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/varpop.md @@ -0,0 +1,52 @@ +--- +title: "varPop" +slug: "/ja/sql-reference/aggregate-functions/reference/varPop" +sidebar_position: 210 +--- + +## varPop + +母分散を計算します。 + +**構文** + +```sql +varPop(x) +``` + +エイリアス: `VAR_POP`. + +**パラメーター** + +- `x`: 母分散を求める値の集まり。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**返される値** + +- `x` の母分散を返します。[`Float64`](../../data-types/float.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + x UInt8, +) +ENGINE = Memory; + +INSERT INTO test_data VALUES (3), (3), (3), (4), (4), (5), (5), (7), (11), (15); + +SELECT + varPop(x) AS var_pop +FROM test_data; +``` + +結果: + +```response +┌─var_pop─┐ +│ 14.4 │ +└─────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/varpopstable.md b/docs/ja/sql-reference/aggregate-functions/reference/varpopstable.md new file mode 100644 index 00000000000..f9897966afd --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/varpopstable.md @@ -0,0 +1,52 @@ +--- +title: "varPopStable" +slug: "/ja/sql-reference/aggregate-functions/reference/varpopstable" +sidebar_position: 211 +--- + +## varPopStable + +母集団分散を返します。[`varPop`](../reference/varpop.md)とは異なり、この関数は[数値的に安定した](https://en.wikipedia.org/wiki/Numerical_stability)アルゴリズムを使用します。動作は遅いですが、計算誤差が少ないです。 + +**構文** + +```sql +varPopStable(x) +``` + +エイリアス: `VAR_POP_STABLE`. + +**パラメータ** + +- `x`: 母集団分散を求める値の集まり。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md). + +**返される値** + +- `x`の母集団分散を返します。[Float64](../../data-types/float.md). + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + x UInt8, +) +ENGINE = Memory; + +INSERT INTO test_data VALUES (3),(3),(3),(4),(4),(5),(5),(7),(11),(15); + +SELECT + varPopStable(x) AS var_pop_stable +FROM test_data; +``` + +結果: + +```response +┌─var_pop_stable─┐ +│ 14.4 │ +└────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/varsamp.md b/docs/ja/sql-reference/aggregate-functions/reference/varsamp.md new file mode 100644 index 00000000000..edc1b7c0a9c --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/varsamp.md @@ -0,0 +1,66 @@ +--- +title: "varSamp" +slug: /ja/sql-reference/aggregate-functions/reference/varSamp +sidebar_position: 212 +--- + +## varSamp + +データセットの標本分散を計算します。 + +**構文** + +```sql +varSamp(x) +``` + +エイリアス: `VAR_SAMP`. + +**パラメータ** + +- `x`: 標本分散を計算したい母集団。[(U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md)。 + +**返される値** + +- 入力データセット `x` の標本分散を返します。[Float64](../../data-types/float.md)。 + +**実装の詳細** + +`varSamp` 関数は次の公式を使用して標本分散を計算します: + +$$ +\sum\frac{(x - \text{mean}(x))^2}{(n - 1)} +$$ + +ここで: + +- `x` はデータセット内の各データポイントです。 +- `mean(x)` はデータセットの算術平均です。 +- `n` はデータセット内のデータポイント数です。 + +この関数は入力データセットが大きな母集団からの標本を表していると仮定します。全体の母集団の分散を計算したい場合(完全なデータセットがある場合)は、代わりに [`varPop`](../reference/varpop.md) を使用してください。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + x Float64 +) +ENGINE = Memory; + +INSERT INTO test_data VALUES (10.5), (12.3), (9.8), (11.2), (10.7); + +SELECT round(varSamp(x),3) AS var_samp FROM test_data; +``` + +レスポンス: + +```response +┌─var_samp─┐ +│ 0.865 │ +└──────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/varsampstable.md b/docs/ja/sql-reference/aggregate-functions/reference/varsampstable.md new file mode 100644 index 00000000000..9cf90b47b1b --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/varsampstable.md @@ -0,0 +1,63 @@ +--- +title: "varSampStable" +slug: /ja/sql-reference/aggregate-functions/reference/varsampstable +sidebar_position: 213 +--- + +## varSampStable + +データセットの標本分散を計算します。[`varSamp`](../reference/varsamp.md)とは異なり、この関数は数値的に安定したアルゴリズムを使用します。動作は遅くなりますが、計算誤差を低く抑えます。 + +**構文** + +```sql +varSampStable(x) +``` + +別名: `VAR_SAMP_STABLE` + +**パラメーター** + +- `x`: 標本分散を計算したい母集団。[ (U)Int*](../../data-types/int-uint.md), [Float*](../../data-types/float.md), [Decimal*](../../data-types/decimal.md). + +**返される値** + +- 入力データセットの標本分散を返します。[Float64](../../data-types/float.md). + +**実装の詳細** + +`varSampStable` 関数は、[`varSamp`](../reference/varsamp.md)と同じ数式を使用して標本分散を計算します。 + +$$ +\sum\frac{(x - \text{mean}(x))^2}{(n - 1)} +$$ + +ここで: +- `x` はデータセットの各個別データポイントです。 +- `mean(x)` はデータセットの算術平均です。 +- `n` はデータセットのデータポイントの数です。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test_data; +CREATE TABLE test_data +( + x Float64 +) +ENGINE = Memory; + +INSERT INTO test_data VALUES (10.5), (12.3), (9.8), (11.2), (10.7); + +SELECT round(varSampStable(x),3) AS var_samp_stable FROM test_data; +``` + +レスポンス: + +```response +┌─var_samp_stable─┐ +│ 0.865 │ +└─────────────────┘ +``` diff --git a/docs/ja/sql-reference/aggregate-functions/reference/welchttest.md b/docs/ja/sql-reference/aggregate-functions/reference/welchttest.md new file mode 100644 index 00000000000..a4518fc4812 --- /dev/null +++ b/docs/ja/sql-reference/aggregate-functions/reference/welchttest.md @@ -0,0 +1,70 @@ +--- +slug: /ja/sql-reference/aggregate-functions/reference/welchttest +sidebar_position: 214 +sidebar_label: welchTTest +--- + +# welchTTest + +2つの母集団からのサンプルにWelchのt検定を適用します。 + +**構文** + +``` sql +welchTTest([confidence_level])(sample_data, sample_index) +``` + +両方のサンプルの値は`sample_data`カラムにあります。`sample_index`が0の場合、その行の値は最初の母集団からのサンプルに属します。それ以外の場合は、2番目の母集団からのサンプルに属します。帰無仮説は母集団の平均が等しいというものです。正規分布が仮定されます。母集団は異なる分散を持つことがあります。 + +**引数** + +- `sample_data` — サンプルデータ。[Integer](../../../sql-reference/data-types/int-uint.md)、[Float](../../../sql-reference/data-types/float.md)、または[Decimal](../../../sql-reference/data-types/decimal.md)。 +- `sample_index` — サンプルインデックス。[Integer](../../../sql-reference/data-types/int-uint.md)。 + +**パラメータ** + +- `confidence_level` — 信頼区間を計算するための信頼水準。[Float](../../../sql-reference/data-types/float.md)。 + +**戻り値** + +2つまたは4つの要素を持つ[Tuple](../../../sql-reference/data-types/tuple.md)(オプションの`confidence_level`が指定された場合) + +- 計算されたt統計量。[Float64](../../../sql-reference/data-types/float.md)。 +- 計算されたp値。[Float64](../../../sql-reference/data-types/float.md)。 +- 計算された信頼区間下限。[Float64](../../../sql-reference/data-types/float.md)。 +- 計算された信頼区間上限。[Float64](../../../sql-reference/data-types/float.md)。 + + +**例** + +入力テーブル: + +``` text +┌─sample_data─┬─sample_index─┐ +│ 20.3 │ 0 │ +│ 22.1 │ 0 │ +│ 21.9 │ 0 │ +│ 18.9 │ 1 │ +│ 20.3 │ 1 │ +│ 19 │ 1 │ +└─────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SELECT welchTTest(sample_data, sample_index) FROM welch_ttest; +``` + +結果: + +``` text +┌─welchTTest(sample_data, sample_index)─────┐ +│ (2.7988719532211235,0.051807360348581945) │ +└───────────────────────────────────────────┘ +``` + +**関連項目** + +- [Welch's t-test](https://en.wikipedia.org/wiki/Welch%27s_t-test) +- [studentTTest関数](studentttest.md#studentttest) diff --git a/docs/ja/sql-reference/data-types/aggregatefunction.md b/docs/ja/sql-reference/data-types/aggregatefunction.md new file mode 100644 index 00000000000..62e53a4e907 --- /dev/null +++ b/docs/ja/sql-reference/data-types/aggregatefunction.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/data-types/aggregatefunction +sidebar_position: 46 +sidebar_label: AggregateFunction +--- + +# AggregateFunction + +集約関数は、`AggregateFunction(...)` データ型にシリアライズできる実装定義の中間状態を持つことができ、通常は[マテリアライズドビュー](../../sql-reference/statements/create/view.md)によってテーブルに保存されます。集約関数の状態を生成する一般的な方法は、`-State` サフィックスを付けて集約関数を呼び出すことです。将来、集約の最終結果を得るには、同じ集約関数を `-Merge` サフィックスとともに使用する必要があります。 + +`AggregateFunction(name, types_of_arguments...)` — パラメトリックデータ型。 + +**パラメータ** + +- 集約関数の名前。関数がパラメトリックな場合、そのパラメータも指定します。 + +- 集約関数引数の型。 + +**例** + +``` sql +CREATE TABLE t +( + column1 AggregateFunction(uniq, UInt64), + column2 AggregateFunction(anyIf, String, UInt8), + column3 AggregateFunction(quantiles(0.5, 0.9), UInt64) +) ENGINE = ... +``` + +[uniq](../../sql-reference/aggregate-functions/reference/uniq.md#agg_function-uniq)、anyIf([any](../../sql-reference/aggregate-functions/reference/any.md#agg_function-any)+[If](../../sql-reference/aggregate-functions/combinators.md#agg-functions-combinator-if))および [quantiles](../../sql-reference/aggregate-functions/reference/quantiles.md#quantiles) は、ClickHouseでサポートされている集約関数です。 + +## 使用方法 + +### データの挿入 + +データを挿入するには、集約の `-State`- 関数を使用して `INSERT SELECT` を使用します。 + +**関数の例** + +``` sql +uniqState(UserID) +quantilesState(0.5, 0.9)(SendTiming) +``` + +対応する `uniq` と `quantiles` 関数と対照的に、`-State`- 関数は最終値ではなく状態を返します。つまり、`AggregateFunction` 型の値を返します。 + +`SELECT` クエリの結果では、`AggregateFunction` 型の値は、ClickHouse のすべての出力フォーマットに対して実装固有のバイナリ表現を持っています。例えば、`SELECT` クエリで `TabSeparated` フォーマットにダンプを出力した場合、このダンプは `INSERT` クエリを使用して読み込むことができます。 + +### データの選択 + +`AggregatingMergeTree` テーブルからデータを選択する際は、`GROUP BY` 句と、データを挿入するときと同じ集約関数を使用しますが、`-Merge` サフィックスを使用します。 + +`-Merge` サフィックスを持つ集約関数は、一連の状態を取り、それらを結合して完全なデータ集約の結果を返します。 + +例えば、次の2つのクエリは同じ結果を返します: + +``` sql +SELECT uniq(UserID) FROM table + +SELECT uniqMerge(state) FROM (SELECT uniqState(UserID) AS state FROM table GROUP BY RegionID) +``` + +## 使用例 + +[AggregatingMergeTree](../../engines/table-engines/mergetree-family/aggregatingmergetree.md) エンジンの説明を参照。 + +## 関連コンテンツ + +- ブログ: [ClickHouseでの集約コンビネーターの活用](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/docs/ja/sql-reference/data-types/array.md b/docs/ja/sql-reference/data-types/array.md new file mode 100644 index 00000000000..991297ab585 --- /dev/null +++ b/docs/ja/sql-reference/data-types/array.md @@ -0,0 +1,117 @@ +--- +slug: /ja/sql-reference/data-types/array +sidebar_position: 32 +sidebar_label: Array(T) +--- + +# Array(T) + +`T` 型の項目の配列で、配列の開始インデックスは1です。`T` は、配列を含む任意のデータ型にすることができます。 + +## 配列の作成 + +配列を作成するための関数を使用できます: + +``` sql +array(T) +``` + +また、角括弧を使用することもできます。 + +``` sql +[] +``` + +配列を作成する例: + +``` sql +SELECT array(1, 2) AS x, toTypeName(x) +``` + +``` text +┌─x─────┬─toTypeName(array(1, 2))─┐ +│ [1,2] │ Array(UInt8) │ +└───────┴─────────────────────────┘ +``` + +``` sql +SELECT [1, 2] AS x, toTypeName(x) +``` + +``` text +┌─x─────┬─toTypeName([1, 2])─┐ +│ [1,2] │ Array(UInt8) │ +└───────┴────────────────────┘ +``` + +## データ型の操作 + +配列をその場で作成するとき、ClickHouseはリストされたすべての引数を格納できる最も狭いデータ型として引数の型を自動的に定義します。[Nullable](../../sql-reference/data-types/nullable.md#data_type-nullable)やリテラルの[NULL](../../sql-reference/syntax.md#null-literal)値がある場合、配列要素の型も[Nullable](../../sql-reference/data-types/nullable.md)になります。 + +ClickHouseがデータ型を決定できなかった場合は、例外を生成します。例えば、文字列と数値を同時に使用して配列を作成しようとしたとき(`SELECT array(1, 'a')`)です。 + +自動データ型検出の例: + +``` sql +SELECT array(1, 2, NULL) AS x, toTypeName(x) +``` + +``` text +┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐ +│ [1,2,NULL] │ Array(Nullable(UInt8)) │ +└────────────┴───────────────────────────────┘ +``` + +互換性のないデータ型の配列を作成しようとすると、ClickHouseは例外を投げます: + +``` sql +SELECT array(1, 'a') +``` + +``` text +Received exception from server (version 1.1.54388): +Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not. +``` + +## 配列のサイズ + +全体のカラムを読み取らずに、`size0` サブカラムを使用することで配列のサイズを取得できます。多次元配列の場合、`sizeN-1` を使用できます。ここで `N` は求める次元です。 + +**例** + +クエリ: + +```sql +CREATE TABLE t_arr (`arr` Array(Array(Array(UInt32)))) ENGINE = MergeTree ORDER BY tuple(); + +INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]); + +SELECT arr.size0, arr.size1, arr.size2 FROM t_arr; +``` + +結果: + +``` text +┌─arr.size0─┬─arr.size1─┬─arr.size2─┐ +│ 1 │ [2] │ [[4,1]] │ +└───────────┴───────────┴───────────┘ +``` + +## 配列からのネストされたサブカラムの読み取り + +もし `Array` 内のネストされた型 `T` がサブカラムを持っている場合(例えば、それが[named tuple](./tuple.md)の場合)、同じサブカラム名で `Array(T)` 型からサブカラムを読み取ることができます。サブカラムの型は、元のサブカラムの型の `Array` になります。 + +**例** + +```sql +CREATE TABLE t_arr (arr Array(Tuple(field1 UInt32, field2 String))) ENGINE = MergeTree ORDER BY tuple(); +INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]); +SELECT arr.field1, toTypeName(arr.field1), arr.field2, toTypeName(arr.field2) from t_arr; +``` + +```test +┌─arr.field1─┬─toTypeName(arr.field1)─┬─arr.field2────────────────┬─toTypeName(arr.field2)─┐ +│ [1,2] │ Array(UInt32) │ ['Hello','World'] │ Array(String) │ +│ [3,4,5] │ Array(UInt32) │ ['This','is','subcolumn'] │ Array(String) │ +└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/data-types/boolean.md b/docs/ja/sql-reference/data-types/boolean.md new file mode 100644 index 00000000000..e78b4173734 --- /dev/null +++ b/docs/ja/sql-reference/data-types/boolean.md @@ -0,0 +1,38 @@ +--- +slug: /ja/sql-reference/data-types/boolean +sidebar_position: 22 +sidebar_label: Bool +--- + +# Bool + +`bool`型は内部的にはUInt8として格納されます。可能な値は`true`(1)と`false`(0)です。 + +```sql +select true as col, toTypeName(col); +┌─col──┬─toTypeName(true)─┐ +│ true │ Bool │ +└──────┴──────────────────┘ + +select true == 1 as col, toTypeName(col); +┌─col─┬─toTypeName(equals(true, 1))─┐ +│ 1 │ UInt8 │ +└─────┴─────────────────────────────┘ +``` + +```sql +CREATE TABLE test_bool +( + `A` Int64, + `B` Bool +) +ENGINE = Memory; + +INSERT INTO test_bool VALUES (1, true),(2,0); + +SELECT * FROM test_bool; +┌─A─┬─B─────┐ +│ 1 │ true │ +│ 2 │ false │ +└───┴───────┘ +``` diff --git a/docs/ja/sql-reference/data-types/data-types-binary-encoding.md b/docs/ja/sql-reference/data-types/data-types-binary-encoding.md new file mode 100644 index 00000000000..f1897f76ac6 --- /dev/null +++ b/docs/ja/sql-reference/data-types/data-types-binary-encoding.md @@ -0,0 +1,116 @@ +--- +slug: /ja/sql-reference/data-types/data-types-binary-encoding +sidebar_position: 56 +sidebar_label: データ型のバイナリエンコーディング仕様 +--- + +# データ型のバイナリエンコーディング仕様 + +この仕様は、ClickHouseのデータ型のバイナリエンコーディングとデコーディングに使用できるバイナリフォーマットについて説明します。このフォーマットは、`Dynamic`カラムの[バイナリシリアライズ](dynamic.md#binary-output-format)で使用され、対応する設定の下で入力/出力フォーマット[RowBinaryWithNamesAndTypes](../../interfaces/formats.md#rowbinarywithnamesandtypes)および[Native](../../interfaces/formats.md#native)で使用できます。 + +下表は、各データ型がバイナリフォーマットでどのように表現されるかを示しています。各データ型のエンコーディングは、型を示す1バイトと、いくつかのオプションの追加情報から構成されます。バイナリエンコーディングの`var_uint`は、Variable-Length Quantity圧縮を使用してサイズがエンコードされていることを意味します。 + +| ClickHouse データ型 | バイナリエンコーディング | +|----------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `Nothing` | `0x00` | +| `UInt8` | `0x01` | +| `UInt16` | `0x02` | +| `UInt32` | `0x03` | +| `UInt64` | `0x04` | +| `UInt128` | `0x05` | +| `UInt256` | `0x06` | +| `Int8` | `0x07` | +| `Int16` | `0x08` | +| `Int32` | `0x09` | +| `Int64` | `0x0A` | +| `Int128` | `0x0B` | +| `Int256` | `0x0C` | +| `Float32` | `0x0D` | +| `Float64` | `0x0E` | +| `Date` | `0x0F` | +| `Date32` | `0x10` | +| `DateTime` | `0x11` | +| `DateTime(time_zone)` | `0x12` | +| `DateTime64(P)` | `0x13` | +| `DateTime64(P, time_zone)` | `0x14` | +| `String` | `0x15` | +| `FixedString(N)` | `0x16` | +| `Enum8` | `0x17...` | +| `Enum16` | `0x18...>` | +| `Decimal32(P, S)` | `0x19` | +| `Decimal64(P, S)` | `0x1A` | +| `Decimal128(P, S)` | `0x1B` | +| `Decimal256(P, S)` | `0x1C` | +| `UUID` | `0x1D` | +| `Array(T)` | `0x1E` | +| `Tuple(T1, ..., TN)` | `0x1F...` | +| `Tuple(name1 T1, ..., nameN TN)` | `0x20...` | +| `Set` | `0x21` | +| `Interval` | `0x22`([間隔種のバイナリエンコーディング](#interval-kind-binary-encoding)を参照) | +| `Nullable(T)` | `0x23` | +| `Function` | `0x24...` | +| `AggregateFunction(function_name(param_1, ..., param_N), arg_T1, ..., arg_TN)` | `0x25......`([集計関数パラメータのバイナリエンコーディング](#aggregate-function-parameter-binary-encoding)を参照) | +| `LowCardinality(T)` | `0x26` | +| `Map(K, V)` | `0x27` | +| `IPv4` | `0x28` | +| `IPv6` | `0x29` | +| `Variant(T1, ..., TN)` | `0x2A...` | +| `Dynamic(max_types=N)` | `0x2B` | +| `Custom type` (`Ring`, `Polygon`, etc) | `0x2C` | +| `Bool` | `0x2D` | +| `SimpleAggregateFunction(function_name(param_1, ..., param_N), arg_T1, ..., arg_TN)` | `0x2E......`([集計関数パラメータのバイナリエンコーディング](#aggregate-function-parameter-binary-encoding)を参照) | +| `Nested(name1 T1, ..., nameN TN)` | `0x2F...` | +| `JSON(max_dynamic_paths=N, max_dynamic_types=M, path Type, SKIP skip_path, SKIP REGEXP skip_path_regexp)` | `0x30.........` | + +`JSON`型のバイト`uint8_serialization_version`はシリアライズのバージョンを示します。現在、バージョンは常に0ですが、将来的に新しい引数が`JSON`型に導入された場合には変更される可能性があります。 + +### Interval 種のバイナリエンコーディング + +下表は、`Interval`データ型の異なる間隔種がどのようにエンコードされるかを示しています。 + +| Interval 種 | バイナリエンコーディング | +|-------------|-------------------------| +| `Nanosecond` | `0x00` | +| `Microsecond` | `0x01` | +| `Millisecond` | `0x02` | +| `Second` | `0x03` | +| `Minute` | `0x04` | +| `Hour` | `0x05` | +| `Day` | `0x06` | +| `Week` | `0x07` | +| `Month` | `0x08` | +| `Quarter` | `0x09` | +| `Year` | `0x1A` | + +### 集計関数パラメータのバイナリエンコーディング + +下表は、`AggregateFunction`と`SimpleAggregateFunction`のパラメータがどのようにエンコードされるかを示しています。 +パラメータのエンコーディングは、パラメータの型を示す1バイトと値そのものから構成されます。 + +| パラメータの型 | バイナリエンコーディング | +|----------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| `Null` | `0x00` | +| `UInt64` | `0x01` | +| `Int64` | `0x02` | +| `UInt128` | `0x03` | +| `Int128` | `0x04` | +| `UInt128` | `0x05` | +| `Int128` | `0x06` | +| `Float64` | `0x07` | +| `Decimal32` | `0x08` | +| `Decimal64` | `0x09` | +| `Decimal128` | `0x0A` | +| `Decimal256` | `0x0B` | +| `String` | `0x0C` | +| `Array` | `0x0D...` | +| `Tuple` | `0x0E...` | +| `Map` | `0x0F...` | +| `IPv4` | `0x10` | +| `IPv6` | `0x11` | +| `UUID` | `0x12` | +| `Bool` | `0x13` | +| `Object` | `0x14...` | +| `AggregateFunctionState` | `0x15` | +| `Negative infinity` | `0xFE` | +| `Positive infinity` | `0xFF` | + diff --git a/docs/ja/sql-reference/data-types/date.md b/docs/ja/sql-reference/data-types/date.md new file mode 100644 index 00000000000..08adaa58779 --- /dev/null +++ b/docs/ja/sql-reference/data-types/date.md @@ -0,0 +1,50 @@ +--- +slug: /ja/sql-reference/data-types/date +sidebar_position: 12 +sidebar_label: Date +--- + +# Date + +日付。2バイトで1970-01-01からの日数として保存されます(符号なし)。Unixエポックの開始直後から、コンパイル時に定義される上限(現時点では2149年まで、完全サポートされている最終年は2148年)までの値を保存できます。 + +サポートされている値の範囲は: \[1970-01-01, 2149-06-06\]です。 + +日付の値はタイムゾーンなしで保存されます。 + +**例** + +`Date`型のカラムを持つテーブルを作成し、データを挿入する: + +``` sql +CREATE TABLE dt +( + `timestamp` Date, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +-- 日付を解析 +-- - 文字列から、 +-- - 1970-01-01からの日数として解釈される「小さな」整数から、 +-- - 1970-01-01からの秒数として解釈される「大きな」整数から。 +INSERT INTO dt VALUES ('2019-01-01', 1), (17897, 2), (1546300800, 3); + +SELECT * FROM dt; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2019-01-01 │ 1 │ +│ 2019-01-01 │ 2 │ +│ 2019-01-01 │ 3 │ +└────────────┴──────────┘ +``` + +**関連情報** + +- [日付と時間を扱う関数](../../sql-reference/functions/date-time-functions.md) +- [日付と時間を扱うオペレーター](../../sql-reference/operators/index.md#operators-datetime) +- [`DateTime` データ型](../../sql-reference/data-types/datetime.md) diff --git a/docs/ja/sql-reference/data-types/date32.md b/docs/ja/sql-reference/data-types/date32.md new file mode 100644 index 00000000000..4d44b31312b --- /dev/null +++ b/docs/ja/sql-reference/data-types/date32.md @@ -0,0 +1,45 @@ +--- +slug: /ja/sql-reference/data-types/date32 +sidebar_position: 14 +sidebar_label: Date32 +--- + +# Date32 + +日付を表すデータ型です。[DateTime64](../../sql-reference/data-types/datetime64.md)と同じ範囲の日時をサポートします。データはネイティブバイトオーダーで符号付き32ビット整数として保存され、1970-01-01からの日数を表現しています(0は1970-01-01を表し、負の値は1970年以前の日数を表します)。 + +**例** + +`Date32`型のカラムを持つテーブルを作成し、データを挿入する例: + +``` sql +CREATE TABLE dt32 +( + `timestamp` Date32, + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +-- Dateを解析する +-- - 文字列から、 +-- - 1970-01-01からの日数を解釈する「小さな」整数から、 +-- - 1970-01-01からの秒数を解釈する「大きな」整数から。 +INSERT INTO dt32 VALUES ('2100-01-01', 1), (47482, 2), (4102444800, 3); + +SELECT * FROM dt32; +``` + +``` text +┌──timestamp─┬─event_id─┐ +│ 2100-01-01 │ 1 │ +│ 2100-01-01 │ 2 │ +└────────────┴──────────┘ +``` + +**関連項目** + +- [toDate32](../../sql-reference/functions/type-conversion-functions.md#todate32) +- [toDate32OrZero](../../sql-reference/functions/type-conversion-functions.md#todate32-or-zero) +- [toDate32OrNull](../../sql-reference/functions/type-conversion-functions.md#todate32-or-null) diff --git a/docs/ja/sql-reference/data-types/datetime.md b/docs/ja/sql-reference/data-types/datetime.md new file mode 100644 index 00000000000..a23eb1055bf --- /dev/null +++ b/docs/ja/sql-reference/data-types/datetime.md @@ -0,0 +1,153 @@ +--- +slug: /ja/sql-reference/data-types/datetime +sidebar_position: 16 +sidebar_label: DateTime +--- + +# DateTime + +日付と時間として表現できる瞬間の時間を保存することができます。 + +構文: + +``` sql +DateTime([timezone]) +``` + +対応する値の範囲: \[1970-01-01 00:00:00, 2106-02-07 06:28:15\]。 + +解像度: 1秒。 + +## スピード + +ほとんどの条件下で、`Date`データ型は`DateTime`より高速です。 + +`Date`型は2バイトのストレージを必要とし、`DateTime`は4バイトを必要とします。しかし、データベースを圧縮すると、この違いは増幅されます。この増幅は、`DateTime`の分と秒が圧縮しにくいためです。`DateTime`よりも`Date`をフィルタリングおよび集計する方が高速です。 + +## 使用上の注意 + +時刻は、タイムゾーンや夏時間に関係なく、[Unixタイムスタンプ](https://en.wikipedia.org/wiki/Unix_time)として保存されます。タイムゾーンは、テキスト形式での`DateTime`型の値の表示方法と、文字列として指定された値(‘2020-01-01 05:00:01’)の解析方法に影響を与えます。 + +タイムゾーンに依存しないUnixタイムスタンプはテーブルに保存され、データのインポート/エクスポート時や値に対するカレンダー計算を行う際にテキスト形式に変換されます(例: `toDate`, `toHour`関数など)。タイムゾーンはテーブルの行(または結果セット)には保存されませんが、カラムのメタデータに保存されます。 + +対応するタイムゾーンのリストは、[IANA Time Zone Database](https://www.iana.org/time-zones)で見つかり、`SELECT * FROM system.time_zones`でクエリできます。[このリスト](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)はWikipediaにもあります。 + +テーブルを作成するときに`DateTime`型のカラムにタイムゾーンを明示的に設定できます。例: `DateTime('UTC')`。タイムゾーンが設定されていない場合、ClickHouseはサーバー設定の[timezone](../../operations/server-configuration-parameters/settings.md#timezone)パラメータの値またはClickHouseサーバー開始時のオペレーティングシステム設定を使用します。 + +[clickhouse-client](../../interfaces/cli.md)はデフォルトでこのデータ型を初期化する際、明示的にタイムゾーンが設定されていない場合、サーバーのタイムゾーンを適用します。クライアントタイムゾーンを使用するには、`--use_client_time_zone`パラメータを指定して`clickhouse-client`を実行します。 + +ClickHouseは、[date_time_output_format](../../operations/settings/settings-formats.md#date_time_output_format)設定の値に依存して値を出力します。デフォルトでは `YYYY-MM-DD hh:mm:ss` 形式で表示されます。さらに、[formatDateTime](../../sql-reference/functions/date-time-functions.md#formatdatetime)関数を使用して出力を変更できます。 + +ClickHouseにデータを挿入する際は、[date_time_input_format](../../operations/settings/settings-formats.md#date_time_input_format)設定の値に応じて、様々な形式の日時文字列を使用できます。 + +## 例 + +**1.** `DateTime`型のカラムを持つテーブルを作成し、データを挿入する: + +``` sql +CREATE TABLE dt +( + `timestamp` DateTime('Asia/Istanbul'), + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +-- DateTimeを解析する +-- - 文字列から、 +-- - 1970-01-01からの秒数として整数から。 +INSERT INTO dt VALUES ('2019-01-01 00:00:00', 1), (1546300800, 3); + +SELECT * FROM dt; +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00 │ 2 │ +│ 2019-01-01 03:00:00 │ 1 │ +└─────────────────────┴──────────┘ +``` + +- 日時を整数として挿入する場合、それはUnix Timestamp (UTC) として扱われます。`1546300800`はUTCで`'2019-01-01 00:00:00'`を表します。しかし、`timestamp`カラムには`Asia/Istanbul` (UTC+3) タイムゾーンが指定されているため、文字列として出力する際には`'2019-01-01 03:00:00'`として表示されます。 +- 文字列の値を日時として挿入する際には、カラムのタイムゾーンとして扱われます。`'2019-01-01 00:00:00'`は`Asia/Istanbul`タイムゾーンとして扱われ、`1546290000`として保存されます。 + +**2.** `DateTime`値のフィルタリング + +``` sql +SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Asia/Istanbul') +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00 │ 1 │ +└─────────────────────┴──────────┘ +``` + +`DateTime`カラムの値は、`WHERE`述語内の文字列値を使用してフィルタリングできます。自動的に`DateTime`に変換されます: + +``` sql +SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00' +``` + +``` text +┌───────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00 │ 1 │ +└─────────────────────┴──────────┘ +``` + +**3.** `DateTime`型カラムのタイムゾーンを取得する: + +``` sql +SELECT toDateTime(now(), 'Asia/Istanbul') AS column, toTypeName(column) AS x +``` + +``` text +┌──────────────column─┬─x─────────────────────────┐ +│ 2019-10-16 04:12:04 │ DateTime('Asia/Istanbul') │ +└─────────────────────┴───────────────────────────┘ +``` + +**4.** タイムゾーン変換 + +``` sql +SELECT +toDateTime(timestamp, 'Europe/London') as lon_time, +toDateTime(timestamp, 'Asia/Istanbul') as mos_time +FROM dt +``` + +``` text +┌───────────lon_time──┬────────────mos_time─┐ +│ 2019-01-01 00:00:00 │ 2019-01-01 03:00:00 │ +│ 2018-12-31 21:00:00 │ 2019-01-01 00:00:00 │ +└─────────────────────┴─────────────────────┘ +``` + +タイムゾーン変換はメタデータのみを変更するため、この操作には計算コストはありません。 + +## タイムゾーンサポートの制限 + +一部のタイムゾーンは完全にはサポートされていない場合があります。いくつかのケースについて説明します。 + +UTCからのオフセットが15分の倍数でない場合、時と分の計算が正確でない場合があります。例えば、1972年1月7日以前のリベリアのモンロビアのタイムゾーンは、UTC -0:44:30のオフセットがあります。モンロビアのタイムゾーンで歴史的な時間の計算を行う場合、時間処理関数が正確でない結果を返すことがありますしかし、1972年1月7日以降の結果は正確です。 + +時間の転換(夏時間などの理由で)が15分の倍数でない時点で行われた場合、その特定の日に誤った結果が出る可能性があります。 + +単調増加でないカレンダー日付。たとえば、ハッピーバレー - グースベイでは、2010年11月7日00:01:00(真夜中から1分後)に1時間後ろに移す時間がありました。そのため、11月6日が終わった後、人々は11月7日の1分間を全部観測し、その後11月6日23:01に戻り、59分後に11月7日が再び始まりました。ClickHouseではまだこのような現象はサポートされていません。これらの日には時間処理関数の結果が若干不正確となる可能性があります。 + +同様の問題が2010年のケーシー南極基地にも存在します。2010年3月5日02:00に3時間後ろに移されました。もしあなたが南極基地にいるなら、ClickHouseを使うことを恐れないでください。タイムゾーンをUTCに設定するか、誤差を意識してください。 + +複数日の時間シフト。一部の太平洋の島々はUTC+14からUTC-12にタイムゾーンオフセットを変更しました。それは問題ありませんが、過去の日時で計算を行う場合、変換日の場合に不正確さが存在することがあります。 + +## 関連項目 + +- [型変換関数](../../sql-reference/functions/type-conversion-functions.md) +- [日時を操作するための関数](../../sql-reference/functions/date-time-functions.md) +- [配列を操作するための関数](../../sql-reference/functions/array-functions.md) +- [`date_time_input_format`設定](../../operations/settings/settings-formats.md#date_time_input_format) +- [`date_time_output_format`設定](../../operations/settings/settings-formats.md#date_time_output_format) +- [`timezone`サーバー構成パラメータ](../../operations/server-configuration-parameters/settings.md#timezone) +- [`session_timezone`設定](../../operations/settings/settings.md#session_timezone) +- [日時を操作するための演算子](../../sql-reference/operators/index.md#operators-datetime) +- [`Date`データ型](../../sql-reference/data-types/date.md) diff --git a/docs/ja/sql-reference/data-types/datetime64.md b/docs/ja/sql-reference/data-types/datetime64.md new file mode 100644 index 00000000000..a66a7964587 --- /dev/null +++ b/docs/ja/sql-reference/data-types/datetime64.md @@ -0,0 +1,125 @@ +--- +slug: /ja/sql-reference/data-types/datetime64 +sidebar_position: 18 +sidebar_label: DateTime64 +--- + +# DateTime64 + +日付と時刻、および定義されたサブ秒精度で表現できる瞬間を格納することができます。 + +チックサイズ(精度):10-precision 秒。 有効範囲: [ 0 : 9 ]。 +通常は、3(ミリ秒)、6(マイクロ秒)、9(ナノ秒)が使用されます。 + +**構文:** + +``` sql +DateTime64(precision, [timezone]) +``` + +内部的には、1970-01-01 00:00:00 UTCからエポックの開始までの「チック」数としてデータを Int64 として格納します。 チックの解像度は精度パラメータによって決定されます。さらに、`DateTime64` 型はカラム全体に対して同じタイムゾーンを格納することができ、これによって `DateTime64` 型の値がテキスト形式で表示される方法や、文字列として指定された値が解析される方法に影響します(‘2020-01-01 05:00:01.000’)。タイムゾーンはテーブルの行(または結果セット)には格納されませんが、カラムのメタデータに格納されます。詳細は[DateTime](../../sql-reference/data-types/datetime.md)を参照してください。 + +サポートされている値の範囲: \[1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999\] + +注意: 最大値の精度は8です。最大精度の9桁(ナノ秒)が使用された場合、最大でサポートされる値は UTC において `2262-04-11 23:47:16` です。 + +## 例 + +1. `DateTime64`型のカラムを持つテーブルを作成し、データを挿入する例: + +``` sql +CREATE TABLE dt64 +( + `timestamp` DateTime64(3, 'Asia/Istanbul'), + `event_id` UInt8 +) +ENGINE = TinyLog; +``` + +``` sql +-- DateTime を解析する +-- - 1970-01-01からの秒数としての整数から。 +-- - 文字列から。 +INSERT INTO dt64 VALUES (1546300800123, 1), (1546300800.123, 2), ('2019-01-01 00:00:00', 3); + +SELECT * FROM dt64; +``` + +``` text +┌───────────────timestamp─┬─event_id─┐ +│ 2019-01-01 03:00:00.123 │ 1 │ +│ 2019-01-01 03:00:00.123 │ 2 │ +│ 2019-01-01 00:00:00.000 │ 3 │ +└─────────────────────────┴──────────┘ +``` + +- datetimeが整数として挿入される場合、それは適切にスケーリングされた Unix タイムスタンプ (UTC) として扱われます。`1546300800000` (精度3) は `'2019-01-01 00:00:00'` UTC を表します。ただし、`timestamp` カラムには `Asia/Istanbul` (UTC+3) タイムゾーンが指定されているため、文字列として出力されると `'2019-01-01 03:00:00'` と表示されます。datetimeを小数として挿入すると、整数と同様に扱われますが、小数点前の値が Unix タイムスタンプの秒までを表し、小数点後の値は精度として扱われます。 +- 文字列値がdatetimeとして挿入される場合、それはカラムのタイムゾーンにあるものとして扱われます。`'2019-01-01 00:00:00'` は `Asia/Istanbul` タイムゾーンにあるものとして扱われ、`1546290000000` として格納されます。 + +2. `DateTime64` 値のフィルタリング + +``` sql +SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul'); +``` + +``` text +┌───────────────timestamp─┬─event_id─┐ +│ 2019-01-01 00:00:00.000 │ 3 │ +└─────────────────────────┴──────────┘ +``` + +`DateTime` とは異なり、`DateTime64` の値は `String` から自動的に変換されません。 + +``` sql +SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3); +``` + +``` text +┌───────────────timestamp─┬─event_id─┐ +│ 2019-01-01 03:00:00.123 │ 1 │ +│ 2019-01-01 03:00:00.123 │ 2 │ +└─────────────────────────┴──────────┘ +``` + +挿入とは逆に、`toDateTime64` 関数はすべての値を小数バリアントとして処理するため、精度は小数点の後に与える必要があります。 + +3. `DateTime64`型の値のタイムゾーンを取得する: + +``` sql +SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x; +``` + +``` text +┌──────────────────column─┬─x──────────────────────────────┐ +│ 2023-06-05 00:09:52.000 │ DateTime64(3, 'Asia/Istanbul') │ +└─────────────────────────┴────────────────────────────────┘ +``` + +4. タイムゾーン変換 + +``` sql +SELECT +toDateTime64(timestamp, 3, 'Europe/London') as lon_time, +toDateTime64(timestamp, 3, 'Asia/Istanbul') as istanbul_time +FROM dt64; +``` + +``` text +┌────────────────lon_time─┬───────────istanbul_time─┐ +│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │ +│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │ +│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │ +└─────────────────────────┴─────────────────────────┘ +``` + +**参照** + +- [型変換関数](../../sql-reference/functions/type-conversion-functions.md) +- [日付と時刻を扱う関数](../../sql-reference/functions/date-time-functions.md) +- [`date_time_input_format` 設定](../../operations/settings/settings-formats.md#date_time_input_format) +- [`date_time_output_format` 設定](../../operations/settings/settings-formats.md#date_time_output_format) +- [`timezone` サーバー構成パラメータ](../../operations/server-configuration-parameters/settings.md#timezone) +- [`session_timezone` 設定](../../operations/settings/settings.md#session_timezone) +- [日付と時刻を扱うための演算子](../../sql-reference/operators/index.md#operators-for-working-with-dates-and-times) +- [`Date` データ型](../../sql-reference/data-types/date.md) +- [`DateTime` データ型](../../sql-reference/data-types/datetime.md) diff --git a/docs/ja/sql-reference/data-types/decimal.md b/docs/ja/sql-reference/data-types/decimal.md new file mode 100644 index 00000000000..616197fc69c --- /dev/null +++ b/docs/ja/sql-reference/data-types/decimal.md @@ -0,0 +1,119 @@ +--- +slug: /ja/sql-reference/data-types/decimal +sidebar_position: 6 +sidebar_label: Decimal +--- + +# Decimal, Decimal(P), Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S), Decimal256(S) + +符号付きの固定小数点数で、加算、減算、乗算の際に精度を保持します。除算では、小数部分の最下位桁が切り捨てられます(四捨五入しません)。 + +## パラメータ + +- P - 精度。 有効範囲: \[ 1 : 76 \]。数値が持つことができる10進数の桁数(小数部を含む)を決定します。デフォルトでは、精度は10です。 +- S - スケール。 有効範囲: \[ 0 : P \]。小数部が持つことができる10進数の桁数を決定します。 + +Decimal(P)はDecimal(P, 0)と同等です。同様に、Decimalという構文はDecimal(10, 0)と同等です。 + +Pパラメータ値に応じて、Decimal(P, S)は以下の代替表記があります: +- Pが \[ 1 : 9 \] の場合 - Decimal32(S) +- Pが \[ 10 : 18 \] の場合 - Decimal64(S) +- Pが \[ 19 : 38 \] の場合 - Decimal128(S) +- Pが \[ 39 : 76 \] の場合 - Decimal256(S) + +## Decimal 値の範囲 + +- Decimal32(S) - ( -1 \* 10^(9 - S), 1 \* 10^(9 - S) ) +- Decimal64(S) - ( -1 \* 10^(18 - S), 1 \* 10^(18 - S) ) +- Decimal128(S) - ( -1 \* 10^(38 - S), 1 \* 10^(38 - S) ) +- Decimal256(S) - ( -1 \* 10^(76 - S), 1 \* 10^(76 - S) ) + +例えば、Decimal32(4) は -99999.9999 から 99999.9999 までの数値を0.0001単位で含むことができます。 + +## 内部表現 + +内部的には、データはそれぞれのビット幅を持つ通常の符号付き整数として表現されます。メモリに格納可能な実際の値の範囲は上記より少し大きく、文字列からの変換時にのみチェックされます。 + +現代のCPUは128ビットと256ビットの整数をネイティブにサポートしていないため、Decimal128およびDecimal256の操作はエミュレートされます。したがって、Decimal128およびDecimal256はDecimal32/Decimal64よりもかなり遅く動作します。 + +## 演算と結果の型 + +Decimalに対する二項演算は、より幅広い結果型となります(引数の順序にかかわらず)。 + +- `Decimal64(S1) Decimal32(S2) -> Decimal64(S)` +- `Decimal128(S1) Decimal32(S2) -> Decimal128(S)` +- `Decimal128(S1) Decimal64(S2) -> Decimal128(S)` +- `Decimal256(S1) Decimal<32|64|128>(S2) -> Decimal256(S)` + +スケールのルール: + +- 加算、減算: S = max(S1, S2)。 +- 乗算: S = S1 + S2。 +- 除算: S = S1。 + +Decimalと整数の間での類似演算の場合、結果は引数と同じサイズのDecimalになります。 + +DecimalとFloat32/Float64の間の演算は定義されていません。それらが必要な場合は、toDecimal32、toDecimal64、toDecimal128 あるいは toFloat32、toFloat64という組み込み関数でどちらかの引数を明示的にキャストすることができます。ただし、結果は精度を失い、型変換は計算コストの高い操作であることに留意してください。 + +一部のDecimal関数の結果はFloat64として返されます(例えば、varやstddev)。中間計算は依然としてDecimalで実行される可能性があり、Float64と同じ値でDecimal入力を行った場合に異なる結果が生成されることがあります。 + +## オーバーフローチェック + +Decimalの計算中に整数オーバーフローが発生する可能性があります。小数部の過剰な桁は切り捨てられます(四捨五入しません)。整数部の過剰な桁は例外を引き起こします。 + +:::warning +オーバーフローチェックはDecimal128およびDecimal256に対して実装されていません。オーバーフローが発生した場合、不正確な結果が返され、例外は投げられません。 +::: + +``` sql +SELECT toDecimal32(2, 4) AS x, x / 3 +``` + +``` text +┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐ +│ 2.0000 │ 0.6666 │ +└────────┴──────────────────────────────┘ +``` + +``` sql +SELECT toDecimal32(4.2, 8) AS x, x * x +``` + +``` text +DB::Exception: Scale is out of bounds. +``` + +``` sql +SELECT toDecimal32(4.2, 8) AS x, 6 * x +``` + +``` text +DB::Exception: Decimal math overflow. +``` + +オーバーフローチェックは演算の速度を遅くします。オーバーフローが発生しないことがわかっている場合は、`decimal_check_overflow`設定を使用してチェックを無効にすることをお勧めします。チェックを無効にし、オーバーフローが発生すると、結果は不正確になります。 + +``` sql +SET decimal_check_overflow = 0; +SELECT toDecimal32(4.2, 8) AS x, 6 * x +``` + +``` text +┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐ +│ 4.20000000 │ -17.74967296 │ +└────────────┴──────────────────────────────────┘ +``` + +オーバーフローチェックは算術演算だけでなく、値の比較でも発生します。 + +``` sql +SELECT toDecimal32(1, 8) < 100 +``` + +``` text +DB::Exception: Can't compare. +``` + +**関連項目** +- [isDecimalOverflow](../../sql-reference/functions/other-functions.md#is-decimal-overflow) +- [countDigits](../../sql-reference/functions/other-functions.md#count-digits) diff --git a/docs/ja/sql-reference/data-types/domains/index.md b/docs/ja/sql-reference/data-types/domains/index.md new file mode 100644 index 00000000000..dc6a71fbba6 --- /dev/null +++ b/docs/ja/sql-reference/data-types/domains/index.md @@ -0,0 +1,29 @@ +--- +slug: /ja/sql-reference/data-types/domains/ +sidebar_position: 56 +sidebar_label: ドメイン +--- + +# ドメイン + +ドメインは、既存の基本型にいくつかの追加機能を持たせた特別な型であり、基盤となるデータ型のオンワイヤおよびオンディスク形式を保持します。現時点で、ClickHouseはユーザー定義ドメインをサポートしていません。 + +ドメインは、対応する基本型が使用できるすべての場所で使用できます。たとえば: + +- ドメイン型のカラムを作成 +- ドメインカラムから/へ値を読み書き +- 基本型がインデックスとして使用できる場合にはそれをインデックスとして使用 +- ドメインカラムの値を使って関数を呼び出し + +### ドメインの追加機能 + +- `SHOW CREATE TABLE` または `DESCRIBE TABLE` での明示的なカラム型名 +- `INSERT INTO domain_table(domain_column) VALUES(...)` を用いた人間に優しいフォーマットからの入力 +- `SELECT domain_column FROM domain_table` のための人間に優しいフォーマットへの出力 +- 外部ソースから人間に優しいフォーマットでデータをロード: `INSERT INTO domain_table FORMAT CSV ...` + +### 制限事項 + +- 基本型のインデックスカラムを `ALTER TABLE` でドメイン型に変換できません。 +- 別のカラムやテーブルからデータを挿入する際に、文字列値をドメイン値に暗黙的に変換できません。 +- ドメインは、保存された値に対して制約を追加しません。 diff --git a/docs/ja/sql-reference/data-types/dynamic.md b/docs/ja/sql-reference/data-types/dynamic.md new file mode 100644 index 00000000000..e04531be596 --- /dev/null +++ b/docs/ja/sql-reference/data-types/dynamic.md @@ -0,0 +1,705 @@ +--- +slug: /ja/sql-reference/data-types/dynamic +sidebar_position: 62 +sidebar_label: Dynamic +--- + +# Dynamic + +この型は、事前にすべてを知ることなく、任意の型の値を内部に格納することができます。 + +`Dynamic` 型のカラムを宣言するには、次の構文を使用します: + +``` sql + Dynamic(max_types=N) +``` + +ここで、`N` は任意のパラメータで、`0`から`254`までの範囲内で指定できます。これは、`Dynamic` 型のカラム内で、別々に格納されるデータの単一ブロック(例えば、MergeTree テーブルの単一データ部分)にわたって、いくつの異なるデータ型を個別のサブカラムとして格納できるかを示します。この制限を超えると、新しい型のすべての値はバイナリ形式の特別な共有データ構造に一緒に格納されます。`max_types` のデフォルト値は `32` です。 + +:::note +Dynamic データ型はエクスペリメンタルな機能です。使用するには、`allow_experimental_dynamic_type = 1` を設定してください。 +::: + +## Dynamicの作成 + +テーブルカラムの定義で `Dynamic` 型を使用します: + +```sql +CREATE TABLE test (d Dynamic) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d─────────────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ 42 │ Int64 │ +│ Hello, World! │ String │ +│ [1,2,3] │ Array(Int64) │ +└───────────────┴────────────────┘ +``` + +通常のカラムからCASTを使用: + +```sql +SELECT 'Hello, World!'::Dynamic as d, dynamicType(d); +``` + +```text +┌─d─────────────┬─dynamicType(d)─┐ +│ Hello, World! │ String │ +└───────────────┴────────────────┘ +``` + +`Variant` カラムからCASTを使用: + +```sql +SET allow_experimental_variant_type = 1, use_variant_as_common_type = 1; +SELECT multiIf((number % 3) = 0, number, (number % 3) = 1, range(number + 1), NULL)::Dynamic AS d, dynamicType(d) FROM numbers(3) +``` + +```text +┌─d─────┬─dynamicType(d)─┐ +│ 0 │ UInt64 │ +│ [0,1] │ Array(UInt64) │ +│ ᴺᵁᴸᴸ │ None │ +└───────┴────────────────┘ +``` + + +## Dynamicのネストされた型をサブカラムとして読む + +`Dynamic` 型は、型名をサブカラムとして使用して、`Dynamic` カラムから単一のネストされた型を読むことをサポートしています。 +したがって、カラム `d Dynamic` がある場合、有効な型 `T` のサブカラムを `d.T` という構文で読むことができます。 +このサブカラムは `Nullable(T)` タイプを持ち、`T` が `Nullable` 内にある場合はそうであり、他の場合は `T` です。このサブカラムは元の `Dynamic` カラムと同じサイズで、 +元の `Dynamic` カラムに型 `T` がないすべての行に `NULL` 値(または `T` が `Nullable` 内にあることができない場合は空の値)を含みます。 + +`Dynamic` サブカラムは `dynamicElement(dynamic_column, type_name)` 関数を使用しても読むことができます。 + +例: + +```sql +CREATE TABLE test (d Dynamic) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT d, dynamicType(d), d.String, d.Int64, d.`Array(Int64)`, d.Date, d.`Array(String)` FROM test; +``` + +```text +┌─d─────────────┬─dynamicType(d)─┬─d.String──────┬─d.Int64─┬─d.Array(Int64)─┬─d.Date─┬─d.Array(String)─┐ +│ ᴺᵁᴸᴸ │ None │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ Int64 │ ᴺᵁᴸᴸ │ 42 │ [] │ ᴺᵁᴸᴸ │ [] │ +│ Hello, World! │ String │ Hello, World! │ ᴺᵁᴸᴸ │ [] │ ᴺᵁᴸᴸ │ [] │ +│ [1,2,3] │ Array(Int64) │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ ᴺᵁᴸᴸ │ [] │ +└───────────────┴────────────────┴───────────────┴─────────┴────────────────┴────────┴─────────────────┘ +``` + +```sql +SELECT toTypeName(d.String), toTypeName(d.Int64), toTypeName(d.`Array(Int64)`), toTypeName(d.Date), toTypeName(d.`Array(String)`) FROM test LIMIT 1; +``` + +```text +┌─toTypeName(d.String)─┬─toTypeName(d.Int64)─┬─toTypeName(d.Array(Int64))─┬─toTypeName(d.Date)─┬─toTypeName(d.Array(String))─┐ +│ Nullable(String) │ Nullable(Int64) │ Array(Int64) │ Nullable(Date) │ Array(String) │ +└──────────────────────┴─────────────────────┴────────────────────────────┴────────────────────┴─────────────────────────────┘ +``` + +```sql +SELECT d, dynamicType(d), dynamicElement(d, 'String'), dynamicElement(d, 'Int64'), dynamicElement(d, 'Array(Int64)'), dynamicElement(d, 'Date'), dynamicElement(d, 'Array(String)') FROM test; +``` + +```text +┌─d─────────────┬─dynamicType(d)─┬─dynamicElement(d, 'String')─┬─dynamicElement(d, 'Int64')─┬─dynamicElement(d, 'Array(Int64)')─┬─dynamicElement(d, 'Date')─┬─dynamicElement(d, 'Array(String)')─┐ +│ ᴺᵁᴸᴸ │ None │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ Int64 │ ᴺᵁᴸᴸ │ 42 │ [] │ ᴺᵁᴸᴸ │ [] │ +│ Hello, World! │ String │ Hello, World! │ ᴺᵁᴸᴸ │ [] │ ᴺᵁᴸᴸ │ [] │ +│ [1,2,3] │ Array(Int64) │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ ᴺᵁᴸᴸ │ [] │ +└───────────────┴────────────────┴─────────────────────────────┴────────────────────────────┴───────────────────────────────────┴───────────────────────────┴────────────────────────────────────┘ +``` + +各行に格納されているバリアントを知るためには、関数 `dynamicType(dynamic_column)` を使用できます。この関数は、各行の値型名を `String` で返します(行が `NULL` の場合は `'None'` を返します)。 + +例: + +```sql +CREATE TABLE test (d Dynamic) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT dynamicType(d) from test; +``` + +```text +┌─dynamicType(d)─┐ +│ None │ +│ Int64 │ +│ String │ +│ Array(Int64) │ +└────────────────┘ +``` + +## Dynamicカラムと他のカラム間の変換 + +`Dynamic` カラムに関しては、4つの可能な変換があります。 + +### 通常のカラムをDynamicカラムに変換 + +```sql +SELECT 'Hello, World!'::Dynamic as d, dynamicType(d); +``` + +```text +┌─d─────────────┬─dynamicType(d)─┐ +│ Hello, World! │ String │ +└───────────────┴────────────────┘ +``` + +### StringカラムをDynamicカラムに変換して解析 + +`String` カラムから `Dynamic` 型の値を解析するには、`cast_string_to_dynamic_use_inference` を有効にすることができます: + +```sql +SET cast_string_to_dynamic_use_inference = 1; +SELECT CAST(materialize(map('key1', '42', 'key2', 'true', 'key3', '2020-01-01')), 'Map(String, Dynamic)') as map_of_dynamic, mapApply((k, v) -> (k, dynamicType(v)), map_of_dynamic) as map_of_dynamic_types; +``` + +```text +┌─map_of_dynamic──────────────────────────────┬─map_of_dynamic_types─────────────────────────┐ +│ {'key1':42,'key2':true,'key3':'2020-01-01'} │ {'key1':'Int64','key2':'Bool','key3':'Date'} │ +└─────────────────────────────────────────────┴──────────────────────────────────────────────┘ +``` + +### Dynamicカラムを通常のカラムに変換 + +`Dynamic` カラムを通常のカラムに変換することが可能です。この場合、すべてのネストされた型は目的型に変換されます: + +```sql +CREATE TABLE test (d Dynamic) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('42.42'), (true), ('e10'); +SELECT d::Nullable(Float64) FROM test; +``` + +```text +┌─CAST(d, 'Nullable(Float64)')─┐ +│ ᴺᵁᴸᴸ │ +│ 42 │ +│ 42.42 │ +│ 1 │ +│ 0 │ +└──────────────────────────────┘ +``` + +### VariantカラムをDynamicカラムに変換 + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('String'), ([1, 2, 3]); +SELECT v::Dynamic as d, dynamicType(d) from test; +``` + +```text +┌─d───────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ 42 │ UInt64 │ +│ String │ String │ +│ [1,2,3] │ Array(UInt64) │ +└─────────┴────────────────┘ +``` + +### Dynamic(max_types=N)カラムを別のDynamic(max_types=K)に変換 + +もし `K >= N` の場合、変換中にデータは変わりません: + +```sql +CREATE TABLE test (d Dynamic(max_types=3)) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), (43), ('42.42'), (true); +SELECT d::Dynamic(max_types=5) as d2, dynamicType(d2) FROM test; +``` + +```text +┌─d─────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ 42 │ Int64 │ +│ 43 │ Int64 │ +│ 42.42 │ String │ +│ true │ Bool │ +└───────┴────────────────┘ +``` + +もし `K < N` の場合、最も希少な型の値が単一の特別なサブカラムに挿入されますが、依然としてアクセス可能です: +```text +CREATE TABLE test (d Dynamic(max_types=4)) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), (43), ('42.42'), (true), ([1, 2, 3]); +SELECT d, dynamicType(d), d::Dynamic(max_types=2) as d2, dynamicType(d2), isDynamicElementInSharedData(d2) FROM test; +``` + +```text +┌─d───────┬─dynamicType(d)─┬─d2──────┬─dynamicType(d2)─┬─isDynamicElementInSharedData(d2)─┐ +│ ᴺᵁᴸᴸ │ None │ ᴺᵁᴸᴸ │ None │ false │ +│ 42 │ Int64 │ 42 │ Int64 │ false │ +│ 43 │ Int64 │ 43 │ Int64 │ false │ +│ 42.42 │ String │ 42.42 │ String │ false │ +│ true │ Bool │ true │ Bool │ true │ +│ [1,2,3] │ Array(Int64) │ [1,2,3] │ Array(Int64) │ true │ +└─────────┴────────────────┴─────────┴─────────────────┴──────────────────────────────────┘ +``` + +関数 `isDynamicElementInSharedData` は `Dynamic` 内に特別な共有データ構造で格納されている行に対しては `true` を返し、結果的にカラムはデータ構造内に格納されていない2つの型のみを含みます。 + +もし `K=0` の場合、すべての型は単一の特別なサブカラムに挿入されます: + +```text +CREATE TABLE test (d Dynamic(max_types=4)) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), (43), ('42.42'), (true), ([1, 2, 3]); +SELECT d, dynamicType(d), d::Dynamic(max_types=0) as d2, dynamicType(d2), isDynamicElementInSharedData(d2) FROM test; +``` + +```text +┌─d───────┬─dynamicType(d)─┬─d2──────┬─dynamicType(d2)─┬─isDynamicElementInSharedData(d2)─┐ +│ ᴺᵁᴸᴸ │ None │ ᴺᵁᴸᴸ │ None │ false │ +│ 42 │ Int64 │ 42 │ Int64 │ true │ +│ 43 │ Int64 │ 43 │ Int64 │ true │ +│ 42.42 │ String │ 42.42 │ String │ true │ +│ true │ Bool │ true │ Bool │ true │ +│ [1,2,3] │ Array(Int64) │ [1,2,3] │ Array(Int64) │ true │ +└─────────┴────────────────┴─────────┴─────────────────┴──────────────────────────────────┘ +``` + +## データからDynamic型を読み取る + +すべてのテキストフォーマット(TSV、CSV、CustomSeparated、Values、JSONEachRowなど)は、`Dynamic` 型の読み取りをサポートしています。データ解析中、ClickHouseは各値の型を推測し、それを `Dynamic` カラムへの挿入時に使用します。 + +例: + +```sql +SELECT + d, + dynamicType(d), + dynamicElement(d, 'String') AS str, + dynamicElement(d, 'Int64') AS num, + dynamicElement(d, 'Float64') AS float, + dynamicElement(d, 'Date') AS date, + dynamicElement(d, 'Array(Int64)') AS arr +FROM format(JSONEachRow, 'd Dynamic', $$ +{"d" : "Hello, World!"}, +{"d" : 42}, +{"d" : 42.42}, +{"d" : "2020-01-01"}, +{"d" : [1, 2, 3]} +$$) +``` + +```text +┌─d─────────────┬─dynamicType(d)─┬─str───────────┬──num─┬─float─┬───────date─┬─arr─────┐ +│ Hello, World! │ String │ Hello, World! │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ Int64 │ ᴺᵁᴸᴸ │ 42 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42.42 │ Float64 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 42.42 │ ᴺᵁᴸᴸ │ [] │ +│ 2020-01-01 │ Date │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2020-01-01 │ [] │ +│ [1,2,3] │ Array(Int64) │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ +└───────────────┴────────────────┴───────────────┴──────┴───────┴────────────┴─────────┘ +``` + +## 関数でDynamic型を使用する + +ほとんどの関数は `Dynamic` 型の引数をサポートしています。この場合、関数は `Dynamic` カラム内に格納されている各内部データ型に対して個別に実行されます。 +関数の結果型が引数型に依存する場合、`Dynamic` 引数で実行された関数の結果は `Dynamic` になります。関数の結果型が引数型に依存しない場合、結果はこの関数の通常の結果型 `T` の `Nullable(T)` になります。 + +例: + +```sql +CREATE TABLE test (d Dynamic) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (1::Int8), (2::Int16), (3::Int32), (4::Int64); +``` + +```sql +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ 1 │ Int8 │ +│ 2 │ Int16 │ +│ 3 │ Int32 │ +│ 4 │ Int64 │ +└──────┴────────────────┘ +``` + +```sql +SELECT d, d + 1 AS res, toTypeName(res), dynamicType(res) FROM test; +``` + +```text +┌─d────┬─res──┬─toTypeName(res)─┬─dynamicType(res)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Dynamic │ None │ +│ 1 │ 2 │ Dynamic │ Int16 │ +│ 2 │ 3 │ Dynamic │ Int32 │ +│ 3 │ 4 │ Dynamic │ Int64 │ +│ 4 │ 5 │ Dynamic │ Int64 │ +└──────┴──────┴─────────────────┴──────────────────┘ +``` + +```sql +SELECT d, d + d AS res, toTypeName(res), dynamicType(res) FROM test; +``` + +```text +┌─d────┬─res──┬─toTypeName(res)─┬─dynamicType(res)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Dynamic │ None │ +│ 1 │ 2 │ Dynamic │ Int16 │ +│ 2 │ 4 │ Dynamic │ Int32 │ +│ 3 │ 6 │ Dynamic │ Int64 │ +│ 4 │ 8 │ Dynamic │ Int64 │ +└──────┴──────┴─────────────────┴──────────────────┘ +``` + +```sql +SELECT d, d < 3 AS res, toTypeName(res) FROM test; +``` + +```text +┌─d────┬──res─┬─toTypeName(res)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Nullable(UInt8) │ +│ 1 │ 1 │ Nullable(UInt8) │ +│ 2 │ 1 │ Nullable(UInt8) │ +│ 3 │ 0 │ Nullable(UInt8) │ +│ 4 │ 0 │ Nullable(UInt8) │ +└──────┴──────┴─────────────────┘ +``` + +```sql +SELECT d, exp2(d) AS res, toTypeName(res) FROM test; +``` + +```sql +┌─d────┬──res─┬─toTypeName(res)───┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Nullable(Float64) │ +│ 1 │ 2 │ Nullable(Float64) │ +│ 2 │ 4 │ Nullable(Float64) │ +│ 3 │ 8 │ Nullable(Float64) │ +│ 4 │ 16 │ Nullable(Float64) │ +└──────┴──────┴───────────────────┘ +``` + +```sql +TRUNCATE TABLE test; +INSERT INTO test VALUES (NULL), ('str_1'), ('str_2'); +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d─────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ str_1 │ String │ +│ str_2 │ String │ +└───────┴────────────────┘ +``` + +```sql +SELECT d, upper(d) AS res, toTypeName(res) FROM test; +``` + +```text +┌─d─────┬─res───┬─toTypeName(res)──┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Nullable(String) │ +│ str_1 │ STR_1 │ Nullable(String) │ +│ str_2 │ STR_2 │ Nullable(String) │ +└───────┴───────┴──────────────────┘ +``` + +```sql +SELECT d, extract(d, '([0-3])') AS res, toTypeName(res) FROM test; +``` + +```text +┌─d─────┬─res──┬─toTypeName(res)──┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Nullable(String) │ +│ str_1 │ 1 │ Nullable(String) │ +│ str_2 │ 2 │ Nullable(String) │ +└───────┴──────┴──────────────────┘ +``` + +```sql +TRUNCATE TABLE test; +INSERT INTO test VALUES (NULL), ([1, 2]), ([3, 4]); +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d─────┬─dynamicType(d)─┐ +│ ᴺᵁᴸᴸ │ None │ +│ [1,2] │ Array(Int64) │ +│ [3,4] │ Array(Int64) │ +└───────┴────────────────┘ +``` + +```sql +SELECT d, d[1] AS res, toTypeName(res), dynamicType(res) FROM test; +``` + +```text +┌─d─────┬─res──┬─toTypeName(res)─┬─dynamicType(res)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ Dynamic │ None │ +│ [1,2] │ 1 │ Dynamic │ Int64 │ +│ [3,4] │ 3 │ Dynamic │ Int64 │ +└───────┴──────┴─────────────────┴──────────────────┘ +``` + +関数が `Dynamic` カラムの一部の型で実行できない場合、例外がスローされます: + +```sql +INSERT INTO test VALUES (42), (43), ('str_1'); +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d─────┬─dynamicType(d)─┐ +│ 42 │ Int64 │ +│ 43 │ Int64 │ +│ str_1 │ String │ +└───────┴────────────────┘ +``` + +```sql +SELECT d, d + 1 AS res, toTypeName(res), dynamicType(d) FROM test; +``` + +```text +Received exception: +Code: 43. DB::Exception: Illegal types Array(Int64) and UInt8 of arguments of function plus: while executing 'FUNCTION plus(__table1.d : 3, 1_UInt8 :: 1) -> plus(__table1.d, 1_UInt8) Dynamic : 0'. (ILLEGAL_TYPE_OF_ARGUMENT) +``` + +不要な型を除外することができます: + +```sql +SELECT d, d + 1 AS res, toTypeName(res), dynamicType(res) FROM test WHERE dynamicType(d) NOT IN ('String', 'Array(Int64)', 'None') +``` + +```text +┌─d──┬─res─┬─toTypeName(res)─┬─dynamicType(res)─┐ +│ 42 │ 43 │ Dynamic │ Int64 │ +│ 43 │ 44 │ Dynamic │ Int64 │ +└────┴─────┴─────────────────┴──────────────────┘ +``` + +または必要な型をサブカラムとして抽出: + +```sql +SELECT d, d.Int64 + 1 AS res, toTypeName(res) FROM test; +``` + +```text +┌─d─────┬──res─┬─toTypeName(res)─┐ +│ 42 │ 43 │ Nullable(Int64) │ +│ 43 │ 44 │ Nullable(Int64) │ +│ str_1 │ ᴺᵁᴸᴸ │ Nullable(Int64) │ +└───────┴──────┴─────────────────┘ +``` + +## ORDER BY と GROUP BY で Dynamic 型を使用する + +`ORDER BY` と `GROUP BY` 時、`Dynamic` 型の値は `Variant` 型の値と同様に比較されます: +型 `Dynamic` の値 `d1` の基礎となる型 `T1` と `d2` の基礎となる型 `T2` に対する演算子 `<` の結果は次のように定義されます: +- `T1 = T2 = T` の場合、結果は `d1.T < d2.T`(基礎値が比較されます)。 +- `T1 != T2` の場合、結果は `T1 < T2`(タイプ名が比較されます)。 + +デフォルトでは `Dynamic` 型は `GROUP BY`/`ORDER BY` キーでの使用が許可されていませんが、特別な比較規則を考慮し、設定 `allow_suspicious_types_in_group_by`/`allow_suspicious_types_in_order_by` を推奨されれば使用することができます。 + +例: +```sql +CREATE TABLE test (d Dynamic) ENGINE=Memory; +INSERT INTO test VALUES (42), (43), ('abc'), ('abd'), ([1, 2, 3]), ([]), (NULL); +``` + +```sql +SELECT d, dynamicType(d) FROM test; +``` + +```text +┌─d───────┬─dynamicType(d)─┐ +│ 42 │ Int64 │ +│ 43 │ Int64 │ +│ abc │ String │ +│ abd │ String │ +│ [1,2,3] │ Array(Int64) │ +│ [] │ Array(Int64) │ +│ ᴺᵁᴸᴸ │ None │ +└─────────┴────────────────┘ +``` + +```sql +SELECT d, dynamicType(d) FROM test ORDER BY d SETTINGS allow_suspicious_types_in_order_by=1; +``` + +```sql +┌─d───────┬─dynamicType(d)─┐ +│ [] │ Array(Int64) │ +│ [1,2,3] │ Array(Int64) │ +│ 42 │ Int64 │ +│ 43 │ Int64 │ +│ abc │ String │ +│ abd │ String │ +│ ᴺᵁᴸᴸ │ None │ +└─────────┴────────────────┘ +``` + +**注意:** 異なる数値型を持つ動的型の値は異なる値と見なされ、お互いに比較されることはなく、そのタイプ名が比較されます。 + +例: + +```sql +CREATE TABLE test (d Dynamic) ENGINE=Memory; +INSERT INTO test VALUES (1::UInt32), (1::Int64), (100::UInt32), (100::Int64); +SELECT d, dynamicType(d) FROM test ORDER BY d SETTINGS allow_suspicious_types_in_order_by=1; +``` + +```text +┌─v───┬─dynamicType(v)─┐ +│ 1 │ Int64 │ +│ 100 │ Int64 │ +│ 1 │ UInt32 │ +│ 100 │ UInt32 │ +└─────┴────────────────┘ +``` + +```sql +SELECT d, dynamicType(d) FROM test GROUP by d SETTINGS allow_suspicious_types_in_group_by=1; +``` + +```text +┌─d───┬─dynamicType(d)─┐ +│ 1 │ Int64 │ +│ 100 │ UInt32 │ +│ 1 │ UInt32 │ +│ 100 │ Int64 │ +└─────┴────────────────┘ +``` + +**注意:** 記述された比較規則は、`Dynamic` 型での関数の特別な作業による比較関数 `=` や `>` などの関数実行時には適用されません。 + +## Dynamicの内部に異なるデータ型を格納する際の制限に達する + +`Dynamic` データ型は、限られた数の異なるデータ型を別々のサブカラムとしてのみ格納できます。デフォルトでこの制限は32ですが、型の宣言において `Dynamic(max_types=N)` の構文を使用して変更することができます。Nは0から254の間です(実装の詳細により、Dynamic内にサブカラムとして格納可能な異なるデータ型が254種類以上になることはできません)。 +制限に達した場合、`Dynamic` カラムに挿入されるすべての新しいデータ型は、異なるデータ型をバイナリ形式で格納する共有データ構造に挿入されます。 + +制限に達した際のシナリオを見てみましょう。 + +### データ解析中に制限に達する + +`Dynamic` の値をデータから解析する際、現在のデータブロックの制限に達した場合、すべての新しい値は共有データ構造に挿入されます: + +```sql +SELECT d, dynamicType(d), isDynamicElementInSharedData(d) FROM format(JSONEachRow, 'd Dynamic(max_types=3)', ' +{"d" : 42} +{"d" : [1, 2, 3]} +{"d" : "Hello, World!"} +{"d" : "2020-01-01"} +{"d" : ["str1", "str2", "str3"]} +{"d" : {"a" : 1, "b" : [1, 2, 3]}} +') +``` + +```text +┌─d──────────────────────┬─dynamicType(d)─────────────────┬─isDynamicElementInSharedData(d)─┐ +│ 42 │ Int64 │ false │ +│ [1,2,3] │ Array(Int64) │ false │ +│ Hello, World! │ String │ false │ +│ 2020-01-01 │ Date │ true │ +│ ['str1','str2','str3'] │ Array(String) │ true │ +│ (1,[1,2,3]) │ Tuple(a Int64, b Array(Int64)) │ true │ +└────────────────────────┴────────────────────────────────┴─────────────────────────────────┘ +``` + +3種類の異なるデータ型 `Int64`、`Array(Int64)`、`String` を挿入した後に、新しい型はすべて特別な共有データ構造に挿入されたことが確認できます。 + +### MergeTree テーブルエンジンでのデータ部分のマージ中 + +MergeTree テーブルのいくつかのデータ部分のマージ中に、`Dynamic` カラムが別々のサブカラム内に格納できる異なるデータ型の制限に達し、すべての型をソース部分からサブカラムとして格納できなくなる場合があります。 +この場合、ClickHouseは、マージ後にどの型がサブカラムとして残り、どの型が共有データ構造に挿入されるかを選択します。ほとんどの場合、ClickHouseは最も頻繁な型を保持し、最も希少な型を共有データ構造に格納しようとしますが、それは実装に依存します。 + +このようなマージの例を見てみましょう。まず、`Dynamic` カラムを持つテーブルを作成し、異なるデータ型数の制限を `3` に設定し、5つの異なる型の値を挿入します: + +```sql +CREATE TABLE test (id UInt64, d Dynamic(max_types=3)) engine=MergeTree ORDER BY id; +SYSTEM STOP MERGES test; +INSERT INTO test SELECT number, number FROM numbers(5); +INSERT INTO test SELECT number, range(number) FROM numbers(4); +INSERT INTO test SELECT number, toDate(number) FROM numbers(3); +INSERT INTO test SELECT number, map(number, number) FROM numbers(2); +INSERT INTO test SELECT number, 'str_' || toString(number) FROM numbers(1); +``` + +各インサートは単一の型を持つ `Dynamic` カラムを含む別々のデータパートを作成します: +```sql +SELECT count(), dynamicType(d), isDynamicElementInSharedData(d), _part FROM test GROUP BY _part, dynamicType(d), isDynamicElementInSharedData(d) ORDER BY _part, count(); +``` + +```text +┌─count()─┬─dynamicType(d)──────┬─isDynamicElementInSharedData(d)─┬─_part─────┐ +│ 5 │ UInt64 │ false │ all_1_1_0 │ +│ 4 │ Array(UInt64) │ false │ all_2_2_0 │ +│ 3 │ Date │ false │ all_3_3_0 │ +│ 2 │ Map(UInt64, UInt64) │ false │ all_4_4_0 │ +│ 1 │ String │ false │ all_5_5_0 │ +└─────────┴─────────────────────┴─────────────────────────────────┴───────────┘ +``` + +次に、すべてのパートを一つにマージし、何が起こるかを見てみましょう: + +```sql +SYSTEM START MERGES test; +OPTIMIZE TABLE test FINAL; +SELECT count(), dynamicType(d), isDynamicElementInSharedData(d), _part FROM test GROUP BY _part, dynamicType(d), isDynamicElementInSharedData(d) ORDER BY _part, count() desc; +``` + +```text +┌─count()─┬─dynamicType(d)──────┬─isDynamicElementInSharedData(d)─┬─_part─────┐ +│ 5 │ UInt64 │ false │ all_1_5_2 │ +│ 4 │ Array(UInt64) │ false │ all_1_5_2 │ +│ 3 │ Date │ false │ all_1_5_2 │ +│ 2 │ Map(UInt64, UInt64) │ true │ all_1_5_2 │ +│ 1 │ String │ true │ all_1_5_2 │ +└─────────┴─────────────────────┴─────────────────────────────────┴───────────┘ +``` + +このように、ClickHouseは最も頻繁な型 `UInt64` と `Array(UInt64)` をサブカラムとして保持し、すべての他の型を共有データに挿入しました。 + +## DynamicとJSONExtract関数 + +すべての `JSONExtract*` 関数は `Dynamic` 型をサポートしています: + +```sql +SELECT JSONExtract('{"a" : [1, 2, 3]}', 'a', 'Dynamic') AS dynamic, dynamicType(dynamic) AS dynamic_type; +``` + +```text +┌─dynamic─┬─dynamic_type───────────┐ +│ [1,2,3] │ Array(Nullable(Int64)) │ +└─────────┴────────────────────────┘ +``` + +```sql +SELECT JSONExtract('{"obj" : {"a" : 42, "b" : "Hello", "c" : [1,2,3]}}', 'obj', 'Map(String, Dynamic)') AS map_of_dynamics, mapApply((k, v) -> (k, dynamicType(v)), map_of_dynamics) AS map_of_dynamic_types; +``` + +```text +┌─map_of_dynamics──────────────────┬─map_of_dynamic_types────────────────────────────────────┐ +│ {'a':42,'b':'Hello','c':[1,2,3]} │ {'a':'Int64','b':'String','c':'Array(Nullable(Int64))'} │ +└──────────────────────────────────┴─────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT JSONExtractKeysAndValues('{"a" : 42, "b" : "Hello", "c" : [1,2,3]}', 'Dynamic') AS dynamics, arrayMap(x -> (x.1, dynamicType(x.2)), dynamics) AS dynamic_types; +``` + +```text +┌─dynamics───────────────────────────────┬─dynamic_types─────────────────────────────────────────────────┐ +│ [('a',42),('b','Hello'),('c',[1,2,3])] │ [('a','Int64'),('b','String'),('c','Array(Nullable(Int64))')] │ +└────────────────────────────────────────┴───────────────────────────────────────────────────────────────┘ +``` + +### バイナリ出力形式 + +RowBinary形式では、`Dynamic` 型の値は次の形式でシリアライズされます: + +```text + +``` + diff --git a/docs/ja/sql-reference/data-types/enum.md b/docs/ja/sql-reference/data-types/enum.md new file mode 100644 index 00000000000..11a3970dde8 --- /dev/null +++ b/docs/ja/sql-reference/data-types/enum.md @@ -0,0 +1,159 @@ +--- +slug: /ja/sql-reference/data-types/enum +sidebar_position: 20 +sidebar_label: Enum +--- + +# Enum + +名前付き値の集合から成る列挙型です。 + +名前付き値は `'string' = integer` ペアや `'string'` 名として宣言できます。ClickHouse は数値のみを格納しますが、その名前を通じて値を操作することが可能です。 + +ClickHouse は以下をサポートします: + +- 8ビットの `Enum`。`[-128, 127]` 範囲で列挙された最大256の値を含むことができます。 +- 16ビットの `Enum`。`[-32768, 32767]` 範囲で列挙された最大65536の値を含むことができます。 + +ClickHouse はデータが挿入されたときに `Enum` の型を自動的に選択します。また、ストレージのサイズを確実にするために `Enum8` または `Enum16` 型を使用することもできます。 + +## 使用例 + +ここでは、`Enum8('hello' = 1, 'world' = 2)` 型のカラムを持つテーブルを作成します: + +``` sql +CREATE TABLE t_enum +( + x Enum('hello' = 1, 'world' = 2) +) +ENGINE = TinyLog +``` + +同様に、番号を省略することもできます。ClickHouse は連続する番号を自動的に割り当てます。デフォルトでは 1 から始まります。 + +``` sql +CREATE TABLE t_enum +( + x Enum('hello', 'world') +) +ENGINE = TinyLog +``` + +最初の名前に対して許可される開始番号を指定することもできます。 + +``` sql +CREATE TABLE t_enum +( + x Enum('hello' = 1, 'world') +) +ENGINE = TinyLog +``` + +``` sql +CREATE TABLE t_enum +( + x Enum8('hello' = -129, 'world') +) +ENGINE = TinyLog +``` + +``` text +Exception on server: +Code: 69. DB::Exception: Value -129 for element 'hello' exceeds range of Enum8. +``` + +カラム `x` には、型定義に記載されている `'hello'` または `'world'` のみを保存できます。その他の値を保存しようとすると、ClickHouse は例外を発生させます。この `Enum` のために 8ビットのサイズが自動的に選択されます。 + +``` sql +INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello') +``` + +``` text +Ok. +``` + +``` sql +INSERT INTO t_enum values('a') +``` + +``` text +Exception on client: +Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2) +``` + +テーブルからデータをクエリする場合、ClickHouse は `Enum` から文字列値を出力します。 + +``` sql +SELECT * FROM t_enum +``` + +``` text +┌─x─────┐ +│ hello │ +│ world │ +│ hello │ +└───────┘ +``` + +行の数値相当を確認する必要がある場合、`Enum` 値を整数型にキャストする必要があります。 + +``` sql +SELECT CAST(x, 'Int8') FROM t_enum +``` + +``` text +┌─CAST(x, 'Int8')─┐ +│ 1 │ +│ 2 │ +│ 1 │ +└─────────────────┘ +``` + +クエリ内で Enum 値を作成するには、`CAST` を使用する必要があります。 + +``` sql +SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)')) +``` + +``` text +┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐ +│ Enum8('a' = 1, 'b' = 2) │ +└─────────────────────────────────────────────────────┘ +``` + +## 一般的なルールと使用法 + +各値には、`Enum8` の場合には `-128 ... 127`、`Enum16` の場合には `-32768 ... 32767` の範囲で番号が割り当てられます。すべての文字列と数値は異なる必要があります。空文字列も許可されています。この型が指定されている場合(テーブル定義内)、数値の順番は任意で構いません。しかし、順序は重要ではありません。 + +`Enum` で文字列または数値の値は [NULL](../../sql-reference/syntax.md) にすることはできません。 + +`Enum` は [Nullable](../../sql-reference/data-types/nullable.md) 型に含めることができます。したがって、次のクエリを使用してテーブルを作成すると、 + +``` sql +CREATE TABLE t_enum_nullable +( + x Nullable( Enum8('hello' = 1, 'world' = 2) ) +) +ENGINE = TinyLog +``` + +`'hello'` と `'world'` のみならず、`NULL` も保存できるようになります。 + +``` sql +INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL) +``` + +RAM では、`Enum` カラムは対応する数値の `Int8` または `Int16` と同じ方法で保存されます。 + +テキスト形式で読み込むとき、ClickHouse は値を文字列として解析し、Enum 値の集合から対応する文字列を検索します。それが見つからない場合は例外が発生します。テキスト形式で書き込む際には、値を対応する文字列として出力します。カラムデータにごみ(有効な集合にない数値)が含まれている場合、例外が発生します。バイナリ形式での読み書きの際は、Int8 および Int16 のデータ型と同様の方法で動作します。暗黙のデフォルト値は最も低い番号の値です。 + +`ORDER BY`、`GROUP BY`、`IN`、`DISTINCT` などの際には、Enum は対応する数値と同じように動作します。例えば、ORDER BY は数値的にソートします。等価性および比較演算子は、Enum 上で基礎となる数値値と同じように機能します。 + +Enum 値は数値と比較できません。Enum は定数文字列と比較することができます。比較した文字列が Enum の有効な値でない場合、例外が発生します。Enum を左辺に、文字列の集合を右辺に持つ `IN` 演算子がサポートされています。文字列は対応する Enum の値です。 + +ほとんどの数値および文字列操作は Enum 値には定義されていません。例えば、Enum に数値を加算したり、Enum に文字列を連結したりすることはできません。しかし、Enum にはその文字列値を返す自然な `toString` 関数があります。 + +Enum 値は、`toT` 関数を使用して数値型に変換できます。ここで T は数値型です。T が enum の基礎となる数値型と一致する場合、この変換にコストはかかりません。 +ALTER を使用して Enum 型を変更することはコストがかからずに行えますが、値の集合が変更される場合のみです。ALTER を使用して Enum のメンバーを追加および削除することが可能です(削除は削除する値がテーブルで一度も使用されていない場合のみ安全です)。安全策として、以前に定義された Enum メンバーの数値値を変更すると例外が発生します。 + +ALTER を使用することで Enum8 を Enum16 に、または Enum16 を Enum8 に変更することができます。これは Int8 を Int16 に変更するのと同様です。 diff --git a/docs/ja/sql-reference/data-types/fixedstring.md b/docs/ja/sql-reference/data-types/fixedstring.md new file mode 100644 index 00000000000..8e661f76f9a --- /dev/null +++ b/docs/ja/sql-reference/data-types/fixedstring.md @@ -0,0 +1,60 @@ +--- +slug: /ja/sql-reference/data-types/fixedstring +sidebar_position: 10 +sidebar_label: FixedString(N) +--- + +# FixedString(N) + +`N`バイトの固定長の文字列(文字やコードポイントではありません)。 + +`FixedString`型のカラムを宣言するには、以下の構文を使用します。 + +``` sql + FixedString(N) +``` + +ここで、`N`は自然数です。 + +`FixedString`型は、データが正確に`N`バイトの長さを持つ場合に効率的です。それ以外の場合、効率が低下する可能性があります。 + +`FixedString`型のカラムに効率的に保存できる値の例: + +- IPアドレスのバイナリ表現(IPv6に対しては`FixedString(16)`)。 +- 言語コード(例: ru_RU, en_US)。 +- 通貨コード(例: USD, RUB)。 +- ハッシュのバイナリ表現(MD5に対しては`FixedString(16)`、SHA256に対しては`FixedString(32)`)。 + +UUID値を保存するためには、[UUID](../../sql-reference/data-types/uuid.md)データ型を使用してください。 + +データを挿入する際、ClickHouseは以下の処理を行います: + +- 文字列が`N`バイト未満の場合、ヌルバイトで補完します。 +- 文字列が`N`バイトを超える場合、`Too large value for FixedString(N)`例外をスローします。 + +データを選択する際、ClickHouseは文字列の末尾にあるヌルバイトを削除しません。`WHERE`句を使用する場合、`FixedString`値に一致させるため、手動でヌルバイトを追加する必要があります。以下の例は、`FixedString`と`WHERE`句をどのように使用するかを示しています。 + +次の単一の`FixedString(2)`カラムを含むテーブルを考えてみましょう。 + +``` text +┌─name──┐ +│ b │ +└───────┘ +``` + +クエリ `SELECT * FROM FixedStringTable WHERE a = 'b'` はデータを返しません。フィルタパターンをヌルバイトで補完する必要があります。 + +``` sql +SELECT * FROM FixedStringTable +WHERE a = 'b\0' +``` + +``` text +┌─a─┐ +│ b │ +└───┘ +``` + +この動作は、MySQLの`CHAR`型とは異なります(そこでは文字列はスペースでパディングされ、出力の際にはスペースは削除されます)。 + +`FixedString(N)`の値の長さは一定であることに注意してください。[length](../../sql-reference/functions/array-functions.md#array_functions-length)関数は、`FixedString(N)`の値がヌルバイトのみで埋められていても`N`を返しますが、[empty](../../sql-reference/functions/string-functions.md#empty)関数はこの場合に`1`を返します。 diff --git a/docs/ja/sql-reference/data-types/float.md b/docs/ja/sql-reference/data-types/float.md new file mode 100644 index 00000000000..bac5d628519 --- /dev/null +++ b/docs/ja/sql-reference/data-types/float.md @@ -0,0 +1,119 @@ +--- +slug: /ja/sql-reference/data-types/float +sidebar_position: 4 +sidebar_label: Float32, Float64 +--- + +# Float32, Float64 + +:::note +高精度が求められる計算、特に金融やビジネスデータの処理には、[Decimal](../data-types/decimal.md) の使用を検討してください。 + +[浮動小数点数](https://en.wikipedia.org/wiki/IEEE_754)は以下の例のように不正確な結果を招くことがあります: + +```sql +CREATE TABLE IF NOT EXISTS float_vs_decimal +( + my_float Float64, + my_decimal Decimal64(3) +) +Engine=MergeTree +ORDER BY tuple(); + +# 1 000 000 個の小数点以下 2 桁のランダムな数値を生成し、float と decimal として格納 +INSERT INTO float_vs_decimal SELECT round(randCanonical(), 3) AS res, res FROM system.numbers LIMIT 1000000; +``` +``` +SELECT sum(my_float), sum(my_decimal) FROM float_vs_decimal; + +┌──────sum(my_float)─┬─sum(my_decimal)─┐ +│ 499693.60500000004 │ 499693.605 │ +└────────────────────┴─────────────────┘ + +SELECT sumKahan(my_float), sumKahan(my_decimal) FROM float_vs_decimal; + +┌─sumKahan(my_float)─┬─sumKahan(my_decimal)─┐ +│ 499693.605 │ 499693.605 │ +└────────────────────┴──────────────────────┘ +``` +::: + +ClickHouseとCでの対応する型は以下の通りです: + +- `Float32` — `float` +- `Float64` — `double` + +ClickHouseにおけるFloat型のエイリアスは以下の通りです: + +- `Float32` — `FLOAT`, `REAL`, `SINGLE` +- `Float64` — `DOUBLE`, `DOUBLE PRECISION` + +テーブル作成時に、浮動小数点数の数値パラメータを設定することができます(例:`FLOAT(12)`, `FLOAT(15, 22)`, `DOUBLE(12)`, `DOUBLE(4, 18)`)が、ClickHouseはそれらを無視します。 + +## 浮動小数点数の使用 + +- 浮動小数点数を利用した計算は、丸め誤差を生じる可能性があります。 + + + +``` sql +SELECT 1 - 0.9 +``` + +``` text +┌───────minus(1, 0.9)─┐ +│ 0.09999999999999998 │ +└─────────────────────┘ +``` + +- 計算結果は計算方法(プロセッサタイプやコンピュータシステムのアーキテクチャ)に依存します。 +- 浮動小数点計算の結果として、無限大(`Inf`)や「数ではない」(`NaN`)といった数値を取得することがあります。これを計算結果の処理時に考慮する必要があります。 +- テキストから浮動小数点数をパースする際、結果が最も近い機械表現可能な数にならないことがあります。 + +## NaNとInf + +標準SQLとは異なり、ClickHouseは以下の浮動小数点数のカテゴリーをサポートしています: + +- `Inf` – 無限大 + + + +``` sql +SELECT 0.5 / 0 +``` + +``` text +┌─divide(0.5, 0)─┐ +│ inf │ +└────────────────┘ +``` + +- `-Inf` — 負の無限大 + + + +``` sql +SELECT -0.5 / 0 +``` + +``` text +┌─divide(-0.5, 0)─┐ +│ -inf │ +└─────────────────┘ +``` + +- `NaN` — 数ではない + + + +``` sql +SELECT 0 / 0 +``` + +``` text +┌─divide(0, 0)─┐ +│ nan │ +└──────────────┘ +``` + +`NaN`のソート順については、[ORDER BY句](../../sql-reference/statements/select/order-by.md)のセクションを参照してください。 diff --git a/docs/ja/sql-reference/data-types/geo.md b/docs/ja/sql-reference/data-types/geo.md new file mode 100644 index 00000000000..f31dad2b628 --- /dev/null +++ b/docs/ja/sql-reference/data-types/geo.md @@ -0,0 +1,142 @@ +--- +slug: /ja/sql-reference/data-types/geo +sidebar_position: 54 +sidebar_label: Geo +title: "Geometric" +--- + +ClickHouseは、地理的オブジェクト(位置、土地など)を表現するためのデータ型をサポートしています。 + +**関連リンク** +- [簡単な地理的特徴の表現方法](https://en.wikipedia.org/wiki/GeoJSON). + +## Point + +`Point` は、その X座標と Y座標で表され、[Tuple](tuple.md)([Float64](float.md), [Float64](float.md)) として格納されます。 + +**例** + +クエリ: + +```sql +CREATE TABLE geo_point (p Point) ENGINE = Memory(); +INSERT INTO geo_point VALUES((10, 10)); +SELECT p, toTypeName(p) FROM geo_point; +``` +結果: + +``` text +┌─p───────┬─toTypeName(p)─┐ +│ (10,10) │ Point │ +└─────────┴───────────────┘ +``` + +## Ring + +`Ring` は穴のない単純な多角形で、ポイントの配列として保存されます: [Array](array.md)([Point](#point))。 + +**例** + +クエリ: + +```sql +CREATE TABLE geo_ring (r Ring) ENGINE = Memory(); +INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]); +SELECT r, toTypeName(r) FROM geo_ring; +``` +結果: + +``` text +┌─r─────────────────────────────┬─toTypeName(r)─┐ +│ [(0,0),(10,0),(10,10),(0,10)] │ Ring │ +└───────────────────────────────┴───────────────┘ +``` + +## LineString + +`LineString` は線で、ポイントの配列として保存されます: [Array](array.md)([Point](#point))。 + +**例** + +クエリ: + +```sql +CREATE TABLE geo_linestring (l LineString) ENGINE = Memory(); +INSERT INTO geo_linestring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]); +SELECT l, toTypeName(l) FROM geo_linestring; +``` +結果: + +``` text +┌─r─────────────────────────────┬─toTypeName(r)─┐ +│ [(0,0),(10,0),(10,10),(0,10)] │ LineString │ +└───────────────────────────────┴───────────────┘ +``` + +## MultiLineString + +`MultiLineString` は複数のラインで、`LineString` の配列として保存されます: [Array](array.md)([LineString](#linestring))。 + +**例** + +クエリ: + +```sql +CREATE TABLE geo_multilinestring (l MultiLineString) ENGINE = Memory(); +INSERT INTO geo_multilinestring VALUES([[(0, 0), (10, 0), (10, 10), (0, 10)], [(1, 1), (2, 2), (3, 3)]]); +SELECT l, toTypeName(l) FROM geo_multilinestring; +``` +結果: + +``` text +┌─l───────────────────────────────────────────────────┬─toTypeName(l)───┐ +│ [[(0,0),(10,0),(10,10),(0,10)],[(1,1),(2,2),(3,3)]] │ MultiLineString │ +└─────────────────────────────────────────────────────┴─────────────────┘ +``` + +## Polygon + +`Polygon` は穴を持つ多角形で、リングの配列として保存されます: [Array](array.md)([Ring](#ring))。外側の配列の最初の要素は多角形の外側の形状で、後続の要素はすべて穴です。 + +**例** + +これは1つの穴を持つ多角形です: + +```sql +CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory(); +INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]); +SELECT pg, toTypeName(pg) FROM geo_polygon; +``` + +結果: + +``` text +┌─pg────────────────────────────────────────────────────────────┬─toTypeName(pg)─┐ +│ [[(20,20),(50,20),(50,50),(20,50)],[(30,30),(50,50),(50,30)]] │ Polygon │ +└───────────────────────────────────────────────────────────────┴────────────────┘ +``` + +## MultiPolygon + +`MultiPolygon` は複数の多角形から成り、ポリゴンの配列として保存されます: [Array](array.md)([Polygon](#polygon))。 + +**例** + +このマルチポリゴンは、1つは穴のないポリゴン、もう1つは1つの穴を持つ2つの別々のポリゴンで構成されています: + +```sql +CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory(); +INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]); +SELECT mpg, toTypeName(mpg) FROM geo_multipolygon; +``` +結果: + +``` text +┌─mpg─────────────────────────────────────────────────────────────────────────────────────────────┬─toTypeName(mpg)─┐ +│ [[[(0,0),(10,0),(10,10),(0,10)]],[[(20,20),(50,20),(50,50),(20,50)],[(30,30),(50,50),(50,30)]]] │ MultiPolygon │ +└─────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┘ +``` + +## 関連コンテンツ + +- [膨大な実世界のデータセットの探求: ClickHouseにおける100年以上の天気記録](https://clickhouse.com/blog/real-world-data-noaa-climate-data) diff --git a/docs/ja/sql-reference/data-types/index.md b/docs/ja/sql-reference/data-types/index.md new file mode 100644 index 00000000000..7bd03a036d4 --- /dev/null +++ b/docs/ja/sql-reference/data-types/index.md @@ -0,0 +1,34 @@ +--- +slug: /ja/sql-reference/data-types/ +sidebar_label: データ型の一覧 +sidebar_position: 1 +--- + +# ClickHouseのデータ型 + +ClickHouseは様々な種類のデータをテーブルのセルに格納できます。このセクションでは、サポートされているデータ型と、それを使用および/または実装する際の特別な考慮事項について説明します。 + +:::note +データ型名が大文字と小文字を区別するかどうかは、[system.data_type_families](../../operations/system-tables/data_type_families.md#system_tables-data_type_families)テーブルで確認できます。 +::: + +ClickHouseのデータ型には次のものがあります: + +- **整数型**:[符号付きおよび符号なし整数](./int-uint.md) (`UInt8`, `UInt16`, `UInt32`, `UInt64`, `UInt128`, `UInt256`, `Int8`, `Int16`, `Int32`, `Int64`, `Int128`, `Int256`) +- **浮動小数点数**:[浮動小数点数](./float.md) (`Float32` と `Float64`) と [`Decimal` 値](./decimal.md) +- **ブール型**:ClickHouseには[`Boolean`型](./boolean.md)があります +- **文字列**:[文字列型 `String`](./string.md) と [`FixedString`](./fixedstring.md) +- **日付**:日付には[`Date`](./date.md) と [`Date32`](./date32.md)を、時間には[`DateTime`](./datetime.md) と [`DateTime64`](./datetime64.md)を使用 +- **オブジェクト**:[`Object`](./json.md)は1つのカラムでJSONドキュメントを保存(非推奨) +- **JSON**:[`JSON`オブジェクト](./newjson.md)は1つのカラムでJSONドキュメントを保存 +- **UUID**:[`UUID`値](./uuid.md)を効率的に保存するための選択肢 +- **低いカーディナリティ型**:少数のユニークな値がある場合は[`Enum`](./enum.md)を、最大10,000のユニークなカラム値がある場合は[`LowCardinality`](./lowcardinality.md)を使用 +- **配列**:任意のカラムは[`Array` 型](./array.md)として定義可能 +- **マップ**:キーと値のペアを保存するには[`Map`](./map.md)を使用 +- **集約関数型**:集約関数の中間状態を保存するには[`SimpleAggregateFunction`](./simpleaggregatefunction.md) と [`AggregateFunction`](./aggregatefunction.md)を使用 +- **ネストされたデータ構造**:[`Nested`データ構造](./nested-data-structures/index.md)はセル内のテーブルのようなもの +- **タプル**:個別の型をもつ要素の[`Tuple`](./tuple.md) +- **Nullable**:値が"欠けている"場合にデータ型のデフォルト値ではなく`NULL`として保存する場合に[`Nullable`](./nullable.md)を使用 +- **IPアドレス**:IPアドレスを効率的に保存するには[`IPv4`](./ipv4.md) と [`IPv6`](./ipv6.md)を使用 +- **ジオタイプ**:[地理データ](./geo.md)用の`Point`, `Ring`, `Polygon`, `MultiPolygon` +- **特別なデータ型**:[`Expression`](./special-data-types/expression.md), [`Set`](./special-data-types/set.md), [`Nothing`](./special-data-types/nothing.md), [`Interval`](./special-data-types/interval.md)など含む diff --git a/docs/ja/sql-reference/data-types/int-uint.md b/docs/ja/sql-reference/data-types/int-uint.md new file mode 100644 index 00000000000..eff82a245b2 --- /dev/null +++ b/docs/ja/sql-reference/data-types/int-uint.md @@ -0,0 +1,43 @@ +--- +slug: /ja/sql-reference/data-types/int-uint +sidebar_position: 2 +sidebar_label: UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256 +--- + +# UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256 + +符号ありまたは符号なしの固定長整数。 + +テーブルを作成する際、整数に対して数値パラメータを設定することができます(例: `TINYINT(8)`, `SMALLINT(16)`, `INT(32)`, `BIGINT(64)`)が、ClickHouse はこれを無視します。 + +## Int 範囲 + +- `Int8` — \[-128 : 127\] +- `Int16` — \[-32768 : 32767\] +- `Int32` — \[-2147483648 : 2147483647\] +- `Int64` — \[-9223372036854775808 : 9223372036854775807\] +- `Int128` — \[-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727\] +- `Int256` — \[-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967\] + +エイリアス: + +- `Int8` — `TINYINT`, `INT1`, `BYTE`, `TINYINT SIGNED`, `INT1 SIGNED`. +- `Int16` — `SMALLINT`, `SMALLINT SIGNED`. +- `Int32` — `INT`, `INTEGER`, `MEDIUMINT`, `MEDIUMINT SIGNED`, `INT SIGNED`, `INTEGER SIGNED`. +- `Int64` — `BIGINT`, `SIGNED`, `BIGINT SIGNED`, `TIME`. + +## UInt 範囲 + +- `UInt8` — \[0 : 255\] +- `UInt16` — \[0 : 65535\] +- `UInt32` — \[0 : 4294967295\] +- `UInt64` — \[0 : 18446744073709551615\] +- `UInt128` — \[0 : 340282366920938463463374607431768211455\] +- `UInt256` — \[0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935\] + +エイリアス: + +- `UInt8` — `TINYINT UNSIGNED`, `INT1 UNSIGNED`. +- `UInt16` — `SMALLINT UNSIGNED`. +- `UInt32` — `MEDIUMINT UNSIGNED`, `INT UNSIGNED`, `INTEGER UNSIGNED` +- `UInt64` — `UNSIGNED`, `BIGINT UNSIGNED`, `BIT`, `SET` diff --git a/docs/ja/sql-reference/data-types/ipv4.md b/docs/ja/sql-reference/data-types/ipv4.md new file mode 100644 index 00000000000..b2b30a279b4 --- /dev/null +++ b/docs/ja/sql-reference/data-types/ipv4.md @@ -0,0 +1,74 @@ +--- +slug: /ja/sql-reference/data-types/ipv4 +sidebar_position: 28 +sidebar_label: IPv4 +--- + +## IPv4 + +IPv4アドレス。4バイトでUInt32として保存されます。 + +### 基本的な使用法 + +``` sql +CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url; + +DESCRIBE TABLE hits; +``` + +``` text +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐ +│ url │ String │ │ │ │ │ +│ from │ IPv4 │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘ +``` + +または、IPv4ドメインをキーとして使用することもできます: + +``` sql +CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY from; +``` + +`IPv4` ドメインはIPv4文字列としてのカスタム入力形式をサポートしています: + +``` sql +INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.com', '183.247.232.58')('https://clickhouse.com/docs/ja/', '116.106.34.242'); + +SELECT * FROM hits; +``` + +``` text +┌─url────────────────────────────────┬───────────from─┐ +│ https://clickhouse.com/docs/ja/ │ 116.106.34.242 │ +│ https://wikipedia.org │ 116.253.40.133 │ +│ https://clickhouse.com │ 183.247.232.58 │ +└────────────────────────────────────┴────────────────┘ +``` + +値はコンパクトなバイナリ形式で保存されます: + +``` sql +SELECT toTypeName(from), hex(from) FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(from)─┬─hex(from)─┐ +│ IPv4 │ B7F7E83A │ +└──────────────────┴───────────┘ +``` + +IPv4アドレスはIPv6アドレスと直接比較することができます: + +```sql +SELECT toIPv4('127.0.0.1') = toIPv6('::ffff:127.0.0.1'); +``` + +```text +┌─equals(toIPv4('127.0.0.1'), toIPv6('::ffff:127.0.0.1'))─┐ +│ 1 │ +└─────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [IPv4およびIPv6アドレスを操作するための関数](../functions/ip-address-functions.md) diff --git a/docs/ja/sql-reference/data-types/ipv6.md b/docs/ja/sql-reference/data-types/ipv6.md new file mode 100644 index 00000000000..23bd92f0818 --- /dev/null +++ b/docs/ja/sql-reference/data-types/ipv6.md @@ -0,0 +1,74 @@ +--- +slug: /ja/sql-reference/data-types/ipv6 +sidebar_position: 30 +sidebar_label: IPv6 +--- + +## IPv6 + +IPv6アドレス。16バイトとして保存され、UInt128ビッグエンディアンです。 + +### 基本的な使用法 + +``` sql +CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url; + +DESCRIBE TABLE hits; +``` + +``` text +┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐ +│ url │ String │ │ │ │ │ +│ from │ IPv6 │ │ │ │ │ +└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘ +``` + +または、`IPv6`ドメインをキーとして使用することもできます: + +``` sql +CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY from; +``` + +`IPv6`ドメインは、IPv6文字列としてのカスタム入力をサポートします: + +``` sql +INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.com', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.com/docs/ja/', '2a02:e980:1e::1'); + +SELECT * FROM hits; +``` + +``` text +┌─url────────────────────────────────┬─from──────────────────────────┐ +│ https://clickhouse.com │ 2001:44c8:129:2632:33:0:252:2 │ +│ https://clickhouse.com/docs/ja/ │ 2a02:e980:1e::1 │ +│ https://wikipedia.org │ 2a02:aa08:e000:3100::2 │ +└────────────────────────────────────┴───────────────────────────────┘ +``` + +値はコンパクトなバイナリ形式で保存されます: + +``` sql +SELECT toTypeName(from), hex(from) FROM hits LIMIT 1; +``` + +``` text +┌─toTypeName(from)─┬─hex(from)────────────────────────┐ +│ IPv6 │ 200144C8012926320033000002520002 │ +└──────────────────┴──────────────────────────────────┘ +``` + +IPv6アドレスはIPv4アドレスと直接比較することができます: + +```sql +SELECT toIPv4('127.0.0.1') = toIPv6('::ffff:127.0.0.1'); +``` + +```text +┌─equals(toIPv4('127.0.0.1'), toIPv6('::ffff:127.0.0.1'))─┐ +│ 1 │ +└─────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [IPv4およびIPv6アドレスを操作するための関数](../functions/ip-address-functions.md) diff --git a/docs/ja/sql-reference/data-types/json.md b/docs/ja/sql-reference/data-types/json.md new file mode 100644 index 00000000000..eb2493b344b --- /dev/null +++ b/docs/ja/sql-reference/data-types/json.md @@ -0,0 +1,83 @@ +--- +slug: /ja/sql-reference/data-types/object-data-type +sidebar_position: 26 +sidebar_label: Object Data Type +keywords: [object, data type] +--- + +# Object Data Type (非推奨) + +**この機能は本番環境で利用可能な状態ではなく、現在非推奨です。** JSON ドキュメントを扱う必要がある場合は、[このガイド](/docs/ja/integrations/data-formats/json/overview)を参照してください。JSON オブジェクトをサポートする新しい実装が進行中であり、[こちら](https://github.com/ClickHouse/ClickHouse/issues/54864)で追跡できます。 + +
    + +JavaScript Object Notation (JSON) ドキュメントを単一のカラムに格納します。 + +`JSON` は、[use_json_alias_for_old_object_type](../../operations/settings/settings.md#usejsonaliasforoldobjecttype) が有効の場合、`Object('json')` のエイリアスとして使用できます。 + +## 例 + +**例 1** + +`JSON` カラムを持つテーブルを作成し、データを挿入する例: + +```sql +CREATE TABLE json +( + o JSON +) +ENGINE = Memory +``` + +```sql +INSERT INTO json VALUES ('{"a": 1, "b": { "c": 2, "d": [1, 2, 3] }}') +``` + +```sql +SELECT o.a, o.b.c, o.b.d[3] FROM json +``` + +```text +┌─o.a─┬─o.b.c─┬─arrayElement(o.b.d, 3)─┐ +│ 1 │ 2 │ 3 │ +└─────┴───────┴────────────────────────┘ +``` + +**例 2** + +Orderedな `MergeTree` ファミリのテーブルを作成するためには、ソートキーをそのカラムに抽出する必要があります。例えば、圧縮された JSON 形式の HTTP アクセスログファイルを挿入するには: + +```sql +CREATE TABLE logs +( + timestamp DateTime, + message JSON +) +ENGINE = MergeTree +ORDER BY timestamp +``` + +```sql +INSERT INTO logs +SELECT parseDateTimeBestEffort(JSONExtractString(json, 'timestamp')), json +FROM file('access.json.gz', JSONAsString) +``` + +## JSON カラムの表示 + +`JSON` カラムを表示する際、ClickHouse はデフォルトでフィールド値のみを表示します(内部的にはタプルとして表現されるため)。フィールド名も表示するには、`output_format_json_named_tuples_as_objects = 1` を設定してください: + +```sql +SET output_format_json_named_tuples_as_objects = 1 + +SELECT * FROM json FORMAT JSONEachRow +``` + +```text +{"o":{"a":1,"b":{"c":2,"d":[1,2,3]}}} +``` + +## 関連コンテンツ + +- [ClickHouseでのJSON利用](/ja/integrations/data-formats/json/overview) +- [ClickHouseへのデータ取得 - パート2 - JSONの迂回](https://clickhouse.com/blog/getting-data-into-clickhouse-part-2-json) diff --git a/docs/ja/sql-reference/data-types/lowcardinality.md b/docs/ja/sql-reference/data-types/lowcardinality.md new file mode 100644 index 00000000000..4112b11418b --- /dev/null +++ b/docs/ja/sql-reference/data-types/lowcardinality.md @@ -0,0 +1,61 @@ +--- +slug: /ja/sql-reference/data-types/lowcardinality +sidebar_position: 42 +sidebar_label: LowCardinality(T) +--- + +# LowCardinality(T) + +他のデータ型の内部表現をDictionaryエンコードで変更します。 + +## 構文 + +``` sql +LowCardinality(data_type) +``` + +**パラメータ** + +- `data_type` — [String](../../sql-reference/data-types/string.md), [FixedString](../../sql-reference/data-types/fixedstring.md), [Date](../../sql-reference/data-types/date.md), [DateTime](../../sql-reference/data-types/datetime.md)、および [Decimal](../../sql-reference/data-types/decimal.md) を除く数値。 `LowCardinality` は一部のデータ型には効率的でない場合があります。[allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) の設定説明を参照してください。 + +## 説明 + +`LowCardinality` はデータの保存方法と処理ルールを変更する上位構造です。ClickHouse は`LowCardinality`-カラムに [Dictionary コーディング](https://en.wikipedia.org/wiki/Dictionary_coder) を適用します。Dictionary エンコードされたデータを操作すると、多くのアプリケーションで [SELECT](../../sql-reference/statements/select/index.md) クエリのパフォーマンスが大幅に向上します。 + +`LowCardinality` データ型の使用効率は、データの多様性に依存します。Dictionary に1万未満の異なる値が含まれる場合、ClickHouse は主にデータの読み取りと保存の効率が高くなります。Dictionary に10万を超える異なる値が含まれる場合、通常のデータ型を使用する方が性能が低下する可能性があります。 + +文字列を扱う際には、[Enum](../../sql-reference/data-types/enum.md) の代わりに `LowCardinality` の使用を検討してください。`LowCardinality` はより柔軟に使用でき、しばしば同等またはそれ以上の効率を発揮します。 + +## 例 + +`LowCardinality`-カラムを持つテーブルを作成します: + +``` sql +CREATE TABLE lc_t +( + `id` UInt16, + `strings` LowCardinality(String) +) +ENGINE = MergeTree() +ORDER BY id +``` + +## 関連する設定と関数 + +設定: + +- [low_cardinality_max_dictionary_size](../../operations/settings/settings.md#low_cardinality_max_dictionary_size) +- [low_cardinality_use_single_dictionary_for_part](../../operations/settings/settings.md#low_cardinality_use_single_dictionary_for_part) +- [low_cardinality_allow_in_native_format](../../operations/settings/settings.md#low_cardinality_allow_in_native_format) +- [allow_suspicious_low_cardinality_types](../../operations/settings/settings.md#allow_suspicious_low_cardinality_types) +- [output_format_arrow_low_cardinality_as_dictionary](../../operations/settings/settings.md#output-format-arrow-low-cardinality-as-dictionary) + +関数: + +- [toLowCardinality](../../sql-reference/functions/type-conversion-functions.md#tolowcardinality) + +## 関連コンテンツ + +- ブログ: [スキーマとコーデックでClickHouseを最適化する](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) +- ブログ: [ClickHouseでタイムシリーズデータを扱う](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) +- [文字列最適化 (ロシア語のビデオプレゼンテーション)](https://youtu.be/rqf-ILRgBdY?list=PL0Z2YDlm0b3iwXCpEFiOOYmwXzVmjJfEt). [英語のスライド](https://github.com/ClickHouse/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf) diff --git a/docs/ja/sql-reference/data-types/map.md b/docs/ja/sql-reference/data-types/map.md new file mode 100644 index 00000000000..6be263a54f4 --- /dev/null +++ b/docs/ja/sql-reference/data-types/map.md @@ -0,0 +1,123 @@ +--- +slug: /ja/sql-reference/data-types/map +sidebar_position: 36 +sidebar_label: Map(K, V) +--- + +# Map(K, V) + +データ型 `Map(K, V)` はキーと値のペアを格納します。 + +他のデータベースと異なり、ClickHouseのマップは一意ではありません。つまり、マップには同じキーを持つ2つの要素を含めることができます。 +(その理由は、マップが内部的に `Array(Tuple(K, V))` として実装されているためです。) + +マップ `m` でキー `k` の値を取得するには、構文 `m[k]` を使用できます。 +また、`m[k]` はマップをスキャンするため、操作のランタイムはマップのサイズに対して線形です。 + +**パラメータ** + +- `K` — マップキーの型。任意の型。ただし、[Nullable](../../sql-reference/data-types/nullable.md) および [LowCardinality](../../sql-reference/data-types/lowcardinality.md) が [Nullable](../../sql-reference/data-types/nullable.md) 型とネストされている場合を除く。 +- `V` — マップ値の型。任意の型。 + +**例** + +マップ型のカラムを持つテーブルを作成します: + +``` sql +CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory; +INSERT INTO tab VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30}); +``` + +`key2` の値を選択します: + +```sql +SELECT m['key2'] FROM tab; +``` + +結果: + +```text +┌─arrayElement(m, 'key2')─┐ +│ 10 │ +│ 20 │ +│ 30 │ +└─────────────────────────┘ +``` + +要求されたキー `k` がマップに含まれていない場合、`m[k]` は型のデフォルト値、たとえば整数型の場合は `0`、文字列型の場合は `''` を返します。 +マップにキーが存在するかどうかを確認するには、関数 [mapContains](../../sql-reference/functions/tuple-map-functions#mapcontains) を使用できます。 + +```sql +CREATE TABLE tab (m Map(String, UInt64)) ENGINE=Memory; +INSERT INTO tab VALUES ({'key1':100}), ({}); +SELECT m['key1'] FROM tab; +``` + +結果: + +```text +┌─arrayElement(m, 'key1')─┐ +│ 100 │ +│ 0 │ +└─────────────────────────┘ +``` + +## Tuple を Map に変換する + +`Tuple()` 型の値を [CAST](../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) 関数を使用して `Map()` 型の値にキャストできます: + +**例** + +クエリ: + +``` sql +SELECT CAST(([1, 2, 3], ['Ready', 'Steady', 'Go']), 'Map(UInt8, String)') AS map; +``` + +結果: + +``` text +┌─map───────────────────────────┐ +│ {1:'Ready',2:'Steady',3:'Go'} │ +└───────────────────────────────┘ +``` + +## マップのサブカラムを読み取る + +マップ全体を読み取るのを避けるために、場合によってはサブカラム `keys` と `values` を使用できます。 + +**例** + +クエリ: + +``` sql +CREATE TABLE tab (m Map(String, UInt64)) ENGINE = Memory; +INSERT INTO tab VALUES (map('key1', 1, 'key2', 2, 'key3', 3)); + +SELECT m.keys FROM tab; -- mapKeys(m) と同じ +SELECT m.values FROM tab; -- mapValues(m) と同じ +``` + +結果: + +``` text +┌─m.keys─────────────────┐ +│ ['key1','key2','key3'] │ +└────────────────────────┘ + +┌─m.values─┐ +│ [1,2,3] │ +└──────────┘ +``` + +**関連項目** + +- [map()](../../sql-reference/functions/tuple-map-functions.md#function-map) 関数 +- [CAST()](../../sql-reference/functions/type-conversion-functions.md#type_conversion_function-cast) 関数 +- [-Map データ型用のコンビネータ](../aggregate-functions/combinators.md#-map) + + +## 関連コンテンツ + +- ブログ: [Building an Observability Solution with ClickHouse - Part 2 - Traces](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) + diff --git a/docs/ja/sql-reference/data-types/nested-data-structures/index.md b/docs/ja/sql-reference/data-types/nested-data-structures/index.md new file mode 100644 index 00000000000..14b79511dc8 --- /dev/null +++ b/docs/ja/sql-reference/data-types/nested-data-structures/index.md @@ -0,0 +1,105 @@ +--- +slug: /ja/sql-reference/data-types/nested-data-structures/nested +sidebar_position: 57 +sidebar_label: Nested(Name1 Type1, Name2 Type2, ...) +--- + +# Nested + +## Nested(name1 Type1, Name2 Type2, ...) + +ネストしたデータ構造は、セル内のテーブルのようなものです。ネストしたデータ構造のパラメータとして、カラムの名前と型が、[CREATE TABLE](../../../sql-reference/statements/create/table.md) クエリで指定するのと同様に指定されます。各テーブルの行は、ネストしたデータ構造の任意の数の行に対応できます。 + +例: + +``` sql +CREATE TABLE test.visits +( + CounterID UInt32, + StartDate Date, + Sign Int8, + IsNew UInt8, + VisitID UInt64, + UserID UInt64, + ... + Goals Nested + ( + ID UInt32, + Serial UInt32, + EventTime DateTime, + Price Int64, + OrderID String, + CurrencyID UInt32 + ), + ... +) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign) +``` + +この例では、`Goals` ネストしたデータ構造を宣言しており、コンバージョン(達成された目標)に関するデータを含んでいます。‘visits’ テーブルの各行は、0 もしくは任意の数のコンバージョンに対応可能です。 + +[flatten_nested](../../../operations/settings/settings.md#flatten-nested) がデフォルトではない `0` に設定されている場合、任意のネストレベルがサポートされます。 + +通常、ネストしたデータ構造を扱う際には、そのカラムはドットで区切られたカラム名で指定されます。これらのカラムは一致する型の配列を構成しています。単一のネストしたデータ構造のすべてのカラム配列は同じ長さを持ちます。 + +例: + +``` sql +SELECT + Goals.ID, + Goals.EventTime +FROM test.visits +WHERE CounterID = 101500 AND length(Goals.ID) < 5 +LIMIT 10 +``` + +``` text +┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐ +│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │ +│ [1073752] │ ['2014-03-17 00:28:25'] │ +│ [1073752] │ ['2014-03-17 10:46:20'] │ +│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │ +│ [] │ [] │ +│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │ +│ [] │ [] │ +│ [] │ [] │ +│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │ +│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │ +└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +ネストしたデータ構造は、同じ長さの複数のカラム配列の集合と考えるのが最も簡単です。 + +SELECT クエリで、個々のカラムではなく、ネストしたデータ構造全体の名前を指定できる唯一の場所は ARRAY JOIN 句です。詳細は、「ARRAY JOIN 句」を参照してください。例: + +``` sql +SELECT + Goal.ID, + Goal.EventTime +FROM test.visits +ARRAY JOIN Goals AS Goal +WHERE CounterID = 101500 AND length(Goals.ID) < 5 +LIMIT 10 +``` + +``` text +┌─Goal.ID─┬──────Goal.EventTime─┐ +│ 1073752 │ 2014-03-17 16:38:10 │ +│ 591325 │ 2014-03-17 16:38:48 │ +│ 591325 │ 2014-03-17 16:42:27 │ +│ 1073752 │ 2014-03-17 00:28:25 │ +│ 1073752 │ 2014-03-17 10:46:20 │ +│ 1073752 │ 2014-03-17 13:59:20 │ +│ 591325 │ 2014-03-17 22:17:55 │ +│ 591325 │ 2014-03-17 22:18:07 │ +│ 591325 │ 2014-03-17 22:18:51 │ +│ 1073752 │ 2014-03-17 11:37:06 │ +└─────────┴─────────────────────┘ +``` + +ネストしたデータ構造全体に対して SELECT を実行することはできません。これに含まれる個々のカラムを明示的にリストすることしかできません。 + +INSERT クエリの場合、ネストしたデータ構造の構成要素カラム配列を個別に(まるで個々のカラム配列であるかのように)渡す必要があります。挿入時に、システムはこれらが同じ長さであることをチェックします。 + +DESCRIBE クエリでは、ネストしたデータ構造内のカラムは同様に個別にリストされます。 + +ネストしたデータ構造内の要素に対する ALTER クエリには制限があります。 diff --git a/docs/ja/sql-reference/data-types/newjson.md b/docs/ja/sql-reference/data-types/newjson.md new file mode 100644 index 00000000000..5581ee32388 --- /dev/null +++ b/docs/ja/sql-reference/data-types/newjson.md @@ -0,0 +1,696 @@ +--- +slug: /ja/sql-reference/data-types/newjson +sidebar_position: 63 +sidebar_label: JSON +keywords: [json, data type] +--- + +# JSON データ型 + +JavaScript Object Notation (JSON) ドキュメントを単一のカラムに保存します。 + +:::note +この機能はエクスペリメンタルなものであり、実稼働環境には適していません。JSON ドキュメントを扱う必要がある場合は、[このガイド](/docs/ja/integrations/data-formats/json/overview)の使用を検討してください。 +JSON 型を使用するには、`allow_experimental_json_type = 1` を設定してください。 +::: + +`JSON` 型のカラムを宣言するには、次の構文を使用します: + +``` sql + JSON(max_dynamic_paths=N, max_dynamic_types=M, some.path TypeName, SKIP path.to.skip, SKIP REGEXP 'paths_regexp') +``` +ここで: +- `max_dynamic_paths` は、単一のデータブロック(たとえば、MergeTree テーブルの単一データ部分)に渡ってサブカラムとして別々に保存できるパスの数を示す任意のパラメータです。この制限を超えると、他のパスはすべて単一の構造にまとめて保存されます。`max_dynamic_paths` のデフォルト値は `1024` です。 +- `max_dynamic_types` は、タイプ `Dynamic` の単一パスカラム内に保存できる異なるデータ型の数を示す `1` から `255` の間の任意のパラメータです。この制限を超えると、新しいタイプはすべて `String` 型に変換されます。`max_dynamic_types` のデフォルト値は `32` です。 +- `some.path TypeName` は JSON 内の特定のパスに対する任意の型ヒントです。そのようなパスは常に指定された型のサブカラムとして保存されます。 +- `SKIP path.to.skip` は、JSON パース中にスキップされるべき特定のパスのための任意のヒントです。そのようなパスは JSON カラムに保存されることはありません。指定されたパスがネストされた JSON オブジェクトである場合、ネストされた全体のオブジェクトがスキップされます。 +- `SKIP REGEXP 'path_regexp'` は、JSON パース中にパスをスキップするために使用される正規表現を持つ任意のヒントです。この正規表現と一致するすべてのパスは JSON カラムに保存されることはありません。 + +## JSON の作成 + +テーブルカラム定義で `JSON` 型を使用する: + +```sql +CREATE TABLE test (json JSON) ENGINE = Memory; +INSERT INTO test VALUES ('{"a" : {"b" : 42}, "c" : [1, 2, 3]}'), ('{"f" : "Hello, World!"}'), ('{"a" : {"b" : 43, "e" : 10}, "c" : [4, 5, 6]}'); +SELECT json FROM test; +``` + +```text +┌─json────────────────────────────────────────┐ +│ {"a":{"b":"42"},"c":["1","2","3"]} │ +│ {"f":"Hello, World!"} │ +│ {"a":{"b":"43","e":"10"},"c":["4","5","6"]} │ +└─────────────────────────────────────────────┘ +``` + +```sql +CREATE TABLE test (json JSON(a.b UInt32, SKIP a.e)) ENGINE = Memory; +INSERT INTO test VALUES ('{"a" : {"b" : 42}, "c" : [1, 2, 3]}'), ('{"f" : "Hello, World!"}'), ('{"a" : {"b" : 43, "e" : 10}, "c" : [4, 5, 6]}'); +SELECT json FROM test; +``` + +```text +┌─json──────────────────────────────┐ +│ {"a":{"b":42},"c":[1,2,3]} │ +│ {"a":{"b":0},"f":"Hello, World!"} │ +│ {"a":{"b":43},"c":[4,5,6]} │ +└───────────────────────────────────┘ +``` + +`String` からの CAST を使用する: + +```sql +SELECT '{"a" : {"b" : 42},"c" : [1, 2, 3], "d" : "Hello, World!"}'::JSON AS json; +``` + +```text +┌─json───────────────────────────────────────────┐ +│ {"a":{"b":42},"c":[1,2,3],"d":"Hello, World!"} │ +└────────────────────────────────────────────────┘ +``` + +`Tuple` からの CAST を使用する: + +```sql +SELECT (tuple(42 AS b) AS a, [1, 2, 3] AS c, 'Hello, World!' AS d)::JSON AS json; +``` + +```text +┌─json───────────────────────────────────────────┐ +│ {"a":{"b":42},"c":[1,2,3],"d":"Hello, World!"} │ +└────────────────────────────────────────────────┘ +``` + +`Map` からの CAST を使用する: + +```sql +SELECT map('a', map('b', 42), 'c', [1,2,3], 'd', 'Hello, World!')::JSON AS json; +``` + +```text +┌─json───────────────────────────────────────────┐ +│ {"a":{"b":42},"c":[1,2,3],"d":"Hello, World!"} │ +└────────────────────────────────────────────────┘ +``` + +非推奨の `Object('json')` からの CAST を使用する: + +```sql + SELECT '{"a" : {"b" : 42},"c" : [1, 2, 3], "d" : "Hello, World!"}'::Object('json')::JSON AS json; + ``` + +```text +┌─json───────────────────────────────────────────┐ +│ {"a":{"b":42},"c":[1,2,3],"d":"Hello, World!"} │ +└────────────────────────────────────────────────┘ +``` + +:::note +`Tuple`/`Map`/`Object('json')` から `JSON` への CAST は、カラムを `String` カラムにシリアライズして JSON オブジェクトを含め、それを `JSON` 型のカラムにデシリアライズすることで実装されています。 +::: + +異なる引数を持つ `JSON` 型間の CAST は後でサポートされます。 + +## サブカラムとしての JSON パスの読み取り + +JSON 型は、すべてのパスを別のサブカラムとして読むことをサポートします。JSON 型の宣言で要求されたパスの型が指定されていない場合、そのパスのサブカラムは常に [Dynamic](/docs/ja/sql-reference/data-types/dynamic.md) 型を持ちます。 + +例: + +```sql +CREATE TABLE test (json JSON(a.b UInt32, SKIP a.e)) ENGINE = Memory; +INSERT INTO test VALUES ('{"a" : {"b" : 42, "g" : 42.42}, "c" : [1, 2, 3], "d" : "2020-01-01"}'), ('{"f" : "Hello, World!", "d" : "2020-01-02"}'), ('{"a" : {"b" : 43, "e" : 10, "g" : 43.43}, "c" : [4, 5, 6]}'); +SELECT json FROM test; +``` + +```text +┌─json──────────────────────────────────────────────────┐ +│ {"a":{"b":42,"g":42.42},"c":[1,2,3],"d":"2020-01-01"} │ +│ {"a":{"b":0},"d":"2020-01-02","f":"Hello, World!"} │ +│ {"a":{"b":43,"g":43.43},"c":[4,5,6]} │ +└───────────────────────────────────────────────────────┘ +``` + +```sql +SELECT json.a.b, json.a.g, json.c, json.d FROM test; +``` + +```text +┌─json.a.b─┬─json.a.g─┬─json.c──┬─json.d─────┐ +│ 42 │ 42.42 │ [1,2,3] │ 2020-01-01 │ +│ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2020-01-02 │ +│ 43 │ 43.43 │ [4,5,6] │ ᴺᵁᴸᴸ │ +└──────────┴──────────┴─────────┴────────────┘ +``` + +要求されたパスがデータ内に見つからない場合、それは `NULL` 値で埋められます: + +```sql +SELECT json.non.existing.path FROM test; +``` + +```text +┌─json.non.existing.path─┐ +│ ᴺᵁᴸᴸ │ +│ ᴺᵁᴸᴸ │ +│ ᴺᵁᴸᴸ │ +└────────────────────────┘ +``` + +返されたサブカラムのデータ型を確認してみましょう: +```sql +SELECT toTypeName(json.a.b), toTypeName(json.a.g), toTypeName(json.c), toTypeName(json.d) FROM test; +``` + +```text +┌─toTypeName(json.a.b)─┬─toTypeName(json.a.g)─┬─toTypeName(json.c)─┬─toTypeName(json.d)─┐ +│ UInt32 │ Dynamic │ Dynamic │ Dynamic │ +│ UInt32 │ Dynamic │ Dynamic │ Dynamic │ +│ UInt32 │ Dynamic │ Dynamic │ Dynamic │ +└──────────────────────┴──────────────────────┴────────────────────┴────────────────────┘ +``` + +ご覧の通り、`a.b` のタイプは JSON 型宣言で指定した `UInt32` であり、他のサブカラムのタイプはすべて `Dynamic` です。 + +`Dynamic` 型サブカラムを特別な構文 `json.some.path.:TypeName` を使って読み取ることも可能です: + +```sql +select json.a.g.:Float64, dynamicType(json.a.g), json.d.:Date, dynamicType(json.d) FROM test; +``` + +```text +┌─json.a.g.:`Float64`─┬─dynamicType(json.a.g)─┬─json.d.:`Date`─┬─dynamicType(json.d)─┐ +│ 42.42 │ Float64 │ 2020-01-01 │ Date │ +│ ᴺᵁᴸᴸ │ None │ 2020-01-02 │ Date │ +│ 43.43 │ Float64 │ ᴺᵁᴸᴸ │ None │ +└─────────────────────┴───────────────────────┴────────────────┴─────────────────────┘ +``` + +`Dynamic` サブカラムは任意のデータ型にキャスト可能です。この場合、`Dynamic` 内部の型が要求された型にキャストできない場合、例外がスローされます: + +```sql +select json.a.g::UInt64 as uint FROM test; +``` + +```text +┌─uint─┐ +│ 42 │ +│ 0 │ +│ 43 │ +└──────┘ +``` + +```sql +select json.a.g::UUID as float FROM test; +``` + +```text +Received exception: +Code: 48. DB::Exception: Conversion between numeric types and UUID is not supported. Probably the passed UUID is unquoted: while executing 'FUNCTION CAST(__table1.json.a.g :: 2, 'UUID'_String :: 1) -> CAST(__table1.json.a.g, 'UUID'_String) UUID : 0'. (NOT_IMPLEMENTED) +``` + +## サブカラムとしての JSON サブオブジェクトの読み取り + +JSON 型は、特殊な構文 `json.^some.path` を使用して、ネストされたオブジェクトを `JSON` 型のサブカラムとして読むことをサポートします: + +```sql +CREATE TABLE test (json JSON) ENGINE = Memory; +INSERT INTO test VALUES ('{"a" : {"b" : {"c" : 42, "g" : 42.42}}, "c" : [1, 2, 3], "d" : {"e" : {"f" : {"g" : "Hello, World", "h" : [1, 2, 3]}}}}'), ('{"f" : "Hello, World!", "d" : {"e" : {"f" : {"h" : [4, 5, 6]}}}}'), ('{"a" : {"b" : {"c" : 43, "e" : 10, "g" : 43.43}}, "c" : [4, 5, 6]}'); +SELECT json FROM test; +``` + +```text +┌─json────────────────────────────────────────────────────────────────────────────────────────┐ +│ {"a":{"b":{"c":42,"g":42.42}},"c":[1,2,3],"d":{"e":{"f":{"g":"Hello, World","h":[1,2,3]}}}} │ +│ {"d":{"e":{"f":{"h":[4,5,6]}}},"f":"Hello, World!"} │ +│ {"a":{"b":{"c":43,"e":10,"g":43.43}},"c":[4,5,6]} │ +└─────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT json.^a.b, json.^d.e.f FROM test; +``` + +```text +┌─json.^`a`.b───────────────┬─json.^`d`.e.f────────────────────┐ +│ {"c":42,"g":42.42} │ {"g":"Hello, World","h":[1,2,3]} │ +│ {} │ {"h":[4,5,6]} │ +│ {"c":43,"e":10,"g":43.43} │ {} │ +└───────────────────────────┴──────────────────────────────────┘ +``` + +:::note +サブオブジェクトをサブカラムとして読み取ることは非効率的であるかもしれません。JSON データのほぼ完全なスキャンを必要とする可能性があります。 +::: + +## パスの型推論 + +JSON パース中、ClickHouse は各 JSON パスに最適なデータ型を検出しようとします。これは [入力データからの自動スキーマ推論](/docs/ja/interfaces/schema-inference.md) と同様に機能し、同じ設定によって制御されます: + +- [input_format_try_infer_integers](/docs/ja/interfaces/schema-inference.md#inputformattryinferintegers) +- [input_format_try_infer_dates](/docs/ja/interfaces/schema-inference.md#inputformattryinferdates) +- [input_format_try_infer_datetimes](/docs/ja/interfaces/schema-inference.md#inputformattryinferdatetimes) +- [schema_inference_make_columns_nullable](/docs/ja/interfaces/schema-inference.md#schemainferencemakecolumnsnullable) +- [input_format_json_try_infer_numbers_from_strings](/docs/ja/interfaces/schema-inference.md#inputformatjsontryinfernumbersfromstrings) +- [input_format_json_infer_incomplete_types_as_strings](/docs/ja/interfaces/schema-inference.md#inputformatjsoninferincompletetypesasstrings) +- [input_format_json_read_numbers_as_strings](/docs/ja/interfaces/schema-inference.md#inputformatjsonreadnumbersasstrings) +- [input_format_json_read_bools_as_strings](/docs/ja/interfaces/schema-inference.md#inputformatjsonreadboolsasstrings) +- [input_format_json_read_bools_as_numbers](/docs/ja/interfaces/schema-inference.md#inputformatjsonreadboolsasnumbers) +- [input_format_json_read_arrays_as_strings](/docs/ja/interfaces/schema-inference.md#inputformatjsonreadarraysasstrings) + +いくつかの例を見てみましょう: + +```sql +SELECT JSONAllPathsWithTypes('{"a" : "2020-01-01", "b" : "2020-01-01 10:00:00"}'::JSON) AS paths_with_types settings input_format_try_infer_dates=1, input_format_try_infer_datetimes=1; +``` + +```text +┌─paths_with_types─────────────────┐ +│ {'a':'Date','b':'DateTime64(9)'} │ +└──────────────────────────────────┘ +``` + +```sql +SELECT JSONAllPathsWithTypes('{"a" : "2020-01-01", "b" : "2020-01-01 10:00:00"}'::JSON) AS paths_with_types settings input_format_try_infer_dates=0, input_format_try_infer_datetimes=0; +``` + +```text +┌─paths_with_types────────────┐ +│ {'a':'String','b':'String'} │ +└─────────────────────────────┘ +``` + +```sql +SELECT JSONAllPathsWithTypes('{"a" : [1, 2, 3]}'::JSON) AS paths_with_types settings schema_inference_make_columns_nullable=1; +``` + +```text +┌─paths_with_types───────────────┐ +│ {'a':'Array(Nullable(Int64))'} │ +└────────────────────────────────┘ +``` + +```sql +SELECT JSONAllPathsWithTypes('{"a" : [1, 2, 3]}'::JSON) AS paths_with_types settings schema_inference_make_columns_nullable=0; +``` + +```text +┌─paths_with_types─────┐ +│ {'a':'Array(Int64)'} │ +└──────────────────────┘ +``` + +## JSON オブジェクトの配列の扱い + +オブジェクトの配列を含む JSON パスは `Array(JSON)` 型としてパースされ、`Dynamic` カラムに挿入されます。この配列を読み取るには、`Dynamic` カラムからサブカラムとして抽出できます: + +```sql +CREATE TABLE test (json JSON) ENGINE = Memory; +INSERT INTO test VALUES +('{"a" : {"b" : [{"c" : 42, "d" : "Hello", "f" : [[{"g" : 42.42}]], "k" : {"j" : 1000}}, {"c" : 43}, {"e" : [1, 2, 3], "d" : "My", "f" : [[{"g" : 43.43, "h" : "2020-01-01"}]], "k" : {"j" : 2000}}]}}'), +('{"a" : {"b" : [1, 2, 3]}}'), +('{"a" : {"b" : [{"c" : 44, "f" : [[{"h" : "2020-01-02"}]]}, {"e" : [4, 5, 6], "d" : "World", "f" : [[{"g" : 44.44}]], "k" : {"j" : 3000}}]}}'); +SELECT json FROM test; +``` + +```text3 +┌─json────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {"a":{"b":[{"c":"42","d":"Hello","f":[[{"g":42.42}]],"k":{"j":"1000"}},{"c":"43"},{"d":"My","e":["1","2","3"],"f":[[{"g":43.43,"h":"2020-01-01"}]],"k":{"j":"2000"}}]}} │ +│ {"a":{"b":["1","2","3"]}} │ +│ {"a":{"b":[{"c":"44","f":[[{"h":"2020-01-02"}]]},{"d":"World","e":["4","5","6"],"f":[[{"g":44.44}]],"k":{"j":"3000"}}]}} │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT json.a.b, dynamicType(json.a.b) FROM test; +``` + +```text +┌─json.a.b──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─dynamicType(json.a.b)────────────────────────────────────┐ +│ ['{"c":"42","d":"Hello","f":[[{"g":42.42}]],"k":{"j":"1000"}}','{"c":"43"}','{"d":"My","e":["1","2","3"],"f":[[{"g":43.43,"h":"2020-01-01"}]],"k":{"j":"2000"}}'] │ Array(JSON(max_dynamic_types=16, max_dynamic_paths=256)) │ +│ [1,2,3] │ Array(Nullable(Int64)) │ +│ ['{"c":"44","f":[[{"h":"2020-01-02"}]]}','{"d":"World","e":["4","5","6"],"f":[[{"g":44.44}]],"k":{"j":"3000"}}'] │ Array(JSON(max_dynamic_types=16, max_dynamic_paths=256)) │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────┘ +``` + +ご覧の通り、ネストされた `JSON` 型の `max_dynamic_types/max_dynamic_paths` パラメータはデフォルト値よりも削減されています。これは、ネストされた JSON オブジェクトの配列においてサブカラムの数が無制御に増加するのを防ぐためです。 + +このネストされた `JSON` カラムからサブカラムを読み取ってみましょう: + +```sql +SELECT json.a.b.:`Array(JSON)`.c, json.a.b.:`Array(JSON)`.f, json.a.b.:`Array(JSON)`.d FROM test; +``` + +```text +┌─json.a.b.:`Array(JSON)`.c─┬─json.a.b.:`Array(JSON)`.f───────────────────────────────────┬─json.a.b.:`Array(JSON)`.d─┐ +│ [42,43,NULL] │ [[['{"g":42.42}']],NULL,[['{"g":43.43,"h":"2020-01-01"}']]] │ ['Hello',NULL,'My'] │ +│ [] │ [] │ [] │ +│ [44,NULL] │ [[['{"h":"2020-01-02"}']],[['{"g":44.44}']]] │ [NULL,'World'] │ +└───────────────────────────┴─────────────────────────────────────────────────────────────┴───────────────────────────┘ +``` + +`Array(JSON)` サブカラム名を書くのを避けるために特別な構文を使用できます: + +```sql +SELECT json.a.b[].c, json.a.b[].f, json.a.b[].d FROM test; +``` + +```text +┌─json.a.b.:`Array(JSON)`.c─┬─json.a.b.:`Array(JSON)`.f───────────────────────────────────┬─json.a.b.:`Array(JSON)`.d─┐ +│ [42,43,NULL] │ [[['{"g":42.42}']],NULL,[['{"g":43.43,"h":"2020-01-01"}']]] │ ['Hello',NULL,'My'] │ +│ [] │ [] │ [] │ +│ [44,NULL] │ [[['{"h":"2020-01-02"}']],[['{"g":44.44}']]] │ [NULL,'World'] │ +└───────────────────────────┴─────────────────────────────────────────────────────────────┴───────────────────────────┘ +``` + +パスの後に続く `[]` の数は配列レベルを示します。`json.path[][]` は `json.path.:Array(Array(JSON))` に変換されます。 + +`Array(JSON)` 内のパスとその型を確認してみましょう: + +```sql +SELECT DISTINCT arrayJoin(JSONAllPathsWithTypes(arrayJoin(json.a.b[]))) FROM test; +``` + +```text +┌─arrayJoin(JSONAllPathsWithTypes(arrayJoin(json.a.b.:`Array(JSON)`)))──┐ +│ ('c','Int64') │ +│ ('d','String') │ +│ ('f','Array(Array(JSON(max_dynamic_types=8, max_dynamic_paths=64)))') │ +│ ('k.j','Int64') │ +│ ('e','Array(Nullable(Int64))') │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +`Array(JSON)` カラムからサブカラムを読み取ってみましょう: + +```sql +SELECT json.a.b[].c.:Int64, json.a.b[].f[][].g.:Float64, json.a.b[].f[][].h.:Date FROM test; +``` + +```text +┌─json.a.b.:`Array(JSON)`.c.:`Int64`─┬─json.a.b.:`Array(JSON)`.f.:`Array(Array(JSON))`.g.:`Float64`─┬─json.a.b.:`Array(JSON)`.f.:`Array(Array(JSON))`.h.:`Date`─┐ +│ [42,43,NULL] │ [[[42.42]],[],[[43.43]]] │ [[[NULL]],[],[['2020-01-01']]] │ +│ [] │ [] │ [] │ +│ [44,NULL] │ [[[NULL]],[[44.44]]] │ [[['2020-01-02']],[[NULL]]] │ +└────────────────────────────────────┴──────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘ +``` + +ネストされた `JSON` カラムからサブオブジェクトサブカラムを読み取ることもできます: + +```sql +SELECT json.a.b[].^k FROM test +``` + +```text +┌─json.a.b.:`Array(JSON)`.^`k`─────────┐ +│ ['{"j":"1000"}','{}','{"j":"2000"}'] │ +│ [] │ +│ ['{}','{"j":"3000"}'] │ +└──────────────────────────────────────┘ +``` + +## データからの JSON 型の読み取り + +すべてのテキストフォーマット(JSONEachRow、TSV、CSV、CustomSeparated、Values など)は `JSON` 型の読み取りをサポートしています。 + +例: + +```sql +SELECT json FROM format(JSONEachRow, 'json JSON(a.b.c UInt32, SKIP a.b.d, SKIP d.e, SKIP REGEXP \'b.*\')', ' +{"json" : {"a" : {"b" : {"c" : 1, "d" : [0, 1]}}, "b" : "2020-01-01", "c" : 42, "d" : {"e" : {"f" : ["s1", "s2"]}, "i" : [1, 2, 3]}}} +{"json" : {"a" : {"b" : {"c" : 2, "d" : [2, 3]}}, "b" : [1, 2, 3], "c" : null, "d" : {"e" : {"g" : 43}, "i" : [4, 5, 6]}}} +{"json" : {"a" : {"b" : {"c" : 3, "d" : [4, 5]}}, "b" : {"c" : 10}, "e" : "Hello, World!"}} +{"json" : {"a" : {"b" : {"c" : 4, "d" : [6, 7]}}, "c" : 43}} +{"json" : {"a" : {"b" : {"c" : 5, "d" : [8, 9]}}, "b" : {"c" : 11, "j" : [1, 2, 3]}, "d" : {"e" : {"f" : ["s3", "s4"], "g" : 44}, "h" : "2020-02-02 10:00:00"}}} +') +``` + +```text +┌─json──────────────────────────────────────────────────────────┐ +│ {"a":{"b":{"c":1}},"c":"42","d":{"i":["1","2","3"]}} │ +│ {"a":{"b":{"c":2}},"d":{"i":["4","5","6"]}} │ +│ {"a":{"b":{"c":3}},"e":"Hello, World!"} │ +│ {"a":{"b":{"c":4}},"c":"43"} │ +│ {"a":{"b":{"c":5}},"d":{"h":"2020-02-02 10:00:00.000000000"}} │ +└───────────────────────────────────────────────────────────────┘ +``` + +CSV/TSV/etc のようなテキストフォーマットでは、`JSON` は JSON オブジェクトを含む文字列からパースされます。 + +```sql +SELECT json FROM format(TSV, 'json JSON(a.b.c UInt32, SKIP a.b.d, SKIP REGEXP \'b.*\')', +'{"a" : {"b" : {"c" : 1, "d" : [0, 1]}}, "b" : "2020-01-01", "c" : 42, "d" : {"e" : {"f" : ["s1", "s2"]}, "i" : [1, 2, 3]}} +{"a" : {"b" : {"c" : 2, "d" : [2, 3]}}, "b" : [1, 2, 3], "c" : null, "d" : {"e" : {"g" : 43}, "i" : [4, 5, 6]}} +{"a" : {"b" : {"c" : 3, "d" : [4, 5]}}, "b" : {"c" : 10}, "e" : "Hello, World!"} +{"a" : {"b" : {"c" : 4, "d" : [6, 7]}}, "c" : 43} +{"a" : {"b" : {"c" : 5, "d" : [8, 9]}}, "b" : {"c" : 11, "j" : [1, 2, 3]}, "d" : {"e" : {"f" : ["s3", "s4"], "g" : 44}, "h" : "2020-02-02 10:00:00"}}') +``` + +```text +┌─json──────────────────────────────────────────────────────────┐ +│ {"a":{"b":{"c":1}},"c":"42","d":{"i":["1","2","3"]}} │ +│ {"a":{"b":{"c":2}},"d":{"i":["4","5","6"]}} │ +│ {"a":{"b":{"c":3}},"e":"Hello, World!"} │ +│ {"a":{"b":{"c":4}},"c":"43"} │ +│ {"a":{"b":{"c":5}},"d":{"h":"2020-02-02 10:00:00.000000000"}} │ +└───────────────────────────────────────────────────────────────┘ +``` + +## JSON 内の動的パスの限界を超える + +`JSON` データ型は内部に有限の数のパスしか別々のサブカラムとして保存できません。デフォルトでは、この制限は 1024 です。しかし、この制限は型宣言において `max_dynamic_paths` パラメータを使用して変更できます。この制限が達成されると、`JSON` カラムに挿入されたすべての新しいパスは単一の共有データ構造に保存されます。この制限は、テーブルが使用不可能になるほどの膨大な数の異なるサブカラムを避けるために必要です。 + +異なるシナリオでこの制限が達成されたときに何が起こるか見てみましょう。 + +### データパース中に制限に達する + +JSON オブジェクトをデータからパースする間に、現在のデータブロックの制限に達すると、すべての新しいパスは共有データ構造に保存されます。内省関数 `JSONDynamicPaths, JSONSharedDataPaths` を使用してそれを確認できます: + +```sql +SELECT json, JSONDynamicPaths(json), JSONSharedDataPaths(json) FROM format(JSONEachRow, 'json JSON(max_dynamic_paths=3)', ' +{"json" : {"a" : {"b" : 42}, "c" : [1, 2, 3]}} +{"json" : {"a" : {"b" : 43}, "d" : "2020-01-01"}} +{"json" : {"a" : {"b" : 44}, "c" : [4, 5, 6]}} +{"json" : {"a" : {"b" : 43}, "d" : "2020-01-02", "e" : "Hello", "f" : {"g" : 42.42}}} +{"json" : {"a" : {"b" : 43}, "c" : [7, 8, 9], "f" : {"g" : 43.43}, "h" : "World"}} +') +``` + +```text +┌─json───────────────────────────────────────────────────────────┬─JSONDynamicPaths(json)─┬─JSONSharedDataPaths(json)─┐ +│ {"a":{"b":"42"},"c":["1","2","3"]} │ ['a.b','c','d'] │ [] │ +│ {"a":{"b":"43"},"d":"2020-01-01"} │ ['a.b','c','d'] │ [] │ +│ {"a":{"b":"44"},"c":["4","5","6"]} │ ['a.b','c','d'] │ [] │ +│ {"a":{"b":"43"},"d":"2020-01-02","e":"Hello","f":{"g":42.42}} │ ['a.b','c','d'] │ ['e','f.g'] │ +│ {"a":{"b":"43"},"c":["7","8","9"],"f":{"g":43.43},"h":"World"} │ ['a.b','c','d'] │ ['f.g','h'] │ +└────────────────────────────────────────────────────────────────┴────────────────────────┴───────────────────────────┘ +``` + +ご覧のとおり、パス `e` と `f.g` を挿入した後、制限に達し、それらを共有データ構造に挿入しました。 + +### MergeTree テーブルエンジンでのデータパーツのマージ中 + +MergeTree テーブルのいくつかのデータパーツのマージ中、生成されたデータパートの `JSON` カラムは動的パスの制限に達し、サブカラムとしてすべてのパスを保存できなくなる可能性があります。この場合、ClickHouse はマージ後にサブカラムとして残るパスと共有データ構造に保存されるパスを選択します。多くの場合、ClickHouse は最も非ヌル値の多いパスを保持し、最も希少なパスを共有データ構造に移動しようとしますが、これは実装によります。 + +そのようなマージの例を見てみましょう。最初に、`JSON` カラムを含むテーブルを作成し、動的パスの制限を `3` に設定し、` 5`つの異なるパスを持つ値を挿入します: + +```sql +CREATE TABLE test (id UInt64, json JSON(max_dynamic_paths=3)) engine=MergeTree ORDER BY id; +SYSTEM STOP MERGES test; +INSERT INTO test SELECT number, formatRow('JSONEachRow', number as a) FROM numbers(5); +INSERT INTO test SELECT number, formatRow('JSONEachRow', number as b) FROM numbers(4); +INSERT INTO test SELECT number, formatRow('JSONEachRow', number as c) FROM numbers(3); +INSERT INTO test SELECT number, formatRow('JSONEachRow', number as d) FROM numbers(2); +INSERT INTO test SELECT number, formatRow('JSONEachRow', number as e) FROM numbers(1); +``` + +各挿入は `JSON` カラムを含む単一のパスを持つ別々のデータパートを作成します: +```sql +SELECT count(), JSONDynamicPaths(json) AS dynamic_paths, JSONSharedDataPaths(json) AS shared_data_paths, _part FROM test GROUP BY _part, dynamic_paths, shared_data_paths ORDER BY _part ASC +``` + +```text +┌─count()─┬─dynamic_paths─┬─shared_data_paths─┬─_part─────┐ +│ 5 │ ['a'] │ [] │ all_1_1_0 │ +│ 4 │ ['b'] │ [] │ all_2_2_0 │ +│ 3 │ ['c'] │ [] │ all_3_3_0 │ +│ 2 │ ['d'] │ [] │ all_4_4_0 │ +│ 1 │ ['e'] │ [] │ all_5_5_0 │ +└─────────┴───────────────┴───────────────────┴───────────┘ + +``` + +さて、すべてのパートを1つにマージして、何が起こるか見てみましょう: + +```sql +SYSTEM START MERGES test; +OPTIMIZE TABLE test FINAL; +SELECT count(), dynamicType(d), _part FROM test GROUP BY _part, dynamicType(d) ORDER BY _part; +``` + +```text +┌─count()─┬─dynamic_paths─┬─shared_data_paths─┬─_part─────┐ +│ 1 │ ['a','b','c'] │ ['e'] │ all_1_5_2 │ +│ 2 │ ['a','b','c'] │ ['d'] │ all_1_5_2 │ +│ 12 │ ['a','b','c'] │ [] │ all_1_5_2 │ +└─────────┴───────────────┴───────────────────┘ +``` + +ご覧のとおり、ClickHouse は最も頻繁に現れるパス `a`、`b`、`c` を保持し、パス `e` と `d` を共有データ構造に移動しました。 + +## 内省関数 + +JSON カラムの内容を調べるのに役立ついくつかの関数があります:[JSONAllPaths](../functions/json-functions.md#jsonallpaths)、[JSONAllPathsWithTypes](../functions/json-functions.md#jsonallpathswithtypes)、[JSONDynamicPaths](../functions/json-functions.md#jsondynamicpaths)、[JSONDynamicPathsWithTypes](../functions/json-functions.md#jsondynamicpathswithtypes)、[JSONSharedDataPaths](../functions/json-functions.md#jsonshareddatapaths)、[JSONSharedDataPathsWithTypes](../functions/json-functions.md#jsonshareddatapathswithtypes)、[distinctDynamicTypes](../aggregate-functions/reference/distinctdynamictypes.md)、[distinctJSONPaths and distinctJSONPathsAndTypes](../aggregate-functions/reference/distinctjsonpaths.md) + +**例** + +`2020-01-01` 日付の [GH Archive](https://www.gharchive.org/) データセットの内容を調査してみましょう: + +```sql +SELECT arrayJoin(distinctJSONPaths(json)) FROM s3('s3://clickhouse-public-datasets/gharchive/original/2020-01-01-*.json.gz', JSONAsObject) +``` + +```text +┌─arrayJoin(distinctJSONPaths(json))─────────────────────────┐ +│ actor.avatar_url │ +│ actor.display_login │ +│ actor.gravatar_id │ +│ actor.id │ +│ actor.login │ +│ actor.url │ +│ created_at │ +│ id │ +│ org.avatar_url │ +│ org.gravatar_id │ +│ org.id │ +│ org.login │ +│ org.url │ +│ payload.action │ +│ payload.before │ +│ payload.comment._links.html.href │ +│ payload.comment._links.pull_request.href │ +│ payload.comment._links.self.href │ +│ payload.comment.author_association │ +│ payload.comment.body │ +│ payload.comment.commit_id │ +│ payload.comment.created_at │ +│ payload.comment.diff_hunk │ +│ payload.comment.html_url │ +│ payload.comment.id │ +│ payload.comment.in_reply_to_id │ +│ payload.comment.issue_url │ +│ payload.comment.line │ +│ payload.comment.node_id │ +│ payload.comment.original_commit_id │ +│ payload.comment.original_position │ +│ payload.comment.path │ +│ payload.comment.position │ +│ payload.comment.pull_request_review_id │ +... +│ payload.release.node_id │ +│ payload.release.prerelease │ +│ payload.release.published_at │ +│ payload.release.tag_name │ +│ payload.release.tarball_url │ +│ payload.release.target_commitish │ +│ payload.release.upload_url │ +│ payload.release.url │ +│ payload.release.zipball_url │ +│ payload.size │ +│ public │ +│ repo.id │ +│ repo.name │ +│ repo.url │ +│ type │ +└─arrayJoin(distinctJSONPaths(json))─────────────────────────┘ +``` + +```sql +SELECT arrayJoin(distinctJSONPathsAndTypes(json)) FROM s3('s3://clickhouse-public-datasets/gharchive/original/2020-01-01-*.json.gz', JSONAsObject) SETTINGS date_time_input_format='best_effort' +``` + +```text +┌─arrayJoin(distinctJSONPathsAndTypes(json))──────────────────┐ +│ ('actor.avatar_url',['String']) │ +│ ('actor.display_login',['String']) │ +│ ('actor.gravatar_id',['String']) │ +│ ('actor.id',['Int64']) │ +│ ('actor.login',['String']) │ +│ ('actor.url',['String']) │ +│ ('created_at',['DateTime']) │ +│ ('id',['String']) │ +│ ('org.avatar_url',['String']) │ +│ ('org.gravatar_id',['String']) │ +│ ('org.id',['Int64']) │ +│ ('org.login',['String']) │ +│ ('org.url',['String']) │ +│ ('payload.action',['String']) │ +│ ('payload.before',['String']) │ +│ ('payload.comment._links.html.href',['String']) │ +│ ('payload.comment._links.pull_request.href',['String']) │ +│ ('payload.comment._links.self.href',['String']) │ +│ ('payload.comment.author_association',['String']) │ +│ ('payload.comment.body',['String']) │ +│ ('payload.comment.commit_id',['String']) │ +│ ('payload.comment.created_at',['DateTime']) │ +│ ('payload.comment.diff_hunk',['String']) │ +│ ('payload.comment.html_url',['String']) │ +│ ('payload.comment.id',['Int64']) │ +│ ('payload.comment.in_reply_to_id',['Int64']) │ +│ ('payload.comment.issue_url',['String']) │ +│ ('payload.comment.line',['Int64']) │ +│ ('payload.comment.node_id',['String']) │ +│ ('payload.comment.original_commit_id',['String']) │ +│ ('payload.comment.original_position',['Int64']) │ +│ ('payload.comment.path',['String']) │ +│ ('payload.comment.position',['Int64']) │ +│ ('payload.comment.pull_request_review_id',['Int64']) │ +... +│ ('payload.release.node_id',['String']) │ +│ ('payload.release.prerelease',['Bool']) │ +│ ('payload.release.published_at',['DateTime']) │ +│ ('payload.release.tag_name',['String']) │ +│ ('payload.release.tarball_url',['String']) │ +│ ('payload.release.target_commitish',['String']) │ +│ ('payload.release.upload_url',['String']) │ +│ ('payload.release.url',['String']) │ +│ ('payload.release.zipball_url',['String']) │ +│ ('payload.size',['Int64']) │ +│ ('public',['Bool']) │ +│ ('repo.id',['Int64']) │ +│ ('repo.name',['String']) │ +│ ('repo.url',['String']) │ +│ ('type',['String']) │ +└─arrayJoin(distinctJSONPathsAndTypes(json))──────────────────┘ +``` + +## ALTER MODIFY COLUMN を JSON 型に + +既存のテーブルを変更し、カラムの型を新しい `JSON` 型に変更することができます。現在のところ、サポートされているのは `String` 型からの変更のみです。 + +**例** + +```sql +CREATE TABLE test (json String) ENGINE=MergeTree ORDeR BY tuple(); +INSERT INTO test VALUES ('{"a" : 42}'), ('{"a" : 43, "b" : "Hello"}'), ('{"a" : 44, "b" : [1, 2, 3]}')), ('{"c" : "2020-01-01"}'); +ALTER TABLE test MODIFY COLUMN json JSON; +SELECT json, json.a, json.b, json.c FROM test; +``` + +```text +┌─json─────────────────────────┬─json.a─┬─json.b──┬─json.c─────┐ +│ {"a":"42"} │ 42 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +│ {"a":"43","b":"Hello"} │ 43 │ Hello │ ᴺᵁᴸᴸ │ +│ {"a":"44","b":["1","2","3"]} │ 44 │ [1,2,3] │ ᴺᵁᴸᴸ │ +│ {"c":"2020-01-01"} │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2020-01-01 │ +└──────────────────────────────┴────────┴─────────┴────────────┘ +``` + +## JSON 型のより良い使用のためのヒント + +`JSON` カラムを作成してデータをロードする前に、次のヒントを検討してください: + +- データを調査し、可能な限り多くのパスヒントと型を指定してください。それにより、ストレージと読み取りが非常に効率的になります。 +- 必要なパスと不要なパスを考え、必要のないパスを SKIP セクションや SKIP REGEXP に指定してください。それにより、ストレージの効率が向上します。 +- `max_dynamic_paths` パラメータを非常に高い値に設定しないでください。それはストレージと読み取りを効率的でなくする可能性があります。 diff --git a/docs/ja/sql-reference/data-types/nullable.md b/docs/ja/sql-reference/data-types/nullable.md new file mode 100644 index 00000000000..44409a41217 --- /dev/null +++ b/docs/ja/sql-reference/data-types/nullable.md @@ -0,0 +1,71 @@ +--- +slug: /ja/sql-reference/data-types/nullable +sidebar_position: 44 +sidebar_label: Nullable(T) +--- + +# Nullable(T) + +`T` が許可する通常の値に加えて、特別なマーカー ([NULL](../../sql-reference/syntax.md)) を格納できるようにします。これは「欠損値」を示します。例えば、`Nullable(Int8)` 型のカラムは `Int8` 型の値を格納することができ、値を持たない行は `NULL` を格納します。 + +`T` は、[Array](../../sql-reference/data-types/array.md)、[Map](../../sql-reference/data-types/map.md)、[Tuple](../../sql-reference/data-types/tuple.md) の複合データ型であってはならないが、複合データ型には `Nullable` 型の値を含めることができます。例えば `Array(Nullable(Int8))` です。 + +`Nullable` 型のフィールドは、テーブルのインデックスに含めることはできません。 + +`NULL` は、ClickHouse サーバーの設定で別途指定されない限り、どの `Nullable` 型においてもデフォルトの値です。 + +## ストレージの特性 + +ClickHouse は、テーブルのカラムに `Nullable` 型の値を格納するために、通常の値を格納するファイルに加えて `NULL` マスクのための別のファイルを使用します。マスクファイルのエントリにより、ClickHouse は各テーブル行の対応するデータ型のデフォルト値と `NULL` を区別することができます。この追加ファイルのため、`Nullable` カラムは類似の通常のカラムに比べて追加のストレージスペースを消費します。 + +:::note +`Nullable` の使用はほとんど常にパフォーマンスに悪影響を与えますので、データベースを設計する際にはこれを念頭に置いてください。 +::: + +## NULLの検索 + +カラム全体を読み込むことなく、`null` サブカラムを使用して `NULL` 値を見つけることが可能です。対応する値が `NULL` の場合は `1` を返し、それ以外の場合は `0` を返します。 + +**例** + +クエリ: + +``` sql +CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple(); + +INSERT INTO nullable VALUES (1) (NULL) (2) (NULL); + +SELECT n.null FROM nullable; +``` + +結果: + +``` text +┌─n.null─┐ +│ 0 │ +│ 1 │ +│ 0 │ +│ 1 │ +└────────┘ +``` + +## 使用例 + +``` sql +CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog +``` + +``` sql +INSERT INTO t_null VALUES (1, NULL), (2, 3) +``` + +``` sql +SELECT x + y FROM t_null +``` + +``` text +┌─plus(x, y)─┐ +│ ᴺᵁᴸᴸ │ +│ 5 │ +└────────────┘ +``` diff --git a/docs/ja/sql-reference/data-types/simpleaggregatefunction.md b/docs/ja/sql-reference/data-types/simpleaggregatefunction.md new file mode 100644 index 00000000000..2f9dabe8bac --- /dev/null +++ b/docs/ja/sql-reference/data-types/simpleaggregatefunction.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/data-types/simpleaggregatefunction +sidebar_position: 48 +sidebar_label: SimpleAggregateFunction +--- + +# SimpleAggregateFunction + +`SimpleAggregateFunction(name, types_of_arguments...)` データ型は、集約関数の現在の値を格納し、[`AggregateFunction`](../../sql-reference/data-types/aggregatefunction.md) のようにその完全な状態を格納しません。この最適化は、次の性質を持つ関数に適用できます。すなわち、行セット `S1 UNION ALL S2` に関数 `f` を適用した結果は、行セットの部分に対してそれぞれ `f` を適用し、その結果に再度 `f` を適用することで得られる: `f(S1 UNION ALL S2) = f(f(S1) UNION ALL f(S2))` 。この性質により、部分的な集計結果で結合結果を計算するのに十分であることが保証されるため、余分なデータを格納および処理する必要がなくなります。 + +集約関数の値を生成する一般的な方法は、[-SimpleState](../../sql-reference/aggregate-functions/combinators.md#agg-functions-combinator-simplestate) サフィックスを付けて集約関数を呼び出すことです。 + +サポートされている集約関数は以下の通りです: + +- [`any`](../../sql-reference/aggregate-functions/reference/any.md#agg_function-any) +- [`anyLast`](../../sql-reference/aggregate-functions/reference/anylast.md#anylastx) +- [`min`](../../sql-reference/aggregate-functions/reference/min.md#agg_function-min) +- [`max`](../../sql-reference/aggregate-functions/reference/max.md#agg_function-max) +- [`sum`](../../sql-reference/aggregate-functions/reference/sum.md#agg_function-sum) +- [`sumWithOverflow`](../../sql-reference/aggregate-functions/reference/sumwithoverflow.md#sumwithoverflowx) +- [`groupBitAnd`](../../sql-reference/aggregate-functions/reference/groupbitand.md#groupbitand) +- [`groupBitOr`](../../sql-reference/aggregate-functions/reference/groupbitor.md#groupbitor) +- [`groupBitXor`](../../sql-reference/aggregate-functions/reference/groupbitxor.md#groupbitxor) +- [`groupArrayArray`](../../sql-reference/aggregate-functions/reference/grouparray.md#agg_function-grouparray) +- [`groupUniqArrayArray`](../../sql-reference/aggregate-functions/reference/groupuniqarray.md) +- [`sumMap`](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap) +- [`minMap`](../../sql-reference/aggregate-functions/reference/minmap.md#agg_functions-minmap) +- [`maxMap`](../../sql-reference/aggregate-functions/reference/maxmap.md#agg_functions-maxmap) + +:::note +`SimpleAggregateFunction(func, Type)` の値は `Type` と同じように見え、格納されますので、`-Merge`/`-State` サフィックスを付けた関数を適用する必要はありません。 + +`SimpleAggregateFunction` は同じ集約関数を持つ `AggregateFunction` よりも性能が良くなります。 +::: + +**パラメーター** + +- 集約関数の名前。 +- 集約関数の引数の型。 + +**例** + +``` sql +CREATE TABLE simple (id UInt64, val SimpleAggregateFunction(sum, Double)) ENGINE=AggregatingMergeTree ORDER BY id; +``` + diff --git a/docs/ja/sql-reference/data-types/special-data-types/expression.md b/docs/ja/sql-reference/data-types/special-data-types/expression.md new file mode 100644 index 00000000000..38e01ef98f4 --- /dev/null +++ b/docs/ja/sql-reference/data-types/special-data-types/expression.md @@ -0,0 +1,9 @@ +--- +slug: /ja/sql-reference/data-types/special-data-types/expression +sidebar_position: 58 +sidebar_label: Expression +--- + +# Expression + +Expression は高階関数におけるラムダを表現するために使用されます。 diff --git a/docs/ja/sql-reference/data-types/special-data-types/index.md b/docs/ja/sql-reference/data-types/special-data-types/index.md new file mode 100644 index 00000000000..8da45eea2c0 --- /dev/null +++ b/docs/ja/sql-reference/data-types/special-data-types/index.md @@ -0,0 +1,9 @@ +--- +slug: /ja/sql-reference/data-types/special-data-types/ +sidebar_label: 特殊データ型 +sidebar_position: 55 +--- + +# 特殊データ型 + +特殊なデータ型の値は、テーブルに保存したり、クエリ結果に出力したりするためにシリアライズすることはできませんが、クエリ実行中の中間結果として使用することができます。 diff --git a/docs/ja/sql-reference/data-types/special-data-types/interval.md b/docs/ja/sql-reference/data-types/special-data-types/interval.md new file mode 100644 index 00000000000..555aed56809 --- /dev/null +++ b/docs/ja/sql-reference/data-types/special-data-types/interval.md @@ -0,0 +1,84 @@ +--- +slug: /ja/sql-reference/data-types/special-data-types/interval +sidebar_position: 61 +sidebar_label: Interval +--- + +# Interval + +時間および日付の間隔を表すデータ型のファミリーです。[INTERVAL](../../../sql-reference/operators/index.md#operator-interval) 演算子の結果として得られる型です。 + +構造: + +- 符号なし整数値としての時間間隔。 +- 間隔の種類。 + +サポートされている間隔の種類: + +- `NANOSECOND` +- `MICROSECOND` +- `MILLISECOND` +- `SECOND` +- `MINUTE` +- `HOUR` +- `DAY` +- `WEEK` +- `MONTH` +- `QUARTER` +- `YEAR` + +各間隔の種類に対して、個別のデータ型が存在します。例えば、`DAY` 間隔は `IntervalDay` データ型に対応しています。 + +``` sql +SELECT toTypeName(INTERVAL 4 DAY) +``` + +``` text +┌─toTypeName(toIntervalDay(4))─┐ +│ IntervalDay │ +└──────────────────────────────┘ +``` + +## 使用上の注意 + +`Interval` 型の値は、[Date](../../../sql-reference/data-types/date.md) 型および [DateTime](../../../sql-reference/data-types/datetime.md) 型の値との算術演算で使用できます。例えば、現在の時刻に4日を加算することができます。 + +``` sql +SELECT now() as current_date_time, current_date_time + INTERVAL 4 DAY +``` + +``` text +┌───current_date_time─┬─plus(now(), toIntervalDay(4))─┐ +│ 2019-10-23 10:58:45 │ 2019-10-27 10:58:45 │ +└─────────────────────┴───────────────────────────────┘ +``` + +また、複数の間隔を同時に使用することも可能です。 + +``` sql +SELECT now() AS current_date_time, current_date_time + (INTERVAL 4 DAY + INTERVAL 3 HOUR) +``` + +``` text +┌───current_date_time─┬─plus(current_date_time, plus(toIntervalDay(4), toIntervalHour(3)))─┐ +│ 2024-08-08 18:31:39 │ 2024-08-12 21:31:39 │ +└─────────────────────┴────────────────────────────────────────────────────────────────────┘ +``` + +さらに、異なる間隔との比較も可能です。 + +``` sql +SELECT toIntervalMicrosecond(3600000000) = toIntervalHour(1); +``` + +``` text +┌─less(toIntervalMicrosecond(179999999), toIntervalMinute(3))─┐ +│ 1 │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 参照 + +- [INTERVAL](../../../sql-reference/operators/index.md#operator-interval) 演算子 +- [toInterval](../../../sql-reference/functions/type-conversion-functions.md#function-tointerval) 型変換関数 + diff --git a/docs/ja/sql-reference/data-types/special-data-types/nothing.md b/docs/ja/sql-reference/data-types/special-data-types/nothing.md new file mode 100644 index 00000000000..a6d8e52a6a4 --- /dev/null +++ b/docs/ja/sql-reference/data-types/special-data-types/nothing.md @@ -0,0 +1,24 @@ +--- +slug: /ja/sql-reference/data-types/special-data-types/nothing +sidebar_position: 60 +sidebar_label: Nothing +--- + +# Nothing + +このデータ型の唯一の目的は、値が期待されない場合を表すことです。そのため、`Nothing` 型の値を作成することはできません。 + +たとえば、リテラル [NULL](../../../sql-reference/syntax.md#null-literal) は `Nullable(Nothing)` 型を持っています。[Nullable](../../../sql-reference/data-types/nullable.md) について詳しくは参照してください。 + +`Nothing` 型は、空の配列を示すためにも使用されます: + +``` sql +SELECT toTypeName(array()) +``` + +``` text +┌─toTypeName(array())─┐ +│ Array(Nothing) │ +└─────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/data-types/special-data-types/set.md b/docs/ja/sql-reference/data-types/special-data-types/set.md new file mode 100644 index 00000000000..106e894afc1 --- /dev/null +++ b/docs/ja/sql-reference/data-types/special-data-types/set.md @@ -0,0 +1,9 @@ +--- +slug: /ja/sql-reference/data-types/special-data-types/set +sidebar_position: 59 +sidebar_label: Set +--- + +# Set + +[IN](../../../sql-reference/operators/in.md#select-in-operators) 式の右側で使用されます。 diff --git a/docs/ja/sql-reference/data-types/string.md b/docs/ja/sql-reference/data-types/string.md new file mode 100644 index 00000000000..e5bd8154813 --- /dev/null +++ b/docs/ja/sql-reference/data-types/string.md @@ -0,0 +1,21 @@ +--- +slug: /ja/sql-reference/data-types/string +sidebar_position: 8 +sidebar_label: String +--- + +# String + +任意の長さの文字列です。長さに制限はありません。値は、ヌルバイトを含む任意のバイトセットを含むことができます。String型は、他のDBMSのVARCHAR、BLOB、CLOBなどの型を置き換えます。 + +テーブルを作成する際に、文字列フィールド用に数値パラメータを設定することができます(例: `VARCHAR(255)`)。ただし、ClickHouseはこれを無視します。 + +エイリアス: + +- `String` — `LONGTEXT`, `MEDIUMTEXT`, `TINYTEXT`, `TEXT`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `VARCHAR`, `CHAR`, `CHAR LARGE OBJECT`, `CHAR VARYING`, `CHARACTER LARGE OBJECT`, `CHARACTER VARYING`, `NCHAR LARGE OBJECT`, `NCHAR VARYING`, `NATIONAL CHARACTER LARGE OBJECT`, `NATIONAL CHARACTER VARYING`, `NATIONAL CHAR VARYING`, `NATIONAL CHARACTER`, `NATIONAL CHAR`, `BINARY LARGE OBJECT`, `BINARY VARYING`, + +## エンコーディング + +ClickHouseにはエンコーディングの概念がありません。文字列は任意のバイトセットを含むことができ、それらはそのまま保存および出力されます。テキストを保存する必要がある場合は、UTF-8エンコーディングの使用を推奨します。少なくとも、あなたの端末がUTF-8を使用しているのであれば(推奨されるとおり)、値を変換せずに読み書きできます。 + +同様に、文字列操作のための特定の関数には、文字列がUTF-8でエンコードされたテキストを表すバイトセットであると仮定して動作する別のバリエーションがあります。たとえば、[length](../functions/string-functions.md#length)関数は、文字列の長さをバイト単位で計算しますが、[lengthUTF8](../functions/string-functions.md#lengthutf8)関数は、値がUTF-8でエンコードされていると仮定してUnicodeコードポイント単位で文字列の長さを計算します。 diff --git a/docs/ja/sql-reference/data-types/tuple.md b/docs/ja/sql-reference/data-types/tuple.md new file mode 100644 index 00000000000..bc35f52681f --- /dev/null +++ b/docs/ja/sql-reference/data-types/tuple.md @@ -0,0 +1,183 @@ +--- +slug: /ja/sql-reference/data-types/tuple +sidebar_position: 34 +sidebar_label: Tuple(T1, T2, ...) +--- + +# Tuple(T1, T2, ...) + +要素のタプルで、それぞれが個別の[型](../../sql-reference/data-types/index.md#data_types)を持ちます。タプルは少なくとも1つの要素を含む必要があります。 + +タプルは一時的なカラムのグループ化に使用されます。カラムはクエリでIN式が使用される場合や、ラムダ関数の特定の形式パラメータを指定するためにグループ化できます。詳細については、[IN 演算子](../../sql-reference/operators/in.md)および[高階関数](../../sql-reference/functions/index.md#higher-order-functions)のセクションを参照してください。 + +タプルはクエリの結果として得られることがあります。この場合、JSON以外のテキスト形式では、値が括弧内でカンマ区切りされます。JSON形式では、タプルは配列(角括弧)の形で出力されます。 + +## タプルの作成 + +タプルを作成するためには関数を使用できます。 + +``` sql +tuple(T1, T2, ...) +``` + +タプル作成の例: + +``` sql +SELECT tuple(1, 'a') AS x, toTypeName(x) +``` + +``` text +┌─x───────┬─toTypeName(tuple(1, 'a'))─┐ +│ (1,'a') │ Tuple(UInt8, String) │ +└─────────┴───────────────────────────┘ +``` + +タプルは単一の要素を含むことができます + +例: + +``` sql +SELECT tuple('a') AS x; +``` + +``` text +┌─x─────┐ +│ ('a') │ +└───────┘ +``` + +`tuple()` 関数を呼び出さずに複数の要素のタプルを作成するために、構文 `(tuple_element1, tuple_element2)` を使用することができます。 + +例: + +``` sql +SELECT (1, 'a') AS x, (today(), rand(), 'someString') AS y, ('a') AS not_a_tuple; +``` + +``` text +┌─x───────┬─y──────────────────────────────────────┬─not_a_tuple─┐ +│ (1,'a') │ ('2022-09-21',2006973416,'someString') │ a │ +└─────────┴────────────────────────────────────────┴─────────────┘ +``` + +## データ型の検出 + +タプルをオンザフライで作成する場合、ClickHouseはタプルの引数の型を、与えられた引数の値を保持できる最小の型として判断します。値が[NULL](../../sql-reference/syntax.md#null-literal)の場合、判断される型は[Nullable](../../sql-reference/data-types/nullable.md)です。 + +自動データ型検出の例: + +``` sql +SELECT tuple(1, NULL) AS x, toTypeName(x) +``` + +``` text +┌─x─────────┬─toTypeName(tuple(1, NULL))──────┐ +│ (1, NULL) │ Tuple(UInt8, Nullable(Nothing)) │ +└───────────┴─────────────────────────────────┘ +``` + +## タプル要素への参照 + +タプル要素は名前またはインデックスで参照できます: + +``` sql +CREATE TABLE named_tuples (`a` Tuple(s String, i Int64)) ENGINE = Memory; +INSERT INTO named_tuples VALUES (('y', 10)), (('x',-10)); + +SELECT a.s FROM named_tuples; -- 名前で参照 +SELECT a.2 FROM named_tuples; -- インデックスで参照 +``` + +結果: + +``` text +┌─a.s─┐ +│ y │ +│ x │ +└─────┘ + +┌─tupleElement(a, 2)─┐ +│ 10 │ +│ -10 │ +└────────────────────┘ +``` + +## タプルの比較演算 + +2つのタプルは、要素を左から右に順番に比較することで比較されます。最初のタプルの要素が2番目のタプルの対応する要素より大きい(小さい)場合、最初のタプルは2番目より大きい(小さい)とされます。そうでない場合(両方の要素が等しい場合)、次の要素が比較されます。 + +例: + +```sql +SELECT (1, 'z') > (1, 'a') c1, (2022, 01, 02) > (2023, 04, 02) c2, (1,2,3) = (3,2,1) c3; +``` + +``` text +┌─c1─┬─c2─┬─c3─┐ +│ 1 │ 0 │ 0 │ +└────┴────┴────┘ +``` + +実例: + +```sql +CREATE TABLE test +( + `year` Int16, + `month` Int8, + `day` Int8 +) +ENGINE = Memory AS +SELECT * +FROM values((2022, 12, 31), (2000, 1, 1)); + +SELECT * FROM test; + +┌─year─┬─month─┬─day─┐ +│ 2022 │ 12 │ 31 │ +│ 2000 │ 1 │ 1 │ +└──────┴───────┴─────┘ + +SELECT * +FROM test +WHERE (year, month, day) > (2010, 1, 1); + +┌─year─┬─month─┬─day─┐ +│ 2022 │ 12 │ 31 │ +└──────┴───────┴─────┘ + + +CREATE TABLE test +( + `key` Int64, + `duration` UInt32, + `value` Float64 +) +ENGINE = Memory AS +SELECT * +FROM values((1, 42, 66.5), (1, 42, 70), (2, 1, 10), (2, 2, 0)); + +SELECT * FROM test; + +┌─key─┬─duration─┬─value─┐ +│ 1 │ 42 │ 66.5 │ +│ 1 │ 42 │ 70 │ +│ 2 │ 1 │ 10 │ +│ 2 │ 2 │ 0 │ +└─────┴──────────┴───────┘ + +-- 各キーに対して最大の継続時間を持つ値を見つけます。継続時間が等しい場合、最大の値を選択します。 + +SELECT + key, + max(duration), + argMax(value, (duration, value)) +FROM test +GROUP BY key +ORDER BY key ASC; + +┌─key─┬─max(duration)─┬─argMax(value, tuple(duration, value))─┐ +│ 1 │ 42 │ 70 │ +│ 2 │ 2 │ 0 │ +└─────┴───────────────┴───────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/data-types/uuid.md b/docs/ja/sql-reference/data-types/uuid.md new file mode 100644 index 00000000000..4616bb87828 --- /dev/null +++ b/docs/ja/sql-reference/data-types/uuid.md @@ -0,0 +1,128 @@ +--- +slug: /ja/sql-reference/data-types/uuid +sidebar_position: 24 +sidebar_label: UUID +--- + +# UUID + +UUID(UUID)は、16バイトの値で、レコードを識別するために使用されます。UUIDに関する詳細は、[Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier)を参照してください。 + +異なるUUIDのバリアントが存在する一方で([こちら](https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis)を参照)、ClickHouseは挿入されたUUIDが特定のバリアントに準拠しているかを検証しません。UUIDは内部的には16バイトのランダムなシーケンスとして扱われ、SQLレベルでは[8-4-4-4-12の表現](https://en.wikipedia.org/wiki/Universally_unique_identifier#Textual_representation)を使用します。 + +UUID値の例: + +``` text +61f0c404-5cb3-11e7-907b-a6006ad3dba0 +``` + +デフォルトのUUIDはすべてゼロです。これは、例えば新しいレコードが挿入される際にUUIDカラムに値が指定されていない場合に使用されます。 + +``` text +00000000-0000-0000-0000-000000000000 +``` + +歴史的な理由により、UUIDはその後半部分でソートされます。したがって、主キー、ソートキー、またはテーブルのパーティションキーに直接UUIDを使用すべきではありません。 + +例: + +``` sql +CREATE TABLE tab (uuid UUID) ENGINE = Memory; +INSERT INTO tab SELECT generateUUIDv4() FROM numbers(50); +SELECT * FROM tab ORDER BY uuid; +``` + +結果: + +``` text +┌─uuid─────────────────────────────────┐ +│ 36a0b67c-b74a-4640-803b-e44bb4547e3c │ +│ 3a00aeb8-2605-4eec-8215-08c0ecb51112 │ +│ 3fda7c49-282e-421a-85ab-c5684ef1d350 │ +│ 16ab55a7-45f6-44a8-873c-7a0b44346b3e │ +│ e3776711-6359-4f22-878d-bf290d052c85 │ +│ [...] │ +│ 9eceda2f-6946-40e3-b725-16f2709ca41a │ +│ 03644f74-47ba-4020-b865-be5fd4c8c7ff │ +│ ce3bc93d-ab19-4c74-b8cc-737cb9212099 │ +│ b7ad6c91-23d6-4b5e-b8e4-a52297490b56 │ +│ 06892f64-cc2d-45f3-bf86-f5c5af5768a9 │ +└──────────────────────────────────────┘ +``` + +代替策として、UUIDを直感的なソート順序を持つ型に変換できます。 + +UInt128への変換を使用した例: + +``` sql +CREATE TABLE tab (uuid UUID) ENGINE = Memory; +INSERT INTO tab SELECT generateUUIDv4() FROM numbers(50); +SELECT * FROM tab ORDER BY toUInt128(uuid); +``` + +結果: + +```sql +┌─uuid─────────────────────────────────┐ +│ 018b81cd-aca1-4e9c-9e56-a84a074dc1a8 │ +│ 02380033-c96a-438e-913f-a2c67e341def │ +│ 057cf435-7044-456a-893b-9183a4475cea │ +│ 0a3c1d4c-f57d-44cc-8567-60cb0c46f76e │ +│ 0c15bf1c-8633-4414-a084-7017eead9e41 │ +│ [...] │ +│ f808cf05-ea57-4e81-8add-29a195bde63d │ +│ f859fb5d-764b-4a33-81e6-9e4239dae083 │ +│ fb1b7e37-ab7b-421a-910b-80e60e2bf9eb │ +│ fc3174ff-517b-49b5-bfe2-9b369a5c506d │ +│ fece9bf6-3832-449a-b058-cd1d70a02c8b │ +└──────────────────────────────────────┘ +``` + +## UUIDの生成 + +ClickHouseは、ランダムなUUIDバージョン4の値を生成するための[generateUUIDv4](../../sql-reference/functions/uuid-functions.md)関数を提供しています。 + +## 使用例 + +**例 1** + +この例では、UUIDカラムを持つテーブルの作成とテーブルへの値の挿入を示します。 + +``` sql +CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog + +INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1' + +SELECT * FROM t_uuid +``` + +結果: + +``` text +┌────────────────────────────────────x─┬─y─────────┐ +│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │ +└──────────────────────────────────────┴───────────┘ +``` + +**例 2** + +この例では、レコードを挿入する際にUUIDカラムの値が指定されていないため、デフォルトのUUID値が挿入されます。 + +``` sql +INSERT INTO t_uuid (y) VALUES ('Example 2') + +SELECT * FROM t_uuid +``` + +``` text +┌────────────────────────────────────x─┬─y─────────┐ +│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │ +│ 00000000-0000-0000-0000-000000000000 │ Example 2 │ +└──────────────────────────────────────┴───────────┘ +``` + +## 制限事項 + +UUIDデータ型は、[min](../../sql-reference/aggregate-functions/reference/min.md#agg_function-min)、[max](../../sql-reference/aggregate-functions/reference/max.md#agg_function-max)、および[count](../../sql-reference/aggregate-functions/reference/count.md#agg_function-count)など、[String](../../sql-reference/data-types/string.md)データ型がサポートする関数のみをサポートします。 + +UUIDデータ型は、[abs](../../sql-reference/functions/arithmetic-functions.md#arithm_func-abs)などの算術演算や、[sum](../../sql-reference/aggregate-functions/reference/sum.md#agg_function-sum)や[avg](../../sql-reference/aggregate-functions/reference/avg.md#agg_function-avg)などの集計関数をサポートしていません。 diff --git a/docs/ja/sql-reference/data-types/variant.md b/docs/ja/sql-reference/data-types/variant.md new file mode 100644 index 00000000000..9bafe0c92b2 --- /dev/null +++ b/docs/ja/sql-reference/data-types/variant.md @@ -0,0 +1,470 @@ +--- +slug: /ja/sql-reference/data-types/variant +sidebar_position: 40 +sidebar_label: Variant(T1, T2, ...) +--- + +# Variant(T1, T2, ...) + +このタイプは他のデータタイプのユニオンを表します。型 `Variant(T1, T2, ..., TN)` は、この型の各行が `T1`、`T2` など、またはそれらのどれでもない(`NULL` 値)のいずれかの値を持つことを意味します。 + +ネストされた型の順序は関係ありません: Variant(T1, T2) = Variant(T2, T1)。ネストされた型は Nullable(...)、LowCardinality(Nullable(...)) および Variant(...) 型を除く任意の型にすることができます。 + +:::note +類似した型をバリアントとして使用すること(例えば、異なる数値タイプ `Variant(UInt32, Int64)` や異なる日付タイプ `Variant(Date, DateTime)`)は推奨されません。これらの型の値を操作することで曖昧さが生じる可能性があります。デフォルトでは、そのような `Variant` 型を作成すると例外が発生しますが、`allow_suspicious_variant_types` を設定することで有効にすることができます。 +::: + +:::note +Variantデータ型はエクスペリメンタルな機能です。使用するには、`allow_experimental_variant_type = 1` を設定してください。 +::: + +## Variantの作成 + +テーブルのカラム定義で `Variant` 型を使用する: + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT v FROM test; +``` + +```text +┌─v─────────────┐ +│ ᴺᵁᴸᴸ │ +│ 42 │ +│ Hello, World! │ +│ [1,2,3] │ +└───────────────┘ +``` + +通常のカラムからのCASTを使用する: + +```sql +SELECT toTypeName(variant) as type_name, 'Hello, World!'::Variant(UInt64, String, Array(UInt64)) as variant; +``` + +```text +┌─type_name──────────────────────────────┬─variant───────┐ +│ Variant(Array(UInt64), String, UInt64) │ Hello, World! │ +└────────────────────────────────────────┴───────────────┘ +``` + +引数に共通の型がない場合に `if/multiIf` 関数を使用する(設定 `use_variant_as_common_type` が有効になっている必要があります): + +```sql +SET use_variant_as_common_type = 1; +SELECT if(number % 2, number, range(number)) as variant FROM numbers(5); +``` + +```text +┌─variant───┐ +│ [] │ +│ 1 │ +│ [0,1] │ +│ 3 │ +│ [0,1,2,3] │ +└───────────┘ +``` + +```sql +SET use_variant_as_common_type = 1; +SELECT multiIf((number % 4) = 0, 42, (number % 4) = 1, [1, 2, 3], (number % 4) = 2, 'Hello, World!', NULL) AS variant FROM numbers(4); +``` + +```text +┌─variant───────┐ +│ 42 │ +│ [1,2,3] │ +│ Hello, World! │ +│ ᴺᵁᴸᴸ │ +└───────────────┘ +``` + +`array/map` 関数を使用し、配列要素/マップ値に共通の型がない場合(設定 `use_variant_as_common_type` が有効になっている必要があります): + +```sql +SET use_variant_as_common_type = 1; +SELECT array(range(number), number, 'str_' || toString(number)) as array_of_variants FROM numbers(3); +``` + +```text +┌─array_of_variants─┐ +│ [[],0,'str_0'] │ +│ [[0],1,'str_1'] │ +│ [[0,1],2,'str_2'] │ +└───────────────────┘ +``` + +```sql +SET use_variant_as_common_type = 1; +SELECT map('a', range(number), 'b', number, 'c', 'str_' || toString(number)) as map_of_variants FROM numbers(3); +``` + +```text +┌─map_of_variants───────────────┐ +│ {'a':[],'b':0,'c':'str_0'} │ +│ {'a':[0],'b':1,'c':'str_1'} │ +│ {'a':[0,1],'b':2,'c':'str_2'} │ +└───────────────────────────────┘ +``` + +## Variantのネストされた型をサブカラムとして読み取る + +Variant型は、サブカラムとして型名を使用してVariantカラムから単一のネストされた型を読み取ることをサポートしています。例えば、カラム`variant Variant(T1, T2, T3)`がある場合、サブカラム`variant.T2`を用いて型`T2`を読み取ることができます。このサブカラムは`Nullable(T2)`型を持ち、`Nullable`の中に入っていない場合は`T2`として表示されます。このサブカラムはオリジナルの`Variant`カラムと同じサイズで、オリジナルの`Variant`カラムに`T2`型がないすべての行で`NULL`の値(あるいは`T2`が`Nullable`に入っていない場合は空の値)を含みます。 + +Variantのサブカラムは、関数 `variantElement(variant_column, type_name)` を使用して読むこともできます。 + +例: + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT v, v.String, v.UInt64, v.`Array(UInt64)` FROM test; +``` + +```text +┌─v─────────────┬─v.String──────┬─v.UInt64─┬─v.Array(UInt64)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ ᴺᵁᴸᴸ │ 42 │ [] │ +│ Hello, World! │ Hello, World! │ ᴺᵁᴸᴸ │ [] │ +│ [1,2,3] │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ +└───────────────┴───────────────┴──────────┴─────────────────┘ +``` + +```sql +SELECT toTypeName(v.String), toTypeName(v.UInt64), toTypeName(v.`Array(UInt64)`) FROM test LIMIT 1; +``` + +```text +┌─toTypeName(v.String)─┬─toTypeName(v.UInt64)─┬─toTypeName(v.Array(UInt64))─┐ +│ Nullable(String) │ Nullable(UInt64) │ Array(UInt64) │ +└──────────────────────┴──────────────────────┴─────────────────────────────┘ +``` + +```sql +SELECT v, variantElement(v, 'String'), variantElement(v, 'UInt64'), variantElement(v, 'Array(UInt64)') FROM test; +``` + +```text +┌─v─────────────┬─variantElement(v, 'String')─┬─variantElement(v, 'UInt64')─┬─variantElement(v, 'Array(UInt64)')─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ ᴺᵁᴸᴸ │ 42 │ [] │ +│ Hello, World! │ Hello, World! │ ᴺᵁᴸᴸ │ [] │ +│ [1,2,3] │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ +└───────────────┴─────────────────────────────┴─────────────────────────────┴────────────────────────────────────┘ +``` + +各行に保存されているバリアントを知るために `variantType(variant_column)` 関数を使用することができます。それは各行に対するバリアント型名の `Enum` を返します(行が `NULL` の場合は `'None'`)。 + +例: + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT variantType(v) from test; +``` + +```text +┌─variantType(v)─┐ +│ None │ +│ UInt64 │ +│ String │ +│ Array(UInt64) │ +└────────────────┘ +``` + +```sql +SELECT toTypeName(variantType(v)) FROM test LIMIT 1; +``` + +```text +┌─toTypeName(variantType(v))──────────────────────────────────────────┐ +│ Enum8('None' = -1, 'Array(UInt64)' = 0, 'String' = 1, 'UInt64' = 2) │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +## Variantカラムと他のカラム間の変換 + +`Variant` タイプのカラムに対して実行できる4つの変換があります。 + +### StringカラムをVariantカラムに変換する + +`String`から`Variant`への変換は、文字列の値から`Variant`型の値を解析することによって行われます: + +```sql +SELECT '42'::Variant(String, UInt64) as variant, variantType(variant) as variant_type +``` + +```text +┌─variant─┬─variant_type─┐ +│ 42 │ UInt64 │ +└─────────┴──────────────┘ +``` + +```sql +SELECT '[1, 2, 3]'::Variant(String, Array(UInt64)) as variant, variantType(variant) as variant_type +``` + +```text +┌─variant─┬─variant_type──┐ +│ [1,2,3] │ Array(UInt64) │ +└─────────┴───────────────┘ +``` + +```sql +SELECT CAST(map('key1', '42', 'key2', 'true', 'key3', '2020-01-01'), 'Map(String, Variant(UInt64, Bool, Date))') as map_of_variants, mapApply((k, v) -> (k, variantType(v)), map_of_variants) as map_of_variant_types +``` + +```text +┌─map_of_variants─────────────────────────────┬─map_of_variant_types──────────────────────────┐ +│ {'key1':42,'key2':true,'key3':'2020-01-01'} │ {'key1':'UInt64','key2':'Bool','key3':'Date'} │ +└─────────────────────────────────────────────┴───────────────────────────────────────────────┘ +``` + +### 通常のカラムをVariantカラムに変換する + +通常の型`T`を持つカラムをこの型を含む`Variant`カラムに変換することが可能です: + +```sql +SELECT toTypeName(variant) as type_name, [1,2,3]::Array(UInt64)::Variant(UInt64, String, Array(UInt64)) as variant, variantType(variant) as variant_name + ``` + +```text +┌─type_name──────────────────────────────┬─variant─┬─variant_name──┐ +│ Variant(Array(UInt64), String, UInt64) │ [1,2,3] │ Array(UInt64) │ +└────────────────────────────────────────┴─────────┴───────────────┘ +``` + +注意: `String`型からの変換は常に解析を通じて行われます。`String`カラムを解析せずに`Variant`の`String`バリアントに変換する必要がある場合は、以下を行うことができます: +```sql +SELECT '[1, 2, 3]'::Variant(String)::Variant(String, Array(UInt64), UInt64) as variant, variantType(variant) as variant_type +``` + +```sql +┌─variant───┬─variant_type─┐ +│ [1, 2, 3] │ String │ +└───────────┴──────────────┘ +``` + +### Variantカラムを通常のカラムに変換する + +`Variant`カラムを通常のカラムに変換することが可能です。この場合、すべてのネストされたバリアントが変換先のタイプに変換されます: + +```sql +CREATE TABLE test (v Variant(UInt64, String)) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('42.42'); +SELECT v::Nullable(Float64) FROM test; +``` + +```text +┌─CAST(v, 'Nullable(Float64)')─┐ +│ ᴺᵁᴸᴸ │ +│ 42 │ +│ 42.42 │ +└──────────────────────────────┘ +``` + +### Variantを別のVariantに変換する + +ある`Variant`カラムを別の`Variant`カラムに変換することが可能ですが、変換先の`Variant`カラムが元の`Variant`からすべてのネストされたタイプを含んでいる場合のみです: + +```sql +CREATE TABLE test (v Variant(UInt64, String)) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('String'); +SELECT v::Variant(UInt64, String, Array(UInt64)) FROM test; +``` + +```text +┌─CAST(v, 'Variant(UInt64, String, Array(UInt64))')─┐ +│ ᴺᵁᴸᴸ │ +│ 42 │ +│ String │ +└───────────────────────────────────────────────────┘ +``` + +## データからVariant型を読み取る + +すべてのテキストフォーマット(TSV、CSV、CustomSeparated、Values、JSONEachRowなど)は `Variant` 型の読み取りをサポートします。データの解析中に ClickHouse は最も適切なバリアント型に値を挿入しようとします。 + +例: + +```sql +SELECT + v, + variantElement(v, 'String') AS str, + variantElement(v, 'UInt64') AS num, + variantElement(v, 'Float64') AS float, + variantElement(v, 'DateTime') AS date, + variantElement(v, 'Array(UInt64)') AS arr +FROM format(JSONEachRow, 'v Variant(String, UInt64, Float64, DateTime, Array(UInt64))', $$ +{"v" : "Hello, World!"}, +{"v" : 42}, +{"v" : 42.42}, +{"v" : "2020-01-01 00:00:00"}, +{"v" : [1, 2, 3]} +$$) +``` + +```text +┌─v───────────────────┬─str───────────┬──num─┬─float─┬────────────────date─┬─arr─────┐ +│ Hello, World! │ Hello, World! │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ ᴺᵁᴸᴸ │ 42 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42.42 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 42.42 │ ᴺᵁᴸᴸ │ [] │ +│ 2020-01-01 00:00:00 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2020-01-01 00:00:00 │ [] │ +│ [1,2,3] │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ +└─────────────────────┴───────────────┴──────┴───────┴─────────────────────┴─────────┘ +``` + +## Variant型の値を比較する + +`Variant`型の値は、同じ`Variant`型の値とだけ比較できます。 + +`Variant(..., T1, ... T2, ...)` 型に対して、型`T1` を持つ値`v1`と型`T2`を持つ値`v2`に対する演算子`<`の結果は以下のように定義されます: +- `T1 = T2 = T` の場合、結果は `v1.T < v2.T` になります(基礎となる値が比較されます)。 +- `T1 != T2` の場合、結果は `T1 < T2` になります(型名が比較されます)。 + +例: +```sql +CREATE TABLE test (v1 Variant(String, UInt64, Array(UInt32)), v2 Variant(String, UInt64, Array(UInt32))) ENGINE=Memory; +INSERT INTO test VALUES (42, 42), (42, 43), (42, 'abc'), (42, [1, 2, 3]), (42, []), (42, NULL); +``` + +```sql +SELECT v2, variantType(v2) as v2_type from test order by v2; +``` + +```text +┌─v2──────┬─v2_type───────┐ +│ [] │ Array(UInt32) │ +│ [1,2,3] │ Array(UInt32) │ +│ abc │ String │ +│ 42 │ UInt64 │ +│ 43 │ UInt64 │ +│ ᴺᵁᴸᴸ │ None │ +└─────────┴───────────────┘ +``` + +```sql +SELECT v1, variantType(v1) as v1_type, v2, variantType(v2) as v2_type, v1 = v2, v1 < v2, v1 > v2 from test; +``` + +```text +┌─v1─┬─v1_type─┬─v2──────┬─v2_type───────┬─equals(v1, v2)─┬─less(v1, v2)─┬─greater(v1, v2)─┐ +│ 42 │ UInt64 │ 42 │ UInt64 │ 1 │ 0 │ 0 │ +│ 42 │ UInt64 │ 43 │ UInt64 │ 0 │ 1 │ 0 │ +│ 42 │ UInt64 │ abc │ String │ 0 │ 0 │ 1 │ +│ 42 │ UInt64 │ [1,2,3] │ Array(UInt32) │ 0 │ 0 │ 1 │ +│ 42 │ UInt64 │ [] │ Array(UInt32) │ 0 │ 0 │ 1 │ +│ 42 │ UInt64 │ ᴺᵁᴸᴸ │ None │ 0 │ 1 │ 0 │ +└────┴─────────┴─────────┴───────────────┴────────────────┴──────────────┴─────────────────┘ + +``` + +特定の`Variant`値を持つ行を見つける必要がある場合、以下のいずれかを行うことができます: + +- 値を対応する`Variant`型にキャストする: + +```sql +SELECT * FROM test WHERE v2 == [1,2,3]::Array(UInt32)::Variant(String, UInt64, Array(UInt32)); +``` + +```text +┌─v1─┬─v2──────┐ +│ 42 │ [1,2,3] │ +└────┴─────────┘ +``` + +- 必要な型を持つ`Variant`サブカラムを比較する: + +```sql +SELECT * FROM test WHERE v2.`Array(UInt32)` == [1,2,3] -- または variantElement(v2, 'Array(UInt32)') を使用 +``` + +```text +┌─v1─┬─v2──────┐ +│ 42 │ [1,2,3] │ +└────┴─────────┘ +``` + +複雑な型(`Array/Map/Tuple`など)は`Nullable`内に含まれることができず、異なる型を持つ行では`NULL`の代わりにデフォルト値を持つため、バリアントタイプに対して追加のチェックを行うのが有効な場合もあります: + +```sql +SELECT v2, v2.`Array(UInt32)`, variantType(v2) FROM test WHERE v2.`Array(UInt32)` == []; +``` + +```text +┌─v2───┬─v2.Array(UInt32)─┬─variantType(v2)─┐ +│ 42 │ [] │ UInt64 │ +│ 43 │ [] │ UInt64 │ +│ abc │ [] │ String │ +│ [] │ [] │ Array(UInt32) │ +│ ᴺᵁᴸᴸ │ [] │ None │ +└──────┴──────────────────┴─────────────────┘ +``` + +```sql +SELECT v2, v2.`Array(UInt32)`, variantType(v2) FROM test WHERE variantType(v2) == 'Array(UInt32)' AND v2.`Array(UInt32)` == []; +``` + +```text +┌─v2─┬─v2.Array(UInt32)─┬─variantType(v2)─┐ +│ [] │ [] │ Array(UInt32) │ +└────┴──────────────────┴─────────────────┘ +``` + +**注:** 異なる数値タイプを持つバリアントの値は、互いに別のバリアントとして考慮され、比較されることはありません。それらの型名が代わりに比較されます。 + +例: + +```sql +SET allow_suspicious_variant_types = 1; +CREATE TABLE test (v Variant(UInt32, Int64)) ENGINE=Memory; +INSERT INTO test VALUES (1::UInt32), (1::Int64), (100::UInt32), (100::Int64); +SELECT v, variantType(v) FROM test ORDER by v; +``` + +```text +┌─v───┬─variantType(v)─┐ +│ 1 │ Int64 │ +│ 100 │ Int64 │ +│ 1 │ UInt32 │ +│ 100 │ UInt32 │ +└─────┴────────────────┘ +``` + +**注** デフォルトでは `Variant` 型は `GROUP BY`/`ORDER BY` キーには許可されていません。使用する場合はその特別な比較ルールを考慮し、`allow_suspicious_types_in_group_by`/`allow_suspicious_types_in_order_by` 設定を有効にしてください。 + +## Variantを使用したJSONExtract関数 + +すべての `JSONExtract*` 関数は `Variant` 型をサポートしています: + +```sql +SELECT JSONExtract('{"a" : [1, 2, 3]}', 'a', 'Variant(UInt32, String, Array(UInt32))') AS variant, variantType(variant) AS variant_type; +``` + +```text +┌─variant─┬─variant_type──┐ +│ [1,2,3] │ Array(UInt32) │ +└─────────┴───────────────┘ +``` + +```sql +SELECT JSONExtract('{"obj" : {"a" : 42, "b" : "Hello", "c" : [1,2,3]}}', 'obj', 'Map(String, Variant(UInt32, String, Array(UInt32)))') AS map_of_variants, mapApply((k, v) -> (k, variantType(v)), map_of_variants) AS map_of_variant_types +``` + +```text +┌─map_of_variants──────────────────┬─map_of_variant_types────────────────────────────┐ +│ {'a':42,'b':'Hello','c':[1,2,3]} │ {'a':'UInt32','b':'String','c':'Array(UInt32)'} │ +└──────────────────────────────────┴─────────────────────────────────────────────────┘ +``` + +```sql +SELECT JSONExtractKeysAndValues('{"a" : 42, "b" : "Hello", "c" : [1,2,3]}', 'Variant(UInt32, String, Array(UInt32))') AS variants, arrayMap(x -> (x.1, variantType(x.2)), variants) AS variant_types +``` + +```text +┌─variants───────────────────────────────┬─variant_types─────────────────────────────────────────┐ +│ [('a',42),('b','Hello'),('c',[1,2,3])] │ [('a','UInt32'),('b','String'),('c','Array(UInt32)')] │ +└────────────────────────────────────────┴───────────────────────────────────────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md b/docs/ja/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md new file mode 100644 index 00000000000..c41ccaa1f75 --- /dev/null +++ b/docs/ja/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md @@ -0,0 +1,3 @@ +:::tip +ClickHouse Cloudを使用してDictionaryを利用する場合、DDLクエリオプションを使用してDictionaryを作成し、ユーザー`default`としてDictionaryを作成してください。また、[Cloud Compatibility guide](/docs/ja/cloud/reference/cloud-compatibility.md)でサポートされているDictionaryのソースの一覧を確認してください。 +::: diff --git a/docs/ja/sql-reference/dictionaries/index.md b/docs/ja/sql-reference/dictionaries/index.md new file mode 100644 index 00000000000..663788c2088 --- /dev/null +++ b/docs/ja/sql-reference/dictionaries/index.md @@ -0,0 +1,2505 @@ +--- +slug: /ja/sql-reference/dictionaries +sidebar_label: ディクショナリ定義 +sidebar_position: 35 +--- + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; +import CloudDetails from '@site/docs/ja/sql-reference/dictionaries/_snippet_dictionary_in_cloud.md'; + +# ディクショナリ + +ディクショナリは、さまざまな種類の参照リストに便利なマッピング (`key -> attributes`) です。 + +ClickHouseはクエリで使用できるディクショナリを操作するための特別な関数をサポートしています。リファレンステーブルとの `JOIN` よりも、関数を使用してディクショナリを使うほうが簡単かつ効率的です。 + +ClickHouseは次をサポートしています: + +- [一連の関数](../../sql-reference/functions/ext-dict-functions.md)を持つディクショナリ。 +- 特定の[一連の関数](../../sql-reference/functions/ym-dict-functions.md)を持つ[埋め込みディクショナリ](#embedded-dictionaries)。 + +:::tip チュートリアル +ClickHouseでディクショナリを始める場合には、そのトピックをカバーしたチュートリアルがあります。[こちら](/docs/ja/tutorial.md)をご覧ください。 +::: + +クリックハウスのディクショナリはさまざまなデータソースから追加できます。ディクショナリのソースには、ClickHouseテーブル、ローカルテキストまたは実行ファイル、HTTP(s)リソース、または他のDBMSを使うことができます。詳細は「[ディクショナリソース](#dictionary-sources)」を参照してください。 + +ClickHouse: + +- ディクショナリをRAMに完全または部分的に保存します。 +- ディクショナリを定期的に更新し、欠けている値を動的にロードします。つまり、ディクショナリは動的にロードできます。 +- xmlファイルまたは[DDLクエリ](../../sql-reference/statements/create/dictionary.md)でディクショナリを作成できます。 + +ディクショナリの設定は、1つ以上のxmlファイルに配置できます。設定へのパスは、[dictionaries_config](../../operations/server-configuration-parameters/settings.md#dictionaries_config)パラメータで指定します。 + +ディクショナリは、サーバーの起動時または最初の使用時にロードされますが、それは[dictionaries_lazy_load](../../operations/server-configuration-parameters/settings.md#dictionaries_lazy_load)設定に依存します。 + +[システムテーブルdictionaries](../../operations/system-tables/dictionaries.md#system_tables-dictionaries)には、サーバーで設定されたディクショナリの情報が含まれています。各ディクショナリについて、次の情報を確認できます: + +- ディクショナリのステータス。 +- 設定パラメータ。 +- ディクショナリが正常にロードされてからのRAM使用量やクエリ数などのメトリック。 + + + +## DDLクエリを使用したディクショナリの作成 {#creating-a-dictionary-with-a-ddl-query} + +ディクショナリは[DDLクエリ](../../sql-reference/statements/create/dictionary.md)を使用して作成できます。DDLで作成したディクショナリは次の利点があるため、推奨される方法です: +- サーバーの設定ファイルに追加のレコードが追加されない +- ディクショナリはテーブルやビューのように第一級のエンティティとして扱える +- ディクショナリテーブル関数ではなく、SELECTを使用して直接データを読み取ることができる +- ディクショナリの名前を簡単に変更できる + +## 設定ファイルを使用したディクショナリの作成 + +:::note +設定ファイルを用いたディクショナリの作成は、ClickHouse Cloudには適用されません。上記のDDLを使用し、ユーザー`default`としてディクショナリを作成してください。 +::: + +ディクショナリの設定ファイルは次の形式を持ちます: + +``` xml + + 任意のコンテンツを持つオプション要素。ClickHouseサーバーによって無視されます。 + + + /etc/metrika.xml + + + + + + + +``` + +同じファイルで任意の数のディクショナリを[設定](#configuring-a-dictionary)できます。 + +:::note +小さなディクショナリの値を`SELECT`クエリで記述することで変換できます([transform](../../sql-reference/functions/other-functions.md)関数を参照)。この機能はディクショナリとは関係ありません。 +::: + +## ディクショナリの設定 + + + +ディクショナリがxmlファイルで設定されている場合、ディクショナリの設定は次の構造を持ちます: + +``` xml + + dict_name + + + + + + + + + + + + + + + + + +``` + +対応する[DDLクエリ](../../sql-reference/statements/create/dictionary.md)は次の構造です: + +``` sql +CREATE DICTIONARY dict_name +( + ... -- 属性 +) +PRIMARY KEY ... -- 複合または単一キーの設定 +SOURCE(...) -- ソース設定 +LAYOUT(...) -- メモリレイアウトの設定 +LIFETIME(...) -- メモリにおけるディクショナリの寿命 +``` + +## メモリにディクショナリを保存する方法 + +ディクショナリをメモリに保存する方法はさまざまです。 + +最適な処理速度を提供する[flat](#flat)、[hashed](#hashed)および[complex_key_hashed](#complex_key_hashed)をお勧めします。 + +キャッシュは潜在的な低パフォーマンスと最適なパラメータの選択が難しいため推奨されません。[cache](#cache)セクションで詳細を読むことができます。 + +ディクショナリのパフォーマンスを向上させるいくつかの方法があります: + +- ディクショナリで操作するための関数を`GROUP BY`の後に呼び出す。 +- 抽出する属性を全射的であるとマークします。属性が異なるキーに対応する場合、それを全射と呼びます。つまり、`GROUP BY`がキーで属性値を取得する関数を使用する場合、この関数が`GROUP BY`から自動的に取り出されます。 + +ClickHouseはエラーがディクショナリで発生した場合に例外を生成します。エラーの例: + +- アクセスしようとしたディクショナリがロードできなかった。 +- `cached`ディクショナリをクエリする際のエラー。 + +[system.dictionaries](../../operations/system-tables/dictionaries.md)テーブルでディクショナリのリストとそのステータスを表示できます。 + + + +設定は次のようになります: + +``` xml + + + ... + + + + + + ... + + +``` + +対応する[DDLクエリ](../../sql-reference/statements/create/dictionary.md)は次の通りです: + +``` sql +CREATE DICTIONARY (...) +... +LAYOUT(LAYOUT_TYPE(param value)) -- レイアウト設定 +... +``` + +レイアウトに`complex-key*`という言葉が含まれていないディクショナリは、[UInt64](../../sql-reference/data-types/int-uint.md)型のキーを持ち、`complex-key*`ディクショナリは複合キー(任意の型)を持ちます。 + +XMLディクショナリ内の[UInt64](../../sql-reference/data-types/int-uint.md)キーは``タグで定義します。 + +設定の例(カラムkey_columnがUInt64型の場合): +```xml +... + + + key_column + +... +``` + +複合`complex`キーのXMLディクショナリは``タグで定義します。 + +複合キーの設定例(キーが[String](../../sql-reference/data-types/string.md)型の1要素を持つ場合): +```xml +... + + + + country_code + String + + +... +``` + +## メモリにディクショナリを保存する方法 + +- [flat](#flat) +- [hashed](#hashed) +- [sparse_hashed](#sparse_hashed) +- [complex_key_hashed](#complex_key_hashed) +- [complex_key_sparse_hashed](#complex_key_sparse_hashed) +- [hashed_array](#hashed_array) +- [complex_key_hashed_array](#complex_key_hashed_array) +- [range_hashed](#range_hashed) +- [complex_key_range_hashed](#complex_key_range_hashed) +- [cache](#cache) +- [complex_key_cache](#complex_key_cache) +- [ssd_cache](#ssd_cache) +- [complex_key_ssd_cache](#complex_key_ssd_cache) +- [direct](#direct) +- [complex_key_direct](#complex_key_direct) +- [ip_trie](#ip_trie) + +### flat + +ディクショナリはフラット配列の形でメモリに完全に保存されます。ディクショナリのメモリ使用量はどれくらいですか?それは最大サイズのキーに比例します。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ち、値は`max_array_size`(デフォルトは500,000)に制限されます。ディクショナリ作成時により大きなキーが見つかった場合、ClickHouseは例外をスローし、ディクショナリを作成しません。ディクショナリのフラット配列初期サイズは`initial_array_size`設定(デフォルトは1024)で制御されます。 + +全ての種類のソースがサポートされています。更新する際には、データ(ファイルまたはテーブルから)は全体で読み込まれます。 + +この方法は、ディクショナリを保存するためのすべての方法の中で最高のパフォーマンスを提供します。 + +設定の例: + +``` xml + + + 50000 + 5000000 + + +``` + +または + +``` sql +LAYOUT(FLAT(INITIAL_ARRAY_SIZE 50000 MAX_ARRAY_SIZE 5000000)) +``` + +### hashed + +ディクショナリは、ハッシュテーブルの形でメモリに完全に保存されます。ディクショナリは任意の数の要素と識別子を持つことができます。実際には、キーの数は何千万アイテムに達する可能性があります。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +全ての種類のソースがサポートされています。更新する際には、データ(ファイルまたはテーブルから)が全体として読み込まれます。 + +設定の例: + +``` xml + + + +``` + +または + +``` sql +LAYOUT(HASHED()) +``` + +設定の例: + +``` xml + + + + 10 + + + 10000 + + + 0.5 + + +``` + +または + +``` sql +LAYOUT(HASHED([SHARDS 1] [SHARD_LOAD_QUEUE_BACKLOG 10000] [MAX_LOAD_FACTOR 0.5])) +``` + +### sparse_hashed + +`hashed` に似ていますが、より多くのCPU使用量に対してメモリを少なく使用します。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +設定の例: + +``` xml + + + + + + + +``` + +または + +``` sql +LAYOUT(SPARSE_HASHED([SHARDS 1] [SHARD_LOAD_QUEUE_BACKLOG 10000] [MAX_LOAD_FACTOR 0.5])) +``` + +この種類のディクショナリでは、`shards`を使用することも可能で、再びそれは`hashed`に比べて`sparse_hashed`の方がより重要です。なぜなら、`sparse_hashed`はより遅いためです。 + +### complex_key_hashed + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。`hashed`に似ています。 + +設定の例: + +``` xml + + + + + + + +``` + +または + +``` sql +LAYOUT(COMPLEX_KEY_HASHED([SHARDS 1] [SHARD_LOAD_QUEUE_BACKLOG 10000] [MAX_LOAD_FACTOR 0.5])) +``` + +### complex_key_sparse_hashed + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。[sparse_hashed](#sparse_hashed)に似ています。 + +設定の例: + +``` xml + + + + + + + +``` + +または + +``` sql +LAYOUT(COMPLEX_KEY_SPARSE_HASHED([SHARDS 1] [SHARD_LOAD_QUEUE_BACKLOG 10000] [MAX_LOAD_FACTOR 0.5])) +``` + +### hashed_array + +ディクショナリは完全にメモリに保存されます。各属性は配列に保存されます。キー属性はハッシュテーブルの形式で保存され、値は属性配列のインデックスです。ディクショナリは任意の数の要素と識別子を持つことができます。実際には、キーの数は何千万アイテムに達する可能性があります。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +全ての種類のソースがサポートされています。更新する際には、データ(ファイルまたはテーブルから)が全体として読み込まれます。 + +設定の例: + +``` xml + + + + +``` + +または + +``` sql +LAYOUT(HASHED_ARRAY([SHARDS 1])) +``` + +### complex_key_hashed_array + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。[hashed_array](#hashed_array)に似ています。 + +設定の例: + +``` xml + + + +``` + +または + +``` sql +LAYOUT(COMPLEX_KEY_HASHED_ARRAY([SHARDS 1])) +``` + +### range_hashed + +ディクショナリは、範囲とそれに対応する値の順序付き配列を持つハッシュテーブルの形でメモリに保存されます。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 +このストレージ方法は、`hashed`と同様に機能し、キーに加えて日付/時間(任意の数値型)の範囲を使用できます。 + +例: テーブルは各広告主に対する割引を次の形式で含みます: + +``` text +┌─advertiser_id─┬─discount_start_date─┬─discount_end_date─┬─amount─┐ +│ 123 │ 2015-01-16 │ 2015-01-31 │ 0.25 │ +│ 123 │ 2015-01-01 │ 2015-01-15 │ 0.15 │ +│ 456 │ 2015-01-01 │ 2015-01-15 │ 0.05 │ +└───────────────┴─────────────────────┴───────────────────┴────────┘ +``` + +日付範囲のサンプルを使用するには、[structure](#dictionary-key-and-fields)で`range_min`と`range_max`要素を定義します。これらの要素は`name`と`type`(`type`が指定されていない場合はデフォルト型であるDateが使用されます)の要素を持つ必要があります。`type`は任意の数値型(Date / DateTime / UInt64 / Int32 / その他)が可能です。 + +:::note +`range_min`と`range_max`の値は`Int64`型に収まるべきです。 +::: + +例: + +``` xml + + + + min + + + + + advertiser_id + + + discount_start_date + Date + + + discount_end_date + Date + + ... +``` + +または + +``` sql +CREATE DICTIONARY discounts_dict ( + advertiser_id UInt64, + discount_start_date Date, + discount_end_date Date, + amount Float64 +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(TABLE 'discounts')) +LIFETIME(MIN 1 MAX 1000) +LAYOUT(RANGE_HASHED(range_lookup_strategy 'max')) +RANGE(MIN discount_start_date MAX discount_end_date) +``` + +これらのディクショナリを操作するには、`dictGet`関数に範囲を選択するための追加の引数を渡す必要があります: + +``` sql +dictGet('dict_name', 'attr_name', id, date) +``` + +クエリ例: + +``` sql +SELECT dictGet('discounts_dict', 'amount', 1, '2022-10-20'::Date); +``` + +この関数は、指定された`id`と、渡された日付を含む日付範囲の値を返します。 + +アルゴリズムの詳細: + +- `id`が見つからないか、`id`のための範囲が見つからない場合、その属性の型のデフォルト値を返します。 +- 重複する範囲があり、`range_lookup_strategy=min`である場合、最小の`range_min`を持つ一致する範囲を返します。複数の範囲が見つかった場合、最小の`range_max`を持つ範囲を返します。それでも複数の範囲が(同じ`range_min`と`range_max`を持つ複数の範囲があった場合)は、ランダムにその中の一つが返されます。 +- 重複する範囲があり、`range_lookup_strategy=max`である場合、最大の`range_min`を持つ一致する範囲を返します。複数の範囲が見つかった場合、最大の`range_max`を持つ範囲を返します。それでも複数の範囲が(同じ`range_min`と`range_max`を持つ複数の範囲があった場合)は、ランダムにその中の一つが返されます。 +- `range_max`が`NULL`の場合、範囲は開かれています。`NULL`は最大可能値として扱われます。`range_min`に対しては、`1970-01-01`または`0`(-MAX_INT)が開いた値として使用できます。 + +設定例: + +``` xml + + + ... + + + + + + + + Abcdef + + + StartTimeStamp + UInt64 + + + EndTimeStamp + UInt64 + + + XXXType + String + + + + + + +``` + +または + +``` sql +CREATE DICTIONARY somedict( + Abcdef UInt64, + StartTimeStamp UInt64, + EndTimeStamp UInt64, + XXXType String DEFAULT '' +) +PRIMARY KEY Abcdef +RANGE(MIN StartTimeStamp MAX EndTimeStamp) +``` + +重複する範囲と開いた範囲の設定例: + +```sql +CREATE TABLE discounts +( + advertiser_id UInt64, + discount_start_date Date, + discount_end_date Nullable(Date), + amount Float64 +) +ENGINE = Memory; + +INSERT INTO discounts VALUES (1, '2015-01-01', Null, 0.1); +INSERT INTO discounts VALUES (1, '2015-01-15', Null, 0.2); +INSERT INTO discounts VALUES (2, '2015-01-01', '2015-01-15', 0.3); +INSERT INTO discounts VALUES (2, '2015-01-04', '2015-01-10', 0.4); +INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-15', 0.5); +INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-10', 0.6); + +SELECT * FROM discounts ORDER BY advertiser_id, discount_start_date; +┌─advertiser_id─┬─discount_start_date─┬─discount_end_date─┬─amount─┐ +│ 1 │ 2015-01-01 │ ᴺᵁᴸᴸ │ 0.1 │ +│ 1 │ 2015-01-15 │ ᴺᵁᴸᴸ │ 0.2 │ +│ 2 │ 2015-01-01 │ 2015-01-15 │ 0.3 │ +│ 2 │ 2015-01-04 │ 2015-01-10 │ 0.4 │ +│ 3 │ 1970-01-01 │ 2015-01-15 │ 0.5 │ +│ 3 │ 1970-01-01 │ 2015-01-10 │ 0.6 │ +└───────────────┴─────────────────────┴───────────────────┴────────┘ + +-- RANGE_LOOKUP_STRATEGY 'max' + +CREATE DICTIONARY discounts_dict +( + advertiser_id UInt64, + discount_start_date Date, + discount_end_date Nullable(Date), + amount Float64 +) +PRIMARY KEY advertiser_id +SOURCE(CLICKHOUSE(TABLE discounts)) +LIFETIME(MIN 600 MAX 900) +LAYOUT(RANGE_HASHED(RANGE_LOOKUP_STRATEGY 'max')) +RANGE(MIN discount_start_date MAX discount_end_date); + +select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-14')) res; +┌─res─┐ +│ 0.1 │ -- 一致する範囲は1つのみ: 2015-01-01 - Null +└─────┘ + +select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-16')) res; +┌─res─┐ +│ 0.2 │ -- 2つの範囲が一致、range_min 2015-01-15 (0.2)が2015-01-01 (0.1)より大きい +└─────┘ + +select dictGet('discounts_dict', 'amount', 2, toDate('2015-01-06')) res; +┌─res─┐ +│ 0.4 │ -- 2つの範囲が一致、range_min 2015-01-04 (0.4)が2015-01-01 (0.3)より大きい +└─────┘ + +select dictGet('discounts_dict', 'amount', 3, toDate('2015-01-01')) res; +┌─res─┐ +│ 0.5 │ -- 2つの範囲が一致、range_minは等しい、2015-01-15 (0.5)が2015-01-10 (0.6)より大きい +└─────┘ + +DROP DICTIONARY discounts_dict; + +-- RANGE_LOOKUP_STRATEGY 'min' + +CREATE DICTIONARY discounts_dict +( + advertiser_id UInt64, + discount_start_date Date, + discount_end_date Nullable(Date), + amount Float64 +) +PRIMARY KEY advertiser_id +SOURCE(CLICKHOUSE(TABLE discounts)) +LIFETIME(MIN 600 MAX 900) +LAYOUT(RANGE_HASHED(RANGE_LOOKUP_STRATEGY 'min')) +RANGE(MIN discount_start_date MAX discount_end_date); + +select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-14')) res; +┌─res─┐ +│ 0.1 │ -- 一致する範囲は1つだけ: 2015-01-01 - Null +└─────┘ + +select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-16')) res; +┌─res─┐ +│ 0.1 │ -- 2つの範囲が一致、range_min 2015-01-01 (0.1) が2015-01-15 (0.2)より小さい +└─────┘ + +select dictGet('discounts_dict', 'amount', 2, toDate('2015-01-06')) res; +┌─res─┐ +│ 0.3 │ -- 2つの範囲が一致、range_min 2015-01-01 (0.3) が2015-01-04 (0.4)より小さい +└─────┘ + +select dictGet('discounts_dict', 'amount', 3, toDate('2015-01-01')) res; +┌─res─┐ +│ 0.6 │ -- 2つの範囲が一致、range_minは等しい、2015-01-10 (0.6) が2015-01-15 (0.5)より小さい +└─────┘ +``` + +### complex_key_range_hashed + +ディクショナリは、範囲とそれに対応する値の順序付き配列を持つハッシュテーブルの形でメモリに保存されます([range_hashed](#range_hashed)を参照)。このストレージタイプは複合[キー](#dictionary-key-and-fields)用です。 + +設定例: + +``` sql +CREATE DICTIONARY range_dictionary +( + CountryID UInt64, + CountryKey String, + StartDate Date, + EndDate Date, + Tax Float64 DEFAULT 0.2 +) +PRIMARY KEY CountryID, CountryKey +SOURCE(CLICKHOUSE(TABLE 'date_table')) +LIFETIME(MIN 1 MAX 1000) +LAYOUT(COMPLEX_KEY_RANGE_HASHED()) +RANGE(MIN StartDate MAX EndDate); +``` + +### cache + +ディクショナリは、固定数のセルを持つキャッシュに保存されます。これらのセルには頻繁に使用される要素が含まれます。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +ディクショナリを検索する際、まずキャッシュが検索されます。データブロックごとに、キャッシュに見つからない、または期限切れのすべてのキーが`SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...)`を使ってソースから要求されます。受信したデータはキャッシュに書き込まれます。 + +キーがディクショナリに見つからない場合、キャッシュ更新タスクが作成され、更新キューに追加されます。更新キューの特性は`max_update_queue_size`、`update_queue_push_timeout_milliseconds`、`query_wait_timeout_milliseconds`、`max_threads_for_updates`設定によって制御できます。 + +キャッシュディクショナリの場合、[lifetime](#refreshing-dictionary-data-using-lifetime)でデータの有効期限を設定できます。セルにデータがロードされてから`lifetime`を超える時間が経過した場合、セルの値は使用されず、キーが期限切れになります。このキーは次回使用時に再要求されます。この動作は`allow_read_expired_keys`設定で構成できます。 + +これはディクショナリを保存するすべての方法の中で最も効果が低いものです。キャッシュの速度は、設定と使用シナリオに大きく依存します。キャッシュタイプのディクショナリは、ヒット率が十分に高い場合にのみ良好に動作します(推奨99%以上)。[system.dictionaries](../../operations/system-tables/dictionaries.md)テーブルで平均ヒット率を確認できます。 + +設定`allow_read_expired_keys`が1に設定されている場合(デフォルトは0)、ディクショナリは非同期更新をサポートできます。クライアントがキーを要求し、すべてのキーがキャッシュに存在するが、一部のキーが期限切れになっている場合、ディクショナリはクライアントに期限切れのキーを返し、ソースから非同期に要求されます。 + +キャッシュの性能を向上させるには、`LIMIT`付きのサブクエリを使用し、ディクショナリと外部に関数を呼び出します。 + +すべての種類のソースがサポートされています。 + +設定例: + +``` xml + + + + 1000000000 + + 0 + + 100000 + + 10 + + 60000 + + 4 + + +``` + +または + +``` sql +LAYOUT(CACHE(SIZE_IN_CELLS 1000000000)) +``` + +十分なキャッシュサイズを設定してください。セル数を選択するには実験が必要です: + +1. 各種値を設定します。 +2. キャッシュが完全に満たされるまでクエリを実行します。 +3. `system.dictionaries`テーブルを使用してメモリ消費量を評価します。 +4. 必要なメモリ消費量に達するまでセル数を増減します。 + +:::note +ClickHouseをソースとして使用しないでください。ランダム読みによるクエリ処理が遅いためです。 +::: + +### complex_key_cache + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。`cache`に似ています。 + +### ssd_cache + +`s_cache`に似ていますが、データをSSDに保存しインデックスをRAMに保存します。更新キューに関連するすべてのキャッシュディクショナリ設定もSSDキャッシュディクショナリに適用できます。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +``` xml + + + + 4096 + + 16777216 + + 131072 + + 1048576 + + /var/lib/clickhouse/user_files/test_dict + + +``` + +または + +``` sql +LAYOUT(SSD_CACHE(BLOCK_SIZE 4096 FILE_SIZE 16777216 READ_BUFFER_SIZE 1048576 + PATH '/var/lib/clickhouse/user_files/test_dict')) +``` + +### complex_key_ssd_cache + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。`ssd_cache`に似ています。 + +### direct + +ディクショナリはメモリに保存されず、リクエストの処理中にソース に直接アクセスします。 + +ディクショナリキーは[UInt64](../../sql-reference/data-types/int-uint.md)型を持ちます。 + +ローカルファイルを除くすべての[ソース](#dictionary-sources)がサポートされます。 + +設定例: + +``` xml + + + +``` + +または + +``` sql +LAYOUT(DIRECT()) +``` + +### complex_key_direct + +このストレージタイプは、複合[キー](#dictionary-key-and-fields)と共に使用されます。`direct`に似ています。 + +### ip_trie + +このストレージタイプはネットワークプレフィックス(IPアドレス)をASNなどのメタデータにマッピングするためのものです。 + +**例** + +ClickHouseにIPプレフィックスとマッピングが含まれるテーブルがあるとします: + +```sql +CREATE TABLE my_ip_addresses ( + prefix String, + asn UInt32, + cca2 String +) +ENGINE = MergeTree +PRIMARY KEY prefix; +``` + +```sql +INSERT INTO my_ip_addresses VALUES + ('202.79.32.0/20', 17501, 'NP'), + ('2620:0:870::/48', 3856, 'US'), + ('2a02:6b8:1::/48', 13238, 'RU'), + ('2001:db8::/32', 65536, 'ZZ') +; +``` + +このテーブルの`ip_trie`ディクショナリを定義しましょう。`ip_trie`レイアウトは複合キーを必要とします: + +``` xml + + + + prefix + String + + + + asn + UInt32 + + + + cca2 + String + ?? + + ... + + + + + + true + + +``` + +または + +``` sql +CREATE DICTIONARY my_ip_trie_dictionary ( + prefix String, + asn UInt32, + cca2 String DEFAULT '??' +) +PRIMARY KEY prefix +SOURCE(CLICKHOUSE(TABLE 'my_ip_addresses')) +LAYOUT(IP_TRIE) +LIFETIME(3600); +``` + +キーは許可されたIPプレフィックスを含む`String`型属性を一つだけ持たなければなりません。他の型はまだサポートされていません。 + +構文は以下の通りです: + +``` sql +dictGetT('dict_name', 'attr_name', ip) +``` + +関数は`UInt32`(IPv4の場合)、または`FixedString(16)`(IPv6の場合)を取ります。例 : + +``` sql +SELECT dictGet('my_ip_trie_dictionary', 'cca2', toIPv4('202.79.32.10')) AS result; + +┌─result─┐ +│ NP │ +└────────┘ + + +SELECT dictGet('my_ip_trie_dictionary', 'asn', IPv6StringToNum('2001:db8::1')) AS result; + +┌─result─┐ +│ 65536 │ +└────────┘ + + +SELECT dictGet('my_ip_trie_dictionary', ('asn', 'cca2'), IPv6StringToNum('2001:db8::1')) AS result; + +┌─result───────┐ +│ (65536,'ZZ') │ +└──────────────┘ +``` + +他の型はまだサポートされていません。関数は、このIPアドレスに対応するプレフィックスの属性を返します。プレフィックスが重複する場合、最も特定のものが返されます。 + +データは完全にRAMに収まる必要があります。 + +## LIFETIMEを使用したディクショナリデータの更新 + +ClickHouseは、`LIFETIME`タグ(秒単位で定義)に基づいて定期的にディクショナリを更新します。`LIFETIME`は完全にダウンロードされたディクショナリの更新間隔であり、キャッシュされたディクショナリの無効化間隔です。 +``` +更新の間、古いバージョンのDictionaryは依然としてクエリ可能です。Dictionaryの更新(初めてDictionaryをロードする場合を除く)はクエリをブロックしません。更新中にエラーが発生した場合、エラーはサーバーログに記録され、クエリは古いバージョンのDictionaryを使用して続行できます。Dictionaryの更新が成功した場合、古いバージョンのDictionaryはアトミックに置き換えられます。 + +設定の例: + + + +``` xml + + ... + 300 + ... + +``` + +または + +``` sql +CREATE DICTIONARY (...) +... +LIFETIME(300) +... +``` + +`0` (`LIFETIME(0)`) の設定は、Dictionaryの更新を防ぎます。 + +更新のための時間間隔を設定することができ、ClickHouseはこの範囲内で均一にランダムな時間を選びます。これは、多数のサーバーで更新する際に、Dictionaryソースへの負荷を分散するために必要です。 + +設定の例: + +``` xml + + ... + + 300 + 360 + + ... + +``` + +または + +``` sql +LIFETIME(MIN 300 MAX 360) +``` + +もし`0`および`0`の場合、ClickHouseはタイムアウトによってDictionaryをリロードしません。 +この場合、Dictionaryの構成ファイルが変更された場合や`SYSTEM RELOAD DICTIONARY`コマンドが実行された場合には、ClickHouseはDictionaryを早くリロードすることがあります。 + +Dictionaryを更新する際、ClickHouseサーバーは[ソース](#dictionary-sources)のタイプに応じて異なるロジックを適用します。 + +- テキストファイルの場合、変更された時間を確認します。以前に記録された時間と異なる場合は、Dictionaryが更新されます。 +- MySQLソースの場合、`SHOW TABLE STATUS`クエリを使用して変更された時間が確認されます(MySQL 8の場合、MySQLでメタ情報キャッシュを無効にする必要があります: `set global information_schema_stats_expiry=0`)。 +- 他のソースからのDictionaryはデフォルトで毎回更新されます。 + +他のソース(ODBC、PostgreSQL、ClickHouseなど)の場合、実際に変更された場合にのみDictionaryを更新するクエリを設定できます。これを行うには、次の手順を実行します: + +- Dictionaryテーブルには、ソースデータが更新されると常に変更されるフィールドが必要です。 +- ソースの設定には、変更されるフィールドを取得するクエリを指定する必要があります。ClickHouseサーバーはクエリの結果を行として解釈し、この行が以前の状態と異なる場合にDictionaryを更新します。クエリは[ソース](#dictionary-sources)の設定の``フィールドに指定します。 + +設定の例: + +``` xml + + ... + + ... + SELECT update_time FROM dictionary_source where id = 1 + + ... + +``` + +または + +``` sql +... +SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1')) +... +``` + +`Cache`、`ComplexKeyCache`、`SSDCache`、および `SSDComplexKeyCache` Dictionaryは同期および非同期更新の両方をサポートしています。 + +また、`Flat`、`Hashed`、`ComplexKeyHashed` Dictionaryでは、前回の更新後に変更されたデータのみをリクエストすることが可能です。`update_field`がDictionaryソースの設定の一部として指定されている場合、前回の更新時刻(秒単位)の値がデータリクエストに追加されます。ソースタイプ(Executable, HTTP, MySQL, PostgreSQL, ClickHouse, または ODBC)に応じて、更新前に`update_field`に異なるロジックが適用されます。 + +- ソースがHTTPの場合、`update_field`はクエリパラメータとして最後の更新時刻をパラメータ値として追加されます。 +- ソースがExecutableの場合、`update_field`は実行可能スクリプトの引数として最後の更新時刻を引数値として追加されます。 +- ソースがClickHouse、MySQL、PostgreSQL、ODBCの場合、`update_field`はSQLクエリの最高レベルでの`WHERE`条件として、最後の更新時刻と大なりまたは等しいもので比較されます。デフォルトでは、この`WHERE`条件はSQLクエリの最上位でチェックされます。代替として、クエリ内の任意の他の`WHERE`句で`{condition}`キーワードを使用して条件をチェックできます。例: + ``` sql + ... + SOURCE(CLICKHOUSE(... + update_field 'added_time' + QUERY ' + SELECT my_arr.1 AS x, my_arr.2 AS y, creation_time + FROM ( + SELECT arrayZip(x_arr, y_arr) AS my_arr, creation_time + FROM dictionary_source + WHERE {condition} + )' + )) + ... + ``` + +`update_field`オプションが設定されている場合、追加のオプション`update_lag`を設定できます。`update_lag`オプションの値は前回の更新時刻から差し引かれた後に更新されたデータがリクエストされます。 + +設定の例: + +``` xml + + ... + + ... + added_time + 15 + + ... + +``` + +または + +``` sql +... +SOURCE(CLICKHOUSE(... update_field 'added_time' update_lag 15)) +... +``` + +## Dictionary Sources + + + +DictionaryはさまざまなソースからClickHouseに接続できます。 + +Dictionaryがxmlファイルを使用して構成されている場合、構成は次のようになります: + +``` xml + + + ... + + + + + + ... + + ... + +``` + +[DDL-query](../../sql-reference/statements/create/dictionary.md)の場合、上記の構成は次のようになります: + +``` sql +CREATE DICTIONARY dict_name (...) +... +SOURCE(SOURCE_TYPE(param1 val1 ... paramN valN)) -- ソースの設定 +... +``` + +ソースは`source`セクションで構成されます。 + +ソースタイプ[ローカルファイル](#local-file)、[実行ファイル](#executable-file)、[HTTP(S)](#https)、[ClickHouse](#clickhouse)のためのオプション設定が利用可能です: + +``` xml + + + /opt/dictionaries/os.tsv + TabSeparated + + + 0 + + +``` + +または + +``` sql +SOURCE(FILE(path './user_files/os.tsv' format 'TabSeparated')) +SETTINGS(format_csv_allow_single_quotes = 0) +``` + +ソースの種類 (`source_type`): + +- [ローカルファイル](#local-file) +- [実行ファイル](#executable-file) +- [実行プール](#executable-pool) +- [HTTP(S)](#https) +- DBMS + - [ODBC](#odbc) + - [MySQL](#mysql) + - [ClickHouse](#clickhouse) + - [MongoDB](#mongodb) + - [Redis](#redis) + - [Cassandra](#cassandra) + - [PostgreSQL](#postgresql) + +### Local File + +設定の例: + +``` xml + + + /opt/dictionaries/os.tsv + TabSeparated + + +``` + +または + +``` sql +SOURCE(FILE(path './user_files/os.tsv' format 'TabSeparated')) +``` + +設定フィールド: + +- `path` – ファイルへの絶対パス。 +- `format` – ファイルの形式。[Formats](../../interfaces/formats.md#formats)で説明されているすべての形式がサポートされています。 + +DDLコマンド(`CREATE DICTIONARY ...`)でソース`FILE`を持つDictionaryを作成する際には、ソースファイルを`user_files`ディレクトリに配置して、ClickHouseノード上の任意のファイルにデータベースユーザーがアクセスするのを防ぐ必要があります。 + +**関連項目** + +- [Dictionary関数](../../sql-reference/table-functions/dictionary.md#dictionary-function) + +### Executable File + +実行ファイルの処理は、[Dictionaryがメモリ内にどのように保存されているか](#storing-dictionaries-in-memory)に依存します。Dictionaryが`cache`や`complex_key_cache`を使用して保存されている場合、ClickHouseはSTDINにリクエストを送信して必要なキーをリクエストします。それ以外の場合、ClickHouseは実行ファイルを開始し、その出力をDictionaryデータとして扱います。 + +設定の例: + +``` xml + + + cat /opt/dictionaries/os.tsv + TabSeparated + false + + +``` + +設定フィールド: + +- `command` — 実行可能ファイルへの絶対パス、またはコマンドディレクトリが`PATH`にある場合はファイル名。 +- `format` — ファイルの形式。[Formats](../../interfaces/formats.md#formats)で説明されているすべての形式がサポートされています。 +- `command_termination_timeout` — 実行可能スクリプトはメインの読書-書き込みループを含むべきです。Dictionaryが破棄された後、パイプが閉じられ、ClickHouseが子プロセスにSIGTERMシグナルを送信する前に、実行可能ファイルは`command_termination_timeout`秒でシャットダウンさせられます。デフォルト値は10です。オプションのパラメータ。 +- `command_read_timeout` - コマンドのstdoutからデータを読み取るタイムアウトをミリ秒単位で指定します。デフォルト値は10000です。オプションのパラメータ。 +- `command_write_timeout` - コマンドのstdinにデータを書き込むタイムアウトをミリ秒単位で指定します。デフォルト値は10000です。オプションのパラメータ。 +- `implicit_key` — 実行可能ソースファイルは値のみを返すことができ、要求されたキーとの対応は、結果内の行の順序によって暗黙的に決定されます。デフォルト値はfalseです。 +- `execute_direct` - `execute_direct` = `1`の場合、`command`は[user_scripts_path](../../operations/server-configuration-parameters/settings.md#user_scripts_path)で指定されたuser_scriptsフォルダ内で検索されます。追加のスクリプト引数は空白区切りで指定できます。例: `script_name arg1 arg2`。`execute_direct` = `0`の場合、`command`は`bin/sh -c`の引数として渡されます。デフォルト値は`0`です。オプションのパラメータ。 +- `send_chunk_header` - 処理するデータチャンクへの行数を送信するかどうかを制御します。オプション。デフォルト値は`false`です。 + +このDictionaryソースはXML構成でのみ設定できます。DDLを介して実行可能ソースを持つDictionaryを作成することはできません。さもないと、データベースユーザーはClickHouseノードで任意のバイナリを実行することができてしまいます。 + +### Executable Pool + +実行プールは多くのプロセスプールからデータをロードすることを許可します。このソースは、ソースからすべてのデータをロードする必要があるDictionaryレイアウトでは動作しません。実行プールは、Dictionaryが`cache`、`complex_key_cache`、`ssd_cache`、`complex_key_ssd_cache`、`direct`、または`complex_key_direct`レイアウトを使用して保存されている場合に動作します。 + +実行プールは、指定されたコマンドでプロセスのプールを開始し、それらが終了するまでそれらを保持します。プログラムは、利用可能な限りSTDINからデータを読み取り、結果をSTDOUTに出力する必要があります。次のデータブロックをSTDINで待つことができます。ClickHouseはデータの処理後にSTDINを閉じませんが、必要に応じて新しいデータチャンクをパイプします。実行可能スクリプトは、この方法でのデータ処理に対応できるように準備する必要があります - STDINをポーリングし、データを早期にSTDOUTにフラッシュする必要があります。 + +設定の例: + +``` xml + + + while read key; do printf "$key\tData for key $key\n"; done + TabSeparated + 10 + 10 + false + + +``` + +設定フィールド: + +- `command` — 実行可能ファイルへの絶対パス、またはプログラムディレクトリが`PATH`に書かれている場合はファイル名。 +- `format` — ファイルの形式。[Formats](../../interfaces/formats.md#formats)で説明されているすべての形式がサポートされています。 +- `pool_size` — プールのサイズ。`pool_size`として0が指定された場合、プールサイズの制限はありません。デフォルト値は`16`です。 +- `command_termination_timeout` — 実行可能スクリプトはメイン読取書込ループを含む必要があります。Dictionaryが破棄された後、パイプは閉じられ、実行可能ファイルはClickHouseが子プロセスへSIGTERMシグナルを送信する前に`command_termination_timeout`秒でシャットダウンすることになります。秒単位で指定します。デフォルト値は10です。オプションのパラメータ。 +- `max_command_execution_time` — データブロックを処理するための最大実行可能スクリプトコマンド実行時間。秒単位で指定します。デフォルト値は10です。オプションのパラメータ。 +- `command_read_timeout` - コマンドstdoutからデータを読み取るタイムアウトをミリ秒単位で指定します。デフォルト値は10000です。オプションのパラメータ。 +- `command_write_timeout` - コマンドstdinにデータを書き込むタイムアウトをミリ秒単位で指定します。デフォルト値は10000です。オプションのパラメータ。 +- `implicit_key` — 実行可能ソースファイルは値のみを返すことができ、要求されたキーとの対応は、結果内の行の順序によって暗黙的に決定されます。デフォルト値はfalseです。オプションのパラメータ。 +- `execute_direct` - `execute_direct` = `1`の場合、`command`は[user_scripts_path](../../operations/server-configuration-parameters/settings.md#user_scripts_path)で指定されたuser_scriptsフォルダ内で検索されます。追加のスクリプト引数は空白区切りで指定できます。例: `script_name arg1 arg2`。`execute_direct` = `0`の場合、`command`は`bin/sh -c`の引数として渡されます。デフォルト値は`1`です。オプションのパラメータ。 +- `send_chunk_header` - どのようにして行数を処理するデータチャンクに送信するかを制御します。オプション。デフォルト値は`false`です。 + +このDictionaryソースはXML構成でのみ設定できます。DDLを介して実行可能ソースを持つDictionaryを作成することはできません。さもないと、データベースユーザーはClickHouseノードで任意のバイナリを実行することができてしまいます。 + +### HTTP(S) + +HTTP(S)サーバーとの作業は、[Dictionaryがメモリーにどのように保存されているか](#storing-dictionaries-in-memory)に依存します。Dictionaryが`cache`や`complex_key_cache`を使用して保存されている場合、ClickHouseは`POST`メソッドを通じて必要なキーを要求します。 + +設定の例: + +``` xml + + + http://[::1]/os.tsv + TabSeparated + + user + password + + +
    + API-KEY + key +
    +
    +
    + +``` + +または + +``` sql +SOURCE(HTTP( + url 'http://[::1]/os.tsv' + format 'TabSeparated' + credentials(user 'user' password 'password') + headers(header(name 'API-KEY' value 'key')) +)) +``` + +ClickHouseがHTTPSリソースにアクセスするためには、[openSSL](../../operations/server-configuration-parameters/settings.md#openssl)をサーバー構成に設定する必要があります。 + +設定フィールド: + +- `url` – ソースURL。 +- `format` – ファイルの形式。[Formats](../../interfaces/formats.md#formats)で説明されているすべての形式がサポートされています。 +- `credentials` – 基本的なHTTP認証。オプションのパラメータ。 +- `user` – 認証に必要なユーザー名。 +- `password` – 認証に必要なパスワード。 +- `headers` – HTTPリクエストに使用するすべてのカスタムHTTPヘッダエントリ。オプションのパラメータ。 +- `header` – 単一のHTTPヘッダエントリ。 +- `name` – リクエスト送信時に使用する識別子名。 +- `value` – 特定の識別子名に設定された値。 + +DDLコマンド(`CREATE DICTIONARY ...`)を使用してDictionaryを作成すると、HTTP Dictionaryのリモートホストは任意のHTTPサーバーにアクセスしないように`remote_url_allow_hosts`セクションの内容に対してチェックされます。 + +### DBMS + +#### ODBC + +ODBCドライバがある任意のデータベースに接続できます。 + +設定の例: + +``` xml + + + DatabaseName + ShemaName.TableName
    + DSN=some_parameters + SQL_QUERY + SELECT id, value_1, value_2 FROM ShemaName.TableName +
    + +``` + +または + +``` sql +SOURCE(ODBC( + db 'DatabaseName' + table 'SchemaName.TableName' + connection_string 'DSN=some_parameters' + invalidate_query 'SQL_QUERY' + query 'SELECT id, value_1, value_2 FROM db_name.table_name' +)) +``` + +設定フィールド: + +- `db` – データベースの名前。接続文字列内にデータベース名が設定されている場合は省略可能。 +- `table` – テーブルの名前とスキーマ。 +- `connection_string` – 接続文字列。 +- `invalidate_query` – Dictionaryの状態を確認するためのクエリ。オプションのパラメータ。[Refresh dictionary data using LIFETIME](#refreshing-dictionary-data-using-lifetime)セクションを参照してください。 +- `query` – カスタムクエリ。オプションのパラメータ。 + +:::note +`table`と`query`フィールドは一緒に使用できません。そして、`table`または`query`フィールドのどちらか一方を指定する必要があります。 +::: + +ClickHouseはODBCドライバからクォート記号を受け取り、ドライバへのクエリ内で設定をすべてクォートしますので、テーブル名はデータベース内のテーブル名のケースに応じて設定する必要があります。 + +Oracle使用時にはエンコーディングに問題がある場合は、該当する[FAQ](/knowledgebase/oracle-odbc)を参照してください。 + +##### ODBCDictionary機能の既知の脆弱性 + +:::note +ODBCドライバの`Servername`接続パラメータを通じてデータベースに接続する際に置き換えが生じる可能性があります。この場合、`odbc.ini`からの`USERNAME`と`PASSWORD`の値がリモートサーバーに送信されるため、これらが漏洩する可能性があります。 +::: + +**安全でない使用の例** + +PostgreSQL用にunixODBCを設定します。`/etc/odbc.ini`の内容: + +``` text +[gregtest] +Driver = /usr/lib/psqlodbca.so +Servername = localhost +PORT = 5432 +DATABASE = test_db +#OPTION = 3 +USERNAME = test +PASSWORD = test +``` + +この後、次のようなクエリを実行すると + +``` sql +SELECT * FROM odbc('DSN=gregtest;Servername=some-server.com', 'test_db'); +``` + +ODBCドライバは`odbc.ini`の`USERNAME`と`PASSWORD`の値を`some-server.com`に送信します。 + +##### PostgreSQLへの接続例 + +Ubuntu OS。 + +unixODBCとPostgreSQL用ODBCドライバをインストールします: + +``` bash +$ sudo apt-get install -y unixodbc odbcinst odbc-postgresql +``` + +`/etc/odbc.ini`(またはClickHouseを実行しているユーザーでサインインしている場合は`~/.odbc.ini`)を設定します: + +``` text + [DEFAULT] + Driver = myconnection + + [myconnection] + Description = PostgreSQL connection to my_db + Driver = PostgreSQL Unicode + Database = my_db + Servername = 127.0.0.1 + UserName = username + Password = password + Port = 5432 + Protocol = 9.3 + ReadOnly = No + RowVersioning = No + ShowSystemTables = No + ConnSettings = +``` + +ClickHouseのDictionary設定: + +``` xml + + + table_name + + + + + DSN=myconnection + postgresql_table
    +
    + + + 300 + 360 + + + + + + + id + + + some_column + UInt64 + 0 + + +
    +
    +``` + +または + +``` sql +CREATE DICTIONARY table_name ( + id UInt64, + some_column UInt64 DEFAULT 0 +) +PRIMARY KEY id +SOURCE(ODBC(connection_string 'DSN=myconnection' table 'postgresql_table')) +LAYOUT(HASHED()) +LIFETIME(MIN 300 MAX 360) +``` + +ドライバがあるライブラリへのフルパスを指定するために`odbc.ini`を編集する必要があるかもしれません:`DRIVER=/usr/local/lib/psqlodbcw.so`。 + +##### MS SQL Serverへの接続例 + +Ubuntu OS。 + +MS SQLに接続するためのODBCドライバのインストール: + +``` bash +$ sudo apt-get install tdsodbc freetds-bin sqsh +``` + +ドライバの設定: + +```bash + $ cat /etc/freetds/freetds.conf + ... + + [MSSQL] + host = 192.168.56.101 + port = 1433 + tds version = 7.0 + client charset = UTF-8 + + # TDS接続のテスト + $ sqsh -S MSSQL -D database -U user -P password + + + $ cat /etc/odbcinst.ini + + [FreeTDS] + Description = FreeTDS + Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so + Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so + FileUsage = 1 + UsageCount = 5 + + $ cat /etc/odbc.ini + # $ cat ~/.odbc.ini # ClickHouseを実行しているユーザーでサインインしている場合 + + [MSSQL] + Description = FreeTDS + Driver = FreeTDS + Servername = MSSQL + Database = test + UID = test + PWD = test + Port = 1433 + + + # (オプション)ODBC接続のテスト(isqlツールを使用するには[unixodbc](https://packages.debian.org/sid/unixodbc)パッケージをインストールします) + $ isql -v MSSQL "user" "password" +``` + +備考: +- 特定のSQL Serverバージョンでサポートされる最も早いTDSバージョンを確認するには、製品のドキュメントを参照するか、[MS-TDS製品動作](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/135d0ebe-5c4c-4a94-99bf-1811eccb9f4a)を見てください。 + +ClickHouseでのDictionaryの設定: + +``` xml + + + test + + + dict
    + DSN=MSSQL;UID=test;PWD=test +
    + + + + 300 + 360 + + + + + + + + + k + + + s + String + + + +
    +
    +``` + +または + +``` sql +CREATE DICTIONARY test ( + k UInt64, + s String DEFAULT '' +) +PRIMARY KEY k +SOURCE(ODBC(table 'dict' connection_string 'DSN=MSSQL;UID=test;PWD=test')) +LAYOUT(FLAT()) +LIFETIME(MIN 300 MAX 360) +``` + +#### MySQL + +設定の例: + +``` xml + + + 3306 + clickhouse + qwerty + + example01-1 + 1 + + + example01-2 + 1 + + db_name + table_name
    + id=10 + SQL_QUERY + true + SELECT id, value_1, value_2 FROM db_name.table_name +
    + +``` + +または + +``` sql +SOURCE(MYSQL( + port 3306 + user 'clickhouse' + password 'qwerty' + replica(host 'example01-1' priority 1) + replica(host 'example01-2' priority 1) + db 'db_name' + table 'table_name' + where 'id=10' + invalidate_query 'SQL_QUERY' + fail_on_connection_loss 'true' + query 'SELECT id, value_1, value_2 FROM db_name.table_name' +)) +``` + +設定フィールド: + +- `port` – MySQLサーバーのポート。すべてのレプリカに対して、または個別に(``内)指定できます。 + +- `user` – MySQLユーザー名。すべてのレプリカに対して、または個別に(``内)指定できます。 + +- `password` – MySQLユーザーのパスワード。すべてのレプリカに対して、または個別に(``内)指定できます。 + +- `replica` – レプリカ構成のセクション。複数のセクションを作成できます。 + + - `replica/host` – MySQLホスト。 + - `replica/priority` – レプリカの優先度。ClickHouseが接続を試みる際は、優先度に基づいてレプリカを巡回します。数が少ないほど優先度が高くなります。 + +- `db` – データベースの名前。 + +- `table` – テーブルの名前。 + +- `where` – 選択条件。条件の構文はMySQLの`WHERE`句と同じで、たとえば`id > 10 AND id < 20`のようになります。オプションのパラメータ。 + +- `invalidate_query` – Dictionaryの状態を確認するためのクエリ。オプションのパラメータ。[Refresh dictionary data using LIFETIME](#refreshing-dictionary-data-using-lifetime)セクションを参照してください。 + +- `fail_on_connection_loss` – 接続喪失時のサーバーの動作を制御する構成パラメータ。`true`の場合、クライアントとサーバー間の接続が失われた場合に即座に例外がスローされます。`false`の場合、例外がスローされる前にClickHouseサーバーはクエリを3回再試行します。再試行により応答時間が増加することに注意してください。デフォルト値: `false`。 + +- `query` – カスタムクエリ。オプションのパラメータ。 + +:::note +`table`または`where`フィールドは、`query`フィールドと一緒に使用することはできません。そして、`table`または`query`フィールドのどちらか一方を指定する必要があります。 +::: + +:::note +明示的なパラメータ`secure`はありません。SSL接続を確立する際は、セキュリティが必須です。 +::: + +MySQLはローカルホスト上でソケットを介して接続できます。この場合、`host`と`socket`を設定します。 + +設定の例: + +``` xml + + + localhost + /path/to/socket/file.sock + clickhouse + qwerty + db_name + table_name
    + id=10 + SQL_QUERY + true + SELECT id, value_1, value_2 FROM db_name.table_name +
    + +``` + +または + +``` sql +SOURCE(MYSQL( + host 'localhost' + socket '/path/to/socket/file.sock' + user 'clickhouse' + password 'qwerty' + db 'db_name' + table 'table_name' + where 'id=10' + invalidate_query 'SQL_QUERY' + fail_on_connection_loss 'true' + query 'SELECT id, value_1, value_2 FROM db_name.table_name' +)) +``` + +#### ClickHouse + +設定の例: + +``` xml + + + example01-01-1 + 9000 + default + + default + ids
    + id=10 + 1 + SELECT id, value_1, value_2 FROM default.ids +
    + +``` + +または + +``` sql +SOURCE(CLICKHOUSE( + host 'example01-01-1' + port 9000 + user 'default' + password '' + db 'default' + table 'ids' + where 'id=10' + secure 1 + query 'SELECT id, value_1, value_2 FROM default.ids' +)); +``` + +設定フィールド: + +- `host` – ClickHouseホスト。ローカルホストの場合、クエリはネットワークを使用せずに処理されます。フォールトトレランスを向上させるために、[分散テーブル](../../engines/table-engines/special/distributed.md)を作成し、それを後続の設定に入力することができます。 +- `port` – ClickHouseサーバーのポート。 +- `user` – ClickHouseユーザーの名前。 +- `password` – ClickHouseユーザーのパスワード。 +- `db` – データベースの名前。 +- `table` – テーブルの名前。 +- `where` – 選択条件。省略可能です。 +- `invalidate_query` – Dictionaryの状態を確認するためのクエリ。オプションのパラメータ。[Refresh dictionary data using LIFETIME](#refreshing-dictionary-data-using-lifetime)セクションを参照してください。 +- `secure` - 接続にSSLを使用。 +- `query` – カスタムクエリ。オプションのパラメータ。 + +:::note +`table`または`where`フィールドは、`query`フィールドと一緒に使用することはできません。そして、`table`または`query`フィールドのどちらか一方を指定する必要があります。 +::: + +#### MongoDB + +設定の例: + +``` xml + + + localhost + 27017 + + + test + dictionary_source + ssl=true + + +``` + +または + +``` xml + + + mongodb://localhost:27017/test?ssl=true + dictionary_source + + +``` + +または + +``` sql +SOURCE(MONGODB( + host 'localhost' + port 27017 + user '' + password '' + db 'test' + collection 'dictionary_source' + options 'ssl=true' +)) +``` + +設定フィールド: + +- `host` – MongoDBホスト。 +- `port` – MongoDBサーバーのポート。 +- `user` – MongoDBユーザー名。 +- `password` – MongoDBユーザーのパスワード。 +- `db` – データベースの名前。 +- `collection` – コレクションの名前。 +- `options` - MongoDB接続文字列オプション(オプションのパラメータ)。 + +または + +``` sql +SOURCE(MONGODB( + uri 'mongodb://localhost:27017/clickhouse' + collection 'dictionary_source' +)) +``` + +設定フィールド: + +- `uri` - 接続を確立するためのURI。 +- `collection` – コレクションの名前。 + +[エンジンの詳細情報](../../engines/table-engines/integrations/mongodb.md) + + +#### Redis + +設定の例: + +``` xml + + + localhost + 6379 + simple + 0 + + +``` + +または + +``` sql +SOURCE(REDIS( + host 'localhost' + port 6379 + storage_type 'simple' + db_index 0 +)) +``` + +設定フィールド: + +- `host` – Redisホスト。 +- `port` – Redisサーバーのポート。 +- `storage_type` – キーを操作するために使用される内部のRedisストレージ構造。`simple`は単純なソースおよび単一のキーソースにハッシュされたものに、`hash_map`は2つのキーを持つハッシュされたソースに使用されます。範囲指定されたソースや、複雑なキーを持つキャッシュソースはサポートされていません。省略可能、デフォルト値は`simple`です。 +- `db_index` – 特定の数値インデックスのRedis論理データベース。省略可能、デフォルト値は0です。 + +#### Cassandra + +設定の例: + +``` xml + + + localhost + 9042 + username + qwerty123 + database_name + table_name + 1 +``` +```xml +1 +One +"SomeColumn" = 42 +8 +SELECT id, value_1, value_2 FROM database_name.table_name + + +``` + +設定項目: + +- `host` – Cassandraホスト、またはカンマ区切りのホストリスト。 +- `port` – Cassandraサーバーのポート。指定されていない場合はデフォルトポート9042が使用されます。 +- `user` – Cassandraユーザーの名前。 +- `password` – Cassandraユーザーのパスワード。 +- `keyspace` – キースペース(データベース)の名前。 +- `column_family` – カラムファミリー(テーブル)の名前。 +- `allow_filtering` – クラスタリングキーカラムに対する潜在的に高コストな条件を許可するかどうかを示すフラグ。デフォルト値は1です。 +- `partition_key_prefix` – Cassandraテーブルの主キー内のパーティションキーカラムの数。複合キーDictionaryに必要です。Dictionary定義のキーの順序はCassandraと同じでなければなりません。デフォルト値は1(最初のキーはパーティションキーで、他のキーはクラスタリングキー)です。 +- `consistency` – 一貫性レベル。可能な値は:`One`, `Two`, `Three`, `All`, `EachQuorum`, `Quorum`, `LocalQuorum`, `LocalOne`, `Serial`, `LocalSerial`です。デフォルト値は`One`です。 +- `where` – オプションの選択条件。 +- `max_threads` – 複合キーDictionaryで複数のパーティションからデータをロードするために使用する最大スレッド数。 +- `query` – カスタムクエリ。オプションのパラメータ。 + +:::note +`column_family`または`where`フィールドは`query`フィールドと一緒に使用できません。また、`column_family`または`query`のいずれか一方のフィールドを必ず宣言する必要があります。 +::: + +#### PostgreSQL + +設定の例: + +```xml + + + postgresql-hostname + 5432 + clickhouse + qwerty + db_name + table_name
    + id=10 + SQL_QUERY + SELECT id, value_1, value_2 FROM db_name.table_name +
    + +``` + +または + +```sql +SOURCE(POSTGRESQL( + port 5432 + host 'postgresql-hostname' + user 'postgres_user' + password 'postgres_password' + db 'db_name' + table 'table_name' + replica(host 'example01-1' port 5432 priority 1) + replica(host 'example01-2' port 5432 priority 2) + where 'id=10' + invalidate_query 'SQL_QUERY' + query 'SELECT id, value_1, value_2 FROM db_name.table_name' +)) +``` + +設定項目: + +- `host` – PostgreSQLサーバーのホスト。すべてのレプリカに対して、またはそれぞれ個別に指定できます(``内)。 +- `port` – PostgreSQLサーバーのポート。すべてのレプリカに対して、またはそれぞれ個別に指定できます(``内)。 +- `user` – PostgreSQLユーザーの名前。すべてのレプリカに対して、またはそれぞれ個別に指定できます(``内)。 +- `password` – PostgreSQLユーザーのパスワード。すべてのレプリカに対して、またはそれぞれ個別に指定できます(``内)。 +- `replica` – レプリカ設定セクションが複数あります: + - `replica/host` – PostgreSQLホスト。 + - `replica/port` – PostgreSQLポート。 + - `replica/priority` – レプリカの優先順位。接続を試みる際、ClickHouseは優先順位の順にレプリカを試みます。数字が小さいほど、優先順位が高くなります。 +- `db` – データベースの名前。 +- `table` – テーブルの名前。 +- `where` – 選択基準。条件の構文はPostgreSQLの`WHERE`句と同じです。例えば`id > 10 AND id < 20`。オプションのパラメータ。 +- `invalidate_query` – Dictionaryの状態を確認するためのクエリ。オプションのパラメータ。詳細は[Refreshing dictionary data using LIFETIME](#refreshing-dictionary-data-using-lifetime)セクションを参照してください。 +- `query` – カスタムクエリ。オプションのパラメータ。 + +:::note +`table`または`where`フィールドは`query`フィールドと一緒に使用できません。また、`table`または`query`のいずれか一方のフィールドを必ず宣言する必要があります。 +::: + +### Null + +ダミー(空)のDictionaryを作成するために使用できる特別なソースです。このようなDictionaryは、テストや分散テーブルのデータとクエリノードが分離されたセットアップで役立ちます。 + +```sql +CREATE DICTIONARY null_dict ( + id UInt64, + val UInt8, + default_val UInt8 DEFAULT 123, + nullable_val Nullable(UInt8) +) +PRIMARY KEY id +SOURCE(NULL()) +LAYOUT(FLAT()) +LIFETIME(0); +``` + +## Dictionary Key and Fields + + + +`structure`句はクエリ用のDictionaryキーとフィールドを記述します。 + +XMLの記述: + +```xml + + + + Id + + + + + + + ... + + + +``` + +属性は以下の要素で記述されます: + +- `` — キーカラム +- `` — データカラム: 複数の属性を持つことができます。 + +DDLクエリ: + +```sql +CREATE DICTIONARY dict_name ( + Id UInt64, + -- attributes +) +PRIMARY KEY Id +... +``` + +属性はクエリ本文で記述されます: + +- `PRIMARY KEY` — キーカラム +- `AttrName AttrType` — データカラム。複数の属性を持つことができます。 + +## Key + +ClickHouseは以下のタイプのキーをサポートします: + +- 数値キー。`UInt64`。``タグまたは`PRIMARY KEY`キーワードで定義されます。 +- 複合キー。異なるタイプの値の集合。``タグまたは`PRIMARY KEY`キーワードで定義されます。 + +XML構造には``または``のいずれかを含めることができます。DDLクエリには`PRIMARY KEY`が1つ含まれている必要があります。 + +:::note +キーを属性として記述してはいけません。 +::: + +### Numeric Key + +タイプ: `UInt64`。 + +設定例: + +```xml + + Id + +``` + +設定項目: + +- `name` – キーを持つカラムの名前。 + +DDLクエリの例: + +```sql +CREATE DICTIONARY ( + Id UInt64, + ... +) +PRIMARY KEY Id +... +``` + +- `PRIMARY KEY` – キーを持つカラムの名前。 + +### Composite Key + +キーはあらゆるタイプのフィールドの`tuple`にすることができます。この場合の[レイアウト](#storing-dictionaries-in-memory)は`complex_key_hashed`または`complex_key_cache`である必要があります。 + +:::tip +複合キーは単一要素で構成することもできます。これにより、例えば文字列をキーとして使用することが可能になります。 +::: + +キー構造は``要素で設定されます。キー・フィールドはDictionaryの[attributes](#dictionary-key-and-fields)と同じ形式で指定されます。例: + +```xml + + + + field1 + String + + + field2 + UInt32 + + ... + +... +``` + +または + +```sql +CREATE DICTIONARY ( + field1 String, + field2 String + ... +) +PRIMARY KEY field1, field2 +... +``` + +`dictGet*`関数に対するクエリでは、キーとしてタプルが渡されます。例: `dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2))`。 + +## Attributes + +設定例: + +```xml + + ... + + Name + ClickHouseDataType + + rand64() + true + true + true + + +``` + +または + +```sql +CREATE DICTIONARY somename ( + Name ClickHouseDataType DEFAULT '' EXPRESSION rand64() HIERARCHICAL INJECTIVE IS_OBJECT_ID +) +``` + +設定項目: + +| タグ | 説明 | 必須項目 | +|------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| +| `name` | カラム名。 | はい | +| `type` | ClickHouseデータタイプ: [UInt8](../../sql-reference/data-types/int-uint.md), [UInt16](../../sql-reference/data-types/int-uint.md), [UInt32](../../sql-reference/data-types/int-uint.md), [UInt64](../../sql-reference/data-types/int-uint.md), [Int8](../../sql-reference/data-types/int-uint.md), [Int16](../../sql-reference/data-types/int-uint.md), [Int32](../../sql-reference/data-types/int-uint.md), [Int64](../../sql-reference/data-types/int-uint.md), [Float32](../../sql-reference/data-types/float.md), [Float64](../../sql-reference/data-types/float.md), [UUID](../../sql-reference/data-types/uuid.md), [Decimal32](../../sql-reference/data-types/decimal.md), [Decimal64](../../sql-reference/data-types/decimal.md), [Decimal128](../../sql-reference/data-types/decimal.md), [Decimal256](../../sql-reference/data-types/decimal.md),[Date](../../sql-reference/data-types/date.md), [Date32](../../sql-reference/data-types/date32.md), [DateTime](../../sql-reference/data-types/datetime.md), [DateTime64](../../sql-reference/data-types/datetime64.md), [String](../../sql-reference/data-types/string.md), [Array](../../sql-reference/data-types/array.md)。
    ClickHouseはDictionaryから指定されたデータタイプに値をキャストしようとします。例えば、MySQLではフィールドは`TEXT`、`VARCHAR`、または`BLOB`であるかもしれませんが、ClickHouseでは`String`としてアップロードできます。
    [Nullable](../../sql-reference/data-types/nullable.md)は現在、[Flat](#flat), [Hashed](#hashed), [ComplexKeyHashed](#complex_key_hashed), [Direct](#direct), [ComplexKeyDirect](#complex_key_direct), [RangeHashed](#range_hashed), Polygon, [Cache](#cache), [ComplexKeyCache](#complex_key_cache), [SSDCache](#ssd_cache), [SSDComplexKeyCache](#complex_key_ssd_cache) Dictionaryでサポートされています。[IPTrie](#ip_trie) Dictionaryでは `Nullable` タイプはサポートされていません。 | はい | +| `null_value` | 存在しない要素のデフォルト値。
    例では空の文字列です。[NULL](../syntax.md#null) 値は`Nullable`タイプのみで使用可能です(上記のタイプの説明を参照)。 | はい | +| `expression` | ClickHouseが値に対して実行する[式](../../sql-reference/syntax.md#expressions)。
    式はリモートSQLデータベースのカラム名であることができます。したがって、リモートカラムのエイリアスを作成するために使用できます。

    デフォルト値: 式なし。 | いいえ | +| `hierarchical` | `true`の場合、属性は現在のキーの親キーの値を含みます。[階層Dictionary](#hierarchical-dictionaries)を参照してください。

    デフォルト値: `false`。 | いいえ | +| `injective` | `id -> attribute`の写像が[単射](https://en.wikipedia.org/wiki/Injective_function)であるかどうかを示すフラグ。
    `true`の場合、ClickHouseは`GROUP BY`句の後に単射のDictionaryへの要求を自動的に配置できます。通常、これによりこのような要求の量が大幅に削減されます。

    デフォルト値: `false`。 | いいえ | +| `is_object_id` | クエリが`ObjectID`によるMongoDBドキュメントの実行であるかどうかを示すフラグ。

    デフォルト値: `false`。 + +## 階層Dictionary + +ClickHouseは[数値キー](#numeric-key)を持つ階層Dictionaryをサポートします。 + +以下のような階層構造を考えてみましょう: + +```text +0 (共通の親) +│ +├── 1 (ロシア) +│ │ +│ └── 2 (モスクワ) +│ │ +│ └── 3 (中心) +│ +└── 4 (イギリス) + │ + └── 5 (ロンドン) +``` + +この階層は次のDictionaryテーブルで表現できます。 + +| region_id | parent_region | region_name | +|-----------|---------------|--------------| +| 1 | 0 | ロシア | +| 2 | 1 | モスクワ | +| 3 | 2 | 中心 | +| 4 | 0 | イギリス | +| 5 | 4 | ロンドン | + +このテーブルには、`parent_region`カラムがあり、それは要素の最も近い親のキーを含んでいます。 + +ClickHouseは外部Dictionary属性に対して階層プロパティをサポートしています。このプロパティを使用すると、上記のように階層Dictionaryを設定できます。 + +[dictGetHierarchy](../../sql-reference/functions/ext-dict-functions.md#dictgethierarchy)関数を使用すると、要素の親チェーンを取得できます。 + +我々の例では、Dictionaryの構造は次のようになります: + +```xml + + + + region_id + + + + parent_region + UInt64 + 0 + true + + + + region_name + String + + + + + +``` + +## ポリゴンDictionary {#polygon-dictionaries} + +ポリゴンDictionaryは、指定された点を含むポリゴンの検索を効率的に行うことができます。 +例えば、地理座標で都市地域を定義することができます。 + +ポリゴンDictionary設定の例: + + + +```xml + + + + + key + Array(Array(Array(Array(Float64)))) + + + + + name + String + + + + + value + UInt64 + 0 + + + + + + 1 + + + + ... + +``` + +対応する[DDLクエリ](../../sql-reference/statements/create/dictionary.md#create-dictionary-query): + +```sql +CREATE DICTIONARY polygon_dict_name ( + key Array(Array(Array(Array(Float64)))), + name String, + value UInt64 +) +PRIMARY KEY key +LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1)) +... +``` + +ポリゴンDictionaryを設定する際、キーは以下のタイプのいずれかでなければなりません: + +- 単純なポリゴン: 点の配列。 +- マルチポリゴン: ポリゴンの配列。各ポリゴンは点の2次元配列です。この配列の最初の要素がポリゴンの外部境界であり、後続の要素はそれから除外される領域を指定します。 + +点は、それぞれの座標を表す配列またはタプルとして指定できます。現在の実装では、2次元点のみがサポートされています。 + +ユーザーは、ClickHouseがサポートするすべてのフォーマットで独自のデータをアップロードできます。 + +次の3種類の[インメモリストレージ](#storing-dictionaries-in-memory)が利用可能です: + +- `POLYGON_SIMPLE`: クエリごとにすべてのポリゴンを線形に通過し、追加のインデックスを使用せずにそれぞれの所属を確認するナイーブな実装です。 + +- `POLYGON_INDEX_EACH`: 地理的地域向けに最適化されていて、ほとんどの場合すばやく所属が確認できるように、各ポリゴンに個別のインデックスが構築されます。 +また、エリアにグリッドが重ねられ、候補となるポリゴンの数を大幅に絞り込みます。 +グリッドは、セルを16等分に再帰的に分割することで作成され、2つのパラメータで設定されます。 +分割は、再帰の深さが`MAX_DEPTH`に達するか、セルが横断するポリゴンの数が`MIN_INTERSECTIONS`に達すると終了します。 +クエリに応答するには、対応するセルの中に保存されているポリゴンのインデックスにアクセスされます。 + +- `POLYGON_INDEX_CELL`: 上記のグリッドも作成されます。同じオプションが利用可能です。各シートセルに対して、その中に入るポリゴン片すべてに対してインデックスが構築されており、クエリに迅速に応答できます。 + +- `POLYGON`: `POLYGON_INDEX_CELL`の別名です。 + +Dictionaryクエリは、Dictionaryを操作するための標準的な[関数](../../sql-reference/functions/ext-dict-functions.md)を通じて行われます。 +重要な違いは、ここではキーポイントが指定され、指定された点を含む最小のポリゴンが見つかる点です。 + +**例** + +上で定義されたDictionaryと連動する例: + +```sql +CREATE TABLE points ( + x Float64, + y Float64 +) +... +SELECT tuple(x, y) AS key, dictGet(dict_name, 'name', key), dictGet(dict_name, 'value', key) FROM points ORDER BY x, y; +``` + +最後のコマンドを実行した結果、`points`テーブル内の各ポイントに対して、それを含む最小領域ポリゴンが見つかり、要求された属性が出力されます。 + +**例** + +ポリゴンDictionaryからSELECTクエリを介してカラムを読み取ることができます。Dictionary設定または対応するDDLクエリで`store_polygon_key_column = 1`をオンにしてください。 + +クエリ: + +```sql +CREATE TABLE polygons_test_table +( + key Array(Array(Array(Tuple(Float64, Float64)))), + name String +) ENGINE = TinyLog; + +INSERT INTO polygons_test_table VALUES ([[[(3, 1), (0, 1), (0, -1), (3, -1)]]], 'Value'); + +CREATE DICTIONARY polygons_test_dictionary +( + key Array(Array(Array(Tuple(Float64, Float64)))), + name String +) +PRIMARY KEY key +SOURCE(CLICKHOUSE(TABLE 'polygons_test_table')) +LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1)) +LIFETIME(0); + +SELECT * FROM polygons_test_dictionary; +``` + +結果: + +```text +┌─key─────────────────────────────┬─name──┐ +│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │ +└─────────────────────────────────┴───────┘ +``` + +## 正規表現ツリーDictionary {#regexp-tree-dictionary} + +正規表現ツリーDictionaryは、正規表現のツリーを使ってキーから属性へのマッピングを表現する特別なタイプのDictionaryです。例えば、[ユーザーエージェント](https://en.wikipedia.org/wiki/User_agent)文字列の解析のようなユースケースは、正規表現ツリーDictionaryで優雅に表現できます。 + +### ClickHouse Open-Sourceでの正規表現ツリーDictionaryの使用 +正規表現ツリーディクショナリは、ClickHouseオープンソースで、正規表現ツリーを含むYAMLファイルのパスを提供する`YAMLRegExpTree`ソースを使用して定義されます。 + +```sql +CREATE DICTIONARY regexp_dict +( + regexp String, + name String, + version String +) +PRIMARY KEY(regexp) +SOURCE(YAMLRegExpTree(PATH '/var/lib/clickhouse/user_files/regexp_tree.yaml')) +LAYOUT(regexp_tree) +... +``` + +ディクショナリソース`YAMLRegExpTree`は正規表現ツリーの構造を表します。例えば: + +```yaml +- regexp: 'Linux/(\d+[\.\d]*).+tlinux' + name: 'TencentOS' + version: '\1' + +- regexp: '\d+/tclwebkit(?:\d+[\.\d]*)' + name: 'Android' + versions: + - regexp: '33/tclwebkit' + version: '13' + - regexp: '3[12]/tclwebkit' + version: '12' + - regexp: '30/tclwebkit' + version: '11' + - regexp: '29/tclwebkit' + version: '10' +``` + +この設定は正規表現ツリーノードのリストで構成されています。各ノードは以下の構造を持ちます: + +- **regexp**: ノードの正規表現。 +- **attributes**: ユーザー定義ディクショナリアトリビュートのリスト。この例では、2つのアトリビュート`name`と`version`があります。最初のノードは両方のアトリビュートを定義しています。2番目のノードはアトリビュート`name`のみを定義しています。アトリビュート`version`は2番目のノードの子ノードから提供されます。 + - アトリビュートの値は、**バックリファレンス**を含むことがあり、正規表現のキャプチャグループを参照します。この例では、最初のノードのアトリビュート`version`の値は、正規表現のキャプチャグループ`(\d+[\.\d]*)`へのバックリファレンス`\1`を含んでいます。バックリファレンス番号は1から9の範囲で、`$1`または`\1`(番号1の場合)として書かれます。バックリファレンスはクエリ実行中のマッチしたキャプチャグループで置き換えられます。 +- **child nodes**: 正規表現ツリーノードの子のリストで、それぞれが独自のアトリビュートと(可能な限り)子ノードを持ちます。文字列のマッチングは深さ優先で進行します。もし文字列が正規表現ノードと一致すると、ディクショナリはノードの子ノードとも一致するか確認します。その場合、最も深くマッチしたノードのアトリビュートが割り当てられます。子ノードのアトリビュートは親ノードの同名アトリビュートを上書きします。YAMLファイル内の子ノード名は任意で、上記の例では`versions`とされています。 + +正規表現ツリーディクショナリは`dictGet`、`dictGetOrDefault`、および`dictGetAll`関数を使用してアクセスのみ許可されます。 + +例: + +```sql +SELECT dictGet('regexp_dict', ('name', 'version'), '31/tclwebkit1024'); +``` + +結果: + +```text +┌─dictGet('regexp_dict', ('name', 'version'), '31/tclwebkit1024')─┐ +│ ('Android','12') │ +└─────────────────────────────────────────────────────────────────┘ +``` + +この場合、最初にトップレイヤーの2番目のノードの正規表現`\d+/tclwebkit(?:\d+[\.\d]*)`と一致します。ディクショナリはさらに子ノードを調べ、文字列が`3[12]/tclwebkit`と一致することも確認します。その結果、アトリビュート`name`の値は`Android`(最初のレイヤーで定義)で、アトリビュート`version`の値は`12`(子ノードで定義)となります。 + +強力なYAML設定ファイルを使用することで、正規表現ツリーディクショナリをユーザーエージェント文字列パーサーとして使用できます。私たちは[uap-core](https://github.com/ua-parser/uap-core)をサポートしており、機能テスト[02504_regexp_dictionary_ua_parser](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/02504_regexp_dictionary_ua_parser.sh)でその使用方法を示しています。 + +#### アトリビュート値の収集 + +時には、リーフノードの値だけでなく、マッチした複数の正規表現から値を返すことが有益です。このような場合には、特殊化された[`dictGetAll`](../../sql-reference/functions/ext-dict-functions.md#dictgetall)関数を使用できます。ノードに型`T`のアトリビュート値がある場合、`dictGetAll`は0またはそれ以上の値を含む`Array(T)`を返します。 + +デフォルトでは、キーごとに返されるマッチ数は制限されません。制限はオプションの第4引数として`dictGetAll`に渡すことができます。配列は_トポロジカル順_で埋められ、子ノードが親ノードの前に来て、兄弟ノードはソース内の順序に従います。 + +例: + +```sql +CREATE DICTIONARY regexp_dict +( + regexp String, + tag String, + topological_index Int64, + captured Nullable(String), + parent String +) +PRIMARY KEY(regexp) +SOURCE(YAMLRegExpTree(PATH '/var/lib/clickhouse/user_files/regexp_tree.yaml')) +LAYOUT(regexp_tree) +LIFETIME(0) +``` + +```yaml +# /var/lib/clickhouse/user_files/regexp_tree.yaml +- regexp: 'clickhouse\.com' + tag: 'ClickHouse' + topological_index: 1 + paths: + - regexp: 'clickhouse\.com/docs(.*)' + tag: 'ClickHouse Documentation' + topological_index: 0 + captured: '\1' + parent: 'ClickHouse' + +- regexp: '/docs(/|$)' + tag: 'Documentation' + topological_index: 2 + +- regexp: 'github.com' + tag: 'GitHub' + topological_index: 3 + captured: 'NULL' +``` + +```sql +CREATE TABLE urls (url String) ENGINE=MergeTree ORDER BY url; +INSERT INTO urls VALUES ('clickhouse.com'), ('clickhouse.com/docs/ja'), ('github.com/clickhouse/tree/master/docs'); +SELECT url, dictGetAll('regexp_dict', ('tag', 'topological_index', 'captured', 'parent'), url, 2) FROM urls; +``` + +結果: + +```text +┌─url────────────────────────────────────┬─dictGetAll('regexp_dict', ('tag', 'topological_index', 'captured', 'parent'), url, 2)─┐ +│ clickhouse.com │ (['ClickHouse'],[1],[],[]) │ +│ clickhouse.com/docs/ja │ (['ClickHouse Documentation','ClickHouse'],[0,1],['/en'],['ClickHouse']) │ +│ github.com/clickhouse/tree/master/docs │ (['Documentation','GitHub'],[2,3],[NULL],[]) │ +└────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┘ +``` + +#### マッチングモード + +パターンマッチングの動作は特定のディクショナリ設定で変更できます: +- `regexp_dict_flag_case_insensitive`: 大文字小文字を区別しないマッチングを使用(デフォルトは`false`)。個々の表現で`(?i)`と`(?-i)`で上書き可能。 +- `regexp_dict_flag_dotall`: `.`を改行文字とマッチさせる(デフォルトは`false`)。 + +### ClickHouse Cloudでの正規表現ツリーディクショナリの使用 + +上記の`YAMLRegExpTree`ソースはClickHouseオープンソースでは動作しますが、ClickHouse Cloudでは動作しません。ClickHouse Cloudで正規表現ツリーディクショナリを使用するには、まずローカルのClickHouseオープンソースでYAMLファイルから正規表現ツリーディクショナリを作成し、`dictionaries`テーブル関数と[INTO OUTFILE](../statements/select/into-outfile.md)句を使用してこのディクショナリをCSVファイルにダンプします。 + +```sql +SELECT * FROM dictionary(regexp_dict) INTO OUTFILE('regexp_dict.csv') +``` + +csvファイルの内容は以下の通りです: + +```text +1,0,"Linux/(\d+[\.\d]*).+tlinux","['version','name']","['\\1','TencentOS']" +2,0,"(\d+)/tclwebkit(\d+[\.\d]*)","['comment','version','name']","['test $1 and $2','$1','Android']" +3,2,"33/tclwebkit","['version']","['13']" +4,2,"3[12]/tclwebkit","['version']","['12']" +5,2,"30/tclwebkit","['version']","['11']" +6,2,"29/tclwebkit","['version']","['10']" +``` + +ダンプされたファイルのスキーマは次の通りです: + +- `id UInt64`: RegexpTreeノードのID。 +- `parent_id UInt64`: ノードの親のID。 +- `regexp String`: 正規表現文字列。 +- `keys Array(String)`: ユーザー定義属性の名前。 +- `values Array(String)`: ユーザー定義属性の値。 + +ClickHouse Cloudでディクショナリを作成するには、まず以下のテーブル構造で`regexp_dictionary_source_table`というテーブルを作成します: + +```sql +CREATE TABLE regexp_dictionary_source_table +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; +``` + +その後、ローカルCSVを以下のコマンドで更新します: + +```bash +clickhouse client \ + --host MY_HOST \ + --secure \ + --password MY_PASSWORD \ + --query " + INSERT INTO regexp_dictionary_source_table + SELECT * FROM input ('id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') + FORMAT CSV" < regexp_dict.csv +``` + +さらに詳しくは[ローカルファイルの挿入方法](https://clickhouse.com/docs/ja/integrations/data-ingestion/insert-local-files)をご覧ください。ソーステーブルを初期化後、テーブルソースで正規表現ツリーを作成できます: + +``` sql +CREATE DICTIONARY regexp_dict +( + regexp String, + name String, + version String +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_dictionary_source_table')) +LIFETIME(0) +LAYOUT(regexp_tree); +``` + +## 埋め込みディクショナリ + + + +ClickHouseはジオベースを操作するための組み込み機能を持っています。 + +これにより、以下が可能です: + +- 地域のIDを使用して、希望する言語でその名前を取得。 +- 地域のIDを使用して、市、地域、連邦地区、国、大陸のIDを取得。 +- ある地域が別の地域の一部であるかどうかを確認。 +- 親地域のチェーンを取得。 + +すべての関数は「トランスロカリティ」をサポートしており、地域の所有に関する異なる視点を同時に使用する能力があります。詳細は、「web analyticsディクショナリを操作するための関数」セクションを参照してください。 + +内部ディクショナリはデフォルトパッケージでは無効です。 +それらを有効にするには、サーバー構成ファイルで`path_to_regions_hierarchy_file`および`path_to_regions_names_files`のパラメータをコメントアウトします。 + +ジオベースはテキストファイルから読み込まれます。 + +`regions_hierarchy*.txt`ファイルを`path_to_regions_hierarchy_file`ディレクトリに配置します。この構成パラメータにはデフォルトの地域階層である`regions_hierarchy.txt`ファイルへのパスを含める必要があり、他のファイル(`regions_hierarchy_ua.txt`)は同じディレクトリに配置する必要があります。 + +`regions_names_*.txt`ファイルを`path_to_regions_names_files`ディレクトリに配置します。 + +これらのファイルを自分で作成することもできます。ファイル形式は以下の通りです: + +`regions_hierarchy*.txt`: TabSeparated(ヘッダーなし)、カラム: + +- 地域ID(`UInt32`) +- 親地域ID(`UInt32`) +- 地域タイプ(`UInt8`):1 - 大陸、3 - 国、4 - 連邦地区、5 - 地域、6 - 市; 他のタイプには値がない +- 人口(`UInt32`)— オプションカラム + +`regions_names_*.txt`: TabSeparated(ヘッダーなし)、カラム: + +- 地域ID(`UInt32`) +- 地域名(`String`)— タブや改行、エスケープされたものも含めることができません。 + +RAMに格納するためにフラットな配列が使用されます。このため、IDは100万を超えないようにすべきです。 + +ディクショナリはサーバーを再起動せずに更新できます。ただし、利用可能なディクショナリのセットは更新されません。 +更新のためにファイルの変更時間がチェックされます。ファイルが変更された場合、ディクショナリが更新されます。 +変更チェックの間隔は`builtin_dictionaries_reload_interval`パラメータで設定されます。 +ディクショナリの更新(最初の使用での読み込みを除く)はクエリをブロックしません。更新中、クエリは古いバージョンのディクショナリを使用します。更新中にエラーが発生した場合、エラーはサーバーログに記録され、クエリは古いバージョンのディクショナリを使用して続行します。 + +ジオベースを用いてディクショナリを定期的に更新することが推奨されます。更新中、新しいファイルを生成し、それらを別の場所に書き込みます。すべて準備が整ったら、サーバーで使用されるファイルに名前を変更します。 + +OS識別子や検索エンジンの操作のための関数もありますが、使用すべきでありません。 diff --git a/docs/ja/sql-reference/distributed-ddl.md b/docs/ja/sql-reference/distributed-ddl.md new file mode 100644 index 00000000000..cb092a8f837 --- /dev/null +++ b/docs/ja/sql-reference/distributed-ddl.md @@ -0,0 +1,23 @@ +--- +slug: /ja/sql-reference/distributed-ddl +sidebar_position: 3 +sidebar_label: 分散DDL +--- + +# 分散DDLクエリ (ON CLUSTER句) + +デフォルトでは、`CREATE`、`DROP`、`ALTER`、および`RENAME`クエリは、その実行が行われたサーバーのみに影響します。クラスタ設定では、`ON CLUSTER`句を用いて、これらのクエリを分散的に実行することが可能です。 + +例えば、以下のクエリは、`cluster`内の各ホストに`all_hits`という`分散テーブル`を作成します。 + +``` sql +CREATE TABLE IF NOT EXISTS all_hits ON CLUSTER cluster (p Date, i Int32) ENGINE = Distributed(cluster, default, hits) +``` + +これらのクエリを正しく実行するためには、各ホストが同じクラスタ定義を持っている必要があります(設定ファイルの同期を簡略化するためにZooKeeperの代替機能を使用できます)。また、ZooKeeperサーバーへの接続も必要です。 + +クエリのローカルバージョンは、クラスタ内の各ホストで最終的に実行されますが、たとえ一部のホストが現在利用可能でなくても、後で実行されます。 + +:::important +単一ホスト内でのクエリ実行の順序は保証されます。 +::: diff --git a/docs/ja/sql-reference/formats.mdx b/docs/ja/sql-reference/formats.mdx new file mode 100644 index 00000000000..426075b064e --- /dev/null +++ b/docs/ja/sql-reference/formats.mdx @@ -0,0 +1,10 @@ +--- +slug: /ja/sql-reference/formats +sidebar_position: 50 +sidebar_label: 入出力フォーマット +title: 入出力データのフォーマット +--- + +import Content from '@site/docs/ja/interfaces/formats.md'; + + diff --git a/docs/ja/sql-reference/functions/_category_.yml b/docs/ja/sql-reference/functions/_category_.yml new file mode 100644 index 00000000000..a360f1bec3b --- /dev/null +++ b/docs/ja/sql-reference/functions/_category_.yml @@ -0,0 +1,7 @@ +position: 4 +label: 'Functions' +collapsible: true +collapsed: true +link: + type: doc + id: en/sql-reference/functions/index diff --git a/docs/ja/sql-reference/functions/arithmetic-functions.md b/docs/ja/sql-reference/functions/arithmetic-functions.md new file mode 100644 index 00000000000..9afaee3725e --- /dev/null +++ b/docs/ja/sql-reference/functions/arithmetic-functions.md @@ -0,0 +1,533 @@ +--- +slug: /ja/sql-reference/functions/arithmetic-functions +sidebar_position: 5 +sidebar_label: 算術関数 +--- + +# 算術関数 + +算術関数は、`UInt8`、`UInt16`、`UInt32`、`UInt64`、`Int8`、`Int16`、`Int32`、`Int64`、`Float32`、もしくは `Float64` 型の2つのオペランドに対応します。 + +演算を実行する前に、両方のオペランドは結果の型にキャストされます。結果の型は以下のように決定されます(以下の関数のドキュメントで特に指定されていない限り): +- 両方のオペランドが32ビット以内であれば、結果の型のサイズは、より大きいオペランドに続く次に大きい型のサイズとなります(整数サイズの昇格)。例:`UInt8 + UInt16 = UInt32` または `Float32 * Float32 = Float64`。 +- オペランドのうちの1つが64ビット以上であれば、結果の型のサイズは2つのオペランドのうち大きい方のサイズと同じになります。例:`UInt32 + UInt128 = UInt128` または `Float32 * Float64 = Float64`。 +- オペランドのうち1つが符号付きの場合、結果の型も符号付きになります。そうでない場合は符号付きになります。例:`UInt32 * Int32 = Int64`。 + +これらのルールにより、すべての可能な結果を表現できる最小の型が結果の型となることが保証されます。これは値の範囲境界付近でオーバーフローのリスクを伴いますが、64ビットのネイティブ整数幅を使用して計算が迅速に行われることを保証します。この挙動は、最大整数型として64ビット整数(BIGINT)を提供する多くの他のデータベースとの互換性も保証します。 + +例: + +``` sql +SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0) +``` + +``` text +┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐ +│ UInt8 │ UInt16 │ UInt32 │ UInt64 │ +└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘ +``` + +オーバーフローはC++と同様に生成されます。 + +## plus + +2つの値 `a` と `b` の合計を計算します。 + +**構文** + +```sql +plus(a, b) +``` + +整数と日付または時間付き日付を加算することも可能です。前者の操作は日付の日数を増加させ、後者の操作は時間付き日付の秒数を増加させます。 + +エイリアス: `a + b` (演算子) + +## minus + +2つの値 `a` と `b` の差を計算します。結果は常に符号付きです。 + +`plus` と同様に、整数から日付または時間付き日付を引くことが可能です。 + +**構文** + +```sql +minus(a, b) +``` + +エイリアス: `a - b` (演算子) + +## multiply + +2つの値 `a` と `b` の積を計算します。 + +**構文** + +```sql +multiply(a, b) +``` + +エイリアス: `a * b` (演算子) + +## divide + +2つの値 `a` と `b` の商を計算します。結果の型は常に [Float64](../data-types/float.md) です。整数除算は `intDiv` 関数で提供されます。 + +ゼロで割ると `inf`、`-inf`、または `nan` を返します。 + +**構文** + +```sql +divide(a, b) +``` + +エイリアス: `a / b` (演算子) + +## intDiv + +2つの値 `a` と `b` の整数除算を行います。すなわち、商を次に小さい整数に切り下げます。 + +結果は被除数(最初のパラメータ)と同じ幅です。 + +ゼロで割るとき、商が被除数の範囲に収まらないとき、または最小の負の数を-1で割るときは例外が発生します。 + +**構文** + +```sql +intDiv(a, b) +``` + +**例** + +クエリ: + +```sql +SELECT + intDiv(toFloat64(1), 0.001) AS res, + toTypeName(res) +``` + +```response +┌──res─┬─toTypeName(intDiv(toFloat64(1), 0.001))─┐ +│ 1000 │ Int64 │ +└──────┴─────────────────────────────────────────┘ +``` + +```sql +SELECT + intDiv(1, 0.001) AS res, + toTypeName(res) +``` + +```response +Received exception from server (version 23.2.1): +Code: 153. DB::Exception: Received from localhost:9000. DB::Exception: Cannot perform integer division, because it will produce infinite or too large number: While processing intDiv(1, 0.001) AS res, toTypeName(res). (ILLEGAL_DIVISION) +``` + +## intDivOrZero + +`intDiv` と同様ですが、ゼロで割る場合や最小の負の数を-1で割る場合はゼロを返します。 + +**構文** + +```sql +intDivOrZero(a, b) +``` + +## isFinite + +Float32 または Float64 引数が無限でなく NaN でもない場合に1を返します。それ以外の場合、この関数は0を返します。 + +**構文** + +```sql +isFinite(x) +``` + +## isInfinite + +Float32 または Float64 引数が無限である場合に1を返します。それ以外の場合、この関数は0を返します。NaN に対しては0が返されることに注意してください。 + +**構文** + +```sql +isInfinite(x) +``` + +## ifNotFinite + +浮動小数点の値が有限かどうかをチェックします。 + +**構文** + +```sql +ifNotFinite(x,y) +``` + +**引数** + +- `x` — 無限かどうかをチェックする値。[Float\*](../data-types/float.md)。 +- `y` — フォールバック値。[Float\*](../data-types/float.md)。 + +**返される値** + +- `x` が有限なら `x`。 +- `x` が有限でなければ `y`。 + +**例** + +クエリ: + + SELECT 1/0 as infimum, ifNotFinite(infimum,42) + +結果: + + ┌─infimum─┬─ifNotFinite(divide(1, 0), 42)─┐ + │ inf │ 42 │ + └─────────┴───────────────────────────────┘ + +同様の結果を[三項演算子](../../sql-reference/functions/conditional-functions.md#ternary-operator)を使用して得ることができます: `isFinite(x) ? x : y`。 + +## isNaN + +Float32 と Float64 引数が NaN の場合に1を返し、それ以外の場合には0を返します。 + +**構文** + +```sql +isNaN(x) +``` + +## modulo + +2つの値 `a` と `b` を割った余りを計算します。 + +両方の入力が整数であれば、結果の型は整数です。入力の片方が浮動小数点数であれば、結果の型は [Float64](../data-types/float.md) です。 + +余りは C++ と同様に計算されます。負の数の場合、切り捨て除算が使用されます。 + +ゼロで割る場合や最小の負の数を-1で割る場合は例外が発生します。 + +**構文** + +```sql +modulo(a, b) +``` + +エイリアス: `a % b` (演算子) + +## moduloOrZero + +[modulo](#modulo) と同様ですが、除数がゼロの場合にはゼロを返します。 + +**構文** + +```sql +moduloOrZero(a, b) +``` + +## positiveModulo(a, b) + +[modulo](#modulo) と同様ですが、常に非負の数を返します。 + +この関数は `modulo` より4-5倍遅くなります。 + +**構文** + +```sql +positiveModulo(a, b) +``` + +エイリアス: +- `positive_modulo(a, b)` +- `pmod(a, b)` + +**例** + +クエリ: + +```sql +SELECT positiveModulo(-1, 10) +``` + +結果: + +```result +┌─positiveModulo(-1, 10)─┐ +│ 9 │ +└────────────────────────┘ +``` + +## negate + +値 `a` を反転します。結果は常に符号付きです。 + +**構文** + +```sql +negate(a) +``` + +エイリアス: `-a` + +## abs + +`a` の絶対値を計算します。`a` が符号なし型の場合は何の効果もありません。`a` が符号付き型である場合、符号なし数を返します。 + +**構文** + +```sql +abs(a) +``` + +## gcd + +2つの値 `a` と `b` の最大公約数を返します。 + +ゼロで割る場合や最小の負の数を-1で割る場合は例外が発生します。 + +**構文** + +```sql +gcd(a, b) +``` + +## lcm(a, b) + +2つの値 `a` と `b` の最小公倍数を返します。 + +ゼロで割る場合や最小の負の数を-1で割る場合は例外が発生します。 + +**構文** + +```sql +lcm(a, b) +``` + +## max2 + +2つの値 `a` と `b` のうち大きい方を返します。返される値の型は [Float64](../data-types/float.md) です。 + +**構文** + +```sql +max2(a, b) +``` + +**例** + +クエリ: + +```sql +SELECT max2(-1, 2); +``` + +結果: + +```result +┌─max2(-1, 2)─┐ +│ 2 │ +└─────────────┘ +``` + +## min2 + +2つの値 `a` と `b` のうち小さい方を返します。返される値の型は [Float64](../data-types/float.md) です。 + +**構文** + +```sql +min2(a, b) +``` + +**例** + +クエリ: + +```sql +SELECT min2(-1, 2); +``` + +結果: + +```result +┌─min2(-1, 2)─┐ +│ -1 │ +└─────────────┘ +``` + +## multiplyDecimal + +2つの10進数 `a` と `b` を掛け算します。結果の値の型は [Decimal256](../data-types/decimal.md) です。 + +結果のスケールは `result_scale` によって明示的に指定できます。`result_scale` が指定されない場合、入力値の最大スケールが仮定されます。 + +この関数は通常の `multiply` よりも大幅に遅いです。結果の精度に対する制御が必要ない場合や高速な計算が望ましい場合は、`multiply` の使用を検討してください。 + +**構文** + +```sql +multiplyDecimal(a, b[, result_scale]) +``` + +**引数** + +- `a` — 最初の値。[Decimal](../data-types/decimal.md)。 +- `b` — 2番目の値。[Decimal](../data-types/decimal.md)。 +- `result_scale` — 結果のスケール。[Int/UInt](../data-types/int-uint.md)。 + +**返される値** + +- 与えられたスケールでの乗算の結果。[Decimal256](../data-types/decimal.md)。 + +**例** + +```result +┌─multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)─┐ +│ 25.2 │ +└────────────────────────────────────────────────────────────────┘ +``` + +**通常の乗算に比べた違い:** + +```sql +SELECT toDecimal64(-12.647, 3) * toDecimal32(2.1239, 4); +SELECT toDecimal64(-12.647, 3) as a, toDecimal32(2.1239, 4) as b, multiplyDecimal(a, b); +``` + +結果: + +```result +┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐ +│ -26.8609633 │ +└───────────────────────────────────────────────────────────┘ +┌───────a─┬──────b─┬─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐ +│ -12.647 │ 2.1239 │ -26.8609 │ +└─────────┴────────┴──────────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT + toDecimal64(-12.647987876, 9) AS a, + toDecimal64(123.967645643, 9) AS b, + multiplyDecimal(a, b); + +SELECT + toDecimal64(-12.647987876, 9) AS a, + toDecimal64(123.967645643, 9) AS b, + a * b; +``` + +結果: + +```result +┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐ +│ -12.647987876 │ 123.967645643 │ -1567.941279108 │ +└───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘ + +Received exception from server (version 22.11.1): +Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow: While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW) +``` + +## divideDecimal + +2つの10進数 `a` と `b` を除算します。結果の値の型は [Decimal256](../data-types/decimal.md) です。 + +結果のスケールは `result_scale` によって明示的に指定できます。`result_scale` が指定されない場合、入力値の最大スケールが仮定されます。 + +この関数は通常の `divide` よりも大幅に遅いです。結果の精度に対する制御が必要ない場合や高速な計算が望ましい場合は、`divide` の使用を検討してください。 + +**構文** + +```sql +divideDecimal(a, b[, result_scale]) +``` + +**引数** + +- `a` — 最初の値:[Decimal](../data-types/decimal.md)。 +- `b` — 2番目の値:[Decimal](../data-types/decimal.md)。 +- `result_scale` — 結果のスケール:[Int/UInt](../data-types/int-uint.md)。 + +**返される値** + +- 与えられたスケールでの除算の結果。[Decimal256](../data-types/decimal.md)。 + +**例** + +```result +┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐ +│ -5.7142857142 │ +└──────────────────────────────────────────────────────────────┘ +``` + +**通常の除算に比べた違い:** + +```sql +SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1); +SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); +``` + +結果: + +```result +┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐ +│ -5.7 │ +└──────────────────────────────────────────────────┘ + +┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 5)─┐ +│ -12 │ 2.1 │ -5.7 │ -5.71428 │ +└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT toDecimal64(-12, 0) / toDecimal32(2.1, 1); +SELECT toDecimal64(-12, 0) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5); +``` + +結果: + +```result +DB::Exception: Decimal result's scale is less than argument's one: While processing toDecimal64(-12, 0) / toDecimal32(2.1, 1). (ARGUMENT_OUT_OF_BOUND) + +┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 0), toDecimal32(2.1, 1), 5)─┐ +│ -12 │ 2.1 │ -5.7 │ -5.71428 │ +└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘ +``` + +## byteSwap + +整数のバイトを反転します。すなわち、その[エンディアン](https://en.wikipedia.org/wiki/Endianness)を変更します。 + +**構文** + +```sql +byteSwap(a) +``` + +**例** + +```sql +byteSwap(3351772109) +``` + +結果: + +```result +┌─byteSwap(3351772109)─┐ +│ 3455829959 │ +└──────────────────────┘ +``` + +上記の例は次のようにして導き出せます: +1. 10進数の整数をビッグエンディアン形式の16進数形式に変換します。例: 3351772109 -> C7 C7 FB CD (4バイト) +2. バイトを反転します。例: C7 C7 FB CD -> CD FB C7 C7 +3. 結果をビッグエンディアンを仮定して整数に変換します。例: CD FB C7 C7 -> 3455829959 + +この関数の一つのユースケースはIPv4の反転です: + +```result +┌─toIPv4(byteSwap(toUInt32(toIPv4('205.251.199.199'))))─┐ +│ 199.199.251.205 │ +└───────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/array-functions.md b/docs/ja/sql-reference/functions/array-functions.md new file mode 100644 index 00000000000..bc4c9bef05c --- /dev/null +++ b/docs/ja/sql-reference/functions/array-functions.md @@ -0,0 +1,3106 @@ +--- +slug: /ja/sql-reference/functions/array-functions +sidebar_position: 10 +sidebar_label: Arrays +--- + +# Array Functions + +## empty {#empty} + +入力配列が空であるかをチェックします。 + +**構文** + +``` sql +empty([x]) +``` + +配列は、要素が含まれていない場合に空とみなされます。 + +:::note +[`optimize_functions_to_subcolumns` 設定](../../operations/settings/settings.md#optimize-functions-to-subcolumns) を有効にすることで最適化できます。`optimize_functions_to_subcolumns = 1` の場合、この関数は配列全体のカラムを読み込んで処理するのではなく、[size0](../data-types/array.md#array-size) サブカラムのみを読み込みます。クエリ `SELECT empty(arr) FROM TABLE;` は `SELECT arr.size0 = 0 FROM TABLE;` に変換されます。 +::: + +この関数は、[文字列](string-functions.md#empty)や[UUID](uuid-functions.md#empty)に対しても動作します。 + +**引数** + +- `[x]` — 入力配列。 [Array](../data-types/array.md)。 + +**戻り値** + +- 空の配列には `1`、非空の配列には `0` を返します。 [UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT empty([]); +``` + +結果: + +```text +┌─empty(array())─┐ +│ 1 │ +└────────────────┘ +``` + +## notEmpty {#notempty} + +入力配列が空でないかをチェックします。 + +**構文** + +``` sql +notEmpty([x]) +``` + +配列は、少なくとも1つの要素が含まれている場合に空でないとみなされます。 + +:::note +[optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) 設定を有効にすることで最適化できます。`optimize_functions_to_subcolumns = 1` の場合、この関数は配列全体のカラムを読み込んで処理するのではなく、[size0](../data-types/array.md#array-size) サブカラムのみを読み込みます。クエリ `SELECT notEmpty(arr) FROM table` は `SELECT arr.size0 != 0 FROM TABLE;` に変換されます。 +::: + +この関数は、[文字列](string-functions.md#notempty)や[UUID](uuid-functions.md#notempty)に対しても動作します。 + +**引数** + +- `[x]` — 入力配列。 [Array](../data-types/array.md)。 + +**戻り値** + +- 非空の配列には `1`、空の配列には `0` を返します。 [UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT notEmpty([1,2]); +``` + +結果: + +```text +┌─notEmpty([1, 2])─┐ +│ 1 │ +└──────────────────┘ +``` + +## length + +配列の項目数を返します。 +結果の型は UInt64 です。 +文字列でも動作します。 + +`optimize_functions_to_subcolumns` 設定を有効にすると、配列全体のカラムを読み込んで処理する代わりに、[size0](../data-types/array.md#array-size) サブカラムのみを読み込みます。クエリ `SELECT length(arr) FROM table` は `SELECT arr.size0 FROM TABLE` に変換されます。 + +エイリアス: `OCTET_LENGTH` + +## emptyArrayUInt8 + +空の UInt8 配列を返します。 + +**構文** + +```sql +emptyArrayUInt8() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayUInt8(); +``` + +結果: + +```response +[] +``` + +## emptyArrayUInt16 + +空の UInt16 配列を返します。 + +**構文** + +```sql +emptyArrayUInt16() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayUInt16(); + +``` + +結果: + +```response +[] +``` + +## emptyArrayUInt32 + +空の UInt32 配列を返します。 + +**構文** + +```sql +emptyArrayUInt32() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayUInt32(); +``` + +結果: + +```response +[] +``` + +## emptyArrayUInt64 + +空の UInt64 配列を返します。 + +**構文** + +```sql +emptyArrayUInt64() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayUInt64(); +``` + +結果: + +```response +[] +``` + +## emptyArrayInt8 + +空の Int8 配列を返します。 + +**構文** + +```sql +emptyArrayInt8() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayInt8(); +``` + +結果: + +```response +[] +``` + +## emptyArrayInt16 + +空の Int16 配列を返します。 + +**構文** + +```sql +emptyArrayInt16() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayInt16(); +``` + +結果: + +```response +[] +``` + +## emptyArrayInt32 + +空の Int32 配列を返します。 + +**構文** + +```sql +emptyArrayInt32() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayInt32(); +``` + +結果: + +```response +[] +``` + +## emptyArrayInt64 + +空の Int64 配列を返します。 + +**構文** + +```sql +emptyArrayInt64() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayInt64(); +``` + +結果: + +```response +[] +``` + +## emptyArrayFloat32 + +空の Float32 配列を返します。 + +**構文** + +```sql +emptyArrayFloat32() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayFloat32(); +``` + +結果: + +```response +[] +``` + +## emptyArrayFloat64 + +空の Float64 配列を返します。 + +**構文** + +```sql +emptyArrayFloat64() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayFloat64(); +``` + +結果: + +```response +[] +``` + +## emptyArrayDate + +空の Date 配列を返します。 + +**構文** + +```sql +emptyArrayDate() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayDate(); +``` + +## emptyArrayDateTime + +空の DateTime 配列を返します。 + +**構文** + +```sql +[] +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayDateTime(); +``` + +結果: + +```response +[] +``` + +## emptyArrayString + +空の String 配列を返します。 + +**構文** + +```sql +emptyArrayString() +``` + +**引数** + +なし。 + +**戻り値** + +空の配列。 + +**例** + +クエリ: + +```sql +SELECT emptyArrayString(); +``` + +結果: + +```response +[] +``` + +## emptyArrayToSingle + +空の配列を受け取り、デフォルト値と等しい1要素の配列を返します。 + +## range(end), range(\[start, \] end \[, step\]) + +`start`から`end - 1`までの数値を`step`で増加する配列を返します。サポートされる型は[UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64](../data-types/int-uint.md)です。 + +**構文** + +``` sql +range([start, ] end [, step]) +``` + +**引数** + +- `start` — 配列の最初の要素。`step`を使用する場合は必須です。デフォルト値: 0。 +- `end` — 配列が構築される前の数。必須。 +- `step` — 配列内の各要素間の増加ステップを決定する。オプション。デフォルト値: 1。 + +**戻り値** + +- `start`から`end - 1`までの数値を`step`で増加する配列。 + +**実装の詳細** + +- すべての引数`start`、`end`、`step`は以下のデータ型でなければなりません: `UInt8`, `UInt16`, `UInt32`, `UInt64`,`Int8`, `Int16`, `Int32`, `Int64`。返される配列の要素の型はすべての引数のスーパー型です。 +- クエリが[function_range_max_elements_in_block](../../operations/settings/settings.md#function_range_max_elements_in_block)設定で指定された以上の要素数の配列を返す場合、例外がスローされます。 +- 任意の引数がNullable(Nothing)型の場合、`NULL`を返します。任意の引数がNull値を持つ場合は例外をスローします(Nullable(T)型)。 + +**例** + +クエリ: + +``` sql +SELECT range(5), range(1, 5), range(1, 5, 2), range(-1, 5, 2); +``` + +結果: + +```txt +┌─range(5)────┬─range(1, 5)─┬─range(1, 5, 2)─┬─range(-1, 5, 2)─┐ +│ [0,1,2,3,4] │ [1,2,3,4] │ [1,3] │ [-1,1,3] │ +└─────────────┴─────────────┴────────────────┴─────────────────┘ +``` + +## array(x1, ...), operator \[x1, ...\] + +関数の引数から配列を作成します。 +引数は定数であり、すべての共通の型を持つタイプでなければなりません。どのタイプの配列を作成すべきか不明なため、少なくとも1つの引数を渡す必要があります。つまり、この関数を使用して空の配列を作成することはできません(上記で説明された 'emptyArray\*' 関数を使用してください)。 +‘Array(T)’ 型の結果を返します。ここで ‘T’ は渡された引数の最小共通型です。 + +## arrayWithConstant(length, elem) + +長さ `length` の配列を生成し、定数 `elem` で満たします。 + +## arrayConcat + +引数として渡された配列を結合します。 + +``` sql +arrayConcat(arrays) +``` + +**引数** + +- `arrays` – 任意の数の [Array](../data-types/array.md) 型の引数。 + +**例** + +``` sql +SELECT arrayConcat([1, 2], [3, 4], [5, 6]) AS res +``` + +``` text +┌─res───────────┐ +│ [1,2,3,4,5,6] │ +└───────────────┘ +``` + +## arrayElement(arr, n), operator arr\[n\] + +配列 `arr` のインデックス `n` の要素を取得します。`n` は任意の整数型である必要があります。 +配列のインデックスは1から始まります。 + +負のインデックスもサポートされています。この場合、配列の末尾から対応する要素を選択します。たとえば、`arr[-1]` は配列の最後の項目です。 + +インデックスが配列の範囲外になる場合、非定数配列と定数インデックス0の場合を除いて、デフォルト値(数値の場合は0、文字列の場合は空文字列など)が返されます(この場合、「Array indices are 1-based」というエラーが発生します)。 + +## has(arr, elem) + +`arr` 配列が `elem` 要素を持っているかをチェックします。 +配列に要素がない場合は0、ある場合は1を返します。 + +`NULL`は値として処理されます。 + +``` sql +SELECT has([1, 2, NULL], NULL) +``` + +``` text +┌─has([1, 2, NULL], NULL)─┐ +│ 1 │ +└─────────────────────────┘ +``` + +## arrayElementOrNull(arr, n) + +配列 `arr` のインデックス `n` の要素を取得します。`n` は任意の整数型である必要があります。 +配列のインデックスは1から始まります。 + +負のインデックスもサポートされており、この場合、配列の末尾から対応する要素を選択します。たとえば、`arr[-1]` は配列の最後の項目です。 + +インデックスが配列の範囲外になる場合、デフォルト値の代わりに `NULL` を返します。 + +### 例 + +``` sql +SELECT arrayElementOrNull([1, 2, 3], 2), arrayElementOrNull([1, 2, 3], 4) +``` + +``` text + ┌─arrayElementOrNull([1, 2, 3], 2)─┬─arrayElementOrNull([1, 2, 3], 4)─┐ + │ 2 │ ᴺᵁᴸᴸ │ + └──────────────────────────────────┴──────────────────────────────────┘ +``` + +## hasAll {#hasall} + +ある配列が別の配列の部分集合であるかをチェックします。 + +``` sql +hasAll(set, subset) +``` + +**引数** + +- `set` – 要素のセットを持つ任意のタイプの配列。 +- `subset` – `set`との共通スーパータイプを共有する要素を持つ任意のタイプの配列で、`set` の部分集合であることがテストされるべき要素を含んでいます。 + +**戻り値** + +- `subset` のすべての要素が `set` に含まれている場合は`1`を返します。 +- それ以外の場合は`0`を返します。 + +集合と部分集合の要素が共通スーパータイプを持たない場合、例外 `NO_COMMON_TYPE` が発生します。 + +**特殊特性** + +- 空の配列は任意の配列の部分集合です。 +- `Null`は値として処理されます。 +- 両方の配列における値の順序は関係ありません。 + +**例** + +`SELECT hasAll([], [])` は1を返します。 + +`SELECT hasAll([1, Null], [Null])` は1を返します。 + +`SELECT hasAll([1.0, 2, 3, 4], [1, 3])` は1を返します。 + +`SELECT hasAll(['a', 'b'], ['a'])` は1を返します。 + +`SELECT hasAll([1], ['a'])` は`NO_COMMON_TYPE`例外を発生させます。 + +`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [3, 5]])` は0を返します。 + +## hasAny {#hasany} + +2つの配列がいくつかの要素で交差しているかをチェックします。 + +``` sql +hasAny(array1, array2) +``` + +**引数** + +- `array1` – 要素のセットを持つ任意のタイプの配列。 +- `array2` – `array1`との共通スーパータイプを共有する任意のタイプの配列。 + +**戻り値** + +- `array1` と `array2` の間に少なくとも一つの共通要素がある場合、`1`を返します。 +- それ以外の場合は`0`を返します。 + +`array1` と `array2` の要素が共通スーパータイプを共有しない場合、例外 `NO_COMMON_TYPE` が発生します。 + +**特殊特性** + +- `Null`は値として処理されます。 +- 両方の配列における値の順序は関係ありません。 + +**例** + +`SELECT hasAny([1], [])` は `0` を返します。 + +`SELECT hasAny([Null], [Null, 1])` は `1` を返します。 + +`SELECT hasAny([-128, 1., 512], [1])` は `1` を返します。 + +`SELECT hasAny([[1, 2], [3, 4]], ['a', 'c'])` は `NO_COMMON_TYPE` 例外を発生させます。 + +`SELECT hasAll([[1, 2], [3, 4]], [[1, 2], [1, 2]])` は `1` を返します。 + +## hasSubstr + +array2 の全要素が array1 に同じ順序で現れるかを確認します。したがって、関数は、かつ `array1 = prefix + array2 + suffix` である場合にのみ 1 を返します。 + +``` sql +hasSubstr(array1, array2) +``` + +言い換えれば、関数は`array2`のすべての要素が`array1`に含まれているかをチェックします。この場合、`hasAll` 関数のように、`array1` と `array2` の両方における要素は同じ順序にある必要があります。 + +例: + +- `hasSubstr([1,2,3,4], [2,3])` は1を返しますが、`hasSubstr([1,2,3,4], [3,2])` は`0`を返します。 +- `hasSubstr([1,2,3,4], [1,2,3])` は1を返しますが、`hasSubstr([1,2,3,4], [1,2,4])` は`0`を返します。 + +**引数** + +- `array1` – 要素のセットを持つ任意のタイプの配列。 +- `array2` – 任意のタイプの配列。 + +**戻り値** + +- `array1` が `array2` を含む場合、`1`を返します。 +- それ以外の場合は`0`を返します。 + +`array1` と `array2` の要素が共通スーパータイプを共有しない場合、例外 `NO_COMMON_TYPE` が発生します。 + +**特殊特性** + +- 関数は `array2` が空の場合、`1` を返します。 +- `Null`は値として処理されます。たとえば、`hasSubstr([1, 2, NULL, 3, 4], [2,3])` は `0` を返しますが、`hasSubstr([1, 2, NULL, 3, 4], [2,NULL,3])` は `1` を返します。 +- 両配列の値の順序は重要です。 + +**例** + +`SELECT hasSubstr([], [])` returns 1. + +`SELECT hasSubstr([1, Null], [Null])` returns 1. + +`SELECT hasSubstr([1.0, 2, 3, 4], [1, 3])` returns 0. + +`SELECT hasSubstr(['a', 'b'], ['a'])` returns 1. + +`SELECT hasSubstr(['a', 'b' , 'c'], ['a', 'b'])` returns 1. + +`SELECT hasSubstr(['a', 'b' , 'c'], ['a', 'c'])` returns 0. + +`SELECT hasSubstr([[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4]])` returns 1. + +`SELECT hasSubstr([1, 2, NULL, 3, 4], ['a'])` raises a `NO_COMMON_TYPE` exception. + + +## indexOf(arr, x) + +配列に'x'要素が含まれる場合、その最初のインデックスを返し、そうでない場合は0を返します。 + +例: + +``` sql +SELECT indexOf([1, 3, NULL, NULL], NULL) +``` + +``` text +┌─indexOf([1, 3, NULL, NULL], NULL)─┐ +│ 3 │ +└───────────────────────────────────┘ +``` + +`NULL` に設定された要素は通常の値として扱われます。 + +## arrayCount(\[func,\] arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外の値を返す要素の数を返します。`func` が指定されていない場合、配列内の0以外の要素の数を返します。 + +`arrayCount`は[高次関数](../../sql-reference/functions/index.md#higher-order-functions)です。最初の引数としてラムダ関数を渡すことができます。 + +## arrayDotProduct + +2つの配列のドット積を返します。 + +**構文** + +```sql +arrayDotProduct(vector1, vector2) +``` + +エイリアス: `scalarProduct`, `dotProduct` + +**パラメータ** + +- `vector1`: 最初のベクトル。 [Array](../data-types/array.md) または [Tuple](../data-types/tuple.md) の数値値。 +- `vector2`: 二番目のベクトル。[Array](../data-types/array.md) または [Tuple](../data-types/tuple.md) の数値値。 + +:::note +2つのベクトルのサイズは等しくなければなりません。配列とタプルは混在した要素タイプを含んでいることもあります。 +::: + +**戻り値** + +- 2つのベクトルのドット積。 [Numeric](https://clickhouse.com/docs/ja/native-protocol/columns#numeric-types)。 + +:::note +戻りの型は引数の型によって決まります。配列またはタプルが混在した要素タイプを含む場合、結果の型はスーパータイプです。 +::: + +**例** + +クエリ: + +```sql +SELECT arrayDotProduct([1, 2, 3], [4, 5, 6]) AS res, toTypeName(res); +``` + +結果: + +```response +32 UInt16 +``` + +クエリ: + +```sql +SELECT dotProduct((1::UInt16, 2::UInt8, 3::Float32),(4::Int16, 5::Float32, 6::UInt8)) AS res, toTypeName(res); +``` + +結果: + +```response +32 Float64 +``` + +## countEqual(arr, x) + +配列内のxと等しい要素の数を返します。`arrayCount (elem -> elem = x, arr)`と等価です。 + +`NULL`要素は別の値として扱われます。 + +例: + +``` sql +SELECT countEqual([1, 2, NULL, NULL], NULL) +``` + +``` text +┌─countEqual([1, 2, NULL, NULL], NULL)─┐ +│ 2 │ +└──────────────────────────────────────┘ +``` + +## arrayEnumerate(arr) + +配列\[1, 2, 3, ..., length (arr)\]を返します。 + +この関数は通常、ARRAY JOIN で使用されます。それは ARRAY JOIN を適用した後に各配列に対してちょうど一度何かをカウントすることを可能にします。例: + +``` sql +SELECT + count() AS Reaches, + countIf(num = 1) AS Hits +FROM test.hits +ARRAY JOIN + GoalsReached, + arrayEnumerate(GoalsReached) AS num +WHERE CounterID = 160656 +LIMIT 10 +``` + +``` text +┌─Reaches─┬──Hits─┐ +│ 95606 │ 31406 │ +└─────────┴───────┘ +``` + +この例では、Reaches はコンバージョンの数(ARRAY JOIN を適用した後に受け取った文字列)、Hits はページビューの数(ARRAY JOIN の前の文字列)です。この特定のケースでは、次の簡単な方法で同じ結果を得ることができます: + +``` sql +SELECT + sum(length(GoalsReached)) AS Reaches, + count() AS Hits +FROM test.hits +WHERE (CounterID = 160656) AND notEmpty(GoalsReached) +``` + +``` text +┌─Reaches─┬──Hits─┐ +│ 95606 │ 31406 │ +└─────────┴───────┘ +``` + +この関数は高次関数でも使用できます。例えば、条件に一致する要素の配列インデックスを取得するために使用できます。 + +## arrayEnumerateUniq(arr, ...) + +ソース配列と同じサイズの配列を返し、各要素がその値と同じ別の要素の中で初めて出現する位置を示します。 +例: arrayEnumerateUniq([10, 20, 10, 30]) = [1, 1, 2, 1]。 + +この関数は ARRAY JOIN でネストされたデータ構造と配列要素のさらなる集約を行う際に役立ちます。 +例: + +``` sql +SELECT + Goals.ID AS GoalID, + sum(Sign) AS Reaches, + sumIf(Sign, num = 1) AS Visits +FROM test.visits +ARRAY JOIN + Goals, + arrayEnumerateUniq(Goals.ID) AS num +WHERE CounterID = 160656 +GROUP BY GoalID +ORDER BY Reaches DESC +LIMIT 10 +``` + +``` text +┌──GoalID─┬─Reaches─┬─Visits─┐ +│ 53225 │ 3214 │ 1097 │ +│ 2825062 │ 3188 │ 1097 │ +│ 56600 │ 2803 │ 488 │ +│ 1989037 │ 2401 │ 365 │ +│ 2830064 │ 2396 │ 910 │ +│ 1113562 │ 2372 │ 373 │ +│ 3270895 │ 2262 │ 812 │ +│ 1084657 │ 2262 │ 345 │ +│ 56599 │ 2260 │ 799 │ +│ 3271094 │ 2256 │ 812 │ +└─────────┴─────────┴────────┘ +``` + +この例では、各ゴールIDについて、コンバージョンの数(ネストされたGoalsデータ構造中の各要素が到達したゴールであることを示す)、およびセッションの数が計算されています。ARRAY JOIN を使用しない場合、sum(Sign) としてセッションの数を数えます。しかし、この特定のケースでは、ネストされた Goals 構造によって行が増幅され、これをカウント後に一度行うために、関数 arrayEnumerateUniq(Goals.ID) の値に条件を適用します。 + +The arrayEnumerateUniq function can take multiple arrays of the same size as arguments. In this case, uniqueness is considered for tuples of elements in the same positions in all the arrays. + +``` sql +SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res +``` + +``` text +┌─res───────────┐ +│ [1,2,1,1,2,1] │ +└───────────────┘ +``` + +This is necessary when using ARRAY JOIN with a nested data structure and further aggregation across multiple elements in this structure. + +## arrayEnumerateUniqRanked + +ソース配列と同じサイズの配列を返し、各要素の初めての出現を要素の値と同じ位置の要素において示します。多次元配列を列挙し、配列のどの深さまで見ていくかを指定することができます。 + +**構文** + +```sql +arrayEnumerateUniqRanked(clear_depth, arr, max_array_depth) +``` + +**パラメータ** + +- `clear_depth`: 指定されたレベルで要素を個別に列挙します。`max_arr_depth` 以下の正の整数。 +- `arr`: 列挙される N 次元配列。[Array](../data-types/array.md)。 +- `max_array_depth`: 有効な最大深度。`arr` の深さ以下の正の整数。 + +**例** + +`clear_depth=1`および`max_array_depth=1`では、`arrayEnumerateUniq`で同じ配列を指定した場合と同じ結果を返します。 + +クエリ: + +``` sql +SELECT arrayEnumerateUniqRanked(1, [1,2,1], 1); +``` + +結果: + +``` text +[1,1,2] +``` + +この例では、`arrayEnumerateUniqRanked`を使用して、多次元配列の各要素が同じ値を持つ要素の中で最初に出現する位置を示す配列を取得します。提供された配列の1行目`[1,2,3]`に対して、対応する結果は`[1,1,1]`で、これは`1`,`2`, `3`が初めて発見されたことを示します。提供された配列の2行目`[2,2,1]`に対して、結果の対応する結果は`[2,3,3]`で、`2`が二度目と三度目に出現したこと、`1` が二度目に出現したことを示します。同様に、提供された配列の三行目 `[3]` に対する結果は `[2]` という結果が続きます。それは `3` が二度目に出現したことを示します。 + +クエリ: + +``` sql +SELECT arrayEnumerateUniqRanked(1, [[1,2,3],[2,2,1],[3]], 2); +``` + +結果: + +``` text +[[1,1,1],[2,3,2],[2]] +``` + +`clear_depth=2`に変更すると、各行が別々に列挙されます。 + +クエリ: + +``` sql +SELECT arrayEnumerateUniqRanked(2, [[1,2,3],[2,2,1],[3]], 2); +``` + +結果: + +``` text +[[1,1,1],[1,2,1],[1]] +``` + +## arrayPopBack + +配列から最後の項目を削除します。 + +``` sql +arrayPopBack(array) +``` + +**引数** + +- `array` – 配列。 + +**例** + +``` sql +SELECT arrayPopBack([1, 2, 3]) AS res; +``` + +``` text +┌─res───┐ +│ [1,2] │ +└───────┘ +``` + +## arrayPopFront + +配列から最初の項目を削除します。 + +``` sql +arrayPopFront(array) +``` + +**引数** + +- `array` – 配列。 + +**例** + +``` sql +SELECT arrayPopFront([1, 2, 3]) AS res; +``` + +``` text +┌─res───┐ +│ [2,3] │ +└───────┘ +``` + +## arrayPushBack + +配列の末尾に1つの項目を追加します。 + +``` sql +arrayPushBack(array, single_value) +``` + +**引数** + +- `array` – 配列。 +- `single_value` – 一つの値。配列に数値がある場合は数値のみ、文字列がある場合は文字列のみを追加できます。数値を追加する際、ClickHouseは自動的に`single_value`の型を配列のデータ型に設定します。ClickHouseにおけるデータ型についての詳細は、"[データ型](../data-types/index.md#data_types)"を参照してください。`NULL` を使用することができます。この関数は配列に`NULL`要素を追加し、配列要素の型を`Nullable`に変換します。 + +**例** + +``` sql +SELECT arrayPushBack(['a'], 'b') AS res; +``` + +``` text +┌─res───────┐ +│ ['a','b'] │ +└───────────┘ +``` + +## arrayPushFront + +配列の先頭に1つの要素を追加します。 + +``` sql +arrayPushFront(array, single_value) +``` + +**引数** + +- `array` – 配列。 +- `single_value` – 一つの値。配列に数値がある場合は数値のみ、文字列がある場合は文字列のみを追加できます。数値を追加する際、ClickHouseは自動的に`single_value`の型を配列のデータ型に設定します。ClickHouseにおけるデータ型についての詳細は、"[データ型](../data-types/index.md#data_types)"を参照してください。`NULL` を使用することができます。この関数は配列に`NULL`要素を追加し、配列要素の型を`Nullable`に変換します。 + +**例** + +``` sql +SELECT arrayPushFront(['b'], 'a') AS res; +``` + +``` text +┌─res───────┐ +│ ['a','b'] │ +└───────────┘ +``` + +## arrayResize + +配列の長さを変更します。 + +``` sql +arrayResize(array, size[, extender]) +``` + +**引数:** + +- `array` — 配列。 +- `size` — 配列の必要な長さ。 + - `size` が元の配列のサイズより小さい場合、配列は右から切り捨てられます。 +- `size` が配列の初期サイズより大きい場合、配列は右に`extender`の値または配列要素のデータ型のデフォルト値で拡張されます。 +- `extender` — 配列を拡張するための値。`NULL` を指定できます。 + +**戻り値:** + +長さが `size` の配列。 + +**例** + +``` sql +SELECT arrayResize([1], 3); +``` + +``` text +┌─arrayResize([1], 3)─┐ +│ [1,0,0] │ +└─────────────────────┘ +``` + +``` sql +SELECT arrayResize([1], 3, NULL); +``` + +``` text +┌─arrayResize([1], 3, NULL)─┐ +│ [1,NULL,NULL] │ +└───────────────────────────┘ +``` + +## arraySlice + +配列のスライスを返します。 + +``` sql +arraySlice(array, offset[, length]) +``` + +**引数** + +- `array` – データの配列。 +- `offset` – 配列の端からのインデント。正の値は左側のオフセット、負の値は右側へのインデントを示します。配列項目の番号付けは1から始まります。 +- `length` – 必要なスライスの長さ。負の値を指定すると、関数は開いているスライス `[offset, array_length - length]` を返します。値を省略すると、関数はスライス `[offset, the_end_of_array]` を返します。 + +**例** + +``` sql +SELECT arraySlice([1, 2, NULL, 4, 5], 2, 3) AS res; +``` + +``` text +┌─res────────┐ +│ [2,NULL,4] │ +└────────────┘ +``` + +`NULL` に設定された配列要素は通常の値として扱われます。 + +## arrayShingles + +入力配列の指定された長さの連続するサブ配列からなる "shingles" を生成します。 + +**構文** + +``` sql +arrayShingles(array, length) +``` + +**引数** + +- `array` — 入力配列 [Array](../data-types/array.md)。 +- `length` — 各シングルの長さ。 + +**戻り値** + +- 生成されたシングルの配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayShingles([1,2,3,4], 3) as res; +``` + +結果: + +``` text +┌─res───────────────┐ +│ [[1,2,3],[2,3,4]] │ +└───────────────────┘ +``` + +## arraySort(\[func,\] arr, ...) {#sort} + +`arr` 配列の要素を昇順にソートします。`func` 関数が指定されている場合、配列の要素に適用された `func` 関数の結果によってソート順が決まります。`func` が複数の引数を受け取る場合、`arraySort` 関数には `func` の引数が対応する複数の配列が渡されます。`arraySort` の説明の終わりに詳細な例が示されています。 + +整数値をソートする例: + +``` sql +SELECT arraySort([1, 3, 3, 0]); +``` + +``` text +┌─arraySort([1, 3, 3, 0])─┐ +│ [0,1,3,3] │ +└─────────────────────────┘ +``` + +文字列値をソートする例: + +``` sql +SELECT arraySort(['hello', 'world', '!']); +``` + +``` text +┌─arraySort(['hello', 'world', '!'])─┐ +│ ['!','hello','world'] │ +└────────────────────────────────────┘ +``` + +`NULL`, `NaN` および `Inf` 値のソート順は次のとおりです: + +``` sql +SELECT arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]); +``` + +``` text +┌─arraySort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf])─┐ +│ [-inf,-4,1,2,3,inf,nan,nan,NULL,NULL] │ +└───────────────────────────────────────────────────────────┘ +``` + +- `-Inf` 値は配列の最初に位置します。 +- `NULL` 値は配列の最後に位置します。 +- `NaN` 値は `NULL` の直前に位置します。 +- `Inf` 値は `NaN` の直前に位置します。 + +`arraySort` は[高次の関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。この場合、ラムダ関数の要素に施された結果によってソート順が決まります。 + +以下の例を考えてみましょう: + +``` sql +SELECT arraySort((x) -> -x, [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [3,2,1] │ +└─────────┘ +``` + +ソース配列の各要素に対して、ラムダ関数がソート用のキーを返します。これは、\[1 -> -1, 2 -> -2, 3 -> -3\] です。`arraySort` 関数はキーを昇順でソートするため、結果は \[3, 2, 1\] となります。したがって、`(x) -> -x` ラムダ関数が[降順](#arrayreversesort)のソートを設定します。 + +ラムダ関数は複数の引数を受け取ることができます。この場合、`arraySort` 関数に対して、ラムダ関数の引数が対応する同じ長さの複数の配列を渡す必要があります。結果の配列は最初の入力配列の要素で構成され、次の入力配列の要素がソートキーを指定します。例: + +``` sql +SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; +``` + +``` text +┌─res────────────────┐ +│ ['world', 'hello'] │ +└────────────────────┘ +``` + +ここで、2番目の配列に渡された要素(\[2, 1\])が、ソース配列の対応する要素(\[‘hello’, ‘world’\])に対するソートキーを定義します。つまり、\[‘hello’ -> 2, ‘world’ -> 1\] です。ラムダ関数は `x` を使用しないため、ソース配列の実際の値は結果の順序に影響を与えません。そのため、‘hello’ は結果の2番目の要素になり、‘world’ は最初の要素になります。 + +その他の例を以下に示します。 + +``` sql +SELECT arraySort((x, y) -> y, [0, 1, 2], ['c', 'b', 'a']) as res; +``` + +``` text +┌─res─────┐ +│ [2,1,0] │ +└─────────┘ +``` + +``` sql +SELECT arraySort((x, y) -> -y, [0, 1, 2], [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [2,1,0] │ +└─────────┘ +``` + +:::note +ソート効率を向上させるため、[Schwartzian transform](https://en.wikipedia.org/wiki/Schwartzian_transform)が使用されています。 +::: + +## arrayPartialSort(\[func,\] limit, arr, ...) + +`arraySort` と同様ですが、部分ソートを許可するために追加の `limit` 引数があります。戻り値は元の配列と同じサイズの配列で、範囲 `[1..limit]` の要素は昇順にソートされます。残りの要素 `(limit..N]` には未指定の順序の要素が含まれます。 + +## arrayReverseSort + +`arr` 配列の要素を降順にソートします。`func` 関数が指定されている場合、配列の要素に適用された `func` 関数の結果によって `arr` がソートされ、次にソートされた配列が逆順になります。`func` が複数の引数を受け取る場合、`arrayReverseSort` 関数には `func` の引数が対応する複数の配列が渡されます。`arrayReverseSort` の説明の終わりに詳細な例が示されています。 + +**構文** + +```sql +arrayReverseSort([func,] arr, ...) +``` +整数値をソートする例: + +``` sql +SELECT arrayReverseSort([1, 3, 3, 0]); +``` + +``` text +┌─arrayReverseSort([1, 3, 3, 0])─┐ +│ [3,3,1,0] │ +└────────────────────────────────┘ +``` + +文字列値をソートする例: + +``` sql +SELECT arrayReverseSort(['hello', 'world', '!']); +``` + +``` text +┌─arrayReverseSort(['hello', 'world', '!'])─┐ +│ ['world','hello','!'] │ +└───────────────────────────────────────────┘ +``` + +`NULL`, `NaN` および `Inf` 値のソート順は次のとおりです: + +``` sql +SELECT arrayReverseSort([1, nan, 2, NULL, 3, nan, -4, NULL, inf, -inf]) as res; +``` + +``` text +┌─res───────────────────────────────────┐ +│ [inf,3,2,1,-4,-inf,nan,nan,NULL,NULL] │ +└───────────────────────────────────────┘ +``` + +- `Inf` 値は配列の最初に位置します。 +- `NULL` 値は配列の最後に位置します。 +- `NaN` 値は `NULL` の直前に位置します。 +- `-Inf` 値は `NaN` の直前に位置します。 + +`arrayReverseSort` は[高次の関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。例を以下に示します。 + +``` sql +SELECT arrayReverseSort((x) -> -x, [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [1,2,3] │ +└─────────┘ +``` + +この配列は以下のようにソートされます: + +1. 最初に、ソース配列(\[1, 2, 3\])が配列の要素に適用されたラムダ関数の結果によってソートされます。結果は配列 \[3, 2, 1\] です。 +2. 前のステップで得られた配列を逆順にします。したがって、最終的な結果は \[1, 2, 3\] です。 + +ラムダ関数は複数の引数を受け取ることができます。この場合、`arrayReverseSort` 関数に対して、ラムダ関数の引数が対応する同じ長さの複数の配列を渡す必要があります。結果の配列は最初の入力配列の要素で構成され、次の入力配列の要素がソートキーを指定します。例: + +``` sql +SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res; +``` + +``` text +┌─res───────────────┐ +│ ['hello','world'] │ +└───────────────────┘ +``` + +この例では、配列は以下のようにソートされます: + +1. 最初に、ソース配列(\[‘hello’, ‘world’\])が配列の要素に適用されたラムダ関数の結果によってソートされます。2 番目の配列に渡された要素(\[2, 1\])がソートキーを対応するソース配列の要素に定義します。結果は配列 \[‘world’, ‘hello’\] です。 +2. 前のステップでソートされた配列を逆順にします。したがって、最終的な結果は \[‘hello’, ‘world’\] です。 + +以下に他の例を示します。 + +``` sql +SELECT arrayReverseSort((x, y) -> y, [4, 3, 5], ['a', 'b', 'c']) AS res; +``` + +``` text +┌─res─────┐ +│ [5,3,4] │ +└─────────┘ +``` + +``` sql +SELECT arrayReverseSort((x, y) -> -y, [4, 3, 5], [1, 2, 3]) AS res; +``` + +``` text +┌─res─────┐ +│ [4,3,5] │ +└─────────┘ +``` + +## arrayPartialReverseSort(\[func,\] limit, arr, ...) + +`arrayReverseSort`と同様ですが、部分ソートを許可するために追加の `limit` 引数があります。戻りは元の配列と同じサイズの配列であり、範囲 `[1..limit]` の要素は降順にソートされ、残りの要素は未指定の順序で含まれます。 + +## arrayShuffle + +元の配列と同じサイズの配列を返し、要素がシャッフルされた順序で格納されます。 +各可能な要素の並び替えが出現する確率が等しくなるように要素が並べ替えられます。 + +**構文** + +```sql +arrayShuffle(arr[, seed]) +``` + +**パラメータ** + +- `arr`: 部分的にシャッフルされる配列。[Array](../data-types/array.md)。 +- `seed`(オプション): 乱数生成に使用されるシード。指定されていない場合はランダムなものが使用されます。[UInt または Int](../data-types/int-uint.md)。 + +**戻り値** + +- シャッフルされた要素を持つ配列。 + +**実装の詳細** + +:::note +この関数は定数を具体化しません。 +::: + +**例** + +この例では、`arrayShuffle`を`seed`を指定せずに使用しています。そのため、ランダムに生成されます。 + +クエリ: + +```sql +SELECT arrayShuffle([1, 2, 3, 4]); +``` + +注意: [ClickHouse Fiddle](https://fiddle.clickhouse.com/)を使用する場合、関数のランダムな性質により正確な応答が異なる可能性があります。 + +結果: + +```response +[1,4,2,3] +``` + +この例では、`arrayShuffle`に`seed`が指定されており、安定した結果が生成されます。 + +クエリ: + +```sql +SELECT arrayShuffle([1, 2, 3, 4], 41); +``` + +結果: + +```response +[3,2,1,4] +``` + +## arrayPartialShuffle + +カードの大きさ `N` の入力配列を与えられた場合、範囲 `[1...limit]` の要素がシャッフルされ、残りの要素(範囲 `(limit...n]`) はシャッフルされない配列を返します。 + +**構文** + +```sql +arrayPartialShuffle(arr[, limit[, seed]]) +``` + +**パラメータ** + +- `arr`: 部分的にシャッフルされる配列。[Array](../data-types/array.md)。 +- `limit`(オプション): 要素の交換を制限するための数。[UInt または Int](../data-types/int-uint.md)。 +- `seed`(オプション): 乱数生成に使用されるシード値。指定されていない場合はランダムなものが使用されます。[UInt または Int](../data-types/int-uint.md)。 + +**戻り値** + +- 部分的にシャッフルされた要素を持つ配列。 + +**実装の詳細** + +:::note +この関数は定数を具体化しません。 + +`limit` の値は `[1..N]` 範囲内にある必要があります。この範囲外の値は、完全な [arrayShuffle](#arrayshuffle) を実行するのと同等です。 +::: + +**例** + +注意: [ClickHouse Fiddle](https://fiddle.clickhouse.com/)を使用する場合、関数のランダムな性質により正確な応答が異なる可能性があります。 + +クエリ: + +```sql +SELECT arrayPartialShuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1) +``` + +結果: + +要素の順序は (`[2,3,4,5], [7,8,9,10]`) のままで、シャッフルされた2つの要素 `[1, 6]` を除きます。`seed` が指定されていないため、関数はランダムに選びます。 + +```response +[6,2,3,4,5,1,7,8,9,10] +``` + +この例では、`limit` が `2` に増加し、`seed` 値が指定されています。 + +クエリ: + +```sql +SELECT arrayPartialShuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2); +``` + +要素の順序は (`[4, 5, 6, 7, 8], [10]`) のままで、シャッフルされた4つの要素 `[1, 2, 3, 9]` を除きます。 + +結果: +```response +[3,9,1,4,5,6,7,8,2,10] +``` + +## arrayUniq(arr, ...) + +1つの引数が渡された場合、配列内の異なる要素の数をカウントします。 +複数の引数が渡された場合、複数の配列内の対応する位置の要素の異なる組み合わせの数をカウントします。 + +配列内の一意のアイテムのリストを取得する場合、`arrayReduce('groupUniqArray', arr)`を使用できます。 + +## arrayJoin(arr) + +特別な関数。[「arrayJoin関数」](../../sql-reference/functions/array-join.md#functions_arrayjoin) セクションを参照してください。 + +## arrayDifference + +隣接する配列要素間の差分の配列を計算します。結果配列の最初の要素は0、2番目は`a[1] - a[0]`、3番目は`a[2] - a[1]` などです。結果配列の要素の型は減算の型推論ルールによって決まります(例: `UInt8` - `UInt8` = `Int16`)。 + +**構文** + +``` sql +arrayDifference(array) +``` + +**引数** + +- `array` – [Array](https://clickhouse.com/docs/ja/data_types/array/)。 + +**戻り値** + +隣接する配列要素間の差分の配列を返します。[UInt\*](https://clickhouse.com/docs/ja/data_types/int_uint/#uint-ranges)、[Int\*](https://clickhouse.com/docs/ja/data_types/int_uint/#int-ranges)、[Float\*](https://clickhouse.com/docs/ja/data_types/float/)。 + +**例** + +クエリ: + +``` sql +SELECT arrayDifference([1, 2, 3, 4]); +``` + +結果: + +``` text +┌─arrayDifference([1, 2, 3, 4])─┐ +│ [0,1,1,1] │ +└───────────────────────────────┘ +``` + +Int64 によるオーバーフローの例: + +クエリ: + +``` sql +SELECT arrayDifference([0, 10000000000000000000]); +``` + +結果: + +``` text +┌─arrayDifference([0, 10000000000000000000])─┐ +│ [0,-8446744073709551616] │ +└────────────────────────────────────────────┘ +``` + +## arrayDistinct + +配列を取り、一意の要素のみを含む配列を返します。 + +**構文** + +``` sql +arrayDistinct(array) +``` + +**引数** + +- `array` – [Array](https://clickhouse.com/docs/ja/data_types/array/)。 + +**戻り値** + +一意の要素を含む配列を返します。 + +**例** + +クエリ: + +``` sql +SELECT arrayDistinct([1, 2, 2, 3, 1]); +``` + +結果: + +``` text +┌─arrayDistinct([1, 2, 2, 3, 1])─┐ +│ [1,2,3] │ +└────────────────────────────────┘ +``` + +## arrayEnumerateDense + +配列と同じサイズの配列を返し、各要素のソース配列における最初の出現位置を示します。 + +**構文** + +```sql +arrayEnumerateDense(arr) +``` + +**例** + +クエリ: + +``` sql +SELECT arrayEnumerateDense([10, 20, 10, 30]) +``` + +結果: + +``` text +┌─arrayEnumerateDense([10, 20, 10, 30])─┐ +│ [1,2,1,3] │ +└───────────────────────────────────────┘ +``` +## arrayEnumerateDenseRanked + +配列と同じサイズの配列を返し、各要素の最初の出現場所をソース配列において示します。多次元配列を列挙し、配列のどの深さまで見ていくかを指定することができます。 + +**構文** + +```sql +arrayEnumerateDenseRanked(clear_depth, arr, max_array_depth) +``` + +**パラメータ** + +- `clear_depth`: 指定されたレベルで要素を個別に列挙します。`max_arr_depth`以下の正の整数。 +- `arr`: 列挙されるN次元配列。[Array](../data-types/array.md)。 +- `max_array_depth`: 有効な最大深度。`arr` の深さ以下の正の整数。 + +**例** + +`clear_depth=1`および`max_array_depth=1`では、[arrayEnumerateDense](#arrayenumeratedense) と同じ結果を返します。 + +クエリ: + +``` sql +SELECT arrayEnumerateDenseRanked(1,[10, 20, 10, 30],1); +``` + +結果: + +``` text +[1,2,1,3] +``` + +この例では、`arrayEnumerateDenseRanked` を使用して、多次元配列の各要素が同じ値を持つ別の要素の中で最初に出現する位置を示す配列を取得します。最初の行がソース配列の`[10,10,30,20]`である場合、この行に対応する結果は `[1,1,2,3]` であり、`10`が初めて発見された位置は位置1と2であること、`30`は別の発見された要素である位置 3、`20`はさらに別の発見された要素である位置4。第2の行が `[40, 50, 10, 30]` であるとき、結果の第2行は `[4,5,1,2]` であり、`40`と`50`が4番目と5番目であることを示しますこの行の位置1と2の要素として、別の`10`(最初に見つかった数)が位置3に、`30`(2番目の数)が最後の位置にあります。 + +クエリ: + +``` sql +SELECT arrayEnumerateDenseRanked(1,[[10,10,30,20],[40,50,10,30]],2); +``` + +結果: + +``` text +[[1,1,2,3],[4,5,1,2]] +``` + +`clear_depth=2`に変更すると、各行が別々に列挙されます。 + +クエリ: + +``` sql +SELECT arrayEnumerateDenseRanked(2,[[10,10,30,20],[40,50,10,30]],2); +``` + +結果: + +``` text +[[1,1,2,3],[1,2,3,4]] +``` + +## arrayUnion(arr) + +複数の配列を取り、ソース配列のいずれかに存在するすべての要素を含む配列を返します。 + +例: +```sql +SELECT + arrayUnion([-2, 1], [10, 1], [-2], []) as num_example, + arrayUnion(['hi'], [], ['hello', 'hi']) as str_example, + arrayUnion([1, 3, NULL], [2, 3, NULL]) as null_example +``` + +```text +┌─num_example─┬─str_example────┬─null_example─┐ +│ [10,-2,1] │ ['hello','hi'] │ [3,2,1,NULL] │ +└─────────────┴────────────────┴──────────────┘ +``` + +## arrayIntersect(arr) + +複数の配列を取り、すべてのソース配列に存在する要素を持つ配列を返します。 + +例: + +``` sql +SELECT + arrayIntersect([1, 2], [1, 3], [2, 3]) AS no_intersect, + arrayIntersect([1, 2], [1, 3], [1, 4]) AS intersect +``` + +``` text +┌─no_intersect─┬─intersect─┐ +│ [] │ [1] │ +└──────────────┴───────────┘ +``` + +## arrayJaccardIndex + +2つの配列の[ジャッカード係数](https://en.wikipedia.org/wiki/Jaccard_index)を返します。 + +**例** + +クエリ: +``` sql +SELECT arrayJaccardIndex([1, 2], [2, 3]) AS res +``` + +結果: +``` text +┌─res────────────────┐ +│ 0.3333333333333333 │ +└────────────────────┘ +``` + +## arrayReduce + +集約関数を配列要素に適用し、その結果を返します。集約関数の名前はシングルクォートで囲まれた文字列 `'max'`, `'sum'` として渡されます。パラメトリック集計関数を使用する場合、関数名の後括弧で囲んでパラメータを指定します `'uniqUpTo(6)'`。 + +**構文** + +``` sql +arrayReduce(agg_func, arr1, arr2, ..., arrN) +``` + +**引数** + +- `agg_func` — 集約関数の名前で、定数[文字列](../data-types/string.md)でなければなりません。 +- `arr` — アイテムとして集約関数のパラメータとして使用される任意の数の[Array](../data-types/array.md)型のカラム。 + +**戻り値** + +集約関数で指定された範囲内の結果を含む配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayReduce('max', [1, 2, 3]); +``` + +結果: + +``` text +┌─arrayReduce('max', [1, 2, 3])─┐ +│ 3 │ +└───────────────────────────────┘ +``` + +集約関数が複数の引数をとる場合、この関数は同じサイズの複数の配列に対して適用される必要があります。 + +クエリ: + +``` sql +SELECT arrayReduce('maxIf', [3, 5], [1, 0]); +``` + +結果: + +``` text +┌─arrayReduce('maxIf', [3, 5], [1, 0])─┐ +│ 3 │ +└──────────────────────────────────────┘ +``` + +パラメトリック集計関数の例: + +クエリ: + +``` sql +SELECT arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); +``` + +結果: + +``` text +┌─arrayReduce('uniqUpTo(3)', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])─┐ +│ 4 │ +└─────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [arrayFold](#arrayfold) + +## arrayReduceInRanges + +集約関数を指定された範囲内の配列要素に適用し、各範囲に対応する結果を含む配列を返します。この関数は複数の `arrayReduce(agg_func, arraySlice(arr1, index, length), ...)` と同様の結果を返します。 + +**構文** + +``` sql +arrayReduceInRanges(agg_func, ranges, arr1, arr2, ..., arrN) +``` + +**引数** + +- `agg_func` — 集約関数の名前で、定数[文字列](../data-types/string.md)でなければなりません。 +- `ranges` — 集約される範囲で、各範囲のインデックスと長さを含む[タプル](../data-types/tuple.md)の配列[Array](../data-types/array.md)です。 +- `arr` — 集約関数のパラメータとして使用される任意の数の[Array](../data-types/array.md)型のカラム。 + +**戻り値** + +- 指定された範囲内の集約関数の結果を含む配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayReduceInRanges( + 'sum', + [(1, 5), (2, 3), (3, 4), (4, 4)], + [1000000, 200000, 30000, 4000, 500, 60, 7] +) AS res +``` + +結果: + +``` text +┌─res─────────────────────────┐ +│ [1234500,234000,34560,4567] │ +└─────────────────────────────┘ +``` + +## arrayFold + +ラムダ関数を同サイズの1つまたは複数の配列に適用し、結果をアキュムレータに集めます。 + +**構文** + +``` sql +arrayFold(lambda_function, arr1, arr2, ..., accumulator) +``` + +**例** + +クエリ: + +``` sql +SELECT arrayFold( acc,x -> acc + x*2, [1, 2, 3, 4], toInt64(3)) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 23 │ +└─────┘ +``` + +**フィボナッチ数列の例** + +```sql +SELECT arrayFold( acc,x -> (acc.2, acc.2 + acc.1), range(number), (1::Int64, 0::Int64)).1 AS fibonacci +FROM numbers(1,10); + +┌─fibonacci─┐ +│ 0 │ +│ 1 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 5 │ +│ 8 │ +│ 13 │ +│ 21 │ +│ 34 │ +└───────────┘ +``` + +**関連項目** + +- [arrayReduce](#arrayreduce) + +## arrayReverse + +元の配列と同じサイズの配列を返し、順番が逆になった要素を含みます。 + +**構文** + +```sql +arrayReverse(arr) +``` + +例: + +``` sql +SELECT arrayReverse([1, 2, 3]) +``` + +``` text +┌─arrayReverse([1, 2, 3])─┐ +│ [3,2,1] │ +└─────────────────────────┘ +``` + +## reverse(arr) + +「[arrayReverse](#arrayreverse)」の同義語 + +## arrayFlatten + +配列の配列をフラットな配列に変換します。 + +関数: + +- ネストされた配列の任意の深さに適用されます。 +- すでにフラットである配列は変更しません。 + +フラット化した配列には、すべてのソース配列のすべての要素が含まれています。 + +**構文** + +``` sql +flatten(array_of_arrays) +``` + +エイリアス: `flatten`. + +**パラメータ** + +- `array_of_arrays` — [Array](../data-types/array.md) の配列。例えば、`[[1,2,3], [4,5]]`. + +**例** + +``` sql +SELECT flatten([[[1]], [[2], [3]]]); +``` + +``` text +┌─flatten(array(array([1]), array([2], [3])))─┐ +│ [1,2,3] │ +└─────────────────────────────────────────────┘ +``` + +## arrayCompact + +配列から連続する重複要素を削除します。元の配列中のオーダーによって、結果の値の順序が決まります。 + +**構文** + +``` sql +arrayCompact(arr) +``` + +**引数** + +`arr` — チェックされる[Array](../data-types/array.md)です。 + +**戻り値** + +重複を取り除いた配列。[Array](../data-types/array.md)です。 + +**例** + +クエリ: + +``` sql +SELECT arrayCompact([1, 1, nan, nan, 2, 3, 3, 3]); +``` + +結果: + +``` text +┌─arrayCompact([1, 1, nan, nan, 2, 3, 3, 3])─┐ +│ [1,nan,nan,2,3] │ +└────────────────────────────────────────────┘ +``` + +## arrayZip + +複数の配列を1つの配列に結合します。結果の配列には、ソース配列対応する要素が引数の順序でタプルにまとめられています。 + +**構文** + +``` sql +arrayZip(arr1, arr2, ..., arrN) +``` + +**引数** + +- `arrN` — [Array](../data-types/array.md). + +この機能は異なる型の任意の数の配列を受け取ることができます。すべての入力配列は同じサイズでなければなりません。 + +**戻り値** + +- ソース配列の要素を[タプル](../data-types/tuple.md)にまとめた配列です。タプル内のデータ型は、入力配列の型と同じで、渡された配列の順序に従います。[Array](../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)] │ +└──────────────────────────────────────┘ +``` + +## arrayZipUnaligned + +ズレのある配列を考慮して複数の配列を1つに結合します。結果の配列には、ソース配列の対応する要素が引数のリストされた順序でタプルにまとめられています。 + +**構文** + +``` sql +arrayZipUnaligned(arr1, arr2, ..., arrN) +``` + +**引数** + +- `arrN` — [Array](../data-types/array.md). + +この機能は異なる型の任意の数の配列を受け取ることができます。 + +**戻り値** + +- ソース配列からの要素を[タ +`func(arr1[i], ..., arrN[i])`を各要素に適用することによって、元の配列から新たな配列を取得します。配列 `arr1` ... `arrN` は同じ数の要素を持っている必要があります。 + +例: + +``` sql +SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res; +``` + +``` text +┌─res─────┐ +│ [3,4,5] │ +└─────────┘ +``` + +次の例は、異なる配列の要素からタプルを作成する方法を示しています: + +``` sql +SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res +``` + +``` text +┌─res─────────────────┐ +│ [(1,4),(2,5),(3,6)] │ +└─────────────────────┘ +``` + +`arrayMap`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayFilter(func, arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す`arr1`の要素のみを含む配列を返します。 + +例: + +``` sql +SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res +``` + +``` text +┌─res───────────┐ +│ ['abc World'] │ +└───────────────┘ +``` + +``` sql +SELECT + arrayFilter( + (i, x) -> x LIKE '%World%', + arrayEnumerate(arr), + ['Hello', 'abc World'] AS arr) + AS res +``` + +``` text +┌─res─┐ +│ [2] │ +└─────┘ +``` + +`arrayFilter`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayFill(func, arr1, ...) + +`arr1`を最初の要素から最後の要素までスキャンし、`func(arr1[i], ..., arrN[i])`が0を返す場合は`arr1[i - 1]`で`arr1[i]`を置き換えます。`arr1`の最初の要素は置き換えられません。 + +例: + +``` sql +SELECT arrayFill(x -> not isNull(x), [1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]) AS res +``` + +``` text +┌─res──────────────────────────────┐ +│ [1,1,3,11,12,12,12,5,6,14,14,14] │ +└──────────────────────────────────┘ +``` + +`arrayFill`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayReverseFill(func, arr1, ...) + +`arr1`を最後の要素から最初の要素までスキャンし、`func(arr1[i], ..., arrN[i])`が0を返す場合は`arr1[i + 1]`で`arr1[i]`を置き換えます。`arr1`の最後の要素は置き換えられません。 + +例: + +``` sql +SELECT arrayReverseFill(x -> not isNull(x), [1, null, 3, 11, 12, null, null, 5, 6, 14, null, null]) AS res +``` + +``` text +┌─res────────────────────────────────┐ +│ [1,3,3,11,12,5,5,5,6,14,NULL,NULL] │ +└────────────────────────────────────┘ +``` + +`arrayReverseFill`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arraySplit(func, arr1, ...) + +`arr1`を複数の配列に分割します。`func(arr1[i], ..., arrN[i])`が0以外を返す場合、配列はその要素の左側で分割されます。配列は最初の要素の前で分割されません。 + +例: + +``` sql +SELECT arraySplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0]) AS res +``` + +``` text +┌─res─────────────┐ +│ [[1,2,3],[4,5]] │ +└─────────────────┘ +``` + +`arraySplit`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayReverseSplit(func, arr1, ...) + +`arr1`を複数の配列に分割します。`func(arr1[i], ..., arrN[i])`が0以外を返す場合、配列はその要素の右側で分割されます。配列は最後の要素の後では分割されません。 + +例: + +``` sql +SELECT arrayReverseSplit((x, y) -> y, [1, 2, 3, 4, 5], [1, 0, 0, 1, 0]) AS res +``` + +``` text +┌─res───────────────┐ +│ [[1],[2,3,4],[5]] │ +└───────────────────┘ +``` + +`arrayReverseSplit`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayExists(\[func,\] arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す要素が少なくとも1つ存在する場合は1を返します。それ以外の場合は0を返します。 + +`arrayExists`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +## arrayAll(\[func,\] arr1, ...) + +`func(arr1[i], ..., arrN[i])`がすべての要素に対して0以外を返す場合は1を返します。それ以外は0を返します。 + +`arrayAll`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +## arrayFirst(func, arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す最初の要素を`arr1`配列から返します。 + +## arrayFirstOrNull + +`func(arr1[i], ..., arrN[i])`が0以外を返す最初の要素を`arr1`配列から返します。そうでない場合は`NULL`を返します。 + +**構文** + +```sql +arrayFirstOrNull(func, arr1, ...) +``` + +**パラメータ** + +- `func`: ラムダ関数。[ラムダ関数](../functions/#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `arr1`: 操作対象の配列。[配列](../data-types/array.md)。 + +**返される値** + +- 渡された配列の最初の要素。 +- そうでない場合は`NULL`を返します + +**実装の詳細** + +`arrayFirstOrNull`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +**例** + +クエリ: + +```sql +SELECT arrayFirstOrNull(x -> x >= 2, [1, 2, 3]); +``` + +結果: + +```response +2 +``` + +クエリ: + +```sql +SELECT arrayFirstOrNull(x -> x >= 2, emptyArrayUInt8()); +``` + +結果: + +```response +\N +``` + +クエリ: + +```sql +SELECT arrayLastOrNull((x,f) -> f, [1,2,3,NULL], [0,1,0,1]); +``` + +結果: + +```response +\N +``` + +## arrayLast(func, arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す最後の要素を`arr1`配列から返します。 + +`arrayLast`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayLastOrNull + +`func(arr1[i], ..., arrN[i])`が0以外を返す最後の要素を`arr1`配列から返します。そうでない場合は`NULL`を返します。 + +**構文** + +```sql +arrayLastOrNull(func, arr1, ...) +``` + +**パラメータ** + +- `func`: ラムダ関数。[ラムダ関数](../functions/#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `arr1`: 操作対象の配列。[配列](../data-types/array.md)。 + +**返される値** + +- 渡された配列の最後の要素。 +- そうでない場合は`NULL`を返します + +**実装の詳細** + +`arrayLastOrNull`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +**例** + +クエリ: + +```sql +SELECT arrayLastOrNull(x -> x >= 2, [1, 2, 3]); +``` + +結果: + +```response +3 +``` + +クエリ: + +```sql +SELECT arrayLastOrNull(x -> x >= 2, emptyArrayUInt8()); +``` + +結果: + +```response +\N +``` + +## arrayFirstIndex(func, arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す最初の要素のインデックスを`arr1`配列から返します。 + +`arrayFirstIndex`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayLastIndex(func, arr1, ...) + +`func(arr1[i], ..., arrN[i])`が0以外を返す最後の要素のインデックスを`arr1`配列から返します。 + +`arrayLastIndex`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡す必要があり、省略することはできません。 + +## arrayMin + +元の配列内の要素の最小値を返します。 + +`func`関数が指定されている場合は、この関数によって変換された要素の最小値を返します。 + +`arrayMin`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +**構文** + +```sql +arrayMin([func,] arr) +``` + +**引数** + +- `func` — 関数。[Expression](../data-types/special-data-types/expression.md)。 +- `arr` — 配列。[配列](../data-types/array.md)。 + +**返される値** + +- 関数値の最小値(または配列の最小値)。 + +:::note +`func`が指定されている場合、戻り値の型は`func`の戻り値の型と一致します。それ以外の場合は配列の要素の型と一致します。 +::: + +**例** + +クエリ: + +```sql +SELECT arrayMin([1, 2, 4]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +クエリ: + +```sql +SELECT arrayMin(x -> (-x), [1, 2, 4]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ -4 │ +└─────┘ +``` + +## arrayMax + +元の配列内の要素の最大値を返します。 + +`func`関数が指定されている場合は、この関数によって変換された要素の最大値を返します。 + +`arrayMax`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +**構文** + +```sql +arrayMax([func,] arr) +``` + +**引数** + +- `func` — 関数。[Expression](../data-types/special-data-types/expression.md)。 +- `arr` — 配列。[配列](../data-types/array.md)。 + +**返される値** + +- 関数値の最大値(または配列の最大値)。 + +:::note +`func`が指定されている場合、戻り値の型は`func`の戻り値の型と一致します。それ以外の場合は配列の要素の型と一致します。 +::: + +**例** + +クエリ: + +```sql +SELECT arrayMax([1, 2, 4]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ 4 │ +└─────┘ +``` + +クエリ: + +```sql +SELECT arrayMax(x -> (-x), [1, 2, 4]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ -1 │ +└─────┘ +``` + +## arraySum + +元の配列内の要素の合計値を返します。 + +`func`関数が指定されている場合は、この関数によって変換された要素の合計値を返します。 + +`arraySum`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +**構文** + +```sql +arraySum([func,] arr) +``` + +**引数** + +- `func` — 関数。[Expression](../data-types/special-data-types/expression.md)。 +- `arr` — 配列。[配列](../data-types/array.md)。 + +**返される値** + +- 関数値の合計値(または配列の合計値)。 + +:::note +戻り値の型: + +- 元の配列(または`func`が指定されている場合は変換された値)の小数の場合 — [Decimal128](../data-types/decimal.md)。 +- 浮動小数点数の場合 — [Float64](../data-types/float.md)。 +- 符号なし整数の場合 — [UInt64](../data-types/int-uint.md)。 +- 符号付き整数の場合 — [Int64](../data-types/int-uint.md)。 +::: + +**例** + +クエリ: + +```sql +SELECT arraySum([2, 3]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ 5 │ +└─────┘ +``` + +クエリ: + +```sql +SELECT arraySum(x -> x*x, [2, 3]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ 13 │ +└─────┘ +``` + +## arrayAvg + +元の配列内の要素の平均を返します。 + +`func`関数が指定されている場合は、この関数によって変換された要素の平均を返します。 + +`arrayAvg`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +**構文** + +```sql +arrayAvg([func,] arr) +``` + +**引数** + +- `func` — 関数。[Expression](../data-types/special-data-types/expression.md)。 +- `arr` — 配列。[配列](../data-types/array.md)。 + +**返される値** + +- 関数値の平均値(または配列の平均値)。[Float64](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT arrayAvg([1, 2, 4]) AS res; +``` + +結果: + +```text +┌────────────────res─┐ +│ 2.3333333333333335 │ +└────────────────────┘ +``` + +クエリ: + +```sql +SELECT arrayAvg(x -> (x * x), [2, 4]) AS res; +``` + +結果: + +```text +┌─res─┐ +│ 10 │ +└─────┘ +``` + +## arrayCumSum(\[func,\] arr1, ...) + +元の配列`arr1`の要素の部分(ランニング)合計を返します。`func`が指定されている場合、合計は`func`を`arr1`、`arr2`、...、`arrN`に適用することにより計算されます。すなわち、`func(arr1[i], ..., arrN[i])`です。 + +**構文** + +``` sql +arrayCumSum(arr) +``` + +**引数** + +- `arr` — 数値の[配列](../data-types/array.md)。 + +**返される値** + +- 元の配列の要素の部分合計の配列を返します。[UInt\*](https://clickhouse.com/docs/ja/data_types/int_uint/#uint-ranges)、[Int\*](https://clickhouse.com/docs/ja/data_types/int_uint/#int-ranges)、[Float\*](https://clickhouse.com/docs/ja/data_types/float/)。 + +**例** + +``` sql +SELECT arrayCumSum([1, 1, 1, 1]) AS res +``` + +``` text +┌─res──────────┐ +│ [1, 2, 3, 4] │ +└──────────────┘ +``` + +`arrayCumSum`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +## arrayCumSumNonNegative(\[func,\] arr1, ...) + +`arrayCumSum`と同様に、元の配列の要素の部分(ランニング)合計を返します。`func`が指定されている場合、合計は`func`を`arr1`、`arr2`、...、`arrN`に適用することにより計算されます。すなわち、`func(arr1[i], ..., arrN[i])`です。`arrayCumSum`とは異なり、現在のランニング合計が0未満の場合、それは0に置き換えられます。 + +**構文** + +``` sql +arrayCumSumNonNegative(arr) +``` + +**引数** + +- `arr` — 数値の[配列](../data-types/array.md)。 + +**返される値** + +- 元の配列の要素の非負部分合計の配列を返します。[UInt\*](https://clickhouse.com/docs/ja/data_types/int_uint/#uint-ranges)、[Int\*](https://clickhouse.com/docs/ja/data_types/int_uint/#int-ranges)、[Float\*](https://clickhouse.com/docs/ja/data_types/float/)。 + +**例** + +``` sql +SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res +``` + +``` text +┌─res───────┐ +│ [1,2,0,1] │ +└───────────┘ +``` + +`arraySumNonNegative`は[高階関数](../../sql-reference/functions/index.md#higher-order-functions)であることに注意してください。最初の引数としてラムダ関数を渡すことができます。 + +## arrayProduct + +[配列](../data-types/array.md)の要素を乗算します。 + +**構文** + +``` sql +arrayProduct(arr) +``` + +**引数** + +- `arr` — 数値の[配列](../data-types/array.md)。 + +**返される値** + +- 配列の要素の積。[Float64](../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayProduct([1,2,3,4,5,6]) as res; +``` + +結果: + +``` text +┌─res───┐ +│ 720 │ +└───────┘ +``` + +クエリ: + +``` sql +SELECT arrayProduct([toDecimal64(1,8), toDecimal64(2,8), toDecimal64(3,8)]) as res, toTypeName(res); +``` + +戻り値の型は常に[Float64](../data-types/float.md)です。結果: + +``` text +┌─res─┬─toTypeName(arrayProduct(array(toDecimal64(1, 8), toDecimal64(2, 8), toDecimal64(3, 8))))─┐ +│ 6 │ Float64 │ +└─────┴──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## arrayRotateLeft + +[配列](../data-types/array.md)を指定した要素数だけ左に回転させます。 +要素数が負の場合は、配列は右に回転します。 + +**構文** + +``` sql +arrayRotateLeft(arr, n) +``` + +**引数** + +- `arr` — [配列](../data-types/array.md)。 +- `n` — 回転させる要素の数。 + +**返される値** + +- 指定された要素数だけ左に回転させた配列。[配列](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayRotateLeft([1,2,3,4,5,6], 2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [3,4,5,6,1,2] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayRotateLeft([1,2,3,4,5,6], -2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [5,6,1,2,3,4] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayRotateLeft(['a','b','c','d','e'], 3) as res; +``` + +結果: + +``` text +┌─res───────────────────┐ +│ ['d','e','a','b','c'] │ +└───────────────────────┘ +``` + +## arrayRotateRight + +[配列](../data-types/array.md)を指定した要素数だけ右に回転させます。 +要素数が負の場合は、配列は左に回転します。 + +**構文** + +``` sql +arrayRotateRight(arr, n) +``` + +**引数** + +- `arr` — [配列](../data-types/array.md)。 +- `n` — 回転させる要素の数。 + +**返される値** + +- 指定された要素数だけ右に回転させた配列。[配列](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayRotateRight([1,2,3,4,5,6], 2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [5,6,1,2,3,4] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayRotateRight([1,2,3,4,5,6], -2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [3,4,5,6,1,2] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayRotateRight(['a','b','c','d','e'], 3) as res; +``` + +結果: + +``` text +┌─res───────────────────┐ +│ ['c','d','e','a','b'] │ +└───────────────────────┘ +``` + +## arrayShiftLeft + +[配列](../data-types/array.md)を指定した要素数だけ左にシフトします。 +新しい要素は提供された引数または配列要素型のデフォルト値で埋められます。 +要素数が負の場合は、配列は右にシフトされます。 + +**構文** + +``` sql +arrayShiftLeft(arr, n[, default]) +``` + +**引数** + +- `arr` — [配列](../data-types/array.md)。 +- `n` — シフトさせる要素の数。 +- `default` — オプション。新しい要素のデフォルト値。 + +**返される値** + +- 指定された要素数だけ左にシフトさせた配列。[配列](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayShiftLeft([1,2,3,4,5,6], 2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [3,4,5,6,0,0] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftLeft([1,2,3,4,5,6], -2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [0,0,1,2,3,4] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftLeft([1,2,3,4,5,6], 2, 42) as res; +``` + +結果: + +``` text +┌─res─────────────┐ +│ [3,4,5,6,42,42] │ +└─────────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftLeft(['a','b','c','d','e','f'], 3, 'foo') as res; +``` + +結果: + +``` text +┌─res─────────────────────────────┐ +│ ['d','e','f','foo','foo','foo'] │ +└─────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftLeft([1,2,3,4,5,6] :: Array(UInt16), 2, 4242) as res; +``` + +結果: + +``` text +┌─res─────────────────┐ +│ [3,4,5,6,4242,4242] │ +└─────────────────────┘ +``` + +## arrayShiftRight + +[配列](../data-types/array.md)を指定した要素数だけ右にシフトします。 +新しい要素は提供された引数または配列要素型のデフォルト値で埋められます。 +要素数が負の場合は、配列は左にシフトされます。 + +**構文** + +``` sql +arrayShiftRight(arr, n[, default]) +``` + +**引数** + +- `arr` — [配列](../data-types/array.md)。 +- `n` — シフトさせる要素の数。 +- `default` — オプション。新しい要素のデフォルト値。 + +**返される値** + +- 指定された要素数だけ右にシフトさせた配列。[配列](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT arrayShiftRight([1,2,3,4,5,6], 2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [0,0,1,2,3,4] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftRight([1,2,3,4,5,6], -2) as res; +``` + +結果: + +``` text +┌─res───────────┐ +│ [3,4,5,6,0,0] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftRight([1,2,3,4,5,6], 2, 42) as res; +``` + +結果: + +``` text +┌─res─────────────┐ +│ [42,42,1,2,3,4] │ +└─────────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftRight(['a','b','c','d','e','f'], 3, 'foo') as res; +``` + +結果: + +``` text +┌─res─────────────────────────────┐ +│ ['foo','foo','foo','a','b','c'] │ +└─────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT arrayShiftRight([1,2,3,4,5,6] :: Array(UInt16), 2, 4242) as res; +``` + +結果: + +``` text +┌─res─────────────────┐ +│ [4242,4242,1,2,3,4] │ +└─────────────────────┘ +``` + +## arrayRandomSample + +関数`arrayRandomSample`は、入力配列からランダムに`samples`個の要素のサブセットを返します。`samples`が入力配列のサイズを超える場合、サンプルサイズは配列のサイズに制限されます。つまり、すべての配列要素が返されますが、順序は保証されません。この関数はフラットな配列とネストされた配列の両方を処理できます。 + +**構文** + +```sql +arrayRandomSample(arr, samples) +``` + +**引数** + +- `arr` — サンプル要素を抽出する入力配列。([Array(T)](../data-types/array.md)) +- `samples` — ランダムサンプルに含める要素の数 ([UInt*](../data-types/int-uint.md)) + +**返される値** + +- 入力配列からランダムにサンプルした要素の配列。[配列](../data-types/array.md)。 + +**例** + +クエリ: + +```sql +SELECT arrayRandomSample(['apple', 'banana', 'cherry', 'date'], 2) as res; +``` + +結果: + +``` +┌─res────────────────┐ +│ ['cherry','apple'] │ +└────────────────────┘ +``` + +クエリ: + +```sql +SELECT arrayRandomSample([[1, 2], [3, 4], [5, 6]], 2) as res; +``` + +結果: + +``` +┌─res───────────┐ +│ [[3,4],[5,6]] │ +└───────────────┘ +``` + +クエリ: + +```sql +SELECT arrayRandomSample([1, 2, 3], 5) as res; +``` + +結果: + +``` +┌─res─────┐ +│ [3,1,2] │ +└─────────┘ +``` + +## 距離関数 + +サポートされているすべての関数は、[距離関数のドキュメント](../../sql-reference/functions/distance-functions.md)に記載されています。 diff --git a/docs/ja/sql-reference/functions/array-join.md b/docs/ja/sql-reference/functions/array-join.md new file mode 100644 index 00000000000..1315f1fa1a2 --- /dev/null +++ b/docs/ja/sql-reference/functions/array-join.md @@ -0,0 +1,153 @@ +--- +slug: /ja/sql-reference/functions/array-join +sidebar_position: 15 +sidebar_label: arrayJoin +--- + +# arrayJoin 関数 + +これは非常に特殊な関数です。 + +通常の関数は行の集合を変えずに、各行の値だけを変更します(マップ)。 +集計関数は行の集合を圧縮します(フォールドまたはリデュース)。 +`arrayJoin` 関数は各行を取り、行の集合を生成します(アンフォールド)。 + +この関数は配列を引数に取り、配列の要素数に応じて元の行を複数の行に展開します。 +この関数が適用されたカラム以外のすべてのカラムの値は単純にコピーされ、適用されたカラムの値は対応する配列の値に置き換えられます。 + +例: + +``` sql +SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src +``` + +``` text +┌─dst─┬─\'Hello\'─┬─src─────┐ +│ 1 │ Hello │ [1,2,3] │ +│ 2 │ Hello │ [1,2,3] │ +│ 3 │ Hello │ [1,2,3] │ +└─────┴───────────┴─────────┘ +``` + +`arrayJoin` 関数は `WHERE` セクションを含むクエリのすべてのセクションに影響を与えます。サブクエリが1行を返したにもかかわらず、結果が2を示している点に注意してください。 + +例: + +```sql +SELECT sum(1) AS impressions +FROM +( + SELECT ['Istanbul', 'Berlin', 'Bobruisk'] AS cities +) +WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin']; +``` + +``` text +┌─impressions─┐ +│ 2 │ +└─────────────┘ +``` + +クエリは複数の `arrayJoin` 関数を使用することができます。この場合、変換が複数回行われ、行が増えます。 + +例: + +```sql +SELECT + sum(1) AS impressions, + arrayJoin(cities) AS city, + arrayJoin(browsers) AS browser +FROM +( + SELECT + ['Istanbul', 'Berlin', 'Bobruisk'] AS cities, + ['Firefox', 'Chrome', 'Chrome'] AS browsers +) +GROUP BY + 2, + 3 +``` + +``` text +┌─impressions─┬─city─────┬─browser─┐ +│ 2 │ Istanbul │ Chrome │ +│ 1 │ Istanbul │ Firefox │ +│ 2 │ Berlin │ Chrome │ +│ 1 │ Berlin │ Firefox │ +│ 2 │ Bobruisk │ Chrome │ +│ 1 │ Bobruisk │ Firefox │ +└─────────────┴──────────┴─────────┘ +``` +### 重要な注意点! +同じ式で複数の `arrayJoin` を使用すると、最適化のために期待される結果が得られないことがあります。その場合、結合結果に影響しない追加の操作で繰り返される配列式を修正することを検討してください - 例: `arrayJoin(arraySort(arr))`, `arrayJoin(arrayConcat(arr, []))` + +例: +```sql +SELECT + arrayJoin(dice) as first_throw, + /* arrayJoin(dice) as second_throw */ -- 技術的には正しいですが、結果セットを消してしまいます + arrayJoin(arrayConcat(dice, [])) as second_throw -- 意図的に表現を変更して再評価を強制 +FROM ( + SELECT [1, 2, 3, 4, 5, 6] as dice +); +``` + +SELECT クエリの [ARRAY JOIN](../statements/select/array-join.md) 構文に注意してください。これにより、より広い可能性が提供されます。 +`ARRAY JOIN` は、同じ数の要素を持つ複数の配列を一度に変換することができます。 + +例: + +```sql +SELECT + sum(1) AS impressions, + city, + browser +FROM +( + SELECT + ['Istanbul', 'Berlin', 'Bobruisk'] AS cities, + ['Firefox', 'Chrome', 'Chrome'] AS browsers +) +ARRAY JOIN + cities AS city, + browsers AS browser +GROUP BY + 2, + 3 +``` + +``` text +┌─impressions─┬─city─────┬─browser─┐ +│ 1 │ Istanbul │ Firefox │ +│ 1 │ Berlin │ Chrome │ +│ 1 │ Bobruisk │ Chrome │ +└─────────────┴──────────┴─────────┘ +``` + +または [Tuple](../data-types/tuple.md) を使用することもできます。 + +例: + +```sql +SELECT + sum(1) AS impressions, + (arrayJoin(arrayZip(cities, browsers)) AS t).1 AS city, + t.2 AS browser +FROM +( + SELECT + ['Istanbul', 'Berlin', 'Bobruisk'] AS cities, + ['Firefox', 'Chrome', 'Chrome'] AS browsers +) +GROUP BY + 2, + 3 +``` + +``` text +┌─impressions─┬─city─────┬─browser─┐ +│ 1 │ Istanbul │ Firefox │ +│ 1 │ Berlin │ Chrome │ +│ 1 │ Bobruisk │ Chrome │ +└─────────────┴──────────┴─────────┘ +``` diff --git a/docs/ja/sql-reference/functions/bit-functions.md b/docs/ja/sql-reference/functions/bit-functions.md new file mode 100644 index 00000000000..fb8037231da --- /dev/null +++ b/docs/ja/sql-reference/functions/bit-functions.md @@ -0,0 +1,439 @@ +--- +slug: /ja/sql-reference/functions/bit-functions +sidebar_position: 20 +sidebar_label: Bit +--- + +# ビット関数 + +ビット関数は、`UInt8`、`UInt16`、`UInt32`、`UInt64`、`Int8`、`Int16`、`Int32`、`Int64`、`Float32`、`Float64`の任意のペアの型に対して機能します。一部の関数は`String`および`FixedString`型もサポートしています。 + +結果の型は、その引数の最大ビット数に等しい整数です。少なくとも一つの引数が符号付きである場合、結果は符号付き数になります。引数が浮動小数点数の場合、それはInt64にキャストされます。 + +## bitAnd(a, b) + +## bitOr(a, b) + +## bitXor(a, b) + +## bitNot(a) + +## bitShiftLeft(a, b) + +値のバイナリ表現を指定されたビット位置数だけ左にシフトします。 + +`FixedString`または`String`は単一のマルチバイト値として扱われます。 + +`FixedString`値のビットはシフトアウトされると失われます。一方、`String`値は追加のバイトで拡張されるため、ビットは失われません。 + +**構文** + +``` sql +bitShiftLeft(a, b) +``` + +**引数** + +- `a` — シフトする値です。[整数型](../data-types/int-uint.md)、[String](../data-types/string.md)、または[FixedString](../data-types/fixedstring.md)。 +- `b` — シフト位置の数です。[符号なし整数型](../data-types/int-uint.md)、64ビット型以下が許可されます。 + +**返される値** + +- シフトされた値。 + +返される値の型は、入力値の型と同じです。 + +**例** + +以下のクエリでは、シフトされた値のビットを表示するために[bin](encoding-functions.md#bin)および[hex](encoding-functions.md#hex)関数が使用されます。 + +``` sql +SELECT 99 AS a, bin(a), bitShiftLeft(a, 2) AS a_shifted, bin(a_shifted); +SELECT 'abc' AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted); +SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftLeft(a, 4) AS a_shifted, hex(a_shifted); +``` + +結果: + +``` text +┌──a─┬─bin(99)──┬─a_shifted─┬─bin(bitShiftLeft(99, 2))─┐ +│ 99 │ 01100011 │ 140 │ 10001100 │ +└────┴──────────┴───────────┴──────────────────────────┘ +┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftLeft('abc', 4))─┐ +│ abc │ 616263 │ &0 │ 06162630 │ +└─────┴────────────┴───────────┴─────────────────────────────┘ +┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftLeft(toFixedString('abc', 3), 4))─┐ +│ abc │ 616263 │ &0 │ 162630 │ +└─────┴──────────────────────────────┴───────────┴───────────────────────────────────────────────┘ +``` + +## bitShiftRight(a, b) + +値のバイナリ表現を指定されたビット位置数だけ右にシフトします。 + +`FixedString`または`String`は単一のマルチバイト値として扱われます。`String`値の長さはビットがシフトアウトされると減少しますので注意してください。 + +**構文** + +``` sql +bitShiftRight(a, b) +``` + +**引数** + +- `a` — シフトする値です。[整数型](../data-types/int-uint.md)、[String](../data-types/string.md)、または[FixedString](../data-types/fixedstring.md)。 +- `b` — シフト位置の数です。[符号なし整数型](../data-types/int-uint.md)、64ビット型以下が許可されます。 + +**返される値** + +- シフトされた値。 + +返される値の型は、入力値の型と同じです。 + +**例** + +クエリ: + +``` sql +SELECT 101 AS a, bin(a), bitShiftRight(a, 2) AS a_shifted, bin(a_shifted); +SELECT 'abc' AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted); +SELECT toFixedString('abc', 3) AS a, hex(a), bitShiftRight(a, 12) AS a_shifted, hex(a_shifted); +``` + +結果: + +``` text +┌───a─┬─bin(101)─┬─a_shifted─┬─bin(bitShiftRight(101, 2))─┐ +│ 101 │ 01100101 │ 25 │ 00011001 │ +└─────┴──────────┴───────────┴────────────────────────────┘ +┌─a───┬─hex('abc')─┬─a_shifted─┬─hex(bitShiftRight('abc', 12))─┐ +│ abc │ 616263 │ │ 0616 │ +└─────┴────────────┴───────────┴───────────────────────────────┘ +┌─a───┬─hex(toFixedString('abc', 3))─┬─a_shifted─┬─hex(bitShiftRight(toFixedString('abc', 3), 12))─┐ +│ abc │ 616263 │ │ 000616 │ +└─────┴──────────────────────────────┴───────────┴─────────────────────────────────────────────────┘ +``` + +## bitRotateLeft(a, b) + +## bitRotateRight(a, b) + +## bitSlice(s, offset, length) + +‘offset’インデックスから始まる‘length’ビットのビットサブストリングを返します。ビットのインデックスは1から始まります。 + +**構文** + +``` sql +bitSlice(s, offset[, length]) +``` + +**引数** + +- `s` — sは[String](../data-types/string.md)または[FixedString](../data-types/fixedstring.md)。 +- `offset` — ビットの開始インデックス。正の値は左からのオフセットを示し、負の値は右からのインデントを示します。ビットの番号付けは1から始まります。 +- `length` — ビットのサブストリングの長さ。負の値を指定すると、関数は開いたサブストリング\[offset, array_length - length\]を返します。値を省略すると、関数はサブストリング\[offset, the_end_string\]を返します。lengthがsを超えると切り捨てられます。lengthが8の倍数でない場合、右に0を埋めます。 + +**返される値** + +- サブストリング。[String](../data-types/string.md) + +**例** + +クエリ: + +``` sql +select bin('Hello'), bin(bitSlice('Hello', 1, 8)) +select bin('Hello'), bin(bitSlice('Hello', 1, 2)) +select bin('Hello'), bin(bitSlice('Hello', 1, 9)) +select bin('Hello'), bin(bitSlice('Hello', -4, 8)) +``` + +結果: + +``` text +┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 8))─┐ +│ 0100100001100101011011000110110001101111 │ 01001000 │ +└──────────────────────────────────────────┴──────────────────────────────┘ +┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 2))─┐ +│ 0100100001100101011011000110110001101111 │ 01000000 │ +└──────────────────────────────────────────┴──────────────────────────────┘ +┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 9))─┐ +│ 0100100001100101011011000110110001101111 │ 0100100000000000 │ +└──────────────────────────────────────────┴──────────────────────────────┘ +┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', -4, 8))─┐ +│ 0100100001100101011011000110110001101111 │ 11110000 │ +└──────────────────────────────────────────┴───────────────────────────────┘ +``` + +## byteSlice(s, offset, length) + +関数[substring](string-functions.md#substring)を参照してください。 + +## bitTest + +任意の整数を[2進法](https://en.wikipedia.org/wiki/Binary_number)に変換し、指定された位置にあるビットの値を返します。カウントは右から左へ0から始まります。 + +**構文** + +``` sql +SELECT bitTest(number, index) +``` + +**引数** + +- `number` – 整数。 +- `index` – ビットの位置。 + +**返される値** + +- 指定された位置にあるビットの値。[UInt8](../data-types/int-uint.md)。 + +**例** + +例えば、10進数で43の数は2進数で101011です。 + +クエリ: + +``` sql +SELECT bitTest(43, 1); +``` + +結果: + +``` text +┌─bitTest(43, 1)─┐ +│ 1 │ +└────────────────┘ +``` + +別の例: + +クエリ: + +``` sql +SELECT bitTest(43, 2); +``` + +結果: + +``` text +┌─bitTest(43, 2)─┐ +│ 0 │ +└────────────────┘ +``` + +## bitTestAll + +指定された位置のすべてのビットの[論理積](https://en.wikipedia.org/wiki/Logical_conjunction)(AND演算子)の結果を返します。カウントは右から左へ、0から始まります。 + +ビット単位の演算での積: + +0 AND 0 = 0 + +0 AND 1 = 0 + +1 AND 0 = 0 + +1 AND 1 = 1 + +**構文** + +``` sql +SELECT bitTestAll(number, index1, index2, index3, index4, ...) +``` + +**引数** + +- `number` – 整数。 +- `index1`, `index2`, `index3`, `index4` – ビットの位置。例えば、位置のセット (`index1`, `index2`, `index3`, `index4`) がすべて真である場合(`index1` ⋀ `index2` ⋀ `index3` ⋀ `index4`)にのみ真です。 + +**返される値** + +- 論理積の結果。[UInt8](../data-types/int-uint.md)。 + +**例** + +例えば、10進数で43の数は2進数で101011です。 + +クエリ: + +``` sql +SELECT bitTestAll(43, 0, 1, 3, 5); +``` + +結果: + +``` text +┌─bitTestAll(43, 0, 1, 3, 5)─┐ +│ 1 │ +└────────────────────────────┘ +``` + +別の例: + +クエリ: + +``` sql +SELECT bitTestAll(43, 0, 1, 3, 5, 2); +``` + +結果: + +``` text +┌─bitTestAll(43, 0, 1, 3, 5, 2)─┐ +│ 0 │ +└───────────────────────────────┘ +``` + +## bitTestAny + +指定された位置のすべてのビットの[論理和](https://en.wikipedia.org/wiki/Logical_disjunction)(OR演算子)の結果を返します。カウントは右から左へ、0から始まります。 + +ビット単位の演算での和: + +0 OR 0 = 0 + +0 OR 1 = 1 + +1 OR 0 = 1 + +1 OR 1 = 1 + +**構文** + +``` sql +SELECT bitTestAny(number, index1, index2, index3, index4, ...) +``` + +**引数** + +- `number` – 整数。 +- `index1`, `index2`, `index3`, `index4` – ビットの位置。 + +**返される値** + +- 論理和の結果。[UInt8](../data-types/int-uint.md)。 + +**例** + +例えば、10進数で43の数は2進数で101011です。 + +クエリ: + +``` sql +SELECT bitTestAny(43, 0, 2); +``` + +結果: + +``` text +┌─bitTestAny(43, 0, 2)─┐ +│ 1 │ +└──────────────────────┘ +``` + +別の例: + +クエリ: + +``` sql +SELECT bitTestAny(43, 4, 2); +``` + +結果: + +``` text +┌─bitTestAny(43, 4, 2)─┐ +│ 0 │ +└──────────────────────┘ +``` + +## bitCount + +数の2進表現で1に設定されたビットの数を計算します。 + +**構文** + +``` sql +bitCount(x) +``` + +**引数** + +- `x` — [整数](../data-types/int-uint.md)または[浮動小数点](../data-types/float.md)数。関数はメモリ内での値表現を使用します。これにより、浮動小数点数のサポートが可能になります。 + +**返される値** + +- 入力数で1に設定されたビットの数。[UInt8](../data-types/int-uint.md)。 + +:::note +この関数は、入力値をより大きな型に変換しません([符号拡張](https://en.wikipedia.org/wiki/Sign_extension))。例えば、`bitCount(toUInt8(-1)) = 8`です。 +::: + +**例** + +例えば、数値333を取り上げます。その2進表現: 0000000101001101。 + +クエリ: + +``` sql +SELECT bitCount(333); +``` + +結果: + +``` text +┌─bitCount(333)─┐ +│ 5 │ +└───────────────┘ +``` + +## bitHammingDistance + +2つの整数値のビット表現間の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)を返します。[SimHash](../../sql-reference/functions/hash-functions.md#ngramsimhash)関数と組み合わせて、半重複文字列の検出に使用できます。距離が小さいほど、それらの文字列が同じである可能性が高くなります。 + +**構文** + +``` sql +bitHammingDistance(int1, int2) +``` + +**引数** + +- `int1` — 初の整数値。[Int64](../data-types/int-uint.md)。 +- `int2` — 次の整数値。[Int64](../data-types/int-uint.md)。 + +**返される値** + +- ハミング距離。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT bitHammingDistance(111, 121); +``` + +結果: + +``` text +┌─bitHammingDistance(111, 121)─┐ +│ 3 │ +└──────────────────────────────┘ +``` + +[SimHash](../../sql-reference/functions/hash-functions.md#ngramsimhash)と一緒に: + +``` sql +SELECT bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat')); +``` + +結果: + +``` text +┌─bitHammingDistance(ngramSimHash('cat ate rat'), ngramSimHash('rat ate cat'))─┐ +│ 5 │ +└──────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/bitmap-functions.md b/docs/ja/sql-reference/functions/bitmap-functions.md new file mode 100644 index 00000000000..1b9719397f0 --- /dev/null +++ b/docs/ja/sql-reference/functions/bitmap-functions.md @@ -0,0 +1,587 @@ +--- +slug: /ja/sql-reference/functions/bitmap-functions +sidebar_position: 25 +sidebar_label: Bitmap +--- + +# Bitmap関数 + +ビットマップは2つの方法で構築できます。1つ目は集計関数groupBitmapと`-State`を用いて構築する方法で、もう1つは配列オブジェクトからビットマップを構築する方法です。 + +## bitmapBuild + +符号なし整数配列からビットマップを構築します。 + +**構文** + +``` sql +bitmapBuild(array) +``` + +**引数** + +- `array` – 符号なし整数配列。 + +**例** + +``` sql +SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res); +``` + +``` text +┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐ +│ │ AggregateFunction(groupBitmap, UInt8) │ +└─────┴──────────────────────────────────────────────┘ +``` + +## bitmapToArray + +ビットマップを整数配列に変換します。 + +**構文** + +``` sql +bitmapToArray(bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res; +``` + +結果: + +``` text +┌─res─────────┐ +│ [1,2,3,4,5] │ +└─────────────┘ +``` + +## bitmapSubsetInRange + +値の範囲内のビットを持つビットマップのサブセットを返します。 + +**構文** + +``` sql +bitmapSubsetInRange(bitmap, range_start, range_end) +``` + +**引数** + +- `bitmap` – [ビットマップオブジェクト](#bitmapbuild)。 +- `range_start` – 範囲の開始点(含む)。[UInt32](../data-types/int-uint.md)。 +- `range_end` – 範囲の終了点(排他的)。[UInt32](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res; +``` + +結果: + +``` text +┌─res───────────────┐ +│ [30,31,32,33,100] │ +└───────────────────┘ +``` + +## bitmapSubsetLimit + +最小のビット値`range_start`を持ち、最大`cardinality_limit`個の要素を持つビットマップのサブセットを返します。 + +**構文** + +``` sql +bitmapSubsetLimit(bitmap, range_start, cardinality_limit) +``` + +**引数** + +- `bitmap` – [ビットマップオブジェクト](#bitmapbuild)。 +- `range_start` – 範囲の開始点(含む)。[UInt32](../data-types/int-uint.md)。 +- `cardinality_limit` – サブセットの最大カーディナリティ。[UInt32](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res; +``` + +結果: + +``` text +┌─res───────────────────────┐ +│ [30,31,32,33,100,200,500] │ +└───────────────────────────┘ +``` + +## subBitmap + +指定した位置`offset`から始まるビットマップのサブセットを返します。返されるビットマップの最大カーディナリティは`cardinality_limit`です。 + +**構文** + +``` sql +subBitmap(bitmap, offset, cardinality_limit) +``` + +**引数** + +- `bitmap` – ビットマップ。[ビットマップオブジェクト](#bitmapbuild)。 +- `offset` – サブセットの最初の要素の位置。[UInt32](../data-types/int-uint.md)。 +- `cardinality_limit` – サブセット内の要素の最大数。[UInt32](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT bitmapToArray(subBitmap(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(10), toUInt32(10))) AS res; +``` + +結果: + +``` text +┌─res─────────────────────────────┐ +│ [10,11,12,13,14,15,16,17,18,19] │ +└─────────────────────────────────┘ +``` + +## bitmapContains + +ビットマップに要素が含まれているか確認します。 + +``` sql +bitmapContains(bitmap, needle) +``` + +**引数** + +- `bitmap` – [ビットマップオブジェクト](#bitmapbuild)。 +- `needle` – 検索するビット値。[UInt32](../data-types/int-uint.md)。 + +**返される値** + +- 0 — `bitmap`が`needle`を含まない場合。[UInt8](../data-types/int-uint.md)。 +- 1 — `bitmap`が`needle`を含む場合。[UInt8](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapHasAny + +2つのビットマップが交差しているか確認します。 + +`bitmap2`が正確に1つの要素を含む場合、[bitmapContains](#bitmapcontains)を使用することを検討してみてください。より効率的に動作します。 + +**構文** + +``` sql +bitmapHasAny(bitmap1, bitmap2) +``` + +**引数** + +- `bitmap1` – ビットマップオブジェクト1。 +- `bitmap2` – ビットマップオブジェクト2。 + +**返される値** + +- `1` - `bitmap1`と`bitmap2`が少なくとも1つの共有要素を持つ場合。 +- `0` - それ以外の場合。 + +**例** + +``` sql +SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapHasAll + +最初のビットマップが2番目のビットマップのすべての要素を含む場合は1を返し、そうでない場合は0を返します。 2番目のビットマップが空であれば、1を返します。 + +`hasAll(array, array)`も参照してください。 + +**構文** + +``` sql +bitmapHasAll(bitmap1, bitmap2) +``` + +**引数** + +- `bitmap1` – ビットマップオブジェクト1。 +- `bitmap2` – ビットマップオブジェクト2。 + +**例** + +``` sql +SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 0 │ +└─────┘ +``` + +## bitmapCardinality + +ビットマップのカーディナリティを返します。 + +**構文** + +``` sql +bitmapCardinality(bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 5 │ +└─────┘ +``` + +## bitmapMin + +ビットマップで設定されている最小のビットを算出し、ビットマップが空の場合はUINT32_MAXを返します。 + +**構文** + +```sql +bitmapMin(bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res; +``` + +結果: + +``` text + ┌─res─┐ + │ 1 │ + └─────┘ +``` + +## bitmapMax + +ビットマップで設定されている最大のビットを算出し、ビットマップが空の場合は0を返します。 + +**構文** + +```sql +bitmapMax(bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res; +``` + +結果: + +``` text + ┌─res─┐ + │ 5 │ + └─────┘ +``` + +## bitmapTransform + +ビットマップ内のビットを最大N個置き換えます。置き換えられるビットの古い値と新しい値は、それぞれ`from_array[i]`と`to_array[i]`で指定されます。 + +`from_array`と`to_array`の配列の順序によって結果が異なります。 + +**構文** + +``` sql +bitmapTransform(bitmap, from_array, to_array) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 +- `from_array` – UInt32配列。範囲\[0, from_array.size())内のidxについて、ビットマップがfrom_array\[idx\]を含む場合、それをto_array\[idx\]で置き換えます。 +- `to_array` – `from_array`と同じサイズのUInt32配列。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res; +``` + +結果: + +``` text + ┌─res───────────────────┐ + │ [1,3,4,6,7,8,9,10,20] │ + └───────────────────────┘ +``` + +## bitmapAnd + +2つのビットマップの論理積を計算します。 + +**構文** + +``` sql +bitmapAnd(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ [3] │ +└─────┘ +``` + +## bitmapOr + +2つのビットマップの論理和を計算します。 + +**構文** + +``` sql +bitmapOr(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res; +``` + +結果: + +``` text +┌─res─────────┐ +│ [1,2,3,4,5] │ +└─────────────┘ +``` + +## bitmapXor + +2つのビットマップの排他的論理和を計算します。 + +**構文** + +``` sql +bitmapXor(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res; +``` + +結果: + +``` text +┌─res───────┐ +│ [1,2,4,5] │ +└───────────┘ +``` + +## bitmapAndnot + +2つのビットマップの論理積を計算して結果を否定します。 + +**構文** + +``` sql +bitmapAndnot(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res; +``` + +結果: + +``` text +┌─res───┐ +│ [1,2] │ +└───────┘ +``` + +## bitmapAndCardinality + +2つのビットマップの論理積のカーディナリティを返します。 + +**構文** + +``` sql +bitmapAndCardinality(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## bitmapOrCardinality + +2つのビットマップの論理和のカーディナリティを返します。 + +``` sql +bitmapOrCardinality(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 5 │ +└─────┘ +``` + +## bitmapXorCardinality + +2つのビットマップの排他的論理和のカーディナリティを返します。 + +``` sql +bitmapXorCardinality(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 4 │ +└─────┘ +``` + +## bitmapAndnotCardinality + +2つのビットマップのAND-NOT操作のカーディナリティを返します。 + +``` sql +bitmapAndnotCardinality(bitmap,bitmap) +``` + +**引数** + +- `bitmap` – ビットマップオブジェクト。 + +**例** + +``` sql +SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 2 │ +└─────┘ +``` + diff --git a/docs/ja/sql-reference/functions/comparison-functions.md b/docs/ja/sql-reference/functions/comparison-functions.md new file mode 100644 index 00000000000..7f989f24f97 --- /dev/null +++ b/docs/ja/sql-reference/functions/comparison-functions.md @@ -0,0 +1,89 @@ +--- +slug: /ja/sql-reference/functions/comparison-functions +sidebar_position: 35 +sidebar_label: 比較 +--- + +# 比較関数 + +以下の比較関数は Uint8 として 0 または 1 を返します。 + +次のタイプが比較できます: +- 数値 +- 文字列と固定長文字列 +- 日付 +- 時間を含む日付 + +同じグループ内の値のみが比較可能です(例:UInt16 と UInt64)。しかし、異なるグループ間では比較できません(例:UInt16 と DateTime)。 + +文字列はバイト単位で比較されます。これは、一方の文字列がUTF-8エンコードされたマルチバイト文字を含む場合、予期しない結果を招くことがあります。 + +文字列 S1 が別の文字列 S2 をプレフィックスとして持つ場合、S1 は S2 よりも長いと見なされます。 + +## equals, `=`, `==` 演算子 {#equals} + +**構文** + +```sql +equals(a, b) +``` + +エイリアス: +- `a = b` (演算子) +- `a == b` (演算子) + +## notEquals, `!=`, `<>` 演算子 {#notequals} + +**構文** + +```sql +notEquals(a, b) +``` + +エイリアス: +- `a != b` (演算子) +- `a <> b` (演算子) + +## less, `<` 演算子 {#less} + +**構文** + +```sql +less(a, b) +``` + +エイリアス: +- `a < b` (演算子) + +## greater, `>` 演算子 {#greater} + +**構文** + +```sql +greater(a, b) +``` + +エイリアス: +- `a > b` (演算子) + +## lessOrEquals, `<=` 演算子 {#lessorequals} + +**構文** + +```sql +lessOrEquals(a, b) +``` + +エイリアス: +- `a <= b` (演算子) + +## greaterOrEquals, `>=` 演算子 {#greaterorequals} + +**構文** + +```sql +greaterOrEquals(a, b) +``` + +エイリアス: +- `a >= b` (演算子) diff --git a/docs/ja/sql-reference/functions/conditional-functions.md b/docs/ja/sql-reference/functions/conditional-functions.md new file mode 100644 index 00000000000..9bdc74beb38 --- /dev/null +++ b/docs/ja/sql-reference/functions/conditional-functions.md @@ -0,0 +1,267 @@ +--- +slug: /ja/sql-reference/functions/conditional-functions +sidebar_position: 40 +sidebar_label: 条件付き +--- + +# 条件付き関数 + +## if + +条件分岐を実行します。 + +条件 `cond` が非ゼロ値を評価する場合、関数は式 `then` の結果を返します。もし `cond` がゼロまたは `NULL` を評価する場合、`else` 式の結果が返されます。 + +[short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) を設定することでショートサーキット評価が使用されるかどうかを制御します。有効にすると、`then` 式は `cond` が `true` の行でのみ評価され、`else` 式は `cond` が `false` の行でのみ評価されます。例えば、ショートサーキット評価を使用すると、クエリ `SELECT if(number = 0, 0, intDiv(42, number)) FROM numbers(10)` を実行する際にゼロ除算例外が発生しません。 + +`then` と `else` は似た型である必要があります。 + +**構文** + +``` sql +if(cond, then, else) +``` +エイリアス: `cond ? then : else` (三項演算子) + +**引数** + +- `cond` – 評価される条件。UInt8, Nullable(UInt8) または NULL。 +- `then` – `condition` が真であるときに返される式。 +- `else` – `condition` が偽または NULL のときに返される式。 + +**返される値** + +条件 `cond` に依存して、`then` または `else` 式の結果を返します。 + +**例** + +``` sql +SELECT if(1, plus(2, 2), plus(2, 6)); +``` + +結果: + +``` text +┌─plus(2, 2)─┐ +│ 4 │ +└────────────┘ +``` + +## multiIf + +クエリ内で [CASE](../../sql-reference/operators/index.md#conditional-expression) 演算子をよりコンパクトに記述することができます。 + +**構文** + +``` sql +multiIf(cond_1, then_1, cond_2, then_2, ..., else) +``` + +[short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) を設定することでショートサーキット評価が使用されるかどうかを制御します。有効にすると、`then_i` 式は `((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}) AND cond_i)` が `true` の行でのみ評価され、`cond_i` は `((NOT cond_1) AND (NOT cond_2) AND ... AND (NOT cond_{i-1}))` が `true` の行でのみ評価されます。例えば、ショートサーキット評価を使用すると、クエリ `SELECT multiIf(number = 2, intDiv(1, number), number = 5) FROM numbers(10)` を実行する際にゼロ除算例外が発生しません。 + +**引数** + +この関数は `2N+1` のパラメーターを受け取ります: +- `cond_N` — `then_N` が返されるかどうかを制御する N 番目の評価条件。 +- `then_N` — `cond_N` が真であるときの関数の結果。 +- `else` — いずれの条件も真でない場合の関数の結果。 + +**返される値** + +条件 `cond_N` に依存して、`then_N` または `else` 式のいずれかの結果を返します。 + +**例** + +以下のテーブルを想定します: + +``` text +┌─left─┬─right─┐ +│ ᴺᵁᴸᴸ │ 4 │ +│ 1 │ 3 │ +│ 2 │ 2 │ +│ 3 │ 1 │ +│ 4 │ ᴺᵁᴸᴸ │ +└──────┴───────┘ +``` + +``` sql +SELECT + left, + right, + multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result +FROM LEFT_RIGHT + +┌─left─┬─right─┬─result──────────┐ +│ ᴺᵁᴸᴸ │ 4 │ Null value │ +│ 1 │ 3 │ left is smaller │ +│ 2 │ 2 │ Both equal │ +│ 3 │ 1 │ left is greater │ +│ 4 │ ᴺᵁᴸᴸ │ Null value │ +└──────┴───────┴─────────────────┘ +``` + +## 条件付き結果を直接使用する + +条件式は常に `0`, `1` または `NULL` に評価されます。そのため、条件式の結果を直接使用することができます: + +``` sql +SELECT left < right AS is_small +FROM LEFT_RIGHT + +┌─is_small─┐ +│ ᴺᵁᴸᴸ │ +│ 1 │ +│ 0 │ +│ 0 │ +│ ᴺᵁᴸᴸ │ +└──────────┘ +``` + +## 条件式における NULL 値 + +条件式に `NULL` 値が関与する場合、結果も `NULL` になります。 + +``` sql +SELECT + NULL < 1, + 2 < NULL, + NULL < NULL, + NULL = NULL + +┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└───────────────┴───────────────┴──────────────────┴────────────────────┘ +``` + +そのため、型が `Nullable` の場合はクエリを慎重に構築する必要があります。 + +以下の例では、`multiIf` に等しい条件を追加しないことでエラーを示します。 + +``` sql +SELECT + left, + right, + multiIf(left < right, 'left is smaller', left > right, 'right is smaller', 'Both equal') AS faulty_result +FROM LEFT_RIGHT + +┌─left─┬─right─┬─faulty_result────┐ +│ ᴺᵁᴸᴸ │ 4 │ Both equal │ +│ 1 │ 3 │ left is smaller │ +│ 2 │ 2 │ Both equal │ +│ 3 │ 1 │ right is smaller │ +│ 4 │ ᴺᵁᴸᴸ │ Both equal │ +└──────┴───────┴──────────────────┘ +``` + +## greatest + +値のリストから最大のものを返します。リストのメンバーはすべて比較可能な型でなければなりません。 + +例: + +```sql +SELECT greatest(1, 2, toUInt8(3), 3.) result, toTypeName(result) type; +``` +```response +┌─result─┬─type────┐ +│ 3 │ Float64 │ +└────────┴─────────┘ +``` + +:::note +返される型は Float64 であり、UInt8 は比較のために 64 ビットに昇格しなければならないためです。 +::: + +```sql +SELECT greatest(['hello'], ['there'], ['world']) +``` +```response +┌─greatest(['hello'], ['there'], ['world'])─┐ +│ ['world'] │ +└───────────────────────────────────────────┘ +``` + +```sql +SELECT greatest(toDateTime32(now() + toIntervalDay(1)), toDateTime64(now(), 3)) +``` +```response +┌─greatest(toDateTime32(plus(now(), toIntervalDay(1))), toDateTime64(now(), 3))─┐ +│ 2023-05-12 01:16:59.000 │ +└──---──────────────────────────────────────────────────────────────────────────┘ +``` + +:::note +返される型は DateTime64 であり、DataTime32 は比較のために 64 ビットに昇格しなければならないためです。 +::: + +## least + +値のリストから最小のものを返します。リストのメンバーはすべて比較可能な型でなければなりません。 + +例: + +```sql +SELECT least(1, 2, toUInt8(3), 3.) result, toTypeName(result) type; +``` +```response +┌─result─┬─type────┐ +│ 1 │ Float64 │ +└────────┴─────────┘ +``` + +:::note +返される型は Float64 であり、UInt8 は比較のために 64 ビットに昇格しなければならないためです。 +::: + +```sql +SELECT least(['hello'], ['there'], ['world']) +``` +```response +┌─least(['hello'], ['there'], ['world'])─┐ +│ ['hello'] │ +└────────────────────────────────────────┘ +``` + +```sql +SELECT least(toDateTime32(now() + toIntervalDay(1)), toDateTime64(now(), 3)) +``` +```response +┌─least(toDateTime32(plus(now(), toIntervalDay(1))), toDateTime64(now(), 3))─┐ +│ 2023-05-12 01:16:59.000 │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +:::note +返される型は DateTime64 であり、DataTime32 は比較のために 64 ビットに昇格しなければならないためです。 +::: + +## clamp + +返される値を A と B の間に制約します。 + +**構文** + +``` sql +clamp(value, min, max) +``` + +**引数** + +- `value` – 入力値。 +- `min` – 下限の制限。 +- `max` – 上限の制限。 + +**返される値** + +値が最小値より小さい場合、最小値を返し、最大値より大きい場合、最大値を返します。さもなければ、現在の値を返します。 + +例: + +```sql +SELECT clamp(1, 2, 3) result, toTypeName(result) type; +``` +```response +┌─result─┬─type────┐ +│ 2 │ Float64 │ +└────────┴─────────┘ +``` diff --git a/docs/ja/sql-reference/functions/date-time-functions.md b/docs/ja/sql-reference/functions/date-time-functions.md new file mode 100644 index 00000000000..b180666a986 --- /dev/null +++ b/docs/ja/sql-reference/functions/date-time-functions.md @@ -0,0 +1,4890 @@ +--- +slug: /ja/sql-reference/functions/date-time-functions +sidebar_position: 45 +sidebar_label: 日付と時刻 +--- + +# 日付と時刻を操作するための関数 + +このセクションのほとんどの関数は、オプションのタイムゾーン引数を受け入れます。例: `Europe/Amsterdam`。この場合、タイムゾーンは指定されたものであり、ローカル(デフォルト)のものではありません。 + +**例** + +```sql +SELECT + toDateTime('2016-06-15 23:00:00') AS time, + toDate(time) AS date_local, + toDate(time, 'Asia/Yekaterinburg') AS date_yekat, + toString(time, 'US/Samoa') AS time_samoa +``` + +```text +┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐ +│ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │ +└─────────────────────┴────────────┴────────────┴─────────────────────┘ +``` + +## makeDate + +[Date](../data-types/date.md)を作成します。 +- 年、月、日を引数として指定する場合、または +- 年と年内の日を引数として指定する場合。 + +**構文** + +```sql +makeDate(year, month, day); +makeDate(year, day_of_year); +``` + +エイリアス: +- `MAKEDATE(year, month, day);` +- `MAKEDATE(year, day_of_year);` + +**引数** + +- `year` — 年。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `month` — 月。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `day` — 日。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `day_of_year` — 年内の日。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 + +**返される値** + +- 引数から作成された日付。[Date](../data-types/date.md)。 + +**例** + +年、月、日からDateを作成します: + +```sql +SELECT makeDate(2023, 2, 28) AS Date; +``` + +結果: + +```text +┌───────date─┐ +│ 2023-02-28 │ +└────────────┘ +``` + +年と年内の日を引数としてDateを作成します: + +```sql +SELECT makeDate(2023, 42) AS Date; +``` + +結果: + +```text +┌───────date─┐ +│ 2023-02-11 │ +└────────────┘ +``` + +## makeDate32 + +年、月、日(またはオプションとして年と日)から[Date32](../../sql-reference/data-types/date32.md)型の日付を作成します。 + +**構文** + +```sql +makeDate32(year, [month,] day) +``` + +**引数** + +- `year` — 年。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `month` — 月(オプション)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `day` — 日。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 + +:::note +`month`が省略された場合、`day`は`1`から`365`の値を取る必要があります。そうでなければ、`1`から`31`の値を取る必要があります。 +::: + +**返される値** + +- 引数から作成された日付。[Date32](../../sql-reference/data-types/date32.md)。 + +**例** + +年、月、日から日付を作成します: + +クエリ: + +```sql +SELECT makeDate32(2024, 1, 1); +``` + +結果: + +```response +2024-01-01 +``` + +年と年内の日からDateを作成します: + +クエリ: + +```sql +SELECT makeDate32(2024, 100); +``` + +結果: + +```response +2024-04-09 +``` + +## makeDateTime + +年、月、日、時、分、秒の引数から[DateTime](../data-types/datetime.md)を作成します。 + +**構文** + +```sql +makeDateTime(year, month, day, hour, minute, second[, timezone]) +``` + +**引数** + +- `year` — 年。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `month` — 月。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `day` — 日。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `hour` — 時。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `minute` — 分。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `second` — 秒。[Integer](../data-types/int-uint.md)、[Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 +- `timezone` — 返される値の[タイムゾーン](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +**返される値** + +- 引数から作成された日付と時刻。[DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT makeDateTime(2023, 2, 28, 17, 12, 33) AS DateTime; +``` + +結果: + +```text +┌────────────DateTime─┐ +│ 2023-02-28 17:12:33 │ +└─────────────────────┘ +``` + +## makeDateTime64 + +コンポーネントから[DateTime64](../../sql-reference/data-types/datetime64.md)のデータ型の値を作成します:年、月、日、時、分、秒。オプションで小数点以下の精度を持ちます。 + +**構文** + +```sql +makeDateTime64(year, month, day, hour, minute, second[, precision]) +``` + +**引数** + +- `year` — 年(0-9999)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `month` — 月(1-12)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `day` — 日(1-31)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `hour` — 時(0-23)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `minute` — 分(0-59)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `second` — 秒(0-59)。[Integer](../../sql-reference/data-types/int-uint.md)、[Float](../../sql-reference/data-types/float.md) または [Decimal](../../sql-reference/data-types/decimal.md)。 +- `precision` — 小数点以下のコンポーネントのオプションの精度(0-9)。[Integer](../../sql-reference/data-types/int-uint.md)。 + +**返される値** + +- 引数から作成された日付と時刻。[DateTime64](../../sql-reference/data-types/datetime64.md)。 + +**例** + +```sql +SELECT makeDateTime64(2023, 5, 15, 10, 30, 45, 779, 5); +``` + +```response +┌─makeDateTime64(2023, 5, 15, 10, 30, 45, 779, 5)─┐ +│ 2023-05-15 10:30:45.00779 │ +└─────────────────────────────────────────────────┘ +``` + +## timestamp + +最初の引数'expr'を[DateTime64(6)](../data-types/datetime64.md)型に変換します。 +2番目の引数'expr_time'が指定されている場合、変換された値に指定された時間を加えます。 + +**構文** + +```sql +timestamp(expr[, expr_time]) +``` + +エイリアス: `TIMESTAMP` + +**引数** + +- `expr` - 日付または日時。[String](../data-types/string.md)。 +- `expr_time` - オプションのパラメータ。加える時間。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT timestamp('2023-12-31') as ts; +``` + +結果: + +```text +┌─────────────────────────ts─┐ +│ 2023-12-31 00:00:00.000000 │ +└────────────────────────────┘ +``` + +```sql +SELECT timestamp('2023-12-31 12:00:00', '12:00:00.11') as ts; +``` + +結果: + +```text +┌─────────────────────────ts─┐ +│ 2024-01-01 00:00:00.110000 │ +└────────────────────────────┘ +``` + +**返される値** + +- [DateTime64](../data-types/datetime64.md)(6) + +## timeZone + +現在のセッションのタイムゾーン、すなわち設定の値[session_timezone](../../operations/settings/settings.md#session_timezone)を返します。 +分散テーブルのコンテキストで関数が実行されると、各シャードに関連する値を持つ通常のカラムが生成されます。そうでなければ定数値が生成されます。 + +**構文** + +```sql +timeZone() +``` + +エイリアス: `timezone`. + +**返される値** + +- タイムゾーン。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT timezone() +``` + +結果: + +```response +┌─timezone()─────┐ +│ America/Denver │ +└────────────────┘ +``` + +**参照** + +- [serverTimeZone](#servertimezone) + +## serverTimeZone + +サーバのタイムゾーン、すなわち設定の値[timezone](../../operations/server-configuration-parameters/settings.md#timezone)を返します。 +分散テーブルのコンテキストで関数が実行されると、各シャードに関連する値を持つ通常のカラムが生成されます。そうでなければ定数値が生成されます。 + +**構文** + +```sql +serverTimeZone() +``` + +エイリアス: `serverTimezone`. + +**返される値** + +- タイムゾーン。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT serverTimeZone() +``` + +結果: + +```response +┌─serverTimeZone()─┐ +│ UTC │ +└──────────────────┘ +``` + +**参照** + +- [timeZone](#timezone) + +## toTimeZone + +日付または日時を指定されたタイムゾーンに変換します。データの内部値(Unix秒の数)は変更せず、値のタイムゾーン属性と値の文字列表現のみが変更されます。 + +**構文** + +```sql +toTimezone(value, timezone) +``` + +エイリアス: `toTimezone`. + +**引数** + +- `value` — 時刻または日付と時刻。[DateTime64](../data-types/datetime64.md)。 +- `timezone` — 返される値のタイムゾーン。[String](../data-types/string.md)。この引数は定数です。`toTimezone`はカラムのタイムゾーンを変更するため(タイムゾーンは`DateTime*`型の属性です)。 + +**返される値** + +- 日付と時刻。[DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, + toTypeName(time_utc) AS type_utc, + toInt32(time_utc) AS int32utc, + toTimeZone(time_utc, 'Asia/Yekaterinburg') AS time_yekat, + toTypeName(time_yekat) AS type_yekat, + toInt32(time_yekat) AS int32yekat, + toTimeZone(time_utc, 'US/Samoa') AS time_samoa, + toTypeName(time_samoa) AS type_samoa, + toInt32(time_samoa) AS int32samoa +FORMAT Vertical; +``` + +結果: + +```text +Row 1: +────── +time_utc: 2019-01-01 00:00:00 +type_utc: DateTime('UTC') +int32utc: 1546300800 +time_yekat: 2019-01-01 05:00:00 +type_yekat: DateTime('Asia/Yekaterinburg') +int32yekat: 1546300800 +time_samoa: 2018-12-31 13:00:00 +type_samoa: DateTime('US/Samoa') +int32samoa: 1546300800 +``` + +**参照** + +- [formatDateTime](#formatdatetime) - 非定数のタイムゾーンをサポートします。 +- [toString](type-conversion-functions.md#tostring) - 非定数のタイムゾーンをサポートします。 + +## timeZoneOf + +[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)データ型のタイムゾーン名を返します。 + +**構文** + +```sql +timeZoneOf(value) +``` + +エイリアス: `timezoneOf`. + +**引数** + +- `value` — 日付と時刻。[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- タイムゾーン名。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT timezoneOf(now()); +``` + +結果: +```text +┌─timezoneOf(now())─┐ +│ Etc/UTC │ +└───────────────────┘ +``` + +## timeZoneOffset + +[UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)からの秒単位のタイムゾーンオフセットを返します。 +関数は指定された日時における[夏時間](https://en.wikipedia.org/wiki/Daylight_saving_time)および過去のタイムゾーンの変化を考慮します。 +オフセットを計算するために[IANAタイムゾーンデータベース](https://www.iana.org/time-zones)が使用されます。 + +**構文** + +```sql +timeZoneOffset(value) +``` + +エイリアス: `timezoneOffset`. + +**引数** + +- `value` — 日付と時刻。[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- UTCからの秒単位のオフセット。[Int32](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toDateTime('2021-04-21 10:20:30', 'America/New_York') AS Time, toTypeName(Time) AS Type, + timeZoneOffset(Time) AS Offset_in_seconds, (Offset_in_seconds / 3600) AS Offset_in_hours; +``` + +結果: + +```text +┌────────────────Time─┬─Type─────────────────────────┬─Offset_in_seconds─┬─Offset_in_hours─┐ +│ 2021-04-21 10:20:30 │ DateTime('America/New_York') │ -14400 │ -4 │ +└─────────────────────┴──────────────────────────────┴───────────────────┴─────────────────┘ +``` + +## toYear + +日付または日時の年成分(西暦)を返します。 + +**構文** + +```sql +toYear(value) +``` + +エイリアス: `YEAR` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の年。[UInt16](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toYear(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toYear(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023 │ +└───────────────────────────────────────────┘ +``` + +## toQuarter + +日付または日時の四半期(1-4)を返します。 + +**構文** + +```sql +toQuarter(value) +``` + +エイリアス: `QUARTER` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の四半期(1、2、3または4)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toQuarter(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toQuarter(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2 │ +└──────────────────────────────────────────────┘ +``` + +## toMonth + +日付または日時の月成分(1-12)を返します。 + +**構文** + +```sql +toMonth(value) +``` + +エイリアス: `MONTH` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の月(1-12)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toMonth(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toMonth(toDateTime('2023-04-21 10:20:30'))─┐ +│ 4 │ +└────────────────────────────────────────────┘ +``` + +## toDayOfYear + +日付または日時の年内の日の数(1-366)を返します。 + +**構文** + +```sql +toDayOfYear(value) +``` + +エイリアス: `DAYOFYEAR` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の年内の日(1-366)。[UInt16](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toDayOfYear(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toDayOfYear(toDateTime('2023-04-21 10:20:30'))─┐ +│ 111 │ +└────────────────────────────────────────────────┘ +``` + +## toDayOfMonth + +日付または日時の月内の日の数(1-31)を返します。 + +**構文** + +```sql +toDayOfMonth(value) +``` + +エイリアス: `DAYOFMONTH`, `DAY` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の月内の日(1-31)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toDayOfMonth(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toDayOfMonth(toDateTime('2023-04-21 10:20:30'))─┐ +│ 21 │ +└─────────────────────────────────────────────────┘ +``` + +## toDayOfWeek + +日付または日時の週内の日の数を返します。 + +`toDayOfWeek()`の2引数形式により、週の始まりが月曜日か日曜日か、返される値が0から6の範囲か1から7の範囲かを指定できます。モード引数が省略された場合、デフォルトモードは0です。日付のタイムゾーンは、3番目の引数として指定できます。 + +| モード | 週の始まり | 範囲 | +|------|-------------------|------------------------------------------------| +| 0 | 月曜日 | 1-7: 月曜日 = 1, 火曜日 = 2, ..., 日曜日 = 7 | +| 1 | 月曜日 | 0-6: 月曜日 = 0, 火曜日 = 1, ..., 日曜日 = 6 | +| 2 | 日曜日 | 0-6: 日曜日 = 0, 月曜日 = 1, ..., 土曜日 = 6 | +| 3 | 日曜日 | 1-7: 日曜日 = 1, 月曜日 = 2, ..., 土曜日 = 7 | + +**構文** + +```sql +toDayOfWeek(t[, mode[, timezone]]) +``` + +エイリアス: `DAYOFWEEK`. + +**引数** + +- `t` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 +- `mode` - 週の最初の日を決定します。可能な値は0、1、2または3です。上記の表を参照してください。 +- `timezone` - オプションのパラメータであり、他の変換関数と同様に機能します。 + +最初の引数は、[parseDateTime64BestEffort()](type-conversion-functions.md#parsedatetime64besteffort)によってサポートされる形式の[String](../data-types/string.md)としても指定できます。文字列引数のサポートは、特定のサードパーティツールが期待するMySQLとの互換性のために存在します。将来的に文字列引数のサポートが新しいMySQL互換設定に依存する可能性があり、文字列の解析は一般的に遅いため、使用しないことを推奨します。 + +**返される値** + +- 指定された日付/時刻の週の曜日(1-7)、選択したモードに応じて。 + +**例** + +以下の日付は2023年4月21日で、金曜日でした: + +```sql +SELECT + toDayOfWeek(toDateTime('2023-04-21')), + toDayOfWeek(toDateTime('2023-04-21'), 1) +``` + +結果: + +```response +┌─toDayOfWeek(toDateTime('2023-04-21'))─┬─toDayOfWeek(toDateTime('2023-04-21'), 1)─┐ +│ 5 │ 4 │ +└───────────────────────────────────────┴──────────────────────────────────────────┘ +``` + +## toHour + +日付時刻の時間成分(0-24)を返します。 + +時計が進められる場合、1時間進むと2時に発生し、時計が戻される場合、1時間戻ると3時に発生することが前提とされます(これは常に正確になるわけではなく、タイムゾーンによって異なります)。 + +**構文** + +```sql +toHour(value) +``` + +エイリアス: `HOUR` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の時間(0-23)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toHour(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toHour(toDateTime('2023-04-21 10:20:30'))─┐ +│ 10 │ +└───────────────────────────────────────────┘ +``` + +## toMinute + +日時の分成分(0-59)を返します。 + +**構文** + +```sql +toMinute(value) +``` + +エイリアス: `MINUTE` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の時間の分(0-59)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toMinute(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toMinute(toDateTime('2023-04-21 10:20:30'))─┐ +│ 20 │ +└─────────────────────────────────────────────┘ +``` + +## toSecond + +日時の秒成分(0-59)を返します。うるう秒は考慮されません。 + +**構文** + +```sql +toSecond(value) +``` + +エイリアス: `SECOND` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の分の秒(0-59)。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT toSecond(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toSecond(toDateTime('2023-04-21 10:20:30'))─┐ +│ 30 │ +└─────────────────────────────────────────────┘ +``` + +## toMillisecond + +日時のミリ秒成分(0-999)を返します。 + +**構文** + +```sql +toMillisecond(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +エイリアス: `MILLISECOND` + +```sql +SELECT toMillisecond(toDateTime64('2023-04-21 10:20:30.456', 3)) +``` + +結果: + +```response +┌──toMillisecond(toDateTime64('2023-04-21 10:20:30.456', 3))─┐ +│ 456 │ +└────────────────────────────────────────────────────────────┘ +``` + +**返される値** + +- 指定された日付/時刻の分のミリ秒(0-999)。[UInt16](../data-types/int-uint.md)。 + +## toUnixTimestamp + +文字列、日付、または日時を[Unixタイムスタンプ](https://en.wikipedia.org/wiki/Unix_time)に変換し、`UInt32`表現で返します。 + +関数が文字列として呼び出されると、オプションのタイムゾーン引数を受け入れます。 + +**構文** + +```sql +toUnixTimestamp(date) +toUnixTimestamp(str, [timezone]) +``` + +**返される値** + +- Unixタイムスタンプを返します。[UInt32](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT + '2017-11-05 08:07:47' AS dt_str, + toUnixTimestamp(dt_str) AS from_str, + toUnixTimestamp(dt_str, 'Asia/Tokyo') AS from_str_tokyo, + toUnixTimestamp(toDateTime(dt_str)) AS from_datetime, + toUnixTimestamp(toDateTime64(dt_str, 0)) AS from_datetime64, + toUnixTimestamp(toDate(dt_str)) AS from_date, + toUnixTimestamp(toDate32(dt_str)) AS from_date32 +FORMAT Vertical; +``` + +結果: + +```text +Row 1: +────── +dt_str: 2017-11-05 08:07:47 +from_str: 1509869267 +from_str_tokyo: 1509836867 +from_datetime: 1509869267 +from_datetime64: 1509869267 +from_date: 1509840000 +from_date32: 1509840000 +``` + +:::note +`toStartOf*`、`toLastDayOf*`、`toMonday`、`timeSlot`関数の返り値の型は、構成パラメータ[enable_extended_results_for_datetime_functions](../../operations/settings/settings.md#enable-extended-results-for-datetime-functions)によって決まります。このパラメータはデフォルトで`0`です。 + +動作は以下の通りです: +* `enable_extended_results_for_datetime_functions = 0`の場合: + * `toStartOfYear`、`toStartOfISOYear`、`toStartOfQuarter`、`toStartOfMonth`、`toStartOfWeek`、`toLastDayOfWeek`、`toLastDayOfMonth`、`toMonday`は、引数が`Date`または`DateTime`であれば`Date`または`DateTime`を返し、引数が`Date32`または`DateTime64`であれば`Date32`または`DateTime64`を返します。 + * `toStartOfDay`、`toStartOfHour`、`toStartOfFifteenMinutes`、`toStartOfTenMinutes`、`toStartOfFiveMinutes`、`toStartOfMinute`、`timeSlot`は、引数が`Date`または`DateTime`であれば`DateTime`を返し、引数が`Date32`または`DateTime64`であれば`DateTime64`を返します。 +::: + +## toStartOfYear + +日付または日時を年の最初の日に切り捨てます。日付を`Date`オブジェクトとして返します。 + +**構文** + +```sql +toStartOfYear(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 入力された日付/時刻の年の最初の日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT toStartOfYear(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toStartOfYear(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-01-01 │ +└──────────────────────────────────────────────────┘ +``` + +## toStartOfISOYear + +日付または日時をISO年の最初の日に切り捨てます。これは「通常」の年とは異なる場合があります。(参照: [https://en.wikipedia.org/wiki/ISO_week_date](https://en.wikipedia.org/wiki/ISO_week_date))。 + +**構文** + +```sql +toStartOfISOYear(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 入力された日付/時刻の年の最初の日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT toStartOfISOYear(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toStartOfISOYear(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-01-02 │ +└─────────────────────────────────────────────────────┘ +``` + +## toStartOfQuarter + +日付または日時を四半期の最初の日に切り捨てます。四半期の最初の日は、1月1日、4月1日、7月1日、または10月1日です。 +日付を返します。 + +**構文** + +```sql +toStartOfQuarter(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の四半期の最初の日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT toStartOfQuarter(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toStartOfQuarter(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-04-01 │ +└─────────────────────────────────────────────────────┘ +``` + +## toStartOfMonth + +日付または日時を月の最初の日に切り捨てます。日付を返します。 + +**構文** + +```sql +toStartOfMonth(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の月の最初の日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT toStartOfMonth(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toStartOfMonth(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-04-01 │ +└───────────────────────────────────────────────────┘ +``` + +:::note +不正な日付を解析する際の動作は実装に特有です。ClickHouseはゼロの日付を返すか、例外をスローするか、「自然」オーバーフローを行う可能性があります。 +::: + +## toLastDayOfMonth + +日付または日時を月の最終日に切り上げます。日付を返します。 + +**構文** + +```sql +toLastDayOfMonth(value) +``` + +エイリアス: `LAST_DAY` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の月の最終日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT toLastDayOfMonth(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toLastDayOfMonth(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-04-30 │ +└─────────────────────────────────────────────────────┘ +``` + +## toMonday + +日付または日時を最寄りの月曜日に切り捨てます。日付を返します。 + +**構文** + +```sql +toMonday(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 指定された日付/時刻の最寄りの日付(またはそれ以前)の月曜日。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT + toMonday(toDateTime('2023-04-21 10:20:30')), /* 金曜日 */ + toMonday(toDate('2023-04-24')), /* すでに月曜日 */ +``` + +結果: + +```response +┌─toMonday(toDateTime('2023-04-21 10:20:30'))─┬─toMonday(toDate('2023-04-24'))─┐ +│ 2023-04-17 │ 2023-04-24 │ +└─────────────────────────────────────────────┴────────────────────────────────┘ +``` + +## toStartOfWeek + +日付または日時を最寄りの日曜日または月曜日に切り捨てます。日付を返します。モード引数は`toWeek()`関数のモード引数と同じように機能します。モードが指定されていない場合、デフォルトは0になります。 + +**構文** + +```sql +toStartOfWeek(t[, mode[, timezone]]) +``` + +**引数** + +- `t` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md)または[DateTime64](../data-types/datetime64.md)。 +- `mode` - 最初の日を決定します。`toWeek()`関数の説明を参照してください。 +- `timezone` - オプションのパラメータであり、他の変換関数と同様に機能します。 + +**返される値** + +- 指定された日付に対する日曜日または月曜日の日付(またはそれ以前の日付)。[Date](../data-types/date.md)。 + +**例** + +```sql +SELECT + toStartOfWeek(toDateTime('2023-04-21 10:20:30')), /* 金曜日 */ + toStartOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* 金曜日 */ + toStartOfWeek(toDate('2023-04-24')), /* 月曜日 */ + toStartOfWeek(toDate('2023-04-24'), 1) /* 月曜日 */ +FORMAT Vertical +``` + +結果: + +```response +Row 1: +────── +toStartOfWeek(toDateTime('2023-04-21 10:20:30')): 2023-04-16 +toStartOfWeek(toDateTime('2023-04-21 10:20:30'), 1): 2023-04-17 +toStartOfWeek(toDate('2023-04-24')): 2023-04-23 +toStartOfWeek(toDate('2023-04-24'), 1): 2023-04-24 +``` +``` + +**引数** + +- `t` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `mode` - [toWeek](#toweek) 関数で説明されている通り、週の最後の日を決定します +- `timezone` - オプションのパラメータで、他の変換関数と同様に動作します + +**返される値** + +- 指定された日付に基づく、最も近い日曜日または月曜日の日付。 [Date](../data-types/date.md)。 + +**例** + +```sql +SELECT + toLastDayOfWeek(toDateTime('2023-04-21 10:20:30')), /* 金曜日 */ + toLastDayOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* 金曜日 */ + toLastDayOfWeek(toDate('2023-04-22')), /* 土曜日 */ + toLastDayOfWeek(toDate('2023-04-22'), 1) /* 土曜日 */ +FORMAT Vertical +``` + +結果: + +```response +行 1: +────── +toLastDayOfWeek(toDateTime('2023-04-21 10:20:30')): 2023-04-22 +toLastDayOfWeek(toDateTime('2023-04-21 10:20:30'), 1): 2023-04-23 +toLastDayOfWeek(toDate('2023-04-22')): 2023-04-22 +toLastDayOfWeek(toDate('2023-04-22'), 1): 2023-04-23 +``` + +## toStartOfDay + +時間を含む日付を、日付の開始時刻に切り下げます。 + +**構文** + +```sql +toStartOfDay(value) +``` + +**引数** + +- `value` - [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT toStartOfDay(toDateTime('2023-04-21 10:20:30')) +``` + +結果: + +```response +┌─toStartOfDay(toDateTime('2023-04-21 10:20:30'))─┐ +│ 2023-04-21 00:00:00 │ +└─────────────────────────────────────────────────┘ +``` + +## toStartOfHour + +時間を含む日付を、時刻の開始に切り下げます。 + +**構文** + +```sql +toStartOfHour(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT + toStartOfHour(toDateTime('2023-04-21 10:20:30')), + toStartOfHour(toDateTime64('2023-04-21', 6)) +``` + +結果: + +```response +┌─toStartOfHour(toDateTime('2023-04-21 10:20:30'))─┬─toStartOfHour(toDateTime64('2023-04-21', 6))─┐ +│ 2023-04-21 10:00:00 │ 2023-04-21 00:00:00 │ +└──────────────────────────────────────────────────┴──────────────────────────────────────────────┘ +``` + +## toStartOfMinute + +時間を含む日付を、分の開始に切り下げます。 + +**構文** + +```sql +toStartOfMinute(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT + toStartOfMinute(toDateTime('2023-04-21 10:20:30')), + toStartOfMinute(toDateTime64('2023-04-21 10:20:30.5300', 8)) +FORMAT Vertical +``` + +結果: + +```response +行 1: +────── +toStartOfMinute(toDateTime('2023-04-21 10:20:30')): 2023-04-21 10:20:00 +toStartOfMinute(toDateTime64('2023-04-21 10:20:30.5300', 8)): 2023-04-21 10:20:00 +``` + +## toStartOfSecond + +サブ秒を切り捨てます。 + +**構文** + +``` sql +toStartOfSecond(value, [timezone]) +``` + +**引数** + +- `value` — 日付と時刻。[DateTime64](../data-types/datetime64.md)。 +- `timezone` — 返される値の [Timezone](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。指定されていない場合、この関数は `value` パラメータのタイムゾーンを使用します。[String](../data-types/string.md)。 + +**返される値** + +- サブ秒を持たない入力値。[DateTime64](../data-types/datetime64.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 +SELECT toStartOfSecond(dt64); +``` + +結果: + +``` text +┌───toStartOfSecond(dt64)─┐ +│ 2020-01-01 10:20:30.000 │ +└─────────────────────────┘ +``` + +タイムゾーンありのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 +SELECT toStartOfSecond(dt64, 'Asia/Istanbul'); +``` + +結果: + +``` text +┌─toStartOfSecond(dt64, 'Asia/Istanbul')─┐ +│ 2020-01-01 13:20:30.000 │ +└────────────────────────────────────────┘ +``` + +**参照** + +- [Timezone](../../operations/server-configuration-parameters/settings.md#timezone) サーバー構成パラメータ。 + +## toStartOfMillisecond + +時間を含む日付を、ミリ秒の開始に切り下げます。 + +**構文** + +``` sql +toStartOfMillisecond(value, [timezone]) +``` + +**引数** + +- `value` — 日付と時刻。[DateTime64](../../sql-reference/data-types/datetime64.md)。 +- `timezone` — 返される値の [Timezone](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。指定されていない場合、この関数は `value` パラメータのタイムゾーンを使用します。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- サブミリ秒を持つ入力値。[DateTime64](../../sql-reference/data-types/datetime64.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfMillisecond(dt64); +``` + +結果: + +``` text +┌────toStartOfMillisecond(dt64)─┐ +│ 2020-01-01 10:20:30.999000000 │ +└───────────────────────────────┘ +``` + +タイムゾーンありのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfMillisecond(dt64, 'Asia/Istanbul'); +``` + +結果: + +``` text +┌─toStartOfMillisecond(dt64, 'Asia/Istanbul')─┐ +│ 2020-01-01 12:20:30.999000000 │ +└─────────────────────────────────────────────┘ +``` + +**参照** + +- [Timezone](../../operations/server-configuration-parameters/settings.md#timezone) サーバー構成パラメータ。 + +## toStartOfMicrosecond + +時間を含む日付を、マイクロ秒の開始に切り下げます。 + +**構文** + +``` sql +toStartOfMicrosecond(value, [timezone]) +``` + +**引数** + +- `value` — 日付と時刻。[DateTime64](../../sql-reference/data-types/datetime64.md)。 +- `timezone` — 返される値の [Timezone](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。指定されていない場合、この関数は `value` パラメータのタイムゾーンを使用します。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- サブマイクロ秒を持つ入力値。[DateTime64](../../sql-reference/data-types/datetime64.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfMicrosecond(dt64); +``` + +結果: + +``` text +┌────toStartOfMicrosecond(dt64)─┐ +│ 2020-01-01 10:20:30.999999000 │ +└───────────────────────────────┘ +``` + +タイムゾーンありのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfMicrosecond(dt64, 'Asia/Istanbul'); +``` + +結果: + +``` text +┌─toStartOfMicrosecond(dt64, 'Asia/Istanbul')─┐ +│ 2020-01-01 12:20:30.999999000 │ +└─────────────────────────────────────────────┘ +``` + +**参照** + +- [Timezone](../../operations/server-configuration-parameters/settings.md#timezone) サーバー構成パラメータ。 + +## toStartOfNanosecond + +時間を含む日付を、ナノ秒の開始に切り下げます。 + +**構文** + +``` sql +toStartOfNanosecond(value, [timezone]) +``` + +**引数** + +- `value` — 日付と時刻。[DateTime64](../../sql-reference/data-types/datetime64.md)。 +- `timezone` — 返される値の [Timezone](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。指定されていない場合、この関数は `value` パラメータのタイムゾーンを使用します。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- ナノ秒を持つ入力値。[DateTime64](../../sql-reference/data-types/datetime64.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfNanosecond(dt64); +``` + +結果: + +``` text +┌─────toStartOfNanosecond(dt64)─┐ +│ 2020-01-01 10:20:30.999999999 │ +└───────────────────────────────┘ +``` + +タイムゾーンありのクエリ: + +``` sql +WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64 +SELECT toStartOfNanosecond(dt64, 'Asia/Istanbul'); +``` + +結果: + +``` text +┌─toStartOfNanosecond(dt64, 'Asia/Istanbul')─┐ +│ 2020-01-01 12:20:30.999999999 │ +└────────────────────────────────────────────┘ +``` + +**参照** + +- [Timezone](../../operations/server-configuration-parameters/settings.md#timezone) サーバー構成パラメータ。 + +## toStartOfFiveMinutes + +時間を含む日付を、5分の開始に切り下げます。 + +**構文** + +```sql +toStartOfFiveMinutes(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の5分の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT + toStartOfFiveMinutes(toDateTime('2023-04-21 10:17:00')), + toStartOfFiveMinutes(toDateTime('2023-04-21 10:20:00')), + toStartOfFiveMinutes(toDateTime('2023-04-21 10:23:00')) +FORMAT Vertical +``` + +結果: + +```response +行 1: +────── +toStartOfFiveMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:15:00 +toStartOfFiveMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:20:00 +toStartOfFiveMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:20:00 +``` + +## toStartOfTenMinutes + +時間を含む日付を、10分の開始に切り下げます。 + +**構文** + +```sql +toStartOfTenMinutes(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の10分の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT + toStartOfTenMinutes(toDateTime('2023-04-21 10:17:00')), + toStartOfTenMinutes(toDateTime('2023-04-21 10:20:00')), + toStartOfTenMinutes(toDateTime('2023-04-21 10:23:00')) +FORMAT Vertical +``` + +結果: + +```response +行 1: +────── +toStartOfTenMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:10:00 +toStartOfTenMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:20:00 +toStartOfTenMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:20:00 +``` + +## toStartOfFifteenMinutes + +時間を含む日付を、15分の開始に切り下げます。 + +**構文** + +```sql +toStartOfFifteenMinutes(value) +``` + +**引数** + +- `value` - [DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 指定された日付/時間の15分の開始時刻。 [DateTime](../data-types/datetime.md)。 + +**例** + +```sql +SELECT + toStartOfFifteenMinutes(toDateTime('2023-04-21 10:17:00')), + toStartOfFifteenMinutes(toDateTime('2023-04-21 10:20:00')), + toStartOfFifteenMinutes(toDateTime('2023-04-21 10:23:00')) +FORMAT Vertical +``` + +結果: + +```response +行 1: +────── +toStartOfFifteenMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:15:00 +toStartOfFifteenMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:15:00 +toStartOfFifteenMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:15:00 +``` + +## toStartOfInterval + +この関数は `toStartOf*()` 関数を一般化し、 `toStartOfInterval(date_or_date_with_time, INTERVAL x unit [, time_zone])` 構文を使用します。 +例えば、 +- `toStartOfInterval(t, INTERVAL 1 YEAR)` は `toStartOfYear(t)` と同じ結果を返します +- `toStartOfInterval(t, INTERVAL 1 MONTH)` は `toStartOfMonth(t)` と同じ結果を返します +- `toStartOfInterval(t, INTERVAL 1 DAY)` は `toStartOfDay(t)` と同じ結果を返します +- `toStartOfInterval(t, INTERVAL 15 MINUTE)` は `toStartOfFifteenMinutes(t)` と同じ結果を返します + +計算は特定の時点に対して行われます。 + +| インターバル | 開始 | +|-------------|--------------------------| +| YEAR | 年 0 | +| QUARTER | 1900年第1四半期 | +| MONTH | 1900年1月 | +| WEEK | 1970年第1週(01-05) | +| DAY | 1970-01-01 | +| HOUR | (*) | +| MINUTE | 1970-01-01 00:00:00 | +| SECOND | 1970-01-01 00:00:00 | +| MILLISECOND | 1970-01-01 00:00:00 | +| MICROSECOND | 1970-01-01 00:00:00 | +| NANOSECOND | 1970-01-01 00:00:00 | + +(*) 時間インターバルは特別です: 計算は常に現在の日の00:00:00(真夜中)を基準に行われます。そのため、1時から23時の間の時間値のみが有用です。 + +もし `WEEK` 単位が指定された場合、`toStartOfInterval` は週の始まりを月曜日と仮定します。この動作は、デフォルトで日曜日から始まる `toStartOfWeek` 関数とは異なります。 + +**構文** + +```sql +toStartOfInterval(value, INTERVAL x unit[, time_zone]) +toStartOfInterval(value, INTERVAL x unit[, origin[, time_zone]]) +``` +エイリアス: `time_bucket`, `date_bin`. + +2番目のオーバーロードは、TimescaleDBの `time_bucket()` および PostgreSQLの `date_bin()` 関数をエミュレートします。例えば、 + +``` SQL +SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30')); +``` + +結果: + +``` reference +┌───toStartOfInterval(...)─┐ +│ 2023-01-01 14:44:30 │ +└──────────────────────────┘ +``` + +**参照** +- [date_trunc](#date_trunc) + +## toTime + +時間を保持しながら、日時を特定の固定日付に変換します。 + +**構文** + +```sql +toTime(date[,timezone]) +``` + +**引数** + +- `date` — 時間に変換する日付。 [Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 +- `timezone`(オプション) — 返される値のタイムゾーン。[String](../data-types/string.md)。 + +**返される値** + +- 日付を `1970-01-02` に等しくしながら、時間を保持した DateTime。[DateTime](../data-types/datetime.md)。 + +:::note +`date` 入力引数がサブ秒の成分を含んでいた場合、それらは返される `DateTime` 値において秒精度で削除されます。 +::: + +**例** + +クエリ: + +```sql +SELECT toTime(toDateTime64('1970-12-10 01:20:30.3000',3)) AS result, toTypeName(result); +``` + +結果: + +```response +┌──────────────result─┬─toTypeName(result)─┐ +│ 1970-01-02 01:20:30 │ DateTime │ +└─────────────────────┴────────────────────┘ +``` + +## toRelativeYearNum + +日時を、過去の特定の固定点から経過した年数に変換します。 + +**構文** + +```sql +toRelativeYearNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの年数。 [UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeYearNum(toDate('2002-12-08')) AS y1, + toRelativeYearNum(toDate('2010-10-26')) AS y2 +``` + +結果: + +```response +┌───y1─┬───y2─┐ +│ 2002 │ 2010 │ +└──────┴──────┘ +``` + +## toRelativeQuarterNum + +日時を、過去の特定の固定点から経過した四半期数に変換します。 + +**構文** + +```sql +toRelativeQuarterNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの四半期数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeQuarterNum(toDate('1993-11-25')) AS q1, + toRelativeQuarterNum(toDate('2005-01-05')) AS q2 +``` + +結果: + +```response +┌───q1─┬───q2─┐ +│ 7975 │ 8020 │ +└──────┴──────┘ +``` + +## toRelativeMonthNum + +日時を、過去の特定の固定点から経過した月数に変換します。 + +**構文** + +```sql +toRelativeMonthNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの月数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeMonthNum(toDate('2001-04-25')) AS m1, + toRelativeMonthNum(toDate('2009-07-08')) AS m2 +``` + +結果: + +```response +┌────m1─┬────m2─┐ +│ 24016 │ 24115 │ +└───────┴───────┘ +``` + +## toRelativeWeekNum + +日時を、過去の特定の固定点から経過した週数に変換します。 + +**構文** + +```sql +toRelativeWeekNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの週数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeWeekNum(toDate('2000-02-29')) AS w1, + toRelativeWeekNum(toDate('2001-01-12')) AS w2 +``` + +結果: + +```response +┌───w1─┬───w2─┐ +│ 1574 │ 1619 │ +└──────┴──────┘ +``` + +## toRelativeDayNum + +日時を、過去の特定の固定点から経過した日数に変換します。 + +**構文** + +```sql +toRelativeDayNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの日数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeDayNum(toDate('1993-10-05')) AS d1, + toRelativeDayNum(toDate('2000-09-20')) AS d2 +``` + +結果: + +```response +┌───d1─┬────d2─┐ +│ 8678 │ 11220 │ +└──────┴───────┘ +``` + +## toRelativeHourNum + +日時を、過去の特定の固定点から経過した時間数に変換します。 + +**構文** + +```sql +toRelativeHourNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの時間数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeHourNum(toDateTime('1993-10-05 05:20:36')) AS h1, + toRelativeHourNum(toDateTime('2000-09-20 14:11:29')) AS h2 +``` + +結果: + +```response +┌─────h1─┬─────h2─┐ +│ 208276 │ 269292 │ +└────────┴────────┘ +``` + +## toRelativeMinuteNum + +日時を、過去の特定の固定点から経過した分数に変換します。 + +**構文** + +```sql +toRelativeMinuteNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの分数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeMinuteNum(toDateTime('1993-10-05 05:20:36')) AS m1, + toRelativeMinuteNum(toDateTime('2000-09-20 14:11:29')) AS m2 +``` + +結果: + +```response +┌───────m1─┬───────m2─┐ +│ 12496580 │ 16157531 │ +└──────────┴──────────┘ +``` + +## toRelativeSecondNum + +日時を、過去の特定の固定点から経過した秒数に変換します。 + +**構文** + +```sql +toRelativeSecondNum(date) +``` + +**引数** + +- `date` — 日付または日時。[Date](../data-types/date.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 過去の固定参照点からの秒数。 [UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toRelativeSecondNum(toDateTime('1993-10-05 05:20:36')) AS s1, + toRelativeSecondNum(toDateTime('2000-09-20 14:11:29')) AS s2 +``` + +結果: + +```response +┌────────s1─┬────────s2─┐ +│ 749794836 │ 969451889 │ +└───────────┴───────────┘ +``` + +## toISOYear + +日時を、ISO年を UInt16 数値として変換します。 + +**構文** + +```sql +toISOYear(value) +``` + +**引数** + +- `value` — 日付または日時。 [Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) + +**返される値** + +- 入力値をISO年番号に変換したもの。 [UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toISOYear(toDate('2024/10/02')) as year1, + toISOYear(toDateTime('2024-10-02 01:30:00')) as year2 +``` + +結果: + +```response +┌─year1─┬─year2─┐ +│ 2024 │ 2024 │ +└───────┴───────┘ +``` + +## toISOWeek + +日時を、ISO週番号を含む UInt8 数値に変換します。 + +**構文** + +```sql +toISOWeek(value) +``` + +**引数** + +- `value` — 日付または日時に関連する値。 + +**返される値** + +- `value`を現在のISO週番号に変換したもの。 [UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toISOWeek(toDate('2024/10/02')) AS week1, + toISOWeek(toDateTime('2024/10/02 01:30:00')) AS week2 +``` + +結果: + +```response +┌─week1─┬─week2─┐ +│ 40 │ 40 │ +└───────┴───────┘ +``` + +## toWeek + +この関数は日時または日付の週番号を返します。 `toWeek()` の2引数形式では、週の始まりを日曜日または月曜日に指定でき、返される値が0から53の範囲か1から53の範囲にするかを指定します。mode引数が省略された場合、デフォルトのmodeは0です。 + +`toISOWeek()` は、`toWeek(date,3)` に相当する互換性関数です。 + +以下の表はmode引数の動作を説明します。 + +| モード | 週の初日 | 範囲 | 週1は最初の週 ... | +|------|-------|-------|------------------------| +| 0 | 日曜日 | 0-53 | 当年に日曜日を含む週 | +| 1 | 月曜日 | 0-53 | 当年に4日以上を含む週 | +| 2 | 日曜日 | 1-53 | 当年に日曜日を含む週 | +| 3 | 月曜日 | 1-53 | 当年に4日以上を含む週 | +| 4 | 日曜日 | 0-53 | 当年に4日以上を含む週 | +| 5 | 月曜日 | 0-53 | 当年に月曜日を含む週 | +| 6 | 日曜日 | 1-53 | 当年に4日以上を含む週 | +| 7 | 月曜日 | 1-53 | 当年に月曜日を含む週 | +| 8 | 日曜日 | 1-53 | 1月1日を含む週 | +| 9 | 月曜日 | 1-53 | 1月1日を含む週 | + +「当年に4日以上を含む」と意味するmode値の場合、週はISO 8601:1988に従って番号が付けられます: + +- 1月1日を含む週が4日以上ある場合、それは週1です。 + +- そうでない場合、前の年の最後の週になり、次の週が週1です。 + +「1月1日を含む」と意味するmode値の場合、1月1日を含む週が週1です。 +新年に何日あったかは関係ありません。一日だけでも構いません。 +つまり、12月の最後の週が翌年の1月1日を含む場合、それは翌年の週1になります。 + +**構文** + +``` sql +toWeek(t[, mode[, time_zone]]) +``` + +エイリアス: `WEEK` + +**引数** + +- `t` – 日付または日時。 +- `mode` – オプションのパラメータ。値の範囲は \[0,9\]、デフォルトは0です。 +- `timezone` – オプションのパラメータで、他の変換関数と同様に動作します。 + +最初の引数は、[parseDateTime64BestEffort()](type-conversion-functions.md#parsedatetime64besteffort)でサポートされたフォーマットの[文字列](../data-types/string.md)として指定することもできます。文字列引数のサポートは、特定の3rdパーティツールによって期待されるMySQLとの互換性を理由に存在しています。文字列引数のサポートは、将来的には新しいMySQL互換性設定に依存する可能性があり、文字列解析は一般的に遅いため使用しないことを推奨します。 + +**例** + +``` sql +SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date,1) AS week1, toWeek(date,9) AS week9; +``` + +``` text +┌───────date─┬─week0─┬─week1─┬─week9─┐ +│ 2016-12-27 │ 52 │ 52 │ 1 │ +└────────────┴───────┴───────┴───────┘ +``` + +## toYearWeek + +日付の年と週を返します。結果の年は、年の最初の週と最後の週で日付引数の年とは異なる場合があります。 + +mode引数は `toWeek()` のmode引数と同様に機能します。単一引数の構文の場合、mode値0が使用されます。 + +`toISOYear()` は、`intDiv(toYearWeek(date,3),100)` に相当する互換性関数です。 + +:::warning +`toYearWeek()` によって返される週番号は、`toWeek()` が返すものと異なる場合があります。`toWeek()` は常に指定された年のコンテキストで週番号を返し、`toWeek()` が `0` を返す場合、`toYearWeek()` は前年度の最後の週に対応する値を返します。以下の例の `prev_yearWeek` を参照してください。 +::: + +**構文** + +``` sql +toYearWeek(t[, mode[, timezone]]) +``` + +エイリアス: `YEARWEEK` + +最初の引数は、[parseDateTime64BestEffort()](type-conversion-functions.md#parsedatetime64besteffort) でサポートされたフォーマットの[文字列](../data-types/string.md)として指定することもできます。文字列引数のサポートは、特定の3rdパーティツールによって期待されるMySQLとの互換性を理由に存在しています。文字列引数のサポートは、将来的には新しいMySQL互換性設定に依存する可能性があり、文字列解析は一般的に遅いため使用しないことを推奨します。 + +**例** + +``` sql +SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date,1) AS yearWeek1, toYearWeek(date,9) AS yearWeek9, toYearWeek(toDate('2022-01-01')) AS prev_yearWeek; +``` + +``` text +┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┬─prev_yearWeek─┐ +│ 2016-12-27 │ 201652 │ 201652 │ 201701 │ 202152 │ +└────────────┴───────────┴───────────┴───────────┴───────────────┘ +``` + +## toDaysSinceYearZero + +指定された日付から[0000年1月1日](https://en.wikipedia.org/wiki/Year_zero)までの経過日数を返します。[ISO 8601](https://en.wikipedia.org/wiki/Gregorian_calendar#Proleptic_Gregorian_calendar)で定義される先取りグレゴリオ暦に基づきます。計算はMySQLの[`TO_DAYS()`](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_to-days)関数と同様です。 + +**構文** + +``` sql +toDaysSinceYearZero(date[, time_zone]) +``` + +エイリアス: `TO_DAYS` + +**引数** + +- `date` — 年ゼロから経過した日数を計算する日付。[Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 +- `time_zone` — タイムゾーンを表す文字列型の定数値または式。[String types](../data-types/string.md) + +**返される値** + +0000-01-01からの日数。[UInt32](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT toDaysSinceYearZero(toDate('2023-09-08')); +``` + +結果: + +``` text +┌─toDaysSinceYearZero(toDate('2023-09-08')))─┐ +│ 713569 │ +└────────────────────────────────────────────┘ +``` + +**参照** + +- [fromDaysSinceYearZero](#fromdayssinceyearzero) + +## fromDaysSinceYearZero + +指定された日数から[0000年1月1日](https://en.wikipedia.org/wiki/Year_zero)を過ぎた対応する日付を返します。[ISO 8601](https://en.wikipedia.org/wiki/Gregorian_calendar#Proleptic_Gregorian_calendar)で定義される先取りグレゴリオ暦に基づきます。計算はMySQLの[`FROM_DAYS()`](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_from-days)関数と同様です。 + +結果が[Date](../data-types/date.md)型の範囲内に収まらない場合、未定義です。 + +**構文** + +``` sql +fromDaysSinceYearZero(days) +``` + +エイリアス: `FROM_DAYS` + +**引数** + +- `days` — 年ゼロから経過した日数。 + +**返される値** + +年ゼロから経過した日数に対応する日付。[Date](../data-types/date.md)。 + +**例** + +``` sql +SELECT fromDaysSinceYearZero(739136), fromDaysSinceYearZero(toDaysSinceYearZero(toDate('2023-09-08'))); +``` + +結果: + +``` text +┌─fromDaysSinceYearZero(739136)─┬─fromDaysSinceYearZero(toDaysSinceYearZero(toDate('2023-09-08')))─┐ +│ 2023-09-08 │ 2023-09-08 │ +└───────────────────────────────┴──────────────────────────────────────────────────────────────────┘ +``` + +**参照** + +- [toDaysSinceYearZero](#todayssinceyearzero) + +## fromDaysSinceYearZero32 + +[FromDaysSinceYearZero](#fromdayssinceyearzero) と同様ですが、[Date32](../data-types/date32.md)を返します。 + +## age + +`startdate` と `enddate` の間の `unit` コンポーネントの差を返します。差は1ナノ秒の精度で計算されます。 +例えば、`2021-12-29` と `2022-01-01` の間の差は、`day` 単位で3日、`month` 単位で0ヶ月、`year` 単位で0年です。 + +`age` の代替として、`date_diff` 関数があります。 + +**構文** + +``` sql +age('unit', startdate, enddate, [timezone]) +``` + +**引数** + +- `unit` — 結果のためのインターバルタイプ。[String](../data-types/string.md)。 + 可能な値: + + - `nanosecond`, `nanoseconds`, `ns` + - `microsecond`, `microseconds`, `us`, `u` + - `millisecond`, `milliseconds`, `ms` + - `second`, `seconds`, `ss`, `s` + - `minute`, `minutes`, `mi`, `n` + - `hour`, `hours`, `hh`, `h` + - `day`, `days`, `dd`, `d` + - `week`, `weeks`, `wk`, `ww` + - `month`, `months`, `mm`, `m` + - `quarter`, `quarters`, `qq`, `q` + - `year`, `years`, `yyyy`, `yy` + +- `startdate` — 引き算の最初の時間値(被減数)。[Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +- `enddate` — 引き算の2番目の時間値(減数)。[Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +``` +```html +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。指定された場合、`startdate` と `enddate` の両方に適用されます。指定されていない場合は、`startdate` と `enddate` のタイムゾーンが使用されます。それらが異なる場合、結果は未定義となります。[文字列](../data-types/string.md)。 + +**戻り値** + +`enddate` と `startdate` の間の差を `unit` で表現したもの。[整数](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00')); +``` + +結果: + +``` text +┌─age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00'))─┐ +│ 24 │ +└───────────────────────────────────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT + toDate('2022-01-01') AS e, + toDate('2021-12-29') AS s, + age('day', s, e) AS day_age, + age('month', s, e) AS month__age, + age('year', s, e) AS year_age; +``` + +結果: + +``` text +┌──────────e─┬──────────s─┬─day_age─┬─month__age─┬─year_age─┐ +│ 2022-01-01 │ 2021-12-29 │ 3 │ 0 │ 0 │ +└────────────┴────────────┴─────────┴────────────┴──────────┘ +``` + + +## date_diff + +`startdate` と `enddate` の間で交差した特定の `unit` 境界の数を返します。 +差は相対単位を使用して計算されます。例えば、`2021-12-29` と `2022-01-01` の差は単位 `day` で 3 日([toRelativeDayNum](#torelativedaynum) を参照)、単位 `month` で 1 ヶ月([toRelativeMonthNum](#torelativemonthnum) を参照)、単位 `year` で 1 年([toRelativeYearNum](#torelativeyearnum) を参照)です。 + +単位 `week` が指定された場合、`date_diff` は週が月曜日から始まると仮定します。この挙動は、週がデフォルトで日曜日から始まる関数 `toWeek()` とは異なります。 + +`date_diff` に代わる関数については、関数 `age` を参照してください。 + +**構文** + +``` sql +date_diff('unit', startdate, enddate, [timezone]) +``` + +別名: `dateDiff`, `DATE_DIFF`, `timestampDiff`, `timestamp_diff`, `TIMESTAMP_DIFF`. + +**引数** + +- `unit` — 結果の間隔の種類。[文字列](../data-types/string.md)。 + 可能な値: + + - `nanosecond`, `nanoseconds`, `ns` + - `microsecond`, `microseconds`, `us`, `u` + - `millisecond`, `milliseconds`, `ms` + - `second`, `seconds`, `ss`, `s` + - `minute`, `minutes`, `mi`, `n` + - `hour`, `hours`, `hh`, `h` + - `day`, `days`, `dd`, `d` + - `week`, `weeks`, `wk`, `ww` + - `month`, `months`, `mm`, `m` + - `quarter`, `quarters`, `qq`, `q` + - `year`, `years`, `yyyy`, `yy` + +- `startdate` — 引き算する最初の日時(被減数)。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +- `enddate` — 引き算される第二の日時(減数)。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。指定された場合、`startdate` と `enddate` の両方に適用されます。指定されていない場合は、`startdate` と `enddate` のタイムゾーンが使用されます。それらが異なる場合、結果は未定義となります。[文字列](../data-types/string.md)。 + +**戻り値** + +`enddate` と `startdate` の間の差を `unit` で表現したもの。[整数](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')); +``` + +結果: + +``` text +┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐ +│ 25 │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +``` sql +SELECT + toDate('2022-01-01') AS e, + toDate('2021-12-29') AS s, + dateDiff('day', s, e) AS day_diff, + dateDiff('month', s, e) AS month__diff, + dateDiff('year', s, e) AS year_diff; +``` + +結果: + +``` text +┌──────────e─┬──────────s─┬─day_diff─┬─month__diff─┬─year_diff─┐ +│ 2022-01-01 │ 2021-12-29 │ 3 │ 1 │ 1 │ +└────────────┴────────────┴──────────┴─────────────┴───────────┘ +``` + +## date\_trunc + +日付と時刻のデータを指定された日付の部分に切り捨てます。 + +**構文** + +``` sql +date_trunc(unit, value[, timezone]) +``` + +別名: `dateTrunc`. + +**引数** + +- `unit` — 結果を切り捨てる間隔の種類。[文字列リテラル](../syntax.md#syntax-string-literal)。 + 可能な値: + + - `nanosecond` - DateTime64 のみ互換性があります + - `microsecond` - DateTime64 のみ互換性があります + - `milisecond` - DateTime64 のみ互換性があります + - `second` + - `minute` + - `hour` + - `day` + - `week` + - `month` + - `quarter` + - `year` + + `unit` 引数は大文字小文字を区別しません。 + +- `value` — 日付と時刻。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 +- `timezone` — 戻り値の [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。指定されていない場合、関数は `value` パラメータのタイムゾーンを使用します。[文字列](../data-types/string.md)。 + +**戻り値** + +- 指定された日付の部分に切り捨てられた値。[日時](../data-types/datetime.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +SELECT now(), date_trunc('hour', now()); +``` + +結果: + +``` text +┌───────────────now()─┬─date_trunc('hour', now())─┐ +│ 2020-09-28 10:40:45 │ 2020-09-28 10:00:00 │ +└─────────────────────┴───────────────────────────┘ +``` + +指定されたタイムゾーンでのクエリ: + +```sql +SELECT now(), date_trunc('hour', now(), 'Asia/Istanbul'); +``` + +結果: + +```text +┌───────────────now()─┬─date_trunc('hour', now(), 'Asia/Istanbul')─┐ +│ 2020-09-28 10:46:26 │ 2020-09-28 13:00:00 │ +└─────────────────────┴────────────────────────────────────────────┘ +``` + +**参照してください** + +- [toStartOfInterval](#tostartofinterval) + +## date\_add + +指定された日数または日時に時間間隔または日付間隔を追加します。 + +加算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +``` sql +date_add(unit, value, date) +``` + +代替構文: + +``` sql +date_add(date, INTERVAL value unit) +``` + +別名: `dateAdd`, `DATE_ADD`. + +**引数** + +- `unit` — 追加する間隔の種類。注: これは [文字列](../data-types/string.md) ではなく、引用されない必要があります。 + 可能な値: + + - `second` + - `minute` + - `hour` + - `day` + - `week` + - `month` + - `quarter` + - `year` + +- `value` — 追加する間隔の値。[整数](../data-types/int-uint.md)。 +- `date` — `value` が追加される日付または日付と時刻。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +`date` に `value` を追加した結果の日付または日付と時刻。 [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +SELECT date_add(YEAR, 3, toDate('2018-01-01')); +``` + +結果: + +```text +┌─plus(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2021-01-01 │ +└───────────────────────────────────────────────┘ +``` + +```sql +SELECT date_add(toDate('2018-01-01'), INTERVAL 3 YEAR); +``` + +結果: + +```text +┌─plus(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2021-01-01 │ +└───────────────────────────────────────────────┘ +``` + + + +**参照してください** + +- [addDate](#adddate) + +## date\_sub + +指定された日付または日時から時間間隔または日付間隔を引き算します。 + +減算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +``` sql +date_sub(unit, value, date) +``` + +代替構文: + +``` sql +date_sub(date, INTERVAL value unit) +``` + + +別名: `dateSub`, `DATE_SUB`. + +**引数** + +- `unit` — 減算する間隔の種類。注: これは [文字列](../data-types/string.md) ではなく、引用されない必要があります。 + + 可能な値: + + - `second` + - `minute` + - `hour` + - `day` + - `week` + - `month` + - `quarter` + - `year` + +- `value` — 減算する間隔の値。[整数](../data-types/int-uint.md)。 +- `date` — `value` が引かれる日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +`date` から `value` を引いた結果の日付または日付と時刻。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +``` sql +SELECT date_sub(YEAR, 3, toDate('2018-01-01')); +``` + +結果: + +``` text +┌─minus(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2015-01-01 │ +└────────────────────────────────────────────────┘ +``` + +``` sql +SELECT date_sub(toDate('2018-01-01'), INTERVAL 3 YEAR); +``` + +結果: + +``` text +┌─minus(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2015-01-01 │ +└────────────────────────────────────────────────┘ +``` + + +**参照してください** + +- [subDate](#subdate) + +## timestamp\_add + +指定された日時と提供された日付または日時を加算します。 + +加算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +``` sql +timestamp_add(date, INTERVAL value unit) +``` + +別名: `timeStampAdd`, `TIMESTAMP_ADD`. + +**引数** + +- `date` — 日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 +- `value` — 追加する間隔の値。[整数](../data-types/int-uint.md)。 +- `unit` — 追加する間隔の種類。[文字列](../data-types/string.md)。 + 可能な値: + + - `second` + - `minute` + - `hour` + - `day` + - `week` + - `month` + - `quarter` + - `year` + +**戻り値** + +指定された `value` を `unit` で日付に追加した結果の日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +select timestamp_add(toDate('2018-01-01'), INTERVAL 3 MONTH); +``` + +結果: + +```text +┌─plus(toDate('2018-01-01'), toIntervalMonth(3))─┐ +│ 2018-04-01 │ +└────────────────────────────────────────────────┘ +``` + +## timestamp\_sub + +提供された日付または日時から時間間隔を引き算します。 + +引き算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +``` sql +timestamp_sub(unit, value, date) +``` + +別名: `timeStampSub`, `TIMESTAMP_SUB`. + +**引数** + +- `unit` — 減算する間隔の種類。[文字列](../data-types/string.md)。 + 可能な値: + + - `second` + - `minute` + - `hour` + - `day` + - `week` + - `month` + - `quarter` + - `year` + +- `value` — 減算する間隔の値。[整数](../data-types/int-uint.md)。 +- `date` — 日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +指定された `value` を `unit` で日付から引いた結果の日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +select timestamp_sub(MONTH, 5, toDateTime('2018-12-18 01:02:03')); +``` + +結果: + +```text +┌─minus(toDateTime('2018-12-18 01:02:03'), toIntervalMonth(5))─┐ +│ 2018-07-18 01:02:03 │ +└──────────────────────────────────────────────────────────────┘ +``` + +## addDate + +指定された日付、日時、または文字列形式の日付/日時に時間間隔を追加します。 + +加算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +```sql +addDate(date, interval) +``` + +**引数** + +- `date` — 指定された間隔が追加される日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md)、[DateTime64](../data-types/datetime64.md)、または [文字列](../data-types/string.md) +- `interval` — 加える間隔。[間隔](../data-types/special-data-types/interval.md)。 + +**戻り値** + +`date` に `interval` を追加した結果の日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +SELECT addDate(toDate('2018-01-01'), INTERVAL 3 YEAR); +``` + +結果: + +```text +┌─addDate(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2021-01-01 │ +└──────────────────────────────────────────────────┘ +``` + +別名: `ADDDATE` + +**参照してください** + +- [date_add](#date_add) + +## subDate + +指定された日付、日時、または文字列形式の日付/日時から時間間隔を引き算します。 + +減算の結果がデータ型の範囲外の値になる場合、結果は未定義になります。 + +**構文** + +```sql +subDate(date, interval) +``` + +**引数** + +- `date` — `interval` が引かれる日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md)、[DateTime64](../data-types/datetime64.md)、または [文字列](../data-types/string.md) +- `interval` — 引く間隔。[間隔](../data-types/special-data-types/interval.md)。 + +**戻り値** + +`date` から `interval` を引いた結果の日付または日時。[日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +SELECT subDate(toDate('2018-01-01'), INTERVAL 3 YEAR); +``` + +結果: + +```text +┌─subDate(toDate('2018-01-01'), toIntervalYear(3))─┐ +│ 2015-01-01 │ +└──────────────────────────────────────────────────┘ +``` + +別名: `SUBDATE` + +**参照してください** + +- [date_sub](#date_sub) + +## now + +クエリ解析の瞬間の現在の日付と時刻を返します。この関数は定数式です。 + +別名: `current_timestamp`. + +**構文** + +``` sql +now([timezone]) +``` + +**引数** + +- `timezone` — 戻り値の [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。 [文字列](../data-types/string.md)。 + +**戻り値** + +- 現在の日付と時刻。[日時](../data-types/datetime.md)。 + +**例** + +タイムゾーンなしのクエリ: + +``` sql +SELECT now(); +``` + +結果: + +``` text +┌───────────────now()─┐ +│ 2020-10-17 07:42:09 │ +└─────────────────────┘ +``` + +指定されたタイムゾーンでのクエリ: + +``` sql +SELECT now('Asia/Istanbul'); +``` + +結果: + +``` text +┌─now('Asia/Istanbul')─┐ +│ 2020-10-17 10:42:23 │ +└──────────────────────┘ +``` + +## now64 + +クエリ解析の瞬間の現在の日付と時刻をサブ秒精度で返します。この関数は定数式です。 + +**構文** + +``` sql +now64([scale], [timezone]) +``` + +**引数** + +- `scale` - チックサイズ(精度):10-精度 秒。妥当な範囲: [0 : 9]。典型的には - 3 (デフォルト) (ミリ秒)、6 (マイクロ秒)、9 (ナノ秒) が使用されます。 +- `timezone` — 戻り値の [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。 [文字列](../data-types/string.md)。 + +**戻り値** + +- サブ秒精度での現在の日付と時刻。[DateTime64](../data-types/datetime64.md)。 + +**例** + +``` sql +SELECT now64(), now64(9, 'Asia/Istanbul'); +``` + +結果: + +``` text +┌─────────────────now64()─┬─────now64(9, 'Asia/Istanbul')─┐ +│ 2022-08-21 19:34:26.196 │ 2022-08-21 22:34:26.196542766 │ +└─────────────────────────┴───────────────────────────────┘ +``` + +## nowInBlock {#nowInBlock} + +データの各ブロックを処理する瞬間の現在の日付と時刻を返します。[now](#now) の関数とは異なり、これは定数式ではなく、長時間実行されるクエリの場合、異なるブロックで返される値が異なります。 + +長時間実行される INSERT SELECT クエリで現在の時刻を生成するためにこの関数を使用することが意味があります。 + +**構文** + +``` sql +nowInBlock([timezone]) +``` + +**引数** + +- `timezone` — 戻り値の [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。 [文字列](../data-types/string.md)。 + +**戻り値** + +- 各データブロックの処理の瞬間の現在の日付と時刻。[日時](../data-types/datetime.md)。 + +**例** + +``` sql +SELECT + now(), + nowInBlock(), + sleep(1) +FROM numbers(3) +SETTINGS max_block_size = 1 +FORMAT PrettyCompactMonoBlock +``` + +結果: + +``` text +┌───────────────now()─┬────────nowInBlock()─┬─sleep(1)─┐ +│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:19 │ 0 │ +│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:20 │ 0 │ +│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:21 │ 0 │ +└─────────────────────┴─────────────────────┴──────────┘ +``` + +## today {#today} + +クエリ解析の瞬間の現在の日付を返します。これは `toDate(now())` と同じであり、エイリアスとして `curdate`, `current_date` があります。 + +**構文** + +```sql +today() +``` + +**引数** + +- なし + +**戻り値** + +- 現在の日付。[日付](../data-types/date.md)。 + +**例** + +クエリ: + +```sql +SELECT today() AS today, curdate() AS curdate, current_date() AS current_date FORMAT Pretty +``` + +**結果**: + +2024年3月3日に上記のクエリを実行すると、次の応答が返されます。 + +```response +┏━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓ +┃ today ┃ curdate ┃ current_date ┃ +┡━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩ +│ 2024-03-03 │ 2024-03-03 │ 2024-03-03 │ +└────────────┴────────────┴──────────────┘ +``` + +## yesterday {#yesterday} + +引数を受け付けず、クエリ解析のいずれかの瞬間で昨日の日付を返します。 +`today() - 1` と同じです。 + +## timeSlot + +時間を30分間隔の開始時刻に丸めます。 + +**構文** + +```sql +timeSlot(time[, time_zone]) +``` + +**引数** + +- `time` — 30分間隔の開始時刻に丸める時間。[日時](../data-types/datetime.md)/[Date32](../data-types/date32.md)/[DateTime64](../data-types/datetime64.md)。 +- `time_zone` — タイムゾーンを表す文字列型の定数値または式。[文字列](../data-types/string.md)。 + +:::note +この関数は拡張されたタイプ `Date32` と `DateTime64` の値を引数として受け取ることができますが、通常の範囲(年 1970 から 2149 までの `Date` / 2106 までの `DateTime`)を超える時間を渡すと、誤った結果が生成されます。 +::: + +**戻り値の型** + +- 30分間隔の開始時刻に丸められた時間を返します。[日時](../data-types/datetime.md)。 + +**例** + +クエリ: + +```sql +SELECT timeSlot(toDateTime('2000-01-02 03:04:05', 'UTC')); +``` + +結果: + +```response +┌─timeSlot(toDateTime('2000-01-02 03:04:05', 'UTC'))─┐ +│ 2000-01-02 03:00:00 │ +└────────────────────────────────────────────────────┘ +``` + +## toYYYYMM + +日付または日付と時刻を年と月の数(YYYY \* 100 + MM)を含む UInt32 数に変換します。第二のオプションのタイムゾーン引数を受け付けます。提供された場合、タイムゾーンは文字列定数でなければなりません。 + +この関数は関数 `YYYYMMDDToDate()` の逆です。 + +**例** + +``` sql +SELECT + toYYYYMM(now(), 'US/Eastern') +``` + +結果: + +``` text +┌─toYYYYMM(now(), 'US/Eastern')─┐ +│ 202303 │ +└───────────────────────────────┘ +``` + +## toYYYYMMDD + +日付または日付と時刻を年、月、日を含む UInt32 数(YYYY \* 10000 + MM \* 100 + DD)に変換します。第二のオプションのタイムゾーン引数を受け付けます。提供された場合、タイムゾーンは文字列定数でなければなりません。 + +**例** + +```sql +SELECT toYYYYMMDD(now(), 'US/Eastern') +``` + +結果: + +```response +┌─toYYYYMMDD(now(), 'US/Eastern')─┐ +│ 20230302 │ +└─────────────────────────────────┘ +``` + +## toYYYYMMDDhhmmss + +日付または日付と時刻を年、月、日、時、分、秒を含む UInt64 数(YYYY \* 10000000000 + MM \* 100000000 + DD \* 1000000 + hh \* 10000 + mm \* 100 + ss)に変換します。第二のオプションのタイムゾーン引数を受け付けます。提供された場合、タイムゾーンは文字列定数でなければなりません。 + +**例** + +```sql +SELECT toYYYYMMDDhhmmss(now(), 'US/Eastern') +``` + +結果: + +```response +┌─toYYYYMMDDhhmmss(now(), 'US/Eastern')─┐ +│ 20230302112209 │ +└───────────────────────────────────────┘ +``` + +## YYYYMMDDToDate + +年、月、日を含む数値を [日付](../data-types/date.md) に変換します。 + +この関数は関数 `toYYYYMMDD()` の逆です。 + +入力が有効な日付値をエンコードしない場合、出力は未定義です。 + +**構文** + +```sql +YYYYMMDDToDate(yyyymmdd); +``` + +**引数** + +- `yyyymmdd` - 年、月、および日を表す数値。[整数](../data-types/int-uint.md)、[浮動小数点](../data-types/float.md)または [小数](../data-types/decimal.md)。 + +**戻り値** + +- 引数から作成された日付。[日付](../data-types/date.md)。 + +**例** + +```sql +SELECT YYYYMMDDToDate(20230911); +``` + +結果: + +```response +┌─toYYYYMMDD(20230911)─┐ +│ 2023-09-11 │ +└──────────────────────┘ +``` + +## YYYYMMDDToDate32 + +関数 `YYYYMMDDToDate()` と同様ですが、[Date32](../data-types/date32.md) を生成します。 + +## YYYYMMDDhhmmssToDateTime + +年、月、日、時、分、秒を含む数値を [日時](../data-types/datetime.md) に変換します。 + +入力が有効な日時値をエンコードしない場合、出力は未定義です。 + +この関数は関数 `toYYYYMMDDhhmmss()` の逆です。 + +**構文** + +```sql +YYYYMMDDhhmmssToDateTime(yyyymmddhhmmss[, timezone]); +``` + +**引数** + +- `yyyymmddhhmmss` - 年、月、日を表す数値。[整数](../data-types/int-uint.md)、[浮動小数点](../data-types/float.md)または [小数](../data-types/decimal.md)。 +- `timezone` - 戻り値の [タイムゾーン](../../operations/server-configuration-parameters/settings.md#timezone) (オプション)。 + +**戻り値** + +- 引数から作成された日時。[日時](../data-types/datetime.md)。 + +**例** + +```sql +SELECT YYYYMMDDToDateTime(20230911131415); +``` + +結果: + +```response +┌──────YYYYMMDDhhmmssToDateTime(20230911131415)─┐ +│ 2023-09-11 13:14:15 │ +└───────────────────────────────────────────────┘ +``` + +## YYYYMMDDhhmmssToDateTime64 + +関数 `YYYYMMDDhhmmssToDate()` と同様ですが、[DateTime64](../data-types/datetime64.md) を生成します。 + +必要に応じて `timezone` パラメータの後に追加のオプションの `precision` パラメータを受け取ります。 + +## changeYear + +日付または日時の年の部分を変更します。 + +**構文** +``` sql + +changeYear(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 年の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型。 + +**例** + +``` sql +SELECT changeYear(toDate('1999-01-01'), 2000), changeYear(toDateTime64('1999-01-01 00:00:00.000', 3), 2000); +``` + +結果: + +``` +┌─changeYear(toDate('1999-01-01'), 2000)─┬─changeYear(toDateTime64('1999-01-01 00:00:00.000', 3), 2000)─┐ +│ 2000-01-01 │ 2000-01-01 00:00:00.000 │ +└────────────────────────────────────────┴──────────────────────────────────────────────────────────────┘ +``` + +## changeMonth + +日付または日時の月の部分を変更します。 + +**構文** + +``` sql +changeMonth(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 月の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型の値を返します。 + +**例** + +``` sql +SELECT changeMonth(toDate('1999-01-01'), 2), changeMonth(toDateTime64('1999-01-01 00:00:00.000', 3), 2); +``` + +結果: + +``` +┌─changeMonth(toDate('1999-01-01'), 2)─┬─changeMonth(toDateTime64('1999-01-01 00:00:00.000', 3), 2)─┐ +│ 1999-02-01 │ 1999-02-01 00:00:00.000 │ +└──────────────────────────────────────┴────────────────────────────────────────────────────────────┘ +``` + +## changeDay + +日付または日時の日の部分を変更します。 + +**構文** + +``` sql +changeDay(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 日の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型の値を返します。 + +**例** + +``` sql +SELECT changeDay(toDate('1999-01-01'), 5), changeDay(toDateTime64('1999-01-01 00:00:00.000', 3), 5); +``` + +結果: + +``` +┌─changeDay(toDate('1999-01-01'), 5)─┬─changeDay(toDateTime64('1999-01-01 00:00:00.000', 3), 5)─┐ +│ 1999-01-05 │ 1999-01-05 00:00:00.000 │ +└────────────────────────────────────┴──────────────────────────────────────────────────────────┘ +``` + +## changeHour + +日付または日時の時間の部分を変更します。 + +**構文** + +``` sql +changeHour(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 時間の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型の値を返します。入力が [日付](../data-types/date.md) の場合、[日時](../data-types/datetime.md) が返されます。入力が [Date32](../data-types/date32.md) の場合、[DateTime64](../data-types/datetime64.md) が返されます。 + +**例** + +``` sql +SELECT changeHour(toDate('1999-01-01'), 14), changeHour(toDateTime64('1999-01-01 00:00:00.000', 3), 14); +``` + +結果: + +``` +┌─changeHour(toDate('1999-01-01'), 14)─┬─changeHour(toDateTime64('1999-01-01 00:00:00.000', 3), 14)─┐ +│ 1999-01-01 14:00:00 │ 1999-01-01 14:00:00.000 │ +└──────────────────────────────────────┴────────────────────────────────────────────────────────────┘ +``` + +## changeMinute + +日付または日時の分の部分を変更します。 + +**構文** + +``` sql +changeMinute(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 分の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型の値を返します。入力が [日付](../data-types/date.md) の場合、[日時](../data-types/datetime.md) が返されます。入力が [Date32](../data-types/date32.md) の場合、[DateTime64](../data-types/datetime64.md) が返されます。 + +**例** + +``` sql + SELECT changeMinute(toDate('1999-01-01'), 15), changeMinute(toDateTime64('1999-01-01 00:00:00.000', 3), 15); +``` + +結果: + +``` +┌─changeMinute(toDate('1999-01-01'), 15)─┬─changeMinute(toDateTime64('1999-01-01 00:00:00.000', 3), 15)─┐ +│ 1999-01-01 00:15:00 │ 1999-01-01 00:15:00.000 │ +└────────────────────────────────────────┴──────────────────────────────────────────────────────────────┘ +``` + +## changeSecond + +日付または日時の秒の部分を変更します。 + +**構文** + +``` sql +changeSecond(date_or_datetime, value) +``` + +**引数** + +- `date_or_datetime` - [日付](../data-types/date.md)、[Date32](../data-types/date32.md)、[日時](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) +- `value` - 秒の新しい値。[整数](../../sql-reference/data-types/int-uint.md)。 + +**戻り値** + +- `date_or_datetime` と同じ型の値を返します。入力が [日付](../data-types/date.md) の場合、[日時](../data-types/datetime.md) が返されます。入力が [Date32](../data-types/date32.md) の場合、[DateTime64](../data-types/datetime64.md) が返されます。 + +**例** + +``` sql +SELECT changeSecond(toDate('1999-01-01'), 15), changeSecond(toDateTime64('1999-01-01 00:00:00.000', 3), 15); +``` + +結果: + +``` +┌─changeSecond(toDate('1999-01-01'), 15)─┬─changeSecond(toDateTime64('1999-01-01 00:00:00.000', 3), 15)─┐ +│ 1999-01-01 00:00:15 │ 1999-01-01 00:00:15.000 │ +└────────────────────────────────────────┴──────────────────────────────────────────────────────────────┘ +``` + +## addYears + +日付、日時、または文字列形式の日付/日時に指定された年の数を追加します。 + +**構文** + +```sql +addYears(date, num) +``` + +**引数** + +- `date`: 指定された年の数を追加する日付/日時。[日付](../data-types/date.md) / [Date32](../data-types/date32.md) / [日時](../data-types/datetime.md) / [DateTime64](../data-types/datetime64.md)、[文字列](../data-types/string.md)。 +- `num`: 追加する年の数。[(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**戻り値** +``` +```html +- `date` に `num` 年を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addYears(date, 1) AS add_years_with_date, + addYears(date_time, 1) AS add_years_with_date_time, + addYears(date_time_string, 1) AS add_years_with_date_time_string +``` + +```response +┌─add_years_with_date─┬─add_years_with_date_time─┬─add_years_with_date_time_string─┐ +│ 2025-01-01 │ 2025-01-01 00:00:00 │ 2025-01-01 00:00:00.000 │ +└─────────────────────┴──────────────────────────┴─────────────────────────────────┘ +``` + +## addQuarters + +指定された数の四半期を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addQuarters(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の四半期を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える四半期の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 四半期を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addQuarters(date, 1) AS add_quarters_with_date, + addQuarters(date_time, 1) AS add_quarters_with_date_time, + addQuarters(date_time_string, 1) AS add_quarters_with_date_time_string +``` + +```response +┌─add_quarters_with_date─┬─add_quarters_with_date_time─┬─add_quarters_with_date_time_string─┐ +│ 2024-04-01 │ 2024-04-01 00:00:00 │ 2024-04-01 00:00:00.000 │ +└────────────────────────┴─────────────────────────────┴────────────────────────────────────┘ +``` + +## addMonths + +指定された数の月を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addMonths(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の月を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える月の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 月を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addMonths(date, 6) AS add_months_with_date, + addMonths(date_time, 6) AS add_months_with_date_time, + addMonths(date_time_string, 6) AS add_months_with_date_time_string +``` + +```response +┌─add_months_with_date─┬─add_months_with_date_time─┬─add_months_with_date_time_string─┐ +│ 2024-07-01 │ 2024-07-01 00:00:00 │ 2024-07-01 00:00:00.000 │ +└──────────────────────┴───────────────────────────┴──────────────────────────────────┘ +``` + +## addWeeks + +指定された数の週を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addWeeks(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の週を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える週の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 週間を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addWeeks(date, 5) AS add_weeks_with_date, + addWeeks(date_time, 5) AS add_weeks_with_date_time, + addWeeks(date_time_string, 5) AS add_weeks_with_date_time_string +``` + +```response +┌─add_weeks_with_date─┬─add_weeks_with_date_time─┬─add_weeks_with_date_time_string─┐ +│ 2024-02-05 │ 2024-02-05 00:00:00 │ 2024-02-05 00:00:00.000 │ +└─────────────────────┴──────────────────────────┴─────────────────────────────────┘ +``` + +## addDays + +指定された数の日を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addDays(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の日を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える日の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 日を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addDays(date, 5) AS add_days_with_date, + addDays(date_time, 5) AS add_days_with_date_time, + addDays(date_time_string, 5) AS add_days_with_date_time_string +``` + +```response +┌─add_days_with_date─┬─add_days_with_date_time─┬─add_days_with_date_time_string─┐ +│ 2024-01-06 │ 2024-01-06 00:00:00 │ 2024-01-06 00:00:00.000 │ +└────────────────────┴─────────────────────────┴────────────────────────────────┘ +``` + +## addHours + +指定された数の時間を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addHours(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の時間を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える時間の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 時間を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addHours(date, 12) AS add_hours_with_date, + addHours(date_time, 12) AS add_hours_with_date_time, + addHours(date_time_string, 12) AS add_hours_with_date_time_string +``` + +```response +┌─add_hours_with_date─┬─add_hours_with_date_time─┬─add_hours_with_date_time_string─┐ +│ 2024-01-01 12:00:00 │ 2024-01-01 12:00:00 │ 2024-01-01 12:00:00.000 │ +└─────────────────────┴──────────────────────────┴─────────────────────────────────┘ +``` + +## addMinutes + +指定された数の分を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addMinutes(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の分を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える分の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 分を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addMinutes(date, 20) AS add_minutes_with_date, + addMinutes(date_time, 20) AS add_minutes_with_date_time, + addMinutes(date_time_string, 20) AS add_minutes_with_date_time_string +``` + +```response +┌─add_minutes_with_date─┬─add_minutes_with_date_time─┬─add_minutes_with_date_time_string─┐ +│ 2024-01-01 00:20:00 │ 2024-01-01 00:20:00 │ 2024-01-01 00:20:00.000 │ +└───────────────────────┴────────────────────────────┴───────────────────────────────────┘ +``` + +## addSeconds + +指定された数の秒を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付に加えます。 + +**構文** + +```sql +addSeconds(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の秒を加える日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加える秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` に `num` 秒を加えます。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addSeconds(date, 30) AS add_seconds_with_date, + addSeconds(date_time, 30) AS add_seconds_with_date_time, + addSeconds(date_time_string, 30) AS add_seconds_with_date_time_string +``` + +```response +┌─add_seconds_with_date─┬─add_seconds_with_date_time─┬─add_seconds_with_date_time_string─┐ +│ 2024-01-01 00:00:30 │ 2024-01-01 00:00:30 │ 2024-01-01 00:00:30.000 │ +└───────────────────────┴────────────────────────────┴───────────────────────────────────┘ +``` + +## addMilliseconds + +指定された数のミリ秒を時刻付きの日付または文字列エンコードされた時刻付きの日付に加えます。 + +**構文** + +```sql +addMilliseconds(date_time, num) +``` + +**パラメーター** + +- `date_time`: 指定された数のミリ秒を加える時刻付き日付。 [DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加えるミリ秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date_time` に `num` ミリ秒を加えます。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addMilliseconds(date_time, 1000) AS add_milliseconds_with_date_time, + addMilliseconds(date_time_string, 1000) AS add_milliseconds_with_date_time_string +``` + +```response +┌─add_milliseconds_with_date_time─┬─add_milliseconds_with_date_time_string─┐ +│ 2024-01-01 00:00:01.000 │ 2024-01-01 00:00:01.000 │ +└─────────────────────────────────┴────────────────────────────────────────┘ +``` + +## addMicroseconds + +指定された数のマイクロ秒を時刻付きの日付または文字列エンコードされた時刻付きの日付に加えます。 + +**構文** + +```sql +addMicroseconds(date_time, num) +``` + +**パラメーター** + +- `date_time`: 指定された数のマイクロ秒を加える時刻付き日付。 [DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加えるマイクロ秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date_time` に `num` マイクロ秒を加えます。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addMicroseconds(date_time, 1000000) AS add_microseconds_with_date_time, + addMicroseconds(date_time_string, 1000000) AS add_microseconds_with_date_time_string +``` + +```response +┌─add_microseconds_with_date_time─┬─add_microseconds_with_date_time_string─┐ +│ 2024-01-01 00:00:01.000000 │ 2024-01-01 00:00:01.000000 │ +└─────────────────────────────────┴────────────────────────────────────────┘ +``` + +## addNanoseconds + +指定された数のナノ秒を時刻付きの日付または文字列エンコードされた時刻付きの日付に加えます。 + +**構文** + +```sql +addNanoseconds(date_time, num) +``` + +**パラメーター** + +- `date_time`: 指定された数のナノ秒を加える時刻付き日付。 [DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 加えるナノ秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date_time` に `num` ナノ秒を加えます。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + addNanoseconds(date_time, 1000) AS add_nanoseconds_with_date_time, + addNanoseconds(date_time_string, 1000) AS add_nanoseconds_with_date_time_string +``` + +```response +┌─add_nanoseconds_with_date_time─┬─add_nanoseconds_with_date_time_string─┐ +│ 2024-01-01 00:00:00.000001000 │ 2024-01-01 00:00:00.000001000 │ +└────────────────────────────────┴───────────────────────────────────────┘ +``` + +## addInterval + +別の間隔または間隔のタプルを追加します。 + +**構文** + +```sql +addInterval(interval_1, interval_2) +``` + +**パラメーター** + +- `interval_1`: 最初の間隔または間隔のタプル。 [interval](../data-types/special-data-types/interval.md)、[tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 +- `interval_2`: 追加される2番目の間隔。 [interval](../data-types/special-data-types/interval.md)。 + +**返却値** + +- 間隔のタプルを返します。 [tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 + +:::note +同じタイプの間隔は、単一の間隔にまとめられます。たとえば、`toIntervalDay(1)` と `toIntervalDay(2)` が渡されると、結果は `(3)` になります。 +::: + +**例** + +クエリ: + +```sql +SELECT addInterval(INTERVAL 1 DAY, INTERVAL 1 MONTH); +SELECT addInterval((INTERVAL 1 DAY, INTERVAL 1 YEAR), INTERVAL 1 MONTH); +SELECT addInterval(INTERVAL 2 DAY, INTERVAL 1 DAY); +``` + +結果: + +```response +┌─addInterval(toIntervalDay(1), toIntervalMonth(1))─┐ +│ (1,1) │ +└───────────────────────────────────────────────────┘ +┌─addInterval((toIntervalDay(1), toIntervalYear(1)), toIntervalMonth(1))─┐ +│ (1,1,1) │ +└────────────────────────────────────────────────────────────────────────┘ +┌─addInterval(toIntervalDay(2), toIntervalDay(1))─┐ +│ (3) │ +└─────────────────────────────────────────────────┘ +``` + +## addTupleOfIntervals + +間隔のタプルを連続して日付または日時に加えます。 + +**構文** + +```sql +addTupleOfIntervals(interval_1, interval_2) +``` + +**パラメーター** + +- `date`: 最初の間隔または間隔のタプル。 [date](../data-types/date.md)/[date32](../data-types/date32.md)/[datetime](../data-types/datetime.md)/[datetime64](../data-types/datetime64.md)。 +- `intervals`: `date` に加える間隔のタプル。 [tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 + +**返却値** + +- `intervals` を加えた `date` を返します。 [date](../data-types/date.md)/[date32](../data-types/date32.md)/[datetime](../data-types/datetime.md)/[datetime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +```sql +WITH toDate('2018-01-01') AS date +SELECT addTupleOfIntervals(date, (INTERVAL 1 DAY, INTERVAL 1 MONTH, INTERVAL 1 YEAR)) +``` + +結果: + +```response +┌─addTupleOfIntervals(date, (toIntervalDay(1), toIntervalMonth(1), toIntervalYear(1)))─┐ +│ 2019-02-02 │ +└──────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## subtractYears + +指定された数の年を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractYears(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の年を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する年の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 年を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractYears(date, 1) AS subtract_years_with_date, + subtractYears(date_time, 1) AS subtract_years_with_date_time, + subtractYears(date_time_string, 1) AS subtract_years_with_date_time_string +``` + +```response +┌─subtract_years_with_date─┬─subtract_years_with_date_time─┬─subtract_years_with_date_time_string─┐ +│ 2023-01-01 │ 2023-01-01 00:00:00 │ 2023-01-01 00:00:00.000 │ +└──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘ +``` + +## subtractQuarters + +指定された数の四半期を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractQuarters(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の四半期を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する四半期の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 四半期を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractQuarters(date, 1) AS subtract_quarters_with_date, + subtractQuarters(date_time, 1) AS subtract_quarters_with_date_time, + subtractQuarters(date_time_string, 1) AS subtract_quarters_with_date_time_string +``` + +```response +┌─subtract_quarters_with_date─┬─subtract_quarters_with_date_time─┬─subtract_quarters_with_date_time_string─┐ +│ 2023-10-01 │ 2023-10-01 00:00:00 │ 2023-10-01 00:00:00.000 │ +└─────────────────────────────┴──────────────────────────────────┴─────────────────────────────────────────┘ +``` + +## subtractMonths + +指定された数の月を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractMonths(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の月を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する月の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 月を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractMonths(date, 1) AS subtract_months_with_date, + subtractMonths(date_time, 1) AS subtract_months_with_date_time, + subtractMonths(date_time_string, 1) AS subtract_months_with_date_time_string +``` + +```response +┌─subtract_months_with_date─┬─subtract_months_with_date_time─┬─subtract_months_with_date_time_string─┐ +│ 2023-12-01 │ 2023-12-01 00:00:00 │ 2023-12-01 00:00:00.000 │ +└───────────────────────────┴────────────────────────────────┴───────────────────────────────────────┘ +``` + +## subtractWeeks + +指定された数の週を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractWeeks(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の週を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する週の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 週間を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractWeeks(date, 1) AS subtract_weeks_with_date, + subtractWeeks(date_time, 1) AS subtract_weeks_with_date_time, + subtractWeeks(date_time_string, 1) AS subtract_weeks_with_date_time_string +``` + +```response + ┌─subtract_weeks_with_date─┬─subtract_weeks_with_date_time─┬─subtract_weeks_with_date_time_string─┐ + │ 2023-12-25 │ 2023-12-25 00:00:00 │ 2023-12-25 00:00:00.000 │ + └──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘ +``` + +## subtractDays + +指定された数の日を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractDays(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の日を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する日の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 日を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractDays(date, 31) AS subtract_days_with_date, + subtractDays(date_time, 31) AS subtract_days_with_date_time, + subtractDays(date_time_string, 31) AS subtract_days_with_date_time_string +``` + +```response +┌─subtract_days_with_date─┬─subtract_days_with_date_time─┬─subtract_days_with_date_time_string─┐ +│ 2023-12-01 │ 2023-12-01 00:00:00 │ 2023-12-01 00:00:00.000 │ +└─────────────────────────┴──────────────────────────────┴─────────────────────────────────────┘ +``` + +## subtractHours + +指定された数の時間を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractHours(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の時間を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[Datetime](../data-types/datetime.md)/[Datetime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する時間の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 時間を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[Datetime](../data-types/datetime.md)/[Datetime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractHours(date, 12) AS subtract_hours_with_date, + subtractHours(date_time, 12) AS subtract_hours_with_date_time, + subtractHours(date_time_string, 12) AS subtract_hours_with_date_time_string +``` + +```response +┌─subtract_hours_with_date─┬─subtract_hours_with_date_time─┬─subtract_hours_with_date_time_string─┐ +│ 2023-12-31 12:00:00 │ 2023-12-31 12:00:00 │ 2023-12-31 12:00:00.000 │ +└──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘ +``` + +## subtractMinutes + +指定された数の分を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractMinutes(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の分を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する分の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 分を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractMinutes(date, 30) AS subtract_minutes_with_date, + subtractMinutes(date_time, 30) AS subtract_minutes_with_date_time, + subtractMinutes(date_time_string, 30) AS subtract_minutes_with_date_time_string +``` + +```response +┌─subtract_minutes_with_date─┬─subtract_minutes_with_date_time─┬─subtract_minutes_with_date_time_string─┐ +│ 2023-12-31 23:30:00 │ 2023-12-31 23:30:00 │ 2023-12-31 23:30:00.000 │ +└────────────────────────────┴─────────────────────────────────┴────────────────────────────────────────┘ +``` + +## subtractSeconds + +指定された数の秒を日付、時刻付きの日付、または文字列エンコードされた日付 / 時刻付きの日付から減算します。 + +**構文** + +```sql +subtractSeconds(date, num) +``` + +**パラメーター** + +- `date`: 指定された数の秒を減算する日付 / 時刻付き日付。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算する秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date` から `num` 秒を減算します。 [Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDate('2024-01-01') AS date, + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractSeconds(date, 60) AS subtract_seconds_with_date, + subtractSeconds(date_time, 60) AS subtract_seconds_with_date_time, + subtractSeconds(date_time_string, 60) AS subtract_seconds_with_date_time_string +``` + +```response +┌─subtract_seconds_with_date─┬─subtract_seconds_with_date_time─┬─subtract_seconds_with_date_time_string─┐ +│ 2023-12-31 23:59:00 │ 2023-12-31 23:59:00 │ 2023-12-31 23:59:00.000 │ +└────────────────────────────┴─────────────────────────────────┴────────────────────────────────────────┘ +``` + +## subtractMilliseconds + +指定された数のミリ秒を時刻付きの日付または文字列エンコードされた時刻付きの日付から減算します。 + +**構文** + +```sql +subtractMilliseconds(date_time, num) +``` + +**パラメーター** + +- `date_time`: 指定された数のミリ秒を減算する時刻付き日付。 [DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 減算するミリ秒の数。 [(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返却値** + +- `date_time` から `num` ミリ秒を減算します。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractMilliseconds(date_time, 1000) AS subtract_milliseconds_with_date_time, + subtractMilliseconds(date_time_string, 1000) AS subtract_milliseconds_with_date_time_string +``` + +```response +┌─subtract_milliseconds_with_date_time─┬─subtract_milliseconds_with_date_time_string─┐ +│ 2023-12-31 23:59:59.000 │ 2023-12-31 23:59:59.000 │ +└──────────────────────────────────────┴─────────────────────────────────────────────┘ +``` +- `num`: 引き算するマイクロ秒の数。[(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返される値** + +- `date_time` から `num` マイクロ秒を引いた結果を返します。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractMicroseconds(date_time, 1000000) AS subtract_microseconds_with_date_time, + subtractMicroseconds(date_time_string, 1000000) AS subtract_microseconds_with_date_time_string +``` + +```response +┌─subtract_microseconds_with_date_time─┬─subtract_microseconds_with_date_time_string─┐ +│ 2023-12-31 23:59:59.000000 │ 2023-12-31 23:59:59.000000 │ +└──────────────────────────────────────┴─────────────────────────────────────────────┘ +``` + +## subtractNanoseconds + +指定したナノ秒数を日付と時刻、または文字列で表現された日付と時刻から引き算します。 + +**構文** + +```sql +subtractNanoseconds(date_time, num) +``` + +**パラメータ** + +- `date_time`: ナノ秒数を引き算する対象の日付と時刻。[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)、[String](../data-types/string.md)。 +- `num`: 引き算するナノ秒の数。[(U)Int*](../data-types/int-uint.md)、[Float*](../data-types/float.md)。 + +**返される値** + +- `date_time` から `num` ナノ秒を引いた結果を返します。 [DateTime64](../data-types/datetime64.md)。 + +**例** + +```sql +WITH + toDateTime('2024-01-01 00:00:00') AS date_time, + '2024-01-01 00:00:00' AS date_time_string +SELECT + subtractNanoseconds(date_time, 1000) AS subtract_nanoseconds_with_date_time, + subtractNanoseconds(date_time_string, 1000) AS subtract_nanoseconds_with_date_time_string +``` + +```response +┌─subtract_nanoseconds_with_date_time─┬─subtract_nanoseconds_with_date_time_string─┐ +│ 2023-12-31 23:59:59.999999000 │ 2023-12-31 23:59:59.999999000 │ +└─────────────────────────────────────┴────────────────────────────────────────────┘ +``` + +## subtractInterval + +別の間隔や間隔のタプルに対して、ネガティブな間隔を追加します。 + +**構文** + +```sql +subtractInterval(interval_1, interval_2) +``` + +**パラメータ** + +- `interval_1`: 最初の間隔またはタプルの間隔。[interval](../data-types/special-data-types/interval.md)、[tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 +- `interval_2`: ネガティブにする第2の間隔。[interval](../data-types/special-data-types/interval.md)。 + +**返される値** + +- 間隔のタプルを返します。[tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 + +:::note +同じタイプの間隔は、単一の間隔に結合されます。たとえば、 `toIntervalDay(2)` と `toIntervalDay(1)` が渡された場合、結果は `(1)` になります。 +::: + +**例** + +クエリ: + +```sql +SELECT subtractInterval(INTERVAL 1 DAY, INTERVAL 1 MONTH); +SELECT subtractInterval((INTERVAL 1 DAY, INTERVAL 1 YEAR), INTERVAL 1 MONTH); +SELECT subtractInterval(INTERVAL 2 DAY, INTERVAL 1 DAY); +``` + +結果: + +```response +┌─subtractInterval(toIntervalDay(1), toIntervalMonth(1))─┐ +│ (1,-1) │ +└────────────────────────────────────────────────────────┘ +┌─subtractInterval((toIntervalDay(1), toIntervalYear(1)), toIntervalMonth(1))─┐ +│ (1,1,-1) │ +└─────────────────────────────────────────────────────────────────────────────┘ +┌─subtractInterval(toIntervalDay(2), toIntervalDay(1))─┐ +│ (1) │ +└──────────────────────────────────────────────────────┘ +``` + +## subtractTupleOfIntervals + +日付または日付時刻からタプルの間隔を順次引き算します。 + +**構文** + +```sql +subtractTupleOfIntervals(interval_1, interval_2) +``` + +**パラメータ** + +- `date`: 最初の間隔またはタプルの間隔。[Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 +- `intervals`: `date` から引く間隔のタプル。[tuple](../data-types/tuple.md)([interval](../data-types/special-data-types/interval.md))。 + +**返される値** + +- 引かれた `intervals` を持つ `date` を返します。[Date](../data-types/date.md)/[Date32](../data-types/date32.md)/[DateTime](../data-types/datetime.md)/[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +```sql +WITH toDate('2018-01-01') AS date SELECT subtractTupleOfIntervals(date, (INTERVAL 1 DAY, INTERVAL 1 YEAR)) +``` + +結果: + +```response +┌─subtractTupleOfIntervals(date, (toIntervalDay(1), toIntervalYear(1)))─┐ +│ 2016-12-31 │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +## timeSlots + +‘StartTime’ から始まり ‘Duration’ 秒続く時間間隔において、この間隔内の時間の瞬間を、’Size’ 秒単位に切り捨てた点の配列を返します。’Size’ はオプションのパラメータで、デフォルトは 1800(30分)です。 +これは、対応するセッション内のページビューを検索する際に必要です。 +‘StartTime’ 引数には DateTime および DateTime64 を受け付けます。DateTime では、’Duration’ と ’Size’ 引数は `UInt32` でなければなりません。’DateTime64’ では、これらは `Decimal64` でなければなりません。 +DateTime/DateTime64 の配列を返します(戻り値の型は ’StartTime’ の型に一致します)。DateTime64 の場合、戻り値のスケールは ’StartTime’ のスケールと異なる場合があります --- すべての指定された引数の中で最も高いスケールが適用されます。 + +**構文** + +```sql +timeSlots(StartTime, Duration,\[, Size\]) +``` + +**例** + +```sql +SELECT timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600)); +SELECT timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299); +SELECT timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0)); +``` + +結果: + +``` text +┌─timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600))─┐ +│ ['2012-01-01 12:00:00','2012-01-01 12:30:00'] │ +└─────────────────────────────────────────────────────────────┘ +┌─timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299)─┐ +│ ['1980-12-12 20:56:13','1980-12-12 21:01:12','1980-12-12 21:06:11'] │ +└─────────────────────────────────────────────────────────────────────────┘ +┌─timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0))─┐ +│ ['1980-12-12 20:56:13.0000','1980-12-12 21:01:12.0000','1980-12-12 21:06:11.0000'] │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## formatDateTime + +指定された形式の文字列に従って時刻をフォーマットします。形式は定数式なので、単一の結果列に対して複数の形式を使用することはできません。 + +formatDateTime は MySQL の日付と時刻のフォーマットスタイルを使用します。詳細は https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format を参照してください。 + +この関数の逆操作は [parseDateTime](../functions/type-conversion-functions.md#type_conversion_functions-parseDateTime) です。 + +エイリアス: `DATE_FORMAT`。 + +**構文** + +``` sql +formatDateTime(Time, Format[, Timezone]) +``` + +**返される値** + +指定された形式に従い、日時の値を返します。 + +**置換フィールド** + +置換フィールドを使用して、結果の文字列のパターンを定義できます。“例” 列は `2018-01-02 22:33:44` に対するフォーマッティング結果を示しています。 + +| プレースホルダー | 説明 | 例 | +|----------|-------------------------------------------------|------------| +| %a | 短縮形の曜日名 (月-日) | Mon | +| %b | 短縮形の月名 (1月-12月) | Jan | +| %c | 月を整数番号 (01-12) で表す。’ノート3’を参照 | 01 | +| %C | 100年で割った後、整数に切り捨て(00-99) | 20 | +| %d | 月の日を0詰め(01-31) | 02 | +| %D | 短縮形のMM/DD/YYの日付(%m/%d/%yと同等) | 01/02/18 | +| %e | 月の日を空白詰め(1-31) |   2 | +| %f | 小数点以下の秒、’ノート1’を参照 | 1234560 | +| %F | 短縮形のYYYY-MM-DDの日付(%Y-%m-%dと同等) | 2018-01-02 | +| %g | ISO 8601に整列した2桁の年形式、4桁の表記から短縮化 | 18 | +| %G | ISO 週番号用の4桁の年形式、週ベースの年から計算 | 2018 | +| %h | 12時間形式の時(01-12) | 09 | +| %H | 24時間形式の時(00-23) | 22 | +| %i | 分(00-59) | 33 | +| %I | 12時間形式の時(01-12) | 10 | +| %j | 年の日(001-366) | 002 | +| %k | 24時間形式の時(00-23)、’ノート3’を参照 | 14 | +| %l | 12時間形式の時(01-12)、’ノート3’を参照 | 09 | +| %m | 月を整数番号 (01-12) で表す | 01 | +| %M | 完全な月名 (1月-12月)、’ノート2’を参照 | January | +| %n | 改行文字 (‘’) | | +| %p | AM または PM の指定 | PM | +| %Q | 四半期(1-4) | 1 | +| %r | 12時間HH:MM AM/PM形式、%h:%i %pと同等 | 10:30 PM | +| %R | 24時間HH:MM形式、%H:%iと同等 | 22:33 | +| %s | 秒(00-59) | 44 | +| %S | 秒(00-59) | 44 | +| %t | 横タブ文字(’) | | +| %T | ISO 8601形式の時刻 (HH:MM:SS)、%H:%i:%Sと同等 | 22:33:44 | +| %u | 月曜日を1とするISO 8601の曜日番号(1-7) | 2 | +| %V | ISO 8601週番号(01-53) | 01 | +| %w | 日曜日を0とする整数形式の曜日(0-6) | 2 | +| %W | 完全な曜日名(月曜日-日曜日) | Monday | +| %y | 年の最終2桁(00-99) | 18 | +| %Y | 年 | 2018 | +| %z | UTCとの時間オフセットを+HHMMまたは-HHMM形式で表示 | -0500 | +| %% | % 記号 | % | + +ノート1: ClickHouse のバージョンが v23.4 より以前のものである場合、`%f` は日付、Date32、または日付時刻(これらは小数点以下の秒を持たない)や DateTime64 の精度が 0 の場合、単一のゼロ (0) を印刷します。以前の動作は、設定 `formatdatetime_f_prints_single_zero = 1` を使用することで復元できます。 + +ノート2: ClickHouse のバージョンが v23.4 より以前のものである場合、`%M` は完全な月名(1月-12月)ではなく、分を印刷します(00-59)。以前の動作は、設定 `formatdatetime_parsedatetime_m_is_month_name = 0` を使用することで復元できます。 + +ノート3: ClickHouse のバージョンが v23.11 より以前のものである場合、関数 `parseDateTime()` はフォーマッタ `%c`(月)および `%l` / `%k`(時)に先頭のゼロを必要としていました。例: `07`。後のバージョンでは、先頭のゼロは省略できます、例: `7`。以前の動作は、設定 `parsedatetime_parse_without_leading_zeros = 0` を使用することで復元できます。関数 `formatDateTime()` はデフォルトでは依然として `%c` および `%l` / `%k` に先頭のゼロを印刷し、既存の使用例を壊さないようにします。この動作は、設定 `formatdatetime_format_without_leading_zeros = 1` によって変更できます。 + +**例** + +``` sql +SELECT formatDateTime(toDate('2010-01-04'), '%g') +``` + +結果: + +``` +┌─formatDateTime(toDate('2010-01-04'), '%g')─┐ +│ 10 │ +└────────────────────────────────────────────┘ +``` + +``` sql +SELECT formatDateTime(toDateTime64('2010-01-04 12:34:56.123456', 7), '%f') +``` + +結果: + +``` +┌─formatDateTime(toDateTime64('2010-01-04 12:34:56.123456', 7), '%f')─┐ +│ 1234560 │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +さらに、`formatDateTime` 関数は、タイムゾーンの名前を含む第3の文字列引数を取ることができます。例: `Asia/Istanbul`。この場合、指定されたタイムゾーンに従って時刻がフォーマットされます。 + +**例** + +```sql +SELECT + now() AS ts, + time_zone, + formatDateTime(ts, '%T', time_zone) AS str_tz_time +FROM system.time_zones +WHERE time_zone LIKE 'Europe%' +LIMIT 10 + +┌──────────────────ts─┬─time_zone─────────┬─str_tz_time─┐ +│ 2023-09-08 19:13:40 │ Europe/Amsterdam │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Andorra │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Astrakhan │ 23:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Athens │ 22:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Belfast │ 20:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Belgrade │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Berlin │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Bratislava │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Brussels │ 21:13:40 │ +│ 2023-09-08 19:13:40 │ Europe/Bucharest │ 22:13:40 │ +└─────────────────────┴───────────────────┴─────────────┘ +``` + +**関連情報** + +- [formatDateTimeInJodaSyntax](#formatdatetimeinjodasyntax) + +## formatDateTimeInJodaSyntax + +formatDateTime と似ていますが、MySQL スタイルの代わりに Joda スタイルで日付時刻をフォーマットします。詳細は https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html を参照してください。 + +この関数の逆操作は [parseDateTimeInJodaSyntax](../functions/type-conversion-functions.md#type_conversion_functions-parseDateTimeInJodaSyntax) です。 + +**置換フィールド** + +置換フィールドを使用して、結果の文字列のパターンを定義できます。 + +| プレースホルダー | 説明 | プレゼンテーション | 例 | +| ----------- | ---------------------------------- | ------------- | ------------------------------ | +| G | 年代 | テキスト | AD | +| C | 年代の世紀 (>=0) | 数字 | 20 | +| Y | 年代の年 (>=0) | 年 | 1996 | +| x | 週年(未対応) | 年 | 1996 | +| w | 週年の週(未対応) | 数字 | 27 | +| e | 曜日 | 数字 | 2 | +| E | 曜日 | テキスト | Tuesday; Tue | +| y | 年 | 年 | 1996 | +| D | 年の日 | 数字 | 189 | +| M | 年の月 | 月 | July; Jul; 07 | +| d | 月の日 | 数字 | 10 | +| a | 日の半分 | テキスト | PM | +| K | 半日の時刻 (0〜11) | 数字 | 0 | +| h | 半日の時刻 (1〜12) | 数字 | 12 | +| H | 一日の時刻 (0〜23) | 数字 | 0 | +| k | 一日の時刻 (1〜24) | 数字 | 24 | +| m | 時間の分 | 数字 | 30 | +| s | 分の秒 | 数字 | 55 | +| S | 秒の小数点以下(未対応) | 数字 | 978 | +| z | タイムゾーン(短縮名は未対応) | テキスト | 太平洋標準時; PST | +| Z | タイムゾーンオフセット/ID(未対応) | ゾーン | -0800; -08:00; America/Los_Angeles | +| ' | テキストのエスケープ | 区切り | | +| '' | 単一引用符 | リテラル | ' | + +**例** + +``` sql +SELECT formatDateTimeInJodaSyntax(toDateTime('2010-01-04 12:34:56'), 'yyyy-MM-dd HH:mm:ss') +``` + +結果: + +``` +┌─formatDateTimeInJodaSyntax(toDateTime('2010-01-04 12:34:56'), 'yyyy-MM-dd HH:mm:ss')─┐ +│ 2010-01-04 12:34:56 │ +└─────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## dateName + +指定された日付の部分を返します。 + +**構文** + +``` sql +dateName(date_part, date) +``` + +**引数** + +- `date_part` — 日付の部分。可能な値: 'year', 'quarter', 'month', 'week', 'dayofyear', 'day', 'weekday', 'hour', 'minute', 'second'。[String](../data-types/string.md)。 +- `date` — 日付。[Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 +- `timezone` — タイムゾーン。オプション。[String](../data-types/string.md)。 + +**返される値** + +- 指定された日付の部分。[String](../data-types/string.md#string) + +**例** + +```sql +WITH toDateTime('2021-04-14 11:22:33') AS date_value +SELECT + dateName('year', date_value), + dateName('month', date_value), + dateName('day', date_value); +``` + +結果: + +```text +┌─dateName('year', date_value)─┬─dateName('month', date_value)─┬─dateName('day', date_value)─┐ +│ 2021 │ April │ 14 │ +└──────────────────────────────┴───────────────────────────────┴─────────────────────────────┘ +``` + +## monthName + +月の名前を返します。 + +**構文** + +``` sql +monthName(date) +``` + +**引数** + +- `date` — 日付または時刻付きの日付。[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- 月の名前。[String](../data-types/string.md#string) + +**例** + +```sql +WITH toDateTime('2021-04-14 11:22:33') AS date_value +SELECT monthName(date_value); +``` + +結果: + +```text +┌─monthName(date_value)─┐ +│ April │ +└───────────────────────┘ +``` + +## fromUnixTimestamp + +この関数はUnixタイムスタンプをカレンダー日付と一日中の時間に変換します。 + +二つの方法で呼び出すことができます: + +単一の引数として [Integer](../data-types/int-uint.md) 型を渡すと、[DateTime](../data-types/datetime.md) 型の値を返します。すなわち、[toDateTime](../../sql-reference/functions/type-conversion-functions.md#todatetime) のように振舞います。 + +エイリアス: `FROM_UNIXTIME`。 + +**例:** + +```sql +SELECT fromUnixTimestamp(423543535); +``` + +結果: + +```text +┌─fromUnixTimestamp(423543535)─┐ +│ 1983-06-04 10:58:55 │ +└──────────────────────────────┘ +``` + +二つまたは三つの引数を与え、最初の引数に [Integer](../data-types/int-uint.md)、[Date](../data-types/date.md)、[Date32](../data-types/date32.md)、[DateTime](../data-types/datetime.md) または [DateTime64](../data-types/datetime64.md) の値を渡すと、第二の引数が定数形式の文字列、第三の引数がオプションの定数タイムゾーンの文字列になる場合、この関数は[String](../data-types/string.md#string) 型の値を返します。すなわち、[formatDateTime](#formatdatetime) のように振舞います。この場合、[MySQL の日付と時刻のフォーマットスタイル](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format) が使用されます。 + +**例:** + +```sql +SELECT fromUnixTimestamp(1234334543, '%Y-%m-%d %R:%S') AS DateTime; +``` + +結果: + +```text +┌─DateTime────────────┐ +│ 2009-02-11 14:42:23 │ +└─────────────────────┘ +``` + +**関連情報** + +- [fromUnixTimestampInJodaSyntax](#fromunixtimestampinjodasyntax) + +## fromUnixTimestampInJodaSyntax + +[fromUnixTimestamp](#fromunixtimestamp)と同様ですが、二つまたは三つの引数で呼び出す際には、日付フォーマットが[MySQLスタイル](https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html)ではなくJodaスタイルで実行されます。 + +**例:** + +``` sql +SELECT fromUnixTimestampInJodaSyntax(1234334543, 'yyyy-MM-dd HH:mm:ss', 'UTC') AS DateTime; +``` + +結果: + +``` +┌─DateTime────────────┐ +│ 2009-02-11 06:42:23 │ +└─────────────────────┘ +``` + +## toModifiedJulianDay + +[プロレプティックグレゴリオ暦](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar)の日付をテキスト形式 `YYYY-MM-DD`から[修正ユリウス日](https://en.wikipedia.org/wiki/Julian_day#Variants)番号に変換します。この関数は `0000-01-01` から `9999-12-31` までの日付をサポートします。引数が日付として解析できない場合や無効な日付の場合は例外を発生させます。 + +**構文** + +``` sql +toModifiedJulianDay(date) +``` + +**引数** + +- `date` — テキスト形式の日付。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- 修正ユリウス日番号。[Int32](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT toModifiedJulianDay('2020-01-01'); +``` + +結果: + +``` text +┌─toModifiedJulianDay('2020-01-01')─┐ +│ 58849 │ +└───────────────────────────────────┘ +``` + +## toModifiedJulianDayOrNull + +[toModifiedJulianDay()](#tomodifiedjulianday) よりも似ていますが、例外を発生させる代わりに `NULL` を返します。 + +**構文** + +``` sql +toModifiedJulianDayOrNull(date) +``` + +**引数** + +- `date` — テキスト形式の日付。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- 修正ユリウス日番号。[Nullable(Int32)](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT toModifiedJulianDayOrNull('2020-01-01'); +``` + +結果: + +``` text +┌─toModifiedJulianDayOrNull('2020-01-01')─┐ +│ 58849 │ +└─────────────────────────────────────────┘ +``` + +## fromModifiedJulianDay + +修正ユリウス日番号を[プロレプティックグレゴリオ暦](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar)の日付形式 `YYYY-MM-DD` に変換します。この関数は、`-678941` から `2973483` までの整数をサポートします(これにより `0000-01-01` と `9999-12-31` を表します)。日数がサポートされた範囲外の場合は例外を発生させます。 + +**構文** + +``` sql +fromModifiedJulianDay(day) +``` + +**引数** + +- `day` — 修正ユリウス日番号。[任意の整数型](../data-types/int-uint.md)。 + +**返される値** + +- テキスト形式の日付。[String](../data-types/string.md) + +**例** + +``` sql +SELECT fromModifiedJulianDay(58849); +``` + +結果: + +``` text +┌─fromModifiedJulianDay(58849)─┐ +│ 2020-01-01 │ +└──────────────────────────────┘ +``` + +## fromModifiedJulianDayOrNull + +[fromModifiedJulianDayOrNull()](#frommodifiedjuliandayornull) と似ていますが、例外を発生させる代わりに `NULL` を返します。 + +**構文** + +``` sql +fromModifiedJulianDayOrNull(day) +``` + +**引数** + +- `day` — 修正ユリウス日番号。[任意の整数型](../data-types/int-uint.md)。 + +**返される値** + +- テキスト形式の日付。[Nullable(String)](../data-types/string.md) + +**例** + +``` sql +SELECT fromModifiedJulianDayOrNull(58849); +``` + +結果: + +``` text +┌─fromModifiedJulianDayOrNull(58849)─┐ +│ 2020-01-01 │ +└────────────────────────────────────┘ +``` + +## toUTCTimestamp + +他のタイムゾーンからUTCタイムスタンプにDateTime/DateTime64型の値を変換します。 + +**構文** + +``` sql +toUTCTimestamp(time_val, time_zone) +``` + +**引数** + +- `time_val` — DateTime/DateTime64型の定数値または式。[DateTime/DateTime64型](../data-types/datetime.md) +- `time_zone` — タイムゾーンを表す定数の文字列値または式。[String型](../data-types/string.md) + +**返される値** + +- テキスト形式のDateTime/DateTime64 + +**例** + +``` sql +SELECT toUTCTimestamp(toDateTime('2023-03-16'), 'Asia/Shanghai'); +``` + +結果: + +``` text +┌─toUTCTimestamp(toDateTime('2023-03-16'),'Asia/Shanghai')┐ +│ 2023-03-15 16:00:00 │ +└─────────────────────────────────────────────────────────┘ +``` + +## fromUTCTimestamp + +UTCタイムゾーンから他のタイムゾーンのタイムスタンプにDateTime/DateTime64型の値を変換します。 + +**構文** + +``` sql +fromUTCTimestamp(time_val, time_zone) +``` + +**引数** + +- `time_val` — DateTime/DateTime64型の定数値または式。[DateTime/DateTime64型](../data-types/datetime.md) +- `time_zone` — タイムゾーンを表す定数の文字列値または式。[String型](../data-types/string.md) + +**返される値** + +- テキスト形式のDateTime/DateTime64 + +**例** + +``` sql +SELECT fromUTCTimestamp(toDateTime64('2023-03-16 10:00:00', 3), 'Asia/Shanghai'); +``` + +結果: + +``` text +┌─fromUTCTimestamp(toDateTime64('2023-03-16 10:00:00',3),'Asia/Shanghai')─┐ +│ 2023-03-16 18:00:00.000 │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +## UTCTimestamp + +クエリ分析の瞬間における現在の日付と時刻を返します。この関数は定数式です。 + +:::note +この関数は `now('UTC')` と同じ結果を返します。MySQLサポートのために追加されたものであり、[`now`](#now) が推奨される使用法です。 +::: + +**構文** + +```sql +UTCTimestamp() +``` + +エイリアス: `UTC_timestamp`。 + +**返される値** + +- クエリ分析の瞬間における現在の日付と時刻を返します。[DateTime](../data-types/datetime.md)。 + +**例** + +クエリ: + +```sql +SELECT UTCTimestamp(); +``` + +結果: + +```response +┌──────UTCTimestamp()─┐ +│ 2024-05-28 08:32:09 │ +└─────────────────────┘ +``` + +## timeDiff + +二つの日付または日付時刻値の差を返します。差は秒単位で計算されます。これは `dateDiff` と同じであり、MySQLサポートのために追加されました。`dateDiff` が推奨されます。 + +**構文** + +```sql +timeDiff(first_datetime, second_datetime) +``` + +**引数** + +- `first_datetime` — DateTime/DateTime64型の定数値または式。[DateTime/DateTime64型](../data-types/datetime.md) +- `second_datetime` — DateTime/DateTime64型の定数値または式。[DateTime/DateTime64型](../data-types/datetime.md) + +**返される値** + +二つの日付または日付時刻の値の秒数の差。 + +**例** + +クエリ: + +```sql +timeDiff(toDateTime64('1927-01-01 00:00:00', 3), toDate32('1927-01-02')); +``` + +**結果**: + +```response +┌─timeDiff(toDateTime64('1927-01-01 00:00:00', 3), toDate32('1927-01-02'))─┐ +│ 86400 │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +## 関連コンテンツ + +- ブログ: [ClickHouseでの時系列データの操作](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/sql-reference/functions/distance-functions.md b/docs/ja/sql-reference/functions/distance-functions.md new file mode 100644 index 00000000000..65f3cc5eeae --- /dev/null +++ b/docs/ja/sql-reference/functions/distance-functions.md @@ -0,0 +1,555 @@ +--- +slug: /ja/sql-reference/functions/distance-functions +sidebar_position: 55 +sidebar_label: 距離 +--- + +# 距離関数 + +## L1Norm + +ベクトルの絶対値の合計を計算します。 + +**構文** + +```sql +L1Norm(vector) +``` + +別名: `normL1`. + +**引数** + +- `vector` — [Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- L1-ノルムまたは[タクシー幾何学](https://en.wikipedia.org/wiki/Taxicab_geometry)距離。[UInt](../data-types/int-uint.md)、[Float](../data-types/float.md)または[Decimal](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT L1Norm((1, 2)); +``` + +結果: + +```text +┌─L1Norm((1, 2))─┐ +│ 3 │ +└────────────────┘ +``` + +## L2Norm + +ベクトル値の平方和の平方根を計算します。 + +**構文** + +```sql +L2Norm(vector) +``` + +別名: `normL2`. + +**引数** + +- `vector` — [Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- L2-ノルムまたは[ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance)。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT L2Norm((1, 2)); +``` + +結果: + +```text +┌───L2Norm((1, 2))─┐ +│ 2.23606797749979 │ +└──────────────────┘ +``` + +## L2SquaredNorm + +ベクトル値の平方和の平方根([L2Norm](#l2norm))の平方を計算します。 + +**構文** + +```sql +L2SquaredNorm(vector) +``` + +別名: `normL2Squared`. + +***引数** + +- `vector` — [Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- L2-ノルムの平方。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT L2SquaredNorm((1, 2)); +``` + +結果: + +```text +┌─L2SquaredNorm((1, 2))─┐ +│ 5 │ +└───────────────────────┘ +``` + +## LinfNorm + +ベクトルの絶対値の最大値を計算します。 + +**構文** + +```sql +LinfNorm(vector) +``` + +別名: `normLinf`. + +**引数** + +- `vector` — [Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- Linf-ノルムまたは絶対値の最大値。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT LinfNorm((1, -2)); +``` + +結果: + +```text +┌─LinfNorm((1, -2))─┐ +│ 2 │ +└───────────────────┘ +``` + +## LpNorm + +ベクトル内の絶対値の合計を `p` 乗したものの `p` 乗根を計算します。 + +**構文** + +```sql +LpNorm(vector, p) +``` + +別名: `normLp`. + +**引数** + +- `vector` — [Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `p` — 指数。可能な値: [1; inf) の範囲の実数。[UInt](../data-types/int-uint.md) または [Float](../data-types/float.md)。 + +**返される値** + +- [Lp-ノルム](https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm)。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT LpNorm((1, -2), 2); +``` + +結果: + +```text +┌─LpNorm((1, -2), 2)─┐ +│ 2.23606797749979 │ +└────────────────────┘ +``` + +## L1Distance + +2点間の距離を `L1` 空間(1-ノルム、[タクシー幾何学](https://en.wikipedia.org/wiki/Taxicab_geometry)距離)で計算します。 + +**構文** + +```sql +L1Distance(vector1, vector2) +``` + +別名: `distanceL1`. + +**引数** + +- `vector1` — 第1ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- 1-ノルム距離。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT L1Distance((1, 2), (2, 3)); +``` + +結果: + +```text +┌─L1Distance((1, 2), (2, 3))─┐ +│ 2 │ +└────────────────────────────┘ +``` + +## L2Distance + +2点間の距離をユークリッド空間([ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance))で計算します。 + +**構文** + +```sql +L2Distance(vector1, vector2) +``` + +別名: `distanceL2`. + +**引数** + +- `vector1` — 第1ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- 2-ノルム距離。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT L2Distance((1, 2), (2, 3)); +``` + +結果: + +```text +┌─L2Distance((1, 2), (2, 3))─┐ +│ 1.4142135623730951 │ +└────────────────────────────┘ +``` + +## L2SquaredDistance + +2つのベクトルの対応する要素間の差の平方和を計算します。 + +**構文** + +```sql +L2SquaredDistance(vector1, vector2) +``` + +別名: `distanceL2Squared`. + +**引数** + +- `vector1` — 第1ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- 2つのベクトルの対応する要素間の差の平方和。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT L2SquaredDistance([1, 2, 3], [0, 0, 0]) +``` + +結果: + +```response +┌─L2SquaredDistance([1, 2, 3], [0, 0, 0])─┐ +│ 14 │ +└─────────────────────────────────────────┘ +``` + +## LinfDistance + +2点間の距離を `L_{inf}` 空間([最大ノルム](https://en.wikipedia.org/wiki/Norm_(mathematics)#Maximum_norm_(special_case_of:_infinity_norm,_uniform_norm,_or_supremum_norm)))で計算します。 + +**構文** + +```sql +LinfDistance(vector1, vector2) +``` + +別名: `distanceLinf`. + +**引数** + +- `vector1` — 第1ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- 無限ノルム距離。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT LinfDistance((1, 2), (2, 3)); +``` + +結果: + +```text +┌─LinfDistance((1, 2), (2, 3))─┐ +│ 1 │ +└──────────────────────────────┘ +``` + +## LpDistance + +2点間の距離を `Lp` 空間([p-ノルム距離](https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm))で計算します。 + +**構文** + +```sql +LpDistance(vector1, vector2, p) +``` + +別名: `distanceLp`. + +**引数** + +- `vector1` — 第1ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2ベクトル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `p` — 指数。可能な値: [1;inf) の範囲の任意の数。[UInt](../data-types/int-uint.md) または [Float](../data-types/float.md)。 + +**返される値** + +- p-ノルム距離。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT LpDistance((1, 2), (2, 3), 3); +``` + +結果: + +```text +┌─LpDistance((1, 2), (2, 3), 3)─┐ +│ 1.2599210498948732 │ +└───────────────────────────────┘ +``` + +## L1Normalize + +指定されたベクトルの単位ベクトルを `L1` 空間([タクシー幾何学](https://en.wikipedia.org/wiki/Taxicab_geometry))で計算します。 + +**構文** + +```sql +L1Normalize(tuple) +``` + +別名: `normalizeL1`. + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 + +**返される値** + +- 単位ベクトル。[Float](../data-types/float.md)の[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT L1Normalize((1, 2)); +``` + +結果: + +```text +┌─L1Normalize((1, 2))─────────────────────┐ +│ (0.3333333333333333,0.6666666666666666) │ +└─────────────────────────────────────────┘ +``` + +## L2Normalize + +指定されたベクトルの単位ベクトルをユークリッド空間([ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance)を使用)で計算します。 + +**構文** + +```sql +L2Normalize(tuple) +``` + +別名: `normalizeL1`. + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 + +**返される値** + +- 単位ベクトル。[Float](../data-types/float.md)の[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT L2Normalize((3, 4)); +``` + +結果: + +```text +┌─L2Normalize((3, 4))─┐ +│ (0.6,0.8) │ +└─────────────────────┘ +``` + +## LinfNormalize + +指定されたベクトルの単位ベクトルを `L_{inf}` 空間([最大ノルム](https://en.wikipedia.org/wiki/Norm_(mathematics)#Maximum_norm_(special_case_of:_infinity_norm,_uniform_norm,_or_supremum_norm)を使用)で計算します。 + +**構文** + +```sql +LinfNormalize(tuple) +``` + +別名: `normalizeLinf `. + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 + +**返される値** + +- 単位ベクトル。[Float](../data-types/float.md)の[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT LinfNormalize((3, 4)); +``` + +結果: + +```text +┌─LinfNormalize((3, 4))─┐ +│ (0.75,1) │ +└───────────────────────┘ +``` + +## LpNormalize + +指定されたベクトルの単位ベクトルを `Lp` 空間([p-ノルム](https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm)を使用)で計算します。 + +**構文** + +```sql +LpNormalize(tuple, p) +``` + +別名: `normalizeLp `. + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 +- `p` — 指数。可能な値: [1;inf) の範囲の任意の数。[UInt](../data-types/int-uint.md) または [Float](../data-types/float.md)。 + +**返される値** + +- 単位ベクトル。[Float](../data-types/float.md)の[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT LpNormalize((3, 4),5); +``` + +結果: + +```text +┌─LpNormalize((3, 4), 5)──────────────────┐ +│ (0.7187302630182624,0.9583070173576831) │ +└─────────────────────────────────────────┘ +``` + +## cosineDistance + +2つのベクトル間のコサイン距離を計算します(タプルの値は座標です)。返される値が小さいほど、ベクトルは類似しています。 + +**構文** + +```sql +cosineDistance(vector1, vector2) +``` + +**引数** + +- `vector1` — 第1タプル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 +- `vector2` — 第2タプル。[Tuple](../data-types/tuple.md) または [Array](../data-types/array.md)。 + +**返される値** + +- 2つのベクトル間の角度の余弦を1から減じたもの。[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT cosineDistance((1, 2), (2, 3)); +``` + +結果: + +```text +┌─cosineDistance((1, 2), (2, 3))─┐ +│ 0.007722123286332261 │ +└────────────────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/functions/encoding-functions.md b/docs/ja/sql-reference/functions/encoding-functions.md new file mode 100644 index 00000000000..b747069ac72 --- /dev/null +++ b/docs/ja/sql-reference/functions/encoding-functions.md @@ -0,0 +1,960 @@ +--- +slug: /ja/sql-reference/functions/encoding-functions +sidebar_position: 65 +sidebar_label: エンコーディング +--- + +# エンコーディング関数 + +## char + +渡された引数の数を長さとし、それぞれの引数に対応するバイト値を持つ文字列を返します。数値型の引数を複数受け取ります。引数の値が UInt8 データ型の範囲外である場合は、丸めやオーバーフローが発生する可能性がありますが、UInt8 に変換されます。 + +**構文** + +``` sql +char(number_1, [number_2, ..., number_n]); +``` + +**引数** + +- `number_1, number_2, ..., number_n` — 整数として解釈される数値引数。型: [Int](../data-types/int-uint.md), [Float](../data-types/float.md)。 + +**返される値** + +- 指定されたバイトの文字列。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT char(104.1, 101, 108.9, 108.9, 111) AS hello; +``` + +結果: + +``` text +┌─hello─┐ +│ hello │ +└───────┘ +``` + +対応するバイトを渡して任意のエンコーディングの文字列を構築できます。UTF-8の例がここにあります: + +クエリ: + +``` sql +SELECT char(0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82) AS hello; +``` + +結果: + +``` text +┌─hello──┐ +│ привет │ +└────────┘ +``` + +クエリ: + +``` sql +SELECT char(0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD) AS hello; +``` + +結果: + +``` text +┌─hello─┐ +│ 你好 │ +└───────┘ +``` + +## hex + +引数の16進数表現を含む文字列を返します。 + +別名: `HEX`. + +**構文** + +``` sql +hex(arg) +``` + +この関数は大文字の `A-F` を使用し、接頭辞(例えば `0x`)や接尾辞(例えば `h`)は使用しません。 + +整数引数の場合、重大な桁から最小桁までの16進数の数字("ニブル")を印刷します(ビッグエンディアンまたは「人間が読める」順序)。最も重要な非ゼロバイトから始めます(リーディングゼロバイトは省略されます)が、各バイトの先行ゼロの桁がゼロであっても常に両方の桁を印刷します。 + +型 [Date](../data-types/date.md) および [DateTime](../data-types/datetime.md) の値は、対応する整数としてフォーマットされます(Date の場合はエポック以降の日数、DateTime の場合はUnix タイムスタンプの値)。 + +[String](../data-types/string.md) および [FixedString](../data-types/fixedstring.md) の場合、すべてのバイトが2つの16進数として単純にエンコードされます。ゼロバイトは省略されません。 + +型 [Float](../data-types/float.md) および [Decimal](../data-types/decimal.md) の値は、メモリ内での表現としてエンコードされます。リトルエンディアンアーキテクチャをサポートしているため、リトルエンディアンでエンコードされます。ゼロのリーディング/トレーリングバイトは省略されません。 + +型 [UUID](../data-types/uuid.md) の値は、ビッグエンディアン順序の文字列としてエンコードされます。 + +**引数** + +- `arg` — 16進数に変換する値。型: [String](../data-types/string.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md), [Decimal](../data-types/decimal.md), [Date](../data-types/date.md) もしくは [DateTime](../data-types/datetime.md)。 + +**返される値** + +- 引数の16進数表現を持つ文字列。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT hex(1); +``` + +結果: + +``` text +01 +``` + +クエリ: + +``` sql +SELECT hex(toFloat32(number)) AS hex_presentation FROM numbers(15, 2); +``` + +結果: + +``` text +┌─hex_presentation─┐ +│ 00007041 │ +│ 00008041 │ +└──────────────────┘ +``` + +クエリ: + +``` sql +SELECT hex(toFloat64(number)) AS hex_presentation FROM numbers(15, 2); +``` + +結果: + +``` text +┌─hex_presentation─┐ +│ 0000000000002E40 │ +│ 0000000000003040 │ +└──────────────────┘ +``` + +クエリ: + +``` sql +SELECT lower(hex(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0'))) as uuid_hex +``` + +結果: + +``` text +┌─uuid_hex─────────────────────────┐ +│ 61f0c4045cb311e7907ba6006ad3dba0 │ +└──────────────────────────────────┘ +``` + +## unhex + +[hex](#hex) の反対の操作を行います。引数内の各ペアの16進数の数字を数値として解釈し、その数値を表すバイトに変換します。返される値はバイナリ文字列(BLOB)です。 + +結果を数値に変換したい場合は、[reverse](../../sql-reference/functions/string-functions.md#reverse) および [reinterpretAs<Type>](../../sql-reference/functions/type-conversion-functions.md#type-conversion-functions) 関数を使用できます。 + +:::note +`unhex`が`clickhouse-client`内から呼び出された場合、バイナリ文字列はUTF-8を使用して表示されます。 +::: + +別名: `UNHEX`. + +**構文** + +``` sql +unhex(arg) +``` + +**引数** + +- `arg` — 16進数の数字を含む文字列。[String](../data-types/string.md), [FixedString](../data-types/fixedstring.md)。 + +大文字と小文字の両方の`A-F`をサポートします。16進数の桁数は偶数である必要はありません。奇数の場合、最後の桁は`00-0F`バイトの最下位半分として解釈されます。引数文字列に16進数の数字以外のものが含まれている場合、実装定義の結果が返されます(例外はスローされません)。数値引数の場合、hex(N)の逆はunhex()によって実行されません。 + +**返される値** + +- バイナリ文字列(BLOB)。[String](../data-types/string.md)。 + +**例** + +クエリ: +``` sql +SELECT unhex('303132'), UNHEX('4D7953514C'); +``` + +結果: +``` text +┌─unhex('303132')─┬─unhex('4D7953514C')─┐ +│ 012 │ MySQL │ +└─────────────────┴─────────────────────┘ +``` + +クエリ: + +``` sql +SELECT reinterpretAsUInt64(reverse(unhex('FFF'))) AS num; +``` + +結果: + +``` text +┌──num─┐ +│ 4095 │ +└──────┘ +``` + +## bin + +引数のバイナリ表現を含む文字列を返します。 + +**構文** + +``` sql +bin(arg) +``` + +別名: `BIN`. + +整数引数の場合、重大な桁から最小桁までのbinの数字を印刷します(ビッグエンディアンまたは「人間が読める」順序)。最も重要な非ゼロバイトから始めます(リーディングゼロバイトは省略されます)が、各バイトの先行ゼロの桁がゼロであっても常に8桁を印刷します。 + +型 [Date](../data-types/date.md) および [DateTime](../data-types/datetime.md) の値は、対応する整数としてフォーマットされます(Date の場合はエポック以降の日数、DateTime の場合は Unix タイムスタンプの値)。 + +[String](../data-types/string.md) および [FixedString](../data-types/fixedstring.md) の場合、すべてのバイトが8つのバイナリ数値として単純にエンコードされます。ゼロバイトは省略されません。 + +型 [Float](../data-types/float.md) および [Decimal](../data-types/decimal.md) の値は、メモリ内での表現としてエンコードされます。リトルエンディアンアーキテクチャをサポートしているため、リトルエンディアンでエンコードされます。ゼロのリーディング/トレーリングバイトは省略されません。 + +型 [UUID](../data-types/uuid.md) の値は、ビッグエンディアン順序の文字列としてエンコードされます。 + +**引数** + +- `arg` — バイナリに変換する値。[String](../data-types/string.md), [FixedString](../data-types/fixedstring.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md), [Decimal](../data-types/decimal.md), [Date](../data-types/date.md) もしくは [DateTime](../data-types/datetime.md)。 + +**返される値** + +- 引数のバイナリ表現を持つ文字列。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT bin(14); +``` + +結果: + +``` text +┌─bin(14)──┐ +│ 00001110 │ +└──────────┘ +``` + +クエリ: + +``` sql +SELECT bin(toFloat32(number)) AS bin_presentation FROM numbers(15, 2); +``` + +結果: + +``` text +┌─bin_presentation─────────────────┐ +│ 00000000000000000111000001000001 │ +│ 00000000000000001000000001000001 │ +└──────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT bin(toFloat64(number)) AS bin_presentation FROM numbers(15, 2); +``` + +結果: + +``` text +┌─bin_presentation─────────────────────────────────────────────────┐ +│ 0000000000000000000000000000000000000000000000000010111001000000 │ +│ 0000000000000000000000000000000000000000000000000011000001000000 │ +└──────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT bin(toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0')) as bin_uuid +``` + +結果: + +``` text +┌─bin_uuid─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 01100001111100001100010000000100010111001011001100010001111001111001000001111011101001100000000001101010110100111101101110100000 │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## unbin + +引数内の各ペアのバイナリ数字を数値として解釈し、その数値を表すバイトに変換します。関数は [bin](#bin) の逆の操作を行います。 + +**構文** + +``` sql +unbin(arg) +``` + +別名: `UNBIN`. + +数値引数について `unbin()` は `bin()` の逆を返しません。結果を数値に変換したい場合は、[reverse](../../sql-reference/functions/string-functions.md#reverse) および [reinterpretAs<Type>](../../sql-reference/functions/type-conversion-functions.md#reinterpretasuint8163264) 関数を使用できます。 + +:::note +`unbin`が`clickhouse-client`内から呼び出された場合、バイナリ文字列はUTF-8を使用して表示されます。 +::: + +バイナリ数字`0`と`1`をサポートします。バイナリ数字の数が8の倍数である必要はありません。引数文字列にバイナリ数字以外のものが含まれている場合、実装定義の結果が返されます(例外はスローされません)。 + +**引数** + +- `arg` — バイナリ数字を含む文字列。[String](../data-types/string.md)。 + +**返される値** + +- バイナリ文字列(BLOB)。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT UNBIN('001100000011000100110010'), UNBIN('0100110101111001010100110101000101001100'); +``` + +結果: + +``` text +┌─unbin('001100000011000100110010')─┬─unbin('0100110101111001010100110101000101001100')─┐ +│ 012 │ MySQL │ +└───────────────────────────────────┴───────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT reinterpretAsUInt64(reverse(unbin('1110'))) AS num; +``` + +結果: + +``` text +┌─num─┐ +│ 14 │ +└─────┘ +``` + +## bitmaskToList(num) + +整数を受け取り、元の数値を合計したときに構成する2の累乗の一覧を含む文字列を返します。コンマで区切られてスペースがなく、テキスト形式では昇順です。 + +## bitmaskToArray(num) + +整数を受け取り、元の数値を合計したときに構成する2の累乗の一覧を含む `UInt64` 数値の配列を返します。配列内の数値は昇順です。 + +## bitPositionsToArray(num) + +整数を受け取り、それを符号なし整数に変換します。`arg`のビットの位置で`1`と等しいものの一覧を含む`UInt64` 数値の配列を昇順で返します。 + +**構文** + +```sql +bitPositionsToArray(arg) +``` + +**引数** + +- `arg` — 整数値。[Int/UInt](../data-types/int-uint.md)。 + +**返される値** + +- `1`と等しいビットの位置の一覧を含む配列を、昇順で。[Array](../data-types/array.md)([UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT bitPositionsToArray(toInt8(1)) AS bit_positions; +``` + +結果: + +``` text +┌─bit_positions─┐ +│ [0] │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT bitPositionsToArray(toInt8(-1)) AS bit_positions; +``` + +結果: + +``` text +┌─bit_positions─────┐ +│ [0,1,2,3,4,5,6,7] │ +└───────────────────┘ +``` + +## mortonEncode + +符号なし整数のリストに対してモートンエンコーディング(ZCurve)を計算します。 + +この関数には2つの操作モードがあります: +- シンプル +- 拡張 + +### シンプルモード + +引数として最大8つの符号なし整数を受け取り、`UInt64` コードを生成します。 + +**構文** + +```sql +mortonEncode(args) +``` + +**パラメータ** + +- `args`: 最大8つの[符号なし整数](../data-types/int-uint.md)またはそれに関連する型のカラム。 + +**返される値** + +- `UInt64` コード。[UInt64](../data-types/int-uint.md) + +**例** + +クエリ: + +```sql +SELECT mortonEncode(1, 2, 3); +``` + +結果: + +```response +53 +``` + +### 拡張モード + +最初の引数としてレンジマスク([タプル](../data-types/tuple.md))を受け取り、他の引数として最大8つの[符号なし整数](../data-types/int-uint.md)を受け取ります。 + +マスク内の各数値は、範囲展開の量を設定します:
    +1 - 拡張なし
    +2 - 2倍拡張
    +3 - 3倍拡張
    +...
    +最大8倍拡張。
    + +**構文** + +```sql +mortonEncode(range_mask, args) +``` + +**パラメータ** +- `range_mask`: 1-8。 +- `args`: 最大8つの[符号なし整数](../data-types/int-uint.md)またはそれに関連する型のカラム。 + +注: `args`にカラムを使用する場合、提供された`range_mask`タプルは依然として定数である必要があります。 + +**返される値** + +- `UInt64` コード。[UInt64](../data-types/int-uint.md) + +**例** + +例えば、異なる範囲やカーディナリティを持つ引数に対して、類似の分布が必要な場合に範囲拡張が有用です。 例えば、'IPアドレス' (0...FFFFFFFF) と '国コード' (0...FF) の場合。 + +クエリ: + +```sql +SELECT mortonEncode((1,2), 1024, 16); +``` + +結果: + +```response +1572864 +``` + +注: タプルのサイズは他の引数の数と等しくなければなりません。 + +**例** + +1つの引数に対するモートンエンコードは常に自身となります: + +クエリ: + +```sql +SELECT mortonEncode(1); +``` + +結果: + +```response +1 +``` + +**例** + +一つの引数を拡張することもできます: + +クエリ: + +```sql +SELECT mortonEncode(tuple(2), 128); +``` + +結果: + +```response +32768 +``` + +**例** + +関数内でカラム名を使用することもできます。 + +クエリ: + +まずテーブルを作成し、いくつかのデータを挿入します。 + +```sql +create table morton_numbers( + n1 UInt32, + n2 UInt32, + n3 UInt16, + n4 UInt16, + n5 UInt8, + n6 UInt8, + n7 UInt8, + n8 UInt8 +) +Engine=MergeTree() +ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi'; +insert into morton_numbers (*) values(1,2,3,4,5,6,7,8); +``` +カラム名を使用して`mortonEncode`の関数引数として定数の代わりに使用 + +クエリ: + +```sql +SELECT mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8) FROM morton_numbers; +``` + +結果: + +```response +2155374165 +``` + +**実装の詳細** + +`UInt64`のモートンコードには情報のビット数が制限されます。2つの引数は各引数の最大範囲が2^32(64/2)です。3つの引数には最大範囲が2^21(64/3)です。すべてのオーバーフローはゼロにクリップされます。 + +## mortonDecode + +モートンエンコーディング(ZCurve)を符号なし整数の組にデコードし、対応する座標を返します。 + +この関数にも `mortonEncode` 関数と同様に2つの操作モードがあります: +- シンプル +- 拡張 + +### シンプルモード + +最初の引数として結果のタプルサイズを受け取り、第2引数としてコードを受け取ります。 + +**構文** + +```sql +mortonDecode(tuple_size, code) +``` + +**パラメータ** +- `tuple_size`: 8以下の整数値。 +- `code`: [UInt64](../data-types/int-uint.md) コード。 + +**返される値** + +- 指定されたサイズの[タプル](../data-types/tuple.md)。[UInt64](../data-types/int-uint.md) + +**例** + +クエリ: + +```sql +SELECT mortonDecode(3, 53); +``` + +結果: + +```response +["1","2","3"] +``` + +### 拡張モード + +最初の引数としてレンジマスク(タプル)を受け取り、第2引数としてコードを受け取ります。 +マスク内の各数値は、対応する引数を範囲内で実質的にスケーリングするために左シフトされるビット数を設定します。 + +似たような範囲やカーディナリティを持つ引数に対しては、範囲拡張が有益です。 +たとえば、'IPアドレス' (0...FFFFFFFF) および '国コード' (0...FF)。 +エンコード関数と同様に、最大8つの数値に制限されています。 + +**例** + +1つの引数に対するモートンコードは常に自身の引数となります(タプル)。 + +クエリ: + +```sql +SELECT mortonDecode(1, 1); +``` + +結果: + +```response +["1"] +``` + +**例** + +1つの引数がビットシフトを指定するタプルと一緒に提供された場合、関数はこの引数を指定されたビット数だけ右シフトします。 + +クエリ: + +```sql +SELECT mortonDecode(tuple(2), 32768); +``` + +結果: + +```response +["128"] +``` + +**例** + +関数はセカンド引数としてコードのカラムを受け付けます: + +まずテーブルを作成し、いくつかのデータを挿入します。 + +クエリ: +```sql +create table morton_numbers( + n1 UInt32, + n2 UInt32, + n3 UInt16, + n4 UInt16, + n5 UInt8, + n6 UInt8, + n7 UInt8, + n8 UInt8 +) +Engine=MergeTree() +ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi'; +insert into morton_numbers (*) values(1,2,3,4,5,6,7,8); +``` +カラム名を使用して`mortonDecode`の関数引数として定数の代わりに使用 + +クエリ: + +```sql +select untuple(mortonDecode(8, mortonEncode(n1, n2, n3, n4, n5, n6, n7, n8))) from morton_numbers; +``` + +結果: + +```response +1 2 3 4 5 6 7 8 +``` + +## hilbertEncode + +ヒルベルト曲線のコードを符号なし整数のリストに対して計算します。 + +この関数は2つの操作モードを持ちます: +- シンプル +- 拡張 + +### シンプルモード + +引数として最大2つの符号なし整数を受け取り、`UInt64` コードを生成します。 + +**構文** + +```sql +hilbertEncode(args) +``` + +**パラメータ** + +- `args`: 最大2つの[符号なし整数](../../sql-reference/data-types/int-uint.md)またはそれに関連する型のカラム。 + +**返される値** + +- `UInt64` コード + +型: [UInt64](../../sql-reference/data-types/int-uint.md) + +**例** + +クエリ: + +```sql +SELECT hilbertEncode(3, 4); +``` +結果: + +```response +31 +``` + +### 拡張モード + +最初の引数としてレンジマスク([タプル](../../sql-reference/data-types/tuple.md))を受け取り、他の引数として最大2つの[符号なし整数](../../sql-reference/data-types/int-uint.md)を受け取ります。 + +マスク内の各数値は、対応する引数を左にシフトするビット数を設定し、実質的にその範囲内で引数をスケーリングします。 + +**構文** + +```sql +hilbertEncode(range_mask, args) +``` + +**パラメータ** +- `range_mask`: ([タプル](../../sql-reference/data-types/tuple.md)) +- `args`: 最大2つの[符号なし整数](../../sql-reference/data-types/int-uint.md)またはそれに関連する型のカラム。 + +注: `args`にカラムを使用する場合、提供された`range_mask`タプルは依然として定数である必要があります。 + +**返される値** + +- `UInt64` コード + +型: [UInt64](../../sql-reference/data-types/int-uint.md) + +**例** + +例えば、異なる範囲やカーディナリティを持つ引数に対して、類似の分布が必要な場合に範囲拡張が有用です。 例えば、'IPアドレス' (0...FFFFFFFF) と '国コード' (0...FF) の場合。 + +クエリ: + +```sql +SELECT hilbertEncode((10,6), 1024, 16); +``` + +結果: + +```response +4031541586602 +``` + +注: タプルのサイズは他の引数の数と等しくなければなりません。 + +**例** + +単一の引数に対してタプルを指定しない場合、関数はヒルベルトインデックスとして自身の引数を返します。 + +クエリ: + +```sql +SELECT hilbertEncode(1); +``` + +結果: + +```response +1 +``` + +**例** + +単一の引数がビットシフトを指定するタプルと共に提供された場合、関数はこの引数を指定されたビット数だけ左シフトします。 + +クエリ: + +```sql +SELECT hilbertEncode(tuple(2), 128); +``` + +結果: + +```response +512 +``` + +**例** + +この関数はカラムとしての引数も受け入れます: + +クエリ: + +まずテーブルを作成し、いくつかのデータを挿入します。 + +```sql +create table hilbert_numbers( + n1 UInt32, + n2 UInt32 +) +Engine=MergeTree() +ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi'; +insert into hilbert_numbers (*) values(1,2); +``` +カラム名を使用して`hilbertEncode`の関数引数として定数の代わりに使用 + +クエリ: + +```sql +SELECT hilbertEncode(n1, n2) FROM hilbert_numbers; +``` + +結果: + +```response +13 +``` + +**実装の詳細** + +`UInt64` の Hilbert コードには情報のビット数が制限されます。2つの引数は各引数の最大範囲が2^32(64/2)です。すべてのオーバーフローはゼロにクリップされます。 + +## hilbertDecode + +ヒルベルト曲線インデックスを符号なし整数のタプルにデコードし、マルチ次元空間の座標を表します。 + +この関数にも `hilbertEncode` 関数と同様に2つの操作モードがあります: +- シンプル +- 拡張 + +### シンプルモード + +最大2つの符号なし整数を引数として受け取り、`UInt64` コードを生成します。 + +**構文** + +```sql +hilbertDecode(tuple_size, code) +``` + +**パラメータ** +- `tuple_size`: 2以下の整数値。 +- `code`: [UInt64](../../sql-reference/data-types/int-uint.md) コード。 + +**返される値** + +- 指定されたサイズの[タプル](../../sql-reference/data-types/tuple.md)。 + +型: [UInt64](../../sql-reference/data-types/int-uint.md) + +**例** + +クエリ: + +```sql +SELECT hilbertDecode(2, 31); +``` + +結果: + +```response +["3", "4"] +``` + +### 拡張モード + +最初の引数としてレンジマスク(タプル)を受け取り、最大2つの符号なし整数の他の引数を受け取ります。 +マスク内の各数値は、対応する引数を左にシフトするビット数を設定し、実質的にその範囲内で引数をスケーリングします。 + +似たような範囲やカーディナリティを持つ引数に対しては、範囲拡張が有益です。 +たとえば、'IPアドレス' (0...FFFFFFFF) および '国コード' (0...FF)。 +エンコード関数と同様に、最大8つの数値に制限されています。 + +**例** + +1つの引数に対するヒルベルトコードは常に自身の引数(タプル)となります。 + +クエリ: + +```sql +SELECT hilbertDecode(1, 1); +``` + +結果: + +```response +["1"] +``` + +**例** + +1つの引数がビットシフトを指定するタプルと共に提供された場合、この引数は指定されたビット数だけ右シフトされます。 + +クエリ: + +```sql +SELECT hilbertDecode(tuple(2), 32768); +``` + +結果: + +```response +["128"] +``` + +**例** + +関数は第2引数としてのカラムのコードも受け入れます: + +まずテーブルを作成し、いくつかのデータを挿入します。 + +クエリ: +```sql +create table hilbert_numbers( + n1 UInt32, + n2 UInt32 +) +Engine=MergeTree() +ORDER BY n1 SETTINGS index_granularity = 8192, index_granularity_bytes = '10Mi'; +insert into hilbert_numbers (*) values(1,2); +``` +カラム名を使用して`hilbertDecode`の関数引数として定数の代わりに使用 + +クエリ: + +```sql +select untuple(hilbertDecode(2, hilbertEncode(n1, n2))) from hilbert_numbers; +``` + +結果: + +```response +1 2 +``` + diff --git a/docs/ja/sql-reference/functions/encryption-functions.md b/docs/ja/sql-reference/functions/encryption-functions.md new file mode 100644 index 00000000000..02f52435314 --- /dev/null +++ b/docs/ja/sql-reference/functions/encryption-functions.md @@ -0,0 +1,402 @@ +--- +slug: /ja/sql-reference/functions/encryption-functions +sidebar_position: 70 +sidebar_label: 暗号化 +--- + +これらの関数は、AES(Advanced Encryption Standard)アルゴリズムを使用してデータの暗号化および復号化を実装します。 + +キーの長さは暗号化モードに依存します。`-128-`モードは16バイト、`-196-`モードは24バイト、`-256-`モードは32バイトの長さです。 + +初期化ベクトルの長さは常に16バイトです(余分なバイトは無視されます)。 + +これらの関数はClickHouse 21.1までは動作が遅いことに注意してください。 + +## encrypt + +この関数は以下のモードでデータを暗号化します: + +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-gcm, aes-192-gcm, aes-256-gcm +- aes-128-ctr, aes-192-ctr, aes-256-ctr + +**構文** + +``` sql +encrypt('mode', 'plaintext', 'key' [, iv, aad]) +``` + +**引数** + +- `mode` — 暗号化モード。[String](../data-types/string.md#string)。 +- `plaintext` — 暗号化されるべきテキスト。[String](../data-types/string.md#string)。 +- `key` — 暗号化キー。[String](../data-types/string.md#string)。 +- `iv` — 初期化ベクトル。`-gcm`モードで必要、他のモードではオプション。[String](../data-types/string.md#string)。 +- `aad` — 追加の認証データ。暗号化はされませんが、復号化に影響します。`-gcm`モードでのみ動作し、他のモードでは例外をスローします。[String](../data-types/string.md#string)。 + +**戻り値** + +- 暗号文バイナリ文字列。[String](../data-types/string.md#string)。 + +**例** + +このテーブルを作成します: + +クエリ: + +``` sql +CREATE TABLE encryption_test +( + `comment` String, + `secret` String +) +ENGINE = Memory; +``` + +データを挿入します(キーやIVをデータベースに保存することは暗号化の概念を損なうため避けてください、また'ヒント'を保存するのも安全ではなく、ここでは説明のためだけに使われます): + +クエリ: + +``` sql +INSERT INTO encryption_test VALUES('aes-256-ofb no IV', encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212')),\ +('aes-256-ofb no IV, different key', encrypt('aes-256-ofb', 'Secret', 'keykeykeykeykeykeykeykeykeykeyke')),\ +('aes-256-ofb with IV', encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv')),\ +('aes-256-cbc no IV', encrypt('aes-256-cbc', 'Secret', '12345678910121314151617181920212')); +``` + +クエリ: + +``` sql +SELECT comment, hex(secret) FROM encryption_test; +``` + +結果: + +``` text +┌─comment──────────────────────────┬─hex(secret)──────────────────────┐ +│ aes-256-ofb no IV │ B4972BDC4459 │ +│ aes-256-ofb no IV, different key │ 2FF57C092DC9 │ +│ aes-256-ofb with IV │ 5E6CB398F653 │ +│ aes-256-cbc no IV │ 1BC0629A92450D9E73A00E7D02CF4142 │ +└──────────────────────────────────┴──────────────────────────────────┘ +``` + +`-gcm`での例: + +クエリ: + +``` sql +INSERT INTO encryption_test VALUES('aes-256-gcm', encrypt('aes-256-gcm', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv')), \ +('aes-256-gcm with AAD', encrypt('aes-256-gcm', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv', 'aad')); + +SELECT comment, hex(secret) FROM encryption_test WHERE comment LIKE '%gcm%'; +``` + +結果: + +``` text +┌─comment──────────────┬─hex(secret)──────────────────────────────────┐ +│ aes-256-gcm │ A8A3CCBC6426CFEEB60E4EAE03D3E94204C1B09E0254 │ +│ aes-256-gcm with AAD │ A8A3CCBC6426D9A1017A0A932322F1852260A4AD6837 │ +└──────────────────────┴──────────────────────────────────────────────┘ +``` + +## aes_encrypt_mysql + +MySQLの暗号化と互換があり、結果として得られる暗号文は[AES_DECRYPT](https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-decrypt)関数で復号化できます。 + +同じ入力で`encrypt`と同じ暗号文を生成します。ただし、`key`または`iv`が通常よりも長い場合、`aes_encrypt_mysql`はMySQLの`aes_encrypt`に従い、`key`を折りたたんで余分なビットを無視します。 + +サポートされている暗号化モード: + +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb + +**構文** + +``` sql +aes_encrypt_mysql('mode', 'plaintext', 'key' [, iv]) +``` + +**引数** + +- `mode` — 暗号化モード。[String](../data-types/string.md#string)。 +- `plaintext` — 暗号化されるべきテキスト。[String](../data-types/string.md#string)。 +- `key` — 暗号化キー。モードが要求するよりも長い場合、MySQL固有のキーの折りたたみが行われます。[String](../data-types/string.md#string)。 +- `iv` — 初期化ベクトル。オプションで、最初の16バイトのみが考慮されます。[String](../data-types/string.md#string)。 + +**戻り値** + +- 暗号文バイナリ文字列。[String](../data-types/string.md#string)。 + +**例** + +等しい入力で`encrypt`と`aes_encrypt_mysql`は同じ暗号文を生成します: + +クエリ: + +``` sql +SELECT encrypt('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv') = aes_encrypt_mysql('aes-256-ofb', 'Secret', '12345678910121314151617181920212', 'iviviviviviviviv') AS ciphertexts_equal; +``` + +結果: + +``` +┌─ciphertexts_equal─┐ +│ 1 │ +└───────────────────┘ +``` + +しかし、`encrypt`は`key`または`iv`が予想よりも長い場合に失敗します: + +クエリ: + +``` sql +SELECT encrypt('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'); +``` + +結果: + +``` text +Received exception from server (version 22.6.1): +Code: 36. DB::Exception: Received from localhost:9000. DB::Exception: Invalid key size: 33 expected 32: While processing encrypt('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123'). +``` + +一方、`aes_encrypt_mysql`はMySQL互換の出力を生成します: + +クエリ: + +``` sql +SELECT hex(aes_encrypt_mysql('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123')) AS ciphertext; +``` + +結果: + +```text +┌─ciphertext───┐ +│ 24E9E4966469 │ +└──────────────┘ +``` + +さらに長い`IV`を提供しても同じ結果が得られることに注意してください。 + +クエリ: + +``` sql +SELECT hex(aes_encrypt_mysql('aes-256-ofb', 'Secret', '123456789101213141516171819202122', 'iviviviviviviviv123456')) AS ciphertext +``` + +結果: + +``` text +┌─ciphertext───┐ +│ 24E9E4966469 │ +└──────────────┘ +``` + +これは、同じ入力でMySQLが生成するものとバイナリで等しいです: + +``` sql +mysql> SET block_encryption_mode='aes-256-ofb'; +Query OK, 0 rows affected (0.00 sec) + +mysql> SELECT aes_encrypt('Secret', '123456789101213141516171819202122', 'iviviviviviviviv123456') as ciphertext; ++------------------------+ +| ciphertext | ++------------------------+ +| 0x24E9E4966469 | ++------------------------+ +1 row in set (0.00 sec) +``` + +## decrypt + +この関数は、以下のモードで暗号文を平文に復号します: + +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-ofb, aes-192-ofb, aes-256-ofb +- aes-128-gcm, aes-192-gcm, aes-256-gcm +- aes-128-ctr, aes-192-ctr, aes-256-ctr + +**構文** + +``` sql +decrypt('mode', 'ciphertext', 'key' [, iv, aad]) +``` + +**引数** + +- `mode` — 復号化モード。[String](../data-types/string.md#string)。 +- `ciphertext` — 復号化されるべき暗号化テキスト。[String](../data-types/string.md#string)。 +- `key` — 復号化キー。[String](../data-types/string.md#string)。 +- `iv` — 初期化ベクトル。`-gcm`モードで必要、他のモードではオプション。[String](../data-types/string.md#string)。 +- `aad` — 追加の認証データ。この値が正しくないと復号化できません。`-gcm`モードでのみ動作し、他のモードでは例外をスローします。[String](../data-types/string.md#string)。 + +**戻り値** + +- 復号化された文字列。[String](../data-types/string.md#string)。 + +**例** + +[encrypt](#encrypt)のテーブルを再利用します。 + +クエリ: + +``` sql +SELECT comment, hex(secret) FROM encryption_test; +``` + +結果: + +``` text +┌─comment──────────────┬─hex(secret)──────────────────────────────────┐ +│ aes-256-gcm │ A8A3CCBC6426CFEEB60E4EAE03D3E94204C1B09E0254 │ +│ aes-256-gcm with AAD │ A8A3CCBC6426D9A1017A0A932322F1852260A4AD6837 │ +└──────────────────────┴──────────────────────────────────────────────┘ +┌─comment──────────────────────────┬─hex(secret)──────────────────────┐ +│ aes-256-ofb no IV │ B4972BDC4459 │ +│ aes-256-ofb no IV, different key │ 2FF57C092DC9 │ +│ aes-256-ofb with IV │ 5E6CB398F653 │ +│ aes-256-cbc no IV │ 1BC0629A92450D9E73A00E7D02CF4142 │ +└──────────────────────────────────┴──────────────────────────────────┘ +``` + +次に、このデータをすべて復号化してみましょう。 + +クエリ: + +``` sql +SELECT comment, decrypt('aes-256-cfb128', secret, '12345678910121314151617181920212') as plaintext FROM encryption_test +``` + +結果: + +``` text +┌─comment──────────────┬─plaintext──┐ +│ aes-256-gcm │ OQ�E + �t�7T�\���\� │ +│ aes-256-gcm with AAD │ OQ�E + �\��si����;�o�� │ +└──────────────────────┴────────────┘ +┌─comment──────────────────────────┬─plaintext─┐ +│ aes-256-ofb no IV │ Secret │ +│ aes-256-ofb no IV, different key │ �4� + � │ +│ aes-256-ofb with IV │ ���6�~ │ + │aes-256-cbc no IV │ �2*4�h3c�4w��@ +└──────────────────────────────────┴───────────┘ +``` + +モード、キー、またはIVが暗号化時に異なっていたため、データの一部のみが適切に復号化され、残りは意味不明な文字となっています。 + +## tryDecrypt + +`decrypt`と似ていますが、不正なキーを使用したために復号化に失敗した場合、NULLを返します。 + +**例** + +`user_id`がユニークなユーザーIDであり、`encrypted`が暗号化された文字列フィールド、`iv`が暗号化・復号化の初期ベクトルのテーブルを作成してみましょう。ユーザーは自分のIDと暗号化されたフィールドを復号化するためのキーを知っていると仮定します: + +```sql +CREATE TABLE decrypt_null ( + dt DateTime, + user_id UInt32, + encrypted String, + iv String +) ENGINE = Memory; +``` + +データの挿入: + +```sql +INSERT INTO decrypt_null VALUES + ('2022-08-02 00:00:00', 1, encrypt('aes-256-gcm', 'value1', 'keykeykeykeykeykeykeykeykeykey01', 'iv1'), 'iv1'), + ('2022-09-02 00:00:00', 2, encrypt('aes-256-gcm', 'value2', 'keykeykeykeykeykeykeykeykeykey02', 'iv2'), 'iv2'), + ('2022-09-02 00:00:01', 3, encrypt('aes-256-gcm', 'value3', 'keykeykeykeykeykeykeykeykeykey03', 'iv3'), 'iv3'); +``` + +クエリ: + +```sql +SELECT + dt, + user_id, + tryDecrypt('aes-256-gcm', encrypted, 'keykeykeykeykeykeykeykeykeykey02', iv) AS value +FROM decrypt_null +ORDER BY user_id ASC +``` + +結果: + +``` +┌──────────────────dt─┬─user_id─┬─value──┐ +│ 2022-08-02 00:00:00 │ 1 │ ᴺᵁᴸᴸ │ +│ 2022-09-02 00:00:00 │ 2 │ value2 │ +│ 2022-09-02 00:00:01 │ 3 │ ᴺᵁᴸᴸ │ +└─────────────────────┴─────────┴────────┘ +``` + +## aes_decrypt_mysql + +MySQLの暗号化と互換性があり、データを[AES_ENCRYPT](https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt)で暗号化されたデータを復号化します。 + +等しい入力で`decrypt`と同じ平文を生成します。ただし、`key`または`iv`が通常よりも長い場合、`aes_decrypt_mysql`はMySQLの`aes_decrypt`に従い、`key`を折りたたんで余分なビットを無視します。 + +サポートされている復号化モード: + +- aes-128-ecb, aes-192-ecb, aes-256-ecb +- aes-128-cbc, aes-192-cbc, aes-256-cbc +- aes-128-cfb128 +- aes-128-ofb, aes-192-ofb, aes-256-ofb + +**構文** + +``` sql +aes_decrypt_mysql('mode', 'ciphertext', 'key' [, iv]) +``` + +**引数** + +- `mode` — 復号化モード。[String](../data-types/string.md#string)。 +- `ciphertext` — 復号化されるべき暗号化テキスト。[String](../data-types/string.md#string)。 +- `key` — 復号化キー。[String](../data-types/string.md#string)。 +- `iv` — 初期化ベクトル。オプション。[String](../data-types/string.md#string)。 + +**戻り値** + +- 復号化された文字列。[String](../data-types/string.md#string)。 + +**例** + +以前MySQLで暗号化したデータを復号化してみましょう: + +``` sql +mysql> SET block_encryption_mode='aes-256-ofb'; +Query OK, 0 rows affected (0.00 sec) + +mysql> SELECT aes_encrypt('Secret', '123456789101213141516171819202122', 'iviviviviviviviv123456') as ciphertext; ++------------------------+ +| ciphertext | ++------------------------+ +| 0x24E9E4966469 | ++------------------------+ +1 row in set (0.00 sec) +``` + +クエリ: + +``` sql +SELECT aes_decrypt_mysql('aes-256-ofb', unhex('24E9E4966469'), '123456789101213141516171819202122', 'iviviviviviviviv123456') AS plaintext +``` + +結果: + +``` text +┌─plaintext─┐ +│ Secret │ +└───────────┘ +``` diff --git a/docs/ja/sql-reference/functions/ext-dict-functions.md b/docs/ja/sql-reference/functions/ext-dict-functions.md new file mode 100644 index 00000000000..e225dcc742c --- /dev/null +++ b/docs/ja/sql-reference/functions/ext-dict-functions.md @@ -0,0 +1,514 @@ +--- +slug: /ja/sql-reference/functions/ext-dict-functions +sidebar_position: 50 +sidebar_label: Dictionary +--- + +# ダイナミックDictionaryに対する操作の関数 + +:::note +[DDLクエリ](../../sql-reference/statements/create/dictionary.md)で作成されたDictionaryについては、`dict_name`パラメータを`.`の形で完全に指定する必要があります。そうでない場合、現在のデータベースが使用されます。 +::: + +Dictionaryの接続および設定に関する情報は、[Dictionary](../../sql-reference/dictionaries/index.md)を参照してください。 + +## dictGet, dictGetOrDefault, dictGetOrNull + +Dictionaryから値を取得します。 + +```sql +dictGet('dict_name', attr_names, id_expr) +dictGetOrDefault('dict_name', attr_names, id_expr, default_value_expr) +dictGetOrNull('dict_name', attr_name, id_expr) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `attr_names` — Dictionaryのカラム名。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)、またはカラム名のタプル。[タプル](../data-types/tuple.md)([文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal))。 +- `id_expr` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で、Dictionary設定に応じたキータイプの値または[タプル](../data-types/tuple.md)型の値を返します。 +- `default_value_expr` — Dictionaryに`id_expr`キーの行が含まれていない場合に返される値。[式](../../sql-reference/syntax.md#syntax-expressions)または[タプル](../data-types/tuple.md)([式](../../sql-reference/syntax.md#syntax-expressions))で、`attr_names`属性に設定された型で値を返します。 + +**返り値** + +- ClickHouseが属性を[属性のデータ型](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes)で正常に解析すると、関数は`id_expr`に対応するDictionary属性の値を返します。 + +- Dictionaryに`id_expr`に対応するキーがない場合: + + - `dictGet`は、Dictionary設定で属性に指定された``要素の内容を返します。 + - `dictGetOrDefault`は、`default_value_expr`パラメータとして渡された値を返します。 + - `dictGetOrNull`は、キーがDictionaryで見つからなかった場合、`NULL`を返します。 + +ClickHouseは、属性の値を解析できない場合や、値が属性のデータ型と一致しない場合に例外を投げます。 + +**シンプルキーDictionaryの例** + +以下の内容のテキストファイル`ext-dict-test.csv`を作成します: + +```text +1,1 +2,2 +``` + +最初のカラムは`id`、2番目のカラムは`c1`です。 + +Dictionaryを設定します: + +```xml + + + ext-dict-test + + + /path-to/ext-dict-test.csv + CSV + + + + + + + + id + + + c1 + UInt32 + + + + 0 + + +``` + +クエリを実行します: + +```sql +SELECT + dictGetOrDefault('ext-dict-test', 'c1', number + 1, toUInt32(number * 10)) AS val, + toTypeName(val) AS type +FROM system.numbers +LIMIT 3; +``` + +```text +┌─val─┬─type───┐ +│ 1 │ UInt32 │ +│ 2 │ UInt32 │ +│ 20 │ UInt32 │ +└─────┴────────┘ +``` + +**複雑なキーDictionaryの例** + +以下の内容のテキストファイル`ext-dict-mult.csv`を作成します: + +```text +1,1,'1' +2,2,'2' +3,3,'3' +``` + +最初のカラムは`id`、2番目は`c1`、3番目は`c2`です。 + +Dictionaryを設定します: + +```xml + + + ext-dict-mult + + + /path-to/ext-dict-mult.csv + CSV + + + + + + + + id + + + c1 + UInt32 + + + + c2 + String + + + + 0 + + +``` + +クエリを実行します: + +```sql +SELECT + dictGet('ext-dict-mult', ('c1','c2'), number + 1) AS val, + toTypeName(val) AS type +FROM system.numbers +LIMIT 3; +``` + +```text +┌─val─────┬─type──────────────────┐ +│ (1,'1') │ Tuple(UInt8, String) │ +│ (2,'2') │ Tuple(UInt8, String) │ +│ (3,'3') │ Tuple(UInt8, String) │ +└─────────┴───────────────────────┘ +``` + +**範囲キーDictionaryの例** + +入力テーブル: + +```sql +CREATE TABLE range_key_dictionary_source_table +( + key UInt64, + start_date Date, + end_date Date, + value String, + value_nullable Nullable(String) +) +ENGINE = TinyLog(); + +INSERT INTO range_key_dictionary_source_table VALUES(1, toDate('2019-05-20'), toDate('2019-05-20'), 'First', 'First'); +INSERT INTO range_key_dictionary_source_table VALUES(2, toDate('2019-05-20'), toDate('2019-05-20'), 'Second', NULL); +INSERT INTO range_key_dictionary_source_table VALUES(3, toDate('2019-05-20'), toDate('2019-05-20'), 'Third', 'Third'); +``` + +Dictionaryを作成します: + +```sql +CREATE DICTIONARY range_key_dictionary +( + key UInt64, + start_date Date, + end_date Date, + value String, + value_nullable Nullable(String) +) +PRIMARY KEY key +SOURCE(CLICKHOUSE(HOST 'localhost' PORT tcpPort() TABLE 'range_key_dictionary_source_table')) +LIFETIME(MIN 1 MAX 1000) +LAYOUT(RANGE_HASHED()) +RANGE(MIN start_date MAX end_date); +``` + +クエリを実行します: + +```sql +SELECT + (number, toDate('2019-05-20')), + dictHas('range_key_dictionary', number, toDate('2019-05-20')), + dictGetOrNull('range_key_dictionary', 'value', number, toDate('2019-05-20')), + dictGetOrNull('range_key_dictionary', 'value_nullable', number, toDate('2019-05-20')), + dictGetOrNull('range_key_dictionary', ('value', 'value_nullable'), number, toDate('2019-05-20')) +FROM system.numbers LIMIT 5 FORMAT TabSeparated; +``` +結果: + +```text +(0,'2019-05-20') 0 \N \N (NULL,NULL) +(1,'2019-05-20') 1 First First ('First','First') +(2,'2019-05-20') 1 Second \N ('Second',NULL) +(3,'2019-05-20') 1 Third Third ('Third','Third') +(4,'2019-05-20') 0 \N \N (NULL,NULL) +``` + +**関連項目** + +- [Dictionaries](../../sql-reference/dictionaries/index.md) + +## dictHas + +キーがDictionaryに存在するかどうかをチェックします。 + +```sql +dictHas('dict_name', id_expr) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `id_expr` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で、Dictionary設定に応じたキータイプの値または[タプル](../data-types/tuple.md)型の値を返します。 + +**返り値** + +- キーが存在しない場合は0。[UInt8](../data-types/int-uint.md)。 +- キーが存在する場合は1。[UInt8](../data-types/int-uint.md)。 + +## dictGetHierarchy + +[階層型 Dictionary](../../sql-reference/dictionaries/index.md#hierarchical-dictionaries)内のキーのすべての親を含む配列を作成します。 + +**構文** + +```sql +dictGetHierarchy('dict_name', key) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `key` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で[UInt64](../data-types/int-uint.md)型の値を返します。 + +**返り値** + +- キーの親。[Array(UInt64)](../data-types/array.md)。 + +## dictIsIn + +Dictionary内の階層全体を通して、キーの先祖をチェックします。 + +```sql +dictIsIn('dict_name', child_id_expr, ancestor_id_expr) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `child_id_expr` — チェックされるキー。[式](../../sql-reference/syntax.md#syntax-expressions)で[UInt64](../data-types/int-uint.md)型の値を返します。 +- `ancestor_id_expr` — `child_id_expr`キーの仮定された先祖。[式](../../sql-reference/syntax.md#syntax-expressions)で[UInt64](../data-types/int-uint.md)型の値を返します。 + +**返り値** + +- `child_id_expr`が`ancestor_id_expr`の子でない場合は0。[UInt8](../data-types/int-uint.md)。 +- `child_id_expr`が`ancestor_id_expr`の子または`ancestor_id_expr`自体である場合は1。[UInt8](../data-types/int-uint.md)。 + +## dictGetChildren + +第一レベルの子をインデックスの配列として返します。[dictGetHierarchy](#dictgethierarchy) の逆の変換です。 + +**構文** + +```sql +dictGetChildren(dict_name, key) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `key` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で[UInt64](../data-types/int-uint.md)型の値を返します。 + +**返り値** + +- キーの第一レベルの子。[Array](../data-types/array.md)([UInt64](../data-types/int-uint.md))。 + +**例** + +階層型のDictionaryを考慮します: + +```text +┌─id─┬─parent_id─┐ +│ 1 │ 0 │ +│ 2 │ 1 │ +│ 3 │ 1 │ +│ 4 │ 2 │ +└────┴───────────┘ +``` + +第一レベルの子: + +```sql +SELECT dictGetChildren('hierarchy_flat_dictionary', number) FROM system.numbers LIMIT 4; +``` + +```text +┌─dictGetChildren('hierarchy_flat_dictionary', number)─┐ +│ [1] │ +│ [2,3] │ +│ [4] │ +│ [] │ +└──────────────────────────────────────────────────────┘ +``` + +## dictGetDescendant + +全ての子孫を[dictGetChildren](#dictgetchildren)関数が`level`回の再帰で適用されたかのように返します。 + +**構文** + +```sql +dictGetDescendants(dict_name, key, level) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `key` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で[UInt64](../data-types/int-uint.md)型の値を返します。 +- `level` — 階層レベル。`level = 0`の場合、最後までの全ての子孫を返します。[UInt8](../data-types/int-uint.md)。 + +**返り値** + +- キーの子孫。[Array](../data-types/array.md)([UInt64](../data-types/int-uint.md))。 + +**例** + +階層型のDictionaryを考慮します: + +```text +┌─id─┬─parent_id─┐ +│ 1 │ 0 │ +│ 2 │ 1 │ +│ 3 │ 1 │ +│ 4 │ 2 │ +└────┴───────────┘ +``` +全ての子孫: + +```sql +SELECT dictGetDescendants('hierarchy_flat_dictionary', number) FROM system.numbers LIMIT 4; +``` + +```text +┌─dictGetDescendants('hierarchy_flat_dictionary', number)─┐ +│ [1,2,3,4] │ +│ [2,3,4] │ +│ [4] │ +│ [] │ +└─────────────────────────────────────────────────────────┘ +``` + +第一レベルの子孫: + +```sql +SELECT dictGetDescendants('hierarchy_flat_dictionary', number, 1) FROM system.numbers LIMIT 4; +``` + +```text +┌─dictGetDescendants('hierarchy_flat_dictionary', number, 1)─┐ +│ [1] │ +│ [2,3] │ +│ [4] │ +│ [] │ +└────────────────────────────────────────────────────────────┘ +``` + + +## dictGetAll + +[正規表現ツリーDictionary](../../sql-reference/dictionaries/index.md#regexp-tree-dictionary)で各キーに一致したすべてのノードの属性値を取得します。 + +`Array(T)`型の値を返す点を除き、[`dictGet`](#dictget-dictgetordefault-dictgetornull)と同様に動作します。 + +**構文** + +```sql +dictGetAll('dict_name', attr_names, id_expr[, limit]) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `attr_names` — Dictionaryのカラム名。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)または、カラム名のタプル。[タプル](../data-types/tuple.md)([文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal))。 +- `id_expr` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で、Dictionary設定に応じたキータイプの値の配列または[タプル](../data-types/tuple.md)型の値を返します。 +- `limit` - 返される各値配列の最大長。切り詰める場合、子ノードが親ノードより優先され、それ以外の場合は正規表現ツリーDictionaryで定義されたリストの順序が尊重されます。指定しない場合、配列の長さに制限はありません。 + +**返り値** + +- ClickHouseが属性を正常に解析し、Dictionaryで定義された属性のデータ型として、各`attr_names`で指定された属性に対する`id_expr`に対応するDictionary属性値の配列を返します。 + +- Dictionaryに`id_expr`に対応するキーがない場合、空の配列が返されます。 + +ClickHouseは、属性の値を解析できない場合や、値が属性のデータ型と一致しない場合に例外をスローします。 + +**例** + +以下のような正規表現ツリーDictionaryを考慮します: + +```sql +CREATE DICTIONARY regexp_dict +( + regexp String, + tag String +) +PRIMARY KEY(regexp) +SOURCE(YAMLRegExpTree(PATH '/var/lib/clickhouse/user_files/regexp_tree.yaml')) +LAYOUT(regexp_tree) +... +``` + +```yaml +# /var/lib/clickhouse/user_files/regexp_tree.yaml +- regexp: 'foo' + tag: 'foo_attr' +- regexp: 'bar' + tag: 'bar_attr' +- regexp: 'baz' + tag: 'baz_attr' +``` + +すべての一致する値を取得: + +```sql +SELECT dictGetAll('regexp_dict', 'tag', 'foobarbaz'); +``` + +```text +┌─dictGetAll('regexp_dict', 'tag', 'foobarbaz')─┐ +│ ['foo_attr','bar_attr','baz_attr'] │ +└───────────────────────────────────────────────┘ +``` + +最大2つの一致する値を取得: + +```sql +SELECT dictGetAll('regexp_dict', 'tag', 'foobarbaz', 2); +``` + +```text +┌─dictGetAll('regexp_dict', 'tag', 'foobarbaz', 2)─┐ +│ ['foo_attr','bar_attr'] │ +└──────────────────────────────────────────────────┘ +``` + +## その他の関数 + +ClickHouseは、Dictionaryの設定に関係なく、Dictionaryの属性値を特定のデータ型に変換する専門の関数をサポートしています。 + +関数: + +- `dictGetInt8`, `dictGetInt16`, `dictGetInt32`, `dictGetInt64` +- `dictGetUInt8`, `dictGetUInt16`, `dictGetUInt32`, `dictGetUInt64` +- `dictGetFloat32`, `dictGetFloat64` +- `dictGetDate` +- `dictGetDateTime` +- `dictGetUUID` +- `dictGetString` +- `dictGetIPv4`, `dictGetIPv6` + +これらの関数はすべて`OrDefault`の修飾が可能です。例えば、`dictGetDateOrDefault`のように。 + +構文: + +```sql +dictGet[Type]('dict_name', 'attr_name', id_expr) +dictGet[Type]OrDefault('dict_name', 'attr_name', id_expr, default_value_expr) +``` + +**引数** + +- `dict_name` — Dictionaryの名前。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `attr_name` — Dictionaryのカラム名。[文字列リテラル](../../sql-reference/syntax.md#syntax-string-literal)。 +- `id_expr` — キーの値。[式](../../sql-reference/syntax.md#syntax-expressions)で、[UInt64](../data-types/int-uint.md)または[タプル](../data-types/tuple.md)型の値を返します。 +- `default_value_expr` — Dictionaryに`id_expr`キーの行が含まれていない場合に返される値。[式](../../sql-reference/syntax.md#syntax-expressions)で、`attr_name`に設定されたデータ型で値を返します。 + +**返り値** + +- ClickHouseが属性を[属性のデータ型](../../sql-reference/dictionaries/index.md#dictionary-key-and-fields#ext_dict_structure-attributes)で正常に解析すると、関数は`id_expr`に対応するDictionary属性の値を返します。 + +- Dictionaryにリクエストされた`id_expr`がない場合: + + - `dictGet[Type]`は、Dictionary設定で属性に指定された``要素の内容を返します。 + - `dictGet[Type]OrDefault`は、`default_value_expr`パラメータとして渡された値を返します。 + +ClickHouseは、属性の値を解析できない場合や、値が属性のデータ型と一致しない場合に例外をスローします。 diff --git a/docs/ja/sql-reference/functions/files.md b/docs/ja/sql-reference/functions/files.md new file mode 100644 index 00000000000..6b4d82e2d42 --- /dev/null +++ b/docs/ja/sql-reference/functions/files.md @@ -0,0 +1,31 @@ +--- +slug: /ja/sql-reference/functions/files +sidebar_position: 75 +sidebar_label: Files +--- + +## file + +ファイルを文字列として読み込み、指定されたカラムにデータをロードします。ファイルの内容は解釈されません。 + +テーブル関数 [file](../table-functions/file.md) も参照してください。 + +**構文** + +``` sql +file(path[, default]) +``` + +**引数** + +- `path` — [user_files_path](../../operations/server-configuration-parameters/settings.md#user_files_path) に対するファイルの相対パス。ワイルドカード `*`, `**`, `?`, `{abc,def}` および `{N..M}` がサポートされており、`N` と `M` は数値、`'abc', 'def'` は文字列です。 +- `default` — ファイルが存在しないかアクセスできない場合に返される値。サポートされるデータタイプは [String](../data-types/string.md) および [NULL](../../sql-reference/syntax.md#null-literal) です。 + +**例** + +ファイル a.txt および b.txt のデータを文字列としてテーブルに挿入する例: + +``` sql +INSERT INTO table SELECT file('a.txt'), file('b.txt'); +``` + diff --git a/docs/ja/sql-reference/functions/functions-for-nulls.md b/docs/ja/sql-reference/functions/functions-for-nulls.md new file mode 100644 index 00000000000..3753d3eaae7 --- /dev/null +++ b/docs/ja/sql-reference/functions/functions-for-nulls.md @@ -0,0 +1,453 @@ +--- +slug: /ja/sql-reference/functions/functions-for-nulls +sidebar_position: 135 +sidebar_label: Nullable +--- + +# Nullable 値を扱う関数 + +## isNull + +引数が [NULL](../../sql-reference/syntax.md#null) かどうかを返します。 + +演算子 [`IS NULL`](../operators/index.md#is_null) も参照してください。 + +**構文** + +``` sql +isNull(x) +``` + +別名: `ISNULL`. + +**引数** + +- `x` — 非複合データ型の値。 + +**返される値** + +- `x` が `NULL` の場合は `1`。 +- `x` が `NULL` でない場合は `0`。 + +**例** + +テーブル: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +クエリ: + +``` sql +SELECT x FROM t_null WHERE isNull(y); +``` + +結果: + +``` text +┌─x─┐ +│ 1 │ +└───┘ +``` + +## isNullable + +カラムが [Nullable](../data-types/nullable.md) かどうかを返します。Nullable は `NULL` 値を許可することを意味します。 + +**構文** + +``` sql +isNullable(x) +``` + +**引数** + +- `x` — カラム。 + +**返される値** + +- `x` が `NULL` 値を許可する場合は `1`。 [UInt8](../data-types/int-uint.md). +- `x` が `NULL` 値を許可しない場合は `0`。 [UInt8](../data-types/int-uint.md). + +**例** + +クエリ: + +``` sql +CREATE TABLE tab (ordinary_col UInt32, nullable_col Nullable(UInt32)) ENGINE = Log; +INSERT INTO tab (ordinary_col, nullable_col) VALUES (1,1), (2, 2), (3,3); +SELECT isNullable(ordinary_col), isNullable(nullable_col) FROM tab; +``` + +結果: + +``` text + ┌───isNullable(ordinary_col)──┬───isNullable(nullable_col)──┐ +1. │ 0 │ 1 │ +2. │ 0 │ 1 │ +3. │ 0 │ 1 │ + └─────────────────────────────┴─────────────────────────────┘ +``` + +## isNotNull + +引数が [NULL](../../sql-reference/syntax.md#null-literal) でないかどうかを返します。 + +演算子 [`IS NOT NULL`](../operators/index.md#is_not_null) も参照してください。 + +``` sql +isNotNull(x) +``` + +**引数:** + +- `x` — 非複合データ型の値。 + +**返される値** + +- `x` が `NULL` でない場合は `1`。 +- `x` が `NULL` の場合は `0`。 + +**例** + +テーブル: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +クエリ: + +``` sql +SELECT x FROM t_null WHERE isNotNull(y); +``` + +結果: + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## isNotDistinctFrom + +NULL セーフな比較を行います。これは、JOIN ON セクションで NULL 値を含む JOIN キーを比較するために使用されます。この関数は 2 つの `NULL` 値を同一とみなし、通常の等号の動作とは異なり、2 つの `NULL` 値を比較すると `NULL` を返します。 + +:::note +この関数は JOIN ON の実装に使用される内部関数です。クエリで手動で使用しないでください。 +::: + +**構文** + +``` sql +isNotDistinctFrom(x, y) +``` + +**引数** + +- `x` — 第1の JOIN キー。 +- `y` — 第2の JOIN キー。 + +**返される値** + +- `x` と `y` が両方とも `NULL` の場合は `true`。 +- それ以外の場合は `false`。 + +**例** + +完全な例については、[JOIN キーにおける NULL 値](../../sql-reference/statements/select/join#null-values-in-join-keys)を参照してください。 + +## isZeroOrNull + +引数が 0(ゼロ)または [NULL](../../sql-reference/syntax.md#null-literal) かどうかを返します。 + +``` sql +isZeroOrNull(x) +``` + +**引数:** + +- `x` — 非複合データ型の値。 + +**返される値** + +- `x` が 0(ゼロ)または `NULL` の場合は `1`。 +- それ以外は `0`。 + +**例** + +テーブル: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 0 │ +│ 3 │ 3 │ +└───┴──────┘ +``` + +クエリ: + +``` sql +SELECT x FROM t_null WHERE isZeroOrNull(y); +``` + +結果: + +``` text +┌─x─┐ +│ 1 │ +│ 2 │ +└───┘ +``` + +## coalesce + +最も左にある`NULL` でない引数を返します。 + +``` sql +coalesce(x,...) +``` + +**引数:** + +- 複合型でない任意の数のパラメータ。すべてのパラメータは互いに互換性のあるデータ型である必要があります。 + +**返される値** + +- 最初の `NULL` でない引数 +- すべての引数が `NULL` の場合、`NULL`。 + +**例** + +顧客に連絡するための複数の方法を示す連絡先のリストを考えてみましょう。 + +``` text +┌─name─────┬─mail─┬─phone─────┬──telegram─┐ +│ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │ +│ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└──────────┴──────┴───────────┴───────────┘ +``` + +`mail` と `phone` フィールドは String の型ですが、`telegram` フィールドは `UInt32` なので `String` に変換する必要があります。 + +顧客のために最初に利用可能な連絡方法を連絡先リストから取得します: + +``` sql +SELECT name, coalesce(mail, phone, CAST(telegram,'Nullable(String)')) FROM aBook; +``` + +``` text +┌─name─────┬─coalesce(mail, phone, CAST(telegram, 'Nullable(String)'))─┐ +│ client 1 │ 123-45-67 │ +│ client 2 │ ᴺᵁᴸᴸ │ +└──────────┴───────────────────────────────────────────────────────────┘ +``` + +## ifNull + +引数が `NULL` である場合に代替値を返します。 + +``` sql +ifNull(x, alt) +``` + +**引数:** + +- `x` — `NULL` かどうかを確認する値。 +- `alt` — `x` が `NULL` である場合に関数が返す値。 + +**返される値** + +- `x` が `NULL` でない場合、`x`。 +- `x` が `NULL` の場合、`alt`。 + +**例** + +クエリ: + +``` sql +SELECT ifNull('a', 'b'); +``` + +結果: + +``` text +┌─ifNull('a', 'b')─┐ +│ a │ +└──────────────────┘ +``` + +クエリ: + +``` sql +SELECT ifNull(NULL, 'b'); +``` + +結果: + +``` text +┌─ifNull(NULL, 'b')─┐ +│ b │ +└───────────────────┘ +``` + +## nullIf + +2つの引数が等しい場合、`NULL` を返します。 + +``` sql +nullIf(x, y) +``` + +**引数:** + +`x`, `y` — 比較する値。互換性のある型である必要があります。 + +**返される値** + +- 引数が等しい場合、`NULL`。 +- 引数が等しくない場合、`x`。 + +**例** + +クエリ: + +``` sql +SELECT nullIf(1, 1); +``` + +結果: + +``` text +┌─nullIf(1, 1)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────┘ +``` + +クエリ: + +``` sql +SELECT nullIf(1, 2); +``` + +結果: + +``` text +┌─nullIf(1, 2)─┐ +│ 1 │ +└──────────────┘ +``` + +## assumeNotNull + +[Nullable](../data-types/nullable.md) 型の値に対して、対応する非 `Nullable` 値を返します。元の値が `NULL` の場合、任意の結果が返される可能性があります。関数 `ifNull` および `coalesce` も参照してください。 + +``` sql +assumeNotNull(x) +``` + +**引数:** + +- `x` — 元の値。 + +**返される値** + +- 値が `NULL` でない場合、入力値を非 `Nullable` 型で返します。 +- 入力値が `NULL` の場合、任意の値。 + +**例** + +テーブル: + +``` text + +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +クエリ: + +``` sql +SELECT assumeNotNull(y) FROM table; +``` + +結果: + +``` text +┌─assumeNotNull(y)─┐ +│ 0 │ +│ 3 │ +└──────────────────┘ +``` + +クエリ: + +``` sql +SELECT toTypeName(assumeNotNull(y)) FROM t_null; +``` + +結果: + +``` text +┌─toTypeName(assumeNotNull(y))─┐ +│ Int8 │ +│ Int8 │ +└──────────────────────────────┘ +``` + +## toNullable + +引数の型を `Nullable` に変換します。 + +``` sql +toNullable(x) +``` + +**引数:** + +- `x` — 非複合型の値。 + +**返される値** + +- 入力値を `Nullable` 型として返します。 + +**例** + +クエリ: + +``` sql +SELECT toTypeName(10); +``` + +結果: + +``` text +┌─toTypeName(10)─┐ +│ UInt8 │ +└────────────────┘ +``` + +クエリ: + +``` sql +SELECT toTypeName(toNullable(10)); +``` + +結果: + +``` text +┌─toTypeName(toNullable(10))─┐ +│ Nullable(UInt8) │ +└────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/geo/coordinates.md b/docs/ja/sql-reference/functions/geo/coordinates.md new file mode 100644 index 00000000000..37dd91bf37e --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/coordinates.md @@ -0,0 +1,173 @@ +--- +slug: /ja/sql-reference/functions/geo/coordinates +sidebar_label: 地理座標 +sidebar_position: 62 +title: "地理座標を扱うための関数" +--- + +## greatCircleDistance + +[大圏距離の公式](https://en.wikipedia.org/wiki/Great-circle_distance)を使用して、地球表面の2点間の距離を計算します。 + +``` sql +greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) +``` + +**入力パラメータ** + +- `lon1Deg` — 最初の点の経度(度)。範囲: `[-180°, 180°]`。 +- `lat1Deg` — 最初の点の緯度(度)。範囲: `[-90°, 90°]`。 +- `lon2Deg` — 2番目の点の経度(度)。範囲: `[-180°, 180°]`。 +- `lat2Deg` — 2番目の点の緯度(度)。範囲: `[-90°, 90°]`。 + +正の値は北緯および東経を示し、負の値は南緯および西経を示します。 + +**戻り値** + +地球表面上の2点間の距離(メートル単位)。 + +入力パラメータの値が範囲外の場合、例外が生成されます。 + +**例** + +``` sql +SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) AS greatCircleDistance +``` + +``` text +┌─greatCircleDistance─┐ +│ 14128352 │ +└─────────────────────┘ +``` + +## geoDistance + +`greatCircleDistance`に似ていますが、球体の代わりにWGS-84楕円体上での距離を計算します。これは地球のジオイドのより正確な近似です。パフォーマンスは`greatCircleDistance`と同じ(パフォーマンスの低下はなし)。地球上の距離を計算するためには`geoDistance`を使用することをお勧めします。 + +技術的な注記: 十分に近い点の場合、座標の中点での接平面上のメトリックを用いて平面近似を使用しています。 + +``` sql +geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) +``` + +**入力パラメータ** + +- `lon1Deg` — 最初の点の経度(度)。範囲: `[-180°, 180°]`。 +- `lat1Deg` — 最初の点の緯度(度)。範囲: `[-90°, 90°]`。 +- `lon2Deg` — 2番目の点の経度(度)。範囲: `[-180°, 180°]`。 +- `lat2Deg` — 2番目の点の緯度(度)。範囲: `[-90°, 90°]`。 + +正の値は北緯および東経を示し、負の値は南緯および西経を示します。 + +**戻り値** + +地球表面上の2点間の距離(メートル単位)。 + +入力パラメータの値が範囲外の場合、例外が生成されます。 + +**例** + +``` sql +SELECT geoDistance(38.8976, -77.0366, 39.9496, -75.1503) AS geoDistance +``` + +``` text +┌─geoDistance─┐ +│ 212458.73 │ +└─────────────┘ +``` + +## greatCircleAngle + +[大圏距離の公式](https://en.wikipedia.org/wiki/Great-circle_distance)を使用して、地球表面の2点間の中心角を計算します。 + +``` sql +greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg) +``` + +**入力パラメータ** + +- `lon1Deg` — 最初の点の経度(度)。 +- `lat1Deg` — 最初の点の緯度(度)。 +- `lon2Deg` — 2番目の点の経度(度)。 +- `lat2Deg` — 2番目の点の緯度(度)。 + +**戻り値** + +2点間の中心角(度単位)。 + +**例** + +``` sql +SELECT greatCircleAngle(0, 0, 45, 0) AS arc +``` + +``` text +┌─arc─┐ +│ 45 │ +└─────┘ +``` + +## pointInEllipses + +点が少なくとも1つの楕円に属しているかどうかをチェックします。 +座標は直交座標系で幾何的なものであります。 + +``` sql +pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ) +``` + +**入力パラメータ** + +- `x, y` — 平面上の点の座標。 +- `xᵢ, yᵢ` — `i`番目の楕円の中心の座標。 +- `aᵢ, bᵢ` — `i`番目の楕円のx, y座標単位の長軸。 + +入力パラメータは `2+4⋅n` でなければならず、ここで `n` は楕円の数です。 + +**戻り値** + +点が少なくとも1つの楕円の内部にある場合は `1` 、そうでない場合は `0` 。 + +**例** + +``` sql +SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999) +``` + +``` text +┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐ +│ 1 │ +└─────────────────────────────────────────────────┘ +``` + +## pointInPolygon + +点が平面上の多角形に属しているかどうかをチェックします。 + +``` sql +pointInPolygon((x, y), [(a, b), (c, d) ...], ...) +``` + +**入力値** + +- `(x, y)` — 平面上の点の座標。データタイプ — [Tuple](../../data-types/tuple.md) — 2つの数のタプル。 +- `[(a, b), (c, d) ...]` — 多角形の頂点。データタイプ — [Array](../../data-types/array.md)。各頂点は座標のペア `(a, b)` で表されます。頂点は時計回りまたは反時計回りの順序で指定する必要があります。頂点の最小数は 3 です。多角形は定数でなければなりません。 +- この関数は、穴のある多角形(切り取られた部分)もサポートしています。この場合、切り取られた部分を定義する多角形を追加の引数で渡します。非単連結な多角形はサポートしていません。 + +**戻り値** + +点が多角形の内部にある場合は `1` 、そうでない場合は `0` 。 +点が多角形の境界上にある場合、関数は0または1どちらかを返す可能性があります。 + +**例** + +``` sql +SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res +``` + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` diff --git a/docs/ja/sql-reference/functions/geo/geohash.md b/docs/ja/sql-reference/functions/geo/geohash.md new file mode 100644 index 00000000000..b2030efd13e --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/geohash.md @@ -0,0 +1,129 @@ +--- +slug: /ja/sql-reference/functions/geo/geohash +sidebar_label: Geohash +title: "Geohashを扱うための関数" +--- + +## Geohash + +[Geohash](https://en.wikipedia.org/wiki/Geohash)は、地球の表面を格子状のバケツに分割し、各セルを短い文字と数字の文字列でエンコードするジオコードシステムです。これは階層的なデータ構造であり、geohash文字列が長ければ長いほど、より正確な地理的位置を表します。 + +地理座標を手動でgeohash文字列に変換する必要がある場合は、[geohash.org](http://geohash.org/)を使用できます。 + +## geohashEncode + +緯度と経度を[geohash](#geohash)文字列としてエンコードします。 + +**構文** + +``` sql +geohashEncode(longitude, latitude, [precision]) +``` + +**入力値** + +- `longitude` — エンコードしたい座標の経度部分。範囲`[-180°, 180°]`の浮動小数点。[Float](../../data-types/float.md)。 +- `latitude` — エンコードしたい座標の緯度部分。範囲 `[-90°, 90°]`の浮動小数点。[Float](../../data-types/float.md)。 +- `precision` (オプション) — 結果として得られるエンコードされた文字列の長さ。デフォルトは`12`。整数で範囲 `[1, 12]`。[Int8](../../data-types/int-uint.md)。 + +:::note +- すべての座標パラメータは同じ型である必要があります: `Float32`または`Float64`。 +- `precision`パラメータでは、`1`未満または`12`を超える値は黙って`12`に変換されます。 +::: + +**返される値** + +- エンコードされた座標の英数字文字列(base32エンコーディングアルファベットの修正版が使用されます)。[String](../../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res; +``` + +結果: + +``` text +┌─res──────────┐ +│ ezs42d000000 │ +└──────────────┘ +``` + +## geohashDecode + +任意の[geohash](#geohash)エンコーディングされた文字列を経度と緯度にデコードします。 + +**構文** + +```sql +geohashDecode(hash_str) +``` + +**入力値** + +- `hash_str` — Geohashエンコードされた文字列。 + +**返される値** + +- 経度と緯度の`Float64`値のタプル`(longitude, latitude)`。[Tuple](../../data-types/tuple.md)([Float64](../../data-types/float.md)) + +**例** + +``` sql +SELECT geohashDecode('ezs42') AS res; +``` + +``` text +┌─res─────────────────────────────┐ +│ (-5.60302734375,42.60498046875) │ +└─────────────────────────────────┘ +``` + +## geohashesInBox + +指定された精度の[geohash](#geohash)エンコードされた文字列の配列を返します。この配列に含まれる文字列は、指定されたボックスの境界内に存在し、交差します。基本的には2Dグリッドを配列に平坦化したものです。 + +**構文** + +``` sql +geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision) +``` + +**引数** + +- `longitude_min` — 最小経度。範囲: `[-180°, 180°]`。[Float](../../data-types/float.md)。 +- `latitude_min` — 最小緯度。範囲: `[-90°, 90°]`。[Float](../../data-types/float.md)。 +- `longitude_max` — 最大経度。範囲: `[-180°, 180°]`。[Float](../../data-types/float.md)。 +- `latitude_max` — 最大緯度。範囲: `[-90°, 90°]`。[Float](../../data-types/float.md)。 +- `precision` — Geohashの精度。範囲: `[1, 12]`。[UInt8](../../data-types/int-uint.md)。 + +:::note +すべての座標パラメータは同じ型である必要があります: `Float32`または`Float64`。 +::: + +**返される値** + +- 指定されたエリアをカバーする geohashボックスの配列で、その順序に依存するべきではありません。[Array](../../data-types/array.md)([String](../../data-types/string.md))。 +- `[]` - 最小の緯度および経度の値が、それぞれの最大値を下回らない場合は空の配列。 + +:::note +関数は、結果の配列が10,000,000項目を超えると例外を投げます。 +::: + +**例** + +クエリ: + +``` sql +SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos; +``` + +結果: + +``` text +┌─thasos──────────────────────────────────────┐ +│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │ +└─────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/geo/h3.md b/docs/ja/sql-reference/functions/geo/h3.md new file mode 100644 index 00000000000..bcd707240d2 --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/h3.md @@ -0,0 +1,1509 @@ +--- +slug: /ja/sql-reference/functions/geo/h3 +sidebar_label: H3 Indexes +title: "H3 インデックスを操作する関数" +--- + +## H3 インデックス + +[H3](https://eng.uber.com/h3/) は地球の表面を均一な六角形のセルのグリッドに分割する地理的インデックスシステムです。このシステムは階層的であり、最上位の六角形(「親」)を7つの同様でより小さい六角形(「子」)に分割することができます。 + +階層のレベルは `resolution` と呼ばれ、`0` から `15` までの値を取ります。`0` が最も大きく、最も粗いセルを持つ `base` レベルです。 + +緯度と経度のペアは64ビットのH3インデックスに変換され、グリッドセルを特定します。 + +H3インデックスは主に位置のバケッティングや他の地理空間操作に使用されます。 + +H3システムの詳細は[Uber Engineeringのサイト](https://eng.uber.com/h3/)で利用可能です。 + +## h3IsValid + +数値が有効な [H3](#h3-index) インデックスであるかどうかを検証します。 + +**構文** + +``` sql +h3IsValid(h3index) +``` + +**パラメータ** + +- `h3index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 1 — 数字が有効なH3インデックス。[UInt8](../../data-types/int-uint.md)。 +- 0 — 数字が有効なH3インデックスではありません。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3IsValid(630814730351855103) AS h3IsValid; +``` + +結果: + +``` text +┌─h3IsValid─┐ +│ 1 │ +└───────────┘ +``` + +## h3GetResolution + +指定された [H3](#h3-index) インデックスの解像度を定義します。 + +**構文** + +``` sql +h3GetResolution(h3index) +``` + +**パラメータ** + +- `h3index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 +- インデックスが無効な場合、関数はランダムな値を返します。インデックスを確認するために[h3IsValid](#h3isvalid)を使用してください。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3GetResolution(639821929606596015) AS resolution; +``` + +結果: + +``` text +┌─resolution─┐ +│ 14 │ +└────────────┘ +``` + +## h3EdgeAngle + +[H3](#h3-index) 六角形エッジの平均長をグレードで計算します。 + +**構文** + +``` sql +h3EdgeAngle(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。[UInt8](../../data-types/int-uint.md)。範囲: `[0, 15]`。 + +**返される値** + +- [H3](#h3-index) 六角形エッジの平均長をグレードで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3EdgeAngle(10) AS edgeAngle; +``` + +結果: + +``` text +┌───────h3EdgeAngle(10)─┐ +│ 0.0005927224846720883 │ +└───────────────────────┘ +``` + +## h3EdgeLengthM + +[H3](#h3-index) 六角形エッジの平均長をメートルで計算します。 + +**構文** + +``` sql +h3EdgeLengthM(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。[UInt8](../../data-types/int-uint.md)。範囲: `[0, 15]`。 + +**返される値** + +- [H3](#h3-index) 六角形エッジの平均長をメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3EdgeLengthM(15) AS edgeLengthM; +``` + +結果: + +``` text +┌─edgeLengthM─┐ +│ 0.509713273 │ +└─────────────┘ +``` + +## h3EdgeLengthKm + +[H3](#h3-index) 六角形エッジの平均長をキロメートルで計算します。 + +**構文** + +``` sql +h3EdgeLengthKm(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。[UInt8](../../data-types/int-uint.md)。範囲: `[0, 15]`。 + +**返される値** + +- [H3](#h3-index) 六角形エッジの平均長をキロメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3EdgeLengthKm(15) AS edgeLengthKm; +``` + +結果: + +``` text +┌─edgeLengthKm─┐ +│ 0.000509713 │ +└──────────────┘ +``` + +## geoToH3 + +指定された解像度で`(lon, lat)`を持つ[H3](#h3-index)ポイントインデックスを返します。 + +**構文** + +``` sql +geoToH3(lon, lat, resolution) +``` + +**引数** + +- `lon` — 経度。[Float64](../../data-types/float.md)。 +- `lat` — 緯度。[Float64](../../data-types/float.md)。 +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 +- エラーの場合は0を返します。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT geoToH3(37.79506683, 55.71290588, 15) AS h3Index; +``` + +結果: + +``` text +┌────────────h3Index─┐ +│ 644325524701193974 │ +└────────────────────┘ +``` + +## h3ToGeo + +指定された[H3](#h3-index)インデックスに対応する中心の経度と緯度を返します。 + +**構文** + +``` sql +h3ToGeo(h3Index) +``` + +**引数** + +- `h3Index` — H3インデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 二つの値で構成されるタプル: `tuple(lon,lat)`。 `lon` — 経度。[Float64](../../data-types/float.md)。 `lat` — 緯度。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ToGeo(644325524701193974) AS coordinates; +``` + +結果: + +``` text +┌─coordinates───────────────────────────┐ +│ (37.79506616830252,55.71290243145668) │ +└───────────────────────────────────────┘ +``` + +## h3ToGeoBoundary + +指定されたH3インデックスの境界に対応する`(lon, lat)`のペアの配列を返します。 + +**構文** + +``` sql +h3ToGeoBoundary(h3Index) +``` + +**引数** + +- `h3Index` — H3インデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `(lon, lat)`ペアの配列。[Array](../../data-types/array.md)([Float64](../../data-types/float.md), [Float64](../../data-types/float.md))。 + +**例** + +クエリ: + +``` sql +SELECT h3ToGeoBoundary(644325524701193974) AS coordinates; +``` + +結果: + +``` text +┌─h3ToGeoBoundary(599686042433355775)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [(37.2713558667319,-121.91508032705622),(37.353926450852256,-121.8622232890249),(37.42834118609435,-121.92354999630156),(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044),(37.26319797461824,-122.02910130919001)] │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3kRing + +指定された六角形から半径 `k` の中のすべての [H3](#h3-index) 六角形をランダムな順序でリストします。 + +**構文** + +``` sql +h3kRing(h3index, k) +``` + +**引数** + +- `h3index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `k` — 半径。[integer](../../data-types/int-uint.md) + +**返される値** + +- H3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index; +``` + +結果: + +``` text +┌────────────h3index─┐ +│ 644325529233966508 │ +│ 644325529233966497 │ +│ 644325529233966510 │ +│ 644325529233966504 │ +│ 644325529233966509 │ +│ 644325529233966355 │ +│ 644325529233966354 │ +└────────────────────┘ +``` + +## h3GetBaseCell + +指定された [H3](#h3-index) インデックスの基本セル番号を返します。 + +**構文** + +``` sql +h3GetBaseCell(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 六角形基本セル番号。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3GetBaseCell(612916788725809151) AS basecell; +``` + +結果: + +``` text +┌─basecell─┐ +│ 12 │ +└──────────┘ +``` + +## h3HexAreaM2 + +指定された解像度での六角形の平均面積を平方メートルで返します。 + +**構文** + +``` sql +h3HexAreaM2(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 平方メートルの面積。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3HexAreaM2(13) AS area; +``` + +結果: + +``` text +┌─area─┐ +│ 43.9 │ +└──────┘ +``` + +## h3HexAreaKm2 + +指定された解像度での六角形の平均面積を平方キロメートルで返します。 + +**構文** + +``` sql +h3HexAreaKm2(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 平方キロメートルの面積。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3HexAreaKm2(13) AS area; +``` + +結果: + +``` text +┌──────area─┐ +│ 0.0000439 │ +└───────────┘ +``` + +## h3IndexesAreNeighbors + +提供された [H3](#h3-index) インデックスが隣接しているかどうかを返します。 + +**構文** + +``` sql +h3IndexesAreNeighbors(index1, index2) +``` + +**引数** + +- `index1` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `index2` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — インデックスが隣接しています。[UInt8](../../data-types/int-uint.md)。 +- `0` — インデックスが隣接していません。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n; +``` + +結果: + +``` text +┌─n─┐ +│ 1 │ +└───┘ +``` + +## h3ToChildren + +指定された [H3](#h3-index) インデックスの子インデックスの配列を返します。 + +**構文** + +``` sql +h3ToChildren(index, resolution) +``` + +**引数** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 子H3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT h3ToChildren(599405990164561919, 6) AS children; +``` + +結果: + +``` text +┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3ToParent + +指定された [H3](#h3-index) インデックスを含む親(粗い)インデックスを返します。 + +**構文** + +``` sql +h3ToParent(index, resolution) +``` + +**引数** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 親H3インデックス。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ToParent(599405990164561919, 3) AS parent; +``` + +結果: + +``` text +┌─────────────parent─┐ +│ 590398848891879423 │ +└────────────────────┘ +``` + +## h3ToString + +`H3Index` インデックスの表現を文字列表現に変換します。 + +``` sql +h3ToString(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- H3インデックスの文字列表現。[String](../../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ToString(617420388352917503) AS h3_string; +``` + +結果: + +``` text +┌─h3_string───────┐ +│ 89184926cdbffff │ +└─────────────────┘ +``` + +## stringToH3 + +文字列表現を `H3Index` (UInt64) 表現に変換します。 + +**構文** + +``` sql +stringToH3(index_str) +``` + +**パラメータ** + +- `index_str` — H3インデックスの文字列表現。[String](../../data-types/string.md)。 + +**返される値** + +- 六角形のインデックス番号。エラーの場合は0を返します。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT stringToH3('89184926cc3ffff') AS index; +``` + +結果: + +``` text +┌──────────────index─┐ +│ 617420388351344639 │ +└────────────────────┘ +``` + +## h3GetResolution + +[H3](#h3-index) インデックスの解像度を返します。 + +**構文** + +``` sql +h3GetResolution(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3GetResolution(617420388352917503) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 9 │ +└─────┘ +``` + +## h3IsResClassIII + +[H3](#h3-index) インデックスがクラスIII向けの解像度であるかどうかを返します。 + +**構文** + +``` sql +h3IsResClassIII(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — インデックスがクラスIII向けの解像度を持っています。[UInt8](../../data-types/int-uint.md)。 +- `0` — インデックスがクラスIII向けの解像度を持っていません。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3IsResClassIII(617420388352917503) AS res; +``` + +結果: + +``` text +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## h3IsPentagon + +この [H3](#h3-index) インデックスが五角形のセルを表しているかどうかを返します。 + +**構文** + +``` sql +h3IsPentagon(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — インデックスが五角形のセルを表しています。[UInt8](../../data-types/int-uint.md)。 +- `0` — インデックスが五角形のセルを表していません。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3IsPentagon(644721767722457330) AS pentagon; +``` + +結果: + +``` text +┌─pentagon─┐ +│ 0 │ +└──────────┘ +``` + +## h3GetFaces + +指定された [H3](#h3-index) インデックスに交差する二十面体面を返します。 + +**構文** + +``` sql +h3GetFaces(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 指定されたH3インデックスに交差する二十面体面の配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT h3GetFaces(599686042433355775) AS faces; +``` + +結果: + +``` text +┌─faces─┐ +│ [7] │ +└───────┘ +``` + +## h3CellAreaM2 + +指定された入力H3インデックスに対応する特定のセルの正確な面積を平方メートルで返します。 + +**構文** + +``` sql +h3CellAreaM2(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- セルの面積を平方メートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3CellAreaM2(579205133326352383) AS area; +``` + +結果: + +``` text +┌───────────────area─┐ +│ 4106166334463.9233 │ +└────────────────────┘ +``` + +## h3CellAreaRads2 + +指定された入力H3インデックスに対応する特定のセルの正確な面積を平方ラジアンで返します。 + +**構文** + +``` sql +h3CellAreaRads2(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- セルの面積を平方ラジアンで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3CellAreaRads2(579205133326352383) AS area; +``` + +結果: + +``` text +┌────────────────area─┐ +│ 0.10116268528089567 │ +└─────────────────────┘ +``` + +## h3ToCenterChild + +指定された[H3](#h3-index)の解像度で含まれる中心の[H3](#h3-index)子インデックスを返します。 + +**構文** + +``` sql +h3ToCenterChild(index, resolution) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- 指定された[H3](#h3-index)の解像度で含まれる中心の[H3](#h3-index)子インデックス。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ToCenterChild(577023702256844799,1) AS centerToChild; +``` + +結果: + +``` text +┌──────centerToChild─┐ +│ 581496515558637567 │ +└────────────────────┘ +``` + +## h3ExactEdgeLengthM + +入力されたh3インデックスによって表される一方向のエッジの正確な長さをメートル単位で返します。 + +**構文** + +``` sql +h3ExactEdgeLengthM(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 正確なエッジの長さをメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ExactEdgeLengthM(1310277011704381439) AS exactEdgeLengthM;; +``` + +結果: + +``` text +┌───exactEdgeLengthM─┐ +│ 195449.63163407316 │ +└────────────────────┘ +``` + +## h3ExactEdgeLengthKm + +入力されたh3インデックスによって表される一方向のエッジの正確な長さをキロメートル単位で返します。 + +**構文** + +``` sql +h3ExactEdgeLengthKm(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 正確なエッジの長さをキロメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ExactEdgeLengthKm(1310277011704381439) AS exactEdgeLengthKm;; +``` + +結果: + +``` text +┌──exactEdgeLengthKm─┐ +│ 195.44963163407317 │ +└────────────────────┘ +``` + +## h3ExactEdgeLengthRads + +入力されたh3インデックスによって表される一方向のエッジの正確な長さをラジアン単位で返します。 + +**構文** + +``` sql +h3ExactEdgeLengthRads(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 正確なエッジの長さをラジアンで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3ExactEdgeLengthRads(1310277011704381439) AS exactEdgeLengthRads;; +``` + +結果: + +``` text +┌──exactEdgeLengthRads─┐ +│ 0.030677980118976447 │ +└──────────────────────┘ +``` + +## h3NumHexagons + +指定された解像度でのユニークなH3インデックスの数を返します。 + +**構文** + +``` sql +h3NumHexagons(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- H3インデックスの数。[Int64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT h3NumHexagons(3) AS numHexagons; +``` + +結果: + +``` text +┌─numHexagons─┐ +│ 41162 │ +└─────────────┘ +``` + +## h3PointDistM + +緯度/経度ペアの間の「大円」または「ハバース」距離をメートルで返します。 + +**構文** + +``` sql +h3PointDistM(lat1, lon1, lat2, lon2) +``` + +**引数** + +- `lat1`, `lon1` — 度単位で示される点1の緯度と経度。[Float64](../../data-types/float.md)。 +- `lat2`, `lon2` — 度単位で示される点2の緯度と経度。[Float64](../../data-types/float.md)。 + +**返される値** + +- ハバースまたは大円距離をメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +select h3PointDistM(-10.0 ,0.0, 10.0, 0.0) as h3PointDistM; +``` + +結果: + +``` text +┌──────h3PointDistM─┐ +│ 2223901.039504589 │ +└───────────────────┘ +``` + +## h3PointDistKm + +緯度/経度ペアの間の「大円」または「ハバース」距離をキロメートルで返します。 + +**構文** + +``` sql +h3PointDistKm(lat1, lon1, lat2, lon2) +``` + +**引数** + +- `lat1`, `lon1` — 度単位で示される点1の緯度と経度。[Float64](../../data-types/float.md)。 +- `lat2`, `lon2` — 度単位で示される点2の緯度と経度。[Float64](../../data-types/float.md)。 + +**返される値** + +- ハバースまたは大円距離をキロメートルで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +select h3PointDistKm(-10.0 ,0.0, 10.0, 0.0) as h3PointDistKm; +``` + +結果: + +``` text +┌─────h3PointDistKm─┐ +│ 2223.901039504589 │ +└───────────────────┘ +``` + +## h3PointDistRads + +緯度/経度ペアの間の「大円」または「ハバース」距離をラジアンで返します。 + +**構文** + +``` sql +h3PointDistRads(lat1, lon1, lat2, lon2) +``` + +**引数** + +- `lat1`, `lon1` — 度単位で示される点1の緯度と経度。[Float64](../../data-types/float.md)。 +- `lat2`, `lon2` — 度単位で示される点2の緯度と経度。[Float64](../../data-types/float.md)。 + +**返される値** + +- ハバースまたは大円距離をラジアンで示します。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +select h3PointDistRads(-10.0 ,0.0, 10.0, 0.0) as h3PointDistRads; +``` + +結果: + +``` text +┌────h3PointDistRads─┐ +│ 0.3490658503988659 │ +└────────────────────┘ +``` + +## h3GetRes0Indexes + +解像度0のすべてのH3インデックスの配列を返します。 + +**構文** + +``` sql +h3GetRes0Indexes() +``` + +**返される値** + +- 解像度0のすべてのH3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +select h3GetRes0Indexes as indexes ; +``` + +結果: + +``` text +┌─indexes─────────────────────────────────────┐ +│ [576495936675512319,576531121047601151,....]│ +└─────────────────────────────────────────────┘ +``` + +## h3GetPentagonIndexes + +指定された解像度でのすべての五角形H3インデックスを返します。 + +**構文** + +``` sql +h3GetPentagonIndexes(resolution) +``` + +**パラメータ** + +- `resolution` — インデックスの解像度。範囲: `[0, 15]`。[UInt8](../../data-types/int-uint.md)。 + +**返される値** + +- すべての五角形H3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT h3GetPentagonIndexes(3) AS indexes; +``` + +結果: + +``` text +┌─indexes────────────────────────────────────────────────────────┐ +│ [590112357393367039,590464201114255359,590816044835143679,...] │ +└────────────────────────────────────────────────────────────────┘ +``` + +## h3Line + +提供された二つのインデックス間のインデックスの線を返します。 + +**構文** + +``` sql +h3Line(start,end) +``` + +**パラメータ** + +- `start` — 開始点を表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `end` — 終了点を表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +提供された二つのインデックス間のインデックスの線を表すH3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql + SELECT h3Line(590080540275638271,590103561300344831) as indexes; +``` + +結果: + +``` text +┌─indexes────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [590080540275638271,590080471556161535,590080883873021951,590106516237844479,590104385934065663,590103630019821567,590103561300344831] │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3Distance + +提供された二つのインデックス間のグリッドセルでの距離を返します。 + +**構文** + +``` sql +h3Distance(start,end) +``` + +**パラメータ** + +- `start` — 開始点を表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `end` — 終了点を表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- グリッドセルの数。[Int64](../../data-types/int-uint.md)。 + +距離の計算が失敗した場合、負の数を返します。 + +**例** + +クエリ: + +``` sql + SELECT h3Distance(590080540275638271,590103561300344831) as distance; +``` + +結果: + +``` text +┌─distance─┐ +│ 7 │ +└──────────┘ +``` + +## h3HexRing + +指定されたoriginのh3Indexを中心とする六角形のリングのインデックスをkの長さで返します。 + +五角形の歪みがなかった場合、0を返します。 + +**構文** + +``` sql +h3HexRing(index, k) +``` + +**パラメータ** + +- `index` — 起点を表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `k` — 距離。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- H3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql + SELECT h3HexRing(590080540275638271, toUInt16(1)) AS hexRing; +``` + +結果: + +``` text +┌─hexRing─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [590080815153545215,590080471556161535,590080677714591743,590077585338138623,590077447899185151,590079509483487231] │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3GetUnidirectionalEdge + +提供された始点と終点に基づいて一方向エッジのH3インデックスを返し、エラーの場合は0を返します。 + +**構文** + +``` sql +h3GetUnidirectionalEdge(originIndex, destinationIndex) +``` + +**パラメータ** + +- `originIndex` — 始点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `destinationIndex` — 終点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 一方向エッジの六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql + SELECT h3GetUnidirectionalEdge(599686042433355775, 599686043507097599) as edge; +``` + +結果: + +``` text +┌────────────────edge─┐ +│ 1248204388774707199 │ +└─────────────────────┘ +``` + +## h3UnidirectionalEdgeIsValid + +提供されたH3インデックスが有効な一方向エッジインデックスであるかどうかを判断します。一方向エッジである場合は1を、それ以外の場合は0を返します。 + +**構文** + +``` sql +h3UnidirectionalEdgeisValid(index) +``` + +**パラメータ** + +- `index` — 六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 1 — H3インデックスが有効な一方向エッジです。[UInt8](../../data-types/int-uint.md)。 +- 0 — H3インデックスが有効な一方向エッジではありません。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql + SELECT h3UnidirectionalEdgeIsValid(1248204388774707199) as validOrNot; +``` + +結果: + +``` text +┌─validOrNot─┐ +│ 1 │ +└────────────┘ +``` + +## h3GetOriginIndexFromUnidirectionalEdge + +一方向エッジ H3インデックスから始点の六角形インデックスを返します。 + +**構文** + +``` sql +h3GetOriginIndexFromUnidirectionalEdge(edge) +``` + +**パラメータ** + +- `edge` — 一方向エッジを表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 始点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql + SELECT h3GetOriginIndexFromUnidirectionalEdge(1248204388774707197) as origin; +``` + +結果: + +``` text +┌─────────────origin─┐ +│ 599686042433355773 │ +└────────────────────┘ +``` + +## h3GetDestinationIndexFromUnidirectionalEdge + +一方向エッジ H3インデックスから終点の六角形インデックスを返します。 + +**構文** + +``` sql +h3GetDestinationIndexFromUnidirectionalEdge(edge) +``` + +**パラメータ** + +- `edge` — 一方向エッジを表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 終点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql + SELECT h3GetDestinationIndexFromUnidirectionalEdge(1248204388774707197) as destination; +``` + +結果: + +``` text +┌────────destination─┐ +│ 599686043507097597 │ +└────────────────────┘ +``` + +## h3GetIndexesFromUnidirectionalEdge + +指定された一方向エッジH3インデックスから始点および終点の六角形インデックスを返します。 + +**構文** + +``` sql +h3GetIndexesFromUnidirectionalEdge(edge) +``` + +**パラメータ** + +- `edge` — 一方向エッジを表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +始点と終点のインデックスを含むタプル`tuple(origin,destination)`: + +- `origin` — 始点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 +- `destination` — 終点の六角形インデックス番号。[UInt64](../../data-types/int-uint.md)。 + +入力が有効でない場合は`(0,0)`を返します。 + +**例** + +クエリ: + +``` sql + SELECT h3GetIndexesFromUnidirectionalEdge(1248204388774707199) as indexes; +``` + +結果: + +``` text +┌─indexes─────────────────────────────────┐ +│ (599686042433355775,599686043507097599) │ +└─────────────────────────────────────────┘ +``` + +## h3GetUnidirectionalEdgesFromHexagon + +提供されたH3インデックスからのすべての一方向エッジを提供します。 + +**構文** + +``` sql +h3GetUnidirectionalEdgesFromHexagon(index) +``` + +**パラメータ** + +- `index` — 一方向エッジを表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +それぞれの一方向エッジを表すH3インデックスの配列。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql + SELECT h3GetUnidirectionalEdgesFromHexagon(1248204388774707199) as edges; +``` + +結果: + +``` text +┌─edges─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [1248204388774707199,1320261982812635135,1392319576850563071,1464377170888491007,1536434764926418943,1608492358964346879] │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## h3GetUnidirectionalEdgeBoundary + +一方向エッジを定義する座標を返します。 + +**構文** + +``` sql +h3GetUnidirectionalEdgeBoundary(index) +``` + +**パラメータ** + +- `index` — 一方向エッジを表す六角形のインデックス番号。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `(lon, lat)`ペアの配列。[Array](../../data-types/array.md)([Float64](../../data-types/float.md), [Float64](../../data-types/float.md))。 + +**例** + +クエリ: + +``` sql + SELECT h3GetUnidirectionalEdgeBoundary(1248204388774707199) as boundary; +``` + +結果: + +``` text +┌─boundary────────────────────────────────────────────────────────────────────────┐ +│ [(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044)] │ +└─────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/geo/index.md b/docs/ja/sql-reference/functions/geo/index.md new file mode 100644 index 00000000000..84ee7ab7172 --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/index.md @@ -0,0 +1,74 @@ +--- +slug: /ja/sql-reference/functions/geo/ +sidebar_label: Geo +sidebar_position: 62 +title: "地理関数" +--- + +## 地理座標関数 + +- [greatCircleDistance](./coordinates.md#greatcircledistance) +- [geoDistance](./coordinates.md#geodistance) +- [greatCircleAngle](./coordinates.md#greatcircleangle) +- [pointInEllipses](./coordinates.md#pointinellipses) +- [pointInPolygon](./coordinates.md#pointinpolygon) + +## ジオハッシュ関数 + +- [geohashEncode](./geohash.md#geohashencode) +- [geohashDecode](./geohash.md#geohashdecode) +- [geohashesInBox](./geohash.md#geohashesinbox) + +## H3インデックス関数 + +- [h3IsValid](./h3.md#h3isvalid) +- [h3GetResolution](./h3.md#h3getresolution) +- [h3EdgeAngle](./h3.md#h3edgeangle) +- [h3EdgeLengthM](./h3.md#h3edgelengthm) +- [h3EdgeLengthKm](./h3.md#h3edgelengthkm) +- [geoToH3](./h3.md#geotoh3) +- [h3ToGeo](./h3.md#h3togeo) +- [h3ToGeoBoundary](./h3.md#h3togeoboundary) +- [h3kRing](./h3.md#h3kring) +- [h3GetBaseCell](./h3.md#h3getbasecell) +- [h3HexAreaM2](./h3.md#h3hexaream2) +- [h3HexAreaKm2](./h3.md#h3hexareakm2) +- [h3IndexesAreNeighbors](./h3.md#h3indexesareneighbors) +- [h3ToChildren](./h3.md#h3tochildren) +- [h3ToParent](./h3.md#h3toparent) +- [h3ToString](./h3.md#h3tostring) +- [stringToH3](./h3.md#stringtoh3) +- [h3GetResolution](./h3.md#h3getresolution) +- [h3IsResClassIII](./h3.md#h3isresclassiii) +- [h3IsPentagon](./h3.md#h3ispentagon) +- [h3GetFaces](./h3.md#h3getfaces) +- [h3CellAreaM2](./h3.md#h3cellaream2) +- [h3CellAreaRads2](./h3.md#h3cellarearads2) +- [h3ToCenterChild](./h3.md#h3tocenterchild) +- [h3ExactEdgeLengthM](./h3.md#h3exactedgelengthm) +- [h3ExactEdgeLengthKm](./h3.md#h3exactedgelengthkm) +- [h3ExactEdgeLengthRads](./h3.md#h3exactedgelengthrads) +- [h3NumHexagons](./h3.md#h3numhexagons) +- [h3Line](./h3.md#h3line) +- [h3Distance](./h3.md#h3distance) +- [h3HexRing](./h3.md#h3hexring) +- [h3GetUnidirectionalEdge](./h3.md#h3getunidirectionaledge) +- [h3UnidirectionalEdgeIsValid](./h3.md#h3unidirectionaledgeisvalid) +- [h3GetOriginIndexFromUnidirectionalEdge](./h3.md#h3getoriginindexfromunidirectionaledge) +- [h3GetDestinationIndexFromUnidirectionalEdge](./h3.md#h3getdestinationindexfromunidirectionaledge) +- [h3GetIndexesFromUnidirectionalEdge](./h3.md#h3getindexesfromunidirectionaledge) +- [h3GetUnidirectionalEdgesFromHexagon](./h3.md#h3getunidirectionaledgesfromhexagon) +- [h3GetUnidirectionalEdgeBoundary](./h3.md#h3getunidirectionaledgeboundary) + +## S2インデックス関数 + +- [geoToS2](./s2.md#geotos2) +- [s2ToGeo](./s2.md#s2togeo) +- [s2GetNeighbors](./s2.md#s2getneighbors) +- [s2CellsIntersect](./s2.md#s2cellsintersect) +- [s2CapContains](./s2.md#s2capcontains) +- [s2CapUnion](./s2.md#s2capunion) +- [s2RectAdd](./s2.md#s2rectadd) +- [s2RectContains](./s2.md#s2rectcontains) +- [s2RectUnion](./s2.md#s2rectunion) +- [s2RectIntersection](./s2.md#s2rectintersection) diff --git a/docs/ja/sql-reference/functions/geo/polygon.md b/docs/ja/sql-reference/functions/geo/polygon.md new file mode 100644 index 00000000000..88206c21296 --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/polygon.md @@ -0,0 +1,479 @@ +--- +slug: /ja/sql-reference/functions/geo/polygons +sidebar_label: Polygons +title: "多角形を操作するための関数" +--- + +## WKT + +さまざまな[地理データ型](../../data-types/geo.md)からWKT (Well Known Text) 地理オブジェクトを返します。サポートされているWKTオブジェクトは以下の通りです: + +- POINT +- POLYGON +- MULTIPOLYGON +- LINESTRING +- MULTILINESTRING + +**構文** + +```sql +WKT(geo_data) +``` + +**パラメータ** + +`geo_data`は、以下のいずれかの[地理データ型](../../data-types/geo.md)またはその基礎的なプリミティブ型である必要があります: + +- [Point](../../data-types/geo.md#point) +- [Ring](../../data-types/geo.md#ring) +- [Polygon](../../data-types/geo.md#polygon) +- [MultiPolygon](../../data-types/geo.md#multipolygon) +- [LineString](../../data-types/geo.md#linestring) +- [MultiLineString](../../data-types/geo.md#multilinestring) + +**戻り値** + +- WKT地理オブジェクトの`POINT`はPointの場合に返されます。 +- WKT地理オブジェクトの`POLYGON`はPolygonの場合に返されます。 +- WKT地理オブジェクトの`MULTIPOLYGON`はMultiPolygonの場合に返されます。 +- WKT地理オブジェクトの`LINESTRING`はLineStringの場合に返されます。 +- WKT地理オブジェクトの`MULTILINESTRING`はMultiLineStringの場合に返されます。 + +**例** + +タプルからPOINTを得る: + +```sql +SELECT wkt((0., 0.)); +``` + +```response +POINT(0 0) +``` + +タプル配列またはタプル配列の配列からPOLYGONを得る: + +```sql +SELECT wkt([(0., 0.), (10., 0.), (10., 10.), (0., 10.)]); +``` + +```response +POLYGON((0 0,10 0,10 10,0 10)) +``` + +多次元タプル配列からMULTIPOLYGONを得る: + +```sql +SELECT wkt([[[(0., 0.), (10., 0.), (10., 10.), (0., 10.)], [(4., 4.), (5., 4.), (5., 5.), (4., 5.)]], [[(-10., -10.), (-10., -9.), (-9., 10.)]]]); +``` + +```response +MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10))) +``` + +## readWKTMultiPolygon + +WKT (Well Known Text) のMultiPolygonをMultiPolygon型に変換します。 + +### 例 + +``` sql +SELECT + toTypeName(readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))')) AS type, + readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))') AS output FORMAT Markdown + +``` +| type | output | +|:-|:-| +| MultiPolygon | [[[(2,0),(10,0),(10,10),(0,10),(2,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]],[[(-10,-10),(-10,-9),(-9,10),(-10,-10)]]] | + + +### 入力パラメータ + +`MULTIPOLYGON`で始まる文字列 + +### 戻り値 + +MultiPolygon + +## readWKTPolygon + +WKT (Well Known Text) のMultiPolygonをPolygon型に変換します。 + +### 例 + +``` sql +SELECT + toTypeName(readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))')) AS type, + readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))') AS output +FORMAT Markdown +``` +| type | output | +|:-|:-| +| Polygon | [[(2,0),(10,0),(10,10),(0,10),(2,0)]] | + +### 入力パラメータ + +`POLYGON`で始まる文字列 + +### 戻り値 + +Polygon + +## readWKTPoint + +ClickHouseの`readWKTPoint`関数は、Well-Known Text (WKT) 表記のPointジオメトリを解析し、ClickHouseの内部フォーマットでポイントを返します。 + +### 構文 + +```sql +readWKTPoint(wkt_string) +``` + +### 引数 + +- `wkt_string`: Pointジオメトリを表す入力WKT文字列。 + +### 戻り値 + +関数はClickHouse内部表現のPointジオメトリを返します。 + +### 例 + +```sql +SELECT readWKTPoint('POINT (1.2 3.4)'); +``` + +```response +(1.2,3.4) +``` + +## readWKTLineString + +Well-Known Text (WKT) 表記のLineStringジオメトリを解析し、ClickHouseの内部フォーマットとして返します。 + +### 構文 + +```sql +readWKTLineString(wkt_string) +``` + +### 引数 + +- `wkt_string`: LineStringジオメトリを表す入力WKT文字列。 + +### 戻り値 + +関数はClickHouse内部表現のlinestringジオメトリを返します。 + +### 例 + +```sql +SELECT readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)'); +``` + +```response +[(1,1),(2,2),(3,3),(1,1)] +``` + +## readWKTMultiLineString + +Well-Known Text (WKT) 表記のMultiLineStringジオメトリを解析し、ClickHouseの内部フォーマットとして返します。 + +### 構文 + +```sql +readWKTMultiLineString(wkt_string) +``` + +### 引数 + +- `wkt_string`: MultiLineStringジオメトリを表す入力WKT文字列。 + +### 戻り値 + +関数はClickHouse内部表現のmultilinestringジオメトリを返します。 + +### 例 + +```sql +SELECT readWKTMultiLineString('MULTILINESTRING ((1 1, 2 2, 3 3), (4 4, 5 5, 6 6))'); +``` + +```response +[[(1,1),(2,2),(3,3)],[(4,4),(5,5),(6,6)]] +``` + +## readWKTRing + +Well-Known Text (WKT) 表記のPolygonジオメトリを解析し、ClickHouseの内部フォーマットとしてリング(閉じたラインストリング)を返します。 + +### 構文 + +```sql +readWKTRing(wkt_string) +``` + +### 引数 + +- `wkt_string`: Polygonジオメトリを表す入力WKT文字列。 + +### 戻り値 + +関数はClickHouse内部表現のリング(閉じたラインストリング)ジオメトリを返します。 + +### 例 + +```sql +SELECT readWKTRing('POLYGON ((1 1, 2 2, 3 3, 1 1))'); +``` + +```response +[(1,1),(2,2),(3,3),(1,1)] +``` + +## polygonsWithinSpherical + +一つの多角形がもう一つの多角形の中に完全に収まっているかどうかを判定して、trueまたはfalseを返します。参照: https://www.boost.org/doc/libs/1_62_0/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html + +### 例 + +```sql +select polygonsWithinSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]); +``` +```response +0 +``` + +### 入力パラメータ + +### 戻り値 + +UInt8, 0はfalse、1はtrue + +## polygonsDistanceSpherical + +一方の多角形に属するポイントともう一方の多角形に属するポイントとの最小距離を計算します。球面とは、座標が純粋かつ理想的な球上の座標として解釈されることを意味します。地球にとってはこれは正確ではありません。このタイプの座標系を使用すると、実行が速まりますが、もちろん精度は低下します。 + +### 例 + +```sql +SELECT polygonsDistanceSpherical([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]]) +``` +```response +0.24372872211133834 +``` + +### 入力パラメータ + +2つの多角形 + +### 戻り値 + +Float64 + +## polygonsDistanceCartesian + +2つの多角形間の距離を計算します。 + +### 例 + +```sql +SELECT polygonsDistanceCartesian([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]]) +``` +```response +14.000714267493642 +``` + +### 入力パラメータ + +2つの多角形 + +### 戻り値 + +Float64 + +## polygonsEqualsCartesian + +2つの多角形が等しい場合にtrueを返します。 + +### 例 + +```sql +SELECT polygonsEqualsCartesian([[[(1., 1.), (1., 4.), (4., 4.), (4., 1.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]) +``` +```response +1 +``` + +### 入力パラメータ + +2つの多角形 + +### 戻り値 + +UInt8, 0はfalse、1はtrue + +## polygonsSymDifferenceSpherical + +2つの多角形間の空間集合理論的な対称差(XOR)を計算します。 + +### 例 + +```sql +SELECT wkt(arraySort(polygonsSymDifferenceSpherical([[(50., 50.), (50., -50.), (-50., -50.), (-50., 50.), (50., 50.)], [(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)], [(-10., -10.), (-10., -40.), (-40., -40.), (-40., -10.), (-10., -10.)]], [[(-20., -20.), (-20., 20.), (20., 20.), (20., -20.), (-20., -20.)]]))); +``` +```response +MULTIPOLYGON(((-20 -10.3067,-10 -10,-10 -20.8791,-20 -20,-20 -10.3067)),((10 20.8791,20 20,20 10.3067,10 10,10 20.8791)),((50 50,50 -50,-50 -50,-50 50,50 50),(20 10.3067,40 10,40 40,10 40,10 20.8791,-20 20,-20 -10.3067,-40 -10,-40 -40,-10 -40,-10 -20.8791,20 -20,20 10.3067))) +``` + +### 入力パラメータ + +多角形 + +### 戻り値 + +MultiPolygon + +## polygonsSymDifferenceCartesian + +`polygonsSymDifferenceSpherical`と同様ですが、座標系はCartesian座標系です。これは実際の地球のモデルにより近いです。 + +### 例 + +```sql +SELECT wkt(polygonsSymDifferenceCartesian([[[(0, 0), (0, 3), (1, 2.9), (2, 2.6), (2.6, 2), (2.9, 1), (3, 0), (0, 0)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])) +``` +```response +MULTIPOLYGON(((1 2.9,1 1,2.9 1,3 0,0 0,0 3,1 2.9)),((1 2.9,1 4,4 4,4 1,2.9 1,2.6 2,2 2.6,1 2.9))) +``` + +### 入力パラメータ + +多角形 + +### 戻り値 + +MultiPolygon + +## polygonsIntersectionSpherical + +多角形間の交差(AND)を計算し、座標は球面です。 + +### 例 + +```sql +SELECT wkt(arrayMap(a -> arrayMap(b -> arrayMap(c -> (round(c.1, 6), round(c.2, 6)), b), a), polygonsIntersectionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]))) +``` +```response +MULTIPOLYGON(((4.3666 50.8434,4.36024 50.8436,4.34956 50.8536,4.35268 50.8567,4.36794 50.8525,4.3666 50.8434))) +``` + +### 入力パラメータ + +多角形 + +### 戻り値 + +MultiPolygon + +## polygonsWithinCartesian + +2番目の多角形が最初の多角形の中にある場合にtrueを返します。 + +### 例 + +```sql +SELECT polygonsWithinCartesian([[[(2., 2.), (2., 3.), (3., 3.), (3., 2.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]) +``` +```response +1 +``` + +### 入力パラメータ + +2つの多角形 + +### 戻り値 + +UInt8, 0はfalse、1はtrue + +## polygonConvexHullCartesian + +凸包を計算します。[参考資料](https://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/reference/algorithms/convex_hull.html) + +座標はCartesian座標系です。 + +### 例 + +```sql +SELECT wkt(polygonConvexHullCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.), (2., 3.)]]])) +``` +```response +POLYGON((0 0,0 5,5 5,5 0,0 0)) +``` + +### 入力パラメータ + +MultiPolygon + +### 戻り値 + +Polygon + +## polygonAreaSpherical + +多角形の表面積を計算します。 + +### 例 + +```sql +SELECT round(polygonAreaSpherical([[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]), 14) +``` +```response +9.387704e-8 +``` + +### 入力パラメータ + +多角形 + +### 戻り値 + +Float + +## polygonsUnionSpherical + +和集合(OR)を計算します。 + +### 例 + +```sql +SELECT wkt(polygonsUnionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]])) +``` +```response +MULTIPOLYGON(((4.36661 50.8434,4.36623 50.8408,4.34496 50.8333,4.33807 50.8487,4.34669 50.8583,4.35268 50.8567,4.36136 50.8652,4.36131 50.8651,4.39045 50.8565,4.38303 50.8429,4.36661 50.8434))) +``` + +### 入力パラメータ + +多角形 + +### 戻り値 + +MultiPolygon + +## polygonPerimeterSpherical + +多角形の周囲長を計算します。 + +### 例 + +こちらはジンバブエを表す多角形です: + +``` +POLYGON((30.0107 -15.6462,30.0502 -15.6401,30.09 -15.6294,30.1301 -15.6237,30.1699 -15.6322,30.1956 -15.6491,30.2072 -15.6532,30.2231 -15.6497,30.231 -15.6447,30.2461 -15.6321,30.2549 -15.6289,30.2801 -15.6323,30.2962 -15.639,30.3281 -15.6524,30.3567 -15.6515,30.3963 -15.636,30.3977 -15.7168,30.3993 -15.812,30.4013 -15.9317,30.4026 -16.0012,30.5148 -16.0004,30.5866 -16,30.7497 -15.9989,30.8574 -15.9981,30.9019 -16.0071,30.9422 -16.0345,30.9583 -16.0511,30.9731 -16.062,30.9898 -16.0643,31.012 -16.0549,31.0237 -16.0452,31.0422 -16.0249,31.0569 -16.0176,31.0654 -16.0196,31.0733 -16.0255,31.0809 -16.0259,31.089 -16.0119,31.1141 -15.9969,31.1585 -16.0002,31.26 -16.0235,31.2789 -16.0303,31.2953 -16.0417,31.3096 -16.059,31.3284 -16.0928,31.3409 -16.1067,31.3603 -16.1169,31.3703 -16.1237,31.3746 -16.1329,31.3778 -16.1422,31.384 -16.1488,31.3877 -16.1496,31.3956 -16.1477,31.3996 -16.1473,31.4043 -16.1499,31.4041 -16.1545,31.4027 -16.1594,31.4046 -16.1623,31.4241 -16.1647,31.4457 -16.165,31.4657 -16.1677,31.4806 -16.178,31.5192 -16.1965,31.6861 -16.2072,31.7107 -16.2179,31.7382 -16.2398,31.7988 -16.3037,31.8181 -16.3196,31.8601 -16.3408,31.8719 -16.3504,31.8807 -16.368,31.8856 -16.4063,31.8944 -16.4215,31.9103 -16.4289,32.0141 -16.4449,32.2118 -16.4402,32.2905 -16.4518,32.3937 -16.4918,32.5521 -16.5534,32.6718 -16.5998,32.6831 -16.6099,32.6879 -16.6243,32.6886 -16.6473,32.6987 -16.6868,32.7252 -16.7064,32.7309 -16.7087,32.7313 -16.7088,32.7399 -16.7032,32.7538 -16.6979,32.7693 -16.6955,32.8007 -16.6973,32.862 -16.7105,32.8934 -16.7124,32.9096 -16.7081,32.9396 -16.6898,32.9562 -16.6831,32.9685 -16.6816,32.9616 -16.7103,32.9334 -16.8158,32.9162 -16.8479,32.9005 -16.8678,32.8288 -16.9351,32.8301 -16.9415,32.8868 -17.0382,32.9285 -17.1095,32.9541 -17.1672,32.9678 -17.2289,32.9691 -17.2661,32.9694 -17.2761,32.9732 -17.2979,32.9836 -17.3178,32.9924 -17.3247,33.0147 -17.3367,33.0216 -17.3456,33.0225 -17.3615,33.0163 -17.3772,33.0117 -17.384,32.9974 -17.405,32.9582 -17.4785,32.9517 -17.4862,32.943 -17.4916,32.9366 -17.4983,32.9367 -17.5094,32.9472 -17.5432,32.9517 -17.5514,32.9691 -17.5646,33.0066 -17.581,33.0204 -17.5986,33.0245 -17.6192,33.0206 -17.6385,33.0041 -17.6756,33.0002 -17.7139,33.0032 -17.7577,32.9991 -17.7943,32.9736 -17.8106,32.957 -17.818,32.9461 -17.8347,32.9397 -17.8555,32.9369 -17.875,32.9384 -17.8946,32.9503 -17.9226,32.9521 -17.9402,32.9481 -17.9533,32.9404 -17.96,32.9324 -17.9649,32.9274 -17.9729,32.929 -17.9823,32.9412 -17.9963,32.9403 -18.0048,32.9349 -18.0246,32.9371 -18.0471,32.9723 -18.1503,32.9755 -18.1833,32.9749 -18.1908,32.9659 -18.2122,32.9582 -18.2254,32.9523 -18.233,32.9505 -18.2413,32.955 -18.2563,32.9702 -18.2775,33.0169 -18.3137,33.035 -18.3329,33.0428 -18.352,33.0381 -18.3631,33.0092 -18.3839,32.9882 -18.4132,32.9854 -18.4125,32.9868 -18.4223,32.9995 -18.4367,33.003 -18.4469,32.9964 -18.4671,32.9786 -18.4801,32.9566 -18.4899,32.9371 -18.501,32.9193 -18.51,32.9003 -18.5153,32.8831 -18.5221,32.8707 -18.5358,32.8683 -18.5526,32.8717 -18.5732,32.8845 -18.609,32.9146 -18.6659,32.9223 -18.6932,32.9202 -18.7262,32.9133 -18.753,32.9025 -18.7745,32.8852 -18.7878,32.8589 -18.79,32.8179 -18.787,32.7876 -18.7913,32.6914 -18.8343,32.6899 -18.8432,32.6968 -18.8972,32.7032 -18.9119,32.7158 -18.9198,32.7051 -18.9275,32.6922 -18.9343,32.6825 -18.9427,32.6811 -18.955,32.6886 -18.9773,32.6903 -18.9882,32.6886 -19.001,32.6911 -19.0143,32.699 -19.0222,32.7103 -19.026,32.7239 -19.0266,32.786 -19.0177,32.8034 -19.0196,32.8142 -19.0238,32.82 -19.0283,32.823 -19.0352,32.8253 -19.0468,32.8302 -19.0591,32.8381 -19.0669,32.8475 -19.0739,32.8559 -19.0837,32.8623 -19.1181,32.8332 -19.242,32.8322 -19.2667,32.8287 -19.2846,32.8207 -19.3013,32.8061 -19.3234,32.7688 -19.3636,32.7665 -19.3734,32.7685 -19.4028,32.7622 -19.4434,32.7634 -19.464,32.7739 -19.4759,32.7931 -19.4767,32.8113 -19.4745,32.8254 -19.4792,32.8322 -19.5009,32.8325 -19.5193,32.8254 -19.5916,32.8257 -19.6008,32.8282 -19.6106,32.8296 -19.6237,32.8254 -19.6333,32.8195 -19.642,32.8163 -19.6521,32.8196 -19.6743,32.831 -19.6852,32.8491 -19.6891,32.8722 -19.6902,32.8947 -19.6843,32.9246 -19.6553,32.9432 -19.6493,32.961 -19.6588,32.9624 -19.6791,32.9541 -19.7178,32.9624 -19.7354,32.9791 -19.7514,33.0006 -19.7643,33.0228 -19.7731,33.0328 -19.7842,33.0296 -19.8034,33.0229 -19.8269,33.0213 -19.8681,33.002 -19.927,32.9984 -20.0009,33.0044 -20.0243,33.0073 -20.032,32.9537 -20.0302,32.9401 -20.0415,32.9343 -20.0721,32.9265 -20.0865,32.9107 -20.0911,32.8944 -20.094,32.8853 -20.103,32.8779 -20.1517,32.8729 -20.1672,32.8593 -20.1909,32.8571 -20.2006,32.8583 -20.2075,32.8651 -20.2209,32.8656 -20.2289,32.8584 -20.2595,32.853 -20.2739,32.8452 -20.2867,32.8008 -20.3386,32.7359 -20.4142,32.7044 -20.4718,32.6718 -20.5318,32.6465 -20.558,32.6037 -20.5648,32.5565 -20.5593,32.5131 -20.5646,32.4816 -20.603,32.4711 -20.6455,32.4691 -20.6868,32.4835 -20.7942,32.4972 -20.8981,32.491 -20.9363,32.4677 -20.9802,32.4171 -21.0409,32.3398 -21.1341,32.3453 -21.1428,32.3599 -21.1514,32.3689 -21.163,32.3734 -21.1636,32.3777 -21.1634,32.3806 -21.1655,32.3805 -21.1722,32.3769 -21.1785,32.373 -21.184,32.3717 -21.1879,32.4446 -21.3047,32.4458 -21.309,32.4472 -21.3137,32.4085 -21.2903,32.373 -21.3279,32.3245 -21.3782,32.2722 -21.4325,32.2197 -21.4869,32.1673 -21.5413,32.1148 -21.5956,32.0624 -21.65,32.01 -21.7045,31.9576 -21.7588,31.9052 -21.8132,31.8527 -21.8676,31.8003 -21.922,31.7478 -21.9764,31.6955 -22.0307,31.6431 -22.0852,31.5907 -22.1396,31.5382 -22.1939,31.4858 -22.2483,31.4338 -22.302,31.3687 -22.345,31.2889 -22.3973,31.2656 -22.3655,31.2556 -22.358,31.2457 -22.3575,31.2296 -22.364,31.2215 -22.3649,31.2135 -22.3619,31.1979 -22.3526,31.1907 -22.3506,31.1837 -22.3456,31.1633 -22.3226,31.1526 -22.3164,31.1377 -22.3185,31.1045 -22.3334,31.097 -22.3349,31.0876 -22.3369,31.0703 -22.3337,31.0361 -22.3196,30.9272 -22.2957,30.8671 -22.2896,30.8379 -22.2823,30.8053 -22.2945,30.6939 -22.3028,30.6743 -22.3086,30.6474 -22.3264,30.6324 -22.3307,30.6256 -22.3286,30.6103 -22.3187,30.6011 -22.3164,30.5722 -22.3166,30.5074 -22.3096,30.4885 -22.3102,30.4692 -22.3151,30.4317 -22.3312,30.4127 -22.3369,30.3721 -22.3435,30.335 -22.3447,30.3008 -22.337,30.2693 -22.3164,30.2553 -22.3047,30.2404 -22.2962,30.2217 -22.2909,30.197 -22.2891,30.1527 -22.2948,30.1351 -22.2936,30.1111 -22.2823,30.0826 -22.2629,30.0679 -22.2571,30.0381 -22.2538,30.0359 -22.2506,30.0345 -22.2461,30.0155 -22.227,30.0053 -22.2223,29.9838 -22.2177,29.974 -22.214,29.9467 -22.1983,29.9321 -22.1944,29.896 -22.1914,29.8715 -22.1793,29.8373 -22.1724,29.7792 -22.1364,29.7589 -22.1309,29.6914 -22.1341,29.6796 -22.1383,29.6614 -22.1265,29.6411 -22.1292,29.604 -22.1451,29.5702 -22.142,29.551 -22.146,29.5425 -22.1625,29.5318 -22.1724,29.5069 -22.1701,29.4569 -22.1588,29.4361 -22.1631,29.3995 -22.1822,29.378 -22.1929,29.3633 -22.1923,29.3569 -22.1909,29.3501 -22.1867,29.2736 -22.1251,29.2673 -22.1158,29.2596 -22.0961,29.2541 -22.0871,29.2444 -22.0757,29.2393 -22.0726,29.1449 -22.0753,29.108 -22.0692,29.0708 -22.051,29.0405 -22.0209,29.0216 -21.9828,29.0138 -21.9404,29.0179 -21.8981,29.0289 -21.8766,29.0454 -21.8526,29.0576 -21.8292,29.0553 -21.81,29.0387 -21.7979,28.9987 -21.786,28.9808 -21.7748,28.9519 -21.7683,28.891 -21.7649,28.8609 -21.7574,28.7142 -21.6935,28.6684 -21.68,28.6297 -21.6513,28.6157 -21.6471,28.5859 -21.6444,28.554 -21.6366,28.5429 -21.6383,28.5325 -21.6431,28.4973 -21.6515,28.4814 -21.6574,28.4646 -21.6603,28.4431 -21.6558,28.3618 -21.6163,28.3219 -21.6035,28.2849 -21.5969,28.1657 -21.5952,28.0908 -21.5813,28.0329 -21.5779,28.0166 -21.5729,28.0026 -21.5642,27.9904 -21.5519,27.9847 -21.5429,27.9757 -21.5226,27.9706 -21.5144,27.9637 -21.5105,27.9581 -21.5115,27.9532 -21.5105,27.9493 -21.5008,27.9544 -21.4878,27.9504 -21.482,27.9433 -21.4799,27.9399 -21.478,27.9419 -21.4685,27.9496 -21.4565,27.953 -21.4487,27.9502 -21.4383,27.9205 -21.3812,27.9042 -21.3647,27.8978 -21.3554,27.8962 -21.3479,27.8967 -21.3324,27.8944 -21.3243,27.885 -21.3102,27.8491 -21.2697,27.8236 -21.2317,27.7938 -21.1974,27.7244 -21.1497,27.7092 -21.1345,27.6748 -21.0901,27.6666 -21.0712,27.6668 -21.0538,27.679 -21.0007,27.6804 -20.9796,27.6727 -20.9235,27.6726 -20.9137,27.6751 -20.8913,27.6748 -20.8799,27.676 -20.8667,27.6818 -20.8576,27.689 -20.849,27.6944 -20.8377,27.7096 -20.7567,27.7073 -20.7167,27.6825 -20.6373,27.6904 -20.6015,27.7026 -20.5661,27.7056 -20.5267,27.6981 -20.5091,27.6838 -20.4961,27.666 -20.4891,27.6258 -20.4886,27.5909 -20.4733,27.5341 -20.483,27.4539 -20.4733,27.3407 -20.473,27.306 -20.4774,27.2684 -20.4958,27.284 -20.3515,27.266 -20.2342,27.2149 -20.1105,27.2018 -20.093,27.1837 -20.0823,27.1629 -20.0766,27.1419 -20.0733,27.1297 -20.0729,27.1198 -20.0739,27.1096 -20.0732,27.0973 -20.0689,27.0865 -20.0605,27.0692 -20.0374,27.0601 -20.0276,27.0267 -20.0101,26.9943 -20.0068,26.9611 -20.0072,26.9251 -20.0009,26.8119 -19.9464,26.7745 -19.9398,26.7508 -19.9396,26.731 -19.9359,26.7139 -19.9274,26.6986 -19.9125,26.6848 -19.8945,26.6772 -19.8868,26.6738 -19.8834,26.6594 -19.8757,26.6141 -19.8634,26.5956 -19.8556,26.5819 -19.8421,26.5748 -19.8195,26.5663 -19.8008,26.5493 -19.7841,26.5089 -19.7593,26.4897 -19.7519,26.4503 -19.7433,26.4319 -19.7365,26.4128 -19.7196,26.3852 -19.6791,26.3627 -19.6676,26.3323 -19.6624,26.3244 -19.6591,26.3122 -19.6514,26.3125 -19.6496,26.3191 -19.6463,26.3263 -19.6339,26.3335 -19.613,26.331 -19.605,26.3211 -19.592,26.3132 -19.5842,26.3035 -19.5773,26.2926 -19.5725,26.2391 -19.5715,26.1945 -19.5602,26.1555 -19.5372,26.1303 -19.5011,26.0344 -19.2437,26.0114 -19.1998,25.9811 -19.1618,25.9565 -19.1221,25.9486 -19.1033,25.9449 -19.0792,25.9481 -19.0587,25.9644 -19.0216,25.9678 -19.001,25.9674 -18.9999,25.9407 -18.9213,25.8153 -18.814,25.7795 -18.7388,25.7734 -18.6656,25.7619 -18.6303,25.7369 -18.6087,25.6983 -18.5902,25.6695 -18.566,25.6221 -18.5011,25.6084 -18.4877,25.5744 -18.4657,25.5085 -18.3991,25.4956 -18.3789,25.4905 -18.3655,25.4812 -18.3234,25.4732 -18.3034,25.4409 -18.2532,25.4088 -18.176,25.3875 -18.139,25.3574 -18.1158,25.3234 -18.0966,25.2964 -18.0686,25.255 -18.0011,25.2261 -17.9319,25.2194 -17.908,25.2194 -17.8798,25.2598 -17.7941,25.2667 -17.8009,25.2854 -17.8093,25.3159 -17.8321,25.3355 -17.8412,25.3453 -17.8426,25.3765 -17.8412,25.4095 -17.853,25.4203 -17.8549,25.4956 -17.8549,25.5007 -17.856,25.5102 -17.8612,25.5165 -17.8623,25.5221 -17.8601,25.5309 -17.851,25.5368 -17.8487,25.604 -17.8362,25.657 -17.8139,25.6814 -17.8115,25.6942 -17.8194,25.7064 -17.8299,25.7438 -17.8394,25.766 -17.8498,25.786 -17.8622,25.7947 -17.8727,25.8044 -17.8882,25.8497 -17.9067,25.8636 -17.9238,25.8475 -17.9294,25.8462 -17.9437,25.8535 -17.96,25.8636 -17.9716,25.9245 -17.999,25.967 -18.0005,25.9785 -17.999,26.0337 -17.9716,26.0406 -17.9785,26.0466 -17.9663,26.0625 -17.9629,26.0812 -17.9624,26.0952 -17.9585,26.0962 -17.9546,26.0942 -17.9419,26.0952 -17.9381,26.1012 -17.9358,26.1186 -17.9316,26.1354 -17.9226,26.1586 -17.9183,26.1675 -17.9136,26.203 -17.8872,26.2119 -17.8828,26.2211 -17.8863,26.2282 -17.8947,26.2339 -17.904,26.2392 -17.9102,26.2483 -17.9134,26.2943 -17.9185,26.3038 -17.9228,26.312 -17.9284,26.3183 -17.9344,26.3255 -17.936,26.3627 -17.9306,26.4086 -17.939,26.4855 -17.9793,26.5271 -17.992,26.5536 -17.9965,26.5702 -18.0029,26.5834 -18.0132,26.5989 -18.03,26.6127 -18.0412,26.6288 -18.0492,26.6857 -18.0668,26.7 -18.0692,26.7119 -18.0658,26.7406 -18.0405,26.7536 -18.033,26.7697 -18.029,26.794 -18.0262,26.8883 -17.9846,26.912 -17.992,26.9487 -17.9689,26.9592 -17.9647,27.0063 -17.9627,27.0213 -17.9585,27.0485 -17.9443,27.0782 -17.917,27.1154 -17.8822,27.149 -17.8425,27.1465 -17.8189,27.1453 -17.7941,27.147 -17.7839,27.1571 -17.7693,27.4221 -17.5048,27.5243 -17.4151,27.5773 -17.3631,27.6045 -17.3128,27.6249 -17.2333,27.6412 -17.1985,27.7773 -17.0012,27.8169 -16.9596,27.8686 -16.9297,28.023 -16.8654,28.1139 -16.8276,28.2125 -16.7486,28.2801 -16.7065,28.6433 -16.5688,28.6907 -16.5603,28.7188 -16.5603,28.7328 -16.5581,28.7414 -16.5507,28.7611 -16.5323,28.7693 -16.5152,28.8089 -16.4863,28.8225 -16.4708,28.8291 -16.4346,28.8331 -16.4264,28.8572 -16.3882,28.857 -16.3655,28.8405 -16.3236,28.8368 -16.3063,28.8403 -16.2847,28.8642 -16.2312,28.8471 -16.2027,28.8525 -16.1628,28.8654 -16.1212,28.871 -16.0872,28.8685 -16.0822,28.8638 -16.0766,28.8593 -16.0696,28.8572 -16.0605,28.8603 -16.0494,28.8741 -16.0289,28.8772 -16.022,28.8989 -15.9955,28.9324 -15.9637,28.9469 -15.9572,28.9513 -15.9553,28.9728 -15.9514,29.0181 -15.9506,29.0423 -15.9463,29.0551 -15.9344,29.0763 -15.8954,29.0862 -15.8846,29.1022 -15.8709,29.1217 -15.8593,29.1419 -15.8545,29.151 -15.8488,29.1863 -15.8128,29.407 -15.7142,29.4221 -15.711,29.5085 -15.7036,29.5262 -15.6928,29.5634 -15.6621,29.5872 -15.6557,29.6086 -15.6584,29.628 -15.6636,29.6485 -15.6666,29.6728 -15.6633,29.73 -15.6447,29.7733 -15.6381,29.8143 -15.6197,29.8373 -15.6148,29.8818 -15.6188,29.9675 -15.6415,30.0107 -15.6462)) +``` + +```sql +SELECT round(polygonPerimeterSpherical([(30.010654, -15.646227), (30.050238, -15.640129), (30.090029, -15.629381), (30.130129, -15.623696), (30.16992, -15.632171), (30.195552, -15.649121), (30.207231, -15.653152), (30.223147, -15.649741), (30.231002, -15.644677), (30.246091, -15.632068), (30.254876, -15.628864), (30.280094, -15.632275), (30.296196, -15.639042), (30.32805, -15.652428), (30.356679, -15.651498), (30.396263, -15.635995), (30.39771, -15.716817), (30.39926, -15.812005), (30.401327, -15.931688), (30.402568, -16.001244), (30.514809, -16.000418), (30.586587, -16.000004), (30.74973, -15.998867), (30.857424, -15.998144), (30.901865, -16.007136), (30.942173, -16.034524), (30.958296, -16.05106), (30.973075, -16.062016), (30.989767, -16.06429), (31.012039, -16.054885), (31.023718, -16.045169), (31.042218, -16.024912), (31.056895, -16.017574), (31.065421, -16.019641), (31.073328, -16.025532), (31.080872, -16.025946), (31.089037, -16.01189), (31.1141, -15.996904), (31.15849, -16.000211), (31.259983, -16.023465), (31.278897, -16.030287), (31.29533, -16.041655), (31.309592, -16.059019), (31.328351, -16.092815), (31.340908, -16.106664), (31.360339, -16.116896), (31.37026, -16.123718), (31.374601, -16.132916), (31.377754, -16.142218), (31.384006, -16.148832), (31.387727, -16.149556), (31.395582, -16.147695), (31.399613, -16.147282), (31.404315, -16.149866), (31.404057, -16.154517), (31.402713, -16.159374), (31.404574, -16.162268), (31.424107, -16.164749), (31.445708, -16.164955), (31.465655, -16.167746), (31.480641, -16.177978), (31.519192, -16.196478), (31.686107, -16.207227), (31.710705, -16.217872), (31.738197, -16.239783), (31.798761, -16.303655), (31.818088, -16.319571), (31.86005, -16.340759), (31.871935, -16.35037), (31.88072, -16.368044), (31.88563, -16.406284), (31.894363, -16.421477), (31.910279, -16.428919), (32.014149, -16.444938), (32.211759, -16.440184), (32.290463, -16.45176), (32.393661, -16.491757), (32.5521, -16.553355), (32.671783, -16.599761), (32.6831, -16.609889), (32.687906, -16.624255), (32.68863, -16.647303), (32.698655, -16.686784), (32.725217, -16.706421), (32.73095, -16.708656), (32.731314, -16.708798), (32.739893, -16.703217), (32.753845, -16.697946), (32.769348, -16.695466), (32.800664, -16.697326), (32.862004, -16.710452), (32.893372, -16.712415), (32.909598, -16.708075), (32.93957, -16.689781), (32.95621, -16.683063), (32.968509, -16.681615999999998), (32.961585, -16.710348), (32.933369, -16.815768), (32.916213, -16.847911), (32.900503, -16.867755), (32.828776, -16.935141), (32.83012, -16.941549), (32.886757, -17.038184), (32.928512, -17.109497), (32.954143, -17.167168), (32.967786, -17.22887), (32.96909, -17.266115), (32.969439, -17.276102), (32.973212, -17.297909), (32.983599, -17.317753), (32.992384, -17.324678), (33.014656, -17.336667), (33.021633, -17.345555), (33.022459, -17.361471), (33.016258, -17.377181), (33.011651, -17.383991), (32.997448, -17.404983), (32.958174, -17.478467), (32.951663, -17.486218), (32.942981, -17.491593), (32.936573, -17.498311), (32.936676, -17.509369), (32.947218, -17.543166), (32.951663, -17.551434), (32.969129, -17.56456), (33.006646, -17.580993), (33.020392, -17.598563), (33.024526, -17.619233), (33.020599, -17.638457), (33.004063, -17.675561), (33.000238, -17.713905), (33.003184, -17.757726), (32.999102, -17.794313), (32.973573, -17.810643), (32.957037, -17.817981), (32.946082, -17.834724), (32.939674, -17.855498), (32.936883, -17.875032), (32.938433, -17.894566), (32.950267, -17.922574), (32.952128, -17.940247), (32.948149, -17.95327), (32.940397, -17.959988), (32.932439, -17.964949), (32.927375, -17.972907), (32.928977, -17.982312), (32.941224, -17.996265), (32.940294, -18.004843), (32.934919, -18.024583), (32.93709, -18.047114), (32.972282, -18.150261), (32.975537, -18.183333), (32.974865, -18.190775), (32.965925, -18.212169), (32.958174, -18.225398), (32.952283, -18.233046), (32.950525999999996, -18.241314), (32.95497, -18.256301), (32.970163, -18.277488), (33.016878, -18.313661), (33.034965, -18.332885), (33.042768, -18.352005), (33.038066, -18.363064), (33.00923, -18.383941), (32.988198, -18.41319), (32.985356, -18.412467), (32.986803, -18.422285), (32.999515, -18.436651), (33.003029, -18.446883), (32.996414, -18.46714), (32.978586, -18.48006), (32.956624, -18.489878), (32.937142, -18.50104), (32.919313, -18.510032), (32.900296, -18.515303), (32.88314, -18.522124), (32.870737, -18.535767), (32.868257, -18.552613), (32.871668, -18.57318), (32.884483, -18.609044), (32.914559, -18.665888), (32.92231, -18.693173), (32.920243, -18.726246), (32.913267, -18.753014), (32.902518, -18.774512), (32.885207, -18.787844), (32.858852, -18.790015), (32.817924, -18.787018), (32.787642, -18.791255), (32.69142, -18.83425), (32.68987, -18.843241), (32.696794, -18.897192), (32.703202, -18.911868), (32.71576, -18.919826), (32.705063, -18.927474), (32.692247, -18.934295), (32.682532, -18.942667), (32.681085, -18.954966), (32.68863, -18.97729), (32.690283, -18.988246), (32.68863, -19.000958), (32.691058, -19.01429), (32.698965, -19.022249), (32.710282, -19.025969), (32.723873, -19.026589), (32.785988, -19.017701), (32.803351, -19.019561), (32.814203, -19.023799), (32.819991, -19.028346), (32.822988, -19.035168), (32.825262, -19.046847), (32.830223, -19.059146), (32.83813, -19.066897), (32.847483, -19.073925), (32.855906, -19.083744), (32.862262, -19.118057), (32.83322, -19.241977), (32.832187, -19.266678), (32.828673, -19.284558), (32.820715, -19.301301), (32.806142, -19.323419), (32.768831, -19.363623), (32.766454, -19.373442), (32.768521, -19.402794), (32.762217, -19.443412), (32.763354, -19.463979), (32.773947, -19.475864), (32.793119, -19.476691), (32.811309, -19.474521), (32.825365, -19.479172), (32.832187, -19.500876), (32.832497000000004, -19.519273), (32.825365, -19.59162), (32.825675, -19.600818), (32.828156, -19.610636), (32.829603, -19.623659), (32.825365, -19.633271), (32.819474, -19.641952), (32.81627, -19.652081), (32.819629, -19.674302), (32.83105, -19.685154), (32.849137, -19.689081), (32.872184, -19.690218), (32.894715, -19.684327), (32.924584, -19.655285), (32.943188, -19.64929), (32.960964, -19.658799), (32.962411, -19.679056), (32.954143, -19.717813), (32.962411, -19.735383), (32.979051, -19.751403), (33.0006, -19.764322), (33.022769, -19.773107), (33.032795, -19.784166), (33.029642, -19.80339), (33.022873, -19.826851), (33.021322, -19.868088), (33.001995, -19.927), (32.998378, -20.000897), (33.004373, -20.024255), (33.007266, -20.032006), (32.95373, -20.030249), (32.940087, -20.041515), (32.934299, -20.072107), (32.926548, -20.086473), (32.910683, -20.091124), (32.894405, -20.094018), (32.88531, -20.10301), (32.877869, -20.151689), (32.872908, -20.167192), (32.859265, -20.190859), (32.857095, -20.200575), (32.858335, -20.207499), (32.865053, -20.220935), (32.86557, -20.228893), (32.858438, -20.259486), (32.852961, -20.273852), (32.845209, -20.286668), (32.800767, -20.338551), (32.735862, -20.414205), (32.704443, -20.471773), (32.671783, -20.531821), (32.646462, -20.557969), (32.603674, -20.56479), (32.556545, -20.559312), (32.513136, -20.564583), (32.481614, -20.603031), (32.471072, -20.645509), (32.469108, -20.68685), (32.483474, -20.794233), (32.49722, -20.898103), (32.491019, -20.936344), (32.467661, -20.980165), (32.417122, -21.040937), (32.339814, -21.134058), (32.345343, -21.142843), (32.359864, -21.151421), (32.368856, -21.162997), (32.373352, -21.163617), (32.377744, -21.16341), (32.380638, -21.165477), (32.380535, -21.172195), (32.376866, -21.178499), (32.37299, -21.183977), (32.37175, -21.187905), (32.444613, -21.304693), (32.445849, -21.308994), (32.447197, -21.313685), (32.408543, -21.290327), (32.37299, -21.327948), (32.324517, -21.378177), (32.272221, -21.432541), (32.219718, -21.486904), (32.167318, -21.541268), (32.114814, -21.595632), (32.062415, -21.649995), (32.010015, -21.704462), (31.957615, -21.758826), (31.905215, -21.813189), (31.852712, -21.867553), (31.800312, -21.92202), (31.747808, -21.976384), (31.695512, -22.030747), (31.643112, -22.085214), (31.590712, -22.139578), (31.538209, -22.193941), (31.485809, -22.248305), (31.433822, -22.302048), (31.36871, -22.345043), (31.288922, -22.39734), (31.265616, -22.365507), (31.255642, -22.357962), (31.24572, -22.357549), (31.229597, -22.363957), (31.221536, -22.364887), (31.213474, -22.36189), (31.197868, -22.352588), (31.190685, -22.350624), (31.183657, -22.34556), (31.163348, -22.322616), (31.152599, -22.316414), (31.137717, -22.318482), (31.10454, -22.333364), (31.097048, -22.334922), (31.087642, -22.336878), (31.07033, -22.333674), (31.036121, -22.319618), (30.927187, -22.295744), (30.867087, -22.289646), (30.83789, -22.282308), (30.805282, -22.294504), (30.693919, -22.302772), (30.674282, -22.30856), (30.647410999999998, -22.32644), (30.632424, -22.330677), (30.625551, -22.32861), (30.610307, -22.318688), (30.601108, -22.316414), (30.57217, -22.316621), (30.507367, -22.309593), (30.488454, -22.310213), (30.46923, -22.315071), (30.431713, -22.331194), (30.412696, -22.336878), (30.372078, -22.343493), (30.334975, -22.344733), (30.300765, -22.336982), (30.269346, -22.316414), (30.25529, -22.304736), diff --git a/docs/ja/sql-reference/functions/geo/s2.md b/docs/ja/sql-reference/functions/geo/s2.md new file mode 100644 index 00000000000..665baec51a6 --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/s2.md @@ -0,0 +1,371 @@ +--- +slug: /ja/sql-reference/functions/geo/s2 +sidebar_label: S2 Geometry +--- + +# S2インデックスを扱うための関数 + +## S2Index + +[S2](https://s2geometry.io/)は、すべての地理データが三次元の球(地球儀のようなもの)上で表現される地理的インデックスシステムです。 + +S2ライブラリでは、ポイントはS2インデックスとして表されます。これは、伝統的な(緯度、経度)のペアとは異なり、単位球の表面上のポイントを内部的にエンコードする特定の数値です。指定された形式(緯度、経度)で指定されたポイントに対してS2ポイントインデックスを取得するには、[geoToS2](#geotos2)関数を使用します。また、指定されたS2ポイントインデックスに対応する地理座標を取得するには、[s2ToGeo](#s2togeo)関数を使用できます。 + +## geoToS2 + +提供された座標 `(経度、緯度)` に対応する [S2](#s2index) ポイントインデックスを返します。 + +**構文** + +``` sql +geoToS2(lon, lat) +``` + +**引数** + +- `lon` — 経度。[Float64](../../data-types/float.md)。 +- `lat` — 緯度。[Float64](../../data-types/float.md)。 + +**返される値** + +- S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT geoToS2(37.79506683, 55.71290588) AS s2Index; +``` + +結果: + +``` text +┌─────────────s2Index─┐ +│ 4704772434919038107 │ +└─────────────────────┘ +``` + +## s2ToGeo + +提供された [S2](#s2index) ポイントインデックスに対応する地理座標 `(経度、緯度)` を返します。 + +**構文** + +``` sql +s2ToGeo(s2index) +``` + +**引数** + +- `s2index` — S2インデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 2つの値を持つ[タプル](../../data-types/tuple.md): + - `lon`。 [Float64](../../data-types/float.md)。 + - `lat`。 [Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2ToGeo(4704772434919038107) AS s2Coodrinates; +``` + +結果: + +``` text +┌─s2Coodrinates────────────────────────┐ +│ (37.79506681471008,55.7129059052841) │ +└──────────────────────────────────────┘ +``` + +## s2GetNeighbors + +提供された [S2](#s2index) に対応するS2近傍インデックスを返します。S2システムでは、各セルは4つの測地線に囲まれた四辺形です。そのため、各セルには4つの隣接セルがあります。 + +**構文** + +``` sql +s2GetNeighbors(s2index) +``` + +**引数** + +- `s2index` — S2インデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- 4つの近傍インデックスからなる配列: `array[s2index1, s2index3, s2index2, s2index4]`。[Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md))。 + +**例** + +クエリ: + +``` sql +SELECT s2GetNeighbors(5074766849661468672) AS s2Neighbors; +``` + +結果: + +``` text +┌─s2Neighbors───────────────────────────────────────────────────────────────────────┐ +│ [5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] │ +└───────────────────────────────────────────────────────────────────────────────────┘ +``` + +## s2CellsIntersect + +2つの提供された [S2](#s2index) セルが交差しているかどうかを判断します。 + +**構文** + +``` sql +s2CellsIntersect(s2index1, s2index2) +``` + +**引数** + +- `s2index1`, `s2index2` — S2インデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — セルが交差している場合。[UInt8](../../data-types/int-uint.md)。 +- `0` — セルが交差していない場合。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2CellsIntersect(9926595209846587392, 9926594385212866560) AS intersect; +``` + +結果: + +``` text +┌─intersect─┐ +│ 1 │ +└───────────┘ +``` + +## s2CapContains + +キャップがS2ポイントを含むかどうかを判断します。キャップは、球面上に平面によって切り取られた部分を表します。それは球面上の点と度数での半径で定義されます。 + +**構文** + +``` sql +s2CapContains(center, degrees, point) +``` + +**引数** + +- `center` — キャップに対応するS2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `degrees` — キャップの半径(度数)。[Float64](../../data-types/float.md)。 +- `point` — S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — キャップがS2ポイントインデックスを含む場合。[UInt8](../../data-types/int-uint.md)。 +- `0` — キャップがS2ポイントインデックスを含まない場合。[UInt8](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2CapContains(1157339245694594829, 1.0, 1157347770437378819) AS capContains; +``` + +結果: + +``` text +┌─capContains─┐ +│ 1 │ +└─────────────┘ +``` + +## s2CapUnion + +与えられた2つの入力キャップを含む最小のキャップを決定します。キャップは、球面上に平面によって切り取られた部分を表します。それは球面上の点と度数での半径で定義されます。 + +**構文** + +``` sql +s2CapUnion(center1, radius1, center2, radius2) +``` + +**引数** + +- `center1`, `center2` — 2つの入力キャップに対応するS2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `radius1`, `radius2` — 2つの入力キャップの半径(度数)。[Float64](../../data-types/float.md)。 + +**返される値** + +- `center` — 2つの入力キャップを含む最小キャップの中心に対応するS2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `radius` — 2つの入力キャップを含む最小キャップの半径。[Float64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2CapUnion(3814912406305146967, 1.0, 1157347770437378819, 1.0) AS capUnion; +``` + +結果: + +``` text +┌─capUnion───────────────────────────────┐ +│ (4534655147792050737,60.2088283994957) │ +└────────────────────────────────────────┘ +``` + +## s2RectAdd + +指定されたS2ポイントを含むようにバウンディング矩形のサイズを拡大します。S2システムでは、矩形は緯度経度空間内の矩形を表す`S2LatLngRect`と呼ばれるタイプのS2Regionによって表現されます。 + +**構文** + +``` sql +s2RectAdd(s2pointLow, s2pointHigh, s2Point) +``` + +**引数** + +- `s2PointLow` — 矩形に対応する低S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2PointHigh` — 矩形に対応する高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2Point` — バウンド矩形に含まれるべきターゲットS2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `s2PointLow` — 拡大された矩形に対応する低S2セルID。[UInt64](../../data-types/int-uint.md)。 +- `s2PointHigh` — 拡大された矩形に対応する高S2セルID。[UInt64](../../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2RectAdd(5178914411069187297, 5177056748191934217, 5179056748191934217) AS rectAdd; +``` + +結果: + +``` text +┌─rectAdd───────────────────────────────────┐ +│ (5179062030687166815,5177056748191934217) │ +└───────────────────────────────────────────┘ +``` + +## s2RectContains + +指定された矩形がS2ポイントを含むかどうかを判断します。S2システムでは、矩形は緯度経度空間内の矩形を表す`S2LatLngRect`と呼ばれるタイプのS2Regionによって表現されます。 + +**構文** + +``` sql +s2RectContains(s2PointLow, s2PointHi, s2Point) +``` + +**引数** + +- `s2PointLow` — 矩形に対応する低S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2PointHigh` — 矩形に対応する高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2Point` — ターゲットS2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `1` — 矩形が指定されたS2ポイントを含む場合。 +- `0` — 矩形が指定されたS2ポイントを含まない場合。 + +**例** + +クエリ: + +``` sql +SELECT s2RectContains(5179062030687166815, 5177056748191934217, 5177914411069187297) AS rectContains; +``` + +結果: + +``` text +┌─rectContains─┐ +│ 0 │ +└──────────────┘ +``` + +## s2RectUnion + +この矩形と指定された矩形の和を含む最小の矩形を返します。S2システムでは、矩形は緯度経度空間内の矩形を表す`S2LatLngRect`と呼ばれるタイプのS2Regionによって表現されます。 + +**構文** + +``` sql +s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi) +``` + +**引数** + +- `s2Rect1PointLow`, `s2Rect1PointHi` — 最初の矩形に対応する低および高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2Rect2PointLow`, `s2Rect2PointHi` — 2番目の矩形に対応する低および高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `s2UnionRect2PointLow` — 和矩形に対応する低S2セルID。[UInt64](../../data-types/int-uint.md)。 +- `s2UnionRect2PointHi` — 和矩形に対応する高S2セルID。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2RectUnion(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectUnion; +``` + +結果: + +``` text +┌─rectUnion─────────────────────────────────┐ +│ (5179062030687166815,5177056748191934217) │ +└───────────────────────────────────────────┘ +``` + +## s2RectIntersection + +この矩形と指定された矩形の交点を含む最小の矩形を返します。S2システムでは、矩形は緯度経度空間内の矩形を表す`S2LatLngRect`と呼ばれるタイプのS2Regionによって表現されます。 + +**構文** + +``` sql +s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi) +``` + +**引数** + +- `s2Rect1PointLow`, `s2Rect1PointHi` — 最初の矩形に対応する低および高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 +- `s2Rect2PointLow`, `s2Rect2PointHi` — 2番目の矩形に対応する低および高S2ポイントインデックス。[UInt64](../../data-types/int-uint.md)。 + +**返される値** + +- `s2UnionRect2PointLow` — 指定された矩形の交点を含む矩形に対応する低S2セルID。[UInt64](../../data-types/int-uint.md)。 +- `s2UnionRect2PointHi` — 指定された矩形の交点を含む矩形に対応する高S2セルID。[UInt64](../../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT s2RectIntersection(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectIntersection; +``` + +結果: + +``` text +┌─rectIntersection──────────────────────────┐ +│ (5178914411069187297,5177056748191934217) │ +└──────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/geo/svg.md b/docs/ja/sql-reference/functions/geo/svg.md new file mode 100644 index 00000000000..12b628884d3 --- /dev/null +++ b/docs/ja/sql-reference/functions/geo/svg.md @@ -0,0 +1,75 @@ +--- +slug: /ja/sql-reference/functions/geo/svg +sidebar_label: SVG +title: "GeoデータからSVG画像を生成する関数" +--- + +## Svg + +Geoデータから選択されたSVG要素タグの文字列を返します。 + +**構文** + +``` sql +Svg(geometry,[style]) +``` + +エイリアス: `SVG`, `svg` + +**パラメータ** + +- `geometry` — Geoデータ。[Geo](../../data-types/geo)。 +- `style` — オプションのスタイル名。[String](../../data-types/string)。 + +**戻り値** + +- ジオメトリのSVG表現。[String](../../data-types/string)。 + - SVG circle + - SVG polygon + - SVG path + +**例** + +**サークル** + +クエリ: + +```sql +SELECT SVG((0., 0.)) +``` + +結果: + +```response + +``` + +**ポリゴン** + +クエリ: + +```sql +SELECT SVG([(0., 0.), (10, 0), (10, 10), (0, 10)]) +``` + +結果: + +```response + +``` + +**パス** + +クエリ: + +```sql +SELECT SVG([[(0., 0.), (10, 0), (10, 10), (0, 10)], [(4., 4.), (5, 4), (5, 5), (4, 5)]]) +``` + +結果: + +```response + +``` + + diff --git a/docs/ja/sql-reference/functions/hash-functions.md b/docs/ja/sql-reference/functions/hash-functions.md new file mode 100644 index 00000000000..3832cb3206a --- /dev/null +++ b/docs/ja/sql-reference/functions/hash-functions.md @@ -0,0 +1,1948 @@ +--- +slug: /ja/sql-reference/functions/hash-functions +sidebar_position: 85 +sidebar_label: Hash +--- + +# ハッシュ関数 + +ハッシュ関数は、要素の決定的な擬似ランダムシャッフルに使用できます。 + +Simhashは、類似した引数に対して近いハッシュ値を返すハッシュ関数です。 + +## halfMD5 + +すべての入力パラメータを文字列として[解釈](../functions/type-conversion-functions.md/#type_conversion_functions-reinterpretAsString)し、それぞれに対して[MD5](https://en.wikipedia.org/wiki/MD5)ハッシュ値を計算します。その後、ハッシュを結合し、結果の文字列のハッシュの最初の8バイトを取り出して、ビッグエンディアンバイトオーダーで`UInt64`として解釈します。 + +```sql +halfMD5(par1, ...) +``` + +この関数は比較的遅いです(1秒あたり500万の短い文字列をプロセッサコアごとに処理します)。 +代わりに[sipHash64](#siphash64)関数の使用を検討してください。 + +**引数** + +この関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、対応するデータを持つ`Map`および`Array(Tuple(key, value))`型など)。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +**例** + +```sql +SELECT halfMD5(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS halfMD5hash, toTypeName(halfMD5hash) AS type; +``` + +```response +┌────────halfMD5hash─┬─type───┐ +│ 186182704141653334 │ UInt64 │ +└────────────────────┴────────┘ +``` + +## MD4 + +文字列からMD4を計算し、結果のバイトセットをFixedString(16)として返します。 + +## MD5 + +文字列からMD5を計算し、結果のバイトセットをFixedString(16)として返します。 +特定のMD5が必要でない場合、暗号化的に確かな128ビットハッシュが必要な場合には、代わりに‘sipHash128’関数を使用してください。 +md5sumユーティリティと同じ結果を得たい場合は、lower(hex(MD5(s)))を使用してください。 + +## RIPEMD160 + +[RIPEMD-160](https://en.wikipedia.org/wiki/RIPEMD)ハッシュ値を生成します。 + +**構文** + +```sql +RIPEMD160(input) +``` + +**パラメータ** + +- `input`: 入力文字列。[String](../data-types/string.md) + +**返される値** + +- 160ビットの`RIPEMD-160` ハッシュ値、[FixedString(20)](../data-types/fixedstring.md)型。 + +**例** + +結果を16進エンコードされた文字列として表すには、[hex](../functions/encoding-functions.md/#hex)関数を使用します。 + +クエリ: + +```sql +SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog')); +``` + +```response +┌─HEX(RIPEMD160('The quick brown fox jumps over the lazy dog'))─┐ +│ 37F332F68DB77BD9D7EDD4969571AD671CF9DD3B │ +└───────────────────────────────────────────────────────────────┘ +``` + +## sipHash64 + +64ビットの[SipHash](https://en.wikipedia.org/wiki/SipHash)ハッシュ値を生成します。 + +```sql +sipHash64(par1,...) +``` + +これは暗号化ハッシュ関数です。少なくとも[MD5](#md5)ハッシュ関数の3倍の速さで動作します。 + +この関数はすべての入力パラメータを文字列として[解釈](../functions/type-conversion-functions.md/#type_conversion_functions-reinterpretAsString)し、各パラメータごとにハッシュ値を計算します。次に、以下のアルゴリズムでハッシュを結合します。 + +1. 最初と二番目のハッシュ値を連結し、結果をハッシュします。 +2. 前回計算されたハッシュ値と第三の入力パラメータのハッシュを同様にハッシュします。 +3. この計算を元の入力の残りのすべてのハッシュ値に対して繰り返します。 + +**引数** + +この関数は任意の[サポートされているデータ型](../data-types/index.md)の可変数の入力パラメータを取ります。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +同じ入力値でも異なる引数型の場合、計算されるハッシュ値が等しい場合があることに注意してください。例えば、異なるサイズの整数、同じデータを持つ名前あり・なしの`Tuple`、同じデータを持つ`Map`と対応する`Array(Tuple(key, value))`型です。 + +**例** + +```sql +SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type; +``` + +```response +┌──────────────SipHash─┬─type───┐ +│ 11400366955626497465 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## sipHash64Keyed + +[sipHash64](#siphash64)と同様ですが、固定キーを使う代わりに明示的なキー引数を追加で取ります。 + +**構文** + +```sql +sipHash64Keyed((k0, k1), par1,...) +``` + +**引数** + +[sipHash64](#siphash64)と同様ですが、最初の引数はキーを表す二つの`UInt64`値のタプルです。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +**例** + +クエリ: + +```sql +SELECT sipHash64Keyed((506097522914230528, 1084818905618843912), array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type; +``` + +```response +┌─────────────SipHash─┬─type───┐ +│ 8017656310194184311 │ UInt64 │ +└─────────────────────┴────────┘ +``` + +## sipHash128 + +[sipHash64](#siphash64)と同様ですが、128ビットのハッシュ値を生成します。最終的なxor折りたたみ状態は128ビットまで実行されます。 + +:::note +この128ビットのバリアントはリファレンス実装とは異なり、弱いです。 +これは、書かれた当時、SipHashの公式な128ビット拡張が存在しなかったためです。 +新しいプロジェクトではおそらく[sipHash128Reference](#siphash128reference)を使用すべきです。 +::: + +**構文** + +```sql +sipHash128(par1,...) +``` + +**引数** + +[sipHash64](#siphash64)と同様。 + +**返される値** + +128ビットの`SipHash`ハッシュ値。[FixedString(16)](../data-types/fixedstring.md)型。 + +**例** + +クエリ: + +```sql +SELECT hex(sipHash128('foo', '\x01', 3)); +``` + +結果: + +```response +┌─hex(sipHash128('foo', '', 3))────┐ +│ 9DE516A64A414D4B1B609415E4523F24 │ +└──────────────────────────────────┘ +``` + +## sipHash128Keyed + +[sipHash128](#siphash128)と同様ですが、固定キーを使用する代わりに明示的なキー引数を追加で取ります。 + +:::note +この128ビットのバリアントはリファレンス実装とは異なり、弱いです。 +これは、書かれた当時、SipHashの公式な128ビット拡張が存在しなかったためです。 +新しいプロジェクトではおそらく[sipHash128ReferenceKeyed](#siphash128referencekeyed)を使用すべきです。 +::: + +**構文** + +```sql +sipHash128Keyed((k0, k1), par1,...) +``` + +**引数** + +[sipHash128](#siphash128)と同様ですが、最初の引数はキーを表す二つの`UInt64`値のタプルです。 + +**返される値** + +128ビットの`SipHash`ハッシュ値。[FixedString(16)](../data-types/fixedstring.md)型。 + +**例** + +クエリ: + +```sql +SELECT hex(sipHash128Keyed((506097522914230528, 1084818905618843912),'foo', '\x01', 3)); +``` + +結果: + +```response +┌─hex(sipHash128Keyed((506097522914230528, 1084818905618843912), 'foo', '', 3))─┐ +│ B8467F65C8B4CFD9A5F8BD733917D9BF │ +└───────────────────────────────────────────────────────────────────────────────┘ +``` + +## sipHash128Reference + +[sipHash128](#siphash128)と同様ですが、SipHashのオリジナル作者による128ビットアルゴリズムを実装しています。 + +**構文** + +```sql +sipHash128Reference(par1,...) +``` + +**引数** + +[sipHash128](#siphash128)と同様。 + +**返される値** + +128ビットの`SipHash`ハッシュ値。[FixedString(16)](../data-types/fixedstring.md)型。 + +**例** + +クエリ: + +```sql +SELECT hex(sipHash128Reference('foo', '\x01', 3)); +``` + +結果: + +```response +┌─hex(sipHash128Reference('foo', '', 3))─┐ +│ 4D1BE1A22D7F5933C0873E1698426260 │ +└────────────────────────────────────────┘ +``` + +## sipHash128ReferenceKeyed + +[sipHash128Reference](#siphash128reference)と同様ですが、固定キーを使用する代わりに明示的なキー引数を追加で取ります。 + +**構文** + +```sql +sipHash128ReferenceKeyed((k0, k1), par1,...) +``` + +**引数** + +[sipHash128Reference](#siphash128reference)と同様ですが、最初の引数はキーを表す二つの`UInt64`値のタプルです。 + +**返される値** + +128ビットの`SipHash`ハッシュ値。[FixedString(16)](../data-types/fixedstring.md)型。 + +**例** + +クエリ: + +```sql +SELECT hex(sipHash128ReferenceKeyed((506097522914230528, 1084818905618843912),'foo', '\x01', 3)); +``` + +結果: + +```response +┌─hex(sipHash128ReferenceKeyed((506097522914230528, 1084818905618843912), 'foo', '', 3))─┐ +│ 630133C9722DC08646156B8130C4CDC8 │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## cityHash64 + +64ビットの[CityHash](https://github.com/google/cityhash)ハッシュ値を生成します。 + +```sql +cityHash64(par1,...) +``` + +これは高速な非暗号化ハッシュ関数です。文字列パラメータにはCityHashアルゴリズムを使用し、他のデータ型のパラメータには実装固有の高速非暗号化ハッシュ関数を使用します。この関数はCityHashのコンビネータを使用して最終結果を得ます。 + +GoogleがCityHashのアルゴリズムをClickHouseに追加された後に変更したことに注意してください。つまり、ClickHouseのcityHash64とGoogleの上流のCityHashは異なる結果を生成します。ClickHouseのcityHash64はCityHash v1.0.2に対応しています。 + +**引数** + +この関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、同じデータを持つ`Map`および対応する`Array(Tuple(key, value))`型)。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +**例** + +呼び出し例: + +```sql +SELECT cityHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS CityHash, toTypeName(CityHash) AS type; +``` + +```response +┌─────────────CityHash─┬─type───┐ +│ 12072650598913549138 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +次の例は、行順序までの精度でテーブル全体のチェックサムを計算する方法を示しています: + +```sql +SELECT groupBitXor(cityHash64(*)) FROM table +``` + +## intHash32 + +任意の型の整数から32ビットのハッシュコードを計算します。 +これは、数値用の平均的な品質の高速な非暗号化ハッシュ関数です。 + +**構文** + +```sql +intHash32(int) +``` + +**引数** + +- `int` — ハッシュ化する整数。[(U)Int*](../data-types/int-uint.md)。 + +**返される値** + +- 32ビットのハッシュコード。[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT intHash32(42); +``` + +結果: + +```response +┌─intHash32(42)─┐ +│ 1228623923 │ +└───────────────┘ +``` + +## intHash64 + +任意の型の整数から64ビットのハッシュコードを計算します。 +これは、数値用の平均的な品質の高速な非暗号化ハッシュ関数です。 +[intHash32](#inthash32)よりも高速に動作します。 + +**構文** + +```sql +intHash64(int) +``` + +**引数** + +- `int` — ハッシュ化する整数。[(U)Int*](../data-types/int-uint.md)。 + +**返される値** + +- 64ビットのハッシュコード。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT intHash64(42); +``` + +結果: + +```response +┌────────intHash64(42)─┐ +│ 11490350930367293593 │ +└──────────────────────┘ +``` + +## SHA1, SHA224, SHA256, SHA512, SHA512_256 + +文字列からSHA-1, SHA-224, SHA-256, SHA-512, SHA-512-256のハッシュを計算し、結果のバイトセットを[FixedString](../data-types/fixedstring.md)として返します。 + +**構文** + +```sql +SHA1('s') +... +SHA512('s') +``` + +この関数は比較的遅いです(SHA-1は1秒あたり500万の短い文字列をプロセッサコアごとに処理し、SHA-224とSHA-256は約220万を処理します)。 +この関数を使用するのは、特定のハッシュ関数が必要であり、選択ができない場合のみをお勧めします。 +このような場合でも、テーブルに挿入する際にオフラインで関数を適用し、値を事前に計算することをお勧めします。 + +**引数** + +- `s` — SHAハッシュ計算のための入力文字列。[String](../data-types/string.md)。 + +**返される値** + +- SHAハッシュを16進数非エンコードされたFixedStringとして返します。SHA-1はFixedString(20)として、SHA-224はFixedString(28)、SHA-256はFixedString(32)、SHA-512はFixedString(64)です。[FixedString](../data-types/fixedstring.md)。 + +**例** + +結果を16進エンコードされた文字列として表すには、[hex](../functions/encoding-functions.md/#hex)関数を使用します。 + +クエリ: + +```sql +SELECT hex(SHA1('abc')); +``` + +結果: + +```response +┌─hex(SHA1('abc'))─────────────────────────┐ +│ A9993E364706816ABA3E25717850C26C9CD0D89D │ +└──────────────────────────────────────────┘ +``` + +## BLAKE3 + +BLAKE3ハッシュ文字列を計算し、結果のバイトセットを[FixedString](../data-types/fixedstring.md)として返します。 + +**構文** + +```sql +BLAKE3('s') +``` + +この暗号化ハッシュ関数はBLAKE3 Rustライブラリと統合されています。この関数はかなり速く、SHA-2と比較して約2倍の性能を示し、SHA-256と同じ長さのハッシュを生成します。 + +**引数** + +- s - BLAKE3ハッシュ計算のための入力文字列。[String](../data-types/string.md)。 + +**返される値** + +- BLAKE3ハッシュを型FixedString(32)のバイト配列として返します。[FixedString](../data-types/fixedstring.md)。 + +**例** + +結果を16進エンコードされた文字列として表すには、[hex](../functions/encoding-functions.md/#hex)関数を使用します。 + +クエリ: +```sql +SELECT hex(BLAKE3('ABC')) +``` + +結果: +```sql +┌─hex(BLAKE3('ABC'))───────────────────────────────────────────────┐ +│ D1717274597CF0289694F75D96D444B992A096F1AFD8E7BBFA6EBB1D360FEDFC │ +└──────────────────────────────────────────────────────────────────┘ +``` + +## URLHash(url\[, N\]) + +文字列をURLから取得し、ある種の正規化を行った後、高速で質の良い非暗号化ハッシュ関数を計算します。 +`URLHash(s)` – 終わりに`/`、`?`、`#`のいずれかの追加入力シンボルがある場合、それを除いた状態で文字列からハッシュを計算します。 +`URLHash(s, N)` – 終わりに`/`、`?`、`#`のいずれかの追加入力シンボルがある場合、それを除いた状態でURL階層のNレベルまでハッシュを計算します。 +レベルはURLHierarchyと同じです。 + +## farmFingerprint64 + +## farmHash64 + +64ビットの[FarmHash](https://github.com/google/farmhash)またはFingerprint値を生成します。`farmFingerprint64`は、安定していてポータブルな値が好ましい場合にお勧めします。 + +```sql +farmFingerprint64(par1, ...) +farmHash64(par1, ...) +``` + +これらの関数は、[使用可能なすべてのメソッド](https://github.com/google/farmhash/blob/master/src/farmhash.h)から、それぞれ`Fingerprint64`と`Hash64`メソッドを使用します。 + +**引数** + +この関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、同じデータを持つ`Map`および対応する`Array(Tuple(key, value))`型)。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +**例** + +```sql +SELECT farmHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS FarmHash, toTypeName(FarmHash) AS type; +``` + +```response +┌─────────────FarmHash─┬─type───┐ +│ 17790458267262532859 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## javaHash + +Javaの[String](http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452)からJavaHashを計算します, +[Byte](https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/Byte.java#l405), +[Short](https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/Short.java#l410), +[Integer](https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/Integer.java#l959), +[Long](https://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/Long.java#l1060). +このハッシュ関数は速くもなく、高品質でもありません。このアルゴリズムが他のシステムで既に使用されていて、全く同じ結果を計算する必要がある場合にのみ使う理由があります。 + +Javaは符号付き整数のハッシュしか計算をサポートしていないことに注意してください。符号なし整数のハッシュを計算したい場合は、適切な符号付きClickHouse型にキャストする必要があります。 + +**構文** + +```sql +SELECT javaHash('') +``` + +**返される値** + +`Int32`データ型のハッシュ値。 + +**例** + +クエリ: + +```sql +SELECT javaHash(toInt32(123)); +``` + +結果: + +```response +┌─javaHash(toInt32(123))─┐ +│ 123 │ +└────────────────────────┘ +``` + +クエリ: + +```sql +SELECT javaHash('Hello, world!'); +``` + +結果: + +```response +┌─javaHash('Hello, world!')─┐ +│ -1880044555 │ +└───────────────────────────┘ +``` + +## javaHashUTF16LE + +文字列からJavaHashを計算し、それがUTF-16LEエンコーディングであるバイトを持つと仮定します。 + +**構文** + +```sql +javaHashUTF16LE(stringUtf16le) +``` + +**引数** + +- `stringUtf16le` — UTF-16LEエンコーディングされた文字列。 + +**返される値** + +`Int32`データ型のハッシュ値。 + +**例** + +UTF-16LEエンコードされた文字列を用いた正しいクエリ。 + +クエリ: + +```sql +SELECT javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le')); +``` + +結果: + +```response +┌─javaHashUTF16LE(convertCharset('test', 'utf-8', 'utf-16le'))─┐ +│ 3556498 │ +└──────────────────────────────────────────────────────────────┘ +``` + +## hiveHash + +文字列から`HiveHash`を計算します。 + +```sql +SELECT hiveHash('') +``` + +これは、符号ビットをゼロ化したただの[JavaHash](#javahash)です。この関数は、[Apache Hive](https://en.wikipedia.org/wiki/Apache_Hive)バージョン3.0以前で使用されます。このハッシュ関数は速くも高品質でもありません。このアルゴリズムが他のシステムですでに使用されていて、完全に同じ結果を計算する必要がある場合にのみ使用する理由があります。 + +**返される値** + +- `hiveHash`ハッシュ値。[Int32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT hiveHash('Hello, world!'); +``` + +結果: + +```response +┌─hiveHash('Hello, world!')─┐ +│ 267439093 │ +└───────────────────────────┘ +``` + +## metroHash64 + +64ビットの[MetroHash](http://www.jandrewrogers.com/2015/05/27/metrohash/)ハッシュ値を生成します。 + +```sql +metroHash64(par1, ...) +``` + +**引数** + +この関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、同じデータを持つ`Map`および対応する`Array(Tuple(key, value))`型)。 + +**返される値** + +[UInt64](../data-types/int-uint.md)データ型のハッシュ値。 + +**例** + +```sql +SELECT metroHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MetroHash, toTypeName(MetroHash) AS type; +``` + +```response +┌────────────MetroHash─┬─type───┐ +│ 14235658766382344533 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## jumpConsistentHash + +UInt64からJumpConsistentHashを計算します。 +2つの引数を受け取ります: `UInt64`型のキーとバケット数。返されるのは`Int32`です。 +詳細は、リンクをご覧ください: [JumpConsistentHash](https://arxiv.org/pdf/1406.2294.pdf) + +## kostikConsistentHash + +Konstantin 'kostik' OblakovによるO(1)時間および空間の一貫性ハッシュアルゴリズム。以前は`yandexConsistentHash`。 + +**構文** + +```sql +kostikConsistentHash(input, n) +``` + +別名: `yandexConsistentHash`(後方互換性のために残されています)。 + +**パラメータ** + +- `input`: `UInt64`型のキー。[UInt64](../data-types/int-uint.md)。 +- `n`: バケット数。[UInt16](../data-types/int-uint.md)。 + +**返される値** + +- [UInt16](../data-types/int-uint.md)データ型のハッシュ値。 + +**実装の細部** + +n <= 32768の場合にのみ効率的です。 + +**例** + +クエリ: + +```sql +SELECT kostikConsistentHash(16045690984833335023, 2); +``` + +```response +┌─kostikConsistentHash(16045690984833335023, 2)─┐ +│ 1 │ +└───────────────────────────────────────────────┘ +``` + +## murmurHash2_32, murmurHash2_64 + +[MurmurHash2](https://github.com/aappleby/smhasher)ハッシュ値を生成します。 + +```sql +murmurHash2_32(par1, ...) +murmurHash2_64(par1, ...) +``` + +**引数** + +両方の関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、同じデータを持つ`Map`および対応する`Array(Tuple(key, value))`型)。 + +**返される値** + +- `murmurHash2_32`関数は[UInt32](../data-types/int-uint.md)データ型のハッシュ値を返します。 +- `murmurHash2_64`関数は[UInt64](../data-types/int-uint.md)データ型のハッシュ値を返します。 + +**例** + +```sql +SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash2, toTypeName(MurmurHash2) AS type; +``` + +```response +┌──────────MurmurHash2─┬─type───┐ +│ 11832096901709403633 │ UInt64 │ +└──────────────────────┴────────┘ +``` + +## gccMurmurHash + +[gcc](https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/include/bits/functional_hash.h#L191)と同じハッシュシードを使用して64ビットの[MurmurHash2](https://github.com/aappleby/smhasher)ハッシュ値を計算します。ClangとGCCのビルド間で互換性があります。 + +**構文** + +```sql +gccMurmurHash(par1, ...) +``` + +**引数** + +- `par1, ...` — [サポートされているデータ型](../data-types/index.md/#data_types)のいずれかである可変数のパラメータ。 + +**返される値** + +- 計算されたハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + gccMurmurHash(1, 2, 3) AS res1, + gccMurmurHash(('a', [1, 2, 3], 4, (4, ['foo', 'bar'], 1, (1, 2)))) AS res2 +``` + +結果: + +```response +┌─────────────────res1─┬────────────────res2─┐ +│ 12384823029245979431 │ 1188926775431157506 │ +└──────────────────────┴─────────────────────┘ +``` + +## kafkaMurmurHash + +[Kafka](https://github.com/apache/kafka/blob/461c5cfe056db0951d9b74f5adc45973670404d7/clients/src/main/java/org/apache/kafka/common/utils/Utils.java#L482)と同じハッシュシードを使用して32ビットの[MurmurHash2](https://github.com/aappleby/smhasher)ハッシュ値を計算し、[Default Partitioner](https://github.com/apache/kafka/blob/139f7709bd3f5926901a21e55043388728ccca78/clients/src/main/java/org/apache/kafka/clients/producer/internals/BuiltInPartitioner.java#L328)と互換性があるように最上位ビットを持ちません。 + +**構文** + +```sql +MurmurHash(par1, ...) +``` + +**引数** + +- `par1, ...` — [サポートされているデータ型](../data-types/index.md/#data_types)のいずれかである可変数のパラメータ。 + +**返される値** + +- 計算されたハッシュ値。[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + kafkaMurmurHash('foobar') AS res1, + kafkaMurmurHash(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS res2 +``` + +結果: + +```response +┌───────res1─┬─────res2─┐ +│ 1357151166 │ 85479775 │ +└────────────┴──────────┘ +``` + +## murmurHash3_32, murmurHash3_64 + +[MurmurHash3](https://github.com/aappleby/smhasher)ハッシュ値を生成します。 + +```sql +murmurHash3_32(par1, ...) +murmurHash3_64(par1, ...) +``` + +**引数** + +両方の関数は可変数の入力パラメータを取ります。引数は[サポートされているデータ型](../data-types/index.md)のいずれかであり得ます。異なる型の引数でも、同じ値に対して計算されるハッシュ関数の値が同じになる場合があります(異なるサイズの整数、同じデータを持つ名前付きおよび名前なしの`Tuple`、同じデータを持つ`Map`および対応する`Array(Tuple(key, value))`型)。 + +**返される値** + +- `murmurHash3_32`関数は[UInt32](../data-types/int-uint.md)データ型のハッシュ値を返します。 +- `murmurHash3_64`関数は[UInt64](../data-types/int-uint.md)データ型のハッシュ値を返します。 + +**例** + +```sql +SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS MurmurHash3, toTypeName(MurmurHash3) AS type; +``` + +```response +┌─MurmurHash3─┬─type───┐ +│ 2152717 │ UInt32 │ +└─────────────┴────────┘ +``` + +## murmurHash3_128 + +128ビットの[MurmurHash3](https://github.com/aappleby/smhasher)ハッシュ値を生成します。 + +**構文** + +```sql +murmurHash3_128(expr) +``` + +**引数** + +- `expr` — [式](../syntax.md/#syntax-expressions)のリスト。[String](../data-types/string.md)。 + +**返される値** + +128ビットの`MurmurHash3`ハッシュ値。[FixedString(16)](../data-types/fixedstring.md)。 + +**例** + +クエリ: + +```sql +SELECT hex(murmurHash3_128('foo', 'foo', 'foo')); +``` + +結果: + +```response +┌─hex(murmurHash3_128('foo', 'foo', 'foo'))─┐ +│ F8F7AD9B6CD4CF117A71E277E2EC2931 │ +└───────────────────────────────────────────┘ +``` + +## xxh3 + +64ビットの[xxh3](https://github.com/Cyan4973/xxHash)ハッシュ値を生成します。 + +**構文** + +```sql +xxh3(expr) +``` + +**引数** + +- `expr` — 任意のデータ型の[式](../syntax.md/#syntax-expressions)のリスト。 + +**返される値** + +64ビットの`xxh3`ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT xxh3('Hello', 'world') +``` + +結果: + +```response +┌─xxh3('Hello', 'world')─┐ +│ 5607458076371731292 │ +└────────────────────────┘ +``` + +## xxHash32, xxHash64 + +文字列から`xxHash`を計算します。32ビットと64ビットの2つのフレーバーがあります。 + +```sql +SELECT xxHash32('') + +OR + +SELECT xxHash64('') +``` + +**返される値** + +- ハッシュ値。[UInt32/64](../data-types/int-uint.md)。 + +:::note +戻り型は`xxHash32`の場合`UInt32`、`xxHash64`の場合`UInt64`になります。 +::: + +**例** + +クエリ: + +```sql +SELECT xxHash32('Hello, world!'); +``` + +結果: + +```response +┌─xxHash32('Hello, world!')─┐ +│ 834093149 │ +└───────────────────────────┘ +``` + +**関連項目** + +- [xxHash](http://cyan4973.github.io/xxHash/)。 + +## ngramSimHash + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、n-gramの`simhash`を返します。大文字小文字を区別します。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +ngramSimHash(string[, ngramsize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT ngramSimHash('ClickHouse') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 1627567969 │ +└────────────┘ +``` + +## ngramSimHashCaseInsensitive + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、n-gramの`simhash`を返します。大文字小文字を区別しません。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +ngramSimHashCaseInsensitive(string[, ngramsize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT ngramSimHashCaseInsensitive('ClickHouse') AS Hash; +``` + +結果: + +```response +┌──────Hash─┐ +│ 562180645 │ +└───────────┘ +``` + +## ngramSimHashUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、n-gramの`simhash`を返します。大文字小文字を区別します。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +ngramSimHashUTF8(string[, ngramsize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT ngramSimHashUTF8('ClickHouse') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 1628157797 │ +└────────────┘ +``` + +## ngramSimHashCaseInsensitiveUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、n-gramの`simhash`を返します。大文字小文字を区別しません。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +ngramSimHashCaseInsensitiveUTF8(string[, ngramsize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT ngramSimHashCaseInsensitiveUTF8('ClickHouse') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 1636742693 │ +└────────────┘ +``` + +## wordShingleSimHash + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割して、単語シングルの`simhash`を返します。大文字小文字を区別します。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +wordShingleSimHash(string[, shinglesize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT wordShingleSimHash('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 2328277067 │ +└────────────┘ +``` + +## wordShingleSimHashCaseInsensitive + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割して、単語シングルの`simhash`を返します。大文字小文字を区別しません。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +wordShingleSimHashCaseInsensitive(string[, shinglesize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT wordShingleSimHashCaseInsensitive('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 2194812424 │ +└────────────┘ +``` + +## wordShingleSimHashUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割して、単語シングルの`simhash`を返します。大文字小文字を区別します。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +wordShingleSimHashUTF8(string[, shinglesize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT wordShingleSimHashUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 2328277067 │ +└────────────┘ +``` + +## wordShingleSimHashCaseInsensitiveUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割して、単語シングルの`simhash`を返します。大文字小文字を区別しません。 + +[bitHammingDistance](../functions/bit-functions.md/#bithammingdistance)を使用して、半重複文字列を検出するために使用できます。計算された2つの文字列の`simhashes`の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)が小さいほど、それらの文字列は同じ可能性が高くなります。 + +**構文** + +```sql +wordShingleSimHashCaseInsensitiveUTF8(string[, shinglesize]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT wordShingleSimHashCaseInsensitiveUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Hash; +``` + +結果: + +```response +┌───────Hash─┐ +│ 2194812424 │ +└────────────┘ +``` + +## wyHash64 + +64ビットの[wyHash64](https://github.com/wangyi-fudan/wyhash)ハッシュ値を生成します。 + +**構文** + +```sql +wyHash64(string) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT wyHash64('ClickHouse') AS Hash; +``` + +結果: + +```response +┌─────────────────Hash─┐ +│ 12336419557878201794 │ +└──────────────────────┘ +``` + +## ngramMinHash + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、各n-gramのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別します。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +ngramMinHash(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHash('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────┐ +│ (18333312859352735453,9054248444481805918) │ +└────────────────────────────────────────────┘ +``` + +## ngramMinHashCaseInsensitive + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、各n-gramのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別しません。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +ngramMinHashCaseInsensitive(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashCaseInsensitive('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────┐ +│ (2106263556442004574,13203602793651726206) │ +└────────────────────────────────────────────┘ +``` + +## ngramMinHashUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、各n-gramのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別します。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +ngramMinHashUTF8(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashUTF8('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────┐ +│ (18333312859352735453,6742163577938632877) │ +└────────────────────────────────────────────┘ +``` + +## ngramMinHashCaseInsensitiveUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、各n-gramのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別しません。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +ngramMinHashCaseInsensitiveUTF8(string [, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashCaseInsensitiveUTF8('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple───────────────────────────────────────┐ +│ (12493625717655877135,13203602793651726206) │ +└─────────────────────────────────────────────┘ +``` + +## ngramMinHashArg + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、最小および最大ハッシュを計算する[ngramMinHash](#ngramminhash)関数で同じ入力を用いて計算されたn-gramsを返します。大文字小文字を区別します。 + +**構文** + +```sql +ngramMinHashArg(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 各`hashnum`個のn-gramsを持つ2つのタプルを含むタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashArg('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────────────┐ +│ (('ous','ick','lic','Hou','kHo','use'),('Hou','lic','ick','ous','ckH','Cli')) │ +└───────────────────────────────────────────────────────────────────────────────┘ +``` + +## ngramMinHashArgCaseInsensitive + +ASCII文字列を`ngramsize`シンボルのn-gramに分割し、最小および最大ハッシュを計算する[ngramMinHashCaseInsensitive](#ngramminhashcaseinsensitive)関数で同じ入力を用いて計算されたn-gramsを返します。大文字小文字を区別しません。 + +**構文** + +```sql +ngramMinHashArgCaseInsensitive(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 各`hashnum`個のn-gramsを持つ2つのタプルを含むタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashArgCaseInsensitive('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────────────┐ +│ (('ous','ick','lic','kHo','use','Cli'),('kHo','lic','ick','ous','ckH','Hou')) │ +└───────────────────────────────────────────────────────────────────────────────┘ +``` + +## ngramMinHashArgUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、最小および最大ハッシュを計算する[ngramMinHashUTF8](#ngramminhashutf8)関数で同じ入力を用いて計算されたn-gramsを返します。大文字小文字を区別します。 + +**構文** + +```sql +ngramMinHashArgUTF8(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 各`hashnum`個のn-gramsを持つ2つのタプルを含むタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashArgUTF8('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────────────┐ +│ (('ous','ick','lic','Hou','kHo','use'),('kHo','Hou','lic','ick','ous','ckH')) │ +└───────────────────────────────────────────────────────────────────────────────┘ +``` + +## ngramMinHashArgCaseInsensitiveUTF8 + +UTF-8文字列を`ngramsize`シンボルのn-gramに分割し、最小および最大ハッシュを計算する[ngramMinHashCaseInsensitiveUTF8](#ngramminhashcaseinsensitiveutf8)関数で同じ入力を用いて計算されたn-gramsを返します。大文字小文字を区別しません。 + +**構文** + +```sql +ngramMinHashArgCaseInsensitiveUTF8(string[, ngramsize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `ngramsize` — n-gramのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 各`hashnum`個のn-gramsを持つ2つのタプルを含むタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT ngramMinHashArgCaseInsensitiveUTF8('ClickHouse') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────────────┐ +│ (('ckH','ous','ick','lic','kHo','use'),('kHo','lic','ick','ous','ckH','Hou')) │ +└───────────────────────────────────────────────────────────────────────────────┘ +``` + +## wordShingleMinHash + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割して、各単語シングルのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別します。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +wordShingleMinHash(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHash('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────┐ +│ (16452112859864147620,5844417301642981317) │ +└────────────────────────────────────────────┘ +``` + +## wordShingleMinHashCaseInsensitive + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割して、各単語シングルのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別しません。 + +[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列を検出するために使用できます。2つの文字列の場合: 返されるハッシュのいずれかが両方の文字列で同じである場合、それらの文字列は同じであると考えます。 + +**構文** + +```sql +wordShingleMinHashCaseInsensitive(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果の計算に使用される最小および最大ハッシュの数。オプション。可能な値は`1`から`25`までの任意の数。デフォルト値: `6`。[UInt8](../data-types/int-uint.md)। + +**返される値** + +- 2つのハッシュを持つタプル — 最小と最大。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashCaseInsensitive('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────┐ +│ (3065874883688416519,1634050779997673240) │ +└───────────────────────────────────────────┘ +``` + +## wordShingleMinHashUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割して、各単語シングルのハッシュ値を計算します。`hashnum`個の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`個の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別します。 +は[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列の検出に使用できます。2つの文字列に対して、返されたハッシュの1つが両方の文字列で同じであれば、それらの文字列は同じであると考えます。 + +**構文** + +```sql +wordShingleMinHashUTF8(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。 [String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。 [UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。 [UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュ(最小および最大)のタプル。 [Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────┐ +│ (16452112859864147620,5844417301642981317) │ +└────────────────────────────────────────────┘ +``` + +## wordShingleMinHashCaseInsensitiveUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割し、各単語シングルに対するハッシュ値を計算します。`hashnum`の最小ハッシュを使用して最小ハッシュを計算し、`hashnum`の最大ハッシュを使用して最大ハッシュを計算します。これらのハッシュを含むタプルを返します。大文字小文字を区別しません。 + +は[tupleHammingDistance](../functions/tuple-functions.md/#tuplehammingdistance)を使用して、半重複文字列の検出に使用できます。2つの文字列に対して、返されたハッシュの1つが両方の文字列で同じであれば、それらの文字列は同じであると考えます。 + +**構文** + +```sql +wordShingleMinHashCaseInsensitiveUTF8(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- 2つのハッシュ(最小および最大)のタプル。[Tuple](../data-types/tuple.md)([UInt64](../data-types/int-uint.md), [UInt64](../data-types/int-uint.md))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashCaseInsensitiveUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).') AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────┐ +│ (3065874883688416519,1634050779997673240) │ +└───────────────────────────────────────────┘ +``` + +## wordShingleMinHashArg + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割し、同じ入力で[wordshingleMinHash](#wordshingleminhash)関数によって計算された最小および最大ワードハッシュを持つシングルを返します。大文字小文字を区別します。 + +**構文** + +```sql +wordShingleMinHashArg(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- `hashnum`ワードシングルを含む2つのタプル。 [Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashArg('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).', 1, 3) AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────┐ +│ (('OLAP','database','analytical'),('online','oriented','processing')) │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +## wordShingleMinHashArgCaseInsensitive + +ASCII文字列を`shinglesize`単語の部分(シングル)に分割し、同じ入力で[wordShingleMinHashCaseInsensitive](#wordshingleminhashcaseinsensitive)関数によって計算された最小および最大ワードハッシュを持つシングルを返します。大文字小文字を区別しません。 + +**構文** + +```sql +wordShingleMinHashArgCaseInsensitive(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- `hashnum`ワードシングルを含む2つのタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashArgCaseInsensitive('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).', 1, 3) AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────────────────────────────────┐ +│ (('queries','database','analytical'),('oriented','processing','DBMS')) │ +└────────────────────────────────────────────────────────────────────────┘ +``` + +## wordShingleMinHashArgUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割し、同じ入力で[wordShingleMinHashUTF8](#wordshingleminhashutf8)関数によって計算された最小および最大ワードハッシュを持つシングルを返します。大文字小文字を区別します。 + +**構文** + +```sql +wordShingleMinHashArgUTF8(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- `hashnum`ワードシングルを含む2つのタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashArgUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).', 1, 3) AS Tuple; +``` + +結果: + +```response +┌─Tuple─────────────────────────────────────────────────────────────────┐ +│ (('OLAP','database','analytical'),('online','oriented','processing')) │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +## wordShingleMinHashArgCaseInsensitiveUTF8 + +UTF-8文字列を`shinglesize`単語の部分(シングル)に分割し、同じ入力で[wordShingleMinHashCaseInsensitiveUTF8](#wordshingleminhashcaseinsensitiveutf8)関数によって計算された最小および最大ワードハッシュを持つシングルを返します。大文字小文字を区別しません。 + +**構文** + +```sql +wordShingleMinHashArgCaseInsensitiveUTF8(string[, shinglesize, hashnum]) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md)。 +- `shinglesize` — 単語シングルのサイズ。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`3`。[UInt8](../data-types/int-uint.md)。 +- `hashnum` — 結果を計算するために使用される最小および最大ハッシュの数。省略可能。可能な値:`1`から`25`までの任意の数。デフォルト値:`6`。[UInt8](../data-types/int-uint.md)。 + +**返される値** + +- `hashnum`ワードシングルを含む2つのタプル。[Tuple](../data-types/tuple.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md)), [Tuple](../data-types/tuple.md)([String](../data-types/string.md)))。 + +**例** + +クエリ: + +```sql +SELECT wordShingleMinHashArgCaseInsensitiveUTF8('ClickHouse® is a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP).', 1, 3) AS Tuple; +``` + +結果: + +```response +┌─Tuple──────────────────────────────────────────────────────────────────┐ +│ (('queries','database','analytical'),('oriented','processing','DBMS')) │ +└────────────────────────────────────────────────────────────────────────┘ +``` + +## sqidEncode + +番号を[Sqid](https://sqids.org/)としてエンコードします。これはYouTubeのようなID文字列です。 +出力アルファベットは `abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789` です。 +ハッシュのためにこの関数を使用しないでください - 生成されたIDは元の番号にデコード可能です。 + +**構文** + +```sql +sqidEncode(number1, ...) +``` + +エイリアス: `sqid` + +**引数** + +- 可変個数のUInt8, UInt16, UInt32またはUInt64の番号。 + +**返される値** + +sqid [String](../data-types/string.md)。 + +**例** + +```sql +SELECT sqidEncode(1, 2, 3, 4, 5); +``` + +```response +┌─sqidEncode(1, 2, 3, 4, 5)─┐ +│ gXHfJ1C6dN │ +└───────────────────────────┘ +``` + +## sqidDecode + +[Sqid](https://sqids.org/)を元の番号にデコードします。入力文字列が有効なsqidでない場合は、空の配列を返します。 + +**構文** + +```sql +sqidDecode(sqid) +``` + +**引数** + +- sqid - [String](../data-types/string.md) + +**返される値** + +数値に変換されたsqid [Array(UInt64)](../data-types/array.md)。 + +**例** + +```sql +SELECT sqidDecode('gXHfJ1C6dN'); +``` + +```response +┌─sqidDecode('gXHfJ1C6dN')─┐ +│ [1,2,3,4,5] │ +└──────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/in-functions.md b/docs/ja/sql-reference/functions/in-functions.md new file mode 100644 index 00000000000..c13cba1ebbe --- /dev/null +++ b/docs/ja/sql-reference/functions/in-functions.md @@ -0,0 +1,11 @@ +--- +slug: /ja/sql-reference/functions/in-functions +sidebar_position: 90 +sidebar_label: IN オペレーター +--- + +# IN オペレーターを実装するための関数 + +## in, notIn, globalIn, globalNotIn + +[IN オペレーター](../../sql-reference/operators/in.md#select-in-operators)のセクションを参照してください。 diff --git a/docs/ja/sql-reference/functions/index.md b/docs/ja/sql-reference/functions/index.md new file mode 100644 index 00000000000..7263348bd58 --- /dev/null +++ b/docs/ja/sql-reference/functions/index.md @@ -0,0 +1,63 @@ +--- +slug: /ja/sql-reference/functions/ +sidebar_position: 1 +sidebar_label: 概要 +--- + +# 通常の関数 + +少なくとも\* 2つのタイプの関数があります - 通常の関数(単に「関数」とも呼ばれます)と集約関数です。これらは全く異なる概念です。通常の関数は各行に個別に適用されるかのように動作します(各行ごとに、関数の結果は他の行に依存しません)。集約関数はさまざまな行から値のセットを累積します(つまり、行の全体セットに依存します)。 + +このセクションでは通常の関数について説明します。集約関数については、「集約関数」のセクションをご覧ください。 + +:::note +[‘arrayJoin’ 関数](../functions/array-join.md)が属する、3番目のタイプの関数があります。そして、[テーブル関数](../table-functions/index.md)も別途言及できます。 +::: + +## 強い型付け + +標準SQLとは対照的に、ClickHouseは強い型付けを持っています。つまり、型間での暗黙の変換は行いません。各関数は特定の型セットに対して動作します。これは、型変換関数を使用する必要がある場合があることを意味します。 + +## 共通部分式の削除 + +クエリ内のすべての式が同じAST(同じ記録または構文解析の同じ結果)を持つとき、それらは同一の値を持つと見なされます。そのような式は連結され、1回だけ実行されます。同一のサブクエリもこの方法で削除されます。 + +## 結果のタイプ + +すべての関数は結果として単一の戻り値を返します(複数の値でもなく、ゼロ値でもありません)。結果のタイプは通常、値ではなく引数の型によってのみ定義されます。例外は、tupleElement関数(a.N演算子)とtoFixedString関数です。 + +## 定数 + +簡便性のため、特定の関数は一部の引数に対してのみ定数で動作できます。たとえば、LIKE演算子の右側の引数は定数でなければなりません。ほとんどの関数は定数引数に対して定数を返します。例外は乱数を生成する関数です。「now」関数は、異なる時間に実行されたクエリに対して異なる値を返しますが、単一のクエリ内でのみ定数性が重要であるため、その結果は定数と見なされます。定数式も定数と見なされます(たとえば、LIKE演算子の右半分は複数の定数から構築できます)。 + +関数は定数引数と非定数引数に対して異なる方法で実装される場合があります(異なるコードが実行されます)。しかし、定数と同じ値だけを持つ真のカラムの結果は一致する必要があります。 + +## NULL 処理 + +関数には次の動作があります: + +- 少なくとも1つの引数が `NULL` の場合、関数の結果も `NULL` です。 +- 特別な動作が各関数の説明に個別に指定されています。ClickHouseのソースコードでは、これらの関数は `UseDefaultImplementationForNulls=false` でマークされています。 + +## 不変性 + +関数は引数の値を変更することはできません - すべての変更は結果として返されます。したがって、個々の関数を計算した結果は、クエリ内で関数が記述される順序に依存しません。 + +## 高階関数、`->` 演算子と lambda(params, expr) 関数 + +高階関数は、ラムダ関数のみをその機能引数として受け入れることができます。ラムダ関数を高階関数に渡すには、`->` 演算子を使用します。矢印の左側は形式上のパラメータであり、これは任意のID、またはタプル内の任意のIDになります。矢印の右側には、これらの形式上のパラメータ、および任意のテーブルカラムを使用できる式があります。 + +例: + +``` +x -> 2 * x +str -> str != Referer +``` + +複数の引数を受け入れるラムダ関数も高階関数に渡すことができます。この場合、高階関数には同じ長さの複数の配列が渡され、これらの引数が対応します。 + +一部の関数では、最初の引数(ラムダ関数)を省略できます。この場合、同一のマッピングが仮定されます。 + +## ユーザー定義関数(UDFs) + +ClickHouseはユーザー定義関数をサポートしています。[UDFs](../functions/udf.md)をご覧ください。 diff --git a/docs/ja/sql-reference/functions/introspection.md b/docs/ja/sql-reference/functions/introspection.md new file mode 100644 index 00000000000..d7586a93346 --- /dev/null +++ b/docs/ja/sql-reference/functions/introspection.md @@ -0,0 +1,466 @@ +--- +slug: /ja/sql-reference/functions/introspection +sidebar_position: 100 +sidebar_label: インスペクション +--- + +# インスペクション関数 + +この章で説明されている関数を使用して、[ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) および [DWARF](https://en.wikipedia.org/wiki/DWARF) をクエリプロファイリングのためにインスペクトすることができます。 + +:::note +これらの関数は遅く、セキュリティ上の考慮が必要な場合があります。 +::: + +インスペクション関数を正しく操作するには次の要件があります: + +- `clickhouse-common-static-dbg` パッケージをインストールします。 + +- [allow_introspection_functions](../../operations/settings/settings.md#allow_introspection_functions) 設定を1に設定します。 + + セキュリティ上の理由から、インスペクション関数はデフォルトで無効になっています。 + +ClickHouse はプロファイラーレポートを [trace_log](../../operations/system-tables/trace_log.md#system_tables-trace_log) システムテーブルに保存します。このテーブルとプロファイラーが適切に設定されていることを確認してください。 + +## addressToLine + +ClickHouseサーバープロセス内の仮想メモリアドレスを、ClickHouseソースコードのファイル名と行番号に変換します。 + +公式のClickHouseパッケージを使用している場合、`clickhouse-common-static-dbg` パッケージをインストールする必要があります。 + +**構文** + +``` sql +addressToLine(address_of_binary_instruction) +``` + +**引数** + +- `address_of_binary_instruction` ([UInt64](../data-types/int-uint.md)) — 実行中のプロセス内の命令アドレス。 + +**戻り値** + +- ソースコードのファイル名と、このファイル内の行番号をコロンで区切ったもの。 + 例えば、`/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199` のように `199` は行番号です。 +- デバッグ情報が見つからない場合はバイナリ名。 +- アドレスが無効な場合は空文字列。 + +タイプ: [String](../../sql-reference/data-types/string.md)。 + +**例** + +インスペクション関数の有効化: + +``` sql +SET allow_introspection_functions=1; +``` + +`trace_log` システムテーブルから最初の行を選択: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G; +``` + +``` text +Row 1: +────── +event_date: 2019-11-19 +event_time: 2019-11-19 18:57:23 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 421b6855-1858-45a5-8f37-f383409d6d72 +trace: [140658411141617,94784174532828,94784076370703,94784076372094,94784076361020,94784175007680,140658411116251,140658403895439] +``` + +`trace` フィールドにはサンプリング時のスタックトレースが含まれています。 + +単一のアドレスに対してソースコードのファイル名と行番号を取得: + +``` sql +SELECT addressToLine(94784076370703) \G; +``` + +``` text +Row 1: +────── +addressToLine(94784076370703): /build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199 +``` + +スタックトレース全体に関数を適用: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> addressToLine(x), trace), '\n') AS trace_source_code_lines +FROM system.trace_log +LIMIT 1 +\G +``` + +[arrayMap](../../sql-reference/functions/array-functions.md#array-map) 関数を使用すると、`trace` 配列の各要素を `addressToLine` 関数で処理できます。この処理結果は出力の `trace_source_code_lines` 列に表示されます。 + +``` text +Row 1: +────── +trace_source_code_lines: /lib/x86_64-linux-gnu/libpthread-2.27.so +/usr/lib/debug/usr/bin/clickhouse +/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.cpp:199 +/build/obj-x86_64-linux-gnu/../src/Common/ThreadPool.h:155 +/usr/include/c++/9/bits/atomic_base.h:551 +/usr/lib/debug/usr/bin/clickhouse +/lib/x86_64-linux-gnu/libpthread-2.27.so +/build/glibc-OTsEL5/glibc-2.27/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:97 +``` + +## addressToLineWithInlines + +`addressToLine` と似ていますが、すべてのインライン関数を含む配列を返します。そのため、`addressToLine` よりも遅いです。 + +:::note +公式のClickHouseパッケージを使用している場合、`clickhouse-common-static-dbg` パッケージをインストールする必要があります。 +::: + +**構文** + +``` sql +addressToLineWithInlines(address_of_binary_instruction) +``` + +**引数** + +- `address_of_binary_instruction` ([UInt64](../data-types/int-uint.md)) — 実行中のプロセス内の命令アドレス。 + +**戻り値** + +- 最初の要素がソースコードのファイル名とファイル内の行番号をコロンで区切った配列。2番目以降の要素は、インライン関数のソースコードのファイル名、行番号、および関数名のリスト。デバッグ情報が見つからない場合は、バイナリ名と等しい単一要素を持つ配列が返され、アドレスが無効な場合は空の配列が返されます。[Array(String)](../data-types/array.md)。 + +**例** + +インスペクション関数の有効化: + +``` sql +SET allow_introspection_functions=1; +``` + +アドレスに関数を適用: + +```sql +SELECT addressToLineWithInlines(531055181::UInt64); +``` + +``` text +┌─addressToLineWithInlines(CAST('531055181', 'UInt64'))────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ ['./src/Functions/addressToLineWithInlines.cpp:98','./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:176:DB::(anonymous namespace)::FunctionAddressToLineWithInlines::implCached(unsigned long) const'] │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +スタックトレース全体に関数を適用: + +``` sql +SELECT + ta, addressToLineWithInlines(arrayJoin(trace) as ta) +FROM system.trace_log +WHERE + query_id = '5e173544-2020-45de-b645-5deebe2aae54'; +``` + +[arrayJoin](../../sql-reference/functions/array-functions.md#array-functions-join) 関数は配列を行に分割します。 + +``` text +┌────────ta─┬─addressToLineWithInlines(arrayJoin(trace))───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ 365497529 │ ['./build_normal_debug/./contrib/libcxx/include/string_view:252'] │ +│ 365593602 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:191'] │ +│ 365593866 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365592528 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365591003 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:477'] │ +│ 365590479 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:442'] │ +│ 365590600 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:457'] │ +│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │ +│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │ +│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365607098 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365590571 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:451'] │ +│ 365598941 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:0'] │ +│ 365597289 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:807'] │ +│ 365599840 │ ['./build_normal_debug/./src/Common/Dwarf.cpp:1118'] │ +│ 531058145 │ ['./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:152'] │ +│ 531055181 │ ['./src/Functions/addressToLineWithInlines.cpp:98','./build_normal_debug/./src/Functions/addressToLineWithInlines.cpp:176:DB::(anonymous namespace)::FunctionAddressToLineWithInlines::implCached(unsigned long) const'] │ +│ 422333613 │ ['./build_normal_debug/./src/Functions/IFunctionAdaptors.h:21'] │ +│ 586866022 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:216'] │ +│ 586869053 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:264'] │ +│ 586873237 │ ['./build_normal_debug/./src/Functions/IFunction.cpp:334'] │ +│ 597901620 │ ['./build_normal_debug/./src/Interpreters/ExpressionActions.cpp:601'] │ +│ 597898534 │ ['./build_normal_debug/./src/Interpreters/ExpressionActions.cpp:718'] │ +│ 630442912 │ ['./build_normal_debug/./src/Processors/Transforms/ExpressionTransform.cpp:23'] │ +│ 546354050 │ ['./build_normal_debug/./src/Processors/ISimpleTransform.h:38'] │ +│ 626026993 │ ['./build_normal_debug/./src/Processors/ISimpleTransform.cpp:89'] │ +│ 626294022 │ ['./build_normal_debug/./src/Processors/Executors/ExecutionThreadContext.cpp:45'] │ +│ 626293730 │ ['./build_normal_debug/./src/Processors/Executors/ExecutionThreadContext.cpp:63'] │ +│ 626169525 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:213'] │ +│ 626170308 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:178'] │ +│ 626166348 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:329'] │ +│ 626163461 │ ['./build_normal_debug/./src/Processors/Executors/PipelineExecutor.cpp:84'] │ +│ 626323536 │ ['./build_normal_debug/./src/Processors/Executors/PullingAsyncPipelineExecutor.cpp:85'] │ +│ 626323277 │ ['./build_normal_debug/./src/Processors/Executors/PullingAsyncPipelineExecutor.cpp:112'] │ +│ 626323133 │ ['./build_normal_debug/./contrib/libcxx/include/type_traits:3682'] │ +│ 626323041 │ ['./build_normal_debug/./contrib/libcxx/include/tuple:1415'] │ +└───────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +``` + +## addressToSymbol + +ClickHouseサーバープロセス内の仮想メモリアドレスを、ClickHouseオブジェクトファイルからのシンボルに変換します。 + +**構文** + +``` sql +addressToSymbol(address_of_binary_instruction) +``` + +**引数** + +- `address_of_binary_instruction` ([UInt64](../data-types/int-uint.md)) — 実行中のプロセス内の命令アドレス。 + +**戻り値** + +- ClickHouseオブジェクトファイルからのシンボル。[String](../data-types/string.md)。 +- アドレスが無効な場合は空文字列。[String](../data-types/string.md)。 + +**例** + +インスペクション関数の有効化: + +``` sql +SET allow_introspection_functions=1; +``` + +`trace_log` システムテーブルから最初の行を選択: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G; +``` + +``` text +Row 1: +────── +event_date: 2019-11-20 +event_time: 2019-11-20 16:57:59 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 724028bf-f550-45aa-910d-2af6212b94ac +trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583] +``` + +`trace` フィールドにはサンプリング時のスタックトレースが含まれています。 + +単一のアドレスに対してシンボルを取得: + +``` sql +SELECT addressToSymbol(94138803686098) \G; +``` + +``` text +Row 1: +────── +addressToSymbol(94138803686098): _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE +``` + +スタックトレース全体に関数を適用: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> addressToSymbol(x), trace), '\n') AS trace_symbols +FROM system.trace_log +LIMIT 1 +\G +``` + +[arrayMap](../../sql-reference/functions/array-functions.md#array-map) 関数を使用すると、`trace` 配列の各要素を `addressToSymbols` 関数で処理できます。この処理結果は出力の `trace_symbols` 列に表示されます。 + +``` text +Row 1: +────── +trace_symbols: _ZNK2DB24IAggregateFunctionHelperINS_20AggregateFunctionSumImmNS_24AggregateFunctionSumDataImEEEEE19addBatchSinglePlaceEmPcPPKNS_7IColumnEPNS_5ArenaE +_ZNK2DB10Aggregator21executeWithoutKeyImplERPcmPNS0_28AggregateFunctionInstructionEPNS_5ArenaE +_ZN2DB10Aggregator14executeOnBlockESt6vectorIN3COWINS_7IColumnEE13immutable_ptrIS3_EESaIS6_EEmRNS_22AggregatedDataVariantsERS1_IPKS3_SaISC_EERS1_ISE_SaISE_EERb +_ZN2DB10Aggregator14executeOnBlockERKNS_5BlockERNS_22AggregatedDataVariantsERSt6vectorIPKNS_7IColumnESaIS9_EERS6_ISB_SaISB_EERb +_ZN2DB10Aggregator7executeERKSt10shared_ptrINS_17IBlockInputStreamEERNS_22AggregatedDataVariantsE +_ZN2DB27AggregatingBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB26ExpressionBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB26ExpressionBlockInputStream8readImplEv +_ZN2DB17IBlockInputStream4readEv +_ZN2DB28AsynchronousBlockInputStream9calculateEv +_ZNSt17_Function_handlerIFvvEZN2DB28AsynchronousBlockInputStream4nextEvEUlvE_E9_M_invokeERKSt9_Any_data +_ZN14ThreadPoolImplI20ThreadFromGlobalPoolE6workerESt14_List_iteratorIS0_E +_ZZN20ThreadFromGlobalPoolC4IZN14ThreadPoolImplIS_E12scheduleImplIvEET_St8functionIFvvEEiSt8optionalImEEUlvE1_JEEEOS4_DpOT0_ENKUlvE_clEv +_ZN14ThreadPoolImplISt6threadE6workerESt14_List_iteratorIS0_E +execute_native_thread_routine +start_thread +clone +``` + +## demangle + +[addressToSymbol](#addresstosymbol) 関数を使用して取得できるシンボルを C++ 関数名に変換します。 + +**構文** + +``` sql +demangle(symbol) +``` + +**引数** + +- `symbol` ([String](../data-types/string.md)) — オブジェクトファイルからのシンボル。 + +**戻り値** + +- C++ 関数の名前、またはシンボルが無効な場合は空文字列。[String](../data-types/string.md)。 + +**例** + +インスペクション関数の有効化: + +``` sql +SET allow_introspection_functions=1; +``` + +`trace_log` システムテーブルから最初の行を選択: + +``` sql +SELECT * FROM system.trace_log LIMIT 1 \G; +``` + +``` text +Row 1: +────── +event_date: 2019-11-20 +event_time: 2019-11-20 16:57:59 +revision: 54429 +timer_type: Real +thread_number: 48 +query_id: 724028bf-f550-45aa-910d-2af6212b94ac +trace: [94138803686098,94138815010911,94138815096522,94138815101224,94138815102091,94138814222988,94138806823642,94138814457211,94138806823642,94138814457211,94138806823642,94138806795179,94138806796144,94138753770094,94138753771646,94138753760572,94138852407232,140399185266395,140399178045583] +``` + +`trace` フィールドにはサンプリング時のスタックトレースが含まれています。 + +単一のアドレスに対して関数名を取得: + +``` sql +SELECT demangle(addressToSymbol(94138803686098)) \G; +``` + +``` text +Row 1: +────── +demangle(addressToSymbol(94138803686098)): DB::IAggregateFunctionHelper > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const +``` + +スタックトレース全体に関数を適用: + +``` sql +SELECT + arrayStringConcat(arrayMap(x -> demangle(addressToSymbol(x)), trace), '\n') AS trace_functions +FROM system.trace_log +LIMIT 1 +\G +``` + +[arrayMap](../../sql-reference/functions/array-functions.md#array-map) 関数を使用すると、`trace` 配列の各要素を `demangle` 関数で処理できます。この処理結果は出力の `trace_functions` 列に表示されます。 + +``` text +Row 1: +────── +trace_functions: DB::IAggregateFunctionHelper > >::addBatchSinglePlace(unsigned long, char*, DB::IColumn const**, DB::Arena*) const +DB::Aggregator::executeWithoutKeyImpl(char*&, unsigned long, DB::Aggregator::AggregateFunctionInstruction*, DB::Arena*) const +DB::Aggregator::executeOnBlock(std::vector::immutable_ptr, std::allocator::immutable_ptr > >, unsigned long, DB::AggregatedDataVariants&, std::vector >&, std::vector >, std::allocator > > >&, bool&) +DB::Aggregator::executeOnBlock(DB::Block const&, DB::AggregatedDataVariants&, std::vector >&, std::vector >, std::allocator > > >&, bool&) +DB::Aggregator::execute(std::shared_ptr const&, DB::AggregatedDataVariants&) +DB::AggregatingBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::ExpressionBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::ExpressionBlockInputStream::readImpl() +DB::IBlockInputStream::read() +DB::AsynchronousBlockInputStream::calculate() +std::_Function_handler::_M_invoke(std::_Any_data const&) +ThreadPoolImpl::worker(std::_List_iterator) +ThreadFromGlobalPool::ThreadFromGlobalPool::scheduleImpl(std::function, int, std::optional)::{lambda()#3}>(ThreadPoolImpl::scheduleImpl(std::function, int, std::optional)::{lambda()#3}&&)::{lambda()#1}::operator()() const +ThreadPoolImpl::worker(std::_List_iterator) +execute_native_thread_routine +start_thread +clone +``` + +## tid + +現在の [Block](https://clickhouse.com/docs/ja/development/architecture/#block) が処理されているスレッドのIDを返します。 + +**構文** + +``` sql +tid() +``` + +**戻り値** + +- 現在のスレッドID。[Uint64](../data-types/int-uint.md#uint-ranges)。 + +**例** + +クエリ: + +``` sql +SELECT tid(); +``` + +結果: + +``` text +┌─tid()─┐ +│ 3878 │ +└───────┘ +``` + +## logTrace + +各 [Block](https://clickhouse.com/docs/ja/development/architecture/#block) に対してサーバーログにトレースログメッセージを記録します。 + +**構文** + +``` sql +logTrace('message') +``` + +**引数** + +- `message` — サーバーログに記録されるメッセージ。[String](../data-types/string.md#string)。 + +**戻り値** + +- 常に0を返します。 + +**例** + +クエリ: + +``` sql +SELECT logTrace('logTrace message'); +``` + +結果: + +``` text +┌─logTrace('logTrace message')─┐ +│ 0 │ +└──────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/ip-address-functions.md b/docs/ja/sql-reference/functions/ip-address-functions.md new file mode 100644 index 00000000000..a181db6c71f --- /dev/null +++ b/docs/ja/sql-reference/functions/ip-address-functions.md @@ -0,0 +1,719 @@ +--- +slug: /ja/sql-reference/functions/ip-address-functions +sidebar_position: 95 +sidebar_label: IPアドレス +--- + +# IPv4 および IPv6 アドレスを扱うための関数 + +## IPv4NumToString(num) + +UInt32 数値を受け取り、ビッグエンディアン形式の IPv4 アドレスとして解釈します。対応する IPv4 アドレスを A.B.C.d(ドットで区切られた 10 進数形式)の文字列で返します。 + +エイリアス: `INET_NTOA`. + +## IPv4StringToNum(s) + +IPv4NumToString の逆関数です。IPv4 アドレスが無効な形式の場合、例外をスローします。 + +エイリアス: `INET_ATON`. + +## IPv4StringToNumOrDefault(s) + +`IPv4StringToNum` と同様ですが、IPv4 アドレスが無効な形式の場合、0 を返します。 + +## IPv4StringToNumOrNull(s) + +`IPv4StringToNum` と同様ですが、IPv4 アドレスが無効な形式の場合、null を返します。 + +## IPv4NumToStringClassC(num) + +IPv4NumToString と似ていますが、最後のオクテットを xxx に置き換えます。 + +例: + +``` sql +SELECT + IPv4NumToStringClassC(ClientIP) AS k, + count() AS c +FROM test.hits +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─k──────────────┬─────c─┐ +│ 83.149.9.xxx │ 26238 │ +│ 217.118.81.xxx │ 26074 │ +│ 213.87.129.xxx │ 25481 │ +│ 83.149.8.xxx │ 24984 │ +│ 217.118.83.xxx │ 22797 │ +│ 78.25.120.xxx │ 22354 │ +│ 213.87.131.xxx │ 21285 │ +│ 78.25.121.xxx │ 20887 │ +│ 188.162.65.xxx │ 19694 │ +│ 83.149.48.xxx │ 17406 │ +└────────────────┴───────┘ +``` + +'xxx' の使用は非常に珍しいため、将来的に変更される可能性があります。この形式に依存しないことをお勧めします。 + +### IPv6NumToString(x) + +バイナリ形式の IPv6 アドレスを含む FixedString(16) 値を受け取ります。このアドレスをテキスト形式で返します。IPv4 アドレスが IPv6 にマップされている場合は、::ffff:111.222.33.44 の形式で出力されます。 + +エイリアス: `INET6_NTOA`. + +例: + +``` sql +SELECT IPv6NumToString(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)) AS addr; +``` + +``` text +┌─addr─────────┐ +│ 2a02:6b8::11 │ +└──────────────┘ +``` + +``` sql +SELECT + IPv6NumToString(ClientIP6 AS k), + count() AS c +FROM hits_all +WHERE EventDate = today() AND substring(ClientIP6, 1, 12) != unhex('00000000000000000000FFFF') +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─IPv6NumToString(ClientIP6)──────────────┬─────c─┐ +│ 2a02:2168:aaa:bbbb::2 │ 24695 │ +│ 2a02:2698:abcd:abcd:abcd:abcd:8888:5555 │ 22408 │ +│ 2a02:6b8:0:fff::ff │ 16389 │ +│ 2a01:4f8:111:6666::2 │ 16016 │ +│ 2a02:2168:888:222::1 │ 15896 │ +│ 2a01:7e00::ffff:ffff:ffff:222 │ 14774 │ +│ 2a02:8109:eee:ee:eeee:eeee:eeee:eeee │ 14443 │ +│ 2a02:810b:8888:888:8888:8888:8888:8888 │ 14345 │ +│ 2a02:6b8:0:444:4444:4444:4444:4444 │ 14279 │ +│ 2a01:7e00::ffff:ffff:ffff:ffff │ 13880 │ +└─────────────────────────────────────────┴───────┘ +``` + +``` sql +SELECT + IPv6NumToString(ClientIP6 AS k), + count() AS c +FROM hits_all +WHERE EventDate = today() +GROUP BY k +ORDER BY c DESC +LIMIT 10 +``` + +``` text +┌─IPv6NumToString(ClientIP6)─┬──────c─┐ +│ ::ffff:94.26.111.111 │ 747440 │ +│ ::ffff:37.143.222.4 │ 529483 │ +│ ::ffff:5.166.111.99 │ 317707 │ +│ ::ffff:46.38.11.77 │ 263086 │ +│ ::ffff:79.105.111.111 │ 186611 │ +│ ::ffff:93.92.111.88 │ 176773 │ +│ ::ffff:84.53.111.33 │ 158709 │ +│ ::ffff:217.118.11.22 │ 154004 │ +│ ::ffff:217.118.11.33 │ 148449 │ +│ ::ffff:217.118.11.44 │ 148243 │ +└────────────────────────────┴────────┘ +``` + +## IPv6StringToNum + +[IPv6NumToString](#ipv6numtostringx)の逆関数です。IPv6 アドレスが無効な形式の場合、例外をスローします。 + +入力文字列に有効な IPv4 アドレスが含まれている場合、その IPv6 等価を返します。 +HEX は大文字でも小文字でもかまいません。 + +エイリアス: `INET6_ATON`. + +**構文** + +``` sql +IPv6StringToNum(string) +``` + +**引数** + +- `string` — IP アドレス。 [String](../data-types/string.md)。 + +**返される値** + +- バイナリ形式の IPv6 アドレス。[FixedString(16)](../data-types/fixedstring.md)。 + +**例** + +クエリ: + +``` sql +SELECT addr, cutIPv6(IPv6StringToNum(addr), 0, 0) FROM (SELECT ['notaddress', '127.0.0.1', '1111::ffff'] AS addr) ARRAY JOIN addr; +``` + +結果: + +``` text +┌─addr───────┬─cutIPv6(IPv6StringToNum(addr), 0, 0)─┐ +│ notaddress │ :: │ +│ 127.0.0.1 │ ::ffff:127.0.0.1 │ +│ 1111::ffff │ 1111::ffff │ +└────────────┴──────────────────────────────────────┘ +``` + +**関連項目** + +- [cutIPv6](#cutipv6x-bytestocutforipv6-bytestocutforipv4). + +## IPv6StringToNumOrDefault(s) + +`IPv6StringToNum` と同様ですが、IPv6 アドレスが無効な形式の場合、0 を返します。 + +## IPv6StringToNumOrNull(s) + +`IPv6StringToNum` と同様ですが、IPv6 アドレスが無効な形式の場合、null を返します。 + +## IPv4ToIPv6(x) + +`UInt32` 数値を受け取り、ビッグエンディアン形式の IPv4 アドレスとして解釈します。バイナリ形式で IPv6 アドレスを含む `FixedString(16)` 値を返します。例: + +``` sql +SELECT IPv6NumToString(IPv4ToIPv6(IPv4StringToNum('192.168.0.1'))) AS addr; +``` + +``` text +┌─addr───────────────┐ +│ ::ffff:192.168.0.1 │ +└────────────────────┘ +``` + +## cutIPv6(x, bytesToCutForIPv6, bytesToCutForIPv4) + +バイナリ形式の IPv6 アドレスを含む FixedString(16) 値を受け取ります。指定されたバイト数分削除したアドレスをテキスト形式で返します。例: + +``` sql +WITH + IPv6StringToNum('2001:0DB8:AC10:FE01:FEED:BABE:CAFE:F00D') AS ipv6, + IPv4ToIPv6(IPv4StringToNum('192.168.0.1')) AS ipv4 +SELECT + cutIPv6(ipv6, 2, 0), + cutIPv6(ipv4, 0, 2) +``` + +``` text +┌─cutIPv6(ipv6, 2, 0)─────────────────┬─cutIPv6(ipv4, 0, 2)─┐ +│ 2001:db8:ac10:fe01:feed:babe:cafe:0 │ ::ffff:192.168.0.0 │ +└─────────────────────────────────────┴─────────────────────┘ +``` + +## IPv4CIDRToRange(ipv4, Cidr), + +IPv4 と CIDR を含む UInt8 値を受け取ります。サブネットの下限と上限の範囲を含む 2 つの IPv4 を持つタプルを返します。 + +``` sql +SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 16); +``` + +``` text +┌─IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)─┐ +│ ('192.168.0.0','192.168.255.255') │ +└────────────────────────────────────────────┘ +``` + +## IPv6CIDRToRange(ipv6, Cidr), + +IPv6 と CIDR を含む UInt8 値を受け取ります。サブネットの下限と上限の範囲を含む 2 つの IPv6 を持つタプルを返します。 + +``` sql +SELECT IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32); +``` + +``` text +┌─IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32)─┐ +│ ('2001:db8::','2001:db8:ffff:ffff:ffff:ffff:ffff:ffff') │ +└────────────────────────────────────────────────────────────────────────┘ +``` + +## toIPv4 + +[`IPv4StringToNum`](##IPv4NumToString(num)) と似ていますが、IPv4 アドレスの文字列形式を受け取り、[IPv4](../data-types/ipv4.md) 型の値を返します。 + +**構文** + +```sql +toIPv4(string) +``` + +**引数** + +- `string` — IPv4 アドレス。[String](../data-types/string.md)。 + +**返される値** + +- `string` が IPv4 アドレスに変換されます。[IPv4](../data-types/ipv4.md)。 + +**例** + +クエリ: + +``` sql +SELECT toIPv4('171.225.130.45'); +``` + +結果: + +``` text +┌─toIPv4('171.225.130.45')─┐ +│ 171.225.130.45 │ +└──────────────────────────┘ +``` + +クエリ: + +``` sql +WITH + '171.225.130.45' as IPv4_string +SELECT + hex(IPv4StringToNum(IPv4_string)), + hex(toIPv4(IPv4_string)) +``` + +結果: + +``` text +┌─hex(IPv4StringToNum(IPv4_string))─┬─hex(toIPv4(IPv4_string))─┐ +│ ABE1822D │ ABE1822D │ +└───────────────────────────────────┴──────────────────────────┘ +``` + +## toIPv4OrDefault + +`toIPv4` と同様ですが、IPv4 アドレスが無効な形式の場合、`0.0.0.0` (0 IPv4) または指定されたデフォルト IPv4 を返します。 + +**構文** + +```sql +toIPv4OrDefault(string[, default]) +``` + +**引数** + +- `value` — IP アドレス。[String](../data-types/string.md)。 +- `default` (オプション) — `string` が無効な形式の場合に返す値。[IPv4](../data-types/ipv4.md)。 + +**返される値** + +- `string` が現在の IPv4 アドレスに変換されます。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +WITH + '::ffff:127.0.0.1' AS valid_IPv6_string, + 'fe80:2030:31:24' AS invalid_IPv6_string +SELECT + toIPv4OrDefault(valid_IPv6_string) AS valid, + toIPv4OrDefault(invalid_IPv6_string) AS default, + toIPv4OrDefault(invalid_IPv6_string, toIPv4('1.1.1.1')) AS provided_default; +``` + +結果: + +```response +┌─valid───┬─default─┬─provided_default─┐ +│ 0.0.0.0 │ 0.0.0.0 │ 1.1.1.1 │ +└─────────┴─────────┴──────────────────┘ +``` + +## toIPv4OrNull + +[`toIPv4`](#toipv4) と同様ですが、IPv4 アドレスが無効な形式の場合、null を返します。 + +**構文** + +```sql +toIPv4OrNull(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- `string` が現在の IPv4 アドレスに変換されるか、`string` が無効なアドレスの場合は null。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +WITH 'fe80:2030:31:24' AS invalid_IPv6_string +SELECT toIPv4OrNull(invalid_IPv6_string); +``` + +結果: + +``` text +┌─toIPv4OrNull(invalid_IPv6_string)─┐ +│ ᴺᵁᴸᴸ │ +└───────────────────────────────────┘ +``` + +## toIPv4OrZero + +[`toIPv4`](#toipv4) と同様ですが、IPv4 アドレスが無効な形式の場合、`0.0.0.0` を返します。 + +**構文** + +```sql +toIPv4OrZero(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- `string` が現在の IPv4 アドレスに変換されるか、`string` が無効なアドレスの場合は `0.0.0.0`。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +WITH 'Not an IP address' AS invalid_IPv6_string +SELECT toIPv4OrZero(invalid_IPv6_string); +``` + +結果: + +``` text +┌─toIPv4OrZero(invalid_IPv6_string)─┐ +│ 0.0.0.0 │ +└───────────────────────────────────┘ +``` + +## toIPv6 + +IPv6 アドレスの文字列形式を [IPv6](../data-types/ipv6.md) 型に変換します。IPv6 アドレスが無効な形式の場合、空の値を返します。 +IPv6 アドレスをバイナリ形式に変換する [IPv6StringToNum](#ipv6stringtonum) 関数と似ています。 + +入力文字列に有効な IPv4 アドレスが含まれている場合、その IPv4 アドレスの IPv6 等価が返されます。 + +**構文** + +```sql +toIPv6(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- IP アドレス。[IPv6](../data-types/ipv6.md)。 + +**例** + +クエリ: + +``` sql +WITH '2001:438:ffff::407d:1bc1' AS IPv6_string +SELECT + hex(IPv6StringToNum(IPv6_string)), + hex(toIPv6(IPv6_string)); +``` + +結果: + +``` text +┌─hex(IPv6StringToNum(IPv6_string))─┬─hex(toIPv6(IPv6_string))─────────┐ +│ 20010438FFFF000000000000407D1BC1 │ 20010438FFFF000000000000407D1BC1 │ +└───────────────────────────────────┴──────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT toIPv6('127.0.0.1'); +``` + +結果: + +``` text +┌─toIPv6('127.0.0.1')─┐ +│ ::ffff:127.0.0.1 │ +└─────────────────────┘ +``` + +## toIPv6OrDefault + +[`toIPv6`](#toipv6) と同様ですが、IPv6 アドレスが無効な形式の場合、`::` (0 IPv6) または指定された IPv6 デフォルトを返します。 + +**構文** + +```sql +toIPv6OrDefault(string[, default]) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 +- `default` (オプション) — `string` が無効な形式の場合に返す値。[IPv6](../data-types/ipv6.md)。 + +**返される値** + +- IPv6 アドレス [IPv6](../data-types/ipv6.md)、そうでない場合は `::` またはオプションで指定されたデフォルトが `string` が無効な形式の場合に返されます。 + +**例** + +クエリ: + +``` sql +WITH + '127.0.0.1' AS valid_IPv4_string, + '127.0.0.1.6' AS invalid_IPv4_string +SELECT + toIPv6OrDefault(valid_IPv4_string) AS valid, + toIPv6OrDefault(invalid_IPv4_string) AS default, + toIPv6OrDefault(invalid_IPv4_string, toIPv6('1.1.1.1')) AS provided_default +``` + +結果: + +``` text +┌─valid────────────┬─default─┬─provided_default─┐ +│ ::ffff:127.0.0.1 │ :: │ ::ffff:1.1.1.1 │ +└──────────────────┴─────────┴──────────────────┘ +``` + +## toIPv6OrNull + +[`toIPv6`](#toipv6) と同様ですが、IPv6 アドレスが無効な形式の場合、null を返します。 + +**構文** + +```sql +toIPv6OrNull(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- IP アドレス。[IPv6](../data-types/ipv6.md)、または `string` が有効な形式でない場合は null。 + +**例** + +クエリ: + +``` sql +WITH '127.0.0.1.6' AS invalid_IPv4_string +SELECT toIPv6OrNull(invalid_IPv4_string); +``` + +結果: + +``` text +┌─toIPv6OrNull(invalid_IPv4_string)─┐ +│ ᴺᵁᴸᴸ │ +└───────────────────────────────────┘ +``` + +## toIPv6OrZero + +[`toIPv6`](#toipv6) と同様ですが、IPv6 アドレスが無効な形式の場合、`::` を返します。 + +**構文** + +```sql +toIPv6OrZero(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- IP アドレス。[IPv6](../data-types/ipv6.md)、または `string` が有効な形式でない場合は `::`。 + +**例** + +クエリ: + +``` sql +WITH '127.0.0.1.6' AS invalid_IPv4_string +SELECT toIPv6OrZero(invalid_IPv4_string); +``` + +結果: + +``` text +┌─toIPv6OrZero(invalid_IPv4_string)─┐ +│ :: │ +└───────────────────────────────────┘ +``` + +## IPv6StringToNumOrDefault(s) + +`toIPv6` と同様ですが、IPv6 アドレスが無効な形式の場合、0 を返します。 + +## IPv6StringToNumOrNull(s) + +`toIPv6` と同様ですが、IPv6 アドレスが無効な形式の場合、null を返します。 + +## isIPv4String + +入力文字列が IPv4 アドレスかどうかを判定します。`string` が IPv6 アドレスの場合、`0` を返します。 + +**構文** + +```sql +isIPv4String(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- `string` が IPv4 アドレスの場合は `1`、それ以外の場合は `0`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT addr, isIPv4String(addr) FROM ( SELECT ['0.0.0.0', '127.0.0.1', '::ffff:127.0.0.1'] AS addr ) ARRAY JOIN addr; +``` + +結果: + +``` text +┌─addr─────────────┬─isIPv4String(addr)─┐ +│ 0.0.0.0 │ 1 │ +│ 127.0.0.1 │ 1 │ +│ ::ffff:127.0.0.1 │ 0 │ +└──────────────────┴────────────────────┘ +``` + +## isIPv6String + +入力文字列が IPv6 アドレスかどうかを判定します。`string` が IPv4 アドレスの場合、`0` を返します。 + +**構文** + +```sql +isIPv6String(string) +``` + +**引数** + +- `string` — IP アドレス。[String](../data-types/string.md)。 + +**返される値** + +- `string` が IPv6 アドレスの場合は `1`、それ以外の場合は `0`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT addr, isIPv6String(addr) FROM ( SELECT ['::', '1111::ffff', '::ffff:127.0.0.1', '127.0.0.1'] AS addr ) ARRAY JOIN addr; +``` + +結果: + +``` text +┌─addr─────────────┬─isIPv6String(addr)─┐ +│ :: │ 1 │ +│ 1111::ffff │ 1 │ +│ ::ffff:127.0.0.1 │ 1 │ +│ 127.0.0.1 │ 0 │ +└──────────────────┴────────────────────┘ +``` + +## isIPAddressInRange + +IP アドレスが [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) 表記で表されるネットワークに含まれているかどうかを判定します。含まれている場合は `1` を返し、それ以外の場合は `0` を返します。 + +**構文** + +``` sql +isIPAddressInRange(address, prefix) +``` + +この関数は文字列として表される IPv4 および IPv6 アドレス(およびネットワーク)の両方を受け入れます。アドレスと CIDR の IP バージョンが一致しない場合、`0` を返します。 + +**引数** + +- `address` — IPv4 または IPv6 アドレス。[String](../data-types/string.md)。 +- `prefix` — CIDR 形式の IPv4 または IPv6 ネットワーク プリフィックス。[String](../data-types/string.md)。 + +**返される値** + +- `1` または `0`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT isIPAddressInRange('127.0.0.1', '127.0.0.0/8'); +``` + +結果: + +``` text +┌─isIPAddressInRange('127.0.0.1', '127.0.0.0/8')─┐ +│ 1 │ +└────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT isIPAddressInRange('127.0.0.1', 'ffff::/16'); +``` + +結果: + +``` text +┌─isIPAddressInRange('127.0.0.1', 'ffff::/16')─┐ +│ 0 │ +└──────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT isIPAddressInRange('::ffff:192.168.0.1', '::ffff:192.168.0.4/128'); +``` + +結果: + +``` text +┌─isIPAddressInRange('::ffff:192.168.0.1', '::ffff:192.168.0.4/128')─┐ +│ 0 │ +└────────────────────────────────────────────────────────────────────┘ +``` + diff --git a/docs/ja/sql-reference/functions/json-functions.md b/docs/ja/sql-reference/functions/json-functions.md new file mode 100644 index 00000000000..a0c55300feb --- /dev/null +++ b/docs/ja/sql-reference/functions/json-functions.md @@ -0,0 +1,1361 @@ +--- +slug: /ja/sql-reference/functions/json-functions +sidebar_position: 105 +sidebar_label: JSON +--- + +JSONを解析するための関数は2つのセットがあります: + - 限定されているサブセットのJSONを極めて高速に解析するための[`simpleJSON*` (`visitParam*`)](#simplejson-visitparam-functions)。 + - 通常のJSONを解析するための[`JSONExtract*`](#jsonextract-functions)。 + +## simpleJSON (visitParam) 関数 + +ClickHouseには、簡易化されたJSONを操作するための特別な関数があります。これらのJSON関数は、JSONがどのようなものであるかについて強力な仮定に基づいています。可能な限り少ない労力で、できるだけ早く作業を完了することを目指しています。 + +次の仮定がされています: + +1. フィールド名(関数の引数)は定数でなければなりません。 +2. フィールド名は、JSONで標準的にエンコードされている必要があります。例えば、`simpleJSONHas('{"abc":"def"}', 'abc') = 1` ですが、`simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0` +3. フィールドは、どのネストレベルでも無差別に検索されます。複数の一致するフィールドがある場合、最初の出現が使用されます。 +4. JSONは文字列リテラル外にスペース文字を持ちません。 + +### simpleJSONHas + +`field_name`という名前のフィールドがあるかどうかをチェックします。結果は`UInt8`です。 + +**構文** + +```sql +simpleJSONHas(json, field_name) +``` + +別名: `visitParamHas`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドが存在する場合は`1`を返し、存在しない場合は`0`を返します。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"true","qux":1}'); + +SELECT simpleJSONHas(json, 'foo') FROM jsons; +SELECT simpleJSONHas(json, 'bar') FROM jsons; +``` + +結果: + +```response +1 +0 +``` +### simpleJSONExtractUInt + +`field_name`という名前のフィールドの値から`UInt64`を解析します。文字列フィールドの場合、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、`0`を返します。 + +**構文** + +```sql +simpleJSONExtractUInt(json, field_name) +``` + +別名: `visitParamExtractUInt`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は`0`を返します。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"4e3"}'); +INSERT INTO jsons VALUES ('{"foo":3.4}'); +INSERT INTO jsons VALUES ('{"foo":5}'); +INSERT INTO jsons VALUES ('{"foo":"not1number"}'); +INSERT INTO jsons VALUES ('{"baz":2}'); + +SELECT simpleJSONExtractUInt(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response +0 +4 +0 +3 +5 +``` + +### simpleJSONExtractInt + +`field_name`という名前のフィールドの値から`Int64`を解析します。文字列フィールドの場合は、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、`0`を返します。 + +**構文** + +```sql +simpleJSONExtractInt(json, field_name) +``` + +別名: `visitParamExtractInt`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は`0`を返します。[Int64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"-4e3"}'); +INSERT INTO jsons VALUES ('{"foo":-3.4}'); +INSERT INTO jsons VALUES ('{"foo":5}'); +INSERT INTO jsons VALUES ('{"foo":"not1number"}'); +INSERT INTO jsons VALUES ('{"baz":2}'); + +SELECT simpleJSONExtractInt(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response +0 +-4 +0 +-3 +5 +``` + +### simpleJSONExtractFloat + +`field_name`という名前のフィールドの値から`Float64`を解析します。文字列フィールドの場合は、文字列の先頭から数値を解析しようとします。フィールドが存在しない場合、または数値を含まない場合、`0`を返します。 + +**構文** + +```sql +simpleJSONExtractFloat(json, field_name) +``` + +別名: `visitParamExtractFloat`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドが存在し、数値を含む場合はフィールドから解析された数を返し、それ以外の場合は`0`を返します。[Float64](../data-types/float.md/#float32-float64)。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"-4e3"}'); +INSERT INTO jsons VALUES ('{"foo":-3.4}'); +INSERT INTO jsons VALUES ('{"foo":5}'); +INSERT INTO jsons VALUES ('{"foo":"not1number"}'); +INSERT INTO jsons VALUES ('{"baz":2}'); + +SELECT simpleJSONExtractFloat(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response +0 +-4000 +0 +-3.4 +5 +``` + +### simpleJSONExtractBool + +`field_name`という名前のフィールドの値から真偽値を解析します。結果は`UInt8`です。 + +**構文** + +```sql +simpleJSONExtractBool(json, field_name) +``` + +別名: `visitParamExtractBool`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +フィールドの値が`true`の場合は`1`を、それ以外は`0`を返します。したがって、次の場合を含め(これらに限定されない)この関数は`0`を返します: + - フィールドが存在しない場合。 + - フィールドが文字列として`true`を含む場合、例: `{"field":"true"}`。 + - フィールドが数値値として`1`を含む場合。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":false,"bar":true}'); +INSERT INTO jsons VALUES ('{"foo":"true","qux":1}'); + +SELECT simpleJSONExtractBool(json, 'bar') FROM jsons ORDER BY json; +SELECT simpleJSONExtractBool(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response +0 +1 +0 +0 +``` + +### simpleJSONExtractRaw + +`field_name`という名前のフィールドの値をセパレータを含む`String`として返します。 + +**構文** + +```sql +simpleJSONExtractRaw(json, field_name) +``` + +別名: `visitParamExtractRaw`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドが存在する場合は値をセパレータを含む文字列として返し、存在しない場合は空の文字列を返します。[`String`](../data-types/string.md#string) + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"-4e3"}'); +INSERT INTO jsons VALUES ('{"foo":-3.4}'); +INSERT INTO jsons VALUES ('{"foo":5}'); +INSERT INTO jsons VALUES ('{"foo":{"def":[1,2,3]}}'); +INSERT INTO jsons VALUES ('{"baz":2}'); + +SELECT simpleJSONExtractRaw(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response + +"-4e3" +-3.4 +5 +{"def":[1,2,3]} +``` + +### simpleJSONExtractString + +ダブルクォート付きの`String`を`field_name`という名前のフィールドの値から解析します。 + +**構文** + +```sql +simpleJSONExtractString(json, field_name) +``` + +別名: `visitParamExtractString`. + +**パラメータ** + +- `json` — フィールドが検索されるJSON。[String](../data-types/string.md#string) +- `field_name` — 検索されるフィールドの名前。[String literal](../syntax#string) + +**返される値** + +- フィールドの値をセパレータを含めて文字列として返します。フィールドがダブルクォート付き文字列を含まない場合、エスケープに失敗した場合、またはフィールドが存在しない場合は空の文字列を返します。[String](../data-types/string.md)。 + +**実装の詳細** + +現在、基本多言語面に含まれない形式の`\\uXXXX\\uYYYY`に対応するコードポイントのサポートはありません(CESU-8に変換されますが、UTF-8には変換されません)。 + +**例** + +クエリ: + +```sql +CREATE TABLE jsons +( + `json` String +) +ENGINE = Memory; + +INSERT INTO jsons VALUES ('{"foo":"\\n\\u0000"}'); +INSERT INTO jsons VALUES ('{"foo":"\\u263"}'); +INSERT INTO jsons VALUES ('{"foo":"\\u263a"}'); +INSERT INTO jsons VALUES ('{"foo":"hello}'); + +SELECT simpleJSONExtractString(json, 'foo') FROM jsons ORDER BY json; +``` + +結果: + +```response +\n\0 + +☺ + +``` + +## JSONExtract 関数 + +次の関数は[simdjson](https://github.com/lemire/simdjson)に基づいており、より複雑なJSONの解析要件に対応しています。 + +### isValidJSON + +渡された文字列が有効なJSONかどうかをチェックします。 + +**構文** + +```sql +isValidJSON(json) +``` + +**例** + +``` sql +SELECT isValidJSON('{"a": "hello", "b": [-100, 200.0, 300]}') = 1 +SELECT isValidJSON('not a json') = 0 +``` + +### JSONHas + +JSONドキュメントに値が存在する場合は`1`を返します。値が存在しない場合は`0`を返します。 + +**構文** + +```sql +JSONHas(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- `json`に値が存在する場合は`1`、それ以外の場合は`0`を返します。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1 +SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0 +``` + +要素の最小インデックスは1です。そのため、要素0は存在しません。整数を使ってJSON配列およびJSONオブジェクトにアクセスできます。例えば: + +``` sql +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b' +SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a' +SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello' +``` + +### JSONLength + +JSON配列またはJSONオブジェクトの長さを返します。値が存在しない、または間違った型の場合、`0`を返します。 + +**構文** + +```sql +JSONLength(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- JSON配列またはJSONオブジェクトの長さを返します。値が存在しない、または不正な型の場合、`0`を返します。[UInt64](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3 +SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2 +``` + +### JSONType + +JSON値の型を返します。値が存在しない場合、`Null`が返されます。 + +**構文** + +```sql +JSONType(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- JSON値の型を文字列として返します。値が存在しない場合は`Null`を返します。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object' +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String' +SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array' +``` + +### JSONExtractUInt + +JSONを解析してUInt型の値を抽出します。 + +**構文** + +```sql +JSONExtractUInt(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- UInt値が存在する場合はそれを返し、存在しない場合は`Null`を返します。[UInt64](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) as x, toTypeName(x); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┐ +│ 300 │ UInt64 │ +└─────┴───────────────┘ +``` + +### JSONExtractInt + +JSONを解析してInt型の値を抽出します。 + +**構文** + +```sql +JSONExtractInt(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- Int値が存在する場合はそれを返し、存在しない場合は`Null`を返します。[Int64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) as x, toTypeName(x); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┐ +│ 300 │ Int64 │ +└─────┴───────────────┘ +``` + +### JSONExtractFloat + +JSONを解析してInt型の値を抽出します。 + +**構文** + +```sql +JSONExtractFloat(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- Float値が存在する場合はそれを返し、存在しない場合は`Null`を返します。[Float64](../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) as x, toTypeName(x); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┐ +│ 200 │ Float64 │ +└─────┴───────────────┘ +``` + +### JSONExtractBool + +JSONを解析してブール値を抽出します。値が存在しないか間違った型の場合、`0`が返されます。 + +**構文** + +```sql +JSONExtractBool(json\[, indices_or_keys\]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- ブール値が存在する場合はそれを返し、存在しない場合は`0`を返します。[Bool](../data-types/boolean.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSONExtractBool('{"passed": true}', 'passed'); +``` + +結果: + +```response +┌─JSONExtractBool('{"passed": true}', 'passed')─┐ +│ 1 │ +└───────────────────────────────────────────────┘ +``` + +### JSONExtractString + +JSONを解析して文字列を抽出します。この関数は[`visitParamExtractString`](#simplejsonextractstring)関数と似ています。値が存在しないか間違った型の場合、空の文字列が返されます。 + +**構文** + +```sql +JSONExtractString(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md). + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- `json`からエスケープ解除された文字列を返します。エスケープ解除に失敗した場合、値が存在しないか間違った型の場合は空の文字列を返します。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello' +SELECT JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0' +SELECT JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺' +SELECT JSONExtractString('{"abc":"\\u263"}', 'abc') = '' +SELECT JSONExtractString('{"abc":"hello}', 'abc') = '' +``` + +### JSONExtract + +解析されたJSONから指定したClickHouseのデータ型の値を抽出します。この関数は以前の`JSONExtract`関数の一般化バージョンです。つまり: + +`JSONExtract(..., 'String')` は `JSONExtractString()`と全く同じものを返します。 +`JSONExtract(..., 'Float64')` は `JSONExtractFloat()`と全く同じものを返します。 + +**構文** + +```sql +JSONExtract(json [, indices_or_keys...], return_type) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md). +- `return_type` — 抽出する値の型を指定する文字列。[String](../data-types/string.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- 指定された返却型の値が存在すればそれを返し、存在しない場合は指定された返却型に応じて`0`、`Null`、または空の文字列を返します。 [UInt64](../data-types/int-uint.md), [Int64](../data-types/int-uint.md), [Float64](../data-types/float.md), [Bool](../data-types/boolean.md)または[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') = ('hello',[-100,200,300]) +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(b Array(Float64), a String)') = ([-100,200,300],'hello') +SELECT JSONExtract('{"a": "hello", "b": "world"}', 'Map(String, String)') = map('a', 'hello', 'b', 'world'); +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 'Array(Nullable(Int8))') = [-100, NULL, NULL] +SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4, 'Nullable(Int64)') = NULL +SELECT JSONExtract('{"passed": true}', 'passed', 'UInt8') = 1 +SELECT JSONExtract('{"day": "Thursday"}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Thursday' +SELECT JSONExtract('{"day": 5}', 'day', 'Enum8(\'Sunday\' = 0, \'Monday\' = 1, \'Tuesday\' = 2, \'Wednesday\' = 3, \'Thursday\' = 4, \'Friday\' = 5, \'Saturday\' = 6)') = 'Friday' +``` + +### JSONExtractKeysAndValues + +与えられたClickHouseデータ型の値を持つキー-値ペアをJSONから解析します。 + +**構文** + +```sql +JSONExtractKeysAndValues(json [, indices_or_keys...], value_type) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md). +- `value_type` — 抽出する値の型を指定する文字列。[String](../data-types/string.md)。 + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- 解析されたキー-値ペアの配列を返します。[Array](../data-types/array.md)([Tuple](../data-types/tuple.md)(`value_type`))。 + +**例** + +``` sql +SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)]; +``` + +### JSONExtractKeys + +JSON文字列を解析してキーを抽出します。 + +**構文** + +``` sql +JSONExtractKeys(json[, a, b, c...]) +``` + +**パラメータ** + +- `json` — 有効なJSONを含む[String](../data-types/string.md)。 +- `a, b, c...` — ネストされたJSONオブジェクト内で内側のフィールドへのパスを指定するカンマ区切りのインデックスまたはキー。各引数は、キーによるフィールド取得に使う[String](../data-types/string.md)またはN番目のフィールド取得に使う[Integer](../data-types/int-uint.md)。指定しない場合は、全体のJSONがトップレベルオブジェクトとして解析されます。オプションのパラメータ。 + +**返される値** + +- JSONのキーの配列を返します。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +**例** + +クエリ: + +```sql +SELECT JSONExtractKeys('{"a": "hello", "b": [-100, 200.0, 300]}'); +``` + +結果: + +``` +text +┌─JSONExtractKeys('{"a": "hello", "b": [-100, 200.0, 300]}')─┐ +│ ['a','b'] │ +└────────────────────────────────────────────────────────────┘ +``` + +### JSONExtractRaw + +未解析の文字列としてJSONの一部を返します。部分が存在しないか間違った型の場合、空の文字列が返されます。 + +**構文** + +```sql +JSONExtractRaw(json [, indices_or_keys]...) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md]. + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- 未解析の文字列としてJSONの一部を返します。部分が存在しないか間違った型の場合、空の文字列が返されます。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'; +``` + +### JSONExtractArrayRaw + +JSON配列の各要素を未解析の文字列として持つ配列を返します。部分が存在しないか配列でない場合は、空の配列が返されます。 + +**構文** + +```sql +JSONExtractArrayRaw(json [, indices_or_keys...]) +``` + +**パラメータ** + +- `json` — 解析するJSON文字列。[String](../data-types/string.md)。 +- `indices_or_keys` — ゼロまたはそれ以上の引数のリストで、それぞれが文字列または整数です。[String](../data-types/string.md), [Int*](../data-types/int-uint.md]. + +`indices_or_keys` のタイプ: +- 文字列 = キーによるオブジェクトメンバーへのアクセス。 +- 正の整数 = 開始からn番目のメンバー/キーへのアクセス。 +- 負の整数 = 終わりからn番目のメンバー/キーへのアクセス。 + +**返される値** + +- 各要素が未解析の文字列として表されるJSON配列の要素を持つ配列を返します。それ以外の場合は、部分が存在しないか配列でない場合は空の配列を返します。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +**例** + +```sql +SELECT JSONExtractArrayRaw('{"a": "hello", "b": [-100, 200.0, "hello"]}', 'b') = ['-100', '200.0', '"hello"']; +``` + +### JSONExtractKeysAndValuesRaw + +JSONオブジェクトからの生データを抽出します。 + +**構文** + +``` sql +JSONExtractKeysAndValuesRaw(json[, p, a, t, h]) +``` + +**引数** + +- `json` — 有効なJSONを含む[String](../data-types/string.md)。 +- `p, a, t, h` — ネストされたJSONオブジェクト内で内側のフィールドへのパスを指定するカンマ区切りのインデックスまたはキー。各引数は、キーによるフィールド取得に使う[string](../data-types/string.md)またはN番目のフィールド取得に使う[integer](../data-types/int-uint.md)。指定しない場合は、全体のJSONがトップレベルオブジェクトとして解析されます。オプションのパラメータ。 + +**返される値** + +- `('key', 'value')`タプルの配列。タプルの両要素は文字列です。[Array](../data-types/array.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md), [String](../data-types/string.md))。 +- 要求されたオブジェクトが存在しない場合、または入力JSONが無効な場合は空の配列。[Array](../data-types/array.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md), [String](../data-types/string.md))。 + +**例** + +クエリ: + +``` sql +SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}'); +``` + +結果: + +``` text +┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}')─┐ +│ [('a','[-100,200]'),('b','{"c":{"d":"hello","f":"world"}}')] │ +└──────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b'); +``` + +結果: + +``` text +┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', 'b')─┐ +│ [('c','{"d":"hello","f":"world"}')] │ +└───────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c'); +``` + +結果: + +``` text +┌─JSONExtractKeysAndValuesRaw('{"a": [-100, 200.0], "b":{"c": {"d": "hello", "f": "world"}}}', -1, 'c')─┐ +│ [('d','"hello"'),('f','"world"')] │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### JSON_EXISTS + +JSONドキュメントに値が存在する場合は`1`を返します。値が存在しない場合は`0`を返します。 + +**構文** + +```sql +JSON_EXISTS(json, path) +``` + +**パラメータ** + +- `json` — 有効なJSONを含む文字列。[String](../data-types/string.md)。 +- `path` — パスを表す文字列。[String](../data-types/string.md)。 + +:::note +バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) +::: + +**返される値** + +- JSONドキュメントに値が存在すれば`1`、それ以外は`0`を返します。 + +**例** + +``` sql +SELECT JSON_EXISTS('{"hello":1}', '$.hello'); +SELECT JSON_EXISTS('{"hello":{"world":1}}', '$.hello.world'); +SELECT JSON_EXISTS('{"hello":["world"]}', '$.hello[*]'); +SELECT JSON_EXISTS('{"hello":["world"]}', '$.hello[0]'); +``` + +### JSON_QUERY + +JSONを解析してJSON配列またはJSONオブジェクトとして値を抽出します。値が存在しない場合は、空の文字列が返されます。 + +**構文** + +```sql +JSON_QUERY(json, path) +``` + +**パラメータ** + +- `json` — 有効なJSONを含む文字列。[String](../data-types/string.md)。 +- `path` — パスを表す文字列。[String](../data-types/string.md)。 + +:::note +バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) +::: + +**返される値** + +- 抽出された値をJSON配列またはJSONオブジェクトとして返します。それ以外の場合、値が存在しない場合は空の文字列を返します。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSON_QUERY('{"hello":"world"}', '$.hello'); +SELECT JSON_QUERY('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]'); +SELECT JSON_QUERY('{"hello":2}', '$.hello'); +SELECT toTypeName(JSON_QUERY('{"hello":2}', '$.hello')); +``` + +結果: + +``` text +["world"] +[0, 1, 4, 0, -1, -4] +[2] +String +``` + +### JSON_VALUE + +JSONを解析してJSONスカラーとして値を抽出します。値が存在しない場合は、デフォルトで空の文字列が返されます。 + +この関数は次の設定によって制御されます: + +- `function_json_value_return_type_allow_nullable` を `true`に設定することで、`NULL`が返されます。値が複雑型(構造体、配列、マップのような)の場合、デフォルトで空の文字列が返されます。 +- `function_json_value_return_type_allow_complex` を `true`に設定することで、複雑な値が返されます。 + +**構文** + +```sql +JSON_VALUE(json, path) +``` + +**パラメータ** + +- `json` — 有効なJSONを含む文字列。[String](../data-types/string.md)。 +- `path` — パスを表す文字列。[String](../data-types/string.md)。 + +:::note +バージョン21.11より前だと引数の順序が誤っていました。つまり、JSON_EXISTS(path, json) +::: + +**返される値** + +- JSONスカラーとして抽出された値を返します。存在しない場合は空の文字列を返します。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT JSON_VALUE('{"hello":"world"}', '$.hello'); +SELECT JSON_VALUE('{"array":[[0, 1, 2, 3, 4, 5], [0, -1, -2, -3, -4, -5]]}', '$.array[*][0 to 2, 4]'); +SELECT JSON_VALUE('{"hello":2}', '$.hello'); +SELECT toTypeName(JSON_VALUE('{"hello":2}', '$.hello')); +select JSON_VALUE('{"hello":"world"}', '$.b') settings function_json_value_return_type_allow_nullable=true; +select JSON_VALUE('{"hello":{"world":"!"}}', '$.hello') settings function_json_value_return_type_allow_complex=true; +``` + +結果: + +``` text +world +0 +2 +String +``` + +### toJSONString + +値をそのJSON表現にシリアル化します。さまざまなデータ型やネストされた構造がサポートされます。 +デフォルトで、64ビットの[整数](../data-types/int-uint.md)以上のもの(例: `UInt64` または `Int128`)は引用符で囲まれます。[output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers)がこの動作を制御します。 +特別な値`NaN` と `inf` は `null` に置き換えられます。これを表示するには、[output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals)設定を有効にします。 +[Enum](../data-types/enum.md)値をシリアル化すると、その名前が出力されます。 + +**構文** + +``` sql +toJSONString(value) +``` + +**引数** + +- `value` — シリアル化する値。値は任意のデータ型である可能性があります。 + +**返される値** + +- 値のJSON表現。[String](../data-types/string.md)。 + +**例** + +最初の例は[Map](../data-types/map.md)のシリアル化を示しています。 +2つ目の例は、[Tuple](../data-types/tuple.md)にラップされた特別な値を示しています。 + +クエリ: + +``` sql +SELECT toJSONString(map('key1', 1, 'key2', 2)); +SELECT toJSONString(tuple(1.25, NULL, NaN, +inf, -inf, [])) SETTINGS output_format_json_quote_denormals = 1; +``` + +結果: + +``` text +{"key1":1,"key2":2} +[1.25,null,"nan","inf","-inf",[]] +``` + +**関連リンク** + +- [output_format_json_quote_64bit_integers](../../operations/settings/settings.md#session_settings-output_format_json_quote_64bit_integers) +- [output_format_json_quote_denormals](../../operations/settings/settings.md#settings-output_format_json_quote_denormals) + + +### JSONArrayLength + +最も外側のJSON配列の要素数を返します。入力されたJSON文字列が無効な場合、関数はNULLを返します。 + +**構文** + +``` sql +JSONArrayLength(json) +``` + +別名: `JSON_ARRAY_LENGTH(json)`。 + +**引数** + +- `json` — 有効なJSONを含む[String](../data-types/string.md)。 + +**返される値** + +- `json`が有効なJSON配列文字列であれば、配列要素の数を返し、それ以外の場合はNULLを返します。[Nullable(UInt64)](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT + JSONArrayLength(''), + JSONArrayLength('[1,2,3]') + +┌─JSONArrayLength('')─┬─JSONArrayLength('[1,2,3]')─┐ +│ ᴺᵁᴸᴸ │ 3 │ +└─────────────────────┴────────────────────────────┘ +``` + + +### jsonMergePatch + +複数のJSONオブジェクトをマージして形成されたマージ済みのJSONオブジェクト文字列を返します。 + +**構文** + +``` sql +jsonMergePatch(json1, json2, ...) +``` + +**引数** + +- `json` — 有効なJSONを含む[String](../data-types/string.md)。 + +**返される値** + +- JSONオブジェクト文字列が有効であれば、マージ済みのJSONオブジェクト文字列を返します。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT jsonMergePatch('{"a":1}', '{"name": "joey"}', '{"name": "tom"}', '{"name": "zoey"}') AS res + +┌─res───────────────────┐ +│ {"a":1,"name":"zoey"} │ +└───────────────────────┘ +``` + +### JSONAllPaths + +[JSON](../data-types/newjson.md)カラム内の各行に保存されているすべてのパスのリストを返します。 + +**構文** + +``` sql +JSONAllPaths(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Array(String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONAllPaths(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONAllPaths(json)─┐ +│ {"a":"42"} │ ['a'] │ +│ {"b":"Hello"} │ ['b'] │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['a','c'] │ +└──────────────────────────────────────┴────────────────────┘ +``` + +### JSONAllPathsWithTypes + +[JSON](../data-types/newjson.md)カラム内の各行に保存されているすべてのパスとそれらのデータ型のマップを返します。 + +**構文** + +``` sql +JSONAllPathsWithTypes(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Map(String, String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONAllPathsWithTypes(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONAllPathsWithTypes(json)───────────────┐ +│ {"a":"42"} │ {'a':'Int64'} │ +│ {"b":"Hello"} │ {'b':'String'} │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'a':'Array(Nullable(Int64))','c':'Date'} │ +└──────────────────────────────────────┴───────────────────────────────────────────┘ +``` + +### JSONDynamicPaths + +[JSON](../data-types/newjson.md)カラム内に別々のサブカラムとして格納されている動的パスのリストを返します。 + +**構文** + +``` sql +JSONDynamicPaths(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Array(String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONDynamicPaths(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONDynamicPaths(json)─┐ +| {"a":"42"} │ ['a'] │ +│ {"b":"Hello"} │ [] │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['a'] │ +└──────────────────────────────────────┴────────────────────────┘ +``` + +### JSONDynamicPathsWithTypes + +[JSON](../data-types/newjson.md)カラム内で別々のサブカラムとして格納される動的パスとその型のマップを各行に返します。 + +**構文** + +``` sql +JSONAllPathsWithTypes(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Map(String, String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONDynamicPathsWithTypes(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONDynamicPathsWithTypes(json)─┐ +│ {"a":"42"} │ {'a':'Int64'} │ +│ {"b":"Hello"} │ {} │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'a':'Array(Nullable(Int64))'} │ +└──────────────────────────────────────┴─────────────────────────────────┘ +``` + +### JSONSharedDataPaths + +[JSON](../data-types/newjson.md)カラム内の共有データ構造に保存されているパスのリストを返します。 + +**構文** + +``` sql +JSONSharedDataPaths(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Array(String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONSharedDataPaths(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONSharedDataPaths(json)─┐ +│ {"a":"42"} │ [] │ +│ {"b":"Hello"} │ ['b'] │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ ['c'] │ +└──────────────────────────────────────┴───────────────────────────┘ +``` + +### JSONSharedDataPathsWithTypes + +[JSON](../data-types/newjson.md)カラム内で共有データ構造に保存されているパスとその型のマップを各行に返します。 + +**構文** + +``` sql +JSONSharedDataPathsWithTypes(json) +``` + +**引数** + +- `json` — [JSON](../data-types/newjson.md). + +**返される値** + +- パスの配列。[Map(String, String)](../data-types/array.md)。 + +**例** + +``` sql +CREATE TABLE test (json JSON(max_dynamic_paths=1)) ENGINE = Memory; +INSERT INTO test FORMAT JSONEachRow {"json" : {"a" : 42}}, {"json" : {"b" : "Hello"}}, {"json" : {"a" : [1, 2, 3], "c" : "2020-01-01"}} +SELECT json, JSONSharedDataPathsWithTypes(json) FROM test; +``` + +```text +┌─json─────────────────────────────────┬─JSONSharedDataPathsWithTypes(json)─┐ +│ {"a":"42"} │ {} │ +│ {"b":"Hello"} │ {'b':'String'} │ +│ {"a":["1","2","3"],"c":"2020-01-01"} │ {'c':'Date'} │ +└──────────────────────────────────────┴────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/logical-functions.md b/docs/ja/sql-reference/functions/logical-functions.md new file mode 100644 index 00000000000..6cefb17a67e --- /dev/null +++ b/docs/ja/sql-reference/functions/logical-functions.md @@ -0,0 +1,193 @@ +--- +slug: /ja/sql-reference/functions/logical-functions +sidebar_position: 110 +sidebar_label: 論理 +--- + +# 論理関数 + +以下の関数は任意の数値型の引数に対して論理演算を行います。それらは [UInt8](../data-types/int-uint.md) または場合によっては `NULL` として 0 または 1 を返します。 + +引数としてのゼロは `false` とみなされ、ゼロ以外の値は `true` とみなされます。 + +## and + +二つ以上の値の論理積を計算します。 + +[short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) を設定することで、短絡評価を使用するかどうかを制御します。 有効になっている場合、`val_i` は `(val_1 AND val_2 AND ... AND val_{i-1})` が `true` の場合にのみ評価されます。例えば、短絡評価を使用すると、クエリ `SELECT and(number = 2, intDiv(1, number)) FROM numbers(5)` を実行してもゼロ除算例外は発生しません。 + +**構文** + +``` sql +and(val1, val2...) +``` + +別名: [AND 演算子](../../sql-reference/operators/index.md#logical-and-operator)。 + +**引数** + +- `val1, val2, ...` — 少なくとも二つの値のリスト。[Int](../data-types/int-uint.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Nullable](../data-types/nullable.md)。 + +**返される値** + +- 少なくとも一つの引数が `false` の場合は `0`、 +- 引数が全て `false` でなく少なくとも一つが `NULL` の場合は `NULL`、 +- それ以外の場合は `1`。 + +型: [UInt8](../../sql-reference/data-types/int-uint.md) または [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md))。 + +**例** + +``` sql +SELECT and(0, 1, -2); +``` + +結果: + +``` text +┌─and(0, 1, -2)─┐ +│ 0 │ +└───────────────┘ +``` + +`NULL` を含めた場合: + +``` sql +SELECT and(NULL, 1, 10, -2); +``` + +結果: + +``` text +┌─and(NULL, 1, 10, -2)─┐ +│ ᴺᵁᴸᴸ │ +└──────────────────────┘ +``` + +## or + +二つ以上の値の論理和を計算します。 + +[short_circuit_function_evaluation](../../operations/settings/settings.md#short-circuit-function-evaluation) を設定することで、短絡評価を使用するかどうかを制御します。有効になっている場合、`val_i` は `((NOT val_1) AND (NOT val_2) AND ... AND (NOT val_{i-1}))` が `true` の場合にのみ評価されます。例えば、短絡評価を使用すると、クエリ `SELECT or(number = 0, intDiv(1, number) != 0) FROM numbers(5)` を実行してもゼロ除算例外は発生しません。 + +**構文** + +``` sql +or(val1, val2...) +``` + +別名: [OR 演算子](../../sql-reference/operators/index.md#logical-or-operator)。 + +**引数** + +- `val1, val2, ...` — 少なくとも二つの値のリスト。[Int](../data-types/int-uint.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Nullable](../data-types/nullable.md)。 + +**返される値** + +- 少なくとも一つの引数が `true` の場合は `1`、 +- 引数が全て `false` の場合は `0`、 +- 引数が全て `false` で少なくとも一つが `NULL` の場合は `NULL`。 + +型: [UInt8](../../sql-reference/data-types/int-uint.md) または [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md))。 + +**例** + +``` sql +SELECT or(1, 0, 0, 2, NULL); +``` + +結果: + +``` text +┌─or(1, 0, 0, 2, NULL)─┐ +│ 1 │ +└──────────────────────┘ +``` + +`NULL` を含めた場合: + +``` sql +SELECT or(0, NULL); +``` + +結果: + +``` text +┌─or(0, NULL)─┐ +│ ᴺᵁᴸᴸ │ +└─────────────┘ +``` + +## not + +値の論理否定を計算します。 + +**構文** + +``` sql +not(val); +``` + +別名: [否定演算子](../../sql-reference/operators/index.md#logical-negation-operator)。 + +**引数** + +- `val` — 値。[Int](../data-types/int-uint.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Nullable](../data-types/nullable.md)。 + +**返される値** + +- `val` が `false` の場合は `1`、 +- `val` が `true` の場合は `0`、 +- `val` が `NULL` の場合は `NULL`。 + +型: [UInt8](../../sql-reference/data-types/int-uint.md) または [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md))。 + +**例** + +``` sql +SELECT NOT(1); +``` + +結果: + +``` test +┌─not(1)─┐ +│ 0 │ +└────────┘ +``` + +## xor + +二つ以上の値の排他的論理和を計算します。二つ以上の入力値については、まず最初の二つの値に対して xor を行い、次にその結果と三つ目の値について xor を行うというように進めます。 + +**構文** + +``` sql +xor(val1, val2...) +``` + +**引数** + +- `val1, val2, ...` — 少なくとも二つの値のリスト。[Int](../data-types/int-uint.md), [UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Nullable](../data-types/nullable.md)。 + +**返される値** + +- 二つの値について、一方が `false` で他方が `true` の場合は `1`、 +- 二つの値がどちらも `false` または `true` の場合は `0`、 +- 少なくとも一つの入力が `NULL` の場合は `NULL`。 + +型: [UInt8](../../sql-reference/data-types/int-uint.md) または [Nullable](../../sql-reference/data-types/nullable.md)([UInt8](../../sql-reference/data-types/int-uint.md))。 + +**例** + +``` sql +SELECT xor(0, 1, 1); +``` + +結果: + +``` text +┌─xor(0, 1, 1)─┐ +│ 0 │ +└──────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/machine-learning-functions.md b/docs/ja/sql-reference/functions/machine-learning-functions.md new file mode 100644 index 00000000000..e162ff989d8 --- /dev/null +++ b/docs/ja/sql-reference/functions/machine-learning-functions.md @@ -0,0 +1,19 @@ +--- +slug: /ja/sql-reference/functions/machine-learning-functions +sidebar_position: 115 +sidebar_label: 機械学習 +--- + +# 機械学習関数 + +## evalMLMethod + +フィットした回帰モデルを使用した予測には、`evalMLMethod` 関数を使用します。`linearRegression` のリンクを参照してください。 + +## stochasticLinearRegression + +[stochasticLinearRegression](../../sql-reference/aggregate-functions/reference/stochasticlinearregression.md#agg_functions-stochasticlinearregression) 集約関数は、線形モデルと平均二乗誤差(MSE)損失関数を使用した確率的勾配降下法を実装します。新しいデータに対して予測を行う際には `evalMLMethod` を使用します。 + +## stochasticLogisticRegression + +[stochasticLogisticRegression](../../sql-reference/aggregate-functions/reference/stochasticlogisticregression.md#agg_functions-stochasticlogisticregression) 集約関数は、バイナリ分類問題のための確率的勾配降下法を実装します。新しいデータに対して予測を行う際には `evalMLMethod` を使用します。 diff --git a/docs/ja/sql-reference/functions/math-functions.md b/docs/ja/sql-reference/functions/math-functions.md new file mode 100644 index 00000000000..aecf75bb9e8 --- /dev/null +++ b/docs/ja/sql-reference/functions/math-functions.md @@ -0,0 +1,1011 @@ +--- +slug: /ja/sql-reference/functions/math-functions +sidebar_position: 125 +sidebar_label: 数学関数 +--- + +# 数学関数 + +## e + +$e$([オイラー数](https://en.wikipedia.org/wiki/Euler%27s_constant))を返します。 + +**構文** + +```sql +e() +``` + +**返される値** + +型: [Float64](../data-types/float.md)。 + +## pi + +$\pi$([パイ](https://en.wikipedia.org/wiki/Pi))を返します。 + +**構文** + +```sql +pi() +``` +**返される値** + +型: [Float64](../data-types/float.md)。 + +## exp + +$x$を指定した引数として、$e^{x}$を返します。 + +**構文** + +```sql +exp(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT round(exp(-1), 4); +``` + +結果: + +```response +┌─round(exp(-1), 4)─┐ +│ 0.3679 │ +└───────────────────┘ +``` + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## log + +引数の自然対数を返します。 + +**構文** + +```sql +log(x) +``` + +別名: `ln(x)` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## exp2 + +指定した引数の2のべき乗を返します。 + +**構文** + +```sql +exp2(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## intExp2 + +[`exp`](#exp) のように挙動しますが、UInt64を返します。 + +**構文** + +```sql +intExp2(x) +``` + +## log2 + +引数の二進対数を返します。 + +**構文** + +```sql +log2(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## exp10 + +指定した引数の10のべき乗を返します。 + +**構文** + +```sql +exp10(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## intExp10 + +[`exp10`](#exp10) のように挙動しますが、UInt64を返します。 + +**構文** + +```sql +intExp10(x) +``` + +## log10 + +引数の十進対数を返します。 + +**構文** + +```sql +log10(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## sqrt + +引数の平方根を返します。 + +```sql +sqrt(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## cbrt + +引数の立方根を返します。 + +```sql +cbrt(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## erf + +`x` が非負である場合、$erf(\frac{x}{\sigma\sqrt{2}})$ は、標準偏差 $\sigma$ を持つ正規分布において、期待値から `x` を超える値を取る確率です。 + +**構文** + +```sql +erf(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +**例** + +(3 sigma ルール) + +``` sql +SELECT erf(3 / sqrt(2)); +``` + +```result +┌─erf(divide(3, sqrt(2)))─┐ +│ 0.9973002039367398 │ +└─────────────────────────┘ +``` + +## erfc + +大きな `x` 値に対して精度を失うことなく $1-erf(x)$ に近い数値を返します。 + +**構文** + +```sql +erfc(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## lgamma + +ガンマ関数の対数を返します。 + +**構文** + +```sql +lgamma(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## tgamma + +ガンマ関数を返します。 + +**構文** + +```sql +gamma(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## sin + +引数の正弦を返します。 + +**構文** + +```sql +sin(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT sin(1.23); +``` + +```response +0.9424888019316975 +``` + +## cos + +引数の余弦を返します。 + +**構文** + +```sql +cos(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## tan + +引数の正接を返します。 + +**構文** + +```sql +tan(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## asin + +引数の逆正弦を返します。 + +**構文** + +```sql +asin(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## acos + +引数の逆余弦を返します。 + +**構文** + +```sql +acos(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## atan + +引数の逆正接を返します。 + +**構文** + +```sql +atan(x) +``` + +**引数** + +- `x` - [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +型: [Float*](../data-types/float.md)。 + +## pow + +$x^y$ を返します。 + +**構文** + +```sql +pow(x, y) +``` + +別名: `power(x, y)` + +**引数** + +- `x` - [(U)Int8/16/32/64](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md) +- `y` - [(U)Int8/16/32/64](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md) + +**返される値** + +型: [Float64](../data-types/float.md)。 + +## cosh + +引数の[双曲線余弦](https://in.mathworks.com/help/matlab/ref/cosh.html)を返します。 + +**構文** + +``` sql +cosh(x) +``` + +**引数** + +- `x` — 角度(ラジアン)。区間の値: $-\infty \lt x \lt +\infty$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 区間: $1 \le cosh(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT cosh(0); +``` + +結果: + +```result +┌─cosh(0)──┐ +│ 1 │ +└──────────┘ +``` + +## acosh + +[inverse hyperbolic 余弦](https://www.mathworks.com/help/matlab/ref/acosh.html)を返します。 + +**構文** + +``` sql +acosh(x) +``` + +**引数** + +- `x` — 角度の双曲線余弦。区間の値: $1 \le x \lt +\infty$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 角度(ラジアン)。区間の値: $0 \le acosh(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT acosh(1); +``` + +結果: + +```result +┌─acosh(1)─┐ +│ 0 │ +└──────────┘ +``` + +## sinh + +[双曲線正弦](https://www.mathworks.com/help/matlab/ref/sinh.html)を返します。 + +**構文** + +``` sql +sinh(x) +``` + +**引数** + +- `x` — 角度(ラジアン)。区間の値: $-\infty \lt x \lt +\infty$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 区間の値: $-\infty \lt sinh(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT sinh(0); +``` + +結果: + +```result +┌─sinh(0)──┐ +│ 0 │ +└──────────┘ +``` + +## asinh + +[逆双曲線正弦](https://www.mathworks.com/help/matlab/ref/asinh.html)を返します。 + +**構文** + +``` sql +asinh(x) +``` + +**引数** + +- `x` — 角度の双曲線正弦。区間の値: $-\infty \lt x \lt +\infty$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 角度(ラジアン)。区間の値: $-\infty \lt asinh(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT asinh(0); +``` + +結果: + +```result +┌─asinh(0)─┐ +│ 0 │ +└──────────┘ +``` + +## tanh + +[双曲線正接](https://www.mathworks.com/help/matlab/ref/tanh.html)を返します。 + +**構文** + +``` sql +tanh(x) +``` + +**引数** + +- `x` — 角度(ラジアン)。区間の値: $-\infty \lt x \lt +\infty$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 区間の値: $-1 \lt tanh(x) \lt 1$。 + +型: [Float*](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT tanh(0); +``` + +結果: + +```result +0 +``` + +## atanh + +[逆双曲線正接](https://www.mathworks.com/help/matlab/ref/atanh.html)を返します。 + +**構文** + +``` sql +atanh(x) +``` + +**引数** + +- `x` — 角度の双曲線正接。区間の値: $-1 \lt x \lt 1$。[ (U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 角度(ラジアン)。区間の値: $-\infty \lt atanh(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT atanh(0); +``` + +結果: + +```result +┌─atanh(0)─┐ +│ 0 │ +└──────────┘ +``` + +## atan2 + +[atan2](https://en.wikipedia.org/wiki/Atan2) を、ユークリッド平面における角度として返し、ラジアンで表されますが、正の x 軸と点 `(x, y) ≠ (0, 0)` への光線との間のものです。 + +**構文** + +``` sql +atan2(y, x) +``` + +**引数** + +- `y` — 光線が通過する点の y 座標。 [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 +- `x` — 光線が通過する点の x 座標。 [(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 角度 `θ` の値として、$-\pi \lt 0 \le \pi$ の区間で、ラジアンで表されます。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT atan2(1, 1); +``` + +結果: + +```result +┌────────atan2(1, 1)─┐ +│ 0.7853981633974483 │ +└────────────────────┘ +``` + +## hypot + +直角三角形の斜辺の長さを返します。[Hypot](https://en.wikipedia.org/wiki/Hypot) は非常に大きな数や非常に小さな数を平方する際の問題を回避します。 + +**構文** + +``` sql +hypot(x, y) +``` + +**引数** + +- `x` — 直角三角形の一つのカテート。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 +- `y` — 直角三角形のもう一つのカテート。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 直角三角形の斜辺の長さ。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT hypot(1, 1); +``` + +結果: + +```result +┌────────hypot(1, 1)─┐ +│ 1.4142135623730951 │ +└────────────────────┘ +``` + +## log1p + +`log(1+x)` を計算します。 [計算](https://en.wikipedia.org/wiki/Natural_logarithm#lnp1) `log1p(x)` は、小さな値の x に対して `log(1+x)` よりも精度が高いです。 + +**構文** + +``` sql +log1p(x) +``` + +**引数** + +- `x` — 値の範囲: $-1 \lt x \lt +\infty$。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md) または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 値の範囲: $-\infty < log1p(x) \lt +\infty$。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT log1p(0); +``` + +結果: + +```result +┌─log1p(0)─┐ +│ 0 │ +└──────────┘ +``` + +## sign + +実数の符号を返します。 + +**構文** + +``` sql +sign(x) +``` + +**引数** + +- `x` — 値は $-\infty$ から $+\infty$ まで。ClickHouse のすべての数値型をサポートしています。 + +**返される値** + +- `x < 0` の場合は -1 +- `x = 0` の場合は 0 +- `x > 0` の場合は 1 + +型: [Int8](../data-types/int-uint.md)。 + +**例** + +ゼロ値の符号: + +``` sql +SELECT sign(0); +``` + +結果: + +```result +┌─sign(0)─┐ +│ 0 │ +└─────────┘ +``` + +正の値の符号: + +``` sql +SELECT sign(1); +``` + +結果: + +```result +┌─sign(1)─┐ +│ 1 │ +└─────────┘ +``` + +負の値の符号: + +``` sql +SELECT sign(-1); +``` + +結果: + +```result +┌─sign(-1)─┐ +│ -1 │ +└──────────┘ +``` + +## sigmoid + +[sigmoid 関数](https://en.wikipedia.org/wiki/Sigmoid_function)を返します。 + +**構文** + +```sql +sigmoid(x) +``` + +**パラメータ** + +- `x` — 入力値。範囲は $-\infty \lt x \lt +\infty$。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md), または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 0から1の間の sigmoid 曲線に沿った対応する値。[Float64](../data-types/float.md)。 + +**例** + +クエリ: + +``` sql +SELECT round(sigmoid(x), 5) FROM (SELECT arrayJoin([-1, 0, 1]) AS x); +``` + +結果: + +```result +0.26894 +0.5 +0.73106 +``` + +## degrees + +ラジアンを度に変換します。 + +**構文** + +``` sql +degrees(x) +``` + +**引数** + +- `x` — 入力値(ラジアン)。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md), または [Decimal*](../data-types/decimal.md)。 +- `x` — 入力値(ラジアン)。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md), または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- 度で表された値。[Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT degrees(3.141592653589793); +``` + +結果: + +```result +┌─degrees(3.141592653589793)─┐ +│ 180 │ +└────────────────────────────┘ +``` + +## radians + +度をラジアンに変換します。 + +**構文** + +``` sql +radians(x) +``` + +**引数** + +- `x` — 入力値(度)。[(U)Int*](../data-types/int-uint.md), [Float*](../data-types/float.md), または [Decimal*](../data-types/decimal.md)。 + +**返される値** + +- ラジアンで表された値。 + +型: [Float64](../data-types/float.md#float32-float64)。 + +**例** + +``` sql +SELECT radians(180); +``` + +結果: + +```result +┌──────radians(180)─┐ +│ 3.141592653589793 │ +└───────────────────┘ +``` + +## factorial + +整数値の階乗を計算します。UInt(8|16|32|64) および Int(8|16|32|64) を含む任意のネイティブ整数型で動作します。戻りの型は UInt64 です。 + +0 の階乗は 1 です。同様に、`factorial()` 関数は任意の負の値に対して 1 を返します。入力引数の最大正の値は 20 で、21 以上の値は例外をスローします。 + +**構文** + +``` sql +factorial(n) +``` + +**例** + +``` sql +SELECT factorial(10); +``` + +結果: + +```result +┌─factorial(10)─┐ +│ 3628800 │ +└───────────────┘ +``` + +## width_bucket + +ヒストグラムにおいて、`operand` が `low` から `high` までの範囲に分割された `count` 等幅のバケットのうち、どのバケットに属するかを返します。`operand < low` の場合は `0` を返し、`operand >= high` の場合は `count+1` を返します。 + +`operand`、`low`、`high` は任意のネイティブ数値型にすることができます。 `count` は符号なしのネイティブ整数型にすることができ、その値はゼロであってはなりません。 + +**構文** + +```sql +widthBucket(operand, low, high, count) +``` +別名: `WIDTH_BUCKET` + +**例** + +``` sql +SELECT widthBucket(10.15, -8.6, 23, 18); +``` + +結果: + +```result +┌─widthBucket(10.15, -8.6, 23, 18)─┐ +│ 11 │ +└──────────────────────────────────┘ +``` + +## proportionsZTest + +二つの母集団 `x` と `y` の比率を比較するための統計的検定である2比率Z検定の統計量を返します。 + +**構文** + +```sql +proportionsZTest(successes_x, successes_y, trials_x, trials_y, conf_level, pool_type) +``` + +**引数** + +- `successes_x`: 母集団 `x` における成功の数。 [UInt64](../data-types/int-uint.md)。 +- `successes_y`: 母集団 `y` における成功の数。 [UInt64](../data-types/int-uint.md)。 +- `trials_x`: 母集団 `x` における試行の数。 [UInt64](../data-types/int-uint.md)。 +- `trials_y`: 母集団 `y` における試行の数。 [UInt64](../data-types/int-uint.md)。 +- `conf_level`: 検定における信頼水準。 [Float64](../data-types/float.md)。 +- `pool_type`: プール方式(標準誤差の推定方式)。`unpooled` または `pooled` のいずれか。 [String](../data-types/string.md)。 + +:::note +引数 `pool_type` に関して: プールされたバージョンでは、2つの比率が平均され、1つの比率だけが標準誤差を推定するために使用されます。プールされていないバージョンでは、2つの比率が別々に使用されます。 +::: + +**返される値** + +- `z_stat`: Z 統計量。 [Float64](../data-types/float.md)。 +- `p_val`: P 値。 [Float64](../data-types/float.md)。 +- `ci_low`: 下側の信頼区間。 [Float64](../data-types/float.md)。 +- `ci_high`: 上側の信頼区間。 [Float64](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT proportionsZTest(10, 11, 100, 101, 0.95, 'unpooled'); +``` + +結果: + +```response +┌─proportionsZTest(10, 11, 100, 101, 0.95, 'unpooled')───────────────────────────────┐ +│ (-0.20656724435948853,0.8363478437079654,-0.09345975390115283,0.07563797172293502) │ +└────────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/nlp-functions.md b/docs/ja/sql-reference/functions/nlp-functions.md new file mode 100644 index 00000000000..4267653375c --- /dev/null +++ b/docs/ja/sql-reference/functions/nlp-functions.md @@ -0,0 +1,393 @@ +--- +slug: /ja/sql-reference/functions/nlp-functions +sidebar_position: 130 +sidebar_label: NLP (エクスペリメンタル) +--- + +# 自然言語処理 (NLP) 関数 + +:::warning +これは現在開発中のエクスペリメンタルな機能であり、一般的な利用にはまだ準備が整っていません。将来のリリースでは予測不可能な互換性のない変更が行われることがあります。有効にするには `allow_experimental_nlp_functions = 1` を設定してください。 +::: + +## detectCharset + +`detectCharset` 関数は非UTF8エンコードの入力文字列の文字セットを検出します。 + +*構文* + +``` sql +detectCharset('text_to_be_analyzed') +``` + +*引数* + +- `text_to_be_analyzed` — 分析する文字列のコレクション(または文)。[String](../data-types/string.md#string). + +*返される値* + +- 検出された文字セットのコードを含む `String` + +*例* + +クエリ: + +```sql +SELECT detectCharset('Ich bleibe für ein paar Tage.'); +``` + +結果: + +```response +┌─detectCharset('Ich bleibe für ein paar Tage.')─┐ +│ WINDOWS-1252 │ +└────────────────────────────────────────────────┘ +``` + +## detectLanguage + +UTF8エンコードされた入力文字列の言語を検出します。関数は検出に[CLD2ライブラリ](https://github.com/CLD2Owners/cld2)を使用し、2文字のISO言語コードを返します。 + +`detectLanguage` 関数は、入力文字列内に200文字以上を提供すると最適に動作します。 + +*構文* + +``` sql +detectLanguage('text_to_be_analyzed') +``` + +*引数* + +- `text_to_be_analyzed` — 分析する文字列のコレクション(または文)。[String](../data-types/string.md#string). + +*返される値* + +- 検出された言語の2文字のISOコード + +その他の可能な結果: + +- `un` = 不明、言語を検出できない。 +- `other` = 検出された言語に2文字のコードがない。 + +*例* + +クエリ: + +```sql +SELECT detectLanguage('Je pense que je ne parviendrai jamais à parler français comme un natif. Where there’s a will, there’s a way.'); +``` + +結果: + +```response +fr +``` + +## detectLanguageMixed + +`detectLanguage` 関数に似ていますが、`detectLanguageMixed` は特定の言語の割合がテキスト内でどれだけ存在するかを示す2文字の言語コードの `Map` を返します。 + +*構文* + +``` sql +detectLanguageMixed('text_to_be_analyzed') +``` + +*引数* + +- `text_to_be_analyzed` — 分析する文字列のコレクション(または文)。[String](../data-types/string.md#string). + +*返される値* + +- `Map(String, Float32)`: キーが2文字のISOコードで、値がその言語のテキスト内の割合 + +*例* + +クエリ: + +```sql +SELECT detectLanguageMixed('二兎を追う者は一兎をも得ず二兎を追う者は一兎をも得ず A vaincre sans peril, on triomphe sans gloire.'); +``` + +結果: + +```response +┌─detectLanguageMixed()─┐ +│ {'ja':0.62,'fr':0.36 │ +└───────────────────────┘ +``` + +## detectProgrammingLanguage + +ソースコードからプログラミング言語を判別します。ソースコード内のコマンドのユニグラムとバイグラムをすべて計算します。その後、さまざまなプログラミング言語のコマンドのユニグラムとバイグラムの重みを持つマークアップされたDictionaryを使用して、最も重みのあるプログラミング言語を見つけて返します。 + +*構文* + +``` sql +detectProgrammingLanguage('source_code') +``` + +*引数* + +- `source_code` — 分析するソースコードの文字列表現。[String](../data-types/string.md#string). + +*返される値* + +- プログラミング言語。[String](../data-types/string.md). + +*例* + +クエリ: + +```sql +SELECT detectProgrammingLanguage('#include '); +``` + +結果: + +```response +┌─detectProgrammingLanguage('#include ')─┐ +│ C++ │ +└──────────────────────────────────────────────────┘ +``` + +## detectLanguageUnknown + +`detectLanguage` 関数に似ていますが、`detectLanguageUnknown` 関数は非UTF8エンコードの文字列で動作します。文字セットがUTF-16またはUTF-32の場合、このバージョンを使用してください。 + +*構文* + +``` sql +detectLanguageUnknown('text_to_be_analyzed') +``` + +*引数* + +- `text_to_be_analyzed` — 分析する文字列のコレクション(または文)。[String](../data-types/string.md#string). + +*返される値* + +- 検出された言語の2文字のISOコード + +その他の可能な結果: + +- `un` = 不明、言語を検出できない。 +- `other` = 検出された言語に2文字のコードがない。 + +*例* + +クエリ: + +```sql +SELECT detectLanguageUnknown('Ich bleibe für ein paar Tage.'); +``` + +結果: + +```response +┌─detectLanguageUnknown('Ich bleibe für ein paar Tage.')─┐ +│ de │ +└────────────────────────────────────────────────────────┘ +``` + +## detectTonality + +テキストデータの感情を判定します。マークアップされた感情Dictionaryを使用し、各単語には `-12` から `6` までのトナリティがあります。各テキストについて、その単語の平均感情値を計算し、範囲 `[-1,1]` でそれを返します。 + +:::note +この関数は現段階では制限されています。現在は `/contrib/nlp-data/tonality_ru.zst` に埋め込まれた感情Dictionaryを使用し、ロシア語のみに対応しています。 +::: + +*構文* + +``` sql +detectTonality(text) +``` + +*引数* + +- `text` — 分析するテキスト。[String](../data-types/string.md#string). + +*返される値* + +- `text` 内の単語の平均感情値。[Float32](../data-types/float.md). + +*例* + +クエリ: + +```sql +SELECT detectTonality('Шарик - хороший пёс'), -- シャリクは良い犬です + detectTonality('Шарик - пёс'), -- シャリクは犬です + detectTonality('Шарик - плохой пёс'); -- シャリクは悪い犬です +``` + +結果: + +```response +┌─detectTonality('Шарик - хороший пёс')─┬─detectTonality('Шарик - пёс')─┬─detectTonality('Шарик - плохой пёс')─┐ +│ 0.44445 │ 0 │ -0.3 │ +└───────────────────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘ +``` +## lemmatize + +与えられた単語のレンマタイゼーションを行います。動作にはDictionariesが必要であり、[こちら](https://github.com/vpodpecan/lemmagen3/tree/master/src/lemmagen3/models)から入手できます。 + +*構文* + +``` sql +lemmatize('language', word) +``` + +*引数* + +- `language` — 適用するルールの言語。[String](../data-types/string.md#string). +- `word` — レンマ化する必要のある単語。小文字である必要があります。[String](../data-types/string.md#string). + +*例* + +クエリ: + +``` sql +SELECT lemmatize('en', 'wolves'); +``` + +結果: + +``` text +┌─lemmatize("wolves")─┐ +│ "wolf" │ +└─────────────────────┘ +``` + +*設定* + +この設定は、英語(`en`)の単語のレンマタイゼーションに `en.bin` のDictionaryを使用することを指定します。 `.bin` ファイルは[こちら](https://github.com/vpodpecan/lemmagen3/tree/master/src/lemmagen3/models)からダウンロードできます。 + +``` xml + + + + en + en.bin + + + +``` + +## stem + +与えられた単語のステミングを行います。 + +*構文* + +``` sql +stem('language', word) +``` + +*引数* + +- `language` — 適用するルールの言語。2文字の[ISO 639-1コード](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)を使用します。 +- `word` — ステミングする必要のある単語。小文字である必要があります。[String](../data-types/string.md#string). + +*例* + +クエリ: + +``` sql +SELECT arrayMap(x -> stem('en', x), ['I', 'think', 'it', 'is', 'a', 'blessing', 'in', 'disguise']) as res; +``` + +結果: + +``` text +┌─res────────────────────────────────────────────────┐ +│ ['I','think','it','is','a','bless','in','disguis'] │ +└────────────────────────────────────────────────────┘ +``` +*stem()でサポートされている言語* + +:::note +stem() 関数は [Snowballステミング](https://snowballstem.org/) ライブラリを使用します。最新の言語情報などはSnowballのウェブサイトを参照してください。 +::: + +- アラビア語 +- アルメニア語 +- バスク語 +- カタルーニャ語 +- デンマーク語 +- オランダ語 +- 英語 +- フィンランド語 +- フランス語 +- ドイツ語 +- ギリシャ語 +- ヒンディー語 +- ハンガリー語 +- インドネシア語 +- アイルランド語 +- イタリア語 +- リトアニア語 +- ネパール語 +- ノルウェー語 +- ポーター +- ポルトガル語 +- ルーマニア語 +- ロシア語 +- セルビア語 +- スペイン語 +- スウェーデン語 +- タミル語 +- トルコ語 +- イディッシュ語 + +## synonyms + +指定された単語の同義語を見つけます。`plain` と `wordnet` の2種類の同義語拡張があります。 + +`plain` 拡張タイプでは、シンプルなテキストファイルへのパスを提供する必要があります。このファイルの各行は特定の同義語セットに対応し、その行内の単語はスペースまたはタブ文字で区切られている必要があります。 + +`wordnet` 拡張タイプでは、WordNetシソーラスが含まれているディレクトリへのパスを提供する必要があります。シソーラスにはWordNetのセンスインデックスが含まれている必要があります。 + +*構文* + +``` sql +synonyms('extension_name', word) +``` + +*引数* + +- `extension_name` — 検索が実行される拡張子の名前。[String](../data-types/string.md#string). +- `word` — 拡張子内で検索される単語。[String](../data-types/string.md#string). + +*例* + +クエリ: + +``` sql +SELECT synonyms('list', 'important'); +``` + +結果: + +``` text +┌─synonyms('list', 'important')────────────┐ +│ ['important','big','critical','crucial'] │ +└──────────────────────────────────────────┘ +``` + +*設定* +``` xml + + + en + plain + en.txt + + + en + wordnet + en/ + + +``` diff --git a/docs/ja/sql-reference/functions/other-functions.md b/docs/ja/sql-reference/functions/other-functions.md new file mode 100644 index 00000000000..0d45b77e387 --- /dev/null +++ b/docs/ja/sql-reference/functions/other-functions.md @@ -0,0 +1,4423 @@ +--- +slug: /ja/sql-reference/functions/other-functions +sidebar_position: 140 +sidebar_label: Other +--- + +# その他の関数 + +## hostName + +この関数が実行されたホスト名を返します。関数がリモートサーバー上で実行される場合(分散処理)には、リモートサーバーの名前が返されます。 +関数が分散テーブルのコンテキストで実行された場合、各シャードに関連する値を持つ通常のカラムを生成します。そうでない場合は定数値を生成します。 + +**構文** + +```sql +hostName() +``` + +**戻り値** + +- ホスト名。[String](../data-types/string.md)。 + +## getMacro {#getMacro} + +サーバー構成の[マクロ](../../operations/server-configuration-parameters/settings.md#macros)セクションから名前付きの値を返します。 + +**構文** + +```sql +getMacro(name); +``` + +**引数** + +- `name` — ``セクションから取得するマクロ名。[String](../data-types/string.md#string)。 + +**戻り値** + +- 指定されたマクロの値。[String](../data-types/string.md)。 + +**例** + +サーバー構成ファイル内の``セクションの例: + +```xml + + Value + +``` + +クエリ: + +```sql +SELECT getMacro('test'); +``` + +結果: + +```text +┌─getMacro('test')─┐ +│ Value │ +└──────────────────┘ +``` + +同じ値を以下のクエリでも取得できます: + +```sql +SELECT * FROM system.macros +WHERE macro = 'test'; +``` + +```text +┌─macro─┬─substitution─┐ +│ test │ Value │ +└───────┴──────────────┘ +``` + +## fqdn + +ClickHouseサーバーの完全修飾ドメイン名を返します。 + +**構文** + +```sql +fqdn(); +``` + +別名: `fullHostName`, `FQDN`. + +**戻り値** + +- 完全修飾ドメイン名の文字列。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT FQDN(); +``` + +結果: + +```text +┌─FQDN()──────────────────────────┐ +│ clickhouse.ru-central1.internal │ +└─────────────────────────────────┘ +``` + +## basename + +文字列の最後のスラッシュまたはバックスラッシュの後ろの部分を抽出します。この関数は通常、パスからファイル名を抽出するのに使用されます。 + +```sql +basename(expr) +``` + +**引数** + +- `expr` — [String](../data-types/string.md)型の値。バックスラッシュはエスケープする必要があります。 + +**戻り値** + +入力文字列の最後のスラッシュまたはバックスラッシュの後の部分を含む文字列。入力文字列がスラッシュまたはバックスラッシュで終わっている場合(例:`/`や`c:\`)、関数は空の文字列を返します。スラッシュやバックスラッシュがない場合は元の文字列を返します。 + +**例** + +クエリ: + +```sql +SELECT 'some/long/path/to/file' AS a, basename(a) +``` + +結果: + +```text +┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐ +│ some\long\path\to\file │ file │ +└────────────────────────┴────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT 'some\\long\\path\\to\\file' AS a, basename(a) +``` + +結果: + +```text +┌─a──────────────────────┬─basename('some\\long\\path\\to\\file')─┐ +│ some\long\path\to\file │ file │ +└────────────────────────┴────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT 'some-file-name' AS a, basename(a) +``` + +結果: + +```text +┌─a──────────────┬─basename('some-file-name')─┐ +│ some-file-name │ some-file-name │ +└────────────────┴────────────────────────────┘ +``` + +## visibleWidth + +テキスト形式(タブ区切り)で値をコンソールに出力するときの幅をおおよそ計算します。この関数はシステムによって[Prettyフォーマット](../../interfaces/formats.md)を実装するために使用されます。 + +`NULL`は`Pretty`フォーマットでの`NULL`に対応する文字列として表現されます。 + +**構文** + +```sql +visibleWidth(x) +``` + +**例** + +クエリ: + +```sql +SELECT visibleWidth(NULL) +``` + +結果: + +```text +┌─visibleWidth(NULL)─┐ +│ 4 │ +└────────────────────┘ +``` + +## toTypeName + +渡された引数の型名を返します。 + +`NULL`が渡された場合、関数はClickHouseの内部`NULL`表現に対応する`Nullable(Nothing)`型を返します。 + +**構文** + +```sql +toTypeName(value) +``` + +**引数** + +- `value` — 任意の型の値。 + +**戻り値** + +- 入力値のデータ型名。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT toTypeName(123); +``` + +結果: + +```response +┌─toTypeName(123)─┐ +│ UInt8 │ +└─────────────────┘ +``` + +## blockSize {#blockSize} + +ClickHouseでは、[ブロック](../../development/architecture.md/#block-block)(チャンク)でクエリが処理されます。この関数は、関数が呼び出されたブロックのサイズ(行数)を返します。 + +**構文** + +```sql +blockSize() +``` + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test (n UInt8) ENGINE = Memory; + +INSERT INTO test +SELECT * FROM system.numbers LIMIT 5; + +SELECT blockSize() +FROM test; +``` + +結果: + +```response + ┌─blockSize()─┐ +1. │ 5 │ +2. │ 5 │ +3. │ 5 │ +4. │ 5 │ +5. │ 5 │ + └─────────────┘ +``` + +## byteSize + +引数の非圧縮バイトサイズの推定値を返します。 + +**構文** + +```sql +byteSize(argument [, ...]) +``` + +**引数** + +- `argument` — 値。 + +**戻り値** + +- メモリ内の引数のバイトサイズの推定値。[UInt64](../data-types/int-uint.md)。 + +**例** + +[String](../data-types/string.md)引数の場合、関数は文字列の長さ+9(終了ゼロ+長さ)を返します。 + +クエリ: + +```sql +SELECT byteSize('string'); +``` + +結果: + +```text +┌─byteSize('string')─┐ +│ 15 │ +└────────────────────┘ +``` + +クエリ: + +```sql +CREATE TABLE test +( + `key` Int32, + `u8` UInt8, + `u16` UInt16, + `u32` UInt32, + `u64` UInt64, + `i8` Int8, + `i16` Int16, + `i32` Int32, + `i64` Int64, + `f32` Float32, + `f64` Float64 +) +ENGINE = MergeTree +ORDER BY key; + +INSERT INTO test VALUES(1, 8, 16, 32, 64, -8, -16, -32, -64, 32.32, 64.64); + +SELECT key, byteSize(u8) AS `byteSize(UInt8)`, byteSize(u16) AS `byteSize(UInt16)`, byteSize(u32) AS `byteSize(UInt32)`, byteSize(u64) AS `byteSize(UInt64)`, byteSize(i8) AS `byteSize(Int8)`, byteSize(i16) AS `byteSize(Int16)`, byteSize(i32) AS `byteSize(Int32)`, byteSize(i64) AS `byteSize(Int64)`, byteSize(f32) AS `byteSize(Float32)`, byteSize(f64) AS `byteSize(Float64)` FROM test ORDER BY key ASC FORMAT Vertical; +``` + +結果: + +```text +Row 1: +────── +key: 1 +byteSize(UInt8): 1 +byteSize(UInt16): 2 +byteSize(UInt32): 4 +byteSize(UInt64): 8 +byteSize(Int8): 1 +byteSize(Int16): 2 +byteSize(Int32): 4 +byteSize(Int64): 8 +byteSize(Float32): 4 +byteSize(Float64): 8 +``` + +関数に複数の引数がある場合、関数はそれらのバイトサイズを累積します。 + +クエリ: + +```sql +SELECT byteSize(NULL, 1, 0.3, ''); +``` + +結果: + +```text +┌─byteSize(NULL, 1, 0.3, '')─┐ +│ 19 │ +└────────────────────────────┘ +``` + +## materialize + +定数を単一の値を含む完全なカラムに変換します。完全なカラムと定数はメモリ内で異なる形で表現されます。 +通常、関数は通常の引数と定数引数に対して異なるコードを実行しますが、結果は通常同じであるべきです。 +この関数はこの動作をデバッグするために使用できます。 + +**構文** + +```sql +materialize(x) +``` + +**パラメータ** + +- `x` — 定数。[Constant](../functions/index.md/#constants)。 + +**戻り値** + +- 単一値`x`を含むカラム。 + +**例** + +以下の例では、`countMatches`関数は定数の第2引数を期待しています。この動作は、定数を完全なカラムに変換する`materialize`関数を使用してデバッグできます。この関数は定数でない引数に対してエラーを投げます。 + +クエリ: + +```sql +SELECT countMatches('foobarfoo', 'foo'); +SELECT countMatches('foobarfoo', materialize('foo')); +``` + +結果: + +```response +2 +Code: 44. DB::Exception: Received from localhost:9000. DB::Exception: Illegal type of argument #2 'pattern' of function countMatches, expected constant String, got String +``` + +## ignore + +任意の引数を受け取り、無条件に`0`を返します。引数は内部的に評価され続けるため、たとえばベンチマークに役立ちます。 + +**構文** + +```sql +ignore([arg1[, arg2[, ...]]) +``` + +**引数** + +- 任意の型、`NULL`を含む任意の多数の引数を受け入れることができます。 + +**戻り値** + +- `0`を返します。 + +**例** + +クエリ: + +```sql +SELECT ignore(0, 'ClickHouse', NULL); +``` + +結果: + +```response +┌─ignore(0, 'ClickHouse', NULL)─┐ +│ 0 │ +└───────────────────────────────┘ +``` + +## sleep + +クエリの実行に遅延や一時停止を導入するために使われます。主にテストやデバッグの目的で使用されます。 + +**構文** + +```sql +sleep(seconds) +``` + +**引数** + +- `seconds`: [UInt*](../data-types/int-uint.md) または [Float](../data-types/float.md) クエリ実行を一時停止する秒数。最大3秒。小数秒を指定するために浮動小数点値を使用できます。 + +**戻り値** + +この関数は値を返しません。 + +**例** + +```sql +SELECT sleep(2); +``` + +この関数は値を返しません。しかし、`clickhouse client`で関数を実行すると、以下のような情報が表示されます: + +```response +SELECT sleep(2) + +Query id: 8aa9943e-a686-45e1-8317-6e8e3a5596ac + +┌─sleep(2)─┐ +│ 0 │ +└──────────┘ + +1 row in set. Elapsed: 2.012 sec. +``` + +このクエリは2秒間の一時停止の後に完了します。この間、結果は返されず、クエリは停止しているか非応答であるように見えます。 + +**実装の詳細** + +`sleep()`関数は通常、クエリのパフォーマンスやシステムの応答性に悪影響を及ぼすため、本番環境では使用されません。しかし、以下のような場合に役立つことがあります: + +1. **テスト**:ClickHouseをテストやベンチマークする際に、遅延をシミュレーションしたり、一時停止を導入してシステムが特定の条件下でどのように動作するかを観察できます。 +2. **デバッグ**:システムの状態やクエリの実行を特定の時点で調べる必要がある場合、`sleep()`を使って一時停止を導入し、関連情報を調べたり収集したりすることができます。 +3. **シミュレーション**:ネットワーク遅延や外部システム依存など、本番環境での遅延や一時停止をシミュレートしたい場合があります。 + +ClickHouseシステムの全体的なパフォーマンスや応答性に影響を与える可能性があるため、`sleep()`関数は必要な場合にのみ、慎重に使用してください。 + +## sleepEachRow + +各行の結果セットに対して指定した秒数だけクエリの実行を一時停止します。 + +**構文** + +```sql +sleepEachRow(seconds) +``` + +**引数** + +- `seconds`: [UInt*](../data-types/int-uint.md) または [Float*](../data-types/float.md) 各行の結果セットのクエリ実行を一時停止する秒数。最大3秒。小数秒を指定するために浮動小数点値を使用できます。 + +**戻り値** + +この関数は入力値を変更せずにそのまま返します。 + +**例** + +```sql +SELECT number, sleepEachRow(0.5) FROM system.numbers LIMIT 5; +``` + +```response +┌─number─┬─sleepEachRow(0.5)─┐ +│ 0 │ 0 │ +│ 1 │ 0 │ +│ 2 │ 0 │ +│ 3 │ 0 │ +│ 4 │ 0 │ +└────────┴───────────────────┘ +``` + +ただし、出力は各行ごとに0.5秒の遅延付きで表示されます。 + +`sleepEachRow()`関数は、主に`sleep()`関数と同様にテストやデバッグの目的で使用されます。 +各行の処理に遅延や一時停止をシミュレーションすることができ、次のようなシナリオで役立ちます: + +1. **テスト**:特定の条件下でのClickHouseのパフォーマンスをテストまたはベンチマークする際に、`sleepEachRow()`を使用して各行処理に遅延や一時停止をシミュレーションできます。 +2. **デバッグ**:各行処理時のシステムの状態やクエリの実行を確認する際に、`sleepEachRow()`を使用して一時停止を挿入し、関連情報を調べたり収集したりできます。 +3. **シミュレーション**:外部システムやネットワーク遅延など、各行処理時の遅延や停止をシミュレートしたい場合があります。 + +[`sleep()`関数](#sleep)と同様に、特に大きな結果セットを扱う場合ClickHouseシステムのパフォーマンスや応答性に大きく影響する可能性があるため、`sleepEachRow()`の使用には注意が必要です。 + + +## currentDatabase + +現在のデータベースの名前を返します。 +`CREATE TABLE`クエリのテーブルエンジンのパラメータでデータベースを指定する必要がある場合に便利です。 + +**構文** + +```sql +currentDatabase() +``` + +**戻り値** + +- 現在のデータベースの名前を返します。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT currentDatabase() +``` + +結果: + +```response +┌─currentDatabase()─┐ +│ default │ +└───────────────────┘ +``` + +## currentUser {#currentUser} + +現在のユーザーの名前を返します。分散クエリの場合、クエリを開始したユーザーの名前が返されます。 + +**構文** + +```sql +currentUser() +``` + +別名: `user()`, `USER()`, `current_user()`。別名は大文字小文字を区別しません。 + +**戻り値** + +- 現在のユーザーの名前。[String](../data-types/string.md)。 +- 分散クエリの場合、クエリを開始したユーザーのログイン。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT currentUser(); +``` + +結果: + +```text +┌─currentUser()─┐ +│ default │ +└───────────────┘ +``` + +## currentSchemas + +現在のデータベーススキーマの名前を含む単一要素の配列を返します。 + +**構文** + +```sql +currentSchemas(bool) +``` + +別名: `current_schemas`. + +**引数** + +- `bool`: ブール値。[Bool](../data-types/boolean.md)。 + +:::note +ブール引数は無視されます。これは、PostgreSQLでの[実装](https://www.postgresql.org/docs/7.3/functions-misc.html)との互換性のために存在します。 +::: + +**戻り値** + +- 現在のデータベース名を含む単一要素の配列を返します。 + +**例** + +```sql +SELECT currentSchemas(true); +``` + +結果: + +```response +['default'] +``` + +## isConstant + +引数が定数式かどうかを返します。 + +定数式とはクエリ解析中、つまり実行前に結果が判明している式を指します。 +例えば、[リテラル](../../sql-reference/syntax.md#literals)に関する式は定数式です。 + +この関数は主に開発、デバッグ、およびデモンストレーションを目的としています。 + +**構文** + +```sql +isConstant(x) +``` + +**引数** + +- `x` — チェックする式。 + +**戻り値** + +- `x`が定数であれば`1`。[UInt8](../data-types/int-uint.md)。 +- `x`が非定数であれば`0`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT isConstant(x + 1) FROM (SELECT 43 AS x) +``` + +結果: + +```text +┌─isConstant(plus(x, 1))─┐ +│ 1 │ +└────────────────────────┘ +``` + +クエリ: + +```sql +WITH 3.14 AS pi SELECT isConstant(cos(pi)) +``` + +結果: + +```text +┌─isConstant(cos(pi))─┐ +│ 1 │ +└─────────────────────┘ +``` + +クエリ: + +```sql +SELECT isConstant(number) FROM numbers(1) +``` + +結果: + +```text +┌─isConstant(number)─┐ +│ 0 │ +└────────────────────┘ +``` + +## hasColumnInTable + +データベース名、テーブル名、カラム名を定数文字列として指定すると、指定カラムが存在する場合は1、存在しない場合は0を返します。 + +**構文** + +```sql +hasColumnInTable(\[‘hostname’\[, ‘username’\[, ‘password’\]\],\] ‘database’, ‘table’, ‘column’) +``` + +**パラメータ** + +- `database` : データベース名。[文字列リテラル](../syntax#syntax-string-literal) +- `table` : テーブル名。[文字列リテラル](../syntax#syntax-string-literal) +- `column` : カラム名。[文字列リテラル](../syntax#syntax-string-literal) +- `hostname` : チェックを行うリモートサーバーの名前。[文字列リテラル](../syntax#syntax-string-literal) +- `username` : リモートサーバーのユーザー名。[文字列リテラル](../syntax#syntax-string-literal) +- `password` : リモートサーバーのパスワード。[文字列リテラル](../syntax#syntax-string-literal) + +**戻り値** + +- 指定カラムが存在する場合は`1`。 +- そうでない場合は`0`。 + +**実装の詳細** + +ネストされたデータ構造の要素の場合、関数はカラムの存在を確認します。ネストされたデータ構造そのものについては、関数は0を返します。 + +**例** + +クエリ: + +```sql +SELECT hasColumnInTable('system','metrics','metric') +``` + +```response +1 +``` + +```sql +SELECT hasColumnInTable('system','metrics','non-existing_column') +``` + +```response +0 +``` + +## hasThreadFuzzer + +スレッドファザーが有効であるかどうかを返します。テストで実行が長くなりすぎるのを防ぐために使用できます。 + +**構文** + +```sql +hasThreadFuzzer(); +``` + +## bar + +棒グラフを構築します。 + +`bar(x, min, max, width)`は、幅が`(x - min)`に比例し、`x = max`のときに`width`文字となるバーを描画します。 + +**引数** + +- `x` — 表示するサイズ。 +- `min, max` — 整数の定数。値は`Int64`に収まる必要があります。 +- `width` — 定数の正の整数であり、分数値を指定できます。 + +バーはシンボルの1/8の精度で描画されます。 + +例: + +```sql +SELECT + toHour(EventTime) AS h, + count() AS c, + bar(c, 0, 600000, 20) AS bar +FROM test.hits +GROUP BY h +ORDER BY h ASC +``` + +```text +┌──h─┬──────c─┬─bar────────────────┐ +│ 0 │ 292907 │ █████████▋ │ +│ 1 │ 180563 │ ██████ │ +│ 2 │ 114861 │ ███▋ │ +│ 3 │ 85069 │ ██▋ │ +│ 4 │ 68543 │ ██▎ │ +│ 5 │ 78116 │ ██▌ │ +│ 6 │ 113474 │ ███▋ │ +│ 7 │ 170678 │ █████▋ │ +│ 8 │ 278380 │ █████████▎ │ +│ 9 │ 391053 │ █████████████ │ +│ 10 │ 457681 │ ███████████████▎ │ +│ 11 │ 493667 │ ████████████████▍ │ +│ 12 │ 509641 │ ████████████████▊ │ +│ 13 │ 522947 │ █████████████████▍ │ +│ 14 │ 539954 │ █████████████████▊ │ +│ 15 │ 528460 │ █████████████████▌ │ +│ 16 │ 539201 │ █████████████████▊ │ +│ 17 │ 523539 │ █████████████████▍ │ +│ 18 │ 506467 │ ████████████████▊ │ +│ 19 │ 520915 │ █████████████████▎ │ +│ 20 │ 521665 │ █████████████████▍ │ +│ 21 │ 542078 │ ██████████████████ │ +│ 22 │ 493642 │ ████████████████▍ │ +│ 23 │ 400397 │ █████████████▎ │ +└────┴────────┴────────────────────┘ +``` + +## transform + +要素のいくつかを他のものに明示的に定義されたマッピングに従って、値を変換します。 +この関数には2つのバリエーションがあります: + +### transform(x, array_from, array_to, default) + +`x` – 変換対象。 + +`array_from` – 変換する値の定数配列。 + +`array_to` – `from`の値を変換するための定数配列。 + +`default` – `x`が`from`内のいずれの値とも等しくない場合に使用する値。 + +`array_from`と`array_to`は同じ数の要素を持っている必要があります。 + +シグネチャ: + +`x`が`array_from`の要素の一つに等しい場合、関数は`array_to`の対応する要素を返します。 +すなわち、同じ配列インデックスの要素です。そうでない場合、`default`を返します。`array_from`に複数の一致する要素が存在する場合、最初の要素に対応するものを返します。 + +`transform(T, Array(T), Array(U), U) -> U` + +`T`と`U`は数値型、文字列型、またはDateやDateTime型のいずれかです。 同じ文字(TまたはU)とは、型が相互に互換性があるが、必ずしも等しいわけではないことを意味します。 +例として、最初の引数が`Int64`型で、2番目の引数が`Array(UInt16)`型であることができます。 + +例: + +```sql +SELECT + transform(SearchEngineID, [2, 3], ['Yandex', 'Google'], 'Other') AS title, + count() AS c +FROM test.hits +WHERE SearchEngineID != 0 +GROUP BY title +ORDER BY c DESC +``` + +```text +┌─title─────┬──────c─┐ +│ Yandex │ 498635 │ +│ Google │ 229872 │ +│ Other │ 104472 │ +└───────────┴────────┘ +``` + +### transform(x, array_from, array_to) + +`default`引数がないことを除いて他のバリエーションと類似しています。一致が見つからない場合、`x`が返されます。 + +例: + +```sql +SELECT + transform(domain(Referer), ['yandex.ru', 'google.ru', 'vkontakte.ru'], ['www.yandex', 'example.com', 'vk.com']) AS s, + count() AS c +FROM test.hits +GROUP BY domain(Referer) +ORDER BY count() DESC +LIMIT 10 +``` + +```text +┌─s──────────────┬───────c─┐ +│ │ 2906259 │ +│ www.yandex │ 867767 │ +│ ███████.ru │ 313599 │ +│ mail.yandex.ru │ 107147 │ +│ ██████.ru │ 100355 │ +│ █████████.ru │ 65040 │ +│ news.yandex.ru │ 64515 │ +│ ██████.net │ 59141 │ +│ example.com │ 57316 │ +└────────────────┴─────────┘ +``` + +## formatReadableDecimalSize + +サイズ(バイト数)を指定すると、この関数は小数サイズを持つ読みやすいサイズを文字列として返します(KB、MBなどの単位付き)。 + +この関数の逆操作は[parseReadableSize](#parsereadablesize)、[parseReadableSizeOrZero](#parsereadablesizeorzero)、および[parseReadableSizeOrNull](#parsereadablesizeornull)です。 + +**構文** + +```sql +formatReadableDecimalSize(x) +``` + +**例** + +クエリ: + +```sql +SELECT + arrayJoin([1, 1024, 1024*1024, 192851925]) AS filesize_bytes, + formatReadableDecimalSize(filesize_bytes) AS filesize +``` + +結果: + +```text +┌─filesize_bytes─┬─filesize───┐ +│ 1 │ 1.00 B │ +│ 1024 │ 1.02 KB │ +│ 1048576 │ 1.05 MB │ +│ 192851925 │ 192.85 MB │ +└────────────────┴────────────┘ +``` + +## formatReadableSize + +サイズ(バイト数)を指定すると、この関数は読みやすく丸められたサイズを文字列として返します(KiB、MiBなどの単位付き)。 + +この関数の逆操作は[parseReadableSize](#parsereadablesize)、[parseReadableSizeOrZero](#parsereadablesizeorzero)、および[parseReadableSizeOrNull](#parsereadablesizeornull)です。 + +**構文** + +```sql +formatReadableSize(x) +``` +別名: `FORMAT_BYTES`. + +**例** + +クエリ: + +```sql +SELECT + arrayJoin([1, 1024, 1024*1024, 192851925]) AS filesize_bytes, + formatReadableSize(filesize_bytes) AS filesize +``` + +結果: + +```text +┌─filesize_bytes─┬─filesize───┐ +│ 1 │ 1.00 B │ +│ 1024 │ 1.00 KiB │ +│ 1048576 │ 1.00 MiB │ +│ 192851925 │ 183.92 MiB │ +└────────────────┴────────────┘ +``` + +## formatReadableQuantity + +数を指定すると、この関数は丸められた数を文字列として返します(千、百万、十億などの接尾辞付き)。 + +**構文** + +```sql +formatReadableQuantity(x) +``` + +**例** + +クエリ: + +```sql +SELECT + arrayJoin([1024, 1234 * 1000, (4567 * 1000) * 1000, 98765432101234]) AS number, + formatReadableQuantity(number) AS number_for_humans +``` + +結果: + +```text +┌─────────number─┬─number_for_humans─┐ +│ 1024 │ 1.02 thousand │ +│ 1234000 │ 1.23 million │ +│ 4567000000 │ 4.57 billion │ +│ 98765432101234 │ 98.77 trillion │ +└────────────────┴───────────────────┘ +``` + +## formatReadableTimeDelta + +秒単位の時間間隔(デルタ)を指定すると、この関数は年/月/日/時/分/秒/ミリ秒/マイクロ秒/ナノ秒として時間デルタを文字列として返します。 + +**構文** + +```sql +formatReadableTimeDelta(column[, maximum_unit, minimum_unit]) +``` + +**引数** + +- `column` — 数値の時間デルタを持つカラム。 +- `maximum_unit` — 任意。最大表示単位。 + - 受け入れられる値:`nanoseconds`, `microseconds`, `milliseconds`, `seconds`, `minutes`, `hours`, `days`, `months`, `years`. + - デフォルト値:`years`. +- `minimum_unit` — 任意。最小表示単位。より小さい単位は切り捨てられます。 + - 受け入れられる値:`nanoseconds`, `microseconds`, `milliseconds`, `seconds`, `minutes`, `hours`, `days`, `months`, `years`. + - 明示的に指定された値が`maximum_unit`より大きい場合、例外が投げられます。 + - デフォルト値:`maximum_unit`が`seconds`以上の場合は`seconds`, それ以外の場合は`nanoseconds`. + +**例** + +```sql +SELECT + arrayJoin([100, 12345, 432546534]) AS elapsed, + formatReadableTimeDelta(elapsed) AS time_delta +``` + +```text +┌────elapsed─┬─time_delta ─────────────────────────────────────────────────────┐ +│ 100 │ 1 minute and 40 seconds │ +│ 12345 │ 3 hours, 25 minutes and 45 seconds │ +│ 432546534 │ 13 years, 8 months, 17 days, 7 hours, 48 minutes and 54 seconds │ +└────────────┴─────────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT + arrayJoin([100, 12345, 432546534]) AS elapsed, + formatReadableTimeDelta(elapsed, 'minutes') AS time_delta +``` + +```text +┌────elapsed─┬─time_delta ─────────────────────────────────────────────────────┐ +│ 100 │ 1 minute and 40 seconds │ +│ 12345 │ 205 minutes and 45 seconds │ +│ 432546534 │ 7209108 minutes and 54 seconds │ +└────────────┴─────────────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT + arrayJoin([100, 12345, 432546534.00000006]) AS elapsed, + formatReadableTimeDelta(elapsed, 'minutes', 'nanoseconds') AS time_delta +``` + +```text +┌────────────elapsed─┬─time_delta─────────────────────────────────────┐ +│ 100 │ 1 minute and 40 seconds │ +│ 12345 │ 205 minutes and 45 seconds │ +│ 432546534.00000006 │ 7209108 minutes, 54 seconds and 60 nanoseconds │ +└────────────────────┴────────────────────────────────────────────────┘ +``` + +## parseReadableSize + +バイトサイズと`B`、`KiB`、`KB`、`MiB`、`MB`などの単位(例:[ISO/IEC 80000-13](https://en.wikipedia.org/wiki/ISO/IEC_80000) または小数バイト単位)を含む文字列を指定すると、この関数は対応するバイト数を返します。 +入力値を解析できない場合、例外がスローされます。 + +この関数の逆操作は[formatReadableSize](#formatreadablesize) と [formatReadableDecimalSize](#formatreadabledecimalsize)です。 + +**構文** + +```sql +parseReadableSize(x) +``` + +**引数** + +- `x` : ISO/IEC 80000-13または小数バイト単位での読みやすいサイズ ([String](../../sql-reference/data-types/string.md))。 + +**戻り値** + +- バイト数、最も近い整数に切り上げられる ([UInt64](../../sql-reference/data-types/int-uint.md))。 + +**例** + +```sql +SELECT + arrayJoin(['1 B', '1 KiB', '3 MB', '5.314 KiB']) AS readable_sizes, + parseReadableSize(readable_sizes) AS sizes; +``` + +```text +┌─readable_sizes─┬───sizes─┐ +│ 1 B │ 1 │ +│ 1 KiB │ 1024 │ +│ 3 MB │ 3000000 │ +│ 5.314 KiB │ 5442 │ +└────────────────┴─────────┘ +``` + +## parseReadableSizeOrNull + +バイトサイズと`B`、`KiB`、`KB`、`MiB`、`MB`などの単位(例:[ISO/IEC 80000-13](https://en.wikipedia.org/wiki/ISO/IEC_80000) 或いは小数バイト単位)を含む文字列を指定すると、この関数は対応するバイト数を返します。 +入力値を解析できない場合、`NULL`を返します。 + +この関数の逆操作は[formatReadableSize](#formatreadablesize) と[formatReadableDecimalSize](#formatreadabledecimalsize)です。 + +**構文** + +```sql +parseReadableSizeOrNull(x) +``` + +**引数** + +- `x` : ISO/IEC 80000-13或いは小数バイト単位での読みやすいサイズ ([String](../../sql-reference/data-types/string.md))。 + +**戻り値** + +- バイト数,最も近い整数に切り上げられる,あるいは入力を解析できない場合はNULL(Nullable([UInt64](../../sql-reference/data-types/int-uint.md)))。 + +**例** + +```sql +SELECT + arrayJoin(['1 B', '1 KiB', '3 MB', '5.314 KiB', 'invalid']) AS readable_sizes, + parseReadableSizeOrNull(readable_sizes) AS sizes; +``` + +```text +┌─readable_sizes─┬───sizes─┐ +│ 1 B │ 1 │ +│ 1 KiB │ 1024 │ +│ 3 MB │ 3000000 │ +│ 5.314 KiB │ 5442 │ +│ invalid │ ᴺᵁᴸᴸ │ +└────────────────┴─────────┘ +``` + +## parseReadableSizeOrZero + +バイトサイズと`B`、`KiB`、`KB`、`MiB`、`MB`などの単位(例:[ISO/IEC 80000-13](https://en.wikipedia.org/wiki/ISO/IEC_80000) または小数バイト単位)を含む文字列を指定すると、この関数は対応するバイト数を返します。入力値を解析できない場合、`0`を返します。 + +この関数の逆操作は[formatReadableSize](#formatreadablesize)と[formatReadableDecimalSize](#formatreadabledecimalsize)です。 + + +**構文** + +```sql +parseReadableSizeOrZero(x) +``` + +**引数** + +- `x` : ISO/IEC 80000-13または小数バイト単位での読みやすいサイズ ([String](../../sql-reference/data-types/string.md))。 + +**戻り値** + +- バイト数、最も近い整数に切り上げられる、または入力を解析できない場合は0 ([UInt64](../../sql-reference/data-types/int-uint.md))。 + +**例** + +```sql +SELECT + arrayJoin(['1 B', '1 KiB', '3 MB', '5.314 KiB', 'invalid']) AS readable_sizes, + parseReadableSizeOrZero(readable_sizes) AS sizes; +``` + +```text +┌─readable_sizes─┬───sizes─┐ +│ 1 B │ 1 │ +│ 1 KiB │ 1024 │ +│ 3 MB │ 3000000 │ +│ 5.314 KiB │ 5442 │ +│ invalid │ 0 │ +└────────────────┴─────────┘ +``` + +## parseTimeDelta + +数字の連続したものと、時間の単位に似たものを解析します。 + +**構文** + +```sql +parseTimeDelta(timestr) +``` + +**引数** + +- `timestr` — 数字の連続したものと、時間の単位に似たもの。 + +**戻り値** + +- 浮動小数点数で表される秒数。 + +**例** + +```sql +SELECT parseTimeDelta('11s+22min') +``` + +```text +┌─parseTimeDelta('11s+22min')─┐ +│ 1331 │ +└─────────────────────────────┘ +``` + +```sql +SELECT parseTimeDelta('1yr2mo') +``` + +```text +┌─parseTimeDelta('1yr2mo')─┐ +│ 36806400 │ +└──────────────────────────┘ +``` + +## least + +aとbのうち、小さい値を返します。 + +**構文** + +```sql +least(a, b) +``` + +## greatest + +aとbのうち、大きい値を返します。 + +**構文** + +```sql +greatest(a, b) +``` + +## uptime + +サーバーの稼働時間を秒単位で返します。 +関数が分散テーブルのコンテキストで実行された場合、各シャードに関連する値を持つ通常のカラムを生成します。そうでなければ定数値を生成します。 + +**構文** + +``` sql +uptime() +``` + +**戻り値** + +- 秒数の時間値。[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT uptime() as Uptime; +``` + +結果: + +``` response +┌─Uptime─┐ +│ 55867 │ +└────────┘ +``` + +## version + +ClickHouseの現在のバージョンを以下の形式で文字列として返します: + +- メジャーバージョン +- マイナーバージョン +- パッチバージョン +- 前の安定リリースからのコミット数 + +```plaintext +メジャーバージョン.マイナーバージョン.パッチバージョン.前の安定リリースからのコミット数 +``` + +関数が分散テーブルのコンテキストで実行された場合、各シャードに関連する値を持つ通常のカラムを生成します。そうでなければ定数値を生成します。 + +**構文** + +```sql +version() +``` + +**引数** + +なし。 + +**戻り値** + +- ClickHouseの現在バージョン。[String](../data-types/string)。 + +**実装の詳細** + +なし。 + +**例** + +クエリ: + +```sql +SELECT version() +``` + +**結果**: + +```response +┌─version()─┐ +│ 24.2.1.1 │ +└───────────┘ +``` + +## buildId + +現在動作しているClickHouseサーバーバイナリのコンパイラによって生成されたビルドIDを返します。 +分散テーブルのコンテキストで実行された場合、各シャードに関連する値を持つ通常のカラムを生成します。それ以外の場合は定数値を生成します。 + +**構文** + +```sql +buildId() +``` + +## blockNumber + +[ブロック](../../development/architecture.md#block) の行を含む単調に増加するシーケンス番号を返します。 +返されるブロック番号はベストエフォートベースで更新されます。つまり、完全に正確でない場合があります。 + +**構文** + +```sql +blockNumber() +``` + +**戻り値** + +- 行が存在するデータブロックのシーケンス番号。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT blockNumber() +FROM +( + SELECT * + FROM system.numbers + LIMIT 10 +) SETTINGS max_block_size = 2 +``` + +結果: + +```response +┌─blockNumber()─┐ +│ 7 │ +│ 7 │ +└───────────────┘ +┌─blockNumber()─┐ +│ 8 │ +│ 8 │ +└───────────────┘ +┌─blockNumber()─┐ +│ 9 │ +│ 9 │ +└───────────────┘ +┌─blockNumber()─┐ +│ 10 │ +│ 10 │ +└───────────────┘ +┌─blockNumber()─┐ +│ 11 │ +│ 11 │ +└───────────────┘ +``` + +## rowNumberInBlock {#rowNumberInBlock} + +各処理された[ブロック](../../development/architecture.md#block)に対して、現在の行の番号を返します。この番号は各ブロックで0から始まります。 + +**構文** + +```sql +rowNumberInBlock() +``` + +**戻り値** + +- データブロックの行の序数で0から始まります。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT rowNumberInBlock() +FROM +( + SELECT * + FROM system.numbers_mt + LIMIT 10 +) SETTINGS max_block_size = 2 +``` + +結果: + +```response +┌─rowNumberInBlock()─┐ +│ 0 │ +│ 1 │ +└────────────────────┘ +┌─rowNumberInBlock()─┐ +│ 0 │ +│ 1 │ +└────────────────────┘ +┌─rowNumberInBlock()─┐ +│ 0 │ +│ 1 │ +└────────────────────┘ +┌─rowNumberInBlock()─┐ +│ 0 │ +│ 1 │ +└────────────────────┘ +┌─rowNumberInBlock()─┐ +│ 0 │ +│ 1 │ +└────────────────────┘ +``` + +## rowNumberInAllBlocks + +`rowNumberInAllBlocks`によって処理された各行に対して一意の行番号を返します。返される番号は0から始まります。 + +**構文** + +```sql +rowNumberInAllBlocks() +``` + +**戻り値** + +- データブロックの行の序数で0から始まります。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT rowNumberInAllBlocks() +FROM +( + SELECT * + FROM system.numbers_mt + LIMIT 10 +) +SETTINGS max_block_size = 2 +``` + +結果: + +```response +┌─rowNumberInAllBlocks()─┐ +│ 0 │ +│ 1 │ +└────────────────────────┘ +┌─rowNumberInAllBlocks()─┐ +│ 4 │ +│ 5 │ +└────────────────────────┘ +┌─rowNumberInAllBlocks()─┐ +│ 2 │ +│ 3 │ +└────────────────────────┘ +┌─rowNumberInAllBlocks()─┐ +│ 6 │ +│ 7 │ +└────────────────────────┘ +┌─rowNumberInAllBlocks()─┐ +│ 8 │ +│ 9 │ +└────────────────────────┘ +``` + +## neighbor + +指定されたオフセット前または後の行を特定のカラムから取得するウィンドウ関数です。 + +**構文** + +```sql +neighbor(column, offset[, default_value]) +``` + +関数の結果は影響を受けるデータブロックとブロック内のデータの順序によります。 + +:::note +現在処理しているデータブロックの中でのみ近傍を返します。誤りやすい動作のため、関数は非推奨です。 +適切なウィンドウ関数を使用してください。 +::: + +`neighbor()`の計算中の行の順序は、ユーザーに返される行の順序と異なる場合があります。 +これを防ぐためには、[ORDER BY](../../sql-reference/statements/select/order-by.md)を使用してサブクエリを作成し、サブクエリの外部から関数を呼び出すことができます。 + +**引数** + +- `column` — カラム名またはスカラー式。 +- `offset` — `column`内で現在の行から前または先の行を探す行数。[Int64](../data-types/int-uint.md)。 +- `default_value` — 任意。オフセットがブロック境界を超えた場合の返される値。影響を受けたデータブロックの型。 + +**戻り値** + +- オフセットがブロック境界を超えなければ、現在の行からオフセット距離の`column`の値。 +- オフセットがブロック境界を超えるときの`column`のデフォルト値または`default_value`(指定されている場合)。 + +:::note +戻り値の型は影響を受けたデータブロックの型またはデフォルト値の型です。 +::: + +**例** + +クエリ: + +```sql +SELECT number, neighbor(number, 2) FROM system.numbers LIMIT 10; +``` + +結果: + +```text +┌─number─┬─neighbor(number, 2)─┐ +│ 0 │ 2 │ +│ 1 │ 3 │ +│ 2 │ 4 │ +│ 3 │ 5 │ +│ 4 │ 6 │ +│ 5 │ 7 │ +│ 6 │ 8 │ +│ 7 │ 9 │ +│ 8 │ 0 │ +│ 9 │ 0 │ +└────────┴─────────────────────┘ +``` + +クエリ: + +```sql +SELECT number, neighbor(number, 2, 999) FROM system.numbers LIMIT 10; +``` + +結果: + +```text +┌─number─┬─neighbor(number, 2, 999)─┐ +│ 0 │ 2 │ +│ 1 │ 3 │ +│ 2 │ 4 │ +│ 3 │ 5 │ +│ 4 │ 6 │ +│ 5 │ 7 │ +│ 6 │ 8 │ +│ 7 │ 9 │ +│ 8 │ 999 │ +│ 9 │ 999 │ +└────────┴──────────────────────────┘ +``` + +この関数は年々のメトリクス値を計算するために使用できます: + +クエリ: + +```sql +WITH toDate('2018-01-01') AS start_date +SELECT + toStartOfMonth(start_date + (number * 32)) AS month, + toInt32(month) % 100 AS money, + neighbor(money, -12) AS prev_year, + round(prev_year / money, 2) AS year_over_year +FROM numbers(16) +``` + +結果: + +```text +┌──────month─┬─money─┬─prev_year─┬─year_over_year─┐ +│ 2018-01-01 │ 32 │ 0 │ 0 │ +│ 2018-02-01 │ 63 │ 0 │ 0 │ +│ 2018-03-01 │ 91 │ 0 │ 0 │ +│ 2018-04-01 │ 22 │ 0 │ 0 │ +│ 2018-05-01 │ 52 │ 0 │ 0 │ +│ 2018-06-01 │ 83 │ 0 │ 0 │ +│ 2018-07-01 │ 13 │ 0 │ 0 │ +│ 2018-08-01 │ 44 │ 0 │ 0 │ +│ 2018-09-01 │ 75 │ 0 │ 0 │ +│ 2018-10-01 │ 5 │ 0 │ 0 │ +│ 2018-11-01 │ 36 │ 0 │ 0 │ +│ 2018-12-01 │ 66 │ 0 │ 0 │ +│ 2019-01-01 │ 97 │ 32 │ 0.33 │ +│ 2019-02-01 │ 28 │ 63 │ 2.25 │ +│ 2019-03-01 │ 56 │ 91 │ 1.62 │ +│ 2019-04-01 │ 87 │ 22 │ 0.25 │ +└────────────┴───────┴───────────┴────────────────┘ +``` + +## runningDifference {#runningDifference} + +データブロック内の2つの連続する行の値の差を計算します。 +最初の行には0を返し、以降の行には1つ前の行との差を返します。 + +:::note +現在処理しているデータブロックの中でのみ差分を返します。 +誤りやすい動作のため、関数は非推奨です。適切なウィンドウ関数を使用してください。 +::: + +関数の結果は影響を受けるデータブロックとブロック内のデータの順序によります。 + +`runningDifference()`の計算中の行の順序は、ユーザーに返される行の順序と異なる場合があります。 +これを防ぐためには、[ORDER BY](../../sql-reference/statements/select/order-by.md)を使用してサブクエリを作成し、サブクエリの外部から関数を呼び出すことができます。 + +**構文** + +```sql +runningDifference(x) +``` + +**例** + +クエリ: + +```sql +SELECT + EventID, + EventTime, + runningDifference(EventTime) AS delta +FROM +( + SELECT + EventID, + EventTime + FROM events + WHERE EventDate = '2016-11-24' + ORDER BY EventTime ASC + LIMIT 5 +) +``` + +結果: + +```text +┌─EventID─┬───────────EventTime─┬─delta─┐ +│ 1106 │ 2016-11-24 00:00:04 │ 0 │ +│ 1107 │ 2016-11-24 00:00:05 │ 1 │ +│ 1108 │ 2016-11-24 00:00:05 │ 0 │ +│ 1109 │ 2016-11-24 00:00:09 │ 4 │ +│ 1110 │ 2016-11-24 00:00:10 │ 1 │ +└─────────┴─────────────────────┴───────┘ +``` + +ブロックサイズが結果に影響を与えることに注意してください。 +`runningDifference`の内部状態は新しいブロックごとにリセットされます。 + +クエリ: + +```sql +SELECT + number, + runningDifference(number + 1) AS diff +FROM numbers(100000) +WHERE diff != 1 +``` + +結果: + +```text +┌─number─┬─diff─┐ +│ 0 │ 0 │ +└────────┴──────┘ +┌─number─┬─diff─┐ +│ 65536 │ 0 │ +└────────┴──────┘ +``` + +クエリ: + +```sql +set max_block_size=100000 -- デフォルト値は65536です! + +SELECT + number, + runningDifference(number + 1) AS diff +FROM numbers(100000) +WHERE diff != 1 +``` + +結果: + +```text +┌─number─┬─diff─┐ +│ 0 │ 0 │ +└────────┴──────┘ +``` + +## runningDifferenceStartingWithFirstValue + +:::note +この関数はDEPRECATEDです(`runningDifference`の注釈を参照)。 +::: + +最初の行の値を最初の行に返す以外は、[runningDifference](./other-functions.md#other_functions-runningdifference)と同じです。 + +## runningConcurrency + +同時に発生するイベントの数を計算します。 +各イベントには開始時間と終了時間があります。 +開始時間はイベントに含まれていますが、終了時間は除外されています。列の開始時間と終了時間は同じデータ型でなければなりません。 +関数は、各イベントの開始時間に対してアクティブ(並行)のイベントの総数を計算します。 + +:::tip +イベントは開始時間で昇順に並べられている必要があります。この要件が満たされない場合、関数は例外をスローします。 +すべてのデータブロックは別々に処理されます。異なるデータブロックからのイベントが重なる場合、それらは正しく処理されません。 +::: + +**構文** + +```sql +runningConcurrency(start, end) +``` + +**引数** + +- `start` — イベントの開始時間を持つカラム。[Date](../data-types/date.md), [DateTime](../data-types/datetime.md), または [DateTime64](../data-types/datetime64.md)。 +- `end` — イベントの終了時間を持つカラム。[Date](../data-types/date.md), [DateTime](../data-types/datetime.md), または [DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +- 各イベントの開始時間における同時に発生しているイベントの数。[UInt32](../data-types/int-uint.md) + +**例** + +表は: + +```text +┌──────start─┬────────end─┐ +│ 2021-03-03 │ 2021-03-11 │ +│ 2021-03-06 │ 2021-03-12 │ +│ 2021-03-07 │ 2021-03-08 │ +│ 2021-03-11 │ 2021-03-12 │ +└────────────┴────────────┘ +``` + +クエリ: + +```sql +SELECT start, runningConcurrency(start, end) FROM example_table; +``` + +結果: + +```text +┌──────start─┬─runningConcurrency(start, end)─┐ +│ 2021-03-03 │ 1 │ +│ 2021-03-06 │ 2 │ +│ 2021-03-07 │ 3 │ +│ 2021-03-11 │ 2 │ +└────────────┴────────────────────────────────┘ +``` + +## MACNumToString + +UInt64数値をビッグエンディアン形式のMACアドレスとして解釈します。 +対応するMACアドレスをAA:BB:CC:DD:EE:FF(コロンで区切った16進数)形式で文字列として返します。 + +**構文** + +```sql +MACNumToString(num) +``` + +## MACStringToNum + +MACNumToStringの逆関数です。MACアドレスが無効な形式の場合、0を返します。 + +**構文** + +```sql +MACStringToNum(s) +``` + +## MACStringToOUI + +MACアドレスをAA:BB:CC:DD:EE:FF(コロンで区切った16進数)形式で指定すると、最初の3オクテットをUInt64数値として返します。 +MACアドレスが無効な形式の場合、0を返します。 + +**構文** + +```sql +MACStringToOUI(s) +``` + +## getSizeOfEnumType + +[Enum](../data-types/enum.md)型のフィールドの数を返します。 +型が`Enum`でない場合、例外がスローされます。 + +**構文** + +```sql +getSizeOfEnumType(value) +``` + +**引数:** + +- `value` — `Enum`型の値。 + +**戻り値** + +- `Enum`型入力値のフィールド数を返します。 + +**例** + +```sql +SELECT getSizeOfEnumType( CAST('a' AS Enum8('a' = 1, 'b' = 2) ) ) AS x +``` + +```text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## blockSerializedSize + +圧縮を考慮せずにディスク上のサイズを返します。 + +```sql +blockSerializedSize(value[, value[, ...]]) +``` + +**引数** + +- `value` — 任意の値。 + +**戻り値** + +- ブロックの値を書き込むためにディスクに書き込まれるバイト数を返します。ただし、圧縮を考慮しません。 + +**例** + +クエリ: + +```sql +SELECT blockSerializedSize(maxState(1)) as x +``` + +結果: + +```text +┌─x─┐ +│ 2 │ +└───┘ +``` + +## toColumnTypeName + +値を表しているデータ型の内部名を返します。 + +**構文** + +```sql +toColumnTypeName(value) +``` + +**引数:** + +- `value` — 任意の型の値。 + +**戻り値** + +- `value`を表すために使用される内部データ型名。 + +**例** + +`toTypeName`と`toColumnTypeName`の違い: + +```sql +SELECT toTypeName(CAST('2018-01-01 01:02:03' AS DateTime)) +``` + +結果: + +```text +┌─toTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ DateTime │ +└─────────────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT toColumnTypeName(CAST('2018-01-01 01:02:03' AS DateTime)) +``` + +結果: + +```text +┌─toColumnTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ Const(UInt32) │ +└───────────────────────────────────────────────────────────┘ +``` + +例は`DateTime`データ型が内部的に`Const(UInt32)`として格納されていることを示しています。 + +## dumpColumnStructure + +RAM内のデータ構造の詳細な説明を出力します。 + +```sql +dumpColumnStructure(value) +``` + +**引数:** + +- `value` — 任意の型の値。 + +**戻り値** + +- `value`を表すために使用されるカラム構造の説明。 + +**例** + +```sql +SELECT dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime')) +``` + +```text +┌─dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))─┐ +│ DateTime, Const(size = 1, UInt32(size = 1)) │ +└──────────────────────────────────────────────────────────────┘ +``` + +## defaultValueOfArgumentType + +指定されたデータ型に対するデフォルト値を返します。 + +ユーザーが設定したカスタムカラムのデフォルト値は含まれません。 + +**構文** + +```sql +defaultValueOfArgumentType(expression) +``` + +**引数:** + +- `expression` — 任意の型か任意の型の値を結果とする式。 + +**戻り値** + +- 数値の場合は`0`。 +- 文字列の場合は空文字列。 +- [Nullable](../data-types/nullable.md)の場合は`ᴺᵁᴸᴸ`。 + +**例** + +クエリ: + +```sql +SELECT defaultValueOfArgumentType( CAST(1 AS Int8) ) +``` + +結果: + +```text +┌─defaultValueOfArgumentType(CAST(1, 'Int8'))─┐ +│ 0 │ +└─────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT defaultValueOfArgumentType( CAST(1 AS Nullable(Int8) ) ) +``` + +結果: + +```text +┌─defaultValueOfArgumentType(CAST(1, 'Nullable(Int8)'))─┐ +│ ᴺᵁᴸᴸ │ +└───────────────────────────────────────────────────────┘ +``` + +## defaultValueOfTypeName + +指定された型名に対するデフォルト値を返します。 + +ユーザーが設定したカスタムカラムのデフォルト値は含まれません。 + +```sql +defaultValueOfTypeName(type) +``` + +**引数:** + +- `type` — 型名を表す文字列。 + +**戻り値** + +- 数値の場合は`0`。 +- 文字列の場合は空文字列。 +- [Nullable](../data-types/nullable.md)の場合は`ᴺᵁᴸᴸ`。 + +**例** + +クエリ: + +```sql +SELECT defaultValueOfTypeName('Int8') +``` + +結果: + +```text +┌─defaultValueOfTypeName('Int8')─┐ +│ 0 │ +└────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT defaultValueOfTypeName('Nullable(Int8)') +``` + +結果: + +```text +┌─defaultValueOfTypeName('Nullable(Int8)')─┐ +│ ᴺᵁᴸᴸ │ +└──────────────────────────────────────────┘ +``` + +## indexHint + +この関数はデバッグとイントロスペクションを目的としています。引数を無視して常に1を返します。引数は評価されません。 + +ただし、インデックス分析中にこの関数の引数は`indexHint`でラップされていないと仮定されます。 +これにより、対応する条件でインデックス範囲のデータを選択できますが、その条件によるさらなるフィルタリングは行いません。ClickHouseのインデックスはスパースであり、`indexHint`を使用すると、同じ条件を直接指定した場合よりも多くのデータが得られます。 + +**構文** + +```sql +SELECT * FROM table WHERE indexHint() +``` + +**戻り値** + +- `1`。[Uint8](../data-types/int-uint.md)。 + +**例** + +次は、テーブル[ontime](../../getting-started/example-datasets/ontime.md)のテストデータの例です。 + +テーブル: + +```sql +SELECT count() FROM ontime +``` + +```text +┌─count()─┐ +│ 4276457 │ +└─────────┘ +``` + +テーブルはフィールド`(FlightDate, (Year, FlightDate))`にインデックスを持っています。 + +インデックスを使用しないクエリを作成します: + +```sql +SELECT FlightDate AS k, count() FROM ontime GROUP BY k ORDER BY k +``` + +ClickHouseはテーブル全体を処理します(`約428万行処理済み`)。 + +結果: + +```text +┌──────────k─┬─count()─┐ +│ 2017-01-01 │ 13970 │ +│ 2017-01-02 │ 15882 │ +........................ +│ 2017-09-28 │ 16411 │ +│ 2017-09-29 │ 16384 │ +│ 2017-09-30 │ 12520 │ +└────────────┴─────────┘ +``` + +インデックスを適用するには、特定の日付を選択します: + +```sql +SELECT FlightDate AS k, count() FROM ontime WHERE k = '2017-09-15' GROUP BY k ORDER BY k +``` + +ClickHouse現在ではインデックスを利用し、はるかに少ない行数(`32,740行処理済み`)を処理します。 + +結果: + +```text +┌──────────k─┬─count()─┐ +│ 2017-09-15 │ 16428 │ +└────────────┴─────────┘ +``` + +今、式`k = '2017-09-15'`を関数`indexHint`でラップします: + +クエリ: + +```sql +SELECT + FlightDate AS k, + count() +FROM ontime +WHERE indexHint(k = '2017-09-15') +GROUP BY k +ORDER BY k ASC +``` + +ClickHouseは前回と同様にインデックスを使用しました(`32,740行処理済み`)。 +結果を生成する際に`k = '2017-09-15'`の式は使用されませんでした。例では、`indexHint`関数を使用して隣接する日付を確認できます。 + +結果: + +```text +┌──────────k─┬─count()─┐ +│ 2017-09-14 │ 7071 │ +│ 2017-09-15 │ 16428 │ +│ 2017-09-16 │ 1077 │ +│ 2017-09-30 │ 8167 │ +└────────────┴─────────┘ +``` + +## replicate + +単一の値を持つ配列を作成します。 + +:::note +この関数は[配列結合](../../sql-reference/functions/array-join.md#functions_arrayjoin)の内部実装に使用されます。 +::: + +**構文** + +```sql +replicate(x, arr) +``` + +**引数** + +- `x` — 結果配列を埋める値。 +- `arr` — 配列。[Array](../data-types/array.md)。 + +**戻り値** + +`arr`と同じ長さで値`x`で満たされた配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +```sql +SELECT replicate(1, ['a', 'b', 'c']); +``` + +結果: + +```text +┌─replicate(1, ['a', 'b', 'c'])─┐ +│ [1,1,1] │ +└───────────────────────────────┘ +``` + +## revision + +現在のClickHouse [サーバリビジョン](../../operations/system-tables/metrics#revision)を返します。 + +**構文** + +```sql +revision() +``` + +**戻り値** + +- 現在のClickHouseサーバーリビジョン。[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT revision(); +``` + +結果: + +```response +┌─revision()─┐ +│ 54485 │ +└────────────┘ +``` + + +## filesystemAvailable + +データベースの永続化をホスティングしているファイルシステムの空きスペースを返します。返される値は、オペレーティングシステムのために予約されているため、常に合計の空きスペース ([filesystemFree](#filesystemfree)) よりも小さくなります。 + +**構文** + +```sql +filesystemAvailable() +``` + +**返り値** + +- バイト単位での残りの空きスペースの量です。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT formatReadableSize(filesystemAvailable()) AS "Available space"; +``` + +結果: + +```text +┌─Available space─┐ +│ 30.75 GiB │ +└─────────────────┘ +``` + +## filesystemUnreserved + +データベースの永続化をホスティングしているファイルシステムの合計空きスペースを返します。(以前は `filesystemFree`)。[`filesystemAvailable`](#filesystemavailable) も参照してください。 + +**構文** + +```sql +filesystemUnreserved() +``` + +**返り値** + +- 空きスペースの量(バイト単位)です。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT formatReadableSize(filesystemUnreserved()) AS "Free space"; +``` + +結果: + +```text +┌─Free space─┐ +│ 32.39 GiB │ +└────────────┘ +``` + +## filesystemCapacity + +ファイルシステムの容量をバイト単位で返します。データディレクトリの[パス](../../operations/server-configuration-parameters/settings.md#path)を設定する必要があります。 + +**構文** + +```sql +filesystemCapacity() +``` + +**返り値** + +- バイト単位でのファイルシステムの容量。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT formatReadableSize(filesystemCapacity()) AS "Capacity"; +``` + +結果: + +```text +┌─Capacity──┐ +│ 39.32 GiB │ +└───────────┘ +``` + +## initializeAggregation + +単一の値に基づいて集計関数の結果を計算します。この関数は、[-State](../../sql-reference/aggregate-functions/combinators.md#agg-functions-combinator-state) コンビネータを使用して集計関数を初期化するために使用できます。集計関数の状態を作成し、それらを [AggregateFunction](../data-types/aggregatefunction.md#data-type-aggregatefunction) 型のカラムに挿入するか、初期化された集計をデフォルト値として使用できます。 + +**構文** + +```sql +initializeAggregation (aggregate_function, arg1, arg2, ..., argN) +``` + +**引数** + +- `aggregate_function` — 初期化する集計関数の名前。[String](../data-types/string.md)。 +- `arg` — 集計関数の引数。 + +**返り値** + +- 関数に渡された各行に対する集計の結果。 + +返り値の型は、最初の引数として `initializeAggregation` が取る関数の返り値の型と同じです。 + +**例** + +クエリ: + +```sql +SELECT uniqMerge(state) FROM (SELECT initializeAggregation('uniqState', number % 3) AS state FROM numbers(10000)); +``` + +結果: + +```text +┌─uniqMerge(state)─┐ +│ 3 │ +└──────────────────┘ +``` + +クエリ: + +```sql +SELECT finalizeAggregation(state), toTypeName(state) FROM (SELECT initializeAggregation('sumState', number % 3) AS state FROM numbers(5)); +``` + +結果: + +```text +┌─finalizeAggregation(state)─┬─toTypeName(state)─────────────┐ +│ 0 │ AggregateFunction(sum, UInt8) │ +│ 1 │ AggregateFunction(sum, UInt8) │ +│ 2 │ AggregateFunction(sum, UInt8) │ +│ 0 │ AggregateFunction(sum, UInt8) │ +│ 1 │ AggregateFunction(sum, UInt8) │ +└────────────────────────────┴───────────────────────────────┘ +``` + +`AggregatingMergeTree` テーブルエンジンと `AggregateFunction` カラムを使用した例: + +```sql +CREATE TABLE metrics +( + key UInt64, + value AggregateFunction(sum, UInt64) DEFAULT initializeAggregation('sumState', toUInt64(0)) +) +ENGINE = AggregatingMergeTree +ORDER BY key +``` + +```sql +INSERT INTO metrics VALUES (0, initializeAggregation('sumState', toUInt64(42))) +``` + +**関連情報** + +- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) + +## finalizeAggregation + +集計関数の状態を与えると、この関数は集計の結果(または [-State](../../sql-reference/aggregate-functions/combinators.md#agg-functions-combinator-state) コンビネータを使用する際の最終化された状態)を返します。 + +**構文** + +```sql +finalizeAggregation(state) +``` + +**引数** + +- `state` — 集計の状態。[AggregateFunction](../data-types/aggregatefunction.md#data-type-aggregatefunction)。 + +**返り値** + +- 集計された値/値。 + +:::note +返り値の型は集計された任意の型と等しいです。 +::: + +**例** + +クエリ: + +```sql +SELECT finalizeAggregation(( SELECT countState(number) FROM numbers(10))); +``` + +結果: + +```text +┌─finalizeAggregation(_subquery16)─┐ +│ 10 │ +└──────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT finalizeAggregation(( SELECT sumState(number) FROM numbers(10))); +``` + +結果: + +```text +┌─finalizeAggregation(_subquery20)─┐ +│ 45 │ +└──────────────────────────────────┘ +``` + +`NULL` 値は無視されることに注意してください。 + +クエリ: + +```sql +SELECT finalizeAggregation(arrayReduce('anyState', [NULL, 2, 3])); +``` + +結果: + +```text +┌─finalizeAggregation(arrayReduce('anyState', [NULL, 2, 3]))─┐ +│ 2 │ +└────────────────────────────────────────────────────────────┘ +``` + +複合的な例: + +クエリ: + +```sql +WITH initializeAggregation('sumState', number) AS one_row_sum_state +SELECT + number, + finalizeAggregation(one_row_sum_state) AS one_row_sum, + runningAccumulate(one_row_sum_state) AS cumulative_sum +FROM numbers(10); +``` + +結果: + +```text +┌─number─┬─one_row_sum─┬─cumulative_sum─┐ +│ 0 │ 0 │ 0 │ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 3 │ +│ 3 │ 3 │ 6 │ +│ 4 │ 4 │ 10 │ +│ 5 │ 5 │ 15 │ +│ 6 │ 6 │ 21 │ +│ 7 │ 7 │ 28 │ +│ 8 │ 8 │ 36 │ +│ 9 │ 9 │ 45 │ +└────────┴─────────────┴────────────────┘ +``` + +**関連情報** + +- [arrayReduce](../../sql-reference/functions/array-functions.md#arrayreduce) +- [initializeAggregation](#initializeaggregation) + +## runningAccumulate + +データブロックの各行に対する集計関数の状態を累積します。 + +:::note +状態は新しいデータブロックごとにリセットされます。 +この誤りやすい動作のため、この関数は推奨されません。代わりに適切なウィンドウ関数を使用してください。 +::: + +**構文** + +```sql +runningAccumulate(agg_state[, grouping]); +``` + +**引数** + +- `agg_state` — 集計関数の状態。[AggregateFunction](../data-types/aggregatefunction.md#data-type-aggregatefunction)。 +- `grouping` — グルーピングキー。オプション。`grouping` の値が変わると関数の状態がリセットされます。サポートされているデータ型の中で等価演算子が定義されているものを使用できます。 + +**返り値** + +- 結果の各行には、入力行の0から現在の位置までのすべての行に対する集計関数の結果が含まれます。`runningAccumulate` は、各新しいデータブロックまたは `grouping` 値が変わったときに状態をリセットします。 + +型は使用された集計関数に依存します。 + +**例** + +グルーピングを使用せずに数値の累積合計を求める方法と、グルーピングを使用する方法を考えてみます。 + +クエリ: + +```sql +SELECT k, runningAccumulate(sum_k) AS res FROM (SELECT number as k, sumState(k) AS sum_k FROM numbers(10) GROUP BY k ORDER BY k); +``` + +結果: + +```text +┌─k─┬─res─┐ +│ 0 │ 0 │ +│ 1 │ 1 │ +│ 2 │ 3 │ +│ 3 │ 6 │ +│ 4 │ 10 │ +│ 5 │ 15 │ +│ 6 │ 21 │ +│ 7 │ 28 │ +│ 8 │ 36 │ +│ 9 │ 45 │ +└───┴─────┘ +``` + +サブクエリは、`0` から `9` までの各数値に関して `sumState` を生成します。`sumState` は、単一の数の合計を含む [sum](../../sql-reference/aggregate-functions/reference/sum.md) 関数の状態を返します。 + +全体のクエリは次のことを行います: + +1. 最初の行では、`runningAccumulate` は `sumState(0)` を取得し `0` を返します。 +2. 2番目の行では、関数は `sumState(0)` と `sumState(1)` をマージし、`sumState(0 + 1)` を生成し、結果として `1` を返します。 +3. 3番目の行では、関数は `sumState(0 + 1)` と `sumState(2)` をマージし、`sumState(0 + 1 + 2)` を生成し、結果として `3` を返します。 +4. ブロックが終了するまでこれらの操作が繰り返されます。 + +以下の例は、`grouping` パラメータの使用法を示しています: + +クエリ: + +```sql +SELECT + grouping, + item, + runningAccumulate(state, grouping) AS res +FROM +( + SELECT + toInt8(number / 4) AS grouping, + number AS item, + sumState(number) AS state + FROM numbers(15) + GROUP BY item + ORDER BY item ASC +); +``` + +結果: + +```text +┌─grouping─┬─item─┬─res─┐ +│ 0 │ 0 │ 0 │ +│ 0 │ 1 │ 1 │ +│ 0 │ 2 │ 3 │ +│ 0 │ 3 │ 6 │ +│ 1 │ 4 │ 4 │ +│ 1 │ 5 │ 9 │ +│ 1 │ 6 │ 15 │ +│ 1 │ 7 │ 22 │ +│ 2 │ 8 │ 8 │ +│ 2 │ 9 │ 17 │ +│ 2 │ 10 │ 27 │ +│ 2 │ 11 │ 38 │ +│ 3 │ 12 │ 12 │ +│ 3 │ 13 │ 25 │ +│ 3 │ 14 │ 39 │ +└──────────┴──────┴─────┘ +``` + +ご覧のとおり、`runningAccumulate` は各行のグループごとに状態を結合します。 + +## joinGet + +関数は[Dictionary](../../sql-reference/dictionaries/index.md)のようにテーブルからデータを抽出します。指定された結合キーを使用して[Join](../../engines/table-engines/special/join.md#creating-a-table)テーブルからデータを取得します。 + +:::note +`ENGINE = Join(ANY, LEFT, )` ステートメントで作成されたテーブルのみをサポートします。 +::: + +**構文** + +```sql +joinGet(join_storage_table_name, `value_column`, join_keys) +``` + +**引数** + +- `join_storage_table_name` — 検索が実行される場所を示す[識別子](../../sql-reference/syntax.md#syntax-identifiers)。 +- `value_column` — 必要なデータが含まれるテーブルのカラム名。 +- `join_keys` — キーのリスト。 + +:::note +識別子はデフォルトデータベース(コンフィグファイルの `default_database` 設定を参照)で検索されます。デフォルトデータベースを上書きするためには、`USE db_name`または`db_name.db_table`の形式でデータベースとテーブルを指定します。 +::: + +**返り値** + +- キーのリストに対応する値のリストを返します。 + +:::note +あるキーがソーステーブルに存在しない場合、テーブル作成時の[join_use_nulls](../../operations/settings/settings.md#join_use_nulls)設定に基づいて`0`または`null`が返されます。 +`join_use_nulls`の詳細については[Join operation](../../engines/table-engines/special/join.md)を参照してください。 +::: + +**例** + +入力テーブル: + +```sql +CREATE DATABASE db_test; +CREATE TABLE db_test.id_val(`id` UInt32, `val` UInt32) ENGINE = Join(ANY, LEFT, id); +INSERT INTO db_test.id_val VALUES (1, 11)(2, 12)(4, 13); +SELECT * FROM db_test.id_val; +``` + +```text +┌─id─┬─val─┐ +│ 4 │ 13 │ +│ 2 │ 12 │ +│ 1 │ 11 │ +└────┴─────┘ +``` + +クエリ: + +```sql +SELECT number, joinGet(db_test.id_val, 'val', toUInt32(number)) from numbers(4); +``` + +結果: + +```text + ┌─number─┬─joinGet('db_test.id_val', 'val', toUInt32(number))─┐ +1. │ 0 │ 0 │ +2. │ 1 │ 11 │ +3. │ 2 │ 12 │ +4. │ 3 │ 0 │ + └────────┴────────────────────────────────────────────────────┘ +``` + +`join_use_nulls` を使用して、ソーステーブルにキーが存在しない場合に返される動作を変更できます。 + +```sql +CREATE DATABASE db_test; +CREATE TABLE db_test.id_val_nulls(`id` UInt32, `val` UInt32) ENGINE = Join(ANY, LEFT, id) SETTINGS join_use_nulls=1; +INSERT INTO db_test.id_val_nulls VALUES (1, 11)(2, 12)(4, 13); +SELECT * FROM db_test.id_val_nulls; +``` + +```text +┌─id─┬─val─┐ +│ 4 │ 13 │ +│ 2 │ 12 │ +│ 1 │ 11 │ +└────┴─────┘ +``` + +クエリ: + +```sql +SELECT number, joinGet(db_test.id_val_nulls, 'val', toUInt32(number)) from numbers(4); +``` + +結果: + +```text + ┌─number─┬─joinGet('db_test.id_val_nulls', 'val', toUInt32(number))─┐ +1. │ 0 │ ᴺᵁᴸᴸ │ +2. │ 1 │ 11 │ +3. │ 2 │ 12 │ +4. │ 3 │ ᴺᵁᴸᴸ │ + └────────┴──────────────────────────────────────────────────────────┘ +``` + +## joinGetOrNull + +[joinGet](#joinget) と同様ですが、キーが見つからない場合にはデフォルト値を返す代わりに `NULL` を返します。 + +**構文** + +```sql +joinGetOrNull(join_storage_table_name, `value_column`, join_keys) +``` + +**引数** + +- `join_storage_table_name` — 検索が実行される場所を示す[識別子](../../sql-reference/syntax.md#syntax-identifiers)。 +- `value_column` — 必要なデータが含まれるテーブルのカラム名。 +- `join_keys` — キーのリスト。 + +:::note +識別子はデフォルトデータベース(コンフィグファイルの `default_database` 設定を参照)で検索されます。デフォルトデータベースを上書きするためには、`USE db_name`または`db_name.db_table`の形式でデータベースとテーブルを指定します。 +::: + +**返り値** + +- キーのリストに対応する値のリストを返します。 + +:::note +ソーステーブルに特定のキーが存在しない場合、そのキーに対して `NULL` が返されます。 +::: + +**例** + +入力テーブル: + +```sql +CREATE DATABASE db_test; +CREATE TABLE db_test.id_val(`id` UInt32, `val` UInt32) ENGINE = Join(ANY, LEFT, id); +INSERT INTO db_test.id_val VALUES (1, 11)(2, 12)(4, 13); +SELECT * FROM db_test.id_val; +``` + +```text +┌─id─┬─val─┐ +│ 4 │ 13 │ +│ 2 │ 12 │ +│ 1 │ 11 │ +└────┴─────┘ +``` + +クエリ: + +```sql +SELECT number, joinGetOrNull(db_test.id_val, 'val', toUInt32(number)) from numbers(4); +``` + +結果: + +```text + ┌─number─┬─joinGetOrNull('db_test.id_val', 'val', toUInt32(number))─┐ +1. │ 0 │ ᴺᵁᴸᴸ │ +2. │ 1 │ 11 │ +3. │ 2 │ 12 │ +4. │ 3 │ ᴺᵁᴸᴸ │ + └────────┴──────────────────────────────────────────────────────────┘ +``` + +## catboostEvaluate + +:::note +この関数は ClickHouse Cloud では利用できません。 +::: + +外部の catboost モデルを評価します。[CatBoost](https://catboost.ai) は、Yandex により開発された機械学習のためのオープンソースの勾配ブースティングライブラリです。 +catboost モデルへのパスとモデルの引数(特徴量)を受け取り、Float64 を返します。 + +**構文** + +```sql +catboostEvaluate(path_to_model, feature_1, feature_2, ..., feature_n) +``` + +**例** + +```sql +SELECT feat1, ..., feat_n, catboostEvaluate('/path/to/model.bin', feat_1, ..., feat_n) AS prediction +FROM data_table +``` + +**前提条件** + +1. catboost 評価ライブラリをビルドする + +catboost モデルを評価する前に、`libcatboostmodel.` ライブラリを利用可能にする必要があります。コンパイル方法については [CatBoost ドキュメンテーション](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html) を参照してください。 + +次に、clickhouse 設定に `libcatboostmodel.` のパスを指定してください: + +```xml + +... + /path/to/libcatboostmodel.so +... + +``` + +セキュリティおよび隔離のため、モデル評価はサーバープロセスではなく clickhouse-library-bridge プロセスで実行されます。 +`catboostEvaluate()` の最初の実行時に、サーバーは library bridge プロセスがすでに実行されていない場合にこれを開始します。両プロセスは HTTP インターフェースを使用して通信します。デフォルトでは、ポート `9012` が使用されます。ポート `9012` が他のサービスに割り当てられている場合に別のポートを指定することができます。 + +```xml + + 9019 + +``` + +2. libcatboost を使用した catboost モデルのトレーニング + +トレーニングデータセットから catboost モデルをトレーニングする方法については、[モデルのトレーニングと適用](https://catboost.ai/docs/features/training.html#training)を参照してください。 + +## throwIf + +引数 `x` が正しければ例外をスローします。 + +**構文** + +```sql +throwIf(x[, message[, error_code]]) +``` + +**引数** + +- `x` - チェックする条件。 +- `message` - カスタムエラーメッセージを提供する定数文字列。オプション。 +- `error_code` - カスタムエラーコードを提供する定数整数。オプション。 + +`error_code` 引数を使用するには、構成パラメータ `allow_custom_error_code_in_throwif` を有効にする必要があります。 + +**例** + +```sql +SELECT throwIf(number = 3, 'Too many') FROM numbers(10); +``` + +結果: + +```text +↙ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 19.14.1): +Code: 395. DB::Exception: Received from localhost:9000. DB::Exception: Too many. +``` + +## identity + +引数をそのまま返します。デバッグおよびテストを目的とします。インデックスを使わないことや全検索のクエリ実行性能を得ることができます。クエリがインデックスの使用可能性について分析される際に、分析者は `identity` 関数内のすべてのものを無視します。また、定数展開を無効にします。 + +**構文** + +```sql +identity(x) +``` + +**例** + +クエリ: + +```sql +SELECT identity(42); +``` + +結果: + +```text +┌─identity(42)─┐ +│ 42 │ +└──────────────┘ +``` + +## getSetting + +[カスタム設定](../../operations/settings/index.md#custom_settings)の現在の値を返します。 + +**構文** + +```sql +getSetting('custom_setting'); +``` + +**パラメータ** + +- `custom_setting` — 設定名。[String](../data-types/string.md)。 + +**返り値** + +- 設定の現在の値。 + +**例** + +```sql +SET custom_a = 123; +SELECT getSetting('custom_a'); +``` + +結果: + +``` +123 +``` + +**関連情報** + +- [カスタム設定](../../operations/settings/index.md#custom_settings) + +## getSettingOrDefault + +[カスタム設定](../../operations/settings/index.md#custom_settings)の現在の値またはカスタム設定が現在のプロファイルに設定されていない場合に第2引数で指定されたデフォルト値を返します。 + +**構文** + +```sql +getSettingOrDefault('custom_setting', default_value); +``` + +**パラメータ** + +- `custom_setting` — 設定名。[String](../data-types/string.md)。 +- `default_value` — カスタム設定が設定されていない場合に返される値。任意のデータ型または Null の値となる可能性があります。 + +**返り値** + +- 設定の現在の値または設定されていない場合の default_value。 + +**例** + +```sql +SELECT getSettingOrDefault('custom_undef1', 'my_value'); +SELECT getSettingOrDefault('custom_undef2', 100); +SELECT getSettingOrDefault('custom_undef3', NULL); +``` + +結果: + +``` +my_value +100 +NULL +``` + +**関連情報** + +- [カスタム設定](../../operations/settings/index.md#custom_settings) + +## isDecimalOverflow + +[Decimal](../data-types/decimal.md) 値がその精度を超えているか、指定された精度を超えているかどうかをチェックします。 + +**構文** + +```sql +isDecimalOverflow(d, [p]) +``` + +**引数** + +- `d` — 値。[Decimal](../data-types/decimal.md)。 +- `p` — 精度。オプション。省略した場合、最初の引数の初期精度が使用されます。他のデータベースまたはファイルから/へのデータを移行する場合に有用です。[UInt8](../data-types/int-uint.md#uint-ranges)。 + +**返り値** + +- `1` — Decimal 値がその精度によって許可される桁数を超えていること。 +- `0` — Decimal 値が指定された精度を満たしていること。 + +**例** + +クエリ: + +```sql +SELECT isDecimalOverflow(toDecimal32(1000000000, 0), 9), + isDecimalOverflow(toDecimal32(1000000000, 0)), + isDecimalOverflow(toDecimal32(-1000000000, 0), 9), + isDecimalOverflow(toDecimal32(-1000000000, 0)); +``` + +結果: + +```text +1 1 1 1 +``` + +## countDigits + +値を表現するのに必要な10進数の桁数を返します。 + +**構文** + +```sql +countDigits(x) +``` + +**引数** + +- `x` — [Int](../data-types/int-uint.md) または [Decimal](../data-types/decimal.md) の値。 + +**返り値** + +- 桁数。[UInt8](../data-types/int-uint.md#uint-ranges)。 + +:::note +`Decimal` 値はそれらのスケールを考慮します: その基礎となる整数型 `value * scale` を計算します。例えば:`countDigits(42) = 2`, `countDigits(42.000) = 5`, `countDigits(0.04200) = 4`。つまり、`Decimal64` の小数点オーバーフローを `countDigits(x) > 18` でチェックできます。これは [isDecimalOverflow](#isdecimaloverflow) の遅いバリアントです。 +::: + +**例** + +クエリ: + +```sql +SELECT countDigits(toDecimal32(1, 9)), countDigits(toDecimal32(-1, 9)), + countDigits(toDecimal64(1, 18)), countDigits(toDecimal64(-1, 18)), + countDigits(toDecimal128(1, 38)), countDigits(toDecimal128(-1, 38)); +``` + +結果: + +```text +10 10 19 19 39 39 +``` + +## errorCodeToName + +- エラーコードのテキスト名。[LowCardinality(String)](../data-types/lowcardinality.md)。 + +**構文** + +```sql +errorCodeToName(1) +``` + +結果: + +```text +UNSUPPORTED_METHOD +``` + +## tcpPort + +このサーバーによってリッスンされている[native インターフェース](../../interfaces/tcp.md)の TCP ポート番号を返します。 +分散テーブルのコンテキストで実行される場合、この関数は各シャードに関連する通常のカラムを生成します。それ以外の場合、定数値を生成します。 + +**構文** + +```sql +tcpPort() +``` + +**引数** + +- なし。 + +**返り値** + +- TCP ポート番号。[UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT tcpPort(); +``` + +結果: + +```text +┌─tcpPort()─┐ +│ 9000 │ +└───────────┘ +``` + +**関連情報** + +- [tcp_port](../../operations/server-configuration-parameters/settings.md#tcp_port) + +## currentProfiles + +現在のユーザーの[設定プロファイル](../../guides/sre/user-management/index.md#settings-profiles-management)のリストを返します。 + +現在の設定プロファイルを変更するには、[SET PROFILE](../../sql-reference/statements/set.md#query-set) コマンドを使用できます。`SET PROFILE` コマンドが使用されていない場合、この関数は現在のユーザー定義で指定されたプロファイルを返します([CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement) 参照)。 + +**構文** + +```sql +currentProfiles() +``` + +**返り値** + +- 現在のユーザー設定プロファイルのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## enabledProfiles + +明示的および暗黙的に現在のユーザーに割り当てられた設定プロファイルを返します。明示的に割り当てられたプロファイルは [currentProfiles](#currentprofiles) 関数によって返されるものと同じです。暗黙的に割り当てられたプロファイルには、他の割り当てられたプロファイル、付与されたロールを介して割り当てられたプロファイル、それ自体の設定を介して割り当てられたプロファイル、メインデフォルトプロファイル(メインサーバー設定ファイルの `default_profile` セクション参照)の親プロファイルが含まれます。 + +**構文** + +```sql +enabledProfiles() +``` + +**返り値** + +- 有効になっている設定プロファイルのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## defaultProfiles + +現在のユーザー定義で指定されたすべてのプロファイルを返します([CREATE USER](../../sql-reference/statements/create/user.md#create-user-statement) ステートメント参照)。 + +**構文** + +```sql +defaultProfiles() +``` + +**返り値** + +- デフォルト設定プロファイルのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## currentRoles + +現在のユーザーに割り当てられたロールを返します。ロールは [SET ROLE](../../sql-reference/statements/set-role.md#set-role-statement) ステートメントによって変更することができます。`SET ROLE` ステートメントが利用されていない場合、関数 `currentRoles` は `defaultRoles` と同じものを返します。 + +**構文** + +```sql +currentRoles() +``` + +**返り値** + +- 現在のユーザーに対する現在のロールのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## enabledRoles + +現在のロールと現在のロールに付与されたロールの名前を返します。 + +**構文** + +```sql +enabledRoles() +``` + +**返り値** + +- 現在のユーザーに対する有効なロールのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## defaultRoles + +ログイン時に現在のユーザーに対してデフォルトで有効にされるロールを返します。これらは通常、現在のユーザーに付与されたすべてのロールですが([GRANT](../../sql-reference/statements/grant.md#select) 参照)、[SET DEFAULT ROLE](../../sql-reference/statements/set-role.md#set-default-role-statement) ステートメントで変更することができます。 + +**構文** + +```sql +defaultRoles() +``` + +**返り値** + +- 現在のユーザーに対するデフォルトロールのリスト。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +## getServerPort + +サーバーのポート番号を返します。ポートがサーバーによって使用されていない場合、例外をスローします。 + +**構文** + +```sql +getServerPort(port_name) +``` + +**引数** + +- `port_name` — サーバーポート名。[String](../data-types/string.md#string)。可能な値: + + - 'tcp_port' + - 'tcp_port_secure' + - 'http_port' + - 'https_port' + - 'interserver_http_port' + - 'interserver_https_port' + - 'mysql_port' + - 'postgresql_port' + - 'grpc_port' + - 'prometheus.port' + +**返り値** + +- サーバーポートの番号。[UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT getServerPort('tcp_port'); +``` + +結果: + +```text +┌─getServerPort('tcp_port')─┐ +│ 9000 │ +└───────────────────────────┘ +``` + +## queryID + +現在のクエリの ID を返します。他のクエリのパラメータは、`query_id` を使用して [system.query_log](../../operations/system-tables/query_log.md) テーブルから取得できます。 + +[initialQueryID](#initialqueryid) 関数とは異なり、`queryID` は異なるシャードで異なる結果を返すことができます。(例を参照) + +**構文** + +```sql +queryID() +``` + +**返り値** + +- 現在のクエリの ID。[String](../data-types/string.md) + +**例** + +クエリ: + +```sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT queryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +結果: + +```text +┌─count()─┐ +│ 3 │ +└─────────┘ +``` + +## initialQueryID + +初期の現在のクエリの ID を返します。他のクエリのパラメータは、`initial_query_id` を使用して [system.query_log](../../operations/system-tables/query_log.md) テーブルから取得できます。 + +[queryID](#queryid) 関数とは異なり、`initialQueryID` は異なるシャードで同じ結果を返します。(例を参照) + +**構文** + +```sql +initialQueryID() +``` + +**返り値** + +- 初期の現在のクエリの ID。[String](../data-types/string.md) + +**例** + +クエリ: + +```sql +CREATE TABLE tmp (str String) ENGINE = Log; +INSERT INTO tmp (*) VALUES ('a'); +SELECT count(DISTINCT t) FROM (SELECT initialQueryID() AS t FROM remote('127.0.0.{1..3}', currentDatabase(), 'tmp') GROUP BY queryID()); +``` + +結果: + +```text +┌─count()─┐ +│ 1 │ +└─────────┘ +``` + +## partitionID + +[パーティション ID](../../engines/table-engines/mergetree-family/custom-partitioning-key.md)を計算します。 + +:::note +この関数は遅いため、多数の行に対して呼び出すべきではありません。 +::: + +**構文** + +```sql +partitionID(x[, y, ...]); +``` + +**引数** + +- `x` — パーティション ID を返すカラム。 +- `y, ...` — パーティション ID を返す残りの N 個のカラム(オプション)。 + +**返り値** + +- 行が属するパーティション ID。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS tab; + +CREATE TABLE tab +( + i int, + j int +) +ENGINE = MergeTree +PARTITION BY i +ORDER BY tuple(); + +INSERT INTO tab VALUES (1, 1), (1, 2), (1, 3), (2, 4), (2, 5), (2, 6); + +SELECT i, j, partitionID(i), _partition_id FROM tab ORDER BY i, j; +``` + +結果: + +```response +┌─i─┬─j─┬─partitionID(i)─┬─_partition_id─┐ +│ 1 │ 1 │ 1 │ 1 │ +│ 1 │ 2 │ 1 │ 1 │ +│ 1 │ 3 │ 1 │ 1 │ +└───┴───┴────────────────┴───────────────┘ +┌─i─┬─j─┬─partitionID(i)─┬─_partition_id─┐ +│ 2 │ 4 │ 2 │ 2 │ +│ 2 │ 5 │ 2 │ 2 │ +│ 2 │ 6 │ 2 │ 2 │ +└───┴───┴────────────────┴───────────────┘ +``` + +## shardNum + +分散クエリで分散テーブルのデータの一部を処理するシャードのインデックスを返します。インデックスは `1` から始まります。 +クエリが分散されていない場合、定数値 `0` が返されます。 + +**構文** + +```sql +shardNum() +``` + +**返り値** + +- シャードインデックスまたは定数 `0`。[UInt32](../data-types/int-uint.md)。 + +**例** + +以下の例では、2つのシャードを使用した構成を使用します。クエリは各シャードの [system.one](../../operations/system-tables/one.md) テーブルで実行されます。 + +クエリ: + +```sql +CREATE TABLE shard_num_example (dummy UInt8) + ENGINE=Distributed(test_cluster_two_shards_localhost, system, one, dummy); +SELECT dummy, shardNum(), shardCount() FROM shard_num_example; +``` + +結果: + +```text +┌─dummy─┬─shardNum()─┬─shardCount()─┐ +│ 0 │ 2 │ 2 │ +│ 0 │ 1 │ 2 │ +└───────┴────────────┴──────────────┘ +``` + +**関連情報** + +- [分散テーブルエンジン](../../engines/table-engines/special/distributed.md) + +## shardCount + +分散クエリに対するシャードの総数を返します。 +クエリが分散されていない場合、定数 `0` が返されます。 + +**構文** + +```sql +shardCount() +``` + +**返り値** + +- シャードの総数または `0`。[UInt32](../data-types/int-uint.md)。 + +**関連情報** + +- [shardNum()](#shardnum) 関数の例にも `shardCount()` 関数呼び出しが含まれています。 + +## getOSKernelVersion + +現在の OS カーネルバージョンを文字列で返します。 + +**構文** + +```sql +getOSKernelVersion() +``` + +**引数** + +- なし。 + +**返り値** + +- 現在の OS カーネルバージョン。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT getOSKernelVersion(); +``` + +結果: + +```text +┌─getOSKernelVersion()────┐ +│ Linux 4.15.0-55-generic │ +└─────────────────────────┘ +``` + +## zookeeperSessionUptime + +現在の ZooKeeper セッションのアップタイムを秒単位で返します。 + +**構文** + +```sql +zookeeperSessionUptime() +``` + +**引数** + +- なし。 + +**返り値** + +- 現在の ZooKeeper セッションのアップタイム(秒単位)。[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT zookeeperSessionUptime(); +``` + +結果: + +```text +┌─zookeeperSessionUptime()─┐ +│ 286 │ +└──────────────────────────┘ +``` + +## generateRandomStructure + +テーブル構造を `column1_name column1_type, column2_name column2_type, ...` の形式でランダムに生成します。 + +**構文** + +```sql +generateRandomStructure([number_of_columns, seed]) +``` + +**引数** + +- `number_of_columns` — 結果のテーブル構造での希望するカラム数。0 または `Null` に設定した場合、1 から 128 の範囲でランダムのカラム数になります。デフォルト値: `Null`。 +- `seed` - 安定した結果を生成するためのランダムシード。シードが指定されていないか `Null` に設定されている場合、ランダムに生成されます。 + +すべての引数は定数でなければなりません。 + +**返り値** + +- ランダムに生成されたテーブル構造。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT generateRandomStructure() +``` + +結果: + +```text +┌─generateRandomStructure()─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ c1 Decimal32(5), c2 Date, c3 Tuple(LowCardinality(String), Int128, UInt64, UInt16, UInt8, IPv6), c4 Array(UInt128), c5 UInt32, c6 IPv4, c7 Decimal256(64), c8 Decimal128(3), c9 UInt256, c10 UInt64, c11 DateTime │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT generateRandomStructure(1) +``` + +結果: + +```text +┌─generateRandomStructure(1)─┐ +│ c1 Map(UInt256, UInt16) │ +└────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT generateRandomStructure(NULL, 33) +``` + +結果: + +```text +┌─generateRandomStructure(NULL, 33)─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ c1 DateTime, c2 Enum8('c2V0' = 0, 'c2V1' = 1, 'c2V2' = 2, 'c2V3' = 3), c3 LowCardinality(Nullable(FixedString(30))), c4 Int16, c5 Enum8('c5V0' = 0, 'c5V1' = 1, 'c5V2' = 2, 'c5V3' = 3), c6 Nullable(UInt8), c7 String, c8 Nested(e1 IPv4, e2 UInt8, e3 UInt16, e4 UInt16, e5 Int32, e6 Map(Date, Decimal256(70))) │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**注**: 複雑な型(Array、Tuple、Map、Nested)の最大ネスト深度は 16 に制限されています。 + +この関数は、[generateRandom](../../sql-reference/table-functions/generate.md) と一緒に使用して完全にランダムなテーブルを生成することができます。 + +## structureToCapnProtoSchema {#structure_to_capn_proto_schema} + +ClickHouse のテーブル構造を CapnProto スキーマに変換します。 + +**構文** + +```sql +structureToCapnProtoSchema(structure) +``` + +**引数** + +- `structure` — `column1_name column1_type, column2_name column2_type, ...` の形式でのテーブル構造。 +- `root_struct_name` — CapnProto スキーマのルート構造の名前。デフォルト値 - `Message`; + +**返り値** + +- CapnProto スキーマ。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT structureToCapnProtoSchema('column1 String, column2 UInt32, column3 Array(String)') FORMAT RawBLOB +``` + +結果: + +```text +@0xf96402dd754d0eb7; + +struct Message +{ + column1 @0 : Data; + column2 @1 : UInt32; + column3 @2 : List(Data); +} +``` + +クエリ: + +```sql +SELECT structureToCapnProtoSchema('column1 Nullable(String), column2 Tuple(element1 UInt32, element2 Array(String)), column3 Map(String, String)') FORMAT RawBLOB +``` + +結果: + +```text +@0xd1c8320fecad2b7f; + +struct Message +{ + struct Column1 + { + union + { + value @0 : Data; + null @1 : Void; + } + } + column1 @0 : Column1; + struct Column2 + { + element1 @0 : UInt32; + element2 @1 : List(Data); + } + column2 @1 : Column2; + struct Column3 + { + struct Entry + { + key @0 : Data; + value @1 : Data; + } + entries @0 : List(Entry); + } + column3 @2 : Column3; +} +``` + +クエリ: + +```sql +SELECT structureToCapnProtoSchema('column1 String, column2 UInt32', 'Root') FORMAT RawBLOB +``` + +結果: + +```text +@0x96ab2d4ab133c6e1; + +struct Root +{ + column1 @0 : Data; + column2 @1 : UInt32; +} +``` + +## structureToProtobufSchema {#structure_to_protobuf_schema} + +ClickHouse のテーブル構造を Protobuf スキーマに変換します。 + +**構文** + +```sql +structureToProtobufSchema(structure) +``` + +**引数** + +- `structure` — `column1_name column1_type, column2_name column2_type, ...` の形式でのテーブル構造。 +- `root_message_name` — Protobuf スキーマのルートメッセージの名前。デフォルト値 - `Message`; + +**返り値** + +- Protobuf スキーマ。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT structureToProtobufSchema('column1 String, column2 UInt32, column3 Array(String)') FORMAT RawBLOB +``` + +結果: + +```text +syntax = "proto3"; + +message Message +{ + bytes column1 = 1; + uint32 column2 = 2; + repeated bytes column3 = 3; +} +``` + +クエリ: + +```sql +SELECT structureToProtobufSchema('column1 Nullable(String), column2 Tuple(element1 UInt32, element2 Array(String)), column3 Map(String, String)') FORMAT RawBLOB +``` + +結果: + +```text +syntax = "proto3"; + +message Message +{ + bytes column1 = 1; + message Column2 + { + uint32 element1 = 1; + repeated bytes element2 = 2; + } + Column2 column2 = 2; + map column3 = 3; +} +``` + +クエリ: + +```sql +SELECT structureToProtobufSchema('column1 String, column2 UInt32', 'Root') FORMAT RawBLOB +``` + +結果: + +```text +syntax = "proto3"; + +message Root +{ + bytes column1 = 1; + uint32 column2 = 2; +} +``` + +## formatQuery + +与えられた SQL クエリのフォーマットされた(複数行を含む可能性のある)バージョンを返します。 + +クエリが構文的に正しくない場合、例外をスローします。代わりに `NULL` を返すには、`formatQueryOrNull()` 関数を使用してください。 + +**構文** + +```sql +formatQuery(query) +formatQueryOrNull(query) +``` + +**引数** + +- `query` - フォーマット対象の SQL クエリ。[String](../data-types/string.md) + +**返り値** + +- フォーマットされたクエリ。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT formatQuery('select a, b FRom tab WHERE a > 3 and b < 3'); +``` + +結果: + +```result +┌─formatQuery('select a, b FRom tab WHERE a > 3 and b < 3')─┐ +│ SELECT + a, + b +FROM tab +WHERE (a > 3) AND (b < 3) │ +└───────────────────────────────────────────────────────────────┘ +``` + +## formatQuerySingleLine + +`formatQuery()` と同様ですが、返されるフォーマットされた文字列には改行が含まれません。 + +クエリが構文的に正しくない場合、例外をスローします。代わりに `NULL` を返すには、`formatQuerySingleLineOrNull()` 関数を利用してください。 + +**構文** + +```sql +formatQuerySingleLine(query) +formatQuerySingleLineOrNull(query) +``` + +**引数** + +- `query` - フォーマット対象の SQL クエリ。[String](../data-types/string.md) + +**返り値** + +- フォーマットされたクエリ。[String](../data-types/string.md)。 + +**例** + +```sql +SELECT formatQuerySingleLine('select a, b FRom tab WHERE a > 3 and b < 3'); +``` + +結果: + +```result +┌─formatQuerySingleLine('select a, b FRom tab WHERE a > 3 and b < 3')─┐ +│ SELECT a, b FROM tab WHERE (a > 3) AND (b < 3) │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +## variantElement + +`Variant` カラムから指定された型のカラムを抽出します。 + +**構文** + +```sql +variantElement(variant, type_name, [, default_value]) +``` + +**引数** + +- `variant` — Variant カラム。[Variant](../data-types/variant.md)。 +- `type_name` — 抽出する Variant 型の名前。[String](../data-types/string.md)。 +- `default_value` - 指定された型の Variant が存在しない場合に使用されるデフォルト値。任意の型を持つことができます。オプション。 + +**返り値** + +- 指定された型を持つ `Variant` カラムのサブカラム。 + +**例** + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT v, variantElement(v, 'String'), variantElement(v, 'UInt64'), variantElement(v, 'Array(UInt64)') FROM test; +``` + +```text +┌─v─────────────┬─variantElement(v, 'String')─┬─variantElement(v, 'UInt64')─┬─variantElement(v, 'Array(UInt64)')─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [] │ +│ 42 │ ᴺᵁᴸᴸ │ 42 │ [] │ +│ Hello, World! │ Hello, World! │ ᴺᵁᴸᴸ │ [] │ +│ [1,2,3] │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ [1,2,3] │ +└───────────────┴─────────────────────────────┴─────────────────────────────┴────────────────────────────────────┘ +``` + +## variantType + +`Variant` カラムの各行に対してその Variant 型名を返します。行が NULL を含む場合、その行に対して `'None'` を返します。 + +**構文** + +```sql +variantType(variant) +``` + +**引数** + +- `variant` — Variant カラム。[Variant](../data-types/variant.md)。 + +**返り値** + +- 各行の Variant 型名を持つ Enum8 カラム。 + +**例** + +```sql +CREATE TABLE test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; +INSERT INTO test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]); +SELECT variantType(v) FROM test; +``` + +```text +┌─variantType(v)─┐ +│ None │ +│ UInt64 │ +│ String │ +│ Array(UInt64) │ +└────────────────┘ +``` + +```sql +SELECT toTypeName(variantType(v)) FROM test LIMIT 1; +``` + +```text +┌─toTypeName(variantType(v))──────────────────────────────────────────┐ +│ Enum8('None' = -1, 'Array(UInt64)' = 0, 'String' = 1, 'UInt64' = 2) │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +## minSampleSizeConversion + +2つのサンプルにおける変換率(割合)を比較する A/B テストのための最小必要サンプルサイズを計算します。 + +**構文** + +```sql +minSampleSizeConversion(baseline, mde, power, alpha) +``` + +[こちらの記事](https://towardsdatascience.com/required-sample-size-for-a-b-testing-6f6608dd330a)で説明されている式を使用します。治療群と対照群が同じサイズであることを想定します。返される値は一つのグループに必要なサンプルサイズ(つまり、実験全体に必要なサンプルサイズは返される値の2倍)です。 + +**引数** + +- `baseline` — 基準変換率。[Float](../data-types/float.md)。 +- `mde` — 検出可能最低効果(MDE)はパーセンテージポイントで(例:基準変換率 0.25 の MDE が 0.03 の場合、0.25 ± 0.03 への変化が予想されます)。[Float](../data-types/float.md)。 +- `power` — テストの必要な統計力(1-タイプIIエラーの確率)。[Float](../data-types/float.md)。 +- `alpha` — テストの必要な有意水準(タイプIエラーの確率)。[Float](../data-types/float.md)。 + +**返り値** + +3つの要素を持つ名前つき [Tuple](../data-types/tuple.md): + +- `"minimum_sample_size"` — 必要なサンプルサイズ。[Float64](../data-types/float.md)。 +- `"detect_range_lower"` — 指定されたサンプルサイズでは検出できない範囲の下限(つまり、`alpha` と `power` が提供された場合、`"detect_range_lower"` 以下のすべての値は検出可能です)。`baseline - mde` として計算されます。[Float64](../data-types/float.md)。 +- `"detect_range_upper"` — 指定されたサンプルサイズでは検出できない範囲の上限(つまり、`alpha` と `power` が提供された場合、`"detect_range_upper"` 以上のすべての値は検出可能です)。`baseline + mde` として計算されます。[Float64](../data-types/float.md)。 + +**例** + +以下のクエリは、基準変換率が 25%、MDE が 3%、有意水準が 5%、望ましい統計力が 80% の A/B テストに対する必要なサンプルサイズを計算します: + +```sql +SELECT minSampleSizeConversion(0.25, 0.03, 0.80, 0.05) AS sample_size; +``` + +結果: + +```text +┌─sample_size───────────────────┐ +│ (3396.077603219163,0.22,0.28) │ +└───────────────────────────────┘ +``` + +## minSampleSizeContinuous + +2つのサンプルにおける連続したメトリックの平均を比較する A/B テストのための最小必要サンプルサイズを計算します。 + +**構文** + +```sql +minSampleSizeContinous(baseline, sigma, mde, power, alpha) +``` + +エイリアス: `minSampleSizeContinous` + +[こちらの記事](https://towardsdatascience.com/required-sample-size-for-a-b-testing-6f6608dd330a)で説明されている式を使用します。治療群と対照群が同じサイズであることを想定します。返される値は一つのグループに必要なサンプルサイズ(つまり、実験全体に必要なサンプルサイズは返される値の2倍)です。また、テストメトリックの治療群と対照群の標準偏差が同じであることを前提としています。 + +**引数** + +- `baseline` — メトリックの基準値。[Integer](../data-types/int-uint.md) または [Float](../data-types/float.md)。 +- `sigma` — メトリックの基準標準偏差。[Integer](../data-types/int-uint.md) または [Float](../data-types/float.md)。 +- `mde` — 基準値のパーセンテージとしての検出可能最低効果 (MDE) (例:基準値 112.25 の MDE は 0.03 これは、112.25 ± 112.25*0.03 への変化を意味します)。[Integer](../data-types/int-uint.md) または [Float](../data-types/float.md)。 +- `power` — テストの必要な統計力(1-タイプIIエラーの確率)。[Integer](../data-types/int-uint.md) または [Float](../data-types/float.md)。 +- `alpha` — テストの必要な有意水準(タイプIエラーの確率)。[Integer](../data-types/int-uint.md) または [Float](../data-types/float.md)。 + +**返り値** + +3つの要素を持つ名前つき [Tuple](../data-types/tuple.md): + +- `"minimum_sample_size"` — 必要なサンプルサイズ。[Float64](../data-types/float.md)。 +- `"detect_range_lower"` — 指定されたサンプルサイズでは検出できない範囲の下限(つまり、`alpha` と `power` が提供された場合、`"detect_range_lower"` 以下のすべての値は検出可能です)。`baseline * (1 - mde)` として計算されます。[Float64](../data-types/float.md)。 +- `"detect_range_upper"` — 指定されたサンプルサイズでは検出できない範囲の上限(つまり、`alpha` と `power` が提供された場合、`"detect_range_upper"` 以上のすべての値は検出可能です)。`baseline * (1 + mde)` として計算されます。[Float64](../data-types/float.md)。 + +**例** + +以下のクエリは、基準値 112.25、標準偏差 21.1、MDE 3%、有意水準 5%、望ましい統計力 80% のメトリックに対する A/B テストで必要なサンプルサイズを計算します: + +```sql +SELECT minSampleSizeContinous(112.25, 21.1, 0.03, 0.80, 0.05) AS sample_size; +``` + +結果: + +```text +┌─sample_size───────────────────────────┐ +│ (616.2931945826209,108.8825,115.6175) │ +└───────────────────────────────────────┘ +``` + +## connectionId + +現在のクエリを送信したクライアントの接続 ID を UInt64 整数として取得し、返します。 + +**構文** + +```sql +connectionId() +``` + +エイリアス: `connection_id`. + +**パラメータ** + +なし。 + +**返り値** + +現在の接続 ID。[UInt64](../data-types/int-uint.md)。 + +**実装の詳細** + +この関数は、デバッグシナリオや MySQL ハンドラ内での内部目的で役立ちます。[MySQL の `CONNECTION_ID` 関数](https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_connection-id) と互換性があり、通常、プロダクションクエリでは使用されません。 + +**例** + +クエリ: + +```sql +SELECT connectionId(); +``` + +```response +0 +``` + +## getClientHTTPHeader + +HTTP ヘッダーの値を取得します。 + +そのようなヘッダーが存在しないか、現在のリクエストが HTTP インターフェース経由で行われていない場合、この関数は空の文字列を返します。 +特定の HTTP ヘッダー(例:`Authentication` および `X-ClickHouse-*`)は制限されています。 + +この関数を使用するには、設定 `allow_get_client_http_header` を有効にする必要があります。 +セキュリティ上の理由から、この設定はデフォルトでは有効になっていません。一部のヘッダー、例えば `Cookie` は機密情報を含む可能性があるためです。 + +この関数における HTTP ヘッダーはケースセンシティブです。 + +関数が分散クエリのコンテキストで使用される場合、それはイニシエータノードでのみ非空結果を返します。 + +## showCertificate + +設定されている現在のサーバーの SSL 証明書に関する情報を表示します。OpenSSL 証明書を使用して接続を検証するよう ClickHouse を設定する方法については、[SSL-TLS の設定](https://clickhouse.com/docs/ja/guides/sre/configuring-ssl)を参照してください。 + +**構文** + +```sql +showCertificate() +``` + +**返り値** + +- 設定された SSL 証明書に関連するキーと値のペアのマップ。[Map](../data-types/map.md)([String](../data-types/string.md), [String](../data-types/string.md))。 + +**例** + +クエリ: + +```sql +SELECT showCertificate() FORMAT LineAsString; +``` + +結果: + +```response +{'version':'1','serial_number':'2D9071D64530052D48308473922C7ADAFA85D6C5','signature_algo':'sha256WithRSAEncryption','issuer':'/CN=marsnet.local CA','not_before':'May 7 17:01:21 2024 GMT','not_after':'May 7 17:01:21 2025 GMT','subject':'/CN=chnode1','pkey_algo':'rsaEncryption'} +``` + +## lowCardinalityIndices + +[LowCardinality](../data-types/lowcardinality.md) カラムのDictionary内での値の位置を返します。位置は 1 から始まります。LowCardinality はパートごとにDictionaryを持っているため、この関数は異なるパートで同じ値に対して異なる位置を返すことがあります。 + +**構文** + +```sql +lowCardinalityIndices(col) +``` + +**引数** + +- `col` — 低カーディナリティカラム。[LowCardinality](../data-types/lowcardinality.md)。 + +**返り値** + +- 現在のパートのDictionary内での値の位置。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test (s LowCardinality(String)) ENGINE = Memory; + +-- 二つのパートを作成します: + +INSERT INTO test VALUES ('ab'), ('cd'), ('ab'), ('ab'), ('df'); +INSERT INTO test VALUES ('ef'), ('cd'), ('ab'), ('cd'), ('ef'); + +SELECT s, lowCardinalityIndices(s) FROM test; +``` + +結果: + +```response + ┌─s──┬─lowCardinalityIndices(s)─┐ +1. │ ab │ 1 │ +2. │ cd │ 2 │ +3. │ ab │ 1 │ +4. │ ab │ 1 │ +5. │ df │ 3 │ + └────┴──────────────────────────┘ + ┌─s──┬─lowCardinalityIndices(s)─┐ + 6. │ ef │ 1 │ + 7. │ cd │ 2 │ + 8. │ ab │ 3 │ + 9. │ cd │ 2 │ +10. │ ef │ 1 │ + └────┴──────────────────────────┘ +``` +## lowCardinalityKeys + +[LowCardinality](../data-types/lowcardinality.md) カラムのDictionaryの値を返します。ブロックがDictionaryのサイズより小さいまたは大きい場合、結果はデフォルト値で切り詰めまたは拡張されます。LowCardinalityはパートごとに異なるDictionaryを持っているため、この関数は異なるパートで異なるDictionaryの値を返すことがあります。 + +**構文** + +```sql +lowCardinalityIndices(col) +``` + +**引数** + +- `col` — 低カーディナリティカラム。[LowCardinality](../data-types/lowcardinality.md)。 + +**返り値** + +- Dictionaryのキー。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +CREATE TABLE test (s LowCardinality(String)) ENGINE = Memory; + +-- 二つのパートを作成します: + +INSERT INTO test VALUES ('ab'), ('cd'), ('ab'), ('ab'), ('df'); +INSERT INTO test VALUES ('ef'), ('cd'), ('ab'), ('cd'), ('ef'); + +SELECT s, lowCardinalityKeys(s) FROM test; +``` + +結果: + +```response + ┌─s──┬─lowCardinalityKeys(s)─┐ +1. │ ef │ │ +2. │ cd │ ef │ +3. │ ab │ cd │ +4. │ cd │ ab │ +5. │ ef │ │ + └────┴───────────────────────┘ +```plaintext + ┌─s──┬─lowCardinalityKeys(s)─┐ + 6. │ ab │ │ + 7. │ cd │ ab │ + 8. │ ab │ cd │ + 9. │ ab │ df │ +10. │ df │ │ + └────┴───────────────────────┘ +``` + +## displayName + +[config](../../operations/configuration-files.md/#configuration-files) の `display_name` の値、または設定されていない場合はサーバーの完全修飾ドメイン名 (FQDN) を返します。 + +**構文** + +```sql +displayName() +``` + +**返される値** + +- 設定されている場合は config の `display_name` の値、または設定されていない場合はサーバーの FQDN。[String](../data-types/string.md)。 + +**例** + +`display_name` は `config.xml` で設定できます。例えば、`display_name` が 'production' に設定されているサーバーの場合: + +```xml + +production +``` + +クエリ: + +```sql +SELECT displayName(); +``` + +結果: + +```response +┌─displayName()─┐ +│ production │ +└───────────────┘ +``` + +## transactionID + +[トランザクション](https://clickhouse.com/docs/ja/guides/developer/transactional#transactions-commit-and-rollback) のIDを返します。 + +:::note +この関数はエクスペリメンタルな機能セットの一部です。設定にエクスペリメンタルなトランザクションサポートを有効にするための設定を追加します: + +``` + + 1 + +``` + +詳細については [トランザクション (ACID) サポート](https://clickhouse.com/docs/ja/guides/developer/transactional#transactions-commit-and-rollback) のページを参照してください。 +::: + +**構文** + +```sql +transactionID() +``` + +**返される値** + +- `start_csn`、`local_tid` および `host_id` から成るタプルを返します。[Tuple](../data-types/tuple.md)。 + +- `start_csn`: このトランザクションが開始されたときに見られた最新のコミットタイムスタンプであるグローバルシーケンシャル番号。[UInt64](../data-types/int-uint.md)。 +- `local_tid`: このホストが特定の `start_csn` 内で開始した各トランザクションにユニークであるローカルシーケンシャル番号。[UInt64](../data-types/int-uint.md)。 +- `host_id`: このトランザクションを開始したホストの UUID。[UUID](../data-types/uuid.md)。 + +**例** + +クエリ: + +```sql +BEGIN TRANSACTION; +SELECT transactionID(); +ROLLBACK; +``` + +結果: + +```response +┌─transactionID()────────────────────────────────┐ +│ (32,34,'0ee8b069-f2bb-4748-9eae-069c85b5252b') │ +└────────────────────────────────────────────────┘ +``` + +## transactionLatestSnapshot + +読み取り可能なトランザクションの最新のスナップショット(コマンドシーケンシャル番号)を返します。 + +:::note +この関数はエクスペリメンタルな機能セットの一部です。設定にエクスペリメンタルなトランザクションサポートを有効にするための設定を追加します: + +``` + + 1 + +``` + +詳細については [トランザクション (ACID) サポート](https://clickhouse.com/docs/ja/guides/developer/transactional#transactions-commit-and-rollback) のページを参照してください。 +::: + +**構文** + +```sql +transactionLatestSnapshot() +``` + +**返される値** + +- トランザクションの最新スナップショット (CSN) を返します。[UInt64](../data-types/int-uint.md) + +**例** + +クエリ: + +```sql +BEGIN TRANSACTION; +SELECT transactionLatestSnapshot(); +ROLLBACK; +``` + +結果: + +```response +┌─transactionLatestSnapshot()─┐ +│ 32 │ +└─────────────────────────────┘ +``` + +## transactionOldestSnapshot + +ある実行中の [トランザクション](https://clickhouse.com/docs/ja/guides/developer/transactional#transactions-commit-and-rollback) に対して表示可能な最古のスナップショット(コマンドシーケンス番号)を返します。 + +:::note +この関数はエクスペリメンタルな機能セットの一部です。設定にエクスペリメンタルなトランザクションサポートを有効にするための設定を追加します: + +``` + + 1 + +``` + +詳細については [トランザクション (ACID) サポート](https://clickhouse.com/docs/ja/guides/developer/transactional#transactions-commit-and-rollback) のページを参照してください。 +::: + +**構文** + +```sql +transactionOldestSnapshot() +``` + +**返される値** + +- トランザクションの最古のスナップショット (CSN) を返します。[UInt64](../data-types/int-uint.md) + +**例** + +クエリ: + +```sql +BEGIN TRANSACTION; +SELECT transactionOldestSnapshot(); +ROLLBACK; +``` + +結果: + +```response +┌─transactionOldestSnapshot()─┐ +│ 32 │ +└─────────────────────────────┘ +``` + +## getSubcolumn + +テーブルの式または識別子とサブカラムの名前を持つ定数文字列を取り、式から抽出されたリクエストされたサブカラムを返します。 + +**構文** + +```sql +getSubcolumn(col_name, subcol_name) +``` + +**引数** + +- `col_name` — テーブルの式または識別子。[Expression](../syntax.md/#expressions)、[Identifier](../syntax.md/#identifiers)。 +- `subcol_name` — サブカラムの名前。[String](../data-types/string.md)。 + +**返される値** + +- 抽出されたサブカラムを返します。 + +**例** + +クエリ: + +```sql +CREATE TABLE t_arr (arr Array(Tuple(subcolumn1 UInt32, subcolumn2 String))) ENGINE = MergeTree ORDER BY tuple(); +INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]); +SELECT getSubcolumn(arr, 'subcolumn1'), getSubcolumn(arr, 'subcolumn2') FROM t_arr; +``` + +結果: + +```response + ┌─getSubcolumn(arr, 'subcolumn1')─┬─getSubcolumn(arr, 'subcolumn2')─┐ +1. │ [1,2] │ ['Hello','World'] │ +2. │ [3,4,5] │ ['This','is','subcolumn'] │ + └─────────────────────────────────┴─────────────────────────────────┘ +``` + +## getTypeSerializationStreams + +データ型のストリームパスを列挙します。 + +:::note +この関数は開発者向けに意図されています。 +::: + +**構文** + +```sql +getTypeSerializationStreams(col) +``` + +**引数** + +- `col` — データタイプが検出されるカラムまたはデータタイプの文字列表現。 + +**返される値** + +- シリアル化されたサブストリームパスのすべてを含む配列を返します。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +**例** + +クエリ: + +```sql +SELECT getTypeSerializationStreams(tuple('a', 1, 'b', 2)); +``` + +結果: + +```response + ┌─getTypeSerializationStreams(('a', 1, 'b', 2))─────────────────────────────────────────────────────────────────────────┐ +1. │ ['{TupleElement(1), Regular}','{TupleElement(2), Regular}','{TupleElement(3), Regular}','{TupleElement(4), Regular}'] │ + └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT getTypeSerializationStreams('Map(String, Int64)'); +``` + +結果: + +```response + ┌─getTypeSerializationStreams('Map(String, Int64)')────────────────────────────────────────────────────────────────┐ +1. │ ['{ArraySizes}','{ArrayElements, TupleElement(keys), Regular}','{ArrayElements, TupleElement(values), Regular}'] │ + └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## globalVariable + +定数文字列引数を取り、その名前のグローバル変数の値を返します。この関数はMySQLとの互換性のために意図されており、ClickHouseの通常の操作には必要ではありません。定義されているのは少数のダミーのグローバル変数のみです。 + +**構文** + +```sql +globalVariable(name) +``` + +**引数** + +- `name` — グローバル変数名。[String](../data-types/string.md)。 + +**返される値** + +- 変数 `name` の値を返します。 + +**例** + +クエリ: + +```sql +SELECT globalVariable('max_allowed_packet'); +``` + +結果: + +```response +┌─globalVariable('max_allowed_packet')─┐ +│ 67108864 │ +└──────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/random-functions.md b/docs/ja/sql-reference/functions/random-functions.md new file mode 100644 index 00000000000..31282a5476a --- /dev/null +++ b/docs/ja/sql-reference/functions/random-functions.md @@ -0,0 +1,730 @@ +--- +slug: /ja/sql-reference/functions/random-functions +sidebar_position: 145 +sidebar_label: ランダム数 +--- + +# ランダム数生成関数 + +このセクションのすべての関数は、0または1つの引数を受け付けます。引数が提供された場合、その唯一の使用目的は、同じランダム関数の行内での異なる実行に異なるランダム値を返すように、[共通部分式の除去](../../sql-reference/functions/index.md#common-subexpression-elimination)を防ぐことです。 + +関連コンテンツ + +- ブログ: [ClickHouseでのランダムデータ生成](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse) + +:::note +ランダム数は暗号化を目的としないアルゴリズムによって生成されます。 +::: + +## rand + +均等な分布でランダムなUInt32の数値を返します。 + +線形合同法生成器を使用し、システムから取得した初期状態を用います。これは、ランダムに見えますが、実際には初期状態が知られている場合には予測可能であることを意味します。真にランダムであることが重要なシナリオでは、システムレベルの呼び出しや外部ライブラリとの統合などの代替手法を検討してください。 + +**構文** + +```sql +rand() +``` + +別名: `rand32` + +**引数** + +なし。 + +**戻り値** + +UInt32型の数値を返します。 + +**例** + +```sql +SELECT rand(); +``` + +```response +1569354847 -- 注意: 実際の出力はこの例に示された特定の数値ではなく、ランダムな数値になります +``` + +## rand64 + +ランダムなUInt64の整数(UInt64)を返します。 + +**構文** + +```sql +rand64() +``` + +**引数** + +なし。 + +**戻り値** + +均等な分布でのランダムなUInt64の数値。 + +線形合同法生成器を使用し、システムから取得した初期状態を用います。これは、ランダムに見えますが、実際には初期状態が知られている場合には予測可能であることを意味します。真にランダムであることが重要なシナリオでは、システムレベルの呼び出しや外部ライブラリとの統合などの代替手法を検討してください。 + +**例** + +```sql +SELECT rand64(); +``` + +```response +15030268859237645412 -- 注意: 実際の出力はこの例に示された特定の数値ではなく、ランダムな数値になります。 +``` + +## randCanonical + +ランダムなFloat64の数値を返します。 + +**構文** + +```sql +randCanonical() +``` + +**引数** + +なし。 + +**戻り値** + +0(含む)と1(含まない)との間のFloat64の値を返します。 + +**例** + +```sql +SELECT randCanonical(); +``` + +```response +0.3452178901234567 - 注意: 実際の出力はこの例に示された特定の数値ではなく、0と1の間のランダムなFloat64の数値になります。 +``` + +## randConstant + +単一のランダムな値で満たされた一定のカラムを生成します。`rand`と異なり、この関数は生成されたカラムの各行に同じランダム値を表示します。単一のクエリ内の行に対して一貫したランダムなシードが必要なシナリオで有用です。 + +**構文** + +```sql +randConstant([x]); +``` + +**引数** + +- **[x] (オプション):** 生成されたランダム値に影響を与えるオプションの式です。与えられても、結果の値は同じクエリ実行内で一定のままです。同じ式を使用する異なるクエリでは、異なる一定値が生成される可能性があります。 + +**戻り値** + +各行に同じランダム値を含むUInt32型のカラムを返します。 + +**実装の詳細** + +オプションの式が同じ場合でも、実際の出力はクエリの実行ごとに異なります。このオプションのパラメーターは、`randConstant`を単独で使用するのと比較して生成された値に大きな変更を加えるわけではありません。 + +**例** + +```sql +SELECT randConstant() AS random_value; +``` + +```response +| random_value | +|--------------| +| 1234567890 | +``` + +```sql +SELECT randConstant(10) AS random_value; +``` + +```response +| random_value | +|--------------| +| 9876543210 | +``` + +## randUniform + +[`min`, `max`]の範囲から均等に引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randUniform(min, max) +``` + +**引数** + +- `min` - `Float64` - 範囲の左境界, +- `max` - `Float64` - 範囲の右境界. + +**戻り値** + +[Float64](../data-types/float.md)型のランダムな数値。 + +**例** + +```sql +SELECT randUniform(5.5, 10) FROM numbers(5) +``` + +```response +┌─randUniform(5.5, 10)─┐ +│ 8.094978491443102 │ +│ 7.3181248914450885 │ +│ 7.177741903868262 │ +│ 6.483347380953762 │ +│ 6.122286382885112 │ +└──────────────────────┘ +``` + +## randNormal + +[正規分布](https://en.wikipedia.org/wiki/Normal_distribution)から引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randNormal(mean, variance) +``` + +**引数** + +- `mean` - `Float64` - 分布の平均, +- `variance` - `Float64` - 分布の[分散](https://en.wikipedia.org/wiki/Variance)。 + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randNormal(10, 2) FROM numbers(5) +``` + +結果: + +```result +┌──randNormal(10, 2)─┐ +│ 13.389228911709653 │ +│ 8.622949707401295 │ +│ 10.801887062682981 │ +│ 4.5220192605895315 │ +│ 10.901239123982567 │ +└────────────────────┘ +``` + +## randLogNormal + +[対数正規分布](https://en.wikipedia.org/wiki/Log-normal_distribution)から引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randLogNormal(mean, variance) +``` + +**引数** + +- `mean` - `Float64` - 分布の平均, +- `variance` - `Float64` - 分布の[分散](https://en.wikipedia.org/wiki/Variance)。 + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randLogNormal(100, 5) FROM numbers(5) +``` + +結果: + +```result +┌─randLogNormal(100, 5)─┐ +│ 1.295699673937363e48 │ +│ 9.719869109186684e39 │ +│ 6.110868203189557e42 │ +│ 9.912675872925529e39 │ +│ 2.3564708490552458e42 │ +└───────────────────────┘ +``` + +## randBinomial + +[二項分布](https://en.wikipedia.org/wiki/Binomial_distribution)から引かれたランダムなUInt64を返します。 + +**構文** + +```sql +randBinomial(experiments, probability) +``` + +**引数** + +- `experiments` - `UInt64` - 実験の回数, +- `probability` - `Float64` - 各実験における成功の確率, 0から1の間の値。 + +**戻り値** + +- ランダム数。[UInt64](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT randBinomial(100, .75) FROM numbers(5) +``` + +結果: + +```result +┌─randBinomial(100, 0.75)─┐ +│ 74 │ +│ 78 │ +│ 76 │ +│ 77 │ +│ 80 │ +└─────────────────────────┘ +``` + +## randNegativeBinomial + +[負の二項分布](https://en.wikipedia.org/wiki/Negative_binomial_distribution)から引かれたランダムなUInt64を返します。 + +**構文** + +```sql +randNegativeBinomial(experiments, probability) +``` + +**引数** + +- `experiments` - `UInt64` - 実験の回数, +- `probability` - `Float64` - 各実験における失敗の確率, 0から1の間の値。 + +**戻り値** + +- ランダム数。[UInt64](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT randNegativeBinomial(100, .75) FROM numbers(5) +``` + +結果: + +```result +┌─randNegativeBinomial(100, 0.75)─┐ +│ 33 │ +│ 32 │ +│ 39 │ +│ 40 │ +│ 50 │ +└─────────────────────────────────┘ +``` + +## randPoisson + +[ポアソン分布](https://en.wikipedia.org/wiki/Poisson_distribution)から引かれたランダムなUInt64を返します。 + +**構文** + +```sql +randPoisson(n) +``` + +**引数** + +- `n` - `UInt64` - 発生の平均数。 + +**戻り値** + +- ランダム数。[UInt64](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT randPoisson(10) FROM numbers(5) +``` + +結果: + +```result +┌─randPoisson(10)─┐ +│ 8 │ +│ 8 │ +│ 7 │ +│ 10 │ +│ 6 │ +└─────────────────┘ +``` + +## randBernoulli + +[ベルヌーイ分布](https://en.wikipedia.org/wiki/Bernoulli_distribution)から引かれたランダムなUInt64を返します。 + +**構文** + +```sql +randBernoulli(probability) +``` + +**引数** + +- `probability` - `Float64` - 成功の確率、0から1の間の値。 + +**戻り値** + +- ランダム数。[UInt64](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT randBernoulli(.75) FROM numbers(5) +``` + +結果: + +```result +┌─randBernoulli(0.75)─┐ +│ 1 │ +│ 1 │ +│ 0 │ +│ 1 │ +│ 1 │ +└─────────────────────┘ +``` + +## randExponential + +[指数分布](https://en.wikipedia.org/wiki/Exponential_distribution)から引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randExponential(lambda) +``` + +**引数** + +- `lambda` - `Float64` - ラムダ値。 + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randExponential(1/10) FROM numbers(5) +``` + +結果: + +```result +┌─randExponential(divide(1, 10))─┐ +│ 44.71628934340778 │ +│ 4.211013337903262 │ +│ 10.809402553207766 │ +│ 15.63959406553284 │ +│ 1.8148392319860158 │ +└────────────────────────────────┘ +``` + +## randChiSquared + +[カイ二乗分布](https://en.wikipedia.org/wiki/Chi-squared_distribution)から引かれたランダムなFloat64を返します。この分布は、`k`個の独立した標準正規乱数変数の平方和の分布です。 + +**構文** + +```sql +randChiSquared(degree_of_freedom) +``` + +**引数** + +- `degree_of_freedom` - `Float64` - 自由度。 + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randChiSquared(10) FROM numbers(5) +``` + +結果: + +```result +┌─randChiSquared(10)─┐ +│ 10.015463656521543 │ +│ 9.621799919882768 │ +│ 2.71785015634699 │ +│ 11.128188665931908 │ +│ 4.902063104425469 │ +└────────────────────┘ +``` + +## randStudentT + +[スチューデントのt分布](https://en.wikipedia.org/wiki/Student%27s_t-distribution)から引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randStudentT(degree_of_freedom) +``` + +**引数** + +- `degree_of_freedom` - `Float64` - 自由度。 + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randStudentT(10) FROM numbers(5) +``` + +結果: + +```result +┌─────randStudentT(10)─┐ +│ 1.2217309938538725 │ +│ 1.7941971681200541 │ +│ -0.28192176076784664 │ +│ 0.2508897721303792 │ +│ -2.7858432909761186 │ +└──────────────────────┘ +``` + +## randFisherF + +[F分布](https://en.wikipedia.org/wiki/F-distribution)から引かれたランダムなFloat64を返します。 + +**構文** + +```sql +randFisherF(d1, d2) +``` + +**引数** + +- `d1` - `Float64` - `X = (S1 / d1) / (S2 / d2)`におけるd1の自由度, +- `d2` - `Float64` - `X = (S1 / d1) / (S2 / d2)`におけるd2の自由度, + +**戻り値** + +- ランダム数。[Float64](../data-types/float.md)。 + +**例** + +```sql +SELECT randFisherF(10, 3) FROM numbers(5) +``` + +結果: + +```result +┌──randFisherF(10, 3)─┐ +│ 7.286287504216609 │ +│ 0.26590779413050386 │ +│ 0.22207610901168987 │ +│ 0.7953362728449572 │ +│ 0.19278885985221572 │ +└─────────────────────┘ +``` + +## randomString {#randomString} + +指定された長さのランダムなバイト(ゼロバイトを含む)で満たされた文字列を生成します。すべての文字が印刷可能であるとは限りません。 + +**構文** + +```sql +randomString(length) +``` + +**引数** + +- `length` — 文字列のバイト長。正の整数。 + +**戻り値** + +- ランダムなバイトで満たされた文字列。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT randomString(30) AS str, length(str) AS len FROM numbers(2) FORMAT Vertical; +``` + +結果: + +```text +Row 1: +────── +str: 3 G : pT ?w тi k aV f6 +len: 30 + +Row 2: +────── +str: 9 ,] ^ ) ]?? 8 +len: 30 +``` + +## randomFixedString + +指定された長さのランダムなバイト(ゼロバイトを含む)で満たされたバイナリ文字列を生成します。すべての文字が印刷可能であるとは限りません。 + +**構文** + +```sql +randomFixedString(length); +``` + +**引数** + +- `length` — 文字列のバイト長。[UInt64](../data-types/int-uint.md)。 + +**戻り値** + +- ランダムなバイトで満たされた文字列。[FixedString](../data-types/fixedstring.md)。 + +**例** + +クエリ: + +```sql +SELECT randomFixedString(13) as rnd, toTypeName(rnd) +``` + +結果: + +```text +┌─rnd──────┬─toTypeName(randomFixedString(13))─┐ +│ j▒h㋖HɨZ'▒ │ FixedString(13) │ +└──────────┴───────────────────────────────────┘ +``` + +## randomPrintableASCII + +ランダムな[ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters)文字の集合を持つ文字列を生成します。すべての文字が印刷可能です。 +`length < 0`を渡すと、この関数の動作は未定義です。 + +**構文** + +```sql +randomPrintableASCII(length) +``` + +**引数** + +- `length` — 文字列のバイト長。正の整数。 + +**戻り値** + +- ランダムな[ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters)印刷可能文字の集合を持つ文字列。[String](../data-types/string.md) + +**例** + +```sql +SELECT number, randomPrintableASCII(30) as str, length(str) FROM system.numbers LIMIT 3 +``` + +```text +┌─number─┬─str────────────────────────────┬─length(randomPrintableASCII(30))─┐ +│ 0 │ SuiCOSTvC0csfABSw=UcSzp2.`rv8x │ 30 │ +│ 1 │ 1Ag NlJ &RCN:*>HVPG;PE-nO"SUFD │ 30 │ +│ 2 │ /"+<"wUTh:=LjJ Vm!c&hI*m#XTfzz │ 30 │ +└────────┴────────────────────────────────┴──────────────────────────────────┘ +``` + +## randomStringUTF8 + +指定された長さのランダムな文字列を生成します。結果の文字列は有効なUTF-8コードポイントを含みます。コードポイントの値は、Unicodeに割り当てられている範囲外である可能性があります。 + +**構文** + +```sql +randomStringUTF8(length); +``` + +**引数** + +- `length` — コードポイントでの文字列の長さ。[UInt64](../data-types/int-uint.md)。 + +**戻り値** + +- UTF-8のランダム文字列。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT randomStringUTF8(13) +``` + +結果: + +```text +┌─randomStringUTF8(13)─┐ +│ 𘤗𙉝д兠庇󡅴󱱎󦐪􂕌𔊹𓰛 │ +└──────────────────────┘ +``` + +## fuzzBits {#fuzzBits} + +**構文** + +StringまたはFixedString `s`のビットをひっくり返します。それぞれのビットは確率`prob`で変更されます。 + +**構文** + +```sql +fuzzBits(s, prob) +``` + +**引数** + +- `s` - `String`または`FixedString`, +- `prob` - 0.0から1.0の間の定数`Float32/64`。 + +**戻り値** + +`同タイプの` s`と同じタイプのファズされた文字列。 + +**例** + +```sql +SELECT fuzzBits(materialize('abacaba'), 0.1) +FROM numbers(3) +``` + +結果: + +```result +┌─fuzzBits(materialize('abacaba'), 0.1)─┐ +│ abaaaja │ +│ a*cjab+ │ +│ aeca2A │ +└───────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/rounding-functions.md b/docs/ja/sql-reference/functions/rounding-functions.md new file mode 100644 index 00000000000..c6ee204a03b --- /dev/null +++ b/docs/ja/sql-reference/functions/rounding-functions.md @@ -0,0 +1,447 @@ +--- +slug: /ja/sql-reference/functions/rounding-functions +sidebar_position: 155 +sidebar_label: 丸め +--- + +# 丸め関数 + +## floor + +`x` 以下の最大の切り捨て数値を返します。切り捨て数値は 1 / 10 * N の倍数であり、1 / 10 * N が正確でない場合、適切なデータ型に最も近い数値です。 + +整数の引数は負の `N` 引数で丸められ、非負の `N` の場合、関数は `x` を返します。つまり、何もしません。 + +丸めによりオーバーフローが発生した場合(例: `floor(-128, -1)`)、結果は未定義です。 + +**構文** + +``` sql +floor(x[, N]) +``` + +**パラメーター** + +- `x` - 丸める値。[Float*](../data-types/float.md)、[Decimal*](../data-types/decimal.md)、または [(U)Int*](../data-types/int-uint.md)。 +- `N` . [(U)Int*](../data-types/int-uint.md)。デフォルトはゼロで、整数への丸めを意味します。負にすることも可能です。 + +**返される値** + +`x` と同じ型の切り捨て数値。 + +**例** + +クエリ: + +```sql +SELECT floor(123.45, 1) AS rounded +``` + +結果: + +``` +┌─rounded─┐ +│ 123.4 │ +└─────────┘ +``` + +クエリ: + +```sql +SELECT floor(123.45, -1) +``` + +結果: + +``` +┌─rounded─┐ +│ 120 │ +└─────────┘ +``` + +## ceiling + +`floor` と似ていますが、`x` 以上の最小の切り上げ数値を返します。 + +**構文** + +``` sql +ceiling(x[, N]) +``` + +別名: `ceil` + +## truncate + +`floor` と似ていますが、`x` の絶対値以下の最大絶対値を持つ切り捨て数値を返します。 + +**構文** + +```sql +truncate(x[, N]) +``` + +別名: `trunc`. + +**例** + +クエリ: + +```sql +SELECT truncate(123.499, 1) as res; +``` + +```response +┌───res─┐ +│ 123.4 │ +└───────┘ +``` + +## round + +指定された小数点以下の桁数に値を丸めます。 + +この関数は、指定されたオーダーの最も近い数値を返します。入力値が隣接する2つの数値に等しい距離の場合、この関数は [Float*](../data-types/float.md) 入力に対してはバンカーズ・ラウンディングを使用し、他の型([Decimal*](../data-types/decimal.md))に対しては零から遠ざけて丸めます。 + +**構文** + +``` sql +round(x[, N]) +``` + +**引数** + +- `x` — 丸める数値。[Float*](../data-types/float.md)、[Decimal*](../data-types/decimal.md)、または [(U)Int*](../data-types/int-uint.md)。 +- `N` — 丸める小数点以下の桁数。整数。デフォルトは `0`。 + - `N > 0` の場合、関数は小数点以下を丸めます。 + - `N < 0` の場合、関数は小数点の左を丸めます。 + - `N = 0` の場合、関数は次の整数に丸めます。 + +**返される値:** + +`x` と同じ型の切り捨て数値。 + +**例** + +`Float` 入力の場合の例: + +```sql +SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3; +``` + +``` +┌───x─┬─round(divide(number, 2))─┐ +│ 0 │ 0 │ +│ 0.5 │ 0 │ +│ 1 │ 1 │ +└─────┴──────────────────────────┘ +``` + +`Decimal` 入力の場合の例: + +```sql +SELECT cast(number / 2 AS Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3; +``` + +``` +┌───x─┬─round(CAST(divide(number, 2), 'Decimal(10, 4)'))─┐ +│ 0 │ 0 │ +│ 0.5 │ 1 │ +│ 1 │ 1 │ +└─────┴──────────────────────────────────────────────────┘ +``` + +末尾のゼロを保持するには、設定 `output_format_decimal_trailing_zeros` を有効にします: + +```sql +SELECT cast(number / 2 AS Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3 settings output_format_decimal_trailing_zeros=1; + +``` + +``` +┌──────x─┬─round(CAST(divide(number, 2), 'Decimal(10, 4)'))─┐ +│ 0.0000 │ 0.0000 │ +│ 0.5000 │ 1.0000 │ +│ 1.0000 │ 1.0000 │ +└────────┴──────────────────────────────────────────────────┘ +``` + +最も近い数値への丸めの例: + +``` text +round(3.2, 0) = 3 +round(4.1267, 2) = 4.13 +round(22,-1) = 20 +round(467,-2) = 500 +round(-467,-2) = -500 +``` + +バンカーズ・ラウンディング。 + +``` text +round(3.5) = 4 +round(4.5) = 4 +round(3.55, 1) = 3.6 +round(3.65, 1) = 3.6 +``` + +**関連項目** + +- [roundBankers](#roundbankers) + +## roundBankers + +指定された小数位置に数値を丸めます。 + +丸める数値が2つの数値の中間にある場合、この関数はバンカーズ・ラウンディングを使用します。バンカーズ・ラウンディングは、数値を丸める方法で、数値が中間にある場合、指定された小数位置で最も近い偶数に丸められます。例えば: 3.5は4に丸められ、2.5は2に丸められます。これは、[IEEE 754](https://en.wikipedia.org/wiki/IEEE_754#Roundings_to_nearest)で定義された浮動小数点数のデフォルトの丸め方法です。[round](#round) 関数も同じ丸めを浮動小数点数に対して行います。`roundBankers` 関数も整数を同じ方法で丸めます。例えば、 `roundBankers(45, -1) = 40`。 + +他のケースでは、関数は数値を最も近い整数に丸めます。 + +バンカーズ・ラウンディングを使用することで、この数値を合計または減算する結果に対する丸め数値の影響を減少させることができます。 + +例えば、1.5、2.5、3.5、4.5を異なる丸めで合計します: + +- 丸めなし: 1.5 + 2.5 + 3.5 + 4.5 = 12. +- バンカーズ・ラウンディング: 2 + 2 + 4 + 4 = 12. +- 最も近い整数への丸め: 2 + 3 + 4 + 5 = 14. + +**構文** + +``` sql +roundBankers(x [, N]) +``` + +**引数** + + - `N > 0` — 関数は小数点以下の右側にある指定された位置に数値を丸めます。例: `roundBankers(3.55, 1) = 3.6`。 + - `N < 0` — 関数は小数点左側の指定された位置に数値を丸めます。例: `roundBankers(24.55, -1) = 20`。 + - `N = 0` — 関数は数値を整数に丸めます。この場合、引数は省略可能です。例: `roundBankers(2.5) = 2`。 + +- `x` — 丸める数値。[Float*](../data-types/float.md)、[Decimal*](../data-types/decimal.md)、または [(U)Int*](../data-types/int-uint.md)。 +- `N` — 丸める小数点以下の桁数。整数。デフォルトは `0`。 + - `N > 0` の場合、関数は小数点以下を丸めます。 + - `N < 0` の場合、関数は小数点の左を丸めます。 + - `N = 0` の場合、関数は次の整数に丸めます。 + +**返される値** + +バンカーズ・ラウンディング法で丸めれた値。 + +**例** + +クエリ: + +```sql + SELECT number / 2 AS x, roundBankers(x, 0) AS b fROM system.numbers limit 10 +``` + +結果: + +``` +┌───x─┬─b─┐ +│ 0 │ 0 │ +│ 0.5 │ 0 │ +│ 1 │ 1 │ +│ 1.5 │ 2 │ +│ 2 │ 2 │ +│ 2.5 │ 2 │ +│ 3 │ 3 │ +│ 3.5 │ 4 │ +│ 4 │ 4 │ +│ 4.5 │ 4 │ +└─────┴───┘ +``` + +バンカーズ・ラウンディングの例: + +``` +roundBankers(0.4) = 0 +roundBankers(-3.5) = -4 +roundBankers(4.5) = 4 +roundBankers(3.55, 1) = 3.6 +roundBankers(3.65, 1) = 3.6 +roundBankers(10.35, 1) = 10.4 +roundBankers(10.755, 2) = 10.76 +``` + +**関連項目** + +- [round](#round) + +## roundToExp2 + +数値を受け取り、その数値が1未満の場合、`0` を返します。それ以外の場合は、最も近い2の指数に丸めます。 + +**構文** + +```sql +roundToExp2(num) +``` + +**パラメーター** + +- `num`: 丸める数値。[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)。 + +**返される値** + +- `num` が1未満の場合 `0`。[UInt8](../data-types/int-uint.md)。 +- `num` を最も近い2の指数に丸めます。[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT *, roundToExp2(*) FROM system.numbers WHERE number IN (0, 2, 5, 10, 19, 50) +``` + +結果: + +```response +┌─number─┬─roundToExp2(number)─┐ +│ 0 │ 0 │ +│ 2 │ 2 │ +│ 5 │ 4 │ +│ 10 │ 8 │ +│ 19 │ 16 │ +│ 50 │ 32 │ +└────────┴─────────────────────┘ +``` + +## roundDuration + +数値を受け取り、その数値が1未満の場合、`0` を返します。それ以外の場合は、よく使われる期間のセットから最も近い数値に丸めます: `1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000`。 + +**構文** + +```sql +roundDuration(num) +``` + +**パラメーター** + +- `num`: よく使われる期間セットの一つに丸める数値。[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)。 + +**返される値** + +- `num` が1未満の場合 `0`。 +- それ以外の場合: `1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000` の一つ。[UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT *, roundDuration(*) FROM system.numbers WHERE number IN (0, 9, 19, 47, 101, 149, 205, 271, 421, 789, 1423, 2345, 4567, 9876, 24680, 42573) +``` + +結果: + +```response +┌─number─┬─roundDuration(number)─┐ +│ 0 │ 0 │ +│ 9 │ 1 │ +│ 19 │ 10 │ +│ 47 │ 30 │ +│ 101 │ 60 │ +│ 149 │ 120 │ +│ 205 │ 180 │ +│ 271 │ 240 │ +│ 421 │ 300 │ +│ 789 │ 600 │ +│ 1423 │ 1200 │ +│ 2345 │ 1800 │ +│ 4567 │ 3600 │ +│ 9876 │ 7200 │ +│ 24680 │ 18000 │ +│ 42573 │ 36000 │ +└────────┴───────────────────────┘ +``` + +## roundAge + +さまざまな一般的な人間の年齢範囲内で数値を受取り、その範囲内の最大または最小値を返します。 + +**構文** + +```sql +roundAge(num) +``` + +**パラメーター** + +- `age`: 年齢を表す数値(年単位)。[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)。 + +**返される値** + +- `age` が1未満の場合 `0` を返します。 +- `1 <= age <= 17` の場合 `17` を返します。 +- `18 <= age <= 24` の場合 `18` を返します。 +- `25 <= age <= 34` の場合 `25` を返します。 +- `35 <= age <= 44` の場合 `35` を返します。 +- `45 <= age <= 54` の場合 `45` を返します。 +- `age >= 55` の場合 `55` を返します。 + +型: [UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT *, roundAge(*) FROM system.numbers WHERE number IN (0, 5, 20, 31, 37, 54, 72); +``` + +結果: + +```response +┌─number─┬─roundAge(number)─┐ +│ 0 │ 0 │ +│ 5 │ 17 │ +│ 20 │ 18 │ +│ 31 │ 25 │ +│ 37 │ 35 │ +│ 54 │ 45 │ +│ 72 │ 55 │ +└────────┴──────────────────┘ +``` + +## roundDown + +数値を受け取り、指定された配列内の要素に対して切り捨てを行います。値が最も低い境界よりも小さい場合、最も低い境界が返されます。 + +**構文** + +```sql +roundDown(num, arr) +``` + +**パラメーター** + +- `num`: 切り捨てする数値。[Numeric](../data-types/int-uint.md)。 +- `arr`: `age` を切り捨てするための要素の配列。[Array](../data-types/array.md)の[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)型。 + +**返される値** + +- 配列`arr` の要素に切り捨てられた数値。値が最も低い境界より小さい場合、最も低い境界が返されます。[UInt](../data-types/int-uint.md)/[Float](../data-types/float.md)型は`arr`の型により決定されます。 + +**例** + +クエリ: + +```sql +SELECT *, roundDown(*, [3, 4, 5]) FROM system.numbers WHERE number IN (0, 1, 2, 3, 4, 5) +``` + +結果: + +```response +┌─number─┬─roundDown(number, [3, 4, 5])─┐ +│ 0 │ 3 │ +│ 1 │ 3 │ +│ 2 │ 3 │ +│ 3 │ 3 │ +│ 4 │ 4 │ +│ 5 │ 5 │ +└────────┴──────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/splitting-merging-functions.md b/docs/ja/sql-reference/functions/splitting-merging-functions.md new file mode 100644 index 00000000000..ccc1b23af80 --- /dev/null +++ b/docs/ja/sql-reference/functions/splitting-merging-functions.md @@ -0,0 +1,398 @@ +--- +slug: /ja/sql-reference/functions/splitting-merging-functions +sidebar_position: 165 +sidebar_label: 文字列の分割 +--- + +# 文字列を分割するための関数 + +## splitByChar + +特定の文字で文字列を分割してサブ文字列を生成します。1文字からなる定数文字列 `separator` を使用します。選択されたサブ文字列の配列を返します。文字列の先頭や末尾に区切り文字がある場合や、連続して区切り文字が存在する場合は、空のサブ文字列も選択されることがあります。 + +**構文** + +``` sql +splitByChar(separator, s[, max_substrings])) +``` + +**引数** + +- `separator` — 1文字からなる区切り文字。[String](../data-types/string.md)。 +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返される配列には最大で `max_substrings` のサブ文字列が含まれます。そうでない場合、可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +空のサブ文字列が選択される状況: + +- 文字列の先頭または末尾に区切り文字がある場合; +- 連続して複数の区切り文字がある場合; +- 元の文字列 `s` が空である場合。 + +:::note +ClickHouse v22.11 以降、パラメータ `max_substrings` の動作が変更されました。それ以前のバージョンでは、`max_substrings > 0` は `max_substring` 回の分割が行われ、文字列の残りはリストの最後の要素として返されていました。 +例えば、 +- v22.10 では: `SELECT splitByChar('=', 'a=b=c=d', 2);` は `['a','b','c=d']` を返しました +- v22.11 では: `SELECT splitByChar('=', 'a=b=c=d', 2);` は `['a','b']` を返しました + +ClickHouseのv22.11以前のような動作を得るには、[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定してください。 +`SELECT splitByChar('=', 'a=b=c=d', 2) SETTINGS splitby_max_substrings_includes_remaining_string = 1 -- ['a', 'b=c=d']` +::: + +**例** + +``` sql +SELECT splitByChar(',', '1,2,3,abcde'); +``` + +結果: + +``` text +┌─splitByChar(',', '1,2,3,abcde')─┐ +│ ['1','2','3','abcde'] │ +└─────────────────────────────────┘ +``` + +## splitByString + +文字列を特定の文字列で分割します。複数文字からなる定数文字列 `separator` を区切り文字として使用します。文字列 `separator` が空の場合、文字列 `s` を単一文字の配列に分割します。 + +**構文** + +``` sql +splitByString(separator, s[, max_substrings])) +``` + +**引数** + +- `separator` — 区切り文字。[String](../data-types/string.md)。 +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返されるサブ文字列は最大で `max_substrings` になり、それ以外は可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +空のサブ文字列が選択される状況: + +- 非空の区切り文字が文字列の先頭や末尾にある場合; +- 非空の区切り文字が連続している場合; +- 元の文字列 `s` が空で区切り文字が空ではない場合。 + +:::note +[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定すると、`max_substrings` > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0)。 +::: + +**例** + +``` sql +SELECT splitByString(', ', '1, 2 3, 4,5, abcde'); +``` + +結果: + +``` text +┌─splitByString(', ', '1, 2 3, 4,5, abcde')─┐ +│ ['1','2 3','4,5','abcde'] │ +└───────────────────────────────────────────┘ +``` + +``` sql +SELECT splitByString('', 'abcde'); +``` + +結果: + +``` text +┌─splitByString('', 'abcde')─┐ +│ ['a','b','c','d','e'] │ +└────────────────────────────┘ +``` + +## splitByRegexp + +正規表現で指定したパターンを区切りとして文字列を分割します。正規表現文字列 `regexp` を区切り文字として使用します。`regexp` が空の場合、文字列 `s` を1文字ずつの配列に分割します。この正規表現と一致する部分が見つからない場合、文字列 `s` は分割されません。 + +**構文** + +``` sql +splitByRegexp(regexp, s[, max_substrings])) +``` + +**引数** + +- `regexp` — 正規表現。定数。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返されるサブ文字列は最大で `max_substrings` になります。それ以外は、可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +空のサブ文字列が選択される状況: + +- 非空の正規表現の一致が文字列の先頭または末尾にある場合; +- 非空の正規表現の一致が連続している場合; +- 元の文字列 `s` が空で正規表現が空ではない場合。 + +:::note +[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定すると、`max_substrings` > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0)。 +::: + +**例** + +``` sql +SELECT splitByRegexp('\\d+', 'a12bc23de345f'); +``` + +結果: + +``` text +┌─splitByRegexp('\\d+', 'a12bc23de345f')─┐ +│ ['a','bc','de','f'] │ +└────────────────────────────────────────┘ +``` + +``` sql +SELECT splitByRegexp('', 'abcde'); +``` + +結果: + +``` text +┌─splitByRegexp('', 'abcde')─┐ +│ ['a','b','c','d','e'] │ +└────────────────────────────┘ +``` + +## splitByWhitespace + +空白文字で文字列を分割します。選択されたサブ文字列の配列を返します。 + +**構文** + +``` sql +splitByWhitespace(s[, max_substrings])) +``` + +**引数** + +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返されるサブ文字列は最大で `max_substrings` になります。それ以外は、可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +:::note +[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定すると、`max_substrings` > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0)。 +::: + +**例** + +``` sql +SELECT splitByWhitespace(' 1! a, b. '); +``` + +結果: + +``` text +┌─splitByWhitespace(' 1! a, b. ')─┐ +│ ['1!','a,','b.'] │ +└─────────────────────────────────────┘ +``` + +## splitByNonAlpha + +空白または句読点で文字列を分割します。選択されたサブ文字列の配列を返します。 + +**構文** + +``` sql +splitByNonAlpha(s[, max_substrings])) +``` + +**引数** + +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返されるサブ文字列は最大で `max_substrings` になります。それ以外は、可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +:::note +[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定すると、`max_substrings` > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0)。 +::: + +**例** + +``` sql +SELECT splitByNonAlpha(' 1! a, b. '); +``` + +結果: + +``` text +┌─splitByNonAlpha(' 1! a, b. ')─┐ +│ ['1','a','b'] │ +└───────────────────────────────────┘ +``` + +## arrayStringConcat + +配列内の値を区切り文字で結合して文字列を返します。`separator` はオプションのパラメータであり、デフォルトでは空文字列として設定されています。 + +**構文** + +```sql +arrayStringConcat(arr\[, separator\]) +``` + +**例** + +``` sql +SELECT arrayStringConcat(['12/05/2021', '12:50:00'], ' ') AS DateString; +``` + +結果: + +```text +┌─DateString──────────┐ +│ 12/05/2021 12:50:00 │ +└─────────────────────┘ +``` + +## alphaTokens + +a-z および A-Z の範囲の連続したバイト列のサブ文字列を選択します。サブ文字列の配列を返します。 + +**構文** + +``` sql +alphaTokens(s[, max_substrings])) +``` + +エイリアス: `splitByAlpha` + +**引数** + +- `s` — 分割する文字列。[String](../data-types/string.md)。 +- `max_substrings` — 任意の `Int64`。デフォルトは0です。`max_substrings` > 0 の場合、返されるサブ文字列は最大で `max_substrings` になります。それ以外は、可能な限り多くのサブ文字列が返されます。 + +**返される値** + +- 選択されたサブ文字列の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +:::note +[splitby_max_substrings_includes_remaining_string](../../operations/settings/settings.md#splitby_max_substrings_includes_remaining_string) を設定すると、`max_substrings` > 0 の場合に残りの文字列が結果配列の最後の要素に含まれるかどうかを制御します(デフォルト: 0)。 +::: + +**例** + +``` sql +SELECT alphaTokens('abca1abc'); +``` + +結果: + +``` text +┌─alphaTokens('abca1abc')─┐ +│ ['abca','abc'] │ +└─────────────────────────┘ +``` + +## extractAllGroups + +正規表現で一致する非重複サブ文字列からすべてのグループを抽出します。 + +**構文** + +``` sql +extractAllGroups(text, regexp) +``` + +**引数** + +- `text` — [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `regexp` — 正規表現。定数。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- 少なくとも1つの一致するグループが見つかった場合、`Array(Array(String))` をグループID(1からN、`regexp`内のキャプチャグループの数N)でクラスタリングして返します。一致するグループがない場合、空の配列を返します。[Array](../data-types/array.md) 。 + +**例** + +``` sql +SELECT extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)'); +``` + +結果: + +``` text +┌─extractAllGroups('abc=123, 8="hkl"', '("[^"]+"|\\w+)=("[^"]+"|\\w+)')─┐ +│ [['abc','123'],['8','"hkl"']] │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +## ngrams + +UTF-8文字列を `ngramsize` 記号のn-gramに分割します。 + +**構文** + +``` sql +ngrams(string, ngramsize) +``` + +**引数** + +- `string` — 文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `ngramsize` — n-gramのサイズ。[UInt](../data-types/int-uint.md)。 + +**返される値** + +- n-gramの配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +**例** + +``` sql +SELECT ngrams('ClickHouse', 3); +``` + +結果: + +``` text +┌─ngrams('ClickHouse', 3)───────────────────────────┐ +│ ['Cli','lic','ick','ckH','kHo','Hou','ous','use'] │ +└───────────────────────────────────────────────────┘ +``` + +## tokens + +ASCIIの非英数字文字をセパレータとして使用して文字列をトークンに分割します。 + +**引数** + +- `input_string` — [String](../data-types/string.md)データ型オブジェクトで表された任意のバイトセット。 + +**返される値** + +- 入力文字列からのトークン配列。[Array](../data-types/array.md)。 + +**例** + +``` sql +SELECT tokens('test1,;\\ test2,;\\ test3,;\\ test4') AS tokens; +``` + +結果: + +``` text +┌─tokens────────────────────────────┐ +│ ['test1','test2','test3','test4'] │ +└───────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/string-functions.md b/docs/ja/sql-reference/functions/string-functions.md new file mode 100644 index 00000000000..4f76715de43 --- /dev/null +++ b/docs/ja/sql-reference/functions/string-functions.md @@ -0,0 +1,2527 @@ +--- +slug: /ja/sql-reference/functions/string-functions +sidebar_position: 170 +sidebar_label: Strings +--- + +import VersionBadge from '@theme/badges/VersionBadge'; + +# 文字列を操作するための関数 + +文字列の[検索](string-search-functions.md)や[置換](string-replace-functions.md)の関数は別途説明されています。 + +## empty + +入力文字列が空であるかどうかをチェックします。文字列は、たとえこのバイトがスペースやヌルバイトであっても、少なくとも1バイト含んでいる場合は空ではないと見なされます。 + +この関数は[配列](array-functions.md#function-empty)や[UUIDs](uuid-functions.md#empty)でも使用できます。 + +**構文** + +``` sql +empty(x) +``` + +**引数** + +- `x` — 入力値。[String](../data-types/string.md)。 + +**返される値** + +- 空文字列の場合は `1`、空でない文字列の場合は `0` を返します。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT empty(''); +``` + +結果: + +```result +┌─empty('')─┐ +│ 1 │ +└───────────┘ +``` + +## notEmpty + +入力文字列が空でないかどうかをチェックします。文字列は、たとえこのバイトがスペースやヌルバイトであっても、少なくとも1バイト含んでいる場合は空ではないと見なされます。 + +この関数は[配列](array-functions.md#function-notempty)や[UUIDs](uuid-functions.md#notempty)でも使用できます。 + +**構文** + +``` sql +notEmpty(x) +``` + +**引数** + +- `x` — 入力値。[String](../data-types/string.md)。 + +**返される値** + +- 空でない文字列の場合は `1`、空文字列の場合は `0` を返します。[UInt8](../data-types/int-uint.md)。 + +**例** + +```sql +SELECT notEmpty('text'); +``` + +結果: + +```result +┌─notEmpty('text')─┐ +│ 1 │ +└──────────────────┘ +``` + +## length + +文字列の長さを文字やUnicodeコードポイントではなくバイトで返します。この関数は配列にも使用できます。 + +別名: `OCTET_LENGTH` + +**構文** + +```sql +length(s) +``` + +**パラメータ** + +- `s` — 入力文字列または配列。[String](../data-types/string)/[Array](../data-types/array). + +**返される値** + +- 文字列または配列 `s` の長さをバイトで返します。[UInt64](../data-types/int-uint). + +**例** + +クエリ: + +```sql +SELECT length('Hello, world!'); +``` + +結果: + +```response +┌─length('Hello, world!')─┐ +│ 13 │ +└─────────────────────────┘ +``` + +クエリ: + +```sql +SELECT length([1, 2, 3, 4]); +``` + +結果: + +```response +┌─length([1, 2, 3, 4])─┐ +│ 4 │ +└──────────────────────┘ +``` + +## lengthUTF8 + +文字列の長さをUnicodeコードポイントで返します。UTF-8エンコードされたテキストであることを前提にしています。この前提が誤っている場合、例外はスローされず、結果は未定義です。 + +別名: +- `CHAR_LENGTH` +- `CHARACTER_LENGTH` + +**構文** + +```sql +lengthUTF8(s) +``` + +**パラメータ** + +- `s` — 有効なUTF-8エンコードされたテキストを含む文字列。[String](../data-types/string). + +**返される値** + +- 文字列 `s` の長さをUnicodeコードポイントで返します。[UInt64](../data-types/int-uint.md). + +**例** + +クエリ: + +```sql +SELECT lengthUTF8('Здравствуй, мир!'); +``` + +結果: + +```response +┌─lengthUTF8('Здравствуй, мир!')─┐ +│ 16 │ +└────────────────────────────────┘ +``` + +## left + +左から指定された `offset` の位置から始まる文字列 `s` の部分文字列を返します。 + +**構文** + +``` sql +left(s, offset) +``` + +**パラメータ** + +- `s` — 部分文字列を計算する文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md). +- `offset` — オフセットのバイト数。[UInt*](../data-types/int-uint). + +**返される値** + +- 正の `offset` の場合:文字列の左から始まる、`offset` バイト数の部分文字列。 +- 負の `offset` の場合:文字列の左から始まる、`length(s) - |offset|` バイト数の部分文字列。 +- `length` が0の場合は空文字列。 + +**例** + +クエリ: + +```sql +SELECT left('Hello', 3); +``` + +結果: + +```response +Hel +``` + +クエリ: + +```sql +SELECT left('Hello', -3); +``` + +結果: + +```response +He +``` + +## leftUTF8 + +左から指定された `offset` の位置から始まるUTF-8エンコードされた文字列 `s` の部分文字列を返します。 + +**構文** + +``` sql +leftUTF8(s, offset) +``` + +**パラメータ** + +- `s` — 部分文字列を計算するUTF-8エンコードされた文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md). +- `offset` — オフセットのバイト数。[UInt*](../data-types/int-uint). + +**返される値** + +- 正の `offset` の場合:文字列の左から始まる、`offset` バイト数の部分文字列。 +- 負の `offset` の場合:文字列の左から始まる、`length(s) - |offset|` バイト数の部分文字列。 +- `length` が0の場合は空文字列。 + +**例** + +クエリ: + +```sql +SELECT leftUTF8('Привет', 4); +``` + +結果: + +```response +Прив +``` + +クエリ: + +```sql +SELECT leftUTF8('Привет', -4); +``` + +結果: + +```response +Пр +``` + +## leftPad + +文字列を左からスペースまたは指定された文字列(必要であれば複数回)で、結果の文字列が指定された `length` に達するまで埋めます。 + +**構文** + +``` sql +leftPad(string, length[, pad_string]) +``` + +別名: `LPAD` + +**引数** + +- `string` — 埋めるべき入力文字列。[String](../data-types/string.md). +- `length` — 結果の文字列の長さ。[UInt または Int](../data-types/int-uint.md)。入力文字列の長さよりも小さい場合、入力文字列は `length` 文字に短縮されます。 +- `pad_string` — 入力文字列を埋めるための文字列。[String](../data-types/string.md). オプション。指定しない場合、入力文字列はスペースで埋められます。 + +**返される値** + +- 指定された長さの左寄せされた文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT leftPad('abc', 7, '*'), leftPad('def', 7); +``` + +結果: + +```result +┌─leftPad('abc', 7, '*')─┬─leftPad('def', 7)─┐ +│ ****abc │ def │ +└────────────────────────┴───────────────────┘ +``` + +## leftPadUTF8 + +UTF-8文字列を左からスペースまたは指定した文字列で埋めます(必要であれば複数回)、結果の文字列が指定した長さに達するまで。文字列の長さはバイトではなくコードポイントで測定されます。 + +**構文** + +``` sql +leftPadUTF8(string, length[, pad_string]) +``` + +**引数** + +- `string` — 埋めるべき入力文字列。[String](../data-types/string.md). +- `length` — 結果の文字列の長さ。[UInt または Int](../data-types/int-uint.md)。入力文字列の長さよりも小さい場合、入力文字列は `length` 文字に短縮されます。 +- `pad_string` — 入力文字列を埋めるための文字列。[String](../data-types/string.md). オプション。指定しない場合、入力文字列はスペースで埋められます。 + +**返される値** + +- 指定された長さの左寄せされた文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT leftPadUTF8('абвг', 7, '*'), leftPadUTF8('дежз', 7); +``` + +結果: + +```result +┌─leftPadUTF8('абвг', 7, '*')─┬─leftPadUTF8('дежз', 7)─┐ +│ ***абвг │ дежз │ +└─────────────────────────────┴────────────────────────┘ +``` + +## right + +右から指定された `offset` の位置から始まる文字列 `s` の部分文字列を返します。 + +**構文** + +``` sql +right(s, offset) +``` + +**パラメータ** + +- `s` — 部分文字列を計算する文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md). +- `offset` — オフセットのバイト数。[UInt*](../data-types/int-uint). + +**返される値** + +- 正の `offset` の場合:文字列の右から始まる、`offset` バイト数の部分文字列。 +- 負の `offset` の場合:文字列の右から始まる、`length(s) - |offset|` バイト数の部分文字列。 +- `length` が0の場合は空文字列。 + +**例** + +クエリ: + +```sql +SELECT right('Hello', 3); +``` + +結果: + +```response +llo +``` + +クエリ: + +```sql +SELECT right('Hello', -3); +``` + +結果: + +```response +lo +``` + +## rightUTF8 + +右から指定された `offset` の位置から始まるUTF-8エンコードされた文字列 `s` の部分文字列を返します。 + +**構文** + +``` sql +rightUTF8(s, offset) +``` + +**パラメータ** + +- `s` — 部分文字列を計算するUTF-8エンコードされた文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md). +- `offset` — オフセットのバイト数。[UInt*](../data-types/int-uint). + +**返される値** + +- 正の `offset` の場合:文字列の右から始まる、`offset` バイト数の部分文字列。 +- 負の `offset` の場合:文字列の右から始まる、`length(s) - |offset|` バイト数の部分文字列。 +- `length` が0の場合は空文字列。 + +**例** + +クエリ: + +```sql +SELECT rightUTF8('Привет', 4); +``` + +結果: + +```response +ивет +``` + +クエリ: + +```sql +SELECT rightUTF8('Привет', -4); +``` + +結果: + +```response +ет +``` + +## rightPad + +文字列を右からスペースまたは指定された文字列(必要であれば複数回)で、結果の文字列が指定された `length` に達するまで埋めます。 + +**構文** + +``` sql +rightPad(string, length[, pad_string]) +``` + +別名: `RPAD` + +**引数** + +- `string` — 埋めるべき入力文字列。[String](../data-types/string.md). +- `length` — 結果の文字列の長さ。[UInt または Int](../data-types/int-uint.md)。入力文字列の長さよりも小さい場合、入力文字列は `length` 文字に短縮されます。 +- `pad_string` — 入力文字列を埋めるための文字列。[String](../data-types/string.md). オプション。指定しない場合、入力文字列はスペースで埋められます。 + +**返される値** + +- 指定された長さの右寄せされた文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT rightPad('abc', 7, '*'), rightPad('abc', 7); +``` + +結果: + +```result +┌─rightPad('abc', 7, '*')─┬─rightPad('abc', 7)─┐ +│ abc**** │ abc │ +└─────────────────────────┴────────────────────┘ +``` + +## rightPadUTF8 + +UTF-8文字列を右からスペースまたは指定した文字列で埋めます(必要であれば複数回)、結果の文字列が指定した長さに達するまで。文字列の長さはバイトではなくコードポイントで測定されます。 + +**構文** + +``` sql +rightPadUTF8(string, length[, pad_string]) +``` + +**引数** + +- `string` — 埋めるべき入力文字列。[String](../data-types/string.md). +- `length` — 結果の文字列の長さ。[UInt または Int](../data-types/int-uint.md)。入力文字列の長さよりも小さい場合、入力文字列は `length` 文字に短縮されます。 +- `pad_string` — 入力文字列を埋めるための文字列。[String](../data-types/string.md). オプション。指定しない場合、入力文字列はスペースで埋められます。 + +**返される値** + +- 指定され長さの絵文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT rightPadUTF8('абвг', 7, '*'), rightPadUTF8('абвг', 7); +``` + +結果: + +```result +┌─rightPadUTF8('абвг', 7, '*')─┬─rightPadUTF8('абвг', 7)─┐ +│ абвг*** │ абвг │ +└──────────────────────────────┴─────────────────────────┘ +``` + +## lower + +文字列内のASCIIラテンシンボルを小文字に変換します。 + +**構文** + +``` sql +lower(input) +``` + +別名: `lcase` + +**パラメータ** + +- `input`: 文字列のタイプ [String](../data-types/string.md)。 + +**返される値** + +- [String](../data-types/string.md) データタイプの値。 + +**例** + +クエリ: + +```sql +SELECT lower('CLICKHOUSE'); +``` + +```response +┌─lower('CLICKHOUSE')─┐ +│ clickhouse │ +└─────────────────────┘ +``` + +## upper + +文字列内のASCIIラテンシンボルを大文字に変換します。 + +**構文** + +``` sql +upper(input) +``` + +別名: `ucase` + +**パラメータ** + +- `input` — 文字列のタイプ [String](../data-types/string.md)。 + +**返される値** + +- [String](../data-types/string.md) データタイプの値。 + +**例** + +クエリ: + +``` sql +SELECT upper('clickhouse'); +``` + +``` response +┌─upper('clickhouse')─┐ +│ CLICKHOUSE │ +└─────────────────────┘ +``` + +## lowerUTF8 + +文字列を小文字に変換します。文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +:::note +言語を検出しません。たとえば、トルコ語の場合、結果は完全に正確ではない可能性があります (i/İ vs. i/I)。あるコードポイントのUTF-8バイトシーケンスの長さが大文字と小文字で異なる場合(例: `ẞ` と `ß`)、このコードポイントに対する結果は正しくない可能性があります。 +::: + +**構文** + +```sql +lowerUTF8(input) +``` + +**パラメータ** + +- `input` — 文字列のタイプ [String](../data-types/string.md)。 + +**返される値** + +- [String](../data-types/string.md) データタイプの値。 + +**例** + +クエリ: + +``` sql +SELECT lowerUTF8('MÜNCHEN') as Lowerutf8; +``` + +結果: + +``` response +┌─Lowerutf8─┐ +│ münchen │ +└───────────┘ +``` + +## upperUTF8 + +文字列を大文字に変換します。文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +:::note +言語を検出しません。たとえば、トルコ語の場合、結果は完全に正確ではない可能性があります (i/İ vs. i/I)。あるコードポイントのUTF-8バイトシーケンスの長さが大文字と小文字で異なる場合(例: `ẞ` と `ß`)、このコードポイントに対する結果は正しくない可能性があります。 +::: + +**構文** + +```sql +upperUTF8(input) +``` + +**パラメータ** + +- `input` — 文字列のタイプ [String](../data-types/string.md)。 + +**返される値** + +- [String](../data-types/string.md) データタイプの値。 + +**例** + +クエリ: + +``` sql +SELECT upperUTF8('München') as Upperutf8; +``` + +結果: + +``` response +┌─Upperutf8─┐ +│ MÜNCHEN │ +└───────────┘ +``` + +## isValidUTF8 + +バイトセットが有効なUTF-8でエンコードされたテキストを構成している場合に1を返し、そうでない場合は0を返します。 + +**構文** + +``` sql +isValidUTF8(input) +``` + +**パラメータ** + +- `input` — 文字列のタイプ [String](../data-types/string.md)。 + +**返される値** + +- 有効なUTF-8でエンコードされたテキストを構成している場合は `1` を、それ以外の場合は `0` を返します。 + +クエリ: + +``` sql +SELECT isValidUTF8('\xc3\xb1') AS valid, isValidUTF8('\xc3\x28') AS invalid; +``` + +結果: + +``` response +┌─valid─┬─invalid─┐ +│ 1 │ 0 │ +└───────┴─────────┘ +``` + +## toValidUTF8 + +無効なUTF-8文字を `�` (U+FFFD) 文字に置き換えます。連続する無効な文字は、1つの置換文字にまとめられます。 + +**構文** + +``` sql +toValidUTF8(input_string) +``` + +**引数** + +- `input_string` — バイトセットとして表現された[String](../data-types/string.md)データタイプのオブジェクト。 + +**返される値** + +- 有効なUTF-8文字列。 + +**例** + +``` sql +SELECT toValidUTF8('\x61\xF0\x80\x80\x80b'); +``` + +```result +┌─toValidUTF8('a����b')─┐ +│ a�b │ +└───────────────────────┘ +``` + +## repeat + +指定された回数だけ文字列を自分自身と連結します。 + +**構文** + +``` sql +repeat(s, n) +``` + +別名: `REPEAT` + +**引数** + +- `s` — 繰り返す文字列。[String](../data-types/string.md)。 +- `n` — 文字列を繰り返す回数。[UInt* または Int*](../data-types/int-uint.md) 。 + +**返される値** + +`n` 回繰り返された文字列 `s` を含む文字列。`n` ≤ 0の場合、関数は空文字列を返します。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT repeat('abc', 10); +``` + +結果: + +```result +┌─repeat('abc', 10)──────────────┐ +│ abcabcabcabcabcabcabcabcabcabc │ +└────────────────────────────────┘ +``` + +## space + +スペース(` `)を指定された回数だけ自分自身と連結します。 + +**構文** + +``` sql +space(n) +``` + +別名: `SPACE`. + +**引数** + +- `n` — スペースを繰り返す回数。[UInt* または Int*](../data-types/int-uint.md)。 + +**返される値** + +`n` 回繰り返された文字列 ` ` を含む文字列。`n` ≤ 0の場合、関数は空文字列を返します。[String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT space(3); +``` + +結果: + +```text +┌─space(3) ────┐ +│ │ +└──────────────┘ +``` + +## reverse + +文字列内のバイトの順序を反転します。 + +## reverseUTF8 + +文字列内のUnicodeコードポイントの順序を反転します。文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +## concat + +指定された引数を連結します。 + +**構文** + +``` sql +concat(s1, s2, ...) +``` + +**引数** + +任意の型の値。 + +[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md) でない引数は、デフォルトのシリアライゼーションを使用して文字列に変換されます。これはパフォーマンスを低下させるため、非String/FixedString引数の使用は推奨されません。 + +**返される値** + +引数を連結して作成された文字列。 + +引数のいずれかが `NULL` の場合、関数は `NULL` を返します。 + +**例** + +クエリ: + +``` sql +SELECT concat('Hello, ', 'World!'); +``` + +結果: + +```result +┌─concat('Hello, ', 'World!')─┐ +│ Hello, World! │ +└─────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT concat(42, 144); +``` + +結果: + +```result +┌─concat(42, 144)─┐ +│ 42144 │ +└─────────────────┘ +``` + +## concatAssumeInjective + +[concat](#concat) のようですが、`concat(s1, s2, ...) → sn` が単射であると仮定しています。GROUP BYの最適化に使用できます。 + +ある関数が単射と呼ばれるのは、それが異なる引数に対して異なる結果を返す場合です。別の言い方をすると:異なる引数が同一の結果を決して生成しないことです。 + +**構文** + +``` sql +concatAssumeInjective(s1, s2, ...) +``` + +**引数** + +StringまたはFixedString型の値。 + +**返される値** + +引数を連結して作成された文字列。 + +引数のいずれかの値が `NULL` の場合、関数は `NULL` を返します。 + +**例** + +入力テーブル: + +``` sql +CREATE TABLE key_val(`key1` String, `key2` String, `value` UInt32) ENGINE = TinyLog; +INSERT INTO key_val VALUES ('Hello, ','World',1), ('Hello, ','World',2), ('Hello, ','World!',3), ('Hello',', World!',2); +SELECT * from key_val; +``` + +```result +┌─key1────┬─key2─────┬─value─┐ +│ Hello, │ World │ 1 │ +│ Hello, │ World │ 2 │ +│ Hello, │ World! │ 3 │ +│ Hello │ , World! │ 2 │ +└─────────┴──────────┴───────┘ +``` + +``` sql +SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY concatAssumeInjective(key1, key2); +``` + +結果: + +```result +┌─concat(key1, key2)─┬─sum(value)─┐ +│ Hello, World! │ 3 │ +│ Hello, World! │ 2 │ +│ Hello, World │ 3 │ +└────────────────────┴────────────┘ +``` + +## concatWithSeparator + +指定された区切り文字で、与えられた文字列を連結します。 + +**構文** + +``` sql +concatWithSeparator(sep, expr1, expr2, expr3...) +``` + +別名: `concat_ws` + +**引数** + +- sep — 区切り文字。定数[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- exprN — 連結の対象となる式。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md) 型ではない引数は、デフォルトのシリアライゼーションを使用して文字列に変換されます。これはパフォーマンスを低下させるため、非String/FixedString引数の使用は推奨されません。 + +**返される値** + +引数を連結して作成された文字列。 + +引数のいずれかの値が `NULL` の場合、関数は `NULL` を返します。 + +**例** + +``` sql +SELECT concatWithSeparator('a', '1', '2', '3', '4') +``` + +結果: + +```result +┌─concatWithSeparator('a', '1', '2', '3', '4')─┐ +│ 1a2a3a4 │ +└──────────────────────────────────────────────┘ +``` + +## concatWithSeparatorAssumeInjective + +`concatWithSeparator` のようですが、`concatWithSeparator(sep, expr1, expr2, expr3...) → result` が単射であると仮定しています。GROUP BYの最適化に使用できます。 + +ある関数が単射と呼ばれるのは、それが異なる引数に対して異なる結果を返す場合です。別の言い方をすると:異なる引数が同一の結果を決して生成しないことです。 + +## substring + +指定されたバイトインデックス `offset` から始まる文字列 `s` の部分文字列を返します。バイトカウントは1から始まります。`offset` が0の場合、空文字列を返します。`offset` が負の場合、文字列の始めからではなく、文字列の終わりから `pos` 文字から始まります。オプションの引数 `length` は、返される部分文字列の最大バイト数を指定します。 + +**構文** + +```sql +substring(s, offset[, length]) +``` + +別名: +- `substr` +- `mid` +- `byteSlice` + +**引数** + +- `s` — 部分文字列を計算する文字列。[String](../data-types/string.md), [FixedString](../data-types/fixedstring.md) または [Enum](../data-types/enum.md) +- `offset` — 部分文字列の `s` 内の開始位置。[(U)Int*](../data-types/int-uint.md)。 +- `length` — 部分文字列の最大長。[(U)Int*](../data-types/int-uint.md)。オプション。 + +**返される値** + +`offset` の位置から始まる `length` バイトの部分文字列。 [String](../data-types/string.md)。 + +**例** + +``` sql +SELECT 'database' AS db, substr(db, 5), substr(db, 5, 1) +``` + +結果: + +```result +┌─db───────┬─substring('database', 5)─┬─substring('database', 5, 1)─┐ +│ database │ base │ b │ +└──────────┴──────────────────────────┴─────────────────────────────┘ +``` + +## substringUTF8 + +指定されたバイトインデックス `offset` に基づいてUnicodeコードポイントの文字列 `s` の部分文字列を返します。バイトカウントは `1` から始まります。`offset` が `0` の場合、空文字列を返します。`offset` が負の場合、文字列の始めからではなく、文字列の終わりから `pos` 文字から始まります。オプションの引数 `length` は、返される部分文字列の最大バイト数を指定します。 + +文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +**構文** + +```sql +substringUTF8(s, offset[, length]) +``` + +**引数** + +- `s` — 部分文字列を計算する文字列。[String](../data-types/string.md), [FixedString](../data-types/fixedstring.md) または [Enum](../data-types/enum.md) +- `offset` — 部分文字列の `s` 内の開始位置。[(U)Int*](../data-types/int-uint.md)。 +- `length` — 部分文字列の最大長。[(U)Int*](../data-types/int-uint.md)。オプション。 + +**返される値** + +`offset` の位置から始まる `length` バイトの部分文字列。 + +**実装の詳細** + +文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +**例** + +```sql +SELECT 'Täglich grüßt das Murmeltier.' AS str, + substringUTF8(str, 9), + substringUTF8(str, 9, 5) +``` + +```response +Täglich grüßt das Murmeltier. grüßt das Murmeltier. grüßt +``` + +## substringIndex + +SparkまたはMySQLのように、`delim` の `count` 回の出現の前の `s` の部分文字列を返します。 + +**構文** + +```sql +substringIndex(s, delim, count) +``` +別名: `SUBSTRING_INDEX` + +**引数** + +- s — 部分文字列を抽出する文字列。[String](../data-types/string.md)。 +- delim — 分割する文字。[String](../data-types/string.md)。 +- count — 部分文字列を抽出する前にカウントするデリミタの出現回数。count が正の場合、(左からカウントして)最後のデリミタの左側のすべてが返されます。count が負の場合、(右からカウントして)最後のデリミタの右側のすべてが返されます。[UInt または Int](../data-types/int-uint.md) + +**例** + +``` sql +SELECT substringIndex('www.clickhouse.com', '.', 2) +``` + +結果: +``` +┌─substringIndex('www.clickhouse.com', '.', 2)─┐ +│ www.clickhouse │ +└──────────────────────────────────────────────┘ +``` + +## substringIndexUTF8 + +Unicodeコードポイント専用に、`delim` の `count` 回の出現の前の `s` の部分文字列を返します。 + +文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +**構文** + +```sql +substringIndexUTF8(s, delim, count) +``` + +**引数** + +- `s` — 部分文字列を抽出する文字列。[String](../data-types/string.md)。 +- `delim` — 分割する文字。[String](../data-types/string.md)。 +- `count` — 部分文字列を抽出する前にカウントするデリミタの出現回数。count が正の場合、(左からカウントして)最後のデリミタの左側のすべてが返されます。count が負の場合、(右からカウントして)最後のデリミタの右側のすべてが返されます。[UInt または Int](../data-types/int-uint.md) + +**返される値** + +`delim` の `count` 回の出現の前の `s` の部分文字列 [String](../data-types/string.md)。 + +**実装の詳細** + +文字列が有効なUTF-8エンコードされたテキストを含むと仮定しています。この仮定が誤っている場合、例外はスローされず、結果は未定義です。 + +**例** + +```sql +SELECT substringIndexUTF8('www.straßen-in-europa.de', '.', 2) +``` + +```response +www.straßen-in-europa +``` + +## appendTrailingCharIfAbsent + +文字列 `s` が空でなく、文字 `c` で終わらない場合、文字 `c` を末尾に追加します。 + +**構文** + +```sql +appendTrailingCharIfAbsent(s, c) +``` + +## convertCharset + +エンコーディング `from` から `to` に変換された文字列 `s` を返します。 + +**構文** + +```sql +convertCharset(s, from, to) +``` + +## base58Encode + +"Bitcoin" アルファベットで [Base58](https://datatracker.ietf.org/doc/html/draft-msporny-base58) を使用して文字列をエンコードします。 + +**構文** + +```sql +base58Encode(plaintext) +``` + +**引数** + +- `plaintext` — [String](../data-types/string.md) カラムまたは定数。 + +**返される値** + +- 引数のエンコードされた値を含む文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**例** + +``` sql +SELECT base58Encode('Encoded'); +``` + +結果: + +```result +┌─base58Encode('Encoded')─┐ +│ 3dc8KtHrwM │ +└─────────────────────────┘ +``` + +## base58Decode + +"Bitcoin" アルファベットを使用して [Base58](https://datatracker.ietf.org/doc/html/draft-msporny-base58) エンコーディングスキームを使用して文字列をデコードします。 + +**構文** + +```sql +base58Decode(encoded) +``` + +**引数** + +- `encoded` — [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。文字列が有効なBase58でエンコードされた値でない場合、例外がスローされます。 + +**返される値** + +- 引数のデコードされた値を含む文字列。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT base58Decode('3dc8KtHrwM'); +``` + +結果: + +```result +┌─base58Decode('3dc8KtHrwM')─┐ +│ Encoded │ +└────────────────────────────┘ +``` + +## tryBase58Decode + +`base58Decode` のようですが、エラーの場合は空の文字列を返します。 + +**構文** + +```sql +tryBase58Decode(encoded) +``` + +**パラメータ** + +- `encoded`: [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。文字列が有効なBase58でエンコードされた値でない場合、エラー時に空の文字列を返します。 + +**返される値** + +- 引数のデコードされた値を含む文字列。 + +**例** + +クエリ: + +```sql +SELECT tryBase58Decode('3dc8KtHrwM') as res, tryBase58Decode('invalid') as res_invalid; +``` + +```response +┌─res─────┬─res_invalid─┐ +│ Encoded │ │ +└─────────┴─────────────┘ +``` + +## base64Encode + +[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md) を[RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-4) に従ってbase64でエンコードします。 + +別名: `TO_BASE64`. + +**構文** + +```sql +base64Encode(plaintext) +``` + +**引数** + +- `plaintext` — [String](../data-types/string.md) カラムまたは定数。 + +**返される値** + +- 引数のエンコードされた値を含む文字列。 + +**例** + +``` sql +SELECT base64Encode('clickhouse'); +``` + +結果: + +```result +┌─base64Encode('clickhouse')─┐ +│ Y2xpY2tob3VzZQ== │ +└────────────────────────────┘ +``` + +## base64URLEncode + +[RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-5)に従って、URL (String または FixedString) をURL専用の変更でbase64でエンコードします。 + +**構文** + +```sql +base64URLEncode(url) +``` + +**引数** + +- `url` — [String](../data-types/string.md) カラムまたは定数。 + +**返される値** + +- 引数のエンコードされた値を含む文字列。 + +**例** + +``` sql +SELECT base64URLEncode('https://clickhouse.com'); +``` + +結果: + +```result +┌─base64URLEncode('https://clickhouse.com')─┐ +│ aHR0cDovL2NsaWNraG91c2UuY29t │ +└───────────────────────────────────────────┘ +``` + +## base64Decode + +[RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-4)に従い、Stringをbase64からデコードします。エラーの場合は例外がスローされます。 + +別名: `FROM_BASE64`. + +**構文** + +```sql +base64Decode(encoded) +``` + +**引数** + +- `encoded` — [String](../data-types/string.md) カラムまたは定数。文字列が有効なBase64でエンコードされた値でない場合、例外がスローされます。 + +**返される値** + +- 引数のデコードされた値を含む文字列。 + +**例** + +``` sql +SELECT base64Decode('Y2xpY2tob3VzZQ=='); +``` + +結果: + +```result +┌─base64Decode('Y2xpY2tob3VzZQ==')─┐ +│ clickhouse │ +└──────────────────────────────────┘ +``` + +## base64URLDecode + +[RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-5)に従い、URL専用の変更を伴うbase64からURLをデコードします。エラーの場合は例外がスローされます。 + +**構文** + +```sql +base64URLDecode(encodedUrl) +``` + +**引数** + +- `encodedURL` — [String](../data-types/string.md) カラムまたは定数。文字列が有効なBase64でエンコードされた、URL専用の変更を伴う値でない場合、例外がスローされます。 + +**返される値** + +- 引数のデコードされた値を含む文字列。 + +**例** + +``` sql +SELECT base64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t'); +``` + +結果: + +```result +┌─base64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t')─┐ +│ https://clickhouse.com │ +└─────────────────────────────────────────────────┘ +``` + +## tryBase64Decode + +`base64Decode` と似ていますが、エラーの場合は空の文字列を返します。 + +**構文** + +```sql +tryBase64Decode(encoded) +``` + +**引数** + +- `encoded` — [String](../data-types/string.md) カラムまたは定数。文字列が有効なBase64でエンコードされた値でない場合、空の文字列を返します。 + +**返される値** + +- 引数のデコードされた値を含む文字列。 + +**例** + +クエリ: + +```sql +SELECT tryBase64Decode('RW5jb2RlZA==') as res, tryBase64Decode('invalid') as res_invalid; +``` + +```response +┌─res────────┬─res_invalid─┐ +│ clickhouse │ │ +└────────────┴─────────────┘ +``` + +## tryBase64URLDecode + +`base64URLDecode` と似ていますが、エラーの場合は空の文字列を返します。 + +**構文** + +```sql +tryBase64URLDecode(encodedUrl) +``` + +**パラメータ** + +- `encodedURL` — [String](../data-types/string.md) カラムまたは定数。文字列が有効なBase64でエンコードされた、URL専用の変更を伴う値でない場合、空の文字列を返します。 + +**返される値** + +- 引数のデコードされた値を含む文字列。 + +**例** + +クエリ: + +```sql +SELECT tryBase64URLDecode('aHR0cDovL2NsaWNraG91c2UuY29t') as res, tryBase64Decode('aHR0cHM6Ly9jbGlja') as res_invalid; +``` + +```response +┌─res────────────────────┬─res_invalid─┐ +│ https://clickhouse.com │ │ +└────────────────────────┴─────────────┘ +``` + +## endsWith {#endswith} + +文字列 `str` が `suffix` で終わるかどうかを返します。 + +**構文** + +```sql +endsWith(str, suffix) +``` + +## endsWithUTF8 + +文字列 `str` が `suffix` で終わるかを返します。`endsWithUTF8` と `endsWith` の違いは、`endsWithUTF8` が `str` と `suffix` をUTF-8文字で一致させることです。 + +**構文** + +```sql +endsWithUTF8(str, suffix) +``` + +**例** + +``` sql +SELECT endsWithUTF8('中国', '\xbd'), endsWith('中国', '\xbd') +``` + +結果: + +```result +┌─endsWithUTF8('中国', '½')─┬─endsWith('中国', '½')─┐ +│ 0 │ 1 │ +└──────────────────────────┴──────────────────────┘ +``` + +## startsWith {#startswith} + +文字列 `str` が `prefix` で始まるかどうかを返します。 + +**構文** + +```sql +startsWith(str, prefix) +``` + +**例** + +``` sql +SELECT startsWith('Spider-Man', 'Spi'); +``` + +## startsWithUTF8 + + + +文字列 `str` が `prefix` で始まるかどうかを返します。`startsWithUTF8` と `startsWith` の違いは、`startsWithUTF8` が `str` と `suffix` をUTF-8文字で一致させることです。 + +**例** + +``` sql +SELECT startsWithUTF8('中国', '\xe4'), startsWith('中国', '\xe4') +``` + +結果: + +```result +┌─startsWithUTF8('中国', '⥩─┬─startsWith('中国', '⥩─┐ +│ 0 │ 1 │ +└────────────────────────────┴────────────────────────┘ +``` + +## trim + +文字列の始めまたは終わりから指定された文字を削除します。特に指定がない限り、関数はホワイトスペース(ASCII文字32)を削除します。 + +**構文** + +``` sql +trim([[LEADING|TRAILING|BOTH] trim_character FROM] input_string) +``` + +**引数** + +- `trim_character` — トリムするために指定された文字。[String](../data-types/string.md). +- `input_string` — トリムする文字列。[String](../data-types/string.md). + +**返される値** + +先頭および/または末尾に指定された文字がない文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT trim(BOTH ' ()' FROM '( Hello, world! )'); +``` + +結果: + +```result +┌─trim(BOTH ' ()' FROM '( Hello, world! )')─┐ +│ Hello, world! │ +└───────────────────────────────────────────────┘ +``` + +## trimLeft + +文字列の始めから連続するホワイトスペース (ASCII文字32) を削除します。 + +**構文** + +``` sql +trimLeft(input_string) +``` + +別名: `ltrim(input_string)`. + +**引数** + +- `input_string` — トリムする文字列。[String](../data-types/string.md). + +**返される値** + +先頭の一般的なホワイトスペースがない文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT trimLeft(' Hello, world! '); +``` + +結果: + +```result +┌─trimLeft(' Hello, world! ')─┐ +│ Hello, world! │ +└─────────────────────────────────────┘ +``` + +## trimRight + +文字列の終わりから連続するホワイトスペース (ASCII文字32) を削除します。 + +**構文** + +``` sql +trimRight(input_string) +``` + +別名: `rtrim(input_string)`. + +**引数** + +- `input_string` — トリムする文字列。[String](../data-types/string.md). + +**返される値** + +末尾の一般的なホワイトスペースがない文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT trimRight(' Hello, world! '); +``` + +結果: + +```result +┌─trimRight(' Hello, world! ')─┐ +│ Hello, world! │ +└──────────────────────────────────────┘ +``` + +## trimBoth + +文字列の両端から連続するホワイトスペース (ASCII文字32) を削除します。 + +**構文** + +``` sql +trimBoth(input_string) +``` + +別名: `trim(input_string)`. + +**引数** + +- `input_string` — トリムする文字列。[String](../data-types/string.md). + +**返される値** + +先頭および末尾の一般的なホワイトスペースがない文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT trimBoth(' Hello, world! '); +``` + +結果: + +```result +┌─trimBoth(' Hello, world! ')─┐ +│ Hello, world! │ +└─────────────────────────────────────┘ +``` + +## CRC32 + +CRC-32-IEEE 802.3 の多項式と初期値 `0xffffffff`(zlibの実装)を使用して文字列のCRC32チェックサムを返します。 + +結果の型は UInt32 です。 + +## CRC32IEEE + +CRC-32-IEEE 802.3 の多項式を使用して文字列のCRC32チェックサムを返します。 + +結果の型は UInt32 です。 + +## CRC64 + +CRC-64-ECMA の多項式を使用して文字列のCRC64チェックサムを返します。 + +結果の型は UInt64 です。 + +## normalizeQuery + +リテラル、リテラルの連続、複雑なエイリアス(ホワイトスペースを含むもの、2桁以上または36バイト以上の長さのものであるUUIDなど)をプレースホルダー `?` に置き換えます。 + +**構文** + +``` sql +normalizeQuery(x) +``` + +**引数** + +- `x` — 文字のシーケンス。[String](../data-types/string.md). + +**返される値** + +- プレースホルダーを持つ文字のシーケンス。[String](../data-types/string.md). + +**例** + +クエリ: + +``` sql +SELECT normalizeQuery('[1, 2, 3, x]') AS query; +``` + +結果: + +```result +┌─query────┐ +│ [?.., x] │ +└──────────┘ +``` + +## normalizeQueryKeepNames + +リテラル、リテラルの連続をプレースホルダー `?` に置き換えますが、複雑なエイリアス(ホワイトスペースを含むもの、2桁以上または36バイト以上のもの、例えばUUID)は置き換えません。これにより、複雑なクエリログをより良く分析できます。 + +**構文** + +``` sql +normalizeQueryKeepNames(x) +``` + +**引数** + +- `x` — 文字のシーケンス。[String](../data-types/string.md). + +**返される値** + +- プレースホルダーを持つ文字のシーケンス。[String](../data-types/string.md). + +**例** + +クエリ: + +``` sql +SELECT normalizeQuery('SELECT 1 AS aComplexName123'), normalizeQueryKeepNames('SELECT 1 AS aComplexName123'); +``` + +結果: + +```result +┌─normalizeQuery('SELECT 1 AS aComplexName123')─┬─normalizeQueryKeepNames('SELECT 1 AS aComplexName123')─┐ +│ SELECT ? AS `?` │ SELECT ? AS aComplexName123 │ +└───────────────────────────────────────────────┴────────────────────────────────────────────────────────┘ +``` + +## normalizedQueryHash + +リテラルの値を持たない、類似したクエリの同じ64ビットのハッシュ値を返します。クエリログを分析するのに役立ちます。 + +**構文** + +``` sql +normalizedQueryHash(x) +``` + +**引数** + +- `x` — 文字のシーケンス。[String](../data-types/string.md). + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md#uint-ranges). + +**例** + +クエリ: + +``` sql +SELECT normalizedQueryHash('SELECT 1 AS `xyz`') != normalizedQueryHash('SELECT 1 AS `abc`') AS res; +``` + +結果: + +```result +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## normalizedQueryHashKeepNames + +[normalizedQueryHash](#normalizedqueryhash) のようですが、複雑なエイリアス(ホワイトスペースを含む、2桁以上あるいは36バイト以上のもの、例えばUUID)を置き換えずに同じ64ビットのハッシュ値を返します。クエリログを分析するのに役立ちます。 + +**構文** + +``` sql +normalizedQueryHashKeepNames(x) +``` + +**引数** + +- `x` — 文字のシーケンス。[String](../data-types/string.md). + +**返される値** + +- ハッシュ値。[UInt64](../data-types/int-uint.md#uint-ranges). + +**例** + +``` sql +SELECT normalizedQueryHash('SELECT 1 AS `xyz123`') != normalizedQueryHash('SELECT 1 AS `abc123`') AS normalizedQueryHash; +SELECT normalizedQueryHashKeepNames('SELECT 1 AS `xyz123`') != normalizedQueryHashKeepNames('SELECT 1 AS `abc123`') AS normalizedQueryHashKeepNames; +``` + +結果: + +```result +┌─normalizedQueryHash─┐ +│ 0 │ +└─────────────────────┘ +┌─normalizedQueryHashKeepNames─┐ +│ 1 │ +└──────────────────────────────┘ +``` + +## normalizeUTF8NFC + +[NFC標準化形式](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms)の文字列に変換します。文字列が有効なUTF8-エンコードされたテキストを含むと仮定しています。 + +**構文** + +``` sql +normalizeUTF8NFC(words) +``` + +**引数** + +- `words` — UTF8-エンコードされた入力文字列。[String](../data-types/string.md). + +**返される値** + +- NFC標準化形式に変換された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT length('â'), normalizeUTF8NFC('â') AS nfc, length(nfc) AS nfc_len; +``` + +結果: + +```result +┌─length('â')─┬─nfc─┬─nfc_len─┐ +│ 2 │ â │ 2 │ +└─────────────┴─────┴─────────┘ +``` + +## normalizeUTF8NFD + +[NFD標準化形式](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms)の文字列に変換します。文字列が有効なUTF8-エンコードされたテキストを含むと仮定しています。 + +**構文** + +``` sql +normalizeUTF8NFD(words) +``` + +**引数** + +- `words` — UTF8-エンコードされた入力文字列。[String](../data-types/string.md). + +**返される値** + +- NFD標準化形式に変換された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT length('â'), normalizeUTF8NFD('â') AS nfd, length(nfd) AS nfd_len; +``` + +結果: + +```result +┌─length('â')─┬─nfd─┬─nfd_len─┐ +│ 2 │ â │ 3 │ +└─────────────┴─────┴─────────┘ +``` + +## normalizeUTF8NFKC + +[NFKC標準化形式](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms)の文字列に変換します。文字列が有効なUTF8-エンコードされたテキストを含むと仮定しています。 + +**構文** + +``` sql +normalizeUTF8NFKC(words) +``` + +**引数** + +- `words` — UTF8-エンコードされた入力文字列。[String](../data-types/string.md). + +**返される値** + +- NFKC標準化形式に変換された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT length('â'), normalizeUTF8NFKC('â') AS nfkc, length(nfkc) AS nfkc_len; +``` + +結果: + +```result +┌─length('â')─┬─nfkc─┬─nfkc_len─┐ +│ 2 │ â │ 2 │ +└─────────────┴──────┴──────────┘ +``` + +## normalizeUTF8NFKD + +[NFKD標準化形式](https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms)の文字列に変換します。文字列が有効なUTF8-エンコードされたテキストを含むと仮定しています。 + +**構文** + +``` sql +normalizeUTF8NFKD(words) +``` + +**引数** + +- `words` — UTF8-エンコードされた入力文字列。[String](../data-types/string.md). + +**返される値** + +- NFKD標準化形式に変換された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT length('â'), normalizeUTF8NFKD('â') AS nfkd, length(nfkd) AS nfkd_len; +``` + +結果: + +```result +┌─length('â')─┬─nfkd─┬─nfkd_len─┐ +│ 2 │ â │ 3 │ +└─────────────┴──────┴──────────┘ +``` + +## encodeXMLComponent + +XMLのテキストノードまたは属性にその後配置できるように、XMLで特別な意味を持つ文字をエスケープします。 + +次の文字が置き換えられます: `<`, `&`, `>`, `"`, `'`. +[XMLおよびHTMLの文字エンティティ参照のリスト](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references)も参照してください。 + +**構文** + +``` sql +encodeXMLComponent(x) +``` + +**引数** + +- `x` — 入力文字列。[String](../data-types/string.md). + +**返される値** + +- エスケープされた文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT encodeXMLComponent('Hello, "world"!'); +SELECT encodeXMLComponent('<123>'); +SELECT encodeXMLComponent('&clickhouse'); +SELECT encodeXMLComponent('\'foo\''); +``` + +結果: + +```result +Hello, "world"! +<123> +&clickhouse +'foo' +``` + +## decodeXMLComponent + +XMLで特別な意味を持つ部分文字列をエスケープ解除します。これらの部分文字列は: `"` `&` `'` `>` `<` + +この関数は、数値文字参照もUnicode文字に置き換えます。10進数(`✓` のようなもの)と16進数(`✓` のようなもの)の両方の形式がサポートされています。 + +**構文** + +``` sql +decodeXMLComponent(x) +``` + +**引数** + +- `x` — 入力文字列。[String](../data-types/string.md). + +**返される値** + +- エスケープ解除された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT decodeXMLComponent(''foo''); +SELECT decodeXMLComponent('< Σ >'); +``` + +結果: + +```result +'foo' +< Σ > +``` + +## decodeHTMLComponent + +HTMLで特別な意味を持つ部分文字列をエスケープ解除します。例えば: `ℏ` `>` `♦` `♥` `<` など。 + +この関数は、数値文字参照もUnicode文字に置き換えます。10進数(`✓` のようなもの)と16進数(`✓` のようなもの)の両方の形式がサポートされています。 + +**構文** + +``` sql +decodeHTMLComponent(x) +``` + +**引数** + +- `x` — 入力文字列。[String](../data-types/string.md). + +**返される値** + +- エスケープ解除された文字列。[String](../data-types/string.md). + +**例** + +``` sql +SELECT decodeHTMLComponent(''CH'); +SELECT decodeHTMLComponent('I♥ClickHouse'); +``` + +結果: + +```result +'CH' +I♥ClickHouse' +``` + +## extractTextFromHTML + +この関数は、HTMLまたはXHTMLからプレーンテキストを抽出します。 + +HTML、XMLまたはXHTML仕様に100%準拠していませんが、実装は合理的に正確で高速です。ルールは次の通りです: + +1. コメントはスキップされます。例: ``。コメントは `-->` で終了しなければなりません。ネストされたコメントは禁止されています。 +注意: `` や `` のような構造はHTMLでは有効なコメントではありませんが、他のルールによってスキップされます。 +2. CDATAはそのまま貼り付けられます。注意: CDATAはXML/XHTML固有のものであり、「ベストエフォート」ベースで処理されます。 +3. `script` および `style` 要素は、そのすべての内容と共に削除されます。注意: 閉じタグは内容内に現れることはできません。例えば、JS文字列リテラルは `"<\/script>"` のようにエスケープする必要があります。 +注意: コメントおよびCDATAは `script` または `style` 内でも可能であり、CDATA内では閉じタグは検索されません。例: `]]>` 。しかし、それらはコメント内では依然として検索されます。時にはこれが複雑になります: ` var y = "-->"; alert(x + y);` +注意: `script` および `style` はXML名前空間の名前になることがあり、その場合、通常の`script`または`style`要素として扱われません。例: `Hello`。 +注意: タグ名の後にホワイトスペースがある可能性があります: `` しかし、前にはありません: `< / script>`。 +4. その他のタグまたはタグのような要素は、内部内容なしでスキップされます。例: `.` +注意: このHTMLは不正と期待されます: `` +注意: タグのようなものもスキップされます: `<>`、`` など。 +注意: 終端のないタグは入力の最後までスキップされます:`world`、`Helloworld` - HTMLにはホワイトスペースがありませんが、関数はこれを挿入します。また、`Hello

    world

    `、`Hello
    world`も考えてください。この振る舞いは、HTMLを単語のバッグに変換するようなデータ解析にとって合理的です。 +7. ホワイトスペースの正しい処理には、`
    `およびCSSの`display`および`white-space`プロパティのサポートが必要です。
    +
    +**構文**
    +
    +``` sql
    +extractTextFromHTML(x)
    +```
    +
    +**引数**
    +
    +- `x` — 入力テキスト。[String](../data-types/string.md).
    +
    +**返される値**
    +
    +- 抽出されたテキスト。[String](../data-types/string.md).
    +
    +**例**
    +
    +最初の例にはいくつかのタグとコメントが含まれており、ホワイトスペース処理も示しています。
    +2つ目の例は、CDATAとscriptタグの処理を示しています。
    +3つ目の例では、[url](../../sql-reference/table-functions/url.md) 関数で受け取った完全なHTMLレスポンスからテキストを抽出しています。
    +
    +``` sql
    +SELECT extractTextFromHTML(' 

    A text withtags.

    '); +SELECT extractTextFromHTML('CDATA]]> '); +SELECT extractTextFromHTML(html) FROM url('http://www.donothingfor2minutes.com/', RawBLOB, 'html String'); +``` + +結果: + +```result +A text with tags . +The content within CDATA +Do Nothing for 2 Minutes 2:00   +``` + +## ascii {#ascii} + +文字列 `s` の最初の文字のASCIIコードポイント(Int32として)を返します。 + +`s` が空の場合、結果は0です。最初の文字が非ASCII文字またはUTF-16のLatin-1の補集合範囲の一部でない場合、結果は未定義です。 + +**構文** + +```sql +ascii(s) +``` + +## soundex + +文字列の[Soundexコード](https://en.wikipedia.org/wiki/Soundex)を返します。 + +**構文** + +``` sql +soundex(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md) + +**返される値** + +- 入力値のSoundexコード。[String](../data-types/string.md) + +**例** + +``` sql +select soundex('aksel'); +``` + +結果: + +```result +┌─soundex('aksel')─┐ +│ A240 │ +└──────────────────┘ +``` + +## punycodeEncode + +文字列の[Punycode](https://en.wikipedia.org/wiki/Punycode)表現を返します。 +文字列はUTF8でエンコードされている必要があります。そうでない場合、動作は未定義です。 + +**構文** + +``` sql +punycodeEncode(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md) + +**返される値** + +- 入力値のPunycode表現。[String](../data-types/string.md) + +**例** + +``` sql +select punycodeEncode('München'); +``` + +結果: + +```result +┌─punycodeEncode('München')─┐ +│ Mnchen-3ya │ +└───────────────────────────┘ +``` + +## punycodeDecode + +[Punycode](https://en.wikipedia.org/wiki/Punycode)でエンコードされた文字列のUTF8でエンコードされたプレーンテキストを返します。 +有効なPunycodeでエンコードされた文字列が与えられない場合、例外がスローされます。 + +**構文** + +``` sql +punycodeEncode(val) +``` + +**引数** + +- `val` — Punycodeでエンコードされた文字列。[String](../data-types/string.md) + +**返される値** + +- 入力値のプレーンテキスト。[String](../data-types/string.md) + +**例** + +``` sql +select punycodeDecode('Mnchen-3ya'); +``` + +結果: + +```result +┌─punycodeDecode('Mnchen-3ya')─┐ +│ München │ +└──────────────────────────────┘ +``` + +## tryPunycodeDecode + +`punycodeDecode` のようですが、無効なPunycodeエンコードされた文字列が与えられた場合、空の文字列を返します。 + +## idnaEncode + +[Internationalized Domain Names in Applications](https://en.wikipedia.org/wiki/Internationalized_domain_name#Internationalizing_Domain_Names_in_Applications) (IDNA) のメカニズムに従って、ドメイン名のASCII表現(ToASCIIアルゴリズム)を返します。 +入力文字列はUTFでエンコードされ、ASCII文字列に変換可能でなければなりません。そうでない場合、例外がスローされます。 +注意: パーセントデコードやタブ、スペース、制御文字のトリミングは行いません。 + +**構文** + +```sql +idnaEncode(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md) + +**返される値** + +- 入力値のIDNAメカニズムに従ったASCII表現。[String](../data-types/string.md) + +**例** + +``` sql +select idnaEncode('straße.münchen.de'); +``` + +結果: + +```result +┌─idnaEncode('straße.münchen.de')─────┐ +│ xn--strae-oqa.xn--mnchen-3ya.de │ +└─────────────────────────────────────┘ +``` + +## tryIdnaEncode + +`idnaEncode` と似ていますが、例外をスローする代わりにエラーの場合は空の文字列を返します。 + +## idnaDecode + +[Internationalized Domain Names in Applications](https://en.wikipedia.org/wiki/Internationalized_domain_name#Internationalizing_Domain_Names_in_Applications) (IDNA) のメカニズムに従ったドメイン名のUnicode (UTF-8)表現(ToUnicodeアルゴリズム)を返します。 +エラーの場合(例えば入力が無効な場合)、入力文字列が返されます。 +`idnaEncode()`と`idnaDecode()`を繰り返し適用すると、ケースの正規化により元の文字列が必ずしも戻るとは限らないことに注意してください。 + +**構文** + +```sql +idnaDecode(val) +``` + +**引数** + +- `val` — 入力値。 [String](../data-types/string.md) + +**返される値** + +- 入力値のIDNAメカニズムによるUnicode (UTF-8)表現。[String](../data-types/string.md) + +**例** + +``` sql +select idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de'); +``` + +結果: + +```result +┌─idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de')─┐ +│ straße.münchen.de │ +└───────────────────────────────────────────────┘ +``` + +## byteHammingDistance + +2つのバイト文字列間の[hamming distance](https://en.wikipedia.org/wiki/Hamming_distance)を計算します。 + +**構文** + +```sql +byteHammingDistance(string1, string2) +``` + +**例** + +``` sql +SELECT byteHammingDistance('karolin', 'kathrin'); +``` + +結果: + +``` text +┌─byteHammingDistance('karolin', 'kathrin')─┐ +│ 3 │ +└───────────────────────────────────────────┘ +``` + +別名: `mismatches` + +## stringJaccardIndex + +2つのバイト文字列間の[Jaccard類似度指数](https://en.wikipedia.org/wiki/Jaccard_index)を計算します。 + +**構文** + +```sql +stringJaccardIndex(string1, string2) +``` + +**例** + +``` sql +SELECT stringJaccardIndex('clickhouse', 'mouse'); +``` + +結果: + +``` text +┌─stringJaccardIndex('clickhouse', 'mouse')─┐ +│ 0.4 │ +└───────────────────────────────────────────┘ +``` + +## stringJaccardIndexUTF8 + +[stringJaccardIndex](#stringjaccardindex)と同様ですが、UTF8エンコードされた文字列用です。 + +## editDistance + +2つのバイト文字列間の[編集距離](https://en.wikipedia.org/wiki/Edit_distance)を計算します。 + +**構文** + +```sql +editDistance(string1, string2) +``` + +**例** + +``` sql +SELECT editDistance('clickhouse', 'mouse'); +``` + +結果: + +``` text +┌─editDistance('clickhouse', 'mouse')─┐ +│ 6 │ +└─────────────────────────────────────┘ +``` + +別名: `levenshteinDistance` + +## editDistanceUTF8 + +2つのUTF8文字列間の[編集距離](https://en.wikipedia.org/wiki/Edit_distance)を計算します。 + +**構文** + +```sql +editDistanceUTF8(string1, string2) +``` + +**例** + +``` sql +SELECT editDistanceUTF8('我是谁', '我是我'); +``` + +結果: + +``` text +┌─editDistanceUTF8('我是谁', '我是我')──┐ +│ 1 │ +└─────────────────────────────────────┘ +``` + +別名: `levenshteinDistanceUTF8` + +## damerauLevenshteinDistance + +2つのバイト文字列間の[Damerau-Levenshtein距離](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)を計算します。 + +**構文** + +```sql +damerauLevenshteinDistance(string1, string2) +``` + +**例** + +``` sql +SELECT damerauLevenshteinDistance('clickhouse', 'mouse'); +``` + +結果: + +``` text +┌─damerauLevenshteinDistance('clickhouse', 'mouse')─┐ +│ 6 │ +└───────────────────────────────────────────────────┘ +``` + +## jaroSimilarity + +2つのバイト文字列間の[Jaro類似度](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance#Jaro_similarity)を計算します。 + +**構文** + +```sql +jaroSimilarity(string1, string2) +``` + +**例** + +``` sql +SELECT jaroSimilarity('clickhouse', 'click'); +``` + +結果: + +``` text +┌─jaroSimilarity('clickhouse', 'click')─┐ +│ 0.8333333333333333 │ +└───────────────────────────────────────┘ +``` + +## jaroWinklerSimilarity + +2つのバイト文字列間の[Jaro-Winkler類似度](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance#Jaro%E2%80%93Winkler_similarity)を計算します。 + +**構文** + +```sql +jaroWinklerSimilarity(string1, string2) +``` + +**例** + +``` sql +SELECT jaroWinklerSimilarity('clickhouse', 'click'); +``` + +結果: + +``` text +┌─jaroWinklerSimilarity('clickhouse', 'click')─┐ +│ 0.8999999999999999 │ +└──────────────────────────────────────────────┘ +``` + +## initcap + +各単語の最初の文字を大文字に変換し、残りを小文字に変換します。単語は非英数字によって区切られた英数字の連続です。 + +:::note +`initCap`は単語の最初の文字のみを大文字に変換するため、アポストロフィや大文字を含む単語で予期しない動作をすることがあります。例えば: + +```sql +SELECT initCap('mother''s daughter'), initCap('joe McAdam'); +``` + +は以下のように返されます + +```response +┌─initCap('mother\'s daughter')─┬─initCap('joe McAdam')─┐ +│ Mother'S Daughter │ Joe Mcadam │ +└───────────────────────────────┴───────────────────────┘ +``` + +これは既知の動作であり、現在のところ修正予定はありません。 +::: + +**構文** + +```sql +initcap(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md). + +**返される値** + +- 各単語の最初の文字が大文字に変換された`val`。[String](../data-types/string.md). + +**例** + +クエリ: + +```sql +SELECT initcap('building for fast'); +``` + +結果: + +```text +┌─initcap('building for fast')─┐ +│ Building For Fast │ +└──────────────────────────────┘ +``` + +## initcapUTF8 + +[initcap](#initcap)と同様に、`initcapUTF8`は各単語の最初の文字を大文字に変換し、残りを小文字に変換します。 +文字列が有効なUTF-8エンコードされたテキストを含むことを前提としています。この前提が違反された場合、例外はスローされず、結果は未定義です。 + +:::note +この関数は言語を検出しません。例えばトルコ語の場合、結果は正確ではないかもしれません (i/İ vs. i/I)。コードポイントの大文字と小文字のUTF-8バイトシーケンスの長さが異なる場合、このコードポイントに対する結果は正しくない可能性があります。 +::: + +**構文** + +```sql +initcapUTF8(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md). + +**返される値** + +- 各単語の最初の文字が大文字に変換された`val`。[String](../data-types/string.md). + +**例** + +クエリ: + +```sql +SELECT initcapUTF8('не тормозит'); +``` + +結果: + +```text +┌─initcapUTF8('не тормозит')─┐ +│ Не Тормозит │ +└────────────────────────────┘ +``` + +## firstLine + +複数行の文字列から最初の行を返します。 + +**構文** + +```sql +firstLine(val) +``` + +**引数** + +- `val` — 入力値。[String](../data-types/string.md) + +**返される値** + +- 入力値の最初の行または改行がない場合は全体。[String](../data-types/string.md) + +**例** + +```sql +select firstLine('foo\nbar\nbaz'); +``` + +結果: + +```result +┌─firstLine('foo\nbar\nbaz')─┐ +│ foo │ +└────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/string-replace-functions.md b/docs/ja/sql-reference/functions/string-replace-functions.md new file mode 100644 index 00000000000..8c604c97a78 --- /dev/null +++ b/docs/ja/sql-reference/functions/string-replace-functions.md @@ -0,0 +1,333 @@ +--- +slug: /ja/sql-reference/functions/string-replace-functions +sidebar_position: 150 +sidebar_label: 文字列の置換関数 +--- + +# 文字列の置換関数 + +[一般的な文字列関数](string-functions.md)および[文字列の検索関数](string-search-functions.md)は別々に説明されています。 + +## overlay + +1から始まるインデックス`offset`で、文字列`input`の一部を別の文字列`replace`で置換します。 + +**構文** + +```sql +overlay(s, replace, offset[, length]) +``` + +**パラメータ** + +- `s`: 文字列型 [String](../data-types/string.md)。 +- `replace`: 文字列型 [String](../data-types/string.md)。 +- `offset`: 整数型 [Int](../data-types/int-uint.md) (1-based)。`offset` が負の場合、それは文字列 `s` の末尾から数えます。 +- `length`: オプション。整数型 [Int](../data-types/int-uint.md)。`length` は、入力文字列 `s` 内で置換される部分の長さを指定します。`length` が指定されていない場合、`s` から削除されるバイト数は `replace` の長さと同じです。指定されている場合は、 `length` バイトが削除されます。 + +**返される値** + +- [String](../data-types/string.md) データ型の値。 + +**例** + +```sql +SELECT overlay('My father is from Mexico.', 'mother', 4) AS res; +``` + +結果: + +```text +┌─res──────────────────────┐ +│ My mother is from Mexico.│ +└──────────────────────────┘ +``` + +```sql +SELECT overlay('My father is from Mexico.', 'dad', 4, 6) AS res; +``` + +結果: + +```text +┌─res───────────────────┐ +│ My dad is from Mexico.│ +└───────────────────────┘ +``` + +## overlayUTF8 + +1から始まるインデックス`offset`で、文字列`input`の一部を別の文字列`replace`で置換します。 + +文字列が有効なUTF-8でエンコードされたテキストを含むことを前提としています。この前提が破られた場合、例外は投げられず、結果は未定義です。 + +**構文** + +```sql +overlayUTF8(s, replace, offset[, length]) +``` + +**パラメータ** + +- `s`: 文字列型 [String](../data-types/string.md)。 +- `replace`: 文字列型 [String](../data-types/string.md)。 +- `offset`: 整数型 [Int](../data-types/int-uint.md) (1-based)。`offset` が負の場合、それは入力文字列 `s` の末尾から数えます。 +- `length`: オプション。整数型 [Int](../data-types/int-uint.md)。`length` は、入力文字列 `s` 内で置換される部分の長さを指定します。`length` が指定されていない場合、`s` から削除される文字数は `replace` の長さと同じです。指定されている場合は、 `length` 文字が削除されます。 + +**返される値** + +- [String](../data-types/string.md) データ型の値。 + +**例** + +```sql +SELECT overlay('Mein Vater ist aus Österreich.', 'der Türkei', 20) AS res; +``` + +結果: + +```text +┌─res───────────────────────────┐ +│ Mein Vater ist aus der Türkei.│ +└───────────────────────────────┘ +``` + +## replaceOne + +`haystack` 中の最初のサブストリング `pattern` を `replacement` 文字列で置換します。 + +**構文** + +```sql +replaceOne(haystack, pattern, replacement) +``` + +## replaceAll + +`haystack` 中のすべてのサブストリング `pattern` を `replacement` 文字列で置換します。 + +**構文** + +```sql +replaceAll(haystack, pattern, replacement) +``` + +別名: `replace`. + +## replaceRegexpOne + +正規表現 `pattern` ( [re2 syntax](https://github.com/google/re2/wiki/Syntax) で) に一致する最初のサブストリングを `haystack` から `replacement` 文字列で置換します。 + +`replacement` には置換 `\0-\9` を含めることができます。 +置換 `\1-\9` は1から9までのキャプチャグループ (サブマッチ) に対応し、置換 `\0` は全体のマッチに対応します。 + +`pattern` または `replacement` 文字列に逐語的な `\` 文字を使用するには、 `\` を使用してエスケープします。 +文字列リテラルは追加のエスケープが必要であることにも注意してください。 + +**構文** + +```sql +replaceRegexpOne(haystack, pattern, replacement) +``` + +**例** + +ISO形式の日付をアメリカの形式に変換する: + +``` sql +SELECT DISTINCT + EventDate, + replaceRegexpOne(toString(EventDate), '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res +FROM test.hits +LIMIT 7 +FORMAT TabSeparated +``` + +結果: + +``` text +2014-03-17 03/17/2014 +2014-03-18 03/18/2014 +2014-03-19 03/19/2014 +2014-03-20 03/20/2014 +2014-03-21 03/21/2014 +2014-03-22 03/22/2014 +2014-03-23 03/23/2014 +``` + +文字列を10回コピーする: + +``` sql +SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res +``` + +結果: + +``` text +┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## replaceRegexpAll + +`replaceRegexpOne` と似ていますが、パターンのすべての出現を置換します。 + +別名: `REGEXP_REPLACE`. + +**例** + +``` sql +SELECT replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res +``` + +結果: + +``` text +┌─res────────────────────────┐ +│ HHeelllloo,, WWoorrlldd!! │ +└────────────────────────────┘ +``` + +例外として、正規表現が空のサブストリングで機能した場合、置換は一度だけ行われ、次のようになります: + +``` sql +SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res +``` + +結果: + +``` text +┌─res─────────────────┐ +│ here: Hello, World! │ +└─────────────────────┘ +``` + +## regexpQuoteMeta + +正規表現で特別な意味を持つ次の文字の前にバックスラッシュを追加します: `\0`, `\\`, `|`, `(`, `)`, `^`, `$`, `.`, `[`, `]`, `?`, `*`, `+`, `{`, `:`, `-`. + +この実装は re2::RE2::QuoteMeta とは若干異なります。ゼロバイトを `\x00` ではなく `\0` としてエスケープし、必要な文字のみエスケープします。 +詳細については、[RE2](https://github.com/google/re2/blob/master/re2/re2.cc#L473) を参照してください。 + +**構文** + +```sql +regexpQuoteMeta(s) +``` + +## format + +`pattern` 文字列を引数にリストされた値(文字列、整数など)でフォーマットします。Pythonのフォーマットに似ています。`pattern` 文字列には、中括弧 `{}` で囲まれた置換フィールドを含めることができます。中括弧に含まれていないものは、リテラルテキストと見なされ、出力にそのままコピーされます。リテラル中括弧は二重中括弧 `{{ '{{' }}` および `{{ '}}' }}` でエスケープできます。フィールド名は0から始まる数字または空白にでき、空の場合は単調に増加する番号が暗黙的に与えられます。 + +**構文** + +```sql +format(pattern, s0, s1, ...) +``` + +**例** + +``` sql +SELECT format('{1} {0} {1}', 'World', 'Hello') +``` + +```result +┌─format('{1} {0} {1}', 'World', 'Hello')─┐ +│ Hello World Hello │ +└─────────────────────────────────────────┘ +``` + +暗黙の番号を使用した場合: + +``` sql +SELECT format('{} {}', 'Hello', 'World') +``` + +```result +┌─format('{} {}', 'Hello', 'World')─┐ +│ Hello World │ +└───────────────────────────────────┘ +``` + +## translate + +文字列 `s` 内の文字を、`from` および `to` 文字列で定義された一対一の文字マッピングを使用して置換します。`from` および `to` は同じサイズの定数ASCII文字列でなければなりません。元の文字列の非ASCII文字は変更されません。 + +**構文** + +```sql +translate(s, from, to) +``` + +**例** + +``` sql +SELECT translate('Hello, World!', 'delor', 'DELOR') AS res +``` + +結果: + +``` text +┌─res───────────┐ +│ HELLO, WORLD! │ +└───────────────┘ +``` + +## translateUTF8 + +[translate](#translate) と同様ですが、`s`, `from`, `to` がUTF-8でエンコードされた文字列であることを前提としています。 + +**構文** + +``` sql +translateUTF8(s, from, to) +``` + +**パラメータ** + +- `s`: 文字列型 [String](../data-types/string.md)。 +- `from`: 文字列型 [String](../data-types/string.md)。 +- `to`: 文字列型 [String](../data-types/string.md)。 + +**返される値** + +- [String](../data-types/string.md) データ型の値。 + +**例** + +クエリ: + +``` sql +SELECT translateUTF8('Münchener Straße', 'üß', 'us') AS res; +``` + +``` response +┌─res──────────────┐ +│ Munchener Strase │ +└──────────────────┘ +``` + +## printf + +`printf` 関数は、与えられた文字列を引数にリストされた値(文字列、整数、浮動小数点数など)でフォーマットし、C++ の printf 関数に似ています。フォーマット文字列には `%` 文字から始まるフォーマット指定子を含めることができます。`%` およびその後のフォーマット指定子に含まれていないものはリテラルテキストと見なされ、出力にそのままコピーされます。リテラル `%` 文字は `%%` でエスケープできます。 + +**構文** + +``` sql +printf(format, arg1, arg2, ...) +``` + +**例** + +クエリ: + +``` sql +select printf('%%%s %s %d', 'Hello', 'World', 2024); +``` + +``` response +┌─printf('%%%s %s %d', 'Hello', 'World', 2024)─┐ +│ %Hello World 2024 │ +└──────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/string-search-functions.md b/docs/ja/sql-reference/functions/string-search-functions.md new file mode 100644 index 00000000000..bd7d29373e6 --- /dev/null +++ b/docs/ja/sql-reference/functions/string-search-functions.md @@ -0,0 +1,1947 @@ +--- +slug: /ja/sql-reference/functions/string-search-functions +sidebar_position: 160 +sidebar_label: 文字列の検索 +--- + +# 文字列検索のための関数 + +このセクションのすべての関数はデフォルトでケースセンシティブに検索します。ケースインセンシティブな検索は通常、別の関数バリアントで提供されます。 + +:::note +ケースインセンシティブな検索は、英語の小文字-大文字のルールに従います。たとえば、英語では大文字の `i` は `I` ですが、トルコ語では `İ` です。したがって、英語以外の言語の結果は予期せぬものになるかもしれません。 +::: + +このセクションの関数は、検索される文字列(このセクションでは `haystack` と呼びます)および検索文字列(このセクションでは `needle` と呼びます)がシングルバイトでエンコードされたテキストであることを前提としています。この前提が満たされない場合、例外はスローされず、結果は未定義です。UTF-8 エンコードされた文字列での検索は通常、別の関数バリアントで提供されます。同様に、UTF-8 関数バリアントを使用していて入力文字列が UTF-8 エンコードされたテキストでない場合も、例外はスローされず、結果は未定義です。自動的な Unicode 正規化は行われませんが、[normalizeUTF8*()](https://clickhouse.com../functions/string-functions/) 関数を使用してそれを実行できます。 + +[一般的な文字列関数](string-functions.md)および[文字列の置換関数](string-replace-functions.md)は別途説明されています。 + +## position + +文字列 `haystack` 内のサブ文字列 `needle` の位置(バイト単位、1から開始)を返します。 + +**構文** + +``` sql +position(haystack, needle[, start_pos]) +``` + +エイリアス: +- `position(needle IN haystack)` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `start_pos` – 検索開始位置 (`haystack` の1ベースの位置)。[UInt](../data-types/int-uint.md)。オプション。 + +**返される値** + +- サブ文字列が見つかった場合の開始位置をバイト単位で返し、1からカウントします。[UInt64](../data-types/int-uint.md)。 +- サブ文字列が見つからなかった場合は0を返します。[UInt64](../data-types/int-uint.md)。 + +サブ文字列 `needle` が空の場合、次のルールが適用されます: +- `start_pos` が指定されていない場合:`1` を返す +- `start_pos = 0` の場合:`1` を返す +- `start_pos >= 1` かつ `start_pos <= length(haystack) + 1` の場合:`start_pos` を返す +- それ以外の場合:`0` を返す + +同じルールは、関数 `locate`、`positionCaseInsensitive`、`positionUTF8`、および `positionCaseInsensitiveUTF8` にも適用されます。 + +**例** + +クエリ: + +``` sql +SELECT position('Hello, world!', '!'); +``` + +結果: + +``` text +┌─position('Hello, world!', '!')─┐ +│ 13 │ +└────────────────────────────────┘ +``` + +`start_pos` 引数を使用した例: + +クエリ: + +``` sql +SELECT + position('Hello, world!', 'o', 1), + position('Hello, world!', 'o', 7) +``` + +結果: + +``` text +┌─position('Hello, world!', 'o', 1)─┬─position('Hello, world!', 'o', 7)─┐ +│ 5 │ 9 │ +└───────────────────────────────────┴───────────────────────────────────┘ +``` + +`needle IN haystack` 構文の例: + +クエリ: + +```sql +SELECT 6 = position('/' IN s) FROM (SELECT 'Hello/World' AS s); +``` + +結果: + +```text +┌─equals(6, position(s, '/'))─┐ +│ 1 │ +└─────────────────────────────┘ +``` + +空の `needle` サブ文字列を使用した例: + +クエリ: + +``` sql +SELECT + position('abc', ''), + position('abc', '', 0), + position('abc', '', 1), + position('abc', '', 2), + position('abc', '', 3), + position('abc', '', 4), + position('abc', '', 5) +``` + +結果: + +``` text +┌─position('abc', '')─┬─position('abc', '', 0)─┬─position('abc', '', 1)─┬─position('abc', '', 2)─┬─position('abc', '', 3)─┬─position('abc', '', 4)─┬─position('abc', '', 5)─┐ +│ 1 │ 1 │ 1 │ 2 │ 3 │ 4 │ 0 │ +└─────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┴────────────────────────┘ +``` + +## locate + +[位置](#position) と同様ですが、引数 `haystack` と `needle` が入れ替わっています。 + +この関数の挙動は ClickHouse のバージョンに依存します: +- バージョン < v24.3 では、`locate` は関数 `position` のエイリアスであり、引数 `(haystack, needle[, start_pos])` を受け付けていました。 +- バージョン >= 24.3 では、`locate` は個別の関数であり (MySQL との互換性を向上させるため)、引数 `(needle, haystack[, start_pos])` を受け付けます。以前の挙動は、設定 [function_locate_has_mysql_compatible_argument_order = false](../../operations/settings/settings.md#function-locate-has-mysql-compatible-argument-order) で復元できます。 + +**構文** + +``` sql +locate(needle, haystack[, start_pos]) +``` + +## positionCaseInsensitive + +[位置](#position) のケースインセンシティブなバージョン。 + +**例** + +クエリ: + +``` sql +SELECT positionCaseInsensitive('Hello, world!', 'hello'); +``` + +結果: + +``` text +┌─positionCaseInsensitive('Hello, world!', 'hello')─┐ +│ 1 │ +└───────────────────────────────────────────────────┘ +``` + +## positionUTF8 + +[位置](#position) と同様ですが、`haystack` と `needle` が UTF-8 エンコードされた文字列であることを前提とします。 + +**例** + +関数 `positionUTF8` は、文字 `ö`(2 ポイントで表される)を正しく単一の Unicode コードポイントとしてカウントします。 + +クエリ: + +``` sql +SELECT positionUTF8('Motörhead', 'r'); +``` + +結果: + +``` text +┌─position('Motörhead', 'r')─┐ +│ 5 │ +└────────────────────────────┘ +``` + +## positionCaseInsensitiveUTF8 + +[位置UTF8](#positionutf8) と同様ですが、ケースインセンシティブに検索します。 + +## multiSearchAllPositions + +[位置](#position) と同様ですが、`haystack` 文字列の複数の `needle` サブ文字列の位置をバイト単位で配列として返します。 + +:::note +すべての `multiSearch*()` 関数は最大 28 個の選択肢しかサポートしていません。 +::: + +**構文** + +``` sql +multiSearchAllPositions(haystack, [needle1, needle2, ..., needleN]) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- サブ文字列が見つかった場合の開始位置をバイト単位で配列として返し、1からカウントします。 +- サブ文字列が見つからなかった場合は0を返します。 + +**例** + +クエリ: + +``` sql +SELECT multiSearchAllPositions('Hello, World!', ['hello', '!', 'world']); +``` + +結果: + +``` text +┌─multiSearchAllPositions('Hello, World!', ['hello', '!', 'world'])─┐ +│ [0,13,0] │ +└───────────────────────────────────────────────────────────────────┘ +``` +## multiSearchAllPositionsCaseInsensitive + +[multiSearchAllPositions](#multisearchallpositions) と同様ですが、ケースを無視します。 + +**構文** + +```sql +multiSearchAllPositionsCaseInsensitive(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- サブ文字列が見つかった場合の開始位置をバイト単位で配列として返し、1からカウントします。 +- サブ文字列が見つからなかった場合は0を返します。 + +**例** + +クエリ: + +```sql +SELECT multiSearchAllPositionsCaseInsensitive('ClickHouse',['c','h']); +``` + +結果: + +```response +["1","6"] +``` + +## multiSearchAllPositionsUTF8 + +[multiSearchAllPositions](#multisearchallpositions) と同様ですが、`haystack` と `needle` サブ文字列が UTF-8 エンコードされた文字列であることを前提とします。 + +**構文** + +```sql +multiSearchAllPositionsUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- サブ文字列が見つかった場合の開始位置をバイト単位で配列として返し、1からカウントします。 +- サブ文字列が見つからなかった場合は0を返します。 + +**例** + +与えられた `ClickHouse` を UTF-8 文字列とし、`C` (`\x43`) と `H` (`\x48`) の位置を見つける。 + +クエリ: + +```sql +SELECT multiSearchAllPositionsUTF8('\x43\x6c\x69\x63\x6b\x48\x6f\x75\x73\x65',['\x43','\x48']); +``` + +結果: + +```response +["1","6"] +``` + +## multiSearchAllPositionsCaseInsensitiveUTF8 + +[multiSearchAllPositionsUTF8](#multisearchallpositionsutf8) と同様ですが、ケースを無視します。 + +**構文** + +```sql +multiSearchAllPositionsCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- サブ文字列が見つかった場合の開始位置をバイト単位で配列として返し、1からカウントします。 +- サブ文字列が見つからなかった場合は0を返します。 + +**例** + +与えられた `ClickHouse` を UTF-8 文字列とし、`h` (`\x68`) の文字が単語に含まれているかチェックします。 + +クエリ: + +```sql +SELECT multiSearchAllPositionsCaseInsensitiveUTF8('\x43\x6c\x69\x63\x6b\x48\x6f\x75\x73\x65',['\x68']); +``` + +結果: + +```response +["1","6"] +``` + +## multiSearchFirstPosition + +[`position`](#position) と同様ですが、`haystack` 文字列で複数の `needle` 文字列のいずれかに一致する最も左のオフセットを返します。 + +関数 [`multiSearchFirstPositionCaseInsensitive`](#multisearchfirstpositioncaseinsensitive)、[`multiSearchFirstPositionUTF8`](#multisearchfirstpositionutf8)、および [`multiSearchFirstPositionCaseInsensitiveUTF8`](#multisearchfirstpositioncaseinsensitiveutf8) は、この関数のケースインセンシティブおよび/または UTF-8 バリアントを提供します。 + +**構文** + +```sql +multiSearchFirstPosition(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- `haystack` 文字列で複数の `needle` 文字列のいずれかに一致する最も左のオフセット。 +- 一致がなかった場合は0。 + +**例** + +クエリ: + +```sql +SELECT multiSearchFirstPosition('Hello World',['llo', 'Wor', 'ld']); +``` + +結果: + +```response +3 +``` + +## multiSearchFirstPositionCaseInsensitive + +[`multiSearchFirstPosition`](#multisearchfirstposition) と同様ですが、ケースを無視します。 + +**構文** + +```sql +multiSearchFirstPositionCaseInsensitive(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- `haystack` 文字列で複数の `needle` 文字列のいずれかに一致する最も左のオフセット。 +- 一致がなかった場合は0。 + +**例** + +クエリ: + +```sql +SELECT multiSearchFirstPositionCaseInsensitive('HELLO WORLD',['wor', 'ld', 'ello']); +``` + +結果: + +```response +2 +``` + +## multiSearchFirstPositionUTF8 + +[`multiSearchFirstPosition`](#multisearchfirstposition) と同様ですが、`haystack` と `needle` が UTF-8 エンコードされた文字列であることを前提とします。 + +**構文** + +```sql +multiSearchFirstPositionUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- `haystack` 文字列で複数の `needle` 文字列のいずれかに一致する最も左のオフセット。 +- 一致がなかった場合は0。 + +**例** + +UTF-8 文字列 `hello world` において、与えられた選択肢のいずれかに一致する左端のオフセットを見つけます。 + +クエリ: + +```sql +SELECT multiSearchFirstPositionUTF8('\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64',['wor', 'ld', 'ello']); +``` + +結果: + +```response +2 +``` + +## multiSearchFirstPositionCaseInsensitiveUTF8 + +[`multiSearchFirstPosition`](#multisearchfirstposition) と同様ですが、`haystack` と `needle` が UTF-8 エンコードされた文字列であり、ケースを無視します。 + +**構文** + +```sql +multiSearchFirstPositionCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- ケースを無視し、`haystack` 文字列で複数の `needle` 文字列のいずれかに一致する最も左のオフセット。 +- 一致がなかった場合は0。 + +**例** + +UTF-8 文字列 `HELLO WORLD` において、与えられた選択肢のいずれかに一致する左端のオフセットを見つけます。 + +クエリ: + +```sql +SELECT multiSearchFirstPositionCaseInsensitiveUTF8('\x48\x45\x4c\x4c\x4f\x20\x57\x4f\x52\x4c\x44',['wor', 'ld', 'ello']); +``` + +結果: + +```response +2 +``` + +## multiSearchFirstIndex + +文字列 `haystack` 内で、最も左端に見つかった `needlei` のインデックス `i`(1から開始)を返し、それ以外の場合は0を返します。 + +関数 [`multiSearchFirstIndexCaseInsensitive`](#multisearchfirstindexcaseinsensitive)、[`multiSearchFirstIndexUTF8`](#multisearchfirstindexutf8)、および [`multiSearchFirstIndexCaseInsensitiveUTF8`](#multisearchfirstindexcaseinsensitiveutf8) は、この関数のケースインセンシティブおよび/または UTF-8 バリアントを提供します。 + +**構文** + +```sql +multiSearchFirstIndex(haystack, [needle1, needle2, ..., needleN]) +``` +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 最も左端に見つかった選択肢のインデックス(1から開始)。一致がなかった場合は0。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT multiSearchFirstIndex('Hello World',['World','Hello']); +``` + +結果: + +```response +1 +``` + +## multiSearchFirstIndexCaseInsensitive + +文字列 `haystack` 内で、最も左端に見つかった `needlei` のインデックス `i`(1から開始)を返し、それ以外の場合は0を返します。ケースを無視します。 + +**構文** + +```sql +multiSearchFirstIndexCaseInsensitive(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 最も左端に見つかった選択肢のインデックス(1から開始)。一致がなかった場合は0。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT multiSearchFirstIndexCaseInsensitive('hElLo WoRlD',['World','Hello']); +``` + +結果: + +```response +1 +``` + +## multiSearchFirstIndexUTF8 + +文字列 `haystack` 内で、最も左端に見つかった `needlei` のインデックス `i`(1から開始)を返し、それ以外の場合は0を返します。`haystack` と `needle` が UTF-8 エンコードされた文字列であることを前提とします。 + +**構文** + +```sql +multiSearchFirstIndexUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 最も左端に見つかった選択肢のインデックス(1から開始)。一致がなかった場合は0。[UInt8](../data-types/int-uint.md)。 + +**例** + +UTF-8 文字列 `Hello World` を与え、UTF-8 文字列 `Hello` と `World` の最初のインデックスを見つけます。 + +クエリ: + +```sql +SELECT multiSearchFirstIndexUTF8('\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64',['\x57\x6f\x72\x6c\x64','\x48\x65\x6c\x6c\x6f']); +``` + +結果: + +```response +1 +``` + +## multiSearchFirstIndexCaseInsensitiveUTF8 + +文字列 `haystack` 内で、最も左端に見つかった `needlei` のインデックス `i`(1から開始)を返し、それ以外の場合は0を返します。`haystack` と `needle` が UTF-8 エンコードされた文字列であり、ケースを無視します。 + +**構文** + +```sql +multiSearchFirstIndexCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 最も左端に見つかった選択肢のインデックス(1から開始)。一致がなかった場合は0。[UInt8](../data-types/int-uint.md)。 + +**例** + +UTF-8 文字列 `HELLO WORLD` を与え、UTF-8 文字列 `hello` と `world` の最初のインデックスを見つけます。 + +クエリ: + +```sql +SELECT multiSearchFirstIndexCaseInsensitiveUTF8('\x48\x45\x4c\x4c\x4f\x20\x57\x4f\x52\x4c\x44',['\x68\x65\x6c\x6c\x6f','\x77\x6f\x72\x6c\x64']); +``` + +結果: + +```response +1 +``` + +## multiSearchAny + +少なくとも1つの文字列 `needlei` が文字列 `haystack` に一致する場合は1を返し、それ以外の場合は0を返します。 + +関数 [`multiSearchAnyCaseInsensitive`](#multisearchanycaseinsensitive)、[`multiSearchAnyUTF8`](#multisearchanyutf8)、および [`multiSearchAnyCaseInsensitiveUTF8`](#multisearchanycaseinsensitiveutf8) は、この関数のケースインセンシティブおよび/または UTF-8 バリアントを提供します。 + +**構文** + +```sql +multiSearchAny(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 少なくとも1つの一致があった場合は1。 +- 少なくとも1つの一致がなかった場合は0。 + +**例** + +クエリ: + +```sql +SELECT multiSearchAny('ClickHouse',['C','H']); +``` + +結果: + +```response +1 +``` + +## multiSearchAnyCaseInsensitive + +[multiSearchAny](#multisearchany) と同様ですが、ケースを無視します。 + +**構文** + +```sql +multiSearchAnyCaseInsensitive(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 少なくとも1つのケースインセンシティブな一致があった場合は1。 +- 少なくとも1つのケースインセンシティブな一致がなかった場合は0。 + +**例** + +クエリ: + +```sql +SELECT multiSearchAnyCaseInsensitive('ClickHouse',['c','h']); +``` + +結果: + +```response +1 +``` + +## multiSearchAnyUTF8 + +[multiSearchAny](#multisearchany) と同様ですが、`haystack` と `needle` サブ文字列が UTF-8 エンコードされた文字列であることを前提とします。 + +**構文** + +```sql +multiSearchAnyUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 少なくとも1つの一致があった場合は1。 +- 少なくとも1つの一致がなかった場合は0。 + +**例** + +与えられた `ClickHouse` を UTF-8 文字列とし、`C` (`\x43`) や `H` (`\x48`) の文字が単語に含まれているかチェックします。 + +クエリ: + +```sql +SELECT multiSearchAnyUTF8('\x43\x6c\x69\x63\x6b\x48\x6f\x75\x73\x65',['\x43','\x48']); +``` + +結果: + +```response +1 +``` + +## multiSearchAnyCaseInsensitiveUTF8 + +[multiSearchAnyUTF8](#multisearchanyutf8) と同様ですが、ケースを無視します。 + +**構文** + +```sql +multiSearchAnyCaseInsensitiveUTF8(haystack, [needle1, needle2, ..., needleN]) +``` + +**パラメータ** + +- `haystack` — 検索が行われる UTF-8 エンコードされた文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される UTF-8 サブ文字列。[Array](../data-types/array.md)。 + +**返される値** + +- 少なくとも1つのケースインセンシティブな一致があった場合は1。 +- 少なくとも1つのケースインセンシティブな一致がなかった場合は0。 + +**例** + +与えられた `ClickHouse` を UTF-8 文字列とし、`h` (`\x68`) の文字が単語に含まれているかケースを無視してチェックします。 + +クエリ: + +```sql +SELECT multiSearchAnyCaseInsensitiveUTF8('\x43\x6c\x69\x63\x6b\x48\x6f\x75\x73\x65',['\x68']); +``` + +結果: + +```response +1 +``` + +## match {#match} + +文字列 `haystack` が [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax) の正規表現 `pattern` に一致するかどうかを返します。 + +一致は UTF-8 に基づいて行われます。たとえば、`.` は Unicode コードポイント `¥` に一致し、このコードポイントは UTF-8 では2バイトで表されます。正規表現には null バイトを含めることはできません。`haystack` または `pattern` が有効な UTF-8 でない場合、動作は未定義です。 + +re2 のデフォルト動作とは異なり、`.` は改行を含むすべての文字に一致します。これを無効にするには、パターンの先頭に `(?-s)` を追加してください。 + +文字列の部分文字列を検索したいだけなら、[like](#like) や [position](#position) 関数を使用できます。これらの関数はこの関数よりもはるかに高速に動作します。 + +**構文** + +```sql +match(haystack, pattern) +``` + +エイリアス: `haystack REGEXP pattern` 演算子 + +## multiMatchAny + +`match` と同様ですが、少なくとも1つのパターンが一致する場合は1を返し、そうでない場合は0を返します。 + +:::note +`multi[Fuzzy]Match*()` ファミリーの関数は、(Vectorscan)[https://github.com/VectorCamp/vectorscan] ライブラリを使用します。そのため、vectorscan をサポートするように ClickHouse がコンパイルされている場合にのみ有効になります。 + +すべての hyperscan を使用する関数をオフにするには、設定 `SET allow_hyperscan = 0;` を使用します。 + +vectorscan の制限により、`haystack` 文字列の長さは 232 バイト未満である必要があります。 + +Hyperscan は一般的に正規表現拒否サービス(ReDoS)攻撃に対して脆弱です(例: ここ(here)[https://www.usenix.org/conference/usenixsecurity22/presentation/turonova]やここ(here)[https://doi.org/10.1007/s10664-021-10033-1]およびここ(here)[https://doi.org/10.1145/3236024.3236027]を参照)。提供されるパターンを慎重に確認することをユーザーに推奨します。 +::: + +もし複数の部分文字列を文字列で検索したいだけなら、[multiSearchAny](#multisearchany) 関数を使用することができます。この関数はこの関数よりもはるかに高速に動作します。 + +**構文** + +```sql +multiMatchAny(haystack, \[pattern1, pattern2, ..., patternn\]) +``` + +## multiMatchAnyIndex + +`multiMatchAny` と同様ですが、haystack に一致するインデックスのいずれかを返します。 + +**構文** + +```sql +multiMatchAnyIndex(haystack, \[pattern1, pattern2, ..., patternn\]) +``` + +## multiMatchAllIndices + +`multiMatchAny` と同様ですが、任意の順序ですべてのインデックスが haystack に一致する配列を返します。 + +**構文** + +```sql +multiMatchAllIndices(haystack, \[pattern1, pattern2, ..., patternn\]) +``` + +## multiFuzzyMatchAny + +`multiMatchAny` と同様ですが、定数の[編集距離](https://en.wikipedia.org/wiki/Edit_distance)で haystack を満たすパターンがある場合に1を返します。この関数は [hyperscan](https://intel.github.io/hyperscan/dev-reference/compilation.html#approximate-matching) ライブラリのエクスペリメンタルな機能に依存しており、いくつかのコーナーケースでは遅くなることがあります。パフォーマンスは編集距離の値と使用されたパターンに依存しますが、常に非ファジーバリアントよりも高いコストがかかります。 + +:::note +`multiFuzzyMatch*()` 関数ファミリーは UTF-8 正規表現をサポートしていません(それらをバイトのシーケンスとして処理します)これは hyperscan の制限によるものです。 +::: + +**構文** + +```sql +multiFuzzyMatchAny(haystack, distance, \[pattern1, pattern2, ..., patternn\]) +``` + +## multiFuzzyMatchAnyIndex + +`multiFuzzyMatchAny` と同様ですが、固定の編集距離内で haystack に一致するインデックスのいずれかを返します。 + +**構文** + +```sql +multiFuzzyMatchAnyIndex(haystack, distance, \[pattern1, pattern2, ..., patternn\]) +``` + +## multiFuzzyMatchAllIndices + +`multiFuzzyMatchAny` と同様ですが、定数の編集距離内で一致するすべてのインデックスを任意の順序で返す配列を返します。 + +**構文** + +```sql +multiFuzzyMatchAllIndices(haystack, distance, \[pattern1, pattern2, ..., patternn\]) +``` + +## extract + +文字列の正規表現に一致する最初の部分文字列を返します。 +`haystack` が `pattern` 正規表現に一致しない場合、空の文字列が返されます。 + +正規表現にキャプチャグループがある場合、この関数は入力文字列を最初のキャプチャグループに対して一致させます。 + +**構文** + +```sql +extract(haystack, pattern) +``` + +**引数** + +- `haystack` — 入力文字列。[String](../data-types/string.md)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax)を使用した正規表現。 + +**返される値** + +- haystack 文字列の正規表現の最初の一致。[String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT extract('number: 1, number: 2, number: 3', '\\d+') AS result; +``` + +結果: + +```response +┌─result─┐ +│ 1 │ +└────────┘ +``` + +## extractAll + +文字列の正規表現のすべての一致を含む配列を返します。`haystack` が `pattern` 正規表現に一致しない場合、空の文字列が返されます。 + +サブパターンに関する動作は、関数[`extract`](#extract)と同じです。 + +**構文** + +```sql +extractAll(haystack, pattern) +``` + +**引数** + +- `haystack` — 入力文字列。[String](../data-types/string.md)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax)を使用した正規表現。 + +**返される値** + +- haystack 文字列の正規表現の一致の配列。[Array](../data-types/array.md)([String](../data-types/string.md))。 + +**例** + +クエリ: + +```sql +SELECT extractAll('number: 1, number: 2, number: 3', '\\d+') AS result; +``` + +結果: + +```response +┌─result────────┐ +│ ['1','2','3'] │ +└───────────────┘ +``` + +## extractAllGroupsHorizontal + +`haystack` 文字列のすべてのグループを正規表現 `pattern` を使用してマッチングし、すべてのグループに一致するフラグメントを配列で返します。配列の最初の要素は、最初のグループのすべての一致を含み、二つ目の配列は二番目のグループが一致したフラグメントを、それぞれのグループのフラグメントが含まれている。 + +この関数は [extractAllGroupsVertical](#extractallgroupsvertical) よりも遅いです。 + +**構文** + +``` sql +extractAllGroupsHorizontal(haystack, pattern) +``` + +**引数** + +- `haystack` — 入力文字列。[String](../data-types/string.md)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax)を使用した正規表現。括弧で囲まれたグループを含む必要があります。`pattern` にグループが含まれていない場合、例外がスローされます。[String](../data-types/string.md)。 + +**返される値** + +- 一致の配列の配列。[Array](../data-types/array.md)。 + +:::note +`haystack` が `pattern` 正規表現に一致しない場合、空の配列の配列が返されます。 +::: + +**例** + +``` sql +SELECT extractAllGroupsHorizontal('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)'); +``` + +結果: + +``` text +┌─extractAllGroupsHorizontal('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)')─┐ +│ [['abc','def','ghi'],['111','222','333']] │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## extractGroups + +指定された入力文字列を与えられた正規表現でマッチングし、一致する配列の配列を返します。 + +**構文** + +``` sql +extractGroups(haystack, pattern) +``` + +**引数** + +- `haystack` — 入力文字列。[String](../data-types/string.md)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax)を使用した正規表現。括弧で囲まれたグループを含む必要があります。`pattern` にグループが含まれていない場合、例外がスローされます。[String](../data-types/string.md)。 + +**返される値** + +- 一致の配列の配列。[Array](../data-types/array.md)。 + +**例** + +``` sql +SELECT extractGroups('hello abc=111 world', '("[^"]+"|\\w+)=("[^"]+"|\\w+)') AS result; +``` + +結果: + +``` text +┌─result────────┐ +│ ['abc','111'] │ +└───────────────┘ +``` + +## extractAllGroupsVertical + +`haystack` 文字列のすべてのグループを正規表現 `pattern` を使用してマッチングし、配列で返します。この配列の各要素には、`haystack` に出現順が含まれている各グループに由来するフラグメントが含まれています。 + +**構文** + +``` sql +extractAllGroupsVertical(haystack, pattern) +``` + +**引数** + +- `haystack` — 入力文字列。[String](../data-types/string.md)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax)を使用した正規表現。括弧で囲まれたグループを含む必要があります。`pattern` にグループが含まれていない場合、例外がスローされます。[String](../data-types/string.md)。 + +**返される値** + +- 一致の配列の配列。[Array](../data-types/array.md)。 + +:::note +`haystack` が `pattern` 正規表現に一致しない場合、空の配列が返されます。 +::: + +**例** + +``` sql +SELECT extractAllGroupsVertical('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)'); +``` + +結果: + +``` text +┌─extractAllGroupsVertical('abc=111, def=222, ghi=333', '("[^"]+"|\\w+)=("[^"]+"|\\w+)')─┐ +│ [['abc','111'],['def','222'],['ghi','333']] │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## like + +文字列 `haystack` が LIKE 式 `pattern` に一致するかどうかを返します。 + +LIKE 式は、通常の文字と次のメタシンボルを含むことができます。 + +- `%` は任意の数のおよび任意の文字を示します(0文字を含む)。 +- `_` は1つの任意の文字を示します。 +- `\` はリテラル `%`、`_` および `\` をエスケープします。 + +一致は UTF-8 に基づいて行われます。たとえば、`_` は Unicode コードポイント `¥` に一致し、このコードポイントは UTF-8 では2バイトで表されます。 + +`haystack` または LIKE 式が有効な UTF-8 でない場合、動作は未定義です。 + +自動的な Unicode 正規化は行われません、[normalizeUTF8*()](https://clickhouse.com../functions/string-functions/) 関数を使用してください。 + +リテラル `%`、`_` および `\`(LIKE メタ文字)に対しては、バックスラッシュ:`\%`、`\_` および `\\` を前置します。バックスラッシュは、`%`、`_` または `\` 以外の文字に前置される場合、その特別な意味を失います(つまり、文字通りに解釈されます)。クリックハウスでは、[文字列の](../syntax.md#string)バックスラッシュを引用する必要があることに注意してください、そのため実際に `\\%`、`\\_` および `\\` を書く必要があります。 + +LIKE 式が `%needle%` の形式の場合、関数は `position` 関数と同じスピードで動作します。他のすべての LIKE 式は、内部的に正規表現に変換され、`match` 関数と同様の速度で実行されます。 + +**構文** + +```sql +like(haystack, pattern) +``` + +エイリアス: `haystack LIKE pattern`(演算子) + +## notLike {#notlike} + +`like` と同様ですが、結果を否定します。 + +エイリアス: `haystack NOT LIKE pattern`(演算子) + +## ilike + +`like` と同様ですが、ケースを無視します。 + +エイリアス: `haystack ILIKE pattern`(演算子) + +## notILike + +`ilike` と同様ですが、結果を否定します。 + +エイリアス: `haystack NOT ILIKE pattern`(演算子) + +## ngramDistance + +`haystack` 文字列と `needle` 文字列の 4-gram 距離を計算します。これにより、二つの4-gram マルチセットの対称差をカウントし、それをそれらの組の和で正規化します。[Float32](../data-types/float.md/#float32-float64) を返します。値は0から1までです。結果が小さければ小さいほど、文字列は互いに似ています。 + +関数 [`ngramDistanceCaseInsensitive`](#ngramdistancecaseinsensitive)、[`ngramDistanceUTF8`](#ngramdistanceutf8)、[`ngramDistanceCaseInsensitiveUTF8`](#ngramdistancecaseinsensitiveutf8) は、この関数のケースインセンシティブおよび/または UTF-8 バリアントを提供します。 + +**構文** + +```sql +ngramDistance(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の比較文字列。[String literal](../syntax#string) +- `needle`: 第二の比較文字列。[String literal](../syntax#string) + +**返される値** + +- 二つの文字列間の類似度を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +**実装の詳細** + +この関数は、定数 `needle` または `haystack` の引数が32Kbを超える場合、例外をスローします。非定数 `haystack` または `needle` の引数が32Kbを超える場合、距離は常に1になります。 + +**例** + +二つの文字列が互いに似ていれば似ているほど、結果は0に近くなります(同一の場合)。 + +クエリ: + +```sql +SELECT ngramDistance('ClickHouse','ClickHouse!'); +``` + +結果: + +```response +0.06666667 +``` + +二つの文字列が互いに似ていなければ似ていないほど、結果は大きくなります。 + +クエリ: + +```sql +SELECT ngramDistance('ClickHouse','House'); +``` + +結果: + +```response +0.5555556 +``` + +## ngramDistanceCaseInsensitive + +[ngramDistance](#ngramdistance) のケースインセンシティブバージョンを提供します。 + +**構文** + +```sql +ngramDistanceCaseInsensitive(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の比較文字列。[String literal](../syntax#string) +- `needle`: 第二の比較文字列。[String literal](../syntax#string) + +**返される値** + +- 二つの文字列間の類似度を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +**例** + +[ngramDistance](#ngramdistance) を使用すると、ケースの違いが類似度の値に影響します: + +クエリ: + +```sql +SELECT ngramDistance('ClickHouse','clickhouse'); +``` + +結果: + +```response +0.71428573 +``` + +[ngramDistanceCaseInsensitive](#ngramdistancecaseinsensitive) を使用すると、ケースは無視されるため、ケースだけが異なる同一の文字列は低い類似度値を返します: + +クエリ: + +```sql +SELECT ngramDistanceCaseInsensitive('ClickHouse','clickhouse'); +``` + +結果: + +```response +0 +``` + +## ngramDistanceUTF8 + +[ngramDistance](#ngramdistance) の UTF-8 バリアントを提供します。`needle` と `haystack` 文字列が UTF-8 エンコードされた文字列であることを前提としています。 + +**構文** + +```sql +ngramDistanceUTF8(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) +- `needle`: 第二の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) + +**返される値** + +- 二つの文字列間の類似度を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +**例** + +クエリ: + +```sql +SELECT ngramDistanceUTF8('abcde','cde'); +``` + +結果: + +```response +0.5 +``` + +## ngramDistanceCaseInsensitiveUTF8 + +[ngramDistanceUTF8](#ngramdistanceutf8) のケースインセンシティブバージョンを提供します。 + +**構文** + +```sql +ngramDistanceCaseInsensitiveUTF8(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) +- `needle`: 第二の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) + +**返される値** + +- 二つの文字列間の類似度を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +**例** + +クエリ: + +```sql +SELECT ngramDistanceCaseInsensitiveUTF8('abcde','CDE'); +``` + +結果: + +```response +0.5 +``` + +## ngramSearch + +`ngramDistance` に似ていますが、`needle` 文字列と `haystack` 文字列の非対称差を計算します。すなわち、needle の n-gram の数から共通の n-gram の数を引き、`needle` n-gram の数で正規化します。[Float32](../data-types/float.md/#float32-float64) を返します。値は0から1の間です。結果が大きいほど、`needle` が `haystack` に含まれている可能性が高くなります。この関数はファジー文字列検索に便利です。また、[`soundex`](../../sql-reference/functions/string-functions#soundex) 関数も参照してください。 + +関数 [`ngramSearchCaseInsensitive`](#ngramsearchcaseinsensitive)、[`ngramSearchUTF8`](#ngramsearchutf8)、[`ngramSearchCaseInsensitiveUTF8`](#ngramsearchcaseinsensitiveutf8) は、この関数のケースインセンシティブおよび/または UTF-8 バリアントを提供します。 + +**構文** + +```sql +ngramSearch(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の比較文字列。[String literal](../syntax#string) +- `needle`: 第二の比較文字列。[String literal](../syntax#string) + +**返される値** + +- `needle` が `haystack` に含まれている可能性を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +**実装の詳細** + +:::note +UTF-8 バリアントは3-gram距離を使用します。これらは完全に公平なn-gram距離ではありません。私たちは n-gram をハッシュするために2バイト長のハッシュを使い、それからこれらのハッシュテーブル間の(非)対称差を計算します - 衝突が発生する可能性があります。UTF-8ケースインセンシティブフォーマットでは、`tolower` 関数を公正に使用していません - 各コードポイントバイトの5番目ビット(0からスタート)を、バイトが1つ以上ある場合、0から始まるビットをゼロにします - これはラテン語とほとんどすべてのキリル文字に対して機能します。 +::: + +**例** + +クエリ: + +```sql +SELECT ngramSearch('Hello World','World Hello'); +``` + +結果: + +```response +0.5 +``` + +## ngramSearchCaseInsensitive + +[ngramSearch](#ngramsearch) のケースインセンシティブバージョンを提供します。 + +**構文** + +```sql +ngramSearchCaseInsensitive(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の比較文字列。[String literal](../syntax#string) +- `needle`: 第二の比較文字列。[String literal](../syntax#string) + +**返される値** + +- `needle` が `haystack` に含まれている可能性を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +The bigger the result is, the more likely `needle` is in the `haystack`. + +**例** + +クエリ: + +```sql +SELECT ngramSearchCaseInsensitive('Hello World','hello'); +``` + +結果: + +```response +1 +``` + +## ngramSearchUTF8 + +[ngramSearch](#ngramsearch) の UTF-8 バリアントを提供し、`needle` と `haystack` が UTF-8 エンコードされた文字列であることを前提としています。 + +**構文** + +```sql +ngramSearchUTF8(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) +- `needle`: 第二の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) + +**返される値** + +- `needle` が `haystack` に含まれている可能性を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +The bigger the result is, the more likely `needle` is in the `haystack`. + +**例** + +クエリ: + +```sql +SELECT ngramSearchUTF8('абвгдеёжз', 'гдеёзд'); +``` + +結果: + +```response +0.5 +``` + +## ngramSearchCaseInsensitiveUTF8 + +[ngramSearchUTF8](#ngramsearchutf8) のケースインセンシティブバージョンを提供し、`needle` と `haystack` が UTF-8 エンコードされた文字列であることを前提としています。 + +**構文** + +```sql +ngramSearchCaseInsensitiveUTF8(haystack, needle) +``` + +**パラメータ** + +- `haystack`: 第一の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) +- `needle`: 第二の UTF-8 エンコードされた比較文字列。[String literal](../syntax#string) + +**返される値** + +- `needle` が `haystack` に含まれている可能性を表す値、0から1の間。[Float32](../data-types/float.md/#float32-float64) + +The bigger the result is, the more likely `needle` is in the `haystack`. + +**例** + +クエリ: + +```sql +SELECT ngramSearchCaseInsensitiveUTF8('абвГДЕёжз', 'АбвгдЕЁжз'); +``` + +結果: + +```response +0.57142854 +``` + +## countSubstrings + +サブ文字列 `needle` が文字列 `haystack` にどれほど頻繁に出現するかを返します。 + +関数 [`countSubstringsCaseInsensitive`](#countsubstringscaseinsensitive) および [`countSubstringsCaseInsensitiveUTF8`](#countsubstringscaseinsensitiveutf8) は、それぞれケースインセンシティブおよびケースインセンシティブ + UTF-8 バリアントを提供します。 + +**構文** + +``` sql +countSubstrings(haystack, needle[, start_pos]) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `start_pos` – 検索開始位置 (`haystack` の1ベースの位置)。[UInt](../data-types/int-uint.md)。オプション。 + +**返される値** + +- 出現回数。[UInt64](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT countSubstrings('aaaa', 'aa'); +``` + +結果: + +``` text +┌─countSubstrings('aaaa', 'aa')─┐ +│ 2 │ +└───────────────────────────────┘ +``` + +`start_pos` 引数を使用した例: + +```sql +SELECT countSubstrings('abc___abc', 'abc', 4); +``` + +結果: + +``` text +┌─countSubstrings('abc___abc', 'abc', 4)─┐ +│ 1 │ +└────────────────────────────────────────┘ +``` +## countSubstringsCaseInsensitive + +サブ文字列 `needle` が文字列 `haystack` にどれほど頻繁に出現するかを返します。ケースを無視します。 + +**構文** + +``` sql +countSubstringsCaseInsensitive(haystack, needle[, start_pos]) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `start_pos` – 検索開始位置 (`haystack` の1ベースの位置)。[UInt](../data-types/int-uint.md)。オプション。 + +**返される値** + +- 出現回数。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT countSubstringsCaseInsensitive('AAAA', 'aa'); +``` + +結果: + +``` text +┌─countSubstringsCaseInsensitive('AAAA', 'aa')─┐ +│ 2 │ +└──────────────────────────────────────────────┘ +``` + +`start_pos` 引数を使用した例: + +クエリ: + +```sql +SELECT countSubstringsCaseInsensitive('abc___ABC___abc', 'abc', 4); +``` + +結果: + +``` text +┌─countSubstringsCaseInsensitive('abc___ABC___abc', 'abc', 4)─┐ +│ 2 │ +└─────────────────────────────────────────────────────────────┘ +``` + +## countSubstringsCaseInsensitiveUTF8 + +サブ文字列 `needle` が文字列 `haystack` にどれほど頻繁に出現するかを返します。ケースを無視し、`haystack` が UTF-8 文字列であることを前提とします。 + +**構文** + +``` sql +countSubstringsCaseInsensitiveUTF8(haystack, needle[, start_pos]) +``` + +**引数** + +- `haystack` — UTF-8 文字列で行われる検索。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索されるサブ文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `start_pos` – 検索開始位置 (`haystack` の1ベースの位置)。[UInt](../data-types/int-uint.md)。オプション。 + +**返される値** + +- 出現回数。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА'); +``` + +結果: + +``` text +┌─countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА')─┐ +│ 4 │ +└────────────────────────────────────────────────────────────────────┘ +``` + +`start_pos` 引数を使用した例: + +クエリ: + +```sql +SELECT countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА', 13); +``` + +結果: + +``` text +┌─countSubstringsCaseInsensitiveUTF8('ложка, кошка, картошка', 'КА', 13)─┐ +│ 2 │ +└────────────────────────────────────────────────────────────────────────┘ +``` + +## countMatches + +`haystack` で正規表現 `pattern` が一致する回数を返します。 + +**構文** + +``` sql +countMatches(haystack, pattern) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax) を使用した正規表現。[String](../data-types/string.md)。 + +**返される値** + +- 一致の回数。[UInt64](../data-types/int-uint.md)。 + +**例** + +``` sql +SELECT countMatches('foobar.com', 'o+'); +``` + +結果: + +``` text +┌─countMatches('foobar.com', 'o+')─┐ +│ 2 │ +└──────────────────────────────────┘ +``` + +``` sql +SELECT countMatches('aaaa', 'aa'); +``` + +結果: + +``` text +┌─countMatches('aaaa', 'aa')────┐ +│ 2 │ +└───────────────────────────────┘ +``` + +## countMatchesCaseInsensitive + +正規表現 `pattern` が `haystack` に一致する回数を返します。大文字小文字の区別はしません。 + +**構文** + +``` sql +countMatchesCaseInsensitive(haystack, pattern) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `pattern` — [re2 正規表現構文](https://github.com/google/re2/wiki/Syntax) を使用した正規表現。[String](../data-types/string.md)。 + +**返される値** + +- 一致の回数。[UInt64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT countMatchesCaseInsensitive('AAAA', 'aa'); +``` + +結果: + +``` text +┌─countMatchesCaseInsensitive('AAAA', 'aa')────┐ +│ 2 │ +└──────────────────────────────────────────────┘ +``` + +## regexpExtract + +`haystack` で正規表現パターンに一致する最初の文字列を抽出し、正規表現グループインデックスに対応します。 + +**構文** + +``` sql +regexpExtract(haystack, pattern[, index]) +``` + +エイリアス: `REGEXP_EXTRACT(haystack, pattern[, index])`。 + +**引数** + +- `haystack` — 正規表現パターンが一致する文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `pattern` — 正規表現式の文字列、定数でなければならない。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `index` – 0以上の整数でデフォルトは1です。抽出する正規表現グループを表します。[UInt または Int](../data-types/int-uint.md)。オプション。 + +**返される値** + +`pattern` は複数の正規表現グループを含むことができ、`index` は抽出する正規表現グループを示します。インデックスが0の場合、正規表現全体に一致します。[String](../data-types/string.md)。 + +**例** + +``` sql +SELECT + regexpExtract('100-200', '(\\d+)-(\\d+)', 1), + regexpExtract('100-200', '(\\d+)-(\\d+)', 2), + regexpExtract('100-200', '(\\d+)-(\\d+)', 0), + regexpExtract('100-200', '(\\d+)-(\\d+)'); +``` + +結果: + +``` text +┌─regexpExtract('100-200', '(\\d+)-(\\d+)', 1)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)', 2)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)', 0)─┬─regexpExtract('100-200', '(\\d+)-(\\d+)')─┐ +│ 100 │ 200 │ 100-200 │ 100 │ +└──────────────────────────────────────────────┴──────────────────────────────────────────────┴──────────────────────────────────────────────┴───────────────────────────────────────────┘ +``` + +## hasSubsequence + +`needle` が `haystack` の部分列である場合は1を、それ以外の場合は0を返します。 +文字列の部分列は、与えられた文字列から0個以上の要素を削除することで導き出されるシーケンスです。 + +**構文** + +``` sql +hasSubsequence(haystack, needle) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される部分列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 + +**返される値** + +- 1が部分列である場合は `haystack`、そうでない場合は `needle`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT hasSubsequence('garbage', 'arg'); +``` + +結果: + +``` text +┌─hasSubsequence('garbage', 'arg')─┐ +│ 1 │ +└──────────────────────────────────┘ +``` + +## hasSubsequenceCaseInsensitive + +[hasSubsequence](#hassubsequence) と同様ですが、大文字小文字の区別を無視して検索します。 + +**構文** + +``` sql +hasSubsequenceCaseInsensitive(haystack, needle) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される部分列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 + +**返される値** + +- 1が部分列であれば `haystack`、さもなくば `needle`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +SELECT hasSubsequenceCaseInsensitive('garbage', 'ARG'); +``` + +結果: + +``` text +┌─hasSubsequenceCaseInsensitive('garbage', 'ARG')─┐ +│ 1 │ +└─────────────────────────────────────────────────┘ +``` + +## hasSubsequenceUTF8 + +[hasSubsequence](#hassubsequence) と同様ですが、`haystack` と `needle` が UTF-8 エンコードされた文字列であることを前提とします。 + +**構文** + +``` sql +hasSubsequenceUTF8(haystack, needle) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。UTF-8 エンコードされた [String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される部分列。UTF-8 エンコードされた [String](../../sql-reference/syntax.md#syntax-string-literal)。 + +**返される値** + +- 1が部分列であれば `haystack`、さもなくば `needle`。[UInt8](../data-types/int-uint.md)。 + +クエリ: + +**例** + +``` sql +select hasSubsequenceUTF8('ClickHouse - столбцовая система управления базами данных', 'система'); +``` + +結果: + +``` text +┌─hasSubsequenceUTF8('ClickHouse - столбцовая система управления базами данных', 'система')─┐ +│ 1 │ +└───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## hasSubsequenceCaseInsensitiveUTF8 + +[hasSubsequenceUTF8](#hassubsequenceutf8) と同様ですが、大文字小文字を区別しません。 + +**構文** + +``` sql +hasSubsequenceCaseInsensitiveUTF8(haystack, needle) +``` + +**引数** + +- `haystack` — 検索が行われる文字列。UTF-8 エンコードされた [String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `needle` — 検索される部分列。UTF-8 エンコードされた [String](../../sql-reference/syntax.md#syntax-string-literal)。 + +**返される値** + +- 1が部分列であれば `haystack`、さもなくば `needle`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +``` sql +select hasSubsequenceCaseInsensitiveUTF8('ClickHouse - столбцовая система управления базами данных', 'СИСТЕМА'); +``` + +結果: + +``` text +┌─hasSubsequenceCaseInsensitiveUTF8('ClickHouse - столбцовая система управления базами данных', 'СИСТЕМА')─┐ +│ 1 │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## hasToken + +指定されたトークンが haystack に存在する場合は1を、それ以外の場合は0を返します。 + +**構文** + +```sql +hasToken(haystack, token) +``` + + +**パラメータ** + +- `haystack`: 検索を行う文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `token`: 2つの非英数字ASCII文字(またはhaystackの境界)の間の最大長サブストリング。 + +**返される値** + +- tokenがhaystackに存在する場合は1、そうでない場合は0。[UInt8](../data-types/int-uint.md)。 + +**実装の詳細** + +tokenは定数文字列でなければなりません。tokenbf_v1 インデックスの特殊化によってサポートされています。 + +**例** + +クエリ: + +```sql +SELECT hasToken('Hello World','Hello'); +``` + +```response +1 +``` + +## hasTokenOrNull + +指定されたtokenが存在する場合は1を返し、存在しない場合は0を返し、tokenが不正な形式の場合はnullを返します。 + +**構文** + +```sql +hasTokenOrNull(haystack, token) +``` + +**パラメータ** + +- `haystack`: 検索を行う文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `token`: 2つの非英数字ASCII文字(またはhaystackの境界)の間の最大長サブストリング。 + +**返される値** + +- tokenがhaystackに存在する場合は1、存在しない場合は0、不正な形式のtokenの場合はnull。 + +**実装の詳細** + +tokenは定数文字列でなければなりません。tokenbf_v1 インデックスの特殊化によってサポートされています。 + +**例** + +`hasToken`は不正な形式のtokenに対してエラーを投げますが、`hasTokenOrNull`は不正な形式のtokenに対して`null`を返します。 + +クエリ: + +```sql +SELECT hasTokenOrNull('Hello World','Hello,World'); +``` + +```response +null +``` + +## hasTokenCaseInsensitive + +指定されたtokenがhaystackに存在する場合は1を返し、そうでない場合は0を返します。大文字小文字を無視します。 + +**構文** + +```sql +hasTokenCaseInsensitive(haystack, token) +``` + +**パラメータ** + +- `haystack`: 検索を行う文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `token`: 2つの非英数字ASCII文字(またはhaystackの境界)の間の最大長サブストリング。 + +**返される値** + +- tokenがhaystackに存在する場合は1、そうでない場合は0。[UInt8](../data-types/int-uint.md)。 + +**実装の詳細** + +tokenは定数文字列でなければなりません。tokenbf_v1 インデックスの特殊化によってサポートされています。 + +**例** + +クエリ: + +```sql +SELECT hasTokenCaseInsensitive('Hello World','hello'); +``` + +```response +1 +``` + +## hasTokenCaseInsensitiveOrNull + +指定されたtokenがhaystackに存在する場合は1を返し、そうでない場合は0を返します。大文字小文字を無視し、不正な形式のtokenの場合はnullを返します。 + +**構文** + +```sql +hasTokenCaseInsensitiveOrNull(haystack, token) +``` + +**パラメータ** + +- `haystack`: 検索を行う文字列。[String](../../sql-reference/syntax.md#syntax-string-literal)。 +- `token`: 2つの非英数字ASCII文字(またはhaystackの境界)の間の最大長サブストリング。 + +**返される値** + +- tokenがhaystackに存在する場合は1、存在しない場合は0、不正な形式のtokenの場合は[`null`](../data-types/nullable.md)。[UInt8](../data-types/int-uint.md)。 + +**実装の詳細** + +tokenは定数文字列でなければなりません。tokenbf_v1 インデックスの特殊化によってサポートされています。 + +**例** + +`hasTokenCaseInsensitive`は不正な形式のtokenに対してエラーを投げますが、`hasTokenCaseInsensitiveOrNull`は不正な形式のtokenに対して`null`を返します。 + +クエリ: + +```sql +SELECT hasTokenCaseInsensitiveOrNull('Hello World','hello,world'); +``` + +```response +null +``` diff --git a/docs/ja/sql-reference/functions/time-series-functions.md b/docs/ja/sql-reference/functions/time-series-functions.md new file mode 100644 index 00000000000..1e8b0d3659b --- /dev/null +++ b/docs/ja/sql-reference/functions/time-series-functions.md @@ -0,0 +1,164 @@ +--- +slug: /ja/sql-reference/functions/time-series-functions +sidebar_position: 172 +sidebar_label: タイムシリーズ +--- + +# タイムシリーズ関数 + +以下の関数は、シリーズデータの分析に使用されます。 + +## seriesOutliersDetectTukey + +[Tukey Fences](https://en.wikipedia.org/wiki/Outlier#Tukey%27s_fences) を用いてシリーズデータの外れ値を検出します。 + +**構文** + +``` sql +seriesOutliersDetectTukey(series); +seriesOutliersDetectTukey(series, min_percentile, max_percentile, K); +``` + +**引数** + +- `series` - 数値の配列。 +- `min_percentile` - 四分位範囲 [(IQR)](https://en.wikipedia.org/wiki/Interquartile_range) を計算するために使用される最小パーセンタイル。値は [0.02,0.98] の範囲で指定する必要があります。デフォルトは 0.25 です。 +- `max_percentile` - 四分位範囲 (IQR) を計算するために使用される最大パーセンタイル。値は [0.02,0.98] の範囲で指定する必要があります。デフォルトは 0.75 です。 +- `K` - 軽度または強い外れ値を検出するための非負定数値。デフォルト値は 1.5 です。 + +外れ値を検出するためには、`series` に少なくとも4つのデータポイントが必要です。 + +**戻り値** + +- シリーズ内の各要素に対応する可能性のある異常のスコアを表す、元の入力配列と同じ長さの配列を返します。非ゼロのスコアは異常の可能性を示します。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4, 5, 12, 45, 12, 3, 3, 4, 5, 6]) AS print_0; +``` + +結果: + +``` text +┌───────────print_0─────────────────┐ +│[0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0] │ +└───────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT seriesOutliersDetectTukey([-3, 2, 15, 3, 5, 6, 4.50, 5, 12, 45, 12, 3.40, 3, 4, 5, 6], 0.2, 0.8, 1.5) AS print_0; +``` + +結果: + +``` text +┌─print_0──────────────────────────────┐ +│ [0,0,0,0,0,0,0,0,0,19.5,0,0,0,0,0,0] │ +└──────────────────────────────────────┘ +``` + +## seriesPeriodDetectFFT + +FFT を用いて与えられたシリーズデータの周期を見つけます。 +FFT - [高速フーリエ変換](https://en.wikipedia.org/wiki/Fast_Fourier_transform) + +**構文** + +``` sql +seriesPeriodDetectFFT(series); +``` + +**引数** + +- `series` - 数値の配列 + +**戻り値** + +- シリーズデータの周期に等しい実数値を返します。データポイントが4つ未満の場合は NaN を返します。[Float64](../data-types/float.md). + +**例** + +クエリ: + +``` sql +SELECT seriesPeriodDetectFFT([1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6]) AS print_0; +``` + +結果: + +``` text +┌───────────print_0──────┐ +│ 3 │ +└────────────────────────┘ +``` + +``` sql +SELECT seriesPeriodDetectFFT(arrayMap(x -> abs((x % 6) - 3), range(1000))) AS print_0; +``` + +結果: + +``` text +┌─print_0─┐ +│ 6 │ +└─────────┘ +``` + +## seriesDecomposeSTL + +STL [(ローカルウエイト回帰を用いた季節トレンド分解手法)](https://www.wessa.net/download/stl.pdf) を使用してシリーズデータを季節、トレンド、および残差成分に分解します。 + +**構文** + +``` sql +seriesDecomposeSTL(series, period); +``` + +**引数** + +- `series` - 数値の配列 +- `period` - 正の整数 + +`series` には `period` の2倍以上のデータポイントがある必要があります。 + +**戻り値** + +- 4つの配列を含む配列を返します。最初の配列は季節成分、2番目の配列はトレンド、3番目の配列は残差成分、4番目の配列はベースライン(季節+トレンド)成分です。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +``` sql +SELECT seriesDecomposeSTL([10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34], 3) AS print_0; +``` + +結果: + +``` text +┌───────────print_0──────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ [[ + -13.529999, -3.1799996, 16.71, -13.53, -3.1799996, 16.71, -13.53, -3.1799996, + 16.71, -13.530001, -3.18, 16.710001, -13.530001, -3.1800003, 16.710001, -13.530001, + -3.1800003, 16.710001, -13.530001, -3.1799994, 16.71, -13.529999, -3.1799994, 16.709997 + ], + [ + 23.63, 23.63, 23.630003, 23.630001, 23.630001, 23.630001, 23.630001, 23.630001, + 23.630001, 23.630001, 23.630001, 23.63, 23.630001, 23.630001, 23.63, 23.630001, + 23.630001, 23.63, 23.630001, 23.630001, 23.630001, 23.630001, 23.630001, 23.630003 + ], + [ + 0, 0.0000019073486, -0.0000019073486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.0000019073486, 0, + 0 + ], + [ + 10.1, 20.449999, 40.340004, 10.100001, 20.45, 40.34, 10.100001, 20.45, 40.34, 10.1, 20.45, 40.34, + 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.1, 20.45, 40.34, 10.100002, 20.45, 40.34 + ]] │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/time-window-functions.md b/docs/ja/sql-reference/functions/time-window-functions.md new file mode 100644 index 00000000000..3a969a5be8b --- /dev/null +++ b/docs/ja/sql-reference/functions/time-window-functions.md @@ -0,0 +1,248 @@ +--- +slug: /ja/sql-reference/functions/time-window-functions +sidebar_position: 175 +sidebar_label: タイムウィンドウ +--- + +# Time Window Functions + +タイムウィンドウ関数は、対応するウィンドウの排他的上限と包括的下限を返します。[WindowView](../statements/create/view.md/#window-view-experimental)で作業するための関数は以下に示されます。 + +## tumble + +タンブルタイムウィンドウは、固定された期間(`interval`)で非重複かつ連続するウィンドウにレコードを割り当てます。 + +**構文** + +``` sql +tumble(time_attr, interval [, timezone]) +``` + +**引数** +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `interval` — ウィンドウの間隔 [Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +**返される値** + +- 対応するタンブルウィンドウの包括的下限と排他的上限。[Tuple](../data-types/tuple.md)([DateTime](../data-types/datetime.md), [DateTime](../data-types/datetime.md))。 + +**例** + +クエリ: + +``` sql +SELECT tumble(now(), toIntervalDay('1')); +``` + +結果: + +``` text +┌─tumble(now(), toIntervalDay('1'))─────────────┐ +│ ('2024-07-04 00:00:00','2024-07-05 00:00:00') │ +└───────────────────────────────────────────────┘ +``` + +## tumbleStart + +対応する[タンブルウィンドウ](#tumble)の包括的下限を返します。 + +**構文** + +``` sql +tumbleStart(time_attr, interval [, timezone]); +``` + +**引数** + +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `interval` — ウィンドウの間隔 [Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +上記のパラメータは[tuple](../data-types/tuple.md)としても関数に渡すことができます。 + +**返される値** + +- 対応するタンブルウィンドウの包括的下限。[DateTime](../data-types/datetime.md), [Tuple](../data-types/tuple.md)または[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT tumbleStart(now(), toIntervalDay('1')); +``` + +結果: + +```response +┌─tumbleStart(now(), toIntervalDay('1'))─┐ +│ 2024-07-04 00:00:00 │ +└────────────────────────────────────────┘ +``` + +## tumbleEnd + +対応する[タンブルウィンドウ](#tumble)の排他的上限を返します。 + +**構文** + +``` sql +tumbleEnd(time_attr, interval [, timezone]); +``` + +**引数** + +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `interval` — ウィンドウの間隔 [Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +上記のパラメータは[tuple](../data-types/tuple.md)としても関数に渡すことができます。 + +**返される値** + +- 対応するタンブルウィンドウの排他的上限。[DateTime](../data-types/datetime.md), [Tuple](../data-types/tuple.md)または[UInt32](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT tumbleEnd(now(), toIntervalDay('1')); +``` + +結果: + +```response +┌─tumbleEnd(now(), toIntervalDay('1'))─┐ +│ 2024-07-05 00:00:00 │ +└──────────────────────────────────────┘ +``` + +## hop + +ホッピングタイムウィンドウは固定された期間(`window_interval`)を持ち、指定されたホップ間隔(`hop_interval`)で移動します。`hop_interval`が`window_interval`より小さい場合、ホッピングウィンドウは重複しています。したがって、レコードは複数のウィンドウに割り当てることができます。 + +``` sql +hop(time_attr, hop_interval, window_interval [, timezone]) +``` + +**引数** + +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `hop_interval` — 正のホップ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `window_interval` — 正のウィンドウ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +**返される値** + +- 対応するホッピングウィンドウの包括的下限と排他的上限。[Tuple](../data-types/tuple.md)([DateTime](../data-types/datetime.md), [DateTime](../data-types/datetime.md))。 + +:::note +一つのレコードが複数のホップウィンドウに割り当てられるため、hop関数が`WINDOW VIEW`なしで使用されるとき、関数は**最初の**ウィンドウの境界のみを返します。 +::: + +**例** + +クエリ: + +``` sql +SELECT hop(now(), INTERVAL '1' DAY, INTERVAL '2' DAY); +``` + +結果: + +``` text +┌─hop(now(), toIntervalDay('1'), toIntervalDay('2'))─┐ +│ ('2024-07-03 00:00:00','2024-07-05 00:00:00') │ +└────────────────────────────────────────────────────┘ +``` + +## hopStart + +対応する[ホッピングウィンドウ](#hop)の包括的下限を返します。 + +**構文** + +``` sql +hopStart(time_attr, hop_interval, window_interval [, timezone]); +``` +**引数** + +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `hop_interval` — 正のホップ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `window_interval` — 正のウィンドウ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +上記のパラメータは[tuple](../data-types/tuple.md)としても関数に渡すことができます。 + +**返される値** + +- 対応するホッピングウィンドウの包括的下限。[DateTime](../data-types/datetime.md), [Tuple](../data-types/tuple.md)または[UInt32](../data-types/int-uint.md)。 + +:::note +一つのレコードが複数のホップウィンドウに割り当てられるため、hop関数が`WINDOW VIEW`なしで使用されるとき、関数は**最初の**ウィンドウの境界のみを返します。 +::: + +**例** + +クエリ: + +``` sql +SELECT hopStart(now(), INTERVAL '1' DAY, INTERVAL '2' DAY); +``` + +結果: + +``` text +┌─hopStart(now(), toIntervalDay('1'), toIntervalDay('2'))─┐ +│ 2024-07-03 00:00:00 │ +└─────────────────────────────────────────────────────────┘ +``` + +## hopEnd + +対応する[ホッピングウィンドウ](#hop)の排他的上限を返します。 + +**構文** + +``` sql +hopEnd(time_attr, hop_interval, window_interval [, timezone]); +``` +**引数** + +- `time_attr` — 日付と時間。[DateTime](../data-types/datetime.md)。 +- `hop_interval` — 正のホップ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `window_interval` — 正のウィンドウ間隔。[Interval](../data-types/special-data-types/interval.md)。 +- `timezone` — [タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。 + +上記のパラメータは[tuple](../data-types/tuple.md)としても関数に渡すことができます。 + +**返される値** + +- 対応するホッピングウィンドウの排他的上限。[DateTime](../data-types/datetime.md), [Tuple](../data-types/tuple.md)または[UInt32](../data-types/int-uint.md)。 + +:::note +一つのレコードが複数のホップウィンドウに割り当てられるため、hop関数が`WINDOW VIEW`なしで使用されるとき、関数は**最初の**ウィンドウの境界のみを返します。 +::: + +**例** + +クエリ: + +``` sql +SELECT hopEnd(now(), INTERVAL '1' DAY, INTERVAL '2' DAY); +``` + +結果: + +``` text +┌─hopEnd(now(), toIntervalDay('1'), toIntervalDay('2'))─┐ +│ 2024-07-05 00:00:00 │ +└───────────────────────────────────────────────────────┘ + +``` + +## 関連コンテンツ + +- ブログ: [ClickHouseでの時系列データの処理](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/sql-reference/functions/tuple-functions.md b/docs/ja/sql-reference/functions/tuple-functions.md new file mode 100644 index 00000000000..d9ad7f3e06f --- /dev/null +++ b/docs/ja/sql-reference/functions/tuple-functions.md @@ -0,0 +1,896 @@ +--- +slug: /ja/sql-reference/functions/tuple-functions +sidebar_position: 180 +sidebar_label: タプル +--- + +## tuple + +複数のカラムをグループ化するための関数です。 +タイプ T1, T2, ... を持つカラム C1, C2, ... に対して、それらの名前がユニークでアンコーテッド識別子として扱える場合、`Tuple(C1 T1, C2 T2, ...)` 型の名前付きタプルを返し、そうでない場合は `Tuple(T1, T2, ...)` を返します。この関数を実行する際のコストはありません。 +通常、タプルはIN演算子の引数としての中間値、またはラムダ関数の形式パラメータリストを作成するために使用されます。タプルはテーブルに書き込むことはできません。 + +この関数は演算子 `(x, y, ...)` を実装しています。 + +**構文** + +``` sql +tuple(x, y, ...) +``` + +## tupleElement + +タプルからカラムを取得するための関数です。 + +第2引数が数値 `index` の場合、それは1から始まるカラムインデックスです。第2引数が文字列 `name` の場合、それは要素の名前を表します。また、第2引数が範囲外の場合や名前に対応する要素が存在しない場合にデフォルト値を返す第3のオプション引数を指定することができます。提供された場合、第2および第3の引数は定数でなければなりません。この関数を実行するコストはありません。 + +この関数はオペレータ `x.index` および `x.name` を実装しています。 + +**構文** + +``` sql +tupleElement(tuple, index, [, default_value]) +tupleElement(tuple, name, [, default_value]) +``` + +## untuple + +[tuple](../data-types/tuple.md#tuplet1-t2)要素を呼び出し位置での文法置換を行います。 + +結果のカラムの名前は実装固有であり、変更される可能性があります。`untuple`の後に特定のカラム名を仮定しないでください。 + +**構文** + +``` sql +untuple(x) +``` + +`EXCEPT` 式を使用して、クエリの結果としてカラムをスキップすることができます。 + +**引数** + +- `x` — `tuple` 関数、カラム、または要素のタプル。[Tuple](../data-types/tuple.md)。 + +**返される値** + +- なし。 + +**例** + +入力テーブル: + +``` text +┌─key─┬─v1─┬─v2─┬─v3─┬─v4─┬─v5─┬─v6────────┐ +│ 1 │ 10 │ 20 │ 40 │ 30 │ 15 │ (33,'ab') │ +│ 2 │ 25 │ 65 │ 70 │ 40 │ 6 │ (44,'cd') │ +│ 3 │ 57 │ 30 │ 20 │ 10 │ 5 │ (55,'ef') │ +│ 4 │ 55 │ 12 │ 7 │ 80 │ 90 │ (66,'gh') │ +│ 5 │ 30 │ 50 │ 70 │ 25 │ 55 │ (77,'kl') │ +└─────┴────┴────┴────┴────┴────┴───────────┘ +``` + +`Tuple` 型カラムを `untuple` 関数のパラメータとして使用する例: + +クエリ: + +``` sql +SELECT untuple(v6) FROM kv; +``` + +結果: + +``` text +┌─_ut_1─┬─_ut_2─┐ +│ 33 │ ab │ +│ 44 │ cd │ +│ 55 │ ef │ +│ 66 │ gh │ +│ 77 │ kl │ +└───────┴───────┘ +``` + +`EXCEPT` 式の使用例: + +クエリ: + +``` sql +SELECT untuple((* EXCEPT (v2, v3),)) FROM kv; +``` + +結果: + +``` text +┌─key─┬─v1─┬─v4─┬─v5─┬─v6────────┐ +│ 1 │ 10 │ 30 │ 15 │ (33,'ab') │ +│ 2 │ 25 │ 40 │ 6 │ (44,'cd') │ +│ 3 │ 57 │ 10 │ 5 │ (55,'ef') │ +│ 4 │ 55 │ 80 │ 90 │ (66,'gh') │ +│ 5 │ 30 │ 25 │ 55 │ (77,'kl') │ +└─────┴────┴────┴────┴───────────┘ +``` + +**参照** + +- [Tuple](../data-types/tuple.md) + +## tupleHammingDistance + +2つの同サイズのタプル間の[ハミング距離](https://en.wikipedia.org/wiki/Hamming_distance)を返します。 + +**構文** + +``` sql +tupleHammingDistance(tuple1, tuple2) +``` + +**引数** + +- `tuple1` — 最初のタプル。[Tuple](../data-types/tuple.md)。 +- `tuple2` — 2つ目のタプル。[Tuple](../data-types/tuple.md)。 + +タプルは同様の型の要素を持たなければなりません。 + +**返される値** + +- ハミング距離。 + +:::note +結果タイプは[算術関数](../../sql-reference/functions/arithmetic-functions.md)の場合と同様に、入力タプルの要素数に基づいて計算されます。 +::: + +``` sql +SELECT + toTypeName(tupleHammingDistance(tuple(0), tuple(0))) AS t1, + toTypeName(tupleHammingDistance((0, 0), (0, 0))) AS t2, + toTypeName(tupleHammingDistance((0, 0, 0), (0, 0, 0))) AS t3, + toTypeName(tupleHammingDistance((0, 0, 0, 0), (0, 0, 0, 0))) AS t4, + toTypeName(tupleHammingDistance((0, 0, 0, 0, 0), (0, 0, 0, 0, 0))) AS t5 +``` + +``` text +┌─t1────┬─t2─────┬─t3─────┬─t4─────┬─t5─────┐ +│ UInt8 │ UInt16 │ UInt32 │ UInt64 │ UInt64 │ +└───────┴────────┴────────┴────────┴────────┘ +``` + +**例** + +クエリ: + +``` sql +SELECT tupleHammingDistance((1, 2, 3), (3, 2, 1)) AS HammingDistance; +``` + +結果: + +``` text +┌─HammingDistance─┐ +│ 2 │ +└─────────────────┘ +``` + +[MinHash](../../sql-reference/functions/hash-functions.md#ngramminhash) 関数と共に半重複文字列の検出に使用できます: + +``` sql +SELECT tupleHammingDistance(wordShingleMinHash(string), wordShingleMinHashCaseInsensitive(string)) AS HammingDistance +FROM (SELECT 'ClickHouse is a column-oriented database management system for online analytical processing of queries.' AS string); +``` + +結果: + +``` text +┌─HammingDistance─┐ +│ 2 │ +└─────────────────┘ +``` + +## tupleToNameValuePairs + +名前付きタプルを(名前, 値)ペアの配列に変換します。`Tuple(a T, b T, ..., c T)` に対しては、`Array(Tuple(String, T), ...)` を返します。ここで `Strings` はタプルの名前付きフィールドを表し、`T` はそれらの名前に関連付けられた値です。タプル内のすべての値は同じタイプでなければなりません。 + +**構文** + +``` sql +tupleToNameValuePairs(tuple) +``` + +**引数** + +- `tuple` — 名前付きタプル。[Tuple](../data-types/tuple.md) 型で、任意のタイプの値を持つ。 + +**返される値** + +- (名前, 値)ペアの配列。[Array](../data-types/array.md)([Tuple](../data-types/tuple.md)([String](../data-types/string.md), ...))。 + +**例** + +クエリ: + +``` sql +CREATE TABLE tupletest (col Tuple(user_ID UInt64, session_ID UInt64)) ENGINE = Memory; + +INSERT INTO tupletest VALUES (tuple( 100, 2502)), (tuple(1,100)); + +SELECT tupleToNameValuePairs(col) FROM tupletest; +``` + +結果: + +``` text +┌─tupleToNameValuePairs(col)────────────┐ +│ [('user_ID',100),('session_ID',2502)] │ +│ [('user_ID',1),('session_ID',100)] │ +└───────────────────────────────────────┘ +``` + +この関数を使用してカラムを行に変換することが可能です: + +``` sql +CREATE TABLE tupletest (col Tuple(CPU Float64, Memory Float64, Disk Float64)) ENGINE = Memory; + +INSERT INTO tupletest VALUES(tuple(3.3, 5.5, 6.6)); + +SELECT arrayJoin(tupleToNameValuePairs(col)) FROM tupletest; +``` + +結果: + +``` text +┌─arrayJoin(tupleToNameValuePairs(col))─┐ +│ ('CPU',3.3) │ +│ ('Memory',5.5) │ +│ ('Disk',6.6) │ +└───────────────────────────────────────┘ +``` + +単純なタプルを関数に渡すと、ClickHouseは値のインデックスをその名前として使用します: + +``` sql +SELECT tupleToNameValuePairs(tuple(3, 2, 1)); +``` + +結果: + +``` text +┌─tupleToNameValuePairs(tuple(3, 2, 1))─┐ +│ [('1',3),('2',2),('3',1)] │ +└───────────────────────────────────────┘ +``` + +## tupleNames + +タプルをカラム名の配列に変換します。`Tuple(a T, b T, ...)` 形式のタプルに対しては、タプルの名前付きカラムを表す文字列の配列を返します。タプルの要素に明示的な名前がない場合、そのインデックスがカラム名として使用されます。 + +**構文** + +``` sql +tupleNames(tuple) +``` + +**引数** + +- `tuple` — 名前付きタプル。[Tuple](../../sql-reference/data-types/tuple.md) 型で、任意のタイプの値を持つ。 + +**返される値** + +- 文字列の配列。 + +型: [Array](../../sql-reference/data-types/array.md)([Tuple](../../sql-reference/data-types/tuple.md)([String](../../sql-reference/data-types/string.md), ...))。 + +**例** + +クエリ: + +``` sql +CREATE TABLE tupletest (col Tuple(user_ID UInt64, session_ID UInt64)) ENGINE = Memory; + +INSERT INTO tupletest VALUES (tuple(1, 2)); + +SELECT tupleNames(col) FROM tupletest; +``` + +結果: + +``` text +┌─tupleNames(col)──────────┐ +│ ['user_ID','session_ID'] │ +└──────────────────────────┘ +``` + +単純なタプルを関数に渡すと、ClickHouseはカラムのインデックスをその名前として使用します: + +``` sql +SELECT tupleNames(tuple(3, 2, 1)); +``` + +結果: + +``` text +┌─tupleNames((3, 2, 1))─┐ +│ ['1','2','3'] │ +└───────────────────────┘ +``` + +## tuplePlus + +同サイズの2つのタプルの対応する値を足した値を計算します。 + +**構文** + +```sql +tuplePlus(tuple1, tuple2) +``` + +別名: `vectorSum`. + +**引数** + +- `tuple1` — 最初のタプル。[Tuple](../data-types/tuple.md)。 +- `tuple2` — 2つ目のタプル。[Tuple](../data-types/tuple.md)。 + +**返される値** + +- 合計のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tuplePlus((1, 2), (2, 3)); +``` + +結果: + +```text +┌─tuplePlus((1, 2), (2, 3))─┐ +│ (3,5) │ +└───────────────────────────┘ +``` + +## tupleMinus + +同サイズの2つのタプルの対応する値から引き算した値を計算します。 + +**構文** + +```sql +tupleMinus(tuple1, tuple2) +``` + +別名: `vectorDifference`. + +**引数** + +- `tuple1` — 最初のタプル。[Tuple](../data-types/tuple.md)。 +- `tuple2` — 2つ目のタプル。[Tuple](../data-types/tuple.md)。 + +**返される値** + +- 引き算の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleMinus((1, 2), (2, 3)); +``` + +結果: + +```text +┌─tupleMinus((1, 2), (2, 3))─┐ +│ (-1,-1) │ +└────────────────────────────┘ +``` + +## tupleMultiply + +同サイズの2つのタプルの対応する値の掛け算を計算します。 + +**構文** + +```sql +tupleMultiply(tuple1, tuple2) +``` + +**引数** + +- `tuple1` — 最初のタプル。[Tuple](../data-types/tuple.md)。 +- `tuple2` — 2つ目のタプル。[Tuple](../data-types/tuple.md)。 + +**返される値** + +- 掛け算の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleMultiply((1, 2), (2, 3)); +``` + +結果: + +```text +┌─tupleMultiply((1, 2), (2, 3))─┐ +│ (2,6) │ +└───────────────────────────────┘ +``` + +## tupleDivide + +同サイズの2つのタプルの対応する値の割り算を計算します。ゼロでの割り算は`inf`を返すことに注意してください。 + +**構文** + +```sql +tupleDivide(tuple1, tuple2) +``` + +**引数** + +- `tuple1` — 最初のタプル。[Tuple](../data-types/tuple.md)。 +- `tuple2` — 2つ目のタプル。[Tuple](../data-types/tuple.md)。 + +**返される値** + +- 割り算の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleDivide((1, 2), (2, 3)); +``` + +結果: + +```text +┌─tupleDivide((1, 2), (2, 3))─┐ +│ (0.5,0.6666666666666666) │ +└─────────────────────────────┘ +``` + +## tupleNegate + +タプルの値の否定を計算します。 + +**構文** + +```sql +tupleNegate(tuple) +``` + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 + +**返される値** + +- 否定の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleNegate((1, 2)); +``` + +結果: + +```text +┌─tupleNegate((1, 2))─┐ +│ (-1,-2) │ +└─────────────────────┘ +``` + +## tupleMultiplyByNumber + +全ての値を数値で掛けた結果のタプルを返します。 + +**構文** + +```sql +tupleMultiplyByNumber(tuple, number) +``` + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 +- `number` — 乗数。[Int/UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 + +**返される値** + +- 掛け算の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleMultiplyByNumber((1, 2), -2.1); +``` + +結果: + +```text +┌─tupleMultiplyByNumber((1, 2), -2.1)─┐ +│ (-2.1,-4.2) │ +└─────────────────────────────────────┘ +``` + +## tupleDivideByNumber + +全ての値を数値で割った結果のタプルを返します。ゼロでの割り算は`inf`を返すことに注意してください。 + +**構文** + +```sql +tupleDivideByNumber(tuple, number) +``` + +**引数** + +- `tuple` — [Tuple](../data-types/tuple.md)。 +- `number` — 除数。[Int/UInt](../data-types/int-uint.md), [Float](../data-types/float.md) または [Decimal](../data-types/decimal.md)。 + +**返される値** + +- 割り算の結果のタプル。[Tuple](../data-types/tuple.md)。 + +**例** + +クエリ: + +```sql +SELECT tupleDivideByNumber((1, 2), 0.5); +``` + +結果: + +```text +┌─tupleDivideByNumber((1, 2), 0.5)─┐ +│ (2,4) │ +└──────────────────────────────────┘ +``` + +## tupleConcat + +渡されたタプルを結合します。 + +``` sql +tupleConcat(tuples) +``` + +**引数** + +- `tuples` – 任意の数の[Tuple](../data-types/tuple.md) 型の引数。 + +**例** + +``` sql +SELECT tupleConcat((1, 2), (3, 4), (true, false)) AS res +``` + +``` text +┌─res──────────────────┐ +│ (1,2,3,4,true,false) │ +└──────────────────────┘ +``` + +## tupleIntDiv + +タプルの分子とタプルの除数の整数部の割り算を行い、商のタプルを返します。 + +**構文** + +```sql +tupleIntDiv(tuple_num, tuple_div) +``` + +**パラメータ** + +- `tuple_num`: 分子の値のタプル。[Tuple](../data-types/tuple) of numeric type。 +- `tuple_div`: 除数の値のタプル。[Tuple](../data-types/tuple) of numeric type。 + +**返される値** + +- `tuple_num` と `tuple_div` の商のタプル。[Tuple](../data-types/tuple) of integer values。 + +**実装の詳細** + +- `tuple_num` または `tuple_div` のいずれかが非整数値を含む場合、結果は各非整数の分子または除数を最も近い整数に丸めて計算されます。 +- ゼロ除算にはエラーがスローされます。 + +**例** + +クエリ: + +``` sql +SELECT tupleIntDiv((15, 10, 5), (5, 5, 5)); +``` + +結果: + +``` text +┌─tupleIntDiv((15, 10, 5), (5, 5, 5))─┐ +│ (3,2,1) │ +└─────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT tupleIntDiv((15, 10, 5), (5.5, 5.5, 5.5)); +``` + +結果: + +``` text +┌─tupleIntDiv((15, 10, 5), (5.5, 5.5, 5.5))─┐ +│ (2,1,0) │ +└───────────────────────────────────────────┘ +``` + +## tupleIntDivOrZero + +[tupleIntDiv](#tupleintdiv)と同様に、タプルの分子とタプルの除数の整数部の割り算を行い、商のタプルを返します。0の除数に対してエラーをスローするのではなく、商として0を返します。 + +**構文** + +```sql +tupleIntDivOrZero(tuple_num, tuple_div) +``` + +- `tuple_num`: 分子の値のタプル。 [Tuple](../data-types/tuple) of numeric type。 +- `tuple_div`: 除数の値のタプル。 [Tuple](../data-types/tuple) of numeric type。 + +**返される値** + +- `tuple_num` と `tuple_div` の商のタプル。 [Tuple](../data-types/tuple) of integer values。 +- 除数が0の場合、商として0を返します。 + +**実装の詳細** + +- `tuple_num`または`tuple_div`のいずれかが非整数値を含む場合、[tupleIntDiv](#tupleintdiv)のように、各非整数の分子または除数を最も近い整数に丸めて結果を計算します。 + +**例** + +クエリ: + +``` sql +SELECT tupleIntDivOrZero((5, 10, 15), (0, 0, 0)); +``` + +結果: + +``` text +┌─tupleIntDivOrZero((5, 10, 15), (0, 0, 0))─┐ +│ (0,0,0) │ +└───────────────────────────────────────────┘ +``` + +## tupleIntDivByNumber + +分子タプルを指定された除数で整数除算し、商のタプルを返します。 + +**構文** + +```sql +tupleIntDivByNumber(tuple_num, div) +``` + +**パラメータ** + +- `tuple_num`: 分子の値のタプル。 [Tuple](../data-types/tuple) of numeric type。 +- `div`: 除数の値。 [Numeric](../data-types/int-uint.md) type。 + +**返される値** + +- `tuple_num` と `div`の商のタプル。 [Tuple](../data-types/tuple) of integer values。 + +**実装の詳細** + +- `tuple_num`または`div`のいずれかが非整数値を含む場合、結果は各非整数の分子または除数を最も近い整数に丸めて計算されます。 +- 0での除算にはエラーがスローされます。 + +**例** + +クエリ: + +``` sql +SELECT tupleIntDivByNumber((15, 10, 5), 5); +``` + +結果: + +``` text +┌─tupleIntDivByNumber((15, 10, 5), 5)─┐ +│ (3,2,1) │ +└─────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT tupleIntDivByNumber((15.2, 10.7, 5.5), 5.8); +``` + +結果: + +``` text +┌─tupleIntDivByNumber((15.2, 10.7, 5.5), 5.8)─┐ +│ (2,1,0) │ +└─────────────────────────────────────────────┘ +``` + +## tupleIntDivOrZeroByNumber + +[tupleIntDivByNumber](#tupleintdivbynumber)と同様に、分子タプルを指定された除数で整数除算し、商のタプルを返します。0の除数に対してエラーをスローするのではなく、商として0を返します。 + +**構文** + +```sql +tupleIntDivOrZeroByNumber(tuple_num, div) +``` + +**パラメータ** + +- `tuple_num`: 分子の値のタプル。 [Tuple](../data-types/tuple) of numeric type。 +- `div`: 除数の値。 [Numeric](../data-types/int-uint.md) type。 + +**返される値** + +- `tuple_num` と `div`の商のタプル。 [Tuple](../data-types/tuple) of integer values。 +- 除数が0の場合、商として0を返します。 + +**実装の詳細** + +- `tuple_num`または`div`のいずれかが非整数値を含む場合、[tupleIntDivByNumber](#tupleintdivbynumber)のように、各非整数の分子または除数を最も近い整数に丸めて結果を計算します。 + +**例** + +クエリ: + +``` sql +SELECT tupleIntDivOrZeroByNumber((15, 10, 5), 5); +``` + +結果: + +``` text +┌─tupleIntDivOrZeroByNumber((15, 10, 5), 5)─┐ +│ (3,2,1) │ +└───────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT tupleIntDivOrZeroByNumber((15, 10, 5), 0) +``` + +結果: + +``` text +┌─tupleIntDivOrZeroByNumber((15, 10, 5), 0)─┐ +│ (0,0,0) │ +└───────────────────────────────────────────┘ +``` + +## tupleModulo + +2つのタプルの除算操作の剰余(余り)のタプルを返します。 + +**構文** + +```sql +tupleModulo(tuple_num, tuple_mod) +``` + +**パラメータ** + +- `tuple_num`: 分子の値のタプル。[Tuple](../data-types/tuple) of numeric type。 +- `tuple_div`: 剰余の値のタプル。[Tuple](../data-types/tuple) of numeric type。 + +**返される値** + +- `tuple_num` と `tuple_div`の余りのタプル。[Tuple](../data-types/tuple) of non-zero integer values。 +- ゼロでの除算にはエラーがスローされます。 + +**例** + +クエリ: + +``` sql +SELECT tupleModulo((15, 10, 5), (5, 3, 2)); +``` + +結果: + +``` text +┌─tupleModulo((15, 10, 5), (5, 3, 2))─┐ +│ (0,1,1) │ +└─────────────────────────────────────┘ +``` + +## tupleModuloByNumber + +指定された除数でタプルの除算操作の剰余(余り)のタプルを返します。 + +**構文** + +```sql +tupleModuloByNumber(tuple_num, div) +``` + +**パラメータ** + +- `tuple_num`: 分子の値のタプル。[Tuple](../data-types/tuple) of numeric type。 +- `div`: 除数の値。 [Numeric](../data-types/int-uint.md) type。 + +**返される値** + +- `tuple_num` と `div`の余りのタプル。[Tuple](../data-types/tuple) of non-zero integer values。 +- ゼロでの除算にはエラーがスローされます。 + +**例** + +クエリ: + +``` sql +SELECT tupleModuloByNumber((15, 10, 5), 2); +``` + +結果: + +``` text +┌─tupleModuloByNumber((15, 10, 5), 2)─┐ +│ (1,0,1) │ +└─────────────────────────────────────┘ +``` + +## flattenTuple + +ネストされた名前付き `input` タプルから平坦化された `output` タプルを返します。`output` タプルの要素は元の `input` タプルからのパスです。例: `Tuple(a Int, Tuple(b Int, c Int)) -> Tuple(a Int, b Int, c Int)`。`flattenTuple` を使用して、`Object` タイプからのすべてのパスを別々のカラムとして選択することができます。 + +**構文** + +```sql +flattenTuple(input) +``` + +**パラメータ** + +- `input`: 平坦化するネストされた名前付きタプル。[Tuple](../data-types/tuple)。 + +**返される値** + +- 元の `input` からのパスが要素となる `output` タプル。[Tuple](../data-types/tuple)。 + +**例** + +クエリ: + +``` sql +CREATE TABLE t_flatten_tuple(t Tuple(t1 Nested(a UInt32, s String), b UInt32, t2 Tuple(k String, v UInt32))) ENGINE = Memory; +INSERT INTO t_flatten_tuple VALUES (([(1, 'a'), (2, 'b')], 3, ('c', 4))); +SELECT flattenTuple(t) FROM t_flatten_tuple; +``` + +結果: + +``` text +┌─flattenTuple(t)───────────┐ +│ ([1,2],['a','b'],3,'c',4) │ +└───────────────────────────┘ +``` + +## 距離関数 + +すべてのサポートされている関数は[距離関数のドキュメント](../../sql-reference/functions/distance-functions.md)で説明されています。 diff --git a/docs/ja/sql-reference/functions/tuple-map-functions.md b/docs/ja/sql-reference/functions/tuple-map-functions.md new file mode 100644 index 00000000000..1d467d2433e --- /dev/null +++ b/docs/ja/sql-reference/functions/tuple-map-functions.md @@ -0,0 +1,937 @@ +--- +slug: /ja/sql-reference/functions/tuple-map-functions +sidebar_position: 120 +sidebar_label: マップ +--- + +## map + +キーと値のペアから[Map(key, value)](../data-types/map.md)型の値を作成します。 + +**構文** + +```sql +map(key1, value1[, key2, value2, ...]) +``` + +**引数** + +- `key_n` — マップエントリのキー。[Map](../data-types/map.md)のキー型としてサポートされている任意の型。 +- `value_n` — マップエントリの値。[Map](../data-types/map.md)の値型としてサポートされている任意の型。 + +**返される値** + +- `key:value`ペアを含むマップ。[Map(key, value)](../data-types/map.md)。 + +**例** + +クエリ: + +```sql +SELECT map('key1', number, 'key2', number * 2) FROM numbers(3); +``` + +結果: + +``` text +┌─map('key1', number, 'key2', multiply(number, 2))─┐ +│ {'key1':0,'key2':0} │ +│ {'key1':1,'key2':2} │ +│ {'key1':2,'key2':4} │ +└──────────────────────────────────────────────────┘ +``` + +## mapFromArrays + +キーの配列またはマップと値の配列またはマップからマップを作成します。 + +この関数は、構文 `CAST([...], 'Map(key_type, value_type)')` の便利な代替です。 +例えば、以下のように書く代わりに +- `CAST((['aa', 'bb'], [4, 5]), 'Map(String, UInt32)')`、または +- `CAST([('aa',4), ('bb',5)], 'Map(String, UInt32)')` + +`mapFromArrays(['aa', 'bb'], [4, 5])` と書くことができます。 + +**構文** + +```sql +mapFromArrays(keys, values) +``` + +別名: `MAP_FROM_ARRAYS(keys, values)` + +**引数** + +- `keys` — キーの配列またはマップ [Array](../data-types/array.md) または [Map](../data-types/map.md)。`keys`が配列の場合は、その型として `Array(Nullable(T))` または `Array(LowCardinality(Nullable(T)))` を許容しますが、NULL値は含めません。 +- `values` — 値の配列またはマップ [Array](../data-types/array.md) または [Map](../data-types/map.md)。 + +**返される値** + +- キー配列と値配列/マップから構成されたキーと値を持つマップ。 + +**例** + +クエリ: + +```sql +select mapFromArrays(['a', 'b', 'c'], [1, 2, 3]) +``` + +結果: + +``` +┌─mapFromArrays(['a', 'b', 'c'], [1, 2, 3])─┐ +│ {'a':1,'b':2,'c':3} │ +└───────────────────────────────────────────┘ +``` + +`mapFromArrays` は [Map](../data-types/map.md) 型の引数も受け入れます。これらは実行中にタプルの配列にキャストされます。 + +```sql +SELECT mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3)) +``` + +結果: + +``` +┌─mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))─┐ +│ {1:('a',1),2:('b',2),3:('c',3)} │ +└───────────────────────────────────────────────────────┘ +``` + +```sql +SELECT mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3]) +``` + +結果: + +``` +┌─mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3])─┐ +│ {('a',1):1,('b',2):2,('c',3):3} │ +└───────────────────────────────────────────────────────┘ +``` + +## extractKeyValuePairs + +キーと値のペアを含む文字列を[Map(String, String)](../data-types/map.md)に変換します。 +解析はノイズ(例: ログファイル)に対して寛容です。 +入力文字列のキーと値のペアは、キー、キーと値の区切り文字、値で構成されています。 +キーと値のペアはペア区切り文字で区切られています。 +キーと値は引用符で囲むことができます。 + +**構文** + +``` sql +extractKeyValuePairs(data[, key_value_delimiter[, pair_delimiter[, quoting_character]]]) +``` + +別名: +- `str_to_map` +- `mapFromString` + +**引数** + +- `data` - キーと値のペアを抽出するための文字列。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `key_value_delimiter` - キーと値を区切る単一文字。デフォルトは `:`。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `pair_delimiters` - ペアを区切る文字のセット。デフォルトは ` `, `,` および `;`。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 +- `quoting_character` - 引用符として使う単一文字。デフォルトは `"`。[String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- キーと値のペア。[Map(String, String)](../data-types/map.md)型 + +**例** + +クエリ + +``` sql +SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv +``` + +結果: + +``` result: +┌─kv──────────────────────────────────────────────────────────────────────┐ +│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'} │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +単一引用符 `'` を引用符として使用する場合: + +``` sql +SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv +``` + +結果: + +``` text +┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'} │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +エスケープシーケンスをサポートしない場合: + +``` sql +SELECT extractKeyValuePairs('age:a\\x0A\\n\\0') AS kv +``` + +結果: + +``` text +┌─kv─────────────────────┐ +│ {'age':'a\\x0A\\n\\0'} │ +└────────────────────────┘ +``` + +`toString`でシリアライズされたマップ文字列のキーと値のペアを復元するには: + +```sql +SELECT + map('John', '33', 'Paula', '31') AS m, + toString(m) as map_serialized, + extractKeyValuePairs(map_serialized, ':', ',', '\'') AS map_restored +FORMAT Vertical; +``` + +結果: + +``` +Row 1: +────── +m: {'John':'33','Paula':'31'} +map_serialized: {'John':'33','Paula':'31'} +map_restored: {'John':'33','Paula':'31'} +``` + +## extractKeyValuePairsWithEscaping + +`extractKeyValuePairs`と同じですが、エスケープをサポートしています。 + +サポートされているエスケープシーケンス: `\x`, `\N`, `\a`, `\b`, `\e`, `\f`, `\n`, `\r`, `\t`, `\v` および `\0`。 +非標準のエスケープシーケンスは、そのまま(バックスラッシュを含む)返されますが、以下のいずれかを除きます:`\\`, `'`, `"`, `backtick`, `/`, `=` または ASCII制御文字(c <= 31)。 + +この関数は、プリエスケープやポストエスケープが適切でないケースを満たします。例えば、以下のような入力文字列があるとします:`a: "aaaa\"bbb"`。期待される出力は:`a: aaaa\"bbbb`。 +- プリエスケープ: プリエスケープすると、`a: "aaaa"bbb"` となり、`extractKeyValuePairs` はその後 `a: aaaa` を出力します。 +- ポストエスケープ: `extractKeyValuePairs` は `a: aaaa\` を出力し、ポストエスケープはそのまま保持します。 + +キーの前のエスケープシーケンスはスキップされ、値には無効とみなされます。 + +**例** + +エスケープシーケンスに対するエスケープシーケンスサポートを有効にした場合: + +``` sql +SELECT extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') AS kv +``` + +結果: + +``` result +┌─kv────────────────┐ +│ {'age':'a\n\n\0'} │ +└───────────────────┘ +``` + +## mapAdd + +すべてのキーを収集し、対応する値を合計します。 + +**構文** + +```sql +mapAdd(arg1, arg2 [, ...]) +``` + +**引数** + +引数は2つの[配列](../data-types/array.md#data-type-array)の[タプル](../data-types/tuple.md#tuplet1-t2)または[マップ](../data-types/map.md)で、最初の配列のアイテムがキーを表し、2つ目の配列が各キーの値を含みます。すべてのキー配列は同じ型を持ち、すべての値配列は、1つの型 ([Int64](../data-types/int-uint.md#int-ranges)、[UInt64](../data-types/int-uint.md#uint-ranges) または [Float64](../data-types/float.md#float32-float64)) に昇格される項目を含む必要があります。共通の昇格型が結果配列の型として使用されます。 + +**返される値** + +- 引数に応じて、1つの[マップ](../data-types/map.md)か、ソートされたキーを含む最初の配列と、そのキーに対応する値を含む2つ目の配列を持つ[タプル](../data-types/tuple.md#tuplet1-t2)が返されます。 + +**例** + +`Map`型を使ったクエリ: + +```sql +SELECT mapAdd(map(1,1), map(1,1)); +``` + +結果: + +```text +┌─mapAdd(map(1, 1), map(1, 1))─┐ +│ {1:2} │ +└──────────────────────────────┘ +``` + +タプルを使ったクエリ: + +```sql +SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type; +``` + +結果: + +```text +┌─res───────────┬─type───────────────────────────────┐ +│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │ +└───────────────┴────────────────────────────────────┘ +``` + +## mapSubtract + +すべてのキーを収集し、対応する値を減算します。 + +**構文** + +```sql +mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...]) +``` + +**引数** + +引数は2つの[配列](../data-types/array.md#data-type-array)の[タプル](../data-types/tuple.md#tuplet1-t2)または[マップ](../data-types/map.md)で、最初の配列のアイテムがキーを表し、2つ目の配列が各キーの値を含みます。すべてのキー配列は同じ型を持ち、すべての値配列は、1つの型 ([Int64](../data-types/int-uint.md#int-ranges)、[UInt64](../data-types/int-uint.md#uint-ranges) または [Float64](../data-types/float.md#float32-float64)) に昇格される項目を含む必要があります。共通の昇格型が結果配列の型として使用されます。 + +**返される値** + +- 引数に応じて、1つの[マップ](../data-types/map.md)か、ソートされたキーを含む最初の配列と、そのキーに対応する値を含む2つ目の配列を持つ[タプル](../data-types/tuple.md#tuplet1-t2)が返されます。 + +**例** + +`Map`型を使ったクエリ: + +```sql +SELECT mapSubtract(map(1,1), map(1,1)); +``` + +結果: + +```text +┌─mapSubtract(map(1, 1), map(1, 1))─┐ +│ {1:0} │ +└───────────────────────────────────┘ +``` + +タプルマップを使ったクエリ: + +```sql +SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type; +``` + +結果: + +```text +┌─res────────────┬─type──────────────────────────────┐ +│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │ +└────────────────┴───────────────────────────────────┘ +``` + +## mapPopulateSeries + +整数キーを持つマップの欠落しているキーと値のペアを埋めます。 +最大キーを指定することで、キーを最大値を超えて拡張することをサポートします。 +具体的には、この関数はマップのキーを、最小から最大までの値(または指定された `max` 引数)に1のステップサイズで形成し、対応する値を持つマップを返します。 +値が指定されていないキーの場合は、デフォルト値が使用されます。 +キーが重複する場合は、最初の値(出現順に)だけがそのキーに関連付けられます。 + +**構文** + +```sql +mapPopulateSeries(map[, max]) +mapPopulateSeries(keys, values[, max]) +``` + +配列の引数については、`keys` と `values` の各行内の要素数は同じである必要があります。 + +**引数** + +引数は、整数キーを持つ[マップ](../data-types/map.md)または2つの[配列](../data-types/array.md#data-type-array)で、最初と2番目の配列が各キーのキーと値を含みます。 + +マップされた配列: + +- `map` — 整数キーを持つマップ。[Map](../data-types/map.md)。 + +または + +- `keys` — キーの配列。[Array](../data-types/array.md#data-type-array)([Int](../data-types/int-uint.md#uint-ranges))。 +- `values` — 値の配列。[Array](../data-types/array.md#data-type-array)([Int](../data-types/int-uint.md#uint-ranges))。 +- `max` — 最大キー値。オプション。[Int8, Int16, Int32, Int64, Int128, Int256](../data-types/int-uint.md#int-ranges)。 + +**返される値** + +- 引数に応じて、ソートされた順序にあるキーを含む[Map](../data-types/map.md)または2つの[配列](../data-types/array.md#data-type-array)を持つ[タプル](../data-types/tuple.md#tuplet1-t2): キーに対応する値を持つ。 + +**例** + +`Map`型を使ったクエリ: + +```sql +SELECT mapPopulateSeries(map(1, 10, 5, 20), 6); +``` + +結果: + +```text +┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐ +│ {1:10,2:0,3:0,4:0,5:20,6:0} │ +└─────────────────────────────────────────┘ +``` + +マップされた配列を使ったクエリ: + +```sql +SELECT mapPopulateSeries([1,2,4], [11,22,44], 5) AS res, toTypeName(res) AS type; +``` + +結果: + +```text +┌─res──────────────────────────┬─type──────────────────────────────┐ +│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │ +└──────────────────────────────┴───────────────────────────────────┘ +``` + +## mapContains + +指定されたキーが指定されたマップに含まれているかどうかを返します。 + +**構文** + +```sql +mapContains(map, key) +``` + +**引数** + +- `map` — マップ。[Map](../data-types/map.md)。 +- `key` — キー。`map` のキー型と一致する型である必要があります。 + +**返される値** + +- `map` が `key` を含む場合は `1`、含まない場合は `0`。[UInt8](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE tab (a Map(String, String)) ENGINE = Memory; + +INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'}); + +SELECT mapContains(a, 'name') FROM tab; + +``` + +結果: + +```text +┌─mapContains(a, 'name')─┐ +│ 1 │ +│ 0 │ +└────────────────────────┘ +``` + +## mapKeys + +指定されたマップのキーを返します。 + +この関数は、設定 [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) を有効にすることで最適化できます。 +設定を有効にすると、関数はマップ全体の代わりに [keys](../data-types/map.md#map-subcolumns) サブカラムのみを読み取ります。 +クエリ `SELECT mapKeys(m) FROM table` は `SELECT m.keys FROM table` に変換されます。 + +**構文** + +```sql +mapKeys(map) +``` + +**引数** + +- `map` — マップ。[Map](../data-types/map.md)。 + +**返される値** + +- `map` からすべてのキーを含む配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE tab (a Map(String, String)) ENGINE = Memory; + +INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'}); + +SELECT mapKeys(a) FROM tab; +``` + +結果: + +```text +┌─mapKeys(a)────────────┐ +│ ['name','age'] │ +│ ['number','position'] │ +└───────────────────────┘ +``` + +## mapValues + +指定されたマップの値を返します。 + +この関数は、設定 [optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns) を有効にすることで最適化できます。 +設定を有効にすると、関数はマップ全体の代わりに [values](../data-types/map.md#map-subcolumns) サブカラムのみを読み取ります。 +クエリ `SELECT mapValues(m) FROM table` は `SELECT m.values FROM table` に変換されます。 + +**構文** + +```sql +mapValues(map) +``` + +**引数** + +- `map` — マップ。[Map](../data-types/map.md)。 + +**返される値** + +- `map` からすべての値を含む配列。[Array](../data-types/array.md)。 + +**例** + +クエリ: + +```sql +CREATE TABLE tab (a Map(String, String)) ENGINE = Memory; + +INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'}); + +SELECT mapValues(a) FROM tab; +``` + +結果: + +```text +┌─mapValues(a)─────┐ +│ ['eleven','11'] │ +│ ['twelve','6.0'] │ +└──────────────────┘ +``` + +## mapContainsKeyLike + +**構文** + +```sql +mapContainsKeyLike(map, pattern) +``` + +**引数** +- `map` — マップ。[Map](../data-types/map.md)。 +- `pattern` - マッチングする文字列パターン。 + +**返される値** + +- 指定したパターンにマッチする `key` が `map` に含まれている場合は `1`、そうでない場合は `0`。 + +**例** + +クエリ: + +```sql +CREATE TABLE tab (a Map(String, String)) ENGINE = Memory; + +INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'}); + +SELECT mapContainsKeyLike(a, 'a%') FROM tab; +``` + +結果: + +```text +┌─mapContainsKeyLike(a, 'a%')─┐ +│ 1 │ +│ 0 │ +└─────────────────────────────┘ +``` + +## mapExtractKeyLike + +文字列キーを持つマップとLIKEパターンを与えると、この関数はキーがパターンと一致する要素を持つマップを返します。 + +**構文** + +```sql +mapExtractKeyLike(map, pattern) +``` + +**引数** + +- `map` — マップ。[Map](../data-types/map.md)。 +- `pattern` - マッチングする文字列パターン。 + +**返される値** + +- 指定したパターンに一致するキーを持つ要素を含むマップ。一致する要素がない場合は、空のマップが返されます。 + +**例** + +クエリ: + +```sql +CREATE TABLE tab (a Map(String, String)) ENGINE = Memory; + +INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'}); + +SELECT mapExtractKeyLike(a, 'a%') FROM tab; +``` + +結果: + +```text +┌─mapExtractKeyLike(a, 'a%')─┐ +│ {'abc':'abc'} │ +│ {} │ +└────────────────────────────┘ +``` + +## mapApply + +マップの各要素に関数を適用します。 + +**構文** + +```sql +mapApply(func, map) +``` + +**引数** + +- `func` — [ラムダ関数](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `map` — [マップ](../data-types/map.md)。 + +**返される値** + +- 各要素に `func(map1[i], ..., mapN[i])` を適用して得られるオリジナルのマップからマップを返します。 + +**例** + +クエリ: + +```sql +SELECT mapApply((k, v) -> (k, v * 10), _map) AS r +FROM +( + SELECT map('key1', number, 'key2', number * 2) AS _map + FROM numbers(3) +) +``` + +結果: + +```text +┌─r─────────────────────┐ +│ {'key1':0,'key2':0} │ +│ {'key1':10,'key2':20} │ +│ {'key1':20,'key2':40} │ +└───────────────────────┘ +``` + +## mapFilter + +マップの各要素に関数を適用してフィルタリングします。 + +**構文** + +```sql +mapFilter(func, map) +``` + +**引数** + +- `func` - [ラムダ関数](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `map` — [マップ](../data-types/map.md)。 + +**返される値** + +- `func(map1[i], ..., mapN[i])` が0以外のものを返す`map`内の要素のみを含むマップを返します。 + +**例** + +クエリ: + +```sql +SELECT mapFilter((k, v) -> ((v % 2) = 0), _map) AS r +FROM +( + SELECT map('key1', number, 'key2', number * 2) AS _map + FROM numbers(3) +) +``` + +結果: + +```text +┌─r───────────────────┐ +│ {'key1':0,'key2':0} │ +│ {'key2':2} │ +│ {'key1':2,'key2':4} │ +└─────────────────────┘ +``` + +## mapUpdate + +**構文** + +```sql +mapUpdate(map1, map2) +``` + +**引数** + +- `map1` [マップ](../data-types/map.md)。 +- `map2` [マップ](../data-types/map.md)。 + +**返される値** + +- map2の対応キーに対する値が更新されたmap1を返します。 + +**例** + +クエリ: + +```sql +SELECT mapUpdate(map('key1', 0, 'key3', 0), map('key1', 10, 'key2', 10)) AS map; +``` + +結果: + +```text +┌─map────────────────────────────┐ +│ {'key3':0,'key1':10,'key2':10} │ +└────────────────────────────────┘ +``` + +## mapConcat + +キーの等価性に基づいて複数のマップを連結します。 +同じキーを持つ要素が複数の入力マップに存在する場合、すべての要素が結果マップに追加されますが、演算子 `[]` を介してアクセスできるのは最初の要素だけです。 + +**構文** + +```sql +mapConcat(maps) +``` + +**引数** + +- `maps` – 任意の数の[マップ](../data-types/map.md)。 + +**返される値** + +- 引数として渡されたマップを連結したマップを返します。 + +**例** + +クエリ: + +```sql +SELECT mapConcat(map('key1', 1, 'key3', 3), map('key2', 2)) AS map; +``` + +結果: + +```text +┌─map──────────────────────────┐ +│ {'key1':1,'key3':3,'key2':2} │ +└──────────────────────────────┘ +``` + +クエリ: + +```sql +SELECT mapConcat(map('key1', 1, 'key2', 2), map('key1', 3)) AS map, map['key1']; +``` + +結果: + +```text +┌─map──────────────────────────┬─elem─┐ +│ {'key1':1,'key2':2,'key1':3} │ 1 │ +└──────────────────────────────┴──────┘ +``` + +## mapExists(\[func,\], map) + +`map`の少なくとも1つのキー-値のペアが存在し、`func(key, value)` が0以外を返す場合に1を返します。それ以外の場合は0を返します。 + +:::note +`mapExists` は [高次関数](../../sql-reference/functions/index.md#higher-order-functions)です。 +最初の引数としてラムダ関数を渡すことができます。 +::: + +**例** + +クエリ: + +```sql +SELECT mapExists((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res +``` + +結果: + +``` +┌─res─┐ +│ 1 │ +└─────┘ +``` + +## mapAll(\[func,\] map) + +`map`のすべてのキー-値のペアに対して`func(key, value)`が0以外を返す場合に1を返します。それ以外の場合は0を返します。 + +:::note +`mapAll` は [高次関数](../../sql-reference/functions/index.md#higher-order-functions)です。 +最初の引数としてラムダ関数を渡すことができます。 +::: + +**例** + +クエリ: + +```sql +SELECT mapAll((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res +``` + +結果: + +``` +┌─res─┐ +│ 0 │ +└─────┘ +``` + +## mapSort(\[func,\], map) + +マップの要素を昇順にソートします。 +`func` 関数が指定された場合、マップのキーと値に適用された`func`関数の結果によってソート順が決まります。 + +**例** + +``` sql +SELECT mapSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key1':3,'key2':2,'key3':1} │ +└──────────────────────────────┘ +``` + +``` sql +SELECT mapSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key3':1,'key2':2,'key1':3} │ +└──────────────────────────────┘ +``` + +詳細は `arraySort` 関数の[リファレンス](../../sql-reference/functions/array-functions.md#array_functions-sort)を参照してください。 + +## mapPartialSort + +部分的なソートを許可する `limit` 引数を追加して、昇順にマップの要素をソートします。 +`func` 関数が指定された場合、マップのキーと値に適用された`func`関数の結果によってソート順が決まります。 + +**構文** + +```sql +mapPartialSort([func,] limit, map) +``` +**引数** + +- `func` – マップのキーと値に適用するオプションの関数。[ラムダ関数](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `limit` – ソートされる要素の範囲 [1..limit]。[(U)Int](../data-types/int-uint.md)。 +- `map` – ソートするマップ。[Map](../data-types/map.md)。 + +**返される値** + +- 部分的にソートされたマップ。[Map](../data-types/map.md)。 + +**例** + +``` sql +SELECT mapPartialSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2)); +``` + +``` text +┌─mapPartialSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐ +│ {'k2':1,'k3':2,'k1':3} │ +└───────────────────────────────────────────────────────────────────────────┘ +``` + +## mapReverseSort(\[func,\], map) + +マップの要素を降順にソートします。 +`func` 関数が指定された場合、マップのキーと値に適用された`func`関数の結果によってソート順が決まります。 + +**例** + +``` sql +SELECT mapReverseSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key3':1,'key2':2,'key1':3} │ +└──────────────────────────────┘ +``` + +``` sql +SELECT mapReverseSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map; +``` + +``` text +┌─map──────────────────────────┐ +│ {'key1':3,'key2':2,'key3':1} │ +└──────────────────────────────┘ +``` + +詳細は `arrayReverseSort` 関数の[リファレンス](../../sql-reference/functions/array-functions.md#array_functions-reverse-sort)を参照してください。 + +## mapPartialReverseSort + +追加の`limit`引数を持つ部分的なソートを許可した上で、降順にマップの要素をソートします。 +`func` 関数が指定された場合、マップのキーと値に適用された`func`関数の結果によってソート順が決まります。 + +**構文** + +```sql +mapPartialReverseSort([func,] limit, map) +``` +**引数** + +- `func` – マップのキーと値に適用するオプションの関数。[ラムダ関数](../../sql-reference/functions/index.md#higher-order-functions---operator-and-lambdaparams-expr-function)。 +- `limit` – ソートされる要素の範囲 [1..limit]。[(U)Int](../data-types/int-uint.md)。 +- `map` – ソートするマップ。[Map](../data-types/map.md)。 + +**返される値** + +- 部分的にソートされたマップ。[Map](../data-types/map.md)。 + +**例** + +``` sql +SELECT mapPartialReverseSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2)); +``` + +``` text +┌─mapPartialReverseSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐ +│ {'k1':3,'k3':2,'k2':1} │ +└──────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/type-conversion-functions.md b/docs/ja/sql-reference/functions/type-conversion-functions.md new file mode 100644 index 00000000000..ac13c9bb644 --- /dev/null +++ b/docs/ja/sql-reference/functions/type-conversion-functions.md @@ -0,0 +1,7261 @@ +--- +slug: /ja/sql-reference/functions/type-conversion-functions +sidebar_position: 185 +sidebar_label: 型変換 +--- + +# 型変換関数 + +## データ変換の一般的な問題 + +ClickHouseは一般的に[C++のプログラムと同じ振る舞い](https://en.cppreference.com/w/cpp/language/implicit_conversion)をします。 + +`to` 関数と [cast](#cast) は、いくつかのケースで異なる動作をします。例えば、[LowCardinality](../data-types/lowcardinality.md) の場合:[cast](#cast) は [LowCardinality](../data-types/lowcardinality.md)特性を削除しますが、`to` 関数はしません。同様に [Nullable](../data-types/nullable.md) の場合、この動作はSQL標準とは互換性がなく、[cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable)設定を使用して変更可能です。 + +:::note +データ型の値が小さいデータ型(例:`Int64` から `Int32` )に変換される場合や、互換性のないデータ型(例:`String` から `Int` )の間での変換では、データロスの可能性があることに注意してください。結果が期待した通りであるかを注意深く確認してください。 +::: + +例: + +```sql +SELECT + toTypeName(toLowCardinality('') AS val) AS source_type, + toTypeName(toString(val)) AS to_type_result_type, + toTypeName(CAST(val, 'String')) AS cast_result_type + +┌─source_type────────────┬─to_type_result_type────┬─cast_result_type─┐ +│ LowCardinality(String) │ LowCardinality(String) │ String │ +└────────────────────────┴────────────────────────┴──────────────────┘ + +SELECT + toTypeName(toNullable('') AS val) AS source_type, + toTypeName(toString(val)) AS to_type_result_type, + toTypeName(CAST(val, 'String')) AS cast_result_type + +┌─source_type──────┬─to_type_result_type─┬─cast_result_type─┐ +│ Nullable(String) │ Nullable(String) │ String │ +└──────────────────┴─────────────────────┴──────────────────┘ + +SELECT + toTypeName(toNullable('') AS val) AS source_type, + toTypeName(toString(val)) AS to_type_result_type, + toTypeName(CAST(val, 'String')) AS cast_result_type +SETTINGS cast_keep_nullable = 1 + +┌─source_type──────┬─to_type_result_type─┬─cast_result_type─┐ +│ Nullable(String) │ Nullable(String) │ Nullable(String) │ +└──────────────────┴─────────────────────┴──────────────────┘ +``` + +## toBool + +入力値を[`Bool`](../data-types/boolean.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toBool(expr) +``` + +**引数** + +- `expr` — 数値または文字列を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値。 +- Float32/64 型の値。 +- 文字列 `true` または `false`(大文字小文字を区別しない)。 + +**返される値** + +- 引数の評価に基づいて `true` または `false` を返します。[Bool](../data-types/boolean.md)。 + +**例** + +クエリ: + +```sql +SELECT + toBool(toUInt8(1)), + toBool(toInt8(-1)), + toBool(toFloat32(1.01)), + toBool('true'), + toBool('false'), + toBool('FALSE') +FORMAT Vertical +``` + +結果: + +```response +toBool(toUInt8(1)): true +toBool(toInt8(-1)): true +toBool(toFloat32(1.01)): true +toBool('true'): true +toBool('false'): false +toBool('FALSE'): false +``` + +## toInt8 + +入力値を[`Int8`](../data-types/int-uint.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toInt8(expr) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値またはその文字列表現。 +- Float32/64 型の値。 + +サポートされない引数: +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt8('0xc0fe');`。 + +:::note +入力値が[Int8](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +例:`SELECT toInt8(128) == -128;`。 +::: + +**返される値** + +- 8ビット整数値。[Int8](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt8(-8), + toInt8(-8.8), + toInt8('-8') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt8(-8): -8 +toInt8(-8.8): -8 +toInt8('-8'): -8 +``` + +**参照** + +- [`toInt8OrZero`](#toint8orzero). +- [`toInt8OrNull`](#toint8ornull). +- [`toInt8OrDefault`](#toint8ordefault). + +## toInt8OrZero + +[`toInt8`](#toint8)のように、この関数は入力値を[Int8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt8OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`0`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt8OrZero('0xc0fe');`。 + +:::note +入力値が[Int8](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 8ビット整数値として成功すれば返され、そうでなければ`0`。[Int8](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt8OrZero('-8'), + toInt8OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt8OrZero('-8'): -8 +toInt8OrZero('abc'): 0 +``` + +**参照** + +- [`toInt8`](#toint8). +- [`toInt8OrNull`](#toint8ornull). +- [`toInt8OrDefault`](#toint8ordefault). + +## toInt8OrNull + +[`toInt8`](#toint8)のように、この関数は入力値を[Int8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt8OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`\N`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt8OrNull('0xc0fe');`。 + +:::note +入力値が[Int8](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 8ビット整数値として成功すれば返され、そうでなければ`NULL`。[Int8](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt8OrNull('-8'), + toInt8OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt8OrNull('-8'): -8 +toInt8OrNull('abc'): ᴺᵁᴸᴸ +``` + +**参照** + +- [`toInt8`](#toint8). +- [`toInt8OrZero`](#toint8orzero). +- [`toInt8OrDefault`](#toint8ordefault). + +## toInt8OrDefault + +[`toInt8`](#toint8)のように、この関数は入力値を[Int8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が渡されない場合、エラーの場合には`0`が返されます。 + +**構文** + +```sql +toInt8OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md)。 +- `default` (オプション) — `Int8`型への解析が失敗した場合に返されるデフォルト値。[Int8](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 の値またはその文字列表現。 +- Float32/64 の値。 + +デフォルト値を返す引数: +- NaN や Inf を含む Float32/64 の文字列表現。 +- バイナリおよび16進数の文字列表現。例:`SELECT toInt8OrDefault('0xc0fe', CAST('-1', 'Int8'));`。 + +:::note +入力値が[Int8](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 8ビット整数値として成功すれば返され、そうでなければデフォルト値が返され(デフォルト値が渡されない場合は`0`が返されます)。[Int8](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +- デフォルト値の型は変換先の型と同じである必要があります。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt8OrDefault('-8', CAST('-1', 'Int8')), + toInt8OrDefault('abc', CAST('-1', 'Int8')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt8OrDefault('-8', CAST('-1', 'Int8')): -8 +toInt8OrDefault('abc', CAST('-1', 'Int8')): -1 +``` + +**参照** + +- [`toInt8`](#toint8). +- [`toInt8OrZero`](#toint8orzero). +- [`toInt8OrNull`](#toint8ornull). + +## toInt16 + +入力値を[`Int16`](../data-types/int-uint.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toInt16(expr) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値またはその文字列表現。 +- Float32/64 型の値。 + +サポートされない引数: +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt16('0xc0fe');`。 + +:::note +入力値が[Int16](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +例:`SELECT toInt16(32768) == -32768;`。 +::: + +**返される値** + +- 16ビット整数値。[Int16](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt16(-16), + toInt16(-16.16), + toInt16('-16') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt16(-16): -16 +toInt16(-16.16): -16 +toInt16('-16'): -16 +``` + +**参照** + +- [`toInt16OrZero`](#toint16orzero). +- [`toInt16OrNull`](#toint16ornull). +- [`toInt16OrDefault`](#toint16ordefault). + +## toInt16OrZero + +[`toInt16`](#toint16)のように、この関数は入力値を[Int16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt16OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`0`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt16OrZero('0xc0fe');`。 + +:::note +入力値が[Int16](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとしては見なされません。 +::: + +**返される値** + +- 16ビット整数値として成功すれば返され、そうでなければ`0`。[Int16](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt16OrZero('-16'), + toInt16OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt16OrZero('-16'): -16 +toInt16OrZero('abc'): 0 +``` + +**参照** + +- [`toInt16`](#toint16). +- [`toInt16OrNull`](#toint16ornull). +- [`toInt16OrDefault`](#toint16ordefault). + +## toInt16OrNull + +[`toInt16`](#toint16)のように、この関数は入力値を[Int16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt16OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`\N`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt16OrNull('0xc0fe');`。 + +:::note +入力値が[Int16](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 16ビット整数値として成功すれば返され、そうでなければ`NULL`。[Int16](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt16OrNull('-16'), + toInt16OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt16OrNull('-16'): -16 +toInt16OrNull('abc'): ᴺᵁᴸᴸ +``` + +**参照** + +- [`toInt16`](#toint16). +- [`toInt16OrZero`](#toint16orzero). +- [`toInt16OrDefault`](#toint16ordefault). + +## toInt16OrDefault + +[`toInt16`](#toint16)のように、この関数は入力値を[Int16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が渡されない場合、エラーの場合には`0`が返されます。 + +**構文** + +```sql +toInt16OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md)。 +- `default` (オプション) — `Int16`型への解析が失敗した場合に返されるデフォルト値。[Int16](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 の値またはその文字列表現。 +- Float32/64 の値。 + +デフォルト値を返す引数: +- NaN や Inf を含む Float32/64 の文字列表現。 +- バイナリおよび16進数の文字列表現。例:`SELECT toInt16OrDefault('0xc0fe', CAST('-1', 'Int16'));`。 + +:::note +入力値が[Int16](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 16ビット整数値として成功すれば返され、そうでなければデフォルト値が返され(デフォルト値が渡されない場合は`0`が返されます)。[Int16](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +- デフォルト値の型は変換先の型と同じである必要があります。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt16OrDefault('-16', CAST('-1', 'Int16')), + toInt16OrDefault('abc', CAST('-1', 'Int16')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt16OrDefault('-16', CAST('-1', 'Int16')): -16 +toInt16OrDefault('abc', CAST('-1', 'Int16')): -1 +``` + +**参照** + +- [`toInt16`](#toint16). +- [`toInt16OrZero`](#toint16orzero). +- [`toInt16OrNull`](#toint16ornull). + +## toInt32 + +入力値を[`Int32`](../data-types/int-uint.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toInt32(expr) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値またはその文字列表現。 +- Float32/64 型の値。 + +サポートされない引数: +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt32('0xc0fe');`。 + +:::note +入力値が[Int32](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +例:`SELECT toInt32(2147483648) == -2147483648;` +::: + +**返される値** + +- 32ビット整数値。[Int32](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt32(-32), + toInt32(-32.32), + toInt32('-32') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt32(-32): -32 +toInt32(-32.32): -32 +toInt32('-32'): -32 +``` + +**参照** + +- [`toInt32OrZero`](#toint32orzero). +- [`toInt32OrNull`](#toint32ornull). +- [`toInt32OrDefault`](#toint32ordefault). + +## toInt32OrZero + +[`toInt32`](#toint32)のように、この関数は入力値を[Int32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt32OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`0`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt32OrZero('0xc0fe');`。 + +:::note +入力値が[Int32](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 32ビット整数値として成功すれば返され、そうでなければ`0`。[Int32](../data-types/int-uint.md) + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt32OrZero('-32'), + toInt32OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt32OrZero('-32'): -32 +toInt32OrZero('abc'): 0 +``` +**参照** + +- [`toInt32`](#toint32). +- [`toInt32OrNull`](#toint32ornull). +- [`toInt32OrDefault`](#toint32ordefault). + +## toInt32OrNull + +[`toInt32`](#toint32)のように、この関数は入力値を[Int32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt32OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`\N`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt32OrNull('0xc0fe');`。 + +:::note +入力値が[Int32](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 32ビット整数値として成功すれば返され、そうでなければ`NULL`。[Int32](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt32OrNull('-32'), + toInt32OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt32OrNull('-32'): -32 +toInt32OrNull('abc'): ᴺᵁᴸᴸ +``` + +**参照** + +- [`toInt32`](#toint32). +- [`toInt32OrZero`](#toint32orzero). +- [`toInt32OrDefault`](#toint32ordefault). + +## toInt32OrDefault + +[`toInt32`](#toint32)のように、この関数は入力値を[Int32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が渡されない場合、エラーの場合には`0`が返されます。 + +**構文** + +```sql +toInt32OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md)。 +- `default` (オプション) — `Int32`型への解析が失敗した場合に返されるデフォルト値。[Int32](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 の値またはその文字列表現。 +- Float32/64 の値。 + +デフォルト値を返す引数: +- NaN や Inf を含む Float32/64 の文字列表現。 +- バイナリおよび16進数の文字列表現。例:`SELECT toInt32OrDefault('0xc0fe', CAST('-1', 'Int32'));`。 + +:::note +入力値が[Int32](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 32ビット整数値として成功すれば返され、そうでなければデフォルト値が返され(デフォルト値が渡されない場合は`0`が返されます)。[Int32](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +- デフォルト値の型は変換先の型と同じである必要があります。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt32OrDefault('-32', CAST('-1', 'Int32')), + toInt32OrDefault('abc', CAST('-1', 'Int32')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt32OrDefault('-32', CAST('-1', 'Int32')): -32 +toInt32OrDefault('abc', CAST('-1', 'Int32')): -1 +``` + +**参照** + +- [`toInt32`](#toint32). +- [`toInt32OrZero`](#toint32orzero). +- [`toInt32OrNull`](#toint32ornull). + +## toInt64 + +入力値を[`Int64`](../data-types/int-uint.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toInt64(expr) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値またはその文字列表現。 +- Float32/64 型の値。 + +サポートされないタイプ: +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt64('0xc0fe');`。 + +:::note +入力値が[Int64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとしては見なされません。 +例:`SELECT toInt64(9223372036854775808) == -9223372036854775808;` +::: + +**返される値** + +- 64ビット整数値。[Int64](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt64(-64), + toInt64(-64.64), + toInt64('-64') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt64(-64): -64 +toInt64(-64.64): -64 +toInt64('-64'): -64 +``` + +**参照** + +- [`toInt64OrZero`](#toint64orzero). +- [`toInt64OrNull`](#toint64ornull). +- [`toInt64OrDefault`](#toint64ordefault). + +## toInt64OrZero + +[`toInt64`](#toint64)のように、この関数は入力値を[Int64](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt64OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`0`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt64OrZero('0xc0fe');`。 + +:::note +入力値が[Int64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとしては見なされません。 +::: + +**返される値** + +- 64ビット整数値として成功すれば返され、そうでなければ`0`。[Int64](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt64OrZero('-64'), + toInt64OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt64OrZero('-64'): -64 +toInt64OrZero('abc'): 0 +``` + +**参照** + +- [`toInt64`](#toint64). +- [`toInt64OrNull`](#toint64ornull). +- [`toInt64OrDefault`](#toint64ordefault). + +## toInt64OrNull + +[`toInt64`](#toint64)のように、この関数は入力値を[Int64](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt64OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md)。 + +サポートされる引数: +- (U)Int8/16/32/128/256 の文字列表現。 + +サポートされない引数(`\N`を返す): +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt64OrNull('0xc0fe');`。 + +:::note +入力値が[Int64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 64ビット整数値として成功すれば返され、そうでなければ`NULL`。[Int64](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt64OrNull('-64'), + toInt64OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt64OrNull('-64'): -64 +toInt64OrNull('abc'): ᴺᵁᴸᴸ +``` + +**参照** + +- [`toInt64`](#toint64). +- [`toInt64OrZero`](#toint64orzero). +- [`toInt64OrDefault`](#toint64ordefault). + +## toInt64OrDefault + +[`toInt64`](#toint64)のように、この関数は入力値を[Int64](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が渡されない場合、エラーの場合には`0`が返されます。 + +**構文** + +```sql +toInt64OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md)。 +- `default` (オプション) — `Int64`型への解析が失敗した場合に返されるデフォルト値。[Int64](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 の値またはその文字列表現。 +- Float32/64 の値。 + +デフォルト値を返す引数: +- NaN や Inf を含む Float32/64 の文字列表現。 +- バイナリおよび16進数の文字列表現。例:`SELECT toInt64OrDefault('0xc0fe', CAST('-1', 'Int64'));`。 + +:::note +入力値が[Int64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 64ビット整数値として成功すれば返され、そうでなければデフォルト値が返され(デフォルト値が渡されない場合は`0`が返されます)。[Int64](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +- デフォルト値の型は変換先の型と同じである必要があります。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt64OrDefault('-64', CAST('-1', 'Int64')), + toInt64OrDefault('abc', CAST('-1', 'Int64')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt64OrDefault('-64', CAST('-1', 'Int64')): -64 +toInt64OrDefault('abc', CAST('-1', 'Int64')): -1 +``` + +**参照** + +- [`toInt64`](#toint64). +- [`toInt64OrZero`](#toint64orzero). +- [`toInt64OrNull`](#toint64ornull). + +## toInt128 + +入力値を[`Int128`](../data-types/int-uint.md)型の値に変換します。エラーが発生した場合は例外を投げます。 + +**構文** + +```sql +toInt128(expr) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[式](../syntax.md/#syntax-expressions)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256 型の値またはその文字列表現。 +- Float32/64 型の値。 + +サポートされない引数: +- NaN や Inf を含む Float32/64 値の文字列表現。 +- バイナリおよび16進数値の文字列表現。例:`SELECT toInt128('0xc0fe');`。 + +:::note +入力値が[Int128](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとしては見なされません。 +::: + +**返される値** + +- 128ビット整数値。[Int128](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用します。これは、数値の小数桁を切り捨てることを意味します。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt128(-128), + toInt128(-128.8), + toInt128('-128') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt128(-128): -128 +toInt128(-128.8): -128 +toInt128('-128'): -128 +``` + +**参照** + +- [`toInt128OrZero`](#toint128orzero). +- [`toInt128OrNull`](#toint128ornull). +- [`toInt128OrDefault`](#toint128ordefault). + +## toInt128OrZero + +[`toInt128`](#toint128)のように、この関数は入力値を[Int128](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt128OrZero(expr) +``` + +**引数** + + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`0`を返す): +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt128OrZero('0xc0fe');`。 + +:::note +入力値が[Int128](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば128ビット整数値、それ以外の場合は`0`。[Int128](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt128OrZero('-128'), + toInt128OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt128OrZero('-128'): -128 +toInt128OrZero('abc'): 0 +``` + +**関連項目** + +- [`toInt128`](#toint128). +- [`toInt128OrNull`](#toint128ornull). +- [`toInt128OrDefault`](#toint128ordefault). + +## toInt128OrNull + +[`toInt128`](#toint128)と同様に、この関数は入力値を[Int128](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt128OrNull(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`\N`を返す) +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt128OrNull('0xc0fe');`。 + +:::note +入力値が[Int128](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば128ビット整数値、それ以外の場合は`NULL`。[Int128](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt128OrNull('-128'), + toInt128OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt128OrNull('-128'): -128 +toInt128OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toInt128`](#toint128). +- [`toInt128OrZero`](#toint128orzero). +- [`toInt128OrDefault`](#toint128ordefault). + +## toInt128OrDefault + +[`toInt128`](#toint128)と同様に、この関数は入力値を[Int128](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +`default`値が指定されていない場合は、エラー時に`0`を返します。 + +**構文** + +```sql +toInt128OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). +- `default`(オプション)— 型`Int128`への解析が成功しなかった場合に返すデフォルト値。[Int128](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256。 +- Float32/64。 +- (U)Int8/16/32/128/256の文字列表現。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt128OrDefault('0xc0fe', CAST('-1', 'Int128'));`。 + +:::note +入力値が[Int128](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば128ビット整数値、それ以外の場合はデフォルト値を指定した場合それを返し、指定していない場合は`0`を返します。[Int128](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +- デフォルト値の型はキャストする型と同じであるべきです。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt128OrDefault('-128', CAST('-1', 'Int128')), + toInt128OrDefault('abc', CAST('-1', 'Int128')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt128OrDefault('-128', CAST('-1', 'Int128')): -128 +toInt128OrDefault('abc', CAST('-1', 'Int128')): -1 +``` + +**関連項目** + +- [`toInt128`](#toint128). +- [`toInt128OrZero`](#toint128orzero). +- [`toInt128OrNull`](#toint128ornull). + +## toInt256 + +入力値を[`Int256`](../data-types/int-uint.md)型の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toInt256(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされない引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt256('0xc0fe');`。 + +:::note +入力値が[Int256](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 256ビット整数値。[Int256](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toInt256(-256), + toInt256(-256.256), + toInt256('-256') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt256(-256): -256 +toInt256(-256.256): -256 +toInt256('-256'): -256 +``` + +**関連項目** + +- [`toInt256OrZero`](#toint256orzero). +- [`toInt256OrNull`](#toint256ornull). +- [`toInt256OrDefault`](#toint256ordefault). + +## toInt256OrZero + +[`toInt256`](#toint256)と同様に、この関数は入力値を[Int256](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toInt256OrZero(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`0`を返す): +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt256OrZero('0xc0fe');`。 + +:::note +入力値が[Int256](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば256ビット整数値、それ以外の場合は`0`。[Int256](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt256OrZero('-256'), + toInt256OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt256OrZero('-256'): -256 +toInt256OrZero('abc'): 0 +``` + +**関連項目** + +- [`toInt256`](#toint256). +- [`toInt256OrNull`](#toint256ornull). +- [`toInt256OrDefault`](#toint256ordefault). + +## toInt256OrNull + +[`toInt256`](#toint256)と同様に、この関数は入力値を[Int256](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toInt256OrNull(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`\N`を返す) +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toInt256OrNull('0xc0fe');`。 + +:::note +入力値が[Int256](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば256ビット整数値、それ以外の場合は`NULL`。[Int256](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt256OrNull('-256'), + toInt256OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt256OrNull('-256'): -256 +toInt256OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toInt256`](#toint256). +- [`toInt256OrZero`](#toint256orzero). +- [`toInt256OrDefault`](#toint256ordefault). + +## toInt256OrDefault + +[`toInt256`](#toint256)と同様に、この関数は入力値を[Int256](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +`default`値が指定されていない場合は、エラー時に`0`を返します。 + +**構文** + +```sql +toInt256OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). +- `default`(オプション)— 型`Int256`への解析が成功しなかった場合に返すデフォルト値。[Int256](../data-types/int-uint.md). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む) +- バイナリおよび16進数の文字列表現、例: `SELECT toInt256OrDefault('0xc0fe', CAST('-1', 'Int256'));` + +:::note +入力値が[Int256](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば256ビット整数値、それ以外の場合はデフォルト値を指定した場合それを返し、指定していない場合は`0`を返します。[Int256](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +- デフォルト値の型はキャストする型と同じであるべきです。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toInt256OrDefault('-256', CAST('-1', 'Int256')), + toInt256OrDefault('abc', CAST('-1', 'Int256')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toInt256OrDefault('-256', CAST('-1', 'Int256')): -256 +toInt256OrDefault('abc', CAST('-1', 'Int256')): -1 +``` + +**関連項目** + +- [`toInt256`](#toint256). +- [`toInt256OrZero`](#toint256orzero). +- [`toInt256OrNull`](#toint256ornull). + +## toUInt8 + +入力値を[`UInt8`](../data-types/int-uint.md)型の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt8(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされない引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt8('0xc0fe');`。 + +:::note +入力値が[UInt8](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +例: `SELECT toUInt8(256) == 0;`。 +::: + +**返される値** + +- 8ビット符号なし整数値。[UInt8](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt8(8), + toUInt8(8.8), + toUInt8('8') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt8(8): 8 +toUInt8(8.8): 8 +toUInt8('8'): 8 +``` + +**関連項目** + +- [`toUInt8OrZero`](#touint8orzero). +- [`toUInt8OrNull`](#touint8ornull). +- [`toUInt8OrDefault`](#touint8ordefault). + +## toUInt8OrZero + +[`toUInt8`](#touint8)と同様に、この関数は入力値を[UInt8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt8OrZero(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`0`を返す): +- 通常のFloat32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt8OrZero('0xc0fe');`。 + +:::note +入力値が[UInt8](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば8ビット符号なし整数値、それ以外の場合は`0`。[UInt8](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt8OrZero('-8'), + toUInt8OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt8OrZero('-8'): 0 +toUInt8OrZero('abc'): 0 +``` + +**関連項目** + +- [`toUInt8`](#touint8). +- [`toUInt8OrNull`](#touint8ornull). +- [`toUInt8OrDefault`](#touint8ordefault). + +## toUInt8OrNull + +[`toUInt8`](#touint8)と同様に、この関数は入力値を[UInt8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt8OrNull(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`\N`を返す) +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt8OrNull('0xc0fe');`。 + +:::note +入力値が[UInt8](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば8ビット符号なし整数値、それ以外の場合は`NULL`。[UInt8](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt8OrNull('8'), + toUInt8OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt8OrNull('8'): 8 +toUInt8OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt8`](#touint8). +- [`toUInt8OrZero`](#touint8orzero). +- [`toUInt8OrDefault`](#touint8ordefault). + +## toUInt8OrDefault + +[`toUInt8`](#touint8)と同様に、この関数は入力値を[UInt8](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +`default`値が指定されていない場合は、エラー時に`0`を返します。 + +**構文** + +```sql +toUInt8OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). +- `default`(オプション)— 型`UInt8`への解析が成功しなかった場合に返すデフォルト値。[UInt8](../data-types/int-uint.md). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt8OrDefault('0xc0fe', CAST('0', 'UInt8'));`。 + +:::note +入力値が[UInt8](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば8ビット符号なし整数値、それ以外の場合はデフォルト値を指定した場合それを返し、指定していない場合は`0`を返します。[UInt8](../data-types/int-uint.md). + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +- デフォルト値の型はキャストする型と同じであるべきです。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt8OrDefault('8', CAST('0', 'UInt8')), + toUInt8OrDefault('abc', CAST('0', 'UInt8')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt8OrDefault('8', CAST('0', 'UInt8')): 8 +toUInt8OrDefault('abc', CAST('0', 'UInt8')): 0 +``` + +**関連項目** + +- [`toUInt8`](#touint8). +- [`toUInt8OrZero`](#touint8orzero). +- [`toUInt8OrNull`](#touint8ornull). + +## toUInt16 + +入力値を[`UInt16`](../data-types/int-uint.md)型の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt16(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされない引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt16('0xc0fe');`。 + +:::note +入力値が[UInt16](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +例: `SELECT toUInt16(65536) == 0;`。 +::: + +**返される値** + +- 16ビット符号なし整数値。[UInt16](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt16(16), + toUInt16(16.16), + toUInt16('16') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt16(16): 16 +toUInt16(16.16): 16 +toUInt16('16'): 16 +``` + +**関連項目** + +- [`toUInt16OrZero`](#touint16orzero). +- [`toUInt16OrNull`](#touint16ornull). +- [`toUInt16OrDefault`](#touint16ordefault). + +## toUInt16OrZero + +[`toUInt16`](#touint16)と同様に、この関数は入力値を[UInt16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt16OrZero(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`0`を返す): +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt16OrZero('0xc0fe');`。 + +:::note +入力値が[UInt16](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば16ビット符号なし整数値、それ以外の場合は`0`。[UInt16](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt16OrZero('16'), + toUInt16OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt16OrZero('16'): 16 +toUInt16OrZero('abc'): 0 +``` + +**関連項目** + +- [`toUInt16`](#touint16). +- [`toUInt16OrNull`](#touint16ornull). +- [`toUInt16OrDefault`](#touint16ordefault). + +## toUInt16OrNull + +[`toUInt16`](#touint16)と同様に、この関数は入力値を[UInt16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt16OrNull(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`\N`を返す) +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt16OrNull('0xc0fe');`。 + +:::note +入力値が[UInt16](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば16ビット符号なし整数値、それ以外の場合は`NULL`。[UInt16](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt16OrNull('16'), + toUInt16OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt16OrNull('16'): 16 +toUInt16OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt16`](#touint16). +- [`toUInt16OrZero`](#touint16orzero). +- [`toUInt16OrDefault`](#touint16ordefault). + +## toUInt16OrDefault + +[`toUInt16`](#touint16)と同様に、この関数は入力値を[UInt16](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +`default`値が指定されていない場合は、エラー時に`0`を返します。 + +**構文** + +```sql +toUInt16OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). +- `default`(オプション)— 型`UInt16`への解析が成功しなかった場合に返すデフォルト値。[UInt16](../data-types/int-uint.md). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt16OrDefault('0xc0fe', CAST('0', 'UInt16'));`。 + +:::note +入力値が[UInt16](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば16ビット符号なし整数値、それ以外の場合はデフォルト値を指定した場合それを返し、指定していない場合は`0`を返します。[UInt16](../data-types/int-uint.md). + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +- デフォルト値の型はキャストする型と同じであるべきです。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt16OrDefault('16', CAST('0', 'UInt16')), + toUInt16OrDefault('abc', CAST('0', 'UInt16')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt16OrDefault('16', CAST('0', 'UInt16')): 16 +toUInt16OrDefault('abc', CAST('0', 'UInt16')): 0 +``` + +**関連項目** + +- [`toUInt16`](#touint16). +- [`toUInt16OrZero`](#touint16orzero). +- [`toUInt16OrNull`](#touint16ornull). + +## toUInt32 + +入力値を[`UInt32`](../data-types/int-uint.md)型の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt32(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされない引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt32('0xc0fe');`。 + +:::note +入力値が[UInt32](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +例: `SELECT toUInt32(4294967296) == 0;` +::: + +**返される値** + +- 32ビット符号なし整数値。[UInt32](../data-types/int-uint.md)。 + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt32(32), + toUInt32(32.32), + toUInt32('32') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt32(32): 32 +toUInt32(32.32): 32 +toUInt32('32'): 32 +``` + +**関連項目** + +- [`toUInt32OrZero`](#touint32orzero). +- [`toUInt32OrNull`](#touint32ornull). +- [`toUInt32OrDefault`](#touint32ordefault). + +## toUInt32OrZero + +[`toUInt32`](#touint32)と同様に、この関数は入力値を[UInt32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt32OrZero(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`0`を返す): +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt32OrZero('0xc0fe');`。 + +:::note +入力値が[UInt32](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば32ビット符号なし整数値、それ以外の場合は`0`。[UInt32](../data-types/int-uint.md) + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt32OrZero('32'), + toUInt32OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt32OrZero('32'): 32 +toUInt32OrZero('abc'): 0 +``` +**関連項目** + +- [`toUInt32`](#touint32). +- [`toUInt32OrNull`](#touint32ornull). +- [`toUInt32OrDefault`](#touint32ordefault). + +## toUInt32OrNull + +[`toUInt32`](#touint32)と同様に、この関数は入力値を[UInt32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt32OrNull(x) +``` + +**引数** + +- `x` — 数値の文字列表現。[文字列](../data-types/string.md). + +サポートされる引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされない引数(`\N`を返す) +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt32OrNull('0xc0fe');`。 + +:::note +入力値が[UInt32](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば32ビット符号なし整数値、それ以外の場合は`NULL`。[UInt32](../data-types/int-uint.md) / [NULL](../data-types/nullable.md). + +:::note +この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt32OrNull('32'), + toUInt32OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt32OrNull('32'): 32 +toUInt32OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt32`](#touint32). +- [`toUInt32OrZero`](#touint32orzero). +- [`toUInt32OrDefault`](#touint32ordefault). + +## toUInt32OrDefault + +[`toUInt32`](#touint32)と同様に、この関数は入力値を[UInt32](../data-types/int-uint.md)型の値に変換しますが、エラーの場合はデフォルト値を返します。 +`default`値が指定されていない場合は、エラー時に`0`を返します。 + +**構文** + +```sql +toUInt32OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[式](../syntax.md/#syntax-expressions) / [文字列](../data-types/string.md). +- `default`(オプション)— 型`UInt32`への解析が成功しなかった場合に返すデフォルト値。[UInt32](../data-types/int-uint.md). + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現(`NaN`および`Inf`を含む)。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt32OrDefault('0xc0fe', CAST('0', 'UInt32'));`. + +:::note +入力値が[UInt32](../data-types/int-uint.md)の範囲内で表現できない場合、結果のオーバーフローまたはアンダーフローが発生します。 +これはエラーとは見なされません。 +::: + +**返される値** + +- 成功すれば32ビット符号なし整数値、それ以外の場合はデフォルト値を指定した場合それを返し、指定していない場合は`0`を返します。[UInt32](../data-types/int-uint.md)。 + +:::note +- この関数は[ゼロへの丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用し、数値の小数点以下の桁を切り捨てます。 +- デフォルト値の型はキャストする型と同じであるべきです。 +::: + +**例** + +クエリ: + +``` sql +SELECT + toUInt32OrDefault('32', CAST('0', 'UInt32')), + toUInt32OrDefault('abc', CAST('0', 'UInt32')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt32OrDefault('32', CAST('0', 'UInt32')): 32 +toUInt32OrDefault('abc', CAST('0', 'UInt32')): 0 +``` + +**関連項目** + +- [`toUInt32`](#touint32). +- [`toUInt32OrZero`](#touint32orzero). +- [`toUInt32OrNull`](#touint32ornull). + +## toUInt64 + +入力値を型[`UInt64`](../data-types/int-uint.md)の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt64(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされていない型: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt64('0xc0fe');`。 + +:::note +入力値が[UInt64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +例: `SELECT toUInt64(18446744073709551616) == 0;` +::: + +**返される値** + +- 64ビットの符号なし整数値。[UInt64](../data-types/int-uint.md)。 + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt64(64), + toUInt64(64.64), + toUInt64('64') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt64(64): 64 +toUInt64(64.64): 64 +toUInt64('64'): 64 +``` + +**関連項目** + +- [`toUInt64OrZero`](#touint64orzero). +- [`toUInt64OrNull`](#touint64ornull). +- [`toUInt64OrDefault`](#touint64ordefault). + +## toUInt64OrZero + +[`toUInt64`](#touint64)と同様に、入力値を型[UInt64](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt64OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`0`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt64OrZero('0xc0fe');`。 + +:::note +入力値が[UInt64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合64ビットの符号なし整数値、失敗した場合は`0`。[UInt64](../data-types/int-uint.md)。 + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt64OrZero('64'), + toUInt64OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt64OrZero('64'): 64 +toUInt64OrZero('abc'): 0 +``` + +**関連項目** + +- [`toUInt64`](#touint64). +- [`toUInt64OrNull`](#touint64ornull). +- [`toUInt64OrDefault`](#touint64ordefault). + +## toUInt64OrNull + +[`toUInt64`](#touint64)と同様に、入力値を型[UInt64](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt64OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`\N`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt64OrNull('0xc0fe');`。 + +:::note +入力値が[UInt64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合64ビットの符号なし整数値、失敗した場合は`NULL`。[UInt64](../data-types/int-uint.md) / [NULL](../data-types/nullable.md)。 + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt64OrNull('64'), + toUInt64OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt64OrNull('64'): 64 +toUInt64OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt64`](#touint64). +- [`toUInt64OrZero`](#touint64orzero). +- [`toUInt64OrDefault`](#touint64ordefault). + +## toUInt64OrDefault + +[`toUInt64`](#touint64)と同様に、入力値を型[UInt64](../data-types/int-uint.md)の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が指定されていない場合、エラーになると`0`が返されます。 + +**構文** + +```sql +toUInt64OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). +- `default` (optional) — 型`UInt64`への変換が失敗した場合に返すデフォルト値。[UInt64](../data-types/int-uint.md)。 + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt64OrDefault('0xc0fe', CAST('0', 'UInt64'));`。 + +:::note +入力値が[UInt64](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合64ビットの符号なし整数値、失敗した場合はデフォルト値が渡された場合それを返し、渡されていない場合は`0`を返す。[UInt64](../data-types/int-uint.md). + +:::note +- この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +- デフォルト値の型は変換される型と一致している必要があります。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt64OrDefault('64', CAST('0', 'UInt64')), + toUInt64OrDefault('abc', CAST('0', 'UInt64')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt64OrDefault('64', CAST('0', 'UInt64')): 64 +toUInt64OrDefault('abc', CAST('0', 'UInt64')): 0 +``` + +**関連項目** + +- [`toUInt64`](#touint64). +- [`toUInt64OrZero`](#touint64orzero). +- [`toUInt64OrNull`](#touint64ornull). + +## toUInt128 + +入力値を型[`UInt128`](../data-types/int-uint.md)の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt128(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされていない引数: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt128('0xc0fe');`。 + +:::note +入力値が[UInt128](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 128ビットの符号なし整数値。[UInt128](../data-types/int-uint.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt128(128), + toUInt128(128.8), + toUInt128('128') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt128(128): 128 +toUInt128(128.8): 128 +toUInt128('128'): 128 +``` + +**関連項目** + +- [`toUInt128OrZero`](#touint128orzero). +- [`toUInt128OrNull`](#touint128ornull). +- [`toUInt128OrDefault`](#touint128ordefault). + +## toUInt128OrZero + +[`toUInt128`](#touint128)と同様に、入力値を型[UInt128](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt128OrZero(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`0`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt128OrZero('0xc0fe');`。 + +:::note +入力値が[UInt128](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合128ビットの符号なし整数値、失敗した場合は`0`。[UInt128](../data-types/int-uint.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt128OrZero('128'), + toUInt128OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt128OrZero('128'): 128 +toUInt128OrZero('abc'): 0 +``` + +**関連項目** + +- [`toUInt128`](#touint128). +- [`toUInt128OrNull`](#touint128ornull). +- [`toUInt128OrDefault`](#touint128ordefault). + +## toUInt128OrNull + +[`toUInt128`](#touint128)と同様に、入力値を型[UInt128](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt128OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`\N`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt128OrNull('0xc0fe');`。 + +:::note +入力値が[UInt128](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合128ビットの符号なし整数値、失敗した場合は`NULL`。[UInt128](../data-types/int-uint.md) / [NULL](../data-types/nullable.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt128OrNull('128'), + toUInt128OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt128OrNull('128'): 128 +toUInt128OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt128`](#touint128). +- [`toUInt128OrZero`](#touint128orzero). +- [`toUInt128OrDefault`](#touint128ordefault). + +## toUInt128OrDefault + +[`toUInt128`](#toint128)と同様に、入力値を型[UInt128](../data-types/int-uint.md)の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が指定されていない場合、エラーになると`0`が返されます。 + +**構文** + +```sql +toUInt128OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). +- `default` (optional) — 型`UInt128`への変換が失敗した場合に返すデフォルト値。[UInt128](../data-types/int-uint.md)。 + +サポートされている引数: +- (U)Int8/16/32/64/128/256. +- Float32/64. +- (U)Int8/16/32/128/256の文字列表現。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt128OrDefault('0xc0fe', CAST('0', 'UInt128'));`。 + +:::note +入力値が[UInt128](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合128ビットの符号なし整数値、失敗した場合はデフォルト値が渡された場合それを返し、渡されていない場合は`0`を返す。[UInt128](../data-types/int-uint.md)。 + +:::note +- この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +- デフォルト値の型は変換される型と一致している必要があります。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt128OrDefault('128', CAST('0', 'UInt128')), + toUInt128OrDefault('abc', CAST('0', 'UInt128')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt128OrDefault('128', CAST('0', 'UInt128')): 128 +toUInt128OrDefault('abc', CAST('0', 'UInt128')): 0 +``` + +**関連項目** + +- [`toUInt128`](#touint128). +- [`toUInt128OrZero`](#touint128orzero). +- [`toUInt128OrNull`](#touint128ornull). + +## toUInt256 + +入力値を型[`UInt256`](../data-types/int-uint.md)の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toUInt256(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +サポートされていない引数: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt256('0xc0fe');`。 + +:::note +入力値が[UInt256](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 256ビットの符号なし整数値。[Int256](../data-types/int-uint.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt256(256), + toUInt256(256.256), + toUInt256('256') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt256(256): 256 +toUInt256(256.256): 256 +toUInt256('256'): 256 +``` + +**関連項目** + +- [`toUInt256OrZero`](#touint256orzero). +- [`toUInt256OrNull`](#touint256ornull). +- [`toUInt256OrDefault`](#touint256ordefault). + +## toUInt256OrZero + +[`toUInt256`](#touint256)と同様に、入力値を型[UInt256](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toUInt256OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`0`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt256OrZero('0xc0fe');`。 + +:::note +入力値が[UInt256](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合256ビットの符号なし整数値、失敗した場合は`0`。[UInt256](../data-types/int-uint.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt256OrZero('256'), + toUInt256OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt256OrZero('256'): 256 +toUInt256OrZero('abc'): 0 +``` + +**関連項目** + +- [`toUInt256`](#touint256). +- [`toUInt256OrNull`](#touint256ornull). +- [`toUInt256OrDefault`](#touint256ordefault). + +## toUInt256OrNull + +[`toUInt256`](#touint256)と同様に、入力値を型[UInt256](../data-types/int-uint.md)の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toUInt256OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256の文字列表現。 + +サポートされていない引数(`\N`が返される): +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt256OrNull('0xc0fe');`。 + +:::note +入力値が[UInt256](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合256ビットの符号なし整数値、失敗した場合は`NULL`。[UInt256](../data-types/int-uint.md) / [NULL](../data-types/nullable.md). + +:::note +この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt256OrNull('256'), + toUInt256OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt256OrNull('256'): 256 +toUInt256OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toUInt256`](#touint256). +- [`toUInt256OrZero`](#touint256orzero). +- [`toUInt256OrDefault`](#touint256ordefault). + +## toUInt256OrDefault + +[`toUInt256`](#touint256)と同様に、入力値を型[UInt256](../data-types/int-uint.md)の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が指定されていない場合、エラーになると`0`が返されます。 + +**構文** + +```sql +toUInt256OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). +- `default` (optional) — 型`UInt256`への変換が失敗した場合に返すデフォルト値。[UInt256](../data-types/int-uint.md). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値。 + +デフォルト値が返される引数: +- Float32/64の値の文字列表現、`NaN`や`Inf`を含む。 +- バイナリおよび16進数の文字列表現、例: `SELECT toUInt256OrDefault('0xc0fe', CAST('0', 'UInt256'));`。 + +:::note +入力値が[UInt256](../data-types/int-uint.md)の範囲内で表現できない場合、結果がオーバーフローまたはアンダーフローします。 +これはエラーとみなされません。 +::: + +**返される値** + +- 成功した場合256ビットの符号なし整数値、失敗した場合はデフォルト値が渡された場合それを返し、渡されていない場合は`0`を返す。[UInt256](../data-types/int-uint.md). + +:::note +- この関数は[0に向かって切り捨て丸め](https://en.wikipedia.org/wiki/Rounding#Rounding_towards_zero)を使用しており、数値の小数部分を切り捨てます。 +- デフォルト値の型は変換される型と一致している必要があります。 +::: + +**例** + +クエリ: + +```sql +SELECT + toUInt256OrDefault('-256', CAST('0', 'UInt256')), + toUInt256OrDefault('abc', CAST('0', 'UInt256')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toUInt256OrDefault('-256', CAST('0', 'UInt256')): 0 +toUInt256OrDefault('abc', CAST('0', 'UInt256')): 0 +``` + +**関連項目** + +- [`toUInt256`](#touint256). +- [`toUInt256OrZero`](#touint256orzero). +- [`toUInt256OrNull`](#touint256ornull). + +## toFloat32 + +入力値を型[`Float32`](../data-types/float.md)の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toFloat32(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値。 +- (U)Int8/16/32/128/256の文字列表現。 +- Float32/64型の値、`NaN`や`Inf`を含む。 +- Float32/64の文字列表現、`NaN`や`Inf`(大文字小文字を区別しない)。 + +サポートされていない引数: +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat32('0xc0fe');`。 + +**返される値** + +- 32ビットの浮動小数点数値。[Float32](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat32(42.7), + toFloat32('42.7'), + toFloat32('NaN') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat32(42.7): 42.7 +toFloat32('42.7'): 42.7 +toFloat32('NaN'): nan +``` + +**関連項目** + +- [`toFloat32OrZero`](#tofloat32orzero). +- [`toFloat32OrNull`](#tofloat32ornull). +- [`toFloat32OrDefault`](#tofloat32ordefault). + +## toFloat32OrZero + +[`toFloat32`](#tofloat32)と同様に、入力値を型[Float32](../data-types/float.md)の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toFloat32OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256, Float32/64の文字列表現。 + +サポートされていない引数(`0`が返される): +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat32OrZero('0xc0fe');`. + +**返される値** + +- 成功した場合32ビットの浮動小数点数値、失敗した場合は`0`。[Float32](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat32OrZero('42.7'), + toFloat32OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat32OrZero('42.7'): 42.7 +toFloat32OrZero('abc'): 0 +``` + +**関連項目** + +- [`toFloat32`](#tofloat32). +- [`toFloat32OrNull`](#tofloat32ornull). +- [`toFloat32OrDefault`](#tofloat32ordefault). + +## toFloat32OrNull + +[`toFloat32`](#tofloat32)と同様に、入力値を型[Float32](../data-types/float.md)の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toFloat32OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256, Float32/64の文字列表現。 + +サポートされていない引数(`\N`が返される): +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat32OrNull('0xc0fe');`. + +**返される値** + +- 成功した場合32ビットの浮動小数点数値、失敗した場合は`\N`。[Float32](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat32OrNull('42.7'), + toFloat32OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat32OrNull('42.7'): 42.7 +toFloat32OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toFloat32`](#tofloat32). +- [`toFloat32OrZero`](#tofloat32orzero). +- [`toFloat32OrDefault`](#tofloat32ordefault). + +## toFloat32OrDefault + +[`toFloat32`](#tofloat32)と同様に、入力値を型[Float32](../data-types/float.md)の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が指定されていない場合、エラーになると`0`が返されます。 + +**構文** + +```sql +toFloat32OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). +- `default` (optional) — 型`Float32`への変換が失敗した場合に返すデフォルト値。[Float32](../data-types/float.md). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値。 +- (U)Int8/16/32/128/256の文字列表現。 +- Float32/64型の値、`NaN`や`Inf`を含む。 +- Float32/64の文字列表現、`NaN`や`Inf`(大文字小文字を区別しない)。 + +デフォルト値が返される引数: +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat32OrDefault('0xc0fe', CAST('0', 'Float32'));`. + +**返される値** + +- 成功した場合32ビットの浮動小数点数値、失敗した場合はデフォルト値が渡された場合それを返し、渡されていない場合は`0`を返す。[Float32](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat32OrDefault('8', CAST('0', 'Float32')), + toFloat32OrDefault('abc', CAST('0', 'Float32')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat32OrDefault('8', CAST('0', 'Float32')): 8 +toFloat32OrDefault('abc', CAST('0', 'Float32')): 0 +``` + +**関連項目** + +- [`toFloat32`](#tofloat32). +- [`toFloat32OrZero`](#tofloat32orzero). +- [`toFloat32OrNull`](#tofloat32ornull). + +## toFloat64 + +入力値を型[`Float64`](../data-types/float.md)の値に変換します。エラーの場合は例外をスローします。 + +**構文** + +```sql +toFloat64(expr) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値。 +- (U)Int8/16/32/128/256の文字列表現。 +- Float32/64型の値、`NaN`や`Inf`を含む。 +- Float32/64の文字列表現、`NaN`や`Inf`(大文字小文字を区別しない)。 + +サポートされていない引数: +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat64('0xc0fe');`。 + +**返される値** + +- 64ビットの浮動小数点数値。[Float64](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat64(42.7), + toFloat64('42.7'), + toFloat64('NaN') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat64(42.7): 42.7 +toFloat64('42.7'): 42.7 +toFloat64('NaN'): nan +``` + +**関連項目** + +- [`toFloat64OrZero`](#tofloat64orzero). +- [`toFloat64OrNull`](#tofloat64ornull). +- [`toFloat64OrDefault`](#tofloat64ordefault). + +## toFloat64OrZero + +[`toFloat64`](#tofloat64)と同様に、入力値を型[Float64](../data-types/float.md)の値に変換しますが、エラーの場合は`0`を返します。 + +**構文** + +```sql +toFloat64OrZero(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256, Float32/64の文字列表現。 + +サポートされていない引数(`0`が返される): +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat64OrZero('0xc0fe');`。 + +**返される値** + +- 成功した場合64ビットの浮動小数点数値、失敗した場合は`0`。[Float64](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat64OrZero('42.7'), + toFloat64OrZero('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat64OrZero('42.7'): 42.7 +toFloat64OrZero('abc'): 0 +``` + +**関連項目** + +- [`toFloat64`](#tofloat64). +- [`toFloat64OrNull`](#tofloat64ornull). +- [`toFloat64OrDefault`](#tofloat64ordefault). + +## toFloat64OrNull + +[`toFloat64`](#tofloat64)と同様に、入力値を型[Float64](../data-types/float.md)の値に変換しますが、エラーの場合は`NULL`を返します。 + +**構文** + +```sql +toFloat64OrNull(x) +``` + +**引数** + +- `x` — 数字の文字列表現。[String](../data-types/string.md). + +サポートされている引数: +- (U)Int8/16/32/128/256, Float32/64の文字列表現。 + +サポートされていない引数(`\N`が返される): +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat64OrNull('0xc0fe');`。 + +**返される値** + +- 成功した場合64ビットの浮動小数点数値、失敗した場合は`\N`。[Float64](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat64OrNull('42.7'), + toFloat64OrNull('abc') +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat64OrNull('42.7'): 42.7 +toFloat64OrNull('abc'): ᴺᵁᴸᴸ +``` + +**関連項目** + +- [`toFloat64`](#tofloat64). +- [`toFloat64OrZero`](#tofloat64orzero). +- [`toFloat64OrDefault`](#tofloat64ordefault). + +## toFloat64OrDefault + +[`toFloat64`](#tofloat64)と同様に、入力値を型[Float64](../data-types/float.md)の値に変換しますが、エラーの場合はデフォルト値を返します。 +デフォルト値が指定されていない場合、エラーになると`0`が返されます。 + +**構文** + +```sql +toFloat64OrDefault(expr[, default]) +``` + +**引数** + +- `expr` — 数値または数値の文字列を返す式。[Expression](../syntax.md/#syntax-expressions) / [String](../data-types/string.md). +- `default` (optional) — 型`Float64`への変換が失敗した場合に返すデフォルト値。[Float64](../data-types/float.md). + +サポートされている引数: +- (U)Int8/16/32/64/128/256型の値。 +- (U)Int8/16/32/128/256の文字列表現。 +- Float32/64型の値、`NaN`や`Inf`を含む。 +- Float32/64の文字列表現、`NaN`や`Inf`(大文字小文字を区別しない)。 + +デフォルト値が返される引数: +- バイナリおよび16進数の文字列表現、例: `SELECT toFloat64OrDefault('0xc0fe', CAST('0', 'Float64'));`. + +**返される値** + +- 成功した場合64ビットの浮動小数点数値、失敗した場合はデフォルト値が渡された場合それを返し、渡されていない場合は`0`を返す。[Float64](../data-types/float.md). + +**例** + +クエリ: + +```sql +SELECT + toFloat64OrDefault('8', CAST('0', 'Float64')), + toFloat64OrDefault('abc', CAST('0', 'Float64')) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +toFloat64OrDefault('8', CAST('0', 'Float64')): 8 +toFloat64OrDefault('abc', CAST('0', 'Float64')): 0 +``` + +**関連項目** + +- [`toFloat64`](#tofloat64). +- [`toFloat64OrZero`](#tofloat64orzero). +- [`toFloat64OrNull`](#tofloat64ornull). + +## toDate + +引数を[Date](../data-types/date.md)データ型に変換します。 + +引数が[DateTime](../data-types/datetime.md)や[DateTime64](../data-types/datetime64.md)の場合、それを切り捨ててDateTimeの日付コンポーネントを残します。 + +```sql +SELECT + now() AS x, + toDate(x) +``` + +```response +┌───────────────────x─┬─toDate(now())─┐ +│ 2022-12-30 13:44:17 │ 2022-12-30 │ +└─────────────────────┴───────────────┘ +``` + +引数が[String](../data-types/string.md)の場合、[Date](../data-types/date.md)や[DateTime](../data-types/datetime.md)として解析されます。[DateTime](../data-types/datetime.md)として解析された場合、日付コンポーネントが使用されます。 + +```sql +SELECT + toDate('2022-12-30') AS x, + toTypeName(x) +``` + +```response +┌──────────x─┬─toTypeName(toDate('2022-12-30'))─┐ +│ 2022-12-30 │ Date │ +└────────────┴──────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` +```sql +SELECT + toDate('2022-12-30 01:02:03') AS x, + toTypeName(x) +``` + +```response +┌──────────x─┬─toTypeName(toDate('2022-12-30 01:02:03'))─┐ +│ 2022-12-30 │ Date │ +└────────────┴───────────────────────────────────────────┘ +``` + +引数が数値であり、UNIXタイムスタンプのように見える場合(65535より大きい場合)、現地のタイムゾーンで切り詰められた[DateTime](../data-types/datetime.md)として解釈されます。タイムゾーン引数は関数の第二引数として指定できます。切り詰めは、タイムゾーンに依存します。 + +```sql +SELECT + now() AS current_time, + toUnixTimestamp(current_time) AS ts, + toDateTime(ts) AS time_Amsterdam, + toDateTime(ts, 'Pacific/Apia') AS time_Samoa, + toDate(time_Amsterdam) AS date_Amsterdam, + toDate(time_Samoa) AS date_Samoa, + toDate(ts) AS date_Amsterdam_2, + toDate(ts, 'Pacific/Apia') AS date_Samoa_2 +``` + +```response +Row 1: +────── +current_time: 2022-12-30 13:51:54 +ts: 1672404714 +time_Amsterdam: 2022-12-30 13:51:54 +time_Samoa: 2022-12-31 01:51:54 +date_Amsterdam: 2022-12-30 +date_Samoa: 2022-12-31 +date_Amsterdam_2: 2022-12-30 +date_Samoa_2: 2022-12-31 +``` + +上記の例は、同じUNIXタイムスタンプが異なるタイムゾーンで異なる日付として解釈されることを示しています。 + +引数が数値であり、65536より小さい場合、それは1970-01-01(最初のUNIX日)からの経過日数として解釈され、[Date](../data-types/date.md)に変換されます。これは、`Date`データ型の内部数値表現に対応しています。例: + +```sql +SELECT toDate(12345) +``` +```response +┌─toDate(12345)─┐ +│ 2003-10-20 │ +└───────────────┘ +``` + +この変換はタイムゾーンには依存しません。 + +引数がDate型の範囲に収まらない場合、それは実装定義の振る舞いを引き起こし、サポートされる最大日付まで飽和するか、オーバーフローします: +```sql +SELECT toDate(10000000000.) +``` +```response +┌─toDate(10000000000.)─┐ +│ 2106-02-07 │ +└──────────────────────┘ +``` + +`toDate`関数は、以下のように他の形式でも記述できます: + +```sql +SELECT + now() AS time, + toDate(time), + DATE(time), + CAST(time, 'Date') +``` +```response +┌────────────────time─┬─toDate(now())─┬─DATE(now())─┬─CAST(now(), 'Date')─┐ +│ 2022-12-30 13:54:58 │ 2022-12-30 │ 2022-12-30 │ 2022-12-30 │ +└─────────────────────┴───────────────┴─────────────┴─────────────────────┘ +``` + + +## toDateOrZero + +[toDate](#todate)と同じですが、無効な引数が受け取られると[Date](../data-types/date.md)の下限を返します。引数としては[String](../data-types/string.md)のみがサポートされます。 + +**例** + +クエリ: + +``` sql +SELECT toDateOrZero('2022-12-30'), toDateOrZero(''); +``` + +結果: + +```response +┌─toDateOrZero('2022-12-30')─┬─toDateOrZero('')─┐ +│ 2022-12-30 │ 1970-01-01 │ +└────────────────────────────┴──────────────────┘ +``` + + +## toDateOrNull + +[toDate](#todate)と同じですが、無効な引数が受け取られると`NULL`を返します。引数としては[String](../data-types/string.md)のみがサポートされます。 + +**例** + +クエリ: + +``` sql +SELECT toDateOrNull('2022-12-30'), toDateOrNull(''); +``` + +結果: + +```response +┌─toDateOrNull('2022-12-30')─┬─toDateOrNull('')─┐ +│ 2022-12-30 │ ᴺᵁᴸᴸ │ +└────────────────────────────┴──────────────────┘ +``` + + +## toDateOrDefault + +[toDate](#todate)と同様ですが、失敗した場合には、2番目の引数(指定されている場合)または[Date](../data-types/date.md)の下限を返します。 + +**構文** + +``` sql +toDateOrDefault(expr [, default_value]) +``` + +**例** + +クエリ: + +``` sql +SELECT toDateOrDefault('2022-12-30'), toDateOrDefault('', '2023-01-01'::Date); +``` + +結果: + +```response +┌─toDateOrDefault('2022-12-30')─┬─toDateOrDefault('', CAST('2023-01-01', 'Date'))─┐ +│ 2022-12-30 │ 2023-01-01 │ +└───────────────────────────────┴─────────────────────────────────────────────────┘ +``` + + +## toDateTime + +入力値を[DateTime](../data-types/datetime.md)に変換します。 + +**構文** + +``` sql +toDateTime(expr[, time_zone ]) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[Int](../data-types/int-uint.md)、[Date](../data-types/date.md)、または[DateTime](../data-types/datetime.md)。 +- `time_zone` — タイムゾーン。[String](../data-types/string.md)。 + +:::note +`expr`が数値の場合、Unixエポックの開始からの秒数(Unixタイムスタンプとして)として解釈されます。 +`expr`が[String](../data-types/string.md)の場合、Unixタイムスタンプとして、または日付/時刻の文字列表現として解釈され得ます。 +したがって、短い数値列の文字列表現(4桁以下)はあいまいさのため明示的に無効化されています。例えば、文字列`'1999'`は年(Date/DateTimeの不完全な文字列表現)またはUnixタイムスタンプのいずれかである可能性があります。より長い数値文字列は許可されています。 +::: + +**返される値** + +- 日付時間。[DateTime](../data-types/datetime.md) + +**例** + +クエリ: + +``` sql +SELECT toDateTime('2022-12-30 13:44:17'), toDateTime(1685457500, 'UTC'); +``` + +結果: + +```response +┌─toDateTime('2022-12-30 13:44:17')─┬─toDateTime(1685457500, 'UTC')─┐ +│ 2022-12-30 13:44:17 │ 2023-05-30 14:38:20 │ +└───────────────────────────────────┴───────────────────────────────┘ +``` + + +## toDateTimeOrZero + +[toDateTime](#todatetime)と同様ですが、無効な引数が受け取られると[DateTime](../data-types/datetime.md)の下限を返します。引数としては[String](../data-types/string.md)のみがサポートされます。 + +**例** + +クエリ: + +``` sql +SELECT toDateTimeOrZero('2022-12-30 13:44:17'), toDateTimeOrZero(''); +``` + +結果: + +```response +┌─toDateTimeOrZero('2022-12-30 13:44:17')─┬─toDateTimeOrZero('')─┐ +│ 2022-12-30 13:44:17 │ 1970-01-01 00:00:00 │ +└─────────────────────────────────────────┴──────────────────────┘ +``` + + +## toDateTimeOrNull + +[toDateTime](#todatetime)と同様ですが、無効な引数が受け取られると`NULL`を返します。引数としては[String](../data-types/string.md)のみがサポートされます。 + +**例** + +クエリ: + +``` sql +SELECT toDateTimeOrNull('2022-12-30 13:44:17'), toDateTimeOrNull(''); +``` + +結果: + +```response +┌─toDateTimeOrNull('2022-12-30 13:44:17')─┬─toDateTimeOrNull('')─┐ +│ 2022-12-30 13:44:17 │ ᴺᵁᴸᴸ │ +└─────────────────────────────────────────┴──────────────────────┘ +``` + + +## toDateTimeOrDefault + +[toDateTime](#todatetime)のようにしますが、失敗した場合には、第三の引数(指定されている場合)、または[DateTime](../data-types/datetime.md)の下限を返します。 + +**構文** + +``` sql +toDateTimeOrDefault(expr [, time_zone [, default_value]]) +``` + +**例** + +クエリ: + +``` sql +SELECT toDateTimeOrDefault('2022-12-30 13:44:17'), toDateTimeOrDefault('', 'UTC', '2023-01-01'::DateTime('UTC')); +``` + +結果: + +```response +┌─toDateTimeOrDefault('2022-12-30 13:44:17')─┬─toDateTimeOrDefault('', 'UTC', CAST('2023-01-01', 'DateTime(\'UTC\')'))─┐ +│ 2022-12-30 13:44:17 │ 2023-01-01 00:00:00 │ +└────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘ +``` + + +## toDate32 + +引数を[Date32](../data-types/date32.md)データ型に変換します。値が範囲外の場合、`toDate32`は[Date32](../data-types/date32.md)でサポートされる境界値を返します。引数が[Date](../data-types/date.md)型の場合、その境界が考慮されます。 + +**構文** + +``` sql +toDate32(expr) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[UInt32](../data-types/int-uint.md)または[Date](../data-types/date.md)。 + +**返される値** + +- カレンダーの日付。型[Date32](../data-types/date32.md)。 + +**例** + +1. 値が範囲内の場合: + +``` sql +SELECT toDate32('1955-01-01') AS value, toTypeName(value); +``` + +```response +┌──────value─┬─toTypeName(toDate32('1925-01-01'))─┐ +│ 1955-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +2. 値が範囲外の場合: + +``` sql +SELECT toDate32('1899-01-01') AS value, toTypeName(value); +``` + +```response +┌──────value─┬─toTypeName(toDate32('1899-01-01'))─┐ +│ 1900-01-01 │ Date32 │ +└────────────┴────────────────────────────────────┘ +``` + +3. [Date](../data-types/date.md)引数の場合: + +``` sql +SELECT toDate32(toDate('1899-01-01')) AS value, toTypeName(value); +``` + +```response +┌──────value─┬─toTypeName(toDate32(toDate('1899-01-01')))─┐ +│ 1970-01-01 │ Date32 │ +└────────────┴────────────────────────────────────────────┘ +``` + +## toDate32OrZero + +[toDate32](#todate32)と同様ですが、無効な引数が受け取られると[Date32](../data-types/date32.md)の最小値を返します。 + +**例** + +クエリ: + +``` sql +SELECT toDate32OrZero('1899-01-01'), toDate32OrZero(''); +``` + +結果: + +```response +┌─toDate32OrZero('1899-01-01')─┬─toDate32OrZero('')─┐ +│ 1900-01-01 │ 1900-01-01 │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrNull + +[toDate32](#todate32)と同様ですが、無効な引数が受け取られると`NULL`を返します。 + +**例** + +クエリ: + +``` sql +SELECT toDate32OrNull('1955-01-01'), toDate32OrNull(''); +``` + +結果: + +```response +┌─toDate32OrNull('1955-01-01')─┬─toDate32OrNull('')─┐ +│ 1955-01-01 │ ᴺᵁᴸᴸ │ +└──────────────────────────────┴────────────────────┘ +``` + +## toDate32OrDefault + +引数を[Date32](../data-types/date32.md)データ型に変換します。値が範囲外の場合、`toDate32OrDefault`は[Date32](../data-types/date32.md)でサポートされる下側の境界値を返します。引数が[Date](../data-types/date.md)型の場合、その境界が考慮されます。無効な引数が受け取られるとデフォルト値を返します。 + +**例** + +クエリ: + +``` sql +SELECT + toDate32OrDefault('1930-01-01', toDate32('2020-01-01')), + toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01')); +``` + +結果: + +```response +┌─toDate32OrDefault('1930-01-01', toDate32('2020-01-01'))─┬─toDate32OrDefault('xx1930-01-01', toDate32('2020-01-01'))─┐ +│ 1930-01-01 │ 2020-01-01 │ +└─────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘ +``` + +## toDateTime64 + +入力値を[DateTime64](../data-types/datetime64.md)型の値に変換します。 + +**構文** + +``` sql +toDateTime64(expr, scale, [timezone]) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[UInt32](../data-types/int-uint.md)、[Float](../data-types/float.md)または[DateTime](../data-types/datetime.md)。 +- `scale` - ティックサイズ(精度): 10-精度秒。有効範囲: [ 0 : 9 ]。 +- `timezone`(オプション)- 指定したdatetime64オブジェクトのタイムゾーン。 + +**返される値** + +- カレンダーの日付と時刻、サブ秒精度あり。[DateTime64](../data-types/datetime64.md)。 + +**例** + +1. 値が範囲内の場合: + +``` sql +SELECT toDateTime64('1955-01-01 00:00:00.000', 3) AS value, toTypeName(value); +``` + +```response +┌───────────────────value─┬─toTypeName(toDateTime64('1955-01-01 00:00:00.000', 3))─┐ +│ 1955-01-01 00:00:00.000 │ DateTime64(3) │ +└─────────────────────────┴────────────────────────────────────────────────────────┘ +``` + +2. 精度を持つ小数として: + +``` sql +SELECT toDateTime64(1546300800.000, 3) AS value, toTypeName(value); +``` + +```response +┌───────────────────value─┬─toTypeName(toDateTime64(1546300800., 3))─┐ +│ 2019-01-01 00:00:00.000 │ DateTime64(3) │ +└─────────────────────────┴──────────────────────────────────────────┘ +``` + +小数点なしでは、値は秒単位のUnixタイムスタンプとして扱われます: + +``` sql +SELECT toDateTime64(1546300800000, 3) AS value, toTypeName(value); +``` + +```response +┌───────────────────value─┬─toTypeName(toDateTime64(1546300800000, 3))─┐ +│ 2282-12-31 00:00:00.000 │ DateTime64(3) │ +└─────────────────────────┴────────────────────────────────────────────┘ +``` + +3. `timezone`付き: + +``` sql +SELECT toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul') AS value, toTypeName(value); +``` + +```response +┌───────────────────value─┬─toTypeName(toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul'))─┐ +│ 2019-01-01 00:00:00.000 │ DateTime64(3, 'Asia/Istanbul') │ +└─────────────────────────┴─────────────────────────────────────────────────────────────────────┘ +``` + +## toDateTime64OrZero + +[toDateTime64](#todatetime64)と同様に、この関数は入力値を[DateTime64](../data-types/datetime64.md)型の値に変換しますが、無効な引数が受け取られると[DateTime64](../data-types/datetime64.md)の最小値を返します。 + +**構文** + +``` sql +toDateTime64OrZero(expr, scale, [timezone]) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[UInt32](../data-types/int-uint.md)、[Float](../data-types/float.md)または[DateTime](../data-types/datetime.md)。 +- `scale` - ティックサイズ(精度): 10-精度秒。有効範囲: [ 0 : 9 ]。 +- `timezone`(オプション)- 指定したDateTime64オブジェクトのタイムゾーン。 + +**返される値** + +- カレンダーの日付と時刻、サブ秒精度あり、それ以外は`DateTime64`の最小値: `1970-01-01 01:00:00.000`。[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +```sql +SELECT toDateTime64OrZero('2008-10-12 00:00:00 00:30:30', 3) AS invalid_arg +``` + +結果: + +```response +┌─────────────invalid_arg─┐ +│ 1970-01-01 01:00:00.000 │ +└─────────────────────────┘ +``` + +**参照** + +- [toDateTime64](#todatetime64). +- [toDateTime64OrNull](#todatetime64ornull). +- [toDateTime64OrDefault](#todatetime64ordefault). + +## toDateTime64OrNull + +[toDateTime64](#todatetime64)と同様に、この関数は入力値を[DateTime64](../data-types/datetime64.md)型の値に変換しますが、無効な引数が受け取られると`NULL`を返します。 + +**構文** + +``` sql +toDateTime64OrNull(expr, scale, [timezone]) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[UInt32](../data-types/int-uint.md)、[Float](../data-types/float.md)または[DateTime](../data-types/datetime.md)。 +- `scale` - ティックサイズ(精度): 10-精度秒。有効範囲: [ 0 : 9 ]。 +- `timezone`(オプション)- 指定したDateTime64オブジェクトのタイムゾーン。 + +**返される値** + +- カレンダーの日付と時刻、サブ秒精度あり、それ以外は`NULL`。[DateTime64](../data-types/datetime64.md)/[NULL](../data-types/nullable.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDateTime64OrNull('1976-10-18 00:00:00.30', 3) AS valid_arg, + toDateTime64OrNull('1976-10-18 00:00:00 30', 3) AS invalid_arg +``` + +結果: + +```response +┌───────────────valid_arg─┬─invalid_arg─┐ +│ 1976-10-18 00:00:00.300 │ ᴺᵁᴸᴸ │ +└─────────────────────────┴─────────────┘ +``` + +**参照** + +- [toDateTime64](#todatetime64). +- [toDateTime64OrZero](#todatetime64orzero). +- [toDateTime64OrDefault](#todatetime64ordefault). + +## toDateTime64OrDefault + +[toDateTime64](#todatetime64)と同様に、この関数は入力値を[DateTime64](../data-types/datetime64.md)型の値に変換しますが、 +無効な引数が受け取られると、[DateTime64](../data-types/datetime64.md)のデフォルト値または指定されたデフォルトを返します。 + +**構文** + +``` sql +toDateTime64OrNull(expr, scale, [timezone, default]) +``` + +**引数** + +- `expr` — 値。[String](../data-types/string.md)、[UInt32](../data-types/int-uint.md)、[Float](../data-types/float.md)または[DateTime](../data-types/datetime.md)。 +- `scale` - ティックサイズ(精度): 10-精度秒。有効範囲: [ 0 : 9 ]。 +- `timezone`(オプション)- 指定したDateTime64オブジェクトのタイムゾーン。 +- `default`(オプション)- 無効な引数が受け取られた場合に返すデフォルト値。[DateTime64](../data-types/datetime64.md)。 + +**返される値** + +- カレンダーの日付と時刻、サブ秒精度あり、それ以外は`DateTime64`の最小値または指定されたデフォルト値。[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDateTime64OrDefault('1976-10-18 00:00:00 30', 3) AS invalid_arg, + toDateTime64OrDefault('1976-10-18 00:00:00 30', 3, 'UTC', toDateTime64('2001-01-01 00:00:00.00',3)) AS invalid_arg_with_default +``` + +結果: + +```response +┌─────────────invalid_arg─┬─invalid_arg_with_default─┐ +│ 1970-01-01 01:00:00.000 │ 2000-12-31 23:00:00.000 │ +└─────────────────────────┴──────────────────────────┘ +``` + +**参照** + +- [toDateTime64](#todatetime64). +- [toDateTime64OrZero](#todatetime64orzero). +- [toDateTime64OrNull](#todatetime64ornull). + +## toDecimal32 + +入力値を[`Decimal(9, S)`](../data-types/decimal.md)型の値に変換します。エラーが発生した場合に例外をスローします。 + +**構文** + +```sql +toDecimal32(expr, S) +``` + +**引数** + +- `expr` — 数値またはその文字列表現を返す式。[Expression](../syntax.md/#syntax-expressions)。 +- `S` — 小数点以下の桁数を指定します。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の値または文字列表現。 +- Float32/64型の値または文字列表現。 + +サポートされていない引数: +- Float32/64の`NaN`および`Inf`の文字列表現(大文字小文字を区別しない)。 +- 2進数および16進数の文字列表現、例:`SELECT toDecimal32('0xc0fe', 1);`。 + +:::note +`expr`の値が`Decimal32`の範囲を超えると、オーバーフローが発生する可能性があります: `( -1 * 10^(9 - S), 1 * 10^(9 - S) )`。 +小数点以下の過剰な桁は切り捨てられます(四捨五入しません)。 +整数部の過剰な桁は例外を引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64入力で予期しない動作をする可能性があります。これは浮動小数点演算を使用しているためです。 +例:`toDecimal32(1.15, 2)`は`1.14`となります。なぜなら1.15 * 100は浮動小数点では114.99となるためです。 +内部整数型を使用するために文字列入力を使用することができます:`toDecimal32('1.15', 2) = 1.15` +::: + +**返される値** + +- `Decimal(9, S)`型の値。[Decimal32(S)](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal32(2, 1) AS a, toTypeName(a) AS type_a, + toDecimal32(4.2, 2) AS b, toTypeName(b) AS type_b, + toDecimal32('4.2', 3) AS c, toTypeName(c) AS type_c +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 2 +type_a: Decimal(9, 1) +b: 4.2 +type_b: Decimal(9, 2) +c: 4.2 +type_c: Decimal(9, 3) +``` + +**参照** + +- [`toDecimal32OrZero`](#todecimal32orzero). +- [`toDecimal32OrNull`](#todecimal32ornull). +- [`toDecimal32OrDefault`](#todecimal32ordefault). + +## toDecimal32OrZero + +[`toDecimal32`](#todecimal32)と同様に、この関数は入力値を[Decimal(9, S)](../data-types/decimal.md)型の値に変換しますが、エラーが発生した場合は`0`を返します。 + +**構文** + +```sql +toDecimal32OrZero(expr, S) +``` + +**引数** + +- `expr` — 数値の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数点以下の桁数を指定します。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の文字列表現。 +- Float32/64型の文字列表現。 + +サポートされていない引数: +- Float32/64の`NaN`および`Inf`の文字列表現。 +- 2進数および16進数の文字列表現、例:`SELECT toDecimal32OrZero('0xc0fe', 1);`。 + +:::note +`expr`の値が`Decimal32`の範囲を超えると、オーバーフローが発生する可能性があります: `( -1 * 10^(9 - S), 1 * 10^(9 - S) )`。 +小数点以下の過剰な桁は切り捨てられます(四捨五入しません)。 +整数部の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功した場合は`Decimal(9, S)`型の値、それ以外の場合は`S`小数点以下の桁を持つ`0`。[Decimal32(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +``` sql +SELECT + toDecimal32OrZero(toString(-1.111), 5) AS a, + toTypeName(a), + toDecimal32OrZero(toString('Inf'), 5) as b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: -1.111 +toTypeName(a): Decimal(9, 5) +b: 0 +toTypeName(b): Decimal(9, 5) +``` + +**参照** + +- [`toDecimal32`](#todecimal32). +- [`toDecimal32OrNull`](#todecimal32ornull). +- [`toDecimal32OrDefault`](#todecimal32ordefault). + +## toDecimal32OrNull + +[`toDecimal32`](#todecimal32)と同様に、この関数は入力値を[Nullable(Decimal(9, S))](../data-types/decimal.md)型の値に変換しますが、エラーが発生した場合は`NULL`を返します。 + +**構文** + +```sql +toDecimal32OrNull(expr, S) +``` + +**引数** + +- `expr` — 数値の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数点以下の桁数を指定します。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- (U)Int8/16/32/64/128/256型の文字列表現。 +- Float32/64型の文字列表現。 + +サポートされていない引数: +- Float32/64の`NaN`および`Inf`の文字列表現。 +- 2進数および16進数の文字列表現、例:`SELECT toDecimal32OrNull('0xc0fe', 1);`。 + +:::note +`expr`の値が`Decimal32`の範囲を超えると、オーバーフローが発生する可能性があります: `( -1 * 10^(9 - S), 1 * 10^(9 - S) )`。 +小数点以下の過剰な桁は切り捨てられます(四捨五入しません)。 +整数部の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功した場合は`Nullable(Decimal(9, S))`型の値、それ以外の場合は同じ型の`NULL`。[Decimal32(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +``` sql +SELECT +``` +```sql +toDecimal64OrNull(toString(0.0001), 18) AS a, +toTypeName(a), +toDecimal64OrNull(toString('Inf'), 18) as b, +toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.0001 +toTypeName(a): Nullable(Decimal(18, 18)) +b: ᴺᵁᴸᴸ +toTypeName(b): Nullable(Decimal(18, 18)) +``` + +**関連項目** + +- [`toDecimal64`](#todecimal64). +- [`toDecimal64OrZero`](#todecimal64orzero). +- [`toDecimal64OrDefault`](#todecimal64ordefault). + +## toDecimal64OrDefault + +[`toDecimal64`](#todecimal64) と似ており、この関数は、入力値を [Decimal(18, S)](../data-types/decimal.md) 型の値に変換しますが、エラーの場合にはデフォルト値を返します。 + +**構文** + +```sql +toDecimal64OrDefault(expr, S[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から18の範囲。[UInt8](../data-types/int-uint.md)。 +- `default` (オプション) — `Decimal64(S)` への変換に失敗した場合に返すデフォルト値。[Decimal64(S)](../data-types/decimal.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal64OrDefault('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal64` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(18 - S), 1 * 10^(18 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64 入力で作業する際に期待しない動作をすることがあります。操作は浮動小数点命令を使用して実行されます。 +例: `toDecimal64OrDefault(1.15, 2)` は `1.14` に等しくなります。なぜなら、1.15 * 100 は浮動小数点で 114.99 だからです。 +文字列入力を使用することができます。これは、操作が基盤となる整数型を使用するようにします: `toDecimal64OrDefault('1.15', 2) = 1.15` +::: + +**返される値** + +- 成功時には `Decimal(18, S)` 型の値、失敗時にはデフォルト値が指定されていればその値、指定されていなければ `0`。 [Decimal64(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal64OrDefault(toString(0.0001), 18) AS a, + toTypeName(a), + toDecimal64OrDefault('Inf', 0, CAST('-1', 'Decimal64(0)')) AS b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.0001 +toTypeName(a): Decimal(18, 18) +b: -1 +toTypeName(b): Decimal(18, 0) +``` + +**関連項目** + +- [`toDecimal64`](#todecimal64). +- [`toDecimal64OrZero`](#todecimal64orzero). +- [`toDecimal64OrNull`](#todecimal64ornull). + +## toDecimal128 + +入力値を [`Decimal(38, S)`](../data-types/decimal.md) 型に変換し、スケール `S` を持つ値にします。エラーの場合には例外をスローします。 + +**構文** + +```sql +toDecimal128(expr, S) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[Expression](../syntax.md/#syntax-expressions)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から38の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の値または文字列表現。 +- 型 Float32/64 の値または文字列表現。 + +サポートされない引数: +- 値または文字列表現の Float32/64 値 `NaN` および `Inf`(大文字小文字を区別しない)。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal128('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal128` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(38 - S), 1 * 10^(38 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁は例外を引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64 入力で作業する際に期待しない動作をすることがあります。操作は浮動小数点命令を使用して実行されます。 +例: `toDecimal128(1.15, 2)` は `1.14` に等しくなります。なぜなら、1.15 * 100 は浮動小数点で 114.99 だからです。 +文字列入力を使用することができます。これは、操作が基盤となる整数型を使用するようにします: `toDecimal128('1.15', 2) = 1.15` +::: + +**返される値** + +- 型 `Decimal(38, S)` の値。[Decimal128(S)](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal128(99, 1) AS a, toTypeName(a) AS type_a, + toDecimal128(99.67, 2) AS b, toTypeName(b) AS type_b, + toDecimal128('99.67', 3) AS c, toTypeName(c) AS type_c +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 99 +type_a: Decimal(38, 1) +b: 99.67 +type_b: Decimal(38, 2) +c: 99.67 +type_c: Decimal(38, 3) +``` + +**関連項目** + +- [`toDecimal128OrZero`](#todecimal128orzero). +- [`toDecimal128OrNull`](#todecimal128ornull). +- [`toDecimal128OrDefault`](#todecimal128ordefault). + +## toDecimal128OrZero + +[`toDecimal128`](#todecimal128) と似ており、この関数は、入力値を [Decimal(38, S)](../data-types/decimal.md) 型の値に変換しますが、エラーの場合には `0` を返します。 + +**構文** + +```sql +toDecimal128OrZero(expr, S) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から38の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal128OrZero('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal128` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(38 - S), 1 * 10^(38 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功時には型 `Decimal(38, S)` の値、失敗時には `S` 小数点を持つ `0`。[Decimal128(S)](../data-types/decimal.md). + +**例** + +クエリ: + +```sql +SELECT + toDecimal128OrZero(toString(0.0001), 38) AS a, + toTypeName(a), + toDecimal128OrZero(toString('Inf'), 38) as b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.0001 +toTypeName(a): Decimal(38, 38) +b: 0 +toTypeName(b): Decimal(38, 38) +``` + +**関連項目** + +- [`toDecimal128`](#todecimal128). +- [`toDecimal128OrNull`](#todecimal128ornull). +- [`toDecimal128OrDefault`](#todecimal128ordefault). + +## toDecimal128OrNull + +[`toDecimal128`](#todecimal128) と似ており、この関数は、入力値を [Nullable(Decimal(38, S))](../data-types/decimal.md) 型の値に変換しますが、エラーの場合には `NULL` を返します。 + +**構文** + +```sql +toDecimal128OrNull(expr, S) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から38の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal128OrNull('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal128` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(38 - S), 1 * 10^(38 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功時には `Nullable(Decimal(38, S))` 型の値、失敗時には同じ型の `NULL`。[Decimal128(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal128OrNull(toString(1/42), 38) AS a, + toTypeName(a), + toDecimal128OrNull(toString('Inf'), 38) as b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.023809523809523808 +toTypeName(a): Nullable(Decimal(38, 38)) +b: ᴺᵁᴸᴸ +toTypeName(b): Nullable(Decimal(38, 38)) +``` + +**関連項目** + +- [`toDecimal128`](#todecimal128). +- [`toDecimal128OrZero`](#todecimal128orzero). +- [`toDecimal128OrDefault`](#todecimal128ordefault). + +## toDecimal128OrDefault + +[`toDecimal128`](#todecimal128) と似ており、この関数は、入力値を [Decimal(38, S)](../data-types/decimal.md) 型の値に変換しますが、エラーの場合にはデフォルト値を返します。 + +**構文** + +```sql +toDecimal128OrDefault(expr, S[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から38の範囲。[UInt8](../data-types/int-uint.md)。 +- `default` (オプション) — `Decimal128(S)` 型への変換に失敗した場合に返すデフォルト値。[Decimal128(S)](../data-types/decimal.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal128OrDefault('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal128` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(38 - S), 1 * 10^(38 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64 入力で作業する際に期待しない動作をすることがあります。操作は浮動小数点命令を使用して実行されます。 +例: `toDecimal128OrDefault(1.15, 2)` は `1.14` に等しくなります。なぜなら、1.15 * 100 は浮動小数点で 114.99 だからです。 +文字列入力を使用することができます。これは、操作が基盤となる整数型を使用するようにします: `toDecimal128OrDefault('1.15', 2) = 1.15` +::: + +**返される値** + +- 成功時には `Decimal(38, S)` 型の値、失敗時にはデフォルト値が指定されていればその値、指定されていなければ `0`。[Decimal128(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal128OrDefault(toString(1/42), 18) AS a, + toTypeName(a), + toDecimal128OrDefault('Inf', 0, CAST('-1', 'Decimal128(0)')) AS b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.023809523809523808 +toTypeName(a): Decimal(38, 18) +b: -1 +toTypeName(b): Decimal(38, 0) +``` + +**関連項目** + +- [`toDecimal128`](#todecimal128). +- [`toDecimal128OrZero`](#todecimal128orzero). +- [`toDecimal128OrNull`](#todecimal128ornull). + +## toDecimal256 + +入力値を [`Decimal(76, S)`](../data-types/decimal.md) 型に変換し、スケール `S` を持つ値にします。エラーの場合には例外をスローします。 + +**構文** + +```sql +toDecimal256(expr, S) +``` + +**引数** + +- `expr` — 数値または数値の文字列表現を返す式。[Expression](../syntax.md/#syntax-expressions)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から76の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の値または文字列表現。 +- 型 Float32/64 の値または文字列表現。 + +サポートされない引数: +- 値または文字列表現の Float32/64 値 `NaN` および `Inf`(大文字小文字を区別しない)。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal256('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal256` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(76 - S), 1 * 10^(76 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁は例外を引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64 入力で作業する際に期待しない動作をすることがあります。操作は浮動小数点命令を使用して実行されます。 +例: `toDecimal256(1.15, 2)` は `1.14` に等しくなります。なぜなら、1.15 * 100 は浮動小数点で 114.99 だからです。 +文字列入力を使用することができます。これは、操作が基盤となる整数型を使用するようにします: `toDecimal256('1.15', 2) = 1.15` +::: + +**返される値** + +- 型 `Decimal(76, S)` の値。[Decimal256(S)](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal256(99, 1) AS a, toTypeName(a) AS type_a, + toDecimal256(99.67, 2) AS b, toTypeName(b) AS type_b, + toDecimal256('99.67', 3) AS c, toTypeName(c) AS type_c +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 99 +type_a: Decimal(76, 1) +b: 99.67 +type_b: Decimal(76, 2) +c: 99.67 +type_c: Decimal(76, 3) +``` + +**関連項目** + +- [`toDecimal256OrZero`](#todecimal256orzero). +- [`toDecimal256OrNull`](#todecimal256ornull). +- [`toDecimal256OrDefault`](#todecimal256ordefault). + +## toDecimal256OrZero + +[`toDecimal256`](#todecimal256) と似ており、この関数は、入力値を [Decimal(76, S)](../data-types/decimal.md) 型の値に変換しますが、エラーの場合には `0` を返します。 + +**構文** + +```sql +toDecimal256OrZero(expr, S) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から76の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal256OrZero('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal256` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(76 - S), 1 * 10^(76 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功時には型 `Decimal(76, S)` の値、失敗時には `S` 小数点を持つ `0`。[Decimal256(S)](../data-types/decimal.md). + +**例** + +クエリ: + +```sql +SELECT + toDecimal256OrZero(toString(0.0001), 76) AS a, + toTypeName(a), + toDecimal256OrZero(toString('Inf'), 76) as b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.0001 +toTypeName(a): Decimal(76, 76) +b: 0 +toTypeName(b): Decimal(76, 76) +``` + +**関連項目** + +- [`toDecimal256`](#todecimal256). +- [`toDecimal256OrNull`](#todecimal256ornull). +- [`toDecimal256OrDefault`](#todecimal256ordefault). + +## toDecimal256OrNull + +[`toDecimal256`](#todecimal256) と似ており、この関数は、入力値を [Nullable(Decimal(76, S))](../data-types/decimal.md) 型の値に変換しますが、エラーの場合には `NULL` を返します。 + +**構文** + +```sql +toDecimal256OrNull(expr, S) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から76の範囲。[UInt8](../data-types/int-uint.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal256OrNull('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal256` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(76 - S), 1 * 10^(76 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +**返される値** + +- 成功時には `Nullable(Decimal(76, S))` 型の値、失敗時には同じ型の `NULL`。[Decimal256(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal256OrNull(toString(1/42), 76) AS a, + toTypeName(a), + toDecimal256OrNull(toString('Inf'), 76) as b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.023809523809523808 +toTypeName(a): Nullable(Decimal(76, 76)) +b: ᴺᵁᴸᴸ +toTypeName(b): Nullable(Decimal(76, 76)) +``` + +**関連項目** + +- [`toDecimal256`](#todecimal256). +- [`toDecimal256OrZero`](#todecimal256orzero). +- [`toDecimal256OrDefault`](#todecimal256ordefault). + +## toDecimal256OrDefault + +[`toDecimal256`](#todecimal256) と似ており、この関数は、入力値を [Decimal(76, S)](../data-types/decimal.md) 型の値に変換しますが、エラーの場合にはデフォルト値を返します。 + +**構文** + +```sql +toDecimal256OrDefault(expr, S[, default]) +``` + +**引数** + +- `expr` — 数字の文字列表現。[String](../data-types/string.md)。 +- `S` — 小数部分の最大桁数を指定するスケールパラメータ。0から76の範囲。[UInt8](../data-types/int-uint.md)。 +- `default` (オプション) — `Decimal256(S)` 型への変換に失敗した場合に返すデフォルト値。[Decimal256(S)](../data-types/decimal.md)。 + +サポートされる引数: +- 型 (U)Int8/16/32/64/128/256 の文字列表現。 +- 型 Float32/64 の文字列表現。 + +サポートされない引数: +- Float32/64 値 `NaN` および `Inf` の文字列表現。 +- バイナリおよび16進数値の文字列表現、例: `SELECT toDecimal256OrDefault('0xc0fe', 1);`。 + +:::note +`expr` の値が `Decimal256` の範囲を超えるとオーバーフローが発生する可能性があります: `( -1 * 10^(76 - S), 1 * 10^(76 - S) )`。 +分数部分の過剰な桁は切り捨てられます(丸められません)。 +整数部分の過剰な桁はエラーを引き起こします。 +::: + +:::warning +変換は余分な桁を切り捨て、Float32/Float64 入力で作業する際に期待しない動作をすることがあります。操作は浮動小数点命令を使用して実行されます。 +例: `toDecimal256OrDefault(1.15, 2)` は `1.14` に等しくなります。なぜなら、1.15 * 100 は浮動小数点で 114.99 だからです。 +文字列入力を使用することができます。これは、操作が基盤となる整数型を使用するようにします: `toDecimal256OrDefault('1.15', 2) = 1.15` +::: + +**返される値** + +- 成功時には `Decimal(76, S)` 型の値、失敗時にはデフォルト値が指定されていればその値、指定されていなければ `0`。[Decimal256(S)](../data-types/decimal.md)。 + +**例** + +クエリ: + +```sql +SELECT + toDecimal256OrDefault(toString(1/42), 76) AS a, + toTypeName(a), + toDecimal256OrDefault('Inf', 0, CAST('-1', 'Decimal256(0)')) AS b, + toTypeName(b) +FORMAT Vertical; +``` + +結果: + +```response +Row 1: +────── +a: 0.023809523809523808 +toTypeName(a): Decimal(76, 76) +b: -1 +toTypeName(b): Decimal(76, 0) +``` + +**関連項目** + +- [`toDecimal256`](#todecimal256). +- [`toDecimal256OrZero`](#todecimal256orzero). +- [`toDecimal256OrNull`](#todecimal256ornull). + +## toString + +数値、文字列(固定文字列ではない)、日付、および日時間の間で変換するための関数。 +これらのすべての関数は1つの引数を受け入れます。 + +文字列への変換、または文字列から変換する場合、値は TabSeparated 形式(およびほぼすべての他のテキスト形式)の規則を使用してフォーマットまたはパースされます。文字列がパースできない場合、例外がスローされリクエストがキャンセルされます。 + +日付を数値に変換する際、またはその逆の場合、日付はUnixエポックの開始以降の日数に対応します。 +日時間を数値に変換する際、またはその逆の場合、日時間はUnixエポックの開始以降の秒数に対応します。 + +toDate/toDateTime 関数のための日付と日時間のフォーマットは次のように定義されています: + +```response +YYYY-MM-DD +YYYY-MM-DD hh:mm:ss +``` + +例外として、Date に UInt32、Int32、UInt64、または Int64 型から変換し、数が65536以上の場合、数値はUNIXタイムスタンプとして解釈されます(そして日数としては解釈されません)そして、日付に丸められます。これは、 `toDate(unix_timestamp)` を書くという一般的な事例をサポートすることを可能にします。さもなければエラーとなり、より面倒な `toDate(toDateTime(unix_timestamp))` を書かなければなりません。 + +日付と日時間の間の変換は自然な方法で行われます: null 時間を追加するか時間をドロップします。 + +数値型間の変換は C++ における異なる数値型間の代入の規則と同じものを使用します。 + +さらに、DateTime引数の toString 関数は、タイムゾーンの名前を含んだ第二の文字列引数を取ることができます。例: `Asia/Yekaterinburg` この場合、時間は指定されたタイムゾーンに従ってフォーマットされます。 + +**例** + +クエリ: + +``` sql +SELECT + now() AS ts, + time_zone, + toString(ts, time_zone) AS str_tz_datetime +FROM system.time_zones +WHERE time_zone LIKE 'Europe%' +LIMIT 10 +``` + +結果: + +```response +┌──────────────────ts─┬─time_zone─────────┬─str_tz_datetime─────┐ +│ 2023-09-08 19:14:59 │ Europe/Amsterdam │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Andorra │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Astrakhan │ 2023-09-08 23:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Athens │ 2023-09-08 22:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Belfast │ 2023-09-08 20:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Belgrade │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Berlin │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Bratislava │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Brussels │ 2023-09-08 21:14:59 │ +│ 2023-09-08 19:14:59 │ Europe/Bucharest │ 2023-09-08 22:14:59 │ +└─────────────────────┴───────────────────┴─────────────────────┘ +``` + +また、`toUnixTimestamp` 関数も参照してください。 + +## toFixedString + +[String](../data-types/string.md) 型の引数を [FixedString(N)](../data-types/fixedstring.md) 型(固定長 N の文字列)に変換します。 +文字列が N バイト未満の場合、右側にnullバイトが追加されます。文字列が N バイトを超える場合、例外がスローされます。 + +**構文** + +```sql +toFixedString(s, N) +``` + +**引数** + +- `s` — 固定文字列に変換する文字列。[String](../data-types/string.md)。 +- `N` — 長さ N。[UInt8](../data-types/int-uint.md) + +**返される値** + +- 長さ N の `s` の固定文字列。[FixedString](../data-types/fixedstring.md). + +**例** + +クエリ: + +``` sql +SELECT toFixedString('foo', 8) AS s; +``` + +結果: + +```response +┌─s─────────────┐ +│ foo\0\0\0\0\0 │ +└───────────────┘ +``` + +## toStringCutToZero + +String または FixedString 引数を受け付けます。最初に見つかったゼロバイトで内容を切り取った文字列を返します。 + +**構文** + +```sql +toStringCutToZero(s) +``` + +**例** + +クエリ: + +``` sql +SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut; +``` + +結果: + +```response +┌─s─────────────┬─s_cut─┐ +│ foo\0\0\0\0\0 │ foo │ +└───────────────┴───────┘ +``` + +クエリ: + +``` sql +SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut; +``` + +結果: + +```response +┌─s──────────┬─s_cut─┐ +│ foo\0bar\0 │ foo │ +└────────────┴───────┘ +``` + +## toDecimalString + +数値を指定された小数桁数で String に変換します。 + +**構文** + +``` sql +toDecimalString(number, scale) +``` + +**引数** + +- `number` — String として表現される値。[Int, UInt](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Decimal](../data-types/decimal.md)。 +- `scale` — 小数桁数。[UInt8](../data-types/int-uint.md)。 + * [Decimal](../data-types/decimal.md) および [Int, UInt](../data-types/int-uint.md) 型の最大スケールは 77 です(Decimal の有効桁数の最大可能数です)。 + * [Float](../data-types/float.md) の最大スケールは 60 です。 + +**返される値** + +- 指定した桁数(スケール)で入力値を [String](../data-types/string.md) として表現したもの。 + 要求されたスケールが元の数値のスケールより小さい場合、通常の算術に従って四捨五入されます。 + +**例** + +クエリ: + +``` sql +SELECT toDecimalString(CAST('64.32', 'Float64'), 5); +``` + +結果: + +```response +┌toDecimalString(CAST('64.32', 'Float64'), 5)─┐ +│ 64.32000 │ +└─────────────────────────────────────────────┘ +``` + +## reinterpretAsUInt8 + +入力値をUInt8型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt8(x) +``` + +**パラメータ** + +- `x`: UInt8 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt8 として再解釈された値 `x`。[UInt8](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toInt8(257) AS x, + toTypeName(x), + reinterpretAsUInt8(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌─x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 1 │ Int8 │ 1 │ UInt8 │ +└───┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsUInt16 + +入力値をUInt16型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt16(x) +``` + +**パラメータ** + +- `x`: UInt16 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt16 として再解釈された値 `x`。[UInt16](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toUInt8(257) AS x, + toTypeName(x), + reinterpretAsUInt16(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌─x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 1 │ UInt8 │ 1 │ UInt16 │ +└───┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsUInt32 + +入力値をUInt32型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt32(x) +``` + +**パラメータ** + +- `x`: UInt32 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt32 として再解釈された値 `x`。[UInt32](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toUInt16(257) AS x, + toTypeName(x), + reinterpretAsUInt32(x) AS res, + toTypeName(res) +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ UInt16 │ 257 │ UInt32 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsUInt64 + +入力値をUInt64型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt64(x) +``` + +**パラメータ** + +- `x`: UInt64 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt64 として再解釈された値 `x`。[UInt64](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toUInt32(257) AS x, + toTypeName(x), + reinterpretAsUInt64(x) AS res, + toTypeName(res) +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ UInt32 │ 257 │ UInt64 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsUInt128 + +入力値をUInt128型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt128(x) +``` + +**パラメータ** + +- `x`: UInt128 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt128 として再解釈された値 `x`。[UInt128](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toUInt64(257) AS x, + toTypeName(x), + reinterpretAsUInt128(x) AS res, + toTypeName(res) +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ UInt64 │ 257 │ UInt128 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsUInt256 + +入力値をUInt256型の値として扱うことによるバイト再解釈を実行します。[`CAST`](#cast)とは異なり、この関数は元の値を保持しようとせず、ターゲット型が入力型を表現できない場合、出力は無意味です。 + +**構文** + +```sql +reinterpretAsUInt256(x) +``` + +**パラメータ** + +- `x`: UInt256 としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md)、[Float](../data-types/float.md)、[Date](../data-types/date.md)、[DateTime](../data-types/datetime.md)、[UUID](../data-types/uuid.md)、[String](../data-types/string.md)、または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt256 として再解釈された値 `x`。[UInt256](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256). + +**例** + +クエリ: + +```sql +SELECT + toUInt128(257) AS x, + toTypeName(x), + reinterpretAsUInt256(x) AS res, + toTypeName(res) +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ UInt128 │ 257 │ UInt256 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +入力値をUInt256型の値として扱うことでバイトの再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsUInt256(x) +``` + +**パラメータ** + +- `x`: UInt256としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- UInt256として再解釈された値 `x`。 [UInt256](../data-types/int-uint.md/#uint8-uint16-uint32-uint64-uint128-uint256-int8-int16-int32-int64-int128-int256)。 + +**例** + +クエリ: + +```sql +SELECT + toUInt128(257) AS x, + toTypeName(x), + reinterpretAsUInt256(x) AS res, + toTypeName(res) +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ UInt128 │ 257 │ UInt256 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt8 + +入力値をInt8型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt8(x) +``` + +**パラメータ** + +- `x`: Int8としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int8として再解釈された値 `x`。[Int8](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toUInt8(257) AS x, + toTypeName(x), + reinterpretAsInt8(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌─x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 1 │ UInt8 │ 1 │ Int8 │ +└───┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt16 + +入力値をInt16型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt16(x) +``` + +**パラメータ** + +- `x`: Int16としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int16として再解釈された値 `x`。[Int16](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toInt8(257) AS x, + toTypeName(x), + reinterpretAsInt16(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌─x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 1 │ Int8 │ 1 │ Int16 │ +└───┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt32 + +入力値をInt32型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt32(x) +``` + +**パラメータ** + +- `x`: Int32としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int32として再解釈された値 `x`。[Int32](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toInt16(257) AS x, + toTypeName(x), + reinterpretAsInt32(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ Int16 │ 257 │ Int32 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt64 + +入力値をInt64型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt64(x) +``` + +**パラメータ** + +- `x`: Int64としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int64として再解釈された値 `x`。[Int64](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toInt32(257) AS x, + toTypeName(x), + reinterpretAsInt64(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ Int32 │ 257 │ Int64 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt128 + +入力値をInt128型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt128(x) +``` + +**パラメータ** + +- `x`: Int128としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int128として再解釈された値 `x`。[Int128](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toInt64(257) AS x, + toTypeName(x), + reinterpretAsInt128(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ Int64 │ 257 │ Int128 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsInt256 + +入力値をInt256型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsInt256(x) +``` + +**パラメータ** + +- `x`: Int256としてバイト再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Int256として再解釈された値 `x`。[Int256](../data-types/int-uint.md/#int-ranges)。 + +**例** + +クエリ: + +```sql +SELECT + toInt128(257) AS x, + toTypeName(x), + reinterpretAsInt256(x) AS res, + toTypeName(res); +``` + +結果: + +```response +┌───x─┬─toTypeName(x)─┬─res─┬─toTypeName(res)─┐ +│ 257 │ Int128 │ 257 │ Int256 │ +└─────┴───────────────┴─────┴─────────────────┘ +``` + +## reinterpretAsFloat32 + +入力値をFloat32型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsFloat32(x) +``` + +**パラメータ** + +- `x`: Float32として再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Float32として再解釈された値 `x`。[Float32](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT reinterpretAsUInt32(toFloat32(0.2)) as x, reinterpretAsFloat32(x); +``` + +結果: + +```response +┌──────────x─┬─reinterpretAsFloat32(x)─┐ +│ 1045220557 │ 0.2 │ +└────────────┴─────────────────────────┘ +``` + +## reinterpretAsFloat64 + +入力値をFloat64型の値として扱うことでバイト再解釈を行います。[`CAST`](#cast)とは異なり、元の値を保持しようとはしません。ターゲット型が入力型を表現できない場合、出力は無意味になります。 + +**構文** + +```sql +reinterpretAsFloat64(x) +``` + +**パラメータ** + +- `x`: Float64として再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- Float64として再解釈された値 `x`。[Float64](../data-types/float.md)。 + +**例** + +クエリ: + +```sql +SELECT reinterpretAsUInt64(toFloat64(0.2)) as x, reinterpretAsFloat64(x); +``` + +結果: + +```response +┌───────────────────x─┬─reinterpretAsFloat64(x)─┐ +│ 4596373779694328218 │ 0.2 │ +└─────────────────────┴─────────────────────────┘ +``` + +## reinterpretAsDate + +文字列、固定文字列または数値を受け取り、バイトをホスト順(リトルエンディアン)での数値として解釈します。解釈された数値からUnixエポックの始まりからの日数として日付を返します。 + +**構文** + +```sql +reinterpretAsDate(x) +``` + +**パラメータ** + +- `x`: Unixエポックの始まりからの日数。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- 日付。[Date](../data-types/date.md)。 + +**実装の詳細** + +:::note +指定された文字列が十分な長さでない場合、必要な数のヌルバイトでパディングされたかのように動作します。文字列が必要な長さを超えている場合、余分なバイトは無視されます。 +::: + +**例** + +クエリ: + +```sql +SELECT reinterpretAsDate(65), reinterpretAsDate('A'); +``` + +結果: + +```response +┌─reinterpretAsDate(65)─┬─reinterpretAsDate('A')─┐ +│ 1970-03-07 │ 1970-03-07 │ +└───────────────────────┴────────────────────────┘ +``` + +## reinterpretAsDateTime + +これらの関数は文字列を受け取り、文字列の先頭に配置されたバイトをホスト順(リトルエンディアン)での数値として解釈します。Unixエポックの始まりからの秒数として解釈された日時を返します。 + +**構文** + +```sql +reinterpretAsDateTime(x) +``` + +**パラメータ** + +- `x`: Unixエポックの始まりからの秒数。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md), [UUID](../data-types/uuid.md), [String](../data-types/string.md) または [FixedString](../data-types/fixedstring.md)。 + +**返される値** + +- 日付と時刻。[DateTime](../data-types/datetime.md)。 + +**実装の詳細** + +:::note +指定された文字列が十分な長さでない場合、必要な数のヌルバイトでパディングされたかのように動作します。文字列が必要な長さを超えている場合、余分なバイトは無視されます。 +::: + +**例** + +クエリ: + +```sql +SELECT reinterpretAsDateTime(65), reinterpretAsDateTime('A'); +``` + +結果: + +```response +┌─reinterpretAsDateTime(65)─┬─reinterpretAsDateTime('A')─┐ +│ 1970-01-01 01:01:05 │ 1970-01-01 01:01:05 │ +└───────────────────────────┴────────────────────────────┘ +``` + +## reinterpretAsString + +この関数は数値、日付または時刻のある日付を受け取り、ホスト順(リトルエンディアン)で対応する値を表すバイトを含む文字列を返します。末尾のヌルバイトは削除されます。たとえば、UInt32型の値255は1バイト長の文字列です。 + +**構文** + +```sql +reinterpretAsString(x) +``` + +**パラメータ** + +- `x`: 文字列として再解釈する値。[(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md)。 + +**返される値** + +- `x`を表すバイトを含む文字列。[String](../data-types/fixedstring.md)。 + +**例** + +クエリ: + +```sql +SELECT + reinterpretAsString(toDateTime('1970-01-01 01:01:05')), + reinterpretAsString(toDate('1970-03-07')); +``` + +結果: + +```response +┌─reinterpretAsString(toDateTime('1970-01-01 01:01:05'))─┬─reinterpretAsString(toDate('1970-03-07'))─┐ +│ A │ A │ +└────────────────────────────────────────────────────────┴───────────────────────────────────────────┘ +``` + +## reinterpretAsFixedString + +この関数は数値、日付または時刻のある日付を受け取り、ホスト順(リトルエンディアン)で対応する値を表すバイトを含むFixedStringを返します。末尾のヌルバイトは削除されます。たとえば、UInt32型の値255は1バイト長のFixedStringです。 + +**構文** + +```sql +reinterpretAsFixedString(x) +``` + +**パラメータ** + +- `x`: 文字列として再解釈する値。 [(U)Int*](../data-types/int-uint.md), [Float](../data-types/float.md), [Date](../data-types/date.md), [DateTime](../data-types/datetime.md)。 + +**返される値** + +- `x`を表すバイトを含む固定長文字列。[FixedString](../data-types/fixedstring.md)。 + +**例** + +クエリ: + +```sql +SELECT + reinterpretAsFixedString(toDateTime('1970-01-01 01:01:05')), + reinterpretAsFixedString(toDate('1970-03-07')); +``` + +結果: + +```response +┌─reinterpretAsFixedString(toDateTime('1970-01-01 01:01:05'))─┬─reinterpretAsFixedString(toDate('1970-03-07'))─┐ +│ A │ A │ +└─────────────────────────────────────────────────────────────┴────────────────────────────────────────────────┘ +``` + +## reinterpretAsUUID + +:::note +ここに記載されているUUID関数に加えて、専用の[UUID関数ドキュメント](../functions/uuid-functions.md)があります。 +::: + +16バイトの文字列を受け取り、対象の値をネットワークバイトオーダー(ビッグエンディアン)で表すバイトを含むUUIDを返します。文字列が十分な長さでない場合、必要な数のヌルバイトでパディングしたかのように機能します。文字列が16バイトを超える場合、余分なバイトは無視されます。 + +**構文** + +``` sql +reinterpretAsUUID(fixed_string) +``` + +**引数** + +- `fixed_string` — ビッグエンディアンのバイト列。[FixedString](../data-types/fixedstring.md/#fixedstring)。 + +**返される値** + +- UUID型の値。[UUID](../data-types/uuid.md/#uuid-data-type)。 + +**例** + +文字列をUUIDに変換。 + +クエリ: + +``` sql +SELECT reinterpretAsUUID(reverse(unhex('000102030405060708090a0b0c0d0e0f'))); +``` + +結果: + +```response +┌─reinterpretAsUUID(reverse(unhex('000102030405060708090a0b0c0d0e0f')))─┐ +│ 08090a0b-0c0d-0e0f-0001-020304050607 │ +└───────────────────────────────────────────────────────────────────────┘ +``` + +文字列とUUID間で変換。 + +クエリ: + +``` sql +WITH + generateUUIDv4() AS uuid, + identity(lower(hex(reverse(reinterpretAsString(uuid))))) AS str, + reinterpretAsUUID(reverse(unhex(str))) AS uuid2 +SELECT uuid = uuid2; +``` + +結果: + +```response +┌─equals(uuid, uuid2)─┐ +│ 1 │ +└─────────────────────┘ +``` + +## reinterpret + +`x`の値に対して同じソースのインメモリバイト列を使用し、それを目的の型に再解釈します。 + +**構文** + +``` sql +reinterpret(x, type) +``` + +**引数** + +- `x` — 任意の型。 +- `type` — 目的の型。[String](../data-types/string.md)。 + +**返される値** + +- 目的の型の値。 + +**例** + +クエリ: +```sql +SELECT reinterpret(toInt8(-1), 'UInt8') as int_to_uint, + reinterpret(toInt8(1), 'Float32') as int_to_float, + reinterpret('1', 'UInt32') as string_to_int; +``` + +結果: + +``` +┌─int_to_uint─┬─int_to_float─┬─string_to_int─┐ +│ 255 │ 1e-45 │ 49 │ +└─────────────┴──────────────┴───────────────┘ +``` + +## CAST + +入力値を指定されたデータ型に変換します。[reinterpret](#reinterpret)関数とは異なり、`CAST`は新しいデータ型を使用して同じ値を表現しようとします。変換ができない場合、例外が発生します。 +複数の構文バリエーションがサポートされています。 + +**構文** + +``` sql +CAST(x, T) +CAST(x AS t) +x::t +``` + +**引数** + +- `x` — 変換する値。任意の型の可能性があります。 +- `T` — ターゲットデータ型の名前。[String](../data-types/string.md)。 +- `t` — ターゲットデータ型。 + +**返される値** + +- 変換された値。 + +:::note +入力値がターゲット型の範囲に収まらない場合、結果はオーバーフローします。例えば、`CAST(-1, 'UInt8')`は`255`を返します。 +::: + +**例** + +クエリ: + +```sql +SELECT + CAST(toInt8(-1), 'UInt8') AS cast_int_to_uint, + CAST(1.5 AS Decimal(3,2)) AS cast_float_to_decimal, + '1'::Int32 AS cast_string_to_int; +``` + +結果: + +``` +┌─cast_int_to_uint─┬─cast_float_to_decimal─┬─cast_string_to_int─┐ +│ 255 │ 1.50 │ 1 │ +└──────────────────┴───────────────────────┴────────────────────┘ +``` + +クエリ: + +``` sql +SELECT + '2016-06-15 23:00:00' AS timestamp, + CAST(timestamp AS DateTime) AS datetime, + CAST(timestamp AS Date) AS date, + CAST(timestamp, 'String') AS string, + CAST(timestamp, 'FixedString(22)') AS fixed_string; +``` + +結果: + +```response +┌─timestamp───────────┬────────────datetime─┬───────date─┬─string──────────────┬─fixed_string──────────────┐ +│ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00\0\0\0 │ +└─────────────────────┴─────────────────────┴────────────┴─────────────────────┴───────────────────────────┘ +``` + +[FixedString (N)](../data-types/fixedstring.md)への変換は、[String](../data-types/string.md)または[FixedString](../data-types/fixedstring.md)型の引数に対してのみ動作します。 + +[Nullable](../data-types/nullable.md)型への変換やその逆もサポートされています。 + +**例** + +クエリ: + +``` sql +SELECT toTypeName(x) FROM t_null; +``` + +結果: + +```response +┌─toTypeName(x)─┐ +│ Int8 │ +│ Int8 │ +└───────────────┘ +``` + +クエリ: + +``` sql +SELECT toTypeName(CAST(x, 'Nullable(UInt16)')) FROM t_null; +``` + +結果: + +```response +┌─toTypeName(CAST(x, 'Nullable(UInt16)'))─┐ +│ Nullable(UInt16) │ +│ Nullable(UInt16) │ +└─────────────────────────────────────────┘ +``` + +**関連項目** + +- [cast_keep_nullable](../../operations/settings/settings.md/#cast_keep_nullable) 設定 + +## accurateCast(x, T) + +`x`を`T`データ型に変換します。 + +[cast](#cast)との違いは、`accurateCast`は型`T`の範囲内に収まらない数値型のキャストを許可しないことです。たとえば、`accurateCast(-1, 'UInt8')`は例外をスローします。 + +**例** + +クエリ: + +``` sql +SELECT cast(-1, 'UInt8') as uint8; +``` + +結果: + +```response +┌─uint8─┐ +│ 255 │ +└───────┘ +``` + +クエリ: + +```sql +SELECT accurateCast(-1, 'UInt8') as uint8; +``` + +結果: + +```response +Code: 70. DB::Exception: Received from localhost:9000. DB::Exception: Value in column Int8 cannot be safely converted into type UInt8: While processing accurateCast(-1, 'UInt8') AS uint8. +``` + +## accurateCastOrNull(x, T) + +入力値 `x` を指定されたデータ型 `T` に変換します。常に[Nullable](../data-types/nullable.md)型を返し、キャストされた値がターゲット型で表現できない場合は[NULL](../syntax.md/#null-literal)を返します。 + +**構文** + +```sql +accurateCastOrNull(x, T) +``` + +**引数** + +- `x` — 入力値。 +- `T` — 返されるデータ型の名前 + +**返される値** + +- 指定されたデータ型 `T` に変換された値。 + +**例** + +クエリ: + +``` sql +SELECT toTypeName(accurateCastOrNull(5, 'UInt8')); +``` + +結果: + +```response +┌─toTypeName(accurateCastOrNull(5, 'UInt8'))─┐ +│ Nullable(UInt8) │ +└────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT + accurateCastOrNull(-1, 'UInt8') as uint8, + accurateCastOrNull(128, 'Int8') as int8, + accurateCastOrNull('Test', 'FixedString(2)') as fixed_string; +``` + +結果: + +```response +┌─uint8─┬─int8─┬─fixed_string─┐ +│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ +└───────┴──────┴──────────────┘ +``` + +## accurateCastOrDefault(x, T[, default_value]) + +入力値 `x` を指定されたデータ型 `T` に変換します。キャストされた値がターゲット型で表現できない場合、デフォルト型の値または指定された`default_value`を返します。 + +**構文** + +```sql +accurateCastOrDefault(x, T) +``` + +**引数** + +- `x` — 入力値。 +- `T` — 返されるデータ型の名前。 +- `default_value` — 返されるデータ型のデフォルト値。 + +**返される値** + +- 指定されたデータ型 `T` に変換された値。 + +**例** + +クエリ: + +``` sql +SELECT toTypeName(accurateCastOrDefault(5, 'UInt8')); +``` + +結果: + +```response +┌─toTypeName(accurateCastOrDefault(5, 'UInt8'))─┐ +│ UInt8 │ +└───────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT + accurateCastOrDefault(-1, 'UInt8') as uint8, + accurateCastOrDefault(-1, 'UInt8', 5) as uint8_default, + accurateCastOrDefault(128, 'Int8') as int8, + accurateCastOrDefault(128, 'Int8', 5) as int8_default, + accurateCastOrDefault('Test', 'FixedString(2)') as fixed_string, + accurateCastOrDefault('Test', 'FixedString(2)', 'Te') as fixed_string_default; +``` + +結果: + +```response +┌─uint8─┬─uint8_default─┬─int8─┬─int8_default─┬─fixed_string─┬─fixed_string_default─┐ +│ 0 │ 5 │ 0 │ 5 │ │ Te │ +└───────┴───────────────┴──────┴──────────────┴──────────────┴──────────────────────┘ +``` + +## toIntervalYear + +`n`年のデータ型[IntervalYear](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalYear(n) +``` + +**引数** + +- `n` — 年の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`年のインターバル。[IntervalYear](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalYear(1) AS interval_to_year +SELECT date + interval_to_year AS result +``` + +結果: + +```response +┌─────result─┐ +│ 2025-06-15 │ +└────────────┘ +``` + +## toIntervalQuarter + +`n`四半期のデータ型[IntervalQuarter](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalQuarter(n) +``` + +**引数** + +- `n` — 四半期の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`四半期のインターバル。[IntervalQuarter](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalQuarter(1) AS interval_to_quarter +SELECT date + interval_to_quarter AS result +``` + +結果: + +```response +┌─────result─┐ +│ 2024-09-15 │ +└────────────┘ +``` + +## toIntervalMonth + +`n`ヶ月のデータ型[IntervalMonth](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalMonth(n) +``` + +**引数** + +- `n` — 月数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`ヶ月のインターバル。[IntervalMonth](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalMonth(1) AS interval_to_month +SELECT date + interval_to_month AS result +``` + +結果: + +```response +┌─────result─┐ +│ 2024-07-15 │ +└────────────┘ +``` + +## toIntervalWeek + +`n`週のデータ型[IntervalWeek](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalWeek(n) +``` + +**引数** + +- `n` — 週の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`週のインターバル。[IntervalWeek](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalWeek(1) AS interval_to_week +SELECT date + interval_to_week AS result +``` + +結果: + +```response +┌─────result─┐ +│ 2024-06-22 │ +└────────────┘ +``` + +## toIntervalDay + +`n`日のデータ型[IntervalDay](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalDay(n) +``` + +**引数** + +- `n` — 日数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`日のインターバル。[IntervalDay](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalDay(5) AS interval_to_days +SELECT date + interval_to_days AS result +``` + +結果: + +```response +┌─────result─┐ +│ 2024-06-20 │ +└────────────┘ +``` + +## toIntervalHour + +`n`時間のデータ型[IntervalHour](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalHour(n) +``` + +**引数** + +- `n` — 時間の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`時間のインターバル。[IntervalHour](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalHour(12) AS interval_to_hours +SELECT date + interval_to_hours AS result +``` + +結果: + +```response +┌──────────────result─┐ +│ 2024-06-15 12:00:00 │ +└─────────────────────┘ +``` + +## toIntervalMinute + +`n`分のデータ型[IntervalMinute](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalMinute(n) +``` + +**引数** + +- `n` — 分の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`分のインターバル。[IntervalMinute](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalMinute(12) AS interval_to_minutes +SELECT date + interval_to_minutes AS result +``` + +結果: + +```response +┌──────────────result─┐ +│ 2024-06-15 00:12:00 │ +└─────────────────────┘ +``` + +## toIntervalSecond + +`n`秒のデータ型[IntervalSecond](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalSecond(n) +``` + +**引数** + +- `n` — 秒の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`秒のインターバル。[IntervalSecond](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDate('2024-06-15') AS date, + toIntervalSecond(30) AS interval_to_seconds +SELECT date + interval_to_seconds AS result +``` + +結果: + +```response +┌──────────────result─┐ +│ 2024-06-15 00:00:30 │ +└─────────────────────┘ +``` + +## toIntervalMillisecond + +`n`ミリ秒のデータ型[IntervalMillisecond](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalMillisecond(n) +``` + +**引数** + +- `n` — ミリ秒の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`ミリ秒のインターバル。[IntervalMilliseconds](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDateTime('2024-06-15') AS date, + toIntervalMillisecond(30) AS interval_to_milliseconds +SELECT date + interval_to_milliseconds AS result +``` + +結果: + +```response +┌──────────────────result─┐ +│ 2024-06-15 00:00:00.030 │ +└─────────────────────────┘ +``` + +## toIntervalMicrosecond + +`n`マイクロ秒のデータ型[IntervalMicrosecond](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalMicrosecond(n) +``` + +**引数** + +- `n` — マイクロ秒の数。整数またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**返される値** + +- `n`マイクロ秒のインターバル。[IntervalMicrosecond](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDateTime('2024-06-15') AS date, + toIntervalMicrosecond(30) AS interval_to_microseconds +SELECT date + interval_to_microseconds AS result +``` + +結果: + +```response +┌─────────────────────result─┐ +│ 2024-06-15 00:00:00.000030 │ +└────────────────────────────┘ +``` + +## toIntervalNanosecond + +`n`ナノ秒のデータ型[IntervalNanosecond](../data-types/special-data-types/interval.md)を返します。 + +**構文** + +``` sql +toIntervalNanosecond(n) +``` + +**引数** +- `n` — ナノ秒の数。整数値またはその文字列表現、および浮動小数点数。[(U)Int*](../data-types/int-uint.md)/[Float*](../data-types/float.md)/[String](../data-types/string.md)。 + +**戻り値** + +- `n` ナノ秒の間隔。[IntervalNanosecond](../data-types/special-data-types/interval.md)。 + +**例** + +クエリ: + +``` sql +WITH + toDateTime('2024-06-15') AS date, + toIntervalNanosecond(30) AS interval_to_nanoseconds +SELECT date + interval_to_nanoseconds AS result +``` + +結果: + +```response +┌────────────────────────result─┐ +│ 2024-06-15 00:00:00.000000030 │ +└───────────────────────────────┘ +``` + +## parseDateTime + +[MySQL 形式の文字列](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format)に従って[String](../data-types/string.md)を[DateTime](../data-types/datetime.md)に変換します。 + +この関数は[formatDateTime](../functions/date-time-functions.md#date_time_functions-formatDateTime)関数の反対の操作を行います。 + +**構文** + +``` sql +parseDateTime(str[, format[, timezone]]) +``` + +**引数** + +- `str` — 解析される文字列 +- `format` — フォーマット文字列。省略可能。指定しない場合 `%Y-%m-%d %H:%i:%s`。 +- `timezone` — [タイムゾーン](/docs/ja/operations/server-configuration-parameters/settings.md#timezone)。省略可能。 + +**戻り値** + +MySQL 形式のフォーマット文字列に従って入力文字列から解析された DateTime 値を返します。 + +**対応フォーマット指定子** + +[formatDateTime](../functions/date-time-functions.md#date_time_functions-formatDateTime)に記載されたすべてのフォーマット指定子に対応。ただし以下を除く: +- %Q: 四半期 (1-4) + +**例** + +``` sql +SELECT parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s') + +┌─parseDateTime('2021-01-04+23:00:00', '%Y-%m-%d+%H:%i:%s')─┐ +│ 2021-01-04 23:00:00 │ +└───────────────────────────────────────────────────────────┘ +``` + +別名: `TO_TIMESTAMP`. + +## parseDateTimeOrZero + +[parseDateTime](#parsedatetime)と同様ですが、処理できない日付フォーマットに遭遇した場合、ゼロ日付を返します。 + +## parseDateTimeOrNull + +[parseDateTime](#parsedatetime)と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +別名: `str_to_date`. + +## parseDateTimeInJodaSyntax + +[parseDateTime](#parsedatetime)に類似していますが、フォーマット文字列がMySQL構文ではなく[Joda](https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html)である点が異なります。 + +この関数は[formatDateTimeInJodaSyntax](../functions/date-time-functions.md#date_time_functions-formatDateTimeInJodaSyntax)関数の反対の操作を行います。 + +**構文** + +``` sql +parseDateTimeInJodaSyntax(str[, format[, timezone]]) +``` + +**引数** + +- `str` — 解析される文字列 +- `format` — フォーマット文字列。省略可能。指定しない場合、`yyyy-MM-dd HH:mm:ss`。 +- `timezone` — [タイムゾーン](/docs/ja/operations/server-configuration-parameters/settings.md#timezone)。省略可能。 + +**戻り値** + +Joda スタイルのフォーマットに従って入力文字列から解析された DateTime 値を返します。 + +**対応フォーマット指定子** + +[formatDateTimeInJoda](../functions/date-time-functions.md#date_time_functions-formatDateTime)に記載されているすべてのフォーマット指定子に対応。ただし以下を除く: +- S: 秒の小数部分 +- z: タイムゾーン +- Z: タイムゾーンオフセット/ID + +**例** + +``` sql +SELECT parseDateTimeInJodaSyntax('2023-02-24 14:53:31', 'yyyy-MM-dd HH:mm:ss', 'Europe/Minsk') + +┌─parseDateTimeInJodaSyntax('2023-02-24 14:53:31', 'yyyy-MM-dd HH:mm:ss', 'Europe/Minsk')─┐ +│ 2023-02-24 14:53:31 │ +└─────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## parseDateTimeInJodaSyntaxOrZero + +[parseDateTimeInJodaSyntax](#parsedatetimeinjodasyntax)と同様ですが、処理できない日付フォーマットに遭遇した場合、ゼロ日付を返します。 + +## parseDateTimeInJodaSyntaxOrNull + +[parseDateTimeInJodaSyntax](#parsedatetimeinjodasyntax)と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTime64InJodaSyntax + +[parseDateTimeInJodaSyntax](#parsedatetimeinjodasyntax)に類似していますが、型[DateTime64](../data-types/datetime64.md)の値を返す点が異なります。 + +## parseDateTime64InJodaSyntaxOrZero + +[parseDateTime64InJodaSyntax](#parsedatetime64injodasyntax)と同様ですが、処理できない日付フォーマットに遭遇した場合、ゼロ日付を返します。 + +## parseDateTime64InJodaSyntaxOrNull + +[parseDateTime64InJodaSyntax](#parsedatetime64injodasyntax)と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTimeBestEffort +## parseDateTime32BestEffort + +[String](../data-types/string.md)の表現にある日付と時刻を[DateTime](../data-types/datetime.md/#data_type-datetime)データ型に変換します。 + +この関数は、[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)、[RFC 1123 - 5.2.14 RFC-822 日付と時刻の仕様](https://tools.ietf.org/html/rfc1123#page-55)、ClickHouse、およびその他のいくつかの日付と時刻のフォーマットを解析します。 + +**構文** + +``` sql +parseDateTimeBestEffort(time_string [, time_zone]) +``` + +**引数** + +- `time_string` — 変換する日時を含む文字列。[String](../data-types/string.md)。 +- `time_zone` — タイムゾーン。関数は `time_string` をタイムゾーンに従って解析します。[String](../data-types/string.md)。 + +**対応する非標準フォーマット** + +- 9..10 桁の[UNIXタイムスタンプ](https://en.wikipedia.org/wiki/Unix_time)を含む文字列。 +- 日時コンポーネントを含む文字列: `YYYYMMDDhhmmss`, `DD/MM/YYYY hh:mm:ss`, `DD-MM-YY hh:mm`, `YYYY-MM-DD hh:mm:ss`, など。 +- 日付のみで時間コンポーネントを含まない文字列: `YYYY`, `YYYYMM`, `YYYY*MM`, `DD/MM/YYYY`, `DD-MM-YY` など。 +- 日と時間を含む文字列: `DD`, `DD hh`, `DD hh:mm`。この場合、`MM` は `01` に置き換えられます。 +- 日付と時刻に加えてタイムゾーンオフセット情報を含む文字列: `YYYY-MM-DD hh:mm:ss ±h:mm`, など。例: `2020-12-12 17:36:00 -5:00`. +- [syslog タイムスタンプ](https://datatracker.ietf.org/doc/html/rfc3164#section-4.1.2): `Mmm dd hh:mm:ss`。例: `Jun 9 14:20:32`. + +セパレータのあるすべてのフォーマットについて、関数は月の名前を月のフルネームまたは月の名前の最初の三文字で表現したものを解析します。例: `24/DEC/18`, `24-Dec-18`, `01-September-2018`。 +年が指定されていない場合は、現在の年と見なされます。結果の DateTime が未来の時間であった場合(たとえ現在時刻より1秒後であっても)、前年が置き換えられます。 + +**戻り値** + +- `time_string` を変換した [DateTime](../data-types/datetime.md) データ型。 + +**例** + +クエリ: + +``` sql +SELECT parseDateTimeBestEffort('23/10/2020 12:12:57') +AS parseDateTimeBestEffort; +``` + +結果: + +```response +┌─parseDateTimeBestEffort─┐ +│ 2020-10-23 12:12:57 │ +└─────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT parseDateTimeBestEffort('Sat, 18 Aug 2018 07:22:16 GMT', 'Asia/Istanbul') +AS parseDateTimeBestEffort; +``` + +結果: + +```response +┌─parseDateTimeBestEffort─┐ +│ 2018-08-18 10:22:16 │ +└─────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT parseDateTimeBestEffort('1284101485') +AS parseDateTimeBestEffort; +``` + +結果: + +```response +┌─parseDateTimeBestEffort─┐ +│ 2015-07-07 12:04:41 │ +└─────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT parseDateTimeBestEffort('2018-10-23 10:12:12') +AS parseDateTimeBestEffort; +``` + +結果: + +```response +┌─parseDateTimeBestEffort─┐ +│ 2018-10-23 10:12:12 │ +└─────────────────────────┘ +``` + +クエリ: + +``` sql +SELECT toYear(now()) as year, parseDateTimeBestEffort('10 20:19'); +``` + +結果: + +```response +┌─year─┬─parseDateTimeBestEffort('10 20:19')─┐ +│ 2023 │ 2023-01-10 20:19:00 │ +└──────┴─────────────────────────────────────┘ +``` + +クエリ: + +``` sql +WITH + now() AS ts_now, + formatDateTime(ts_around, '%b %e %T') AS syslog_arg +SELECT + ts_now, + syslog_arg, + parseDateTimeBestEffort(syslog_arg) +FROM (SELECT arrayJoin([ts_now - 30, ts_now + 30]) AS ts_around); +``` + +結果: + +```response +┌──────────────ts_now─┬─syslog_arg──────┬─parseDateTimeBestEffort(syslog_arg)─┐ +│ 2023-06-30 23:59:30 │ Jun 30 23:59:00 │ 2023-06-30 23:59:00 │ +│ 2023-06-30 23:59:30 │ Jul 1 00:00:00 │ 2022-07-01 00:00:00 │ +└─────────────────────┴─────────────────┴─────────────────────────────────────┘ +``` + +**関連事項** + +- [RFC 1123](https://datatracker.ietf.org/doc/html/rfc1123) +- [toDate](#todate) +- [toDateTime](#todatetime) +- [ISO 8601 announcement by @xkcd](https://xkcd.com/1179/) +- [RFC 3164](https://datatracker.ietf.org/doc/html/rfc3164#section-4.1.2) + +## parseDateTimeBestEffortUS + +この関数は、[parseDateTimeBestEffort](#parsedatetimebesteffort)と同様に ISO 日付形式、たとえば`YYYY-MM-DD hh:mm:ss`、および年月日が明確に抽出可能な他の日付形式に対して動作します。しかし、年月日があいまいで抽出できない形式(例: `MM/DD/YYYY`, `MM-DD-YYYY`, `MM-DD-YY`)では、`DD/MM/YYYY`, `DD-MM-YYYY`, `DD-MM-YY` の代わりにUS日付形式を優先します。例外として、月が12より大きく、31以下である場合、この関数は[parseDateTimeBestEffort](#parsedatetimebesteffort)の動作にフォールバックします。例えば、`15/08/2020` は `2020-08-15` として解釈されます。 + +## parseDateTimeBestEffortOrNull +## parseDateTime32BestEffortOrNull + +[parseDateTimeBestEffort](#parsedatetimebesteffort)と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTimeBestEffortOrZero +## parseDateTime32BestEffortOrZero + +[parseDateTimeBestEffort](#parsedatetimebesteffort)と同様ですが、処理できない日付フォーマットに遭遇した場合にゼロ日付またはゼロ日時を返します。 + +## parseDateTimeBestEffortUSOrNull + +[parseDateTimeBestEffortUS](#parsedatetimebesteffortus) と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTimeBestEffortUSOrZero + +[parseDateTimeBestEffortUS](#parsedatetimebesteffortus) と同様ですが、処理できない日付フォーマットに遭遇した場合、ゼロ日付 (`1970-01-01`) またはゼロ日付と時間 (`1970-01-01 00:00:00`) を返します。 + +## parseDateTime64BestEffort + +[parseDateTimeBestEffort](#parsedatetimebesteffort) 関数と同様ですが、ミリ秒およびマイクロ秒も解析し、[DateTime](../functions/type-conversion-functions.md/#data_type-datetime) データ型を返します。 + +**構文** + +``` sql +parseDateTime64BestEffort(time_string [, precision [, time_zone]]) +``` + +**引数** + +- `time_string` — 変換する日付または日時を含む文字列。[String](../data-types/string.md)。 +- `precision` — 必要な精度。`3` — ミリ秒用、`6` — マイクロ秒用。デフォルトは`3`。省略可能。[UInt8](../data-types/int-uint.md)。 +- `time_zone` — [タイムゾーン](/docs/ja/operations/server-configuration-parameters/settings.md#timezone)。関数は `time_string` をタイムゾーンに従って解析します。省略可能。[String](../data-types/string.md)。 + +**戻り値** + +- `time_string` を変換した [DateTime](../data-types/datetime.md) データ型。 + +**例** + +クエリ: + +```sql +SELECT parseDateTime64BestEffort('2021-01-01') AS a, toTypeName(a) AS t +UNION ALL +SELECT parseDateTime64BestEffort('2021-01-01 01:01:00.12346') AS a, toTypeName(a) AS t +UNION ALL +SELECT parseDateTime64BestEffort('2021-01-01 01:01:00.12346',6) AS a, toTypeName(a) AS t +UNION ALL +SELECT parseDateTime64BestEffort('2021-01-01 01:01:00.12346',3,'Asia/Istanbul') AS a, toTypeName(a) AS t +FORMAT PrettyCompactMonoBlock; +``` + +結果: + +``` +┌──────────────────────────a─┬─t──────────────────────────────┐ +│ 2021-01-01 01:01:00.123000 │ DateTime64(3) │ +│ 2021-01-01 00:00:00.000000 │ DateTime64(3) │ +│ 2021-01-01 01:01:00.123460 │ DateTime64(6) │ +│ 2020-12-31 22:01:00.123000 │ DateTime64(3, 'Asia/Istanbul') │ +└────────────────────────────┴────────────────────────────────┘ +``` + +## parseDateTime64BestEffortUS + +[parseDateTime64BestEffort](#parsedatetime64besteffort)と同様ですが、この関数はあいまいな場合にUS日時形式 (`MM/DD/YYYY` など) を優先します。 + +## parseDateTime64BestEffortOrNull + +[parseDateTime64BestEffort](#parsedatetime64besteffort)と同様ですが、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTime64BestEffortOrZero + +[parseDateTime64BestEffort](#parsedatetime64besteffort)と同様ですが、処理できない日付フォーマットに遭遇した場合にゼロ日付またはゼロ日時を返します。 + +## parseDateTime64BestEffortUSOrNull + +[parseDateTime64BestEffort](#parsedatetime64besteffort)と同様ですが、あいまいな場合にUS日時形式を優先し、処理できない日付フォーマットに遭遇した場合、`NULL`を返します。 + +## parseDateTime64BestEffortUSOrZero + +[parseDateTime64BestEffort](#parsedatetime64besteffort)と同様ですが、あいまいな場合にUS日時形式を優先し、処理できない日付フォーマットに遭遇した場合にゼロ日付またはゼロ日時を返します。 + +## toLowCardinality + +入力パラメータを同じデータ型の[LowCardinality](../data-types/lowcardinality.md)バージョンに変換します。 + +`LowCardinality` データ型からデータを変換するには [CAST](#cast) 関数を使用します。例: `CAST(x as String)`。 + +**構文** + +```sql +toLowCardinality(expr) +``` + +**引数** + +- `expr` — 一つの [対応データ型](../data-types/index.md/#data_types) を結果とする[式](../syntax.md/#syntax-expressions)。 + +**戻り値** + +- `expr` の結果。[LowCardinality](../data-types/lowcardinality.md) の `expr` の型の結果。 + +**例** + +クエリ: + +```sql +SELECT toLowCardinality('1'); +``` + +結果: + +```response +┌─toLowCardinality('1')─┐ +│ 1 │ +└───────────────────────┘ +``` + +## toUnixTimestamp64Milli + +`DateTime64` を固定のミリ秒精度で `Int64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +出力値は `DateTime64` のタイムゾーンではなく、UTCのタイムスタンプです。 +::: + +**構文** + +```sql +toUnixTimestamp64Milli(value) +``` + +**引数** + +- `value` — 任意の精度の DateTime64 値。[DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +- `Int64` データ型に変換された `value`。[Int64](../data-types/int-uint.md). + +**例** + +クエリ: + +```sql +WITH toDateTime64('2009-02-13 23:31:31.011', 3, 'UTC') AS dt64 +SELECT toUnixTimestamp64Milli(dt64); +``` + +結果: + +```response +┌─toUnixTimestamp64Milli(dt64)─┐ +│ 1234567891011 │ +└──────────────────────────────┘ +``` + +## toUnixTimestamp64Micro + +`DateTime64` を固定のマイクロ秒精度で `Int64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +出力値は `DateTime64` のタイムゾーンではなく、UTCのタイムスタンプです。 +::: + +**構文** + +```sql +toUnixTimestamp64Micro(value) +``` + +**引数** + +- `value` — 任意の精度の DateTime64 値。[DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +- `Int64` データ型に変換された `value`。[Int64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +WITH toDateTime64('1970-01-15 06:56:07.891011', 6, 'UTC') AS dt64 +SELECT toUnixTimestamp64Micro(dt64); +``` + +結果: + +```response +┌─toUnixTimestamp64Micro(dt64)─┐ +│ 1234567891011 │ +└──────────────────────────────┘ +``` + +## toUnixTimestamp64Nano + +`DateTime64` を固定のナノ秒精度で `Int64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +出力値は `DateTime64` のタイムゾーンではなく、UTCのタイムスタンプです。 +::: + +**構文** + +```sql +toUnixTimestamp64Nano(value) +``` + +**引数** + +- `value` — 任意の精度の DateTime64 値。[DateTime64](../data-types/datetime64.md)。 + +**戻り値** + +- `Int64` データ型に変換された `value`。[Int64](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +WITH toDateTime64('1970-01-01 00:20:34.567891011', 9, 'UTC') AS dt64 +SELECT toUnixTimestamp64Nano(dt64); +``` + +結果: + +```response +┌─toUnixTimestamp64Nano(dt64)─┐ +│ 1234567891011 │ +└─────────────────────────────┘ +``` + +## fromUnixTimestamp64Milli + +`Int64` を固定のミリ秒精度と任意のタイムゾーンを持つ `DateTime64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +入力値は指定された(または暗黙の)タイムゾーンではなく、UTCのタイムスタンプとして扱われます。 +::: + +**構文** + +``` sql +fromUnixTimestamp64Milli(value[, timezone]) +``` + +**引数** + +- `value` — 任意の精度の値。[Int64](../data-types/int-uint.md)。 +- `timezone` — (オプション)結果のタイムゾーン名。[String](../data-types/string.md)。 + +**戻り値** + +- `3` の精度を持つ DateTime64 に変換された `value`。[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +``` sql +WITH CAST(1234567891011, 'Int64') AS i64 +SELECT + fromUnixTimestamp64Milli(i64, 'UTC') AS x, + toTypeName(x); +``` + +結果: + +```response +┌───────────────────────x─┬─toTypeName(x)────────┐ +│ 2009-02-13 23:31:31.011 │ DateTime64(3, 'UTC') │ +└─────────────────────────┴──────────────────────┘ +``` + +## fromUnixTimestamp64Micro + +`Int64` を固定のマイクロ秒精度と任意のタイムゾーンを持つ `DateTime64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +入力値は指定された(または暗黙の)タイムゾーンではなく、UTCのタイムスタンプとして扱われます。 +::: + +**構文** + +``` sql +fromUnixTimestamp64Micro(value[, timezone]) +``` + +**引数** + +- `value` — 任意の精度の値。[Int64](../data-types/int-uint.md)。 +- `timezone` — (オプション)結果のタイムゾーン名。[String](../data-types/string.md)。 + +**戻り値** + +- `6` の精度を持つ DateTime64 に変換された `value`。[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +``` sql +WITH CAST(1234567891011, 'Int64') AS i64 +SELECT + fromUnixTimestamp64Micro(i64, 'UTC') AS x, + toTypeName(x); +``` + +結果: + +```response +┌──────────────────────────x─┬─toTypeName(x)────────┐ +│ 1970-01-15 06:56:07.891011 │ DateTime64(6, 'UTC') │ +└────────────────────────────┴──────────────────────┘ +``` + +## fromUnixTimestamp64Nano + +`Int64` を固定のナノ秒精度と任意のタイムゾーンを持つ `DateTime64` 値に変換します。入力値はその精度に応じて適切にスケーリングされます。 + +:::note +入力値は指定された(または暗黙の)タイムゾーンではなく、UTCのタイムスタンプとして扱われます。 +::: + +**構文** + +``` sql +fromUnixTimestamp64Nano(value[, timezone]) +``` + +**引数** + +- `value` — 任意の精度の値。[Int64](../data-types/int-uint.md)。 +- `timezone` — (オプション)結果のタイムゾーン名。[String](../data-types/string.md)。 + +**戻り値** + +- `9` の精度を持つ DateTime64 に変換された `value`。[DateTime64](../data-types/datetime64.md)。 + +**例** + +クエリ: + +``` sql +WITH CAST(1234567891011, 'Int64') AS i64 +SELECT + fromUnixTimestamp64Nano(i64, 'UTC') AS x, + toTypeName(x); +``` + +結果: + +```response +┌─────────────────────────────x─┬─toTypeName(x)────────┐ +│ 1970-01-01 00:20:34.567891011 │ DateTime64(9, 'UTC') │ +└───────────────────────────────┴──────────────────────┘ +``` + +## formatRow + +任意の式を指定されたフォーマットを使って文字列に変換します。 + +**構文** + +``` sql +formatRow(format, x, y, ...) +``` + +**引数** + +- `format` — テキストフォーマット。例: [CSV](/docs/ja/interfaces/formats.md/#csv), [TSV](/docs/ja/interfaces/formats.md/#tabseparated)。 +- `x`,`y`, ... — 式。 + +**戻り値** + +- フォーマットされた文字列。(テキストフォーマットの場合、通常は改行文字で終わります)。 + +**例** + +クエリ: + +``` sql +SELECT formatRow('CSV', number, 'good') +FROM numbers(3); +``` + +結果: + +```response +┌─formatRow('CSV', number, 'good')─┐ +│ 0,"good" + │ +│ 1,"good" + │ +│ 2,"good" + │ +└──────────────────────────────────┘ +``` + +**注意**: フォーマットに接尾辞/接頭辞が含まれる場合、それは各行に書き込まれます。 + +**例** + +クエリ: + +``` sql +SELECT formatRow('CustomSeparated', number, 'good') +FROM numbers(3) +SETTINGS format_custom_result_before_delimiter='\n', format_custom_result_after_delimiter='' +``` + +結果: + +```response +┌─formatRow('CustomSeparated', number, 'good')─┐ +│ +0 good + │ +│ +1 good + │ +│ +2 good + │ +└──────────────────────────────────────────────┘ +``` + +注: この関数でサポートされているのは、行ベースのフォーマットのみです。 + +## formatRowNoNewline + +任意の式を指定されたフォーマットを使って文字列に変換します。formatRow との違いは、この関数が最後の `\n` を取り除くことです。 + +**構文** + +``` sql +formatRowNoNewline(format, x, y, ...) +``` + +**引数** + +- `format` — テキストフォーマット。例: [CSV](/docs/ja/interfaces/formats.md/#csv), [TSV](/docs/ja/interfaces/formats.md/#tabseparated)。 +- `x`,`y`, ... — 式。 + +**戻り値** + +- フォーマットされた文字列。 + +**例** + +クエリ: + +``` sql +SELECT formatRowNoNewline('CSV', number, 'good') +FROM numbers(3); +``` + +結果: + +```response +┌─formatRowNoNewline('CSV', number, 'good')─┐ +│ 0,"good" │ +│ 1,"good" │ +│ 2,"good" │ +└───────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/udf.md b/docs/ja/sql-reference/functions/udf.md new file mode 100644 index 00000000000..f3ec0bdb9df --- /dev/null +++ b/docs/ja/sql-reference/functions/udf.md @@ -0,0 +1,247 @@ +--- +slug: /ja/sql-reference/functions/udf +sidebar_position: 15 +sidebar_label: UDF +--- + +# UDF ユーザー定義関数 + +## 実行可能ユーザー定義関数 +ClickHouseは、データを処理するために任意の外部実行可能プログラムやスクリプトを呼び出すことができます。 + +実行可能ユーザー定義関数の設定は、1つ以上のxmlファイルに記述できます。設定へのパスは、[user_defined_executable_functions_config](../../operations/server-configuration-parameters/settings.md#user_defined_executable_functions_config) パラメータで指定します。 + +関数設定には以下の設定が含まれます: + +- `name` - 関数名。 +- `command` - 実行するスクリプト名または`execute_direct`がfalseの場合はコマンド。 +- `argument` - 引数の説明には、`type`とオプションの引数`name`が含まれます。引数はそれぞれ個別に記述します。[Native](../../interfaces/formats.md#native) または [JSONEachRow](../../interfaces/formats.md#jsoneachrow) のようなユーザー定義関数形式のシリアル化の一部である場合、名前の指定が必要です。デフォルトの引数名の値は `c` + 引数番号です。 +- `format` - コマンドに渡す引数の[形式](../../interfaces/formats.md)です。 +- `return_type` - 返される値の型。 +- `return_name` - 返される値の名前。[Native](../../interfaces/formats.md#native)や[JSONEachRow](../../interfaces/formats.md#jsoneachrow)といったユーザー定義関数形式のシリアル化の一部である場合、返される名前の指定が必要です。オプション。デフォルト値は `result` です。 +- `type` - 実行可能なタイプ。`type`が `executable` に設定されている場合、単一のコマンドが開始されます。`executable_pool` に設定されている場合、コマンドのプールが作成されます。 +- `max_command_execution_time` - データブロックを処理するための最大実行時間(秒)。この設定は `executable_pool` コマンドに対してのみ有効です。オプション。デフォルト値は `10` です。 +- `command_termination_timeout` - パイプが閉じた後、コマンドが終了するまでの時間(秒)。その後、コマンドを実行するプロセスに `SIGTERM` が送信されます。オプション。デフォルト値は `10` です。 +- `command_read_timeout` - コマンドの標準出力からデータを読み込むタイムアウト(ミリ秒)。デフォルト値は 10000。オプション。 +- `command_write_timeout` - コマンドの標準入力にデータを書き込むタイムアウト(ミリ秒)。デフォルト値は 10000。オプション。 +- `pool_size` - コマンドプールのサイズ。オプション。デフォルト値は `16`。 +- `send_chunk_header` - 処理するデータチャンクを送信する前に行数を送信するかどうかを制御します。オプション。デフォルト値は `false`。 +- `execute_direct` - `execute_direct` = `1` の場合、`command` は [user_scripts_path](../../operations/server-configuration-parameters/settings.md#user_scripts_path) で指定されたユーザースクリプトフォルダー内で検索されます。追加のスクリプト引数は空白区切りで指定できます。例: `script_name arg1 arg2`。`execute_direct` = `0` の場合、`command` は `bin/sh -c` の引数として渡されます。デフォルト値は `1`。オプション。 +- `lifetime` - 関数のリロード間隔(秒)。`0` に設定されている場合、関数はリロードされません。デフォルト値は `0`。オプション。 + +コマンドは `STDIN` から引数を読み取り、`STDOUT` に結果を出力する必要があります。コマンドは引数を反復処理する必要があります。つまり、引数のチャンクを処理した後、次のチャンクを待たなければなりません。 + +**例** + +XML設定を使用して `test_function` を作成します。 +ファイル `test_function.xml`(デフォルトパス設定の場合 `/etc/clickhouse-server/test_function.xml`)。 +```xml + + + executable + test_function_python + String + + UInt64 + value + + TabSeparated + test_function.py + + +``` + +`user_scripts` フォルダー内のスクリプトファイル `test_function.py`(デフォルトパス設定の場合 `/var/lib/clickhouse/user_scripts/test_function.py`)。 + +```python +#!/usr/bin/python3 + +import sys + +if __name__ == '__main__': + for line in sys.stdin: + print("Value " + line, end='') + sys.stdout.flush() +``` + +クエリ: + +``` sql +SELECT test_function_python(toUInt64(2)); +``` + +結果: + +``` text +┌─test_function_python(2)─┐ +│ Value 2 │ +└─────────────────────────┘ +``` + +手動で `execute_direct` を `0` に指定して `test_function_sum` を作成します。 +ファイル `test_function.xml`(デフォルトパス設定の場合 `/etc/clickhouse-server/test_function.xml`)。 +```xml + + + executable + test_function_sum + UInt64 + + UInt64 + lhs + + + UInt64 + rhs + + TabSeparated + cd /; clickhouse-local --input-format TabSeparated --output-format TabSeparated --structure 'x UInt64, y UInt64' --query "SELECT x + y FROM table" + 0 + + +``` + +クエリ: + +``` sql +SELECT test_function_sum(2, 2); +``` + +結果: + +``` text +┌─test_function_sum(2, 2)─┐ +│ 4 │ +└─────────────────────────┘ +``` + +XML設定を使用し、名前付き引数と形式 [JSONEachRow](../../interfaces/formats.md#jsoneachrow) で `test_function_sum_json` を作成します。 +ファイル `test_function.xml`(デフォルトパス設定の場合 `/etc/clickhouse-server/test_function.xml`)。 +```xml + + + executable + test_function_sum_json + UInt64 + result_name + + UInt64 + argument_1 + + + UInt64 + argument_2 + + JSONEachRow + test_function_sum_json.py + + +``` + +`user_scripts` フォルダー内のスクリプトファイル `test_function_sum_json.py`(デフォルトパス設定の場合 `/var/lib/clickhouse/user_scripts/test_function_sum_json.py`)。 + +```python +#!/usr/bin/python3 + +import sys +import json + +if __name__ == '__main__': + for line in sys.stdin: + value = json.loads(line) + first_arg = int(value['argument_1']) + second_arg = int(value['argument_2']) + result = {'result_name': first_arg + second_arg} + print(json.dumps(result), end='\n') + sys.stdout.flush() +``` + +クエリ: + +``` sql +SELECT test_function_sum_json(2, 2); +``` + +結果: + +``` text +┌─test_function_sum_json(2, 2)─┐ +│ 4 │ +└──────────────────────────────┘ +``` + +実行可能なユーザー定義関数は、コマンド設定で構成された定数パラメータを受け取ることができます(`executable` タイプのユーザー定義関数のみで使用可能)。また、`execute_direct` オプションが必要です(シェル引数展開の脆弱性を防ぐため)。 +ファイル `test_function_parameter_python.xml`(デフォルトパス設定の場合 `/etc/clickhouse-server/test_function_parameter_python.xml`)。 +```xml + + + executable + true + test_function_parameter_python + String + + UInt64 + + TabSeparated + test_function_parameter_python.py {test_parameter:UInt64} + + +``` + +`user_scripts` フォルダー内のスクリプトファイル `test_function_parameter_python.py`(デフォルトパス設定の場合 `/var/lib/clickhouse/user_scripts/test_function_parameter_python.py`)。 + +```python +#!/usr/bin/python3 + +import sys + +if __name__ == "__main__": + for line in sys.stdin: + print("Parameter " + str(sys.argv[1]) + " value " + str(line), end="") + sys.stdout.flush() +``` + +クエリ: + +``` sql +SELECT test_function_parameter_python(1)(2); +``` + +結果: + +``` text +┌─test_function_parameter_python(1)(2)─┐ +│ Parameter 1 value 2 │ +└──────────────────────────────────────┘ +``` + +## エラー処理 + +いくつかの関数はデータが無効な場合、例外を投げる可能性があります。この場合、クエリはキャンセルされ、エラーテキストがクライアントに返されます。分散処理の場合、サーバーの1つで例外が発生すると、他のサーバーもクエリを中止しようとします。 + +## 引数式の評価 + +ほとんどのプログラミング言語では、特定の演算子に対して引数の1つが評価されないことがあります。これは通常、演算子 `&&`、`||`、および `?:` です。しかし、ClickHouseでは関数(演算子)の引数は常に評価されます。これは、各行を個別に計算する代わりに、カラムの全体を一度に評価するためです。 + +## 分散クエリ処理用の関数の実行 + +分散クエリ処理の場合、可能な限り多くのクエリ処理段階がリモートサーバー上で実行され、残りの段階(中間結果のマージおよびそれ以降すべて)はリクエストサーバー上で実行されます。 + +これは、関数が異なるサーバーで実行されることを意味します。 +例として、クエリ `SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),` + +- `distributed_table` に少なくとも2つのシャードがある場合、関数「g」と「h」はリモートサーバー上で実行され、「f」はリクエストサーバー上で実行されます。 +- `distributed_table` に1つのシャードしかない場合、すべての「f」、「g」、および「h」関数はこのシャードのサーバー上で実行されます。 + +関数の結果は通常、実行されるサーバーに依存しません。しかし、時にはこれは重要です。 +たとえばDictionaryを操作する関数は、それが実行されているサーバー上に存在するDictionaryを使用します。別の例は、`hostName` 関数で、これは `SELECT` クエリでサーバーごとに `GROUP BY` を行うために実行されているサーバーの名前を返します。 + +クエリ内の関数がリクエストサーバー上で実行されているが、リモートサーバー上で実行する必要がある場合、`any` 集約関数でラップしたり、`GROUP BY` のキーに追加したりすることができます。 + +## SQL ユーザー定義関数 + +ラムダ式からカスタム関数を作成するには、[CREATE FUNCTION](../statements/create/function.md) ステートメントを使用します。これらの関数を削除するには、[DROP FUNCTION](../statements/drop.md#drop-function) ステートメントを使用します。 + +## 関連コンテンツ + +### [ClickHouse Cloudのユーザー定義関数に関する記事](https://clickhouse.com/blog/user-defined-functions-clickhouse-udfs) diff --git a/docs/ja/sql-reference/functions/ulid-functions.md b/docs/ja/sql-reference/functions/ulid-functions.md new file mode 100644 index 00000000000..7014e9fd4f7 --- /dev/null +++ b/docs/ja/sql-reference/functions/ulid-functions.md @@ -0,0 +1,84 @@ +--- +slug: /ja/sql-reference/functions/ulid-functions +sidebar_position: 190 +sidebar_label: ULID +--- + +# ULIDを扱うための関数 + +## generateULID + +[ULID](https://github.com/ulid/spec)を生成します。 + +**構文** + +``` sql +generateULID([x]) +``` + +**引数** + +- `x` — [サポートされるデータ型](../data-types/index.md#data_types)のいずれかを結果とする[式](../../sql-reference/syntax.md#syntax-expressions)。結果の値は破棄されますが、関数が1つのクエリ内で複数回呼び出されたときに[共通部分式除去 (CSE)](../../sql-reference/functions/index.md#common-subexpression-elimination)をバイパスするために使用されます。オプションの引数です。 + +**戻り値** + +[FixedString](../data-types/fixedstring.md)型の値。 + +**使用例** + +``` sql +SELECT generateULID() +``` + +``` text +┌─generateULID()─────────────┐ +│ 01GNB2S2FGN2P93QPXDNB4EN2R │ +└────────────────────────────┘ +``` + +**1行に複数の値を生成する必要がある場合の使用例** + +```sql +SELECT generateULID(1), generateULID(2) +``` + +``` text +┌─generateULID(1)────────────┬─generateULID(2)────────────┐ +│ 01GNB2SGG4RHKVNT9ZGA4FFMNP │ 01GNB2SGG4V0HMQVH4VBVPSSRB │ +└────────────────────────────┴────────────────────────────┘ +``` + +## ULIDStringToDateTime + +この関数はULIDからタイムスタンプを抽出します。 + +**構文** + +``` sql +ULIDStringToDateTime(ulid[, timezone]) +``` + +**引数** + +- `ulid` — 入力ULID。[String](../data-types/string.md)または[FixedString(26)](../data-types/fixedstring.md)。 +- `timezone` — 返される値のための[タイムゾーン名](../../operations/server-configuration-parameters/settings.md#timezone)(オプション)。[String](../data-types/string.md)。 + +**戻り値** + +- ミリ秒精度のタイムスタンプ。[DateTime64(3)](../data-types/datetime64.md)。 + +**使用例** + +``` sql +SELECT ULIDStringToDateTime('01GNB2S2FGN2P93QPXDNB4EN2R') +``` + +``` text +┌─ULIDStringToDateTime('01GNB2S2FGN2P93QPXDNB4EN2R')─┐ +│ 2022-12-28 00:40:37.616 │ +└────────────────────────────────────────────────────┘ +``` + +## 関連項目 + +- [UUID](../../sql-reference/functions/uuid-functions.md) diff --git a/docs/ja/sql-reference/functions/uniqtheta-functions.md b/docs/ja/sql-reference/functions/uniqtheta-functions.md new file mode 100644 index 00000000000..8147c0d55d9 --- /dev/null +++ b/docs/ja/sql-reference/functions/uniqtheta-functions.md @@ -0,0 +1,96 @@ +--- +slug: /ja/sql-reference/functions/uniqtheta-functions +sidebar_position: 210 +sidebar_label: uniqTheta +--- + +# uniqTheta 関数 + +uniqTheta 関数は、2つの uniqThetaSketch オブジェクトに対して集合操作計算(∪ / ∩ / × のような操作)を実行し、その結果を含む新しい uniqThetaSketch オブジェクトを返します。 + +uniqThetaSketch オブジェクトは、-State を伴う集約関数 uniqTheta によって構築されます。 + +UniqThetaSketch は近似値セットのデータ構造ストレージです。 +RoaringBitmap の詳細については、[Theta Sketch Framework](https://datasketches.apache.org/docs/Theta/ThetaSketchFramework.html) を参照してください。 + +## uniqThetaUnion + +2つの uniqThetaSketch オブジェクトに対して union 計算(集合操作 ∪)を実行し、その結果は新しい uniqThetaSketch です。 + +``` sql +uniqThetaUnion(uniqThetaSketch,uniqThetaSketch) +``` + +**引数** + +- `uniqThetaSketch` – uniqThetaSketch オブジェクト。 + +**例** + +``` sql +select finalizeAggregation(uniqThetaUnion(a, b)) as a_union_b, finalizeAggregation(a) as a_cardinality, finalizeAggregation(b) as b_cardinality +from +(select arrayReduce('uniqThetaState',[1,2]) as a, arrayReduce('uniqThetaState',[2,3,4]) as b ); +``` + +``` text +┌─a_union_b─┬─a_cardinality─┬─b_cardinality─┐ +│ 4 │ 2 │ 3 │ +└───────────┴───────────────┴───────────────┘ +``` + +## uniqThetaIntersect + +2つの uniqThetaSketch オブジェクトに対して intersect 計算(集合操作 ∩)を実行し、その結果は新しい uniqThetaSketch です。 + +``` sql +uniqThetaIntersect(uniqThetaSketch,uniqThetaSketch) +``` + +**引数** + +- `uniqThetaSketch` – uniqThetaSketch オブジェクト。 + +**例** + +``` sql +select finalizeAggregation(uniqThetaIntersect(a, b)) as a_intersect_b, finalizeAggregation(a) as a_cardinality, finalizeAggregation(b) as b_cardinality +from +(select arrayReduce('uniqThetaState',[1,2]) as a, arrayReduce('uniqThetaState',[2,3,4]) as b ); +``` + +``` text +┌─a_intersect_b─┬─a_cardinality─┬─b_cardinality─┐ +│ 1 │ 2 │ 3 │ +└───────────────┴───────────────┴───────────────┘ +``` + +## uniqThetaNot + +2つの uniqThetaSketch オブジェクトに対して a_not_b 計算(集合操作 ×)を実行し、その結果は新しい uniqThetaSketch です。 + +``` sql +uniqThetaNot(uniqThetaSketch,uniqThetaSketch) +``` + +**引数** + +- `uniqThetaSketch` – uniqThetaSketch オブジェクト。 + +**例** + +``` sql +select finalizeAggregation(uniqThetaNot(a, b)) as a_not_b, finalizeAggregation(a) as a_cardinality, finalizeAggregation(b) as b_cardinality +from +(select arrayReduce('uniqThetaState',[2,3,4]) as a, arrayReduce('uniqThetaState',[1,2]) as b ); +``` + +``` text +┌─a_not_b─┬─a_cardinality─┬─b_cardinality─┐ +│ 2 │ 3 │ 2 │ +└─────────┴───────────────┴───────────────┘ +``` + +**参照** + +- [uniqThetaSketch](../../sql-reference/aggregate-functions/reference/uniqthetasketch.md#agg_function-uniqthetasketch) diff --git a/docs/ja/sql-reference/functions/url-functions.md b/docs/ja/sql-reference/functions/url-functions.md new file mode 100644 index 00000000000..07222ed2d78 --- /dev/null +++ b/docs/ja/sql-reference/functions/url-functions.md @@ -0,0 +1,1056 @@ +--- +slug: /ja/sql-reference/functions/url-functions +sidebar_position: 200 +sidebar_label: URLs +--- + +# URLを扱う関数 + +:::note +このセクションで言及している関数は、最大のパフォーマンスのために最適化されており、ほとんどの場合、RFC-3986標準に従いません。RFC-3986を実装している関数には、関数名の末尾に`RFC`が付いており、一般的に動作は遅くなります。 +::: + +一般に、ユーザー文字列や`@`記号を含まない公的に登録されたドメインを扱う場合、`RFC`でない関数の変種を使用できます。以下の表は、各`RFC`および非`RFC`変種によってURL内のどのシンボルを解析できる(`✔`)か、またはできない(`✗`)かを示しています: + +|記号 | 非`RFC` | `RFC` | +|-------|----------|-------| +| ' ' | ✗ |✗ | +| \t | ✗ |✗ | +| < | ✗ |✗ | +| > | ✗ |✗ | +| % | ✗ |✔* | +| { | ✗ |✗ | +| } | ✗ |✗ | +| \| | ✗ |✗ | +| \\\ | ✗ |✗ | +| ^ | ✗ |✗ | +| ~ | ✗ |✔* | +| [ | ✗ |✗ | +| ] | ✗ |✔ | +| ; | ✗ |✔* | +| = | ✗ |✔* | +| & | ✗ |✔* | + +`*`が付いているシンボルは、RFC 3986におけるサブデリミタであり、`@`記号に続くユーザー情報に許可されています。 + +## URLの一部を抽出する関数 + +URLに関連する部分が存在しない場合、空の文字列が返されます。 + +### protocol + +URLからプロトコルを抽出します。 + +一般的に返される値の例: http, https, ftp, mailto, tel, magnet。 + +### domain + +URLからホスト名を抽出します。 + +**構文** + +``` sql +domain(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +プロトコルをつけてもつけなくても指定できます。例: + +``` text +svn+ssh://some.svn-hosting.com:80/repo/trunk +some.svn-hosting.com:80/repo/trunk +https://clickhouse.com/time/ +``` + +これらの例に対して、`domain`関数は以下の結果を返します: + +``` text +some.svn-hosting.com +some.svn-hosting.com +clickhouse.com +``` + +**返される値** + +- 入力文字列がURLとして解析できる場合はホスト名、そうでない場合は空の文字列。 [String](../data-types/string.md)。 + +**例** + +``` sql +SELECT domain('svn+ssh://some.svn-hosting.com:80/repo/trunk'); +``` + +``` text +┌─domain('svn+ssh://some.svn-hosting.com:80/repo/trunk')─┐ +│ some.svn-hosting.com │ +└────────────────────────────────────────────────────────┘ +``` + +### domainRFC + +URLからホスト名を抽出します。[domain](#domain)と似ていますが、RFC 3986に準拠しています。 + +**構文** + +``` sql +domainRFC(url) +``` + +**引数** + +- `url` — URL。 [String](../data-types/string.md)。 + +**返される値** + +- 入力文字列がURLとして解析できる場合はホスト名、そうでない場合は空の文字列。 [String](../data-types/string.md)。 + +**例** + +``` sql +SELECT + domain('http://user:password@example.com:8080/path?query=value#fragment'), + domainRFC('http://user:password@example.com:8080/path?query=value#fragment'); +``` + +``` text +┌─domain('http://user:password@example.com:8080/path?query=value#fragment')─┬─domainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐ +│ │ example.com │ +└───────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────┘ +``` + +### domainWithoutWWW + +先頭の`www.`を除いたドメインを返します。 + +**構文** + +```sql +domainWithoutWWW(url) +``` + +**引数** + +- `url` — URL。 [String](../data-types/string.md)。 + +**返される値** + +- 入力文字列がURLとして解析できる場合はドメイン名(先頭の`www.`を除く)、そうでない場合は空の文字列。 [String](../data-types/string.md)。 + +**例** + +``` sql +SELECT domainWithoutWWW('http://paul@www.example.com:80/'); +``` + +``` text +┌─domainWithoutWWW('http://paul@www.example.com:80/')─┐ +│ example.com │ +└─────────────────────────────────────────────────────┘ +``` + +### domainWithoutWWWRFC + +先頭の`www.`を除いたドメインを返します。[domainWithoutWWW](#domainwithoutwww)と似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +domainWithoutWWWRFC(url) +``` + +**引数** + +- `url` — URL。 [String](../data-types/string.md)。 + +**返される値** + +- 入力文字列がURLとして解析できる場合はドメイン名(先頭の`www.`を除く)、そうでない場合は空の文字列。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment'), + domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment'); +``` + +結果: + +```response +┌─domainWithoutWWW('http://user:password@www.example.com:8080/path?query=value#fragment')─┬─domainWithoutWWWRFC('http://user:password@www.example.com:8080/path?query=value#fragment')─┐ +│ │ example.com │ +└─────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### topLevelDomain + +URLからトップレベルドメインを抽出します。 + +``` sql +topLevelDomain(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +:::note +プロトコルをつけてもつけなくても指定できます。例: + +``` text +svn+ssh://some.svn-hosting.com:80/repo/trunk +some.svn-hosting.com:80/repo/trunk +https://clickhouse.com/time/ +``` +::: + +**返される値** + +- 入力文字列がURLとして解析できる場合はドメイン名。そうでない場合は空の文字列。 [String](../../sql-reference/data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk'); +``` + +結果: + +``` text +┌─topLevelDomain('svn+ssh://www.some.svn-hosting.com:80/repo/trunk')─┐ +│ com │ +└────────────────────────────────────────────────────────────────────┘ +``` + +### topLevelDomainRFC + +URLからトップレベルドメインを抽出します。[topLevelDomain](#topleveldomain)と似ていますが、RFC 3986に準拠しています。 + +``` sql +topLevelDomainRFC(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +:::note +プロトコルをつけてもつけなくても指定できます。例: + +``` text +svn+ssh://some.svn-hosting.com:80/repo/trunk +some.svn-hosting.com:80/repo/trunk +https://clickhouse.com/time/ +``` +::: + +**返される値** + +- 入力文字列がURLとして解析できる場合はドメイン名。そうでない場合は空の文字列。 [String](../../sql-reference/data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT topLevelDomain('http://foo:foo%41bar@foo.com'), topLevelDomainRFC('http://foo:foo%41bar@foo.com'); +``` + +結果: + +``` text +┌─topLevelDomain('http://foo:foo%41bar@foo.com')─┬─topLevelDomainRFC('http://foo:foo%41bar@foo.com')─┐ +│ │ com │ +└────────────────────────────────────────────────┴───────────────────────────────────────────────────┘ +``` + +### firstSignificantSubdomain + +「最初の重要なサブドメイン」を返します。 +「最初の重要なサブドメイン」は、`com`、`net`、`org`、または`co`の場合は第二レベルドメイン、その他の場合は第三レベルドメインです。 +例えば、`firstSignificantSubdomain ('https://news.clickhouse.com/') = 'clickhouse'、firstSignificantSubdomain ('https://news.clickhouse.com.tr/') = 'clickhouse'`。 +「重要でない」第二レベルドメインやその他の実装の詳細は将来変更されることがあります。 + +**構文** + +```sql +firstSignificantSubdomain(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメイン。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT firstSignificantSubdomain('http://www.example.com/a/b/c?a=b') +``` + +結果: + +```reference +┌─firstSignificantSubdomain('http://www.example.com/a/b/c?a=b')─┐ +│ example │ +└───────────────────────────────────────────────────────────────┘ +``` + +### firstSignificantSubdomainRFC + +「最初の重要なサブドメイン」を返します。 +「最初の重要なサブドメイン」は、`com`、`net`、`org`、または`co`の場合は第二レベルドメイン、その他の場合は第三レベルドメインです。 +例えば、`firstSignificantSubdomain (‘https://news.clickhouse.com/’) = ‘clickhouse’, firstSignificantSubdomain (‘https://news.clickhouse.com.tr/’) = ‘clickhouse’`。 +「重要でない」第二レベルドメインやその他の実装の詳細は将来変更されることがあります。 +[firstSignficantSubdomain](#firstsignificantsubdomain)に似ていますが、RFC 1034に準拠しています。 + +**構文** + +```sql +firstSignificantSubdomainRFC(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメイン。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment'), + firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment'); +``` + +結果: + +```reference +┌─firstSignificantSubdomain('http://user:password@example.com:8080/path?query=value#fragment')─┬─firstSignificantSubdomainRFC('http://user:password@example.com:8080/path?query=value#fragment')─┐ +│ │ example │ +└──────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### cutToFirstSignificantSubdomain + +「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返します。 + +**構文** + +```sql +cutToFirstSignificantSubdomain(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し、それ以外の場合は空の文字列を返します。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/'), + cutToFirstSignificantSubdomain('www.tr'), + cutToFirstSignificantSubdomain('tr'); +``` + +結果: + +```response +┌─cutToFirstSignificantSubdomain('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomain('www.tr')─┬─cutToFirstSignificantSubdomain('tr')─┐ +│ clickhouse.com.tr │ tr │ │ +└───────────────────────────────────────────────────────────────────┴──────────────────────────────────────────┴──────────────────────────────────────┘ +``` + +### cutToFirstSignificantSubdomainRFC + +「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返します。 +[cutToFirstSignificantSubdomain](#cuttofirstsignificantsubdomain)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +cutToFirstSignificantSubdomainRFC(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し、それ以外の場合は空の文字列を返します。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + cutToFirstSignificantSubdomain('http://user:password@example.com:8080'), + cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080'); +``` + +結果: + +```response +┌─cutToFirstSignificantSubdomain('http://user:password@example.com:8080')─┬─cutToFirstSignificantSubdomainRFC('http://user:password@example.com:8080')─┐ +│ │ example.com │ +└─────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────┘ +``` + +### cutToFirstSignificantSubdomainWithWWW + +「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返し、`www`は削除しません。 + +**構文** + +```sql +cutToFirstSignificantSubdomainWithWWW(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し(`www`を含む)、それ以外の場合は空の文字列を返します。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/'), + cutToFirstSignificantSubdomainWithWWW('www.tr'), + cutToFirstSignificantSubdomainWithWWW('tr'); +``` + +結果: + +```response +┌─cutToFirstSignificantSubdomainWithWWW('https://news.clickhouse.com.tr/')─┬─cutToFirstSignificantSubdomainWithWWW('www.tr')─┬─cutToFirstSignificantSubdomainWithWWW('tr')─┐ +│ clickhouse.com.tr │ www.tr │ │ +└──────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────┴─────────────────────────────────────────────┘ +``` + +### cutToFirstSignificantSubdomainWithWWWRFC + +「最初の重要なサブドメイン」までトップレベルのサブドメインを含むドメインの部分を返し、`www`は削除しません。 +[cutToFirstSignificantSubdomainWithWWW](#cuttofirstsignificantsubdomaincustomwithwww)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +cutToFirstSignificantSubdomainWithWWW(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 可能であれば最初の重要なサブドメインまでのトップレベルのサブドメインを含むドメインの一部を返し("www"を含む)、それ以外の場合は空の文字列を返します。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT + cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy'), + cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy'); +``` + +結果: + +```response +┌─cutToFirstSignificantSubdomainWithWWW('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┬─cutToFirstSignificantSubdomainWithWWWRFC('http:%2F%2Fwwwww.nova@mail.ru/economicheskiy')─┐ +│ │ mail.ru │ +└───────────────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +### cutToFirstSignificantSubdomainCustom + +最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返します。 +カスタムの[TLDリスト](https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains)名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 + +**設定例** + +```xml + + + + public_suffix_list.dat + + +``` + +**構文** + +``` sql +cutToFirstSignificantSubdomain(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部。 [String](../../sql-reference/data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list'); +``` + +結果: + +```text +┌─cutToFirstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐ +│ foo.there-is-no-such-domain │ +└───────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### cutToFirstSignificantSubdomainCustomRFC + +最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返します。 +カスタム[TLDリスト](https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains)名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 +[cutToFirstSignificantSubdomainCustom](#cuttofirstsignificantsubdomaincustom)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +``` sql +cutToFirstSignificantSubdomainRFC(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部。 [String](../../sql-reference/data-types/string.md)。 + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### cutToFirstSignificantSubdomainCustomWithWWW + +最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返し、`www`は削除しません。 +カスタムのTLDリスト名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 + +**設定例** + +```xml + + + + public_suffix_list.dat + + +``` + +**構文** + +```sql +cutToFirstSignificantSubdomainCustomWithWWW(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部(`www`を含む)。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list'); +``` + +結果: + +```text +┌─cutToFirstSignificantSubdomainCustomWithWWW('www.foo', 'public_suffix_list')─┐ +│ www.foo │ +└──────────────────────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### cutToFirstSignificantSubdomainCustomWithWWWRFC + +最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの部分を返し、`www`は削除しません。 +カスタムのTLDリスト名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 +[cutToFirstSignificantSubdomainCustomWithWWW](#cuttofirstsignificantsubdomaincustomwithwww)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +cutToFirstSignificantSubdomainCustomWithWWWRFC(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメインまでトップレベルのサブドメインを含むドメインの一部(`www`を含む)。 [String](../../sql-reference/data-types/string.md)。 + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### firstSignificantSubdomainCustom + +最初の重要なサブドメインを返します。 +カスタムTLDリスト名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 + +設定例: + +```xml + + + + public_suffix_list.dat + + +``` + +**構文** + +```sql +firstSignificantSubdomainCustom(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメイン。 [String](../../sql-reference/data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list'); +``` + +結果: + +```text +┌─firstSignificantSubdomainCustom('bar.foo.there-is-no-such-domain', 'public_suffix_list')─┐ +│ foo │ +└──────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### firstSignificantSubdomainCustomRFC + +最初の重要なサブドメインを返します。 +カスタムTLDリスト名を受け入れます。 +新しいTLDリストが必要な場合やカスタムリストがある場合に便利です。 +[firstSignificantSubdomainCustom](#firstsignificantsubdomaincustom)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +firstSignificantSubdomainCustomRFC(url, tld) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `tld` — カスタムTLDリスト名。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 最初の重要なサブドメイン。 [String](../../sql-reference/data-types/string.md)。 + +**関連項目** + +- [firstSignificantSubdomain](#firstsignificantsubdomain)。 + +### port + +ポートを返すか、URLにポートが含まれていないか解析できない場合は`default_port`を返します。 + +**構文** + +```sql +port(url [, default_port = 0]) +``` + +**引数** + +- `url` — URL。 [String](../data-types/string.md)。 +- `default_port` — 返されるデフォルトのポート番号。 [UInt16](../data-types/int-uint.md)。 + +**返される値** + +- URLにポートがない場合、または検証エラーがある場合にはポートまたはデフォルトのポート。 [UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT port('http://paul@www.example.com:80/'); +``` + +結果: + +```response +┌─port('http://paul@www.example.com:80/')─┐ +│ 80 │ +└─────────────────────────────────────────┘ +``` + +### portRFC + +ポートを返すか、URLにポートが含まれていないか解析できない場合は`default_port`を返します。 +[port](#port)に似ていますが、RFC 3986に準拠しています。 + +**構文** + +```sql +portRFC(url [, default_port = 0]) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `default_port` — 返されるデフォルトのポート番号。 [UInt16](../data-types/int-uint.md)。 + +**返される値** + +- URLにポートがない場合、または検証エラーがある場合にはポートまたはデフォルトのポート。 [UInt16](../data-types/int-uint.md)。 + +**例** + +クエリ: + +```sql +SELECT + port('http://user:password@example.com:8080'), + portRFC('http://user:password@example.com:8080'); +``` + +結果: + +```resposne +┌─port('http://user:password@example.com:8080')─┬─portRFC('http://user:password@example.com:8080')─┐ +│ 0 │ 8080 │ +└───────────────────────────────────────────────┴──────────────────────────────────────────────────┘ +``` + +### path + +クエリ文字列を含まないパスを返します。 + +例: `/top/news.html`。 + +### pathFull + +上記と同じですが、クエリ文字列とフラグメントを含みます。 + +例: `/top/news.html?page=2#comments`。 + +### protocol + +URLからプロトコルを抽出します。 + +**構文** + +```sql +protocol(url) +``` + +**引数** + +- `url` — プロトコルを抽出するURL。 [String](../data-types/string.md)。 + +**返される値** + +- プロトコル、または特定できない場合は空の文字列。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +```sql +SELECT protocol('https://clickhouse.com/'); +``` + +結果: + +```response +┌─protocol('https://clickhouse.com/')─┐ +│ https │ +└─────────────────────────────────────┘ +``` + +### queryString + +先頭の質問符や`#`およびそれ以降を除いたクエリ文字列を返します。 + +例: `page=1&lr=213`。 + +### fragment + +先頭のハッシュ記号を除いたフラグメント識別子を返します。 + +### queryStringAndFragment + +クエリ文字列とフラグメント識別子を返します。 + +例: `page=1#29390`。 + +### extractURLParameter(url, name) + +URLに`name`という名前のパラメータが存在する場合、その値を返し、存在しない場合は空の文字列を返します。 +同じ名前のパラメータが複数ある場合は、最初の出現を返します。 +この関数は、`url`パラメータ内のパラメータが`name`引数と同じ方法でエンコードされていると仮定します。 + +### extractURLParameters(url) + +URLパラメータに対応する`name=value`文字列の配列を返します。 +値はデコードされません。 + +### extractURLParameterNames(url) + +URLパラメータの名前に対応する名前文字列の配列を返します。 +値はデコードされません。 + +### URLHierarchy(url) + +パスとクエリ文字列の中でURLを後方から`/`、`?`で切り詰めた配列を返します。 +連続した区切り文字は一つとしてカウントされます。 +切り取りは連続する区切り文字の後の位置で行われます。 + +### URLPathHierarchy(url) + +上記と同じですが、結果にはプロトコルとホストが含まれません。 `/`要素(ルート)は含まれません。 + +``` text +URLPathHierarchy('https://example.com/browse/CONV-6788') = +[ + '/browse/', + '/browse/CONV-6788' +] +``` + +### encodeURLComponent(url) + +エンコードされたURLを返します。 + +例: + +``` sql +SELECT encodeURLComponent('http://127.0.0.1:8123/?query=SELECT 1;') AS EncodedURL; +``` + +``` text +┌─EncodedURL───────────────────────────────────────────────┐ +│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT%201%3B │ +└──────────────────────────────────────────────────────────┘ +``` + +### decodeURLComponent(url) + +デコードされたURLを返します。 + +例: + +``` sql +SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL; +``` + +``` text +┌─DecodedURL─────────────────────────────┐ +│ http://127.0.0.1:8123/?query=SELECT 1; │ +└────────────────────────────────────────┘ +``` + +### encodeURLFormComponent(url) + +エンコードされたURLを返します。rfc-1866に従い、空白(` `)がプラス(`+`)としてエンコードされます。 + +例: + +``` sql +SELECT encodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT 1 2+3') AS EncodedURL; +``` + +``` text +┌─EncodedURL────────────────────────────────────────────────┐ +│ http%3A%2F%2F127.0.0.1%3A8123%2F%3Fquery%3DSELECT+1+2%2B3 │ +└───────────────────────────────────────────────────────────┘ +``` + +### decodeURLFormComponent(url) + +デコードされたURLを返します。rfc-1866に従い、通常のプラス(`+`)が空白(` `)としてデコードされます。 + +例: + +``` sql +SELECT decodeURLFormComponent('http://127.0.0.1:8123/?query=SELECT%201+2%2B3') AS DecodedURL; +``` + +``` text +┌─DecodedURL────────────────────────────────┐ +│ http://127.0.0.1:8123/?query=SELECT 1 2+3 │ +└───────────────────────────────────────────┘ +``` + +### netloc + +URLからネットワークロケリティ(`username:password@host:port`)を抽出します。 + +**構文** + +``` sql +netloc(url) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- `username:password@host:port`。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT netloc('http://paul@www.example.com:80/'); +``` + +結果: + +``` text +┌─netloc('http://paul@www.example.com:80/')─┐ +│ paul@www.example.com:80 │ +└───────────────────────────────────────────┘ +``` + +## URLの一部を削除する関数 + +URLに類似するものがない場合、URLは変更されません。 + +### cutWWW + +URLのドメインから`www.`を削除します(存在する場合)。 + +### cutQueryString + +クエリ文字列を含む質問符を削除します。 + +### cutFragment + +フラグメント識別子を含む番号記号を削除します。 + +### cutQueryStringAndFragment + +クエリ文字列とフラグメント識別子を含む質問符と番号記号を削除します。 + +### cutURLParameter(url, name) + +URLから`name`というパラメータを削除します(存在する場合)。 +この関数は、パラメータ名の文字をエンコードまたはデコードしません。例えば、`Client ID`と`Client%20ID`は異なるパラメータ名として扱われます。 + +**構文** + +``` sql +cutURLParameter(url, name) +``` + +**引数** + +- `url` — URL。 [String](../../sql-reference/data-types/string.md)。 +- `name` — URLパラメータの名前。 [String](../../sql-reference/data-types/string.md)またはStringsの[Array](../../sql-reference/data-types/array.md)。 + +**返される値** + +- `name` URLパラメータを削除したURL。 [String](../data-types/string.md)。 + +**例** + +クエリ: + +``` sql +SELECT + cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', 'a') as url_without_a, + cutURLParameter('http://bigmir.net/?a=b&c=d&e=f#g', ['c', 'e']) as url_without_c_and_e; +``` + +結果: + +``` text +┌─url_without_a────────────────┬─url_without_c_and_e──────┐ +│ http://bigmir.net/?c=d&e=f#g │ http://bigmir.net/?a=b#g │ +└──────────────────────────────┴──────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/functions/uuid-functions.md b/docs/ja/sql-reference/functions/uuid-functions.md new file mode 100644 index 00000000000..f43151c2d77 --- /dev/null +++ b/docs/ja/sql-reference/functions/uuid-functions.md @@ -0,0 +1,926 @@ +--- +slug: /ja/sql-reference/functions/uuid-functions +sidebar_position: 205 +sidebar_label: UUIDs +--- + +# UUID を扱う関数 + +## generateUUIDv4 + +[バージョン4](https://tools.ietf.org/html/rfc4122#section-4.4)の[UUID](../data-types/uuid.md)を生成します。 + +**構文** + +``` sql +generateUUIDv4([expr]) +``` + +**引数** + +- `expr` — クエリ内で関数が複数回呼ばれる場合に[共通部分式の除去](../functions/index.md#common-subexpression-elimination)を回避するための任意の[式](../syntax.md#syntax-expressions)。式の値は返されるUUIDに影響を与えません。省略可能。 + +**返される値** + +UUIDv4 型の値。 + +**例** + +まず、UUID型のカラムを持つテーブルを作成し、そのテーブルに生成されたUUIDv4を挿入します。 + +``` sql +CREATE TABLE tab (uuid UUID) ENGINE = Memory; + +INSERT INTO tab SELECT generateUUIDv4(); + +SELECT * FROM tab; +``` + +結果: + +```response +┌─────────────────────────────────uuid─┐ +│ f4bf890f-f9dc-4332-ad5c-0c18e73f28e9 │ +└──────────────────────────────────────┘ +``` + +**行ごとに複数のUUIDを生成する例** + +```sql +SELECT generateUUIDv4(1), generateUUIDv4(2); + +┌─generateUUIDv4(1)────────────────────┬─generateUUIDv4(2)────────────────────┐ +│ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │ 8abf8c13-7dea-4fdf-af3e-0e18767770e6 │ +└──────────────────────────────────────┴──────────────────────────────────────┘ +``` + +## generateUUIDv7 {#generateUUIDv7} + +[バージョン7](https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04)の[UUID](../data-types/uuid.md)を生成します。 + +生成されたUUIDは、ミリ秒単位の現在のUnixタイムスタンプ(48ビット)、バージョン「7」(4ビット)、ミリ秒内でUUIDを区別するためのカウンタ(42ビット)、およびランダムフィールド(32ビット)を含みます。 +特定のタイムスタンプ(unix_ts_ms)の場合、カウンタはランダムな値から始まり、新しいUUIDごとに1ずつ増加します。 +カウンタがオーバーフローした場合、タイムスタンプフィールドは1増加し、カウンタはランダムな新しい開始値にリセットされます。 + +関数`generateUUIDv7`は、並行して実行されているスレッドおよびクエリ間で、タイムスタンプ内のカウンタフィールドが単調に増加することを保証します。 + +``` + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ +| unix_ts_ms | +├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ +| unix_ts_ms | ver | counter_high_bits | +├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ +|var| counter_low_bits | +├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ +| rand_b | +└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ +``` + +:::note +2024年4月時点で、バージョン7のUUIDはドラフトステータスであり、将来そのレイアウトが変更される可能性があります。 +::: + +**構文** + +``` sql +generateUUIDv7([expr]) +``` + +**引数** + +- `expr` — クエリ内で関数が複数回呼ばれる場合に[共通部分式の除去](../functions/index.md#common-subexpression-elimination)を回避するための任意の[式](../syntax.md#syntax-expressions)。式の値は返されるUUIDに影響を与えません。省略可能。 + +**返される値** + +UUIDv7 型の値。 + +**例** + +まず、UUID型のカラムを持つテーブルを作成し、そのテーブルに生成されたUUIDv7を挿入します。 + +``` sql +CREATE TABLE tab (uuid UUID) ENGINE = Memory; + +INSERT INTO tab SELECT generateUUIDv7(); + +SELECT * FROM tab; +``` + +結果: + +```response +┌─────────────────────────────────uuid─┐ +│ 018f05af-f4a8-778f-beee-1bedbc95c93b │ +└──────────────────────────────────────┘ +``` + +**行ごとに複数のUUIDを生成する例** + +```sql +SELECT generateUUIDv7(1), generateUUIDv7(2); + +┌─generateUUIDv7(1)────────────────────┬─generateUUIDv7(2)────────────────────┐ +│ 018f05c9-4ab8-7b86-b64e-c9f03fbd45d1 │ 018f05c9-4ab8-7b86-b64e-c9f12efb7e16 │ +└──────────────────────────────────────┴──────────────────────────────────────┘ +``` + +## empty + +入力UUIDが空であるかどうかを確認します。 + +**構文** + +```sql +empty(UUID) +``` + +UUIDはすべてのビットがゼロ(ゼロUUID)であるときに空と見なされます。 + +この関数は[Arrays](array-functions.md#function-empty)や[Strings](string-functions.md#empty)に対しても機能します。 + +**引数** + +- `x` — UUID。 [UUID](../data-types/uuid.md)。 + +**返される値** + +- 空のUUIDの場合は`1`、空でないUUIDの場合は`0`を返します。 [UInt8](../data-types/int-uint.md)。 + +**例** + +UUID値を生成するために、ClickHouseは[generateUUIDv4](#generateuuidv4)関数を提供します。 + +クエリ: + +```sql +SELECT empty(generateUUIDv4()); +``` + +結果: + +```response +┌─empty(generateUUIDv4())─┐ +│ 0 │ +└─────────────────────────┘ +``` + +## notEmpty + +入力UUIDが空でないかどうかを確認します。 + +**構文** + +```sql +notEmpty(UUID) +``` + +UUIDはすべてのビットがゼロ(ゼロUUID)であるときに空と見なされます。 + +この関数は[Arrays](array-functions.md#function-notempty)や[Strings](string-functions.md#notempty)に対しても機能します。 + +**引数** + +- `x` — UUID。 [UUID](../data-types/uuid.md)。 + +**返される値** + +- 空でないUUIDの場合は`1`、空のUUIDの場合は`0`を返します。 [UInt8](../data-types/int-uint.md)。 + +**例** + +UUID値を生成するために、ClickHouseは[generateUUIDv4](#generateuuidv4)関数を提供します。 + +クエリ: + +```sql +SELECT notEmpty(generateUUIDv4()); +``` + +結果: + +```response +┌─notEmpty(generateUUIDv4())─┐ +│ 1 │ +└────────────────────────────┘ +``` + +## toUUID + +文字列型の値をUUIDに変換します。 + +``` sql +toUUID(string) +``` + +**返される値** + +UUID型の値。 + +**使用例** + +``` sql +SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid +``` + +結果: + +```response +┌─────────────────────────────────uuid─┐ +│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │ +└──────────────────────────────────────┘ +``` + +## toUUIDOrDefault + +**引数** + +- `string` — 36文字の文字列またはFixedString(36)。 [String](../syntax.md#string)。 +- `default` — 最初の引数がUUID型に変換できない場合に使用されるデフォルトのUUID。 [UUID](../data-types/uuid.md)。 + +**返される値** + +UUID + +``` sql +toUUIDOrDefault(string, default) +``` + +**返される値** + +UUID型の値。 + +**使用例** + +最初の例は、変換可能な場合、最初の引数をUUID型に変換して返します。 + +``` sql +SELECT toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', cast('59f0c404-5cb3-11e7-907b-a6006ad3dba0' as UUID)); +``` + +結果: + +```response +┌─toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', CAST('59f0c404-5cb3-11e7-907b-a6006ad3dba0', 'UUID'))─┐ +│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │ +└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +2つ目の例では、最初の引数がUUID型に変換できない場合、2つ目の引数(提供されたデフォルトのUUID)を返します。 + +```sql +SELECT toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', cast('59f0c404-5cb3-11e7-907b-a6006ad3dba0' as UUID)); +``` + +結果: + +```response +┌─toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', CAST('59f0c404-5cb3-11e7-907b-a6006ad3dba0', 'UUID'))─┐ +│ 59f0c404-5cb3-11e7-907b-a6006ad3dba0 │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## toUUIDOrNull + +文字列型の引数を受け取り、UUIDへの変換を試みます。失敗した場合、NULLを返します。 + +``` sql +toUUIDOrNull(string) +``` + +**返される値** + +Nullable(UUID)型の値。 + +**使用例** + +``` sql +SELECT toUUIDOrNull('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid +``` + +結果: + +```response +┌─uuid─┐ +│ ᴺᵁᴸᴸ │ +└──────┘ +``` + +## toUUIDOrZero + +文字列型の引数を受け取り、UUIDへの変換を試みます。失敗した場合、ゼロUUIDを返します。 + +``` sql +toUUIDOrZero(string) +``` + +**返される値** + +UUID型の値。 + +**使用例** + +``` sql +SELECT toUUIDOrZero('61f0c404-5cb3-11e7-907b-a6006ad3dba0T') AS uuid +``` + +結果: + +```response +┌─────────────────────────────────uuid─┐ +│ 00000000-0000-0000-0000-000000000000 │ +└──────────────────────────────────────┘ +``` + +## UUIDStringToNum + +36文字の形式`xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`を含む`string`を受け取り、そのバイナリ表現として[FixedString(16)](../data-types/fixedstring.md)を返します。形式はオプションで`variant` (`ビッグエンディアン`がデフォルト)で指定可能です。 + +**構文** + +``` sql +UUIDStringToNum(string[, variant = 1]) +``` + +**引数** + +- `string` — 36文字の[String](../syntax.md#syntax-string-literal)または[FixedString](../syntax.md#syntax-string-literal)。 +- `variant` — [RFC4122](https://datatracker.ietf.org/doc/html/rfc4122#section-4.1.1)に基づくバリアントを表す整数。1 = `ビッグエンディアン` (デフォルト), 2 = `マイクロソフト`。 + +**返される値** + +FixedString(16) + +**使用例** + +``` sql +SELECT + '612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid, + UUIDStringToNum(uuid) AS bytes +``` + +結果: + +```response +┌─uuid─────────────────────────────────┬─bytes────────────┐ +│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │ +└──────────────────────────────────────┴──────────────────┘ +``` + +``` sql +SELECT + '612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid, + UUIDStringToNum(uuid, 2) AS bytes +``` + +結果: + +```response +┌─uuid─────────────────────────────────┬─bytes────────────┐ +│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @/opt/geo/regions_hierarchy.txt``` + +このファイルに加えて、ファイル名に `_` 記号と任意のサフィックスが付けられた、拡張子の前に配置された近くのファイルも検索されます。例えば、`/opt/geo/regions_hierarchy_ua.txt` というファイルが存在する場合、そのファイルも見つけられます。ここで `ua` はDictionaryキーと呼ばれます。サフィックスのないDictionaryについては、キーは空文字列になります。 + +すべてのDictionaryはランタイム中に再読み込みされます([`builtin_dictionaries_reload_interval`](../../operations/server-configuration-parameters/settings#builtin-dictionaries-reload-interval) 設定パラメータで定義された秒数またはデフォルトで1時間に一度)。ただし、利用可能なDictionaryのリストはサーバーが開始された時点で一度定義されます。 + +地域を扱うすべての関数には、最後にDictionaryキーとして参照されるジオベースというオプションの引数があります。 + +例: + +``` sql +regionToCountry(RegionID) – デフォルトDictionaryを使用: /opt/geo/regions_hierarchy.txt +regionToCountry(RegionID, '') – デフォルトDictionaryを使用: /opt/geo/regions_hierarchy.txt +regionToCountry(RegionID, 'ua') – 'ua' キーのDictionaryを使用: /opt/geo/regions_hierarchy_ua.txt +``` + +### regionToName + +地域IDとジオベースを受け取り、対応する言語で地域の名称を返します。指定されたIDの地域が存在しない場合、空の文字列が返されます。 + +**構文** + +``` sql +regionToName(id\[, lang\]) +``` +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- `geobase` で指定された言語の地域名。[String](../data-types/string). +- それ以外の場合は空の文字列。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(number::UInt32,'en') FROM numbers(0,5); +``` + +結果: + +``` text +┌─regionToName(CAST(number, 'UInt32'), 'en')─┐ +│ │ +│ World │ +│ USA │ +│ Colorado │ +│ Boulder County │ +└────────────────────────────────────────────┘ +``` + +### regionToCity + +ジオベースから地域IDを受け取ります。この地域が都市または都市の一部である場合、適切な都市の地域IDを返します。それ以外の場合は0を返します。 + +**構文** + +```sql +regionToCity(id [, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 適切な都市の地域IDがあれば。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +```sql +SELECT regionToName(number::UInt32, 'en'), regionToCity(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13); +``` + +結果: + +```response +┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToCity(CAST(number, 'UInt32')), 'en')─┐ +│ │ 0 │ │ +│ World │ 0 │ │ +│ USA │ 0 │ │ +│ Colorado │ 0 │ │ +│ Boulder County │ 0 │ │ +│ Boulder │ 5 │ Boulder │ +│ China │ 0 │ │ +│ Sichuan │ 0 │ │ +│ Chengdu │ 8 │ Chengdu │ +│ America │ 0 │ │ +│ North America │ 0 │ │ +│ Eurasia │ 0 │ │ +│ Asia │ 0 │ │ +└────────────────────────────────────────────┴────┴──────────────────────────────────────────────────────────┘ +``` + +### regionToArea + +地域をエリア(ジオベース内のタイプ5)に変換します。この関数は、[‘regionToCity’](#regiontocity)と同様です。 + +**構文** + +```sql +regionToArea(id [, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 適切なエリアの地域IDがあれば。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT DISTINCT regionToName(regionToArea(toUInt32(number), 'ua')) +FROM system.numbers +LIMIT 15 +``` + +結果: + +``` text +┌─regionToName(regionToArea(toUInt32(number), \'ua\'))─┐ +│ │ +│ Moscow and Moscow region │ +│ St. Petersburg and Leningrad region │ +│ Belgorod region │ +│ Ivanovsk region │ +│ Kaluga region │ +│ Kostroma region │ +│ Kursk region │ +│ Lipetsk region │ +│ Orlov region │ +│ Ryazan region │ +│ Smolensk region │ +│ Tambov region │ +│ Tver region │ +│ Tula region │ +└──────────────────────────────────────────────────────┘ +``` + +### regionToDistrict + +地域を連邦区(ジオベース内のタイプ4)に変換します。この関数は、‘regionToCity’と同様です。 + +**構文** + +```sql +regionToDistrict(id [, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 適切な都市の地域IDがあれば。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT DISTINCT regionToName(regionToDistrict(toUInt32(number), 'ua')) +FROM system.numbers +LIMIT 15 +``` + +結果: + +``` text +┌─regionToName(regionToDistrict(toUInt32(number), \'ua\'))─┐ +│ │ +│ Central federal district │ +│ Northwest federal district │ +│ South federal district │ +│ North Caucases federal district │ +│ Privolga federal district │ +│ Ural federal district │ +│ Siberian federal district │ +│ Far East federal district │ +│ Scotland │ +│ Faroe Islands │ +│ Flemish region │ +│ Brussels capital region │ +│ Wallonia │ +│ Federation of Bosnia and Herzegovina │ +└──────────────────────────────────────────────────────────┘ +``` + +### regionToCountry + +地域を国(ジオベース内のタイプ3)に変換します。この関数は、‘regionToCity’と同様です。 + +**構文** + +```sql +regionToCountry(id [, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 適切な国の地域IDがあれば。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(number::UInt32, 'en'), regionToCountry(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13); +``` + +結果: + +``` text +┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToCountry(CAST(number, 'UInt32')), 'en')─┐ +│ │ 0 │ │ +│ World │ 0 │ │ +│ USA │ 2 │ USA │ +│ Colorado │ 2 │ USA │ +│ Boulder County │ 2 │ USA │ +│ Boulder │ 2 │ USA │ +│ China │ 6 │ China │ +│ Sichuan │ 6 │ China │ +│ Chengdu │ 6 │ China │ +│ America │ 0 │ │ +│ North America │ 0 │ │ +│ Eurasia │ 0 │ │ +│ Asia │ 0 │ │ +└────────────────────────────────────────────┴────┴─────────────────────────────────────────────────────────────┘ +``` + +### regionToContinent + +地域を大陸(ジオベース内のタイプ1)に変換します。この関数は、‘regionToCity’と同様です。 + +**構文** + +```sql +regionToContinent(id [, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 適切な大陸の地域IDがあれば。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(number::UInt32, 'en'), regionToContinent(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13); +``` + +結果: + +``` text +┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToContinent(CAST(number, 'UInt32')), 'en')─┐ +│ │ 0 │ │ +│ World │ 0 │ │ +│ USA │ 10 │ North America │ +│ Colorado │ 10 │ North America │ +│ Boulder County │ 10 │ North America │ +│ Boulder │ 10 │ North America │ +│ China │ 12 │ Asia │ +│ Sichuan │ 12 │ Asia │ +│ Chengdu │ 12 │ Asia │ +│ America │ 9 │ America │ +│ North America │ 10 │ North America │ +│ Eurasia │ 11 │ Eurasia │ +│ Asia │ 12 │ Asia │ +└────────────────────────────────────────────┴────┴───────────────────────────────────────────────────────────────┘ +``` + +### regionToTopContinent + +地域の階層で最上位の大陸を見つけます。 + +**構文** + +``` sql +regionToTopContinent(id[, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 領域の階層を登ったときの最上位の大陸の識別子。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(number::UInt32, 'en'), regionToTopContinent(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13); +``` + +結果: + +``` text +┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToTopContinent(CAST(number, 'UInt32')), 'en')─┐ +│ │ 0 │ │ +│ World │ 0 │ │ +│ USA │ 9 │ America │ +│ Colorado │ 9 │ America │ +│ Boulder County │ 9 │ America │ +│ Boulder │ 9 │ America │ +│ China │ 11 │ Eurasia │ +│ Sichuan │ 11 │ Eurasia │ +│ Chengdu │ 11 │ Eurasia │ +│ America │ 9 │ America │ +│ North America │ 9 │ America │ +│ Eurasia │ 11 │ Eurasia │ +│ Asia │ 11 │ Eurasia │ +└────────────────────────────────────────────┴────┴──────────────────────────────────────────────────────────────────┘ +``` + +### regionToPopulation + +地域の人口を取得します。人口はジオベースのファイルに記録されていることがあります。[「Dictionary」](../dictionaries#embedded-dictionaries)セクションを参照してください。地域の人口が記録されていない場合は0を返します。ジオベースでは、子地域の人口は記録されているが親地域には記録されていないことがあります。 + +**構文** + +``` sql +regionToPopulation(id[, geobase]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 地域の人口。[UInt32](../data-types/int-uint). +- そうでなければ0。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(number::UInt32, 'en'), regionToPopulation(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13); +``` + +結果: + +``` text +┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─population─┐ +│ │ 0 │ +│ World │ 4294967295 │ +│ USA │ 330000000 │ +│ Colorado │ 5700000 │ +│ Boulder County │ 330000 │ +│ Boulder │ 100000 │ +│ China │ 1500000000 │ +│ Sichuan │ 83000000 │ +│ Chengdu │ 20000000 │ +│ America │ 1000000000 │ +│ North America │ 600000000 │ +│ Eurasia │ 4294967295 │ +│ Asia │ 4294967295 │ +└────────────────────────────────────────────┴────────────┘ +``` + +### regionIn + +`lhs` 地域が `rhs` 地域に属するかどうかを確認します。属する場合は1、属さない場合は0のUInt8値を返します。 + +**構文** + +``` sql +regionIn(lhs, rhs\[, geobase\]) +``` + +**パラメータ** + +- `lhs` — ジオベースのlhs地域ID。[UInt32](../data-types/int-uint). +- `rhs` — ジオベースのrhs地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 属する場合は1。[UInt8](../data-types/int-uint). +- 属さない場合は0。 + +**実装の詳細** + +この関係は反射的です。すなわち、どの地域も自分自身に属します。 + +**例** + +クエリ: + +``` sql +SELECT regionToName(n1.number::UInt32, 'en') || (regionIn(n1.number::UInt32, n2.number::UInt32) ? ' is in ' : ' is not in ') || regionToName(n2.number::UInt32, 'en') FROM numbers(1,2) AS n1 CROSS JOIN numbers(1,5) AS n2; +``` + +結果: + +``` text +World is in World +World is not in USA +World is not in Colorado +World is not in Boulder County +World is not in Boulder +USA is in World +USA is in USA +USA is not in Colorado +USA is not in Boulder County +USA is not in Boulder +``` + +### regionHierarchy + +ジオベースの地域IDであるUInt32数値を受け取ります。渡された地域とその沿線のすべての親地域からなる地域IDの配列を返します。 + +**構文** + +``` sql +regionHierarchy(id\[, geobase\]) +``` + +**パラメータ** + +- `id` — ジオベースの地域ID。[UInt32](../data-types/int-uint). +- `geobase` — Dictionaryキー。[複数のジオベース](#multiple-geobases)を参照。[String](../data-types/string). オプション。 + +**返される値** + +- 渡された地域とその沿線のすべての親地域からなる地域IDの配列。[Array](../data-types/array)([UInt32](../data-types/int-uint)). + +**例** + +クエリ: + +``` sql +SELECT regionHierarchy(number::UInt32) AS arr, arrayMap(id -> regionToName(id, 'en'), arr) FROM numbers(5); +``` + +結果: + +``` text +┌─arr────────────┬─arrayMap(lambda(tuple(id), regionToName(id, 'en')), regionHierarchy(CAST(number, 'UInt32')))─┐ +│ [] │ [] │ +│ [1] │ ['World'] │ +│ [2,10,9,1] │ ['USA','North America','America','World'] │ +│ [3,2,10,9,1] │ ['Colorado','USA','North America','America','World'] │ +│ [4,3,2,10,9,1] │ ['Boulder County','Colorado','USA','North America','America','World'] │ +└────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/index.md b/docs/ja/sql-reference/index.md new file mode 100644 index 00000000000..50fa427d76b --- /dev/null +++ b/docs/ja/sql-reference/index.md @@ -0,0 +1,22 @@ +--- +keywords: [clickhouse, docs, sqlリファレンス, sqlステートメント, sql, 構文] +title: SQLリファレンス +--- + +import { TwoColumnList } from '/src/components/two_column_list' +import { ClickableSquare } from '/src/components/clickable_square' +import { HorizontalDivide } from '/src/components/horizontal_divide' +import { ViewAllLink } from '/src/components/view_all_link' +import { VideoContainer } from '/src/components/video_container' + +import LinksDeployment from './sql-reference-links.json' + +# ClickHouse SQLリファレンス + +ClickHouseは、多くの場合にANSI SQL標準と同一のSQLに基づく宣言型クエリ言語をサポートしています。 + +サポートされているクエリには、GROUP BY、ORDER BY、FROM内のサブクエリ、JOIN句、IN演算子、ウィンドウ関数、スカラーサブクエリが含まれます。 + + + + diff --git a/docs/ja/sql-reference/operators/exists.md b/docs/ja/sql-reference/operators/exists.md new file mode 100644 index 00000000000..378d84a9ae4 --- /dev/null +++ b/docs/ja/sql-reference/operators/exists.md @@ -0,0 +1,62 @@ +--- +slug: /ja/sql-reference/operators/exists +--- +# EXISTS + +`EXISTS` 演算子はサブクエリの結果に何件のレコードがあるかをチェックします。結果が空であれば、この演算子は `0` を返します。それ以外の場合は `1` を返します。 + +`EXISTS` は [WHERE](../../sql-reference/statements/select/where.md) 句でも使用できます。 + +:::tip +サブクエリ内でメインクエリのテーブルやカラムへの参照はサポートされていません。 +::: + +**構文** + +``` sql +EXISTS(subquery) +``` + +**例** + +サブクエリ内の値の存在を確認するクエリ: + +``` sql +SELECT EXISTS(SELECT * FROM numbers(10) WHERE number > 8), EXISTS(SELECT * FROM numbers(10) WHERE number > 11) +``` + +結果: + +``` text +┌─in(1, _subquery1)─┬─in(1, _subquery2)─┐ +│ 1 │ 0 │ +└───────────────────┴───────────────────┘ +``` + +複数の行を返すサブクエリを使用したクエリ: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 8); +``` + +結果: + +``` text +┌─count()─┐ +│ 10 │ +└─────────┘ +``` + +空の結果を返すサブクエリを使用したクエリ: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 11); +``` + +結果: + +``` text +┌─count()─┐ +│ 0 │ +└─────────┘ +``` diff --git a/docs/ja/sql-reference/operators/in.md b/docs/ja/sql-reference/operators/in.md new file mode 100644 index 00000000000..957c7bf8ff0 --- /dev/null +++ b/docs/ja/sql-reference/operators/in.md @@ -0,0 +1,262 @@ +--- +slug: /ja/sql-reference/operators/in +--- +# IN 演算子 + +`IN`、`NOT IN`、`GLOBAL IN`、`GLOBAL NOT IN` 演算子は、その機能が非常に豊富であるため、個別に説明されます。 + +演算子の左側は単一のカラムまたはタプルです。 + +例: + +``` sql +SELECT UserID IN (123, 456) FROM ... +SELECT (CounterID, UserID) IN ((34, 123), (101500, 456)) FROM ... +``` + +左側がインデックスにある単一のカラムで、右側が定数の集合である場合、システムはクエリの処理にインデックスを使用します。 + +あまりにも多くの値を明示的にリストしないでください(例えば、数百万)。データセットが大きい場合は、一時テーブルに置きます(例えば、[クエリ処理のための外部データ](../../engines/table-engines/special/external-data.md)のセクションを参照)、そしてサブクエリを使用します。 + +演算子の右側は、定数式の集合、定数式を持つタプルの集合(上記の例に示される)、またはデータベースのテーブル名や括弧内の`SELECT`サブクエリであることができます。 + +ClickHouseは、`IN`サブクエリの左側と右側の型が異なることを許可します。この場合、左側の値を右側の型に変換します。[accurateCastOrNull](../functions/type-conversion-functions.md#type_conversion_function-accurate-cast_or_null)関数が適用されるかのようにです。つまり、データ型は[Nullable](../../sql-reference/data-types/nullable.md)となり、変換が実行できない場合は[NULL](../../sql-reference/syntax.md#null-literal)を返します。 + +**例** + +クエリ: + +``` sql +SELECT '1' IN (SELECT 1); +``` + +結果: + +``` text +┌─in('1', _subquery49)─┐ +│ 1 │ +└──────────────────────┘ +``` + +演算子の右側がテーブル名の場合(例えば、`UserID IN users`)、これはサブクエリ `UserID IN (SELECT * FROM users)` と同等です。クエリと一緒に送信される外部データを扱うときにこれを使用します。例えば、クエリは、ユーザーのIDセットを一時テーブルの「users」に読み込んでフィルタリングする必要がある場合に送信されます。 + +演算子の右側が、常にRAMに存在する準備済みデータセットを持つSetエンジンを持つテーブル名である場合、データセットは各クエリのために再作成されません。 + +サブクエリは、タプルをフィルタリングするために複数のカラムを指定することがあります。 + +例: + +``` sql +SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ... +``` + +`IN`演算子の左側と右側のカラムは同じ型を持つ必要があります。 + +`IN`演算子とサブクエリは、クエリの任意の部分(集約関数やラムダ関数も含む)に出現することができます。 +例: + +``` sql +SELECT + EventDate, + avg(UserID IN + ( + SELECT UserID + FROM test.hits + WHERE EventDate = toDate('2014-03-17') + )) AS ratio +FROM test.hits +GROUP BY EventDate +ORDER BY EventDate ASC +``` + +``` text +┌──EventDate─┬────ratio─┐ +│ 2014-03-17 │ 1 │ +│ 2014-03-18 │ 0.807696 │ +│ 2014-03-19 │ 0.755406 │ +│ 2014-03-20 │ 0.723218 │ +│ 2014-03-21 │ 0.697021 │ +│ 2014-03-22 │ 0.647851 │ +│ 2014-03-23 │ 0.648416 │ +└────────────┴──────────┘ +``` + +3月17日以降の各日付について、その日にこのサイトを訪れたユーザーによるページビューの割合を計算します。 +`IN`句内のサブクエリは、単一のサーバー上で一度だけ実行されます。依存サブクエリはありません。 + +## NULL 処理 + +リクエスト処理中、`IN`演算子は、[NULL](../../sql-reference/syntax.md#null-literal) との操作結果が常に `0` に等しいと仮定します。演算子の右側または左側に `NULL` があっても関連しません。`NULL` 値はデータセットに含まれず、相互に対応せず、[transform_null_in = 0](../../operations/settings/settings.md#transform_null_in) の場合に比較されません。 + +`t_null` テーブルを使用した例を示します: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 3 │ +└───┴──────┘ +``` + +クエリ `SELECT x FROM t_null WHERE y IN (NULL,3)` を実行すると、次の結果が得られます: + +``` text +┌─x─┐ +│ 2 │ +└───┘ +``` + +`y = NULL` の行がクエリ結果から除外されていることがわかります。これは、ClickHouse が`(NULL,3)` 集合に `NULL` が含まれるかどうかを決定できず、操作の結果として `0` を返し、`SELECT` がこの行を最終出力から除外したためです。 + +``` sql +SELECT y IN (NULL, 3) +FROM t_null +``` + +``` text +┌─in(y, tuple(NULL, 3))─┐ +│ 0 │ +│ 1 │ +└───────────────────────┘ +``` + +## 分散サブクエリ + +`IN`演算子とサブクエリには、`JOIN`演算子に似た2つのオプションがあります。それは通常の`IN` / `JOIN` と `GLOBAL IN` / `GLOBAL JOIN` です。これらは、分散クエリ処理の方法が異なります。 + +:::note +以下に説明するアルゴリズムは、[設定](../../operations/settings/settings.md) `distributed_product_mode` に依存して、異なる動作をすることがあります。 +::: + +通常の`IN`を使用すると、クエリはリモートサーバーに送信され、それぞれが`IN`または`JOIN`句のサブクエリを実行します。 + +`GLOBAL IN` / `GLOBAL JOIN` を使用すると、まず全ての`GLOBAL IN` / `GLOBAL JOIN`用のサブクエリが実行され、その結果が一時テーブルに収集されます。その後、一時テーブルは各リモートサーバーに送信され、クエリはこの一時データを使用して実行されます。 + +分散クエリでない場合は、通常の`IN` / `JOIN`を使用します。 + +分散クエリ処理のために`IN` / `JOIN`句内のサブクエリを使用する際は注意が必要です。 + +例を見てみましょう。クラスター内の各サーバーには通常の **local_table** があると仮定します。各サーバーにもクラスター内の全サーバーを対象とした**Distributed**型の **distributed_table** テーブルがあります。 + +**distributed_table** に対するクエリの場合、クエリはすべてのリモートサーバーに送信され、それらで **local_table** を使用して実行されます。 + +例えば、クエリ + +``` sql +SELECT uniq(UserID) FROM distributed_table +``` + +はすべてのリモートサーバーに + +``` sql +SELECT uniq(UserID) FROM local_table +``` + +として送信され、それぞれで並行して実行され、中間結果が結合できるステージに達するまで実行されます。その後、中間結果は要求元サーバーに返され、そこでマージされ、クライアントに最終結果が送られます。 + +`IN` を使用したクエリを見てみましょう: + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34) +``` + +- 2つのサイトのオーディエンスの交差の計算。 + +このクエリはすべてのリモートサーバーに次のように送信されます + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM local_table WHERE CounterID = 34) +``` + +つまり、`IN`句内のデータセットは、各サーバーに格納されているローカルデータのみを対象にして、各サーバーに独立して収集されます。 + +これは、クラスタサーバー全体でデータをユーザーIDごとに単一のサーバーに完全に存在するようにデータを分散した場合、正確かつ最適に機能します。この場合、必要なデータはすべてのサーバーでローカルに利用可能になります。そうでない場合、結果は不正確になります。このクエリの変形を「ローカルIN」と呼びます。 + +クラスタサーバー全体にデータがランダムに分散されている場合に、クエリの動作を修正するには、サブクエリ内に **distributed_table** を指定することができます。クエリは以下のようになります: + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +このクエリはすべてのリモートサーバーに次のように送信されます + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +サブクエリは各リモートサーバー上で開始されます。サブクエリが分散テーブルを使用しているため、各リモートサーバー上のサブクエリは、次のように各リモートサーバーに再送信されます: + +``` sql +SELECT UserID FROM local_table WHERE CounterID = 34 +``` + +例えば、100台のサーバーのクラスターがある場合、クエリ全体を実行するには10,000の基本的なリクエストが必要であり、これは一般には許容されません。 + +このような場合、通常の `IN` の代わりに常に `GLOBAL IN` を使用すべきです。クエリの動作を見てみましょう: + +``` sql +SELECT uniq(UserID) FROM distributed_table WHERE CounterID = 101500 AND UserID GLOBAL IN (SELECT UserID FROM distributed_table WHERE CounterID = 34) +``` + +要求元サーバーはサブクエリを実行します: + +``` sql +SELECT UserID FROM distributed_table WHERE CounterID = 34 +``` + +その結果はRAMにある一時テーブルに格納されます。その後、クエリは各リモートサーバーに次のように送信されます: + +``` sql +SELECT uniq(UserID) FROM local_table WHERE CounterID = 101500 AND UserID GLOBAL IN _data1 +``` + +一時テーブル `_data1` はクエリと共に各リモートサーバーに送られます(一時テーブルの名前は実装定義です)。 + +これは通常の `IN` を使用するよりも最適ですが、以下の点に注意してください: + +1. 一時テーブルを作成する際には、データは一意にはされません。ネットワーク上で送信されるデータの量を減らすために、サブクエリでDISTINCTを指定してください。(通常の`IN`の場合はこれを行う必要はありません。) +2. 一時テーブルはすべてのリモートサーバーに送られます。ネットワークトポロジは考慮されません。例えば、10台のリモートサーバーが要求元サーバーに対して非常に遠くにあるデータセンターにある場合、そのデータはリモートデータセンターへのチャネルを10回送信されます。`GLOBAL IN`を使用する際は、大規模なデータセットを避けてください。 +3. リモートサーバーへのデータ転送時に、ネットワークの帯域幅制限は構成可能ではありません。ネットワークを過負荷にする可能性があります。 +4. `GLOBAL IN`を定期的に使用する必要がないように、サーバー間でデータを分散してください。 +5. `GLOBAL IN`を頻繁に使用する必要がある場合、ClickHouseクラスターの場所を計画し、単一のデータセンター内で単一のレプリカグループが存在し、迅速なネットワークが確保され、クエリが単一のデータセンター内で完全に処理できるようにします。 + +要求元サーバーにのみ利用可能なローカルテーブルがあり、それをリモートサーバーで使用する必要がある場合には、`GLOBAL IN`句内でローカルテーブルを指定するのも意味があります。 + +### 分散サブクエリと max_rows_in_set + +[`max_rows_in_set`](../../operations/settings/query-complexity.md#max-rows-in-set) と [`max_bytes_in_set`](../../operations/settings/query-complexity.md#max-rows-in-set) を使用して、分散クエリ中に転送されるデータ量を制御することができます。 + +特に、`GLOBAL IN` クエリが大量のデータを返す場合が重要です。次のSQLを考えてみましょう: + +```sql +select * from table1 where col1 global in (select col1 from table2 where ) +``` + +`some_predicate` が十分に選択的でない場合、大量のデータを返してパフォーマンスの問題を引き起こす可能性があります。このような場合、ネットワーク越しのデータ転送を制限することが賢明です。また、[`set_overflow_mode`](../../operations/settings/query-complexity.md#set_overflow_mode) が `throw` に設定されているため(デフォルト)、これらのしきい値に達した時に例外が発生することに注意してください。 + +### 分散サブクエリと max_parallel_replicas + +[max_parallel_replicas](#distributed-subqueries-and-max_parallel_replicas) が1より大きい場合、分散クエリはさらに変換されます。 + +例を示します: + +```sql +SELECT CounterID, count() FROM distributed_table_1 WHERE UserID IN (SELECT UserID FROM local_table_2 WHERE CounterID < 100) +SETTINGS max_parallel_replicas=3 +``` + +このクエリは各サーバー上で以下のように変換されます: + +```sql +SELECT CounterID, count() FROM local_table_1 WHERE UserID IN (SELECT UserID FROM local_table_2 WHERE CounterID < 100) +SETTINGS parallel_replicas_count=3, parallel_replicas_offset=M +``` + +ここで、`M` はローカルクエリが実行されているレプリカに応じて `1` から `3` の間です。 + +これらの設定はクエリ内のすべてのMergeTreeファミリーのテーブルに影響を与え、各テーブルに`SAMPLE 1/3 OFFSET (M-1)/3`を適用するのと同じ効果があります。 + +そのため、[max_parallel_replicas](#distributed-subqueries-and-max_parallel_replicas)設定を追加することで、両方のテーブルが同じレプリケーションスキームを持ち、UserIDまたはその部分キーによってサンプリングされる場合のみ、正しい結果が得られます。特に、`local_table_2`にサンプリングキーがない場合、不正な結果が生成されます。同じルールが`JOIN`にも適用されます。 + +`local_table_2`が要件を満たさない場合の回避策として、`GLOBAL IN`または`GLOBAL JOIN`を使用することができます。 + +テーブルにサンプリングキーがない場合、[parallel_replicas_custom_key](#settings-parallel_replicas_custom_key)のより柔軟なオプションを使用することができます。これにより、異なる、より最適な動作を生成する可能性があります。 diff --git a/docs/ja/sql-reference/operators/index.md b/docs/ja/sql-reference/operators/index.md new file mode 100644 index 00000000000..cbb7f0fc13b --- /dev/null +++ b/docs/ja/sql-reference/operators/index.md @@ -0,0 +1,388 @@ +--- +slug: /ja/sql-reference/operators/ +sidebar_position: 38 +sidebar_label: Operators +--- + +# Operators + +ClickHouseは、演算子をその優先度、結合性、結びつきを考慮してクエリ解析時に対応する関数に変換します。 + +## アクセス演算子 + +`a[N]` – 配列要素へのアクセス。`arrayElement(a, N)`関数。 + +`a.N` – タプル要素へのアクセス。`tupleElement(a, N)`関数。 + +## 数値の否定演算子 + +`-a` – `negate(a)`関数。 + +タプルの否定については:[tupleNegate](../../sql-reference/functions/tuple-functions.md#tuplenegate)。 + +## 乗算と除算演算子 + +`a * b` – `multiply(a, b)`関数。 + +タプルに数値を乗じる場合:[tupleMultiplyByNumber](../../sql-reference/functions/tuple-functions.md#tuplemultiplybynumber)、スカラー積の場合:[dotProduct](../../sql-reference/functions/tuple-functions.md#dotproduct)。 + +`a / b` – `divide(a, b)`関数。 + +タプルを数値で除算する場合:[tupleDivideByNumber](../../sql-reference/functions/tuple-functions.md#tupledividebynumber)。 + +`a % b` – `modulo(a, b)`関数。 + +## 加算と減算演算子 + +`a + b` – `plus(a, b)`関数。 + +タプルの加算については:[tuplePlus](../../sql-reference/functions/tuple-functions.md#tupleplus)。 + +`a - b` – `minus(a, b)`関数。 + +タプルの減算については:[tupleMinus](../../sql-reference/functions/tuple-functions.md#tupleminus)。 + +## 比較演算子 + +### equals関数 +`a = b` – `equals(a, b)`関数。 + +`a == b` – `equals(a, b)`関数。 + +### notEquals関数 +`a != b` – `notEquals(a, b)`関数。 + +`a <> b` – `notEquals(a, b)`関数。 + +### lessOrEquals関数 +`a <= b` – `lessOrEquals(a, b)`関数。 + +### greaterOrEquals関数 +`a >= b` – `greaterOrEquals(a, b)`関数。 + +### less関数 +`a < b` – `less(a, b)`関数。 + +### greater関数 +`a > b` – `greater(a, b)`関数。 + +### like関数 +`a LIKE s` – `like(a, b)`関数。 + +### notLike関数 +`a NOT LIKE s` – `notLike(a, b)`関数。 + +### ilike関数 +`a ILIKE s` – `ilike(a, b)`関数。 + +### BETWEEN関数 +`a BETWEEN b AND c` – `a >= b AND a <= c`と同じ。 + +`a NOT BETWEEN b AND c` – `a < b OR a > c`と同じ。 + +## データセット操作用演算子 + +[IN演算子](../../sql-reference/operators/in.md)および[EXISTS](../../sql-reference/operators/exists.md)演算子を参照してください。 + +### in関数 +`a IN ...` – `in(a, b)`関数。 + +### notIn関数 +`a NOT IN ...` – `notIn(a, b)`関数。 + +### globalIn関数 +`a GLOBAL IN ...` – `globalIn(a, b)`関数。 + +### globalNotIn関数 +`a GLOBAL NOT IN ...` – `globalNotIn(a, b)`関数。 + +### inサブクエリ関数 +`a = ANY (subquery)` – `in(a, subquery)`関数。 + +### notInサブクエリ関数 +`a != ANY (subquery)` – `a NOT IN (SELECT singleValueOrNull(*) FROM subquery)`と同じ。 + +### inサブクエリ関数 +`a = ALL (subquery)` – `a IN (SELECT singleValueOrNull(*) FROM subquery)`と同じ。 + +### notInサブクエリ関数 +`a != ALL (subquery)` – `notIn(a, subquery)`関数。 + +**例** + +ALLを使用したクエリ: + +```sql +SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3)); +``` + +結果: + +```text +┌─a─┐ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└───┘ +``` + +ANYを使用したクエリ: + +```sql +SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3)); +``` + +結果: + +```text +┌─a─┐ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└───┘ +``` + +## 日付および時刻の操作用演算子 + +### EXTRACT + +```sql +EXTRACT(part FROM date); +``` + +日付から部分を抽出します。例えば、与えられた日付から月を取得したり、時刻から秒を取得できます。 + +`part`パラメーターは、取得したい日付の部分を指定します。以下の値が利用可能です: + +- `DAY` — 月の日。可能な値:1〜31。 +- `MONTH` — 月。可能な値:1〜12。 +- `YEAR` — 年。 +- `SECOND` — 秒。可能な値:0〜59。 +- `MINUTE` — 分。可能な値:0〜59。 +- `HOUR` — 時。可能な値:0〜23。 + +`part`パラメーターは大文字小文字を区別しません。 + +`date`パラメーターは、処理対象の日付または時刻を指定します。[Date](../../sql-reference/data-types/date.md)または[DateTime](../../sql-reference/data-types/datetime.md)型がサポートされます。 + +例: + +```sql +SELECT EXTRACT(DAY FROM toDate('2017-06-15')); +SELECT EXTRACT(MONTH FROM toDate('2017-06-15')); +SELECT EXTRACT(YEAR FROM toDate('2017-06-15')); +``` + +次の例では、テーブルを作成し、そのテーブルに`DateTime`タイプの値を挿入しています。 + +```sql +CREATE TABLE test.Orders +( + OrderId UInt64, + OrderName String, + OrderDate DateTime +) +ENGINE = Log; +``` + +```sql +INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44')); +``` + +```sql +SELECT + toYear(OrderDate) AS OrderYear, + toMonth(OrderDate) AS OrderMonth, + toDayOfMonth(OrderDate) AS OrderDay, + toHour(OrderDate) AS OrderHour, + toMinute(OrderDate) AS OrderMinute, + toSecond(OrderDate) AS OrderSecond +FROM test.Orders; +``` + +```text +┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐ +│ 2008 │ 10 │ 11 │ 13 │ 23 │ 44 │ +└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘ +``` + +追加の例は[テスト](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00619_extract.sql)で確認できます。 + +### INTERVAL + +[Date](../../sql-reference/data-types/date.md)および[DateTime](../../sql-reference/data-types/datetime.md)タイプとの算術操作で使用される[Interval](../../sql-reference/data-types/special-data-types/interval.md)タイプの値を作成します。 + +インターバルの種類: +- `SECOND` +- `MINUTE` +- `HOUR` +- `DAY` +- `WEEK` +- `MONTH` +- `QUARTER` +- `YEAR` + +`INTERVAL`の値を設定する際に文字列リテラルも使用できます。例えば、`INTERVAL 1 HOUR`は`INTERVAL '1 hour'`または`INTERVAL '1' hour`と同一です。 + +:::tip +異なるタイプのインターバルは組み合わせることができません。`INTERVAL 4 DAY 1 HOUR`のような式は使用できません。インターバルを指定する際には、最小のインターバルユニットと同等またはそれより小さい単位を使用してください。例えば`INTERVAL 25 HOUR`など。以下の例のように逐次的な操作を行うことができます。 +::: + +例: + +```sql +SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR; +``` + +```text +┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐ +│ 2020-11-03 22:09:50 │ 2020-11-08 01:09:50 │ +└─────────────────────┴────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour'; +``` + +```text +┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐ +│ 2020-11-03 22:12:10 │ 2020-11-08 01:12:10 │ +└─────────────────────┴────────────────────────────────────────────────────────┘ +``` + +```sql +SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour; +``` + +```text +┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐ +│ 2020-11-03 22:33:19 │ 2020-11-08 01:33:19 │ +└─────────────────────┴────────────────────────────────────────────────────────────┘ +``` + +:::note +`INTERVAL`構文または`addDays`関数は常に優先されます。単純な加算または減算(例:`now() + ...`のような構文)は、時間の設定を考慮しません。例えば、夏時間など。 +::: + +例: + +```sql +SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day; +``` + +```text +┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐ +│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │ +└─────────────────────┴─────────────────────┴─────────────────────┘ +``` + +**関連項目** + +- [Interval](../../sql-reference/data-types/special-data-types/interval.md)データタイプ +- [toInterval](../../sql-reference/functions/type-conversion-functions.md#function-tointerval)タイプ変換関数 + +## 論理AND演算子 + +構文 `SELECT a AND b` — `a`と`b`の論理積を計算する関数[and](../../sql-reference/functions/logical-functions.md#logical-and-function)。 + +## 論理OR演算子 + +構文 `SELECT a OR b` — `a`と`b`の論理和を計算する関数[or](../../sql-reference/functions/logical-functions.md#logical-or-function)。 + +## 論理否定演算子 + +構文 `SELECT NOT a` — `a`の論理否定を計算する関数[not](../../sql-reference/functions/logical-functions.md#logical-not-function)。 + +## 条件演算子 + +`a ? b : c` – `if(a, b, c)`関数。 + +注意: + +条件演算子は、bとcの値を計算した後、条件aが満たされているかを確認し、対応する値を返します。`b`または`c`が[arrayJoin()](../../sql-reference/functions/array-join.md#functions_arrayjoin)関数であるとき、a条件に関わらず各行が複製されます。 + +## 条件式 + +```sql +CASE [x] + WHEN a THEN b + [WHEN ... THEN ...] + [ELSE c] +END +``` + +`x`が指定されている場合、`transform(x, [a, ...], [b, ...], c)`関数が使用されます。そうでなければ`multiIf(a, b, ..., c)`。 + +式中に`ELSE c`句がない場合、デフォルト値は`NULL`です。 + +`transform`関数は`NULL`を扱いません。 + +## 連結演算子 + +`s1 || s2` – `concat(s1, s2)関数。` + +## ラムダ生成演算子 + +`x -> expr` – `lambda(x, expr)`関数。 + +以下の演算子は優先度を持たず、括弧です: + +## 配列生成演算子 + +`[x1, ...]` – `array(x1, ...)`関数。 + +## タプル生成演算子 + +`(x1, x2, ...)` – `tuple(x1, x2, ...)`関数。 + +## 結合性 + +全ての二項演算子は左結合性を持ちます。例えば、`1 + 2 + 3`は`plus(plus(1, 2), 3)`に変換されます。このため、時には予想通りに動作しないことがあります。例えば、`SELECT 4 > 2 > 3`は0を返します。 + +効率化のため、`and`や`or`関数は任意の数の引数を受け付けることができます。対応する`AND`と`OR`演算子のチェーンはこれらの関数の単一の呼び出しに変換されます。 + +## `NULL`の確認 + +ClickHouseは`IS NULL`と`IS NOT NULL`演算子をサポートしています。 + +### IS NULL {#is_null} + +- [Nullable](../../sql-reference/data-types/nullable.md)型の値の場合、`IS NULL`演算子は以下を返します: + - 値が`NULL`の場合は`1`。 + - それ以外の場合は`0`。 +- その他の値の場合、`IS NULL`演算子は常に`0`を返します。 + +[optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns)設定を有効にすることで最適化することができます。`optimize_functions_to_subcolumns = 1`の場合、関数は全カラムデータを読み取るのではなく、[null](../../sql-reference/data-types/nullable.md#finding-null)サブカラムのみを読み取ります。クエリ`SELECT n IS NULL FROM table`は`SELECT n.null FROM TABLE`に変換されます。 + +```sql +SELECT x+100 FROM t_null WHERE y IS NULL +``` + +```text +┌─plus(x, 100)─┐ +│ 101 │ +└──────────────┘ +``` + +### IS NOT NULL {#is_not_null} + +- [Nullable](../../sql-reference/data-types/nullable.md)型の値の場合、`IS NOT NULL`演算子は以下を返します: + - 値が`NULL`の場合は`0`。 + - それ以外の場合は`1`。 +- その他の値の場合、`IS NOT NULL`演算子は常に`1`を返します。 + +```sql +SELECT * FROM t_null WHERE y IS NOT NULL +``` + +```text +┌─x─┬─y─┐ +│ 2 │ 3 │ +└───┴───┘ +``` + +[optimize_functions_to_subcolumns](../../operations/settings/settings.md#optimize-functions-to-subcolumns)設定を有効にすることで最適化することができます。`optimize_functions_to_subcolumns = 1`の場合、関数は全カラムデータを読み取るのではなく、[null](../../sql-reference/data-types/nullable.md#finding-null)サブカラムのみを読み取ります。クエリ`SELECT n IS NOT NULL FROM table`は`SELECT NOT n.null FROM TABLE`に変換されます。 diff --git a/docs/ja/sql-reference/sql-reference-links.json b/docs/ja/sql-reference/sql-reference-links.json new file mode 100644 index 00000000000..cd31c4fd53e --- /dev/null +++ b/docs/ja/sql-reference/sql-reference-links.json @@ -0,0 +1,12 @@ +[ + { + "title": "Statements", + "description": "A list of available SQL statements in ClickHouse", + "url": "/docs/ja/sql-reference/statements/" + }, + { + "title": "Database and Table Engines", + "description": "Engines determine where and how your data is stored", + "url": "/docs/ja/engines/table-engines" + } +] diff --git a/docs/ja/sql-reference/statements/_category_.yml b/docs/ja/sql-reference/statements/_category_.yml new file mode 100644 index 00000000000..6b7277a69ae --- /dev/null +++ b/docs/ja/sql-reference/statements/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'Statements' +collapsible: true +collapsed: true +link: + type: doc + id: en/sql-reference/statements/index diff --git a/docs/ja/sql-reference/statements/alter/apply-deleted-mask.md b/docs/ja/sql-reference/statements/alter/apply-deleted-mask.md new file mode 100644 index 00000000000..5e115b1f406 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/apply-deleted-mask.md @@ -0,0 +1,22 @@ +--- +slug: /ja/sql-reference/statements/alter/apply-deleted-mask +sidebar_position: 46 +sidebar_label: APPLY DELETED MASK +--- + +# 削除された行のマスクを適用 + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] APPLY DELETED MASK [IN PARTITION partition_id] +``` + +このコマンドは、[論理削除](/docs/ja/sql-reference/statements/delete)によって作成されたマスクを適用し、削除としてマークされた行をディスクから強制的に削除します。このコマンドは重量級の変換であり、その意味論的にはクエリ ```ALTER TABLE [db].name DELETE WHERE _row_exists = 0``` に等しいです。 + +:::note +この機能は、[`MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md) ファミリーのテーブル([レプリケーションされた](../../../engines/table-engines/mergetree-family/replication.md)テーブルを含む)のみで機能します。 +::: + +**関連項目** + +- [論理削除](/docs/ja/sql-reference/statements/delete) +- [物理削除](/docs/ja/sql-reference/statements/alter/delete.md) diff --git a/docs/ja/sql-reference/statements/alter/column.md b/docs/ja/sql-reference/statements/alter/column.md new file mode 100644 index 00000000000..b42a42e2621 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/column.md @@ -0,0 +1,339 @@ +--- +slug: /ja/sql-reference/statements/alter/column +sidebar_position: 37 +sidebar_label: COLUMN +title: "カラム操作" +--- + +テーブル構造を変更するための一連のクエリ。 + +構文: + +``` sql +ALTER [TEMPORARY] TABLE [db].name [ON CLUSTER cluster] ADD|DROP|RENAME|CLEAR|COMMENT|{MODIFY|ALTER}|MATERIALIZE COLUMN ... +``` + +クエリでは、カンマで区切ったアクションのリストを指定します。 各アクションはカラムへの操作です。 + +サポートされているアクションは以下の通りです: + +- [ADD COLUMN](#add-column) — 新しいカラムをテーブルに追加します。 +- [DROP COLUMN](#drop-column) — カラムを削除します。 +- [RENAME COLUMN](#rename-column) — 既存のカラムの名前を変更します。 +- [CLEAR COLUMN](#clear-column) — カラムの値をリセットします。 +- [COMMENT COLUMN](#comment-column) — カラムにテキストコメントを追加します。 +- [MODIFY COLUMN](#modify-column) — カラムのタイプ、デフォルト表現、有効期限 (TTL)、カラム設定を変更します。 +- [MODIFY COLUMN REMOVE](#modify-column-remove) — カラムのプロパティのうちの1つを削除します。 +- [MODIFY COLUMN MODIFY SETTING](#modify-column-modify-setting) - カラム設定を変更します。 +- [MODIFY COLUMN RESET SETTING](#modify-column-reset-setting) - カラム設定をリセットします。 +- [MATERIALIZE COLUMN](#materialize-column) — カラムが欠落している部分でカラムを物理化します。 +これらのアクションについては、以下で詳しく説明します。 + +## ADD COLUMN + +``` sql +ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after | FIRST] +``` + +指定された`name`、`type`、[`codec`](../create/table.md/#column_compression_codec)、および`default_expr`で新しいカラムをテーブルに追加します([デフォルト表現](/docs/ja/sql-reference/statements/create/table.md/#create-default-values)を参照)。 + +`IF NOT EXISTS`句が含まれている場合、カラムがすでに存在していてもクエリはエラーを返しません。`AFTER name_after`(他のカラムの名前)を指定した場合、そのカラムはテーブルカラムのリストにおける指定されたカラムの後に追加されます。テーブルの先頭にカラムを追加したい場合は、`FIRST`句を使用します。それ以外の場合、カラムはテーブルの末尾に追加されます。アクションのチェーンでは、`name_after`は前のアクションで追加されたカラムの名前になることがあります。 + +カラムを追加することは、データに対して何らかのアクションを行うことなくテーブル構造を変更するだけです。`ALTER`の後、データはディスクに現れません。テーブルから読み込む際にカラムのデータが欠落している場合、デフォルト値(もしあればデフォルト表現の実行によって、またはゼロや空文字列を使用することによって)が埋め込まれます。このカラムは、データ部分をマージした後にディスクに現れます([MergeTree](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)を参照)。 + +このアプローチにより、`ALTER`クエリを即座に完了させ、古いデータの量を増やさないようにしています。 + +例: + +``` sql +ALTER TABLE alter_test ADD COLUMN Added1 UInt32 FIRST; +ALTER TABLE alter_test ADD COLUMN Added2 UInt32 AFTER NestedColumn; +ALTER TABLE alter_test ADD COLUMN Added3 UInt32 AFTER ToDrop; +DESC alter_test FORMAT TSV; +``` + +``` text +Added1 UInt32 +CounterID UInt32 +StartDate Date +UserID UInt32 +VisitID UInt32 +NestedColumn.A Array(UInt8) +NestedColumn.S Array(String) +Added2 UInt32 +ToDrop UInt32 +Added3 UInt32 +``` + +## DROP COLUMN + +``` sql +DROP COLUMN [IF EXISTS] name +``` + +`name`という名前のカラムを削除します。`IF EXISTS`句を指定した場合、カラムが存在しなくてもクエリはエラーを返しません。 + +ファイルシステムからデータを削除します。これはファイルを丸ごと削除するため、クエリはほぼ即座に完了します。 + +:::tip +[Materialized View](/docs/ja/sql-reference/statements/create/view.md/#materialized)で参照されているカラムは削除できません。それ以外の場合はエラーを返します。 +::: + +例: + +``` sql +ALTER TABLE visits DROP COLUMN browser +``` + +## RENAME COLUMN + +``` sql +RENAME COLUMN [IF EXISTS] name to new_name +``` + +カラム`name`を`new_name`に名前変更します。`IF EXISTS`句を指定した場合、カラムが存在しなくてもクエリはエラーを返しません。名前変更は基となるデータに影響しないため、クエリはほぼ即座に完了します。 + +**注意**: テーブルのキー表現に指定されたカラム(`ORDER BY`または`PRIMARY KEY`で指定されたカラム)は名前変更できません。これらのカラムを変更しようとすると、`SQL Error [524]`が発生します。 + +例: + +``` sql +ALTER TABLE visits RENAME COLUMN webBrowser TO browser +``` + +## CLEAR COLUMN + +``` sql +CLEAR COLUMN [IF EXISTS] name IN PARTITION partition_name +``` + +指定されたパーティションのカラム内のすべてのデータをリセットします。[パーティション表現の設定方法](../alter/partition.md/#how-to-set-partition-expression)のセクションでパーティション名の設定について詳しく説明しています。 + +`IF EXISTS`句を指定した場合、カラムが存在しなくてもクエリはエラーを返しません。 + +例: + +``` sql +ALTER TABLE visits CLEAR COLUMN browser IN PARTITION tuple() +``` + +## COMMENT COLUMN + +``` sql +COMMENT COLUMN [IF EXISTS] name 'テキストコメント' +``` + +カラムにコメントを追加します。`IF EXISTS`句を指定した場合、カラムが存在しなくてもクエリはエラーを返しません。 + +各カラムには1つのコメントを持つことができます。カラムに既にコメントが存在する場合、新しいコメントが以前のコメントを上書きします。 + +コメントは、[DESCRIBE TABLE](/docs/ja/sql-reference/statements/describe-table.md)クエリによって返される`comment_expression`カラムに保存されます。 + +例: + +``` sql +ALTER TABLE visits COMMENT COLUMN browser 'This column shows the browser used for accessing the site.' +``` + +## MODIFY COLUMN + +``` sql +MODIFY COLUMN [IF EXISTS] name [type] [default_expr] [codec] [TTL] [settings] [AFTER name_after | FIRST] +ALTER COLUMN [IF EXISTS] name TYPE [type] [default_expr] [codec] [TTL] [settings] [AFTER name_after | FIRST] +``` + +このクエリは、`name`カラムのプロパティを変更します: + +- タイプ + +- デフォルト表現 + +- 圧縮コーデック + +- 有効期限 (TTL) + +- カラムレベルの設定 + +カラム圧縮コーデックの変更例については、[カラム圧縮コーデック](../create/table.md/#column_compression_codec)を参照してください。 + +カラムTTLの変更例については、[カラムTTL](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-column-ttl)を参照してください。 + +カラムレベル設定の変更例については、[カラムレベル設定](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#column-level-settings)を参照してください。 + +`IF EXISTS`句を指定した場合、カラムが存在しなくてもクエリはエラーを返しません。 + +タイプを変更する際には、[toType](/docs/ja/sql-reference/functions/type-conversion-functions.md)関数が適用されたかのように値が変換されます。デフォルト表現のみを変更する場合、クエリは複雑な操作を行わず、ほぼ即座に完了します。 + +例: + +``` sql +ALTER TABLE visits MODIFY COLUMN browser Array(String) +``` + +カラムタイプの変更は唯一の複雑なアクションであり、データを含むファイルの内容を変更します。大規模なテーブルの場合、この操作には長時間かかることがあります。 + +クエリは`FIRST | AFTER`句を使用してカラムの順序を変更することもでき、詳細は[ADD COLUMN](#add-column)の説明を参照してください。ただし、この場合、カラムタイプは必須です。 + +例: + +```sql +CREATE TABLE users ( + c1 Int16, + c2 String +) ENGINE = MergeTree +ORDER BY c1; + +DESCRIBE users; +┌─name─┬─type───┬ +│ c1 │ Int16 │ +│ c2 │ String │ +└──────┴────────┴ + +ALTER TABLE users MODIFY COLUMN c2 String FIRST; + +DESCRIBE users; +┌─name─┬─type───┬ +│ c2 │ String │ +│ c1 │ Int16 │ +└──────┴────────┴ + +ALTER TABLE users ALTER COLUMN c2 TYPE String AFTER c1; + +DESCRIBE users; +┌─name─┬─type───┬ +│ c1 │ Int16 │ +│ c2 │ String │ +└──────┴────────┴ +``` + +`ALTER`クエリは原子的です。MergeTreeテーブルに対してもロックフリーです。 + +カラムを変更するための`ALTER`クエリはレプリケートされます。指示はZooKeeperに保存され、その後各レプリカがそれを適用します。すべての`ALTER`クエリは同じ順序で実行されます。クエリは、他のレプリカ上で適切なアクションが完了するのを待ちます。しかし、レプリケートされたテーブルでカラムを変更するためのクエリは中断可能で、すべての操作は非同期で実行されます。 + +## MODIFY COLUMN REMOVE + +カラムのプロパティのうちの1つを削除します: `DEFAULT`, `ALIAS`, `MATERIALIZED`, `CODEC`, `COMMENT`, `TTL`, `SETTINGS`. + +構文: + +```sql +ALTER TABLE table_name MODIFY COLUMN column_name REMOVE property; +``` + +**例** + +TTLの削除: + +```sql +ALTER TABLE table_with_ttl MODIFY COLUMN column_ttl REMOVE TTL; +``` + +**関連項目** + +- [REMOVE TTL](ttl.md). + +## MODIFY COLUMN MODIFY SETTING + +カラム設定を変更します。 + +構文: + +```sql +ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING name=value,...; +``` + +**例** + +カラムの`max_compress_block_size`を`1MB`に変更: + +```sql +ALTER TABLE table_name MODIFY COLUMN column_name MODIFY SETTING max_compress_block_size = 1048576; +``` + +## MODIFY COLUMN RESET SETTING + +カラム設定をリセットし、テーブルのCREATEクエリのカラム式に宣言されている設定を削除します。 + +構文: + +```sql +ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING name,...; +``` + +**例** + +カラム設定`max_compress_block_size`をデフォルト値にリセット: + +```sql +ALTER TABLE table_name MODIFY COLUMN column_name RESET SETTING max_compress_block_size; +``` + +## MATERIALIZE COLUMN + +`DEFAULT`または`MATERIALIZED`値表現を持つカラムを物理化します。`ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED`を使用して物理化されたカラムを追加する際、既存の行に物理化された値が自動的に埋め込まれません。`MATERIALIZE COLUMN`文は、`DEFAULT`または`MATERIALIZED`表現が追加または更新された後に既存のカラムデータを書き換えるために使用されます(既存のデータを変更することなくメタデータのみを更新します)。 +これは[mutation](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +新しく追加または更新された`MATERIALIZED`値表現を持つカラムの場合、すべての既存行が書き換えられます。 + +新しく追加または更新された`DEFAULT`値表現を持つカラムの場合、挙動はClickHouseのバージョンに依存します: +- ClickHouse < v24.2では、すべての既存行が書き換えられます。 +- ClickHouse >= v24.2では、クリックハウスが挿入時に行の値が明示的に指定されたか、または`DEFAULT`値表現から計算されたかを区別します。値が明示的に指定された場合、ClickHouseはそのまま保持します。計算された場合、新しく追加または更新された`MATERIALIZED`値表現に変更します。 + +構文: + +```sql +ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE COLUMN col [IN PARTITION partition | IN PARTITION ID 'partition_id']; +``` +- パーティションを指定した場合、そのパーティションのみが物理化されます。 + +**例** + +```sql +DROP TABLE IF EXISTS tmp; +SET mutations_sync = 2; +CREATE TABLE tmp (x Int64) ENGINE = MergeTree() ORDER BY tuple() PARTITION BY tuple(); +INSERT INTO tmp SELECT * FROM system.numbers LIMIT 5; +ALTER TABLE tmp ADD COLUMN s String MATERIALIZED toString(x); + +ALTER TABLE tmp MATERIALIZE COLUMN s; + +SELECT groupArray(x), groupArray(s) FROM (select x,s from tmp order by x); + +┌─groupArray(x)─┬─groupArray(s)─────────┐ +│ [0,1,2,3,4] │ ['0','1','2','3','4'] │ +└───────────────┴───────────────────────┘ + +ALTER TABLE tmp MODIFY COLUMN s String MATERIALIZED toString(round(100/x)); + +INSERT INTO tmp SELECT * FROM system.numbers LIMIT 5,5; + +SELECT groupArray(x), groupArray(s) FROM tmp; + +┌─groupArray(x)─────────┬─groupArray(s)──────────────────────────────────┐ +│ [0,1,2,3,4,5,6,7,8,9] │ ['0','1','2','3','4','20','17','14','12','11'] │ +└───────────────────────┴────────────────────────────────────────────────┘ + +ALTER TABLE tmp MATERIALIZE COLUMN s; + +SELECT groupArray(x), groupArray(s) FROM tmp; + +┌─groupArray(x)─────────┬─groupArray(s)─────────────────────────────────────────┐ +│ [0,1,2,3,4,5,6,7,8,9] │ ['inf','100','50','33','25','20','17','14','12','11'] │ +└───────────────────────┴───────────────────────────────────────────────────────┘ +``` + +**関連項目** + +- [MATERIALIZED](/docs/ja/sql-reference/statements/create/table.md/#materialized). + +## 制限事項 + +`ALTER`クエリは、ネストされたデータ構造内の個々の要素(カラム)を作成および削除することを可能にしますが、全体のネストされたデータ構造を操作することはできません。ネストされたデータ構造を追加するには、`name.nested_name`のような名前と`Array(T)`タイプでカラムを追加できます。ネストされたデータ構造は、ドットの前に同じプレフィックスを持つ複数の配列カラムと等価です。 + +主キーやサンプリングキー(`ENGINE`式で使用されるカラム)のカラムを削除するサポートはありません。主キーに含まれるカラムのタイプを変更するのは、この変更がデータを変更しない場合に限り可能です(例えば、Enumの値を追加したり、`DateTime`から`UInt32`に型を変更することが可能です)。 + +`ALTER`クエリで必要なテーブル変更が十分でない場合、新しいテーブルを作成し、[INSERT SELECT](/docs/ja/sql-reference/statements/insert-into.md/#inserting-the-results-of-select)クエリを使用してデータをコピーし、[RENAME](/docs/ja/sql-reference/statements/rename.md/#rename-table)クエリを使用してテーブルを切り替え、古いテーブルを削除することができます。 + +`ALTER`クエリはテーブルのすべての読み取りおよび書き込みをブロックします。つまり、`ALTER`クエリの時に長時間の`SELECT`が実行されている場合、`ALTER`クエリは完了を待ちます。同時に、同じテーブルへのすべての新しいクエリは`ALTER`が実行されている間、待機します。 + +データを自体で保存していないテーブル(例えば[Merge](/docs/ja/sql-reference/statements/alter/index.md) や [分散テーブル](/docs/ja/sql-reference/statements/alter/index.md)など)に対する`ALTER`は単にテーブル構造を変更するだけであり、従属するテーブルの構造を変更しません。例えば、`分散テーブル`に対して`ALTER`を実行する場合、リモートサーバー上のテーブルに対しても`ALTER`を実行する必要があります。 diff --git a/docs/ja/sql-reference/statements/alter/comment.md b/docs/ja/sql-reference/statements/alter/comment.md new file mode 100644 index 00000000000..eeb8e2c4b9e --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/comment.md @@ -0,0 +1,65 @@ +--- +slug: /ja/sql-reference/statements/alter/comment +sidebar_position: 51 +sidebar_label: COMMENT +--- + +# ALTER TABLE ... MODIFY COMMENT + +コメントが設定されていたかどうかに関わらず、テーブルにコメントを追加、修正、または削除します。コメントの変更は、[system.tables](../../../operations/system-tables/tables.md)と`SHOW CREATE TABLE`クエリの両方で反映されます。 + +**構文** + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY COMMENT 'Comment' +``` + +**例** + +コメント付きのテーブルを作成する(詳細は[COMMENT](../../../sql-reference/statements/create/table.md#comment-table)句を参照): + +``` sql +CREATE TABLE table_with_comment +( + `k` UInt64, + `s` String +) +ENGINE = Memory() +COMMENT 'The temporary table'; +``` + +テーブルコメントを修正する: + +``` sql +ALTER TABLE table_with_comment MODIFY COMMENT 'new comment on a table'; +SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment'; +``` + +新しいコメントの出力: + +```text +┌─comment────────────────┐ +│ new comment on a table │ +└────────────────────────┘ +``` + +テーブルコメントを削除する: + +``` sql +ALTER TABLE table_with_comment MODIFY COMMENT ''; +SELECT comment FROM system.tables WHERE database = currentDatabase() AND name = 'table_with_comment'; +``` + +削除されたコメントの出力: + +```text +┌─comment─┐ +│ │ +└─────────┘ +``` + +**注意点** + +Replicated テーブルの場合、コメントは異なるレプリカで異なる場合があります。コメントの修正は単一のレプリカに適用されます。 + +この機能はバージョン 23.9 以降で利用可能です。以前の ClickHouse バージョンでは動作しません。 diff --git a/docs/ja/sql-reference/statements/alter/constraint.md b/docs/ja/sql-reference/statements/alter/constraint.md new file mode 100644 index 00000000000..56d42ab74b1 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/constraint.md @@ -0,0 +1,24 @@ +--- +slug: /ja/sql-reference/statements/alter/constraint +sidebar_position: 43 +sidebar_label: CONSTRAINT +--- + +# Constraintの操作 + +制約は次の構文を使用して追加または削除できます。 + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] ADD CONSTRAINT [IF NOT EXISTS] constraint_name CHECK expression; +ALTER TABLE [db].name [ON CLUSTER cluster] DROP CONSTRAINT [IF EXISTS] constraint_name; +``` + +詳細は[制約](../../../sql-reference/statements/create/table.md#constraints)を参照してください。 + +クエリはテーブルの制約に関するメタデータを追加または削除しますので、それらは即座に処理されます。 + +:::tip +制約チェックは、追加された場合でも**既存のデータには実行されません**。 +::: + +レプリケートされたテーブルに対するすべての変更はZooKeeperに通知され、他のレプリカにも適用されます。 diff --git a/docs/ja/sql-reference/statements/alter/delete.md b/docs/ja/sql-reference/statements/alter/delete.md new file mode 100644 index 00000000000..2365e3ce4b3 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/delete.md @@ -0,0 +1,33 @@ +--- +slug: /ja/sql-reference/statements/alter/delete +sidebar_position: 39 +sidebar_label: DELETE +--- + +# ALTER TABLE ... DELETE ステートメント + +``` sql +ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr +``` + +指定されたフィルタリング式に一致するデータを削除します。これは[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +:::note +`ALTER TABLE` プレフィックスは、SQLをサポートする他の多くのシステムとこの構文を異ならせます。これは、OLTPデータベースの類似のクエリとは異なり、頻繁に使用することを意図していない重い操作であることを示すためです。`ALTER TABLE` は、基礎データが削除される前にマージされる必要がある重い操作と見なされます。MergeTree テーブルの場合は、論理削除を行い、かなり速く操作できる [`DELETE FROM` クエリ](/docs/ja/sql-reference/statements/delete.md) の使用を検討してください。 +::: + +`filter_expr` は `UInt8` 型である必要があります。この式がゼロ以外の値を取るテーブルの行を削除します。 + +1つのクエリには、コンマで区切られた複数のコマンドを含めることができます。 + +クエリ処理の同期性は、[mutations_sync](/docs/ja/operations/settings/settings.md/#mutations_sync) 設定によって定義されます。デフォルトでは非同期です。 + +**関連情報** + +- [ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations) +- [ALTER クエリの同期性](/docs/ja/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [mutations_sync](/docs/ja/operations/settings/settings.md/#mutations_sync) 設定 + +## 関連コンテンツ + +- ブログ: [Handling Updates and Deletes in ClickHouse](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/sql-reference/statements/alter/index.md b/docs/ja/sql-reference/statements/alter/index.md new file mode 100644 index 00000000000..ff40cadbd41 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/index.md @@ -0,0 +1,71 @@ +--- +slug: /ja/sql-reference/statements/alter/ +sidebar_position: 35 +sidebar_label: ALTER +--- + +# ALTER + +ほとんどの`ALTER TABLE`クエリはテーブルの設定やデータを変更します: + +- [カラム](/docs/ja/sql-reference/statements/alter/column.md) +- [パーティション](/docs/ja/sql-reference/statements/alter/partition.md) +- [DELETE](/docs/ja/sql-reference/statements/alter/delete.md) +- [UPDATE](/docs/ja/sql-reference/statements/alter/update.md) +- [ORDER BY](/docs/ja/sql-reference/statements/alter/order-by.md) +- [インデックス](/docs/ja/sql-reference/statements/alter/skipping-index.md) +- [制約](/docs/ja/sql-reference/statements/alter/constraint.md) +- [有効期限 (TTL)](/docs/ja/sql-reference/statements/alter/ttl.md) +- [統計](/docs/ja/sql-reference/statements/alter/statistics.md) +- [DELETED MASKの適用](/docs/ja/sql-reference/statements/alter/apply-deleted-mask.md) + +:::note +ほとんどの`ALTER TABLE`クエリは、[\*MergeTree](/docs/ja/engines/table-engines/mergetree-family/index.md)テーブル、[Merge](/docs/ja/engines/table-engines/special/merge.md)および[分散テーブル](/docs/ja/engines/table-engines/special/distributed.md)でのみサポートされています。 +::: + +これらの`ALTER`ステートメントはビューを操作します: + +- [ALTER TABLE ... MODIFY QUERY](/docs/ja/sql-reference/statements/alter/view.md) — [Materialized View](/docs/ja/sql-reference/statements/create/view.md/#materialized)構造を変更します。 +- [ALTER LIVE VIEW](/docs/ja/sql-reference/statements/alter/view.md/#alter-live-view) — [Live View](/docs/ja/sql-reference/statements/create/view.md/#live-view)を更新します。 + +これらの`ALTER`ステートメントは、ロールベースのアクセス制御に関連するエンティティを修正します: + +- [USER](/docs/ja/sql-reference/statements/alter/user.md) +- [ROLE](/docs/ja/sql-reference/statements/alter/role.md) +- [QUOTA](/docs/ja/sql-reference/statements/alter/quota.md) +- [行のポリシー](/docs/ja/sql-reference/statements/alter/row-policy.md) +- [設定プロファイル](/docs/ja/sql-reference/statements/alter/settings-profile.md) + +[ALTER TABLE ... MODIFY COMMENT](/docs/ja/sql-reference/statements/alter/comment.md)ステートメントは、テーブルに対しコメントを追加、修正、または削除します。これは、以前に設定されていたかどうかに関係なく行われます。 + +[ALTER NAMED COLLECTION](/docs/ja/sql-reference/statements/alter/named-collection.md)ステートメントは[Named Collections](/docs/ja/operations/named-collections.md)を修正します。 + +## 変異(Mutations) + +テーブルデータを操作することを意図した`ALTER`クエリは、「変異」と呼ばれるメカニズムで実装されています。代表的なものに、[ALTER TABLE ... DELETE](/docs/ja/sql-reference/statements/alter/delete.md)や[ALTER TABLE ... UPDATE](/docs/ja/sql-reference/statements/alter/update.md)があります。これらは[MergeTree](/docs/ja/engines/table-engines/mergetree-family/index.md)テーブルのマージに似た非同期のバックグラウンドプロセスで、新しい「変化した」パーツのバージョンを生成します。 + +`*MergeTree`テーブルでは、変異は**データ全体のパーツを書き換えること**で実行されます。アトミシティはなく、パーツは変異された部分が準備ができ次第、入れ替えられ、変異中に開始された`SELECT`クエリは既に変異されたパーツからのデータと、まだ変異されていないパーツからのデータの両方を参照します。 + +変異はその作成順に完全に順序付けられ、その順で各パーツに適用されます。また、変異は`INSERT INTO`クエリと部分的に順序付けられます:変異が提出される前にテーブルに挿入されたデータは変異され、後に挿入されたデータは変異されません。なお、変異はインサートを一切ブロックしません。 + +変異クエリは、変異エントリが追加されるとすぐに(レプリケートされたテーブルの場合はZooKeeper、非レプリケートされたテーブルの場合はファイルシステムに)応答を返します。変異自体はシステムのプロファイル設定を使用して非同期で実行されます。変異の進行状況を追跡するためには、[`system.mutations`](/docs/ja/operations/system-tables/mutations.md/#system_tables-mutations)テーブルを使用できます。正常に提出された変異は、ClickHouseサーバーが再起動されても実行を続けます。変異が一度提出されると巻き戻す方法はありませんが、何らかの理由で変異が詰まった場合は、[`KILL MUTATION`](/docs/ja/sql-reference/statements/kill.md/#kill-mutation)クエリでキャンセルできます。 + +終了した変異のエントリはすぐに削除されることはなく、保存されるエントリ数は`finished_mutations_to_keep`ストレージエンジンパラメータで決定されます。古い変異エントリは削除されます。 + +## ALTERクエリの同期性(Synchronicity) + +非レプリケートテーブルでは、すべての`ALTER`クエリは同期的に実行されます。レプリケートされたテーブルでは、クエリは適切なアクションに対する指示を`ZooKeeper`に追加するだけで、そのアクション自体はできるだけ早く実行されます。ただし、クエリはこれらのアクションがすべてのレプリカで完了するのを待つことができます。 + +変異を作成する`ALTER`クエリ(例:`UPDATE`、`DELETE`、`MATERIALIZE INDEX`、`MATERIALIZE PROJECTION`、`MATERIALIZE COLUMN`、`APPLY DELETED MASK`、`CLEAR STATISTIC`、`MATERIALIZE STATISTIC`を含むがこれに限定されない)の同期性は、[mutations_sync](/docs/ja/operations/settings/settings.md/#mutations_sync)設定で定義されます。 + +メタデータのみを修正するその他の`ALTER`クエリについては、[alter_sync](/docs/ja/operations/settings/settings.md/#alter-sync)設定を使用して待機を設定できます。 + +非アクティブなレプリカがすべての`ALTER`クエリを実行するのを待機する時間(秒)を指定するには、[replication_wait_for_inactive_replica_timeout](/docs/ja/operations/settings/settings.md/#replication-wait-for-inactive-replica-timeout)設定を使用できます。 + +:::note +すべての`ALTER`クエリで、`alter_sync = 2`かつ`replication_wait_for_inactive_replica_timeout`設定で指定された時間を超えて非アクティブなレプリカがある場合、例外`UNFINISHED`がスローされます。 +::: + +## 関連コンテンツ + +- ブログ: [ClickHouseにおける更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/sql-reference/statements/alter/named-collection.md b/docs/ja/sql-reference/statements/alter/named-collection.md new file mode 100644 index 00000000000..1a0f63acd34 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/named-collection.md @@ -0,0 +1,34 @@ +--- +slug: /ja/sql-reference/statements/alter/named-collection +sidebar_label: NAMED COLLECTION +--- + +import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; + + + +# ALTER NAMED COLLECTION + +このクエリは既存の名前付きコレクションを変更することを目的としています。 + +**構文** + +```sql +ALTER NAMED COLLECTION [IF EXISTS] name [ON CLUSTER cluster] +[ SET +key_name1 = 'some value' [[NOT] OVERRIDABLE], +key_name2 = 'some value' [[NOT] OVERRIDABLE], +key_name3 = 'some value' [[NOT] OVERRIDABLE], +... ] | +[ DELETE key_name4, key_name5, ... ] +``` + +**例** + +```sql +CREATE NAMED COLLECTION foobar AS a = '1' NOT OVERRIDABLE, b = '2'; + +ALTER NAMED COLLECTION foobar SET a = '2' OVERRIDABLE, c = '3'; + +ALTER NAMED COLLECTION foobar DELETE b; +``` diff --git a/docs/ja/sql-reference/statements/alter/order-by.md b/docs/ja/sql-reference/statements/alter/order-by.md new file mode 100644 index 00000000000..a24756cea13 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/order-by.md @@ -0,0 +1,19 @@ +--- +slug: /ja/sql-reference/statements/alter/order-by +sidebar_position: 41 +sidebar_label: ORDER BY +--- + +# キー式の操作 + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY ORDER BY new_expression +``` + +このコマンドは、テーブルの[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md)を`new_expression`(式または式のタプル)に変更します。主キーは同じままです。 + +このコマンドは軽量で、メタデータのみを変更します。データ部分の行がソートキーの式で整列されるという特性を保持するために、既存のカラムを含む式をソートキーに追加することはできません(デフォルトのカラム値なしで、同じ`ALTER`クエリ内で`ADD COLUMN`コマンドによって追加されたカラムのみ)。 + +:::note +これは[`MergeTree`](../../../engines/table-engines/mergetree-family/mergetree.md)ファミリーのテーブル([レプリケーション](../../../engines/table-engines/mergetree-family/replication.md)されたテーブルを含む)でのみ機能します。 +::: diff --git a/docs/ja/sql-reference/statements/alter/partition.md b/docs/ja/sql-reference/statements/alter/partition.md new file mode 100644 index 00000000000..54f5a67471d --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/partition.md @@ -0,0 +1,362 @@ +--- +slug: /ja/sql-reference/statements/alter/partition +sidebar_position: 38 +sidebar_label: PARTITION +title: "パーティションとパーツの操作" +--- + +[パーティション](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md)に対する以下の操作が可能です: + +- [DETACH PARTITION\|PART](#detach-partitionpart) — パーティションまたはパーツを`detached`ディレクトリに移動し、忘れます。 +- [DROP PARTITION\|PART](#drop-partitionpart) — パーティションまたはパーツを削除します。 +- [DROP DETACHED PARTITION\|PART](#drop-detached-partitionpart) - `detached`から指定されたパートまたはすべてのパーティションのパーツを削除します。 +- [FORGET PARTITION](#forget-partition) — パーティションが空の場合、ZooKeeperからそのメタデータを削除します。 +- [ATTACH PARTITION\|PART](#attach-partitionpart) — `detached`ディレクトリからテーブルにパーティションまたはパーツを追加します。 +- [ATTACH PARTITION FROM](#attach-partition-from) — データパーティションを他のテーブルからコピーして追加します。 +- [REPLACE PARTITION](#replace-partition) — データパーティションを他のテーブルからコピーし、置き換えます。 +- [MOVE PARTITION TO TABLE](#move-partition-to-table) — データパーティションを他のテーブルに移動します。 +- [CLEAR COLUMN IN PARTITION](#clear-column-in-partition) — パーティション内の指定されたカラムの値をリセットします。 +- [CLEAR INDEX IN PARTITION](#clear-index-in-partition) — パーティション内の指定されたセカンダリインデックスをリセットします。 +- [FREEZE PARTITION](#freeze-partition) — パーティションのバックアップを作成します。 +- [UNFREEZE PARTITION](#unfreeze-partition) — パーティションのバックアップを削除します。 +- [FETCH PARTITION\|PART](#fetch-partitionpart) — 他のサーバーからパーツまたはパーティションをダウンロードします。 +- [MOVE PARTITION\|PART](#move-partitionpart) — パーティションまたはデータパーツを他のディスクまたはボリュームに移動します。 +- [UPDATE IN PARTITION](#update-in-partition) — パーティション内のデータを条件に基づいて更新します。 +- [DELETE IN PARTITION](#delete-in-partition) — パーティション内のデータを条件に基づいて削除します。 + +## DETACH PARTITION\|PART + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] DETACH PARTITION|PART partition_expr +``` + +指定されたパーティションのすべてのデータを`detached`ディレクトリに移動します。サーバーは、このデタッチされたデータパーティションを存在しないものとして忘れます。このデータについてサーバーは、[ATTACH](#attach-partitionpart)クエリを行うまで認識しません。 + +例: + +``` sql +ALTER TABLE mt DETACH PARTITION '2020-11-21'; +ALTER TABLE mt DETACH PART 'all_2_2_0'; +``` + +パーティション式の設定については、[パーティション式の設定方法](#how-to-set-partition-expression)セクションを参照してください。 + +クエリが実行された後、`detached`ディレクトリのデータに対して好きな操作を行うことができます。ファイルシステムから削除するか、そのままにしておくことが可能です。 + +このクエリはレプリケートされ、すべてのレプリカでデータを`detached`ディレクトリに移動します。このクエリを実行できるのは、リーダーレプリカ上のみです。レプリカがリーダーかどうかを確認するには、[system.replicas](/docs/ja/operations/system-tables/replicas.md/#system_tables-replicas)テーブルへの`SELECT`クエリを実行します。あるいは、すべてのレプリカで`DETACH`クエリを実行するのが簡単で、リーダーレプリカ以外のすべてのレプリカは例外を投げます(複数のリーダーを許可するとは言え、リーダーレプリカのみがクエリを処理します)。 + +## DROP PARTITION\|PART + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr +``` + +指定されたパーティションをテーブルから削除します。このクエリはパーティションを非アクティブとしてタグ付けし、約10分でデータを完全に削除します。 + +パーティション式の設定については、[パーティション式の設定方法](#how-to-set-partition-expression)セクションを参照してください。 + +このクエリはレプリケートされ、すべてのレプリカからデータを削除します。 + +例: + +``` sql +ALTER TABLE mt DROP PARTITION '2020-11-21'; +ALTER TABLE mt DROP PART 'all_4_4_0'; +``` + +## DROP DETACHED PARTITION\|PART + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] DROP DETACHED PARTITION|PART ALL|partition_expr +``` + +`detached`から指定されたパーツまたは指定されたパーティションのすべてのパーツを削除します。 +パーティション式の設定については、[パーティション式の設定方法](#how-to-set-partition-expression)セクションを参照してください。 + +## FORGET PARTITION + +``` sql +ALTER TABLE table_name FORGET PARTITION partition_expr +``` + +ZooKeeperから空のパーティションに関するすべてのメタデータを削除します。パーティションが空でないか、不明な場合はクエリが失敗します。再利用されないパーティションに対してのみ実行してください。 + +パーティション式の設定については、[パーティション式の設定方法](#how-to-set-partition-expression)セクションを参照してください。 + +例: + +``` sql +ALTER TABLE mt FORGET PARTITION '20201121'; +``` + +## ATTACH PARTITION\|PART + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] ATTACH PARTITION|PART partition_expr +``` + +`detached`ディレクトリからテーブルにデータを追加します。全体のパーティションまたは個別のパーツについてデータを追加することができます。例: + +``` sql +ALTER TABLE visits ATTACH PARTITION 201901; +ALTER TABLE visits ATTACH PART 201901_2_2_0; +``` + +パーティション式の設定については、[パーティション式の設定方法](#how-to-set-partition-expression)セクションを参照してください。 + +このクエリはレプリケートされます。レプリカ・イニシエーターは`detached`ディレクトリにデータがあるか確認し、データが存在する場合、その整合性をチェックします。すべてが正しければ、データをテーブルに追加します。 + +非イニシエーターのレプリカが添付コマンドを受け取った際に、正しいチェックサムを持つパーツが自身の`detached`フォルダに見つかれば、他のレプリカからデータを取得せずにデータを添付します。 +パーツが正しいチェックサムを持つ場合は、データは該当パーツを持つ任意のレプリカからダウンロードされます。 + +データを1つのレプリカの`detached`ディレクトリに配置し、`ALTER ... ATTACH`クエリを使用してデータをすべてのレプリカのテーブルに追加することができます。 + +## ATTACH PARTITION FROM + +``` sql +ALTER TABLE table2 [ON CLUSTER cluster] ATTACH PARTITION partition_expr FROM table1 +``` + +このクエリは、`table1`から`table2`にデータパーティションをコピーします。 + +注意点: + +- `table1`や`table2`からデータは削除されません。 +- `table1`は一時テーブルである可能性があります。 + +クエリを成功させるためには、次の条件を満たす必要があります: + +- 両方のテーブルが同じ構造でなければならない。 +- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。 +- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。 +- 両方のテーブルが同じストレージポリシーを持っている必要がある。 + +## REPLACE PARTITION + +``` sql +ALTER TABLE table2 [ON CLUSTER cluster] REPLACE PARTITION partition_expr FROM table1 +``` + +このクエリは、`table1`から`table2`にデータパーティションをコピーし、`table2`の既存のパーティションを置き換えます。操作はアトミックです。 + +注意点: + +- `table1`からデータは削除されません。 +- `table1`は一時テーブルである可能性があります。 + +クエリを成功させるためには、次の条件を満たす必要があります: + +- 両方のテーブルが同じ構造でなければならない。 +- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。 +- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。 +- 両方のテーブルが同じストレージポリシーを持っている必要がある。 + +## MOVE PARTITION TO TABLE + +``` sql +ALTER TABLE table_source [ON CLUSTER cluster] MOVE PARTITION partition_expr TO TABLE table_dest +``` + +このクエリは、`table_source`から`table_dest`にデータパーティションを移動し、`table_source`からデータを削除します。 + +クエリを成功させるためには、次の条件を満たす必要があります: + +- 両方のテーブルが同じ構造でなければならない。 +- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。 +- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。 +- 両方のテーブルが同じストレージポリシーを持っている必要がある。 +- 両方のテーブルが同じエンジンファミリーでなければならない(レプリケートまたは非レプリケート)。 + +## CLEAR COLUMN IN PARTITION + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] CLEAR COLUMN column_name IN PARTITION partition_expr +``` + +指定されたパーティション内の特定のカラムのすべての値をリセットします。テーブル作成時に`DEFAULT`句が指定されていた場合、このクエリはカラムの値を指定されたデフォルト値に設定します。 + +例: + +``` sql +ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902 +``` + +## FREEZE PARTITION + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name'] +``` + +このクエリは、指定されたパーティションのローカルバックアップを作成します。`PARTITION`句が省略された場合、すべてのパーティションのバックアップが一度に作成されます。 + +:::note +バックアッププロセス全体がサーバーを停止せずに行われます。 +::: + +名前が指定されたパーティションのバックアップを削除します。`PARTITION`句が省略された場合、すべてのパーティションのバックアップが一度に削除されます。 + +:::note +データストレージ用のディスクセットをテーブルに使用する場合、`PARTITION`式に一致するデータパーツを格納する`shadow/N`ディレクトリが各ディスクに作成されます。 +::: + +バックアップ作成時間には、データスナップショット用に、テーブルデータにハードリンクが作成されます。ハードリンクは、`/var/lib/clickhouse/shadow/N/...`ディレクトリに配置され、ここで: + +- `/var/lib/clickhouse/`は設定で指定されたClickHouseの作業ディレクトリです。 +- `N`はバックアップのインクリメンタル番号です。 +- `WITH NAME`パラメータが指定されている場合、インクリメンタル番号の代わりに`'backup_name'`パラメータの値が使用されます。 + +このバックアップはほぼ瞬時に作成されます(ただし、まず対応するテーブルに現在のクエリが終了するのを待機します)。 + +`ALTER TABLE t FREEZE PARTITION`はデータのみをコピーし、テーブルのメタデータはコピーしません。テーブルメタデータのバックアップを取るには、`/var/lib/clickhouse/metadata/database/table.sql`ファイルをコピーします。 + +バックアップからデータを復元するには、次の操作を行います: + +1. テーブルが存在しない場合は作成します。クエリを見るには、`.sql`ファイルを使用します(`ATTACH`を`CREATE`に置き換えます)。 +2. バックアップ内の`data/database/table/`ディレクトリから`/var/lib/clickhouse/data/database/table/detached/`ディレクトリにデータをコピーします。 +3. `ALTER TABLE t ATTACH PARTITION`クエリを実行して、データをテーブルに追加します。 + +バックアップからの復元はサーバーの停止を必要としません。 + +バックアップおよびデータ復元についての詳細は、[データバックアップ](/docs/ja/operations/backup.md)セクションを参照してください。 + +## UNFREEZE PARTITION + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name' +``` + +指定された名前を持つ`freezed`パーティションをディスクから削除します。`PARTITION`句が省略された場合、すべてのパーティションのバックアップが一度に削除されます。 + +## CLEAR INDEX IN PARTITION + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] CLEAR INDEX index_name IN PARTITION partition_expr +``` + +このクエリは、`CLEAR COLUMN`と同様に機能しますが、カラムデータの代わりにインデックスをリセットします。 + +## FETCH PARTITION|PART + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper' +``` + +他のサーバーからパーティションをダウンロードします。このクエリはレプリケートされたテーブルでのみ動作します。 + +このクエリは次の動作を行います: + +1. 指定されたシャードからパーティション|パートをダウンロードします。'path-in-zookeeper'には、ZooKeeper内でのシャードへのパスを指定する必要があります。 +2. 次に、クエリはダウンロードしたデータを`table_name`テーブルの`detached`ディレクトリに配置します。[ATTACH PARTITION\|PART](#attach-partitionpart)クエリを使用してデータをテーブルに追加します。 + +例: + +1. FETCH PARTITION +``` sql +ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits'; +ALTER TABLE users ATTACH PARTITION 201902; +``` +2. FETCH PART +``` sql +ALTER TABLE users FETCH PART 201901_2_2_0 FROM '/clickhouse/tables/01-01/visits'; +ALTER TABLE users ATTACH PART 201901_2_2_0; +``` + +注意点: + +- `ALTER ... FETCH PARTITION|PART`クエリはレプリケートされません。それはデータまたはパーティションをローカルサーバーの`detached`ディレクトリにのみ配置します。 +- `ALTER TABLE ... ATTACH`クエリはレプリケートされます。それはデータをすべてのレプリカに追加します。データは`detached`ディレクトリから1つのレプリカに追加され、他のレプリカには隣接するレプリカから追加されます。 + +ダウンロードする前に、システムはパーティションが存在し、テーブル構造が一致するかをチェックします。最も適切なレプリカは、健全なレプリカから自動的に選択されます。 + +このクエリは`ALTER TABLE`と呼ばれていますが、テーブル構造を変更したり、即座にテーブル内の利用可能なデータを変更することはありません。 + +## MOVE PARTITION\|PART + +`MergeTree`エンジンテーブルのパーティションまたはデータパーツを別のボリュームまたはディスクに移動します。詳細は[データストレージ用に複数のブロックデバイスを使用する](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-multiple-volumes)を参照してください。 + +``` sql +ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name' +``` + +`ALTER TABLE t MOVE`クエリ: + +- レプリケートされません。異なるレプリカは異なるストレージポリシーを持つことができるためです。 +- 指定されたディスクまたはボリュームが構成されていない場合、エラーを返します。また、ストレージポリシーで指定された移動条件が適用できない場合にもエラーを返します。 +- データが既にバックグラウンドプロセスによって移動している、同時の`ALTER TABLE t MOVE`クエリまたはバックグラウンドデータマージの結果として移動している場合には、エラーを返すことがあります。この場合、ユーザーは追加の操作を行う必要はありません。 + +例: + +``` sql +ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow' +ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd' +``` + +## UPDATE IN PARTITION + +指定されたフィルタリング式にマッチするパーティション内のデータを操作します。これは[mutation](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +構文: + +``` sql +ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr +``` + +### 例 + +``` sql +-- パーティション名を使用 +ALTER TABLE mt UPDATE x = x + 1 IN PARTITION 2 WHERE p = 2; + +-- パーティションIDを使用 +ALTER TABLE mt UPDATE x = x + 1 IN PARTITION ID '2' WHERE p = 2; +``` + +### 関連項目 + +- [UPDATE](/docs/ja/sql-reference/statements/alter/update.md/#alter-table-update-statements) + +## DELETE IN PARTITION + +指定されたフィルタリング式にマッチするパーティション内のデータを削除します。これは[mutation](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +構文: + +``` sql +ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE [IN PARTITION partition_expr] WHERE filter_expr +``` + +### 例 + +``` sql +-- パーティション名を使用 +ALTER TABLE mt DELETE IN PARTITION 2 WHERE p = 2; + +-- パーティションIDを使用 +ALTER TABLE mt DELETE IN PARTITION ID '2' WHERE p = 2; +``` + +### 関連項目 + +- [DELETE](/docs/ja/sql-reference/statements/alter/delete.md/#alter-mutations) + +## パーティション式の設定方法 + +`ALTER ... PARTITION`クエリでパーティション式を設定するには、さまざまな方法があります: + +- `system.parts`テーブルの`partition`カラムの値として指定します。例:`ALTER TABLE visits DETACH PARTITION 201901`。 +- キーワード`ALL`を使用します。これはDROP/DETACH/ATTACH/ATTACH FROMでのみ使用できます。例:`ALTER TABLE visits ATTACH PARTITION ALL`。 +- テーブルのパーティションキーのタプルと型が一致する式や定数のタプルとして指定します。単一要素のパーティションキーの場合、式を`tuple(...)`関数で包む必要があります。例:`ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25')))`。 +- パーティションIDを使用します。パーティションIDはファイルシステムやZooKeeperでパーティションの名前として使われる(可能であれば人間が読める文字列の)識別子です。パーティションIDは`PARTITION ID`句で引用符内に指定しなければなりません。例:`ALTER TABLE visits DETACH PARTITION ID '201901'`。 +- [ALTER ATTACH PART](#attach-partitionpart)および[DROP DETACHED PART](#drop-detached-partitionpart)クエリでは、`system.detached_parts`テーブルの`name`カラムからの値を使用して、パーツの名前を文字列リテラルで指定します。例:`ALTER TABLE visits ATTACH PART '201901_1_1_0'`。 + +パーティションを指定する際の引用符の使用は、パーティション式のタイプに依存します。例えば、`String`タイプの場合、その名前を引用符(`'`)で囲む必要があります。`Date`や`Int*`タイプの場合、引用符は不要です。 + +上記の規則は、[OPTIMIZE](/docs/ja/sql-reference/statements/optimize.md)クエリにも適用されます。パーティション化されていないテーブルを最適化する際に特定のパーティションのみを指定する必要がある場合、式を`PARTITION tuple()`と設定してください。例: + +``` sql +OPTIMIZE TABLE table_not_partitioned PARTITION tuple() FINAL; +``` + +`IN PARTITION`は、`ALTER TABLE`クエリの結果として`UPDATE`または`DELETE`式が適用されるパーティションを指定します。指定されたパーティションからのみ新しいパーツが作成されます。これにより、パーティションが多く分かれている場合でも、インデックスを更新する必要があるポイントだけにデータを更新する負荷を減らすことができます。 + +`ALTER ... PARTITION`クエリの例は、テスト[`00502_custom_partitioning_local`](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00502_custom_partitioning_local.sql)および[`00502_custom_partitioning_replicated_zookeeper`](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00502_custom_partitioning_replicated_zookeeper.sql)で示されています。 diff --git a/docs/ja/sql-reference/statements/alter/projection.md b/docs/ja/sql-reference/statements/alter/projection.md new file mode 100644 index 00000000000..44aed317645 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/projection.md @@ -0,0 +1,164 @@ +--- +slug: /ja/sql-reference/statements/alter/projection +sidebar_position: 49 +sidebar_label: PROJECTION +title: "プロジェクション" +--- + +プロジェクションはクエリ実行を最適化する形式でデータを保存します。この機能は次の用途に便利です: +- 主キーの一部でないカラムに対するクエリの実行 +- カラムの事前集計により、計算とIOの両方を削減 + +テーブルに対して1つ以上のプロジェクションを定義することができ、クエリ解析時にユーザーの指定したクエリを変更せずに、スキャンすべきデータが最小のプロジェクションをClickHouseが選択します。 + +:::note ディスク使用量 + +プロジェクションは内部で新しい隠しテーブルを作成するため、より多くのIOとディスクスペースが必要になります。 +例として、異なる主キーを定義したプロジェクションがある場合、元のテーブルからのすべてのデータが複製されます。 +::: + +プロジェクションの内部動作に関する技術的な詳細はこの[ページ](/docs/ja/guides/best-practices/sparse-primary-indexes.md/#option-3-projections)をご覧ください。 + +## 主キーを使用せずにフィルタリングする例 + +テーブルの作成: +```sql +CREATE TABLE visits_order +( + `user_id` UInt64, + `user_name` String, + `pages_visited` Nullable(Float64), + `user_agent` String +) +ENGINE = MergeTree() +PRIMARY KEY user_agent +``` +`ALTER TABLE`を使って既存のテーブルにプロジェクションを追加することができます: +```sql +ALTER TABLE visits_order ADD PROJECTION user_name_projection ( +SELECT +* +ORDER BY user_name +) + +ALTER TABLE visits_order MATERIALIZE PROJECTION user_name_projection +``` +データの挿入: +```sql +INSERT INTO visits_order SELECT + number, + 'test', + 1.5 * (number / 2), + 'Android' +FROM numbers(1, 100); +``` + +プロジェクションを使用することで、元のテーブルで`user_name`が`PRIMARY_KEY`として定義されていなくても、`user_name`でのフィルタリングを素早く行えます。クエリ時にClickHouseは、プロジェクションを使用することでデータの処理量が少なくなると判断します。なぜなら、データが`user_name`でソートされているからです。 +```sql +SELECT + * +FROM visits_order +WHERE user_name='test' +LIMIT 2 +``` + +クエリがプロジェクションを使用しているか確認するには、`system.query_log`テーブルを確認します。`projections`フィールドには使用されたプロジェクションの名前が入り、未使用の場合は空になります: +```sql +SELECT query, projections FROM system.query_log WHERE query_id='' +``` + +## 集計前のクエリの例 + +プロジェクションを使用してテーブルを作成: +```sql +CREATE TABLE visits +( + `user_id` UInt64, + `user_name` String, + `pages_visited` Nullable(Float64), + `user_agent` String, + PROJECTION projection_visits_by_user + ( + SELECT + user_agent, + sum(pages_visited) + GROUP BY user_id, user_agent + ) +) +ENGINE = MergeTree() +ORDER BY user_agent +``` +データの挿入: +```sql +INSERT INTO visits SELECT + number, + 'test', + 1.5 * (number / 2), + 'Android' +FROM numbers(1, 100); +``` +```sql +INSERT INTO visits SELECT + number, + 'test', + 1. * (number / 2), + 'IOS' +FROM numbers(100, 500); +``` +`user_agent`フィールドを使った`GROUP BY`クエリを最初に実行します。このクエリは事前集計が一致しないため、定義されたプロジェクションを使用しません。 +```sql +SELECT + user_agent, + count(DISTINCT user_id) +FROM visits +GROUP BY user_agent +``` + +プロジェクションを使用するためには、事前集計または`GROUP BY`フィールドの一部またはすべてを選択するクエリを実行します。 +```sql +SELECT + user_agent +FROM visits +WHERE user_id > 50 AND user_id < 150 +GROUP BY user_agent +``` +``` +SELECT + user_agent, + sum(pages_visited) +FROM visits +GROUP BY user_agent +``` + +前述のように、`system.query_log`テーブルを確認できます。`projections`フィールドには使用されたプロジェクションの名前が入り、未使用の場合は空になります: +```sql +SELECT query, projections FROM system.query_log WHERE query_id='' +``` + +# プロジェクションの操作 + +次の操作が[プロジェクション](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#projections)で利用可能です: + +## ADD PROJECTION + +`ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT [GROUP BY] [ORDER BY] )` - テーブルのメタデータにプロジェクションの説明を追加します。 + +## DROP PROJECTION + +`ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name` - テーブルのメタデータからプロジェクションの説明を削除し、プロジェクションのファイルをディスクから削除します。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +## MATERIALIZE PROJECTION + +`ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]` - 指定されたパーティション`partition_name`内のプロジェクション`name`を再構築します。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +## CLEAR PROJECTION + +`ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name]` - 説明を削除せずにプロジェクションのファイルをディスクから削除します。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +`ADD`、`DROP`、`CLEAR`コマンドはメタデータの変更やファイルの削除のみを行う軽量な操作です。 + +また、これらはClickHouse KeeperまたはZooKeeperを介してプロジェクションのメタデータを同期することによりレプリケーションされます。 + +:::note +プロジェクションの操作は[`*MergeTree`](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)エンジン([レプリケート](/docs/ja/engines/table-engines/mergetree-family/replication.md)されたバリアントを含む)のテーブルでのみサポートされています。 +::: diff --git a/docs/ja/sql-reference/statements/alter/quota.md b/docs/ja/sql-reference/statements/alter/quota.md new file mode 100644 index 00000000000..360f6b3bfdb --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/quota.md @@ -0,0 +1,40 @@ +--- +slug: /ja/sql-reference/statements/alter/quota +sidebar_position: 46 +sidebar_label: QUOTA +title: "ALTER QUOTA" +--- + +クオータを変更します。 + +構文: + +``` sql +ALTER QUOTA [IF EXISTS] name [ON CLUSTER cluster_name] + [RENAME TO new_name] + [KEYED BY {user_name | ip_address | client_key | client_key,user_name | client_key,ip_address} | NOT KEYED] + [FOR [RANDOMIZED] INTERVAL number {second | minute | hour | day | week | month | quarter | year} + {MAX { {queries | query_selects | query_inserts | errors | result_rows | result_bytes | read_rows | read_bytes | execution_time} = number } [,...] | + NO LIMITS | TRACKING ONLY} [,...]] + [TO {role [,...] | ALL | ALL EXCEPT role [,...]}] +``` +`user_name`、`ip_address`、`client_key`、`client_key, user_name`、`client_key, ip_address`は、[system.quotas](../../../operations/system-tables/quotas.md)テーブルのフィールドに対応しています。 + +`queries`、`query_selects`、'query_inserts'、`errors`、`result_rows`、`result_bytes`、`read_rows`、`read_bytes`、`execution_time`は、[system.quotas_usage](../../../operations/system-tables/quotas_usage.md)テーブルのフィールドに対応しています。 + +`ON CLUSTER`句はクラスター上でクオータを作成することを可能にします。詳細は[分散DDL](../../../sql-reference/distributed-ddl.md)を参照してください。 + +**例** + +現在のユーザーに対して15ヶ月で123のクエリの最大数を制限する例: + +``` sql +ALTER QUOTA IF EXISTS qA FOR INTERVAL 15 month MAX queries = 123 TO CURRENT_USER; +``` + +デフォルトユーザーに対して、30分で0.5秒の最大実行時間を制限し、5四半期でクエリの最大数を321、エラーの最大数を10に制限する例: + +``` sql +ALTER QUOTA IF EXISTS qB FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321, errors = 10 TO default; +``` + diff --git a/docs/ja/sql-reference/statements/alter/role.md b/docs/ja/sql-reference/statements/alter/role.md new file mode 100644 index 00000000000..459d7d6efb8 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/role.md @@ -0,0 +1,18 @@ +--- +slug: /ja/sql-reference/statements/alter/role +sidebar_position: 46 +sidebar_label: ROLE +--- + +## ALTER ROLE + +ロールを変更します。 + +構文: + +``` sql +ALTER ROLE [IF EXISTS] name1 [RENAME TO new_name |, name2 [,...]] + [ON CLUSTER cluster_name] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] +``` + diff --git a/docs/ja/sql-reference/statements/alter/row-policy.md b/docs/ja/sql-reference/statements/alter/row-policy.md new file mode 100644 index 00000000000..c23c81b7289 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/row-policy.md @@ -0,0 +1,20 @@ +--- +slug: /ja/sql-reference/statements/alter/row-policy +sidebar_position: 47 +sidebar_label: ROW POLICY +--- + +# ALTER ROW POLICY + +行ポリシーを変更します。 + +構文: + +``` sql +ALTER [ROW] POLICY [IF EXISTS] name1 [ON CLUSTER cluster_name1] ON [database1.]table1 [RENAME TO new_name1] + [, name2 [ON CLUSTER cluster_name2] ON [database2.]table2 [RENAME TO new_name2] ...] + [AS {PERMISSIVE | RESTRICTIVE}] + [FOR SELECT] + [USING {condition | NONE}][,...] + [TO {role [,...] | ALL | ALL EXCEPT role [,...]}] +``` diff --git a/docs/ja/sql-reference/statements/alter/sample-by.md b/docs/ja/sql-reference/statements/alter/sample-by.md new file mode 100644 index 00000000000..84f07892611 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/sample-by.md @@ -0,0 +1,32 @@ +--- +slug: /ja/sql-reference/statements/alter/sample-by +sidebar_position: 41 +sidebar_label: SAMPLE BY +title: "SAMPLE BY式の操作" +--- + +# SAMPLE BY式の操作 + +以下の操作が利用可能です: + +## 変更 + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY SAMPLE BY new_expression +``` + +このコマンドは、テーブルの[サンプリングキー](../../../engines/table-engines/mergetree-family/mergetree.md)を`new_expression`(式または式のタプル)に変更します。主キーは新しいサンプルキーを含む必要があります。 + +## 削除 + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] REMOVE SAMPLE BY +``` + +このコマンドは、テーブルの[サンプリングキー](../../../engines/table-engines/mergetree-family/mergetree.md)を削除します。 + +`MODIFY`および`REMOVE`コマンドは、メタデータの変更またはファイルの削除に限定されるため、軽量です。 + +:::note +この機能は[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md)ファミリーのテーブル([レプリケート](../../../engines/table-engines/mergetree-family/replication.md)テーブルを含む)のみで動作します。 +::: diff --git a/docs/ja/sql-reference/statements/alter/setting.md b/docs/ja/sql-reference/statements/alter/setting.md new file mode 100644 index 00000000000..217a9d57682 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/setting.md @@ -0,0 +1,60 @@ +--- +slug: /ja/sql-reference/statements/alter/setting +sidebar_position: 38 +sidebar_label: SETTING +--- + +# テーブル設定の操作 + +テーブル設定を変更するための一連のクエリがあります。設定を変更したり、デフォルト値にリセットしたりできます。一つのクエリで複数の設定を一度に変更することが可能です。指定された名前の設定が存在しない場合、クエリは例外を発生させます。 + +**構文** + +``` sql +ALTER TABLE [db].name [ON CLUSTER cluster] MODIFY|RESET SETTING ... +``` + +:::note +これらのクエリは、[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) テーブルのみに適用されます。 +::: + +## MODIFY SETTING + +テーブルの設定を変更します。 + +**構文** + +```sql +MODIFY SETTING setting_name=value [, ...] +``` + +**例** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id; + +ALTER TABLE example_table MODIFY SETTING max_part_loading_threads=8, max_parts_in_total=50000; +``` + +## RESET SETTING + +テーブルの設定をデフォルト値にリセットします。設定がデフォルトの状態にある場合は、何も行われません。 + +**構文** + +```sql +RESET SETTING setting_name [, ...] +``` + +**例** + +```sql +CREATE TABLE example_table (id UInt32, data String) ENGINE=MergeTree() ORDER BY id + SETTINGS max_part_loading_threads=8; + +ALTER TABLE example_table RESET SETTING max_part_loading_threads; +``` + +**参照** + +- [MergeTree settings](../../../operations/settings/merge-tree-settings.md) diff --git a/docs/ja/sql-reference/statements/alter/settings-profile.md b/docs/ja/sql-reference/statements/alter/settings-profile.md new file mode 100644 index 00000000000..190406cf810 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/settings-profile.md @@ -0,0 +1,18 @@ +--- +slug: /ja/sql-reference/statements/alter/settings-profile +sidebar_position: 48 +sidebar_label: SETTINGS PROFILE +--- + +## ALTER SETTINGS PROFILE + +設定プロファイルを変更します。 + +構文: + +``` sql +ALTER SETTINGS PROFILE [IF EXISTS] name1 [RENAME TO new_name |, name2 [,...]] + [ON CLUSTER cluster_name] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] + [TO {{role1 | user1 [, role2 | user2 ...]} | NONE | ALL | ALL EXCEPT {role1 | user1 [, role2 | user2 ...]}}] +``` diff --git a/docs/ja/sql-reference/statements/alter/skipping-index.md b/docs/ja/sql-reference/statements/alter/skipping-index.md new file mode 100644 index 00000000000..b41749a7ae8 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/skipping-index.md @@ -0,0 +1,33 @@ +--- +slug: /ja/sql-reference/statements/alter/skipping-index + +toc_hidden_folder: true +sidebar_position: 42 +sidebar_label: INDEX +--- + +# データスキップインデックスの操作 + +以下の操作が利用可能です。 + +## ADD INDEX + +`ALTER TABLE [db.]table_name [ON CLUSTER cluster] ADD INDEX [IF NOT EXISTS] name expression TYPE type [GRANULARITY value] [FIRST|AFTER name]` - テーブルのメタデータにインデックスの説明を追加します。 + +## DROP INDEX + +`ALTER TABLE [db.]table_name [ON CLUSTER cluster] DROP INDEX [IF EXISTS] name` - テーブルのメタデータからインデックスの説明を削除し、ディスクからインデックスファイルを削除します。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +## MATERIALIZE INDEX + +`ALTER TABLE [db.]table_name [ON CLUSTER cluster] MATERIALIZE INDEX [IF EXISTS] name [IN PARTITION partition_name]` - 指定された`partition_name`に対して二次インデックス`name`を再構築します。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。`IN PARTITION`部分が省略された場合、テーブル全体のデータに対してインデックスを再構築します。 + +## CLEAR INDEX + +`ALTER TABLE [db.]table_name [ON CLUSTER cluster] CLEAR INDEX [IF EXISTS] name [IN PARTITION partition_name]` - ディスクから二次インデックスファイルを削除しますが、説明は削除しません。[ミューテーション](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +コマンド`ADD`、`DROP`、`CLEAR`は軽量で、メタデータの変更やファイルの削除のみを行います。また、これらはレプリケートされており、インデックスのメタデータをClickHouse KeeperやZooKeeperを通じて同期します。 + +:::note +インデックス操作は、[`*MergeTree`](/docs/ja/engines/table-engines/mergetree-family/mergetree.md)エンジン([replicated](/docs/ja/engines/table-engines/mergetree-family/replication.md)バリアントを含む)を持つテーブルでのみサポートされています。 +::: diff --git a/docs/ja/sql-reference/statements/alter/statistics.md b/docs/ja/sql-reference/statements/alter/statistics.md new file mode 100644 index 00000000000..e02c59645cf --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/statistics.md @@ -0,0 +1,36 @@ +--- +slug: /ja/sql-reference/statements/alter/statistics +sidebar_position: 45 +sidebar_label: STATISTICS +--- + +# カラム統計の操作 + +以下の操作が利用可能です: + +- `ALTER TABLE [db].table ADD STATISTICS [IF NOT EXISTS] (カラムリスト) TYPE (種類リスト)` - 統計の説明をテーブルのメタデータに追加します。 + +- `ALTER TABLE [db].table MODIFY STATISTICS (カラムリスト) TYPE (種類リスト)` - 統計の説明をテーブルのメタデータに変更します。 + +- `ALTER TABLE [db].table DROP STATISTICS [IF EXISTS] (カラムリスト)` - 指定されたカラムのメタデータから統計を削除し、指定されたカラムの全パーツの統計オブジェクトをすべて削除します。 + +- `ALTER TABLE [db].table CLEAR STATISTICS [IF EXISTS] (カラムリスト)` - 指定されたカラムの全パーツの統計オブジェクトをすべて削除します。統計オブジェクトは `ALTER TABLE MATERIALIZE STATISTICS` を使用して再構築できます。 + +- `ALTER TABLE [db.]table MATERIALIZE STATISTICS [IF EXISTS] (カラムリスト)` - カラムの統計を再構築します。[ミューテーション](../../../sql-reference/statements/alter/index.md#mutations)として実装されています。 + +最初の2つのコマンドは、メタデータの変更やファイルの削除のみを行うため、軽量です。 + +また、これらはZooKeeperを介して統計メタデータを同期するレプリケーションが行われます。 + +## 例: + +2つの統計タイプを2つのカラムに追加する例: + +``` +ALTER TABLE t1 MODIFY STATISTICS c, d TYPE TDigest, Uniq; +``` + +:::note +統計は、高度な*MergeTree([レプリケート](../../../engines/table-engines/mergetree-family/replication.md)バリアントを含む)エンジンテーブルのみをサポートしています。 +::: + diff --git a/docs/ja/sql-reference/statements/alter/ttl.md b/docs/ja/sql-reference/statements/alter/ttl.md new file mode 100644 index 00000000000..1d40590a5fa --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/ttl.md @@ -0,0 +1,90 @@ +--- +slug: /ja/sql-reference/statements/alter/ttl +sidebar_position: 44 +sidebar_label: TTL +--- + +# テーブルのTTL操作 + +:::note +古いデータを管理するためのTTLの使用に関する詳細をお探しの場合は、[TTLでデータを管理する](/docs/ja/guides/developer/ttl.md)ユーザーガイドを参照してください。以下のドキュメントでは、既存のTTLルールを変更または削除する方法を示しています。 +::: + +## MODIFY TTL + +[テーブルTTL](../../../engines/table-engines/mergetree-family/mergetree.md#mergetree-table-ttl)を以下の形式のリクエストで変更できます: + +``` sql +ALTER TABLE [db.]table_name [ON CLUSTER cluster] MODIFY TTL ttl_expression; +``` + +## REMOVE TTL + +テーブルからTTLプロパティを削除するには、以下のクエリを使用します: + +```sql +ALTER TABLE [db.]table_name [ON CLUSTER cluster] REMOVE TTL +``` + +**例** + +テーブル`TTL`がある場合: + +```sql +CREATE TABLE table_with_ttl +( + event_time DateTime, + UserID UInt64, + Comment String +) +ENGINE MergeTree() +ORDER BY tuple() +TTL event_time + INTERVAL 3 MONTH +SETTINGS min_bytes_for_wide_part = 0; + +INSERT INTO table_with_ttl VALUES (now(), 1, 'username1'); + +INSERT INTO table_with_ttl VALUES (now() - INTERVAL 4 MONTH, 2, 'username2'); +``` + +`OPTIMIZE`を実行して`TTL`のクリーンアップを強制する: + +```sql +OPTIMIZE TABLE table_with_ttl FINAL; +SELECT * FROM table_with_ttl FORMAT PrettyCompact; +``` +2行目はテーブルから削除されました。 + +```text +┌─────────event_time────┬──UserID─┬─────Comment──┐ +│ 2020-12-11 12:44:57 │ 1 │ username1 │ +└───────────────────────┴─────────┴──────────────┘ +``` + +以下のクエリでテーブル`TTL`を削除します: + +```sql +ALTER TABLE table_with_ttl REMOVE TTL; +``` + +削除された行を再挿入し、`OPTIMIZE`で再度`TTL`のクリーンアップを強制します: + +```sql +INSERT INTO table_with_ttl VALUES (now() - INTERVAL 4 MONTH, 2, 'username2'); +OPTIMIZE TABLE table_with_ttl FINAL; +SELECT * FROM table_with_ttl FORMAT PrettyCompact; +``` + +`TTL`はもう存在しないため、2行目は削除されません: + +```text +┌─────────event_time────┬──UserID─┬─────Comment──┐ +│ 2020-12-11 12:44:57 │ 1 │ username1 │ +│ 2020-08-11 12:44:57 │ 2 │ username2 │ +└───────────────────────┴─────────┴──────────────┘ +``` + +**関連項目** + +- [TTL式](../../../sql-reference/statements/create/table.md#ttl-expression)の詳細。 +- [TTL付き](../../../sql-reference/statements/alter/column.md#alter_modify-column)でカラムを修正。 diff --git a/docs/ja/sql-reference/statements/alter/update.md b/docs/ja/sql-reference/statements/alter/update.md new file mode 100644 index 00000000000..fd6676f64f3 --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/update.md @@ -0,0 +1,34 @@ +--- +slug: /ja/sql-reference/statements/alter/update +sidebar_position: 40 +sidebar_label: UPDATE +--- + +# ALTER TABLE ... UPDATE 文 + +``` sql +ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr +``` + +指定されたフィルタリング式に一致するデータを操作します。これは[mutation](/docs/ja/sql-reference/statements/alter/index.md#mutations)として実装されています。 + +:::note +`ALTER TABLE`というプレフィックスが付いていることで、SQLをサポートする他の多くのシステムとは異なる構文となっています。これは、OLTPデータベースの類似したクエリと異なり、頻繁な使用を目的としない重い操作であることを示すために意図されています。 +::: + +`filter_expr`は型`UInt8`である必要があります。このクエリは、`filter_expr`がゼロ以外の値を取る行の指定されたカラムの値を対応する式の値に更新します。値は`CAST`演算子を使用してカラム型にキャストされます。主キーまたはパーティションキーの計算に使用されるカラムを更新することはサポートされていません。 + +1つのクエリには、カンマで区切られた複数のコマンドを含めることができます。 + +クエリ処理の同期性は、[mutations_sync](/docs/ja/operations/settings/settings.md/#mutations_sync)設定によって定義されます。デフォルトでは非同期です。 + +**関連情報** + +- [Mutations](/docs/ja/sql-reference/statements/alter/index.md#mutations) +- [ALTER クエリの同期性](/docs/ja/sql-reference/statements/alter/index.md#synchronicity-of-alter-queries) +- [mutations_sync](/docs/ja/operations/settings/settings.md/#mutations_sync) 設定 + + +## 関連コンテンツ + +- ブログ: [ClickHouseでの更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/sql-reference/statements/alter/user.md b/docs/ja/sql-reference/statements/alter/user.md new file mode 100644 index 00000000000..991b2d9f10b --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/user.md @@ -0,0 +1,104 @@ +--- +slug: /ja/sql-reference/statements/alter/user +sidebar_position: 45 +sidebar_label: USER +title: "ALTER USER" +--- + +ClickHouseユーザーアカウントを変更します。 + +構文: + +``` sql +ALTER USER [IF EXISTS] name1 [RENAME TO new_name |, name2 [,...]] + [ON CLUSTER cluster_name] + [NOT IDENTIFIED | RESET AUTHENTICATION METHODS TO NEW | {IDENTIFIED | ADD IDENTIFIED} {[WITH {plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | WITH NO_PASSWORD | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name' | SAN 'TYPE:subject_alt_name'} | {WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa|...'} | {WITH http SERVER 'server_name' [SCHEME 'Basic']} [VALID UNTIL datetime] + [, {[{plaintext_password | sha256_password | sha256_hash | ...}] BY {'password' | 'hash'}} | {ldap SERVER 'server_name'} | {...} | ... [,...]]] + [[ADD | DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] + [VALID UNTIL datetime] + [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ] + [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...] +``` + +`ALTER USER`を使用するには、[ALTER USER](../../../sql-reference/statements/grant.md#access-management)権限が必要です。 + +## GRANTEES句 + +このユーザーが必要なすべてのアクセスを[GRANT OPTION](../../../sql-reference/statements/grant.md#granting-privilege-syntax)で付与された条件下で、このユーザーから[特権](../../../sql-reference/statements/grant.md#privileges)を受け取ることを許可されているユーザーまたはロールを指定します。`GRANTEES`句のオプションは次のとおりです: + +- `user` — このユーザーが特権を付与できるユーザーを指定します。 +- `role` — このユーザーが特権を付与できるロールを指定します。 +- `ANY` — このユーザーは誰にでも特権を付与できます。これはデフォルト設定です。 +- `NONE` — このユーザーは誰にも特権を付与できません。 + +`EXCEPT`式を使用することで、任意のユーザーまたはロールを除外することができます。例:`ALTER USER user1 GRANTEES ANY EXCEPT user2`。これは、`user1`が`GRANT OPTION`で付与された特権を持っている場合、その特権を`user2`を除く誰にでも付与できることを意味します。 + +## 例 + +割り当てられたロールをデフォルトに設定: + +``` sql +ALTER USER user DEFAULT ROLE role1, role2 +``` + +ユーザーにロールが以前に割り当てられていない場合、ClickHouseは例外をスローします。 + +割り当てられたすべてのロールをデフォルトに設定: + +``` sql +ALTER USER user DEFAULT ROLE ALL +``` + +将来、ユーザーにロールが割り当てられる場合、それは自動的にデフォルトになります。 + +`role1`および`role2`を除くすべての割り当てられたロールをデフォルトに設定: + +``` sql +ALTER USER user DEFAULT ROLE ALL EXCEPT role1, role2 +``` + +`john`アカウントを持つユーザーが`jack`アカウントを持つユーザーに特権を付与することを許可: + +``` sql +ALTER USER john GRANTEES jack; +``` + +既存の認証方法を保持しながら、新しい認証方法をユーザーに追加: + +``` sql +ALTER USER user1 ADD IDENTIFIED WITH plaintext_password by '1', bcrypt_password by '2', plaintext_password by '3' +``` + +注意事項: +1. 古いバージョンのClickHouseは複数の認証方法の構文をサポートしていない可能性があります。そのため、ClickHouseサーバーにそのようなユーザーが含まれていて、サポートされていないバージョンにダウングレードされた場合、そのユーザーは使用不能になり、ユーザー関連の操作が一部失敗します。スムーズにダウングレードするためには、ダウングレード前にすべてのユーザーを単一の認証方法に設定する必要があります。あるいは、適切な手続きを経ずにサーバーがダウングレードされた場合、問題のあるユーザーを削除する必要があります。 +2. セキュリティの理由から、`no_password`は他の認証方法と共存できません。そのため、`no_password`認証方法を`ADD`することはできません。以下のクエリはエラーをスローします: + +``` sql +ALTER USER user1 ADD IDENTIFIED WITH no_password +``` + +ユーザーの認証方法を削除して`no_password`に依存する場合は、下記の置換形式で指定する必要があります。 + +認証方法をリセットし、クエリで指定されたものを追加(ADDキーワードなしでのIDENTIFIEDの効果): + +``` sql +ALTER USER user1 IDENTIFIED WITH plaintext_password by '1', bcrypt_password by '2', plaintext_password by '3' +``` + +認証方法をリセットし、最新の追加を保持: + +``` sql +ALTER USER user1 RESET AUTHENTICATION METHODS TO NEW +``` + +## VALID UNTIL句 + +認証方法に有効期限の日付、およびオプションで時刻を指定できます。パラメータとして文字列を受け入れます。日時の形式には`YYYY-MM-DD [hh:mm:ss] [timezone]`の使用を推奨します。デフォルトでは、このパラメータは`'infinity'`です。`VALID UNTIL`句は、クエリで認証方法が指定されていない場合を除いて、認証方法とともにのみ指定できます。このシナリオでは、`VALID UNTIL`句は既存のすべての認証方法に適用されます。 + +例: + +- `ALTER USER name1 VALID UNTIL '2025-01-01'` +- `ALTER USER name1 VALID UNTIL '2025-01-01 12:00:00 UTC'` +- `ALTER USER name1 VALID UNTIL 'infinity'` +- `ALTER USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID UNTIL '2025-01-01'` diff --git a/docs/ja/sql-reference/statements/alter/view.md b/docs/ja/sql-reference/statements/alter/view.md new file mode 100644 index 00000000000..575407ef52c --- /dev/null +++ b/docs/ja/sql-reference/statements/alter/view.md @@ -0,0 +1,199 @@ +--- +slug: /ja/sql-reference/statements/alter/view +sidebar_position: 50 +sidebar_label: VIEW +--- + +# ALTER TABLE ... MODIFY QUERY ステートメント + +`ALTER TABLE ... MODIFY QUERY` ステートメントを使用して、[マテリアライズドビュー](../create/view.md#materialized)が作成されたときに指定された `SELECT` クエリを、データの取り込みプロセスを中断することなく変更できます。 + +このコマンドは、`TO [db.]name` 句で作成されたマテリアライズドビューを変更するために作成されました。このコマンドでは、基となるストレージテーブルの構造や、マテリアライズドビューのカラム定義を変更しません。そのため、`TO [db.]name` 句を使用せずに作成されたマテリアライズドビューに対してこのコマンドの適用は非常に限定されています。 + +**TO テーブルを使用した例** + +```sql +CREATE TABLE events (ts DateTime, event_type String) +ENGINE = MergeTree ORDER BY (event_type, ts); + +CREATE TABLE events_by_day (ts DateTime, event_type String, events_cnt UInt64) +ENGINE = SummingMergeTree ORDER BY (event_type, ts); + +CREATE MATERIALIZED VIEW mv TO events_by_day AS +SELECT toStartOfDay(ts) ts, event_type, count() events_cnt +FROM events +GROUP BY ts, event_type; + +INSERT INTO events +SELECT Date '2020-01-01' + interval number * 900 second, + ['imp', 'click'][number%2+1] +FROM numbers(100); + +SELECT ts, event_type, sum(events_cnt) +FROM events_by_day +GROUP BY ts, event_type +ORDER BY ts, event_type; + +┌──────────────────ts─┬─event_type─┬─sum(events_cnt)─┐ +│ 2020-01-01 00:00:00 │ click │ 48 │ +│ 2020-01-01 00:00:00 │ imp │ 48 │ +│ 2020-01-02 00:00:00 │ click │ 2 │ +│ 2020-01-02 00:00:00 │ imp │ 2 │ +└─────────────────────┴────────────┴─────────────────┘ + +-- 新しい測定項目 `cost` と新しい次元 `browser` を追加します。 + +ALTER TABLE events + ADD COLUMN browser String, + ADD COLUMN cost Float64; + +-- カラムはマテリアライズドビューとTO +-- (移動先テーブル)で一致する必要はないため、次のアルターは挿入を壊しません。 + +ALTER TABLE events_by_day + ADD COLUMN cost Float64, + ADD COLUMN browser String after event_type, + MODIFY ORDER BY (event_type, ts, browser); + +INSERT INTO events +SELECT Date '2020-01-02' + interval number * 900 second, + ['imp', 'click'][number%2+1], + ['firefox', 'safary', 'chrome'][number%3+1], + 10/(number+1)%33 +FROM numbers(100); + +-- 新しいカラム `browser` と `cost` はまだマテリアライズドビューで変更していないため空です。 + +SELECT ts, event_type, browser, sum(events_cnt) events_cnt, round(sum(cost),2) cost +FROM events_by_day +GROUP BY ts, event_type, browser +ORDER BY ts, event_type; + +┌──────────────────ts─┬─event_type─┬─browser─┬─events_cnt─┬─cost─┐ +│ 2020-01-01 00:00:00 │ click │ │ 48 │ 0 │ +│ 2020-01-01 00:00:00 │ imp │ │ 48 │ 0 │ +│ 2020-01-02 00:00:00 │ click │ │ 50 │ 0 │ +│ 2020-01-02 00:00:00 │ imp │ │ 50 │ 0 │ +│ 2020-01-03 00:00:00 │ click │ │ 2 │ 0 │ +│ 2020-01-03 00:00:00 │ imp │ │ 2 │ 0 │ +└─────────────────────┴────────────┴─────────┴────────────┴──────┘ + +ALTER TABLE mv MODIFY QUERY + SELECT toStartOfDay(ts) ts, event_type, browser, + count() events_cnt, + sum(cost) cost + FROM events + GROUP BY ts, event_type, browser; + +INSERT INTO events +SELECT Date '2020-01-03' + interval number * 900 second, + ['imp', 'click'][number%2+1], + ['firefox', 'safary', 'chrome'][number%3+1], + 10/(number+1)%33 +FROM numbers(100); + +SELECT ts, event_type, browser, sum(events_cnt) events_cnt, round(sum(cost),2) cost +FROM events_by_day +GROUP BY ts, event_type, browser +ORDER BY ts, event_type; + +┌──────────────────ts─┬─event_type─┬─browser─┬─events_cnt─┬──cost─┐ +│ 2020-01-01 00:00:00 │ click │ │ 48 │ 0 │ +│ 2020-01-01 00:00:00 │ imp │ │ 48 │ 0 │ +│ 2020-01-02 00:00:00 │ click │ │ 50 │ 0 │ +│ 2020-01-02 00:00:00 │ imp │ │ 50 │ 0 │ +│ 2020-01-03 00:00:00 │ click │ firefox │ 16 │ 6.84 │ +│ 2020-01-03 00:00:00 │ click │ │ 2 │ 0 │ +│ 2020-01-03 00:00:00 │ click │ safary │ 16 │ 9.82 │ +│ 2020-01-03 00:00:00 │ click │ chrome │ 16 │ 5.63 │ +│ 2020-01-03 00:00:00 │ imp │ │ 2 │ 0 │ +│ 2020-01-03 00:00:00 │ imp │ firefox │ 16 │ 15.14 │ +│ 2020-01-03 00:00:00 │ imp │ safary │ 16 │ 6.14 │ +│ 2020-01-03 00:00:00 │ imp │ chrome │ 16 │ 7.89 │ +│ 2020-01-04 00:00:00 │ click │ safary │ 1 │ 0.1 │ +│ 2020-01-04 00:00:00 │ click │ firefox │ 1 │ 0.1 │ +│ 2020-01-04 00:00:00 │ imp │ firefox │ 1 │ 0.1 │ +│ 2020-01-04 00:00:00 │ imp │ chrome │ 1 │ 0.1 │ +└─────────────────────┴────────────┴─────────┴────────────┴───────┘ + +-- !!! `MODIFY ORDER BY` によって、主キーが暗黙的に導入されました。 + +SHOW CREATE TABLE events_by_day FORMAT TSVRaw + +CREATE TABLE test.events_by_day +( + `ts` DateTime, + `event_type` String, + `browser` String, + `events_cnt` UInt64, + `cost` Float64 +) +ENGINE = SummingMergeTree +PRIMARY KEY (event_type, ts) +ORDER BY (event_type, ts, browser) +SETTINGS index_granularity = 8192 + +-- !!! カラムの定義は変更されていませんが、それは問題ではありません。クエリを発行するのは +-- マテリアライズドビューではなく、TO(ストレージ)テーブルです。 +-- SELECT セクションが更新されました。 + +SHOW CREATE TABLE mv FORMAT TSVRaw; + +CREATE MATERIALIZED VIEW test.mv TO test.events_by_day +( + `ts` DateTime, + `event_type` String, + `events_cnt` UInt64 +) AS +SELECT + toStartOfDay(ts) AS ts, + event_type, + browser, + count() AS events_cnt, + sum(cost) AS cost +FROM test.events +GROUP BY + ts, + event_type, + browser +``` + +**TO テーブルを使用しない場合の例** + +使用は非常に限定的であり、新しいカラムを追加することなく `SELECT` セクションだけを変更できます。 + +```sql +CREATE TABLE src_table (`a` UInt32) ENGINE = MergeTree ORDER BY a; +CREATE MATERIALIZED VIEW mv (`a` UInt32) ENGINE = MergeTree ORDER BY a AS SELECT a FROM src_table; +INSERT INTO src_table (a) VALUES (1), (2); +SELECT * FROM mv; +``` +```text +┌─a─┐ +│ 1 │ +│ 2 │ +└───┘ +``` +```sql +ALTER TABLE mv MODIFY QUERY SELECT a * 2 as a FROM src_table; +INSERT INTO src_table (a) VALUES (3), (4); +SELECT * FROM mv; +``` +```text +┌─a─┐ +│ 6 │ +│ 8 │ +└───┘ +┌─a─┐ +│ 1 │ +│ 2 │ +└───┘ +``` + +## ALTER LIVE VIEW ステートメント + +`ALTER LIVE VIEW ... REFRESH` ステートメントは、[ライブビュー](../create/view.md#live-view)を更新します。詳細は[ライブビューの強制更新](../create/view.md#live-view-alter-refresh)を参照してください。 + +## ALTER TABLE ... MODIFY REFRESH ステートメント + +`ALTER TABLE ... MODIFY REFRESH` ステートメントは、[リフレッシュ可能なマテリアライズドビュー](../create/view.md#refreshable-materialized-view)のリフレッシュパラメータを変更します。詳細は[リフレッシュパラメータの変更](../create/view.md#changing-refresh-parameters)を参照してください。 diff --git a/docs/ja/sql-reference/statements/attach.md b/docs/ja/sql-reference/statements/attach.md new file mode 100644 index 00000000000..35ff65e61c7 --- /dev/null +++ b/docs/ja/sql-reference/statements/attach.md @@ -0,0 +1,90 @@ +--- +slug: /ja/sql-reference/statements/attach +sidebar_position: 40 +sidebar_label: ATTACH +title: "ATTACH ステートメント" +--- + +データベースを別のサーバーに移動する場合などに、テーブルやDictionaryをアタッチします。 + +**構文** + +``` sql +ATTACH TABLE|DICTIONARY|DATABASE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] ... +``` + +クエリはディスク上にデータを作成せず、データが適切な場所に既にあると仮定して、指定したテーブル、Dictionary、またはデータベースに関する情報をサーバーに追加します。`ATTACH`クエリを実行した後、サーバーはそのテーブル、Dictionary、またはデータベースの存在を認識します。 + +テーブルが以前に切り離されていた場合([DETACH](../../sql-reference/statements/detach.md)クエリ)、その構造が既知であることを意味するので、構造を定義せずに省略形を使用できます。 + +## 既存のテーブルをアタッチ + +**構文** + +``` sql +ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] +``` + +このクエリはサーバーを開始する際に使用されます。サーバーはテーブルメタデータを`ATTACH`クエリとしてファイルとして保存し、起動時に単に実行します(サーバー上で明示的に作成される一部のシステムテーブルを除く)。 + +テーブルが永久に切り離されていた場合、サーバーの起動時には再アタッチされないため、`ATTACH`クエリを明示的に使用する必要があります。 + +## 新しいテーブルを作成しデータをアタッチ + +### テーブルデータへの指定されたパスを使用する場合 + +このクエリは、提供された構造で新しいテーブルを作成し、`user_files`にある指定されたディレクトリからテーブルデータをアタッチします。 + +**構文** + +```sql +ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...) +``` + +**例** + +クエリ: + +```sql +DROP TABLE IF EXISTS test; +INSERT INTO TABLE FUNCTION file('01188_attach/test/data.TSV', 'TSV', 's String, n UInt8') VALUES ('test', 42); +ATTACH TABLE test FROM '01188_attach/test' (s String, n UInt8) ENGINE = File(TSV); +SELECT * FROM test; +``` +結果: + +```sql +┌─s────┬──n─┐ +│ test │ 42 │ +└──────┴────┘ +``` + +### 指定されたテーブルUUIDを使用する場合 + +このクエリは、提供された構造で新しいテーブルを作成し、指定されたUUIDのテーブルからデータをアタッチします。これは[Atomic](../../engines/database-engines/atomic.md)データベースエンジンによってサポートされています。 + +**構文** + +```sql +ATTACH TABLE name UUID '' (col1 Type1, ...) +``` + +## 既存のDictionaryをアタッチ + +以前に切り離されたDictionaryをアタッチします。 + +**構文** + +``` sql +ATTACH DICTIONARY [IF NOT EXISTS] [db.]name [ON CLUSTER cluster] +``` + +## 既存のデータベースをアタッチ + +以前に切り離されたデータベースをアタッチします。 + +**構文** + +``` sql +ATTACH DATABASE [IF NOT EXISTS] name [ENGINE=] [ON CLUSTER cluster] +``` diff --git a/docs/ja/sql-reference/statements/check-table.md b/docs/ja/sql-reference/statements/check-table.md new file mode 100644 index 00000000000..ee42e282d72 --- /dev/null +++ b/docs/ja/sql-reference/statements/check-table.md @@ -0,0 +1,170 @@ +--- +slug: /ja/sql-reference/statements/check-table +sidebar_position: 41 +sidebar_label: CHECK TABLE +title: "CHECK TABLE ステートメント" +--- + +ClickHouse の `CHECK TABLE` クエリは、特定のテーブルまたはそのパーティションに対して検証を行うために使用されます。これにより、チェックサムやその他の内部データ構造を確認してデータの整合性を保証します。 + +特に、実際のファイルサイズとサーバーに保存されている期待値を比較します。ファイルサイズが保存されている値と一致しない場合、それはデータが破損していることを意味します。これは、クエリ実行中にシステムがクラッシュするなどの原因で発生することがあります。 + +:::note +`CHECK TABLE` クエリはテーブル内のすべてのデータを読み込む可能性があり、リソースを占有するため、非常にリソースを消費することがあります。 +このクエリを実行する前にパフォーマンスおよびリソース使用率への影響を考慮してください。 +::: + +## 構文 + +クエリの基本的な構文は以下の通りです: + +```sql +CHECK TABLE table_name [PARTITION partition_expression | PART part_name] [FORMAT format] [SETTINGS check_query_single_value_result = (0|1) [, other_settings]] +``` + +- `table_name`: チェックするテーブルの名前を指定します。 +- `partition_expression`: (オプション) テーブルの特定のパーティションをチェックしたい場合、この式を使用してパーティションを指定します。 +- `part_name`: (オプション) テーブル内の特定のパートをチェックしたい場合、文字列リテラルを追加してパート名を指定します。 +- `FORMAT format`: (オプション) 結果の出力フォーマットを指定できます。 +- `SETTINGS`: (オプション) 追加の設定を許可します。 + - **`check_query_single_value_result`**: (オプション) 詳細な結果 (`0`) または要約された結果 (`1`) を切り替えるための設定。 + - 他の設定も適用できます。結果の順序を予測可能にする必要がない場合、`max_threads` を1以上に設定してクエリを高速化できます。 + +クエリの応答は、`check_query_single_value_result` 設定の値に依存します。 +`check_query_single_value_result = 1` の場合、`result` カラムに1行のみが返されます。この行の値は、整合性チェックに合格した場合は `1` であり、データが破損している場合は `0` です。 + +`check_query_single_value_result = 0` の場合、クエリは以下のカラムを返します: +- `part_path`: データパートまたはファイル名へのパスを示します。 +- `is_passed`: このパートのチェックが成功した場合は1、そうでない場合は0を返します。 +- `message`: エラーや成功メッセージなど、チェックに関連する追加メッセージ。 + +`CHECK TABLE` クエリは以下のテーブルエンジンをサポートします: + +- [Log](../../engines/table-engines/log-family/log.md) +- [TinyLog](../../engines/table-engines/log-family/tinylog.md) +- [StripeLog](../../engines/table-engines/log-family/stripelog.md) +- [MergeTree ファミリー](../../engines/table-engines/mergetree-family/mergetree.md) + +別のテーブルエンジンを持つテーブルで実行すると、`NOT_IMPLEMENTED` 例外が発生します。 + +`*Log` ファミリーのエンジンは、障害時の自動データ回復を提供しません。`CHECK TABLE` クエリを使用してデータ損失をタイムリーに追跡してください。 + +## 例 + +デフォルトでは、`CHECK TABLE` クエリはテーブルの一般的なチェック状況を表示します: + +```sql +CHECK TABLE test_table; +``` + +```text +┌─result─┐ +│ 1 │ +└────────┘ +``` + +個々のデータパートごとのチェック状況を確認したい場合、`check_query_single_value_result` 設定を使用できます。 + +また、テーブルの特定のパーティションをチェックするには、`PARTITION` キーワードを使用できます。 + +```sql +CHECK TABLE t0 PARTITION ID '201003' +FORMAT PrettyCompactMonoBlock +SETTINGS check_query_single_value_result = 0 +``` + +出力: + +```text +┌─part_path────┬─is_passed─┬─message─┐ +│ 201003_7_7_0 │ 1 │ │ +│ 201003_3_3_0 │ 1 │ │ +└──────────────┴───────────┴─────────┘ +``` + +同様に、特定のパートをチェックするには、`PART` キーワードを使用します。 + +```sql +CHECK TABLE t0 PART '201003_7_7_0' +FORMAT PrettyCompactMonoBlock +SETTINGS check_query_single_value_result = 0 +``` + +出力: + +```text +┌─part_path────┬─is_passed─┬─message─┐ +│ 201003_7_7_0 │ 1 │ │ +└──────────────┴───────────┴─────────┘ +``` + +パートが存在しない場合、クエリはエラーを返します: + +```sql +CHECK TABLE t0 PART '201003_111_222_0' +``` + +```text +DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART) +``` + +### 'Corrupted' 結果の受信 + +:::warning +免責事項: ここで説明する手順、特にデータディレクトリからの直接的なファイルの操作や削除は、実験または開発環境のみを対象としています。生産サーバーでこれを行うと、データ損失やその他の予期せぬ結果を招く可能性があるため、絶対に行わないでください。 +::: + +既存のチェックサムファイルを削除: + +```bash +rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txt +``` + +```sql +CHECK TABLE t0 PARTITION ID '201003' +FORMAT PrettyCompactMonoBlock +SETTINGS check_query_single_value_result = 0 +``` + +出力: + +```text +┌─part_path────┬─is_passed─┬─message──────────────────────────────────┐ +│ 201003_7_7_0 │ 1 │ │ +│ 201003_3_3_0 │ 1 │ Checksums recounted and written to disk. │ +└──────────────┴───────────┴──────────────────────────────────────────┘ +``` + +checksums.txt ファイルが存在しない場合、それを復元できます。これは、特定のパーティションに対する `CHECK TABLE` コマンドの実行中に再計算され、再書き込みされ、ステータスは 'is_passed = 1' として報告され続けます。 + +`(Replicated)MergeTree` テーブルをすべて一度にチェックするには、`CHECK ALL TABLES` クエリを使用します。 + +```sql +CHECK ALL TABLES +FORMAT PrettyCompactMonoBlock +SETTINGS check_query_single_value_result = 0 +``` + +```text +┌─database─┬─table────┬─part_path───┬─is_passed─┬─message─┐ +│ default │ t2 │ all_1_95_3 │ 1 │ │ +│ db1 │ table_01 │ all_39_39_0 │ 1 │ │ +│ default │ t1 │ all_39_39_0 │ 1 │ │ +│ db1 │ t1 │ all_39_39_0 │ 1 │ │ +│ db1 │ table_01 │ all_1_6_1 │ 1 │ │ +│ default │ t1 │ all_1_6_1 │ 1 │ │ +│ db1 │ t1 │ all_1_6_1 │ 1 │ │ +│ db1 │ table_01 │ all_7_38_2 │ 1 │ │ +│ db1 │ t1 │ all_7_38_2 │ 1 │ │ +│ default │ t1 │ all_7_38_2 │ 1 │ │ +└──────────┴──────────┴─────────────┴───────────┴─────────┘ +``` + +## データが破損している場合 + +テーブルが破損している場合、破損していないデータを別のテーブルにコピーできます。これを行うには: + +1. 損傷したテーブルと同じ構造の新しいテーブルを作成します。このために、クエリ `CREATE TABLE AS ` を実行します。 +2. 次のクエリを単一スレッドで処理するために `max_threads` の値を1に設定します。これを行うために、クエリ `SET max_threads = 1` を実行します。 +3. クエリ `INSERT INTO SELECT * FROM ` を実行します。このリクエストは損傷したテーブルから別のテーブルに破損していないデータをコピーします。破損部分の前のデータのみがコピーされます。 +4. `clickhouse-client` を再起動して `max_threads` の値をリセットします。 diff --git a/docs/ja/sql-reference/statements/create/database.md b/docs/ja/sql-reference/statements/create/database.md new file mode 100644 index 00000000000..01231d71f13 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/database.md @@ -0,0 +1,59 @@ +--- +slug: /ja/sql-reference/statements/create/database +sidebar_position: 35 +sidebar_label: DATABASE +--- + +# CREATE DATABASE + +新しいデータベースを作成します。 + +``` sql +CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] [COMMENT 'Comment'] +``` + +## 句 + +### IF NOT EXISTS + +`db_name` データベースが既に存在する場合、ClickHouseは新しいデータベースを作成せずに以下のように動作します。 + +- この句が指定されている場合、例外を投げません。 +- この句が指定されていない場合、例外を投げます。 + +### ON CLUSTER + +ClickHouseは、指定されたクラスタ内のすべてのサーバー上に `db_name` データベースを作成します。詳細は[分散DDL](../../../sql-reference/distributed-ddl.md)の記事を参照してください。 + +### ENGINE + +デフォルトでは、ClickHouseは自身の[Atomic](../../../engines/database-engines/atomic.md)データベースエンジンを使用します。他にも[Lazy](../../../engines/database-engines/lazy.md)、[MySQL](../../../engines/database-engines/mysql.md)、[PostgresSQL](../../../engines/database-engines/postgresql.md)、[MaterializedMySQL](../../../engines/database-engines/materialized-mysql.md)、[MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md)、[Replicated](../../../engines/database-engines/replicated.md)、[SQLite](../../../engines/database-engines/sqlite.md)があります。 + +### COMMENT + +データベースを作成するときにコメントを追加することができます。 + +コメントはすべてのデータベースエンジンでサポートされています。 + +**構文** + +``` sql +CREATE DATABASE db_name ENGINE = engine(...) COMMENT 'Comment' +``` + +**例** + +クエリ: + +``` sql +CREATE DATABASE db_comment ENGINE = Memory COMMENT 'The temporary database'; +SELECT name, comment FROM system.databases WHERE name = 'db_comment'; +``` + +結果: + +```text +┌─name───────┬─comment────────────────┐ +│ db_comment │ The temporary database │ +└────────────┴────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/statements/create/dictionary.md b/docs/ja/sql-reference/statements/create/dictionary.md new file mode 100644 index 00000000000..46de420b491 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/dictionary.md @@ -0,0 +1,162 @@ +--- +slug: /ja/sql-reference/statements/create/dictionary +sidebar_position: 38 +sidebar_label: DICTIONARY +title: "CREATE DICTIONARY" +--- + +指定された[構造](../../../sql-reference/dictionaries/index.md#dictionary-key-and-fields)、[ソース](../../../sql-reference/dictionaries/index.md#dictionary-sources)、[レイアウト](../../../sql-reference/dictionaries/index.md#storig-dictionaries-in-memory)、および[有効期間](../../../sql-reference/dictionaries/index.md#dictionary-updates)を持つ新しい[Dictionary](../../../sql-reference/dictionaries/index.md)を作成します。 + +## 文法 + +``` sql +CREATE [OR REPLACE] DICTIONARY [IF NOT EXISTS] [db.]dictionary_name [ON CLUSTER cluster] +( + key1 type1 [DEFAULT|EXPRESSION expr1] [IS_OBJECT_ID], + key2 type2 [DEFAULT|EXPRESSION expr2], + attr1 type2 [DEFAULT|EXPRESSION expr3] [HIERARCHICAL|INJECTIVE], + attr2 type2 [DEFAULT|EXPRESSION expr4] [HIERARCHICAL|INJECTIVE] +) +PRIMARY KEY key1, key2 +SOURCE(SOURCE_NAME([param1 value1 ... paramN valueN])) +LAYOUT(LAYOUT_NAME([param_name param_value])) +LIFETIME({MIN min_val MAX max_val | max_val}) +SETTINGS(setting_name = setting_value, setting_name = setting_value, ...) +COMMENT 'Comment' +``` + +Dictionaryの構造は属性で構成されます。Dictionaryの属性は、テーブルのカラムに類似して指定されます。唯一必要なのはそのタイプで、他のプロパティはデフォルト値を持つことができます。 + +`ON CLUSTER`句は、クラスター上でDictionaryを作成することを可能にします。詳細は[分散DDL](../../../sql-reference/distributed-ddl.md)を参照してください。 + +Dictionaryの[レイアウト](../../../sql-reference/dictionaries/index.md#storig-dictionaries-in-memory)に応じて、1つまたは複数の属性をDictionaryのキーとして指定できます。 + +## SOURCE + +Dictionaryのソースは以下のものが可能です: +- 現在のClickHouseサービス内のテーブル +- リモートClickHouseサービス内のテーブル +- HTTP(S)でアクセス可能なファイル +- 他のデータベース + +### 現在のClickHouseサービス内のテーブルからDictionaryを作成する + +入力テーブル `source_table`: + +``` text +┌─id─┬─value──┐ +│ 1 │ First │ +│ 2 │ Second │ +└────┴────────┘ +``` + +Dictionaryの作成: + +``` sql +CREATE DICTIONARY id_value_dictionary +( + id UInt64, + value String +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(TABLE 'source_table')) +LAYOUT(FLAT()) +LIFETIME(MIN 0 MAX 1000) +``` + +Dictionaryを出力する: + +``` sql +SHOW CREATE DICTIONARY id_value_dictionary; +``` + +```response +CREATE DICTIONARY default.id_value_dictionary +( + `id` UInt64, + `value` String +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(TABLE 'source_table')) +LIFETIME(MIN 0 MAX 1000) +LAYOUT(FLAT()) +``` + +:::note +[ClickHouse Cloud](https://clickhouse.com)でSQLコンソールを使用する際には、Dictionaryを作成する際にユーザー(`default`または役割`default_role`を持つ他のユーザー)とパスワードを指定する必要があります。 +:::note + +```sql +CREATE USER IF NOT EXISTS clickhouse_admin +IDENTIFIED WITH sha256_password BY 'passworD43$x'; + +GRANT default_role TO clickhouse_admin; + +CREATE DATABASE foo_db; + +CREATE TABLE foo_db.source_table ( + id UInt64, + value String +) ENGINE = MergeTree +PRIMARY KEY id; + +CREATE DICTIONARY foo_db.id_value_dictionary +( + id UInt64, + value String +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(TABLE 'source_table' USER 'clickhouse_admin' PASSWORD 'passworD43$x' DB 'foo_db' )) +LAYOUT(FLAT()) +LIFETIME(MIN 0 MAX 1000); +``` + +### リモートClickHouseサービスのテーブルからDictionaryを作成する + +入力テーブル(リモートClickHouseサービス内)`source_table`: + +``` text +┌─id─┬─value──┐ +│ 1 │ First │ +│ 2 │ Second │ +└────┴────────┘ +``` + +Dictionaryの作成: + +``` sql +CREATE DICTIONARY id_value_dictionary +( + id UInt64, + value String +) +PRIMARY KEY id +SOURCE(CLICKHOUSE(HOST 'HOSTNAME' PORT 9000 USER 'default' PASSWORD 'PASSWORD' TABLE 'source_table' DB 'default')) +LAYOUT(FLAT()) +LIFETIME(MIN 0 MAX 1000) +``` + +### HTTP(S)でアクセス可能なファイルからDictionaryを作成する + +```sql +CREATE DICTIONARY default.taxi_zone_dictionary +( + `LocationID` UInt16 DEFAULT 0, + `Borough` String, + `Zone` String, + `service_zone` String +) +PRIMARY KEY LocationID +SOURCE(HTTP(URL 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv' FORMAT 'CSVWithNames')) +LIFETIME(MIN 0 MAX 0) +LAYOUT(HASHED()) +``` + +### 他のデータベースからDictionaryを作成する + +詳細は[Dictionary ソース](/docs/ja/sql-reference/dictionaries/index.md#dictionary-sources/#dbms)をご参照ください。 + +**関連情報** + +- 詳細については、[Dictionaries](../../../sql-reference/dictionaries/index.md)のセクションをご覧ください。 +- [system.dictionaries](../../../operations/system-tables/dictionaries.md) — このテーブルには[Dictionary](../../../sql-reference/dictionaries/index.md)に関する情報が含まれています。 diff --git a/docs/ja/sql-reference/statements/create/function.md b/docs/ja/sql-reference/statements/create/function.md new file mode 100644 index 00000000000..0726099e66e --- /dev/null +++ b/docs/ja/sql-reference/statements/create/function.md @@ -0,0 +1,65 @@ +--- +slug: /ja/sql-reference/statements/create/function +sidebar_position: 38 +sidebar_label: FUNCTION +title: "CREATE FUNCTION - ユーザー定義関数 (UDF)" +--- + +ラムダ式からユーザー定義関数 (UDF) を作成します。式は関数のパラメーター、定数、演算子、または他の関数呼び出しで構成する必要があります。 + +**構文** + +```sql +CREATE FUNCTION name [ON CLUSTER cluster] AS (parameter0, ...) -> expression +``` +関数は任意の数のパラメーターを持つことができます。 + +いくつかの制約事項があります: + +- 関数の名前はユーザー定義関数およびシステム関数の中で一意でなければなりません。 +- 再帰関数は許可されていません。 +- 関数が使用するすべての変数は、そのパラメーターリストに指定されなければなりません。 + +いずれかの制約が違反された場合、例外が発生します。 + +**例** + +クエリ: + +```sql +CREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b; +SELECT number, linear_equation(number, 2, 1) FROM numbers(3); +``` + +結果: + +``` text +┌─number─┬─plus(multiply(2, number), 1)─┐ +│ 0 │ 1 │ +│ 1 │ 3 │ +│ 2 │ 5 │ +└────────┴──────────────────────────────┘ +``` + +以下のクエリでは、[条件関数](../../../sql-reference/functions/conditional-functions.md) がユーザー定義関数内で呼び出されます: + +```sql +CREATE FUNCTION parity_str AS (n) -> if(n % 2, 'odd', 'even'); +SELECT number, parity_str(number) FROM numbers(3); +``` + +結果: + +``` text +┌─number─┬─if(modulo(number, 2), 'odd', 'even')─┐ +│ 0 │ even │ +│ 1 │ odd │ +│ 2 │ even │ +└────────┴──────────────────────────────────────┘ +``` + +## 関連コンテンツ + +### [実行可能なUDFs](/docs/ja/sql-reference/functions/udf.md). + +### [ClickHouse Cloudのユーザー定義関数](https://clickhouse.com/blog/user-defined-functions-clickhouse-udfs) diff --git a/docs/ja/sql-reference/statements/create/index.md b/docs/ja/sql-reference/statements/create/index.md new file mode 100644 index 00000000000..75c0562c597 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/index.md @@ -0,0 +1,21 @@ +--- +slug: /ja/sql-reference/statements/create/ +sidebar_position: 34 +sidebar_label: CREATE +--- + +# CREATE クエリ + +CREATEクエリは、次のいずれかの種類の新しいエンティティを作成します。 + +- [データベース](/docs/ja/sql-reference/statements/create/database.md) +- [テーブル](/docs/ja/sql-reference/statements/create/table.md) +- [ビュー](/docs/ja/sql-reference/statements/create/view.md) +- [Dictionary](/docs/ja/sql-reference/statements/create/dictionary.md) +- [関数](/docs/ja/sql-reference/statements/create/function.md) +- [ユーザー](/docs/ja/sql-reference/statements/create/user.md) +- [役割](/docs/ja/sql-reference/statements/create/role.md) +- [行ポリシー](/docs/ja/sql-reference/statements/create/row-policy.md) +- [クオータ](/docs/ja/sql-reference/statements/create/quota.md) +- [設定プロファイル](/docs/ja/sql-reference/statements/create/settings-profile.md) +- [名前付きコレクション](/docs/ja/sql-reference/statements/create/named-collection.md) diff --git a/docs/ja/sql-reference/statements/create/named-collection.md b/docs/ja/sql-reference/statements/create/named-collection.md new file mode 100644 index 00000000000..285fafd9f98 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/named-collection.md @@ -0,0 +1,38 @@ +--- +slug: /ja/sql-reference/statements/create/named-collection +sidebar_label: NAMED COLLECTION +--- + +import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; + + + +# NAMED COLLECTIONの作成 + +新しいNamed Collectionを作成します。 + +**構文** + +```sql +CREATE NAMED COLLECTION [IF NOT EXISTS] name [ON CLUSTER cluster] AS +key_name1 = 'some value' [[NOT] OVERRIDABLE], +key_name2 = 'some value' [[NOT] OVERRIDABLE], +key_name3 = 'some value' [[NOT] OVERRIDABLE], +... +``` + +**例** + +```sql +CREATE NAMED COLLECTION foobar AS a = '1', b = '2' OVERRIDABLE; +``` + +**関連ステートメント** + +- [NAMED COLLECTIONの作成](https://clickhouse.com/docs/ja/sql-reference/statements/alter/named-collection) +- [NAMED COLLECTIONの削除](https://clickhouse.com/docs/ja/sql-reference/statements/drop#drop-function) + + +**関連項目** + +- [Named collectionsガイド](/docs/ja/operations/named-collections.md) diff --git a/docs/ja/sql-reference/statements/create/quota.md b/docs/ja/sql-reference/statements/create/quota.md new file mode 100644 index 00000000000..6270382b0ed --- /dev/null +++ b/docs/ja/sql-reference/statements/create/quota.md @@ -0,0 +1,40 @@ +--- +slug: /ja/sql-reference/statements/create/quota +sidebar_position: 42 +sidebar_label: QUOTA +title: "CREATE QUOTA" +--- + +ユーザーまたはロールに割り当てることができる[quota](../../../guides/sre/user-management/index.md#quotas-management)を作成します。 + +構文: + +``` sql +CREATE QUOTA [IF NOT EXISTS | OR REPLACE] name [ON CLUSTER cluster_name] + [IN access_storage_type] + [KEYED BY {user_name | ip_address | client_key | client_key,user_name | client_key,ip_address} | NOT KEYED] + [FOR [RANDOMIZED] INTERVAL number {second | minute | hour | day | week | month | quarter | year} + {MAX { {queries | query_selects | query_inserts | errors | result_rows | result_bytes | read_rows | read_bytes | execution_time} = number } [,...] | + NO LIMITS | TRACKING ONLY} [,...]] + [TO {role [,...] | ALL | ALL EXCEPT role [,...]}] +``` + +`user_name`、`ip_address`、`client_key`、`client_key, user_name`、`client_key, ip_address`キーは、[system.quotas](../../../operations/system-tables/quotas.md)テーブルのフィールドに対応します。 + +`queries`、`query_selects`、`query_inserts`、`errors`、`result_rows`、`result_bytes`、`read_rows`、`read_bytes`、`execution_time`、`failed_sequential_authentications`パラメータは、[system.quotas_usage](../../../operations/system-tables/quotas_usage.md)テーブルのフィールドに対応します。 + +`ON CLUSTER`句は、クラスターにクオータを作成することを許可します。[分散DDL](../../../sql-reference/distributed-ddl.md)参照。 + +**例** + +現在のユーザーに対して、最大クエリ数を15ヶ月で123クエリに制限する: + +``` sql +CREATE QUOTA qA FOR INTERVAL 15 month MAX queries = 123 TO CURRENT_USER; +``` + +デフォルトユーザーに対して、最大実行時間を30分で0.5秒に制限し、最大クエリ数を5四半期で321クエリ、最大エラー数を10に制限する: + +``` sql +CREATE QUOTA qB FOR INTERVAL 30 minute MAX execution_time = 0.5, FOR INTERVAL 5 quarter MAX queries = 321, errors = 10 TO default; +``` diff --git a/docs/ja/sql-reference/statements/create/role.md b/docs/ja/sql-reference/statements/create/role.md new file mode 100644 index 00000000000..2b07fdd1ed3 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/role.md @@ -0,0 +1,48 @@ +--- +slug: /ja/sql-reference/statements/create/role +sidebar_position: 40 +sidebar_label: ROLE +title: "CREATE ROLE" +--- + +新しい[ロール](../../../guides/sre/user-management/index.md#role-management)を作成します。ロールは、[特権](../../../sql-reference/statements/grant.md#grant-privileges)の集合です。ロールに割り当てられた[ユーザー](../../../sql-reference/statements/create/user.md)は、そのロールのすべての特権を取得します。 + +構文: + +``` sql +CREATE ROLE [IF NOT EXISTS | OR REPLACE] name1 [, name2 [,...]] [ON CLUSTER cluster_name] + [IN access_storage_type] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] +``` + +## ロールの管理 + +ユーザーには複数のロールを割り当てることができます。ユーザーは、[SET ROLE](../../../sql-reference/statements/set-role.md)文を使用して、割り当てられたロールを任意の組み合わせで適用することができます。最終的な特権の範囲は、適用されたすべてのロールのすべての特権を組み合わせたものになります。ユーザーアカウントに直接付与された特権がある場合、それもロールによって付与された特権と組み合わされます。 + +ユーザーはログイン時に適用されるデフォルトのロールを持つことができます。デフォルトのロールを設定するには、[SET DEFAULT ROLE](../../../sql-reference/statements/set-role.md#set-default-role-statement)文または[ALTER USER](../../../sql-reference/statements/alter/user.md#alter-user-statement)文を使用します。 + +ロールを取り消すには、[REVOKE](../../../sql-reference/statements/revoke.md)文を使用します。 + +ロールを削除するには、[DROP ROLE](../../../sql-reference/statements/drop.md#drop-role-statement)文を使用します。削除されたロールは、割り当てられていたすべてのユーザーおよびロールから自動的に取り消されます。 + +## 例 + +``` sql +CREATE ROLE accountant; +GRANT SELECT ON db.* TO accountant; +``` + +この一連のクエリは、`db` データベースからデータを読み取る特権を持つロール `accountant` を作成します。 + +ユーザー `mira` にロールを割り当てるには: + +``` sql +GRANT accountant TO mira; +``` + +ロールが割り当てられた後、ユーザーはそのロールを適用し、許可されたクエリを実行できます。例えば: + +``` sql +SET ROLE accountant; +SELECT * FROM db.*; +``` diff --git a/docs/ja/sql-reference/statements/create/row-policy.md b/docs/ja/sql-reference/statements/create/row-policy.md new file mode 100644 index 00000000000..32d532fcf01 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/row-policy.md @@ -0,0 +1,103 @@ +--- +slug: /ja/sql-reference/statements/create/row-policy +sidebar_position: 41 +sidebar_label: ROW POLICY +title: "CREATE ROW POLICY" +--- + +[行ポリシー](../../../guides/sre/user-management/index.md#row-policy-management)を作成します。これは、ユーザーがテーブルから読み取ることができる行を決定するために使用されるフィルターです。 + +:::tip +行ポリシーは、読み取り専用アクセスを持つユーザーに対してのみ意味があります。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーしたりできる場合、行ポリシーの制限は無効になります。 +::: + +構文: + +``` sql +CREATE [ROW] POLICY [IF NOT EXISTS | OR REPLACE] policy_name1 [ON CLUSTER cluster_name1] ON [db1.]table1|db1.* + [, policy_name2 [ON CLUSTER cluster_name2] ON [db2.]table2|db2.* ...] + [IN access_storage_type] + [FOR SELECT] USING condition + [AS {PERMISSIVE | RESTRICTIVE}] + [TO {role1 [, role2 ...] | ALL | ALL EXCEPT role1 [, role2 ...]}] +``` + +## USING 句 + +行をフィルタリングする条件を指定できます。ある行に対して条件が非ゼロに計算された場合、その行はユーザーに表示されます。 + +## TO 句 + +`TO` セクションでは、このポリシーが適用されるユーザーやロールのリストを指定できます。例えば、`CREATE ROW POLICY ... TO accountant, john@localhost` のようにします。 + +キーワード `ALL` は、現在のユーザーを含むすべての ClickHouse ユーザーを意味します。キーワード `ALL EXCEPT` を使用すると、特定のユーザーを除外することができます。たとえば、`CREATE ROW POLICY ... TO ALL EXCEPT accountant, john@localhost` + +:::note +テーブルに定義されている行ポリシーがない場合、任意のユーザーがテーブルからすべての行を `SELECT` できます。テーブルに1つ以上の行ポリシーを定義すると、現在のユーザーに関係なく、そのテーブルへのアクセスは行ポリシーに依存するようになります。例えば、以下のポリシー: + +`CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter` + +は、ユーザー `mira` と `peter` が `b != 1` の行を見ることを禁止しますが、言及されていないユーザー (例: ユーザー `paul`) は `mydb.table1` の行を全く見ることができません。 + +それが望ましくない場合、以下のようなもう1つの行ポリシーを追加することで修正できます: + +`CREATE ROW POLICY pol2 ON mydb.table1 USING 1 TO ALL EXCEPT mira, peter` +::: + +## AS 句 + +同じユーザーに対して、同じテーブルで複数のポリシーを同時に有効化することができます。そのため、複数のポリシーに基づく条件を結合する方法が必要です。 + +デフォルトでは、ポリシーは論理演算子 `OR` を使用して結合されます。例えば、以下のポリシー: + +``` sql +CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter +CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 TO peter, antonio +``` + +は、ユーザー `peter` が `b=1` または `c=2` のいずれかの行を閲覧できるようにします。 + +`AS` 句は、ポリシーを他のポリシーとどのように組み合わせるかを指定します。ポリシーは[許可的](PERMISSIVE)または[制限的](RESTRICTIVE)にできます。デフォルトでは、ポリシーは許可的で、論理演算子 `OR` を使って結合されます。 + +代替としてポリシーを制限的に定義することができます。制限的ポリシーは論理演算子 `AND` を使って結合されます。 + +一般的な公式は次のとおりです: + +``` +row_is_visible = (1つ以上の許可的なポリシーの条件が非ゼロ) AND + (すべての制限的なポリシーの条件が非ゼロ) +``` + +例えば、以下のポリシー: + +``` sql +CREATE ROW POLICY pol1 ON mydb.table1 USING b=1 TO mira, peter +CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 AS RESTRICTIVE TO peter, antonio +``` + +は、ユーザー `peter` が `b=1` かつ `c=2` の行のみを見ることを許可します。 + +データベースポリシーはテーブルポリシーと結合されます。 + +例えば、以下のポリシー: + +``` sql +CREATE ROW POLICY pol1 ON mydb.* USING b=1 TO mira, peter +CREATE ROW POLICY pol2 ON mydb.table1 USING c=2 AS RESTRICTIVE TO peter, antonio +``` + +は、ユーザー `peter` が `b=1` かつ `c=2` の場合のみ table1 の行を見ることができますが、mydb 内の他のテーブルには `b=1` ポリシーのみが適用されます。 + +## ON CLUSTER 句 + +クラスターに行ポリシーを作成することができます。[分散DDL](../../../sql-reference/distributed-ddl.md)を参照してください。 + +## 例 + +`CREATE ROW POLICY filter1 ON mydb.mytable USING a<1000 TO accountant, john@localhost` + +`CREATE ROW POLICY filter2 ON mydb.mytable USING a<1000 AND b=5 TO ALL EXCEPT mira` + +`CREATE ROW POLICY filter3 ON mydb.mytable USING 1 TO admin` + +`CREATE ROW POLICY filter4 ON mydb.* USING 1 TO admin` diff --git a/docs/ja/sql-reference/statements/create/settings-profile.md b/docs/ja/sql-reference/statements/create/settings-profile.md new file mode 100644 index 00000000000..30bf1bbc9b7 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/settings-profile.md @@ -0,0 +1,35 @@ +--- +slug: /ja/sql-reference/statements/create/settings-profile +sidebar_position: 43 +sidebar_label: SETTINGS PROFILE +title: "CREATE SETTINGS PROFILE" +--- + +ユーザーまたはロールに割り当てることができる[設定プロファイル](../../../guides/sre/user-management/index.md#settings-profiles-management)を作成します。 + +構文: + +``` sql +CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] name1 [, name2 [,...]] + [ON CLUSTER cluster_name] + [IN access_storage_type] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] + [TO {{role1 | user1 [, role2 | user2 ...]} | NONE | ALL | ALL EXCEPT {role1 | user1 [, role2 | user2 ...]}}] +``` + +`ON CLUSTER`句を使用すると、クラスター上で設定プロファイルを作成できます。[分散DDL](../../../sql-reference/distributed-ddl.md)を参照してください。 + +## 例 + +ユーザーを作成します: +```sql +CREATE USER robin IDENTIFIED BY 'password'; +``` + +`max_memory_usage_profile`という設定プロファイルを`max_memory_usage`設定の値と制約を含めて作成し、ユーザー`robin`に割り当てます: + +``` sql +CREATE +SETTINGS PROFILE max_memory_usage_profile SETTINGS max_memory_usage = 100000001 MIN 90000000 MAX 110000000 +TO robin +``` diff --git a/docs/ja/sql-reference/statements/create/table.md b/docs/ja/sql-reference/statements/create/table.md new file mode 100644 index 00000000000..d4343513fc3 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/table.md @@ -0,0 +1,656 @@ +--- +slug: /ja/sql-reference/statements/create/table +sidebar_position: 36 +sidebar_label: TABLE +title: "CREATE TABLE" +keywords: [compression, codec, schema, DDL] +--- + +新しいテーブルを作成します。このクエリは、使用ケースに応じてさまざまな構文形式を持つことができます。 + +デフォルトでは、テーブルは現在のサーバーのみに作成されます。分散DDLクエリは `ON CLUSTER` 句として実装されており、[別途説明されています](../../../sql-reference/distributed-ddl.md)。 + +## 構文形式 + +### 明示的なスキーマを使用する場合 + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [COMMENT 'カラムのコメント'] [compression_codec] [TTL expr1], + name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [COMMENT 'カラムのコメント'] [compression_codec] [TTL expr2], + ... +) ENGINE = engine + [COMMENT 'テーブルのコメント'] +``` + +`table_name` という名前のテーブルを `db` データベース、または `db` が設定されていない場合は現在のデータベースに作成し、括弧内に指定された構造と `engine` エンジンで作成します。 +テーブルの構造はカラムの記述、二次インデックス、制約のリストです。エンジンが[主キー](#primary-key)をサポートしている場合、テーブルエンジンのパラメータとして示されます。 + +カラムの記述は、最も単純な場合には `name type` です。例:`RegionID UInt32`。 + +デフォルト値のための式も定義できます(以下を参照)。 + +必要に応じて、一つまたは複数のキー式を指定して主キーを指定できます。 + +カラムとテーブルにコメントを追加できます。 + +### 別のテーブルに類似したスキーマを使用する場合 + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine] +``` + +別のテーブルと同じ構造のテーブルを作成します。テーブルに異なるエンジンを指定できます。エンジンが指定されていない場合、`db2.name2` テーブルと同じエンジンが使用されます。 + +### 別のテーブルからスキーマとデータをクローンする場合 + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name CLONE AS [db2.]name2 [ENGINE = engine] +``` + +別のテーブルと同じ構造のテーブルを作成します。テーブルに異なるエンジンを指定できます。エンジンが指定されていない場合、`db2.name2` テーブルと同じエンジンが使用されます。新しいテーブルが作成された後、`db2.name2` からのすべてのパーティションがそれに添付されます。言い換えれば、`db2.name2` のデータは作成時に `db.table_name` にクローンされます。このクエリは次のものと同等です: + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]; +ALTER TABLE [db.]table_name ATTACH PARTITION ALL FROM [db2].name2; +``` + +### テーブル関数から作成する場合 + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name AS table_function() +``` + +指定された[テーブル関数](../../../sql-reference/table-functions/index.md#table-functions)と同じ結果のテーブルを作成します。作成されたテーブルは、指定された対応するテーブル関数と同様に機能します。 + +### SELECT クエリから作成する場合 + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name[(name1 [type1], name2 [type2], ...)] ENGINE = engine AS SELECT ... +``` + +`SELECT` クエリの結果に似た構造で、データを `SELECT` から取得して `engine` エンジンでテーブルを作成します。また、カラムの説明を明示的に指定できます。 + +テーブルがすでに存在し、`IF NOT EXISTS` が指定されている場合、クエリは何も行いません。 + +クエリ内の `ENGINE` 句の後に他の句を指定することができます。テーブル作成の詳細なドキュメントについては、[テーブルエンジン](../../../engines/table-engines/index.md#table_engines)の説明を参照してください。 + +:::tip +ClickHouse Cloud では、以下の2つのステップに分けてください: +1. テーブル構造の作成 + + ```sql + CREATE TABLE t1 + ENGINE = MergeTree + ORDER BY ... + # highlight-next-line + EMPTY AS + SELECT ... + ``` + +2. テーブルへのデータ投入 + + ```sql + INSERT INTO t1 + SELECT ... + ``` + +::: + +**例** + +クエリ: + +``` sql +CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1; +SELECT x, toTypeName(x) FROM t1; +``` + +結果: + +```text +┌─x─┬─toTypeName(x)─┐ +│ 1 │ String │ +└───┴───────────────┘ +``` + +## NULL または NOT NULL 修飾子 + +カラム定義後のデータ型に続く `NULL` および `NOT NULL` 修飾子 は、それが [Nullable](../../../sql-reference/data-types/nullable.md#data_type-nullable) を許可するかどうかを示します。 + +型が `Nullable` でない場合、`NULL` が指定されるとそれは `Nullable` として扱われ、`NOT NULL` が指定されるとそうではありません。例えば、`INT NULL` は `Nullable(INT)` と同じです。型が `Nullable` で、`NULL` または `NOT NULL` 修飾子が指定されている場合、例外が発生します。 + +また、[data_type_default_nullable](../../../operations/settings/settings.md#data_type_default_nullable) 設定も参照してください。 + +## デフォルト値 {#default_values} + +カラムの記述は `DEFAULT expr`、`MATERIALIZED expr`、または `ALIAS expr` の形式でデフォルト値の式を指定できます。例: `URLDomain String DEFAULT domain(URL)`。 + +式 `expr` は省略可能です。省略された場合、カラムの型は明示的に指定する必要があり、デフォルト値は数値カラムの場合は `0`、文字列カラムの場合は `''`(空の文字列)、配列カラムの場合は `[]`(空の配列)、日付カラムの場合は `1970-01-01`、Nullable カラムの場合は `NULL` です。 + +デフォルト値カラムの型は省略可能であり、その場合は `expr` の型から推測されます。例えば、カラム `EventDate DEFAULT toDate(EventTime)` は日付型になります。 + +データ型とデフォルト値の式の両方が指定されている場合、式を指定された型に変換する暗黙の型キャスト関数が挿入されます。例: `Hits UInt32 DEFAULT 0` は内部的には `Hits UInt32 DEFAULT toUInt32(0)` として表現されます。 + +デフォルト値の式 `expr` は任意のテーブルカラムや定数を参照できます。ClickHouse は、テーブル構造の変更が式の計算にループを導入しないことを確認します。INSERTの際には、式が解決可能であること、すなわち計算に使われるすべてのカラムが渡されていることを確認します。 + +### DEFAULT + +`DEFAULT expr` + +通常のデフォルト値。このようなカラムの値がINSERTクエリで指定されていない場合、`expr` から計算されます。 + +例: + +```sql +CREATE OR REPLACE TABLE test +( + id UInt64, + updated_at DateTime DEFAULT now(), + updated_at_date Date DEFAULT toDate(updated_at) +) +ENGINE = MergeTree +ORDER BY id; + +INSERT INTO test (id) Values (1); + +SELECT * FROM test; +┌─id─┬──────────updated_at─┬─updated_at_date─┐ +│ 1 │ 2023-02-24 17:06:46 │ 2023-02-24 │ +└────┴─────────────────────┴─────────────────┘ +``` + +### MATERIALIZED + +`MATERIALIZED expr` + +マテリアライズド式。このようなカラムの値は行が挿入されるときに指定されたマテリアライズド式に従って自動的に計算されます。値は `INSERT` の際に明示的に指定することはできません。 + +また、このタイプのデフォルト値カラムは `SELECT *` の結果には含まれません。これは、`SELECT *` の結果を常に `INSERT` を使用してテーブルに再挿入できるという不変性を維持するためです。この動作は `asterisk_include_materialized_columns` 設定を使って無効にできます。 + +例: + +```sql +CREATE OR REPLACE TABLE test +( + id UInt64, + updated_at DateTime MATERIALIZED now(), + updated_at_date Date MATERIALIZED toDate(updated_at) +) +ENGINE = MergeTree +ORDER BY id; + +INSERT INTO test Values (1); + +SELECT * FROM test; +┌─id─┐ +│ 1 │ +└────┘ + +SELECT id, updated_at, updated_at_date FROM test; +┌─id─┬──────────updated_at─┬─updated_at_date─┐ +│ 1 │ 2023-02-24 17:08:08 │ 2023-02-24 │ +└────┴─────────────────────┴─────────────────┘ + +SELECT * FROM test SETTINGS asterisk_include_materialized_columns=1; +┌─id─┬──────────updated_at─┬─updated_at_date─┐ +│ 1 │ 2023-02-24 17:08:08 │ 2023-02-24 │ +└────┴─────────────────────┴─────────────────┘ +``` + +### EPHEMERAL + +`EPHEMERAL [expr]` + +エフェメラルカラム。このタイプのカラムはテーブルに保存されず、SELECTすることもできません。エフェメラルカラムの唯一の目的は、他のカラムのデフォルト値式をそれから構築することです。 + +明示的に指定されていないカラムなしでの挿入は、このタイプのカラムをスキップします。これは、`SELECT *` の結果を常に `INSERT` を使用してテーブルに再挿入できるという不変性を維持するためです。 + +例: + +```sql +CREATE OR REPLACE TABLE test +( + id UInt64, + unhexed String EPHEMERAL, + hexed FixedString(4) DEFAULT unhex(unhexed) +) +ENGINE = MergeTree +ORDER BY id; + +INSERT INTO test (id, unhexed) Values (1, '5a90b714'); + +SELECT + id, + hexed, + hex(hexed) +FROM test +FORMAT Vertical; + +Row 1: +────── +id: 1 +hexed: Z�� +hex(hexed): 5A90B714 +``` + +### ALIAS + +`ALIAS expr` + +計算カラム(別名)。このタイプのカラムはテーブルに保存されず、INSERT値を挿入することもできません。 + +SELECTクエリがこのタイプのカラムを明示的に参照すると、値は `expr` からクエリ時に計算されます。デフォルトでは、`SELECT *` はALIASカラムを除外します。この動作は設定 `asterisk_include_alias_columns` で無効にすることができます。 + +ALTERクエリを使用して新しいカラムを追加すると、これらのカラムの古いデータは書き込まれません。代わりに、古いデータを読み取るときに、新しいカラムの値がディスク上に保存されていない場合、デフォルトで式がオンザフライで計算されます。ただし、式の実行に異なるカラムが必要で、クエリに示されていない場合、必要なデータブロックに対してだけ追加でこれらのカラムが読み取られます。 + +新しいカラムをテーブルに追加しても、デフォルト式を後で変更した場合、古いデータに使用される値は変更されます(ディスク上に値が保存されていなかったデータに対して)。バックグラウンドでのマージの実行時には、結合されている部分の1つで値が欠けているカラムのデータが結合された部分に書き込まれます。 + +ネストされたデータ構造の要素にデフォルト値を設定することはできません。 + +```sql +CREATE OR REPLACE TABLE test +( + id UInt64, + size_bytes Int64, + size String ALIAS formatReadableSize(size_bytes) +) +ENGINE = MergeTree +ORDER BY id; + +INSERT INTO test VALUES (1, 4678899); + +SELECT id, size_bytes, size FROM test; +┌─id─┬─size_bytes─┬─size─────┐ +│ 1 │ 4678899 │ 4.46 MiB │ +└────┴────────────┴──────────┘ + +SELECT * FROM test SETTINGS asterisk_include_alias_columns=1; +┌─id─┬─size_bytes─┬─size─────┐ +│ 1 │ 4678899 │ 4.46 MiB │ +└────┴────────────┴──────────┘ +``` + +## 主キー + +テーブルを作成するときに[主キー](../../../engines/table-engines/mergetree-family/mergetree.md#primary-keys-and-indexes-in-queries)を定義できます。主キーは2つの方法で指定できます: + +- カラムリスト内 + +``` sql +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ..., + PRIMARY KEY(expr1[, expr2,...]) +) +ENGINE = engine; +``` + +- カラムリスト外 + +``` sql +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ... +) +ENGINE = engine +PRIMARY KEY(expr1[, expr2,...]); +``` + +:::tip +1つのクエリで両方の方法を組み合わせることはできません。 +::: + +## 制約 + +カラムの記述とともに制約を定義することができます: + +### CONSTRAINT + +``` sql +CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1], + ... + CONSTRAINT constraint_name_1 CHECK boolean_expr_1, + ... +) ENGINE = engine +``` + +`boolean_expr_1` は任意のブール式にできます。テーブルに制約が定義されている場合、各行の `INSERT` クエリごとにそれらがチェックされます。どの制約も満たされない場合、サーバーは制約名とチェック対象の式で例外を発生させます。 + +大量の制約を追加すると、大規模な `INSERT` クエリのパフォーマンスに影響を与える可能性があります。 + +### ASSUME + +`ASSUME` 句は、テーブル上に常に真であると仮定する `CONSTRAINT` を定義するために使用されます。この制約は、SQLクエリのパフォーマンスを向上させるためにオプティマイザーによって使用されます。 + +この例では、`ASSUME CONSTRAINT` が `users_a` テーブルの作成で使用されています: + +```sql +CREATE TABLE users_a ( + uid Int16, + name String, + age Int16, + name_len UInt8 MATERIALIZED length(name), + CONSTRAINT c1 ASSUME length(name) = name_len +) +ENGINE=MergeTree +ORDER BY (name_len, name); +``` + +ここで、`ASSUME CONSTRAINT` は、`length(name)` 関数が常に `name_len` カラムの値と等しいことを保証するために使用されています。つまり、`length(name)` がクエリで呼び出されるたびに、ClickHouseはそれを `name_len` で置き換えることができるため、`length()` 関数を呼び出すことを避けるために高速になります。 + +次に、クエリ `SELECT name FROM users_a WHERE length(name) < 5;` を実行すると、ClickHouseは`ASSUME CONSTRAINT` によって `SELECT name FROM users_a WHERE name_len < 5;` に最適化します。これにより、各行の `name` の長さを計算することを避けるため、クエリが高速になります。 + +`ASSUME CONSTRAINT` は制約を強制するものではなく、単にオプティマイザーに制約が真であることを知らせるものです。制約が実際に真でない場合、クエリの結果が不正確になる可能性があります。したがって、制約が真であると確信している場合にのみ `ASSUME CONSTRAINT` を使用するべきです。 + +## 有効期限 (TTL) 式 + +値の保存期間を定義します。MergeTreeファミリーのテーブルでのみ指定可能です。詳細な説明については、[カラムとテーブルのTTL](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl)を参照してください。 + +## カラム圧縮コーデック {#column_compression_codec} + +デフォルトでは、セルフマネージドのClickHouseでは `lz4` 圧縮を適用し、ClickHouse Cloudでは `zstd` を適用します。 + +`MergeTree`エンジンファミリーの場合、サーバ構成の[compression](../../../operations/server-configuration-parameters/settings.md#server-settings-compression)セクションで、デフォルトの圧縮方法を変更することができます。 + +また、`CREATE TABLE` クエリ内で各カラムの圧縮方法を定義することもできます。 + +``` sql +CREATE TABLE codec_example +( + dt Date CODEC(ZSTD), + ts DateTime CODEC(LZ4HC), + float_value Float32 CODEC(NONE), + double_value Float64 CODEC(LZ4HC(9)), + value Float32 CODEC(Delta, ZSTD) +) +ENGINE = +... +``` + +デフォルト圧縮を参照するには `Default` コーデックを指定できます。実行時に異なる設定(およびデータのプロパティ)に依存する可能性があります。 +例: `value UInt64 CODEC(Default)` — コーデック指定がない場合と同じです。 + +また、カラムから現在のCODECを削除し、config.xmlからのデフォルト圧縮を使用することもできます: + +``` sql +ALTER TABLE codec_example MODIFY COLUMN float_value CODEC(Default); +``` + +コードをパイプラインで組み合わせることもできます。例: `CODEC(Delta, Default)`。 + +:::tip +ClickHouseデータベースファイルを外部ユーティリティである `lz4` などで解凍することはできません。代わりに、特別な [clickhouse-compressor](https://github.com/ClickHouse/ClickHouse/tree/master/programs/compressor) ユーティリティを使用してください。 +::: + +圧縮がサポートされているテーブルエンジン: + +- [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) ファミリー。カラム圧縮コーデックをサポートしており、圧縮設定でデフォルト圧縮方法を選択できます。 +- [Log](../../../engines/table-engines/log-family/index.md) ファミリー。デフォルトで `lz4` 圧縮方法を使用し、カラム圧縮コーデックをサポートします。 +- [Set](../../../engines/table-engines/special/set.md)。デフォルト圧縮のみサポートされています。 +- [Join](../../../engines/table-engines/special/join.md)。デフォルト圧縮のみサポートされています。 + +ClickHouseは汎用のコーデックと専用のコーデックをサポートしています。 + +### 汎用コーデック + +#### NONE + +`NONE` — 圧縮なし。 + +#### LZ4 + +`LZ4` — デフォルトで使用されるロスレスな [データ圧縮アルゴリズム](https://github.com/lz4/lz4) です。LZ4の高速圧縮を適用します。 + +#### LZ4HC + +`LZ4HC[(level)]` — LZ4 HC(高圧縮)アルゴリズムで、levelを設定可能です。デフォルトレベル: 9。`level <= 0` はデフォルトレベルを適用します。可能なレベル: \[1, 12\]。推奨レベル範囲: \[4, 9\]。 + +#### ZSTD + +`ZSTD[(level)]` — [ZSTD 圧縮アルゴリズム](https://en.wikipedia.org/wiki/Zstandard) で、`level` を設定可能です。可能なレベル: \[1, 22\]。デフォルトレベル: 1。 + +高圧縮レベルは、非対称シナリオ、たとえば一度圧縮して何度も解凍する場合に有効です。高レベルはより良い圧縮と高いCPU使用率を意味します。 + +#### ZSTD_QAT + +`ZSTD_QAT[(level)]` — [ZSTD 圧縮アルゴリズム](https://en.wikipedia.org/wiki/Zstandard) で、levelを設定可能、[Intel® QATlib](https://github.com/intel/qatlib) と [Intel® QAT ZSTD Plugin](https://github.com/intel/QAT-ZSTD-Plugin) によって実装されています。可能なレベル: \[1, 12\]。デフォルトレベル: 1。推奨レベル範囲: \[6, 12\]。いくつかの制限があります: + +- ZSTD_QAT はデフォルトで無効になっており、設定 [enable_zstd_qat_codec](../../../operations/settings/settings.md#enable_zstd_qat_codec) を有効にした後にのみ使用できます。 +- 圧縮するために、ZSTD_QAT は Intel® QAT オフロードデバイス ([QuickAssist Technology](https://www.intel.com/content/www/us/en/developer/topic-technology/open/quick-assist-technology/overview.html)) を使用しようとします。そのようなデバイスが見つからない場合、ソフトウェアでのZSTD圧縮にフォールバックします。 +- 解凍は常にソフトウェアで行われます。 + +:::note +ZSTD_QAT は ClickHouse Cloud では利用できません。 +::: + +### 専用コーデック + +これらのコーデックは、データの特定の特徴を活用して圧縮をより効果的にするために設計されています。これらのコーデックの中には、データ自体を圧縮するものではなく、データを準備するためのもので、次の一般目的コーデックを使った圧縮率を高めることを目的としています。 + +#### Delta + +`Delta(delta_bytes)` — 元の値を隣接する2つの値の差に置換する圧縮方式。ただし、最初の値はそのままです。最大 `delta_bytes` がデルタ値を保存するために使用され、したがって `delta_bytes` は元の値の最大サイズです。可能な `delta_bytes` の値: 1, 2, 4, 8。デフォルトの `delta_bytes` 値は、1, 2, 4, または 8 のいずれかである場合は `sizeof(type)` 、その他の場合は 1 です。Delta はデータ準備コーデックであり、単独では使用できません。 + +#### DoubleDelta + +`DoubleDelta(bytes_size)` — 二重のデルタを計算し、コンパクトなバイナリ形式で書き込みます。可能な `bytes_size` の値: 1, 2, 4, 8。デフォルトは、1, 2, 4, または 8 のいずれかの場合は `sizeof(type)` です。その他の場合は 1 です。一定の間隔を持つ単調増加のシーケンス、例えば時系列データで最適な圧縮率が達成されます。あらゆる固定幅型で使用可能。Gorilla TSDBで使用されるアルゴリズムを実装しており、これを64ビット型に拡張しています。32ビットのデルタには1ビット余分に使用されます:5ビットプレフィックス(4ビットプレフィックスではなく)。詳細は[Gorilla: A Fast, Scalable, In-Memory Time Series Database](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf)の「タイムスタンプの圧縮」を参照してください。DoubleDelta はデータ準備コーデックであり、単独では使用できません。 + +#### GCD + +`GCD()` — カラム内の値の最大公約数 (GCD) を計算し、各値をGCDで除算します。整数型、小数型、日付/時間型のカラムで使用できます。このコーデックはGCDの倍数で変化(増加または減少)する値を持つカラムに適しています。例:24, 28, 16, 24, 8, 24(GCD = 4)。GCDはデータ準備コーデックであり、単独では使用できません。 + +#### Gorilla + +`Gorilla(bytes_size)` — 現在の浮動小数点値と前の値の間のXORを計算し、それをコンパクトなバイナリ形式で書き込みます。連続した値の違いが小さく(すなわち、シリーズの値がゆっくりと変化する場合)、圧縮率が向上します。Gorilla TSDBで使用されるアルゴリズムを実装しており、これを64ビット型に拡張しています。可能な `bytes_size` の値: 1, 2, 4, 8。デフォルトは、1, 2, 4, または 8 のいずれかの場合は `sizeof(type)` です。その他の場合は 1 です。さらなる情報については、[Gorilla: A Fast, Scalable, In-Memory Time Series Database](https://doi.org/10.14778/2824032.2824078)のセクション4.1を参照してください。 + +#### FPC + +`FPC(level, float_size)` - 2つの予測子のうちより優れた方を使ってシーケンスの次の浮動小数点値を繰り返し予測し、実際の値と予測された値をXORし、その結果を先行ゼロ圧縮します。Gorillaに似ており、浮動小数点値のシリーズをゆっくりと変化させる際に効率的です。64ビット値(倍精度浮動小数点数)に対して、FPCはGorillaよりも速いですが、32ビット値に対しては異なる結果が得られる場合があります。可能な `level` の値: 1-28、デフォルト値は12。可能な `float_size` の値: 4, 8、デフォルト値は `sizeof(type)` ですが、タイプがFloatである場合です。それ以外の場合は4です。アルゴリズムの詳細については、[High Throughput Compression of Double-Precision Floating-Point Data](https://userweb.cs.txstate.edu/~burtscher/papers/dcc07a.pdf)を参照してください。 + +#### T64 + +`T64` — 整数データ型(`Enum`、`Date` および `DateTime` を含む)の値の不要な高ビットを切り落とす圧縮方式です。アルゴリズムのそれぞれのステップで、コーデックは64個の値のブロックを取り、64×64ビットのマトリックスに入れ、転置し、値の不要なビットを切り捨て、残りをシーケンスとして返します。不要なビットは、圧縮に使用されるデータ部分全体で最大値と最小値の間で異ならないビットです。 + +`DoubleDelta` 及び `Gorilla` コーデックはGorilla TSDBにおいて、その圧縮アルゴリズムのコンポーネントとして使用されます。Gorillaアプローチは、タイムスタンプを持つゆっくりと変化する値のシーケンスシナリオで効果的です。タイムスタンプは `DoubleDelta` コーデックによって効果的に圧縮され、値は `Gorilla` コーデックによって効果的に圧縮されます。例えば、効果的に保存されたテーブルを得るには、以下のような構成でテーブルを作成できます。 + +``` sql +CREATE TABLE codec_example +( + timestamp DateTime CODEC(DoubleDelta), + slow_values Float32 CODEC(Gorilla) +) +ENGINE = MergeTree() +``` + +### 暗号化コーデック + +これらのコーデックは実際にはデータを圧縮しないが、代わりにディスク上のデータを暗号化します。これらは、[encryption](../../../operations/server-configuration-parameters/settings.md#server-settings-encryption) 設定によって暗号化キーが指定された場合にのみ利用可能です。なお、暗号化は通常、コーデックパイプラインの最後に意味をなします。なぜなら、暗号化されたデータは通常、意味のある方法で圧縮することができないためです。 + +暗号化コーデック: + +#### AES_128_GCM_SIV + +`CODEC('AES-128-GCM-SIV')` — RFC 8452](https://tools.ietf.org/html/rfc8452) GCM-SIV モードで AES-128 を使用してデータを暗号化します。 + +#### AES-256-GCM-SIV + +`CODEC('AES-256-GCM-SIV')` — GCM-SIV モードで AES-256 を使用してデータを暗号化します。 + +これらのコーデックは固定ノンスを使用し、暗号化は決定的であるため、[ReplicatedMergeTree](../../../engines/table-engines/mergetree-family/replication.md) などの重複排除エンジンと互換性がありますが欠点があります:同じデータブロックが2回暗号化されると、生成される暗号文はまったく同じになりますので、ディスクを読み取ることができる攻撃者はこの等価性を確認することができます(コンテンツ自体ではないが)。 + +:::note +"\*MergeTree"ファミリーを含むほとんどのエンジンは、コーデックを適用せずにディスク上にインデックスファイルを作成します。これにより、暗号化されたカラムがインデックス化されると、ディスク上にプレーンテキストが現れます。 +::: + +:::note +特定の値を暗号化されたカラムで言及する具体的な値を含むSELECTクエリを実行した場合(例:WHERE句内)、その値が[system.query_log](../../../operations/system-tables/query_log.md) に表示されることがあります。ログの記録を無効にすることが考慮されるかもしれません。 +::: + +**例** + +```sql +CREATE TABLE mytable +( + x String CODEC(AES_128_GCM_SIV) +) +ENGINE = MergeTree ORDER BY x; +``` + +:::note +圧縮を適用する必要がある場合、明示的に指定する必要があります。そうでない場合、データには暗号化のみが適用されます。 +::: + +**例** + +```sql +CREATE TABLE mytable +( + x String Codec(Delta, LZ4, AES_128_GCM_SIV) +) +ENGINE = MergeTree ORDER BY x; +``` + +## 一時テーブル + +:::note +一時テーブルはレプリケートされていないことにご注意ください。したがって、一時テーブルに挿入されたデータが他のレプリカで使用可能である保証はありません。一時テーブルが便利な主な利用ケースは、単一のセッション中に小さな外部データセットをクエリまたは結合する場合です。 +::: + +ClickHouseは次の特徴を持つ一時テーブルをサポートしている: + +- 一時テーブルはセッションが終了したときに消失します。接続が失われた場合も含まれます。 +- エンジンが指定されていない場合、一時テーブルはMemoryテーブルエンジンを使用し、`Replicated`と`KeeperMap`エンジンを除く任意のテーブルエンジンを使用できます。 +- 一時テーブルにDBを指定することはできません。データベース外に作成されます。 +- 分散クエリ処理では、Memoryエンジンを使用しているクエリで参照される一時テーブルがリモートサーバーに渡されます。 + +一時テーブルを作成するには、以下の構文を使用します: + +``` sql +CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name +( + name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], + name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], + ... +) [ENGINE = engine] +``` + +ほとんどの場合、一時テーブルは手動で作成されるのではなく、クエリの外部データを使用する場合や、分散した `(GLOBAL) IN` のときに作成されます。詳細については該当するセクションを参照してください + +エンジンに [ENGINE = Memory](../../../engines/table-engines/special/memory.md) を使用するテーブルを一時テーブルの代わりに使用することもできます。 + +## REPLACE TABLE + +'REPLACE' クエリはテーブルを原子的に更新することを可能にします。 + +:::note +このクエリは[Atomic](../../../engines/database-engines/atomic.md)データベースエンジンでのみサポートされています。 +::: + +テーブルからデータを削除する必要がある場合、新しいテーブルを作成して、不要なデータを取得しない `SELECT` ステートメントでそれを埋め、古いテーブルを削除し、新しいものをリネームします: + +```sql +CREATE TABLE myNewTable AS myOldTable; +INSERT INTO myNewTable SELECT * FROM myOldTable WHERE CounterID <12345; +DROP TABLE myOldTable; +RENAME TABLE myNewTable TO myOldTable; +``` + +上記の代わりに以下を使用できます: + +```sql +REPLACE TABLE myOldTable ENGINE = MergeTree() ORDER BY CounterID AS SELECT * FROM myOldTable WHERE CounterID <12345; +``` + +### 構文 + +``` sql +{CREATE [OR REPLACE] | REPLACE} TABLE [db.]table_name +``` + +`CREATE` クエリのすべての構文形式はこのクエリでも機能します。存在しないテーブルに対する `REPLACE` はエラーを引き起こします。 + +### 例 + +次のテーブルを考慮します: + +```sql +CREATE DATABASE base ENGINE = Atomic; +CREATE OR REPLACE TABLE base.t1 (n UInt64, s String) ENGINE = MergeTree ORDER BY n; +INSERT INTO base.t1 VALUES (1, 'test'); +SELECT * FROM base.t1; +``` + +```text +┌─n─┬─s────┐ +│ 1 │ test │ +└───┴──────┘ +``` + +`REPLACE` クエリを使用してすべてのデータをクリア: + +```sql +CREATE OR REPLACE TABLE base.t1 (n UInt64, s Nullable(String)) ENGINE = MergeTree ORDER BY n; +INSERT INTO base.t1 VALUES (2, null); +SELECT * FROM base.t1; +``` + +```text +┌─n─┬─s──┐ +│ 2 │ \N │ +└───┴────┘ +``` + +`REPLACE` クエリを使用してテーブル構造を変更: + +```sql +REPLACE TABLE base.t1 (n UInt64) ENGINE = MergeTree ORDER BY n; +INSERT INTO base.t1 VALUES (3); +SELECT * FROM base.t1; +``` + +```text +┌─n─┐ +│ 3 │ +└───┘ +``` + +## COMMENT 句 + +テーブルを作成するときにコメントを追加することができます。 + +**構文** + +``` sql +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ... +) +ENGINE = engine +COMMENT 'コメント' +``` + +**例** + +クエリ: + +``` sql +CREATE TABLE t1 (x String) ENGINE = Memory COMMENT '一時的なテーブル'; +SELECT name, comment FROM system.tables WHERE name = 't1'; +``` + +結果: + +```text +┌─name─┬─comment─────────────┐ +│ t1 │ 一時的なテーブル │ +└──────┴─────────────────────┘ +``` + +## 関連コンテンツ + +- ブログ: [Optimizing ClickHouse with Schemas and Codecs](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) +- ブログ: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/sql-reference/statements/create/user.md b/docs/ja/sql-reference/statements/create/user.md new file mode 100644 index 00000000000..7827078a1d2 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/user.md @@ -0,0 +1,236 @@ +--- +slug: /ja/sql-reference/statements/create/user +sidebar_position: 39 +sidebar_label: USER +title: "CREATE USER" +--- + +[ユーザーアカウント](../../../guides/sre/user-management/index.md#user-account-management)を作成します。 + +構文: + +``` sql +CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [, name2 [,...]] [ON CLUSTER cluster_name] + [NOT IDENTIFIED | IDENTIFIED {[WITH {plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | WITH NO_PASSWORD | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name' | SAN 'TYPE:subject_alt_name'} | {WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa|...'} | {WITH http SERVER 'server_name' [SCHEME 'Basic']} [VALID UNTIL datetime] + [, {[{plaintext_password | sha256_password | sha256_hash | ...}] BY {'password' | 'hash'}} | {ldap SERVER 'server_name'} | {...} | ... [,...]]] + [HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] + [VALID UNTIL datetime] + [IN access_storage_type] + [DEFAULT ROLE role [,...]] + [DEFAULT DATABASE database | NONE] + [GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...] +``` + +`ON CLUSTER`句はクラスター上でユーザーを作成することを可能にします。[分散DDL](../../../sql-reference/distributed-ddl.md)を参照してください。 + +## 識別 + +ユーザーの識別には複数の方法があります: + +- `IDENTIFIED WITH no_password` +- `IDENTIFIED WITH plaintext_password BY 'qwerty'` +- `IDENTIFIED WITH sha256_password BY 'qwerty'` または `IDENTIFIED BY 'password'` +- `IDENTIFIED WITH sha256_hash BY 'hash'` または `IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'` +- `IDENTIFIED WITH double_sha1_password BY 'qwerty'` +- `IDENTIFIED WITH double_sha1_hash BY 'hash'` +- `IDENTIFIED WITH bcrypt_password BY 'qwerty'` +- `IDENTIFIED WITH bcrypt_hash BY 'hash'` +- `IDENTIFIED WITH ldap SERVER 'server_name'` +- `IDENTIFIED WITH kerberos` または `IDENTIFIED WITH kerberos REALM 'realm'` +- `IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'` +- `IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'` +- `IDENTIFIED WITH http SERVER 'http_server'` または `IDENTIFIED WITH http SERVER 'http_server' SCHEME 'basic'` +- `IDENTIFIED BY 'qwerty'` + +パスワードの複雑さの要件は[config.xml](/docs/ja/operations/configuration-files)で編集することができます。以下は、パスワードに少なくとも12文字を要求し、1つの数字を含む必要がある例です。各パスワードの複雑さルールは、パスワードと一致する正規表現とルールの説明が必要です。 + +```xml + + + + .{12} + 少なくとも12文字である必要があります + + + \p{N} + 少なくとも1つの数字を含む必要があります + + + +``` + +:::note +ClickHouse Cloudでは、デフォルトでパスワードは次の複雑さ要件を満たす必要があります: +- 少なくとも12文字である +- 少なくとも1つの数字を含む +- 少なくとも1つの大文字を含む +- 少なくとも1つの小文字を含む +- 少なくとも1つの特殊文字を含む +::: + +## 例 + +1. 次のユーザー名は`name1`で、パスワードは不要です - これは明らかにセキュリティを提供しません: + + ```sql + CREATE USER name1 NOT IDENTIFIED + ``` + +2. 平文パスワードを指定するには: + + ```sql + CREATE USER name2 IDENTIFIED WITH plaintext_password BY 'my_password' + ``` + + :::tip + パスワードはSQLテキストファイルに`/var/lib/clickhouse/access`に保存されるので、`plaintext_password`を使用するのは良い考えではありません。代わりに次の例で示すように`sha256_password`を試してください... + ::: + +3. 最も一般的なオプションは、SHA-256を使用してハッシュされたパスワードを使用することです。`IDENTIFIED WITH sha256_password`を指定すると、ClickHouseはパスワードをハッシュしてくれます。たとえば: + + ```sql + CREATE USER name3 IDENTIFIED WITH sha256_password BY 'my_password' + ``` + + `name3`ユーザーは今 `my_password`を使ってログインでき、パスワードは上記のハッシュされた値として保存されます。次のSQLファイルが`/var/lib/clickhouse/access`に作成され、サーバー起動時に実行されます: + + ```bash + /var/lib/clickhouse/access $ cat 3843f510-6ebd-a52d-72ac-e021686d8a93.sql + ATTACH USER name3 IDENTIFIED WITH sha256_hash BY '0C268556C1680BEF0640AAC1E7187566704208398DA31F03D18C74F5C5BE5053' SALT '4FB16307F5E10048196966DD7E6876AE53DE6A1D1F625488482C75F14A5097C7'; + ``` + + :::tip + ユーザー名に対して既にハッシュ値と対応するソルト値を作成している場合、`IDENTIFIED WITH sha256_hash BY 'hash'`や`IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'`を使用できます。`sha256_hash`の識別に`SALT`を使用する場合 - ハッシュは'password'と'salt'の結合から計算される必要があります。 + ::: + +4. `double_sha1_password`は通常必要ありませんが、MySQLインターフェースのようにそれを必要とするクライアントで作業する場合に便利です: + + ```sql + CREATE USER name4 IDENTIFIED WITH double_sha1_password BY 'my_password' + ``` + + ClickHouseは次のクエリを生成し実行します: + + ```response + CREATE USER name4 IDENTIFIED WITH double_sha1_hash BY 'CCD3A959D6A004B9C3807B728BC2E55B67E10518' + ``` + +5. `bcrypt_password`はパスワードを保存する最も安全なオプションです。これは、[bcrypt](https://en.wikipedia.org/wiki/Bcrypt)アルゴリズムを使用しており、パスワードハッシュが侵害された場合でもブルートフォース攻撃に対して耐性があります。 + + ```sql + CREATE USER name5 IDENTIFIED WITH bcrypt_password BY 'my_password' + ``` + + この方法ではパスワードの長さは72文字に制限されています。bcryptのワークファクターパラメーターは、ハッシュの計算とパスワードの検証に必要な計算と時間の量を定義しており、サーバー設定で変更できます: + + ```xml + 12 + ``` + + ワークファクターは4から31の間でなければならず、デフォルト値は12です。 + +6. パスワードの種類を省略することもできます: + + ```sql + CREATE USER name6 IDENTIFIED BY 'my_password' + ``` + + この場合、ClickHouseはサーバー設定で指定されたデフォルトのパスワードタイプを使用します: + + ```xml + sha256_password + ``` + + 利用可能なパスワードタイプは、`plaintext_password`、`sha256_password`、`double_sha1_password`です。 + +7. 複数の認証方法を指定できます: + + ```sql + CREATE USER user1 IDENTIFIED WITH plaintext_password by '1', bcrypt_password by '2', plaintext_password by '3'' + ``` + +注意事項: +1. 古いバージョンのClickHouseでは、複数の認証方法の構文がサポートされていない可能性があります。したがって、ClickHouseサーバーにそのようなユーザーが存在し、サポートされていないバージョンにダウングレードされた場合、そのようなユーザーは使用不能になり、一部のユーザー関連操作が壊れる可能性があります。ダウングレードするには、事前にすべてのユーザーを1つの認証方法に設定する必要があります。代替案として、サーバーが適切な手順なしでダウングレードされた場合、問題のあるユーザーを削除する必要があります。 +2. セキュリティ上の理由から、`no_password`は他の認証方法と共存できません。したがって、クエリで認証方法が唯一の場合にのみ`no_password`を指定できます。 + +## ユーザーホスト + +ユーザーホストは、ClickHouseサーバーに接続を確立できるホストです。ホストは`HOST`クエリセクションで次の方法で指定できます: + +- `HOST IP 'ip_address_or_subnetwork'` — 指定されたIPアドレスまたは[サブネットワーク](https://en.wikipedia.org/wiki/Subnetwork)からのみユーザーはClickHouseサーバーに接続できます。例: `HOST IP '192.168.0.0/16'`, `HOST IP '2001:DB8::/32'`。本番環境での使用には、`HOST IP`要素(IPアドレスとそのマスク)のみを指定してください。`host`や`host_regexp`を使用すると余計な遅延が生じる可能性があるためです。 +- `HOST ANY` — ユーザーはどこからでも接続できます。これはデフォルトのオプションです。 +- `HOST LOCAL` — ユーザーはローカルのみ接続できます。 +- `HOST NAME 'fqdn'` — ユーザーホストはFQDNとして指定できます。たとえば、`HOST NAME 'mysite.com'`。 +- `HOST REGEXP 'regexp'` — ユーザーホストを指定する際に[pcre](http://www.pcre.org/)正規表現を使用できます。たとえば、`HOST REGEXP '.*\.mysite\.com'`。 +- `HOST LIKE 'template'` — ユーザーホストをフィルターするために[LIKE](../../../sql-reference/functions/string-search-functions.md#function-like)演算子を使用することができます。たとえば、`HOST LIKE '%'`は`HOST ANY`と同じ意味になります。`HOST LIKE '%.mysite.com'`は`mysite.com`ドメイン内のすべてのホストをフィルタリングします。 + +ホストを指定する別の方法は、ユーザー名の後に`@`構文を使用することです。例: + +- `CREATE USER mira@'127.0.0.1'` — `HOST IP`構文と同等です。 +- `CREATE USER mira@'localhost'` — `HOST LOCAL`構文と同等です。 +- `CREATE USER mira@'192.168.%.%'` — `HOST LIKE`構文と同等です。 + +:::tip +ClickHouseは`user_name@'address'`を一つのユーザー名として扱います。そのため、技術的には、同じ`user_name`と`@`の後の異なる構成を持つ複数のユーザーを作成することができます。しかし、それを行うことはお勧めしません。 +::: + +## VALID UNTIL句 + +認証方法の有効期限と、オプションでその時刻を指定することができます。文字列をパラメータとして受け取ります。日付と時刻には`YYYY-MM-DD [hh:mm:ss] [timezone]`形式を使用することを推奨します。既定では、このパラメータは`'infinity'`に設定されています。 +`VALID UNTIL`句は、クエリで認証方法が指定されている場合に限り指定可能です。認証方法が指定されていない場合、`VALID UNTIL`句は既存のすべての認証方法に適用されます。 + +例: + +- `CREATE USER name1 VALID UNTIL '2025-01-01'` +- `CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 UTC'` +- `CREATE USER name1 VALID UNTIL 'infinity'` +- ```CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 `Asia/Tokyo`'``` +- `CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID UNTIL '2025-01-01''` + +## GRANTEES句 + +このユーザーが持つ[権限](../../../sql-reference/statements/grant.md#privileges)を付与できるユーザーまたはロールを指定します。このユーザーもまた、[GRANT OPTION](../../../sql-reference/statements/grant.md#granting-privilege-syntax)で付与されたすべての必要なアクセスを持っている場合にのみです。`GRANTEES`句のオプション: + +- `user` — このユーザーが権限を付与できるユーザーを指定します。 +- `role` — このユーザーが権限を付与できるロールを指定します。 +- `ANY` — このユーザーは誰にでも権限を付与することができます。これはデフォルト設定です。 +- `NONE` — このユーザーは誰にも権限を付与できません。 + +`EXCEPT`式を使用して、任意のユーザーまたはロールを除外できます。たとえば、`CREATE USER user1 GRANTEES ANY EXCEPT user2`と言えば、`user1`が`GRANT OPTION`付きでいくつかの権限を持っている場合、それらの権限を`user2`を除く誰にでも付与できるという意味です。 + +## 例 + +`qwerty`というパスワードで保護されたユーザーアカウント`mira`を作成します: + +``` sql +CREATE USER mira HOST IP '127.0.0.1' IDENTIFIED WITH sha256_password BY 'qwerty'; +``` + +`mira`はClickHouseサーバーが稼働しているホストでクライアントアプリケーションを起動する必要があります。 + +ユーザーアカウント`john`を作成し、ロールを割り当て、それらをデフォルトにします: + +``` sql +CREATE USER john DEFAULT ROLE role1, role2; +``` + +将来のすべてのロールをデフォルトにするユーザーアカウント`john`を作成します: + +``` sql +CREATE USER john DEFAULT ROLE ALL; +``` + +将来的に`john`にロールが割り当てられると、それが自動的にデフォルトになります。 + +ユーザーアカウント`john`を作成し、`role1`と`role2`を除く将来のすべてのロールをデフォルトにし: + +``` sql +CREATE USER john DEFAULT ROLE ALL EXCEPT role1, role2; +``` + +ユーザーアカウント`john`を作成し、自分の権限を`jack`アカウントを持つユーザーに付与できるようにします: + +``` sql +CREATE USER john GRANTEES jack; +``` diff --git a/docs/ja/sql-reference/statements/create/view.md b/docs/ja/sql-reference/statements/create/view.md new file mode 100644 index 00000000000..8b4365ceeb0 --- /dev/null +++ b/docs/ja/sql-reference/statements/create/view.md @@ -0,0 +1,421 @@ +--- +slug: /ja/sql-reference/statements/create/view +sidebar_position: 37 +sidebar_label: VIEW +--- + +# CREATE VIEW + +新しいビューを作成します。ビューは[通常のビュー](#normal-view)、[Materialized View](#materialized-view)、[リフレッシュ可能なMaterialized View](#refreshable-materialized-view)、および[ウィンドウビュー](#window-view-experimental)(リフレッシュ可能なMaterialized Viewとウィンドウビューはエクスペリメンタル機能です)であることができます。 + +## 通常のビュー + +構文: + +``` sql +CREATE [OR REPLACE] VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster_name] +[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER | NONE }] +AS SELECT ... +[COMMENT 'comment'] +``` + +通常のビューはデータを保存しません。アクセスするたびに他のテーブルからの読み取りを実行します。つまり、通常のビューは保存されたクエリにすぎません。ビューから読み取ると、この保存されたクエリが[FROM](../../../sql-reference/statements/select/from.md)句内のサブクエリとして使用されます。 + +例として、次のビューを作成したとします。 + +``` sql +CREATE VIEW view AS SELECT ... +``` + +そして、クエリを記述しました。 + +``` sql +SELECT a, b, c FROM view +``` + +このクエリは、次のサブクエリを使用するのと完全に同等です。 + +``` sql +SELECT a, b, c FROM (SELECT ...) +``` + +## パラメータ化ビュー + +パラメータ化ビューは通常のビューに似ていますが、すぐには解決されないパラメータを持って作成することができます。これらのビューは、ビューの名前を関数名として、パラメータの値を引数として指定するテーブル関数で使用できます。 + +``` sql +CREATE VIEW view AS SELECT * FROM TABLE WHERE Column1={column1:datatype1} and Column2={column2:datatype2} ... +``` + +上記は、下記のようにパラメータを代入することでテーブル関数として使用できるテーブルのビューを作成します。 + +``` sql +SELECT * FROM view(column1=value1, column2=value2 ...) +``` + +## マテリアライズドビュー + +``` sql +CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster_name] [TO[db.]name] [ENGINE = engine] [POPULATE] +[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER | NONE }] +AS SELECT ... +[COMMENT 'comment'] +``` + +:::tip +[Materialized View](docs/en/guides/developer/cascading-materialized-views.md)を使用するステップバイステップガイドはこちらです。 +::: + +Materialized Viewは、対応する[SELECT](../../../sql-reference/statements/select/index.md)クエリによって変換されたデータを保存します。 + +`TO [db].[table]`なしでMaterialized Viewを作成する場合は、データ格納のためのテーブルエンジン`ENGINE`を指定しなければなりません。 + +`TO [db].[table]`でMaterialized Viewを作成する場合、`POPULATE`を同時に使用することはできません。 + +Materialized Viewは次のように実装されています: `SELECT`で指定されたテーブルにデータを挿入すると、挿入されたデータの一部がこの`SELECT`クエリによって変換され、その結果がビューに挿入されます。 + +:::note +ClickHouseのMaterialized Viewは挿入先テーブルへのデータ挿入時に**カラム名**を使用します。`SELECT`クエリ結果に存在しないカラム名がある場合、たとえカラムが[Nullable](../../data-types/nullable.md)でなくても、ClickHouseはデフォルト値を使用します。Materialized Viewを使用する際には、全てのカラムに別名を付けることが安全なプラクティスとされます。 + +ClickHouseのMaterialized Viewは、主に挿入トリガーのように実装されています。ビュークエリに集約がある場合、それは新しく挿入されたデータバッチにのみ適用されます。ソーステーブルの既存データへの変更(例えば、更新、削除、パーティション削除など)は、Materialized Viewを変更しません。 + +エラー発生時にClickHouseのMaterialized Viewは決定的な振る舞いを持ちません。つまり、すでに書き込まれたブロックは保存されますが、エラー後の全てのブロックは保存されません。 + +デフォルトでは一つのビューへのプッシュが失敗した場合、INSERTクエリも失敗し、いくつかのブロックはデータ格納先テーブルに書き込まれないかもしれません。これは`materialized_views_ignore_errors`設定を使用して変更できます(これは`INSERT`クエリのために設定する必要があります)。`materialized_views_ignore_errors=true`に設定すると、ビューへのプッシュ時の全てのエラーは無視され、全てのブロックはデータ格納先テーブルに書き込まれます。 + +また、デフォルトで`system.*_log`テーブルには`materialized_views_ignore_errors`が`true`に設定されています。 +::: + +`POPULATE`を指定すると、既存のテーブルデータがビュー作成時にビューに挿入されます。それはちょうど`CREATE TABLE ... AS SELECT ...`を実行するようなものです。それ以外の場合、ビューが作成された後にテーブルに挿入されたデータのみをクエリします。ビュー作成中にテーブルに挿入されたデータがビューに挿入されないため、`POPULATE`の使用を**おすすめしません**。 + +:::note +`POPULATE`が`CREATE TABLE ... AS SELECT ...`のように機能することを考えると、いくつかの制限があります: +- レプリケートされたデータベースでのサポートはありません +- ClickHouseクラウドでのサポートはありません + +代わりに個別の`INSERT ... SELECT`を使用できます。 +::: + +`SELECT`クエリには`DISTINCT`、`GROUP BY`、`ORDER BY`、`LIMIT`を含めることができます。但し、対応する変換は挿入されたデータの各ブロックごとに独立して実行されることに注意してください。例えば、`GROUP BY`が設定されている場合、データは挿入中に集約されますが、挿入されたデータのパケット内でのみ適用されます。データはそれ以上集約されません。ただし、独立してデータ集約を行う`SummingMergeTree`のようなエンジンを使用する場合は例外です。 + +[ALTER](/docs/ja/sql-reference/statements/alter/view.md)クエリをMaterialized Viewに対して実行することには限界があります。例えば、`SELECT`クエリを更新することはできませんので、これが不便になる可能性があります。Materialized Viewが`TO [db.]name`の構文を使用している場合、ビューを`DETACH`してからターゲットテーブルに対して`ALTER`を実行し、その後に以前に`DETACH`したビューを`ATTACH`できます。 + +Materialized Viewは[optimize_on_insert](../../../operations/settings/settings.md#optimize-on-insert)設定によって影響を受けます。データはビューへの挿入前にマージされます。 + +ビューは通常のテーブルと同様に見えます。例えば、`SHOW TABLES`クエリの結果にリストされます。 + +ビューを削除するには、[DROP VIEW](../../../sql-reference/statements/drop.md#drop-view)を使用します。ただし、`DROP TABLE`もビューに対して機能します。 + +## SQLセキュリティ {#sql_security} + +`DEFINER`と`SQL SECURITY`により、ビューの基礎となるクエリを実行するときに使用するClickHouseユーザーを指定できます。`SQL SECURITY`には、`DEFINER`、`INVOKER`、`NONE`の3つの合法な値があります。`DEFINER`句には、任意の既存のユーザーまたは`CURRENT_USER`を指定できます。 + +以下の表は、どのユーザーがビューから選択する権限が必要かを説明します。SQLセキュリティオプションに関係なく、ビューから読み取るためには`GRANT SELECT ON `が必要であることに注意してください。 + +| SQLセキュリティオプション | ビュー | マテリアライズドビュー | +|-------------------------|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------| +| `DEFINER alice` | `alice`はビューのソーステーブルに対する`SELECT`権限が必要です。| `alice`はビューのソーステーブルに対する`SELECT`権限とビューのターゲットテーブルに対する`INSERT`権限が必要です。 | +| `INVOKER` | ユーザーはビューのソーステーブルに対する`SELECT`権限が必要です。| Materialized Viewには`SQL SECURITY INVOKER`を指定できません。 | +| `NONE` | - | - | + +:::note +`SQL SECURITY NONE`は廃止予定のオプションです。このオプションでビューを作成する権限を持つユーザーは、任意のクエリを実行することができます。したがって、このオプションでビューを作成するためには、`GRANT ALLOW SQL SECURITY NONE TO `が必要です。 +::: + +`DEFINER`/`SQL SECURITY`が指定されていない場合、デフォルト値が使用されます: +- `SQL SECURITY`: 通常のビューには`INVOKER`、Materialized Viewには`DEFINER`([設定で設定可能](../../../operations/settings/settings.md#default_normal_view_sql_security)) +- `DEFINER`: `CURRENT_USER`([設定で設定可能](../../../operations/settings/settings.md#default_view_definer)) + +`DEFINER`/`SQL SECURITY`が指定されずにビューがアタッチされた場合、Materialized Viewにはデフォルト値として`SQL SECURITY NONE`、通常のビューには`SQL SECURITY INVOKER`が使用されます。 + +既存のビューのSQLセキュリティを変更するには、以下を使用します。 +```sql +ALTER TABLE MODIFY SQL SECURITY { DEFINER | INVOKER | NONE } [DEFINER = { user | CURRENT_USER }] +``` + +### 例 +```sql +CREATE VIEW test_view +DEFINER = alice SQL SECURITY DEFINER +AS SELECT ... +``` + +```sql +CREATE VIEW test_view +SQL SECURITY INVOKER +AS SELECT ... +``` + +## ライブビュー [廃止予定] + +この機能は廃止予定であり、将来的に削除される予定です。 + +利便性のため、古いドキュメントは[こちら](https://pastila.nl/?00f32652/fdf07272a7b54bda7e13b919264e449f.md)にあります。 + +## リフレッシュ可能なMaterialized View [エクスペリメンタル] {#refreshable-materialized-view} + +```sql +CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name +REFRESH EVERY|AFTER interval [OFFSET interval] +RANDOMIZE FOR interval +DEPENDS ON [db.]name [, [db.]name [, ...]] +SETTINGS name = value [, name = value [, ...]] +[APPEND] +[TO[db.]name] [(columns)] [ENGINE = engine] [EMPTY] +AS SELECT ... +[COMMENT 'comment'] +``` + +ここで`interval`は単純な間隔のシーケンスです: + +```sql +number SECOND|MINUTE|HOUR|DAY|WEEK|MONTH|YEAR +``` + +定期的に対応するクエリを実行し、その結果をテーブルに格納します。 + * クエリに`APPEND`が書かれている場合、各リフレッシュでは既存の行を削除せずに行をテーブルに挿入します。通常のINSERT SELECTと同様、挿入はアトミックではありません。 + * それ以外の場合、各リフレッシュはテーブルの以前の内容をアトミックに置き換えます。 + +通常の非リフレッシュ可能なMaterialized Viewとの違い: + * 挿入トリガーがありません。すなわち、SELECTで指定されたテーブルに新しいデータが挿入されても、リフレッシュ可能なMaterialized Viewには自動的にはプッシュされません。定期的なリフレッシュがクエリ全体を実行します。 + * SELECTクエリに制限がありません。テーブル関数(例えば`url()`)、ビュー、UNION、JOINがすべて許可されます。 + +:::note +クエリの`REFRESH ... SETTINGS`部分にある設定はリフレッシュ設定(例: `refresh_retries`)であり、通常の設定(例: `max_threads`)とは異なります。通常の設定は、クエリの終了部分にある`SETTINGS`を使用して指定できます。 +::: + +### リフレッシュスケジュール + +リフレッシュスケジュールの例: +```sql +REFRESH EVERY 1 DAY -- 毎日、午前0時(UTC) +REFRESH EVERY 1 MONTH -- 毎月1日、午前0時に +REFRESH EVERY 1 MONTH OFFSET 5 DAY 2 HOUR -- 毎月6日、午前2時に +REFRESH EVERY 2 WEEK OFFSET 5 DAY 15 HOUR 10 MINUTE -- 2週間ごとに土曜日、午後3:10に +REFRESH EVERY 30 MINUTE -- 00:00、00:30、01:00、01:30、などで +REFRESH AFTER 30 MINUTE -- 前のリフレッシュが完了してから30分後、日付に合わせて調整されません +-- REFRESH AFTER 1 HOUR OFFSET 1 MINUTE -- AFTERではOFFSETは許可されていないため、構文エラー +REFRESH EVERY 1 WEEK 2 DAYS -- 9日ごと、特定の曜日や月に制約なし; + -- 特に、1969-12-29以降の日数が9で割り切れるとき +REFRESH EVERY 5 MONTHS -- 毎5ヶ月、毎年異なる月(12は5で割り切れないため); + -- 特に、1970-01以降の月数が5で割り切れるとき +``` + +`RANDOMIZE FOR`は各リフレッシュの時間をランダムに調整します。例: +```sql +REFRESH EVERY 1 DAY OFFSET 2 HOUR RANDOMIZE FOR 1 HOUR -- 毎日午前1:30から2:30の間のランダムな時間 +``` + +特定のビューについて、同時に一つのみのリフレッシュを実行可能です。例: `REFRESH EVERY 1 MINUTE`のビューがリフレッシュに2分かかる場合、2分ごとにリフレッシュします。その後、10秒でリフレッシュが完了する場合、1分ごとに戻ります。(特に、バックログのすべてをカバーするために10秒ごとにリフレッシュされることはありません - そのようなバックログはありません。) + +さらに、`CREATE`クエリで作成されるとリフレッシュは直ちに開始されますが、`EMPTY`が指定されている場合は最初のリフレッシュはスケジュールに従って行われます。 + +### レプリケートデータベースでの動作 + +リフレッシュ可能なMaterialized Viewが[レプリケートデータベース](../../../engines/database-engines/replicated.md)にある場合、レプリカ同士で調整して、スケジュールされた時間に1つのレプリカのみがリフレッシュを実行するようになります。[ReplicatedMergeTree](../../../engines/table-engines/mergetree-family/replication.md)テーブルエンジンが必要ですので、全てのレプリカがリフレッシュによって生成されたデータを参照できます。 + +`APPEND`モードでは、`SETTINGS全てのレプリカ=1`を使用して調整を無効にできます。これにより、レプリカは互いに独立してリフレッシュを実行します。この場合、ReplicatedMergeTreeは必要ありません。 + +非`APPEND`モードでは、調整されたリフレッシュのみがサポートされています。非調整されたリフレッシュには、`Atomic`データベースと`CREATE ... ON CLUSTER`クエリを使用して、すべてのレプリカでリフレッシュ可能なMaterialized Viewを作成します。 + +調整はKeeperによって行われます。znodeパスは[default_replica_path](../../../operations/server-configuration-parameters/settings.md#default_replica_path)サーバー設定によって決定されます。 + +### 依存関係 {#refresh-dependencies} + +`DEPENDS ON`は異なるテーブルのリフレッシュを同期します。たとえば、次のような2つのリフレッシュ可能なMaterialized Viewのチェーンがあるとします: +```sql +CREATE MATERIALIZED VIEW source REFRESH EVERY 1 DAY AS SELECT * FROM url(...) +CREATE MATERIALIZED VIEW destination REFRESH EVERY 1 DAY AS SELECT ... FROM source +``` +`DEPENDS ON`なしでは、両方のビューが真夜中にリフレッシュを開始し、`destination`は通常、`source`の昨日のデータを参照します。依存関係を追加すると: +``` +CREATE MATERIALIZED VIEW destination REFRESH EVERY 1 DAY DEPENDS ON source AS SELECT ... FROM source +``` +`destination`のリフレッシュは、`source`の同日のリフレッシュが完了した後にのみ開始されるので、`destination`は新鮮なデータに基づくことになります。 + +または、同じ結果を以下で達成できます: +``` +CREATE MATERIALIZED VIEW destination REFRESH AFTER 1 HOUR DEPENDS ON source AS SELECT ... FROM source +``` +ここでの`1 HOUR`は`source`のリフレッシュ期間より短ければ任意の長さに設定できます。依存するテーブルは、依存するテーブルのリフレッシュ率より頻繁にリフレッシュされることはありません。これは、リフレッシュ可能なビューのチェーンを実際のリフレッシュ期間を指定することなく設定するための有効な方法です。 + +いくつかのさらなる例: + * `REFRESH EVERY 1 DAY OFFSET 10 MINUTE`(`destination`)が`REFRESH EVERY 1 DAY`(`source`)に依存
    + `source`のリフレッシュが10分以上かかる場合、`destination`は待機します。 + * `REFRESH EVERY 1 DAY OFFSET 1 HOUR`が`REFRESH EVERY 1 DAY OFFSET 23 HOUR`に依存
    + 上記と同様に、対応するリフレッシュが異なるカレンダー日に起こるにもかかわらず。 + `destination`のリフレッシュは日X+1の日に始まり、`source`の日Xのリフレッシュを(それが2時間以上かかる場合)待機します。 + * `REFRESH EVERY 2 HOUR`が`REFRESH EVERY 1 HOUR`に依存
    + 2時間ごとのリフレッシュは、一時間ごとのリフレッシュの後に行われます。例えば、真夜中のリフレッシュの後、次に午前2時のリフレッシュの後等。 + * `REFRESH EVERY 1 MINUTE`が`REFRESH EVERY 2 HOUR`に依存
    + `REFRESH AFTER 1 MINUTE`が`REFRESH EVERY 2 HOUR`に依存
    + `REFRESH AFTER 1 MINUTE`が`REFRESH AFTER 2 HOUR`に依存
    + `destination`は`source`の各リフレッシュ後に一度リフレッシュされます。すなわち、2時間ごと。`1 MINUTE`は実質的に無視されます。 + * `REFRESH AFTER 1 HOUR`が`REFRESH AFTER 1 HOUR`に依存
    + 現在、これは推奨されていません。 + +:::note +`DEPENDS ON`はリフレッシュ可能なMaterialized View間でのみ機能します。通常のテーブルを`DEPENDS ON`リストに記載すると、ビューが一切リフレッシュされなくなります(依存関係は`ALTER`で削除できます、下記参照)。 +::: + +### 設定 + +利用可能なリフレッシュ設定: + * `refresh_retries` - リフレッシュクエリが例外を伴って失敗した場合に再試行する回数。すべての再試行に失敗した場合、次のスケジュールされたリフレッシュ時間にスキップします。0は再試行なしを意味し、-1は無限の再試行を意味します。デフォルト: 0。 + * `refresh_retry_initial_backoff_ms` - `refresh_retries`がゼロでない場合、最初の再試行前の遅延。各再試行ごとに遅延が倍増し、`refresh_retry_max_backoff_ms`まで続きます。デフォルト: 100 ms。 + * `refresh_retry_max_backoff_ms` - リフレッシュ試行間の遅延の指数増加の限界。デフォルト: 60000 ms(1分)。 + +### リフレッシュパラメータの変更 {#changing-refresh-parameters} + +リフレッシュパラメータを変更するには: +``` +ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...] +``` + +:::note +これは全リフレッシュパラメータ、スケジュール、依存関係、設定、およびAPPEND性を一度に置き換えます。例: テーブルに`DEPENDS ON`があった場合、`MODIFY REFRESH`を`DEPENDS ON`なしで実行すると依存関係が削除されます。 +::: + +### その他の操作 + +すべてのリフレッシュ可能なMaterialized Viewのステータスは、[`system.view_refreshes`](../../../operations/system-tables/view_refreshes.md)テーブルで利用可能です。具体的には、リフレッシュの進行状況(実行中の場合)、最後と次回のリフレッシュ時間、失敗した場合の例外メッセージが含まれています。 + +リフレッシュを手動で停止、開始、トリガー、またはキャンセルするには、[`SYSTEM STOP|START|REFRESH|CANCEL VIEW`](../system.md#refreshable-materialized-views)を使用します。 + +リフレッシュが完了するのを待つには、[`SYSTEM WAIT VIEW`](../system.md#refreshable-materialized-views)を使用します。特に、リフレッシュ可能なMaterialized Viewを作成した後の初期リフレッシュを待機するのに便利です。 + +:::note +豆知識: リフレッシュされているビューから前のバージョンのデータを読み取ることが許可されています。これで、コンウェイのライフゲームを実装できます: https://pastila.nl/?00021a4b/d6156ff819c83d490ad2dcec05676865#O0LGWTO7maUQIA4AcGUtlA== +::: + +## ウィンドウビュー [エクスペリメンタル] + +:::info +これは将来のリリースで後方互換性がない形で変更される可能性があるエクスペリメンタルな機能です。ウィンドウビューと`WATCH`クエリの使用を許可するには、[allow_experimental_window_view](../../../operations/settings/settings.md#allow-experimental-window-view)設定を使用して`set allow_experimental_window_view = 1`を入力してください。 +::: + +``` sql +CREATE WINDOW VIEW [IF NOT EXISTS] [db.]table_name [TO [db.]table_name] [INNER ENGINE engine] [ENGINE engine] [WATERMARK strategy] [ALLOWED_LATENESS interval_function] [POPULATE] +AS SELECT ... +GROUP BY time_window_function +[COMMENT 'comment'] +``` + +ウィンドウビューはデータを時間ウィンドウ別に集約し、ウィンドウが準備が整ったときに結果を出力できます。中間集計結果を内部 (もしくは指定した) テーブルに保存してレイテンシを削減し、指定されたテーブルへのプッシュや`WATCH`クエリを使用して通知をプッシュすることができます。 + +ウィンドウビューの作成は`MATERIALIZED VIEW`の作成に似ています。ウィンドウビューは中間データを保存するために内部ストレージエンジンを必要とします。内部ストレージは`INNER ENGINE`句を使用して指定できます。ウィンドウビューはデフォルトの内部エンジンとして`AggregatingMergeTree`を使用します。 + +`TO [db].[table]`なしでウィンドウビューを作成する場合、データを保存するテーブルエンジン`ENGINE`を指定しなければなりません。 + +### 時間ウィンドウ関数 + +[時間ウィンドウ関数](../../functions/time-window-functions.md)は、レコードの下限と上限ウィンドウを取得するために使用されます。ウィンドウビューは時間ウィンドウ関数と一緒に使用する必要があります。 + +### タイムアトリビュート + +ウィンドウビューは**処理時間**と**イベント時間**のプロセスをサポートします。 + +**処理時間**は、ウィンドウビューがローカルのマシンの時間に基づいて結果を生成できるようにします。これはデフォルトで使用され、最も基本的な時間概念ですが、決定性を提供しません。処理時間アトリビュートは、時間ウィンドウ関数の`time_attr`をテーブルカラムに設定するか、または関数`now()`を使用して定義できます。次のクエリは処理時間を使用したウィンドウビューを作成します。 + +``` sql +CREATE WINDOW VIEW wv AS SELECT count(number), tumbleStart(w_id) as w_start from date GROUP BY tumble(now(), INTERVAL '5' SECOND) as w_id +``` + +**イベント時間**は、各イベントがその制作装置で発生した時間です。この時間は、通常、レコードが生成されたときにその中に埋め込まれています。イベント時間処理は、順序が乱れたイベントや遅延イベントでも一貫した結果を得ることができます。ウィンドウビューは、`WATERMARK`構文を使用してイベント時間処理をサポートしています。 + +ウィンドウビューは、3つのウォーターマーク戦略を提供します: + +* `STRICTLY_ASCENDING`: これまでに観察された最大のタイムスタンプのウォーターマークを発行します。最大タイムスタンプより小さいタイムスタンプを持つ行は遅れていません。 +* `ASCENDING`: これまでに観察された最大のタイムスタンプから1を引いたウォーターマークを発行します。最大タイムスタンプと等しいか小さいタイムスタンプを持つ行は遅れていません。 +* `BOUNDED`: WATERMARK=INTERVAL。指定された遅延を引いた最大のタイムスタンプのウォーターマークを発行します。 + +以下のクエリは、`WATERMARK`を使用してウィンドウビューを作成する例です: + +``` sql +CREATE WINDOW VIEW wv WATERMARK=STRICTLY_ASCENDING AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND); +CREATE WINDOW VIEW wv WATERMARK=ASCENDING AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND); +CREATE WINDOW VIEW wv WATERMARK=INTERVAL '3' SECOND AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND); +``` + +デフォルトでは、ウォーターマークが到達するとウィンドウが発生しますが、ウォーターマークを過ぎて到着した要素は削除されます。ウィンドウビューは`ALLOWED_LATENESS=INTERVAL`を設定して遅れたイベントの処理をサポートします。遅延処理の例は次のとおりです: + +``` sql +CREATE WINDOW VIEW test.wv TO test.dst WATERMARK=ASCENDING ALLOWED_LATENESS=INTERVAL '2' SECOND AS SELECT count(a) AS count, tumbleEnd(wid) AS w_end FROM test.mt GROUP BY tumble(timestamp, INTERVAL '5' SECOND) AS wid; +``` + +遅延で発行された要素は、以前の計算の更新結果として扱われるべきであることに注意してください。ウィンドウが終了したときではなく、遅延したイベントが到着したときにすぐにウィンドウが発生します。したがって、同じウィンドウに対して複数の出力が生じます。ユーザーはこれらの重複した結果を考慮するか、重複を排除する必要があります。 + +ウィンドウビューで指定された`SELECT`クエリを`ALTER TABLE ... MODIFY QUERY`文を使用して変更できます。ビューをウィンドウビューとともに使用する場合、または`TO [db.]name`句とともに使用する場合、新しい`SELECT`クエリの結果となるデータ構造は元の`SELECT`クエリと同じでなければなりません。現在のウィンドウ内のデータは失われます。これは中間状態を再利用できないためです。 + +### 新しいウィンドウの監視 + +ウィンドウビューは、[WATCH](../../../sql-reference/statements/watch.md)クエリをサポートして変更を監視するか、`TO`構文を使用して結果をテーブルに出力します。 + +``` sql +WATCH [db.]window_view +[EVENTS] +[LIMIT n] +[FORMAT format] +``` + +`WATCH`クエリは`LIVE VIEW`と同様に動作します。`LIMIT`を指定することで、クエリを終了する前に受信する更新の数を設定できます。`EVENTS`句を使用して`WATCH`クエリの短い形式を取得することができ、クエリ結果の代わりに最新のクエリウォーターマークを取得します。 + +### 設定 + +- `window_view_clean_interval`: 古くなったデータを解放するためのウィンドウビューのクリーニング間隔(秒)。システムはシステム時間や`WATERMARK`設定に従って完全にトリガーされていないウィンドウを保持し、他のデータは削除されます。 +- `window_view_heartbeat_interval`: ウォッチクエリがアクティブであることを示す心拍間隔(秒)。 +- `wait_for_window_view_fire_signal_timeout`: イベント時間処理中にウィンドウビューの発火シグナルを待機するタイムアウト。 + +### 例 + +例えば、`data`というログテーブルで10秒ごとにクリックログの数をカウントする必要があるとします。そのテーブル構造は以下の通りです。 + +``` sql +CREATE TABLE data ( `id` UInt64, `timestamp` DateTime) ENGINE = Memory; +``` + +まず、10秒間隔のウィンドウを持つウィンドウビューを作成します。 + +``` sql +CREATE WINDOW VIEW wv as select count(id), tumbleStart(w_id) as window_start from data group by tumble(timestamp, INTERVAL '10' SECOND) as w_id +``` + +次に、`WATCH`クエリを使って結果を取得します。 + +``` sql +WATCH wv +``` + +ログがテーブル`data`に挿入されると、 + +``` sql +INSERT INTO data VALUES(1,now()) +``` + +`WATCH`クエリは次のように結果を表示するはずです。 + +``` text +┌─count(id)─┬────────window_start─┐ +│ 1 │ 2020-01-14 16:56:40 │ +└───────────┴─────────────────────┘ +``` + +または、`TO`構文を使用して出力を別のテーブルに関連付けることができます。 + +``` sql +CREATE WINDOW VIEW wv TO dst AS SELECT count(id), tumbleStart(w_id) as window_start FROM data GROUP BY tumble(timestamp, INTERVAL '10' SECOND) as w_id +``` + +追加の例は、ClickHouseのステートフルテストの中で見つけることができます(それらは`*window_view*`とされています)。 + +### ウィンドウビューの使用 + +ウィンドウビューは以下のシナリオで便利です: + +* **監視**: 時間単位でメトリクスログを集約・計算し、結果をターゲットテーブルに出力します。ダッシュボードはターゲットテーブルをソーステーブルとして使用できます。 +* **分析**: 時間ウィンドウでデータを自動的に集約し、前処理する。この処理は大量のログを分析する際に役立ちます。前処理によって複数のクエリでの反復計算が排除され、クエリの遅延が減少します。 + +## 関連コンテンツ + +- ブログ: [ClickHouseで時系列データを扱う](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) +- ブログ: [ClickHouseを使った観測性ソリューションの構築 - Part 2 - トレース](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) diff --git a/docs/ja/sql-reference/statements/delete.md b/docs/ja/sql-reference/statements/delete.md new file mode 100644 index 00000000000..d98f1efcba3 --- /dev/null +++ b/docs/ja/sql-reference/statements/delete.md @@ -0,0 +1,97 @@ +--- +slug: /ja/sql-reference/statements/delete +sidebar_position: 36 +sidebar_label: DELETE +description: 論理削除は、データベースからデータを削除するプロセスを簡素化します。 +keywords: [delete] +title: 論理 DELETE 文 +--- + +論理削除は、*MergeTree テーブルエンジンファミリ*にのみ利用可能で、式 `expr` に一致する `[db.]table` から行を削除します。 + +``` sql +DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr; +``` + +これは、[ALTER TABLE ... DELETE](/ja/sql-reference/statements/alter/delete) コマンドとの対比で「論理 `削除`」と呼ばれていますが、ALTER コマンドは重いプロセスです。 + +## 例 + +```sql +-- `Title` カラムが `hello` を含む `hits` テーブルからすべての行を削除 +DELETE FROM hits WHERE Title LIKE '%hello%'; +``` + +## 論理削除はデータを即座に削除しない + +論理 `DELETE` は、行を削除済みとしてマークする[ミューテーション](/ja/sql-reference/statements/alter#mutations)として実装されており、物理的に即座に削除されません。 + +デフォルトでは、`DELETE` 文は、行が削除済みとしてマークされるまで待機してから戻ります。データ量が大きい場合、これには長時間かかることがあります。代わりに、設定 [`lightweight_deletes_sync`](/ja/operations/settings/settings#lightweight_deletes_sync) を使用してバックグラウンドで非同期に実行できます。無効にすると、`DELETE` 文は即座に戻りますが、バックグラウンドミューテーションが終了するまでクエリに対してデータが表示され続ける可能性があります。 + +このミューテーションは、削除済みとマークされた行を物理的に削除しません。これは次のマージの際にのみ発生します。その結果、データがストレージから実際に削除されておらず、削除済みとマークされているだけの不特定の期間が存在する可能性があります。 + +予測可能な期間内にストレージからデータが削除されることを保証する必要がある場合、テーブル設定 [`min_age_to_force_merge_seconds`](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings#min_age_to_force_merge_seconds) の使用を検討してください。または、[ALTER TABLE ... DELETE](/ja/sql-reference/statements/alter/delete) コマンドを使用することもできます。`ALTER TABLE ... DELETE` を使用したデータの削除は、すべての影響を受けるパーツを再作成するため、多くのリソースを消費する可能性があることに注意してください。 + +## 大量のデータを削除する + +大量の削除は ClickHouse のパフォーマンスに悪影響を与える可能性があります。テーブルのすべての行を削除しようとしている場合は、[`TRUNCATE TABLE`](/ja/sql-reference/statements/truncate) コマンドの使用を検討してください。 + +頻繁な削除が予想される場合は、[カスタムパーティションキー](/ja/engines/table-engines/mergetree-family/custom-partitioning-key) の使用を検討してください。これによって、[`ALTER TABLE ... DROP PARTITION`](/ja/sql-reference/statements/alter/partition#drop-partitionpart) コマンドを使用して、そのパーティションに関連するすべての行をすばやく削除できます。 + +## 論理削除の制限 + +### プロジェクションを持つ論理 `DELETE` + +デフォルトでは、`DELETE` はプロジェクションを持つテーブルには対応していません。これは、プロジェクション内の行が `DELETE` 操作によって影響される可能性があるためです。しかし、この動作を変更する [MergeTree 設定](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings) `lightweight_mutation_projection_mode` があります。 + +## 論理削除を使用する際のパフォーマンス考慮事項 + +**論理`DELETE`文を使用して大量のデータを削除すると、SELECT クエリのパフォーマンスに悪影響を与える可能性があります。** + +次の点も論理 `DELETE` のパフォーマンスにマイナスの影響を与える可能性があります: + +- `DELETE` クエリで重い `WHERE` 条件がある。 +- ミューテーションキューが他の多くのミューテーションで満たされている場合、テーブルのすべてのミューテーションは順に実行されるため、パフォーマンスの問題につながる可能性があります。 +- 影響を受けたテーブルに非常に多くのデータパーツがある。 +- コンパクトパーツに大量のデータがある場合。コンパクトパーツでは、すべてのカラムが1つのファイルに保存されます。 + +## 削除の権限 + +`DELETE` には `ALTER DELETE` 権限が必要です。指定したユーザーに対して特定のテーブルで `DELETE` 文を有効にするには、次のコマンドを実行します: + +```sql +GRANT ALTER DELETE ON db.table to username; +``` + +## ClickHouse 内部での論理削除の動作 + +1. **影響を受けた行に「マスク」が適用される** + + `DELETE FROM table ...` クエリが実行されると、ClickHouse は各行に “existing” と “deleted” のいずれかでマークされたマスクを保存します。これらの “deleted” 行は、後続のクエリでは省略されます。しかし、行は実際には後続のマージによってのみ削除されます。このマスクの書き込みは、`ALTER TABLE ... DELETE` クエリが行うものよりも軽量です。 + + このマスクは、隠された `_row_exists` システムカラムとして実装され、すべての表示行に対して `True` を、削除された行に対しては `False` を格納します。このカラムは、パーツ内で一部の行が削除された場合にのみ存在します。このカラムは、すべての値が `True` である場合には存在しません。 + +2. **`SELECT` クエリはマスクを組み込むように変換される** + + マスクされたカラムがクエリで使用されると、`SELECT ... FROM table WHERE condition` クエリは内部的に `_row_exists` に対する述語で拡張され、次のように変換されます: + ```sql + SELECT ... FROM table PREWHERE _row_exists WHERE condition + ``` + 実行時に、カラム `_row_exists` が読み取られ、どの行を返さないかが決定されます。大量の削除済行がある場合、ClickHouse は他のカラムを読み取る際にスキップできるグラニュールを特定できます。 + +3. **`DELETE` クエリは `ALTER TABLE ... UPDATE` クエリに変換される** + + `DELETE FROM table WHERE condition` は、`ALTER TABLE table UPDATE _row_exists = 0 WHERE condition` ミューテーションに変換されます。 + + 内部的に、このミューテーションは2段階で実行されます: + + 1. 各個別パーツに対して、パーツが影響を受けているかどうかを判断するために、`SELECT count() FROM table WHERE condition` コマンドが実行されます。 + + 2. 上記のコマンドに基づいて、影響を受けたパーツはミューテートされ、影響を受けていないパーツにはハードリンクが作成されます。ワイドパーツの場合、各行の `_row_exists` カラムが更新され、他のすべてのカラムのファイルはハードリンクされます。コンパクトパーツの場合、すべてのカラムが一つのファイルに一緒に保存されているため、すべてのカラムが再書き込みされます。 + + 上記の手順から、マスキング技術を使用した論理 `DELETE` は、影響を受けたパーツのすべてのカラムファイルを再書き込みしないため、従来の `ALTER TABLE ... DELETE` に比べてパフォーマンスを改善していることがわかります。 + +## 関連コンテンツ + +- ブログ: [Handling Updates and Deletes in ClickHouse](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) + diff --git a/docs/ja/sql-reference/statements/describe-table.md b/docs/ja/sql-reference/statements/describe-table.md new file mode 100644 index 00000000000..806cbf1a91b --- /dev/null +++ b/docs/ja/sql-reference/statements/describe-table.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/statements/describe-table +sidebar_position: 42 +sidebar_label: DESCRIBE TABLE +title: "DESCRIBE TABLE" +--- + +テーブルのカラムに関する情報を返します。 + +**構文** + +``` sql +DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format] +``` + +`DESCRIBE` ステートメントは、各テーブルカラムに対して以下の [String](../../sql-reference/data-types/string.md) 値を持つ行を返します: + +- `name` — カラム名。 +- `type` — カラムの型。 +- `default_type` — カラムの[デフォルト式](../../sql-reference/statements/create/table.md#create-default-values)で使用される句:`DEFAULT`、`MATERIALIZED`、または `ALIAS`。デフォルト式がない場合は空文字列が返されます。 +- `default_expression` — `DEFAULT`句の後に指定された式。 +- `comment` — [カラムコメント](../../sql-reference/statements/alter/column.md#alter_comment-column)。 +- `codec_expression` — カラムに適用された[コーデック](../../sql-reference/statements/create/table.md#codecs)。 +- `ttl_expression` — [有効期限 (TTL)](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl)式。 +- `is_subcolumn` — 内部サブカラムの場合は `1` となるフラグ。[describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) 設定でサブカラムの記述が有効になっている場合のみ結果に含まれます。 + +[ネストされた](../../sql-reference/data-types/nested-data-structures/index.md)データ構造内のすべてのカラムは個別に記述されます。各カラムの名前は親カラム名とドットで接頭辞を付けられます。 + +他のデータ型の内部サブカラムを表示するには、[describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) 設定を使用してください。 + +**例** + +クエリ: + +``` sql +CREATE TABLE describe_example ( + id UInt64, text String DEFAULT 'unknown' CODEC(ZSTD), + user Tuple (name String, age UInt8) +) ENGINE = MergeTree() ORDER BY id; + +DESCRIBE TABLE describe_example; +DESCRIBE TABLE describe_example SETTINGS describe_include_subcolumns=1; +``` + +結果: + +``` text +┌─name─┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ UInt64 │ │ │ │ │ │ +│ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │ +│ user │ Tuple(name String, age UInt8) │ │ │ │ │ │ +└──────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +2番目のクエリはさらにサブカラムを表示します: + +``` text +┌─name──────┬─type──────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┬─is_subcolumn─┐ +│ id │ UInt64 │ │ │ │ │ │ 0 │ +│ text │ String │ DEFAULT │ 'unknown' │ │ ZSTD(1) │ │ 0 │ +│ user │ Tuple(name String, age UInt8) │ │ │ │ │ │ 0 │ +│ user.name │ String │ │ │ │ │ │ 1 │ +│ user.age │ UInt8 │ │ │ │ │ │ 1 │ +└───────────┴───────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┴──────────────┘ +``` + +**関連項目** + +- [describe_include_subcolumns](../../operations/settings/settings.md#describe_include_subcolumns) 設定。 diff --git a/docs/ja/sql-reference/statements/detach.md b/docs/ja/sql-reference/statements/detach.md new file mode 100644 index 00000000000..29b29e3de38 --- /dev/null +++ b/docs/ja/sql-reference/statements/detach.md @@ -0,0 +1,75 @@ +--- +slug: /ja/sql-reference/statements/detach +sidebar_position: 43 +sidebar_label: DETACH +title: "DETACH ステートメント" +--- + +テーブル、Materialized View、Dictionary、データベースの存在をサーバーに「忘れさせる」ためのコマンドです。 + +**構文** + +``` sql +DETACH TABLE|VIEW|DICTIONARY|DATABASE [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] [SYNC] +``` + +DETACHはテーブル、Materialized View、Dictionary、データベースのデータやメタデータを削除しません。エンティティが`PERMANENTLY`でない場合、次回サーバー起動時にサーバーはメタデータを読み取り、再びテーブル/View/Dictionary/データベースを認識します。エンティティが`PERMANENTLY`でDETACHされた場合は自動的に認識されません。 + +テーブル、Dictionary、データベースが恒久的にDETACHされたか否かにかかわらず、[ATTACH](../../sql-reference/statements/attach.md)クエリを使用して再アタッチできます。システムログテーブル(例: `query_log`, `text_log`など)も再アタッチ可能です。他のシステムテーブルは再アタッチできませんが、次回サーバー起動時にサーバーはこれらのテーブルを再認識します。 + +`ATTACH MATERIALIZED VIEW`は短い構文(`SELECT`なし)では動作しませんが、`ATTACH TABLE`クエリを使用してアタッチすることができます。 + +既に一時的にDETACHされたテーブルを恒久的にDETACHすることはできません。ただし、一旦アタッチバックしてから再度恒久的にDETACHすることは可能です。 + +また、DETACHされたテーブルを[DROP](../../sql-reference/statements/drop.md#drop-table)したり、同名のテーブルを[CREATE TABLE](../../sql-reference/statements/create/table.md)で作成したり、[RENAME TABLE](../../sql-reference/statements/rename.md)クエリで他のテーブルに置き換えることはできません。 + +`SYNC`修飾子を使用すると、アクションを遅延なく実行します。 + +**例** + +テーブルを作成する: + +クエリ: + +``` sql +CREATE TABLE test ENGINE = Log AS SELECT * FROM numbers(10); +SELECT * FROM test; +``` + +結果: + +``` text +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ +``` + +テーブルをDETACHする: + +クエリ: + +``` sql +DETACH TABLE test; +SELECT * FROM test; +``` + +結果: + +``` text +Received exception from server (version 21.4.1): +Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Table default.test does not exist. +``` + +**関連情報** + +- [Materialized View](../../sql-reference/statements/create/view.md#materialized) +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/ja/sql-reference/statements/drop.md b/docs/ja/sql-reference/statements/drop.md new file mode 100644 index 00000000000..edab5e0c563 --- /dev/null +++ b/docs/ja/sql-reference/statements/drop.md @@ -0,0 +1,141 @@ +--- +slug: /ja/sql-reference/statements/drop +sidebar_position: 44 +sidebar_label: DROP +--- + +# DROP ステートメント + +既存のエンティティを削除します。`IF EXISTS` 条項が指定されている場合、エンティティが存在しないときにこれらのクエリはエラーを返しません。`SYNC` 修飾子が指定されている場合、エンティティは遅延なく削除されます。 + +## DROP DATABASE + +`db` データベース内のすべてのテーブルを削除し、その後 `db` データベース自体を削除します。 + +構文: + +``` sql +DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] [SYNC] +``` + +## DROP TABLE + +1つ以上のテーブルを削除します。 + +:::tip +テーブルの削除を元に戻すには、[UNDROP TABLE](/docs/ja/sql-reference/statements/undrop.md)を参照してください。 +::: + +構文: + +``` sql +DROP [TEMPORARY] TABLE [IF EXISTS] [IF EMPTY] [db1.]name_1[, [db2.]name_2, ...] [ON CLUSTER cluster] [SYNC] +``` + +制限事項: +- `IF EMPTY` 条項が指定されている場合、サーバーはクエリを受け取ったレプリカ上でのみテーブルの空であることを確認します。 +- 複数のテーブルを一度に削除することは、原子的な操作ではありません。つまり、あるテーブルの削除が失敗した場合、後続のテーブルは削除されません。 + +## DROP DICTIONARY + +Dictionary を削除します。 + +構文: + +``` sql +DROP DICTIONARY [IF EXISTS] [db.]name [SYNC] +``` + +## DROP USER + +ユーザーを削除します。 + +構文: + +``` sql +DROP USER [IF EXISTS] name [,...] [ON CLUSTER cluster_name] [FROM access_storage_type] +``` + +## DROP ROLE + +ロールを削除します。削除されたロールは、それが割り当てられていたすべてのエンティティから取り消されます。 + +構文: + +``` sql +DROP ROLE [IF EXISTS] name [,...] [ON CLUSTER cluster_name] [FROM access_storage_type] +``` + +## DROP ROW POLICY + +行ポリシーを削除します。削除された行ポリシーは、それが割り当てられていたすべてのエンティティから取り消されます。 + +構文: + +``` sql +DROP [ROW] POLICY [IF EXISTS] name [,...] ON [database.]table [,...] [ON CLUSTER cluster_name] [FROM access_storage_type] +``` + +## DROP QUOTA + +クォータを削除します。削除されたクォータは、それが割り当てられていたすべてのエンティティから取り消されます。 + +構文: + +``` sql +DROP QUOTA [IF EXISTS] name [,...] [ON CLUSTER cluster_name] [FROM access_storage_type] +``` + +## DROP SETTINGS PROFILE + +設定プロファイルを削除します。削除された設定プロファイルは、それが割り当てられていたすべてのエンティティから取り消されます。 + +構文: + +``` sql +DROP [SETTINGS] PROFILE [IF EXISTS] name [,...] [ON CLUSTER cluster_name] [FROM access_storage_type] +``` + +## DROP VIEW + +ビューを削除します。ビューは `DROP TABLE` コマンドでも削除できますが、`DROP VIEW` は `[db.]name` がビューであることを確認します。 + +構文: + +``` sql +DROP VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] [SYNC] +``` + +## DROP FUNCTION + +[CREATE FUNCTION](./create/function.md) で作成されたユーザー定義関数を削除します。システム関数は削除できません。 + +**構文** + +``` sql +DROP FUNCTION [IF EXISTS] function_name [on CLUSTER cluster] +``` + +**例** + +``` sql +CREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b; +DROP FUNCTION linear_equation; +``` + +## DROP NAMED COLLECTION + +名前付きコレクションを削除します。 + +**構文** + +``` sql +DROP NAMED COLLECTION [IF EXISTS] name [on CLUSTER cluster] +``` + +**例** + +``` sql +CREATE NAMED COLLECTION foobar AS a = '1', b = '2'; +DROP NAMED COLLECTION foobar; +``` diff --git a/docs/ja/sql-reference/statements/exchange.md b/docs/ja/sql-reference/statements/exchange.md new file mode 100644 index 00000000000..c05907efe73 --- /dev/null +++ b/docs/ja/sql-reference/statements/exchange.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/statements/exchange +sidebar_position: 49 +sidebar_label: EXCHANGE +--- + +# EXCHANGE ステートメント + +2つのテーブルまたはDictionaryの名前をアトミックに交換します。 +この操作は一時的な名前を使用した[RENAME](./rename.md)クエリでも達成できますが、その場合操作はアトミックではありません。 + +:::note +`EXCHANGE`クエリは[Atomic](../../engines/database-engines/atomic.md)データベースエンジンでのみサポートされています。 +::: + +**構文** + +```sql +EXCHANGE TABLES|DICTIONARIES [db0.]name_A AND [db1.]name_B [ON CLUSTER cluster] +``` + +## EXCHANGE TABLES + +2つのテーブルの名前を交換します。 + +**構文** + +```sql +EXCHANGE TABLES [db0.]table_A AND [db1.]table_B [ON CLUSTER cluster] +``` + +## EXCHANGE DICTIONARIES + +2つのDictionaryの名前を交換します。 + +**構文** + +```sql +EXCHANGE DICTIONARIES [db0.]dict_A AND [db1.]dict_B [ON CLUSTER cluster] +``` + +**関連項目** + +- [Dictionary](../../sql-reference/dictionaries/index.md) diff --git a/docs/ja/sql-reference/statements/exists.md b/docs/ja/sql-reference/statements/exists.md new file mode 100644 index 00000000000..f22f76028c6 --- /dev/null +++ b/docs/ja/sql-reference/statements/exists.md @@ -0,0 +1,13 @@ +--- +slug: /ja/sql-reference/statements/exists +sidebar_position: 45 +sidebar_label: EXISTS +--- + +# EXISTS ステートメント + +``` sql +EXISTS [TEMPORARY] [TABLE|DICTIONARY|DATABASE] [db.]name [INTO OUTFILE filename] [FORMAT format] +``` + +このステートメントは `UInt8` 型の単一カラムを返します。指定されたデータベースにテーブルまたはデータベースが存在しない場合は値 `0` が、存在する場合は値 `1` が格納されます。 diff --git a/docs/ja/sql-reference/statements/explain.md b/docs/ja/sql-reference/statements/explain.md new file mode 100644 index 00000000000..2fbc4bcd60f --- /dev/null +++ b/docs/ja/sql-reference/statements/explain.md @@ -0,0 +1,478 @@ +--- +slug: /ja/sql-reference/statements/explain +sidebar_position: 39 +sidebar_label: EXPLAIN +title: "EXPLAIN ステートメント" +--- + +ステートメントの実行計画を表示します。 + +
    + +
    + +構文: + +```sql +EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting = value, ...] + [ + SELECT ... | + tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [TTL ...] + ] + [FORMAT ...] +``` + +例: + +```sql +EXPLAIN SELECT sum(number) FROM numbers(10) UNION ALL SELECT sum(number) FROM numbers(10) ORDER BY sum(number) ASC FORMAT TSV; +``` + +```sql +Union + Expression (Projection) + Expression (Before ORDER BY and SELECT) + Aggregating + Expression (Before GROUP BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) + Expression (Projection) + MergingSorted (Merge sorted streams for ORDER BY) + MergeSorting (Merge sorted blocks for ORDER BY) + PartialSorting (Sort each block for ORDER BY) + Expression (Before ORDER BY and SELECT) + Aggregating + Expression (Before GROUP BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) +``` + +## EXPLAIN タイプ + +- `AST` — 抽象構文木。 +- `SYNTAX` — ASTレベルの最適化後のクエリテキスト。 +- `QUERY TREE` — クエリツリーの最適化後。 +- `PLAN` — クエリ実行計画。 +- `PIPELINE` — クエリ実行パイプライン。 + +### EXPLAIN AST + +クエリASTのダンプ。`SELECT`以外のすべてのクエリタイプをサポート。 + +例: + +```sql +EXPLAIN AST SELECT 1; +``` + +```sql +SelectWithUnionQuery (children 1) + ExpressionList (children 1) + SelectQuery (children 1) + ExpressionList (children 1) + Literal UInt64_1 +``` + +```sql +EXPLAIN AST ALTER TABLE t1 DELETE WHERE date = today(); +``` + +```sql + explain + AlterQuery t1 (children 1) + ExpressionList (children 1) + AlterCommand 27 (children 1) + Function equals (children 1) + ExpressionList (children 2) + Identifier date + Function today (children 1) + ExpressionList +``` + +### EXPLAIN SYNTAX + +構文最適化後のクエリを返します。 + +例: + +```sql +EXPLAIN SYNTAX SELECT * FROM system.numbers AS a, system.numbers AS b, system.numbers AS c; +``` + +```sql +SELECT + `--a.number` AS `a.number`, + `--b.number` AS `b.number`, + number AS `c.number` +FROM +( + SELECT + number AS `--a.number`, + b.number AS `--b.number` + FROM system.numbers AS a + CROSS JOIN system.numbers AS b +) AS `--.s` +CROSS JOIN system.numbers AS c +``` + +### EXPLAIN QUERY TREE + +設定: + +- `run_passes` — クエリツリーパスをすべて実行してからクエリツリーをダンプします。デフォルト: `1`。 +- `dump_passes` — クエリツリーをダンプする前に使用したパス情報をダンプします。デフォルト: `0`。 +- `passes` — 実行するパスの数を指定します。`-1`に設定すると、すべてのパスが実行されます。デフォルト: `-1`。 + +例: +```sql +EXPLAIN QUERY TREE SELECT id, value FROM test_table; +``` + +``` +QUERY id: 0 + PROJECTION COLUMNS + id UInt64 + value String + PROJECTION + LIST id: 1, nodes: 2 + COLUMN id: 2, column_name: id, result_type: UInt64, source_id: 3 + COLUMN id: 4, column_name: value, result_type: String, source_id: 3 + JOIN TREE + TABLE id: 3, table_name: default.test_table +``` + +### EXPLAIN PLAN + +クエリプランステップをダンプします。 + +設定: + +- `header` — ステップの出力ヘッダをプリントします。デフォルト: 0。 +- `description` — ステップの説明をプリントします。デフォルト: 1。 +- `indexes` — 使用されるインデックスと、各インデックスが適用されたときのフィルタリングされたパーツおよびグラニュールの数を表示します。デフォルト: 0。 [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルでサポートされます。 +- `actions` — ステップアクションに関する詳細情報をプリントします。デフォルト: 0。 +- `json` — クエリプランステップを [JSON](../../interfaces/formats.md#json) 形式の行としてプリントします。デフォルト: 0。[TSVRaw](../../interfaces/formats.md#tabseparatedraw) 形式を使用すると不要なエスケープを避けることができます。 + +例: + +```sql +EXPLAIN SELECT sum(number) FROM numbers(10) GROUP BY number % 4; +``` + +```sql +Union + Expression (Projection) + Expression (Before ORDER BY and SELECT) + Aggregating + Expression (Before GROUP BY) + SettingQuotaAndLimits (Set limits and quota after reading from storage) + ReadFromStorage (SystemNumbers) +``` + +:::note +ステップおよびクエリコストの推定はサポートされていません。 +::: + +`json = 1`のとき、クエリプランはJSON形式で表現されます。各ノードは常に `Node Type` と `Plans` というキーを持つDictionaryです。`Node Type`はステップ名を持つ文字列です。`Plans`は子ステップの説明を含む配列です。他のオプションのキーは、ノードタイプと設定に応じて追加されることがあります。 + +例: + +```sql +EXPLAIN json = 1, description = 0 SELECT 1 UNION ALL SELECT 2 FORMAT TSVRaw; +``` + +```json +[ + { + "Plan": { + "Node Type": "Union", + "Plans": [ + { + "Node Type": "Expression", + "Plans": [ + { + "Node Type": "SettingQuotaAndLimits", + "Plans": [ + { + "Node Type": "ReadFromStorage" + } + ] + } + ] + }, + { + "Node Type": "Expression", + "Plans": [ + { + "Node Type": "SettingQuotaAndLimits", + "Plans": [ + { + "Node Type": "ReadFromStorage" + } + ] + } + ] + } + ] + } + } +] +``` + +`description` = 1 の場合、`Description` キーがステップに追加されます: + +```json +{ + "Node Type": "ReadFromStorage", + "Description": "SystemOne" +} +``` + +`header` = 1 の場合、`Header` キーがカラムの配列としてステップに追加されます。 + +例: + +```sql +EXPLAIN json = 1, description = 0, header = 1 SELECT 1, 2 + dummy; +``` + +```json +[ + { + "Plan": { + "Node Type": "Expression", + "Header": [ + { + "Name": "1", + "Type": "UInt8" + }, + { + "Name": "plus(2, dummy)", + "Type": "UInt16" + } + ], + "Plans": [ + { + "Node Type": "SettingQuotaAndLimits", + "Header": [ + { + "Name": "dummy", + "Type": "UInt8" + } + ], + "Plans": [ + { + "Node Type": "ReadFromStorage", + "Header": [ + { + "Name": "dummy", + "Type": "UInt8" + } + ] + } + ] + } + ] + } + } +] +``` + +`indexes` = 1 の場合、`Indexes` キーが追加されます。使用されるインデックスの配列が含まれます。各インデックスは `Type` キー (文字列 `MinMax`、`Partition`、`PrimaryKey`、または `Skip`) とオプションのキーを持つJSONで記述されます: + +- `Name` — インデックス名 (`Skip` インデックスでのみ使用されます)。 +- `Keys` — インデックスに使用されるカラムの配列。 +- `Condition` — 使用される条件。 +- `Description` — インデックスの説明 (`Skip` インデックスでのみ使用されます)。 +- `Parts` — インデックス適用前/後のパーツ数。 +- `Granules` — インデックス適用前/後のグラニュール数。 + +例: + +```json +"Node Type": "ReadFromMergeTree", +"Indexes": [ + { + "Type": "MinMax", + "Keys": ["y"], + "Condition": "(y in [1, +inf))", + "Parts": 5/4, + "Granules": 12/11 + }, + { + "Type": "Partition", + "Keys": ["y", "bitAnd(z, 3)"], + "Condition": "and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +inf)), (bitAnd(z, 3) not in [1, 1])))", + "Parts": 4/3, + "Granules": 11/10 + }, + { + "Type": "PrimaryKey", + "Keys": ["x", "y"], + "Condition": "and((x in [11, +inf)), (y in [1, +inf)))", + "Parts": 3/2, + "Granules": 10/6 + }, + { + "Type": "Skip", + "Name": "t_minmax", + "Description": "minmax GRANULARITY 2", + "Parts": 2/1, + "Granules": 6/2 + }, + { + "Type": "Skip", + "Name": "t_set", + "Description": "set GRANULARITY 2", + "": 1/1, + "Granules": 2/1 + } +] +``` + +`actions` = 1 の場合、追加されるキーはステップのタイプによります。 + +例: + +```sql +EXPLAIN json = 1, actions = 1, description = 0 SELECT 1 FORMAT TSVRaw; +``` + +```json +[ + { + "Plan": { + "Node Type": "Expression", + "Expression": { + "Inputs": [], + "Actions": [ + { + "Node Type": "Column", + "Result Type": "UInt8", + "Result Type": "Column", + "Column": "Const(UInt8)", + "Arguments": [], + "Removed Arguments": [], + "Result": 0 + } + ], + "Outputs": [ + { + "Name": "1", + "Type": "UInt8" + } + ], + "Positions": [0], + "Project Input": true + }, + "Plans": [ + { + "Node Type": "SettingQuotaAndLimits", + "Plans": [ + { + "Node Type": "ReadFromStorage" + } + ] + } + ] + } + } +] +``` + +### EXPLAIN PIPELINE + +設定: + +- `header` — 各出力ポートのヘッダーをプリントします。デフォルト: 0。 +- `graph` — [DOT](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) グラフ記述言語で記述されたグラフをプリントします。デフォルト: 0。 +- `compact` — `graph` 設定が有効な場合にコンパクトモードでグラフをプリントします。デフォルト: 1。 + +例: + +```sql +EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 4; +``` + +```sql +(Union) +(Expression) +ExpressionTransform + (Expression) + ExpressionTransform + (Aggregating) + Resize 2 → 1 + AggregatingTransform × 2 + (Expression) + ExpressionTransform × 2 + (SettingQuotaAndLimits) + (ReadFromStorage) + NumbersRange × 2 0 → 1 +``` +### EXPLAIN ESTIMATE + +クエリを処理する際に、テーブルから読み取る行、マーク、およびパーツの推定数を表示します。[MergeTree](../../engines/table-engines/mergetree-family/mergetree.md#table_engines-mergetree) ファミリーのテーブルで動作します。 + +**例** + +テーブルを作成: + +```sql +CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0; +INSERT INTO ttt SELECT number FROM numbers(128); +OPTIMIZE TABLE ttt; +``` + +クエリ: + +```sql +EXPLAIN ESTIMATE SELECT * FROM ttt; +``` + +結果: + +```text +┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐ +│ default │ ttt │ 1 │ 128 │ 8 │ +└──────────┴───────┴───────┴──────┴───────┘ +``` + +### EXPLAIN TABLE OVERRIDE + +テーブル関数を介してアクセスされるテーブルスキーマに対するテーブルオーバーライドの結果を表示します。また、オーバーライドが何らかの失敗を引き起こす場合に例外をスローして、いくつかの検証を行います。 + +**例** + +リモートMySQLテーブルが以下のようにあるとします: + +```sql +CREATE TABLE db.tbl ( + id INT PRIMARY KEY, + created DATETIME DEFAULT now() +) +``` + +```sql +EXPLAIN TABLE OVERRIDE mysql('127.0.0.1:3306', 'db', 'tbl', 'root', 'clickhouse') +PARTITION BY toYYYYMM(assumeNotNull(created)) +``` + +結果: + +```text +┌─explain─────────────────────────────────────────────────┐ +│ PARTITION BY uses columns: `created` Nullable(DateTime) │ +└─────────────────────────────────────────────────────────┘ +``` + +:::note +検証は完全ではないため、成功したクエリであってもオーバーライドが問題を引き起こさないことを保証するわけではありません。 +::: diff --git a/docs/ja/sql-reference/statements/grant.md b/docs/ja/sql-reference/statements/grant.md new file mode 100644 index 00000000000..1d02bd93a8f --- /dev/null +++ b/docs/ja/sql-reference/statements/grant.md @@ -0,0 +1,603 @@ +--- +slug: /ja/sql-reference/statements/grant +sidebar_position: 38 +sidebar_label: GRANT +--- + +# GRANT ステートメント + +- ClickHouseユーザーアカウントまたはロールに[権限](#privileges)を付与します。 +- ユーザーアカウントにロールを割り当てたり、他のロールに割り当てたりします。 + +権限を取り消すには、[REVOKE](../../sql-reference/statements/revoke.md)ステートメントを使用します。また、[SHOW GRANTS](../../sql-reference/statements/show.md#show-grants)ステートメントを使用して付与された権限を一覧表示することもできます。 + +## 権限の付与構文 + +``` sql +GRANT [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table[*]|db[*].*|*.*|table[*]|*} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +``` + +- `privilege` — 権限の種類。 +- `role` — ClickHouseユーザーロール。 +- `user` — ClickHouseユーザーアカウント。 + +`WITH GRANT OPTION`句は、`user`または`role`に`GRANT`クエリを実行する権限を付与します。ユーザーは自分が持つ範囲とそれ以下の権限を付与することができます。`WITH REPLACE OPTION`句は、指定しない場合、新しい権限で古い権限を`user`または`role`に置換し、付与される権限を追加します。 + +## ロールを割り当てる構文 + +``` sql +GRANT [ON CLUSTER cluster_name] role [,...] TO {user | another_role | CURRENT_USER} [,...] [WITH ADMIN OPTION] [WITH REPLACE OPTION] +``` + +- `role` — ClickHouseユーザーロール。 +- `user` — ClickHouseユーザーアカウント。 + +`WITH ADMIN OPTION`句は、`user`または`role`に[ADMIN OPTION](#admin-option)権限を付与します。`WITH REPLACE OPTION`句は、指定しない場合、新しいロールで古いロールを`user`または`role`に置換し、追加します。 + +## 現在の権限を付与する構文 +``` sql +GRANT CURRENT GRANTS{(privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*}) | ON {db.table|db.*|*.*|table|*}} TO {user | role | CURRENT_USER} [,...] [WITH GRANT OPTION] [WITH REPLACE OPTION] +``` + +- `privilege` — 権限の種類。 +- `role` — ClickHouseユーザーロール。 +- `user` — ClickHouseユーザーアカウント。 + +`CURRENT GRANTS`ステートメントを使用すると、指定した全ての権限をユーザーまたはロールに付与することができます。権限が指定されていない場合、指定されたユーザーまたはロールは`CURRENT_USER`の利用可能なすべての権限を受け取ります。 + +## 使用法 + +`GRANT`を使用するためには、アカウントに`GRANT OPTION`権限が必要です。自分のアカウント権限の範囲内でのみ権限を付与することができます。 + +たとえば、管理者が`john`アカウントに次のクエリで権限を付与したとします: + +``` sql +GRANT SELECT(x,y) ON db.table TO john WITH GRANT OPTION +``` + +これは、`john`が次の操作を行うための許可を受けたことを意味します: + +- `SELECT x,y FROM db.table` +- `SELECT x FROM db.table` +- `SELECT y FROM db.table` + +`john`は`SELECT z FROM db.table`を実行することはできません。また、`SELECT * FROM db.table`も利用できません。このクエリを処理する際、ClickHouseはデータを返さず、`x`や`y`も返されません。唯一の例外はテーブルが`x`と`y`カラムのみを含む場合であり、この場合、ClickHouseはすべてのデータを返します。 + +また、`john`は`GRANT OPTION`権限を持っているため、他のユーザーに対して同じまたは少ない範囲の権限を付与することができます。 + +`system`データベースへのアクセスは常に許可されています(クエリ処理のためにこのデータベースが使用されます)。 + +1つのクエリで複数の権限を複数のアカウントに付与することができます。クエリ`GRANT SELECT, INSERT ON *.* TO john, robin`は、`john`および`robin`アカウントがサーバー上のすべてのデータベースのすべてのテーブルに対して`INSERT`および`SELECT`クエリを実行することを許可します。 + +## ワイルドカード付与 + +権限を指定する際に、テーブルまたはデータベース名の代わりにアスタリスク(`*`)を使用することができます。たとえば、`GRANT SELECT ON db.* TO john`クエリは`john`が`db`データベース内のすべてのテーブルに対して`SELECT`クエリを実行できるようにします。また、データベース名を省略することもできます。この場合、現在のデータベースに対して権限が付与されます。例えば、`GRANT SELECT ON * TO john`は現在のデータベース内のすべてのテーブルに対する権限を付与し、`GRANT SELECT ON mytable TO john`は現在のデータベース内の`mytable`テーブルに対する権限を付与します。 + +:::note +以下で説明する機能はClickHouseのバージョン24.10から利用可能です。 +::: + +テーブルまたはデータベース名の末尾にアスタリスクを付けることもできます。この機能により、テーブルのパスの抽象的なプレフィックスに対して権限を付与することができます。例:`GRANT SELECT ON db.my_tables* TO john`。このクエリは、`db`データベースのすべての`my_tables`プレフィックスを持つテーブルに対して`john`が`SELECT`クエリを実行できるようにします。 + +もっと例を挙げると: + +`GRANT SELECT ON db.my_tables* TO john` +```sql +SELECT * FROM db.my_tables -- granted +SELECT * FROM db.my_tables_0 -- granted +SELECT * FROM db.my_tables_1 -- granted + +SELECT * FROM db.other_table -- not_granted +SELECT * FROM db2.my_tables -- not_granted +``` + +`GRANT SELECT ON db*.* TO john` +```sql +SELECT * FROM db.my_tables -- granted +SELECT * FROM db.my_tables_0 -- granted +SELECT * FROM db.my_tables_1 -- granted +SELECT * FROM db.other_table -- granted +SELECT * FROM db2.my_tables -- granted +``` + +付与されたパス内の新しく作成されたテーブルはすべて、親からすべての権限を自動的に継承します。たとえば、`GRANT SELECT ON db.* TO john`クエリを実行し、その後新しいテーブル`db.new_table`を作成した場合、ユーザー`john`は`SELECT * FROM db.new_table`クエリを実行することができます。 + +プレフィックスのみに対してアスタリスクを指定できます: +```sql +GRANT SELECT ON db.* TO john -- correct +GRANT SELECT ON db*.* TO john -- correct + +GRANT SELECT ON *.my_table TO john -- wrong +GRANT SELECT ON foo*bar TO john -- wrong +GRANT SELECT ON *suffix TO john -- wrong +GRANT SELECT(foo) ON db.table* TO john -- wrong +``` + +## 権限 + +権限とは、特定の種類のクエリを実行する許可です。 + +権限には階層的構造があります。許可されたクエリのセットは権限のスコープに依存します。 + +権限の階層: + +- [SELECT](#select) +- [INSERT](#insert) +- [ALTER](#alter) + - `ALTER TABLE` + - `ALTER UPDATE` + - `ALTER DELETE` + - `ALTER COLUMN` + - `ALTER ADD COLUMN` + - `ALTER DROP COLUMN` + - `ALTER MODIFY COLUMN` + - `ALTER COMMENT COLUMN` + - `ALTER CLEAR COLUMN` + - `ALTER RENAME COLUMN` + - `ALTER INDEX` + - `ALTER ORDER BY` + - `ALTER SAMPLE BY` + - `ALTER ADD INDEX` + - `ALTER DROP INDEX` + - `ALTER MATERIALIZE INDEX` + - `ALTER CLEAR INDEX` + - `ALTER CONSTRAINT` + - `ALTER ADD CONSTRAINT` + - `ALTER DROP CONSTRAINT` + - `ALTER TTL` + - `ALTER MATERIALIZE TTL` + - `ALTER SETTINGS` + - `ALTER MOVE PARTITION` + - `ALTER FETCH PARTITION` + - `ALTER FREEZE PARTITION` + - `ALTER VIEW` + - `ALTER VIEW REFRESH` + - `ALTER VIEW MODIFY QUERY` + - `ALTER VIEW MODIFY SQL SECURITY` +- [CREATE](#create) + - `CREATE DATABASE` + - `CREATE TABLE` + - `CREATE ARBITRARY TEMPORARY TABLE` + - `CREATE TEMPORARY TABLE` + - `CREATE VIEW` + - `CREATE DICTIONARY` + - `CREATE FUNCTION` +- [DROP](#drop) + - `DROP DATABASE` + - `DROP TABLE` + - `DROP VIEW` + - `DROP DICTIONARY` + - `DROP FUNCTION` +- [TRUNCATE](#truncate) +- [OPTIMIZE](#optimize) +- [SHOW](#show) + - `SHOW DATABASES` + - `SHOW TABLES` + - `SHOW COLUMNS` + - `SHOW DICTIONARIES` +- [KILL QUERY](#kill-query) +- [ACCESS MANAGEMENT](#access-management) + - `CREATE USER` + - `ALTER USER` + - `DROP USER` + - `CREATE ROLE` + - `ALTER ROLE` + - `DROP ROLE` + - `CREATE ROW POLICY` + - `ALTER ROW POLICY` + - `DROP ROW POLICY` + - `CREATE QUOTA` + - `ALTER QUOTA` + - `DROP QUOTA` + - `CREATE SETTINGS PROFILE` + - `ALTER SETTINGS PROFILE` + - `DROP SETTINGS PROFILE` + - `SHOW ACCESS` + - `SHOW_USERS` + - `SHOW_ROLES` + - `SHOW_ROW_POLICIES` + - `SHOW_QUOTAS` + - `SHOW_SETTINGS_PROFILES` + - `ROLE ADMIN` +- [SYSTEM](#system) + - `SYSTEM SHUTDOWN` + - `SYSTEM DROP CACHE` + - `SYSTEM DROP DNS CACHE` + - `SYSTEM DROP MARK CACHE` + - `SYSTEM DROP UNCOMPRESSED CACHE` + - `SYSTEM RELOAD` + - `SYSTEM RELOAD CONFIG` + - `SYSTEM RELOAD DICTIONARY` + - `SYSTEM RELOAD EMBEDDED DICTIONARIES` + - `SYSTEM RELOAD FUNCTION` + - `SYSTEM RELOAD FUNCTIONS` + - `SYSTEM MERGES` + - `SYSTEM TTL MERGES` + - `SYSTEM FETCHES` + - `SYSTEM MOVES` + - `SYSTEM SENDS` + - `SYSTEM DISTRIBUTED SENDS` + - `SYSTEM REPLICATED SENDS` + - `SYSTEM REPLICATION QUEUES` + - `SYSTEM SYNC REPLICA` + - `SYSTEM RESTART REPLICA` + - `SYSTEM FLUSH` + - `SYSTEM FLUSH DISTRIBUTED` + - `SYSTEM FLUSH LOGS` + - `CLUSTER`(`access_control_improvements.on_cluster_queries_require_cluster_grant`構成指令も参照) +- [INTROSPECTION](#introspection) + - `addressToLine` + - `addressToLineWithInlines` + - `addressToSymbol` + - `demangle` +- [SOURCES](#sources) + - `AZURE` + - `FILE` + - `HDFS` + - `HIVE` + - `JDBC` + - `KAFKA` + - `MONGO` + - `MYSQL` + - `NATS` + - `ODBC` + - `POSTGRES` + - `RABBITMQ` + - `REDIS` + - `REMOTE` + - `S3` + - `SQLITE` + - `URL` +- [dictGet](#dictget) +- [displaySecretsInShowAndSelect](#displaysecretsinshowandselect) +- [NAMED COLLECTION ADMIN](#named-collection-admin) + - `CREATE NAMED COLLECTION` + - `DROP NAMED COLLECTION` + - `ALTER NAMED COLLECTION` + - `SHOW NAMED COLLECTIONS` + - `SHOW NAMED COLLECTIONS SECRETS` + - `NAMED COLLECTION` +- [TABLE ENGINE](#table-engine) + +この階層がどのように扱われるかの例: + +- `ALTER`権限は他のすべての`ALTER*`権限を含みます。 +- `ALTER CONSTRAINT`には、`ALTER ADD CONSTRAINT`および`ALTER DROP CONSTRAINT`権限が含まれます。 + +権限は異なるレベルで適用されます。レベルを知ることは、権限のために利用可能な構文を示唆します。 + +レベル(低い順から高い順): + +- `COLUMN` — カラム、テーブル、データベース、またはグローバルに権限を付与できます。 +- `TABLE` — テーブル、データベース、またはグローバルに権限を付与できます。 +- `VIEW` — ビュー、データベース、またはグローバルに権限を付与できます。 +- `DICTIONARY` — Dictionary、データベース、またはグローバルに権限を付与できます。 +- `DATABASE` — データベースまたはグローバルに権限を付与できます。 +- `GLOBAL` — グローバルにのみ権限を付与できます。 +- `GROUP` — 異なるレベルの権限をグループ化します。`GROUP`レベルの権限が付与されると、使用された構文に対応するグループからの権限のみが付与されます。 + +許可される構文の例: + +- `GRANT SELECT(x) ON db.table TO user` +- `GRANT SELECT ON db.* TO user` + +許可されない構文の例: + +- `GRANT CREATE USER(x) ON db.table TO user` +- `GRANT CREATE USER ON db.* TO user` + +特別な権限[ALL](#all)は、全ての権限をユーザーアカウントまたはロールに付与します。 + +デフォルトでは、ユーザーアカウントまたはロールには権限がありません。 + +ユーザーまたはロールが権限を持たない場合、[NONE](#none)権限として表示されます。 + +いくつかのクエリはその実装上、権限のセットを必要とします。たとえば、[RENAME](../../sql-reference/statements/optimize.md)クエリを実行するには、`SELECT`、`CREATE TABLE`、`INSERT`、および`DROP TABLE`権限が必要です。 + +### SELECT + +[SELECT](../../sql-reference/statements/select/index.md)クエリの実行を許可します。 + +権限レベル:`COLUMN`。 + +**説明** + +この権限を持つユーザーは、指定されたテーブルおよびデータベース内の指定されたカラムのデータに対して`SELECT`クエリを実行できます。ユーザーが指定されていないカラムを含めると、クエリはデータを返しません。 + +以下の権限を考慮してください: + +``` sql +GRANT SELECT(x,y) ON db.table TO john +``` + +この権限は、`john`が`db.table`の`x`および/または`y`カラムに関するデータを含む任意の`SELECT`クエリを実行できるようにします。たとえば、`SELECT x FROM db.table`。`john`は`SELECT z FROM db.table`を実行することはできません。`SELECT * FROM db.table`も利用できません。このクエリを処理する際、ClickHouseはデータを返さず、`x`や`y`も返されません。唯一の例外はテーブルが`x`と`y`カラムのみを含む場合であり、この場合、ClickHouseはすべてのデータを返します。 + +### INSERT + +[INSERT](../../sql-reference/statements/insert-into.md)クエリの実行を許可します。 + +権限レベル:`COLUMN`。 + +**説明** + +この権限を持つユーザーは、指定されたテーブルおよびデータベースの指定されたカラムに対して`INSERT`クエリを実行できます。ユーザーが指定されていないカラムを含めると、クエリはデータを挿入しません。 + +**例** + +``` sql +GRANT INSERT(x,y) ON db.table TO john +``` + +付与された権限は、`john`が`db.table`の`x`および/または`y`カラムにデータを挿入できるようにします。 + +### ALTER + +[ALTER](../../sql-reference/statements/alter/index.md)クエリの実行を、以下の権限の階層に従って許可します: + +- `ALTER`. レベル: `COLUMN`. + - `ALTER TABLE`. レベル: `GROUP` + - `ALTER UPDATE`. レベル: `COLUMN`. 別名: `UPDATE` + - `ALTER DELETE`. レベル: `COLUMN`. 別名: `DELETE` + - `ALTER COLUMN`. レベル: `GROUP` + - `ALTER ADD COLUMN`. レベル: `COLUMN`. 別名: `ADD COLUMN` + - `ALTER DROP COLUMN`. レベル: `COLUMN`. 別名: `DROP COLUMN` + - `ALTER MODIFY COLUMN`. レベル: `COLUMN`. 別名: `MODIFY COLUMN` + - `ALTER COMMENT COLUMN`. レベル: `COLUMN`. 別名: `COMMENT COLUMN` + - `ALTER CLEAR COLUMN`. レベル: `COLUMN`. 別名: `CLEAR COLUMN` + - `ALTER RENAME COLUMN`. レベル: `COLUMN`. 別名: `RENAME COLUMN` + - `ALTER INDEX`. レベル: `GROUP`. 別名: `INDEX` + - `ALTER ORDER BY`. レベル: `TABLE`. 別名: `ALTER MODIFY ORDER BY`, `MODIFY ORDER BY` + - `ALTER SAMPLE BY`. レベル: `TABLE`. 別名: `ALTER MODIFY SAMPLE BY`, `MODIFY SAMPLE BY` + - `ALTER ADD INDEX`. レベル: `TABLE`. 別名: `ADD INDEX` + - `ALTER DROP INDEX`. レベル: `TABLE`. 別名: `DROP INDEX` + - `ALTER MATERIALIZE INDEX`. レベル: `TABLE`. 別名: `MATERIALIZE INDEX` + - `ALTER CLEAR INDEX`. レベル: `TABLE`. 別名: `CLEAR INDEX` + - `ALTER CONSTRAINT`. レベル: `GROUP`. 別名: `CONSTRAINT` + - `ALTER ADD CONSTRAINT`. レベル: `TABLE`. 別名: `ADD CONSTRAINT` + - `ALTER DROP CONSTRAINT`. レベル: `TABLE`. 別名: `DROP CONSTRAINT` + - `ALTER TTL`. レベル: `TABLE`. 別名: `ALTER MODIFY TTL`, `MODIFY TTL` + - `ALTER MATERIALIZE TTL`. レベル: `TABLE`. 別名: `MATERIALIZE TTL` + - `ALTER SETTINGS`. レベル: `TABLE`. 別名: `ALTER SETTING`, `ALTER MODIFY SETTING`, `MODIFY SETTING` + - `ALTER MOVE PARTITION`. レベル: `TABLE`. 別名: `ALTER MOVE PART`, `MOVE PARTITION`, `MOVE PART` + - `ALTER FETCH PARTITION`. レベル: `TABLE`. 別名: `ALTER FETCH PART`, `FETCH PARTITION`, `FETCH PART` + - `ALTER FREEZE PARTITION`. レベル: `TABLE`. 別名: `FREEZE PARTITION` + - `ALTER VIEW` レベル: `GROUP` + - `ALTER VIEW REFRESH`. レベル: `VIEW`. 別名: `ALTER LIVE VIEW REFRESH`, `REFRESH VIEW` + - `ALTER VIEW MODIFY QUERY`. レベル: `VIEW`. 別名: `ALTER TABLE MODIFY QUERY` + - `ALTER VIEW MODIFY SQL SECURITY`. レベル: `VIEW`. 別名: `ALTER TABLE MODIFY SQL SECURITY` + +この階層がどのように扱われるかの例: + +- `ALTER`権限は他のすべての`ALTER*`権限を含みます。 +- `ALTER CONSTRAINT`には`ALTER ADD CONSTRAINT`および`ALTER DROP CONSTRAINT`権限が含まれます。 + +**注意事項** + +- `MODIFY SETTING`権限はテーブルエンジン設定の変更を許可します。設定またはサーバー構成パラメータには影響しません。 +- `ATTACH`操作には[CREATE](#create)権限が必要です。 +- `DETACH`操作には[DROP](#drop)権限が必要です。 +- [KILL MUTATION](../../sql-reference/statements/kill.md#kill-mutation)クエリでミューテーションを停止するには、このミューテーションを開始する権限が必要です。例えば、`ALTER UPDATE`クエリを停止する場合、`ALTER UPDATE`、`ALTER TABLE`、または`ALTER`権限が必要です。 + +### CREATE + +[CREATE](../../sql-reference/statements/create/index.md)および[ATTACH](../../sql-reference/statements/attach.md)DDLクエリの実行を以下の権限の階層に従って許可します: + +- `CREATE`. レベル: `GROUP` + - `CREATE DATABASE`. レベル: `DATABASE` + - `CREATE TABLE`. レベル: `TABLE` + - `CREATE ARBITRARY TEMPORARY TABLE`. レベル: `GLOBAL` + - `CREATE TEMPORARY TABLE`. レベル: `GLOBAL` + - `CREATE VIEW`. レベル: `VIEW` + - `CREATE DICTIONARY`. レベル: `DICTIONARY` + +**注意事項** + +- 作成したテーブルを削除するには、ユーザーは[DROP](#drop)権限が必要です。 + +### DROP + +[DROP](../../sql-reference/statements/drop.md)および[DETACH](../../sql-reference/statements/detach.md)クエリの実行を以下の権限の階層に従って許可します: + +- `DROP`. レベル: `GROUP` + - `DROP DATABASE`. レベル: `DATABASE` + - `DROP TABLE`. レベル: `TABLE` + - `DROP VIEW`. レベル: `VIEW` + - `DROP DICTIONARY`. レベル: `DICTIONARY` + +### TRUNCATE + +[TRUNCATE](../../sql-reference/statements/truncate.md)クエリの実行を許可します。 + +権限レベル: `TABLE`. + +### OPTIMIZE + +[OPTIMIZE TABLE](../../sql-reference/statements/optimize.md)クエリの実行を許可します。 + +権限レベル: `TABLE`. + +### SHOW + +`SHOW`、`DESCRIBE`、`USE`および`EXISTS`クエリの実行を以下の権限の階層に従って許可します: + +- `SHOW`. レベル: `GROUP` + - `SHOW DATABASES`. レベル: `DATABASE`. `SHOW DATABASES`、`SHOW CREATE DATABASE`、`USE `クエリを実行可能にします。 + - `SHOW TABLES`. レベル: `TABLE`. `SHOW TABLES`、`EXISTS `、`CHECK
    `クエリを実行可能にします。 + - `SHOW COLUMNS`. レベル: `COLUMN`. `SHOW CREATE TABLE`、`DESCRIBE`クエリを実行可能にします。 + - `SHOW DICTIONARIES`. レベル: `DICTIONARY`. `SHOW DICTIONARIES`、`SHOW CREATE DICTIONARY`、`EXISTS `クエリを実行可能にします。 + +**注意事項** + +ユーザーは指定されたテーブル、Dictionary、データベースに関する他の権限を持っている場合、`SHOW`権限を持っています。 + +### KILL QUERY + +[KILL](../../sql-reference/statements/kill.md#kill-query)クエリの実行を以下の権限の階層に従って許可します: + +権限レベル: `GLOBAL`. + +**注意事項** + +`KILL QUERY`権限は、あるユーザーが他のユーザーのクエリを停止することを許可します。 + +### ACCESS MANAGEMENT + +ユーザーがユーザー、ロール、および行ポリシーを管理するクエリを実行することを許可します。 + +- `ACCESS MANAGEMENT`. レベル: `GROUP` + - `CREATE USER`. レベル: `GLOBAL` + - `ALTER USER`. レベル: `GLOBAL` + - `DROP USER`. レベル: `GLOBAL` + - `CREATE ROLE`. レベル: `GLOBAL` + - `ALTER ROLE`. レベル: `GLOBAL` + - `DROP ROLE`. レベル: `GLOBAL` + - `ROLE ADMIN`. レベル: `GLOBAL` + - `CREATE ROW POLICY`. レベル: `GLOBAL`. 別名: `CREATE POLICY` + - `ALTER ROW POLICY`. レベル: `GLOBAL`. 別名: `ALTER POLICY` + - `DROP ROW POLICY`. レベル: `GLOBAL`. 別名: `DROP POLICY` + - `CREATE QUOTA`. レベル: `GLOBAL` + - `ALTER QUOTA`. レベル: `GLOBAL` + - `DROP QUOTA`. レベル: `GLOBAL` + - `CREATE SETTINGS PROFILE`. レベル: `GLOBAL`. 別名: `CREATE PROFILE` + - `ALTER SETTINGS PROFILE`. レベル: `GLOBAL`. 別名: `ALTER PROFILE` + - `DROP SETTINGS PROFILE`. レベル: `GLOBAL`. 別名: `DROP PROFILE` + - `SHOW ACCESS`. レベル: `GROUP` + - `SHOW_USERS`. レベル: `GLOBAL`. 別名: `SHOW CREATE USER` + - `SHOW_ROLES`. レベル: `GLOBAL`. 別名: `SHOW CREATE ROLE` + - `SHOW_ROW_POLICIES`. レベル: `GLOBAL`. 別名: `SHOW POLICIES`, `SHOW CREATE ROW POLICY`, `SHOW CREATE POLICY` + - `SHOW_QUOTAS`. レベル: `GLOBAL`. 別名: `SHOW CREATE QUOTA` + - `SHOW_SETTINGS_PROFILES`. レベル: `GLOBAL`. 別名: `SHOW PROFILES`, `SHOW CREATE SETTINGS PROFILE`, `SHOW CREATE PROFILE` + - `ALLOW SQL SECURITY NONE`. レベル: `GLOBAL`. 別名: `CREATE SQL SECURITY NONE`, `SQL SECURITY NONE`, `SECURITY NONE` + +`ROLE ADMIN`権限は、ユーザーが他のユーザーに、ユーザーに付与されていない管理オプションを含むすべてのロールを割り当ておよび取り消すことを許可します。 + +### SYSTEM + +ユーザーが[SYSTEM](../../sql-reference/statements/system.md)クエリを次の権限の階層に従って実行できるようにします。 + +- `SYSTEM`. レベル: `GROUP` + - `SYSTEM SHUTDOWN`. レベル: `GLOBAL`. 別名: `SYSTEM KILL`, `SHUTDOWN` + - `SYSTEM DROP CACHE`. 別名: `DROP CACHE` + - `SYSTEM DROP DNS CACHE`. レベル: `GLOBAL`. 別名: `SYSTEM DROP DNS`, `DROP DNS CACHE`, `DROP DNS` + - `SYSTEM DROP MARK CACHE`. レベル: `GLOBAL`. 別名: `SYSTEM DROP MARK`, `DROP MARK CACHE`, `DROP MARKS` + - `SYSTEM DROP UNCOMPRESSED CACHE`. レベル: `GLOBAL`. 別名: `SYSTEM DROP UNCOMPRESSED`, `DROP UNCOMPRESSED CACHE`, `DROP UNCOMPRESSED` + - `SYSTEM RELOAD`. レベル: `GROUP` + - `SYSTEM RELOAD CONFIG`. レベル: `GLOBAL`. 別名: `RELOAD CONFIG` + - `SYSTEM RELOAD DICTIONARY`. レベル: `GLOBAL`. 別名: `SYSTEM RELOAD DICTIONARIES`, `RELOAD DICTIONARY`, `RELOAD DICTIONARIES` + - `SYSTEM RELOAD EMBEDDED DICTIONARIES`. レベル: `GLOBAL`. 別名: `RELOAD EMBEDDED DICTIONARIES` + - `SYSTEM MERGES`. レベル: `TABLE`. 別名: `SYSTEM STOP MERGES`, `SYSTEM START MERGES`, `STOP MERGES`, `START MERGES` + - `SYSTEM TTL MERGES`. レベル: `TABLE`. 別名: `SYSTEM STOP TTL MERGES`, `SYSTEM START TTL MERGES`, `STOP TTL MERGES`, `START TTL MERGES` + - `SYSTEM FETCHES`. レベル: `TABLE`. 別名: `SYSTEM STOP FETCHES`, `SYSTEM START FETCHES`, `STOP FETCHES`, `START FETCHES` + - `SYSTEM MOVES`. レベル: `TABLE`. 別名: `SYSTEM STOP MOVES`, `SYSTEM START MOVES`, `STOP MOVES`, `START MOVES` + - `SYSTEM SENDS`. レベル: `GROUP`. 別名: `SYSTEM STOP SENDS`, `SYSTEM START SENDS`, `STOP SENDS`, `START SENDS` + - `SYSTEM DISTRIBUTED SENDS`. レベル: `TABLE`. 別名: `SYSTEM STOP DISTRIBUTED SENDS`, `SYSTEM START DISTRIBUTED SENDS`, `STOP DISTRIBUTED SENDS`, `START DISTRIBUTED SENDS` + - `SYSTEM REPLICATED SENDS`. レベル: `TABLE`. 別名: `SYSTEM STOP REPLICATED SENDS`, `SYSTEM START REPLICATED SENDS`, `STOP REPLICATED SENDS`, `START REPLICATED SENDS` + - `SYSTEM REPLICATION QUEUES`. レベル: `TABLE`. 別名: `SYSTEM STOP REPLICATION QUEUES`, `SYSTEM START REPLICATION QUEUES`, `STOP REPLICATION QUEUES`, `START REPLICATION QUEUES` + - `SYSTEM SYNC REPLICA`. レベル: `TABLE`. 別名: `SYNC REPLICA` + - `SYSTEM RESTART REPLICA`. レベル: `TABLE`. 別名: `RESTART REPLICA` + - `SYSTEM FLUSH`. レベル: `GROUP` + - `SYSTEM FLUSH DISTRIBUTED`. レベル: `TABLE`. 別名: `FLUSH DISTRIBUTED` + - `SYSTEM FLUSH LOGS`. レベル: `GLOBAL`. 別名: `FLUSH LOGS` + +`SYSTEM RELOAD EMBEDDED DICTIONARIES`権限は、`SYSTEM RELOAD DICTIONARY ON *.*`権限で暗黙的に付与されます。 + +### INTROSPECTION + +[introspection](../../operations/optimizing-performance/sampling-query-profiler.md)関数の使用を許可します。 + +- `INTROSPECTION`. レベル: `GROUP`. 別名: `INTROSPECTION FUNCTIONS` + - `addressToLine`. レベル: `GLOBAL` + - `addressToLineWithInlines`. レベル: `GLOBAL` + - `addressToSymbol`. レベル: `GLOBAL` + - `demangle`. レベル: `GLOBAL` + +### SOURCES + +外部データソースの使用を許可します。[テーブルエンジン](../../engines/table-engines/index.md)および[テーブル関数](../../sql-reference/table-functions/index.md#table-functions)に適用されます。 + +- `SOURCES`. レベル: `GROUP` + - `AZURE`. レベル: `GLOBAL` + - `FILE`. レベル: `GLOBAL` + - `HDFS`. レベル: `GLOBAL` + - `HIVE`. レベル: `GLOBAL` + - `JDBC`. レベル: `GLOBAL` + - `KAFKA`. レベル: `GLOBAL` + - `MONGO`. レベル: `GLOBAL` + - `MYSQL`. レベル: `GLOBAL` + - `NATS`. レベル: `GLOBAL` + - `ODBC`. レベル: `GLOBAL` + - `POSTGRES`. レベル: `GLOBAL` + - `RABBITMQ`. レベル: `GLOBAL` + - `REDIS`. レベル: `GLOBAL` + - `REMOTE`. レベル: `GLOBAL` + - `S3`. レベル: `GLOBAL` + - `SQLITE`. レベル: `GLOBAL` + - `URL`. レベル: `GLOBAL` + +`SOURCES`権限は、すべてのソースの使用を許可します。また、各ソースに対して個別に権限を付与することもできます。ソースを使用するには、追加の権限が必要です。 + +例: + +- [MySQLテーブルエンジン](../../engines/table-engines/integrations/mysql.md)を使用してテーブルを作成するには、`CREATE TABLE (ON db.table_name)`および`MYSQL`権限が必要です。 +- [mysqlテーブル関数](../../sql-reference/table-functions/mysql.md)を使用するには、`CREATE TEMPORARY TABLE`および`MYSQL`権限が必要です。 + +### dictGet + +- `dictGet`. 別名: `dictHas`, `dictGetHierarchy`, `dictIsIn` + +ユーザーが[dictGet](../../sql-reference/functions/ext-dict-functions.md#dictget)、[dictHas](../../sql-reference/functions/ext-dict-functions.md#dicthas)、[dictGetHierarchy](../../sql-reference/functions/ext-dict-functions.md#dictgethierarchy)、[dictIsIn](../../sql-reference/functions/ext-dict-functions.md#dictisin)関数を実行することを許可します。 + +権限レベル: `DICTIONARY`. + +**例** + +- `GRANT dictGet ON mydb.mydictionary TO john` +- `GRANT dictGet ON mydictionary TO john` + +### displaySecretsInShowAndSelect + +`SHOW`および`SELECT`クエリ内で秘密を表示することをユーザーに許可します。 +[`display_secrets_in_show_and_select`サーバー設定](../../operations/server-configuration-parameters/settings#display_secrets_in_show_and_select) +および +[`format_display_secrets_in_show_and_select`フォーマット設定](../../operations/settings/formats#format_display_secrets_in_show_and_select) +の両方がオンになっている場合。 + +### NAMED COLLECTION ADMIN + +指定された命名コレクションに対する特定の操作を許可します。バージョン23.7以前ではNAMED COLLECTION CONTROLと呼ばれていましたが、23.7以降にはNAMED COLLECTION ADMINが追加され、NAMED COLLECTION CONTROLはエイリアスとして保持されています。 + +- `NAMED COLLECTION ADMIN`. レベル: `NAMED_COLLECTION`. 別名: `NAMED COLLECTION CONTROL` + - `CREATE NAMED COLLECTION`. レベル: `NAMED_COLLECTION` + - `DROP NAMED COLLECTION`. レベル: `NAMED_COLLECTION` + - `ALTER NAMED COLLECTION`. レベル: `NAMED_COLLECTION` + - `SHOW NAMED COLLECTIONS`. レベル: `NAMED_COLLECTION`. 別名: `SHOW NAMED COLLECTIONS` + - `SHOW NAMED COLLECTIONS SECRETS`. レベル: `NAMED_COLLECTION`. 別名: `SHOW NAMED COLLECTIONS SECRETS` + - `NAMED COLLECTION`. レベル: `NAMED_COLLECTION`. 別名: `NAMED COLLECTION USAGE, USE NAMED COLLECTION` + +23.7では、GRANT NAMED COLLECTION以外のすべてのGRANT(CREATE, DROP, ALTER, SHOW)が追加され、23.7以降にのみGRANT NAMED COLLECTIONが追加されました。 + +**例** + +命名コレクションがabcと呼ばれる場合、ユーザーjohnにCREATE NAMED COLLECTIONの権限を付与します。 +- `GRANT CREATE NAMED COLLECTION ON abc TO john` + +### TABLE ENGINE + +テーブルを作成する際に指定されたテーブルエンジンを使用することを許可します。[テーブルエンジン](../../engines/table-engines/index.md)に適用されます。 + +**例** + +- `GRANT TABLE ENGINE ON * TO john` +- `GRANT TABLE ENGINE ON TinyLog TO john` + +### ALL + +規制対象エンティティに対するすべての権限をユーザーアカウントまたはロールに付与します。 + +### NONE + +いかなる権限も付与しません。 + +### ADMIN OPTION + +`ADMIN OPTION`権限は、ユーザーが自身のロールを他のユーザーに付与することを許可します。 diff --git a/docs/ja/sql-reference/statements/index.md b/docs/ja/sql-reference/statements/index.md new file mode 100644 index 00000000000..bb9fa543c20 --- /dev/null +++ b/docs/ja/sql-reference/statements/index.md @@ -0,0 +1,32 @@ +--- +slug: /ja/sql-reference/statements/ +sidebar_position: 1 +sidebar_label: ステートメントの一覧 +--- + +# ClickHouse SQL ステートメント + +ステートメントは、SQLクエリを使用して実行できるさまざまなアクションを表します。各種のステートメントには、それぞれ固有の構文と使用方法があり、それらは個別に説明されています。 + +- [SELECT](/docs/ja/sql-reference/statements/select/index.md) +- [INSERT INTO](/docs/ja/sql-reference/statements/insert-into.md) +- [CREATE](/docs/ja/sql-reference/statements/create/index.md) +- [ALTER](/docs/ja/sql-reference/statements/alter/index.md) +- [SYSTEM](/docs/ja/sql-reference/statements/system.md) +- [SHOW](/docs/ja/sql-reference/statements/show.md) +- [GRANT](/docs/ja/sql-reference/statements/grant.md) +- [REVOKE](/docs/ja/sql-reference/statements/revoke.md) +- [ATTACH](/docs/ja/sql-reference/statements/attach.md) +- [CHECK TABLE](/docs/ja/sql-reference/statements/check-table.md) +- [DESCRIBE TABLE](/docs/ja/sql-reference/statements/describe-table.md) +- [DETACH](/docs/ja/sql-reference/statements/detach.md) +- [DROP](/docs/ja/sql-reference/statements/drop.md) +- [EXISTS](/docs/ja/sql-reference/statements/exists.md) +- [KILL](/docs/ja/sql-reference/statements/kill.md) +- [OPTIMIZE](/docs/ja/sql-reference/statements/optimize.md) +- [RENAME](/docs/ja/sql-reference/statements/rename.md) +- [SET](/docs/ja/sql-reference/statements/set.md) +- [SET ROLE](/docs/ja/sql-reference/statements/set-role.md) +- [TRUNCATE](/docs/ja/sql-reference/statements/truncate.md) +- [USE](/docs/ja/sql-reference/statements/use.md) +- [EXPLAIN](/docs/ja/sql-reference/statements/explain.md) diff --git a/docs/ja/sql-reference/statements/insert-into.md b/docs/ja/sql-reference/statements/insert-into.md new file mode 100644 index 00000000000..40cbcd782c6 --- /dev/null +++ b/docs/ja/sql-reference/statements/insert-into.md @@ -0,0 +1,257 @@ +# INSERT INTO ステートメント + +テーブルにデータを挿入します。 + +**構文** + +``` sql +INSERT INTO [TABLE] [db.]table [(c1, c2, c3)] [SETTINGS ...] VALUES (v11, v12, v13), (v21, v22, v23), ... +``` + +挿入するカラムの一覧を `(c1, c2, c3)` で指定できます。また、`*` や [APPLY](../../sql-reference/statements/select/index.md#apply-modifier), [EXCEPT](../../sql-reference/statements/select/index.md#except-modifier), [REPLACE](../../sql-reference/statements/select/index.md#replace-modifier) などの[修飾子](../../sql-reference/statements/select/index.md#select-modifiers)を使用したカラム[マッチャー](../../sql-reference/statements/select/index.md#asterisk)の式も使用可能です。 + +例えば、以下のテーブルを考えます: + +``` sql +SHOW CREATE insert_select_testtable; +``` + +```text +CREATE TABLE insert_select_testtable +( + `a` Int8, + `b` String, + `c` Int8 +) +ENGINE = MergeTree() +ORDER BY a +``` + +``` sql +INSERT INTO insert_select_testtable (*) VALUES (1, 'a', 1) ; +``` + +すべてのカラムにデータを挿入し、'b' カラムを除外したい場合は、丸括弧内に選んだカラムの数だけ値を渡す必要があります: + +``` sql +INSERT INTO insert_select_testtable (* EXCEPT(b)) Values (2, 2); +``` + +``` sql +SELECT * FROM insert_select_testtable; +``` + +``` +┌─a─┬─b─┬─c─┐ +│ 2 │ │ 2 │ +└───┴───┴───┘ +┌─a─┬─b─┬─c─┐ +│ 1 │ a │ 1 │ +└───┴───┴───┘ +``` + +この例では、2行目で挿入された行は、`a` と `c` カラムが渡された値で埋められ、`b` カラムはデフォルト値で埋められています。`DEFAULT` キーワードを使用してデフォルト値を挿入することも可能です: + +``` sql +INSERT INTO insert_select_testtable VALUES (1, DEFAULT, 1) ; +``` + +カラムのリストにすべての既存カラムが含まれていない場合、残りのカラムは以下で埋められます: + +- テーブル定義で指定されている `DEFAULT` 式から計算された値。 +- `DEFAULT` 式が定義されていない場合は、ゼロと空文字列。 + +データは ClickHouse がサポートする任意の[フォーマット](../../interfaces/formats.md#formats)で `INSERT` に渡すことができます。クエリでフォーマットを明示的に指定する必要があります: + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name data_set +``` + +例えば、次のクエリフォーマットは基本的な INSERT ... VALUES と同じです: + +``` sql +INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ... +``` + +ClickHouse はデータの前のすべてのスペースと1行の改行(存在する場合)を削除します。クエリを形成する際、データをクエリオペレータの後に新しい行に置くことをお勧めします(データがスペースで始まる場合は重要です)。 + +例: + +``` sql +INSERT INTO t FORMAT TabSeparated +11 Hello, world! +22 Qwerty +``` + +データをクエリから分離して挿入するために、[コマンドラインクライアント](/docs/ja/integrations/sql-clients/clickhouse-client-local) や [HTTPインターフェース](/docs/ja/interfaces/http/)を使用できます。 + +:::note +`INSERT` クエリに `SETTINGS` を指定したい場合は、`FORMAT` 節の _前に_ 設定する必要があります。なぜなら、`FORMAT format_name` 以降はすべてデータと見なされるからです。例: +```sql +INSERT INTO table SETTINGS ... FORMAT format_name data_set +``` +::: + +## 制約 + +テーブルに[制約](../../sql-reference/statements/create/table.md#constraints)がある場合、その式は挿入データの各行に対してチェックされます。それらの制約のいずれかが満たされていない場合、サーバーは制約名と式を含む例外を発生させ、クエリは中断されます。 + +## SELECT の結果の挿入 + +**構文** + +``` sql +INSERT INTO [TABLE] [db.]table [(c1, c2, c3)] SELECT ... +``` + +カラムは `SELECT` 節での位置に従ってマッピングされます。しかし、`SELECT` 式と `INSERT` のためのテーブルでの名前は異なる場合があります。必要に応じて型キャスティングが行われます。 + +`Values` 以外のデータフォーマットは、`now()`, `1 + 2` などのような式に値を設定することを許可しません。`Values` フォーマットは式の限定的な使用を許可しますが、これは推奨されません。なぜなら、この場合、非効率的なコードが使用されるからです。 + +他のデータパーツを修正するクエリはサポートされていません:`UPDATE`, `DELETE`, `REPLACE`, `MERGE`, `UPSERT`, `INSERT UPDATE`。ただし、`ALTER TABLE ... DROP PARTITION` を使用して古いデータを削除できます。 + +`SELECT` 節がテーブル関数 [input()](../../sql-reference/table-functions/input.md) を含む場合は、`FORMAT` 節をクエリの最後に指定する必要があります。 + +`NULL` を持つ非nullableなデータタイプのカラムに代わりにデフォルト値を挿入するには、[insert_null_as_default](../../operations/settings/settings.md#insert_null_as_default) 設定を有効にします。 + +`INSERT` はまた、CTE(共通テーブル式)をサポートしています。例えば、以下の2つの文は同等です: + +``` sql +INSERT INTO x WITH y AS (SELECT * FROM numbers(10)) SELECT * FROM y; +WITH y AS (SELECT * FROM numbers(10)) INSERT INTO x SELECT * FROM y; +``` + +## ファイルからデータを挿入 + +**構文** + +``` sql +INSERT INTO [TABLE] [db.]table [(c1, c2, c3)] FROM INFILE file_name [COMPRESSION type] [SETTINGS ...] [FORMAT format_name] +``` + +上記の構文を使用して、**クライアント**側に保存されているファイル、またはファイル群からデータを挿入します。`file_name` と `type` は文字列リテラルです。入力ファイルの[フォーマット](../../interfaces/formats.md)は `FORMAT` 節で設定する必要があります。 + +圧縮ファイルはサポートされています。圧縮タイプはファイル名の拡張子で検出されます。もしくは、`COMPRESSION` 節で明示的に指定できます。サポートされているタイプは: `'none'`, `'gzip'`, `'deflate'`, `'br'`, `'xz'`, `'zstd'`, `'lz4'`, `'bz2'`。 + +この機能は[コマンドラインクライアント](../../interfaces/cli.md)および[clickhouse-local](../../operations/utilities/clickhouse-local.md)で利用可能です。 + +**例** + +### FROM INFILE を使用した単一ファイル +以下のクエリを[コマンドラインクライアント](../../interfaces/cli.md)で実行します: + +```bash +echo 1,A > input.csv ; echo 2,B >> input.csv +clickhouse-client --query="CREATE TABLE table_from_file (id UInt32, text String) ENGINE=MergeTree() ORDER BY id;" +clickhouse-client --query="INSERT INTO table_from_file FROM INFILE 'input.csv' FORMAT CSV;" +clickhouse-client --query="SELECT * FROM table_from_file FORMAT PrettyCompact;" +``` + +結果: + +```text +┌─id─┬─text─┐ +│ 1 │ A │ +│ 2 │ B │ +└────┴──────┘ +``` + +### FROM INFILE を使用した複数ファイルのグロブ + +この例は前のものと非常に似ていますが、`FROM INFILE 'input_*.csv` を使用して複数のファイルから挿入します。 + +```bash +echo 1,A > input_1.csv ; echo 2,B > input_2.csv +clickhouse-client --query="CREATE TABLE infile_globs (id UInt32, text String) ENGINE=MergeTree() ORDER BY id;" +clickhouse-client --query="INSERT INTO infile_globs FROM INFILE 'input_*.csv' FORMAT CSV;" +clickhouse-client --query="SELECT * FROM infile_globs FORMAT PrettyCompact;" +``` + +:::tip +複数のファイルを `*` で選択することに加え、範囲(`{1,2}` や `{1..9}`)やその他の[グロブ置換](/docs/ja/sql-reference/table-functions/file.md/#globs-in-path)を使用できます。以下の3つすべてが上記の例で機能します: +```sql +INSERT INTO infile_globs FROM INFILE 'input_*.csv' FORMAT CSV; +INSERT INTO infile_globs FROM INFILE 'input_{1,2}.csv' FORMAT CSV; +INSERT INTO infile_globs FROM INFILE 'input_?.csv' FORMAT CSV; +``` +::: + +## テーブル関数を使ったデータの挿入 + +データは[テーブル関数](../../sql-reference/table-functions/index.md)で参照されるテーブルに挿入できます。 + +**構文** +``` sql +INSERT INTO [TABLE] FUNCTION table_func ... +``` + +**例** + +次のクエリでは、[remote](../../sql-reference/table-functions/index.md#remote) テーブル関数を使用しています: + +``` sql +CREATE TABLE simple_table (id UInt32, text String) ENGINE=MergeTree() ORDER BY id; +INSERT INTO TABLE FUNCTION remote('localhost', default.simple_table) + VALUES (100, 'inserted via remote()'); +SELECT * FROM simple_table; +``` + +結果: + +``` text +┌──id─┬─text──────────────────┐ +│ 100 │ inserted via remote() │ +└─────┴───────────────────────┘ +``` + +## ClickHouse Cloud へのデータ挿入 + +デフォルトでは、ClickHouse Cloud のサービスは高可用性のために複数のレプリカを提供します。サービスに接続すると、これらのレプリカのいずれかに接続が確立されます。 + +`INSERT` が成功すると、データは基盤となるストレージに書き込まれます。しかし、レプリカがこれらの更新を受け取るまでには時間がかかる場合があります。そのため、別の接続を使用してこれらの他のレプリカのいずれかで `SELECT` クエリを実行した場合、更新されたデータがまだ反映されていない可能性があります。 + +レプリカに最新の更新を受け取らせるためには、`select_sequential_consistency` を使用することが可能です。ここにその設定を使用した SELECT クエリの例を示します: + +```sql +SELECT .... SETTINGS select_sequential_consistency = 1; +``` + +`select_sequential_consistency` を使用すると、ClickHouse Keeper に負荷がかかる可能性があり、サービスの負荷に応じてパフォーマンスが低下する可能性があることに注意してください。必要でない限り、この設定を有効にすることはお勧めしません。推奨されるアプローチは、同じセッションで読み取り/書き込みを実行するか、ネイティブプロトコルを使用するクライアントドライバを使用することです(これによりスティッキー接続がサポートされます)。 + +## レプリケーション設定での挿入 + +レプリケーション設定では、データはレプリケーションされた後に他のレプリカで表示されます。データは `INSERT` 後すぐにレプリケーション(他のレプリカでダウンロード)を開始します。これは、データがすぐに共有ストレージに書き込まれ、レプリカがメタデータの変更を購読する ClickHouse Cloud とは異なります。 + +レプリケーション設定では、`INSERTs` が時には(1秒程度の)かなりの時間を要する可能性があることに注意してください。これは、分散コンセンサスのために ClickHouse Keeper にコミットする必要があるためです。S3 をストレージに使用することも、追加のレイテンシーを追加します。 + +## パフォーマンスに関する考慮事項 + +`INSERT` は入力データを主キーでソートし、パーティションキーでパーティションに分割します。一度に複数のパーティションにデータを挿入すると、`INSERT` クエリのパフォーマンスが大幅に低下する可能性があります。これを避けるために: + +- 例えば 100,000 行のように、かなり大きなバッチでデータを追加する。 +- データをアップロードする前にパーティションキーでグループ化する。 + +以下の場合、パフォーマンスは低下しません: + +- データがリアルタイムで追加される。 +- 通常、時間でソートされたデータをアップロードする。 + +### 非同期挿入 + +小さくても頻繁に非同期でデータを挿入することが可能です。そのような挿入からのデータはバッチに結合され、安全にテーブルに挿入されます。非同期挿入を使用するには、[`async_insert`](../../operations/settings/settings.md#async-insert) 設定を有効にします。 + +`async_insert` または [`Buffer` テーブルエンジン](/ja/engines/table-engines/special/buffer) を使用することで、追加のバッファリングが発生します。 + +### 大規模または長時間実行の挿入 + +大量のデータを挿入するとき、ClickHouse は「スクワッシュ」と呼ばれるプロセスを通じて書き込みパフォーマンスを最適化します。メモリ内の小さなブロックの挿入データが結合され、ディスクに書き込まれる前に大きなブロックにスクワッシュされます。スクワッシュは、各書き込み操作に関連するオーバーヘッドを削減します。このプロセスでは、ClickHouse が各[`max_insert_block_size`](/ja/operations/settings/settings#max_insert_block_size) 行を書き込むのを完了した後、挿入されたデータがクエリ可能となります。 + +**関連項目** + +- [async_insert](../../operations/settings/settings.md#async-insert) +- [async_insert_threads](../../operations/settings/settings.md#async-insert-threads) +- [wait_for_async_insert](../../operations/settings/settings.md#wait-for-async-insert) +- [wait_for_async_insert_timeout](../../operations/settings/settings.md#wait-for-async-insert-timeout) +- [async_insert_max_data_size](../../operations/settings/settings.md#async-insert-max-data-size) +- [async_insert_busy_timeout_ms](../../operations/settings/settings.md#async-insert-busy-timeout-ms) +- [async_insert_stale_timeout_ms](../../operations/settings/settings.md#async-insert-stale-timeout-ms) diff --git a/docs/ja/sql-reference/statements/kill.md b/docs/ja/sql-reference/statements/kill.md new file mode 100644 index 00000000000..f780d031692 --- /dev/null +++ b/docs/ja/sql-reference/statements/kill.md @@ -0,0 +1,139 @@ +--- +slug: /ja/sql-reference/statements/kill +sidebar_position: 46 +sidebar_label: KILL +title: "KILLステートメント" +--- + +KILLステートメントには2種類あります: クエリを停止するものと、ミューテーションを停止するものです。 + +## KILL QUERY + +``` sql +KILL QUERY [ON CLUSTER cluster] + WHERE + [SYNC|ASYNC|TEST] + [FORMAT format] +``` + +現在実行中のクエリを強制的に停止しようとします。停止するクエリは、`KILL`クエリの`WHERE`句で定義された条件に基づき、system.processesテーブルから選択されます。 + +例: + +まず、未完了のクエリのリストを取得する必要があります。このSQLクエリは、最も長く実行されているものに基づき、これを提供します。 + +単一のClickHouseノードからのリスト: +``` sql +SELECT + initial_query_id, + query_id, + formatReadableTimeDelta(elapsed) AS time_delta, + query, + * + FROM system.processes + WHERE query ILIKE 'SELECT%' + ORDER BY time_delta DESC; +``` + +ClickHouseクラスタからのリスト: +``` sql +SELECT + initial_query_id, + query_id, + formatReadableTimeDelta(elapsed) AS time_delta, + query, + * + FROM clusterAllReplicas(default, system.processes) + WHERE query ILIKE 'SELECT%' + ORDER BY time_delta DESC; +``` + +クエリの停止: +``` sql +-- 指定されたquery_idを持つすべてのクエリを強制終了します: +KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90' + +-- 'username'によって実行されているすべてのクエリを同期的に終了します: +KILL QUERY WHERE user='username' SYNC +``` + +:::tip +ClickHouse Cloudやセルフマネージドのクラスタでクエリを停止する場合は、`ON CLUSTER [cluster-name]`オプションを使用して、すべてのレプリカでクエリが確実に停止されるようにしてください。 +::: + +読み取り専用ユーザーは自分のクエリしか停止できません。 + +デフォルトでは、非同期バージョン(`ASYNC`)が使用され、クエリが停止したことの確認を待たずに進行します。 + +同期バージョン(`SYNC`)は、すべてのクエリが停止するのを待機し、各プロセスが停止するたびに情報を表示します。応答には、以下の値を持つ`kill_status`カラムが含まれます: + +1. `finished` – クエリが正常に終了しました。 +2. `waiting` – クエリの終了信号を送信した後、終了を待機しています。 +3. その他の値は、クエリが停止できない理由を説明します。 + +テストクエリ(`TEST`)は、ユーザーの権限をチェックし、停止するクエリのリストを表示します。 + +## KILL MUTATION + +長時間実行中のミューテーションや未完了のミューテーションがある場合、ClickHouseサービスが正常に動作していないことが示されることがよくあります。ミューテーションの非同期性により、システムの利用可能なすべてのリソースを消費してしまうことがあります。以下のいずれかの対策が必要な場合があります: + +- すべての新しいミューテーション、`INSERT`、および`SELECT`を一時停止し、ミューテーションのキューを完了させる。 +- または、`KILL`コマンドを送信して、これらのミューテーションの一部を手動で停止する。 + +``` sql +KILL MUTATION + WHERE + [TEST] + [FORMAT format] +``` + +現在実行中の[ミューテーション](../../sql-reference/statements/alter/index.md#alter-mutations)をキャンセルして削除しようとします。キャンセルするミューテーションは、`KILL`クエリの`WHERE`句で指定されたフィルタを使用して[`system.mutations`](../../operations/system-tables/mutations.md#system_tables-mutations)テーブルから選択されます。 + +テストクエリ(`TEST`)は、ユーザーの権限を確認し、停止するミューテーションのリストを表示します。 + +例: + +未完了ミューテーションの`count()`を取得: + +単一のClickHouseノードからのミューテーション数: +``` sql +SELECT count(*) +FROM system.mutations +WHERE is_done = 0; +``` + +レプリカのClickHouseクラスタからのミューテーション数: +``` sql +SELECT count(*) +FROM clusterAllReplicas('default', system.mutations) +WHERE is_done = 0; +``` + +未完了のミューテーションのリストを照会: + +単一のClickHouseノードからのミューテーションのリスト: +``` sql +SELECT mutation_id, * +FROM system.mutations +WHERE is_done = 0; +``` + +ClickHouseクラスタからのミューテーションのリスト: +``` sql +SELECT mutation_id, * +FROM clusterAllReplicas('default', system.mutations) +WHERE is_done = 0; +``` + +必要に応じてミューテーションを停止: +``` sql +-- 単一のテーブル内のすべてのミューテーションをキャンセルして削除: +KILL MUTATION WHERE database = 'default' AND table = 'table' + +-- 特定のミューテーションをキャンセル: +KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt' +``` + +このクエリは、ミューテーションが停止できず完了しない状態(例えば、ミューテーションクエリ内の何らかの関数がテーブル内のデータに適用された際に例外を投げる場合)に役立ちます。 + +ミューテーションによってすでに行われた変更はロールバックされません。 diff --git a/docs/ja/sql-reference/statements/move.md b/docs/ja/sql-reference/statements/move.md new file mode 100644 index 00000000000..bfd344741da --- /dev/null +++ b/docs/ja/sql-reference/statements/move.md @@ -0,0 +1,32 @@ +--- +slug: /ja/sql-reference/statements/move +sidebar_position: 54 +sidebar_label: MOVE +--- + +# アクセスエンティティのMOVEステートメント + +このステートメントは、アクセスエンティティを一つのアクセスストレージから別のストレージへ移動させることができます。 + +構文: + +```sql +MOVE {USER, ROLE, QUOTA, SETTINGS PROFILE, ROW POLICY} name1 [, name2, ...] TO access_storage_type +``` + +現在、ClickHouseには五つのアクセスストレージがあります: + - `local_directory` + - `memory` + - `replicated` + - `users_xml` (読み取り専用) + - `ldap` (読み取り専用) + +例: + +```sql +MOVE USER test TO local_directory +``` + +```sql +MOVE ROLE test TO memory +``` diff --git a/docs/ja/sql-reference/statements/optimize.md b/docs/ja/sql-reference/statements/optimize.md new file mode 100644 index 00000000000..4fff4936316 --- /dev/null +++ b/docs/ja/sql-reference/statements/optimize.md @@ -0,0 +1,202 @@ +--- +slug: /ja/sql-reference/statements/optimize +sidebar_position: 47 +sidebar_label: OPTIMIZE +title: "OPTIMIZE ステートメント" +--- + +このクエリはテーブルのデータパーツのスケジュールされていないマージを初期化しようとします。`OPTIMIZE TABLE ... FINAL` の使用は管理を目的としたものであり、日常的な操作には推奨しないことに注意してください(詳細は[こちらのドキュメント](/docs/ja/optimize/avoidoptimizefinal)を参照)。 + +:::note +`OPTIMIZE` は `Too many parts` エラーを修正できません。 +::: + +**構文** + +``` sql +OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]] +``` + +`OPTIMIZE` クエリは [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) ファミリー([マテリアライズドビュー](../../sql-reference/statements/create/view.md#materialized-view)を含む)および [Buffer](../../engines/table-engines/special/buffer.md) エンジンでサポートされています。他のテーブルエンジンではサポートされていません。 + +`OPTIMIZE` が [ReplicatedMergeTree](../../engines/table-engines/mergetree-family/replication.md) ファミリーのテーブルエンジンで使用される場合、ClickHouse はマージのタスクを作成し、すべてのレプリカでの実行を待機します([alter_sync](../../operations/settings/settings.md#alter-sync) 設定が `2` に設定されている場合)または現在のレプリカで([alter_sync](../../operations/settings/settings.md#alter-sync) 設定が `1` に設定されている場合)。 + +- `OPTIMIZE` が何らかの理由でマージを行わない場合、クライアントには通知されません。通知を有効にするには、[optimize_throw_if_noop](../../operations/settings/settings.md#setting-optimize_throw_if_noop) 設定を使用してください。 +- `PARTITION` を指定すると、指定されたパーティションのみが最適化されます。[パーティション式の設定方法](alter/partition.md#how-to-set-partition-expression)。 +- `FINAL` を指定すると、すべてのデータがすでに1つのパーツにある場合でも最適化が行われます。この動作は [optimize_skip_merged_partitions](../../operations/settings/settings.md#optimize-skip-merged-partitions) で制御できます。同時にマージが行われている場合でも、マージは強制されます。 +- `DEDUPLICATE` を指定すると、完全に同一の行(by-clauseが指定されていない限り)が重複排除されます(すべてのカラムが比較されます)。これは MergeTree エンジンにのみ意味があります。 + +`OPTIMIZE` クエリの実行のために非アクティブなレプリカを待つ時間(秒)を指定するには、[replication_wait_for_inactive_replica_timeout](../../operations/settings/settings.md#replication-wait-for-inactive-replica-timeout) 設定を使用します。 + +:::note +`alter_sync` が `2` に設定されていて、いくつかのレプリカが `replication_wait_for_inactive_replica_timeout` 設定で指定された時間を超えて非アクティブである場合、`UNFINISHED` 例外がスローされます。 +::: + +## BY 式 + +重複排除をすべてのカラムではなくカスタムセットのカラムで行いたい場合、カラムのリストを明示的に指定するか、[`*`](../../sql-reference/statements/select/index.md#asterisk)、[`COLUMNS`](../../sql-reference/statements/select/index.md#columns-expression)、[`EXCEPT`](../../sql-reference/statements/select/index.md#except-modifier) 式の任意の組み合わせを使用できます。明示的または暗黙に展開されたカラムリストには、行の順序付け式(主キーおよびソートキー)およびパーティショニング式(パーティションキー)で指定されたすべてのカラムを含める必要があります。 + +:::note +`*` は `SELECT` と同じように動作します:[MATERIALIZED](../../sql-reference/statements/create/table.md#materialized) および [ALIAS](../../sql-reference/statements/create/table.md#alias) カラムは展開用に使用されません。 + +また、カラムの空のリストを指定したり、空のリストになる式を書いたり、`ALIAS` カラムで重複排除を行うことはエラーになります。 +::: + +**構文** + +``` sql +OPTIMIZE TABLE table DEDUPLICATE; -- すべてのカラム +OPTIMIZE TABLE table DEDUPLICATE BY *; -- MATERIALIZED および ALIAS カラムを除外する +OPTIMIZE TABLE table DEDUPLICATE BY colX,colY,colZ; +OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT colX; +OPTIMIZE TABLE table DEDUPLICATE BY * EXCEPT (colX, colY); +OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex'); +OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT colX; +OPTIMIZE TABLE table DEDUPLICATE BY COLUMNS('column-matched-by-regex') EXCEPT (colX, colY); +``` + +**例** + +以下のようなテーブルを考えます: + +``` sql +CREATE TABLE example ( + primary_key Int32, + secondary_key Int32, + value UInt32, + partition_key UInt32, + materialized_value UInt32 MATERIALIZED 12345, + aliased_value UInt32 ALIAS 2, + PRIMARY KEY primary_key +) ENGINE=MergeTree +PARTITION BY partition_key +ORDER BY (primary_key, secondary_key); +``` +``` sql +INSERT INTO example (primary_key, secondary_key, value, partition_key) +VALUES (0, 0, 0, 0), (0, 0, 0, 0), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 3, 3); +``` +``` sql +SELECT * FROM example; +``` +結果: +``` + +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +│ 1 │ 1 │ 3 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` +次に挙げるすべての例は、この5行から成る状態に対して実行されます。 + +#### `DEDUPLICATE` +重複排除のためのカラムが指定されていない場合、すべてのカラムが考慮されます。すべてのカラムの値が前の行の対応する値と等しい場合に限り、行が削除されます: + +``` sql +OPTIMIZE TABLE example FINAL DEDUPLICATE; +``` +``` sql +SELECT * FROM example; +``` +結果: +``` +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +│ 1 │ 1 │ 3 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` +#### `DEDUPLICATE BY *` +カラムが暗黙的に指定されると、テーブルは `ALIAS` または `MATERIALIZED` でないすべてのカラムで重複排除されます。上記のテーブルを考慮すると、これらは `primary_key`、`secondary_key`、`value`、`partition_key` カラムです: +```sql +OPTIMIZE TABLE example FINAL DEDUPLICATE BY *; +``` +``` sql +SELECT * FROM example; +``` +結果: +``` +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +│ 1 │ 1 │ 3 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` +#### `DEDUPLICATE BY * EXCEPT` +`ALIAS` または `MATERIALIZED` でないすべてのカラムで重複排除し、明示的に `value` 以外とする:`primary_key`、`secondary_key`、`partition_key` カラム。 + +``` sql +OPTIMIZE TABLE example FINAL DEDUPLICATE BY * EXCEPT value; +``` +``` sql +SELECT * FROM example; +``` +結果: +``` +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` +#### `DEDUPLICATE BY ` +`primary_key`、`secondary_key`、`partition_key` カラムで明示的に重複排除: +```sql +OPTIMIZE TABLE example FINAL DEDUPLICATE BY primary_key, secondary_key, partition_key; +``` +``` sql +SELECT * FROM example; +``` +結果: +``` +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` +#### `DEDUPLICATE BY COLUMNS()` +正規表現に一致するすべてのカラムで重複排除:`primary_key`、`secondary_key`、`partition_key` カラム: +```sql +OPTIMIZE TABLE example FINAL DEDUPLICATE BY COLUMNS('.*_key'); +``` +``` sql +SELECT * FROM example; +``` +結果: +``` +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 0 │ 0 │ 0 │ 0 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 2 │ +└─────────────┴───────────────┴───────┴───────────────┘ +┌─primary_key─┬─secondary_key─┬─value─┬─partition_key─┐ +│ 1 │ 1 │ 2 │ 3 │ +└─────────────┴───────────────┴───────┴───────────────┘ +``` diff --git a/docs/ja/sql-reference/statements/rename.md b/docs/ja/sql-reference/statements/rename.md new file mode 100644 index 00000000000..5e77cbe5d10 --- /dev/null +++ b/docs/ja/sql-reference/statements/rename.md @@ -0,0 +1,62 @@ +--- +slug: /ja/sql-reference/statements/rename +sidebar_position: 48 +sidebar_label: RENAME +--- + +# RENAME ステートメント + +データベース、テーブル、または Dictionary の名前を変更します。複数のエンティティを単一のクエリでリネームできます。複数のエンティティを伴う `RENAME` クエリは非原子的操作であることに注意してください。エンティティの名前を原子的に交換するには、[EXCHANGE](./exchange.md) ステートメントを使用してください。 + +**構文** + +```sql +RENAME [DATABASE|TABLE|DICTIONARY] name TO new_name [,...] [ON CLUSTER cluster] +``` + +## RENAME DATABASE + +データベースの名前を変更します。 + +**構文** + +```sql +RENAME DATABASE atomic_database1 TO atomic_database2 [,...] [ON CLUSTER cluster] +``` + +## RENAME TABLE + +一つまたは複数のテーブルの名前を変更します。 + +テーブルのリネームは軽量な操作です。`TO` の後に異なるデータベースを指定すると、テーブルはそのデータベースに移動します。ただし、データベースのディレクトリは同じファイルシステムに存在する必要があります。そうでない場合、エラーが返されます。 もし一つのクエリで複数のテーブルをリネームすると、その操作は原子的ではありません。部分的に実行されることがあり、他のセッションで `Table ... does not exist ...` エラーが発生する可能性があります。 + +**構文** + +``` sql +RENAME TABLE [db1.]name1 TO [db2.]name2 [,...] [ON CLUSTER cluster] +``` + +**例** + +```sql +RENAME TABLE table_A TO table_A_bak, table_B TO table_B_bak; +``` + +そして、よりシンプルな SQL を使うこともできます: +```sql +RENAME table_A TO table_A_bak, table_B TO table_B_bak; +``` + +## RENAME DICTIONARY + +一つまたは複数の Dictionary の名前を変更します。このクエリは、Dictionary をデータベース間で移動するために使用できます。 + +**構文** + +```sql +RENAME DICTIONARY [db0.]dict_A TO [db1.]dict_B [,...] [ON CLUSTER cluster] +``` + +**関連項目** + +- [Dictionaries](../../sql-reference/dictionaries/index.md) diff --git a/docs/ja/sql-reference/statements/revoke.md b/docs/ja/sql-reference/statements/revoke.md new file mode 100644 index 00000000000..c81b11abb98 --- /dev/null +++ b/docs/ja/sql-reference/statements/revoke.md @@ -0,0 +1,49 @@ +--- +slug: /ja/sql-reference/statements/revoke +sidebar_position: 39 +sidebar_label: REVOKE +--- + +# REVOKE ステートメント + +ユーザーまたはロールから権限を取り消します。 + +## 構文 + +**ユーザーからの権限の取り消し** + +``` sql +REVOKE [ON CLUSTER cluster_name] privilege[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} FROM {user | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user | CURRENT_USER} [,...] +``` + +**ユーザーからのロールの取り消し** + +``` sql +REVOKE [ON CLUSTER cluster_name] [ADMIN OPTION FOR] role [,...] FROM {user | role | CURRENT_USER} [,...] | ALL | ALL EXCEPT {user_name | role_name | CURRENT_USER} [,...] +``` + +## 説明 + +権限を取り消すには、取り消したいものより広い範囲の権限を持っている場合にそれを使用できます。例えば、ユーザーが `SELECT (x,y)` 権限を持っている場合、管理者は `REVOKE SELECT(x,y) ...` や `REVOKE SELECT * ...`、さらには `REVOKE ALL PRIVILEGES ...` クエリを実行してこの権限を取り消すことができます。 + +### 部分的な取り消し + +権限の一部を取り消すことができます。例えば、ユーザーが `SELECT *.*` 権限を持っている場合、特定のテーブルやデータベースから読み取る権限を取り消すことができます。 + +## 例 + +`john` ユーザーアカウントに、`accounts` データベースを除くすべてのデータベースの選択権限を与える: + +``` sql +GRANT SELECT ON *.* TO john; +REVOKE SELECT ON accounts.* FROM john; +``` + +`mira` ユーザーアカウントに、`accounts.staff` テーブルのすべてのカラムを選択する権限を与えますが、`wage` カラムを除きます。 + +``` sql +GRANT SELECT ON accounts.staff TO mira; +REVOKE SELECT(wage) ON accounts.staff FROM mira; +``` + +[原文はこちら](https://clickhouse.com/docs/ja/operations/settings/settings/) diff --git a/docs/ja/sql-reference/statements/select/all.md b/docs/ja/sql-reference/statements/select/all.md new file mode 100644 index 00000000000..08f4e7ddb72 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/all.md @@ -0,0 +1,20 @@ +--- +slug: /ja/sql-reference/statements/select/all +sidebar_label: ALL +--- + +# ALL句 + +テーブル内に複数の一致する行がある場合、`ALL`はそれらすべてを返します。`SELECT ALL`は、`DISTINCT`なしの`SELECT`と同一です。`ALL`と`DISTINCT`の両方が指定されると、例外がスローされます。 + +`ALL`は集計関数内で同じ効果(実質的には無意味)で指定することもできます。例えば: + +```sql +SELECT sum(ALL number) FROM numbers(10); +``` +は次と同じです: + +```sql +SELECT sum(number) FROM numbers(10); +``` + diff --git a/docs/ja/sql-reference/statements/select/array-join.md b/docs/ja/sql-reference/statements/select/array-join.md new file mode 100644 index 00000000000..53667a974fc --- /dev/null +++ b/docs/ja/sql-reference/statements/select/array-join.md @@ -0,0 +1,312 @@ +--- +slug: /ja/sql-reference/statements/select/array-join +sidebar_label: ARRAY JOIN +--- + +# ARRAY JOIN 句 + +ARRAY JOIN句は、配列カラムを含むテーブルに対して、そのカラムの各配列要素を持つ新しいテーブルを生成し、他のカラムの値を複製する一般的な操作です。これは、`ARRAY JOIN`句が行う基本的な内容です。 + +名前の由来は、配列またはネストされたデータ構造との`JOIN`の実行として見ることができることにあります。この目的は、[arrayJoin](../../../sql-reference/functions/array-join.md#functions_arrayjoin) 関数と似ていますが、句の機能はより広範です。 + +構文: + +```sql +SELECT +FROM +[LEFT] ARRAY JOIN +[WHERE|PREWHERE ] +... +``` + +`SELECT` クエリでは、`ARRAY JOIN` 句を1つだけ指定できます。 + +サポートされている`ARRAY JOIN`のタイプは以下の通りです: + +- `ARRAY JOIN` - 基本の場合、空の配列は `JOIN` の結果に含まれません。 +- `LEFT ARRAY JOIN` - `JOIN` の結果に空の配列を持つ行が含まれます。空の配列の値は、配列要素タイプのデフォルト値(通常は0、空文字列、または NULL)に設定されます。 + +## 基本的な ARRAY JOIN の例 + +以下の例では、`ARRAY JOIN` および `LEFT ARRAY JOIN` の使用法を示します。[Array](../../../sql-reference/data-types/array.md) タイプのカラムを持つテーブルを作成し、値を挿入します: + +```sql +CREATE TABLE arrays_test +( + s String, + arr Array(UInt8) +) ENGINE = Memory; + +INSERT INTO arrays_test +VALUES ('Hello', [1,2]), ('World', [3,4,5]), ('Goodbye', []); +``` + +```response +┌─s───────────┬─arr─────┐ +│ Hello │ [1,2] │ +│ World │ [3,4,5] │ +│ Goodbye │ [] │ +└─────────────┴─────────┘ +``` + +以下の例は、`ARRAY JOIN` 句を使用します: + +```sql +SELECT s, arr +FROM arrays_test +ARRAY JOIN arr; +``` + +```response +┌─s─────┬─arr─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ World │ 3 │ +│ World │ 4 │ +│ World │ 5 │ +└───────┴─────┘ +``` + +次の例は、`LEFT ARRAY JOIN` 句を使用します: + +```sql +SELECT s, arr +FROM arrays_test +LEFT ARRAY JOIN arr; +``` + +```response +┌─s───────────┬─arr─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ World │ 3 │ +│ World │ 4 │ +│ World │ 5 │ +│ Goodbye │ 0 │ +└─────────────┴─────┘ +``` + +## エイリアスの使用 + +`ARRAY JOIN` 句で配列のエイリアスを指定できます。この場合、配列項目にはこのエイリアスでアクセスできますが、配列自体には元の名前でアクセスします。例: + +```sql +SELECT s, arr, a +FROM arrays_test +ARRAY JOIN arr AS a; +``` + +```response +┌─s─────┬─arr─────┬─a─┐ +│ Hello │ [1,2] │ 1 │ +│ Hello │ [1,2] │ 2 │ +│ World │ [3,4,5] │ 3 │ +│ World │ [3,4,5] │ 4 │ +│ World │ [3,4,5] │ 5 │ +└───────┴─────────┴───┘ +``` + +エイリアスを使用して、外部配列との`ARRAY JOIN`を実行できます。例: + +```sql +SELECT s, arr_external +FROM arrays_test +ARRAY JOIN [1, 2, 3] AS arr_external; +``` + +```response +┌─s───────────┬─arr_external─┐ +│ Hello │ 1 │ +│ Hello │ 2 │ +│ Hello │ 3 │ +│ World │ 1 │ +│ World │ 2 │ +│ World │ 3 │ +│ Goodbye │ 1 │ +│ Goodbye │ 2 │ +│ Goodbye │ 3 │ +└─────────────┴──────────────┘ +``` + +複数の配列は、`ARRAY JOIN`句でカンマで区切ることができます。この場合、`JOIN`は同時に実行されます(直和であり、直積ではありません)。デフォルトでは、すべての配列は同じサイズである必要があります。例: + +```sql +SELECT s, arr, a, num, mapped +FROM arrays_test +ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num, arrayMap(x -> x + 1, arr) AS mapped; +``` + +```response +┌─s─────┬─arr─────┬─a─┬─num─┬─mapped─┐ +│ Hello │ [1,2] │ 1 │ 1 │ 2 │ +│ Hello │ [1,2] │ 2 │ 2 │ 3 │ +│ World │ [3,4,5] │ 3 │ 1 │ 4 │ +│ World │ [3,4,5] │ 4 │ 2 │ 5 │ +│ World │ [3,4,5] │ 5 │ 3 │ 6 │ +└───────┴─────────┴───┴─────┴────────┘ +``` + +以下の例では、[arrayEnumerate](../../../sql-reference/functions/array-functions.md#array_functions-arrayenumerate)関数を使用しています: + +```sql +SELECT s, arr, a, num, arrayEnumerate(arr) +FROM arrays_test +ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num; +``` + +```response +┌─s─────┬─arr─────┬─a─┬─num─┬─arrayEnumerate(arr)─┐ +│ Hello │ [1,2] │ 1 │ 1 │ [1,2] │ +│ Hello │ [1,2] │ 2 │ 2 │ [1,2] │ +│ World │ [3,4,5] │ 3 │ 1 │ [1,2,3] │ +│ World │ [3,4,5] │ 4 │ 2 │ [1,2,3] │ +│ World │ [3,4,5] │ 5 │ 3 │ [1,2,3] │ +└───────┴─────────┴───┴─────┴─────────────────────┘ +``` + +異なるサイズの複数の配列は次のようにして結合できます: `SETTINGS enable_unaligned_array_join = 1`。例: + +```sql +SELECT s, arr, a, b +FROM arrays_test ARRAY JOIN arr as a, [['a','b'],['c']] as b +SETTINGS enable_unaligned_array_join = 1; +``` + +```response +┌─s───────┬─arr─────┬─a─┬─b─────────┐ +│ Hello │ [1,2] │ 1 │ ['a','b'] │ +│ Hello │ [1,2] │ 2 │ ['c'] │ +│ World │ [3,4,5] │ 3 │ ['a','b'] │ +│ World │ [3,4,5] │ 4 │ ['c'] │ +│ World │ [3,4,5] │ 5 │ [] │ +│ Goodbye │ [] │ 0 │ ['a','b'] │ +│ Goodbye │ [] │ 0 │ ['c'] │ +└─────────┴─────────┴───┴───────────┘ +``` + +## ネストされたデータ構造との ARRAY JOIN + +`ARRAY JOIN` は[ネストされたデータ構造](../../../sql-reference/data-types/nested-data-structures/index.md)にも対応しています: + +```sql +CREATE TABLE nested_test +( + s String, + nest Nested( + x UInt8, + y UInt32) +) ENGINE = Memory; + +INSERT INTO nested_test +VALUES ('Hello', [1,2], [10,20]), ('World', [3,4,5], [30,40,50]), ('Goodbye', [], []); +``` + +```response +┌─s───────┬─nest.x──┬─nest.y─────┐ +│ Hello │ [1,2] │ [10,20] │ +│ World │ [3,4,5] │ [30,40,50] │ +│ Goodbye │ [] │ [] │ +└─────────┴─────────┴────────────┘ +``` + +```sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN nest; +``` + +```response +┌─s─────┬─nest.x─┬─nest.y─┐ +│ Hello │ 1 │ 10 │ +│ Hello │ 2 │ 20 │ +│ World │ 3 │ 30 │ +│ World │ 4 │ 40 │ +│ World │ 5 │ 50 │ +└───────┴────────┴────────┘ +``` + +`ARRAY JOIN` でネストされたデータ構造の名前を指定する場合、その意味はそれを構成するすべての配列要素に対する `ARRAY JOIN` と同じです。以下に例を示します: + +```sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN `nest.x`, `nest.y`; +``` + +```response +┌─s─────┬─nest.x─┬─nest.y─┐ +│ Hello │ 1 │ 10 │ +│ Hello │ 2 │ 20 │ +│ World │ 3 │ 30 │ +│ World │ 4 │ 40 │ +│ World │ 5 │ 50 │ +└───────┴────────┴────────┘ +``` + +以下のバリエーションも意味があります: + +```sql +SELECT s, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN `nest.x`; +``` + +```response +┌─s─────┬─nest.x─┬─nest.y─────┐ +│ Hello │ 1 │ [10,20] │ +│ Hello │ 2 │ [10,20] │ +│ World │ 3 │ [30,40,50] │ +│ World │ 4 │ [30,40,50] │ +│ World │ 5 │ [30,40,50] │ +└───────┴────────┴────────────┘ +``` + +エイリアスをネストされたデータ構造に使用して、`JOIN`結果またはソース配列を選択することもできます。例: + +```sql +SELECT s, `n.x`, `n.y`, `nest.x`, `nest.y` +FROM nested_test +ARRAY JOIN nest AS n; +``` + +```response +┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┐ +│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │ +│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │ +│ World │ 3 │ 30 │ [3,4,5] │ [30,40,50] │ +│ World │ 4 │ 40 │ [3,4,5] │ [30,40,50] │ +│ World │ 5 │ 50 │ [3,4,5] │ [30,40,50] │ +└───────┴─────┴─────┴─────────┴────────────┘ +``` + +[arrayEnumerate](../../../sql-reference/functions/array-functions.md#array_functions-arrayenumerate)関数を使用する例: + +```sql +SELECT s, `n.x`, `n.y`, `nest.x`, `nest.y`, num +FROM nested_test +ARRAY JOIN nest AS n, arrayEnumerate(`nest.x`) AS num; +``` + +```response +┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┬─num─┐ +│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │ 1 │ +│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │ 2 │ +│ World │ 3 │ 30 │ [3,4,5] │ [30,40,50] │ 1 │ +│ World │ 4 │ 40 │ [3,4,5] │ [30,40,50] │ 2 │ +│ World │ 5 │ 50 │ [3,4,5] │ [30,40,50] │ 3 │ +└───────┴─────┴─────┴─────────┴────────────┴─────┘ +``` + +## 実装の詳細 + +クエリ実行の順序は、`ARRAY JOIN` 実行時に最適化されます。`ARRAY JOIN` はクエリ内で常に [WHERE](../../../sql-reference/statements/select/where.md)/[PREWHERE](../../../sql-reference/statements/select/prewhere.md) 句の前に指定する必要がありますが、`ARRAY JOIN` の結果がフィルタリングに使用されない限り、技術的には任意の順序で実行できます。処理の順序はクエリオプティマイザによって制御されます。 + +### 短絡評価関数との互換性がない + +[短絡評価関数](../../../operations/settings/index.md#short-circuit-function-evaluation) は、`if`、`multiIf`、`and`、`or` などの特定の関数で複雑な式の実行を最適化する機能で、ゼロ除算などの潜在的な例外がこれらの関数の実行中に発生するのを防ぎます。 + +`arrayJoin` は常に実行され、短絡評価関数には対応していません。これは、すべての他の関数とは異なり、クエリ分析および実行中に別途処理され、`arrayJoin` の結果に依存して結果の行数が決まるためです。そのため、`arrayJoin` の遅延評価の実装は複雑で高コストとなります。 + +## 関連コンテンツ + +- ブログ: [ClickHouseでの時系列データ処理](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/sql-reference/statements/select/distinct.md b/docs/ja/sql-reference/statements/select/distinct.md new file mode 100644 index 00000000000..1bd5ee4129b --- /dev/null +++ b/docs/ja/sql-reference/statements/select/distinct.md @@ -0,0 +1,110 @@ +--- +slug: /ja/sql-reference/statements/select/distinct +sidebar_label: DISTINCT +--- + +# DISTINCT句 + +`SELECT DISTINCT`が指定されている場合、クエリ結果にはユニークな行だけが残ります。つまり、結果内で完全に一致する行のセットからは、単一の行のみが残ります。 + +ユニークな値を持つべきカラムのリストを指定できます: `SELECT DISTINCT ON (column1, column2,...)`。カラムが指定されていない場合は、すべてが考慮されます。 + +以下のテーブルを考えてみましょう: + +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +カラムを指定せずに`DISTINCT`を使用する場合: + +```sql +SELECT DISTINCT * FROM t1; +``` + +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 1 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +カラムを指定して`DISTINCT`を使用する場合: + +```sql +SELECT DISTINCT ON (a,b) * FROM t1; +``` + +```text +┌─a─┬─b─┬─c─┐ +│ 1 │ 1 │ 1 │ +│ 2 │ 2 │ 2 │ +│ 1 │ 2 │ 2 │ +└───┴───┴───┘ +``` + +## DISTINCTとORDER BY + +ClickHouseは、異なるカラムに対して`DISTINCT`および`ORDER BY`句を使用することをサポートしています。`DISTINCT`句は`ORDER BY`句よりも先に実行されます。 + +以下のテーブルを考えてみましょう: + +``` text +┌─a─┬─b─┐ +│ 2 │ 1 │ +│ 1 │ 2 │ +│ 3 │ 3 │ +│ 2 │ 4 │ +└───┴───┘ +``` + +データを選択する場合: + +```sql +SELECT DISTINCT a FROM t1 ORDER BY b ASC; +``` + +``` text +┌─a─┐ +│ 2 │ +│ 1 │ +│ 3 │ +└───┘ +``` +異なるソート順でデータを選択する場合: + +```sql +SELECT DISTINCT a FROM t1 ORDER BY b DESC; +``` + +``` text +┌─a─┐ +│ 3 │ +│ 1 │ +│ 2 │ +└───┘ +``` + +行`2, 4`はソートの前にカットされました。 + +クエリをプログラムするときには、この実装の特性に注意してください。 + +## NULLの処理 + +`DISTINCT`は、[NULL](../../../sql-reference/syntax.md#null-literal)を特定の値とみなして処理し、`NULL==NULL`であるかのように動作します。言い換えれば、`DISTINCT`の結果では、`NULL`との異なる組み合わせは一度だけ発生します。他の多くの文脈における`NULL`の処理とは異なります。 + +## 代替案 + +`SELECT`句で指定した同じ値のセットに対して[GROUP BY](../../../sql-reference/statements/select/group-by.md)を適用することで、集計関数を使用せずに同じ結果を得ることができます。しかし、`GROUP BY`アプローチとはいくつかの違いがあります: + +- `DISTINCT`は`GROUP BY`とともに適用できます。 +- [ORDER BY](../../../sql-reference/statements/select/order-by.md)が省略され、[LIMIT](../../../sql-reference/statements/select/limit.md)が定義されている場合、クエリは必要な異なる行の数を読み取った時点で即座に終了します。 +- データブロックはクエリの実行が完了するのを待たずに処理されるとそのまま出力されます。 diff --git a/docs/ja/sql-reference/statements/select/except.md b/docs/ja/sql-reference/statements/select/except.md new file mode 100644 index 00000000000..2cbacd11819 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/except.md @@ -0,0 +1,153 @@ +--- +slug: /ja/sql-reference/statements/select/except +sidebar_label: EXCEPT +--- + +# EXCEPT句 + +`EXCEPT`句は、最初のクエリの結果から2番目のクエリの結果を除いた行のみを返します。クエリは、カラムの数、順序、型が一致している必要があります。`EXCEPT`の結果には重複する行が含まれることがあります。 + +括弧が指定されていない場合、複数の`EXCEPT`文は左から右に実行されます。`EXCEPT`演算子は`UNION`句と同じ優先度を持ち、`INTERSECT`句より低い優先度を持っています。 + +``` sql +SELECT column1 [, column2 ] +FROM table1 +[WHERE condition] + +EXCEPT + +SELECT column1 [, column2 ] +FROM table2 +[WHERE condition] + +``` +条件は要件に基づく任意の式を指定できます。 + +## 例 + +ここでは、1から10までの数字で、3から8までの数字に_含まれない_ものを返す簡単な例を示します: + +クエリ: + +``` sql +SELECT number FROM numbers(1,10) EXCEPT SELECT number FROM numbers(3,6); +``` + +結果: + +```response +┌─number─┐ +│ 1 │ +│ 2 │ +│ 9 │ +│ 10 │ +└────────┘ +``` + +`EXCEPT`と`INTERSECT`は異なるブール論理を用いてしばしば相互に使われ、共通のカラム(またはカラム)を持つ2つのテーブルがある場合に便利です。例えば、トレード価格とボリュームを含む数百万行の仮想通貨の歴史データがあるとします: + +```sql +CREATE TABLE crypto_prices +( + trade_date Date, + crypto_name String, + volume Float32, + price Float32, + market_cap Float32, + change_1_day Float32 +) +ENGINE = MergeTree +PRIMARY KEY (crypto_name, trade_date); + +INSERT INTO crypto_prices + SELECT * + FROM s3( + 'https://learn-clickhouse.s3.us-east-2.amazonaws.com/crypto_prices.csv', + 'CSVWithNames' +); + +SELECT * FROM crypto_prices +WHERE crypto_name = 'Bitcoin' +ORDER BY trade_date DESC +LIMIT 10; +``` + +```response +┌─trade_date─┬─crypto_name─┬──────volume─┬────price─┬───market_cap─┬──change_1_day─┐ +│ 2020-11-02 │ Bitcoin │ 30771456000 │ 13550.49 │ 251119860000 │ -0.013585099 │ +│ 2020-11-01 │ Bitcoin │ 24453857000 │ 13737.11 │ 254569760000 │ -0.0031840964 │ +│ 2020-10-31 │ Bitcoin │ 30306464000 │ 13780.99 │ 255372070000 │ 0.017308505 │ +│ 2020-10-30 │ Bitcoin │ 30581486000 │ 13546.52 │ 251018150000 │ 0.008084608 │ +│ 2020-10-29 │ Bitcoin │ 56499500000 │ 13437.88 │ 248995320000 │ 0.012552661 │ +│ 2020-10-28 │ Bitcoin │ 35867320000 │ 13271.29 │ 245899820000 │ -0.02804481 │ +│ 2020-10-27 │ Bitcoin │ 33749879000 │ 13654.22 │ 252985950000 │ 0.04427984 │ +│ 2020-10-26 │ Bitcoin │ 29461459000 │ 13075.25 │ 242251000000 │ 0.0033826586 │ +│ 2020-10-25 │ Bitcoin │ 24406921000 │ 13031.17 │ 241425220000 │ -0.0058658565 │ +│ 2020-10-24 │ Bitcoin │ 24542319000 │ 13108.06 │ 242839880000 │ 0.013650347 │ +└────────────┴─────────────┴─────────────┴──────────┴──────────────┴───────────────┘ +``` + +今、保有する仮想通貨のリストとコインの枚数を含む`holdings`というテーブルがあると仮定します: + +```sql +CREATE TABLE holdings +( + crypto_name String, + quantity UInt64 +) +ENGINE = MergeTree +PRIMARY KEY (crypto_name); + +INSERT INTO holdings VALUES + ('Bitcoin', 1000), + ('Bitcoin', 200), + ('Ethereum', 250), + ('Ethereum', 5000), + ('DOGEFI', 10), + ('Bitcoin Diamond', 5000); +``` + +**「$10を下回ったことがない持っているコインはどれですか?」**という質問に答えるために`EXCEPT`を使用できます: + +```sql +SELECT crypto_name FROM holdings +EXCEPT +SELECT crypto_name FROM crypto_prices +WHERE price < 10; +``` + +結果: + +```response +┌─crypto_name─┐ +│ Bitcoin │ +│ Bitcoin │ +└─────────────┘ +``` + +このことは、私たちが所有する四つの仮想通貨のうち、ここで示された限られたデータベースで、Bitcoinのみが$10以下に下がったことがないことを意味します。 + +## EXCEPT DISTINCT + +前のクエリでは、結果に複数のBitcoin保有が含まれていました。`EXCEPT`に`DISTINCT`を追加して、結果から重複する行を取り除くことができます: + +```sql +SELECT crypto_name FROM holdings +EXCEPT DISTINCT +SELECT crypto_name FROM crypto_prices +WHERE price < 10; +``` + +結果: + +```response +┌─crypto_name─┐ +│ Bitcoin │ +└─────────────┘ +``` + + +**関連項目** + +- [UNION](union.md#union-clause) +- [INTERSECT](intersect.md#intersect-clause) diff --git a/docs/ja/sql-reference/statements/select/format.md b/docs/ja/sql-reference/statements/select/format.md new file mode 100644 index 00000000000..59a8bf4394a --- /dev/null +++ b/docs/ja/sql-reference/statements/select/format.md @@ -0,0 +1,18 @@ +--- +slug: /ja/sql-reference/statements/select/format +sidebar_label: FORMAT +--- + +# FORMAT句 + +ClickHouseは、クエリ結果などに使用できる幅広い[シリアル化フォーマット](../../../interfaces/formats.md)をサポートしています。`SELECT`の出力フォーマットを選択する方法は複数あり、その一つとしてクエリの末尾に`FORMAT format`を指定して、結果データを特定のフォーマットで取得する方法があります。 + +特定のフォーマットは、利便性、他のシステムとの統合、またはパフォーマンス向上のために使用されることがあります。 + +## デフォルトフォーマット + +`FORMAT`句を省略すると、デフォルトフォーマットが使用されます。このフォーマットは、設定とClickHouseサーバーにアクセスするためのインターフェースの両方に依存します。[HTTPインターフェース](../../../interfaces/http.md)やバッチモードでの[コマンドラインクライアント](../../../interfaces/cli.md)の場合、デフォルトフォーマットは `TabSeparated`です。対話モードでのコマンドラインクライアントでは、デフォルトフォーマットは `PrettyCompact`(人間が読みやすいコンパクトなテーブルを生成)です。 + +## 実装の詳細 + +コマンドラインクライアントを使用する場合、データは常にネットワーク経由で効率的な内部フォーマット(`Native`)で渡されます。クライアントはクエリの`FORMAT`句を自己解釈し、自分でデータをフォーマットします(これにより、ネットワークやサーバーの負荷が減ります)。 diff --git a/docs/ja/sql-reference/statements/select/from.md b/docs/ja/sql-reference/statements/select/from.md new file mode 100644 index 00000000000..72436dbf5f5 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/from.md @@ -0,0 +1,80 @@ +--- +slug: /ja/sql-reference/statements/select/from +sidebar_label: FROM +--- + +# FROM句 + +`FROM`句は、データを読み取るためのソースを指定します: + +- [テーブル](../../../engines/table-engines/index.md) +- [サブクエリ](../../../sql-reference/statements/select/index.md) +- [テーブル関数](../../../sql-reference/table-functions/index.md#table-functions) + +`FROM`句の機能を拡張するために、[JOIN](../../../sql-reference/statements/select/join.md) および [ARRAY JOIN](../../../sql-reference/statements/select/array-join.md)句も使用できます。 + +サブクエリは、`FROM`句内で括弧で囲まれた別の`SELECT`クエリです。 + +`FROM`には複数のデータソースを含めることができ、カンマで区切られます。これはそれらに対する[CROSS JOIN](../../../sql-reference/statements/select/join.md)を実行することと同等です。 + +`FROM`は、`SELECT`句の前にオプションで表示することができます。これは標準SQLのClickHouse特有の拡張であり、`SELECT`文を読みやすくします。例: + +```sql +FROM table +SELECT * +``` + +## FINAL修飾子 + +`FINAL`が指定されると、ClickHouseは結果を返す前にデータを完全にマージします。これにより、特定のテーブルエンジンのマージ中に起こるすべてのデータ変換も実行されます。 + +以下のテーブルエンジンを使用しているテーブルからデータを選択する場合に適用されます: +- `ReplacingMergeTree` +- `SummingMergeTree` +- `AggregatingMergeTree` +- `CollapsingMergeTree` +- `VersionedCollapsingMergeTree` + +`FINAL`付きの`SELECT`クエリは並列に実行されます。[max_final_threads](../../../operations/settings/settings.md#max-final-threads)設定は使用するスレッド数を制限します。 + +### 欠点 + +`FINAL`を使用するクエリは、`FINAL`を使用しない類似のクエリよりも若干遅く実行されます。理由は以下の通りです: + +- クエリ実行中にデータがマージされる。 +- `FINAL`付きのクエリは、クエリで指定したカラムに加えて主キーのカラムを読み取る場合があります。 + +`FINAL`は通常マージ時に行われる処理をクエリの実行時にメモリ内で行うため、追加の計算リソースとメモリリソースを要求します。しかし、(データがまだ完全にマージされていない可能性があるため)正確な結果を得るためにFINALを使用することが時々必要です。それはマージを強制する`OPTIMIZE`を実行するよりもコストが低いです。 + +`FINAL`を使用する代わりに、`MergeTree`エンジンのバックグラウンドプロセスがまだ発生していないと仮定し、集計を適用して(例えば、重複を破棄するなど)それに対処する異なるクエリを使用することが時々可能です。クエリで必要な結果を得るために`FINAL`を使用する必要がある場合、それを行うことは問題ありませんが、追加の処理が必要であることに注意してください。 + +すべてのテーブルにクエリを自動的に適用するために、セッションまたはユーザープロファイルで[FINAL](../../../operations/settings/settings.md#final)設定を使用して`FINAL`を適用することができます。 + +### 使用例 + +`FINAL`キーワードを使用する場合 + +```sql +SELECT x, y FROM mytable FINAL WHERE x > 1; +``` + +クエリレベルで`FINAL`を設定として使用する場合 + +```sql +SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1; +``` + +セッションレベルで`FINAL`を設定として使用する場合 + +```sql +SET final = 1; +SELECT x, y FROM mytable WHERE x > 1; +``` + +## 実装の詳細 + +`FROM`句が省略された場合、`system.one`テーブルからデータが読み取られます。 +`system.one`テーブルは正確に1行を含んでいます (このテーブルは他のDBMSsで見られるDUALテーブルと同じ目的を果たします)。 + +クエリを実行するために、クエリにリストされたすべてのカラムが適切なテーブルから抽出されます。外部クエリに必要のないカラムはサブクエリから捨てられます。 +クエリにカラムがリストされていない場合 (`SELECT count() FROM t`など)、いずれかのカラムがテーブルから抽出されます (できるだけ小さいものが好まれます)、行数を計算するためです。 diff --git a/docs/ja/sql-reference/statements/select/group-by.md b/docs/ja/sql-reference/statements/select/group-by.md new file mode 100644 index 00000000000..ec14c5bf963 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/group-by.md @@ -0,0 +1,391 @@ +--- +slug: /ja/sql-reference/statements/select/group-by +sidebar_label: GROUP BY +--- + +# GROUP BY句 + +`GROUP BY`句は`SELECT`クエリを集計モードに切り替え、以下のように機能します: + +- `GROUP BY`句には式のリスト(または長さ1のリストと見なされる単一の式)が含まれます。このリストは「グループ化キー」として機能し、それぞれの個々の式は「キー表現」と呼ばれます。 +- [SELECT](../../../sql-reference/statements/select/index.md)、[HAVING](../../../sql-reference/statements/select/having.md)、および[ORDER BY](../../../sql-reference/statements/select/order-by.md)句内のすべての式は、キー表現に基づいて計算されるか、非キー式(プレーンカラムを含む)上の[集約関数](../../../sql-reference/aggregate-functions/index.md)によって計算される**必要があります**。言い換えれば、テーブルから選択された各カラムは、キー表現または集約関数のいずれかの中で使用される必要があり、両方で使用されることはありません。 +- 集約された`SELECT`クエリの結果は、ソーステーブル内の「グループ化キー」のユニーク値の数だけ行を含みます。この処理は通常、行数を桁違いに減少させますが、必ずしもそうとは限りません:すべての「グループ化キー」値が異なっている場合、行数は同じままになります。 + +カラム名の代わりにカラム番号でテーブル内のデータをグループ化したい場合は、設定[enable_positional_arguments](../../../operations/settings/settings.md#enable-positional-arguments)を有効にします。 + +:::note +テーブルに対して集計を実行する追加の方法があります。クエリが集計関数内にテーブルカラムのみを含む場合、`GROUP BY句`を省略でき、キーの空の集合で集計が仮定されます。このようなクエリは常に1行のみを返します。 +::: + +## NULLの処理 + +グループ化において、ClickHouseは[NULL](../../../sql-reference/syntax.md#null-literal)を値として解釈し、`NULL==NULL`です。これは他の多くの文脈での`NULL`処理とは異なります。 + +これが何を意味するかを示す例を以下に示します。 + +次のようなテーブルがあると仮定します: + +``` text +┌─x─┬────y─┐ +│ 1 │ 2 │ +│ 2 │ ᴺᵁᴸᴸ │ +│ 3 │ 2 │ +│ 3 │ 3 │ +│ 3 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +クエリ`SELECT sum(x), y FROM t_null_big GROUP BY y`の結果は次のとおりです: + +``` text +┌─sum(x)─┬────y─┐ +│ 4 │ 2 │ +│ 3 │ 3 │ +│ 5 │ ᴺᵁᴸᴸ │ +└────────┴──────┘ +``` + +`y = NULL`に対する`GROUP BY`が`x`を合計したことがわかります。まるで`NULL`がこの値であるかのように。 + +`GROUP BY`に複数のキーを渡す場合、結果は選択のすべての組み合わせを提供します。`NULL`が特定の値であるかのように。 + +## ROLLUP修飾子 + +`ROLLUP`修飾子は、`GROUP BY`リスト内の順序に基づいてキー表現の小計を計算するために使用されます。小計行は結果テーブルの後に追加されます。 + +小計は逆順で計算されます:最初にリストの最後のキー表現に対して小計が計算され、次に前のキー表現に対して計算されるという具合に、最初のキー表現に至るまでです。 + +小計行では、既に「グループ化」されたキー表現の値が`0`または空の行に設定されます。 + +:::note +[HAVING](../../../sql-reference/statements/select/having.md)句が小計の結果に影響を与える可能性があることを理解してください。 +::: + +**例** + +テーブル`t`を考えます: + +```text +┌─year─┬─month─┬─day─┐ +│ 2019 │ 1 │ 5 │ +│ 2019 │ 1 │ 15 │ +│ 2020 │ 1 │ 5 │ +│ 2020 │ 1 │ 15 │ +│ 2020 │ 10 │ 5 │ +│ 2020 │ 10 │ 15 │ +└──────┴───────┴─────┘ +``` + +クエリ: + +```sql +SELECT year, month, day, count(*) FROM t GROUP BY ROLLUP(year, month, day); +``` +`GROUP BY`セクションに3つのキー表現があるため、結果には右から左に「ロールアップ」された4つの小計テーブルが含まれます: + +- `GROUP BY year, month, day`; +- `GROUP BY year, month`(そして`day`カラムはゼロで満たされています); +- `GROUP BY year`(そして今や`month, day`カラムはどちらもゼロで満たされています); +- そして合計(そして3つのキー表現のカラムはすべてゼロです)。 + +```text +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2020 │ 10 │ 15 │ 1 │ +│ 2020 │ 1 │ 5 │ 1 │ +│ 2019 │ 1 │ 5 │ 1 │ +│ 2020 │ 1 │ 15 │ 1 │ +│ 2019 │ 1 │ 15 │ 1 │ +│ 2020 │ 10 │ 5 │ 1 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2019 │ 1 │ 0 │ 2 │ +│ 2020 │ 1 │ 0 │ 2 │ +│ 2020 │ 10 │ 0 │ 2 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2019 │ 0 │ 0 │ 2 │ +│ 2020 │ 0 │ 0 │ 4 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 0 │ 0 │ 0 │ 6 │ +└──────┴───────┴─────┴─────────┘ +``` +このクエリは`WITH`キーワードを使用しても書くことができます。 +```sql +SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH ROLLUP; +``` + +**こちらも参照** + +- SQL標準互換性のための[group_by_use_nulls](/docs/ja/operations/settings/settings.md#group_by_use_nulls)設定。 + +## CUBE修飾子 + +`CUBE`修飾子は、`GROUP BY`リスト内のキー表現のあらゆる組み合わせに対して小計を計算するために使用されます。小計行は結果テーブルの後に追加されます。 + +小計行では、すべての「グループ化」キー表現の値を`0`または空の行に設定します。 + +:::note +[HAVING](../../../sql-reference/statements/select/having.md)句が小計の結果に影響を与える可能性があることを理解してください。 +::: + +**例** + +テーブル`t`を考えます: + +```text +┌─year─┬─month─┬─day─┐ +│ 2019 │ 1 │ 5 │ +│ 2019 │ 1 │ 15 │ +│ 2020 │ 1 │ 5 │ +│ 2020 │ 1 │ 15 │ +│ 2020 │ 10 │ 5 │ +│ 2020 │ 10 │ 15 │ +└──────┴───────┴─────┘ +``` + +クエリ: + +```sql +SELECT year, month, day, count(*) FROM t GROUP BY CUBE(year, month, day); +``` + +`GROUP BY`セクションに3つのキー表現があるため、結果には、すべてのキー表現の組み合わせに対する8つの小計テーブルが含まれます: + +- `GROUP BY year, month, day` +- `GROUP BY year, month` +- `GROUP BY year, day` +- `GROUP BY year` +- `GROUP BY month, day` +- `GROUP BY month` +- `GROUP BY day` +- そして合計。 + +`GROUP BY`から除外されたカラムはゼロで満たされます。 + +```text +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2020 │ 10 │ 15 │ 1 │ +│ 2020 │ 1 │ 5 │ 1 │ +│ 2019 │ 1 │ 5 │ 1 │ +│ 2020 │ 1 │ 15 │ 1 │ +│ 2019 │ 1 │ 15 │ 1 │ +│ 2020 │ 10 │ 5 │ 1 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2019 │ 1 │ 0 │ 2 │ +│ 2020 │ 1 │ 0 │ 2 │ +│ 2020 │ 10 │ 0 │ 2 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2020 │ 0 │ 5 │ 2 │ +│ 2019 │ 0 │ 5 │ 1 │ +│ 2020 │ 0 │ 15 │ 2 │ +│ 2019 │ 0 │ 15 │ 1 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 2019 │ 0 │ 0 │ 2 │ +│ 2020 │ 0 │ 0 │ 4 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 0 │ 1 │ 5 │ 2 │ +│ 0 │ 10 │ 15 │ 1 │ +│ 0 │ 10 │ 5 │ 1 │ +│ 0 │ 1 │ 15 │ 2 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 0 │ 1 │ 0 │ 4 │ +│ 0 │ 10 │ 0 │ 2 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 0 │ 0 │ 5 │ 3 │ +│ 0 │ 0 │ 15 │ 3 │ +└──────┴───────┴─────┴─────────┘ +┌─year─┬─month─┬─day─┬─count()─┐ +│ 0 │ 0 │ 0 │ 6 │ +└──────┴───────┴─────┴─────────┘ +``` +このクエリは`WITH`キーワードを使用しても書くことができます。 +```sql +SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH CUBE; +``` + +**こちらも参照** + +- SQL標準互換性のための[group_by_use_nulls](/docs/ja/operations/settings/settings.md#group_by_use_nulls)設定。 + +## WITH TOTALS修飾子 + +`WITH TOTALS`修飾子が指定されている場合、追加の行が計算されます。この行は、キー列にデフォルト値(ゼロや空行)が含まれ、集約関数の列にはすべての行を含む「合計」値が計算されます。 + +この追加の行は、`JSON*`、`TabSeparated*`、および `Pretty*`フォーマットでのみ、他の行とは別に生成されます: + +- `XML`および`JSON*`フォーマットでは、この行は個別の‘totals’フィールドとして出力されます。 +- `TabSeparated*`、`CSV*` および `Vertical` フォーマットでは、空行の後(他のデータ後)に続いて主要な結果の後に行が来ます。 +- `Pretty*`フォーマットでは、この行は主要な結果の後に別のテーブルとして出力されます。 +- `Template`フォーマットでは、指定されたテンプレートに従って行が出力されます。 +- その他のフォーマットでは利用できません。 + +:::note +totalsは`SELECT`クエリの結果に出力され、`INSERT INTO ... SELECT`では出力されません。 +::: + +[HAVING](../../../sql-reference/statements/select/having.md)が存在する場合、`WITH TOTALS`は異なる方法で実行できます。この動作は`totals_mode`設定に依存します。 + +### 合計処理の設定 + +デフォルトでは、`totals_mode = 'before_having'`です。この場合、‘totals’は、HAVINGおよび`max_rows_to_group_by`を通過しなかったすべての行を含めて計算されます。 + +他の選択肢は、HAVINGを通過した行のみを‘totals’に含め、`max_rows_to_group_by`と`group_by_overflow_mode = 'any'`を持つ場合に異なる動作をします。 + +`after_having_exclusive` – `max_rows_to_group_by`を通過しなかった行は含まれません。言い換えれば、‘totals’は`max_rows_to_group_by`が省略された場合よりも少ないか、同じ数の行を持ちます。 + +`after_having_inclusive` – ‘totals’に‘max_rows_to_group_by’を通過しなかったすべての行を含めます。言い換えれば、‘totals’は`max_rows_to_group_by`が省略された場合よりも多くの行を持つことがあります。 + +`after_having_auto` – HAVINGを通過した行の数を数えます。デフォルトで50%以上の場合、‘totals’に‘max_rows_to_group_by’を通過しなかったすべての行を含めます。そうでなければ、それらを含めません。 + +`totals_auto_threshold` – デフォルトでは0.5。`after_having_auto`の係数。 + +`max_rows_to_group_by`と`group_by_overflow_mode = 'any'`が使用されていない場合、`after_having`のすべてのバリエーションは同じであり、どれを使用してもかまいません(例えば、`after_having_auto`)。 + +[JOIN](../../../sql-reference/statements/select/join.md)句内の副問合せも含めて、副問合せで`WITH TOTALS`を使用できます(この場合、対応する合計値が結合されます)。 + +## GROUP BY ALL + +`GROUP BY ALL`は、集計関数ではないSELECTされたすべての式をリストすることと同等です。 + +例えば: + +``` sql +SELECT + a * 2, + b, + count(c), +FROM t +GROUP BY ALL +``` + +は + +``` sql +SELECT + a * 2, + b, + count(c), +FROM t +GROUP BY a * 2, b +``` + +と同じです。 + +概算特殊なケースとして、集計関数と他のフィールドがその引数としてある関数がある場合、`GROUP BY`キーには最大の非集計フィールドが含まれます。 + +例えば: + +``` sql +SELECT + substring(a, 4, 2), + substring(substring(a, 1, 2), 1, count(b)) +FROM t +GROUP BY ALL +``` + +は + +``` sql +SELECT + substring(a, 4, 2), + substring(substring(a, 1, 2), 1, count(b)) +FROM t +GROUP BY substring(a, 4, 2), substring(a, 1, 2) +``` + +と同じです。 + +## 例 + +例: + +``` sql +SELECT + count(), + median(FetchTiming > 60 ? 60 : FetchTiming), + count() - sum(Refresh) +FROM hits +``` + +標準SQLに準拠するMySQLとは異なり、キーまたは集約関数にないカラムの値を取得することはできません(定数式を除く)。これを回避するには、「any」集約関数(最初に出現した値を取得)または「min/max」を使用できます。 + +例: + +``` sql +SELECT + domainWithoutWWW(URL) AS domain, + count(), + any(Title) AS title -- 各ドメインの最初に見つかったページヘッダーを取得。 +FROM hits +GROUP BY domain +``` + +異なるキー値が見つかるたびに、`GROUP BY`は集計関数のセットを計算します。 + +## GROUPING SETS修飾子 + +これは最も一般的な修飾子です。 +この修飾子は、いくつかの集計キーセット(グルーピングセット)を手動で指定することを可能にします。 +集計はそれぞれのグルーピングセットに対して個別に行われ、その後、すべての結果が結合されます。 +グルーピングセットにカラムが存在しない場合、それはデフォルト値で満たされます。 + +言い換えれば、上で説明した修飾子は`GROUPING SETS`を使って表現できます。 +`ROLLUP`、`CUBE`、および`GROUPING SETS`修飾子を持つクエリは文法的に等しいですが、異なるパフォーマンスを示す可能性があります。 +`GROUPING SETS`がすべてを並行して実行しようとするとき、`ROLLUP`および`CUBE`が集計の最終マージを単一スレッドで実行します。 + +ソースの列がデフォルト値を含む状況では、行がこれらの列をキーとして使用する集計の一部であるかどうかを見分けるのが難しいかもしれません。 +この問題を解決するために、`GROUPING`関数を使用してください。 + +**例** + +次の2つのクエリは同等です。 + +```sql +-- クエリ1 +SELECT year, month, day, count(*) FROM t GROUP BY year, month, day WITH ROLLUP; + +-- クエリ2 +SELECT year, month, day, count(*) FROM t GROUP BY +GROUPING SETS +( + (year, month, day), + (year, month), + (year), + () +); +``` + +**こちらも参照** + +- SQL標準互換性のための[group_by_use_nulls](/docs/ja/operations/settings/settings.md#group_by_use_nulls)設定。 + +## 実装詳細 + +集計は列指向DBMSの最も重要な機能のひとつであり、それゆえにClickHouseの最も最適化された部分のひとつです。デフォルトでは、集計はメモリ内でハッシュテーブルを使用して行われます。これは40以上の特殊化を持ち、「グループ化キー」のデータ型に依存して自動的に選択されます。 + +### テーブルのソートキーに基づくGROUP BYの最適化 + +テーブルがあるキーでソートされ、`GROUP BY`式がソートキーまたは単射関数の少なくとも接頭辞を含む場合、集計はより効果的に行われます。この場合、テーブルから新しいキーが読み込まれると、集計の中間結果を確定してクライアントに送信することができます。この動作は[optimize_aggregation_in_order](../../../operations/settings/settings.md#optimize_aggregation_in_order)設定で切り替えられます。この最適化は集計中のメモリ使用量を減少させますが、場合によってはクエリの実行を遅くすることがあります。 + +### 外部メモリでのGROUP BY + +`GROUP BY`中のメモリ使用量を制限するために、一時データをディスクに書き出すことができます。[max_bytes_before_external_group_by](../../../operations/settings/query-complexity.md#settings-max_bytes_before_external_group_by)設定は`GROUP BY`の一時データをファイルシステムに書き出すためのRAM消費のしきい値を決定します。0に設定すると(デフォルト)、無効になります。 + +`max_bytes_before_external_group_by`を使用する場合、`max_memory_usage`を2倍程度高く設定することをお勧めします。これは、データを読み込んで中間データを形成する段階(1)と中間データをマージする段階(2)の2つの段階があるためです。一時データの書き出しは段階1でしか発生しません。もし一時データが書き出されなかった場合、段階2では段階1と同じ量のメモリを必要とする可能性があります。 + +例えば、[max_memory_usage](../../../operations/settings/query-complexity.md#settings_max_memory_usage)が10000000000に設定されており、外部集計を使用したい場合、`max_bytes_before_external_group_by`を10000000000に、`max_memory_usage`を20000000000に設定することが妥当です。外部集計がトリガされるとき(少なくとも一度の一時データの書き出しがあった場合)、RAMの最大消費量は`max_bytes_before_external_group_by`よりわずかに多い程度です。 + +分散クエリ処理を使用する場合、外部集計はリモートサーバーで実行されます。リクエスタサーバーが少量のRAMを使用するだけで済むようにするために、`distributed_aggregation_memory_efficient`を1に設定します。 + +ディスクに書き出されたデータをマージする際、および`distributed_aggregation_memory_efficient`設定が有効な場合にリモートサーバーからの結果をマージする際は、合計RAMの`1/256 * スレッド数`まで消費します。 + +外部集計が有効な場合、`max_bytes_before_external_group_by`以下のデータが存在した場合(つまりデータが書き出されなかった場合)、クエリは外部集計なしと同様に高速で実行されます。一時データが書き出された場合、実行時間は数倍(約三倍)長くなります。 + +`GROUP BY`後に`ORDER BY`があり、[LIMIT](../../../sql-reference/statements/select/limit.md)が指定されている場合、使用されるRAMの量はテーブル全体ではなく`LIMIT`内のデータ量に依存します。しかし、`ORDER BY`に`LIMIT`がない場合、外部ソート(`max_bytes_before_external_sort`)を有効にすることを忘れないでください。 diff --git a/docs/ja/sql-reference/statements/select/having.md b/docs/ja/sql-reference/statements/select/having.md new file mode 100644 index 00000000000..cccbfb95c09 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/having.md @@ -0,0 +1,14 @@ +--- +slug: /ja/sql-reference/statements/select/having +sidebar_label: HAVING +--- + +# HAVING句 + +[GROUP BY](../../../sql-reference/statements/select/group-by.md)によって生成された集計結果をフィルタリングすることができます。これは[WHERE](../../../sql-reference/statements/select/where.md)句に似ていますが、`WHERE`が集計の前に実行されるのに対し、`HAVING`は集計の後に実行される点が異なります。 + +`HAVING`句では、`SELECT`句で使われたエイリアスを参照することで集計結果をフィルタリングすることができます。また、クエリ結果に返されない追加の集計結果を基にフィルタリングすることも可能です。 + +## 制限事項 + +集計が行われない場合、`HAVING`を使用することはできません。この場合は`WHERE`を使用してください。 diff --git a/docs/ja/sql-reference/statements/select/index.md b/docs/ja/sql-reference/statements/select/index.md new file mode 100644 index 00000000000..70ee369a3d5 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/index.md @@ -0,0 +1,287 @@ +--- +slug: /ja/sql-reference/statements/select/ +sidebar_position: 32 +sidebar_label: SELECT +--- + +# SELECT クエリ + +`SELECT` クエリはデータの取得を行います。デフォルトでは要求されたデータはクライアントに返されますが、[INSERT INTO](../../../sql-reference/statements/insert-into.md)と併用することで、異なるテーブルに転送することも可能です。 + +## 構文 + +``` sql +[WITH expr_list|(subquery)] +SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list +[FROM [db.]table | (subquery) | table_function] [FINAL] +[SAMPLE sample_coeff] +[ARRAY JOIN ...] +[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON )|(USING ) +[PREWHERE expr] +[WHERE expr] +[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS] +[HAVING expr] +[WINDOW window_expr_list] +[QUALIFY expr] +[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]] +[LIMIT [offset_value, ]n BY columns] +[LIMIT [n, ]m] [WITH TIES] +[SETTINGS ...] +[UNION ...] +[INTO OUTFILE filename [COMPRESSION type [LEVEL level]] ] +[FORMAT format] +``` + +すべての句はオプションですが、`SELECT`の直後に必要な式のリストは[下記](#select-clause)で詳しく説明されています。 + +各オプション句の詳細は、実行順に書かれている別のセクションで説明されています: + +- [WITH句](../../../sql-reference/statements/select/with.md) +- [SELECT句](#select-clause) +- [DISTINCT句](../../../sql-reference/statements/select/distinct.md) +- [FROM句](../../../sql-reference/statements/select/from.md) +- [SAMPLE句](../../../sql-reference/statements/select/sample.md) +- [JOIN句](../../../sql-reference/statements/select/join.md) +- [PREWHERE句](../../../sql-reference/statements/select/prewhere.md) +- [WHERE句](../../../sql-reference/statements/select/where.md) +- [GROUP BY句](../../../sql-reference/statements/select/group-by.md) +- [LIMIT BY句](../../../sql-reference/statements/select/limit-by.md) +- [HAVING句](../../../sql-reference/statements/select/having.md) +- [QUALIFY句](../../../sql-reference/statements/select/qualify.md) +- [LIMIT句](../../../sql-reference/statements/select/limit.md) +- [OFFSET句](../../../sql-reference/statements/select/offset.md) +- [UNION句](../../../sql-reference/statements/select/union.md) +- [INTERSECT句](../../../sql-reference/statements/select/intersect.md) +- [EXCEPT句](../../../sql-reference/statements/select/except.md) +- [INTO OUTFILE句](../../../sql-reference/statements/select/into-outfile.md) +- [FORMAT句](../../../sql-reference/statements/select/format.md) + +## SELECT句 + +[式](../../../sql-reference/syntax.md#syntax-expressions) は、上記で説明したすべての句の操作完了後に `SELECT` 句で計算されます。これらの式は、結果に含まれる別々の行に対して適用されるかのように機能します。`SELECT`句に含まれる式が集計関数を含んでいる場合、ClickHouseは[GROUP BY](../../../sql-reference/statements/select/group-by.md) 集計中にこれらの集計関数とその引数として使用される式を処理します。 + +すべてのカラムを結果に含めたい場合は、アスタリスク (`*`) 記号を使用します。例えば、`SELECT * FROM ...` とします。 + +### 動的カラム選択 + +動的カラム選択(COLUMNS式とも呼ばれます)は、結果のいくつかのカラムを[re2](https://en.wikipedia.org/wiki/RE2_(software))正規表現でマッチさせることができます。 + +``` sql +COLUMNS('regexp') +``` + +例えば、次のテーブルを考えてみます: + +``` sql +CREATE TABLE default.col_names (aa Int8, ab Int8, bc Int8) ENGINE = TinyLog +``` + +以下のクエリは、名前に `a` が含まれるすべてのカラムからデータを選択します。 + +``` sql +SELECT COLUMNS('a') FROM col_names +``` + +``` text +┌─aa─┬─ab─┐ +│ 1 │ 1 │ +└────┴────┘ +``` + +選択されたカラムはアルファベット順には返されません。 + +クエリ内で複数の `COLUMNS` 式を使用し、関数をそれに適用することもできます。 + +例えば: + +``` sql +SELECT COLUMNS('a'), COLUMNS('c'), toTypeName(COLUMNS('c')) FROM col_names +``` + +``` text +┌─aa─┬─ab─┬─bc─┬─toTypeName(bc)─┐ +│ 1 │ 1 │ 1 │ Int8 │ +└────┴────┴────┴────────────────┘ +``` + +`COLUMNS` 式で返された各カラムは、別々の引数として関数に渡されます。また、関数がサポートしている場合は他の引数を関数に渡すこともできます。関数を使用する際は注意が必要です。関数が渡された引数の数をサポートしていない場合、ClickHouseは例外をスローします。 + +例えば: + +``` sql +SELECT COLUMNS('a') + COLUMNS('c') FROM col_names +``` + +``` text +Received exception from server (version 19.14.1): +Code: 42. DB::Exception: Received from localhost:9000. DB::Exception: Number of arguments for function plus does not match: passed 3, should be 2. +``` + +この例では、`COLUMNS('a')` は2つのカラム `aa` と `ab` を返します。`COLUMNS('c')` は `bc` カラムを返します。`+` 演算子は3つの引数に適用できないため、ClickHouseは関連するメッセージとともに例外をスローします。 + +`COLUMNS` にマッチしたカラムは異なるデータ型を持つことがあります。`COLUMNS` が何のカラムにもマッチせず、`SELECT`の唯一の式である場合、ClickHouse は例外をスローします。 + +### アスタリスク + +クエリのいかなる部分にもアスタリスクを式の代わりに置くことができます。クエリが解析されると、アスタリスクはすべてのテーブルカラムのリストに展開されます(`MATERIALIZED` および `ALIAS` カラムを除く)。アスタリスクの使用が正当化されるのはわずかなケースのみです: + +- テーブルのダンプを作成する場合。 +- 数少ないカラムしか持たないテーブル、たとえばシステムテーブルの場合。 +- テーブルにどのカラムが含まれているかの情報を取得する場合。この場合、 `LIMIT 1` を設定してください。しかし、`DESC TABLE` クエリを使用する方が良いです。 +- `PREWHERE` を用いて少数のカラムに強いフィルタをかける場合。 +- サブクエリ内(外部クエリに必要でないカラムはサブクエリから除外されるため)。 + +これら以外のケースでは、アスタリスクの使用は推奨されません。列指向DBMSの利点を活かすのではなく、逆に不利をもたらすからです。つまり、アスタリスクの使用は推奨されません。 + +### Extreme Values + +結果に加えて、結果カラムの最小値と最大値も取得できます。これを行うには、**extremes** 設定を1に設定します。最小値と最大値は数値型、日付、日時について計算されます。他のカラムについてはデフォルト値が出力されます。 + +追加の2行が計算されます。最小値と最大値のそれぞれです。これらの追加の2行は、他の行とは別に`XML`、`JSON*`、`TabSeparated*`、`CSV*`、`Vertical`、`Template` および `Pretty*` [format](../../../interfaces/formats.md)で出力されます。他のフォーマットでは出力されません。 + +`JSON*` および `XML` フォーマットでは、極値は別の ‘extremes’ フィールドで出力されます。`TabSeparated*`、`CSV*` および `Vertical` フォーマットでは、主要な結果の後、もし ‘totals’ が存在する場合はその後に行が空の行の後に出力されます。`Pretty*` フォーマットでは、行が主要な結果の後、もし `totals` が存在する場合はそれに続いて別のテーブルとして出力されます。`Template` フォーマットでは指定されたテンプレートに従って極値が出力されます。 + +極値は `LIMIT` の前に行に対して計算されますが、`LIMIT BY` の後に計算されます。しかし、`LIMIT offset, size` を使用している場合、`offset` 前の行も `extremes` に含まれます。ストリームリクエストでは、結果は `LIMIT` を通過した少数の行を含むこともあります。 + +### 注意事項 + +クエリのどの部分でも別名(`AS`エイリアス)を使用できます。 + +`GROUP BY`、`ORDER BY` および `LIMIT BY` 句は位置引数をサポートすることができます。これを有効にするには、[enable_positional_arguments](../../../operations/settings/settings.md#enable-positional-arguments)設定をオンにします。たとえば、`ORDER BY 1,2` はテーブルの最初の、次に2番目のカラムで行をソートします。 + +## 実装の詳細 + +クエリが `DISTINCT`、`GROUP BY` および `ORDER BY` 句と `IN` および `JOIN` サブクエリを省略した場合、クエリは完全にストリーム処理され、O(1) のRAM量を使用します。それ以外の場合、適切な制限が指定されていないとクエリは大量のRAMを消費する可能性があります: + +- `max_memory_usage` +- `max_rows_to_group_by` +- `max_rows_to_sort` +- `max_rows_in_distinct` +- `max_bytes_in_distinct` +- `max_rows_in_set` +- `max_bytes_in_set` +- `max_rows_in_join` +- `max_bytes_in_join` +- `max_bytes_before_external_sort` +- `max_bytes_before_external_group_by` + +詳細については、「設定」セクションを参照してください。外部ソート(ディスクへの一時テーブルの保存)および外部集計を使用することが可能です。 + +## SELECT修飾子 + +`SELECT` クエリで次の修飾子を使用できます。 + +### APPLY + +クエリの外部テーブル式によって返される各行に対して関数を呼び出すことができます。 + +**構文:** + +``` sql +SELECT APPLY( ) FROM [db.]table_name +``` + +**例:** + +``` sql +CREATE TABLE columns_transformers (i Int64, j Int16, k Int64) ENGINE = MergeTree ORDER by (i); +INSERT INTO columns_transformers VALUES (100, 10, 324), (120, 8, 23); +SELECT * APPLY(sum) FROM columns_transformers; +``` + +``` +┌─sum(i)─┬─sum(j)─┬─sum(k)─┐ +│ 220 │ 18 │ 347 │ +└────────┴────────┴────────┘ +``` + +### EXCEPT + +結果から除外する一つまたは複数のカラム名を指定します。すべての一致するカラム名が出力から省略されます。 + +**構文:** + +``` sql +SELECT EXCEPT ( col_name1 [, col_name2, col_name3, ...] ) FROM [db.]table_name +``` + +**例:** + +``` sql +SELECT * EXCEPT (i) from columns_transformers; +``` + +``` +┌──j─┬───k─┐ +│ 10 │ 324 │ +│ 8 │ 23 │ +└────┴─────┘ +``` + +### REPLACE + +[式のエイリアス](../../../sql-reference/syntax.md#syntax-expression_aliases)を一つまたは複数指定します。それぞれのエイリアスは `SELECT *` 文のカラム名と一致しなければなりません。出力カラムリストでは、エイリアスに一致するカラムがその `REPLACE` に表現された式で置き換えられます。 + +この修飾子はカラム名や順序を変更しません。ただし、値や値の型を変更することがあります。 + +**構文:** + +``` sql +SELECT REPLACE( AS col_name) from [db.]table_name +``` + +**例:** + +``` sql +SELECT * REPLACE(i + 1 AS i) from columns_transformers; +``` + +``` +┌───i─┬──j─┬───k─┐ +│ 101 │ 10 │ 324 │ +│ 121 │ 8 │ 23 │ +└─────┴────┴─────┘ +``` + +### 修飾子の組み合わせ + +各修飾子を個別に使用することも、組み合わせて使用することもできます。 + +**例**: + +同じ修飾子を複数回使用する。 + +``` sql +SELECT COLUMNS('[jk]') APPLY(toString) APPLY(length) APPLY(max) from columns_transformers; +``` + +``` +┌─max(length(toString(j)))─┬─max(length(toString(k)))─┐ +│ 2 │ 3 │ +└──────────────────────────┴──────────────────────────┘ +``` + +単一のクエリで複数の修飾子を使用する。 + +``` sql +SELECT * REPLACE(i + 1 AS i) EXCEPT (j) APPLY(sum) from columns_transformers; +``` + +``` +┌─sum(plus(i, 1))─┬─sum(k)─┐ +│ 222 │ 347 │ +└─────────────────┴────────┘ +``` + +## SELECT クエリでの SETTINGS + +必要な設定を `SELECT` クエリ内で指定できます。この設定値はこのクエリにのみ適用され、クエリの実行が終了するとデフォルト値または以前の値にリセットされます。 + +他の設定方法については[こちら](../../../operations/settings/index.md)を参照してください。 + +**例** + +``` sql +SELECT * FROM some_table SETTINGS optimize_read_in_order=1, cast_keep_nullable=1; +``` + diff --git a/docs/ja/sql-reference/statements/select/intersect.md b/docs/ja/sql-reference/statements/select/intersect.md new file mode 100644 index 00000000000..f33397c74f8 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/intersect.md @@ -0,0 +1,155 @@ +--- +slug: /ja/sql-reference/statements/select/intersect +sidebar_label: INTERSECT +--- + +# INTERSECT句 + +`INTERSECT`句は、最初のクエリと2番目のクエリの両方の結果からのみ行が返されます。クエリはカラムの数、順序、型が一致している必要があります。`INTERSECT`の結果には重複する行を含むことがあります。 + +複数の`INTERSECT`文は、括弧が指定されていない場合、左から右に実行されます。`INTERSECT`演算子は、`UNION`および`EXCEPT`句よりも優先順位が高いです。 + +``` sql +SELECT column1 [, column2 ] +FROM table1 +[WHERE condition] + +INTERSECT + +SELECT column1 [, column2 ] +FROM table2 +[WHERE condition] +``` + +条件は、要求に基づく任意の式にすることができます。 + +## 例 + +以下は、1から10までの数字と3から8までの数字をインターセクトする簡単な例です: + +```sql +SELECT number FROM numbers(1,10) INTERSECT SELECT number FROM numbers(3,8); +``` + +結果: + +```response +┌─number─┐ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +└────────┘ +``` + +`INTERSECT`は、共通のカラムを持つ2つのテーブルがある場合に便利です。その結果が同じカラムを含む限り、2つのクエリの結果をインターセクトすることができます。例えば、数百万行の暗号通貨取引価格と取引量の履歴データがあるとします: + +```sql +CREATE TABLE crypto_prices +( + trade_date Date, + crypto_name String, + volume Float32, + price Float32, + market_cap Float32, + change_1_day Float32 +) +ENGINE = MergeTree +PRIMARY KEY (crypto_name, trade_date); + +INSERT INTO crypto_prices + SELECT * + FROM s3( + 'https://learn-clickhouse.s3.us-east-2.amazonaws.com/crypto_prices.csv', + 'CSVWithNames' +); + +SELECT * FROM crypto_prices +WHERE crypto_name = 'Bitcoin' +ORDER BY trade_date DESC +LIMIT 10; +``` + +```response +┌─trade_date─┬─crypto_name─┬──────volume─┬────price─┬───market_cap─┬──change_1_day─┐ +│ 2020-11-02 │ Bitcoin │ 30771456000 │ 13550.49 │ 251119860000 │ -0.013585099 │ +│ 2020-11-01 │ Bitcoin │ 24453857000 │ 13737.11 │ 254569760000 │ -0.0031840964 │ +│ 2020-10-31 │ Bitcoin │ 30306464000 │ 13780.99 │ 255372070000 │ 0.017308505 │ +│ 2020-10-30 │ Bitcoin │ 30581486000 │ 13546.52 │ 251018150000 │ 0.008084608 │ +│ 2020-10-29 │ Bitcoin │ 56499500000 │ 13437.88 │ 248995320000 │ 0.012552661 │ +│ 2020-10-28 │ Bitcoin │ 35867320000 │ 13271.29 │ 245899820000 │ -0.02804481 │ +│ 2020-10-27 │ Bitcoin │ 33749879000 │ 13654.22 │ 252985950000 │ 0.04427984 │ +│ 2020-10-26 │ Bitcoin │ 29461459000 │ 13075.25 │ 242251000000 │ 0.0033826586 │ +│ 2020-10-25 │ Bitcoin │ 24406921000 │ 13031.17 │ 241425220000 │ -0.0058658565 │ +│ 2020-10-24 │ Bitcoin │ 24542319000 │ 13108.06 │ 242839880000 │ 0.013650347 │ +└────────────┴─────────────┴─────────────┴──────────┴──────────────┴───────────────┘ +``` + +次に、所有する暗号通貨のリストとコインの数量を含む`holdings`というテーブルがあると仮定します: + +```sql +CREATE TABLE holdings +( + crypto_name String, + quantity UInt64 +) +ENGINE = MergeTree +PRIMARY KEY (crypto_name); + +INSERT INTO holdings VALUES + ('Bitcoin', 1000), + ('Bitcoin', 200), + ('Ethereum', 250), + ('Ethereum', 5000), + ('DOGEFI', 10); + ('Bitcoin Diamond', 5000); +``` + +`INTERSECT`を使って、**"所有するコインの中で価格が100ドルを超えた取引があったものはどれか?"**と言った質問に答えることができます: + +```sql +SELECT crypto_name FROM holdings +INTERSECT +SELECT crypto_name FROM crypto_prices +WHERE price > 100 +``` + +結果: + +```response +┌─crypto_name─┐ +│ Bitcoin │ +│ Bitcoin │ +│ Ethereum │ +│ Ethereum │ +└─────────────┘ +``` + +これは、ビットコインとイーサリアムが一時期に100ドルを超えて取引されたことを意味し、DOGEFIとBitcoin Diamondは100ドルを超える取引が発生したことがないことを示しています(この例のデータに基づく)。 + +## INTERSECT DISTINCT + +前のクエリでは、100ドル以上で取引されたビットコインとイーサリアムの所有量が複数回出現しています。重複した行を削除するには(知っていることをただ繰り返しているだけなので)、`INTERSECT`に`DISTINCT`を追加できます: + +```sql +SELECT crypto_name FROM holdings +INTERSECT DISTINCT +SELECT crypto_name FROM crypto_prices +WHERE price > 100; +``` + +結果: + +```response +┌─crypto_name─┐ +│ Bitcoin │ +│ Ethereum │ +└─────────────┘ +``` + +**関連項目** + +- [UNION](union.md#union-clause) +- [EXCEPT](except.md#except-clause) diff --git a/docs/ja/sql-reference/statements/select/into-outfile.md b/docs/ja/sql-reference/statements/select/into-outfile.md new file mode 100644 index 00000000000..513d8f4d3b6 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/into-outfile.md @@ -0,0 +1,44 @@ +--- +slug: /ja/sql-reference/statements/select/into-outfile +sidebar_label: INTO OUTFILE +--- + +# INTO OUTFILE 節 + +`INTO OUTFILE` 節は、`SELECT` クエリの結果を**クライアント**側のファイルにリダイレクトします。 + +圧縮ファイルがサポートされています。圧縮タイプはファイル名の拡張子によって検出されます(デフォルトで `'auto'` モードが使用されます)。また、`COMPRESSION` 節で明示的に指定することもできます。特定の圧縮タイプに対する圧縮レベルは、`LEVEL` 節で指定できます。 + +**構文** + +```sql +SELECT INTO OUTFILE file_name [AND STDOUT] [APPEND | TRUNCATE] [COMPRESSION type [LEVEL level]] +``` + +`file_name` および `type` は文字列リテラルです。サポートされている圧縮タイプは、`'none'`, `'gzip'`, `'deflate'`, `'br'`, `'xz'`, `'zstd'`, `'lz4'`, `'bz2'` です。 + +`level` は数値リテラルです。次の範囲の正の整数がサポートされています:`lz4` タイプの場合 `1-12`、`zstd` タイプの場合 `1-22`、その他の圧縮タイプの場合 `1-9`。 + +## 実装の詳細 + +- この機能は、[コマンドラインクライアント](../../../interfaces/cli.md)および[clickhouse-local](../../../operations/utilities/clickhouse-local.md)で使用可能です。そのため、[HTTP インターフェース](../../../interfaces/http.md)経由で送信されたクエリは失敗します。 +- 同じファイル名のファイルが既に存在する場合、クエリは失敗します。 +- デフォルトの[出力フォーマット](../../../interfaces/formats.md)は `TabSeparated` です(コマンドラインクライアントのバッチモードと同様)。変更するには [FORMAT](format.md) 節を使用します。 +- クエリに `AND STDOUT` が記載されている場合、ファイルに書き込まれた出力は標準出力にも表示されます。圧縮が使用されている場合は、平文が標準出力に表示されます。 +- クエリに `APPEND` が記載されている場合、出力は既存のファイルに追加されます。圧縮が使用されている場合、追加は使用できません。 +- 既に存在するファイルに書き込む場合、`APPEND` または `TRUNCATE` を使用する必要があります。 + +**例** + +次のクエリを [コマンドラインクライアント](../../../interfaces/cli.md)で実行します: + +```bash +clickhouse-client --query="SELECT 1,'ABC' INTO OUTFILE 'select.gz' FORMAT CSV;" +zcat select.gz +``` + +結果: + +```text +1,"ABC" +``` diff --git a/docs/ja/sql-reference/statements/select/join.md b/docs/ja/sql-reference/statements/select/join.md new file mode 100644 index 00000000000..f086269478e --- /dev/null +++ b/docs/ja/sql-reference/statements/select/join.md @@ -0,0 +1,525 @@ +--- +slug: /ja/sql-reference/statements/select/join +sidebar_label: Join Table +--- + +# JOIN句 + +**JOIN**は、共通の値を使用して複数のテーブルの**カラム**を組み合わせることで、新しいテーブルを生成します。これは、SQLをサポートするデータベースで一般的な操作であり、[関係代数](https://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators)の結合に対応します。1つのテーブル内での結合の特別なケースは、「自己結合」と呼ばれることがよくあります。 + +**構文** + +``` sql +SELECT +FROM +[GLOBAL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI|ANY|ALL|ASOF] JOIN +(ON )|(USING ) ... +``` + +`ON`句からの式と`USING`句からの**カラム**は「結合キー」と呼ばれます。特に指定がない限り、結合は一致する「結合キー」を持つ**行**からの[直積](https://en.wikipedia.org/wiki/Cartesian_product)を生成し、元のテーブルよりもはるかに多くの**行**を持つ結果を生成する可能性があります。 + +## 関連コンテンツ + +- ブログ: [ClickHouse: A Blazingly Fast DBMS with Full SQL Join Support - Part 1](https://clickhouse.com/blog/clickhouse-fully-supports-joins) +- ブログ: [ClickHouse: A Blazingly Fast DBMS with Full SQL Join Support - Under the Hood - Part 2](https://clickhouse.com/blog/clickhouse-fully-supports-joins-hash-joins-part2) +- ブログ: [ClickHouse: A Blazingly Fast DBMS with Full SQL Join Support - Under the Hood - Part 3](https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3) +- ブログ: [ClickHouse: A Blazingly Fast DBMS with Full SQL Join Support - Under the Hood - Part 4](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4) + +## サポートされるJOINの種類 + +全ての標準[SQL JOIN](https://en.wikipedia.org/wiki/Join_(SQL))タイプがサポートされています: + +- `INNER JOIN`: 一致する**行**のみが返されます。 +- `LEFT OUTER JOIN`: 左テーブルからの非一致行も一致した**行**と共に返されます。 +- `RIGHT OUTER JOIN`: 右テーブルからの非一致行も一致した**行**と共に返されます。 +- `FULL OUTER JOIN`: 両テーブルからの非一致行も一致した**行**と共に返されます。 +- `CROSS JOIN`: テーブル全体の直積を生成し、「結合キー」は**指定しません**。 + +`JOIN`でタイプが指定されていない場合、`INNER`が暗黙に適用されます。キーワード`OUTER`は省略可能です。`CROSS JOIN`の代替構文として[FROM句](../../../sql-reference/statements/select/from.md)で複数のテーブルをカンマで区切って指定することもできます。 + +ClickHouseで利用可能な追加の結合タイプ: + +- `LEFT SEMI JOIN`と`RIGHT SEMI JOIN`: 「結合キー」のホワイトリストを生成し、直積を生成しません。 +- `LEFT ANTI JOIN`と`RIGHT ANTI JOIN`: 「結合キー」のブラックリストを生成し、直積を生成しません。 +- `LEFT ANY JOIN`, `RIGHT ANY JOIN`と`INNER ANY JOIN`: 標準的な`JOIN`タイプの直積を部分的(`LEFT`と`RIGHT`の反対側)または完全(`INNER`と`FULL`)に無効にします。 +- `ASOF JOIN`と`LEFT ASOF JOIN`: 厳密でない一致でシーケンスを結合します。`ASOF JOIN`の使用法については以下で説明します。 +- `PASTE JOIN`: 2つのテーブルを水平方向に結合します。 + +:::note +`join_algorithm`が`partial_merge`に設定されている場合、`RIGHT JOIN`と`FULL JOIN`は`ALL`厳密性(`SEMI`, `ANTI`, `ANY`, `ASOF`はサポートされていません)のみサポートされます。 +::: + +## 設定 + +デフォルトの結合タイプは[join_default_strictness](../../../operations/settings/settings.md#join_default_strictness)設定を使用してオーバーライドすることができます。 + +`ANY JOIN`操作に対するClickHouseサーバーの動作は[any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys)設定に依存します。 + +**参照** + +- [join_algorithm](../../../operations/settings/settings.md#join_algorithm) +- [join_any_take_last_row](../../../operations/settings/settings.md#join_any_take_last_row) +- [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) +- [partial_merge_join_optimizations](../../../operations/settings/settings.md#partial_merge_join_optimizations) +- [partial_merge_join_rows_in_right_blocks](../../../operations/settings/settings.md#partial_merge_join_rows_in_right_blocks) +- [join_on_disk_max_files_to_merge](../../../operations/settings/settings.md#join_on_disk_max_files_to_merge) +- [any_join_distinct_right_table_keys](../../../operations/settings/settings.md#any_join_distinct_right_table_keys) + +ClickHouseが`CROSS JOIN`を`INNER JOIN`として書き直すのに失敗した時の動作を定義するために、`cross_to_inner_join_rewrite`設定を使用してください。デフォルト値は`1`であり、これにより結合は継続されますが、遅くなります。エラーを発生させたい場合は`cross_to_inner_join_rewrite`を`0`に設定し、全てのカンマ/クロス結合を書く直すことを強制したい場合は`2`に設定してください。値が`2`のときに書き換えが失敗すると、「`WHERE`セクションを簡略化してみてください」というエラーメッセージが表示されます。 + +## ONセクションの条件 + +`ON`セクションは`AND`および`OR`演算子を使用して結合された複数の条件を含むことができます。結合キーを指定する条件は、左テーブルと右テーブルの両方を参照し、等号演算子を使用しなければなりません。他の条件は、その他の論理演算子を使用できますが、**クエリ**の左または右テーブルのいずれかを参照する必要があります。 + +条件が満たされると**行**が結合されます。条件が満たされない場合でも、`JOIN`タイプによっては**行**が結果に含まれることがあります。注意すべき点は、同じ条件が`WHERE`セクションに配置され、条件が満たされていない場合、**行**は常に結果からフィルタリングされます。 + +`ON`句内の`OR`演算子はハッシュ結合アルゴリズムを使用して動作します — `JOIN`の結合キーを持つ各`OR`引数に対して、個別のハッシュテーブルが作成されるため、メモリ消費と**クエリ**の実行時間は`ON`句の`OR`の表現の数の増加に伴い線形に増加します。 + +:::note +異なるテーブルの**カラム**に言及する条件の場合、現時点では等号演算子(`=`)のみがサポートされています。 +::: + +**例** + +`table_1`と`table_2`を考慮してください: + +``` +┌─Id─┬─name─┐ ┌─Id─┬─text───────────┬─scores─┐ +│ 1 │ A │ │ 1 │ Text A │ 10 │ +│ 2 │ B │ │ 1 │ Another text A │ 12 │ +│ 3 │ C │ │ 2 │ Text B │ 15 │ +└────┴──────┘ └────┴────────────────┴────────┘ +``` + +1つの結合キー条件と`table_2`に対する追加の条件を持つ**クエリ**: + +``` sql +SELECT name, text FROM table_1 LEFT OUTER JOIN table_2 + ON table_1.Id = table_2.Id AND startsWith(table_2.text, 'Text'); +``` + +結果には、nameが`C`でテキストが空の**行**が含まれています。これは、`OUTER`タイプの結合が使用されているために結果に含まれています。 + +``` +┌─name─┬─text───┐ +│ A │ Text A │ +│ B │ Text B │ +│ C │ │ +└──────┴────────┘ +``` + +`INNER`タイプの結合と複数の条件を持つ**クエリ**: + +``` sql +SELECT name, text, scores FROM table_1 INNER JOIN table_2 + ON table_1.Id = table_2.Id AND table_2.scores > 10 AND startsWith(table_2.text, 'Text'); +``` + +結果: + +``` +┌─name─┬─text───┬─scores─┐ +│ B │ Text B │ 15 │ +└──────┴────────┴────────┘ +``` + +`INNER`タイプの結合と`OR`を含む条件を持つ**クエリ**: + +``` sql +CREATE TABLE t1 (`a` Int64, `b` Int64) ENGINE = MergeTree() ORDER BY a; + +CREATE TABLE t2 (`key` Int32, `val` Int64) ENGINE = MergeTree() ORDER BY key; + +INSERT INTO t1 SELECT number as a, -a as b from numbers(5); + +INSERT INTO t2 SELECT if(number % 2 == 0, toInt64(number), -number) as key, number as val from numbers(5); + +SELECT a, b, val FROM t1 INNER JOIN t2 ON t1.a = t2.key OR t1.b = t2.key; +``` + +結果: + +``` +┌─a─┬──b─┬─val─┐ +│ 0 │ 0 │ 0 │ +│ 1 │ -1 │ 1 │ +│ 2 │ -2 │ 2 │ +│ 3 │ -3 │ 3 │ +│ 4 │ -4 │ 4 │ +└───┴────┴─────┘ +``` + +`INNER`タイプの結合と`OR`および`AND`を含む条件を持つ**クエリ**: + +:::note +デフォルトでは、異なるテーブルからのカラムを使う条件はサポートされません。例えば`t1.a = t2.key AND t1.b > 0 AND t2.b > t2.c`は`t1.b > 0`が`t1`のカラムのみを使用し、`t2.b > t2.c`が`t2`のカラムのみを使用するため可能です。しかし、`t1.a = t2.key AND t1.b > t2.key`のような条件のエクスペリメンタルサポートを試みることができます。詳細については以下を参照してください。 +::: + +``` sql +SELECT a, b, val FROM t1 INNER JOIN t2 ON t1.a = t2.key OR t1.b = t2.key AND t2.val > 3; +``` + +結果: + +``` +┌─a─┬──b─┬─val─┐ +│ 0 │ 0 │ 0 │ +│ 2 │ -2 │ 2 │ +│ 4 │ -4 │ 4 │ +└───┴────┴─────┘ +``` + +## [試験的機能] 異なるテーブルのカラムに対する不等式条件を伴う結合 + +:::note +この機能は試験的です。これを利用するには、設定ファイルや`SET`コマンドを用いて`allow_experimental_join_condition`を1に設定してください: + +```sql +SET allow_experimental_join_condition=1 +``` + +そうでなければ、`INVALID_JOIN_ON_EXPRESSION`が返されます。 + +::: + +ClickHouseは現在、等式条件に加えて不等式条件を持つ`ALL/ANY/SEMI/ANTI INNER/LEFT/RIGHT/FULL JOIN`をサポートしています。不等式条件は`hash`および`grace_hash`結合アルゴリズムのみでサポートされています。不等式条件は`join_use_nulls`ではサポートされていません。 + +**例** + +テーブル`t1`: + +``` +┌─key──┬─attr─┬─a─┬─b─┬─c─┐ +│ key1 │ a │ 1 │ 1 │ 2 │ +│ key1 │ b │ 2 │ 3 │ 2 │ +│ key1 │ c │ 3 │ 2 │ 1 │ +│ key1 │ d │ 4 │ 7 │ 2 │ +│ key1 │ e │ 5 │ 5 │ 5 │ +│ key2 │ a2 │ 1 │ 1 │ 1 │ +│ key4 │ f │ 2 │ 3 │ 4 │ +└──────┴──────┴───┴───┴───┘ +``` + +テーブル`t2` + +``` +┌─key──┬─attr─┬─a─┬─b─┬─c─┐ +│ key1 │ A │ 1 │ 2 │ 1 │ +│ key1 │ B │ 2 │ 1 │ 2 │ +│ key1 │ C │ 3 │ 4 │ 5 │ +│ key1 │ D │ 4 │ 1 │ 6 │ +│ key3 │ a3 │ 1 │ 1 │ 1 │ +│ key4 │ F │ 1 │ 1 │ 1 │ +└──────┴──────┴───┴───┴───┘ +``` + +```sql +SELECT t1.*, t2.* from t1 LEFT JOIN t2 ON t1.key = t2.key and (t1.a < t2.a) ORDER BY (t1.key, t1.attr, t2.key, t2.attr); +``` + +``` +key1 a 1 1 2 key1 B 2 1 2 +key1 a 1 1 2 key1 C 3 4 5 +key1 a 1 1 2 key1 D 4 1 6 +key1 b 2 3 2 key1 C 3 4 5 +key1 b 2 3 2 key1 D 4 1 6 +key1 c 3 2 1 key1 D 4 1 6 +key1 d 4 7 2 0 0 \N +key1 e 5 5 5 0 0 \N +key2 a2 1 1 1 0 0 \N +key4 f 2 3 4 0 0 \N +``` + +## JOINキー内のNULL値 + +NULLはどの値とも、また自身とも等しくありません。つまり、JOINキーにNULL値が一方のテーブルにある場合、もう一方のテーブルのNULL値と一致しません。 + +**例** + +テーブル`A`: + +``` +┌───id─┬─name────┐ +│ 1 │ Alice │ +│ 2 │ Bob │ +│ ᴺᵁᴸᴸ │ Charlie │ +└──────┴─────────┘ +``` + +テーブル`B`: + +``` +┌───id─┬─score─┐ +│ 1 │ 90 │ +│ 3 │ 85 │ +│ ᴺᵁᴸᴸ │ 88 │ +└──────┴───────┘ +``` + +```sql +SELECT A.name, B.score FROM A LEFT JOIN B ON A.id = B.id +``` + +``` +┌─name────┬─score─┐ +│ Alice │ 90 │ +│ Bob │ 0 │ +│ Charlie │ 0 │ +└─────────┴───────┘ +``` + +`A`テーブルの`Charlie`行と`B`テーブルのスコア88の行は、JOINキーのNULL値のため結果に含まれていないことに注意してください。 + +NULL値を一致させたい場合は、`isNotDistinctFrom`関数を使用してJOINキーを比較します。 + +```sql +SELECT A.name, B.score FROM A LEFT JOIN B ON isNotDistinctFrom(A.id, B.id) +``` + +``` +┌─name────┬─score─┐ +│ Alice │ 90 │ +│ Bob │ 0 │ +│ Charlie │ 88 │ +└─────────┴───────┘ +``` + +## ASOF JOINの使用方法 + +`ASOF JOIN`は、正確な一致がないレコードを結合するときに役立ちます。 + +アルゴリズムには特別な**カラム**がテーブルに必要です。この**カラム**: + +- 順序付けられたシーケンスを含まなければならない +- 次のいずれかの型を持つことができる: [Int, UInt](../../../sql-reference/data-types/int-uint.md), [Float](../../../sql-reference/data-types/float.md), [Date](../../../sql-reference/data-types/date.md), [DateTime](../../../sql-reference/data-types/datetime.md), [Decimal](../../../sql-reference/data-types/decimal.md) +- `hash`結合アルゴリズムでは、`JOIN`の句に唯一の**カラム**にすることはできない + +構文 `ASOF JOIN ... ON`: + +``` sql +SELECT expressions_list +FROM table_1 +ASOF LEFT JOIN table_2 +ON equi_cond AND closest_match_cond +``` + +任意の数の等式条件と厳密に1つの最も近い一致条件を使用できます。例えば、`SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t`。 + +最も近い一致でサポートされる条件: `>`, `>=`, `<`, `<=`。 + +構文 `ASOF JOIN ... USING`: + +``` sql +SELECT expressions_list +FROM table_1 +ASOF JOIN table_2 +USING (equi_column1, ... equi_columnN, asof_column) +``` + +`ASOF JOIN`は`equi_columnX`を等価結合に使用し、`asof_column`を最も近い一致での結合に使用します。この`asof_column`は常に`USING`句の最後の**カラム**です。 + +例えば、以下のテーブルを考慮してください: + + table_1 table_2 + event | ev_time | user_id event | ev_time | user_id + ----------|---------|---------- ----------|---------|---------- + ... ... + event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42 + ... event_2_2 | 12:30 | 42 + event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42 + ... ... + +`ASOF JOIN`は、`table_1`のユーザーイベントのタイムスタンプを取得し、最も近い一致条件に対応する`table_1`イベントのタイムスタンプに最も近い`table_2`のイベントを見つけます。等しいタイムスタンプの値が利用可能な場合、最も近いと見なされます。この例では、`user_id`列は等価結合に使用され、`ev_time`列は最も近い一致での結合に使用されます。この例では、`event_1_1`は`event_2_1`と結合され、`event_1_2`は`event_2_3`と結合されますが、`event_2_2`は結合されません。 + +:::note +`ASOF JOIN`は`hash`および`full_sorting_merge`結合アルゴリズムのみでサポートされます。 +[Join](../../../engines/table-engines/special/join.md)テーブルエンジンではサポートされていません。 +::: + +## PASTE JOINの使用方法 + +`PASTE JOIN`の結果は、左サブクエリのすべての**カラム**の後に右サブクエリのすべての**カラム**が続くテーブルです。 +元のテーブルでのポジションに基づいて**行**が一致します(**行**の順序は定義されている必要があります)。 +サブクエリが異なる数の**行**を返す場合、余分な**行**はカットされます。 + +例: +```SQL +SELECT * +FROM +( + SELECT number AS a + FROM numbers(2) +) AS t1 +PASTE JOIN +( + SELECT number AS a + FROM numbers(2) + ORDER BY a DESC +) AS t2 + +┌─a─┬─t2.a─┐ +│ 0 │ 1 │ +│ 1 │ 0 │ +└───┴──────┘ +``` +注意: この場合、結果は並列で読み取ると非決定的になる可能性があります。例: +```SQL +SELECT * +FROM +( + SELECT number AS a + FROM numbers_mt(5) +) AS t1 +PASTE JOIN +( + SELECT number AS a + FROM numbers(10) + ORDER BY a DESC +) AS t2 +SETTINGS max_block_size = 2; + +┌─a─┬─t2.a─┐ +│ 2 │ 9 │ +│ 3 │ 8 │ +└───┴──────┘ +┌─a─┬─t2.a─┐ +│ 0 │ 7 │ +│ 1 │ 6 │ +└───┴──────┘ +┌─a─┬─t2.a─┐ +│ 4 │ 5 │ +└───┴──────┘ +``` + +## 分散JOIN + +分散テーブルを含むJOINを実行する方法は2つあります: + +- 通常の`JOIN`を使用する場合、クエリはリモートサーバーに送信されます。サブクエリはそれぞれのサーバーで実行され、右テーブルが作成され、このテーブルとのJOINが実行されます。言い換えれば、右テーブルは各サーバーで個別に形成されます。 +- `GLOBAL ... JOIN`を使用する場合、まずリクエスタサーバーが右テーブルを計算するためのサブクエリを実行します。この一時テーブルは各リモートサーバーに渡され、送信された一時データを使用してクエリが実行されます。 + +`GLOBAL`を使用する際は注意してください。詳細は[分散サブクエリ](../../../sql-reference/operators/in.md#select-distributed-subqueries)セクションを参照してください。 + +## 暗黙の型変換 + +`INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, および`FULL JOIN` **クエリ**は、「結合キー」の暗黙的な型変換をサポートしています。ただし、左テーブルと右テーブルからの結合キーが単一の型に変換できない場合(例えば、`UInt64`と`Int64`、あるいは`String`と`Int32`)にクエリは実行されません。 + +**例** + +以下のテーブル `t_1` を考慮してください: +```text +┌─a─┬─b─┬─toTypeName(a)─┬─toTypeName(b)─┐ +│ 1 │ 1 │ UInt16 │ UInt8 │ +│ 2 │ 2 │ UInt16 │ UInt8 │ +└───┴───┴───────────────┴───────────────┘ +``` +そしてテーブル `t_2`: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ -1 │ 1 │ Int16 │ Nullable(Int64) │ +│ 1 │ -1 │ Int16 │ Nullable(Int64) │ +│ 1 │ 1 │ Int16 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + +以下のクエリ +```sql +SELECT a, b, toTypeName(a), toTypeName(b) FROM t_1 FULL JOIN t_2 USING (a, b); +``` +が返すセット: +```text +┌──a─┬────b─┬─toTypeName(a)─┬─toTypeName(b)───┐ +│ 1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 2 │ 2 │ Int32 │ Nullable(Int64) │ +│ -1 │ 1 │ Int32 │ Nullable(Int64) │ +│ 1 │ -1 │ Int32 │ Nullable(Int64) │ +└────┴──────┴───────────────┴─────────────────┘ +``` + +## 使用の推奨事項 + +### 空またはNULLセルの処理 + +テーブルを結合するとき、空のセルが生じる場合があります。[join_use_nulls](../../../operations/settings/settings.md#join_use_nulls)設定はClickHouseがこれらのセルをどのように埋めるかを定義します。 + +`JOIN`キーが[Nullable](../../../sql-reference/data-types/nullable.md)フィールドである場合、少なくとも1つのキーが[NULL](../../../sql-reference/syntax.md#null-literal)値を持っている**行**は結合されません。 + +### 構文 + +`USING`で指定された**カラム**は両方のサブクエリで同じ名前を持たなければならず、他の**カラム**は異なる名前でなければなりません。サブクエリ内で**カラム**の名前を変更するためにエイリアスを使用できます。 + +`USING`句は1つ以上の**カラム**を指定することで、これらのカラムの等価性を確立します。**カラム**のリストは括弧を用いずに設定されます。より複雑な結合条件はサポートされていません。 + +### 構文制限 + +1つの`SELECT` **クエリ**に複数の`JOIN`句がある場合: + +- `*`による全てのカラムの取得は、サブクエリの**カラム**でなくテーブルが結合される場合のみ利用可能です。 +- `PREWHERE`句は利用できません。 +- `USING`句は利用できません。 + +`ON`、`WHERE`、および`GROUP BY`句の場合: + +- `ON`、`WHERE`、および`GROUP BY`句で任意の式を使用することはできませんが、`SELECT`句で式を定義し、エイリアスを介してこれらの句で使用することはできます。 + +### パフォーマンス + +`JOIN`を実行する際、クエリの他のステージに関連する実行順序の最適化はありません。JOIN(右テーブルの検索)は`WHERE`でのフィルタリングの前に、集計の前に実行されます。 + +同じ`JOIN`を伴うクエリを実行するたびにサブクエリが再度実行されます。結果はキャッシュされません。これを避けるために、特殊な[Join](../../../engines/table-engines/special/join.md)テーブルエンジンを使用します。このエンジンは、常にRAMにある結合のための準備された配列です。 + +場合によっては、`JOIN`の代わりに[IN](../../../sql-reference/operators/in.md)を使用する方が効率的です。 + +ディメンションテーブル(広告キャンペーンの名前などのディメンションプロパティを含む比較的小さなテーブル)との結合に`JOIN`が必要な場合、右テーブルが毎回再アクセスされるため`JOIN`はあまり便利ではないかもしれません。そういった場合には「Dictionary」機能を使用することをお勧めします。詳細は[Dictionaries](../../../sql-reference/dictionaries/index.md)セクションを参照してください。 + +### メモリ制限 + +デフォルトでClickHouseは[ハッシュ結合](https://en.wikipedia.org/wiki/Hash_join)アルゴリズムを使用します。ClickHouseはright_tableを取り、RAMにハッシュテーブルを作成します。`join_algorithm = 'auto'`が有効な場合、メモリ消費のしきい値を超えるとClickHouseは[マージ](https://en.wikipedia.org/wiki/Sort-merge_join)結合アルゴリズムにフォールバックします。`JOIN`アルゴリズムの説明は[join_algorithm](../../../operations/settings/settings.md#join_algorithm)設定を参照してください。 + +`JOIN`操作のメモリ消費を制限する必要がある場合、以下の設定を使用します: + +- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join) — ハッシュテーブルの行数を制限します。 +- [max_bytes_in_join](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join) — ハッシュテーブルのサイズを制限します。 + +これらの制限のいずれかが到達された場合、ClickHouseは[join_overflow_mode](../../../operations/settings/query-complexity.md#settings-join_overflow_mode)設定に指示された通りに動作します。 + +## 例 + +``` sql +SELECT + CounterID, + hits, + visits +FROM +( + SELECT + CounterID, + count() AS hits + FROM test.hits + GROUP BY CounterID +) ANY LEFT JOIN +( + SELECT + CounterID, + sum(Sign) AS visits + FROM test.visits + GROUP BY CounterID +) USING CounterID +ORDER BY hits DESC +LIMIT 10 +``` + +``` text +┌─CounterID─┬───hits─┬─visits─┐ +│ 1143050 │ 523264 │ 13665 │ +│ 731962 │ 475698 │ 102716 │ +│ 722545 │ 337212 │ 108187 │ +│ 722889 │ 252197 │ 10547 │ +│ 2237260 │ 196036 │ 9522 │ +│ 23057320 │ 147211 │ 7689 │ +│ 722818 │ 90109 │ 17847 │ +│ 48221 │ 85379 │ 4652 │ +│ 19762435 │ 77807 │ 7026 │ +│ 722884 │ 77492 │ 11056 │ +└───────────┴────────┴────────┘ +``` diff --git a/docs/ja/sql-reference/statements/select/limit-by.md b/docs/ja/sql-reference/statements/select/limit-by.md new file mode 100644 index 00000000000..a13611e758d --- /dev/null +++ b/docs/ja/sql-reference/statements/select/limit-by.md @@ -0,0 +1,75 @@ +--- +slug: /ja/sql-reference/statements/select/limit-by +sidebar_label: LIMIT BY +--- + +# LIMIT BY 句 + +`LIMIT n BY expressions` 句を持つクエリは、`expressions` の各異なる値の最初の `n` 行を選択します。`LIMIT BY` のキーには任意の数の[式](../../../sql-reference/syntax.md#syntax-expressions)を含めることができます。 + +ClickHouse は以下の構文のバリエーションをサポートしています: + +- `LIMIT [offset_value, ]n BY expressions` +- `LIMIT n OFFSET offset_value BY expressions` + +クエリの処理中、ClickHouse はソートキーによってデータを選択します。ソートキーは[ORDER BY](order-by.md#select-order-by) 句を使用して明示的に設定するか、テーブルエンジンのプロパティとして暗黙的に設定されます(行順序が保証されるのは [ORDER BY](order-by.md#select-order-by) を使用した場合のみであり、そうでなければマルチスレッドのために行ブロックは順序付けられません)。その後、ClickHouse は `LIMIT n BY expressions` を適用し、`expressions` の各異なる組み合わせの最初の `n` 行を返します。`OFFSET` が指定されている場合、`expressions` の異なる組み合わせに属する各データブロックに対して、ClickHouse はブロックの最初から `offset_value` の行数をスキップし、最大 `n` 行を結果として返します。`offset_value` がデータブロック内の行数を超えている場合、ClickHouse はブロックからゼロ行を返します。 + +:::note +`LIMIT BY` は [LIMIT](../../../sql-reference/statements/select/limit.md) とは関係ありません。両方を同じクエリ内で使用することができます。 +::: + +`LIMIT BY` 句でカラム名の代わりにカラム番号を使用したい場合は、設定 [enable_positional_arguments](../../../operations/settings/settings.md#enable-positional-arguments) を有効にしてください。 + +## 例 + +サンプルテーブル: + +``` sql +CREATE TABLE limit_by(id Int, val Int) ENGINE = Memory; +INSERT INTO limit_by VALUES (1, 10), (1, 11), (1, 12), (2, 20), (2, 21); +``` + +クエリ: + +``` sql +SELECT * FROM limit_by ORDER BY id, val LIMIT 2 BY id +``` + +``` text +┌─id─┬─val─┐ +│ 1 │ 10 │ +│ 1 │ 11 │ +│ 2 │ 20 │ +│ 2 │ 21 │ +└────┴─────┘ +``` + +``` sql +SELECT * FROM limit_by ORDER BY id, val LIMIT 1, 2 BY id +``` + +``` text +┌─id─┬─val─┐ +│ 1 │ 11 │ +│ 1 │ 12 │ +│ 2 │ 21 │ +└────┴─────┘ +``` + +`SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id` クエリは同じ結果を返します。 + +以下のクエリは、各 `domain, device_type` ペアの上位5つのリファラーを、最大100行の合計(`LIMIT n BY + LIMIT`)で返します。 + +``` sql +SELECT + domainWithoutWWW(URL) AS domain, + domainWithoutWWW(REFERRER_URL) AS referrer, + device_type, + count() cnt +FROM hits +GROUP BY domain, referrer, device_type +ORDER BY cnt DESC +LIMIT 5 BY domain, device_type +LIMIT 100 +``` + diff --git a/docs/ja/sql-reference/statements/select/limit.md b/docs/ja/sql-reference/statements/select/limit.md new file mode 100644 index 00000000000..76e2d78e0ea --- /dev/null +++ b/docs/ja/sql-reference/statements/select/limit.md @@ -0,0 +1,67 @@ +--- +slug: /ja/sql-reference/statements/select/limit +sidebar_label: LIMIT +--- + +# LIMIT句 + +`LIMIT m`を使用すると、結果から最初の`m`行を選択できます。 + +`LIMIT n, m`を使用すると、最初の`n`行をスキップした後の結果から`m`行を選択できます。`LIMIT m OFFSET n`の構文はこれと同等です。 + +`n`と`m`は非負整数でなければなりません。 + +結果を明示的にソートする[ORDER BY](../../../sql-reference/statements/select/order-by.md)句がない場合、結果に選ばれる行は任意で非決定的なものになる可能性があります。 + +:::note +結果セット内の行数は、[limit](../../../operations/settings/settings.md#limit)設定にも依存する場合があります。 +::: + +## LIMIT ... WITH TIES修飾子 + +`LIMIT n[,m]`に`WITH TIES`修飾子を設定し、`ORDER BY expr_list`を指定した場合、`LIMIT n`で指定した位置`n`または`LIMIT n,m`で指定した位置`m`にある行と同じ`ORDER BY`フィールドの値を持つすべての行と、最初の`n`または`n,m`行を結果として取得します。 + +この修飾子は、[ORDER BY ... WITH FILL修飾子](../../../sql-reference/statements/select/order-by.md#orderby-with-fill)とも組み合わせることができます。 + +例えば、次のクエリ + +``` sql +SELECT * FROM ( + SELECT number%50 AS n FROM numbers(100) +) ORDER BY n LIMIT 0,5 +``` + +は、次の結果を返します。 + +``` text +┌─n─┐ +│ 0 │ +│ 0 │ +│ 1 │ +│ 1 │ +│ 2 │ +└───┘ +``` + +しかし、`WITH TIES`修飾子を適用すると + +``` sql +SELECT * FROM ( + SELECT number%50 AS n FROM numbers(100) +) ORDER BY n LIMIT 0,5 WITH TIES +``` + +別の行セットが返されます。 + +``` text +┌─n─┐ +│ 0 │ +│ 0 │ +│ 1 │ +│ 1 │ +│ 2 │ +│ 2 │ +└───┘ +``` + +これは、行番号6がフィールド`n`に対して行番号5と同じ値「2」を持っているためです。 diff --git a/docs/ja/sql-reference/statements/select/offset.md b/docs/ja/sql-reference/statements/select/offset.md new file mode 100644 index 00000000000..c728ebd0603 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/offset.md @@ -0,0 +1,88 @@ +--- +slug: /ja/sql-reference/statements/select/offset +sidebar_label: OFFSET +title: "OFFSET FETCH 句" +--- + +`OFFSET` と `FETCH` はデータを部分ごとに取得することを可能にします。これは、単一のクエリによって取得したい行のブロックを指定します。 + +``` sql +OFFSET offset_row_count {ROW | ROWS}] [FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}] +``` + +`offset_row_count` や `fetch_row_count` の値は、数値またはリテラル定数にすることができます。`fetch_row_count` を省略することもでき、その場合、デフォルトは1です。 + +`OFFSET` は、クエリ結果セットから行を返し始める前にスキップする行数を指定します。 + +`FETCH` は、クエリ結果の行数の最大値を指定します。 + +`ONLY` オプションは、`OFFSET` によって省略された行に続く行を返すために使用されます。この場合、`FETCH` は [LIMIT](../../../sql-reference/statements/select/limit.md) 句の代替となります。例えば、次のクエリは + +``` sql +SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY; +``` + +次のクエリと同一です: + +``` sql +SELECT * FROM test_fetch ORDER BY a LIMIT 3 OFFSET 1; +``` + +`WITH TIES` オプションは、`ORDER BY` 句に従って結果セットの最終位置と同着となる追加の行を返すために使用されます。例えば、`fetch_row_count` が5の場合で、2つの追加の行が5行目の `ORDER BY` カラムの値と一致するなら、結果セットには7行が含まれることになります。 + +:::note +標準に従えば、`OFFSET` 句は `FETCH` 句がある場合、その前に記述する必要があります。 +::: + +:::note +実際のオフセットは、[offset](../../../operations/settings/settings.md#offset) 設定にも依存することがあります。 +::: + +## 例 + +入力テーブル: + +``` text +┌─a─┬─b─┐ +│ 1 │ 1 │ +│ 2 │ 1 │ +│ 3 │ 4 │ +│ 1 │ 3 │ +│ 5 │ 4 │ +│ 0 │ 6 │ +│ 5 │ 7 │ +└───┴───┘ +``` + +`ONLY` オプションの使用例: + +``` sql +SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS ONLY; +``` + +結果: + +``` text +┌─a─┬─b─┐ +│ 2 │ 1 │ +│ 3 │ 4 │ +│ 5 │ 4 │ +└───┴───┘ +``` + +`WITH TIES` オプションの使用例: + +``` sql +SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS WITH TIES; +``` + +結果: + +``` text +┌─a─┬─b─┐ +│ 2 │ 1 │ +│ 3 │ 4 │ +│ 5 │ 4 │ +│ 5 │ 7 │ +└───┴───┘ +``` diff --git a/docs/ja/sql-reference/statements/select/order-by.md b/docs/ja/sql-reference/statements/select/order-by.md new file mode 100644 index 00000000000..caa3a1edc40 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/order-by.md @@ -0,0 +1,671 @@ +--- +slug: /ja/sql-reference/statements/select/order-by +sidebar_label: ORDER BY +--- + +# ORDER BY 句 + +`ORDER BY` 句は次のいずれかを含みます: + +- 式のリスト、例:`ORDER BY visits, search_phrase`、 +- `SELECT` 句内のカラムを指す数字のリスト、例:`ORDER BY 2, 1`、または +- `ALL`、これは `SELECT` 句のすべてのカラムを意味します。例:`ORDER BY ALL`。 + +カラム番号によるソートを無効にするには、設定 [enable_positional_arguments](../../../operations/settings/settings.md#enable-positional-arguments) = 0 を設定します。 +`ALL` によるソートを無効にするには、設定 [enable_order_by_all](../../../operations/settings/settings.md#enable-order-by-all) = 0 を設定します。 + +`ORDER BY` 句にはソートの方向を決定するために `DESC` (降順)または `ASC` (昇順)修飾子が付けられることがあります。 +明示的なソート順指定がない限り、デフォルトで `ASC` が使用されます。 +ソートの方向は、リスト全体ではなく単一の式に適用されます。例:`ORDER BY Visits DESC, SearchPhrase`。 +また、ソートは大文字小文字を区別して行われます。 + +ソート式の値が同一の行は、任意で非決定論的な順序で返されます。 +`SELECT` ステートメントで `ORDER BY` 句が省略された場合、行の順序も任意で非決定論的です。 + +## 特殊値のソート + +`NaN` と `NULL` のソート順には2つのアプローチがあります: + +- デフォルトまたは `NULLS LAST` 修飾子を使用した場合:最初に値、その後 `NaN`、最後に `NULL`。 +- `NULLS FIRST` 修飾子を使用した場合:最初に `NULL`、その後 `NaN`、最後に他の値。 + +### 例 + +以下のテーブルについて: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 2 │ 2 │ +│ 1 │ nan │ +│ 2 │ 2 │ +│ 3 │ 4 │ +│ 5 │ 6 │ +│ 6 │ nan │ +│ 7 │ ᴺᵁᴸᴸ │ +│ 6 │ 7 │ +│ 8 │ 9 │ +└───┴──────┘ +``` + +クエリ `SELECT * FROM t_null_nan ORDER BY y NULLS FIRST` を実行すると: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +│ 7 │ ᴺᵁᴸᴸ │ +│ 1 │ nan │ +│ 6 │ nan │ +│ 2 │ 2 │ +│ 2 │ 2 │ +│ 3 │ 4 │ +│ 5 │ 6 │ +│ 6 │ 7 │ +│ 8 │ 9 │ +└───┴──────┘ +``` + +浮動小数点数がソートされる際、NaNは他の値とは別に扱われます。ソートの順序にかかわらず、NaNは最後に来ます。つまり、昇順のソートではすべての他の数値よりも大きいかのように扱われ、降順のソートでは残りの数値よりも小さいかのように扱われます。 + +## 照合サポート + +[String](../../../sql-reference/data-types/string.md) 値によるソートの際、照合(比較)を指定できます。例:`ORDER BY SearchPhrase COLLATE 'tr'` - トルコ語アルファベットを使用した大文字小文字を区別しない昇順のキーワードによるソート。`COLLATE` は ORDER BY 内の各式について独立して指定可能です。`ASC` または `DESC` が指定されている場合は、`COLLATE` はその後に指定されます。`COLLATE` を使用する場合、ソートは常に大文字小文字を区別しません。 + +照合は [LowCardinality](../../../sql-reference/data-types/lowcardinality.md)、[Nullable](../../../sql-reference/data-types/nullable.md)、[Array](../../../sql-reference/data-types/array.md)、および [Tuple](../../../sql-reference/data-types/tuple.md) 内でサポートされています。 + +通常のバイトによるソートよりも効率が低下するため、わずかな行の最終的なソートにのみ `COLLATE` の使用をお勧めします。 + +## 照合の例 + +[String](../../../sql-reference/data-types/string.md) 値のみに関する例: + +入力テーブル: + +``` text +┌─x─┬─s────┐ +│ 1 │ bca │ +│ 2 │ ABC │ +│ 3 │ 123a │ +│ 4 │ abc │ +│ 5 │ BCA │ +└───┴──────┘ +``` + +クエリ: + +```sql +SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; +``` + +結果: + +``` text +┌─x─┬─s────┐ +│ 3 │ 123a │ +│ 4 │ abc │ +│ 2 │ ABC │ +│ 1 │ bca │ +│ 5 │ BCA │ +└───┴──────┘ +``` + +[Nullable](../../../sql-reference/data-types/nullable.md) を用いた例: + +入力テーブル: + +``` text +┌─x─┬─s────┐ +│ 1 │ bca │ +│ 2 │ ᴺᵁᴸᴸ │ +│ 3 │ ABC │ +│ 4 │ 123a │ +│ 5 │ abc │ +│ 6 │ ᴺᵁᴸᴸ │ +│ 7 │ BCA │ +└───┴──────┘ +``` + +クエリ: + +```sql +SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; +``` + +結果: + +``` text +┌─x─┬─s────┐ +│ 4 │ 123a │ +│ 5 │ abc │ +│ 3 │ ABC │ +│ 1 │ bca │ +│ 7 │ BCA │ +│ 6 │ ᴺᵁᴸᴸ │ +│ 2 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +``` + +[Array](../../../sql-reference/data-types/array.md) を用いた例: + +入力テーブル: + +``` text +┌─x─┬─s─────────────┐ +│ 1 │ ['Z'] │ +│ 2 │ ['z'] │ +│ 3 │ ['a'] │ +│ 4 │ ['A'] │ +│ 5 │ ['z','a'] │ +│ 6 │ ['z','a','a'] │ +│ 7 │ [''] │ +└───┴───────────────┘ +``` + +クエリ: + +```sql +SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; +``` + +結果: + +``` text +┌─x─┬─s─────────────┐ +│ 7 │ [''] │ +│ 3 │ ['a'] │ +│ 4 │ ['A'] │ +│ 2 │ ['z'] │ +│ 5 │ ['z','a'] │ +│ 6 │ ['z','a','a'] │ +│ 1 │ ['Z'] │ +└───┴───────────────┘ +``` + +[LowCardinality](../../../sql-reference/data-types/lowcardinality.md) string を用いた例: + +入力テーブル: + +```text +┌─x─┬─s───┐ +│ 1 │ Z │ +│ 2 │ z │ +│ 3 │ a │ +│ 4 │ A │ +│ 5 │ za │ +│ 6 │ zaa │ +│ 7 │ │ +└───┴─────┘ +``` + +クエリ: + +```sql +SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; +``` + +結果: + +```text +┌─x─┬─s───┐ +│ 7 │ │ +│ 3 │ a │ +│ 4 │ A │ +│ 2 │ z │ +│ 1 │ Z │ +│ 5 │ za │ +│ 6 │ zaa │ +└───┴─────┘ +``` + +[Tuple](../../../sql-reference/data-types/tuple.md) を用いた例: + +```text +┌─x─┬─s───────┐ +│ 1 │ (1,'Z') │ +│ 2 │ (1,'z') │ +│ 3 │ (1,'a') │ +│ 4 │ (2,'z') │ +│ 5 │ (1,'A') │ +│ 6 │ (2,'Z') │ +│ 7 │ (2,'A') │ +└───┴─────────┘ +``` + +クエリ: + +```sql +SELECT * FROM collate_test ORDER BY s ASC COLLATE 'en'; +``` + +結果: + +```text +┌─x─┬─s───────┐ +│ 3 │ (1,'a') │ +│ 5 │ (1,'A') │ +│ 2 │ (1,'z') │ +│ 1 │ (1,'Z') │ +│ 7 │ (2,'A') │ +│ 4 │ (2,'z') │ +│ 6 │ (2,'Z') │ +└───┴─────────┘ +``` + +## 実装の詳細 + +小さな [LIMIT](../../../sql-reference/statements/select/limit.md) が `ORDER BY` に追加されている場合、より少ないRAMを使用します。そうでない場合、ソートするデータの量に比例したメモリ量を消費します。分散クエリ処理の場合、[GROUP BY](../../../sql-reference/statements/select/group-by.md) が省略されている場合、ソートはリモートサーバーで部分的に行われ、結果は要求サーバーでマージされます。つまり、分散ソートの際、ソートするデータ量は1台のサーバーのメモリを超えることがあります。 + +RAMが不足している場合、外部メモリ(ディスク上の一時ファイルの作成)でソートを行うことができます。この目的のために、`max_bytes_before_external_sort` 設定を使用してください。0(デフォルト)に設定されている場合、外部ソートは無効です。有効にされている場合、ソートするデータの量が指定されたバイト数に達すると、収集されたデータがソートされ、一時ファイルに書き込まれます。すべてのデータが読み取られた後、ソートされたすべてのファイルがマージされ、結果が出力されます。ファイルは `/var/lib/clickhouse/tmp/` ディレクトリに書き込まれ(デフォルトで、`tmp_path` パラメータを使用してこの設定を変更することも可能です)。 + +クエリの実行により、`max_bytes_before_external_sort` よりも多くのメモリを使用することがあります。このため、この設定は `max_memory_usage` よりもかなり小さい値を持たなければなりません。たとえば、サーバーに128GBのRAMがあり、単一のクエリを実行する必要がある場合、`max_memory_usage` を100GBに設定し、`max_bytes_before_external_sort` を80GBに設定します。 + +外部ソートはRAM内でのソートほど効果的ではありません。 + +## データ読み取りの最適化 + + `ORDER BY` 式にテーブルソートキーと一致するプレフィクスがある場合、[optimize_read_in_order](../../../operations/settings/settings.md#optimize_read_in_order) 設定を使用してクエリを最適化できます。 + + `optimize_read_in_order` 設定が有効になっている場合、ClickHouseサーバーはテーブルインデックスを使用して、`ORDER BY` キーの順序でデータを読み取ります。これにより、指定された [LIMIT](../../../sql-reference/statements/select/limit.md) の場合にすべてのデータを読み取ることを避けることができます。そのため、大量のデータに対する小さなリミット付きのクエリがより迅速に処理されます。 + +この最適化は `ASC` および `DESC` の両方で動作し、[GROUP BY](../../../sql-reference/statements/select/group-by.md) 句や [FINAL](../../../sql-reference/statements/select/from.md#select-from-final) 修飾子と一緒に使用することはできません。 + +`optimize_read_in_order` 設定が無効な場合、ClickHouseサーバーは `SELECT` クエリを処理する際にテーブルインデックスを使用しません。 + +`ORDER BY` 句、大きな `LIMIT` と巨額のレコードを読み込む必要がある [WHERE](../../../sql-reference/statements/select/where.md) 条件を持つクエリを実行する場合、`optimize_read_in_order` を手動で無効化することを検討してください。 + +次のテーブルエンジンで最適化がサポートされています: + +- [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md)([マテリアライズドビュー](../../../sql-reference/statements/create/view.md#materialized-view) を含む)、 +- [Merge](../../../engines/table-engines/special/merge.md)、 +- [Buffer](../../../engines/table-engines/special/buffer.md) + +`MaterializedView` エンジンのテーブルでは、ビューとして `SELECT ... FROM merge_tree_table ORDER BY pk` のような最適化が機能します。ただし、ビュークエリに `ORDER BY` 句がない場合の `SELECT ... FROM view ORDER BY pk` のようなクエリではサポートされていません。 + +## ORDER BY Expr WITH FILL 修飾子 + +この修飾子は [LIMIT ... WITH TIES 修飾子](../../../sql-reference/statements/select/limit.md#limit-with-ties) と組み合わせて使用することもできます。 + +`WITH FILL` 修飾子は、`ORDER BY expr` にオプションの `FROM expr`、`TO expr`、および `STEP expr` パラメータと共に設定できます。 +指定の `expr` カラムのすべての欠落値が順次埋められ、他のカラムはデフォルト値で埋められます。 + +複数のカラムを埋めるには、`ORDER BY` セクションの各フィールド名の後にオプションのパラメータとともに `WITH FILL` 修飾子を追加します。 + +``` sql +ORDER BY expr [WITH FILL] [FROM const_expr] [TO const_expr] [STEP const_numeric_expr] [STALENESS const_numeric_expr], ... exprN [WITH FILL] [FROM expr] [TO expr] [STEP numeric_expr] [STALENESS numeric_expr] +[INTERPOLATE [(col [AS expr], ... colN [AS exprN])]] +``` + +`WITH FILL` は、Numeric(すべての種類のfloat、decimal、int)またはDate/DateTime型のフィールドに適用可能です。`String` フィールドに適用される場合、欠落値は空文字列で補充されます。 +`FROM const_expr` が定義されていない場合、埋め込みのシーケンスは `ORDER BY` の `expr` フィールドの最小値を使用します。 +`TO const_expr` が定義されていない場合、埋め込みのシーケンスは `ORDER BY` の `expr` フィールドの最大値を使用します。 +`STEP const_numeric_expr` が定義されていると、`const_numeric_expr` は数値型の場合はそのまま解釈され、Date型では日数、DateTime型では秒数として解釈されます。また、時間や日付の間隔を表す [INTERVAL](https://clickhouse.com/docs/ja/sql-reference/data-types/special-data-types/interval/) データ型もサポートしています。 +`STEP const_numeric_expr` が省略されている場合、埋め込みのシーケンスは数値型では `1.0`、Date型では `1 day`、DateTime型では `1 second` を使用します。 +`STALENESS const_numeric_expr` が定義されている場合、クエリは元のデータにおける前の行との差が `const_numeric_expr` を超えるまで行を生成します。 +`INTERPOLATE` は `ORDER BY WITH FILL` に参加していないカラムに適用可能です。そのようなカラムは、`expr` を適用することで前のフィールド値に基づいて埋められます。`expr` が存在しない場合、前の値を繰り返します。省略されたリストは、すべての許可されたカラムを含む結果となります。 + +`WITH FILL` を使用しないクエリの例: + +``` sql +SELECT n, source FROM ( + SELECT toFloat32(number % 10) AS n, 'original' AS source + FROM numbers(10) WHERE number % 3 = 1 +) ORDER BY n; +``` + +結果: + +``` text +┌─n─┬─source───┐ +│ 1 │ original │ +│ 4 │ original │ +│ 7 │ original │ +└───┴──────────┘ +``` + +`WITH FILL` 修飾子を適用した後の同じクエリ: + +``` sql +SELECT n, source FROM ( + SELECT toFloat32(number % 10) AS n, 'original' AS source + FROM numbers(10) WHERE number % 3 = 1 +) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5; +``` + +結果: + +``` text +┌───n─┬─source───┐ +│ 0 │ │ +│ 0.5 │ │ +│ 1 │ original │ +│ 1.5 │ │ +│ 2 │ │ +│ 2.5 │ │ +│ 3 │ │ +│ 3.5 │ │ +│ 4 │ original │ +│ 4.5 │ │ +│ 5 │ │ +│ 5.5 │ │ +│ 7 │ original │ +└─────┴──────────┘ +``` + +複数フィールドの場合 `ORDER BY field2 WITH FILL, field1 WITH FILL` と記述すると、埋め込みの順序は `ORDER BY` 句内のフィールドの順序に従います。 + +例: + +``` sql +SELECT + toDate((number * 10) * 86400) AS d1, + toDate(number * 86400) AS d2, + 'original' AS source +FROM numbers(10) +WHERE (number % 3) = 1 +ORDER BY + d2 WITH FILL, + d1 WITH FILL STEP 5; +``` + +結果: + +``` text +┌───d1───────┬───d2───────┬─source───┐ +│ 1970-01-11 │ 1970-01-02 │ original │ +│ 1970-01-01 │ 1970-01-03 │ │ +│ 1970-01-01 │ 1970-01-04 │ │ +│ 1970-02-10 │ 1970-01-05 │ original │ +│ 1970-01-01 │ 1970-01-06 │ │ +│ 1970-01-01 │ 1970-01-07 │ │ +│ 1970-03-12 │ 1970-01-08 │ original │ +└────────────┴────────────┴──────────┘ +``` + +フィールド `d1` は埋められず、デフォルト値を使用します。なぜなら `d2` 値に対する反復値がないため、シーケンスを `d1` に対して適切に計算することはできません。 + +次のクエリでは `ORDER BY` 内のフィールドが変更されています: + +``` sql +SELECT + toDate((number * 10) * 86400) AS d1, + toDate(number * 86400) AS d2, + 'original' AS source +FROM numbers(10) +WHERE (number % 3) = 1 +ORDER BY + d1 WITH FILL STEP 5, + d2 WITH FILL; +``` + +結果: + +``` text +┌───d1───────┬───d2───────┬─source───┐ +│ 1970-01-11 │ 1970-01-02 │ original │ +│ 1970-01-16 │ 1970-01-01 │ │ +│ 1970-01-21 │ 1970-01-01 │ │ +│ 1970-01-26 │ 1970-01-01 │ │ +│ 1970-01-31 │ 1970-01-01 │ │ +│ 1970-02-05 │ 1970-01-01 │ │ +│ 1970-02-10 │ 1970-01-05 │ original │ +│ 1970-02-15 │ 1970-01-01 │ │ +│ 1970-02-20 │ 1970-01-01 │ │ +│ 1970-02-25 │ 1970-01-01 │ │ +│ 1970-03-02 │ 1970-01-01 │ │ +│ 1970-03-07 │ 1970-01-01 │ │ +│ 1970-03-12 │ 1970-01-08 │ original │ +└────────────┴────────────┴──────────┘ +``` + +次のクエリは、カラム `d1` に1日あたりデータを埋めるために `INTERVAL` データ型を使用しています: + +``` sql +SELECT + toDate((number * 10) * 86400) AS d1, + toDate(number * 86400) AS d2, + 'original' AS source +FROM numbers(10) +WHERE (number % 3) = 1 +ORDER BY + d1 WITH FILL STEP INTERVAL 1 DAY, + d2 WITH FILL; +``` + +結果: +``` +┌─────────d1─┬─────────d2─┬─source───┐ +│ 1970-01-11 │ 1970-01-02 │ original │ +│ 1970-01-12 │ 1970-01-01 │ │ +│ 1970-01-13 │ 1970-01-01 │ │ +│ 1970-01-14 │ 1970-01-01 │ │ +│ 1970-01-15 │ 1970-01-01 │ │ +│ 1970-01-16 │ 1970-01-01 │ │ +│ 1970-01-17 │ 1970-01-01 │ │ +│ 1970-01-18 │ 1970-01-01 │ │ +│ 1970-01-19 │ 1970-01-01 │ │ +│ 1970-01-20 │ 1970-01-01 │ │ +│ 1970-01-21 │ 1970-01-01 │ │ +│ 1970-01-22 │ 1970-01-01 │ │ +│ 1970-01-23 │ 1970-01-01 │ │ +│ 1970-01-24 │ 1970-01-01 │ │ +│ 1970-01-25 │ 1970-01-01 │ │ +│ 1970-01-26 │ 1970-01-01 │ │ +│ 1970-01-27 │ 1970-01-01 │ │ +│ 1970-01-28 │ 1970-01-01 │ │ +│ 1970-01-29 │ 1970-01-01 │ │ +│ 1970-01-30 │ 1970-01-01 │ │ +│ 1970-01-31 │ 1970-01-01 │ │ +│ 1970-02-01 │ 1970-01-01 │ │ +│ 1970-02-02 │ 1970-01-01 │ │ +│ 1970-02-03 │ 1970-01-01 │ │ +│ 1970-02-04 │ 1970-01-01 │ │ +│ 1970-02-05 │ 1970-01-01 │ │ +│ 1970-02-06 │ 1970-01-01 │ │ +│ 1970-02-07 │ 1970-01-01 │ │ +│ 1970-02-08 │ 1970-01-01 │ │ +│ 1970-02-09 │ 1970-01-01 │ │ +│ 1970-02-10 │ 1970-01-05 │ original │ +│ 1970-02-11 │ 1970-01-01 │ │ +│ 1970-02-12 │ 1970-01-01 │ │ +│ 1970-02-13 │ 1970-01-01 │ │ +│ 1970-02-14 │ 1970-01-01 │ │ +│ 1970-02-15 │ 1970-01-01 │ │ +│ 1970-02-16 │ 1970-01-01 │ │ +│ 1970-02-17 │ 1970-01-01 │ │ +│ 1970-02-18 │ 1970-01-01 │ │ +│ 1970-02-19 │ 1970-01-01 │ │ +│ 1970-02-20 │ 1970-01-01 │ │ +│ 1970-02-21 │ 1970-01-01 │ │ +│ 1970-02-22 │ 1970-01-01 │ │ +│ 1970-02-23 │ 1970-01-01 │ │ +│ 1970-02-24 │ 1970-01-01 │ │ +│ 1970-02-25 │ 1970-01-01 │ │ +│ 1970-02-26 │ 1970-01-01 │ │ +│ 1970-02-27 │ 1970-01-01 │ │ +│ 1970-02-28 │ 1970-01-01 │ │ +│ 1970-03-01 │ 1970-01-01 │ │ +│ 1970-03-02 │ 1970-01-01 │ │ +│ 1970-03-03 │ 1970-01-01 │ │ +│ 1970-03-04 │ 1970-01-01 │ │ +│ 1970-03-05 │ 1970-01-01 │ │ +│ 1970-03-06 │ 1970-01-01 │ │ +│ 1970-03-07 │ 1970-01-01 │ │ +│ 1970-03-08 │ 1970-01-01 │ │ +│ 1970-03-09 │ 1970-01-01 │ │ +│ 1970-03-10 │ 1970-01-01 │ │ +│ 1970-03-11 │ 1970-01-01 │ │ +│ 1970-03-12 │ 1970-01-08 │ original │ +└────────────┴────────────┴──────────┘ +``` + +`STALENESS` を使用しないクエリの例: + +``` sql +SELECT number as key, 5 * number value, 'original' AS source +FROM numbers(16) WHERE key % 5 == 0 +ORDER BY key WITH FILL; +``` + +結果: + +``` text + ┌─key─┬─value─┬─source───┐ + 1. │ 0 │ 0 │ original │ + 2. │ 1 │ 0 │ │ + 3. │ 2 │ 0 │ │ + 4. │ 3 │ 0 │ │ + 5. │ 4 │ 0 │ │ + 6. │ 5 │ 25 │ original │ + 7. │ 6 │ 0 │ │ + 8. │ 7 │ 0 │ │ + 9. │ 8 │ 0 │ │ +10. │ 9 │ 0 │ │ +11. │ 10 │ 50 │ original │ +12. │ 11 │ 0 │ │ +13. │ 12 │ 0 │ │ +14. │ 13 │ 0 │ │ +15. │ 14 │ 0 │ │ +16. │ 15 │ 75 │ original │ + └─────┴───────┴──────────┘ +``` + +`STALENESS 3` を適用した同じクエリ: + +``` sql +SELECT number as key, 5 * number value, 'original' AS source +FROM numbers(16) WHERE key % 5 == 0 +ORDER BY key WITH FILL STALENESS 3; +``` + +結果: + +``` text + ┌─key─┬─value─┬─source───┐ + 1. │ 0 │ 0 │ original │ + 2. │ 1 │ 0 │ │ + 3. │ 2 │ 0 │ │ + 4. │ 5 │ 25 │ original │ + 5. │ 6 │ 0 │ │ + 6. │ 7 │ 0 │ │ + 7. │ 10 │ 50 │ original │ + 8. │ 11 │ 0 │ │ + 9. │ 12 │ 0 │ │ +10. │ 15 │ 75 │ original │ +11. │ 16 │ 0 │ │ +12. │ 17 │ 0 │ │ + └─────┴───────┴──────────┘ +``` + +`INTERPOLATE` を使用しないクエリの例: + +``` sql +SELECT n, source, inter FROM ( + SELECT toFloat32(number % 10) AS n, 'original' AS source, number as inter + FROM numbers(10) WHERE number % 3 = 1 +) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5; +``` + +結果: + +``` text +┌───n─┬─source───┬─inter─┐ +│ 0 │ │ 0 │ +│ 0.5 │ │ 0 │ +│ 1 │ original │ 1 │ +│ 1.5 │ │ 0 │ +│ 2 │ │ 0 │ +│ 2.5 │ │ 0 │ +│ 3 │ │ 0 │ +│ 3.5 │ │ 0 │ +│ 4 │ original │ 4 │ +│ 4.5 │ │ 0 │ +│ 5 │ │ 0 │ +│ 5.5 │ │ 0 │ +│ 7 │ original │ 7 │ +└─────┴──────────┴───────┘ +``` + +`INTERPOLATE` を適用した同じクエリ: + +``` sql +SELECT n, source, inter FROM ( + SELECT toFloat32(number % 10) AS n, 'original' AS source, number as inter + FROM numbers(10) WHERE number % 3 = 1 +) ORDER BY n WITH FILL FROM 0 TO 5.51 STEP 0.5 INTERPOLATE (inter AS inter + 1); +``` + +結果: + +``` text +┌───n─┬─source───┬─inter─┐ +│ 0 │ │ 0 │ +│ 0.5 │ │ 0 │ +│ 1 │ original │ 1 │ +│ 1.5 │ │ 2 │ +│ 2 │ │ 3 │ +│ 2.5 │ │ 4 │ +│ 3 │ │ 5 │ +│ 3.5 │ │ 6 │ +│ 4 │ original │ 4 │ +│ 4.5 │ │ 5 │ +│ 5 │ │ 6 │ +│ 5.5 │ │ 7 │ +│ 7 │ original │ 7 │ +└─────┴──────────┴───────┘ +``` + +## ソートプレフィックスでグループ化されたフィルの充填 + +特定のカラムで同一の値を持つ行を独立して埋めることは有用です。 - 良い例は時系列データの欠落値の埋め込みです。 +以下のような時系列テーブルがあるとします: + +``` sql +CREATE TABLE timeseries +( + `sensor_id` UInt64, + `timestamp` DateTime64(3, 'UTC'), + `value` Float64 +) +ENGINE = Memory; + +SELECT * FROM timeseries; + +┌─sensor_id─┬───────────────timestamp─┬─value─┐ +│ 234 │ 2021-12-01 00:00:03.000 │ 3 │ +│ 432 │ 2021-12-01 00:00:01.000 │ 1 │ +│ 234 │ 2021-12-01 00:00:07.000 │ 7 │ +│ 432 │ 2021-12-01 00:00:05.000 │ 5 │ +└───────────┴─────────────────────────┴───────┘ +``` + +そして、1秒間隔で各センサーごとに欠落値を埋めたいとします。 +達成する方法は `sensor_id` カラムを `timestamp` カラムを填埋するためのソートプレフィックスとして使用することです。 + +``` +SELECT * +FROM timeseries +ORDER BY + sensor_id, + timestamp WITH FILL +INTERPOLATE ( value AS 9999 ) + +┌─sensor_id─┬───────────────timestamp─┬─value─┐ +│ 234 │ 2021-12-01 00:00:03.000 │ 3 │ +│ 234 │ 2021-12-01 00:00:04.000 │ 9999 │ +│ 234 │ 2021-12-01 00:00:05.000 │ 9999 │ +│ 234 │ 2021-12-01 00:00:06.000 │ 9999 │ +│ 234 │ 2021-12-01 00:00:07.000 │ 7 │ +│ 432 │ 2021-12-01 00:00:01.000 │ 1 │ +│ 432 │ 2021-12-01 00:00:02.000 │ 9999 │ +│ 432 │ 2021-12-01 00:00:03.000 │ 9999 │ +│ 432 │ 2021-12-01 00:00:04.000 │ 9999 │ +│ 432 │ 2021-12-01 00:00:05.000 │ 5 │ +└───────────┴─────────────────────────┴───────┘ +``` + +ここで、`value` カラムは埋められた行をより目立たせるために `9999` で補間されました。 +この動作は設定 `use_with_fill_by_sorting_prefix` によって制御されます(デフォルトで有効)。 + +## 関連コンテンツ + +- ブログ: [ClickHouseにおける時系列データの操作](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/sql-reference/statements/select/prewhere.md b/docs/ja/sql-reference/statements/select/prewhere.md new file mode 100644 index 00000000000..f7c59ed52ad --- /dev/null +++ b/docs/ja/sql-reference/statements/select/prewhere.md @@ -0,0 +1,69 @@ +--- +slug: /ja/sql-reference/statements/select/prewhere +sidebar_label: PREWHERE +--- + +# PREWHERE句 + +Prewhereは、より効率的にフィルタリングを適用するための最適化です。`PREWHERE`句が明示的に指定されていなくてもデフォルトで有効化されています。[WHERE](../../../sql-reference/statements/select/where.md)条件の一部を自動的にprewhere段階に移動させることで動作します。`PREWHERE`句の役割は、デフォルトの動作よりも優れた方法で最適化を制御できると思われる場合に、その最適化を制御することです。 + +prewhere最適化を使用することで、まずprewhere式の実行に必要なカラムだけが読み込まれます。その後、クエリの残りを実行するために必要な他のカラムが読み込まれますが、それはprewhere式が少なくとも一部の行で`true`であるブロックだけです。もしprewhere式がすべての行で`false`であるブロックが多く、他のクエリの部分よりもprewhereで必要なカラムの数が少ない場合、クエリ実行のためにディスクから読み込むデータ量を大幅に減らすことができます。 + +## Prewhereの手動制御 + +この句は`WHERE`句と同じ意味を持ちます。違いはテーブルから読み込まれるデータにあります。クエリ内のカラムの一部しか使用しないが、強力なデータフィルタリングを提供するフィルタリング条件で`PREWHERE`を手動で制御すると、読み込むデータの量が減少します。 + +クエリは`PREWHERE`と`WHERE`を同時に指定することができます。この場合、`PREWHERE`が`WHERE`に先行します。 + +[optimize_move_to_prewhere](../../../operations/settings/settings.md#optimize_move_to_prewhere)設定が0に設定されている場合、`WHERE`から`PREWHERE`への式の部分を自動的に移動するヒューリスティクスは無効化されます。 + +クエリが[FINAL](from.md#select-from-final)修飾子を持つ場合、`PREWHERE`の最適化は必ずしも正しくありません。それは[optimize_move_to_prewhere](../../../operations/settings/settings.md#optimize_move_to_prewhere)と[optimize_move_to_prewhere_if_final](../../../operations/settings/settings.md#optimize_move_to_prewhere_if_final)の両設定がオンになっている場合にのみ有効です。 + +:::note +`PREWHERE`セクションは`FINAL`の前に実行されるため、テーブルの`ORDER BY`セクションにないフィールドを使用する`PREWHERE`を使用すると、`FROM ... FINAL`クエリの結果が偏ることがあります。 +::: + +## 制限 + +`PREWHERE`は[*MergeTree](../../../engines/table-engines/mergetree-family/index.md)ファミリのテーブルでのみサポートされています。 + +## 例 + +```sql +CREATE TABLE mydata +( + `A` Int64, + `B` Int8, + `C` String +) +ENGINE = MergeTree +ORDER BY A AS +SELECT + number, + 0, + if(number between 1000 and 2000, 'x', toString(number)) +FROM numbers(10000000); + +SELECT count() +FROM mydata +WHERE (B = 0) AND (C = 'x'); + +1 row in set. Elapsed: 0.074 sec. Processed 10.00 million rows, 168.89 MB (134.98 million rows/s., 2.28 GB/s.) + +-- どの述語がPREWHEREに移動されたかを見るためにトレースを有効にしましょう +set send_logs_level='debug'; + +MergeTreeWhereOptimizer: condition "B = 0" moved to PREWHERE +-- Clickhouseは自動で`B = 0`をPREWHEREに移動しますが、Bは常に0なので意味がありません。 + +-- 他の述語`C = 'x'`を移動しましょう + +SELECT count() +FROM mydata +PREWHERE C = 'x' +WHERE B = 0; + +1 row in set. Elapsed: 0.069 sec. Processed 10.00 million rows, 158.89 MB (144.90 million rows/s., 2.30 GB/s.) + +-- 手動の`PREWHERE`を使ったこのクエリはわずかに少ないデータを処理します: 158.89 MB VS 168.89 MB +``` diff --git a/docs/ja/sql-reference/statements/select/qualify.md b/docs/ja/sql-reference/statements/select/qualify.md new file mode 100644 index 00000000000..82e91351be1 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/qualify.md @@ -0,0 +1,34 @@ +--- +slug: /ja/sql-reference/statements/select/qualify +sidebar_label: QUALIFY +--- + +# QUALIFY句 + +ウィンドウ関数の結果をフィルタリングすることができます。これは[WHERE](../../../sql-reference/statements/select/where.md)句に似ていますが、違いは`WHERE`がウィンドウ関数を評価する前に実行されるのに対し、`QUALIFY`はそれが評価された後に実行される点です。 + +`SELECT`句でエイリアスを使用して、`QUALIFY`句からウィンドウ関数の結果を参照することができます。もしくは、クエリの結果に含まれない追加のウィンドウ関数の結果に基づいてフィルタリングすることも可能です。 + +## 制限事項 + +評価すべきウィンドウ関数がない場合、`QUALIFY`は使用できません。その場合は`WHERE`を使用してください。 + +## 例 + +例: + +``` sql +SELECT number, COUNT() OVER (PARTITION BY number % 3) AS partition_count +FROM numbers(10) +QUALIFY partition_count = 4 +ORDER BY number; +``` + +``` text +┌─number─┬─partition_count─┐ +│ 0 │ 4 │ +│ 3 │ 4 │ +│ 6 │ 4 │ +│ 9 │ 4 │ +└────────┴─────────────────┘ +``` diff --git a/docs/ja/sql-reference/statements/select/sample.md b/docs/ja/sql-reference/statements/select/sample.md new file mode 100644 index 00000000000..ad7d931884a --- /dev/null +++ b/docs/ja/sql-reference/statements/select/sample.md @@ -0,0 +1,114 @@ +--- +slug: /ja/sql-reference/statements/select/sample +sidebar_label: SAMPLE +--- + +# SAMPLE句 + +`SAMPLE`句は、近似の`SELECT`クエリ処理を可能にします。 + +データサンプリングが有効になっている場合、クエリはすべてのデータに対して実行されるのではなく、データの一部(サンプル)のみに対して実行されます。例えば、すべての訪問の統計を計算する必要がある場合、すべての訪問の10分の1のデータに対してクエリを実行し、その結果を10倍するだけで十分です。 + +近似クエリ処理が有用なケースは以下の通りです: + +- 厳格なレイテンシ要件(例えば100ms未満)があるが、これを満たすための追加のハードウェアリソースのコストを正当化できない場合。 +- 生データが正確でないので、近似が品質を明らかに劣化させることはない場合。 +- ビジネス要件が近似結果を目標としている場合(コスト効果のため、または正確な結果をプレミアムユーザーに提供するため)。 + +:::note +サンプリングは、[MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md)ファミリーのテーブルでのみ使用でき、テーブル作成時にサンプリング式が指定された場合のみ使用できます([MergeTreeエンジン](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)を参照)。 +::: + +データサンプリングの特長は以下の通りです: + +- データサンプリングは決定的なメカニズムです。同じ`SELECT .. SAMPLE`クエリの結果は常に同じです。 +- サンプリングは異なるテーブルでも一貫して機能します。単一のサンプリングキーを持つテーブルの場合、同じ係数を持つサンプルは常に可能なデータの同じ部分集合を選択します。例えば、ユーザーIDのサンプルは、異なるテーブルから可能なすべてのユーザーIDの同じ部分集合を持つ行を選択します。これにより、[IN](../../../sql-reference/operators/in.md)句のサブクエリでサンプルを使用できます。また、[JOIN](../../../sql-reference/statements/select/join.md)句を使用してサンプルを結合することができます。 +- サンプリングは、ディスクからのデータ読み取りを減少させます。サンプリングキーを正しく指定する必要があることに注意してください。詳細は[MergeTreeテーブルの作成](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)を参照してください。 + +`SAMPLE`句のサポートされている構文は以下の通りです: + +| SAMPLE 句構文 | 説明 | +|----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `SAMPLE k` | ここで`k`は0から1の数字です。クエリはデータの`k`部分に対して実行されます。例えば、`SAMPLE 0.1`はデータの10%でクエリを実行します。[詳細を読む](#sample-k) | +| `SAMPLE n` | ここで`n`は十分に大きい整数です。クエリは少なくとも`n`行のサンプルで実行されます(ただし、それより大幅に多くはありません)。例えば、`SAMPLE 10000000`は最低でも10,000,000行でクエリを実行します。[詳細を読む](#sample-n) | +| `SAMPLE k OFFSET m` | ここで`k`および`m`は0から1の数字です。クエリはデータの`k`部分のサンプルで実行されます。使用されるデータは`m`部分だけオフセットされます。[詳細を読む](#sample-k-offset-m) | + +## SAMPLE K + +ここで`k`は0から1の数字(小数および分数の表記がサポートされています)です。例えば、`SAMPLE 1/2`または`SAMPLE 0.5`。 + +`SAMPLE k`句では、データの`k`部分のサンプルからデータを抽出します。以下に例を示します: + +``` sql +SELECT + Title, + count() * 10 AS PageViews +FROM hits_distributed +SAMPLE 0.1 +WHERE + CounterID = 34 +GROUP BY Title +ORDER BY PageViews DESC LIMIT 1000 +``` + +この例では、クエリはデータの0.1(10%)のサンプルで実行されます。集計関数の値は自動的に補正されないため、近似結果を得るには`count()`の値を手動で10倍する必要があります。 + +## SAMPLE N + +ここで`n`は十分に大きい整数です。例えば、`SAMPLE 10000000`。 + +この場合、クエリは少なくとも`n`行のサンプルで実行されます(ただし、それより大幅に多くはありません)。例えば、`SAMPLE 10000000`は最低でも10,000,000行でクエリを実行します。 + +データ読み取りの最小単位は1つのグラニュールであるため(そのサイズは`index_granularity`設定で設定されます)、グラニュールのサイズよりも大きいサンプルを設定することが意味があります。 + +`SAMPLE n`句を使用する場合、処理されたデータの相対的な割合を把握することはできません。したがって、集計関数をどれだけ倍にするべきかを知ることはできません。近似の結果を得るためには、仮想カラム`_sample_factor`を使用します。 + +`_sample_factor`カラムは動的に計算される相対的な係数を含みます。このカラムは、サンプリングキーを指定してテーブルを[作成](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)する際に自動的に作成されます。`_sample_factor`カラムの使用例を以下に示します。 + +サイト訪問の統計を含むテーブル`visits`を考えます。最初の例はページビュー数を計算する方法を示しています: + +``` sql +SELECT sum(PageViews * _sample_factor) +FROM visits +SAMPLE 10000000 +``` + +次の例は、訪問の総数を計算する方法を示しています: + +``` sql +SELECT sum(_sample_factor) +FROM visits +SAMPLE 10000000 +``` + +以下の例は、セッションの平均継続時間を計算する方法を示しています。平均値を計算するには、相対的係数を使用する必要はありません。 + +``` sql +SELECT avg(Duration) +FROM visits +SAMPLE 10000000 +``` + +## SAMPLE K OFFSET M + +ここで`k`および`m`は0から1の数字です。以下に例を示します。 + +**例 1** + +``` sql +SAMPLE 1/10 +``` + +この例では、すべてのデータの1/10のサンプルです: + +`[++------------]` + +**例 2** + +``` sql +SAMPLE 1/10 OFFSET 1/2 +``` + +ここで、データの後半から10%のサンプルが取られます。 + +`[------++------]` diff --git a/docs/ja/sql-reference/statements/select/union.md b/docs/ja/sql-reference/statements/select/union.md new file mode 100644 index 00000000000..e93df6d02df --- /dev/null +++ b/docs/ja/sql-reference/statements/select/union.md @@ -0,0 +1,85 @@ +--- +slug: /ja/sql-reference/statements/select/union +sidebar_label: UNION +--- + +# UNION句 + +`UNION`は`UNION ALL`または`UNION DISTINCT`を明示的に指定して使用できます。 + +`ALL`または`DISTINCT`を指定しない場合、`union_default_mode`設定に依存します。`UNION ALL`と`UNION DISTINCT`の違いは、`UNION DISTINCT`ではUNIONの結果に対して重複排除変換が行われることです。これは`UNION ALL`を含むサブクエリから`SELECT DISTINCT`を行うことと同等です。 + +任意の数の`SELECT`クエリの結果を拡張して組み合わせるために`UNION`を使用できます。例: + +``` sql +SELECT CounterID, 1 AS table, toInt64(count()) AS c + FROM test.hits + GROUP BY CounterID + +UNION ALL + +SELECT CounterID, 2 AS table, sum(Sign) AS c + FROM test.visits + GROUP BY CounterID + HAVING c > 0 +``` + +結果のカラムはそのインデックス(`SELECT`内の順序)に基づいて一致します。カラム名が一致しない場合、最終結果のカラム名は最初のクエリから取得されます。 + +Unionのために型キャストが行われます。たとえば、同じフィールドを持つ二つのクエリを結合する際に、そのフィールドが非`Nullable`型と互換性のある`Nullable`型の場合、結果の`UNION`フィールドは`Nullable`型になります。 + +`UNION`の一部であるクエリを丸括弧で囲むことができます。[ORDER BY](../../../sql-reference/statements/select/order-by.md)や[LIMIT](../../../sql-reference/statements/select/limit.md)は、個別のクエリに適用され、最終結果には適用されません。最終結果に変換を適用する必要がある場合、すべてのクエリを`UNION`で`FROM`句内のサブクエリに配置できます。 + +`UNION`を`UNION ALL`または`UNION DISTINCT`を明示的に指定せずに使用する場合は、[union_default_mode](../../../operations/settings/settings.md#union-default-mode)設定を使用してUnionモードを指定できます。設定値は`ALL`、`DISTINCT`、または空文字列のいずれかです。しかし、`UNION`を`union_default_mode`設定で空文字列にすると、例外がスローされます。以下の例は、異なる設定値を持つクエリの結果を示しています。 + +クエリ: + +```sql +SET union_default_mode = 'DISTINCT'; +SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2; +``` + +結果: + +```text +┌─1─┐ +│ 1 │ +└───┘ +┌─1─┐ +│ 2 │ +└───┘ +┌─1─┐ +│ 3 │ +└───┘ +``` + +クエリ: + +```sql +SET union_default_mode = 'ALL'; +SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2; +``` + +結果: + +```text +┌─1─┐ +│ 1 │ +└───┘ +┌─1─┐ +│ 2 │ +└───┘ +┌─1─┐ +│ 2 │ +└───┘ +┌─1─┐ +│ 3 │ +└───┘ +``` + +`UNION/UNION ALL/UNION DISTINCT`の一部であるクエリは同時に実行され、その結果を組み合わせることができます。 + +**参照** + +- [insert_null_as_default](../../../operations/settings/settings.md#insert_null_as_default) 設定。 +- [union_default_mode](../../../operations/settings/settings.md#union-default-mode) 設定。 diff --git a/docs/ja/sql-reference/statements/select/where.md b/docs/ja/sql-reference/statements/select/where.md new file mode 100644 index 00000000000..46d714cb5fa --- /dev/null +++ b/docs/ja/sql-reference/statements/select/where.md @@ -0,0 +1,57 @@ +--- +slug: /ja/sql-reference/statements/select/where +sidebar_label: WHERE +--- + +# WHERE 句 + +`WHERE` 句は、`SELECT` の [FROM](../../../sql-reference/statements/select/from.md) 句から取得したデータをフィルタリングするために使用します。 + +`WHERE` 句がある場合、`UInt8` 型の式を含める必要があります。これは通常、比較および論理演算子を使用した式です。この式が `0` と評価される行は、以降の変換や結果から除外されます。 + +`WHERE` 式は、基になるテーブルエンジンがインデックスやパーティションプルーニングをサポートしている場合、その能力を使用するために評価されます。 + +:::note +[PREWHERE](../../../sql-reference/statements/select/prewhere.md) と呼ばれるフィルタリングの最適化があります。 +::: + +[NULL](../../../sql-reference/syntax.md#null-literal) をテストする必要がある場合は、[IS NULL](../../operators/index.md#operator-is-null) や [IS NOT NULL](../../operators/index.md#is-not-null) 演算子、または [isNull](../../../sql-reference/functions/functions-for-nulls.md#isnull) と [isNotNull](../../../sql-reference/functions/functions-for-nulls.md#isnotnull) 関数を使用してください。そうでないと、`NULL` を含む式は決して通過しません。 + +**例** + +3 の倍数であり、かつ 10 より大きい数を見つけるには、[numbers テーブル](../../../sql-reference/table-functions/numbers.md)で次のクエリを実行します: + +``` sql +SELECT number FROM numbers(20) WHERE (number > 10) AND (number % 3 == 0); +``` + +結果: + +``` text +┌─number─┐ +│ 12 │ +│ 15 │ +│ 18 │ +└────────┘ +``` + +`NULL` 値を含むクエリ: + +``` sql +CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x; +INSERT INTO t_null VALUES (1, NULL), (2, 3); + +SELECT * FROM t_null WHERE y IS NULL; +SELECT * FROM t_null WHERE y != 0; +``` + +結果: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +┌─x─┬─y─┐ +│ 2 │ 3 │ +└───┴───┘ +``` diff --git a/docs/ja/sql-reference/statements/select/with.md b/docs/ja/sql-reference/statements/select/with.md new file mode 100644 index 00000000000..2fca610e664 --- /dev/null +++ b/docs/ja/sql-reference/statements/select/with.md @@ -0,0 +1,312 @@ +--- +slug: /ja/sql-reference/statements/select/with +sidebar_label: WITH +--- + +# WITH句 + +ClickHouseは共通テーブル式(CTE)をサポートしており、`WITH`句で定義されたコードを`SELECT`クエリの他のすべての使用箇所で置き換えます。名前付きサブクエリは、テーブルオブジェクトが許可される場所に、現在のクエリコンテキストおよび子クエリコンテキストに含めることができます。現在のレベルのCTEをWITH式から隠すことで再帰を防止します。 + +CTEはすべての呼び出し箇所で同じ結果を保証しないことに注意してください。使用ケースごとにクエリが再実行されるためです。 + +以下に、そのような動作の例を示します。 +``` sql +with cte_numbers as +( + select + num + from generateRandom('num UInt64', NULL) + limit 1000000 +) +select + count() +from cte_numbers +where num in (select num from cte_numbers) +``` +CTEが単にコード片ではなく正確に結果を返すなら、常に`1000000`を見ることになるでしょう。 + +しかし、`cte_numbers`を2回参照しているため、毎回ランダムな数が生成され、それに応じて異なるランダムな結果が表示されます。例えば、`280501, 392454, 261636, 196227`などです。 + +## 文法 + +``` sql +WITH AS +``` +または +``` sql +WITH AS +``` + +## 例 + +**例1:** 定数式を「変数」として使用する + +``` sql +WITH '2019-08-01 15:23:00' as ts_upper_bound +SELECT * +FROM hits +WHERE + EventDate = toDate(ts_upper_bound) AND + EventTime <= ts_upper_bound; +``` + +**例2:** `SELECT`句のカラムリストからsum(bytes)の式結果を排除する + +``` sql +WITH sum(bytes) as s +SELECT + formatReadableSize(s), + table +FROM system.parts +GROUP BY table +ORDER BY s; +``` + +**例3:** スカラサブクエリの結果を使用する + +``` sql +/* この例では最も大きなテーブルのTOP 10を返します */ +WITH + ( + SELECT sum(bytes) + FROM system.parts + WHERE active + ) AS total_disk_usage +SELECT + (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage, + table +FROM system.parts +GROUP BY table +ORDER BY table_disk_usage DESC +LIMIT 10; +``` + +**例4:** サブクエリ内で式を再利用する + +``` sql +WITH test1 AS (SELECT i + 1, j + 1 FROM test1) +SELECT * FROM test1; +``` + +## 再帰クエリ + +オプションのRECURSIVE修飾子により、WITHクエリが自身の出力を参照することができます。例: + +**例:** 1から100までの整数の合計 + +```sql +WITH RECURSIVE test_table AS ( + SELECT 1 AS number +UNION ALL + SELECT number + 1 FROM test_table WHERE number < 100 +) +SELECT sum(number) FROM test_table; +``` + +``` text +┌─sum(number)─┐ +│ 5050 │ +└─────────────┘ +``` + +再帰的な`WITH`クエリの一般的な形式は、常に非再帰の項、次に`UNION ALL`、次に再帰の項が続き、再帰の項のみがクエリの自身の出力を参照できます。再帰CTEクエリは次のように実行されます: + +1. 非再帰の項を評価します。非再帰の項クエリの結果を一時的な作業テーブルに配置します。 +2. 作業テーブルが空でない限り、これらのステップを繰り返します: + 1. 再帰の項を評価し、作業テーブルの現在の内容を再帰的な自己参照として使用します。再帰の項クエリの結果を一時的な中間テーブルに配置します。 + 2. 作業テーブルの内容を中間テーブルの内容で置き換え、中間テーブルを空にします。 + +再帰クエリは通常、階層データや木構造のデータを扱うために使用されます。例えば、木構造を探索するクエリを書くことができます: + +**例:** 木構造探索 + +まず、ツリーテーブルを作成しましょう: + +```sql +DROP TABLE IF EXISTS tree; +CREATE TABLE tree +( + id UInt64, + parent_id Nullable(UInt64), + data String +) ENGINE = MergeTree ORDER BY id; + +INSERT INTO tree VALUES (0, NULL, 'ROOT'), (1, 0, 'Child_1'), (2, 0, 'Child_2'), (3, 1, 'Child_1_1'); +``` + +このツリーを探索するためのクエリは以下の通りです: + +**例:** 木構造探索 +```sql +WITH RECURSIVE search_tree AS ( + SELECT id, parent_id, data + FROM tree t + WHERE t.id = 0 +UNION ALL + SELECT t.id, t.parent_id, t.data + FROM tree t, search_tree st + WHERE t.parent_id = st.id +) +SELECT * FROM search_tree; +``` + +```text +┌─id─┬─parent_id─┬─data──────┐ +│ 0 │ ᴺᵁᴸᴸ │ ROOT │ +│ 1 │ 0 │ Child_1 │ +│ 2 │ 0 │ Child_2 │ +│ 3 │ 1 │ Child_1_1 │ +└────┴───────────┴───────────┘ +``` + +### 探索順序 + +深さ優先順を作成するためには、訪問済みの行の配列を各結果行に計算します: + +**例:** 深さ優先順による木構造探索 +```sql +WITH RECURSIVE search_tree AS ( + SELECT id, parent_id, data, [t.id] AS path + FROM tree t + WHERE t.id = 0 +UNION ALL + SELECT t.id, t.parent_id, t.data, arrayConcat(path, [t.id]) + FROM tree t, search_tree st + WHERE t.parent_id = st.id +) +SELECT * FROM search_tree ORDER BY path; +``` + +```text +┌─id─┬─parent_id─┬─data──────┬─path────┐ +│ 0 │ ᴺᵁᴸᴸ │ ROOT │ [0] │ +│ 1 │ 0 │ Child_1 │ [0,1] │ +│ 3 │ 1 │ Child_1_1 │ [0,1,3] │ +│ 2 │ 0 │ Child_2 │ [0,2] │ +└────┴───────────┴───────────┴─────────┘ +``` + +幅優先順を作成するためには、探索の深さを追跡するカラムを追加するのが標準的なアプローチです: + +**例:** 幅優先順による木構造探索 +```sql +WITH RECURSIVE search_tree AS ( + SELECT id, parent_id, data, [t.id] AS path, toUInt64(0) AS depth + FROM tree t + WHERE t.id = 0 +UNION ALL + SELECT t.id, t.parent_id, t.data, arrayConcat(path, [t.id]), depth + 1 + FROM tree t, search_tree st + WHERE t.parent_id = st.id +) +SELECT * FROM search_tree ORDER BY depth; +``` + +```text +┌─id─┬─link─┬─data──────┬─path────┬─depth─┐ +│ 0 │ ᴺᵁᴸᴸ │ ROOT │ [0] │ 0 │ +│ 1 │ 0 │ Child_1 │ [0,1] │ 1 │ +│ 2 │ 0 │ Child_2 │ [0,2] │ 1 │ +│ 3 │ 1 │ Child_1_1 │ [0,1,3] │ 2 │ +└────┴──────┴───────────┴─────────┴───────┘ +``` + +### サイクル検出 + +まずグラフテーブルを作成しましょう: + +```sql +DROP TABLE IF EXISTS graph; +CREATE TABLE graph +( + from UInt64, + to UInt64, + label String +) ENGINE = MergeTree ORDER BY (from, to); + +INSERT INTO graph VALUES (1, 2, '1 -> 2'), (1, 3, '1 -> 3'), (2, 3, '2 -> 3'), (1, 4, '1 -> 4'), (4, 5, '4 -> 5'); +``` + +このグラフを探索するためのクエリは以下の通りです: + +**例:** サイクル検出なしのグラフ探索 +```sql +WITH RECURSIVE search_graph AS ( + SELECT from, to, label FROM graph g + UNION ALL + SELECT g.from, g.to, g.label + FROM graph g, search_graph sg + WHERE g.from = sg.to +) +SELECT DISTINCT * FROM search_graph ORDER BY from; +``` +```text +┌─from─┬─to─┬─label──┐ +│ 1 │ 4 │ 1 -> 4 │ +│ 1 │ 2 │ 1 -> 2 │ +│ 1 │ 3 │ 1 -> 3 │ +│ 2 │ 3 │ 2 -> 3 │ +│ 4 │ 5 │ 4 -> 5 │ +└──────┴────┴────────┘ +``` + +しかし、グラフにサイクルを加えると、前のクエリは`最大再帰CTE評価深度`エラーで失敗します: + +```sql +INSERT INTO graph VALUES (5, 1, '5 -> 1'); + +WITH RECURSIVE search_graph AS ( + SELECT from, to, label FROM graph g +UNION ALL + SELECT g.from, g.to, g.label + FROM graph g, search_graph sg + WHERE g.from = sg.to +) +SELECT DISTINCT * FROM search_graph ORDER BY from; +``` + +```text +コード: 306. DB::Exception: 受信しました: localhost:9000から. DB::Exception: 最大再帰CTE評価深度 (1000) を超えました、search_graph AS (SELECT from, to, label FROM graph AS g UNION ALL SELECT g.from, g.to, g.label FROM graph AS g, search_graph AS sg WHERE g.from = sg.to) の評価中。max_recursive_cte_evaluation_depth設定を上げることを検討してください。: RecursiveCTESourceを実行中に (TOO_DEEP_RECURSION) +``` + +循環を処理する標準的な方法は、既に訪問したノードの配列を計算することです: + +**例:** サイクル検出付きグラフ探索 +```sql +WITH RECURSIVE search_graph AS ( + SELECT from, to, label, false AS is_cycle, [tuple(g.from, g.to)] AS path FROM graph g +UNION ALL + SELECT g.from, g.to, g.label, has(path, tuple(g.from, g.to)), arrayConcat(sg.path, [tuple(g.from, g.to)]) + FROM graph g, search_graph sg + WHERE g.from = sg.to AND NOT is_cycle +) +SELECT * FROM search_graph WHERE is_cycle ORDER BY from; +``` + +```text +┌─from─┬─to─┬─label──┬─is_cycle─┬─path──────────────────────┐ +│ 1 │ 4 │ 1 -> 4 │ true │ [(1,4),(4,5),(5,1),(1,4)] │ +│ 4 │ 5 │ 4 -> 5 │ true │ [(4,5),(5,1),(1,4),(4,5)] │ +│ 5 │ 1 │ 5 -> 1 │ true │ [(5,1),(1,4),(4,5),(5,1)] │ +└──────┴────┴────────┴──────────┴───────────────────────────┘ +``` + +### 無限クエリ + +外部クエリで`LIMIT`を使用する場合、無限再帰CTEクエリを使用することも可能です: + +**例:** 無限再帰CTEクエリ +```sql +WITH RECURSIVE test_table AS ( + SELECT 1 AS number +UNION ALL + SELECT number + 1 FROM test_table +) +SELECT sum(number) FROM (SELECT number FROM test_table LIMIT 100); +``` + +```text +┌─sum(number)─┐ +│ 5050 │ +└─────────────┘ +``` diff --git a/docs/ja/sql-reference/statements/set-role.md b/docs/ja/sql-reference/statements/set-role.md new file mode 100644 index 00000000000..d4933aa638b --- /dev/null +++ b/docs/ja/sql-reference/statements/set-role.md @@ -0,0 +1,48 @@ +--- +slug: /ja/sql-reference/statements/set-role +sidebar_position: 51 +sidebar_label: SET ROLE +title: "SET ROLE ステートメント" +--- + +現在のユーザーに対してロールをアクティベートします。 + +``` sql +SET ROLE {DEFAULT | NONE | role [,...] | ALL | ALL EXCEPT role [,...]} +``` + +## SET DEFAULT ROLE + +ユーザーにデフォルトのロールを設定します。 + +デフォルトのロールはユーザーのログイン時に自動的にアクティベートされます。デフォルトとして設定するには、事前に付与されたロールのみを使用できます。ユーザーにロールが付与されていない場合、ClickHouseは例外をスローします。 + +``` sql +SET DEFAULT ROLE {NONE | role [,...] | ALL | ALL EXCEPT role [,...]} TO {user|CURRENT_USER} [,...] +``` + +## 例 + +複数のデフォルトロールをユーザーに設定します: + +``` sql +SET DEFAULT ROLE role1, role2, ... TO user +``` + +付与されたすべてのロールをユーザーのデフォルトとして設定します: + +``` sql +SET DEFAULT ROLE ALL TO user +``` + +ユーザーからデフォルトロールをすべて除外します: + +``` sql +SET DEFAULT ROLE NONE TO user +``` + +特定のロール `role1` と `role2` を除いて、付与されたすべてのロールをデフォルトとして設定します: + +``` sql +SET DEFAULT ROLE ALL EXCEPT role1, role2 TO user +``` diff --git a/docs/ja/sql-reference/statements/set.md b/docs/ja/sql-reference/statements/set.md new file mode 100644 index 00000000000..0983400e298 --- /dev/null +++ b/docs/ja/sql-reference/statements/set.md @@ -0,0 +1,21 @@ +--- +slug: /ja/sql-reference/statements/set +sidebar_position: 50 +sidebar_label: SET +--- + +# SET ステートメント + +``` sql +SET param = value +``` + +現在のセッションの`param` [設定](../../operations/settings/index.md)に`value`を割り当てます。この方法では[サーバー設定](../../operations/server-configuration-parameters/settings.md)を変更することはできません。 + +また、指定された設定プロファイルからすべての値を単一のクエリで設定することもできます。 + +``` sql +SET profile = 'profile-name-from-the-settings-file' +``` + +詳細については、[設定](../../operations/settings/settings.md)を参照してください。 diff --git a/docs/ja/sql-reference/statements/show.md b/docs/ja/sql-reference/statements/show.md new file mode 100644 index 00000000000..7e92f70a9f7 --- /dev/null +++ b/docs/ja/sql-reference/statements/show.md @@ -0,0 +1,705 @@ +--- +slug: /ja/sql-reference/statements/show +sidebar_position: 37 +sidebar_label: SHOW +--- + +# SHOW ステートメント + +N.B. `SHOW CREATE (TABLE|DATABASE|USER)` は、[`display_secrets_in_show_and_select` サーバー設定](../../operations/server-configuration-parameters/settings#display_secrets_in_show_and_select)が有効になっておらず、[`format_display_secrets_in_show_and_select` フォーマット設定](../../operations/settings/formats#format_display_secrets_in_show_and_select)が有効になっておらず、またユーザーに[`displaySecretsInShowAndSelect`](grant.md#display-secrets) 権限がない限り、秘密情報を隠すようにします。 + +## SHOW CREATE TABLE | DICTIONARY | VIEW | DATABASE + +``` sql +SHOW [CREATE] [TEMPORARY] TABLE|DICTIONARY|VIEW|DATABASE [db.]table|view [INTO OUTFILE filename] [FORMAT format] +``` + +指定されたオブジェクトを作成するために使用されたCREATEクエリを含む、String型の単一のカラムを返します。 + +`SHOW TABLE t` および `SHOW DATABASE db` は `SHOW CREATE TABLE|DATABASE t|db` と同じ意味を持ちますが、`SHOW t` および `SHOW db` はサポートされていません。 + +システムテーブルの `CREATE` クエリを取得するためにこのステートメントを使用すると、テーブル構造のみを宣言する *偽の* クエリが返され、テーブルを作成するために使用することはできません。 + +## SHOW DATABASES + +すべてのデータベースの一覧を表示します。 + +```sql +SHOW DATABASES [[NOT] LIKE | ILIKE ''] [LIMIT ] [INTO OUTFILE filename] [FORMAT format] +``` + +このステートメントは、次のクエリと同一です: + +```sql +SELECT name FROM system.databases [WHERE name [NOT] LIKE | ILIKE ''] [LIMIT ] [INTO OUTFILE filename] [FORMAT format] +``` + +**例** + +名前に 'de' というシーケンスを含むデータベース名を取得する: + +``` sql +SHOW DATABASES LIKE '%de%' +``` + +結果: + +``` text +┌─name────┐ +│ default │ +└─────────┘ +``` + +大文字小文字を区別しない方法で、名前に 'de' というシーケンスを含むデータベース名を取得する: + +``` sql +SHOW DATABASES ILIKE '%DE%' +``` + +結果: + +``` text +┌─name────┐ +│ default │ +└─────────┘ +``` + +名前に 'de' というシーケンスを含まないデータベース名を取得する: + +``` sql +SHOW DATABASES NOT LIKE '%de%' +``` + +結果: + +``` text +┌─name───────────────────────────┐ +│ _temporary_and_external_tables │ +│ system │ +│ test │ +│ tutorial │ +└────────────────────────────────┘ +``` + +データベース名から最初の二行を取得する: + +``` sql +SHOW DATABASES LIMIT 2 +``` + +結果: + +``` text +┌─name───────────────────────────┐ +│ _temporary_and_external_tables │ +│ default │ +└────────────────────────────────┘ +``` + +**参考** +- [CREATE DATABASE](https://clickhouse.com/docs/ja/sql-reference/statements/create/database/#query-language-create-database) + +## SHOW TABLES + +テーブルのリストを表示します。 + +```sql +SHOW [FULL] [TEMPORARY] TABLES [{FROM | IN} ] [[NOT] LIKE | ILIKE ''] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +`FROM` 句が指定されていない場合、クエリは現在のデータベースのテーブルリストを返します。 + +このステートメントは、次のクエリと同一です: + +```sql +SELECT name FROM system.tables [WHERE name [NOT] LIKE | ILIKE ''] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +**例** + +名前に 'user' というシーケンスを含むテーブル名を取得する: + +``` sql +SHOW TABLES FROM system LIKE '%user%' +``` + +結果: + +``` text +┌─name─────────────┐ +│ user_directories │ +│ users │ +└──────────────────┘ +``` + +大文字小文字を区別しない方法で、名前に 'user' を含むテーブル名を取得する: + +``` sql +SHOW TABLES FROM system ILIKE '%USER%' +``` + +結果: + +``` text +┌─name─────────────┐ +│ user_directories │ +│ users │ +└──────────────────┘ +``` + +名前に 's' というシンボルシーケンスを含まないテーブル名を取得する: + +``` sql +SHOW TABLES FROM system NOT LIKE '%s%' +``` + +結果: + +``` text +┌─name─────────┐ +│ metric_log │ +│ metric_log_0 │ +│ metric_log_1 │ +└──────────────┘ +``` + +テーブル名から最初の二行を取得する: + +``` sql +SHOW TABLES FROM system LIMIT 2 +``` + +結果: + +``` text +┌─name───────────────────────────┐ +│ aggregate_function_combinators │ +│ asynchronous_metric_log │ +└────────────────────────────────┘ +``` + +**参考** + +- [Create Tables](https://clickhouse.com/docs/ja/getting-started/tutorial/#create-tables) +- [SHOW CREATE TABLE](https://clickhouse.com/docs/ja/sql-reference/statements/show/#show-create-table) + +## SHOW COLUMNS {#show_columns} + +カラムのリストを表示します + +```sql +SHOW [EXTENDED] [FULL] COLUMNS {FROM | IN}
    [{FROM | IN} ] [{[NOT] {LIKE | ILIKE} '' | WHERE }] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +データベース名とテーブル名は、`.
    ` の省略形で指定でき、`FROM tab FROM db` および `FROM db.tab` は等価です。データベースが指定されていない場合、クエリは現在のデータベースからカラムのリストを返します。 + +オプションのキーワード `EXTENDED` は現在、効果はありません。これはMySQLとの互換性のために存在します。 + +オプションのキーワード `FULL` は、出力に照合順序、コメント、特権カラムを含めるようにします。 + +このステートメントは以下の構造を持つ結果テーブルを生成します: +- `field` - カラムの名前 (String) +- `type` - カラムデータ型。クエリがMySQLワイヤープロトコルを通じて行われた場合、MySQLでの同等の型名が表示されます。 (String) +- `null` - カラムデータ型がNullableの場合は `YES`、それ以外は `NO` (String) +- `key` - カラムが主キーの一部の場合は `PRI`、ソートキーの一部の場合は `SOR`、その他の場合は空 (String) +- `default` - カラムが `ALIAS`、`DEFAULT`、または `MATERIALIZED` 型の場合のデフォルト式。他は `NULL`。 (Nullable(String)) +- `extra` - 追加情報、現在は未使用 (String) +- `collation` - (`FULL` キーワードを指定した場合のみ) カラムの照合順序、ClickHouseにはカラムごとの照合順序がないため常に `NULL` (Nullable(String)) +- `comment` - (`FULL` キーワードを指定した場合のみ) カラムのコメント (String) +- `privilege` - (`FULL` キーワードを指定した場合のみ) このカラムに対する特権、現在は利用できません (String) + +**例** + +'order' テーブル内の 'delivery_' で始まるすべてのカラムの情報を取得: + +```sql +SHOW COLUMNS FROM 'orders' LIKE 'delivery_%' +``` + +結果: + +``` text +┌─field───────────┬─type─────┬─null─┬─key─────┬─default─┬─extra─┐ +│ delivery_date │ DateTime │ 0 │ PRI SOR │ ᴺᵁᴸᴸ │ │ +│ delivery_status │ Bool │ 0 │ │ ᴺᵁᴸᴸ │ │ +└─────────────────┴──────────┴──────┴─────────┴─────────┴───────┘ +``` + +**参考** +- [system.columns](https://clickhouse.com/docs/ja/operations/system-tables/columns) + +## SHOW DICTIONARIES + +[Dictionary](../../sql-reference/dictionaries/index.md) のリストを表示します。 + +``` sql +SHOW DICTIONARIES [FROM ] [LIKE ''] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +`FROM` 句が指定されていない場合、クエリは現在のデータベースからのDictionaryのリストを返します。 + +`SHOW DICTIONARIES` クエリと同じ結果を次の方法で取得できます: + +``` sql +SELECT name FROM system.dictionaries WHERE database = [AND name LIKE ] [LIMIT ] [INTO OUTFILE ] [FORMAT ] +``` + +**例** + +次のクエリは、名前に `reg` を含む、`system` データベースのテーブルから最初の2行を選択します。 + +``` sql +SHOW DICTIONARIES FROM db LIKE '%reg%' LIMIT 2 +``` + +``` text +┌─name─────────┐ +│ regions │ +│ region_names │ +└──────────────┘ +``` + +## SHOW INDEX + +テーブルの主キー及びデータスキッピングインデックスのリストを表示します。 + +このステートメントは主にMySQLとの互換性のために存在します。システムテーブル [system.tables](../../operations/system-tables/tables.md) (主キー用) および [system.data_skipping_indices](../../operations/system-tables/data_skipping_indices.md) (データスキッピングインデックス用) は、ClickHouseによりネイティブな形で同等の情報を提供します。 + +```sql +SHOW [EXTENDED] {INDEX | INDEXES | INDICES | KEYS } {FROM | IN}
    [{FROM | IN} ] [WHERE ] [INTO OUTFILE ] [FORMAT ] +``` + +データベースおよびテーブル名は、`.
    ` の省略形で指定でき、`FROM tab FROM db` および `FROM db.tab` は等価です。データベースが指定されていない場合、クエリは現在のデータベースをデータベースとして想定します。 + +オプションのキーワード `EXTENDED` は現在、効果はありません。これはMySQLとの互換性のために存在します。 + +このステートメントは以下の構造を持つ結果テーブルを生成します: +- `table` - テーブル名。(String) +- `non_unique` - ClickHouseは一意性制約をサポートしていないため、常に `1`。(UInt8) +- `key_name` - インデックス名、主キーインデックスの場合は `PRIMARY`。(String) +- `seq_in_index` - 主キーインデックスの場合、カラムの位置は `1` から始まります。データスキッピングインデックスの場合:常に `1`。(UInt8) +- `column_name` - 主キーインデックスの場合、カラム名。データスキッピングインデックスの場合:`''` (空文字列)、フィールド "expression" を参照。(String) +- `collation` - インデックス内のカラムのソート順序:昇順の場合は `A`、降順の場合は `D`、ソートされていない場合は `NULL`。(Nullable(String)) +- `cardinality` - インデックスのカーディナリティ(インデックス内の一意の値の数)の推定値。現在は常に 0。(UInt64) +- `sub_part` - ClickHouseはMySQLのようなインデックスのプレフィックスをサポートしていないため、常に `NULL`。(Nullable(String)) +- `packed` - ClickHouseはMySQLのようなパックドインデックスをサポートしていないため、常に `NULL`。(Nullable(String)) +- `null` - 現在未使用 +- `index_type` - インデックスタイプ、例:`PRIMARY`、`MINMAX`、`BLOOM_FILTER` など。(String) +- `comment` - 現在常に `''`(空文字列)であるインデックスに関する追加情報。(String) +- `index_comment` - ClickHouseではインデックスに `COMMENT` フィールド(MySQLのような)を持たせることができないため、`''`(空文字列)。(String) +- `visible` - インデックスがオプティマイザに見える場合、常に `YES`。(String) +- `expression` - データスキッピングインデックスの場合、インデックス式。主キーインデックスの場合:`''`(空文字列)。(String) + +**例** + +'tbl' テーブル内のすべてのインデックスの情報を取得: + +```sql +SHOW INDEX FROM 'tbl' +``` + +結果: + +``` text +┌─table─┬─non_unique─┬─key_name─┬─seq_in_index─┬─column_name─┬─collation─┬─cardinality─┬─sub_part─┬─packed─┬─null─┬─index_type───┬─comment─┬─index_comment─┬─visible─┬─expression─┐ +│ tbl │ 1 │ blf_idx │ 1 │ 1 │ ᴺᵁᴸᴸ │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ BLOOM_FILTER │ │ │ YES │ d, b │ +│ tbl │ 1 │ mm1_idx │ 1 │ 1 │ ᴺᵁᴸᴸ │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ MINMAX │ │ │ YES │ a, c, d │ +│ tbl │ 1 │ mm2_idx │ 1 │ 1 │ ᴺᵁᴸᴸ │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ MINMAX │ │ │ YES │ c, d, e │ +│ tbl │ 1 │ PRIMARY │ 1 │ c │ A │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ PRIMARY │ │ │ YES │ │ +│ tbl │ 1 │ PRIMARY │ 2 │ a │ A │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ PRIMARY │ │ │ YES │ │ +│ tbl │ 1 │ set_idx │ 1 │ 1 │ ᴺᵁᴸᴸ │ 0 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ SET │ │ │ YES │ e │ +└───────┴────────────┴──────────┴──────────────┴─────────────┴───────────┴─────────────┴──────────┴────────┴──────┴──────────────┴─────────┴───────────────┴─────────┴────────────┘ +``` + +**参考** +- [system.tables](../../operations/system-tables/tables.md) +- [system.data_skipping_indices](../../operations/system-tables/data_skipping_indices.md) + +## SHOW PROCESSLIST + +``` sql +SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format] +``` + +[system.processes](../../operations/system-tables/processes.md#system_tables-processes) テーブルの内容を出力します。このテーブルには、現在処理中のクエリのリストが含まれており、`SHOW PROCESSLIST` クエリは除外されます。 + +`SELECT * FROM system.processes` クエリは、すべての現在のクエリに関するデータを返します。 + +Tip (コンソールで実行): + +``` bash +$ watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'" +``` + +## SHOW GRANTS + +ユーザーの特権を表示します。 + +**構文** + +``` sql +SHOW GRANTS [FOR user1 [, user2 ...]] [WITH IMPLICIT] [FINAL] +``` + +ユーザーが指定されていない場合、クエリは現在のユーザーの特権を返します。 + +`WITH IMPLICIT` 修飾子は、暗黙の権限を表示することを可能にします(例:`GRANT SELECT ON system.one`) + +`FINAL` 修飾子は、ユーザーとその付与された役割(継承付き)からすべての権限をマージします。 + +## SHOW CREATE USER + +[ユーザー作成](../../sql-reference/statements/create/user.md)で使用されたパラメーターを表示します。 + +**構文** + +``` sql +SHOW CREATE USER [name1 [, name2 ...] | CURRENT_USER] +``` + +## SHOW CREATE ROLE + +[ロール作成](../../sql-reference/statements/create/role.md)で使用されたパラメーターを表示します。 + +**構文** + +``` sql +SHOW CREATE ROLE name1 [, name2 ...] +``` + +## SHOW CREATE ROW POLICY + +[ローポリシー作成](../../sql-reference/statements/create/row-policy.md)で使用されたパラメーターを表示します。 + +**構文** + +``` sql +SHOW CREATE [ROW] POLICY name ON [database1.]table1 [, [database2.]table2 ...] +``` + +## SHOW CREATE QUOTA + +[クォータ作成](../../sql-reference/statements/create/quota.md)で使用されたパラメーターを表示します。 + +**構文** + +``` sql +SHOW CREATE QUOTA [name1 [, name2 ...] | CURRENT] +``` + +## SHOW CREATE SETTINGS PROFILE + +[設定プロファイル作成](../../sql-reference/statements/create/settings-profile.md)で使用されたパラメーターを表示します。 + +**構文** + +``` sql +SHOW CREATE [SETTINGS] PROFILE name1 [, name2 ...] +``` + +## SHOW USERS + +[ユーザーアカウント](../../guides/sre/user-management/index.md#user-account-management)の名前を返します。ユーザーアカウントのパラメーターを表示するには、システムテーブル [system.users](../../operations/system-tables/users.md#system_tables-users) を参照してください。 + +**構文** + +``` sql +SHOW USERS +``` + +## SHOW ROLES + +[ロール](../../guides/sre/user-management/index.md#role-management)のリストを返します。他のパラメーターを表示するには、システムテーブル [system.roles](../../operations/system-tables/roles.md#system_tables-roles) および [system.role_grants](../../operations/system-tables/role-grants.md#system_tables-role_grants) を参照してください。 + +**構文** + +``` sql +SHOW [CURRENT|ENABLED] ROLES +``` + +## SHOW PROFILES + +[設定プロファイル](../../guides/sre/user-management/index.md#settings-profiles-management)のリストを返します。ユーザーアカウントのパラメーターを表示するには、システムテーブル [settings_profiles](../../operations/system-tables/settings_profiles.md#system_tables-settings_profiles) を参照してください。 + +**構文** + +``` sql +SHOW [SETTINGS] PROFILES +``` + +## SHOW POLICIES + +指定されたテーブルの[ローポリシー](../../guides/sre/user-management/index.md#row-policy-management)のリストを返します。ユーザーアカウントのパラメーターを表示するには、システムテーブル [system.row_policies](../../operations/system-tables/row_policies.md#system_tables-row_policies) を参照してください。 + +**構文** + +``` sql +SHOW [ROW] POLICIES [ON [db.]table] +``` + +## SHOW QUOTAS + +[クォータ](../../guides/sre/user-management/index.md#quotas-management)のリストを返します。クォータのパラメーターを表示するには、システムテーブル [system.quotas](../../operations/system-tables/quotas.md#system_tables-quotas) を参照してください。 + +**構文** + +``` sql +SHOW QUOTAS +``` + +## SHOW QUOTA + +全てのユーザーまたは現在のユーザーの[クォータ](../../operations/quotas.md)消費量を返します。他のパラメーターを表示するには、システムテーブル [system.quotas_usage](../../operations/system-tables/quotas_usage.md#system_tables-quotas_usage) および [system.quota_usage](../../operations/system-tables/quota_usage.md#system_tables-quota_usage) を参照してください。 + +**構文** + +``` sql +SHOW [CURRENT] QUOTA +``` + +## SHOW ACCESS + +すべての[ユーザー](../../guides/sre/user-management/index.md#user-account-management)、[ロール](../../guides/sre/user-management/index.md#role-management)、[プロファイル](../../guides/sre/user-management/index.md#settings-profiles-management)などとそのすべての[付与](../../sql-reference/statements/grant.md#privileges)を表示します。 + +**構文** + +``` sql +SHOW ACCESS +``` + +## SHOW CLUSTER(S) + +クラスタのリストを返します。すべての利用可能なクラスタは [system.clusters](../../operations/system-tables/clusters.md) テーブルにリストされています。 + +:::note +`SHOW CLUSTER name` クエリは、このクラスタに対する system.clusters テーブルの内容を表示します。 +::: + +**構文** + +``` sql +SHOW CLUSTER '' +SHOW CLUSTERS [[NOT] LIKE|ILIKE ''] [LIMIT ] +``` + +**例** + +クエリ: + +``` sql +SHOW CLUSTERS; +``` + +結果: + +```text +┌─cluster──────────────────────────────────────┐ +│ test_cluster_two_shards │ +│ test_cluster_two_shards_internal_replication │ +│ test_cluster_two_shards_localhost │ +│ test_shard_localhost │ +│ test_shard_localhost_secure │ +│ test_unavailable_shard │ +└──────────────────────────────────────────────┘ +``` + +クエリ: + +``` sql +SHOW CLUSTERS LIKE 'test%' LIMIT 1; +``` + +結果: + +```text +┌─cluster─────────────────┐ +│ test_cluster_two_shards │ +└─────────────────────────┘ +``` + +クエリ: + +``` sql +SHOW CLUSTER 'test_shard_localhost' FORMAT Vertical; +``` + +結果: + +```text +Row 1: +────── +cluster: test_shard_localhost +shard_num: 1 +shard_weight: 1 +replica_num: 1 +host_name: localhost +host_address: 127.0.0.1 +port: 9000 +is_local: 1 +user: default +default_database: +errors_count: 0 +estimated_recovery_time: 0 +``` + +## SHOW SETTINGS + +システム設定とその値のリストを返します。 [system.settings](../../operations/system-tables/settings.md) テーブルからデータを選択します。 + +**構文** + +```sql +SHOW [CHANGED] SETTINGS LIKE|ILIKE +``` + +**句** + +`LIKE|ILIKE` は、設定名の一致パターンを指定することができます。`%` や `_` などのグロブを含むことができます。`LIKE` 句は大文字小文字を区別し、`ILIKE` は大文字小文字を区別しません。 + +`CHANGED` 句を使用した場合、クエリはデフォルト値から変更された設定のみを返します。 + +**例** + +`LIKE` 句を使用したクエリ: + +```sql +SHOW SETTINGS LIKE 'send_timeout'; +``` +結果: + +```text +┌─name─────────┬─type────┬─value─┐ +│ send_timeout │ Seconds │ 300 │ +└──────────────┴─────────┴───────┘ +``` + +`ILIKE` 句を使用したクエリ: + +```sql +SHOW SETTINGS ILIKE '%CONNECT_timeout%' +``` + +結果: + +```text +┌─name────────────────────────────────────┬─type─────────┬─value─┐ +│ connect_timeout │ Seconds │ 10 │ +│ connect_timeout_with_failover_ms │ Milliseconds │ 50 │ +│ connect_timeout_with_failover_secure_ms │ Milliseconds │ 100 │ +└─────────────────────────────────────────┴──────────────┴───────┘ +``` + +`CHANGED` 句を使用したクエリ: + +```sql +SHOW CHANGED SETTINGS ILIKE '%MEMORY%' +``` + +結果: + +```text +┌─name─────────────┬─type───┬─value───────┐ +│ max_memory_usage │ UInt64 │ 10000000000 │ +└──────────────────┴────────┴─────────────┘ +``` + +## SHOW SETTING + +``` sql +SHOW SETTING +``` + +指定された設定名の設定値を出力します。 + +**関連項目** +- [system.settings](../../operations/system-tables/settings.md) テーブル + +## SHOW FILESYSTEM CACHES + +```sql +SHOW FILESYSTEM CACHES +``` + +結果: + +``` text +┌─Caches────┐ +│ s3_cache │ +└───────────┘ +``` + +**関連項目** +- [system.settings](../../operations/system-tables/settings.md) テーブル + +## SHOW ENGINES + +``` sql +SHOW ENGINES [INTO OUTFILE filename] [FORMAT format] +``` + +サーバーがサポートするテーブルエンジンとそれに関連する機能サポート情報の説明を含む [system.table_engines](../../operations/system-tables/table_engines.md) テーブルの内容を出力します。 + +**関連項目** +- [system.table_engines](../../operations/system-tables/table_engines.md) テーブル + +## SHOW FUNCTIONS + +``` sql +SHOW FUNCTIONS [LIKE | ILIKE ''] +``` + +[system.functions](../../operations/system-tables/functions.md) テーブルの内容を出力します。 + +`LIKE` または `ILIKE` 句が指定された場合、クエリは名前が提供された `` に一致するシステム関数のリストを返します。 + +**関連項目** +- [system.functions](../../operations/system-tables/functions.md) テーブル + +## SHOW MERGES + +マージのリストを返します。すべてのマージは [system.merges](../../operations/system-tables/merges.md) テーブルにリストされています。 + +- `table` -- テーブル名。 +- `database` -- テーブルが存在するデータベース名。 +- `estimate_complete` -- 完了までの推定時間(秒)。 +- `elapsed` -- マージ開始からの経過時間(秒)。 +- `progress` -- 完了した作業の割合(0-100パーセント)。 +- `is_mutation` -- このプロセスが部分的な変異である場合は 1。 +- `size_compressed` -- マージされたパーツの圧縮データの合計サイズ。 +- `memory_usage` -- マージプロセスのメモリ消費量。 + +**構文** + +``` sql +SHOW MERGES [[NOT] LIKE|ILIKE ''] [LIMIT ] +``` + +**例** + +クエリ: + +``` sql +SHOW MERGES; +``` + +結果: + +```text +┌─table──────┬─database─┬─estimate_complete─┬─elapsed─┬─progress─┬─is_mutation─┬─size_compressed─┬─memory_usage─┐ +│ your_table │ default │ 0.14 │ 0.36 │ 73.01 │ 0 │ 5.40 MiB │ 10.25 MiB │ +└────────────┴──────────┴───────────────────┴─────────┴──────────┴─────────────┴─────────────────┴──────────────┘ +``` + +クエリ: + +``` sql +SHOW MERGES LIKE 'your_t%' LIMIT 1; +``` + +結果: + +```text +┌─table──────┬─database─┬─estimate_complete─┬─elapsed─┬─progress─┬─is_mutation─┬─size_compressed─┬─memory_usage─┐ +│ your_table │ default │ 0.14 │ 0.36 │ 73.01 │ 0 │ 5.40 MiB │ 10.25 MiB │ +└────────────┴──────────┴───────────────────┴─────────┴──────────┴─────────────┴─────────────────┴──────────────┘ +``` diff --git a/docs/ja/sql-reference/statements/system.md b/docs/ja/sql-reference/statements/system.md new file mode 100644 index 00000000000..67819049c8a --- /dev/null +++ b/docs/ja/sql-reference/statements/system.md @@ -0,0 +1,557 @@ +--- +slug: /ja/sql-reference/statements/system +sidebar_position: 36 +sidebar_label: SYSTEM +--- + +# SYSTEM ステートメント + +## RELOAD EMBEDDED DICTIONARIES + +すべての[内部 Dictionary](../../sql-reference/dictionaries/index.md)をリロードします。デフォルトでは、内部 Dictionary は無効になっています。内部 Dictionary の更新結果に関わらず、常に `Ok.` を返します。 + +## RELOAD DICTIONARIES + +以前に成功してロードされたすべての Dictionary をリロードします。デフォルトでは、Dictionary は遅延ロードされます([dictionaries_lazy_load](../../operations/server-configuration-parameters/settings.md#dictionaries_lazy_load) を参照してください)。したがって、起動時に自動的にロードされるのではなく、dictGet 関数や ENGINE = Dictionary を持つテーブルからの SELECT を通して初めてアクセスされる時に初期化されます。`SYSTEM RELOAD DICTIONARIES` クエリは、そのような (LOADED) Dictionary をリロードします。Dictionary の更新結果に関わらず、常に `Ok.` を返します。 + +**構文** + +```sql +SYSTEM RELOAD DICTIONARIES [ON CLUSTER cluster_name] +``` + +## RELOAD DICTIONARY + +`dictionary_name` を Dictionary の状態 (LOADED / NOT_LOADED / FAILED) に関わらず完全にリロードします。Dictionary の更新結果に関わらず、常に `Ok.` を返します。 + +``` sql +SYSTEM RELOAD DICTIONARY [ON CLUSTER cluster_name] dictionary_name +``` + +Dictionary の状態は `system.dictionaries` テーブルをクエリすることで確認できます。 + +``` sql +SELECT name, status FROM system.dictionaries; +``` + +## RELOAD MODELS + +:::note +このステートメントと `SYSTEM RELOAD MODEL` は、clickhouse-library-bridge から CatBoost モデルをアンロードするだけです。`catboostEvaluate()` 関数は、最初にアクセスされた時点でモデルがロードされていない場合にロードします。 +::: + +すべての CatBoost モデルをアンロードします。 + +**構文** + +```sql +SYSTEM RELOAD MODELS [ON CLUSTER cluster_name] +``` + +## RELOAD MODEL + +指定された `model_path` の CatBoost モデルをアンロードします。 + +**構文** + +```sql +SYSTEM RELOAD MODEL [ON CLUSTER cluster_name] +``` + +## RELOAD FUNCTIONS + +登録されたすべての[実行可能なユーザー定義関数](../functions/index.md#executable-user-defined-functions)またはそれらの1つを設定ファイルからリロードします。 + +**構文** + +```sql +RELOAD FUNCTIONS [ON CLUSTER cluster_name] +RELOAD FUNCTION [ON CLUSTER cluster_name] function_name +``` + +## RELOAD ASYNCHRONOUS METRICS + +すべての[非同期メトリクス](../../operations/system-tables/asynchronous_metrics.md)を再計算します。非同期メトリクスは設定 [asynchronous_metrics_update_period_s](../../operations/server-configuration-parameters/settings.md) に基づいて定期的に更新されるため、このステートメントを使用して手動で更新する必要は通常ありません。 + +```sql +RELOAD ASYNCHRONOUS METRICS [ON CLUSTER cluster_name] +``` + +## DROP DNS CACHE + +ClickHouse の内部 DNS キャッシュをクリアします。インフラストラクチャを変更する場合(別の ClickHouse サーバーのIPアドレスを変更する場合や Dictionary を使用するサーバーを変更する場合)、このコマンドを使用する必要があります(古い ClickHouse バージョンの場合)。 + +キャッシュの管理をより便利(自動化)にするために、disable_internal_dns_cache, dns_cache_max_entries, dns_cache_update_periodパラメータを参照してください。 + +## DROP MARK CACHE + +マークキャッシュをクリアします。 + +## DROP REPLICA + +`ReplicatedMergeTree` テーブルのデッド レプリカを次の構文を使用して削除できます。 + +``` sql +SYSTEM DROP REPLICA 'replica_name' FROM TABLE database.table; +SYSTEM DROP REPLICA 'replica_name' FROM DATABASE database; +SYSTEM DROP REPLICA 'replica_name'; +SYSTEM DROP REPLICA 'replica_name' FROM ZKPATH '/path/to/table/in/zk'; +``` + +クエリは `ReplicatedMergeTree` レプリカ パスを ZooKeeper から削除します。レプリカがデッド状態でメタデータが ZooKeeper から `DROP TABLE` によって削除されない場合などに役立ちます。非アクティブ/古いレプリカのみを削除し、ローカルレプリカを削除することはできません。これには `DROP TABLE` を使用してください。`DROP REPLICA` はテーブルを削除せず、ディスクからデータやメタデータを削除しません。 + +最初のものは、`database.table` テーブルの `'replica_name'` レプリカのメタデータを削除します。 2 番目のものは、データベース内のすべての複製テーブルについて同じ操作を実行します。 3 番目のものは、ローカル サーバー上のすべての複製テーブルについて同じ操作を行います。 4 番目は、テーブルの他のすべてのレプリカが削除されたときにデッドレプリカのメタデータを削除するのに便利です。作成時の `ReplicatedMergeTree` エンジンの最初の引数に指定したのと同じパスである必要があります。 + +## DROP DATABASE REPLICA + +`Replicated` データベースのデッド レプリカを次の構文を使用して削除できます。 + +``` sql +SYSTEM DROP DATABASE REPLICA 'replica_name' [FROM SHARD 'shard_name'] FROM DATABASE database; +SYSTEM DROP DATABASE REPLICA 'replica_name' [FROM SHARD 'shard_name']; +SYSTEM DROP DATABASE REPLICA 'replica_name' [FROM SHARD 'shard_name'] FROM ZKPATH '/path/to/table/in/zk'; +``` + +`SYSTEM DROP REPLICA` と似ていますが、`DROP DATABASE` を実行するデータベースが存在しない場合に ZooKeeper から `Replicated` データベースのレプリカ パスを削除します。 `ReplicatedMergeTree` のレプリカは削除されないことに注意してください(そのため `SYSTEM DROP REPLICA` も必要になる場合があります)。 シャードおよびレプリカ名は、データベース作成時に `Replicated` エンジンの引数に指定された名前です。これらの名前は、`system.clusters` の `database_shard_name` および `database_replica_name` カラムから取得することもできます。 `FROM SHARD` 句がない場合、`replica_name` は `shard_name|replica_name` フォーマットの完全なレプリカ名である必要があります。 + +## DROP UNCOMPRESSED CACHE + +非圧縮データキャッシュをクリアします。非圧縮データキャッシュは、クエリ/ユーザー/プロファイルレベルの設定 [use_uncompressed_cache](../../operations/settings/settings.md#setting-use_uncompressed_cache) で有効化/無効化されます。サーバーレベルの設定 [uncompressed_cache_size](../../operations/server-configuration-parameters/settings.md#server-settings-uncompressed_cache_size) を使用してそのサイズを構成できます。 + +## DROP COMPILED EXPRESSION CACHE + +コンパイルされた式キャッシュをクリアします。コンパイルされた式キャッシュは、クエリ/ユーザー/プロファイルレベルの設定 [compile_expressions](../../operations/settings/settings.md#compile-expressions) で有効化/無効化されます。 + +## DROP QUERY CACHE + +```sql +SYSTEM DROP QUERY CACHE; +SYSTEM DROP QUERY CACHE TAG '' +```` + +[クエリキャッシュ](../../operations/query-cache.md)をクリアします。タグが指定された場合、指定されたタグを持つクエリキャッシュエントリのみが削除されます。 + +## DROP FORMAT SCHEMA CACHE {#system-drop-schema-format} + +[format_schema_path](../../operations/server-configuration-parameters/settings.md#format_schema_path) からロードされたスキーマのキャッシュをクリアします。 + +サポートされているフォーマット: + +- Protobuf + +```sql +SYSTEM DROP FORMAT SCHEMA CACHE [FOR Protobuf] +``` + +## FLUSH LOGS + +バッファされたログメッセージをシステムテーブル(例: system.query_log)にフラッシュします。ほとんどのシステムテーブルはデフォルトでフラッシュ間隔が7.5秒に設定されているため、デバッグに役立ちます。 +メッセージキューが空でもシステムテーブルを作成します。 + +```sql +SYSTEM FLUSH LOGS [ON CLUSTER cluster_name] +``` + +## RELOAD CONFIG + +ClickHouseの設定をリロードします。設定がZooKeeperに保存されている場合に使用されます。`SYSTEM RELOAD CONFIG` はZooKeeperに保存された`USER` 設定をリロードせず、`users.xml` に保存された`USER` 設定のみをリロードします。すべての`USER` 設定をリロードするには `SYSTEM RELOAD USERS` を使用します。 + +```sql +SYSTEM RELOAD CONFIG [ON CLUSTER cluster_name] +``` + +## RELOAD USERS + +すべてのアクセスストレージをリロードします。含まれるのは: users.xml、ローカルディスクアクセスストレージ、ZooKeeperでレプリケートされたアクセスストレージです。 + +```sql +SYSTEM RELOAD USERS [ON CLUSTER cluster_name] +``` + +## SHUTDOWN + +ClickHouseを正常にシャットダウンします(`service clickhouse-server stop` / `kill {$pid_clickhouse-server}` のように)。 + +## KILL + +ClickHouseプロセスを強制終了します(`kill -9 {$ pid_clickhouse-server}` のように)。 + +## 分散テーブルの管理 + +ClickHouse は[分散](../../engines/table-engines/special/distributed.md) テーブルを管理できます。ユーザーがこれらのテーブルにデータを挿入すると、ClickHouseは最初にデータをクラスタノードに送信するためのキューを作成し、その後データを非同期で送信します。[STOP DISTRIBUTED SENDS](#stop-distributed-sends), [FLUSH DISTRIBUTED](#flush-distributed), [START DISTRIBUTED SENDS](#start-distributed-sends) クエリを使用してキューの処理を管理できます。また、[distributed_foreground_insert](../../operations/settings/settings.md#distributed_foreground_insert) 設定を使用して分散データを同期的に挿入することもできます。 + +### STOP DISTRIBUTED SENDS + +分散テーブルにデータを挿入する際のバックグラウンドデータ分散を無効化します。 + +``` sql +SYSTEM STOP DISTRIBUTED SENDS [db.] [ON CLUSTER cluster_name] +``` + +### FLUSH DISTRIBUTED + +ClickHouse がクラスタノードにデータを同期的に送信することを強制します。ノードが使用できない場合、ClickHouse は例外をスローし、クエリの実行を停止します。すべてのノードが再度オンラインになった時に、クエリが成功するまで再試行できます。 + +`SETTINGS` 句を通じていくつかの設定を上書きすることもでき、`max_concurrent_queries_for_all_users` や `max_memory_usage` などの一時的な制限を回避するのに便利です。 + +``` sql +SYSTEM FLUSH DISTRIBUTED [db.] [ON CLUSTER cluster_name] [SETTINGS ...] +``` + +:::note +保留中の各ブロックは、初期の INSERT クエリからの設定を使用してディスクに保存されます。そのため、設定を上書きしたい場合があります。 +::: + +### START DISTRIBUTED SENDS + +分散テーブルにデータを挿入する際のバックグラウンドデータ分散を有効にします。 + +``` sql +SYSTEM START DISTRIBUTED SENDS [db.] [ON CLUSTER cluster_name] +``` + +### STOP LISTEN + +指定したポートで指定したプロトコルを使用してサーバーへの既存の接続を優雅に終了し、ソケットを閉じます。 + +ただし、対応するプロトコルの設定が clickhouse-server の設定で指定されていない場合、このコマンドは効果がありません。 + +```sql +SYSTEM STOP LISTEN [ON CLUSTER cluster_name] [QUERIES ALL | QUERIES DEFAULT | QUERIES CUSTOM | TCP | TCP WITH PROXY | TCP SECURE | HTTP | HTTPS | MYSQL | GRPC | POSTGRESQL | PROMETHEUS | CUSTOM 'protocol'] +``` + +- `CUSTOM 'protocol'` 修飾子が指定されている場合、サーバー構成のプロトコルセクションで指定されたカスタムプロトコルが停止されます。 +- `QUERIES ALL [EXCEPT .. [,..]]` 修飾子が指定されている場合、`EXCEPT` 句で指定されたものを除き、すべてのプロトコルが停止されます。 +- `QUERIES DEFAULT [EXCEPT .. [,..]]` 修飾子が指定されている場合、`EXCEPT` 句で指定されたものを除き、すべてのデフォルトプロトコルが停止されます。 +- `QUERIES CUSTOM [EXCEPT .. [,..]]` 修飾子が指定されている場合、`EXCEPT` 句で指定されたものを除き、すべてのカスタムプロトコルが停止されます。 + +### START LISTEN + +指定されたプロトコルで新しい接続を確立できるようにします。 + +ただし、SYSTEM STOP LISTEN コマンドを使用して、指定されたポートとプロトコルでサーバーを停止していない場合、このコマンドは効果を発揮しません。 + +```sql +SYSTEM START LISTEN [ON CLUSTER cluster_name] [QUERIES ALL | QUERIES DEFAULT | QUERIES CUSTOM | TCP | TCP WITH PROXY | TCP SECURE | HTTP | HTTPS | MYSQL | GRPC | POSTGRESQL | PROMETHEUS | CUSTOM 'protocol'] +``` + +## MergeTree テーブルの管理 + +ClickHouse は [MergeTree](../../engines/table-engines/mergetree-family/mergetree.md) テーブルのバックグラウンドプロセスを管理できます。 + +### STOP MERGES + +MergeTree ファミリ内のテーブルに対するバックグラウンド マージを停止する機能を提供します。 + +``` sql +SYSTEM STOP MERGES [ON CLUSTER cluster_name] [ON VOLUME | [db.]merge_tree_family_table_name] +``` + +:::note +テーブルを `DETACH / ATTACH` すると、以前にすべての MergeTree テーブルに対してマージが停止されていた場合でも、テーブルに対してバックグラウンド マージが開始されます。 +::: + +### START MERGES + +MergeTree ファミリ内のテーブルに対するバックグラウンド マージを開始する機能を提供します。 + +``` sql +SYSTEM START MERGES [ON CLUSTER cluster_name] [ON VOLUME | [db.]merge_tree_family_table_name] +``` + +### STOP TTL MERGES + +MergeTree ファミリのテーブルに対して [有効期限 (TTL) 式](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl) に従って古いデータをバックグラウンドで削除することを停止する機能を提供します。 テーブルが存在しない場合でも `Ok.` を返しますが、データベースが存在しない場合はエラーを返します。 + +``` sql +SYSTEM STOP TTL MERGES [ON CLUSTER cluster_name] [[db.]merge_tree_family_table_name] +``` + +### START TTL MERGES + +MergeTree ファミリのテーブルに対して [有効期限 (TTL) 式](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl) に従って古いデータをバックグラウンドで削除を開始する機能を提供します。 テーブルが存在しない場合でも `Ok.` を返します。データベースが存在しない場合はエラーを返します。 + +``` sql +SYSTEM START TTL MERGES [ON CLUSTER cluster_name] [[db.]merge_tree_family_table_name] +``` + +### STOP MOVES + +MergeTree ファミリのテーブルに対して [TO VOLUME または TO DISK 句を伴う TTL テーブル式](../../engines/table-engines/mergetree-family/mergetree.md#mergetree-table-ttl) に従ってデータをバックグラウンドで移動することを停止する機能を提供します。 テーブルが存在しない場合でも `Ok.` を返します。データベースが存在しない場合はエラーを返します。 + +``` sql +SYSTEM STOP MOVES [ON CLUSTER cluster_name] [[db.]merge_tree_family_table_name] +``` + +### START MOVES + +MergeTree ファミリのテーブルに対して [TO VOLUME または TO DISK 句を伴う TTL テーブル式](../../engines/table-engines/mergetree-family/mergetree.md#mergetree-table-ttl) に従ってデータをバックグラウンドで移動を開始する機能を提供します。 テーブルが存在しない場合でも `Ok.` を返します。データベースが存在しない場合はエラーを返します。 + +``` sql +SYSTEM START MOVES [ON CLUSTER cluster_name] [[db.]merge_tree_family_table_name] +``` + +### SYSTEM UNFREEZE {#query_language-system-unfreeze} + +指定された名前のフリーズされたバックアップをすべてのディスクからクリアします。[ALTER TABLE table_name UNFREEZE WITH NAME](alter/partition.md#alter_unfreeze-partition) で個々のパーツのアンフリーズについて詳しく学べます。 + +``` sql +SYSTEM UNFREEZE WITH NAME +``` + +### WAIT LOADING PARTS + +テーブルのすべての非同期でロードされているデータパーツ(古いデータパーツ)がロードされるまで待機します。 + +``` sql +SYSTEM WAIT LOADING PARTS [ON CLUSTER cluster_name] [db.]merge_tree_family_table_name +``` + +## ReplicatedMergeTree テーブルの管理 + +ClickHouse は [ReplicatedMergeTree](../../engines/table-engines/mergetree-family/replication.md#table_engines-replication) テーブルの背景レプリケーション関連プロセスを管理できます。 + +### STOP FETCHES + +`ReplicatedMergeTree` ファミリ内のテーブルに対する挿入されたパーツのバックグラウンド フェッチを停止できる機能を提供します。 テーブルエンジンにかかわらず、またテーブルやデータベースが存在しない場合でも `Ok.` を常に返します。 + +``` sql +SYSTEM STOP FETCHES [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### START FETCHES + +`ReplicatedMergeTree` ファミリ内のテーブルに対する挿入されたパーツのバックグラウンド フェッチを開始できる機能を提供します。 テーブルエンジンにかかわらず、またテーブルやデータベースが存在しない場合でも `Ok.` を常に返します。 + +``` sql +SYSTEM START FETCHES [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### STOP REPLICATED SENDS + +`ReplicatedMergeTree` ファミリ内のテーブルに対する新しく挿入されたパーツを他のレプリカにバックグラウンドで送信することを停止できる機能を提供します。 + +``` sql +SYSTEM STOP REPLICATED SENDS [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### START REPLICATED SENDS + +`ReplicatedMergeTree` ファミリ内のテーブルに対する新しく挿入されたパーツを他のレプリカにバックグラウンドで送信を開始する機能を提供します。 + +``` sql +SYSTEM START REPLICATED SENDS [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### STOP REPLICATION QUEUES + +`ReplicatedMergeTree` ファミリのテーブルに対して ZooKeeper に格納されているレプリケーション キューからのバックグラウンド フェッチ タスク(マージ、フェッチ、ミューテーション、ON CLUSTER 句を含む DDL ステートメント)を停止する機能を提供します。 + +``` sql +SYSTEM STOP REPLICATION QUEUES [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### START REPLICATION QUEUES + +`ReplicatedMergeTree` ファミリのテーブルに対して ZooKeeper に格納されているレプリケーション キューからのバックグラウンド スタスク(マージ、フェッチ、ミューテーション、ON CLUSTER 句を含む DDL ステートメント)を開始する機能を提供します。 + +``` sql +SYSTEM START REPLICATION QUEUES [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### STOP PULLING REPLICATION LOG + +`ReplicatedMergeTree` テーブルのレプリケーション キューに新しいエントリを追加することから、新しいエントリのロードを停止します。 + +``` sql +SYSTEM STOP PULLING REPLICATION LOG [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### START PULLING REPLICATION LOG + +`SYSTEM STOP PULLING REPLICATION LOG` をキャンセルします。 + +``` sql +SYSTEM START PULLING REPLICATION LOG [ON CLUSTER cluster_name] [[db.]replicated_merge_tree_family_table_name] +``` + +### SYNC REPLICA + +`ReplicatedMergeTree` テーブルがクラスター内の他のレプリカと同期するまで待機しますが、`receive_timeout` 秒を超えてはなりません。 + +``` sql +SYSTEM SYNC REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name [STRICT | LIGHTWEIGHT [FROM 'srcReplica1'[, 'srcReplica2'[, ...]]] | PULL] +``` + +このステートメントを実行すると、`[db.]replicated_merge_tree_family_table_name` は ZooKeeper の一般的なレプリケートログからエントリを取得してその独自のレプリケーション キューに追加し、クエリは取得されたコマンドがすべて処理されるまで待機します。サポートされている修飾子は次のとおりです: + +- `STRICT` 修飾子が指定された場合、クエリはレプリケーション キューが空になるまで待機します。`STRICT` バージョンは、レプリケーション キューに新しいエントリが常に表示される場合、成功しない可能性があります。 +- `LIGHTWEIGHT` 修飾子が指定された場合、クエリは `GET_PART`, `ATTACH_PART`, `DROP_RANGE`, `REPLACE_RANGE` および `DROP_PART` エントリの処理のみを待ちます。また、LIGHTWEIGHT 修飾子はオプションの FROM 'srcReplicas' 句をサポートしています。'srcReplicas'はカンマで区切られたソース レプリカ名のリストです。この拡張により、指定されたソース レプリカからのレプリケーション タスクのみに焦点を当てることで、より対象を絞った同期を実現できます。 +- `PULL` 修飾子が指定された場合、クエリは ZooKeeper から新しいレプリケーション キュー エントリを取得しますが、何も処理待ちしません。 + +### SYNC DATABASE REPLICA + +指定された[レプリケートデータベース](https://clickhouse.com/docs/ja/engines/database-engines/replicated) がそのデータベースの DDL キューからすべてのスキーマ変更を適用するまで待機します。 + +**構文** +```sql +SYSTEM SYNC DATABASE REPLICA replicated_database_name; +``` + +### RESTART REPLICA + +`ReplicatedMergeTree` テーブルの ZooKeeper セッションの状態を再初期化し、Zookeeper をソースとした現在の状態を比較し、必要に応じて Zookeeper キューにタスクを追加する機能を提供します。 +レプリケーション キューの ZooKeeper データに基づく初期化は、`ATTACH TABLE` ステートメントの場合と同様に行われます。短時間、テーブルがすべての操作に対して利用できなくなります。 + +``` sql +SYSTEM RESTART REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name +``` + +### RESTORE REPLICA + +データが [潜在的に] 存在するが Zookeeper メタデータが失われている場合に、レプリカを復元します。 + +読み取り専用 `ReplicatedMergeTree` テーブルでのみ機能します。 + +クエリは次の後に実行できます: + +- ZooKeeper ルート `/` の損失。 +- レプリカのパス `/replicas` の損失。 +- 個々のレプリカのパス `/replicas/replica_name/` の損失。 + +レプリカはローカルで見つかったパーツをアタッチし、それらの情報を Zookeeper に送信します。 +メタデータ損失前にレプリカに存在したパーツは、古くない限り(したがって、レプリカの復元はすべてのデータをネットワーク経由で再ダウンロードすることを意味しない)、他のレプリカから再フェッチされません。 + +:::note +すべての状態のパーツは `detached/` フォルダに移動されます。データ損失前にアクティブだったパーツ(コミットされた)はアタッチされます。 +::: + +**構文** + +```sql +SYSTEM RESTORE REPLICA [db.]replicated_merge_tree_family_table_name [ON CLUSTER cluster_name] +``` + +代替構文: + +```sql +SYSTEM RESTORE REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name +``` + +**例** + +複数のサーバーでテーブルを作成する。ZooKeeper 内のレプリカのメタデータが失われた後、メタデータがないため、テーブルは読み取り専用としてアタッチされます。最後のクエリはすべてのレプリカで実行する必要があります。 + +```sql +CREATE TABLE test(n UInt32) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/test/', '{replica}') +ORDER BY n PARTITION BY n % 10; + +INSERT INTO test SELECT * FROM numbers(1000); + +-- zookeeper_delete_path("/clickhouse/tables/test", recursive=True) <- root loss. + +SYSTEM RESTART REPLICA test; +SYSTEM RESTORE REPLICA test; +``` + +別の方法: + +```sql +SYSTEM RESTORE REPLICA test ON CLUSTER cluster; +``` + +### RESTART REPLICAS + +すべての `ReplicatedMergeTree` テーブルの ZooKeeper セッションの状態を再初期化し、Zookeeper をソースとした現在の状態と比較して必要に応じて Zookeeper キューにタスクを追加する機能を提供します。 + +### DROP FILESYSTEM CACHE + +ファイルシステム キャッシュを削除することが可能です。 + +```sql +SYSTEM DROP FILESYSTEM CACHE [ON CLUSTER cluster_name] +``` + +### SYNC FILE CACHE + +:::note +それは非常に重いものであり、誤用の可能性があります。 +::: + +sync システムコールを実行します。 + +```sql +SYSTEM SYNC FILE CACHE [ON CLUSTER cluster_name] +``` + +### UNLOAD PRIMARY KEY + +指定されたテーブルまたはすべてのテーブルの主キーをアンロードします。 + +```sql +SYSTEM UNLOAD PRIMARY KEY [db.]name +``` + +```sql +SYSTEM UNLOAD PRIMARY KEY +``` + +## リフレッシュ可能なマテリアライズドビューの管理 {#refreshable-materialized-views} + +[リフレッシュ可能なマテリアライズドビュー](../../sql-reference/statements/create/view.md#refreshable-materialized-view) によって実行されるバックグラウンドタスクを制御するコマンド。 + +それらを使用する際は [`system.view_refreshes`](../../operations/system-tables/view_refreshes.md) を監視してください。 + +### REFRESH VIEW + +指定されたビューのスケジュール外の即時更新をトリガーします。 + +```sql +SYSTEM REFRESH VIEW [db.]name +``` + +### REFRESH VIEW + +現在実行中の更新が完了するのを待ちます。更新が失敗した場合は、例外をスローします。更新が実行中でない場合は直ちに完了し、前回の更新が失敗した場合は例外をスローします。 + +### STOP VIEW, STOP VIEWS + +指定されたビューまたはすべてのリフレッシュ可能なビューの定期的な更新を無効にします。更新が進行中の場合は、それもキャンセルします。 + +```sql +SYSTEM STOP VIEW [db.]name +``` +```sql +SYSTEM STOP VIEWS +``` + +### START VIEW, START VIEWS + +指定されたビューまたはすべてのリフレッシュ可能なビューの定期的な更新を有効にします。即時更新はトリガーされません。 + +```sql +SYSTEM START VIEW [db.]name +``` +```sql +SYSTEM START VIEWS +``` + +### CANCEL VIEW + +指定されたビューの更新が進行中の場合、それを中断してキャンセルします。それ以外の場合は何もしません。 + +```sql +SYSTEM CANCEL VIEW [db.]name +``` + +### SYSTEM WAIT VIEW + +実行中の更新が完了するのを待ちます。更新が実行中でない場合は直ちに戻ります。最新の更新試行が失敗した場合は、エラーを報告します。 + +新しいリフレッシュ可能なマテリアライズドビュー(EMPTYキーワードなし)を作成した直後に使用して、初回の更新が完了するのを待つことができます。 + +```sql +SYSTEM WAIT VIEW [db.]name +``` + diff --git a/docs/ja/sql-reference/statements/truncate.md b/docs/ja/sql-reference/statements/truncate.md new file mode 100644 index 00000000000..ae0b458b331 --- /dev/null +++ b/docs/ja/sql-reference/statements/truncate.md @@ -0,0 +1,38 @@ +--- +slug: /ja/sql-reference/statements/truncate +sidebar_position: 52 +sidebar_label: TRUNCATE +--- + +# TRUNCATE ステートメント + +## TRUNCATE TABLE +``` sql +TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] +``` + +テーブルからすべてのデータを削除します。`IF EXISTS` の句を省略した場合、テーブルが存在しないとクエリはエラーを返します。 + +`TRUNCATE` クエリは、[View](../../engines/table-engines/special/view.md)、[File](../../engines/table-engines/special/file.md)、[URL](../../engines/table-engines/special/url.md)、[Buffer](../../engines/table-engines/special/buffer.md)、[Null](../../engines/table-engines/special/null.md) テーブルエンジンではサポートされていません。 + +レプリカでの実行待機をセットアップするには、[alter_sync](../../operations/settings/settings.md#alter-sync) 設定を使用できます。 + +非アクティブなレプリカが `TRUNCATE` クエリを実行するのを待つ時間(秒単位)を指定するには、[replication_wait_for_inactive_replica_timeout](../../operations/settings/settings.md#replication-wait-for-inactive-replica-timeout) 設定を使用できます。 + +:::note +`alter_sync` が `2` に設定され、`replication_wait_for_inactive_replica_timeout` 設定で指定された時間を超えてアクティブでないレプリカがある場合、`UNFINISHED` 例外がスローされます。 +::: + +## TRUNCATE ALL TABLES +``` sql +TRUNCATE ALL TABLES FROM [IF EXISTS] db [ON CLUSTER cluster] +``` + +データベース内のすべてのテーブルからすべてのデータを削除します。 + +## TRUNCATE DATABASE +``` sql +TRUNCATE DATABASE [IF EXISTS] db [ON CLUSTER cluster] +``` + +データベースからすべてのテーブルを削除しますが、データベースそのものは保持します。`IF EXISTS` の句を省略した場合、データベースが存在しないとクエリはエラーを返します。 diff --git a/docs/ja/sql-reference/statements/undrop.md b/docs/ja/sql-reference/statements/undrop.md new file mode 100644 index 00000000000..acbac7b28eb --- /dev/null +++ b/docs/ja/sql-reference/statements/undrop.md @@ -0,0 +1,84 @@ +--- +slug: /ja/sql-reference/statements/undrop +sidebar_label: UNDROP +--- + +# UNDROP TABLE + +テーブルの削除を取り消します。 + +ClickHouseバージョン23.3から、DROP TABLE文を発行してから`database_atomic_delay_before_drop_table_sec`(デフォルトで8分)以内に、AtomicデータベースでテーブルをUNDROPすることができます。削除されたテーブルは`system.dropped_tables`というシステムテーブルに一覧表示されます。 + +`TO`句が関連付けられていないMaterialized Viewが削除されたテーブルに関連している場合、そのビューの内部テーブルもUNDROPする必要があります。 + +:::tip +[DROP TABLE](/docs/ja/sql-reference/statements/drop.md)も参照してください +::: + +構文: + +``` sql +UNDROP TABLE [db.]name [UUID ''] [ON CLUSTER cluster] +``` + +**例** + +```sql +CREATE TABLE tab +( + `id` UInt8 +) +ENGINE = MergeTree +ORDER BY id; + +DROP TABLE tab; + +SELECT * +FROM system.dropped_tables +FORMAT Vertical; +``` + +```response +Row 1: +────── +index: 0 +database: default +table: tab +uuid: aa696a1a-1d70-4e60-a841-4c80827706cc +engine: MergeTree +metadata_dropped_path: /var/lib/clickhouse/metadata_dropped/default.tab.aa696a1a-1d70-4e60-a841-4c80827706cc.sql +table_dropped_time: 2023-04-05 14:12:12 + +1 row in set. Elapsed: 0.001 sec. +``` + +```sql +UNDROP TABLE tab; + +SELECT * +FROM system.dropped_tables +FORMAT Vertical; +``` + +```response +Ok. + +0 rows in set. Elapsed: 0.001 sec. +``` + +```sql +DESCRIBE TABLE tab +FORMAT Vertical; +``` + +```response +Row 1: +────── +name: id +type: UInt8 +default_type: +default_expression: +comment: +codec_expression: +ttl_expression: +``` diff --git a/docs/ja/sql-reference/statements/use.md b/docs/ja/sql-reference/statements/use.md new file mode 100644 index 00000000000..056da829811 --- /dev/null +++ b/docs/ja/sql-reference/statements/use.md @@ -0,0 +1,17 @@ +--- +slug: /ja/sql-reference/statements/use +sidebar_position: 53 +sidebar_label: USE +--- + +# USE ステートメント + +``` sql +USE db +``` + +現在のセッションで使用するデータベースを設定することができます。 + +現在のデータベースは、クエリ内でデータベースがテーブル名の前にドットで明示的に定義されていない場合に、テーブルを検索するために使用されます。 + +HTTPプロトコルを使用している場合、このクエリを実行することはできません。セッションの概念がないためです。 diff --git a/docs/ja/sql-reference/statements/watch.md b/docs/ja/sql-reference/statements/watch.md new file mode 100644 index 00000000000..20dc84ef0c7 --- /dev/null +++ b/docs/ja/sql-reference/statements/watch.md @@ -0,0 +1,110 @@ +--- +slug: /ja/sql-reference/statements/watch +sidebar_position: 53 +sidebar_label: WATCH +--- + +# WATCH ステートメント (試験的) + +:::note +これは、将来のリリースで後方互換性のない変更が行われる可能性のある試験的な機能です。ライブビューと `WATCH` クエリを有効にするには、`set allow_experimental_live_view = 1` を使用してください。 +::: + +``` sql +WATCH [db.]live_view +[EVENTS] +[LIMIT n] +[FORMAT format] +``` + +`WATCH` クエリは、[ライブビュー](./create/view.md#live-view)テーブルから継続的なデータ取得を行います。`LIMIT` 句が指定されていない場合、[ライブビュー](./create/view.md#live-view)からクエリ結果の無限ストリームを提供します。 + +```sql +WATCH [db.]live_view [EVENTS] [LIMIT n] [FORMAT format] +``` + +## 仮想カラム + +クエリ結果内の仮想カラム `_version` は、現在の結果バージョンを示します。 + +**例:** + +```sql +CREATE LIVE VIEW lv WITH REFRESH 5 AS SELECT now(); +WATCH lv; +``` + +```bash +┌───────────────now()─┬─_version─┐ +│ 2021-02-21 09:17:21 │ 1 │ +└─────────────────────┴──────────┘ +┌───────────────now()─┬─_version─┐ +│ 2021-02-21 09:17:26 │ 2 │ +└─────────────────────┴──────────┘ +┌───────────────now()─┬─_version─┐ +│ 2021-02-21 09:17:31 │ 3 │ +└─────────────────────┴──────────┘ +... +``` + +デフォルトでは、要求されたデータはクライアントに返されますが、[INSERT INTO](../../sql-reference/statements/insert-into.md) と組み合わせて使用することで、異なるテーブルに転送できます。 + +**例:** + +```sql +INSERT INTO [db.]table WATCH [db.]live_view ... +``` + +## EVENTS 句 + +`EVENTS` 句を使用すると、`WATCH` クエリの簡略版を取得できます。この場合、クエリ結果の代わりに最新のクエリ結果バージョンのみが返されます。 + +```sql +WATCH [db.]live_view EVENTS; +``` + +**例:** + +```sql +CREATE LIVE VIEW lv WITH REFRESH 5 AS SELECT now(); +WATCH lv EVENTS; +``` + +```bash +┌─version─┐ +│ 1 │ +└─────────┘ +┌─version─┐ +│ 2 │ +└─────────┘ +... +``` + +## LIMIT 句 + +`LIMIT n` 句は、`WATCH` クエリが終了する前に待機する更新の数を指定します。デフォルトでは更新の数に制限はなく、したがってクエリは終了しません。値が `0` の場合、`WATCH` クエリは新しいクエリ結果を待機しないことを示し、クエリ結果が評価され次第すぐに返されます。 + +```sql +WATCH [db.]live_view LIMIT 1; +``` + +**例:** + +```sql +CREATE LIVE VIEW lv WITH REFRESH 5 AS SELECT now(); +WATCH lv EVENTS LIMIT 1; +``` + +```bash +┌─version─┐ +│ 1 │ +└─────────┘ +``` + +## FORMAT 句 + +`FORMAT` 句は、[SELECT](../../sql-reference/statements/select/format.md#format-clause) と同じ方法で機能します。 + +:::note +[HTTP インターフェース](../../interfaces/formats.md#jsoneachrowwithprogress)を介して [ライブビュー](./create/view.md#live-view) テーブルを監視する際は、[JSONEachRowWithProgress](../../interfaces/formats.md#jsoneachrowwithprogress) フォーマットを使用するべきです。進行状況メッセージは、クエリ結果が変化するまで長時間維持される HTTP 接続を保つために出力に追加されます。進行状況メッセージの間隔は、[live_view_heartbeat_interval](./create/view.md#live-view-settings) 設定を使用して制御されます。 +::: diff --git a/docs/ja/sql-reference/syntax.md b/docs/ja/sql-reference/syntax.md new file mode 100644 index 00000000000..9e716ac897c --- /dev/null +++ b/docs/ja/sql-reference/syntax.md @@ -0,0 +1,269 @@ +--- + +slug: /ja/sql-reference/syntax +sidebar_position: 2 +sidebar_label: 文法 + +--- + +# 文法 + +システムには二種類のパーサーがあります:完全なSQLパーサー(再帰下降パーサー)とデータフォーマットパーサー(高速ストリームパーサー)です。`INSERT`クエリを除くすべての場合で、完全なSQLパーサーのみが使用されます。`INSERT`クエリは両方のパーサーを使用します: + +``` sql +INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def') +``` + +`INSERT INTO t VALUES`フラグメントは完全なパーサーによって解析され、データ`(1, 'Hello, world'), (2, 'abc'), (3, 'def')`は高速ストリームパーサーによって解析されます。[input_format_values_interpret_expressions](../operations/settings/settings-formats.md#input_format_values_interpret_expressions)設定を使用してデータに対して完全なパーサーをオンにすることもできます。`input_format_values_interpret_expressions = 1`の場合、ClickHouseは最初に高速ストリームパーサーで値を解析しようとします。失敗した場合、ClickHouseはデータをSQL [式](#expressions)のように扱い、完全なパーサーを使用して解析しようとします。 + +データは任意のフォーマットを持つことができます。クエリが受信されると、サーバーはRAM内でリクエストの[最大クエリサイズ](../operations/settings/settings.md#max_query_size)バイト(デフォルトでは1 MB)を超えないように計算し、残りはストリーム解析されます。これにより、大量の`INSERT`クエリによる問題を回避できます。 + +`INSERT`クエリで`Values`フォーマットを使用する場合、データが`SELECT`クエリの式と同じように解析されるように見えることがありますが、これは真実ではありません。`Values`フォーマットははるかに制限されています。 + +この記事の残りの部分では完全なパーサーを取り上げます。フォーマットパーサーの詳細については、[フォーマット](../interfaces/formats.md)セクションを参照してください。 + +## スペース + +構文構造の間(クエリの開始と終了を含む)には、任意の数のスペース記号が入ることがあります。スペース記号には、スペース、タブ、改行、キャリッジリターン、およびフォームフィードが含まれます。 + +## コメント + +ClickHouseはSQLスタイルおよびCスタイルのコメントをサポートしています: + +- SQLスタイルのコメントは`--`、`#!`または`# `で始まり、行の最後まで続きます。`--`と`#!`の後のスペースは省略可能です。 +- Cスタイルのコメントは`/*`から`*/`までで、複数行にわたることができ、スペースも必要ありません。 + +## キーワード + +キーワードは以下の場合に大文字小文字を区別しません: + +- SQL標準に該当する場合。たとえば、`SELECT`、`select`、および`SeLeCt`はすべて有効です。 +- 一部の人気DBMS(MySQLまたはPostgres)での実装に該当する場合。たとえば、`DateTime`は`datetime`と同じです。 + +データ型名が大文字小文字を区別するかどうかは、[system.data_type_families](../operations/system-tables/data_type_families.md#system_tables-data_type_families)テーブルで確認できます。 + +標準SQLと対照的に、他のすべてのキーワード(関数名を含む)は**大文字小文字を区別**します。 + +キーワードは予約されていません;それらは対応するコンテキストでのみそのように扱われます。キーワードと同じ名前の[識別子](#identifiers)を使用する場合、それらを二重引用符またはバックティックで囲みます。たとえば、クエリ`SELECT "FROM" FROM table_name`は、`table_name`テーブルに`"FROM"`という名前のカラムがある場合に有効です。 + +## 識別子 + +識別子とは: + +- クラスター、データベース、テーブル、パーティション、カラム名。 +- 関数。 +- データ型。 +- [式のエイリアス](#expression-aliases)。 + +識別子はクォート付きまたは非クォート付きがありえます。後者が推奨されます。 + +非クォート付きの識別子は、正規表現`^[a-zA-Z_][0-9a-zA-Z_]*$`と一致し、[キーワード](#keywords)と等しくない必要があります。例:`x`、`_1`、`X_y__Z123_`。 + +キーワードと同じ識別子を使用したい場合や識別子に他の記号を使用したい場合、二重引用符またはバックティックを使用してクォートしてください。例: `"id"`, `` `id` ``。 + +## リテラル + +リテラルには、数値リテラル、文字列リテラル、複合リテラル、`NULL`リテラルがあります。 + +### 数値 + +数値リテラルは以下のように解析されます: + +- 最初に、[strtoull](https://en.cppreference.com/w/cpp/string/byte/strtoul)関数を用いて64ビット符号付き整数として解析されます。 +- 失敗した場合、[strtoll](https://en.cppreference.com/w/cpp/string/byte/strtol)関数を用いて64ビット符号なし整数として解析されます。 +- これでも失敗した場合、[strtod](https://en.cppreference.com/w/cpp/string/byte/strtof)関数を用いて浮動小数点数として解析されます。 +- それ以外の場合はエラーを返します。 + +リテラル値は、値が収まる最小の型にキャストされます。たとえば、1は`UInt8`として解析されますが、256は`UInt16`として解析されます。詳細については[データ型](../sql-reference/data-types/index.md)を参照してください。数値リテラル内のアンダースコア`_`は無視され、可読性を向上させるために使用できます。 + +サポートされる数値リテラルは以下の通りです: + +**整数** – `1`, `10_000_000`, `18446744073709551615`, `01` +**小数** – `0.1` +**指数表記** - `1e100`, `-1e-100` +**浮動小数点数** – `123.456`, `inf`, `nan` + +**16進数** – `0xc0fe` +**SQL標準互換16進文字列** – `x'c0fe'` + +**2進数** – `0b1101` +**SQL標準互換2進文字列** – `b'1101'` + +解釈の誤りを避けるため、8進数リテラルはサポートされていません。 + +### 文字列 + +文字列リテラルはシングルクォートで囲む必要があり、ダブルクォートはサポートされていません。エスケープは、次のいずれかで動作します: + +- シングルクォートを前置することで、シングルクォート文字`'`(およびこの文字のみ)が`''`としてエスケープされます。 +- バックスラッシュを前置することで、次のエスケープシーケンスがサポートされます:`\\`, `\'`, `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\a`, `\v`, `\xHH`。リストされていない文字の前にバックスラッシュがある場合、バックスラッシュはその特別な意味を失い、文字通りに解釈されます。 + +文字列リテラルでは、少なくとも`'`と`\`をエスケープコード`\'`(または:`''`)と`\\`でエスケープする必要があります。 + +### 複合 + +配列は角括弧を用いて作成されます:`[1, 2, 3]`。タプルは丸括弧を用いて作成されます:`(1, 'Hello, world!', 2)`。技術的にはこれらはリテラルではなく、それぞれ配列生成演算子とタプル生成演算子を使用した式です。配列は少なくとも1つの項目を含む必要があり、タプルは少なくとも2つの項目を持つ必要があります。タプルは`SELECT`クエリの`IN`句で出現する特別なケースです。クエリの結果にはタプルを含めることができますが、タプルはデータベースに保存できません([Memory](../engines/table-engines/special/memory.md)エンジンを使用するテーブルを除く)。 + +### NULL + +値が欠落していることを示します。 + +テーブルフィールドに`NULL`を保存するには、フィールドが[Nullable](../sql-reference/data-types/nullable.md)型である必要があります。 + +データフォーマット(入力または出力)に応じて、`NULL`には異なる表現がある場合があります。詳細については、[データフォーマット](../interfaces/formats.md#formats)のドキュメントを参照してください。 + +`NULL`の処理には多くのニュアンスがあります。たとえば、比較操作の引数の少なくとも1つが`NULL`の場合、この操作の結果も`NULL`です。乗算や加算など他の操作についても同様です。詳細については、各操作のドキュメントを参照してください。 + +クエリ内で、[IS NULL](../sql-reference/operators/index.md#is-null)および[IS NOT NULL](../sql-reference/operators/index.md#is-not-null)演算子および関連する関数`isNull`および`isNotNull`を使用して`NULL`を確認できます。 + +### ヒアドキュメント + +[ヒアドキュメント](https://en.wikipedia.org/wiki/Here_document)は、元のフォーマットを保持しながら文字列(多くの場合複数行)を定義する方法です。ヒアドキュメントはカスタム文字列リテラルとして定義され、たとえば`$heredoc$`のように二つの`$`記号で囲まれます。二つのヒアドキュメントの間にある値はそのまま処理されます。 + +ヒアドキュメントを使用して、SQL、HTML、またはXMLコードなどのスニペットを埋め込むことができます。 + +**例** + +クエリ: + +```sql +SELECT $smth$SHOW CREATE VIEW my_view$smth$; +``` + +結果: + +```text +┌─'SHOW CREATE VIEW my_view'─┐ +│ SHOW CREATE VIEW my_view │ +└────────────────────────────┘ +``` + +## クエリパラメータの定義と使用法 + +クエリパラメータを使用すると、具体的な識別子の代わりに抽象的なプレースホルダーを含む一般的なクエリを書くことができます。クエリパラメータ付きのクエリが実行されると、すべてのプレースホルダーが解決され、実際のクエリパラメータの値に置き換えられます。 + +クエリパラメータを定義する方法は二つあります: + +- `SET param_=` コマンドを使用する。 +- コマンドラインで`clickhouse-client`に`--param_=''`を引数として渡す。``はクエリパラメータの名前、``はその値です。 + +クエリ内でクエリパラメータを参照するには、`{: }`を使用します。ここで``はクエリパラメータの名前、``はそれが変換されるデータ型です。 + +たとえば、以下のSQLは異なるデータ型を持つパラメータ`a` 、`b` 、`c` 、`d`を定義しています: + +```sql +SET param_a = 13; +SET param_b = 'str'; +SET param_c = '2022-08-04 18:30:53'; +SET param_d = {'10': [11, 12], '13': [14, 15]}; + +SELECT + {a: UInt32}, + {b: String}, + {c: DateTime}, + {d: Map(String, Array(UInt8))}; +``` + +結果: + +```response +13 str 2022-08-04 18:30:53 {'10':[11,12],'13':[14,15]} +``` + +`clickhouse-client`を使用している場合、パラメータは`--param_name=value`として指定されます。たとえば、以下のパラメータは`message`という名前で、`String`として取得されます: + +```bash +clickhouse-client --param_message='hello' --query="SELECT {message: String}" +``` + +結果: + +```response +hello +``` + +クエリパラメータがデータベース、テーブル、関数、またはその他の識別子の名前を表す場合、その型には`Identifier`を使用します。たとえば、次のクエリは`uk_price_paid`という名前のテーブルから行を返します: + +```sql +SET param_mytablename = "uk_price_paid"; +SELECT * FROM {mytablename:Identifier}; +``` + +:::note +クエリパラメータは任意のSQLクエリの任意の場所に使用できる一般的なテキスト置換ではありません。主に識別子やリテラルの代わりに`SELECT`ステートメント内で機能するよう設計されています。 +::: + +## 関数 + +関数呼び出しは、括弧内に引数のリスト(空でも可)がある識別子のように書かれます。標準SQLとは対照的に、括弧は空の引数リストの場合でも必要です。例:`now()`。通常の関数と集計関数([集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)セクションを参照)が存在します。一部の集計関数は括弧内に引数リストを2つ持つことができます。例:`quantile (0.9) (x)`。これらの集計関数は「パラメトリック関数」と呼ばれ、最初のリストの引数は「パラメータ」と呼ばれます。パラメータのない集計関数の構文は、通常の関数と同じです。 + +## 演算子 + +演算子は、優先順位と結合性を考慮して、クエリ解析中に対応する関数に変換されます。たとえば、式 `1 + 2 * 3 + 4` は `plus(plus(1, multiply(2, 3)), 4)` に変換されます。 + +## データ型とデータベーステーブルエンジン + +`CREATE`クエリ内のデータ型とテーブルエンジンは、識別子または関数として記述されます。つまり、括弧内に引数リストを含む場合と含まない場合があります。詳細については、[データ型](/docs/ja/sql-reference/data-types/index.md)、[テーブルエンジン](/docs/ja/engines/table-engines/index.md)、および[CREATE](/docs/ja/sql-reference/statements/create/index.md)セクションを参照してください。 + +## 式のエイリアス + +エイリアスは、クエリ内の式に対するユーザー定義の名前です。 + +``` sql +expr AS alias +``` + +- `AS` — エイリアスを定義するためのキーワードです。テーブル名や`SELECT`句のカラム名に対して`AS`キーワードを使用せずにエイリアスを定義できます。 + + 例:`SELECT table_name_alias.column_name FROM table_name table_name_alias` + + [CAST](./functions/type-conversion-functions.md#castx-t) 関数内では、`AS` キーワードは別の意味を持ちます。関数の説明を参照してください。 + +- `expr` — ClickHouseによってサポートされる任意の式。 + + 例:`SELECT column_name * 2 AS double FROM some_table` + +- `alias` — `expr`のための名前。エイリアスは[識別子](#identifiers)の構文に準拠する必要があります。 + + 例:`SELECT "table t".column_name FROM table_name AS "table t"` + +### 使用に関する注意 + +エイリアスはクエリまたはサブクエリに対してグローバルであり、クエリの任意の部分で任意の式にエイリアスを定義できます。たとえば、`SELECT (1 AS n) + 2, n`。 + +エイリアスはサブクエリでは表示されず、サブクエリ間でも表示されません。たとえば、クエリ`SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a`を実行する際、ClickHouseは`Unknown identifier: num`という例外を生成します。 + +エイリアスがサブクエリの`SELECT`句における結果カラムに定義されている場合、これらのカラムは外部クエリで表示されます。たとえば、`SELECT n + m FROM (SELECT 1 AS n, 2 AS m)`。 + +カラム名やテーブル名と同じエイリアスを注意してください。次の例を考えてみましょう: + +``` sql +CREATE TABLE t +( + a Int, + b Int +) +ENGINE = TinyLog() +``` + +``` sql +SELECT + argMax(a, b), + sum(b) AS b +FROM t +``` + +``` text +Received exception from server (version 18.14.17): +Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sum(b) is found inside another aggregate function in query. +``` + +この例では、テーブル`t`をカラム`b`で宣言しました。その後、データを選択する際に`sum(b) AS b`エイリアスを定義しました。エイリアスはグローバルであるため、ClickHouseは式`argMax(a, b)`内のリテラル`b`を式`sum(b)`で置き換えました。この置換により例外が発生しました。このデフォルトの挙動は、[prefer_column_name_to_alias](../operations/settings/settings.md#prefer-column-name-to-alias)を`1`に設定することで変更できます。 + +## アスタリスク + +`SELECT`クエリでは、アスタリスクが式を置き換えることができます。詳細については、[SELECT](/docs/ja/sql-reference/statements/select/index.md#asterisk)セクションを参照してください。 + +## 式 + +式は、関数、識別子、リテラル、演算子の適用、括弧内の式、サブクエリ、またはアスタリスクです。エイリアスを含むこともできます。式のリストはカンマで区切られた1つ以上の式です。関数と演算子は、引数として式を持つことができます。 diff --git a/docs/ja/sql-reference/table-functions/azureBlobStorage.md b/docs/ja/sql-reference/table-functions/azureBlobStorage.md new file mode 100644 index 00000000000..db0e625acb4 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/azureBlobStorage.md @@ -0,0 +1,92 @@ +--- +slug: /ja/sql-reference/table-functions/azureBlobStorage +sidebar_position: 10 +sidebar_label: azureBlobStorage +keywords: [azure blob storage] +--- + +# azureBlobStorage テーブル関数 + +[Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) のファイルを選択/挿入するためのテーブルのようなインターフェースを提供します。このテーブル関数は [s3 関数](../../sql-reference/table-functions/s3.md)と似ています。 + +**構文** + +``` sql +azureBlobStorage(- connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression, structure]) +``` + +**引数** + +- `connection_string|storage_account_url` — connection_string はアカウント名とキーを含みます ([connection string の作成](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json#configure-a-connection-string-for-an-azure-storage-account)) または、ストレージアカウントのURLをここに提供し、アカウント名とアカウントキーを別々のパラメータとして指定することもできます(パラメータのaccount_nameとaccount_keyを参照) +- `container_name` - コンテナー名 +- `blobpath` - ファイルパス。リードオンリーモードでは以下のワイルドカードがサポートされています: `*`, `**`, `?`, `{abc,def}` および `{N..M}` ここで `N`, `M` — 数字, `'abc'`, `'def'` — 文字列。 +- `account_name` - storage_account_url が使用されている場合は、ここでアカウント名を指定できます +- `account_key` - storage_account_url が使用されている場合は、ここでアカウントキーを指定できます +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。 +- `compression` — サポートされている値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮を自動的に検出します(`auto`に設定した場合と同じ)。 +- `structure` — テーブルの構造。フォーマット `'column1_name column1_type, column2_name column2_type, ...'`。 + +**返される値** + +指定されたファイルにおいてデータを読み書きするための指定された構造のテーブル。 + +**例** + +以下を使用して Azure Blob Storage にデータを書き込みます: + +```sql +INSERT INTO TABLE FUNCTION azureBlobStorage('http://azurite1:10000/devstoreaccount1', + 'test_container', 'test_{_partition_id}.csv', 'devstoreaccount1', 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', + 'CSV', 'auto', 'column1 UInt32, column2 UInt32, column3 UInt32') PARTITION BY column3 VALUES (1, 2, 3), (3, 2, 1), (78, 43, 3); +``` + +そのデータは次の方法で読み取ることができます + +```sql +SELECT * FROM azureBlobStorage('http://azurite1:10000/devstoreaccount1', + 'test_container', 'test_1.csv', 'devstoreaccount1', 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', + 'CSV', 'auto', 'column1 UInt32, column2 UInt32, column3 UInt32'); +``` + +```response +┌───column1─┬────column2─┬───column3─┐ +│ 3 │ 2 │ 1 │ +└───────────┴────────────┴───────────┘ +``` + +または connection_string を使用する + +```sql +SELECT count(*) FROM azureBlobStorage('DefaultEndpointsProtocol=https;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;EndPointSuffix=core.windows.net', + 'test_container', 'test_3.csv', 'CSV', 'auto' , 'column1 UInt32, column2 UInt32, column3 UInt32'); +``` + +``` text +┌─count()─┐ +│ 2 │ +└─────────┘ +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。タイプ: `LowCardinalty(String)`。 +- `_file` — ファイル名。タイプ: `LowCardinalty(String)`。 +- `_size` — ファイルのサイズ(バイト単位)。タイプ: `Nullable(UInt64)`。ファイルサイズが不明な場合、値は `NULL` になります。 +- `_time` — ファイルの最終更新時刻。タイプ: `Nullable(DateTime)`。時刻が不明な場合、値は `NULL` になります。 + +**関連項目** + +- [AzureBlobStorage テーブルエンジン](/docs/ja/engines/table-engines/integrations/azureBlobStorage.md) + +## Hiveスタイルのパーティショニング {#hive-style-partitioning} + +`use_hive_partitioning` を 1 に設定すると、ClickHouse はパス内の Hiveスタイルのパーティショニング(`/name=value/`)を検出し、パーティションカラムをクエリ内で仮想カラムとして使用できるようにします。これらの仮想カラムは、パーティションされたパス内と同じ名前を持ちますが、先頭に `_` が付きます。 + +**例** + +Hiveスタイルのパーティショニングで作成された仮想カラムを使用する + +``` sql +SET use_hive_partitioning = 1; +SELECT * from azureBlobStorage(config, storage_account_url='...', container='...', blob_path='http://data/path/date=*/country=*/code=*/*.parquet') where _date > '2020-01-01' and _country = 'Netherlands' and _code = 42; +``` diff --git a/docs/ja/sql-reference/table-functions/azureBlobStorageCluster.md b/docs/ja/sql-reference/table-functions/azureBlobStorageCluster.md new file mode 100644 index 00000000000..e439553b220 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/azureBlobStorageCluster.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/table-functions/azureBlobStorageCluster +sidebar_position: 15 +sidebar_label: azureBlobStorageCluster +title: "azureBlobStorageCluster テーブル関数" +--- + +指定されたクラスタ内の多くのノードから並行して [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs) のファイルを処理することを可能にします。起動ノードでは、クラスタ内のすべてのノードに接続を作成し、S3ファイルパス内のアスタリスクを展開し、各ファイルを動的に分配します。ワーカーノードでは、処理すべき次のタスクを起動ノードに問い合わせ、それを処理します。これはすべてのタスクが終了するまで繰り返されます。このテーブル関数は、[s3Cluster 関数](../../sql-reference/table-functions/s3Cluster.md) と似ています。 + +**構文** + +``` sql +azureBlobStorageCluster(cluster_name, connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression, structure]) +``` + +**引数** + +- `cluster_name` — リモートおよびローカルサーバへのアドレスと接続パラメータのセットを構築するために使用されるクラスタの名前。 +- `connection_string|storage_account_url` — connection_string にはアカウント名とキーが含まれます ([接続文字列の作成](https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json#configure-a-connection-string-for-an-azure-storage-account))。または、ストレージアカウントURLをここで指定し、アカウント名とアカウントキーを別のパラメータとして提供することもできます(パラメータaccount_nameとaccount_keyを参照)。 +- `container_name` - コンテナ名。 +- `blobpath` - ファイルパス。読み取り専用モードで次のワイルドカードをサポートします: `*`, `**`, `?`, `{abc,def}`, `{N..M}` ここで `N`, `M`は数値、`'abc'`, `'def'`は文字列。 +- `account_name` - storage_account_url が使用される場合、ここでアカウント名を指定できます。 +- `account_key` - storage_account_url が使用される場合、ここでアカウントキーを指定できます。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。 +- `compression` — サポートされる値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮を自動検出します(`auto`に設定するのと同様)。 +- `structure` — テーブルの構造。フォーマット `'column1_name column1_type, column2_name column2_type, ...'`。 + +**返される値** + +指定されたファイルでデータを読み書きするための指定された構造のテーブル。 + +**例** + +`cluster_simple` クラスタ内のすべてのノードを使用して、ファイル `test_cluster_*.csv` のカウントを選択します: + +``` sql +SELECT count(*) from azureBlobStorageCluster( + 'cluster_simple', 'http://azurite1:10000/devstoreaccount1', 'test_container', 'test_cluster_count.csv', 'devstoreaccount1', + 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', 'CSV', + 'auto', 'key UInt64') +``` + +**参照** + +- [AzureBlobStorage エンジン](../../engines/table-engines/integrations/azureBlobStorage.md) +- [azureBlobStorage テーブル関数](../../sql-reference/table-functions/azureBlobStorage.md) diff --git a/docs/ja/sql-reference/table-functions/cluster.md b/docs/ja/sql-reference/table-functions/cluster.md new file mode 100644 index 00000000000..b4059aa7d5c --- /dev/null +++ b/docs/ja/sql-reference/table-functions/cluster.md @@ -0,0 +1,59 @@ +--- +slug: /ja/sql-reference/table-functions/cluster +sidebar_position: 30 +sidebar_label: cluster +title: "cluster, clusterAllReplicas" +--- + +クラスタのすべてのシャード(`remote_servers`セクションで設定)が、[分散テーブル](../../engines/table-engines/special/distributed.md)を作成せずにアクセスできます。各シャードのレプリカのうち1つだけがクエリされます。 + +`clusterAllReplicas`関数 — `cluster`と同様ですが、すべてのレプリカがクエリされます。クラスタ内の各レプリカが個別のシャード/接続として使用されます。 + +:::note +利用可能なすべてのクラスタは[system.clusters](../../operations/system-tables/clusters.md)テーブルにリストされています。 +::: + +**構文** + +``` sql +cluster(['cluster_name', db.table, sharding_key]) +cluster(['cluster_name', db, table, sharding_key]) +clusterAllReplicas(['cluster_name', db.table, sharding_key]) +clusterAllReplicas(['cluster_name', db, table, sharding_key]) +``` +**引数** + +- `cluster_name` – リモートおよびローカルサーバーへのアドレスと接続パラメータのセットを構築するために使用されるクラスタの名前。指定しない場合は`default`が設定されます。 +- `db.table` または `db`, `table` - データベースとテーブルの名前。 +- `sharding_key` - シャーディングキー。任意。クラスタが複数のシャードを持つ場合に指定が必要です。 + +**返される値** + +クラスタからのデータセット。 + +**マクロの使用** + +`cluster_name`にはマクロを含めることができます。波括弧の中にある値は、サーバー設定ファイルの[macros](../../operations/server-configuration-parameters/settings.md#macros)セクションからの置換値です。 + +例: + +```sql +SELECT * FROM cluster('{cluster}', default.example_table); +``` + +**使用法と推奨事項** + +`cluster`および`clusterAllReplicas`テーブル関数を利用することは、`Distributed`テーブルを作成するよりも効率が劣ります。というのは、この場合、要求ごとにサーバー接続が再確立されるためです。大量のクエリを処理する際は、常に事前に`Distributed`テーブルを作成し、`cluster`および`clusterAllReplicas`テーブル関数を使用しないでください。 + +`cluster`および`clusterAllReplicas`テーブル関数は、次のような場合に有用です: + +- 特定のクラスタへのアクセスを通じたデータの比較、デバッグ、およびテスト。 +- 研究目的でのさまざまなClickHouseクラスタやレプリカへのクエリ。 +- 手動で実行されるまれな分散要求。 + +接続設定(`host`、`port`、`user`、`password`、`compression`、`secure`など)は``構成セクションから取得されます。[Distributedエンジン](../../engines/table-engines/special/distributed.md)の詳細を参照してください。 + +**関連項目** + +- [skip_unavailable_shards](../../operations/settings/settings.md#skip_unavailable_shards) +- [load_balancing](../../operations/settings/settings.md#load_balancing) diff --git a/docs/ja/sql-reference/table-functions/deltalake.md b/docs/ja/sql-reference/table-functions/deltalake.md new file mode 100644 index 00000000000..5d74f870b2f --- /dev/null +++ b/docs/ja/sql-reference/table-functions/deltalake.md @@ -0,0 +1,51 @@ +--- +slug: /ja/sql-reference/table-functions/deltalake +sidebar_position: 45 +sidebar_label: deltaLake +--- + +# deltaLake テーブル関数 + +Amazon S3 にある [Delta Lake](https://github.com/delta-io/delta) テーブルへの読み取り専用テーブルのようなインターフェースを提供します。 + +## 構文 + +``` sql +deltaLake(url [,aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression]) +``` + +## 引数 + +- `url` — S3 にある既存の Delta Lake テーブルへのパスを含むバケットURL。 +- `aws_access_key_id`, `aws_secret_access_key` - [AWS](https://aws.amazon.com/) アカウントユーザー用の長期資格情報です。これを使用してリクエストを認証できます。これらのパラメータはオプションです。資格情報が指定されていない場合、ClickHouse の設定から使用されます。詳細は [Using S3 for Data Storage](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3) を参照してください。 +- `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +- `structure` — テーブルの構造。フォーマットは `'column1_name column1_type, column2_name column2_type, ...'` です。 +- `compression` — パラメータはオプションです。サポートされている値:`none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮が自動検出されます。 + +**返り値** + +S3 に指定された Delta Lake テーブルからデータを読み取るために指定された構造のテーブル。 + +**例** + +S3 にあるテーブル `https://clickhouse-public-datasets.s3.amazonaws.com/delta_lake/hits/` から行を選択: + +``` sql +SELECT + URL, + UserAgent +FROM deltaLake('https://clickhouse-public-datasets.s3.amazonaws.com/delta_lake/hits/') +WHERE URL IS NOT NULL +LIMIT 2 +``` + +``` response +┌─URL───────────────────────────────────────────────────────────────────┬─UserAgent─┐ +│ http://auto.ria.ua/search/index.kz/jobinmoscow/detail/55089/hasimages │ 1 │ +│ http://auto.ria.ua/search/index.kz/jobinmoscow.ru/gosushi │ 1 │ +└───────────────────────────────────────────────────────────────────────┴───────────┘ +``` + +**関連情報** + +- [DeltaLake エンジン](/docs/ja/engines/table-engines/integrations/deltalake.md) diff --git a/docs/ja/sql-reference/table-functions/dictionary.md b/docs/ja/sql-reference/table-functions/dictionary.md new file mode 100644 index 00000000000..81223111cde --- /dev/null +++ b/docs/ja/sql-reference/table-functions/dictionary.md @@ -0,0 +1,59 @@ +--- +slug: /ja/sql-reference/table-functions/dictionary +sidebar_position: 47 +sidebar_label: dictionary +title: dictionary +--- + +[Dictionary](../../sql-reference/dictionaries/index.md) のデータを ClickHouse テーブルとして表示します。この機能は [Dictionary](../../engines/table-engines/special/dictionary.md) エンジンと同様に動作します。 + +**構文** + +``` sql +dictionary('dict') +``` + +**引数** + +- `dict` — Dictionary の名前。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +ClickHouse テーブル。 + +**例** + +入力テーブル `dictionary_source_table`: + +``` text +┌─id─┬─value─┐ +│ 0 │ 0 │ +│ 1 │ 1 │ +└────┴───────┘ +``` + +Dictionary の作成: + +``` sql +CREATE DICTIONARY new_dictionary(id UInt64, value UInt64 DEFAULT 0) PRIMARY KEY id +SOURCE(CLICKHOUSE(HOST 'localhost' PORT tcpPort() USER 'default' TABLE 'dictionary_source_table')) LAYOUT(DIRECT()); +``` + +クエリ: + +``` sql +SELECT * FROM dictionary('new_dictionary'); +``` + +結果: + +``` text +┌─id─┬─value─┐ +│ 0 │ 0 │ +│ 1 │ 1 │ +└────┴───────┘ +``` + +**関連項目** + +- [Dictionary エンジン](../../engines/table-engines/special/dictionary.md#dictionary) diff --git a/docs/ja/sql-reference/table-functions/executable.md b/docs/ja/sql-reference/table-functions/executable.md new file mode 100644 index 00000000000..9de6d7113be --- /dev/null +++ b/docs/ja/sql-reference/table-functions/executable.md @@ -0,0 +1,106 @@ +--- +slug: /ja/engines/table-functions/executable +sidebar_position: 50 +sidebar_label: executable +keywords: [udf, user defined function, clickhouse, executable, table, function] +--- + +# UDF用の executable テーブル関数 + +`executable` テーブル関数は、ユーザ定義関数(UDF)の出力に基づいてテーブルを作成します。この関数は、**stdout** に行を出力するスクリプト内で定義します。実行可能なスクリプトは `users_scripts` ディレクトリに保存され、任意のソースからデータを読み取ることができます。ClickHouse サーバーに、実行可能スクリプトを動作させるために必要なパッケージがインストールされていることを確認してください。例えば、Python スクリプトの場合、必要な Python パッケージがサーバーにインストールされている必要があります。 + +入力クエリを一つ以上オプションで含め、結果を **stdin** にストリームしてスクリプトが読み取れるようにすることができます。 + +:::note +通常の UDF 関数と `executable` テーブル関数および `Executable` テーブルエンジンの大きな利点は、通常の UDF 関数は行数を変更できない点です。例えば、入力が100行であれば、結果も100行でなければなりません。しかし、`executable` テーブル関数または `Executable` テーブルエンジンを使用することで、スクリプトは複雑な集計など、任意のデータ変換を行うことができます。 +::: + +## 構文 + +`executable` テーブル関数は3つのパラメータを要求し、入力クエリのオプションリストを受け付けます: + +```sql +executable(script_name, format, structure, [input_query...] [,SETTINGS ...]) +``` + +- `script_name`: スクリプトのファイル名。`user_scripts` フォルダに保存されます(`user_scripts_path` 設定のデフォルトフォルダ) +- `format`: 生成されるテーブルのフォーマット +- `structure`: 生成されるテーブルのスキーマ +- `input_query`: スクリプトに **stdin** 経由で結果が渡されるオプションのクエリ(または集合、クエリ) + +:::note +同じ入力クエリで同じスクリプトを繰り返し呼び出す予定がある場合、[`Executable` テーブルエンジン](../../engines/table-engines/special/executable.md)を使用することを検討してください。 +::: + +以下の Python スクリプトは `generate_random.py` という名前で、`user_scripts` フォルダに保存されています。このスクリプトは数値 `i` を読み取り、タブで区切られた番号が前につく `i` 個のランダムな文字列を出力します。 + +```python +#!/usr/local/bin/python3.9 + +import sys +import string +import random + +def main(): + + # Read input value + for number in sys.stdin: + i = int(number) + + # Generate some random rows + for id in range(0, i): + letters = string.ascii_letters + random_string = ''.join(random.choices(letters ,k=10)) + print(str(id) + '\t' + random_string + '\n', end='') + + # Flush results to stdout + sys.stdout.flush() + +if __name__ == "__main__": + main() +``` + +このスクリプトを呼び出し、ランダム文字列を10個生成してみましょう。 + +```sql +SELECT * FROM executable('generate_random.py', TabSeparated, 'id UInt32, random String', (SELECT 10)) +``` + +レスポンスは次のようになります。 + +```response +┌─id─┬─random─────┐ +│ 0 │ xheXXCiSkH │ +│ 1 │ AqxvHAoTrl │ +│ 2 │ JYvPCEbIkY │ +│ 3 │ sWgnqJwGRm │ +│ 4 │ fTZGrjcLon │ +│ 5 │ ZQINGktPnd │ +│ 6 │ YFSvGGoezb │ +│ 7 │ QyMJJZOOia │ +│ 8 │ NfiyDDhmcI │ +│ 9 │ REJRdJpWrg │ +└────┴────────────┘ +``` + +## 設定 + +- `send_chunk_header` - データ処理のチャンクを送信する前に行数を送信するかどうかを制御します。デフォルト値は `false` です。 +- `pool_size` — プールのサイズ。`pool_size` に `0` が指定された場合、プールサイズの制限はありません。デフォルト値は `16` です。 +- `max_command_execution_time` — データブロックを処理するための実行可能スクリプトコマンドの最大実行時間。秒単位で指定。デフォルト値は 10。 +- `command_termination_timeout` — 実行可能スクリプトはメインの読み書きループを含んでいる必要があります。テーブル関数が破棄されるとパイプが閉じ、実行可能ファイルは終了するまで `command_termination_timeout` 秒を持ち、ClickHouse が子プロセスに SIGTERM シグナルを送る前に終了します。秒単位で指定。デフォルト値は 10。 +- `command_read_timeout` - コマンドの stdout からデータを読み取るタイムアウトをミリ秒で指定。デフォルト値は 10000。 +- `command_write_timeout` - コマンドの stdin へデータを書き込むタイムアウトをミリ秒で指定。デフォルト値は 10000。 + +## クエリ結果をスクリプトに渡す + +クエリ結果をスクリプトに渡す方法については、[`Executable` テーブルエンジン](../../engines/table-engines/special/executable.md#passing-query-results-to-a-script)の例も参照してください。この例のスクリプトを`executable` テーブル関数で実行する方法は次の通りです: + +```sql +SELECT * FROM executable( + 'sentiment.py', + TabSeparated, + 'id UInt64, sentiment Float32', + (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20) +); +``` diff --git a/docs/ja/sql-reference/table-functions/file.md b/docs/ja/sql-reference/table-functions/file.md new file mode 100644 index 00000000000..b86c5e187e3 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/file.md @@ -0,0 +1,230 @@ +--- +slug: /ja/sql-reference/table-functions/file +sidebar_position: 60 +sidebar_label: file +--- + +# file + +`file`は、ファイルに対してSELECT文とINSERT文を実行するためのテーブルエンジンであり、[s3](/docs/ja/sql-reference/table-functions/url.md)テーブル関数に似たテーブルライクなインターフェースを提供します。ローカルファイルを扱う際には`file()`を使用し、S3、GCS、MinIOなどのオブジェクトストレージのバケットを扱う際には`s3()`を使用します。 + +`file`関数は、ファイルからデータを読み込んだり、ファイルにデータを書き込むために`SELECT`および`INSERT`クエリで使用できます。 + +**構文** + +```sql +file([path_to_archive ::] path [,format] [,structure] [,compression]) +``` + +**パラメータ** + +- `path` — [user_files_path](/docs/ja/operations/server-configuration-parameters/settings.md#user_files_path)からのファイルへの相対パスです。読み取り専用モードで以下の[グロブ](#globs-in-path)をサポートしています。`*`、`?`、`{abc,def}`(`'abc'`と`'def'`は文字列)、および`{N..M}`(`N`と`M`は数値)。 +- `path_to_archive` - zip/tar/7zアーカイブへの相対パス。同じグロブを`path`と共にサポート。 +- `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md#formats)。 +- `structure` — テーブルの構造。形式: `'column1_name column1_type, column2_name column2_type, ...'`。 +- `compression` — `SELECT`クエリで使用する既存の圧縮タイプ、または`INSERT`クエリで使用する希望の圧縮タイプ。サポートされる圧縮タイプは`gz`、`br`、`xz`、`zst`、`lz4`、および`bz2`です。 + +**返される値** + +ファイル内のデータの読み書きに使用されるテーブル。 + +## ファイルへの書き込み例 + +### TSVファイルに書き込む + +```sql +INSERT INTO TABLE FUNCTION +file('test.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2) +``` + +結果として、データは`test.tsv`ファイルに書き込まれます: + +```bash +# cat /var/lib/clickhouse/user_files/test.tsv +1 2 3 +3 2 1 +1 3 2 +``` + +### 複数のTSVファイルへのパーティション化された書き込み + +`file()`型のテーブル関数にデータを挿入する際に`PARTITION BY`式を指定すると、各パーティションごとに個別のファイルが作成されます。データを別々のファイルに分割することで読み取り操作のパフォーマンスを向上させることができます。 + +```sql +INSERT INTO TABLE FUNCTION +file('test_{_partition_id}.tsv', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +PARTITION BY column3 +VALUES (1, 2, 3), (3, 2, 1), (1, 3, 2) +``` + +結果として、データは3つのファイル、`test_1.tsv`、`test_2.tsv`、`test_3.tsv`に書き込まれます。 + +```bash +# cat /var/lib/clickhouse/user_files/test_1.tsv +3 2 1 + +# cat /var/lib/clickhouse/user_files/test_2.tsv +1 3 2 + +# cat /var/lib/clickhouse/user_files/test_3.tsv +1 2 3 +``` + +## ファイルからの読み取り例 + +### CSVファイルからのSELECT + +まず、サーバー設定で`user_files_path`を設定し、`test.csv`ファイルを準備します: + +```bash +$ grep user_files_path /etc/clickhouse-server/config.xml + /var/lib/clickhouse/user_files/ + +$ cat /var/lib/clickhouse/user_files/test.csv + 1,2,3 + 3,2,1 + 78,43,45 +``` + +次に、`test.csv`からデータをテーブルに読み込み、最初の2行を選択します: + +```sql +SELECT * FROM +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2; +``` + +```text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +### ファイルからテーブルへのデータの挿入 + +```sql +INSERT INTO FUNCTION +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +VALUES (1, 2, 3), (3, 2, 1); +``` +```sql +SELECT * FROM +file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32'); +``` + +```text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +`archive1.zip`または`archive2.zip`にある`table.csv`からのデータの読み込み: + +```sql +SELECT * FROM file('user_files/archives/archive{1..2}.zip :: table.csv'); +``` + +## パスのグロブ + +パスにはグロビングを使用できます。ファイルはパスパターン全体にマッチする必要があり、接頭辞または接尾辞のみではありません。パスが既存のディレクトリを指し、グロブを使用しない場合、そのパスには暗黙的に`*`が追加され、ディレクトリ内のすべてのファイルが選択されるという一例外があります。 + +- `*` — 空文字列を含みますが`/`を除く任意の文字。 +- `?` — 任意の単一文字。 +- `{some_string,another_string,yet_another_one}` — 文字列 `'some_string'`, `'another_string'`, `'yet_another_one'` のいずれかを置換できます。文字列には`/`を含めることができます。 +- `{N..M}` — `N >=` および `<= M` の任意の数。 +- `**` - フォルダ内のすべてのファイルを再帰的に表します。 + +`{}`を使用した構造は[remote](remote.md)や[hdfs](hdfs.md)テーブル関数に似ています。 + +**例** + +以下の相対パスを持つファイルがあるとします: + +- `some_dir/some_file_1` +- `some_dir/some_file_2` +- `some_dir/some_file_3` +- `another_dir/some_file_1` +- `another_dir/some_file_2` +- `another_dir/some_file_3` + +すべてのファイルの行数をクエリします: + +```sql +SELECT count(*) FROM file('{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32'); +``` + +同じ結果を達成する別のパス表現: + +```sql +SELECT count(*) FROM file('{some,another}_dir/*', 'TSV', 'name String, value UInt32'); +``` + +暗黙的な`*`を使用して`some_dir`内のすべての行数をクエリします: + +```sql +SELECT count(*) FROM file('some_dir', 'TSV', 'name String, value UInt32'); +``` + +:::note +ファイルリストに先行ゼロを持つ数範囲が含まれている場合、各桁に対して中括弧を使用する構造を使用するか、`?`を使用します。 +::: + +**例** + +`file000`, `file001`, ..., `file999`というファイルに含まれる合計行数をクエリします: + +```sql +SELECT count(*) FROM file('big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32'); +``` + +**例** + +ディレクトリ`big_dir/`内のすべてのファイルから再帰的に行数をクエリします: + +```sql +SELECT count(*) FROM file('big_dir/**', 'CSV', 'name String, value UInt32'); +``` + +**例** + +ディレクトリ`big_dir/`内の任意のフォルダ内にあるファイル`file002`から再帰的にすべての行数をクエリします: + +```sql +SELECT count(*) FROM file('big_dir/**/file002', 'CSV', 'name String, value UInt32'); +``` + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。型:`LowCardinalty(String)`。 +- `_file` — ファイル名。型:`LowCardinalty(String)`。 +- `_size` — バイト単位のファイルサイズ。型:`Nullable(UInt64)`。ファイルサイズが不明な場合、値は `NULL` になります。 +- `_time` — ファイルの最終更新時刻。型:`Nullable(DateTime)`。時間が不明な場合、値は`NULL`になります。 + +## Hiveスタイルのパーティション化 {#hive-style-partitioning} + +`use_hive_partitioning`設定を1に設定すると、ClickHouseはパス内のHiveスタイルのパーティション化(`/name=value/`)を検出し、パーティションカラムをクエリ内で仮想カラムとして使用できるようになります。これらの仮想カラムはパーティション化されたパスのカラム名と同じですが、先頭に`_`が付きます。 + +**例** + +Hiveスタイルのパーティション化で作成された仮想カラムを使用 + +```sql +SET use_hive_partitioning = 1; +SELECT * from file('data/path/date=*/country=*/code=*/*.parquet') where _date > '2020-01-01' and _country = 'Netherlands' and _code = 42; +``` + +## 設定 {#settings} + +- [engine_file_empty_if_not_exists](/docs/ja/operations/settings/settings.md#engine-file-empty_if-not-exists) - 存在しないファイルから空のデータを選択することを可能にします。デフォルトでは無効です。 +- [engine_file_truncate_on_insert](/docs/ja/operations/settings/settings.md#engine-file-truncate-on-insert) - 挿入前にファイルを切り詰めることを許可します。デフォルトでは無効です。 +- [engine_file_allow_create_multiple_files](/docs/ja/operations/settings/settings.md#engine_file_allow_create_multiple_files) - フォーマットにサフィックスがある場合、各挿入で新しいファイルを作成することを許可します。デフォルトでは無効です。 +- [engine_file_skip_empty_files](/docs/ja/operations/settings/settings.md#engine_file_skip_empty_files) - 読み取り中に空のファイルをスキップすることを許可します。デフォルトでは無効です。 +- [storage_file_read_method](/docs/ja/operations/settings/settings.md#engine-file-empty_if-not-exists) - ストレージファイルからデータを読み取る方法の1つ。read, pread, mmap(clickhouse-localのみ)。デフォルト値:`clickhouse-server`では`pread`、`clickhouse-local`では`mmap`。 + +**関連項目** + +- [Virtual columns](/docs/ja/engines/table-engines/index.md#table_engines-virtual_columns) +- [処理後にファイルの名前を変更する](/docs/ja/operations/settings/settings.md#rename_files_after_processing) diff --git a/docs/ja/sql-reference/table-functions/fileCluster.md b/docs/ja/sql-reference/table-functions/fileCluster.md new file mode 100644 index 00000000000..1c09b907d93 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/fileCluster.md @@ -0,0 +1,82 @@ +--- +slug: /ja/sql-reference/table-functions/fileCluster +sidebar_position: 61 +sidebar_label: fileCluster +--- + +# fileCluster テーブル関数 + +クラスター内の複数のノードで、指定されたパスに一致するファイルを同時に処理できるようにします。イニシエーターはワーカーノードへの接続を確立し、ファイルパスのグロブを展開し、ファイル読み取りタスクをワーカーノードに委任します。各ワーカーノードは、次に処理するファイルをイニシエーターにクエリして要求し、すべてのタスクが完了するまで(すべてのファイルが読み取られるまで)このプロセスを繰り返します。 + +:::note +この関数が_正しく_動作するのは、最初に指定されたパスに一致するファイルのセットがすべてのノードで同一であり、異なるノード間でも内容が一致している場合に限ります。 +これらのファイルがノード間で異なる場合、ワーカーノードがイニシエーターからタスクを要求する順序に依存するため、返される値は予測できません。 +::: + +**構文** + +``` sql +fileCluster(cluster_name, path[, format, structure, compression_method]) +``` + +**引数** + +- `cluster_name` — リモートおよびローカルサーバーへのアドレスと接続パラメータのセットを構築するために使用されるクラスターの名前。 +- `path` — [user_files_path](/docs/ja/operations/server-configuration-parameters/settings.md#user_files_path) からファイルへの相対パス。ファイルへのパスは[グロブ](#globs-in-path)をサポートしています。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。タイプ: [String](../../sql-reference/data-types/string.md)。 +- `structure` — `'UserID UInt64, Name String'`形式のテーブル構造。カラム名とタイプを決定します。タイプ: [String](../../sql-reference/data-types/string.md)。 +- `compression_method` — 圧縮方式。サポートされる圧縮タイプは `gz`、`br`、`xz`、`zst`、`lz4`、`bz2` です。 + +**返される値** + +指定されたフォーマットと構造を持ち、指定されたパスに一致するファイルからデータを持つテーブル。 + +**例** + +`my_cluster` という名前のクラスターと、以下の設定値 `user_files_path` が与えられている場合: + +``` bash +$ grep user_files_path /etc/clickhouse-server/config.xml + /var/lib/clickhouse/user_files/ +``` +また、各クラスターノードの `user_files_path` 内に `test1.csv` と `test2.csv` があり、その内容が異なるノード間で同一である場合: +```bash +$ cat /var/lib/clickhouse/user_files/test1.csv + 1,"file1" + 11,"file11" + +$ cat /var/lib/clickhouse/user_files/test2.csv + 2,"file2" + 22,"file22" +``` + +例えば、これらのファイルを各クラスターノードで次の2つのクエリを実行することで作成できます: +```sql +INSERT INTO TABLE FUNCTION file('file1.csv', 'CSV', 'i UInt32, s String') VALUES (1,'file1'), (11,'file11'); +INSERT INTO TABLE FUNCTION file('file2.csv', 'CSV', 'i UInt32, s String') VALUES (2,'file2'), (22,'file22'); +``` + +次に、`fileCluster` テーブル関数を通じて `test1.csv` と `test2.csv` のデータ内容を読み取ります: + +```sql +SELECT * FROM fileCluster('my_cluster', 'file{1,2}.csv', 'CSV', 'i UInt32, s String') ORDER BY i, s +``` + +``` +┌──i─┬─s──────┐ +│ 1 │ file1 │ +│ 11 │ file11 │ +└────┴────────┘ +┌──i─┬─s──────┐ +│ 2 │ file2 │ +│ 22 │ file22 │ +└────┴────────┘ +``` + +## パスにおけるグロブ + +[File](../../sql-reference/table-functions/file.md#globs-in-path) テーブル関数でサポートされているすべてのパターンが、FileClusterでもサポートされています。 + +**関連項目** + +- [Fileテーブル関数](../../sql-reference/table-functions/file.md) diff --git a/docs/ja/sql-reference/table-functions/format.md b/docs/ja/sql-reference/table-functions/format.md new file mode 100644 index 00000000000..7a3765a2552 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/format.md @@ -0,0 +1,98 @@ +--- +slug: /ja/sql-reference/table-functions/format +sidebar_position: 65 +sidebar_label: format +--- + +# format + +指定された入力フォーマットに従って、引数からデータを解析します。もし構造引数が指定されていない場合、データから抽出されます。 + +**構文** + +``` sql +format(format_name, [structure], data) +``` + +**パラメータ** + +- `format_name` — データの[フォーマット](../../interfaces/formats.md#formats)。 +- `structure` - テーブルの構造。オプション。形式は 'column1_name column1_type, column2_name column2_type, ...'。 +- `data` — 指定されたフォーマットでデータを含む文字列を返す文字列リテラルまたは定数式 + +**返される値** + +指定されたフォーマットと指定または抽出された構造に従って`data`引数から解析されたデータを含むテーブル。 + +**例** + +`structure`引数なし: + +**クエリ:** +``` sql +SELECT * FROM format(JSONEachRow, +$$ +{"a": "Hello", "b": 111} +{"a": "World", "b": 123} +{"a": "Hello", "b": 112} +{"a": "World", "b": 124} +$$) +``` + +**結果:** + +```response +┌───b─┬─a─────┐ +│ 111 │ Hello │ +│ 123 │ World │ +│ 112 │ Hello │ +│ 124 │ World │ +└─────┴───────┘ +``` + +**クエリ:** +```sql +DESC format(JSONEachRow, +$$ +{"a": "Hello", "b": 111} +{"a": "World", "b": 123} +{"a": "Hello", "b": 112} +{"a": "World", "b": 124} +$$) +``` + +**結果:** + +```response +┌─name─┬─type──────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ b │ Nullable(Float64) │ │ │ │ │ │ +│ a │ Nullable(String) │ │ │ │ │ │ +└──────┴───────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +`structure`引数あり: + +**クエリ:** +```sql +SELECT * FROM format(JSONEachRow, 'a String, b UInt32', +$$ +{"a": "Hello", "b": 111} +{"a": "World", "b": 123} +{"a": "Hello", "b": 112} +{"a": "World", "b": 124} +$$) +``` + +**結果:** +```response +┌─a─────┬───b─┐ +│ Hello │ 111 │ +│ World │ 123 │ +│ Hello │ 112 │ +│ World │ 124 │ +└───────┴─────┘ +``` + +**関連項目** + +- [フォーマット](../../interfaces/formats.md) diff --git a/docs/ja/sql-reference/table-functions/fuzzJSON.md b/docs/ja/sql-reference/table-functions/fuzzJSON.md new file mode 100644 index 00000000000..33a9aab3a31 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/fuzzJSON.md @@ -0,0 +1,97 @@ +--- +slug: /ja/sql-reference/table-functions/fuzzJSON +sidebar_position: 75 +sidebar_label: fuzzJSON +--- + +# fuzzJSON + +JSON文字列にランダムな変動を加える。 + +``` sql +fuzzJSON({ named_collection [, option=value [,..]] | json_str[, random_seed] }) +``` + +**引数** + +- `named_collection` - [NAMED COLLECTION](/docs/ja/sql-reference/statements/create/named-collection.md)。 +- `option=value` - Named collectionのオプションパラメータとその値。 + - `json_str` (String) - JSONフォーマットで構造化データを表す元の文字列。 + - `random_seed` (UInt64) - 安定した結果を生成するための手動ランダムシード。 + - `reuse_output` (boolean) - 生成された出力を次のファズ処理の入力として再利用する。 + - `malform_output` (boolean) - JSONオブジェクトとして解析不能な文字列を生成する。 + - `max_output_length` (UInt64) - 生成または変動したJSON文字列の許容される最大長。 + - `probability` (Float64) - JSONフィールド(キー-値ペア)をファズ化する確率。範囲は[0, 1]。 + - `max_nesting_level` (UInt64) - JSONデータ内で許可されるネスト構造の最大深さ。 + - `max_array_size` (UInt64) - JSON配列の許可される最大サイズ。 + - `max_object_size` (UInt64) - JSONオブジェクトの単一レベルでの許容されるフィールドの最大数。 + - `max_string_value_length` (UInt64) - String型の値の最大長。 + - `min_key_length` (UInt64) - キーの最小長。少なくとも1であるべき。 + - `max_key_length` (UInt64) - キーの最大長。指定されている場合、`min_key_length`以上であるべき。 + +**戻り値** + +変動したJSON文字列を含む単一カラムのテーブルオブジェクト。 + +## 使用例 + +``` sql +CREATE NAMED COLLECTION json_fuzzer AS json_str='{}'; +SELECT * FROM fuzzJSON(json_fuzzer) LIMIT 3; +``` + +``` text +{"52Xz2Zd4vKNcuP2":true} +{"UPbOhOQAdPKIg91":3405264103600403024} +{"X0QUWu8yT":[]} +``` + +``` sql +SELECT * FROM fuzzJSON(json_fuzzer, json_str='{"name" : "value"}', random_seed=1234) LIMIT 3; +``` + +``` text +{"key":"value", "mxPG0h1R5":"L-YQLv@9hcZbOIGrAn10%GA"} +{"BRE3":true} +{"key":"value", "SWzJdEJZ04nrpSfy":[{"3Q23y":[]}]} +``` + +``` sql +SELECT * FROM fuzzJSON(json_fuzzer, json_str='{"students" : ["Alice", "Bob"]}', reuse_output=true) LIMIT 3; +``` + +``` text +{"students":["Alice", "Bob"], "nwALnRMc4pyKD9Krv":[]} +{"students":["1rNY5ZNs0wU&82t_P", "Bob"], "wLNRGzwDiMKdw":[{}]} +{"xeEk":["1rNY5ZNs0wU&82t_P", "Bob"], "wLNRGzwDiMKdw":[{}, {}]} +``` + +``` sql +SELECT * FROM fuzzJSON(json_fuzzer, json_str='{"students" : ["Alice", "Bob"]}', max_output_length=512) LIMIT 3; +``` + +``` text +{"students":["Alice", "Bob"], "BREhhXj5":true} +{"NyEsSWzJdeJZ04s":["Alice", 5737924650575683711, 5346334167565345826], "BjVO2X9L":true} +{"NyEsSWzJdeJZ04s":["Alice", 5737924650575683711, 5346334167565345826], "BjVO2X9L":true, "k1SXzbSIz":[{}]} +``` + +``` sql +SELECT * FROM fuzzJSON('{"id":1}', 1234) LIMIT 3; +``` + +``` text +{"id":1, "mxPG0h1R5":"L-YQLv@9hcZbOIGrAn10%GA"} +{"BRjE":16137826149911306846} +{"XjKE":15076727133550123563} +``` + +``` sql +SELECT * FROM fuzzJSON(json_nc, json_str='{"name" : "FuzzJSON"}', random_seed=1337, malform_output=true) LIMIT 3; +``` + +``` text +U"name":"FuzzJSON*"SpByjZKtr2VAyHCO"falseh +{"name"keFuzzJSON, "g6vVO7TCIk":jTt^ +{"DBhz":YFuzzJSON5} +``` diff --git a/docs/ja/sql-reference/table-functions/fuzzQuery.md b/docs/ja/sql-reference/table-functions/fuzzQuery.md new file mode 100644 index 00000000000..2aabc044ca7 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/fuzzQuery.md @@ -0,0 +1,36 @@ +--- +slug: /ja/sql-reference/table-functions/fuzzQuery +sidebar_position: 75 +sidebar_label: fuzzQuery +--- + +# fuzzQuery + +指定されたクエリ文字列をランダムなバリエーションで撹乱します。 + +``` sql +fuzzQuery(query[, max_query_length[, random_seed]]) +``` + +**引数** + +- `query` (String) - ファズ化を行う元のクエリ。 +- `max_query_length` (UInt64) - ファズ化プロセス中にクエリが到達できる最大長。 +- `random_seed` (UInt64) - 安定した結果を出力するためのランダムシード。 + +**返される値** + +擾乱されたクエリ文字列を含む単一カラムのテーブルオブジェクト。 + +## 使用例 + +``` sql +SELECT * FROM fuzzQuery('SELECT materialize(\'a\' AS key) GROUP BY key') LIMIT 2; +``` + +``` + ┌─query──────────────────────────────────────────────────────────┐ +1. │ SELECT 'a' AS key GROUP BY key │ +2. │ EXPLAIN PIPELINE compact = true SELECT 'a' AS key GROUP BY key │ + └────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/table-functions/gcs.md b/docs/ja/sql-reference/table-functions/gcs.md new file mode 100644 index 00000000000..8c7160c2b94 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/gcs.md @@ -0,0 +1,208 @@ +--- +slug: /ja/sql-reference/table-functions/gcs +sidebar_position: 70 +sidebar_label: gcs +keywords: [gcs, bucket] +--- + +# gcs テーブル関数 + +[Google Cloud Storage](https://cloud.google.com/storage/) からデータを `SELECT` および `INSERT` するためのテーブルライクなインターフェースを提供します。[`Storage Object User` IAM ロール](https://cloud.google.com/storage/docs/access-control/iam-roles) が必要です。 + +これは [s3 テーブル関数](../../sql-reference/table-functions/s3.md) の別名です。 + +クラスターに複数のレプリカがある場合、[s3Cluster 関数](../../sql-reference/table-functions/s3Cluster.md)(GCS と共に動作します)を使用して挿入を並列化できます。 + +**構文** + +``` sql +gcs(url [, NOSIGN | hmac_key, hmac_secret] [,format] [,structure] [,compression_method]) +gcs(named_collection[, option=value [,..]]) +``` + +:::tip GCS +GCS テーブル関数は、GCS XML API と HMAC キーを使用して Google Cloud Storage に統合します。エンドポイントと HMAC の詳細については、[Google の相互運用性ドキュメント](https://cloud.google.com/storage/docs/interoperability)を参照してください。 + +::: + +**パラメータ** + +- `url` — ファイルへのバケットパス。読み取り専用モードで以下のワイルドカードをサポートします:`*`, `**`, `?`, `{abc, def}` と `{N..M}` (`N`, `M` — 数字, `'abc'`, `'def'` — 文字列)。 + :::note GCS + GCS パスは、Google XML API のエンドポイントが JSON API と異なるため、この形式です: + ``` + https://storage.googleapis.com/// + ``` + であり、~~https://storage.cloud.google.com~~ ではありません。 + ::: +- `NOSIGN` — 資格情報の代わりにこのキーワードが提供された場合、すべてのリクエストは署名されません。 +- `hmac_key` と `hmac_secret` — 指定されたエンドポイントで使用する資格情報を指定するキー。オプション。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。 +- `structure` — テーブルの構造。形式 `'column1_name column1_type, column2_name column2_type, ...'`。 +- `compression_method` — オプションのパラメータ。サポートされる値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮方法を自動検出します。 + +引数は[名前付きコレクション](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`url`、`format`、`structure`、`compression_method` は同様に機能し、いくつかの追加パラメータがサポートされます: + + - `access_key_id` — `hmac_key`, オプション。 + - `secret_access_key` — `hmac_secret`, オプション。 + - `filename` — 指定された場合、URLに追加されます。 + - `use_environment_credentials` — デフォルトで有効になっており、環境変数 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`、`AWS_CONTAINER_CREDENTIALS_FULL_URI`、`AWS_CONTAINER_AUTHORIZATION_TOKEN`、`AWS_EC2_METADATA_DISABLED` を使用して追加のパラメータを渡すことができます。 + - `no_sign_request` — デフォルトでは無効。 + - `expiration_window_seconds` — デフォルト値は 120。 + +**返される値** + +指定されたファイルでデータを読み書きするための特定の構造を持つテーブル。 + +**例** + +GCS ファイル `https://storage.googleapis.com/my-test-bucket-768/data.csv` から最初の2行を選択する例: + +``` sql +SELECT * +FROM gcs('https://storage.googleapis.com/my-test-bucket-768/data.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2; +``` + +``` text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +`gzip` 圧縮方法を使用した同様の例: + +``` sql +SELECT * +FROM gcs('https://storage.googleapis.com/my-test-bucket-768/data.csv.gz', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32', 'gzip') +LIMIT 2; +``` + +``` text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +## 使用方法 + +GCS上の以下のURIを持つ複数のファイルがあるとします: + +- 'https://storage.googleapis.com/my-test-bucket-768/some_prefix/some_file_1.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/some_prefix/some_file_2.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/some_prefix/some_file_3.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/some_prefix/some_file_4.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/another_prefix/some_file_1.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/another_prefix/some_file_2.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/another_prefix/some_file_3.csv' +- 'https://storage.googleapis.com/my-test-bucket-768/another_prefix/some_file_4.csv' + +番号が1から3までのファイル内の行数をカウントします: + +``` sql +SELECT count(*) +FROM gcs('https://storage.googleapis.com/my-test-bucket-768/{some,another}_prefix/some_file_{1..3}.csv', 'CSV', 'name String, value UInt32') +``` + +``` text +┌─count()─┐ +│ 18 │ +└─────────┘ +``` + +これら2つのディレクトリ内のすべてのファイルの総行数をカウントします: + +``` sql +SELECT count(*) +FROM gcs('https://storage.googleapis.com/my-test-bucket-768/{some,another}_prefix/*', 'CSV', 'name String, value UInt32') +``` + +``` text +┌─count()─┐ +│ 24 │ +└─────────┘ +``` + +:::warning +先頭にゼロを含む数字の範囲を含むファイルリストを持っている場合は、個別の数字用にブレースを使用するか、`?` を使用してください。 +::: + +ファイル名が `file-000.csv`、`file-001.csv`、...、`file-999.csv` のファイル内の総行数をカウントします: + +``` sql +SELECT count(*) +FROM gcs('https://storage.googleapis.com/my-test-bucket-768/big_prefix/file-{000..999}.csv', 'CSV', 'name String, value UInt32'); +``` + +``` text +┌─count()─┐ +│ 12 │ +└─────────┘ +``` + +ファイル `test-data.csv.gz` にデータを挿入: + +``` sql +INSERT INTO FUNCTION gcs('https://storage.googleapis.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip') +VALUES ('test-data', 1), ('test-data-2', 2); +``` + +既存のテーブルからファイル `test-data.csv.gz` にデータを挿入: + +``` sql +INSERT INTO FUNCTION gcs('https://storage.googleapis.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip') +SELECT name, value FROM existing_table; +``` + +グロブ ** は再帰的なディレクトリトラバーサルに使用できます。以下の例では、`my-test-bucket-768` ディレクトリ内のすべてのファイルを再帰的に取得します: + +``` sql +SELECT * FROM gcs('https://storage.googleapis.com/my-test-bucket-768/**', 'CSV', 'name String, value UInt32', 'gzip'); +``` + +以下は `my-test-bucket` ディレクトリ内の任意のフォルダーから `test-data.csv.gz` ファイルを再帰的に取得する例です: + +``` sql +SELECT * FROM gcs('https://storage.googleapis.com/my-test-bucket-768/**/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip'); +``` + +実用化のケースでは [名前付きコレクション](/docs/ja/operations/named-collections.md) を使用することをお勧めします。以下がその例です: +``` sql + +CREATE NAMED COLLECTION creds AS + access_key_id = '***', + secret_access_key = '***'; +SELECT count(*) +FROM gcs(creds, url='https://s3-object-url.csv') +``` + +## パーティション書き込み + +データを `GCS` テーブルに挿入する際に `PARTITION BY` 式を指定すると、各パーティション値に対して個別のファイルが作成されます。データを個別のファイルに分割することで、読み取り操作の効率を向上させます。 + +**例** + +1. キーにパーティションIDを使用して個別のファイルを作成: + +```sql +INSERT INTO TABLE FUNCTION + gcs('http://bucket.amazonaws.com/my_bucket/file_{_partition_id}.csv', 'CSV', 'a String, b UInt32, c UInt32') + PARTITION BY a VALUES ('x', 2, 3), ('x', 4, 5), ('y', 11, 12), ('y', 13, 14), ('z', 21, 22), ('z', 23, 24); +``` +この結果、データは `file_x.csv`、`file_y.csv`、`file_z.csv` の3つのファイルに書き込まれます。 + +2. パーティションIDをバケット名に使用して、異なるバケットにファイルを作成: + +```sql +INSERT INTO TABLE FUNCTION + gcs('http://bucket.amazonaws.com/my_bucket_{_partition_id}/file.csv', 'CSV', 'a UInt32, b UInt32, c UInt32') + PARTITION BY a VALUES (1, 2, 3), (1, 4, 5), (10, 11, 12), (10, 13, 14), (20, 21, 22), (20, 23, 24); +``` +この結果、データは異なるバケットにある3つのファイルに書き込まれます:`my_bucket_1/file.csv`、`my_bucket_10/file.csv`、および `my_bucket_20/file.csv`。 + +**関連項目** + +- [S3テーブル関数](s3.md) +- [S3エンジン](../../engines/table-engines/integrations/s3.md) diff --git a/docs/ja/sql-reference/table-functions/generate.md b/docs/ja/sql-reference/table-functions/generate.md new file mode 100644 index 00000000000..3af4b93b21f --- /dev/null +++ b/docs/ja/sql-reference/table-functions/generate.md @@ -0,0 +1,101 @@ +--- +slug: /ja/sql-reference/table-functions/generate +sidebar_position: 75 +sidebar_label: generateRandom +--- + +# generateRandom + +指定されたスキーマでランダムなデータを生成します。 +テストテーブルにデータを入力することができます。 +すべての型がサポートされているわけではありません。 + +``` sql +generateRandom(['name TypeName[, name TypeName]...', [, 'random_seed'[, 'max_string_length'[, 'max_array_length']]]]) +``` + +**引数** + +- `name` — 対応するカラムの名前。 +- `TypeName` — 対応するカラムの型。 +- `random_seed` — 安定した結果を得るためにランダムシードを手動で指定します。NULLの場合、シードはランダムに生成されます。 +- `max_string_length` — 生成されるすべての文字列の最大長。デフォルトは`10`。 +- `max_array_length` — 生成されるすべての配列またはマップの要素の最大数。デフォルトは`10`。 + +**戻り値** + +要求されたスキーマのテーブルオブジェクト。 + +## 使用例 + +``` sql +SELECT * FROM generateRandom('a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)', 1, 10, 2) LIMIT 3; +``` + +``` text +┌─a────────┬────────────d─┬─c──────────────────────────────────────────────────────────────────┐ +│ [77] │ -124167.6723 │ ('2061-04-17 21:59:44.573','3f72f405-ec3e-13c8-44ca-66ef335f7835') │ +│ [32,110] │ -141397.7312 │ ('1979-02-09 03:43:48.526','982486d1-5a5d-a308-e525-7bd8b80ffa73') │ +│ [68] │ -67417.0770 │ ('2080-03-12 14:17:31.269','110425e5-413f-10a6-05ba-fa6b3e929f15') │ +└──────────┴──────────────┴────────────────────────────────────────────────────────────────────┘ +``` + +```sql +CREATE TABLE random (a Array(Int8), d Decimal32(4), c Tuple(DateTime64(3), UUID)) engine=Memory; +INSERT INTO random SELECT * FROM generateRandom() LIMIT 2; +SELECT * FROM random; +``` + +```text +┌─a────────────────────────────┬────────────d─┬─c──────────────────────────────────────────────────────────────────┐ +│ [] │ 68091.8197 │ ('2037-10-02 12:44:23.368','039ecab7-81c2-45ee-208c-844e5c6c5652') │ +│ [8,-83,0,-22,65,9,-30,28,64] │ -186233.4909 │ ('2062-01-11 00:06:04.124','69563ea1-5ad1-f870-16d8-67061da0df25') │ +└──────────────────────────────┴──────────────┴────────────────────────────────────────────────────────────────────┘ +``` + +[generateRandomStructure](../../sql-reference/functions/other-functions.md#generaterandomstructure)と組み合わせる場合: + +```sql +SELECT * FROM generateRandom(generateRandomStructure(4, 101), 101) LIMIT 3; +``` + +```text +┌──────────────────c1─┬──────────────────c2─┬─c3─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─c4──────────────────────────────────────┐ +│ 1996-04-15 06:40:05 │ 33954608387.2844801 │ ['232.78.216.176','9.244.59.211','211.21.80.152','44.49.94.109','165.77.195.182','68.167.134.239','212.13.24.185','1.197.255.35','192.55.131.232'] │ 45d9:2b52:ab6:1c59:185b:515:c5b6:b781 │ +│ 2063-01-13 01:22:27 │ 36155064970.9514454 │ ['176.140.188.101'] │ c65a:2626:41df:8dee:ec99:f68d:c6dd:6b30 │ +│ 2090-02-28 14:50:56 │ 3864327452.3901373 │ ['155.114.30.32'] │ 57e9:5229:93ab:fbf3:aae7:e0e4:d1eb:86b │ +└─────────────────────┴─────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────┘ +``` + +`structure`引数がない場合(この場合、構造はランダム): + +```sql +SELECT * FROM generateRandom() LIMIT 3; +``` + +```text +┌───c1─┬─────────c2─┬─────────────────────c3─┬──────────────────────c4─┬─c5───────┐ +│ -128 │ 317300854 │ 2030-08-16 08:22:20.65 │ 1994-08-16 12:08:56.745 │ R0qgiC46 │ +│ 40 │ -744906827 │ 2059-04-16 06:31:36.98 │ 1975-07-16 16:28:43.893 │ PuH4M*MZ │ +│ -55 │ 698652232 │ 2052-08-04 20:13:39.68 │ 1998-09-20 03:48:29.279 │ │ +└──────┴────────────┴────────────────────────┴─────────────────────────┴──────────┘ +``` + +ランダムシードをランダム構造とランダムデータの両方に適用する場合: + +```sql +SELECT * FROM generateRandom(11) LIMIT 3; +``` + +```text +┌───────────────────────────────────────c1─┬─────────────────────────────────────────────────────────────────────────────c2─┬─────────────────────────────────────────────────────────────────────────────c3─┬─────────c4─┬─────────────────────────────────────────────────────────────────────────────c5─┬──────────────────────c6─┬─c7──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─c8──────────────────────────────────────┬─────────c9─┐ +│ -77422512305044606600216318673365695785 │ 636812099959807642229.503817849012019401335326013846687285151335352272727523 │ -34944452809785978175157829109276115789694605299387223845886143311647505037529 │ 544473976 │ 111220388331710079615337037674887514156741572807049614590010583571763691328563 │ 22016.22623506465 │ {'2052-01-31 20:25:33':4306400876908509081044405485378623663,'1993-04-16 15:58:49':164367354809499452887861212674772770279,'2101-08-19 03:07:18':-60676948945963385477105077735447194811,'2039-12-22 22:31:39':-59227773536703059515222628111999932330} │ a7b2:8f58:4d07:6707:4189:80cf:92f5:902d │ 1950-07-14 │ +│ -159940486888657488786004075627859832441 │ 629206527868163085099.8195700356331771569105231840157308480121506729741348442 │ -53203761250367440823323469081755775164053964440214841464405368882783634063735 │ 2187136525 │ 94881662451116595672491944222189810087991610568040618106057495823910493624275 │ 1.3095786748458954e-104 │ {} │ a051:e3da:2e0a:c69:7835:aed6:e8b:3817 │ 1943-03-25 │ +│ -5239084224358020595591895205940528518 │ -529937657954363597180.1709207212648004850138812370209091520162977548101577846 │ 47490343304582536176125359129223180987770215457970451211489086575421345731671 │ 1637451978 │ 101899445785010192893461828129714741298630410942962837910400961787305271699002 │ 2.4344456058391296e223 │ {'2013-12-22 17:42:43':80271108282641375975566414544777036006,'2041-03-08 10:28:17':169706054082247533128707458270535852845,'1986-08-31 23:07:38':-54371542820364299444195390357730624136,'2094-04-23 21:26:50':7944954483303909347454597499139023465} │ 1293:a726:e899:9bfc:8c6f:2aa1:22c9:b635 │ 1924-11-20 │ +└──────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┴────────────┴────────────────────────────────────────────────────────────────────────────────┴─────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────┴────────────┘ +``` + +**注意:** `generateRandom(generateRandomStructure(), [random seed], max_string_length, max_array_length)` で十分大きな `max_array_length` を指定すると、複合型 (`Array`, `Tuple`, `Map`, `Nested`) の最大ネスト深度 (16まで) により非常に大きな出力が生成されることがあります。 + +## 関連コンテンツ +- ブログ: [ClickHouseでランダムデータを生成する](https://clickhouse.com/blog/generating-random-test-distribution-data-for-clickhouse) diff --git a/docs/ja/sql-reference/table-functions/generateSeries.md b/docs/ja/sql-reference/table-functions/generateSeries.md new file mode 100644 index 00000000000..e0501458681 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/generateSeries.md @@ -0,0 +1,8 @@ +--- +slug: /ja/sql-reference/table-functions/generateSeries +sidebar_position: 147 +sidebar_label: generateSeries +--- + +### 別名 +[generate_series](generate_series.md) diff --git a/docs/ja/sql-reference/table-functions/generate_series.md b/docs/ja/sql-reference/table-functions/generate_series.md new file mode 100644 index 00000000000..b82ecc3ec1d --- /dev/null +++ b/docs/ja/sql-reference/table-functions/generate_series.md @@ -0,0 +1,25 @@ +--- +slug: /ja/sql-reference/table-functions/generate_series +sidebar_position: 146 +sidebar_label: generate_series +--- + +# generate_series + +`generate_series(START, STOP)` - 開始から停止までの整数を含む単一の 'generate_series' カラム (UInt64) を持つテーブルを返します。 + +`generate_series(START, STOP, STEP)` - 開始から停止までの整数を含む単一の 'generate_series' カラム (UInt64) を持つテーブルを、指定されたステップ間隔で返します。 + +以下のクエリは、異なるカラム名を持ちながらも同じ内容のテーブルを返します。 + +``` sql +SELECT * FROM numbers(10, 5); +SELECT * FROM generate_series(10, 14); +``` + +また、以下のクエリも異なるカラム名で同じ内容のテーブルを返しますが、二番目のオプションの方が効率的です。 + +``` sql +SELECT * FROM numbers(10, 11) WHERE number % 3 == (10 % 3); +SELECT * FROM generate_series(10, 20, 3); +``` diff --git a/docs/ja/sql-reference/table-functions/hdfs.md b/docs/ja/sql-reference/table-functions/hdfs.md new file mode 100644 index 00000000000..3a56b2c3673 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/hdfs.md @@ -0,0 +1,125 @@ +--- +slug: /ja/sql-reference/table-functions/hdfs +sidebar_position: 80 +sidebar_label: hdfs +--- + +# hdfs + +HDFS内のファイルからテーブルを作成します。このテーブル関数は、[url](../../sql-reference/table-functions/url.md)や[file](../../sql-reference/table-functions/file.md)の関数と似ています。 + +``` sql +hdfs(URI, format, structure) +``` + +**入力パラメータ** + +- `URI` — HDFS内のファイルへの相対URIです。ファイルパスは読み取り専用モードで以下のグロブをサポートしています: `*`, `?`, `{abc,def}` および `{N..M}` ただし `N`, `M` は数字で、`'abc', 'def'` は文字列です。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)です。 +- `structure` — テーブルの構造です。フォーマットは `'column1_name column1_type, column2_name column2_type, ...'` です。 + +**返される値** + +指定されたファイル内のデータを読み書きできるようにした、指定された構造を持つテーブルです。 + +**例** + +`hdfs://hdfs1:9000/test` からテーブルを取得し、そのテーブルから最初の二行を選択します: + +``` sql +SELECT * +FROM hdfs('hdfs://hdfs1:9000/test', 'TSV', 'column1 UInt32, column2 UInt32, column3 UInt32') +LIMIT 2 +``` + +``` text +┌─column1─┬─column2─┬─column3─┐ +│ 1 │ 2 │ 3 │ +│ 3 │ 2 │ 1 │ +└─────────┴─────────┴─────────┘ +``` + +## パスのグロブ {#globs_in_path} + +パスはグロブ化を使用することができます。ファイルはパスパターン全体と一致する必要があり、接尾辞や接頭辞だけに一致するものではありません。 + +- `*` — `/` を除く任意の文字列を表しますが、空の文字列も含みます。 +- `**` — フォルダ内のすべてのファイルを再帰的に表します。 +- `?` — 任意の1文字を表します。 +- `{some_string,another_string,yet_another_one}` — 文字列 `'some_string', 'another_string', 'yet_another_one'` のいずれかを代用します。文字列には `/` 記号を含めることができます。 +- `{N..M}` — 任意の数値 `>= N` かつ `<= M` を表します。 + +`{}` を使用した構造は、[remote](remote.md) および [file](file.md) テーブル関数に似ています。 + +**例** + +1. 以下のURIを持つ複数のファイルがHDFSに存在するとします: + +- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ + +2. これらのファイル内の行数をクエリします: + + + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32') +``` + +3. これら二つのディレクトリのすべてのファイル内の行数をクエリします: + + + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV', 'name String, value UInt32') +``` + +:::note +ファイルのリストに先頭ゼロ付きの数値範囲が含まれる場合、各桁ごとに波括弧を使用するか、`?` を使用してください。 +::: + +**例** + +`file000`, `file001`, ... , `file999` と名付けられたファイルからデータをクエリします: + +``` sql +SELECT count(*) +FROM hdfs('hdfs://hdfs1:9000/big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32') +``` + +## バーチャルカラム + +- `_path` — ファイルのパス。タイプ: `LowCardinalty(String)`。 +- `_file` — ファイル名。タイプ: `LowCardinalty(String)`。 +- `_size` — ファイルのサイズ(バイト単位)。タイプ: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL` です。 +- `_time` — ファイルの最終更新日時。タイプ: `Nullable(DateTime)`。日時が不明な場合、値は `NULL` です。 + +## Hiveスタイルのパーティショニング {#hive-style-partitioning} + +`use_hive_partitioning` を1に設定すると、ClickHouseはパス内の Hiveスタイルのパーティショニング (`/name=value/`) を検出し、クエリ内でパーティションカラムをバーチャルカラムとして使用できるようになります。これらのバーチャルカラムは、パーティション化されたパス内のカラムと同じ名前ですが、`_`で始まります。 + +**例** + +Hiveスタイルのパーティショニングで作成されたバーチャルカラムを使用します + +``` sql +SET use_hive_partitioning = 1; +SELECT * from HDFS('hdfs://hdfs1:9000/data/path/date=*/country=*/code=*/*.parquet') where _date > '2020-01-01' and _country = 'Netherlands' and _code = 42; +``` + +## ストレージ設定 {#storage-settings} + +- [hdfs_truncate_on_insert](/docs/ja/operations/settings/settings.md#hdfs_truncate_on_insert) - 挿入前にファイルを切り詰めることを許可します。デフォルトでは無効です。 +- [hdfs_create_new_file_on_insert](/docs/ja/operations/settings/settings.md#hdfs_create_new_file_on_insert) - フォーマットに接尾辞がある場合、挿入ごとに新しいファイルを作成します。デフォルトでは無効です。 +- [hdfs_skip_empty_files](/docs/ja/operations/settings/settings.md#hdfs_skip_empty_files) - 読み取り中に空のファイルをスキップすることを許可します。デフォルトでは無効です。 +- [ignore_access_denied_multidirectory_globs](/docs/ja/operations/settings/settings.md#ignore_access_denied_multidirectory_globs) - マルチディレクトリグロブに対して許可拒否エラーを無視することを許可します。 + +**関連項目** + +- [バーチャルカラム](../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/ja/sql-reference/table-functions/hdfsCluster.md b/docs/ja/sql-reference/table-functions/hdfsCluster.md new file mode 100644 index 00000000000..a21aaaea4e7 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/hdfsCluster.md @@ -0,0 +1,60 @@ +--- +slug: /ja/sql-reference/table-functions/hdfsCluster +sidebar_position: 81 +sidebar_label: hdfsCluster +--- + +# hdfsCluster テーブル関数 + +指定されたクラスタ内の複数のノードからHDFSのファイルを並行して処理できるようにします。イニシエータではクラスタ内のすべてのノードに接続を作成し、HDFSファイルパスのアスタリスクを展開し、各ファイルを動的に配分します。ワーカーノードでは、次に処理すべきタスクをイニシエータに問い合わせ、それを処理します。すべてのタスクが完了するまでこのプロセスを繰り返します。 + +**構文** + +``` sql +hdfsCluster(cluster_name, URI, format, structure) +``` + +**引数** + +- `cluster_name` — リモートおよびローカルサーバーへのアドレスと接続パラメータのセットを構築するために使用されるクラスタの名前。 +- `URI` — ファイルまたは複数のファイルへのURI。読み取り専用モードで次のワイルドカードをサポートします: `*`, `**`, `?`, `{'abc','def'}` および `{N..M}` ここで `N`, `M` — 数値, `abc`, `def` — 文字列。詳細は[パス内のワイルドカード](../../engines/table-engines/integrations/s3.md#wildcards-in-path)を参照してください。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。 +- `structure` — テーブルの構造。形式 `'column1_name column1_type, column2_name column2_type, ...'`。 + +**返される値** + +指定されたファイル内のデータを読み取るための指定された構造を持つテーブル。 + +**例** + +1. `cluster_simple` という名前のClickHouseクラスタがあり、HDFSに以下のURIを持つ複数のファイルがあるとします: + +- ‘hdfs://hdfs1:9000/some_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/some_dir/some_file_3’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_1’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_2’ +- ‘hdfs://hdfs1:9000/another_dir/some_file_3’ + +2. これらのファイルに含まれる行の数をクエリします: + +``` sql +SELECT count(*) +FROM hdfsCluster('cluster_simple', 'hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32') +``` + +3. これら2つのディレクトリ内のすべてのファイルの行数をクエリします: + +``` sql +SELECT count(*) +FROM hdfsCluster('cluster_simple', 'hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV', 'name String, value UInt32') +``` + +:::note +ファイルのリストに先頭ゼロが付いた数値範囲が含まれている場合、各桁を個別に中括弧で囲むか、`?` を使用します。 +::: + +**参照** + +- [HDFS エンジン](../../engines/table-engines/integrations/hdfs.md) +- [HDFS テーブル関数](../../sql-reference/table-functions/hdfs.md) diff --git a/docs/ja/sql-reference/table-functions/hudi.md b/docs/ja/sql-reference/table-functions/hudi.md new file mode 100644 index 00000000000..222477a0b6c --- /dev/null +++ b/docs/ja/sql-reference/table-functions/hudi.md @@ -0,0 +1,31 @@ +--- +slug: /ja/sql-reference/table-functions/hudi +sidebar_position: 85 +sidebar_label: hudi +--- + +# hudi テーブル関数 + +Amazon S3 にある Apache [Hudi](https://hudi.apache.org/) テーブルに対して、読み取り専用のテーブルライクなインターフェースを提供します。 + +## 構文 + +``` sql +hudi(url [,aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression]) +``` + +## 引数 + +- `url` — S3 に存在する Hudi テーブルへのパスを含むバケットの URL。 +- `aws_access_key_id`, `aws_secret_access_key` - [AWS](https://aws.amazon.com/) アカウントユーザーの長期的なクレデンシャル。これを使用してリクエストを認証することができます。これらのパラメータはオプションです。クレデンシャルが指定されていない場合、ClickHouse の設定から使用されます。詳細については、[S3 をデータストレージとして使用する](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)を参照してください。 +- `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +- `structure` — テーブルの構造。形式は `'column1_name column1_type, column2_name column2_type, ...'`。 +- `compression` — このパラメータはオプションです。サポートされている値は: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮が自動検出されます。 + +**返される値** + +指定された S3 上の Hudi テーブル内のデータを読み取るための、指定された構造のテーブル。 + +**関連項目** + +- [Hudi エンジン](/docs/ja/engines/table-engines/integrations/hudi.md) diff --git a/docs/ja/sql-reference/table-functions/iceberg.md b/docs/ja/sql-reference/table-functions/iceberg.md new file mode 100644 index 00000000000..c8706962683 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/iceberg.md @@ -0,0 +1,74 @@ +--- +slug: /ja/sql-reference/table-functions/iceberg +sidebar_position: 90 +sidebar_label: iceberg +--- + +# iceberg テーブル関数 + +Amazon S3、Azure、HDFS、またはローカルに保存されたApache [Iceberg](https://iceberg.apache.org/) テーブルに対して、読み取り専用のテーブルライクなインターフェースを提供します。 + +## 構文 + +``` sql +icebergS3(url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,compression_method]) +icebergS3(named_collection[, option=value [,..]]) + +icebergAzure(connection_string|storage_account_url, container_name, blobpath, [,account_name], [,account_key] [,format] [,compression_method]) +icebergAzure(named_collection[, option=value [,..]]) + +icebergHDFS(path_to_table, [,format] [,compression_method]) +icebergHDFS(named_collection[, option=value [,..]]) + +icebergLocal(path_to_table, [,format] [,compression_method]) +icebergLocal(named_collection[, option=value [,..]]) +``` + +## 引数 + +引数の説明は、テーブル関数 `s3`、`azureBlobStorage`、`HDFS`、および `file` 内の引数の説明と一致します。 +`format` は Iceberg テーブル内のデータファイルのフォーマットを表します。 + +**返される値** +指定された Iceberg テーブル内のデータを読み込むための、指定された構造を持つテーブル。 + +**例** + +```sql +SELECT * FROM icebergS3('http://test.s3.amazonaws.com/clickhouse-bucket/test_table', 'test', 'test') +``` + +:::important +ClickHouse は現在、`icebergS3`、`icebergAzure`、`icebergHDFS`、`icebergLocal` テーブル関数と `IcebergS3`、`icebergAzure`、`IcebergHDFS`、`IcebergLocal` テーブルエンジンを通じて、Iceberg フォーマットの v1 および v2 の読み取りをサポートしています。 +::: + +## 名前付きコレクションの定義 + +URLと資格情報を保存するための名前付きコレクションの設定例を次に示します: + +```xml + + + + http://test.s3.amazonaws.com/clickhouse-bucket/ + test + test + auto + auto + + + +``` + +```sql +SELECT * FROM icebergS3(iceberg_conf, filename = 'test_table') +DESCRIBE icebergS3(iceberg_conf, filename = 'test_table') +``` + +**エイリアス** + +テーブル関数 `iceberg` は現在 `icebergS3` のエイリアスです。 + +**関連項目** + +- [Iceberg エンジン](/docs/ja/engines/table-engines/integrations/iceberg.md) diff --git a/docs/ja/sql-reference/table-functions/index.md b/docs/ja/sql-reference/table-functions/index.md new file mode 100644 index 00000000000..161fd55ffff --- /dev/null +++ b/docs/ja/sql-reference/table-functions/index.md @@ -0,0 +1,25 @@ +--- +slug: /ja/sql-reference/table-functions/ +sidebar_label: テーブル関数 +sidebar_position: 1 +--- + +# テーブル関数 + +テーブル関数は、テーブルを構築するための方法です。 + +テーブル関数は以下で使用できます: + +- `SELECT` クエリの [FROM](../../sql-reference/statements/select/from.md) 句。 + + 現在のクエリ内でのみ使用可能な一時テーブルを作成する方法です。クエリが終了するとテーブルは削除されます。 + +- [CREATE TABLE AS table_function()](../../sql-reference/statements/create/table.md) クエリ。 + + テーブルを作成する方法の一つです。 + +- [INSERT INTO TABLE FUNCTION](../../sql-reference/statements/insert-into.md#inserting-into-table-function) クエリ。 + +:::note +[allow_ddl](../../operations/settings/permissions-for-queries.md#settings_allow_ddl) 設定が無効の場合、テーブル関数を使用することはできません。 +::: diff --git a/docs/ja/sql-reference/table-functions/input.md b/docs/ja/sql-reference/table-functions/input.md new file mode 100644 index 00000000000..1288ca31549 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/input.md @@ -0,0 +1,38 @@ +--- +slug: /ja/sql-reference/table-functions/input +sidebar_position: 95 +sidebar_label: input +--- + +# input + +`input(structure)` - 指定された構造でサーバーに送信されたデータを別の構造のテーブルに効率的に変換し、挿入するためのテーブル関数です。 + +`structure` - サーバーに送信されるデータの構造を次の形式で指定します: `'column1_name column1_type, column2_name column2_type, ...'`。 +例えば、`'id UInt32, name String'`。 + +この関数は`INSERT SELECT`クエリでのみ使用でき、一度しか使用できませんが、それ以外は通常のテーブル関数のように動作します +(例えば、サブクエリで使用することができます)。 + +データは通常の`INSERT`クエリのように任意の方法で送信でき、クエリの最後に指定する必要がある任意の利用可能な[形式](../../interfaces/formats.md#formats)で渡すことができます(通常の`INSERT SELECT`とは異なります)。 + +この関数の主な機能は、サーバーがクライアントからデータを受信すると、`SELECT`句の式リストに従って同時に変換し、ターゲットテーブルに挿入することです。すべての転送データを格納する一時テーブルは作成されません。 + +**例** + +- `test`テーブルが次の構造`(a String, b String)`を持ち、`data.csv`のデータが異なる構造`(col1 String, col2 Date, col3 Int32)`を持っているとします。この場合、`data.csv`から`test`テーブルにデータを同時に変換して挿入するクエリは次のようになります: + + + +``` bash +$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV"; +``` + +- `data.csv`にテーブル`test`と同じ構造`test_structure`のデータが含まれている場合、これら二つのクエリは同等です: + + + +``` bash +$ cat data.csv | clickhouse-client --query="INSERT INTO test FORMAT CSV" +$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT * FROM input('test_structure') FORMAT CSV" +``` diff --git a/docs/ja/sql-reference/table-functions/jdbc.md b/docs/ja/sql-reference/table-functions/jdbc.md new file mode 100644 index 00000000000..b4e98fa9818 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/jdbc.md @@ -0,0 +1,43 @@ +--- +slug: /ja/sql-reference/table-functions/jdbc +sidebar_position: 100 +sidebar_label: jdbc +--- + +# jdbc + +:::note +clickhouse-jdbc-bridge はエクスペリメンタルなコードを含み、もはやサポートされていません。信頼性の問題やセキュリティの脆弱性を含む可能性があります。使用は自己責任で行ってください。 +ClickHouse は、クリックハウス内の組み込みテーブル関数の使用を推奨します。これにより、アドホックなクエリシナリオ(Postgres、MySQL、MongoDB など)のためのより良い代替手段を提供します。 +::: + +`jdbc(datasource, schema, table)` - JDBC ドライバーを介して接続されるテーブルを返します。 + +このテーブル関数は、別途 [clickhouse-jdbc-bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge) プログラムの実行が必要です。 +Nullable 型のサポート(クエリされたリモートテーブルの DDL に基づいて)も提供されています。 + +**例** + +``` sql +SELECT * FROM jdbc('jdbc:mysql://localhost:3306/?user=root&password=root', 'schema', 'table') +``` + +``` sql +SELECT * FROM jdbc('mysql://localhost:3306/?user=root&password=root', 'select * from schema.table') +``` + +``` sql +SELECT * FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') +``` + +``` sql +SELECT * +FROM jdbc('mysql-dev?p1=233', 'num Int32', 'select toInt32OrZero(''{{p1}}'') as num') +``` + +``` sql +SELECT a.datasource AS server1, b.datasource AS server2, b.name AS db +FROM jdbc('mysql-dev?datasource_column', 'show databases') a +INNER JOIN jdbc('self?datasource_column', 'show databases') b ON a.Database = b.name +``` + diff --git a/docs/ja/sql-reference/table-functions/loop.md b/docs/ja/sql-reference/table-functions/loop.md new file mode 100644 index 00000000000..8249bf1af01 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/loop.md @@ -0,0 +1,55 @@ +# loop + +**構文** + +``` sql +SELECT ... FROM loop(database, table); +SELECT ... FROM loop(database.table); +SELECT ... FROM loop(table); +SELECT ... FROM loop(other_table_function(...)); +``` + +**パラメータ** + +- `database` — データベース名。 +- `table` — テーブル名。 +- `other_table_function(...)` — 他のテーブル関数。 + 例: `SELECT * FROM loop(numbers(10));` + `other_table_function(...)` ここでは `numbers(10)`。 + +**返される値** + +クエリの結果を返すための無限ループ。 + +**例** + +ClickHouseからデータを選択する: + +``` sql +SELECT * FROM loop(test_database, test_table); +SELECT * FROM loop(test_database.test_table); +SELECT * FROM loop(test_table); +``` + +または他のテーブル関数を使用する場合: + +``` sql +SELECT * FROM loop(numbers(3)) LIMIT 7; + ┌─number─┐ +1. │ 0 │ +2. │ 1 │ +3. │ 2 │ + └────────┘ + ┌─number─┐ +4. │ 0 │ +5. │ 1 │ +6. │ 2 │ + └────────┘ + ┌─number─┐ +7. │ 0 │ + └────────┘ +``` +``` sql +SELECT * FROM loop(mysql('localhost:3306', 'test', 'test', 'user', 'password')); +... +``` diff --git a/docs/ja/sql-reference/table-functions/merge.md b/docs/ja/sql-reference/table-functions/merge.md new file mode 100644 index 00000000000..af9e9949443 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/merge.md @@ -0,0 +1,27 @@ +--- +slug: /ja/sql-reference/table-functions/merge +sidebar_position: 130 +sidebar_label: merge +--- + +# merge + +一時的な[Merge](../../engines/table-engines/special/merge.md)テーブルを作成します。テーブルの構造は、正規表現に一致する最初のテーブルから取得されます。 + +**構文** + +```sql +merge(['db_name',] 'tables_regexp') +``` +**引数** + +- `db_name` — 以下のような値が可能です(オプション、デフォルトは`currentDatabase()`): + - データベース名、 + - データベース名を文字列として返す定数式、例えば`currentDatabase()`、 + - `REGEXP(expression)`、ここで`expression`はDB名に一致させるための正規表現です。 + +- `tables_regexp` — 指定されたDBまたはDB群でテーブル名と一致させるための正規表現。 + +**関連項目** + +- [Merge](../../engines/table-engines/special/merge.md)テーブルエンジン diff --git a/docs/ja/sql-reference/table-functions/mergeTreeIndex.md b/docs/ja/sql-reference/table-functions/mergeTreeIndex.md new file mode 100644 index 00000000000..295680fe589 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/mergeTreeIndex.md @@ -0,0 +1,83 @@ +--- +slug: /ja/sql-reference/table-functions/mergeTreeIndex +sidebar_position: 77 +sidebar_label: mergeTreeIndex +--- + +# mergeTreeIndex + +MergeTreeテーブルのインデックスとマークファイルの内容を表します。これは調査のために使用できます。 + +``` sql +mergeTreeIndex(database, table, [with_marks = true]) +``` + +**引数** + +- `database` - インデックスとマークを読み取るためのデータベース名。 +- `table` - インデックスとマークを読み取るためのテーブル名。 +- `with_marks` - 結果にマークを含むカラムを含めるかどうか。 + +**返される値** + +ソーステーブルの主キーの値を持つカラム、ソーステーブルのデータパーツ内のすべての可能なファイルに対するマークの値を持つカラム(有効な場合)および仮想カラムを持つテーブルオブジェクト: + +- `part_name` - データパーツの名前。 +- `mark_number` - データパーツ内の現在のマークの番号。 +- `rows_in_granule` - 現在のグラニュール内の行数。 + +マークのカラムは、カラムがデータパーツに存在しない場合や、そのサブストリームのマークが書き込まれていない場合(例:コンパクトパーツ)に`(NULL, NULL)`の値を含むことがあります。 + +## 使用例 + +```sql +CREATE TABLE test_table +( + `id` UInt64, + `n` UInt64, + `arr` Array(UInt64) +) +ENGINE = MergeTree +ORDER BY id +SETTINGS index_granularity = 3, min_bytes_for_wide_part = 0, min_rows_for_wide_part = 8; + +INSERT INTO test_table SELECT number, number, range(number % 5) FROM numbers(5); + +INSERT INTO test_table SELECT number, number, range(number % 5) FROM numbers(10, 10); +``` + +```sql +SELECT * FROM mergeTreeIndex(currentDatabase(), test_table, with_marks = true); +``` + +```text +┌─part_name─┬─mark_number─┬─rows_in_granule─┬─id─┬─id.mark─┬─n.mark──┬─arr.size0.mark─┬─arr.mark─┐ +│ all_1_1_0 │ 0 │ 3 │ 0 │ (0,0) │ (42,0) │ (NULL,NULL) │ (84,0) │ +│ all_1_1_0 │ 1 │ 2 │ 3 │ (133,0) │ (172,0) │ (NULL,NULL) │ (211,0) │ +│ all_1_1_0 │ 2 │ 0 │ 4 │ (271,0) │ (271,0) │ (NULL,NULL) │ (271,0) │ +└───────────┴─────────────┴─────────────────┴────┴─────────┴─────────┴────────────────┴──────────┘ +┌─part_name─┬─mark_number─┬─rows_in_granule─┬─id─┬─id.mark─┬─n.mark─┬─arr.size0.mark─┬─arr.mark─┐ +│ all_2_2_0 │ 0 │ 3 │ 10 │ (0,0) │ (0,0) │ (0,0) │ (0,0) │ +│ all_2_2_0 │ 1 │ 3 │ 13 │ (0,24) │ (0,24) │ (0,24) │ (0,24) │ +│ all_2_2_0 │ 2 │ 3 │ 16 │ (0,48) │ (0,48) │ (0,48) │ (0,80) │ +│ all_2_2_0 │ 3 │ 1 │ 19 │ (0,72) │ (0,72) │ (0,72) │ (0,128) │ +│ all_2_2_0 │ 4 │ 0 │ 19 │ (0,80) │ (0,80) │ (0,80) │ (0,160) │ +└───────────┴─────────────┴─────────────────┴────┴─────────┴────────┴────────────────┴──────────┘ +``` + +```sql +DESCRIBE mergeTreeIndex(currentDatabase(), test_table, with_marks = true) SETTINGS describe_compact_output = 1; +``` + +```text +┌─name────────────┬─type─────────────────────────────────────────────────────────────────────────────────────────────┐ +│ part_name │ String │ +│ mark_number │ UInt64 │ +│ rows_in_granule │ UInt64 │ +│ id │ UInt64 │ +│ id.mark │ Tuple(offset_in_compressed_file Nullable(UInt64), offset_in_decompressed_block Nullable(UInt64)) │ +│ n.mark │ Tuple(offset_in_compressed_file Nullable(UInt64), offset_in_decompressed_block Nullable(UInt64)) │ +│ arr.size0.mark │ Tuple(offset_in_compressed_file Nullable(UInt64), offset_in_decompressed_block Nullable(UInt64)) │ +│ arr.mark │ Tuple(offset_in_compressed_file Nullable(UInt64), offset_in_decompressed_block Nullable(UInt64)) │ +└─────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/table-functions/mongodb.md b/docs/ja/sql-reference/table-functions/mongodb.md new file mode 100644 index 00000000000..3cd3e3f6b01 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/mongodb.md @@ -0,0 +1,104 @@ +--- +slug: /ja/sql-reference/table-functions/mongodb +sidebar_position: 135 +sidebar_label: mongodb +--- + +# mongodb + +リモートのMongoDBサーバーに保存されているデータに対して`SELECT`クエリを実行することができます。 + +**構文** + +``` sql +mongodb(host:port, database, collection, user, password, structure [, options]) +``` + +**引数** + +- `host:port` — MongoDBサーバーのアドレス。 + +- `database` — リモートデータベース名。 + +- `collection` — リモートコレクション名。 + +- `user` — MongoDBユーザー。 + +- `password` — ユーザーパスワード。 + +- `structure` - この関数から返されるClickHouseテーブルのスキーマ。 + +- `options` - MongoDB接続文字列オプション(オプションのパラメータ)。 + +:::tip +MongoDB Atlasクラウドを使用している場合、次のオプションを追加してください: + +``` +'connectTimeoutMS=10000&ssl=true&authSource=admin' +``` + +::: + +また、URIで接続することもできます: +``` sql +mongodb(uri, collection, structure) +``` +**引数** + +- `uri` — 接続文字列。 + +- `collection` — リモートコレクション名。 + +- `structure` — この関数から返されるClickHouseテーブルのスキーマ。 + +**返される値** + +MongoDBのオリジナルテーブルと同じカラムを持つテーブルオブジェクト。 + + +**例** + +MongoDBデータベース`test`に定義されているコレクション`my_collection`があり、そこにいくつかのドキュメントを挿入するとします: + +```sql +db.createUser({user:"test_user",pwd:"password",roles:[{role:"readWrite",db:"test"}]}) + +db.createCollection("my_collection") + +db.my_collection.insertOne( + { log_type: "event", host: "120.5.33.9", command: "check-cpu-usage -w 75 -c 90" } +) + +db.my_collection.insertOne( + { log_type: "event", host: "120.5.33.4", command: "system-check"} +) +``` + +このコレクションを`mongodb`テーブル関数を使ってクエリしてみましょう: + +```sql +SELECT * FROM mongodb( + '127.0.0.1:27017', + 'test', + 'my_collection', + 'test_user', + 'password', + 'log_type String, host String, command String', + 'connectTimeoutMS=10000' +) +``` + +または: + +```sql +SELECT * FROM mongodb( + 'mongodb://test_user:password@127.0.0.1:27017/test?connectionTimeoutMS=10000', + 'my_collection', + 'log_type String, host String, command String' +) +``` + +**関連項目** + +- [MongoDBテーブルエンジン](/docs/ja/engines/table-engines/integrations/mongodb.md) +- [DictionaryソースとしてのMongoDBの利用](/docs/ja/sql-reference/dictionaries/index.md#mongodb) diff --git a/docs/ja/sql-reference/table-functions/mysql.md b/docs/ja/sql-reference/table-functions/mysql.md new file mode 100644 index 00000000000..2f4eea75614 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/mysql.md @@ -0,0 +1,143 @@ +--- +slug: /ja/sql-reference/table-functions/mysql +sidebar_position: 137 +sidebar_label: mysql +--- + +# mysql + +リモートのMySQLサーバーに保存されているデータに対して`SELECT`および`INSERT`クエリを実行できるようにします。 + +**構文** + +``` sql +mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]}) +``` + +**パラメーター** + +- `host:port` — MySQLサーバーのアドレス。 +- `database` — リモートデータベース名。 +- `table` — リモートテーブル名。 +- `user` — MySQLユーザー。 +- `password` — ユーザーパスワード。 +- `replace_query` — `INSERT INTO`クエリを`REPLACE INTO`に変換するフラグ。可能な値: + - `0` - クエリは`INSERT INTO`として実行されます。 + - `1` - クエリは`REPLACE INTO`として実行されます。 +- `on_duplicate_clause` — `ON DUPLICATE KEY on_duplicate_clause`が`INSERT`クエリに追加されます。`replace_query = 0`の場合にのみ指定できます(`replace_query = 1`と`on_duplicate_clause`を同時に渡すと、ClickHouseは例外を生成します)。 + 例: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;` + ここでの`on_duplicate_clause`は`UPDATE c2 = c2 + 1`です。`ON DUPLICATE KEY`句で使用できる`on_duplicate_clause`については、MySQLのドキュメントを参照してください。 + +引数は、[named collections](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`host`と`port`は別々に指定する必要があります。このアプローチは、本番環境で推奨されます。 + +現在、`=, !=, >, >=, <, <=`のようなシンプルな`WHERE`句はMySQLサーバー上で実行されます。 + +残りの条件と`LIMIT`のサンプリング制約は、MySQLへのクエリが終了した後にClickHouseでのみ実行されます。 + +複数のレプリカをサポートしており、`|`でリストする必要があります。例: + +```sql +SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password'); +``` + +または + +```sql +SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password'); +``` + +**返される値** + +元のMySQLテーブルと同じカラムを持つテーブルオブジェクト。 + +:::note +テーブル関数`mysql(...)`をカラム名のリストを持つテーブル名と区別するためには、`INSERT`クエリでキーワード`FUNCTION`または`TABLE FUNCTION`を使用する必要があります。以下の例を参照してください。 +::: + +**例** + +MySQLでのテーブル: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `float` FLOAT NOT NULL, + -> PRIMARY KEY (`int_id`)); + +mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2); + +mysql> SELECT * FROM test; ++--------+-------+ +| int_id | float | ++--------+-------+ +| 1 | 2 | ++--------+-------+ +``` + +ClickHouseからのデータ選択: + +``` sql +SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123'); +``` + +または[named collections](/docs/ja/operations/named-collections.md)を使用して: + +```sql +CREATE NAMED COLLECTION creds AS + host = 'localhost', + port = 3306, + database = 'test', + user = 'bayonet', + password = '123'; +SELECT * FROM mysql(creds, table='test'); +``` + +``` text +┌─int_id─┬─float─┐ +│ 1 │ 2 │ +└────────┴───────┘ +``` + +置換と挿入: + +```sql +INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3); +INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4); +SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123'); +``` + +``` text +┌─int_id─┬─float─┐ +│ 1 │ 3 │ +│ 2 │ 4 │ +└────────┴───────┘ +``` + +MySQLテーブルからClickHouseテーブルへのデータコピー: + +```sql +CREATE TABLE mysql_copy +( + `id` UInt64, + `datetime` DateTime('UTC'), + `description` String, +) +ENGINE = MergeTree +ORDER BY (id,datetime); + +INSERT INTO mysql_copy +SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password'); +``` + +または、現在の最大IDに基づいてMySQLからのインクリメンタルバッチのみをコピーする場合: + +```sql +INSERT INTO mysql_copy +SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password') +WHERE id > (SELECT max(id) from mysql_copy); +``` + +**関連項目** + +- [MySQLテーブルエンジン](../../engines/table-engines/integrations/mysql.md) +- [MySQLをDictionaryソースとして使用する](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-mysql) diff --git a/docs/ja/sql-reference/table-functions/null.md b/docs/ja/sql-reference/table-functions/null.md new file mode 100644 index 00000000000..10ec674fe8f --- /dev/null +++ b/docs/ja/sql-reference/table-functions/null.md @@ -0,0 +1,42 @@ +--- +slug: /ja/sql-reference/table-functions/null +sidebar_position: 140 +sidebar_label: null 関数 +title: 'null' +--- + +指定された構造の一時テーブルを [Null](../../engines/table-engines/special/null.md) テーブルエンジンで作成します。`Null` エンジンの特性により、テーブルデータは無視され、クエリの実行後すぐにテーブル自体が削除されます。この関数は、テストやデモンストレーションを行う際の利便性のために使用されます。 + +**構文** + +``` sql +null('structure') +``` + +**パラメータ** + +- `structure` — カラムとカラムタイプのリスト。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +指定された構造を持つ一時的な `Null` エンジンテーブル。 + +**例** + +`null` 関数を使用したクエリ: + +``` sql +INSERT INTO function null('x UInt64') SELECT * FROM numbers_mt(1000000000); +``` +は次の三つのクエリを置き換えることができます: + +```sql +CREATE TABLE t (x UInt64) ENGINE = Null; +INSERT INTO t SELECT * FROM numbers_mt(1000000000); +DROP TABLE IF EXISTS t; +``` + +関連項目: + +- [Null テーブルエンジン](../../engines/table-engines/special/null.md) + diff --git a/docs/ja/sql-reference/table-functions/numbers.md b/docs/ja/sql-reference/table-functions/numbers.md new file mode 100644 index 00000000000..278284d702a --- /dev/null +++ b/docs/ja/sql-reference/table-functions/numbers.md @@ -0,0 +1,38 @@ +--- +slug: /ja/sql-reference/table-functions/numbers +sidebar_position: 145 +sidebar_label: numbers +--- + +# numbers + +`numbers(N)` – 0 から N-1 までの整数を含む単一の「number」カラム (UInt64) を持つテーブルを返します。 +`numbers(N, M)` - N から (N + M - 1) までの整数を含む単一の「number」カラム (UInt64) を持つテーブルを返します。 +`numbers(N, M, S)` - N から (N + M - 1) までの整数をステップ S で含む単一の「number」カラム (UInt64) を持つテーブルを返します。 + +`system.numbers` テーブルに類似しており、テストや連続する値の生成に使用できますが、`numbers(N, M)` の方が `system.numbers` よりも効率的です。 + +以下のクエリは同等です: + +``` sql +SELECT * FROM numbers(10); +SELECT * FROM numbers(0, 10); +SELECT * FROM system.numbers LIMIT 10; +SELECT * FROM system.numbers WHERE number BETWEEN 0 AND 9; +SELECT * FROM system.numbers WHERE number IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); +``` + +そして、以下のクエリも同等です: + +``` sql +SELECT number * 2 FROM numbers(10); +SELECT (number - 10) * 2 FROM numbers(10, 10); +SELECT * FROM numbers(0, 20, 2); +``` + +例: + +``` sql +-- 2010-01-01 から 2010-12-31 までの日付のシーケンスを生成 +select toDate('2010-01-01') + number as d FROM numbers(365); +``` diff --git a/docs/ja/sql-reference/table-functions/odbc.md b/docs/ja/sql-reference/table-functions/odbc.md new file mode 100644 index 00000000000..3120b610ceb --- /dev/null +++ b/docs/ja/sql-reference/table-functions/odbc.md @@ -0,0 +1,105 @@ +--- +slug: /ja/sql-reference/table-functions/odbc +sidebar_position: 150 +sidebar_label: odbc +--- + +# odbc + +[ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity)を介して接続されたテーブルを返します。 + +``` sql +odbc(connection_settings, external_database, external_table) +``` + +パラメータ: + +- `connection_settings` — `odbc.ini`ファイル内の接続設定が書かれたセクションの名前。 +- `external_database` — 外部DBMSのデータベース名。 +- `external_table` — `external_database`内のテーブル名。 + +ODBC接続を安全に実装するために、ClickHouseは別のプログラム `clickhouse-odbc-bridge` を使用します。ODBCドライバーを直接`clickhouse-server`からロードすると、ドライバーの問題がClickHouseサーバーをクラッシュさせる可能性があります。必要に応じて、ClickHouseは自動的に`clickhouse-odbc-bridge`を起動します。このODBCブリッジプログラムは`clickhouse-server`と同じパッケージからインストールされます。 + +外部テーブルから`NULL`値を持つフィールドは、基本データ型のデフォルト値に変換されます。例えば、リモートのMySQLテーブルフィールドが`INT NULL`型である場合、0(ClickHouseの`Int32`データ型のデフォルト値)に変換されます。 + +## 使用例 + +**ODBCを介してローカルのMySQLインストールからデータを取得** + +この例は Ubuntu Linux 18.04 と MySQL サーバー 5.7 で確認されています。 + +unixODBCとMySQL Connectorがインストールされていることを確認してください。 + +デフォルトでは(パッケージからインストールされた場合)、ClickHouseはユーザー`clickhouse`として起動します。したがって、このユーザーをMySQLサーバーに作成して設定する必要があります。 + +``` bash +$ sudo mysql +``` + +``` sql +mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse'; +mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'localhost' WITH GRANT OPTION; +``` + +次に、`/etc/odbc.ini`で接続を設定します。 + +``` bash +$ cat /etc/odbc.ini +[mysqlconn] +DRIVER = /usr/local/lib/libmyodbc5w.so +SERVER = 127.0.0.1 +PORT = 3306 +DATABASE = test +USERNAME = clickhouse +PASSWORD = clickhouse +``` + +unixODBCインストールからの`isql`ユーティリティを使用して接続を確認できます。 + +``` bash +$ isql -v mysqlconn ++-------------------------+ +| Connected! | +| | +... +``` + +MySQLのテーブル: + +``` text +mysql> CREATE TABLE `test`.`test` ( + -> `int_id` INT NOT NULL AUTO_INCREMENT, + -> `int_nullable` INT NULL DEFAULT NULL, + -> `float` FLOAT NOT NULL, + -> `float_nullable` FLOAT NULL DEFAULT NULL, + -> PRIMARY KEY (`int_id`)); +Query OK, 0 rows affected (0,09 sec) + +mysql> insert into test (`int_id`, `float`) VALUES (1,2); +Query OK, 1 row affected (0,00 sec) + +mysql> select * from test; ++--------+--------------+-------+----------------+ +| int_id | int_nullable | float | float_nullable | ++--------+--------------+-------+----------------+ +| 1 | NULL | 2 | NULL | ++--------+--------------+-------+----------------+ +1 row in set (0,00 sec) +``` + +ClickHouseでMySQLテーブルからデータを取得: + +``` sql +SELECT * FROM odbc('DSN=mysqlconn', 'test', 'test') +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐ +│ 1 │ 0 │ 2 │ 0 │ +└────────┴──────────────┴───────┴────────────────┘ +``` + +## 関連項目 + +- [ODBC dictionaries](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-odbc) +- [ODBC table engine](../../engines/table-engines/integrations/odbc.md). diff --git a/docs/ja/sql-reference/table-functions/postgresql.md b/docs/ja/sql-reference/table-functions/postgresql.md new file mode 100644 index 00000000000..fec5b39ab6a --- /dev/null +++ b/docs/ja/sql-reference/table-functions/postgresql.md @@ -0,0 +1,157 @@ +--- +slug: /ja/sql-reference/table-functions/postgresql +sidebar_position: 160 +sidebar_label: postgresql +--- + +# postgresql + +リモートのPostgreSQLサーバーに保存されているデータに対して`SELECT`および`INSERT`クエリを実行することができます。 + +**構文** + +``` sql +postgresql({host:port, database, table, user, password[, schema, [, on_conflict]] | named_collection[, option=value [,..]]}) +``` + +**パラメータ** + +- `host:port` — PostgreSQLサーバーのアドレス。 +- `database` — リモートデータベース名。 +- `table` — リモートテーブル名。 +- `user` — PostgreSQLユーザー。 +- `password` — ユーザーパスワード。 +- `schema` — デフォルトでないテーブルスキーマ。オプション。 +- `on_conflict` — コンフリクト解決戦略。例: `ON CONFLICT DO NOTHING`。オプション。 + +引数は[名前付きコレクション](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`host`と`port`は別々に指定する必要があります。この方法は本番環境に推奨されます。 + +**返される値** + +元のPostgreSQLテーブルと同じカラムを持つテーブルオブジェクト。 + +:::note +テーブル関数`postgresql(...)`をテーブル名とカラム名リストから区別するために、`INSERT`クエリではキーワード`FUNCTION`または`TABLE FUNCTION`を使用しなければなりません。以下の例をご覧ください。 +::: + +## 実装の詳細 + +PostgreSQL側での`SELECT`クエリは、読み取り専用PostgreSQLトランザクション内で`COPY (SELECT ...) TO STDOUT`として実行され、各`SELECT`クエリ後にコミットされます。 + +`=`, `!=`, `>`, `>=`, `<`, `<=`, および`IN`などの単純な`WHERE`句はPostgreSQLサーバーで実行されます。 + +すべてのジョイン、集計、ソート、`IN [ array ]`条件、および`LIMIT`サンプリング制約は、PostgreSQLへのクエリ終了後にClickHouseのみで実行されます。 + +PostgreSQL側での`INSERT`クエリは、PostgreSQLトランザクション内で自動コミットで各`INSERT`文後に`COPY "table_name" (field1, field2, ... fieldN) FROM STDIN`として実行されます。 + +PostgreSQL配列型はClickHouseの配列に変換されます。 + +:::note +注意が必要です。PostgreSQLでは、データ型カラムが異なる次元の配列を含むことができるが、ClickHouseではすべての行で同じ次元の多次元配列のみが許可されます。 +::: + +複数のレプリカをサポートし、`|`でリストする必要があります。例えば: + +```sql +SELECT name FROM postgresql(`postgres{1|2|3}:5432`, 'postgres_database', 'postgres_table', 'user', 'password'); +``` + +または + +```sql +SELECT name FROM postgresql(`postgres1:5431|postgres2:5432`, 'postgres_database', 'postgres_table', 'user', 'password'); +``` + +PostgreSQL Dictionaryソースのレプリカ優先度をサポートします。マップ内の数字が大きいほど優先度が低くなります。最も高い優先度は`0`です。 + +**例** + +PostgreSQLのテーブル: + +``` text +postgres=# CREATE TABLE "public"."test" ( +"int_id" SERIAL, +"int_nullable" INT NULL DEFAULT NULL, +"float" FLOAT NOT NULL, +"str" VARCHAR(100) NOT NULL DEFAULT '', +"float_nullable" FLOAT NULL DEFAULT NULL, +PRIMARY KEY (int_id)); + +CREATE TABLE + +postgres=# INSERT INTO test (int_id, str, "float") VALUES (1,'test',2); +INSERT 0 1 + +postgresql> SELECT * FROM test; + int_id | int_nullable | float | str | float_nullable + --------+--------------+-------+------+---------------- + 1 | | 2 | test | +(1 row) +``` + +ClickHouseからのデータ選択(プレーン引数使用): + +```sql +SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password') WHERE str IN ('test'); +``` + +または[名前付きコレクション](/docs/ja/operations/named-collections.md)を使用: + +```sql +CREATE NAMED COLLECTION mypg AS + host = 'localhost', + port = 5432, + database = 'test', + user = 'postgresql_user', + password = 'password'; +SELECT * FROM postgresql(mypg, table='test') WHERE str IN ('test'); +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ 2 │ test │ ᴺᵁᴸᴸ │ +└────────┴──────────────┴───────┴──────┴────────────────┘ +``` + +挿入: + +```sql +INSERT INTO TABLE FUNCTION postgresql('localhost:5432', 'test', 'test', 'postgrsql_user', 'password') (int_id, float) VALUES (2, 3); +SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password'); +``` + +``` text +┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐ +│ 1 │ ᴺᵁᴸᴸ │ 2 │ test │ ᴺᵁᴸᴸ │ +│ 2 │ ᴺᵁᴸᴸ │ 3 │ │ ᴺᵁᴸᴸ │ +└────────┴──────────────┴───────┴──────┴────────────────┘ +``` + +デフォルトでないスキーマの使用: + +```text +postgres=# CREATE SCHEMA "nice.schema"; + +postgres=# CREATE TABLE "nice.schema"."nice.table" (a integer); + +postgres=# INSERT INTO "nice.schema"."nice.table" SELECT i FROM generate_series(0, 99) as t(i) +``` + +```sql +CREATE TABLE pg_table_schema_with_dots (a UInt32) + ENGINE PostgreSQL('localhost:5432', 'clickhouse', 'nice.table', 'postgrsql_user', 'password', 'nice.schema'); +``` + +**関連項目** + +- [PostgreSQLテーブルエンジン](../../engines/table-engines/integrations/postgresql.md) +- [PostgreSQLをDictionaryのソースとして使用](../../sql-reference/dictionaries/index.md#dictionary-sources#dicts-external_dicts_dict_sources-postgresql) + +## 関連コンテンツ + +- ブログ: [ClickHouseとPostgreSQL - データ天国で結ばれた関係 - パート1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) +- ブログ: [ClickHouseとPostgreSQL - データ天国で結ばれた関係 - パート2](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres-part-2) + +### PeerDBを用いたPostgresデータのレプリケーションまたは移行 + +> テーブル関数に加えて、[PeerDB](https://docs.peerdb.io/introduction)を使用してPostgresからClickHouseへの継続的なデータパイプラインを設定することもできます。PeerDBは、変更データキャプチャ(CDC)を使用してPostgresからClickHouseにデータをレプリケートするために設計されたツールです。 diff --git a/docs/ja/sql-reference/table-functions/redis.md b/docs/ja/sql-reference/table-functions/redis.md new file mode 100644 index 00000000000..08c445cf893 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/redis.md @@ -0,0 +1,67 @@ +--- +slug: /ja/sql-reference/table-functions/redis +sidebar_position: 170 +sidebar_label: redis +--- + +# redis + +このテーブル関数は、ClickHouseを[Redis](https://redis.io/)と統合するためのものです。 + +**構文** + +```sql +redis(host:port, key, structure[, db_index[, password[, pool_size]]]) +``` + +**引数** + +- `host:port` — Redisサーバーのアドレス。ポートを指定しない場合はデフォルトでRedisのポート6379が使用されます。 + +- `key` — カラムリスト内の任意のカラム名。 + +- `structure` — この関数により返されるClickHouseテーブルのスキーマ。 + +- `db_index` — Redisのデータベースインデックスで、範囲は0から15です。デフォルトは0です。 + +- `password` — ユーザーのパスワード。デフォルトは空文字列です。 + +- `pool_size` — Redisの最大接続プールサイズ。デフォルトは16です。 + +- `primary`は指定する必要があり、主キーには1つのカラムのみをサポートします。主キーはRedisキーとしてバイナリシリアライズされます。 + +- 主キー以外のカラムは、対応する順序でRedisの値としてバイナリシリアライズされます。 + +- キーが等しいかフィルタリングされているクエリは、Redisからのマルチキー検索に最適化されます。フィルタリングキーなしのクエリは、全テーブルスキャンが行われるため、重い操作になります。 + +現在、`redis`テーブル関数には[名前付きコレクション](/docs/ja/operations/named-collections.md)はサポートされていません。 + +**返される値** + +Redisキーとしてのキーを持つテーブルオブジェクト。他のカラムはRedis値としてパッケージ化されます。 + +## 使用例 {#usage-example} + +Redisから読み込む: + +```sql +SELECT * FROM redis( + 'redis1:6379', + 'key', + 'key String, v1 String, v2 UInt32' +) +``` + +Redisに挿入する: + +```sql +INSERT INTO TABLE FUNCTION redis( + 'redis1:6379', + 'key', + 'key String, v1 String, v2 UInt32') values ('1', '1', 1); +``` + +**参照** + +- [`Redis`テーブルエンジン](/docs/ja/engines/table-engines/integrations/redis.md) +- [Dictionaryソースとしてredisを使用する](/docs/ja/sql-reference/dictionaries/index.md#redis) diff --git a/docs/ja/sql-reference/table-functions/remote.md b/docs/ja/sql-reference/table-functions/remote.md new file mode 100644 index 00000000000..d09a71fa130 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/remote.md @@ -0,0 +1,181 @@ +--- +slug: /ja/sql-reference/table-functions/remote +sidebar_position: 175 +sidebar_label: remote +--- + +# remote, remoteSecure + +テーブル関数 `remote` は、[分散テーブル](../../engines/table-engines/special/distributed.md)を作成することなく、リモートサーバーに即座にアクセスすることを可能にします。テーブル関数 `remoteSecure` は、セキュアな接続を用いた `remote` と同様の機能を持ちます。 + +どちらの関数も `SELECT` および `INSERT` クエリで使用することができます。 + +## 構文 + +``` sql +remote(addresses_expr, [db, table, user [, password], sharding_key]) +remote(addresses_expr, [db.table, user [, password], sharding_key]) +remote(named_collection[, option=value [,..]]) +remoteSecure(addresses_expr, [db, table, user [, password], sharding_key]) +remoteSecure(addresses_expr, [db.table, user [, password], sharding_key]) +remoteSecure(named_collection[, option=value [,..]]) +``` + +## パラメータ + +- `addresses_expr` — リモートサーバーのアドレスまたはリモートサーバーの複数のアドレスを生成する式。フォーマット: `host` または `host:port`。 + + `host` はサーバー名として、あるいは IPv4 または IPv6 アドレスとして指定できます。IPv6 アドレスは角括弧で囲む必要があります。 + + `port` はリモートサーバーのTCPポートです。ポートが省略された場合、テーブル関数 `remote` にはサーバー構成ファイルの [tcp_port](../../operations/server-configuration-parameters/settings.md#tcp_port)(デフォルトは9000)、テーブル関数 `remoteSecure` には [tcp_port_secure](../../operations/server-configuration-parameters/settings.md#tcp_port_secure)(デフォルトは9440)が使用されます。 + + IPv6 アドレスの場合、ポートの指定が必須です。 + + パラメータ `addresses_expr` のみが指定された場合、`db` と `table` はデフォルトで `system.one` が使用されます。 + + 型: [String](../../sql-reference/data-types/string.md)。 + +- `db` — データベース名。型: [String](../../sql-reference/data-types/string.md)。 +- `table` — テーブル名。型: [String](../../sql-reference/data-types/string.md)。 +- `user` — ユーザー名。指定しない場合は `default` が使用されます。型: [String](../../sql-reference/data-types/string.md)。 +- `password` — ユーザーパスワード。指定しない場合は空のパスワードが使用されます。型: [String](../../sql-reference/data-types/string.md)。 +- `sharding_key` — ノード間でデータを分散するためのシャーディングキー。例: `insert into remote('127.0.0.1:9000,127.0.0.2', db, table, 'default', rand())`。型: [UInt32](../../sql-reference/data-types/int-uint.md)。 + +引数は[named collections](/docs/ja/operations/named-collections.md)を使って渡すこともできます。 + +## 戻り値 + +リモートサーバーに存在するテーブル。 + +## 使用法 + +テーブル関数 `remote` および `remoteSecure` は各リクエストごとに接続を再確立するため、`Distributed` テーブルを使用することをお勧めします。また、ホスト名が設定されている場合、名前の解決が行われ、さまざまなレプリカと作業する際にはエラーがカウントされません。多数のクエリを処理する場合は、事前に `Distributed` テーブルを作成し、`remote` テーブル関数を使用しないようにしてください。 + +`remote` テーブル関数は以下のケースで便利です: + +- システム間の一回限りのデータ移行 +- データ比較、デバッグ、およびテストのために特定のサーバーにアクセス(アドホック接続) +- 調査目的での複数の ClickHouse クラスター間のクエリ +- 手動で行われるまれな分散リクエスト +- サーバーのセットが毎回再定義される分散リクエスト + +### アドレス + +``` text +example01-01-1 +example01-01-1:9440 +example01-01-1:9000 +localhost +127.0.0.1 +[::]:9440 +[::]:9000 +[2a02:6b8:0:1111::11]:9000 +``` + +複数のアドレスはカンマで区切ることができます。この場合、ClickHouse は分散処理を使用して、指定したすべてのアドレス(異なるデータを持つシャードのように)にクエリを送信します。例: + +``` text +example01-01-1,example01-02-1 +``` + +## 例 + +### リモートサーバーからデータを選択する: + +``` sql +SELECT * FROM remote('127.0.0.1', db.remote_engine_table) LIMIT 3; +``` + +または[named collections](/docs/ja/operations/named-collections.md)を使用する場合: + +```sql +CREATE NAMED COLLECTION creds AS + host = '127.0.0.1', + database = 'db'; +SELECT * FROM remote(creds, table='remote_engine_table') LIMIT 3; +``` + +### リモートサーバー上のテーブルにデータを挿入する: + +``` sql +CREATE TABLE remote_table (name String, value UInt32) ENGINE=Memory; +INSERT INTO FUNCTION remote('127.0.0.1', currentDatabase(), 'remote_table') VALUES ('test', 42); +SELECT * FROM remote_table; +``` + +### システムからシステムへのテーブルの移行: + +この例では、サンプルデータセットの1つのテーブルを使用します。データベースは `imdb`、テーブルは `actors` です。 + +#### ソース ClickHouse システムで(現在データをホストしているシステム) + +- ソースデータベースおよびテーブル名を確認する(`imdb.actors`) + + ```sql + show databases + ``` + + ```sql + show tables in imdb + ``` + +- ソースから CREATE TABLE ステートメントを取得する: + + ``` + select create_table_query + from system.tables + where database = 'imdb' and table = 'actors' + ``` + + レスポンス + + ```sql + CREATE TABLE imdb.actors (`id` UInt32, + `first_name` String, + `last_name` String, + `gender` FixedString(1)) + ENGINE = MergeTree + ORDER BY (id, first_name, last_name, gender); + ``` + +#### 送信先 ClickHouse システムで: + +- 送信先データベースを作成する: + + ```sql + CREATE DATABASE imdb + ``` + +- ソースからの CREATE TABLE ステートメントを使用し、送信先を作成する: + + ```sql + CREATE TABLE imdb.actors (`id` UInt32, + `first_name` String, + `last_name` String, + `gender` FixedString(1)) + ENGINE = MergeTree + ORDER BY (id, first_name, last_name, gender); + ``` + +#### ソース展開に戻って: + +リモートシステム上で作成した新しいデータベースおよびテーブルに挿入します。ホスト、ポート、ユーザー名、パスワード、送信先データベース、および送信先テーブルが必要です。 + +```sql +INSERT INTO FUNCTION +remoteSecure('remote.clickhouse.cloud:9440', 'imdb.actors', 'USER', 'PASSWORD') +SELECT * from imdb.actors +``` + +## グロビング {#globs-in-addresses} + +波括弧 `{ }` 内のパターンは、シャードのセットを生成したり、レプリカを指定したりするのに使用されます。複数の波括弧ペアがある場合、対応するセットの直積が生成されます。 + +次のパターンタイプがサポートされています。 + +- `{a,b,c}` - 代替文字列のいずれかである `a`、`b` または `c` を表します。このパターンは最初のシャードアドレスでは `a` に置き換えられ、次のシャードアドレスでは `b`、その後も同様に置き換えられます。例: `example0{1,2}-1` はアドレス `example01-1` および `example02-1` を生成します。 +- `{N..M}` - 数値の範囲。このパターンは、`N` から `M`(含む)へのインデックスを持つシャードアドレスを生成します。例: `example0{1..2}-1` は `example01-1` および `example02-1` を生成します。 +- `{0n..0m}` - 先頭にゼロのある数値の範囲。このパターンはインデックスにおける先頭のゼロを維持します。例: `example{01..03}-1` は `example01-1`、`example02-1`、`example03-1` を生成します。 +- `{a|b}` - `|` で区切られた任意の数のバリアント。パターンはレプリカを指定します。例: `example01-{1|2}` はレプリカ `example01-1` および `example01-2` を生成します。 + +クエリは最初の正常なレプリカに送信されます。しかし、`remote` では、レプリカは現在の[ロードバランシング](../../operations/settings/settings.md#load_balancing)設定に示されている順序で反復されます。生成されたアドレスの数は、[table_function_remote_max_addresses](../../operations/settings/settings.md#table_function_remote_max_addresses)設定によって制限されます。 diff --git a/docs/ja/sql-reference/table-functions/s3.md b/docs/ja/sql-reference/table-functions/s3.md new file mode 100644 index 00000000000..687d861520b --- /dev/null +++ b/docs/ja/sql-reference/table-functions/s3.md @@ -0,0 +1,322 @@ +--- +slug: /ja/sql-reference/table-functions/s3 +sidebar_position: 180 +sidebar_label: s3 +keywords: [s3, gcs, bucket] +--- + +# s3 テーブル関数 + +[Amazon S3](https://aws.amazon.com/s3/) と [Google Cloud Storage](https://cloud.google.com/storage/) 内のファイルを選択/挿入するためのテーブルのようなインターフェースを提供します。このテーブル関数は [hdfs 関数](../../sql-reference/table-functions/hdfs.md) に似ていますが、S3 固有の機能を提供します。 + +クラスターに複数のレプリカがある場合は、挿入を並列化するために[s3Cluster 関数](../../sql-reference/table-functions/s3Cluster.md)を代わりに使用できます。 + +[`INSERT INTO...SELECT`](../../sql-reference/statements/insert-into#inserting-the-results-of-select) と共に `s3 テーブル関数` を使用する場合、データはストリーミング方式で読み込まれ、挿入されます。S3からデータを連続的に読み込み、宛先テーブルに押し込む間、メモリには少しのデータブロックのみが存在します。 + +**構文** + +``` sql +s3(url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,structure] [,compression_method]) +s3(named_collection[, option=value [,..]]) +``` + +:::tip GCS +S3 テーブル関数は GCS XML API と HMAC キーを使用して Google Cloud Storage と統合されます。エンドポイントとHMACの詳細については[Google インターオペラビリティ ドキュメント](https://cloud.google.com/storage/docs/interoperability)を参照してください。 + +GCS の場合、`access_key_id` および `secret_access_key` の場所に HMAC キーおよび HMAC シークレットを置き換えてください。 +::: + +**パラメータ** + +`s3` テーブル関数は以下のプレーンパラメータをサポートします: + +- `url` — ファイルへのパスを含むバケットのURL。読み取り専用モードで以下のワイルドカードをサポートします: `*`, `**`, `?`, `{abc,def}` および `{N..M}` ただし `N`, `M` — 数字、 `'abc'`, `'def'` — 文字列。詳細は[こちら](../../engines/table-engines/integrations/s3.md#wildcards-in-path)を参照してください。 + :::note GCS + GCS のURL形式はGoogle XML APIのエンドポイントがJSON APIと異なるため、以下の形式です: + ``` + https://storage.googleapis.com/// + ``` + および ~~https://storage.cloud.google.com~~ ではありません。 + ::: +- `NOSIGN` — 資格情報の代わりにこのキーワードが提供された場合、すべてのリクエストは署名されません。 +- `access_key_id` および `secret_access_key` — 与えられたエンドポイントで使用する資格情報を指定するためのキー。オプション。 +- `session_token` - 指定されたキーと共に使用するセッショントークン。キーを渡す場合はオプション。 +- `format` — ファイルの[フォーマット](../../interfaces/formats.md#formats)。 +- `structure` — テーブルの構造。フォーマット `'column1_name column1_type, column2_name column2_type, ...'`。 +- `compression_method` — パラメータはオプションです。サポートされる値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮方法を自動検出します。 + +引数はまた[指定されたコレクション](/docs/ja/operations/named-collections.md)を使用して渡すこともできます。この場合、`url`, `access_key_id`, `secret_access_key`, `format`, `structure`, `compression_method` は同じ方法で動作し、追加のパラメータがサポートされます: + + - `filename` — 指定された場合、url に追加されます。 + - `use_environment_credentials` — デフォルトで有効、環境変数 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`, `AWS_CONTAINER_CREDENTIALS_FULL_URI`, `AWS_CONTAINER_AUTHORIZATION_TOKEN`, `AWS_EC2_METADATA_DISABLED` を使用して追加パラメータを渡すことを許可します。 + - `no_sign_request` — デフォルトで無効。 + - `expiration_window_seconds` — デフォルト値は 120。 + +**返される値** + +指定されたファイルでデータを読み書きするために、指定された構造のテーブル。 + +**例** + +S3 ファイル `https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv` からテーブルの最初の 5 行を選択する: + +``` sql +SELECT * +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', + 'CSVWithNames' +) +LIMIT 5; +``` + +```response +┌───────Date─┬────Open─┬────High─┬─────Low─┬───Close─┬───Volume─┬─OpenInt─┐ +│ 1984-09-07 │ 0.42388 │ 0.42902 │ 0.41874 │ 0.42388 │ 23220030 │ 0 │ +│ 1984-09-10 │ 0.42388 │ 0.42516 │ 0.41366 │ 0.42134 │ 18022532 │ 0 │ +│ 1984-09-11 │ 0.42516 │ 0.43668 │ 0.42516 │ 0.42902 │ 42498199 │ 0 │ +│ 1984-09-12 │ 0.42902 │ 0.43157 │ 0.41618 │ 0.41618 │ 37125801 │ 0 │ +│ 1984-09-13 │ 0.43927 │ 0.44052 │ 0.43927 │ 0.43927 │ 57822062 │ 0 │ +└────────────┴─────────┴─────────┴─────────┴─────────┴──────────┴─────────┘ +``` + +:::note +ClickHouse はファイルの形式を決定するためにファイル名の拡張子を使用します。たとえば、前のコマンドを `CSVWithNames` なしで実行することもできます: + +``` sql +SELECT * +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv' +) +LIMIT 5; +``` + +ClickHouse はファイルの圧縮方法も決定できます。たとえば、ファイルが `.csv.gz` 拡張子で圧縮されている場合、ClickHouse は自動的にファイルを解凍します。 +::: + +## 使用方法 + +以下の URI を持つ複数のファイルが S3 にあると仮定します: + +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv' +- 'https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv' + +1から3までの数字で終わるファイルの行数をカウント: + +``` sql +SELECT count(*) +FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/{some,another}_prefix/some_file_{1..3}.csv', 'CSV', 'name String, value UInt32') +``` + +``` text +┌─count()─┐ +│ 18 │ +└─────────┘ +``` + +これらの2つのディレクトリ内のすべてのファイルの合計行数をカウント: + +``` sql +SELECT count(*) +FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/{some,another}_prefix/*', 'CSV', 'name String, value UInt32') +``` + +``` text +┌─count()─┐ +│ 24 │ +└─────────┘ +``` + +:::tip +ファイルの一覧に先行ゼロ付きの数字範囲が含まれている場合は、各桁ごとに中括弧を使うか `?` を使ってください。 +::: + +ファイル名 `file-000.csv`, `file-001.csv`, ... , `file-999.csv` のファイルの合計行数をカウント: + +``` sql +SELECT count(*) +FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/big_prefix/file-{000..999}.csv', 'CSV', 'name String, value UInt32'); +``` + +``` text +┌─count()─┐ +│ 12 │ +└─────────┘ +``` + +ファイル `test-data.csv.gz` にデータを挿入: + +``` sql +INSERT INTO FUNCTION s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip') +VALUES ('test-data', 1), ('test-data-2', 2); +``` + +既存のテーブルからファイル `test-data.csv.gz` にデータを挿入: + +``` sql +INSERT INTO FUNCTION s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip') +SELECT name, value FROM existing_table; +``` + +グロブ ** を使用して再帰的なディレクトリ トラバーサルが可能です。以下の例を考察してください。これは `my-test-bucket-768` ディレクトリ内のすべてのファイルを再帰的に取得します: + +``` sql +SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**', 'CSV', 'name String, value UInt32', 'gzip'); +``` + +以下のコマンドは、`my-test-bucket` ディレクトリ内の任意のフォルダー内のすべての `test-data.csv.gz` ファイルからデータを取得します: + +``` sql +SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip'); +``` + +注意点として、サーバー構成ファイル内でカスタムURLマッパーを指定することが可能です。例: +``` sql +SELECT * FROM s3('s3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz', 'CSV', 'name String, value UInt32', 'gzip'); +``` +URL `'s3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz'` は `'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz'` に置き換えられます。 + +カスタムマッパーは `config.xml` に追加できます: +``` xml + + + https://{bucket}.s3.amazonaws.com + + + https://{bucket}.storage.googleapis.com + + + https://{bucket}.oss.aliyuncs.com + + +``` + +本番環境での使用には[指定されたコレクション](/docs/ja/operations/named-collections.md)を使用することをおすすめします。以下に例を示します: +``` sql + +CREATE NAMED COLLECTION creds AS + access_key_id = '***', + secret_access_key = '***'; +SELECT count(*) +FROM s3(creds, url='https://s3-object-url.csv') +``` + +## パーティション分けされた書き込み + +`S3` テーブルにデータを挿入する際に `PARTITION BY` 式を指定すると、各パーティション値に対して別々のファイルが作成されます。データを別々のファイルに分けることで、読み取り操作の効率が向上します。 + +**例** + +1. キーにパーティションIDを使用して別々のファイルが作成されます: + +```sql +INSERT INTO TABLE FUNCTION + s3('http://bucket.amazonaws.com/my_bucket/file_{_partition_id}.csv', 'CSV', 'a String, b UInt32, c UInt32') + PARTITION BY a VALUES ('x', 2, 3), ('x', 4, 5), ('y', 11, 12), ('y', 13, 14), ('z', 21, 22), ('z', 23, 24); +``` +その結果、データは3つのファイルに書き込まれます: `file_x.csv`, `file_y.csv`, そして `file_z.csv`。 + +2. バケット名にパーティションIDを使用して、異なるバケットにファイルが作成されます: + +```sql +INSERT INTO TABLE FUNCTION + s3('http://bucket.amazonaws.com/my_bucket_{_partition_id}/file.csv', 'CSV', 'a UInt32, b UInt32, c UInt32') + PARTITION BY a VALUES (1, 2, 3), (1, 4, 5), (10, 11, 12), (10, 13, 14), (20, 21, 22), (20, 23, 24); +``` +その結果、データは異なるバケット内の3つのファイルに書き込まれます: `my_bucket_1/file.csv`, `my_bucket_10/file.csv`, そして `my_bucket_20/file.csv`。 + +## 公開バケットへのアクセス + +ClickHouse はさまざまな種類のソースから資格情報を取得しようと試みます。 +時には、クライアントが `403` エラーコードを返して公共のバケットにアクセスすることが問題になることがあります。 +この問題は `NOSIGN` キーワードを使用して、クライアントがすべての資格情報を無視し、リクエストに署名しないように強制することで回避できます。 + +``` sql +SELECT * +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv', + NOSIGN, + 'CSVWithNames' +) +LIMIT 5; +``` + +## S3 クレデンシャルの使用 (ClickHouse Cloud) + +非公開バケットの場合、ユーザーは `aws_access_key_id` と `aws_secret_access_key` を関数に渡すことができます。例: + +```sql +SELECT count() FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/mta/*.tsv', '', '','TSVWithNames') +``` + +これは一回限りのアクセスや資格情報を簡単にローテーションできる場合に適しています。しかし、繰り返しのアクセスが必要な長期的な解決策としては推奨されませんし、資格情報が機密である場合も問題です。この場合、ロールベースのアクセスに依存することをおすすめします。 + +ClickHouse CloudのS3用ロールベースアクセスについては[こちら](/docs/ja/cloud/security/secure-s3#access-your-s3-bucket-with-the-clickhouseaccess-role)に記載されています。 + +設定が完了したら、`extra_credentials` パラメータを介し `roleARN` を s3 関数に渡すことができます。例: + +```sql +SELECT count() FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/mta/*.tsv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001')) +``` + +さらなる例は[こちら](/docs/ja/cloud/security/secure-s3#access-your-s3-bucket-with-the-clickhouseaccess-role)で見つけることができます。 + +## アーカイブを扱う + +以下のURIのアーカイブファイルがS3にあると想定します: + +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip' +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip' +- 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip' + +これらのアーカイブからデータを抽出することが可能です。URLの部分とアーカイブ内のファイル名を指定する部分(::の後)でグロブを使用できます。 + +``` sql +SELECT * +FROM s3( + 'https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-1{0..2}.csv.zip :: *.csv' +); +``` + +:::note +ClickHouse は以下の3つのアーカイブ形式をサポートします: +ZIP +TAR +7Z +ZIPおよびTARアーカイブはサポートされる任意のストレージ場所からアクセスできますが、7ZアーカイブはClickHouseがインストールされているローカルファイルシステムからのみ読み取ることができます。 +::: + +## 仮想カラム {#virtual-columns} + +- `_path` — ファイルへのパス。タイプ: `LowCardinalty(String)`。アーカイブの場合、"{path_to_archive}::{path_to_file_inside_archive}"の形式でパスを表示します。 +- `_file` — ファイル名。タイプ: `LowCardinalty(String)`。アーカイブの場合、アーカイブ内ファイルの名前を表示します。 +- `_size` — ファイルのサイズ(バイト単位)。タイプ: `Nullable(UInt64)`。ファイルサイズが不明な場合、その値は `NULL` です。アーカイブの場合、アーカイブ内ファイルの非圧縮サイズを示します。 +- `_time` — ファイルの最終変更時刻。タイプ: `Nullable(DateTime)`。時間が不明な場合、その値は `NULL` です。 + +## Hive 形式のパーティション分割 {#hive-style-partitioning} + +`use_hive_partitioning` 設定が1に設定されている場合、ClickHouseはパス内のHive形式のパーティション分割(`/name=value/`)を検出し、クエリ内でパーティションカラムを仮想カラムとして使用できるようにします。これらの仮想カラムは分割されたパス内と同じ名前を持ちますが、`_` で始まります。 + +**例** + +Hive形式のパーティション分割で作成された仮想カラムを使用する + +``` sql +SET use_hive_partitioning = 1; +SELECT * from s3('s3://data/path/date=*/country=*/code=*/*.parquet') where _date > '2020-01-01' and _country = 'Netherlands' and _code = 42; +``` + +## ストレージ設定 {#storage-settings} + +- [s3_truncate_on_insert](/docs/ja/operations/settings/settings.md#s3_truncate_on_insert) - 挿入前にファイルを切り詰めることを許可します。デフォルトでは無効です。 +- [s3_create_new_file_on_insert](/docs/ja/operations/settings/settings.md#s3_create_new_file_on_insert) - フォーマットに接尾辞がある場合に挿入のたびに新しいファイルを作成することを許可します。デフォルトでは無効です。 +- [s3_skip_empty_files](/docs/ja/operations/settings/settings.md#s3_skip_empty_files) - 読み取り時に空のファイルをスキップすることを許可します。デフォルトでは無効です。 + +**関連項目** + +- [S3エンジン](../../engines/table-engines/integrations/s3.md) diff --git a/docs/ja/sql-reference/table-functions/s3Cluster.md b/docs/ja/sql-reference/table-functions/s3Cluster.md new file mode 100644 index 00000000000..cfb0ac8ec6d --- /dev/null +++ b/docs/ja/sql-reference/table-functions/s3Cluster.md @@ -0,0 +1,85 @@ +--- +slug: /ja/sql-reference/table-functions/s3Cluster +sidebar_position: 181 +sidebar_label: s3Cluster +title: "s3Cluster テーブル関数" +--- +これは [s3](/docs/ja/sql-reference/table-functions/s3.md) テーブル関数の拡張です。 + +指定したクラスターの多くのノードから並列で [Amazon S3](https://aws.amazon.com/s3/) および [Google Cloud Storage](https://cloud.google.com/storage/) のファイルを処理できます。イニシエータでは、クラスター内のすべてのノードに接続を作成し、S3ファイルパス内のアスタリスクを展開し、各ファイルを動的にディスパッチします。ワーカーノードでは、次の処理タスクについてイニシエータに問い合わせ、それを処理します。このプロセスはすべてのタスクが終了するまで繰り返されます。 + +**構文** + +``` sql +s3Cluster(cluster_name, url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,structure] [,compression_method]) +s3Cluster(cluster_name, named_collection[, option=value [,..]]) +``` + +**引数** + +- `cluster_name` — リモートおよびローカルサーバーへのアドレスセットと接続パラメータを構築するために使用されるクラスターの名前。 +- `url` — ファイルまたは一連のファイルへのパス。読み取り専用モードで次のワイルドカードをサポート: `*`, `**`, `?`, `{'abc','def'}` および `{N..M}` ここで `N`, `M` — 数字, `abc`, `def` — 文字列。詳細については [パス内のワイルドカード](../../engines/table-engines/integrations/s3.md#wildcards-in-path) を参照してください。 +- `NOSIGN` — このキーワードが資格情報の代わりに指定された場合、すべてのリクエストは署名されません。 +- `access_key_id` および `secret_access_key` — 指定されたエンドポイントで使用するための資格情報を指定するキー。オプション。 +- `session_token` - 指定されたキーと共に使用するセッショントークン。キーを渡す場合はオプション。 +- `format` — ファイルの[形式](../../interfaces/formats.md#formats)。 +- `structure` — テーブルの構造。形式 `'column1_name column1_type, column2_name column2_type, ...'`。 +- `compression_method` — パラメータはオプションです。サポートされる値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子によって圧縮方法を自動検出します。 + +引数は [named collections](/docs/ja/operations/named-collections.md) を使用して渡すこともできます。この場合、`url`, `access_key_id`, `secret_access_key`, `format`, `structure`, `compression_method` は同じ方法で動作し、いくつかの追加パラメータがサポートされます: + + - `filename` — 指定されている場合、urlに追加されます。 + - `use_environment_credentials` — デフォルトで有効で、環境変数 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`, `AWS_CONTAINER_CREDENTIALS_FULL_URI`, `AWS_CONTAINER_AUTHORIZATION_TOKEN`, `AWS_EC2_METADATA_DISABLED` を使用して追加パラメータを渡すことができます。 + - `no_sign_request` — デフォルトでは無効です。 + - `expiration_window_seconds` — デフォルト値は 120 です。 + +**返される値** + +指定されたファイルにデータを読み書きするための、指定された構造のテーブル。 + +**例** + +`cluster_simple` クラスター内のすべてのノードを使用して、`/root/data/clickhouse` および `/root/data/database/` フォルダー内のすべてのファイルからデータを選択: + +``` sql +SELECT * FROM s3Cluster( + 'cluster_simple', + 'http://minio1:9001/root/data/{clickhouse,database}/*', + 'minio', + 'minio123', + 'CSV', + 'name String, value UInt32, polygon Array(Array(Tuple(Float64, Float64)))' +) ORDER BY (name, value, polygon); +``` + +`cluster_simple` クラスター内のすべてのファイルの行の合計をカウント: + +:::tip +ファイルリストに先頭にゼロが付いた数字の範囲が含まれる場合は、各桁ごとに波括弧を使用するか `?` を使用してください。 +::: + +本番ユースケースでは、[named collections](/docs/ja/operations/named-collections.md) の使用を推奨します。以下は例です: +``` sql + +CREATE NAMED COLLECTION creds AS + access_key_id = 'minio', + secret_access_key = 'minio123'; +SELECT count(*) FROM s3Cluster( + 'cluster_simple', creds, url='https://s3-object-url.csv', + format='CSV', structure='name String, value UInt32, polygon Array(Array(Tuple(Float64, Float64)))' +) +``` + +## プライベートおよびパブリックバケットへのアクセス + +ユーザーは、s3関数のドキュメントに記載されている方法を使用できます [こちら](/docs/ja/sql-reference/table-functions/s3#accessing-public-buckets). + +## パフォーマンスの最適化 + +s3関数のパフォーマンスを最適化する詳細については、[詳細ガイド](/docs/ja/integrations/s3/performance) を参照してください。 + + +**参考** + +- [S3エンジン](../../engines/table-engines/integrations/s3.md) +- [s3 テーブル関数](../../sql-reference/table-functions/s3.md) diff --git a/docs/ja/sql-reference/table-functions/sqlite.md b/docs/ja/sql-reference/table-functions/sqlite.md new file mode 100644 index 00000000000..81013a61f10 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/sqlite.md @@ -0,0 +1,46 @@ +--- +slug: /ja/sql-reference/table-functions/sqlite +sidebar_position: 185 +sidebar_label: sqlite +title: sqlite +--- + +[SQLite](../../engines/database-engines/sqlite.md) データベースに保存されたデータに対してクエリを実行できるようにします。 + +**構文** + +``` sql + sqlite('db_path', 'table_name') +``` + +**引数** + +- `db_path` — SQLiteデータベースを含むファイルへのパス。[String](../../sql-reference/data-types/string.md)。 +- `table_name` — SQLiteデータベース内のテーブルの名前。[String](../../sql-reference/data-types/string.md)。 + +**返される値** + +- 元の `SQLite` テーブルと同じカラムを持つテーブルオブジェクト。 + +**例** + +クエリ: + +``` sql +SELECT * FROM sqlite('sqlite.db', 'table1') ORDER BY col2; +``` + +結果: + +``` text +┌─col1──┬─col2─┐ +│ line1 │ 1 │ +│ line2 │ 2 │ +│ line3 │ 3 │ +└───────┴──────┘ +``` + +**関連項目** + +- [SQLite](../../engines/table-engines/integrations/sqlite.md) テーブルエンジン + diff --git a/docs/ja/sql-reference/table-functions/timeSeriesData.md b/docs/ja/sql-reference/table-functions/timeSeriesData.md new file mode 100644 index 00000000000..9cf9fabecd1 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/timeSeriesData.md @@ -0,0 +1,27 @@ +--- +slug: /ja/sql-reference/table-functions/timeSeriesData +sidebar_position: 145 +sidebar_label: timeSeriesData +--- + +# timeSeriesData + +`timeSeriesData(db_name.time_series_table)` - [TimeSeries](../../engines/table-engines/integrations/time-series.md) テーブルエンジンを使用するテーブル `db_name.time_series_table` で使用される [data](../../engines/table-engines/integrations/time-series.md#data-table) テーブルを返します: + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries DATA data_table +``` + +データテーブルが内部である場合もこの関数は動作します: + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries DATA INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +``` + +以下のクエリは同等です: + +``` sql +SELECT * FROM timeSeriesData(db_name.time_series_table); +SELECT * FROM timeSeriesData('db_name.time_series_table'); +SELECT * FROM timeSeriesData('db_name', 'time_series_table'); +``` diff --git a/docs/ja/sql-reference/table-functions/timeSeriesMetrics.md b/docs/ja/sql-reference/table-functions/timeSeriesMetrics.md new file mode 100644 index 00000000000..9030effb247 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/timeSeriesMetrics.md @@ -0,0 +1,28 @@ +--- +slug: /ja/sql-reference/table-functions/timeSeriesMetrics +sidebar_position: 145 +sidebar_label: timeSeriesMetrics +--- + +# timeSeriesMetrics + +`timeSeriesMetrics(db_name.time_series_table)` - [TimeSeries](../../engines/table-engines/integrations/time-series.md)テーブルエンジンを使用するテーブル`db_name.time_series_table`で使用される[metrics](../../engines/table-engines/integrations/time-series.md#metrics-table)テーブルを返します。 + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries METRICS metrics_table +``` + +_metrics_テーブルが内側にある場合もこの関数は機能します。 + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries METRICS INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +``` + +以下のクエリは同等です。 + +``` sql +SELECT * FROM timeSeriesMetrics(db_name.time_series_table); +SELECT * FROM timeSeriesMetrics('db_name.time_series_table'); +SELECT * FROM timeSeriesMetrics('db_name', 'time_series_table'); +``` + diff --git a/docs/ja/sql-reference/table-functions/timeSeriesTags.md b/docs/ja/sql-reference/table-functions/timeSeriesTags.md new file mode 100644 index 00000000000..77c22441d3e --- /dev/null +++ b/docs/ja/sql-reference/table-functions/timeSeriesTags.md @@ -0,0 +1,27 @@ +--- +slug: /ja/sql-reference/table-functions/timeSeriesTags +sidebar_position: 145 +sidebar_label: timeSeriesTags +--- + +# timeSeriesTags + +`timeSeriesTags(db_name.time_series_table)` - テーブルエンジンが [TimeSeries](../../engines/table-engines/integrations/time-series.md) のテーブル `db_name.time_series_table` で使用されている[タグ](../../engines/table-engines/integrations/time-series.md#tags-table)テーブルを返します: + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries TAGS tags_table +``` + +この関数は、_tags_ テーブルが内部にある場合でも機能します: + +``` sql +CREATE TABLE db_name.time_series_table ENGINE=TimeSeries TAGS INNER UUID '01234567-89ab-cdef-0123-456789abcdef' +``` + +以下のクエリは同等です: + +``` sql +SELECT * FROM timeSeriesTags(db_name.time_series_table); +SELECT * FROM timeSeriesTags('db_name.time_series_table'); +SELECT * FROM timeSeriesTags('db_name', 'time_series_table'); +``` diff --git a/docs/ja/sql-reference/table-functions/url.md b/docs/ja/sql-reference/table-functions/url.md new file mode 100644 index 00000000000..957ae445e25 --- /dev/null +++ b/docs/ja/sql-reference/table-functions/url.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/table-functions/url +sidebar_position: 200 +sidebar_label: url +--- + +# url + +`url` 関数は指定された `URL` から `format` と `structure` に従ったテーブルを作成します。 + +`url` 関数は、[URL](../../engines/table-engines/special/url.md) テーブルのデータに対する `SELECT` および `INSERT` クエリで使用できます。 + +**構文** + +``` sql +url(URL [,format] [,structure] [,headers]) +``` + +**パラメータ** + +- `URL` — `GET` または `POST` リクエストを受け入れることができる HTTP または HTTPS サーバーのアドレス(それぞれ `SELECT` または `INSERT` クエリ時)。型: [String](../../sql-reference/data-types/string.md)。 +- `format` — データの[フォーマット](../../interfaces/formats.md#formats)。型: [String](../../sql-reference/data-types/string.md)。 +- `structure` — `'UserID UInt64, Name String'` 形式によるテーブル構造。カラム名と型を決定します。型: [String](../../sql-reference/data-types/string.md)。 +- `headers` - `'headers('key1'='value1', 'key2'='value2')'` の形式で指定するヘッダー。HTTP 呼び出し時にヘッダーの設定が可能です。 + +**返される値** + +指定された形式と構造を持ち、定義された `URL` からデータを取得したテーブル。 + +**例** + +`String` 型と [UInt32](../../sql-reference/data-types/int-uint.md) 型のカラムを持つテーブルの最初の 3 行を、[CSV](../../interfaces/formats.md#csv) フォーマットで回答する HTTP サーバーから取得します。 + +``` sql +SELECT * FROM url('http://127.0.0.1:12345/', CSV, 'column1 String, column2 UInt32', headers('Accept'='text/csv; charset=utf-8')) LIMIT 3; +``` + +`URL` からデータをテーブルに挿入します: + +``` sql +CREATE TABLE test_table (column1 String, column2 UInt32) ENGINE=Memory; +INSERT INTO FUNCTION url('http://127.0.0.1:8123/?query=INSERT+INTO+test_table+FORMAT+CSV', 'CSV', 'column1 String, column2 UInt32') VALUES ('http interface', 42); +SELECT * FROM test_table; +``` + +## URLのグロブ + +中括弧 `{ }` で囲まれたパターンは、シャードのセットを生成するか、フェイルオーバーアドレスを指定するために使用します。サポートされているパターンの種類と例については、[remote](remote.md#globs-in-addresses) 関数の説明を参照してください。 +パターン内の `|` 文字は、フェイルオーバーアドレスを指定するために使用されます。パターンにリストされた順に反復されます。生成されるアドレスの数は [glob_expansion_max_elements](../../operations/settings/settings.md#glob_expansion_max_elements) 設定によって制限されます。 + +## 仮想カラム + +- `_path` — `URL` へのパス。型: `LowCardinalty(String)`。 +- `_file` — `URL` のリソース名。型: `LowCardinalty(String)`。 +- `_size` — リソースのサイズ(バイト単位)。型: `Nullable(UInt64)`。サイズが不明な場合、この値は `NULL` です。 +- `_time` — ファイルの最終変更時間。型: `Nullable(DateTime)`。時間が不明な場合、この値は `NULL` です。 +- `_headers` - HTTP レスポンスヘッダー。型: `Map(LowCardinality(String), LowCardinality(String))`。 + +## Hiveスタイルのパーティショニング {#hive-style-partitioning} + +`use_hive_partitioning` 設定を1に設定すると、ClickHouseはパス内のHiveスタイルのパーティショニング(`/name=value/`)を検出し、クエリ内で仮想カラムとしてパーティションカラムを使用できるようになります。これらの仮想カラムはパーティションパス内と同じ名前を持ちますが、先頭に`_`が付きます。 + +**例** + +Hiveスタイルのパーティショニングで作成された仮想カラムを使用 + +``` sql +SET use_hive_partitioning = 1; +SELECT * from url('http://data/path/date=*/country=*/code=*/*.parquet') where _date > '2020-01-01' and _country = 'Netherlands' and _code = 42; +``` + +## ストレージ設定 {#storage-settings} + +- [engine_url_skip_empty_files](/docs/ja/operations/settings/settings.md#engine_url_skip_empty_files) - 読み取り時に空のファイルをスキップすることができます。デフォルトでは無効です。 +- [enable_url_encoding](/docs/ja/operations/settings/settings.md#enable_url_encoding) - URIのパスのデコード/エンコードを有効/無効にすることができます。デフォルトで有効です。 + +**関連項目** + +- [仮想カラム](/docs/ja/engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/docs/ja/sql-reference/table-functions/urlCluster.md b/docs/ja/sql-reference/table-functions/urlCluster.md new file mode 100644 index 00000000000..c002a561d8d --- /dev/null +++ b/docs/ja/sql-reference/table-functions/urlCluster.md @@ -0,0 +1,62 @@ +--- +slug: /ja/sql-reference/table-functions/urlCluster +sidebar_position: 201 +sidebar_label: urlCluster +--- + +# urlCluster テーブル関数 + +URL からのファイルを指定したクラスタの多くのノードから並行して処理することを可能にします。イニシエータではすべてのクラスタ内のノードに接続を作成し、URLファイルパス内のアスタリスクを公開し、各ファイルを動的に分配します。ワーカーノードではイニシエータに次の処理タスクを問い合わせ、それを処理します。この処理はすべてのタスクが完了するまで繰り返されます。 + +**構文** + +``` sql +urlCluster(cluster_name, URL, format, structure) +``` + +**引数** + +- `cluster_name` — リモートおよびローカルサーバーへのアドレスセットと接続パラメータを構築するために使用されるクラスタの名前。 +- `URL` — `GET`リクエストを受け入れることができる HTTP または HTTPS サーバーアドレス。型: [String](../../sql-reference/data-types/string.md)。 +- `format` — データの[フォーマット](../../interfaces/formats.md#formats)。型: [String](../../sql-reference/data-types/string.md)。 +- `structure` — `'UserID UInt64, Name String'`形式のテーブル構造。カラム名とタイプを決定します。型: [String](../../sql-reference/data-types/string.md)。 + +**返される値** + +定義された`URL`からのデータを指定されたフォーマットと構造で持つテーブル。 + +**例** + +HTTP サーバーが [CSV](../../interfaces/formats.md#csv)形式で応答する`String`と[UInt32](../../sql-reference/data-types/int-uint.md) 型のカラムを含むテーブルの最初の3行を取得します。 + +1. 標準の Python 3 ツールを使用して基本的な HTTP サーバーを作成し、起動します: + +```python +from http.server import BaseHTTPRequestHandler, HTTPServer + +class CSVHTTPServer(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header('Content-type', 'text/csv') + self.end_headers() + + self.wfile.write(bytes('Hello,1\nWorld,2\n', "utf-8")) + +if __name__ == "__main__": + server_address = ('127.0.0.1', 12345) + HTTPServer(server_address, CSVHTTPServer).serve_forever() +``` + +``` sql +SELECT * FROM urlCluster('cluster_simple','http://127.0.0.1:12345', CSV, 'column1 String, column2 UInt32') +``` + +## URL のグロブ + +中括弧 `{ }` 内のパターンはシャードのセットを生成するか、フェイルオーバーアドレスを指定するために使用されます。サポートされているパターンタイプと例については、[remote](remote.md#globs-in-addresses) 関数の説明を参照してください。 +パターン内の文字 `|` はフェイルオーバーアドレスを指定するために使用されます。それらはパターンにリストされた順で反復されます。生成されるアドレスの数は [glob_expansion_max_elements](../../operations/settings/settings.md#glob_expansion_max_elements) 設定によって制限されます。 + +**関連項目** + +- [HDFS エンジン](../../engines/table-engines/special/url.md) +- [URL テーブル関数](../../sql-reference/table-functions/url.md) diff --git a/docs/ja/sql-reference/table-functions/view.md b/docs/ja/sql-reference/table-functions/view.md new file mode 100644 index 00000000000..e912d8be7cd --- /dev/null +++ b/docs/ja/sql-reference/table-functions/view.md @@ -0,0 +1,66 @@ +--- +slug: /ja/sql-reference/table-functions/view +sidebar_position: 210 +sidebar_label: view +title: view +--- + +サブクエリをテーブルに変換します。この関数はビューを実装します([CREATE VIEW](https://clickhouse.com/docs/ja/sql-reference/statements/create/view/#create-view)を参照)。生成されたテーブルはデータを保存せず、指定された`SELECT`クエリのみを保存します。テーブルから読み取る際、ClickHouseはクエリを実行し、結果から不要なカラムをすべて削除します。 + +**構文** + +``` sql +view(subquery) +``` + +**引数** + +- `subquery` — `SELECT`クエリ。 + +**返される値** + +- テーブル。 + +**例** + +入力テーブル: + +``` text +┌─id─┬─name─────┬─days─┐ +│ 1 │ January │ 31 │ +│ 2 │ February │ 29 │ +│ 3 │ March │ 31 │ +│ 4 │ April │ 30 │ +└────┴──────────┴──────┘ +``` + +クエリ: + +``` sql +SELECT * FROM view(SELECT name FROM months); +``` + +結果: + +``` text +┌─name─────┐ +│ January │ +│ February │ +│ March │ +│ April │ +└──────────┘ +``` + +`view`関数は、[remote](https://clickhouse.com/docs/ja/sql-reference/table-functions/remote/#remote-remotesecure)および[cluster](https://clickhouse.com/docs/ja/sql-reference/table-functions/cluster/#cluster-clusterallreplicas)テーブル関数のパラメータとして使用できます: + +``` sql +SELECT * FROM remote(`127.0.0.1`, view(SELECT a, b, c FROM table_name)); +``` + +``` sql +SELECT * FROM cluster(`cluster_name`, view(SELECT a, b, c FROM table_name)); +``` + +**関連項目** + +- [View Table Engine](https://clickhouse.com/docs/ja/engines/table-engines/special/view/) diff --git a/docs/ja/sql-reference/transactions.md b/docs/ja/sql-reference/transactions.md new file mode 100644 index 00000000000..c937840cff3 --- /dev/null +++ b/docs/ja/sql-reference/transactions.md @@ -0,0 +1,281 @@ +--- +slug: /ja/guides/developer/transactional +--- +# トランザクショナル (ACID) サポート + +## ケース 1: MergeTree* ファミリーの一つのテーブルの一つのパーティションへのINSERT + +行が単一のブロックとしてパックされて挿入される場合、これはトランザクショナル (ACID) である (注意参照): +- アトミック: INSERT が成功または全く拒否される: クライアントに確認が送信されると全ての行が挿入され、エラーが送信されると何も挿入されない。 +- 一貫性: テーブルの制約が違反されない場合、INSERT 内のすべての行が挿入され、INSERT は成功する; 制約が違反される場合、何も挿入されない。 +- 分離性: 同時実行するクライアントはテーブルの一貫したスナップショットを観察する–INSERT 以前の状態か、成功した後の状態; 部分的な状態は見えない。他のトランザクション内のクライアントは[スナップショット分離](https://en.wikipedia.org/wiki/Snapshot_isolation)を享受し、トランザクション外のクライアントは[未コミット読み取り](https://en.wikipedia.org/wiki/Isolation_(database_systems)#Read_uncommitted)の分離レベルを持つ。 +- 耐久性: 成功した INSERT はファイルシステムにクライアントへ応答する前に書き込まれ、単一または複数のレプリカに (これは `insert_quorum` 設定によって制御される)、ClickHouse はOSに格納メディア上のファイルシステムデータを同期するよう要求できる (これは `fsync_after_insert` 設定によって制御される)。 +- 複数のテーブルへのINSERTは、マテリアライズドビューが含まれている場合に可能である (クライアントからINSERTされたものがマテリアライズドビューを持つテーブルである場合)。 + +## ケース 2: MergeTree* ファミリーの一つのテーブルの複数のパーティションへのINSERT + +上記のケース 1と同様、詳細は以下の通り: +- テーブルに多数のパーティションがあり、INSERTが複数のパーティションをカバーする場合、各パーティションへの挿入が独立してトランザクショナルである + + +## ケース 3: MergeTree* ファミリーの一つの分散テーブルへのINSERT + +上記のケース 1と同様、詳細は以下の通り: +- 分散テーブルへのINSERTは全体としてトランザクショナルではないが、各シャードへの挿入はトランザクショナルである + +## ケース 4: Buffer テーブルの使用 + +- Buffer テーブルへの挿入は原子性も分離性も一貫性も耐久性もない + +## ケース 5: async_insert の使用 + +上記のケース 1と同様、詳細は以下の通り: +- `async_insert` が有効で `wait_for_async_insert` が 1(デフォルト) の場合でも原子性が保証されるが、`wait_for_async_insert` が 0 に設定されている場合は原子性が保証されない。 + +## 注意 +- クライアントから挿入された行は、あるデータフォーマットで以下の場合に単一のブロックにパックされる: + - 挿入フォーマットが行ベースの場合(CSV、TSV、Values、JSONEachRowなど)で、データが `max_insert_block_size` 行未満(デフォルトでは約1,000,000)または `min_chunk_bytes_for_parallel_parsing` 未満のバイト数(デフォルトでは10 MB)の場合(並列解析が使用される場合、デフォルトで有効) + - 挿入フォーマットがカラムベースの場合(Native、Parquet、ORCなど)で、データが一つのデータブロックのみを含む場合 +- 挿入されたブロックのサイズは、一般的に多くの設定に依存する(例えば: `max_block_size`, `max_insert_block_size`, `min_insert_block_size_rows`, `min_insert_block_size_bytes`, `preferred_block_size_bytes` など) +- クライアントがサーバから応答を受け取らなかった場合、クライアントはトランザクションが成功したかどうかを知ることができず、トランザクションを繰り返すことができる(ちょうど一度だけの挿入特性を使用して) +- ClickHouse は内部で[MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control)を使用し、同時トランザクションのための[スナップショット分離](https://en.wikipedia.org/wiki/Snapshot_isolation)を使用している +- すべてのACID 特性はサーバのキル/クラッシュの場合でも有効である +- 異なるAZへの `insert_quorum` または fsync のいずれかが有効であるべきである典型的な設定において耐久性のある挿入を保証するために +- ACID の「一貫性」は分散システムのセマンティクスをカバーしない、詳細は https://jepsen.io/consistency を参照。これは異なる設定によって制御される(`select_sequential_consistency`) +- これは新しいトランザクション機能をカバーしておらず、複数のテーブル、マテリアライズドビュー、複数のSELECTに対してフルフィーチャーのトランザクションを可能にする(次の「トランザクション、コミット、およびロールバック」セクションを参照) + +## トランザクション、コミット、およびロールバック + +このドキュメントの冒頭で説明した機能に加えて、ClickHouse はエクスペリメンタルなトランザクション、コミット、およびロールバック機能をサポートしています。 + +### 要件 + +- トランザクションを追跡するために ClickHouse Keeper または ZooKeeper を展開 +- Atomic DB のみ(デフォルト) +- 非レプリケート MergeTree テーブルエンジンのみ +- `config.d/transactions.xml` に次の設定を追加してエクスペリメンタルなトランザクションサポートを有効化: + ```xml + + 1 + + ``` + +### 注意 +- これはエクスペリメンタルな機能であり、変更が予想されます。 +- トランザクション中に例外が発生した場合、そのトランザクションをコミットすることはできません。 これにはすべての例外が含まれ、タイプミスによる `UNKNOWN_FUNCTION` 例外も含まれます。 +- ネストされたトランザクションはサポートされていません; 現在のトランザクションを終了し、新しいトランザクションを開始してください + +### 設定 + +以下は単一ノード ClickHouse サーバで ClickHouse Keeper が有効になっている場合の例です。 + +#### エクスペリメンタルなトランザクションサポートを有効化 + +```xml title=/etc/clickhouse-server/config.d/transactions.xml + + 1 + +``` + +#### ClickHouse Keeper が有効な単一 ClickHouse サーバノードの基本設定 + +:::note +ClickHouse サーバと ClickHouse Keeper ノードの適切なクォーラムの展開に関する詳細は、[展開](docs/en/deployment-guides/terminology.md)ドキュメントを参照してください。ここに示された設定は実験目的のものです。 +::: + +```xml title=/etc/clickhouse-server/config.d/config.xml + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + node 1 + 0.0.0.0 + 8123 + 9000 + + + clickhouse-01 + 9181 + + + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + information + + + + 1 + clickhouse-keeper-01 + 9234 + + + + +``` + +### 例 + +#### エクスペリメンタルトランザクションが有効であることを確認する + +エクスペリメンタルトランザクションが有効であり、トランザクションを追跡するために ClickHouse Keeper が有効であることを確認するために、`BEGIN TRANSACTION` または `START TRANSACTION` に続けて `ROLLBACK` を実行します。 + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +:::tip +次のエラーが表示された場合は、構成ファイルを確認して `allow_experimental_transactions` が `1`(または `0` や `false` 以外の値)に設定されていることを確認してください。 +``` +Code: 48. DB::Exception: Received from localhost:9000. +DB::Exception: Transactions are not supported. +(NOT_IMPLEMENTED) +``` + +ClickHouse Keeper を確認するには、次のコマンドを実行します: +``` +echo ruok | nc localhost 9181 +``` +ClickHouse Keeper は `imok` と返答するはずです。 +::: + +```sql +ROLLBACK +``` +```response +Ok. +``` + +#### テスト用のテーブルを作成する + +:::tip +テーブルの作成はトランザクショナルではありません。この DDL クエリはトランザクション外で実行してください。 +::: + +```sql +CREATE TABLE mergetree_table +( + `n` Int64 +) +ENGINE = MergeTree +ORDER BY n +``` +```response +Ok. +``` + +#### トランザクションを開始して行を挿入する + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +```sql +INSERT INTO mergetree_table FORMAT Values (10) +``` +```response +Ok. +``` + +```sql +SELECT * +FROM mergetree_table +``` +```response +┌──n─┐ +│ 10 │ +└────┘ +``` +:::note +トランザクション内でテーブルをクエリすることで、まだコミットされていなくても行が挿入されたことが確認できます。 +::: + +#### トランザクションをロールバックし、テーブルを再度クエリする + +トランザクションがロールバックされたことを確認します: +```sql +ROLLBACK +``` +```response +Ok. +``` +```sql +SELECT * +FROM mergetree_table +``` +```response +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +#### トランザクションを完了し、再度テーブルをクエリする + +```sql +BEGIN TRANSACTION +``` +```response +Ok. +``` + +```sql +INSERT INTO mergetree_table FORMAT Values (42) +``` +```response +Ok. +``` + +```sql +COMMIT +``` +```response +Ok. Elapsed: 0.002 sec. +``` + +```sql +SELECT * +FROM mergetree_table +``` +```response +┌──n─┐ +│ 42 │ +└────┘ +``` + +### トランザクションの内省 + +`system.transactions` テーブルをクエリすることでトランザクションを調べることができますが、トランザクション内のセッションからそのテーブルをクエリすることはできません。そのテーブルをクエリするために2つ目の `clickhouse client` セッションを開いてください。 + +```sql +SELECT * +FROM system.transactions +FORMAT Vertical +``` +```response +Row 1: +────── +tid: (33,61,'51e60bce-6b82-4732-9e1d-b40705ae9ab8') +tid_hash: 11240433987908122467 +elapsed: 210.017820947 +is_readonly: 1 +state: RUNNING +``` + +## 詳細 + +この[メタ問題](https://github.com/ClickHouse/ClickHouse/issues/48794)を参照して、より詳細なテストを見つけ、進捗を最新に保ってください。 diff --git a/docs/ja/sql-reference/window-functions/dense_rank.md b/docs/ja/sql-reference/window-functions/dense_rank.md new file mode 100644 index 00000000000..abf9aaaf5c7 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/dense_rank.md @@ -0,0 +1,75 @@ +--- +slug: /ja/sql-reference/window-functions/dense_rank +sidebar_label: dense_rank +sidebar_position: 7 +--- + +# dense_rank + +パーティション内の現在の行を、ギャップなしでランク付けします。つまり、新しい行の値が以前の行のいずれかの値と等しい場合、それはランクにギャップがないままに次の連続するランクを取得します。 + +[rank](./rank.md) 関数は同様の動作を提供しますが、ランクにギャップがあります。 + +**構文** + +エイリアス: `denseRank` (大文字小文字区別) + +```sql +dense_rank (column_name) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文の詳細については、[ウィンドウ関数 - 構文](./index.md/#syntax) を参照してください。 + +**返される値** + +- ランクにギャップなしの、パーティション内の現在の行の番号。[UInt64](../data-types/int-uint.md)。 + +**例** + +以下の例は、動画の指導 [Ranking window functions in ClickHouse](https://youtu.be/Yku9mmBYm_4?si=XIMu1jpYucCQEoXA) に基づいています。 + +クエリ: + +```sql +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, + dense_rank() OVER (ORDER BY salary DESC) AS dense_rank +FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─dense_rank─┐ +1. │ Gary Chen │ 195000 │ 1 │ +2. │ Robert George │ 195000 │ 1 │ +3. │ Charles Juarez │ 190000 │ 2 │ +4. │ Michael Stanley │ 150000 │ 3 │ +5. │ Douglas Benson │ 150000 │ 3 │ +6. │ Scott Harrison │ 150000 │ 3 │ +7. │ James Henderson │ 140000 │ 4 │ + └─────────────────┴────────┴────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/first_value.md b/docs/ja/sql-reference/window-functions/first_value.md new file mode 100644 index 00000000000..74c009d3da7 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/first_value.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/window-functions/first_value +sidebar_label: first_value +sidebar_position: 3 +--- + +# first_value + +指定された順序付けられたフレーム内で評価された最初の値を返します。デフォルトでは、NULL 引数はスキップされますが、`RESPECT NULLS` 修飾子を使用することでこの挙動を上書きできます。 + +**構文** + +```sql +first_value (column_name) [[RESPECT NULLS] | [IGNORE NULLS]] + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +エイリアス: `any`. + +:::note +`first_value(column_name)` の後にオプションの修飾子 `RESPECT NULLS` を使用すると、`NULL` 引数がスキップされなくなります。 +詳細は [NULL の処理](../aggregate-functions/index.md/#null-processing) を参照してください。 +::: + +ウィンドウ関数の構文の詳細については、[ウィンドウ関数 - 構文](./index.md/#syntax) を参照してください。 + +**返される値** + +- 指定された順序付けられたフレーム内で評価された最初の値。 + +**例** + +この例では、`first_value` 関数を使って、プレミアリーグの架空のサッカー選手の給与データセットから最も高給の選手を見つけます。 + +クエリ: + +```sql +DROP TABLE IF EXISTS salaries; +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 196000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 100000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 180000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, + first_value(player) OVER (ORDER BY salary DESC) AS highest_paid_player +FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─highest_paid_player─┐ +1. │ Gary Chen │ 196000 │ Gary Chen │ +2. │ Robert George │ 195000 │ Gary Chen │ +3. │ Charles Juarez │ 190000 │ Gary Chen │ +4. │ Scott Harrison │ 180000 │ Gary Chen │ +5. │ Douglas Benson │ 150000 │ Gary Chen │ +6. │ James Henderson │ 140000 │ Gary Chen │ +7. │ Michael Stanley │ 100000 │ Gary Chen │ + └─────────────────┴────────┴─────────────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/index.md b/docs/ja/sql-reference/window-functions/index.md new file mode 100644 index 00000000000..5fee3498e37 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/index.md @@ -0,0 +1,755 @@ +--- +slug: /ja/sql-reference/window-functions/ +sidebar_label: ウィンドウ関数 +sidebar_position: 1 +--- + +# ウィンドウ関数 + +ウィンドウ関数を使用すると、現在の行に関連する一連の行に対して計算を実行できます。これらの計算の一部は集約関数で実行できるものと似ていますが、ウィンドウ関数では行が単一の出力にグループ化されることはなく、個々の行が返され続けます。 + +## 標準ウィンドウ関数 + +ClickHouse はウィンドウとウィンドウ関数を定義するための標準的な文法をサポートしています。以下の表は、機能が現在サポートされているかどうかを示しています。 + +| 機能 | サポート状況 | +|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| アドホックウィンドウ仕様 (`count(*) over (partition by id order by time desc)`) | ✅ | +| ウィンドウ関数を含む式例 (`(count(*) over ()) / 2)`) | ✅ | +| `WINDOW`句 (`select ... from table window w as (partition by id)`) | ✅ | +| `ROWS`フレーム | ✅ | +| `RANGE`フレーム | ✅ (デフォルト) | +| `DateTime` `RANGE OFFSET`フレームの`INTERVAL`構文 | ❌ (代わりに秒数を指定してください(`RANGE`は任意の数値型で動作します)。) | +| `GROUPS`フレーム | ❌ | +| フレームを超える集約関数の計算 (`sum(value) over (order by time)`) | ✅ (すべての集約関数がサポートされます) | +| `rank()`, `dense_rank()`, `row_number()` | ✅
    エイリアス: `denseRank()` | +| `percent_rank()` | ✅ パーティション内での値の相対的な位置を効率的に計算します。この関数は、より冗長で計算集約的な手動SQL計算である`ifNull((rank() OVER(PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER(PARTITION BY x) - 1, 0), 0)`を効果的に置き換えます
    エイリアス: `percentRank()`| +| `lag/lead(value, offset)` | ❌
    次の回避策のいずれかを使用できます:
    1) `any(value) over (.... rows between preceding and preceding)`, または `lead`の場合は`following`
    2) `lagInFrame/leadInFrame`, これらは類似していますが、ウィンドウフレームに従います。`lag/lead`と同じ動作を得るには、`rows between unbounded preceding and unbounded following`を使用してください。 | +| ntile(buckets) | ✅
    ウィンドウを指定します (partition by x order by y rows between unbounded preceding and unbounded following)。 | + +## ClickHouse固有のウィンドウ関数 + +以下のClickHouse固有のウィンドウ関数もあります: + +### nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS]) + +指定された`metric_column`を`timestamp_column`で非負の導関数を見つけます。 +`INTERVAL`は省略可能で、デフォルトは`INTERVAL 1 SECOND`です。 +各行に対して計算される値は以下の通りです: +- `0`は最初の行、 +- ${\text{metric}_i - \text{metric}_{i-1} \over \text{timestamp}_i - \text{timestamp}_{i-1}} * \text{interval}$ は $i_{th}$ 行。 + +## 文法 + +```text +aggregate_function (column_name) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +- `PARTITION BY` - 結果セットをグループに分ける方法を定義します。 +- `ORDER BY` - 集約関数の計算中にグループ内の行を並び替える方法を定義します。 +- `ROWS or RANGE` - フレームの境界を定義し、集約関数はフレーム内で計算されます。 +- `WINDOW` - 複数の式が同じウィンドウ定義を使用できるようにします。 + +```text + PARTITION +┌─────────────────┐ <-- UNBOUNDED PRECEDING (BEGINNING of the PARTITION) +│ │ +│ │ +│=================│ <-- N PRECEDING <─┐ +│ N ROWS │ │ F +│ Before CURRENT │ │ R +│~~~~~~~~~~~~~~~~~│ <-- CURRENT ROW │ A +│ M ROWS │ │ M +│ After CURRENT │ │ E +│=================│ <-- M FOLLOWING <─┘ +│ │ +│ │ +└─────────────────┘ <--- UNBOUNDED FOLLOWING (END of the PARTITION) +``` + +### 関数 + +これらの関数はウィンドウ関数としてのみ使用できます。 + +- [`row_number()`](./row_number.md) - 自身のパーティション内で現在の行を1から番号付けします。 +- [`first_value(x)`](./first_value.md) - 順序付けられたフレーム内で最初に評価された値を返します。 +- [`last_value(x)`](./last_value.md) - 順序付けられたフレーム内で最後に評価された値を返します。 +- [`nth_value(x, offset)`](./nth_value.md) - 順序付けられたフレーム内のnth行(オフセット)で評価された最初の非NULL値を返します。 +- [`rank()`](./rank.md) - ギャップを持つパーティション内で現在の行をランク付けします。 +- [`dense_rank()`](./dense_rank.md) - ギャップなしでパーティション内で現在の行をランク付けします。 +- [`lagInFrame(x)`](./lagInFrame.md) - 順序付けられたフレーム内で現在の行の前の指定された物理オフセット行で評価された値を返します。 +- [`leadInFrame(x)`](./leadInFrame.md) - 順序付けられたフレーム内で現在の行の後のオフセット行で評価された値を返します。 + +## 例 + +ウィンドウ関数がどのように使用されるかをいくつかの例で見てみましょう。 + +### 行の番号付け + +```sql +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'); +``` + +```sql +SELECT player, salary, + row_number() OVER (ORDER BY salary) AS row +FROM salaries; +``` + +```text +┌─player──────────┬─salary─┬─row─┐ +│ Michael Stanley │ 150000 │ 1 │ +│ Scott Harrison │ 150000 │ 2 │ +│ Charles Juarez │ 190000 │ 3 │ +│ Gary Chen │ 195000 │ 4 │ +│ Robert George │ 195000 │ 5 │ +└─────────────────┴────────┴─────┘ +``` + +```sql +SELECT player, salary, + row_number() OVER (ORDER BY salary) AS row, + rank() OVER (ORDER BY salary) AS rank, + dense_rank() OVER (ORDER BY salary) AS denseRank +FROM salaries; +``` + +```text +┌─player──────────┬─salary─┬─row─┬─rank─┬─denseRank─┐ +│ Michael Stanley │ 150000 │ 1 │ 1 │ 1 │ +│ Scott Harrison │ 150000 │ 2 │ 1 │ 1 │ +│ Charles Juarez │ 190000 │ 3 │ 3 │ 2 │ +│ Gary Chen │ 195000 │ 4 │ 4 │ 3 │ +│ Robert George │ 195000 │ 5 │ 4 │ 3 │ +└─────────────────┴────────┴──────┴──────┴───────────┘ +``` + +### 集計関数 + +各プレイヤーの給与をチームの平均と比較します。 + +```sql +SELECT player, salary, team, + avg(salary) OVER (PARTITION BY team) AS teamAvg, + salary - teamAvg AS diff +FROM salaries; +``` + +```text +┌─player──────────┬─salary─┬─team──────────────────────┬─teamAvg─┬───diff─┐ +│ Charles Juarez │ 190000 │ New Coreystad Archdukes │ 170000 │ 20000 │ +│ Scott Harrison │ 150000 │ New Coreystad Archdukes │ 170000 │ -20000 │ +│ Gary Chen │ 195000 │ Port Elizabeth Barbarians │ 180000 │ 15000 │ +│ Michael Stanley │ 150000 │ Port Elizabeth Barbarians │ 180000 │ -30000 │ +│ Robert George │ 195000 │ Port Elizabeth Barbarians │ 180000 │ 15000 │ +└─────────────────┴────────┴───────────────────────────┴─────────┴────────┘ +``` + +各プレイヤーの給与をチームの最大値と比較します。 + +```sql +SELECT player, salary, team, + max(salary) OVER (PARTITION BY team) AS teamAvg, + salary - teamAvg AS diff +FROM salaries; +``` + +```text +┌─player──────────┬─salary─┬─team──────────────────────┬─teamAvg─┬───diff─┐ +│ Charles Juarez │ 190000 │ New Coreystad Archdukes │ 190000 │ 0 │ +│ Scott Harrison │ 150000 │ New Coreystad Archdukes │ 190000 │ -40000 │ +│ Gary Chen │ 195000 │ Port Elizabeth Barbarians │ 195000 │ 0 │ +│ Michael Stanley │ 150000 │ Port Elizabeth Barbarians │ 195000 │ -45000 │ +│ Robert George │ 195000 │ Port Elizabeth Barbarians │ 195000 │ 0 │ +└─────────────────┴────────┴───────────────────────────┴─────────┴────────┘ +``` + +### カラムによるパーティション分割 + +```sql +CREATE TABLE wf_partition +( + `part_key` UInt64, + `value` UInt64, + `order` UInt64 +) +ENGINE = Memory; + +INSERT INTO wf_partition FORMAT Values + (1,1,1), (1,2,2), (1,3,3), (2,0,0), (3,0,0); + +SELECT + part_key, + value, + order, + groupArray(value) OVER (PARTITION BY part_key) AS frame_values +FROM wf_partition +ORDER BY + part_key ASC, + value ASC; + +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1,2,3] │ <┐ +│ 1 │ 2 │ 2 │ [1,2,3] │ │ 1つ目のグループ +│ 1 │ 3 │ 3 │ [1,2,3] │ <┘ +│ 2 │ 0 │ 0 │ [0] │ <- 2つ目のグループ +│ 3 │ 0 │ 0 │ [0] │ <- 3つ目のグループ +└──────────┴───────┴───────┴──────────────┘ +``` + +### フレーム境界設定 + +```sql +CREATE TABLE wf_frame +( + `part_key` UInt64, + `value` UInt64, + `order` UInt64 +) +ENGINE = Memory; + +INSERT INTO wf_frame FORMAT Values + (1,1,1), (1,2,2), (1,3,3), (1,4,4), (1,5,5); +``` + +```sql +-- フレームはパーティションの境界に囲まれています(BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +SELECT + part_key, + value, + order, + groupArray(value) OVER ( + PARTITION BY part_key + ORDER BY order ASC + Rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; + +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1,2,3,4,5] │ +│ 1 │ 2 │ 2 │ [1,2,3,4,5] │ +│ 1 │ 3 │ 3 │ [1,2,3,4,5] │ +│ 1 │ 4 │ 4 │ [1,2,3,4,5] │ +│ 1 │ 5 │ 5 │ [1,2,3,4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- 簡略形式 - 境界式なし、ORDER BYなし +SELECT + part_key, + value, + order, + groupArray(value) OVER (PARTITION BY part_key) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1,2,3,4,5] │ +│ 1 │ 2 │ 2 │ [1,2,3,4,5] │ +│ 1 │ 3 │ 3 │ [1,2,3,4,5] │ +│ 1 │ 4 │ 4 │ [1,2,3,4,5] │ +│ 1 │ 5 │ 5 │ [1,2,3,4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- フレームはパーティションの始まりと現在の行で囲まれています +SELECT + part_key, + value, + order, + groupArray(value) OVER ( + PARTITION BY part_key + ORDER BY order ASC + Rows BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + ) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; + +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1] │ +│ 1 │ 2 │ 2 │ [1,2] │ +│ 1 │ 3 │ 3 │ [1,2,3] │ +│ 1 │ 4 │ 4 │ [1,2,3,4] │ +│ 1 │ 5 │ 5 │ [1,2,3,4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- 簡略形式(フレームはパーティションの始まりと現在の行で囲まれています) +SELECT + part_key, + value, + order, + groupArray(value) OVER (PARTITION BY part_key ORDER BY order ASC) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1] │ +│ 1 │ 2 │ 2 │ [1,2] │ +│ 1 │ 3 │ 3 │ [1,2,3] │ +│ 1 │ 4 │ 4 │ [1,2,3,4] │ +│ 1 │ 5 │ 5 │ [1,2,3,4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- フレームはパーティションの始まりと現在の行で囲まれていますが、順序が逆です +SELECT + part_key, + value, + order, + groupArray(value) OVER (PARTITION BY part_key ORDER BY order DESC) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [5,4,3,2,1] │ +│ 1 │ 2 │ 2 │ [5,4,3,2] │ +│ 1 │ 3 │ 3 │ [5,4,3] │ +│ 1 │ 4 │ 4 │ [5,4] │ +│ 1 │ 5 │ 5 │ [5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- スライディングフレーム - 1つ前の行と現在の行 +SELECT + part_key, + value, + order, + groupArray(value) OVER ( + PARTITION BY part_key + ORDER BY order ASC + Rows BETWEEN 1 PRECEDING AND CURRENT ROW + ) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; + +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1] │ +│ 1 │ 2 │ 2 │ [1,2] │ +│ 1 │ 3 │ 3 │ [2,3] │ +│ 1 │ 4 │ 4 │ [3,4] │ +│ 1 │ 5 │ 5 │ [4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- スライディングフレーム - `Rows BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING` +SELECT + part_key, + value, + order, + groupArray(value) OVER ( + PARTITION BY part_key + ORDER BY order ASC + Rows BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING + ) AS frame_values +FROM wf_frame +ORDER BY + part_key ASC, + value ASC; +┌─part_key─┬─value─┬─order─┬─frame_values─┐ +│ 1 │ 1 │ 1 │ [1,2,3,4,5] │ +│ 1 │ 2 │ 2 │ [1,2,3,4,5] │ +│ 1 │ 3 │ 3 │ [2,3,4,5] │ +│ 1 │ 4 │ 4 │ [3,4,5] │ +│ 1 │ 5 │ 5 │ [4,5] │ +└──────────┴───────┴───────┴──────────────┘ +``` + +```sql +-- `row_number`はフレームを尊重しないため、`rn_1 = rn_2 = rn_3 != rn_4` +SELECT + part_key, + value, + order, + groupArray(value) OVER w1 AS frame_values, + row_number() OVER w1 AS rn_1, + sum(1) OVER w1 AS rn_2, + row_number() OVER w2 AS rn_3, + sum(1) OVER w2 AS rn_4 +FROM wf_frame +WINDOW + w1 AS (PARTITION BY part_key ORDER BY order DESC), + w2 AS ( + PARTITION BY part_key + ORDER BY order DESC + Rows BETWEEN 1 PRECEDING AND CURRENT ROW + ) +ORDER BY + part_key ASC, + value ASC; +┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐ +│ 1 │ 1 │ 1 │ [5,4,3,2,1] │ 5 │ 5 │ 5 │ 2 │ +│ 1 │ 2 │ 2 │ [5,4,3,2] │ 4 │ 4 │ 4 │ 2 │ +│ 1 │ 3 │ 3 │ [5,4,3] │ 3 │ 3 │ 3 │ 2 │ +│ 1 │ 4 │ 4 │ [5,4] │ 2 │ 2 │ 2 │ 2 │ +│ 1 │ 5 │ 5 │ [5] │ 1 │ 1 │ 1 │ 1 │ +└──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘ +``` + +```sql +-- `first_value`と`last_value`はフレームを尊重します +SELECT + groupArray(value) OVER w1 AS frame_values_1, + first_value(value) OVER w1 AS first_value_1, + last_value(value) OVER w1 AS last_value_1, + groupArray(value) OVER w2 AS frame_values_2, + first_value(value) OVER w2 AS first_value_2, + last_value(value) OVER w2 AS last_value_2 +FROM wf_frame +WINDOW + w1 AS (PARTITION BY part_key ORDER BY order ASC), + w2 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 1 PRECEDING AND CURRENT ROW) +ORDER BY + part_key ASC, + value ASC; +┌─frame_values_1─┬─first_value_1─┬─last_value_1─┬─frame_values_2─┬─first_value_2─┬─last_value_2─┐ +│ [1] │ 1 │ 1 │ [1] │ 1 │ 1 │ +│ [1,2] │ 1 │ 2 │ [1,2] │ 1 │ 2 │ +│ [1,2,3] │ 1 │ 3 │ [2,3] │ 2 │ 3 │ +│ [1,2,3,4] │ 1 │ 4 │ [3,4] │ 3 │ 4 │ +│ [1,2,3,4,5] │ 1 │ 5 │ [4,5] │ 4 │ 5 │ +└────────────────┴───────────────┴──────────────┴────────────────┴───────────────┴──────────────┘ +``` + +```sql +-- フレーム内の2番目の値 +SELECT + groupArray(value) OVER w1 AS frame_values_1, + nth_value(value, 2) OVER w1 AS second_value +FROM wf_frame +WINDOW w1 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 3 PRECEDING AND CURRENT ROW) +ORDER BY + part_key ASC, + value ASC +┌─frame_values_1─┬─second_value─┐ +│ [1] │ 0 │ +│ [1,2] │ 2 │ +│ [1,2,3] │ 2 │ +│ [1,2,3,4] │ 2 │ +│ [2,3,4,5] │ 3 │ +└────────────────┴──────────────┘ +``` + +```sql +-- フレーム内の2番目の値 + 欠落値へのNull +SELECT + groupArray(value) OVER w1 AS frame_values_1, + nth_value(toNullable(value), 2) OVER w1 AS second_value +FROM wf_frame +WINDOW w1 AS (PARTITION BY part_key ORDER BY order ASC Rows BETWEEN 3 PRECEDING AND CURRENT ROW) +ORDER BY + part_key ASC, + value ASC +┌─frame_values_1─┬─second_value─┐ +│ [1] │ ᴺᵁᴸᴸ │ +│ [1,2] │ 2 │ +│ [1,2,3] │ 2 │ +│ [1,2,3,4] │ 2 │ +│ [2,3,4,5] │ 3 │ +└────────────────┴──────────────┘ +``` + +## 現実の例 + +以下は一般的な現実の問題を解決する例です。 + +### 部署別の最大給与/合計給与 + +```sql +CREATE TABLE employees +( + `department` String, + `employee_name` String, + `salary` Float +) +ENGINE = Memory; + +INSERT INTO employees FORMAT Values + ('Finance', 'Jonh', 200), + ('Finance', 'Joan', 210), + ('Finance', 'Jean', 505), + ('IT', 'Tim', 200), + ('IT', 'Anna', 300), + ('IT', 'Elen', 500); +``` + +```sql +SELECT + department, + employee_name AS emp, + salary, + max_salary_per_dep, + total_salary_per_dep, + round((salary / total_salary_per_dep) * 100, 2) AS `share_per_dep(%)` +FROM +( + SELECT + department, + employee_name, + salary, + max(salary) OVER wndw AS max_salary_per_dep, + sum(salary) OVER wndw AS total_salary_per_dep + FROM employees + WINDOW wndw AS ( + PARTITION BY department + rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) + ORDER BY + department ASC, + employee_name ASC +); + +┌─department─┬─emp──┬─salary─┬─max_salary_per_dep─┬─total_salary_per_dep─┬─share_per_dep(%)─┐ +│ Finance │ Jean │ 505 │ 505 │ 915 │ 55.19 │ +│ Finance │ Joan │ 210 │ 505 │ 915 │ 22.95 │ +│ Finance │ Jonh │ 200 │ 505 │ 915 │ 21.86 │ +│ IT │ Anna │ 300 │ 500 │ 1000 │ 30 │ +│ IT │ Elen │ 500 │ 500 │ 1000 │ 50 │ +│ IT │ Tim │ 200 │ 500 │ 1000 │ 20 │ +└────────────┴──────┴────────┴────────────────────┴──────────────────────┴──────────────────┘ +``` + +### 累積和 + +```sql +CREATE TABLE warehouse +( + `item` String, + `ts` DateTime, + `value` Float +) +ENGINE = Memory + +INSERT INTO warehouse VALUES + ('sku38', '2020-01-01', 9), + ('sku38', '2020-02-01', 1), + ('sku38', '2020-03-01', -4), + ('sku1', '2020-01-01', 1), + ('sku1', '2020-02-01', 1), + ('sku1', '2020-03-01', 1); +``` + +```sql +SELECT + item, + ts, + value, + sum(value) OVER (PARTITION BY item ORDER BY ts ASC) AS stock_balance +FROM warehouse +ORDER BY + item ASC, + ts ASC; + +┌─item──┬──────────────────ts─┬─value─┬─stock_balance─┐ +│ sku1 │ 2020-01-01 00:00:00 │ 1 │ 1 │ +│ sku1 │ 2020-02-01 00:00:00 │ 1 │ 2 │ +│ sku1 │ 2020-03-01 00:00:00 │ 1 │ 3 │ +│ sku38 │ 2020-01-01 00:00:00 │ 9 │ 9 │ +│ sku38 │ 2020-02-01 00:00:00 │ 1 │ 10 │ +│ sku38 │ 2020-03-01 00:00:00 │ -4 │ 6 │ +└───────┴─────────────────────┴───────┴───────────────┘ +``` + +### 移動・スライディング平均 (3行ごと) + +```sql +CREATE TABLE sensors +( + `metric` String, + `ts` DateTime, + `value` Float +) +ENGINE = Memory; + +insert into sensors values('cpu_temp', '2020-01-01 00:00:00', 87), + ('cpu_temp', '2020-01-01 00:00:01', 77), + ('cpu_temp', '2020-01-01 00:00:02', 93), + ('cpu_temp', '2020-01-01 00:00:03', 87), + ('cpu_temp', '2020-01-01 00:00:04', 87), + ('cpu_temp', '2020-01-01 00:00:05', 87), + ('cpu_temp', '2020-01-01 00:00:06', 87), + ('cpu_temp', '2020-01-01 00:00:07', 87); +``` + +```sql +SELECT + metric, + ts, + value, + avg(value) OVER ( + PARTITION BY metric + ORDER BY ts ASC + Rows BETWEEN 2 PRECEDING AND CURRENT ROW + ) AS moving_avg_temp +FROM sensors +ORDER BY + metric ASC, + ts ASC; + +┌─metric───┬──────────────────ts─┬─value─┬───moving_avg_temp─┐ +│ cpu_temp │ 2020-01-01 00:00:00 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:00:01 │ 77 │ 82 │ +│ cpu_temp │ 2020-01-01 00:00:02 │ 93 │ 85.66666666666667 │ +│ cpu_temp │ 2020-01-01 00:00:03 │ 87 │ 85.66666666666667 │ +│ cpu_temp │ 2020-01-01 00:00:04 │ 87 │ 89 │ +│ cpu_temp │ 2020-01-01 00:00:05 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:00:06 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:00:07 │ 87 │ 87 │ +└──────────┴─────────────────────┴───────┴───────────────────┘ +``` + +### 移動・スライディング平均 (10秒ごと) + +```sql +SELECT + metric, + ts, + value, + avg(value) OVER (PARTITION BY metric ORDER BY ts + Range BETWEEN 10 PRECEDING AND CURRENT ROW) AS moving_avg_10_seconds_temp +FROM sensors +ORDER BY + metric ASC, + ts ASC; + +┌─metric───┬──────────────────ts─┬─value─┬─moving_avg_10_seconds_temp─┐ +│ cpu_temp │ 2020-01-01 00:00:00 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:01:10 │ 77 │ 77 │ +│ cpu_temp │ 2020-01-01 00:02:20 │ 93 │ 93 │ +│ cpu_temp │ 2020-01-01 00:03:30 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:04:40 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:05:50 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:06:00 │ 87 │ 87 │ +│ cpu_temp │ 2020-01-01 00:07:10 │ 87 │ 87 │ +└──────────┴─────────────────────┴───────┴────────────────────────────┘ +``` + +### 移動・スライディング平均 (10日ごと) + +温度は秒単位で保存されますが、`Range`と`ORDER BY toDate(ts)`を使用することで、10単位のサイズのフレームを形成します。`toDate(ts)`を使用しているため、単位は日です。 + +```sql +CREATE TABLE sensors +( + `metric` String, + `ts` DateTime, + `value` Float +) +ENGINE = Memory; + +insert into sensors values('ambient_temp', '2020-01-01 00:00:00', 16), + ('ambient_temp', '2020-01-01 12:00:00', 16), + ('ambient_temp', '2020-01-02 11:00:00', 9), + ('ambient_temp', '2020-01-02 12:00:00', 9), + ('ambient_temp', '2020-02-01 10:00:00', 10), + ('ambient_temp', '2020-02-01 12:00:00', 10), + ('ambient_temp', '2020-02-10 12:00:00', 12), + ('ambient_temp', '2020-02-10 13:00:00', 12), + ('ambient_temp', '2020-02-20 12:00:01', 16), + ('ambient_temp', '2020-03-01 12:00:00', 16), + ('ambient_temp', '2020-03-01 12:00:00', 16), + ('ambient_temp', '2020-03-01 12:00:00', 16); +``` + +```sql +SELECT + metric, + ts, + value, + round(avg(value) OVER (PARTITION BY metric ORDER BY toDate(ts) + Range BETWEEN 10 PRECEDING AND CURRENT ROW),2) AS moving_avg_10_days_temp +FROM sensors +ORDER BY + metric ASC, + ts ASC; + +┌─metric───────┬──────────────────ts─┬─value─┬─moving_avg_10_days_temp─┐ +│ ambient_temp │ 2020-01-01 00:00:00 │ 16 │ 16 │ +│ ambient_temp │ 2020-01-01 12:00:00 │ 16 │ 16 │ +│ ambient_temp │ 2020-01-02 11:00:00 │ 9 │ 12.5 │ +│ ambient_temp │ 2020-01-02 12:00:00 │ 9 │ 12.5 │ +│ ambient_temp │ 2020-02-01 10:00:00 │ 10 │ 10 │ +│ ambient_temp │ 2020-02-01 12:00:00 │ 10 │ 10 │ +│ ambient_temp │ 2020-02-10 12:00:00 │ 12 │ 11 │ +│ ambient_temp │ 2020-02-10 13:00:00 │ 12 │ 11 │ +│ ambient_temp │ 2020-02-20 12:00:01 │ 16 │ 13.33 │ +│ ambient_temp │ 2020-03-01 12:00:00 │ 16 │ 16 │ +│ ambient_temp │ 2020-03-01 12:00:00 │ 16 │ 16 │ +│ ambient_temp │ 2020-03-01 12:00:00 │ 16 │ 16 │ +└──────────────┴─────────────────────┴───────┴─────────────────────────┘ +``` + +## 参考文献 + +### GitHub Issues + +ウィンドウ関数の初期サポートのロードマップは[この問題](https://github.com/ClickHouse/ClickHouse/issues/18097)にあります。 + +ウィンドウ関数に関連するすべてのGitHubの問題は[comp-window-functions](https://github.com/ClickHouse/ClickHouse/labels/comp-window-functions)タグが付いています。 + +### テスト + +これらのテストは現在サポートされている文法の例を含んでいます: + +https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml + +https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql + +### Postgres Docs + +https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW + +https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS + +https://www.postgresql.org/docs/devel/functions-window.html + +https://www.postgresql.org/docs/devel/tutorial-window.html + +### MySQL Docs + +https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html + +https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html + +https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html + + +## 関連コンテンツ + +- ブログ: [ClickHouseでの時系列データの操作](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) +- ブログ: [Gitコミットシーケンスのためのウィンドウと配列関数](https://clickhouse.com/blog/clickhouse-window-array-functions-git-commits) +- ブログ: [ClickHouseへのデータインポート - Part 3 - S3の使用](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3) diff --git a/docs/ja/sql-reference/window-functions/lagInFrame.md b/docs/ja/sql-reference/window-functions/lagInFrame.md new file mode 100644 index 00000000000..3e58dea606f --- /dev/null +++ b/docs/ja/sql-reference/window-functions/lagInFrame.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/window-functions/lagInFrame +sidebar_label: lagInFrame +sidebar_position: 9 +--- + +# lagInFrame + +順序付けられたフレーム内で現在の行の前に指定された物理的なオフセット行にある評価された値を返します。 + +**構文** + +```sql +lagInFrame(x[, offset[, default]]) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS または RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文の詳細については以下を参照してください: [ウィンドウ関数 - 構文](./index.md/#syntax). + +**パラメータ** +- `x` — カラム名。 +- `offset` — 適用するオフセット。[(U)Int*](../data-types/int-uint.md)。 (オプション - デフォルトで `1`)。 +- `default` — 計算された行がウィンドウフレームの境界を超えた場合に返される値。 (オプション - 省略時はカラムタイプのデフォルト値)。 + +**返される値** + +- 順序付けられたフレーム内で現在の行の前に指定された物理的なオフセット行にある評価された値。 + +**例** + +この例では特定の株式の過去データを見て、`lagInFrame` 関数を使用して株価の終値の日々の変化と変化率を計算します。 + +クエリ: + +```sql +CREATE TABLE stock_prices +( + `date` Date, + `open` Float32, -- 始値 + `high` Float32, -- 日中高値 + `low` Float32, -- 日中安値 + `close` Float32, -- 終値 + `volume` UInt32 -- 取引量 +) +Engine = Memory; + +INSERT INTO stock_prices FORMAT Values + ('2024-06-03', 113.62, 115.00, 112.00, 115.00, 438392000), + ('2024-06-04', 115.72, 116.60, 114.04, 116.44, 403324000), + ('2024-06-05', 118.37, 122.45, 117.47, 122.44, 528402000), + ('2024-06-06', 124.05, 125.59, 118.32, 121.00, 664696000), + ('2024-06-07', 119.77, 121.69, 118.02, 120.89, 412386000); +``` + +```sql +SELECT + date, + close, + lagInFrame(close, 1, close) OVER (ORDER BY date ASC) AS previous_day_close, + COALESCE(ROUND(close - previous_day_close, 2)) AS delta, + COALESCE(ROUND((delta / previous_day_close) * 100, 2)) AS percent_change +FROM stock_prices +ORDER BY date DESC; +``` + +結果: + +```response + ┌───────date─┬──close─┬─previous_day_close─┬─delta─┬─percent_change─┐ +1. │ 2024-06-07 │ 120.89 │ 121 │ -0.11 │ -0.09 │ +2. │ 2024-06-06 │ 121 │ 122.44 │ -1.44 │ -1.18 │ +3. │ 2024-06-05 │ 122.44 │ 116.44 │ 6 │ 5.15 │ +4. │ 2024-06-04 │ 116.44 │ 115 │ 1.44 │ 1.25 │ +5. │ 2024-06-03 │ 115 │ 115 │ 0 │ 0 │ + └────────────┴────────┴────────────────────┴───────┴────────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/last_value.md b/docs/ja/sql-reference/window-functions/last_value.md new file mode 100644 index 00000000000..dbc1422584e --- /dev/null +++ b/docs/ja/sql-reference/window-functions/last_value.md @@ -0,0 +1,79 @@ +--- +slug: /ja/sql-reference/window-functions/last_value +sidebar_label: last_value +sidebar_position: 4 +--- + +# last_value + +その順序付けられた枠内で評価された最後の値を返します。デフォルトでは、NULL 引数はスキップされますが、`RESPECT NULLS` 修飾子を使用することでこの動作を上書きできます。 + +**構文** + +```sql +last_value (column_name) [[RESPECT NULLS] | [IGNORE NULLS]] + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +別名: `anyLast`. + +:::note +`first_value(column_name)` の後にオプションの修飾子 `RESPECT NULLS` を使用すると、`NULL` 引数がスキップされないようになります。 +詳細については、[NULL 処理](../aggregate-functions/index.md/#null-processing)を参照してください。 +::: + +ウィンドウ関数構文の詳細については、[ウィンドウ関数 - 構文](./index.md/#syntax)を参照してください。 + +**返される値** + +- その順序付けられた枠内で評価された最後の値。 + +**例** + +この例では、`last_value` 関数を使用して、プレミアリーグのサッカー選手の架空の給料データセットから最高給料の選手を見つけます。 + +クエリ: + +```sql +DROP TABLE IF EXISTS salaries; +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 196000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 100000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 180000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, + last_value(player) OVER (ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lowest_paid_player +FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─lowest_paid_player─┐ +1. │ Gary Chen │ 196000 │ Michael Stanley │ +2. │ Robert George │ 195000 │ Michael Stanley │ +3. │ Charles Juarez │ 190000 │ Michael Stanley │ +4. │ Scott Harrison │ 180000 │ Michael Stanley │ +5. │ Douglas Benson │ 150000 │ Michael Stanley │ +6. │ James Henderson │ 140000 │ Michael Stanley │ +7. │ Michael Stanley │ 100000 │ Michael Stanley │ + └─────────────────┴────────┴────────────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/leadInFrame.md b/docs/ja/sql-reference/window-functions/leadInFrame.md new file mode 100644 index 00000000000..e213a30cbf3 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/leadInFrame.md @@ -0,0 +1,60 @@ +--- +slug: /ja/sql-reference/window-functions/leadInFrame +sidebar_label: leadInFrame +sidebar_position: 10 +--- + +# leadInFrame + +順序付けられたフレーム内で、現在の行の後にあるオフセット行に評価された値を返します。 + +**構文** + +```sql +leadInFrame(x[, offset[, default]]) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文の詳細については、[ウィンドウ関数 - 構文](./index.md/#syntax) を参照してください。 + +**パラメーター** +- `x` — カラム名。 +- `offset` — 適用するオフセット。[(U)Int*](../data-types/int-uint.md)。 (省略可能 - デフォルトは `1`)。 +- `default` — 計算された行がウィンドウフレームの境界を超えた場合に返す値。 (省略可能 - 省略時はカラムタイプのデフォルト値)。 + +**返される値** + +- 順序付けられたフレーム内で、現在の行の後にあるオフセット行に評価された値。 + +**例** + +この例では、ノーベル賞受賞者の[歴史データ](https://www.kaggle.com/datasets/sazidthe1/nobel-prize-data)を調査し、`leadInFrame` 関数を使用して物理学カテゴリーの連続した受賞者のリストを返します。 + +クエリ: + +```sql +CREATE OR REPLACE VIEW nobel_prize_laureates AS FROM file('nobel_laureates_data.csv') SELECT *; +``` + +```sql +FROM nobel_prize_laureates SELECT fullName, leadInFrame(year, 1, year) OVER (PARTITION BY category ORDER BY year) AS year, category, motivation WHERE category == 'physics' ORDER BY year DESC LIMIT 9; +``` + +結果: + +```response + ┌─fullName─────────┬─year─┬─category─┬─motivation─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +1. │ Pierre Agostini │ 2023 │ physics │ for experimental methods that generate attosecond pulses of light for the study of electron dynamics in matter │ +2. │ Ferenc Krausz │ 2023 │ physics │ for experimental methods that generate attosecond pulses of light for the study of electron dynamics in matter │ +3. │ Anne L Huillier │ 2023 │ physics │ for experimental methods that generate attosecond pulses of light for the study of electron dynamics in matter │ +4. │ Alain Aspect │ 2022 │ physics │ for experiments with entangled photons establishing the violation of Bell inequalities and pioneering quantum information science │ +5. │ Anton Zeilinger │ 2022 │ physics │ for experiments with entangled photons establishing the violation of Bell inequalities and pioneering quantum information science │ +6. │ John Clauser │ 2022 │ physics │ for experiments with entangled photons establishing the violation of Bell inequalities and pioneering quantum information science │ +7. │ Syukuro Manabe │ 2021 │ physics │ for the physical modelling of Earths climate quantifying variability and reliably predicting global warming │ +8. │ Klaus Hasselmann │ 2021 │ physics │ for the physical modelling of Earths climate quantifying variability and reliably predicting global warming │ +9. │ Giorgio Parisi │ 2021 │ physics │ for the discovery of the interplay of disorder and fluctuations in physical systems from atomic to planetary scales │ + └──────────────────┴──────┴──────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/nth_value.md b/docs/ja/sql-reference/window-functions/nth_value.md new file mode 100644 index 00000000000..28e004c37cd --- /dev/null +++ b/docs/ja/sql-reference/window-functions/nth_value.md @@ -0,0 +1,75 @@ +--- +slug: /ja/sql-reference/window-functions/nth_value +sidebar_label: nth_value +sidebar_position: 5 +--- + +# nth_value + +順序付けられたフレーム内の nth 行(オフセット)に対して評価された最初の非NULL値を返します。 + +**構文** + +```sql +nth_value (x, offset) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文についての詳細は次を参照してください: [Window Functions - Syntax](./index.md/#syntax). + +**パラメータ** + +- `x` — カラム名。 +- `offset` — 現在の行を評価するための nth 行。 + +**返される値** + +- 順序付けられたフレーム内の nth 行(オフセット)に対して評価された最初の非NULL値。 + +**例** + +この例では、`nth_value` 関数を使用して、プレミアリーグのサッカー選手の架空の給与データセットから3番目に高い給与を見つけます。 + +クエリ: + +```sql +DROP TABLE IF EXISTS salaries; +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 100000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 180000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, nth_value(player,3) OVER(ORDER BY salary DESC) AS third_highest_salary FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─third_highest_salary─┐ +1. │ Gary Chen │ 195000 │ │ +2. │ Robert George │ 195000 │ │ +3. │ Charles Juarez │ 190000 │ Charles Juarez │ +4. │ Scott Harrison │ 180000 │ Charles Juarez │ +5. │ Douglas Benson │ 150000 │ Charles Juarez │ +6. │ James Henderson │ 140000 │ Charles Juarez │ +7. │ Michael Stanley │ 100000 │ Charles Juarez │ + └─────────────────┴────────┴──────────────────────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/percent_rank.md b/docs/ja/sql-reference/window-functions/percent_rank.md new file mode 100644 index 00000000000..e310b2ee753 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/percent_rank.md @@ -0,0 +1,72 @@ +--- +slug: /ja/sql-reference/window-functions/percent_rank +sidebar_label: percent_rank +sidebar_position: 8 +--- + +# percent_rank + +行の相対的な順位(すなわちパーセンタイル)をウィンドウパーティション内で返します。 + +**構文** + +別名: `percentRank`(大文字小文字を区別) + +```sql +percent_rank (column_name) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING]] | [window_name]) +FROM table_name +WINDOW window_name as ([PARTITION BY grouping_column] [ORDER BY sorting_column] RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +``` + +デフォルトで必要なウィンドウフレーム定義は `RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING` です。 + +ウィンドウ関数の構文の詳細については、こちらを参照してください: [ウィンドウ関数 - 構文](./index.md/#syntax)。 + +**例** + +クエリ: + +```sql +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, + percent_rank() OVER (ORDER BY salary DESC) AS percent_rank +FROM salaries; +``` + +結果: + +```response + + ┌─player──────────┬─salary─┬───────percent_rank─┐ +1. │ Gary Chen │ 195000 │ 0 │ +2. │ Robert George │ 195000 │ 0 │ +3. │ Charles Juarez │ 190000 │ 0.3333333333333333 │ +4. │ Michael Stanley │ 150000 │ 0.5 │ +5. │ Scott Harrison │ 150000 │ 0.5 │ +6. │ Douglas Benson │ 150000 │ 0.5 │ +7. │ James Henderson │ 140000 │ 1 │ + └─────────────────┴────────┴────────────────────┘ + +``` + diff --git a/docs/ja/sql-reference/window-functions/rank.md b/docs/ja/sql-reference/window-functions/rank.md new file mode 100644 index 00000000000..afa90930c87 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/rank.md @@ -0,0 +1,73 @@ +--- +slug: /ja/sql-reference/window-functions/rank +sidebar_label: rank +sidebar_position: 6 +--- + +# rank + +現在の行をそのパーティション内でギャップを持ってランク付けします。言い換えれば、処理中の行の値が以前の行と等しい場合、それらは同じランクを受け取ります。次の行のランクは、前の行のランクに、前のランクが与えられた回数分のギャップを加えたものになります。 + +[dense_rank](./dense_rank.md)関数は、ランク付けにギャップがない同じ動作を提供します。 + +**構文** + +```sql +rank (column_name) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS または RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文の詳細については、[ウィンドウ関数 - 構文](./index.md/#syntax)を参照してください。 + +**戻り値** + +- ギャップを含む、パーティション内の現在の行の番号。[UInt64](../data-types/int-uint.md)。 + +**例** + +以下の例は、動画インストラクション[ClickHouseにおけるランキングウィンドウ関数](https://youtu.be/Yku9mmBYm_4?si=XIMu1jpYucCQEoXA)で提供された例に基づいています。 + +クエリ: + +```sql +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'), + ('South Hampton Seagulls', 'Douglas Benson', 150000, 'M'), + ('South Hampton Seagulls', 'James Henderson', 140000, 'M'); +``` + +```sql +SELECT player, salary, + rank() OVER (ORDER BY salary DESC) AS rank +FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─rank─┐ +1. │ Gary Chen │ 195000 │ 1 │ +2. │ Robert George │ 195000 │ 1 │ +3. │ Charles Juarez │ 190000 │ 3 │ +4. │ Douglas Benson │ 150000 │ 4 │ +5. │ Michael Stanley │ 150000 │ 4 │ +6. │ Scott Harrison │ 150000 │ 4 │ +7. │ James Henderson │ 140000 │ 7 │ + └─────────────────┴────────┴──────┘ +``` diff --git a/docs/ja/sql-reference/window-functions/row_number.md b/docs/ja/sql-reference/window-functions/row_number.md new file mode 100644 index 00000000000..3b6c1de0563 --- /dev/null +++ b/docs/ja/sql-reference/window-functions/row_number.md @@ -0,0 +1,67 @@ +--- +slug: /ja/sql-reference/window-functions/row_number +sidebar_label: row_number +sidebar_position: 2 +--- + +# row_number + +行をそのパーティション内で1から順番に番号付けします。 + +**構文** + +```sql +row_number (column_name) + OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column] + [ROWS or RANGE expression_to_bound_rows_withing_the_group]] | [window_name]) +FROM table_name +WINDOW window_name as ([[PARTITION BY grouping_column] [ORDER BY sorting_column]) +``` + +ウィンドウ関数の構文についての詳細は、[Window Functions - Syntax](./index.md/#syntax) を参照してください。 + +**返される値** + +- パーティション内の現在の行の番号。[UInt64](../data-types/int-uint.md)。 + +**例** + +以下の例は、ビデオ教材 [Ranking window functions in ClickHouse](https://youtu.be/Yku9mmBYm_4?si=XIMu1jpYucCQEoXA) で提供されている例に基づいています。 + +クエリ: + +```sql +CREATE TABLE salaries +( + `team` String, + `player` String, + `salary` UInt32, + `position` String +) +Engine = Memory; + +INSERT INTO salaries FORMAT Values + ('Port Elizabeth Barbarians', 'Gary Chen', 195000, 'F'), + ('New Coreystad Archdukes', 'Charles Juarez', 190000, 'F'), + ('Port Elizabeth Barbarians', 'Michael Stanley', 150000, 'D'), + ('New Coreystad Archdukes', 'Scott Harrison', 150000, 'D'), + ('Port Elizabeth Barbarians', 'Robert George', 195000, 'M'); +``` + +```sql +SELECT player, salary, + row_number() OVER (ORDER BY salary DESC) AS row_number +FROM salaries; +``` + +結果: + +```response + ┌─player──────────┬─salary─┬─row_number─┐ +1. │ Gary Chen │ 195000 │ 1 │ +2. │ Robert George │ 195000 │ 2 │ +3. │ Charles Juarez │ 190000 │ 3 │ +4. │ Scott Harrison │ 150000 │ 4 │ +5. │ Michael Stanley │ 150000 │ 5 │ + └─────────────────┴────────┴────────────┘ +``` diff --git a/docs/ja/tools-and-utilities/static-files-disk-uploader.md b/docs/ja/tools-and-utilities/static-files-disk-uploader.md new file mode 100644 index 00000000000..1ee43da9ff3 --- /dev/null +++ b/docs/ja/tools-and-utilities/static-files-disk-uploader.md @@ -0,0 +1,82 @@ +--- +slug: /ja/operations/utilities/static-files-disk-uploader +title: clickhouse-static-files-disk-uploader +keywords: [clickhouse-static-files-disk-uploader, ユーティリティ, ディスク, アップローダー] +--- + +# clickhouse-static-files-disk-uploader + +指定された ClickHouse テーブル用のメタデータを含むデータディレクトリを出力します。このメタデータは、`web` ディスクによってバックアップされた読み取り専用データセットを含む ClickHouse テーブルを異なるサーバーで作成するために使用できます。 + +データの移行にはこのツールを使用しないでください。代わりに、[`BACKUP` と `RESTORE` コマンド](/docs/ja/operations/backup)を使用してください。 + +## 使用法 + +``` +$ clickhouse static-files-disk-uploader [args] +``` + +## コマンド + +|コマンド|説明| +|---|---| +|`-h`, `--help`|ヘルプ情報を表示| +|`--metadata-path [path]`|指定されたテーブルのメタデータを含むパス| +|`--test-mode`|`test` モードを有効にし、テーブルメタデータを指定された URL に PUT リクエストとして送信| +|`--link`|ファイルをコピーする代わりに symlink を作成| +|`--url [url]`|`test` モード用のウェブサーバー URL| +|`--output-dir [dir]`|`non-test` モードでファイルを出力するディレクトリ| + +## 指定されたテーブルのメタデータパスを取得する + +`clickhouse-static-files-disk-uploader` を使用する際には、目的のテーブルのメタデータパスを取得する必要があります。 + +1. 目的のテーブルとデータベースを指定して、次のクエリを実行します: + +
    + +```sql +SELECT data_paths + FROM system.tables + WHERE name = 'mytable' AND database = 'default'; +``` + +2. これにより、指定されたテーブルのデータディレクトリへのパスが返されます: + +
    + +``` +┌─data_paths────────────────────────────────────────────┐ +│ ['./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/'] │ +└───────────────────────────────────────────────────────┘ +``` + +## ローカルファイルシステムにテーブルメタデータディレクトリを出力する + +ターゲット出力ディレクトリ `output` と指定されたメタデータパスを使用して、次のコマンドを実行します: + +``` +$ clickhouse static-files-disk-uploader --output-dir output --metadata-path ./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/ +``` + +成功した場合、次のメッセージが表示され、`output` ディレクトリに指定されたテーブルのメタデータが含まれているはずです: + +``` +Data path: "/Users/john/store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee", destination path: "output" +``` + +## 外部 URL にテーブルメタデータディレクトリを出力する + +このステップは、データディレクトリをローカルファイルシステムに出力する場合と似ていますが、 追加で `--test-mode` フラグを使用します。出力ディレクトリを指定する代わりに、`--url` フラグを介してターゲット URL を指定する必要があります。 + +`test` モードが有効になっている場合、テーブルメタデータディレクトリが指定された URL に PUT リクエストとしてアップロードされます。 + +``` +$ clickhouse static-files-disk-uploader --test-mode --url http://nginx:80/test1 --metadata-path ./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/ +``` + +## テーブルメタデータディレクトリを使用して ClickHouse テーブルを作成する + +テーブルメタデータディレクトリを手に入れたら、それを使用して異なるサーバーで ClickHouse テーブルを作成できます。 + +デモを示す [この GitHub リポジトリ](https://github.com/ClickHouse/web-tables-demo)をご覧ください。例では、`web` ディスクを使用してテーブルを作成し、異なるサーバー上のデータセットにテーブルをアタッチします。 diff --git a/docs/ja/tutorial.md b/docs/ja/tutorial.md new file mode 100644 index 00000000000..d957de8ea21 --- /dev/null +++ b/docs/ja/tutorial.md @@ -0,0 +1,495 @@ +--- +slug: /ja/tutorial +sidebar_label: 高度なチュートリアル +sidebar_position: 0.5 +keywords: [clickhouse, install, tutorial, dictionary, dictionaries] +--- +import SQLConsoleDetail from '@site/docs/ja/_snippets/_launch_sql_console.md'; + +# 高度なチュートリアル + +## このチュートリアルから何を期待できますか? + +このチュートリアルでは、テーブルを作成し、大規模なデータセット(二百万行の[ニューヨークのタクシーデータ](/docs/ja/getting-started/example-datasets/nyc-taxi.md))を挿入します。その後、データセットに対してクエリを実行し、Dictionaryを作成してJOINを実行する例を含めます。 + +:::note +このチュートリアルは、稼働中のClickHouseサービスにアクセスできることを前提としています。もしない場合は、[クイックスタート](./quick-start.mdx)をご覧ください。 +::: + +## 1. 新しいテーブルを作成する + +ニューヨーク市のタクシーデータには、数百万のタクシー乗車の詳細が含まれており、乗車と降車の時間と場所、料金、チップの金額、通行料、支払い方法などがカラムとして含まれています。このデータを保存するテーブルを作成しましょう... + +1. SQLコンソールに接続する + + + + セルフマネージドのClickHouseを使用している場合は、https://_hostname_:8443/playでSQLコンソールに接続できます(詳細はClickHouse管理者にお問い合わせください)。 + +1. `default` データベースに次の `trips` テーブルを作成します: + ```sql + CREATE TABLE trips + ( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 + ) + ENGINE = MergeTree + PARTITION BY toYYYYMM(pickup_date) + ORDER BY pickup_datetime; + ``` + +## 2. データセットを挿入する + +テーブルを作成したので、NYCタクシーデータを追加しましょう。このデータはS3内のCSVファイルにあり、そこからデータをロードできます。 + +1. 次のコマンドにより、2つの異なるS3ファイル `trips_1.tsv.gz` と `trips_2.tsv.gz` から `trips` テーブルに約2,000,000行を挿入します: + ```sql + INSERT INTO trips + SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{1..2}.gz', + 'TabSeparatedWithNames', " + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 + ") SETTINGS input_format_try_infer_datetimes = 0 + ``` + +2. `INSERT` が完了するのを待ちます。150 MBのデータがダウンロードされるのに少し時間がかかるかもしれません。 + + :::note + `s3` 関数はデータを自動的に解凍する方法を知っており、`TabSeparatedWithNames` フォーマットはデータがタブ区切りであり、各ファイルのヘッダー行をスキップするようClickHouseに指示します。 + ::: + +3. 挿入が終了したら、それが正常に動作したか確認してください: + ```sql + SELECT count() FROM trips + ``` + + 約2M行(厳密には1,999,657行)を見ることができるはずです。 + + :::note + ClickHouseがカウントを決定するために処理しなければならなかった行数と、どれほど迅速であるか注意してください。わずか0.001秒で6行だけ処理してカウントを取得できます。(その6は、`trips` テーブルが現在持つ **パーツ** の数であり、パーツは自身の行数を知っています。) + ::: + +4. すべての行をクロールする必要があるクエリを実行すると、処理する行数が大幅に増加することに気付くでしょうが、実行時間は依然として非常に速いままです: + ```sql + SELECT DISTINCT(pickup_ntaname) FROM trips + ``` + + このクエリは2M行を処理し、190の値を返す必要がありますが、約1秒でそれを行います。`pickup_ntaname` カラムは、タクシー乗車が始まったニューヨーク市の地域の名前を表します。 + +## 3. データを分析する + +2M行のデータを分析するクエリをいくつか実行してみましょう... + +1. まず、平均チップ額を計算するような簡単な計算から始めます: + ```sql + SELECT round(avg(tip_amount), 2) FROM trips + ``` + + 応答は以下のとおりです: + ```response + ┌─round(avg(tip_amount), 2)─┐ + │ 1.68 │ + └───────────────────────────┘ + ``` + +2. 次のクエリは、乗客数に基づいた平均費用を計算します: + ```sql + SELECT + passenger_count, + ceil(avg(total_amount),2) AS average_total_amount + FROM trips + GROUP BY passenger_count + ``` + + `passenger_count` の範囲は0から9までです: + ```response + ┌─passenger_count─┬─average_total_amount─┐ + │ 0 │ 22.69 │ + │ 1 │ 15.97 │ + │ 2 │ 17.15 │ + │ 3 │ 16.76 │ + │ 4 │ 17.33 │ + │ 5 │ 16.35 │ + │ 6 │ 16.04 │ + │ 7 │ 59.8 │ + │ 8 │ 36.41 │ + │ 9 │ 9.81 │ + └─────────────────┴──────────────────────┘ + ``` + +3. ここでは、地域ごとの日次乗車数を計算するクエリがあります: + ```sql + SELECT + pickup_date, + pickup_ntaname, + SUM(1) AS number_of_trips + FROM trips + GROUP BY pickup_date, pickup_ntaname + ORDER BY pickup_date ASC + ``` + + 結果は以下のようになります: + ```response + ┌─pickup_date─┬─pickup_ntaname───────────────────────────────────────────┬─number_of_trips─┐ + │ 2015-07-01 │ Brooklyn Heights-Cobble Hill │ 13 │ + │ 2015-07-01 │ Old Astoria │ 5 │ + │ 2015-07-01 │ Flushing │ 1 │ + │ 2015-07-01 │ Yorkville │ 378 │ + │ 2015-07-01 │ Gramercy │ 344 │ + │ 2015-07-01 │ Fordham South │ 2 │ + │ 2015-07-01 │ SoHo-TriBeCa-Civic Center-Little Italy │ 621 │ + │ 2015-07-01 │ Park Slope-Gowanus │ 29 │ + │ 2015-07-01 │ Bushwick South │ 5 │ + ``` + +4. このクエリは、旅行時間を計算し、その値で結果をグループ化します: + ```sql + SELECT + avg(tip_amount) AS avg_tip, + avg(fare_amount) AS avg_fare, + avg(passenger_count) AS avg_passenger, + count() AS count, + truncate(date_diff('second', pickup_datetime, dropoff_datetime)/60) as trip_minutes + FROM trips + WHERE trip_minutes > 0 + GROUP BY trip_minutes + ORDER BY trip_minutes DESC + ``` + + 結果は以下のようになります: + ```response + ┌──────────────avg_tip─┬───────────avg_fare─┬──────avg_passenger─┬──count─┬─trip_minutes─┐ + │ 1.9600000381469727 │ 8 │ 1 │ 1 │ 27511 │ + │ 0 │ 12 │ 2 │ 1 │ 27500 │ + │ 0.542166673981895 │ 19.716666666666665 │ 1.9166666666666667 │ 60 │ 1439 │ + │ 0.902499997522682 │ 11.270625001192093 │ 1.95625 │ 160 │ 1438 │ + │ 0.9715789457909146 │ 13.646616541353383 │ 2.0526315789473686 │ 133 │ 1437 │ + │ 0.9682692398245518 │ 14.134615384615385 │ 2.076923076923077 │ 104 │ 1436 │ + │ 1.1022105210705808 │ 13.778947368421052 │ 2.042105263157895 │ 95 │ 1435 │ + ``` + +5. このクエリは各時間帯の地域ごとの乗車数を表示します: + ```sql + SELECT + pickup_ntaname, + toHour(pickup_datetime) as pickup_hour, + SUM(1) AS pickups + FROM trips + WHERE pickup_ntaname != '' + GROUP BY pickup_ntaname, pickup_hour + ORDER BY pickup_ntaname, pickup_hour + ``` + + 結果は以下のようになります: + ```response + ┌─pickup_ntaname───────────────────────────────────────────┬─pickup_hour─┬─pickups─┐ + │ Airport │ 0 │ 3509 │ + │ Airport │ 1 │ 1184 │ + │ Airport │ 2 │ 401 │ + │ Airport │ 3 │ 152 │ + │ Airport │ 4 │ 213 │ + │ Airport │ 5 │ 955 │ + │ Airport │ 6 │ 2161 │ + │ Airport │ 7 │ 3013 │ + │ Airport │ 8 │ 3601 │ + │ Airport │ 9 │ 3792 │ + │ Airport │ 10 │ 4546 │ + │ Airport │ 11 │ 4659 │ + │ Airport │ 12 │ 4621 │ + │ Airport │ 13 │ 5348 │ + │ Airport │ 14 │ 5889 │ + │ Airport │ 15 │ 6505 │ + │ Airport │ 16 │ 6119 │ + │ Airport │ 17 │ 6341 │ + │ Airport │ 18 │ 6173 │ + │ Airport │ 19 │ 6329 │ + │ Airport │ 20 │ 6271 │ + │ Airport │ 21 │ 6649 │ + │ Airport │ 22 │ 6356 │ + │ Airport │ 23 │ 6016 │ + │ Allerton-Pelham Gardens │ 4 │ 1 │ + │ Allerton-Pelham Gardens │ 6 │ 1 │ + │ Allerton-Pelham Gardens │ 7 │ 1 │ + │ Allerton-Pelham Gardens │ 9 │ 5 │ + │ Allerton-Pelham Gardens │ 10 │ 3 │ + │ Allerton-Pelham Gardens │ 15 │ 1 │ + │ Allerton-Pelham Gardens │ 20 │ 2 │ + │ Allerton-Pelham Gardens │ 23 │ 1 │ + │ Annadale-Huguenot-Prince's Bay-Eltingville │ 23 │ 1 │ + │ Arden Heights │ 11 │ 1 │ + ``` + +6. ラガーディア(LGA)またはJFK空港への移動を見てみましょう: + ```sql + SELECT + pickup_datetime, + dropoff_datetime, + total_amount, + pickup_nyct2010_gid, + dropoff_nyct2010_gid, + CASE + WHEN dropoff_nyct2010_gid = 138 THEN 'LGA' + WHEN dropoff_nyct2010_gid = 132 THEN 'JFK' + END AS airport_code, + EXTRACT(YEAR FROM pickup_datetime) AS year, + EXTRACT(DAY FROM pickup_datetime) AS day, + EXTRACT(HOUR FROM pickup_datetime) AS hour + FROM trips + WHERE dropoff_nyct2010_gid IN (132, 138) + ORDER BY pickup_datetime + ``` + + 応答は以下のとおりです: + ```response + ┌─────pickup_datetime─┬────dropoff_datetime─┬─total_amount─┬─pickup_nyct2010_gid─┬─dropoff_nyct2010_gid─┬─airport_code─┬─year─┬─day─┬─hour─┐ + │ 2015-07-01 00:04:14 │ 2015-07-01 00:15:29 │ 13.3 │ -34 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:09:42 │ 2015-07-01 00:12:55 │ 6.8 │ 50 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:23:04 │ 2015-07-01 00:24:39 │ 4.8 │ -125 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:27:51 │ 2015-07-01 00:39:02 │ 14.72 │ -101 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:32:03 │ 2015-07-01 00:55:39 │ 39.34 │ 48 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:34:12 │ 2015-07-01 00:40:48 │ 9.95 │ -93 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:38:26 │ 2015-07-01 00:49:00 │ 13.3 │ -11 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:41:48 │ 2015-07-01 00:44:45 │ 6.3 │ -94 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 01:06:18 │ 2015-07-01 01:14:43 │ 11.76 │ 37 │ 132 │ JFK │ 2015 │ 1 │ 1 │ + ``` + +## 4. Dictionaryを作成する + +ClickHouse初心者の方は、***Dictionary***の動作を理解することが重要です。Dictionaryを考えるシンプルな方法は、メモリ内に格納されたキー->値のペアのマッピングです。詳細やDictionaryのすべてのオプションはチュートリアルの最後にリンクされています。 + +1. ClickHouseサービス内のテーブルに関連付けられたDictionaryを作成する方法を見てみましょう。表とそのDictionaryは、NYCの各地域を示す265行のCSVファイルに基づきます。これらの地域はニューヨーク市の各行政区の名前にマッピングされており(ニューヨーク市には5つの行政区があります:ブロンクス、ブルックリン、マンハッタン、クイーンズ、スタテンアイランド)、このファイルはニューアーク空港(EWR)も1つの行政区として数えます。 + + これはCSVファイルの一部です(明確にするために表として表示されています)。ファイル内の`LocationID` カラムは、`trips` テーブル内の`pickup_nyct2010_gid` と `dropoff_nyct2010_gid` カラムにマッピングされます: + + | LocationID | Borough | Zone | service_zone | + | ----------- | -------------- | ------------------------ | ----------- | + | 1 | EWR | Newark Airport | EWR | + | 2 | Queens | Jamaica Bay | Boro Zone | + | 3 | Bronx | Allerton/Pelham Gardens | Boro Zone | + | 4 | Manhattan | Alphabet City | Yellow Zone | + | 5 | Staten Island | Arden Heights | Boro Zone | + +2. ファイルのURLは `https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv` です。次のSQLを実行してください、これは`taxi_zone_dictionary`という名のDictionaryを作成し、S3のCSVファイルからDictionaryを読み込みます: + ```sql + CREATE DICTIONARY taxi_zone_dictionary + ( + `LocationID` UInt16 DEFAULT 0, + `Borough` String, + `Zone` String, + `service_zone` String + ) + PRIMARY KEY LocationID + SOURCE(HTTP(URL 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv' FORMAT 'CSVWithNames')) + LIFETIME(MIN 0 MAX 0) + LAYOUT(HASHED_ARRAY()) + ``` + + :::note + `LIFETIME`を0に設定することで、Dictionaryはソースとともに更新されることはありません。ここでは不要なトラフィックをS3バケットに送らないように使用されていますが、一般的には任意のLifetime値を指定できます。 + + 例えば: + + ```sql + LIFETIME(MIN 1 MAX 10) + ``` + と設定すると、辞書は1秒から10秒の間のランダムな時間後に更新されます。(ランダムな時間は、多数のサーバーでの更新時に辞書ソースへの負荷を分散するために必要です。) + ::: + +3. 正常に動作した事を確認してください - あなたは265行(各地域ごとに1行)を取得します: + ```sql + SELECT * FROM taxi_zone_dictionary + ``` + +4. `dictGet`関数(およびその[バリエーション](./sql-reference/functions/ext-dict-functions.md))を使用してDictionaryから値を取得します。辞書の名前、取得したい値、およびキー(この例では`taxi_zone_dictionary`の`LocationID`カラム)を渡します。 + + 例えば、以下のクエリは、`LocationID`が132である`Borough`を返します(これは上で見たようにJFK空港です): + ```sql + SELECT dictGet('taxi_zone_dictionary', 'Borough', 132) + ``` + + JFKはクイーンズにあり、値を取得する時間は本質的に0であることに注意してください: + ```response + ┌─dictGet('taxi_zone_dictionary', 'Borough', 132)─┐ + │ Queens │ + └─────────────────────────────────────────────────┘ + + 1 rows in set. Elapsed: 0.004 sec. + ``` + +5. `dictHas`関数を使用してDictionaryにキーが存在するかどうかを確認します。たとえば、次のクエリは1を返します(これはClickHouseでの"true"に相当します): + ```sql + SELECT dictHas('taxi_zone_dictionary', 132) + ``` + +6. 次のクエリは、辞書に`LocationID`の値4567がないため、0を返します: + ```sql + SELECT dictHas('taxi_zone_dictionary', 4567) + ``` + +7. クエリで辞書の名称を取得するために`dictGet`関数を使用します。例えば: + ```sql + SELECT + count(1) AS total, + dictGetOrDefault('taxi_zone_dictionary','Borough', toUInt64(pickup_nyct2010_gid), 'Unknown') AS borough_name + FROM trips + WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138 + GROUP BY borough_name + ORDER BY total DESC + ``` + + このクエリは、ラガーディアまたはJFK空港で終わるタクシー乗車の区分を合計します。結果は以下のようになり、出発地域が不明なトリップがかなりあることに注意してください: + ```response + ┌─total─┬─borough_name──┐ + │ 23683 │ Unknown │ + │ 7053 │ Manhattan │ + │ 6828 │ Brooklyn │ + │ 4458 │ Queens │ + │ 2670 │ Bronx │ + │ 554 │ Staten Island │ + │ 53 │ EWR │ + └───────┴───────────────┘ + + 7 rows in set. Elapsed: 0.019 sec. Processed 2.00 million rows, 4.00 MB (105.70 million rows/s., 211.40 MB/s.) + ``` + +## 5. Joinを実行する + +それでは、`taxi_zone_dictionary`と`trips`テーブルを結合するクエリを何本か書いてみましょう。 + +1. 単純な`JOIN`から始めましょう。これは前述の空港クエリと似ています: + ```sql + SELECT + count(1) AS total, + Borough + FROM trips + JOIN taxi_zone_dictionary ON toUInt64(trips.pickup_nyct2010_gid) = taxi_zone_dictionary.LocationID + WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138 + GROUP BY Borough + ORDER BY total DESC + ``` + + 応答はおなじみのものです: + ```response + ┌─total─┬─Borough───────┐ + │ 7053 │ Manhattan │ + │ 6828 │ Brooklyn │ + │ 4458 │ Queens │ + │ 2670 │ Bronx │ + │ 554 │ Staten Island │ + │ 53 │ EWR │ + └───────┴───────────────┘ + + 6 rows in set. Elapsed: 0.034 sec. Processed 2.00 million rows, 4.00 MB (59.14 million rows/s., 118.29 MB/s.) + ``` + + :::note + 上記の`JOIN`クエリの出力は、前述の`dictGetOrDefault`を使用したクエリと同じです(`Unknown`値が含まれていないことを除いて)。裏では、ClickHouseは実際に`taxi_zone_dictionary`辞書に対して`dictGet`関数を呼び出していますが、`JOIN`構文はSQL開発者にとってより親しみやすいものです。 + ::: + +2. ClickHouseでは`SELECT *`をあまり使用しません - 必要なカラムのみを取得すべきです!しかし、長時間実行されるクエリを見つけるのは困難なので、このクエリはすべてのカラムを選択し、すべての行を返す(ただしデフォルトで応答には最大10,000行の制限があります)、さらにすべての行を辞書と右結合することを意図的に行います: + ```sql + SELECT * + FROM trips + JOIN taxi_zone_dictionary + ON trips.dropoff_nyct2010_gid = taxi_zone_dictionary.LocationID + WHERE tip_amount > 0 + ORDER BY tip_amount DESC + LIMIT 1000 + ``` + +#### おめでとうございます! + +お疲れ様でした!チュートリアルを無事に完了し、ClickHouseの使い方についての理解が深まったことを願っています。次に何をするかのオプションはこちらです: + +- [ClickHouseの主キーの動作について](./guides/best-practices/sparse-primary-indexes.md)読む - これはClickHouseのエキスパートになる旅に大いに役立ちます +- ファイル、Kafka、PostgreSQL、データパイプライン、その他多くのデータソースといった[外部データソースを統合する](/docs/ja/integrations/index.mdx) +- [お気に入りのUI/BIツール](./integrations/data-visualization.md)をClickHouseに接続する +- [SQLリファレンス](./sql-reference/index.md)を確認し、さまざまな関数を参照すること。ClickHouseには、データの変換、処理、分析のための素晴らしいコレクションがあります +- [Dictionaries](/docs/ja/sql-reference/dictionaries/index.md)についてさらに学ぶ diff --git a/docs/ja/use-cases/observability/demo-application.md b/docs/ja/use-cases/observability/demo-application.md new file mode 100644 index 00000000000..cf78422da45 --- /dev/null +++ b/docs/ja/use-cases/observability/demo-application.md @@ -0,0 +1,8 @@ +--- +title: デモアプリケーション +description: 観測性のためのデモアプリケーション +slug: /ja/observability/demo-application +keywords: [観測性, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +Open Telemetry プロジェクトには、[デモアプリケーション](https://opentelemetry.io/docs/demo/)が含まれています。このアプリケーションのフォーク版で、ClickHouse をログとトレースのデータソースとして活用しているものが[こちら](https://github.com/ClickHouse/opentelemetry-demo)にあります。公式の[デモ手順](https://opentelemetry.io/docs/demo/docker-deployment/)に従って、このデモを Docker でデプロイできます。既存の[コンポーネント](https://opentelemetry.io/docs/demo/collector-data-flow-dashboard/)に加えて、ClickHouse のインスタンスがデプロイされ、ログとトレースのストレージとして使用されます。 diff --git a/docs/ja/use-cases/observability/grafana.md b/docs/ja/use-cases/observability/grafana.md new file mode 100644 index 00000000000..3eba84fc232 --- /dev/null +++ b/docs/ja/use-cases/observability/grafana.md @@ -0,0 +1,241 @@ +--- +title: Grafanaの使用 +description: GrafanaとClickHouseを使用したオブザーバビリティ +slug: /ja/observability/grafana +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# GrafanaとClickHouseを使用したオブザーバビリティ + +Grafanaは、ClickHouseにおけるオブザーバビリティデータの視覚化ツールとして推奨されています。これは、Grafana用の公式ClickHouseプラグインを使用して実現します。インストール手順は[こちら](/ja/integrations/grafana)で参照できます。 + +プラグインのバージョン4では、ログとトレースが新しいクエリビルダーエクスペリエンスにおいて第一級の存在となっています。これにより、SREがSQLクエリを書かずに済む環境を提供し、SQLベースのオブザーバビリティを簡素化し、この新しいパラダイムを推進します。この一環として、Open Telemetry (OTel) をプラグインの中核に据え、今後数年間のSQLベースのオブザーバビリティの基盤になると考えています。 + +## Open Telemetry統合 + +GrafanaでClickhouseデータソースを設定する際、ユーザーはログおよびトレース用のデフォルトのデータベースとテーブルを指定し、これらのテーブルがOTelスキーマに準拠しているかどうかを指定できます。これにより、プラグインはGrafanaでログとトレースを正確に表示するためのカラムを返します。デフォルトのOTelスキーマを変更して独自のカラム名を使用する場合は、これらを指定することができます。時刻(Timestamp)、ログレベル(SeverityText)、メッセージ本文(Body)などのカラム名をデフォルトのOTelカラム名のままで使用する場合、変更は不要です。 + +> ユーザーは、HTTPまたはネイティブプロトコルを使用してGrafanaをClickHouseに接続できます。後者は、Grafanaユーザーが発行する集約クエリで顕著な性能向上を提供することはほとんどありませんが、HTTPプロトコルは通常ユーザーにとってプロキシや内省が簡単です。 + +ログ設定には、ログを正しく表示するために、時刻、ログレベル、およびメッセージカラムが必要です。 + +トレース設定はもう少し複雑です(完全なリストは[こちら](/ja/engines/table-engines/mergetree-family/mergetree#mergetree-data-storage))。ここで必要なカラムは、その後にフルトレースプロファイルを構築するためのクエリを抽象化するために必要です。これらのクエリは、データがOTelと類似した構造を持っていることを前提としているため、標準スキーマから大きく逸脱しているユーザーは、この機能の恩恵を受けるためにビューを使用する必要があります。 + +NEEDS ALT + +
    + +設定が完了すると、ユーザーは[Grafana Explore](https://grafana.com/docs/grafana/latest/explore/)に移動してログとトレースの検索を開始できます。 + +## ログ + +Grafanaのログに関する要件に従う場合、クエリビルダーで `Query Type: Log` を選択して `Run Query` をクリックできます。クエリビルダーは、ログをリストして表示するためのクエリを作成します。例えば次のように: + +```sql +SELECT Timestamp as timestamp, Body as body, SeverityText as level, TraceId as traceID FROM "default"."otel_logs" WHERE ( timestamp >= $__fromTime AND timestamp <= $__toTime ) ORDER BY timestamp DESC LIMIT 1000 +``` + +NEEDS ALT + +
    + +クエリビルダーは、ユーザーがSQLを書く必要を避ける簡単な手段を提供します。キーワードを含むログを見つけることを含むフィルタリングは、クエリビルダーで行えます。より複雑なクエリを書くことを望むユーザーは、SQLエディタに切り替えることができます。適切なカラムが返され、`logs` がクエリタイプとして選択されている限り、結果はログとしてレンダリングされます。ログのレンダリングに必要なカラムは[こちら](https://grafana.com/developers/plugin-tools/tutorials/build-a-logs-data-source-plugin#logs-data-frame-format)に記載されています。 + +### トレースへのログ + +ログがトレースIDを含む場合、特定のログ行からトレースを閲覧することができます。 + +NEEDS ALT + +
    + +## トレース + +前述のログ体験と同様に、Grafanaがトレースをレンダリングするために必要なカラムが満たされている場合(例えば、OTelスキーマを使用している場合)、クエリビルダーは必要なクエリを自動的に作成することができます。`Query Type: Traces` を選択し、`Run Query` をクリックすると、以下のようなクエリが生成され実行されます(設定されたカラムに依存しており、以下はOTelを使用することを前提としています): + +```sql +SELECT "TraceId" as traceID, + "ServiceName" as serviceName, + "SpanName" as operationName, + "Timestamp" as startTime, + multiply("Duration", 0.000001) as duration +FROM "default"."otel_traces" +WHERE ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) + AND ( ParentSpanId = '' ) + AND ( Duration > 0 ) + ORDER BY Timestamp DESC, Duration DESC LIMIT 1000 +``` + +このクエリはGrafanaが期待するカラム名を返し、以下に示すようにトレースのテーブルをレンダリングします。継続時間や他のカラムを基にしたフィルタリングも、SQLを書くことなく実行できます。 + +NEEDS ALT + +
    + +より複雑なクエリを書きたいユーザーは、`SQL Editor`に切り替えることができます。 + +### トレース詳細の表示 + +上に示したように、トレースIDはクリック可能なリンクとして表示されます。トレースIDをクリックすると、リンク`View Trace`を通じて関連するスパンの表示を選択できます。これにより、スパンを必要な構造で取得し、結果をウォーターフォールとしてレンダリングするための以下のクエリ(OTelカラムを想定)が発行されます。 + +```sql +WITH '' as trace_id, + (SELECT min(Start) FROM "default"."otel_traces_trace_id_ts" + WHERE TraceId = trace_id) as trace_start, + (SELECT max(End) + 1 FROM "default"."otel_traces_trace_id_ts" + WHERE TraceId = trace_id) as trace_end +SELECT "TraceId" as traceID, + "SpanId" as spanID, + "ParentSpanId" as parentSpanID, + "ServiceName" as serviceName, + "SpanName" as operationName, + "Timestamp" as startTime, + multiply("Duration", 0.000001) as duration, + arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]), + mapKeys("SpanAttributes")) as tags, + arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]), + mapKeys("ResourceAttributes")) as serviceTags +FROM "default"."otel_traces" +WHERE traceID = trace_id + AND startTime >= trace_start + AND startTime <= trace_end +LIMIT 1000 +``` + +> 上記クエリがトレースIDのルックアップを行うためにMaterialized View `otel_traces_trace_id_ts` を使用する方法に注目してください。詳細は「クエリの高速化 - ルックアップ用のMaterialized Viewsの活用」を参照してください。 + +NEEDS ALT + +
    + +### トレースからログへ + +ログがトレースIDを含む場合、ユーザーはトレースから関連するログへナビゲートできます。ログを表示するにはトレースIDをクリックし、`View Logs`を選択します。この操作は、デフォルトのOTelカラムを想定した以下のクエリを発行します。 + +```sql +SELECT Timestamp as "timestamp", + Body as "body", SeverityText as "level", + TraceId as "traceID" FROM "default"."otel_logs" +WHERE ( traceID = '' ) +ORDER BY timestamp ASC LIMIT 1000 +``` + +NEEDS ALT + +
    + +## ダッシュボード + +GrafanaでClickHouseデータソースを使用してダッシュボードを構築できます。詳細については、GrafanaとClickHouseの[データソースドキュメント](https://github.com/grafana/clickhouse-datasource)を参考にすることをお勧めします。特に[マクロ](https://github.com/grafana/clickhouse-datasource?tab=readme-ov-file#macros)と[変数](https://grafana.com/docs/grafana/latest/dashboards/variables/)の概念に焦点を当ててください。 + +プラグインは、OTelの仕様に準拠したログおよびトレースデータ用の例となるダッシュボード「Simple ClickHouse OTel dashboarding」を含む、いくつかの標準ダッシュボードを提供します。これは、ユーザーがOTelのデフォルトカラム名に準拠することを要求し、データソースの設定からインストールできます。 + +NEEDS ALT + +
    + +以下に、可視化のためのいくつかの簡単なヒントを提供します。 + +### 時系列 + +統計とともに、線グラフはオブザーバビリティの使用シーンで最も一般的な視覚化形式です。Clickhouseプラグインは、`datetime` に名前付けされた `time` と数値カラムを返すクエリの場合、自動的に線グラフをレンダリングします。例えば: + +```sql +SELECT + $__timeInterval(Timestamp) as time, + quantile(0.99)(Duration)/1000000 AS p99 +FROM otel_traces +WHERE + $__timeFilter(Timestamp) + AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) +GROUP BY time +ORDER BY time ASC +LIMIT 100000 +``` + +NEEDS ALT + +
    + +### 複数ラインのチャート + +以下の条件が満たされる場合、クエリのために複数ラインのチャートが自動的にレンダリングされます: + +- フィールド1: エイリアス名がtimeのdatetimeフィールド +- フィールド2: グループ化するための値。これはStringでなければなりません。 +- フィールド3以降: メトリック値 + +例えば: + +```sql +SELECT + $__timeInterval(Timestamp) as time, + ServiceName, + quantile(0.99)(Duration)/1000000 AS p99 +FROM otel_traces +WHERE $__timeFilter(Timestamp) +AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) +GROUP BY ServiceName, time +ORDER BY time ASC +LIMIT 100000 +``` + +NEEDS ALT + +
    + +### 地理データの可視化 + +以前のセクションでIP Dictionaryを使用して地理座標でオブザーバビリティデータを拡張する方法を探しました。`latitude` と `longitude` のカラムがあると仮定し、オブザーバビリティを `geohashEncode` 関数を使用して可視化できます。これにより、GrafanaのGeo Mapチャートと互換性のあるジオハッシュが生成されます。以下に例のクエリと可視化を示します: + +```sql +WITH coords AS + ( + SELECT + Latitude, + Longitude, + geohashEncode(Longitude, Latitude, 4) AS hash + FROM otel_logs_v2 + WHERE (Longitude != 0) AND (Latitude != 0) + ) +SELECT + hash, + count() AS heat, + round(log10(heat), 2) AS adj_heat +FROM coords +GROUP BY hash +``` + +NEEDS ALT + +
    diff --git a/docs/ja/use-cases/observability/images/observability-1.png b/docs/ja/use-cases/observability/images/observability-1.png new file mode 100644 index 00000000000..cee69d5a181 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-1.png differ diff --git a/docs/ja/use-cases/observability/images/observability-10.png b/docs/ja/use-cases/observability/images/observability-10.png new file mode 100644 index 00000000000..88dfafa2a3b Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-10.png differ diff --git a/docs/ja/use-cases/observability/images/observability-11.png b/docs/ja/use-cases/observability/images/observability-11.png new file mode 100644 index 00000000000..0b16712c0a4 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-11.png differ diff --git a/docs/ja/use-cases/observability/images/observability-12.png b/docs/ja/use-cases/observability/images/observability-12.png new file mode 100644 index 00000000000..a67ef6271cd Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-12.png differ diff --git a/docs/ja/use-cases/observability/images/observability-13.png b/docs/ja/use-cases/observability/images/observability-13.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-13.png differ diff --git a/docs/ja/use-cases/observability/images/observability-14.png b/docs/ja/use-cases/observability/images/observability-14.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-14.png differ diff --git a/docs/ja/use-cases/observability/images/observability-15.png b/docs/ja/use-cases/observability/images/observability-15.png new file mode 100644 index 00000000000..5bd30367f2d Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-15.png differ diff --git a/docs/ja/use-cases/observability/images/observability-16.png b/docs/ja/use-cases/observability/images/observability-16.png new file mode 100644 index 00000000000..e3b4ef7ba8f Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-16.png differ diff --git a/docs/ja/use-cases/observability/images/observability-17.png b/docs/ja/use-cases/observability/images/observability-17.png new file mode 100644 index 00000000000..a355b0fa3f3 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-17.png differ diff --git a/docs/ja/use-cases/observability/images/observability-18.png b/docs/ja/use-cases/observability/images/observability-18.png new file mode 100644 index 00000000000..5658c346fcc Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-18.png differ diff --git a/docs/ja/use-cases/observability/images/observability-19.png b/docs/ja/use-cases/observability/images/observability-19.png new file mode 100644 index 00000000000..936ae8723b6 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-19.png differ diff --git a/docs/ja/use-cases/observability/images/observability-2.png b/docs/ja/use-cases/observability/images/observability-2.png new file mode 100644 index 00000000000..1614ead5f70 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-2.png differ diff --git a/docs/ja/use-cases/observability/images/observability-20.png b/docs/ja/use-cases/observability/images/observability-20.png new file mode 100644 index 00000000000..dbbc5d9069a Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-20.png differ diff --git a/docs/ja/use-cases/observability/images/observability-21.png b/docs/ja/use-cases/observability/images/observability-21.png new file mode 100644 index 00000000000..07b4ba3c89c Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-21.png differ diff --git a/docs/ja/use-cases/observability/images/observability-22.png b/docs/ja/use-cases/observability/images/observability-22.png new file mode 100644 index 00000000000..a41e210c688 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-22.png differ diff --git a/docs/ja/use-cases/observability/images/observability-23.png b/docs/ja/use-cases/observability/images/observability-23.png new file mode 100644 index 00000000000..d31d4324cbb Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-23.png differ diff --git a/docs/ja/use-cases/observability/images/observability-24.png b/docs/ja/use-cases/observability/images/observability-24.png new file mode 100644 index 00000000000..cfb63c68ff4 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-24.png differ diff --git a/docs/ja/use-cases/observability/images/observability-3.png b/docs/ja/use-cases/observability/images/observability-3.png new file mode 100644 index 00000000000..bd65722fc8e Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-3.png differ diff --git a/docs/ja/use-cases/observability/images/observability-4.png b/docs/ja/use-cases/observability/images/observability-4.png new file mode 100644 index 00000000000..68b010e2c46 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-4.png differ diff --git a/docs/ja/use-cases/observability/images/observability-5.png b/docs/ja/use-cases/observability/images/observability-5.png new file mode 100644 index 00000000000..84b310c4a00 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-5.png differ diff --git a/docs/ja/use-cases/observability/images/observability-6.png b/docs/ja/use-cases/observability/images/observability-6.png new file mode 100644 index 00000000000..0b4032adfb9 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-6.png differ diff --git a/docs/ja/use-cases/observability/images/observability-7.png b/docs/ja/use-cases/observability/images/observability-7.png new file mode 100644 index 00000000000..71c7227726b Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-7.png differ diff --git a/docs/ja/use-cases/observability/images/observability-8.png b/docs/ja/use-cases/observability/images/observability-8.png new file mode 100644 index 00000000000..632346c5ff9 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-8.png differ diff --git a/docs/ja/use-cases/observability/images/observability-9.png b/docs/ja/use-cases/observability/images/observability-9.png new file mode 100644 index 00000000000..a3222c82421 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-9.png differ diff --git a/docs/ja/use-cases/observability/index.md b/docs/ja/use-cases/observability/index.md new file mode 100644 index 00000000000..693fe1dec12 --- /dev/null +++ b/docs/ja/use-cases/observability/index.md @@ -0,0 +1,96 @@ +--- +title: オブザーバビリティ +description: ClickHouse をオブザーバビリティソリューションとして使用する +slug: /ja/observability +keywords: [オブザーバビリティ, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +# オブザーバビリティのための ClickHouse の使用 + +## はじめに + +このガイドは、ClickHouse を使用して独自の SQL ベースのオブザーバビリティソリューションを構築したいと考えているユーザー向けに設計されています。ログやトレースに焦点を当てています。 これには、インジェストの考慮事項、アクセスパターンに最適化されたスキーマ、および非構造化ログからの構造の抽出など、ソリューション構築のすべての側面をカバーしています。 + +ClickHouse はオブザーバビリティの即席ソリューションではありません。ただし、オブザーバビリティデータに対して比類のない圧縮率と高速なクエリ応答時間を提供できる非常に効率的なストレージエンジンとして使用できます。ユーザーが ClickHouse をオブザーバビリティソリューションとして使用するためには、ユーザーインターフェースとデータ収集フレームワークの両方が必要です。現在、オブザーバビリティシグナルの可視化には **Grafana** を、データ収集には **OpenTelemetry** を使用することを推奨しています(どちらも公式にサポートされている統合です)。 + +NEEDS ALT + +
    + +> データ収集には OpenTelemetry (OTeL) プロジェクトを使用することをお勧めしますが、同様のアーキテクチャは他のフレームワークやツール(例:Vector や Fluentd)を使用しても構築できます([Fluent Bit を使用した例](https://clickhouse.com/blog/kubernetes-logs-to-clickhouse-fluent-bit)を参照)。また、Superset や Metabase を含む代替の可視化ツールも存在します。 + +## なぜ ClickHouse を使用するのか? + +集中管理されたオブザーバビリティストアの最も重要な特徴は、多様なソースからの膨大な量のログデータを迅速に集約、分析、検索する能力です。この集中化により、トラブルシューティングが簡素化され、サービス中断の根本原因を特定しやすくなります。 + +ユーザーがますます価格に敏感になり、これらの即席ソリューションのコストが提供される価値と比較して高く予測不可能であると感じる中、クエリ性能が許容範囲内である場合のコスト効率の高い予測可能なログストレージの重要性が増しています。 + +その性能とコスト効率のため、ClickHouse はオブザーバビリティ製品におけるロギングおよびトレースのストレージエンジンの事実上の標準となっています。 + +より具体的には、以下の理由で ClickHouse はオブザーバビリティデータの保存に理想的です: + +- **圧縮** - オブザーバビリティデータには通常、HTTP コードやサービス名などの異なるセットからの値が含まれるフィールドがあります。ClickHouse の列指向ストレージでは値がソートされて格納されるため、このデータは非常にうまく圧縮されます。特に、時系列データに特化した様々なコーデックと組み合わせることで、さらに効果が高まります。他のデータストアでは、データの元のサイズ(通常は JSON 形式)と同じだけのストレージが必要ですが、ClickHouse は平均で最大 14 倍にログとトレースを圧縮します。大規模なオブザーバビリティインストールにおいて大幅なストレージ節約をもたらすだけでなく、この圧縮によりディスクからの読み取りデータが少なくなるため、クエリを高速化します。 +- **高速な集計** - オブザーバビリティソリューションは通常、エラーレートを示す線やトラフィックソースを示す棒グラフなどを通じてデータを可視化することに大きく依存しています。集計や GROUP BY はこれらのチャートを機能させるための基本であり、フィルタを適用した際に速く応答性がある必要があります。ClickHouse の列指向フォーマットとベクトル化されたクエリ実行エンジンは、高速な集計に理想的であり、スパースインデックスがユーザーのアクションに応じた迅速なデータフィルタリングを可能にします。 +- **高速な線形スキャン** - 代替技術の多くはログの高速なクエリに転置インデックスを利用していますが、これによりディスク使用量やリソース使用量が高くなる傾向があります。ClickHouse は追加のオプションで反転インデックスを提供していますが、線形スキャンは非常に並列化されており(設定を変更しない限り)、利用可能なすべてのマシンコアを使用します。これにより、毎秒 10 GB/s(圧縮済み)以上のマッチングのためにスキャンが可能です。最適化されたテキストマッチングオペレータを参照してください。 +- **SQL の親しみやすさ** - SQL はすべてのエンジニアにとってよく知られた言語であり、50年以上の開発を通じて、データ分析の事実上の標準言語としての地位を確立し続けています。オブザーバビリティは単なるデータ問題であり、SQL に最適です。 +- **分析機能** - ClickHouse は ANSI SQL を拡張し、SQL クエリを簡単に書きやすくする分析機能を提供します。これらは、データを切り分けて分析する必要がある根本原因分析を行うユーザーにとって不可欠です。 +- **二次インデックス** - ClickHouse はブルームフィルタなどの二次インデックスをサポートしており、特定のクエリプロファイルを高速化します。これらはカラムレベルで任意に有効にすることができ、コストと性能の利益を評価するための細かい制御をユーザーに提供します。 +- **オープンソースとオープンスタンダード** - オープンソースデータベースとして、ClickHouse は OpenTelemetry などのオープンスタンダードを採用しています。プロジェクトに貢献し、積極的に参加する能力を提供する一方で、ベンダーロックインの課題を回避します。 + +## オブザーバビリティに ClickHouse を使用するべき時 + +オブザーバビリティデータに ClickHouse を使用するには、ユーザーが SQL ベースのオブザーバビリティを採用する必要があります。この歴史については [ブログ記事](https://clickhouse.com/blog/the-state-of-sql-based-observability)をお勧めしますが、要約すると: + +SQL ベースのオブザーバビリティは次のようなユーザーに適しています: + +- あなたまたはあなたのチームが SQL に親しんでいる(またはその習得を望んでいる) +- ロックインを回避し、拡張性を達成するために OpenTelemetry などのオープン標準を遵守することを好む +- コレクション、ストレージ、可視化のすべてでオープンソースの革新によって駆動されるエコシステムを運営する準備ができている +- 中規模または大規模(または非常に大規模な)オブザーバビリティデータの管理を視野に入れている +- TCO(総所有コスト)を管理し、オブザーバビリティコストの増加を避けたい +- コストを管理するためにオブザーバビリティデータの短い保持期間に縛られたくない + +SQL ベースのオブザーバビリティが適さない場合: + +- あなたやあなたのチームが SQL を学ぶ(または生成する)ことに興味がない +- パッケージ化されたエンドツーエンドのオブザーバビリティ体験を求めている +- オブザーバビリティデータの量が小さすぎて、何らかの重要な差別化を生み出せない(例:<150 GiB)予測がされていない。 +- モニターの使用例が主にメトリクスに依存しており、PromQL を必要としている。その場合でも、ClickHouse をログやトレースに使用し、Grafana でプレゼンテーションレイヤーを統一することができます。 +- エコシステムが成熟するのを待ち、SQL ベースのオブザーバビリティがもっと簡単になるのを待ちたい + +## ログとトレース + +オブザーバビリティのユースケースには、ロギング、トレース、およびメトリクスの 3 つの明確な柱があります。それぞれが独自のデータタイプとアクセスパターンを持っています。 + +現在、ClickHouse は次の2種類のオブザーバビリティデータの保存を推奨しています: + +- **ログ** - ログは、システム内で発生するイベントの時刻記録であり、ソフトウェア操作のさまざまな側面に関する詳細情報をキャプチャします。ログのデータは通常、非構造化または半構造化されており、エラーメッセージ、ユーザーアクティビティログ、システム変更、他のイベントを含むことができます。ログは、トラブルシューティング、異常検出、およびシステム内部で発生する問題の特定のイベントの理解に不可欠です。 + +``` +54.36.149.41 - - [22/Jan/2019:03:56:14 +0330] "GET +/filter/27|13%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,27|%DA%A9%D9%85%D8%AA%D8%B1%20%D8%A7%D8%B2%205%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,p53 HTTP/1.1" 200 30577 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" "-" +``` + +- **トレース** - トレースは、分散システム内を移動するリクエストの過程をキャプチャし、これらのリクエストのルートとパフォーマンスを詳細に示します。トレースのデータは非常に構造化されており、リクエストが取る各ステップをマッピングするスパンとトレースから成ります。トレースは、システムパフォーマンスの洞察を提供し、ボトルネックや待機時間の問題を特定し、マイクロサービスの効率を最適化するのに役立ちます。 + +> ClickHouse はメトリクスデータの保存にも使用できますが、この柱はまだ成熟段階にあり、Prometheus データ形式および PromQL へのサポートが進行中です。 + +### 分散トレーシング + +分散トレーシングは、オブザーバビリティの重要な機能です。分散トレース、単にトレースと呼ばれるものは、システムを通るリクエストの過程をマッピングします。リクエストはエンドユーザーまたはアプリケーションから起こり、通常はマイクロサービス間のアクションの流れにつながります。このシーケンスを記録し、後続のイベントを相関させることで、オブザーバビリティユーザーまたは SRE は、アプリケーションフローの問題を診断することができます。これにより、サーバーレスやアーキテクチャの複雑さに関わらず、理解が楽になります。 + +各トレースは複数のスパンで構成されており、リクエストに関連付けられた最初のスパンはルートスパンと呼ばれています。このルートスパンはリクエスト全体を最初から最後までキャプチャします。その下にあるスパンは、リクエスト中に発生する各ステップや操作の詳細な洞察を提供します。トレースがなければ、分散システム内のパフォーマンスの問題を診断することは非常に難しい場合があります。トレースは、リクエストがシステムを通過する際のイベントのシーケンスを詳細に示すことで、分散システムのデバッグを容易にし、理解を助けます。 + +ほとんどのオブザーバビリティベンダーは、この情報をウォーターフォールとして視覚化しており、相対的なタイミングを水平棒や比例サイズで示しています。Grafanaの例: + +NEEDS ALT + +
    + +ログとトレースの概念に深く慣れ親しむ必要があるユーザーには、[OpenTelemetry ドキュメント](https://opentelemetry.io/docs/concepts/)を強くお勧めします。 diff --git a/docs/ja/use-cases/observability/integrating-opentelemetry.md b/docs/ja/use-cases/observability/integrating-opentelemetry.md new file mode 100644 index 00000000000..99c3046ac6d --- /dev/null +++ b/docs/ja/use-cases/observability/integrating-opentelemetry.md @@ -0,0 +1,771 @@ +--- +title: OpenTelemetryの統合 +description: オブザーバビリティのためのOpenTelemetryとClickHouseの統合 +slug: /ja/observability/integrating-opentelemetry +keywords: [オブザーバビリティ, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +# データ収集のためのOpenTelemetryの統合 + +オブザーバビリティソリューションには、ログとトレースを収集およびエクスポートする手段が必要です。この目的のために、ClickHouseは[OpenTelemetry (OTel) プロジェクト](https://opentelemetry.io/)を推奨しています。 + +"OpenTelemetryは、トレース、メトリクス、ログなどのテレメトリデータを作成および管理するために設計されたオブザーバビリティフレームワークおよびツールキットです。" + +ClickHouseやPrometheusとは異なり、OpenTelemetryはオブザーバビリティのバックエンドではなく、テレメトリデータの生成、収集、管理、エクスポートに焦点を当てています。OpenTelemetryの初期の目標は、ユーザーが言語固有のSDKを使用してアプリケーションやシステムを容易に計装できるようにすることでしたが、それはOpenTelemetryコレクターを通じたログの収集も含むように拡張されました。OpenTelemetryコレクターは、テレメトリデータを受信、処理、エクスポートするエージェントまたはプロキシです。 + +## ClickHouseに関連するコンポーネント + +OpenTelemetryは多くのコンポーネントで構成されています。他には、API仕様、標準化されたプロトコル、フィールド/カラムの命名規則を提供するほか、ClickHouseでオブザーバビリティソリューションを構築するために基本的な二つの機能を提供します: + +- [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/)は、テレメトリデータを受信、処理、エクスポートするプロキシです。ClickHouseが駆動するソリューションは、このコンポーネントをログ収集とイベント処理の両方に使用し、バッチ処理および挿入を行います。 +- テレメトリデータの仕様、API、エクスポートを実装する[言語SDK](https://opentelemetry.io/docs/languages/)です。これらのSDKは、アプリケーションのコード内でトレースが正しく記録されていること、関連するスパンが生成され、メタデータを介してサービス間でコンテキストが伝達されることを保証します。これにより、分散トレースが形成され、スパンが相関されることを保証します。これらのSDKは、ユーザーがコードを変更することなく、直ちに計装を得ることを意味する一般的なライブラリとフレームワークを自動的に実装するエコシステムによって補完されています。 + +ClickHouseを駆動するオブザーバビリティソリューションは、これら両方のツールを活用します。 + +## ディストリビューション + +OpenTelemetryコレクターには[多くのディストリビューション](https://github.com/open-telemetry/opentelemetry-collector-releases?tab=readme-ov-file)があります。ClickHouseソリューションに必要なfilelogレシーバーとClickHouseエクスポーターは、[OpenTelemetry Collector Contrib Distro](https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib)にのみ含まれています。 + +このディストリビューションには多くのコンポーネントが含まれており、ユーザーはさまざまな構成で実験することができます。ただし、製品で実行する場合は、環境に必要なコンポーネントのみを含めるようにコレクターを制限することが推奨されます。その理由には以下のようなものがあります: + +- コレクターのサイズを減らし、コレクターのデプロイ時間を短縮する +- 利用可能な攻撃の表面積を減らすことで、コレクターのセキュリティを改善する + +[カスタムコレクター](https://opentelemetry.io/docs/collector/custom-collector/)の構築は、[OpenTelemetry Collector Builder](https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder)を使用して行うことができます。 + +## OTelによるデータの取り込み + +### コレクターのデプロイ役割 + +ログを収集してClickHouseに挿入するために、OpenTelemetry Collectorの使用を推奨します。OpenTelemetry Collectorは、主に2つの役割でデプロイできます: + +- **エージェント** - エージェントインスタンスは、サーバーやKubernetesノードなどのエッジでデータを収集したり、OpenTelemetry SDKで計装されたアプリケーションから直接イベントを受信したりします。後者の場合、エージェントインスタンスはアプリケーションと共に、またはアプリケーションと同じホストで実行されます(例えばサイドカーやDaemonSetとして)。エージェントはそのデータを直接ClickHouseに送信したり、ゲートウェイインスタンスに送信したりできます。前者の場合、これは[エージェントデプロイメントパターン](https://opentelemetry.io/docs/collector/deployment/agent/)として知られます。 +- **ゲートウェイ** - ゲートウェイインスタンスは、独立したサービスを提供します(例:Kubernetesでのデプロイ)。通常、クラスターごと、データセンターごと、地域ごとに、この役割として動作します。これらはOTLPエンドポイントを介してアプリケーション(または他のコレクターとしてエージェント)からイベントを受信します。通常、一連のゲートウェイインスタンスがデプロイされ、ロードバランサが使用されて負荷を分散します。全エージェントとアプリケーションがこの単一のエンドポイントに信号を送る場合、これは[ゲートウェイデプロイメントパターン](https://opentelemetry.io/docs/collector/deployment/gateway/)としてしばしば言及されます。 + +以下、エージェントコレクターがシンプルにイベントをClickHouseに直接送信することを想定しています。ゲートウェイを使用する場合およびどのような場合に適用できるかについて詳細は「スケーリング with ゲートウェイ」を参照してください。 + +### ログの収集 + +コレクターを使用する主な利点は、サービスがデータを迅速にオフロードし、コレクターが再試行、バッチ処理、暗号化、または機密データのフィルタリングなどの追加処理を負担することを可能にすることです。 + +コレクターは、その3つの主要な処理ステージに対して[レシーバー](https://opentelemetry.io/docs/collector/configuration/#receivers)、[プロセッサー](https://opentelemetry.io/docs/collector/configuration/#processors)、および[エクスポーター](https://opentelemetry.io/docs/collector/configuration/#exporters)という用語を使用します。レシーバーはデータ収集に使用され、プルベースまたはプッシュベースのいずれかです。プロセッサーはメッセージの変換と強化を行う機能を提供します。エクスポーターはデータをダウンストリームサービスに送信する役割を持ちます。このサービスは理論的には別のコレクターでもかまいませんが、基本的なディスカッションのために、すべてのデータがClickHouseに直接送信されると仮定します。 + +NEEDS ALT + +
    + +ユーザーがレシーバー、プロセッサー、エクスポーターの完全なセットに慣れることをお勧めします。 + +コレクターはログを収集するための2つの主要なレシーバーを提供します: + +**OTLPを介して** - この場合、ログはOTLPプロトコルを介してOpenTelemetry SDKからコレクターに直接(プッシュ)送信されます。[OpenTelemetryデモ](https://opentelemetry.io/docs/demo/)ではこのアプローチが採用されており、各言語のOTLPエクスポーターがローカルコレクターのエンドポイントを想定しています。コレクターはこの場合、OTLPレシーバーで設定する必要があります—設定例は上記[デモの設定](https://github.com/ClickHouse/opentelemetry-demo/blob/main/src/otelcollector/otelcol-config.yml#L5-L12)を参照。また、このアプローチの利点は、ログデータが自動的にTrace Idを含むようになり、ユーザーが特定のログ用のトレースを判別できるようになることです。 + +NEEDS ALT + +
    + +このアプローチでは、ユーザーが[適切な言語SDK](https://opentelemetry.io/docs/languages/)を使用してコードを計装することが求められます。 + +- **Filelogレシーバーを介したスクレイピング** - このレシーバーはディスク上のファイルを追跡し、ログメッセージを形成し、これらをClickHouseに送信します。このレシーバーは、多行メッセージの検出、ログのロールオーバー処理、再起動に対するロバスト性のチェックポイント設定、構造の抽出など、複雑なタスクを処理します。このレシーバーはさらに、DockerとKubernetesコンテナのログを追跡し、これらから構造を抽出し、ポッドの詳細で充実させることができます。 + +NEEDS ALT + +
    + +**ほとんどのデプロイメントでは上記の組み合わせを使用します。** ユーザーが[コレクタードキュメント](https://opentelemetry.io/docs/collector/)を読み、基本的な概念や[構成構造](https://opentelemetry.io/docs/collector/configuration/)および[インストール方法](https://opentelemetry.io/docs/collector/installation/)に慣れることをお勧めします。 + +> ヒント: [otelbin.io](https://www.otelbin.io/) は、構成を検証および視覚化するのに役立ちます。 + +## 構造化vs非構造化 + +ログは構造化または非構造化のいずれかです。 + +構造化ログは、JSONなどのデータフォーマットを使用し、httpコードやソースIPアドレスなどのメタデータフィールドを定義します。 + +``` +{ + "remote_addr":"54.36.149.41", + "remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET", + "request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1", + "status":"200", + "size":"30577", + "referer":"-", + "user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)" +} +``` + +一方、非構造化ログは通常、何らかの固有の構造を持っているものの、単なる文字列としてログを表現します。 + +``` +54.36.149.41 - - [22/Jan/2019:03:56:14 +0330] "GET +/filter/27|13%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,27|%DA%A9%D9%85%D8%AA%D8%B1%20%D8%A7%D8%B2%205%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,p53 HTTP/1.1" 200 30577 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" "-" +``` + +ユーザーが可能な限り構造化ログを使用し、JSON(例:ndjson)でログを記録することを推奨します。これにより、後のログ処理が簡素化され、ClickHouseに送信する前に[Collector Processor](https://opentelemetry.io/docs/collector/configuration/#processors)や挿入時にマテリアライズドビューを使用して簡素化されます。構造化ログは最終的に後に必要な処理リソースを節約し、ClickHouseソリューションに必要なCPUを削減します。 + +### 例 + +例として、構造化された(JSON)および非構造化のロギングデータセット(それぞれ約10m行)が以下のリンクで利用可能です: + +- [非構造化](https://datasets-documentation.s3.eu-west-3.amazonaws.com/http_logs/access-unstructured.log.gz) +- [構造化](https://datasets-documentation.s3.eu-west-3.amazonaws.com/http_logs/access-structured.log.gz) + +以下の例では構造化データセットを使用します。このファイルをダウンロードして展開し、以下の例を再現してください。 + +以下は、ディスク上のこれらのファイルを読み込むOTel Collectorの単純な構成を示しており、filelogレシーバーを使用して、結果のメッセージをstdoutに出力します。ログが構造化されているため、[`json_parser`](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/json_parser.md)オペレーターを使用します。`access-structured.log`ファイルへのパスを修正してください。 + +> 以下の例では、ログからタイムスタンプを抽出します。これには`json_parser`オペレーターを使用する必要があり、ログ行全体をJSON文字列に変換し、結果を`LogAttributes`に配置します。これは計算が高コストとなることがあり、[ClickHouseでより効率的に実行できます](https://clickhouse.com/blog/worlds-fastest-json-querying-tool-clickhouse-local) - 「SQLによる構造の抽出」を参照してください。JSONを抽出するために使用する`regex_parser`を使用した同等の非構造化例は[ここ](https://pastila.nl/?01da7ee2/2ffd3ba8124a7d6e4ddf39422ad5b863#swBkiAXvGP7mRPgbuzzHFA==)で提供されています。 + +**[config-structured-logs.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N*N*Nprocessors%3A*N__batch%3A*N____timeout%3A_5s*N____send*_batch*_size%3A_1*N*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Blogging%5D%7E)** + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' +processors: + batch: + timeout: 5s + send_batch_size: 1 +exporters: + logging: + loglevel: debug +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [logging] +``` + +ユーザーは[公式の指示](https://opentelemetry.io/docs/collector/installation/)に従ってローカルにコレクターをインストールすることができます。重要なことは、これらの指示が[contribディストリビューション](https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib)(`filelog`レシーバーが含まれている)を使用するように修正されることです。例として、`otelcol_0.102.1_darwin_arm64.tar.gz`の代わりに`otelcol-contrib_0.102.1_darwin_arm64.tar.gz`をダウンロードします。リリースは[ここ](https://github.com/open-telemetry/opentelemetry-collector-releases/releases)で見つけることができます。 + +インストールが完了すると、以下のコマンドを使用してOTel Collectorを実行できます: + +``` +./otelcol-contrib --config config-logs.yaml +``` + +構造化されたログを使用すると仮定すると、メッセージは以下のような形式で出力されます: + +``` +LogRecord #98 +ObservedTimestamp: 2024-06-19 13:21:16.414259 +0000 UTC +Timestamp: 2019-01-22 01:12:53 +0000 UTC +SeverityText: +SeverityNumber: Unspecified(0) +Body: Str({"remote_addr":"66.249.66.195","remote_user":"-","run_time":"0","time_local":"2019-01-22 01:12:53.000","request_type":"GET","request_path":"\/product\/7564","request_protocol":"HTTP\/1.1","status":"301","size":"178","referer":"-","user_agent":"Mozilla\/5.0 (Linux; Android 6.0.1; Nexus 5X Build\/MMB29P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Mobile Safari\/537.36 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)"}) +Attributes: + -> remote_user: Str(-) + -> request_protocol: Str(HTTP/1.1) + -> time_local: Str(2019-01-22 01:12:53.000) + -> user_agent: Str(Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)) + -> log.file.name: Str(access.log) + -> status: Str(301) + -> size: Str(178) + -> referer: Str(-) + -> remote_addr: Str(66.249.66.195) + -> request_type: Str(GET) + -> request_path: Str(/product/7564) + -> run_time: Str(0) +Trace ID: +Span ID: +Flags: 0 +``` + +上記は、OTelコレクターによって生成された単一のログメッセージを表しています。これら同じメッセージを後のセクションでClickHouseに投入します。 + +ログメッセージの完全なスキーマは、[こちら](https://opentelemetry.io/docs/specs/otel/logs/data-model/)で維持されています。**ユーザーはこのスキーマに慣れることを強くお勧めします。** + +重要なのは、ログ行自体が`Body`フィールド内に文字列として保持されていることですが、JSONが`json_parser`のおかげでAttributesフィールドに自動抽出されていることです。この同じ[オペレーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/README.md#what-operators-are-available)を使用して、適切な`Timestamp`カラムにタイムスタンプを抽出しています。OTelでのログ処理の推奨事項については「処理」を参照してください。 + +> オペレーターは、ログ処理の最も基本的な単位です。各オペレーターは、ファイルから行を読み取る、フィールドからJSONを解析するなどの単一の責任を果たします。オペレーターは、その目的を達成するためにパイプラインで鎖でつながれます。 + +> 上記のメッセージにはTraceIDやSpanIDフィールドがありません。[分散トレース](https://opentelemetry.io/docs/concepts/observability-primer/#distributed-traces)を実装している場合など、必要な場合には、上記のようにJSONから抽出できます。 + +ローカルまたはkubernetesのログファイルを収集する必要があるユーザーには、[filelogレシーバー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/filelogreceiver/README.md#configuration)で利用可能な構成オプションと[オフセットの取り扱い](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver#offset-tracking)および[多行ログの解析方法](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver#example---multiline-logs-parsing)に関して理解を深めることをお勧めします。 + +## Kubernetesログの収集 + +Kubernetesログの収集には、[Open Telemetryドキュメントガイド](https://opentelemetry.io/docs/kubernetes/)の利用をお勧めします。ログやメトリクスをポッドのメタデータで強化するために[Kubernetes Attributes Processor](https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-attributes-processor)が推奨されます。これにより、ラベルのような動的なメタデータを生成することができます。このデータはカラム`ResourceAttributes`に保存されます。ClickHouseでは、現時点でこのカラムには型`Map(String, String)`を使用しています。この型の操作と最適化の詳細については「マップの使用」と「マップからの抽出」を参照してください。 + +## トレースの収集 + +コードを計装してトレースを収集したいユーザーには、公式の[OTelドキュメント](https://opentelemetry.io/docs/languages/)に従うことをお勧めします。 + +ClickHouseにイベントを送信するためには、適切なレシーバーを介してOTLPプロトコルでトレースイベントを受信するOTelコレクターをデプロイする必要があります。OpenTelemetryデモでは、[対応する言語を計装し](https://opentelemetry.io/docs/demo/)イベントをコレクターに送信する例を提供しています。stdoutにイベントを出力する適切なコレクターの設定例を以下に示します: + +### 例 + +トレースはOTLPで受信される必要があるため、トレースデータ生成用に[telemetrygen](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen)ツールを使用します。インストールについての指示は[こちら](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen)にあります。 + +以下の設定は、OTLPレシーバーでトレースイベントを受け取り、それをstdoutに送信します。 + +[config-traces.xml](https://www.otelbin.io/#config=receivers%3A*N_otlp%3A*N___protocols%3A*N_____grpc%3A*N_______endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_1s*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*Nservice%3A*N_pipelines%3A*N__traces%3A*N____receivers%3A_%5Botlp%5D*N____processors%3A_%5Bbatch%5D*N____exporters%3A_%5Blogging%5D%7E) + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 1s +exporters: + logging: + loglevel: debug +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [logging] +``` + +この設定を以下のコマンドで実行します: + +```bash +./otelcol-contrib --config config-traces.yaml +``` + +トレースイベントをコレクターに送信するためには、`telemetrygen`を使用して以下のコマンドを実行します: + +```bash +$GOBIN/telemetrygen traces --otlp-insecure --traces 300 +``` + +これにより、以下に示すようなトレースメッセージがstdoutに出力されます: + +``` +Span #86 + Trace ID : 1bb5cdd2c9df5f0da320ca22045c60d9 + Parent ID : ce129e5c2dd51378 + ID : fbb14077b5e149a0 + Name : okey-dokey-0 + Kind : Server + Start time : 2024-06-19 18:03:41.603868 +0000 UTC + End time : 2024-06-19 18:03:41.603991 +0000 UTC + Status code : Unset + Status message : +Attributes: + -> net.peer.ip: Str(1.2.3.4) + -> peer.service: Str(telemetrygen-client) +``` + +上記は、OTelコレクターによって生成された単一のトレースメッセージを表しています。これら同じメッセージを後のセクションでClickHouseに投入します。 + +トレースメッセージの完全なスキーマは[こちら](https://opentelemetry.io/docs/concepts/signals/traces/)で維持されています。ユーザーはこのスキーマに慣れることを強くお勧めします。 + +## 処理 - フィルタリング、変換、充実化 + +以前の例で示したログイベントのタイムスタンプを設定するように、ユーザーはイベントメッセージをフィルタリング、変換、充実化したいと考えることがよくあります。これは、Open Telemetryでのいくつかの能力を使用して達成できます: + +- **プロセッサー** - プロセッサーは、[レシーバーが収集したデータを変更または変換](https://opentelemetry.io/docs/collector/transforming-telemetry/)し、エクスポーターに送信する前にそのデータを処理します。[推奨されるプロセッサー](https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor#recommended-processors) の最小セットは通常推奨されますが、これらは任意です。OTeLコレクターをClickHouseと共に使用する際には、以下をプロセッサーに制限することをお勧めします: + + - [memory_limiter](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md) は、コレクターでのメモリ不足を防ぐために使用されます。「リソースの見積もり」を参照してください。 + - コンテキストに基づいて強化を行うプロセッサー。たとえば、[Kubernetes Attributes Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/k8sattributesprocessor) は、k8sメタデータで指標やログのリソース属性を自動設定して、イベントをそれらのソースポッドIDで強化することを可能にします。 + - トレースが必要な場合の[末尾もしくは先端のサンプリング](https://opentelemetry.io/docs/concepts/sampling/)。 + - [基本的なフィルタリング](https://opentelemetry.io/docs/collector/transforming-telemetry/) - オペレーターでできない場合の削除イベント。 + - [バッチ](https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor) - データがバッチで送信されることを保証するためにClickHouseで作業する際に必須です。ClickHouseへのエクスポートを参照してください。 + +- **オペレーター** - [オペレーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/README.md)は、レシーバーで利用可能な処理の最も基本的な単位を提供します。基本的な解析がサポートされており、SeverityとTimestampなどのフィールドを設定することが可能です。JSONと正規表現の解析がここでサポートされており、そのフィルタリングと基本的な変換が可能です。ここでのイベントフィルタリングをお勧めします。 + +オペレーターまたは[トランスフォームプロセッサー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/transformprocessor/README.md)を使用して過剰なイベント処理を行わないことをお勧めします。これらは相当なメモリおよびCPUオーバーヘッドを引き起こす可能性があります、特にJSON解析。しかし、挿入時にClickHouseでマテリアライズドビューとカラムを使ってすべての処理を行うことも可能です。ただし、コンテキスト認識が必要な強化(例:k8sメタデータの追加)は除きます。「SQLでの構造の抽出」を参照してください。 + +もし、OTelコレクターを使用して処理をする場合、ゲートウェイインスタンスでの変換を推奨し、エージェントインスタンスで行う作業を最小限にすることをお勧めします。これにより、サーバー上で動作するエージェントが必要とするリソースが可能な限り最小化されます。通常、ユーザーがフィルタリング(不要なネットワーク使用を最小化するため)、タイムスタンプ設定(オペレーターを通して)、コンテキストが必要な強化をエージェントで行うのを見ます。たとえば、ゲートウェイインスタンスが異なるKubernetesクラスターに存在する場合、k8sの強化はエージェントで発生します。 + +### 例 + +以下の設定は、非構造化ログファイルの収集を示します。ログ行から構造を抽出するためのオペレーター(`regex_parser`)とイベントをフィルタリングするための使用、及びイベントをバッチ処理しメモリ使用量を制限するためのプロセッサーを利用しています。 + +[config-unstructured-logs-with-processor.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-unstructured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_regex*_parser*N_______regex%3A_*%22%5E*C*QP*Lip*G%5B*Bd.%5D*P*D*Bs*P-*Bs*P-*Bs*P*B%5B*C*QP*Ltimestamp*G%5B%5E*B%5D%5D*P*D*B%5D%5C*%22*C*QP*Lmethod*G%5BA-Z%5D*P*D*Bs*P*C*QP*Lurl*G%5B%5E*Bs%5D*P*D*Bs*PHTTP%2F%5B%5E*Bs%5D*P%22*Bs*P*C*QP*Lstatus*G*Bd*P*D*Bs*P*C*QP*Lsize*G*Bd*P*D*Bs*P%22*C*QP*Lreferrer*G%5B%5E%22%5D***D%22*Bs*P%22*C*QP*Luser*_agent*G%5B%5E%22%5D***D%22*%22*N_______timestamp%3A*N_________parse*_from%3A_attributes.timestamp*N_________layout%3A_*%22*.d%2F*.b%2F*.Y%3A*.H%3A*.M%3A*.S_*.z*%22*N_________*H22%2FJan%2F2019%3A03%3A56%3A14_*P0330*N*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_1s*N___send*_batch*_size%3A_100*N_memory*_limiter%3A*N___check*_interval%3A_1s*N___limit*_mib%3A_2048*N___spike*_limit*_mib%3A_256*N*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%2C_memory*_limiter%5D*N_____exporters%3A_%5Blogging%5D%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-unstructured.log + start_at: beginning + operators: + - type: regex_parser + regex: '^(?P[\d.]+)\s+-\s+-\s+\[(?P[^\]]+)\]\s+"(?P[A-Z]+)\s+(?P[^\s]+)\s+HTTP/[^\s]+"\s+(?P\d+)\s+(?P\d+)\s+"(?P[^"]*)"\s+"(?P[^"]*)"' + timestamp: + parse_from: attributes.timestamp + layout: '%d/%b/%Y:%H:%M:%S %z' + #22/Jan/2019:03:56:14 +0330 +processors: + batch: + timeout: 1s + send_batch_size: 100 + memory_limiter: + check_interval: 1s + limit_mib: 2048 + spike_limit_mib: 256 +exporters: + logging: + loglevel: debug +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch, memory_limiter] + exporters: [logging] +``` + +```bash +./otelcol-contrib --config config-unstructured-logs-with-processor.yaml +``` + +## ClickHouseへのエクスポート + +エクスポーターはデータを1つ以上のバックエンドまたは目的地に送信します。エクスポーターはプルまたはプッシュベースです。ClickHouseにイベントを送信するためには、プッシュベースの[ClickHouseエクスポーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md)を使用する必要があります。 + +> ClickHouseエクスポーターはコアディストリビューションではなく、[OpenTelemetry Collector Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main)の一部です。ユーザーはContribディストリビューションを使用するか、[独自のコレクターを構築](https://opentelemetry.io/docs/collector/custom-collector/)することができます。 + +完全な構成ファイルは以下に示されています。 + +[clickhouse-config.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N_otlp%3A*N____protocols%3A*N______grpc%3A*N________endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_5s*N___send*_batch*_size%3A_5000*N*Nexporters%3A*N_clickhouse%3A*N___endpoint%3A_tcp%3A%2F%2Flocalhost%3A9000*Qdial*_timeout*E10s*Acompress*Elz4*Aasync*_insert*E1*N___*H_ttl%3A_72h*N___traces*_table*_name%3A_otel*_traces*N___logs*_table*_name%3A_otel*_logs*N___create*_schema%3A_true*N___timeout%3A_5s*N___database%3A_default*N___sending*_queue%3A*N_____queue*_size%3A_1000*N___retry*_on*_failure%3A*N_____enabled%3A_true*N_____initial*_interval%3A_5s*N_____max*_interval%3A_30s*N_____max*_elapsed*_time%3A_300s*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Bclickhouse%5D*N___traces%3A*N____receivers%3A_%5Botlp%5D*N____processors%3A_%5Bbatch%5D*N____exporters%3A_%5Bclickhouse%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 5s + send_batch_size: 5000 +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1 + # ttl: 72h + traces_table_name: otel_traces + logs_table_name: otel_logs + create_schema: true + timeout: 5s + database: default + sending_queue: + queue_size: 1000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [clickhouse] + traces: + receivers: [otlp] + processors: [batch] + exporters: [clickhouse] +``` + +次に、重要な設定を示しています: + +- **パイプライン** - 上記の設定では、レシーバー、プロセッサー、エクスポーターのセットとして[パイプライン](https://opentelemetry.io/docs/collector/configuration/#pipelines)の使用がハイライトされています。ログとトレースのためのものです。 +- **エンドポイント** - ClickHouseとの通信は`endpoint`パラメータで設定されています。接続文字列`tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1`により、通信はTCP上で行われます。ユーザーがトラフィックスイッチングの理由でHTTPを好む場合は、[ここ](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md#configuration-options)で記載されているようにこの接続文字列を変更してください。完全な接続詳細、ユーザー名とパスワードをこの接続文字列に指定する能力を持つものは、[ここ](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md#configuration-options)で詳しく説明されています。 + +**重要:** 上記の接続文字列は、圧縮(lz4)と非同期挿入の両方を有効にしています。私たちは、常に両方を有効にすることをお勧めします。非同期挿入に関する詳細は「バッチ処理」を参照してください。圧縮は常に指定されなければならず、以前のエクスポーターの古いバージョンではデフォルトで有効にされていません。 + +- **ttl** - ここでの値はデータが保持される期間を決定します。より詳しい情報は「データの管理」にあります。これは時間単位で時間を指定する必要があります。例:72h。以下の例では無効化しています。データが2019年のもので、挿入後すぐにClickHouseによって削除されるためです。 +- **traces_table_name** と **logs_table_name** - ログとトレーステーブルの名前を決定します。 +- **create_schema** - デフォルトのスキーマでテーブルを起動時に作成するかどうかを決定します。最初は真に設定することを推奨します。ユーザーは、この値を偽に設定し、独自のスキーマを定義するべきです。 +- **database** - 対象データベース。 +- **retry_on_failure** - 失敗したバッチを再試行するかどうかを決定する設定。 +- **batch** - バッチプロセッサーがイベントをバッチとして送信することを保証します。5000ほどの値を推奨し、タイムアウトを5sとしています。これらのいずれかが最初に達した場合、バッチがフラッシュされてエクスポーターに送信されます。これらの値を下げることで、より速いレイテンシーパイプラインになり、データが即座にクエリ可能になる一方で、より多くの接続とバッチがClickHouseに送信されることになります。非同期挿入を使用していない場合は問題を引き起こす可能性があるため、これを推奨しません(ClickHouseでの[過多パーツ](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#1-too-many-parts)の問題)。逆に、ユーザーが非同期挿入を使用している場合は、これらの設定でデータが依然としてフラッシュされます。詳細については「バッチ処理」を参照してください。 +- **sending_queue** - 送信キューのサイズを制御します。キューにはバッチが含まれており、このキューが超過すると、バッチがドロップされます。詳細については「バックプレッシャーの処理」を参照してください。 + +構造化ログファイルを抽出し、認証されていない[ローカルインスタンスのClickHouse](https://clickhouse.com/docs/ja/install)が実行中であると仮定すると、以下のコマンドを使用してこの設定を実行できます: + +```bash +./otelcol-contrib --config clickhouse-config.yaml +``` + +このコレクターにトレースデータを送信するためには、`telemetrygen`ツールを使用しての以下のコマンドを実行します: + +```bash +$GOBIN/telemetrygen traces --otlp-insecure --traces 300 +``` + +実行中の際には、簡単なクエリでログイベントが存在することを確認してください: + +```sql +SELECT * +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Timestamp: 2019-01-22 06:46:14.000000000 +TraceId: +SpanId: +TraceFlags: 0 +SeverityText: +SeverityNumber: 0 +ServiceName: +Body: {"remote_addr":"109.230.70.66","remote_user":"-","run_time":"0","time_local":"2019-01-22 06:46:14.000","request_type":"GET","request_path":"\/image\/61884\/productModel\/150x150","request_protocol":"HTTP\/1.1","status":"200","size":"1684","referer":"https:\/\/www.zanbil.ir\/filter\/p3%2Cb2","user_agent":"Mozilla\/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko\/20100101 Firefox\/64.0"} +ResourceSchemaUrl: +ResourceAttributes: {} +ScopeSchemaUrl: +ScopeName: +ScopeVersion: +ScopeAttributes: {} +LogAttributes: {'referer':'https://www.zanbil.ir/filter/p3%2Cb2','log.file.name':'access-structured.log','run_time':'0','remote_user':'-','request_protocol':'HTTP/1.1','size':'1684','user_agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0','remote_addr':'109.230.70.66','request_path':'/image/61884/productModel/150x150','status':'200','time_local':'2019-01-22 06:46:14.000','request_type':'GET'} + +1 row in set. Elapsed: 0.012 sec. Processed 5.04 thousand rows, 4.62 MB (414.14 thousand rows/s., 379.48 MB/s.) +Peak memory usage: 5.41 MiB. + + +同様にトレースイベントの場合、ユーザーは`otel_traces`テーブルを確認できます: + +SELECT * +FROM otel_traces +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Timestamp: 2024-06-20 11:36:41.181398000 +TraceId: 00bba81fbd38a242ebb0c81a8ab85d8f +SpanId: beef91a2c8685ace +ParentSpanId: +TraceState: +SpanName: lets-go +SpanKind: SPAN_KIND_CLIENT +ServiceName: telemetrygen +ResourceAttributes: {'service.name':'telemetrygen'} +ScopeName: telemetrygen +ScopeVersion: +SpanAttributes: {'peer.service':'telemetrygen-server','net.peer.ip':'1.2.3.4'} +Duration: 123000 +StatusCode: STATUS_CODE_UNSET +StatusMessage: +Events.Timestamp: [] +Events.Name: [] +Events.Attributes: [] +Links.TraceId: [] +Links.SpanId: [] +Links.TraceState: [] +Links.Attributes: [] +``` + +## すぐに使えるスキーマ + +デフォルトでは、ClickHouseエクスポーターはログとトレースのためのターゲットログテーブルを作成します。これは`create_schema`の設定を通じて無効にすることができます。さらに、`otel_logs`および`otel_traces`のデフォルトからログとトレーステーブルの名前を変更することが上記で設定されました。 + +> 以下のスキームは、TTLが72時間として設定された場合を想定しています。 + +ログのデフォルトスキーマは以下の通りです(`otelcol-contrib v0.102.1`): + +```sql +CREATE TABLE default.otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(3) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +このカラムは、公式仕様に基づくOTelのログドキュメンテーション[こちら](https://opentelemetry.io/docs/specs/otel/logs/data-model/)に基づくものです。 + +このスキーマの重要なポイント: + +- デフォルトでテーブルは`PARTITION BY toDate(Timestamp)`によって日付でパーティションされています。これにより有過ぎたデータの削除が効率的に行われます。 +- TTL が `TTL toDateTime(Timestamp) + toIntervalDay(3)` を通じて設定されており、コレクター構成で設定されている値に対応しています。[`ttl_only_drop_parts=1`](/ja/operations/settings/settings#ttl_only_drop_parts) とは、保存されたすべての行が期限切れになったときにパーツ全体が削除されることを意味します。クリックハウスにおける、この特性はこ高価な削除を避けることが可能にします。これを常に設定することをお勧めします。詳細については「TTLによるデータ管理」を参照してください。 +- テーブルは古典的な[`MergeTree`エンジン](/ja/engines/table-engines/mergetree-family/mergetree)を使用しています。これはログやトレースに推奨されており、変更する必要はほとんどありません。 +- テーブルは`ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId)` によって整理されています。これにより、クエリはServiceName、SeverityText、Timestamp、TraceIdに対するフィルターに最適化されます - リストの先頭のカラムは後のカラムよりも速くフィルタリングされます。ユーザーは期待されるアクセスパターンに応じてこの順序を変更する必要があります。詳細については「主キーの選択」を参照してください。 +- 上記のスキーマはカラムに`ZSTD(1)`を適用しています。これはログに最適な圧縮を提供します。ユーザーはより良い圧縮を目指してZSTDの圧縮レベル(上記の1)を増やすことができますが、通常あまり利益を得ません。この値を増やすことは、挿入時のCPUオーバーヘッド(圧縮中)を増加させますが、解凍(クエリ)は同等の性能を持ち続けると予想されます。さらなる詳細は[こちら](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)を参照してください。追加の[デルタエンコーディング](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#delta)がTimestampに対して適用されており、そのディスクサイズを縮小することを目的としています。 +- `ResourceAttributes`や`LogAttributes`、`ScopeAttributes`がマップであることに注意してください。ユーザーはこれらの違いに慣れる必要があります。 このマップへのアクセス方法やキーへの最適化については「マップを使う」を参照してください。 +- その他のタイプも`ServiceName`など最適化されています。Bodyカラムは、JSONであるにもかかわらず、文字列として保存されます。 +- ブルームフィルターはマップキー、値、およびBodyカラムに適用されます。これらはこれらのカラムのクエリ時間を改善することを意図しており、通常は不要です。 "二次/データスキップインデックス"を参照してください。 + +```sql +CREATE TABLE default.otel_traces +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `ParentSpanId` String CODEC(ZSTD(1)), + `TraceState` String CODEC(ZSTD(1)), + `SpanName` LowCardinality(String) CODEC(ZSTD(1)), + `SpanKind` LowCardinality(String) CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `Duration` Int64 CODEC(ZSTD(1)), + `StatusCode` LowCardinality(String) CODEC(ZSTD(1)), + `StatusMessage` String CODEC(ZSTD(1)), + `Events.Timestamp` Array(DateTime64(9)) CODEC(ZSTD(1)), + `Events.Name` Array(LowCardinality(String)) CODEC(ZSTD(1)), + `Events.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + `Links.TraceId` Array(String) CODEC(ZSTD(1)), + `Links.SpanId` Array(String) CODEC(ZSTD(1)), + `Links.TraceState` Array(String) CODEC(ZSTD(1)), + `Links.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(3) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +再度、これは公式仕様に基づくOTelのトレースドキュメンテーションは[こちら](https://opentelemetry.io/docs/specs/otel/trace/api/)で記載されています。 こちらのスキーマは、ログスキーマの多くの同じ設定を使用しており、スパン専用の追加リンクカラムが含まれています。 + +ユーザーは自動スキーマの作成を無効にし、手動でテーブルを作成することを推奨します。これにより、主要および二次キーの変更、クエリパフォーマンス最適化のための追加のカラムの導入が可能になります。 詳細は「スキーマ設計」を参照してください。 + +## 挿入の最適化 + +高い挿入性能を達成し、一貫性の強い保証を得るために、コレクターを通じた観測可能なデータをClickHouseに挿入する際にはシンプルなルールに準拠してください。OTelコレクターの正しい設定により、このルールに従うことは簡単でしょう。これにより、ユーザーがClickHouseを最初に使用する際のよくある[問題](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse)を避けることができます。 + +### バッチ処理 + +デフォルトでは、ClickHouseに送信された各挿入はClickHouseが直ちにそのデータと他の保存する必要のあるメタデータを含むパーツをストレージに作成することを意味します。したがって各挿入がより多くのデータを含み、小規模な挿入をより多く送信する場合に最適化されます。1000以上の行を含むかなり大きなバッチでデータを挿入することをお勧めします。詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)にあります。 + +デフォルトで、ClickHouseへの挿入は同期的であり、同一の場合は冪等です。マージツリーエンジンファミリーのテーブルでは、ClickHouseはデフォルトで自動的に[挿入時に重複を排除](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#5-deduplication-at-insert-time)されます。これにより、挿入が以下のような場合に許容されます: + +1. データを受信するノードに問題がある場合、INSERTクエリがタイムアウト(またはより具体的なエラーを返す)し、確認が得られません。 +2. ノードによってデータが書き込まれましたが、ネットワークの中断が原因で送信側に確認を返すことができない場合、送信側はタイムアウトまたはネットワークエラーを体験します。 + +コレクターの観点からは、(1)と(2)は区別が難しい場合があります。しかし、どちらの場合も確認されていない挿入はただちに再試行できます。元の挿入が成功した場合、新しく試行された挿入が無視されます。 + +ユーザーが上記のバッチプロセッサーを使用して、挿入を一貫性のある行のバッチとして送信することをお勧めします。これにより、バッチプロセッサーの`timeout`が達成される前にバッチがフラッシュされることになり、パイプラインのエンドツーエンドのレイテンシーが低くなり、バッチが一貫サイズになります。 + +### 非同期挿入の使用 + +コレクターのスループットが低く、データがClickHouseに到達する最低限のエンドツーエンドの待ち時間を期待する場合、大きなバッチを送信する場合があります。この場合、バッチプロセッサーの`timeout`が期限切れになるときに小さなバッチが送信されます。これにより問題が発生し、非同期挿入が必要となります。この場合は特に**エージェント役としてClickHouseに直接送信するようにコレクターが構成されている場合**に発生します。ゲートウェイは、集約器として機能することにより、この問題を軽減します - 「ゲートウェイを使用したスケーリング」を参照してください。 + +大きなバッチを保証できない場合は、ClickHouseを使用して非同期挿入を[非同期挿入](/ja/cloud/bestpractices/asynchronous-inserts)使用してバッチ処理を委任できます。データはまずバッファに挿入され、その後データベースストレージに書き込まれます。 + +NEEDS ALT + +
    + +[非同期挿入を有効にすると](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)、ClickHouseが①Insertクエリを受け取り、そのクエリのデータが②直ちにメモリ内バッファに書き込まれます。 ③次のバッファフラッシュが行われるとき、バッファ内のデータは[ソートされ](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)、パートとしてデータベースストレージに書き込まれます。注意点として、データがストレージにフラッシュされる前にはクエリで検索することはできません。バッファフラッシュは[設定可能](/ja/optimize/asynchronous-inserts)です。 + +コレクターに対する非同期挿入を有効にするには、`async_insert=1`を接続文字列に追加します。配送保証を得るために`wait_for_async_insert=1`を使用することをお勧めします。さらに詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)を参照してください。 + +非同期挿入からのデータは、ClickHouseバッファがフラッシュされると挿入されます。挿入は`async_insert_max_data_size`を超過したとき、または最初のINSERTクエリから`async_insert_busy_timeout_ms`ミリ秒が経過した後に行われます。`async_insert_stale_timeout_ms`がゼロでない値に設定されている場合、データは`async_insert_stale_timeout_ms`ミリ秒が最終クエリから経過した後に挿入されます。ユーザーはこれらの設定を調整して、パイプラインのエンドツーエンドのレイテンシーを制御できます。バッファフラッシュを最適化するために追加の設定は[こちら](/ja/operations/settings/settings#asynchronous-insert-settings)に記載されています。一般に、デフォルトが適切です。 + +> エージェントの数が少なく、スループットが低いが厳格なエンドツーエンドのレイテンシーが求められる場合、[適応非同期挿入](https://clickhouse.com/blog/clickhouse-release-24-02#adaptive-asynchronous-inserts)が有用である可能性があります。一般的に、これらはClickHouseで見られる観測性の高スループットユースケースには適合しません。 + +最後に、非同期挿入を使用する際、ClickHouseへの同期挿入に関連する以前の重複排除の動作はデフォルトでは有効になっていません。必要に応じて、設定[`async_insert_deduplicate`](/ja/operations/settings/settings#async-insert-deduplicate)を参照してください。 + +この機能の詳細な設定については[こちら](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)で詳しく説明されており、深掘りについては[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)があります。 + +## デプロイメントアーキテクチャ + +OTelコレクターをClickhouseで使用する際のいくつかのデプロイメントアーキテクチャが可能です。それぞれの概要と適用可能な場合を以下で説明します。 + +### エージェントのみ + +エージェントのみのアーキテクチャでは、OTelコレクターをエッジにエージェントとしてデプロイします。これらはローカルアプリケーション(例:サイドカーコンテナ)からトレースを受信し、サーバーまたはKubernetesノードからログを収集します。このモードでは、エージェントがデータをClickHouseに直接送信します。 + +NEEDS ALT + +
    + +このアーキテクチャは、中小規模のデプロイメントに適しています。その主な利点は、追加のハードウェアを必要とせず、ClickHouse観測可能性ソリューションの全体的なリソースフットプリントを最小限に抑え、アプリケーションとコレクターとの間にシンプルなマッピングを持つことです。 + +エージェントの数が数百を超える場合は、ゲートウェイベースのアーキテクチャへの移行を検討する必要があります。このアーキテクチャにはいくつかの欠点があり、スケールの問題を抱えています: + +- **接続スケーリング** - 各エージェントはClickHouseに接続を確立します。ClickHouseは数百(場合によっては数千)の同時挿入接続を維持可能ですが、最終的にはそれが制限要因となり、挿入が非効率になります。つまり、ClickHouseが接続を維持するためにより多くのリソースを消費することになります。ゲートウェイを使用することで接続数を最小限に抑え、挿入の効率を上げます。 +- **エッジでの処理** - このアーキテクチャでは、変換やイベント処理がエッジまたはClickHouseで行われる必要があります。この制限は、複雑なClickHouseのMaterialized Viewを意味するか、重要なサービスに影響を与え、リソースが乏しいエッジに大量の計算を押し付けることを意味します。 +- **小規模なバッチとレイテンシ** - エージェントコレクターはそれぞれ非常に少ないイベントを収集することがあります。これにより、配信SLAを満たすために一定の間隔でフラッシュするように構成する必要があります。これにより、コレクターがClickHouseに小規模なバッチを送信することがあります。これは不利ですが、「挿入の最適化」を参照して非同期挿入で軽減できます。 + +### ゲートウェイを用いたスケーリング + +OTelコレクターはゲートウェイインスタンスとしてデプロイされ、上記の制限に対処します。これらは単独のサービスを提供し、通常はデータセンターや地域ごとに展開されます。これらは単一のOTLPエンドポイント経由でアプリケーション(またはエージェントロール内の他のコレクター)からイベントを受信します。通常、ゲートウェイインスタンスのセットがデプロイされ、ロードバランサーを使用してそれらの負荷を分散します。 + +NEEDS ALT + +
    + +このアーキテクチャの目的は、エージェントから計算に集中的な処理をオフロードし、それによってリソースの使用を最小限に抑えることです。これらのゲートウェイは、エージェントが行う必要がある変換タスクを実行できます。さらに、多くのエージェントからのイベントを集約することで、ゲートウェイはClickHouseに大規模なバッチを送信でき、効率的な挿入が可能です。エージェントが追加され、イベントのスループットが増加するにつれて、これらのゲートウェイコレクターは簡単にスケールできます。以下に、例としてのゲートウェイ設定と、それに関連するエージェント設定が示されています。エージェントとゲートウェイ間の通信にはOTLPが使用されています。 + +[clickhouse-agent-config.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_5s*N___send*_batch*_size%3A_1000*N*Nexporters%3A*N_otlp%3A*N___endpoint%3A_localhost%3A4317*N___tls%3A*N_____insecure%3A_true_*H_Set_to_false_if_you_are_using_a_secure_connection*N*Nservice%3A*N_telemetry%3A*N___metrics%3A*N_____address%3A_0.0.0.0%3A9888_*H_Modified_as_2_collectors_running_on_same_host*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Botlp%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' +processors: + batch: + timeout: 5s + send_batch_size: 1000 +exporters: + otlp: + endpoint: localhost:4317 + tls: + insecure: true # セキュアな接続を使用している場合はfalseに設定してください +service: + telemetry: + metrics: + address: 0.0.0.0:9888 # 同一ホストで2つのコレクターが実行されているために修正 + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [otlp] +``` + +[clickhouse-gateway-config.yaml](https://www.otelbin.io/#config=receivers%3A*N__otlp%3A*N____protocols%3A*N____grpc%3A*N____endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N__batch%3A*N____timeout%3A_5s*N____send*_batch*_size%3A_10000*N*Nexporters%3A*N__clickhouse%3A*N____endpoint%3A_tcp%3A%2F%2Flocalhost%3A9000*Qdial*_timeout*E10s*Acompress*Elz4*N____ttl%3A_96h*N____traces*_table*_name%3A_otel*_traces*N____logs*_table*_name%3A_otel*_logs*N____create*_schema%3A_true*N____timeout%3A_10s*N____database%3A_default*N____sending*_queue%3A*N____queue*_size%3A_10000*N____retry*_on*_failure%3A*N____enabled%3A_true*N____initial*_interval%3A_5s*N____max*_interval%3A_30s*N____max*_elapsed*_time%3A_300s*N*Nservice%3A*N__pipelines%3A*N____logs%3A*N______receivers%3A_%5Botlp%5D*N______processors%3A_%5Bbatch%5D*N______exporters%3A_%5Bclickhouse%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 5s + send_batch_size: 10000 +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4 + ttl: 96h + traces_table_name: otel_traces + logs_table_name: otel_logs + create_schema: true + timeout: 10s + database: default + sending_queue: + queue_size: 10000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s +service: + pipelines: + logs: + receivers: [otlp] + processors: [batch] + exporters: [clickhouse] +``` + +これらの設定は以下のコマンドで実行できます。 + +```bash +./otelcol-contrib --config clickhouse-gateway-config.yaml +./otelcol-contrib --config clickhouse-agent-config.yaml +``` + +このアーキテクチャの主な欠点は、一連のコレクターを管理するための関連コストとオーバーヘッドです。 + +関連する学習と共に、より大規模なゲートウェイベースのアーキテクチャを管理する例については、[このブログ記事](https://clickhouse.com/blog/building-a-logging-platform-with-clickhouse-and-saving-millions-over-datadog)をお勧めします。 + +### Kafkaの追加 + +読者は、このアーキテクチャがメッセージキューとしてKafkaを使用していないことに気付くかもしれません。 + +Kafkaキューをメッセージバッファーとして使用することは、ログアーキテクチャで一般的なデザインパターンであり、ELKスタックによって普及しました。これにはいくつかの利点があります。主に、より強力なメッセージ配信保証を提供し、バックプレッシャーに対処するのに役立ちます。メッセージは収集エージェントからKafkaに送信され、ディスクに書き込まれます。理論上、クラスター化されたKafkaインスタンスは高スループットのメッセージバッファーを提供するはずです。なぜなら、データをディスクに直線的に書き込む計算オーバーヘッドが少ないからです。Elasticの場合、例えばトークン化とインデックス作成にはかなりのオーバーヘッドがかかります。エージェントからデータを移動することで、ソースでのログローテーションによってメッセージが失われるリスクを減らします。最後に、一部のユースケースで魅力的なメッセージリプレイおよびクロスリージョンレプリケーション機能を提供します。 + +しかしながら、ClickHouseは非常に迅速にデータを挿入することができ、通常のハードウェアで毎秒何百万行も処理できます。ClickHouseによるバックプレッシャーは**稀です**。Kafkaキューを利用することは、しばしばより多くのアーキテクチャの複雑さとコストを招きます。ログが銀行取引や他のミッションクリティカルなデータと同じ配信保証を必要としないという原則を受け入れられるなら、Kafkaの複雑さを避けることをお勧めします。 + +ただし、高い配信保証やデータをリプレイする機能(おそらく複数のソースに)を必要とする場合、Kafkaは有用なアーキテクチャ上の追加機能となることがあります。 + +NEEDS ALT + +
    + +この場合、OTelエージェントは[Kafkaエクスポーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/kafkaexporter/README.md)を使用してデータをKafkaに送信するように設定できます。ゲートウェイインスタンスは、[Kafkaレシーバー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/kafkareceiver/README.md)を使用してメッセージを消費します。詳細については、ConfluentおよびOTelのドキュメントをお勧めします。 + +### リソースの見積もり + +OTelコレクターのリソース要件は、イベントのスループット、メッセージのサイズ、および行われる処理量に依存します。OpenTelemetryプロジェクトはユーザーがリソース要件を見積もるために使用できる[ベンチマーク](https://opentelemetry.io/docs/collector/benchmarks/)を提供しています。 + +[私たちの経験](https://clickhouse.com/blog/building-a-logging-platform-with-clickhouse-and-saving-millions-over-datadog#architectural-overview)では、3コアと12GBのRAMを持つゲートウェイインスタンスは、約60,000イベント/秒を処理できます。これは、フィールドのリネームのみを担当する最小限の処理パイプラインと正規表現を持たないことを前提としています。 + +ゲートウェイにイベントを送信するエージェントインスタンスの場合、イベントのタイムスタンプのみを設定するだけなら、予想される秒あたりのログに基づいてサイズを決定することをお勧めします。以下は、ユーザーが始めるための参考値を示しています: + +| ログレート | コレクターエージェントに必要なリソース | +|--------------|-------------------------------------| +| 1k/秒 | 0.2CPU, 0.2GiB | +| 5k/秒 | 0.5 CPU, 0.5GiB | +| 10k/秒 | 1 CPU, 1GiB | diff --git a/docs/ja/use-cases/observability/managing-data.md b/docs/ja/use-cases/observability/managing-data.md new file mode 100644 index 00000000000..3071ce7c7a9 --- /dev/null +++ b/docs/ja/use-cases/observability/managing-data.md @@ -0,0 +1,432 @@ +--- +title: データ管理 +description: 観測性のためのデータ管理 +slug: /ja/observability/managing-data +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# データ管理 + +観測性のためのClickHouseの導入は常に大規模なデータセットが関与しており、これを管理する必要があります。ClickHouseにはデータ管理を支援するためのさまざまな機能があります。 + +## パーティション + +ClickHouseでのパーティションは、カラムまたはSQL式に従ってディスク上でデータを論理的に分割することを可能にします。データを論理的に分割することで、それぞれのパーティションを独立して操作(例: 削除)することができます。これにより、ユーザーは時間や[クラスタからの効率的なデータ削除](/ja/sql-reference/statements/alter/partition)に基づいてパーティションを移動し、したがってサブセットを効率的にストレージ層間で移動することができます。 + +パーティションは、テーブルが初めて定義される際に`PARTITION BY`句を通じて指定されます。この句には、行をどのパーティションに送信するかを決定するためのSQL式を任意のカラムに対して含めることができます。 + +NEEDS ALT + +
    + +データのパーツはディスク上の各パーティションと論理的に関連付けられており(共通のフォルダ名のプレフィックスを介して)、独立してクエリを実行することができます。以下の例では、デフォルトの`otel_logs`スキーマは`toDate(Timestamp)`式を使用して日ごとにパーティションを分割します。データがClickHouseに挿入される際に、この式が各行に対して評価され、該当するパーティションにルーティングされます(その日の最初の行である場合はパーティションが作成されます)。 + +```sql +CREATE TABLE default.otel_logs +( +... +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +``` + +[いくつかの操作](/ja/sql-reference/statements/alter/partition)をパーティション上で実行することができます。例えば、[バックアップ](/ja/sql-reference/statements/alter/partition#freeze-partition)、[カラムの操作](/ja/sql-reference/statements/alter/partition#clear-column-in-partition)、[行ごとのデータの更新](/ja/sql-reference/statements/alter/partition#update-in-partition)/[削除](/ja/sql-reference/statements/alter/partition#delete-in-partition)、および[インデックスのクリア(例: 二次インデックス)](/ja/sql-reference/statements/alter/partition#clear-index-in-partition)が含まれます。 + +例えば、`otel_logs`テーブルが日ごとにパーティション分割されていると仮定すると、構造化されたログデータセットであれば、以下のように数日分のデータが含まれることになります。 + +```sql +SELECT Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 2333977 │ +│ 2019-01-23 │ 2326694 │ +│ 2019-01-26 │ 1986456 │ +│ 2019-01-24 │ 1896255 │ +│ 2019-01-25 │ 1821770 │ +└────────────┴─────────┘ + +5 rows in set. Elapsed: 0.058 sec. Processed 10.37 million rows, 82.92 MB (177.96 million rows/s., 1.42 GB/s.) +Peak memory usage: 4.41 MiB. +``` + +現在のパーティションは、簡単なシステムテーブルクエリを使用して見つけることができます。 + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'otel_logs' + +┌─partition──┐ +│ 2019-01-22 │ +│ 2019-01-23 │ +│ 2019-01-24 │ +│ 2019-01-25 │ +│ 2019-01-26 │ +└────────────┘ + +5 rows in set. Elapsed: 0.005 sec. +``` + +別のテーブル、例えば古いデータを保存するための`otel_logs_archive`があるかもしれません。データはパーティションごとにこのテーブルに効率的に移動できます(これは単なるメタデータの変更です)。 + +```sql +CREATE TABLE otel_logs_archive AS otel_logs +--move data to archive table +ALTER TABLE otel_logs + (MOVE PARTITION tuple('2019-01-26') TO TABLE otel_logs_archive +--confirm data has been moved +SELECT + Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 2333977 │ +│ 2019-01-23 │ 2326694 │ +│ 2019-01-24 │ 1896255 │ +│ 2019-01-25 │ 1821770 │ +└────────────┴─────────┘ + +4 rows in set. Elapsed: 0.051 sec. Processed 8.38 million rows, 67.03 MB (163.52 million rows/s., 1.31 GB/s.) +Peak memory usage: 4.40 MiB. + +SELECT Timestamp::Date AS day, + count() AS c +FROM otel_logs_archive +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-26 │ 1986456 │ +└────────────┴─────────┘ + +1 row in set. Elapsed: 0.024 sec. Processed 1.99 million rows, 15.89 MB (83.86 million rows/s., 670.87 MB/s.) +Peak memory usage: 4.99 MiB. +``` + +これは、`INSERT INTO SELECT`を使用し、新しいターゲットテーブルにデータを書き換える必要がある他の手法とは対照的です。 + +> [テーブル間のパーティションの移動](/ja/sql-reference/statements/alter/partition#move-partition-to-table)には、いくつかの条件を満たす必要があります。特に、テーブルは同じ構造、パーティションキー、主キー、およびインデックス/プロジェクションを持っている必要があります。`ALTER` DDLでのパーティションの指定方法についての詳細な説明は[こちら](/ja/sql-reference/statements/alter/partition#how-to-set-partition-expression)で確認できます。 + +さらに、データはパーティションごとに効率的に削除することができます。これは代替技法(変異または論理削除)よりもはるかにリソース効率が高く、優先されるべきです。 + +```sql +ALTER TABLE otel_logs + (DROP PARTITION tuple('2019-01-25')) + +SELECT + Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 4667954 │ +│ 2019-01-23 │ 4653388 │ +│ 2019-01-24 │ 3792510 │ +└────────────┴─────────┘ +``` + +> この機能は`ttl_only_drop_parts=1`が使用されると有効期限 (TTL) によって活用されます。詳細については「有効期限 (TTL) を使用したデータ管理」を参照してください。 + +### アプリケーション + +上記の方法は、データを効率的に移動および操作する方法を示しています。実際にはユーザーはほとんどの場合、以下の2つのシナリオで観測性のユースケースにおいてパーティション操作を頻繁に利用するでしょう。 + +- **階層化アーキテクチャ** - ストレージ層間でデータを移動します(「ストレージティア」を参照)。これにより、ホットコールドアーキテクチャを構築することができます。 +- **効率的な削除** - データが指定された有効期限に達した場合(「有効期限 (TTL) を使用したデータ管理」を参照) + +以下に、これらの2つの詳細について詳しく説明します。 + +### クエリパフォーマンス + +パーティションはクエリのパフォーマンスに助けになりますが、それにはアクセスパターンに非常に依存します。もしクエリが少数のパーティション(理想的には1つ)のみをターゲットとする場合、パフォーマンスが潜在的に改善する可能性があります。これは通常、パーティショニングキーが主キーに含まれておらず、それによってフィルタリングを行う場合に有用です。ただし、多くのパーティションをカバーする必要があるクエリは、場合によってはパーティションを使用しない場合よりもパフォーマンスが悪くなる場合があります(パーツが多いため)。単一パーティションをターゲットとする利点は、パーティショニングキーがすでに主キーの初期エントリーである場合にはほとんど、または全く現れないかもしれません。パーティションは、各パーティション内の値がユニークである場合に[GROUP BYクエリを最適化するために使用](/ja/engines/table-engines/mergetree-family/custom-partitioning-key#group-by-optimisation-using-partition-key)することもできます。ただし、一般的に、ユーザーは主キーが最適化されていることを確認し、特定の予測可能なサブセットのアクセスパターンがある特殊な場合(例えば、日ごとにパーティショニングしており、ほとんどのクエリが前日のもの)にのみパーティショニングをクエリの最適化技術として考慮するべきです。この動作の例は[こちら](https://medium.com/datadenys/using-partitions-in-clickhouse-3ea0decb89c4)で確認できます。 + +## 有効期限 (TTL) を使用したデータ管理 + +Time-to-Live (TTL) は、ClickHouseを利用した観測性ソリューションにおける効率的なデータ保持と管理のための重要な機能です。特に膨大なデータが継続的に生成される場合においてそうです。ClickHouseにおいてTTLを実装することにより、古いデータの自動有効期限切れと削除が可能になり、ストレージが最適に使用され、手動介入なしで性能が維持されます。この機能は、データベースをスリムに保ち、ストレージコストを削減し、最も関連性が高く最新のデータに焦点を当てることでクエリの速度と効率を確保するために不可欠です。また、データ保持ポリシーに準拠し、データライフサイクルをシステマティックに管理することで、観測性ソリューションの全体的な持続可能性と拡張性を向上させます。 + +TTLはClickHouseにおいて、テーブルレベルまたはカラムレベルで指定することができます。 + +### テーブルレベルのTTL + +ログとトレースの両方のデフォルトのスキーマには、指定された期間後にデータの有効期限を設定するためのTTLが含まれています。これはClickHouseエクスポーターで`ttl`キーの下に指定されます。例: + +```yaml +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1 + ttl: 72h +``` + +この構文は現在[Golang Duration syntax](https://pkg.go.dev/time#ParseDuration)をサポートしています。**ユーザーには`h`を使用し、これがパーティショニング期間に一致することを確認することをお勧めします。例えば、日ごとにパーティショニングする場合、24h, 48h, 72hなどの日数の倍数であることを確認してください。** これにより、自動的にTTL句がテーブルに追加されます。例:`ttl: 96h`の場合。 + +```sql +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(4) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +デフォルトでは、期限切れのTTLを持つデータはClickHouseによって[データパーツがマージされる](/ja/engines/table-engines/mergetree-family/mergetree#mergetree-data-storage)時に削除されます。ClickHouseが期限切れのデータを検出すると、スケジュール外のマージを実行します。 + +> TTLはすぐに適用されるわけではなく、前述のようなスケジュールに従って適用されます。MergeTreeテーブル設定の`merge_with_ttl_timeout`は、削除TTLでのマージが繰り返される前の最小遅延を秒単位で設定します。デフォルト値は14400秒(4時間)です。しかし、それは最低限の遅延に過ぎず、TTLマージがトリガーされるまでに時間がかかる場合があります。値が低すぎると、多くのスケジュール外マージが発生し、リソースを多く消費する可能性があります。TTLの期限切れを強制するには、コマンド`ALTER TABLE my_table MATERIALIZE TTL`を使用します。 + +**重要:`ttl_only_drop_parts=1`の設定を使用することをお勧めします。**(デフォルトスキーマで適用されています)この設定が有効な場合、ClickHouseはすべての行が期限切れの状態になると全体のパートを削除します。部分的にTTL期限切れの行をクリーンアップする(`ttl_only_drop_parts=0`の場合にリソース集約的な変異を介して達成される)のではなく、全体のパートを削除することで、より短い`merge_with_ttl_timeout`時間を持ち、システム性能への影響を低くできます。データが、有効期間と同じ単位でパーティション化されている場合(例: 日)、パーツは自然に定義された間隔のデータのみを含むようになります。これにより`ttl_only_drop_parts=1`を効率的に適用することができます。 + +### カラムレベルのTTL + +上記の例では、データがテーブルレベルで期限切れになります。ユーザーはカラムレベルでもデータを期限切れにすることができます。データが古くなるにつれて、調査時にリソースのオーバーヘッドを正当化する価値がないカラムを削除するために使用できます。例えば、`Body`カラムを保持し続けることをお勧めします。これは挿入時に抽出されていない新しい動的メタデータが追加される可能性があるためです(例:新しいKubernetesラベル)。例えば1ヶ月後、追加のメタデータが役に立たないと明らかであれば、その値を保持する価値があることを制限できます。 + +30日後に`Body`カラムが削除される例を以下に示します。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String TTL Timestamp + INTERVAL 30 DAY, + `Timestamp` DateTime, + ... +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +> カラムレベルのTTLを指定する場合、ユーザー自身でスキーマを指定する必要があります。これはOTelコレクターでは指定できません。 + +## データの再圧縮 + +通常、観測性のデータセットには`ZSTD(1)`をお勧めしますが、ユーザーは異なる圧縮アルゴリズムや高レベルの圧縮、例えば`ZSTD(3)`を試行することができます。スキーマ作成時に指定することもでき、設定された期間後に変更できるように圧縮を設定することもできます。別のコーデックまたは圧縮アルゴリズムが圧縮を改善するがクエリパフォーマンスが低下する場合、このトレードオフは、調査での利用度が低い古いデータに対して許容できても、調査での利用度が高い新しいデータに対しては許容できません。 + +下記に、データを削除する代わりに4日後に`ZSTD(3)`でデータを圧縮する例を示します。 + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +TTL Timestamp + INTERVAL 4 DAY RECOMPRESS CODEC(ZSTD(3)) +``` + +> ユーザーは、異なる圧縮レベルやアルゴリズムが挿入およびクエリパフォーマンスに与える影響を評価することを常にお勧めします。例えば、デルタコーデックはタイムスタンプの圧縮に役立ちます。しかし、これが主キーの一部である場合、フィルタリング性能に影響を及ぼす可能性があります。 + +TTLの設定および例に関するさらなる詳細は[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes)で確認できます。TTLがテーブルおよびカラムに追加および修正される方法については[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)で確認できます。TTLがホット-ウォーム-コールドアーキテクチャなどのストレージ階層を可能にする方法については、「ストレージティア」を参照してください。 + +## ストレージティア + +ClickHouseでは、SSDによるホット/最近のデータとS3による古いデータを指すストレージティアを、異なるディスク上に作成することができます。このアーキテクチャにより、調査での利用頻度が低いために高いクエリSLAを持つ古いデータに、より低コストのストレージを用いることが可能です。 + +> ClickHouse Cloudは、S3にバックアップされた単一のデータコピーを使用し、SSD-backed ノードキャッシュを使用します。そのため、ClickHouse Cloudでストレージティアは必要ありません。 + +ストレージティアの作成には、ディスクの作成が必要で、その後ストレージポリシーを構築し、テーブル作成時に指定できるボリュームを使用します。データは、使用率、パーツサイズ、ボリュームの優先度に基づいて自動的に異なるディスク間で移動することができます。詳細は[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes)で確認できます。 + +データは`ALTER TABLE MOVE PARTITION`コマンドを使用して手動でディスク間を移動することができますが、TTLを使用してボリューム間のデータの移動を制御することも可能です。完全な例は[こちら](/ja/guides/developer/ttl#implementing-a-hotwarmcold-architecture)で確認できます。 + +## スキーマ変更の管理 + +システムのライフタイム中にログとトレーススキーマは必ず変わるでしょう。例えば、新しいメタデータやポッドラベルを持つ新しいシステムを監視する場合など。OTelスキーマを使用してデータを生成し、構造化された形式でオリジナルのイベントデータをキャプチャすることで、ClickHouseスキーマはこれらの変更に対して適応性を持つようになります。しかし、新しいメタデータが利用可能になり、クエリアクセスパターンが変化するにつれて、ユーザーはこれらの開発に対応するためにスキーマを更新したいと考えるでしょう。 + +スキーマ変更時のダウンタイムを避けるために、ユーザーはいくつかのオプションがあります。以下にそれらを示します。 + +### デフォルト値を使用する + +カラムは[`DEFAULT`値](/ja/sql-reference/statements/create/table#default)を使用してスキーマに追加することができます。INSERT時に指定されていない場合、指定されたデフォルトが使用されます。 + +スキーマ変更は、新しいカラムが送信されるようにするマテリアライズドビューの変換ロジックやOTelコレクターの設定を変更する前に行うことができます。 + +一度スキーマが変更されると、ユーザーはOTeLコレクターを再構成できます。推奨される「SQLでの構造抽出」で概説されているプロセスを使用することを想定した場合、OTeLコレクターがそのデータをNullテーブルエンジンに送信し、その結果を抽出してストレージに送信するためのマテリアライズドビューが担当し、ターゲットスキーマを抽出する場合、ビューは次の[`ALTER TABLE ... MODIFY QUERY`構文](/ja/sql-reference/statements/alter/view)を使用して修正できます。次のように、OTelの構造化ログからターゲットスキーマを抽出するためのビューを持つテーブルを例に示します: + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8 +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) + +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +`LogAttributes`から新しいカラム`Size`を抽出したいとします。これを`ALTER TABLE`を使用してスキーマに追加し、デフォルト値を指定できます: + +```sql +ALTER TABLE otel_logs_v2 + (ADD COLUMN `Size` UInt64 DEFAULT JSONExtractUInt(Body, 'size')) +``` + +上記の例では、`LogAttributes`の`size`キーをデフォルトとして指定しています(存在しない場合には0になります)。これは、値が挿入されなかった行に対して、このカラムをアクセスするクエリはマップをアクセスする必要があるため、これにより後のクエリのコストが増加します。もちろん、定数で指定することも可能です。例えば、0にすると、値が挿入されなかった行に対するその後のクエリのコストが下がります。このテーブルをクエリすることで、マップから期待通りに値が生成されることがわかります: + +```sql +SELECT Size +FROM otel_logs_v2 +LIMIT 5 +┌──Size─┐ +│ 30577 │ +│ 5667 │ +│ 5379 │ +│ 1696 │ +│ 41483 │ +└───────┘ + +5 rows in set. Elapsed: 0.012 sec. +``` + +この値がすべての将来のデータに対して挿入されることを保証するために、以下に示す`ALTER TABLE`構文を使用してマテリアライズドビューを修正できます: + +```sql +ALTER TABLE otel_logs_mv + MODIFY QUERY +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +その後の行には、挿入時に`Size`カラムが埋められます。 + +### 新しいテーブルを作成 + +上記のプロセスの代替として、ユーザーは新しいスキーマを持つ新しいターゲットテーブルを単に作成することができます。マテリアライズドビューは、上記の`ALTER TABLE MODIFY QUERY`を使用して新しいテーブルを使用するように修正できます。このアプローチでは、ユーザーは例えば`otel_logs_v3`のようにテーブルをバージョン管理することができます。 + +このアプローチでは、複数のテーブルをクエリする必要があります。テーブル名のワイルドカードパターンを受け入れる[`merge`関数](/ja/sql-reference/table-functions/merge)を使用することができます。v2とv3の`otel_logs`テーブルをクエリする例を以下に示します: + +```sql +SELECT Status, count() AS c +FROM merge('otel_logs_v[2|3]') +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 38319300 │ +│ 304 │ 1360912 │ +│ 302 │ 799340 │ +│ 404 │ 420044 │ +│ 301 │ 270212 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.137 sec. Processed 41.46 million rows, 82.92 MB (302.43 million rows/s., 604.85 MB/s.) +``` + +ユーザーが`merge`関数を使用することを回避し、複数のテーブルを組み合わせたテーブルをエンドユーザーに公開したい場合、[Mergeテーブルエンジン](/ja/engines/table-engines/special/merge)を使用できます。次にこの例を示します: + +```sql +CREATE TABLE otel_logs_merged +ENGINE = Merge('default', 'otel_logs_v[2|3]') + +SELECT Status, count() AS c +FROM otel_logs_merged +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 38319300 │ +│ 304 │ 1360912 │ +│ 302 │ 799340 │ +│ 404 │ 420044 │ +│ 301 │ 270212 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.073 sec. Processed 41.46 million rows, 82.92 MB (565.43 million rows/s., 1.13 GB/s.) +``` + +新しいテーブルが追加された場合、このテーブルは`EXCHANGE`テーブル構文を使用して更新できます。例えば、v4テーブルを追加するには、新しいテーブルを作成し、以前のバージョンと原子交換できます。 + +```sql +CREATE TABLE otel_logs_merged_temp +ENGINE = Merge('default', 'otel_logs_v[2|3|4]') + +EXCHANGE TABLE otel_logs_merged_temp AND otel_logs_merged + +SELECT Status, count() AS c +FROM otel_logs_merged +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 39259996 │ +│ 304 │ 1378564 │ +│ 302 │ 820118 │ +│ 404 │ 429220 │ +│ 301 │ 276960 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.068 sec. Processed 42.46 million rows, 84.92 MB (620.45 million rows/s., 1.24 GB/s.) +``` diff --git a/docs/ja/use-cases/observability/schema-design.md b/docs/ja/use-cases/observability/schema-design.md new file mode 100644 index 00000000000..f963dfa5f69 --- /dev/null +++ b/docs/ja/use-cases/observability/schema-design.md @@ -0,0 +1,1608 @@ +--- +title: スキーマ設計 +description: 観測性のためのスキーマ設計 +slug: /ja/observability/schema-design +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# 観測性のためのスキーマ設計 + +ユーザーには、以下の理由から、ログおよびトレース用の独自のスキーマを常に作成することをお勧めします。 + +- **主キーの選択** - デフォルトのスキーマは特定のアクセスパターンに最適化された `ORDER BY` を使用しています。したがって、あなたのアクセスパターンがこれに一致する可能性は低いです。 +- **構造の抽出** - ユーザーは、既存のカラムから新しいカラムを抽出したい場合があるかもしれません(例えば `Body` カラム)。これは、マテリアライズドカラム(および複雑なケースではマテリアライズドビュー)を使用して実現できます。これにはスキーマの変更が必要です。 +- **マップの最適化** - デフォルトのスキーマは、属性の保存に Map 型を使用しています。これらのカラムは任意のメタデータの保存を可能にします。これは重要な機能ですが、イベントからのメタデータは通常前もって定義されていないため、ClickHouseのような強く型付けられたデータベースに保存できません。そのため、マップキーやその値へのアクセスは通常のカラムに比べて効率が良くありません。これを解決するために、スキーマを変更し、最も一般的にアクセスされるマップキーをトップレベルのカラムとして配置することができます—「SQLでの構造の抽出」を参照してください。これにはスキーマの変更が必要です。 +- **マップキーアクセスの簡略化** - マップ内のキーにアクセスするにはより冗長な構文が必要です。ユーザーはエイリアスを使用することでこれを軽減できます。「エイリアスの使用」を参照してクエリを簡素化してください。 +- **セカンダリインデックス** - デフォルトのスキーマは、Map へのアクセスの高速化やテキストクエリの加速のためにセカンダリインデックスを使用します。これらは通常不要で、追加のディスクスペースを消費しますが、使用することができます。ただし、必要であることをテストする必要があります。「セカンダリ / データスキップインデックス」を参照してください。 +- **コーデックの使用** - ユーザーは、予期されるデータを理解し、圧縮を改善する証拠がある場合、カラムのコーデックをカスタマイズしたいと思うかもしれません。 + +_上記の各使用例について詳細に説明します。_ + +**重要**: ユーザーは最適な圧縮とクエリパフォーマンスを実現するためにスキーマを拡張および変更することが奨励されていますが、主要カラムのOTelスキーマ名付けに従うべきです。ClickHouseのGrafanaプラグインは、クエリビルドを支援するために、いくつかの基本的なOTelカラムの存在を前提としています(例:タイムスタンプやSeverityText)。ログおよびトレースに必要なカラムは、ここに文書化されています [[1]](https://grafana.com/developers/plugin-tools/tutorials/build-a-logs-data-source-plugin#logs-data-frame-format)[[2]](https://grafana.com/docs/grafana/latest/explore/logs-integration/) 及び[こちら](https://grafana.com/docs/grafana/latest/explore/trace-integration/#data-frame-structure)を参照してください。これらのカラム名を変更することができますが、プラグイン設定でデフォルトをオーバーライドしてください。 + +## SQLでの構造の抽出 + +構造化されたログまたは非構造化されたログを取り込む際、ユーザーはしばしば以下を実現する必要があります: + +- **文字列ブロブからのカラムの抽出**。これをクエリする方が、クエリ時の文字列操作よりも速くなります。 +- **マップからのキーの抽出**。デフォルトのスキーマは任意の属性を Map 型のカラムに格納します。この型はスキーマレスな機能を提供し、ユーザーがログやトレースを定義する際に属性のカラムを事前に定義する必要がないという利点があります—特にKubernetesからログを収集し、後でポッドラベルを保持することを保証したい場合、これはしばしば不可能です。マップのキーやその値へのアクセスは、普通のClickHouseカラムに比べて遅くなります。したがって、マップからキーを抽出してルートテーブルのカラムに配置することは、しばしば望ましいです。 + +以下のクエリを考えてみてください: + +特定のURLパスに対して最も多くのPOSTリクエストを受け取るカウントを取りたいとします。JSONブロブは `Body` カラムにStringとして保存されます。また、ユーザーがコレクター内でjson_parserを有効にしている場合、LogAttributesカラムに `Map(String, String)` としても保存される可能性があります。 + +```sql +SELECT LogAttributes +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +LogAttributes: {'status':'200','log.file.name':'access-structured.log','request_protocol':'HTTP/1.1','run_time':'0','time_local':'2019-01-22 00:26:14.000','size':'30577','user_agent':'Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)','referer':'-','remote_user':'-','request_type':'GET','request_path':'/filter/27|13 ,27| 5 ,p53','remote_addr':'54.36.149.41'} +``` + +LogAttributesが利用可能であると想定すると、サイトのどのURLパスが最も多くのPOSTリクエストを受け取っているかをカウントするためのクエリは次のとおりです: + +```sql +SELECT path(LogAttributes['request_path']) AS path, count() AS c +FROM otel_logs +WHERE ((LogAttributes['request_type']) = 'POST') +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productModelImages │ 10866 │ +│ /site/productAdditives │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.735 sec. Processed 10.36 million rows, 4.65 GB (14.10 million rows/s., 6.32 GB/s.) +Peak memory usage: 153.71 MiB. +``` + +ここでのマップ構文の使用に注意してください。たとえば `LogAttributes['request_path']`や、URLからクエリパラメータを削除するための [`path` 関数](/ja/sql-reference/functions/url-functions#path)です。 + +ユーザーがコレクター内でJSONパースを有効にしていない場合、`LogAttributes`は空になります。そのため、[JSON関数](/ja/sql-reference/functions/json-functions)を使用して文字列 `Body` からカラムを抽出する必要があります。 + +> 構造化されたログのJSONパースはClickHouseで行うことを一般的にお勧めします。ClickHouseが最速のJSONパース実装であると自信を持っています。ただし、ユーザーはログを他のソースに送信したい場合もあることを認識しています。それにこのロジックを SQL に配置したくない場合もあるでしょう。 + +```sql +SELECT path(JSONExtractString(Body, 'request_path')) AS path, count() AS c +FROM otel_logs +WHERE JSONExtractString(Body, 'request_type') = 'POST' +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productAdditives │ 10866 │ +│ /site/productModelImages │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.668 sec. Processed 10.37 million rows, 5.13 GB (15.52 million rows/s., 7.68 GB/s.) +Peak memory usage: 172.30 MiB. +``` + +次に、非構造化されたログを考えてみましょう: + +```sql +SELECT Body, LogAttributes +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: 151.233.185.144 - - [22/Jan/2019:19:08:54 +0330] "GET /image/105/brand HTTP/1.1" 200 2653 "https://www.zanbil.ir/filter/b43,p56" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-" +LogAttributes: {'log.file.name':'access-unstructured.log'} +``` + +非構造化ログの類似のクエリには、[`extractAllGroupsVertical` 関数](/ja/sql-reference/functions/string-search-functions#extractallgroupsvertical)を介した正規表現の使用が必要です。 + +```sql +SELECT + path((groups[1])[2]) AS path, + count() AS c +FROM +( + SELECT extractAllGroupsVertical(Body, '(\\w+)\\s([^\\s]+)\\sHTTP/\\d\\.\\d') AS groups + FROM otel_logs + WHERE ((groups[1])[1]) = 'POST' +) +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productModelImages │ 10866 │ +│ /site/productAdditives │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 1.953 sec. Processed 10.37 million rows, 3.59 GB (5.31 million rows/s., 1.84 GB/s.) +``` + +非構造化ログのパースのためのクエリの複雑さとコストが増加しているのに注意してください(パフォーマンスの違いに注意)。したがって、ユーザーには、可能な限り構造化されたログを使用することを強くお勧めします。 + +> 上記のクエリは、正規表現Dictionaryを利用して最適化できます。「Dictionaryの使用」を参照して詳細を確認してください。 + +これらの両方の使用例は、上記のクエリロジックを挿入時に移動させることにより、ClickHouseで満たすことができます。以下にいくつかのアプローチを示し、どのアプローチが適切かを強調します。 + +> ユーザーはまた、ここに説明されているように OTel Collector のプロセッサやオペレーターを使用して処理を行うこともできます。ほとんどの場合、ユーザーは ClickHouse がコレクターのプロセッサよりもリソース効率が高く、高速であることを見つけるでしょう。SQL で全てのイベント処理を行うことの主な欠点は、ソリューションが ClickHouse に結びつくことです。たとえば、ユーザーは OTel コレクターから他の宛先(例:S3)に処理済みのログを送信したい場合もあります。 + +### マテリアライズドカラム + +マテリアライズドカラムは、他のカラムから構造を抽出する最もシンプルな解決策を提供します。このようなカラムの値は常に挿入時に計算され、INSERTクエリで指定することはできません。 + +> マテリアライズドカラムは、挿入時に新しいカラムに値が抽出されるため、追加のストレージオーバーヘッドが発生します。 + +マテリアライズドカラムは、任意の ClickHouse 表現をサポートしており、[文字列の処理](/ja/sql-reference/functions/string-functions)([正規表現や検索](/ja/sql-reference/functions/string-search-functions)を含む)や [URL](/ja/sql-reference/functions/url-functions)、[型変換](/ja/sql-reference/functions/type-conversion-functions)、[JSON からの値の抽出](/ja/sql-reference/functions/json-functions)、または [数学的操作](/ja/sql-reference/functions/math-functions)など、あらゆる分析関数を活用できます。 + +基本処理にはマテリアライズドカラムを推奨します。これらは特に、マップから値を抽出し、それをルートカラムに昇格させ、型変換を行うのに役立ちます。非常に基本的なスキーマやマテリアライズドビューと組み合わせて使用する場合によく役立ちます。以下は、コレクターによってJSONが `LogAttributes` カラムに抽出されたログのスキーマです: + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `RequestPage` String MATERIALIZED path(LogAttributes['request_path']), + `RequestType` LowCardinality(String) MATERIALIZED LogAttributes['request_type'], + `RefererDomain` String MATERIALIZED domain(LogAttributes['referer']) +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +``` + +JSON関数を使用してString `Body` から抽出するための同等のスキーマは[こちら](https://pastila.nl/?005cbb97/513b174a7d6114bf17ecc657428cf829#gqoOOiomEjIiG6zlWhE+Sg==)にあります。 + +私たちの3つのマテリアライズドビューのカラムは、リクエストページ、リクエストタイプ、リファラーのドメインを抽出します。これらはマップのキーにアクセスし、その値に関数を適用します。次のクエリは、著しく速くなります: + +```sql +SELECT RequestPage AS path, count() AS c +FROM otel_logs +WHERE RequestType = 'POST' +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productAdditives │ 10866 │ +│ /site/productModelImages │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.173 sec. Processed 10.37 million rows, 418.03 MB (60.07 million rows/s., 2.42 GB/s.) +Peak memory usage: 3.16 MiB. +``` + +> マテリアライズドカラムは、デフォルトで `SELECT *` の場合に返されません。これは、SELECT * の結果が常にINSERTでテーブルに戻されることができるという不変条件を維持するためです。この動作は `asterisk_include_materialized_columns=1` を設定することで無効にでき、Grafanaでも有効にできます(データソース設定の `Additional Settings -> Custom Settings` を参照)。 + +## マテリアライズドビュー + +マテリアライズドビューは、ログやトレースに対してSQLフィルタリングや変換を適用するための、より強力な手段を提供します。 + +マテリアライズドビューは、クエリのコストをクエリ時から挿入時にシフトすることを許可します。ClickHouseのマテリアライズドビューは、テーブルにデータが挿入される際に、データブロック上でクエリを実行するトリガーに過ぎません。このクエリの結果が、第二の「ターゲット」テーブルに挿入されます。 + +NEEDS ALT + +
    + +> ClickHouseのマテリアライズドビューは、基になるテーブルにデータが流入するにつれてリアルタイムで更新され、継続的に更新されるインデックスのように機能します。対照的に、他のデータベースではマテリアライズドビューは通常クエリの静的スナップショットで、リフレッシュが必要です(ClickHouseのリフレッシュ可能なマテリアライズドビューに似ています)。 + +マテリアライズドビューに関連付けられたクエリは、理論的には、集計を含む任意のクエリである可能性がありますが、[JOINに制限があります](https://clickhouse.com/blog/using-materialized-views-in-clickhouse#materialized-views-and-joins)。ログやトレースに必要な変換やフィルターワークロードにおいて、ユーザーは任意のSELECT文を可能と見なすことができます。 + +ユーザーは、クエリが単にテーブル(ソーステーブル)に挿入される行上で実行されるトリガーであり、結果が新しいテーブル(ターゲットテーブル)に送信されることを覚えておく必要があります。 + +ソーステーブルにデータを二重保存しないようにするため、ソーステーブルのテーブルエンジンを[Nullテーブルエンジン](/ja/engines/table-engines/special/null)に変更し、元のスキーマを保持することができます。私たちのOTelコレクターは、このテーブルにデータを送信し続けます。たとえば、ログの場合、otel_logsテーブルは次のようになります。 + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)) +) ENGINE = Null +``` + +Nullテーブルエンジンは強力な最適化機能です— `/dev/null` のように考えてください。このテーブルはデータを保存しませんが、関連付けられたマテリアライズドビューは挿入された行に対して実行され続けます。 + +以下のクエリを検討してください。これは、行を私たちが保存したいフォーマットに変換します。LogAttributesからすべてのカラムを抽出し(これはコレクターによって `json_parser` オペレーターを使用して設定されたと仮定)、`SeverityText` と `SeverityNumber` を設定します(これにはいくつかの単純な条件と[これらのカラムに関する定義](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitytext)に基づいています)。この場合、ポピュレーションされることがわかっているカラムのみを選択します—TraceId、SpanId、TraceFlagsなどのカラムは無視します。 + +```sql +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status'] AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddr, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +Timestamp: 2019-01-22 00:26:14 +ServiceName: +Status: 200 +RequestProtocol: HTTP/1.1 +RunTime: 0 +Size: 30577 +UserAgent: Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/) +Referer: - +RemoteUser: - +RequestType: GET +RequestPath: /filter/27|13 ,27| 5 ,p53 +RemoteAddr: 54.36.149.41 +RefererDomain: +RequestPage: /filter/27|13 ,27| 5 ,p53 +SeverityText: INFO +SeverityNumber: 9 + +1 row in set. Elapsed: 0.027 sec. +``` + +上記のカラムには、将来的に追加される可能性のある追加属性を考慮して、`Body` カラムも抽出されています。このカラムはClickHouseでの圧縮が効き、アクセスされることはほとんどないため、クエリパフォーマンスに影響を与えることはありません。最後に、日時をDateTimeに変換(スペースを節約するため)します(「型の最適化」を参照)。 + +> 上記の `SeverityText` と `SeverityNumber` を抽出するための[条件文](/ja/sql-reference/functions/conditional-functions)の使用に注意してください。これらは複雑な条件を形成し、マップ内の値がセットされているかどうかを確認するのに非常に便利です。ルールに従い、LogAttributesにすべてのキーが存在することを単純に仮定します。ユーザーはそれに慣れることをお勧めします。これは、ログパースの友であり、[NULL値を扱う関数](/ja/sql-reference/functions/functions-for-nulls)の関数の他です! + +これらの結果を受け取るためのテーブルが必要です。以下のターゲットテーブルは、上記のクエリに一致します: + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8 +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +ここで選択された型は、「型の最適化」に関して議論された最適化に基づいています。 + +> スキーマが劇的に変更されたことに注意してください。実際には、ユーザーはTraceカラムを保持したい場合や、`ResourceAttributes`カラムも保持したい場合があるでしょう(これは通常Kubernetesメタデータを含みます)。Grafanaはトレースカラムを利用して、ログとトレース間のリンク機能を提供できます—「Grafanaの使用」を参照してください。 + +以下に、`otel_logs` テーブルに対して上記のセレクトを実行し、結果を `otel_logs_v2` に送信するマテリアライズドビュー `otel_logs_mv` を作成します。 + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +以下に示すように、上記は視覚化されます。 + +NEEDS ALT + +
    + +「Exporting to ClickHouse」で使用されているコレクター設定を再起動すると、データは期待される形式で `otel_logs_v2` に現れます。型付きJSON抽出関数の使用に注意してください。 + +```sql +SELECT * +FROM otel_logs_v2 +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +Timestamp: 2019-01-22 00:26:14 +ServiceName: +Status: 200 +RequestProtocol: HTTP/1.1 +RunTime: 0 +Size: 30577 +UserAgent: Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/) +Referer: - +RemoteUser: - +RequestType: GET +RequestPath: /filter/27|13 ,27| 5 ,p53 +RemoteAddress: 54.36.149.41 +RefererDomain: +RequestPage: /filter/27|13 ,27| 5 ,p53 +SeverityText: INFO +SeverityNumber: 9 + +1 row in set. Elapsed: 0.010 sec. +``` + +JSON関数を使用して `Body` カラムからカラムを抽出する同等のマテリアライズドビューを以下に示します: + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + JSONExtractUInt(Body, 'status') AS Status, + JSONExtractString(Body, 'request_protocol') AS RequestProtocol, + JSONExtractUInt(Body, 'run_time') AS RunTime, + JSONExtractUInt(Body, 'size') AS Size, + JSONExtractString(Body, 'user_agent') AS UserAgent, + JSONExtractString(Body, 'referer') AS Referer, + JSONExtractString(Body, 'remote_user') AS RemoteUser, + JSONExtractString(Body, 'request_type') AS RequestType, + JSONExtractString(Body, 'request_path') AS RequestPath, + JSONExtractString(Body, 'remote_addr') AS remote_addr, + domain(JSONExtractString(Body, 'referer')) AS RefererDomain, + path(JSONExtractString(Body, 'request_path')) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +### 型に注意 + +上記のマテリアライズドビューは暗黙の型変換に依存しています—特にLogAttributesマップの使用において。ClickHouseはしばしば、抽出された値を対象テーブルの型に透明にキャストし、必要な構文を減少させます。しかし、ユーザーは、同じスキーマを使用するターゲットテーブルに対して `SELECT` ステートメントを使用してビューを常にテストすることをお勧めします。これにより、型が正しく処理されていることを確認できます。特に以下のケースには注意が必要です: + +- マップ内にキーが存在しない場合、空の文字列が返されます。数値の場合、これは適切な値にマッピングする必要があります。これは、[条件文](/ja/sql-reference/functions/conditional-functions)(例:`if(LogAttributes['status'] = ", 200, LogAttributes['status'])`)または[キャスト関数](/ja/sql-reference/functions/type-conversion-functions#touint8163264256ordefault)を使用してこのように達成できます。デフォルト値が許容される場合(例:`toUInt8OrDefault(LogAttributes['status'] )`)。 +- 一部の型は常にキャストされない場合があります。例えば、数値の文字列表現は、列挙値にキャストされません。 +- JSON抽出関数は、値が見つからない場合、型のデフォルト値を返します。これらの値が意味を持つか確認してください! + +> 観測性データの ClickHouse において Nullable を使用することは避けてください。ログやトレースにおいて、空と NULL の違いを区別する必要はほとんどありません。この機能は追加のストレージオーバーヘッドをもたらし、クエリパフォーマンスに悪影響を与えます。詳細については[こちら](/ja/data-modeling/schema-design#optimizing-types)を参照ください。 + +## 主キー(オーダリングキー)の選択 + +希望するカラムを抽出したら、オーダリング/主キーを最適化することができます。 + +オーダリングキーを選択するためのいくつかの簡単なルールがあります。以下は、時には対立することがあるため、これらを順番に検討してください。このプロセスから多くのキーを特定でき、通常4〜5個で十分です。 + +1. 一般的なフィルタやアクセスパターンに適合するカラムを選択します。ユーザーが通常、特定のカラム(例:ポッド名)でフィルタリングを開始する場合、このカラムは `WHERE` 句で頻繁に使用されます。これらを他の頻繁に使用されないカラムよりも優先してキーに含めます。 +2. フィルタリング時に全体の行数の大部分を除外するのに役立つカラムを優先し、必要に応じて読み取るデータの量を減少させます。サービス名やステータスコードはしばしば良い候補です。後者の場合、ユーザーが200でフィルタリングするとほとんどの行にマッチするのが一般的です。500エラーのように小さなサブセットに関連付けられる場合を除きます。 +3. テーブル内の他のカラムと高い相関がある可能性が高いカラムを優先します。これにより、これらの値が連続して保存され、圧縮が向上します。 +4. オーダリングキーのカラムの `GROUP BY` および `ORDER BY` 操作は、メモリ効率を向上させることができます。 + +
    + +オーダリングキーの一部のカラムを特定すると、それらを特定の順序で宣言する必要があります。この順序は、クエリ内のセカンダリキー列でのフィルタリング効率と、テーブルのデータファイルの圧縮率に大きな影響を与える可能性があります。一般的に、**カーディナリティの昇順でキーを並べることが最良です**。ただし、オーダリングキー内で後に現れるカラムでフィルタリングする際の効率が低くなることにバランスを取る必要があります。これらの動作をバランスさせ、アクセスパターンを考慮してください。最も重要なのは、さまざまなバリエーションをテストすることです。オーダリングキーやオプティマイズの方法について理解を深めるためには、[この記事](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +> ログを整形した後に、オーダリングキーを決定することをお勧めします。属性マップ内のキーやJSON抽出式をオーダリングキーとして使用しないでください。オーダリングキーをテーブル内のルートカラムとして保持してください。 + +## マップの使用 + +以前の例では、`Map(String, String)` カラム内の値にアクセスするためにマップ構文 `map['key']` を使用していることを示しています。ネストされたキーにアクセスするためにマップ記法を使用するだけでなく、ClickHouse専用の[マップ関数](/ja/sql-reference/functions/tuple-map-functions#mapkeys)が利用可能で、これらのカラムをフィルタリングまたは選択することができます。 + +たとえば、次のクエリでは、[`mapKeys` 関数](/ja/sql-reference/functions/tuple-map-functions#mapkeys)を使用して、LogAttributesカラム内で利用可能なすべてのユニークキーを特定し、その後に[groupArrayDistinctArray関数](/ja/sql-reference/aggregate-functions/combinators)(コンビネータ)を続けます。 + +```sql +SELECT groupArrayDistinctArray(mapKeys(LogAttributes)) +FROM otel_logs +FORMAT Vertical + +行 1: +────── +groupArrayDistinctArray(mapKeys(LogAttributes)): ['remote_user','run_time','request_type','log.file.name','referer','request_path','status','user_agent','remote_addr','time_local','size','request_protocol'] + +1 row in set. Elapsed: 1.139 sec. Processed 5.63 million rows, 2.53 GB (4.94 million rows/s., 2.22 GB/s.) +Peak memory usage: 71.90 MiB. +``` + +> マップカラム名にドットを使用することをお勧めせず、将来的にその使用を非推奨にするかもしれません。 `_` を使用してください。 + +## エイリアスの使用 + +マップ型をクエリするのは、通常のカラムをクエリするよりも遅くなります—「クエリの高速化」を参照してください。さらに、構文がより複雑で、ユーザーが書くのが煩わしくなる可能性があります。この後の問題に対処するために、エイリアスカラムを使用することをお勧めします。 + +エイリアス(ALIAS)カラムは、クエリ時に計算され、テーブルに保存されません。したがって、この型のカラムに値をINSERTすることは不可能です。エイリアスを使用することで、マップキーを参照し、構文を簡素化し、マップエントリを通常のカラムとして透過的に露出させることができます。次の例を考えてみてください: + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `RequestPath` String MATERIALIZED path(LogAttributes['request_path']), + `RequestType` LowCardinality(String) MATERIALIZED LogAttributes['request_type'], + `RefererDomain` String MATERIALIZED domain(LogAttributes['referer']), + `RemoteAddr` IPv4 ALIAS LogAttributes['remote_addr'] +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, Timestamp) +``` + +いくつかのマテリアライズドカラムと、`ALIAS`カラムである`RemoteAddr`があり、これがマップ`LogAttributes`にアクセスします。これにより、`LogAttributes['remote_addr']`の値をこのカラムを通じてクエリできるため、クエリが簡素化されます。つまり、次のようにします。 + +```sql +SELECT RemoteAddr +FROM default.otel_logs +LIMIT 5 + +┌─RemoteAddr────┐ +│ 54.36.149.41 │ +│ 31.56.96.51 │ +│ 31.56.96.51 │ +│ 40.77.167.129 │ +│ 91.99.72.15 │ +└───────────────┘ + +5 rows in set. Elapsed: 0.011 sec. +``` + +さらに、`ALIAS`の追加は`ALTER TABLE`コマンドを使用して簡単に行えます。これらのカラムは即座に利用可能です。たとえば次のようにします。 + +```sql +ALTER TABLE default.otel_logs + (ADD COLUMN `Size` String ALIAS LogAttributes['size']) + +SELECT Size +FROM default.otel_logs_v3 +LIMIT 5 + +┌─Size──┐ +│ 30577 │ +│ 5667 │ +│ 5379 │ +│ 1696 │ +│ 41483 │ +└───────┘ + +5 rows in set. Elapsed: 0.014 sec. +``` + +> デフォルトでは、`SELECT *`はALIASカラムを除外します。この動作は`asterisk_include_alias_columns=1`を設定することで無効にできます。 + +## 型の最適化 + +型の最適化に関する[一般的な ClickHouse のベストプラクティス](/ja/data-modeling/schema-design#optimizing-types)は、ClickHouseの使用ケースにも適用されます。 + +## コーデックの使用 + +型の最適化に加えて、ユーザーはClickHouseの可視性スキーマの圧縮を最適化しようとする際に、[コーデックに関する一般的なベストプラクティス](/ja/data-compression/compression-in-clickhouse#choosing-the-right-column-compression-codec)に従うことができます。 + +一般に、ユーザーは`ZSTD`コーデックがログとトレースデータセットに非常に適用可能であることを確認できます。圧縮値をデフォルトの1から増加させることで、圧縮が改善される可能性があります。ただし、高い値は挿入時により大きなCPUオーバーヘッドを発生させるため、テストする必要があります。通常、この値を増加させても利益は少ないです。 + +さらに、タイムスタンプは圧縮に関してデルタエンコーディングから恩恵を受けますが、このカラムが主キー/順序付けキーで使用される場合、クエリパフォーマンスが遅くなることが示されています。ユーザーには、それぞれの圧縮とクエリパフォーマンスのトレードオフを評価することをお勧めします。 + +## Dictionaryの使用 + +[Dictionary](/ja/sql-reference/dictionaries)は、ClickHouseの[重要な機能](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse)であり、さまざまな内部および外部の[ソース](/ja/sql-reference/dictionaries#dictionary-sources)からのデータを、メモリ内で[キー・バリュー](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)表現として提供し、超低遅延のルックアップクエリに最適化されています。 + +NEEDS ALT + +
    + +これは、データを集約する際に、取り込んだデータをその場で強化し、取り込みプロセスを遅延させず、全体的にクエリのパフォーマンスを向上させるなど、さまざまなシナリオで便利です。特にJOINに有益です。可視性の使用ケースではジョインが必要になることは稀ですが、Dictionaryは挿入時とクエリ時の両方で強化目的で役立つことがあります。以下に両方の例を示します。 + +> Dictionaryを使用してジョインを加速したいユーザーは、[こちら](/ja/dictionary)でさらに詳細を確認できます。 + +### 挿入時とクエリ時 + +Dictionaryは、データセットをクエリ時または挿入時に強化するために使用できます。これらのアプローチにはそれぞれ利点と欠点があります。要約すると: + +- **挿入時** - これは通常、強化値が変更されず、Dictionaryにポピュレートできる外部ソースに存在する場合に適切です。この場合、挿入時に行を強化すると、クエリ時にDictionaryのルックアップが回避されます。これは、挿入パフォーマンスのコストと、強化された値がカラムとして格納されるため、追加のストレージオーバーヘッドが発生します。 +- **クエリ時** - Dictionary内の値が頻繁に変更される場合、クエリ時ルックアップがより適用可能です。値がマッピングされて変更された場合、カラムを更新する(データを再書き込みする)必要がなくなります。この柔軟性は、クエリ時のルックアップコストを考慮に入れる必要があります。たとえば、フィルター句でDictionaryルックアップを使用する場合、複数の行のルックアップが必要であれば、このクエリ時コストは通常は顕著です。結果の強化、すなわち`SELECT`内では、このオーバーヘッドは通常顕著ではありません。 + +私たちは、ユーザーがDictionaryの基本を理解することをお勧めします。Dictionaryは、特定の[専門関数](/ja/sql-reference/functions/ext-dict-functions#dictgetall)を使用して値を取得できるメモリ内のルックアップテーブルを提供します。 + +シンプルな強化例については、Dictionaryに関するガイド[こちら](/ja/dictionary)を参照してください。以下では、一般的な可視性強化タスクに焦点を当てます。 + +### IP Dictionaryの使用 + +IPアドレスを使用してログやトレースに緯度と経度の値をジオ強化することは、一般的な可視性要件です。`ip_trie` Dictionary構造を使用することで実現できます。 + +私たちは、[DB-IP.com](https://db-ip.com/)によって提供されている、月ごとに更新される[DB-IP市レベルデータセット](https://github.com/sapics/ip-location-db#db-ip-database-update-monthly)を公開されているものを使用します。 + +[README](https://github.com/sapics/ip-location-db#csv-format)から、データが次のように構造化されていることを確認できます。 + +```csv +| ip_range_start | ip_range_end | country_code | state1 | state2 | city | postcode | latitude | longitude | timezone | +``` + +この構造を考慮して、URLテーブル関数を使用してデータを確認してみましょう。 + +```sql +SELECT * +FROM url('https://raw.githubusercontent.com/sapics/ip-location-db/master/dbip-city/dbip-city-ipv4.csv.gz', 'CSV', '\n \tip_range_start IPv4, \n \tip_range_end IPv4, \n \tcountry_code Nullable(String), \n \tstate1 Nullable(String), \n \tstate2 Nullable(String), \n \tcity Nullable(String), \n \tpostcode Nullable(String), \n \tlatitude Float64, \n \tlongitude Float64, \n \ttimezone Nullable(String)\n \t') +LIMIT 1 +FORMAT Vertical +Row 1: +────── +ip_range_start: 1.0.0.0 +ip_range_end: 1.0.0.255 +country_code: AU +state1: Queensland +state2: ᴺᵁᴸᴸ +city: South Brisbane +postcode: ᴺᵁᴸᴸ +latitude: -27.4767 +longitude: 153.017 +timezone: ᴺᵁᴸᴸ +``` + +私たちの生活を簡単にするために、[`URL()`](/ja/engines/table-engines/special/url)テーブルエンジンを使用して、ClickHouseテーブルオブジェクトを作成し、行数を確認します。 + +```sql +CREATE TABLE geoip_url( + ip_range_start IPv4, + ip_range_end IPv4, + country_code Nullable(String), + state1 Nullable(String), + state2 Nullable(String), + city Nullable(String), + postcode Nullable(String), + latitude Float64, + longitude Float64, + timezone Nullable(String) +) ENGINE = URL('https://raw.githubusercontent.com/sapics/ip-location-db/master/dbip-city/dbip-city-ipv4.csv.gz', 'CSV') + +SELECT count() FROM geoip_url; + +┌─count()─┐ +│ 3261621 │ -- 3.26百万 +└─────────┘ +``` + +私たちの`ip_trie`Dictionaryは、IPアドレス範囲をCIDR表記で表現する必要があるため、`ip_range_start`と`ip_range_end`を変換する必要があります。 + +各範囲についてのCIDRは、次のクエリで簡潔に計算できます。 + +```sql +WITH + bitXor(ip_range_start, ip_range_end) AS xor, + if(xor != 0, ceil(log2(xor)), 0) AS unmatched, + 32 - unmatched AS cidr_suffix, + toIPv4(bitAnd(bitNot(pow(2, unmatched) - 1), ip_range_start)::UInt64) AS cidr_address +SELECT + ip_range_start, + ip_range_end, + concat(toString(cidr_address),'/',toString(cidr_suffix)) AS cidr +FROM + geoip_url +LIMIT 4; + +┌─ip_range_start─┬─ip_range_end─┬─cidr───────┐ +│ 1.0.0.0 │ 1.0.0.255 │ 1.0.0.0/24 │ +│ 1.0.1.0 │ 1.0.3.255 │ 1.0.0.0/22 │ +│ 1.0.4.0 │ 1.0.7.255 │ 1.0.4.0/22 │ +│ 1.0.8.0 │ 1.0.15.255 │ 1.0.8.0/21 │ +└────────────────┴──────────────┴────────────┘ + +4 rows in set. Elapsed: 0.259 sec. +``` + +> 上記のクエリでは多くのことが行われています。興味のある方は、こちらの[優れた説明](https://clickhouse.com/blog/geolocating-ips-in-clickhouse-and-grafana#using-bit-functions-to-convert-ip-ranges-to-cidr-notation)を読んでください。それ以外は、上記の計算がIP範囲のCIDRを計算することを受け入れてください。 + +私たちの目的のためには、IP範囲、国コード、および座標だけが必要ですので、新しいテーブルを作成し、GeoIPデータを挿入します。 + +```sql +CREATE TABLE geoip +( + `cidr` String, + `latitude` Float64, + `longitude` Float64, + `country_code` String +) +ENGINE = MergeTree +ORDER BY cidr + +INSERT INTO geoip +WITH + bitXor(ip_range_start, ip_range_end) AS xor, + if(xor != 0, ceil(log2(xor)), 0) AS unmatched, + 32 - unmatched AS cidr_suffix, + toIPv4(bitAnd(bitNot(pow(2, unmatched) - 1), ip_range_start)::UInt64) AS cidr_address +SELECT + concat(toString(cidr_address),'/',toString(cidr_suffix)) AS cidr, + latitude, + longitude, + country_code +FROM geoip_url +``` + +低遅延のIPルックアップをClickHouseで実行できるように、Dictionaryを活用して、GeoIPデータのキー→属性マッピングをメモリ内に保存します。ClickHouseは、ネットワークプレフィックス(CIDRブロック)を座標および国コードにマッピングするための`ip_trie` [Dictionary構造](/ja/sql-reference/dictionaries#ip_trie)を提供します。次は、このレイアウトを使用し、上述のテーブルをソースとして指定するDictionaryを作成します。 + +```sql +CREATE DICTIONARY ip_trie ( + cidr String, + latitude Float64, + longitude Float64, + country_code String +) +PRIMARY KEY cidr +SOURCE(CLICKHOUSE(TABLE 'geoip')) +LAYOUT(ip_trie) +LIFETIME(3600); +``` + +Dictionaryから行を選択し、このデータセットがルックアップ用に利用可能であることを確認できます。 + +```sql +SELECT * FROM ip_trie LIMIT 3 + +┌─cidr───────┬─latitude─┬─longitude─┬─country_code─┐ +│ 1.0.0.0/22 │ 26.0998 │ 119.297 │ CN │ +│ 1.0.0.0/24 │ -27.4767 │ 153.017 │ AU │ +│ 1.0.4.0/22 │ -38.0267 │ 145.301 │ AU │ +└────────────┴──────────┴───────────┴──────────────┘ + +3 rows in set. Elapsed: 4.662 sec. +``` + +> ClickHouseのDictionaryは、基になるテーブルデータと使用したライフタイム条件に基づいて、定期的に更新されます。DB-IPデータセットの最新の変更を反映するために、`geoip`テーブルに対して、geoip_urlリモートテーブルからデータを再挿入する必要があります。 + +GeoIPデータがip_trie Dictionary(便利にもip_trieという名前)にロードされたので、これを使用してIPのジオロケーションを実行できます。これは、次のように[`dictGet()`関数](/ja/sql-reference/functions/ext-dict-functions)を使用することで実現できます。 + +```sql +SELECT dictGet('ip_trie', ('country_code', 'latitude', 'longitude'), CAST('85.242.48.167', 'IPv4')) AS ip_details + +┌─ip_details──────────────┐ +│ ('PT',38.7944,-9.34284) │ +└─────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +ここでの取得速度に注目してください。これにより、ログを強化することができます。この場合、**クエリ時の強化を実行する**ことにします。 + +元のログデータセットに戻ると、国別にログを集約するために上記を使用できます。以下は、`RemoteAddress`カラムを抽出したマテリアライズドビューから得られるスキーマを使用すると仮定します。 + +```sql +SELECT dictGet('ip_trie', 'country_code', tuple(RemoteAddress)) AS country, + formatReadableQuantity(count()) AS num_requests +FROM default.otel_logs_v2 +WHERE country != '' +GROUP BY country +ORDER BY count() DESC +LIMIT 5 + +┌─country─┬─num_requests────┐ +│ IR │ 736万 │ +│ US │ 167万 │ +│ AE │ 52.674万 │ +│ DE │ 15.935万 │ +│ FR │ 10.982万 │ +└─────────┴─────────────────┘ + +5 rows in set. Elapsed: 0.140 sec. Processed 20.73 million rows, 82.92 MB (147.79 million rows/s., 591.16 MB/s.) +Peak memory usage: 1.16 MiB. +``` + +IPから地理的な位置へのマッピングは変わる可能性があるため、ユーザーはリクエストが行われた時点での元の位置を知りたい可能性が高くなります。この理由から、インデックス時の強化はここで望ましいと考えられます。これは、次のように、マテリアライズドカラムを使用することで行うことができます。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + `Country` String MATERIALIZED dictGet('ip_trie', 'country_code', tuple(RemoteAddress)), + `Latitude` Float32 MATERIALIZED dictGet('ip_trie', 'latitude', tuple(RemoteAddress)), + `Longitude` Float32 MATERIALIZED dictGet('ip_trie', 'longitude', tuple(RemoteAddress)) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +> ユーザーは、新しいデータに基づいてIP Dictionaryの強化が定期的に更新されることを望む可能性が高いです。これはDictionaryのLIFETIME句を使用して達成でき、これによりDictionaryが基になるテーブルから定期的に再ロードされます。基になるテーブルを更新する方法は、「リフレッシュ可能なマテリアライズドビューの使用」を参照してください。 + +上記の国と座標は、国別にグループ化およびフィルタリングする以上の可視化能力を提供します。インスピレーションについては、「地理データの可視化」を参照してください。 + +### 正規表現Dictionaryの使用(ユーザーエージェント解析) + +ユーザーエージェント文字列の解析は、古典的な正規表現の問題であり、ログやトレースベースのデータセットの一般的な要件です。ClickHouseは、正規表現ツリーディクショナリを使用してユーザーエージェントの効率的な解析を提供します。 + +正規表現ツリーディクショナリは、ClickHouseオープンソースでYAMLRegExpTree Dictionaryソースタイプを使用して定義されており、正規表現ツリーを含むYAMLファイルへのパスを提供します。独自の正規表現Dictionaryを提供する場合に必要な構造の詳細は[こちら](/ja/sql-reference/dictionaries#use-regular-expression-tree-dictionary-in-clickhouse-open-source)にあります。以下では、ユーザーエージェント解析に[ua-parser](https://github.com/ua-parser/uap-core)を使用し、サポートされているCSVフォーマット用のDictionaryをロードします。このアプローチはOSSとClickHouse Cloudに対応しています。 + +> 以下の例では、2024年6月の最新のuap-coreユーザーエージェント解析用の正規表現のスナップショットを使用します。最新のファイルは時々更新され、[こちら](https://raw.githubusercontent.com/ua-parser/uap-core/master/regexes.yaml)で確認できます。ユーザーは、以下に使用されるCSVファイルをロードする手順を[こちら](/ja/sql-reference/dictionaries#collecting-attribute-values)で確認できます。 + +次のように、メモリテーブルを作成します。これにより、デバイス、ブラウザ、およびオペレーティングシステムの解析用の正規表現が保持されます。 + +```sql +CREATE TABLE regexp_os +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; + +CREATE TABLE regexp_browser +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; + +CREATE TABLE regexp_device +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; +``` + +これらのテーブルは、URLテーブル関数を使用して、以下の公開ホストCSVファイルからポピュレートできます。 + +```sql +INSERT INTO regexp_os SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_os.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') + +INSERT INTO regexp_device SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_device.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') + +INSERT INTO regexp_browser SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_browser.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') +``` + +メモリテーブルがポピュレートされたので、正規表現 Dictionaryをロードできます。ここで注意すべきは、キー値をカラムとして指定する必要があることです。これが、ユーザーエージェントから抽出できる属性になります。 + +```sql +CREATE DICTIONARY regexp_os_dict +( + regexp String, + os_replacement String default 'Other', + os_v1_replacement String default '0', + os_v2_replacement String default '0', + os_v3_replacement String default '0', + os_v4_replacement String default '0' +) +PRIMARY KEY regexp +SOURCE(CLICKHOUSE(TABLE 'regexp_os')) +LIFETIME(MIN 0 MAX 0) +LAYOUT(REGEXP_TREE); + +CREATE DICTIONARY regexp_device_dict +( + regexp String, + device_replacement String default 'Other', + brand_replacement String, + model_replacement String +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_device')) +LIFETIME(0) +LAYOUT(REGEXP_TREE); + +CREATE DICTIONARY regexp_browser_dict +( + regexp String, + family_replacement String default 'Other', + v1_replacement String default '0', + v2_replacement String default '0' +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_browser')) +LIFETIME(0) +LAYOUT(REGEXP_TREE); +``` + +これらのDictionaryをロードした後、サンプルのユーザーエージェントを提供し、新しいDictionaryの抽出機能をテストできます。 + +```sql +WITH 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:127.0) Gecko/20100101 Firefox/127.0' AS user_agent +SELECT + dictGet('regexp_device_dict', ('device_replacement', 'brand_replacement', 'model_replacement'), user_agent) AS device, + dictGet('regexp_browser_dict', ('family_replacement', 'v1_replacement', 'v2_replacement'), user_agent) AS browser, + dictGet('regexp_os_dict', ('os_replacement', 'os_v1_replacement', 'os_v2_replacement', 'os_v3_replacement'), user_agent) AS os + +┌─device────────────────┬─browser───────────────┬─os─────────────────────────┐ +│ ('Mac','Apple','Mac') │ ('Firefox','127','0') │ ('Mac OS X','10','15','0') │ +└───────────────────────┴───────────────────────┴────────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +ユーザーエージェントに関するルールはほとんど変わらないため、新しいブラウザ、オペレーティングシステム、およびデバイスに応じてDictionaryを更新する必要があるため、挿入時にこの抽出を実行するのが理にかなっています。 + +この作業は、マテリアライズドカラムを使用するか、マテリアライズドビューを使用して行うことができます。以前に使用したマテリアライズドビューを修正します。 + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 +AS SELECT + Body, + CAST(Timestamp, 'DateTime') AS Timestamp, + ServiceName, + LogAttributes['status'] AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(CAST(Status, 'UInt64') > 500, 'CRITICAL', CAST(Status, 'UInt64') > 400, 'ERROR', CAST(Status, 'UInt64') > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(CAST(Status, 'UInt64') > 500, 20, CAST(Status, 'UInt64') > 400, 17, CAST(Status, 'UInt64') > 300, 13, 9) AS SeverityNumber, + dictGet('regexp_device_dict', ('device_replacement', 'brand_replacement', 'model_replacement'), UserAgent) AS Device, + dictGet('regexp_browser_dict', ('family_replacement', 'v1_replacement', 'v2_replacement'), UserAgent) AS Browser, + dictGet('regexp_os_dict', ('os_replacement', 'os_v1_replacement', 'os_v2_replacement', 'os_v3_replacement'), UserAgent) AS Os +FROM otel_logs +``` + +これにより、ターゲットテーブル`otel_logs_v2`のスキーマを修正する必要があります。 + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt8, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `remote_addr` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + `Device` Tuple(device_replacement LowCardinality(String), brand_replacement LowCardinality(String), model_replacement LowCardinality(String)), + `Browser` Tuple(family_replacement LowCardinality(String), v1_replacement LowCardinality(String), v2_replacement LowCardinality(String)), + `Os` Tuple(os_replacement LowCardinality(String), os_v1_replacement LowCardinality(String), os_v2_replacement LowCardinality(String), os_v3_replacement LowCardinality(String)) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp, Status) +``` + +コレクタを再起動し、構造化されたログを取り込んだ後、次のように新しく抽出されたDevice、Browser、およびOsカラムをクエリできます。 + +```sql +SELECT Device, Browser, Os +FROM otel_logs_v2 +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Device: ('Spider','Spider','Desktop') +Browser: ('AhrefsBot','6','1') +Os: ('Other','0','0','0') +``` + +> ユーザーエージェントカラムに対してタプルを使用することに注意してください。タプルは、階層が事前に知られている複雑な構造に推奨されます。サブカラムは、マップキーと異なり、通常のカラムと同じパフォーマンスを提供しますが、異種型が可能です。 + +### さらなる読み物 + +Dictionaryに関するより多くの例や詳細については、次のような記事をお勧めします。 + +- [Dictionaryの高度なトピック](/ja/dictionary#advanced-dictionary-topics) +- [「Dictionaryを使用してクエリを加速する」](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) +- [Dictionary](/ja/sql-reference/dictionaries) + +## クエリの加速 + +ClickHouseは、クエリパフォーマンスを加速するためのいくつかのテクニックをサポートしています。以下は、適切な主キー/順序付けキーを選択して最も人気のあるアクセスパターンを最適化し、圧縮を最大化する過程で検討すべきことです。これは通常、最小限の労力でパフォーマンスに最も大きな影響を与えます。 + +## 集約のためのマテリアライズドビュー(増分)使用 + +以前のセクションでは、データ変換とフィルタリングのためにマテリアライズドビューを使用することを探りました。しかし、マテリアライズドビューは、挿入時に集約を事前計算し、その結果をストアするためにも使用できます。この結果は、後続の挿入からの結果で更新できるため、実際に挿入時に集約を計算することができます。 + +ここでの主なアイデアは、結果が元のデータの小さい表現(集約の場合の一部のスケッチ)であることが多いということです。結果をターゲットテーブルから読み取るためのシンプルなクエリと組み合わせると、元のデータで同じ計算を行うよりもクエリ時間が早くなります。 + +構造化ログを使用して、時間ごとのトラフィック合計を計算する次のクエリを考えてみましょう。 + +```sql +SELECT toStartOfHour(Timestamp) AS Hour, + sum(toUInt64OrDefault(LogAttributes['size'])) AS TotalBytes +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.666 sec. Processed 10.37 million rows, 4.73 GB (15.56 million rows/s., 7.10 GB/s.) +Peak memory usage: 1.40 MiB. +``` + +これはGrafanaでの一般的なラインチャートになる可能性があります。このクエリは明らかに非常に速いです - データセットはわずか10百万行であり、ClickHouseは速いです!しかし、これをビリオンやトリリオン行にスケールさせると、私たちはこのクエリパフォーマンスを維持することを望むでしょう。 + +> このクエリは、LogAttributesからサイズキーを抽出する以前のマテリアライズドビューであるotel_logs_v2を使用すると、10倍速くなります。この例では生データを使用していますが、これはこのクエリが一般的な場合は以前のビューを使用することを推奨します。 + +マテリアライズドビューを使用して挿入時に計算を行う結果を受け取るテーブルが必要です。このテーブルは、各時間ごとに1行のみを保持する必要があります。既存の時間に対して更新が受信された場合、他のカラムは既存の時間の行にマージされる必要があります。部分的な状態を他のカラムのために保存することで、この増分状態のマージを実現できます。 + +これはClickHouseの特別なエンジンタイプ、すなわちSummingMergeTreeを必要とします。これにより、同じ順序キーを持つすべての行が1つの行に置き換えられ、数値カラムの値が合計された行が含まれます。次のテーブルは、同じ日付の行をマージし、数値カラムを合計します。 + +```sql +CREATE TABLE bytes_per_hour +( + `Hour` DateTime, + `TotalBytes` UInt64 +) +ENGINE = SummingMergeTree +ORDER BY Hour +``` + +挿入時に上記のSELECTを実行して、マテリアライズドビューを示すと仮定します。bytes_per_hourテーブルは空で、データの受信がまだ行われていないとします。マテリアライズドビューは、otel_logsに挿入されたデータに対して上記のSELECTを実行し、その結果をbytes_per_hourに送信します。構文は以下の通りです。 + +```sql +CREATE MATERIALIZED VIEW bytes_per_hour_mv TO bytes_per_hour AS +SELECT toStartOfHour(Timestamp) AS Hour, + sum(toUInt64OrDefault(LogAttributes['size'])) AS TotalBytes +FROM otel_logs +GROUP BY Hour +``` + +ここでの`TO`句は重要であり、結果が送信される場所、すなわち`bytes_per_hour`を示しています。 + +Otel Collectorを再起動し、ログを再送信すると、`bytes_per_hour`テーブルは上記のクエリ結果で増分的にポピュレートされます。完了後、`bytes_per_hour`のサイズを確認すると、時間ごとに1行のはずです。 + +```sql +SELECT count() +FROM bytes_per_hour +FINAL + +┌─count()─┐ +│ 113 │ +└─────────┘ +``` + +ここでは、`otel_logs`内の10百万行から113行に実質的に減少しました。このキーは、新しいログが`otel_logs`テーブルに挿入されると、新しい値がそれぞれの時間のために`bytes_per_hour`に送信され、バックグラウンドで非同期に自動的にマージされます。`bytes_per_hour`は常に小さく、最新の状態に保たれます。 + +行のマージは非同期であるため、ユーザーがクエリを行う際には、時間ごとに複数の行が存在する可能性があります。クエリ時に未処理の行がマージされるようにするために、2つのオプションがあります。 + +1. テーブル名の[`FINAL`修飾子](/ja/sql-reference/statements/select/from#final-modifier)を使用します。これは、上記のカウントクエリでも行いました。 +2. 最終テーブルで使用される順序キー(この場合はTimestamp)を集約し、メトリックを合計します。これは通常、効率が良く柔軟性があり(テーブルは他の用途にも使用できる)、前者は一部のクエリにはより簡単かもしれません。両方を以下に示します。 + +```sql +SELECT + Hour, + sum(TotalBytes) AS TotalBytes +FROM bytes_per_hour +GROUP BY Hour +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.008 sec. + +SELECT + Hour, + TotalBytes +FROM bytes_per_hour +FINAL +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.005 sec. +``` + +この結果、クエリの速度は0.6秒から0.008秒に75倍向上しました! + +> これらの節約は、より大きなデータセットやより複雑なクエリではさらに大きくなる可能性があります。例については[こちら](https://github.com/ClickHouse/clickpy)を参照してください。 + +### より複雑な例 + +上記の例は、SummingMergeTreeを使用して時間ごとの単純なカウントを集約しています。単純な合計を超える統計には、異なるターゲットテーブルエンジンであるAggregatingMergeTreeが必要です。 + +たとえば、日ごとのユニークなIPアドレス数(ユニークなユーザー数)を計算したいとします。このためのクエリは次の通りです。 + +```sql +SELECT toStartOfHour(Timestamp) AS Hour, uniq(LogAttributes['remote_addr']) AS UniqueUsers +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC + +┌────────────────Hour─┬─UniqueUsers─┐ +│ 2019-01-26 16:00:00 │ 4763 │ +… +│ 2019-01-22 00:00:00 │ 536 │ +└─────────────────────┴────────────┘ + +113 rows in set. Elapsed: 0.667 sec. Processed 10.37 million rows, 4.73 GB (15.53 million rows/s., 7.09 GB/s.) +``` + +集約のために増分更新を維持するには、AggregatingMergeTreeが必要です。 + +```sql +CREATE TABLE unique_visitors_per_hour +( + `Hour` DateTime, + `UniqueUsers` AggregateFunction(uniq, IPv4) +) +ENGINE = AggregatingMergeTree +ORDER BY Hour +``` + +ClickHouseが集約状態が保存されることを認識するように、`UniqueUsers`カラムの型を[`AggregateFunction`](/ja/sql-reference/data-types/aggregatefunction)として定義し、部分状態のソース関数(uniq)とソースカラムの型(IPv4)を指定します。SummingMergeTreeと同様に、同じ`ORDER BY`キー値を持つ行がマージされます(上記の例ではHour)。 + +関連するマテリアライズドビューは、以前のクエリを使用します。 + +```sql +CREATE MATERIALIZED VIEW unique_visitors_per_hour_mv TO unique_visitors_per_hour AS +SELECT toStartOfHour(Timestamp) AS Hour, + uniqState(LogAttributes['remote_addr']::IPv4) AS UniqueUsers +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC +``` + +集約関数の末尾に`suffix`を追加することに注意してください。これは、関数の集約状態が戻されることを保証し、最終結果ではありません。これにより、この部分状態が他の状態とマージするための追加情報を含むことができます。 + +データが再読み込みされた後、コレクタの再起動を経て、`unique_visitors_per_hour`テーブルに113行が確認できることができます。 + +```sql +SELECT count() +FROM unique_visitors_per_hour +FINAL + +┌─count()─┐ +│ 113 │ +└─────────┘ +``` +Our final query needs to utilize the Merge suffix for our functions (as the columns store partial aggregation states): + +```sql +SELECT Hour, uniqMerge(UniqueUsers) AS UniqueUsers +FROM unique_visitors_per_hour +GROUP BY Hour +ORDER BY Hour DESC + +┌────────────────Hour─┬─UniqueUsers─┐ +│ 2019-01-26 16:00:00 │ 4763 │ + +│ 2019-01-22 00:00:00 │ 536 │ +└─────────────────────┴─────────────┘ + +113 rows in set. Elapsed: 0.027 sec. +``` + +Note we use a `GROUP BY` here instead of using `FINAL`. + +## 使用したマテリアライズドビュー (累積) による高速検索 + +ユーザーは、フィルターおよび集計句で頻繁に使用されるカラムで ClickHouse の順序キーを選択する際に、そのアクセスパターンを考慮する必要があります。これは、ユーザーが多様なアクセスパターンを持つ観測性のユースケースにおいて、単一のカラムセットでカプセル化できないため制約になることがあります。これをデフォルトのOTelスキーマに組み込まれた例で最もよく示しています。トレースのデフォルトスキーマを考えてみましょう: + +```sql +CREATE TABLE otel_traces +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `ParentSpanId` String CODEC(ZSTD(1)), + `TraceState` String CODEC(ZSTD(1)), + `SpanName` LowCardinality(String) CODEC(ZSTD(1)), + `SpanKind` LowCardinality(String) CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `Duration` Int64 CODEC(ZSTD(1)), + `StatusCode` LowCardinality(String) CODEC(ZSTD(1)), + `StatusMessage` String CODEC(ZSTD(1)), + `Events.Timestamp` Array(DateTime64(9)) CODEC(ZSTD(1)), + `Events.Name` Array(LowCardinality(String)) CODEC(ZSTD(1)), + `Events.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + `Links.TraceId` Array(String) CODEC(ZSTD(1)), + `Links.SpanId` Array(String) CODEC(ZSTD(1)), + `Links.TraceState` Array(String) CODEC(ZSTD(1)), + `Links.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +``` + +このスキーマは、`ServiceName`、`SpanName`、および `Timestamp` によるフィルタリングに最適化されています。トレーシングでは、ユーザーは特定の `TraceId` による検索を行い、関連するトレースのスパンを取得する必要があります。これが順序キーに存在しますが、その位置が最後にあるため、[フィルタリングの効率が低下する](https://en/optimize/sparse-primary-indexes#ordering-key-columns-efficiently)ことがあり、単一のトレースを取得する際に、多くのデータをスキャンしなければならない可能性があります。 + +OTel コレクターは、この課題に対処するために、マテリアライズドビューと関連するテーブルもインストールします。テーブルとビューは以下のようになります: + +```sql +CREATE TABLE otel_traces_trace_id_ts +( + `TraceId` String CODEC(ZSTD(1)), + `Start` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `End` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.01) GRANULARITY 1 +) +ENGINE = MergeTree +ORDER BY (TraceId, toUnixTimestamp(Start)) + + +CREATE MATERIALIZED VIEW otel_traces_trace_id_ts_mv TO otel_traces_trace_id_ts +( + `TraceId` String, + `Start` DateTime64(9), + `End` DateTime64(9) +) +AS SELECT + TraceId, + min(Timestamp) AS Start, + max(Timestamp) AS End +FROM otel_traces +WHERE TraceId != '' +GROUP BY TraceId +``` + +このビューは、テーブル `otel_traces_trace_id_ts` にトレースの最小および最大のタイムスタンプを持つことを実効的に保証します。このテーブルは、`TraceId` によって順序付けられており、これによりこれらのタイムスタンプを効率的に取得できます。これらのタイムスタンプ範囲は、メイントレース `otel_traces` テーブルをクエリする際にも使用できます。具体的には、トレースのIDで取得する際にGrafanaが使用するクエリは以下の通りです: + +```sql +WITH 'ae9226c78d1d360601e6383928e4d22d' AS trace_id, + ( + SELECT min(Start) + FROM default.otel_traces_trace_id_ts + WHERE TraceId = trace_id + ) AS trace_start, + ( + SELECT max(End) + 1 + FROM default.otel_traces_trace_id_ts + WHERE TraceId = trace_id + ) AS trace_end +SELECT + TraceId AS traceID, + SpanId AS spanID, + ParentSpanId AS parentSpanID, + ServiceName AS serviceName, + SpanName AS operationName, + Timestamp AS startTime, + Duration * 0.000001 AS duration, + arrayMap(key -> map('key', key, 'value', SpanAttributes[key]), mapKeys(SpanAttributes)) AS tags, + arrayMap(key -> map('key', key, 'value', ResourceAttributes[key]), mapKeys(ResourceAttributes)) AS serviceTags +FROM otel_traces +WHERE (traceID = trace_id) AND (startTime >= trace_start) AND (startTime <= trace_end) +LIMIT 1000 +``` + +ここでのCTEは、トレースID `ae9226c78d1d360601e6383928e4d22d` の最小および最大タイムスタンプを特定し、これを使用してメインの `otel_traces` テーブルの関連スパンをフィルタリングします。 + +この同じアプローチは、同様のアクセスパターンに適用できます。データモデリングで類似の例を探求しています。 + +## プロジェクションの使用 + +ClickHouse のプロジェクションにより、ユーザーはテーブルに対して複数の `ORDER BY` 句を指定できます。 + +前のセクションでは、マテリアライズドビューを使用して ClickHouse で集計を事前に計算し、行を変換し、異なるアクセスパターンに合わせた観測性のクエリを最適化する方法を探求しました。 + +マテリアライズドビューは、トレースIDによる検索を最適化するために、元のテーブルとは異なる順序キーを持つターゲットテーブルに行を送信する例を提供しました。 + +プロジェクションは、主キーの一部ではないカラムに対するクエリを最適化するために、同じ問題に対処するために使用できます。 + +理論的には、この能力はテーブルのために複数の順序キーを提供するために使用できますが、一つの明確な欠点があります:データの重複です。具体的には、データは各プロジェクションに対して指定された順序に加え、主な主キーの順序で書き込む必要があります。これにより、挿入が遅くなり、より多くのディスクスペースが消費されます。 + +> プロジェクションは、マテリアライズドビューと同様の多くの機能を提供しますが、後者が好まれることが多く、控えめに使用するべきです。ユーザーは欠点を理解し、いつ適切に使用するかを理解する必要があります。例えば、プロジェクションは集計を事前に計算するために使用できますが、ユーザーはこれにマテリアライズドビューを使用することをお勧めします。 + +NEEDS ALT + +
    + +以下のクエリを考慮します。このクエリは `otel_logs_v2` テーブルを 500 のエラーコードでフィルターします。これは、ユーザーがエラーコードでフィルタリングしたいと考えているため、ログに使用される一般的なアクセスパターンです: + +```sql +SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent +FROM otel_logs_v2 +WHERE Status = 500 +FORMAT `Null` + +Ok. + +0 rows in set. Elapsed: 0.177 sec. Processed 10.37 million rows, 685.32 MB (58.66 million rows/s., 3.88 GB/s.) +Peak memory usage: 56.54 MiB. +``` + +> この場合、`FORMAT Null` を使用して結果を印刷していません。これにより、すべての結果が読み取られますが返却されないため、LIMIT によるクエリの早期終了を防ぎます。これは、全ての1000万行をスキャンするのにかかった時間を示すためのものです。 + +上記のクエリは、選択した順序キー `(ServiceName, Timestamp)` に対して線形スキャンを必要とします。私たちは、上記のクエリのパフォーマンスを向上させるために、`Status` を順序キーの最後に追加することができますが、プロジェクションを追加することもできます。 + +```sql +ALTER TABLE otel_logs_v2 ( + ADD PROJECTION status + ( + SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent ORDER BY Status + ) +) + +ALTER TABLE otel_logs_v2 MATERIALIZE PROJECTION status +``` + +プロジェクションを最初に作成し、次にそれをマテリアライズする必要があります。この後のコマンドにより、データが異なる順序の2つの異なる形式でディスクに保存されます。データを作成するときにプロジェクションを定義することもできます。以下のように自動的に維持されます。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + PROJECTION status + ( + SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent + ORDER BY Status + ) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +重要なのは、`ALTER`を介してプロジェクションが作成された場合、その作成は非同期であり、`MATERIALIZE PROJECTION`コマンドが発行されます。この操作の進行状況は、次のクエリで確認でき、`is_done=1`を待つことができます。 + +```sql +SELECT parts_to_do, is_done, latest_fail_reason +FROM system.mutations +WHERE (`table` = 'otel_logs_v2') AND (command LIKE '%MATERIALIZE%') + +┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +│ 0 │ 1 │ │ +└─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +上記のクエリを繰り返すと、パフォーマンスが大幅に向上したことがわかりますが、追加のストレージがかかっています(ストレージサイズと圧縮の測定方法については「テーブルサイズと圧縮の測定」を参照してください)。 + +```sql +SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent +FROM otel_logs_v2 +WHERE Status = 500 +FORMAT `Null` + +0 rows in set. Elapsed: 0.031 sec. Processed 51.42 thousand rows, 22.85 MB (1.65 million rows/s., 734.63 MB/s.) +Peak memory usage: 27.85 MiB. +``` + +上記の例では、以前のクエリで使用されるカラムをプロジェクションに指定しています。これにより、これらの指定されたカラムのみが、ステータスによって順序付けられてディスクに保存されます。逆に、ここで `SELECT *` を使用した場合、すべてのカラムが保存されます。これにより、(カラムの任意のサブセットを使用した)より多くのクエリがプロジェクションの恩恵を受けることができますが、追加のストレージが必要になります。ディスクスペースと圧縮を測定する方法については、「テーブルサイズと圧縮の測定」を参照してください。 + +## セカンダリ/データスキップインデックス + +ClickHouse で主キーがどれほどチューニングされていても、いくつかのクエリは必然的に全テーブルスキャンを必要とします。これは、マテリアライズドビュー(および一部のクエリ用のプロジェクション)を使用することで軽減できますが、これには追加のメンテナンスが必要であり、ユーザーがその利用可能性を把握している必要があります。従来のリレーショナルデータベースは、セカンダリインデックスを使用してこれを解決しますが、ClickHouse のような列指向データベースでは効果がありません。代わりに、ClickHouse は「スキップ」インデックスを使用しており、これにより、データベースは一致する値がない大きなデータチャンクをスキップすることができ、クエリのパフォーマンスを大幅に向上させることができます。 + +デフォルトのOTelスキーマは、マップアクセスへのアクセスを加速するためにセカンダリインデックスを使用しています。一般的に効果がないと考えており、カスタムスキーマにコピーすることはお勧めしませんが、スキップインデックスは依然として有用です。 + +ユーザーは、適用する前に[セカンダリインデックスに関するガイド](https://en/optimize/skipping-indexes)を読み理解する必要があります。 + +**一般に、主キーとターゲットとなる非主キーのカラム/式の間に強い相関関係が存在する場合、かつユーザーがまれな値、つまり多くのグラニュールで発生しない値を探している場合に効果的です。** + +## テキスト検索のためのブルームフィルター + +観測性のクエリにおいて、セカンダリインデックスはユーザーがテキスト検索を行う必要があるときに役立ちます。具体的には、ngram およびトークンベースのブルームフィルターインデックス [`ngrambf_v1`](https://en/optimize/skipping-indexes#bloom-filter-types) および [`tokenbf_v1`](https://en/optimize/skipping-indexes#bloom-filter-types) を使用して、`LIKE` 、`IN`、および hasToken 演算子を使用して文字列カラムに対する検索を加速できます。特に、トークンベースのインデックスは、非英数字を区切りとして使用してトークンを生成します。これは、クエリ時にトークン(全体の単語)のみが一致することを意味します。より細かい一致には、[N-gramブルームフィルター](https://en/optimize/skipping-indexes#bloom-filter-types)を使用できます。これにより、指定されたサイズのn-gramに文字列を分割し、部分語の一致が可能になります。 + +生成されるトークンを評価するため、したがって一致するトークンを評価するために、`tokens` 関数を使用できます: + +```sql +SELECT tokens('https://www.zanbil.ir/m/filter/b113') + +┌─tokens────────────────────────────────────────────┐ +│ ['https','www','zanbil','ir','m','filter','b113'] │ +└───────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +`ngram` 関数も同様の機能を提供します。具体的には、n-gramサイズを第二のパラメータとして指定できます: + +```sql +SELECT ngrams('https://www.zanbil.ir/m/filter/b113', 3) + +┌─ngrams('https://www.zanbil.ir/m/filter/b113', 3)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ ['htt','ttp','tps','ps:','s:/','://','//w','/ww','www','ww.','w.z','.za','zan','anb','nbi','bil','il.','l.i','.ir','ir/','r/m','/m/','m/f','/fi','fil','ilt','lte','ter','er/','r/b','/b1','b11','113'] │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +> ClickHouse には、セカンダリインデックスとしての逆インデックスのエクスペリメンタルサポートもあります。これは現在、ログデータセットには推奨されていませんが、製品版に準備が整った場合にトークンベースのブルームフィルターに取って代わることを期待しています。 + +例の目的のためには、構造化ログデータセットを使用します。たとえば、`Referer` カラムに `ultra` を含むログをカウントしたいとします。 + +```sql +SELECT count() +FROM otel_logs_v2 +WHERE Referer LIKE '%ultra%' + +┌─count()─┐ +│ 114514 │ +└─────────┘ + +1 row in set. Elapsed: 0.177 sec. Processed 10.37 million rows, 908.49 MB (58.57 million rows/s., 5.13 GB/s.) +``` + +ここでは、n-gramサイズを3で一致させる必要があります。したがって、`ngrambf_v1` インデックスを作成します。 + +```sql +CREATE TABLE otel_logs_bloom +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + INDEX idx_span_attr_value Referer TYPE ngrambf_v1(3, 10000, 3, 7) GRANULARITY 1 +) +ENGINE = MergeTree +ORDER BY (Timestamp) +``` + +インデックス `ngrambf_v1(3, 10000, 3, 7)` は、ここで4つのパラメータを取ります。最後の7はシードを表します。その他は、n-gram サイズ (3)、値 `m` (フィルターサイズ)、およびハッシュ関数の数 `k` (7) を表します。 `k` と `m` は調整が必要であり、ユニークな n-gram / トークンの数と、フィルターが偽の負を返す確率に基づいています - すなわち、値がグラニュールに存在しないことを確認します。これらの値を特定するのに役立つ推奨[関数](https://en/engines/table-engines/mergetree-family/mergetree#bloom-filter)があります。 + +適切にチューニングされれば、ここでのスピードアップは顕著です: + +```sql +SELECT count() +FROM otel_logs_bloom +WHERE Referer LIKE '%ultra%' +┌─count()─┐ +│ 182 │ +└─────────┘ + +1 row in set. Elapsed: 0.077 sec. Processed 4.22 million rows, 375.29 MB (54.81 million rows/s., 4.87 GB/s.) +Peak memory usage: 129.60 KiB. +``` + +> 上記は例示的な目的のためです。ユーザーは、テキスト検索を最適化しようとするのではなく、挿入時にログから構造を抽出することをお勧めします。ただし、テキスト検索が役立つケースもあります。たとえば、スタックトレースや他の大きな文字列など、構造があまり決定的でない場合です。 + +ブルームフィルターを使用する際の一般的なガイドライン: + +ブルームの目的は[グラニュール](https://en/optimize/sparse-primary-indexes#clickhouse-index-design)をフィルタリングし、カラムのすべての値を読み込んで線形スキャンを回避することです。`EXPLAIN`句を使用し、`indexes=1`パラメータを指定することで、スキップされたグラニュールの数を特定できます。以下は、元のテーブル `otel_logs_v2` と、ngrambf を持つ `otel_logs_bloom` テーブルのレスポンスを示します。 + +```sql +EXPLAIN indexes = 1 +SELECT count() +FROM otel_logs_v2 +WHERE Referer LIKE '%ultra%' + +┌─explain────────────────────────────────────────────────────────────┐ +│ Expression ((Project names + Projection)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter ((WHERE + Change column names to column identifiers)) │ +│ ReadFromMergeTree (default.otel_logs_v2) │ +│ Indexes: │ +│ PrimaryKey │ +│ Condition: true │ +│ Parts: 9/9 │ +│ Granules: 1278/1278 │ +└────────────────────────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.016 sec. + + +EXPLAIN indexes = 1 +SELECT count() +FROM otel_logs_bloom +WHERE Referer LIKE '%ultra%' + +┌─explain────────────────────────────────────────────────────────────┐ +│ Expression ((Project names + Projection)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter ((WHERE + Change column names to column identifiers)) │ +│ ReadFromMergeTree (default.otel_logs_bloom) │ +│ Indexes: │ +│ PrimaryKey │ +│ Condition: true │ +│ Parts: 8/8 │ +│ Granules: 1276/1276 │ +│ Skip │ +│ Name: idx_span_attr_value │ +│ Description: ngrambf_v1 GRANULARITY 1 │ +│ Parts: 8/8 │ +│ Granules: 517/1276 │ +└────────────────────────────────────────────────────────────────────┘ +``` + +ブルームフィルターは、通常、列自体よりも小さい場合にのみ高速化されます。大きければ、パフォーマンスの利点はほとんどないでしょう。以下のクエリを使用して、フィルターと列のサイズを比較してください: + +```sql +SELECT + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE (`table` = 'otel_logs_bloom') AND (name = 'Referer') +GROUP BY name +ORDER BY sum(data_compressed_bytes) DESC + +┌─name────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ Referer │ 56.16 MiB │ 789.21 MiB │ 14.05 │ +└─────────┴─────────────────┴───────────────────┴───────┘ + +1 row in set. Elapsed: 0.018 sec. + + +SELECT + `table`, + formatReadableSize(data_compressed_bytes) AS compressed_size, + formatReadableSize(data_uncompressed_bytes) AS uncompressed_size +FROM system.data_skipping_indices +WHERE `table` = 'otel_logs_bloom' + +┌─table───────────┬─compressed_size─┬─uncompressed_size─┐ +│ otel_logs_bloom │ 12.03 MiB │ 12.17 MiB │ +└─────────────────┴─────────────────┴───────────────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +上記の例では、セカンダリブルームフィルターインデックスが12MBで、列自体の圧縮サイズである56MBの約5倍小さいことがわかります。 + +ブルームフィルターは、重要なチューニングが必要です。最適な設定を特定するのに役立つメモを[こちらに](https://en/engines/table-engines/mergetree-family/mergetree#bloom-filter)従うことをお勧めします。ブルームフィルターは、挿入およびマージ時にも高価になる可能性があります。製品前にブルームフィルターを追加する前に、挿入パフォーマンスへの影響を評価する必要があります。 + +セカンダリスキップインデックスに関する詳細は[こちら](https://en/optimize/skipping-indexes#skip-index-functions)にあります。 + +## マップからの抽出 + +Map 型は OTel スキーマにおいて広く使用されています。このタイプのキーと値は同じ型である必要があります - これは Kubernetes ラベルなどのメタデータには十分です。ここで注意すべきは、Map 型のサブキーをクエリする際に、親カラム全体が読み込まれることです。Map に多くのキーがある場合、これは、キーがカラムとして存在する場合に読み取るよりも多くのデータがディスクから読み取られるため、クエリに重要なペナルティを課すことがあります。 + +特定のキーを頻繁にクエリする場合は、それをルートに専用のカラムに移動することを検討してください。これは通常、一般的なアクセスパターンへの反応として、デプロイ後に発生するタスクであり、製品前に予測することは難しいかもしれません。「スキーマの進化」を参照して、デプロイ後にスキーマを変更する方法を確認してください。 + +## テーブルサイズと圧縮の測定 + +ClickHouse が観測性のために使用される主な理由の一つは、圧縮です。 + +ストレージコストを大幅に削減するだけでなく、ディスク上のデータが少ないということは、I/O が少なくなり、クエリや挿入が速くなります。I/O の削減は、CPUの観点からいかなる圧縮アルゴリズムのオーバーヘッドに対しても、上回るべきです。したがって、データの圧縮を改善することが、ClickHouse のクエリが速いことを確保する際の最初の焦点であるべきです。 + +圧縮を測定する方法の詳細は[こちら](https://en/data-compression/compression-in-clickhouse)にあります。 diff --git a/docs/ja/whats-new/_category_.yml b/docs/ja/whats-new/_category_.yml new file mode 100644 index 00000000000..a609b9ffc11 --- /dev/null +++ b/docs/ja/whats-new/_category_.yml @@ -0,0 +1,7 @@ +position: 100 +label: "What's New" +collapsible: true +collapsed: true +link: + type: generated-index + title: "What's New" diff --git a/docs/ja/whats-new/changelog/2017.md b/docs/ja/whats-new/changelog/2017.md new file mode 100644 index 00000000000..57a84002b14 --- /dev/null +++ b/docs/ja/whats-new/changelog/2017.md @@ -0,0 +1,268 @@ +--- +slug: /ja/whats-new/changelog/2017 +sidebar_position: 17 +sidebar_label: '2017' +title: 2017 Changelog +--- + +### ClickHouse Release 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21} + +This release contains bug fixes for the previous release 1.1.54318: + +- Fixed bug with possible race condition in replication that could lead to data loss. This issue affects versions 1.1.54310 and 1.1.54318. If you use one of these versions with Replicated tables, the update is strongly recommended. This issue shows in logs in Warning messages like `Part ... from own log does not exist.` The issue is relevant even if you do not see these messages in logs. + +### ClickHouse Release 1.1.54318, 2017-11-30 {#clickhouse-release-1-1-54318-2017-11-30} + +This release contains bug fixes for the previous release 1.1.54310: + +- Fixed incorrect row deletions during merges in the SummingMergeTree engine +- Fixed a memory leak in unreplicated MergeTree engines +- Fixed performance degradation with frequent inserts in MergeTree engines +- Fixed an issue that was causing the replication queue to stop running +- Fixed rotation and archiving of server logs + +### ClickHouse Release 1.1.54310, 2017-11-01 {#clickhouse-release-1-1-54310-2017-11-01} + +#### New Features: {#new-features} + +- Custom partitioning key for the MergeTree family of table engines. +- [Kafka](https://clickhouse.com/docs/ja/operations/table_engines/kafka/) table engine. +- Added support for loading [CatBoost](https://yandex.com/dev/catboost/) models and applying them to data stored in ClickHouse. +- Added support for time zones with non-integer offsets from UTC. +- Added support for arithmetic operations with time intervals. +- The range of values for the Date and DateTime types is extended to the year 2105. +- Added the `CREATE MATERIALIZED VIEW x TO y` query (specifies an existing table for storing the data of a materialized view). +- Added the `ATTACH TABLE` query without arguments. +- The processing logic for Nested columns with names ending in -Map in a SummingMergeTree table was extracted to the sumMap aggregate function. You can now specify such columns explicitly. +- Max size of the IP trie dictionary is increased to 128M entries. +- Added the getSizeOfEnumType function. +- Added the sumWithOverflow aggregate function. +- Added support for the Cap’n Proto input format. +- You can now customize compression level when using the zstd algorithm. + +#### Backward Incompatible Changes: {#backward-incompatible-changes} + +- Creation of temporary tables with an engine other than Memory is not allowed. +- Explicit creation of tables with the View or MaterializedView engine is not allowed. +- During table creation, a new check verifies that the sampling key expression is included in the primary key. + +#### Bug Fixes: {#bug-fixes} + +- Fixed hangups when synchronously inserting into a Distributed table. +- Fixed nonatomic adding and removing of parts in Replicated tables. +- Data inserted into a materialized view is not subjected to unnecessary deduplication. +- Executing a query to a Distributed table for which the local replica is lagging and remote replicas are unavailable does not result in an error anymore. +- Users do not need access permissions to the `default` database to create temporary tables anymore. +- Fixed crashing when specifying the Array type without arguments. +- Fixed hangups when the disk volume containing server logs is full. +- Fixed an overflow in the toRelativeWeekNum function for the first week of the Unix epoch. + +#### Build Improvements: {#build-improvements} + +- Several third-party libraries (notably Poco) were updated and converted to git submodules. + +### ClickHouse Release 1.1.54304, 2017-10-19 {#clickhouse-release-1-1-54304-2017-10-19} + +#### New Features: {#new-features-1} + +- TLS support in the native protocol (to enable, set `tcp_ssl_port` in `config.xml` ). + +#### Bug Fixes: {#bug-fixes-1} + +- `ALTER` for replicated tables now tries to start running as soon as possible. +- Fixed crashing when reading data with the setting `preferred_block_size_bytes=0.` +- Fixed crashes of `clickhouse-client` when pressing `Page Down` +- Correct interpretation of certain complex queries with `GLOBAL IN` and `UNION ALL` +- `FREEZE PARTITION` always works atomically now. +- Empty POST requests now return a response with code 411. +- Fixed interpretation errors for expressions like `CAST(1 AS Nullable(UInt8)).` +- Fixed an error when reading `Array(Nullable(String))` columns from `MergeTree` tables. +- Fixed crashing when parsing queries like `SELECT dummy AS dummy, dummy AS b` +- Users are updated correctly with invalid `users.xml` +- Correct handling when an executable dictionary returns a non-zero response code. + +### ClickHouse Release 1.1.54292, 2017-09-20 {#clickhouse-release-1-1-54292-2017-09-20} + +#### New Features: {#new-features-2} + +- Added the `pointInPolygon` function for working with coordinates on a coordinate plane. +- Added the `sumMap` aggregate function for calculating the sum of arrays, similar to `SummingMergeTree`. +- Added the `trunc` function. Improved performance of the rounding functions (`round`, `floor`, `ceil`, `roundToExp2`) and corrected the logic of how they work. Changed the logic of the `roundToExp2` function for fractions and negative numbers. +- The ClickHouse executable file is now less dependent on the libc version. The same ClickHouse executable file can run on a wide variety of Linux systems. There is still a dependency when using compiled queries (with the setting `compile = 1` , which is not used by default). +- Reduced the time needed for dynamic compilation of queries. + +#### Bug Fixes: {#bug-fixes-2} + +- Fixed an error that sometimes produced `part ... intersects previous part` messages and weakened replica consistency. +- Fixed an error that caused the server to lock up if ZooKeeper was unavailable during shutdown. +- Removed excessive logging when restoring replicas. +- Fixed an error in the UNION ALL implementation. +- Fixed an error in the concat function that occurred if the first column in a block has the Array type. +- Progress is now displayed correctly in the system.merges table. + +### ClickHouse Release 1.1.54289, 2017-09-13 {#clickhouse-release-1-1-54289-2017-09-13} + +#### New Features: {#new-features-3} + +- `SYSTEM` queries for server administration: `SYSTEM RELOAD DICTIONARY`, `SYSTEM RELOAD DICTIONARIES`, `SYSTEM DROP DNS CACHE`, `SYSTEM SHUTDOWN`, `SYSTEM KILL`. +- Added functions for working with arrays: `concat`, `arraySlice`, `arrayPushBack`, `arrayPushFront`, `arrayPopBack`, `arrayPopFront`. +- Added `root` and `identity` parameters for the ZooKeeper configuration. This allows you to isolate individual users on the same ZooKeeper cluster. +- Added aggregate functions `groupBitAnd`, `groupBitOr`, and `groupBitXor` (for compatibility, they are also available under the names `BIT_AND`, `BIT_OR`, and `BIT_XOR`). +- External dictionaries can be loaded from MySQL by specifying a socket in the filesystem. +- External dictionaries can be loaded from MySQL over SSL (`ssl_cert`, `ssl_key`, `ssl_ca` parameters). +- Added the `max_network_bandwidth_for_user` setting to restrict the overall bandwidth use for queries per user. +- Support for `DROP TABLE` for temporary tables. +- Support for reading `DateTime` values in Unix timestamp format from the `CSV` and `JSONEachRow` formats. +- Lagging replicas in distributed queries are now excluded by default (the default threshold is 5 minutes). +- FIFO locking is used during ALTER: an ALTER query isn’t blocked indefinitely for continuously running queries. +- Option to set `umask` in the config file. +- Improved performance for queries with `DISTINCT` . + +#### Bug Fixes: {#bug-fixes-3} + +- Improved the process for deleting old nodes in ZooKeeper. Previously, old nodes sometimes didn’t get deleted if there were very frequent inserts, which caused the server to be slow to shut down, among other things. +- Fixed randomization when choosing hosts for the connection to ZooKeeper. +- Fixed the exclusion of lagging replicas in distributed queries if the replica is localhost. +- Fixed an error where a data part in a `ReplicatedMergeTree` table could be broken after running `ALTER MODIFY` on an element in a `Nested` structure. +- Fixed an error that could cause SELECT queries to “hang”. +- Improvements to distributed DDL queries. +- Fixed the query `CREATE TABLE ... AS `. +- Resolved the deadlock in the `ALTER ... CLEAR COLUMN IN PARTITION` query for `Buffer` tables. +- Fixed the invalid default value for `Enum` s (0 instead of the minimum) when using the `JSONEachRow` and `TSKV` formats. +- Resolved the appearance of zombie processes when using a dictionary with an `executable` source. +- Fixed segfault for the HEAD query. + +#### Improved Workflow for Developing and Assembling ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse} + +- You can use `pbuilder` to build ClickHouse. +- You can use `libc++` instead of `libstdc++` for builds on Linux. +- Added instructions for using static code analysis tools: `Coverage`, `clang-tidy`, `cppcheck`. + +#### Please Note When Upgrading: {#please-note-when-upgrading} + +- There is now a higher default value for the MergeTree setting `max_bytes_to_merge_at_max_space_in_pool` (the maximum total size of data parts to merge, in bytes): it has increased from 100 GiB to 150 GiB. This might result in large merges running after the server upgrade, which could cause an increased load on the disk subsystem. If the free space available on the server is less than twice the total amount of the merges that are running, this will cause all other merges to stop running, including merges of small data parts. As a result, INSERT queries will fail with the message “Merges are processing significantly slower than inserts.” Use the `SELECT * FROM system.merges` query to monitor the situation. You can also check the `DiskSpaceReservedForMerge` metric in the `system.metrics` table, or in Graphite. You do not need to do anything to fix this, since the issue will resolve itself once the large merges finish. If you find this unacceptable, you can restore the previous value for the `max_bytes_to_merge_at_max_space_in_pool` setting. To do this, go to the `` section in config.xml, set ``` ``107374182400 ``` and restart the server. + +### ClickHouse Release 1.1.54284, 2017-08-29 {#clickhouse-release-1-1-54284-2017-08-29} + +- This is a bugfix release for the previous 1.1.54282 release. It fixes leaks in the parts directory in ZooKeeper. + +### ClickHouse Release 1.1.54282, 2017-08-23 {#clickhouse-release-1-1-54282-2017-08-23} + +This release contains bug fixes for the previous release 1.1.54276: + +- Fixed `DB::Exception: Assertion violation: !_path.empty()` when inserting into a Distributed table. +- Fixed parsing when inserting in RowBinary format if input data starts with’;’. +- Errors during runtime compilation of certain aggregate functions (e.g. `groupArray()`). + +### ClickHouse Release 1.1.54276, 2017-08-16 {#clickhouse-release-1-1-54276-2017-08-16} + +#### New Features: {#new-features-4} + +- Added an optional WITH section for a SELECT query. Example query: `WITH 1+1 AS a SELECT a, a*a` +- INSERT can be performed synchronously in a Distributed table: OK is returned only after all the data is saved on all the shards. This is activated by the setting insert_distributed_sync=1. +- Added the UUID data type for working with 16-byte identifiers. +- Added aliases of CHAR, FLOAT and other types for compatibility with the Tableau. +- Added the functions toYYYYMM, toYYYYMMDD, and toYYYYMMDDhhmmss for converting time into numbers. +- You can use IP addresses (together with the hostname) to identify servers for clustered DDL queries. +- Added support for non-constant arguments and negative offsets in the function `substring(str, pos, len).` +- Added the max_size parameter for the `groupArray(max_size)(column)` aggregate function, and optimized its performance. + +#### Main Changes: {#main-changes} + +- Security improvements: all server files are created with 0640 permissions (can be changed via `` config parameter). +- Improved error messages for queries with invalid syntax. +- Significantly reduced memory consumption and improved performance when merging large sections of MergeTree data. +- Significantly increased the performance of data merges for the ReplacingMergeTree engine. +- Improved performance for asynchronous inserts from a Distributed table by combining multiple source inserts. To enable this functionality, use the setting distributed_directory_monitor_batch_inserts=1. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-1} + +- Changed the binary format of aggregate states of `groupArray(array_column)` functions for arrays. + +#### Complete List of Changes: {#complete-list-of-changes} + +- Added the `output_format_json_quote_denormals` setting, which enables outputting nan and inf values in JSON format. +- Optimized stream allocation when reading from a Distributed table. +- Settings can be configured in readonly mode if the value does not change. +- Added the ability to retrieve non-integer granules of the MergeTree engine in order to meet restrictions on the block size specified in the preferred_block_size_bytes setting. The purpose is to reduce the consumption of RAM and increase cache locality when processing queries from tables with large columns. +- Efficient use of indexes that contain expressions like `toStartOfHour(x)` for conditions like `toStartOfHour(x) op сonstexpr.` +- Added new settings for MergeTree engines (the merge_tree section in config.xml): + - replicated_deduplication_window_seconds sets the number of seconds allowed for deduplicating inserts in Replicated tables. + - cleanup_delay_period sets how often to start cleanup to remove outdated data. + - replicated_can_become_leader can prevent a replica from becoming the leader (and assigning merges). +- Accelerated cleanup to remove outdated data from ZooKeeper. +- Multiple improvements and fixes for clustered DDL queries. Of particular interest is the new setting distributed_ddl_task_timeout, which limits the time to wait for a response from the servers in the cluster. If a ddl request has not been performed on all hosts, a response will contain a timeout error and a request will be executed in an async mode. +- Improved display of stack traces in the server logs. +- Added the “none” value for the compression method. +- You can use multiple dictionaries_config sections in config.xml. +- It is possible to connect to MySQL through a socket in the file system. +- The system.parts table has a new column with information about the size of marks, in bytes. + +#### Bug Fixes: {#bug-fixes-4} + +- Distributed tables using a Merge table now work correctly for a SELECT query with a condition on the `_table` field. +- Fixed a rare race condition in ReplicatedMergeTree when checking data parts. +- Fixed possible freezing on “leader election” when starting a server. +- The max_replica_delay_for_distributed_queries setting was ignored when using a local replica of the data source. This has been fixed. +- Fixed incorrect behavior of `ALTER TABLE CLEAR COLUMN IN PARTITION` when attempting to clean a non-existing column. +- Fixed an exception in the multiIf function when using empty arrays or strings. +- Fixed excessive memory allocations when deserializing Native format. +- Fixed incorrect auto-update of Trie dictionaries. +- Fixed an exception when running queries with a GROUP BY clause from a Merge table when using SAMPLE. +- Fixed a crash of GROUP BY when using distributed_aggregation_memory_efficient=1. +- Now you can specify the database.table in the right side of IN and JOIN. +- Too many threads were used for parallel aggregation. This has been fixed. +- Fixed how the “if” function works with FixedString arguments. +- SELECT worked incorrectly from a Distributed table for shards with a weight of 0. This has been fixed. +- Running `CREATE VIEW IF EXISTS no longer causes crashes.` +- Fixed incorrect behavior when input_format_skip_unknown_fields=1 is set and there are negative numbers. +- Fixed an infinite loop in the `dictGetHierarchy()` function if there is some invalid data in the dictionary. +- Fixed `Syntax error: unexpected (...)` errors when running distributed queries with subqueries in an IN or JOIN clause and Merge tables. +- Fixed an incorrect interpretation of a SELECT query from Dictionary tables. +- Fixed the “Cannot mremap” error when using arrays in IN and JOIN clauses with more than 2 billion elements. +- Fixed the failover for dictionaries with MySQL as the source. + +#### Improved Workflow for Developing and Assembling ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse-1} + +- Builds can be assembled in Arcadia. +- You can use gcc 7 to compile ClickHouse. +- Parallel builds using ccache+distcc are faster now. + +### ClickHouse Release 1.1.54245, 2017-07-04 {#clickhouse-release-1-1-54245-2017-07-04} + +#### New Features: {#new-features-5} + +- Distributed DDL (for example, `CREATE TABLE ON CLUSTER`) +- The replicated query `ALTER TABLE CLEAR COLUMN IN PARTITION.` +- The engine for Dictionary tables (access to dictionary data in the form of a table). +- Dictionary database engine (this type of database automatically has Dictionary tables available for all the connected external dictionaries). +- You can check for updates to the dictionary by sending a request to the source. +- Qualified column names +- Quoting identifiers using double quotation marks. +- Sessions in the HTTP interface. +- The OPTIMIZE query for a Replicated table can can run not only on the leader. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-2} + +- Removed SET GLOBAL. + +#### Minor Changes: {#minor-changes} + +- Now after an alert is triggered, the log prints the full stack trace. +- Relaxed the verification of the number of damaged/extra data parts at startup (there were too many false positives). + +#### Bug Fixes: {#bug-fixes-5} + +- Fixed a bad connection “sticking” when inserting into a Distributed table. +- GLOBAL IN now works for a query from a Merge table that looks at a Distributed table. +- The incorrect number of cores was detected on a Google Compute Engine virtual machine. This has been fixed. +- Changes in how an executable source of cached external dictionaries works. +- Fixed the comparison of strings containing null characters. +- Fixed the comparison of Float32 primary key fields with constants. +- Previously, an incorrect estimate of the size of a field could lead to overly large allocations. +- Fixed a crash when querying a Nullable column added to a table using ALTER. +- Fixed a crash when sorting by a Nullable column, if the number of rows is less than LIMIT. +- Fixed an ORDER BY subquery consisting of only constant values. +- Previously, a Replicated table could remain in the invalid state after a failed DROP TABLE. +- Aliases for scalar subqueries with empty results are no longer lost. +- Now a query that used compilation does not fail with an error if the .so file gets damaged. diff --git a/docs/ja/whats-new/changelog/2018.md b/docs/ja/whats-new/changelog/2018.md new file mode 100644 index 00000000000..0761e4a1e4f --- /dev/null +++ b/docs/ja/whats-new/changelog/2018.md @@ -0,0 +1,1063 @@ +--- +slug: /ja/whats-new/changelog/2018 +sidebar_position: 16 +sidebar_label: '2018' +title: 2018 Changelog +--- + +## ClickHouse Release 18.16 {#clickhouse-release-18-16} + +### ClickHouse Release 18.16.1, 2018-12-21 {#clickhouse-release-18-16-1-2018-12-21} + +#### Bug Fixes: {#bug-fixes} + +- Fixed an error that led to problems with updating dictionaries with the ODBC source. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- JIT compilation of aggregate functions now works with LowCardinality columns. [#3838](https://github.com/ClickHouse/ClickHouse/issues/3838) + +#### Improvements: {#improvements} + +- Added the `low_cardinality_allow_in_native_format` setting (enabled by default). When disabled, LowCardinality columns will be converted to ordinary columns for SELECT queries and ordinary columns will be expected for INSERT queries. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) + +#### Build Improvements: {#build-improvements} + +- Fixes for builds on macOS and ARM. + +### ClickHouse Release 18.16.0, 2018-12-14 {#clickhouse-release-18-16-0-2018-12-14} + +#### New Features: {#new-features} + +- `DEFAULT` expressions are evaluated for missing fields when loading data in semi-structured input formats (`JSONEachRow`, `TSKV`). The feature is enabled with the `insert_sample_with_metadata` setting. [#3555](https://github.com/ClickHouse/ClickHouse/pull/3555) +- The `ALTER TABLE` query now has the `MODIFY ORDER BY` action for changing the sorting key when adding or removing a table column. This is useful for tables in the `MergeTree` family that perform additional tasks when merging based on this sorting key, such as `SummingMergeTree`, `AggregatingMergeTree`, and so on. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) [#3755](https://github.com/ClickHouse/ClickHouse/pull/3755) +- For tables in the `MergeTree` family, now you can specify a different sorting key (`ORDER BY`) and index (`PRIMARY KEY`). The sorting key can be longer than the index. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) +- Added the `hdfs` table function and the `HDFS` table engine for importing and exporting data to HDFS. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/3617) +- Added functions for working with base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3350) +- Now you can use a parameter to configure the precision of the `uniqCombined` aggregate function (select the number of HyperLogLog cells). [#3406](https://github.com/ClickHouse/ClickHouse/pull/3406) +- Added the `system.contributors` table that contains the names of everyone who made commits in ClickHouse. [#3452](https://github.com/ClickHouse/ClickHouse/pull/3452) +- Added the ability to omit the partition for the `ALTER TABLE ... FREEZE` query in order to back up all partitions at once. [#3514](https://github.com/ClickHouse/ClickHouse/pull/3514) +- Added `dictGet` and `dictGetOrDefault` functions that do not require specifying the type of return value. The type is determined automatically from the dictionary description. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3564) +- Now you can specify comments for a column in the table description and change it using `ALTER`. [#3377](https://github.com/ClickHouse/ClickHouse/pull/3377) +- Reading is supported for `Join` type tables with simple keys. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Now you can specify the options `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, and `join_overflow_mode` when creating a `Join` type table. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Added the `joinGet` function that allows you to use a `Join` type table like a dictionary. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Added the `partition_key`, `sorting_key`, `primary_key`, and `sampling_key` columns to the `system.tables` table in order to provide information about table keys. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Added the `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, and `is_in_sampling_key` columns to the `system.columns` table. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Added the `min_time` and `max_time` columns to the `system.parts` table. These columns are populated when the partitioning key is an expression consisting of `DateTime` columns. [Emmanuel Donin de Rosière](https://github.com/ClickHouse/ClickHouse/pull/3800) + +#### Bug Fixes: {#bug-fixes-1} + +- Fixes and performance improvements for the `LowCardinality` data type. `GROUP BY` using `LowCardinality(Nullable(...))`. Getting the values of `extremes`. Processing high-order functions. `LEFT ARRAY JOIN`. Distributed `GROUP BY`. Functions that return `Array`. Execution of `ORDER BY`. Writing to `Distributed` tables (nicelulu). Backward compatibility for `INSERT` queries from old clients that implement the `Native` protocol. Support for `LowCardinality` for `JOIN`. Improved performance when working in a single stream. [#3823](https://github.com/ClickHouse/ClickHouse/pull/3823) [#3803](https://github.com/ClickHouse/ClickHouse/pull/3803) [#3799](https://github.com/ClickHouse/ClickHouse/pull/3799) [#3769](https://github.com/ClickHouse/ClickHouse/pull/3769) [#3744](https://github.com/ClickHouse/ClickHouse/pull/3744) [#3681](https://github.com/ClickHouse/ClickHouse/pull/3681) [#3651](https://github.com/ClickHouse/ClickHouse/pull/3651) [#3649](https://github.com/ClickHouse/ClickHouse/pull/3649) [#3641](https://github.com/ClickHouse/ClickHouse/pull/3641) [#3632](https://github.com/ClickHouse/ClickHouse/pull/3632) [#3568](https://github.com/ClickHouse/ClickHouse/pull/3568) [#3523](https://github.com/ClickHouse/ClickHouse/pull/3523) [#3518](https://github.com/ClickHouse/ClickHouse/pull/3518) +- Fixed how the `select_sequential_consistency` option works. Previously, when this setting was enabled, an incomplete result was sometimes returned after beginning to write to a new partition. [#2863](https://github.com/ClickHouse/ClickHouse/pull/2863) +- Databases are correctly specified when executing DDL `ON CLUSTER` queries and `ALTER UPDATE/DELETE`. [#3772](https://github.com/ClickHouse/ClickHouse/pull/3772) [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Databases are correctly specified for subqueries inside a VIEW. [#3521](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Fixed a bug in `PREWHERE` with `FINAL` for `VersionedCollapsingMergeTree`. [7167bfd7](https://github.com/ClickHouse/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) +- Now you can use `KILL QUERY` to cancel queries that have not started yet because they are waiting for the table to be locked. [#3517](https://github.com/ClickHouse/ClickHouse/pull/3517) +- Corrected date and time calculations if the clocks were moved back at midnight (this happens in Iran, and happened in Moscow from 1981 to 1983). Previously, this led to the time being reset a day earlier than necessary, and also caused incorrect formatting of the date and time in text format. [#3819](https://github.com/ClickHouse/ClickHouse/pull/3819) +- Fixed bugs in some cases of `VIEW` and subqueries that omit the database. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Fixed a race condition when simultaneously reading from a `MATERIALIZED VIEW` and deleting a `MATERIALIZED VIEW` due to not locking the internal `MATERIALIZED VIEW`. [#3404](https://github.com/ClickHouse/ClickHouse/pull/3404) [#3694](https://github.com/ClickHouse/ClickHouse/pull/3694) +- Fixed the error `Lock handler cannot be nullptr.` [#3689](https://github.com/ClickHouse/ClickHouse/pull/3689) +- Fixed query processing when the `compile_expressions` option is enabled (it’s enabled by default). Nondeterministic constant expressions like the `now` function are no longer unfolded. [#3457](https://github.com/ClickHouse/ClickHouse/pull/3457) +- Fixed a crash when specifying a non-constant scale argument in `toDecimal32/64/128` functions. +- Fixed an error when trying to insert an array with `NULL` elements in the `Values` format into a column of type `Array` without `Nullable` (if `input_format_values_interpret_expressions` = 1). [#3487](https://github.com/ClickHouse/ClickHouse/pull/3487) [#3503](https://github.com/ClickHouse/ClickHouse/pull/3503) +- Fixed continuous error logging in `DDLWorker` if ZooKeeper is not available. [8f50c620](https://github.com/ClickHouse/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) +- Fixed the return type for `quantile*` functions from `Date` and `DateTime` types of arguments. [#3580](https://github.com/ClickHouse/ClickHouse/pull/3580) +- Fixed the `WITH` clause if it specifies a simple alias without expressions. [#3570](https://github.com/ClickHouse/ClickHouse/pull/3570) +- Fixed processing of queries with named sub-queries and qualified column names when `enable_optimize_predicate_expression` is enabled. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3588) +- Fixed the error `Attempt to attach to nullptr thread group` when working with materialized views. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3623) +- Fixed a crash when passing certain incorrect arguments to the `arrayReverse` function. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Fixed the buffer overflow in the `extractURLParameter` function. Improved performance. Added correct processing of strings containing zero bytes. [141e9799](https://github.com/ClickHouse/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) +- Fixed buffer overflow in the `lowerUTF8` and `upperUTF8` functions. Removed the ability to execute these functions over `FixedString` type arguments. [#3662](https://github.com/ClickHouse/ClickHouse/pull/3662) +- Fixed a rare race condition when deleting `MergeTree` tables. [#3680](https://github.com/ClickHouse/ClickHouse/pull/3680) +- Fixed a race condition when reading from `Buffer` tables and simultaneously performing `ALTER` or `DROP` on the target tables. [#3719](https://github.com/ClickHouse/ClickHouse/pull/3719) +- Fixed a segfault if the `max_temporary_non_const_columns` limit was exceeded. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Improvements: {#improvements-1} + +- The server does not write the processed configuration files to the `/etc/clickhouse-server/` directory. Instead, it saves them in the `preprocessed_configs` directory inside `path`. This means that the `/etc/clickhouse-server/` directory does not have write access for the `clickhouse` user, which improves security. [#2443](https://github.com/ClickHouse/ClickHouse/pull/2443) +- The `min_merge_bytes_to_use_direct_io` option is set to 10 GiB by default. A merge that forms large parts of tables from the MergeTree family will be performed in `O_DIRECT` mode, which prevents excessive page cache eviction. [#3504](https://github.com/ClickHouse/ClickHouse/pull/3504) +- Accelerated server start when there is a very large number of tables. [#3398](https://github.com/ClickHouse/ClickHouse/pull/3398) +- Added a connection pool and HTTP `Keep-Alive` for connections between replicas. [#3594](https://github.com/ClickHouse/ClickHouse/pull/3594) +- If the query syntax is invalid, the `400 Bad Request` code is returned in the `HTTP` interface (500 was returned previously). [31bc680a](https://github.com/ClickHouse/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) +- The `join_default_strictness` option is set to `ALL` by default for compatibility. [120e2cbe](https://github.com/ClickHouse/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) +- Removed logging to `stderr` from the `re2` library for invalid or complex regular expressions. [#3723](https://github.com/ClickHouse/ClickHouse/pull/3723) +- Added for the `Kafka` table engine: checks for subscriptions before beginning to read from Kafka; the kafka_max_block_size setting for the table. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3396) +- The `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, and `murmurHash3_64` functions now work for any number of arguments and for arguments in the form of tuples. [#3451](https://github.com/ClickHouse/ClickHouse/pull/3451) [#3519](https://github.com/ClickHouse/ClickHouse/pull/3519) +- The `arrayReverse` function now works with any types of arrays. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Added an optional parameter: the slot size for the `timeSlots` function. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3724) +- For `FULL` and `RIGHT JOIN`, the `max_block_size` setting is used for a stream of non-joined data from the right table. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3699) +- Added the `--secure` command line parameter in `clickhouse-benchmark` and `clickhouse-performance-test` to enable TLS. [#3688](https://github.com/ClickHouse/ClickHouse/pull/3688) [#3690](https://github.com/ClickHouse/ClickHouse/pull/3690) +- Type conversion when the structure of a `Buffer` type table does not match the structure of the destination table. [Vitaly Baranov](https://github.com/ClickHouse/ClickHouse/pull/3603) +- Added the `tcp_keep_alive_timeout` option to enable keep-alive packets after inactivity for the specified time interval. [#3441](https://github.com/ClickHouse/ClickHouse/pull/3441) +- Removed unnecessary quoting of values for the partition key in the `system.parts` table if it consists of a single column. [#3652](https://github.com/ClickHouse/ClickHouse/pull/3652) +- The modulo function works for `Date` and `DateTime` data types. [#3385](https://github.com/ClickHouse/ClickHouse/pull/3385) +- Added synonyms for the `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, and `MID` functions. [#3774](https://github.com/ClickHouse/ClickHouse/pull/3774) [#3763](https://github.com/ClickHouse/ClickHouse/pull/3763) Some function names are case-insensitive for compatibility with the SQL standard. Added syntactic sugar `SUBSTRING(expr FROM start FOR length)` for compatibility with SQL. [#3804](https://github.com/ClickHouse/ClickHouse/pull/3804) +- Added the ability to `mlock` memory pages corresponding to `clickhouse-server` executable code to prevent it from being forced out of memory. This feature is disabled by default. [#3553](https://github.com/ClickHouse/ClickHouse/pull/3553) +- Improved performance when reading from `O_DIRECT` (with the `min_bytes_to_use_direct_io` option enabled). [#3405](https://github.com/ClickHouse/ClickHouse/pull/3405) +- Improved performance of the `dictGet...OrDefault` function for a constant key argument and a non-constant default argument. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3563) +- The `firstSignificantSubdomain` function now processes the domains `gov`, `mil`, and `edu`. [Igor Hatarist](https://github.com/ClickHouse/ClickHouse/pull/3601) Improved performance. [#3628](https://github.com/ClickHouse/ClickHouse/pull/3628) +- Ability to specify custom environment variables for starting `clickhouse-server` using the `SYS-V init.d` script by defining `CLICKHOUSE_PROGRAM_ENV` in `/etc/default/clickhouse`. + [Pavlo Bashynskyi](https://github.com/ClickHouse/ClickHouse/pull/3612) +- Correct return code for the clickhouse-server init script. [#3516](https://github.com/ClickHouse/ClickHouse/pull/3516) +- The `system.metrics` table now has the `VersionInteger` metric, and `system.build_options` has the added line `VERSION_INTEGER`, which contains the numeric form of the ClickHouse version, such as `18016000`. [#3644](https://github.com/ClickHouse/ClickHouse/pull/3644) +- Removed the ability to compare the `Date` type with a number to avoid potential errors like `date = 2018-12-17`, where quotes around the date are omitted by mistake. [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) +- Fixed the behavior of stateful functions like `rowNumberInAllBlocks`. They previously output a result that was one number larger due to starting during query analysis. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3729) +- If the `force_restore_data` file can’t be deleted, an error message is displayed. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3794) + +#### Build Improvements: {#build-improvements-1} + +- Updated the `jemalloc` library, which fixes a potential memory leak. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3557) +- Profiling with `jemalloc` is enabled by default in order to debug builds. [2cc82f5c](https://github.com/ClickHouse/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) +- Added the ability to run integration tests when only `Docker` is installed on the system. [#3650](https://github.com/ClickHouse/ClickHouse/pull/3650) +- Added the fuzz expression test in SELECT queries. [#3442](https://github.com/ClickHouse/ClickHouse/pull/3442) +- Added a stress test for commits, which performs functional tests in parallel and in random order to detect more race conditions. [#3438](https://github.com/ClickHouse/ClickHouse/pull/3438) +- Improved the method for starting clickhouse-server in a Docker image. [Elghazal Ahmed](https://github.com/ClickHouse/ClickHouse/pull/3663) +- For a Docker image, added support for initializing databases using files in the `/docker-entrypoint-initdb.d` directory. [Konstantin Lebedev](https://github.com/ClickHouse/ClickHouse/pull/3695) +- Fixes for builds on ARM. [#3709](https://github.com/ClickHouse/ClickHouse/pull/3709) + +#### Backward Incompatible Changes: {#backward-incompatible-changes} + +- Removed the ability to compare the `Date` type with a number. Instead of `toDate('2018-12-18') = 17883`, you must use explicit type conversion `= toDate(17883)` [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) + +## ClickHouse Release 18.14 {#clickhouse-release-18-14} + +### ClickHouse Release 18.14.19, 2018-12-19 {#clickhouse-release-18-14-19-2018-12-19} + +#### Bug Fixes: {#bug-fixes-2} + +- Fixed an error that led to problems with updating dictionaries with the ODBC source. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- Databases are correctly specified when executing DDL `ON CLUSTER` queries. [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Fixed a segfault if the `max_temporary_non_const_columns` limit was exceeded. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Build Improvements: {#build-improvements-2} + +- Fixes for builds on ARM. + +### ClickHouse Release 18.14.18, 2018-12-04 {#clickhouse-release-18-14-18-2018-12-04} + +#### Bug Fixes: {#bug-fixes-3} + +- Fixed error in `dictGet...` function for dictionaries of type `range`, if one of the arguments is constant and other is not. [#3751](https://github.com/ClickHouse/ClickHouse/pull/3751) +- Fixed error that caused messages `netlink: '...': attribute type 1 has an invalid length` to be printed in Linux kernel log, that was happening only on fresh enough versions of Linux kernel. [#3749](https://github.com/ClickHouse/ClickHouse/pull/3749) +- Fixed segfault in function `empty` for argument of `FixedString` type. [Daniel, Dao Quang Minh](https://github.com/ClickHouse/ClickHouse/pull/3703) +- Fixed excessive memory allocation when using large value of `max_query_size` setting (a memory chunk of `max_query_size` bytes was preallocated at once). [#3720](https://github.com/ClickHouse/ClickHouse/pull/3720) + +#### Build Changes: {#build-changes} + +- Fixed build with LLVM/Clang libraries of version 7 from the OS packages (these libraries are used for runtime query compilation). [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### ClickHouse Release 18.14.17, 2018-11-30 {#clickhouse-release-18-14-17-2018-11-30} + +#### Bug Fixes: {#bug-fixes-4} + +- Fixed cases when the ODBC bridge process did not terminate with the main server process. [#3642](https://github.com/ClickHouse/ClickHouse/pull/3642) +- Fixed synchronous insertion into the `Distributed` table with a columns list that differs from the column list of the remote table. [#3673](https://github.com/ClickHouse/ClickHouse/pull/3673) +- Fixed a rare race condition that can lead to a crash when dropping a MergeTree table. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Fixed a query deadlock in case when query thread creation fails with the `Resource temporarily unavailable` error. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Fixed parsing of the `ENGINE` clause when the `CREATE AS table` syntax was used and the `ENGINE` clause was specified before the `AS table` (the error resulted in ignoring the specified engine). [#3692](https://github.com/ClickHouse/ClickHouse/pull/3692) + +### ClickHouse Release 18.14.15, 2018-11-21 {#clickhouse-release-18-14-15-2018-11-21} + +#### Bug Fixes: {#bug-fixes-5} + +- The size of memory chunk was overestimated while deserializing the column of type `Array(String)` that leads to “Memory limit exceeded” errors. The issue appeared in version 18.12.13. [#3589](https://github.com/ClickHouse/ClickHouse/issues/3589) + +### ClickHouse Release 18.14.14, 2018-11-20 {#clickhouse-release-18-14-14-2018-11-20} + +#### Bug Fixes: {#bug-fixes-6} + +- Fixed `ON CLUSTER` queries when cluster configured as secure (flag ``). [#3599](https://github.com/ClickHouse/ClickHouse/pull/3599) + +#### Build Changes: {#build-changes-1} + +- Fixed problems (llvm-7 from system, macos) [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### ClickHouse Release 18.14.13, 2018-11-08 {#clickhouse-release-18-14-13-2018-11-08} + +#### Bug Fixes: {#bug-fixes-7} + +- Fixed the `Block structure mismatch in MergingSorted stream` error. [#3162](https://github.com/ClickHouse/ClickHouse/issues/3162) +- Fixed `ON CLUSTER` queries in case when secure connections were turned on in the cluster config (the `` flag). [#3465](https://github.com/ClickHouse/ClickHouse/pull/3465) +- Fixed an error in queries that used `SAMPLE`, `PREWHERE` and alias columns. [#3543](https://github.com/ClickHouse/ClickHouse/pull/3543) +- Fixed a rare `unknown compression method` error when the `min_bytes_to_use_direct_io` setting was enabled. [3544](https://github.com/ClickHouse/ClickHouse/pull/3544) + +#### Performance Improvements: {#performance-improvements} + +- Fixed performance regression of queries with `GROUP BY` of columns of UInt16 or Date type when executing on AMD EPYC processors. [Igor Lapko](https://github.com/ClickHouse/ClickHouse/pull/3512) +- Fixed performance regression of queries that process long strings. [#3530](https://github.com/ClickHouse/ClickHouse/pull/3530) + +#### Build Improvements: {#build-improvements-3} + +- Improvements for simplifying the Arcadia build. [#3475](https://github.com/ClickHouse/ClickHouse/pull/3475), [#3535](https://github.com/ClickHouse/ClickHouse/pull/3535) + +### ClickHouse Release 18.14.12, 2018-11-02 {#clickhouse-release-18-14-12-2018-11-02} + +#### Bug Fixes: {#bug-fixes-8} + +- Fixed a crash on joining two unnamed subqueries. [#3505](https://github.com/ClickHouse/ClickHouse/pull/3505) +- Fixed generating incorrect queries (with an empty `WHERE` clause) when querying external databases. [hotid](https://github.com/ClickHouse/ClickHouse/pull/3477) +- Fixed using an incorrect timeout value in ODBC dictionaries. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3511) + +### ClickHouse Release 18.14.11, 2018-10-29 {#clickhouse-release-18-14-11-2018-10-29} + +#### Bug Fixes: {#bug-fixes-9} + +- Fixed the error `Block structure mismatch in UNION stream: different number of columns` in LIMIT queries. [#2156](https://github.com/ClickHouse/ClickHouse/issues/2156) +- Fixed errors when merging data in tables containing arrays inside Nested structures. [#3397](https://github.com/ClickHouse/ClickHouse/pull/3397) +- Fixed incorrect query results if the `merge_tree_uniform_read_distribution` setting is disabled (it is enabled by default). [#3429](https://github.com/ClickHouse/ClickHouse/pull/3429) +- Fixed an error on inserts to a Distributed table in Native format. [#3411](https://github.com/ClickHouse/ClickHouse/issues/3411) + +### ClickHouse Release 18.14.10, 2018-10-23 {#clickhouse-release-18-14-10-2018-10-23} + +- The `compile_expressions` setting (JIT compilation of expressions) is disabled by default. [#3410](https://github.com/ClickHouse/ClickHouse/pull/3410) +- The `enable_optimize_predicate_expression` setting is disabled by default. + +### ClickHouse Release 18.14.9, 2018-10-16 {#clickhouse-release-18-14-9-2018-10-16} + +#### New Features: {#new-features-1} + +- The `WITH CUBE` modifier for `GROUP BY` (the alternative syntax `GROUP BY CUBE(...)` is also available). [#3172](https://github.com/ClickHouse/ClickHouse/pull/3172) +- Added the `formatDateTime` function. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2770) +- Added the `JDBC` table engine and `jdbc` table function (requires installing clickhouse-jdbc-bridge). [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- Added functions for working with the ISO week number: `toISOWeek`, `toISOYear`, `toStartOfISOYear`, and `toDayOfYear`. [#3146](https://github.com/ClickHouse/ClickHouse/pull/3146) +- Now you can use `Nullable` columns for `MySQL` and `ODBC` tables. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Nested data structures can be read as nested objects in `JSONEachRow` format. Added the `input_format_import_nested_json` setting. [Veloman Yunkan](https://github.com/ClickHouse/ClickHouse/pull/3144) +- Parallel processing is available for many `MATERIALIZED VIEW`s when inserting data. See the `parallel_view_processing` setting. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3208) +- Added the `SYSTEM FLUSH LOGS` query (forced log flushes to system tables such as `query_log`) [#3321](https://github.com/ClickHouse/ClickHouse/pull/3321) +- Now you can use pre-defined `database` and `table` macros when declaring `Replicated` tables. [#3251](https://github.com/ClickHouse/ClickHouse/pull/3251) +- Added the ability to read `Decimal` type values in engineering notation (indicating powers of ten). [#3153](https://github.com/ClickHouse/ClickHouse/pull/3153) + +#### Experimental Features: {#experimental-features} + +- Optimization of the GROUP BY clause for `LowCardinality data types.` [#3138](https://github.com/ClickHouse/ClickHouse/pull/3138) +- Optimized calculation of expressions for `LowCardinality data types.` [#3200](https://github.com/ClickHouse/ClickHouse/pull/3200) + +#### Improvements: {#improvements-2} + +- Significantly reduced memory consumption for queries with `ORDER BY` and `LIMIT`. See the `max_bytes_before_remerge_sort` setting. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- In the absence of `JOIN` (`LEFT`, `INNER`, …), `INNER JOIN` is assumed. [#3147](https://github.com/ClickHouse/ClickHouse/pull/3147) +- Qualified asterisks work correctly in queries with `JOIN`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3202) +- The `ODBC` table engine correctly chooses the method for quoting identifiers in the SQL dialect of a remote database. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- The `compile_expressions` setting (JIT compilation of expressions) is enabled by default. +- Fixed behavior for simultaneous DROP DATABASE/TABLE IF EXISTS and CREATE DATABASE/TABLE IF NOT EXISTS. Previously, a `CREATE DATABASE ... IF NOT EXISTS` query could return the error message “File … already exists”, and the `CREATE TABLE ... IF NOT EXISTS` and `DROP TABLE IF EXISTS` queries could return `Table ... is creating or attaching right now`. [#3101](https://github.com/ClickHouse/ClickHouse/pull/3101) +- LIKE and IN expressions with a constant right half are passed to the remote server when querying from MySQL or ODBC tables. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Comparisons with constant expressions in a WHERE clause are passed to the remote server when querying from MySQL and ODBC tables. Previously, only comparisons with constants were passed. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Correct calculation of row width in the terminal for `Pretty` formats, including strings with hieroglyphs. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3257). +- `ON CLUSTER` can be specified for `ALTER UPDATE` queries. +- Improved performance for reading data in `JSONEachRow` format. [#3332](https://github.com/ClickHouse/ClickHouse/pull/3332) +- Added synonyms for the `LENGTH` and `CHARACTER_LENGTH` functions for compatibility. The `CONCAT` function is no longer case-sensitive. [#3306](https://github.com/ClickHouse/ClickHouse/pull/3306) +- Added the `TIMESTAMP` synonym for the `DateTime` type. [#3390](https://github.com/ClickHouse/ClickHouse/pull/3390) +- There is always space reserved for query_id in the server logs, even if the log line is not related to a query. This makes it easier to parse server text logs with third-party tools. +- Memory consumption by a query is logged when it exceeds the next level of an integer number of gigabytes. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- Added compatibility mode for the case when the client library that uses the Native protocol sends fewer columns by mistake than the server expects for the INSERT query. This scenario was possible when using the clickhouse-cpp library. Previously, this scenario caused the server to crash. [#3171](https://github.com/ClickHouse/ClickHouse/pull/3171) +- In a user-defined WHERE expression in `clickhouse-copier`, you can now use a `partition_key` alias (for additional filtering by source table partition). This is useful if the partitioning scheme changes during copying, but only changes slightly. [#3166](https://github.com/ClickHouse/ClickHouse/pull/3166) +- The workflow of the `Kafka` engine has been moved to a background thread pool in order to automatically reduce the speed of data reading at high loads. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Support for reading `Tuple` and `Nested` values of structures like `struct` in the `Cap'n'Proto format`. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3216) +- The list of top-level domains for the `firstSignificantSubdomain` function now includes the domain `biz`. [decaseal](https://github.com/ClickHouse/ClickHouse/pull/3219) +- In the configuration of external dictionaries, `null_value` is interpreted as the value of the default data type. [#3330](https://github.com/ClickHouse/ClickHouse/pull/3330) +- Support for the `intDiv` and `intDivOrZero` functions for `Decimal`. [b48402e8](https://github.com/ClickHouse/ClickHouse/commit/b48402e8712e2b9b151e0eef8193811d433a1264) +- Support for the `Date`, `DateTime`, `UUID`, and `Decimal` types as a key for the `sumMap` aggregate function. [#3281](https://github.com/ClickHouse/ClickHouse/pull/3281) +- Support for the `Decimal` data type in external dictionaries. [#3324](https://github.com/ClickHouse/ClickHouse/pull/3324) +- Support for the `Decimal` data type in `SummingMergeTree` tables. [#3348](https://github.com/ClickHouse/ClickHouse/pull/3348) +- Added specializations for `UUID` in `if`. [#3366](https://github.com/ClickHouse/ClickHouse/pull/3366) +- Reduced the number of `open` and `close` system calls when reading from a `MergeTree table`. [#3283](https://github.com/ClickHouse/ClickHouse/pull/3283) +- A `TRUNCATE TABLE` query can be executed on any replica (the query is passed to the leader replica). [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3375) + +#### Bug Fixes: {#bug-fixes-10} + +- Fixed an issue with `Dictionary` tables for `range_hashed` dictionaries. This error occurred in version 18.12.17. [#1702](https://github.com/ClickHouse/ClickHouse/pull/1702) +- Fixed an error when loading `range_hashed` dictionaries (the message `Unsupported type Nullable (...)`). This error occurred in version 18.12.17. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Fixed errors in the `pointInPolygon` function due to the accumulation of inaccurate calculations for polygons with a large number of vertices located close to each other. [#3331](https://github.com/ClickHouse/ClickHouse/pull/3331) [#3341](https://github.com/ClickHouse/ClickHouse/pull/3341) +- If after merging data parts, the checksum for the resulting part differs from the result of the same merge in another replica, the result of the merge is deleted and the data part is downloaded from the other replica (this is the correct behavior). But after downloading the data part, it couldn’t be added to the working set because of an error that the part already exists (because the data part was deleted with some delay after the merge). This led to cyclical attempts to download the same data. [#3194](https://github.com/ClickHouse/ClickHouse/pull/3194) +- Fixed incorrect calculation of total memory consumption by queries (because of incorrect calculation, the `max_memory_usage_for_all_queries` setting worked incorrectly and the `MemoryTracking` metric had an incorrect value). This error occurred in version 18.12.13. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3344) +- Fixed the functionality of `CREATE TABLE ... ON CLUSTER ... AS SELECT ...` This error occurred in version 18.12.13. [#3247](https://github.com/ClickHouse/ClickHouse/pull/3247) +- Fixed unnecessary preparation of data structures for `JOIN`s on the server that initiates the query if the `JOIN` is only performed on remote servers. [#3340](https://github.com/ClickHouse/ClickHouse/pull/3340) +- Fixed bugs in the `Kafka` engine: deadlocks after exceptions when starting to read data, and locks upon completion [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- For `Kafka` tables, the optional `schema` parameter was not passed (the schema of the `Cap'n'Proto` format). [Vojtech Splichal](https://github.com/ClickHouse/ClickHouse/pull/3150) +- If the ensemble of ZooKeeper servers has servers that accept the connection but then immediately close it instead of responding to the handshake, ClickHouse chooses to connect another server. Previously, this produced the error `Cannot read all data. Bytes read: 0. Bytes expected: 4.` and the server couldn’t start. [8218cf3a](https://github.com/ClickHouse/ClickHouse/commit/8218cf3a5f39a43401953769d6d12a0bb8d29da9) +- If the ensemble of ZooKeeper servers contains servers for which the DNS query returns an error, these servers are ignored. [17b8e209](https://github.com/ClickHouse/ClickHouse/commit/17b8e209221061325ad7ba0539f03c6e65f87f29) +- Fixed type conversion between `Date` and `DateTime` when inserting data in the `VALUES` format (if `input_format_values_interpret_expressions = 1`). Previously, the conversion was performed between the numerical value of the number of days in Unix Epoch time and the Unix timestamp, which led to unexpected results. [#3229](https://github.com/ClickHouse/ClickHouse/pull/3229) +- Corrected type conversion between `Decimal` and integer numbers. [#3211](https://github.com/ClickHouse/ClickHouse/pull/3211) +- Fixed errors in the `enable_optimize_predicate_expression` setting. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3231) +- Fixed a parsing error in CSV format with floating-point numbers if a non-default CSV separator is used, such as `;` [#3155](https://github.com/ClickHouse/ClickHouse/pull/3155) +- Fixed the `arrayCumSumNonNegative` function (it does not accumulate negative values if the accumulator is less than zero). [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/3163) +- Fixed how `Merge` tables work on top of `Distributed` tables when using `PREWHERE`. [#3165](https://github.com/ClickHouse/ClickHouse/pull/3165) +- Bug fixes in the `ALTER UPDATE` query. +- Fixed bugs in the `odbc` table function that appeared in version 18.12. [#3197](https://github.com/ClickHouse/ClickHouse/pull/3197) +- Fixed the operation of aggregate functions with `StateArray` combinators. [#3188](https://github.com/ClickHouse/ClickHouse/pull/3188) +- Fixed a crash when dividing a `Decimal` value by zero. [69dd6609](https://github.com/ClickHouse/ClickHouse/commit/69dd6609193beb4e7acd3e6ad216eca0ccfb8179) +- Fixed output of types for operations using `Decimal` and integer arguments. [#3224](https://github.com/ClickHouse/ClickHouse/pull/3224) +- Fixed the segfault during `GROUP BY` on `Decimal128`. [3359ba06](https://github.com/ClickHouse/ClickHouse/commit/3359ba06c39fcd05bfdb87d6c64154819621e13a) +- The `log_query_threads` setting (logging information about each thread of query execution) now takes effect only if the `log_queries` option (logging information about queries) is set to 1. Since the `log_query_threads` option is enabled by default, information about threads was previously logged even if query logging was disabled. [#3241](https://github.com/ClickHouse/ClickHouse/pull/3241) +- Fixed an error in the distributed operation of the quantiles aggregate function (the error message `Not found column quantile...`). [292a8855](https://github.com/ClickHouse/ClickHouse/commit/292a885533b8e3b41ce8993867069d14cbd5a664) +- Fixed the compatibility problem when working on a cluster of version 18.12.17 servers and older servers at the same time. For distributed queries with GROUP BY keys of both fixed and non-fixed length, if there was a large amount of data to aggregate, the returned data was not always fully aggregated (two different rows contained the same aggregation keys). [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) +- Fixed handling of substitutions in `clickhouse-performance-test`, if the query contains only part of the substitutions declared in the test. [#3263](https://github.com/ClickHouse/ClickHouse/pull/3263) +- Fixed an error when using `FINAL` with `PREWHERE`. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Fixed an error when using `PREWHERE` over columns that were added during `ALTER`. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Added a check for the absence of `arrayJoin` for `DEFAULT` and `MATERIALIZED` expressions. Previously, `arrayJoin` led to an error when inserting data. [#3337](https://github.com/ClickHouse/ClickHouse/pull/3337) +- Added a check for the absence of `arrayJoin` in a `PREWHERE` clause. Previously, this led to messages like `Size ... does not match` or `Unknown compression method` when executing queries. [#3357](https://github.com/ClickHouse/ClickHouse/pull/3357) +- Fixed segfault that could occur in rare cases after optimization that replaced AND chains from equality evaluations with the corresponding IN expression. [liuyimin-bytedance](https://github.com/ClickHouse/ClickHouse/pull/3339) +- Minor corrections to `clickhouse-benchmark`: previously, client information was not sent to the server; now the number of queries executed is calculated more accurately when shutting down and for limiting the number of iterations. [#3351](https://github.com/ClickHouse/ClickHouse/pull/3351) [#3352](https://github.com/ClickHouse/ClickHouse/pull/3352) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-1} + +- Removed the `allow_experimental_decimal_type` option. The `Decimal` data type is available for default use. [#3329](https://github.com/ClickHouse/ClickHouse/pull/3329) + +## ClickHouse Release 18.12 {#clickhouse-release-18-12} + +### ClickHouse Release 18.12.17, 2018-09-16 {#clickhouse-release-18-12-17-2018-09-16} + +#### New Features: {#new-features-2} + +- `invalidate_query` (the ability to specify a query to check whether an external dictionary needs to be updated) is implemented for the `clickhouse` source. [#3126](https://github.com/ClickHouse/ClickHouse/pull/3126) +- Added the ability to use `UInt*`, `Int*`, and `DateTime` data types (along with the `Date` type) as a `range_hashed` external dictionary key that defines the boundaries of ranges. Now `NULL` can be used to designate an open range. [Vasily Nemkov](https://github.com/ClickHouse/ClickHouse/pull/3123) +- The `Decimal` type now supports `var*` and `stddev*` aggregate functions. [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- The `Decimal` type now supports mathematical functions (`exp`, `sin` and so on.) [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- The `system.part_log` table now has the `partition_id` column. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Bug Fixes: {#bug-fixes-11} + +- `Merge` now works correctly on `Distributed` tables. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3159) +- Fixed incompatibility (unnecessary dependency on the `glibc` version) that made it impossible to run ClickHouse on `Ubuntu Precise` and older versions. The incompatibility arose in version 18.12.13. [#3130](https://github.com/ClickHouse/ClickHouse/pull/3130) +- Fixed errors in the `enable_optimize_predicate_expression` setting. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) +- Fixed a minor issue with backwards compatibility that appeared when working with a cluster of replicas on versions earlier than 18.12.13 and simultaneously creating a new replica of a table on a server with a newer version (shown in the message `Can not clone replica, because the ... updated to new ClickHouse version`, which is logical, but shouldn’t happen). [#3122](https://github.com/ClickHouse/ClickHouse/pull/3122) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-2} + +- The `enable_optimize_predicate_expression` option is enabled by default (which is rather optimistic). If query analysis errors occur that are related to searching for the column names, set `enable_optimize_predicate_expression` to 0. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) + +### ClickHouse Release 18.12.14, 2018-09-13 {#clickhouse-release-18-12-14-2018-09-13} + +#### New Features: {#new-features-3} + +- Added support for `ALTER UPDATE` queries. [#3035](https://github.com/ClickHouse/ClickHouse/pull/3035) +- Added the `allow_ddl` option, which restricts the user’s access to DDL queries. [#3104](https://github.com/ClickHouse/ClickHouse/pull/3104) +- Added the `min_merge_bytes_to_use_direct_io` option for `MergeTree` engines, which allows you to set a threshold for the total size of the merge (when above the threshold, data part files will be handled using O_DIRECT). [#3117](https://github.com/ClickHouse/ClickHouse/pull/3117) +- The `system.merges` system table now contains the `partition_id` column. [#3099](https://github.com/ClickHouse/ClickHouse/pull/3099) + +#### Improvements {#improvements-3} + +- If a data part remains unchanged during mutation, it isn’t downloaded by replicas. [#3103](https://github.com/ClickHouse/ClickHouse/pull/3103) +- Autocomplete is available for names of settings when working with `clickhouse-client`. [#3106](https://github.com/ClickHouse/ClickHouse/pull/3106) + +#### Bug Fixes: {#bug-fixes-12} + +- Added a check for the sizes of arrays that are elements of `Nested` type fields when inserting. [#3118](https://github.com/ClickHouse/ClickHouse/pull/3118) +- Fixed an error updating external dictionaries with the `ODBC` source and `hashed` storage. This error occurred in version 18.12.13. +- Fixed a crash when creating a temporary table from a query with an `IN` condition. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3098) +- Fixed an error in aggregate functions for arrays that can have `NULL` elements. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3097) + +### ClickHouse Release 18.12.13, 2018-09-10 {#clickhouse-release-18-12-13-2018-09-10} + +#### New Features: {#new-features-4} + +- Added the `DECIMAL(digits, scale)` data type (`Decimal32(scale)`, `Decimal64(scale)`, `Decimal128(scale)`). To enable it, use the setting `allow_experimental_decimal_type`. [#2846](https://github.com/ClickHouse/ClickHouse/pull/2846) [#2970](https://github.com/ClickHouse/ClickHouse/pull/2970) [#3008](https://github.com/ClickHouse/ClickHouse/pull/3008) [#3047](https://github.com/ClickHouse/ClickHouse/pull/3047) +- New `WITH ROLLUP` modifier for `GROUP BY` (alternative syntax: `GROUP BY ROLLUP(...)`). [#2948](https://github.com/ClickHouse/ClickHouse/pull/2948) +- In queries with JOIN, the star character expands to a list of columns in all tables, in compliance with the SQL standard. You can restore the old behavior by setting `asterisk_left_columns_only` to 1 on the user configuration level. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2787) +- Added support for JOIN with table functions. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Autocomplete by pressing Tab in clickhouse-client. [Sergey Shcherbin](https://github.com/ClickHouse/ClickHouse/pull/2447) +- Ctrl+C in clickhouse-client clears a query that was entered. [#2877](https://github.com/ClickHouse/ClickHouse/pull/2877) +- Added the `join_default_strictness` setting (values: `"`, `'any'`, `'all'`). This allows you to not specify `ANY` or `ALL` for `JOIN`. [#2982](https://github.com/ClickHouse/ClickHouse/pull/2982) +- Each line of the server log related to query processing shows the query ID. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Now you can get query execution logs in clickhouse-client (use the `send_logs_level` setting). With distributed query processing, logs are cascaded from all the servers. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.query_log` and `system.processes` (`SHOW PROCESSLIST`) tables now have information about all changed settings when you run a query (the nested structure of the `Settings` data). Added the `log_query_settings` setting. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.query_log` and `system.processes` tables now show information about the number of threads that are participating in query execution (see the `thread_numbers` column). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added `ProfileEvents` counters that measure the time spent on reading and writing over the network and reading and writing to disk, the number of network errors, and the time spent waiting when network bandwidth is limited. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added `ProfileEvents`counters that contain the system metrics from rusage (you can use them to get information about CPU usage in userspace and the kernel, page faults, and context switches), as well as taskstats metrics (use these to obtain information about I/O wait time, CPU wait time, and the amount of data read and recorded, both with and without page cache). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `ProfileEvents` counters are applied globally and for each query, as well as for each query execution thread, which allows you to profile resource consumption by query in detail. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added the `system.query_thread_log` table, which contains information about each query execution thread. Added the `log_query_threads` setting. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.metrics` and `system.events` tables now have built-in documentation. [#3016](https://github.com/ClickHouse/ClickHouse/pull/3016) +- Added the `arrayEnumerateDense` function. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2975) +- Added the `arrayCumSumNonNegative` and `arrayDifference` functions. [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/2942) +- Added the `retention` aggregate function. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2887) +- Now you can add (merge) states of aggregate functions by using the plus operator, and multiply the states of aggregate functions by a nonnegative constant. [#3062](https://github.com/ClickHouse/ClickHouse/pull/3062) [#3034](https://github.com/ClickHouse/ClickHouse/pull/3034) +- Tables in the MergeTree family now have the virtual column `_partition_id`. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Experimental Features: {#experimental-features-1} + +- Added the `LowCardinality(T)` data type. This data type automatically creates a local dictionary of values and allows data processing without unpacking the dictionary. [#2830](https://github.com/ClickHouse/ClickHouse/pull/2830) +- Added a cache of JIT-compiled functions and a counter for the number of uses before compiling. To JIT compile expressions, enable the `compile_expressions` setting. [#2990](https://github.com/ClickHouse/ClickHouse/pull/2990) [#3077](https://github.com/ClickHouse/ClickHouse/pull/3077) + +#### Improvements: {#improvements-4} + +- Fixed the problem with unlimited accumulation of the replication log when there are abandoned replicas. Added an effective recovery mode for replicas with a long lag. +- Improved performance of `GROUP BY` with multiple aggregation fields when one of them is string and the others are fixed length. +- Improved performance when using `PREWHERE` and with implicit transfer of expressions in `PREWHERE`. +- Improved parsing performance for text formats (`CSV`, `TSV`). [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2977) [#2980](https://github.com/ClickHouse/ClickHouse/pull/2980) +- Improved performance of reading strings and arrays in binary formats. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2955) +- Increased performance and reduced memory consumption for queries to `system.tables` and `system.columns` when there is a very large number of tables on a single server. [#2953](https://github.com/ClickHouse/ClickHouse/pull/2953) +- Fixed a performance problem in the case of a large stream of queries that result in an error (the `_dl_addr` function is visible in `perf top`, but the server isn’t using much CPU). [#2938](https://github.com/ClickHouse/ClickHouse/pull/2938) +- Conditions are cast into the View (when `enable_optimize_predicate_expression` is enabled). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Improvements to the functionality for the `UUID` data type. [#3074](https://github.com/ClickHouse/ClickHouse/pull/3074) [#2985](https://github.com/ClickHouse/ClickHouse/pull/2985) +- The `UUID` data type is supported in The-Alchemist dictionaries. [#2822](https://github.com/ClickHouse/ClickHouse/pull/2822) +- The `visitParamExtractRaw` function works correctly with nested structures. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2974) +- When the `input_format_skip_unknown_fields` setting is enabled, object fields in `JSONEachRow` format are skipped correctly. [BlahGeek](https://github.com/ClickHouse/ClickHouse/pull/2958) +- For a `CASE` expression with conditions, you can now omit `ELSE`, which is equivalent to `ELSE NULL`. [#2920](https://github.com/ClickHouse/ClickHouse/pull/2920) +- The operation timeout can now be configured when working with ZooKeeper. [urykhy](https://github.com/ClickHouse/ClickHouse/pull/2971) +- You can specify an offset for `LIMIT n, m` as `LIMIT n OFFSET m`. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- You can use the `SELECT TOP n` syntax as an alternative for `LIMIT`. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Increased the size of the queue to write to system tables, so the `SystemLog parameter queue is full` error does not happen as often. +- The `windowFunnel` aggregate function now supports events that meet multiple conditions. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2801) +- Duplicate columns can be used in a `USING` clause for `JOIN`. [#3006](https://github.com/ClickHouse/ClickHouse/pull/3006) +- `Pretty` formats now have a limit on column alignment by width. Use the `output_format_pretty_max_column_pad_width` setting. If a value is wider, it will still be displayed in its entirety, but the other cells in the table will not be too wide. [#3003](https://github.com/ClickHouse/ClickHouse/pull/3003) +- The `odbc` table function now allows you to specify the database/schema name. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2885) +- Added the ability to use a username specified in the `clickhouse-client` config file. [Vladimir Kozbin](https://github.com/ClickHouse/ClickHouse/pull/2909) +- The `ZooKeeperExceptions` counter has been split into three counters: `ZooKeeperUserExceptions`, `ZooKeeperHardwareExceptions`, and `ZooKeeperOtherExceptions`. +- `ALTER DELETE` queries work for materialized views. +- Added randomization when running the cleanup thread periodically for `ReplicatedMergeTree` tables in order to avoid periodic load spikes when there are a very large number of `ReplicatedMergeTree` tables. +- Support for `ATTACH TABLE ... ON CLUSTER` queries. [#3025](https://github.com/ClickHouse/ClickHouse/pull/3025) + +#### Bug Fixes: {#bug-fixes-13} + +- Fixed an issue with `Dictionary` tables (throws the `Size of offsets does not match size of column` or `Unknown compression method` exception). This bug appeared in version 18.10.3. [#2913](https://github.com/ClickHouse/ClickHouse/issues/2913) +- Fixed a bug when merging `CollapsingMergeTree` tables if one of the data parts is empty (these parts are formed during merge or `ALTER DELETE` if all data was deleted), and the `vertical` algorithm was used for the merge. [#3049](https://github.com/ClickHouse/ClickHouse/pull/3049) +- Fixed a race condition during `DROP` or `TRUNCATE` for `Memory` tables with a simultaneous `SELECT`, which could lead to server crashes. This bug appeared in version 1.1.54388. [#3038](https://github.com/ClickHouse/ClickHouse/pull/3038) +- Fixed the possibility of data loss when inserting in `Replicated` tables if the `Session is expired` error is returned (data loss can be detected by the `ReplicatedDataLoss` metric). This error occurred in version 1.1.54378. [#2939](https://github.com/ClickHouse/ClickHouse/pull/2939) [#2949](https://github.com/ClickHouse/ClickHouse/pull/2949) [#2964](https://github.com/ClickHouse/ClickHouse/pull/2964) +- Fixed a segfault during `JOIN ... ON`. [#3000](https://github.com/ClickHouse/ClickHouse/pull/3000) +- Fixed the error searching column names when the `WHERE` expression consists entirely of a qualified column name, such as `WHERE table.column`. [#2994](https://github.com/ClickHouse/ClickHouse/pull/2994) +- Fixed the “Not found column” error that occurred when executing distributed queries if a single column consisting of an IN expression with a subquery is requested from a remote server. [#3087](https://github.com/ClickHouse/ClickHouse/pull/3087) +- Fixed the `Block structure mismatch in UNION stream: different number of columns` error that occurred for distributed queries if one of the shards is local and the other is not, and optimization of the move to `PREWHERE` is triggered. [#2226](https://github.com/ClickHouse/ClickHouse/pull/2226) [#3037](https://github.com/ClickHouse/ClickHouse/pull/3037) [#3055](https://github.com/ClickHouse/ClickHouse/pull/3055) [#3065](https://github.com/ClickHouse/ClickHouse/pull/3065) [#3073](https://github.com/ClickHouse/ClickHouse/pull/3073) [#3090](https://github.com/ClickHouse/ClickHouse/pull/3090) [#3093](https://github.com/ClickHouse/ClickHouse/pull/3093) +- Fixed the `pointInPolygon` function for certain cases of non-convex polygons. [#2910](https://github.com/ClickHouse/ClickHouse/pull/2910) +- Fixed the incorrect result when comparing `nan` with integers. [#3024](https://github.com/ClickHouse/ClickHouse/pull/3024) +- Fixed an error in the `zlib-ng` library that could lead to segfault in rare cases. [#2854](https://github.com/ClickHouse/ClickHouse/pull/2854) +- Fixed a memory leak when inserting into a table with `AggregateFunction` columns, if the state of the aggregate function is not simple (allocates memory separately), and if a single insertion request results in multiple small blocks. [#3084](https://github.com/ClickHouse/ClickHouse/pull/3084) +- Fixed a race condition when creating and deleting the same `Buffer` or `MergeTree` table simultaneously. +- Fixed the possibility of a segfault when comparing tuples made up of certain non-trivial types, such as tuples. [#2989](https://github.com/ClickHouse/ClickHouse/pull/2989) +- Fixed the possibility of a segfault when running certain `ON CLUSTER` queries. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2960) +- Fixed an error in the `arrayDistinct` function for `Nullable` array elements. [#2845](https://github.com/ClickHouse/ClickHouse/pull/2845) [#2937](https://github.com/ClickHouse/ClickHouse/pull/2937) +- The `enable_optimize_predicate_expression` option now correctly supports cases with `SELECT *`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2929) +- Fixed the segfault when re-initializing the ZooKeeper session. [#2917](https://github.com/ClickHouse/ClickHouse/pull/2917) +- Fixed potential blocking when working with ZooKeeper. +- Fixed incorrect code for adding nested data structures in a `SummingMergeTree`. +- When allocating memory for states of aggregate functions, alignment is correctly taken into account, which makes it possible to use operations that require alignment when implementing states of aggregate functions. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2808) + +#### Security Fix: {#security-fix} + +- Safe use of ODBC data sources. Interaction with ODBC drivers uses a separate `clickhouse-odbc-bridge` process. Errors in third-party ODBC drivers no longer cause problems with server stability or vulnerabilities. [#2828](https://github.com/ClickHouse/ClickHouse/pull/2828) [#2879](https://github.com/ClickHouse/ClickHouse/pull/2879) [#2886](https://github.com/ClickHouse/ClickHouse/pull/2886) [#2893](https://github.com/ClickHouse/ClickHouse/pull/2893) [#2921](https://github.com/ClickHouse/ClickHouse/pull/2921) +- Fixed incorrect validation of the file path in the `catBoostPool` table function. [#2894](https://github.com/ClickHouse/ClickHouse/pull/2894) +- The contents of system tables (`tables`, `databases`, `parts`, `columns`, `parts_columns`, `merges`, `mutations`, `replicas`, and `replication_queue`) are filtered according to the user’s configured access to databases (`allow_databases`). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2856) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-3} + +- In queries with JOIN, the star character expands to a list of columns in all tables, in compliance with the SQL standard. You can restore the old behavior by setting `asterisk_left_columns_only` to 1 on the user configuration level. + +#### Build Changes: {#build-changes-2} + +- Most integration tests can now be run by commit. +- Code style checks can also be run by commit. +- The `memcpy` implementation is chosen correctly when building on CentOS7/Fedora. [Etienne Champetier](https://github.com/ClickHouse/ClickHouse/pull/2912) +- When using clang to build, some warnings from `-Weverything` have been added, in addition to the regular `-Wall-Wextra -Werror`. [#2957](https://github.com/ClickHouse/ClickHouse/pull/2957) +- Debugging the build uses the `jemalloc` debug option. +- The interface of the library for interacting with ZooKeeper is declared abstract. [#2950](https://github.com/ClickHouse/ClickHouse/pull/2950) + +## ClickHouse Release 18.10 {#clickhouse-release-18-10} + +### ClickHouse Release 18.10.3, 2018-08-13 {#clickhouse-release-18-10-3-2018-08-13} + +#### New Features: {#new-features-5} + +- HTTPS can be used for replication. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) +- Added the functions `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64`, and `murmurHash3_128` in addition to the existing `murmurHash2_32`. [#2791](https://github.com/ClickHouse/ClickHouse/pull/2791) +- Support for Nullable types in the ClickHouse ODBC driver (`ODBCDriver2` output format). [#2834](https://github.com/ClickHouse/ClickHouse/pull/2834) +- Support for `UUID` in the key columns. + +#### Improvements: {#improvements-5} + +- Clusters can be removed without restarting the server when they are deleted from the config files. [#2777](https://github.com/ClickHouse/ClickHouse/pull/2777) +- External dictionaries can be removed without restarting the server when they are removed from config files. [#2779](https://github.com/ClickHouse/ClickHouse/pull/2779) +- Added `SETTINGS` support for the `Kafka` table engine. [Alexander Marshalov](https://github.com/ClickHouse/ClickHouse/pull/2781) +- Improvements for the `UUID` data type (not yet complete). [#2618](https://github.com/ClickHouse/ClickHouse/pull/2618) +- Support for empty parts after merges in the `SummingMergeTree`, `CollapsingMergeTree` and `VersionedCollapsingMergeTree` engines. [#2815](https://github.com/ClickHouse/ClickHouse/pull/2815) +- Old records of completed mutations are deleted (`ALTER DELETE`). [#2784](https://github.com/ClickHouse/ClickHouse/pull/2784) +- Added the `system.merge_tree_settings` table. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/2841) +- The `system.tables` table now has dependency columns: `dependencies_database` and `dependencies_table`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2851) +- Added the `max_partition_size_to_drop` config option. [#2782](https://github.com/ClickHouse/ClickHouse/pull/2782) +- Added the `output_format_json_escape_forward_slashes` option. [Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2812) +- Added the `max_fetch_partition_retries_count` setting. [#2831](https://github.com/ClickHouse/ClickHouse/pull/2831) +- Added the `prefer_localhost_replica` setting for disabling the preference for a local replica and going to a local replica without inter-process interaction. [#2832](https://github.com/ClickHouse/ClickHouse/pull/2832) +- The `quantileExact` aggregate function returns `nan` in the case of aggregation on an empty `Float32` or `Float64` set. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2855) + +#### Bug Fixes: {#bug-fixes-14} + +- Removed unnecessary escaping of the connection string parameters for ODBC, which made it impossible to establish a connection. This error occurred in version 18.6.0. +- Fixed the logic for processing `REPLACE PARTITION` commands in the replication queue. If there are two `REPLACE` commands for the same partition, the incorrect logic could cause one of them to remain in the replication queue and not be executed. [#2814](https://github.com/ClickHouse/ClickHouse/pull/2814) +- Fixed a merge bug when all data parts were empty (parts that were formed from a merge or from `ALTER DELETE` if all data was deleted). This bug appeared in version 18.1.0. [#2930](https://github.com/ClickHouse/ClickHouse/pull/2930) +- Fixed an error for concurrent `Set` or `Join`. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2823) +- Fixed the `Block structure mismatch in UNION stream: different number of columns` error that occurred for `UNION ALL` queries inside a sub-query if one of the `SELECT` queries contains duplicate column names. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2094) +- Fixed a memory leak if an exception occurred when connecting to a MySQL server. +- Fixed incorrect clickhouse-client response code in case of a query error. +- Fixed incorrect behavior of materialized views containing DISTINCT. [#2795](https://github.com/ClickHouse/ClickHouse/issues/2795) + +#### Backward Incompatible Changes {#backward-incompatible-changes-4} + +- Removed support for CHECK TABLE queries for Distributed tables. + +#### Build Changes: {#build-changes-3} + +- The allocator has been replaced: `jemalloc` is now used instead of `tcmalloc`. In some scenarios, this increases speed up to 20%. However, there are queries that have slowed by up to 20%. Memory consumption has been reduced by approximately 10% in some scenarios, with improved stability. With highly competitive loads, CPU usage in userspace and in system shows just a slight increase. [#2773](https://github.com/ClickHouse/ClickHouse/pull/2773) +- Use of libressl from a submodule. [#1983](https://github.com/ClickHouse/ClickHouse/pull/1983) [#2807](https://github.com/ClickHouse/ClickHouse/pull/2807) +- Use of unixodbc from a submodule. [#2789](https://github.com/ClickHouse/ClickHouse/pull/2789) +- Use of mariadb-connector-c from a submodule. [#2785](https://github.com/ClickHouse/ClickHouse/pull/2785) +- Added functional test files to the repository that depend on the availability of test data (for the time being, without the test data itself). + +## ClickHouse Release 18.6 {#clickhouse-release-18-6} + +### ClickHouse Release 18.6.0, 2018-08-02 {#clickhouse-release-18-6-0-2018-08-02} + +#### New Features: {#new-features-6} + +- Added support for ON expressions for the JOIN ON syntax: + `JOIN ON Expr([table.]column ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]` + The expression must be a chain of equalities joined by the AND operator. Each side of the equality can be an arbitrary expression over the columns of one of the tables. The use of fully qualified column names is supported (`table.name`, `database.table.name`, `table_alias.name`, `subquery_alias.name`) for the right table. [#2742](https://github.com/ClickHouse/ClickHouse/pull/2742) +- HTTPS can be enabled for replication. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) + +#### Improvements: {#improvements-6} + +- The server passes the patch component of its version to the client. Data about the patch version component is in `system.processes` and `query_log`. [#2646](https://github.com/ClickHouse/ClickHouse/pull/2646) + +## ClickHouse Release 18.5 {#clickhouse-release-18-5} + +### ClickHouse Release 18.5.1, 2018-07-31 {#clickhouse-release-18-5-1-2018-07-31} + +#### New Features: {#new-features-7} + +- Added the hash function `murmurHash2_32` [#2756](https://github.com/ClickHouse/ClickHouse/pull/2756). + +#### Improvements: {#improvements-7} + +- Now you can use the `from_env` [#2741](https://github.com/ClickHouse/ClickHouse/pull/2741) attribute to set values in config files from environment variables. +- Added case-insensitive versions of the `coalesce`, `ifNull`, and `nullIf functions` [#2752](https://github.com/ClickHouse/ClickHouse/pull/2752). + +#### Bug Fixes: {#bug-fixes-15} + +- Fixed a possible bug when starting a replica [#2759](https://github.com/ClickHouse/ClickHouse/pull/2759). + +## ClickHouse Release 18.4 {#clickhouse-release-18-4} + +### ClickHouse Release 18.4.0, 2018-07-28 {#clickhouse-release-18-4-0-2018-07-28} + +#### New Features: {#new-features-8} + +- Added system tables: `formats`, `data_type_families`, `aggregate_function_combinators`, `table_functions`, `table_engines`, `collations` [#2721](https://github.com/ClickHouse/ClickHouse/pull/2721). +- Added the ability to use a table function instead of a table as an argument of a `remote` or `cluster table function` [#2708](https://github.com/ClickHouse/ClickHouse/pull/2708). +- Support for `HTTP Basic` authentication in the replication protocol [#2727](https://github.com/ClickHouse/ClickHouse/pull/2727). +- The `has` function now allows searching for a numeric value in an array of `Enum` values [Maxim Khrisanfov](https://github.com/ClickHouse/ClickHouse/pull/2699). +- Support for adding arbitrary message separators when reading from `Kafka` [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2701). + +#### Improvements: {#improvements-8} + +- The `ALTER TABLE t DELETE WHERE` query does not rewrite data parts that were not affected by the WHERE condition [#2694](https://github.com/ClickHouse/ClickHouse/pull/2694). +- The `use_minimalistic_checksums_in_zookeeper` option for `ReplicatedMergeTree` tables is enabled by default. This setting was added in version 1.1.54378, 2018-04-16. Versions that are older than 1.1.54378 can no longer be installed. +- Support for running `KILL` and `OPTIMIZE` queries that specify `ON CLUSTER` [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2689). + +#### Bug Fixes: {#bug-fixes-16} + +- Fixed the error `Column ... is not under an aggregate function and not in GROUP BY` for aggregation with an IN expression. This bug appeared in version 18.1.0. ([bbdd780b](https://github.com/ClickHouse/ClickHouse/commit/bbdd780be0be06a0f336775941cdd536878dd2c2)) +- Fixed a bug in the `windowFunnel aggregate function` [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2735). +- Fixed a bug in the `anyHeavy` aggregate function ([a2101df2](https://github.com/ClickHouse/ClickHouse/commit/a2101df25a6a0fba99aa71f8793d762af2b801ee)) +- Fixed server crash when using the `countArray()` aggregate function. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-5} + +- Parameters for `Kafka` engine was changed from `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_schema, kafka_num_consumers])` to `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_row_delimiter, kafka_schema, kafka_num_consumers])`. If your tables use `kafka_schema` or `kafka_num_consumers` parameters, you have to manually edit the metadata files `path/metadata/database/table.sql` and add `kafka_row_delimiter` parameter with `''` value. + +## ClickHouse Release 18.1 {#clickhouse-release-18-1} + +### ClickHouse Release 18.1.0, 2018-07-23 {#clickhouse-release-18-1-0-2018-07-23} + +#### New Features: {#new-features-9} + +- Support for the `ALTER TABLE t DELETE WHERE` query for non-replicated MergeTree tables ([#2634](https://github.com/ClickHouse/ClickHouse/pull/2634)). +- Support for arbitrary types for the `uniq*` family of aggregate functions ([#2010](https://github.com/ClickHouse/ClickHouse/issues/2010)). +- Support for arbitrary types in comparison operators ([#2026](https://github.com/ClickHouse/ClickHouse/issues/2026)). +- The `users.xml` file allows setting a subnet mask in the format `10.0.0.1/255.255.255.0`. This is necessary for using masks for IPv6 networks with zeros in the middle ([#2637](https://github.com/ClickHouse/ClickHouse/pull/2637)). +- Added the `arrayDistinct` function ([#2670](https://github.com/ClickHouse/ClickHouse/pull/2670)). +- The SummingMergeTree engine can now work with AggregateFunction type columns ([Constantin S. Pan](https://github.com/ClickHouse/ClickHouse/pull/2566)). + +#### Improvements: {#improvements-9} + +- Changed the numbering scheme for release versions. Now the first part contains the year of release (A.D., Moscow timezone, minus 2000), the second part contains the number for major changes (increases for most releases), and the third part is the patch version. Releases are still backward compatible, unless otherwise stated in the changelog. +- Faster conversions of floating-point numbers to a string ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2664)). +- If some rows were skipped during an insert due to parsing errors (this is possible with the `input_allow_errors_num` and `input_allow_errors_ratio` settings enabled), the number of skipped rows is now written to the server log ([Leonardo Cecchi](https://github.com/ClickHouse/ClickHouse/pull/2669)). + +#### Bug Fixes: {#bug-fixes-17} + +- Fixed the TRUNCATE command for temporary tables ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2624)). +- Fixed a rare deadlock in the ZooKeeper client library that occurred when there was a network error while reading the response ([c315200](https://github.com/ClickHouse/ClickHouse/commit/c315200e64b87e44bdf740707fc857d1fdf7e947)). +- Fixed an error during a CAST to Nullable types ([#1322](https://github.com/ClickHouse/ClickHouse/issues/1322)). +- Fixed the incorrect result of the `maxIntersection()` function when the boundaries of intervals coincided ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2657)). +- Fixed incorrect transformation of the OR expression chain in a function argument ([chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2663)). +- Fixed performance degradation for queries containing `IN (subquery)` expressions inside another subquery ([#2571](https://github.com/ClickHouse/ClickHouse/issues/2571)). +- Fixed incompatibility between servers with different versions in distributed queries that use a `CAST` function that isn’t in uppercase letters ([fe8c4d6](https://github.com/ClickHouse/ClickHouse/commit/fe8c4d64e434cacd4ceef34faa9005129f2190a5)). +- Added missing quoting of identifiers for queries to an external DBMS ([#2635](https://github.com/ClickHouse/ClickHouse/issues/2635)). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-6} + +- Converting a string containing the number zero to DateTime does not work. Example: `SELECT toDateTime('0')`. This is also the reason that `DateTime DEFAULT '0'` does not work in tables, as well as `0` in dictionaries. Solution: replace `0` with `0000-00-00 00:00:00`. + +## ClickHouse Release 1.1 {#clickhouse-release-1-1} + +### ClickHouse Release 1.1.54394, 2018-07-12 {#clickhouse-release-1-1-54394-2018-07-12} + +#### New Features: {#new-features-10} + +- Added the `histogram` aggregate function ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2521)). +- Now `OPTIMIZE TABLE ... FINAL` can be used without specifying partitions for `ReplicatedMergeTree` ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2600)). + +#### Bug Fixes: {#bug-fixes-18} + +- Fixed a problem with a very small timeout for sockets (one second) for reading and writing when sending and downloading replicated data, which made it impossible to download larger parts if there is a load on the network or disk (it resulted in cyclical attempts to download parts). This error occurred in version 1.1.54388. +- Fixed issues when using chroot in ZooKeeper if you inserted duplicate data blocks in the table. +- The `has` function now works correctly for an array with Nullable elements ([#2115](https://github.com/ClickHouse/ClickHouse/issues/2115)). +- The `system.tables` table now works correctly when used in distributed queries. The `metadata_modification_time` and `engine_full` columns are now non-virtual. Fixed an error that occurred if only these columns were queried from the table. +- Fixed how an empty `TinyLog` table works after inserting an empty data block ([#2563](https://github.com/ClickHouse/ClickHouse/issues/2563)). +- The `system.zookeeper` table works if the value of the node in ZooKeeper is NULL. + +### ClickHouse Release 1.1.54390, 2018-07-06 {#clickhouse-release-1-1-54390-2018-07-06} + +#### New Features: {#new-features-11} + +- Queries can be sent in `multipart/form-data` format (in the `query` field), which is useful if external data is also sent for query processing ([Olga Hvostikova](https://github.com/ClickHouse/ClickHouse/pull/2490)). +- Added the ability to enable or disable processing single or double quotes when reading data in CSV format. You can configure this in the `format_csv_allow_single_quotes` and `format_csv_allow_double_quotes` settings ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2574)). +- Now `OPTIMIZE TABLE ... FINAL` can be used without specifying the partition for non-replicated variants of `MergeTree` ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2599)). + +#### Improvements: {#improvements-10} + +- Improved performance, reduced memory consumption, and correct memory consumption tracking with use of the IN operator when a table index could be used ([#2584](https://github.com/ClickHouse/ClickHouse/pull/2584)). +- Removed redundant checking of checksums when adding a data part. This is important when there are a large number of replicas, because in these cases the total number of checks was equal to N^2. +- Added support for `Array(Tuple(...))` arguments for the `arrayEnumerateUniq` function ([#2573](https://github.com/ClickHouse/ClickHouse/pull/2573)). +- Added `Nullable` support for the `runningDifference` function ([#2594](https://github.com/ClickHouse/ClickHouse/pull/2594)). +- Improved query analysis performance when there is a very large number of expressions ([#2572](https://github.com/ClickHouse/ClickHouse/pull/2572)). +- Faster selection of data parts for merging in `ReplicatedMergeTree` tables. Faster recovery of the ZooKeeper session ([#2597](https://github.com/ClickHouse/ClickHouse/pull/2597)). +- The `format_version.txt` file for `MergeTree` tables is re-created if it is missing, which makes sense if ClickHouse is launched after copying the directory structure without files ([Ciprian Hacman](https://github.com/ClickHouse/ClickHouse/pull/2593)). + +#### Bug Fixes: {#bug-fixes-19} + +- Fixed a bug when working with ZooKeeper that could make it impossible to recover the session and readonly states of tables before restarting the server. +- Fixed a bug when working with ZooKeeper that could result in old nodes not being deleted if the session is interrupted. +- Fixed an error in the `quantileTDigest` function for Float arguments (this bug was introduced in version 1.1.54388) ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2553)). +- Fixed a bug in the index for MergeTree tables if the primary key column is located inside the function for converting types between signed and unsigned integers of the same size ([#2603](https://github.com/ClickHouse/ClickHouse/pull/2603)). +- Fixed segfault if `macros` are used but they aren’t in the config file ([#2570](https://github.com/ClickHouse/ClickHouse/pull/2570)). +- Fixed switching to the default database when reconnecting the client ([#2583](https://github.com/ClickHouse/ClickHouse/pull/2583)). +- Fixed a bug that occurred when the `use_index_for_in_with_subqueries` setting was disabled. + +#### Security Fix: {#security-fix-1} + +- Sending files is no longer possible when connected to MySQL (`LOAD DATA LOCAL INFILE`). + +### ClickHouse Release 1.1.54388, 2018-06-28 {#clickhouse-release-1-1-54388-2018-06-28} + +#### New Features: {#new-features-12} + +- Support for the `ALTER TABLE t DELETE WHERE` query for replicated tables. Added the `system.mutations` table to track progress of this type of queries. +- Support for the `ALTER TABLE t [REPLACE|ATTACH] PARTITION` query for \*MergeTree tables. +- Support for the `TRUNCATE TABLE` query ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2260)) +- Several new `SYSTEM` queries for replicated tables (`RESTART REPLICAS`, `SYNC REPLICA`, `[STOP|START] [MERGES|FETCHES|SENDS REPLICATED|REPLICATION QUEUES]`). +- Added the ability to write to a table with the MySQL engine and the corresponding table function ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2294)). +- Added the `url()` table function and the `URL` table engine ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2501)). +- Added the `windowFunnel` aggregate function ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2352)). +- New `startsWith` and `endsWith` functions for strings ([Vadim Plakhtinsky](https://github.com/ClickHouse/ClickHouse/pull/2429)). +- The `numbers()` table function now allows you to specify the offset ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2535)). +- The password to `clickhouse-client` can be entered interactively. +- Server logs can now be sent to syslog ([Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2459)). +- Support for logging in dictionaries with a shared library source ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2472)). +- Support for custom CSV delimiters ([Ivan Zhukov](https://github.com/ClickHouse/ClickHouse/pull/2263)) +- Added the `date_time_input_format` setting. If you switch this setting to `'best_effort'`, DateTime values will be read in a wide range of formats. +- Added the `clickhouse-obfuscator` utility for data obfuscation. Usage example: publishing data used in performance tests. + +#### Experimental Features: {#experimental-features-2} + +- Added the ability to calculate `and` arguments only where they are needed ([Anastasia Tsarkova](https://github.com/ClickHouse/ClickHouse/pull/2272)) +- JIT compilation to native code is now available for some expressions ([pyos](https://github.com/ClickHouse/ClickHouse/pull/2277)). + +#### Bug Fixes: {#bug-fixes-20} + +- Duplicates no longer appear for a query with `DISTINCT` and `ORDER BY`. +- Queries with `ARRAY JOIN` and `arrayFilter` no longer return an incorrect result. +- Fixed an error when reading an array column from a Nested structure ([#2066](https://github.com/ClickHouse/ClickHouse/issues/2066)). +- Fixed an error when analyzing queries with a HAVING clause like `HAVING tuple IN (...)`. +- Fixed an error when analyzing queries with recursive aliases. +- Fixed an error when reading from ReplacingMergeTree with a condition in PREWHERE that filters all rows ([#2525](https://github.com/ClickHouse/ClickHouse/issues/2525)). +- User profile settings were not applied when using sessions in the HTTP interface. +- Fixed how settings are applied from the command line parameters in clickhouse-local. +- The ZooKeeper client library now uses the session timeout received from the server. +- Fixed a bug in the ZooKeeper client library when the client waited for the server response longer than the timeout. +- Fixed pruning of parts for queries with conditions on partition key columns ([#2342](https://github.com/ClickHouse/ClickHouse/issues/2342)). +- Merges are now possible after `CLEAR COLUMN IN PARTITION` ([#2315](https://github.com/ClickHouse/ClickHouse/issues/2315)). +- Type mapping in the ODBC table function has been fixed ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2268)). +- Type comparisons have been fixed for `DateTime` with and without the time zone ([Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2400)). +- Fixed syntactic parsing and formatting of the `CAST` operator. +- Fixed insertion into a materialized view for the Distributed table engine ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2411)). +- Fixed a race condition when writing data from the `Kafka` engine to materialized views ([Yangkuan Liu](https://github.com/ClickHouse/ClickHouse/pull/2448)). +- Fixed SSRF in the remote() table function. +- Fixed exit behavior of `clickhouse-client` in multiline mode ([#2510](https://github.com/ClickHouse/ClickHouse/issues/2510)). + +#### Improvements: {#improvements-11} + +- Background tasks in replicated tables are now performed in a thread pool instead of in separate threads ([Silviu Caragea](https://github.com/ClickHouse/ClickHouse/pull/1722)). +- Improved LZ4 compression performance. +- Faster analysis for queries with a large number of JOINs and sub-queries. +- The DNS cache is now updated automatically when there are too many network errors. +- Table inserts no longer occur if the insert into one of the materialized views is not possible because it has too many parts. +- Corrected the discrepancy in the event counters `Query`, `SelectQuery`, and `InsertQuery`. +- Expressions like `tuple IN (SELECT tuple)` are allowed if the tuple types match. +- A server with replicated tables can start even if you haven’t configured ZooKeeper. +- When calculating the number of available CPU cores, limits on cgroups are now taken into account ([Atri Sharma](https://github.com/ClickHouse/ClickHouse/pull/2325)). +- Added chown for config directories in the systemd config file ([Mikhail Shiryaev](https://github.com/ClickHouse/ClickHouse/pull/2421)). + +#### Build Changes: {#build-changes-4} + +- The gcc8 compiler can be used for builds. +- Added the ability to build llvm from submodule. +- The version of the librdkafka library has been updated to v0.11.4. +- Added the ability to use the system libcpuid library. The library version has been updated to 0.4.0. +- Fixed the build using the vectorclass library ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2274)). +- Cmake now generates files for ninja by default (like when using `-G Ninja`). +- Added the ability to use the libtinfo library instead of libtermcap ([Georgy Kondratiev](https://github.com/ClickHouse/ClickHouse/pull/2519)). +- Fixed a header file conflict in Fedora Rawhide ([#2520](https://github.com/ClickHouse/ClickHouse/issues/2520)). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-7} + +- Removed escaping in `Vertical` and `Pretty*` formats and deleted the `VerticalRaw` format. +- If servers with version 1.1.54388 (or newer) and servers with an older version are used simultaneously in a distributed query and the query has the `cast(x, 'Type')` expression without the `AS` keyword and does not have the word `cast` in uppercase, an exception will be thrown with a message like `Not found column cast(0, 'UInt8') in block`. Solution: Update the server on the entire cluster. + +### ClickHouse Release 1.1.54385, 2018-06-01 {#clickhouse-release-1-1-54385-2018-06-01} + +#### Bug Fixes: {#bug-fixes-21} + +- Fixed an error that in some cases caused ZooKeeper operations to block. + +### ClickHouse Release 1.1.54383, 2018-05-22 {#clickhouse-release-1-1-54383-2018-05-22} + +#### Bug Fixes: {#bug-fixes-22} + +- Fixed a slowdown of replication queue if a table has many replicas. + +### ClickHouse Release 1.1.54381, 2018-05-14 {#clickhouse-release-1-1-54381-2018-05-14} + +#### Bug Fixes: {#bug-fixes-23} + +- Fixed a nodes leak in ZooKeeper when ClickHouse loses connection to ZooKeeper server. + +### ClickHouse Release 1.1.54380, 2018-04-21 {#clickhouse-release-1-1-54380-2018-04-21} + +#### New Features: {#new-features-13} + +- Added the table function `file(path, format, structure)`. An example reading bytes from `/dev/urandom`: ``` ln -s /dev/urandom /var/lib/clickhouse/user_files/random``clickhouse-client -q "SELECT * FROM file('random', 'RowBinary', 'd UInt8') LIMIT 10" ```. + +#### Improvements: {#improvements-12} + +- Subqueries can be wrapped in `()` brackets to enhance query readability. For example: `(SELECT 1) UNION ALL (SELECT 1)`. +- Simple `SELECT` queries from the `system.processes` table are not included in the `max_concurrent_queries` limit. + +#### Bug Fixes: {#bug-fixes-24} + +- Fixed incorrect behavior of the `IN` operator when select from `MATERIALIZED VIEW`. +- Fixed incorrect filtering by partition index in expressions like `partition_key_column IN (...)`. +- Fixed inability to execute `OPTIMIZE` query on non-leader replica if `REANAME` was performed on the table. +- Fixed the authorization error when executing `OPTIMIZE` or `ALTER` queries on a non-leader replica. +- Fixed freezing of `KILL QUERY`. +- Fixed an error in ZooKeeper client library which led to loss of watches, freezing of distributed DDL queue, and slowdowns in the replication queue if a non-empty `chroot` prefix is used in the ZooKeeper configuration. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-8} + +- Removed support for expressions like `(a, b) IN (SELECT (a, b))` (you can use the equivalent expression `(a, b) IN (SELECT a, b)`). In previous releases, these expressions led to undetermined `WHERE` filtering or caused errors. + +### ClickHouse Release 1.1.54378, 2018-04-16 {#clickhouse-release-1-1-54378-2018-04-16} + +#### New Features: {#new-features-14} + +- Logging level can be changed without restarting the server. +- Added the `SHOW CREATE DATABASE` query. +- The `query_id` can be passed to `clickhouse-client` (elBroom). +- New setting: `max_network_bandwidth_for_all_users`. +- Added support for `ALTER TABLE ... PARTITION ...` for `MATERIALIZED VIEW`. +- Added information about the size of data parts in uncompressed form in the system table. +- Server-to-server encryption support for distributed tables (`1` in the replica config in ``). +- Configuration of the table level for the `ReplicatedMergeTree` family in order to minimize the amount of data stored in Zookeeper: : `use_minimalistic_checksums_in_zookeeper = 1` +- Configuration of the `clickhouse-client` prompt. By default, server names are now output to the prompt. The server’s display name can be changed. It’s also sent in the `X-ClickHouse-Display-Name` HTTP header (Kirill Shvakov). +- Multiple comma-separated `topics` can be specified for the `Kafka` engine (Tobias Adamson) +- When a query is stopped by `KILL QUERY` or `replace_running_query`, the client receives the `Query was canceled` exception instead of an incomplete result. + +#### Improvements: {#improvements-13} + +- `ALTER TABLE ... DROP/DETACH PARTITION` queries are run at the front of the replication queue. +- `SELECT ... FINAL` and `OPTIMIZE ... FINAL` can be used even when the table has a single data part. +- A `query_log` table is recreated on the fly if it was deleted manually (Kirill Shvakov). +- The `lengthUTF8` function runs faster (zhang2014). +- Improved performance of synchronous inserts in `Distributed` tables (`insert_distributed_sync = 1`) when there is a very large number of shards. +- The server accepts the `send_timeout` and `receive_timeout` settings from the client and applies them when connecting to the client (they are applied in reverse order: the server socket’s `send_timeout` is set to the `receive_timeout` value received from the client, and vice versa). +- More robust crash recovery for asynchronous insertion into `Distributed` tables. +- The return type of the `countEqual` function changed from `UInt32` to `UInt64` (谢磊). + +#### Bug Fixes: {#bug-fixes-25} + +- Fixed an error with `IN` when the left side of the expression is `Nullable`. +- Correct results are now returned when using tuples with `IN` when some of the tuple components are in the table index. +- The `max_execution_time` limit now works correctly with distributed queries. +- Fixed errors when calculating the size of composite columns in the `system.columns` table. +- Fixed an error when creating a temporary table `CREATE TEMPORARY TABLE IF NOT EXISTS.` +- Fixed errors in `StorageKafka` (##2075) +- Fixed server crashes from invalid arguments of certain aggregate functions. +- Fixed the error that prevented the `DETACH DATABASE` query from stopping background tasks for `ReplicatedMergeTree` tables. +- `Too many parts` state is less likely to happen when inserting into aggregated materialized views (##2084). +- Corrected recursive handling of substitutions in the config if a substitution must be followed by another substitution on the same level. +- Corrected the syntax in the metadata file when creating a `VIEW` that uses a query with `UNION ALL`. +- `SummingMergeTree` now works correctly for summation of nested data structures with a composite key. +- Fixed the possibility of a race condition when choosing the leader for `ReplicatedMergeTree` tables. + +#### Build Changes: {#build-changes-5} + +- The build supports `ninja` instead of `make` and uses `ninja` by default for building releases. +- Renamed packages: `clickhouse-server-base` in `clickhouse-common-static`; `clickhouse-server-common` in `clickhouse-server`; `clickhouse-common-dbg` in `clickhouse-common-static-dbg`. To install, use `clickhouse-server clickhouse-client`. Packages with the old names will still load in the repositories for backward compatibility. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-9} + +- Removed the special interpretation of an IN expression if an array is specified on the left side. Previously, the expression `arr IN (set)` was interpreted as “at least one `arr` element belongs to the `set`”. To get the same behavior in the new version, write `arrayExists(x -> x IN (set), arr)`. +- Disabled the incorrect use of the socket option `SO_REUSEPORT`, which was incorrectly enabled by default in the Poco library. Note that on Linux there is no longer any reason to simultaneously specify the addresses `::` and `0.0.0.0` for listen – use just `::`, which allows listening to the connection both over IPv4 and IPv6 (with the default kernel config settings). You can also revert to the behavior from previous versions by specifying `1` in the config. + +### ClickHouse Release 1.1.54370, 2018-03-16 {#clickhouse-release-1-1-54370-2018-03-16} + +#### New Features: {#new-features-15} + +- Added the `system.macros` table and auto updating of macros when the config file is changed. +- Added the `SYSTEM RELOAD CONFIG` query. +- Added the `maxIntersections(left_col, right_col)` aggregate function, which returns the maximum number of simultaneously intersecting intervals `[left; right]`. The `maxIntersectionsPosition(left, right)` function returns the beginning of the “maximum” interval. ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2012)). + +#### Improvements: {#improvements-14} + +- When inserting data in a `Replicated` table, fewer requests are made to `ZooKeeper` (and most of the user-level errors have disappeared from the `ZooKeeper` log). +- Added the ability to create aliases for data sets. Example: `WITH (1, 2, 3) AS set SELECT number IN set FROM system.numbers LIMIT 10`. + +#### Bug Fixes: {#bug-fixes-26} + +- Fixed the `Illegal PREWHERE` error when reading from Merge tables for `Distributed`tables. +- Added fixes that allow you to start clickhouse-server in IPv4-only Docker containers. +- Fixed a race condition when reading from system `system.parts_columns tables.` +- Removed double buffering during a synchronous insert to a `Distributed` table, which could have caused the connection to timeout. +- Fixed a bug that caused excessively long waits for an unavailable replica before beginning a `SELECT` query. +- Fixed incorrect dates in the `system.parts` table. +- Fixed a bug that made it impossible to insert data in a `Replicated` table if `chroot` was non-empty in the configuration of the `ZooKeeper` cluster. +- Fixed the vertical merging algorithm for an empty `ORDER BY` table. +- Restored the ability to use dictionaries in queries to remote tables, even if these dictionaries are not present on the requestor server. This functionality was lost in release 1.1.54362. +- Restored the behavior for queries like `SELECT * FROM remote('server2', default.table) WHERE col IN (SELECT col2 FROM default.table)` when the right side of the `IN` should use a remote `default.table` instead of a local one. This behavior was broken in version 1.1.54358. +- Removed extraneous error-level logging of `Not found column ... in block`. + +### ClickHouse Release 1.1.54362, 2018-03-11 {#clickhouse-release-1-1-54362-2018-03-11} + +#### New Features: {#new-features-16} + +- Aggregation without `GROUP BY` for an empty set (such as `SELECT count(*) FROM table WHERE 0`) now returns a result with one row with null values for aggregate functions, in compliance with the SQL standard. To restore the old behavior (return an empty result), set `empty_result_for_aggregation_by_empty_set` to 1. +- Added type conversion for `UNION ALL`. Different alias names are allowed in `SELECT` positions in `UNION ALL`, in compliance with the SQL standard. +- Arbitrary expressions are supported in `LIMIT BY` clauses. Previously, it was only possible to use columns resulting from `SELECT`. +- An index of `MergeTree` tables is used when `IN` is applied to a tuple of expressions from the columns of the primary key. Example: `WHERE (UserID, EventDate) IN ((123, '2000-01-01'), ...)` (Anastasiya Tsarkova). +- Added the `clickhouse-copier` tool for copying between clusters and resharding data (beta). +- Added consistent hashing functions: `yandexConsistentHash`, `jumpConsistentHash`, `sumburConsistentHash`. They can be used as a sharding key in order to reduce the amount of network traffic during subsequent reshardings. +- Added functions: `arrayAny`, `arrayAll`, `hasAny`, `hasAll`, `arrayIntersect`, `arrayResize`. +- Added the `arrayCumSum` function (Javi Santana). +- Added the `parseDateTimeBestEffort`, `parseDateTimeBestEffortOrZero`, and `parseDateTimeBestEffortOrNull` functions to read the DateTime from a string containing text in a wide variety of possible formats. +- Data can be partially reloaded from external dictionaries during updating (load just the records in which the value of the specified field greater than in the previous download) (Arsen Hakobyan). +- Added the `cluster` table function. Example: `cluster(cluster_name, db, table)`. The `remote` table function can accept the cluster name as the first argument, if it is specified as an identifier. +- The `remote` and `cluster` table functions can be used in `INSERT` queries. +- Added the `create_table_query` and `engine_full` virtual columns to the `system.tables`table . The `metadata_modification_time` column is virtual. +- Added the `data_path` and `metadata_path` columns to `system.tables`and`system.databases` tables, and added the `path` column to the `system.parts` and `system.parts_columns` tables. +- Added additional information about merges in the `system.part_log` table. +- An arbitrary partitioning key can be used for the `system.query_log` table (Kirill Shvakov). +- The `SHOW TABLES` query now also shows temporary tables. Added temporary tables and the `is_temporary` column to `system.tables` (zhang2014). +- Added `DROP TEMPORARY TABLE` and `EXISTS TEMPORARY TABLE` queries (zhang2014). +- Support for `SHOW CREATE TABLE` for temporary tables (zhang2014). +- Added the `system_profile` configuration parameter for the settings used by internal processes. +- Support for loading `object_id` as an attribute in `MongoDB` dictionaries (Pavel Litvinenko). +- Reading `null` as the default value when loading data for an external dictionary with the `MongoDB` source (Pavel Litvinenko). +- Reading `DateTime` values in the `Values` format from a Unix timestamp without single quotes. +- Failover is supported in `remote` table functions for cases when some of the replicas are missing the requested table. +- Configuration settings can be overridden in the command line when you run `clickhouse-server`. Example: `clickhouse-server -- --logger.level=information`. +- Implemented the `empty` function from a `FixedString` argument: the function returns 1 if the string consists entirely of null bytes (zhang2014). +- Added the `listen_try`configuration parameter for listening to at least one of the listen addresses without quitting, if some of the addresses can’t be listened to (useful for systems with disabled support for IPv4 or IPv6). +- Added the `VersionedCollapsingMergeTree` table engine. +- Support for rows and arbitrary numeric types for the `library` dictionary source. +- `MergeTree` tables can be used without a primary key (you need to specify `ORDER BY tuple()`). +- A `Nullable` type can be `CAST` to a non-`Nullable` type if the argument is not `NULL`. +- `RENAME TABLE` can be performed for `VIEW`. +- Added the `throwIf` function. +- Added the `odbc_default_field_size` option, which allows you to extend the maximum size of the value loaded from an ODBC source (by default, it is 1024). +- The `system.processes` table and `SHOW PROCESSLIST` now have the `is_cancelled` and `peak_memory_usage` columns. + +#### Improvements: {#improvements-15} + +- Limits and quotas on the result are no longer applied to intermediate data for `INSERT SELECT` queries or for `SELECT` subqueries. +- Fewer false triggers of `force_restore_data` when checking the status of `Replicated` tables when the server starts. +- Added the `allow_distributed_ddl` option. +- Nondeterministic functions are not allowed in expressions for `MergeTree` table keys. +- Files with substitutions from `config.d` directories are loaded in alphabetical order. +- Improved performance of the `arrayElement` function in the case of a constant multidimensional array with an empty array as one of the elements. Example: `[[1], []][x]`. +- The server starts faster now when using configuration files with very large substitutions (for instance, very large lists of IP networks). +- When running a query, table valued functions run once. Previously, `remote` and `mysql` table valued functions performed the same query twice to retrieve the table structure from a remote server. +- The `MkDocs` documentation generator is used. +- When you try to delete a table column that `DEFAULT`/`MATERIALIZED` expressions of other columns depend on, an exception is thrown (zhang2014). +- Added the ability to parse an empty line in text formats as the number 0 for `Float` data types. This feature was previously available but was lost in release 1.1.54342. +- `Enum` values can be used in `min`, `max`, `sum` and some other functions. In these cases, it uses the corresponding numeric values. This feature was previously available but was lost in the release 1.1.54337. +- Added `max_expanded_ast_elements` to restrict the size of the AST after recursively expanding aliases. + +#### Bug Fixes: {#bug-fixes-27} + +- Fixed cases when unnecessary columns were removed from subqueries in error, or not removed from subqueries containing `UNION ALL`. +- Fixed a bug in merges for `ReplacingMergeTree` tables. +- Fixed synchronous insertions in `Distributed` tables (`insert_distributed_sync = 1`). +- Fixed segfault for certain uses of `FULL` and `RIGHT JOIN` with duplicate columns in subqueries. +- Fixed segfault for certain uses of `replace_running_query` and `KILL QUERY`. +- Fixed the order of the `source` and `last_exception` columns in the `system.dictionaries` table. +- Fixed a bug when the `DROP DATABASE` query did not delete the file with metadata. +- Fixed the `DROP DATABASE` query for `Dictionary` databases. +- Fixed the low precision of `uniqHLL12` and `uniqCombined` functions for cardinalities greater than 100 million items (Alex Bocharov). +- Fixed the calculation of implicit default values when necessary to simultaneously calculate default explicit expressions in `INSERT` queries (zhang2014). +- Fixed a rare case when a query to a `MergeTree` table couldn’t finish (chenxing-xc). +- Fixed a crash that occurred when running a `CHECK` query for `Distributed` tables if all shards are local (chenxing.xc). +- Fixed a slight performance regression with functions that use regular expressions. +- Fixed a performance regression when creating multidimensional arrays from complex expressions. +- Fixed a bug that could cause an extra `FORMAT` section to appear in an `.sql` file with metadata. +- Fixed a bug that caused the `max_table_size_to_drop` limit to apply when trying to delete a `MATERIALIZED VIEW` looking at an explicitly specified table. +- Fixed incompatibility with old clients (old clients were sometimes sent data with the `DateTime('timezone')` type, which they do not understand). +- Fixed a bug when reading `Nested` column elements of structures that were added using `ALTER` but that are empty for the old partitions, when the conditions for these columns moved to `PREWHERE`. +- Fixed a bug when filtering tables by virtual `_table` columns in queries to `Merge` tables. +- Fixed a bug when using `ALIAS` columns in `Distributed` tables. +- Fixed a bug that made dynamic compilation impossible for queries with aggregate functions from the `quantile` family. +- Fixed a race condition in the query execution pipeline that occurred in very rare cases when using `Merge` tables with a large number of tables, and when using `GLOBAL` subqueries. +- Fixed a crash when passing arrays of different sizes to an `arrayReduce` function when using aggregate functions from multiple arguments. +- Prohibited the use of queries with `UNION ALL` in a `MATERIALIZED VIEW`. +- Fixed an error during initialization of the `part_log` system table when the server starts (by default, `part_log` is disabled). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-10} + +- Removed the `distributed_ddl_allow_replicated_alter` option. This behavior is enabled by default. +- Removed the `strict_insert_defaults` setting. If you were using this functionality, write to `feedback@clickhouse.com`. +- Removed the `UnsortedMergeTree` engine. + +### ClickHouse Release 1.1.54343, 2018-02-05 {#clickhouse-release-1-1-54343-2018-02-05} + +- Added macros support for defining cluster names in distributed DDL queries and constructors of Distributed tables: `CREATE TABLE distr ON CLUSTER '{cluster}' (...) ENGINE = Distributed('{cluster}', 'db', 'table')`. +- Now queries like `SELECT ... FROM table WHERE expr IN (subquery)` are processed using the `table` index. +- Improved processing of duplicates when inserting to Replicated tables, so they no longer slow down execution of the replication queue. + +### ClickHouse Release 1.1.54342, 2018-01-22 {#clickhouse-release-1-1-54342-2018-01-22} + +This release contains bug fixes for the previous release 1.1.54337: + +- Fixed a regression in 1.1.54337: if the default user has readonly access, then the server refuses to start up with the message `Cannot create database in readonly mode`. +- Fixed a regression in 1.1.54337: on systems with systemd, logs are always written to syslog regardless of the configuration; the watchdog script still uses init.d. +- Fixed a regression in 1.1.54337: wrong default configuration in the Docker image. +- Fixed nondeterministic behavior of GraphiteMergeTree (you can see it in log messages `Data after merge is not byte-identical to the data on another replicas`). +- Fixed a bug that may lead to inconsistent merges after OPTIMIZE query to Replicated tables (you may see it in log messages `Part ... intersects the previous part`). +- Buffer tables now work correctly when MATERIALIZED columns are present in the destination table (by zhang2014). +- Fixed a bug in implementation of NULL. + +### ClickHouse Release 1.1.54337, 2018-01-18 {#clickhouse-release-1-1-54337-2018-01-18} + +#### New Features: {#new-features-17} + +- Added support for storage of multi-dimensional arrays and tuples (`Tuple` data type) in tables. +- Support for table functions for `DESCRIBE` and `INSERT` queries. Added support for subqueries in `DESCRIBE`. Examples: `DESC TABLE remote('host', default.hits)`; `DESC TABLE (SELECT 1)`; `INSERT INTO TABLE FUNCTION remote('host', default.hits)`. Support for `INSERT INTO TABLE` in addition to `INSERT INTO`. +- Improved support for time zones. The `DateTime` data type can be annotated with the timezone that is used for parsing and formatting in text formats. Example: `DateTime('Asia/Istanbul')`. When timezones are specified in functions for `DateTime` arguments, the return type will track the timezone, and the value will be displayed as expected. +- Added the functions `toTimeZone`, `timeDiff`, `toQuarter`, `toRelativeQuarterNum`. The `toRelativeHour`/`Minute`/`Second` functions can take a value of type `Date` as an argument. The `now` function name is case-sensitive. +- Added the `toStartOfFifteenMinutes` function (Kirill Shvakov). +- Added the `clickhouse format` tool for formatting queries. +- Added the `format_schema_path` configuration parameter (Marek Vavruşa). It is used for specifying a schema in `Cap'n Proto` format. Schema files can be located only in the specified directory. +- Added support for config substitutions (`incl` and `conf.d`) for configuration of external dictionaries and models (Pavel Yakunin). +- Added a column with documentation for the `system.settings` table (Kirill Shvakov). +- Added the `system.parts_columns` table with information about column sizes in each data part of `MergeTree` tables. +- Added the `system.models` table with information about loaded `CatBoost` machine learning models. +- Added the `mysql` and `odbc` table function and corresponding `MySQL` and `ODBC` table engines for accessing remote databases. This functionality is in the beta stage. +- Added the possibility to pass an argument of type `AggregateFunction` for the `groupArray` aggregate function (so you can create an array of states of some aggregate function). +- Removed restrictions on various combinations of aggregate function combinators. For example, you can use `avgForEachIf` as well as `avgIfForEach` aggregate functions, which have different behaviors. +- The `-ForEach` aggregate function combinator is extended for the case of aggregate functions of multiple arguments. +- Added support for aggregate functions of `Nullable` arguments even for cases when the function returns a non-`Nullable` result (added with the contribution of Silviu Caragea). Example: `groupArray`, `groupUniqArray`, `topK`. +- Added the `max_client_network_bandwidth` for `clickhouse-client` (Kirill Shvakov). +- Users with the `readonly = 2` setting are allowed to work with TEMPORARY tables (CREATE, DROP, INSERT…) (Kirill Shvakov). +- Added support for using multiple consumers with the `Kafka` engine. Extended configuration options for `Kafka` (Marek Vavruša). +- Added the `intExp3` and `intExp4` functions. +- Added the `sumKahan` aggregate function. +- Added the to \* Number\* OrNull functions, where \* Number\* is a numeric type. +- Added support for `WITH` clauses for an `INSERT SELECT` query (author: zhang2014). +- Added settings: `http_connection_timeout`, `http_send_timeout`, `http_receive_timeout`. In particular, these settings are used for downloading data parts for replication. Changing these settings allows for faster failover if the network is overloaded. +- Added support for `ALTER` for tables of type `Null` (Anastasiya Tsarkova). +- The `reinterpretAsString` function is extended for all data types that are stored contiguously in memory. +- Added the `--silent` option for the `clickhouse-local` tool. It suppresses printing query execution info in stderr. +- Added support for reading values of type `Date` from text in a format where the month and/or day of the month is specified using a single digit instead of two digits (Amos Bird). + +#### Performance Optimizations: {#performance-optimizations} + +- Improved performance of aggregate functions `min`, `max`, `any`, `anyLast`, `anyHeavy`, `argMin`, `argMax` from string arguments. +- Improved performance of the functions `isInfinite`, `isFinite`, `isNaN`, `roundToExp2`. +- Improved performance of parsing and formatting `Date` and `DateTime` type values in text format. +- Improved performance and precision of parsing floating point numbers. +- Lowered memory usage for `JOIN` in the case when the left and right parts have columns with identical names that are not contained in `USING` . +- Improved performance of aggregate functions `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr` by reducing computational stability. The old functions are available under the names `varSampStable`, `varPopStable`, `stddevSampStable`, `stddevPopStable`, `covarSampStable`, `covarPopStable`, `corrStable`. + +#### Bug Fixes: {#bug-fixes-28} + +- Fixed data deduplication after running a `DROP` or `DETACH PARTITION` query. In the previous version, dropping a partition and inserting the same data again was not working because inserted blocks were considered duplicates. +- Fixed a bug that could lead to incorrect interpretation of the `WHERE` clause for `CREATE MATERIALIZED VIEW` queries with `POPULATE` . +- Fixed a bug in using the `root_path` parameter in the `zookeeper_servers` configuration. +- Fixed unexpected results of passing the `Date` argument to `toStartOfDay` . +- Fixed the `addMonths` and `subtractMonths` functions and the arithmetic for `INTERVAL n MONTH` in cases when the result has the previous year. +- Added missing support for the `UUID` data type for `DISTINCT` , `JOIN` , and `uniq` aggregate functions and external dictionaries (Evgeniy Ivanov). Support for `UUID` is still incomplete. +- Fixed `SummingMergeTree` behavior in cases when the rows summed to zero. +- Various fixes for the `Kafka` engine (Marek Vavruša). +- Fixed incorrect behavior of the `Join` table engine (Amos Bird). +- Fixed incorrect allocator behavior under FreeBSD and OS X. +- The `extractAll` function now supports empty matches. +- Fixed an error that blocked usage of `libressl` instead of `openssl` . +- Fixed the `CREATE TABLE AS SELECT` query from temporary tables. +- Fixed non-atomicity of updating the replication queue. This could lead to replicas being out of sync until the server restarts. +- Fixed possible overflow in `gcd` , `lcm` and `modulo` (`%` operator) (Maks Skorokhod). +- `-preprocessed` files are now created after changing `umask` (`umask` can be changed in the config). +- Fixed a bug in the background check of parts (`MergeTreePartChecker` ) when using a custom partition key. +- Fixed parsing of tuples (values of the `Tuple` data type) in text formats. +- Improved error messages about incompatible types passed to `multiIf` , `array` and some other functions. +- Redesigned support for `Nullable` types. Fixed bugs that may lead to a server crash. Fixed almost all other bugs related to `NULL` support: incorrect type conversions in INSERT SELECT, insufficient support for Nullable in HAVING and PREWHERE, `join_use_nulls` mode, Nullable types as arguments of `OR` operator, etc. +- Fixed various bugs related to internal semantics of data types. Examples: unnecessary summing of `Enum` type fields in `SummingMergeTree` ; alignment of `Enum` types in `Pretty` formats, etc. +- Stricter checks for allowed combinations of composite columns. +- Fixed the overflow when specifying a very large parameter for the `FixedString` data type. +- Fixed a bug in the `topK` aggregate function in a generic case. +- Added the missing check for equality of array sizes in arguments of n-ary variants of aggregate functions with an `-Array` combinator. +- Fixed a bug in `--pager` for `clickhouse-client` (author: ks1322). +- Fixed the precision of the `exp10` function. +- Fixed the behavior of the `visitParamExtract` function for better compliance with documentation. +- Fixed the crash when incorrect data types are specified. +- Fixed the behavior of `DISTINCT` in the case when all columns are constants. +- Fixed query formatting in the case of using the `tupleElement` function with a complex constant expression as the tuple element index. +- Fixed a bug in `Dictionary` tables for `range_hashed` dictionaries. +- Fixed a bug that leads to excessive rows in the result of `FULL` and `RIGHT JOIN` (Amos Bird). +- Fixed a server crash when creating and removing temporary files in `config.d` directories during config reload. +- Fixed the `SYSTEM DROP DNS CACHE` query: the cache was flushed but addresses of cluster nodes were not updated. +- Fixed the behavior of `MATERIALIZED VIEW` after executing `DETACH TABLE` for the table under the view (Marek Vavruša). + +#### Build Improvements: {#build-improvements-4} + +- The `pbuilder` tool is used for builds. The build process is almost completely independent of the build host environment. +- A single build is used for different OS versions. Packages and binaries have been made compatible with a wide range of Linux systems. +- Added the `clickhouse-test` package. It can be used to run functional tests. +- The source tarball can now be published to the repository. It can be used to reproduce the build without using GitHub. +- Added limited integration with Travis CI. Due to limits on build time in Travis, only the debug build is tested and a limited subset of tests are run. +- Added support for `Cap'n'Proto` in the default build. +- Changed the format of documentation sources from `Restricted Text` to `Markdown`. +- Added support for `systemd` (Vladimir Smirnov). It is disabled by default due to incompatibility with some OS images and can be enabled manually. +- For dynamic code generation, `clang` and `lld` are embedded into the `clickhouse` binary. They can also be invoked as `clickhouse clang` and `clickhouse lld` . +- Removed usage of GNU extensions from the code. Enabled the `-Wextra` option. When building with `clang` the default is `libc++` instead of `libstdc++`. +- Extracted `clickhouse_parsers` and `clickhouse_common_io` libraries to speed up builds of various tools. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-11} + +- The format for marks in `Log` type tables that contain `Nullable` columns was changed in a backward incompatible way. If you have these tables, you should convert them to the `TinyLog` type before starting up the new server version. To do this, replace `ENGINE = Log` with `ENGINE = TinyLog` in the corresponding `.sql` file in the `metadata` directory. If your table does not have `Nullable` columns or if the type of your table is not `Log`, then you do not need to do anything. +- Removed the `experimental_allow_extended_storage_definition_syntax` setting. Now this feature is enabled by default. +- The `runningIncome` function was renamed to `runningDifferenceStartingWithFirstvalue` to avoid confusion. +- Removed the `FROM ARRAY JOIN arr` syntax when ARRAY JOIN is specified directly after FROM with no table (Amos Bird). +- Removed the `BlockTabSeparated` format that was used solely for demonstration purposes. +- Changed the state format for aggregate functions `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. If you have stored states of these aggregate functions in tables (using the `AggregateFunction` data type or materialized views with corresponding states), please write to feedback@clickhouse.com. +- In previous server versions there was an undocumented feature: if an aggregate function depends on parameters, you can still specify it without parameters in the AggregateFunction data type. Example: `AggregateFunction(quantiles, UInt64)` instead of `AggregateFunction(quantiles(0.5, 0.9), UInt64)`. This feature was lost. Although it was undocumented, we plan to support it again in future releases. +- Enum data types cannot be used in min/max aggregate functions. This ability will be returned in the next release. + +#### Please Note When Upgrading: {#please-note-when-upgrading} + +- When doing a rolling update on a cluster, at the point when some of the replicas are running the old version of ClickHouse and some are running the new version, replication is temporarily stopped and the message `unknown parameter 'shard'` appears in the log. Replication will continue after all replicas of the cluster are updated. +- If different versions of ClickHouse are running on the cluster servers, it is possible that distributed queries using the following functions will have incorrect results: `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. You should update all cluster nodes. + +## [Changelog for 2017](./2017.md) diff --git a/docs/ja/whats-new/changelog/2019.md b/docs/ja/whats-new/changelog/2019.md new file mode 100644 index 00000000000..cd4a2f45ff6 --- /dev/null +++ b/docs/ja/whats-new/changelog/2019.md @@ -0,0 +1,2074 @@ +--- +slug: /ja/whats-new/changelog/2019 +sidebar_position: 15 +sidebar_label: '2019' +title: 2019 Changelog +--- + +## ClickHouse Release 19.17 {#clickhouse-release-v19-17} + +### ClickHouse Release 19.17.6.36, 2019-12-27 {#clickhouse-release-v19-17-6-36-2019-12-27} + +#### Bug Fix {#bug-fix} + +- Fixed potential buffer overflow in decompress. Malicious user can pass fabricated compressed data that could cause read after buffer. This issue was found by Eldar Zaitov from Yandex information security team. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed possible server crash (`std::terminate`) when the server cannot send or write data in JSON or XML format with values of String data type (that require UTF-8 validation) or when compressing result data with Brotli algorithm or in some other rare cases. [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed dictionaries with source from a clickhouse `VIEW`, now reading such dictionaries does not cause the error `There is no query`. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed checking if a client host is allowed by host_regexp specified in users.xml. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241), [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +- `RENAME TABLE` for a distributed table now renames the folder containing inserted data before sending to shards. This fixes an issue with successive renames `tableA->tableB`, `tableC->tableA`. [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) +- `range_hashed` external dictionaries created by DDL queries now allow ranges of arbitrary numeric types. [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +- Fixed `INSERT INTO table SELECT ... FROM mysql(...)` table function. [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) +- Fixed segfault in `INSERT INTO TABLE FUNCTION file()` while inserting into a file which does not exist. Now in this case file would be created and then insert would be processed. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed bitmapAnd error when intersecting an aggregated bitmap and a scalar bitmap. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +- Fixed segfault when `EXISTS` query was used without `TABLE` or `DICTIONARY` qualifier, just like `EXISTS t`. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed return type for functions `rand` and `randConstant` in case of nullable argument. Now functions always return `UInt32` and never `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed `DROP DICTIONARY IF EXISTS db.dict`, now it does not throw exception if `db` does not exist. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +- If a table wasn’t completely dropped because of server crash, the server will try to restore and load it [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) +- Fixed a trivial count query for a distributed table if there are more than two shard local table. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +- Fixed bug that lead to a data race in DB::BlockStreamProfileInfo::calculateRowsBeforeLimit() [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed `ALTER table MOVE part` executed immediately after merging the specified part, which could cause moving a part which the specified part merged into. Now it correctly moves the specified part. [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Expressions for dictionaries can be specified as strings now. This is useful for calculation of attributes while extracting data from non-ClickHouse sources because it allows to use non-ClickHouse syntax for those expressions. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +- Fixed a very rare race in `clickhouse-copier` because of an overflow in ZXid. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +- Fixed the bug when after the query failed (due to “Too many simultaneous queries” for example) it would not read external tables info, and the + next request would interpret this info as the beginning of the next query causing an error like `Unknown packet from client`. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +- Avoid null dereference after “Unknown packet X from server” [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +- Restore support of all ICU locales, add the ability to apply collations for constant expressions and add language name to system.collations table. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +- Number of streams for read from `StorageFile` and `StorageHDFS` is now limited, to avoid exceeding the memory limit. [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +- Fixed `CHECK TABLE` query for `*MergeTree` tables without key. [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +- Removed the mutation number from a part name in case there were no mutations. This removing improved the compatibility with older versions. [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +- Fixed the bug that mutations are skipped for some attached parts due to their data_version are larger than the table mutation version. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) +- Allow starting the server with redundant copies of parts after moving them to another device. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed the error “Sizes of columns does not match” that might appear when using aggregate function columns. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +- Now an exception will be thrown in case of using WITH TIES alongside LIMIT BY. And now it’s possible to use TOP with LIMIT BY. [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix dictionary reload if it has `invalidate_query`, which stopped updates and some exception on previous update tries. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) + +### ClickHouse Release 19.17.4.11, 2019-11-22 {#clickhouse-release-v19-17-4-11-2019-11-22} + +#### Backward Incompatible Change {#backward-incompatible-change} + +- Using column instead of AST to store scalar subquery results for better performance. Setting `enable_scalar_subquery_optimization` was added in 19.17 and it was enabled by default. It leads to errors like [this](https://github.com/ClickHouse/ClickHouse/issues/7851) during upgrade to 19.17.2 or 19.17.3 from previous versions. This setting was disabled by default in 19.17.4, to make possible upgrading from 19.16 and older versions without errors. [#7392](https://github.com/ClickHouse/ClickHouse/pull/7392) ([Amos Bird](https://github.com/amosbird)) + +#### New Feature {#new-feature} + +- Add the ability to create dictionaries with DDL queries. [#7360](https://github.com/ClickHouse/ClickHouse/pull/7360) ([alesapin](https://github.com/alesapin)) +- Make `bloom_filter` type of index supporting `LowCardinality` and `Nullable` [#7363](https://github.com/ClickHouse/ClickHouse/issues/7363) [#7561](https://github.com/ClickHouse/ClickHouse/pull/7561) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Add function `isValidJSON` to check that passed string is a valid json. [#5910](https://github.com/ClickHouse/ClickHouse/issues/5910) [#7293](https://github.com/ClickHouse/ClickHouse/pull/7293) ([Vdimir](https://github.com/Vdimir)) +- Implement `arrayCompact` function [#7328](https://github.com/ClickHouse/ClickHouse/pull/7328) ([Memo](https://github.com/Joeywzr)) +- Created function `hex` for Decimal numbers. It works like `hex(reinterpretAsString())`, but does not delete last zero bytes. [#7355](https://github.com/ClickHouse/ClickHouse/pull/7355) ([Mikhail Korotov](https://github.com/millb)) +- Add `arrayFill` and `arrayReverseFill` functions, which replace elements by other elements in front/back of them in the array. [#7380](https://github.com/ClickHouse/ClickHouse/pull/7380) ([hcz](https://github.com/hczhcz)) +- Add `CRC32IEEE()`/`CRC64()` support [#7480](https://github.com/ClickHouse/ClickHouse/pull/7480) ([Azat Khuzhin](https://github.com/azat)) +- Implement `char` function similar to one in [mysql](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_char) [#7486](https://github.com/ClickHouse/ClickHouse/pull/7486) ([sundyli](https://github.com/sundy-li)) +- Add `bitmapTransform` function. It transforms an array of values in a bitmap to another array of values, the result is a new bitmap [#7598](https://github.com/ClickHouse/ClickHouse/pull/7598) ([Zhichang Yu](https://github.com/yuzhichang)) +- Implemented `javaHashUTF16LE()` function [#7651](https://github.com/ClickHouse/ClickHouse/pull/7651) ([achimbab](https://github.com/achimbab)) +- Add `_shard_num` virtual column for the Distributed engine [#7624](https://github.com/ClickHouse/ClickHouse/pull/7624) ([Azat Khuzhin](https://github.com/azat)) + +#### Experimental Feature {#experimental-feature} + +- Support for processors (new query execution pipeline) in `MergeTree`. [#7181](https://github.com/ClickHouse/ClickHouse/pull/7181) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Bug Fix {#bug-fix-1} + +- Fix incorrect float parsing in `Values` [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817) [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) +- Fix rare deadlock which can happen when trace_log is enabled. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +- Prevent message duplication when producing Kafka table has any MVs selecting from it [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Support for `Array(LowCardinality(Nullable(String)))` in `IN`. Resolves [#7364](https://github.com/ClickHouse/ClickHouse/issues/7364) [#7366](https://github.com/ClickHouse/ClickHouse/pull/7366) ([achimbab](https://github.com/achimbab)) +- Add handling of `SQL_TINYINT` and `SQL_BIGINT`, and fix handling of `SQL_FLOAT` data source types in ODBC Bridge. [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Fix aggregation (`avg` and quantiles) over empty decimal columns [#7431](https://github.com/ClickHouse/ClickHouse/pull/7431) ([Andrey Konyaev](https://github.com/akonyaev90)) +- Fix `INSERT` into Distributed with `MATERIALIZED` columns [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Make `MOVE PARTITION` work if some parts of partition are already on destination disk or volume [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed bug with hardlinks failing to be created during mutations in `ReplicatedMergeTree` in multi-disk configurations. [#7558](https://github.com/ClickHouse/ClickHouse/pull/7558) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed a bug with a mutation on a MergeTree when whole part remains unchanged and best space is being found on another disk [#7602](https://github.com/ClickHouse/ClickHouse/pull/7602) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed bug with `keep_free_space_ratio` not being read from disks configuration [#7645](https://github.com/ClickHouse/ClickHouse/pull/7645) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix bug with table contains only `Tuple` columns or columns with complex paths. Fixes [7541](https://github.com/ClickHouse/ClickHouse/issues/7541). [#7545](https://github.com/ClickHouse/ClickHouse/pull/7545) ([alesapin](https://github.com/alesapin)) +- Do not account memory for Buffer engine in max_memory_usage limit [#7552](https://github.com/ClickHouse/ClickHouse/pull/7552) ([Azat Khuzhin](https://github.com/azat)) +- Fix final mark usage in `MergeTree` tables ordered by `tuple()`. In rare cases it could lead to `Can't adjust last granule` error while select. [#7639](https://github.com/ClickHouse/ClickHouse/pull/7639) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug in mutations that have predicate with actions that require context (for example functions for json), which may lead to crashes or strange exceptions. [#7664](https://github.com/ClickHouse/ClickHouse/pull/7664) ([alesapin](https://github.com/alesapin)) +- Fix mismatch of database and table names escaping in `data/` and `shadow/` directories [#7575](https://github.com/ClickHouse/ClickHouse/pull/7575) ([Alexander Burmak](https://github.com/Alex-Burmak)) +- Support duplicated keys in RIGHT\|FULL JOINs, e.g. `ON t.x = u.x AND t.x = u.y`. Fix crash in this case. [#7586](https://github.com/ClickHouse/ClickHouse/pull/7586) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix `Not found column in block` when joining on expression with RIGHT or FULL JOIN. [#7641](https://github.com/ClickHouse/ClickHouse/pull/7641) ([Artem Zuikov](https://github.com/4ertus2)) +- One more attempt to fix infinite loop in `PrettySpace` format [#7591](https://github.com/ClickHouse/ClickHouse/pull/7591) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fix bug in `concat` function when all arguments were `FixedString` of the same size. [#7635](https://github.com/ClickHouse/ClickHouse/pull/7635) ([alesapin](https://github.com/alesapin)) +- Fixed exception in case of using 1 argument while defining S3, URL and HDFS storages. [#7618](https://github.com/ClickHouse/ClickHouse/pull/7618) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix scope of the InterpreterSelectQuery for views with query [#7601](https://github.com/ClickHouse/ClickHouse/pull/7601) ([Azat Khuzhin](https://github.com/azat)) + +#### Improvement {#improvement} + +- `Nullable` columns recognized and NULL-values handled correctly by ODBC-bridge [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Write current batch for distributed send atomically [#7600](https://github.com/ClickHouse/ClickHouse/pull/7600) ([Azat Khuzhin](https://github.com/azat)) +- Throw an exception if we cannot detect table for column name in query. [#7358](https://github.com/ClickHouse/ClickHouse/pull/7358) ([Artem Zuikov](https://github.com/4ertus2)) +- Add `merge_max_block_size` setting to `MergeTreeSettings` [#7412](https://github.com/ClickHouse/ClickHouse/pull/7412) ([Artem Zuikov](https://github.com/4ertus2)) +- Queries with `HAVING` and without `GROUP BY` assume group by constant. So, `SELECT 1 HAVING 1` now returns a result. [#7496](https://github.com/ClickHouse/ClickHouse/pull/7496) ([Amos Bird](https://github.com/amosbird)) +- Support parsing `(X,)` as tuple similar to python. [#7501](https://github.com/ClickHouse/ClickHouse/pull/7501), [#7562](https://github.com/ClickHouse/ClickHouse/pull/7562) ([Amos Bird](https://github.com/amosbird)) +- Make `range` function behaviors almost like pythonic one. [#7518](https://github.com/ClickHouse/ClickHouse/pull/7518) ([sundyli](https://github.com/sundy-li)) +- Add `constraints` columns to table `system.settings` [#7553](https://github.com/ClickHouse/ClickHouse/pull/7553) ([Vitaly Baranov](https://github.com/vitlibar)) +- Better Null format for tcp handler, so that it’s possible to use `select ignore() from table format Null` for perf measure via clickhouse-client [#7606](https://github.com/ClickHouse/ClickHouse/pull/7606) ([Amos Bird](https://github.com/amosbird)) +- Queries like `CREATE TABLE ... AS (SELECT (1, 2))` are parsed correctly [#7542](https://github.com/ClickHouse/ClickHouse/pull/7542) ([hcz](https://github.com/hczhcz)) + +#### Performance Improvement {#performance-improvement} + +- The performance of aggregation over short string keys is improved. [#6243](https://github.com/ClickHouse/ClickHouse/pull/6243) ([Alexander Kuzmenkov](https://github.com/akuzm), [Amos Bird](https://github.com/amosbird)) +- Run another pass of syntax/expression analysis to get potential optimizations after constant predicates are folded. [#7497](https://github.com/ClickHouse/ClickHouse/pull/7497) ([Amos Bird](https://github.com/amosbird)) +- Use storage meta info to evaluate trivial `SELECT count() FROM table;` [#7510](https://github.com/ClickHouse/ClickHouse/pull/7510) ([Amos Bird](https://github.com/amosbird), [alexey-milovidov](https://github.com/alexey-milovidov)) +- Vectorize processing `arrayReduce` similar to Aggregator `addBatch`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) +- Minor improvements in performance of `Kafka` consumption [#7475](https://github.com/ClickHouse/ClickHouse/pull/7475) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement} + +- Add support for cross-compiling to the CPU architecture AARCH64. Refactor packager script. [#7370](https://github.com/ClickHouse/ClickHouse/pull/7370) [#7539](https://github.com/ClickHouse/ClickHouse/pull/7539) ([Ivan](https://github.com/abyss7)) +- Unpack darwin-x86_64 and linux-aarch64 toolchains into mounted Docker volume when building packages [#7534](https://github.com/ClickHouse/ClickHouse/pull/7534) ([Ivan](https://github.com/abyss7)) +- Update Docker Image for Binary Packager [#7474](https://github.com/ClickHouse/ClickHouse/pull/7474) ([Ivan](https://github.com/abyss7)) +- Fixed compile errors on macOS Catalina [#7585](https://github.com/ClickHouse/ClickHouse/pull/7585) ([Ernest Poletaev](https://github.com/ernestp)) +- Some refactoring in query analysis logic: split complex class into several simple ones. [#7454](https://github.com/ClickHouse/ClickHouse/pull/7454) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix build without submodules [#7295](https://github.com/ClickHouse/ClickHouse/pull/7295) ([proller](https://github.com/proller)) +- Better `add_globs` in CMake files [#7418](https://github.com/ClickHouse/ClickHouse/pull/7418) ([Amos Bird](https://github.com/amosbird)) +- Remove hardcoded paths in `unwind` target [#7460](https://github.com/ClickHouse/ClickHouse/pull/7460) ([Konstantin Podshumok](https://github.com/podshumok)) +- Allow to use mysql format without ssl [#7524](https://github.com/ClickHouse/ClickHouse/pull/7524) ([proller](https://github.com/proller)) + +#### Other {#other} + +- Added ANTLR4 grammar for ClickHouse SQL dialect [#7595](https://github.com/ClickHouse/ClickHouse/issues/7595) [#7596](https://github.com/ClickHouse/ClickHouse/pull/7596) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.16 {#clickhouse-release-v19-16} + +#### ClickHouse Release 19.16.14.65, 2020-03-25 {#clickhouse-release-v19-16-14-65-2020-03-25} + +- Fixed up a bug in batched calculations of ternary logical OPs on multiple arguments (more than 10). [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) This bugfix was backported to version 19.16 by a special request from Altinity. + +#### ClickHouse Release 19.16.14.65, 2020-03-05 {#clickhouse-release-v19-16-14-65-2020-03-05} + +- Fix distributed subqueries incompatibility with older CH versions. Fixes [#7851](https://github.com/ClickHouse/ClickHouse/issues/7851) + [(tabplubix)](https://github.com/tavplubix) +- When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). Also fix check for local address in `ClickHouseDictionarySource`. + [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +- Now background merges in `*MergeTree` table engines family preserve storage policy volume order more accurately. + [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Related: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) + [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +- Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. Fixes [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). + [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) +- Allow using `MaterializedView` with subqueries above `Kafka` tables. + [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) + +#### New Feature {#new-feature-1} + +- Add `deduplicate_blocks_in_dependent_materialized_views` option to control the behaviour of idempotent inserts into tables with materialized views. This new feature was added to the bugfix release by a special request from Altinity. + [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### ClickHouse Release 19.16.2.2, 2019-10-30 {#clickhouse-release-v19-16-2-2-2019-10-30} + +#### Backward Incompatible Change {#backward-incompatible-change-1} + +- Add missing arity validation for count/counIf. + [#7095](https://github.com/ClickHouse/ClickHouse/issues/7095) + [#7298](https://github.com/ClickHouse/ClickHouse/pull/7298) ([Vdimir](https://github.com/Vdimir)) +- Remove legacy `asterisk_left_columns_only` setting (it was disabled by default). + [#7335](https://github.com/ClickHouse/ClickHouse/pull/7335) ([Artem + Zuikov](https://github.com/4ertus2)) +- Format strings for Template data format are now specified in files. + [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([tavplubix](https://github.com/tavplubix)) + +#### New Feature {#new-feature-2} + +- Introduce uniqCombined64() to calculate cardinality greater than UINT_MAX. + [#7213](https://github.com/ClickHouse/ClickHouse/pull/7213), + [#7222](https://github.com/ClickHouse/ClickHouse/pull/7222) ([Azat + Khuzhin](https://github.com/azat)) +- Support Bloom filter indexes on Array columns. + [#6984](https://github.com/ClickHouse/ClickHouse/pull/6984) + ([achimbab](https://github.com/achimbab)) +- Add a function `getMacro(name)` that returns String with the value of corresponding `` + from server configuration. [#7240](https://github.com/ClickHouse/ClickHouse/pull/7240) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Set two configuration options for a dictionary based on an HTTP source: `credentials` and + `http-headers`. [#7092](https://github.com/ClickHouse/ClickHouse/pull/7092) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- Add a new ProfileEvent `Merge` that counts the number of launched background merges. + [#7093](https://github.com/ClickHouse/ClickHouse/pull/7093) ([Mikhail + Korotov](https://github.com/millb)) +- Add fullHostName function that returns a fully qualified domain name. + [#7263](https://github.com/ClickHouse/ClickHouse/issues/7263) + [#7291](https://github.com/ClickHouse/ClickHouse/pull/7291) ([sundyli](https://github.com/sundy-li)) +- Add function `arraySplit` and `arrayReverseSplit` which split an array by “cut off” + conditions. They are useful in time sequence handling. + [#7294](https://github.com/ClickHouse/ClickHouse/pull/7294) ([hcz](https://github.com/hczhcz)) +- Add new functions that return the Array of all matched indices in multiMatch family of functions. + [#7299](https://github.com/ClickHouse/ClickHouse/pull/7299) ([Danila + Kutenin](https://github.com/danlark1)) +- Add a new database engine `Lazy` that is optimized for storing a large number of small -Log + tables. [#7171](https://github.com/ClickHouse/ClickHouse/pull/7171) ([Nikita + Vasilev](https://github.com/nikvas0)) +- Add aggregate functions groupBitmapAnd, -Or, -Xor for bitmap columns. [#7109](https://github.com/ClickHouse/ClickHouse/pull/7109) ([Zhichang + Yu](https://github.com/yuzhichang)) +- Add aggregate function combinators -OrNull and -OrDefault, which return null + or default values when there is nothing to aggregate. + [#7331](https://github.com/ClickHouse/ClickHouse/pull/7331) + ([hcz](https://github.com/hczhcz)) +- Introduce CustomSeparated data format that supports custom escaping and + delimiter rules. [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([tavplubix](https://github.com/tavplubix)) +- Support Redis as source of external dictionary. [#4361](https://github.com/ClickHouse/ClickHouse/pull/4361) [#6962](https://github.com/ClickHouse/ClickHouse/pull/6962) ([comunodi](https://github.com/comunodi), [Anton + Popov](https://github.com/CurtizJ)) + +#### Bug Fix {#bug-fix-2} + +- Fix wrong query result if it has `WHERE IN (SELECT ...)` section and `optimize_read_in_order` is + used. [#7371](https://github.com/ClickHouse/ClickHouse/pull/7371) ([Anton + Popov](https://github.com/CurtizJ)) +- Disabled MariaDB authentication plugin, which depends on files outside of project. + [#7140](https://github.com/ClickHouse/ClickHouse/pull/7140) ([Yuriy + Baranov](https://github.com/yurriy)) +- Fix exception `Cannot convert column ... because it is constant but values of constants are different in source and result` which could rarely happen when functions `now()`, `today()`, + `yesterday()`, `randConstant()` are used. + [#7156](https://github.com/ClickHouse/ClickHouse/pull/7156) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Fixed issue of using HTTP keep alive timeout instead of TCP keep alive timeout. + [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily + Nemkov](https://github.com/Enmk)) +- Fixed a segmentation fault in groupBitmapOr (issue [#7109](https://github.com/ClickHouse/ClickHouse/issues/7109)). + [#7289](https://github.com/ClickHouse/ClickHouse/pull/7289) ([Zhichang + Yu](https://github.com/yuzhichang)) +- For materialized views the commit for Kafka is called after all data were written. + [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Fixed wrong `duration_ms` value in `system.part_log` table. It was ten times off. + [#7172](https://github.com/ClickHouse/ClickHouse/pull/7172) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- A quick fix to resolve crash in LIVE VIEW table and re-enabling all LIVE VIEW tests. + [#7201](https://github.com/ClickHouse/ClickHouse/pull/7201) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Serialize NULL values correctly in min/max indexes of MergeTree parts. + [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Don’t put virtual columns to .sql metadata when table is created as `CREATE TABLE AS`. + [#7183](https://github.com/ClickHouse/ClickHouse/pull/7183) ([Ivan](https://github.com/abyss7)) +- Fix segmentation fault in `ATTACH PART` query. + [#7185](https://github.com/ClickHouse/ClickHouse/pull/7185) + ([alesapin](https://github.com/alesapin)) +- Fix wrong result for some queries given by the optimization of empty IN subqueries and empty + INNER/RIGHT JOIN. [#7284](https://github.com/ClickHouse/ClickHouse/pull/7284) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Fixing AddressSanitizer error in the LIVE VIEW getHeader() method. + [#7271](https://github.com/ClickHouse/ClickHouse/pull/7271) + ([vzakaznikov](https://github.com/vzakaznikov)) + +#### Improvement {#improvement-1} + +- Add a message in case of queue_wait_max_ms wait takes place. + [#7390](https://github.com/ClickHouse/ClickHouse/pull/7390) ([Azat + Khuzhin](https://github.com/azat)) +- Made setting `s3_min_upload_part_size` table-level. + [#7059](https://github.com/ClickHouse/ClickHouse/pull/7059) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Check TTL in StorageFactory. [#7304](https://github.com/ClickHouse/ClickHouse/pull/7304) + ([sundyli](https://github.com/sundy-li)) +- Squash left-hand blocks in partial merge join (optimization). + [#7122](https://github.com/ClickHouse/ClickHouse/pull/7122) ([Artem + Zuikov](https://github.com/4ertus2)) +- Do not allow non-deterministic functions in mutations of Replicated table engines, because this + can introduce inconsistencies between replicas. + [#7247](https://github.com/ClickHouse/ClickHouse/pull/7247) ([Alexander + Kazakov](https://github.com/Akazz)) +- Disable memory tracker while converting exception stack trace to string. It can prevent the loss + of error messages of type `Memory limit exceeded` on server, which caused the `Attempt to read after eof` exception on client. [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) + ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Miscellaneous format improvements. Resolves + [#6033](https://github.com/ClickHouse/ClickHouse/issues/6033), + [#2633](https://github.com/ClickHouse/ClickHouse/issues/2633), + [#6611](https://github.com/ClickHouse/ClickHouse/issues/6611), + [#6742](https://github.com/ClickHouse/ClickHouse/issues/6742) + [#7215](https://github.com/ClickHouse/ClickHouse/pull/7215) + ([tavplubix](https://github.com/tavplubix)) +- ClickHouse ignores values on the right side of IN operator that are not convertible to the left + side type. Make it work properly for compound types – Array and Tuple. + [#7283](https://github.com/ClickHouse/ClickHouse/pull/7283) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Support missing inequalities for ASOF JOIN. It’s possible to join less-or-equal variant and strict + greater and less variants for ASOF column in ON syntax. + [#7282](https://github.com/ClickHouse/ClickHouse/pull/7282) ([Artem + Zuikov](https://github.com/4ertus2)) +- Optimize partial merge join. [#7070](https://github.com/ClickHouse/ClickHouse/pull/7070) + ([Artem Zuikov](https://github.com/4ertus2)) +- Do not use more than 98K of memory in uniqCombined functions. + [#7236](https://github.com/ClickHouse/ClickHouse/pull/7236), + [#7270](https://github.com/ClickHouse/ClickHouse/pull/7270) ([Azat + Khuzhin](https://github.com/azat)) +- Flush parts of right-hand joining table on disk in PartialMergeJoin (if there is not enough + memory). Load data back when needed. [#7186](https://github.com/ClickHouse/ClickHouse/pull/7186) + ([Artem Zuikov](https://github.com/4ertus2)) + +#### Performance Improvement {#performance-improvement-1} + +- Speed up joinGet with const arguments by avoiding data duplication. + [#7359](https://github.com/ClickHouse/ClickHouse/pull/7359) ([Amos + Bird](https://github.com/amosbird)) +- Return early if the subquery is empty. + [#7007](https://github.com/ClickHouse/ClickHouse/pull/7007) ([小路](https://github.com/nicelulu)) +- Optimize parsing of SQL expression in Values. + [#6781](https://github.com/ClickHouse/ClickHouse/pull/6781) + ([tavplubix](https://github.com/tavplubix)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-1} + +- Disable some contribs for cross-compilation to Mac OS. + [#7101](https://github.com/ClickHouse/ClickHouse/pull/7101) ([Ivan](https://github.com/abyss7)) +- Add missing linking with PocoXML for clickhouse_common_io. + [#7200](https://github.com/ClickHouse/ClickHouse/pull/7200) ([Azat + Khuzhin](https://github.com/azat)) +- Accept multiple test filter arguments in clickhouse-test. + [#7226](https://github.com/ClickHouse/ClickHouse/pull/7226) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Enable musl and jemalloc for ARM. [#7300](https://github.com/ClickHouse/ClickHouse/pull/7300) + ([Amos Bird](https://github.com/amosbird)) +- Added `--client-option` parameter to `clickhouse-test` to pass additional parameters to client. + [#7277](https://github.com/ClickHouse/ClickHouse/pull/7277) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Preserve existing configs on rpm package upgrade. + [#7103](https://github.com/ClickHouse/ClickHouse/pull/7103) + ([filimonov](https://github.com/filimonov)) +- Fix errors detected by PVS. [#7153](https://github.com/ClickHouse/ClickHouse/pull/7153) ([Artem + Zuikov](https://github.com/4ertus2)) +- Fix build for Darwin. [#7149](https://github.com/ClickHouse/ClickHouse/pull/7149) + ([Ivan](https://github.com/abyss7)) +- glibc 2.29 compatibility. [#7142](https://github.com/ClickHouse/ClickHouse/pull/7142) ([Amos + Bird](https://github.com/amosbird)) +- Make sure dh_clean does not touch potential source files. + [#7205](https://github.com/ClickHouse/ClickHouse/pull/7205) ([Amos + Bird](https://github.com/amosbird)) +- Attempt to avoid conflict when updating from altinity rpm - it has config file packaged separately + in clickhouse-server-common. [#7073](https://github.com/ClickHouse/ClickHouse/pull/7073) + ([filimonov](https://github.com/filimonov)) +- Optimize some header files for faster rebuilds. + [#7212](https://github.com/ClickHouse/ClickHouse/pull/7212), + [#7231](https://github.com/ClickHouse/ClickHouse/pull/7231) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Add performance tests for Date and DateTime. [#7332](https://github.com/ClickHouse/ClickHouse/pull/7332) ([Vasily + Nemkov](https://github.com/Enmk)) +- Fix some tests that contained non-deterministic mutations. + [#7132](https://github.com/ClickHouse/ClickHouse/pull/7132) ([Alexander + Kazakov](https://github.com/Akazz)) +- Add build with MemorySanitizer to CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) + ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Avoid use of uninitialized values in MetricsTransmitter. + [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat + Khuzhin](https://github.com/azat)) +- Fix some issues in Fields found by MemorySanitizer. + [#7135](https://github.com/ClickHouse/ClickHouse/pull/7135), + [#7179](https://github.com/ClickHouse/ClickHouse/pull/7179) ([Alexander + Kuzmenkov](https://github.com/akuzm)), [#7376](https://github.com/ClickHouse/ClickHouse/pull/7376) + ([Amos Bird](https://github.com/amosbird)) +- Fix undefined behavior in murmurhash32. [#7388](https://github.com/ClickHouse/ClickHouse/pull/7388) ([Amos + Bird](https://github.com/amosbird)) +- Fix undefined behavior in StoragesInfoStream. [#7384](https://github.com/ClickHouse/ClickHouse/pull/7384) + ([tavplubix](https://github.com/tavplubix)) +- Fixed constant expressions folding for external database engines (MySQL, ODBC, JDBC). In previous + versions it wasn’t working for multiple constant expressions and was not working at all for Date, + DateTime and UUID. This fixes [#7245](https://github.com/ClickHouse/ClickHouse/issues/7245) + [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixing ThreadSanitizer data race error in the LIVE VIEW when accessing no_users_thread variable. + [#7353](https://github.com/ClickHouse/ClickHouse/pull/7353) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Get rid of malloc symbols in libcommon + [#7134](https://github.com/ClickHouse/ClickHouse/pull/7134), + [#7065](https://github.com/ClickHouse/ClickHouse/pull/7065) ([Amos + Bird](https://github.com/amosbird)) +- Add global flag ENABLE_LIBRARIES for disabling all libraries. + [#7063](https://github.com/ClickHouse/ClickHouse/pull/7063) + ([proller](https://github.com/proller)) + +#### Code Cleanup {#code-cleanup} + +- Generalize configuration repository to prepare for DDL for Dictionaries. [#7155](https://github.com/ClickHouse/ClickHouse/pull/7155) + ([alesapin](https://github.com/alesapin)) +- Parser for dictionaries DDL without any semantic. + [#7209](https://github.com/ClickHouse/ClickHouse/pull/7209) + ([alesapin](https://github.com/alesapin)) +- Split ParserCreateQuery into different smaller parsers. + [#7253](https://github.com/ClickHouse/ClickHouse/pull/7253) + ([alesapin](https://github.com/alesapin)) +- Small refactoring and renaming near external dictionaries. + [#7111](https://github.com/ClickHouse/ClickHouse/pull/7111) + ([alesapin](https://github.com/alesapin)) +- Refactor some code to prepare for role-based access control. [#7235](https://github.com/ClickHouse/ClickHouse/pull/7235) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Some improvements in DatabaseOrdinary code. + [#7086](https://github.com/ClickHouse/ClickHouse/pull/7086) ([Nikita + Vasilev](https://github.com/nikvas0)) +- Do not use iterators in find() and emplace() methods of hash tables. + [#7026](https://github.com/ClickHouse/ClickHouse/pull/7026) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Fix getMultipleValuesFromConfig in case when parameter root is not empty. [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) + ([Mikhail Korotov](https://github.com/millb)) +- Remove some copy-paste (TemporaryFile and TemporaryFileStream) + [#7166](https://github.com/ClickHouse/ClickHouse/pull/7166) ([Artem + Zuikov](https://github.com/4ertus2)) +- Improved code readability a little bit (`MergeTreeData::getActiveContainingPart`). + [#7361](https://github.com/ClickHouse/ClickHouse/pull/7361) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Wait for all scheduled jobs, which are using local objects, if `ThreadPool::schedule(...)` throws + an exception. Rename `ThreadPool::schedule(...)` to `ThreadPool::scheduleOrThrowOnError(...)` and + fix comments to make obvious that it may throw. + [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) + ([tavplubix](https://github.com/tavplubix)) + +## ClickHouse Release 19.15 {#clickhouse-release-19-15} + +### ClickHouse Release 19.15.4.10, 2019-10-31 {#clickhouse-release-19-15-4-10-2019-10-31} + +#### Bug Fix {#bug-fix-3} + +- Added handling of SQL_TINYINT and SQL_BIGINT, and fix handling of SQL_FLOAT data source types in ODBC Bridge. + [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Allowed to have some parts on destination disk or volume in MOVE PARTITION. + [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed NULL-values in nullable columns through ODBC-bridge. + [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Fixed INSERT into Distributed non local node with MATERIALIZED columns. + [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Fixed function getMultipleValuesFromConfig. + [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) ([Mikhail Korotov](https://github.com/millb)) +- Fixed issue of using HTTP keep alive timeout instead of TCP keep alive timeout. + [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily Nemkov](https://github.com/Enmk)) +- Wait for all jobs to finish on exception (fixes rare segfaults). + [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) ([tavplubix](https://github.com/tavplubix)) +- Don’t push to MVs when inserting into Kafka table. + [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Disable memory tracker for exception stack. + [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed bad code in transforming query for external database. + [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid use of uninitialized values in MetricsTransmitter. + [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat Khuzhin](https://github.com/azat)) +- Added example config with macros for tests ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.15.3.6, 2019-10-09 {#clickhouse-release-19-15-3-6-2019-10-09} + +#### Bug Fix {#bug-fix-4} + +- Fixed bad_variant in hashed dictionary. + ([alesapin](https://github.com/alesapin)) +- Fixed up bug with segmentation fault in ATTACH PART query. + ([alesapin](https://github.com/alesapin)) +- Fixed time calculation in `MergeTreeData`. + ([Vladimir Chebotarev](https://github.com/excitoon)) +- Commit to Kafka explicitly after the writing is finalized. + [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Serialize NULL values correctly in min/max indexes of MergeTree parts. + [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +### ClickHouse Release 19.15.2.2, 2019-10-01 {#clickhouse-release-19-15-2-2-2019-10-01} + +#### New Feature {#new-feature-3} + +- Tiered storage: support to use multiple storage volumes for tables with MergeTree engine. It’s possible to store fresh data on SSD and automatically move old data to HDD. ([example](https://clickhouse.github.io/clickhouse-presentations/meetup30/new_features/#12)). [#4918](https://github.com/ClickHouse/ClickHouse/pull/4918) ([Igr](https://github.com/ObjatieGroba)) [#6489](https://github.com/ClickHouse/ClickHouse/pull/6489) ([alesapin](https://github.com/alesapin)) +- Add table function `input` for reading incoming data in `INSERT SELECT` query. [#5450](https://github.com/ClickHouse/ClickHouse/pull/5450) ([palasonic1](https://github.com/palasonic1)) [#6832](https://github.com/ClickHouse/ClickHouse/pull/6832) ([Anton Popov](https://github.com/CurtizJ)) +- Add a `sparse_hashed` dictionary layout, that is functionally equivalent to the `hashed` layout, but is more memory efficient. It uses about twice as less memory at the cost of slower value retrieval. [#6894](https://github.com/ClickHouse/ClickHouse/pull/6894) ([Azat Khuzhin](https://github.com/azat)) +- Implement ability to define list of users for access to dictionaries. Only current connected database using. [#6907](https://github.com/ClickHouse/ClickHouse/pull/6907) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Add `LIMIT` option to `SHOW` query. [#6944](https://github.com/ClickHouse/ClickHouse/pull/6944) ([Philipp Malkovsky](https://github.com/malkfilipp)) +- Add `bitmapSubsetLimit(bitmap, range_start, limit)` function, that returns subset of the smallest `limit` values in set that is no smaller than `range_start`. [#6957](https://github.com/ClickHouse/ClickHouse/pull/6957) ([Zhichang Yu](https://github.com/yuzhichang)) +- Add `bitmapMin` and `bitmapMax` functions. [#6970](https://github.com/ClickHouse/ClickHouse/pull/6970) ([Zhichang Yu](https://github.com/yuzhichang)) +- Add function `repeat` related to [issue-6648](https://github.com/ClickHouse/ClickHouse/issues/6648) [#6999](https://github.com/ClickHouse/ClickHouse/pull/6999) ([flynn](https://github.com/ucasFL)) + +#### Experimental Feature {#experimental-feature-1} + +- Implement (in memory) Merge Join variant that does not change current pipeline. Result is partially sorted by merge key. Set `partial_merge_join = 1` to use this feature. The Merge Join is still in development. [#6940](https://github.com/ClickHouse/ClickHouse/pull/6940) ([Artem Zuikov](https://github.com/4ertus2)) +- Add `S3` engine and table function. It is still in development (no authentication support yet). [#5596](https://github.com/ClickHouse/ClickHouse/pull/5596) ([Vladimir Chebotarev](https://github.com/excitoon)) + +#### Improvement {#improvement-2} + +- Every message read from Kafka is inserted atomically. This resolves almost all known issues with Kafka engine. [#6950](https://github.com/ClickHouse/ClickHouse/pull/6950) ([Ivan](https://github.com/abyss7)) +- Improvements for failover of Distributed queries. Shorten recovery time, also it is now configurable and can be seen in `system.clusters`. [#6399](https://github.com/ClickHouse/ClickHouse/pull/6399) ([Vasily Nemkov](https://github.com/Enmk)) +- Support numeric values for Enums directly in `IN` section. #6766 [#6941](https://github.com/ClickHouse/ClickHouse/pull/6941) ([dimarub2000](https://github.com/dimarub2000)) +- Support (optional, disabled by default) redirects on URL storage. [#6914](https://github.com/ClickHouse/ClickHouse/pull/6914) ([maqroll](https://github.com/maqroll)) +- Add information message when client with an older version connects to a server. [#6893](https://github.com/ClickHouse/ClickHouse/pull/6893) ([Philipp Malkovsky](https://github.com/malkfilipp)) +- Remove maximum backoff sleep time limit for sending data in Distributed tables [#6895](https://github.com/ClickHouse/ClickHouse/pull/6895) ([Azat Khuzhin](https://github.com/azat)) +- Add ability to send profile events (counters) with cumulative values to graphite. It can be enabled under `` in server `config.xml`. [#6969](https://github.com/ClickHouse/ClickHouse/pull/6969) ([Azat Khuzhin](https://github.com/azat)) +- Add automatically cast type `T` to `LowCardinality(T)` while inserting data in column of type `LowCardinality(T)` in Native format via HTTP. [#6891](https://github.com/ClickHouse/ClickHouse/pull/6891) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Add ability to use function `hex` without using `reinterpretAsString` for `Float32`, `Float64`. [#7024](https://github.com/ClickHouse/ClickHouse/pull/7024) ([Mikhail Korotov](https://github.com/millb)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-2} + +- Add gdb-index to clickhouse binary with debug info. It will speed up startup time of `gdb`. [#6947](https://github.com/ClickHouse/ClickHouse/pull/6947) ([alesapin](https://github.com/alesapin)) +- Speed up deb packaging with patched dpkg-deb which uses `pigz`. [#6960](https://github.com/ClickHouse/ClickHouse/pull/6960) ([alesapin](https://github.com/alesapin)) +- Set `enable_fuzzing = 1` to enable libfuzzer instrumentation of all the project code. [#7042](https://github.com/ClickHouse/ClickHouse/pull/7042) ([kyprizel](https://github.com/kyprizel)) +- Add split build smoke test in CI. [#7061](https://github.com/ClickHouse/ClickHouse/pull/7061) ([alesapin](https://github.com/alesapin)) +- Add build with MemorySanitizer to CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Replace `libsparsehash` with `sparsehash-c11` [#6965](https://github.com/ClickHouse/ClickHouse/pull/6965) ([Azat Khuzhin](https://github.com/azat)) + +#### Bug Fix {#bug-fix-5} + +- Fixed performance degradation of index analysis on complex keys on large tables. This fixes #6924. [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix logical error causing segfaults when selecting from Kafka empty topic. [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Fix too early MySQL connection close in `MySQLBlockInputStream.cpp`. [#6882](https://github.com/ClickHouse/ClickHouse/pull/6882) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Returned support for very old Linux kernels (fix [#6841](https://github.com/ClickHouse/ClickHouse/issues/6841)) [#6853](https://github.com/ClickHouse/ClickHouse/pull/6853) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix possible data loss in `insert select` query in case of empty block in input stream. #6834 #6862 [#6911](https://github.com/ClickHouse/ClickHouse/pull/6911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) +- Fix complex queries with array joins and global subqueries. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) +- Fix `Unknown identifier` error in ORDER BY and GROUP BY with multiple JOINs [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed `MSan` warning while executing function with `LowCardinality` argument. [#7062](https://github.com/ClickHouse/ClickHouse/pull/7062) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Backward Incompatible Change {#backward-incompatible-change-2} + +- Changed serialization format of bitmap\* aggregate function states to improve performance. Serialized states of bitmap\* from previous versions cannot be read. [#6908](https://github.com/ClickHouse/ClickHouse/pull/6908) ([Zhichang Yu](https://github.com/yuzhichang)) + +## ClickHouse Release 19.14 {#clickhouse-release-19-14} + +### ClickHouse Release 19.14.7.15, 2019-10-02 {#clickhouse-release-19-14-7-15-2019-10-02} + +#### Bug Fix {#bug-fix-6} + +- This release also contains all bug fixes from 19.11.12.69. +- Fixed compatibility for distributed queries between 19.14 and earlier versions. This fixes [#7068](https://github.com/ClickHouse/ClickHouse/issues/7068). [#7069](https://github.com/ClickHouse/ClickHouse/pull/7069) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.14.6.12, 2019-09-19 {#clickhouse-release-19-14-6-12-2019-09-19} + +#### Bug Fix {#bug-fix-7} + +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) +- Fixed subquery name in queries with `ARRAY JOIN` and `GLOBAL IN subquery` with alias. Use subquery alias for external table name if it is specified. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-3} + +- Fix [flapping](https://clickhouse-test-reports.s3.yandex.net/6944/aab95fd5175a513413c7395a73a82044bdafb906/functional_stateless_tests_(debug).html) test `00715_fetch_merged_or_mutated_part_zookeeper` by rewriting it to a shell scripts because it needs to wait for mutations to apply. [#6977](https://github.com/ClickHouse/ClickHouse/pull/6977) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed UBSan and MemSan failure in function `groupUniqArray` with emtpy array argument. It was caused by placing of empty `PaddedPODArray` into hash table zero cell because constructor for zero cell value was not called. [#6937](https://github.com/ClickHouse/ClickHouse/pull/6937) ([Amos Bird](https://github.com/amosbird)) + +### ClickHouse Release 19.14.3.3, 2019-09-10 {#clickhouse-release-19-14-3-3-2019-09-10} + +#### New Feature {#new-feature-4} + +- `WITH FILL` modifier for `ORDER BY`. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- `WITH TIES` modifier for `LIMIT`. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- Parse unquoted `NULL` literal as NULL (if setting `format_csv_unquoted_null_literal_as_null=1`). Initialize null fields with default values if data type of this field is not nullable (if setting `input_format_null_as_default=1`). [#5990](https://github.com/ClickHouse/ClickHouse/issues/5990) [#6055](https://github.com/ClickHouse/ClickHouse/pull/6055) ([tavplubix](https://github.com/tavplubix)) +- Support for wildcards in paths of table functions `file` and `hdfs`. If the path contains wildcards, the table will be readonly. Example of usage: `select * from hdfs('hdfs://hdfs1:9000/some_dir/another_dir/*/file{0..9}{0..9}')` and `select * from file('some_dir/{some_file,another_file,yet_another}.tsv', 'TSV', 'value UInt32')`. [#6092](https://github.com/ClickHouse/ClickHouse/pull/6092) ([Olga Khvostikova](https://github.com/stavrolia)) +- New `system.metric_log` table which stores values of `system.events` and `system.metrics` with specified time interval. [#6363](https://github.com/ClickHouse/ClickHouse/issues/6363) [#6467](https://github.com/ClickHouse/ClickHouse/pull/6467) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6530](https://github.com/ClickHouse/ClickHouse/pull/6530) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to write ClickHouse text logs to `system.text_log` table. [#6037](https://github.com/ClickHouse/ClickHouse/issues/6037) [#6103](https://github.com/ClickHouse/ClickHouse/pull/6103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6164](https://github.com/ClickHouse/ClickHouse/pull/6164) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Show private symbols in stack traces (this is done via parsing symbol tables of ELF files). Added information about file and line number in stack traces if debug info is present. Speedup symbol name lookup with indexing symbols present in program. Added new SQL functions for introspection: `demangle` and `addressToLine`. Renamed function `symbolizeAddress` to `addressToSymbol` for consistency. Function `addressToSymbol` will return mangled name for performance reasons and you have to apply `demangle`. Added setting `allow_introspection_functions` which is turned off by default. [#6201](https://github.com/ClickHouse/ClickHouse/pull/6201) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Table function `values` (the name is case-insensitive). It allows to read from `VALUES` list proposed in [#5984](https://github.com/ClickHouse/ClickHouse/issues/5984). Example: `SELECT * FROM VALUES('a UInt64, s String', (1, 'one'), (2, 'two'), (3, 'three'))`. [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) +- Added an ability to alter storage settings. Syntax: `ALTER TABLE
    MODIFY SETTING = `. [#6366](https://github.com/ClickHouse/ClickHouse/pull/6366) [#6669](https://github.com/ClickHouse/ClickHouse/pull/6669) [#6685](https://github.com/ClickHouse/ClickHouse/pull/6685) ([alesapin](https://github.com/alesapin)) +- Support for removing of detached parts. Syntax: `ALTER TABLE DROP DETACHED PART ''`. [#6158](https://github.com/ClickHouse/ClickHouse/pull/6158) ([tavplubix](https://github.com/tavplubix)) +- Table constraints. Allows to add constraint to table definition which will be checked at insert. [#5273](https://github.com/ClickHouse/ClickHouse/pull/5273) ([Gleb Novikov](https://github.com/NanoBjorn)) [#6652](https://github.com/ClickHouse/ClickHouse/pull/6652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Suppport for cascaded materialized views. [#6324](https://github.com/ClickHouse/ClickHouse/pull/6324) ([Amos Bird](https://github.com/amosbird)) +- Turn on query profiler by default to sample every query execution thread once a second. [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Input format `ORC`. [#6454](https://github.com/ClickHouse/ClickHouse/pull/6454) [#6703](https://github.com/ClickHouse/ClickHouse/pull/6703) ([akonyaev90](https://github.com/akonyaev90)) +- Added two new functions: `sigmoid` and `tanh` (that are useful for machine learning applications). [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Function `hasToken(haystack, token)`, `hasTokenCaseInsensitive(haystack, token)` to check if given token is in haystack. Token is a maximal length substring between two non alphanumeric ASCII characters (or boundaries of haystack). Token must be a constant string. Supported by tokenbf_v1 index specialization. [#6596](https://github.com/ClickHouse/ClickHouse/pull/6596), [#6662](https://github.com/ClickHouse/ClickHouse/pull/6662) ([Vasily Nemkov](https://github.com/Enmk)) +- New function `neighbor(value, offset[, default_value])`. Allows to reach prev/next value within column in a block of data. [#5925](https://github.com/ClickHouse/ClickHouse/pull/5925) ([Alex Krash](https://github.com/alex-krash)) [6685365ab8c5b74f9650492c88a012596eb1b0c6](https://github.com/ClickHouse/ClickHouse/commit/6685365ab8c5b74f9650492c88a012596eb1b0c6) [341e2e4587a18065c2da1ca888c73389f48ce36c](https://github.com/ClickHouse/ClickHouse/commit/341e2e4587a18065c2da1ca888c73389f48ce36c) [Alexey Milovidov](https://github.com/alexey-milovidov) +- Created a function `currentUser()`, returning login of authorized user. Added alias `user()` for compatibility with MySQL. [#6470](https://github.com/ClickHouse/ClickHouse/pull/6470) ([Alex Krash](https://github.com/alex-krash)) +- New aggregate functions `quantilesExactInclusive` and `quantilesExactExclusive` which were proposed in [#5885](https://github.com/ClickHouse/ClickHouse/issues/5885). [#6477](https://github.com/ClickHouse/ClickHouse/pull/6477) ([dimarub2000](https://github.com/dimarub2000)) +- Function `bitmapRange(bitmap, range_begin, range_end)` which returns new set with specified range (not include the `range_end`). [#6314](https://github.com/ClickHouse/ClickHouse/pull/6314) ([Zhichang Yu](https://github.com/yuzhichang)) +- Function `geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)` which creates array of precision-long strings of geohash-boxes covering provided area. [#6127](https://github.com/ClickHouse/ClickHouse/pull/6127) ([Vasily Nemkov](https://github.com/Enmk)) +- Implement support for INSERT query with `Kafka` tables. [#6012](https://github.com/ClickHouse/ClickHouse/pull/6012) ([Ivan](https://github.com/abyss7)) +- Added support for `_partition` and `_timestamp` virtual columns to Kafka engine. [#6400](https://github.com/ClickHouse/ClickHouse/pull/6400) ([Ivan](https://github.com/abyss7)) +- Possibility to remove sensitive data from `query_log`, server logs, process list with regexp-based rules. [#5710](https://github.com/ClickHouse/ClickHouse/pull/5710) ([filimonov](https://github.com/filimonov)) + +#### Experimental Feature {#experimental-feature-2} + +- Input and output data format `Template`. It allows to specify custom format string for input and output. [#4354](https://github.com/ClickHouse/ClickHouse/issues/4354) [#6727](https://github.com/ClickHouse/ClickHouse/pull/6727) ([tavplubix](https://github.com/tavplubix)) +- Implementation of `LIVE VIEW` tables that were originally proposed in [#2898](https://github.com/ClickHouse/ClickHouse/pull/2898), prepared in [#3925](https://github.com/ClickHouse/ClickHouse/issues/3925), and then updated in [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541). See [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) for detailed description. [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) ([vzakaznikov](https://github.com/vzakaznikov)) [#6425](https://github.com/ClickHouse/ClickHouse/pull/6425) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#6656](https://github.com/ClickHouse/ClickHouse/pull/6656) ([vzakaznikov](https://github.com/vzakaznikov)) Note that `LIVE VIEW` feature may be removed in next versions. + +#### Bug Fix {#bug-fix-8} + +- This release also contains all bug fixes from 19.13 and 19.11. +- Fix segmentation fault when the table has skip indices and vertical merge happens. [#6723](https://github.com/ClickHouse/ClickHouse/pull/6723) ([alesapin](https://github.com/alesapin)) +- Fix per-column TTL with non-trivial column defaults. Previously in case of force TTL merge with `OPTIMIZE ... FINAL` query, expired values was replaced by type defaults instead of user-specified column defaults. [#6796](https://github.com/ClickHouse/ClickHouse/pull/6796) ([Anton Popov](https://github.com/CurtizJ)) +- Fix Kafka messages duplication problem on normal server restart. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Fixed infinite loop when reading Kafka messages. Do not pause/resume consumer on subscription at all - otherwise it may get paused indefinitely in some scenarios. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([Ivan](https://github.com/abyss7)) +- Fix `Key expression contains comparison between inconvertible types` exception in `bitmapContains` function. [#6136](https://github.com/ClickHouse/ClickHouse/issues/6136) [#6146](https://github.com/ClickHouse/ClickHouse/issues/6146) [#6156](https://github.com/ClickHouse/ClickHouse/pull/6156) ([dimarub2000](https://github.com/dimarub2000)) +- Fix segfault with enabled `optimize_skip_unused_shards` and missing sharding key. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed extra verbose logging in MySQL interface [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Return the ability to parse boolean settings from ‘true’ and ‘false’ in the configuration file. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Fix crash in `quantile` and `median` function over `Nullable(Decimal128)`. [#6378](https://github.com/ClickHouse/ClickHouse/pull/6378) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed possible incomplete result returned by `SELECT` query with `WHERE` condition on primary key contained conversion to Float type. It was caused by incorrect checking of monotonicity in `toFloat` function. [#6248](https://github.com/ClickHouse/ClickHouse/issues/6248) [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) +- Check `max_expanded_ast_elements` setting for mutations. Clear mutations after `TRUNCATE TABLE`. [#6205](https://github.com/ClickHouse/ClickHouse/pull/6205) ([Winter Zhang](https://github.com/zhang2014)) +- Fix JOIN results for key columns when used with `join_use_nulls`. Attach Nulls instead of columns defaults. [#6249](https://github.com/ClickHouse/ClickHouse/pull/6249) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix for skip indices with vertical merge and alter. Fix for `Bad size of marks file` exception. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594) [#6713](https://github.com/ClickHouse/ClickHouse/pull/6713) ([alesapin](https://github.com/alesapin)) +- Fix rare crash in `ALTER MODIFY COLUMN` and vertical merge when one of merged/altered parts is empty (0 rows) [#6746](https://github.com/ClickHouse/ClickHouse/issues/6746) [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Fixed bug in conversion of `LowCardinality` types in `AggregateFunctionFactory`. This fixes [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix wrong behavior and possible segfaults in `topK` and `topKWeighted` aggregated functions. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed unsafe code around `getIdentifier` function. [#6401](https://github.com/ClickHouse/ClickHouse/issues/6401) [#6409](https://github.com/ClickHouse/ClickHouse/pull/6409) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed bug in MySQL wire protocol (is used while connecting to ClickHouse form MySQL client). Caused by heap buffer overflow in `PacketPayloadWriteBuffer`. [#6212](https://github.com/ClickHouse/ClickHouse/pull/6212) ([Yuriy Baranov](https://github.com/yurriy)) +- Fixed memory leak in `bitmapSubsetInRange` function. [#6819](https://github.com/ClickHouse/ClickHouse/pull/6819) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fix rare bug when mutation executed after granularity change. [#6816](https://github.com/ClickHouse/ClickHouse/pull/6816) ([alesapin](https://github.com/alesapin)) +- Allow protobuf message with all fields by default. [#6132](https://github.com/ClickHouse/ClickHouse/pull/6132) ([Vitaly Baranov](https://github.com/vitlibar)) +- Resolve a bug with `nullIf` function when we send a `NULL` argument on the second argument. [#6446](https://github.com/ClickHouse/ClickHouse/pull/6446) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fix rare bug with wrong memory allocation/deallocation in complex key cache dictionaries with string fields which leads to infinite memory consumption (looks like memory leak). Bug reproduces when string size was a power of two starting from eight (8, 16, 32, etc). [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Fixed Gorilla encoding on small sequences which caused exception `Cannot write after end of buffer`. [#6398](https://github.com/ClickHouse/ClickHouse/issues/6398) [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Vasily Nemkov](https://github.com/Enmk)) +- Allow to use not nullable types in JOINs with `join_use_nulls` enabled. [#6705](https://github.com/ClickHouse/ClickHouse/pull/6705) ([Artem Zuikov](https://github.com/4ertus2)) +- Disable `Poco::AbstractConfiguration` substitutions in query in `clickhouse-client`. [#6706](https://github.com/ClickHouse/ClickHouse/pull/6706) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid deadlock in `REPLACE PARTITION`. [#6677](https://github.com/ClickHouse/ClickHouse/pull/6677) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using `arrayReduce` for constant arguments may lead to segfault. [#6242](https://github.com/ClickHouse/ClickHouse/issues/6242) [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix inconsistent parts which can appear if replica was restored after `DROP PARTITION`. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed hang in `JSONExtractRaw` function. [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug with incorrect skip indices serialization and aggregation with adaptive granularity. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594). [#6748](https://github.com/ClickHouse/ClickHouse/pull/6748) ([alesapin](https://github.com/alesapin)) +- Fix `WITH ROLLUP` and `WITH CUBE` modifiers of `GROUP BY` with two-level aggregation. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug with writing secondary indices marks with adaptive granularity. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Fix initialization order while server startup. Since `StorageMergeTree::background_task_handle` is initialized in `startup()` the `MergeTreeBlockOutputStream::write()` may try to use it before initialization. Just check if it is initialized. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) +- Clearing the data buffer from the previous read operation that was completed with an error. [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) +- Fix bug with enabling adaptive granularity when creating a new replica for Replicated\*MergeTree table. [#6394](https://github.com/ClickHouse/ClickHouse/issues/6394) [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Fixed possible crash during server startup in case of exception happened in `libunwind` during exception at access to uninitialized `ThreadStatus` structure. [#6456](https://github.com/ClickHouse/ClickHouse/pull/6456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix crash in `yandexConsistentHash` function. Found by fuzz test. [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304) [#6305](https://github.com/ClickHouse/ClickHouse/pull/6305) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed the possibility of hanging queries when server is overloaded and global thread pool becomes near full. This have higher chance to happen on clusters with large number of shards (hundreds), because distributed queries allocate a thread per connection to each shard. For example, this issue may reproduce if a cluster of 330 shards is processing 30 concurrent distributed queries. This issue affects all versions starting from 19.2. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed logic of `arrayEnumerateUniqRanked` function. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix segfault when decoding symbol table. [#6603](https://github.com/ClickHouse/ClickHouse/pull/6603) ([Amos Bird](https://github.com/amosbird)) +- Fixed irrelevant exception in cast of `LowCardinality(Nullable)` to not-Nullable column in case if it does not contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Removed extra quoting of description in `system.settings` table. [#6696](https://github.com/ClickHouse/ClickHouse/issues/6696) [#6699](https://github.com/ClickHouse/ClickHouse/pull/6699) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid possible deadlock in `TRUNCATE` of Replicated table. [#6695](https://github.com/ClickHouse/ClickHouse/pull/6695) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix reading in order of sorting key. [#6189](https://github.com/ClickHouse/ClickHouse/pull/6189) ([Anton Popov](https://github.com/CurtizJ)) +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix bug opened by [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) (since 19.4.0). Reproduces in queries to Distributed tables over MergeTree tables when we does not query any columns (`SELECT 1`). [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Fixed overflow in integer division of signed type to unsigned type. The behaviour was exactly as in C or C++ language (integer promotion rules) that may be surprising. Please note that the overflow is still possible when dividing large signed number to large unsigned number or vice-versa (but that case is less usual). The issue existed in all server versions. [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214) [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limit maximum sleep time for throttling when `max_execution_speed` or `max_execution_speed_bytes` is set. Fixed false errors like `Estimated query execution time (inf seconds) is too long`. [#5547](https://github.com/ClickHouse/ClickHouse/issues/5547) [#6232](https://github.com/ClickHouse/ClickHouse/pull/6232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed issues about using `MATERIALIZED` columns and aliases in `MaterializedView`. [#448](https://github.com/ClickHouse/ClickHouse/issues/448) [#3484](https://github.com/ClickHouse/ClickHouse/issues/3484) [#3450](https://github.com/ClickHouse/ClickHouse/issues/3450) [#2878](https://github.com/ClickHouse/ClickHouse/issues/2878) [#2285](https://github.com/ClickHouse/ClickHouse/issues/2285) [#3796](https://github.com/ClickHouse/ClickHouse/pull/3796) ([Amos Bird](https://github.com/amosbird)) [#6316](https://github.com/ClickHouse/ClickHouse/pull/6316) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `FormatFactory` behaviour for input streams which are not implemented as processor. [#6495](https://github.com/ClickHouse/ClickHouse/pull/6495) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed typo. [#6631](https://github.com/ClickHouse/ClickHouse/pull/6631) ([Alex Ryndin](https://github.com/alexryndin)) +- Typo in the error message ( is -\> are ). [#6839](https://github.com/ClickHouse/ClickHouse/pull/6839) ([Denis Zhuravlev](https://github.com/den-crane)) +- Fixed error while parsing of columns list from string if type contained a comma (this issue was relevant for `File`, `URL`, `HDFS` storages) [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) + +#### Security Fix {#security-fix} + +- This release also contains all bug security fixes from 19.13 and 19.11. +- Fixed the possibility of a fabricated query to cause server crash due to stack overflow in SQL parser. Fixed the possibility of stack overflow in Merge and Distributed tables, materialized views and conditions for row-level security that involve subqueries. [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement {#improvement-3} + +- Correct implementation of ternary logic for `AND/OR`. [#6048](https://github.com/ClickHouse/ClickHouse/pull/6048) ([Alexander Kazakov](https://github.com/Akazz)) +- Now values and rows with expired TTL will be removed after `OPTIMIZE ... FINAL` query from old parts without TTL infos or with outdated TTL infos, e.g. after `ALTER ... MODIFY TTL` query. Added queries `SYSTEM STOP/START TTL MERGES` to disallow/allow assign merges with TTL and filter expired values in all merges. [#6274](https://github.com/ClickHouse/ClickHouse/pull/6274) ([Anton Popov](https://github.com/CurtizJ)) +- Possibility to change the location of ClickHouse history file for client using `CLICKHOUSE_HISTORY_FILE` env. [#6840](https://github.com/ClickHouse/ClickHouse/pull/6840) ([filimonov](https://github.com/filimonov)) +- Remove `dry_run` flag from `InterpreterSelectQuery`. … [#6375](https://github.com/ClickHouse/ClickHouse/pull/6375) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Support `ASOF JOIN` with `ON` section. [#6211](https://github.com/ClickHouse/ClickHouse/pull/6211) ([Artem Zuikov](https://github.com/4ertus2)) +- Better support of skip indexes for mutations and replication. Support for `MATERIALIZE/CLEAR INDEX ... IN PARTITION` query. `UPDATE x = x` recalculates all indices that use column `x`. [#5053](https://github.com/ClickHouse/ClickHouse/pull/5053) ([Nikita Vasilev](https://github.com/nikvas0)) +- Allow to `ATTACH` live views (for example, at the server startup) regardless to `allow_experimental_live_view` setting. [#6754](https://github.com/ClickHouse/ClickHouse/pull/6754) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- For stack traces gathered by query profiler, do not include stack frames generated by the query profiler itself. [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now table functions `values`, `file`, `url`, `hdfs` have support for ALIAS columns. [#6255](https://github.com/ClickHouse/ClickHouse/pull/6255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Throw an exception if `config.d` file does not have the corresponding root element as the config file. [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) +- Print extra info in exception message for `no space left on device`. [#6182](https://github.com/ClickHouse/ClickHouse/issues/6182), [#6252](https://github.com/ClickHouse/ClickHouse/issues/6252) [#6352](https://github.com/ClickHouse/ClickHouse/pull/6352) ([tavplubix](https://github.com/tavplubix)) +- When determining shards of a `Distributed` table to be covered by a read query (for `optimize_skip_unused_shards` = 1) ClickHouse now checks conditions from both `prewhere` and `where` clauses of select statement. [#6521](https://github.com/ClickHouse/ClickHouse/pull/6521) ([Alexander Kazakov](https://github.com/Akazz)) +- Enabled `SIMDJSON` for machines without AVX2 but with SSE 4.2 and PCLMUL instruction set. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285) [#6320](https://github.com/ClickHouse/ClickHouse/pull/6320) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- ClickHouse can work on filesystems without `O_DIRECT` support (such as ZFS and BtrFS) without additional tuning. [#4449](https://github.com/ClickHouse/ClickHouse/issues/4449) [#6730](https://github.com/ClickHouse/ClickHouse/pull/6730) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support push down predicate for final subquery. [#6120](https://github.com/ClickHouse/ClickHouse/pull/6120) ([TCeason](https://github.com/TCeason)) [#6162](https://github.com/ClickHouse/ClickHouse/pull/6162) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Better `JOIN ON` keys extraction [#6131](https://github.com/ClickHouse/ClickHouse/pull/6131) ([Artem Zuikov](https://github.com/4ertus2)) +- Upated `SIMDJSON`. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285). [#6306](https://github.com/ClickHouse/ClickHouse/pull/6306) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Optimize selecting of smallest column for `SELECT count()` query. [#6344](https://github.com/ClickHouse/ClickHouse/pull/6344) ([Amos Bird](https://github.com/amosbird)) +- Added `strict` parameter in `windowFunnel()`. When the `strict` is set, the `windowFunnel()` applies conditions only for the unique values. [#6548](https://github.com/ClickHouse/ClickHouse/pull/6548) ([achimbab](https://github.com/achimbab)) +- Safer interface of `mysqlxx::Pool`. [#6150](https://github.com/ClickHouse/ClickHouse/pull/6150) ([avasiliev](https://github.com/avasiliev)) +- Options line size when executing with `--help` option now corresponds with terminal size. [#6590](https://github.com/ClickHouse/ClickHouse/pull/6590) ([dimarub2000](https://github.com/dimarub2000)) +- Disable “read in order” optimization for aggregation without keys. [#6599](https://github.com/ClickHouse/ClickHouse/pull/6599) ([Anton Popov](https://github.com/CurtizJ)) +- HTTP status code for `INCORRECT_DATA` and `TYPE_MISMATCH` error codes was changed from default `500 Internal Server Error` to `400 Bad Request`. [#6271](https://github.com/ClickHouse/ClickHouse/pull/6271) ([Alexander Rodin](https://github.com/a-rodin)) +- Move Join object from `ExpressionAction` into `AnalyzedJoin`. `ExpressionAnalyzer` and `ExpressionAction` do not know about `Join` class anymore. Its logic is hidden by `AnalyzedJoin` iface. [#6801](https://github.com/ClickHouse/ClickHouse/pull/6801) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed possible deadlock of distributed queries when one of shards is localhost but the query is sent via network connection. [#6759](https://github.com/ClickHouse/ClickHouse/pull/6759) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Changed semantic of multiple tables `RENAME` to avoid possible deadlocks. [#6757](https://github.com/ClickHouse/ClickHouse/issues/6757). [#6756](https://github.com/ClickHouse/ClickHouse/pull/6756) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Rewritten MySQL compatibility server to prevent loading full packet payload in memory. Decreased memory consumption for each connection to approximately `2 * DBMS_DEFAULT_BUFFER_SIZE` (read/write buffers). [#5811](https://github.com/ClickHouse/ClickHouse/pull/5811) ([Yuriy Baranov](https://github.com/yurriy)) +- Move AST alias interpreting logic out of parser that does not have to know anything about query semantics. [#6108](https://github.com/ClickHouse/ClickHouse/pull/6108) ([Artem Zuikov](https://github.com/4ertus2)) +- Slightly more safe parsing of `NamesAndTypesList`. [#6408](https://github.com/ClickHouse/ClickHouse/issues/6408). [#6410](https://github.com/ClickHouse/ClickHouse/pull/6410) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-copier`: Allow use `where_condition` from config with `partition_key` alias in query for checking partition existence (Earlier it was used only in reading data queries). [#6577](https://github.com/ClickHouse/ClickHouse/pull/6577) ([proller](https://github.com/proller)) +- Added optional message argument in `throwIf`. ([#5772](https://github.com/ClickHouse/ClickHouse/issues/5772)) [#6329](https://github.com/ClickHouse/ClickHouse/pull/6329) ([Vdimir](https://github.com/Vdimir)) +- Server exception got while sending insertion data is now being processed in client as well. [#5891](https://github.com/ClickHouse/ClickHouse/issues/5891) [#6711](https://github.com/ClickHouse/ClickHouse/pull/6711) ([dimarub2000](https://github.com/dimarub2000)) +- Added a metric `DistributedFilesToInsert` that shows the total number of files in filesystem that are selected to send to remote servers by Distributed tables. The number is summed across all shards. [#6600](https://github.com/ClickHouse/ClickHouse/pull/6600) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move most of JOINs prepare logic from `ExpressionAction/ExpressionAnalyzer` to `AnalyzedJoin`. [#6785](https://github.com/ClickHouse/ClickHouse/pull/6785) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix TSan [warning](https://clickhouse-test-reports.s3.yandex.net/6399/c1c1d1daa98e199e620766f1bd06a5921050a00d/functional_stateful_tests_(thread).html) ‘lock-order-inversion’. [#6740](https://github.com/ClickHouse/ClickHouse/pull/6740) ([Vasily Nemkov](https://github.com/Enmk)) +- Better information messages about lack of Linux capabilities. Logging fatal errors with “fatal” level, that will make it easier to find in `system.text_log`. [#6441](https://github.com/ClickHouse/ClickHouse/pull/6441) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- When enable dumping temporary data to the disk to restrict memory usage during `GROUP BY`, `ORDER BY`, it didn’t check the free disk space. The fix add a new setting `min_free_disk_space`, when the free disk space it smaller then the threshold, the query will stop and throw `ErrorCodes::NOT_ENOUGH_SPACE`. [#6678](https://github.com/ClickHouse/ClickHouse/pull/6678) ([Weiqing Xu](https://github.com/weiqxu)) [#6691](https://github.com/ClickHouse/ClickHouse/pull/6691) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed recursive rwlock by thread. It makes no sense, because threads are reused between queries. `SELECT` query may acquire a lock in one thread, hold a lock from another thread and exit from first thread. In the same time, first thread can be reused by `DROP` query. This will lead to false “Attempt to acquire exclusive lock recursively” messages. [#6771](https://github.com/ClickHouse/ClickHouse/pull/6771) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Split `ExpressionAnalyzer.appendJoin()`. Prepare a place in `ExpressionAnalyzer` for `MergeJoin`. [#6524](https://github.com/ClickHouse/ClickHouse/pull/6524) ([Artem Zuikov](https://github.com/4ertus2)) +- Added `mysql_native_password` authentication plugin to MySQL compatibility server. [#6194](https://github.com/ClickHouse/ClickHouse/pull/6194) ([Yuriy Baranov](https://github.com/yurriy)) +- Less number of `clock_gettime` calls; fixed ABI compatibility between debug/release in `Allocator` (insignificant issue). [#6197](https://github.com/ClickHouse/ClickHouse/pull/6197) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move `collectUsedColumns` from `ExpressionAnalyzer` to `SyntaxAnalyzer`. `SyntaxAnalyzer` makes `required_source_columns` itself now. [#6416](https://github.com/ClickHouse/ClickHouse/pull/6416) ([Artem Zuikov](https://github.com/4ertus2)) +- Add setting `joined_subquery_requires_alias` to require aliases for subselects and table functions in `FROM` that more than one table is present (i.e. queries with JOINs). [#6733](https://github.com/ClickHouse/ClickHouse/pull/6733) ([Artem Zuikov](https://github.com/4ertus2)) +- Extract `GetAggregatesVisitor` class from `ExpressionAnalyzer`. [#6458](https://github.com/ClickHouse/ClickHouse/pull/6458) ([Artem Zuikov](https://github.com/4ertus2)) +- `system.query_log`: change data type of `type` column to `Enum`. [#6265](https://github.com/ClickHouse/ClickHouse/pull/6265) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Static linking of `sha256_password` authentication plugin. [#6512](https://github.com/ClickHouse/ClickHouse/pull/6512) ([Yuriy Baranov](https://github.com/yurriy)) +- Avoid extra dependency for the setting `compile` to work. In previous versions, the user may get error like `cannot open crti.o`, `unable to find library -lc` etc. [#6309](https://github.com/ClickHouse/ClickHouse/pull/6309) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- More validation of the input that may come from malicious replica. [#6303](https://github.com/ClickHouse/ClickHouse/pull/6303) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now `clickhouse-obfuscator` file is available in `clickhouse-client` package. In previous versions it was available as `clickhouse obfuscator` (with whitespace). [#5816](https://github.com/ClickHouse/ClickHouse/issues/5816) [#6609](https://github.com/ClickHouse/ClickHouse/pull/6609) ([dimarub2000](https://github.com/dimarub2000)) +- Fixed deadlock when we have at least two queries that read at least two tables in different order and another query that performs DDL operation on one of tables. Fixed another very rare deadlock. [#6764](https://github.com/ClickHouse/ClickHouse/pull/6764) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added `os_thread_ids` column to `system.processes` and `system.query_log` for better debugging possibilities. [#6763](https://github.com/ClickHouse/ClickHouse/pull/6763) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- A workaround for PHP mysqlnd extension bugs which occur when `sha256_password` is used as a default authentication plugin (described in [#6031](https://github.com/ClickHouse/ClickHouse/issues/6031)). [#6113](https://github.com/ClickHouse/ClickHouse/pull/6113) ([Yuriy Baranov](https://github.com/yurriy)) +- Remove unneeded place with changed nullability columns. [#6693](https://github.com/ClickHouse/ClickHouse/pull/6693) ([Artem Zuikov](https://github.com/4ertus2)) +- Set default value of `queue_max_wait_ms` to zero, because current value (five seconds) makes no sense. There are rare circumstances when this settings has any use. Added settings `replace_running_query_max_wait_ms`, `kafka_max_wait_ms` and `connection_pool_max_wait_ms` for disambiguation. [#6692](https://github.com/ClickHouse/ClickHouse/pull/6692) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Extract `SelectQueryExpressionAnalyzer` from `ExpressionAnalyzer`. Keep the last one for non-select queries. [#6499](https://github.com/ClickHouse/ClickHouse/pull/6499) ([Artem Zuikov](https://github.com/4ertus2)) +- Removed duplicating input and output formats. [#6239](https://github.com/ClickHouse/ClickHouse/pull/6239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Allow user to override `poll_interval` and `idle_connection_timeout` settings on connection. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `MergeTree` now has an additional option `ttl_only_drop_parts` (disabled by default) to avoid partial pruning of parts, so that they dropped completely when all the rows in a part are expired. [#6191](https://github.com/ClickHouse/ClickHouse/pull/6191) ([Sergi Vladykin](https://github.com/svladykin)) +- Type checks for set index functions. Throw exception if function got a wrong type. This fixes fuzz test with UBSan. [#6511](https://github.com/ClickHouse/ClickHouse/pull/6511) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Performance Improvement {#performance-improvement-2} + +- Optimize queries with `ORDER BY expressions` clause, where `expressions` have coinciding prefix with sorting key in `MergeTree` tables. This optimization is controlled by `optimize_read_in_order` setting. [#6054](https://github.com/ClickHouse/ClickHouse/pull/6054) [#6629](https://github.com/ClickHouse/ClickHouse/pull/6629) ([Anton Popov](https://github.com/CurtizJ)) +- Allow to use multiple threads during parts loading and removal. [#6372](https://github.com/ClickHouse/ClickHouse/issues/6372) [#6074](https://github.com/ClickHouse/ClickHouse/issues/6074) [#6438](https://github.com/ClickHouse/ClickHouse/pull/6438) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implemented batch variant of updating aggregate function states. It may lead to performance benefits. [#6435](https://github.com/ClickHouse/ClickHouse/pull/6435) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using `FastOps` library for functions `exp`, `log`, `sigmoid`, `tanh`. FastOps is a fast vector math library from Michael Parakhin (Yandex CTO). Improved performance of `exp` and `log` functions more than 6 times. The functions `exp` and `log` from `Float32` argument will return `Float32` (in previous versions they always return `Float64`). Now `exp(nan)` may return `inf`. The result of `exp` and `log` functions may be not the nearest machine representable number to the true answer. [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) Using Danila Kutenin variant to make fastops working [#6317](https://github.com/ClickHouse/ClickHouse/pull/6317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable consecutive key optimization for `UInt8/16`. [#6298](https://github.com/ClickHouse/ClickHouse/pull/6298) [#6701](https://github.com/ClickHouse/ClickHouse/pull/6701) ([akuzm](https://github.com/akuzm)) +- Improved performance of `simdjson` library by getting rid of dynamic allocation in `ParsedJson::Iterator`. [#6479](https://github.com/ClickHouse/ClickHouse/pull/6479) ([Vitaly Baranov](https://github.com/vitlibar)) +- Pre-fault pages when allocating memory with `mmap()`. [#6667](https://github.com/ClickHouse/ClickHouse/pull/6667) ([akuzm](https://github.com/akuzm)) +- Fix performance bug in `Decimal` comparison. [#6380](https://github.com/ClickHouse/ClickHouse/pull/6380) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-4} + +- Remove Compiler (runtime template instantiation) because we’ve win over it’s performance. [#6646](https://github.com/ClickHouse/ClickHouse/pull/6646) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added performance test to show degradation of performance in gcc-9 in more isolated way. [#6302](https://github.com/ClickHouse/ClickHouse/pull/6302) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added table function `numbers_mt`, which is multithreaded version of `numbers`. Updated performance tests with hash functions. [#6554](https://github.com/ClickHouse/ClickHouse/pull/6554) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Comparison mode in `clickhouse-benchmark` [#6220](https://github.com/ClickHouse/ClickHouse/issues/6220) [#6343](https://github.com/ClickHouse/ClickHouse/pull/6343) ([dimarub2000](https://github.com/dimarub2000)) +- Best effort for printing stack traces. Also added `SIGPROF` as a debugging signal to print stack trace of a running thread. [#6529](https://github.com/ClickHouse/ClickHouse/pull/6529) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Every function in its own file, part 10. [#6321](https://github.com/ClickHouse/ClickHouse/pull/6321) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Remove doubled const `TABLE_IS_READ_ONLY`. [#6566](https://github.com/ClickHouse/ClickHouse/pull/6566) ([filimonov](https://github.com/filimonov)) +- Formatting changes for `StringHashMap` PR [#5417](https://github.com/ClickHouse/ClickHouse/issues/5417). [#6700](https://github.com/ClickHouse/ClickHouse/pull/6700) ([akuzm](https://github.com/akuzm)) +- Better subquery for join creation in `ExpressionAnalyzer`. [#6824](https://github.com/ClickHouse/ClickHouse/pull/6824) ([Artem Zuikov](https://github.com/4ertus2)) +- Remove a redundant condition (found by PVS Studio). [#6775](https://github.com/ClickHouse/ClickHouse/pull/6775) ([akuzm](https://github.com/akuzm)) +- Separate the hash table interface for `ReverseIndex`. [#6672](https://github.com/ClickHouse/ClickHouse/pull/6672) ([akuzm](https://github.com/akuzm)) +- Refactoring of settings. [#6689](https://github.com/ClickHouse/ClickHouse/pull/6689) ([alesapin](https://github.com/alesapin)) +- Add comments for `set` index functions. [#6319](https://github.com/ClickHouse/ClickHouse/pull/6319) ([Nikita Vasilev](https://github.com/nikvas0)) +- Increase OOM score in debug version on Linux. [#6152](https://github.com/ClickHouse/ClickHouse/pull/6152) ([akuzm](https://github.com/akuzm)) +- HDFS HA now work in debug build. [#6650](https://github.com/ClickHouse/ClickHouse/pull/6650) ([Weiqing Xu](https://github.com/weiqxu)) +- Added a test to `transform_query_for_external_database`. [#6388](https://github.com/ClickHouse/ClickHouse/pull/6388) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test for multiple materialized views for Kafka table. [#6509](https://github.com/ClickHouse/ClickHouse/pull/6509) ([Ivan](https://github.com/abyss7)) +- Make a better build scheme. [#6500](https://github.com/ClickHouse/ClickHouse/pull/6500) ([Ivan](https://github.com/abyss7)) +- Fixed `test_external_dictionaries` integration in case it was executed under non root user. [#6507](https://github.com/ClickHouse/ClickHouse/pull/6507) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- The bug reproduces when total size of written packets exceeds `DBMS_DEFAULT_BUFFER_SIZE`. [#6204](https://github.com/ClickHouse/ClickHouse/pull/6204) ([Yuriy Baranov](https://github.com/yurriy)) +- Added a test for `RENAME` table race condition [#6752](https://github.com/ClickHouse/ClickHouse/pull/6752) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid data race on Settings in `KILL QUERY`. [#6753](https://github.com/ClickHouse/ClickHouse/pull/6753) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add integration test for handling errors by a cache dictionary. [#6755](https://github.com/ClickHouse/ClickHouse/pull/6755) ([Vitaly Baranov](https://github.com/vitlibar)) +- Disable parsing of ELF object files on Mac OS, because it makes no sense. [#6578](https://github.com/ClickHouse/ClickHouse/pull/6578) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Attempt to make changelog generator better. [#6327](https://github.com/ClickHouse/ClickHouse/pull/6327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Adding `-Wshadow` switch to the GCC. [#6325](https://github.com/ClickHouse/ClickHouse/pull/6325) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +- Removed obsolete code for `mimalloc` support. [#6715](https://github.com/ClickHouse/ClickHouse/pull/6715) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `zlib-ng` determines x86 capabilities and saves this info to global variables. This is done in defalteInit call, which may be made by different threads simultaneously. To avoid multithreaded writes, do it on library startup. [#6141](https://github.com/ClickHouse/ClickHouse/pull/6141) ([akuzm](https://github.com/akuzm)) +- Regression test for a bug which in join which was fixed in [#5192](https://github.com/ClickHouse/ClickHouse/issues/5192). [#6147](https://github.com/ClickHouse/ClickHouse/pull/6147) ([Bakhtiyor Ruziev](https://github.com/theruziev)) +- Fixed MSan report. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix flapping TTL test. [#6782](https://github.com/ClickHouse/ClickHouse/pull/6782) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed false data race in `MergeTreeDataPart::is_frozen` field. [#6583](https://github.com/ClickHouse/ClickHouse/pull/6583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed timeouts in fuzz test. In previous version, it managed to find false hangup in query `SELECT * FROM numbers_mt(gccMurmurHash(''))`. [#6582](https://github.com/ClickHouse/ClickHouse/pull/6582) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added debug checks to `static_cast` of columns. [#6581](https://github.com/ClickHouse/ClickHouse/pull/6581) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support for Oracle Linux in official RPM packages. [#6356](https://github.com/ClickHouse/ClickHouse/issues/6356) [#6585](https://github.com/ClickHouse/ClickHouse/pull/6585) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Changed json perftests from `once` to `loop` type. [#6536](https://github.com/ClickHouse/ClickHouse/pull/6536) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `odbc-bridge.cpp` defines `main()` so it should not be included in `clickhouse-lib`. [#6538](https://github.com/ClickHouse/ClickHouse/pull/6538) ([Orivej Desh](https://github.com/orivej)) +- Test for crash in `FULL|RIGHT JOIN` with nulls in right table’s keys. [#6362](https://github.com/ClickHouse/ClickHouse/pull/6362) ([Artem Zuikov](https://github.com/4ertus2)) +- Added a test for the limit on expansion of aliases just in case. [#6442](https://github.com/ClickHouse/ClickHouse/pull/6442) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Switched from `boost::filesystem` to `std::filesystem` where appropriate. [#6253](https://github.com/ClickHouse/ClickHouse/pull/6253) [#6385](https://github.com/ClickHouse/ClickHouse/pull/6385) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added RPM packages to website. [#6251](https://github.com/ClickHouse/ClickHouse/pull/6251) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add a test for fixed `Unknown identifier` exception in `IN` section. [#6708](https://github.com/ClickHouse/ClickHouse/pull/6708) ([Artem Zuikov](https://github.com/4ertus2)) +- Simplify `shared_ptr_helper` because people facing difficulties understanding it. [#6675](https://github.com/ClickHouse/ClickHouse/pull/6675) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added performance tests for fixed Gorilla and DoubleDelta codec. [#6179](https://github.com/ClickHouse/ClickHouse/pull/6179) ([Vasily Nemkov](https://github.com/Enmk)) +- Split the integration test `test_dictionaries` into 4 separate tests. [#6776](https://github.com/ClickHouse/ClickHouse/pull/6776) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix PVS-Studio warning in `PipelineExecutor`. [#6777](https://github.com/ClickHouse/ClickHouse/pull/6777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Allow to use `library` dictionary source with ASan. [#6482](https://github.com/ClickHouse/ClickHouse/pull/6482) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added option to generate changelog from a list of PRs. [#6350](https://github.com/ClickHouse/ClickHouse/pull/6350) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Lock the `TinyLog` storage when reading. [#6226](https://github.com/ClickHouse/ClickHouse/pull/6226) ([akuzm](https://github.com/akuzm)) +- Check for broken symlinks in CI. [#6634](https://github.com/ClickHouse/ClickHouse/pull/6634) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Increase timeout for “stack overflow” test because it may take a long time in debug build. [#6637](https://github.com/ClickHouse/ClickHouse/pull/6637) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added a check for double whitespaces. [#6643](https://github.com/ClickHouse/ClickHouse/pull/6643) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `new/delete` memory tracking when build with sanitizers. Tracking is not clear. It only prevents memory limit exceptions in tests. [#6450](https://github.com/ClickHouse/ClickHouse/pull/6450) ([Artem Zuikov](https://github.com/4ertus2)) +- Enable back the check of undefined symbols while linking. [#6453](https://github.com/ClickHouse/ClickHouse/pull/6453) ([Ivan](https://github.com/abyss7)) +- Avoid rebuilding `hyperscan` every day. [#6307](https://github.com/ClickHouse/ClickHouse/pull/6307) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed UBSan report in `ProtobufWriter`. [#6163](https://github.com/ClickHouse/ClickHouse/pull/6163) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Don’t allow to use query profiler with sanitizers because it is not compatible. [#6769](https://github.com/ClickHouse/ClickHouse/pull/6769) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test for reloading a dictionary after fail by timer. [#6114](https://github.com/ClickHouse/ClickHouse/pull/6114) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix inconsistency in `PipelineExecutor::prepareProcessor` argument type. [#6494](https://github.com/ClickHouse/ClickHouse/pull/6494) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Added a test for bad URIs. [#6493](https://github.com/ClickHouse/ClickHouse/pull/6493) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added more checks to `CAST` function. This should get more information about segmentation fault in fuzzy test. [#6346](https://github.com/ClickHouse/ClickHouse/pull/6346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Added `gcc-9` support to `docker/builder` container that builds image locally. [#6333](https://github.com/ClickHouse/ClickHouse/pull/6333) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Test for primary key with `LowCardinality(String)`. [#5044](https://github.com/ClickHouse/ClickHouse/issues/5044) [#6219](https://github.com/ClickHouse/ClickHouse/pull/6219) ([dimarub2000](https://github.com/dimarub2000)) +- Fixed tests affected by slow stack traces printing. [#6315](https://github.com/ClickHouse/ClickHouse/pull/6315) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add a test case for crash in `groupUniqArray` fixed in [#6029](https://github.com/ClickHouse/ClickHouse/pull/6029). [#4402](https://github.com/ClickHouse/ClickHouse/issues/4402) [#6129](https://github.com/ClickHouse/ClickHouse/pull/6129) ([akuzm](https://github.com/akuzm)) +- Fixed indices mutations tests. [#6645](https://github.com/ClickHouse/ClickHouse/pull/6645) ([Nikita Vasilev](https://github.com/nikvas0)) +- In performance test, do not read query log for queries we didn’t run. [#6427](https://github.com/ClickHouse/ClickHouse/pull/6427) ([akuzm](https://github.com/akuzm)) +- Materialized view now could be created with any low cardinality types regardless to the setting about suspicious low cardinality types. [#6428](https://github.com/ClickHouse/ClickHouse/pull/6428) ([Olga Khvostikova](https://github.com/stavrolia)) +- Updated tests for `send_logs_level` setting. [#6207](https://github.com/ClickHouse/ClickHouse/pull/6207) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix build under gcc-8.2. [#6196](https://github.com/ClickHouse/ClickHouse/pull/6196) ([Max Akhmedov](https://github.com/zlobober)) +- Fix build with internal libc++. [#6724](https://github.com/ClickHouse/ClickHouse/pull/6724) ([Ivan](https://github.com/abyss7)) +- Fix shared build with `rdkafka` library [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) +- Fixes for Mac OS build (incomplete). [#6390](https://github.com/ClickHouse/ClickHouse/pull/6390) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6429](https://github.com/ClickHouse/ClickHouse/pull/6429) ([alex-zaitsev](https://github.com/alex-zaitsev)) +- Fix “splitted” build. [#6618](https://github.com/ClickHouse/ClickHouse/pull/6618) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Other build fixes: [#6186](https://github.com/ClickHouse/ClickHouse/pull/6186) ([Amos Bird](https://github.com/amosbird)) [#6486](https://github.com/ClickHouse/ClickHouse/pull/6486) [#6348](https://github.com/ClickHouse/ClickHouse/pull/6348) ([vxider](https://github.com/Vxider)) [#6744](https://github.com/ClickHouse/ClickHouse/pull/6744) ([Ivan](https://github.com/abyss7)) [#6016](https://github.com/ClickHouse/ClickHouse/pull/6016) [#6421](https://github.com/ClickHouse/ClickHouse/pull/6421) [#6491](https://github.com/ClickHouse/ClickHouse/pull/6491) ([proller](https://github.com/proller)) + +#### Backward Incompatible Change {#backward-incompatible-change-3} + +- Removed rarely used table function `catBoostPool` and storage `CatBoostPool`. If you have used this table function, please write email to `feedback@clickhouse.com`. Note that CatBoost integration remains and will be supported. [#6279](https://github.com/ClickHouse/ClickHouse/pull/6279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable `ANY RIGHT JOIN` and `ANY FULL JOIN` by default. Set `any_join_distinct_right_table_keys` setting to enable them. [#5126](https://github.com/ClickHouse/ClickHouse/issues/5126) [#6351](https://github.com/ClickHouse/ClickHouse/pull/6351) ([Artem Zuikov](https://github.com/4ertus2)) + +## ClickHouse Release 19.13 {#clickhouse-release-19-13} + +### ClickHouse Release 19.13.6.51, 2019-10-02 {#clickhouse-release-19-13-6-51-2019-10-02} + +#### Bug Fix {#bug-fix-9} + +- This release also contains all bug fixes from 19.11.12.69. + +### ClickHouse Release 19.13.5.44, 2019-09-20 {#clickhouse-release-19-13-5-44-2019-09-20} + +#### Bug Fix {#bug-fix-10} + +- This release also contains all bug fixes from 19.14.6.12. +- Fixed possible inconsistent state of table while executing `DROP` query for replicated table while zookeeper is not accessible. [#6045](https://github.com/ClickHouse/ClickHouse/issues/6045) [#6413](https://github.com/ClickHouse/ClickHouse/pull/6413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix for data race in StorageMerge [#6717](https://github.com/ClickHouse/ClickHouse/pull/6717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug introduced in query profiler which leads to endless recv from socket. [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) ([alesapin](https://github.com/alesapin)) +- Fix excessive CPU usage while executing `JSONExtractRaw` function over a boolean value. [#6208](https://github.com/ClickHouse/ClickHouse/pull/6208) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixes the regression while pushing to materialized view. [#6415](https://github.com/ClickHouse/ClickHouse/pull/6415) ([Ivan](https://github.com/abyss7)) +- Table function `url` had the vulnerability allowed the attacker to inject arbitrary HTTP headers in the request. This issue was found by [Nikita Tikhomirov](https://github.com/NSTikhomirov). [#6466](https://github.com/ClickHouse/ClickHouse/pull/6466) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix useless `AST` check in Set index. [#6510](https://github.com/ClickHouse/ClickHouse/issues/6510) [#6651](https://github.com/ClickHouse/ClickHouse/pull/6651) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed parsing of `AggregateFunction` values embedded in query. [#6575](https://github.com/ClickHouse/ClickHouse/issues/6575) [#6773](https://github.com/ClickHouse/ClickHouse/pull/6773) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed wrong behaviour of `trim` functions family. [#6647](https://github.com/ClickHouse/ClickHouse/pull/6647) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.13.4.32, 2019-09-10 {#clickhouse-release-19-13-4-32-2019-09-10} + +#### Bug Fix {#bug-fix-11} + +- This release also contains all bug security fixes from 19.11.9.52 and 19.11.10.54. +- Fixed data race in `system.parts` table and `ALTER` query. [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245) [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed mismatched header in streams happened in case of reading from empty distributed table with sample and prewhere. [#6167](https://github.com/ClickHouse/ClickHouse/issues/6167) ([Lixiang Qian](https://github.com/fancyqlx)) [#6823](https://github.com/ClickHouse/ClickHouse/pull/6823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed crash when using `IN` clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fix case with same column names in `GLOBAL JOIN ON` section. [#6181](https://github.com/ClickHouse/ClickHouse/pull/6181) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix crash when casting types to `Decimal` that do not support it. Throw exception instead. [#6297](https://github.com/ClickHouse/ClickHouse/pull/6297) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed crash in `extractAll()` function. [#6644](https://github.com/ClickHouse/ClickHouse/pull/6644) ([Artem Zuikov](https://github.com/4ertus2)) +- Query transformation for `MySQL`, `ODBC`, `JDBC` table functions now works properly for `SELECT WHERE` queries with multiple `AND` expressions. [#6381](https://github.com/ClickHouse/ClickHouse/issues/6381) [#6676](https://github.com/ClickHouse/ClickHouse/pull/6676) ([dimarub2000](https://github.com/dimarub2000)) +- Added previous declaration checks for MySQL 8 integration. [#6569](https://github.com/ClickHouse/ClickHouse/pull/6569) ([Rafael David Tinoco](https://github.com/rafaeldtinoco)) + +#### Security Fix {#security-fix-1} + +- Fix two vulnerabilities in codecs in decompression phase (malicious user can fabricate compressed data that will lead to buffer overflow in decompression). [#6670](https://github.com/ClickHouse/ClickHouse/pull/6670) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.13.3.26, 2019-08-22 {#clickhouse-release-19-13-3-26-2019-08-22} + +#### Bug Fix {#bug-fix-12} + +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix NPE when using IN clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fixed an issue that if a stale replica becomes alive, it may still have data parts that were removed by DROP PARTITION. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed issue with parsing CSV [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) +- Fixed data race in system.parts table and ALTER query. This fixes [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed possible data loss after `ALTER DELETE` query on table with skipping index. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Security Fix {#security-fix-2} + +- If the attacker has write access to ZooKeeper and is able to run custom server available from the network where ClickHouse run, it can create custom-built malicious server that will act as ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. Found by Eldar Zaitov, information security team at Yandex. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.13.2.19, 2019-08-14 {#clickhouse-release-19-13-2-19-2019-08-14} + +#### New Feature {#new-feature-5} + +- Sampling profiler on query level. [Example](https://gist.github.com/alexey-milovidov/92758583dd41c24c360fdb8d6a4da194). [#4247](https://github.com/ClickHouse/ClickHouse/issues/4247) ([laplab](https://github.com/laplab)) [#6124](https://github.com/ClickHouse/ClickHouse/pull/6124) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) +- Allow to specify a list of columns with `COLUMNS('regexp')` expression that works like a more sophisticated variant of `*` asterisk. [#5951](https://github.com/ClickHouse/ClickHouse/pull/5951) ([mfridental](https://github.com/mfridental)), ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CREATE TABLE AS table_function()` is now possible [#6057](https://github.com/ClickHouse/ClickHouse/pull/6057) ([dimarub2000](https://github.com/dimarub2000)) +- Adam optimizer for stochastic gradient descent is used by default in `stochasticLinearRegression()` and `stochasticLogisticRegression()` aggregate functions, because it shows good quality without almost any tuning. [#6000](https://github.com/ClickHouse/ClickHouse/pull/6000) ([Quid37](https://github.com/Quid37)) +- Added functions for working with the сustom week number [#5212](https://github.com/ClickHouse/ClickHouse/pull/5212) ([Andy Yang](https://github.com/andyyzh)) +- `RENAME` queries now work with all storages. [#5953](https://github.com/ClickHouse/ClickHouse/pull/5953) ([Ivan](https://github.com/abyss7)) +- Now client receive logs from server with any desired level by setting `send_logs_level` regardless to the log level specified in server settings. [#5964](https://github.com/ClickHouse/ClickHouse/pull/5964) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) + +#### Backward Incompatible Change {#backward-incompatible-change-4} + +- The setting `input_format_defaults_for_omitted_fields` is enabled by default. Inserts in Distributed tables need this setting to be the same on cluster (you need to set it before rolling update). It enables calculation of complex default expressions for omitted fields in `JSONEachRow` and `CSV*` formats. It should be the expected behavior but may lead to negligible performance difference. [#6043](https://github.com/ClickHouse/ClickHouse/pull/6043) ([Artem Zuikov](https://github.com/4ertus2)), [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) + +#### Experimental Features {#experimental-features} + +- New query processing pipeline. Use `experimental_use_processors=1` option to enable it. Use for your own trouble. [#4914](https://github.com/ClickHouse/ClickHouse/pull/4914) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Bug Fix {#bug-fix-13} + +- Kafka integration has been fixed in this version. +- Fixed `DoubleDelta` encoding of `Int64` for large `DoubleDelta` values, improved `DoubleDelta` encoding for random data for `Int32`. [#5998](https://github.com/ClickHouse/ClickHouse/pull/5998) ([Vasily Nemkov](https://github.com/Enmk)) +- Fixed overestimation of `max_rows_to_read` if the setting `merge_tree_uniform_read_distribution` is set to 0. [#6019](https://github.com/ClickHouse/ClickHouse/pull/6019) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement {#improvement-4} + +- Throws an exception if `config.d` file does not have the corresponding root element as the config file [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) + +#### Performance Improvement {#performance-improvement-3} + +- Optimize `count()`. Now it uses the smallest column (if possible). [#6028](https://github.com/ClickHouse/ClickHouse/pull/6028) ([Amos Bird](https://github.com/amosbird)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-5} + +- Report memory usage in performance tests. [#5899](https://github.com/ClickHouse/ClickHouse/pull/5899) ([akuzm](https://github.com/akuzm)) +- Fix build with external `libcxx` [#6010](https://github.com/ClickHouse/ClickHouse/pull/6010) ([Ivan](https://github.com/abyss7)) +- Fix shared build with `rdkafka` library [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) + +## ClickHouse Release 19.11 {#clickhouse-release-19-11} + +### ClickHouse Release 19.11.13.74, 2019-11-01 {#clickhouse-release-19-11-13-74-2019-11-01} + +#### Bug Fix {#bug-fix-14} + +- Fixed rare crash in `ALTER MODIFY COLUMN` and vertical merge when one of merged/altered parts is empty (0 rows). [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Manual update of `SIMDJSON`. This fixes possible flooding of stderr files with bogus json diagnostic messages. [#7548](https://github.com/ClickHouse/ClickHouse/pull/7548) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed bug with `mrk` file extension for mutations ([alesapin](https://github.com/alesapin)) + +### ClickHouse Release 19.11.12.69, 2019-10-02 {#clickhouse-release-19-11-12-69-2019-10-02} + +#### Bug Fix {#bug-fix-15} + +- Fixed performance degradation of index analysis on complex keys on large tables. This fixes [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924). [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid rare SIGSEGV while sending data in tables with Distributed engine (`Failed to send batch: file with index XXXXX is absent`). [#7032](https://github.com/ClickHouse/ClickHouse/pull/7032) ([Azat Khuzhin](https://github.com/azat)) +- Fix `Unknown identifier` with multiple joins. This fixes [#5254](https://github.com/ClickHouse/ClickHouse/issues/5254). [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.11.11.57, 2019-09-13 {#clickhouse-release-19-11-11-57-2019-09-13} + +- Fix logical error causing segfaults when selecting from Kafka empty topic. [#6902](https://github.com/ClickHouse/ClickHouse/issues/6902) [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) + +### ClickHouse Release 19.11.10.54, 2019-09-10 {#clickhouse-release-19-11-10-54-2019-09-10} + +#### Bug Fix {#bug-fix-16} + +- Do store offsets for Kafka messages manually to be able to commit them all at once for all partitions. Fixes potential duplication in “one consumer - many partitions” scenario. [#6872](https://github.com/ClickHouse/ClickHouse/pull/6872) ([Ivan](https://github.com/abyss7)) + +### ClickHouse Release 19.11.9.52, 2019-09-6 {#clickhouse-release-19-11-9-52-2019-09-6} + +- Improve error handling in cache dictionaries. [#6737](https://github.com/ClickHouse/ClickHouse/pull/6737) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed bug in function `arrayEnumerateUniqRanked`. [#6779](https://github.com/ClickHouse/ClickHouse/pull/6779) ([proller](https://github.com/proller)) +- Fix `JSONExtract` function while extracting a `Tuple` from JSON. [#6718](https://github.com/ClickHouse/ClickHouse/pull/6718) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed possible data loss after `ALTER DELETE` query on table with skipping index. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed performance test. [#6392](https://github.com/ClickHouse/ClickHouse/pull/6392) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Parquet: Fix reading boolean columns. [#6579](https://github.com/ClickHouse/ClickHouse/pull/6579) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong behaviour of `nullIf` function for constant arguments. [#6518](https://github.com/ClickHouse/ClickHouse/pull/6518) ([Guillaume Tassery](https://github.com/YiuRULE)) [#6580](https://github.com/ClickHouse/ClickHouse/pull/6580) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix Kafka messages duplication problem on normal server restart. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Fixed an issue when long `ALTER UPDATE` or `ALTER DELETE` may prevent regular merges to run. Prevent mutations from executing if there is no enough free threads available. [#6502](https://github.com/ClickHouse/ClickHouse/issues/6502) [#6617](https://github.com/ClickHouse/ClickHouse/pull/6617) ([tavplubix](https://github.com/tavplubix)) +- Fixed error with processing “timezone” in server configuration file. [#6709](https://github.com/ClickHouse/ClickHouse/pull/6709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix kafka tests. [#6805](https://github.com/ClickHouse/ClickHouse/pull/6805) ([Ivan](https://github.com/abyss7)) + +#### Security Fix {#security-fix-3} + +- If the attacker has write access to ZooKeeper and is able to run custom server available from the network where ClickHouse runs, it can create custom-built malicious server that will act as ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. Found by Eldar Zaitov, information security team at Yandex. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.8.46, 2019-08-22 {#clickhouse-release-19-11-8-46-2019-08-22} + +#### Bug Fix {#bug-fix-17} + +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix NPE when using IN clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fixed an issue that if a stale replica becomes alive, it may still have data parts that were removed by DROP PARTITION. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed issue with parsing CSV [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) +- Fixed data race in system.parts table and ALTER query. This fixes [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.7.40, 2019-08-14 {#clickhouse-release-19-11-7-40-2019-08-14} + +#### Bug Fix {#bug-fix-18} + +- Kafka integration has been fixed in this version. +- Fix segfault when using `arrayReduce` for constant arguments. [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `toFloat()` monotonicity. [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) +- Fix segfault with enabled `optimize_skip_unused_shards` and missing sharding key. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([CurtizJ](https://github.com/CurtizJ)) +- Fixed logic of `arrayEnumerateUniqRanked` function. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed extra verbose logging from MySQL handler. [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix wrong behavior and possible segfaults in `topK` and `topKWeighted` aggregated functions. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([CurtizJ](https://github.com/CurtizJ)) +- Do not expose virtual columns in `system.columns` table. This is required for backward compatibility. [#6406](https://github.com/ClickHouse/ClickHouse/pull/6406) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug with memory allocation for string fields in complex key cache dictionary. [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Fix bug with enabling adaptive granularity when creating new replica for `Replicated*MergeTree` table. [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Fix infinite loop when reading Kafka messages. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([abyss7](https://github.com/abyss7)) +- Fixed the possibility of a fabricated query to cause server crash due to stack overflow in SQL parser and possibility of stack overflow in `Merge` and `Distributed` tables [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed Gorilla encoding error on small sequences. [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Enmk](https://github.com/Enmk)) + +#### Improvement {#improvement-5} + +- Allow user to override `poll_interval` and `idle_connection_timeout` settings on connection. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.5.28, 2019-08-05 {#clickhouse-release-19-11-5-28-2019-08-05} + +#### Bug Fix {#bug-fix-19} + +- Fixed the possibility of hanging queries when server is overloaded. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix FPE in yandexConsistentHash function. This fixes [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304). [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed bug in conversion of `LowCardinality` types in `AggregateFunctionFactory`. This fixes [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix parsing of `bool` settings from `true` and `false` strings in configuration files. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Fix rare bug with incompatible stream headers in queries to `Distributed` table over `MergeTree` table when part of `WHERE` moves to `PREWHERE`. [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Fixed overflow in integer division of signed type to unsigned type. This fixes [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214). [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Backward Incompatible Change {#backward-incompatible-change-5} + +- `Kafka` still broken. + +### ClickHouse Release 19.11.4.24, 2019-08-01 {#clickhouse-release-19-11-4-24-2019-08-01} + +#### Bug Fix {#bug-fix-20} + +- Fix bug with writing secondary indices marks with adaptive granularity. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Fix `WITH ROLLUP` and `WITH CUBE` modifiers of `GROUP BY` with two-level aggregation. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed hang in `JSONExtractRaw` function. Fixed [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix segfault in ExternalLoader::reloadOutdated(). [#6082](https://github.com/ClickHouse/ClickHouse/pull/6082) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed the case when server may close listening sockets but not shutdown and continue serving remaining queries. You may end up with two running clickhouse-server processes. Sometimes, the server may return an error `bad_function_call` for remaining queries. [#6231](https://github.com/ClickHouse/ClickHouse/pull/6231) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed useless and incorrect condition on update field for initial loading of external dictionaries via ODBC, MySQL, ClickHouse and HTTP. This fixes [#6069](https://github.com/ClickHouse/ClickHouse/issues/6069) [#6083](https://github.com/ClickHouse/ClickHouse/pull/6083) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed irrelevant exception in cast of `LowCardinality(Nullable)` to not-Nullable column in case if it does not contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix non-deterministic result of “uniq” aggregate function in extreme rare cases. The bug was present in all ClickHouse versions. [#6058](https://github.com/ClickHouse/ClickHouse/pull/6058) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Segfault when we set a little bit too high CIDR on the function `IPv6CIDRToRange`. [#6068](https://github.com/ClickHouse/ClickHouse/pull/6068) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fixed small memory leak when server throw many exceptions from many different contexts. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix the situation when consumer got paused before subscription and not resumed afterwards. [#6075](https://github.com/ClickHouse/ClickHouse/pull/6075) ([Ivan](https://github.com/abyss7)) Note that Kafka is broken in this version. +- Clearing the Kafka data buffer from the previous read operation that was completed with an error [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) Note that Kafka is broken in this version. +- Since `StorageMergeTree::background_task_handle` is initialized in `startup()` the `MergeTreeBlockOutputStream::write()` may try to use it before initialization. Just check if it is initialized. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-6} + +- Added official `rpm` packages. [#5740](https://github.com/ClickHouse/ClickHouse/pull/5740) ([proller](https://github.com/proller)) ([alesapin](https://github.com/alesapin)) +- Add an ability to build `.rpm` and `.tgz` packages with `packager` script. [#5769](https://github.com/ClickHouse/ClickHouse/pull/5769) ([alesapin](https://github.com/alesapin)) +- Fixes for “Arcadia” build system. [#6223](https://github.com/ClickHouse/ClickHouse/pull/6223) ([proller](https://github.com/proller)) + +#### Backward Incompatible Change {#backward-incompatible-change-6} + +- `Kafka` is broken in this version. + +### ClickHouse Release 19.11.3.11, 2019-07-18 {#clickhouse-release-19-11-3-11-2019-07-18} + +#### New Feature {#new-feature-6} + +- Added support for prepared statements. [#5331](https://github.com/ClickHouse/ClickHouse/pull/5331/) ([Alexander](https://github.com/sanych73)) [#5630](https://github.com/ClickHouse/ClickHouse/pull/5630) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `DoubleDelta` and `Gorilla` column codecs [#5600](https://github.com/ClickHouse/ClickHouse/pull/5600) ([Vasily Nemkov](https://github.com/Enmk)) +- Added `os_thread_priority` setting that allows to control the “nice” value of query processing threads that is used by OS to adjust dynamic scheduling priority. It requires `CAP_SYS_NICE` capabilities to work. This implements [#5858](https://github.com/ClickHouse/ClickHouse/issues/5858) [#5909](https://github.com/ClickHouse/ClickHouse/pull/5909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implement `_topic`, `_offset`, `_key` columns for Kafka engine [#5382](https://github.com/ClickHouse/ClickHouse/pull/5382) ([Ivan](https://github.com/abyss7)) Note that Kafka is broken in this version. +- Add aggregate function combinator `-Resample` [#5590](https://github.com/ClickHouse/ClickHouse/pull/5590) ([hcz](https://github.com/hczhcz)) +- Aggregate functions `groupArrayMovingSum(win_size)(x)` and `groupArrayMovingAvg(win_size)(x)`, which calculate moving sum/avg with or without window-size limitation. [#5595](https://github.com/ClickHouse/ClickHouse/pull/5595) ([inv2004](https://github.com/inv2004)) +- Add synonim `arrayFlatten` \<-\> `flatten` [#5764](https://github.com/ClickHouse/ClickHouse/pull/5764) ([hcz](https://github.com/hczhcz)) +- Intergate H3 function `geoToH3` from Uber. [#4724](https://github.com/ClickHouse/ClickHouse/pull/4724) ([Remen Ivan](https://github.com/BHYCHIK)) [#5805](https://github.com/ClickHouse/ClickHouse/pull/5805) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Bug Fix {#bug-fix-21} + +- Implement DNS cache with asynchronous update. Separate thread resolves all hosts and updates DNS cache with period (setting `dns_cache_update_period`). It should help, when ip of hosts changes frequently. [#5857](https://github.com/ClickHouse/ClickHouse/pull/5857) ([Anton Popov](https://github.com/CurtizJ)) +- Fix segfault in `Delta` codec which affects columns with values less than 32 bits size. The bug led to random memory corruption. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Fix segfault in TTL merge with non-physical columns in block. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Fix rare bug in checking of part with `LowCardinality` column. Previously `checkDataPart` always fails for part with `LowCardinality` column. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Avoid hanging connections when server thread pool is full. It is important for connections from `remote` table function or connections to a shard without replicas when there is long connection timeout. This fixes [#5878](https://github.com/ClickHouse/ClickHouse/issues/5878) [#5881](https://github.com/ClickHouse/ClickHouse/pull/5881) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support for constant arguments to `evalMLModel` function. This fixes [#5817](https://github.com/ClickHouse/ClickHouse/issues/5817) [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed the issue when ClickHouse determines default time zone as `UCT` instead of `UTC`. This fixes [#5804](https://github.com/ClickHouse/ClickHouse/issues/5804). [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed buffer underflow in `visitParamExtractRaw`. This fixes [#5901](https://github.com/ClickHouse/ClickHouse/issues/5901) [#5902](https://github.com/ClickHouse/ClickHouse/pull/5902) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now distributed `DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER` queries will be executed directly on leader replica. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Fix `coalesce` for `ColumnConst` with `ColumnNullable` + related changes. [#5755](https://github.com/ClickHouse/ClickHouse/pull/5755) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix the `ReadBufferFromKafkaConsumer` so that it keeps reading new messages after `commit()` even if it was stalled before [#5852](https://github.com/ClickHouse/ClickHouse/pull/5852) ([Ivan](https://github.com/abyss7)) +- Fix `FULL` and `RIGHT` JOIN results when joining on `Nullable` keys in right table. [#5859](https://github.com/ClickHouse/ClickHouse/pull/5859) ([Artem Zuikov](https://github.com/4ertus2)) +- Possible fix of infinite sleeping of low-priority queries. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix race condition, which cause that some queries may not appear in query_log after `SYSTEM FLUSH LOGS` query. [#5456](https://github.com/ClickHouse/ClickHouse/issues/5456) [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed `heap-use-after-free` ASan warning in ClusterCopier caused by watch which try to use already removed copier object. [#5871](https://github.com/ClickHouse/ClickHouse/pull/5871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed wrong `StringRef` pointer returned by some implementations of `IColumn::deserializeAndInsertFromArena`. This bug affected only unit-tests. [#5973](https://github.com/ClickHouse/ClickHouse/pull/5973) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Prevent source and intermediate array join columns of masking same name columns. [#5941](https://github.com/ClickHouse/ClickHouse/pull/5941) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix insert and select query to MySQL engine with MySQL style identifier quoting. [#5704](https://github.com/ClickHouse/ClickHouse/pull/5704) ([Winter Zhang](https://github.com/zhang2014)) +- Now `CHECK TABLE` query can work with MergeTree engine family. It returns check status and message if any for each part (or file in case of simplier engines). Also, fix bug in fetch of a broken part. [#5865](https://github.com/ClickHouse/ClickHouse/pull/5865) ([alesapin](https://github.com/alesapin)) +- Fix SPLIT_SHARED_LIBRARIES runtime [#5793](https://github.com/ClickHouse/ClickHouse/pull/5793) ([Danila Kutenin](https://github.com/danlark1)) +- Fixed time zone initialization when `/etc/localtime` is a relative symlink like `../usr/share/zoneinfo/Asia/Istanbul` [#5922](https://github.com/ClickHouse/ClickHouse/pull/5922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- clickhouse-copier: Fix use-after free on shutdown [#5752](https://github.com/ClickHouse/ClickHouse/pull/5752) ([proller](https://github.com/proller)) +- Updated `simdjson`. Fixed the issue that some invalid JSONs with zero bytes successfully parse. [#5938](https://github.com/ClickHouse/ClickHouse/pull/5938) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix shutdown of SystemLogs [#5802](https://github.com/ClickHouse/ClickHouse/pull/5802) ([Anton Popov](https://github.com/CurtizJ)) +- Fix hanging when condition in invalidate_query depends on a dictionary. [#6011](https://github.com/ClickHouse/ClickHouse/pull/6011) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Improvement {#improvement-6} + +- Allow unresolvable addresses in cluster configuration. They will be considered unavailable and tried to resolve at every connection attempt. This is especially useful for Kubernetes. This fixes [#5714](https://github.com/ClickHouse/ClickHouse/issues/5714) [#5924](https://github.com/ClickHouse/ClickHouse/pull/5924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Close idle TCP connections (with one hour timeout by default). This is especially important for large clusters with multiple distributed tables on every server, because every server can possibly keep a connection pool to every other server, and after peak query concurrency, connections will stall. This fixes [#5879](https://github.com/ClickHouse/ClickHouse/issues/5879) [#5880](https://github.com/ClickHouse/ClickHouse/pull/5880) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Better quality of `topK` function. Changed the SavingSpace set behavior to remove the last element if the new element have a bigger weight. [#5833](https://github.com/ClickHouse/ClickHouse/issues/5833) [#5850](https://github.com/ClickHouse/ClickHouse/pull/5850) ([Guillaume Tassery](https://github.com/YiuRULE)) +- URL functions to work with domains now can work for incomplete URLs without scheme [#5725](https://github.com/ClickHouse/ClickHouse/pull/5725) ([alesapin](https://github.com/alesapin)) +- Checksums added to the `system.parts_columns` table. [#5874](https://github.com/ClickHouse/ClickHouse/pull/5874) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Added `Enum` data type as a synonim for `Enum8` or `Enum16`. [#5886](https://github.com/ClickHouse/ClickHouse/pull/5886) ([dimarub2000](https://github.com/dimarub2000)) +- Full bit transpose variant for `T64` codec. Could lead to better compression with `zstd`. [#5742](https://github.com/ClickHouse/ClickHouse/pull/5742) ([Artem Zuikov](https://github.com/4ertus2)) +- Condition on `startsWith` function now can uses primary key. This fixes [#5310](https://github.com/ClickHouse/ClickHouse/issues/5310) and [#5882](https://github.com/ClickHouse/ClickHouse/issues/5882) [#5919](https://github.com/ClickHouse/ClickHouse/pull/5919) ([dimarub2000](https://github.com/dimarub2000)) +- Allow to use `clickhouse-copier` with cross-replication cluster topology by permitting empty database name. [#5745](https://github.com/ClickHouse/ClickHouse/pull/5745) ([nvartolomei](https://github.com/nvartolomei)) +- Use `UTC` as default timezone on a system without `tzdata` (e.g. bare Docker container). Before this patch, error message `Could not determine local time zone` was printed and server or client refused to start. [#5827](https://github.com/ClickHouse/ClickHouse/pull/5827) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Returned back support for floating point argument in function `quantileTiming` for backward compatibility. [#5911](https://github.com/ClickHouse/ClickHouse/pull/5911) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Show which table is missing column in error messages. [#5768](https://github.com/ClickHouse/ClickHouse/pull/5768) ([Ivan](https://github.com/abyss7)) +- Disallow run query with same query_id by various users [#5430](https://github.com/ClickHouse/ClickHouse/pull/5430) ([proller](https://github.com/proller)) +- More robust code for sending metrics to Graphite. It will work even during long multiple `RENAME TABLE` operation. [#5875](https://github.com/ClickHouse/ClickHouse/pull/5875) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- More informative error messages will be displayed when ThreadPool cannot schedule a task for execution. This fixes [#5305](https://github.com/ClickHouse/ClickHouse/issues/5305) [#5801](https://github.com/ClickHouse/ClickHouse/pull/5801) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Inverting ngramSearch to be more intuitive [#5807](https://github.com/ClickHouse/ClickHouse/pull/5807) ([Danila Kutenin](https://github.com/danlark1)) +- Add user parsing in HDFS engine builder [#5946](https://github.com/ClickHouse/ClickHouse/pull/5946) ([akonyaev90](https://github.com/akonyaev90)) +- Update default value of `max_ast_elements parameter` [#5933](https://github.com/ClickHouse/ClickHouse/pull/5933) ([Artem Konovalov](https://github.com/izebit)) +- Added a notion of obsolete settings. The obsolete setting `allow_experimental_low_cardinality_type` can be used with no effect. [0f15c01c6802f7ce1a1494c12c846be8c98944cd](https://github.com/ClickHouse/ClickHouse/commit/0f15c01c6802f7ce1a1494c12c846be8c98944cd) [Alexey Milovidov](https://github.com/alexey-milovidov) + +#### Performance Improvement {#performance-improvement-4} + +- Increase number of streams to SELECT from Merge table for more uniform distribution of threads. Added setting `max_streams_multiplier_for_merge_tables`. This fixes [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5915](https://github.com/ClickHouse/ClickHouse/pull/5915) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-7} + +- Add a backward compatibility test for client-server interaction with different versions of clickhouse. [#5868](https://github.com/ClickHouse/ClickHouse/pull/5868) ([alesapin](https://github.com/alesapin)) +- Test coverage information in every commit and pull request. [#5896](https://github.com/ClickHouse/ClickHouse/pull/5896) ([alesapin](https://github.com/alesapin)) +- Cooperate with address sanitizer to support our custom allocators (`Arena` and `ArenaWithFreeLists`) for better debugging of “use-after-free” errors. [#5728](https://github.com/ClickHouse/ClickHouse/pull/5728) ([akuzm](https://github.com/akuzm)) +- Switch to [LLVM libunwind implementation](https://github.com/llvm-mirror/libunwind) for C++ exception handling and for stack traces printing [#4828](https://github.com/ClickHouse/ClickHouse/pull/4828) ([Nikita Lapkov](https://github.com/laplab)) +- Add two more warnings from -Weverything [#5923](https://github.com/ClickHouse/ClickHouse/pull/5923) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to build ClickHouse with Memory Sanitizer. [#3949](https://github.com/ClickHouse/ClickHouse/pull/3949) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed ubsan report about `bitTest` function in fuzz test. [#5943](https://github.com/ClickHouse/ClickHouse/pull/5943) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Docker: added possibility to init a ClickHouse instance which requires authentication. [#5727](https://github.com/ClickHouse/ClickHouse/pull/5727) ([Korviakov Andrey](https://github.com/shurshun)) +- Update librdkafka to version 1.1.0 [#5872](https://github.com/ClickHouse/ClickHouse/pull/5872) ([Ivan](https://github.com/abyss7)) +- Add global timeout for integration tests and disable some of them in tests code. [#5741](https://github.com/ClickHouse/ClickHouse/pull/5741) ([alesapin](https://github.com/alesapin)) +- Fix some ThreadSanitizer failures. [#5854](https://github.com/ClickHouse/ClickHouse/pull/5854) ([akuzm](https://github.com/akuzm)) +- The `--no-undefined` option forces the linker to check all external names for existence while linking. It’s very useful to track real dependencies between libraries in the split build mode. [#5855](https://github.com/ClickHouse/ClickHouse/pull/5855) ([Ivan](https://github.com/abyss7)) +- Added performance test for [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5914](https://github.com/ClickHouse/ClickHouse/pull/5914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed compatibility with gcc-7. [#5840](https://github.com/ClickHouse/ClickHouse/pull/5840) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added support for gcc-9. This fixes [#5717](https://github.com/ClickHouse/ClickHouse/issues/5717) [#5774](https://github.com/ClickHouse/ClickHouse/pull/5774) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when libunwind can be linked incorrectly. [#5948](https://github.com/ClickHouse/ClickHouse/pull/5948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a few warnings found by PVS-Studio. [#5921](https://github.com/ClickHouse/ClickHouse/pull/5921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added initial support for `clang-tidy` static analyzer. [#5806](https://github.com/ClickHouse/ClickHouse/pull/5806) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Convert BSD/Linux endian macros( ‘be64toh’ and ‘htobe64’) to the Mac OS X equivalents [#5785](https://github.com/ClickHouse/ClickHouse/pull/5785) ([Fu Chen](https://github.com/fredchenbj)) +- Improved integration tests guide. [#5796](https://github.com/ClickHouse/ClickHouse/pull/5796) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixing build at macosx + gcc9 [#5822](https://github.com/ClickHouse/ClickHouse/pull/5822) ([filimonov](https://github.com/filimonov)) +- Fix a hard-to-spot typo: aggreAGte -\> aggregate. [#5753](https://github.com/ClickHouse/ClickHouse/pull/5753) ([akuzm](https://github.com/akuzm)) +- Fix freebsd build [#5760](https://github.com/ClickHouse/ClickHouse/pull/5760) ([proller](https://github.com/proller)) +- Add link to experimental YouTube channel to website [#5845](https://github.com/ClickHouse/ClickHouse/pull/5845) ([Ivan Blinkov](https://github.com/blinkov)) +- CMake: add option for coverage flags: WITH_COVERAGE [#5776](https://github.com/ClickHouse/ClickHouse/pull/5776) ([proller](https://github.com/proller)) +- Fix initial size of some inline PODArray’s. [#5787](https://github.com/ClickHouse/ClickHouse/pull/5787) ([akuzm](https://github.com/akuzm)) +- clickhouse-server.postinst: fix os detection for centos 6 [#5788](https://github.com/ClickHouse/ClickHouse/pull/5788) ([proller](https://github.com/proller)) +- Added Arch linux package generation. [#5719](https://github.com/ClickHouse/ClickHouse/pull/5719) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Split Common/config.h by libs (dbms) [#5715](https://github.com/ClickHouse/ClickHouse/pull/5715) ([proller](https://github.com/proller)) +- Fixes for “Arcadia” build platform [#5795](https://github.com/ClickHouse/ClickHouse/pull/5795) ([proller](https://github.com/proller)) +- Fixes for unconventional build (gcc9, no submodules) [#5792](https://github.com/ClickHouse/ClickHouse/pull/5792) ([proller](https://github.com/proller)) +- Require explicit type in unalignedStore because it was proven to be bug-prone [#5791](https://github.com/ClickHouse/ClickHouse/pull/5791) ([akuzm](https://github.com/akuzm)) +- Fixes macOS build [#5830](https://github.com/ClickHouse/ClickHouse/pull/5830) ([filimonov](https://github.com/filimonov)) +- Performance test concerning the new JIT feature with bigger dataset, as requested here [#5263](https://github.com/ClickHouse/ClickHouse/issues/5263) [#5887](https://github.com/ClickHouse/ClickHouse/pull/5887) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Run stateful tests in stress test [12693e568722f11e19859742f56428455501fd2a](https://github.com/ClickHouse/ClickHouse/commit/12693e568722f11e19859742f56428455501fd2a) ([alesapin](https://github.com/alesapin)) + +#### Backward Incompatible Change {#backward-incompatible-change-7} + +- `Kafka` is broken in this version. +- Enable `adaptive_index_granularity` = 10MB by default for new `MergeTree` tables. If you created new MergeTree tables on version 19.11+, downgrade to versions prior to 19.6 will be impossible. [#5628](https://github.com/ClickHouse/ClickHouse/pull/5628) ([alesapin](https://github.com/alesapin)) +- Removed obsolete undocumented embedded dictionaries that were used by Yandex.Metrica. The functions `OSIn`, `SEIn`, `OSToRoot`, `SEToRoot`, `OSHierarchy`, `SEHierarchy` are no longer available. If you are using these functions, write email to clickhouse-feedback@yandex-team.com. Note: at the last moment we decided to keep these functions for a while. [#5780](https://github.com/ClickHouse/ClickHouse/pull/5780) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.10 {#clickhouse-release-19-10} + +### ClickHouse Release 19.10.1.5, 2019-07-12 {#clickhouse-release-19-10-1-5-2019-07-12} + +#### New Feature {#new-feature-7} + +- Add new column codec: `T64`. Made for (U)IntX/EnumX/Data(Time)/DecimalX columns. It should be good for columns with constant or small range values. Codec itself allows enlarge or shrink data type without re-compression. [#5557](https://github.com/ClickHouse/ClickHouse/pull/5557) ([Artem Zuikov](https://github.com/4ertus2)) +- Add database engine `MySQL` that allow to view all the tables in remote MySQL server [#5599](https://github.com/ClickHouse/ClickHouse/pull/5599) ([Winter Zhang](https://github.com/zhang2014)) +- `bitmapContains` implementation. It’s 2x faster than `bitmapHasAny` if the second bitmap contains one element. [#5535](https://github.com/ClickHouse/ClickHouse/pull/5535) ([Zhichang Yu](https://github.com/yuzhichang)) +- Support for `crc32` function (with behaviour exactly as in MySQL or PHP). Do not use it if you need a hash function. [#5661](https://github.com/ClickHouse/ClickHouse/pull/5661) ([Remen Ivan](https://github.com/BHYCHIK)) +- Implemented `SYSTEM START/STOP DISTRIBUTED SENDS` queries to control asynchronous inserts into `Distributed` tables. [#4935](https://github.com/ClickHouse/ClickHouse/pull/4935) ([Winter Zhang](https://github.com/zhang2014)) + +#### Bug Fix {#bug-fix-22} + +- Ignore query execution limits and max parts size for merge limits while executing mutations. [#5659](https://github.com/ClickHouse/ClickHouse/pull/5659) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug which may lead to deduplication of normal blocks (extremely rare) and insertion of duplicate blocks (more often). [#5549](https://github.com/ClickHouse/ClickHouse/pull/5549) ([alesapin](https://github.com/alesapin)) +- Fix of function `arrayEnumerateUniqRanked` for arguments with empty arrays [#5559](https://github.com/ClickHouse/ClickHouse/pull/5559) ([proller](https://github.com/proller)) +- Don’t subscribe to Kafka topics without intent to poll any messages. [#5698](https://github.com/ClickHouse/ClickHouse/pull/5698) ([Ivan](https://github.com/abyss7)) +- Make setting `join_use_nulls` get no effect for types that cannot be inside Nullable [#5700](https://github.com/ClickHouse/ClickHouse/pull/5700) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed `Incorrect size of index granularity` errors [#5720](https://github.com/ClickHouse/ClickHouse/pull/5720) ([coraxster](https://github.com/coraxster)) +- Fix Float to Decimal convert overflow [#5607](https://github.com/ClickHouse/ClickHouse/pull/5607) ([coraxster](https://github.com/coraxster)) +- Flush buffer when `WriteBufferFromHDFS`’s destructor is called. This fixes writing into `HDFS`. [#5684](https://github.com/ClickHouse/ClickHouse/pull/5684) ([Xindong Peng](https://github.com/eejoin)) + +#### Improvement {#improvement-7} + +- Treat empty cells in `CSV` as default values when the setting `input_format_defaults_for_omitted_fields` is enabled. [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) +- Non-blocking loading of external dictionaries. [#5567](https://github.com/ClickHouse/ClickHouse/pull/5567) ([Vitaly Baranov](https://github.com/vitlibar)) +- Network timeouts can be dynamically changed for already established connections according to the settings. [#4558](https://github.com/ClickHouse/ClickHouse/pull/4558) ([Konstantin Podshumok](https://github.com/podshumok)) +- Using “public_suffix_list” for functions `firstSignificantSubdomain`, `cutToFirstSignificantSubdomain`. It’s using a perfect hash table generated by `gperf` with a list generated from the file: https://publicsuffix.org/list/public_suffix_list.dat. (for example, now we recognize the domain `ac.uk` as non-significant). [#5030](https://github.com/ClickHouse/ClickHouse/pull/5030) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Adopted `IPv6` data type in system tables; unified client info columns in `system.processes` and `system.query_log` [#5640](https://github.com/ClickHouse/ClickHouse/pull/5640) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using sessions for connections with MySQL compatibility protocol. #5476 [#5646](https://github.com/ClickHouse/ClickHouse/pull/5646) ([Yuriy Baranov](https://github.com/yurriy)) +- Support more `ALTER` queries `ON CLUSTER`. [#5593](https://github.com/ClickHouse/ClickHouse/pull/5593) [#5613](https://github.com/ClickHouse/ClickHouse/pull/5613) ([sundyli](https://github.com/sundy-li)) +- Support `` section in `clickhouse-local` config file. [#5540](https://github.com/ClickHouse/ClickHouse/pull/5540) ([proller](https://github.com/proller)) +- Allow run query with `remote` table function in `clickhouse-local` [#5627](https://github.com/ClickHouse/ClickHouse/pull/5627) ([proller](https://github.com/proller)) + +#### Performance Improvement {#performance-improvement-5} + +- Add the possibility to write the final mark at the end of MergeTree columns. It allows to avoid useless reads for keys that are out of table data range. It is enabled only if adaptive index granularity is in use. [#5624](https://github.com/ClickHouse/ClickHouse/pull/5624) ([alesapin](https://github.com/alesapin)) +- Improved performance of MergeTree tables on very slow filesystems by reducing number of `stat` syscalls. [#5648](https://github.com/ClickHouse/ClickHouse/pull/5648) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed performance degradation in reading from MergeTree tables that was introduced in version 19.6. Fixes #5631. [#5633](https://github.com/ClickHouse/ClickHouse/pull/5633) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-8} + +- Implemented `TestKeeper` as an implementation of ZooKeeper interface used for testing [#5643](https://github.com/ClickHouse/ClickHouse/pull/5643) ([alexey-milovidov](https://github.com/alexey-milovidov)) ([levushkin aleksej](https://github.com/alexey-milovidov)) +- From now on `.sql` tests can be run isolated by server, in parallel, with random database. It allows to run them faster, add new tests with custom server configurations, and be sure that different tests does not affect each other. [#5554](https://github.com/ClickHouse/ClickHouse/pull/5554) ([Ivan](https://github.com/abyss7)) +- Remove `` and `` from performance tests [#5672](https://github.com/ClickHouse/ClickHouse/pull/5672) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed “select_format” performance test for `Pretty` formats [#5642](https://github.com/ClickHouse/ClickHouse/pull/5642) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.9 {#clickhouse-release-19-9} + +### ClickHouse Release 19.9.3.31, 2019-07-05 {#clickhouse-release-19-9-3-31-2019-07-05} + +#### Bug Fix {#bug-fix-23} + +- Fix segfault in Delta codec which affects columns with values less than 32 bits size. The bug led to random memory corruption. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Fix rare bug in checking of part with LowCardinality column. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Fix segfault in TTL merge with non-physical columns in block. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Fix potential infinite sleeping of low-priority queries. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix how ClickHouse determines default time zone as UCT instead of UTC. [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug about executing distributed DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER queries on follower replica before leader replica. Now they will be executed directly on leader replica. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Fix race condition, which cause that some queries may not appear in query_log instantly after SYSTEM FLUSH LOGS query. [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Added missing support for constant arguments to `evalMLModel` function. [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.9.2.4, 2019-06-24 {#clickhouse-release-19-9-2-4-2019-06-24} + +#### New Feature {#new-feature-8} + +- Print information about frozen parts in `system.parts` table. [#5471](https://github.com/ClickHouse/ClickHouse/pull/5471) ([proller](https://github.com/proller)) +- Ask client password on clickhouse-client start on tty if not set in arguments [#5092](https://github.com/ClickHouse/ClickHouse/pull/5092) ([proller](https://github.com/proller)) +- Implement `dictGet` and `dictGetOrDefault` functions for Decimal types. [#5394](https://github.com/ClickHouse/ClickHouse/pull/5394) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvement {#improvement-8} + +- Debian init: Add service stop timeout [#5522](https://github.com/ClickHouse/ClickHouse/pull/5522) ([proller](https://github.com/proller)) +- Add setting forbidden by default to create table with suspicious types for LowCardinality [#5448](https://github.com/ClickHouse/ClickHouse/pull/5448) ([Olga Khvostikova](https://github.com/stavrolia)) +- Regression functions return model weights when not used as State in function `evalMLMethod`. [#5411](https://github.com/ClickHouse/ClickHouse/pull/5411) ([Quid37](https://github.com/Quid37)) +- Rename and improve regression methods. [#5492](https://github.com/ClickHouse/ClickHouse/pull/5492) ([Quid37](https://github.com/Quid37)) +- Clearer interfaces of string searchers. [#5586](https://github.com/ClickHouse/ClickHouse/pull/5586) ([Danila Kutenin](https://github.com/danlark1)) + +#### Bug Fix {#bug-fix-24} + +- Fix potential data loss in Kafka [#5445](https://github.com/ClickHouse/ClickHouse/pull/5445) ([Ivan](https://github.com/abyss7)) +- Fix potential infinite loop in `PrettySpace` format when called with zero columns [#5560](https://github.com/ClickHouse/ClickHouse/pull/5560) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed UInt32 overflow bug in linear models. Allow eval ML model for non-const model argument. [#5516](https://github.com/ClickHouse/ClickHouse/pull/5516) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `ALTER TABLE ... DROP INDEX IF EXISTS ...` should not raise an exception if provided index does not exist [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Fix segfault with `bitmapHasAny` in scalar subquery [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed error when replication connection pool does not retry to resolve host, even when DNS cache was dropped. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fixed `ALTER ... MODIFY TTL` on ReplicatedMergeTree. [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539) ([Anton Popov](https://github.com/CurtizJ)) +- Fix INSERT into Distributed table with MATERIALIZED column [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) +- Fix bad alloc when truncate Join storage [#5437](https://github.com/ClickHouse/ClickHouse/pull/5437) ([TCeason](https://github.com/TCeason)) +- In recent versions of package tzdata some of files are symlinks now. The current mechanism for detecting default timezone gets broken and gives wrong names for some timezones. Now at least we force the timezone name to the contents of TZ if provided. [#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- Fix some extremely rare cases with MultiVolnitsky searcher when the constant needles in sum are at least 16KB long. The algorithm missed or overwrote the previous results which can lead to the incorrect result of `multiSearchAny`. [#5588](https://github.com/ClickHouse/ClickHouse/pull/5588) ([Danila Kutenin](https://github.com/danlark1)) +- Fix the issue when settings for ExternalData requests couldn’t use ClickHouse settings. Also, for now, settings `date_time_input_format` and `low_cardinality_allow_in_native_format` cannot be used because of the ambiguity of names (in external data it can be interpreted as table format and in the query it can be a setting). [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila Kutenin](https://github.com/danlark1)) +- Fix bug when parts were removed only from FS without dropping them from Zookeeper. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Remove debug logging from MySQL protocol [#5478](https://github.com/ClickHouse/ClickHouse/pull/5478) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Skip ZNONODE during DDL query processing [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fix mix `UNION ALL` result column type. There were cases with inconsistent data and column types of resulting columns. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Throw an exception on wrong integers in `dictGetT` functions instead of crash. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix wrong element_count and load_factor for hashed dictionary in `system.dictionaries` table. [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-9} + +- Fixed build without `Brotli` HTTP compression support (`ENABLE_BROTLI=OFF` cmake variable). [#5521](https://github.com/ClickHouse/ClickHouse/pull/5521) ([Anton Yuzhaninov](https://github.com/citrin)) +- Include roaring.h as roaring/roaring.h [#5523](https://github.com/ClickHouse/ClickHouse/pull/5523) ([Orivej Desh](https://github.com/orivej)) +- Fix gcc9 warnings in hyperscan (#line directive is evil!) [#5546](https://github.com/ClickHouse/ClickHouse/pull/5546) ([Danila Kutenin](https://github.com/danlark1)) +- Fix all warnings when compiling with gcc-9. Fix some contrib issues. Fix gcc9 ICE and submit it to bugzilla. [#5498](https://github.com/ClickHouse/ClickHouse/pull/5498) ([Danila Kutenin](https://github.com/danlark1)) +- Fixed linking with lld [#5477](https://github.com/ClickHouse/ClickHouse/pull/5477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Remove unused specializations in dictionaries [#5452](https://github.com/ClickHouse/ClickHouse/pull/5452) ([Artem Zuikov](https://github.com/4ertus2)) +- Improvement performance tests for formatting and parsing tables for different types of files [#5497](https://github.com/ClickHouse/ClickHouse/pull/5497) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixes for parallel test run [#5506](https://github.com/ClickHouse/ClickHouse/pull/5506) ([proller](https://github.com/proller)) +- Docker: use configs from clickhouse-test [#5531](https://github.com/ClickHouse/ClickHouse/pull/5531) ([proller](https://github.com/proller)) +- Fix compile for FreeBSD [#5447](https://github.com/ClickHouse/ClickHouse/pull/5447) ([proller](https://github.com/proller)) +- Upgrade boost to 1.70 [#5570](https://github.com/ClickHouse/ClickHouse/pull/5570) ([proller](https://github.com/proller)) +- Fix build clickhouse as submodule [#5574](https://github.com/ClickHouse/ClickHouse/pull/5574) ([proller](https://github.com/proller)) +- Improve JSONExtract performance tests [#5444](https://github.com/ClickHouse/ClickHouse/pull/5444) ([Vitaly Baranov](https://github.com/vitlibar)) + +## ClickHouse Release 19.8 {#clickhouse-release-19-8} + +### ClickHouse Release 19.8.3.8, 2019-06-11 {#clickhouse-release-19-8-3-8-2019-06-11} + +#### New Features {#new-features} + +- Added functions to work with JSON [#4686](https://github.com/ClickHouse/ClickHouse/pull/4686) ([hcz](https://github.com/hczhcz)) [#5124](https://github.com/ClickHouse/ClickHouse/pull/5124). ([Vitaly Baranov](https://github.com/vitlibar)) +- Add a function basename, with a similar behaviour to a basename function, which exists in a lot of languages (`os.path.basename` in python, `basename` in PHP, etc…). Work with both an UNIX-like path or a Windows path. [#5136](https://github.com/ClickHouse/ClickHouse/pull/5136) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Added `LIMIT n, m BY` or `LIMIT m OFFSET n BY` syntax to set offset of n for LIMIT BY clause. [#5138](https://github.com/ClickHouse/ClickHouse/pull/5138) ([Anton Popov](https://github.com/CurtizJ)) +- Added new data type `SimpleAggregateFunction`, which allows to have columns with light aggregation in an `AggregatingMergeTree`. This can only be used with simple functions like `any`, `anyLast`, `sum`, `min`, `max`. [#4629](https://github.com/ClickHouse/ClickHouse/pull/4629) ([Boris Granveaud](https://github.com/bgranvea)) +- Added support for non-constant arguments in function `ngramDistance` [#5198](https://github.com/ClickHouse/ClickHouse/pull/5198) ([Danila Kutenin](https://github.com/danlark1)) +- Added functions `skewPop`, `skewSamp`, `kurtPop` and `kurtSamp` to compute for sequence skewness, sample skewness, kurtosis and sample kurtosis respectively. [#5200](https://github.com/ClickHouse/ClickHouse/pull/5200) ([hcz](https://github.com/hczhcz)) +- Support rename operation for `MaterializeView` storage. [#5209](https://github.com/ClickHouse/ClickHouse/pull/5209) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Added server which allows connecting to ClickHouse using MySQL client. [#4715](https://github.com/ClickHouse/ClickHouse/pull/4715) ([Yuriy Baranov](https://github.com/yurriy)) +- Add `toDecimal*OrZero` and `toDecimal*OrNull` functions. [#5291](https://github.com/ClickHouse/ClickHouse/pull/5291) ([Artem Zuikov](https://github.com/4ertus2)) +- Support Decimal types in functions: `quantile`, `quantiles`, `median`, `quantileExactWeighted`, `quantilesExactWeighted`, medianExactWeighted. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) +- Added `toValidUTF8` function, which replaces all invalid UTF-8 characters by replacement character � (U+FFFD). [#5322](https://github.com/ClickHouse/ClickHouse/pull/5322) ([Danila Kutenin](https://github.com/danlark1)) +- Added `format` function. Formatting constant pattern (simplified Python format pattern) with the strings listed in the arguments. [#5330](https://github.com/ClickHouse/ClickHouse/pull/5330) ([Danila Kutenin](https://github.com/danlark1)) +- Added `system.detached_parts` table containing information about detached parts of `MergeTree` tables. [#5353](https://github.com/ClickHouse/ClickHouse/pull/5353) ([akuzm](https://github.com/akuzm)) +- Added `ngramSearch` function to calculate the non-symmetric difference between needle and haystack. [#5418](https://github.com/ClickHouse/ClickHouse/pull/5418)[#5422](https://github.com/ClickHouse/ClickHouse/pull/5422) ([Danila Kutenin](https://github.com/danlark1)) +- Implementation of basic machine learning methods (stochastic linear regression and logistic regression) using aggregate functions interface. Has different strategies for updating model weights (simple gradient descent, momentum method, Nesterov method). Also supports mini-batches of custom size. [#4943](https://github.com/ClickHouse/ClickHouse/pull/4943) ([Quid37](https://github.com/Quid37)) +- Implementation of `geohashEncode` and `geohashDecode` functions. [#5003](https://github.com/ClickHouse/ClickHouse/pull/5003) ([Vasily Nemkov](https://github.com/Enmk)) +- Added aggregate function `timeSeriesGroupSum`, which can aggregate different time series that sample timestamp not alignment. It will use linear interpolation between two sample timestamp and then sum time-series together. Added aggregate function `timeSeriesGroupRateSum`, which calculates the rate of time-series and then sum rates together. [#4542](https://github.com/ClickHouse/ClickHouse/pull/4542) ([Yangkuan Liu](https://github.com/LiuYangkuan)) +- Added functions `IPv4CIDRtoIPv4Range` and `IPv6CIDRtoIPv6Range` to calculate the lower and higher bounds for an IP in the subnet using a CIDR. [#5095](https://github.com/ClickHouse/ClickHouse/pull/5095) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Add a X-ClickHouse-Summary header when we send a query using HTTP with enabled setting `send_progress_in_http_headers`. Return the usual information of X-ClickHouse-Progress, with additional information like how many rows and bytes were inserted in the query. [#5116](https://github.com/ClickHouse/ClickHouse/pull/5116) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Improvements {#improvements} + +- Added `max_parts_in_total` setting for MergeTree family of tables (default: 100 000) that prevents unsafe specification of partition key #5166. [#5171](https://github.com/ClickHouse/ClickHouse/pull/5171) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-obfuscator`: derive seed for individual columns by combining initial seed with column name, not column position. This is intended to transform datasets with multiple related tables, so that tables will remain JOINable after transformation. [#5178](https://github.com/ClickHouse/ClickHouse/pull/5178) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added functions `JSONExtractRaw`, `JSONExtractKeyAndValues`. Renamed functions `jsonExtract` to `JSONExtract`. When something goes wrong these functions return the correspondent values, not `NULL`. Modified function `JSONExtract`, now it gets the return type from its last parameter and does not inject nullables. Implemented fallback to RapidJSON in case AVX2 instructions are not available. Simdjson library updated to a new version. [#5235](https://github.com/ClickHouse/ClickHouse/pull/5235) ([Vitaly Baranov](https://github.com/vitlibar)) +- Now `if` and `multiIf` functions do not rely on the condition’s `Nullable`, but rely on the branches for sql compatibility. [#5238](https://github.com/ClickHouse/ClickHouse/pull/5238) ([Jian Wu](https://github.com/janplus)) +- `In` predicate now generates `Null` result from `Null` input like the `Equal` function. [#5152](https://github.com/ClickHouse/ClickHouse/pull/5152) ([Jian Wu](https://github.com/janplus)) +- Check the time limit every (flush_interval / poll_timeout) number of rows from Kafka. This allows to break the reading from Kafka consumer more frequently and to check the time limits for the top-level streams [#5249](https://github.com/ClickHouse/ClickHouse/pull/5249) ([Ivan](https://github.com/abyss7)) +- Link rdkafka with bundled SASL. It should allow to use SASL SCRAM authentication [#5253](https://github.com/ClickHouse/ClickHouse/pull/5253) ([Ivan](https://github.com/abyss7)) +- Batched version of RowRefList for ALL JOINS. [#5267](https://github.com/ClickHouse/ClickHouse/pull/5267) ([Artem Zuikov](https://github.com/4ertus2)) +- clickhouse-server: more informative listen error messages. [#5268](https://github.com/ClickHouse/ClickHouse/pull/5268) ([proller](https://github.com/proller)) +- Support dictionaries in clickhouse-copier for functions in `` [#5270](https://github.com/ClickHouse/ClickHouse/pull/5270) ([proller](https://github.com/proller)) +- Add new setting `kafka_commit_every_batch` to regulate Kafka committing policy. + It allows to set commit mode: after every batch of messages is handled, or after the whole block is written to the storage. It’s a trade-off between losing some messages or reading them twice in some extreme situations. [#5308](https://github.com/ClickHouse/ClickHouse/pull/5308) ([Ivan](https://github.com/abyss7)) +- Make `windowFunnel` support other Unsigned Integer Types. [#5320](https://github.com/ClickHouse/ClickHouse/pull/5320) ([sundyli](https://github.com/sundy-li)) +- Allow to shadow virtual column `_table` in Merge engine. [#5325](https://github.com/ClickHouse/ClickHouse/pull/5325) ([Ivan](https://github.com/abyss7)) +- Make `sequenceMatch` aggregate functions support other unsigned Integer types [#5339](https://github.com/ClickHouse/ClickHouse/pull/5339) ([sundyli](https://github.com/sundy-li)) +- Better error messages if checksum mismatch is most likely caused by hardware failures. [#5355](https://github.com/ClickHouse/ClickHouse/pull/5355) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Check that underlying tables support sampling for `StorageMerge` [#5366](https://github.com/ClickHouse/ClickHouse/pull/5366) ([Ivan](https://github.com/abyss7)) +- Сlose MySQL connections after their usage in external dictionaries. It is related to issue #893. [#5395](https://github.com/ClickHouse/ClickHouse/pull/5395) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Improvements of MySQL Wire Protocol. Changed name of format to MySQLWire. Using RAII for calling RSA_free. Disabling SSL if context cannot be created. [#5419](https://github.com/ClickHouse/ClickHouse/pull/5419) ([Yuriy Baranov](https://github.com/yurriy)) +- clickhouse-client: allow to run with unaccessable history file (read-only, no disk space, file is directory, …). [#5431](https://github.com/ClickHouse/ClickHouse/pull/5431) ([proller](https://github.com/proller)) +- Respect query settings in asynchronous INSERTs into Distributed tables. [#4936](https://github.com/ClickHouse/ClickHouse/pull/4936) ([TCeason](https://github.com/TCeason)) +- Renamed functions `leastSqr` to `simpleLinearRegression`, `LinearRegression` to `linearRegression`, `LogisticRegression` to `logisticRegression`. [#5391](https://github.com/ClickHouse/ClickHouse/pull/5391) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Performance Improvements {#performance-improvements} + +- Parallelize processing of parts of non-replicated MergeTree tables in ALTER MODIFY query. [#4639](https://github.com/ClickHouse/ClickHouse/pull/4639) ([Ivan Kush](https://github.com/IvanKush)) +- Optimizations in regular expressions extraction. [#5193](https://github.com/ClickHouse/ClickHouse/pull/5193) [#5191](https://github.com/ClickHouse/ClickHouse/pull/5191) ([Danila Kutenin](https://github.com/danlark1)) +- Do not add right join key column to join result if it’s used only in join on section. [#5260](https://github.com/ClickHouse/ClickHouse/pull/5260) ([Artem Zuikov](https://github.com/4ertus2)) +- Freeze the Kafka buffer after first empty response. It avoids multiple invokations of `ReadBuffer::next()` for empty result in some row-parsing streams. [#5283](https://github.com/ClickHouse/ClickHouse/pull/5283) ([Ivan](https://github.com/abyss7)) +- `concat` function optimization for multiple arguments. [#5357](https://github.com/ClickHouse/ClickHouse/pull/5357) ([Danila Kutenin](https://github.com/danlark1)) +- Query optimisation. Allow push down IN statement while rewriting commа/cross join into inner one. [#5396](https://github.com/ClickHouse/ClickHouse/pull/5396) ([Artem Zuikov](https://github.com/4ertus2)) +- Upgrade our LZ4 implementation with reference one to have faster decompression. [#5070](https://github.com/ClickHouse/ClickHouse/pull/5070) ([Danila Kutenin](https://github.com/danlark1)) +- Implemented MSD radix sort (based on kxsort), and partial sorting. [#5129](https://github.com/ClickHouse/ClickHouse/pull/5129) ([Evgenii Pravda](https://github.com/kvinty)) + +#### Bug Fixes {#bug-fixes} + +- Fix push require columns with join [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed bug, when ClickHouse is run by systemd, the command `sudo service clickhouse-server forcerestart` was not working as expected. [#5204](https://github.com/ClickHouse/ClickHouse/pull/5204) ([proller](https://github.com/proller)) +- Fix http error codes in DataPartsExchange (interserver http server on 9009 port always returned code 200, even on errors). [#5216](https://github.com/ClickHouse/ClickHouse/pull/5216) ([proller](https://github.com/proller)) +- Fix SimpleAggregateFunction for String longer than MAX_SMALL_STRING_SIZE [#5311](https://github.com/ClickHouse/ClickHouse/pull/5311) ([Azat Khuzhin](https://github.com/azat)) +- Fix error for `Decimal` to `Nullable(Decimal)` conversion in IN. Support other Decimal to Decimal conversions (including different scales). [#5350](https://github.com/ClickHouse/ClickHouse/pull/5350) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed FPU clobbering in simdjson library that lead to wrong calculation of `uniqHLL` and `uniqCombined` aggregate function and math functions such as `log`. [#5354](https://github.com/ClickHouse/ClickHouse/pull/5354) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed handling mixed const/nonconst cases in JSON functions. [#5435](https://github.com/ClickHouse/ClickHouse/pull/5435) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix `retention` function. Now all conditions that satisfy in a row of data are added to the data state. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) +- Fix result type for `quantileExact` with Decimals. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Documentation {#documentation} + +- Translate documentation for `CollapsingMergeTree` to chinese. [#5168](https://github.com/ClickHouse/ClickHouse/pull/5168) ([张风啸](https://github.com/AlexZFX)) +- Translate some documentation about table engines to chinese. + [#5134](https://github.com/ClickHouse/ClickHouse/pull/5134) + [#5328](https://github.com/ClickHouse/ClickHouse/pull/5328) + ([never lee](https://github.com/neverlee)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements} + +- Fix some sanitizer reports that show probable use-after-free.[#5139](https://github.com/ClickHouse/ClickHouse/pull/5139) [#5143](https://github.com/ClickHouse/ClickHouse/pull/5143) [#5393](https://github.com/ClickHouse/ClickHouse/pull/5393) ([Ivan](https://github.com/abyss7)) +- Move performance tests out of separate directories for convenience. [#5158](https://github.com/ClickHouse/ClickHouse/pull/5158) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix incorrect performance tests. [#5255](https://github.com/ClickHouse/ClickHouse/pull/5255) ([alesapin](https://github.com/alesapin)) +- Added a tool to calculate checksums caused by bit flips to debug hardware issues. [#5334](https://github.com/ClickHouse/ClickHouse/pull/5334) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Make runner script more usable. [#5340](https://github.com/ClickHouse/ClickHouse/pull/5340)[#5360](https://github.com/ClickHouse/ClickHouse/pull/5360) ([filimonov](https://github.com/filimonov)) +- Add small instruction how to write performance tests. [#5408](https://github.com/ClickHouse/ClickHouse/pull/5408) ([alesapin](https://github.com/alesapin)) +- Add ability to make substitutions in create, fill and drop query in performance tests [#5367](https://github.com/ClickHouse/ClickHouse/pull/5367) ([Olga Khvostikova](https://github.com/stavrolia)) + +## ClickHouse Release 19.7 {#clickhouse-release-19-7} + +### ClickHouse Release 19.7.5.29, 2019-07-05 {#clickhouse-release-19-7-5-29-2019-07-05} + +#### Bug Fix {#bug-fix-25} + +- Fix performance regression in some queries with JOIN. [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) + +### ClickHouse Release 19.7.5.27, 2019-06-09 {#clickhouse-release-19-7-5-27-2019-06-09} + +#### New Features {#new-features-1} + +- Added bitmap related functions `bitmapHasAny` and `bitmapHasAll` analogous to `hasAny` and `hasAll` functions for arrays. [#5279](https://github.com/ClickHouse/ClickHouse/pull/5279) ([Sergi Vladykin](https://github.com/svladykin)) + +#### Bug Fixes {#bug-fixes-1} + +- Fix segfault on `minmax` INDEX with Null value. [#5246](https://github.com/ClickHouse/ClickHouse/pull/5246) ([Nikita Vasilev](https://github.com/nikvas0)) +- Mark all input columns in LIMIT BY as required output. It fixes ‘Not found column’ error in some distributed queries. [#5407](https://github.com/ClickHouse/ClickHouse/pull/5407) ([Constantin S. Pan](https://github.com/kvap)) +- Fix “Column ‘0’ already exists” error in `SELECT .. PREWHERE` on column with DEFAULT [#5397](https://github.com/ClickHouse/ClickHouse/pull/5397) ([proller](https://github.com/proller)) +- Fix `ALTER MODIFY TTL` query on `ReplicatedMergeTree`. [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539/commits) ([Anton Popov](https://github.com/CurtizJ)) +- Don’t crash the server when Kafka consumers have failed to start. [#5285](https://github.com/ClickHouse/ClickHouse/pull/5285) ([Ivan](https://github.com/abyss7)) +- Fixed bitmap functions produce wrong result. [#5359](https://github.com/ClickHouse/ClickHouse/pull/5359) ([Andy Yang](https://github.com/andyyzh)) +- Fix element_count for hashed dictionary (do not include duplicates) [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) +- Use contents of environment variable TZ as the name for timezone. It helps to correctly detect default timezone in some cases.[#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- Do not try to convert integers in `dictGetT` functions, because it does not work correctly. Throw an exception instead. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix settings in ExternalData HTTP request. [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila + Kutenin](https://github.com/danlark1)) +- Fix bug when parts were removed only from FS without dropping them from Zookeeper. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Fix segmentation fault in `bitmapHasAny` function. [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed error when replication connection pool does not retry to resolve host, even when DNS cache was dropped. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fixed `DROP INDEX IF EXISTS` query. Now `ALTER TABLE ... DROP INDEX IF EXISTS ...` query does not raise an exception if provided index does not exist. [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Fix union all supertype column. There were cases with inconsistent data and column types of resulting columns. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Skip ZNONODE during DDL query processing. Before if another node removes the znode in task queue, the one that + did not process it, but already get list of children, will terminate the DDLWorker thread. [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fix INSERT into Distributed() table with MATERIALIZED column. [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) + +### ClickHouse Release 19.7.3.9, 2019-05-30 {#clickhouse-release-19-7-3-9-2019-05-30} + +#### New Features {#new-features-2} + +- Allow to limit the range of a setting that can be specified by user. + These constraints can be set up in user settings profile. + [#4931](https://github.com/ClickHouse/ClickHouse/pull/4931) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Add a second version of the function `groupUniqArray` with an optional + `max_size` parameter that limits the size of the resulting array. This + behavior is similar to `groupArray(max_size)(x)` function. + [#5026](https://github.com/ClickHouse/ClickHouse/pull/5026) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- For TSVWithNames/CSVWithNames input file formats, column order can now be + determined from file header. This is controlled by + `input_format_with_names_use_header` parameter. + [#5081](https://github.com/ClickHouse/ClickHouse/pull/5081) + ([Alexander](https://github.com/Akazz)) + +#### Bug Fixes {#bug-fixes-2} + +- Crash with uncompressed_cache + JOIN during merge (#5197) + [#5133](https://github.com/ClickHouse/ClickHouse/pull/5133) ([Danila + Kutenin](https://github.com/danlark1)) +- Segmentation fault on a clickhouse-client query to system tables. #5066 + [#5127](https://github.com/ClickHouse/ClickHouse/pull/5127) + ([Ivan](https://github.com/abyss7)) +- Data loss on heavy load via KafkaEngine (#4736) + [#5080](https://github.com/ClickHouse/ClickHouse/pull/5080) + ([Ivan](https://github.com/abyss7)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Performance Improvements {#performance-improvements-1} + +- Use radix sort for sorting by single numeric column in `ORDER BY` without + `LIMIT`. [#5106](https://github.com/ClickHouse/ClickHouse/pull/5106), + [#4439](https://github.com/ClickHouse/ClickHouse/pull/4439) + ([Evgenii Pravda](https://github.com/kvinty), + [alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Documentation {#documentation-1} + +- Translate documentation for some table engines to Chinese. + [#5107](https://github.com/ClickHouse/ClickHouse/pull/5107), + [#5094](https://github.com/ClickHouse/ClickHouse/pull/5094), + [#5087](https://github.com/ClickHouse/ClickHouse/pull/5087) + ([张风啸](https://github.com/AlexZFX)), + [#5068](https://github.com/ClickHouse/ClickHouse/pull/5068) ([never + lee](https://github.com/neverlee)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-1} + +- Print UTF-8 characters properly in `clickhouse-test`. + [#5084](https://github.com/ClickHouse/ClickHouse/pull/5084) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add command line parameter for clickhouse-client to always load suggestion + data. [#5102](https://github.com/ClickHouse/ClickHouse/pull/5102) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Resolve some of PVS-Studio warnings. + [#5082](https://github.com/ClickHouse/ClickHouse/pull/5082) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Update LZ4 [#5040](https://github.com/ClickHouse/ClickHouse/pull/5040) ([Danila + Kutenin](https://github.com/danlark1)) +- Add gperf to build requirements for upcoming pull request #5030. + [#5110](https://github.com/ClickHouse/ClickHouse/pull/5110) + ([proller](https://github.com/proller)) + +## ClickHouse Release 19.6 {#clickhouse-release-19-6} + +### ClickHouse Release 19.6.3.18, 2019-06-13 {#clickhouse-release-19-6-3-18-2019-06-13} + +#### Bug Fixes {#bug-fixes-3} + +- Fixed IN condition pushdown for queries from table functions `mysql` and `odbc` and corresponding table engines. This fixes #3540 and #2384. [#5313](https://github.com/ClickHouse/ClickHouse/pull/5313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix deadlock in Zookeeper. [#5297](https://github.com/ClickHouse/ClickHouse/pull/5297) ([github1youlc](https://github.com/github1youlc)) +- Allow quoted decimals in CSV. [#5284](https://github.com/ClickHouse/ClickHouse/pull/5284) ([Artem Zuikov](https://github.com/4ertus2) +- Disallow conversion from float Inf/NaN into Decimals (throw exception). [#5282](https://github.com/ClickHouse/ClickHouse/pull/5282) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix data race in rename query. [#5247](https://github.com/ClickHouse/ClickHouse/pull/5247) ([Winter Zhang](https://github.com/zhang2014)) +- Temporarily disable LFAlloc. Usage of LFAlloc might lead to a lot of MAP_FAILED in allocating UncompressedCache and in a result to crashes of queries at high loaded servers. [cfdba93](https://github.com/ClickHouse/ClickHouse/commit/cfdba938ce22f16efeec504f7f90206a515b1280)([Danila Kutenin](https://github.com/danlark1)) + +### ClickHouse Release 19.6.2.11, 2019-05-13 {#clickhouse-release-19-6-2-11-2019-05-13} + +#### New Features {#new-features-3} + +- TTL expressions for columns and tables. [#4212](https://github.com/ClickHouse/ClickHouse/pull/4212) ([Anton Popov](https://github.com/CurtizJ)) +- Added support for `brotli` compression for HTTP responses (Accept-Encoding: br) [#4388](https://github.com/ClickHouse/ClickHouse/pull/4388) ([Mikhail](https://github.com/fandyushin)) +- Added new function `isValidUTF8` for checking whether a set of bytes is correctly utf-8 encoded. [#4934](https://github.com/ClickHouse/ClickHouse/pull/4934) ([Danila Kutenin](https://github.com/danlark1)) +- Add new load balancing policy `first_or_random` which sends queries to the first specified host and if it’s inaccessible send queries to random hosts of shard. Useful for cross-replication topology setups. [#5012](https://github.com/ClickHouse/ClickHouse/pull/5012) ([nvartolomei](https://github.com/nvartolomei)) + +#### Experimental Features {#experimental-features-1} + +- Add setting `index_granularity_bytes` (adaptive index granularity) for MergeTree\* tables family. [#4826](https://github.com/ClickHouse/ClickHouse/pull/4826) ([alesapin](https://github.com/alesapin)) + +#### Improvements {#improvements-1} + +- Added support for non-constant and negative size and length arguments for function `substringUTF8`. [#4989](https://github.com/ClickHouse/ClickHouse/pull/4989) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable push-down to right table in left join, left table in right join, and both tables in full join. This fixes wrong JOIN results in some cases. [#4846](https://github.com/ClickHouse/ClickHouse/pull/4846) ([Ivan](https://github.com/abyss7)) +- `clickhouse-copier`: auto upload task configuration from `--task-file` option [#4876](https://github.com/ClickHouse/ClickHouse/pull/4876) ([proller](https://github.com/proller)) +- Added typos handler for storage factory and table functions factory. [#4891](https://github.com/ClickHouse/ClickHouse/pull/4891) ([Danila Kutenin](https://github.com/danlark1)) +- Support asterisks and qualified asterisks for multiple joins without subqueries [#4898](https://github.com/ClickHouse/ClickHouse/pull/4898) ([Artem Zuikov](https://github.com/4ertus2)) +- Make missing column error message more user friendly. [#4915](https://github.com/ClickHouse/ClickHouse/pull/4915) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Performance Improvements {#performance-improvements-2} + +- Significant speedup of ASOF JOIN [#4924](https://github.com/ClickHouse/ClickHouse/pull/4924) ([Martijn Bakker](https://github.com/Gladdy)) + +#### Backward Incompatible Changes {#backward-incompatible-changes} + +- HTTP header `Query-Id` was renamed to `X-ClickHouse-Query-Id` for consistency. [#4972](https://github.com/ClickHouse/ClickHouse/pull/4972) ([Mikhail](https://github.com/fandyushin)) + +#### Bug Fixes {#bug-fixes-4} + +- Fixed potential null pointer dereference in `clickhouse-copier`. [#4900](https://github.com/ClickHouse/ClickHouse/pull/4900) ([proller](https://github.com/proller)) +- Fixed error on query with JOIN + ARRAY JOIN [#4938](https://github.com/ClickHouse/ClickHouse/pull/4938) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed hanging on start of the server when a dictionary depends on another dictionary via a database with engine=Dictionary. [#4962](https://github.com/ClickHouse/ClickHouse/pull/4962) ([Vitaly Baranov](https://github.com/vitlibar)) +- Partially fix distributed_product_mode = local. It’s possible to allow columns of local tables in where/having/order by/… via table aliases. Throw exception if table does not have alias. There’s not possible to access to the columns without table aliases yet. [#4986](https://github.com/ClickHouse/ClickHouse/pull/4986) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix potentially wrong result for `SELECT DISTINCT` with `JOIN` [#5001](https://github.com/ClickHouse/ClickHouse/pull/5001) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-2} + +- Fixed test failures when running clickhouse-server on different host [#4713](https://github.com/ClickHouse/ClickHouse/pull/4713) ([Vasily Nemkov](https://github.com/Enmk)) +- clickhouse-test: Disable color control sequences in non tty environment. [#4937](https://github.com/ClickHouse/ClickHouse/pull/4937) ([alesapin](https://github.com/alesapin)) +- clickhouse-test: Allow use any test database (remove `test.` qualification where it possible) [#5008](https://github.com/ClickHouse/ClickHouse/pull/5008) ([proller](https://github.com/proller)) +- Fix ubsan errors [#5037](https://github.com/ClickHouse/ClickHouse/pull/5037) ([Vitaly Baranov](https://github.com/vitlibar)) +- Yandex LFAlloc was added to ClickHouse to allocate MarkCache and UncompressedCache data in different ways to catch segfaults more reliable [#4995](https://github.com/ClickHouse/ClickHouse/pull/4995) ([Danila Kutenin](https://github.com/danlark1)) +- Python util to help with backports and changelogs. [#4949](https://github.com/ClickHouse/ClickHouse/pull/4949) ([Ivan](https://github.com/abyss7)) + +## ClickHouse Release 19.5 {#clickhouse-release-19-5} + +### ClickHouse Release 19.5.4.22, 2019-05-13 {#clickhouse-release-19-5-4-22-2019-05-13} + +#### Bug Fixes {#bug-fixes-5} + +- Fixed possible crash in bitmap\* functions [#5220](https://github.com/ClickHouse/ClickHouse/pull/5220) [#5228](https://github.com/ClickHouse/ClickHouse/pull/5228) ([Andy Yang](https://github.com/andyyzh)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error `Set for IN is not created yet in case of using single LowCardinality column in the left part of IN`. This error happened if LowCardinality column was the part of primary key. #5031 [#5154](https://github.com/ClickHouse/ClickHouse/pull/5154) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Modification of retention function: If a row satisfies both the first and NTH condition, only the first satisfied condition is added to the data state. Now all conditions that satisfy in a row of data are added to the data state. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) + +### ClickHouse Release 19.5.3.8, 2019-04-18 {#clickhouse-release-19-5-3-8-2019-04-18} + +#### Bug Fixes {#bug-fixes-6} + +- Fixed type of setting `max_partitions_per_insert_block` from boolean to UInt64. [#5028](https://github.com/ClickHouse/ClickHouse/pull/5028) ([Mohammad Hossein Sekhavat](https://github.com/mhsekhavat)) + +### ClickHouse Release 19.5.2.6, 2019-04-15 {#clickhouse-release-19-5-2-6-2019-04-15} + +#### New Features {#new-features-4} + +- [Hyperscan](https://github.com/intel/hyperscan) multiple regular expression matching was added (functions `multiMatchAny`, `multiMatchAnyIndex`, `multiFuzzyMatchAny`, `multiFuzzyMatchAnyIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780), [#4841](https://github.com/ClickHouse/ClickHouse/pull/4841) ([Danila Kutenin](https://github.com/danlark1)) +- `multiSearchFirstPosition` function was added. [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) +- Implement the predefined expression filter per row for tables. [#4792](https://github.com/ClickHouse/ClickHouse/pull/4792) ([Ivan](https://github.com/abyss7)) +- A new type of data skipping indices based on bloom filters (can be used for `equal`, `in` and `like` functions). [#4499](https://github.com/ClickHouse/ClickHouse/pull/4499) ([Nikita Vasilev](https://github.com/nikvas0)) +- Added `ASOF JOIN` which allows to run queries that join to the most recent value known. [#4774](https://github.com/ClickHouse/ClickHouse/pull/4774) [#4867](https://github.com/ClickHouse/ClickHouse/pull/4867) [#4863](https://github.com/ClickHouse/ClickHouse/pull/4863) [#4875](https://github.com/ClickHouse/ClickHouse/pull/4875) ([Martijn Bakker](https://github.com/Gladdy), [Artem Zuikov](https://github.com/4ertus2)) +- Rewrite multiple `COMMA JOIN` to `CROSS JOIN`. Then rewrite them to `INNER JOIN` if possible. [#4661](https://github.com/ClickHouse/ClickHouse/pull/4661) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvement {#improvement-9} + +- `topK` and `topKWeighted` now supports custom `loadFactor` (fixes issue [#4252](https://github.com/ClickHouse/ClickHouse/issues/4252)). [#4634](https://github.com/ClickHouse/ClickHouse/pull/4634) ([Kirill Danshin](https://github.com/kirillDanshin)) +- Allow to use `parallel_replicas_count > 1` even for tables without sampling (the setting is simply ignored for them). In previous versions it was lead to exception. [#4637](https://github.com/ClickHouse/ClickHouse/pull/4637) ([Alexey Elymanov](https://github.com/digitalist)) +- Support for `CREATE OR REPLACE VIEW`. Allow to create a view or set a new definition in a single statement. [#4654](https://github.com/ClickHouse/ClickHouse/pull/4654) ([Boris Granveaud](https://github.com/bgranvea)) +- `Buffer` table engine now supports `PREWHERE`. [#4671](https://github.com/ClickHouse/ClickHouse/pull/4671) ([Yangkuan Liu](https://github.com/LiuYangkuan)) +- Add ability to start replicated table without metadata in zookeeper in `readonly` mode. [#4691](https://github.com/ClickHouse/ClickHouse/pull/4691) ([alesapin](https://github.com/alesapin)) +- Fixed flicker of progress bar in clickhouse-client. The issue was most noticeable when using `FORMAT Null` with streaming queries. [#4811](https://github.com/ClickHouse/ClickHouse/pull/4811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to disable functions with `hyperscan` library on per user basis to limit potentially excessive and uncontrolled resource usage. [#4816](https://github.com/ClickHouse/ClickHouse/pull/4816) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add version number logging in all errors. [#4824](https://github.com/ClickHouse/ClickHouse/pull/4824) ([proller](https://github.com/proller)) +- Added restriction to the `multiMatch` functions which requires string size to fit into `unsigned int`. Also added the number of arguments limit to the `multiSearch` functions. [#4834](https://github.com/ClickHouse/ClickHouse/pull/4834) ([Danila Kutenin](https://github.com/danlark1)) +- Improved usage of scratch space and error handling in Hyperscan. [#4866](https://github.com/ClickHouse/ClickHouse/pull/4866) ([Danila Kutenin](https://github.com/danlark1)) +- Fill `system.graphite_detentions` from a table config of `*GraphiteMergeTree` engine tables. [#4584](https://github.com/ClickHouse/ClickHouse/pull/4584) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Rename `trigramDistance` function to `ngramDistance` and add more functions with `CaseInsensitive` and `UTF`. [#4602](https://github.com/ClickHouse/ClickHouse/pull/4602) ([Danila Kutenin](https://github.com/danlark1)) +- Improved data skipping indices calculation. [#4640](https://github.com/ClickHouse/ClickHouse/pull/4640) ([Nikita Vasilev](https://github.com/nikvas0)) +- Keep ordinary, `DEFAULT`, `MATERIALIZED` and `ALIAS` columns in a single list (fixes issue [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) + +#### Bug Fix {#bug-fix-26} + +- Avoid `std::terminate` in case of memory allocation failure. Now `std::bad_alloc` exception is thrown as expected. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes capnproto reading from buffer. Sometimes files wasn’t loaded successfully by HTTP. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Fix error `Unknown log entry type: 0` after `OPTIMIZE TABLE FINAL` query. [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) +- Wrong arguments to `hasAny` or `hasAll` functions may lead to segfault. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deadlock may happen while executing `DROP DATABASE dictionary` query. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behavior in `median` and `quantile` functions. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) +- Fix compression level detection when `network_compression_method` in lowercase. Broken in v19.1. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) +- Fixed ignorance of `UTC` setting (fixes issue [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) +- Fix `histogram` function behaviour with `Distributed` tables. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) +- Fixed tsan report `destroy of a locked mutex`. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed TSan report on shutdown due to race condition in system logs usage. Fixed potential use-after-free on shutdown when part_log is enabled. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix recheck parts in `ReplicatedMergeTreeAlterThread` in case of error. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Arithmetic operations on intermediate aggregate function states were not working for constant arguments (such as subquery results). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Always backquote column names in metadata. Otherwise it’s impossible to create a table with column named `index` (server won’t restart due to malformed `ATTACH` query in metadata). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash in `ALTER ... MODIFY ORDER BY` on `Distributed` table. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) +- Fix segfault in `JOIN ON` with enabled `enable_optimize_predicate_expression`. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) +- Fix bug with adding an extraneous row after consuming a protobuf message from Kafka. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix crash of `JOIN` on not-nullable vs nullable column. Fix `NULLs` in right keys in `ANY JOIN` + `join_use_nulls`. [#4815](https://github.com/ClickHouse/ClickHouse/pull/4815) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed race condition in `SELECT` from `system.tables` if the table is renamed or altered concurrently. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed data race when fetching data part that is already obsolete. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare data race that can happen during `RENAME` table of MergeTree family. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segmentation fault in function `arrayIntersect`. Segmentation fault could happen if function was called with mixed constant and ordinary arguments. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix `No message received` exception while fetching parts between replicas. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fixed `arrayIntersect` function wrong result in case of several repeated values in single array. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix a race condition during concurrent `ALTER COLUMN` queries that could lead to a server crash (fixes issue [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix incorrect result in `FULL/RIGHT JOIN` with const column. [#4723](https://github.com/ClickHouse/ClickHouse/pull/4723) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix duplicates in `GLOBAL JOIN` with asterisk. [#4705](https://github.com/ClickHouse/ClickHouse/pull/4705) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix parameter deduction in `ALTER MODIFY` of column `CODEC` when column type is not specified. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Functions `cutQueryStringAndFragment()` and `queryStringAndFragment()` now works correctly when `URL` contains a fragment and no query. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix rare bug when setting `min_bytes_to_use_direct_io` is greater than zero, which occures when thread have to seek backward in column file. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Fix wrong argument types for aggregate functions with `LowCardinality` arguments (fixes issue [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix wrong name qualification in `GLOBAL JOIN`. [#4969](https://github.com/ClickHouse/ClickHouse/pull/4969) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix function `toISOWeek` result for year 1970. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `DROP`, `TRUNCATE` and `OPTIMIZE` queries duplication, when executed on `ON CLUSTER` for `ReplicatedMergeTree*` tables family. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Backward Incompatible Change {#backward-incompatible-change-8} + +- Rename setting `insert_sample_with_metadata` to setting `input_format_defaults_for_omitted_fields`. [#4771](https://github.com/ClickHouse/ClickHouse/pull/4771) ([Artem Zuikov](https://github.com/4ertus2)) +- Added setting `max_partitions_per_insert_block` (with value 100 by default). If inserted block contains larger number of partitions, an exception is thrown. Set it to 0 if you want to remove the limit (not recommended). [#4845](https://github.com/ClickHouse/ClickHouse/pull/4845) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Multi-search functions were renamed (`multiPosition` to `multiSearchAllPositions`, `multiSearch` to `multiSearchAny`, `firstMatch` to `multiSearchFirstIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) + +#### Performance Improvement {#performance-improvement-6} + +- Optimize Volnitsky searcher by inlining, giving about 5-10% search improvement for queries with many needles or many similar bigrams. [#4862](https://github.com/ClickHouse/ClickHouse/pull/4862) ([Danila Kutenin](https://github.com/danlark1)) +- Fix performance issue when setting `use_uncompressed_cache` is greater than zero, which appeared when all read data contained in cache. [#4913](https://github.com/ClickHouse/ClickHouse/pull/4913) ([alesapin](https://github.com/alesapin)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-10} + +- Hardening debug build: more granular memory mappings and ASLR; add memory protection for mark cache and index. This allows to find more memory stomping bugs in case when ASan and MSan cannot do it. [#4632](https://github.com/ClickHouse/ClickHouse/pull/4632) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add support for cmake variables `ENABLE_PROTOBUF`, `ENABLE_PARQUET` and `ENABLE_BROTLI` which allows to enable/disable the above features (same as we can do for librdkafka, mysql, etc). [#4669](https://github.com/ClickHouse/ClickHouse/pull/4669) ([Silviu Caragea](https://github.com/silviucpp)) +- Add ability to print process list and stacktraces of all threads if some queries are hung after test run. [#4675](https://github.com/ClickHouse/ClickHouse/pull/4675) ([alesapin](https://github.com/alesapin)) +- Add retries on `Connection loss` error in `clickhouse-test`. [#4682](https://github.com/ClickHouse/ClickHouse/pull/4682) ([alesapin](https://github.com/alesapin)) +- Add freebsd build with vagrant and build with thread sanitizer to packager script. [#4712](https://github.com/ClickHouse/ClickHouse/pull/4712) [#4748](https://github.com/ClickHouse/ClickHouse/pull/4748) ([alesapin](https://github.com/alesapin)) +- Now user asked for password for user `'default'` during installation. [#4725](https://github.com/ClickHouse/ClickHouse/pull/4725) ([proller](https://github.com/proller)) +- Suppress warning in `rdkafka` library. [#4740](https://github.com/ClickHouse/ClickHouse/pull/4740) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow ability to build without ssl. [#4750](https://github.com/ClickHouse/ClickHouse/pull/4750) ([proller](https://github.com/proller)) +- Add a way to launch clickhouse-server image from a custom user. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Upgrade contrib boost to 1.69. [#4793](https://github.com/ClickHouse/ClickHouse/pull/4793) ([proller](https://github.com/proller)) +- Disable usage of `mremap` when compiled with Thread Sanitizer. Surprisingly enough, TSan does not intercept `mremap` (though it does intercept `mmap`, `munmap`) that leads to false positives. Fixed TSan report in stateful tests. [#4859](https://github.com/ClickHouse/ClickHouse/pull/4859) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test checking using format schema via HTTP interface. [#4864](https://github.com/ClickHouse/ClickHouse/pull/4864) ([Vitaly Baranov](https://github.com/vitlibar)) + +## ClickHouse Release 19.4 {#clickhouse-release-19-4} + +### ClickHouse Release 19.4.4.33, 2019-04-17 {#clickhouse-release-19-4-4-33-2019-04-17} + +#### Bug Fixes {#bug-fixes-7} + +- Avoid `std::terminate` in case of memory allocation failure. Now `std::bad_alloc` exception is thrown as expected. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes capnproto reading from buffer. Sometimes files wasn’t loaded successfully by HTTP. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Fix error `Unknown log entry type: 0` after `OPTIMIZE TABLE FINAL` query. [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) +- Wrong arguments to `hasAny` or `hasAll` functions may lead to segfault. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deadlock may happen while executing `DROP DATABASE dictionary` query. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behavior in `median` and `quantile` functions. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) +- Fix compression level detection when `network_compression_method` in lowercase. Broken in v19.1. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) +- Fixed ignorance of `UTC` setting (fixes issue [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) +- Fix `histogram` function behaviour with `Distributed` tables. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) +- Fixed tsan report `destroy of a locked mutex`. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed TSan report on shutdown due to race condition in system logs usage. Fixed potential use-after-free on shutdown when part_log is enabled. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix recheck parts in `ReplicatedMergeTreeAlterThread` in case of error. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Arithmetic operations on intermediate aggregate function states were not working for constant arguments (such as subquery results). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Always backquote column names in metadata. Otherwise it’s impossible to create a table with column named `index` (server won’t restart due to malformed `ATTACH` query in metadata). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash in `ALTER ... MODIFY ORDER BY` on `Distributed` table. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) +- Fix segfault in `JOIN ON` with enabled `enable_optimize_predicate_expression`. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) +- Fix bug with adding an extraneous row after consuming a protobuf message from Kafka. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed race condition in `SELECT` from `system.tables` if the table is renamed or altered concurrently. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed data race when fetching data part that is already obsolete. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare data race that can happen during `RENAME` table of MergeTree family. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segmentation fault in function `arrayIntersect`. Segmentation fault could happen if function was called with mixed constant and ordinary arguments. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix `No message received` exception while fetching parts between replicas. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fixed `arrayIntersect` function wrong result in case of several repeated values in single array. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix a race condition during concurrent `ALTER COLUMN` queries that could lead to a server crash (fixes issue [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix parameter deduction in `ALTER MODIFY` of column `CODEC` when column type is not specified. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Functions `cutQueryStringAndFragment()` and `queryStringAndFragment()` now works correctly when `URL` contains a fragment and no query. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix rare bug when setting `min_bytes_to_use_direct_io` is greater than zero, which occures when thread have to seek backward in column file. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Fix wrong argument types for aggregate functions with `LowCardinality` arguments (fixes issue [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix function `toISOWeek` result for year 1970. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `DROP`, `TRUNCATE` and `OPTIMIZE` queries duplication, when executed on `ON CLUSTER` for `ReplicatedMergeTree*` tables family. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Improvements {#improvements-2} + +- Keep ordinary, `DEFAULT`, `MATERIALIZED` and `ALIAS` columns in a single list (fixes issue [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) + +### ClickHouse Release 19.4.3.11, 2019-04-02 {#clickhouse-release-19-4-3-11-2019-04-02} + +#### Bug Fixes {#bug-fixes-8} + +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-11} + +- Add a way to launch clickhouse-server image from a custom user. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### ClickHouse Release 19.4.2.7, 2019-03-30 {#clickhouse-release-19-4-2-7-2019-03-30} + +#### Bug Fixes {#bug-fixes-9} + +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +### ClickHouse Release 19.4.1.3, 2019-03-19 {#clickhouse-release-19-4-1-3-2019-03-19} + +#### Bug Fixes {#bug-fixes-10} + +- Fixed remote queries which contain both `LIMIT BY` and `LIMIT`. Previously, if `LIMIT BY` and `LIMIT` were used for remote query, `LIMIT` could happen before `LIMIT BY`, which led to too filtered result. [#4708](https://github.com/ClickHouse/ClickHouse/pull/4708) ([Constantin S. Pan](https://github.com/kvap)) + +### ClickHouse Release 19.4.0.49, 2019-03-09 {#clickhouse-release-19-4-0-49-2019-03-09} + +#### New Features {#new-features-5} + +- Added full support for `Protobuf` format (input and output, nested data structures). [#4174](https://github.com/ClickHouse/ClickHouse/pull/4174) [#4493](https://github.com/ClickHouse/ClickHouse/pull/4493) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added bitmap functions with Roaring Bitmaps. [#4207](https://github.com/ClickHouse/ClickHouse/pull/4207) ([Andy Yang](https://github.com/andyyzh)) [#4568](https://github.com/ClickHouse/ClickHouse/pull/4568) ([Vitaly Baranov](https://github.com/vitlibar)) +- Parquet format support. [#4448](https://github.com/ClickHouse/ClickHouse/pull/4448) ([proller](https://github.com/proller)) +- N-gram distance was added for fuzzy string comparison. It is similar to q-gram metrics in R language. [#4466](https://github.com/ClickHouse/ClickHouse/pull/4466) ([Danila Kutenin](https://github.com/danlark1)) +- Combine rules for graphite rollup from dedicated aggregation and retention patterns. [#4426](https://github.com/ClickHouse/ClickHouse/pull/4426) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Added `max_execution_speed` and `max_execution_speed_bytes` to limit resource usage. Added `min_execution_speed_bytes` setting to complement the `min_execution_speed`. [#4430](https://github.com/ClickHouse/ClickHouse/pull/4430) ([Winter Zhang](https://github.com/zhang2014)) +- Implemented function `flatten`. [#4555](https://github.com/ClickHouse/ClickHouse/pull/4555) [#4409](https://github.com/ClickHouse/ClickHouse/pull/4409) ([alexey-milovidov](https://github.com/alexey-milovidov), [kzon](https://github.com/kzon)) +- Added functions `arrayEnumerateDenseRanked` and `arrayEnumerateUniqRanked` (it’s like `arrayEnumerateUniq` but allows to fine tune array depth to look inside multidimensional arrays). [#4475](https://github.com/ClickHouse/ClickHouse/pull/4475) ([proller](https://github.com/proller)) [#4601](https://github.com/ClickHouse/ClickHouse/pull/4601) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Multiple JOINS with some restrictions: no asterisks, no complex aliases in ON/WHERE/GROUP BY/… [#4462](https://github.com/ClickHouse/ClickHouse/pull/4462) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-11} + +- This release also contains all bug fixes from 19.3 and 19.1. +- Fixed bug in data skipping indices: order of granules after INSERT was incorrect. [#4407](https://github.com/ClickHouse/ClickHouse/pull/4407) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed `set` index for `Nullable` and `LowCardinality` columns. Before it, `set` index with `Nullable` or `LowCardinality` column led to error `Data type must be deserialized with multiple streams` while selecting. [#4594](https://github.com/ClickHouse/ClickHouse/pull/4594) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correctly set update_time on full `executable` dictionary update. [#4551](https://github.com/ClickHouse/ClickHouse/pull/4551) ([Tema Novikov](https://github.com/temoon)) +- Fix broken progress bar in 19.3. [#4627](https://github.com/ClickHouse/ClickHouse/pull/4627) ([filimonov](https://github.com/filimonov)) +- Fixed inconsistent values of MemoryTracker when memory region was shrinked, in certain cases. [#4619](https://github.com/ClickHouse/ClickHouse/pull/4619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed undefined behaviour in ThreadPool. [#4612](https://github.com/ClickHouse/ClickHouse/pull/4612) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a very rare crash with the message `mutex lock failed: Invalid argument` that could happen when a MergeTree table was dropped concurrently with a SELECT. [#4608](https://github.com/ClickHouse/ClickHouse/pull/4608) ([Alex Zatelepin](https://github.com/ztlpn)) +- ODBC driver compatibility with `LowCardinality` data type. [#4381](https://github.com/ClickHouse/ClickHouse/pull/4381) ([proller](https://github.com/proller)) +- FreeBSD: Fixup for `AIOcontextPool: Found io_event with unknown id 0` error. [#4438](https://github.com/ClickHouse/ClickHouse/pull/4438) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `system.part_log` table was created regardless to configuration. [#4483](https://github.com/ClickHouse/ClickHouse/pull/4483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behaviour in `dictIsIn` function for cache dictionaries. [#4515](https://github.com/ClickHouse/ClickHouse/pull/4515) ([alesapin](https://github.com/alesapin)) +- Fixed a deadlock when a SELECT query locks the same table multiple times (e.g. from different threads or when executing multiple subqueries) and there is a concurrent DDL query. [#4535](https://github.com/ClickHouse/ClickHouse/pull/4535) ([Alex Zatelepin](https://github.com/ztlpn)) +- Disable compile_expressions by default until we get own `llvm` contrib and can test it with `clang` and `asan`. [#4579](https://github.com/ClickHouse/ClickHouse/pull/4579) ([alesapin](https://github.com/alesapin)) +- Prevent `std::terminate` when `invalidate_query` for `clickhouse` external dictionary source has returned wrong resultset (empty or more than one row or more than one column). Fixed issue when the `invalidate_query` was performed every five seconds regardless to the `lifetime`. [#4583](https://github.com/ClickHouse/ClickHouse/pull/4583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid deadlock when the `invalidate_query` for a dictionary with `clickhouse` source was involving `system.dictionaries` table or `Dictionaries` database (rare case). [#4599](https://github.com/ClickHouse/ClickHouse/pull/4599) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes for CROSS JOIN with empty WHERE. [#4598](https://github.com/ClickHouse/ClickHouse/pull/4598) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed segfault in function “replicate” when constant argument is passed. [#4603](https://github.com/ClickHouse/ClickHouse/pull/4603) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix lambda function with predicate optimizer. [#4408](https://github.com/ClickHouse/ClickHouse/pull/4408) ([Winter Zhang](https://github.com/zhang2014)) +- Multiple JOINs multiple fixes. [#4595](https://github.com/ClickHouse/ClickHouse/pull/4595) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvements {#improvements-3} + +- Support aliases in JOIN ON section for right table columns. [#4412](https://github.com/ClickHouse/ClickHouse/pull/4412) ([Artem Zuikov](https://github.com/4ertus2)) +- Result of multiple JOINs need correct result names to be used in subselects. Replace flat aliases with source names in result. [#4474](https://github.com/ClickHouse/ClickHouse/pull/4474) ([Artem Zuikov](https://github.com/4ertus2)) +- Improve push-down logic for joined statements. [#4387](https://github.com/ClickHouse/ClickHouse/pull/4387) ([Ivan](https://github.com/abyss7)) + +#### Performance Improvements {#performance-improvements-3} + +- Improved heuristics of “move to PREWHERE” optimization. [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Use proper lookup tables that uses HashTable’s API for 8-bit and 16-bit keys. [#4536](https://github.com/ClickHouse/ClickHouse/pull/4536) ([Amos Bird](https://github.com/amosbird)) +- Improved performance of string comparison. [#4564](https://github.com/ClickHouse/ClickHouse/pull/4564) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cleanup distributed DDL queue in a separate thread so that it does not slow down the main loop that processes distributed DDL tasks. [#4502](https://github.com/ClickHouse/ClickHouse/pull/4502) ([Alex Zatelepin](https://github.com/ztlpn)) +- When `min_bytes_to_use_direct_io` is set to 1, not every file was opened with O_DIRECT mode because the data size to read was sometimes underestimated by the size of one compressed block. [#4526](https://github.com/ClickHouse/ClickHouse/pull/4526) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-12} + +- Added support for clang-9 [#4604](https://github.com/ClickHouse/ClickHouse/pull/4604) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix wrong `__asm__` instructions (again) [#4621](https://github.com/ClickHouse/ClickHouse/pull/4621) ([Konstantin Podshumok](https://github.com/podshumok)) +- Add ability to specify settings for `clickhouse-performance-test` from command line. [#4437](https://github.com/ClickHouse/ClickHouse/pull/4437) ([alesapin](https://github.com/alesapin)) +- Add dictionaries tests to integration tests. [#4477](https://github.com/ClickHouse/ClickHouse/pull/4477) ([alesapin](https://github.com/alesapin)) +- Added queries from the benchmark on the website to automated performance tests. [#4496](https://github.com/ClickHouse/ClickHouse/pull/4496) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `xxhash.h` does not exist in external lz4 because it is an implementation detail and its symbols are namespaced with `XXH_NAMESPACE` macro. When lz4 is external, xxHash has to be external too, and the dependents have to link to it. [#4495](https://github.com/ClickHouse/ClickHouse/pull/4495) ([Orivej Desh](https://github.com/orivej)) +- Fixed a case when `quantileTiming` aggregate function can be called with negative or floating point argument (this fixes fuzz test with undefined behaviour sanitizer). [#4506](https://github.com/ClickHouse/ClickHouse/pull/4506) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Spelling error correction. [#4531](https://github.com/ClickHouse/ClickHouse/pull/4531) ([sdk2](https://github.com/sdk2)) +- Fix compilation on Mac. [#4371](https://github.com/ClickHouse/ClickHouse/pull/4371) ([Vitaly Baranov](https://github.com/vitlibar)) +- Build fixes for FreeBSD and various unusual build configurations. [#4444](https://github.com/ClickHouse/ClickHouse/pull/4444) ([proller](https://github.com/proller)) + +## ClickHouse Release 19.3 {#clickhouse-release-19-3} + +### ClickHouse Release 19.3.9.1, 2019-04-02 {#clickhouse-release-19-3-9-1-2019-04-02} + +#### Bug Fixes {#bug-fixes-12} + +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-13} + +- Add a way to launch clickhouse-server image from a custom user [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### ClickHouse Release 19.3.7, 2019-03-12 {#clickhouse-release-19-3-7-2019-03-12} + +#### Bug Fixes {#bug-fixes-13} + +- Fixed error in #3920. This error manifests itself as random cache corruption (messages `Unknown codec family code`, `Cannot seek through file`) and segfaults. This bug first appeared in version 19.1 and is present in versions up to 19.1.10 and 19.3.6. [#4623](https://github.com/ClickHouse/ClickHouse/pull/4623) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.3.6, 2019-03-02 {#clickhouse-release-19-3-6-2019-03-02} + +#### Bug Fixes {#bug-fixes-14} + +- When there are more than 1000 threads in a thread pool, `std::terminate` may happen on thread exit. [Azat Khuzhin](https://github.com/azat) [#4485](https://github.com/ClickHouse/ClickHouse/pull/4485) [#4505](https://github.com/ClickHouse/ClickHouse/pull/4505) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now it’s possible to create `ReplicatedMergeTree*` tables with comments on columns without defaults and tables with columns codecs without comments and defaults. Also fix comparison of codecs. [#4523](https://github.com/ClickHouse/ClickHouse/pull/4523) ([alesapin](https://github.com/alesapin)) +- Fixed crash on JOIN with array or tuple. [#4552](https://github.com/ClickHouse/ClickHouse/pull/4552) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed crash in clickhouse-copier with the message `ThreadStatus not created`. [#4540](https://github.com/ClickHouse/ClickHouse/pull/4540) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed hangup on server shutdown if distributed DDLs were used. [#4472](https://github.com/ClickHouse/ClickHouse/pull/4472) ([Alex Zatelepin](https://github.com/ztlpn)) +- Incorrect column numbers were printed in error message about text format parsing for columns with number greater than 10. [#4484](https://github.com/ClickHouse/ClickHouse/pull/4484) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-3} + +- Fixed build with AVX enabled. [#4527](https://github.com/ClickHouse/ClickHouse/pull/4527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Enable extended accounting and IO accounting based on good known version instead of kernel under which it is compiled. [#4541](https://github.com/ClickHouse/ClickHouse/pull/4541) ([nvartolomei](https://github.com/nvartolomei)) +- Allow to skip setting of core_dump.size_limit, warning instead of throw if limit set fail. [#4473](https://github.com/ClickHouse/ClickHouse/pull/4473) ([proller](https://github.com/proller)) +- Removed the `inline` tags of `void readBinary(...)` in `Field.cpp`. Also merged redundant `namespace DB` blocks. [#4530](https://github.com/ClickHouse/ClickHouse/pull/4530) ([hcz](https://github.com/hczhcz)) + +### ClickHouse Release 19.3.5, 2019-02-21 {#clickhouse-release-19-3-5-2019-02-21} + +#### Bug Fixes {#bug-fixes-15} + +- Fixed bug with large http insert queries processing. [#4454](https://github.com/ClickHouse/ClickHouse/pull/4454) ([alesapin](https://github.com/alesapin)) +- Fixed backward incompatibility with old versions due to wrong implementation of `send_logs_level` setting. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed backward incompatibility of table function `remote` introduced with column comments. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.3.4, 2019-02-16 {#clickhouse-release-19-3-4-2019-02-16} + +#### Improvements {#improvements-4} + +- Table index size is not accounted for memory limits when doing `ATTACH TABLE` query. Avoided the possibility that a table cannot be attached after being detached. [#4396](https://github.com/ClickHouse/ClickHouse/pull/4396) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Slightly raised up the limit on max string and array size received from ZooKeeper. It allows to continue to work with increased size of `CLIENT_JVMFLAGS=-Djute.maxbuffer=...` on ZooKeeper. [#4398](https://github.com/ClickHouse/ClickHouse/pull/4398) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to repair abandoned replica even if it already has huge number of nodes in its queue. [#4399](https://github.com/ClickHouse/ClickHouse/pull/4399) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add one required argument to `SET` index (max stored rows number). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Bug Fixes {#bug-fixes-16} + +- Fixed `WITH ROLLUP` result for group by single `LowCardinality` key. [#4384](https://github.com/ClickHouse/ClickHouse/pull/4384) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed bug in the set index (dropping a granule if it contains more than `max_rows` rows). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) +- A lot of FreeBSD build fixes. [#4397](https://github.com/ClickHouse/ClickHouse/pull/4397) ([proller](https://github.com/proller)) +- Fixed aliases substitution in queries with subquery containing same alias (issue [#4110](https://github.com/ClickHouse/ClickHouse/issues/4110)). [#4351](https://github.com/ClickHouse/ClickHouse/pull/4351) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-4} + +- Add ability to run `clickhouse-server` for stateless tests in docker image. [#4347](https://github.com/ClickHouse/ClickHouse/pull/4347) ([Vasily Nemkov](https://github.com/Enmk)) + +### ClickHouse Release 19.3.3, 2019-02-13 {#clickhouse-release-19-3-3-2019-02-13} + +#### New Features {#new-features-6} + +- Added the `KILL MUTATION` statement that allows removing mutations that are for some reasons stuck. Added `latest_failed_part`, `latest_fail_time`, `latest_fail_reason` fields to the `system.mutations` table for easier troubleshooting. [#4287](https://github.com/ClickHouse/ClickHouse/pull/4287) ([Alex Zatelepin](https://github.com/ztlpn)) +- Added aggregate function `entropy` which computes Shannon entropy. [#4238](https://github.com/ClickHouse/ClickHouse/pull/4238) ([Quid37](https://github.com/Quid37)) +- Added ability to send queries `INSERT INTO tbl VALUES (....` to server without splitting on `query` and `data` parts. [#4301](https://github.com/ClickHouse/ClickHouse/pull/4301) ([alesapin](https://github.com/alesapin)) +- Generic implementation of `arrayWithConstant` function was added. [#4322](https://github.com/ClickHouse/ClickHouse/pull/4322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implemented `NOT BETWEEN` comparison operator. [#4228](https://github.com/ClickHouse/ClickHouse/pull/4228) ([Dmitry Naumov](https://github.com/nezed)) +- Implement `sumMapFiltered` in order to be able to limit the number of keys for which values will be summed by `sumMap`. [#4129](https://github.com/ClickHouse/ClickHouse/pull/4129) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Added support of `Nullable` types in `mysql` table function. [#4198](https://github.com/ClickHouse/ClickHouse/pull/4198) ([Emmanuel Donin de Rosière](https://github.com/edonin)) +- Support for arbitrary constant expressions in `LIMIT` clause. [#4246](https://github.com/ClickHouse/ClickHouse/pull/4246) ([k3box](https://github.com/k3box)) +- Added `topKWeighted` aggregate function that takes additional argument with (unsigned integer) weight. [#4245](https://github.com/ClickHouse/ClickHouse/pull/4245) ([Andrew Golman](https://github.com/andrewgolman)) +- `StorageJoin` now supports `join_any_take_last_row` setting that allows overwriting existing values of the same key. [#3973](https://github.com/ClickHouse/ClickHouse/pull/3973) ([Amos Bird](https://github.com/amosbird) +- Added function `toStartOfInterval`. [#4304](https://github.com/ClickHouse/ClickHouse/pull/4304) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added `RowBinaryWithNamesAndTypes` format. [#4200](https://github.com/ClickHouse/ClickHouse/pull/4200) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)) +- Added `IPv4` and `IPv6` data types. More effective implementations of `IPv*` functions. [#3669](https://github.com/ClickHouse/ClickHouse/pull/3669) ([Vasily Nemkov](https://github.com/Enmk)) +- Added function `toStartOfTenMinutes()`. [#4298](https://github.com/ClickHouse/ClickHouse/pull/4298) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added `Protobuf` output format. [#4005](https://github.com/ClickHouse/ClickHouse/pull/4005) [#4158](https://github.com/ClickHouse/ClickHouse/pull/4158) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added brotli support for HTTP interface for data import (INSERTs). [#4235](https://github.com/ClickHouse/ClickHouse/pull/4235) ([Mikhail](https://github.com/fandyushin)) +- Added hints while user make typo in function name or type in command line client. [#4239](https://github.com/ClickHouse/ClickHouse/pull/4239) ([Danila Kutenin](https://github.com/danlark1)) +- Added `Query-Id` to Server’s HTTP Response header. [#4231](https://github.com/ClickHouse/ClickHouse/pull/4231) ([Mikhail](https://github.com/fandyushin)) + +#### Experimental Features {#experimental-features-2} + +- Added `minmax` and `set` data skipping indices for MergeTree table engines family. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- Added conversion of `CROSS JOIN` to `INNER JOIN` if possible. [#4221](https://github.com/ClickHouse/ClickHouse/pull/4221) [#4266](https://github.com/ClickHouse/ClickHouse/pull/4266) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-17} + +- Fixed `Not found column` for duplicate columns in `JOIN ON` section. [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Make `START REPLICATED SENDS` command start replicated sends. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) +- Fixed aggregate functions execution with `Array(LowCardinality)` arguments. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed wrong behaviour when doing `INSERT ... SELECT ... FROM file(...)` query and file has `CSVWithNames` or `TSVWIthNames` format and the first data row is missing. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed crash on dictionary reload if dictionary not available. This bug was appeared in 19.1.6. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) +- Fixed `ALL JOIN` with duplicates in right table. [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed segmentation fault with `use_uncompressed_cache=1` and exception with wrong uncompressed size. This bug was appeared in 19.1.6. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fixed `compile_expressions` bug with comparison of big (more than int16) dates. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Fixed infinite loop when selecting from table function `numbers(0)`. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Temporarily disable predicate optimization for `ORDER BY`. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed `Illegal instruction` error when using base64 functions on old CPUs. This error has been reproduced only when ClickHouse was compiled with gcc-8. [#4275](https://github.com/ClickHouse/ClickHouse/pull/4275) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `No message received` error when interacting with PostgreSQL ODBC Driver through TLS connection. Also fixes segfault when using MySQL ODBC Driver. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed incorrect result when `Date` and `DateTime` arguments are used in branches of conditional operator (function `if`). Added generic case for function `if`. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- ClickHouse dictionaries now load within `clickhouse` process. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed deadlock when `SELECT` from a table with `File` engine was retried after `No such file or directory` error. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed race condition when selecting from `system.tables` may give `table does not exist` error. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-client` can segfault on exit while loading data for command line suggestions if it was run in interactive mode. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug when the execution of mutations containing `IN` operators was producing incorrect results. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fixed error: if there is a database with `Dictionary` engine, all dictionaries forced to load at server startup, and if there is a dictionary with ClickHouse source from localhost, the dictionary cannot load. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when system logs are tried to create again at server shutdown. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Correctly return the right type and properly handle locks in `joinGet` function. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) +- Added `sumMapWithOverflow` function. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Fixed segfault with `allow_experimental_multiple_joins_emulation`. [52de2c](https://github.com/ClickHouse/ClickHouse/commit/52de2cd927f7b5257dd67e175f0a5560a48840d0) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed bug with incorrect `Date` and `DateTime` comparison. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) +- Fixed fuzz test under undefined behavior sanitizer: added parameter type check for `quantile*Weighted` family of functions. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare race condition when removing of old data parts can fail with `File not found` error. [#4378](https://github.com/ClickHouse/ClickHouse/pull/4378) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix install package with missing /etc/clickhouse-server/config.xml. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-5} + +- Debian package: correct /etc/clickhouse-server/preprocessed link according to config. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) +- Various build fixes for FreeBSD. [#4225](https://github.com/ClickHouse/ClickHouse/pull/4225) ([proller](https://github.com/proller)) +- Added ability to create, fill and drop tables in perftest. [#4220](https://github.com/ClickHouse/ClickHouse/pull/4220) ([alesapin](https://github.com/alesapin)) +- Added a script to check for duplicate includes. [#4326](https://github.com/ClickHouse/ClickHouse/pull/4326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added ability to run queries by index in performance test. [#4264](https://github.com/ClickHouse/ClickHouse/pull/4264) ([alesapin](https://github.com/alesapin)) +- Package with debug symbols is suggested to be installed. [#4274](https://github.com/ClickHouse/ClickHouse/pull/4274) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Refactoring of performance-test. Better logging and signals handling. [#4171](https://github.com/ClickHouse/ClickHouse/pull/4171) ([alesapin](https://github.com/alesapin)) +- Added docs to anonymized Yandex.Metrika datasets. [#4164](https://github.com/ClickHouse/ClickHouse/pull/4164) ([alesapin](https://github.com/alesapin)) +- Аdded tool for converting an old month-partitioned part to the custom-partitioned format. [#4195](https://github.com/ClickHouse/ClickHouse/pull/4195) ([Alex Zatelepin](https://github.com/ztlpn)) +- Added docs about two datasets in s3. [#4144](https://github.com/ClickHouse/ClickHouse/pull/4144) ([alesapin](https://github.com/alesapin)) +- Added script which creates changelog from pull requests description. [#4169](https://github.com/ClickHouse/ClickHouse/pull/4169) [#4173](https://github.com/ClickHouse/ClickHouse/pull/4173) ([KochetovNicolai](https://github.com/KochetovNicolai)) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Added puppet module for ClickHouse. [#4182](https://github.com/ClickHouse/ClickHouse/pull/4182) ([Maxim Fedotov](https://github.com/MaxFedotov)) +- Added docs for a group of undocumented functions. [#4168](https://github.com/ClickHouse/ClickHouse/pull/4168) ([Winter Zhang](https://github.com/zhang2014)) +- ARM build fixes. [#4210](https://github.com/ClickHouse/ClickHouse/pull/4210)[#4306](https://github.com/ClickHouse/ClickHouse/pull/4306) [#4291](https://github.com/ClickHouse/ClickHouse/pull/4291) ([proller](https://github.com/proller)) ([proller](https://github.com/proller)) +- Dictionary tests now able to run from `ctest`. [#4189](https://github.com/ClickHouse/ClickHouse/pull/4189) ([proller](https://github.com/proller)) +- Now `/etc/ssl` is used as default directory with SSL certificates. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added checking SSE and AVX instruction at start. [#4234](https://github.com/ClickHouse/ClickHouse/pull/4234) ([Igr](https://github.com/igron99)) +- Init script will wait server until start. [#4281](https://github.com/ClickHouse/ClickHouse/pull/4281) ([proller](https://github.com/proller)) + +#### Backward Incompatible Changes {#backward-incompatible-changes-1} + +- Removed `allow_experimental_low_cardinality_type` setting. `LowCardinality` data types are production ready. [#4323](https://github.com/ClickHouse/ClickHouse/pull/4323) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reduce mark cache size and uncompressed cache size accordingly to available memory amount. [#4240](https://github.com/ClickHouse/ClickHouse/pull/4240) ([Lopatin Konstantin](https://github.com/k-lopatin) +- Added keyword `INDEX` in `CREATE TABLE` query. A column with name `index` must be quoted with backticks or double quotes: `` `index` ``. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- `sumMap` now promote result type instead of overflow. The old `sumMap` behavior can be obtained by using `sumMapWithOverflow` function. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) + +#### Performance Improvements {#performance-improvements-4} + +- `std::sort` replaced by `pdqsort` for queries without `LIMIT`. [#4236](https://github.com/ClickHouse/ClickHouse/pull/4236) ([Evgenii Pravda](https://github.com/kvinty)) +- Now server reuse threads from global thread pool. This affects performance in some corner cases. [#4150](https://github.com/ClickHouse/ClickHouse/pull/4150) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvements {#improvements-5} + +- Implemented AIO support for FreeBSD. [#4305](https://github.com/ClickHouse/ClickHouse/pull/4305) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `SELECT * FROM a JOIN b USING a, b` now return `a` and `b` columns only from the left table. [#4141](https://github.com/ClickHouse/ClickHouse/pull/4141) ([Artem Zuikov](https://github.com/4ertus2)) +- Allow `-C` option of client to work as `-c` option. [#4232](https://github.com/ClickHouse/ClickHouse/pull/4232) ([syominsergey](https://github.com/syominsergey)) +- Now option `--password` used without value requires password from stdin. [#4230](https://github.com/ClickHouse/ClickHouse/pull/4230) ([BSD_Conqueror](https://github.com/bsd-conqueror)) +- Added highlighting of unescaped metacharacters in string literals that contain `LIKE` expressions or regexps. [#4327](https://github.com/ClickHouse/ClickHouse/pull/4327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added cancelling of HTTP read only queries if client socket goes away. [#4213](https://github.com/ClickHouse/ClickHouse/pull/4213) ([nvartolomei](https://github.com/nvartolomei)) +- Now server reports progress to keep client connections alive. [#4215](https://github.com/ClickHouse/ClickHouse/pull/4215) ([Ivan](https://github.com/abyss7)) +- Slightly better message with reason for OPTIMIZE query with `optimize_throw_if_noop` setting enabled. [#4294](https://github.com/ClickHouse/ClickHouse/pull/4294) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added support of `--version` option for clickhouse server. [#4251](https://github.com/ClickHouse/ClickHouse/pull/4251) ([Lopatin Konstantin](https://github.com/k-lopatin)) +- Added `--help/-h` option to `clickhouse-server`. [#4233](https://github.com/ClickHouse/ClickHouse/pull/4233) ([Yuriy Baranov](https://github.com/yurriy)) +- Added support for scalar subqueries with aggregate function state result. [#4348](https://github.com/ClickHouse/ClickHouse/pull/4348) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Improved server shutdown time and ALTERs waiting time. [#4372](https://github.com/ClickHouse/ClickHouse/pull/4372) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added info about the replicated_can_become_leader setting to system.replicas and add logging if the replica won’t try to become leader. [#4379](https://github.com/ClickHouse/ClickHouse/pull/4379) ([Alex Zatelepin](https://github.com/ztlpn)) + +## ClickHouse Release 19.1 {#clickhouse-release-19-1} + +### ClickHouse Release 19.1.14, 2019-03-14 {#clickhouse-release-19-1-14-2019-03-14} + +- Fixed error `Column ... queried more than once` that may happen if the setting `asterisk_left_columns_only` is set to 1 in case of using `GLOBAL JOIN` with `SELECT *` (rare case). The issue does not exist in 19.3 and newer. [6bac7d8d](https://github.com/ClickHouse/ClickHouse/pull/4692/commits/6bac7d8d11a9b0d6de0b32b53c47eb2f6f8e7062) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.1.13, 2019-03-12 {#clickhouse-release-19-1-13-2019-03-12} + +This release contains exactly the same set of patches as 19.3.7. + +### ClickHouse Release 19.1.10, 2019-03-03 {#clickhouse-release-19-1-10-2019-03-03} + +This release contains exactly the same set of patches as 19.3.6. + +## ClickHouse Release 19.1 {#clickhouse-release-19-1-1} + +### ClickHouse Release 19.1.9, 2019-02-21 {#clickhouse-release-19-1-9-2019-02-21} + +#### Bug Fixes {#bug-fixes-18} + +- Fixed backward incompatibility with old versions due to wrong implementation of `send_logs_level` setting. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed backward incompatibility of table function `remote` introduced with column comments. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.1.8, 2019-02-16 {#clickhouse-release-19-1-8-2019-02-16} + +#### Bug Fixes {#bug-fixes-19} + +- Fix install package with missing /etc/clickhouse-server/config.xml. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) + +## ClickHouse Release 19.1 {#clickhouse-release-19-1-2} + +### ClickHouse Release 19.1.7, 2019-02-15 {#clickhouse-release-19-1-7-2019-02-15} + +#### Bug Fixes {#bug-fixes-20} + +- Correctly return the right type and properly handle locks in `joinGet` function. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) +- Fixed error when system logs are tried to create again at server shutdown. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error: if there is a database with `Dictionary` engine, all dictionaries forced to load at server startup, and if there is a dictionary with ClickHouse source from localhost, the dictionary cannot load. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug when the execution of mutations containing `IN` operators was producing incorrect results. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) +- `clickhouse-client` can segfault on exit while loading data for command line suggestions if it was run in interactive mode. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed race condition when selecting from `system.tables` may give `table does not exist` error. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed deadlock when `SELECT` from a table with `File` engine was retried after `No such file or directory` error. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed an issue: local ClickHouse dictionaries are loaded via TCP, but should load within process. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `No message received` error when interacting with PostgreSQL ODBC Driver through TLS connection. Also fixes segfault when using MySQL ODBC Driver. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Temporarily disable predicate optimization for `ORDER BY`. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed infinite loop when selecting from table function `numbers(0)`. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `compile_expressions` bug with comparison of big (more than int16) dates. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Fixed segmentation fault with `uncompressed_cache=1` and exception with wrong uncompressed size. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fixed `ALL JOIN` with duplicates in right table. [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed wrong behaviour when doing `INSERT ... SELECT ... FROM file(...)` query and file has `CSVWithNames` or `TSVWIthNames` format and the first data row is missing. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed aggregate functions execution with `Array(LowCardinality)` arguments. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Debian package: correct /etc/clickhouse-server/preprocessed link according to config. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) +- Fixed fuzz test under undefined behavior sanitizer: added parameter type check for `quantile*Weighted` family of functions. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Make `START REPLICATED SENDS` command start replicated sends. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) +- Fixed `Not found column` for duplicate columns in JOIN ON section. [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Now `/etc/ssl` is used as default directory with SSL certificates. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed crash on dictionary reload if dictionary not available. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) +- Fixed bug with incorrect `Date` and `DateTime` comparison. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) +- Fixed incorrect result when `Date` and `DateTime` arguments are used in branches of conditional operator (function `if`). Added generic case for function `if`. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.1.6, 2019-01-24 {#clickhouse-release-19-1-6-2019-01-24} + +#### New Features {#new-features-7} + +- Custom per column compression codecs for tables. [#3899](https://github.com/ClickHouse/ClickHouse/pull/3899) [#4111](https://github.com/ClickHouse/ClickHouse/pull/4111) ([alesapin](https://github.com/alesapin), [Winter Zhang](https://github.com/zhang2014), [Anatoly](https://github.com/Sindbag)) +- Added compression codec `Delta`. [#4052](https://github.com/ClickHouse/ClickHouse/pull/4052) ([alesapin](https://github.com/alesapin)) +- Allow to `ALTER` compression codecs. [#4054](https://github.com/ClickHouse/ClickHouse/pull/4054) ([alesapin](https://github.com/alesapin)) +- Added functions `left`, `right`, `trim`, `ltrim`, `rtrim`, `timestampadd`, `timestampsub` for SQL standard compatibility. [#3826](https://github.com/ClickHouse/ClickHouse/pull/3826) ([Ivan Blinkov](https://github.com/blinkov)) +- Support for write in `HDFS` tables and `hdfs` table function. [#4084](https://github.com/ClickHouse/ClickHouse/pull/4084) ([alesapin](https://github.com/alesapin)) +- Added functions to search for multiple constant strings from big haystack: `multiPosition`, `multiSearch` ,`firstMatch` also with `-UTF8`, `-CaseInsensitive`, and `-CaseInsensitiveUTF8` variants. [#4053](https://github.com/ClickHouse/ClickHouse/pull/4053) ([Danila Kutenin](https://github.com/danlark1)) +- Pruning of unused shards if `SELECT` query filters by sharding key (setting `optimize_skip_unused_shards`). [#3851](https://github.com/ClickHouse/ClickHouse/pull/3851) ([Gleb Kanterov](https://github.com/kanterov), [Ivan](https://github.com/abyss7)) +- Allow `Kafka` engine to ignore some number of parsing errors per block. [#4094](https://github.com/ClickHouse/ClickHouse/pull/4094) ([Ivan](https://github.com/abyss7)) +- Added support for `CatBoost` multiclass models evaluation. Function `modelEvaluate` returns tuple with per-class raw predictions for multiclass models. `libcatboostmodel.so` should be built with [#607](https://github.com/catboost/catboost/pull/607). [#3959](https://github.com/ClickHouse/ClickHouse/pull/3959) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Added functions `filesystemAvailable`, `filesystemFree`, `filesystemCapacity`. [#4097](https://github.com/ClickHouse/ClickHouse/pull/4097) ([Boris Granveaud](https://github.com/bgranvea)) +- Added hashing functions `xxHash64` and `xxHash32`. [#3905](https://github.com/ClickHouse/ClickHouse/pull/3905) ([filimonov](https://github.com/filimonov)) +- Added `gccMurmurHash` hashing function (GCC flavoured Murmur hash) which uses the same hash seed as [gcc](https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/include/bits/functional_hash.h#L191) [#4000](https://github.com/ClickHouse/ClickHouse/pull/4000) ([sundyli](https://github.com/sundy-li)) +- Added hashing functions `javaHash`, `hiveHash`. [#3811](https://github.com/ClickHouse/ClickHouse/pull/3811) ([shangshujie365](https://github.com/shangshujie365)) +- Added table function `remoteSecure`. Function works as `remote`, but uses secure connection. [#4088](https://github.com/ClickHouse/ClickHouse/pull/4088) ([proller](https://github.com/proller)) + +#### Experimental Features {#experimental-features-3} + +- Added multiple JOINs emulation (`allow_experimental_multiple_joins_emulation` setting). [#3946](https://github.com/ClickHouse/ClickHouse/pull/3946) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-21} + +- Make `compiled_expression_cache_size` setting limited by default to lower memory consumption. [#4041](https://github.com/ClickHouse/ClickHouse/pull/4041) ([alesapin](https://github.com/alesapin)) +- Fix a bug that led to hangups in threads that perform ALTERs of Replicated tables and in the thread that updates configuration from ZooKeeper. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3891](https://github.com/ClickHouse/ClickHouse/issues/3891) [#3934](https://github.com/ClickHouse/ClickHouse/pull/3934) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fixed a race condition when executing a distributed ALTER task. The race condition led to more than one replica trying to execute the task and all replicas except one failing with a ZooKeeper error. [#3904](https://github.com/ClickHouse/ClickHouse/pull/3904) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix a bug when `from_zk` config elements weren’t refreshed after a request to ZooKeeper timed out. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3947](https://github.com/ClickHouse/ClickHouse/pull/3947) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix bug with wrong prefix for IPv4 subnet masks. [#3945](https://github.com/ClickHouse/ClickHouse/pull/3945) ([alesapin](https://github.com/alesapin)) +- Fixed crash (`std::terminate`) in rare cases when a new thread cannot be created due to exhausted resources. [#3956](https://github.com/ClickHouse/ClickHouse/pull/3956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug when in `remote` table function execution when wrong restrictions were used for in `getStructureOfRemoteTable`. [#4009](https://github.com/ClickHouse/ClickHouse/pull/4009) ([alesapin](https://github.com/alesapin)) +- Fix a leak of netlink sockets. They were placed in a pool where they were never deleted and new sockets were created at the start of a new thread when all current sockets were in use. [#4017](https://github.com/ClickHouse/ClickHouse/pull/4017) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix bug with closing `/proc/self/fd` directory earlier than all fds were read from `/proc` after forking `odbc-bridge` subprocess. [#4120](https://github.com/ClickHouse/ClickHouse/pull/4120) ([alesapin](https://github.com/alesapin)) +- Fixed String to UInt monotonic conversion in case of usage String in primary key. [#3870](https://github.com/ClickHouse/ClickHouse/pull/3870) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed error in calculation of integer conversion function monotonicity. [#3921](https://github.com/ClickHouse/ClickHouse/pull/3921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segfault in `arrayEnumerateUniq`, `arrayEnumerateDense` functions in case of some invalid arguments. [#3909](https://github.com/ClickHouse/ClickHouse/pull/3909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix UB in StorageMerge. [#3910](https://github.com/ClickHouse/ClickHouse/pull/3910) ([Amos Bird](https://github.com/amosbird)) +- Fixed segfault in functions `addDays`, `subtractDays`. [#3913](https://github.com/ClickHouse/ClickHouse/pull/3913) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error: functions `round`, `floor`, `trunc`, `ceil` may return bogus result when executed on integer argument and large negative scale. [#3914](https://github.com/ClickHouse/ClickHouse/pull/3914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug induced by ‘kill query sync’ which leads to a core dump. [#3916](https://github.com/ClickHouse/ClickHouse/pull/3916) ([muVulDeePecker](https://github.com/fancyqlx)) +- Fix bug with long delay after empty replication queue. [#3928](https://github.com/ClickHouse/ClickHouse/pull/3928) [#3932](https://github.com/ClickHouse/ClickHouse/pull/3932) ([alesapin](https://github.com/alesapin)) +- Fixed excessive memory usage in case of inserting into table with `LowCardinality` primary key. [#3955](https://github.com/ClickHouse/ClickHouse/pull/3955) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed `LowCardinality` serialization for `Native` format in case of empty arrays. [#3907](https://github.com/ClickHouse/ClickHouse/issues/3907) [#4011](https://github.com/ClickHouse/ClickHouse/pull/4011) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed incorrect result while using distinct by single LowCardinality numeric column. [#3895](https://github.com/ClickHouse/ClickHouse/issues/3895) [#4012](https://github.com/ClickHouse/ClickHouse/pull/4012) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed specialized aggregation with LowCardinality key (in case when `compile` setting is enabled). [#3886](https://github.com/ClickHouse/ClickHouse/pull/3886) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fix user and password forwarding for replicated tables queries. [#3957](https://github.com/ClickHouse/ClickHouse/pull/3957) ([alesapin](https://github.com/alesapin)) ([小路](https://github.com/nicelulu)) +- Fixed very rare race condition that can happen when listing tables in Dictionary database while reloading dictionaries. [#3970](https://github.com/ClickHouse/ClickHouse/pull/3970) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed incorrect result when HAVING was used with ROLLUP or CUBE. [#3756](https://github.com/ClickHouse/ClickHouse/issues/3756) [#3837](https://github.com/ClickHouse/ClickHouse/pull/3837) ([Sam Chou](https://github.com/reflection)) +- Fixed column aliases for query with `JOIN ON` syntax and distributed tables. [#3980](https://github.com/ClickHouse/ClickHouse/pull/3980) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed error in internal implementation of `quantileTDigest` (found by Artem Vakhrushev). This error never happens in ClickHouse and was relevant only for those who use ClickHouse codebase as a library directly. [#3935](https://github.com/ClickHouse/ClickHouse/pull/3935) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvements {#improvements-6} + +- Support for `IF NOT EXISTS` in `ALTER TABLE ADD COLUMN` statements along with `IF EXISTS` in `DROP/MODIFY/CLEAR/COMMENT COLUMN`. [#3900](https://github.com/ClickHouse/ClickHouse/pull/3900) ([Boris Granveaud](https://github.com/bgranvea)) +- Function `parseDateTimeBestEffort`: support for formats `DD.MM.YYYY`, `DD.MM.YY`, `DD-MM-YYYY`, `DD-Mon-YYYY`, `DD/Month/YYYY` and similar. [#3922](https://github.com/ClickHouse/ClickHouse/pull/3922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CapnProtoInputStream` now support jagged structures. [#4063](https://github.com/ClickHouse/ClickHouse/pull/4063) ([Odin Hultgren Van Der Horst](https://github.com/Miniwoffer)) +- Usability improvement: added a check that server process is started from the data directory’s owner. Do not allow to start server from root if the data belongs to non-root user. [#3785](https://github.com/ClickHouse/ClickHouse/pull/3785) ([sergey-v-galtsev](https://github.com/sergey-v-galtsev)) +- Better logic of checking required columns during analysis of queries with JOINs. [#3930](https://github.com/ClickHouse/ClickHouse/pull/3930) ([Artem Zuikov](https://github.com/4ertus2)) +- Decreased the number of connections in case of large number of Distributed tables in a single server. [#3726](https://github.com/ClickHouse/ClickHouse/pull/3726) ([Winter Zhang](https://github.com/zhang2014)) +- Supported totals row for `WITH TOTALS` query for ODBC driver. [#3836](https://github.com/ClickHouse/ClickHouse/pull/3836) ([Maksim Koritckiy](https://github.com/nightweb)) +- Allowed to use `Enum`s as integers inside if function. [#3875](https://github.com/ClickHouse/ClickHouse/pull/3875) ([Ivan](https://github.com/abyss7)) +- Added `low_cardinality_allow_in_native_format` setting. If disabled, do not use `LowCadrinality` type in `Native` format. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Removed some redundant objects from compiled expressions cache to lower memory usage. [#4042](https://github.com/ClickHouse/ClickHouse/pull/4042) ([alesapin](https://github.com/alesapin)) +- Add check that `SET send_logs_level = 'value'` query accept appropriate value. [#3873](https://github.com/ClickHouse/ClickHouse/pull/3873) ([Sabyanin Maxim](https://github.com/s-mx)) +- Fixed data type check in type conversion functions. [#3896](https://github.com/ClickHouse/ClickHouse/pull/3896) ([Winter Zhang](https://github.com/zhang2014)) + +#### Performance Improvements {#performance-improvements-5} + +- Add a MergeTree setting `use_minimalistic_part_header_in_zookeeper`. If enabled, Replicated tables will store compact part metadata in a single part znode. This can dramatically reduce ZooKeeper snapshot size (especially if the tables have a lot of columns). Note that after enabling this setting you will not be able to downgrade to a version that does not support it. [#3960](https://github.com/ClickHouse/ClickHouse/pull/3960) ([Alex Zatelepin](https://github.com/ztlpn)) +- Add an DFA-based implementation for functions `sequenceMatch` and `sequenceCount` in case pattern does not contain time. [#4004](https://github.com/ClickHouse/ClickHouse/pull/4004) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Performance improvement for integer numbers serialization. [#3968](https://github.com/ClickHouse/ClickHouse/pull/3968) ([Amos Bird](https://github.com/amosbird)) +- Zero left padding PODArray so that -1 element is always valid and zeroed. It’s used for branchless calculation of offsets. [#3920](https://github.com/ClickHouse/ClickHouse/pull/3920) ([Amos Bird](https://github.com/amosbird)) +- Reverted `jemalloc` version which lead to performance degradation. [#4018](https://github.com/ClickHouse/ClickHouse/pull/4018) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Backward Incompatible Changes {#backward-incompatible-changes-2} + +- Removed undocumented feature `ALTER MODIFY PRIMARY KEY` because it was superseded by the `ALTER MODIFY ORDER BY` command. [#3887](https://github.com/ClickHouse/ClickHouse/pull/3887) ([Alex Zatelepin](https://github.com/ztlpn)) +- Removed function `shardByHash`. [#3833](https://github.com/ClickHouse/ClickHouse/pull/3833) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Forbid using scalar subqueries with result of type `AggregateFunction`. [#3865](https://github.com/ClickHouse/ClickHouse/pull/3865) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-6} + +- Added support for PowerPC (`ppc64le`) build. [#4132](https://github.com/ClickHouse/ClickHouse/pull/4132) ([Danila Kutenin](https://github.com/danlark1)) +- Stateful functional tests are run on public available dataset. [#3969](https://github.com/ClickHouse/ClickHouse/pull/3969) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when the server cannot start with the `bash: /usr/bin/clickhouse-extract-from-config: Operation not permitted` message within Docker or systemd-nspawn. [#4136](https://github.com/ClickHouse/ClickHouse/pull/4136) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Updated `rdkafka` library to v1.0.0-RC5. Used cppkafka instead of raw C interface. [#4025](https://github.com/ClickHouse/ClickHouse/pull/4025) ([Ivan](https://github.com/abyss7)) +- Updated `mariadb-client` library. Fixed one of issues found by UBSan. [#3924](https://github.com/ClickHouse/ClickHouse/pull/3924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Some fixes for UBSan builds. [#3926](https://github.com/ClickHouse/ClickHouse/pull/3926) [#3021](https://github.com/ClickHouse/ClickHouse/pull/3021) [#3948](https://github.com/ClickHouse/ClickHouse/pull/3948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added per-commit runs of tests with UBSan build. +- Added per-commit runs of PVS-Studio static analyzer. +- Fixed bugs found by PVS-Studio. [#4013](https://github.com/ClickHouse/ClickHouse/pull/4013) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed glibc compatibility issues. [#4100](https://github.com/ClickHouse/ClickHouse/pull/4100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move Docker images to 18.10 and add compatibility file for glibc \>= 2.28 [#3965](https://github.com/ClickHouse/ClickHouse/pull/3965) ([alesapin](https://github.com/alesapin)) +- Add env variable if user do not want to chown directories in server Docker image. [#3967](https://github.com/ClickHouse/ClickHouse/pull/3967) ([alesapin](https://github.com/alesapin)) +- Enabled most of the warnings from `-Weverything` in clang. Enabled `-Wpedantic`. [#3986](https://github.com/ClickHouse/ClickHouse/pull/3986) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added a few more warnings that are available only in clang 8. [#3993](https://github.com/ClickHouse/ClickHouse/pull/3993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Link to `libLLVM` rather than to individual LLVM libs when using shared linking. [#3989](https://github.com/ClickHouse/ClickHouse/pull/3989) ([Orivej Desh](https://github.com/orivej)) +- Added sanitizer variables for test images. [#4072](https://github.com/ClickHouse/ClickHouse/pull/4072) ([alesapin](https://github.com/alesapin)) +- `clickhouse-server` debian package will recommend `libcap2-bin` package to use `setcap` tool for setting capabilities. This is optional. [#4093](https://github.com/ClickHouse/ClickHouse/pull/4093) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Improved compilation time, fixed includes. [#3898](https://github.com/ClickHouse/ClickHouse/pull/3898) ([proller](https://github.com/proller)) +- Added performance tests for hash functions. [#3918](https://github.com/ClickHouse/ClickHouse/pull/3918) ([filimonov](https://github.com/filimonov)) +- Fixed cyclic library dependences. [#3958](https://github.com/ClickHouse/ClickHouse/pull/3958) ([proller](https://github.com/proller)) +- Improved compilation with low available memory. [#4030](https://github.com/ClickHouse/ClickHouse/pull/4030) ([proller](https://github.com/proller)) +- Added test script to reproduce performance degradation in `jemalloc`. [#4036](https://github.com/ClickHouse/ClickHouse/pull/4036) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed misspells in comments and string literals under `dbms`. [#4122](https://github.com/ClickHouse/ClickHouse/pull/4122) ([maiha](https://github.com/maiha)) +- Fixed typos in comments. [#4089](https://github.com/ClickHouse/ClickHouse/pull/4089) ([Evgenii Pravda](https://github.com/kvinty)) + +## [Changelog for 2018](./2018.md) diff --git a/docs/ja/whats-new/changelog/2020.md b/docs/ja/whats-new/changelog/2020.md new file mode 100644 index 00000000000..cbd0ee1ccca --- /dev/null +++ b/docs/ja/whats-new/changelog/2020.md @@ -0,0 +1,3534 @@ +--- +slug: /ja/whats-new/changelog/2020 +sidebar_position: 14 +sidebar_label: '2020' +title: 2020 Changelog +--- + +### ClickHouse release 20.12 + +### ClickHouse release v20.12.5.14-stable, 2020-12-28 + +#### Bug Fix + +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` does not actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). + +#### Build/Testing/Packaging Improvement + +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.12.4.5-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual IPv4/IPv6 stack; - Fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes; Possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fixed key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fixed possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). + + +### ClickHouse release v20.12.3.3-stable, 2020-12-13 + +#### Backward Incompatible Change + +* Enable `use_compact_format_in_distributed_parts_names` by default (see the documentation for the reference). [#16728](https://github.com/ClickHouse/ClickHouse/pull/16728) ([Azat Khuzhin](https://github.com/azat)). +* Accept user settings related to file formats (e.g. `format_csv_delimiter`) in the `SETTINGS` clause when creating a table that uses `File` engine, and use these settings in all `INSERT`s and `SELECT`s. The file format settings changed in the current user session, or in the `SETTINGS` clause of a DML query itself, no longer affect the query. [#16591](https://github.com/ClickHouse/ClickHouse/pull/16591) ([Alexander Kuzmenkov](https://github.com/akuzm)). + +#### New Feature + +* add `*.xz` compression/decompression support.It enables using `*.xz` in `file()` function. This closes [#8828](https://github.com/ClickHouse/ClickHouse/issues/8828). [#16578](https://github.com/ClickHouse/ClickHouse/pull/16578) ([Abi Palagashvili](https://github.com/fibersel)). +* Introduce the query `ALTER TABLE ... DROP|DETACH PART 'part_name'`. [#15511](https://github.com/ClickHouse/ClickHouse/pull/15511) ([nvartolomei](https://github.com/nvartolomei)). +* Added new ALTER UPDATE/DELETE IN PARTITION syntax. [#13403](https://github.com/ClickHouse/ClickHouse/pull/13403) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Allow formatting named tuples as JSON objects when using JSON input/output formats, controlled by the `output_format_json_named_tuples_as_objects` setting, disabled by default. [#17175](https://github.com/ClickHouse/ClickHouse/pull/17175) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add a possibility to input enum value as it's id in TSV and CSV formats by default. [#16834](https://github.com/ClickHouse/ClickHouse/pull/16834) ([Kruglov Pavel](https://github.com/Avogar)). +* Add COLLATE support for Nullable, LowCardinality, Array and Tuple, where nested type is String. Also refactor the code associated with collations in ColumnString.cpp. [#16273](https://github.com/ClickHouse/ClickHouse/pull/16273) ([Kruglov Pavel](https://github.com/Avogar)). +* New `tcpPort` function returns TCP port listened by this server. [#17134](https://github.com/ClickHouse/ClickHouse/pull/17134) ([Ivan](https://github.com/abyss7)). +* Add new math functions: `acosh`, `asinh`, `atan2`, `atanh`, `cosh`, `hypot`, `log1p`, `sinh`. [#16636](https://github.com/ClickHouse/ClickHouse/pull/16636) ([Konstantin Malanchev](https://github.com/hombit)). +* Possibility to distribute the merges between different replicas. Introduces the `execute_merges_on_single_replica_time_threshold` mergetree setting. [#16424](https://github.com/ClickHouse/ClickHouse/pull/16424) ([filimonov](https://github.com/filimonov)). +* Add setting `aggregate_functions_null_for_empty` for SQL standard compatibility. This option will rewrite all aggregate functions in a query, adding -OrNull suffix to them. Implements [10273](https://github.com/ClickHouse/ClickHouse/issues/10273). [#16123](https://github.com/ClickHouse/ClickHouse/pull/16123) ([flynn](https://github.com/ucasFL)). +* Updated DateTime, DateTime64 parsing to accept string Date literal format. [#16040](https://github.com/ClickHouse/ClickHouse/pull/16040) ([Maksim Kita](https://github.com/kitaisreal)). +* Make it possible to change the path to history file in `clickhouse-client` using the `--history_file` parameter. [#15960](https://github.com/ClickHouse/ClickHouse/pull/15960) ([Maksim Kita](https://github.com/kitaisreal)). + +#### Bug Fix + +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([Amos Bird](https://github.com/amosbird)). +* Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* fix incorrect initialization of `max_compress_block_size` of MergeTreeWriterSettings with `min_compress_block_size`. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). +* Exception message about max table size to drop was displayed incorrectly. [#17764](https://github.com/ClickHouse/ClickHouse/pull/17764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* In might be determined incorrectly if cluster is circular- (cross-) replicated or not when executing `ON CLUSTER` query due to race condition when `pool_size` > 1. It's fixed. [#17640](https://github.com/ClickHouse/ClickHouse/pull/17640) ([tavplubix](https://github.com/tavplubix)). +* Exception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix issue when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* fix `toInt256(inf)` stack overflow. Int256 is an experimental feature. Closed [#17235](https://github.com/ClickHouse/ClickHouse/issues/17235). [#17257](https://github.com/ClickHouse/ClickHouse/pull/17257) ([flynn](https://github.com/ucasFL)). +* Fix possible `Unexpected packet Data received from client` error logged for Distributed queries with `LIMIT`. [#17254](https://github.com/ClickHouse/ClickHouse/pull/17254) ([Azat Khuzhin](https://github.com/azat)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fix possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Fix ColumnConst comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Multiple fixed for MaterializeMySQL (experimental feature). Fixes [#16923](https://github.com/ClickHouse/ClickHouse/issues/16923) Fixes [#15883](https://github.com/ClickHouse/ClickHouse/issues/15883) Fix MaterializeMySQL SYNC failure when the modify MySQL binlog_checksum. [#17091](https://github.com/ClickHouse/ClickHouse/pull/17091) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed crash on `CREATE TABLE ... AS some_table` query when `some_table` was created `AS table_function()` Fixes [#16944](https://github.com/ClickHouse/ClickHouse/issues/16944). [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). +* Bug unfinished implementation for funciton fuzzBits, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Fix LLVM's libunwind in the case when CFA register is RAX. This is the [bug](https://bugs.llvm.org/show_bug.cgi?id=48186) in [LLVM's libunwind](https://github.com/llvm/llvm-project/tree/master/libunwind). We already have workarounds for this bug. [#17046](https://github.com/ClickHouse/ClickHouse/pull/17046) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fix `optimize_distributed_group_by_sharding_key` setting (that is disabled by default) for query with OFFSET only. [#16996](https://github.com/ClickHouse/ClickHouse/pull/16996) ([Azat Khuzhin](https://github.com/azat)). +* Fix for Merge tables over Distributed tables with JOIN. [#16993](https://github.com/ClickHouse/ClickHouse/pull/16993) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. Big integers support is experimental. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Fix possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix order by optimization with monotonous functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. Fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix strange code in InterpreterShowAccessQuery. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Prevent clickhouse server crashes when using the function `timeSeriesGroupSum`. The function is removed from newer ClickHouse releases. [#16865](https://github.com/ClickHouse/ClickHouse/pull/16865) ([filimonov](https://github.com/filimonov)). +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when using `any` without any arguments. This is for [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803) . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* If no memory can be allocated while writing table metadata on disk, broken metadata file can be written. [#16772](https://github.com/ClickHouse/ClickHouse/pull/16772) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix trivial query optimization with partition predicate. [#16767](https://github.com/ClickHouse/ClickHouse/pull/16767) ([Azat Khuzhin](https://github.com/azat)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* Return number of affected rows for INSERT queries via MySQL protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fix remote query failure when using 'if' suffix aggregate function. Fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) Fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system.tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). + +#### Improvement + +* Remove empty parts after they were pruned by TTL, mutation, or collapsing merge algorithm. [#16895](https://github.com/ClickHouse/ClickHouse/pull/16895) ([Anton Popov](https://github.com/CurtizJ)). +* Enable compact format of directories for asynchronous sends in Distributed tables: `use_compact_format_in_distributed_parts_names` is set to 1 by default. [#16788](https://github.com/ClickHouse/ClickHouse/pull/16788) ([Azat Khuzhin](https://github.com/azat)). +* Abort multipart upload if no data was written to S3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Mask password in data_path in the system.distribution_queue. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). +* Throw error when use column transformer replaces non existing column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). +* Turn off parallel parsing when there is no enough memory for all threads to work simultaneously. Also there could be exceptions like "Memory limit exceeded" when somebody will try to insert extremely huge rows (> min_chunk_bytes_for_parallel_parsing), because each piece to parse has to be independent set of strings (one or more). [#16721](https://github.com/ClickHouse/ClickHouse/pull/16721) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Correct grammar in error message in JSONEachRow, JSONCompactEachRow, and RegexpRow input formats. [#17205](https://github.com/ClickHouse/ClickHouse/pull/17205) ([nico piderman](https://github.com/sneako)). +* Set default `host` and `port` parameters for `SOURCE(CLICKHOUSE(...))` to current instance and set default `user` value to `'default'`. [#16997](https://github.com/ClickHouse/ClickHouse/pull/16997) ([vdimir](https://github.com/vdimir)). +* Throw an informative error message when doing `ATTACH/DETACH TABLE `. Before this PR, `detach table ` works but leads to an ill-formed in-memory metadata. [#16885](https://github.com/ClickHouse/ClickHouse/pull/16885) ([Amos Bird](https://github.com/amosbird)). +* Add cutToFirstSignificantSubdomainWithWWW(). [#16845](https://github.com/ClickHouse/ClickHouse/pull/16845) ([Azat Khuzhin](https://github.com/azat)). +* Server refused to startup with exception message if wrong config is given (`metric_log`.`collect_interval_milliseconds` is missing). [#16815](https://github.com/ClickHouse/ClickHouse/pull/16815) ([Ivan](https://github.com/abyss7)). +* Better exception message when configuration for distributed DDL is absent. This fixes [#5075](https://github.com/ClickHouse/ClickHouse/issues/5075). [#16769](https://github.com/ClickHouse/ClickHouse/pull/16769) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Usability improvement: better suggestions in syntax error message when `CODEC` expression is misplaced in `CREATE TABLE` query. This fixes [#12493](https://github.com/ClickHouse/ClickHouse/issues/12493). [#16768](https://github.com/ClickHouse/ClickHouse/pull/16768) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove empty directories for async INSERT at start of Distributed engine. [#16729](https://github.com/ClickHouse/ClickHouse/pull/16729) ([Azat Khuzhin](https://github.com/azat)). +* Workaround for use S3 with nginx server as proxy. Nginx currenty does not accept urls with empty path like `http://domain.com?delete`, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like `http://domain.com/?delete`. [#16709](https://github.com/ClickHouse/ClickHouse/pull/16709) ([ianton-ru](https://github.com/ianton-ru)). +* Allow `reinterpretAs*` functions to work for integers and floats of the same size. Implements [16640](https://github.com/ClickHouse/ClickHouse/issues/16640). [#16657](https://github.com/ClickHouse/ClickHouse/pull/16657) ([flynn](https://github.com/ucasFL)). +* Now, `` configuration can be changed in `config.xml` and reloaded without server startup. [#16627](https://github.com/ClickHouse/ClickHouse/pull/16627) ([Amos Bird](https://github.com/amosbird)). +* Support SNI in https connections to remote resources. This will allow to connect to Cloudflare servers that require SNI. This fixes [#10055](https://github.com/ClickHouse/ClickHouse/issues/10055). [#16252](https://github.com/ClickHouse/ClickHouse/pull/16252) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make it possible to connect to `clickhouse-server` secure endpoint which requires SNI. This is possible when `clickhouse-server` is hosted behind TLS proxy. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). +* Fix possible stack overflow if a loop of materialized views is created. This closes [#15732](https://github.com/ClickHouse/ClickHouse/issues/15732). [#16048](https://github.com/ClickHouse/ClickHouse/pull/16048) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify the implementation of background tasks processing for the MergeTree table engines family. There should be no visible changes for user. [#15983](https://github.com/ClickHouse/ClickHouse/pull/15983) ([alesapin](https://github.com/alesapin)). +* Improvement for MaterializeMySQL (experimental feature). Throw exception about right sync privileges when MySQL sync user has error privileges. [#15977](https://github.com/ClickHouse/ClickHouse/pull/15977) ([TCeason](https://github.com/TCeason)). +* Made `indexOf()` use BloomFilter. [#14977](https://github.com/ClickHouse/ClickHouse/pull/14977) ([achimbab](https://github.com/achimbab)). + +#### Performance Improvement + +* Use Floyd-Rivest algorithm, it is the best for the ClickHouse use case of partial sorting. Bechmarks are in https://github.com/danlark1/miniselect and [here](https://drive.google.com/drive/folders/1DHEaeXgZuX6AJ9eByeZ8iQVQv0ueP8XM). [#16825](https://github.com/ClickHouse/ClickHouse/pull/16825) ([Danila Kutenin](https://github.com/danlark1)). +* Now `ReplicatedMergeTree` tree engines family uses a separate thread pool for replicated fetches. Size of the pool limited by setting `background_fetches_pool_size` which can be tuned with a server restart. The default value of the setting is 3 and it means that the maximum amount of parallel fetches is equal to 3 (and it allows to utilize 10G network). Fixes #520. [#16390](https://github.com/ClickHouse/ClickHouse/pull/16390) ([alesapin](https://github.com/alesapin)). +* Fixed uncontrolled growth of the state of `quantileTDigest`. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Add `VIEW` subquery description to `EXPLAIN`. Limit push down optimisation for `VIEW`. Add local replicas of `Distributed` to query plan. [#14936](https://github.com/ClickHouse/ClickHouse/pull/14936) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix optimize_read_in_order/optimize_aggregation_in_order with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). +* Now we can safely prune partitions with exact match. Useful case: Suppose table is partitioned by `intHash64(x) % 100` and the query has condition on `intHash64(x) % 100` verbatim, not on x. [#16253](https://github.com/ClickHouse/ClickHouse/pull/16253) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add `EmbeddedRocksDB` table engine (can be used for dictionaries). [#15073](https://github.com/ClickHouse/ClickHouse/pull/15073) ([sundyli](https://github.com/sundy-li)). + +#### Build/Testing/Packaging Improvement + +* Improvements in test coverage building images. [#17233](https://github.com/ClickHouse/ClickHouse/pull/17233) ([alesapin](https://github.com/alesapin)). +* Update embedded timezone data to version 2020d (also update cctz to the latest master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). +* Fix UBSan report in Poco. This closes [#12719](https://github.com/ClickHouse/ClickHouse/issues/12719). [#16765](https://github.com/ClickHouse/ClickHouse/pull/16765) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not instrument 3rd-party libraries with UBSan. [#16764](https://github.com/ClickHouse/ClickHouse/pull/16764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in cache dictionaries. This closes [#12641](https://github.com/ClickHouse/ClickHouse/issues/12641). [#16763](https://github.com/ClickHouse/ClickHouse/pull/16763) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report when trying to convert infinite floating point number to integer. This closes [#14190](https://github.com/ClickHouse/ClickHouse/issues/14190). [#16677](https://github.com/ClickHouse/ClickHouse/pull/16677) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +## ClickHouse release 20.11 + +### ClickHouse release v20.11.7.16-stable, 2021-03-02 + +#### Improvement + +* Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). + +#### Bug Fix + +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Deadlock was possible if system.text_log is enabled. This fixes [#19874](https://github.com/ClickHouse/ClickHouse/issues/19874). [#19875](https://github.com/ClickHouse/ClickHouse/pull/19875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* In previous versions, unusual arguments for function arrayEnumerateUniq may cause crash or infinite loop. This closes [#19787](https://github.com/ClickHouse/ClickHouse/issues/19787). [#19788](https://github.com/ClickHouse/ClickHouse/pull/19788) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed stack overflow when using accurate comparison of arithmetic type with string type. [#19773](https://github.com/ClickHouse/ClickHouse/pull/19773) ([tavplubix](https://github.com/tavplubix)). +* Fix a segmentation fault in `bitmapAndnot` function. Fixes [#19668](https://github.com/ClickHouse/ClickHouse/issues/19668). [#19713](https://github.com/ClickHouse/ClickHouse/pull/19713) ([Maksim Kita](https://github.com/kitaisreal)). +* Some functions with big integers may cause segfault. Big integers is experimental feature. This closes [#19667](https://github.com/ClickHouse/ClickHouse/issues/19667). [#19672](https://github.com/ClickHouse/ClickHouse/pull/19672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of function `neighbor` for `LowCardinality` argument. Fixes [#10333](https://github.com/ClickHouse/ClickHouse/issues/10333). [#19617](https://github.com/ClickHouse/ClickHouse/pull/19617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use-after-free of the CompressedWriteBuffer in Connection after disconnect. [#19599](https://github.com/ClickHouse/ClickHouse/pull/19599) ([Azat Khuzhin](https://github.com/azat)). +* `DROP/DETACH TABLE table ON CLUSTER cluster SYNC` query might hang, it's fixed. Fixes [#19568](https://github.com/ClickHouse/ClickHouse/issues/19568). [#19572](https://github.com/ClickHouse/ClickHouse/pull/19572) ([tavplubix](https://github.com/tavplubix)). +* Query CREATE DICTIONARY id expression fix. [#19571](https://github.com/ClickHouse/ClickHouse/pull/19571) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix SIGSEGV with merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX. [#19528](https://github.com/ClickHouse/ClickHouse/pull/19528) ([Azat Khuzhin](https://github.com/azat)). +* Buffer overflow (on memory read) was possible if `addMonth` function was called with specifically crafted arguments. This fixes [#19441](https://github.com/ClickHouse/ClickHouse/issues/19441). This fixes [#19413](https://github.com/ClickHouse/ClickHouse/issues/19413). [#19472](https://github.com/ClickHouse/ClickHouse/pull/19472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Mark distributed batch as broken in case of empty data block in one of files. [#19449](https://github.com/ClickHouse/ClickHouse/pull/19449) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible buffer overflow in Uber H3 library. See https://github.com/uber/h3/issues/392. This closes [#19219](https://github.com/ClickHouse/ClickHouse/issues/19219). [#19383](https://github.com/ClickHouse/ClickHouse/pull/19383) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix system.parts _state column (LOGICAL_ERROR when querying this column, due to incorrect order). [#19346](https://github.com/ClickHouse/ClickHouse/pull/19346) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Cannot convert column now64() because it is constant but values of constants are different in source and result`. Continuation of [#7156](https://github.com/ClickHouse/ClickHouse/issues/7156). [#19316](https://github.com/ClickHouse/ClickHouse/pull/19316) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when concurrent `ALTER` and `DROP` queries may hang while processing ReplicatedMergeTree table. [#19237](https://github.com/ClickHouse/ClickHouse/pull/19237) ([alesapin](https://github.com/alesapin)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Fixed `There is no checkpoint` error when inserting data through http interface using `Template` or `CustomSeparated` format. Fixes [#19021](https://github.com/ClickHouse/ClickHouse/issues/19021). [#19072](https://github.com/ClickHouse/ClickHouse/pull/19072) ([tavplubix](https://github.com/tavplubix)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when mutation with some escaped text (like `ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')` serialized incorrectly. Fixes [#18878](https://github.com/ClickHouse/ClickHouse/issues/18878). [#18944](https://github.com/ClickHouse/ClickHouse/pull/18944) ([alesapin](https://github.com/alesapin)). +* Attach partition should reset the mutation. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix possible hang at shutdown in clickhouse-local. This fixes [#18891](https://github.com/ClickHouse/ClickHouse/issues/18891). [#18893](https://github.com/ClickHouse/ClickHouse/pull/18893) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Asynchronous distributed INSERTs can be rejected by the server if the setting `network_compression_method` is globally set to non-default value. This fixes [#18741](https://github.com/ClickHouse/ClickHouse/issues/18741). [#18776](https://github.com/ClickHouse/ClickHouse/pull/18776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix Logger with unmatched arg size. [#18717](https://github.com/ClickHouse/ClickHouse/pull/18717) ([sundyli](https://github.com/sundy-li)). +* Add FixedString Data type support. I'll get this exception "Code: 50, e.displayText() = DB::Exception: Unsupported type FixedString(1)" when replicating data from MySQL to ClickHouse. This patch fixes bug [#18450](https://github.com/ClickHouse/ClickHouse/issues/18450) Also fixes [#6556](https://github.com/ClickHouse/ClickHouse/issues/6556). [#18553](https://github.com/ClickHouse/ClickHouse/pull/18553) ([awesomeleo](https://github.com/awesomeleo)). +* Fix possible `Pipeline stuck` error while using `ORDER BY` after subquery with `RIGHT` or `FULL` join. [#18550](https://github.com/ClickHouse/ClickHouse/pull/18550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which may lead to `ALTER` queries hung after corresponding mutation kill. Found by thread fuzzer. [#18518](https://github.com/ClickHouse/ClickHouse/pull/18518) ([alesapin](https://github.com/alesapin)). +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Disable constant folding for subqueries on the analysis stage, when the result cannot be calculated. [#18446](https://github.com/ClickHouse/ClickHouse/pull/18446) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* `SELECT count() FROM table` now can be executed if only one any column can be selected from the `table`. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* `SELECT JOIN` now requires the `SELECT` privilege on each of the joined tables. This PR fixes [#17654](https://github.com/ClickHouse/ClickHouse/issues/17654). [#18232](https://github.com/ClickHouse/ClickHouse/pull/18232) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible incomplete query result while reading from `MergeTree*` in case of read backoff (message ` MergeTreeReadPool: Will lower number of threads` in logs). Was introduced in [#16423](https://github.com/ClickHouse/ClickHouse/issues/16423). Fixes [#18137](https://github.com/ClickHouse/ClickHouse/issues/18137). [#18216](https://github.com/ClickHouse/ClickHouse/pull/18216) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` does not actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). +* Fix indeterministic functions with predicate optimizer. This fixes [#17244](https://github.com/ClickHouse/ClickHouse/issues/17244). [#17273](https://github.com/ClickHouse/ClickHouse/pull/17273) ([Winter Zhang](https://github.com/zhang2014)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). + +#### Build/Testing/Packaging Improvement + +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). + + + +### ClickHouse release v20.11.6.6-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6 stack` and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fixed key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed inconsistent behaviour of `optimize_trivial_count_query` with partition predicate. [#17644](https://github.com/ClickHouse/ClickHouse/pull/17644) ([Azat Khuzhin](https://github.com/azat)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when xxception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when clickhouse-client is used in interactive mode with multiline queries and single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed alter query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed duplicates after `DISTINCT` which were possible because of incorrect optimization. This fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash while reading from `JOIN` table with `LowCardinality` types. This fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fixed possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Fixed `ColumnConst` comparison which leads to crash. This fixes [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader `ReplicatedMergeTreeTables`. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed fuzzer-found bug in funciton `fuzzBits`. This fixes [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order by optimization with monotonous functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. This fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixed possible error `Illegal type of argument` for queries with `ORDER BY`. This fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when ClickHouse used to always return 0 insted of a number of affected rows for `INSERT` queries via MySQL protocol. This fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed uncontrolled growth of TDigest. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Fixed remote query failure when using suffix `if` in Aggregate function. This fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system.tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). +* Throw error when use ColumnTransformer replace non exist column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). + + +### ClickHouse release v20.11.3.3-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.11.2.1, 2020-11-11 + +#### Backward Incompatible Change + +* If some `profile` was specified in `distributed_ddl` config section, then this profile could overwrite settings of `default` profile on server startup. It's fixed, now settings of distributed DDL queries should not affect global server settings. [#16635](https://github.com/ClickHouse/ClickHouse/pull/16635) ([tavplubix](https://github.com/tavplubix)). +* Restrict to use of non-comparable data types (like `AggregateFunction`) in keys (Sorting key, Primary key, Partition key, and so on). [#16601](https://github.com/ClickHouse/ClickHouse/pull/16601) ([alesapin](https://github.com/alesapin)). +* Remove `ANALYZE` and `AST` queries, and make the setting `enable_debug_queries` obsolete since now it is the part of full featured `EXPLAIN` query. [#16536](https://github.com/ClickHouse/ClickHouse/pull/16536) ([Ivan](https://github.com/abyss7)). +* Aggregate functions `boundingRatio`, `rankCorr`, `retention`, `timeSeriesGroupSum`, `timeSeriesGroupRateSum`, `windowFunnel` were erroneously made case-insensitive. Now their names are made case sensitive as designed. Only functions that are specified in SQL standard or made for compatibility with other DBMS or functions similar to those should be case-insensitive. [#16407](https://github.com/ClickHouse/ClickHouse/pull/16407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `rankCorr` function return nan on insufficient data [#16124](https://github.com/ClickHouse/ClickHouse/issues/16124). [#16135](https://github.com/ClickHouse/ClickHouse/pull/16135) ([hexiaoting](https://github.com/hexiaoting)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added support of LDAP as a user directory for locally non-existent users. [#12736](https://github.com/ClickHouse/ClickHouse/pull/12736) ([Denis Glazachev](https://github.com/traceon)). +* Add `system.replicated_fetches` table which shows currently running background fetches. [#16428](https://github.com/ClickHouse/ClickHouse/pull/16428) ([alesapin](https://github.com/alesapin)). +* Added setting `date_time_output_format`. [#15845](https://github.com/ClickHouse/ClickHouse/pull/15845) ([Maksim Kita](https://github.com/kitaisreal)). +* Added minimal web UI to ClickHouse. [#16158](https://github.com/ClickHouse/ClickHouse/pull/16158) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allows to read/write Single protobuf message at once (w/o length-delimiters). [#15199](https://github.com/ClickHouse/ClickHouse/pull/15199) ([filimonov](https://github.com/filimonov)). +* Added initial OpenTelemetry support. ClickHouse now accepts OpenTelemetry traceparent headers over Native and HTTP protocols, and passes them downstream in some cases. The trace spans for executed queries are saved into the `system.opentelemetry_span_log` table. [#14195](https://github.com/ClickHouse/ClickHouse/pull/14195) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Allow specify primary key in column list of `CREATE TABLE` query. This is needed for compatibility with other SQL dialects. [#15823](https://github.com/ClickHouse/ClickHouse/pull/15823) ([Maksim Kita](https://github.com/kitaisreal)). +* Implement `OFFSET offset_row_count {ROW | ROWS} FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}` in SELECT query with ORDER BY. This is the SQL-standard way to specify `LIMIT`. [#15855](https://github.com/ClickHouse/ClickHouse/pull/15855) ([hexiaoting](https://github.com/hexiaoting)). +* `errorCodeToName` function - return variable name of the error (useful for analyzing query_log and similar). `system.errors` table - shows how many times errors has been happened (respects `system_events_show_zero_values`). [#16438](https://github.com/ClickHouse/ClickHouse/pull/16438) ([Azat Khuzhin](https://github.com/azat)). +* Added function `untuple` which is a special function which can introduce new columns to the SELECT list by expanding a named tuple. [#16242](https://github.com/ClickHouse/ClickHouse/pull/16242) ([Nikolai Kochetov](https://github.com/KochetovNicolai), [Amos Bird](https://github.com/amosbird)). +* Now we can provide identifiers via query parameters. And these parameters can be used as table objects or columns. [#16594](https://github.com/ClickHouse/ClickHouse/pull/16594) ([Amos Bird](https://github.com/amosbird)). +* Added big integers (UInt256, Int128, Int256) and UUID data types support for MergeTree BloomFilter index. Big integers is an experimental feature. [#16642](https://github.com/ClickHouse/ClickHouse/pull/16642) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `farmFingerprint64` function (non-cryptographic string hashing). [#16570](https://github.com/ClickHouse/ClickHouse/pull/16570) ([Jacob Hayes](https://github.com/JacobHayes)). +* Add `log_queries_min_query_duration_ms`, only queries slower than the value of this setting will go to `query_log`/`query_thread_log` (i.e. something like `slow_query_log` in mysql). [#16529](https://github.com/ClickHouse/ClickHouse/pull/16529) ([Azat Khuzhin](https://github.com/azat)). +* Ability to create a docker image on the top of `Alpine`. Uses precompiled binary and glibc components from ubuntu 20.04. [#16479](https://github.com/ClickHouse/ClickHouse/pull/16479) ([filimonov](https://github.com/filimonov)). +* Added `toUUIDOrNull`, `toUUIDOrZero` cast functions. [#16337](https://github.com/ClickHouse/ClickHouse/pull/16337) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `max_concurrent_queries_for_all_users` setting, see [#6636](https://github.com/ClickHouse/ClickHouse/issues/6636) for use cases. [#16154](https://github.com/ClickHouse/ClickHouse/pull/16154) ([nvartolomei](https://github.com/nvartolomei)). +* Add a new option `print_query_id` to clickhouse-client. It helps generate arbitrary strings with the current query id generated by the client. Also print query id in clickhouse-client by default. [#15809](https://github.com/ClickHouse/ClickHouse/pull/15809) ([Amos Bird](https://github.com/amosbird)). +* Add `tid` and `logTrace` functions. This closes [#9434](https://github.com/ClickHouse/ClickHouse/issues/9434). [#15803](https://github.com/ClickHouse/ClickHouse/pull/15803) ([flynn](https://github.com/ucasFL)). +* Add function `formatReadableTimeDelta` that format time delta to human readable string ... [#15497](https://github.com/ClickHouse/ClickHouse/pull/15497) ([Filipe Caixeta](https://github.com/filipecaixeta)). +* Added `disable_merges` option for volumes in multi-disk configuration. [#13956](https://github.com/ClickHouse/ClickHouse/pull/13956) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Experimental Feature + +* New functions `encrypt`, `aes_encrypt_mysql`, `decrypt`, `aes_decrypt_mysql`. These functions are working slowly, so we consider it as an experimental feature. [#11844](https://github.com/ClickHouse/ClickHouse/pull/11844) ([Vasily Nemkov](https://github.com/Enmk)). + +#### Bug Fix + +* Mask password in data_path in the `system.distribution_queue`. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* The setting `max_parallel_replicas` worked incorrectly if the queried table has no sampling. This fixes [#5733](https://github.com/ClickHouse/ClickHouse/issues/5733). [#16675](https://github.com/ClickHouse/ClickHouse/pull/16675) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix optimize_read_in_order/optimize_aggregation_in_order with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Calculation of `DEFAULT` expressions was involving possible name collisions (that was very unlikely to encounter). This fixes [#9359](https://github.com/ClickHouse/ClickHouse/issues/9359). [#16612](https://github.com/ClickHouse/ClickHouse/pull/16612) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `query_thread_log.query_duration_ms` unit. [#16563](https://github.com/ClickHouse/ClickHouse/pull/16563) ([Azat Khuzhin](https://github.com/azat)). +* Fix a bug when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine. `MaterializeMySQL` is an experimental feature. [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Specifically crafted argument of `round` function with `Decimal` was leading to integer division by zero. This fixes [#13338](https://github.com/ClickHouse/ClickHouse/issues/13338). [#16451](https://github.com/ClickHouse/ClickHouse/pull/16451) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix dictGet in sharding_key (and similar places, i.e. when the function context is stored permanently). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). +* Fix the exception thrown in `clickhouse-local` when trying to execute `OPTIMIZE` command. Fixes [#16076](https://github.com/ClickHouse/ClickHouse/issues/16076). [#16192](https://github.com/ClickHouse/ClickHouse/pull/16192) ([filimonov](https://github.com/filimonov)). +* Fixes [#15780](https://github.com/ClickHouse/ClickHouse/issues/15780) regression, e.g. `indexOf([1, 2, 3], toLowCardinality(1))` now is prohibited but it should not be. [#16038](https://github.com/ClickHouse/ClickHouse/pull/16038) ([Mike](https://github.com/myrrc)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). +* Now exception will be thrown when `ALTER MODIFY COLUMN ... DEFAULT ...` has incompatible default with column type. Fixes [#15854](https://github.com/ClickHouse/ClickHouse/issues/15854). [#15858](https://github.com/ClickHouse/ClickHouse/pull/15858) ([alesapin](https://github.com/alesapin)). +* Fixed IPv4CIDRToRange/IPv6CIDRToRange functions to accept const IP-column values. [#15856](https://github.com/ClickHouse/ClickHouse/pull/15856) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). + +#### Improvement + +* Treat `INTERVAL '1 hour'` as equivalent to `INTERVAL 1 HOUR`, to be compatible with Postgres and similar. This fixes [#15637](https://github.com/ClickHouse/ClickHouse/issues/15637). [#15978](https://github.com/ClickHouse/ClickHouse/pull/15978) ([flynn](https://github.com/ucasFL)). +* Enable parsing enum values by their numeric ids for CSV, TSV and JSON input formats. [#15685](https://github.com/ClickHouse/ClickHouse/pull/15685) ([vivarum](https://github.com/vivarum)). +* Better read task scheduling for JBOD architecture and `MergeTree` storage. New setting `read_backoff_min_concurrency` which serves as the lower limit to the number of reading threads. [#16423](https://github.com/ClickHouse/ClickHouse/pull/16423) ([Amos Bird](https://github.com/amosbird)). +* Add missing support for `LowCardinality` in `Avro` format. [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Workaround for use `S3` with nginx server as proxy. Nginx currenty does not accept urls with empty path like `http://domain.com?delete`, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like `http://domain.com/?delete`. [#16814](https://github.com/ClickHouse/ClickHouse/pull/16814) ([ianton-ru](https://github.com/ianton-ru)). +* Better diagnostics on parse errors in input data. Provide row number on `Cannot read all data` errors. [#16644](https://github.com/ClickHouse/ClickHouse/pull/16644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make the behaviour of `minMap` and `maxMap` more desireable. It will not skip zero values in the result. Fixes [#16087](https://github.com/ClickHouse/ClickHouse/issues/16087). [#16631](https://github.com/ClickHouse/ClickHouse/pull/16631) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Better update of ZooKeeper configuration in runtime. [#16630](https://github.com/ClickHouse/ClickHouse/pull/16630) ([sundyli](https://github.com/sundy-li)). +* Apply SETTINGS clause as early as possible. It allows to modify more settings in the query. This closes [#3178](https://github.com/ClickHouse/ClickHouse/issues/3178). [#16619](https://github.com/ClickHouse/ClickHouse/pull/16619) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now `event_time_microseconds` field stores in Decimal64, not UInt64. [#16617](https://github.com/ClickHouse/ClickHouse/pull/16617) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now paratmeterized functions can be used in `APPLY` column transformer. [#16589](https://github.com/ClickHouse/ClickHouse/pull/16589) ([Amos Bird](https://github.com/amosbird)). +* Improve scheduling of background task which removes data of dropped tables in `Atomic` databases. `Atomic` databases do not create broken symlink to table data directory if table actually has no data directory. [#16584](https://github.com/ClickHouse/ClickHouse/pull/16584) ([tavplubix](https://github.com/tavplubix)). +* Subqueries in `WITH` section (CTE) can reference previous subqueries in `WITH` section by their name. [#16575](https://github.com/ClickHouse/ClickHouse/pull/16575) ([Amos Bird](https://github.com/amosbird)). +* Add current_database into `system.query_thread_log`. [#16558](https://github.com/ClickHouse/ClickHouse/pull/16558) ([Azat Khuzhin](https://github.com/azat)). +* Allow to fetch parts that are already committed or outdated in the current instance into the detached directory. It's useful when migrating tables from another cluster and having N to 1 shards mapping. It's also consistent with the current fetchPartition implementation. [#16538](https://github.com/ClickHouse/ClickHouse/pull/16538) ([Amos Bird](https://github.com/amosbird)). +* Multiple improvements for `RabbitMQ`: Fixed bug for [#16263](https://github.com/ClickHouse/ClickHouse/issues/16263). Also minimized event loop lifetime. Added more efficient queues setup. [#16426](https://github.com/ClickHouse/ClickHouse/pull/16426) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix debug assertion in `quantileDeterministic` function. In previous version it may also transfer up to two times more data over the network. Although no bug existed. This fixes [#15683](https://github.com/ClickHouse/ClickHouse/issues/15683). [#16410](https://github.com/ClickHouse/ClickHouse/pull/16410) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `TablesToDropQueueSize` metric. It's equal to number of dropped tables, that are waiting for background data removal. [#16364](https://github.com/ClickHouse/ClickHouse/pull/16364) ([tavplubix](https://github.com/tavplubix)). +* Better diagnostics when client has dropped connection. In previous versions, `Attempt to read after EOF` and `Broken pipe` exceptions were logged in server. In new version, it's information message `Client has dropped the connection, cancel the query.`. [#16329](https://github.com/ClickHouse/ClickHouse/pull/16329) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add total_rows/total_bytes (from system.tables) support for Set/Join table engines. [#16306](https://github.com/ClickHouse/ClickHouse/pull/16306) ([Azat Khuzhin](https://github.com/azat)). +* Now it's possible to specify `PRIMARY KEY` without `ORDER BY` for MergeTree table engines family. Closes [#15591](https://github.com/ClickHouse/ClickHouse/issues/15591). [#16284](https://github.com/ClickHouse/ClickHouse/pull/16284) ([alesapin](https://github.com/alesapin)). +* If there is no tmp folder in the system (chroot, misconfigutation etc) `clickhouse-local` will create temporary subfolder in the current directory. [#16280](https://github.com/ClickHouse/ClickHouse/pull/16280) ([filimonov](https://github.com/filimonov)). +* Add support for nested data types (like named tuple) as sub-types. Fixes [#15587](https://github.com/ClickHouse/ClickHouse/issues/15587). [#16262](https://github.com/ClickHouse/ClickHouse/pull/16262) ([Ivan](https://github.com/abyss7)). +* Support for `database_atomic_wait_for_drop_and_detach_synchronously`/`NO DELAY`/`SYNC` for `DROP DATABASE`. [#16127](https://github.com/ClickHouse/ClickHouse/pull/16127) ([Azat Khuzhin](https://github.com/azat)). +* Add `allow_nondeterministic_optimize_skip_unused_shards` (to allow non deterministic like `rand()` or `dictGet()` in sharding key). [#16105](https://github.com/ClickHouse/ClickHouse/pull/16105) ([Azat Khuzhin](https://github.com/azat)). +* Fix `memory_profiler_step`/`max_untracked_memory` for queries via HTTP (test included). Fix the issue that adjusting this value globally in xml config does not help either, since those settings are not applied anyway, only default (4MB) value is [used](https://github.com/ClickHouse/ClickHouse/blob/17731245336d8c84f75e4c0894c5797ed7732190/src/Common/ThreadStatus.h#L104). Fix `query_id` for the most root ThreadStatus of the http query (by initializing QueryScope after reading query_id). [#16101](https://github.com/ClickHouse/ClickHouse/pull/16101) ([Azat Khuzhin](https://github.com/azat)). +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Fix rare issue when `clickhouse-client` may abort on exit due to loading of suggestions. This fixes [#16035](https://github.com/ClickHouse/ClickHouse/issues/16035). [#16047](https://github.com/ClickHouse/ClickHouse/pull/16047) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support of `cache` layout for `Redis` dictionaries with complex key. [#15985](https://github.com/ClickHouse/ClickHouse/pull/15985) ([Anton Popov](https://github.com/CurtizJ)). +* Fix query hang (endless loop) in case of misconfiguration (`connections_with_failover_max_tries` set to 0). [#15876](https://github.com/ClickHouse/ClickHouse/pull/15876) ([Azat Khuzhin](https://github.com/azat)). +* Change level of some log messages from information to debug, so information messages will not appear for every query. This closes [#5293](https://github.com/ClickHouse/ClickHouse/issues/5293). [#15816](https://github.com/ClickHouse/ClickHouse/pull/15816) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `MemoryTrackingInBackground*` metrics to avoid potentially misleading results. This fixes [#15684](https://github.com/ClickHouse/ClickHouse/issues/15684). [#15813](https://github.com/ClickHouse/ClickHouse/pull/15813) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add reconnects to `zookeeper-dump-tree` tool. [#15711](https://github.com/ClickHouse/ClickHouse/pull/15711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow explicitly specify columns list in `CREATE TABLE table AS table_function(...)` query. Fixes [#9249](https://github.com/ClickHouse/ClickHouse/issues/9249) Fixes [#14214](https://github.com/ClickHouse/ClickHouse/issues/14214). [#14295](https://github.com/ClickHouse/ClickHouse/pull/14295) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Do not merge parts across partitions in SELECT FINAL. [#15938](https://github.com/ClickHouse/ClickHouse/pull/15938) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of `-OrNull` and `-OrDefault` aggregate functions. [#16661](https://github.com/ClickHouse/ClickHouse/pull/16661) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of `quantileMerge`. In previous versions it was obnoxiously slow. This closes [#1463](https://github.com/ClickHouse/ClickHouse/issues/1463). [#16643](https://github.com/ClickHouse/ClickHouse/pull/16643) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of logical functions a little. [#16347](https://github.com/ClickHouse/ClickHouse/pull/16347) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance of merges assignment in MergeTree table engines. Shouldn't be visible for the user. [#16191](https://github.com/ClickHouse/ClickHouse/pull/16191) ([alesapin](https://github.com/alesapin)). +* Speedup hashed/sparse_hashed dictionary loading by preallocating the hash table. [#15454](https://github.com/ClickHouse/ClickHouse/pull/15454) ([Azat Khuzhin](https://github.com/azat)). +* Now trivial count optimization becomes slightly non-trivial. Predicates that contain exact partition expr can be optimized too. This also fixes [#11092](https://github.com/ClickHouse/ClickHouse/issues/11092) which returns wrong count when `max_parallel_replicas > 1`. [#15074](https://github.com/ClickHouse/ClickHouse/pull/15074) ([Amos Bird](https://github.com/amosbird)). + +#### Build/Testing/Packaging Improvement + +* Add flaky check for stateless tests. It will detect potentially flaky functional tests in advance, before they are merged. [#16238](https://github.com/ClickHouse/ClickHouse/pull/16238) ([alesapin](https://github.com/alesapin)). +* Use proper version for `croaring` instead of amalgamation. [#16285](https://github.com/ClickHouse/ClickHouse/pull/16285) ([sundyli](https://github.com/sundy-li)). +* Improve generation of build files for `ya.make` build system (Arcadia). [#16700](https://github.com/ClickHouse/ClickHouse/pull/16700) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add MySQL BinLog file check tool for `MaterializeMySQL` database engine. `MaterializeMySQL` is an experimental feature. [#16223](https://github.com/ClickHouse/ClickHouse/pull/16223) ([Winter Zhang](https://github.com/zhang2014)). +* Check for executable bit on non-executable files. People often accidentially commit executable files from Windows. [#15843](https://github.com/ClickHouse/ClickHouse/pull/15843) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check for `#pragma once` in headers. [#15818](https://github.com/ClickHouse/ClickHouse/pull/15818) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix illegal code style `&vector[idx]` in libhdfs3. This fixes libcxx debug build. See also https://github.com/ClickHouse-Extras/libhdfs3/pull/8 . [#15815](https://github.com/ClickHouse/ClickHouse/pull/15815) ([Amos Bird](https://github.com/amosbird)). +* Fix build of one miscellaneous example tool on Mac OS. Note that we don't build examples on Mac OS in our CI (we build only ClickHouse binary), so there is zero chance it will not break again. This fixes [#15804](https://github.com/ClickHouse/ClickHouse/issues/15804). [#15808](https://github.com/ClickHouse/ClickHouse/pull/15808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify Sys/V init script. [#14135](https://github.com/ClickHouse/ClickHouse/pull/14135) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added `boost::program_options` to `db_generator` in order to increase its usability. This closes [#15940](https://github.com/ClickHouse/ClickHouse/issues/15940). [#15973](https://github.com/ClickHouse/ClickHouse/pull/15973) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + + +## ClickHouse release 20.10 + +### ClickHouse release v20.10.7.4-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6` stack and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not restore parts from `WAL` if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when `clickhouse-client` is used in interactive mode with multiline queries and single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `ALTER` query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash while reading from `JOIN` table with `LowCardinality` types. This fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fixed `ColumnConst` comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader `ReplicatedMergeTreeTables`. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed fuzzer-found bug in function `fuzzBits`. This fixes [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order by optimization with monotonous functions. This fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fixrf optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. This fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixrf possible error `Illegal type of argument` for queries with `ORDER BY`. This fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to `WriteBufferFromS3`. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when ClickHouse used to always return 0 insted of a number of affected rows for `INSERT` queries via MySQL protocol. This fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed uncontrolled growth of `TDigest`. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Fixed remote query failure when using suffix `if` in Aggregate function. This fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). + + +### ClickHouse release v20.10.4.1-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* This will fix optimize_read_in_order/optimize_aggregation_in_order with max_threads>0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Improvement + +* Workaround for use S3 with nginx server as proxy. Nginx currenty does not accept urls with empty path like http://domain.com?delete, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like http://domain.com/?delete. [#16813](https://github.com/ClickHouse/ClickHouse/pull/16813) ([ianton-ru](https://github.com/ianton-ru)). + + +### ClickHouse release v20.10.3.30, 2020-10-28 + +#### Backward Incompatible Change + +* Make `multiple_joins_rewriter_version` obsolete. Remove first version of joins rewriter. [#15472](https://github.com/ClickHouse/ClickHouse/pull/15472) ([Artem Zuikov](https://github.com/4ertus2)). +* Change default value of `format_regexp_escaping_rule` setting (it's related to `Regexp` format) to `Raw` (it means - read whole subpattern as a value) to make the behaviour more like to what users expect. [#15426](https://github.com/ClickHouse/ClickHouse/pull/15426) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for nested multiline comments `/* comment /* comment */ */` in SQL. This conforms to the SQL standard. [#14655](https://github.com/ClickHouse/ClickHouse/pull/14655) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added MergeTree settings (`max_replicated_merges_with_ttl_in_queue` and `max_number_of_merges_with_ttl_in_pool`) to control the number of merges with TTL in the background pool and replicated queue. This change breaks compatibility with older versions only if you use delete TTL. Otherwise, replication will stay compatible. You can avoid incompatibility issues if you update all shard replicas at once or execute `SYSTEM STOP TTL MERGES` until you finish the update of all replicas. If you'll get an incompatible entry in the replication queue, first of all, execute `SYSTEM STOP TTL MERGES` and after `ALTER TABLE ... DETACH PARTITION ...` the partition where incompatible TTL merge was assigned. Attach it back on a single replica. [#14490](https://github.com/ClickHouse/ClickHouse/pull/14490) ([alesapin](https://github.com/alesapin)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Background data recompression. Add the ability to specify `TTL ... RECOMPRESS codec_name` for MergeTree table engines family. [#14494](https://github.com/ClickHouse/ClickHouse/pull/14494) ([alesapin](https://github.com/alesapin)). +* Add parallel quorum inserts. This closes [#15601](https://github.com/ClickHouse/ClickHouse/issues/15601). [#15601](https://github.com/ClickHouse/ClickHouse/pull/15601) ([Latysheva Alexandra](https://github.com/alexelex)). +* Settings for additional enforcement of data durability. Useful for non-replicated setups. [#11948](https://github.com/ClickHouse/ClickHouse/pull/11948) ([Anton Popov](https://github.com/CurtizJ)). +* When duplicate block is written to replica where it does not exist locally (has not been fetched from replicas), don't ignore it and write locally to achieve the same effect as if it was successfully replicated. [#11684](https://github.com/ClickHouse/ClickHouse/pull/11684) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we support `WITH AS (subquery) ... ` to introduce named subqueries in the query context. This closes [#2416](https://github.com/ClickHouse/ClickHouse/issues/2416). This closes [#4967](https://github.com/ClickHouse/ClickHouse/issues/4967). [#14771](https://github.com/ClickHouse/ClickHouse/pull/14771) ([Amos Bird](https://github.com/amosbird)). +* Introduce `enable_global_with_statement` setting which propagates the first select's `WITH` statements to other select queries at the same level, and makes aliases in `WITH` statements visible to subqueries. [#15451](https://github.com/ClickHouse/ClickHouse/pull/15451) ([Amos Bird](https://github.com/amosbird)). +* Secure inter-cluster query execution (with initial_user as current query user). [#13156](https://github.com/ClickHouse/ClickHouse/pull/13156) ([Azat Khuzhin](https://github.com/azat)). [#15551](https://github.com/ClickHouse/ClickHouse/pull/15551) ([Azat Khuzhin](https://github.com/azat)). +* Add the ability to remove column properties and table TTLs. Introduced queries `ALTER TABLE MODIFY COLUMN col_name REMOVE what_to_remove` and `ALTER TABLE REMOVE TTL`. Both operations are lightweight and executed at the metadata level. [#14742](https://github.com/ClickHouse/ClickHouse/pull/14742) ([alesapin](https://github.com/alesapin)). +* Added format `RawBLOB`. It is intended for input or output a single value without any escaping and delimiters. This closes [#15349](https://github.com/ClickHouse/ClickHouse/issues/15349). [#15364](https://github.com/ClickHouse/ClickHouse/pull/15364) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the `reinterpretAsUUID` function that allows to convert a big-endian byte string to UUID. [#15480](https://github.com/ClickHouse/ClickHouse/pull/15480) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Implement `force_data_skipping_indices` setting. [#15642](https://github.com/ClickHouse/ClickHouse/pull/15642) ([Azat Khuzhin](https://github.com/azat)). +* Add a setting `output_format_pretty_row_numbers` to numerate the result in Pretty formats. This closes [#15350](https://github.com/ClickHouse/ClickHouse/issues/15350). [#15443](https://github.com/ClickHouse/ClickHouse/pull/15443) ([flynn](https://github.com/ucasFL)). +* Added query obfuscation tool. It allows to share more queries for better testing. This closes [#15268](https://github.com/ClickHouse/ClickHouse/issues/15268). [#15321](https://github.com/ClickHouse/ClickHouse/pull/15321) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add table function `null('structure')`. [#14797](https://github.com/ClickHouse/ClickHouse/pull/14797) ([vxider](https://github.com/Vxider)). +* Added `formatReadableQuantity` function. It is useful for reading big numbers by human. [#14725](https://github.com/ClickHouse/ClickHouse/pull/14725) ([Artem Hnilov](https://github.com/BooBSD)). +* Add format `LineAsString` that accepts a sequence of lines separated by newlines, every line is parsed as a whole as a single String field. [#14703](https://github.com/ClickHouse/ClickHouse/pull/14703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)), [#13846](https://github.com/ClickHouse/ClickHouse/pull/13846) ([hexiaoting](https://github.com/hexiaoting)). +* Add `JSONStrings` format which output data in arrays of strings. [#14333](https://github.com/ClickHouse/ClickHouse/pull/14333) ([hcz](https://github.com/hczhcz)). +* Add support for "Raw" column format for `Regexp` format. It allows to simply extract subpatterns as a whole without any escaping rules. [#15363](https://github.com/ClickHouse/ClickHouse/pull/15363) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow configurable `NULL` representation for `TSV` output format. It is controlled by the setting `output_format_tsv_null_representation` which is `\N` by default. This closes [#9375](https://github.com/ClickHouse/ClickHouse/issues/9375). Note that the setting only controls output format and `\N` is the only supported `NULL` representation for `TSV` input format. [#14586](https://github.com/ClickHouse/ClickHouse/pull/14586) ([Kruglov Pavel](https://github.com/Avogar)). +* Support Decimal data type for `MaterializeMySQL`. `MaterializeMySQL` is an experimental feature. [#14535](https://github.com/ClickHouse/ClickHouse/pull/14535) ([Winter Zhang](https://github.com/zhang2014)). +* Add new feature: `SHOW DATABASES LIKE 'xxx'`. [#14521](https://github.com/ClickHouse/ClickHouse/pull/14521) ([hexiaoting](https://github.com/hexiaoting)). +* Added a script to import (arbitrary) git repository to ClickHouse as a sample dataset. [#14471](https://github.com/ClickHouse/ClickHouse/pull/14471) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now insert statements can have asterisk (or variants) with column transformers in the column list. [#14453](https://github.com/ClickHouse/ClickHouse/pull/14453) ([Amos Bird](https://github.com/amosbird)). +* New query complexity limit settings `max_rows_to_read_leaf`, `max_bytes_to_read_leaf` for distributed queries to limit max rows/bytes read on the leaf nodes. Limit is applied for local reads only, *excluding* the final merge stage on the root node. [#14221](https://github.com/ClickHouse/ClickHouse/pull/14221) ([Roman Khavronenko](https://github.com/hagen1778)). +* Allow user to specify settings for `ReplicatedMergeTree*` storage in `` section of config file. It works similarly to `` section. For `ReplicatedMergeTree*` storages settings from `` and `` are applied together, but settings from `` has higher priority. Added `system.replicated_merge_tree_settings` table. [#13573](https://github.com/ClickHouse/ClickHouse/pull/13573) ([Amos Bird](https://github.com/amosbird)). +* Add `mapPopulateSeries` function. [#13166](https://github.com/ClickHouse/ClickHouse/pull/13166) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Supporting MySQL types: `decimal` (as ClickHouse `Decimal`) and `datetime` with sub-second precision (as `DateTime64`). [#11512](https://github.com/ClickHouse/ClickHouse/pull/11512) ([Vasily Nemkov](https://github.com/Enmk)). +* Introduce `event_time_microseconds` field to `system.text_log`, `system.trace_log`, `system.query_log` and `system.query_thread_log` tables. [#14760](https://github.com/ClickHouse/ClickHouse/pull/14760) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `event_time_microseconds` to `system.asynchronous_metric_log` & `system.metric_log` tables. [#14514](https://github.com/ClickHouse/ClickHouse/pull/14514) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `query_start_time_microseconds` field to `system.query_log` & `system.query_thread_log` tables. [#14252](https://github.com/ClickHouse/ClickHouse/pull/14252) ([Bharat Nallan](https://github.com/bharatnc)). + +#### Bug Fix + +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `executable` dictionary source hang. In previous versions, when using some formats (e.g. `JSONEachRow`) data was not feed to a child process before it outputs at least something. This closes [#1697](https://github.com/ClickHouse/ClickHouse/issues/1697). This closes [#2455](https://github.com/ClickHouse/ClickHouse/issues/2455). [#14525](https://github.com/ClickHouse/ClickHouse/pull/14525) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT with prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a very wrong code in TwoLevelStringHashTable implementation, which might lead to memory leak. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix segfault in some cases of wrong aggregation in lambdas. [#16082](https://github.com/ClickHouse/ClickHouse/pull/16082) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use `direct` layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* `MaterializeMySQL` (experimental feature): Fix crash on create database failure. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) - Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixes [#12513](https://github.com/ClickHouse/ClickHouse/issues/12513): difference expressions with same alias when query is reanalyzed. [#15886](https://github.com/ClickHouse/ClickHouse/pull/15886) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible very rare deadlocks in RBAC implementation. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix `select count()` inaccuracy. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fix drop of materialized view with inner table in Atomic database (hangs all subsequent DROP TABLE due to hang of the worker thread, due to recursive DROP TABLE for inner table of MV). [#15743](https://github.com/ClickHouse/ClickHouse/pull/15743) ([Azat Khuzhin](https://github.com/azat)). +* Possibility to move part to another disk/volume if the first attempt was failed. [#15723](https://github.com/ClickHouse/ClickHouse/pull/15723) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix rare race condition in dictionaries and tables from MySQL. [#15686](https://github.com/ClickHouse/ClickHouse/pull/15686) ([alesapin](https://github.com/alesapin)). +* Fix (benign) race condition in AMQP-CPP. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Proper error handling during insert into MergeTree with S3. MergeTree over S3 is an experimental feature. [#15657](https://github.com/ClickHouse/ClickHouse/pull/15657) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed bug with S3 table function: region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Subtract `ReadonlyReplica` metric when detach readonly tables. [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Query will finish faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `Database does not exist.` in queries with IN and Distributed table when there's no database on initiator. [#15538](https://github.com/ClickHouse/ClickHouse/pull/15538) ([Artem Zuikov](https://github.com/4ertus2)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fixes [#15365](https://github.com/ClickHouse/ClickHouse/issues/15365): attach a database with MySQL engine throws exception (no query context). [#15384](https://github.com/ClickHouse/ClickHouse/pull/15384) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the case of multiple occurrences of column transformers in a select query. [#15378](https://github.com/ClickHouse/ClickHouse/pull/15378) ([Amos Bird](https://github.com/amosbird)). +* Fixed compression in `S3` storage. [#15376](https://github.com/ClickHouse/ClickHouse/pull/15376) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix bug where queries like `SELECT toStartOfDay(today())` fail complaining about empty time_zone argument. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix hang of queries with a lot of subqueries to same table of `MySQL` engine. Previously, if there were more than 16 subqueries to same `MySQL` table in query, it hang forever. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix 'Unknown identifier' in GROUP BY when query has JOIN over Merge table. [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix instance crash when using `joinGet` with `LowCardinality` types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust Decimal field size in MySQL column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* Fixes `Data compressed with different methods` in `join_algorithm='auto'`. Keep LowCardinality as type for left table join key in `join_algorithm='partial_merge'`. [#15088](https://github.com/ClickHouse/ClickHouse/pull/15088) ([Artem Zuikov](https://github.com/4ertus2)). +* Update `jemalloc` to fix `percpu_arena` with affinity mask. [#15035](https://github.com/ClickHouse/ClickHouse/pull/15035) ([Azat Khuzhin](https://github.com/azat)). [#14957](https://github.com/ClickHouse/ClickHouse/pull/14957) ([Azat Khuzhin](https://github.com/azat)). +* We already use padded comparison between String and FixedString (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333). This PR applies the same logic to field comparison which corrects the usage of FixedString as primary keys. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in Docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Fix crash in RIGHT or FULL JOIN with join_algorith='auto' when memory limit exceeded and we should change HashJoin with MergeJoin. [#15002](https://github.com/ClickHouse/ClickHouse/pull/15002) ([Artem Zuikov](https://github.com/4ertus2)). +* Now settings `number_of_free_entries_in_pool_to_execute_mutation` and `number_of_free_entries_in_pool_to_lower_max_size_of_merge` can be equal to `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). +* Fix to make predicate push down work when subquery contains `finalizeAggregation` function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* `MaterializeMySQL` (experimental feature): Fixed `.metadata.tmp File exists` error. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile with file descriptor. [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fixed segfault in `cache` dictionary [#14837](https://github.com/ClickHouse/ClickHouse/issues/14837). [#14879](https://github.com/ClickHouse/ClickHouse/pull/14879) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* `MaterializeMySQL` (experimental feature): Fixed bug in parsing MySQL binlog events, which causes `Attempt to read after eof` and `Packet payload is not fully read` in `MaterializeMySQL` database engine. [#14852](https://github.com/ClickHouse/ClickHouse/pull/14852) ([Winter Zhang](https://github.com/zhang2014)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* `Replace` column transformer should replace identifiers with cloned ASTs. This fixes [#14695](https://github.com/ClickHouse/ClickHouse/issues/14695) . [#14734](https://github.com/ClickHouse/ClickHouse/pull/14734) ([Amos Bird](https://github.com/amosbird)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ALTER UPDATE` mutation with `Nullable` column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix function `has` with `LowCardinality` of `Nullable`. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CreateQuery for StorageReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator `-Resample`, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). +* Fix a bug when converting `Nullable(String)` to Enum. Introduced by [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745). This fixes [#14435](https://github.com/ClickHouse/ClickHouse/issues/14435). [#14530](https://github.com/ClickHouse/ClickHouse/pull/14530) ([Amos Bird](https://github.com/amosbird)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `currentDatabase()` function cannot be used in `ON CLUSTER` ddl query. [#14211](https://github.com/ClickHouse/ClickHouse/pull/14211) ([Winter Zhang](https://github.com/zhang2014)). +* `MaterializeMySQL` (experimental feature): Fixed `Packet payload is not fully read` error in `MaterializeMySQL` database engine. [#14696](https://github.com/ClickHouse/ClickHouse/pull/14696) ([BohuTANG](https://github.com/BohuTANG)). + +#### Improvement + +* Enable `Atomic` database engine by default for newly created databases. [#15003](https://github.com/ClickHouse/ClickHouse/pull/15003) ([tavplubix](https://github.com/tavplubix)). +* Add the ability to specify specialized codecs like `Delta`, `T64`, etc. for columns with subtypes. Implements [#12551](https://github.com/ClickHouse/ClickHouse/issues/12551), fixes [#11397](https://github.com/ClickHouse/ClickHouse/issues/11397), fixes [#4609](https://github.com/ClickHouse/ClickHouse/issues/4609). [#15089](https://github.com/ClickHouse/ClickHouse/pull/15089) ([alesapin](https://github.com/alesapin)). +* Dynamic reload of zookeeper config. [#14678](https://github.com/ClickHouse/ClickHouse/pull/14678) ([sundyli](https://github.com/sundy-li)). +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Now `joinGet` supports multi-key lookup. Continuation of [#12418](https://github.com/ClickHouse/ClickHouse/issues/12418). [#13015](https://github.com/ClickHouse/ClickHouse/pull/13015) ([Amos Bird](https://github.com/amosbird)). +* Wait for `DROP/DETACH TABLE` to actually finish if `NO DELAY` or `SYNC` is specified for `Atomic` database. [#15448](https://github.com/ClickHouse/ClickHouse/pull/15448) ([tavplubix](https://github.com/tavplubix)). +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `zookeeper_path` on replicated table creation. Do not allow `RENAME TABLE` if it may break `zookeeper_path` after server restart. Fixes [#6917](https://github.com/ClickHouse/ClickHouse/issues/6917). [#15348](https://github.com/ClickHouse/ClickHouse/pull/15348) ([tavplubix](https://github.com/tavplubix)). +* The function `now` allows an argument with timezone. This closes [15264](https://github.com/ClickHouse/ClickHouse/issues/15264). [#15285](https://github.com/ClickHouse/ClickHouse/pull/15285) ([flynn](https://github.com/ucasFL)). +* Do not allow connections to ClickHouse server until all scripts in `/docker-entrypoint-initdb.d/` are executed. [#15244](https://github.com/ClickHouse/ClickHouse/pull/15244) ([Aleksei Kozharin](https://github.com/alekseik1)). +* Added `optimize` setting to `EXPLAIN PLAN` query. If enabled, query plan level optimisations are applied. Enabled by default. [#15201](https://github.com/ClickHouse/ClickHouse/pull/15201) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Proper exception message for wrong number of arguments of CAST. This closes [#13992](https://github.com/ClickHouse/ClickHouse/issues/13992). [#15029](https://github.com/ClickHouse/ClickHouse/pull/15029) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add option to disable TTL move on data part insert. [#15000](https://github.com/ClickHouse/ClickHouse/pull/15000) ([Pavel Kovalenko](https://github.com/Jokser)). +* Ignore key constraints when doing mutations. Without this pull request, it's not possible to do mutations when `force_index_by_date = 1` or `force_primary_key = 1`. [#14973](https://github.com/ClickHouse/ClickHouse/pull/14973) ([Amos Bird](https://github.com/amosbird)). +* Allow to drop Replicated table if previous drop attempt was failed due to ZooKeeper session expiration. This fixes [#11891](https://github.com/ClickHouse/ClickHouse/issues/11891). [#14926](https://github.com/ClickHouse/ClickHouse/pull/14926) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed excessive settings constraint violation when running SELECT with SETTINGS from a distributed table. [#14876](https://github.com/ClickHouse/ClickHouse/pull/14876) ([Amos Bird](https://github.com/amosbird)). +* Provide a `load_balancing_first_offset` query setting to explicitly state what the first replica is. It's used together with `FIRST_OR_RANDOM` load balancing strategy, which allows to control replicas workload. [#14867](https://github.com/ClickHouse/ClickHouse/pull/14867) ([Amos Bird](https://github.com/amosbird)). +* Show subqueries for `SET` and `JOIN` in `EXPLAIN` result. [#14856](https://github.com/ClickHouse/ClickHouse/pull/14856) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow using multi-volume storage configuration in storage `Distributed`. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Construct `query_start_time` and `query_start_time_microseconds` from the same timespec. [#14831](https://github.com/ClickHouse/ClickHouse/pull/14831) ([Bharat Nallan](https://github.com/bharatnc)). +* Support for disabling persistency for `StorageJoin` and `StorageSet`, this feature is controlled by setting `disable_set_and_join_persistency`. And this PR solved issue [#6318](https://github.com/ClickHouse/ClickHouse/issues/6318). [#14776](https://github.com/ClickHouse/ClickHouse/pull/14776) ([vxider](https://github.com/Vxider)). +* Now `COLUMNS` can be used to wrap over a list of columns and apply column transformers afterwards. [#14775](https://github.com/ClickHouse/ClickHouse/pull/14775) ([Amos Bird](https://github.com/amosbird)). +* Add `merge_algorithm` to `system.merges` table to improve merging inspections. [#14705](https://github.com/ClickHouse/ClickHouse/pull/14705) ([Amos Bird](https://github.com/amosbird)). +* Fix potential memory leak caused by zookeeper exists watch. [#14693](https://github.com/ClickHouse/ClickHouse/pull/14693) ([hustnn](https://github.com/hustnn)). +* Allow parallel execution of distributed DDL. [#14684](https://github.com/ClickHouse/ClickHouse/pull/14684) ([Azat Khuzhin](https://github.com/azat)). +* Add `QueryMemoryLimitExceeded` event counter. This closes [#14589](https://github.com/ClickHouse/ClickHouse/issues/14589). [#14647](https://github.com/ClickHouse/ClickHouse/pull/14647) ([fastio](https://github.com/fastio)). +* Fix some trailing whitespaces in query formatting. [#14595](https://github.com/ClickHouse/ClickHouse/pull/14595) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse treats partition expr and key expr differently. Partition expr is used to construct an minmax index containing related columns, while primary key expr is stored as an expr. Sometimes user might partition a table at coarser levels, such as `partition by i / 1000`. However, binary operators are not monotonic and this PR tries to fix that. It might also benifit other use cases. [#14513](https://github.com/ClickHouse/ClickHouse/pull/14513) ([Amos Bird](https://github.com/amosbird)). +* Add an option to skip access checks for `DiskS3`. `s3` disk is an experimental feature. [#14497](https://github.com/ClickHouse/ClickHouse/pull/14497) ([Pavel Kovalenko](https://github.com/Jokser)). +* Speed up server shutdown process if there are ongoing S3 requests. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). +* `SYSTEM RELOAD CONFIG` now throws an exception if failed to reload and continues using the previous users.xml. The background periodic reloading also continues using the previous users.xml if failed to reload. [#14492](https://github.com/ClickHouse/ClickHouse/pull/14492) ([Vitaly Baranov](https://github.com/vitlibar)). +* For INSERTs with inline data in VALUES format in the script mode of `clickhouse-client`, support semicolon as the data terminator, in addition to the new line. Closes [#12288](https://github.com/ClickHouse/ClickHouse/issues/12288). [#13192](https://github.com/ClickHouse/ClickHouse/pull/13192) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement + +* Enable compact parts by default for small parts. This will allow to process frequent inserts slightly more efficiently (4..100 times). [#11913](https://github.com/ClickHouse/ClickHouse/pull/11913) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `quantileTDigest` performance. This fixes [#2668](https://github.com/ClickHouse/ClickHouse/issues/2668). [#15542](https://github.com/ClickHouse/ClickHouse/pull/15542) ([Kruglov Pavel](https://github.com/Avogar)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Faster 256-bit multiplication. [#15418](https://github.com/ClickHouse/ClickHouse/pull/15418) ([Artem Zuikov](https://github.com/4ertus2)). +* Improve performance of 256-bit types using (u)int64_t as base type for wide integers. Original wide integers use 8-bit types as base. [#14859](https://github.com/ClickHouse/ClickHouse/pull/14859) ([Artem Zuikov](https://github.com/4ertus2)). +* Explicitly use a temporary disk to store vertical merge temporary data. [#15639](https://github.com/ClickHouse/ClickHouse/pull/15639) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Use one S3 DeleteObjects request instead of multiple DeleteObject in a loop. No any functionality changes, so covered by existing tests like integration/test_log_family_s3. [#15238](https://github.com/ClickHouse/ClickHouse/pull/15238) ([ianton-ru](https://github.com/ianton-ru)). +* Fix `DateTime DateTime` mistakenly choosing the slow generic implementation. This fixes [#15153](https://github.com/ClickHouse/ClickHouse/issues/15153). [#15178](https://github.com/ClickHouse/ClickHouse/pull/15178) ([Amos Bird](https://github.com/amosbird)). +* Improve performance of GROUP BY key of type `FixedString`. [#15034](https://github.com/ClickHouse/ClickHouse/pull/15034) ([Amos Bird](https://github.com/amosbird)). +* Only `mlock` code segment when starting clickhouse-server. In previous versions, all mapped regions were locked in memory, including debug info. Debug info is usually splitted to a separate file but if it isn't, it led to +2..3 GiB memory usage. [#14929](https://github.com/ClickHouse/ClickHouse/pull/14929) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse binary become smaller due to link time optimization. + +#### Build/Testing/Packaging Improvement + +* Now we use clang-11 for production ClickHouse build. [#15239](https://github.com/ClickHouse/ClickHouse/pull/15239) ([alesapin](https://github.com/alesapin)). +* Now we use clang-11 to build ClickHouse in CI. [#14846](https://github.com/ClickHouse/ClickHouse/pull/14846) ([alesapin](https://github.com/alesapin)). +* Switch binary builds (Linux, Darwin, AArch64, FreeDSD) to clang-11. [#15622](https://github.com/ClickHouse/ClickHouse/pull/15622) ([Ilya Yatsishin](https://github.com/qoega)). +* Now all test images use `llvm-symbolizer-11`. [#15069](https://github.com/ClickHouse/ClickHouse/pull/15069) ([alesapin](https://github.com/alesapin)). +* Allow to build with llvm-11. [#15366](https://github.com/ClickHouse/ClickHouse/pull/15366) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Switch from `clang-tidy-10` to `clang-tidy-11`. [#14922](https://github.com/ClickHouse/ClickHouse/pull/14922) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Use LLVM's experimental pass manager by default. [#15608](https://github.com/ClickHouse/ClickHouse/pull/15608) ([Danila Kutenin](https://github.com/danlark1)). +* Don't allow any C++ translation unit to build more than 10 minutes or to use more than 10 GB or memory. This fixes [#14925](https://github.com/ClickHouse/ClickHouse/issues/14925). [#15060](https://github.com/ClickHouse/ClickHouse/pull/15060) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make performance test more stable and representative by splitting test runs and profile runs. [#15027](https://github.com/ClickHouse/ClickHouse/pull/15027) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Attempt to make performance test more reliable. It is done by remapping the executable memory of the process on the fly with `madvise` to use transparent huge pages - it can lower the number of iTLB misses which is the main source of instabilities in performance tests. [#14685](https://github.com/ClickHouse/ClickHouse/pull/14685) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Convert to python3. This closes [#14886](https://github.com/ClickHouse/ClickHouse/issues/14886). [#15007](https://github.com/ClickHouse/ClickHouse/pull/15007) ([Azat Khuzhin](https://github.com/azat)). +* Fail early in functional tests if server failed to respond. This closes [#15262](https://github.com/ClickHouse/ClickHouse/issues/15262). [#15267](https://github.com/ClickHouse/ClickHouse/pull/15267) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to run AArch64 version of clickhouse-server without configs. This facilitates [#15174](https://github.com/ClickHouse/ClickHouse/issues/15174). [#15266](https://github.com/ClickHouse/ClickHouse/pull/15266) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improvements in CI docker images: get rid of ZooKeeper and single script for test configs installation. [#15215](https://github.com/ClickHouse/ClickHouse/pull/15215) ([alesapin](https://github.com/alesapin)). +* Fix CMake options forwarding in fast test script. Fixes error in [#14711](https://github.com/ClickHouse/ClickHouse/issues/14711). [#15155](https://github.com/ClickHouse/ClickHouse/pull/15155) ([alesapin](https://github.com/alesapin)). +* Added a script to perform hardware benchmark in a single command. [#15115](https://github.com/ClickHouse/ClickHouse/pull/15115) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Splitted huge test `test_dictionaries_all_layouts_and_sources` into smaller ones. [#15110](https://github.com/ClickHouse/ClickHouse/pull/15110) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Maybe fix MSan report in base64 (on servers with AVX-512). This fixes [#14006](https://github.com/ClickHouse/ClickHouse/issues/14006). [#15030](https://github.com/ClickHouse/ClickHouse/pull/15030) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reformat and cleanup code in all integration test *.py files. [#14864](https://github.com/ClickHouse/ClickHouse/pull/14864) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix MaterializeMySQL empty transaction unstable test case found in CI. [#14854](https://github.com/ClickHouse/ClickHouse/pull/14854) ([Winter Zhang](https://github.com/zhang2014)). +* Attempt to speed up build a little. [#14808](https://github.com/ClickHouse/ClickHouse/pull/14808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Speed up build a little by removing unused headers. [#14714](https://github.com/ClickHouse/ClickHouse/pull/14714) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix build failure in OSX. [#14761](https://github.com/ClickHouse/ClickHouse/pull/14761) ([Winter Zhang](https://github.com/zhang2014)). +* Enable ccache by default in cmake if it's found in OS. [#14575](https://github.com/ClickHouse/ClickHouse/pull/14575) ([alesapin](https://github.com/alesapin)). +* Control CI builds configuration from the ClickHouse repository. [#14547](https://github.com/ClickHouse/ClickHouse/pull/14547) ([alesapin](https://github.com/alesapin)). +* In CMake files: - Moved some options' descriptions' parts to comments above. - Replace 0 -> `OFF`, 1 -> `ON` in `option`s default values. - Added some descriptions and links to docs to the options. - Replaced `FUZZER` option (there is another option `ENABLE_FUZZING` which also enables same functionality). - Removed `ENABLE_GTEST_LIBRARY` option as there is `ENABLE_TESTS`. See the full description in PR: [#14711](https://github.com/ClickHouse/ClickHouse/pull/14711) ([Mike](https://github.com/myrrc)). +* Make binary a bit smaller (~50 Mb for debug version). [#14555](https://github.com/ClickHouse/ClickHouse/pull/14555) ([Artem Zuikov](https://github.com/4ertus2)). +* Use std::filesystem::path in ConfigProcessor for concatenating file paths. [#14558](https://github.com/ClickHouse/ClickHouse/pull/14558) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix debug assertion in `bitShiftLeft()` when called with negative big integer. [#14697](https://github.com/ClickHouse/ClickHouse/pull/14697) ([Artem Zuikov](https://github.com/4ertus2)). + + +## ClickHouse release 20.9 + +### ClickHouse release v20.9.7.11-stable, 2020-12-07 + +#### Performance Improvement + +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). + +#### Bug Fix + +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fix ColumnConst comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed crash on `CREATE TABLE ... AS some_table` query when `some_table` was created `AS table_function()` Fixes [#16944](https://github.com/ClickHouse/ClickHouse/issues/16944). [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). +* Bug fix for funciton fuzzBits, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* TODO. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Return number of affected rows for INSERT queries via MySQL protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). + +#### Build/Testing/Packaging Improvement + +* Update embedded timezone data to version 2020d (also update cctz to the latest master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). + + +### ClickHouse release v20.9.6.14-stable, 2020-11-20 + +#### Improvement + +* Make it possible to connect to `clickhouse-server` secure endpoint which requires SNI. This is possible when `clickhouse-server` is hosted behind TLS proxy. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). +* Conditional aggregate functions (for example: `avgIf`, `sumIf`, `maxIf`) should return `NULL` when miss rows and use nullable arguments. [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). + +#### Bug Fix + +* Fix bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fix possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fix possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix crash when using `any` without any arguments. This is for [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803) . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* This will fix optimize_read_in_order/optimize_aggregation_in_order with max_threads>0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) fix remote query failure when using 'if' suffix aggregate function. [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Query is finished faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.9.5.5-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release v20.9.4.76-stable (2020-10-29) + +#### Bug Fix + +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT w/ prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a very wrong code in TwoLevelStringHashTable implementation, which might lead to memory leak. I'm suprised how this bug can lurk for so long.... [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use direct layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a crash when database creation fails. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible deadlocks in RBAC. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* Fix `select count()` inaccuracy for MaterializeMySQL. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug with globs in S3 table function, region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Decrement the `ReadonlyReplica` metric when detaching read-only tables. This fixes [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). + +#### Improvement + +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `ReplicatedMergeTree` arguments on table creation. [#16160](https://github.com/ClickHouse/ClickHouse/pull/16160) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.9.3.45-stable (2020-10-09) + +#### Bug Fix + +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race condition in AMQP-CPP. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fix bug where queries like `SELECT toStartOfDay(today())` fail complaining about empty time_zone argument. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system.logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix instance crash when using joinGet with LowCardinality types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust decimals field size in mysql column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). + +#### Improvement + +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.9.2.20, 2020-09-22 + +#### Backward Incompatible Change + +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added column transformers `EXCEPT`, `REPLACE`, `APPLY`, which can be applied to the list of selected columns (after `*` or `COLUMNS(...)`). For example, you can write `SELECT * EXCEPT(URL) REPLACE(number + 1 AS number)`. Another example: `select * apply(length) apply(max) from wide_string_table` to find out the maxium length of all string columns. [#14233](https://github.com/ClickHouse/ClickHouse/pull/14233) ([Amos Bird](https://github.com/amosbird)). +* Added an aggregate function `rankCorr` which computes a rank correlation coefficient. [#11769](https://github.com/ClickHouse/ClickHouse/pull/11769) ([antikvist](https://github.com/antikvist)) [#14411](https://github.com/ClickHouse/ClickHouse/pull/14411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added table function `view` which turns a subquery into a table object. This helps passing queries around. For instance, it can be used in remote/cluster table functions. [#12567](https://github.com/ClickHouse/ClickHouse/pull/12567) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix + +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed inconsistent comparison with primary key of type `FixedString` on index analysis if they're compered with a string of less size. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* Fix bug which leads to wrong merges assignment if table has partitions with a single part. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed `.metadata.tmp File exists` error when using `MaterializeMySQL` database engine. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix possibly incorrect result of function `has` when LowCardinality and Nullable types are involved. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CREATE query for tables with ReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator `-Resample`, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). +* Check for array size overflow in `topK` aggregate function. Without this check the user may send a query with carefully crafted parameters that will lead to server crash. This closes [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Proxy restart/start/stop/reload of SysVinit to systemd (if it is used). [#14460](https://github.com/ClickHouse/ClickHouse/pull/14460) ([Azat Khuzhin](https://github.com/azat)). +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash during `ALTER` query for table which was created `AS table_function`. Fixes [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). +* Fix exception during ALTER LIVE VIEW query with REFRESH command. LIVE VIEW is an experimental feature. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix QueryPlan lifetime (for EXPLAIN PIPELINE graph=1) for queries with nested interpreter. [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). +* Better check for tuple size in SSD cache complex key external dictionaries. This fixes [#13981](https://github.com/ClickHouse/ClickHouse/issues/13981). [#14313](https://github.com/ClickHouse/ClickHouse/pull/14313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Disallows `CODEC` on `ALIAS` column type. Fixes [#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix GRANT ALL statement when executed on a non-global level. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix arrayJoin() capturing in lambda (exception with logical error message was thrown). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature + +* Added `db-generator` tool for random database generation by given SELECT queries. It may faciliate reproducing issues when there is only incomplete bug report from the user. [#14442](https://github.com/ClickHouse/ClickHouse/pull/14442) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#10973](https://github.com/ClickHouse/ClickHouse/issues/10973) ([ZeDRoman](https://github.com/ZeDRoman)). + +#### Improvement + +* Allow using multi-volume storage configuration in storage Distributed. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Disallow empty time_zone argument in `toStartOf*` type of functions. [#14509](https://github.com/ClickHouse/ClickHouse/pull/14509) ([Bharat Nallan](https://github.com/bharatnc)). +* MySQL handler returns `OK` for queries like `SET @@var = value`. Such statement is ignored. It is needed because some MySQL drivers send `SET @@` query for setup after handshake https://github.com/ClickHouse/ClickHouse/issues/9336#issuecomment-686222422 . [#14469](https://github.com/ClickHouse/ClickHouse/pull/14469) ([BohuTANG](https://github.com/BohuTANG)). +* Now TTLs will be applied during merge if they were not previously materialized. [#14438](https://github.com/ClickHouse/ClickHouse/pull/14438) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse-obfuscator` supports UUID type as proposed in [#13163](https://github.com/ClickHouse/ClickHouse/issues/13163). [#14409](https://github.com/ClickHouse/ClickHouse/pull/14409) ([dimarub2000](https://github.com/dimarub2000)). +* Added new setting `system_events_show_zero_values` as proposed in [#11384](https://github.com/ClickHouse/ClickHouse/issues/11384). [#14404](https://github.com/ClickHouse/ClickHouse/pull/14404) ([dimarub2000](https://github.com/dimarub2000)). +* Implicitly convert primary key to not null in `MaterializeMySQL` (Same as `MySQL`). Fixes [#14114](https://github.com/ClickHouse/ClickHouse/issues/14114). [#14397](https://github.com/ClickHouse/ClickHouse/pull/14397) ([Winter Zhang](https://github.com/zhang2014)). +* Replace wide integers (256 bit) from boost multiprecision with implementation from https://github.com/cerevra/int. 256bit integers are experimental. [#14229](https://github.com/ClickHouse/ClickHouse/pull/14229) ([Artem Zuikov](https://github.com/4ertus2)). +* Add default compression codec for parts in `system.part_log` with the name `default_compression_codec`. [#14116](https://github.com/ClickHouse/ClickHouse/pull/14116) ([alesapin](https://github.com/alesapin)). +* Add precision argument for `DateTime` type. It allows to use `DateTime` name instead of `DateTime64`. [#13761](https://github.com/ClickHouse/ClickHouse/pull/13761) ([Winter Zhang](https://github.com/zhang2014)). +* Added requirepass authorization for `Redis` external dictionary. [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). +* Improvements in `RabbitMQ` engine: added connection and channels failure handling, proper commits, insert failures handling, better exchanges, queue durability and queue resume opportunity, new queue settings. Fixed tests. [#12761](https://github.com/ClickHouse/ClickHouse/pull/12761) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement + +* Optimize queries with LIMIT/LIMIT BY/ORDER BY for distributed with GROUP BY sharding_key (under `optimize_skip_unused_shards` and `optimize_distributed_group_by_sharding_key`). [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)). +* Creating sets for multiple `JOIN` and `IN` in parallel. It may slightly improve performance for queries with several different `IN subquery` expressions. [#14412](https://github.com/ClickHouse/ClickHouse/pull/14412) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve Kafka engine performance by providing independent thread for each consumer. Separate thread pool for streaming engines (like Kafka). [#13939](https://github.com/ClickHouse/ClickHouse/pull/13939) ([fastio](https://github.com/fastio)). + +#### Build/Testing/Packaging Improvement + +* Lower binary size in debug build by removing debug info from `Functions`. This is needed only for one internal project in Yandex who is using very old linker. [#14549](https://github.com/ClickHouse/ClickHouse/pull/14549) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prepare for build with clang 11. [#14455](https://github.com/ClickHouse/ClickHouse/pull/14455) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the logic in backport script. In previous versions it was triggered for any labels of 100% red color. It was strange. [#14433](https://github.com/ClickHouse/ClickHouse/pull/14433) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Integration tests use default base config. All config changes are explicit with main_configs, user_configs and dictionaries parameters for instance. [#13647](https://github.com/ClickHouse/ClickHouse/pull/13647) ([Ilya Yatsishin](https://github.com/qoega)). + + + +## ClickHouse release 20.8 + +### ClickHouse release v20.8.12.2-lts, 2021-01-16 + +#### Bug Fix + +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.11.17-lts, 2020-12-25 + +#### Bug Fix + +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.10.13-lts, 2020-12-24 + +#### Bug Fix + +* When server log rotation was configured using `logger.size` parameter with numeric value larger than 2^32, the logs were not rotated properly. [#17905](https://github.com/ClickHouse/ClickHouse/pull/17905) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed incorrect initialization of `max_compress_block_size` in MergeTreeWriterSettings with `min_compress_block_size`. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `ALTER` query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed a bug when mark cache size was underestimated by ClickHouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `ColumnConst` comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixed possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed inconsistent behaviour of `optimize_read_in_order/optimize_aggregation_in_order` with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Query is finished faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.8.6.6-lts, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release v20.8.5.45-lts, 2020-10-29 + +#### Bug Fix + +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT w/ prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a possible memory leak during `GROUP BY` with string keys, caused by an error in `TwoLevelStringHashTable` implementation. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use direct layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a crash when database creation fails. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible deadlocks in RBAC. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug with globs in S3 table function, region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Decrement the `ReadonlyReplica` metric when detaching read-only tables. This fixes [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). + +#### Improvement + +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `ReplicatedMergeTree` arguments on table creation. [#16159](https://github.com/ClickHouse/ClickHouse/pull/16159) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.8.4.11-lts, 2020-10-09 + +#### Bug Fix + +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system.logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix instance crash when using joinGet with LowCardinality types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust decimals field size in mysql column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* We already use padded comparison between String and FixedString (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333). This PR applies the same logic to field comparison which corrects the usage of FixedString as primary keys. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Now settings `number_of_free_entries_in_pool_to_execute_mutation` and `number_of_free_entries_in_pool_to_lower_max_size_of_merge` can be equal to `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed `.metadata.tmp File exists` error when using `MaterializeMySQL` database engine. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Improvement + +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.8.3.18-stable, 2020-09-18 + +#### Bug Fix + +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Added the checker as neither calling `lc->isNullable()` nor calling `ls->getDictionaryPtr()->isNullable()` would return the correct result. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([myrrc](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CreateQuery for StorageReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator -Resample, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvement + +* Speed up server shutdown process if there are ongoing S3 requests. [#14858](https://github.com/ClickHouse/ClickHouse/pull/14858) ([Pavel Kovalenko](https://github.com/Jokser)). +* Allow using multi-volume storage configuration in storage Distributed. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Speed up server shutdown process if there are ongoing S3 requests. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.2.3-stable, 2020-09-08 + +#### Backward Incompatible Change + +* Now `OPTIMIZE FINAL` query does not recalculate TTL for parts that were added before TTL was created. Use `ALTER TABLE ... MATERIALIZE TTL` once to calculate them, after that `OPTIMIZE FINAL` will evaluate TTL's properly. This behavior never worked for replicated tables. [#14220](https://github.com/ClickHouse/ClickHouse/pull/14220) ([alesapin](https://github.com/alesapin)). +* Extend `parallel_distributed_insert_select` setting, adding an option to run `INSERT` into local table. The setting changes type from `Bool` to `UInt64`, so the values `false` and `true` are no longer supported. If you have these values in server configuration, the server will not start. Please replace them with `0` and `1`, respectively. [#14060](https://github.com/ClickHouse/ClickHouse/pull/14060) ([Azat Khuzhin](https://github.com/azat)). +* Remove support for the `ODBCDriver` input/output format. This was a deprecated format once used for communication with the ClickHouse ODBC driver, now long superseded by the `ODBCDriver2` format. Resolves [#13629](https://github.com/ClickHouse/ClickHouse/issues/13629). [#13847](https://github.com/ClickHouse/ClickHouse/pull/13847) ([hexiaoting](https://github.com/hexiaoting)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Add the ability to specify `Default` compression codec for columns that correspond to settings specified in `config.xml`. Implements: [#9074](https://github.com/ClickHouse/ClickHouse/issues/9074). [#14049](https://github.com/ClickHouse/ClickHouse/pull/14049) ([alesapin](https://github.com/alesapin)). +* Support Kerberos authentication in Kafka, using `krb5` and `cyrus-sasl` libraries. [#12771](https://github.com/ClickHouse/ClickHouse/pull/12771) ([Ilya Golshtein](https://github.com/ilejn)). +* Add function `normalizeQuery` that replaces literals, sequences of literals and complex aliases with placeholders. Add function `normalizedQueryHash` that returns identical 64bit hash values for similar queries. It helps to analyze query log. This closes [#11271](https://github.com/ClickHouse/ClickHouse/issues/11271). [#13816](https://github.com/ClickHouse/ClickHouse/pull/13816) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `time_zones` table. [#13880](https://github.com/ClickHouse/ClickHouse/pull/13880) ([Bharat Nallan](https://github.com/bharatnc)). +* Add function `defaultValueOfTypeName` that returns the default value for a given type. [#13877](https://github.com/ClickHouse/ClickHouse/pull/13877) ([hcz](https://github.com/hczhcz)). +* Add `countDigits(x)` function that count number of decimal digits in integer or decimal column. Add `isDecimalOverflow(d, [p])` function that checks if the value in Decimal column is out of its (or specified) precision. [#14151](https://github.com/ClickHouse/ClickHouse/pull/14151) ([Artem Zuikov](https://github.com/4ertus2)). +* Add `quantileExactLow` and `quantileExactHigh` implementations with respective aliases for `medianExactLow` and `medianExactHigh`. [#13818](https://github.com/ClickHouse/ClickHouse/pull/13818) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `date_trunc` function that truncates a date/time value to a specified date/time part. [#13888](https://github.com/ClickHouse/ClickHouse/pull/13888) ([Vladimir Golovchenko](https://github.com/vladimir-golovchenko)). +* Add new optional section `` to the main config. [#13425](https://github.com/ClickHouse/ClickHouse/pull/13425) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `ALTER SAMPLE BY` statement that allows to change table sample clause. [#13280](https://github.com/ClickHouse/ClickHouse/pull/13280) ([Amos Bird](https://github.com/amosbird)). +* Function `position` now supports optional `start_pos` argument. [#13237](https://github.com/ClickHouse/ClickHouse/pull/13237) ([vdimir](https://github.com/vdimir)). + +#### Bug Fix + +* Fix visible data clobbering by progress bar in client in interactive mode. This fixes [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) and [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) and [#13584](https://github.com/ClickHouse/ClickHouse/issues/13584) and fixes [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect sorting order if `LowCardinality` column when sorting by multiple columns. This fixes [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Check for array size overflow in `topK` aggregate function. Without this check the user may send a query with carefully crafted parameters that will lead to server crash. This closes [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug which can lead to wrong merges assignment if table has partitions with a single part. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. Continuation of [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash during `ALTER` query for table which was created `AS table_function`. Fixes [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). +* Fix exception during ALTER LIVE VIEW query with REFRESH command. Live view is an experimental feature. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix QueryPlan lifetime (for EXPLAIN PIPELINE graph=1) for queries with nested interpreter. [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in `clickhouse-odbc-bridge` during schema fetch from some external sources. This PR fixes [#13861](https://github.com/ClickHouse/ClickHouse/issues/13861). [#14267](https://github.com/ClickHouse/ClickHouse/pull/14267) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash in mark inclusion search introduced in [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277). [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). +* Fix creation of tables with named tuples. This fixes [#13027](https://github.com/ClickHouse/ClickHouse/issues/13027). [#14143](https://github.com/ClickHouse/ClickHouse/pull/14143) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix formatting of minimal negative decimal numbers. This fixes [#14111](https://github.com/ClickHouse/ClickHouse/issues/14111). [#14119](https://github.com/ClickHouse/ClickHouse/pull/14119) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix `DistributedFilesToInsert` metric (zeroed when it should not). [#14095](https://github.com/ClickHouse/ClickHouse/pull/14095) ([Azat Khuzhin](https://github.com/azat)). +* Fix `pointInPolygon` with const 2d array as polygon. [#14079](https://github.com/ClickHouse/ClickHouse/pull/14079) ([Alexey Ilyukhov](https://github.com/livace)). +* Fixed wrong mount point in extra info for `Poco::Exception: no space left on device`. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). +* Fix GRANT ALL statement when executed on a non-global level. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix parser to reject create table as table function with engine. [#13940](https://github.com/ClickHouse/ClickHouse/pull/13940) ([hcz](https://github.com/hczhcz)). +* Fix wrong results in select queries with `DISTINCT` keyword and subqueries with UNION ALL in case `optimize_duplicate_order_by_and_distinct` setting is enabled. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed potential deadlock when renaming `Distributed` table. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect sorting for `FixedString` columns when sorting by multiple columns. Fixes [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix potentially imprecise result of `topK`/`topKWeighted` merge (with non-default parameters). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading from MergeTree table with INDEX of type SET fails when comparing against NULL. This fixes [#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). +* Fix `arrayJoin` capturing in lambda (LOGICAL_ERROR). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). +* Add step overflow check in function `range`. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Directory not empty` error when concurrently executing `DROP DATABASE` and `CREATE TABLE`. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add range check for `h3KRing` function. This fixes [#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix race condition between DETACH and background merges. Parts may revive after detach. This is continuation of [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) that did not fix the issue but introduced a test that started to fail in very rare cases, demonstrating the issue. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix logging Settings.Names/Values when log_queries_min_type > QUERY_START. [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). +* Fixes `/replicas_status` endpoint response status code when verbose=1. [#13722](https://github.com/ClickHouse/ClickHouse/pull/13722) ([javi santana](https://github.com/javisantana)). +* Fix incorrect message in `clickhouse-server.init` while checking user and group. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). +* Do not optimize any(arrayJoin()) -> arrayJoin() under `optimize_move_functions_out_of_any` setting. [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in JOIN with StorageMerge and `set enable_optimize_predicate_expression=1`. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix typo in error message about `The value of 'number_of_free_entries_in_pool_to_lower_max_size_of_merge' setting`. [#13678](https://github.com/ClickHouse/ClickHouse/pull/13678) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries might cause deadlock. It's fixed. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix secondary indices corruption in compact parts. Compact parts are experimental feature. [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). +* Fix premature `ON CLUSTER` timeouts for queries that must be executed on a single replica. Fixes [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). +* Fix wrong code in function `netloc`. This fixes [#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible race in `StorageMemory`. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix missing or excessive headers in `TSV/CSVWithNames` formats in HTTP protocol. This fixes [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix access to `redis` dictionary after connection was dropped once. It may happen with `cache` and `direct` dictionary layouts. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). +* Removed wrong auth access check when using ClickHouseDictionarySource to query remote tables. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). +* Properly distinguish subqueries in some cases for common subexpression elimination. [#8333](https://github.com/ClickHouse/ClickHouse/issues/8333). [#8367](https://github.com/ClickHouse/ClickHouse/pull/8367) ([Amos Bird](https://github.com/amosbird)). + +#### Improvement + +* Disallows `CODEC` on `ALIAS` column type. Fixes [#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). +* When waiting for a dictionary update to complete, use the timeout specified by `query_wait_timeout_milliseconds` setting instead of a hard-coded value. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add setting `min_index_granularity_bytes` that protects against accidentally creating a table with very low `index_granularity_bytes` setting. [#14139](https://github.com/ClickHouse/ClickHouse/pull/14139) ([Bharat Nallan](https://github.com/bharatnc)). +* Now it's possible to fetch partitions from clusters that use different ZooKeeper: `ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'zk-name:/path-in-zookeeper'`. It's useful for shipping data to new clusters. [#14155](https://github.com/ClickHouse/ClickHouse/pull/14155) ([Amos Bird](https://github.com/amosbird)). +* Slightly better performance of Memory table if it was constructed from a huge number of very small blocks (that's unlikely). Author of the idea: [Mark Papadakis](https://github.com/markpapadakis). Closes [#14043](https://github.com/ClickHouse/ClickHouse/issues/14043). [#14056](https://github.com/ClickHouse/ClickHouse/pull/14056) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Conditional aggregate functions (for example: `avgIf`, `sumIf`, `maxIf`) should return `NULL` when miss rows and use nullable arguments. [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). +* Increase limit in -Resample combinator to 1M. [#13947](https://github.com/ClickHouse/ClickHouse/pull/13947) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Corrected an error in AvroConfluent format that caused the Kafka table engine to stop processing messages when an abnormally small, malformed, message was received. [#13941](https://github.com/ClickHouse/ClickHouse/pull/13941) ([Gervasio Varela](https://github.com/gervarela)). +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Better error message for null value of `TabSeparated` format. [#13906](https://github.com/ClickHouse/ClickHouse/pull/13906) ([jiang tao](https://github.com/tomjiang1987)). +* Function `arrayCompact` will compare NaNs bitwise if the type of array elements is Float32/Float64. In previous versions NaNs were always not equal if the type of array elements is Float32/Float64 and were always equal if the type is more complex, like Nullable(Float64). This closes [#13857](https://github.com/ClickHouse/ClickHouse/issues/13857). [#13868](https://github.com/ClickHouse/ClickHouse/pull/13868) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix data race in `lgamma` function. This race was caught only in `tsan`, no side effects a really happened. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Avoid too slow queries when arrays are manipulated as fields. Throw exception instead. [#13753](https://github.com/ClickHouse/ClickHouse/pull/13753) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added Redis requirepass authorization (for redis dictionary source). [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). +* Add MergeTree Write-Ahead-Log (WAL) dump tool. WAL is an experimental feature. [#13640](https://github.com/ClickHouse/ClickHouse/pull/13640) ([BohuTANG](https://github.com/BohuTANG)). +* In previous versions `lcm` function may produce assertion violation in debug build if called with specifically crafted arguments. This fixes [#13368](https://github.com/ClickHouse/ClickHouse/issues/13368). [#13510](https://github.com/ClickHouse/ClickHouse/pull/13510) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Provide monotonicity for `toDate/toDateTime` functions in more cases. Monotonicity information is used for index analysis (more complex queries will be able to use index). Now the input arguments are saturated more naturally and provides better monotonicity. [#13497](https://github.com/ClickHouse/ClickHouse/pull/13497) ([Amos Bird](https://github.com/amosbird)). +* Support compound identifiers for custom settings. Custom settings is an integration point of ClickHouse codebase with other codebases (no benefits for ClickHouse itself) [#13496](https://github.com/ClickHouse/ClickHouse/pull/13496) ([Vitaly Baranov](https://github.com/vitlibar)). +* Move parts from DiskLocal to DiskS3 in parallel. `DiskS3` is an experimental feature. [#13459](https://github.com/ClickHouse/ClickHouse/pull/13459) ([Pavel Kovalenko](https://github.com/Jokser)). +* Enable mixed granularity parts by default. [#13449](https://github.com/ClickHouse/ClickHouse/pull/13449) ([alesapin](https://github.com/alesapin)). +* Proper remote host checking in S3 redirects (security-related thing). [#13404](https://github.com/ClickHouse/ClickHouse/pull/13404) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add `QueryTimeMicroseconds`, `SelectQueryTimeMicroseconds` and `InsertQueryTimeMicroseconds` to system.events. [#13336](https://github.com/ClickHouse/ClickHouse/pull/13336) ([ianton-ru](https://github.com/ianton-ru)). +* Fix debug assertion when Decimal has too large negative exponent. Fixes [#13188](https://github.com/ClickHouse/ClickHouse/issues/13188). [#13228](https://github.com/ClickHouse/ClickHouse/pull/13228) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added cache layer for DiskS3 (cache to local disk mark and index files). `DiskS3` is an experimental feature. [#13076](https://github.com/ClickHouse/ClickHouse/pull/13076) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix readline so it dumps history to file now. [#13600](https://github.com/ClickHouse/ClickHouse/pull/13600) ([Amos Bird](https://github.com/amosbird)). +* Create `system` database with `Atomic` engine by default (a preparation to enable `Atomic` database engine by default everywhere). [#13680](https://github.com/ClickHouse/ClickHouse/pull/13680) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Slightly optimize very short queries with `LowCardinality`. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). +* Enable parallel INSERTs for table engines `Null`, `Memory`, `Distributed` and `Buffer` when the setting `max_insert_threads` is set. [#14120](https://github.com/ClickHouse/ClickHouse/pull/14120) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fail fast if `max_rows_to_read` limit is exceeded on parts scan. The motivation behind this change is to skip ranges scan for all selected parts if it is clear that `max_rows_to_read` is already exceeded. The change is quite noticeable for queries over big number of parts. [#13677](https://github.com/ClickHouse/ClickHouse/pull/13677) ([Roman Khavronenko](https://github.com/hagen1778)). +* Slightly improve performance of aggregation by UInt8/UInt16 keys. [#13099](https://github.com/ClickHouse/ClickHouse/pull/13099) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize `has()`, `indexOf()` and `countEqual()` functions for `Array(LowCardinality(T))` and constant right arguments. [#12550](https://github.com/ClickHouse/ClickHouse/pull/12550) ([myrrc](https://github.com/myrrc)). +* When performing trivial `INSERT SELECT` queries, automatically set `max_threads` to 1 or `max_insert_threads`, and set `max_block_size` to `min_insert_block_size_rows`. Related to [#5907](https://github.com/ClickHouse/ClickHouse/issues/5907). [#12195](https://github.com/ClickHouse/ClickHouse/pull/12195) ([flynn](https://github.com/ucasFL)). + +#### Experimental Feature + +* ClickHouse can work as MySQL replica - it is implemented by `MaterializeMySQL` database engine. Implements [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#10851](https://github.com/ClickHouse/ClickHouse/pull/10851) ([Winter Zhang](https://github.com/zhang2014)). +* Add types `Int128`, `Int256`, `UInt256` and related functions for them. Extend Decimals with Decimal256 (precision up to 76 digits). New types are under the setting `allow_experimental_bigint_types`. It is working extremely slow and bad. The implementation is incomplete. Please don't use this feature. [#13097](https://github.com/ClickHouse/ClickHouse/pull/13097) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Build/Testing/Packaging Improvement + +* Added `clickhouse install` script, that is useful if you only have a single binary. [#13528](https://github.com/ClickHouse/ClickHouse/pull/13528) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to run `clickhouse` binary without configuration. [#13515](https://github.com/ClickHouse/ClickHouse/pull/13515) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable check for typos in code with `codespell`. [#13513](https://github.com/ClickHouse/ClickHouse/pull/13513) [#13511](https://github.com/ClickHouse/ClickHouse/pull/13511) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable Shellcheck in CI as a linter of .sh tests. This closes [#13168](https://github.com/ClickHouse/ClickHouse/issues/13168). [#13530](https://github.com/ClickHouse/ClickHouse/pull/13530) [#13529](https://github.com/ClickHouse/ClickHouse/pull/13529) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a CMake option to fail configuration instead of auto-reconfiguration, enabled by default. [#13687](https://github.com/ClickHouse/ClickHouse/pull/13687) ([Konstantin](https://github.com/podshumok)). +* Expose version of embedded tzdata via TZDATA_VERSION in system.build_options. [#13648](https://github.com/ClickHouse/ClickHouse/pull/13648) ([filimonov](https://github.com/filimonov)). +* Improve generation of system.time_zones table during build. Closes [#14209](https://github.com/ClickHouse/ClickHouse/issues/14209). [#14215](https://github.com/ClickHouse/ClickHouse/pull/14215) ([filimonov](https://github.com/filimonov)). +* Build ClickHouse with the most fresh tzdata from package repository. [#13623](https://github.com/ClickHouse/ClickHouse/pull/13623) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to write js-style comments in skip_list.json. [#14159](https://github.com/ClickHouse/ClickHouse/pull/14159) ([alesapin](https://github.com/alesapin)). +* Ensure that there is no copy-pasted GPL code. [#13514](https://github.com/ClickHouse/ClickHouse/pull/13514) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Switch tests docker images to use test-base parent. [#14167](https://github.com/ClickHouse/ClickHouse/pull/14167) ([Ilya Yatsishin](https://github.com/qoega)). +* Adding retry logic when bringing up docker-compose cluster; Increasing COMPOSE_HTTP_TIMEOUT. [#14112](https://github.com/ClickHouse/ClickHouse/pull/14112) ([vzakaznikov](https://github.com/vzakaznikov)). +* Enabled `system.text_log` in stress test to find more bugs. [#13855](https://github.com/ClickHouse/ClickHouse/pull/13855) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Testflows LDAP module: adding missing certificates and dhparam.pem for openldap4. [#13780](https://github.com/ClickHouse/ClickHouse/pull/13780) ([vzakaznikov](https://github.com/vzakaznikov)). +* ZooKeeper cannot work reliably in unit tests in CI infrastructure. Using unit tests for ZooKeeper interaction with real ZooKeeper is bad idea from the start (unit tests are not supposed to verify complex distributed systems). We already using integration tests for this purpose and they are better suited. [#13745](https://github.com/ClickHouse/ClickHouse/pull/13745) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added docker image for style check. Added style check that all docker and docker compose files are located in docker directory. [#13724](https://github.com/ClickHouse/ClickHouse/pull/13724) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix cassandra build on Mac OS. [#13708](https://github.com/ClickHouse/ClickHouse/pull/13708) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix link error in shared build. [#13700](https://github.com/ClickHouse/ClickHouse/pull/13700) ([Amos Bird](https://github.com/amosbird)). +* Updating LDAP user authentication suite to check that it works with RBAC. [#13656](https://github.com/ClickHouse/ClickHouse/pull/13656) ([vzakaznikov](https://github.com/vzakaznikov)). +* Removed `-DENABLE_CURL_CLIENT` for `contrib/aws`. [#13628](https://github.com/ClickHouse/ClickHouse/pull/13628) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Increasing health-check timeouts for ClickHouse nodes and adding support to dump docker-compose logs if unhealthy containers found. [#13612](https://github.com/ClickHouse/ClickHouse/pull/13612) ([vzakaznikov](https://github.com/vzakaznikov)). +* Make sure [#10977](https://github.com/ClickHouse/ClickHouse/issues/10977) is invalid. [#13539](https://github.com/ClickHouse/ClickHouse/pull/13539) ([Amos Bird](https://github.com/amosbird)). +* Skip PR's from robot-clickhouse. [#13489](https://github.com/ClickHouse/ClickHouse/pull/13489) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Move Dockerfiles from integration tests to `docker/test` directory. docker_compose files are available in `runner` docker container. Docker images are built in CI and not in integration tests. [#13448](https://github.com/ClickHouse/ClickHouse/pull/13448) ([Ilya Yatsishin](https://github.com/qoega)). + + +## ClickHouse release 20.7 + +### ClickHouse release v20.7.2.30-stable, 2020-08-31 + +#### Backward Incompatible Change + +* Function `modulo` (operator `%`) with at least one floating point number as argument will calculate remainder of division directly on floating point numbers without converting both arguments to integers. It makes behaviour compatible with most of DBMS. This also applicable for Date and DateTime data types. Added alias `mod`. This closes [#7323](https://github.com/ClickHouse/ClickHouse/issues/7323). [#12585](https://github.com/ClickHouse/ClickHouse/pull/12585) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Deprecate special printing of zero Date/DateTime values as `0000-00-00` and `0000-00-00 00:00:00`. [#12442](https://github.com/ClickHouse/ClickHouse/pull/12442) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The function `groupArrayMoving*` was not working for distributed queries. It's result was calculated within incorrect data type (without promotion to the largest type). The function `groupArrayMovingAvg` was returning integer number that was inconsistent with the `avg` function. This fixes [#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add sanity check for MergeTree settings. If the settings are incorrect, the server will refuse to start or to create a table, printing detailed explanation to the user. [#13153](https://github.com/ClickHouse/ClickHouse/pull/13153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Protect from the cases when user may set `background_pool_size` to value lower than `number_of_free_entries_in_pool_to_execute_mutation` or `number_of_free_entries_in_pool_to_lower_max_size_of_merge`. In these cases ALTERs won't work or the maximum size of merge will be too limited. It will throw exception explaining what to do. This closes [#10897](https://github.com/ClickHouse/ClickHouse/issues/10897). [#12728](https://github.com/ClickHouse/ClickHouse/pull/12728) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Polygon dictionary type that provides efficient "reverse geocoding" lookups - to find the region by coordinates in a dictionary of many polygons (world map). It is using carefully optimized algorithm with recursive grids to maintain low CPU and memory usage. [#9278](https://github.com/ClickHouse/ClickHouse/pull/9278) ([achulkov2](https://github.com/achulkov2)). +* Added support of LDAP authentication for preconfigured users ("Simple Bind" method). [#11234](https://github.com/ClickHouse/ClickHouse/pull/11234) ([Denis Glazachev](https://github.com/traceon)). +* Introduce setting `alter_partition_verbose_result` which outputs information about touched parts for some types of `ALTER TABLE ... PARTITION ...` queries (currently `ATTACH` and `FREEZE`). Closes [#8076](https://github.com/ClickHouse/ClickHouse/issues/8076). [#13017](https://github.com/ClickHouse/ClickHouse/pull/13017) ([alesapin](https://github.com/alesapin)). +* Add `bayesAB` function for bayesian-ab-testing. [#12327](https://github.com/ClickHouse/ClickHouse/pull/12327) ([achimbab](https://github.com/achimbab)). +* Added `system.crash_log` table into which stack traces for fatal errors are collected. This table should be empty. [#12316](https://github.com/ClickHouse/ClickHouse/pull/12316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added http headers `X-ClickHouse-Database` and `X-ClickHouse-Format` which may be used to set default database and output format. [#12981](https://github.com/ClickHouse/ClickHouse/pull/12981) ([hcz](https://github.com/hczhcz)). +* Add `minMap` and `maxMap` functions support to `SimpleAggregateFunction`. [#12662](https://github.com/ClickHouse/ClickHouse/pull/12662) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Add setting `allow_non_metadata_alters` which restricts to execute `ALTER` queries which modify data on disk. Disabled be default. Closes [#11547](https://github.com/ClickHouse/ClickHouse/issues/11547). [#12635](https://github.com/ClickHouse/ClickHouse/pull/12635) ([alesapin](https://github.com/alesapin)). +* A function `formatRow` is added to support turning arbitrary expressions into a string via given format. It's useful for manipulating SQL outputs and is quite versatile combined with the `columns` function. [#12574](https://github.com/ClickHouse/ClickHouse/pull/12574) ([Amos Bird](https://github.com/amosbird)). +* Add `FROM_UNIXTIME` function for compatibility with MySQL, related to [12149](https://github.com/ClickHouse/ClickHouse/issues/12149). [#12484](https://github.com/ClickHouse/ClickHouse/pull/12484) ([flynn](https://github.com/ucasFL)). +* Allow Nullable types as keys in MergeTree tables if `allow_nullable_key` table setting is enabled. Closes [#5319](https://github.com/ClickHouse/ClickHouse/issues/5319). [#12433](https://github.com/ClickHouse/ClickHouse/pull/12433) ([Amos Bird](https://github.com/amosbird)). +* Integration with [COS](https://intl.cloud.tencent.com/product/cos). [#12386](https://github.com/ClickHouse/ClickHouse/pull/12386) ([fastio](https://github.com/fastio)). +* Add `mapAdd` and `mapSubtract` functions for adding/subtracting key-mapped values. [#11735](https://github.com/ClickHouse/ClickHouse/pull/11735) ([Ildus Kurbangaliev](https://github.com/ildus)). + +#### Bug Fix + +* Fix premature `ON CLUSTER` timeouts for queries that must be executed on a single replica. Fixes [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). +* Fix crash in mark inclusion search introduced in [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277). [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Fix visible data clobbering by progress bar in client in interactive mode. This fixes [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) and [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) and [#13584](https://github.com/ClickHouse/ClickHouse/issues/13584) and fixes [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect sorting order for `LowCardinality` columns when ORDER BY multiple columns is used. This fixes [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Removed hardcoded timeout, which wrongly overruled `query_wait_timeout_milliseconds` setting for cache-dictionary. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed wrong mount point in extra info for `Poco::Exception: no space left on device`. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). +* Fix wrong query optimization of select queries with `DISTINCT` keyword when subqueries also have `DISTINCT` in case `optimize_duplicate_order_by_and_distinct` setting is enabled. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed potential deadlock when renaming `Distributed` table. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect sorting for `FixedString` columns when ORDER BY multiple columns is used. Fixes [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix potentially lower precision of `topK`/`topKWeighted` aggregations (with non-default parameters). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading from MergeTree table with INDEX of type SET fails when compared against NULL. This fixes [#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). +* Fix step overflow in function `range()`. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Directory not empty` error when concurrently executing `DROP DATABASE` and `CREATE TABLE`. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add range check for `h3KRing` function. This fixes [#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix race condition between DETACH and background merges. Parts may revive after detach. This is continuation of [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) that did not fix the issue but introduced a test that started to fail in very rare cases, demonstrating the issue. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix logging Settings.Names/Values when `log_queries_min_type` greater than `QUERY_START`. [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect message in `clickhouse-server.init` while checking user and group. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). +* Do not optimize `any(arrayJoin())` to `arrayJoin()` under `optimize_move_functions_out_of_any`. [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible deadlock in concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix secondary indices corruption in compact parts (compact parts is an experimental feature). [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong code in function `netloc`. This fixes [#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix invalid return type for comparison of tuples with `NULL` elements. Fixes [#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong optimization caused `aggregate function any(x) is found inside another aggregate function in query` error with `SET optimize_move_functions_out_of_any = 1` and aliases inside `any()`. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible race in `StorageMemory`. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix empty output for `Arrow` and `Parquet` formats in case if query return zero rows. It was done because empty output is not valid for this formats. [#13399](https://github.com/ClickHouse/ClickHouse/pull/13399) ([hcz](https://github.com/hczhcz)). +* Fix select queries with constant columns and prefix of primary key in `ORDER BY` clause. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `PrettyCompactMonoBlock` for clickhouse-local. Fix extremes/totals with `PrettyCompactMonoBlock`. Fixes [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). +* Fixed deadlock in system.text_log. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). It is a part of [#12339](https://github.com/ClickHouse/ClickHouse/issues/12339). This fixes [#12325](https://github.com/ClickHouse/ClickHouse/issues/12325). [#13386](https://github.com/ClickHouse/ClickHouse/pull/13386) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed `File(TSVWithNames*)` (header was written multiple times), fixed `clickhouse-local --format CSVWithNames*` (lacks header, broken after [#12197](https://github.com/ClickHouse/ClickHouse/issues/12197)), fixed `clickhouse-local --format CSVWithNames*` with zero rows (lacks header). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault when function `groupArrayMovingSum` deserializes empty state. Fixes [#13339](https://github.com/ClickHouse/ClickHouse/issues/13339). [#13341](https://github.com/ClickHouse/ClickHouse/pull/13341) ([alesapin](https://github.com/alesapin)). +* Throw error on `arrayJoin()` function in `JOIN ON` section. [#13330](https://github.com/ClickHouse/ClickHouse/pull/13330) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `LEFT ASOF JOIN` with `join_use_nulls=1`. [#13291](https://github.com/ClickHouse/ClickHouse/pull/13291) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible error `Totals having transform was already added to pipeline` in case of a query from delayed replica. [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The server may crash if user passed specifically crafted arguments to the function `h3ToChildren`. This fixes [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with `NaN` values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assertion in KeyCondition when primary key contains expression with monotonic function and query contains comparison with constant whose type is different. This fixes [#12465](https://github.com/ClickHouse/ClickHouse/issues/12465). [#13251](https://github.com/ClickHouse/ClickHouse/pull/13251) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Return passed number for numbers with MSB set in function roundUpToPowerOfTwoOrZero(). It prevents potential errors in case of overflow of array sizes. [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). +* Fix function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix DateTime64 conversion functions with constant argument. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix access to `redis` dictionary after connection was dropped once. It may happen with `cache` and `direct` dictionary layouts. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong index analysis with functions. It could lead to some data parts being skipped when reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Cannot convert column because it is constant but values of constants are different in source and result` for remote queries which use deterministic functions in scope of query, but not deterministic between queries, like `now()`, `now64()`, `randConstant()`. Fixes [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash which was possible for queries with `ORDER BY` tuple and small `LIMIT`. Fixes [#12623](https://github.com/ClickHouse/ClickHouse/issues/12623). [#13009](https://github.com/ClickHouse/ClickHouse/pull/13009) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `Block structure mismatch` error for queries with `UNION` and `JOIN`. Fixes [#12602](https://github.com/ClickHouse/ClickHouse/issues/12602). [#12989](https://github.com/ClickHouse/ClickHouse/pull/12989) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Corrected `merge_with_ttl_timeout` logic which did not work well when expiration affected more than one partition over one time interval. (Authored by @excitoon). [#12982](https://github.com/ClickHouse/ClickHouse/pull/12982) ([Alexander Kazakov](https://github.com/Akazz)). +* Fix columns duplication for range hashed dictionary created from DDL query. This fixes [#10605](https://github.com/ClickHouse/ClickHouse/issues/10605). [#12857](https://github.com/ClickHouse/ClickHouse/pull/12857) ([alesapin](https://github.com/alesapin)). +* Fix unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix rare bug when `ALTER DELETE` and `ALTER MODIFY COLUMN` queries executed simultaneously as a single mutation. Bug leads to an incorrect amount of rows in `count.txt` and as a consequence incorrect data in part. Also, fix a small bug with simultaneous `ALTER RENAME COLUMN` and `ALTER ADD COLUMN`. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). +* Wrong credentials being used when using `clickhouse` dictionary source to query remote tables. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). +* Fix `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fix performance with large tuples, which are interpreted as functions in `IN` section. The case when user writes `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fix memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong optimization `optimize_move_functions_out_of_any=1` in case of `any(func())`. [#12664](https://github.com/ClickHouse/ClickHouse/pull/12664) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SIGSEGV in StorageKafka when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Add support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* CREATE USER IF NOT EXISTS now does not throw exception if the user exists. This fixes [#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). +* Exception `There is no supertype...` can be thrown during `ALTER ... UPDATE` in unexpected cases (e.g. when subtracting from UInt64 column). This fixes [#7306](https://github.com/ClickHouse/ClickHouse/issues/7306). This fixes [#4165](https://github.com/ClickHouse/ClickHouse/issues/4165). [#12633](https://github.com/ClickHouse/ClickHouse/pull/12633) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible `Pipeline stuck` error for queries with external sorting. Fixes [#12617](https://github.com/ClickHouse/ClickHouse/issues/12617). [#12618](https://github.com/ClickHouse/ClickHouse/pull/12618) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Output of TreeExecutor is not sorted` for `OPTIMIZE DEDUPLICATE`. Fixes [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572). [#12613](https://github.com/ClickHouse/ClickHouse/pull/12613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix the issue when alias on result of function `any` can be lost during query optimization. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Now ClickHouse will recalculate checksums for parts when file `checksums.txt` is absent. Broken since [#9827](https://github.com/ClickHouse/ClickHouse/issues/9827). [#12545](https://github.com/ClickHouse/ClickHouse/pull/12545) ([alesapin](https://github.com/alesapin)). +* Fix bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Fixing race condition in live view tables which could cause data duplication. LIVE VIEW is an experimental feature. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in JOIN with dictionary when we are joining over expression of dictionary key: `t JOIN dict ON expr(dict.id) = t.id`. Disable dictionary join optimisation for this case. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix overflow when very large LIMIT or OFFSET is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* kafka: fix SIGSEGV if there is a message with error in the middle of the batch. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Keep smaller amount of logs in ZooKeeper. Avoid excessive growing of ZooKeeper nodes in case of offline replicas when having many servers/tables/inserts. [#13100](https://github.com/ClickHouse/ClickHouse/pull/13100) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now exceptions forwarded to the client if an error happened during ALTER or mutation. Closes [#11329](https://github.com/ClickHouse/ClickHouse/issues/11329). [#12666](https://github.com/ClickHouse/ClickHouse/pull/12666) ([alesapin](https://github.com/alesapin)). +* Add `QueryTimeMicroseconds`, `SelectQueryTimeMicroseconds` and `InsertQueryTimeMicroseconds` to `system.events`, along with system.metrics, processes, query_log, etc. [#13028](https://github.com/ClickHouse/ClickHouse/pull/13028) ([ianton-ru](https://github.com/ianton-ru)). +* Added `SelectedRows` and `SelectedBytes` to `system.events`, along with system.metrics, processes, query_log, etc. [#12638](https://github.com/ClickHouse/ClickHouse/pull/12638) ([ianton-ru](https://github.com/ianton-ru)). +* Added `current_database` information to `system.query_log`. [#12652](https://github.com/ClickHouse/ClickHouse/pull/12652) ([Amos Bird](https://github.com/amosbird)). +* Allow `TabSeparatedRaw` as input format. [#12009](https://github.com/ClickHouse/ClickHouse/pull/12009) ([hcz](https://github.com/hczhcz)). +* Now `joinGet` supports multi-key lookup. [#12418](https://github.com/ClickHouse/ClickHouse/pull/12418) ([Amos Bird](https://github.com/amosbird)). +* Allow `*Map` aggregate functions to work on Arrays with NULLs. Fixes [#13157](https://github.com/ClickHouse/ClickHouse/issues/13157). [#13225](https://github.com/ClickHouse/ClickHouse/pull/13225) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid overflow in parsing of DateTime values that will lead to negative unix timestamp in their timezone (for example, `1970-01-01 00:00:00` in Moscow). Saturate to zero instead. This fixes [#3470](https://github.com/ClickHouse/ClickHouse/issues/3470). This fixes [#4172](https://github.com/ClickHouse/ClickHouse/issues/4172). [#12443](https://github.com/ClickHouse/ClickHouse/pull/12443) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* AvroConfluent: Skip Kafka tombstone records - Support skipping broken records [#13203](https://github.com/ClickHouse/ClickHouse/pull/13203) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix data race in `lgamma` function. This race was caught only in `tsan`, no side effects really happened. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a 'Week'-interval formatting for ATTACH/ALTER/CREATE QUOTA-statements. [#13417](https://github.com/ClickHouse/ClickHouse/pull/13417) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). +* Now broken parts are also reported when encountered in compact part processing. Compact parts is an experimental feature. [#13282](https://github.com/ClickHouse/ClickHouse/pull/13282) ([Amos Bird](https://github.com/amosbird)). +* Fix assert in `geohashesInBox`. This fixes [#12554](https://github.com/ClickHouse/ClickHouse/issues/12554). [#13229](https://github.com/ClickHouse/ClickHouse/pull/13229) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assert in `parseDateTimeBestEffort`. This fixes [#12649](https://github.com/ClickHouse/ClickHouse/issues/12649). [#13227](https://github.com/ClickHouse/ClickHouse/pull/13227) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor optimization in Processors/PipelineExecutor: breaking out of a loop because it makes sense to do so. [#13058](https://github.com/ClickHouse/ClickHouse/pull/13058) ([Mark Papadakis](https://github.com/markpapadakis)). +* Support TRUNCATE table without TABLE keyword. [#12653](https://github.com/ClickHouse/ClickHouse/pull/12653) ([Winter Zhang](https://github.com/zhang2014)). +* Fix explain query format overwrite by default. This fixes [#12541](https://github.com/ClickHouse/ClickHouse/issues/12432). [#12541](https://github.com/ClickHouse/ClickHouse/pull/12541) ([BohuTANG](https://github.com/BohuTANG)). +* Allow to set JOIN kind and type in more standad way: `LEFT SEMI JOIN` instead of `SEMI LEFT JOIN`. For now both are correct. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). +* Changes default value for `multiple_joins_rewriter_version` to 2. It enables new multiple joins rewriter that knows about column names. [#12469](https://github.com/ClickHouse/ClickHouse/pull/12469) ([Artem Zuikov](https://github.com/4ertus2)). +* Add several metrics for requests to S3 storages. [#12464](https://github.com/ClickHouse/ClickHouse/pull/12464) ([ianton-ru](https://github.com/ianton-ru)). +* Use correct default secure port for clickhouse-benchmark with `--secure` argument. This fixes [#11044](https://github.com/ClickHouse/ClickHouse/issues/11044). [#12440](https://github.com/ClickHouse/ClickHouse/pull/12440) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Rollback insertion errors in `Log`, `TinyLog`, `StripeLog` engines. In previous versions insertion error lead to inconsisent table state (this works as documented and it is normal for these table engines). This fixes [#12402](https://github.com/ClickHouse/ClickHouse/issues/12402). [#12426](https://github.com/ClickHouse/ClickHouse/pull/12426) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement `RENAME DATABASE` and `RENAME DICTIONARY` for `Atomic` database engine - Add implicit `{uuid}` macro, which can be used in ZooKeeper path for `ReplicatedMergeTree`. It works with `CREATE ... ON CLUSTER ...` queries. Set `show_table_uuid_in_table_create_query_if_not_nil` to `true` to use it. - Make `ReplicatedMergeTree` engine arguments optional, `/clickhouse/tables/{uuid}/{shard}/` and `{replica}` are used by default. Closes [#12135](https://github.com/ClickHouse/ClickHouse/issues/12135). - Minor fixes. - These changes break backward compatibility of `Atomic` database engine. Previously created `Atomic` databases must be manually converted to new format. Atomic database is an experimental feature. [#12343](https://github.com/ClickHouse/ClickHouse/pull/12343) ([tavplubix](https://github.com/tavplubix)). +* Separated `AWSAuthV4Signer` into different logger, removed excessive `AWSClient: AWSClient` from log messages. [#12320](https://github.com/ClickHouse/ClickHouse/pull/12320) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Better exception message in disk access storage. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error message about adaptive granularity. [#12624](https://github.com/ClickHouse/ClickHouse/pull/12624) ([alesapin](https://github.com/alesapin)). +* Fix SETTINGS parse after FORMAT. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). +* If MergeTree table does not contain ORDER BY or PARTITION BY, it was possible to request ALTER to CLEAR all the columns and ALTER will stuck. Fixed [#7941](https://github.com/ClickHouse/ClickHouse/issues/7941). [#12382](https://github.com/ClickHouse/ClickHouse/pull/12382) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid re-loading completion from the history file after each query (to avoid history overlaps with other client sessions). [#13086](https://github.com/ClickHouse/ClickHouse/pull/13086) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement + +* Lower memory usage for some operations up to 2 times. [#12424](https://github.com/ClickHouse/ClickHouse/pull/12424) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize PK lookup for queries that match exact PK range. [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277) ([Ivan Babrou](https://github.com/bobrik)). +* Slightly optimize very short queries with `LowCardinality`. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). +* Slightly improve performance of aggregation by UInt8/UInt16 keys. [#13091](https://github.com/ClickHouse/ClickHouse/pull/13091) and [#13055](https://github.com/ClickHouse/ClickHouse/pull/13055) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Push down `LIMIT` step for query plan (inside subqueries). [#13016](https://github.com/ClickHouse/ClickHouse/pull/13016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parallel primary key lookup and skipping index stages on parts, as described in [#11564](https://github.com/ClickHouse/ClickHouse/issues/11564). [#12589](https://github.com/ClickHouse/ClickHouse/pull/12589) ([Ivan Babrou](https://github.com/bobrik)). +* Converting String-type arguments of function "if" and "transform" into enum if `set optimize_if_transform_strings_to_enum = 1`. [#12515](https://github.com/ClickHouse/ClickHouse/pull/12515) ([Artem Zuikov](https://github.com/4ertus2)). +* Replaces monotonic functions with its argument in `ORDER BY` if `set optimize_monotonous_functions_in_order_by=1`. [#12467](https://github.com/ClickHouse/ClickHouse/pull/12467) ([Artem Zuikov](https://github.com/4ertus2)). +* Add order by optimization that rewrites `ORDER BY x, f(x)` with `ORDER by x` if `set optimize_redundant_functions_in_order_by = 1`. [#12404](https://github.com/ClickHouse/ClickHouse/pull/12404) ([Artem Zuikov](https://github.com/4ertus2)). +* Allow pushdown predicate when subquery contains `WITH` clause. This fixes [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Improve performance of reading from compact parts. Compact parts is an experimental feature. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Attempt to implement streaming optimization in `DiskS3`. DiskS3 is an experimental feature. [#12434](https://github.com/ClickHouse/ClickHouse/pull/12434) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Build/Testing/Packaging Improvement + +* Use `shellcheck` for sh tests linting. [#13200](https://github.com/ClickHouse/ClickHouse/pull/13200) [#13207](https://github.com/ClickHouse/ClickHouse/pull/13207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add script which set labels for pull requests in GitHub hook. [#13183](https://github.com/ClickHouse/ClickHouse/pull/13183) ([alesapin](https://github.com/alesapin)). +* Remove some of recursive submodules. See [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13379](https://github.com/ClickHouse/ClickHouse/pull/13379) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Ensure that all the submodules are from proper URLs. Continuation of [#13379](https://github.com/ClickHouse/ClickHouse/issues/13379). This fixes [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13397](https://github.com/ClickHouse/ClickHouse/pull/13397) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for user-declared settings, which can be accessed from inside queries. This is needed when ClickHouse engine is used as a component of another system. [#13013](https://github.com/ClickHouse/ClickHouse/pull/13013) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added testing for RBAC functionality of INSERT privilege in TestFlows. Expanded tables on which SELECT is being tested. Added Requirements to match new table engine tests. [#13340](https://github.com/ClickHouse/ClickHouse/pull/13340) ([MyroTk](https://github.com/MyroTk)). +* Fix timeout error during server restart in the stress test. [#13321](https://github.com/ClickHouse/ClickHouse/pull/13321) ([alesapin](https://github.com/alesapin)). +* Now fast test will wait server with retries. [#13284](https://github.com/ClickHouse/ClickHouse/pull/13284) ([alesapin](https://github.com/alesapin)). +* Function `materialize()` (the function for ClickHouse testing) will work for NULL as expected - by transforming it to non-constant column. [#13212](https://github.com/ClickHouse/ClickHouse/pull/13212) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix libunwind build in AArch64. This fixes [#13204](https://github.com/ClickHouse/ClickHouse/issues/13204). [#13208](https://github.com/ClickHouse/ClickHouse/pull/13208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Even more retries in zkutil gtest to prevent test flakiness. [#13165](https://github.com/ClickHouse/ClickHouse/pull/13165) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Small fixes to the RBAC TestFlows. [#13152](https://github.com/ClickHouse/ClickHouse/pull/13152) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixing `00960_live_view_watch_events_live.py` test. [#13108](https://github.com/ClickHouse/ClickHouse/pull/13108) ([vzakaznikov](https://github.com/vzakaznikov)). +* Improve cache purge in documentation deploy script. [#13107](https://github.com/ClickHouse/ClickHouse/pull/13107) ([alesapin](https://github.com/alesapin)). +* Rewrote some orphan tests to gtest. Removed useless includes from tests. [#13073](https://github.com/ClickHouse/ClickHouse/pull/13073) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added tests for RBAC functionality of `SELECT` privilege in TestFlows. [#13061](https://github.com/ClickHouse/ClickHouse/pull/13061) ([Ritaank Tiwari](https://github.com/ritaank)). +* Rerun some tests in fast test check. [#12992](https://github.com/ClickHouse/ClickHouse/pull/12992) ([alesapin](https://github.com/alesapin)). +* Fix MSan error in "rdkafka" library. This closes [#12990](https://github.com/ClickHouse/ClickHouse/issues/12990). Updated `rdkafka` to version 1.5 (master). [#12991](https://github.com/ClickHouse/ClickHouse/pull/12991) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in base64 if tests were run on server with AVX-512. This fixes [#12318](https://github.com/ClickHouse/ClickHouse/issues/12318). Author: @qoega. [#12441](https://github.com/ClickHouse/ClickHouse/pull/12441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in HDFS library. This closes [#12330](https://github.com/ClickHouse/ClickHouse/issues/12330). [#12453](https://github.com/ClickHouse/ClickHouse/pull/12453) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check an ability that we able to restore the backup from an old version to the new version. This closes [#8979](https://github.com/ClickHouse/ClickHouse/issues/8979). [#12959](https://github.com/ClickHouse/ClickHouse/pull/12959) ([alesapin](https://github.com/alesapin)). +* Do not build helper_container image inside integrational tests. Build docker container in CI and use pre-built helper_container in integration tests. [#12953](https://github.com/ClickHouse/ClickHouse/pull/12953) ([Ilya Yatsishin](https://github.com/qoega)). +* Add a test for `ALTER TABLE CLEAR COLUMN` query for primary key columns. [#12951](https://github.com/ClickHouse/ClickHouse/pull/12951) ([alesapin](https://github.com/alesapin)). +* Increased timeouts in testflows tests. [#12949](https://github.com/ClickHouse/ClickHouse/pull/12949) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix build of test under Mac OS X. This closes [#12767](https://github.com/ClickHouse/ClickHouse/issues/12767). [#12772](https://github.com/ClickHouse/ClickHouse/pull/12772) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Connector-ODBC updated to mysql-connector-odbc-8.0.21. [#12739](https://github.com/ClickHouse/ClickHouse/pull/12739) ([Ilya Yatsishin](https://github.com/qoega)). +* Adding RBAC syntax tests in TestFlows. [#12642](https://github.com/ClickHouse/ClickHouse/pull/12642) ([vzakaznikov](https://github.com/vzakaznikov)). +* Improve performance of TestKeeper. This will speedup tests with heavy usage of Replicated tables. [#12505](https://github.com/ClickHouse/ClickHouse/pull/12505) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we check that server is able to start after stress tests run. This fixes [#12473](https://github.com/ClickHouse/ClickHouse/issues/12473). [#12496](https://github.com/ClickHouse/ClickHouse/pull/12496) ([alesapin](https://github.com/alesapin)). +* Update fmtlib to master (7.0.1). [#12446](https://github.com/ClickHouse/ClickHouse/pull/12446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add docker image for fast tests. [#12294](https://github.com/ClickHouse/ClickHouse/pull/12294) ([alesapin](https://github.com/alesapin)). +* Rework configuration paths for integration tests. [#12285](https://github.com/ClickHouse/ClickHouse/pull/12285) ([Ilya Yatsishin](https://github.com/qoega)). +* Add compiler option to control that stack frames are not too large. This will help to run the code in fibers with small stack size. [#11524](https://github.com/ClickHouse/ClickHouse/pull/11524) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update gitignore-files. [#13447](https://github.com/ClickHouse/ClickHouse/pull/13447) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). + + +## ClickHouse release 20.6 + +### ClickHouse release v20.6.3.28-stable + +#### Backward Incompatible Change + +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added an initial implementation of `EXPLAIN` query. Syntax: `EXPLAIN SELECT ...`. This fixes [#1118](https://github.com/ClickHouse/ClickHouse/issues/1118). [#11873](https://github.com/ClickHouse/ClickHouse/pull/11873) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added storage `RabbitMQ`. [#11069](https://github.com/ClickHouse/ClickHouse/pull/11069) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implemented PostgreSQL-like `ILIKE` operator for [#11710](https://github.com/ClickHouse/ClickHouse/issues/11710). [#12125](https://github.com/ClickHouse/ClickHouse/pull/12125) ([Mike](https://github.com/myrrc)). +* Supported RIGHT and FULL JOIN with `SET join_algorithm = 'partial_merge'`. Only ALL strictness is allowed (ANY, SEMI, ANTI, ASOF are not). [#12118](https://github.com/ClickHouse/ClickHouse/pull/12118) ([Artem Zuikov](https://github.com/4ertus2)). +* Added a function `initializeAggregation` to initialize an aggregation based on a single value. [#12109](https://github.com/ClickHouse/ClickHouse/pull/12109) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Supported `ALTER TABLE ... [ADD|MODIFY] COLUMN ... FIRST` [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#12073](https://github.com/ClickHouse/ClickHouse/pull/12073) ([Winter Zhang](https://github.com/zhang2014)). +* Added function `parseDateTimeBestEffortUS`. [#12028](https://github.com/ClickHouse/ClickHouse/pull/12028) ([flynn](https://github.com/ucasFL)). +* Support format `ORC` for output (was supported only for input). [#11662](https://github.com/ClickHouse/ClickHouse/pull/11662) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fix + +* Fixed `aggregate function any(x) is found inside another aggregate function in query` error with `SET optimize_move_functions_out_of_any = 1` and aliases inside `any()`. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed `PrettyCompactMonoBlock` for clickhouse-local. Fixed extremes/totals with `PrettyCompactMonoBlock`. This fixes [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible error `Totals having transform was already added to pipeline` in case of a query from delayed replica. [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The server may crash if user passed specifically crafted arguments to the function `h3ToChildren`. This fixes [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with NaN values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `DateTime64` conversion functions with constant argument. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed error `Cannot convert column because it is constant but values of constants are different in source and result` for remote queries which use deterministic functions in scope of query, but not deterministic between queries, like `now()`, `now64()`, `randConstant()`. Fixes [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare bug when `ALTER DELETE` and `ALTER MODIFY COLUMN` queries executed simultaneously as a single mutation. Bug leads to an incorrect amount of rows in `count.txt` and as a consequence incorrect data in part. Also, fix a small bug with simultaneous `ALTER RENAME COLUMN` and `ALTER ADD COLUMN`. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). +* Fixed `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for `input_format_parallel_parsing` (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bloom filter index with const expression. This fixes [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `CREATE USER IF NOT EXISTS` now does not throw exception if the user exists. This fixes [#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). +* Better exception message in disk access storage. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). +* The function `groupArrayMoving*` was not working for distributed queries. It's result was calculated within incorrect data type (without promotion to the largest type). The function `groupArrayMovingAvg` was returning integer number that was inconsistent with the `avg` function. This fixes [#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed lack of aliases with function `any`. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixing race condition in live view tables which could cause data duplication. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed SETTINGS parse after FORMAT. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed overflow when very large `LIMIT` or `OFFSET` is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if `StorageMerge`. This fixes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Reverted change introduced in [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) to resolve [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). +* Additional check for arguments of bloom filter index. This fixes [#11408](https://github.com/ClickHouse/ClickHouse/issues/11408). [#12388](https://github.com/ClickHouse/ClickHouse/pull/12388) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid exception when negative or floating point constant is used in WHERE condition for indexed tables. This fixes [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allowed to `CLEAR` column even if there are depending `DEFAULT` expressions. This fixes [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `TOTALS/ROLLUP/CUBE` for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed error message and exit codes for `ALTER RENAME COLUMN` queries, when `RENAME` is not allowed. Fixes [#12301](https://github.com/ClickHouse/ClickHouse/issues/12301) and [#12303](https://github.com/ClickHouse/ClickHouse/issues/12303). [#12335](https://github.com/ClickHouse/ClickHouse/pull/12335) ([alesapin](https://github.com/alesapin)). +* Fixed very rare race condition in `ReplicatedMergeTreeQueue`. [#12315](https://github.com/ClickHouse/ClickHouse/pull/12315) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When using codec `Delta` or `DoubleDelta` with non fixed width types, exception with code `LOGICAL_ERROR` was returned instead of exception with code `BAD_ARGUMENTS` (we ensure that exceptions with code logical error never happen). This fixes [#12110](https://github.com/ClickHouse/ClickHouse/issues/12110). [#12308](https://github.com/ClickHouse/ClickHouse/pull/12308) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `TTL` after renaming column, on which depends TTL expression. [#12304](https://github.com/ClickHouse/ClickHouse/pull/12304) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed SIGSEGV if there is an message with error in the middle of the batch in `Kafka` Engine. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the situation when some threads might randomly hang for a few seconds during `DNS` cache updating. [#12296](https://github.com/ClickHouse/ClickHouse/pull/12296) ([tavplubix](https://github.com/tavplubix)). +* Fixed typo in setting name. [#12292](https://github.com/ClickHouse/ClickHouse/pull/12292) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after `TrieDictionary` failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour on reaching redirect limit in request to `S3` storage. [#12256](https://github.com/ClickHouse/ClickHouse/pull/12256) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Cap max_memory_usage* limits to the process resident memory. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). +* Fix dictGet arguments check during `GROUP BY` injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the behaviour when `SummingMergeTree` engine sums up columns from partition key. Added an exception in case of explicit definition of columns to sum which intersects with partition key columns. This fixes [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't split the dictionary source's table name into schema and table name itself if ODBC connection does not support schema. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bad code in redundant ORDER BY optimization. The bug was introduced in [#10067](https://github.com/ClickHouse/ClickHouse/issues/10067). [#12148](https://github.com/ClickHouse/ClickHouse/pull/12148) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Normalize "pid" file handling. In previous versions the server may refuse to start if it was killed without proper shutdown and if there is another process that has the same pid as previously runned server. Also pid file may be removed in unsuccessful server startup even if there is another server running. This fixes [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which leads to incorrect table metadata in ZooKeepeer for ReplicatedVersionedCollapsingMergeTree tables. Fixes [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). +* Avoid "There is no query" exception for materialized views with joins or with subqueries attached to system logs (system.query_log, metric_log, etc) or to engine=Buffer underlying table. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). +* Fixed handling dependency of table with ENGINE=Dictionary on dictionary. This fixes [#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). This fixes [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). +* Format `Parquet` now properly works with `LowCardinality` and `LowCardinality(Nullable)` types. Fixes [#12086](https://github.com/ClickHouse/ClickHouse/issues/12086), [#8406](https://github.com/ClickHouse/ClickHouse/issues/8406). [#12108](https://github.com/ClickHouse/ClickHouse/pull/12108) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed empty `result_rows` and `result_bytes` metrics in `system.quey_log` for selects. Fixes [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed SIGSEGV in StorageKafka on DROP TABLE. [#12075](https://github.com/ClickHouse/ClickHouse/pull/12075) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Improvement + +* Allowed to set `JOIN` kind and type in more standard way: `LEFT SEMI JOIN` instead of `SEMI LEFT JOIN`. For now both are correct. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). +* lifetime_rows/lifetime_bytes for Buffer engine. [#12421](https://github.com/ClickHouse/ClickHouse/pull/12421) ([Azat Khuzhin](https://github.com/azat)). +* Write the detail exception message to the client instead of 'MySQL server has gone away'. [#12383](https://github.com/ClickHouse/ClickHouse/pull/12383) ([BohuTANG](https://github.com/BohuTANG)). +* Allows to change a charset which is used for printing grids borders. Available charsets are following: UTF-8, ASCII. Setting `output_format_pretty_grid_charset` enables this feature. [#12372](https://github.com/ClickHouse/ClickHouse/pull/12372) ([Sabyanin Maxim](https://github.com/s-mx)). +* Supported MySQL 'SELECT DATABASE()' [#9336](https://github.com/ClickHouse/ClickHouse/issues/9336) 2. Add MySQL replacement query integration test. [#12314](https://github.com/ClickHouse/ClickHouse/pull/12314) ([BohuTANG](https://github.com/BohuTANG)). +* Added `KILL QUERY [connection_id]` for the MySQL client/driver to cancel the long query, issue [#12038](https://github.com/ClickHouse/ClickHouse/issues/12038). [#12152](https://github.com/ClickHouse/ClickHouse/pull/12152) ([BohuTANG](https://github.com/BohuTANG)). +* Added support for `%g` (two digit ISO year) and `%G` (four digit ISO year) substitutions in `formatDateTime` function. [#12136](https://github.com/ClickHouse/ClickHouse/pull/12136) ([vivarum](https://github.com/vivarum)). +* Added 'type' column in system.disks. [#12115](https://github.com/ClickHouse/ClickHouse/pull/12115) ([ianton-ru](https://github.com/ianton-ru)). +* Improved `REVOKE` command: now it requires grant/admin option for only access which will be revoked. For example, to execute `REVOKE ALL ON *.* FROM user1` now it does not require to have full access rights granted with grant option. Added command `REVOKE ALL FROM user1` - it revokes all granted roles from `user1`. [#12083](https://github.com/ClickHouse/ClickHouse/pull/12083) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added replica priority for load_balancing (for manual prioritization of the load balancing). [#11995](https://github.com/ClickHouse/ClickHouse/pull/11995) ([Azat Khuzhin](https://github.com/azat)). +* Switched paths in S3 metadata to relative which allows to handle S3 blobs more easily. [#11892](https://github.com/ClickHouse/ClickHouse/pull/11892) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Performance Improvement + +* Improved performace of 'ORDER BY' and 'GROUP BY' by prefix of sorting key (enabled with `optimize_aggregation_in_order` setting, disabled by default). [#11696](https://github.com/ClickHouse/ClickHouse/pull/11696) ([Anton Popov](https://github.com/CurtizJ)). +* Removed injective functions inside `uniq*()` if `set optimize_injective_functions_inside_uniq=1`. [#12337](https://github.com/ClickHouse/ClickHouse/pull/12337) ([Ruslan Kamalov](https://github.com/kamalov-ruslan)). +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). +* Implemented single part uploads for DiskS3 (experimental feature). [#12026](https://github.com/ClickHouse/ClickHouse/pull/12026) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Experimental Feature +* Added new in-memory format of parts in `MergeTree`-family tables, which stores data in memory. Parts are written on disk at first merge. Part will be created in in-memory format if its size in rows or bytes is below thresholds `min_rows_for_compact_part` and `min_bytes_for_compact_part`. Also optional support of Write-Ahead-Log is available, which is enabled by default and is controlled by setting `in_memory_parts_enable_wal`. [#10697](https://github.com/ClickHouse/ClickHouse/pull/10697) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Implement AST-based query fuzzing mode for clickhouse-client. See [this label](https://github.com/ClickHouse/ClickHouse/issues?q=label%3Afuzz+is%3Aissue) for the list of issues we recently found by fuzzing. Most of them were found by this tool, and a couple by SQLancer and `00746_sql_fuzzy.pl`. [#12111](https://github.com/ClickHouse/ClickHouse/pull/12111) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add new type of tests based on Testflows framework. [#12090](https://github.com/ClickHouse/ClickHouse/pull/12090) ([vzakaznikov](https://github.com/vzakaznikov)). +* Added S3 HTTPS integration test. [#12412](https://github.com/ClickHouse/ClickHouse/pull/12412) ([Pavel Kovalenko](https://github.com/Jokser)). +* Log sanitizer trap messages from separate thread. This will prevent possible deadlock under thread sanitizer. [#12313](https://github.com/ClickHouse/ClickHouse/pull/12313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now functional and stress tests will be able to run with old version of `clickhouse-test` script. [#12287](https://github.com/ClickHouse/ClickHouse/pull/12287) ([alesapin](https://github.com/alesapin)). +* Remove strange file creation during build in `orc`. [#12258](https://github.com/ClickHouse/ClickHouse/pull/12258) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Place common docker compose files to integration docker container. [#12168](https://github.com/ClickHouse/ClickHouse/pull/12168) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix warnings from CodeQL. `CodeQL` is another static analyzer that we will use along with `clang-tidy` and `PVS-Studio` that we use already. [#12138](https://github.com/ClickHouse/ClickHouse/pull/12138) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor CMake fixes for UNBUNDLED build. [#12131](https://github.com/ClickHouse/ClickHouse/pull/12131) ([Matwey V. Kornilov](https://github.com/matwey)). +* Added a showcase of the minimal Docker image without using any Linux distribution. [#12126](https://github.com/ClickHouse/ClickHouse/pull/12126) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Perform an upgrade of system packages in the `clickhouse-server` docker image. [#12124](https://github.com/ClickHouse/ClickHouse/pull/12124) ([Ivan Blinkov](https://github.com/blinkov)). +* Add `UNBUNDLED` flag to `system.build_options` table. Move skip lists for `clickhouse-test` to clickhouse repo. [#12107](https://github.com/ClickHouse/ClickHouse/pull/12107) ([alesapin](https://github.com/alesapin)). +* Regular check by [Anchore Container Analysis](https://docs.anchore.com) security analysis tool that looks for [CVE](https://cve.mitre.org/) in `clickhouse-server` Docker image. Also confirms that `Dockerfile` is buildable. Runs daily on `master` and on pull-requests to `Dockerfile`. [#12102](https://github.com/ClickHouse/ClickHouse/pull/12102) ([Ivan Blinkov](https://github.com/blinkov)). +* Daily check by [GitHub CodeQL](https://securitylab.github.com/tools/codeql) security analysis tool that looks for [CWE](https://cwe.mitre.org/). [#12101](https://github.com/ClickHouse/ClickHouse/pull/12101) ([Ivan Blinkov](https://github.com/blinkov)). +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + +## ClickHouse release 20.5 + +### ClickHouse release v20.5.4.40-stable 2020-08-10 + +#### Bug Fix + +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bloom filter index with const expression. This fixes [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed lack of aliases with function `any`. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in live view tables which could cause data duplication. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed overflow when very large LIMIT or OFFSET is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Reverts change introduced in [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) to resolve [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). +* Avoid exception when negative or floating point constant is used in WHERE condition for indexed tables. This fixes [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to CLEAR column even if there are depending DEFAULT expressions. This fixes [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed TOTALS/ROLLUP/CUBE for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed SIGSEGV if there is an message with error in the middle of the batch in `Kafka` Engine. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the behaviour when `SummingMergeTree` engine sums up columns from partition key. Added an exception in case of explicit definition of columns to sum which intersects with partition key columns. This fixes [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which leads to incorrect table metadata in ZooKeepeer for ReplicatedVersionedCollapsingMergeTree tables. Fixes [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash in JOIN with LowCardinality type with `join_algorithm=partial_merge`. [#12035](https://github.com/ClickHouse/ClickHouse/pull/12035) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + +#### Build/Testing/Packaging Improvement + +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + + +### ClickHouse release v20.5.2.7-stable 2020-07-02 + +#### Backward Incompatible Change + +* Return non-Nullable result from COUNT(DISTINCT), and `uniq` aggregate functions family. If all passed values are NULL, return zero instead. This improves SQL compatibility. [#11661](https://github.com/ClickHouse/ClickHouse/pull/11661) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a check for the case when user-level setting is specified in a wrong place. User-level settings should be specified in `users.xml` inside `` section for specific user profile (or in `` for default settings). The server won't start with exception message in log. This fixes [#9051](https://github.com/ClickHouse/ClickHouse/issues/9051). If you want to skip the check, you can either move settings to the appropriate place or add `1` to config.xml. [#11449](https://github.com/ClickHouse/ClickHouse/pull/11449) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The setting `input_format_with_names_use_header` is enabled by default. It will affect parsing of input formats `-WithNames` and `-WithNamesAndTypes`. [#10937](https://github.com/ClickHouse/ClickHouse/pull/10937) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `experimental_use_processors` setting. It is enabled by default. [#10924](https://github.com/ClickHouse/ClickHouse/pull/10924) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update `zstd` to 1.4.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. This change is backward compatible but we list it here in changelog in case you will wonder about these messages. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a check for meaningless codecs and a setting `allow_suspicious_codecs` to control this check. This closes [#4966](https://github.com/ClickHouse/ClickHouse/issues/4966). [#10645](https://github.com/ClickHouse/ClickHouse/pull/10645) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Several Kafka setting changes their defaults. See [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* `TTL DELETE WHERE` and `TTL GROUP BY` for automatic data coarsening and rollup in tables. [#10537](https://github.com/ClickHouse/ClickHouse/pull/10537) ([expl0si0nn](https://github.com/expl0si0nn)). +* Implementation of PostgreSQL wire protocol. [#10242](https://github.com/ClickHouse/ClickHouse/pull/10242) ([Movses](https://github.com/MovElb)). +* Added system tables for users, roles, grants, settings profiles, quotas, row policies; added commands SHOW USER, SHOW [CURRENT|ENABLED] ROLES, SHOW SETTINGS PROFILES. [#10387](https://github.com/ClickHouse/ClickHouse/pull/10387) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support writes in ODBC Table function [#10554](https://github.com/ClickHouse/ClickHouse/pull/10554) ([ageraab](https://github.com/ageraab)). [#10901](https://github.com/ClickHouse/ClickHouse/pull/10901) ([tavplubix](https://github.com/tavplubix)). +* Add query performance metrics based on Linux `perf_events` (these metrics are calculated with hardware CPU counters and OS counters). It is optional and requires `CAP_SYS_ADMIN` to be set on clickhouse binary. [#9545](https://github.com/ClickHouse/ClickHouse/pull/9545) [Andrey Skobtsov](https://github.com/And42). [#11226](https://github.com/ClickHouse/ClickHouse/pull/11226) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Now support `NULL` and `NOT NULL` modifiers for data types in `CREATE` query. [#11057](https://github.com/ClickHouse/ClickHouse/pull/11057) ([Павел Потемкин](https://github.com/Potya)). +* Add `ArrowStream` input and output format. [#11088](https://github.com/ClickHouse/ClickHouse/pull/11088) ([hcz](https://github.com/hczhcz)). +* Support Cassandra as external dictionary source. [#4978](https://github.com/ClickHouse/ClickHouse/pull/4978) ([favstovol](https://github.com/favstovol)). +* Added a new layout `direct` which loads all the data directly from the source for each query, without storing or caching data. [#10622](https://github.com/ClickHouse/ClickHouse/pull/10622) ([Artem Streltsov](https://github.com/kekekekule)). +* Added new `complex_key_direct` layout to dictionaries, that does not store anything locally during query execution. [#10850](https://github.com/ClickHouse/ClickHouse/pull/10850) ([Artem Streltsov](https://github.com/kekekekule)). +* Added support for MySQL style global variables syntax (stub). This is needed for compatibility of MySQL protocol. [#11832](https://github.com/ClickHouse/ClickHouse/pull/11832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added syntax highligting to `clickhouse-client` using `replxx`. [#11422](https://github.com/ClickHouse/ClickHouse/pull/11422) ([Tagir Kuskarov](https://github.com/kuskarov)). +* `minMap` and `maxMap` functions were added. [#11603](https://github.com/ClickHouse/ClickHouse/pull/11603) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Add the `system.asynchronous_metric_log` table that logs historical metrics from `system.asynchronous_metrics`. [#11588](https://github.com/ClickHouse/ClickHouse/pull/11588) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add functions `extractAllGroupsHorizontal(haystack, re)` and `extractAllGroupsVertical(haystack, re)`. [#11554](https://github.com/ClickHouse/ClickHouse/pull/11554) ([Vasily Nemkov](https://github.com/Enmk)). +* Add SHOW CLUSTER(S) queries. [#11467](https://github.com/ClickHouse/ClickHouse/pull/11467) ([hexiaoting](https://github.com/hexiaoting)). +* Add `netloc` function for extracting network location, similar to `urlparse(url)`, `netloc` in python. [#11356](https://github.com/ClickHouse/ClickHouse/pull/11356) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Add 2 more virtual columns for engine=Kafka to access message headers. [#11283](https://github.com/ClickHouse/ClickHouse/pull/11283) ([filimonov](https://github.com/filimonov)). +* Add `_timestamp_ms` virtual column for Kafka engine (type is `Nullable(DateTime64(3))`). [#11260](https://github.com/ClickHouse/ClickHouse/pull/11260) ([filimonov](https://github.com/filimonov)). +* Add function `randomFixedString`. [#10866](https://github.com/ClickHouse/ClickHouse/pull/10866) ([Andrei Nekrashevich](https://github.com/xolm)). +* Add function `fuzzBits` that randomly flips bits in a string with given probability. [#11237](https://github.com/ClickHouse/ClickHouse/pull/11237) ([Andrei Nekrashevich](https://github.com/xolm)). +* Allow comparison of numbers with constant string in comparison operators, IN and VALUES sections. [#11647](https://github.com/ClickHouse/ClickHouse/pull/11647) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `round_robin` load_balancing mode. [#11645](https://github.com/ClickHouse/ClickHouse/pull/11645) ([Azat Khuzhin](https://github.com/azat)). +* Add `cast_keep_nullable` setting. If set `CAST(something_nullable AS Type)` return `Nullable(Type)`. [#11733](https://github.com/ClickHouse/ClickHouse/pull/11733) ([Artem Zuikov](https://github.com/4ertus2)). +* Added column `position` to `system.columns` table and `column_position` to `system.parts_columns` table. It contains ordinal position of a column in a table starting with 1. This closes [#7744](https://github.com/ClickHouse/ClickHouse/issues/7744). [#11655](https://github.com/ClickHouse/ClickHouse/pull/11655) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ON CLUSTER support for SYSTEM {FLUSH DISTRIBUTED,STOP/START DISTRIBUTED SEND}. [#11415](https://github.com/ClickHouse/ClickHouse/pull/11415) ([Azat Khuzhin](https://github.com/azat)). +* Add system.distribution_queue table. [#11394](https://github.com/ClickHouse/ClickHouse/pull/11394) ([Azat Khuzhin](https://github.com/azat)). +* Support for all format settings in Kafka, expose some setting on table level, adjust the defaults for better performance. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). +* Add `port` function (to extract port from URL). [#11120](https://github.com/ClickHouse/ClickHouse/pull/11120) ([Azat Khuzhin](https://github.com/azat)). +* Now `dictGet*` functions accept table names. [#11050](https://github.com/ClickHouse/ClickHouse/pull/11050) ([Vitaly Baranov](https://github.com/vitlibar)). +* The `clickhouse-format` tool is now able to format multiple queries when the `-n` argument is used. [#10852](https://github.com/ClickHouse/ClickHouse/pull/10852) ([Darío](https://github.com/dgrr)). +* Possibility to configure proxy-resolver for DiskS3. [#10744](https://github.com/ClickHouse/ClickHouse/pull/10744) ([Pavel Kovalenko](https://github.com/Jokser)). +* Make `pointInPolygon` work with non-constant polygon. PointInPolygon now can take Array(Array(Tuple(..., ...))) as second argument, array of polygon and holes. [#10623](https://github.com/ClickHouse/ClickHouse/pull/10623) ([Alexey Ilyukhov](https://github.com/livace)) [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Added `move_ttl_info` to `system.parts` in order to provide introspection of move TTL functionality. [#10591](https://github.com/ClickHouse/ClickHouse/pull/10591) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Possibility to work with S3 through proxies. [#10576](https://github.com/ClickHouse/ClickHouse/pull/10576) ([Pavel Kovalenko](https://github.com/Jokser)). +* Add `NCHAR` and `NVARCHAR` synonims for data types. [#11025](https://github.com/ClickHouse/ClickHouse/pull/11025) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Resolved [#7224](https://github.com/ClickHouse/ClickHouse/issues/7224): added `FailedQuery`, `FailedSelectQuery` and `FailedInsertQuery` metrics to `system.events` table. [#11151](https://github.com/ClickHouse/ClickHouse/pull/11151) ([Nikita Orlov](https://github.com/naorlov)). +* Add more `jemalloc` statistics to `system.asynchronous_metrics`, and ensure that we see up-to-date values for them. [#11748](https://github.com/ClickHouse/ClickHouse/pull/11748) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Allow to specify default S3 credentials and custom auth headers. [#11134](https://github.com/ClickHouse/ClickHouse/pull/11134) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Added new functions to import/export DateTime64 as Int64 with various precision: `to-/fromUnixTimestamp64Milli/-Micro/-Nano`. [#10923](https://github.com/ClickHouse/ClickHouse/pull/10923) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow specifying `mongodb://` URI for MongoDB dictionaries. [#10915](https://github.com/ClickHouse/ClickHouse/pull/10915) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* OFFSET keyword can now be used without an affiliated LIMIT clause. [#10802](https://github.com/ClickHouse/ClickHouse/pull/10802) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Added `system.licenses` table. This table contains licenses of third-party libraries that are located in `contrib` directory. This closes [#2890](https://github.com/ClickHouse/ClickHouse/issues/2890). [#10795](https://github.com/ClickHouse/ClickHouse/pull/10795) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* New function function toStartOfSecond(DateTime64) -> DateTime64 that nullifies sub-second part of DateTime64 value. [#10722](https://github.com/ClickHouse/ClickHouse/pull/10722) ([Vasily Nemkov](https://github.com/Enmk)). +* Add new input format `JSONAsString` that accepts a sequence of JSON objects separated by newlines, spaces and/or commas. [#10607](https://github.com/ClickHouse/ClickHouse/pull/10607) ([Kruglov Pavel](https://github.com/Avogar)). +* Allowed to profile memory with finer granularity steps than 4 MiB. Added sampling memory profiler to capture random allocations/deallocations. [#10598](https://github.com/ClickHouse/ClickHouse/pull/10598) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `SimpleAggregateFunction` now also supports `sumMap`. [#10000](https://github.com/ClickHouse/ClickHouse/pull/10000) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `ALTER RENAME COLUMN` for the distributed table engine. Continuation of [#10727](https://github.com/ClickHouse/ClickHouse/issues/10727). Fixes [#10747](https://github.com/ClickHouse/ClickHouse/issues/10747). [#10887](https://github.com/ClickHouse/ClickHouse/pull/10887) ([alesapin](https://github.com/alesapin)). + +#### Bug Fix + +* Fix UBSan report in Decimal parse. This fixes [#7540](https://github.com/ClickHouse/ClickHouse/issues/7540). [#10512](https://github.com/ClickHouse/ClickHouse/pull/10512) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential floating point exception when parsing DateTime64. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. [#11895](https://github.com/ClickHouse/ClickHouse/pull/11895) [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608) [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of comparison of FixedString with constant String. This fixes [#11393](https://github.com/ClickHouse/ClickHouse/issues/11393). This bug appeared in version 20.4. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result for `if` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Scalar does not exist` exception when using `WITH ...` in `SELECT ... FROM merge_tree_table ...` [#11621](https://github.com/ClickHouse/ClickHouse/issues/11621). [#11767](https://github.com/ClickHouse/ClickHouse/pull/11767) ([Amos Bird](https://github.com/amosbird)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Fix very rare race condition in SYSTEM SYNC REPLICA. If the replicated table is created and at the same time from the separate connection another client is issuing `SYSTEM SYNC REPLICA` command on that table (this is unlikely, because another client should be aware that the table is created), it's possible to get nullptr dereference. [#11691](https://github.com/ClickHouse/ClickHouse/pull/11691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible `Pipeline stuck` for selects with parallel `FINAL`. Fixes [#11636](https://github.com/ClickHouse/ClickHouse/issues/11636). [#11682](https://github.com/ClickHouse/ClickHouse/pull/11682) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Fix syntax hilite in CREATE USER query. [#11664](https://github.com/ClickHouse/ClickHouse/pull/11664) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Without `-q` option the database does not get created at startup. [#11604](https://github.com/ClickHouse/ClickHouse/pull/11604) ([giordyb](https://github.com/giordyb)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when `exception.code() % 256 == 0`. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix race conditions in CREATE/DROP of different replicas of ReplicatedMergeTree. Continue to work if the table was not removed completely from ZooKeeper or not created successfully. This fixes [#11432](https://github.com/ClickHouse/ClickHouse/issues/11432). [#11592](https://github.com/ClickHouse/ClickHouse/pull/11592) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare segfault in `SHOW CREATE TABLE` Fixes [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix async INSERT into Distributed for prefer_localhost_replica=0 and w/o internal_replication. [#11527](https://github.com/ClickHouse/ClickHouse/pull/11527) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak when exception is thrown in the middle of aggregation with `-State` functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `Pipeline stuck` exception for `INSERT SELECT FINAL` where `SELECT` (`max_threads`>1) has multiple streams but `INSERT` has only one (`max_insert_threads`==0). [#11455](https://github.com/ClickHouse/ClickHouse/pull/11455) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong result in queries like `select count() from t, u`. [#11454](https://github.com/ClickHouse/ClickHouse/pull/11454) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix potential uninitialized memory read in MergeTree shutdown if table was not created successfully. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in JOIN over `LowCarinality(T)` and `Nullable(T)`. [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix error code for wrong `USING` key. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed `geohashesInBox` with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Better errors for `joinGet()` functions. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential segfault when using `Lazy` database. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in direct selects from `Join` table engine (without JOIN) and wrong nullability. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `visitParamExtractRaw` when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix insignificant data race in `clickhouse-copier`. Found by integration tests. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when `SET DEFAULT ROLE` is called with wrong arguments. This fixes [#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash while reading malformed data in `Protobuf` format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when `cache` dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now `primary.idx` will be checked if it's defined in `CREATE` query. [#11199](https://github.com/ClickHouse/ClickHouse/pull/11199) ([alesapin](https://github.com/alesapin)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `S3` globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Remove logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed deadlock during server startup after update with changes in structure of system log tables. [#11106](https://github.com/ClickHouse/ClickHouse/pull/11106) ([alesapin](https://github.com/alesapin)). +* Fixed memory leak in registerDiskS3. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix error `No such name in Block::erase()` when JOIN appears with PREWHERE or `optimize_move_to_prewhere` makes PREWHERE from WHERE. [#11051](https://github.com/ClickHouse/ClickHouse/pull/11051) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixes the potential missed data during termination of Kafka engine table. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). +* Fixed parseDateTime64BestEffort argument resolution bugs. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Now it's possible to `ADD/DROP` and `RENAME` the same one column in a single `ALTER` query. Exception message for simultaneous `MODIFY` and `RENAME` became more clear. Partially fixes [#10669](https://github.com/ClickHouse/ClickHouse/issues/10669). [#11037](https://github.com/ClickHouse/ClickHouse/pull/11037) ([alesapin](https://github.com/alesapin)). +* Fixed parsing of S3 URLs. [#11036](https://github.com/ClickHouse/ClickHouse/pull/11036) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix memory tracking for two-level `GROUP BY` when there is a `LIMIT`. [#11022](https://github.com/ClickHouse/ClickHouse/pull/11022) ([Azat Khuzhin](https://github.com/azat)). +* Fix very rare potential use-after-free error in MergeTree if table was not created successfully. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix metadata (relative path for rename) and data (relative path for symlink) handling for Atomic database. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). +* Fix server crash on concurrent `ALTER` and `DROP DATABASE` queries with `Atomic` database engine. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect raw data size in method getRawData(). [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fix incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid sending partially written files by the DistributedBlockOutputStream. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in `SELECT count(notNullIn(NULL, []))`. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). +* Now it's possible to execute multiple `ALTER RENAME` like `a TO b, c TO a`. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). +* Fix possible race which could happen when you get result from aggregate function state from multiple thread for the same column. The only way (which I found) it can happen is when you use `finalizeAggregation` function while reading from table with `Memory` engine which stores `AggregateFunction` state for `quanite*` function. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV in StringHashTable (if such key does not exist). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `WATCH` hangs after `LiveView` table was dropped from database with `Atomic` engine. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Now constraints are updated if the column participating in `CONSTRAINT` expression was renamed. Fixes [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). +* Fix potential read of uninitialized memory in cache dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix columns order after Block::sortColumns() (also add a test that shows that it affects some real use case - Buffer engine). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue with ODBC bridge when no quoting of identifiers is requested. This fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan and MSan report in DateLUT. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make use of `src_type` for correct type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Get rid of old libunwind patches. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 This allows to disable `-fno-omit-frame-pointer` in `clang` builds that improves performance at least by 1% in average. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). +* Fix avgWeighted when using floating-point weight over multiple shards. [#10758](https://github.com/ClickHouse/ClickHouse/pull/10758) ([Baudouin Giard](https://github.com/bgiard)). +* Fix `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix combinator -OrNull and -OrDefault when combined with -State. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fix crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix atomicity of HTTP insert. This fixes [#9666](https://github.com/ClickHouse/ClickHouse/issues/9666). [#10687](https://github.com/ClickHouse/ClickHouse/pull/10687) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fix order of parameters in AggregateTransform constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fix nullptr dereference in StorageBuffer if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Fix optimize_skip_unused_shards with LowCardinality. [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in StorageBuffer when exception on server startup. Fixes [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550). [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)). +* On `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed handling condition variable for synchronous mutations. In some cases signals to that condition variable could be lost. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixes possible crash `createDictionary()` is called before `loadStoredObject()` has finished. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SELECT of column ALIAS which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values (just like for DateTime). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix index corruption, which may occur in some cases after merge compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). +* Disable GROUP BY sharding_key optimization by default (`optimize_distributed_group_by_sharding_key` had been introduced and turned of by default, due to trickery of sharding_key analyzing, simple example is `if` in sharding key) and fix it for WITH ROLLUP/CUBE/TOTALS. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). +* Fixes: [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263) (after that PR dist send via INSERT had been postponing on each INSERT) Fixes: [#8756](https://github.com/ClickHouse/ClickHouse/issues/8756) (that PR breaks distributed sends with all of the following conditions met (unlikely setup for now I guess): `internal_replication == false`, multiple local shards (activates the hardlinking code) and `distributed_storage_policy` (makes `link(2)` fails on `EXDEV`)). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). +* Fixed error with "max_rows_to_sort" limit. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Get dictionary and check access rights only once per each call of any function reading external dictionaries. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement + +* Apply `TTL` for old data, after `ALTER MODIFY TTL` query. This behaviour is controlled by setting `materialize_ttl_after_modify`, which is enabled by default. [#11042](https://github.com/ClickHouse/ClickHouse/pull/11042) ([Anton Popov](https://github.com/CurtizJ)). +* When parsing C-style backslash escapes in string literals, VALUES and various text formats (this is an extension to SQL standard that is endemic for ClickHouse and MySQL), keep backslash if unknown escape sequence is found (e.g. `\%` or `\w`) that will make usage of `LIKE` and `match` regular expressions more convenient (it's enough to write `name LIKE 'used\_cars'` instead of `name LIKE 'used\\_cars'`) and more compatible at the same time. This fixes [#10922](https://github.com/ClickHouse/ClickHouse/issues/10922). [#11208](https://github.com/ClickHouse/ClickHouse/pull/11208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When reading Decimal value, cut extra digits after point. This behaviour is more compatible with MySQL and PostgreSQL. This fixes [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11831](https://github.com/ClickHouse/ClickHouse/pull/11831) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to DROP replicated table if the metadata in ZooKeeper was already removed and does not exist (this is also the case when using TestKeeper for testing and the server was restarted). Allow to RENAME replicated table even if there is an error communicating with ZooKeeper. This fixes [#10720](https://github.com/ClickHouse/ClickHouse/issues/10720). [#11652](https://github.com/ClickHouse/ClickHouse/pull/11652) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Slightly improve diagnostic of reading decimal from string. This closes [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11829](https://github.com/ClickHouse/ClickHouse/pull/11829) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix sleep invocation in signal handler. It was sleeping for less amount of time than expected. [#11825](https://github.com/ClickHouse/ClickHouse/pull/11825) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* (Only Linux) OS related performance metrics (for CPU and I/O) will work even without `CAP_NET_ADMIN` capability. [#10544](https://github.com/ClickHouse/ClickHouse/pull/10544) ([Alexander Kazakov](https://github.com/Akazz)). +* Added `hostname` as an alias to function `hostName`. This feature was suggested by Victor Tarnavskiy from Yandex.Metrica. [#11821](https://github.com/ClickHouse/ClickHouse/pull/11821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for distributed `DDL` (update/delete/drop partition) on cross replication clusters. [#11703](https://github.com/ClickHouse/ClickHouse/pull/11703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Emit warning instead of error in server log at startup if we cannot listen one of the listen addresses (e.g. IPv6 is unavailable inside Docker). Note that if server fails to listen all listed addresses, it will refuse to startup as before. This fixes [#4406](https://github.com/ClickHouse/ClickHouse/issues/4406). [#11687](https://github.com/ClickHouse/ClickHouse/pull/11687) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Default user and database creation on docker image starting. [#10637](https://github.com/ClickHouse/ClickHouse/pull/10637) ([Paramtamtam](https://github.com/tarampampam)). +* When multiline query is printed to server log, the lines are joined. Make it to work correct in case of multiline string literals, identifiers and single-line comments. This fixes [#3853](https://github.com/ClickHouse/ClickHouse/issues/3853). [#11686](https://github.com/ClickHouse/ClickHouse/pull/11686) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Multiple names are now allowed in commands: CREATE USER, CREATE ROLE, ALTER USER, SHOW CREATE USER, SHOW GRANTS and so on. [#11670](https://github.com/ClickHouse/ClickHouse/pull/11670) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for distributed DDL (`UPDATE/DELETE/DROP PARTITION`) on cross replication clusters. [#11508](https://github.com/ClickHouse/ClickHouse/pull/11508) ([frank lee](https://github.com/etah000)). +* Clear password from command line in `clickhouse-client` and `clickhouse-benchmark` if the user has specified it with explicit value. This prevents password exposure by `ps` and similar tools. [#11665](https://github.com/ClickHouse/ClickHouse/pull/11665) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't use debug info from ELF file if it does not correspond to the running binary. It is needed to avoid printing wrong function names and source locations in stack traces. This fixes [#7514](https://github.com/ClickHouse/ClickHouse/issues/7514). [#11657](https://github.com/ClickHouse/ClickHouse/pull/11657) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Return NULL/zero when value is not parsed completely in parseDateTimeBestEffortOrNull/Zero functions. This fixes [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Skip empty parameters in requested URL. They may appear when you write `http://localhost:8123/?&a=b` or `http://localhost:8123/?a=b&&c=d`. This closes [#10749](https://github.com/ClickHouse/ClickHouse/issues/10749). [#11651](https://github.com/ClickHouse/ClickHouse/pull/11651) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow using `groupArrayArray` and `groupUniqArrayArray` as `SimpleAggregateFunction`. [#11650](https://github.com/ClickHouse/ClickHouse/pull/11650) ([Volodymyr Kuznetsov](https://github.com/ksvladimir)). +* Allow comparison with constant strings by implicit conversions when analysing index conditions on other types. This may close [#11630](https://github.com/ClickHouse/ClickHouse/issues/11630). [#11648](https://github.com/ClickHouse/ClickHouse/pull/11648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* https://github.com/ClickHouse/ClickHouse/pull/7572#issuecomment-642815377 Support config default HTTPHandlers. [#11628](https://github.com/ClickHouse/ClickHouse/pull/11628) ([Winter Zhang](https://github.com/zhang2014)). +* Make more input formats to work with Kafka engine. Fix the issue with premature flushes. Fix the performance issue when `kafka_num_consumers` is greater than number of partitions in topic. [#11599](https://github.com/ClickHouse/ClickHouse/pull/11599) ([filimonov](https://github.com/filimonov)). +* Improve `multiple_joins_rewriter_version=2` logic. Fix unknown columns error for lambda aliases. [#11587](https://github.com/ClickHouse/ClickHouse/pull/11587) ([Artem Zuikov](https://github.com/4ertus2)). +* Better exception message when cannot parse columns declaration list. This closes [#10403](https://github.com/ClickHouse/ClickHouse/issues/10403). [#11537](https://github.com/ClickHouse/ClickHouse/pull/11537) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `enable_optimize_predicate_expression=1` logic for VIEW. [#11513](https://github.com/ClickHouse/ClickHouse/pull/11513) ([Artem Zuikov](https://github.com/4ertus2)). +* Adding support for PREWHERE in live view tables. [#11495](https://github.com/ClickHouse/ClickHouse/pull/11495) ([vzakaznikov](https://github.com/vzakaznikov)). +* Automatically update DNS cache, which is used to check if user is allowed to connect from an address. [#11487](https://github.com/ClickHouse/ClickHouse/pull/11487) ([tavplubix](https://github.com/tavplubix)). +* OPTIMIZE FINAL will force merge even if concurrent merges are performed. This closes [#11309](https://github.com/ClickHouse/ClickHouse/issues/11309) and closes [#11322](https://github.com/ClickHouse/ClickHouse/issues/11322). [#11346](https://github.com/ClickHouse/ClickHouse/pull/11346) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Suppress output of cancelled queries in clickhouse-client. In previous versions result may continue to print in terminal even after you press Ctrl+C to cancel query. This closes [#9473](https://github.com/ClickHouse/ClickHouse/issues/9473). [#11342](https://github.com/ClickHouse/ClickHouse/pull/11342) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now history file is updated after each query and there is no race condition if multiple clients use one history file. This fixes [#9897](https://github.com/ClickHouse/ClickHouse/issues/9897). [#11453](https://github.com/ClickHouse/ClickHouse/pull/11453) ([Tagir Kuskarov](https://github.com/kuskarov)). +* Better log messages in while reloading configuration. [#11341](https://github.com/ClickHouse/ClickHouse/pull/11341) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trailing whitespaces from formatted queries in `clickhouse-client` or `clickhouse-format` in some cases. [#11325](https://github.com/ClickHouse/ClickHouse/pull/11325) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add setting "output_format_pretty_max_value_width". If value is longer, it will be cut to avoid output of too large values in terminal. This closes [#11140](https://github.com/ClickHouse/ClickHouse/issues/11140). [#11324](https://github.com/ClickHouse/ClickHouse/pull/11324) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better exception message in case when there is shortage of memory mappings. This closes [#11027](https://github.com/ClickHouse/ClickHouse/issues/11027). [#11316](https://github.com/ClickHouse/ClickHouse/pull/11316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support (U)Int8, (U)Int16, Date in ASOF JOIN. [#11301](https://github.com/ClickHouse/ClickHouse/pull/11301) ([Artem Zuikov](https://github.com/4ertus2)). +* Support kafka_client_id parameter for Kafka tables. It also changes the default `client.id` used by ClickHouse when communicating with Kafka to be more verbose and usable. [#11252](https://github.com/ClickHouse/ClickHouse/pull/11252) ([filimonov](https://github.com/filimonov)). +* Keep the value of `DistributedFilesToInsert` metric on exceptions. In previous versions, the value was set when we are going to send some files, but it is zero, if there was an exception and some files are still pending. Now it corresponds to the number of pending files in filesystem. [#11220](https://github.com/ClickHouse/ClickHouse/pull/11220) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for multi-word data type names (such as `DOUBLE PRECISION` and `CHAR VARYING`) for better SQL compatibility. [#11214](https://github.com/ClickHouse/ClickHouse/pull/11214) ([Павел Потемкин](https://github.com/Potya)). +* Provide synonyms for some data types. [#10856](https://github.com/ClickHouse/ClickHouse/pull/10856) ([Павел Потемкин](https://github.com/Potya)). +* The query log is now enabled by default. [#11184](https://github.com/ClickHouse/ClickHouse/pull/11184) ([Ivan Blinkov](https://github.com/blinkov)). +* Show authentication type in table system.users and while executing SHOW CREATE USER query. [#11080](https://github.com/ClickHouse/ClickHouse/pull/11080) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove data on explicit `DROP DATABASE` for `Memory` database engine. Fixes [#10557](https://github.com/ClickHouse/ClickHouse/issues/10557). [#11021](https://github.com/ClickHouse/ClickHouse/pull/11021) ([tavplubix](https://github.com/tavplubix)). +* Set thread names for internal threads of rdkafka library. Make logs from rdkafka available in server logs. [#10983](https://github.com/ClickHouse/ClickHouse/pull/10983) ([Azat Khuzhin](https://github.com/azat)). +* Support for unicode whitespaces in queries. This helps when queries are copy-pasted from Word or from web page. This fixes [#10896](https://github.com/ClickHouse/ClickHouse/issues/10896). [#10903](https://github.com/ClickHouse/ClickHouse/pull/10903) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow large UInt types as the index in function `tupleElement`. [#10874](https://github.com/ClickHouse/ClickHouse/pull/10874) ([hcz](https://github.com/hczhcz)). +* Respect prefer_localhost_replica/load_balancing on INSERT into Distributed. [#10867](https://github.com/ClickHouse/ClickHouse/pull/10867) ([Azat Khuzhin](https://github.com/azat)). +* Introduce `min_insert_block_size_rows_for_materialized_views`, `min_insert_block_size_bytes_for_materialized_views` settings. This settings are similar to `min_insert_block_size_rows` and `min_insert_block_size_bytes`, but applied only for blocks inserted into `MATERIALIZED VIEW`. It helps to control blocks squashing while pushing to MVs and avoid excessive memory usage. [#10858](https://github.com/ClickHouse/ClickHouse/pull/10858) ([Azat Khuzhin](https://github.com/azat)). +* Get rid of exception from replicated queue during server shutdown. Fixes [#10819](https://github.com/ClickHouse/ClickHouse/issues/10819). [#10841](https://github.com/ClickHouse/ClickHouse/pull/10841) ([alesapin](https://github.com/alesapin)). +* Ensure that `varSamp`, `varPop` cannot return negative results due to numerical errors and that `stddevSamp`, `stddevPop` cannot be calculated from negative variance. This fixes [#10532](https://github.com/ClickHouse/ClickHouse/issues/10532). [#10829](https://github.com/ClickHouse/ClickHouse/pull/10829) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better DNS exception message. This fixes [#10813](https://github.com/ClickHouse/ClickHouse/issues/10813). [#10828](https://github.com/ClickHouse/ClickHouse/pull/10828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Change HTTP response code in case of some parse errors to 400 Bad Request. This fix [#10636](https://github.com/ClickHouse/ClickHouse/issues/10636). [#10640](https://github.com/ClickHouse/ClickHouse/pull/10640) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Print a message if clickhouse-client is newer than clickhouse-server. [#10627](https://github.com/ClickHouse/ClickHouse/pull/10627) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adding support for `INSERT INTO [db.]table WATCH` query. [#10498](https://github.com/ClickHouse/ClickHouse/pull/10498) ([vzakaznikov](https://github.com/vzakaznikov)). +* Allow to pass quota_key in clickhouse-client. This closes [#10227](https://github.com/ClickHouse/ClickHouse/issues/10227). [#10270](https://github.com/ClickHouse/ClickHouse/pull/10270) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Allow multiple replicas to assign merges, mutations, partition drop, move and replace concurrently. This closes [#10367](https://github.com/ClickHouse/ClickHouse/issues/10367). [#11639](https://github.com/ClickHouse/ClickHouse/pull/11639) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#11795](https://github.com/ClickHouse/ClickHouse/pull/11795) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimization of GROUP BY with respect to table sorting key, enabled with `optimize_aggregation_in_order` setting. [#9113](https://github.com/ClickHouse/ClickHouse/pull/9113) ([dimarub2000](https://github.com/dimarub2000)). +* Selects with final are executed in parallel. Added setting `max_final_threads` to limit the number of threads used. [#10463](https://github.com/ClickHouse/ClickHouse/pull/10463) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve performance for INSERT queries via `INSERT SELECT` or INSERT with clickhouse-client when small blocks are generated (typical case with parallel parsing). This fixes [#11275](https://github.com/ClickHouse/ClickHouse/issues/11275). Fix the issue that CONSTRAINTs were not working for DEFAULT fields. This fixes [#11273](https://github.com/ClickHouse/ClickHouse/issues/11273). Fix the issue that CONSTRAINTS were ignored for TEMPORARY tables. This fixes [#11274](https://github.com/ClickHouse/ClickHouse/issues/11274). [#11276](https://github.com/ClickHouse/ClickHouse/pull/11276) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimization that eliminates min/max/any aggregators of GROUP BY keys in SELECT section, enabled with `optimize_aggregators_of_group_by_keys` setting. [#11667](https://github.com/ClickHouse/ClickHouse/pull/11667) ([xPoSx](https://github.com/xPoSx)). [#11806](https://github.com/ClickHouse/ClickHouse/pull/11806) ([Azat Khuzhin](https://github.com/azat)). +* New optimization that takes all operations out of `any` function, enabled with `optimize_move_functions_out_of_any` [#11529](https://github.com/ClickHouse/ClickHouse/pull/11529) ([Ruslan](https://github.com/kamalov-ruslan)). +* Improve performance of `clickhouse-client` in interactive mode when Pretty formats are used. In previous versions, significant amount of time can be spent calculating visible width of UTF-8 string. This closes [#11323](https://github.com/ClickHouse/ClickHouse/issues/11323). [#11323](https://github.com/ClickHouse/ClickHouse/pull/11323) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance for queries with `ORDER BY` and small `LIMIT` (less, then `max_block_size`). [#11171](https://github.com/ClickHouse/ClickHouse/pull/11171) ([Albert Kidrachev](https://github.com/Provet)). +* Add runtime CPU detection to select and dispatch the best function implementation. Add support for codegeneration for multiple targets. This closes [#1017](https://github.com/ClickHouse/ClickHouse/issues/1017). [#10058](https://github.com/ClickHouse/ClickHouse/pull/10058) ([DimasKovas](https://github.com/DimasKovas)). +* Enable `mlock` of clickhouse binary by default. It will prevent clickhouse executable from being paged out under high IO load. [#11139](https://github.com/ClickHouse/ClickHouse/pull/11139) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make queries with `sum` aggregate function and without GROUP BY keys to run multiple times faster. [#10992](https://github.com/ClickHouse/ClickHouse/pull/10992) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improving radix sort (used in `ORDER BY` with simple keys) by removing some redundant data moves. [#10981](https://github.com/ClickHouse/ClickHouse/pull/10981) ([Arslan Gumerov](https://github.com/g-arslan)). +* Sort bigger parts of the left table in MergeJoin. Buffer left blocks in memory. Add `partial_merge_join_left_table_buffer_bytes` setting to manage the left blocks buffers sizes. [#10601](https://github.com/ClickHouse/ClickHouse/pull/10601) ([Artem Zuikov](https://github.com/4ertus2)). +* Remove duplicate ORDER BY and DISTINCT from subqueries, this optimization is enabled with `optimize_duplicate_order_by_and_distinct` [#10067](https://github.com/ClickHouse/ClickHouse/pull/10067) ([Mikhail Malafeev](https://github.com/demo-99)). +* This feature eliminates functions of other keys in GROUP BY section, enabled with `optimize_group_by_function_keys` [#10051](https://github.com/ClickHouse/ClickHouse/pull/10051) ([xPoSx](https://github.com/xPoSx)). +* New optimization that takes arithmetic operations out of aggregate functions, enabled with `optimize_arithmetic_operations_in_aggregate_functions` [#10047](https://github.com/ClickHouse/ClickHouse/pull/10047) ([Ruslan](https://github.com/kamalov-ruslan)). +* Use HTTP client for S3 based on Poco instead of curl. This will improve performance and lower memory usage of s3 storage and table functions. [#11230](https://github.com/ClickHouse/ClickHouse/pull/11230) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix Kafka performance issue related to reschedules based on limits, which were always applied. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). +* Enable percpu_arena:percpu for jemalloc (This will reduce memory fragmentation due to thread pool). [#11084](https://github.com/ClickHouse/ClickHouse/pull/11084) ([Azat Khuzhin](https://github.com/azat)). +* Optimize memory usage when reading a response from an S3 HTTP client. [#11561](https://github.com/ClickHouse/ClickHouse/pull/11561) ([Pavel Kovalenko](https://github.com/Jokser)). +* Adjust the default Kafka settings for better performance. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). + +#### Experimental Feature + +* Add data type `Point` (Tuple(Float64, Float64)) and `Polygon` (Array(Array(Tuple(Float64, Float64))). [#10678](https://github.com/ClickHouse/ClickHouse/pull/10678) ([Alexey Ilyukhov](https://github.com/livace)). +* Add's a `hasSubstr` function that allows for look for subsequences in arrays. Note: this function is likely to be renamed without further notice. [#11071](https://github.com/ClickHouse/ClickHouse/pull/11071) ([Ryad Zenine](https://github.com/r-zenine)). +* Added OpenCL support and bitonic sort algorithm, which can be used for sorting integer types of data in single column. Needs to be build with flag `-DENABLE_OPENCL=1`. For using bitonic sort algorithm instead of others you need to set `bitonic_sort` for Setting's option `special_sort` and make sure that OpenCL is available. This feature does not improve performance or anything else, it is only provided as an example and for demonstration purposes. It is likely to be removed in near future if there will be no further development in this direction. [#10232](https://github.com/ClickHouse/ClickHouse/pull/10232) ([Ri](https://github.com/margaritiko)). + +#### Build/Testing/Packaging Improvement + +* Enable clang-tidy for programs and utils. [#10991](https://github.com/ClickHouse/ClickHouse/pull/10991) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove dependency on `tzdata`: do not fail if `/usr/share/zoneinfo` directory does not exist. Note that all timezones work in ClickHouse even without tzdata installed in system. [#11827](https://github.com/ClickHouse/ClickHouse/pull/11827) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added MSan and UBSan stress tests. Note that we already have MSan, UBSan for functional tests and "stress" test is another kind of tests. [#10871](https://github.com/ClickHouse/ClickHouse/pull/10871) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Print compiler build id in crash messages. It will make us slightly more certain about what binary has crashed. Added new function `buildId`. [#11824](https://github.com/ClickHouse/ClickHouse/pull/11824) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a test to ensure that mutations continue to work after FREEZE query. [#11820](https://github.com/ClickHouse/ClickHouse/pull/11820) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't allow tests with "fail" substring in their names because it makes looking at the tests results in browser less convenient when you type Ctrl+F and search for "fail". [#11817](https://github.com/ClickHouse/ClickHouse/pull/11817) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Removes unused imports from HTTPHandlerFactory. [#11660](https://github.com/ClickHouse/ClickHouse/pull/11660) ([Bharat Nallan](https://github.com/bharatnc)). +* Added a random sampling of instances where copier is executed. It is needed to avoid `Too many simultaneous queries` error. Also increased timeout and decreased fault probability. [#11573](https://github.com/ClickHouse/ClickHouse/pull/11573) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix missed include. [#11525](https://github.com/ClickHouse/ClickHouse/pull/11525) ([Matwey V. Kornilov](https://github.com/matwey)). +* Speed up build by removing old example programs. Also found some orphan functional test. [#11486](https://github.com/ClickHouse/ClickHouse/pull/11486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Increase ccache size for builds in CI. [#11450](https://github.com/ClickHouse/ClickHouse/pull/11450) ([alesapin](https://github.com/alesapin)). +* Leave only unit_tests_dbms in deb build. [#11429](https://github.com/ClickHouse/ClickHouse/pull/11429) ([Ilya Yatsishin](https://github.com/qoega)). +* Update librdkafka to version [1.4.2](https://github.com/edenhill/librdkafka/releases/tag/v1.4.2). [#11256](https://github.com/ClickHouse/ClickHouse/pull/11256) ([filimonov](https://github.com/filimonov)). +* Refactor CMake build files. [#11390](https://github.com/ClickHouse/ClickHouse/pull/11390) ([Ivan](https://github.com/abyss7)). +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). +* Add support for unit tests run with UBSan. [#11345](https://github.com/ClickHouse/ClickHouse/pull/11345) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove redundant timeout from integration test `test_insertion_sync_fails_with_timeout`. [#11343](https://github.com/ClickHouse/ClickHouse/pull/11343) ([alesapin](https://github.com/alesapin)). +* Better check for hung queries in clickhouse-test. [#11321](https://github.com/ClickHouse/ClickHouse/pull/11321) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Emit a warning if server was build in debug or with sanitizers. [#11304](https://github.com/ClickHouse/ClickHouse/pull/11304) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-test check the server aliveness before tests run. [#11285](https://github.com/ClickHouse/ClickHouse/pull/11285) ([alesapin](https://github.com/alesapin)). +* Fix potentially flacky test `00731_long_merge_tree_select_opened_files.sh`. It does not fail frequently but we have discovered potential race condition in this test while experimenting with ThreadFuzzer: [#9814](https://github.com/ClickHouse/ClickHouse/issues/9814) See [link](https://clickhouse-test-reports.s3.yandex.net/9814/40e3023e215df22985d275bf85f4d2290897b76b/functional_stateless_tests_(unbundled).html#fail1) for the example. [#11270](https://github.com/ClickHouse/ClickHouse/pull/11270) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Repeat test in CI if `curl` invocation was timed out. It is possible due to system hangups for 10+ seconds that are typical in our CI infrastructure. This fixes [#11267](https://github.com/ClickHouse/ClickHouse/issues/11267). [#11268](https://github.com/ClickHouse/ClickHouse/pull/11268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a test for Join table engine from @donmikel. This closes [#9158](https://github.com/ClickHouse/ClickHouse/issues/9158). [#11265](https://github.com/ClickHouse/ClickHouse/pull/11265) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix several non significant errors in unit tests. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). +* Now parts of linker command for `cctz` library will not be shuffled with other libraries. [#11213](https://github.com/ClickHouse/ClickHouse/pull/11213) ([alesapin](https://github.com/alesapin)). +* Split /programs/server into actual program and library. [#11186](https://github.com/ClickHouse/ClickHouse/pull/11186) ([Ivan](https://github.com/abyss7)). +* Improve build scripts for protobuf & gRPC. [#11172](https://github.com/ClickHouse/ClickHouse/pull/11172) ([Vitaly Baranov](https://github.com/vitlibar)). +* Enable performance test that was not working. [#11158](https://github.com/ClickHouse/ClickHouse/pull/11158) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Create root S3 bucket for tests before any CH instance is started. [#11142](https://github.com/ClickHouse/ClickHouse/pull/11142) ([Pavel Kovalenko](https://github.com/Jokser)). +* Add performance test for non-constant polygons. [#11141](https://github.com/ClickHouse/ClickHouse/pull/11141) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixing `00979_live_view_watch_continuous_aggregates` test. [#11024](https://github.com/ClickHouse/ClickHouse/pull/11024) ([vzakaznikov](https://github.com/vzakaznikov)). +* Add ability to run zookeeper in integration tests over tmpfs. [#11002](https://github.com/ClickHouse/ClickHouse/pull/11002) ([alesapin](https://github.com/alesapin)). +* Wait for odbc-bridge with exponential backoff. Previous wait time of 200 ms was not enough in our CI environment. [#10990](https://github.com/ClickHouse/ClickHouse/pull/10990) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix non-deterministic test. [#10989](https://github.com/ClickHouse/ClickHouse/pull/10989) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a test for empty external data. [#10926](https://github.com/ClickHouse/ClickHouse/pull/10926) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Database is recreated for every test. This improves separation of tests. [#10902](https://github.com/ClickHouse/ClickHouse/pull/10902) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added more asserts in columns code. [#10833](https://github.com/ClickHouse/ClickHouse/pull/10833) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better cooperation with sanitizers. Print information about query_id in the message of sanitizer failure. [#10832](https://github.com/ClickHouse/ClickHouse/pull/10832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix obvious race condition in "Split build smoke test" check. [#10820](https://github.com/ClickHouse/ClickHouse/pull/10820) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add MSan suppression for MariaDB Client library. [#10800](https://github.com/ClickHouse/ClickHouse/pull/10800) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* GRPC make couldn't find protobuf files, changed make file by adding the right link. [#10794](https://github.com/ClickHouse/ClickHouse/pull/10794) ([mnkonkova](https://github.com/mnkonkova)). +* Enable extra warnings (`-Weverything`) for base, utils, programs. Note that we already have it for the most of the code. [#10779](https://github.com/ClickHouse/ClickHouse/pull/10779) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Suppressions of warnings from libraries was mistakenly declared as public in [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396). [#10776](https://github.com/ClickHouse/ClickHouse/pull/10776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Restore a patch that was accidentially deleted in [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396). [#10774](https://github.com/ClickHouse/ClickHouse/pull/10774) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix performance tests errors, part 2. [#10773](https://github.com/ClickHouse/ClickHouse/pull/10773) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix performance test errors. [#10766](https://github.com/ClickHouse/ClickHouse/pull/10766) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update cross-builds to use clang-10 compiler. [#10724](https://github.com/ClickHouse/ClickHouse/pull/10724) ([Ivan](https://github.com/abyss7)). +* Update instruction to install RPM packages. This was suggested by Denis (TG login @ldviolet) and implemented by Arkady Shejn. [#10707](https://github.com/ClickHouse/ClickHouse/pull/10707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Trying to fix `tests/queries/0_stateless/01246_insert_into_watch_live_view.py` test. [#10670](https://github.com/ClickHouse/ClickHouse/pull/10670) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixing and re-enabling 00979_live_view_watch_continuous_aggregates.py test. [#10658](https://github.com/ClickHouse/ClickHouse/pull/10658) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix OOM in ASan stress test. [#10646](https://github.com/ClickHouse/ClickHouse/pull/10646) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report (adding zero to nullptr) in HashTable that appeared after migration to clang-10. [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove external call to `ld` (bfd) linker during tzdata processing in compile time. [#10634](https://github.com/ClickHouse/ClickHouse/pull/10634) ([alesapin](https://github.com/alesapin)). +* Allow to use `lld` to link blobs (resources). [#10632](https://github.com/ClickHouse/ClickHouse/pull/10632) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in `LZ4` library. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). See also [https://github.com/lz4/lz4/issues/857](https://github.com/lz4/lz4/issues/857) +* Update LZ4 to the latest dev branch. [#10630](https://github.com/ClickHouse/ClickHouse/pull/10630) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added auto-generated machine-readable file with the list of stable versions. [#10628](https://github.com/ClickHouse/ClickHouse/pull/10628) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `capnproto` version check for `capnp::UnalignedFlatArrayMessageReader`. [#10618](https://github.com/ClickHouse/ClickHouse/pull/10618) ([Matwey V. Kornilov](https://github.com/matwey)). +* Lower memory usage in tests. [#10617](https://github.com/ClickHouse/ClickHouse/pull/10617) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixing hard coded timeouts in new live view tests. [#10604](https://github.com/ClickHouse/ClickHouse/pull/10604) ([vzakaznikov](https://github.com/vzakaznikov)). +* Increasing timeout when opening a client in tests/queries/0_stateless/helpers/client.py. [#10599](https://github.com/ClickHouse/ClickHouse/pull/10599) ([vzakaznikov](https://github.com/vzakaznikov)). +* Enable ThinLTO for clang builds, continuation of [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435). [#10585](https://github.com/ClickHouse/ClickHouse/pull/10585) ([Amos Bird](https://github.com/amosbird)). +* Adding fuzzers and preparing for oss-fuzz integration. [#10546](https://github.com/ClickHouse/ClickHouse/pull/10546) ([kyprizel](https://github.com/kyprizel)). +* Fix FreeBSD build. [#10150](https://github.com/ClickHouse/ClickHouse/pull/10150) ([Ivan](https://github.com/abyss7)). +* Add new build for query tests using pytest framework. [#10039](https://github.com/ClickHouse/ClickHouse/pull/10039) ([Ivan](https://github.com/abyss7)). + + +## ClickHouse release v20.4 + +### ClickHouse release v20.4.8.99-stable 2020-08-10 + +#### Bug Fix + +* Fixed error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with NaN values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible extra overflow row in data which could appear for queries `WITH TOTALS`. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for `input_format_parallel_parsing` (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) allow push predicate when subquery contains with clause. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Removed data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed crash in JOIN with dictionary when we are joining over expression of dictionary key: `t JOIN dict ON expr(dict.id) = t.id`. Disable dictionary join optimisation for this case. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after TrieDictionary failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implemented conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Cap max_memory_usage* limits to the process resident memory. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `dictGet` arguments check during GROUP BY injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Don't split the dictionary source's table name into schema and table name itself if ODBC connection does not support schema. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Normalize "pid" file handling. In previous versions the server may refuse to start if it was killed without proper shutdown and if there is another process that has the same pid as previously runned server. Also pid file may be removed in unsuccessful server startup even if there is another server running. This fixes [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed handling dependency of table with ENGINE=Dictionary on dictionary. This fixes [#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). This fixes [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed empty `result_rows` and `result_bytes` metrics in `system.quey_log` for selects. Fixes [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Expected single dictionary argument for function` for function `defaultValueOfArgumentType` with `LowCardinality` type. Fixes [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parse tables metadata in parallel when loading database. This fixes slow server startup when there are large number of tables. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). +* Make `topK` aggregate function return Enum for Enum types. This fixes [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect comparison of tuples with `Nullable` columns. Fixes [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed calculation of access rights when allow_introspection_functions=0. [#12031](https://github.com/ClickHouse/ClickHouse/pull/12031) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* A query with function `neighbor` as the only returned expression may return empty result if the function is called with offset `-9223372036854775808`. This fixes [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed calculation of access rights when allow_ddl=0. [#12015](https://github.com/ClickHouse/ClickHouse/pull/12015) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed potential array size overflow in generateRandom that may lead to crash. This fixes [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception. This closes [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong setting name in log message at server startup. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Query parameter was not set` in `Values` format. Fixes [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). +* Keep aliases for substitutions in query (parametrized queries). This fixes [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug with no moves when changing storage policy from default one. [#11893](https://github.com/ClickHouse/ClickHouse/pull/11893) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed potential floating point exception when parsing `DateTime64`. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed memory accounting via HTTP interface (can be significant with `wait_end_of_query=1`). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + +#### Build/Testing/Packaging Improvement + +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + + +### ClickHouse release v20.4.6.53-stable 2020-06-25 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of comparison of FixedString with constant String. This fixes [#11393](https://github.com/ClickHouse/ClickHouse/issues/11393). This bug appeared in version 20.4. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare segfault in `SHOW CREATE TABLE` Fixes [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix race condition which may lead to an exception during table drop. It's a bit tricky and not dangerous at all. If you want an explanation, just notice me in telegram. [#11523](https://github.com/ClickHouse/ClickHouse/pull/11523) ([alesapin](https://github.com/alesapin)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Get rid of old libunwind patches. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 This allows to disable `-fno-omit-frame-pointer` in `clang` builds that improves performance at least by 1% in average. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Fix several non significant errors in unit tests. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.4.5.36-stable 2020-06-10 + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fix potential uninitialized memory read in MergeTree shutdown if table was not created successfully. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential segfault when using `Lazy` database. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix insignificant data race in clickhouse-copier. Found by integration tests. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when SET DEFAULT ROLE is called with wrong arguments. This fixes [#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when cache-dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed S3 globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix Kafka performance issue related to reschedules based on limits, which were always applied. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement + +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). + +### ClickHouse release v20.4.4.18-stable 2020-05-26 + +No changes compared to v20.4.3.16-stable. + +### ClickHouse release v20.4.3.16-stable 2020-05-23 + +#### Bug Fix + +* Removed logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed memory leak in registerDiskS3. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed the potential missed data during termination of Kafka engine table. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). +* Fixed `parseDateTime64BestEffort` argument resolution bugs. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed very rare potential use-after-free error in `MergeTree` if table was not created successfully. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986), [#10970](https://github.com/ClickHouse/ClickHouse/pull/10970) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed metadata (relative path for rename) and data (relative path for symlink) handling for Atomic database. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). +* Fixed server crash on concurrent `ALTER` and `DROP DATABASE` queries with `Atomic` database engine. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect raw data size in `getRawData()` method. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed sending partially written files by the `DistributedBlockOutputStream`. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). +* Fixed crash in `SELECT count(notNullIn(NULL, []))`. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the hang which was happening sometimes during `DROP` of `Kafka` table engine. (or during server restarts). [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). +* Fixed the impossibility of executing multiple `ALTER RENAME` like `a TO b, c TO a`. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). +* Fixed possible race which could happen when you get result from aggregate function state from multiple thread for the same column. The only way it can happen is when you use `finalizeAggregation` function while reading from table with `Memory` engine which stores `AggregateFunction` state for `quantile*` function. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `SIGSEGV` in `StringHashTable` if such a key does not exist. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `WATCH` hangs after `LiveView` table was dropped from database with `Atomic` engine. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Now constraints are updated if the column participating in `CONSTRAINT` expression was renamed. Fixes [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). +* Fixed potential read of uninitialized memory in cache-dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed columns order after `Block::sortColumns()`. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue with `ODBC` bridge when no quoting of identifiers is requested. Fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `UBSan` and `MSan` report in `DateLUT`. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fixed `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed combinator `-OrNull` and `-OrDefault` when combined with `-State`. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fixed possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fixed `nullptr` dereference in `StorageBuffer` if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `optimize_skip_unused_shards` with `LowCardinality`. [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). +* Fixed handling condition variable for synchronous mutations. In some cases signals to that condition variable could be lost. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed possible crash when `createDictionary()` is called before `loadStoredObject()` has finished. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `SELECT` of column `ALIAS` which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Disable `GROUP BY` sharding_key optimization by default (`optimize_distributed_group_by_sharding_key` had been introduced and turned of by default, due to trickery of sharding_key analyzing, simple example is `if` in sharding key) and fix it for `WITH ROLLUP/CUBE/TOTALS`. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). +* Added tests about `max_rows_to_sort` setting. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added backward compatibility for create bloom filter index. [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). + +### ClickHouse release v20.4.2.9, 2020-05-12 + +#### Backward Incompatible Change +* System tables (e.g. system.query_log, system.trace_log, system.metric_log) are using compact data part format for parts smaller than 10 MiB in size. Compact data part format is supported since version 20.3. If you are going to downgrade to version less than 20.3, you should manually delete table data for system logs in `/var/lib/clickhouse/data/system/`. +* When string comparison involves FixedString and compared arguments are of different sizes, do comparison as if smaller string is padded to the length of the larger. This is intented for SQL compatibility if we imagine that FixedString data type corresponds to SQL CHAR. This closes [#9272](https://github.com/ClickHouse/ClickHouse/issues/9272). [#10363](https://github.com/ClickHouse/ClickHouse/pull/10363) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make SHOW CREATE TABLE multiline. Now it is more readable and more like MySQL. [#10049](https://github.com/ClickHouse/ClickHouse/pull/10049) ([Azat Khuzhin](https://github.com/azat)) +* Added a setting `validate_polygons` that is used in `pointInPolygon` function and enabled by default. [#9857](https://github.com/ClickHouse/ClickHouse/pull/9857) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### New Feature +* Add support for secured connection from ClickHouse to Zookeeper [#10184](https://github.com/ClickHouse/ClickHouse/pull/10184) ([Konstantin Lebedev](https://github.com/xzkostyan)) +* Support custom HTTP handlers. See [#5436](https://github.com/ClickHouse/ClickHouse/issues/5436) for description. [#7572](https://github.com/ClickHouse/ClickHouse/pull/7572) ([Winter Zhang](https://github.com/zhang2014)) +* Add MessagePack Input/Output format. [#9889](https://github.com/ClickHouse/ClickHouse/pull/9889) ([Kruglov Pavel](https://github.com/Avogar)) +* Add Regexp input format. [#9196](https://github.com/ClickHouse/ClickHouse/pull/9196) ([Kruglov Pavel](https://github.com/Avogar)) +* Added output format `Markdown` for embedding tables in markdown documents. [#10317](https://github.com/ClickHouse/ClickHouse/pull/10317) ([Kruglov Pavel](https://github.com/Avogar)) +* Added support for custom settings section in dictionaries. Also fixes issue [#2829](https://github.com/ClickHouse/ClickHouse/issues/2829). [#10137](https://github.com/ClickHouse/ClickHouse/pull/10137) ([Artem Streltsov](https://github.com/kekekekule)) +* Added custom settings support in DDL-queries for `CREATE DICTIONARY` [#10465](https://github.com/ClickHouse/ClickHouse/pull/10465) ([Artem Streltsov](https://github.com/kekekekule)) +* Add simple server-wide memory profiler that will collect allocation contexts when server memory usage becomes higher than the next allocation threshold. [#10444](https://github.com/ClickHouse/ClickHouse/pull/10444) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add setting `always_fetch_merged_part` which restrict replica to merge parts by itself and always prefer dowloading from other replicas. [#10379](https://github.com/ClickHouse/ClickHouse/pull/10379) ([alesapin](https://github.com/alesapin)) +* Add function `JSONExtractKeysAndValuesRaw` which extracts raw data from JSON objects [#10378](https://github.com/ClickHouse/ClickHouse/pull/10378) ([hcz](https://github.com/hczhcz)) +* Add memory usage from OS to `system.asynchronous_metrics`. [#10361](https://github.com/ClickHouse/ClickHouse/pull/10361) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added generic variants for functions `least` and `greatest`. Now they work with arbitrary number of arguments of arbitrary types. This fixes [#4767](https://github.com/ClickHouse/ClickHouse/issues/4767) [#10318](https://github.com/ClickHouse/ClickHouse/pull/10318) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now ClickHouse controls timeouts of dictionary sources on its side. Two new settings added to cache dictionary configuration: `strict_max_lifetime_seconds`, which is `max_lifetime` by default, and `query_wait_timeout_milliseconds`, which is one minute by default. The first settings is also useful with `allow_read_expired_keys` settings (to forbid reading very expired keys). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add log_queries_min_type to filter which entries will be written to query_log [#10053](https://github.com/ClickHouse/ClickHouse/pull/10053) ([Azat Khuzhin](https://github.com/azat)) +* Added function `isConstant`. This function checks whether its argument is constant expression and returns 1 or 0. It is intended for development, debugging and demonstration purposes. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* add joinGetOrNull to return NULL when key is missing instead of returning the default value. [#10094](https://github.com/ClickHouse/ClickHouse/pull/10094) ([Amos Bird](https://github.com/amosbird)) +* Consider `NULL` to be equal to `NULL` in `IN` operator, if the option `transform_null_in` is set. [#10085](https://github.com/ClickHouse/ClickHouse/pull/10085) ([achimbab](https://github.com/achimbab)) +* Add `ALTER TABLE ... RENAME COLUMN` for MergeTree table engines family. [#9948](https://github.com/ClickHouse/ClickHouse/pull/9948) ([alesapin](https://github.com/alesapin)) +* Support parallel distributed INSERT SELECT. [#9759](https://github.com/ClickHouse/ClickHouse/pull/9759) ([vxider](https://github.com/Vxider)) +* Add ability to query Distributed over Distributed (w/o `distributed_group_by_no_merge`) ... [#9923](https://github.com/ClickHouse/ClickHouse/pull/9923) ([Azat Khuzhin](https://github.com/azat)) +* Add function `arrayReduceInRanges` which aggregates array elements in given ranges. [#9598](https://github.com/ClickHouse/ClickHouse/pull/9598) ([hcz](https://github.com/hczhcz)) +* Add Dictionary Status on prometheus exporter. [#9622](https://github.com/ClickHouse/ClickHouse/pull/9622) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Add function `arrayAUC` [#8698](https://github.com/ClickHouse/ClickHouse/pull/8698) ([taiyang-li](https://github.com/taiyang-li)) +* Support `DROP VIEW` statement for better TPC-H compatibility. [#9831](https://github.com/ClickHouse/ClickHouse/pull/9831) ([Amos Bird](https://github.com/amosbird)) +* Add 'strict_order' option to windowFunnel() [#9773](https://github.com/ClickHouse/ClickHouse/pull/9773) ([achimbab](https://github.com/achimbab)) +* Support `DATE` and `TIMESTAMP` SQL operators, e.g. `SELECT date '2001-01-01'` [#9691](https://github.com/ClickHouse/ClickHouse/pull/9691) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Experimental Feature +* Added experimental database engine Atomic. It supports non-blocking `DROP` and `RENAME TABLE` queries and atomic `EXCHANGE TABLES t1 AND t2` query [#7512](https://github.com/ClickHouse/ClickHouse/pull/7512) ([tavplubix](https://github.com/tavplubix)) +* Initial support for ReplicatedMergeTree over S3 (it works in suboptimal way) [#10126](https://github.com/ClickHouse/ClickHouse/pull/10126) ([Pavel Kovalenko](https://github.com/Jokser)) + +#### Bug Fix +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed bug, which caused HTTP requests to get stuck on client closing connection when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)) +* Fix segfault in StorageBuffer when exception is thrown on server startup. Fixes [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550) [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)) +* The query`SYSTEM DROP DNS CACHE` now also drops caches used to check if user is allowed to connect from some IP addresses [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)) +* Fix usage of multiple `IN` operators with an identical set in one query. Fixes [#10539](https://github.com/ClickHouse/ClickHouse/issues/10539) [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)) +* Fix crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix logic for aggregation_memory_efficient_merge_threads setting. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)) +* Fix disappearing totals. Totals could have being filtered if query had `JOIN` or subquery with external `WHERE` condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674) [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655) [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709) [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix index corruption, which may occur in some cases after merging compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)) +* Fix the situation, when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)) +* Fix overflow at beginning of unix epoch for timezones with fractional offset from UTC. Fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better diagnostics for input formats. Fixes [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204) [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)) +* Fix numeric overflow in `simpleLinearRegression()` over large integers [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)) +* Fix use-after-free in Distributed shutdown, avoid waiting for sending all batches [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)) +* Add CA certificates to clickhouse-server docker image [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)) +* Fix a rare endless loop that might have occurred when using the `addressToLine` function or AggregateFunctionState columns. [#10466](https://github.com/ClickHouse/ClickHouse/pull/10466) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Handle zookeeper "no node error" during distributed query [#10050](https://github.com/ClickHouse/ClickHouse/pull/10050) ([Daniel Chen](https://github.com/Phantomape)) +* Fix bug when server cannot attach table after column's default was altered. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) +* Implicitly cast the default expression type to the column type for the ALIAS columns [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)) +* Don't remove metadata directory if `ATTACH DATABASE` fails [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) +* Avoid dependency on system tzdata. Fixes loading of `Africa/Casablanca` timezone on CentOS 8. Fixes [#10211](https://github.com/ClickHouse/ClickHouse/issues/10211) [#10425](https://github.com/ClickHouse/ClickHouse/pull/10425) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix some issues if data is inserted with quorum and then gets deleted (DROP PARTITION, TTL, etc.). It led to stuck of INSERTs or false-positive exceptions in SELECTs. Fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Check the number and type of arguments when creating BloomFilter index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`, otherwise when both settings specified and there are no up-to-date replicas the query will fail (patch from @alex-zaitsev ) [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) +* Fix the issue when a query with ARRAY JOIN, ORDER BY and LIMIT may return incomplete result. Fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([Vadim Plakhtinskiy](https://github.com/VadimPlh)) +* Add database name to dictionary name after DETACH/ATTACH. Fixes system.dictionaries table and `SYSTEM RELOAD` query [#10415](https://github.com/ClickHouse/ClickHouse/pull/10415) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible incorrect result for extremes in processors pipeline. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix possible segfault when the setting `distributed_group_by_no_merge` is enabled (introduced in 20.3.7.46 by [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131)). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix wrong flattening of `Array(Tuple(...))` data types. Fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN [#9950](https://github.com/ClickHouse/ClickHouse/pull/9950) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix order of columns after Block::sortColumns() [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible `Pipeline stuck` error in `ConcatProcessor` which may happen in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Don't make disk reservations for aggregations. Fixes [#9241](https://github.com/ClickHouse/ClickHouse/issues/9241) [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) +* Fix wrong behaviour of datetime functions for timezones that has altered between positive and negative offsets from UTC (e.g. Pacific/Kiritimati). Fixes [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid infinite loop in `dictIsIn` function. Fixes #515 [#10365](https://github.com/ClickHouse/ClickHouse/pull/10365) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Disable GROUP BY sharding_key optimization by default and fix it for WITH ROLLUP/CUBE/TOTALS [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)) +* Check for error code when checking parts and don't mark part as broken if the error is like "not enough memory". Fixes [#6269](https://github.com/ClickHouse/ClickHouse/issues/6269) [#10364](https://github.com/ClickHouse/ClickHouse/pull/10364) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Show information about not loaded dictionaries in system tables. [#10234](https://github.com/ClickHouse/ClickHouse/pull/10234) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix nullptr dereference in StorageBuffer if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed `DROP` vs `OPTIMIZE` race in `ReplicatedMergeTree`. `DROP` could left some garbage in replica path in ZooKeeper if there was concurrent `OPTIMIZE` query. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) +* Fix 'Logical error: CROSS JOIN has expressions' error for queries with comma and names joins mix. Fixes [#9910](https://github.com/ClickHouse/ClickHouse/issues/9910) [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix queries with `max_bytes_before_external_group_by`. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix the issue with limiting maximum recursion depth in parser in certain cases. This fixes [#10283](https://github.com/ClickHouse/ClickHouse/issues/10283) This fix may introduce minor incompatibility: long and deep queries via clickhouse-client may refuse to work, and you should adjust settings `max_query_size` and `max_parser_depth` accordingly. [#10295](https://github.com/ClickHouse/ClickHouse/pull/10295) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to use `count(*)` with multiple JOINs. Fixes [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix 'Cannot add column' error while creating `range_hashed` dictionary using DDL query. Fixes [#10093](https://github.com/ClickHouse/ClickHouse/issues/10093). [#10235](https://github.com/ClickHouse/ClickHouse/pull/10235) ([alesapin](https://github.com/alesapin)) +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed bug where ClickHouse would throw "Unknown function lambda." error message when user tries to run ALTER UPDATE/DELETE on tables with ENGINE = Replicated*. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)) +* Fixed reasonably rare segfault in StorageSystemTables that happens when SELECT ... FROM system.tables is run on a database with Lazy engine. [#10209](https://github.com/ClickHouse/ClickHouse/pull/10209) ([Alexander Kazakov](https://github.com/Akazz)) +* Fix possible infinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed "generateRandom" function for Date type. This fixes [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). Fix an edge case when dates with year 2106 are inserted to MergeTree tables with old-style partitioning but partitions are named with year 1970. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Convert types if the table definition of a View does not correspond to the SELECT query. This fixes [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022) [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082) [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix move-to-prewhere optimization in presense of arrayJoin functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092) [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix issue with separator appearing in SCRAMBLE for native mysql-connector-java (JDBC) [#10140](https://github.com/ClickHouse/ClickHouse/pull/10140) ([BohuTANG](https://github.com/BohuTANG)) +* Fix using the current database for an access checking when the database isn't specified. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix ALTER of tables with compact parts. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)) +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)) +* Fix `DROP TABLE` invoked for dictionary [#10165](https://github.com/ClickHouse/ClickHouse/pull/10165) ([Azat Khuzhin](https://github.com/azat)) +* Convert blocks if structure does not match when doing `INSERT` into Distributed table [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)) +* The number of rows was logged incorrectly (as sum across all parts) when inserted block is split by parts with partition key. [#10138](https://github.com/ClickHouse/ClickHouse/pull/10138) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add some arguments check and support identifier arguments for MySQL Database Engine [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)) +* Fix incorrect `index_granularity_bytes` check while creating new replica. Fixes [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)) +* Fix bug in `CHECK TABLE` query when table contain skip indices. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)) +* Fix Distributed-over-Distributed with the only one shard in a nested table [#9997](https://github.com/ClickHouse/ClickHouse/pull/9997) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). ... [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix bug in dictionary when local clickhouse server is used as source. It may caused memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)) +* Fixed replicated tables startup when updating from an old ClickHouse version where `/table/replicas/replica_name/metadata` node does not exist. Fixes [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)) +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with mixed single and two-level aggregation from different shards. [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix deadlock when database with materialized view failed attach at start [#10054](https://github.com/ClickHouse/ClickHouse/pull/10054) ([Azat Khuzhin](https://github.com/azat)) +* Fix a segmentation fault that could occur in GROUP BY over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). ... [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix wrong results of distributed queries when alias could override qualified column name. Fixes [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714) [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible deadlock in `SYSTEM RESTART REPLICAS` [#9955](https://github.com/ClickHouse/ClickHouse/pull/9955) ([tavplubix](https://github.com/tavplubix)) +* Fix the number of threads used for remote query execution (performance regression, since 20.3). This happened when query from `Distributed` table was executed simultaneously on local and remote shards. Fixes [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965) [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed `DeleteOnDestroy` logic in `ATTACH PART` which could lead to automatic removal of attached part and added few tests [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)) +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)) +* Fix 'Not found column in block' error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839) [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix parsing multiple hosts set in the CREATE USER command [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)) +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)) +* Fix `DISTINCT` for Distributed when `optimize_skip_unused_shards` is set. [#9808](https://github.com/ClickHouse/ClickHouse/pull/9808) ([Azat Khuzhin](https://github.com/azat)) +* Fix "scalar does not exist" error in ALTERs ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). ... [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)) +* Fix error with qualified names in `distributed_product_mode=\'local\'`. Fixes [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756) [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)) +* For INSERT queries shards now do clamp the settings from the initiator to their constraints instead of throwing an exception. This fix allows to send INSERT queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add some retries when commiting offsets to Kafka broker, since it can reject commit if during `offsets.commit.timeout.ms` there were no enough replicas available for the `__consumer_offsets` topic [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)) +* Fix Distributed engine behavior when virtual columns of the underlying table used in `WHERE` [#9847](https://github.com/ClickHouse/ClickHouse/pull/9847) ([Azat Khuzhin](https://github.com/azat)) +* Fixed some 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)) +* 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 calculating grants for introspection functions from the setting `allow_introspection_functions`. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix max_distributed_connections (w/ and w/o Processors) [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)) +* 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 '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 server crashing when `optimize_skip_unused_shards` is set and expression for key can't be converted to its field type [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)) +* Fix empty string handling in `splitByString`. [#9767](https://github.com/ClickHouse/ClickHouse/pull/9767) ([hcz](https://github.com/hczhcz)) +* Fix broken `ALTER TABLE DELETE COLUMN` query for compact parts. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)) +* Fixed missing `rows_before_limit_at_least` for queries over http (with processors pipeline). Fixes [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730) [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix excessive memory consumption in `ALTER` queries (mutations). This fixes [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) +* Fix possible permanent "Cannot schedule a task" error. [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) +* Fix bug in backquoting in external dictionaries DDL. Fixes [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) +* Fixed data race in `text_log`. It does not correspond to any real bug. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix bug in a replication that does not allow replication to work if the user has executed mutations on the previous version. This fixes [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)) +* Fixed incorrect internal function names for `sumKahan` and `sumWithOverflow`. It led to exception while using this functions in remote queries. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)) +* Add setting `use_compact_format_in_distributed_parts_names` which allows to write files for `INSERT` queries into `Distributed` table with more compact format. This fixes [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)) +* Fix RIGHT and FULL JOIN with LowCardinality in JOIN keys. [#9610](https://github.com/ClickHouse/ClickHouse/pull/9610) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible exceptions `Size of filter does not match size of column` and `Invalid number of rows in Chunk` in `MergeTreeRangeReader`. They could appear while executing `PREWHERE` in some cases. [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +* Allow `ALTER ON CLUSTER` of Distributed tables with internal replication. This fixes [#3268](https://github.com/ClickHouse/ClickHouse/issues/3268) [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)) +* Fix issue when timezone was not preserved if you write a simple arithmetic expression like `time + 1` (in contrast to an expression like `time + INTERVAL 1 SECOND`). This fixes [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743) [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement +* Use time zone when comparing DateTime with string literal. This fixes [#5206](https://github.com/ClickHouse/ClickHouse/issues/5206). [#10515](https://github.com/ClickHouse/ClickHouse/pull/10515) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Print verbose diagnostic info if Decimal value cannot be parsed from text input format. [#10205](https://github.com/ClickHouse/ClickHouse/pull/10205) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add tasks/memory metrics for distributed/buffer schedule pools [#10449](https://github.com/ClickHouse/ClickHouse/pull/10449) ([Azat Khuzhin](https://github.com/azat)) +* Display result as soon as it's ready for SELECT DISTINCT queries in clickhouse-local and HTTP interface. This fixes [#8951](https://github.com/ClickHouse/ClickHouse/issues/8951) [#9559](https://github.com/ClickHouse/ClickHouse/pull/9559) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to use `SAMPLE OFFSET` query instead of `cityHash64(PRIMARY KEY) % N == n` for splitting in `clickhouse-copier`. To use this feature, pass `--experimental-use-sample-offset 1` as a command line argument. [#10414](https://github.com/ClickHouse/ClickHouse/pull/10414) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Allow to parse BOM in TSV if the first column cannot contain BOM in its value. This fixes [#10301](https://github.com/ClickHouse/ClickHouse/issues/10301) [#10424](https://github.com/ClickHouse/ClickHouse/pull/10424) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add Avro nested fields insert support [#10354](https://github.com/ClickHouse/ClickHouse/pull/10354) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Allowed to alter column in non-modifying data mode when the same type is specified. [#10382](https://github.com/ClickHouse/ClickHouse/pull/10382) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Auto `distributed_group_by_no_merge` on GROUP BY sharding key (if `optimize_skip_unused_shards` is set) [#10341](https://github.com/ClickHouse/ClickHouse/pull/10341) ([Azat Khuzhin](https://github.com/azat)) +* Optimize queries with LIMIT/LIMIT BY/ORDER BY for distributed with GROUP BY sharding_key [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)) +* Added a setting `max_server_memory_usage` to limit total memory usage of the server. The metric `MemoryTracking` is now calculated without a drift. The setting `max_memory_usage_for_all_queries` is now obsolete and does nothing. This closes [#10293](https://github.com/ClickHouse/ClickHouse/issues/10293). [#10362](https://github.com/ClickHouse/ClickHouse/pull/10362) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add config option `system_tables_lazy_load`. If it's set to false, then system tables with logs are loaded at the server startup. [Alexander Burmak](https://github.com/Alex-Burmak), [Svyatoslav Tkhon Il Pak](https://github.com/DeifyTheGod), [#9642](https://github.com/ClickHouse/ClickHouse/pull/9642) [#10359](https://github.com/ClickHouse/ClickHouse/pull/10359) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Use background thread pool (background_schedule_pool_size) for distributed sends [#10263](https://github.com/ClickHouse/ClickHouse/pull/10263) ([Azat Khuzhin](https://github.com/azat)) +* Use background thread pool for background buffer flushes. [#10315](https://github.com/ClickHouse/ClickHouse/pull/10315) ([Azat Khuzhin](https://github.com/azat)) +* Support for one special case of removing incompletely written parts. This fixes [#9940](https://github.com/ClickHouse/ClickHouse/issues/9940). [#10221](https://github.com/ClickHouse/ClickHouse/pull/10221) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Use isInjective() over manual list of such functions for GROUP BY optimization. [#10342](https://github.com/ClickHouse/ClickHouse/pull/10342) ([Azat Khuzhin](https://github.com/azat)) +* Avoid printing error message in log if client sends RST packet immediately on connect. It is typical behaviour of IPVS balancer with keepalived and VRRP. This fixes [#1851](https://github.com/ClickHouse/ClickHouse/issues/1851) [#10274](https://github.com/ClickHouse/ClickHouse/pull/10274) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to parse `+inf` for floating point types. This closes [#1839](https://github.com/ClickHouse/ClickHouse/issues/1839) [#10272](https://github.com/ClickHouse/ClickHouse/pull/10272) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Implemented `generateRandom` table function for Nested types. This closes [#9903](https://github.com/ClickHouse/ClickHouse/issues/9903) [#10219](https://github.com/ClickHouse/ClickHouse/pull/10219) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Provide `max_allowed_packed` in MySQL compatibility interface that will help some clients to communicate with ClickHouse via MySQL protocol. [#10199](https://github.com/ClickHouse/ClickHouse/pull/10199) ([BohuTANG](https://github.com/BohuTANG)) +* Allow literals for GLOBAL IN (i.e. `SELECT * FROM remote('localhost', system.one) WHERE dummy global in (0)`) [#10196](https://github.com/ClickHouse/ClickHouse/pull/10196) ([Azat Khuzhin](https://github.com/azat)) +* Fix various small issues in interactive mode of clickhouse-client [#10194](https://github.com/ClickHouse/ClickHouse/pull/10194) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid superfluous dictionaries load (system.tables, DROP/SHOW CREATE TABLE) [#10164](https://github.com/ClickHouse/ClickHouse/pull/10164) ([Azat Khuzhin](https://github.com/azat)) +* Update to RWLock: timeout parameter for getLock() + implementation reworked to be phase fair [#10073](https://github.com/ClickHouse/ClickHouse/pull/10073) ([Alexander Kazakov](https://github.com/Akazz)) +* Enhanced compatibility with native mysql-connector-java(JDBC) [#10021](https://github.com/ClickHouse/ClickHouse/pull/10021) ([BohuTANG](https://github.com/BohuTANG)) +* The function `toString` is considered monotonic and can be used for index analysis even when applied in tautological cases with String or LowCardinality(String) argument. [#10110](https://github.com/ClickHouse/ClickHouse/pull/10110) ([Amos Bird](https://github.com/amosbird)) +* Add `ON CLUSTER` clause support to commands `{CREATE|DROP} USER/ROLE/ROW POLICY/SETTINGS PROFILE/QUOTA`, `GRANT`. [#9811](https://github.com/ClickHouse/ClickHouse/pull/9811) ([Vitaly Baranov](https://github.com/vitlibar)) +* Virtual hosted-style support for S3 URI [#9998](https://github.com/ClickHouse/ClickHouse/pull/9998) ([Pavel Kovalenko](https://github.com/Jokser)) +* Now layout type for dictionaries with no arguments can be specified without round brackets in dictionaries DDL-queries. Fixes [#10057](https://github.com/ClickHouse/ClickHouse/issues/10057). [#10064](https://github.com/ClickHouse/ClickHouse/pull/10064) ([alesapin](https://github.com/alesapin)) +* Add ability to use number ranges with leading zeros in filepath [#9989](https://github.com/ClickHouse/ClickHouse/pull/9989) ([Olga Khvostikova](https://github.com/stavrolia)) +* Better memory usage in CROSS JOIN. [#10029](https://github.com/ClickHouse/ClickHouse/pull/10029) ([Artem Zuikov](https://github.com/4ertus2)) +* Try to connect to all shards in cluster when getting structure of remote table and skip_unavailable_shards is set. [#7278](https://github.com/ClickHouse/ClickHouse/pull/7278) ([nvartolomei](https://github.com/nvartolomei)) +* Add `total_rows`/`total_bytes` into the `system.tables` table. [#9919](https://github.com/ClickHouse/ClickHouse/pull/9919) ([Azat Khuzhin](https://github.com/azat)) +* System log tables now use polymorpic parts by default. [#9905](https://github.com/ClickHouse/ClickHouse/pull/9905) ([Anton Popov](https://github.com/CurtizJ)) +* Add type column into system.settings/merge_tree_settings [#9909](https://github.com/ClickHouse/ClickHouse/pull/9909) ([Azat Khuzhin](https://github.com/azat)) +* Check for available CPU instructions at server startup as early as possible. [#9888](https://github.com/ClickHouse/ClickHouse/pull/9888) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `ORDER BY` stage from mutations because we read from a single ordered part in a single thread. Also add check that the rows in mutation are ordered by sorting key and this order is not violated. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)) +* Implement operator LIKE for FixedString at left hand side. This is needed to better support TPC-DS queries. [#9890](https://github.com/ClickHouse/ClickHouse/pull/9890) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `force_optimize_skip_unused_shards_no_nested` that will disable `force_optimize_skip_unused_shards` for nested Distributed table [#9812](https://github.com/ClickHouse/ClickHouse/pull/9812) ([Azat Khuzhin](https://github.com/azat)) +* Now columns size is calculated only once for MergeTree data parts. [#9827](https://github.com/ClickHouse/ClickHouse/pull/9827) ([alesapin](https://github.com/alesapin)) +* Evaluate constant expressions for `optimize_skip_unused_shards` (i.e. `SELECT * FROM foo_dist WHERE key=xxHash32(0)`) [#8846](https://github.com/ClickHouse/ClickHouse/pull/8846) ([Azat Khuzhin](https://github.com/azat)) +* Check for using `Date` or `DateTime` column from TTL expressions was removed. [#9967](https://github.com/ClickHouse/ClickHouse/pull/9967) ([Vladimir Chebotarev](https://github.com/excitoon)) +* DiskS3 hard links optimal implementation. [#9760](https://github.com/ClickHouse/ClickHouse/pull/9760) ([Pavel Kovalenko](https://github.com/Jokser)) +* If `set multiple_joins_rewriter_version = 2` enables second version of multiple JOIN rewrites that keeps not clashed column names as is. It supports multiple JOINs with `USING` and allow `select *` for JOINs with subqueries. [#9739](https://github.com/ClickHouse/ClickHouse/pull/9739) ([Artem Zuikov](https://github.com/4ertus2)) +* Implementation of "non-blocking" alter for StorageMergeTree [#9606](https://github.com/ClickHouse/ClickHouse/pull/9606) ([alesapin](https://github.com/alesapin)) +* Add MergeTree full support for DiskS3 [#9646](https://github.com/ClickHouse/ClickHouse/pull/9646) ([Pavel Kovalenko](https://github.com/Jokser)) +* Extend `splitByString` to support empty strings as separators. [#9742](https://github.com/ClickHouse/ClickHouse/pull/9742) ([hcz](https://github.com/hczhcz)) +* Add a `timestamp_ns` column to `system.trace_log`. It contains a high-definition timestamp of the trace event, and allows to build timelines of thread profiles ("flame charts"). [#9696](https://github.com/ClickHouse/ClickHouse/pull/9696) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* When the setting `send_logs_level` is enabled, avoid intermixing of log messages and query progress. [#9634](https://github.com/ClickHouse/ClickHouse/pull/9634) ([Azat Khuzhin](https://github.com/azat)) +* Added support of `MATERIALIZE TTL IN PARTITION`. [#9581](https://github.com/ClickHouse/ClickHouse/pull/9581) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Support complex types inside Avro nested fields [#10502](https://github.com/ClickHouse/ClickHouse/pull/10502) ([Andrew Onyshchuk](https://github.com/oandrew)) + +#### Performance Improvement +* Better insert logic for right table for Partial MergeJoin. [#10467](https://github.com/ClickHouse/ClickHouse/pull/10467) ([Artem Zuikov](https://github.com/4ertus2)) +* Improved performance of row-oriented formats (more than 10% for CSV and more than 35% for Avro in case of narrow tables). [#10503](https://github.com/ClickHouse/ClickHouse/pull/10503) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Improved performance of queries with explicitly defined sets at right side of IN operator and tuples on the left side. [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) +* Use less memory for hash table in HashJoin. [#10416](https://github.com/ClickHouse/ClickHouse/pull/10416) ([Artem Zuikov](https://github.com/4ertus2)) +* Special HashJoin over StorageDictionary. Allow rewrite `dictGet()` functions with JOINs. It's not backward incompatible itself but could uncover [#8400](https://github.com/ClickHouse/ClickHouse/issues/8400) on some installations. [#10133](https://github.com/ClickHouse/ClickHouse/pull/10133) ([Artem Zuikov](https://github.com/4ertus2)) +* Enable parallel insert of materialized view when its target table supports. [#10052](https://github.com/ClickHouse/ClickHouse/pull/10052) ([vxider](https://github.com/Vxider)) +* Improved performance of index analysis with monotonic functions. [#9607](https://github.com/ClickHouse/ClickHouse/pull/9607)[#10026](https://github.com/ClickHouse/ClickHouse/pull/10026) ([Anton Popov](https://github.com/CurtizJ)) +* Using SSE2 or SSE4.2 SIMD intrinsics to speed up tokenization in bloom filters. [#9968](https://github.com/ClickHouse/ClickHouse/pull/9968) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of queries with explicitly defined sets at right side of `IN` operator. This fixes performance regression in version 20.3. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740) ([Anton Popov](https://github.com/CurtizJ)) +* Now clickhouse-copier splits each partition in number of pieces and copies them independently. [#9075](https://github.com/ClickHouse/ClickHouse/pull/9075) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Adding more aggregation methods. For example TPC-H query 1 will now pick `FixedHashMap` and gets 25% performance gain [#9829](https://github.com/ClickHouse/ClickHouse/pull/9829) ([Amos Bird](https://github.com/amosbird)) +* Use single row counter for multiple streams in pre-limit transform. This helps to avoid uniting pipeline streams in queries with `limit` but without `order by` (like `select f(x) from (select x from t limit 1000000000)`) and use multiple threads for further processing. [#9602](https://github.com/ClickHouse/ClickHouse/pull/9602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Build/Testing/Packaging Improvement +* Use a fork of AWS SDK libraries from ClickHouse-Extras [#10527](https://github.com/ClickHouse/ClickHouse/pull/10527) ([Pavel Kovalenko](https://github.com/Jokser)) +* Add integration tests for new ALTER RENAME COLUMN query. [#10654](https://github.com/ClickHouse/ClickHouse/pull/10654) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix possible signed integer overflow in invocation of function `now64` with wrong arguments. This fixes [#8973](https://github.com/ClickHouse/ClickHouse/issues/8973) [#10511](https://github.com/ClickHouse/ClickHouse/pull/10511) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Split fuzzer and sanitizer configurations to make build config compatible with Oss-fuzz. [#10494](https://github.com/ClickHouse/ClickHouse/pull/10494) ([kyprizel](https://github.com/kyprizel)) +* Fixes for clang-tidy on clang-10. [#10420](https://github.com/ClickHouse/ClickHouse/pull/10420) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead. [#10434](https://github.com/ClickHouse/ClickHouse/pull/10434) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `ASAN_OPTIONS` environment variable to investigate errors in CI stress tests with Address sanitizer. [#10440](https://github.com/ClickHouse/ClickHouse/pull/10440) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Enable ThinLTO for clang builds (experimental). [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove accidential dependency on Z3 that may be introduced if the system has Z3 solver installed. [#10426](https://github.com/ClickHouse/ClickHouse/pull/10426) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Move integration tests docker files to docker/ directory. [#10335](https://github.com/ClickHouse/ClickHouse/pull/10335) ([Ilya Yatsishin](https://github.com/qoega)) +* Allow to use `clang-10` in CI. It ensures that [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) is fixed. [#10384](https://github.com/ClickHouse/ClickHouse/pull/10384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update OpenSSL to upstream master. Fixed the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` and `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. The issue was present in version 20.1. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix clang-10 build. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)) +* Add performance test for [Parallel INSERT for materialized view](https://github.com/ClickHouse/ClickHouse/pull/10052). [#10345](https://github.com/ClickHouse/ClickHouse/pull/10345) ([vxider](https://github.com/Vxider)) +* Fix flaky test `test_settings_constraints_distributed.test_insert_clamps_settings`. [#10346](https://github.com/ClickHouse/ClickHouse/pull/10346) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add util to test results upload in CI ClickHouse [#10330](https://github.com/ClickHouse/ClickHouse/pull/10330) ([Ilya Yatsishin](https://github.com/qoega)) +* Convert test results to JSONEachRow format in junit_to_html tool [#10323](https://github.com/ClickHouse/ClickHouse/pull/10323) ([Ilya Yatsishin](https://github.com/qoega)) +* Update cctz. [#10215](https://github.com/ClickHouse/ClickHouse/pull/10215) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to create HTML report from the purest JUnit XML report. [#10247](https://github.com/ClickHouse/ClickHouse/pull/10247) ([Ilya Yatsishin](https://github.com/qoega)) +* Update the check for minimal compiler version. Fix the root cause of the issue [#10250](https://github.com/ClickHouse/ClickHouse/issues/10250) [#10256](https://github.com/ClickHouse/ClickHouse/pull/10256) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initial support for live view tables over distributed [#10179](https://github.com/ClickHouse/ClickHouse/pull/10179) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* clickhouse-docker-util [#10151](https://github.com/ClickHouse/ClickHouse/pull/10151) ([filimonov](https://github.com/filimonov)) +* Update pdqsort to recent version [#10171](https://github.com/ClickHouse/ClickHouse/pull/10171) ([Ivan](https://github.com/abyss7)) +* Update libdivide to v3.0 [#10169](https://github.com/ClickHouse/ClickHouse/pull/10169) ([Ivan](https://github.com/abyss7)) +* Add check with enabled polymorphic parts. [#10086](https://github.com/ClickHouse/ClickHouse/pull/10086) ([Anton Popov](https://github.com/CurtizJ)) +* Add cross-compile build for FreeBSD. This fixes [#9465](https://github.com/ClickHouse/ClickHouse/issues/9465) [#9643](https://github.com/ClickHouse/ClickHouse/pull/9643) ([Ivan](https://github.com/abyss7)) +* Add performance test for [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924) [#6980](https://github.com/ClickHouse/ClickHouse/pull/6980) ([filimonov](https://github.com/filimonov)) +* Add support of `/dev/null` in the `File` engine for better performance testing [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) +* Move all folders inside /dbms one level up [#9974](https://github.com/ClickHouse/ClickHouse/pull/9974) ([Ivan](https://github.com/abyss7)) +* Add a test that checks that read from MergeTree with single thread is performed in order. Addition to [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670) [#9762](https://github.com/ClickHouse/ClickHouse/pull/9762) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix the `00964_live_view_watch_events_heartbeat.py` test to avoid race condition. [#9944](https://github.com/ClickHouse/ClickHouse/pull/9944) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix integration test `test_settings_constraints` [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)) +* Every function in its own file, part 12. [#9922](https://github.com/ClickHouse/ClickHouse/pull/9922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for the case of extremely slow analysis of array of tuples. [#9872](https://github.com/ClickHouse/ClickHouse/pull/9872) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update zstd to 1.4.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix TSan report in `system.stack_trace`. [#9832](https://github.com/ClickHouse/ClickHouse/pull/9832) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Removed dependency on `clock_getres`. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added identifier names check with clang-tidy. [#9799](https://github.com/ClickHouse/ClickHouse/pull/9799) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update "builder" docker image. This image is not used in CI but is useful for developers. [#9809](https://github.com/ClickHouse/ClickHouse/pull/9809) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove old `performance-test` tool that is no longer used in CI. `clickhouse-performance-test` is great but now we are using way superior tool that is doing comparison testing with sophisticated statistical formulas to achieve confident results regardless to various changes in environment. [#9796](https://github.com/ClickHouse/ClickHouse/pull/9796) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added most of clang-static-analyzer checks. [#9765](https://github.com/ClickHouse/ClickHouse/pull/9765) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update Poco to 1.9.3 in preparation for MongoDB URI support. [#6892](https://github.com/ClickHouse/ClickHouse/pull/6892) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix build with `-DUSE_STATIC_LIBRARIES=0 -DENABLE_JEMALLOC=0` [#9651](https://github.com/ClickHouse/ClickHouse/pull/9651) ([Artem Zuikov](https://github.com/4ertus2)) +* For change log script, if merge commit was cherry-picked to release branch, take PR name from commit description. [#9708](https://github.com/ClickHouse/ClickHouse/pull/9708) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Support `vX.X-conflicts` tag in backport script. [#9705](https://github.com/ClickHouse/ClickHouse/pull/9705) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix `auto-label` for backporting script. [#9685](https://github.com/ClickHouse/ClickHouse/pull/9685) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Use libc++ in Darwin cross-build to make it consistent with native build. [#9665](https://github.com/ClickHouse/ClickHouse/pull/9665) ([Hui Wang](https://github.com/huiwang)) +* Fix flacky test `01017_uniqCombined_memory_usage`. Continuation of [#7236](https://github.com/ClickHouse/ClickHouse/issues/7236). [#9667](https://github.com/ClickHouse/ClickHouse/pull/9667) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix build for native macOS Clang compiler [#9649](https://github.com/ClickHouse/ClickHouse/pull/9649) ([Ivan](https://github.com/abyss7)) +* Allow to add various glitches around `pthread_mutex_lock`, `pthread_mutex_unlock` functions. [#9635](https://github.com/ClickHouse/ClickHouse/pull/9635) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add support for `clang-tidy` in `packager` script. [#9625](https://github.com/ClickHouse/ClickHouse/pull/9625) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add ability to use unbundled msgpack. [#10168](https://github.com/ClickHouse/ClickHouse/pull/10168) ([Azat Khuzhin](https://github.com/azat)) + + +## ClickHouse release v20.3 + + +### ClickHouse release v20.3.21.2-lts, 2020-11-02 + +#### Bug Fix + +* Fix dictGet in sharding_key (and similar places, i.e. when the function context is stored permanently). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix missing or excessive headers in `TSV/CSVWithNames` formats. This fixes [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.3.20.6-lts, 2020-10-09 + +#### Bug Fix + +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15724](https://github.com/ClickHouse/ClickHouse/pull/15724), [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix hang of queries with a lot of subqueries to same table of `MySQL` engine. Previously, if there were more than 16 subqueries to same `MySQL` table in query, it hang forever. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). +* Fix 'Unknown identifier' in GROUP BY when query has JOIN over Merge table. [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries might cause deadlock. It's fixed. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.3.19.4-lts, 2020-09-18 + +#### Bug Fix + +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Improvement + +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.3.18.10-lts, 2020-09-08 + +#### Bug Fix + +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. Continuation of [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix CAST(Nullable(String), Enum()). [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fixed data race in `text_log`. It does not correspond to any real bug. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Improvement + +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Return NULL/zero when value is not parsed completely in parseDateTimeBestEffortOrNull/Zero functions. This fixes [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Slightly optimize very short queries with LowCardinality. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Fix UBSan report (adding zero to nullptr) in HashTable that appeared after migration to clang-10. [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.3.17.173-lts, 2020-08-15 + +#### Bug Fix + +* Fix crash in JOIN with StorageMerge and `set enable_optimize_predicate_expression=1`. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix invalid return type for comparison of tuples with `NULL` elements. Fixes [#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix queries with constant columns and `ORDER BY` prefix of primary key. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). +* Return passed number for numbers with MSB set in roundUpToPowerOfTwoOrZero(). [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.3.16.165-lts 2020-08-10 + +#### Bug Fix + +* Fixed error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with `NaN` values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible extra overflow row in data which could appear for queries `WITH TOTALS`. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) allow push predicate when subquery contains with clause. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed SIGSEGV in StorageKafka when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Fixed `TOTALS/ROLLUP/CUBE` for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after `TrieDictionary` failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `dictGet` arguments check during GROUP BY injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid `There is no query` exception for materialized views with joins or with subqueries attached to system logs (system.query_log, metric_log, etc) or to engine=Buffer underlying table. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Expected single dictionary argument for function` for function `defaultValueOfArgumentType` with `LowCardinality` type. Fixes [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parse tables metadata in parallel when loading database. This fixes slow server startup when there are large number of tables. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). +* Make `topK` aggregate function return Enum for Enum types. This fixes [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect comparison of tuples with `Nullable` columns. Fixes [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* A query with function `neighbor` as the only returned expression may return empty result if the function is called with offset `-9223372036854775808`. This fixes [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential array size overflow in generateRandom that may lead to crash. This fixes [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception. This closes [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong setting name in log message at server startup. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Query parameter was not set` in `Values` format. Fixes [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). +* Keep aliases for substitutions in query (parametrized queries). This fixes [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception when parsing DateTime64. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed memory accounting via `HTTP` interface (can be significant with `wait_end_of_query=1`). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix potential read of uninitialized memory in cache dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + + +### ClickHouse release v20.3.12.112-lts 2020-06-25 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong results of distributed queries when alias could override qualified column name. Fixes [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714). [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)). + + +### ClickHouse release v20.3.11.97-lts 2020-06-10 + +#### New Feature + +* Now ClickHouse controls timeouts of dictionary sources on its side. Two new settings added to cache dictionary configuration: `strict_max_lifetime_seconds`, which is `max_lifetime` by default and `query_wait_timeout_milliseconds`, which is one minute by default. The first settings is also useful with `allow_read_expired_keys` settings (to forbid reading very expired keys). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fix crash in JOIN over LowCarinality(T) and Nullable(T). [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix error code for wrong `USING` key. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Better errors for `joinGet()` functions. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in direct selects from StorageJoin (without JOIN) and wrong nullability. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when cache-dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed S3 globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Introduce commit retry logic to decrease the possibility of getting duplicates from Kafka in rare cases when offset commit was failed. [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)). + +#### Performance Improvement + +* Get dictionary and check access rights only once per each call of any function reading external dictionaries. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement + +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). + +### ClickHouse release v20.3.10.75-lts 2020-05-23 + +#### Bug Fix + +* Removed logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed `parseDateTime64BestEffort` argument resolution bugs. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed incorrect raw data size in method `getRawData()`. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of `GROUP BY` result is large and aggregation is performed by a single `String` field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed backward compatibility with tuples in `Distributed` tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `SIGSEGV` in `StringHashTable` if such a key does not exist. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Fixed columns order after `Block::sortColumns()`. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue with `ODBC` bridge when no quoting of identifiers is requested. Fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `UBSan` and `MSan` report in `DateLUT`. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Fixed `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed combinator -`OrNull` and `-OrDefault` when combined with `-State`. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fixed crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fixed order of parameters in `AggregateTransform` constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fixed the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed a bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fixed a bug when on `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `SELECT` of column `ALIAS` which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed index corruption, which may occur in some cases after merge compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the situation, when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). +* Fixed overflow at beginning of unix epoch for timezones with fractional offset from `UTC`. This fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed improper shutdown of `Distributed` storage. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). +* Fixed numeric overflow in `simpleLinearRegression` over large integers. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). + + +#### Build/Testing/Packaging Improvement + +* Fix UBSan report in LZ4 library. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix clang-10 build. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238). [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)). +* Added failing tests about `max_rows_to_sort` setting. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added some improvements in printing diagnostic info in input formats. Fixes [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204). [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)). +* Added CA certificates to clickhouse-server docker image. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). + +#### Bug fix + +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). + + +### ClickHouse release v20.3.8.53, 2020-04-23 + +#### Bug Fix +* Fixed wrong behaviour of datetime functions for timezones that has altered between positive and negative offsets from UTC (e.g. Pacific/Kiritimati). This fixes [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix possible segfault with `distributed_group_by_no_merge` enabled (introduced in 20.3.7.46 by [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131)). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix wrong flattening of `Array(Tuple(...))` data types. This fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Drop disks reservation in Aggregator. This fixes bug in disk space reservation, which may cause big external aggregation to fail even if it could be completed successfully [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) +* Fixed `DROP` vs `OPTIMIZE` race in `ReplicatedMergeTree`. `DROP` could left some garbage in replica path in ZooKeeper if there was concurrent `OPTIMIZE` query. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) +* Fix bug when server cannot attach table after column default was altered. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) +* Do not remove metadata directory when attach database fails before loading tables. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed several bugs when some data was inserted with quorum, then deleted somehow (DROP PARTITION, TTL) and this leaded to the stuck of INSERTs or false-positive exceptions in SELECTs. This fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible `Pipeline stuck` error in `ConcatProcessor` which could have happened in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed wrong behavior in HashTable that caused compilation error when trying to read HashMap from buffer. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)) +* Allow to use `count(*)` with multiple JOINs. Fixes [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`, otherwise when both settings specified and there are no up-to-date replicas the query will fail (patch from @alex-zaitsev). Fixes: [#2564](https://github.com/ClickHouse/ClickHouse/issues/2564). [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) +* Fix the issue when a query with ARRAY JOIN, ORDER BY and LIMIT may return incomplete result. This fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). Author: [Vadim Plakhtinskiy](https://github.com/VadimPlh). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Check the number and type of arguments when creating BloomFilter index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) + +#### Performance Improvement +* Improved performance of queries with explicitly defined sets at right side of `IN` operator and tuples in the left side. This fixes performance regression in version 20.3. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740), [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) + +### ClickHouse release v20.3.7.46, 2020-04-17 + +#### Bug Fix + +* Fix `Logical error: CROSS JOIN has expressions` error for queries with comma and names joins mix. [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix queries with `max_bytes_before_external_group_by`. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix move-to-prewhere optimization in presense of arrayJoin functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). + +### ClickHouse release v20.3.6.40, 2020-04-16 + +#### New Feature + +* Added function `isConstant`. This function checks whether its argument is constant expression and returns 1 or 0. It is intended for development, debugging and demonstration purposes. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix + +* Fix error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug where ClickHouse would throw "Unknown function lambda." error message when user tries to run ALTER UPDATE/DELETE on tables with ENGINE = Replicated*. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed "generateRandom" function for Date type. This fixes [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). Fix an edge case when dates with year 2106 are inserted to MergeTree tables with old-style partitioning but partitions are named with year 1970. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Convert types if the table definition of a View does not correspond to the SELECT query. This fixes [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022). [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible inifinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix using the current database for access checking when the database isn't specified. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)). +* Convert blocks if structure does not match on INSERT into Distributed(). [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible incorrect result for extremes in processors pipeline. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix some kinds of alters with compact parts. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)). +* Fix incorrect `index_granularity_bytes` check while creating new replica. Fixes [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)). +* Fix SIGSEGV on INSERT into Distributed table when its structure differs from the underlying tables. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed replicated tables startup when updating from an old ClickHouse version where `/table/replicas/replica_name/metadata` node does not exist. Fixes [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)). +* Add some arguments check and support identifier arguments for MySQL Database Engine. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug in clickhouse dictionary source from localhost clickhouse server. The bug may lead to memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). +* Fix bug in `CHECK TABLE` query when table contain skip indices. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with different level from different shards (mixed single and two level aggregation). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault that could occur in GROUP BY over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix the number of threads used for remote query execution (performance regression, since 20.3). This happened when query from `Distributed` table was executed simultaneously on local and remote shards. Fixes [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965). [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). +* Fix 'Not found column in block' error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). +* Fix parsing multiple hosts set in the CREATE USER command, e.g. `CREATE USER user6 HOST NAME REGEXP 'lo.?*host', NAME REGEXP 'lo*host'`. [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). +* Fix "scalar does not exist" error in ALTERs ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). +* Fix error with qualified names in `distributed_product_mode='local'`. Fixes [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756). [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix calculating grants for introspection functions from the setting 'allow_introspection_functions'. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement + +* Fix integration test `test_settings_constraints`. [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)). +* Removed dependency on `clock_getres`. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### 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)). +* For INSERT queries shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send INSERT queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). +* 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 +* This release also contains all bug fixes from 20.1.8.41 +* Fix missing `rows_before_limit_at_least` for queries over http (with processors pipeline). This fixes [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730). [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + + +### ClickHouse release v20.3.3.6, 2020-03-17 + +#### Bug Fix +* This release also contains all bug fixes from 20.1.7.38 +* Fix bug in a replication that does not allow replication to work if the user has executed mutations on the previous version. This fixes [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)). It makes version 20.3 backward compatible again. +* Add setting `use_compact_format_in_distributed_parts_names` which allows to write files for `INSERT` queries into `Distributed` table with more compact format. This fixes [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)). It makes version 20.3 backward compatible again. + +### ClickHouse release v20.3.2.1, 2020-03-12 + +#### Backward Incompatible Change + +* Fixed the issue `file name too long` when sending data for `Distributed` tables for a large number of replicas. Fixed the issue that replica credentials were exposed in the server log. The format of directory name on disk was changed to `[shard{shard_index}[_replica{replica_index}]]`. [#8911](https://github.com/ClickHouse/ClickHouse/pull/8911) ([Mikhail Korotov](https://github.com/millb)) After you upgrade to the new version, you will not be able to downgrade without manual intervention, because old server version does not recognize the new directory format. If you want to downgrade, you have to manually rename the corresponding directories to the old format. This change is relevant only if you have used asynchronous `INSERT`s to `Distributed` tables. In the version 20.3.3 we will introduce a setting that will allow you to enable the new format gradually. +* Changed the format of replication log entries for mutation commands. You have to wait for old mutations to process before installing the new version. +* Implement simple memory profiler that dumps stacktraces to `system.trace_log` every N bytes over soft allocation limit [#8765](https://github.com/ClickHouse/ClickHouse/pull/8765) ([Ivan](https://github.com/abyss7)) [#9472](https://github.com/ClickHouse/ClickHouse/pull/9472) ([alexey-milovidov](https://github.com/alexey-milovidov)) The column of `system.trace_log` was renamed from `timer_type` to `trace_type`. This will require changes in third-party performance analysis and flamegraph processing tools. +* Use OS thread id everywhere instead of internal thread number. This fixes [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) Old `clickhouse-client` cannot receive logs that are send from the server when the setting `send_logs_level` is enabled, because the names and types of the structured log messages were changed. On the other hand, different server versions can send logs with different types to each other. When you don't use the `send_logs_level` setting, you should not care. [#8954](https://github.com/ClickHouse/ClickHouse/pull/8954) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `indexHint` function [#9542](https://github.com/ClickHouse/ClickHouse/pull/9542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `findClusterIndex`, `findClusterValue` functions. This fixes [#8641](https://github.com/ClickHouse/ClickHouse/issues/8641). If you were using these functions, send an email to `clickhouse-feedback@yandex-team.com` [#9543](https://github.com/ClickHouse/ClickHouse/pull/9543) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now it's not allowed to create columns or add columns with `SELECT` subquery as default expression. [#9481](https://github.com/ClickHouse/ClickHouse/pull/9481) ([alesapin](https://github.com/alesapin)) +* Require aliases for subqueries in JOIN. [#9274](https://github.com/ClickHouse/ClickHouse/pull/9274) ([Artem Zuikov](https://github.com/4ertus2)) +* Improved `ALTER MODIFY/ADD` queries logic. Now you cannot `ADD` column without type, `MODIFY` default expression does not change type of column and `MODIFY` type does not loose default expression value. Fixes [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). [#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) ([alesapin](https://github.com/alesapin)) +* Require server to be restarted to apply the changes in logging configuration. This is a temporary workaround to avoid the bug where the server logs to a deleted log file (see [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* The setting `experimental_use_processors` is enabled by default. This setting enables usage of the new query pipeline. This is internal refactoring and we expect no visible changes. If you will see any issues, set it to back zero. [#8768](https://github.com/ClickHouse/ClickHouse/pull/8768) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### New Feature +* Add `Avro` and `AvroConfluent` input/output formats [#8571](https://github.com/ClickHouse/ClickHouse/pull/8571) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8957](https://github.com/ClickHouse/ClickHouse/pull/8957) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8717](https://github.com/ClickHouse/ClickHouse/pull/8717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Multi-threaded and non-blocking updates of expired keys in `cache` dictionaries (with optional permission to read old ones). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add query `ALTER ... MATERIALIZE TTL`. It runs mutation that forces to remove expired data by TTL and recalculates meta-information about TTL in all parts. [#8775](https://github.com/ClickHouse/ClickHouse/pull/8775) ([Anton Popov](https://github.com/CurtizJ)) +* Switch from HashJoin to MergeJoin (on disk) if needed [#9082](https://github.com/ClickHouse/ClickHouse/pull/9082) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `MOVE PARTITION` command for `ALTER TABLE` [#4729](https://github.com/ClickHouse/ClickHouse/issues/4729) [#6168](https://github.com/ClickHouse/ClickHouse/pull/6168) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Reloading storage configuration from configuration file on the fly. [#8594](https://github.com/ClickHouse/ClickHouse/pull/8594) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Allowed to change `storage_policy` to not less rich one. [#8107](https://github.com/ClickHouse/ClickHouse/pull/8107) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added support for globs/wildcards for S3 storage and table function. [#8851](https://github.com/ClickHouse/ClickHouse/pull/8851) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Implement `bitAnd`, `bitOr`, `bitXor`, `bitNot` for `FixedString(N)` datatype. [#9091](https://github.com/ClickHouse/ClickHouse/pull/9091) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Added function `bitCount`. This fixes [#8702](https://github.com/ClickHouse/ClickHouse/issues/8702). [#8708](https://github.com/ClickHouse/ClickHouse/pull/8708) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#8749](https://github.com/ClickHouse/ClickHouse/pull/8749) ([ikopylov](https://github.com/ikopylov)) +* Add `generateRandom` table function to generate random rows with given schema. Allows to populate arbitrary test table with data. [#8994](https://github.com/ClickHouse/ClickHouse/pull/8994) ([Ilya Yatsishin](https://github.com/qoega)) +* `JSONEachRowFormat`: support special case when objects enclosed in top-level array. [#8860](https://github.com/ClickHouse/ClickHouse/pull/8860) ([Kruglov Pavel](https://github.com/Avogar)) +* Now it's possible to create a column with `DEFAULT` expression which depends on a column with default `ALIAS` expression. [#9489](https://github.com/ClickHouse/ClickHouse/pull/9489) ([alesapin](https://github.com/alesapin)) +* Allow to specify `--limit` more than the source data size in `clickhouse-obfuscator`. The data will repeat itself with different random seed. [#9155](https://github.com/ClickHouse/ClickHouse/pull/9155) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `groupArraySample` function (similar to `groupArray`) with reservior sampling algorithm. [#8286](https://github.com/ClickHouse/ClickHouse/pull/8286) ([Amos Bird](https://github.com/amosbird)) +* Now you can monitor the size of update queue in `cache`/`complex_key_cache` dictionaries via system metrics. [#9413](https://github.com/ClickHouse/ClickHouse/pull/9413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Allow to use CRLF as a line separator in CSV output format with setting `output_format_csv_crlf_end_of_line` is set to 1 [#8934](https://github.com/ClickHouse/ClickHouse/pull/8934) [#8935](https://github.com/ClickHouse/ClickHouse/pull/8935) [#8963](https://github.com/ClickHouse/ClickHouse/pull/8963) ([Mikhail Korotov](https://github.com/millb)) +* Implement more functions of the [H3](https://github.com/uber/h3) API: `h3GetBaseCell`, `h3HexAreaM2`, `h3IndexesAreNeighbors`, `h3ToChildren`, `h3ToString` and `stringToH3` [#8938](https://github.com/ClickHouse/ClickHouse/pull/8938) ([Nico Mandery](https://github.com/nmandery)) +* New setting introduced: `max_parser_depth` to control maximum stack size and allow large complex queries. This fixes [#6681](https://github.com/ClickHouse/ClickHouse/issues/6681) and [#7668](https://github.com/ClickHouse/ClickHouse/issues/7668). [#8647](https://github.com/ClickHouse/ClickHouse/pull/8647) ([Maxim Smirnov](https://github.com/qMBQx8GH)) +* Add a setting `force_optimize_skip_unused_shards` setting to throw if skipping of unused shards is not possible [#8805](https://github.com/ClickHouse/ClickHouse/pull/8805) ([Azat Khuzhin](https://github.com/azat)) +* Allow to configure multiple disks/volumes for storing data for send in `Distributed` engine [#8756](https://github.com/ClickHouse/ClickHouse/pull/8756) ([Azat Khuzhin](https://github.com/azat)) +* Support storage policy (``) for storing temporary data. [#8750](https://github.com/ClickHouse/ClickHouse/pull/8750) ([Azat Khuzhin](https://github.com/azat)) +* Added `X-ClickHouse-Exception-Code` HTTP header that is set if exception was thrown before sending data. This implements [#4971](https://github.com/ClickHouse/ClickHouse/issues/4971). [#8786](https://github.com/ClickHouse/ClickHouse/pull/8786) ([Mikhail Korotov](https://github.com/millb)) +* Added function `ifNotFinite`. It is just a syntactic sugar: `ifNotFinite(x, y) = isFinite(x) ? x : y`. [#8710](https://github.com/ClickHouse/ClickHouse/pull/8710) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `last_successful_update_time` column in `system.dictionaries` table [#9394](https://github.com/ClickHouse/ClickHouse/pull/9394) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add `blockSerializedSize` function (size on disk without compression) [#8952](https://github.com/ClickHouse/ClickHouse/pull/8952) ([Azat Khuzhin](https://github.com/azat)) +* Add function `moduloOrZero` [#9358](https://github.com/ClickHouse/ClickHouse/pull/9358) ([hcz](https://github.com/hczhcz)) +* Added system tables `system.zeros` and `system.zeros_mt` as well as tale functions `zeros()` and `zeros_mt()`. Tables (and table functions) contain single column with name `zero` and type `UInt8`. This column contains zeros. It is needed for test purposes as the fastest method to generate many rows. This fixes [#6604](https://github.com/ClickHouse/ClickHouse/issues/6604) [#9593](https://github.com/ClickHouse/ClickHouse/pull/9593) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Experimental Feature +* Add new compact format of parts in `MergeTree`-family tables in which all columns are stored in one file. It helps to increase performance of small and frequent inserts. The old format (one file per column) is now called wide. Data storing format is controlled by settings `min_bytes_for_wide_part` and `min_rows_for_wide_part`. [#8290](https://github.com/ClickHouse/ClickHouse/pull/8290) ([Anton Popov](https://github.com/CurtizJ)) +* Support for S3 storage for `Log`, `TinyLog` and `StripeLog` tables. [#8862](https://github.com/ClickHouse/ClickHouse/pull/8862) ([Pavel Kovalenko](https://github.com/Jokser)) + +#### Bug Fix +* Fixed inconsistent whitespaces in log messages. [#9322](https://github.com/ClickHouse/ClickHouse/pull/9322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix bug in which arrays of unnamed tuples were flattened as Nested structures on table creation. [#8866](https://github.com/ClickHouse/ClickHouse/pull/8866) ([achulkov2](https://github.com/achulkov2)) +* Fixed the issue when "Too many open files" error may happen if there are too many files matching glob pattern in `File` table or `file` table function. Now files are opened lazily. This fixes [#8857](https://github.com/ClickHouse/ClickHouse/issues/8857) [#8861](https://github.com/ClickHouse/ClickHouse/pull/8861) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* DROP TEMPORARY TABLE now drops only temporary table. [#8907](https://github.com/ClickHouse/ClickHouse/pull/8907) ([Vitaly Baranov](https://github.com/vitlibar)) +* Remove outdated partition when we shutdown the server or DETACH/ATTACH a table. [#8602](https://github.com/ClickHouse/ClickHouse/pull/8602) ([Guillaume Tassery](https://github.com/YiuRULE)) +* For how the default disk calculates the free space from `data` subdirectory. Fixed the issue when the amount of free space is not calculated correctly if the `data` directory is mounted to a separate device (rare case). This fixes [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) [#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) ([Mikhail Korotov](https://github.com/millb)) +* Allow comma (cross) join with IN () inside. [#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) ([Artem Zuikov](https://github.com/4ertus2)) +* Allow to rewrite CROSS to INNER JOIN if there's [NOT] LIKE operator in WHERE section. [#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible incorrect result after `GROUP BY` with enabled setting `distributed_aggregation_memory_efficient`. Fixes [#9134](https://github.com/ClickHouse/ClickHouse/issues/9134). [#9289](https://github.com/ClickHouse/ClickHouse/pull/9289) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Found keys were counted as missed in metrics of cache dictionaries. [#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix replication protocol incompatibility introduced in [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) +* Fixed race condition on `queue_task_handle` at the startup of `ReplicatedMergeTree` tables. [#9552](https://github.com/ClickHouse/ClickHouse/pull/9552) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* The token `NOT` did not work in `SHOW TABLES NOT LIKE` query [#8727](https://github.com/ClickHouse/ClickHouse/issues/8727) [#8940](https://github.com/ClickHouse/ClickHouse/pull/8940) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added range check to function `h3EdgeLengthM`. Without this check, buffer overflow is possible. [#8945](https://github.com/ClickHouse/ClickHouse/pull/8945) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed up a bug in batched calculations of ternary logical OPs on multiple arguments (more than 10). [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) +* Fix error of PREWHERE optimization, which could lead to segfaults or `Inconsistent number of columns got from MergeTreeRangeReader` exception. [#9024](https://github.com/ClickHouse/ClickHouse/pull/9024) ([Anton Popov](https://github.com/CurtizJ)) +* Fix unexpected `Timeout exceeded while reading from socket` exception, which randomly happens on secure connection before timeout actually exceeded and when query profiler is enabled. Also add `connect_timeout_with_failover_secure_ms` settings (default 100ms), which is similar to `connect_timeout_with_failover_ms`, but is used for secure connections (because SSL handshake is slower, than ordinary TCP connection) [#9026](https://github.com/ClickHouse/ClickHouse/pull/9026) ([tavplubix](https://github.com/tavplubix)) +* Fix bug with mutations finalization, when mutation may hang in state with `parts_to_do=0` and `is_done=0`. [#9022](https://github.com/ClickHouse/ClickHouse/pull/9022) ([alesapin](https://github.com/alesapin)) +* Use new ANY JOIN logic with `partial_merge_join` setting. It's possible to make `ANY|ALL|SEMI LEFT` and `ALL INNER` joins with `partial_merge_join=1` now. [#8932](https://github.com/ClickHouse/ClickHouse/pull/8932) ([Artem Zuikov](https://github.com/4ertus2)) +* Shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send queries to a shard with another constraints. [#9447](https://github.com/ClickHouse/ClickHouse/pull/9447) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fixed memory management problem in `MergeTreeReadPool`. [#8791](https://github.com/ClickHouse/ClickHouse/pull/8791) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix `toDecimal*OrNull()` functions family when called with string `e`. Fixes [#8312](https://github.com/ClickHouse/ClickHouse/issues/8312) [#8764](https://github.com/ClickHouse/ClickHouse/pull/8764) ([Artem Zuikov](https://github.com/4ertus2)) +* Make sure that `FORMAT Null` sends no data to the client. [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix bug that timestamp in `LiveViewBlockInputStream` will not updated. `LIVE VIEW` is an experimental feature. [#8644](https://github.com/ClickHouse/ClickHouse/pull/8644) ([vxider](https://github.com/Vxider)) [#8625](https://github.com/ClickHouse/ClickHouse/pull/8625) ([vxider](https://github.com/Vxider)) +* Fixed `ALTER MODIFY TTL` wrong behavior which did not allow to delete old TTL expressions. [#8422](https://github.com/ClickHouse/ClickHouse/pull/8422) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fixed UBSan report in MergeTreeIndexSet. This fixes [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) [#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed the behaviour of `match` and `extract` functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. This fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid throwing from destructor in Apache Avro 3rd-party library. [#9066](https://github.com/ClickHouse/ClickHouse/pull/9066) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Don't commit a batch polled from `Kafka` partially as it can lead to holes in data. [#8876](https://github.com/ClickHouse/ClickHouse/pull/8876) ([filimonov](https://github.com/filimonov)) +* Fix `joinGet` with nullable return types. [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) [#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) ([Amos Bird](https://github.com/amosbird)) +* Fix data incompatibility when compressed with `T64` codec. [#9016](https://github.com/ClickHouse/ClickHouse/pull/9016) ([Artem Zuikov](https://github.com/4ertus2)) Fix data type ids in `T64` compression codec that leads to wrong (de)compression in affected versions. [#9033](https://github.com/ClickHouse/ClickHouse/pull/9033) ([Artem Zuikov](https://github.com/4ertus2)) +* Add setting `enable_early_constant_folding` and disable it in some cases that leads to errors. [#9010](https://github.com/ClickHouse/ClickHouse/pull/9010) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix pushdown predicate optimizer with VIEW and enable the test [#9011](https://github.com/ClickHouse/ClickHouse/pull/9011) ([Winter Zhang](https://github.com/zhang2014)) +* Fix segfault in `Merge` tables, that can happen when reading from `File` storages [#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) ([tavplubix](https://github.com/tavplubix)) +* Added a check for storage policy in `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE`. Otherwise it could make data of part inaccessible after restart and prevent ClickHouse to start. [#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix alters if there is TTL set for table. [#8800](https://github.com/ClickHouse/ClickHouse/pull/8800) ([Anton Popov](https://github.com/CurtizJ)) +* Fix race condition that can happen when `SYSTEM RELOAD ALL DICTIONARIES` is executed while some dictionary is being modified/added/removed. [#8801](https://github.com/ClickHouse/ClickHouse/pull/8801) ([Vitaly Baranov](https://github.com/vitlibar)) +* In previous versions `Memory` database engine use empty data path, so tables are created in `path` directory (e.g. `/var/lib/clickhouse/`), not in data directory of database (e.g. `/var/lib/clickhouse/db_name`). [#8753](https://github.com/ClickHouse/ClickHouse/pull/8753) ([tavplubix](https://github.com/tavplubix)) +* Fixed wrong log messages about missing default disk or policy. [#9530](https://github.com/ClickHouse/ClickHouse/pull/9530) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix not(has()) for the bloom_filter index of array types. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +* Allow first column(s) in a table with `Log` engine be an alias [#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) ([Ivan](https://github.com/abyss7)) +* Fix order of ranges while reading from `MergeTree` table in one thread. It could lead to exceptions from `MergeTreeRangeReader` or wrong query results. [#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) ([Anton Popov](https://github.com/CurtizJ)) +* Make `reinterpretAsFixedString` to return `FixedString` instead of `String`. [#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Avoid extremely rare cases when the user can get wrong error message (`Success` instead of detailed error description). [#9457](https://github.com/ClickHouse/ClickHouse/pull/9457) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Do not crash when using `Template` format with empty row template. [#8785](https://github.com/ClickHouse/ClickHouse/pull/8785) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Metadata files for system tables could be created in wrong place [#8653](https://github.com/ClickHouse/ClickHouse/pull/8653) ([tavplubix](https://github.com/tavplubix)) Fixes [#8581](https://github.com/ClickHouse/ClickHouse/issues/8581). +* Fix data race on exception_ptr in cache dictionary [#8303](https://github.com/ClickHouse/ClickHouse/issues/8303). [#9379](https://github.com/ClickHouse/ClickHouse/pull/9379) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Do not throw an exception for query `ATTACH TABLE IF NOT EXISTS`. Previously it was thrown if table already exists, despite the `IF NOT EXISTS` clause. [#8967](https://github.com/ClickHouse/ClickHouse/pull/8967) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed missing closing paren in exception message. [#8811](https://github.com/ClickHouse/ClickHouse/pull/8811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid message `Possible deadlock avoided` at the startup of clickhouse-client in interactive mode. [#9455](https://github.com/ClickHouse/ClickHouse/pull/9455) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed the issue when padding at the end of base64 encoded value can be malformed. Update base64 library. This fixes [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378) [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) ([filimonov](https://github.com/filimonov)) +* Fixed exception in `DROP TABLE IF EXISTS` [#8663](https://github.com/ClickHouse/ClickHouse/pull/8663) ([Nikita Vasilev](https://github.com/nikvas0)) +* Fix crash when a user tries to `ALTER MODIFY SETTING` for old-formated `MergeTree` table engines family. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) +* Support for UInt64 numbers that don't fit in Int64 in JSON-related functions. Update SIMDJSON to master. This fixes [#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) [#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed execution of inversed predicates when non-strictly monotinic functional index is used. [#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) ([Alexander Kazakov](https://github.com/Akazz)) +* Don't try to fold `IN` constant in `GROUP BY` [#8868](https://github.com/ClickHouse/ClickHouse/pull/8868) ([Amos Bird](https://github.com/amosbird)) +* Fix bug in `ALTER DELETE` mutations which leads to index corruption. This fixes [#9019](https://github.com/ClickHouse/ClickHouse/issues/9019) and [#8982](https://github.com/ClickHouse/ClickHouse/issues/8982). Additionally fix extremely rare race conditions in `ReplicatedMergeTree` `ALTER` queries. [#9048](https://github.com/ClickHouse/ClickHouse/pull/9048) ([alesapin](https://github.com/alesapin)) +* When the setting `compile_expressions` is enabled, you can get `unexpected column` in `LLVMExecutableFunction` when we use `Nullable` type [#8910](https://github.com/ClickHouse/ClickHouse/pull/8910) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Multiple fixes for `Kafka` engine: 1) fix duplicates that were appearing during consumer group rebalance. 2) Fix rare 'holes' appeared when data were polled from several partitions with one poll and committed partially (now we always process / commit the whole polled block of messages). 3) Fix flushes by block size (before that only flushing by timeout was working properly). 4) better subscription procedure (with assignment feedback). 5) Make tests work faster (with default intervals and timeouts). Due to the fact that data was not flushed by block size before (as it should according to documentation), that PR may lead to some performance degradation with default settings (due to more often & tinier flushes which are less optimal). If you encounter the performance issue after that change - please increase `kafka_max_block_size` in the table to the bigger value ( for example `CREATE TABLE ...Engine=Kafka ... SETTINGS ... kafka_max_block_size=524288`). Fixes [#7259](https://github.com/ClickHouse/ClickHouse/issues/7259) [#8917](https://github.com/ClickHouse/ClickHouse/pull/8917) ([filimonov](https://github.com/filimonov)) +* Fix `Parameter out of bound` exception in some queries after PREWHERE optimizations. [#8914](https://github.com/ClickHouse/ClickHouse/pull/8914) ([Baudouin Giard](https://github.com/bgiard)) +* Fixed the case of mixed-constness of arguments of function `arrayZip`. [#8705](https://github.com/ClickHouse/ClickHouse/pull/8705) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492) [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) ([tavplubix](https://github.com/tavplubix)) +* Now it's not possible to create or add columns with simple cyclic aliases like `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) +* Fixed a bug with double move which may corrupt original part. This is relevant if you use `ALTER TABLE MOVE` [#8680](https://github.com/ClickHouse/ClickHouse/pull/8680) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Allow `interval` identifier to correctly parse without backticks. Fixed issue when a query cannot be executed even if the `interval` identifier is enclosed in backticks or double quotes. This fixes [#9124](https://github.com/ClickHouse/ClickHouse/issues/9124). [#9142](https://github.com/ClickHouse/ClickHouse/pull/9142) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed fuzz test and incorrect behaviour of `bitTestAll`/`bitTestAny` functions. [#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix possible crash/wrong number of rows in `LIMIT n WITH TIES` when there are a lot of rows equal to n'th row. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +* Fix mutations with parts written with enabled `insert_quorum`. [#9463](https://github.com/ClickHouse/ClickHouse/pull/9463) ([alesapin](https://github.com/alesapin)) +* Fix data race at destruction of `Poco::HTTPServer`. It could happen when server is started and immediately shut down. [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +* Fix bug in which a misleading error message was shown when running `SHOW CREATE TABLE a_table_that_does_not_exist`. [#8899](https://github.com/ClickHouse/ClickHouse/pull/8899) ([achulkov2](https://github.com/achulkov2)) +* Fixed `Parameters are out of bound` exception in some rare cases when we have a constant in the `SELECT` clause when we have an `ORDER BY` and a `LIMIT` clause. [#8892](https://github.com/ClickHouse/ClickHouse/pull/8892) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Fix mutations finalization, when already done mutation can have status `is_done=0`. [#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) ([alesapin](https://github.com/alesapin)) +* Prevent from executing `ALTER ADD INDEX` for MergeTree tables with old syntax, because it does not work. [#8822](https://github.com/ClickHouse/ClickHouse/pull/8822) ([Mikhail Korotov](https://github.com/millb)) +* During server startup do not access table, which `LIVE VIEW` depends on, so server will be able to start. Also remove `LIVE VIEW` dependencies when detaching `LIVE VIEW`. `LIVE VIEW` is an experimental feature. [#8824](https://github.com/ClickHouse/ClickHouse/pull/8824) ([tavplubix](https://github.com/tavplubix)) +* Fix possible segfault in `MergeTreeRangeReader`, while executing `PREWHERE`. [#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) ([Anton Popov](https://github.com/CurtizJ)) +* Fix possible mismatched checksums with column TTLs. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed a bug when parts were not being moved in background by TTL rules in case when there is only one volume. [#8672](https://github.com/ClickHouse/ClickHouse/pull/8672) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fixed the issue `Method createColumn() is not implemented for data type Set`. This fixes [#7799](https://github.com/ClickHouse/ClickHouse/issues/7799). [#8674](https://github.com/ClickHouse/ClickHouse/pull/8674) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we will try finalize mutations more frequently. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) +* Fix `intDiv` by minus one constant [#9351](https://github.com/ClickHouse/ClickHouse/pull/9351) ([hcz](https://github.com/hczhcz)) +* Fix possible race condition in `BlockIO`. [#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) ([filimonov](https://github.com/filimonov)) +* Added workaround if OS returns wrong result for `timer_create` function. [#8837](https://github.com/ClickHouse/ClickHouse/pull/8837) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed error in usage of `min_marks_for_seek` parameter. Fixed the error message when there is no sharding key in Distributed table and we try to skip unused shards. [#8908](https://github.com/ClickHouse/ClickHouse/pull/8908) ([Azat Khuzhin](https://github.com/azat)) + +#### Improvement +* Implement `ALTER MODIFY/DROP` queries on top of mutations for `ReplicatedMergeTree*` engines family. Now `ALTERS` blocks only at the metadata update stage, and don't block after that. [#8701](https://github.com/ClickHouse/ClickHouse/pull/8701) ([alesapin](https://github.com/alesapin)) +* Add ability to rewrite CROSS to INNER JOINs with `WHERE` section containing unqialified names. [#9512](https://github.com/ClickHouse/ClickHouse/pull/9512) ([Artem Zuikov](https://github.com/4ertus2)) +* Make `SHOW TABLES` and `SHOW DATABASES` queries support the `WHERE` expressions and `FROM`/`IN` [#9076](https://github.com/ClickHouse/ClickHouse/pull/9076) ([sundyli](https://github.com/sundy-li)) +* Added a setting `deduplicate_blocks_in_dependent_materialized_views`. [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) ([urykhy](https://github.com/urykhy)) +* After recent changes MySQL client started to print binary strings in hex thereby making them not readable ([#9032](https://github.com/ClickHouse/ClickHouse/issues/9032)). The workaround in ClickHouse is to mark string columns as UTF-8, which is not always, but usually the case. [#9079](https://github.com/ClickHouse/ClickHouse/pull/9079) ([Yuriy Baranov](https://github.com/yurriy)) +* Add support of String and FixedString keys for `sumMap` [#8903](https://github.com/ClickHouse/ClickHouse/pull/8903) ([Baudouin Giard](https://github.com/bgiard)) +* Support string keys in SummingMergeTree maps [#8933](https://github.com/ClickHouse/ClickHouse/pull/8933) ([Baudouin Giard](https://github.com/bgiard)) +* Signal termination of thread to the thread pool even if the thread has thrown exception [#8736](https://github.com/ClickHouse/ClickHouse/pull/8736) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* Allow to set `query_id` in `clickhouse-benchmark` [#9416](https://github.com/ClickHouse/ClickHouse/pull/9416) ([Anton Popov](https://github.com/CurtizJ)) +* Don't allow strange expressions in `ALTER TABLE ... PARTITION partition` query. This addresses [#7192](https://github.com/ClickHouse/ClickHouse/issues/7192) [#8835](https://github.com/ClickHouse/ClickHouse/pull/8835) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* The table `system.table_engines` now provides information about feature support (like `supports_ttl` or `supports_sort_order`). [#8830](https://github.com/ClickHouse/ClickHouse/pull/8830) ([Max Akhmedov](https://github.com/zlobober)) +* Enable `system.metric_log` by default. It will contain rows with values of ProfileEvents, CurrentMetrics collected with "collect_interval_milliseconds" interval (one second by default). The table is very small (usually in order of megabytes) and collecting this data by default is reasonable. [#9225](https://github.com/ClickHouse/ClickHouse/pull/9225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries. Fixes [#6964](https://github.com/ClickHouse/ClickHouse/issues/6964) [#8874](https://github.com/ClickHouse/ClickHouse/pull/8874) ([Ivan](https://github.com/abyss7)) +* Now temporary `LIVE VIEW` is created by `CREATE LIVE VIEW name WITH TIMEOUT [42] ...` instead of `CREATE TEMPORARY LIVE VIEW ...`, because the previous syntax was not consistent with `CREATE TEMPORARY TABLE ...` [#9131](https://github.com/ClickHouse/ClickHouse/pull/9131) ([tavplubix](https://github.com/tavplubix)) +* Add text_log.level configuration parameter to limit entries that goes to `system.text_log` table [#8809](https://github.com/ClickHouse/ClickHouse/pull/8809) ([Azat Khuzhin](https://github.com/azat)) +* Allow to put downloaded part to a disks/volumes according to TTL rules [#8598](https://github.com/ClickHouse/ClickHouse/pull/8598) ([Vladimir Chebotarev](https://github.com/excitoon)) +* For external MySQL dictionaries, allow to mutualize MySQL connection pool to "share" them among dictionaries. This option significantly reduces the number of connections to MySQL servers. [#9409](https://github.com/ClickHouse/ClickHouse/pull/9409) ([Clément Rodriguez](https://github.com/clemrodriguez)) +* Show nearest query execution time for quantiles in `clickhouse-benchmark` output instead of interpolated values. It's better to show values that correspond to the execution time of some queries. [#8712](https://github.com/ClickHouse/ClickHouse/pull/8712) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Possibility to add key & timestamp for the message when inserting data to Kafka. Fixes [#7198](https://github.com/ClickHouse/ClickHouse/issues/7198) [#8969](https://github.com/ClickHouse/ClickHouse/pull/8969) ([filimonov](https://github.com/filimonov)) +* If server is run from terminal, highlight thread number, query id and log priority by colors. This is for improved readability of correlated log messages for developers. [#8961](https://github.com/ClickHouse/ClickHouse/pull/8961) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better exception message while loading tables for `Ordinary` database. [#9527](https://github.com/ClickHouse/ClickHouse/pull/9527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Implement `arraySlice` for arrays with aggregate function states. This fixes [#9388](https://github.com/ClickHouse/ClickHouse/issues/9388) [#9391](https://github.com/ClickHouse/ClickHouse/pull/9391) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow constant functions and constant arrays to be used on the right side of IN operator. [#8813](https://github.com/ClickHouse/ClickHouse/pull/8813) ([Anton Popov](https://github.com/CurtizJ)) +* If zookeeper exception has happened while fetching data for system.replicas, display it in a separate column. This implements [#9137](https://github.com/ClickHouse/ClickHouse/issues/9137) [#9138](https://github.com/ClickHouse/ClickHouse/pull/9138) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Atomically remove MergeTree data parts on destroy. [#8402](https://github.com/ClickHouse/ClickHouse/pull/8402) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Support row-level security for Distributed tables. [#8926](https://github.com/ClickHouse/ClickHouse/pull/8926) ([Ivan](https://github.com/abyss7)) +* Now we recognize suffix (like KB, KiB...) in settings values. [#8072](https://github.com/ClickHouse/ClickHouse/pull/8072) ([Mikhail Korotov](https://github.com/millb)) +* Prevent out of memory while constructing result of a large JOIN. [#8637](https://github.com/ClickHouse/ClickHouse/pull/8637) ([Artem Zuikov](https://github.com/4ertus2)) +* Added names of clusters to suggestions in interactive mode in `clickhouse-client`. [#8709](https://github.com/ClickHouse/ClickHouse/pull/8709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries [#8820](https://github.com/ClickHouse/ClickHouse/pull/8820) ([Ivan](https://github.com/abyss7)) +* Added column `exception_code` in `system.query_log` table. [#8770](https://github.com/ClickHouse/ClickHouse/pull/8770) ([Mikhail Korotov](https://github.com/millb)) +* Enabled MySQL compatibility server on port `9004` in the default server configuration file. Fixed password generation command in the example in configuration. [#8771](https://github.com/ClickHouse/ClickHouse/pull/8771) ([Yuriy Baranov](https://github.com/yurriy)) +* Prevent abort on shutdown if the filesystem is readonly. This fixes [#9094](https://github.com/ClickHouse/ClickHouse/issues/9094) [#9100](https://github.com/ClickHouse/ClickHouse/pull/9100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better exception message when length is required in HTTP POST query. [#9453](https://github.com/ClickHouse/ClickHouse/pull/9453) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `_path` and `_file` virtual columns to `HDFS` and `File` engines and `hdfs` and `file` table functions [#8489](https://github.com/ClickHouse/ClickHouse/pull/8489) ([Olga Khvostikova](https://github.com/stavrolia)) +* Fix error `Cannot find column` while inserting into `MATERIALIZED VIEW` in case if new column was added to view's internal table. [#8766](https://github.com/ClickHouse/ClickHouse/pull/8766) [#8788](https://github.com/ClickHouse/ClickHouse/pull/8788) ([vzakaznikov](https://github.com/vzakaznikov)) [#8788](https://github.com/ClickHouse/ClickHouse/issues/8788) [#8806](https://github.com/ClickHouse/ClickHouse/pull/8806) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8803](https://github.com/ClickHouse/ClickHouse/pull/8803) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix progress over native client-server protocol, by send progress after final update (like logs). This may be relevant only to some third-party tools that are using native protocol. [#9495](https://github.com/ClickHouse/ClickHouse/pull/9495) ([Azat Khuzhin](https://github.com/azat)) +* Add a system metric tracking the number of client connections using MySQL protocol ([#9013](https://github.com/ClickHouse/ClickHouse/issues/9013)). [#9015](https://github.com/ClickHouse/ClickHouse/pull/9015) ([Eugene Klimov](https://github.com/Slach)) +* From now on, HTTP responses will have `X-ClickHouse-Timezone` header set to the same timezone value that `SELECT timezone()` would report. [#9493](https://github.com/ClickHouse/ClickHouse/pull/9493) ([Denis Glazachev](https://github.com/traceon)) + +#### Performance Improvement +* Improve performance of analysing index with IN [#9261](https://github.com/ClickHouse/ClickHouse/pull/9261) ([Anton Popov](https://github.com/CurtizJ)) +* Simpler and more efficient code in Logical Functions + code cleanups. A followup to [#8718](https://github.com/ClickHouse/ClickHouse/issues/8718) [#8728](https://github.com/ClickHouse/ClickHouse/pull/8728) ([Alexander Kazakov](https://github.com/Akazz)) +* Overall performance improvement (in range of 5%..200% for affected queries) by ensuring even more strict aliasing with C++20 features. [#9304](https://github.com/ClickHouse/ClickHouse/pull/9304) ([Amos Bird](https://github.com/amosbird)) +* More strict aliasing for inner loops of comparison functions. [#9327](https://github.com/ClickHouse/ClickHouse/pull/9327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* More strict aliasing for inner loops of arithmetic functions. [#9325](https://github.com/ClickHouse/ClickHouse/pull/9325) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* A ~3 times faster implementation for ColumnVector::replicate(), via which ColumnConst::convertToFullColumn() is implemented. Also will be useful in tests when materializing constants. [#9293](https://github.com/ClickHouse/ClickHouse/pull/9293) ([Alexander Kazakov](https://github.com/Akazz)) +* Another minor performance improvement to `ColumnVector::replicate()` (this speeds up the `materialize` function and higher order functions) an even further improvement to [#9293](https://github.com/ClickHouse/ClickHouse/issues/9293) [#9442](https://github.com/ClickHouse/ClickHouse/pull/9442) ([Alexander Kazakov](https://github.com/Akazz)) +* Improved performance of `stochasticLinearRegression` aggregate function. This patch is contributed by Intel. [#8652](https://github.com/ClickHouse/ClickHouse/pull/8652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improve performance of `reinterpretAsFixedString` function. [#9342](https://github.com/ClickHouse/ClickHouse/pull/9342) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Do not send blocks to client for `Null` format in processors pipeline. [#8797](https://github.com/ClickHouse/ClickHouse/pull/8797) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### Build/Testing/Packaging Improvement +* Exception handling now works correctly on Windows Subsystem for Linux. See https://github.com/ClickHouse-Extras/libunwind/pull/3 This fixes [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) +* Replace `readline` with `replxx` for interactive line editing in `clickhouse-client` [#8416](https://github.com/ClickHouse/ClickHouse/pull/8416) ([Ivan](https://github.com/abyss7)) +* Better build time and less template instantiations in FunctionsComparison. [#9324](https://github.com/ClickHouse/ClickHouse/pull/9324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added integration with `clang-tidy` in CI. See also [#6044](https://github.com/ClickHouse/ClickHouse/issues/6044) [#9566](https://github.com/ClickHouse/ClickHouse/pull/9566) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we link ClickHouse in CI using `lld` even for `gcc`. [#9049](https://github.com/ClickHouse/ClickHouse/pull/9049) ([alesapin](https://github.com/alesapin)) +* Allow to randomize thread scheduling and insert glitches when `THREAD_FUZZER_*` environment variables are set. This helps testing. [#9459](https://github.com/ClickHouse/ClickHouse/pull/9459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable secure sockets in stateless tests [#9288](https://github.com/ClickHouse/ClickHouse/pull/9288) ([tavplubix](https://github.com/tavplubix)) +* Make SPLIT_SHARED_LIBRARIES=OFF more robust [#9156](https://github.com/ClickHouse/ClickHouse/pull/9156) ([Azat Khuzhin](https://github.com/azat)) +* Make "performance_introspection_and_logging" test reliable to random server stuck. This may happen in CI environment. See also [#9515](https://github.com/ClickHouse/ClickHouse/issues/9515) [#9528](https://github.com/ClickHouse/ClickHouse/pull/9528) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Validate XML in style check. [#9550](https://github.com/ClickHouse/ClickHouse/pull/9550) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed race condition in test `00738_lock_for_inner_table`. This test relied on sleep. [#9555](https://github.com/ClickHouse/ClickHouse/pull/9555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove performance tests of type `once`. This is needed to run all performance tests in statistical comparison mode (more reliable). [#9557](https://github.com/ClickHouse/ClickHouse/pull/9557) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for arithmetic functions. [#9326](https://github.com/ClickHouse/ClickHouse/pull/9326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for `sumMap` and `sumMapWithOverflow` aggregate functions. Follow-up for [#8933](https://github.com/ClickHouse/ClickHouse/issues/8933) [#8947](https://github.com/ClickHouse/ClickHouse/pull/8947) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Ensure style of ErrorCodes by style check. [#9370](https://github.com/ClickHouse/ClickHouse/pull/9370) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add script for tests history. [#8796](https://github.com/ClickHouse/ClickHouse/pull/8796) ([alesapin](https://github.com/alesapin)) +* Add GCC warning `-Wsuggest-override` to locate and fix all places where `override` keyword must be used. [#8760](https://github.com/ClickHouse/ClickHouse/pull/8760) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Ignore weak symbol under Mac OS X because it must be defined [#9538](https://github.com/ClickHouse/ClickHouse/pull/9538) ([Deleted user](https://github.com/ghost)) +* Normalize running time of some queries in performance tests. This is done in preparation to run all the performance tests in comparison mode. [#9565](https://github.com/ClickHouse/ClickHouse/pull/9565) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix some tests to support pytest with query tests [#9062](https://github.com/ClickHouse/ClickHouse/pull/9062) ([Ivan](https://github.com/abyss7)) +* Enable SSL in build with MSan, so server will not fail at startup when running stateless tests [#9531](https://github.com/ClickHouse/ClickHouse/pull/9531) ([tavplubix](https://github.com/tavplubix)) +* Fix database substitution in test results [#9384](https://github.com/ClickHouse/ClickHouse/pull/9384) ([Ilya Yatsishin](https://github.com/qoega)) +* Build fixes for miscellaneous platforms [#9381](https://github.com/ClickHouse/ClickHouse/pull/9381) ([proller](https://github.com/proller)) [#8755](https://github.com/ClickHouse/ClickHouse/pull/8755) ([proller](https://github.com/proller)) [#8631](https://github.com/ClickHouse/ClickHouse/pull/8631) ([proller](https://github.com/proller)) +* Added disks section to stateless-with-coverage test docker image [#9213](https://github.com/ClickHouse/ClickHouse/pull/9213) ([Pavel Kovalenko](https://github.com/Jokser)) +* Get rid of in-source-tree files when building with GRPC [#9588](https://github.com/ClickHouse/ClickHouse/pull/9588) ([Amos Bird](https://github.com/amosbird)) +* Slightly faster build time by removing SessionCleaner from Context. Make the code of SessionCleaner more simple. [#9232](https://github.com/ClickHouse/ClickHouse/pull/9232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* 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/ClickHouse/dbms/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)) +* Fix flacky test `00910_zookeeper_test_alter_compression_codecs`. [#9525](https://github.com/ClickHouse/ClickHouse/pull/9525) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Clean up duplicated linker flags. Make sure the linker won't look up an unexpected symbol. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)) +* Add `clickhouse-odbc` driver into test images. This allows to test interaction of ClickHouse with ClickHouse via its own ODBC driver. [#9348](https://github.com/ClickHouse/ClickHouse/pull/9348) ([filimonov](https://github.com/filimonov)) +* Fix several bugs in unit tests. [#9047](https://github.com/ClickHouse/ClickHouse/pull/9047) ([alesapin](https://github.com/alesapin)) +* Enable `-Wmissing-include-dirs` GCC warning to eliminate all non-existing includes - mostly as a result of CMake scripting errors [#8704](https://github.com/ClickHouse/ClickHouse/pull/8704) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Describe reasons if query profiler cannot work. This is intended for [#9049](https://github.com/ClickHouse/ClickHouse/issues/9049) [#9144](https://github.com/ClickHouse/ClickHouse/pull/9144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update OpenSSL to upstream master. Fixed the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` and `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. The issue was present in version 20.1. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update Dockerfile for server [#8893](https://github.com/ClickHouse/ClickHouse/pull/8893) ([Ilya Mazaev](https://github.com/ne-ray)) +* Minor fixes in build-gcc-from-sources script [#8774](https://github.com/ClickHouse/ClickHouse/pull/8774) ([Michael Nacharov](https://github.com/mnach)) +* Replace `numbers` to `zeros` in perftests where `number` column is not used. This will lead to more clean test results. [#9600](https://github.com/ClickHouse/ClickHouse/pull/9600) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix stack overflow issue when using initializer_list in Column constructors. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)) +* Upgrade librdkafka to v1.3.0. Enable bundled `rdkafka` and `gsasl` libraries on Mac OS X. [#9000](https://github.com/ClickHouse/ClickHouse/pull/9000) ([Andrew Onyshchuk](https://github.com/oandrew)) +* build fix on GCC 9.2.0 [#9306](https://github.com/ClickHouse/ClickHouse/pull/9306) ([vxider](https://github.com/Vxider)) + + +## ClickHouse release v20.1 + +### ClickHouse release v20.1.16.120-stable 2020-60-26 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.1.15.109-stable 2020-06-19 + +#### Bug Fix + +* Fix excess lock for structure during alter. [#11790](https://github.com/ClickHouse/ClickHouse/pull/11790) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.1.14.107-stable 2020-06-11 + +#### Bug Fix + +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + + +### ClickHouse release v20.1.13.105-stable 2020-06-10 + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Remove logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed parseDateTime64BestEffort argument resolution bugs. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix incorrect raw data size in method getRawData(). [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fix backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV in StringHashTable (if such key does not exist). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Fix columns order after Block::sortColumns() (also add a test that shows that it affects some real use case - Buffer engine). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue with ODBC bridge when no quoting of identifiers is requested. This fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan and MSan report in DateLUT. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* - Make use of `src_type` for correct type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix combinator -OrNull and -OrDefault when combined with -State. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fix disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fix order of parameters in AggregateTransform constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SELECT of column ALIAS which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* * Implemented comparison between DateTime64 and String values (just like for DateTime). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). + + +### ClickHouse release v20.1.12.86, 2020-05-26 + +#### Bug Fix + +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fixed a bug when on `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the situation when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). +* Fixed overflow at beginning of unix epoch for timezones with fractional offset from UTC. This fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed improper shutdown of Distributed storage. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). +* Fixed numeric overflow in `simpleLinearRegression` over large integers. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). +* Fixed removing metadata directory when attach database fails. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)). +* Added a check of number and type of arguments when creating `BloomFilter` index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623). [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when a query with `ARRAY JOIN`, `ORDER BY` and `LIMIT` may return incomplete result. This fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`. [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong flattening of `Array(Tuple(...))` data types. This fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259). [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong behavior in `HashTable` that caused compilation error when trying to read HashMap from buffer. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)). +* Fixed possible `Pipeline stuck` error in `ConcatProcessor` which could have happened in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed several bugs when some data was inserted with quorum, then deleted somehow (DROP PARTITION, TTL) and this leaded to the stuck of INSERTs or false-positive exceptions in SELECTs. This fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946). [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed incompatibility when versions prior to 18.12.17 are used on remote servers and newer is used on initiating server, and GROUP BY both fixed and non-fixed keys, and when two-level group by method is activated. [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Build/Testing/Packaging Improvement + +* Added CA certificates to clickhouse-server docker image. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). + + +### ClickHouse release v20.1.10.70, 2020-04-17 + +#### Bug Fix + +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug where ClickHouse would throw `'Unknown function lambda.'` error message when user tries to run `ALTER UPDATE/DELETE` on tables with `ENGINE = Replicated*`. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix column names of constants inside `JOIN` that may clash with names of constants outside of `JOIN`. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible inifinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix move-to-prewhere optimization in presense of `arrayJoin` functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). +* Convert blocks if structure does not match on `INSERT` into table with `Distributed` engine. [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). +* Fix `SIGSEGV` on `INSERT` into `Distributed` table when its structure differs from the underlying tables. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add arguments check and support identifier arguments for MySQL Database Engine. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug in clickhouse dictionary source from localhost clickhouse server. The bug may lead to memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with different level from different shards (mixed single and two level aggregation). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault that could occur in `GROUP BY` over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). +* Fix `'Not found column in block'` error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). +* Fix `'scalar does not exist'` error in ALTER queries ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). +* Fixed `DeleteOnDestroy` logic in `ATTACH PART` which could lead to automatic removal of attached part and added few tests. [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Build/Testing/Packaging Improvement + +* Fix unit test `collapsing_sorted_stream`. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)). + +### ClickHouse release v20.1.9.54, 2020-03-28 + +#### 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)). +* For INSERT queries shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send `INSERT` queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). +* 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)). +* 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)). + +#### Build/Testing/Packaging Improvement + +* Clean up duplicated linker flags. Make sure the linker won't look up an unexpected symbol. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)). + +### ClickHouse release v20.1.8.41, 2020-03-20 + +#### Bug Fix +* Fix possible permanent `Cannot schedule a task` error (due to unhandled exception in `ParallelAggregatingBlockInputStream::Handler::onFinish/onFinishThread`). This fixes [#6833](https://github.com/ClickHouse/ClickHouse/issues/6833). [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) +* Fix excessive memory consumption in `ALTER` queries (mutations). This fixes [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) +* Fix bug in backquoting in external dictionaries DDL. This fixes [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) + +### ClickHouse release v20.1.7.38, 2020-03-18 + +#### Bug Fix +* Fixed incorrect internal function names for `sumKahan` and `sumWithOverflow`. I lead to exception while using this functions in remote queries. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)). This issue was in all ClickHouse releases. +* Allow `ALTER ON CLUSTER` of `Distributed` tables with internal replication. This fixes [#3268](https://github.com/ClickHouse/ClickHouse/issues/3268). [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)). This issue was in all ClickHouse releases. +* Fix possible exceptions `Size of filter does not match size of column` and `Invalid number of rows in Chunk` in `MergeTreeRangeReader`. They could appear while executing `PREWHERE` in some cases. Fixes [#9132](https://github.com/ClickHouse/ClickHouse/issues/9132). [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed the issue: timezone was not preserved if you write a simple arithmetic expression like `time + 1` (in contrast to an expression like `time + INTERVAL 1 SECOND`). This fixes [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743). [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)). This issue was in all ClickHouse releases. +* Now it's not possible to create or add columns with simple cyclic aliases like `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) +* Fixed the issue when padding at the end of base64 encoded value can be malformed. Update base64 library. This fixes [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix data race at destruction of `Poco::HTTPServer`. It could happen when server is started and immediately shut down. [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +* Fix possible crash/wrong number of rows in `LIMIT n WITH TIES` when there are a lot of rows equal to n'th row. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +* Fix possible mismatched checksums with column TTLs. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +* Fix crash when a user tries to `ALTER MODIFY SETTING` for old-formated `MergeTree` table engines family. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) +* Now we will try finalize mutations more frequently. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) +* Fix replication protocol incompatibility introduced in [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) +* Fix not(has()) for the bloom_filter index of array types. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +* Fixed the behaviour of `match` and `extract` functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. This fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement + +* Exception handling now works correctly on Windows Subsystem for Linux. See https://github.com/ClickHouse-Extras/libunwind/pull/3 This fixes [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) + + +### ClickHouse release v20.1.6.30, 2020-03-05 + +#### Bug Fix + +* Fix data incompatibility when compressed with `T64` codec. +[#9039](https://github.com/ClickHouse/ClickHouse/pull/9039) [(abyss7)](https://github.com/abyss7) +* Fix order of ranges while reading from MergeTree table in one thread. Fixes [#8964](https://github.com/ClickHouse/ClickHouse/issues/8964). +[#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) [(CurtizJ)](https://github.com/CurtizJ) +* Fix possible segfault in `MergeTreeRangeReader`, while executing `PREWHERE`. Fixes [#9064](https://github.com/ClickHouse/ClickHouse/issues/9064). +[#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) [(CurtizJ)](https://github.com/CurtizJ) +* Fix `reinterpretAsFixedString` to return `FixedString` instead of `String`. +[#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) [(oandrew)](https://github.com/oandrew) +* Fix `joinGet` with nullable return types. Fixes [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) +[#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) [(amosbird)](https://github.com/amosbird) +* Fix fuzz test and incorrect behaviour of bitTestAll/bitTestAny functions. +[#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix the behaviour of match and extract functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. Fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) +[#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fixed execution of inversed predicates when non-strictly monotinic functional index is used. Fixes [#9034](https://github.com/ClickHouse/ClickHouse/issues/9034) +[#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) [(Akazz)](https://github.com/Akazz) +* Allow to rewrite `CROSS` to `INNER JOIN` if there's `[NOT] LIKE` operator in `WHERE` section. Fixes [#9191](https://github.com/ClickHouse/ClickHouse/issues/9191) +[#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) [(4ertus2)](https://github.com/4ertus2) +* Allow first column(s) in a table with Log engine be an alias. +[#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) [(abyss7)](https://github.com/abyss7) +* Allow comma join with `IN()` inside. Fixes [#7314](https://github.com/ClickHouse/ClickHouse/issues/7314). +[#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) [(4ertus2)](https://github.com/4ertus2) +* Improve `ALTER MODIFY/ADD` queries logic. Now you cannot `ADD` column without type, `MODIFY` default expression does not change type of column and `MODIFY` type does not loose default expression value. Fixes [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). +[#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) [(alesapin)](https://github.com/alesapin) +* Fix mutations finalization, when already done mutation can have status is_done=0. +[#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) [(alesapin)](https://github.com/alesapin) +* Support "Processors" pipeline for system.numbers and system.numbers_mt. This also fixes the bug when `max_execution_time` is not respected. +[#7796](https://github.com/ClickHouse/ClickHouse/pull/7796) [(KochetovNicolai)](https://github.com/KochetovNicolai) +* Fix wrong counting of `DictCacheKeysRequestedFound` metric. +[#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) [(nikitamikhaylov)](https://github.com/nikitamikhaylov) +* Added a check for storage policy in `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE` which otherwise could make data of part inaccessible after restart and prevent ClickHouse to start. +[#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) [(excitoon)](https://github.com/excitoon) +* Fixed UBSan report in `MergeTreeIndexSet`. This fixes [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) +[#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix possible datarace in BlockIO. +[#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) [(KochetovNicolai)](https://github.com/KochetovNicolai) +* Support for `UInt64` numbers that don't fit in Int64 in JSON-related functions. Update `SIMDJSON` to master. This fixes [#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) +[#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix the issue when the amount of free space is not calculated correctly if the data directory is mounted to a separate device. For default disk calculate the free space from data subdirectory. This fixes [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) +[#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) [(millb)](https://github.com/millb) +* Fix the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error and SSL Exception: error:2400006E:random number generator::error retrieving entropy.` Update OpenSSL to upstream master. +[#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). Also fix check for local address in ClickHouseDictionarySource. +[#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +* Fix segfault in `StorageMerge`, which can happen when reading from StorageFile. +[#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) [(tabplubix)](https://github.com/tavplubix) +* Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Related: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) +[#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +* Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. Fixes [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). +[#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) + +#### New Feature +* Add `deduplicate_blocks_in_dependent_materialized_views` option to control the behaviour of idempotent inserts into tables with materialized views. This new feature was added to the bugfix release by a special request from Altinity. +[#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### ClickHouse release v20.1.2.4, 2020-01-22 + +#### Backward Incompatible Change +* Make the setting `merge_tree_uniform_read_distribution` obsolete. The server still recognizes this setting but it has no effect. [#8308](https://github.com/ClickHouse/ClickHouse/pull/8308) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Changed return type of the function `greatCircleDistance` to `Float32` because now the result of calculation is `Float32`. [#7993](https://github.com/ClickHouse/ClickHouse/pull/7993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now it's expected that query parameters are represented in "escaped" format. For example, to pass string `ab` you have to write `a\tb` or `a\b` and respectively, `a%5Ctb` or `a%5C%09b` in URL. This is needed to add the possibility to pass NULL as `\N`. This fixes [#7488](https://github.com/ClickHouse/ClickHouse/issues/7488). [#8517](https://github.com/ClickHouse/ClickHouse/pull/8517) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable `use_minimalistic_part_header_in_zookeeper` setting for `ReplicatedMergeTree` by default. This will significantly reduce amount of data stored in ZooKeeper. This setting is supported since version 19.1 and we already use it in production in multiple services without any issues for more than half a year. Disable this setting if you have a chance to downgrade to versions older than 19.1. [#6850](https://github.com/ClickHouse/ClickHouse/pull/6850) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Data skipping indices are production ready and enabled by default. The settings `allow_experimental_data_skipping_indices`, `allow_experimental_cross_to_join_conversion` and `allow_experimental_multiple_joins_emulation` are now obsolete and do nothing. [#7974](https://github.com/ClickHouse/ClickHouse/pull/7974) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add new `ANY JOIN` logic for `StorageJoin` consistent with `JOIN` operation. To upgrade without changes in behaviour you need add `SETTINGS any_join_distinct_right_table_keys = 1` to Engine Join tables metadata or recreate these tables after upgrade. [#8400](https://github.com/ClickHouse/ClickHouse/pull/8400) ([Artem Zuikov](https://github.com/4ertus2)) +* Require server to be restarted to apply the changes in logging configuration. This is a temporary workaround to avoid the bug where the server logs to a deleted log file (see [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### New Feature +* Added information about part paths to `system.merges`. [#8043](https://github.com/ClickHouse/ClickHouse/pull/8043) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Add ability to execute `SYSTEM RELOAD DICTIONARY` query in `ON CLUSTER` mode. [#8288](https://github.com/ClickHouse/ClickHouse/pull/8288) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Add ability to execute `CREATE DICTIONARY` queries in `ON CLUSTER` mode. [#8163](https://github.com/ClickHouse/ClickHouse/pull/8163) ([alesapin](https://github.com/alesapin)) +* Now user's profile in `users.xml` can inherit multiple profiles. [#8343](https://github.com/ClickHouse/ClickHouse/pull/8343) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +* Added `system.stack_trace` table that allows to look at stack traces of all server threads. This is useful for developers to introspect server state. This fixes [#7576](https://github.com/ClickHouse/ClickHouse/issues/7576). [#8344](https://github.com/ClickHouse/ClickHouse/pull/8344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `DateTime64` datatype with configurable sub-second precision. [#7170](https://github.com/ClickHouse/ClickHouse/pull/7170) ([Vasily Nemkov](https://github.com/Enmk)) +* Add table function `clusterAllReplicas` which allows to query all the nodes in the cluster. [#8493](https://github.com/ClickHouse/ClickHouse/pull/8493) ([kiran sunkari](https://github.com/kiransunkari)) +* Add aggregate function `categoricalInformationValue` which calculates the information value of a discrete feature. [#8117](https://github.com/ClickHouse/ClickHouse/pull/8117) ([hcz](https://github.com/hczhcz)) +* Speed up parsing of data files in `CSV`, `TSV` and `JSONEachRow` format by doing it in parallel. [#7780](https://github.com/ClickHouse/ClickHouse/pull/7780) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Add function `bankerRound` which performs banker's rounding. [#8112](https://github.com/ClickHouse/ClickHouse/pull/8112) ([hcz](https://github.com/hczhcz)) +* Support more languages in embedded dictionary for region names: 'ru', 'en', 'ua', 'uk', 'by', 'kz', 'tr', 'de', 'uz', 'lv', 'lt', 'et', 'pt', 'he', 'vi'. [#8189](https://github.com/ClickHouse/ClickHouse/pull/8189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improvements in consistency of `ANY JOIN` logic. Now `t1 ANY LEFT JOIN t2` equals `t2 ANY RIGHT JOIN t1`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Add setting `any_join_distinct_right_table_keys` which enables old behaviour for `ANY INNER JOIN`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Add new `SEMI` and `ANTI JOIN`. Old `ANY INNER JOIN` behaviour now available as `SEMI LEFT JOIN`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `Distributed` format for `File` engine and `file` table function which allows to read from `.bin` files generated by asynchronous inserts into `Distributed` table. [#8535](https://github.com/ClickHouse/ClickHouse/pull/8535) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Add optional reset column argument for `runningAccumulate` which allows to reset aggregation results for each new key value. [#8326](https://github.com/ClickHouse/ClickHouse/pull/8326) ([Sergey Kononenko](https://github.com/kononencheg)) +* Add ability to use ClickHouse as Prometheus endpoint. [#7900](https://github.com/ClickHouse/ClickHouse/pull/7900) ([vdimir](https://github.com/Vdimir)) +* Add section `` in `config.xml` which restricts allowed hosts for remote table engines and table functions `URL`, `S3`, `HDFS`. [#7154](https://github.com/ClickHouse/ClickHouse/pull/7154) ([Mikhail Korotov](https://github.com/millb)) +* Added function `greatCircleAngle` which calculates the distance on a sphere in degrees. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Changed Earth radius to be consistent with H3 library. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `JSONCompactEachRow` and `JSONCompactEachRowWithNamesAndTypes` formats for input and output. [#7841](https://github.com/ClickHouse/ClickHouse/pull/7841) ([Mikhail Korotov](https://github.com/millb)) +* Added feature for file-related table engines and table functions (`File`, `S3`, `URL`, `HDFS`) which allows to read and write `gzip` files based on additional engine parameter or file extension. [#7840](https://github.com/ClickHouse/ClickHouse/pull/7840) ([Andrey Bodrov](https://github.com/apbodrov)) +* Added the `randomASCII(length)` function, generating a string with a random set of [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) printable characters. [#8401](https://github.com/ClickHouse/ClickHouse/pull/8401) ([BayoNet](https://github.com/BayoNet)) +* Added function `JSONExtractArrayRaw` which returns an array on unparsed json array elements from `JSON` string. [#8081](https://github.com/ClickHouse/ClickHouse/pull/8081) ([Oleg Matrokhin](https://github.com/errx)) +* Add `arrayZip` function which allows to combine multiple arrays of equal lengths into one array of tuples. [#8149](https://github.com/ClickHouse/ClickHouse/pull/8149) ([Winter Zhang](https://github.com/zhang2014)) +* Add ability to move data between disks according to configured `TTL`-expressions for `*MergeTree` table engines family. [#8140](https://github.com/ClickHouse/ClickHouse/pull/8140) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added new aggregate function `avgWeighted` which allows to calculate weighted average. [#7898](https://github.com/ClickHouse/ClickHouse/pull/7898) ([Andrey Bodrov](https://github.com/apbodrov)) +* Now parallel parsing is enabled by default for `TSV`, `TSKV`, `CSV` and `JSONEachRow` formats. [#7894](https://github.com/ClickHouse/ClickHouse/pull/7894) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add several geo functions from `H3` library: `h3GetResolution`, `h3EdgeAngle`, `h3EdgeLength`, `h3IsValid` and `h3kRing`. [#8034](https://github.com/ClickHouse/ClickHouse/pull/8034) ([Konstantin Malanchev](https://github.com/hombit)) +* Added support for brotli (`br`) compression in file-related storages and table functions. This fixes [#8156](https://github.com/ClickHouse/ClickHouse/issues/8156). [#8526](https://github.com/ClickHouse/ClickHouse/pull/8526) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `groupBit*` functions for the `SimpleAggregationFunction` type. [#8485](https://github.com/ClickHouse/ClickHouse/pull/8485) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Bug Fix +* Fix rename of tables with `Distributed` engine. Fixes issue [#7868](https://github.com/ClickHouse/ClickHouse/issues/7868). [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) +* Now dictionaries support `EXPRESSION` for attributes in arbitrary string in non-ClickHouse SQL dialect. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +* Fix broken `INSERT SELECT FROM mysql(...)` query. This fixes [#8070](https://github.com/ClickHouse/ClickHouse/issues/8070) and [#7960](https://github.com/ClickHouse/ClickHouse/issues/7960). [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) +* Fix error "Mismatch column sizes" when inserting default `Tuple` from `JSONEachRow`. This fixes [#5653](https://github.com/ClickHouse/ClickHouse/issues/5653). [#8606](https://github.com/ClickHouse/ClickHouse/pull/8606) ([tavplubix](https://github.com/tavplubix)) +* Now an exception will be thrown in case of using `WITH TIES` alongside `LIMIT BY`. Also add ability to use `TOP` with `LIMIT BY`. This fixes [#7472](https://github.com/ClickHouse/ClickHouse/issues/7472). [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix unintendent dependency from fresh glibc version in `clickhouse-odbc-bridge` binary. [#8046](https://github.com/ClickHouse/ClickHouse/pull/8046) ([Amos Bird](https://github.com/amosbird)) +* Fix bug in check function of `*MergeTree` engines family. Now it does not fail in case when we have equal amount of rows in last granule and last mark (non-final). [#8047](https://github.com/ClickHouse/ClickHouse/pull/8047) ([alesapin](https://github.com/alesapin)) +* Fix insert into `Enum*` columns after `ALTER` query, when underlying numeric type is equal to table specified type. This fixes [#7836](https://github.com/ClickHouse/ClickHouse/issues/7836). [#7908](https://github.com/ClickHouse/ClickHouse/pull/7908) ([Anton Popov](https://github.com/CurtizJ)) +* Allowed non-constant negative "size" argument for function `substring`. It was not allowed by mistake. This fixes [#4832](https://github.com/ClickHouse/ClickHouse/issues/4832). [#7703](https://github.com/ClickHouse/ClickHouse/pull/7703) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix parsing bug when wrong number of arguments passed to `(O|J)DBC` table engine. [#7709](https://github.com/ClickHouse/ClickHouse/pull/7709) ([alesapin](https://github.com/alesapin)) +* Using command name of the running clickhouse process when sending logs to syslog. In previous versions, empty string was used instead of command name. [#8460](https://github.com/ClickHouse/ClickHouse/pull/8460) ([Michael Nacharov](https://github.com/mnach)) +* Fix check of allowed hosts for `localhost`. This PR fixes the solution provided in [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241). [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix rare crash in `argMin` and `argMax` functions for long string arguments, when result is used in `runningAccumulate` function. This fixes [#8325](https://github.com/ClickHouse/ClickHouse/issues/8325) [#8341](https://github.com/ClickHouse/ClickHouse/pull/8341) ([dinosaur](https://github.com/769344359)) +* Fix memory overcommit for tables with `Buffer` engine. [#8345](https://github.com/ClickHouse/ClickHouse/pull/8345) ([Azat Khuzhin](https://github.com/azat)) +* Fixed potential bug in functions that can take `NULL` as one of the arguments and return non-NULL. [#8196](https://github.com/ClickHouse/ClickHouse/pull/8196) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better metrics calculations in thread pool for background processes for `MergeTree` table engines. [#8194](https://github.com/ClickHouse/ClickHouse/pull/8194) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix function `IN` inside `WHERE` statement when row-level table filter is present. Fixes [#6687](https://github.com/ClickHouse/ClickHouse/issues/6687) [#8357](https://github.com/ClickHouse/ClickHouse/pull/8357) ([Ivan](https://github.com/abyss7)) +* Now an exception is thrown if the integral value is not parsed completely for settings values. [#7678](https://github.com/ClickHouse/ClickHouse/pull/7678) ([Mikhail Korotov](https://github.com/millb)) +* Fix exception when aggregate function is used in query to distributed table with more than two local shards. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +* Now bloom filter can handle zero length arrays and does not perform redundant calculations. [#8242](https://github.com/ClickHouse/ClickHouse/pull/8242) ([achimbab](https://github.com/achimbab)) +* Fixed checking if a client host is allowed by matching the client host to `host_regexp` specified in `users.xml`. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) ([Vitaly Baranov](https://github.com/vitlibar)) +* Relax ambiguous column check that leads to false positives in multiple `JOIN ON` section. [#8385](https://github.com/ClickHouse/ClickHouse/pull/8385) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed possible server crash (`std::terminate`) when the server cannot send or write data in `JSON` or `XML` format with values of `String` data type (that require `UTF-8` validation) or when compressing result data with Brotli algorithm or in some other rare cases. This fixes [#7603](https://github.com/ClickHouse/ClickHouse/issues/7603) [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix race condition in `StorageDistributedDirectoryMonitor` found by CI. This fixes [#8364](https://github.com/ClickHouse/ClickHouse/issues/8364). [#8383](https://github.com/ClickHouse/ClickHouse/pull/8383) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now background merges in `*MergeTree` table engines family preserve storage policy volume order more accurately. [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Now table engine `Kafka` works properly with `Native` format. This fixes [#6731](https://github.com/ClickHouse/ClickHouse/issues/6731) [#7337](https://github.com/ClickHouse/ClickHouse/issues/7337) [#8003](https://github.com/ClickHouse/ClickHouse/issues/8003). [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +* Fixed formats with headers (like `CSVWithNames`) which were throwing exception about EOF for table engine `Kafka`. [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +* Fixed a bug with making set from subquery in right part of `IN` section. This fixes [#5767](https://github.com/ClickHouse/ClickHouse/issues/5767) and [#2542](https://github.com/ClickHouse/ClickHouse/issues/2542). [#7755](https://github.com/ClickHouse/ClickHouse/pull/7755) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible crash while reading from storage `File`. [#7756](https://github.com/ClickHouse/ClickHouse/pull/7756) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed reading of the files in `Parquet` format containing columns of type `list`. [#8334](https://github.com/ClickHouse/ClickHouse/pull/8334) ([maxulan](https://github.com/maxulan)) +* Fix error `Not found column` for distributed queries with `PREWHERE` condition dependent on sampling key if `max_parallel_replicas > 1`. [#7913](https://github.com/ClickHouse/ClickHouse/pull/7913) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix error `Not found column` if query used `PREWHERE` dependent on table's alias and the result set was empty because of primary key condition. [#7911](https://github.com/ClickHouse/ClickHouse/pull/7911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed return type for functions `rand` and `randConstant` in case of `Nullable` argument. Now functions always return `UInt32` and never `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Disabled predicate push-down for `WITH FILL` expression. This fixes [#7784](https://github.com/ClickHouse/ClickHouse/issues/7784). [#7789](https://github.com/ClickHouse/ClickHouse/pull/7789) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed incorrect `count()` result for `SummingMergeTree` when `FINAL` section is used. [#3280](https://github.com/ClickHouse/ClickHouse/issues/3280) [#7786](https://github.com/ClickHouse/ClickHouse/pull/7786) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible incorrect result for constant functions from remote servers. It happened for queries with functions like `version()`, `uptime()`, etc. which returns different constant values for different servers. This fixes [#7666](https://github.com/ClickHouse/ClickHouse/issues/7666). [#7689](https://github.com/ClickHouse/ClickHouse/pull/7689) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix complicated bug in push-down predicate optimization which leads to wrong results. This fixes a lot of issues on push-down predicate optimization. [#8503](https://github.com/ClickHouse/ClickHouse/pull/8503) ([Winter Zhang](https://github.com/zhang2014)) +* Fix crash in `CREATE TABLE .. AS dictionary` query. [#8508](https://github.com/ClickHouse/ClickHouse/pull/8508) ([Azat Khuzhin](https://github.com/azat)) +* Several improvements ClickHouse grammar in `.g4` file. [#8294](https://github.com/ClickHouse/ClickHouse/pull/8294) ([taiyang-li](https://github.com/taiyang-li)) +* Fix bug that leads to crashes in `JOIN`s with tables with engine `Join`. This fixes [#7556](https://github.com/ClickHouse/ClickHouse/issues/7556) [#8254](https://github.com/ClickHouse/ClickHouse/issues/8254) [#7915](https://github.com/ClickHouse/ClickHouse/issues/7915) [#8100](https://github.com/ClickHouse/ClickHouse/issues/8100). [#8298](https://github.com/ClickHouse/ClickHouse/pull/8298) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix redundant dictionaries reload on `CREATE DATABASE`. [#7916](https://github.com/ClickHouse/ClickHouse/pull/7916) ([Azat Khuzhin](https://github.com/azat)) +* Limit maximum number of streams for read from `StorageFile` and `StorageHDFS`. Fixes [#7650](https://github.com/ClickHouse/ClickHouse/issues/7650). [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +* Fix bug in `ALTER ... MODIFY ... CODEC` query, when user specify both default expression and codec. Fixes [8593](https://github.com/ClickHouse/ClickHouse/issues/8593). [#8614](https://github.com/ClickHouse/ClickHouse/pull/8614) ([alesapin](https://github.com/alesapin)) +* Fix error in background merge of columns with `SimpleAggregateFunction(LowCardinality)` type. [#8613](https://github.com/ClickHouse/ClickHouse/pull/8613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed type check in function `toDateTime64`. [#8375](https://github.com/ClickHouse/ClickHouse/pull/8375) ([Vasily Nemkov](https://github.com/Enmk)) +* Now server do not crash on `LEFT` or `FULL JOIN` with and Join engine and unsupported `join_use_nulls` settings. [#8479](https://github.com/ClickHouse/ClickHouse/pull/8479) ([Artem Zuikov](https://github.com/4ertus2)) +* Now `DROP DICTIONARY IF EXISTS db.dict` query does not throw exception if `db` does not exist. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix possible crashes in table functions (`file`, `mysql`, `remote`) caused by usage of reference to removed `IStorage` object. Fix incorrect parsing of columns specified at insertion into table function. [#7762](https://github.com/ClickHouse/ClickHouse/pull/7762) ([tavplubix](https://github.com/tavplubix)) +* Ensure network be up before starting `clickhouse-server`. This fixes [#7507](https://github.com/ClickHouse/ClickHouse/issues/7507). [#8570](https://github.com/ClickHouse/ClickHouse/pull/8570) ([Zhichang Yu](https://github.com/yuzhichang)) +* Fix timeouts handling for secure connections, so queries does not hang indefenitely. This fixes [#8126](https://github.com/ClickHouse/ClickHouse/issues/8126). [#8128](https://github.com/ClickHouse/ClickHouse/pull/8128) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `clickhouse-copier`'s redundant contention between concurrent workers. [#7816](https://github.com/ClickHouse/ClickHouse/pull/7816) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* Now mutations does not skip attached parts, even if their mutation version were larger than current mutation version. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +* Ignore redundant copies of `*MergeTree` data parts after move to another disk and server restart. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix crash in `FULL JOIN` with `LowCardinality` in `JOIN` key. [#8252](https://github.com/ClickHouse/ClickHouse/pull/8252) ([Artem Zuikov](https://github.com/4ertus2)) +* Forbidden to use column name more than once in insert query like `INSERT INTO tbl (x, y, x)`. This fixes [#5465](https://github.com/ClickHouse/ClickHouse/issues/5465), [#7681](https://github.com/ClickHouse/ClickHouse/issues/7681). [#7685](https://github.com/ClickHouse/ClickHouse/pull/7685) ([alesapin](https://github.com/alesapin)) +* Added fallback for detection the number of physical CPU cores for unknown CPUs (using the number of logical CPU cores). This fixes [#5239](https://github.com/ClickHouse/ClickHouse/issues/5239). [#7726](https://github.com/ClickHouse/ClickHouse/pull/7726) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `There's no column` error for materialized and alias columns. [#8210](https://github.com/ClickHouse/ClickHouse/pull/8210) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed sever crash when `EXISTS` query was used without `TABLE` or `DICTIONARY` qualifier. Just like `EXISTS t`. This fixes [#8172](https://github.com/ClickHouse/ClickHouse/issues/8172). This bug was introduced in version 19.17. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix rare bug with error `"Sizes of columns does not match"` that might appear when using `SimpleAggregateFunction` column. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +* Fix bug where user with empty `allow_databases` got access to all databases (and same for `allow_dictionaries`). [#7793](https://github.com/ClickHouse/ClickHouse/pull/7793) ([DeifyTheGod](https://github.com/DeifyTheGod)) +* Fix client crash when server already disconnected from client. [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +* Fix `ORDER BY` behaviour in case of sorting by primary key prefix and non primary key suffix. [#7759](https://github.com/ClickHouse/ClickHouse/pull/7759) ([Anton Popov](https://github.com/CurtizJ)) +* Check if qualified column present in the table. This fixes [#6836](https://github.com/ClickHouse/ClickHouse/issues/6836). [#7758](https://github.com/ClickHouse/ClickHouse/pull/7758) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed behavior with `ALTER MOVE` ran immediately after merge finish moves superpart of specified. Fixes [#8103](https://github.com/ClickHouse/ClickHouse/issues/8103). [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix possible server crash while using `UNION` with different number of columns. Fixes [#7279](https://github.com/ClickHouse/ClickHouse/issues/7279). [#7929](https://github.com/ClickHouse/ClickHouse/pull/7929) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix size of result substring for function `substr` with negative size. [#8589](https://github.com/ClickHouse/ClickHouse/pull/8589) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now server does not execute part mutation in `MergeTree` if there are not enough free threads in background pool. [#8588](https://github.com/ClickHouse/ClickHouse/pull/8588) ([tavplubix](https://github.com/tavplubix)) +* Fix a minor typo on formatting `UNION ALL` AST. [#7999](https://github.com/ClickHouse/ClickHouse/pull/7999) ([litao91](https://github.com/litao91)) +* Fixed incorrect bloom filter results for negative numbers. This fixes [#8317](https://github.com/ClickHouse/ClickHouse/issues/8317). [#8566](https://github.com/ClickHouse/ClickHouse/pull/8566) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed potential buffer overflow in decompress. Malicious user can pass fabricated compressed data that will cause read after buffer. This issue was found by Eldar Zaitov from Yandex information security team. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix incorrect result because of integers overflow in `arrayIntersect`. [#7777](https://github.com/ClickHouse/ClickHouse/pull/7777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now `OPTIMIZE TABLE` query will not wait for offline replicas to perform the operation. [#8314](https://github.com/ClickHouse/ClickHouse/pull/8314) ([javi santana](https://github.com/javisantana)) +* Fixed `ALTER TTL` parser for `Replicated*MergeTree` tables. [#8318](https://github.com/ClickHouse/ClickHouse/pull/8318) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix communication between server and client, so server read temporary tables info after query failure. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +* Fix `bitmapAnd` function error when intersecting an aggregated bitmap and a scalar bitmap. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +* Refine the definition of `ZXid` according to the ZooKeeper Programmer's Guide which fixes bug in `clickhouse-cluster-copier`. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* `odbc` table function now respects `external_table_functions_use_nulls` setting. [#7506](https://github.com/ClickHouse/ClickHouse/pull/7506) ([Vasily Nemkov](https://github.com/Enmk)) +* Fixed bug that lead to a rare data race. [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) +* Now `SYSTEM RELOAD DICTIONARY` reloads a dictionary completely, ignoring `update_field`. This fixes [#7440](https://github.com/ClickHouse/ClickHouse/issues/7440). [#8037](https://github.com/ClickHouse/ClickHouse/pull/8037) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add ability to check if dictionary exists in create query. [#8032](https://github.com/ClickHouse/ClickHouse/pull/8032) ([alesapin](https://github.com/alesapin)) +* Fix `Float*` parsing in `Values` format. This fixes [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817). [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) +* Fix crash when we cannot reserve space in some background operations of `*MergeTree` table engines family. [#7873](https://github.com/ClickHouse/ClickHouse/pull/7873) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix crash of merge operation when table contains `SimpleAggregateFunction(LowCardinality)` column. This fixes [#8515](https://github.com/ClickHouse/ClickHouse/issues/8515). [#8522](https://github.com/ClickHouse/ClickHouse/pull/8522) ([Azat Khuzhin](https://github.com/azat)) +* Restore support of all ICU locales and add the ability to apply collations for constant expressions. Also add language name to `system.collations` table. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +* Fix bug when external dictionaries with zero minimal lifetime (`LIFETIME(MIN 0 MAX N)`, `LIFETIME(N)`) don't update in background. [#7983](https://github.com/ClickHouse/ClickHouse/pull/7983) ([alesapin](https://github.com/alesapin)) +* Fix crash when external dictionary with ClickHouse source has subquery in query. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix incorrect parsing of file extension in table with engine `URL`. This fixes [#8157](https://github.com/ClickHouse/ClickHouse/issues/8157). [#8419](https://github.com/ClickHouse/ClickHouse/pull/8419) ([Andrey Bodrov](https://github.com/apbodrov)) +* Fix `CHECK TABLE` query for `*MergeTree` tables without key. Fixes [#7543](https://github.com/ClickHouse/ClickHouse/issues/7543). [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +* Fixed conversion of `Float64` to MySQL type. [#8079](https://github.com/ClickHouse/ClickHouse/pull/8079) ([Yuriy Baranov](https://github.com/yurriy)) +* Now if table was not completely dropped because of server crash, server will try to restore and load it. [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) +* Fixed crash in table function `file` while inserting into file that does not exist. Now in this case file would be created and then insert would be processed. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +* Fix rare deadlock which can happen when `trace_log` is in enabled. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +* Add ability to work with different types besides `Date` in `RangeHashed` external dictionary created from DDL query. Fixes [7899](https://github.com/ClickHouse/ClickHouse/issues/7899). [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +* Fixes crash when `now64()` is called with result of another function. [#8270](https://github.com/ClickHouse/ClickHouse/pull/8270) ([Vasily Nemkov](https://github.com/Enmk)) +* Fixed bug with detecting client IP for connections through mysql wire protocol. [#7743](https://github.com/ClickHouse/ClickHouse/pull/7743) ([Dmitry Muzyka](https://github.com/dmitriy-myz)) +* Fix empty array handling in `arraySplit` function. This fixes [#7708](https://github.com/ClickHouse/ClickHouse/issues/7708). [#7747](https://github.com/ClickHouse/ClickHouse/pull/7747) ([hcz](https://github.com/hczhcz)) +* Fixed the issue when `pid-file` of another running `clickhouse-server` may be deleted. [#8487](https://github.com/ClickHouse/ClickHouse/pull/8487) ([Weiqing Xu](https://github.com/weiqxu)) +* Fix dictionary reload if it has `invalidate_query`, which stopped updates and some exception on previous update tries. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) +* Fixed error in function `arrayReduce` that may lead to "double free" and error in aggregate function combinator `Resample` that may lead to memory leak. Added aggregate function `aggThrow`. This function can be used for testing purposes. [#8446](https://github.com/ClickHouse/ClickHouse/pull/8446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement +* Improved logging when working with `S3` table engine. [#8251](https://github.com/ClickHouse/ClickHouse/pull/8251) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +* Printed help message when no arguments are passed when calling `clickhouse-local`. This fixes [#5335](https://github.com/ClickHouse/ClickHouse/issues/5335). [#8230](https://github.com/ClickHouse/ClickHouse/pull/8230) ([Andrey Nagorny](https://github.com/Melancholic)) +* Add setting `mutations_sync` which allows to wait `ALTER UPDATE/DELETE` queries synchronously. [#8237](https://github.com/ClickHouse/ClickHouse/pull/8237) ([alesapin](https://github.com/alesapin)) +* Allow to set up relative `user_files_path` in `config.xml` (in the way similar to `format_schema_path`). [#7632](https://github.com/ClickHouse/ClickHouse/pull/7632) ([hcz](https://github.com/hczhcz)) +* Add exception for illegal types for conversion functions with `-OrZero` postfix. [#7880](https://github.com/ClickHouse/ClickHouse/pull/7880) ([Andrey Konyaev](https://github.com/akonyaev90)) +* Simplify format of the header of data sending to a shard in a distributed query. [#8044](https://github.com/ClickHouse/ClickHouse/pull/8044) ([Vitaly Baranov](https://github.com/vitlibar)) +* `Live View` table engine refactoring. [#8519](https://github.com/ClickHouse/ClickHouse/pull/8519) ([vzakaznikov](https://github.com/vzakaznikov)) +* Add additional checks for external dictionaries created from DDL-queries. [#8127](https://github.com/ClickHouse/ClickHouse/pull/8127) ([alesapin](https://github.com/alesapin)) +* Fix error `Column ... already exists` while using `FINAL` and `SAMPLE` together, e.g. `select count() from table final sample 1/2`. Fixes [#5186](https://github.com/ClickHouse/ClickHouse/issues/5186). [#7907](https://github.com/ClickHouse/ClickHouse/pull/7907) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now table the first argument of `joinGet` function can be table identifier. [#7707](https://github.com/ClickHouse/ClickHouse/pull/7707) ([Amos Bird](https://github.com/amosbird)) +* Allow using `MaterializedView` with subqueries above `Kafka` tables. [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) +* Now background moves between disks run it the seprate thread pool. [#7670](https://github.com/ClickHouse/ClickHouse/pull/7670) ([Vladimir Chebotarev](https://github.com/excitoon)) +* `SYSTEM RELOAD DICTIONARY` now executes synchronously. [#8240](https://github.com/ClickHouse/ClickHouse/pull/8240) ([Vitaly Baranov](https://github.com/vitlibar)) +* Stack traces now display physical addresses (offsets in object file) instead of virtual memory addresses (where the object file was loaded). That allows the use of `addr2line` when binary is position independent and ASLR is active. This fixes [#8360](https://github.com/ClickHouse/ClickHouse/issues/8360). [#8387](https://github.com/ClickHouse/ClickHouse/pull/8387) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Support new syntax for row-level security filters: `
    `. Fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779). [#8381](https://github.com/ClickHouse/ClickHouse/pull/8381) ([Ivan](https://github.com/abyss7)) +* Now `cityHash` function can work with `Decimal` and `UUID` types. Fixes [#5184](https://github.com/ClickHouse/ClickHouse/issues/5184). [#7693](https://github.com/ClickHouse/ClickHouse/pull/7693) ([Mikhail Korotov](https://github.com/millb)) +* Removed fixed index granularity (it was 1024) from system logs because it's obsolete after implementation of adaptive granularity. [#7698](https://github.com/ClickHouse/ClickHouse/pull/7698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enabled MySQL compatibility server when ClickHouse is compiled without SSL. [#7852](https://github.com/ClickHouse/ClickHouse/pull/7852) ([Yuriy Baranov](https://github.com/yurriy)) +* Now server checksums distributed batches, which gives more verbose errors in case of corrupted data in batch. [#7914](https://github.com/ClickHouse/ClickHouse/pull/7914) ([Azat Khuzhin](https://github.com/azat)) +* Support `DROP DATABASE`, `DETACH TABLE`, `DROP TABLE` and `ATTACH TABLE` for `MySQL` database engine. [#8202](https://github.com/ClickHouse/ClickHouse/pull/8202) ([Winter Zhang](https://github.com/zhang2014)) +* Add authentication in S3 table function and table engine. [#7623](https://github.com/ClickHouse/ClickHouse/pull/7623) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added check for extra parts of `MergeTree` at different disks, in order to not allow to miss data parts at undefined disks. [#8118](https://github.com/ClickHouse/ClickHouse/pull/8118) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Enable SSL support for Mac client and server. [#8297](https://github.com/ClickHouse/ClickHouse/pull/8297) ([Ivan](https://github.com/abyss7)) +* Now ClickHouse can work as MySQL federated server (see https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html). [#7717](https://github.com/ClickHouse/ClickHouse/pull/7717) ([Maxim Fedotov](https://github.com/MaxFedotov)) +* `clickhouse-client` now only enable `bracketed-paste` when multiquery is on and multiline is off. This fixes [#7757](https://github.com/ClickHouse/ClickHouse/issues/7757). [#7761](https://github.com/ClickHouse/ClickHouse/pull/7761) ([Amos Bird](https://github.com/amosbird)) +* Support `Array(Decimal)` in `if` function. [#7721](https://github.com/ClickHouse/ClickHouse/pull/7721) ([Artem Zuikov](https://github.com/4ertus2)) +* Support Decimals in `arrayDifference`, `arrayCumSum` and `arrayCumSumNegative` functions. [#7724](https://github.com/ClickHouse/ClickHouse/pull/7724) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `lifetime` column to `system.dictionaries` table. [#6820](https://github.com/ClickHouse/ClickHouse/issues/6820) [#7727](https://github.com/ClickHouse/ClickHouse/pull/7727) ([kekekekule](https://github.com/kekekekule)) +* Improved check for existing parts on different disks for `*MergeTree` table engines. Addresses [#7660](https://github.com/ClickHouse/ClickHouse/issues/7660). [#8440](https://github.com/ClickHouse/ClickHouse/pull/8440) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Integration with `AWS SDK` for `S3` interactions which allows to use all S3 features out of the box. [#8011](https://github.com/ClickHouse/ClickHouse/pull/8011) ([Pavel Kovalenko](https://github.com/Jokser)) +* Added support for subqueries in `Live View` tables. [#7792](https://github.com/ClickHouse/ClickHouse/pull/7792) ([vzakaznikov](https://github.com/vzakaznikov)) +* Check for using `Date` or `DateTime` column from `TTL` expressions was removed. [#7920](https://github.com/ClickHouse/ClickHouse/pull/7920) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Information about disk was added to `system.detached_parts` table. [#7833](https://github.com/ClickHouse/ClickHouse/pull/7833) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Now settings `max_(table|partition)_size_to_drop` can be changed without a restart. [#7779](https://github.com/ClickHouse/ClickHouse/pull/7779) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +* Slightly better usability of error messages. Ask user not to remove the lines below `Stack trace:`. [#7897](https://github.com/ClickHouse/ClickHouse/pull/7897) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better reading messages from `Kafka` engine in various formats after [#7935](https://github.com/ClickHouse/ClickHouse/issues/7935). [#8035](https://github.com/ClickHouse/ClickHouse/pull/8035) ([Ivan](https://github.com/abyss7)) +* Better compatibility with MySQL clients which don't support `sha2_password` auth plugin. [#8036](https://github.com/ClickHouse/ClickHouse/pull/8036) ([Yuriy Baranov](https://github.com/yurriy)) +* Support more column types in MySQL compatibility server. [#7975](https://github.com/ClickHouse/ClickHouse/pull/7975) ([Yuriy Baranov](https://github.com/yurriy)) +* Implement `ORDER BY` optimization for `Merge`, `Buffer` and `Materilized View` storages with underlying `MergeTree` tables. [#8130](https://github.com/ClickHouse/ClickHouse/pull/8130) ([Anton Popov](https://github.com/CurtizJ)) +* Now we always use POSIX implementation of `getrandom` to have better compatibility with old kernels (< 3.17). [#7940](https://github.com/ClickHouse/ClickHouse/pull/7940) ([Amos Bird](https://github.com/amosbird)) +* Better check for valid destination in a move TTL rule. [#8410](https://github.com/ClickHouse/ClickHouse/pull/8410) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Better checks for broken insert batches for `Distributed` table engine. [#7933](https://github.com/ClickHouse/ClickHouse/pull/7933) ([Azat Khuzhin](https://github.com/azat)) +* Add column with array of parts name which mutations must process in future to `system.mutations` table. [#8179](https://github.com/ClickHouse/ClickHouse/pull/8179) ([alesapin](https://github.com/alesapin)) +* Parallel merge sort optimization for processors. [#8552](https://github.com/ClickHouse/ClickHouse/pull/8552) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* The settings `mark_cache_min_lifetime` is now obsolete and does nothing. In previous versions, mark cache can grow in memory larger than `mark_cache_size` to accomodate data within `mark_cache_min_lifetime` seconds. That was leading to confusion and higher memory usage than expected, that is especially bad on memory constrained systems. If you will see performance degradation after installing this release, you should increase the `mark_cache_size`. [#8484](https://github.com/ClickHouse/ClickHouse/pull/8484) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Preparation to use `tid` everywhere. This is needed for [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477). [#8276](https://github.com/ClickHouse/ClickHouse/pull/8276) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Performance Improvement +* Performance optimizations in processors pipeline. [#7988](https://github.com/ClickHouse/ClickHouse/pull/7988) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Non-blocking updates of expired keys in cache dictionaries (with permission to read old ones). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Compile ClickHouse without `-fno-omit-frame-pointer` globally to spare one more register. [#8097](https://github.com/ClickHouse/ClickHouse/pull/8097) ([Amos Bird](https://github.com/amosbird)) +* Speedup `greatCircleDistance` function and add performance tests for it. [#7307](https://github.com/ClickHouse/ClickHouse/pull/7307) ([Olga Khvostikova](https://github.com/stavrolia)) +* Improved performance of function `roundDown`. [#8465](https://github.com/ClickHouse/ClickHouse/pull/8465) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of `max`, `min`, `argMin`, `argMax` for `DateTime64` data type. [#8199](https://github.com/ClickHouse/ClickHouse/pull/8199) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of sorting without a limit or with big limit and external sorting. [#8545](https://github.com/ClickHouse/ClickHouse/pull/8545) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of formatting floating point numbers up to 6 times. [#8542](https://github.com/ClickHouse/ClickHouse/pull/8542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of `modulo` function. [#7750](https://github.com/ClickHouse/ClickHouse/pull/7750) ([Amos Bird](https://github.com/amosbird)) +* Optimized `ORDER BY` and merging with single column key. [#8335](https://github.com/ClickHouse/ClickHouse/pull/8335) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better implementation for `arrayReduce`, `-Array` and `-State` combinators. [#7710](https://github.com/ClickHouse/ClickHouse/pull/7710) ([Amos Bird](https://github.com/amosbird)) +* Now `PREWHERE` should be optimized to be at least as efficient as `WHERE`. [#7769](https://github.com/ClickHouse/ClickHouse/pull/7769) ([Amos Bird](https://github.com/amosbird)) +* Improve the way `round` and `roundBankers` handling negative numbers. [#8229](https://github.com/ClickHouse/ClickHouse/pull/8229) ([hcz](https://github.com/hczhcz)) +* Improved decoding performance of `DoubleDelta` and `Gorilla` codecs by roughly 30-40%. This fixes [#7082](https://github.com/ClickHouse/ClickHouse/issues/7082). [#8019](https://github.com/ClickHouse/ClickHouse/pull/8019) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of `base64` related functions. [#8444](https://github.com/ClickHouse/ClickHouse/pull/8444) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added a function `geoDistance`. It is similar to `greatCircleDistance` but uses approximation to WGS-84 ellipsoid model. The performance of both functions are near the same. [#8086](https://github.com/ClickHouse/ClickHouse/pull/8086) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Faster `min` and `max` aggregation functions for `Decimal` data type. [#8144](https://github.com/ClickHouse/ClickHouse/pull/8144) ([Artem Zuikov](https://github.com/4ertus2)) +* Vectorize processing `arrayReduce`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) +* `if` chains are now optimized as `multiIf`. [#8355](https://github.com/ClickHouse/ClickHouse/pull/8355) ([kamalov-ruslan](https://github.com/kamalov-ruslan)) +* Fix performance regression of `Kafka` table engine introduced in 19.15. This fixes [#7261](https://github.com/ClickHouse/ClickHouse/issues/7261). [#7935](https://github.com/ClickHouse/ClickHouse/pull/7935) ([filimonov](https://github.com/filimonov)) +* Removed "pie" code generation that `gcc` from Debian packages occasionally brings by default. [#8483](https://github.com/ClickHouse/ClickHouse/pull/8483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Parallel parsing data formats [#6553](https://github.com/ClickHouse/ClickHouse/pull/6553) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Enable optimized parser of `Values` with expressions by default (`input_format_values_deduce_templates_of_expressions=1`). [#8231](https://github.com/ClickHouse/ClickHouse/pull/8231) ([tavplubix](https://github.com/tavplubix)) + +#### Build/Testing/Packaging Improvement +* Build fixes for `ARM` and in minimal mode. [#8304](https://github.com/ClickHouse/ClickHouse/pull/8304) ([proller](https://github.com/proller)) +* Add coverage file flush for `clickhouse-server` when std::atexit is not called. Also slightly improved logging in stateless tests with coverage. [#8267](https://github.com/ClickHouse/ClickHouse/pull/8267) ([alesapin](https://github.com/alesapin)) +* Update LLVM library in contrib. Avoid using LLVM from OS packages. [#8258](https://github.com/ClickHouse/ClickHouse/pull/8258) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make bundled `curl` build fully quiet. [#8232](https://github.com/ClickHouse/ClickHouse/pull/8232) [#8203](https://github.com/ClickHouse/ClickHouse/pull/8203) ([Pavel Kovalenko](https://github.com/Jokser)) +* Fix some `MemorySanitizer` warnings. [#8235](https://github.com/ClickHouse/ClickHouse/pull/8235) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Use `add_warning` and `no_warning` macros in `CMakeLists.txt`. [#8604](https://github.com/ClickHouse/ClickHouse/pull/8604) ([Ivan](https://github.com/abyss7)) +* Add support of Minio S3 Compatible object (https://min.io/) for better integration tests. [#7863](https://github.com/ClickHouse/ClickHouse/pull/7863) [#7875](https://github.com/ClickHouse/ClickHouse/pull/7875) ([Pavel Kovalenko](https://github.com/Jokser)) +* Imported `libc` headers to contrib. It allows to make builds more consistent across various systems (only for `x86_64-linux-gnu`). [#5773](https://github.com/ClickHouse/ClickHouse/pull/5773) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `-fPIC` from some libraries. [#8464](https://github.com/ClickHouse/ClickHouse/pull/8464) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Clean `CMakeLists.txt` for curl. See https://github.com/ClickHouse/ClickHouse/pull/8011#issuecomment-569478910 [#8459](https://github.com/ClickHouse/ClickHouse/pull/8459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Silent warnings in `CapNProto` library. [#8220](https://github.com/ClickHouse/ClickHouse/pull/8220) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add performance tests for short string optimized hash tables. [#7679](https://github.com/ClickHouse/ClickHouse/pull/7679) ([Amos Bird](https://github.com/amosbird)) +* Now ClickHouse will build on `AArch64` even if `MADV_FREE` is not available. This fixes [#8027](https://github.com/ClickHouse/ClickHouse/issues/8027). [#8243](https://github.com/ClickHouse/ClickHouse/pull/8243) ([Amos Bird](https://github.com/amosbird)) +* Update `zlib-ng` to fix memory sanitizer problems. [#7182](https://github.com/ClickHouse/ClickHouse/pull/7182) [#8206](https://github.com/ClickHouse/ClickHouse/pull/8206) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Enable internal MySQL library on non-Linux system, because usage of OS packages is very fragile and usually does not work at all. This fixes [#5765](https://github.com/ClickHouse/ClickHouse/issues/5765). [#8426](https://github.com/ClickHouse/ClickHouse/pull/8426) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed build on some systems after enabling `libc++`. This supersedes [#8374](https://github.com/ClickHouse/ClickHouse/issues/8374). [#8380](https://github.com/ClickHouse/ClickHouse/pull/8380) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make `Field` methods more type-safe to find more errors. [#7386](https://github.com/ClickHouse/ClickHouse/pull/7386) [#8209](https://github.com/ClickHouse/ClickHouse/pull/8209) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Added missing files to the `libc-headers` submodule. [#8507](https://github.com/ClickHouse/ClickHouse/pull/8507) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix wrong `JSON` quoting in performance test output. [#8497](https://github.com/ClickHouse/ClickHouse/pull/8497) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now stack trace is displayed for `std::exception` and `Poco::Exception`. In previous versions it was available only for `DB::Exception`. This improves diagnostics. [#8501](https://github.com/ClickHouse/ClickHouse/pull/8501) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Porting `clock_gettime` and `clock_nanosleep` for fresh glibc versions. [#8054](https://github.com/ClickHouse/ClickHouse/pull/8054) ([Amos Bird](https://github.com/amosbird)) +* Enable `part_log` in example config for developers. [#8609](https://github.com/ClickHouse/ClickHouse/pull/8609) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix async nature of reload in `01036_no_superfluous_dict_reload_on_create_database*`. [#8111](https://github.com/ClickHouse/ClickHouse/pull/8111) ([Azat Khuzhin](https://github.com/azat)) +* Fixed codec performance tests. [#8615](https://github.com/ClickHouse/ClickHouse/pull/8615) ([Vasily Nemkov](https://github.com/Enmk)) +* Add install scripts for `.tgz` build and documentation for them. [#8612](https://github.com/ClickHouse/ClickHouse/pull/8612) [#8591](https://github.com/ClickHouse/ClickHouse/pull/8591) ([alesapin](https://github.com/alesapin)) +* Removed old `ZSTD` test (it was created in year 2016 to reproduce the bug that pre 1.0 version of ZSTD has had). This fixes [#8618](https://github.com/ClickHouse/ClickHouse/issues/8618). [#8619](https://github.com/ClickHouse/ClickHouse/pull/8619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed build on Mac OS Catalina. [#8600](https://github.com/ClickHouse/ClickHouse/pull/8600) ([meo](https://github.com/meob)) +* Increased number of rows in codec performance tests to make results noticeable. [#8574](https://github.com/ClickHouse/ClickHouse/pull/8574) ([Vasily Nemkov](https://github.com/Enmk)) +* In debug builds, treat `LOGICAL_ERROR` exceptions as assertion failures, so that they are easier to notice. [#8475](https://github.com/ClickHouse/ClickHouse/pull/8475) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Make formats-related performance test more deterministic. [#8477](https://github.com/ClickHouse/ClickHouse/pull/8477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update `lz4` to fix a MemorySanitizer failure. [#8181](https://github.com/ClickHouse/ClickHouse/pull/8181) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Suppress a known MemorySanitizer false positive in exception handling. [#8182](https://github.com/ClickHouse/ClickHouse/pull/8182) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Update `gcc` and `g++` to version 9 in `build/docker/build.sh` [#7766](https://github.com/ClickHouse/ClickHouse/pull/7766) ([TLightSky](https://github.com/tlightsky)) +* Add performance test case to test that `PREWHERE` is worse than `WHERE`. [#7768](https://github.com/ClickHouse/ClickHouse/pull/7768) ([Amos Bird](https://github.com/amosbird)) +* Progress towards fixing one flacky test. [#8621](https://github.com/ClickHouse/ClickHouse/pull/8621) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid MemorySanitizer report for data from `libunwind`. [#8539](https://github.com/ClickHouse/ClickHouse/pull/8539) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Updated `libc++` to the latest version. [#8324](https://github.com/ClickHouse/ClickHouse/pull/8324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Build ICU library from sources. This fixes [#6460](https://github.com/ClickHouse/ClickHouse/issues/6460). [#8219](https://github.com/ClickHouse/ClickHouse/pull/8219) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Switched from `libressl` to `openssl`. ClickHouse should support TLS 1.3 and SNI after this change. This fixes [#8171](https://github.com/ClickHouse/ClickHouse/issues/8171). [#8218](https://github.com/ClickHouse/ClickHouse/pull/8218) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed UBSan report when using `chacha20_poly1305` from SSL (happens on connect to https://yandex.ru/). [#8214](https://github.com/ClickHouse/ClickHouse/pull/8214) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix mode of default password file for `.deb` linux distros. [#8075](https://github.com/ClickHouse/ClickHouse/pull/8075) ([proller](https://github.com/proller)) +* Improved expression for getting `clickhouse-server` PID in `clickhouse-test`. [#8063](https://github.com/ClickHouse/ClickHouse/pull/8063) ([Alexander Kazakov](https://github.com/Akazz)) +* Updated contrib/googletest to v1.10.0. [#8587](https://github.com/ClickHouse/ClickHouse/pull/8587) ([Alexander Burmak](https://github.com/Alex-Burmak)) +* Fixed ThreadSaninitizer report in `base64` library. Also updated this library to the latest version, but it does not matter. This fixes [#8397](https://github.com/ClickHouse/ClickHouse/issues/8397). [#8403](https://github.com/ClickHouse/ClickHouse/pull/8403) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `00600_replace_running_query` for processors. [#8272](https://github.com/ClickHouse/ClickHouse/pull/8272) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Remove support for `tcmalloc` to make `CMakeLists.txt` simpler. [#8310](https://github.com/ClickHouse/ClickHouse/pull/8310) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Release gcc builds now use `libc++` instead of `libstdc++`. Recently `libc++` was used only with clang. This will improve consistency of build configurations and portability. [#8311](https://github.com/ClickHouse/ClickHouse/pull/8311) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable ICU library for build with MemorySanitizer. [#8222](https://github.com/ClickHouse/ClickHouse/pull/8222) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Suppress warnings from `CapNProto` library. [#8224](https://github.com/ClickHouse/ClickHouse/pull/8224) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Removed special cases of code for `tcmalloc`, because it's no longer supported. [#8225](https://github.com/ClickHouse/ClickHouse/pull/8225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* In CI coverage task, kill the server gracefully to allow it to save the coverage report. This fixes incomplete coverage reports we've been seeing lately. [#8142](https://github.com/ClickHouse/ClickHouse/pull/8142) ([alesapin](https://github.com/alesapin)) +* Performance tests for all codecs against `Float64` and `UInt64` values. [#8349](https://github.com/ClickHouse/ClickHouse/pull/8349) ([Vasily Nemkov](https://github.com/Enmk)) +* `termcap` is very much deprecated and lead to various problems (f.g. missing "up" cap and echoing `^J` instead of multi line) . Favor `terminfo` or bundled `ncurses`. [#7737](https://github.com/ClickHouse/ClickHouse/pull/7737) ([Amos Bird](https://github.com/amosbird)) +* Fix `test_storage_s3` integration test. [#7734](https://github.com/ClickHouse/ClickHouse/pull/7734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Support `StorageFile(, null) ` to insert block into given format file without actually write to disk. This is required for performance tests. [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) +* Added argument `--print-time` to functional tests which prints execution time per test. [#8001](https://github.com/ClickHouse/ClickHouse/pull/8001) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Added asserts to `KeyCondition` while evaluating RPN. This will fix warning from gcc-9. [#8279](https://github.com/ClickHouse/ClickHouse/pull/8279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Dump cmake options in CI builds. [#8273](https://github.com/ClickHouse/ClickHouse/pull/8273) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Don't generate debug info for some fat libraries. [#8271](https://github.com/ClickHouse/ClickHouse/pull/8271) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make `log_to_console.xml` always log to stderr, regardless of is it interactive or not. [#8395](https://github.com/ClickHouse/ClickHouse/pull/8395) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Removed some unused features from `clickhouse-performance-test` tool. [#8555](https://github.com/ClickHouse/ClickHouse/pull/8555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we will also search for `lld-X` with corresponding `clang-X` version. [#8092](https://github.com/ClickHouse/ClickHouse/pull/8092) ([alesapin](https://github.com/alesapin)) +* Parquet build improvement. [#8421](https://github.com/ClickHouse/ClickHouse/pull/8421) ([maxulan](https://github.com/maxulan)) +* More GCC warnings [#8221](https://github.com/ClickHouse/ClickHouse/pull/8221) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Package for Arch Linux now allows to run ClickHouse server, and not only client. [#8534](https://github.com/ClickHouse/ClickHouse/pull/8534) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix test with processors. Tiny performance fixes. [#7672](https://github.com/ClickHouse/ClickHouse/pull/7672) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Update contrib/protobuf. [#8256](https://github.com/ClickHouse/ClickHouse/pull/8256) ([Matwey V. Kornilov](https://github.com/matwey)) +* In preparation of switching to c++20 as a new year celebration. "May the C++ force be with ClickHouse." [#8447](https://github.com/ClickHouse/ClickHouse/pull/8447) ([Amos Bird](https://github.com/amosbird)) + +#### Experimental Feature +* Added experimental setting `min_bytes_to_use_mmap_io`. It allows to read big files without copying data from kernel to userspace. The setting is disabled by default. Recommended threshold is about 64 MB, because mmap/munmap is slow. [#8520](https://github.com/ClickHouse/ClickHouse/pull/8520) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Reworked quotas as a part of access control system. Added new table `system.quotas`, new functions `currentQuota`, `currentQuotaKey`, new SQL syntax `CREATE QUOTA`, `ALTER QUOTA`, `DROP QUOTA`, `SHOW QUOTA`. [#7257](https://github.com/ClickHouse/ClickHouse/pull/7257) ([Vitaly Baranov](https://github.com/vitlibar)) +* Allow skipping unknown settings with warnings instead of throwing exceptions. [#7653](https://github.com/ClickHouse/ClickHouse/pull/7653) ([Vitaly Baranov](https://github.com/vitlibar)) +* Reworked row policies as a part of access control system. Added new table `system.row_policies`, new function `currentRowPolicies()`, new SQL syntax `CREATE POLICY`, `ALTER POLICY`, `DROP POLICY`, `SHOW CREATE POLICY`, `SHOW POLICIES`. [#7808](https://github.com/ClickHouse/ClickHouse/pull/7808) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Security Fix +* Fixed the possibility of reading directories structure in tables with `File` table engine. This fixes [#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## [Changelog for 2019](./2019.md) diff --git a/docs/ja/whats-new/changelog/2021.md b/docs/ja/whats-new/changelog/2021.md new file mode 100644 index 00000000000..e3b471facac --- /dev/null +++ b/docs/ja/whats-new/changelog/2021.md @@ -0,0 +1,2055 @@ +--- +slug: /ja/whats-new/changelog/2021 +sidebar_position: 10 +sidebar_label: '2021' +title: 2021 Changelog +--- + +### ClickHouse release v21.12, 2021-12-15 + +#### Backward Incompatible Change + +* *A fix for a feature that previously had unwanted behaviour.* Do not allow direct select for Kafka/RabbitMQ/FileLog. Can be enabled by setting `stream_like_engine_allow_direct_select`. Direct select will be not allowed even if enabled by setting, in case there is an attached materialized view. For Kafka and RabbitMQ direct selectm if allowed, will not commit massages by default. To enable commits with direct select, user must use storage level setting `kafka{rabbitmq}_commit_on_select=1` (default `0`). [#31053](https://github.com/ClickHouse/ClickHouse/pull/31053) ([Kseniia Sumarokova](https://github.com/kssenii)). +* *A slight change in behaviour of a new function.* Return unquoted string in JSON_VALUE. Closes [#27965](https://github.com/ClickHouse/ClickHouse/issues/27965). [#31008](https://github.com/ClickHouse/ClickHouse/pull/31008) ([Kseniia Sumarokova](https://github.com/kssenii)). +* *Setting rename.* Add custom null representation support for TSV/CSV input formats. Fix deserialing Nullable(String) in TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow input formats. Rename `output_format_csv_null_representation` and `output_format_tsv_null_representation` to `format_csv_null_representation` and `format_tsv_null_representation` accordingly. [#30497](https://github.com/ClickHouse/ClickHouse/pull/30497) ([Kruglov Pavel](https://github.com/Avogar)). +* *Further deprecation of already unused code.* This is relevant only for users of ClickHouse versions older than 20.6. A "leader election" mechanism is removed from `ReplicatedMergeTree`, because multiple leaders are supported since 20.6. If you are upgrading from an older version and some replica with an old version is a leader, then server will fail to start after upgrade. Stop replicas with old version to make new version start. After that it will not be possible to downgrade to version older than 20.6. [#32140](https://github.com/ClickHouse/ClickHouse/pull/32140) ([tavplubix](https://github.com/tavplubix)). + +#### New Feature + +* Implemented more of the ZooKeeper Four Letter Words commands in clickhouse-keeper: https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html#sc_zkCommands. [#28981](https://github.com/ClickHouse/ClickHouse/pull/28981) ([JackyWoo](https://github.com/JackyWoo)). Now `clickhouse-keeper` is feature complete. +* Support for `Bool` data type. [#31072](https://github.com/ClickHouse/ClickHouse/pull/31072) ([kevin wan](https://github.com/MaxWk)). +* Support for `PARTITION BY` in File, URL, HDFS storages and with `INSERT INTO` table function. Closes [#30273](https://github.com/ClickHouse/ClickHouse/issues/30273). [#30690](https://github.com/ClickHouse/ClickHouse/pull/30690) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `CONSTRAINT ... ASSUME ...` (without checking during `INSERT`). Added query transformation to CNF (https://github.com/ClickHouse/ClickHouse/issues/11749) for more convenient optimization. Added simple query rewriting using constraints (only simple matching now, will be improved to support <,=,>... later). Added ability to replace heavy columns with light columns if it's possible. [#18787](https://github.com/ClickHouse/ClickHouse/pull/18787) ([Nikita Vasilev](https://github.com/nikvas0)). +* Basic access authentication for http/url functions. [#31648](https://github.com/ClickHouse/ClickHouse/pull/31648) ([michael1589](https://github.com/michael1589)). +* Support `INTERVAL` type in `STEP` clause for `WITH FILL` modifier. [#30927](https://github.com/ClickHouse/ClickHouse/pull/30927) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for parallel reading from multiple files and support globs in `FROM INFILE` clause. [#30135](https://github.com/ClickHouse/ClickHouse/pull/30135) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add support for `Identifier` table and database query parameters. Closes [#27226](https://github.com/ClickHouse/ClickHouse/issues/27226). [#28668](https://github.com/ClickHouse/ClickHouse/pull/28668) ([Nikolay Degterinsky](https://github.com/evillique)). +* *TLDR: Major improvements of completeness and consistency of text formats.* Refactor formats `TSV`, `TSVRaw`, `CSV` and `JSONCompactEachRow`, `JSONCompactStringsEachRow`, remove code duplication, add base interface for formats with `-WithNames` and `-WithNamesAndTypes` suffixes. Add formats `CSVWithNamesAndTypes`, `TSVRawWithNames`, `TSVRawWithNamesAndTypes`, `JSONCompactEachRowWIthNames`, `JSONCompactStringsEachRowWIthNames`, `RowBinaryWithNames`. Support parallel parsing for formats `TSVWithNamesAndTypes`, `TSVRaw(WithNames/WIthNamesAndTypes)`, `CSVWithNamesAndTypes`, `JSONCompactEachRow(WithNames/WIthNamesAndTypes)`, `JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes)`. Support columns mapping and types checking for `RowBinaryWithNamesAndTypes` format. Add setting `input_format_with_types_use_header` which specify if we should check that types written in `WIthNamesAndTypes` format matches with table structure. Add setting `input_format_csv_empty_as_default` and use it in CSV format instead of `input_format_defaults_for_omitted_fields` (because this setting should not control `csv_empty_as_default`). Fix usage of setting `input_format_defaults_for_omitted_fields` (it was used only as `csv_empty_as_default`, but it should control calculation of default expressions for omitted fields). Fix Nullable input/output in `TSVRaw` format, make this format fully compatible with inserting into TSV. Fix inserting NULLs in `LowCardinality(Nullable)` when `input_format_null_as_default` is enabled (previously default values was inserted instead of actual NULLs). Fix strings deserialization in `JSONStringsEachRow`/`JSONCompactStringsEachRow` formats (strings were parsed just until first '\n' or '\t'). Add ability to use `Raw` escaping rule in Template input format. Add diagnostic info for JSONCompactEachRow(WithNames/WIthNamesAndTypes) input format. Fix bug with parallel parsing of `-WithNames` formats in case when setting `min_chunk_bytes_for_parallel_parsing` is less than bytes in a single row. [#30178](https://github.com/ClickHouse/ClickHouse/pull/30178) ([Kruglov Pavel](https://github.com/Avogar)). Allow to print/parse names and types of colums in `CustomSeparated` input/output format. Add formats `CustomSeparatedWithNames/WithNamesAndTypes` similar to `TSVWithNames/WithNamesAndTypes`. [#31434](https://github.com/ClickHouse/ClickHouse/pull/31434) ([Kruglov Pavel](https://github.com/Avogar)). +* Aliyun OSS Storage support. [#31286](https://github.com/ClickHouse/ClickHouse/pull/31286) ([cfcz48](https://github.com/cfcz48)). +* Exposes all settings of the global thread pool in the configuration file. [#31285](https://github.com/ClickHouse/ClickHouse/pull/31285) ([Tomáš Hromada](https://github.com/gyfis)). +* Introduced window functions `exponentialTimeDecayedSum`, `exponentialTimeDecayedMax`, `exponentialTimeDecayedCount` and `exponentialTimeDecayedAvg` which are more effective than `exponentialMovingAverage` for bigger windows. Also more use-cases were covered. [#29799](https://github.com/ClickHouse/ClickHouse/pull/29799) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add option to compress logs before writing them to a file using LZ4. Closes [#23860](https://github.com/ClickHouse/ClickHouse/issues/23860). [#29219](https://github.com/ClickHouse/ClickHouse/pull/29219) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `JOIN ON 1 = 1` that have CROSS JOIN semantic. This closes [#25578](https://github.com/ClickHouse/ClickHouse/issues/25578). [#25894](https://github.com/ClickHouse/ClickHouse/pull/25894) ([Vladimir C](https://github.com/vdimir)). +* Add Map combinator for `Map` type. - Rename old `sum-, min-, max- Map` for mapped arrays to `sum-, min-, max- MappedArrays`. [#24539](https://github.com/ClickHouse/ClickHouse/pull/24539) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Make reading from HTTP retriable. Closes [#29696](https://github.com/ClickHouse/ClickHouse/issues/29696). [#29894](https://github.com/ClickHouse/ClickHouse/pull/29894) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Experimental Feature + +* `WINDOW VIEW` to enable stream processing in ClickHouse. [#8331](https://github.com/ClickHouse/ClickHouse/pull/8331) ([vxider](https://github.com/Vxider)). +* Drop support for using Ordinary databases with `MaterializedMySQL`. [#31292](https://github.com/ClickHouse/ClickHouse/pull/31292) ([Stig Bakken](https://github.com/stigsb)). +* Implement the commands BACKUP and RESTORE for the Log family. This feature is under development. [#30688](https://github.com/ClickHouse/ClickHouse/pull/30688) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Performance Improvement + +* Reduce memory usage when reading with `s3` / `url` / `hdfs` formats `Parquet`, `ORC`, `Arrow` (controlled by setting `input_format_allow_seeks`, enabled by default). Also add setting `remote_read_min_bytes_for_seek` to control seeks. Closes [#10461](https://github.com/ClickHouse/ClickHouse/issues/10461). Closes [#16857](https://github.com/ClickHouse/ClickHouse/issues/16857). [#30936](https://github.com/ClickHouse/ClickHouse/pull/30936) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add optimizations for constant conditions in JOIN ON, ref [#26928](https://github.com/ClickHouse/ClickHouse/issues/26928). [#27021](https://github.com/ClickHouse/ClickHouse/pull/27021) ([Vladimir C](https://github.com/vdimir)). +* Support parallel formatting for all text formats, except `JSONEachRowWithProgress` and `PrettyCompactMonoBlock`. [#31489](https://github.com/ClickHouse/ClickHouse/pull/31489) ([Kruglov Pavel](https://github.com/Avogar)). +* Speed up count over nullable columns. [#31806](https://github.com/ClickHouse/ClickHouse/pull/31806) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up `avg` and `sumCount` aggregate functions. [#31694](https://github.com/ClickHouse/ClickHouse/pull/31694) ([Raúl Marín](https://github.com/Algunenano)). +* Improve performance of JSON and XML output formats. [#31673](https://github.com/ClickHouse/ClickHouse/pull/31673) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of syncing data to block device. This closes [#31181](https://github.com/ClickHouse/ClickHouse/issues/31181). [#31229](https://github.com/ClickHouse/ClickHouse/pull/31229) ([zhanglistar](https://github.com/zhanglistar)). +* Fixing query performance issue in `LiveView` tables. Fixes [#30831](https://github.com/ClickHouse/ClickHouse/issues/30831). [#31006](https://github.com/ClickHouse/ClickHouse/pull/31006) ([vzakaznikov](https://github.com/vzakaznikov)). +* Speed up query parsing. [#31949](https://github.com/ClickHouse/ClickHouse/pull/31949) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to split `GraphiteMergeTree` rollup rules for plain/tagged metrics (optional `rule_type` field). [#25122](https://github.com/ClickHouse/ClickHouse/pull/25122) ([Michail Safronov](https://github.com/msaf1980)). +* Remove excessive `DESC TABLE` requests for `remote()` (in case of `remote('127.1', system.one)` (i.e. identifier as the db.table instead of string) there was excessive `DESC TABLE` request). [#32019](https://github.com/ClickHouse/ClickHouse/pull/32019) ([Azat Khuzhin](https://github.com/azat)). +* Optimize function `tupleElement` to reading of subcolumn with enabled setting `optimize_functions_to_subcolumns`. [#31261](https://github.com/ClickHouse/ClickHouse/pull/31261) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize function `mapContains` to reading of subcolumn `key` with enabled settings `optimize_functions_to_subcolumns`. [#31218](https://github.com/ClickHouse/ClickHouse/pull/31218) ([Anton Popov](https://github.com/CurtizJ)). +* Add settings `merge_tree_min_rows_for_concurrent_read_for_remote_filesystem` and `merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem`. [#30970](https://github.com/ClickHouse/ClickHouse/pull/30970) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Skipping mutations of different partitions in `StorageMergeTree`. [#21326](https://github.com/ClickHouse/ClickHouse/pull/21326) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Improvement + +* Do not allow to drop a table or dictionary if some tables or dictionaries depend on it. [#30977](https://github.com/ClickHouse/ClickHouse/pull/30977) ([tavplubix](https://github.com/tavplubix)). +* Allow versioning of aggregate function states. Now we can introduce backward compatible changes in serialization format of aggregate function states. Closes [#12552](https://github.com/ClickHouse/ClickHouse/issues/12552). [#24820](https://github.com/ClickHouse/ClickHouse/pull/24820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support PostgreSQL style `ALTER MODIFY COLUMN` syntax. [#32003](https://github.com/ClickHouse/ClickHouse/pull/32003) ([SuperDJY](https://github.com/cmsxbc)). +* Added `update_field` support for `RangeHashedDictionary`, `ComplexKeyRangeHashedDictionary`. [#32185](https://github.com/ClickHouse/ClickHouse/pull/32185) ([Maksim Kita](https://github.com/kitaisreal)). +* The `murmurHash3_128` and `sipHash128` functions now accept an arbitrary number of arguments. This closes [#28774](https://github.com/ClickHouse/ClickHouse/issues/28774). [#28965](https://github.com/ClickHouse/ClickHouse/pull/28965) ([小路](https://github.com/nicelulu)). +* Support default expression for `HDFS` storage and optimize fetching when source is column oriented. [#32256](https://github.com/ClickHouse/ClickHouse/pull/32256) ([李扬](https://github.com/taiyang-li)). +* Improve the operation name of an opentelemetry span. [#32234](https://github.com/ClickHouse/ClickHouse/pull/32234) ([Frank Chen](https://github.com/FrankChen021)). +* Use `Content-Type: application/x-ndjson` (http://ndjson.org/) for output format `JSONEachRow`. [#32223](https://github.com/ClickHouse/ClickHouse/pull/32223) ([Dmitriy Dorofeev](https://github.com/deem0n)). +* Improve skipping unknown fields with quoted escaping rule in Template/CustomSeparated formats. Previously you could skip only quoted strings, now you can skip values with any type. [#32204](https://github.com/ClickHouse/ClickHouse/pull/32204) ([Kruglov Pavel](https://github.com/Avogar)). +* Now `clickhouse-keeper` refuses to start or apply configuration changes when they contain duplicated IDs or endpoints. Fixes [#31339](https://github.com/ClickHouse/ClickHouse/issues/31339). [#32121](https://github.com/ClickHouse/ClickHouse/pull/32121) ([alesapin](https://github.com/alesapin)). +* Set Content-Type in HTTP packets issued from URL engine. [#32113](https://github.com/ClickHouse/ClickHouse/pull/32113) ([Frank Chen](https://github.com/FrankChen021)). +* Return Content-Type as 'application/json' for `JSONEachRow` format if `output_format_json_array_of_rows` is enabled. [#32112](https://github.com/ClickHouse/ClickHouse/pull/32112) ([Frank Chen](https://github.com/FrankChen021)). +* Allow to parse `+` before `Float32`/`Float64` values. [#32079](https://github.com/ClickHouse/ClickHouse/pull/32079) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow a user configured `hdfs_replication` parameter for `DiskHDFS` and `StorageHDFS`. Closes [#32039](https://github.com/ClickHouse/ClickHouse/issues/32039). [#32049](https://github.com/ClickHouse/ClickHouse/pull/32049) ([leosunli](https://github.com/leosunli)). +* Added ClickHouse `exception` and `exception_code` fields to opentelemetry span log. [#32040](https://github.com/ClickHouse/ClickHouse/pull/32040) ([Frank Chen](https://github.com/FrankChen021)). +* Improve opentelemetry span log duration - it was is zero at the query level if there is a query exception. [#32038](https://github.com/ClickHouse/ClickHouse/pull/32038) ([Frank Chen](https://github.com/FrankChen021)). +* Fix the issue that `LowCardinality` of `Int256` cannot be created. [#31832](https://github.com/ClickHouse/ClickHouse/pull/31832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Recreate `system.*_log` tables in case of different engine/partition_by. [#31824](https://github.com/ClickHouse/ClickHouse/pull/31824) ([Azat Khuzhin](https://github.com/azat)). +* `MaterializedMySQL`: Fix issue with table named 'table'. [#31781](https://github.com/ClickHouse/ClickHouse/pull/31781) ([Håvard Kvålen](https://github.com/havardk)). +* ClickHouse dictionary source: support predefined connections. Closes [#31705](https://github.com/ClickHouse/ClickHouse/issues/31705). [#31749](https://github.com/ClickHouse/ClickHouse/pull/31749) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to use predefined connections configuration for Kafka and RabbitMQ engines (the same way as for other integration table engines). [#31691](https://github.com/ClickHouse/ClickHouse/pull/31691) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Always re-render prompt while navigating history in clickhouse-client. This will improve usability of manipulating very long queries that don't fit on screen. [#31675](https://github.com/ClickHouse/ClickHouse/pull/31675) ([alexey-milovidov](https://github.com/alexey-milovidov)) (author: Amos Bird). +* Add key bindings for navigating through history (instead of lines/history). [#31641](https://github.com/ClickHouse/ClickHouse/pull/31641) ([Azat Khuzhin](https://github.com/azat)). +* Improve the `max_execution_time` checks. Fixed some cases when timeout checks do not happen and query could run too long. [#31636](https://github.com/ClickHouse/ClickHouse/pull/31636) ([Raúl Marín](https://github.com/Algunenano)). +* Better exception message when `users.xml` cannot be loaded due to bad password hash. This closes [#24126](https://github.com/ClickHouse/ClickHouse/issues/24126). [#31557](https://github.com/ClickHouse/ClickHouse/pull/31557) ([Vitaly Baranov](https://github.com/vitlibar)). +* Use shard and replica name from `Replicated` database arguments when expanding macros in `ReplicatedMergeTree` arguments if these macros are not defined in config. Closes [#31471](https://github.com/ClickHouse/ClickHouse/issues/31471). [#31488](https://github.com/ClickHouse/ClickHouse/pull/31488) ([tavplubix](https://github.com/tavplubix)). +* Better analysis for `min/max/count` projection. Now, with enabled `allow_experimental_projection_optimization`, virtual `min/max/count` projection can be used together with columns from partition key. [#31474](https://github.com/ClickHouse/ClickHouse/pull/31474) ([Amos Bird](https://github.com/amosbird)). +* Add `--pager` support for `clickhouse-local`. [#31457](https://github.com/ClickHouse/ClickHouse/pull/31457) ([Azat Khuzhin](https://github.com/azat)). +* Fix waiting of the editor during interactive query edition (`waitpid()` returns -1 on `SIGWINCH` and `EDITOR` and `clickhouse-local`/`clickhouse-client` works concurrently). [#31456](https://github.com/ClickHouse/ClickHouse/pull/31456) ([Azat Khuzhin](https://github.com/azat)). +* Throw an exception if there is some garbage after field in `JSONCompactStrings(EachRow)` format. [#31455](https://github.com/ClickHouse/ClickHouse/pull/31455) ([Kruglov Pavel](https://github.com/Avogar)). +* Default value of `http_send_timeout` and `http_receive_timeout` settings changed from 1800 (30 minutes) to 180 (3 minutes). [#31450](https://github.com/ClickHouse/ClickHouse/pull/31450) ([tavplubix](https://github.com/tavplubix)). +* `MaterializedMySQL` now handles `CREATE TABLE ... LIKE ...` DDL queries. [#31410](https://github.com/ClickHouse/ClickHouse/pull/31410) ([Stig Bakken](https://github.com/stigsb)). +* Return artificial create query when executing `show create table` on system's tables. [#31391](https://github.com/ClickHouse/ClickHouse/pull/31391) ([SuperDJY](https://github.com/cmsxbc)). +* Previously progress was shown only for `numbers` table function. Now for `numbers_mt` it is also shown. [#31318](https://github.com/ClickHouse/ClickHouse/pull/31318) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Initial user's roles are used now to find row policies, see [#31080](https://github.com/ClickHouse/ClickHouse/issues/31080). [#31262](https://github.com/ClickHouse/ClickHouse/pull/31262) ([Vitaly Baranov](https://github.com/vitlibar)). +* If some obsolete setting is changed - show warning in `system.warnings`. [#31252](https://github.com/ClickHouse/ClickHouse/pull/31252) ([tavplubix](https://github.com/tavplubix)). +* Improved backoff for background cleanup tasks in `MergeTree`. Settings `merge_tree_clear_old_temporary_directories_interval_seconds` and `merge_tree_clear_old_parts_interval_seconds` moved from users settings to merge tree settings. [#31180](https://github.com/ClickHouse/ClickHouse/pull/31180) ([tavplubix](https://github.com/tavplubix)). +* Now every replica will send to client only incremental information about profile events counters. [#31155](https://github.com/ClickHouse/ClickHouse/pull/31155) ([Dmitry Novik](https://github.com/novikd)). This makes `--hardware_utilization` option in `clickhouse-client` usable. +* Enable multiline editing in clickhouse-client by default. This addresses [#31121](https://github.com/ClickHouse/ClickHouse/issues/31121) . [#31123](https://github.com/ClickHouse/ClickHouse/pull/31123) ([Amos Bird](https://github.com/amosbird)). +* Function name normalization for `ALTER` queries. This helps avoid metadata mismatch between creating table with indices/projections and adding indices/projections via alter commands. This is a follow-up PR of https://github.com/ClickHouse/ClickHouse/pull/20174. Mark as improvements as there are no bug reports and the senario is somehow rare. [#31095](https://github.com/ClickHouse/ClickHouse/pull/31095) ([Amos Bird](https://github.com/amosbird)). +* Support `IF EXISTS` modifier for `RENAME DATABASE`/`TABLE`/`DICTIONARY` query. If this directive is used, one will not get an error if the DATABASE/TABLE/DICTIONARY to be renamed doesn't exist. [#31081](https://github.com/ClickHouse/ClickHouse/pull/31081) ([victorgao](https://github.com/kafka1991)). +* Cancel vertical merges when partition is dropped. This is a follow-up of https://github.com/ClickHouse/ClickHouse/pull/25684 and https://github.com/ClickHouse/ClickHouse/pull/30996. [#31057](https://github.com/ClickHouse/ClickHouse/pull/31057) ([Amos Bird](https://github.com/amosbird)). +* The local session inside a ClickHouse dictionary source won't send its events to the session log anymore. This fixes a possible deadlock (tsan alert) on shutdown. Also this PR fixes flaky `test_dictionaries_dependency_xml/`. [#31013](https://github.com/ClickHouse/ClickHouse/pull/31013) ([Vitaly Baranov](https://github.com/vitlibar)). +* Less locking in ALTER command. [#31010](https://github.com/ClickHouse/ClickHouse/pull/31010) ([Amos Bird](https://github.com/amosbird)). +* Fix `--verbose` option in clickhouse-local interactive mode and allow logging into file. [#30881](https://github.com/ClickHouse/ClickHouse/pull/30881) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `\l`, `\d`, `\c` commands in `clickhouse-client` like in MySQL and PostgreSQL. [#30876](https://github.com/ClickHouse/ClickHouse/pull/30876) ([Pavel Medvedev](https://github.com/pmed)). +* For clickhouse-local or clickhouse-client: if there is `--interactive` option with `--query` or `--queries-file`, then first execute them like in non-interactive and then start interactive mode. [#30851](https://github.com/ClickHouse/ClickHouse/pull/30851) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible "The local set of parts of X doesn't look like the set of parts in ZooKeeper" error (if DROP fails during removing znodes from zookeeper). [#30826](https://github.com/ClickHouse/ClickHouse/pull/30826) ([Azat Khuzhin](https://github.com/azat)). +* Avro format works against Kafka. Setting `output_format_avro_rows_in_file` added. [#30351](https://github.com/ClickHouse/ClickHouse/pull/30351) ([Ilya Golshtein](https://github.com/ilejn)). +* Allow to specify one or any number of PostgreSQL schemas for one `MaterializedPostgreSQL` database. Closes [#28901](https://github.com/ClickHouse/ClickHouse/issues/28901). Closes [#29324](https://github.com/ClickHouse/ClickHouse/issues/29324). [#28933](https://github.com/ClickHouse/ClickHouse/pull/28933) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Replaced default ports for clickhouse-keeper internal communication from 44444 to 9234. Fixes [#30879](https://github.com/ClickHouse/ClickHouse/issues/30879). [#31799](https://github.com/ClickHouse/ClickHouse/pull/31799) ([alesapin](https://github.com/alesapin)). +* Implement function transform with Decimal arguments. [#31839](https://github.com/ClickHouse/ClickHouse/pull/31839) ([李帅](https://github.com/loneylee)). +* Fix abort in debug server and `DB::Exception: std::out_of_range: basic_string` error in release server in case of bad hdfs url by adding additional check of hdfs url structure. [#31042](https://github.com/ClickHouse/ClickHouse/pull/31042) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible assert in `hdfs` table function/engine, add test. [#31036](https://github.com/ClickHouse/ClickHouse/pull/31036) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fixes + +* Fix group by / order by / limit by aliases with positional arguments enabled. Closes [#31173](https://github.com/ClickHouse/ClickHouse/issues/31173). [#31741](https://github.com/ClickHouse/ClickHouse/pull/31741) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix usage of `Buffer` table engine with type `Map`. Fixes [#30546](https://github.com/ClickHouse/ClickHouse/issues/30546). [#31742](https://github.com/ClickHouse/ClickHouse/pull/31742) ([Anton Popov](https://github.com/CurtizJ)). +* Fix reading from `MergeTree` tables with enabled `use_uncompressed_cache`. [#31826](https://github.com/ClickHouse/ClickHouse/pull/31826) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the behavior when mutations that have nothing to do are stuck (with enabled setting `empty_result_for_aggregation_by_empty_set`). [#32358](https://github.com/ClickHouse/ClickHouse/pull/32358) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix skipping columns while writing protobuf. This PR fixes [#31160](https://github.com/ClickHouse/ClickHouse/issues/31160), see the comment [#31160](https://github.com/ClickHouse/ClickHouse/issues/31160)#issuecomment-980595318. [#31988](https://github.com/ClickHouse/ClickHouse/pull/31988) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix bug when remove unneeded columns in subquery. If there is an aggregation function in query without group by, do not remove if it is unneeded. [#32289](https://github.com/ClickHouse/ClickHouse/pull/32289) ([dongyifeng](https://github.com/dyf6372)). +* Quota limit was not reached, but the limit was exceeded. This PR fixes [#31174](https://github.com/ClickHouse/ClickHouse/issues/31174). [#31337](https://github.com/ClickHouse/ClickHouse/pull/31337) ([sunny](https://github.com/sunny19930321)). +* Fix SHOW GRANTS when partial revokes are used. This PR fixes [#31138](https://github.com/ClickHouse/ClickHouse/issues/31138). [#31249](https://github.com/ClickHouse/ClickHouse/pull/31249) ([Vitaly Baranov](https://github.com/vitlibar)). +* Memory amount was incorrectly estimated when ClickHouse is run in containers with cgroup limits. [#31157](https://github.com/ClickHouse/ClickHouse/pull/31157) ([Pavel Medvedev](https://github.com/pmed)). +* Fix `ALTER ... MATERIALIZE COLUMN ...` queries in case when data type of default expression is not equal to the data type of column. [#32348](https://github.com/ClickHouse/ClickHouse/pull/32348) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed crash with SIGFPE in aggregate function `avgWeighted` with `Decimal` argument. Fixes [#32053](https://github.com/ClickHouse/ClickHouse/issues/32053). [#32303](https://github.com/ClickHouse/ClickHouse/pull/32303) ([tavplubix](https://github.com/tavplubix)). +* Server might fail to start with `Cannot attach 1 tables due to cyclic dependencies` error if `Dictionary` table looks at XML-dictionary with the same name, it's fixed. Fixes [#31315](https://github.com/ClickHouse/ClickHouse/issues/31315). [#32288](https://github.com/ClickHouse/ClickHouse/pull/32288) ([tavplubix](https://github.com/tavplubix)). +* Fix parsing error while NaN deserializing for `Nullable(Float)` for `Quoted` escaping rule. [#32190](https://github.com/ClickHouse/ClickHouse/pull/32190) ([Kruglov Pavel](https://github.com/Avogar)). +* XML dictionaries: identifiers, used in table create query, can be qualified to `default_database` during upgrade to newer version. Closes [#31963](https://github.com/ClickHouse/ClickHouse/issues/31963). [#32187](https://github.com/ClickHouse/ClickHouse/pull/32187) ([Maksim Kita](https://github.com/kitaisreal)). +* Number of active replicas might be determined incorrectly when inserting with quorum if setting `replicated_can_become_leader` is disabled on some replicas. It's fixed. [#32157](https://github.com/ClickHouse/ClickHouse/pull/32157) ([tavplubix](https://github.com/tavplubix)). +* Dictionaries: fix cases when `{condition}` does not work for custom database queries. [#32117](https://github.com/ClickHouse/ClickHouse/pull/32117) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `CAST` from `Nullable` with `cast_keep_nullable` (`PARAMETER_OUT_OF_BOUND` error before for i.e. `toUInt32OrDefault(toNullable(toUInt32(1)))`). [#32080](https://github.com/ClickHouse/ClickHouse/pull/32080) ([Azat Khuzhin](https://github.com/azat)). +* Fix CREATE TABLE of Join Storage in some obscure cases. Close [#31680](https://github.com/ClickHouse/ClickHouse/issues/31680). [#32066](https://github.com/ClickHouse/ClickHouse/pull/32066) ([SuperDJY](https://github.com/cmsxbc)). +* Fixed `Directory ... already exists and is not empty` error when detaching part. [#32063](https://github.com/ClickHouse/ClickHouse/pull/32063) ([tavplubix](https://github.com/tavplubix)). +* `MaterializedMySQL` (experimental feature): Fix misinterpretation of `DECIMAL` data from MySQL. [#31990](https://github.com/ClickHouse/ClickHouse/pull/31990) ([Håvard Kvålen](https://github.com/havardk)). +* `FileLog` (experimental feature) engine unnesessary created meta data directory when create table failed. Fix [#31962](https://github.com/ClickHouse/ClickHouse/issues/31962). [#31967](https://github.com/ClickHouse/ClickHouse/pull/31967) ([flynn](https://github.com/ucasfl)). +* Some `GET_PART` entry might hang in replication queue if part is lost on all replicas and there are no other parts in the same partition. It's fixed in cases when partition key contains only columns of integer types or `Date[Time]`. Fixes [#31485](https://github.com/ClickHouse/ClickHouse/issues/31485). [#31887](https://github.com/ClickHouse/ClickHouse/pull/31887) ([tavplubix](https://github.com/tavplubix)). +* Fix functions `empty` and `notEmpty` with arguments of `UUID` type. Fixes [#31819](https://github.com/ClickHouse/ClickHouse/issues/31819). [#31883](https://github.com/ClickHouse/ClickHouse/pull/31883) ([Anton Popov](https://github.com/CurtizJ)). +* Change configuration path from `keeper_server.session_timeout_ms` to `keeper_server.coordination_settings.session_timeout_ms` when constructing a `KeeperTCPHandler`. Same with `operation_timeout`. [#31859](https://github.com/ClickHouse/ClickHouse/pull/31859) ([JackyWoo](https://github.com/JackyWoo)). +* Fix invalid cast of Nullable type when nullable primary key is used. (Nullable primary key is a discouraged feature - please do not use). This fixes [#31075](https://github.com/ClickHouse/ClickHouse/issues/31075). [#31823](https://github.com/ClickHouse/ClickHouse/pull/31823) ([Amos Bird](https://github.com/amosbird)). +* Fix crash in recursive UDF in SQL. Closes [#30856](https://github.com/ClickHouse/ClickHouse/issues/30856). [#31820](https://github.com/ClickHouse/ClickHouse/pull/31820) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash when function `dictGet` with type is used for dictionary attribute when type is `Nullable`. Fixes [#30980](https://github.com/ClickHouse/ClickHouse/issues/30980). [#31800](https://github.com/ClickHouse/ClickHouse/pull/31800) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash with empty result of ODBC query (with some ODBC drivers). Closes [#31465](https://github.com/ClickHouse/ClickHouse/issues/31465). [#31766](https://github.com/ClickHouse/ClickHouse/pull/31766) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix disabling query profiler (In case of `query_profiler_real_time_period_ns>0`/`query_profiler_cpu_time_period_ns>0` query profiler can stayed enabled even after query finished). [#31740](https://github.com/ClickHouse/ClickHouse/pull/31740) ([Azat Khuzhin](https://github.com/azat)). +* Fixed rare segfault on concurrent `ATTACH PARTITION` queries. [#31738](https://github.com/ClickHouse/ClickHouse/pull/31738) ([tavplubix](https://github.com/tavplubix)). +* Fix race in JSONEachRowWithProgress output format when data and lines with progress are mixed in output. [#31736](https://github.com/ClickHouse/ClickHouse/pull/31736) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed `there are no such cluster here` error on execution of `ON CLUSTER` query if specified cluster name is name of `Replicated` database. [#31723](https://github.com/ClickHouse/ClickHouse/pull/31723) ([tavplubix](https://github.com/tavplubix)). +* Fix exception on some of the applications of `decrypt` function on Nullable columns. This closes [#31662](https://github.com/ClickHouse/ClickHouse/issues/31662). This closes [#31426](https://github.com/ClickHouse/ClickHouse/issues/31426). [#31707](https://github.com/ClickHouse/ClickHouse/pull/31707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function ngrams when string contains UTF-8 characters. [#31706](https://github.com/ClickHouse/ClickHouse/pull/31706) ([yandd](https://github.com/yandd)). +* Settings `input_format_allow_errors_num` and `input_format_allow_errors_ratio` did not work for parsing of domain types, such as `IPv4`, it's fixed. Fixes [#31686](https://github.com/ClickHouse/ClickHouse/issues/31686). [#31697](https://github.com/ClickHouse/ClickHouse/pull/31697) ([tavplubix](https://github.com/tavplubix)). +* Fixed null pointer exception in `MATERIALIZE COLUMN`. [#31679](https://github.com/ClickHouse/ClickHouse/pull/31679) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `RENAME TABLE` query worked incorrectly on attempt to rename an DDL dictionary in `Ordinary` database, it's fixed. [#31638](https://github.com/ClickHouse/ClickHouse/pull/31638) ([tavplubix](https://github.com/tavplubix)). +* Implement `sparkbar` aggregate function as it was intended, see: [#26175](https://github.com/ClickHouse/ClickHouse/issues/26175)#issuecomment-960353867, [comment](https://github.com/ClickHouse/ClickHouse/issues/26175#issuecomment-961155065). [#31624](https://github.com/ClickHouse/ClickHouse/pull/31624) ([小路](https://github.com/nicelulu)). +* Fix invalid generated JSON when only column names contain invalid UTF-8 sequences. [#31534](https://github.com/ClickHouse/ClickHouse/pull/31534) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Disable `partial_merge_join_left_table_buffer_bytes` before bug in this optimization is fixed. See [#31009](https://github.com/ClickHouse/ClickHouse/issues/31009)). Remove redundant option `partial_merge_join_optimizations`. [#31528](https://github.com/ClickHouse/ClickHouse/pull/31528) ([Vladimir C](https://github.com/vdimir)). +* Fix progress for short `INSERT SELECT` queries. [#31510](https://github.com/ClickHouse/ClickHouse/pull/31510) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong behavior with group by and positional arguments. Closes [#31280](https://github.com/ClickHouse/ClickHouse/issues/31280)#issuecomment-968696186. [#31420](https://github.com/ClickHouse/ClickHouse/pull/31420) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Resolve `nullptr` in STS credentials provider for S3. [#31409](https://github.com/ClickHouse/ClickHouse/pull/31409) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Remove `notLike` function from index analysis, because it was wrong. [#31169](https://github.com/ClickHouse/ClickHouse/pull/31169) ([sundyli](https://github.com/sundy-li)). +* Fix bug in Keeper which can lead to inability to start when some coordination logs was lost and we have more fresh snapshot than our latest log. [#31150](https://github.com/ClickHouse/ClickHouse/pull/31150) ([alesapin](https://github.com/alesapin)). +* Rewrite right distributed table in local join. solves [#25809](https://github.com/ClickHouse/ClickHouse/issues/25809). [#31105](https://github.com/ClickHouse/ClickHouse/pull/31105) ([abel-cheng](https://github.com/abel-cheng)). +* Fix `Merge` table with aliases and where (it did not work before at all). Closes [#28802](https://github.com/ClickHouse/ClickHouse/issues/28802). [#31044](https://github.com/ClickHouse/ClickHouse/pull/31044) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix JSON_VALUE/JSON_QUERY with quoted identifiers. This allows to have spaces in json path. Closes [#30971](https://github.com/ClickHouse/ClickHouse/issues/30971). [#31003](https://github.com/ClickHouse/ClickHouse/pull/31003) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Using `formatRow` function with not row-oriented formats led to segfault. Don't allow to use this function with such formats (because it doesn't make sense). [#31001](https://github.com/ClickHouse/ClickHouse/pull/31001) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug which broke select queries if they happened after dropping materialized view. Found in [#30691](https://github.com/ClickHouse/ClickHouse/issues/30691). [#30997](https://github.com/ClickHouse/ClickHouse/pull/30997) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Skip `max_partition_size_to_drop check` in case of ATTACH PARTITION ... FROM and MOVE PARTITION ... [#30995](https://github.com/ClickHouse/ClickHouse/pull/30995) ([Amr Alaa](https://github.com/amralaa-MSFT)). +* Fix some corner cases with `INTERSECT` and `EXCEPT` operators. Closes [#30803](https://github.com/ClickHouse/ClickHouse/issues/30803). [#30965](https://github.com/ClickHouse/ClickHouse/pull/30965) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement + +* Fix incorrect filtering result on non-x86 builds. This closes [#31417](https://github.com/ClickHouse/ClickHouse/issues/31417). This closes [#31524](https://github.com/ClickHouse/ClickHouse/issues/31524). [#31574](https://github.com/ClickHouse/ClickHouse/pull/31574) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make ClickHouse build fully reproducible (byte identical on different machines). This closes [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#31899](https://github.com/ClickHouse/ClickHouse/pull/31899) ([alexey-milovidov](https://github.com/alexey-milovidov)). Remove filesystem path to the build directory from binaries to enable reproducible builds. This needed for [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#31838](https://github.com/ClickHouse/ClickHouse/pull/31838) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Use our own CMakeLists for `zlib-ng`, `cassandra`, `mariadb-connector-c` and `xz`, `re2`, `sentry`, `gsasl`, `arrow`, `protobuf`. This is needed for [#20151](https://github.com/ClickHouse/ClickHouse/issues/20151). Part of [#9226](https://github.com/ClickHouse/ClickHouse/issues/9226). A small step towards removal of annoying trash from the build system. [#30599](https://github.com/ClickHouse/ClickHouse/pull/30599) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Hermetic builds: use fixed version of libc and make sure that no source or binary files from the host OS are using during build. This closes [#27133](https://github.com/ClickHouse/ClickHouse/issues/27133). This closes [#21435](https://github.com/ClickHouse/ClickHouse/issues/21435). This closes [#30462](https://github.com/ClickHouse/ClickHouse/issues/30462). [#30011](https://github.com/ClickHouse/ClickHouse/pull/30011) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adding function `getFuzzerData()` to easily fuzz particular functions. This closes [#23227](https://github.com/ClickHouse/ClickHouse/issues/23227). [#27526](https://github.com/ClickHouse/ClickHouse/pull/27526) ([Alexey Boykov](https://github.com/mathalex)). +* More correct setting up capabilities inside Docker. [#31802](https://github.com/ClickHouse/ClickHouse/pull/31802) ([Constantine Peresypkin](https://github.com/pkit)). +* Enable clang `-fstrict-vtable-pointers`, `-fwhole-program-vtables` compile options. [#20151](https://github.com/ClickHouse/ClickHouse/pull/20151) ([Maksim Kita](https://github.com/kitaisreal)). +* Avoid downloading toolchain tarballs for cross-compiling for FreeBSD. [#31672](https://github.com/ClickHouse/ClickHouse/pull/31672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Initial support for risc-v. See development/build-cross-riscv for quirks and build command that was tested. [#31309](https://github.com/ClickHouse/ClickHouse/pull/31309) ([Vladimir Smirnov](https://github.com/Civil)). +* Support compile in arm machine with parameter "-DENABLE_TESTS=OFF". [#31007](https://github.com/ClickHouse/ClickHouse/pull/31007) ([zhanghuajie](https://github.com/zhanghuajieHIT)). + + +### ClickHouse release v21.11, 2021-11-09 + +#### Backward Incompatible Change + +* Change order of json_path and json arguments in SQL/JSON functions (to be consistent with the standard). Closes [#30449](https://github.com/ClickHouse/ClickHouse/issues/30449). [#30474](https://github.com/ClickHouse/ClickHouse/pull/30474) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove `MergeTree` table setting `write_final_mark`. It will be always `true`. [#30455](https://github.com/ClickHouse/ClickHouse/pull/30455) ([Kseniia Sumarokova](https://github.com/kssenii)). No actions required, all tables are compatible with the new version. +* Function `bayesAB` is removed. Please help to return this function back, refreshed. This closes [#26233](https://github.com/ClickHouse/ClickHouse/issues/26233). [#29934](https://github.com/ClickHouse/ClickHouse/pull/29934) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* This is relevant only if you already started using the experimental `clickhouse-keeper` support. Now ClickHouse Keeper snapshots compressed with `ZSTD` codec by default instead of custom ClickHouse LZ4 block compression. This behavior can be turned off with `compress_snapshots_with_zstd_format` coordination setting (must be equal on all quorum replicas). Backward incompatibility is quite rare and may happen only when new node will send snapshot (happens in case of recovery) to the old node which is unable to read snapshots in ZSTD format. [#29417](https://github.com/ClickHouse/ClickHouse/pull/29417) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* New asynchronous INSERT mode allows to accumulate inserted data and store it in a single batch in background. On client it can be enabled by setting `async_insert` for `INSERT` queries with data inlined in query or in separate buffer (e.g. for `INSERT` queries via HTTP protocol). If `wait_for_async_insert` is true (by default) the client will wait until data will be flushed to table. On server-side it controlled by the settings `async_insert_threads`, `async_insert_max_data_size` and `async_insert_busy_timeout_ms`. Implements [#18282](https://github.com/ClickHouse/ClickHouse/issues/18282). [#27537](https://github.com/ClickHouse/ClickHouse/pull/27537) ([Anton Popov](https://github.com/CurtizJ)). [#20557](https://github.com/ClickHouse/ClickHouse/pull/20557) ([Ivan](https://github.com/abyss7)). Notes on performance: with asynchronous inserts you can do up to around 10 000 individual INSERT queries per second, so it is still recommended to insert in batches if you want to achieve performance up to millions inserted rows per second. +* Add interactive mode for `clickhouse-local`. So, you can just run `clickhouse-local` to get a command line ClickHouse interface without connecting to a server and process data from files and external data sources. Also merge the code of `clickhouse-client` and `clickhouse-local` together. Closes [#7203](https://github.com/ClickHouse/ClickHouse/issues/7203). Closes [#25516](https://github.com/ClickHouse/ClickHouse/issues/25516). Closes [#22401](https://github.com/ClickHouse/ClickHouse/issues/22401). [#26231](https://github.com/ClickHouse/ClickHouse/pull/26231) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added support for executable (scriptable) user defined functions. These are UDFs that can be written in any programming language. [#28803](https://github.com/ClickHouse/ClickHouse/pull/28803) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow predefined connections to external data sources. This allows to avoid specifying credentials or addresses while using external data sources, they can be referenced by names instead. Closes [#28367](https://github.com/ClickHouse/ClickHouse/issues/28367). [#28577](https://github.com/ClickHouse/ClickHouse/pull/28577) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `INFORMATION_SCHEMA` database with `SCHEMATA`, `TABLES`, `VIEWS` and `COLUMNS` views to the corresponding tables in `system` database. Closes [#9770](https://github.com/ClickHouse/ClickHouse/issues/9770). [#28691](https://github.com/ClickHouse/ClickHouse/pull/28691) ([tavplubix](https://github.com/tavplubix)). +* Support `EXISTS (subquery)`. Closes [#6852](https://github.com/ClickHouse/ClickHouse/issues/6852). [#29731](https://github.com/ClickHouse/ClickHouse/pull/29731) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Session logging for audit. Logging all successful and failed login and logout events to a new `system.session_log` table. [#22415](https://github.com/ClickHouse/ClickHouse/pull/22415) ([Vasily Nemkov](https://github.com/Enmk)) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support multidimensional cosine distance and euclidean distance functions; L1, L2, Lp, Linf distances and norms. Scalar product on tuples and various arithmetic operators on tuples. This fully closes [#4509](https://github.com/ClickHouse/ClickHouse/issues/4509) and even more. [#27933](https://github.com/ClickHouse/ClickHouse/pull/27933) ([Alexey Boykov](https://github.com/mathalex)). +* Add support for compression and decompression for `INTO OUTFILE` and `FROM INFILE` (with autodetect or with additional optional parameter). [#27135](https://github.com/ClickHouse/ClickHouse/pull/27135) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add CORS (Cross Origin Resource Sharing) support with HTTP `OPTIONS` request. It means, now Grafana will work with serverless requests without a kludges. Closes [#18693](https://github.com/ClickHouse/ClickHouse/issues/18693). [#29155](https://github.com/ClickHouse/ClickHouse/pull/29155) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Queries with JOIN ON now supports disjunctions (OR). [#21320](https://github.com/ClickHouse/ClickHouse/pull/21320) ([Ilya Golshtein](https://github.com/ilejn)). +* Added function `tokens`. That allow to split string into tokens using non-alpha numeric ASCII characters as separators. [#29981](https://github.com/ClickHouse/ClickHouse/pull/29981) ([Maksim Kita](https://github.com/kitaisreal)). Added function `ngrams` to extract ngrams from text. Closes [#29699](https://github.com/ClickHouse/ClickHouse/issues/29699). [#29738](https://github.com/ClickHouse/ClickHouse/pull/29738) ([Maksim Kita](https://github.com/kitaisreal)). +* Add functions for Unicode normalization: `normalizeUTF8NFC`, `normalizeUTF8NFD`, `normalizeUTF8NFKC`, `normalizeUTF8NFKD` functions. [#28633](https://github.com/ClickHouse/ClickHouse/pull/28633) ([darkkeks](https://github.com/darkkeks)). +* Streaming consumption of application log files in ClickHouse with `FileLog` table engine. It's like `Kafka` or `RabbitMQ` engine but for append-only and rotated logs in local filesystem. Closes [#6953](https://github.com/ClickHouse/ClickHouse/issues/6953). [#25969](https://github.com/ClickHouse/ClickHouse/pull/25969) ([flynn](https://github.com/ucasfl)) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `CapnProto` output format, refactor `CapnProto` input format. [#29291](https://github.com/ClickHouse/ClickHouse/pull/29291) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to write number in query as binary literal. Example `SELECT 0b001;`. [#29304](https://github.com/ClickHouse/ClickHouse/pull/29304) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `hashed_array` dictionary type. It saves memory when using dictionaries with multiple attributes. Closes [#30236](https://github.com/ClickHouse/ClickHouse/issues/30236). [#30242](https://github.com/ClickHouse/ClickHouse/pull/30242) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `JSONExtractKeys` function. [#30056](https://github.com/ClickHouse/ClickHouse/pull/30056) ([Vitaly](https://github.com/orloffv)). +* Add a function `getOSKernelVersion` - it returns a string with OS kernel version. [#29755](https://github.com/ClickHouse/ClickHouse/pull/29755) ([Memo](https://github.com/Joeywzr)). +* Added `MD4` and `SHA384` functions. MD4 is an obsolete and insecure hash function, it can be used only in rare cases when MD4 is already being used in some legacy system and you need to get exactly the same result. [#29602](https://github.com/ClickHouse/ClickHouse/pull/29602) ([Nikita Tikhomirov](https://github.com/NSTikhomirov)). +* HSTS can be enabled for ClickHouse HTTP server by setting `hsts_max_age` in configuration file with a positive number. [#29516](https://github.com/ClickHouse/ClickHouse/pull/29516) ([凌涛](https://github.com/lingtaolf)). +* Huawei OBS Storage support. Closes [#24294](https://github.com/ClickHouse/ClickHouse/issues/24294). [#29511](https://github.com/ClickHouse/ClickHouse/pull/29511) ([kevin wan](https://github.com/MaxWk)). +* New function `mapContainsKeyLike` to get the map that key matches a simple regular expression. [#29471](https://github.com/ClickHouse/ClickHouse/pull/29471) ([凌涛](https://github.com/lingtaolf)). New function `mapExtractKeyLike` to get the map only kept elements matched specified pattern. [#30793](https://github.com/ClickHouse/ClickHouse/pull/30793) ([凌涛](https://github.com/lingtaolf)). +* Implemented `ALTER TABLE x MODIFY COMMENT`. [#29264](https://github.com/ClickHouse/ClickHouse/pull/29264) ([Vasily Nemkov](https://github.com/Enmk)). +* Adds H3 inspection functions that are missing from ClickHouse but are available via the H3 api: https://h3geo.org/docs/api/inspection. [#29209](https://github.com/ClickHouse/ClickHouse/pull/29209) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow non-replicated ALTER TABLE FETCH and ATTACH in Replicated databases. [#29202](https://github.com/ClickHouse/ClickHouse/pull/29202) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Added a setting `output_format_csv_null_representation`: This is the same as `output_format_tsv_null_representation` but is for CSV output. [#29123](https://github.com/ClickHouse/ClickHouse/pull/29123) ([PHO](https://github.com/depressed-pho)). +* Added function `zookeeperSessionUptime()` which returns uptime of current ZooKeeper session in seconds. [#28983](https://github.com/ClickHouse/ClickHouse/pull/28983) ([tavplubix](https://github.com/tavplubix)). +* Implements the `h3ToGeoBoundary` function. [#28952](https://github.com/ClickHouse/ClickHouse/pull/28952) ([Ivan Veselov](https://github.com/fuzzERot)). +* Add aggregate function `exponentialMovingAverage` that can be used as window function. This closes [#27511](https://github.com/ClickHouse/ClickHouse/issues/27511). [#28914](https://github.com/ClickHouse/ClickHouse/pull/28914) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to include subcolumns of table columns into `DESCRIBE` query result (can be enabled by setting `describe_include_subcolumns`). [#28905](https://github.com/ClickHouse/ClickHouse/pull/28905) ([Anton Popov](https://github.com/CurtizJ)). +* `Executable`, `ExecutablePool` added option `send_chunk_header`. If this option is true then chunk rows_count with line break will be sent to client before chunk. [#28833](https://github.com/ClickHouse/ClickHouse/pull/28833) ([Maksim Kita](https://github.com/kitaisreal)). +* `tokenbf_v1` and `ngram` support Map with key of String of FixedSring type. It enhance data skipping in query with map key filter. ```sql CREATE TABLE map_tokenbf ( row_id UInt32, map Map(String, String), INDEX map_tokenbf map TYPE ngrambf_v1(4,256,2,0) GRANULARITY 1 ) Engine=MergeTree() Order by id ``` With table above, the query `select * from map_tokebf where map['K']='V'` will skip the granule that doesn't contain key `A` . Of course, how many rows will skipped is depended on the `granularity` and `index_granularity` you set. [#28511](https://github.com/ClickHouse/ClickHouse/pull/28511) ([凌涛](https://github.com/lingtaolf)). +* Send profile events from server to client. New packet type `ProfileEvents` was introduced. Closes [#26177](https://github.com/ClickHouse/ClickHouse/issues/26177). [#28364](https://github.com/ClickHouse/ClickHouse/pull/28364) ([Dmitry Novik](https://github.com/novikd)). +* Bit shift operations for `FixedString` and `String` data types. This closes [#27763](https://github.com/ClickHouse/ClickHouse/issues/27763). [#28325](https://github.com/ClickHouse/ClickHouse/pull/28325) ([小路](https://github.com/nicelulu)). +* Support adding / deleting tables to replication from PostgreSQL dynamically in database engine MaterializedPostgreSQL. Support alter for database settings. Closes [#27573](https://github.com/ClickHouse/ClickHouse/issues/27573). [#28301](https://github.com/ClickHouse/ClickHouse/pull/28301) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added function accurateCastOrDefault(x, T). Closes [#21330](https://github.com/ClickHouse/ClickHouse/issues/21330). Authors @taiyang-li. [#23028](https://github.com/ClickHouse/ClickHouse/pull/23028) ([Maksim Kita](https://github.com/kitaisreal)). +* Add Function `toUUIDOrDefault`, `toUInt8/16/32/64/256OrDefault`, `toInt8/16/32/64/128/256OrDefault`, which enables user defining default value(not null) when string parsing is failed. [#21330](https://github.com/ClickHouse/ClickHouse/pull/21330) ([taiyang-li](https://github.com/taiyang-li)). + +#### Performance Improvement + +* Background merges can be preempted by each other and they are scheduled with appropriate priorities. Now long running merges won't prevent short merges to proceed. This is needed for a better scheduling and controlling of merges execution. It reduces the chances to get "too many parts" error. [#22381](https://github.com/ClickHouse/ClickHouse/issues/22381). [#25165](https://github.com/ClickHouse/ClickHouse/pull/25165) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). Added an ability to execute more merges and mutations than the number of threads in background pool. Merges and mutations will be executed step by step according to their sizes (lower is more prioritized). The ratio of the number of tasks to threads to execute is controlled by a setting `background_merges_mutations_concurrency_ratio`, 2 by default. [#29140](https://github.com/ClickHouse/ClickHouse/pull/29140) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow to use asynchronous reads for remote filesystems. Lower the number of seeks while reading from remote filesystems. It improves performance tremendously and makes the experimental `web` and `s3` disks to work faster than EBS under certain conditions. [#29205](https://github.com/ClickHouse/ClickHouse/pull/29205) ([Kseniia Sumarokova](https://github.com/kssenii)). In the meantime, the `web` disk type (static dataset hosted on a web server) is graduated from being experimental to be production ready. +* Queries with `INTO OUTFILE` in `clickhouse-client` will use multiple threads. Fix the issue with flickering progress-bar when using `INTO OUTFILE`. This closes [#30873](https://github.com/ClickHouse/ClickHouse/issues/30873). This closes [#30872](https://github.com/ClickHouse/ClickHouse/issues/30872). [#30886](https://github.com/ClickHouse/ClickHouse/pull/30886) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce amount of redundant compressed data read from disk for some types `SELECT` queries (only for `MergeTree` engines family). [#30111](https://github.com/ClickHouse/ClickHouse/pull/30111) ([alesapin](https://github.com/alesapin)). +* Remove some redundant `seek` calls while reading compressed blocks in MergeTree table engines family. [#29766](https://github.com/ClickHouse/ClickHouse/pull/29766) ([alesapin](https://github.com/alesapin)). +* Make `url` table function to process multiple URLs in parallel. This closes [#29670](https://github.com/ClickHouse/ClickHouse/issues/29670) and closes [#29671](https://github.com/ClickHouse/ClickHouse/issues/29671). [#29673](https://github.com/ClickHouse/ClickHouse/pull/29673) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregation in order of primary key (with enabled setting `optimize_aggregation_in_order`). [#30266](https://github.com/ClickHouse/ClickHouse/pull/30266) ([Anton Popov](https://github.com/CurtizJ)). +* Now clickhouse is using DNS cache while communicating with external S3. [#29999](https://github.com/ClickHouse/ClickHouse/pull/29999) ([alesapin](https://github.com/alesapin)). +* Add support for pushdown of `IS NULL`/`IS NOT NULL` to external databases (i.e. MySQL). [#29463](https://github.com/ClickHouse/ClickHouse/pull/29463) ([Azat Khuzhin](https://github.com/azat)). Transform `isNull`/`isNotNull` to `IS NULL`/`IS NOT NULL` (for external dbs, i.e. MySQL). [#29446](https://github.com/ClickHouse/ClickHouse/pull/29446) ([Azat Khuzhin](https://github.com/azat)). +* SELECT queries from Dictionary tables will use multiple threads. [#30500](https://github.com/ClickHouse/ClickHouse/pull/30500) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance for filtering (WHERE operation) of `Decimal` columns. [#30431](https://github.com/ClickHouse/ClickHouse/pull/30431) ([Jun Jin](https://github.com/vesslanjin)). +* Remove branchy code in filter operation with a better implementation with popcnt/ctz which have better performance. [#29881](https://github.com/ClickHouse/ClickHouse/pull/29881) ([Jun Jin](https://github.com/vesslanjin)). +* Improve filter bytemask generator (used for WHERE operator) function all in one with SSE/AVX2/AVX512 instructions. Note that by default ClickHouse is only using SSE, so it's only relevant for custom builds. [#30014](https://github.com/ClickHouse/ClickHouse/pull/30014) ([jasperzhu](https://github.com/jinjunzh)). [#30670](https://github.com/ClickHouse/ClickHouse/pull/30670) ([jasperzhu](https://github.com/jinjunzh)). +* Improve the performance of SUM aggregate function of Nullable floating point numbers. [#28906](https://github.com/ClickHouse/ClickHouse/pull/28906) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up part loading process with multiple disks are in use. The idea is similar to https://github.com/ClickHouse/ClickHouse/pull/16423 . Prod env shows improvement: 24 min -> 16 min . [#28363](https://github.com/ClickHouse/ClickHouse/pull/28363) ([Amos Bird](https://github.com/amosbird)). +* Reduce default settings for S3 multipart upload part size to lower memory usage. [#28679](https://github.com/ClickHouse/ClickHouse/pull/28679) ([ianton-ru](https://github.com/ianton-ru)). +* Speed up `bitmapAnd` function. [#28332](https://github.com/ClickHouse/ClickHouse/pull/28332) ([dddounaiking](https://github.com/OodounaikingoO)). +* Removed sub-optimal mutation notifications in `StorageMergeTree` when merges are still going. [#27552](https://github.com/ClickHouse/ClickHouse/pull/27552) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Attempt to improve performance of string comparison. [#28767](https://github.com/ClickHouse/ClickHouse/pull/28767) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Primary key index and partition filter can work in tuple. [#29281](https://github.com/ClickHouse/ClickHouse/pull/29281) ([凌涛](https://github.com/lingtaolf)). +* If query has multiple quantile aggregate functions with the same arguments but different level parameter, they will be fused together and executed in one pass if the setting `optimize_syntax_fuse_functions` is enabled. [#26657](https://github.com/ClickHouse/ClickHouse/pull/26657) ([hexiaoting](https://github.com/hexiaoting)). +* Now min-max aggregation over the first expression of primary key is optimized by projection. This is for [#329](https://github.com/ClickHouse/ClickHouse/issues/329). [#29918](https://github.com/ClickHouse/ClickHouse/pull/29918) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add ability to change nodes configuration (in `.xml` file) for ClickHouse Keeper. [#30372](https://github.com/ClickHouse/ClickHouse/pull/30372) ([alesapin](https://github.com/alesapin)). +* Add `sparkbar` aggregate function. This closes [#26175](https://github.com/ClickHouse/ClickHouse/issues/26175). [#27481](https://github.com/ClickHouse/ClickHouse/pull/27481) ([小路](https://github.com/nicelulu)). Note: there is one flaw in this function, the behaviour will be changed in future releases. + +#### Improvement + +* Allow user to change log levels without restart. [#29586](https://github.com/ClickHouse/ClickHouse/pull/29586) ([Nikolay Degterinsky](https://github.com/evillique)). +* Multiple improvements for SQL UDF. Queries for manipulation of SQL User Defined Functions now support ON CLUSTER clause. Example `CREATE FUNCTION test_function ON CLUSTER 'cluster' AS x -> x + 1;`. Closes [#30666](https://github.com/ClickHouse/ClickHouse/issues/30666). [#30734](https://github.com/ClickHouse/ClickHouse/pull/30734) ([Maksim Kita](https://github.com/kitaisreal)). Support `CREATE OR REPLACE`, `CREATE IF NOT EXISTS` syntaxes. [#30454](https://github.com/ClickHouse/ClickHouse/pull/30454) ([Maksim Kita](https://github.com/kitaisreal)). Added DROP IF EXISTS support. Example `DROP FUNCTION IF EXISTS test_function`. [#30437](https://github.com/ClickHouse/ClickHouse/pull/30437) ([Maksim Kita](https://github.com/kitaisreal)). Support lambdas. Example `CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);`. [#30435](https://github.com/ClickHouse/ClickHouse/pull/30435) ([Maksim Kita](https://github.com/kitaisreal)). Support SQL user defined functions for `clickhouse-local`. [#30179](https://github.com/ClickHouse/ClickHouse/pull/30179) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable per-query memory profiler (set to `memory_profiler_step` = 4MiB) globally. [#29455](https://github.com/ClickHouse/ClickHouse/pull/29455) ([Azat Khuzhin](https://github.com/azat)). +* Added columns `data_compressed_bytes`, `data_uncompressed_bytes`, `marks_bytes` into `system.data_skipping_indices`. Added columns `secondary_indices_compressed_bytes`, `secondary_indices_uncompressed_bytes`, `secondary_indices_marks_bytes` into `system.parts`. Closes [#29697](https://github.com/ClickHouse/ClickHouse/issues/29697). [#29896](https://github.com/ClickHouse/ClickHouse/pull/29896) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `table` alias to system.tables and `database` alias to system.databases [#29677](https://github.com/ClickHouse/ClickHouse/issues/29677). [#29882](https://github.com/ClickHouse/ClickHouse/pull/29882) ([kevin wan](https://github.com/MaxWk)). +* Correctly resolve interdependencies between tables on server startup. Closes [#8004](https://github.com/ClickHouse/ClickHouse/issues/8004), closes [#15170](https://github.com/ClickHouse/ClickHouse/issues/15170). [#28373](https://github.com/ClickHouse/ClickHouse/pull/28373) ([tavplubix](https://github.com/tavplubix)). +* Avoid error "Division by zero" when denominator is Nullable in functions `divide`, `intDiv` and `modulo`. Closes [#22621](https://github.com/ClickHouse/ClickHouse/issues/22621). [#28352](https://github.com/ClickHouse/ClickHouse/pull/28352) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to parse values of `Date` data type in text formats as `YYYYMMDD` in addition to `YYYY-MM-DD`. This closes [#30870](https://github.com/ClickHouse/ClickHouse/issues/30870). [#30871](https://github.com/ClickHouse/ClickHouse/pull/30871) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Web UI: render bars in table cells. [#29792](https://github.com/ClickHouse/ClickHouse/pull/29792) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* User can now create dictionaries with comments: `CREATE DICTIONARY ... COMMENT 'vaue'` ... [#29899](https://github.com/ClickHouse/ClickHouse/pull/29899) ([Vasily Nemkov](https://github.com/Enmk)). Users now can set comments to database in `CREATE DATABASE` statement ... [#29429](https://github.com/ClickHouse/ClickHouse/pull/29429) ([Vasily Nemkov](https://github.com/Enmk)). +* Introduce `compiled_expression_cache_elements_size` setting. If you will ever want to use this setting, you will already know what it does. [#30667](https://github.com/ClickHouse/ClickHouse/pull/30667) ([Maksim Kita](https://github.com/kitaisreal)). +* clickhouse-format now supports option `--query`. In previous versions you have to pass the query to stdin. [#29325](https://github.com/ClickHouse/ClickHouse/pull/29325) ([凌涛](https://github.com/lingtaolf)). +* Support `ALTER TABLE` for tables in `Memory` databases. Memory databases are used in `clickhouse-local`. [#30866](https://github.com/ClickHouse/ClickHouse/pull/30866) ([tavplubix](https://github.com/tavplubix)). +* Arrays of all serializable types are now supported by `arrayStringConcat`. [#30840](https://github.com/ClickHouse/ClickHouse/pull/30840) ([Nickita Taranov](https://github.com/nickitat)). +* ClickHouse now will account docker/cgroups limitations to get system memory amount. See [#25662](https://github.com/ClickHouse/ClickHouse/issues/25662). [#30574](https://github.com/ClickHouse/ClickHouse/pull/30574) ([Pavel Medvedev](https://github.com/pmed)). +* Fetched table structure for PostgreSQL database is more reliable now. [#30477](https://github.com/ClickHouse/ClickHouse/pull/30477) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Full support of positional arguments in GROUP BY and ORDER BY. [#30433](https://github.com/ClickHouse/ClickHouse/pull/30433) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow extracting non-string element as string using JSONExtractString. This is for [pull/25452#issuecomment-927123287](https://github.com/ClickHouse/ClickHouse/pull/25452#issuecomment-927123287). [#30426](https://github.com/ClickHouse/ClickHouse/pull/30426) ([Amos Bird](https://github.com/amosbird)). +* Added an ability to use FINAL clause in SELECT queries from `GraphiteMergeTree`. [#30360](https://github.com/ClickHouse/ClickHouse/pull/30360) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Minor improvements in replica cloning and enqueuing fetch for broken parts, that should avoid extremely rare hanging of `GET_PART` entries in replication queue. [#30346](https://github.com/ClickHouse/ClickHouse/pull/30346) ([tavplubix](https://github.com/tavplubix)). +* Allow symlinks to files in `user_files` directory for file table function. [#30309](https://github.com/ClickHouse/ClickHouse/pull/30309) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed comparison of `Date32` with `Date`, `DateTime`, `DateTime64` and `String`. [#30219](https://github.com/ClickHouse/ClickHouse/pull/30219) ([liang.huang](https://github.com/lhuang09287750)). +* Allow to remove `SAMPLE BY` expression from `MergeTree` tables (`ALTER TABLE REMOVE SAMPLE BY`). [#30180](https://github.com/ClickHouse/ClickHouse/pull/30180) ([Anton Popov](https://github.com/CurtizJ)). +* Now `Keeper` (as part of `clickhouse-server`) will start asynchronously if it can connect to some other node. [#30170](https://github.com/ClickHouse/ClickHouse/pull/30170) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse-client` supports native multi-line editing. [#30143](https://github.com/ClickHouse/ClickHouse/pull/30143) ([Amos Bird](https://github.com/amosbird)). +* `polygon` dictionaries (reverse geocoding): added support for reading the dictionary content with SELECT query method if setting `store_polygon_key_column` = true. Closes [#30090](https://github.com/ClickHouse/ClickHouse/issues/30090). [#30142](https://github.com/ClickHouse/ClickHouse/pull/30142) ([Maksim Kita](https://github.com/kitaisreal)). +* Add ClickHouse logo to Play UI. [#29674](https://github.com/ClickHouse/ClickHouse/pull/29674) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better exception message while reading column from Arrow-supported formats like `Arrow`, `ArrowStream`, `Parquet` and `ORC`. This closes [#29926](https://github.com/ClickHouse/ClickHouse/issues/29926). [#29927](https://github.com/ClickHouse/ClickHouse/pull/29927) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix data-race between flush and startup in `Buffer` tables. This can appear in tests. [#29930](https://github.com/ClickHouse/ClickHouse/pull/29930) ([Azat Khuzhin](https://github.com/azat)). +* Fix `lock-order-inversion` between `DROP TABLE` for `DatabaseMemory` and `LiveView`. Live View is an experimental feature. Memory database is used in clickhouse-local. [#29929](https://github.com/ClickHouse/ClickHouse/pull/29929) ([Azat Khuzhin](https://github.com/azat)). +* Fix lock-order-inversion between periodic dictionary reload and config reload. [#29928](https://github.com/ClickHouse/ClickHouse/pull/29928) ([Azat Khuzhin](https://github.com/azat)). +* Update zoneinfo files to 2021c. [#29925](https://github.com/ClickHouse/ClickHouse/pull/29925) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to configure retries and delays between them for `clickhouse-copier`. [#29921](https://github.com/ClickHouse/ClickHouse/pull/29921) ([Azat Khuzhin](https://github.com/azat)). +* Add `shutdown_wait_unfinished_queries` server setting to allowing waiting for running queries up to `shutdown_wait_unfinished` time. This is for [#24451](https://github.com/ClickHouse/ClickHouse/issues/24451). [#29914](https://github.com/ClickHouse/ClickHouse/pull/29914) ([Amos Bird](https://github.com/amosbird)). +* Add ability to trace peak memory usage (with new trace_type in `system.trace_log` - `MemoryPeak`). [#29858](https://github.com/ClickHouse/ClickHouse/pull/29858) ([Azat Khuzhin](https://github.com/azat)). +* PostgreSQL foreign tables: Added partitioned table prefix 'p' for the query for fetching replica identity index. [#29828](https://github.com/ClickHouse/ClickHouse/pull/29828) ([Shoh Jahon](https://github.com/Shohjahon)). +* Apply `max_untracked_memory`/`memory_profiler_step`/`memory_profiler_sample_probability` during mutate/merge to profile memory usage during merges. [#29681](https://github.com/ClickHouse/ClickHouse/pull/29681) ([Azat Khuzhin](https://github.com/azat)). +* Query obfuscator: `clickhouse-format --obfuscate` now works with more types of queries. [#29672](https://github.com/ClickHouse/ClickHouse/pull/29672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue: `clickhouse-format --obfuscate` cannot process queries with embedded dictionaries (functions `regionTo...`). [#29667](https://github.com/ClickHouse/ClickHouse/pull/29667) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect Nullable processing of JSON functions. This fixes [#29615](https://github.com/ClickHouse/ClickHouse/issues/29615) . Mark as improvement because https://github.com/ClickHouse/ClickHouse/pull/28012 is not released. [#29659](https://github.com/ClickHouse/ClickHouse/pull/29659) ([Amos Bird](https://github.com/amosbird)). +* Increase `listen_backlog` by default (to match default in newer linux kernel). [#29643](https://github.com/ClickHouse/ClickHouse/pull/29643) ([Azat Khuzhin](https://github.com/azat)). +* Reload dictionaries, models, user defined executable functions if servers config `dictionaries_config`, `models_config`, `user_defined_executable_functions_config` changes. Closes [#28142](https://github.com/ClickHouse/ClickHouse/issues/28142). [#29529](https://github.com/ClickHouse/ClickHouse/pull/29529) ([Maksim Kita](https://github.com/kitaisreal)). +* Get rid of pointless restriction on projection name. Now projection name can start with `tmp_`. [#29520](https://github.com/ClickHouse/ClickHouse/pull/29520) ([Amos Bird](https://github.com/amosbird)). +* Fixed `There is no query or query context has expired` error in mutations with nested subqueries. Do not allow subqueries in mutation if table is replicated and `allow_nondeterministic_mutations` setting is disabled. [#29495](https://github.com/ClickHouse/ClickHouse/pull/29495) ([tavplubix](https://github.com/tavplubix)). +* Apply config changes to `max_concurrent_queries` during runtime (no need to restart). [#29414](https://github.com/ClickHouse/ClickHouse/pull/29414) ([Raúl Marín](https://github.com/Algunenano)). +* Added setting `use_skip_indexes`. [#29405](https://github.com/ClickHouse/ClickHouse/pull/29405) ([Maksim Kita](https://github.com/kitaisreal)). +* Add support for `FREEZE`ing in-memory parts (for backups). [#29376](https://github.com/ClickHouse/ClickHouse/pull/29376) ([Mo Xuan](https://github.com/mo-avatar)). +* Pass through initial query_id for `clickhouse-benchmark` (previously if you run remote query via `clickhouse-benchmark`, queries on shards will not be linked to the initial query via `initial_query_id`). [#29364](https://github.com/ClickHouse/ClickHouse/pull/29364) ([Azat Khuzhin](https://github.com/azat)). +* Skip indexes `tokenbf_v1` and `ngrambf_v1`: added support for `Array` data type with key of `String` of `FixedString` type. [#29280](https://github.com/ClickHouse/ClickHouse/pull/29280) ([Maksim Kita](https://github.com/kitaisreal)). Skip indexes `tokenbf_v1` and `ngrambf_v1` added support for `Map` data type with key of `String` of `FixedString` type. Author @lingtaolf. [#29220](https://github.com/ClickHouse/ClickHouse/pull/29220) ([Maksim Kita](https://github.com/kitaisreal)). +* Function `has`: added support for `Map` data type. [#29267](https://github.com/ClickHouse/ClickHouse/pull/29267) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `compress_logs` settings for clickhouse-keeper which allow to compress clickhouse-keeper logs (for replicated state machine) in `ZSTD` . Implements: [#26977](https://github.com/ClickHouse/ClickHouse/issues/26977). [#29223](https://github.com/ClickHouse/ClickHouse/pull/29223) ([alesapin](https://github.com/alesapin)). +* Add a setting `external_table_strict_query` - it will force passing the whole WHERE expression in queries to foreign databases even if it is incompatible. [#29206](https://github.com/ClickHouse/ClickHouse/pull/29206) ([Azat Khuzhin](https://github.com/azat)). +* Disable projections when `ARRAY JOIN` is used. In previous versions projection analysis may break aliases in array join. [#29139](https://github.com/ClickHouse/ClickHouse/pull/29139) ([Amos Bird](https://github.com/amosbird)). +* Support more types in `MsgPack` input/output format. [#29077](https://github.com/ClickHouse/ClickHouse/pull/29077) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to input and output `LowCardinality` columns in `ORC` input/output format. [#29062](https://github.com/ClickHouse/ClickHouse/pull/29062) ([Kruglov Pavel](https://github.com/Avogar)). +* Select from `system.distributed_ddl_queue` might show incorrect values, it's fixed. [#29061](https://github.com/ClickHouse/ClickHouse/pull/29061) ([tavplubix](https://github.com/tavplubix)). +* Correct behaviour with unknown methods for HTTP connection. Solves [#29050](https://github.com/ClickHouse/ClickHouse/issues/29050). [#29057](https://github.com/ClickHouse/ClickHouse/pull/29057) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* `clickhouse-keeper`: Fix bug in `clickhouse-keeper-converter` which can lead to some data loss while restoring from ZooKeeper logs (not snapshot). [#29030](https://github.com/ClickHouse/ClickHouse/pull/29030) ([小路](https://github.com/nicelulu)). Fix bug in `clickhouse-keeper-converter` which can lead to incorrect ZooKeeper log deserialization. [#29071](https://github.com/ClickHouse/ClickHouse/pull/29071) ([小路](https://github.com/nicelulu)). +* Apply settings from `CREATE ... AS SELECT` queries (fixes: [#28810](https://github.com/ClickHouse/ClickHouse/issues/28810)). [#28962](https://github.com/ClickHouse/ClickHouse/pull/28962) ([Azat Khuzhin](https://github.com/azat)). +* Respect default database setting for ALTER TABLE ... ON CLUSTER ... REPLACE/MOVE PARTITION FROM/TO ... [#28955](https://github.com/ClickHouse/ClickHouse/pull/28955) ([anneji-dev](https://github.com/anneji-dev)). +* gRPC protocol: Allow change server-side compression from client. [#28953](https://github.com/ClickHouse/ClickHouse/pull/28953) ([Vitaly Baranov](https://github.com/vitlibar)). +* Skip "no data" exception when reading thermal sensors for asynchronous metrics. This closes [#28852](https://github.com/ClickHouse/ClickHouse/issues/28852). [#28882](https://github.com/ClickHouse/ClickHouse/pull/28882) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed logical race condition that might cause `Dictionary not found` error for existing dictionary in rare cases. [#28853](https://github.com/ClickHouse/ClickHouse/pull/28853) ([tavplubix](https://github.com/tavplubix)). +* Relax nested function for If-combinator check (but forbid nested identical combinators). [#28828](https://github.com/ClickHouse/ClickHouse/pull/28828) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible uncaught exception during server termination. [#28761](https://github.com/ClickHouse/ClickHouse/pull/28761) ([Azat Khuzhin](https://github.com/azat)). +* Forbid cleaning of tmp directories that can be used by an active mutation/merge if mutation/merge is extraordinarily long. [#28760](https://github.com/ClickHouse/ClickHouse/pull/28760) ([Azat Khuzhin](https://github.com/azat)). +* Allow optimization `optimize_arithmetic_operations_in_aggregate_functions = 1` when alias is used. [#28746](https://github.com/ClickHouse/ClickHouse/pull/28746) ([Amos Bird](https://github.com/amosbird)). +* Implement `detach_not_byte_identical_parts` setting for `ReplicatedMergeTree`, that will detach instead of remove not byte-identical parts (after mege/mutate). [#28708](https://github.com/ClickHouse/ClickHouse/pull/28708) ([Azat Khuzhin](https://github.com/azat)). +* Implement `max_suspicious_broken_parts_bytes` setting for `MergeTree` (to limit total size of all broken parts, default is `1GiB`). [#28707](https://github.com/ClickHouse/ClickHouse/pull/28707) ([Azat Khuzhin](https://github.com/azat)). +* Enable expanding macros in `RabbitMQ` table settings. [#28683](https://github.com/ClickHouse/ClickHouse/pull/28683) ([Vitaly Baranov](https://github.com/vitlibar)). +* Restore the possibility to read data of a table using the `Log` engine in multiple threads. [#28125](https://github.com/ClickHouse/ClickHouse/pull/28125) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix misbehavior of NULL column handling in JSON functions. This fixes [#27930](https://github.com/ClickHouse/ClickHouse/issues/27930). [#28012](https://github.com/ClickHouse/ClickHouse/pull/28012) ([Amos Bird](https://github.com/amosbird)). +* Allow to set the size of Mark/Uncompressed cache for skip indices separately from columns. [#27961](https://github.com/ClickHouse/ClickHouse/pull/27961) ([Amos Bird](https://github.com/amosbird)). +* Allow to mix JOIN with `USING` with other JOIN types. [#23881](https://github.com/ClickHouse/ClickHouse/pull/23881) ([darkkeks](https://github.com/darkkeks)). +* Update aws-sdk submodule for throttling in Yandex Cloud S3. [#30646](https://github.com/ClickHouse/ClickHouse/pull/30646) ([ianton-ru](https://github.com/ianton-ru)). +* Fix releasing query ID and session ID at the end of query processing while handing gRPC call. [#29954](https://github.com/ClickHouse/ClickHouse/pull/29954) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix shutdown of `AccessControlManager` to fix flaky test. [#29951](https://github.com/ClickHouse/ClickHouse/pull/29951) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix failed assertion in reading from `HDFS`. Update libhdfs3 library to be able to run in tests in debug. Closes [#29251](https://github.com/ClickHouse/ClickHouse/issues/29251). Closes [#27814](https://github.com/ClickHouse/ClickHouse/issues/27814). [#29276](https://github.com/ClickHouse/ClickHouse/pull/29276) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +#### Build/Testing/Packaging Improvement + +* Add support for FreeBSD builds for Aarch64 machines. [#29952](https://github.com/ClickHouse/ClickHouse/pull/29952) ([MikaelUrankar](https://github.com/MikaelUrankar)). +* Recursive submodules are no longer needed for ClickHouse. [#30315](https://github.com/ClickHouse/ClickHouse/pull/30315) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse can be statically built with Musl. This is added as experiment, it does not support building `odbc-bridge`, `library-bridge`, integration with CatBoost and some libraries. [#30248](https://github.com/ClickHouse/ClickHouse/pull/30248) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable `Protobuf`, `Arrow`, `ORC`, `Parquet` for `AArch64` and `Darwin` (macOS) builds. This closes [#29248](https://github.com/ClickHouse/ClickHouse/issues/29248). This closes [#28018](https://github.com/ClickHouse/ClickHouse/issues/28018). [#30015](https://github.com/ClickHouse/ClickHouse/pull/30015) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add cross-build for PowerPC (powerpc64le). This closes [#9589](https://github.com/ClickHouse/ClickHouse/issues/9589). Enable support for interaction with MySQL for AArch64 and PowerPC. This closes [#26301](https://github.com/ClickHouse/ClickHouse/issues/26301). [#30010](https://github.com/ClickHouse/ClickHouse/pull/30010) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Leave only required files in cross-compile toolchains. Include them as submodules (earlier they were downloaded as tarballs). [#29974](https://github.com/ClickHouse/ClickHouse/pull/29974) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implemented structure-aware fuzzing approach in ClickHouse for select statement parser. [#30012](https://github.com/ClickHouse/ClickHouse/pull/30012) ([Paul](https://github.com/PaulCher)). +* Turning on experimental constexpr expressions evaluator for clang to speed up template code compilation. [#29668](https://github.com/ClickHouse/ClickHouse/pull/29668) ([myrrc](https://github.com/myrrc)). +* Add ability to compile using newer version fo glibc without using new symbols. [#29594](https://github.com/ClickHouse/ClickHouse/pull/29594) ([Azat Khuzhin](https://github.com/azat)). +* Reduce Debug build binary size by clang optimization option. [#28736](https://github.com/ClickHouse/ClickHouse/pull/28736) ([flynn](https://github.com/ucasfl)). +* Now all images for CI will be placed in the separate dockerhub repo. [#28656](https://github.com/ClickHouse/ClickHouse/pull/28656) ([alesapin](https://github.com/alesapin)). +* Improve support for build with clang-13. [#28046](https://github.com/ClickHouse/ClickHouse/pull/28046) ([Sergei Semin](https://github.com/syominsergey)). +* Add ability to print raw profile events to `clickhouse-client` (This can be useful for debugging and for testing). [#30064](https://github.com/ClickHouse/ClickHouse/pull/30064) ([Azat Khuzhin](https://github.com/azat)). +* Add time dependency for clickhouse-server unit (systemd and sysvinit init). [#28891](https://github.com/ClickHouse/ClickHouse/pull/28891) ([Azat Khuzhin](https://github.com/azat)). +* Reload stacktrace cache when symbol is reloaded. [#28137](https://github.com/ClickHouse/ClickHouse/pull/28137) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix + +* Functions for case-insensitive search in UTF-8 strings like `positionCaseInsensitiveUTF8` and `countSubstringsCaseInsensitiveUTF8` might find substrings that actually does not match in very rare cases, it's fixed. [#30663](https://github.com/ClickHouse/ClickHouse/pull/30663) ([tavplubix](https://github.com/tavplubix)). +* Fix reading from empty file on encrypted disk. [#30494](https://github.com/ClickHouse/ClickHouse/pull/30494) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix transformation of disjunctions chain to `IN` (controlled by settings `optimize_min_equality_disjunction_chain_length`) in distributed queries with settings `legacy_column_name_of_tuple_literal = 0`. [#28658](https://github.com/ClickHouse/ClickHouse/pull/28658) ([Anton Popov](https://github.com/CurtizJ)). +* Allow using a materialized column as the sharding key in a distributed table even if `insert_allow_materialized_columns=0`:. [#28637](https://github.com/ClickHouse/ClickHouse/pull/28637) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `ORDER BY ... WITH FILL` with set `TO` and `FROM` and no rows in result set. [#30888](https://github.com/ClickHouse/ClickHouse/pull/30888) ([Anton Popov](https://github.com/CurtizJ)). +* Fix set index not used in AND/OR expressions when there are more than two operands. This fixes [#30416](https://github.com/ClickHouse/ClickHouse/issues/30416) . [#30887](https://github.com/ClickHouse/ClickHouse/pull/30887) ([Amos Bird](https://github.com/amosbird)). +* Fix crash when projection with hashing function is materialized. This fixes [#30861](https://github.com/ClickHouse/ClickHouse/issues/30861) . The issue is similar to https://github.com/ClickHouse/ClickHouse/pull/28560 which is a lack of proper understanding of the invariant of header's emptyness. [#30877](https://github.com/ClickHouse/ClickHouse/pull/30877) ([Amos Bird](https://github.com/amosbird)). +* Fixed ambiguity when extracting auxiliary ZooKeeper name from ZooKeeper path in `ReplicatedMergeTree`. Previously server might fail to start with `Unknown auxiliary ZooKeeper name` if ZooKeeper path contains a colon. Fixes [#29052](https://github.com/ClickHouse/ClickHouse/issues/29052). Also it was allowed to specify ZooKeeper path that does not start with slash, but now it's deprecated and creation of new tables with such path is not allowed. Slashes and colons in auxiliary ZooKeeper names are not allowed too. [#30822](https://github.com/ClickHouse/ClickHouse/pull/30822) ([tavplubix](https://github.com/tavplubix)). +* Clean temporary directory when localBackup failed by some reason. [#30797](https://github.com/ClickHouse/ClickHouse/pull/30797) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed a race condition between `REPLACE/MOVE PARTITION` and background merge in non-replicated `MergeTree` that might cause a part of moved/replaced data to remain in partition. Fixes [#29327](https://github.com/ClickHouse/ClickHouse/issues/29327). [#30717](https://github.com/ClickHouse/ClickHouse/pull/30717) ([tavplubix](https://github.com/tavplubix)). +* Fix PREWHERE with WHERE in case of always true PREWHERE. [#30668](https://github.com/ClickHouse/ClickHouse/pull/30668) ([Azat Khuzhin](https://github.com/azat)). +* Limit push down optimization could cause a error `Cannot find column`. Fixes [#30438](https://github.com/ClickHouse/ClickHouse/issues/30438). [#30562](https://github.com/ClickHouse/ClickHouse/pull/30562) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add missing parenthesis for `isNotNull`/`isNull` rewrites to `IS [NOT] NULL` (fixes queries that has something like `isNotNull(1)+isNotNull(2)`). [#30520](https://github.com/ClickHouse/ClickHouse/pull/30520) ([Azat Khuzhin](https://github.com/azat)). +* Fix deadlock on ALTER with scalar subquery to the same table, close [#30461](https://github.com/ClickHouse/ClickHouse/issues/30461). [#30492](https://github.com/ClickHouse/ClickHouse/pull/30492) ([Vladimir C](https://github.com/vdimir)). +* Fixed segfault which might happen if session expired during execution of REPLACE PARTITION. [#30432](https://github.com/ClickHouse/ClickHouse/pull/30432) ([tavplubix](https://github.com/tavplubix)). +* Queries with condition like `IN (subquery)` could return incorrect result in case if aggregate projection applied. Fixed creation of sets for projections. [#30310](https://github.com/ClickHouse/ClickHouse/pull/30310) ([Amos Bird](https://github.com/amosbird)). +* Fix column alias resolution of JOIN queries when projection is enabled. This fixes [#30146](https://github.com/ClickHouse/ClickHouse/issues/30146). [#30293](https://github.com/ClickHouse/ClickHouse/pull/30293) ([Amos Bird](https://github.com/amosbird)). +* Fix some deficiency in `replaceRegexpAll` function. [#30292](https://github.com/ClickHouse/ClickHouse/pull/30292) ([Memo](https://github.com/Joeywzr)). +* Fix ComplexKeyHashedDictionary, ComplexKeySparseHashedDictionary parsing `preallocate` option from layout config. [#30246](https://github.com/ClickHouse/ClickHouse/pull/30246) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `[I]LIKE` function. Closes [#28661](https://github.com/ClickHouse/ClickHouse/issues/28661). [#30244](https://github.com/ClickHouse/ClickHouse/pull/30244) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix crash with shortcircuit and lowcardinality in multiIf. [#30243](https://github.com/ClickHouse/ClickHouse/pull/30243) ([Raúl Marín](https://github.com/Algunenano)). +* FlatDictionary, HashedDictionary fix bytes_allocated calculation for nullable attributes. [#30238](https://github.com/ClickHouse/ClickHouse/pull/30238) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow identifiers starting with numbers in multiple joins. [#30230](https://github.com/ClickHouse/ClickHouse/pull/30230) ([Vladimir C](https://github.com/vdimir)). +* Fix reading from `MergeTree` with `max_read_buffer_size = 0` (when the user wants to shoot himself in the foot) (can lead to exceptions `Can't adjust last granule`, `LOGICAL_ERROR`, or even data loss). [#30192](https://github.com/ClickHouse/ClickHouse/pull/30192) ([Azat Khuzhin](https://github.com/azat)). +* Fix `pread_fake_async`/`pread_threadpool` with `min_bytes_to_use_direct_io`. [#30191](https://github.com/ClickHouse/ClickHouse/pull/30191) ([Azat Khuzhin](https://github.com/azat)). +* Fix INSERT SELECT incorrectly fills MATERIALIZED column based of Nullable column. [#30189](https://github.com/ClickHouse/ClickHouse/pull/30189) ([Azat Khuzhin](https://github.com/azat)). +* Support nullable arguments in function `initializeAggregation`. [#30177](https://github.com/ClickHouse/ClickHouse/pull/30177) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Port is already connected` for queries with `GLOBAL IN` and `WITH TOTALS`. Only for 21.9 and 21.10. [#30086](https://github.com/ClickHouse/ClickHouse/pull/30086) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race between MOVE PARTITION and merges/mutations for MergeTree. [#30074](https://github.com/ClickHouse/ClickHouse/pull/30074) ([Azat Khuzhin](https://github.com/azat)). +* Dropped `Memory` database might reappear after server restart, it's fixed ([#29795](https://github.com/ClickHouse/ClickHouse/issues/29795)). Also added `force_remove_data_recursively_on_drop` setting as a workaround for `Directory not empty` error when dropping `Ordinary` database (because it's not possible to remove data leftovers manually in cloud environment). [#30054](https://github.com/ClickHouse/ClickHouse/pull/30054) ([tavplubix](https://github.com/tavplubix)). +* Fix crash of sample by `tuple()`, closes [#30004](https://github.com/ClickHouse/ClickHouse/issues/30004). [#30016](https://github.com/ClickHouse/ClickHouse/pull/30016) ([flynn](https://github.com/ucasfl)). +* try to close issue: [#29965](https://github.com/ClickHouse/ClickHouse/issues/29965). [#29976](https://github.com/ClickHouse/ClickHouse/pull/29976) ([hexiaoting](https://github.com/hexiaoting)). +* Fix possible data-race between `FileChecker` and `StorageLog`/`StorageStripeLog`. [#29959](https://github.com/ClickHouse/ClickHouse/pull/29959) ([Azat Khuzhin](https://github.com/azat)). +* Fix data-race between `LogSink::writeMarks()` and `LogSource` in `StorageLog`. [#29946](https://github.com/ClickHouse/ClickHouse/pull/29946) ([Azat Khuzhin](https://github.com/azat)). +* Fix potential resource leak of the concurrent query limit of merge tree tables introduced in https://github.com/ClickHouse/ClickHouse/pull/19544. [#29879](https://github.com/ClickHouse/ClickHouse/pull/29879) ([Amos Bird](https://github.com/amosbird)). +* Fix system tables recreation check (fails to detect changes in enum values). [#29857](https://github.com/ClickHouse/ClickHouse/pull/29857) ([Azat Khuzhin](https://github.com/azat)). +* MaterializedMySQL: Fix an issue where if the connection to MySQL was lost, only parts of a transaction could be processed. [#29837](https://github.com/ClickHouse/ClickHouse/pull/29837) ([Håvard Kvålen](https://github.com/havardk)). +* Avoid `Timeout exceeded: elapsed 18446744073.709553 seconds` error that might happen in extremely rare cases, presumably due to some bug in kernel. Fixes [#29154](https://github.com/ClickHouse/ClickHouse/issues/29154). [#29811](https://github.com/ClickHouse/ClickHouse/pull/29811) ([tavplubix](https://github.com/tavplubix)). +* Fix bad cast in `ATTACH TABLE ... FROM 'path'` query when non-string literal is used instead of path. It may lead to reading of uninitialized memory. [#29790](https://github.com/ClickHouse/ClickHouse/pull/29790) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix concurrent access to `LowCardinality` during `GROUP BY` (in combination with `Buffer` tables it may lead to troubles). [#29782](https://github.com/ClickHouse/ClickHouse/pull/29782) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect `GROUP BY` (multiple rows with the same keys in result) in case of distributed query when shards had mixed versions `<= 21.3` and `>= 21.4`, `GROUP BY` key had several columns all with fixed size, and two-level aggregation was activated (see `group_by_two_level_threshold` and `group_by_two_level_threshold_bytes`). Fixes [#29580](https://github.com/ClickHouse/ClickHouse/issues/29580). [#29735](https://github.com/ClickHouse/ClickHouse/pull/29735) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed incorrect behaviour of setting `materialized_postgresql_tables_list` at server restart. Found in [#28529](https://github.com/ClickHouse/ClickHouse/issues/28529). [#29686](https://github.com/ClickHouse/ClickHouse/pull/29686) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Condition in filter predicate could be lost after push-down optimisation. [#29625](https://github.com/ClickHouse/ClickHouse/pull/29625) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix JIT expression compilation with aliases and short-circuit expression evaluation. Closes [#29403](https://github.com/ClickHouse/ClickHouse/issues/29403). [#29574](https://github.com/ClickHouse/ClickHouse/pull/29574) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix rare segfault in `ALTER MODIFY` query when using incorrect table identifier in `DEFAULT` expression like `x.y.z...` Fixes [#29184](https://github.com/ClickHouse/ClickHouse/issues/29184). [#29573](https://github.com/ClickHouse/ClickHouse/pull/29573) ([alesapin](https://github.com/alesapin)). +* Fix nullptr deference for `GROUP BY WITH TOTALS HAVING` (when the column from `HAVING` wasn't selected). [#29553](https://github.com/ClickHouse/ClickHouse/pull/29553) ([Azat Khuzhin](https://github.com/azat)). +* Avoid deadlocks when reading and writting on Join table engine tables at the same time. [#29544](https://github.com/ClickHouse/ClickHouse/pull/29544) ([Raúl Marín](https://github.com/Algunenano)). +* Fix bug in check `pathStartsWith` becuase there was bug with the usage of `std::mismatch`: ` The behavior is undefined if the second range is shorter than the first range.`. [#29531](https://github.com/ClickHouse/ClickHouse/pull/29531) ([Kseniia Sumarokova](https://github.com/kssenii)). +* In ODBC bridge add retries for error Invalid cursor state. It is a retriable error. Closes [#29473](https://github.com/ClickHouse/ClickHouse/issues/29473). [#29518](https://github.com/ClickHouse/ClickHouse/pull/29518) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed incorrect table name parsing on loading of `Lazy` database. Fixes [#29456](https://github.com/ClickHouse/ClickHouse/issues/29456). [#29476](https://github.com/ClickHouse/ClickHouse/pull/29476) ([tavplubix](https://github.com/tavplubix)). +* Fix possible `Block structure mismatch` for subqueries with pushed-down `HAVING` predicate. Fixes [#29010](https://github.com/ClickHouse/ClickHouse/issues/29010). [#29475](https://github.com/ClickHouse/ClickHouse/pull/29475) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix Logical error `Cannot capture columns` in functions greatest/least. Closes [#29334](https://github.com/ClickHouse/ClickHouse/issues/29334). [#29454](https://github.com/ClickHouse/ClickHouse/pull/29454) ([Kruglov Pavel](https://github.com/Avogar)). +* RocksDB table engine: fix race condition during multiple DB opening (and get back some tests that triggers the problem on CI). [#29393](https://github.com/ClickHouse/ClickHouse/pull/29393) ([Azat Khuzhin](https://github.com/azat)). +* Fix replicated access storage not shutting down cleanly when misconfigured. [#29388](https://github.com/ClickHouse/ClickHouse/pull/29388) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Remove window function `nth_value` as it is not memory-safe. This closes [#29347](https://github.com/ClickHouse/ClickHouse/issues/29347). [#29348](https://github.com/ClickHouse/ClickHouse/pull/29348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix vertical merges of projection parts. This fixes [#29253](https://github.com/ClickHouse/ClickHouse/issues/29253) . This PR also fixes several projection merge/mutation issues introduced in https://github.com/ClickHouse/ClickHouse/pull/25165. [#29337](https://github.com/ClickHouse/ClickHouse/pull/29337) ([Amos Bird](https://github.com/amosbird)). +* Fix hanging DDL queries on Replicated database while adding a new replica. [#29328](https://github.com/ClickHouse/ClickHouse/pull/29328) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Fix connection timeouts (`send_timeout`/`receive_timeout`). [#29282](https://github.com/ClickHouse/ClickHouse/pull/29282) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible `Table columns structure in ZooKeeper is different from local table structure` exception while recreating or creating new replicas of `ReplicatedMergeTree`, when one of table columns have default expressions with case-insensitive functions. [#29266](https://github.com/ClickHouse/ClickHouse/pull/29266) ([Anton Popov](https://github.com/CurtizJ)). +* Send normal `Database doesn't exist error` (`UNKNOWN_DATABASE`) to the client (via TCP) instead of `Attempt to read after eof` (`ATTEMPT_TO_READ_AFTER_EOF`). [#29229](https://github.com/ClickHouse/ClickHouse/pull/29229) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault while inserting into column with type LowCardinality(Nullable) in Avro input format. [#29132](https://github.com/ClickHouse/ClickHouse/pull/29132) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not allow to reuse previous credentials in case of inter-server secret (Before INSERT via Buffer/Kafka to Distributed table with interserver secret configured for that cluster, may re-use previously set user for that connection). [#29060](https://github.com/ClickHouse/ClickHouse/pull/29060) ([Azat Khuzhin](https://github.com/azat)). +* Handle `any_join_distinct_right_table_keys` when join with dictionary, close [#29007](https://github.com/ClickHouse/ClickHouse/issues/29007). [#29014](https://github.com/ClickHouse/ClickHouse/pull/29014) ([Vladimir C](https://github.com/vdimir)). +* Fix "Not found column ... in block" error, when join on alias column, close [#26980](https://github.com/ClickHouse/ClickHouse/issues/26980). [#29008](https://github.com/ClickHouse/ClickHouse/pull/29008) ([Vladimir C](https://github.com/vdimir)). +* Fix the number of threads used in `GLOBAL IN` subquery (it was executed in single threads since [#19414](https://github.com/ClickHouse/ClickHouse/issues/19414) bugfix). [#28997](https://github.com/ClickHouse/ClickHouse/pull/28997) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bad optimizations of ORDER BY if it contains WITH FILL. This closes [#28908](https://github.com/ClickHouse/ClickHouse/issues/28908). This closes [#26049](https://github.com/ClickHouse/ClickHouse/issues/26049). [#28910](https://github.com/ClickHouse/ClickHouse/pull/28910) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix higher-order array functions (`SIGSEGV` for `arrayCompact`/`ILLEGAL_COLUMN` for `arrayDifference`/`arrayCumSumNonNegative`) with consts. [#28904](https://github.com/ClickHouse/ClickHouse/pull/28904) ([Azat Khuzhin](https://github.com/azat)). +* Fix waiting for mutation with `mutations_sync=2`. [#28889](https://github.com/ClickHouse/ClickHouse/pull/28889) ([Azat Khuzhin](https://github.com/azat)). +* Fix queries to external databases (i.e. MySQL) with multiple columns in IN ( i.e. `(k,v) IN ((1, 2))` ). [#28888](https://github.com/ClickHouse/ClickHouse/pull/28888) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug with `LowCardinality` in short-curcuit function evaluation. Closes [#28884](https://github.com/ClickHouse/ClickHouse/issues/28884). [#28887](https://github.com/ClickHouse/ClickHouse/pull/28887) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of subcolumns from compact parts. [#28873](https://github.com/ClickHouse/ClickHouse/pull/28873) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed a race condition between `DROP PART` and `REPLACE/MOVE PARTITION` that might cause replicas to diverge in rare cases. [#28864](https://github.com/ClickHouse/ClickHouse/pull/28864) ([tavplubix](https://github.com/tavplubix)). +* Fix expressions compilation with short circuit evaluation. [#28821](https://github.com/ClickHouse/ClickHouse/pull/28821) ([Azat Khuzhin](https://github.com/azat)). +* Fix extremely rare case when ReplicatedMergeTree replicas can diverge after hard reboot of all replicas. The error looks like `Part ... intersects (previous|next) part ...`. [#28817](https://github.com/ClickHouse/ClickHouse/pull/28817) ([alesapin](https://github.com/alesapin)). +* Better check for connection usability and also catch any exception in `RabbitMQ` shutdown just in case. [#28797](https://github.com/ClickHouse/ClickHouse/pull/28797) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix benign race condition in ReplicatedMergeTreeQueue. Shouldn't be visible for user, but can lead to subtle bugs. [#28734](https://github.com/ClickHouse/ClickHouse/pull/28734) ([alesapin](https://github.com/alesapin)). +* Fix possible crash for `SELECT` with partially created aggregate projection in case of exception. [#28700](https://github.com/ClickHouse/ClickHouse/pull/28700) ([Amos Bird](https://github.com/amosbird)). +* Fix the coredump in the creation of distributed tables, when the parameters passed in are wrong. [#28686](https://github.com/ClickHouse/ClickHouse/pull/28686) ([Zhiyong Wang](https://github.com/ljcui)). +* Add Settings.Names, Settings.Values aliases for system.processes table. [#28685](https://github.com/ClickHouse/ClickHouse/pull/28685) ([Vitaly](https://github.com/orloffv)). +* Support for S2 Geometry library: Fix the number of arguments required by `s2RectAdd` and `s2RectContains` functions. [#28663](https://github.com/ClickHouse/ClickHouse/pull/28663) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix invalid constant type conversion when Nullable or LowCardinality primary key is used. [#28636](https://github.com/ClickHouse/ClickHouse/pull/28636) ([Amos Bird](https://github.com/amosbird)). +* Fix "Column is not under aggregate function and not in GROUP BY" with PREWHERE (Fixes: [#28461](https://github.com/ClickHouse/ClickHouse/issues/28461)). [#28502](https://github.com/ClickHouse/ClickHouse/pull/28502) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v21.10, 2021-10-16 + +#### Backward Incompatible Change + +* Now the following MergeTree table-level settings: `replicated_max_parallel_sends`, `replicated_max_parallel_sends_for_table`, `replicated_max_parallel_fetches`, `replicated_max_parallel_fetches_for_table` do nothing. They never worked well and were replaced with `max_replicated_fetches_network_bandwidth`, `max_replicated_sends_network_bandwidth` and `background_fetches_pool_size`. [#28404](https://github.com/ClickHouse/ClickHouse/pull/28404) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* Add feature for creating user-defined functions (UDF) as lambda expressions. Syntax `CREATE FUNCTION {function_name} as ({parameters}) -> {function core}`. Example `CREATE FUNCTION plus_one as (a) -> a + 1`. Authors @Realist007. [#27796](https://github.com/ClickHouse/ClickHouse/pull/27796) ([Maksim Kita](https://github.com/kitaisreal)) [#23978](https://github.com/ClickHouse/ClickHouse/pull/23978) ([Realist007](https://github.com/Realist007)). +* Added `Executable` storage engine and `executable` table function. It enables data processing with external scripts in streaming fashion. [#28102](https://github.com/ClickHouse/ClickHouse/pull/28102) ([Maksim Kita](https://github.com/kitaisreal)) ([ruct](https://github.com/ruct)). +* Added `ExecutablePool` storage engine. Similar to `Executable` but it's using a pool of long running processes. [#28518](https://github.com/ClickHouse/ClickHouse/pull/28518) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `ALTER TABLE ... MATERIALIZE COLUMN` query. [#27038](https://github.com/ClickHouse/ClickHouse/pull/27038) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Support for partitioned write into `s3` table function. [#23051](https://github.com/ClickHouse/ClickHouse/pull/23051) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Support `lz4` compression format (in addition to `gz`, `bz2`, `xz`, `zstd`) for data import / export. [#25310](https://github.com/ClickHouse/ClickHouse/pull/25310) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow positional arguments under setting `enable_positional_arguments`. Closes [#2592](https://github.com/ClickHouse/ClickHouse/issues/2592). [#27530](https://github.com/ClickHouse/ClickHouse/pull/27530) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Accept user settings related to file formats in `SETTINGS` clause in `CREATE` query for s3 tables. This closes [#27580](https://github.com/ClickHouse/ClickHouse/issues/27580). [#28037](https://github.com/ClickHouse/ClickHouse/pull/28037) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow SSL connection for `RabbitMQ` engine. [#28365](https://github.com/ClickHouse/ClickHouse/pull/28365) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `getServerPort` function to allow getting server port. When the port is not used by the server, throw an exception. [#27900](https://github.com/ClickHouse/ClickHouse/pull/27900) ([Amos Bird](https://github.com/amosbird)). +* Add conversion functions between "snowflake id" and `DateTime`, `DateTime64`. See [#27058](https://github.com/ClickHouse/ClickHouse/issues/27058). [#27704](https://github.com/ClickHouse/ClickHouse/pull/27704) ([jasine](https://github.com/jasine)). +* Add function `SHA512`. [#27830](https://github.com/ClickHouse/ClickHouse/pull/27830) ([zhanglistar](https://github.com/zhanglistar)). +* Add `log_queries_probability` setting that allows user to write to query_log only a sample of queries. Closes [#16609](https://github.com/ClickHouse/ClickHouse/issues/16609). [#27527](https://github.com/ClickHouse/ClickHouse/pull/27527) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Experimental Feature + +* `web` type of disks to store readonly tables on web server in form of static files. See [#23982](https://github.com/ClickHouse/ClickHouse/issues/23982). [#25251](https://github.com/ClickHouse/ClickHouse/pull/25251) ([Kseniia Sumarokova](https://github.com/kssenii)). This is mostly needed to faciliate testing of operation on shared storage and for easy importing of datasets. Not recommended to use before release 21.11. +* Added new commands `BACKUP` and `RESTORE`. [#21945](https://github.com/ClickHouse/ClickHouse/pull/21945) ([Vitaly Baranov](https://github.com/vitlibar)). This is under development and not intended to be used in current version. + +#### Performance Improvement + +* Speed up `sumIf` and `countIf` aggregation functions. [#28272](https://github.com/ClickHouse/ClickHouse/pull/28272) ([Raúl Marín](https://github.com/Algunenano)). +* Create virtual projection for `minmax` indices. Now, when `allow_experimental_projection_optimization` is enabled, queries will use minmax index instead of reading the data when possible. [#26286](https://github.com/ClickHouse/ClickHouse/pull/26286) ([Amos Bird](https://github.com/amosbird)). +* Introducing two checks in `sequenceMatch` and `sequenceCount` that allow for early exit when some deterministic part of the sequence pattern is missing from the events list. This change unlocks many queries that would previously fail due to reaching operations cap, and generally speeds up the pipeline. [#27729](https://github.com/ClickHouse/ClickHouse/pull/27729) ([Jakub Kuklis](https://github.com/jkuklis)). +* Enhance primary key analysis with always monotonic information of binary functions, notably non-zero constant division. [#28302](https://github.com/ClickHouse/ClickHouse/pull/28302) ([Amos Bird](https://github.com/amosbird)). +* Make `hasAll` filter condition leverage bloom filter data-skipping indexes. [#27984](https://github.com/ClickHouse/ClickHouse/pull/27984) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Speed up data parts loading by delaying table startup process. [#28313](https://github.com/ClickHouse/ClickHouse/pull/28313) ([Amos Bird](https://github.com/amosbird)). +* Fixed possible excessive number of conditions moved from `WHERE` to `PREWHERE` (optimization controlled by settings `optimize_move_to_prewhere`). [#28139](https://github.com/ClickHouse/ClickHouse/pull/28139) ([lthaooo](https://github.com/lthaooo)). +* Enable `optimize_distributed_group_by_sharding_key` by default. [#28105](https://github.com/ClickHouse/ClickHouse/pull/28105) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Check cluster name before creating `Distributed` table, do not allow to create a table with incorrect cluster name. Fixes [#27832](https://github.com/ClickHouse/ClickHouse/issues/27832). [#27927](https://github.com/ClickHouse/ClickHouse/pull/27927) ([tavplubix](https://github.com/tavplubix)). +* Add aggregate function `quantileBFloat16Weighted` similarly to other quantile...Weighted functions. This closes [#27745](https://github.com/ClickHouse/ClickHouse/issues/27745). [#27758](https://github.com/ClickHouse/ClickHouse/pull/27758) ([Ivan Novitskiy](https://github.com/RedClusive)). +* Allow to create dictionaries with empty attributes list. [#27905](https://github.com/ClickHouse/ClickHouse/pull/27905) ([Maksim Kita](https://github.com/kitaisreal)). +* Add interactive documentation in `clickhouse-client` about how to reset the password. This is useful in scenario when user has installed ClickHouse, set up the password and instantly forget it. See [#27750](https://github.com/ClickHouse/ClickHouse/issues/27750). [#27903](https://github.com/ClickHouse/ClickHouse/pull/27903) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support the case when the data is enclosed in array in `JSONAsString` input format. Closes [#25517](https://github.com/ClickHouse/ClickHouse/issues/25517). [#25633](https://github.com/ClickHouse/ClickHouse/pull/25633) ([Kruglov Pavel](https://github.com/Avogar)). +* Add new column `last_queue_update_exception` to `system.replicas` table. [#26843](https://github.com/ClickHouse/ClickHouse/pull/26843) ([nvartolomei](https://github.com/nvartolomei)). +* Support reconnections on failover for `MaterializedPostgreSQL` tables. Closes [#28529](https://github.com/ClickHouse/ClickHouse/issues/28529). [#28614](https://github.com/ClickHouse/ClickHouse/pull/28614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Generate a unique server UUID on first server start. [#20089](https://github.com/ClickHouse/ClickHouse/pull/20089) ([Bharat Nallan](https://github.com/bharatnc)). +* Introduce `connection_wait_timeout` (default to 5 seconds, 0 - do not wait) setting for `MySQL` engine. [#28474](https://github.com/ClickHouse/ClickHouse/pull/28474) ([Azat Khuzhin](https://github.com/azat)). +* Do not allow creating `MaterializedPostgreSQL` with bad arguments. Closes [#28423](https://github.com/ClickHouse/ClickHouse/issues/28423). [#28430](https://github.com/ClickHouse/ClickHouse/pull/28430) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Use real tmp file instead of predefined "rows_sources" for vertical merges. This avoids generating garbage directories in tmp disks. [#28299](https://github.com/ClickHouse/ClickHouse/pull/28299) ([Amos Bird](https://github.com/amosbird)). +* Added `libhdfs3_conf` in server config instead of export env `LIBHDFS3_CONF` in clickhouse-server.service. This is for configuration of interaction with HDFS. [#28268](https://github.com/ClickHouse/ClickHouse/pull/28268) ([Zhichang Yu](https://github.com/yuzhichang)). +* Fix removing of parts in a Temporary state which can lead to an unexpected exception (`Part %name% doesn't exist`). Fixes [#23661](https://github.com/ClickHouse/ClickHouse/issues/23661). [#28221](https://github.com/ClickHouse/ClickHouse/pull/28221) [#28221](https://github.com/ClickHouse/ClickHouse/issues/28221)) ([Azat Khuzhin](https://github.com/azat)). +* Fix `zookeeper_log.address` (before the first patch in this PR the address was always `::`) and reduce number of calls `getpeername(2)` for this column (since each time entry for `zookeeper_log` is added `getpeername()` is called, cache this address in the zookeeper client to avoid this). [#28212](https://github.com/ClickHouse/ClickHouse/pull/28212) ([Azat Khuzhin](https://github.com/azat)). +* Support implicit conversions between index in operator `[]` and key of type `Map` (e.g. different `Int` types, `String` and `FixedString`). [#28096](https://github.com/ClickHouse/ClickHouse/pull/28096) ([Anton Popov](https://github.com/CurtizJ)). +* Support `ON CONFLICT` clause when inserting into PostgreSQL table engine or table function. Closes [#27727](https://github.com/ClickHouse/ClickHouse/issues/27727). [#28081](https://github.com/ClickHouse/ClickHouse/pull/28081) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Lower restrictions for `Enum` data type to allow attaching compatible data. Closes [#26672](https://github.com/ClickHouse/ClickHouse/issues/26672). [#28028](https://github.com/ClickHouse/ClickHouse/pull/28028) ([Dmitry Novik](https://github.com/novikd)). +* Add a setting `empty_result_for_aggregation_by_constant_keys_on_empty_set` to control the behavior of grouping by constant keys on empty set. This is to bring back the old baviour of [#6842](https://github.com/ClickHouse/ClickHouse/issues/6842). [#27932](https://github.com/ClickHouse/ClickHouse/pull/27932) ([Amos Bird](https://github.com/amosbird)). +* Added `replication_wait_for_inactive_replica_timeout` setting. It allows to specify how long to wait for inactive replicas to execute `ALTER`/`OPTIMZE`/`TRUNCATE` query (default is 120 seconds). If `replication_alter_partitions_sync` is 2 and some replicas are not active for more than `replication_wait_for_inactive_replica_timeout` seconds, then `UNFINISHED` will be thrown. [#27931](https://github.com/ClickHouse/ClickHouse/pull/27931) ([tavplubix](https://github.com/tavplubix)). +* Support lambda argument for `APPLY` column transformer which allows applying functions with more than one argument. This is for [#27877](https://github.com/ClickHouse/ClickHouse/issues/27877). [#27901](https://github.com/ClickHouse/ClickHouse/pull/27901) ([Amos Bird](https://github.com/amosbird)). +* Enable `tcp_keep_alive_timeout` by default. [#27882](https://github.com/ClickHouse/ClickHouse/pull/27882) ([Azat Khuzhin](https://github.com/azat)). +* Improve remote query cancelation (in case of remote server abnormaly terminated). [#27881](https://github.com/ClickHouse/ClickHouse/pull/27881) ([Azat Khuzhin](https://github.com/azat)). +* Use Multipart copy upload for large S3 objects. [#27858](https://github.com/ClickHouse/ClickHouse/pull/27858) ([ianton-ru](https://github.com/ianton-ru)). +* Allow symlink traversal for library dictionaty path. [#27815](https://github.com/ClickHouse/ClickHouse/pull/27815) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now `ALTER MODIFY COLUM` `T` to `Nullable(T)` doesn't require mutation. [#27787](https://github.com/ClickHouse/ClickHouse/pull/27787) ([victorgao](https://github.com/kafka1991)). +* Don't silently ignore errors and don't count delays in `ReadBufferFromS3`. [#27484](https://github.com/ClickHouse/ClickHouse/pull/27484) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Improve `ALTER ... MATERIALIZE TTL` by recalculating metadata only without actual TTL action. [#27019](https://github.com/ClickHouse/ClickHouse/pull/27019) ([lthaooo](https://github.com/lthaooo)). +* Allow reading the list of custom top level domains without a new line at EOF. [#28213](https://github.com/ClickHouse/ClickHouse/pull/28213) ([Azat Khuzhin](https://github.com/azat)). + +#### Bug Fix + +* Fix cases, when reading compressed data from `carbon-clickhouse` fails with 'attempt to read after end of file'. Closes [#26149](https://github.com/ClickHouse/ClickHouse/issues/26149). [#28150](https://github.com/ClickHouse/ClickHouse/pull/28150) ([FArthur-cmd](https://github.com/FArthur-cmd)). +* Fix checking access grants when executing `GRANT WITH REPLACE` statement with `ON CLUSTER` clause. This PR improves fix [#27001](https://github.com/ClickHouse/ClickHouse/pull/27701). [#27983](https://github.com/ClickHouse/ClickHouse/pull/27983) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow selecting with `extremes = 1` from a column of the type `LowCardinality(UUID)`. [#27918](https://github.com/ClickHouse/ClickHouse/pull/27918) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix PostgreSQL-style cast (`::` operator) with negative numbers. [#27876](https://github.com/ClickHouse/ClickHouse/pull/27876) ([Anton Popov](https://github.com/CurtizJ)). +* After [#26864](https://github.com/ClickHouse/ClickHouse/pull/26864). Fix shutdown of `NamedSessionStorage`: session contexts stored in `NamedSessionStorage` are now destroyed before destroying the global context. [#27875](https://github.com/ClickHouse/ClickHouse/pull/27875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Bugfix for `windowFunnel` "strict" mode. This fixes [#27469](https://github.com/ClickHouse/ClickHouse/issues/27469). [#27563](https://github.com/ClickHouse/ClickHouse/pull/27563) ([achimbab](https://github.com/achimbab)). +* Fix infinite loop while reading truncated `bzip2` archive. [#28543](https://github.com/ClickHouse/ClickHouse/pull/28543) ([Azat Khuzhin](https://github.com/azat)). +* Fix UUID overlap in `DROP TABLE` for internal DDL from `MaterializedMySQL`. MaterializedMySQL is an experimental feature. [#28533](https://github.com/ClickHouse/ClickHouse/pull/28533) ([Azat Khuzhin](https://github.com/azat)). +* Fix `There is no subcolumn` error, while select from tables, which have `Nested` columns and scalar columns with dot in name and the same prefix as `Nested` (e.g. `n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)`). [#28531](https://github.com/ClickHouse/ClickHouse/pull/28531) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug which can lead to error `Existing table metadata in ZooKeeper differs in sorting key expression.` after ALTER of `ReplicatedVersionedCollapsingMergeTree`. Fixes [#28515](https://github.com/ClickHouse/ClickHouse/issues/28515). [#28528](https://github.com/ClickHouse/ClickHouse/pull/28528) ([alesapin](https://github.com/alesapin)). +* Fixed possible ZooKeeper watches leak (minor issue) on background processing of distributed DDL queue. Closes [#26036](https://github.com/ClickHouse/ClickHouse/issues/26036). [#28446](https://github.com/ClickHouse/ClickHouse/pull/28446) ([tavplubix](https://github.com/tavplubix)). +* Fix missing quoting of table names in `MaterializedPostgreSQL` engine. Closes [#28316](https://github.com/ClickHouse/ClickHouse/issues/28316). [#28433](https://github.com/ClickHouse/ClickHouse/pull/28433) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix the wrong behaviour of non joined rows from nullable column. Close [#27691](https://github.com/ClickHouse/ClickHouse/issues/27691). [#28349](https://github.com/ClickHouse/ClickHouse/pull/28349) ([vdimir](https://github.com/vdimir)). +* Fix NOT-IN index optimization when not all key columns are used. This fixes [#28120](https://github.com/ClickHouse/ClickHouse/issues/28120). [#28315](https://github.com/ClickHouse/ClickHouse/pull/28315) ([Amos Bird](https://github.com/amosbird)). +* Fix intersecting parts due to new part had been replaced with an empty part. [#28310](https://github.com/ClickHouse/ClickHouse/pull/28310) ([Azat Khuzhin](https://github.com/azat)). +* Fix inconsistent result in queries with `ORDER BY` and `Merge` tables with enabled setting `optimize_read_in_order`. [#28266](https://github.com/ClickHouse/ClickHouse/pull/28266) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible read of uninitialized memory for queries with `Nullable(LowCardinality)` type and the setting `extremes` set to 1. Fixes [#28165](https://github.com/ClickHouse/ClickHouse/issues/28165). [#28205](https://github.com/ClickHouse/ClickHouse/pull/28205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Multiple small fixes for projections. See detailed description in the PR. [#28178](https://github.com/ClickHouse/ClickHouse/pull/28178) ([Amos Bird](https://github.com/amosbird)). +* Fix extremely rare segfaults on shutdown due to incorrect order of context/config reloader shutdown. [#28088](https://github.com/ClickHouse/ClickHouse/pull/28088) ([nvartolomei](https://github.com/nvartolomei)). +* Fix handling null value with type of `Nullable(String)` in function `JSONExtract`. This fixes [#27929](https://github.com/ClickHouse/ClickHouse/issues/27929) and [#27930](https://github.com/ClickHouse/ClickHouse/issues/27930). This was introduced in https://github.com/ClickHouse/ClickHouse/pull/25452 . [#27939](https://github.com/ClickHouse/ClickHouse/pull/27939) ([Amos Bird](https://github.com/amosbird)). +* Multiple fixes for the new `clickhouse-keeper` tool. Fix a rare bug in `clickhouse-keeper` when the client can receive a watch response before request-response. [#28197](https://github.com/ClickHouse/ClickHouse/pull/28197) ([alesapin](https://github.com/alesapin)). Fix incorrect behavior in `clickhouse-keeper` when list watches (`getChildren`) triggered with `set` requests for children. [#28190](https://github.com/ClickHouse/ClickHouse/pull/28190) ([alesapin](https://github.com/alesapin)). Fix rare case when changes of `clickhouse-keeper` settings may lead to lost logs and server hung. [#28360](https://github.com/ClickHouse/ClickHouse/pull/28360) ([alesapin](https://github.com/alesapin)). Fix bug in `clickhouse-keeper` which can lead to endless logs when `rotate_logs_interval` decreased. [#28152](https://github.com/ClickHouse/ClickHouse/pull/28152) ([alesapin](https://github.com/alesapin)). + +#### Build/Testing/Packaging Improvement + +* Enable Thread Fuzzer in Stress Test. Thread Fuzzer is ClickHouse feature that allows to test more permutations of thread scheduling and discover more potential issues. This closes [#9813](https://github.com/ClickHouse/ClickHouse/issues/9813). This closes [#9814](https://github.com/ClickHouse/ClickHouse/issues/9814). This closes [#9515](https://github.com/ClickHouse/ClickHouse/issues/9515). This closes [#9516](https://github.com/ClickHouse/ClickHouse/issues/9516). [#27538](https://github.com/ClickHouse/ClickHouse/pull/27538) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new log level `test` for testing environments. It is even more verbose than the default `trace`. [#28559](https://github.com/ClickHouse/ClickHouse/pull/28559) ([alesapin](https://github.com/alesapin)). +* Print out git status information at CMake configure stage. [#28047](https://github.com/ClickHouse/ClickHouse/pull/28047) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Temporarily switched ubuntu apt repository to mirror ru.archive.ubuntu.com as the default one (archive.ubuntu.com) is not responding from our CI. [#28016](https://github.com/ClickHouse/ClickHouse/pull/28016) ([Ilya Yatsishin](https://github.com/qoega)). + + + +### ClickHouse release v21.9, 2021-09-09 + +#### Backward Incompatible Change + +* Do not output trailing zeros in text representation of `Decimal` types. Example: `1.23` will be printed instead of `1.230000` for decimal with scale 6. This closes [#15794](https://github.com/ClickHouse/ClickHouse/issues/15794). It may introduce slight incompatibility if your applications somehow relied on the trailing zeros. Serialization in output formats can be controlled with the setting `output_format_decimal_trailing_zeros`. Implementation of `toString` and casting to String is changed unconditionally. [#27680](https://github.com/ClickHouse/ClickHouse/pull/27680) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not allow to apply parametric aggregate function with `-Merge` combinator to aggregate function state if state was produced by aggregate function with different parameters. For example, state of `fooState(42)(x)` cannot be finalized with `fooMerge(s)` or `fooMerge(123)(s)`, parameters must be specified explicitly like `fooMerge(42)(s)` and must be equal. It does not affect some special aggregate functions like `quantile` and `sequence*` that use parameters for finalization only. [#26847](https://github.com/ClickHouse/ClickHouse/pull/26847) ([tavplubix](https://github.com/tavplubix)). +* Under clickhouse-local, always treat local addresses with a port as remote. [#26736](https://github.com/ClickHouse/ClickHouse/pull/26736) ([Raúl Marín](https://github.com/Algunenano)). +* Fix the issue that in case of some sophisticated query with column aliases identical to the names of expressions, bad cast may happen. This fixes [#25447](https://github.com/ClickHouse/ClickHouse/issues/25447). This fixes [#26914](https://github.com/ClickHouse/ClickHouse/issues/26914). This fix may introduce backward incompatibility: if there are different expressions with identical names, exception will be thrown. It may break some rare cases when `enable_optimize_predicate_expression` is set. [#26639](https://github.com/ClickHouse/ClickHouse/pull/26639) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now, scalar subquery always returns `Nullable` result if it's type can be `Nullable`. It is needed because in case of empty subquery it's result should be `Null`. Previously, it was possible to get error about incompatible types (type deduction does not execute scalar subquery, and it could use not-nullable type). Scalar subquery with empty result which can't be converted to `Nullable` (like `Array` or `Tuple`) now throws error. Fixes [#25411](https://github.com/ClickHouse/ClickHouse/issues/25411). [#26423](https://github.com/ClickHouse/ClickHouse/pull/26423) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Introduce syntax for here documents. Example `SELECT $doc$ VALUE $doc$`. [#26671](https://github.com/ClickHouse/ClickHouse/pull/26671) ([Maksim Kita](https://github.com/kitaisreal)). This change is backward incompatible if in query there are identifiers that contain `$` [#28768](https://github.com/ClickHouse/ClickHouse/issues/28768). +* Now indices can handle Nullable types, including `isNull` and `isNotNull`. [#12433](https://github.com/ClickHouse/ClickHouse/pull/12433) and [#12455](https://github.com/ClickHouse/ClickHouse/pull/12455) ([Amos Bird](https://github.com/amosbird)) and [#27250](https://github.com/ClickHouse/ClickHouse/pull/27250) ([Azat Khuzhin](https://github.com/azat)). But this was done with on-disk format changes, and even though new server can read old data, old server cannot. Also, in case you have `MINMAX` data skipping indices, you may get `Data after mutation/merge is not byte-identical` error, since new index will have `.idx2` extension while before it was `.idx`. That said, that you should not delay updating all existing replicas, in this case, otherwise, if old replica (<21.9) will download data from new replica with 21.9+ it will not be able to apply index for downloaded part. + +#### New Feature + +* Implementation of short circuit function evaluation, closes [#12587](https://github.com/ClickHouse/ClickHouse/issues/12587). Add settings `short_circuit_function_evaluation` to configure short circuit function evaluation. [#23367](https://github.com/ClickHouse/ClickHouse/pull/23367) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for INTERSECT, EXCEPT, ANY, ALL operators. [#24757](https://github.com/ClickHouse/ClickHouse/pull/24757) ([Kirill Ershov](https://github.com/zdikov)). ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for encryption at the virtual file system level (data encryption at rest) using AES-CTR algorithm. [#24206](https://github.com/ClickHouse/ClickHouse/pull/24206) ([Latysheva Alexandra](https://github.com/alexelex)). ([Vitaly Baranov](https://github.com/vitlibar)) [#26733](https://github.com/ClickHouse/ClickHouse/pull/26733) [#26377](https://github.com/ClickHouse/ClickHouse/pull/26377) [#26465](https://github.com/ClickHouse/ClickHouse/pull/26465). +* Added natural language processing (NLP) functions for tokenization, stemming, lemmatizing and search in synonyms extensions. [#24997](https://github.com/ClickHouse/ClickHouse/pull/24997) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added integration with S2 geometry library. [#24980](https://github.com/ClickHouse/ClickHouse/pull/24980) ([Andr0901](https://github.com/Andr0901)). ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add SQLite table engine, table function, database engine. [#24194](https://github.com/ClickHouse/ClickHouse/pull/24194) ([Arslan Gumerov](https://github.com/g-arslan)). ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added support for custom query for `MySQL`, `PostgreSQL`, `ClickHouse`, `JDBC`, `Cassandra` dictionary source. Closes [#1270](https://github.com/ClickHouse/ClickHouse/issues/1270). [#26995](https://github.com/ClickHouse/ClickHouse/pull/26995) ([Maksim Kita](https://github.com/kitaisreal)). +* Add shared (replicated) storage of user, roles, row policies, quotas and settings profiles through ZooKeeper. [#27426](https://github.com/ClickHouse/ClickHouse/pull/27426) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Add compression for `INTO OUTFILE` that automatically choose compression algorithm. Closes [#3473](https://github.com/ClickHouse/ClickHouse/issues/3473). [#27134](https://github.com/ClickHouse/ClickHouse/pull/27134) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add `INSERT ... FROM INFILE` similarly to `SELECT ... INTO OUTFILE`. [#27655](https://github.com/ClickHouse/ClickHouse/pull/27655) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Added `complex_key_range_hashed` dictionary. Closes [#22029](https://github.com/ClickHouse/ClickHouse/issues/22029). [#27629](https://github.com/ClickHouse/ClickHouse/pull/27629) ([Maksim Kita](https://github.com/kitaisreal)). +* Support expressions in JOIN ON section. Close [#21868](https://github.com/ClickHouse/ClickHouse/issues/21868). [#24420](https://github.com/ClickHouse/ClickHouse/pull/24420) ([Vladimir C](https://github.com/vdimir)). +* When client connects to server, it receives information about all warnings that are already were collected by server. (It can be disabled by using option `--no-warnings`). Add `system.warnings` table to collect warnings about server configuration. [#26246](https://github.com/ClickHouse/ClickHouse/pull/26246) ([Filatenkov Artur](https://github.com/FArthur-cmd)). [#26282](https://github.com/ClickHouse/ClickHouse/pull/26282) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Allow using constant expressions from with and select in aggregate function parameters. Close [#10945](https://github.com/ClickHouse/ClickHouse/issues/10945). [#27531](https://github.com/ClickHouse/ClickHouse/pull/27531) ([abel-cheng](https://github.com/abel-cheng)). +* Add `tupleToNameValuePairs`, a function that turns a named tuple into an array of pairs. [#27505](https://github.com/ClickHouse/ClickHouse/pull/27505) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Add support for `bzip2` compression method for import/export. Closes [#22428](https://github.com/ClickHouse/ClickHouse/issues/22428). [#27377](https://github.com/ClickHouse/ClickHouse/pull/27377) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added `bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit)` function. It creates a subset of bitmap limit the results to `cardinality_limit` with offset of `offset`. [#27234](https://github.com/ClickHouse/ClickHouse/pull/27234) ([DHBin](https://github.com/DHBin)). +* Add column `default_database` to `system.users`. [#27054](https://github.com/ClickHouse/ClickHouse/pull/27054) ([kevin wan](https://github.com/MaxWk)). +* Supported `cluster` macros inside table functions 'cluster' and 'clusterAllReplicas'. [#26913](https://github.com/ClickHouse/ClickHouse/pull/26913) ([polyprogrammist](https://github.com/PolyProgrammist)). +* Add new functions `currentRoles()`, `enabledRoles()`, `defaultRoles()`. [#26780](https://github.com/ClickHouse/ClickHouse/pull/26780) ([Vitaly Baranov](https://github.com/vitlibar)). +* New functions `currentProfiles()`, `enabledProfiles()`, `defaultProfiles()`. [#26714](https://github.com/ClickHouse/ClickHouse/pull/26714) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add functions that return (initial_)query_id of the current query. This closes [#23682](https://github.com/ClickHouse/ClickHouse/issues/23682). [#26410](https://github.com/ClickHouse/ClickHouse/pull/26410) ([Alexey Boykov](https://github.com/mathalex)). +* Add `REPLACE GRANT` feature. [#26384](https://github.com/ClickHouse/ClickHouse/pull/26384) ([Caspian](https://github.com/Cas-pian)). +* `EXPLAIN` query now has `EXPLAIN ESTIMATE ...` mode that will show information about read rows, marks and parts from MergeTree tables. Closes [#23941](https://github.com/ClickHouse/ClickHouse/issues/23941). [#26131](https://github.com/ClickHouse/ClickHouse/pull/26131) ([fastio](https://github.com/fastio)). +* Added `system.zookeeper_log` table. All actions of ZooKeeper client are logged into this table. Implements [#25449](https://github.com/ClickHouse/ClickHouse/issues/25449). [#26129](https://github.com/ClickHouse/ClickHouse/pull/26129) ([tavplubix](https://github.com/tavplubix)). +* Zero-copy replication for `ReplicatedMergeTree` over `HDFS` storage. [#25918](https://github.com/ClickHouse/ClickHouse/pull/25918) ([Zhichang Yu](https://github.com/yuzhichang)). +* Allow to insert Nested type as array of structs in `Arrow`, `ORC` and `Parquet` input format. [#25902](https://github.com/ClickHouse/ClickHouse/pull/25902) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new datatype `Date32` (store data as Int32), support date range same with `DateTime64` support load parquet date32 to ClickHouse `Date32` Add new function `toDate32` like `toDate`. [#25774](https://github.com/ClickHouse/ClickHouse/pull/25774) ([LiuNeng](https://github.com/liuneng1994)). +* Allow setting default database for users. [#25268](https://github.com/ClickHouse/ClickHouse/issues/25268). [#25687](https://github.com/ClickHouse/ClickHouse/pull/25687) ([kevin wan](https://github.com/MaxWk)). +* Add an optional parameter to `MongoDB` engine to accept connection string options and support SSL connection. Closes [#21189](https://github.com/ClickHouse/ClickHouse/issues/21189). Closes [#21041](https://github.com/ClickHouse/ClickHouse/issues/21041). [#22045](https://github.com/ClickHouse/ClickHouse/pull/22045) ([Omar Bazaraa](https://github.com/OmarBazaraa)). + +#### Experimental Feature + +* Added a compression codec `AES_128_GCM_SIV` which encrypts columns instead of compressing them. [#19896](https://github.com/ClickHouse/ClickHouse/pull/19896) ([PHO](https://github.com/depressed-pho)). Will be rewritten, do not use. +* Rename `MaterializeMySQL` to `MaterializedMySQL`. [#26822](https://github.com/ClickHouse/ClickHouse/pull/26822) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Improve the performance of fast queries when `max_execution_time = 0` by reducing the number of `clock_gettime` system calls. [#27325](https://github.com/ClickHouse/ClickHouse/pull/27325) ([filimonov](https://github.com/filimonov)). +* Specialize date time related comparison to achieve better performance. This fixes [#27083](https://github.com/ClickHouse/ClickHouse/issues/27083) . [#27122](https://github.com/ClickHouse/ClickHouse/pull/27122) ([Amos Bird](https://github.com/amosbird)). +* Share file descriptors in concurrent reads of the same files. There is no noticeable performance difference on Linux. But the number of opened files will be significantly (10..100 times) lower on typical servers and it makes operations easier. See [#26214](https://github.com/ClickHouse/ClickHouse/issues/26214). [#26768](https://github.com/ClickHouse/ClickHouse/pull/26768) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve latency of short queries, that require reading from tables with large number of columns. [#26371](https://github.com/ClickHouse/ClickHouse/pull/26371) ([Anton Popov](https://github.com/CurtizJ)). +* Don't build sets for indices when analyzing a query. [#26365](https://github.com/ClickHouse/ClickHouse/pull/26365) ([Raúl Marín](https://github.com/Algunenano)). +* Vectorize the SUM of Nullable integer types with native representation ([David Manzanares](https://github.com/davidmanzanares), [Raúl Marín](https://github.com/Algunenano)). [#26248](https://github.com/ClickHouse/ClickHouse/pull/26248) ([Raúl Marín](https://github.com/Algunenano)). +* Compile expressions involving columns with `Enum` types. [#26237](https://github.com/ClickHouse/ClickHouse/pull/26237) ([Maksim Kita](https://github.com/kitaisreal)). +* Compile aggregate functions `groupBitOr`, `groupBitAnd`, `groupBitXor`. [#26161](https://github.com/ClickHouse/ClickHouse/pull/26161) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved memory usage with better block size prediction when reading empty DEFAULT columns. Closes [#17317](https://github.com/ClickHouse/ClickHouse/issues/17317). [#25917](https://github.com/ClickHouse/ClickHouse/pull/25917) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Reduce memory usage and number of read rows in queries with `ORDER BY primary_key`. [#25721](https://github.com/ClickHouse/ClickHouse/pull/25721) ([Anton Popov](https://github.com/CurtizJ)). +* Enable `distributed_push_down_limit` by default. [#27104](https://github.com/ClickHouse/ClickHouse/pull/27104) ([Azat Khuzhin](https://github.com/azat)). +* Make `toTimeZone` monotonicity when timeZone is a constant value to support partition puring when use sql like:. [#26261](https://github.com/ClickHouse/ClickHouse/pull/26261) ([huangzhaowei](https://github.com/SaintBacchus)). + +#### Improvement + +* Mark window functions as ready for general use. Remove the `allow_experimental_window_functions` setting. [#27184](https://github.com/ClickHouse/ClickHouse/pull/27184) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Improve compatibility with non-whole-minute timezone offsets. [#27080](https://github.com/ClickHouse/ClickHouse/pull/27080) ([Raúl Marín](https://github.com/Algunenano)). +* If file descriptor in `File` table is regular file - allow to read multiple times from it. It allows `clickhouse-local` to read multiple times from stdin (with multiple SELECT queries or subqueries) if stdin is a regular file like `clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file`. This closes [#11124](https://github.com/ClickHouse/ClickHouse/issues/11124). Co-authored with ([alexey-milovidov](https://github.com/alexey-milovidov)). [#25960](https://github.com/ClickHouse/ClickHouse/pull/25960) ([BoloniniD](https://github.com/BoloniniD)). +* Remove duplicate index analysis and avoid possible invalid limit checks during projection analysis. [#27742](https://github.com/ClickHouse/ClickHouse/pull/27742) ([Amos Bird](https://github.com/amosbird)). +* Enable query parameters to be passed in the body of HTTP requests. [#27706](https://github.com/ClickHouse/ClickHouse/pull/27706) ([Hermano Lustosa](https://github.com/hllustosa)). +* Disallow `arrayJoin` on partition expressions. [#27648](https://github.com/ClickHouse/ClickHouse/pull/27648) ([Raúl Marín](https://github.com/Algunenano)). +* Log client IP address if authentication fails. [#27514](https://github.com/ClickHouse/ClickHouse/pull/27514) ([Misko Lee](https://github.com/imiskolee)). +* Use bytes instead of strings for binary data in the GRPC protocol. [#27431](https://github.com/ClickHouse/ClickHouse/pull/27431) ([Vitaly Baranov](https://github.com/vitlibar)). +* Send response with error message if HTTP port is not set and user tries to send HTTP request to TCP port. [#27385](https://github.com/ClickHouse/ClickHouse/pull/27385) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Add `_CAST` function for internal usage, which will not preserve type nullability, but non-internal cast will preserve according to setting `cast_keep_nullable`. Closes [#12636](https://github.com/ClickHouse/ClickHouse/issues/12636). [#27382](https://github.com/ClickHouse/ClickHouse/pull/27382) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add setting `log_formatted_queries` to log additional formatted query into `system.query_log`. It's useful for normalized query analysis because functions like `normalizeQuery` and `normalizeQueryKeepNames` don't parse/format queries in order to achieve better performance. [#27380](https://github.com/ClickHouse/ClickHouse/pull/27380) ([Amos Bird](https://github.com/amosbird)). +* Add two settings `max_hyperscan_regexp_length` and `max_hyperscan_regexp_total_length` to prevent huge regexp being used in hyperscan related functions, such as `multiMatchAny`. [#27378](https://github.com/ClickHouse/ClickHouse/pull/27378) ([Amos Bird](https://github.com/amosbird)). +* Memory consumed by bitmap aggregate functions now is taken into account for memory limits. This closes [#26555](https://github.com/ClickHouse/ClickHouse/issues/26555). [#27252](https://github.com/ClickHouse/ClickHouse/pull/27252) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add 10 seconds cache for S3 proxy resolver. [#27216](https://github.com/ClickHouse/ClickHouse/pull/27216) ([ianton-ru](https://github.com/ianton-ru)). +* Split global mutex into individual regexp construction. This helps avoid huge regexp construction blocking other related threads. [#27211](https://github.com/ClickHouse/ClickHouse/pull/27211) ([Amos Bird](https://github.com/amosbird)). +* Support schema for PostgreSQL database engine. Closes [#27166](https://github.com/ClickHouse/ClickHouse/issues/27166). [#27198](https://github.com/ClickHouse/ClickHouse/pull/27198) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Track memory usage in clickhouse-client. [#27191](https://github.com/ClickHouse/ClickHouse/pull/27191) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Try recording `query_kind` in `system.query_log` even when query fails to start. [#27182](https://github.com/ClickHouse/ClickHouse/pull/27182) ([Amos Bird](https://github.com/amosbird)). +* Added columns `replica_is_active` that maps replica name to is replica active status to table `system.replicas`. Closes [#27138](https://github.com/ClickHouse/ClickHouse/issues/27138). [#27180](https://github.com/ClickHouse/ClickHouse/pull/27180) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to pass query settings via server URI in Web UI. [#27177](https://github.com/ClickHouse/ClickHouse/pull/27177) ([kolsys](https://github.com/kolsys)). +* Add a new metric called `MaxPushedDDLEntryID` which is the maximum ddl entry id that current node push to zookeeper. [#27174](https://github.com/ClickHouse/ClickHouse/pull/27174) ([Fuwang Hu](https://github.com/fuwhu)). +* Improved the existence condition judgment and empty string node judgment when `clickhouse-keeper` creates znode. [#27125](https://github.com/ClickHouse/ClickHouse/pull/27125) ([小路](https://github.com/nicelulu)). +* Merge JOIN correctly handles empty set in the right. [#27078](https://github.com/ClickHouse/ClickHouse/pull/27078) ([Vladimir C](https://github.com/vdimir)). +* Now functions can be shard-level constants, which means if it's executed in the context of some distributed table, it generates a normal column, otherwise it produces a constant value. Notable functions are: `hostName()`, `tcpPort()`, `version()`, `buildId()`, `uptime()`, etc. [#27020](https://github.com/ClickHouse/ClickHouse/pull/27020) ([Amos Bird](https://github.com/amosbird)). +* Updated `extractAllGroupsHorizontal` - upper limit on the number of matches per row can be set via optional third argument. [#26961](https://github.com/ClickHouse/ClickHouse/pull/26961) ([Vasily Nemkov](https://github.com/Enmk)). +* Expose `RocksDB` statistics via system.rocksdb table. Read rocksdb options from ClickHouse config (`rocksdb...` keys). NOTE: ClickHouse does not rely on RocksDB, it is just one of the additional integration storage engines. [#26821](https://github.com/ClickHouse/ClickHouse/pull/26821) ([Azat Khuzhin](https://github.com/azat)). +* Less verbose internal RocksDB logs. NOTE: ClickHouse does not rely on RocksDB, it is just one of the additional integration storage engines. This closes [#26252](https://github.com/ClickHouse/ClickHouse/issues/26252). [#26789](https://github.com/ClickHouse/ClickHouse/pull/26789) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Changing default roles affects new sessions only. [#26759](https://github.com/ClickHouse/ClickHouse/pull/26759) ([Vitaly Baranov](https://github.com/vitlibar)). +* Watchdog is disabled in docker by default. Fix for not handling ctrl+c. [#26757](https://github.com/ClickHouse/ClickHouse/pull/26757) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* `SET PROFILE` now applies constraints too if they're set for a passed profile. [#26730](https://github.com/ClickHouse/ClickHouse/pull/26730) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve handling of `KILL QUERY` requests. [#26675](https://github.com/ClickHouse/ClickHouse/pull/26675) ([Raúl Marín](https://github.com/Algunenano)). +* `mapPopulatesSeries` function supports `Map` type. [#26663](https://github.com/ClickHouse/ClickHouse/pull/26663) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Fix excessive (x2) connect attempts with `skip_unavailable_shards`. [#26658](https://github.com/ClickHouse/ClickHouse/pull/26658) ([Azat Khuzhin](https://github.com/azat)). +* Avoid hanging `clickhouse-benchmark` if connection fails (i.e. on EMFILE). [#26656](https://github.com/ClickHouse/ClickHouse/pull/26656) ([Azat Khuzhin](https://github.com/azat)). +* Allow more threads to be used by the Kafka engine. [#26642](https://github.com/ClickHouse/ClickHouse/pull/26642) ([feihengye](https://github.com/feihengye)). +* Add round-robin support for `clickhouse-benchmark` (it does not differ from the regular multi host/port run except for statistics report). [#26607](https://github.com/ClickHouse/ClickHouse/pull/26607) ([Azat Khuzhin](https://github.com/azat)). +* Executable dictionaries (`executable`, `executable_pool`) enable creation with DDL query using `clickhouse-local`. Closes [#22355](https://github.com/ClickHouse/ClickHouse/issues/22355). [#26510](https://github.com/ClickHouse/ClickHouse/pull/26510) ([Maksim Kita](https://github.com/kitaisreal)). +* Set client query kind for `mysql` and `postgresql` compatibility protocol handlers. [#26498](https://github.com/ClickHouse/ClickHouse/pull/26498) ([anneji-dev](https://github.com/anneji-dev)). +* Apply `LIMIT` on the shards for queries like `SELECT * FROM dist ORDER BY key LIMIT 10` w/ `distributed_push_down_limit=1`. Avoid running `Distinct`/`LIMIT BY` steps for queries like `SELECT DISTINCT shading_key FROM dist ORDER BY key`. Now `distributed_push_down_limit` is respected by `optimize_distributed_group_by_sharding_key` optimization. [#26466](https://github.com/ClickHouse/ClickHouse/pull/26466) ([Azat Khuzhin](https://github.com/azat)). +* Updated protobuf to 3.17.3. Changelogs are available on https://github.com/protocolbuffers/protobuf/releases. [#26424](https://github.com/ClickHouse/ClickHouse/pull/26424) ([Ilya Yatsishin](https://github.com/qoega)). +* Enable `use_hedged_requests` setting that allows to mitigate tail latencies on large clusters. [#26380](https://github.com/ClickHouse/ClickHouse/pull/26380) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve behaviour with non-existing host in user allowed host list. [#26368](https://github.com/ClickHouse/ClickHouse/pull/26368) ([ianton-ru](https://github.com/ianton-ru)). +* Add ability to set `Distributed` directory monitor settings via CREATE TABLE (i.e. `CREATE TABLE dist (key Int) Engine=Distributed(cluster, db, table) SETTINGS monitor_batch_inserts=1` and similar). [#26336](https://github.com/ClickHouse/ClickHouse/pull/26336) ([Azat Khuzhin](https://github.com/azat)). +* Save server address in history URLs in web UI if it differs from the origin of web UI. This closes [#26044](https://github.com/ClickHouse/ClickHouse/issues/26044). [#26322](https://github.com/ClickHouse/ClickHouse/pull/26322) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add events to profile calls to `sleep` / `sleepEachRow`. [#26320](https://github.com/ClickHouse/ClickHouse/pull/26320) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to reuse connections of shards among different clusters. It also avoids creating new connections when using `cluster` table function. [#26318](https://github.com/ClickHouse/ClickHouse/pull/26318) ([Amos Bird](https://github.com/amosbird)). +* Control the execution period of clear old temporary directories by parameter with default value. [#26212](https://github.com/ClickHouse/ClickHouse/issues/26212). [#26313](https://github.com/ClickHouse/ClickHouse/pull/26313) ([fastio](https://github.com/fastio)). +* Add a setting `function_range_max_elements_in_block` to tune the safety threshold for data volume generated by function `range`. This closes [#26303](https://github.com/ClickHouse/ClickHouse/issues/26303). [#26305](https://github.com/ClickHouse/ClickHouse/pull/26305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check hash function at table creation, not at sampling. Add settings for MergeTree, if someone create a table with incorrect sampling column but sampling never be used, disable this settings for starting the server without exception. [#26256](https://github.com/ClickHouse/ClickHouse/pull/26256) ([zhaoyu](https://github.com/zxc111)). +* Added `output_format_avro_string_column_pattern` setting to put specified String columns to Avro as string instead of default bytes. Implements [#22414](https://github.com/ClickHouse/ClickHouse/issues/22414). [#26245](https://github.com/ClickHouse/ClickHouse/pull/26245) ([Ilya Golshtein](https://github.com/ilejn)). +* Add information about column sizes in `system.columns` table for `Log` and `TinyLog` tables. This closes [#9001](https://github.com/ClickHouse/ClickHouse/issues/9001). [#26241](https://github.com/ClickHouse/ClickHouse/pull/26241) ([Nikolay Degterinsky](https://github.com/evillique)). +* Don't throw exception when querying `system.detached_parts` table if there is custom disk configuration and `detached` directory does not exist on some disks. This closes [#26078](https://github.com/ClickHouse/ClickHouse/issues/26078). [#26236](https://github.com/ClickHouse/ClickHouse/pull/26236) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check for non-deterministic functions in keys, including constant expressions like `now()`, `today()`. This closes [#25875](https://github.com/ClickHouse/ClickHouse/issues/25875). This closes [#11333](https://github.com/ClickHouse/ClickHouse/issues/11333). [#26235](https://github.com/ClickHouse/ClickHouse/pull/26235) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* convert timestamp and timestamptz data types to `DateTime64` in PostgreSQL table engine. [#26234](https://github.com/ClickHouse/ClickHouse/pull/26234) ([jasine](https://github.com/jasine)). +* Apply aggressive IN index analysis for projections so that better projection candidate can be selected. [#26218](https://github.com/ClickHouse/ClickHouse/pull/26218) ([Amos Bird](https://github.com/amosbird)). +* Remove GLOBAL keyword for IN when scalar function is passed. In previous versions, if user specified `GLOBAL IN f(x)` exception was thrown. [#26217](https://github.com/ClickHouse/ClickHouse/pull/26217) ([Amos Bird](https://github.com/amosbird)). +* Add error id (like `BAD_ARGUMENTS`) to exception messages. This closes [#25862](https://github.com/ClickHouse/ClickHouse/issues/25862). [#26172](https://github.com/ClickHouse/ClickHouse/pull/26172) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect output with --progress option for clickhouse-local. Progress bar will be cleared once it gets to 100% - same as it is done for clickhouse-client. Closes [#17484](https://github.com/ClickHouse/ClickHouse/issues/17484). [#26128](https://github.com/ClickHouse/ClickHouse/pull/26128) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `merge_selecting_sleep_ms` setting. [#26120](https://github.com/ClickHouse/ClickHouse/pull/26120) ([lthaooo](https://github.com/lthaooo)). +* Remove complicated usage of Linux AIO with one block readahead and replace it with plain simple synchronous IO with O_DIRECT. In previous versions, the setting `min_bytes_to_use_direct_io` may not work correctly if `max_threads` is greater than one. Reading with direct IO (that is disabled by default for queries and enabled by default for large merges) will work in less efficient way. This closes [#25997](https://github.com/ClickHouse/ClickHouse/issues/25997). [#26003](https://github.com/ClickHouse/ClickHouse/pull/26003) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Flush `Distributed` table on `REPLACE TABLE` query. Resolves [#24566](https://github.com/ClickHouse/ClickHouse/issues/24566) - Do not replace (or create) table on `[CREATE OR] REPLACE TABLE ... AS SELECT` query if insertion into new table fails. Resolves [#23175](https://github.com/ClickHouse/ClickHouse/issues/23175). [#25895](https://github.com/ClickHouse/ClickHouse/pull/25895) ([tavplubix](https://github.com/tavplubix)). +* Add `views` column to system.query_log containing the names of the (materialized or live) views executed by the query. Adds a new log table (`system.query_views_log`) that contains information about each view executed during a query. Modifies view execution: When an exception is thrown while executing a view, any view that has already startedwill continue running until it finishes. This used to be the behaviour under parallel_view_processing=true and now it's always the same behaviour. - Dependent views now report reading progress to the context. [#25714](https://github.com/ClickHouse/ClickHouse/pull/25714) ([Raúl Marín](https://github.com/Algunenano)). +* Do connection draining asynchonously upon finishing executing distributed queries. A new server setting is added `max_threads_for_connection_collector` which specifies the number of workers to recycle connections in background. If the pool is full, connection will be drained synchronously but a bit different than before: It's drained after we send EOS to client, query will succeed immediately after receiving enough data, and any exception will be logged instead of throwing to the client. Added setting `drain_timeout` (3 seconds by default). Connection draining will disconnect upon timeout. [#25674](https://github.com/ClickHouse/ClickHouse/pull/25674) ([Amos Bird](https://github.com/amosbird)). +* Support for multiple includes in configuration. It is possible to include users configuration, remote servers configuration from multiple sources. Simply place `` element with `from_zk`, `from_env` or `incl` attribute and it will be replaced with the substitution. [#24404](https://github.com/ClickHouse/ClickHouse/pull/24404) ([nvartolomei](https://github.com/nvartolomei)). +* Fix multiple block insertion into distributed table with `insert_distributed_one_random_shard = 1`. This is a marginal feature. Mark as improvement. [#23140](https://github.com/ClickHouse/ClickHouse/pull/23140) ([Amos Bird](https://github.com/amosbird)). +* Support `LowCardinality` and `FixedString` keys/values for `Map` type. [#21543](https://github.com/ClickHouse/ClickHouse/pull/21543) ([hexiaoting](https://github.com/hexiaoting)). +* Enable reloading of local disk config. [#19526](https://github.com/ClickHouse/ClickHouse/pull/19526) ([taiyang-li](https://github.com/taiyang-li)). + +#### Bug Fix + +* Fix a couple of bugs that may cause replicas to diverge. [#27808](https://github.com/ClickHouse/ClickHouse/pull/27808) ([tavplubix](https://github.com/tavplubix)). +* Fix a rare bug in `DROP PART` which can lead to the error `Unexpected merged part intersects drop range`. [#27807](https://github.com/ClickHouse/ClickHouse/pull/27807) ([alesapin](https://github.com/alesapin)). +* Prevent crashes for some formats when NULL (tombstone) message was coming from Kafka. Closes [#19255](https://github.com/ClickHouse/ClickHouse/issues/19255). [#27794](https://github.com/ClickHouse/ClickHouse/pull/27794) ([filimonov](https://github.com/filimonov)). +* Fix column filtering with union distinct in subquery. Closes [#27578](https://github.com/ClickHouse/ClickHouse/issues/27578). [#27689](https://github.com/ClickHouse/ClickHouse/pull/27689) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bad type cast when functions like `arrayHas` are applied to arrays of LowCardinality of Nullable of different non-numeric types like `DateTime` and `DateTime64`. In previous versions bad cast occurs. In new version it will lead to exception. This closes [#26330](https://github.com/ClickHouse/ClickHouse/issues/26330). [#27682](https://github.com/ClickHouse/ClickHouse/pull/27682) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix postgresql table function resulting in non-closing connections. Closes [#26088](https://github.com/ClickHouse/ClickHouse/issues/26088). [#27662](https://github.com/ClickHouse/ClickHouse/pull/27662) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed another case of `Unexpected merged part ... intersecting drop range ...` error. [#27656](https://github.com/ClickHouse/ClickHouse/pull/27656) ([tavplubix](https://github.com/tavplubix)). +* Fix an error with aliased column in `Distributed` table. [#27652](https://github.com/ClickHouse/ClickHouse/pull/27652) ([Vladimir C](https://github.com/vdimir)). +* After setting `max_memory_usage*` to non-zero value it was not possible to reset it back to 0 (unlimited). It's fixed. [#27638](https://github.com/ClickHouse/ClickHouse/pull/27638) ([tavplubix](https://github.com/tavplubix)). +* Fixed underflow of the time value when constructing it from components. Closes [#27193](https://github.com/ClickHouse/ClickHouse/issues/27193). [#27605](https://github.com/ClickHouse/ClickHouse/pull/27605) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix crash during projection materialization when some parts contain missing columns. This fixes [#27512](https://github.com/ClickHouse/ClickHouse/issues/27512). [#27528](https://github.com/ClickHouse/ClickHouse/pull/27528) ([Amos Bird](https://github.com/amosbird)). +* fix metric `BackgroundMessageBrokerSchedulePoolTask`, maybe mistyped. [#27452](https://github.com/ClickHouse/ClickHouse/pull/27452) ([Ben](https://github.com/benbiti)). +* Fix distributed queries with zero shards and aggregation. [#27427](https://github.com/ClickHouse/ClickHouse/pull/27427) ([Azat Khuzhin](https://github.com/azat)). +* Compatibility when `/proc/meminfo` does not contain KB suffix. [#27361](https://github.com/ClickHouse/ClickHouse/pull/27361) ([Mike Kot](https://github.com/myrrc)). +* Fix incorrect result for query with row-level security, PREWHERE and LowCardinality filter. Fixes [#27179](https://github.com/ClickHouse/ClickHouse/issues/27179). [#27329](https://github.com/ClickHouse/ClickHouse/pull/27329) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed incorrect validation of partition id for MergeTree tables that created with old syntax. [#27328](https://github.com/ClickHouse/ClickHouse/pull/27328) ([tavplubix](https://github.com/tavplubix)). +* Fix MySQL protocol when using parallel formats (CSV / TSV). [#27326](https://github.com/ClickHouse/ClickHouse/pull/27326) ([Raúl Marín](https://github.com/Algunenano)). +* Fix `Cannot find column` error for queries with sampling. Was introduced in [#24574](https://github.com/ClickHouse/ClickHouse/issues/24574). Fixes [#26522](https://github.com/ClickHouse/ClickHouse/issues/26522). [#27301](https://github.com/ClickHouse/ClickHouse/pull/27301) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix errors like `Expected ColumnLowCardinality, gotUInt8` or `Bad cast from type DB::ColumnVector to DB::ColumnLowCardinality` for some queries with `LowCardinality` in `PREWHERE`. And more importantly, fix the lack of whitespace in the error message. Fixes [#23515](https://github.com/ClickHouse/ClickHouse/issues/23515). [#27298](https://github.com/ClickHouse/ClickHouse/pull/27298) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `distributed_group_by_no_merge = 2` with `distributed_push_down_limit = 1` or `optimize_distributed_group_by_sharding_key = 1` with `LIMIT BY` and `LIMIT OFFSET`. [#27249](https://github.com/ClickHouse/ClickHouse/pull/27249) ([Azat Khuzhin](https://github.com/azat)). These are obscure combination of settings that no one is using. +* Fix mutation stuck on invalid partitions in non-replicated MergeTree. [#27248](https://github.com/ClickHouse/ClickHouse/pull/27248) ([Azat Khuzhin](https://github.com/azat)). +* In case of ambiguity, lambda functions prefer its arguments to other aliases or identifiers. [#27235](https://github.com/ClickHouse/ClickHouse/pull/27235) ([Raúl Marín](https://github.com/Algunenano)). +* Fix column structure in merge join, close [#27091](https://github.com/ClickHouse/ClickHouse/issues/27091). [#27217](https://github.com/ClickHouse/ClickHouse/pull/27217) ([Vladimir C](https://github.com/vdimir)). +* In rare cases `system.detached_parts` table might contain incorrect information for some parts, it's fixed. Fixes [#27114](https://github.com/ClickHouse/ClickHouse/issues/27114). [#27183](https://github.com/ClickHouse/ClickHouse/pull/27183) ([tavplubix](https://github.com/tavplubix)). +* Fix uninitialized memory in functions `multiSearch*` with empty array, close [#27169](https://github.com/ClickHouse/ClickHouse/issues/27169). [#27181](https://github.com/ClickHouse/ClickHouse/pull/27181) ([Vladimir C](https://github.com/vdimir)). +* Fix synchronization in GRPCServer. This PR fixes [#27024](https://github.com/ClickHouse/ClickHouse/issues/27024). [#27064](https://github.com/ClickHouse/ClickHouse/pull/27064) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache` configuration parsing. Options `allow_read_expired_keys`, `max_update_queue_size`, `update_queue_push_timeout_milliseconds`, `query_wait_timeout_milliseconds` were not parsed for dictionaries with non `cache` type. [#27032](https://github.com/ClickHouse/ClickHouse/pull/27032) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible mutation stack due to race with DROP_RANGE. [#27002](https://github.com/ClickHouse/ClickHouse/pull/27002) ([Azat Khuzhin](https://github.com/azat)). +* Now partition ID in queries like `ALTER TABLE ... PARTITION ID xxx` validates for correctness. Fixes [#25718](https://github.com/ClickHouse/ClickHouse/issues/25718). [#26963](https://github.com/ClickHouse/ClickHouse/pull/26963) ([alesapin](https://github.com/alesapin)). +* Fix "Unknown column name" error with multiple JOINs in some cases, close [#26899](https://github.com/ClickHouse/ClickHouse/issues/26899). [#26957](https://github.com/ClickHouse/ClickHouse/pull/26957) ([Vladimir C](https://github.com/vdimir)). +* Fix reading of custom TLDs (stops processing with lower buffer or bigger file). [#26948](https://github.com/ClickHouse/ClickHouse/pull/26948) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Missing columns: 'xxx'` when `DEFAULT` column references other non materialized column without `DEFAULT` expression. Fixes [#26591](https://github.com/ClickHouse/ClickHouse/issues/26591). [#26900](https://github.com/ClickHouse/ClickHouse/pull/26900) ([alesapin](https://github.com/alesapin)). +* Fix loading of dictionary keys in `library-bridge` for `library` dictionary source. [#26834](https://github.com/ClickHouse/ClickHouse/pull/26834) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Aggregate function parameters might be lost when applying some combinators causing exceptions like `Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported`. It's fixed. Fixes [#26196](https://github.com/ClickHouse/ClickHouse/issues/26196) and [#26433](https://github.com/ClickHouse/ClickHouse/issues/26433). [#26814](https://github.com/ClickHouse/ClickHouse/pull/26814) ([tavplubix](https://github.com/tavplubix)). +* Add `event_time_microseconds` value for `REMOVE_PART` in `system.part_log`. In previous versions is was not set. [#26720](https://github.com/ClickHouse/ClickHouse/pull/26720) ([Azat Khuzhin](https://github.com/azat)). +* Do not remove data on ReplicatedMergeTree table shutdown to avoid creating data to metadata inconsistency. [#26716](https://github.com/ClickHouse/ClickHouse/pull/26716) ([nvartolomei](https://github.com/nvartolomei)). +* Sometimes `SET ROLE` could work incorrectly, this PR fixes that. [#26707](https://github.com/ClickHouse/ClickHouse/pull/26707) ([Vitaly Baranov](https://github.com/vitlibar)). +* Some fixes for parallel formatting (https://github.com/ClickHouse/ClickHouse/issues/26694). [#26703](https://github.com/ClickHouse/ClickHouse/pull/26703) ([Raúl Marín](https://github.com/Algunenano)). +* Fix potential nullptr dereference in window functions. This fixes [#25276](https://github.com/ClickHouse/ClickHouse/issues/25276). [#26668](https://github.com/ClickHouse/ClickHouse/pull/26668) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix clickhouse-client history file conversion (when upgrading from the format of 3 years old version of clickhouse-client) if file is empty. [#26589](https://github.com/ClickHouse/ClickHouse/pull/26589) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect function names of groupBitmapAnd/Or/Xor (can be displayed in some occasions). This fixes. [#26557](https://github.com/ClickHouse/ClickHouse/pull/26557) ([Amos Bird](https://github.com/amosbird)). +* Update `chown` cmd check in clickhouse-server docker entrypoint. It fixes the bug that cluster pod restart failed (or timeout) on kubernetes. [#26545](https://github.com/ClickHouse/ClickHouse/pull/26545) ([Ky Li](https://github.com/Kylinrix)). +* Fix crash in `RabbitMQ` shutdown in case `RabbitMQ` setup was not started. Closes [#26504](https://github.com/ClickHouse/ClickHouse/issues/26504). [#26529](https://github.com/ClickHouse/ClickHouse/pull/26529) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix issues with `CREATE DICTIONARY` query if dictionary name or database name was quoted. Closes [#26491](https://github.com/ClickHouse/ClickHouse/issues/26491). [#26508](https://github.com/ClickHouse/ClickHouse/pull/26508) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix broken column name resolution after rewriting column aliases. This fixes [#26432](https://github.com/ClickHouse/ClickHouse/issues/26432). [#26475](https://github.com/ClickHouse/ClickHouse/pull/26475) ([Amos Bird](https://github.com/amosbird)). +* Fix some fuzzed msan crash. Fixes [#22517](https://github.com/ClickHouse/ClickHouse/issues/22517). [#26428](https://github.com/ClickHouse/ClickHouse/pull/26428) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix infinite non joined block stream in `partial_merge_join` close [#26325](https://github.com/ClickHouse/ClickHouse/issues/26325). [#26374](https://github.com/ClickHouse/ClickHouse/pull/26374) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash when login as dropped user. This PR fixes [#26073](https://github.com/ClickHouse/ClickHouse/issues/26073). [#26363](https://github.com/ClickHouse/ClickHouse/pull/26363) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `optimize_distributed_group_by_sharding_key` for multiple columns (leads to incorrect result w/ `optimize_skip_unused_shards=1`/`allow_nondeterministic_optimize_skip_unused_shards=1` and multiple columns in sharding key expression). [#26353](https://github.com/ClickHouse/ClickHouse/pull/26353) ([Azat Khuzhin](https://github.com/azat)). +* Fixed rare bug in lost replica recovery that may cause replicas to diverge. [#26321](https://github.com/ClickHouse/ClickHouse/pull/26321) ([tavplubix](https://github.com/tavplubix)). +* Fix zstd decompression (for import/export in zstd framing format that is unrelated to tables data) in case there are escape sequences at the end of internal buffer. Closes [#26013](https://github.com/ClickHouse/ClickHouse/issues/26013). [#26314](https://github.com/ClickHouse/ClickHouse/pull/26314) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error on join with totals, close [#26017](https://github.com/ClickHouse/ClickHouse/issues/26017). [#26250](https://github.com/ClickHouse/ClickHouse/pull/26250) ([Vladimir C](https://github.com/vdimir)). +* Remove excessive newline in `thread_name` column in `system.stack_trace` table. This fixes [#24124](https://github.com/ClickHouse/ClickHouse/issues/24124). [#26210](https://github.com/ClickHouse/ClickHouse/pull/26210) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential crash if more than one `untuple` expression is used. [#26179](https://github.com/ClickHouse/ClickHouse/pull/26179) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't throw exception in `toString` for Nullable Enum if Enum does not have a value for zero, close [#25806](https://github.com/ClickHouse/ClickHouse/issues/25806). [#26123](https://github.com/ClickHouse/ClickHouse/pull/26123) ([Vladimir C](https://github.com/vdimir)). +* Fixed incorrect `sequence_id` in MySQL protocol packets that ClickHouse sends on exception during query execution. It might cause MySQL client to reset connection to ClickHouse server. Fixes [#21184](https://github.com/ClickHouse/ClickHouse/issues/21184). [#26051](https://github.com/ClickHouse/ClickHouse/pull/26051) ([tavplubix](https://github.com/tavplubix)). +* Fix for the case that `cutToFirstSignificantSubdomainCustom()`/`cutToFirstSignificantSubdomainCustomWithWWW()`/`firstSignificantSubdomainCustom()` returns incorrect type for consts, and hence `optimize_skip_unused_shards` does not work:. [#26041](https://github.com/ClickHouse/ClickHouse/pull/26041) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible mismatched header when using normal projection with prewhere. This fixes [#26020](https://github.com/ClickHouse/ClickHouse/issues/26020). [#26038](https://github.com/ClickHouse/ClickHouse/pull/26038) ([Amos Bird](https://github.com/amosbird)). +* Fix sharding_key from column w/o function for remote() (before `select * from remote('127.1', system.one, dummy)` leads to `Unknown column: dummy, there are only columns .` error). [#25824](https://github.com/ClickHouse/ClickHouse/pull/25824) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Not found column ...` and `Missing column ...` errors when selecting from `MaterializeMySQL`. Fixes [#23708](https://github.com/ClickHouse/ClickHouse/issues/23708), [#24830](https://github.com/ClickHouse/ClickHouse/issues/24830), [#25794](https://github.com/ClickHouse/ClickHouse/issues/25794). [#25822](https://github.com/ClickHouse/ClickHouse/pull/25822) ([tavplubix](https://github.com/tavplubix)). +* Fix `optimize_skip_unused_shards_rewrite_in` for non-UInt64 types (may select incorrect shards eventually or throw `Cannot infer type of an empty tuple` or `Function tuple requires at least one argument`). [#25798](https://github.com/ClickHouse/ClickHouse/pull/25798) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement + +* Now we ran stateful and stateless tests in random timezones. Fixes [#12439](https://github.com/ClickHouse/ClickHouse/issues/12439). Reading String as DateTime and writing DateTime as String in Protobuf format now respect timezone. Reading UInt16 as DateTime in Arrow and Parquet formats now treat it as Date and then converts to DateTime with respect to DateTime's timezone, because Date is serialized in Arrow and Parquet as UInt16. GraphiteMergeTree now respect time zone for rounding of times. Fixes [#5098](https://github.com/ClickHouse/ClickHouse/issues/5098). Author: @alexey-milovidov. [#15408](https://github.com/ClickHouse/ClickHouse/pull/15408) ([alesapin](https://github.com/alesapin)). +* `clickhouse-test` supports SQL tests with [Jinja2](https://jinja.palletsprojects.com/en/3.0.x/templates/#synopsis) templates. [#26579](https://github.com/ClickHouse/ClickHouse/pull/26579) ([Vladimir C](https://github.com/vdimir)). +* Add support for build with `clang-13`. This closes [#27705](https://github.com/ClickHouse/ClickHouse/issues/27705). [#27714](https://github.com/ClickHouse/ClickHouse/pull/27714) ([alexey-milovidov](https://github.com/alexey-milovidov)). [#27777](https://github.com/ClickHouse/ClickHouse/pull/27777) ([Sergei Semin](https://github.com/syominsergey)) +* Add CMake options to build with or without specific CPU instruction set. This is for [#17469](https://github.com/ClickHouse/ClickHouse/issues/17469) and [#27509](https://github.com/ClickHouse/ClickHouse/issues/27509). [#27508](https://github.com/ClickHouse/ClickHouse/pull/27508) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix linking of auxiliar programs when using dynamic libraries. [#26958](https://github.com/ClickHouse/ClickHouse/pull/26958) ([Raúl Marín](https://github.com/Algunenano)). +* Update RocksDB to `2021-07-16` master. [#26411](https://github.com/ClickHouse/ClickHouse/pull/26411) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v21.8, 2021-08-12 + +#### Upgrade Notes +* New version is using `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). If you want to *downgrade* from version 21.8 to older versions, you will need to cleanup system tables with logs manually. Look at `/var/lib/clickhouse/data/system/*_log`. + +#### New Features + +* Add support for a part of SQL/JSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki), [Kseniia Sumarokova](https://github.com/kssenii)). +* Collect common system metrics (in `system.asynchronous_metrics` and `system.asynchronous_metric_log`) on CPU usage, disk usage, memory usage, IO, network, files, load average, CPU frequencies, thermal sensors, EDAC counters, system uptime; also added metrics about the scheduling jitter and the time spent collecting the metrics. It works similar to `atop` in ClickHouse and allows access to monitoring data even if you have no additional tools installed. Close [#9430](https://github.com/ClickHouse/ClickHouse/issues/9430). [#24416](https://github.com/ClickHouse/ClickHouse/pull/24416) ([alexey-milovidov](https://github.com/alexey-milovidov), [Yegor Levankov](https://github.com/elevankoff)). +* Add MaterializedPostgreSQL table engine and database engine. This database engine allows replicating a whole database or any subset of database tables. [#20470](https://github.com/ClickHouse/ClickHouse/pull/20470) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add new functions `leftPad()`, `rightPad()`, `leftPadUTF8()`, `rightPadUTF8()`. [#26075](https://github.com/ClickHouse/ClickHouse/pull/26075) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add the `FIRST` keyword to the `ADD INDEX` command to be able to add the index at the beginning of the indices list. [#25904](https://github.com/ClickHouse/ClickHouse/pull/25904) ([xjewer](https://github.com/xjewer)). +* Introduce `system.data_skipping_indices` table containing information about existing data skipping indices. Close [#7659](https://github.com/ClickHouse/ClickHouse/issues/7659). [#25693](https://github.com/ClickHouse/ClickHouse/pull/25693) ([Dmitry Novik](https://github.com/novikd)). +* Add `bin`/`unbin` functions. [#25609](https://github.com/ClickHouse/ClickHouse/pull/25609) ([zhaoyu](https://github.com/zxc111)). +* Support `Map` and `UInt128`, `Int128`, `UInt256`, `Int256` types in `mapAdd` and `mapSubtract` functions. [#25596](https://github.com/ClickHouse/ClickHouse/pull/25596) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `DISTINCT ON (columns)` expression, close [#25404](https://github.com/ClickHouse/ClickHouse/issues/25404). [#25589](https://github.com/ClickHouse/ClickHouse/pull/25589) ([Zijie Lu](https://github.com/TszKitLo40)). +* Add an ability to reset a custom setting to default and remove it from the table's metadata. It allows rolling back the change without knowing the system/config's default. Closes [#14449](https://github.com/ClickHouse/ClickHouse/issues/14449). [#17769](https://github.com/ClickHouse/ClickHouse/pull/17769) ([xjewer](https://github.com/xjewer)). +* Render pipelines as graphs in Web UI if `EXPLAIN PIPELINE graph = 1` query is submitted. [#26067](https://github.com/ClickHouse/ClickHouse/pull/26067) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvements + +* Compile aggregate functions. Use option `compile_aggregate_expressions` to enable it. [#24789](https://github.com/ClickHouse/ClickHouse/pull/24789) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve latency of short queries that require reading from tables with many columns. [#26371](https://github.com/ClickHouse/ClickHouse/pull/26371) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvements + +* Use `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). +* For a dictionary with a complex key containing only one attribute, allow not wrapping the key expression in tuple for functions `dictGet`, `dictHas`. [#26130](https://github.com/ClickHouse/ClickHouse/pull/26130) ([Maksim Kita](https://github.com/kitaisreal)). +* Implement function `bin`/`hex` from `AggregateFunction` states. [#26094](https://github.com/ClickHouse/ClickHouse/pull/26094) ([zhaoyu](https://github.com/zxc111)). +* Support arguments of `UUID` type for `empty` and `notEmpty` functions. `UUID` is empty if it is all zeros (nil UUID). Closes [#3446](https://github.com/ClickHouse/ClickHouse/issues/3446). [#25974](https://github.com/ClickHouse/ClickHouse/pull/25974) ([zhaoyu](https://github.com/zxc111)). +* Add support for `SET SQL_SELECT_LIMIT` in MySQL protocol. Closes [#17115](https://github.com/ClickHouse/ClickHouse/issues/17115). [#25972](https://github.com/ClickHouse/ClickHouse/pull/25972) ([Kseniia Sumarokova](https://github.com/kssenii)). +* More instrumentation for network interaction: add counters for recv/send bytes; add gauges for recvs/sends. Added missing documentation. Close [#5897](https://github.com/ClickHouse/ClickHouse/issues/5897). [#25962](https://github.com/ClickHouse/ClickHouse/pull/25962) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add setting `optimize_move_to_prewhere_if_final`. If query has `FINAL`, the optimization `move_to_prewhere` will be enabled only if both `optimize_move_to_prewhere` and `optimize_move_to_prewhere_if_final` are enabled. Closes [#8684](https://github.com/ClickHouse/ClickHouse/issues/8684). [#25940](https://github.com/ClickHouse/ClickHouse/pull/25940) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow complex quoted identifiers of JOINed tables. Close [#17861](https://github.com/ClickHouse/ClickHouse/issues/17861). [#25924](https://github.com/ClickHouse/ClickHouse/pull/25924) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for Unicode (e.g. Chinese, Cyrillic) components in `Nested` data types. Close [#25594](https://github.com/ClickHouse/ClickHouse/issues/25594). [#25923](https://github.com/ClickHouse/ClickHouse/pull/25923) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow `quantiles*` functions to work with `aggregate_functions_null_for_empty`. Close [#25892](https://github.com/ClickHouse/ClickHouse/issues/25892). [#25919](https://github.com/ClickHouse/ClickHouse/pull/25919) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow parameters for parametric aggregate functions to be arbitrary constant expressions (e.g., `1 + 2`), not just literals. It also allows using the query parameters (in parameterized queries like `{param:UInt8}`) inside parametric aggregate functions. Closes [#11607](https://github.com/ClickHouse/ClickHouse/issues/11607). [#25910](https://github.com/ClickHouse/ClickHouse/pull/25910) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correctly throw the exception on the attempt to parse an invalid `Date`. Closes [#6481](https://github.com/ClickHouse/ClickHouse/issues/6481). [#25909](https://github.com/ClickHouse/ClickHouse/pull/25909) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support for multiple includes in configuration. It is possible to include users configuration, remote server configuration from multiple sources. Simply place `` element with `from_zk`, `from_env` or `incl` attribute, and it will be replaced with the substitution. [#24404](https://github.com/ClickHouse/ClickHouse/pull/24404) ([nvartolomei](https://github.com/nvartolomei)). +* Support for queries with a column named `"null"` (it must be specified in back-ticks or double quotes) and `ON CLUSTER`. Closes [#24035](https://github.com/ClickHouse/ClickHouse/issues/24035). [#25907](https://github.com/ClickHouse/ClickHouse/pull/25907) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `LowCardinality`, `Decimal`, and `UUID` for `JSONExtract`. Closes [#24606](https://github.com/ClickHouse/ClickHouse/issues/24606). [#25900](https://github.com/ClickHouse/ClickHouse/pull/25900) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Convert history file from `readline` format to `replxx` format. [#25888](https://github.com/ClickHouse/ClickHouse/pull/25888) ([Azat Khuzhin](https://github.com/azat)). +* Fix an issue which can lead to intersecting parts after `DROP PART` or background deletion of an empty part. [#25884](https://github.com/ClickHouse/ClickHouse/pull/25884) ([alesapin](https://github.com/alesapin)). +* Better handling of lost parts for `ReplicatedMergeTree` tables. Fixes rare inconsistencies in `ReplicationQueue`. Fixes [#10368](https://github.com/ClickHouse/ClickHouse/issues/10368). [#25820](https://github.com/ClickHouse/ClickHouse/pull/25820) ([alesapin](https://github.com/alesapin)). +* Allow starting clickhouse-client with unreadable working directory. [#25817](https://github.com/ClickHouse/ClickHouse/pull/25817) ([ianton-ru](https://github.com/ianton-ru)). +* Fix "No available columns" error for `Merge` storage. [#25801](https://github.com/ClickHouse/ClickHouse/pull/25801) ([Azat Khuzhin](https://github.com/azat)). +* MySQL Engine now supports the exchange of column comments between MySQL and ClickHouse. [#25795](https://github.com/ClickHouse/ClickHouse/pull/25795) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Fix inconsistent behaviour of `GROUP BY` constant on empty set. Closes [#6842](https://github.com/ClickHouse/ClickHouse/issues/6842). [#25786](https://github.com/ClickHouse/ClickHouse/pull/25786) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Cancel already running merges in partition on `DROP PARTITION` and `TRUNCATE` for `ReplicatedMergeTree`. Resolves [#17151](https://github.com/ClickHouse/ClickHouse/issues/17151). [#25684](https://github.com/ClickHouse/ClickHouse/pull/25684) ([tavplubix](https://github.com/tavplubix)). +* Support ENUM` data type for MaterializeMySQL. [#25676](https://github.com/ClickHouse/ClickHouse/pull/25676) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Support materialized and aliased columns in JOIN, close [#13274](https://github.com/ClickHouse/ClickHouse/issues/13274). [#25634](https://github.com/ClickHouse/ClickHouse/pull/25634) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical race condition between `ALTER TABLE ... DETACH` and background merges. [#25605](https://github.com/ClickHouse/ClickHouse/pull/25605) ([Azat Khuzhin](https://github.com/azat)). +* Make `NetworkReceiveElapsedMicroseconds` metric to correctly include the time spent waiting for data from the client to `INSERT`. Close [#9958](https://github.com/ClickHouse/ClickHouse/issues/9958). [#25602](https://github.com/ClickHouse/ClickHouse/pull/25602) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `TRUNCATE TABLE` for S3 and HDFS. Close [#25530](https://github.com/ClickHouse/ClickHouse/issues/25530). [#25550](https://github.com/ClickHouse/ClickHouse/pull/25550) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support for dynamic reloading of config to change number of threads in pool for background jobs execution (merges, mutations, fetches). [#25548](https://github.com/ClickHouse/ClickHouse/pull/25548) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow extracting of non-string element as string using `JSONExtract`. This is for [#25414](https://github.com/ClickHouse/ClickHouse/issues/25414). [#25452](https://github.com/ClickHouse/ClickHouse/pull/25452) ([Amos Bird](https://github.com/amosbird)). +* Support regular expression in `Database` argument for `StorageMerge`. Close [#776](https://github.com/ClickHouse/ClickHouse/issues/776). [#25064](https://github.com/ClickHouse/ClickHouse/pull/25064) ([flynn](https://github.com/ucasfl)). +* Web UI: if the value looks like a URL, automatically generate a link. [#25965](https://github.com/ClickHouse/ClickHouse/pull/25965) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `sudo service clickhouse-server start` to work on systems with `systemd` like Centos 8. Close [#14298](https://github.com/ClickHouse/ClickHouse/issues/14298). Close [#17799](https://github.com/ClickHouse/ClickHouse/issues/17799). [#25921](https://github.com/ClickHouse/ClickHouse/pull/25921) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fixes + +* Fix incorrect `SET ROLE` in some cases. [#26707](https://github.com/ClickHouse/ClickHouse/pull/26707) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix potential `nullptr` dereference in window functions. Fix [#25276](https://github.com/ClickHouse/ClickHouse/issues/25276). [#26668](https://github.com/ClickHouse/ClickHouse/pull/26668) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix incorrect function names of `groupBitmapAnd/Or/Xor`. Fix [#26557](https://github.com/ClickHouse/ClickHouse/pull/26557) ([Amos Bird](https://github.com/amosbird)). +* Fix crash in RabbitMQ shutdown in case RabbitMQ setup was not started. Closes [#26504](https://github.com/ClickHouse/ClickHouse/issues/26504). [#26529](https://github.com/ClickHouse/ClickHouse/pull/26529) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix issues with `CREATE DICTIONARY` query if dictionary name or database name was quoted. Closes [#26491](https://github.com/ClickHouse/ClickHouse/issues/26491). [#26508](https://github.com/ClickHouse/ClickHouse/pull/26508) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix broken name resolution after rewriting column aliases. Fix [#26432](https://github.com/ClickHouse/ClickHouse/issues/26432). [#26475](https://github.com/ClickHouse/ClickHouse/pull/26475) ([Amos Bird](https://github.com/amosbird)). +* Fix infinite non-joined block stream in `partial_merge_join` close [#26325](https://github.com/ClickHouse/ClickHouse/issues/26325). [#26374](https://github.com/ClickHouse/ClickHouse/pull/26374) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash when login as dropped user. Fix [#26073](https://github.com/ClickHouse/ClickHouse/issues/26073). [#26363](https://github.com/ClickHouse/ClickHouse/pull/26363) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `optimize_distributed_group_by_sharding_key` for multiple columns (leads to incorrect result w/ `optimize_skip_unused_shards=1`/`allow_nondeterministic_optimize_skip_unused_shards=1` and multiple columns in sharding key expression). [#26353](https://github.com/ClickHouse/ClickHouse/pull/26353) ([Azat Khuzhin](https://github.com/azat)). +* `CAST` from `Date` to `DateTime` (or `DateTime64`) was not using the timezone of the `DateTime` type. It can also affect the comparison between `Date` and `DateTime`. Inference of the common type for `Date` and `DateTime` also was not using the corresponding timezone. It affected the results of function `if` and array construction. Closes [#24128](https://github.com/ClickHouse/ClickHouse/issues/24128). [#24129](https://github.com/ClickHouse/ClickHouse/pull/24129) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed rare bug in lost replica recovery that may cause replicas to diverge. [#26321](https://github.com/ClickHouse/ClickHouse/pull/26321) ([tavplubix](https://github.com/tavplubix)). +* Fix zstd decompression in case there are escape sequences at the end of internal buffer. Closes [#26013](https://github.com/ClickHouse/ClickHouse/issues/26013). [#26314](https://github.com/ClickHouse/ClickHouse/pull/26314) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error on join with totals, close [#26017](https://github.com/ClickHouse/ClickHouse/issues/26017). [#26250](https://github.com/ClickHouse/ClickHouse/pull/26250) ([Vladimir C](https://github.com/vdimir)). +* Remove excessive newline in `thread_name` column in `system.stack_trace` table. Fix [#24124](https://github.com/ClickHouse/ClickHouse/issues/24124). [#26210](https://github.com/ClickHouse/ClickHouse/pull/26210) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `joinGet` with `LowCarinality` columns, close [#25993](https://github.com/ClickHouse/ClickHouse/issues/25993). [#26118](https://github.com/ClickHouse/ClickHouse/pull/26118) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash in `pointInPolygon` if the setting `validate_polygons` is turned off. [#26113](https://github.com/ClickHouse/ClickHouse/pull/26113) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix throwing exception when iterate over non-existing remote directory. [#26087](https://github.com/ClickHouse/ClickHouse/pull/26087) ([ianton-ru](https://github.com/ianton-ru)). +* Fix rare server crash because of `abort` in ZooKeeper client. Fixes [#25813](https://github.com/ClickHouse/ClickHouse/issues/25813). [#26079](https://github.com/ClickHouse/ClickHouse/pull/26079) ([alesapin](https://github.com/alesapin)). +* Fix wrong thread count estimation for right subquery join in some cases. Close [#24075](https://github.com/ClickHouse/ClickHouse/issues/24075). [#26052](https://github.com/ClickHouse/ClickHouse/pull/26052) ([Vladimir C](https://github.com/vdimir)). +* Fixed incorrect `sequence_id` in MySQL protocol packets that ClickHouse sends on exception during query execution. It might cause MySQL client to reset connection to ClickHouse server. Fixes [#21184](https://github.com/ClickHouse/ClickHouse/issues/21184). [#26051](https://github.com/ClickHouse/ClickHouse/pull/26051) ([tavplubix](https://github.com/tavplubix)). +* Fix possible mismatched header when using normal projection with `PREWHERE`. Fix [#26020](https://github.com/ClickHouse/ClickHouse/issues/26020). [#26038](https://github.com/ClickHouse/ClickHouse/pull/26038) ([Amos Bird](https://github.com/amosbird)). +* Fix formatting of type `Map` with integer keys to `JSON`. [#25982](https://github.com/ClickHouse/ClickHouse/pull/25982) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock during query profiler stack unwinding. Fix [#25968](https://github.com/ClickHouse/ClickHouse/issues/25968). [#25970](https://github.com/ClickHouse/ClickHouse/pull/25970) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash on call `dictGet()` with bad arguments. [#25913](https://github.com/ClickHouse/ClickHouse/pull/25913) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `scram-sha-256` authentication for PostgreSQL engines. Closes [#24516](https://github.com/ClickHouse/ClickHouse/issues/24516). [#25906](https://github.com/ClickHouse/ClickHouse/pull/25906) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely long backoff for background tasks when the background pool is full. Fixes [#25836](https://github.com/ClickHouse/ClickHouse/issues/25836). [#25893](https://github.com/ClickHouse/ClickHouse/pull/25893) ([alesapin](https://github.com/alesapin)). +* Fix ARM exception handling with non default page size. Fixes [#25512](https://github.com/ClickHouse/ClickHouse/issues/25512), [#25044](https://github.com/ClickHouse/ClickHouse/issues/25044), [#24901](https://github.com/ClickHouse/ClickHouse/issues/24901), [#23183](https://github.com/ClickHouse/ClickHouse/issues/23183), [#20221](https://github.com/ClickHouse/ClickHouse/issues/20221), [#19703](https://github.com/ClickHouse/ClickHouse/issues/19703), [#19028](https://github.com/ClickHouse/ClickHouse/issues/19028), [#18391](https://github.com/ClickHouse/ClickHouse/issues/18391), [#18121](https://github.com/ClickHouse/ClickHouse/issues/18121), [#17994](https://github.com/ClickHouse/ClickHouse/issues/17994), [#12483](https://github.com/ClickHouse/ClickHouse/issues/12483). [#25854](https://github.com/ClickHouse/ClickHouse/pull/25854) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix sharding_key from column w/o function for `remote()` (before `select * from remote('127.1', system.one, dummy)` leads to `Unknown column: dummy, there are only columns .` error). [#25824](https://github.com/ClickHouse/ClickHouse/pull/25824) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Not found column ...` and `Missing column ...` errors when selecting from `MaterializeMySQL`. Fixes [#23708](https://github.com/ClickHouse/ClickHouse/issues/23708), [#24830](https://github.com/ClickHouse/ClickHouse/issues/24830), [#25794](https://github.com/ClickHouse/ClickHouse/issues/25794). [#25822](https://github.com/ClickHouse/ClickHouse/pull/25822) ([tavplubix](https://github.com/tavplubix)). +* Fix `optimize_skip_unused_shards_rewrite_in` for non-UInt64 types (may select incorrect shards eventually or throw `Cannot infer type of an empty tuple` or `Function tuple requires at least one argument`). [#25798](https://github.com/ClickHouse/ClickHouse/pull/25798) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare bug with `DROP PART` query for `ReplicatedMergeTree` tables which can lead to error message `Unexpected merged part intersecting drop range`. [#25783](https://github.com/ClickHouse/ClickHouse/pull/25783) ([alesapin](https://github.com/alesapin)). +* Fix bug in `TTL` with `GROUP BY` expression which refuses to execute `TTL` after first execution in part. [#25743](https://github.com/ClickHouse/ClickHouse/pull/25743) ([alesapin](https://github.com/alesapin)). +* Allow StorageMerge to access tables with aliases. Closes [#6051](https://github.com/ClickHouse/ClickHouse/issues/6051). [#25694](https://github.com/ClickHouse/ClickHouse/pull/25694) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix slow dict join in some cases, close [#24209](https://github.com/ClickHouse/ClickHouse/issues/24209). [#25618](https://github.com/ClickHouse/ClickHouse/pull/25618) ([Vladimir C](https://github.com/vdimir)). +* Fix `ALTER MODIFY COLUMN` of columns, which participates in TTL expressions. [#25554](https://github.com/ClickHouse/ClickHouse/pull/25554) ([Anton Popov](https://github.com/CurtizJ)). +* Fix assertion in `PREWHERE` with non-UInt8 type, close [#19589](https://github.com/ClickHouse/ClickHouse/issues/19589). [#25484](https://github.com/ClickHouse/ClickHouse/pull/25484) ([Vladimir C](https://github.com/vdimir)). +* Fix some fuzzed msan crash. Fixes [#22517](https://github.com/ClickHouse/ClickHouse/issues/22517). [#26428](https://github.com/ClickHouse/ClickHouse/pull/26428) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update `chown` cmd check in `clickhouse-server` docker entrypoint. It fixes error 'cluster pod restart failed (or timeout)' on kubernetes. [#26545](https://github.com/ClickHouse/ClickHouse/pull/26545) ([Ky Li](https://github.com/Kylinrix)). + + +### ClickHouse release v21.7, 2021-07-09 + +#### Backward Incompatible Change + +* Improved performance of queries with explicitly defined large sets. Added compatibility setting `legacy_column_name_of_tuple_literal`. It makes sense to set it to `true`, while doing rolling update of cluster from version lower than 21.7 to any higher version. Otherwise distributed queries with explicitly defined sets at `IN` clause may fail during update. [#25371](https://github.com/ClickHouse/ClickHouse/pull/25371) ([Anton Popov](https://github.com/CurtizJ)). +* Forward/backward incompatible change of maximum buffer size in clickhouse-keeper (an experimental alternative to ZooKeeper). Better to do it now (before production), than later. [#25421](https://github.com/ClickHouse/ClickHouse/pull/25421) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* Support configuration in YAML format as alternative to XML. This closes [#3607](https://github.com/ClickHouse/ClickHouse/issues/3607). [#21858](https://github.com/ClickHouse/ClickHouse/pull/21858) ([BoloniniD](https://github.com/BoloniniD)). +* Provides a way to restore replicated table when the data is (possibly) present, but the ZooKeeper metadata is lost. Resolves [#13458](https://github.com/ClickHouse/ClickHouse/issues/13458). [#13652](https://github.com/ClickHouse/ClickHouse/pull/13652) ([Mike Kot](https://github.com/myrrc)). +* Support structs and maps in Arrow/Parquet/ORC and dictionaries in Arrow input/output formats. Present new setting `output_format_arrow_low_cardinality_as_dictionary`. [#24341](https://github.com/ClickHouse/ClickHouse/pull/24341) ([Kruglov Pavel](https://github.com/Avogar)). +* Added support for `Array` type in dictionaries. [#25119](https://github.com/ClickHouse/ClickHouse/pull/25119) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `bitPositionsToArray`. Closes [#23792](https://github.com/ClickHouse/ClickHouse/issues/23792). Author [Kevin Wan] (@MaxWk). [#25394](https://github.com/ClickHouse/ClickHouse/pull/25394) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dateName` to return names like 'Friday' or 'April'. Author [Daniil Kondratyev] (@dankondr). [#25372](https://github.com/ClickHouse/ClickHouse/pull/25372) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `toJSONString` function to serialize columns to their JSON representations. [#25164](https://github.com/ClickHouse/ClickHouse/pull/25164) ([Amos Bird](https://github.com/amosbird)). +* Now `query_log` has two new columns: `initial_query_start_time`, `initial_query_start_time_microsecond` that record the starting time of a distributed query if any. [#25022](https://github.com/ClickHouse/ClickHouse/pull/25022) ([Amos Bird](https://github.com/amosbird)). +* Add aggregate function `segmentLengthSum`. [#24250](https://github.com/ClickHouse/ClickHouse/pull/24250) ([flynn](https://github.com/ucasfl)). +* Add a new boolean setting `prefer_global_in_and_join` which defaults all IN/JOIN as GLOBAL IN/JOIN. [#23434](https://github.com/ClickHouse/ClickHouse/pull/23434) ([Amos Bird](https://github.com/amosbird)). +* Support `ALTER DELETE` queries for `Join` table engine. [#23260](https://github.com/ClickHouse/ClickHouse/pull/23260) ([foolchi](https://github.com/foolchi)). +* Add `quantileBFloat16` aggregate function as well as the corresponding `quantilesBFloat16` and `medianBFloat16`. It is very simple and fast quantile estimator with relative error not more than 0.390625%. This closes [#16641](https://github.com/ClickHouse/ClickHouse/issues/16641). [#23204](https://github.com/ClickHouse/ClickHouse/pull/23204) ([Ivan Novitskiy](https://github.com/RedClusive)). +* Implement `sequenceNextNode()` function useful for `flow analysis`. [#19766](https://github.com/ClickHouse/ClickHouse/pull/19766) ([achimbab](https://github.com/achimbab)). + +#### Experimental Feature + +* Add support for virtual filesystem over HDFS. [#11058](https://github.com/ClickHouse/ClickHouse/pull/11058) ([overshov](https://github.com/overshov)) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now clickhouse-keeper (an experimental alternative to ZooKeeper) supports ZooKeeper-like `digest` ACLs. [#24448](https://github.com/ClickHouse/ClickHouse/pull/24448) ([alesapin](https://github.com/alesapin)). + +#### Performance Improvement + +* Added optimization that transforms some functions to reading of subcolumns to reduce amount of read data. E.g., statement `col IS NULL` is transformed to reading of subcolumn `col.null`. Optimization can be enabled by setting `optimize_functions_to_subcolumns` which is currently off by default. [#24406](https://github.com/ClickHouse/ClickHouse/pull/24406) ([Anton Popov](https://github.com/CurtizJ)). +* Rewrite more columns to possible alias expressions. This may enable better optimization, such as projections. [#24405](https://github.com/ClickHouse/ClickHouse/pull/24405) ([Amos Bird](https://github.com/amosbird)). +* Index of type `bloom_filter` can be used for expressions with `hasAny` function with constant arrays. This closes: [#24291](https://github.com/ClickHouse/ClickHouse/issues/24291). [#24900](https://github.com/ClickHouse/ClickHouse/pull/24900) ([Vasily Nemkov](https://github.com/Enmk)). +* Add exponential backoff to reschedule read attempt in case RabbitMQ queues are empty. (ClickHouse has support for importing data from RabbitMQ). Closes [#24340](https://github.com/ClickHouse/ClickHouse/issues/24340). [#24415](https://github.com/ClickHouse/ClickHouse/pull/24415) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement + +* Allow to limit bandwidth for replication. Add two Replicated\*MergeTree settings: `max_replicated_fetches_network_bandwidth` and `max_replicated_sends_network_bandwidth` which allows to limit maximum speed of replicated fetches/sends for table. Add two server-wide settings (in `default` user profile): `max_replicated_fetches_network_bandwidth_for_server` and `max_replicated_sends_network_bandwidth_for_server` which limit maximum speed of replication for all tables. The settings are not followed perfectly accurately. Turned off by default. Fixes [#1821](https://github.com/ClickHouse/ClickHouse/issues/1821). [#24573](https://github.com/ClickHouse/ClickHouse/pull/24573) ([alesapin](https://github.com/alesapin)). +* Resource constraints and isolation for ODBC and Library bridges. Use separate `clickhouse-bridge` group and user for bridge processes. Set oom_score_adj so the bridges will be first subjects for OOM killer. Set set maximum RSS to 1 GiB. Closes [#23861](https://github.com/ClickHouse/ClickHouse/issues/23861). [#25280](https://github.com/ClickHouse/ClickHouse/pull/25280) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add standalone `clickhouse-keeper` symlink to the main `clickhouse` binary. Now it's possible to run coordination without the main clickhouse server. [#24059](https://github.com/ClickHouse/ClickHouse/pull/24059) ([alesapin](https://github.com/alesapin)). +* Use global settings for query to `VIEW`. Fixed the behavior when queries to `VIEW` use local settings, that leads to errors if setting on `CREATE VIEW` and `SELECT` were different. As for now, `VIEW` won't use these modified settings, but you can still pass additional settings in `SETTINGS` section of `CREATE VIEW` query. Close [#20551](https://github.com/ClickHouse/ClickHouse/issues/20551). [#24095](https://github.com/ClickHouse/ClickHouse/pull/24095) ([Vladimir](https://github.com/vdimir)). +* On server start, parts with incorrect partition ID would not be ever removed, but always detached. [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25166](https://github.com/ClickHouse/ClickHouse/pull/25166) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Increase size of background schedule pool to 128 (`background_schedule_pool_size` setting). It allows avoiding replication queue hung on slow zookeeper connection. [#25072](https://github.com/ClickHouse/ClickHouse/pull/25072) ([alesapin](https://github.com/alesapin)). +* Add merge tree setting `max_parts_to_merge_at_once` which limits the number of parts that can be merged in the background at once. Doesn't affect `OPTIMIZE FINAL` query. Fixes [#1820](https://github.com/ClickHouse/ClickHouse/issues/1820). [#24496](https://github.com/ClickHouse/ClickHouse/pull/24496) ([alesapin](https://github.com/alesapin)). +* Allow `NOT IN` operator to be used in partition pruning. [#24894](https://github.com/ClickHouse/ClickHouse/pull/24894) ([Amos Bird](https://github.com/amosbird)). +* Recognize IPv4 addresses like `127.0.1.1` as local. This is controversial and closes [#23504](https://github.com/ClickHouse/ClickHouse/issues/23504). Michael Filimonov will test this feature. [#24316](https://github.com/ClickHouse/ClickHouse/pull/24316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse database created with MaterializeMySQL (it is an experimental feature) now contains all column comments from the MySQL database that materialized. [#25199](https://github.com/ClickHouse/ClickHouse/pull/25199) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Add settings (`connection_auto_close`/`connection_max_tries`/`connection_pool_size`) for MySQL storage engine. [#24146](https://github.com/ClickHouse/ClickHouse/pull/24146) ([Azat Khuzhin](https://github.com/azat)). +* Improve startup time of Distributed engine. [#25663](https://github.com/ClickHouse/ClickHouse/pull/25663) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Drop replicas from dirname for internal_replication=true (allows INSERT into Distributed with cluster from any number of replicas, before only 15 replicas was supported, everything more will fail with ENAMETOOLONG while creating directory for async blocks). [#25513](https://github.com/ClickHouse/ClickHouse/pull/25513) ([Azat Khuzhin](https://github.com/azat)). +* Added support `Interval` type for `LowCardinality`. It is needed for intermediate values of some expressions. Closes [#21730](https://github.com/ClickHouse/ClickHouse/issues/21730). [#25410](https://github.com/ClickHouse/ClickHouse/pull/25410) ([Vladimir](https://github.com/vdimir)). +* Add `==` operator on time conditions for `sequenceMatch` and `sequenceCount` functions. For eg: sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2). [#25299](https://github.com/ClickHouse/ClickHouse/pull/25299) ([Christophe Kalenzaga](https://github.com/mga-chka)). +* Add settings `http_max_fields`, `http_max_field_name_size`, `http_max_field_value_size`. [#25296](https://github.com/ClickHouse/ClickHouse/pull/25296) ([Ivan](https://github.com/abyss7)). +* Add support for function `if` with `Decimal` and `Int` types on its branches. This closes [#20549](https://github.com/ClickHouse/ClickHouse/issues/20549). This closes [#10142](https://github.com/ClickHouse/ClickHouse/issues/10142). [#25283](https://github.com/ClickHouse/ClickHouse/pull/25283) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update prompt in `clickhouse-client` and display a message when reconnecting. This closes [#10577](https://github.com/ClickHouse/ClickHouse/issues/10577). [#25281](https://github.com/ClickHouse/ClickHouse/pull/25281) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correct memory tracking in aggregate function `topK`. This closes [#25259](https://github.com/ClickHouse/ClickHouse/issues/25259). [#25260](https://github.com/ClickHouse/ClickHouse/pull/25260) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `topLevelDomain` for IDN hosts (i.e. `example.рф`), before it returns empty string for such hosts. [#25103](https://github.com/ClickHouse/ClickHouse/pull/25103) ([Azat Khuzhin](https://github.com/azat)). +* Detect Linux kernel version at runtime (for worked nested epoll, that is required for `async_socket_for_remote`/`use_hedged_requests`, otherwise remote queries may stuck). [#25067](https://github.com/ClickHouse/ClickHouse/pull/25067) ([Azat Khuzhin](https://github.com/azat)). +* For distributed query, when `optimize_skip_unused_shards=1`, allow to skip shard with condition like `(sharding key) IN (one-element-tuple)`. (Tuples with many elements were supported. Tuple with single element did not work because it is parsed as literal). [#24930](https://github.com/ClickHouse/ClickHouse/pull/24930) ([Amos Bird](https://github.com/amosbird)). +* Improved log messages of S3 errors, no more double whitespaces in case of empty keys and buckets. [#24897](https://github.com/ClickHouse/ClickHouse/pull/24897) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Some queries require multi-pass semantic analysis. Try reusing built sets for `IN` in this case. [#24874](https://github.com/ClickHouse/ClickHouse/pull/24874) ([Amos Bird](https://github.com/amosbird)). +* Respect `max_distributed_connections` for `insert_distributed_sync` (otherwise for huge clusters and sync insert it may run out of `max_thread_pool_size`). [#24754](https://github.com/ClickHouse/ClickHouse/pull/24754) ([Azat Khuzhin](https://github.com/azat)). +* Avoid hiding errors like `Limit for rows or bytes to read exceeded` for scalar subqueries. [#24545](https://github.com/ClickHouse/ClickHouse/pull/24545) ([nvartolomei](https://github.com/nvartolomei)). +* Make String-to-Int parser stricter so that `toInt64('+')` will throw. [#24475](https://github.com/ClickHouse/ClickHouse/pull/24475) ([Amos Bird](https://github.com/amosbird)). +* If `SSD_CACHE` is created with DDL query, it can be created only inside `user_files` directory. [#24466](https://github.com/ClickHouse/ClickHouse/pull/24466) ([Maksim Kita](https://github.com/kitaisreal)). +* PostgreSQL support for specifying non default schema for insert queries. Closes [#24149](https://github.com/ClickHouse/ClickHouse/issues/24149). [#24413](https://github.com/ClickHouse/ClickHouse/pull/24413) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix IPv6 addresses resolving (i.e. fixes `select * from remote('[::1]', system.one)`). [#24319](https://github.com/ClickHouse/ClickHouse/pull/24319) ([Azat Khuzhin](https://github.com/azat)). +* Fix trailing whitespaces in FROM clause with subqueries in multiline mode, and also changes the output of the queries slightly in a more human friendly way. [#24151](https://github.com/ClickHouse/ClickHouse/pull/24151) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Add ability to split distributed batch on failures (i.e. due to memory limits, corruptions), under `distributed_directory_monitor_split_batch_on_failure` (OFF by default). [#23864](https://github.com/ClickHouse/ClickHouse/pull/23864) ([Azat Khuzhin](https://github.com/azat)). +* Handle column name clashes for `Join` table engine. Closes [#20309](https://github.com/ClickHouse/ClickHouse/issues/20309). [#23769](https://github.com/ClickHouse/ClickHouse/pull/23769) ([Vladimir](https://github.com/vdimir)). +* Display progress for `File` table engine in `clickhouse-local` and on INSERT query in `clickhouse-client` when data is passed to stdin. Closes [#18209](https://github.com/ClickHouse/ClickHouse/issues/18209). [#23656](https://github.com/ClickHouse/ClickHouse/pull/23656) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Bugfixes and improvements of `clickhouse-copier`. Allow to copy tables with different (but compatible schemas). Closes [#9159](https://github.com/ClickHouse/ClickHouse/issues/9159). Added test to copy ReplacingMergeTree. Closes [#22711](https://github.com/ClickHouse/ClickHouse/issues/22711). Support TTL on columns and Data Skipping Indices. It simply removes it to create internal Distributed table (underlying table will have TTL and skipping indices). Closes [#19384](https://github.com/ClickHouse/ClickHouse/issues/19384). Allow to copy MATERIALIZED and ALIAS columns. There are some cases in which it could be helpful (e.g. if this column is in PRIMARY KEY). Now it could be allowed by setting `allow_to_copy_alias_and_materialized_columns` property to true in task configuration. Closes [#9177](https://github.com/ClickHouse/ClickHouse/issues/9177). Closes [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007). Closes [#9514](https://github.com/ClickHouse/ClickHouse/issues/9514). Added a property `allow_to_drop_target_partitions` in task configuration to drop partition in original table before moving helping tables. Closes [#20957](https://github.com/ClickHouse/ClickHouse/issues/20957). Get rid of `OPTIMIZE DEDUPLICATE` query. This hack was needed, because `ALTER TABLE MOVE PARTITION` was retried many times and plain MergeTree tables don't have deduplication. Closes [#17966](https://github.com/ClickHouse/ClickHouse/issues/17966). Write progress to ZooKeeper node on path `task_path + /status` in JSON format. Closes [#20955](https://github.com/ClickHouse/ClickHouse/issues/20955). Support for ReplicatedTables without arguments. Closes [#24834](https://github.com/ClickHouse/ClickHouse/issues/24834) .[#23518](https://github.com/ClickHouse/ClickHouse/pull/23518) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added sleep with backoff between read retries from S3. [#23461](https://github.com/ClickHouse/ClickHouse/pull/23461) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Respect `insert_allow_materialized_columns` (allows materialized columns) for INSERT into `Distributed` table. [#23349](https://github.com/ClickHouse/ClickHouse/pull/23349) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to push down LIMIT for distributed queries. [#23027](https://github.com/ClickHouse/ClickHouse/pull/23027) ([Azat Khuzhin](https://github.com/azat)). +* Fix zero-copy replication with several S3 volumes (Fixes [#22679](https://github.com/ClickHouse/ClickHouse/issues/22679)). [#22864](https://github.com/ClickHouse/ClickHouse/pull/22864) ([ianton-ru](https://github.com/ianton-ru)). +* Resolve the actual port number bound when a user requests any available port from the operating system to show it in the log message. [#25569](https://github.com/ClickHouse/ClickHouse/pull/25569) ([bnaecker](https://github.com/bnaecker)). +* Fixed case, when sometimes conversion of postgres arrays resulted in String data type, not n-dimensional array, because `attndims` works incorrectly in some cases. Closes [#24804](https://github.com/ClickHouse/ClickHouse/issues/24804). [#25538](https://github.com/ClickHouse/ClickHouse/pull/25538) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix convertion of DateTime with timezone for MySQL, PostgreSQL, ODBC. Closes [#5057](https://github.com/ClickHouse/ClickHouse/issues/5057). [#25528](https://github.com/ClickHouse/ClickHouse/pull/25528) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Distinguish KILL MUTATION for different tables (fixes unexpected `Cancelled mutating parts` error). [#25025](https://github.com/ClickHouse/ClickHouse/pull/25025) ([Azat Khuzhin](https://github.com/azat)). +* Allow to declare S3 disk at root of bucket (S3 virtual filesystem is an experimental feature under development). [#24898](https://github.com/ClickHouse/ClickHouse/pull/24898) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Enable reading of subcolumns (e.g. components of Tuples) for distributed tables. [#24472](https://github.com/ClickHouse/ClickHouse/pull/24472) ([Anton Popov](https://github.com/CurtizJ)). +* A feature for MySQL compatibility protocol: make `user` function to return correct output. Closes [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697). [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697) ([sundyli](https://github.com/sundy-li)). + +#### Bug Fix + +* Improvement for backward compatibility. Use old modulo function version when used in partition key. Closes [#23508](https://github.com/ClickHouse/ClickHouse/issues/23508). [#24157](https://github.com/ClickHouse/ClickHouse/pull/24157) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely rare bug on low-memory servers which can lead to the inability to perform merges without restart. Possibly fixes [#24603](https://github.com/ClickHouse/ClickHouse/issues/24603). [#24872](https://github.com/ClickHouse/ClickHouse/pull/24872) ([alesapin](https://github.com/alesapin)). +* Fix extremely rare error `Tagging already tagged part` in replication queue during concurrent `alter move/replace partition`. Possibly fixes [#22142](https://github.com/ClickHouse/ClickHouse/issues/22142). [#24961](https://github.com/ClickHouse/ClickHouse/pull/24961) ([alesapin](https://github.com/alesapin)). +* Fix potential crash when calculating aggregate function states by aggregation of aggregate function states of other aggregate functions (not a practical use case). See [#24523](https://github.com/ClickHouse/ClickHouse/issues/24523). [#25015](https://github.com/ClickHouse/ClickHouse/pull/25015) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behavior when query `SYSTEM RESTART REPLICA` or `SYSTEM SYNC REPLICA` does not finish. This was detected on server with extremely low amount of RAM. [#24457](https://github.com/ClickHouse/ClickHouse/pull/24457) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug which can lead to ZooKeeper client hung inside clickhouse-server. [#24721](https://github.com/ClickHouse/ClickHouse/pull/24721) ([alesapin](https://github.com/alesapin)). +* If ZooKeeper connection was lost and replica was cloned after restoring the connection, its replication queue might contain outdated entries. Fixed failed assertion when replication queue contains intersecting virtual parts. It may rarely happen if some data part was lost. Print error in log instead of terminating. [#24777](https://github.com/ClickHouse/ClickHouse/pull/24777) ([tavplubix](https://github.com/tavplubix)). +* Fix lost `WHERE` condition in expression-push-down optimization of query plan (setting `query_plan_filter_push_down = 1` by default). Fixes [#25368](https://github.com/ClickHouse/ClickHouse/issues/25368). [#25370](https://github.com/ClickHouse/ClickHouse/pull/25370) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which can lead to intersecting parts after merges with TTL: `Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.`. [#25549](https://github.com/ClickHouse/ClickHouse/pull/25549) ([alesapin](https://github.com/alesapin)). +* On ZooKeeper connection loss `ReplicatedMergeTree` table might wait for background operations to complete before trying to reconnect. It's fixed, now background operations are stopped forcefully. [#25306](https://github.com/ClickHouse/ClickHouse/pull/25306) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Key expression contains comparison between inconvertible types` for queries with `ARRAY JOIN` in case if array is used in primary key. Fixes [#8247](https://github.com/ClickHouse/ClickHouse/issues/8247). [#25546](https://github.com/ClickHouse/ClickHouse/pull/25546) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong totals for query `WITH TOTALS` and `WITH FILL`. Fixes [#20872](https://github.com/ClickHouse/ClickHouse/issues/20872). [#25539](https://github.com/ClickHouse/ClickHouse/pull/25539) ([Anton Popov](https://github.com/CurtizJ)). +* Fix data race when querying `system.clusters` while reloading the cluster configuration at the same time. [#25737](https://github.com/ClickHouse/ClickHouse/pull/25737) ([Amos Bird](https://github.com/amosbird)). +* Fixed `No such file or directory` error on moving `Distributed` table between databases. Fixes [#24971](https://github.com/ClickHouse/ClickHouse/issues/24971). [#25667](https://github.com/ClickHouse/ClickHouse/pull/25667) ([tavplubix](https://github.com/tavplubix)). +* `REPLACE PARTITION` might be ignored in rare cases if the source partition was empty. It's fixed. Fixes [#24869](https://github.com/ClickHouse/ClickHouse/issues/24869). [#25665](https://github.com/ClickHouse/ClickHouse/pull/25665) ([tavplubix](https://github.com/tavplubix)). +* Fixed a bug in `Replicated` database engine that might rarely cause some replica to skip enqueued DDL query. [#24805](https://github.com/ClickHouse/ClickHouse/pull/24805) ([tavplubix](https://github.com/tavplubix)). +* Fix null pointer dereference in `EXPLAIN AST` without query. [#25631](https://github.com/ClickHouse/ClickHouse/pull/25631) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix waiting of automatic dropping of empty parts. It could lead to full filling of background pool and stuck of replication. [#23315](https://github.com/ClickHouse/ClickHouse/pull/23315) ([Anton Popov](https://github.com/CurtizJ)). +* Fix restore of a table stored in S3 virtual filesystem (it is an experimental feature not ready for production). [#25601](https://github.com/ClickHouse/ClickHouse/pull/25601) ([ianton-ru](https://github.com/ianton-ru)). +* Fix nullptr dereference in `Arrow` format when using `Decimal256`. Add `Decimal256` support for `Arrow` format. [#25531](https://github.com/ClickHouse/ClickHouse/pull/25531) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix excessive underscore before the names of the preprocessed configuration files. [#25431](https://github.com/ClickHouse/ClickHouse/pull/25431) ([Vitaly Baranov](https://github.com/vitlibar)). +* A fix for `clickhouse-copier` tool: Fix segfault when sharding_key is absent in task config for copier. [#25419](https://github.com/ClickHouse/ClickHouse/pull/25419) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `REPLACE` column transformer when used in DDL by correctly quoting the formated query. This fixes [#23925](https://github.com/ClickHouse/ClickHouse/issues/23925). [#25391](https://github.com/ClickHouse/ClickHouse/pull/25391) ([Amos Bird](https://github.com/amosbird)). +* Fix the possibility of non-deterministic behaviour of the `quantileDeterministic` function and similar. This closes [#20480](https://github.com/ClickHouse/ClickHouse/issues/20480). [#25313](https://github.com/ClickHouse/ClickHouse/pull/25313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `SimpleAggregateFunction(LowCardinality)` for `SummingMergeTree`. Fixes [#25134](https://github.com/ClickHouse/ClickHouse/issues/25134). [#25300](https://github.com/ClickHouse/ClickHouse/pull/25300) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix logical error with exception message "Cannot sum Array/Tuple in min/maxMap". [#25298](https://github.com/ClickHouse/ClickHouse/pull/25298) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix error `Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector` for queries where `LowCardinality` argument was used for IN (this bug appeared in 21.6). Fixes [#25187](https://github.com/ClickHouse/ClickHouse/issues/25187). [#25290](https://github.com/ClickHouse/ClickHouse/pull/25290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect behaviour of `joinGetOrNull` with not-nullable columns. This fixes [#24261](https://github.com/ClickHouse/ClickHouse/issues/24261). [#25288](https://github.com/ClickHouse/ClickHouse/pull/25288) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect behaviour and UBSan report in big integers. In previous versions `CAST(1e19 AS UInt128)` returned zero. [#25279](https://github.com/ClickHouse/ClickHouse/pull/25279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed an error which occurred while inserting a subset of columns using CSVWithNames format. Fixes [#25129](https://github.com/ClickHouse/ClickHouse/issues/25129). [#25169](https://github.com/ClickHouse/ClickHouse/pull/25169) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do not use table's projection for `SELECT` with `FINAL`. It is not supported yet. [#25163](https://github.com/ClickHouse/ClickHouse/pull/25163) ([Amos Bird](https://github.com/amosbird)). +* Fix possible parts loss after updating up to 21.5 in case table used `UUID` in partition key. (It is not recommended to use `UUID` in partition key). Fixes [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25127](https://github.com/ClickHouse/ClickHouse/pull/25127) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in query with cross join and `joined_subquery_requires_alias = 0`. Fixes [#24011](https://github.com/ClickHouse/ClickHouse/issues/24011). [#25082](https://github.com/ClickHouse/ClickHouse/pull/25082) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug with constant maps in mapContains function that lead to error `empty column was returned by function mapContains`. Closes [#25077](https://github.com/ClickHouse/ClickHouse/issues/25077). [#25080](https://github.com/ClickHouse/ClickHouse/pull/25080) ([Kruglov Pavel](https://github.com/Avogar)). +* Remove possibility to create tables with columns referencing themselves like `a UInt32 ALIAS a + 1` or `b UInt32 MATERIALIZED b`. Fixes [#24910](https://github.com/ClickHouse/ClickHouse/issues/24910), [#24292](https://github.com/ClickHouse/ClickHouse/issues/24292). [#25059](https://github.com/ClickHouse/ClickHouse/pull/25059) ([alesapin](https://github.com/alesapin)). +* Fix wrong result when using aggregate projection with *not empty* `GROUP BY` key to execute query with `GROUP BY` by *empty* key. [#25055](https://github.com/ClickHouse/ClickHouse/pull/25055) ([Amos Bird](https://github.com/amosbird)). +* Fix serialization of splitted nested messages in Protobuf format. This PR fixes [#24647](https://github.com/ClickHouse/ClickHouse/issues/24647). [#25000](https://github.com/ClickHouse/ClickHouse/pull/25000) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix limit/offset settings for distributed queries (ignore on the remote nodes). [#24940](https://github.com/ClickHouse/ClickHouse/pull/24940) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible heap-buffer-overflow in `Arrow` format. [#24922](https://github.com/ClickHouse/ClickHouse/pull/24922) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed possible error 'Cannot read from istream at offset 0' when reading a file from DiskS3 (S3 virtual filesystem is an experimental feature under development that should not be used in production). [#24885](https://github.com/ClickHouse/ClickHouse/pull/24885) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix "Missing columns" exception when joining Distributed Materialized View. [#24870](https://github.com/ClickHouse/ClickHouse/pull/24870) ([Azat Khuzhin](https://github.com/azat)). +* Allow `NULL` values in postgresql compatibility protocol. Closes [#22622](https://github.com/ClickHouse/ClickHouse/issues/22622). [#24857](https://github.com/ClickHouse/ClickHouse/pull/24857) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug when exception `Mutation was killed` can be thrown to the client on mutation wait when mutation not loaded into memory yet. [#24809](https://github.com/ClickHouse/ClickHouse/pull/24809) ([alesapin](https://github.com/alesapin)). +* Fixed bug in deserialization of random generator state with might cause some data types such as `AggregateFunction(groupArraySample(N), T))` to behave in a non-deterministic way. [#24538](https://github.com/ClickHouse/ClickHouse/pull/24538) ([tavplubix](https://github.com/tavplubix)). +* Disallow building uniqXXXXStates of other aggregation states. [#24523](https://github.com/ClickHouse/ClickHouse/pull/24523) ([Raúl Marín](https://github.com/Algunenano)). Then allow it back by actually eliminating the root cause of the related issue. ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix usage of tuples in `CREATE .. AS SELECT` queries. [#24464](https://github.com/ClickHouse/ClickHouse/pull/24464) ([Anton Popov](https://github.com/CurtizJ)). +* Fix computation of total bytes in `Buffer` table. In current ClickHouse version total_writes.bytes counter decreases too much during the buffer flush. It leads to counter overflow and totalBytes return something around 17.44 EB some time after the flush. [#24450](https://github.com/ClickHouse/ClickHouse/pull/24450) ([DimasKovas](https://github.com/DimasKovas)). +* Fix incorrect information about the monotonicity of toWeek function. This fixes [#24422](https://github.com/ClickHouse/ClickHouse/issues/24422) . This bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/5212 , and was exposed later by smarter partition pruner. [#24446](https://github.com/ClickHouse/ClickHouse/pull/24446) ([Amos Bird](https://github.com/amosbird)). +* When user authentication is managed by LDAP. Fixed potential deadlock that can happen during LDAP role (re)mapping, when LDAP group is mapped to a nonexistent local role. [#24431](https://github.com/ClickHouse/ClickHouse/pull/24431) ([Denis Glazachev](https://github.com/traceon)). +* In "multipart/form-data" message consider the CRLF preceding a boundary as part of it. Fixes [#23905](https://github.com/ClickHouse/ClickHouse/issues/23905). [#24399](https://github.com/ClickHouse/ClickHouse/pull/24399) ([Ivan](https://github.com/abyss7)). +* Fix drop partition with intersect fake parts. In rare cases there might be parts with mutation version greater than current block number. [#24321](https://github.com/ClickHouse/ClickHouse/pull/24321) ([Amos Bird](https://github.com/amosbird)). +* Fixed a bug in moving Materialized View from Ordinary to Atomic database (`RENAME TABLE` query). Now inner table is moved to new database together with Materialized View. Fixes [#23926](https://github.com/ClickHouse/ClickHouse/issues/23926). [#24309](https://github.com/ClickHouse/ClickHouse/pull/24309) ([tavplubix](https://github.com/tavplubix)). +* Allow empty HTTP headers. Fixes [#23901](https://github.com/ClickHouse/ClickHouse/issues/23901). [#24285](https://github.com/ClickHouse/ClickHouse/pull/24285) ([Ivan](https://github.com/abyss7)). +* Correct processing of mutations (ALTER UPDATE/DELETE) in Memory tables. Closes [#24274](https://github.com/ClickHouse/ClickHouse/issues/24274). [#24275](https://github.com/ClickHouse/ClickHouse/pull/24275) ([flynn](https://github.com/ucasfl)). +* Make column LowCardinality property in JOIN output the same as in the input, close [#23351](https://github.com/ClickHouse/ClickHouse/issues/23351), close [#20315](https://github.com/ClickHouse/ClickHouse/issues/20315). [#24061](https://github.com/ClickHouse/ClickHouse/pull/24061) ([Vladimir](https://github.com/vdimir)). +* A fix for Kafka tables. Fix the bug in failover behavior when Engine = Kafka was not able to start consumption if the same consumer had an empty assignment previously. Closes [#21118](https://github.com/ClickHouse/ClickHouse/issues/21118). [#21267](https://github.com/ClickHouse/ClickHouse/pull/21267) ([filimonov](https://github.com/filimonov)). + +#### Build/Testing/Packaging Improvement + +* Add `darwin-aarch64` (Mac M1 / Apple Silicon) builds in CI [#25560](https://github.com/ClickHouse/ClickHouse/pull/25560) ([Ivan](https://github.com/abyss7)) and put the links to the docs and website ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adds cross-platform embedding of binary resources into executables. It works on Illumos. [#25146](https://github.com/ClickHouse/ClickHouse/pull/25146) ([bnaecker](https://github.com/bnaecker)). +* Add join related options to stress tests to improve fuzzing. [#25200](https://github.com/ClickHouse/ClickHouse/pull/25200) ([Vladimir](https://github.com/vdimir)). +* Enable build with s3 module in osx [#25217](https://github.com/ClickHouse/ClickHouse/issues/25217). [#25218](https://github.com/ClickHouse/ClickHouse/pull/25218) ([kevin wan](https://github.com/MaxWk)). +* Add integration test cases to cover JDBC bridge. [#25047](https://github.com/ClickHouse/ClickHouse/pull/25047) ([Zhichun Wu](https://github.com/zhicwu)). +* Integration tests configuration has special treatment for dictionaries. Removed remaining dictionaries manual setup. [#24728](https://github.com/ClickHouse/ClickHouse/pull/24728) ([Ilya Yatsishin](https://github.com/qoega)). +* Add libfuzzer tests for YAMLParser class. [#24480](https://github.com/ClickHouse/ClickHouse/pull/24480) ([BoloniniD](https://github.com/BoloniniD)). +* Ubuntu 20.04 is now used to run integration tests, docker-compose version used to run integration tests is updated to 1.28.2. Environment variables now take effect on docker-compose. Rework test_dictionaries_all_layouts_separate_sources to allow parallel run. [#20393](https://github.com/ClickHouse/ClickHouse/pull/20393) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix TOCTOU error in installation script. [#25277](https://github.com/ClickHouse/ClickHouse/pull/25277) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release 21.6, 2021-06-05 + +#### Backward Incompatible Change +* uniqState / uniqHLL12State / uniqCombinedState / uniqCombined64State produce incompatible states with `UUID` type. [#33607](https://github.com/ClickHouse/ClickHouse/issues/33607). + +#### Upgrade Notes + +* `zstd` compression library is updated to v1.5.0. You may get messages about "checksum does not match" in replication. These messages are expected due to update of compression algorithm and you can ignore them. These messages are informational and do not indicate any kinds of undesired behaviour. +* The setting `compile_expressions` is enabled by default. Although it has been heavily tested on variety of scenarios, if you find some undesired behaviour on your servers, you can try turning this setting off. +* Values of `UUID` type cannot be compared with integer. For example, instead of writing `uuid != 0` type `uuid != '00000000-0000-0000-0000-000000000000'`. + +#### New Feature + +* Add Postgres-like cast operator (`::`). E.g.: `[1, 2]::Array(UInt8)`, `0.1::Decimal(4, 4)`, `number::UInt16`. [#23871](https://github.com/ClickHouse/ClickHouse/pull/23871) ([Anton Popov](https://github.com/CurtizJ)). +* Make big integers production ready. Add support for `UInt128` data type. Fix known issues with the `Decimal256` data type. Support big integers in dictionaries. Support `gcd`/`lcm` functions for big integers. Support big integers in array search and conditional functions. Support `LowCardinality(UUID)`. Support big integers in `generateRandom` table function and `clickhouse-obfuscator`. Fix error with returning `UUID` from scalar subqueries. This fixes [#7834](https://github.com/ClickHouse/ClickHouse/issues/7834). This fixes [#23936](https://github.com/ClickHouse/ClickHouse/issues/23936). This fixes [#4176](https://github.com/ClickHouse/ClickHouse/issues/4176). This fixes [#24018](https://github.com/ClickHouse/ClickHouse/issues/24018). Backward incompatible change: values of `UUID` type cannot be compared with integer. For example, instead of writing `uuid != 0` type `uuid != '00000000-0000-0000-0000-000000000000'`. [#23631](https://github.com/ClickHouse/ClickHouse/pull/23631) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `Array` data type for inserting and selecting data in `Arrow`, `Parquet` and `ORC` formats. [#21770](https://github.com/ClickHouse/ClickHouse/pull/21770) ([taylor12805](https://github.com/taylor12805)). +* Implement table comments. Closes [#23225](https://github.com/ClickHouse/ClickHouse/issues/23225). [#23548](https://github.com/ClickHouse/ClickHouse/pull/23548) ([flynn](https://github.com/ucasFL)). +* Support creating dictionaries with DDL queries in `clickhouse-local`. Closes [#22354](https://github.com/ClickHouse/ClickHouse/issues/22354). Added support for `DETACH DICTIONARY PERMANENTLY`. Added support for `EXCHANGE DICTIONARIES` for `Atomic` database engine. Added support for moving dictionaries between databases using `RENAME DICTIONARY`. [#23436](https://github.com/ClickHouse/ClickHouse/pull/23436) ([Maksim Kita](https://github.com/kitaisreal)). +* Add aggregate function `uniqTheta` to support [Theta Sketch](https://datasketches.apache.org/docs/Theta/ThetaSketchFramework.html) in ClickHouse. [#23894](https://github.com/ClickHouse/ClickHouse/pull/23894). [#22609](https://github.com/ClickHouse/ClickHouse/pull/22609) ([Ping Yu](https://github.com/pingyu)). +* Add function `splitByRegexp`. [#24077](https://github.com/ClickHouse/ClickHouse/pull/24077) ([abel-cheng](https://github.com/abel-cheng)). +* Add function `arrayProduct` which accept an array as the parameter, and return the product of all the elements in array. Closes [#21613](https://github.com/ClickHouse/ClickHouse/issues/21613). [#23782](https://github.com/ClickHouse/ClickHouse/pull/23782) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `thread_name` column in `system.stack_trace`. This closes [#23256](https://github.com/ClickHouse/ClickHouse/issues/23256). [#24124](https://github.com/ClickHouse/ClickHouse/pull/24124) ([abel-cheng](https://github.com/abel-cheng)). +* If `insert_null_as_default` = 1, insert default values instead of NULL in `INSERT ... SELECT` and `INSERT ... SELECT ... UNION ALL ...` queries. Closes [#22832](https://github.com/ClickHouse/ClickHouse/issues/22832). [#23524](https://github.com/ClickHouse/ClickHouse/pull/23524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for progress indication in `clickhouse-local` with `--progress` option. [#23196](https://github.com/ClickHouse/ClickHouse/pull/23196) ([Egor Savin](https://github.com/Amesaru)). +* Add support for HTTP compression (determined by `Content-Encoding` HTTP header) in `http` dictionary source. This fixes [#8912](https://github.com/ClickHouse/ClickHouse/issues/8912). [#23946](https://github.com/ClickHouse/ClickHouse/pull/23946) ([FArthur-cmd](https://github.com/FArthur-cmd)). +* Added `SYSTEM QUERY RELOAD MODEL`, `SYSTEM QUERY RELOAD MODELS`. Closes [#18722](https://github.com/ClickHouse/ClickHouse/issues/18722). [#23182](https://github.com/ClickHouse/ClickHouse/pull/23182) ([Maksim Kita](https://github.com/kitaisreal)). +* Add setting `json` (boolean, 0 by default) for `EXPLAIN PLAN` query. When enabled, query output will be a single `JSON` row. It is recommended to use `TSVRaw` format to avoid unnecessary escaping. [#23082](https://github.com/ClickHouse/ClickHouse/pull/23082) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add setting `indexes` (boolean, disabled by default) to `EXPLAIN PIPELINE` query. When enabled, shows used indexes, number of filtered parts and granules for every index applied. Supported for `MergeTree*` tables. [#22352](https://github.com/ClickHouse/ClickHouse/pull/22352) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* LDAP: implemented user DN detection functionality to use when mapping Active Directory groups to ClickHouse roles. [#22228](https://github.com/ClickHouse/ClickHouse/pull/22228) ([Denis Glazachev](https://github.com/traceon)). +* New aggregate function `deltaSumTimestamp` for summing the difference between consecutive rows while maintaining ordering during merge by storing timestamps. [#21888](https://github.com/ClickHouse/ClickHouse/pull/21888) ([Russ Frank](https://github.com/rf)). +* Added less secure IMDS credentials provider for S3 which works under docker correctly. [#21852](https://github.com/ClickHouse/ClickHouse/pull/21852) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add back `indexHint` function. This is for [#21238](https://github.com/ClickHouse/ClickHouse/issues/21238). This reverts [#9542](https://github.com/ClickHouse/ClickHouse/pull/9542). This fixes [#9540](https://github.com/ClickHouse/ClickHouse/issues/9540). [#21304](https://github.com/ClickHouse/ClickHouse/pull/21304) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add `PROJECTION` support for `MergeTree*` tables. [#20202](https://github.com/ClickHouse/ClickHouse/pull/20202) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement + +* Enable `compile_expressions` setting by default. When this setting enabled, compositions of simple functions and operators will be compiled to native code with LLVM at runtime. [#8482](https://github.com/ClickHouse/ClickHouse/pull/8482) ([Maksim Kita](https://github.com/kitaisreal), [alexey-milovidov](https://github.com/alexey-milovidov)). Note: if you feel in trouble, turn this option off. +* Update `re2` library. Performance of regular expressions matching is improved. Also this PR adds compatibility with gcc-11. [#24196](https://github.com/ClickHouse/ClickHouse/pull/24196) ([Raúl Marín](https://github.com/Algunenano)). +* ORC input format reading by stripe instead of reading entire table into memory by once which is cost memory when file size is huge. [#23102](https://github.com/ClickHouse/ClickHouse/pull/23102) ([Chao Ma](https://github.com/godliness)). +* Fusion of aggregate functions `sum`, `count` and `avg` in a query into single aggregate function. The optimization is controlled with the `optimize_fuse_sum_count_avg` setting. This is implemented with a new aggregate function `sumCount`. This function returns a tuple of two fields: `sum` and `count`. [#21337](https://github.com/ClickHouse/ClickHouse/pull/21337) ([hexiaoting](https://github.com/hexiaoting)). +* Update `zstd` to v1.5.0. The performance of compression is improved for single digits percentage. [#24135](https://github.com/ClickHouse/ClickHouse/pull/24135) ([Raúl Marín](https://github.com/Algunenano)). Note: you may get messages about "checksum does not match" in replication. These messages are expected due to update of compression algorithm and you can ignore them. +* Improved performance of `Buffer` tables: do not acquire lock for total_bytes/total_rows for `Buffer` engine. [#24066](https://github.com/ClickHouse/ClickHouse/pull/24066) ([Azat Khuzhin](https://github.com/azat)). +* Preallocate support for hashed/sparse_hashed dictionaries is returned. [#23979](https://github.com/ClickHouse/ClickHouse/pull/23979) ([Azat Khuzhin](https://github.com/azat)). +* Enable `async_socket_for_remote` by default (lower amount of threads in querying Distributed tables with large fanout). [#23683](https://github.com/ClickHouse/ClickHouse/pull/23683) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Improvement + +* Add `_partition_value` virtual column to MergeTree table family. It can be used to prune partition in a deterministic way. It's needed to implement partition matcher for mutations. [#23673](https://github.com/ClickHouse/ClickHouse/pull/23673) ([Amos Bird](https://github.com/amosbird)). +* Added `region` parameter for S3 storage and disk. [#23846](https://github.com/ClickHouse/ClickHouse/pull/23846) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Allow configuring different log levels for different logging channels. Closes [#19569](https://github.com/ClickHouse/ClickHouse/issues/19569). [#23857](https://github.com/ClickHouse/ClickHouse/pull/23857) ([filimonov](https://github.com/filimonov)). +* Keep default timezone on `DateTime` operations if it was not provided explicitly. For example, if you add one second to a value of `DateTime` type without timezone it will remain `DateTime` without timezone. In previous versions the value of default timezone was placed to the returned data type explicitly so it becomes DateTime('something'). This closes [#4854](https://github.com/ClickHouse/ClickHouse/issues/4854). [#23392](https://github.com/ClickHouse/ClickHouse/pull/23392) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow user to specify empty string instead of database name for `MySQL` storage. Default database will be used for queries. In previous versions it was working for SELECT queries and not support for INSERT was also added. This closes [#19281](https://github.com/ClickHouse/ClickHouse/issues/19281). This can be useful working with `Sphinx` or other MySQL-compatible foreign databases. [#23319](https://github.com/ClickHouse/ClickHouse/pull/23319) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `quantile(s)TDigest`. Added special handling of singleton centroids according to tdunning/t-digest 3.2+. Also a bug with over-compression of centroids in implementation of earlier version of the algorithm was fixed. [#23314](https://github.com/ClickHouse/ClickHouse/pull/23314) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Function `now64` now supports optional timezone argument. [#24091](https://github.com/ClickHouse/ClickHouse/pull/24091) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix the case when a progress bar in interactive mode in clickhouse-client that appear in the middle of the data may rewrite some parts of visible data in terminal. This closes [#19283](https://github.com/ClickHouse/ClickHouse/issues/19283). [#23050](https://github.com/ClickHouse/ClickHouse/pull/23050) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when memory allocation fails in simdjson. https://github.com/simdjson/simdjson/pull/1567 . Mark as improvement because it's a very rare bug. [#24147](https://github.com/ClickHouse/ClickHouse/pull/24147) ([Amos Bird](https://github.com/amosbird)). +* Preserve dictionaries until storage shutdown (this will avoid possible `external dictionary 'DICT' not found` errors at server shutdown during final flush of the `Buffer` engine). [#24068](https://github.com/ClickHouse/ClickHouse/pull/24068) ([Azat Khuzhin](https://github.com/azat)). +* Flush `Buffer` tables before shutting down tables (within one database), to avoid discarding blocks due to underlying table had been already detached (and `Destination table default.a_data_01870 doesn't exist. Block of data is discarded` error in the log). [#24067](https://github.com/ClickHouse/ClickHouse/pull/24067) ([Azat Khuzhin](https://github.com/azat)). +* Now `prefer_column_name_to_alias = 1` will also favor column names for `group by`, `having` and `order by`. This fixes [#23882](https://github.com/ClickHouse/ClickHouse/issues/23882). [#24022](https://github.com/ClickHouse/ClickHouse/pull/24022) ([Amos Bird](https://github.com/amosbird)). +* Add support for `ORDER BY WITH FILL` with `DateTime64`. [#24016](https://github.com/ClickHouse/ClickHouse/pull/24016) ([kevin wan](https://github.com/MaxWk)). +* Enable `DateTime64` to be a version column in `ReplacingMergeTree`. [#23992](https://github.com/ClickHouse/ClickHouse/pull/23992) ([kevin wan](https://github.com/MaxWk)). +* Log information about OS name, kernel version and CPU architecture on server startup. [#23988](https://github.com/ClickHouse/ClickHouse/pull/23988) ([Azat Khuzhin](https://github.com/azat)). +* Support specifying table schema for `postgresql` dictionary source. Closes [#23958](https://github.com/ClickHouse/ClickHouse/issues/23958). [#23980](https://github.com/ClickHouse/ClickHouse/pull/23980) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add hints for names of `Enum` elements (suggest names in case of typos). Closes [#17112](https://github.com/ClickHouse/ClickHouse/issues/17112). [#23919](https://github.com/ClickHouse/ClickHouse/pull/23919) ([flynn](https://github.com/ucasFL)). +* Measure found rate (the percentage for which the value was found) for dictionaries (see `found_rate` in `system.dictionaries`). [#23916](https://github.com/ClickHouse/ClickHouse/pull/23916) ([Azat Khuzhin](https://github.com/azat)). +* Allow to add specific queue settings via table settng `rabbitmq_queue_settings_list`. (Closes [#23737](https://github.com/ClickHouse/ClickHouse/issues/23737) and [#23918](https://github.com/ClickHouse/ClickHouse/issues/23918)). Allow user to control all RabbitMQ setup: if table setting `rabbitmq_queue_consume` is set to `1` - RabbitMQ table engine will only connect to specified queue and will not perform any RabbitMQ consumer-side setup like declaring exchange, queues, bindings. (Closes [#21757](https://github.com/ClickHouse/ClickHouse/issues/21757)). Add proper cleanup when RabbitMQ table is dropped - delete queues, which the table has declared and all bound exchanges - if they were created by the table. [#23887](https://github.com/ClickHouse/ClickHouse/pull/23887) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `broken_data_files`/`broken_data_compressed_bytes` into `system.distribution_queue`. Add metric for number of files for asynchronous insertion into Distributed tables that has been marked as broken (`BrokenDistributedFilesToInsert`). [#23885](https://github.com/ClickHouse/ClickHouse/pull/23885) ([Azat Khuzhin](https://github.com/azat)). +* Querying `system.tables` does not go to ZooKeeper anymore. [#23793](https://github.com/ClickHouse/ClickHouse/pull/23793) ([Fuwang Hu](https://github.com/fuwhu)). +* Respect `lock_acquire_timeout_for_background_operations` for `OPTIMIZE` queries. [#23623](https://github.com/ClickHouse/ClickHouse/pull/23623) ([Azat Khuzhin](https://github.com/azat)). +* Possibility to change `S3` disk settings in runtime via new `SYSTEM RESTART DISK` SQL command. [#23429](https://github.com/ClickHouse/ClickHouse/pull/23429) ([Pavel Kovalenko](https://github.com/Jokser)). +* If user applied a misconfiguration by mistakenly setting `max_distributed_connections` to value zero, every query to a `Distributed` table will throw exception with a message containing "logical error". But it's really an expected behaviour, not a logical error, so the exception message was slightly incorrect. It also triggered checks in our CI enviroment that ensures that no logical errors ever happen. Instead we will treat `max_distributed_connections` misconfigured to zero as the minimum possible value (one). [#23348](https://github.com/ClickHouse/ClickHouse/pull/23348) ([Azat Khuzhin](https://github.com/azat)). +* Disable `min_bytes_to_use_mmap_io` by default. [#23322](https://github.com/ClickHouse/ClickHouse/pull/23322) ([Azat Khuzhin](https://github.com/azat)). +* Support `LowCardinality` nullability with `join_use_nulls`, close [#15101](https://github.com/ClickHouse/ClickHouse/issues/15101). [#23237](https://github.com/ClickHouse/ClickHouse/pull/23237) ([vdimir](https://github.com/vdimir)). +* Added possibility to restore `MergeTree` parts to `detached` directory for `S3` disk. [#23112](https://github.com/ClickHouse/ClickHouse/pull/23112) ([Pavel Kovalenko](https://github.com/Jokser)). +* Retries on HTTP connection drops in S3. [#22988](https://github.com/ClickHouse/ClickHouse/pull/22988) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add settings `external_storage_max_read_rows` and `external_storage_max_read_rows` for MySQL table engine, dictionary source and MaterializeMySQL minor data fetches. [#22697](https://github.com/ClickHouse/ClickHouse/pull/22697) ([TCeason](https://github.com/TCeason)). +* `MaterializeMySQL` (experimental feature): Previously, MySQL 5.7.9 was not supported due to SQL incompatibility. Now leave MySQL parameter verification to the MaterializeMySQL. [#23413](https://github.com/ClickHouse/ClickHouse/pull/23413) ([TCeason](https://github.com/TCeason)). +* Enable reading of subcolumns for distributed tables. [#24472](https://github.com/ClickHouse/ClickHouse/pull/24472) ([Anton Popov](https://github.com/CurtizJ)). +* Fix usage of tuples in `CREATE .. AS SELECT` queries. [#24464](https://github.com/ClickHouse/ClickHouse/pull/24464) ([Anton Popov](https://github.com/CurtizJ)). +* Support for `Parquet` format in `Kafka` tables. [#23412](https://github.com/ClickHouse/ClickHouse/pull/23412) ([Chao Ma](https://github.com/godliness)). + +#### Bug Fix + +* Use old modulo function version when used in partition key and primary key. Closes [#23508](https://github.com/ClickHouse/ClickHouse/issues/23508). [#24157](https://github.com/ClickHouse/ClickHouse/pull/24157) ([Kseniia Sumarokova](https://github.com/kssenii)). It was a source of backward incompatibility in previous releases. +* Fixed the behavior when query `SYSTEM RESTART REPLICA` or `SYSTEM SYNC REPLICA` is being processed infinitely. This was detected on server with extremely little amount of RAM. [#24457](https://github.com/ClickHouse/ClickHouse/pull/24457) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix incorrect monotonicity of `toWeek` function. This fixes [#24422](https://github.com/ClickHouse/ClickHouse/issues/24422) . This bug was introduced in [#5212](https://github.com/ClickHouse/ClickHouse/pull/5212), and was exposed later by smarter partition pruner. [#24446](https://github.com/ClickHouse/ClickHouse/pull/24446) ([Amos Bird](https://github.com/amosbird)). +* Fix drop partition with intersect fake parts. In rare cases there might be parts with mutation version greater than current block number. [#24321](https://github.com/ClickHouse/ClickHouse/pull/24321) ([Amos Bird](https://github.com/amosbird)). +* Fixed a bug in moving Materialized View from Ordinary to Atomic database (`RENAME TABLE` query). Now inner table is moved to new database together with Materialized View. Fixes [#23926](https://github.com/ClickHouse/ClickHouse/issues/23926). [#24309](https://github.com/ClickHouse/ClickHouse/pull/24309) ([tavplubix](https://github.com/tavplubix)). +* Allow empty HTTP headers in client requests. Fixes [#23901](https://github.com/ClickHouse/ClickHouse/issues/23901). [#24285](https://github.com/ClickHouse/ClickHouse/pull/24285) ([Ivan](https://github.com/abyss7)). +* Set `max_threads = 1` to fix mutation fail of `Memory` tables. Closes [#24274](https://github.com/ClickHouse/ClickHouse/issues/24274). [#24275](https://github.com/ClickHouse/ClickHouse/pull/24275) ([flynn](https://github.com/ucasFL)). +* Fix typo in implementation of `Memory` tables, this bug was introduced at [#15127](https://github.com/ClickHouse/ClickHouse/issues/15127). Closes [#24192](https://github.com/ClickHouse/ClickHouse/issues/24192). [#24193](https://github.com/ClickHouse/ClickHouse/pull/24193) ([张中南](https://github.com/plugine)). +* Fix abnormal server termination due to `HDFS` becoming not accessible during query execution. Closes [#24117](https://github.com/ClickHouse/ClickHouse/issues/24117). [#24191](https://github.com/ClickHouse/ClickHouse/pull/24191) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash on updating of `Nested` column with const condition. [#24183](https://github.com/ClickHouse/ClickHouse/pull/24183) ([hexiaoting](https://github.com/hexiaoting)). +* Fix race condition which could happen in RBAC under a heavy load. This PR fixes [#24090](https://github.com/ClickHouse/ClickHouse/issues/24090), [#24134](https://github.com/ClickHouse/ClickHouse/issues/24134),. [#24176](https://github.com/ClickHouse/ClickHouse/pull/24176) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a rare bug that could lead to a partially initialized table that can serve write requests (insert/alter/so on). Now such tables will be in readonly mode. [#24122](https://github.com/ClickHouse/ClickHouse/pull/24122) ([alesapin](https://github.com/alesapin)). +* Fix an issue: `EXPLAIN PIPELINE` with `SELECT xxx FINAL` showed a wrong pipeline. ([hexiaoting](https://github.com/hexiaoting)). +* Fixed using const `DateTime` value vs `DateTime64` column in `WHERE`. [#24100](https://github.com/ClickHouse/ClickHouse/pull/24100) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix crash in merge JOIN, closes [#24010](https://github.com/ClickHouse/ClickHouse/issues/24010). [#24013](https://github.com/ClickHouse/ClickHouse/pull/24013) ([vdimir](https://github.com/vdimir)). +* Some `ALTER PARTITION` queries might cause `Part A intersects previous part B` and `Unexpected merged part C intersecting drop range D` errors in replication queue. It's fixed. Fixes [#23296](https://github.com/ClickHouse/ClickHouse/issues/23296). [#23997](https://github.com/ClickHouse/ClickHouse/pull/23997) ([tavplubix](https://github.com/tavplubix)). +* Fix SIGSEGV for external GROUP BY and overflow row (i.e. queries like `SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having'`). [#23962](https://github.com/ClickHouse/ClickHouse/pull/23962) ([Azat Khuzhin](https://github.com/azat)). +* Fix keys metrics accounting for `CACHE` dictionary with duplicates in the source (leads to `DictCacheKeysRequestedMiss` overflows). [#23929](https://github.com/ClickHouse/ClickHouse/pull/23929) ([Azat Khuzhin](https://github.com/azat)). +* Fix implementation of connection pool of `PostgreSQL` engine. Closes [#23897](https://github.com/ClickHouse/ClickHouse/issues/23897). [#23909](https://github.com/ClickHouse/ClickHouse/pull/23909) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `distributed_group_by_no_merge = 2` with `GROUP BY` and aggregate function wrapped into regular function (had been broken in [#23546](https://github.com/ClickHouse/ClickHouse/issues/23546)). Throw exception in case of someone trying to use `distributed_group_by_no_merge = 2` with window functions. Disable `optimize_distributed_group_by_sharding_key` for queries with window functions. [#23906](https://github.com/ClickHouse/ClickHouse/pull/23906) ([Azat Khuzhin](https://github.com/azat)). +* A fix for `s3` table function: better handling of HTTP errors. Response bodies of HTTP errors were being ignored earlier. [#23844](https://github.com/ClickHouse/ClickHouse/pull/23844) ([Vladimir Chebotarev](https://github.com/excitoon)). +* A fix for `s3` table function: better handling of URI's. Fixed an incompatibility with URLs containing `+` symbol, data with such keys could not be read previously. [#23822](https://github.com/ClickHouse/ClickHouse/pull/23822) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix error `Can't initialize pipeline with empty pipe` for queries with `GLOBAL IN/JOIN` and `use_hedged_requests`. Fixes [#23431](https://github.com/ClickHouse/ClickHouse/issues/23431). [#23805](https://github.com/ClickHouse/ClickHouse/pull/23805) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `CLEAR COLUMN` does not work when it is referenced by materialized view. Close [#23764](https://github.com/ClickHouse/ClickHouse/issues/23764). [#23781](https://github.com/ClickHouse/ClickHouse/pull/23781) ([flynn](https://github.com/ucasFL)). +* Fix heap use after free when reading from HDFS if `Values` format is used. [#23761](https://github.com/ClickHouse/ClickHouse/pull/23761) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid possible "Cannot schedule a task" error (in case some exception had been occurred) on INSERT into Distributed. [#23744](https://github.com/ClickHouse/ClickHouse/pull/23744) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a bug in recovery of staled `ReplicatedMergeTree` replica. Some metadata updates could be ignored by staled replica if `ALTER` query was executed during downtime of the replica. [#23742](https://github.com/ClickHouse/ClickHouse/pull/23742) ([tavplubix](https://github.com/tavplubix)). +* Fix a bug with `Join` and `WITH TOTALS`, close [#17718](https://github.com/ClickHouse/ClickHouse/issues/17718). [#23549](https://github.com/ClickHouse/ClickHouse/pull/23549) ([vdimir](https://github.com/vdimir)). +* Fix possible `Block structure mismatch` error for queries with `UNION` which could possibly happen after filter-pushdown optimization. Fixes [#23029](https://github.com/ClickHouse/ClickHouse/issues/23029). [#23359](https://github.com/ClickHouse/ClickHouse/pull/23359) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add type conversion when the setting `optimize_skip_unused_shards_rewrite_in` is enabled. This fixes MSan report. [#23219](https://github.com/ClickHouse/ClickHouse/pull/23219) ([Azat Khuzhin](https://github.com/azat)). +* Add a missing check when updating nested subcolumns, close issue: [#22353](https://github.com/ClickHouse/ClickHouse/issues/22353). [#22503](https://github.com/ClickHouse/ClickHouse/pull/22503) ([hexiaoting](https://github.com/hexiaoting)). + +#### Build/Testing/Packaging Improvement + +* Support building on Illumos. [#24144](https://github.com/ClickHouse/ClickHouse/pull/24144). Adds support for building on Solaris-derived operating systems. [#23746](https://github.com/ClickHouse/ClickHouse/pull/23746) ([bnaecker](https://github.com/bnaecker)). +* Add more benchmarks for hash tables, including the Swiss Table from Google (that appeared to be slower than ClickHouse hash map in our specific usage scenario). [#24111](https://github.com/ClickHouse/ClickHouse/pull/24111) ([Maksim Kita](https://github.com/kitaisreal)). +* Update librdkafka 1.6.0-RC3 to 1.6.1. [#23874](https://github.com/ClickHouse/ClickHouse/pull/23874) ([filimonov](https://github.com/filimonov)). +* Always enable `asynchronous-unwind-tables` explicitly. It may fix query profiler on AArch64. [#23602](https://github.com/ClickHouse/ClickHouse/pull/23602) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid possible build dependency on locale and filesystem order. This allows reproducible builds. [#23600](https://github.com/ClickHouse/ClickHouse/pull/23600) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove a source of nondeterminism from build. Now builds at different point of time will produce byte-identical binaries. Partially addressed [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#23559](https://github.com/ClickHouse/ClickHouse/pull/23559) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add simple tool for benchmarking (Zoo)Keeper. [#23038](https://github.com/ClickHouse/ClickHouse/pull/23038) ([alesapin](https://github.com/alesapin)). + + +## ClickHouse release 21.5, 2021-05-20 + +#### Backward Incompatible Change + +* Change comparison of integers and floating point numbers when integer is not exactly representable in the floating point data type. In new version comparison will return false as the rounding error will occur. Example: `9223372036854775808.0 != 9223372036854775808`, because the number `9223372036854775808` is not representable as floating point number exactly (and `9223372036854775808.0` is rounded to `9223372036854776000.0`). But in previous version the comparison will return as the numbers are equal, because if the floating point number `9223372036854776000.0` get converted back to UInt64, it will yield `9223372036854775808`. For the reference, the Python programming language also treats these numbers as equal. But this behaviour was dependend on CPU model (different results on AMD64 and AArch64 for some out-of-range numbers), so we make the comparison more precise. It will treat int and float numbers equal only if int is represented in floating point type exactly. [#22595](https://github.com/ClickHouse/ClickHouse/pull/22595) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove support for `argMin` and `argMax` for single `Tuple` argument. The code was not memory-safe. The feature was added by mistake and it is confusing for people. These functions can be reintroduced under different names later. This fixes [#22384](https://github.com/ClickHouse/ClickHouse/issues/22384) and reverts [#17359](https://github.com/ClickHouse/ClickHouse/issues/17359). [#23393](https://github.com/ClickHouse/ClickHouse/pull/23393) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Added functions `dictGetChildren(dictionary, key)`, `dictGetDescendants(dictionary, key, level)`. Function `dictGetChildren` return all children as an array if indexes. It is a inverse transformation for `dictGetHierarchy`. Function `dictGetDescendants` return all descendants as if `dictGetChildren` was applied `level` times recursively. Zero `level` value is equivalent to infinity. Improved performance of `dictGetHierarchy`, `dictIsIn` functions. Closes [#14656](https://github.com/ClickHouse/ClickHouse/issues/14656). [#22096](https://github.com/ClickHouse/ClickHouse/pull/22096) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dictGetOrNull`. It works like `dictGet`, but return `Null` in case key was not found in dictionary. Closes [#22375](https://github.com/ClickHouse/ClickHouse/issues/22375). [#22413](https://github.com/ClickHouse/ClickHouse/pull/22413) ([Maksim Kita](https://github.com/kitaisreal)). +* Added a table function `s3Cluster`, which allows to process files from `s3` in parallel on every node of a specified cluster. [#22012](https://github.com/ClickHouse/ClickHouse/pull/22012) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for replicas and shards in MySQL/PostgreSQL table engine / table function. You can write `SELECT * FROM mysql('host{1,2}-{1|2}', ...)`. Closes [#20969](https://github.com/ClickHouse/ClickHouse/issues/20969). [#22217](https://github.com/ClickHouse/ClickHouse/pull/22217) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `ALTER TABLE ... FETCH PART ...` query. It's similar to `FETCH PARTITION`, but fetches only one part. [#22706](https://github.com/ClickHouse/ClickHouse/pull/22706) ([turbo jason](https://github.com/songenjie)). +* Added a setting `max_distributed_depth` that limits the depth of recursive queries to `Distributed` tables. Closes [#20229](https://github.com/ClickHouse/ClickHouse/issues/20229). [#21942](https://github.com/ClickHouse/ClickHouse/pull/21942) ([flynn](https://github.com/ucasFL)). + +#### Performance Improvement + +* Improved performance of `intDiv` by dynamic dispatch for AVX2. This closes [#22314](https://github.com/ClickHouse/ClickHouse/issues/22314). [#23000](https://github.com/ClickHouse/ClickHouse/pull/23000) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance of reading from `ArrowStream` input format for sources other then local file (e.g. URL). [#22673](https://github.com/ClickHouse/ClickHouse/pull/22673) ([nvartolomei](https://github.com/nvartolomei)). +* Disabled compression by default when interacting with localhost (with clickhouse-client or server to server with distributed queries) via native protocol. It may improve performance of some import/export operations. This closes [#22234](https://github.com/ClickHouse/ClickHouse/issues/22234). [#22237](https://github.com/ClickHouse/ClickHouse/pull/22237) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Exclude values that does not belong to the shard from right part of IN section for distributed queries (under `optimize_skip_unused_shards_rewrite_in`, enabled by default, since it still requires `optimize_skip_unused_shards`). [#21511](https://github.com/ClickHouse/ClickHouse/pull/21511) ([Azat Khuzhin](https://github.com/azat)). +* Improved performance of reading a subset of columns with File-like table engine and column-oriented format like Parquet, Arrow or ORC. This closes [#issue:20129](https://github.com/ClickHouse/ClickHouse/issues/20129). [#21302](https://github.com/ClickHouse/ClickHouse/pull/21302) ([keenwolf](https://github.com/keen-wolf)). +* Allow to move more conditions to `PREWHERE` as it was before version 21.1 (adjustment of internal heuristics). Insufficient number of moved condtions could lead to worse performance. [#23397](https://github.com/ClickHouse/ClickHouse/pull/23397) ([Anton Popov](https://github.com/CurtizJ)). +* Improved performance of ODBC connections and fixed all the outstanding issues from the backlog. Using `nanodbc` library instead of `Poco::ODBC`. Closes [#9678](https://github.com/ClickHouse/ClickHouse/issues/9678). Add support for DateTime64 and Decimal* for ODBC table engine. Closes [#21961](https://github.com/ClickHouse/ClickHouse/issues/21961). Fixed issue with cyrillic text being truncated. Closes [#16246](https://github.com/ClickHouse/ClickHouse/issues/16246). Added connection pools for odbc bridge. [#21972](https://github.com/ClickHouse/ClickHouse/pull/21972) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement + +* Increase `max_uri_size` (the maximum size of URL in HTTP interface) to 1 MiB by default. This closes [#21197](https://github.com/ClickHouse/ClickHouse/issues/21197). [#22997](https://github.com/ClickHouse/ClickHouse/pull/22997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Set `background_fetches_pool_size` to `8` that is better for production usage with frequent small insertions or slow ZooKeeper cluster. [#22945](https://github.com/ClickHouse/ClickHouse/pull/22945) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* FlatDictionary added `initial_array_size`, `max_array_size` options. [#22521](https://github.com/ClickHouse/ClickHouse/pull/22521) ([Maksim Kita](https://github.com/kitaisreal)). +* Add new setting `non_replicated_deduplication_window` for non-replicated MergeTree inserts deduplication. [#22514](https://github.com/ClickHouse/ClickHouse/pull/22514) ([alesapin](https://github.com/alesapin)). +* Update paths to the `CatBoost` model configs in config reloading. [#22434](https://github.com/ClickHouse/ClickHouse/pull/22434) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `Decimal256` type support in dictionaries. `Decimal256` is experimental feature. Closes [#20979](https://github.com/ClickHouse/ClickHouse/issues/20979). [#22960](https://github.com/ClickHouse/ClickHouse/pull/22960) ([Maksim Kita](https://github.com/kitaisreal)). +* Enabled `async_socket_for_remote` by default (using less amount of OS threads for distributed queries). [#23683](https://github.com/ClickHouse/ClickHouse/pull/23683) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `quantile(s)TDigest`. Added special handling of singleton centroids according to tdunning/t-digest 3.2+. Also a bug with over-compression of centroids in implementation of earlier version of the algorithm was fixed. [#23314](https://github.com/ClickHouse/ClickHouse/pull/23314) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Make function name `unhex` case insensitive for compatibility with MySQL. [#23229](https://github.com/ClickHouse/ClickHouse/pull/23229) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement functions `arrayHasAny`, `arrayHasAll`, `has`, `indexOf`, `countEqual` for generic case when types of array elements are different. In previous versions the functions `arrayHasAny`, `arrayHasAll` returned false and `has`, `indexOf`, `countEqual` thrown exception. Also add support for `Decimal` and big integer types in functions `has` and similar. This closes [#20272](https://github.com/ClickHouse/ClickHouse/issues/20272). [#23044](https://github.com/ClickHouse/ClickHouse/pull/23044) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Raised the threshold on max number of matches in result of the function `extractAllGroupsHorizontal`. [#23036](https://github.com/ClickHouse/ClickHouse/pull/23036) ([Vasily Nemkov](https://github.com/Enmk)). +* Do not perform `optimize_skip_unused_shards` for cluster with one node. [#22999](https://github.com/ClickHouse/ClickHouse/pull/22999) ([Azat Khuzhin](https://github.com/azat)). +* Added ability to run clickhouse-keeper (experimental drop-in replacement to ZooKeeper) with SSL. Config settings `keeper_server.tcp_port_secure` can be used for secure interaction between client and keeper-server. `keeper_server.raft_configuration.secure` can be used to enable internal secure communication between nodes. [#22992](https://github.com/ClickHouse/ClickHouse/pull/22992) ([alesapin](https://github.com/alesapin)). +* Added ability to flush buffer only in background for `Buffer` tables. [#22986](https://github.com/ClickHouse/ClickHouse/pull/22986) ([Azat Khuzhin](https://github.com/azat)). +* When selecting from MergeTree table with NULL in WHERE condition, in rare cases, exception was thrown. This closes [#20019](https://github.com/ClickHouse/ClickHouse/issues/20019). [#22978](https://github.com/ClickHouse/ClickHouse/pull/22978) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error handling in Poco HTTP Client for AWS. [#22973](https://github.com/ClickHouse/ClickHouse/pull/22973) ([kreuzerkrieg](https://github.com/kreuzerkrieg)). +* Respect `max_part_removal_threads` for `ReplicatedMergeTree`. [#22971](https://github.com/ClickHouse/ClickHouse/pull/22971) ([Azat Khuzhin](https://github.com/azat)). +* Fix obscure corner case of MergeTree settings inactive_parts_to_throw_insert = 0 with inactive_parts_to_delay_insert > 0. [#22947](https://github.com/ClickHouse/ClickHouse/pull/22947) ([Azat Khuzhin](https://github.com/azat)). +* `dateDiff` now works with `DateTime64` arguments (even for values outside of `DateTime` range) [#22931](https://github.com/ClickHouse/ClickHouse/pull/22931) ([Vasily Nemkov](https://github.com/Enmk)). +* MaterializeMySQL (experimental feature): added an ability to replicate MySQL databases containing views without failing. This is accomplished by ignoring the views. [#22760](https://github.com/ClickHouse/ClickHouse/pull/22760) ([Christian](https://github.com/cfroystad)). +* Allow RBAC row policy via postgresql protocol. Closes [#22658](https://github.com/ClickHouse/ClickHouse/issues/22658). PostgreSQL protocol is enabled in configuration by default. [#22755](https://github.com/ClickHouse/ClickHouse/pull/22755) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add metric to track how much time is spend during waiting for Buffer layer lock. [#22725](https://github.com/ClickHouse/ClickHouse/pull/22725) ([Azat Khuzhin](https://github.com/azat)). +* Allow to use CTE in VIEW definition. This closes [#22491](https://github.com/ClickHouse/ClickHouse/issues/22491). [#22657](https://github.com/ClickHouse/ClickHouse/pull/22657) ([Amos Bird](https://github.com/amosbird)). +* Clear the rest of the screen and show cursor in `clickhouse-client` if previous program has left garbage in terminal. This closes [#16518](https://github.com/ClickHouse/ClickHouse/issues/16518). [#22634](https://github.com/ClickHouse/ClickHouse/pull/22634) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `round` function to behave consistently on non-x86_64 platforms. Rounding half to nearest even (Banker's rounding) is used. [#22582](https://github.com/ClickHouse/ClickHouse/pull/22582) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correctly check structure of blocks of data that are sending by Distributed tables. [#22325](https://github.com/ClickHouse/ClickHouse/pull/22325) ([Azat Khuzhin](https://github.com/azat)). +* Allow publishing Kafka errors to a virtual column of Kafka engine, controlled by the `kafka_handle_error_mode` setting. [#21850](https://github.com/ClickHouse/ClickHouse/pull/21850) ([fastio](https://github.com/fastio)). +* Add aliases `simpleJSONExtract/simpleJSONHas` to `visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}`. Fixes [#21383](https://github.com/ClickHouse/ClickHouse/issues/21383). [#21519](https://github.com/ClickHouse/ClickHouse/pull/21519) ([fastio](https://github.com/fastio)). +* Add `clickhouse-library-bridge` for library dictionary source. Closes [#9502](https://github.com/ClickHouse/ClickHouse/issues/9502). [#21509](https://github.com/ClickHouse/ClickHouse/pull/21509) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Forbid to drop a column if it's referenced by materialized view. Closes [#21164](https://github.com/ClickHouse/ClickHouse/issues/21164). [#21303](https://github.com/ClickHouse/ClickHouse/pull/21303) ([flynn](https://github.com/ucasFL)). +* Support dynamic interserver credentials (rotating credentials without downtime). [#14113](https://github.com/ClickHouse/ClickHouse/pull/14113) ([johnskopis](https://github.com/johnskopis)). +* Add support for Kafka storage with `Arrow` and `ArrowStream` format messages. [#23415](https://github.com/ClickHouse/ClickHouse/pull/23415) ([Chao Ma](https://github.com/godliness)). +* Fixed missing semicolon in exception message. The user may find this exception message unpleasant to read. [#23208](https://github.com/ClickHouse/ClickHouse/pull/23208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed missing whitespace in some exception messages about `LowCardinality` type. [#23207](https://github.com/ClickHouse/ClickHouse/pull/23207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Some values were formatted with alignment in center in table cells in `Markdown` format. Not anymore. [#23096](https://github.com/ClickHouse/ClickHouse/pull/23096) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove non-essential details from suggestions in clickhouse-client. This closes [#22158](https://github.com/ClickHouse/ClickHouse/issues/22158). [#23040](https://github.com/ClickHouse/ClickHouse/pull/23040) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correct calculation of `bytes_allocated` field in system.dictionaries for sparse_hashed dictionaries. [#22867](https://github.com/ClickHouse/ClickHouse/pull/22867) ([Azat Khuzhin](https://github.com/azat)). +* Fixed approximate total rows accounting for reverse reading from MergeTree. [#22726](https://github.com/ClickHouse/ClickHouse/pull/22726) ([Azat Khuzhin](https://github.com/azat)). +* Fix the case when it was possible to configure dictionary with clickhouse source that was looking to itself that leads to infinite loop. Closes [#14314](https://github.com/ClickHouse/ClickHouse/issues/14314). [#22479](https://github.com/ClickHouse/ClickHouse/pull/22479) ([Maksim Kita](https://github.com/kitaisreal)). + +#### Bug Fix + +* Multiple fixes for hedged requests. Fixed an error `Can't initialize pipeline with empty pipe` for queries with `GLOBAL IN/JOIN` when the setting `use_hedged_requests` is enabled. Fixes [#23431](https://github.com/ClickHouse/ClickHouse/issues/23431). [#23805](https://github.com/ClickHouse/ClickHouse/pull/23805) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). Fixed a race condition in hedged connections which leads to crash. This fixes [#22161](https://github.com/ClickHouse/ClickHouse/issues/22161). [#22443](https://github.com/ClickHouse/ClickHouse/pull/22443) ([Kruglov Pavel](https://github.com/Avogar)). Fix possible crash in case if `unknown packet` was received from remote query (with `async_socket_for_remote` enabled). Fixes [#21167](https://github.com/ClickHouse/ClickHouse/issues/21167). [#23309](https://github.com/ClickHouse/ClickHouse/pull/23309) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the behavior when disabling `input_format_with_names_use_header ` setting discards all the input with CSVWithNames format. This fixes [#22406](https://github.com/ClickHouse/ClickHouse/issues/22406). [#23202](https://github.com/ClickHouse/ClickHouse/pull/23202) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed remote JDBC bridge timeout connection issue. Closes [#9609](https://github.com/ClickHouse/ClickHouse/issues/9609). [#23771](https://github.com/ClickHouse/ClickHouse/pull/23771) ([Maksim Kita](https://github.com/kitaisreal), [alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the logic of initial load of `complex_key_hashed` if `update_field` is specified. Closes [#23800](https://github.com/ClickHouse/ClickHouse/issues/23800). [#23824](https://github.com/ClickHouse/ClickHouse/pull/23824) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed crash when `PREWHERE` and row policy filter are both in effect with empty result. [#23763](https://github.com/ClickHouse/ClickHouse/pull/23763) ([Amos Bird](https://github.com/amosbird)). +* Avoid possible "Cannot schedule a task" error (in case some exception had been occurred) on INSERT into Distributed. [#23744](https://github.com/ClickHouse/ClickHouse/pull/23744) ([Azat Khuzhin](https://github.com/azat)). +* Added an exception in case of completely the same values in both samples in aggregate function `mannWhitneyUTest`. This fixes [#23646](https://github.com/ClickHouse/ClickHouse/issues/23646). [#23654](https://github.com/ClickHouse/ClickHouse/pull/23654) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed server fault when inserting data through HTTP caused an exception. This fixes [#23512](https://github.com/ClickHouse/ClickHouse/issues/23512). [#23643](https://github.com/ClickHouse/ClickHouse/pull/23643) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed misinterpretation of some `LIKE` expressions with escape sequences. [#23610](https://github.com/ClickHouse/ClickHouse/pull/23610) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed restart / stop command hanging. Closes [#20214](https://github.com/ClickHouse/ClickHouse/issues/20214). [#23552](https://github.com/ClickHouse/ClickHouse/pull/23552) ([filimonov](https://github.com/filimonov)). +* Fixed `COLUMNS` matcher in case of multiple JOINs in select query. Closes [#22736](https://github.com/ClickHouse/ClickHouse/issues/22736). [#23501](https://github.com/ClickHouse/ClickHouse/pull/23501) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed a crash when modifying column's default value when a column itself is used as `ReplacingMergeTree`'s parameter. [#23483](https://github.com/ClickHouse/ClickHouse/pull/23483) ([hexiaoting](https://github.com/hexiaoting)). +* Fixed corner cases in vertical merges with `ReplacingMergeTree`. In rare cases they could lead to fails of merges with exceptions like `Incomplete granules are not allowed while blocks are granules size`. [#23459](https://github.com/ClickHouse/ClickHouse/pull/23459) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug that does not allow cast from empty array literal, to array with dimensions greater than 1, e.g. `CAST([] AS Array(Array(String)))`. Closes [#14476](https://github.com/ClickHouse/ClickHouse/issues/14476). [#23456](https://github.com/ClickHouse/ClickHouse/pull/23456) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed a bug when `deltaSum` aggregate function produced incorrect result after resetting the counter. [#23437](https://github.com/ClickHouse/ClickHouse/pull/23437) ([Russ Frank](https://github.com/rf)). +* Fixed `Cannot unlink file` error on unsuccessful creation of ReplicatedMergeTree table with multidisk configuration. This closes [#21755](https://github.com/ClickHouse/ClickHouse/issues/21755). [#23433](https://github.com/ClickHouse/ClickHouse/pull/23433) ([tavplubix](https://github.com/tavplubix)). +* Fixed incompatible constant expression generation during partition pruning based on virtual columns. This fixes https://github.com/ClickHouse/ClickHouse/pull/21401#discussion_r611888913. [#23366](https://github.com/ClickHouse/ClickHouse/pull/23366) ([Amos Bird](https://github.com/amosbird)). +* Fixed a crash when setting join_algorithm is set to 'auto' and Join is performed with a Dictionary. Close [#23002](https://github.com/ClickHouse/ClickHouse/issues/23002). [#23312](https://github.com/ClickHouse/ClickHouse/pull/23312) ([Vladimir](https://github.com/vdimir)). +* Don't relax NOT conditions during partition pruning. This fixes [#23305](https://github.com/ClickHouse/ClickHouse/issues/23305) and [#21539](https://github.com/ClickHouse/ClickHouse/issues/21539). [#23310](https://github.com/ClickHouse/ClickHouse/pull/23310) ([Amos Bird](https://github.com/amosbird)). +* Fixed very rare race condition on background cleanup of old blocks. It might cause a block not to be deduplicated if it's too close to the end of deduplication window. [#23301](https://github.com/ClickHouse/ClickHouse/pull/23301) ([tavplubix](https://github.com/tavplubix)). +* Fixed very rare (distributed) race condition between creation and removal of ReplicatedMergeTree tables. It might cause exceptions like `node doesn't exist` on attempt to create replicated table. Fixes [#21419](https://github.com/ClickHouse/ClickHouse/issues/21419). [#23294](https://github.com/ClickHouse/ClickHouse/pull/23294) ([tavplubix](https://github.com/tavplubix)). +* Fixed simple key dictionary from DDL creation if primary key is not first attribute. Fixes [#23236](https://github.com/ClickHouse/ClickHouse/issues/23236). [#23262](https://github.com/ClickHouse/ClickHouse/pull/23262) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed reading from ODBC when there are many long column names in a table. Closes [#8853](https://github.com/ClickHouse/ClickHouse/issues/8853). [#23215](https://github.com/ClickHouse/ClickHouse/pull/23215) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializeMySQL (experimental feature): fixed `Not found column` error when selecting from `MaterializeMySQL` with condition on key column. Fixes [#22432](https://github.com/ClickHouse/ClickHouse/issues/22432). [#23200](https://github.com/ClickHouse/ClickHouse/pull/23200) ([tavplubix](https://github.com/tavplubix)). +* Correct aliases handling if subquery was optimized to constant. Fixes [#22924](https://github.com/ClickHouse/ClickHouse/issues/22924). Fixes [#10401](https://github.com/ClickHouse/ClickHouse/issues/10401). [#23191](https://github.com/ClickHouse/ClickHouse/pull/23191) ([Maksim Kita](https://github.com/kitaisreal)). +* Server might fail to start if `data_type_default_nullable` setting is enabled in default profile, it's fixed. Fixes [#22573](https://github.com/ClickHouse/ClickHouse/issues/22573). [#23185](https://github.com/ClickHouse/ClickHouse/pull/23185) ([tavplubix](https://github.com/tavplubix)). +* Fixed a crash on shutdown which happened because of wrong accounting of current connections. [#23154](https://github.com/ClickHouse/ClickHouse/pull/23154) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `Table .inner_id... doesn't exist` error when selecting from Materialized View after detaching it from Atomic database and attaching back. [#23047](https://github.com/ClickHouse/ClickHouse/pull/23047) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot find column in ActionsDAG result` which may happen if subquery uses `untuple`. Fixes [#22290](https://github.com/ClickHouse/ClickHouse/issues/22290). [#22991](https://github.com/ClickHouse/ClickHouse/pull/22991) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix usage of constant columns of type `Map` with nullable values. [#22939](https://github.com/ClickHouse/ClickHouse/pull/22939) ([Anton Popov](https://github.com/CurtizJ)). +* fixed `formatDateTime()` on `DateTime64` and "%C" format specifier fixed `toDateTime64()` for large values and non-zero scale. [#22937](https://github.com/ClickHouse/ClickHouse/pull/22937) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed a crash when using `mannWhitneyUTest` and `rankCorr` with window functions. This fixes [#22728](https://github.com/ClickHouse/ClickHouse/issues/22728). [#22876](https://github.com/ClickHouse/ClickHouse/pull/22876) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* LIVE VIEW (experimental feature): fixed possible hanging in concurrent DROP/CREATE of TEMPORARY LIVE VIEW in `TemporaryLiveViewCleaner`, [see](https://gist.github.com/vzakaznikov/0c03195960fc86b56bfe2bc73a90019e). [#22858](https://github.com/ClickHouse/ClickHouse/pull/22858) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed pushdown of `HAVING` in case, when filter column is used in aggregation. [#22763](https://github.com/ClickHouse/ClickHouse/pull/22763) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed possible hangs in Zookeeper requests in case of OOM exception. Fixes [#22438](https://github.com/ClickHouse/ClickHouse/issues/22438). [#22684](https://github.com/ClickHouse/ClickHouse/pull/22684) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed wait for mutations on several replicas for ReplicatedMergeTree table engines. Previously, mutation/alter query may finish before mutation actually executed on other replicas. [#22669](https://github.com/ClickHouse/ClickHouse/pull/22669) ([alesapin](https://github.com/alesapin)). +* Fixed exception for Log with nested types without columns in the SELECT clause. [#22654](https://github.com/ClickHouse/ClickHouse/pull/22654) ([Azat Khuzhin](https://github.com/azat)). +* Fix unlimited wait for auxiliary AWS requests. [#22594](https://github.com/ClickHouse/ClickHouse/pull/22594) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed a crash when client closes connection very early [#22579](https://github.com/ClickHouse/ClickHouse/issues/22579). [#22591](https://github.com/ClickHouse/ClickHouse/pull/22591) ([nvartolomei](https://github.com/nvartolomei)). +* `Map` data type (experimental feature): fixed an incorrect formatting of function `map` in distributed queries. [#22588](https://github.com/ClickHouse/ClickHouse/pull/22588) ([foolchi](https://github.com/foolchi)). +* Fixed deserialization of empty string without newline at end of TSV format. This closes [#20244](https://github.com/ClickHouse/ClickHouse/issues/20244). Possible workaround without version update: set `input_format_null_as_default` to zero. It was zero in old versions. [#22527](https://github.com/ClickHouse/ClickHouse/pull/22527) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong cast of a column of `LowCardinality` type in Merge Join algorithm. Close [#22386](https://github.com/ClickHouse/ClickHouse/issues/22386), close [#22388](https://github.com/ClickHouse/ClickHouse/issues/22388). [#22510](https://github.com/ClickHouse/ClickHouse/pull/22510) ([Vladimir](https://github.com/vdimir)). +* Buffer overflow (on read) was possible in `tokenbf_v1` full text index. The excessive bytes are not used but the read operation may lead to crash in rare cases. This closes [#19233](https://github.com/ClickHouse/ClickHouse/issues/19233). [#22421](https://github.com/ClickHouse/ClickHouse/pull/22421) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not limit HTTP chunk size. Fixes [#21907](https://github.com/ClickHouse/ClickHouse/issues/21907). [#22322](https://github.com/ClickHouse/ClickHouse/pull/22322) ([Ivan](https://github.com/abyss7)). +* Fixed a bug, which leads to underaggregation of data in case of enabled `optimize_aggregation_in_order` and many parts in table. Slightly improve performance of aggregation with enabled `optimize_aggregation_in_order`. [#21889](https://github.com/ClickHouse/ClickHouse/pull/21889) ([Anton Popov](https://github.com/CurtizJ)). +* Check if table function view is used as a column. This complements #20350. [#21465](https://github.com/ClickHouse/ClickHouse/pull/21465) ([Amos Bird](https://github.com/amosbird)). +* Fix "unknown column" error for tables with `Merge` engine in queris with `JOIN` and aggregation. Closes [#18368](https://github.com/ClickHouse/ClickHouse/issues/18368), close [#22226](https://github.com/ClickHouse/ClickHouse/issues/22226). [#21370](https://github.com/ClickHouse/ClickHouse/pull/21370) ([Vladimir](https://github.com/vdimir)). +* Fixed name clashes in pushdown optimization. It caused incorrect `WHERE` filtration after FULL JOIN. Close [#20497](https://github.com/ClickHouse/ClickHouse/issues/20497). [#20622](https://github.com/ClickHouse/ClickHouse/pull/20622) ([Vladimir](https://github.com/vdimir)). +* Fixed very rare bug when quorum insert with `quorum_parallel=1` is not really "quorum" because of deduplication. [#18215](https://github.com/ClickHouse/ClickHouse/pull/18215) ([filimonov](https://github.com/filimonov) - reported, [alesapin](https://github.com/alesapin) - fixed). + +#### Build/Testing/Packaging Improvement + +* Run stateless tests in parallel in CI. [#22300](https://github.com/ClickHouse/ClickHouse/pull/22300) ([alesapin](https://github.com/alesapin)). +* Simplify debian packages. This fixes [#21698](https://github.com/ClickHouse/ClickHouse/issues/21698). [#22976](https://github.com/ClickHouse/ClickHouse/pull/22976) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for ClickHouse build on Apple M1. [#21639](https://github.com/ClickHouse/ClickHouse/pull/21639) ([changvvb](https://github.com/changvvb)). +* Fixed ClickHouse Keeper build for macOS. [#22860](https://github.com/ClickHouse/ClickHouse/pull/22860) ([alesapin](https://github.com/alesapin)). +* Fixed some tests on AArch64 platform. [#22596](https://github.com/ClickHouse/ClickHouse/pull/22596) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added function alignment for possibly better performance. [#21431](https://github.com/ClickHouse/ClickHouse/pull/21431) ([Danila Kutenin](https://github.com/danlark1)). +* Adjust some tests to output identical results on amd64 and aarch64 (qemu). The result was depending on implementation specific CPU behaviour. [#22590](https://github.com/ClickHouse/ClickHouse/pull/22590) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow query profiling only on x86_64. See [#15174](https://github.com/ClickHouse/ClickHouse/issues/15174#issuecomment-812954965) and [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638#issuecomment-703805337). This closes [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638). [#22580](https://github.com/ClickHouse/ClickHouse/pull/22580) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow building with unbundled xz (lzma) using `USE_INTERNAL_XZ_LIBRARY=OFF` CMake option. [#22571](https://github.com/ClickHouse/ClickHouse/pull/22571) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Enable bundled `openldap` on `ppc64le` [#22487](https://github.com/ClickHouse/ClickHouse/pull/22487) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Disable incompatible libraries (platform specific typically) on `ppc64le` [#22475](https://github.com/ClickHouse/ClickHouse/pull/22475) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Add Jepsen test in CI for clickhouse Keeper. [#22373](https://github.com/ClickHouse/ClickHouse/pull/22373) ([alesapin](https://github.com/alesapin)). +* Build `jemalloc` with support for [heap profiling](https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Heap-Profiling). [#22834](https://github.com/ClickHouse/ClickHouse/pull/22834) ([nvartolomei](https://github.com/nvartolomei)). +* Avoid UB in `*Log` engines for rwlock unlock due to unlock from another thread. [#22583](https://github.com/ClickHouse/ClickHouse/pull/22583) ([Azat Khuzhin](https://github.com/azat)). +* Fixed UB by unlocking the rwlock of the TinyLog from the same thread. [#22560](https://github.com/ClickHouse/ClickHouse/pull/22560) ([Azat Khuzhin](https://github.com/azat)). + + +## ClickHouse release 21.4 + +### ClickHouse release 21.4.1 2021-04-12 + +#### Backward Incompatible Change + +* The `toStartOfIntervalFunction` will align hour intervals to the midnight (in previous versions they were aligned to the start of unix epoch). For example, `toStartOfInterval(x, INTERVAL 11 HOUR)` will split every day into three intervals: `00:00:00..10:59:59`, `11:00:00..21:59:59` and `22:00:00..23:59:59`. This behaviour is more suited for practical needs. This closes [#9510](https://github.com/ClickHouse/ClickHouse/issues/9510). [#22060](https://github.com/ClickHouse/ClickHouse/pull/22060) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `Age` and `Precision` in graphite rollup configs should increase from retention to retention. Now it's checked and the wrong config raises an exception. [#21496](https://github.com/ClickHouse/ClickHouse/pull/21496) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix `cutToFirstSignificantSubdomainCustom()`/`firstSignificantSubdomainCustom()` returning wrong result for 3+ level domains present in custom top-level domain list. For input domains matching these custom top-level domains, the third-level domain was considered to be the first significant one. This is now fixed. This change may introduce incompatibility if the function is used in e.g. the sharding key. [#21946](https://github.com/ClickHouse/ClickHouse/pull/21946) ([Azat Khuzhin](https://github.com/azat)). +* Column `keys` in table `system.dictionaries` was replaced to columns `key.names` and `key.types`. Columns `key.names`, `key.types`, `attribute.names`, `attribute.types` from `system.dictionaries` table does not require dictionary to be loaded. [#21884](https://github.com/ClickHouse/ClickHouse/pull/21884) ([Maksim Kita](https://github.com/kitaisreal)). +* Now replicas that are processing the `ALTER TABLE ATTACH PART[ITION]` command search in their `detached/` folders before fetching the data from other replicas. As an implementation detail, a new command `ATTACH_PART` is introduced in the replicated log. Parts are searched and compared by their checksums. [#18978](https://github.com/ClickHouse/ClickHouse/pull/18978) ([Mike Kot](https://github.com/myrrc)). **Note**: + * `ATTACH PART[ITION]` queries may not work during cluster upgrade. + * It's not possible to rollback to older ClickHouse version after executing `ALTER ... ATTACH` query in new version as the old servers would fail to pass the `ATTACH_PART` entry in the replicated log. +* In this version, empty `` will block all access to remote hosts while in previous versions it did nothing. If you want to keep old behaviour and you have empty `remote_url_allow_hosts` element in configuration file, remove it. [#20058](https://github.com/ClickHouse/ClickHouse/pull/20058) ([Vladimir Chebotarev](https://github.com/excitoon)). + + +#### New Feature + +* Extended range of `DateTime64` to support dates from year 1925 to 2283. Improved support of `DateTime` around zero date (`1970-01-01`). [#9404](https://github.com/ClickHouse/ClickHouse/pull/9404) ([alexey-milovidov](https://github.com/alexey-milovidov), [Vasily Nemkov](https://github.com/Enmk)). Not every time and date functions are working for extended range of dates. +* Added support of Kerberos authentication for preconfigured users and HTTP requests (GSS-SPNEGO). [#14995](https://github.com/ClickHouse/ClickHouse/pull/14995) ([Denis Glazachev](https://github.com/traceon)). +* Add `prefer_column_name_to_alias` setting to use original column names instead of aliases. it is needed to be more compatible with common databases' aliasing rules. This is for [#9715](https://github.com/ClickHouse/ClickHouse/issues/9715) and [#9887](https://github.com/ClickHouse/ClickHouse/issues/9887). [#22044](https://github.com/ClickHouse/ClickHouse/pull/22044) ([Amos Bird](https://github.com/amosbird)). +* Added functions `dictGetChildren(dictionary, key)`, `dictGetDescendants(dictionary, key, level)`. Function `dictGetChildren` return all children as an array if indexes. It is a inverse transformation for `dictGetHierarchy`. Function `dictGetDescendants` return all descendants as if `dictGetChildren` was applied `level` times recursively. Zero `level` value is equivalent to infinity. Closes [#14656](https://github.com/ClickHouse/ClickHouse/issues/14656). [#22096](https://github.com/ClickHouse/ClickHouse/pull/22096) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `executable_pool` dictionary source. Close [#14528](https://github.com/ClickHouse/ClickHouse/issues/14528). [#21321](https://github.com/ClickHouse/ClickHouse/pull/21321) ([Maksim Kita](https://github.com/kitaisreal)). +* Added table function `dictionary`. It works the same way as `Dictionary` engine. Closes [#21560](https://github.com/ClickHouse/ClickHouse/issues/21560). [#21910](https://github.com/ClickHouse/ClickHouse/pull/21910) ([Maksim Kita](https://github.com/kitaisreal)). +* Support `Nullable` type for `PolygonDictionary` attribute. [#21890](https://github.com/ClickHouse/ClickHouse/pull/21890) ([Maksim Kita](https://github.com/kitaisreal)). +* Functions `dictGet`, `dictHas` use current database name if it is not specified for dictionaries created with DDL. Closes [#21632](https://github.com/ClickHouse/ClickHouse/issues/21632). [#21859](https://github.com/ClickHouse/ClickHouse/pull/21859) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dictGetOrNull`. It works like `dictGet`, but return `Null` in case key was not found in dictionary. Closes [#22375](https://github.com/ClickHouse/ClickHouse/issues/22375). [#22413](https://github.com/ClickHouse/ClickHouse/pull/22413) ([Maksim Kita](https://github.com/kitaisreal)). +* Added async update in `ComplexKeyCache`, `SSDCache`, `SSDComplexKeyCache` dictionaries. Added support for `Nullable` type in `Cache`, `ComplexKeyCache`, `SSDCache`, `SSDComplexKeyCache` dictionaries. Added support for multiple attributes fetch with `dictGet`, `dictGetOrDefault` functions. Fixes [#21517](https://github.com/ClickHouse/ClickHouse/issues/21517). [#20595](https://github.com/ClickHouse/ClickHouse/pull/20595) ([Maksim Kita](https://github.com/kitaisreal)). +* Support `dictHas` function for `RangeHashedDictionary`. Fixes [#6680](https://github.com/ClickHouse/ClickHouse/issues/6680). [#19816](https://github.com/ClickHouse/ClickHouse/pull/19816) ([Maksim Kita](https://github.com/kitaisreal)). +* Add function `timezoneOf` that returns the timezone name of `DateTime` or `DateTime64` data types. This does not close [#9959](https://github.com/ClickHouse/ClickHouse/issues/9959). Fix inconsistencies in function names: add aliases `timezone` and `timeZone` as well as `toTimezone` and `toTimeZone` and `timezoneOf` and `timeZoneOf`. [#22001](https://github.com/ClickHouse/ClickHouse/pull/22001) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new optional clause `GRANTEES` for `CREATE/ALTER USER` commands. It specifies users or roles which are allowed to receive grants from this user on condition this user has also all required access granted with grant option. By default `GRANTEES ANY` is used which means a user with grant option can grant to anyone. Syntax: `CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]`. [#21641](https://github.com/ClickHouse/ClickHouse/pull/21641) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add new column `slowdowns_count` to `system.clusters`. When using hedged requests, it shows how many times we switched to another replica because this replica was responding slowly. Also show actual value of `errors_count` in `system.clusters`. [#21480](https://github.com/ClickHouse/ClickHouse/pull/21480) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `_partition_id` virtual column for `MergeTree*` engines. Allow to prune partitions by `_partition_id`. Add `partitionID()` function to calculate partition id string. [#21401](https://github.com/ClickHouse/ClickHouse/pull/21401) ([Amos Bird](https://github.com/amosbird)). +* Add function `isIPAddressInRange` to test if an IPv4 or IPv6 address is contained in a given CIDR network prefix. [#21329](https://github.com/ClickHouse/ClickHouse/pull/21329) ([PHO](https://github.com/depressed-pho)). +* Added new SQL command `ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'`. This command is needed to properly remove 'freezed' partitions from all disks. [#21142](https://github.com/ClickHouse/ClickHouse/pull/21142) ([Pavel Kovalenko](https://github.com/Jokser)). +* Supports implicit key type conversion for JOIN. [#19885](https://github.com/ClickHouse/ClickHouse/pull/19885) ([Vladimir](https://github.com/vdimir)). + +#### Experimental Feature + +* Support `RANGE OFFSET` frame (for window functions) for floating point types. Implement `lagInFrame`/`leadInFrame` window functions, which are analogous to `lag`/`lead`, but respect the window frame. They are identical when the frame is `between unbounded preceding and unbounded following`. This closes [#5485](https://github.com/ClickHouse/ClickHouse/issues/5485). [#21895](https://github.com/ClickHouse/ClickHouse/pull/21895) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Zero-copy replication for `ReplicatedMergeTree` over S3 storage. [#16240](https://github.com/ClickHouse/ClickHouse/pull/16240) ([ianton-ru](https://github.com/ianton-ru)). +* Added possibility to migrate existing S3 disk to the schema with backup-restore capabilities. [#22070](https://github.com/ClickHouse/ClickHouse/pull/22070) ([Pavel Kovalenko](https://github.com/Jokser)). + +#### Performance Improvement + +* Supported parallel formatting in `clickhouse-local` and everywhere else. [#21630](https://github.com/ClickHouse/ClickHouse/pull/21630) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support parallel parsing for `CSVWithNames` and `TSVWithNames` formats. This closes [#21085](https://github.com/ClickHouse/ClickHouse/issues/21085). [#21149](https://github.com/ClickHouse/ClickHouse/pull/21149) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Enable read with mmap IO for file ranges from 64 MiB (the settings `min_bytes_to_use_mmap_io`). It may lead to moderate performance improvement. [#22326](https://github.com/ClickHouse/ClickHouse/pull/22326) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add cache for files read with `min_bytes_to_use_mmap_io` setting. It makes significant (2x and more) performance improvement when the value of the setting is small by avoiding frequent mmap/munmap calls and the consequent page faults. Note that mmap IO has major drawbacks that makes it less reliable in production (e.g. hung or SIGBUS on faulty disks; less controllable memory usage). Nevertheless it is good in benchmarks. [#22206](https://github.com/ClickHouse/ClickHouse/pull/22206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary data copy when using codec `NONE`. Please note that codec `NONE` is mostly useless - it's recommended to always use compression (`LZ4` is by default). Despite the common belief, disabling compression may not improve performance (the opposite effect is possible). The `NONE` codec is useful in some cases: - when data is uncompressable; - for synthetic benchmarks. [#22145](https://github.com/ClickHouse/ClickHouse/pull/22145) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Faster `GROUP BY` with small `max_rows_to_group_by` and `group_by_overflow_mode='any'`. [#21856](https://github.com/ClickHouse/ClickHouse/pull/21856) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Optimize performance of queries like `SELECT ... FINAL ... WHERE`. Now in queries with `FINAL` it's allowed to move to `PREWHERE` columns, which are in sorting key. [#21830](https://github.com/ClickHouse/ClickHouse/pull/21830) ([foolchi](https://github.com/foolchi)). +* Improved performance by replacing `memcpy` to another implementation. This closes [#18583](https://github.com/ClickHouse/ClickHouse/issues/18583). [#21520](https://github.com/ClickHouse/ClickHouse/pull/21520) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregation in order of sorting key (with enabled setting `optimize_aggregation_in_order`). [#19401](https://github.com/ClickHouse/ClickHouse/pull/19401) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvement + +* Add connection pool for PostgreSQL table/database engine and dictionary source. Should fix [#21444](https://github.com/ClickHouse/ClickHouse/issues/21444). [#21839](https://github.com/ClickHouse/ClickHouse/pull/21839) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support non-default table schema for postgres storage/table-function. Closes [#21701](https://github.com/ClickHouse/ClickHouse/issues/21701). [#21711](https://github.com/ClickHouse/ClickHouse/pull/21711) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support replicas priority for postgres dictionary source. [#21710](https://github.com/ClickHouse/ClickHouse/pull/21710) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Introduce a new merge tree setting `min_bytes_to_rebalance_partition_over_jbod` which allows assigning new parts to different disks of a JBOD volume in a balanced way. [#16481](https://github.com/ClickHouse/ClickHouse/pull/16481) ([Amos Bird](https://github.com/amosbird)). +* Added `Grant`, `Revoke` and `System` values of `query_kind` column for corresponding queries in `system.query_log`. [#21102](https://github.com/ClickHouse/ClickHouse/pull/21102) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow customizing timeouts for HTTP connections used for replication independently from other HTTP timeouts. [#20088](https://github.com/ClickHouse/ClickHouse/pull/20088) ([nvartolomei](https://github.com/nvartolomei)). +* Better exception message in client in case of exception while server is writing blocks. In previous versions client may get misleading message like `Data compressed with different methods`. [#22427](https://github.com/ClickHouse/ClickHouse/pull/22427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Directory tmp_fetch_XXX already exists` which could happen after failed fetch part. Delete temporary fetch directory if it already exists. Fixes [#14197](https://github.com/ClickHouse/ClickHouse/issues/14197). [#22411](https://github.com/ClickHouse/ClickHouse/pull/22411) ([nvartolomei](https://github.com/nvartolomei)). +* Fix MSan report for function `range` with `UInt256` argument (support for large integers is experimental). This closes [#22157](https://github.com/ClickHouse/ClickHouse/issues/22157). [#22387](https://github.com/ClickHouse/ClickHouse/pull/22387) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `current_database` column to `system.processes` table. It contains the current database of the query. [#22365](https://github.com/ClickHouse/ClickHouse/pull/22365) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add case-insensitive history search/navigation and subword movement features to `clickhouse-client`. [#22105](https://github.com/ClickHouse/ClickHouse/pull/22105) ([Amos Bird](https://github.com/amosbird)). +* If tuple of NULLs, e.g. `(NULL, NULL)` is on the left hand side of `IN` operator with tuples of non-NULLs on the right hand side, e.g. `SELECT (NULL, NULL) IN ((0, 0), (3, 1))` return 0 instead of throwing an exception about incompatible types. The expression may also appear due to optimization of something like `SELECT (NULL, NULL) = (8, 0) OR (NULL, NULL) = (3, 2) OR (NULL, NULL) = (0, 0) OR (NULL, NULL) = (3, 1)`. This closes [#22017](https://github.com/ClickHouse/ClickHouse/issues/22017). [#22063](https://github.com/ClickHouse/ClickHouse/pull/22063) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update used version of simdjson to 0.9.1. This fixes [#21984](https://github.com/ClickHouse/ClickHouse/issues/21984). [#22057](https://github.com/ClickHouse/ClickHouse/pull/22057) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added case insensitive aliases for `CONNECTION_ID()` and `VERSION()` functions. This fixes [#22028](https://github.com/ClickHouse/ClickHouse/issues/22028). [#22042](https://github.com/ClickHouse/ClickHouse/pull/22042) ([Eugene Klimov](https://github.com/Slach)). +* Add option `strict_increase` to `windowFunnel` function to calculate each event once (resolve [#21835](https://github.com/ClickHouse/ClickHouse/issues/21835)). [#22025](https://github.com/ClickHouse/ClickHouse/pull/22025) ([Vladimir](https://github.com/vdimir)). +* If partition key of a `MergeTree` table does not include `Date` or `DateTime` columns but includes exactly one `DateTime64` column, expose its values in the `min_time` and `max_time` columns in `system.parts` and `system.parts_columns` tables. Add `min_time` and `max_time` columns to `system.parts_columns` table (these was inconsistency to the `system.parts` table). This closes [#18244](https://github.com/ClickHouse/ClickHouse/issues/18244). [#22011](https://github.com/ClickHouse/ClickHouse/pull/22011) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Supported `replication_alter_partitions_sync=1` setting in `clickhouse-copier` for moving partitions from helping table to destination. Decreased default timeouts. Fixes [#21911](https://github.com/ClickHouse/ClickHouse/issues/21911). [#21912](https://github.com/ClickHouse/ClickHouse/pull/21912) ([turbo jason](https://github.com/songenjie)). +* Show path to data directory of `EmbeddedRocksDB` tables in system tables. [#21903](https://github.com/ClickHouse/ClickHouse/pull/21903) ([tavplubix](https://github.com/tavplubix)). +* Add profile event `HedgedRequestsChangeReplica`, change read data timeout from sec to ms. [#21886](https://github.com/ClickHouse/ClickHouse/pull/21886) ([Kruglov Pavel](https://github.com/Avogar)). +* DiskS3 (experimental feature under development). Fixed bug with the impossibility to move directory if the destination is not empty and cache disk is used. [#21837](https://github.com/ClickHouse/ClickHouse/pull/21837) ([Pavel Kovalenko](https://github.com/Jokser)). +* Better formatting for `Array` and `Map` data types in Web UI. [#21798](https://github.com/ClickHouse/ClickHouse/pull/21798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update clusters only if their configurations were updated. [#21685](https://github.com/ClickHouse/ClickHouse/pull/21685) ([Kruglov Pavel](https://github.com/Avogar)). +* Propagate query and session settings for distributed DDL queries. Set `distributed_ddl_entry_format_version` to 2 to enable this. Added `distributed_ddl_output_mode` setting. Supported modes: `none`, `throw` (default), `null_status_on_timeout` and `never_throw`. Miscellaneous fixes and improvements for `Replicated` database engine. [#21535](https://github.com/ClickHouse/ClickHouse/pull/21535) ([tavplubix](https://github.com/tavplubix)). +* If `PODArray` was instantiated with element size that is neither a fraction or a multiple of 16, buffer overflow was possible. No bugs in current releases exist. [#21533](https://github.com/ClickHouse/ClickHouse/pull/21533) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `last_error_time`/`last_error_message`/`last_error_stacktrace`/`remote` columns for `system.errors`. [#21529](https://github.com/ClickHouse/ClickHouse/pull/21529) ([Azat Khuzhin](https://github.com/azat)). +* Add aliases `simpleJSONExtract/simpleJSONHas` to `visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}`. Fixes #21383. [#21519](https://github.com/ClickHouse/ClickHouse/pull/21519) ([fastio](https://github.com/fastio)). +* Add setting `optimize_skip_unused_shards_limit` to limit the number of sharding key values for `optimize_skip_unused_shards`. [#21512](https://github.com/ClickHouse/ClickHouse/pull/21512) ([Azat Khuzhin](https://github.com/azat)). +* Improve `clickhouse-format` to not throw exception when there are extra spaces or comment after the last query, and throw exception early with readable message when format `ASTInsertQuery` with data . [#21311](https://github.com/ClickHouse/ClickHouse/pull/21311) ([flynn](https://github.com/ucasFL)). +* Improve support of integer keys in data type `Map`. [#21157](https://github.com/ClickHouse/ClickHouse/pull/21157) ([Anton Popov](https://github.com/CurtizJ)). +* MaterializeMySQL: attempt to reconnect to MySQL if the connection is lost. [#20961](https://github.com/ClickHouse/ClickHouse/pull/20961) ([Håvard Kvålen](https://github.com/havardk)). +* Support more cases to rewrite `CROSS JOIN` to `INNER JOIN`. [#20392](https://github.com/ClickHouse/ClickHouse/pull/20392) ([Vladimir](https://github.com/vdimir)). +* Do not create empty parts on INSERT when `optimize_on_insert` setting enabled. Fixes [#20304](https://github.com/ClickHouse/ClickHouse/issues/20304). [#20387](https://github.com/ClickHouse/ClickHouse/pull/20387) ([Kruglov Pavel](https://github.com/Avogar)). +* `MaterializeMySQL`: add minmax skipping index for `_version` column. [#20382](https://github.com/ClickHouse/ClickHouse/pull/20382) ([Stig Bakken](https://github.com/stigsb)). +* Add option `--backslash` for `clickhouse-format`, which can add a backslash at the end of each line of the formatted query. [#21494](https://github.com/ClickHouse/ClickHouse/pull/21494) ([flynn](https://github.com/ucasFL)). +* Now clickhouse will not throw `LOGICAL_ERROR` exception when we try to mutate the already covered part. Fixes [#22013](https://github.com/ClickHouse/ClickHouse/issues/22013). [#22291](https://github.com/ClickHouse/ClickHouse/pull/22291) ([alesapin](https://github.com/alesapin)). + +#### Bug Fix + +* Remove socket from epoll before cancelling packet receiver in `HedgedConnections` to prevent possible race. Fixes [#22161](https://github.com/ClickHouse/ClickHouse/issues/22161). [#22443](https://github.com/ClickHouse/ClickHouse/pull/22443) ([Kruglov Pavel](https://github.com/Avogar)). +* Add (missing) memory accounting in parallel parsing routines. In previous versions OOM was possible when the resultset contains very large blocks of data. This closes [#22008](https://github.com/ClickHouse/ClickHouse/issues/22008). [#22425](https://github.com/ClickHouse/ClickHouse/pull/22425) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix exception which may happen when `SELECT` has constant `WHERE` condition and source table has columns which names are digits. [#22270](https://github.com/ClickHouse/ClickHouse/pull/22270) ([LiuNeng](https://github.com/liuneng1994)). +* Fix query cancellation with `use_hedged_requests=0` and `async_socket_for_remote=1`. [#22183](https://github.com/ClickHouse/ClickHouse/pull/22183) ([Azat Khuzhin](https://github.com/azat)). +* Fix uncaught exception in `InterserverIOHTTPHandler`. [#22146](https://github.com/ClickHouse/ClickHouse/pull/22146) ([Azat Khuzhin](https://github.com/azat)). +* Fix docker entrypoint in case `http_port` is not in the config. [#22132](https://github.com/ClickHouse/ClickHouse/pull/22132) ([Ewout](https://github.com/devwout)). +* Fix error `Invalid number of rows in Chunk` in `JOIN` with `TOTALS` and `arrayJoin`. Closes [#19303](https://github.com/ClickHouse/ClickHouse/issues/19303). [#22129](https://github.com/ClickHouse/ClickHouse/pull/22129) ([Vladimir](https://github.com/vdimir)). +* Fix the background thread pool name which used to poll message from Kafka. The Kafka engine with the broken thread pool will not consume the message from message queue. [#22122](https://github.com/ClickHouse/ClickHouse/pull/22122) ([fastio](https://github.com/fastio)). +* Fix waiting for `OPTIMIZE` and `ALTER` queries for `ReplicatedMergeTree` table engines. Now the query will not hang when the table was detached or restarted. [#22118](https://github.com/ClickHouse/ClickHouse/pull/22118) ([alesapin](https://github.com/alesapin)). +* Disable `async_socket_for_remote`/`use_hedged_requests` for buggy Linux kernels. [#22109](https://github.com/ClickHouse/ClickHouse/pull/22109) ([Azat Khuzhin](https://github.com/azat)). +* Docker entrypoint: avoid chown of `.` in case when `LOG_PATH` is empty. Closes [#22100](https://github.com/ClickHouse/ClickHouse/issues/22100). [#22102](https://github.com/ClickHouse/ClickHouse/pull/22102) ([filimonov](https://github.com/filimonov)). +* The function `decrypt` was lacking a check for the minimal size of data encrypted in `AEAD` mode. This closes [#21897](https://github.com/ClickHouse/ClickHouse/issues/21897). [#22064](https://github.com/ClickHouse/ClickHouse/pull/22064) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* In rare case, merge for `CollapsingMergeTree` may create granule with `index_granularity + 1` rows. Because of this, internal check, added in [#18928](https://github.com/ClickHouse/ClickHouse/issues/18928) (affects 21.2 and 21.3), may fail with error `Incomplete granules are not allowed while blocks are granules size`. This error did not allow parts to merge. [#21976](https://github.com/ClickHouse/ClickHouse/pull/21976) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Reverted [#15454](https://github.com/ClickHouse/ClickHouse/issues/15454) that may cause significant increase in memory usage while loading external dictionaries of hashed type. This closes [#21935](https://github.com/ClickHouse/ClickHouse/issues/21935). [#21948](https://github.com/ClickHouse/ClickHouse/pull/21948) ([Maksim Kita](https://github.com/kitaisreal)). +* Prevent hedged connections overlaps (`Unknown packet 9 from server` error). [#21941](https://github.com/ClickHouse/ClickHouse/pull/21941) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading the HTTP POST request with "multipart/form-data" content type in some cases. [#21936](https://github.com/ClickHouse/ClickHouse/pull/21936) ([Ivan](https://github.com/abyss7)). +* Fix wrong `ORDER BY` results when a query contains window functions, and optimization for reading in primary key order is applied. Fixes [#21828](https://github.com/ClickHouse/ClickHouse/issues/21828). [#21915](https://github.com/ClickHouse/ClickHouse/pull/21915) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix deadlock in first catboost model execution. Closes [#13832](https://github.com/ClickHouse/ClickHouse/issues/13832). [#21844](https://github.com/ClickHouse/ClickHouse/pull/21844) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix incorrect query result (and possible crash) which could happen when `WHERE` or `HAVING` condition is pushed before `GROUP BY`. Fixes [#21773](https://github.com/ClickHouse/ClickHouse/issues/21773). [#21841](https://github.com/ClickHouse/ClickHouse/pull/21841) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Better error handling and logging in `WriteBufferFromS3`. [#21836](https://github.com/ClickHouse/ClickHouse/pull/21836) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. This is a follow-up fix of [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) . Can only reproduced in production env. [#21818](https://github.com/ClickHouse/ClickHouse/pull/21818) ([Amos Bird](https://github.com/amosbird)). +* Fix scalar subquery index analysis. This fixes [#21717](https://github.com/ClickHouse/ClickHouse/issues/21717) , which was introduced in [#18896](https://github.com/ClickHouse/ClickHouse/pull/18896). [#21766](https://github.com/ClickHouse/ClickHouse/pull/21766) ([Amos Bird](https://github.com/amosbird)). +* Fix bug for `ReplicatedMerge` table engines when `ALTER MODIFY COLUMN` query doesn't change the type of `Decimal` column if its size (32 bit or 64 bit) doesn't change. [#21728](https://github.com/ClickHouse/ClickHouse/pull/21728) ([alesapin](https://github.com/alesapin)). +* Fix possible infinite waiting when concurrent `OPTIMIZE` and `DROP` are run for `ReplicatedMergeTree`. [#21716](https://github.com/ClickHouse/ClickHouse/pull/21716) ([Azat Khuzhin](https://github.com/azat)). +* Fix function `arrayElement` with type `Map` for constant integer arguments. [#21699](https://github.com/ClickHouse/ClickHouse/pull/21699) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV on not existing attributes from `ip_trie` with `access_to_key_from_attributes`. [#21692](https://github.com/ClickHouse/ClickHouse/pull/21692) ([Azat Khuzhin](https://github.com/azat)). +* Server now start accepting connections only after `DDLWorker` and dictionaries initialization. [#21676](https://github.com/ClickHouse/ClickHouse/pull/21676) ([Azat Khuzhin](https://github.com/azat)). +* Add type conversion for keys of tables of type `Join` (previously led to SIGSEGV). [#21646](https://github.com/ClickHouse/ClickHouse/pull/21646) ([Azat Khuzhin](https://github.com/azat)). +* Fix distributed requests cancellation (for example simple select from multiple shards with limit, i.e. `select * from remote('127.{2,3}', system.numbers) limit 100`) with `async_socket_for_remote=1`. [#21643](https://github.com/ClickHouse/ClickHouse/pull/21643) ([Azat Khuzhin](https://github.com/azat)). +* Fix `fsync_part_directory` for horizontal merge. [#21642](https://github.com/ClickHouse/ClickHouse/pull/21642) ([Azat Khuzhin](https://github.com/azat)). +* Remove unknown columns from joined table in `WHERE` for queries to external database engines (MySQL, PostgreSQL). close [#14614](https://github.com/ClickHouse/ClickHouse/issues/14614), close [#19288](https://github.com/ClickHouse/ClickHouse/issues/19288) (dup), close [#19645](https://github.com/ClickHouse/ClickHouse/issues/19645) (dup). [#21640](https://github.com/ClickHouse/ClickHouse/pull/21640) ([Vladimir](https://github.com/vdimir)). +* `std::terminate` was called if there is an error writing data into s3. [#21624](https://github.com/ClickHouse/ClickHouse/pull/21624) ([Vladimir](https://github.com/vdimir)). +* Fix possible error `Cannot find column` when `optimize_skip_unused_shards` is enabled and zero shards are used. [#21579](https://github.com/ClickHouse/ClickHouse/pull/21579) ([Azat Khuzhin](https://github.com/azat)). +* In case if query has constant `WHERE` condition, and setting `optimize_skip_unused_shards` enabled, all shards may be skipped and query could return incorrect empty result. [#21550](https://github.com/ClickHouse/ClickHouse/pull/21550) ([Amos Bird](https://github.com/amosbird)). +* Fix table function `clusterAllReplicas` returns wrong `_shard_num`. close [#21481](https://github.com/ClickHouse/ClickHouse/issues/21481). [#21498](https://github.com/ClickHouse/ClickHouse/pull/21498) ([flynn](https://github.com/ucasFL)). +* Fix that S3 table holds old credentials after config update. [#21457](https://github.com/ClickHouse/ClickHouse/pull/21457) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Fixed race on SSL object inside `SecureSocket` in Poco. [#21456](https://github.com/ClickHouse/ClickHouse/pull/21456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `Avro` format parsing for `Kafka`. Fixes [#21437](https://github.com/ClickHouse/ClickHouse/issues/21437). [#21438](https://github.com/ClickHouse/ClickHouse/pull/21438) ([Ilya Golshtein](https://github.com/ilejn)). +* Fix receive and send timeouts and non-blocking read in secure socket. [#21429](https://github.com/ClickHouse/ClickHouse/pull/21429) ([Kruglov Pavel](https://github.com/Avogar)). +* `force_drop_table` flag didn't work for `MATERIALIZED VIEW`, it's fixed. Fixes [#18943](https://github.com/ClickHouse/ClickHouse/issues/18943). [#20626](https://github.com/ClickHouse/ClickHouse/pull/20626) ([tavplubix](https://github.com/tavplubix)). +* Fix name clashes in `PredicateRewriteVisitor`. It caused incorrect `WHERE` filtration after full join. Close [#20497](https://github.com/ClickHouse/ClickHouse/issues/20497). [#20622](https://github.com/ClickHouse/ClickHouse/pull/20622) ([Vladimir](https://github.com/vdimir)). + +#### Build/Testing/Packaging Improvement + +* Add [Jepsen](https://github.com/jepsen-io/jepsen) tests for ClickHouse Keeper. [#21677](https://github.com/ClickHouse/ClickHouse/pull/21677) ([alesapin](https://github.com/alesapin)). +* Run stateless tests in parallel in CI. Depends on [#22181](https://github.com/ClickHouse/ClickHouse/issues/22181). [#22300](https://github.com/ClickHouse/ClickHouse/pull/22300) ([alesapin](https://github.com/alesapin)). +* Enable status check for [SQLancer](https://github.com/sqlancer/sqlancer) CI run. [#22015](https://github.com/ClickHouse/ClickHouse/pull/22015) ([Ilya Yatsishin](https://github.com/qoega)). +* Multiple preparations for PowerPC builds: Enable the bundled openldap on `ppc64le`. [#22487](https://github.com/ClickHouse/ClickHouse/pull/22487) ([Kfir Itzhak](https://github.com/mastertheknife)). Enable compiling on `ppc64le` with Clang. [#22476](https://github.com/ClickHouse/ClickHouse/pull/22476) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix compiling boost on `ppc64le`. [#22474](https://github.com/ClickHouse/ClickHouse/pull/22474) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix CMake error about internal CMake variable `CMAKE_ASM_COMPILE_OBJECT` not set on `ppc64le`. [#22469](https://github.com/ClickHouse/ClickHouse/pull/22469) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix Fedora/RHEL/CentOS not finding `libclang_rt.builtins` on `ppc64le`. [#22458](https://github.com/ClickHouse/ClickHouse/pull/22458) ([Kfir Itzhak](https://github.com/mastertheknife)). Enable building with `jemalloc` on `ppc64le`. [#22447](https://github.com/ClickHouse/ClickHouse/pull/22447) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix ClickHouse's config embedding and cctz's timezone embedding on `ppc64le`. [#22445](https://github.com/ClickHouse/ClickHouse/pull/22445) ([Kfir Itzhak](https://github.com/mastertheknife)). Fixed compiling on `ppc64le` and use the correct instruction pointer register on `ppc64le`. [#22430](https://github.com/ClickHouse/ClickHouse/pull/22430) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Re-enable the S3 (AWS) library on `aarch64`. [#22484](https://github.com/ClickHouse/ClickHouse/pull/22484) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Add `tzdata` to Docker containers because reading `ORC` formats requires it. This closes [#14156](https://github.com/ClickHouse/ClickHouse/issues/14156). [#22000](https://github.com/ClickHouse/ClickHouse/pull/22000) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Introduce 2 arguments for `clickhouse-server` image Dockerfile: `deb_location` & `single_binary_location`. [#21977](https://github.com/ClickHouse/ClickHouse/pull/21977) ([filimonov](https://github.com/filimonov)). +* Allow to use clang-tidy with release builds by enabling assertions if it is used. [#21914](https://github.com/ClickHouse/ClickHouse/pull/21914) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add llvm-12 binaries name to search in cmake scripts. Implicit constants conversions to mute clang warnings. Updated submodules to build with CMake 3.19. Mute recursion in macro expansion in `readpassphrase` library. Deprecated `-fuse-ld` changed to `--ld-path` for clang. [#21597](https://github.com/ClickHouse/ClickHouse/pull/21597) ([Ilya Yatsishin](https://github.com/qoega)). +* Updating `docker/test/testflows/runner/dockerd-entrypoint.sh` to use Yandex dockerhub-proxy, because Docker Hub has enabled very restrictive rate limits [#21551](https://github.com/ClickHouse/ClickHouse/pull/21551) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix macOS shared lib build. [#20184](https://github.com/ClickHouse/ClickHouse/pull/20184) ([nvartolomei](https://github.com/nvartolomei)). +* Add `ctime` option to `zookeeper-dump-tree`. It allows to dump node creation time. [#21842](https://github.com/ClickHouse/ClickHouse/pull/21842) ([Ilya](https://github.com/HumanUser)). + + +## ClickHouse release 21.3 (LTS) + +### ClickHouse release v21.3, 2021-03-12 + +#### Backward Incompatible Change + +* Now it's not allowed to create MergeTree tables in old syntax with table TTL because it's just ignored. Attach of old tables is still possible. [#20282](https://github.com/ClickHouse/ClickHouse/pull/20282) ([alesapin](https://github.com/alesapin)). +* Now all case-insensitive function names will be rewritten to their canonical representations. This is needed for projection query routing (the upcoming feature). [#20174](https://github.com/ClickHouse/ClickHouse/pull/20174) ([Amos Bird](https://github.com/amosbird)). +* Fix creation of `TTL` in cases, when its expression is a function and it is the same as `ORDER BY` key. Now it's allowed to set custom aggregation to primary key columns in `TTL` with `GROUP BY`. Backward incompatible: For primary key columns, which are not in `GROUP BY` and aren't set explicitly now is applied function `any` instead of `max`, when TTL is expired. Also if you use TTL with `WHERE` or `GROUP BY` you can see exceptions at merges, while making rolling update. [#15450](https://github.com/ClickHouse/ClickHouse/pull/15450) ([Anton Popov](https://github.com/CurtizJ)). + +#### New Feature + +* Add file engine settings: `engine_file_empty_if_not_exists` and `engine_file_truncate_on_insert`. [#20620](https://github.com/ClickHouse/ClickHouse/pull/20620) ([M0r64n](https://github.com/M0r64n)). +* Add aggregate function `deltaSum` for summing the differences between consecutive rows. [#20057](https://github.com/ClickHouse/ClickHouse/pull/20057) ([Russ Frank](https://github.com/rf)). +* New `event_time_microseconds` column in `system.part_log` table. [#20027](https://github.com/ClickHouse/ClickHouse/pull/20027) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `timezoneOffset(datetime)` function which will give the offset from UTC in seconds. This close [#issue:19850](https://github.com/ClickHouse/ClickHouse/issues/19850). [#19962](https://github.com/ClickHouse/ClickHouse/pull/19962) ([keenwolf](https://github.com/keen-wolf)). +* Add setting `insert_shard_id` to support insert data into specific shard from distributed table. [#19961](https://github.com/ClickHouse/ClickHouse/pull/19961) ([flynn](https://github.com/ucasFL)). +* Function `reinterpretAs` updated to support big integers. Fixes [#19691](https://github.com/ClickHouse/ClickHouse/issues/19691). [#19858](https://github.com/ClickHouse/ClickHouse/pull/19858) ([Maksim Kita](https://github.com/kitaisreal)). +* Added Server Side Encryption Customer Keys (the `x-amz-server-side-encryption-customer-(key/md5)` header) support in S3 client. See [the link](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html). Closes [#19428](https://github.com/ClickHouse/ClickHouse/issues/19428). [#19748](https://github.com/ClickHouse/ClickHouse/pull/19748) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Added `implicit_key` option for `executable` dictionary source. It allows to avoid printing key for every record if records comes in the same order as the input keys. Implements [#14527](https://github.com/ClickHouse/ClickHouse/issues/14527). [#19677](https://github.com/ClickHouse/ClickHouse/pull/19677) ([Maksim Kita](https://github.com/kitaisreal)). +* Add quota type `query_selects` and `query_inserts`. [#19603](https://github.com/ClickHouse/ClickHouse/pull/19603) ([JackyWoo](https://github.com/JackyWoo)). +* Add function `extractTextFromHTML` [#19600](https://github.com/ClickHouse/ClickHouse/pull/19600) ([zlx19950903](https://github.com/zlx19950903)), ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Tables with `MergeTree*` engine now have two new table-level settings for query concurrency control. Setting `max_concurrent_queries` limits the number of concurrently executed queries which are related to this table. Setting `min_marks_to_honor_max_concurrent_queries` tells to apply previous setting only if query reads at least this number of marks. [#19544](https://github.com/ClickHouse/ClickHouse/pull/19544) ([Amos Bird](https://github.com/amosbird)). +* Added `file` function to read file from user_files directory as a String. This is different from the `file` table function. This implements [#issue:18851](https://github.com/ClickHouse/ClickHouse/issues/18851). [#19204](https://github.com/ClickHouse/ClickHouse/pull/19204) ([keenwolf](https://github.com/keen-wolf)). + +#### Experimental feature + +* Add experimental `Replicated` database engine. It replicates DDL queries across multiple hosts. [#16193](https://github.com/ClickHouse/ClickHouse/pull/16193) ([tavplubix](https://github.com/tavplubix)). +* Introduce experimental support for window functions, enabled with `allow_experimental_window_functions = 1`. This is a preliminary, alpha-quality implementation that is not suitable for production use and will change in backward-incompatible ways in future releases. Please see [the documentation](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/sql-reference/window-functions/index.md#experimental-window-functions) for the list of supported features. [#20337](https://github.com/ClickHouse/ClickHouse/pull/20337) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add the ability to backup/restore metadata files for DiskS3. [#18377](https://github.com/ClickHouse/ClickHouse/pull/18377) ([Pavel Kovalenko](https://github.com/Jokser)). + +#### Performance Improvement + +* Hedged requests for remote queries. When setting `use_hedged_requests` enabled (off by default), allow to establish many connections with different replicas for query. New connection is enabled in case existent connection(s) with replica(s) were not established within `hedged_connection_timeout` or no data was received within `receive_data_timeout`. Query uses the first connection which send non empty progress packet (or data packet, if `allow_changing_replica_until_first_data_packet`); other connections are cancelled. Queries with `max_parallel_replicas > 1` are supported. [#19291](https://github.com/ClickHouse/ClickHouse/pull/19291) ([Kruglov Pavel](https://github.com/Avogar)). This allows to significantly reduce tail latencies on very large clusters. +* Added support for `PREWHERE` (and enable the corresponding optimization) when tables have row-level security expressions specified. [#19576](https://github.com/ClickHouse/ClickHouse/pull/19576) ([Denis Glazachev](https://github.com/traceon)). +* The setting `distributed_aggregation_memory_efficient` is enabled by default. It will lower memory usage and improve performance of distributed queries. [#20599](https://github.com/ClickHouse/ClickHouse/pull/20599) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of GROUP BY multiple fixed size keys. [#20472](https://github.com/ClickHouse/ClickHouse/pull/20472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregate functions by more strict aliasing. [#19946](https://github.com/ClickHouse/ClickHouse/pull/19946) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Speed up reading from `Memory` tables in extreme cases (when reading speed is in order of 50 GB/sec) by simplification of pipeline and (consequently) less lock contention in pipeline scheduling. [#20468](https://github.com/ClickHouse/ClickHouse/pull/20468) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Partially reimplement HTTP server to make it making less copies of incoming and outgoing data. It gives up to 1.5 performance improvement on inserting long records over HTTP. [#19516](https://github.com/ClickHouse/ClickHouse/pull/19516) ([Ivan](https://github.com/abyss7)). +* Add `compress` setting for `Memory` tables. If it's enabled the table will use less RAM. On some machines and datasets it can also work faster on SELECT, but it is not always the case. This closes [#20093](https://github.com/ClickHouse/ClickHouse/issues/20093). Note: there are reasons why Memory tables can work slower than MergeTree: (1) lack of compression (2) static size of blocks (3) lack of indices and prewhere... [#20168](https://github.com/ClickHouse/ClickHouse/pull/20168) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Slightly better code in aggregation. [#20978](https://github.com/ClickHouse/ClickHouse/pull/20978) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add back `intDiv`/`modulo` specializations for better performance. This fixes [#21293](https://github.com/ClickHouse/ClickHouse/issues/21293) . The regression was introduced in https://github.com/ClickHouse/ClickHouse/pull/18145 . [#21307](https://github.com/ClickHouse/ClickHouse/pull/21307) ([Amos Bird](https://github.com/amosbird)). +* Do not squash blocks too much on INSERT SELECT if inserting into Memory table. In previous versions inefficient data representation was created in Memory table after INSERT SELECT. This closes [#13052](https://github.com/ClickHouse/ClickHouse/issues/13052). [#20169](https://github.com/ClickHouse/ClickHouse/pull/20169) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix at least one case when DataType parser may have exponential complexity (found by fuzzer). This closes [#20096](https://github.com/ClickHouse/ClickHouse/issues/20096). [#20132](https://github.com/ClickHouse/ClickHouse/pull/20132) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Parallelize SELECT with FINAL for single part with level > 0 when `do_not_merge_across_partitions_select_final` setting is 1. [#19375](https://github.com/ClickHouse/ClickHouse/pull/19375) ([Kruglov Pavel](https://github.com/Avogar)). +* Fill only requested columns when querying `system.parts` and `system.parts_columns`. Closes [#19570](https://github.com/ClickHouse/ClickHouse/issues/19570). [#21035](https://github.com/ClickHouse/ClickHouse/pull/21035) ([Anmol Arora](https://github.com/anmolarora)). +* Perform algebraic optimizations of arithmetic expressions inside `avg` aggregate function. close [#20092](https://github.com/ClickHouse/ClickHouse/issues/20092). [#20183](https://github.com/ClickHouse/ClickHouse/pull/20183) ([flynn](https://github.com/ucasFL)). + +#### Improvement + +* Case-insensitive compression methods for table functions. Also fixed LZMA compression method which was checked in upper case. [#21416](https://github.com/ClickHouse/ClickHouse/pull/21416) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add two settings to delay or throw error during insertion when there are too many inactive parts. This is useful when server fails to clean up parts quickly enough. [#20178](https://github.com/ClickHouse/ClickHouse/pull/20178) ([Amos Bird](https://github.com/amosbird)). +* Provide better compatibility for mysql clients. 1. mysql jdbc 2. mycli. [#21367](https://github.com/ClickHouse/ClickHouse/pull/21367) ([Amos Bird](https://github.com/amosbird)). +* Forbid to drop a column if it's referenced by materialized view. Closes [#21164](https://github.com/ClickHouse/ClickHouse/issues/21164). [#21303](https://github.com/ClickHouse/ClickHouse/pull/21303) ([flynn](https://github.com/ucasFL)). +* MySQL dictionary source will now retry unexpected connection failures (Lost connection to MySQL server during query) which sometimes happen on SSL/TLS connections. [#21237](https://github.com/ClickHouse/ClickHouse/pull/21237) ([Alexander Kazakov](https://github.com/Akazz)). +* Usability improvement: more consistent `DateTime64` parsing: recognize the case when unix timestamp with subsecond resolution is specified as scaled integer (like `1111111111222` instead of `1111111111.222`). This closes [#13194](https://github.com/ClickHouse/ClickHouse/issues/13194). [#21053](https://github.com/ClickHouse/ClickHouse/pull/21053) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do only merging of sorted blocks on initiator with distributed_group_by_no_merge. [#20882](https://github.com/ClickHouse/ClickHouse/pull/20882) ([Azat Khuzhin](https://github.com/azat)). +* When loading config for mysql source ClickHouse will now randomize the list of replicas with the same priority to ensure the round-robin logics of picking mysql endpoint. This closes [#20629](https://github.com/ClickHouse/ClickHouse/issues/20629). [#20632](https://github.com/ClickHouse/ClickHouse/pull/20632) ([Alexander Kazakov](https://github.com/Akazz)). +* Function 'reinterpretAs(x, Type)' renamed into 'reinterpret(x, Type)'. [#20611](https://github.com/ClickHouse/ClickHouse/pull/20611) ([Maksim Kita](https://github.com/kitaisreal)). +* Support vhost for RabbitMQ engine [#20576](https://github.com/ClickHouse/ClickHouse/issues/20576). [#20596](https://github.com/ClickHouse/ClickHouse/pull/20596) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improved serialization for data types combined of Arrays and Tuples. Improved matching enum data types to protobuf enum type. Fixed serialization of the `Map` data type. Omitted values are now set by default. [#20506](https://github.com/ClickHouse/ClickHouse/pull/20506) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed race between execution of distributed DDL tasks and cleanup of DDL queue. Now DDL task cannot be removed from ZooKeeper if there are active workers. Fixes [#20016](https://github.com/ClickHouse/ClickHouse/issues/20016). [#20448](https://github.com/ClickHouse/ClickHouse/pull/20448) ([tavplubix](https://github.com/tavplubix)). +* Make FQDN and other DNS related functions work correctly in alpine images. [#20336](https://github.com/ClickHouse/ClickHouse/pull/20336) ([filimonov](https://github.com/filimonov)). +* Do not allow early constant folding of explicitly forbidden functions. [#20303](https://github.com/ClickHouse/ClickHouse/pull/20303) ([Azat Khuzhin](https://github.com/azat)). +* Implicit conversion from integer to Decimal type might succeeded if integer value doe not fit into Decimal type. Now it throws `ARGUMENT_OUT_OF_BOUND`. [#20232](https://github.com/ClickHouse/ClickHouse/pull/20232) ([tavplubix](https://github.com/tavplubix)). +* Lockless `SYSTEM FLUSH DISTRIBUTED`. [#20215](https://github.com/ClickHouse/ClickHouse/pull/20215) ([Azat Khuzhin](https://github.com/azat)). +* Normalize count(constant), sum(1) to count(). This is needed for projection query routing. [#20175](https://github.com/ClickHouse/ClickHouse/pull/20175) ([Amos Bird](https://github.com/amosbird)). +* Support all native integer types in bitmap functions. [#20171](https://github.com/ClickHouse/ClickHouse/pull/20171) ([Amos Bird](https://github.com/amosbird)). +* Updated `CacheDictionary`, `ComplexCacheDictionary`, `SSDCacheDictionary`, `SSDComplexKeyDictionary` to use LRUHashMap as underlying index. [#20164](https://github.com/ClickHouse/ClickHouse/pull/20164) ([Maksim Kita](https://github.com/kitaisreal)). +* The setting `access_management` is now configurable on startup by providing `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT`, defaults to disabled (`0`) which was the prior value. [#20139](https://github.com/ClickHouse/ClickHouse/pull/20139) ([Marquitos](https://github.com/sonirico)). +* Fix toDateTime64(toDate()/toDateTime()) for DateTime64 - Implement DateTime64 clamping to match DateTime behaviour. [#20131](https://github.com/ClickHouse/ClickHouse/pull/20131) ([Azat Khuzhin](https://github.com/azat)). +* Quota improvements: SHOW TABLES is now considered as one query in the quota calculations, not two queries. SYSTEM queries now consume quota. Fix calculation of interval's end in quota consumption. [#20106](https://github.com/ClickHouse/ClickHouse/pull/20106) ([Vitaly Baranov](https://github.com/vitlibar)). +* Supports `path IN (set)` expressions for `system.zookeeper` table. [#20105](https://github.com/ClickHouse/ClickHouse/pull/20105) ([小路](https://github.com/nicelulu)). +* Show full details of `MaterializeMySQL` tables in `system.tables`. [#20051](https://github.com/ClickHouse/ClickHouse/pull/20051) ([Stig Bakken](https://github.com/stigsb)). +* Fix data race in executable dictionary that was possible only on misuse (when the script returns data ignoring its input). [#20045](https://github.com/ClickHouse/ClickHouse/pull/20045) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The value of MYSQL_OPT_RECONNECT option can now be controlled by "opt_reconnect" parameter in the config section of mysql replica. [#19998](https://github.com/ClickHouse/ClickHouse/pull/19998) ([Alexander Kazakov](https://github.com/Akazz)). +* If user calls `JSONExtract` function with `Float32` type requested, allow inaccurate conversion to the result type. For example the number `0.1` in JSON is double precision and is not representable in Float32, but the user still wants to get it. Previous versions return 0 for non-Nullable type and NULL for Nullable type to indicate that conversion is imprecise. The logic was 100% correct but it was surprising to users and leading to questions. This closes [#13962](https://github.com/ClickHouse/ClickHouse/issues/13962). [#19960](https://github.com/ClickHouse/ClickHouse/pull/19960) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add conversion of block structure for INSERT into Distributed tables if it does not match. [#19947](https://github.com/ClickHouse/ClickHouse/pull/19947) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for the `system.distributed_ddl_queue` table. Initialize MaxDDLEntryID to the last value after restarting. Before this PR, MaxDDLEntryID will remain zero until a new DDLTask is processed. [#19924](https://github.com/ClickHouse/ClickHouse/pull/19924) ([Amos Bird](https://github.com/amosbird)). +* Show `MaterializeMySQL` tables in `system.parts`. [#19770](https://github.com/ClickHouse/ClickHouse/pull/19770) ([Stig Bakken](https://github.com/stigsb)). +* Add separate config directive for `Buffer` profile. [#19721](https://github.com/ClickHouse/ClickHouse/pull/19721) ([Azat Khuzhin](https://github.com/azat)). +* Move conditions that are not related to JOIN to WHERE clause. [#18720](https://github.com/ClickHouse/ClickHouse/issues/18720). [#19685](https://github.com/ClickHouse/ClickHouse/pull/19685) ([hexiaoting](https://github.com/hexiaoting)). +* Add ability to throttle INSERT into Distributed based on amount of pending bytes for async send (`bytes_to_delay_insert`/`max_delay_to_insert` and `bytes_to_throw_insert` settings for `Distributed` engine has been added). [#19673](https://github.com/ClickHouse/ClickHouse/pull/19673) ([Azat Khuzhin](https://github.com/azat)). +* Fix some rare cases when write errors can be ignored in destructors. [#19451](https://github.com/ClickHouse/ClickHouse/pull/19451) ([Azat Khuzhin](https://github.com/azat)). +* Print inline frames in stack traces for fatal errors. [#19317](https://github.com/ClickHouse/ClickHouse/pull/19317) ([Ivan](https://github.com/abyss7)). + +#### Bug Fix + +* Fix redundant reconnects to ZooKeeper and the possibility of two active sessions for a single clickhouse server. Both problems introduced in #14678. [#21264](https://github.com/ClickHouse/ClickHouse/pull/21264) ([alesapin](https://github.com/alesapin)). +* Fix error `Bad cast from type ... to DB::ColumnLowCardinality` while inserting into table with `LowCardinality` column from `Values` format. Fixes #21140 [#21357](https://github.com/ClickHouse/ClickHouse/pull/21357) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a deadlock in `ALTER DELETE` mutations for non replicated MergeTree table engines when the predicate contains the table itself. Fixes [#20558](https://github.com/ClickHouse/ClickHouse/issues/20558). [#21477](https://github.com/ClickHouse/ClickHouse/pull/21477) ([alesapin](https://github.com/alesapin)). +* Fix SIGSEGV for distributed queries on failures. [#21434](https://github.com/ClickHouse/ClickHouse/pull/21434) ([Azat Khuzhin](https://github.com/azat)). +* Now `ALTER MODIFY COLUMN` queries will correctly affect changes in partition key, skip indices, TTLs, and so on. Fixes [#13675](https://github.com/ClickHouse/ClickHouse/issues/13675). [#21334](https://github.com/ClickHouse/ClickHouse/pull/21334) ([alesapin](https://github.com/alesapin)). +* Fix bug with `join_use_nulls` and joining `TOTALS` from subqueries. This closes [#19362](https://github.com/ClickHouse/ClickHouse/issues/19362) and [#21137](https://github.com/ClickHouse/ClickHouse/issues/21137). [#21248](https://github.com/ClickHouse/ClickHouse/pull/21248) ([vdimir](https://github.com/vdimir)). +* Fix crash in `EXPLAIN` for query with `UNION`. Fixes [#20876](https://github.com/ClickHouse/ClickHouse/issues/20876), [#21170](https://github.com/ClickHouse/ClickHouse/issues/21170). [#21246](https://github.com/ClickHouse/ClickHouse/pull/21246) ([flynn](https://github.com/ucasFL)). +* Now mutations allowed only for table engines that support them (MergeTree family, Memory, MaterializedView). Other engines will report a more clear error. Fixes [#21168](https://github.com/ClickHouse/ClickHouse/issues/21168). [#21183](https://github.com/ClickHouse/ClickHouse/pull/21183) ([alesapin](https://github.com/alesapin)). +* Fixes [#21112](https://github.com/ClickHouse/ClickHouse/issues/21112). Fixed bug that could cause duplicates with insert query (if one of the callbacks came a little too late). [#21138](https://github.com/ClickHouse/ClickHouse/pull/21138) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `input_format_null_as_default` take effective when types are nullable. This fixes [#21116](https://github.com/ClickHouse/ClickHouse/issues/21116) . [#21121](https://github.com/ClickHouse/ClickHouse/pull/21121) ([Amos Bird](https://github.com/amosbird)). +* fix bug related to cast Tuple to Map. Closes [#21029](https://github.com/ClickHouse/ClickHouse/issues/21029). [#21120](https://github.com/ClickHouse/ClickHouse/pull/21120) ([hexiaoting](https://github.com/hexiaoting)). +* Fix the metadata leak when the Replicated*MergeTree with custom (non default) ZooKeeper cluster is dropped. [#21119](https://github.com/ClickHouse/ClickHouse/pull/21119) ([fastio](https://github.com/fastio)). +* Fix type mismatch issue when using LowCardinality keys in joinGet. This fixes [#21114](https://github.com/ClickHouse/ClickHouse/issues/21114). [#21117](https://github.com/ClickHouse/ClickHouse/pull/21117) ([Amos Bird](https://github.com/amosbird)). +* fix default_replica_path and default_replica_name values are useless on Replicated(*)MergeTree engine when the engine needs specify other parameters. [#21060](https://github.com/ClickHouse/ClickHouse/pull/21060) ([mxzlxy](https://github.com/mxzlxy)). +* Out of bound memory access was possible when formatting specifically crafted out of range value of type `DateTime64`. This closes [#20494](https://github.com/ClickHouse/ClickHouse/issues/20494). This closes [#20543](https://github.com/ClickHouse/ClickHouse/issues/20543). [#21023](https://github.com/ClickHouse/ClickHouse/pull/21023) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Block parallel insertions into storage join. [#21009](https://github.com/ClickHouse/ClickHouse/pull/21009) ([vdimir](https://github.com/vdimir)). +* Fixed behaviour, when `ALTER MODIFY COLUMN` created mutation, that will knowingly fail. [#21007](https://github.com/ClickHouse/ClickHouse/pull/21007) ([Anton Popov](https://github.com/CurtizJ)). +* Closes [#9969](https://github.com/ClickHouse/ClickHouse/issues/9969). Fixed Brotli http compression error, which reproduced for large data sizes, slightly complicated structure and with json output format. Update Brotli to the latest version to include the "fix rare access to uninitialized data in ring-buffer". [#20991](https://github.com/ClickHouse/ClickHouse/pull/20991) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix 'Empty task was returned from async task queue' on query cancellation. [#20881](https://github.com/ClickHouse/ClickHouse/pull/20881) ([Azat Khuzhin](https://github.com/azat)). +* `USE database;` query did not work when using MySQL 5.7 client to connect to ClickHouse server, it's fixed. Fixes [#18926](https://github.com/ClickHouse/ClickHouse/issues/18926). [#20878](https://github.com/ClickHouse/ClickHouse/pull/20878) ([tavplubix](https://github.com/tavplubix)). +* Fix usage of `-Distinct` combinator with `-State` combinator in aggregate functions. [#20866](https://github.com/ClickHouse/ClickHouse/pull/20866) ([Anton Popov](https://github.com/CurtizJ)). +* Fix subquery with union distinct and limit clause. close [#20597](https://github.com/ClickHouse/ClickHouse/issues/20597). [#20610](https://github.com/ClickHouse/ClickHouse/pull/20610) ([flynn](https://github.com/ucasFL)). +* Fixed inconsistent behavior of dictionary in case of queries where we look for absent keys in dictionary. [#20578](https://github.com/ClickHouse/ClickHouse/pull/20578) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix the number of threads for scalar subqueries and subqueries for index (after [#19007](https://github.com/ClickHouse/ClickHouse/issues/19007) single thread was always used). Fixes [#20457](https://github.com/ClickHouse/ClickHouse/issues/20457), [#20512](https://github.com/ClickHouse/ClickHouse/issues/20512). [#20550](https://github.com/ClickHouse/ClickHouse/pull/20550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash which could happen if unknown packet was received from remove query (was introduced in [#17868](https://github.com/ClickHouse/ClickHouse/issues/17868)). [#20547](https://github.com/ClickHouse/ClickHouse/pull/20547) ([Azat Khuzhin](https://github.com/azat)). +* Add proper checks while parsing directory names for async INSERT (fixes SIGSEGV). [#20498](https://github.com/ClickHouse/ClickHouse/pull/20498) ([Azat Khuzhin](https://github.com/azat)). +* Fix function `transform` does not work properly for floating point keys. Closes [#20460](https://github.com/ClickHouse/ClickHouse/issues/20460). [#20479](https://github.com/ClickHouse/ClickHouse/pull/20479) ([flynn](https://github.com/ucasFL)). +* Fix infinite loop when propagating WITH aliases to subqueries. This fixes [#20388](https://github.com/ClickHouse/ClickHouse/issues/20388). [#20476](https://github.com/ClickHouse/ClickHouse/pull/20476) ([Amos Bird](https://github.com/amosbird)). +* Fix abnormal server termination when http client goes away. [#20464](https://github.com/ClickHouse/ClickHouse/pull/20464) ([Azat Khuzhin](https://github.com/azat)). +* Fix `LOGICAL_ERROR` for `join_use_nulls=1` when JOIN contains const from SELECT. [#20461](https://github.com/ClickHouse/ClickHouse/pull/20461) ([Azat Khuzhin](https://github.com/azat)). +* Check if table function `view` is used in expression list and throw an error. This fixes [#20342](https://github.com/ClickHouse/ClickHouse/issues/20342). [#20350](https://github.com/ClickHouse/ClickHouse/pull/20350) ([Amos Bird](https://github.com/amosbird)). +* Avoid invalid dereference in RANGE_HASHED() dictionary. [#20345](https://github.com/ClickHouse/ClickHouse/pull/20345) ([Azat Khuzhin](https://github.com/azat)). +* Fix null dereference with `join_use_nulls=1`. [#20344](https://github.com/ClickHouse/ClickHouse/pull/20344) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect result of binary operations between two constant decimals of different scale. Fixes [#20283](https://github.com/ClickHouse/ClickHouse/issues/20283). [#20339](https://github.com/ClickHouse/ClickHouse/pull/20339) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix too often retries of failed background tasks for `ReplicatedMergeTree` table engines family. This could lead to too verbose logging and increased CPU load. Fixes [#20203](https://github.com/ClickHouse/ClickHouse/issues/20203). [#20335](https://github.com/ClickHouse/ClickHouse/pull/20335) ([alesapin](https://github.com/alesapin)). +* Restrict to `DROP` or `RENAME` version column of `*CollapsingMergeTree` and `ReplacingMergeTree` table engines. [#20300](https://github.com/ClickHouse/ClickHouse/pull/20300) ([alesapin](https://github.com/alesapin)). +* Fixed the behavior when in case of broken JSON we tried to read the whole file into memory which leads to exception from the allocator. Fixes [#19719](https://github.com/ClickHouse/ClickHouse/issues/19719). [#20286](https://github.com/ClickHouse/ClickHouse/pull/20286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix exception during vertical merge for `MergeTree` table engines family which don't allow to perform vertical merges. Fixes [#20259](https://github.com/ClickHouse/ClickHouse/issues/20259). [#20279](https://github.com/ClickHouse/ClickHouse/pull/20279) ([alesapin](https://github.com/alesapin)). +* Fix rare server crash on config reload during the shutdown. Fixes [#19689](https://github.com/ClickHouse/ClickHouse/issues/19689). [#20224](https://github.com/ClickHouse/ClickHouse/pull/20224) ([alesapin](https://github.com/alesapin)). +* Fix CTE when using in INSERT SELECT. This fixes [#20187](https://github.com/ClickHouse/ClickHouse/issues/20187), fixes [#20195](https://github.com/ClickHouse/ClickHouse/issues/20195). [#20211](https://github.com/ClickHouse/ClickHouse/pull/20211) ([Amos Bird](https://github.com/amosbird)). +* Fixes [#19314](https://github.com/ClickHouse/ClickHouse/issues/19314). [#20156](https://github.com/ClickHouse/ClickHouse/pull/20156) ([Ivan](https://github.com/abyss7)). +* fix toMinute function to handle special timezone correctly. [#20149](https://github.com/ClickHouse/ClickHouse/pull/20149) ([keenwolf](https://github.com/keen-wolf)). +* Fix server crash after query with `if` function with `Tuple` type of then/else branches result. `Tuple` type must contain `Array` or another complex type. Fixes [#18356](https://github.com/ClickHouse/ClickHouse/issues/18356). [#20133](https://github.com/ClickHouse/ClickHouse/pull/20133) ([alesapin](https://github.com/alesapin)). +* The `MongoDB` table engine now establishes connection only when it's going to read data. `ATTACH TABLE` won't try to connect anymore. [#20110](https://github.com/ClickHouse/ClickHouse/pull/20110) ([Vitaly Baranov](https://github.com/vitlibar)). +* Bugfix in StorageJoin. [#20079](https://github.com/ClickHouse/ClickHouse/pull/20079) ([vdimir](https://github.com/vdimir)). +* Fix the case when calculating modulo of division of negative number by small divisor, the resulting data type was not large enough to accomodate the negative result. This closes [#20052](https://github.com/ClickHouse/ClickHouse/issues/20052). [#20067](https://github.com/ClickHouse/ClickHouse/pull/20067) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* MaterializeMySQL: Fix replication for statements that update several tables. [#20066](https://github.com/ClickHouse/ClickHouse/pull/20066) ([Håvard Kvålen](https://github.com/havardk)). +* Prevent "Connection refused" in docker during initialization script execution. [#20012](https://github.com/ClickHouse/ClickHouse/pull/20012) ([filimonov](https://github.com/filimonov)). +* `EmbeddedRocksDB` is an experimental storage. Fix the issue with lack of proper type checking. Simplified code. This closes [#19967](https://github.com/ClickHouse/ClickHouse/issues/19967). [#19972](https://github.com/ClickHouse/ClickHouse/pull/19972) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix a segfault in function `fromModifiedJulianDay` when the argument type is `Nullable(T)` for any integral types other than Int32. [#19959](https://github.com/ClickHouse/ClickHouse/pull/19959) ([PHO](https://github.com/depressed-pho)). +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Deadlock was possible if system.text_log is enabled. This fixes [#19874](https://github.com/ClickHouse/ClickHouse/issues/19874). [#19875](https://github.com/ClickHouse/ClickHouse/pull/19875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix starting the server with tables having default expressions containing dictGet(). Allow getting return type of dictGet() without loading dictionary. [#19805](https://github.com/ClickHouse/ClickHouse/pull/19805) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix clickhouse-client abort exception while executing only `select`. [#19790](https://github.com/ClickHouse/ClickHouse/pull/19790) ([taiyang-li](https://github.com/taiyang-li)). +* Fix a bug that moving pieces to destination table may failed in case of launching multiple clickhouse-copiers. [#19743](https://github.com/ClickHouse/ClickHouse/pull/19743) ([madianjun](https://github.com/mdianjun)). +* Background thread which executes `ON CLUSTER` queries might hang waiting for dropped replicated table to do something. It's fixed. [#19684](https://github.com/ClickHouse/ClickHouse/pull/19684) ([yiguolei](https://github.com/yiguolei)). + +#### Build/Testing/Packaging Improvement + +* Allow to build ClickHouse with AVX-2 enabled globally. It gives slight performance benefits on modern CPUs. Not recommended for production and will not be supported as official build for now. [#20180](https://github.com/ClickHouse/ClickHouse/pull/20180) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix some of the issues found by Coverity. See [#19964](https://github.com/ClickHouse/ClickHouse/issues/19964). [#20010](https://github.com/ClickHouse/ClickHouse/pull/20010) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to start up with modified binary under gdb. In previous version if you set up breakpoint in gdb before start, server will refuse to start up due to failed integrity check. [#21258](https://github.com/ClickHouse/ClickHouse/pull/21258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a test for different compression methods in Kafka. [#21111](https://github.com/ClickHouse/ClickHouse/pull/21111) ([filimonov](https://github.com/filimonov)). +* Fixed port clash from test_storage_kerberized_hdfs test. [#19974](https://github.com/ClickHouse/ClickHouse/pull/19974) ([Ilya Yatsishin](https://github.com/qoega)). +* Print `stdout` and `stderr` to log when failed to start docker in integration tests. Before this PR there was a very short error message in this case which didn't help to investigate the problems. [#20631](https://github.com/ClickHouse/ClickHouse/pull/20631) ([Vitaly Baranov](https://github.com/vitlibar)). + + +## ClickHouse release 21.2 + +### ClickHouse release v21.2.2.8-stable, 2021-02-07 + +#### Backward Incompatible Change + +* Bitwise functions (`bitAnd`, `bitOr`, etc) are forbidden for floating point arguments. Now you have to do explicit cast to integer. [#19853](https://github.com/ClickHouse/ClickHouse/pull/19853) ([Azat Khuzhin](https://github.com/azat)). +* Forbid `lcm`/`gcd` for floats. [#19532](https://github.com/ClickHouse/ClickHouse/pull/19532) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory tracking for `OPTIMIZE TABLE`/merges; account query memory limits and sampling for `OPTIMIZE TABLE`/merges. [#18772](https://github.com/ClickHouse/ClickHouse/pull/18772) ([Azat Khuzhin](https://github.com/azat)). +* Disallow floating point column as partition key, see [#18421](https://github.com/ClickHouse/ClickHouse/issues/18421#event-4147046255). [#18464](https://github.com/ClickHouse/ClickHouse/pull/18464) ([hexiaoting](https://github.com/hexiaoting)). +* Excessive parenthesis in type definitions no longer supported, example: `Array((UInt8))`. + +#### New Feature + +* Added `PostgreSQL` table engine (both select/insert, with support for multidimensional arrays), also as table function. Added `PostgreSQL` dictionary source. Added `PostgreSQL` database engine. [#18554](https://github.com/ClickHouse/ClickHouse/pull/18554) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Data type `Nested` now supports arbitrary levels of nesting. Introduced subcolumns of complex types, such as `size0` in `Array`, `null` in `Nullable`, names of `Tuple` elements, which can be read without reading of whole column. [#17310](https://github.com/ClickHouse/ClickHouse/pull/17310) ([Anton Popov](https://github.com/CurtizJ)). +* Added `Nullable` support for `FlatDictionary`, `HashedDictionary`, `ComplexKeyHashedDictionary`, `DirectDictionary`, `ComplexKeyDirectDictionary`, `RangeHashedDictionary`. [#18236](https://github.com/ClickHouse/ClickHouse/pull/18236) ([Maksim Kita](https://github.com/kitaisreal)). +* Adds a new table called `system.distributed_ddl_queue` that displays the queries in the DDL worker queue. [#17656](https://github.com/ClickHouse/ClickHouse/pull/17656) ([Bharat Nallan](https://github.com/bharatnc)). +* Added support of mapping LDAP group names, and attribute values in general, to local roles for users from ldap user directories. [#17211](https://github.com/ClickHouse/ClickHouse/pull/17211) ([Denis Glazachev](https://github.com/traceon)). +* Support insert into table function `cluster`, and for both table functions `remote` and `cluster`, support distributing data across nodes by specify sharding key. Close [#16752](https://github.com/ClickHouse/ClickHouse/issues/16752). [#18264](https://github.com/ClickHouse/ClickHouse/pull/18264) ([flynn](https://github.com/ucasFL)). +* Add function `decodeXMLComponent` to decode characters for XML. Example: `SELECT decodeXMLComponent('Hello,"world"!')` [#17659](https://github.com/ClickHouse/ClickHouse/issues/17659). [#18542](https://github.com/ClickHouse/ClickHouse/pull/18542) ([nauta](https://github.com/nautaa)). +* Added functions `parseDateTimeBestEffortUSOrZero`, `parseDateTimeBestEffortUSOrNull`. [#19712](https://github.com/ClickHouse/ClickHouse/pull/19712) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `sign` math function. [#19527](https://github.com/ClickHouse/ClickHouse/pull/19527) ([flynn](https://github.com/ucasFL)). +* Add information about used features (functions, table engines, etc) into system.query_log. [#18495](https://github.com/ClickHouse/ClickHouse/issues/18495). [#19371](https://github.com/ClickHouse/ClickHouse/pull/19371) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Function `formatDateTime` support the `%Q` modification to format date to quarter. [#19224](https://github.com/ClickHouse/ClickHouse/pull/19224) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Support MetaKey+Enter hotkey binding in play UI. [#19012](https://github.com/ClickHouse/ClickHouse/pull/19012) ([sundyli](https://github.com/sundy-li)). +* Add three functions for map data type: 1. `mapContains(map, key)` to check weather map.keys include the second parameter key. 2. `mapKeys(map)` return all the keys in Array format 3. `mapValues(map)` return all the values in Array format. [#18788](https://github.com/ClickHouse/ClickHouse/pull/18788) ([hexiaoting](https://github.com/hexiaoting)). +* Add `log_comment` setting related to [#18494](https://github.com/ClickHouse/ClickHouse/issues/18494). [#18549](https://github.com/ClickHouse/ClickHouse/pull/18549) ([Zijie Lu](https://github.com/TszKitLo40)). +* Add support of tuple argument to `argMin` and `argMax` functions. [#17359](https://github.com/ClickHouse/ClickHouse/pull/17359) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `EXISTS VIEW` syntax. [#18552](https://github.com/ClickHouse/ClickHouse/pull/18552) ([Du Chuan](https://github.com/spongedu)). +* Add `SELECT ALL` syntax. closes [#18706](https://github.com/ClickHouse/ClickHouse/issues/18706). [#18723](https://github.com/ClickHouse/ClickHouse/pull/18723) ([flynn](https://github.com/ucasFL)). + +#### Performance Improvement + +* Faster parts removal by lowering the number of `stat` syscalls. This returns the optimization that existed while ago. More safe interface of `IDisk`. This closes [#19065](https://github.com/ClickHouse/ClickHouse/issues/19065). [#19086](https://github.com/ClickHouse/ClickHouse/pull/19086) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Aliases declared in `WITH` statement are properly used in index analysis. Queries like `WITH column AS alias SELECT ... WHERE alias = ...` may use index now. [#18896](https://github.com/ClickHouse/ClickHouse/pull/18896) ([Amos Bird](https://github.com/amosbird)). +* Add `optimize_alias_column_prediction` (on by default), that will: - Respect aliased columns in WHERE during partition pruning and skipping data using secondary indexes; - Respect aliased columns in WHERE for trivial count queries for optimize_trivial_count; - Respect aliased columns in GROUP BY/ORDER BY for optimize_aggregation_in_order/optimize_read_in_order. [#16995](https://github.com/ClickHouse/ClickHouse/pull/16995) ([sundyli](https://github.com/sundy-li)). +* Speed up aggregate function `sum`. Improvement only visible on synthetic benchmarks and not very practical. [#19216](https://github.com/ClickHouse/ClickHouse/pull/19216) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update libc++ and use another ABI to provide better performance. [#18914](https://github.com/ClickHouse/ClickHouse/pull/18914) ([Danila Kutenin](https://github.com/danlark1)). +* Rewrite `sumIf()` and `sum(if())` function to `countIf()` function when logically equivalent. [#17041](https://github.com/ClickHouse/ClickHouse/pull/17041) ([flynn](https://github.com/ucasFL)). +* Use a connection pool for S3 connections, controlled by the `s3_max_connections` settings. [#13405](https://github.com/ClickHouse/ClickHouse/pull/13405) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add support for zstd long option for better compression of string columns to save space. [#17184](https://github.com/ClickHouse/ClickHouse/pull/17184) ([ygrek](https://github.com/ygrek)). +* Slightly improve server latency by removing access to configuration on every connection. [#19863](https://github.com/ClickHouse/ClickHouse/pull/19863) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce lock contention for multiple layers of the `Buffer` engine. [#19379](https://github.com/ClickHouse/ClickHouse/pull/19379) ([Azat Khuzhin](https://github.com/azat)). +* Support splitting `Filter` step of query plan into `Expression + Filter` pair. Together with `Expression + Expression` merging optimization ([#17458](https://github.com/ClickHouse/ClickHouse/issues/17458)) it may delay execution for some expressions after `Filter` step. [#19253](https://github.com/ClickHouse/ClickHouse/pull/19253) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Improvement + +* `SELECT count() FROM table` now can be executed if only one any column can be selected from the `table`. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* Set charset to `utf8mb4` when interacting with remote MySQL servers. Fixes [#19795](https://github.com/ClickHouse/ClickHouse/issues/19795). [#19800](https://github.com/ClickHouse/ClickHouse/pull/19800) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `S3` table function now supports `auto` compression mode (autodetect). This closes [#18754](https://github.com/ClickHouse/ClickHouse/issues/18754). [#19793](https://github.com/ClickHouse/ClickHouse/pull/19793) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Correctly output infinite arguments for `formatReadableTimeDelta` function. In previous versions, there was implicit conversion to implementation specific integer value. [#19791](https://github.com/ClickHouse/ClickHouse/pull/19791) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Table function `S3` will use global region if the region can't be determined exactly. This closes [#10998](https://github.com/ClickHouse/ClickHouse/issues/10998). [#19750](https://github.com/ClickHouse/ClickHouse/pull/19750) ([Vladimir Chebotarev](https://github.com/excitoon)). +* In distributed queries if the setting `async_socket_for_remote` is enabled, it was possible to get stack overflow at least in debug build configuration if very deeply nested data type is used in table (e.g. `Array(Array(Array(...more...)))`). This fixes [#19108](https://github.com/ClickHouse/ClickHouse/issues/19108). This change introduces minor backward incompatibility: excessive parenthesis in type definitions no longer supported, example: `Array((UInt8))`. [#19736](https://github.com/ClickHouse/ClickHouse/pull/19736) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add separate pool for message brokers (RabbitMQ and Kafka). [#19722](https://github.com/ClickHouse/ClickHouse/pull/19722) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare `max_number_of_merges_with_ttl_in_pool` limit overrun (more merges with TTL can be assigned) for non-replicated MergeTree. [#19708](https://github.com/ClickHouse/ClickHouse/pull/19708) ([alesapin](https://github.com/alesapin)). +* Dictionary: better error message during attribute parsing. [#19678](https://github.com/ClickHouse/ClickHouse/pull/19678) ([Maksim Kita](https://github.com/kitaisreal)). +* Add an option to disable validation of checksums on reading. Should never be used in production. Please do not expect any benefits in disabling it. It may only be used for experiments and benchmarks. The setting only applicable for tables of MergeTree family. Checksums are always validated for other table engines and when receiving data over network. In my observations there is no performance difference or it is less than 0.5%. [#19588](https://github.com/ClickHouse/ClickHouse/pull/19588) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support constant result in function `multiIf`. [#19533](https://github.com/ClickHouse/ClickHouse/pull/19533) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable function length/empty/notEmpty for datatype Map, which returns keys number in Map. [#19530](https://github.com/ClickHouse/ClickHouse/pull/19530) ([taiyang-li](https://github.com/taiyang-li)). +* Add `--reconnect` option to `clickhouse-benchmark`. When this option is specified, it will reconnect before every request. This is needed for testing. [#19872](https://github.com/ClickHouse/ClickHouse/pull/19872) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support using the new location of `.debug` file. This fixes [#19348](https://github.com/ClickHouse/ClickHouse/issues/19348). [#19520](https://github.com/ClickHouse/ClickHouse/pull/19520) ([Amos Bird](https://github.com/amosbird)). +* `toIPv6` function parses `IPv4` addresses. [#19518](https://github.com/ClickHouse/ClickHouse/pull/19518) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `http_referer` field to `system.query_log`, `system.processes`, etc. This closes [#19389](https://github.com/ClickHouse/ClickHouse/issues/19389). [#19390](https://github.com/ClickHouse/ClickHouse/pull/19390) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve MySQL compatibility by making more functions case insensitive and adding aliases. [#19387](https://github.com/ClickHouse/ClickHouse/pull/19387) ([Daniil Kondratyev](https://github.com/dankondr)). +* Add metrics for MergeTree parts (Wide/Compact/InMemory) types. [#19381](https://github.com/ClickHouse/ClickHouse/pull/19381) ([Azat Khuzhin](https://github.com/azat)). +* Allow docker to be executed with arbitrary uid. [#19374](https://github.com/ClickHouse/ClickHouse/pull/19374) ([filimonov](https://github.com/filimonov)). +* Fix wrong alignment of values of `IPv4` data type in Pretty formats. They were aligned to the right, not to the left. This closes [#19184](https://github.com/ClickHouse/ClickHouse/issues/19184). [#19339](https://github.com/ClickHouse/ClickHouse/pull/19339) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow change `max_server_memory_usage` without restart. This closes [#18154](https://github.com/ClickHouse/ClickHouse/issues/18154). [#19186](https://github.com/ClickHouse/ClickHouse/pull/19186) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The exception when function `bar` is called with certain NaN argument may be slightly misleading in previous versions. This fixes [#19088](https://github.com/ClickHouse/ClickHouse/issues/19088). [#19107](https://github.com/ClickHouse/ClickHouse/pull/19107) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). +* Fixed `PeekableReadBuffer: Memory limit exceed` error when inserting data with huge strings. Fixes [#18690](https://github.com/ClickHouse/ClickHouse/issues/18690). [#18979](https://github.com/ClickHouse/ClickHouse/pull/18979) ([tavplubix](https://github.com/tavplubix)). +* Docker image: several improvements for clickhouse-server entrypoint. [#18954](https://github.com/ClickHouse/ClickHouse/pull/18954) ([filimonov](https://github.com/filimonov)). +* Add `normalizeQueryKeepNames` and `normalizedQueryHashKeepNames` to normalize queries without masking long names with `?`. This helps better analyze complex query logs. [#18910](https://github.com/ClickHouse/ClickHouse/pull/18910) ([Amos Bird](https://github.com/amosbird)). +* Check per-block checksum of the distributed batch on the sender before sending (without reading the file twice, the checksums will be verified while reading), this will avoid stuck of the INSERT on the receiver (on truncated .bin file on the sender). Avoid reading .bin files twice for batched INSERT (it was required to calculate rows/bytes to take squashing into account, now this information included into the header, backward compatible is preserved). [#18853](https://github.com/ClickHouse/ClickHouse/pull/18853) ([Azat Khuzhin](https://github.com/azat)). +* Fix issues with RIGHT and FULL JOIN of tables with aggregate function states. In previous versions exception about `cloneResized` method was thrown. [#18818](https://github.com/ClickHouse/ClickHouse/pull/18818) ([templarzq](https://github.com/templarzq)). +* Added prefix-based S3 endpoint settings. [#18812](https://github.com/ClickHouse/ClickHouse/pull/18812) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add [UInt8, UInt16, UInt32, UInt64] arguments types support for bitmapTransform, bitmapSubsetInRange, bitmapSubsetLimit, bitmapContains functions. This closes [#18713](https://github.com/ClickHouse/ClickHouse/issues/18713). [#18791](https://github.com/ClickHouse/ClickHouse/pull/18791) ([sundyli](https://github.com/sundy-li)). +* Allow CTE (Common Table Expressions) to be further aliased. Propagate CSE (Common Subexpressions Elimination) to subqueries in the same level when `enable_global_with_statement = 1`. This fixes [#17378](https://github.com/ClickHouse/ClickHouse/issues/17378) . This fixes https://github.com/ClickHouse/ClickHouse/pull/16575#issuecomment-753416235 . [#18684](https://github.com/ClickHouse/ClickHouse/pull/18684) ([Amos Bird](https://github.com/amosbird)). +* Update librdkafka to v1.6.0-RC2. Fixes [#18668](https://github.com/ClickHouse/ClickHouse/issues/18668). [#18671](https://github.com/ClickHouse/ClickHouse/pull/18671) ([filimonov](https://github.com/filimonov)). +* In case of unexpected exceptions automatically restart background thread which is responsible for execution of distributed DDL queries. Fixes [#17991](https://github.com/ClickHouse/ClickHouse/issues/17991). [#18285](https://github.com/ClickHouse/ClickHouse/pull/18285) ([徐炘](https://github.com/weeds085490)). +* Updated AWS C++ SDK in order to utilize global regions in S3. [#17870](https://github.com/ClickHouse/ClickHouse/pull/17870) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Added support for `WITH ... [AND] [PERIODIC] REFRESH [interval_in_sec]` clause when creating `LIVE VIEW` tables. [#14822](https://github.com/ClickHouse/ClickHouse/pull/14822) ([vzakaznikov](https://github.com/vzakaznikov)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). + +#### Bug Fix + +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix starting the server with tables having default expressions containing dictGet(). Allow getting return type of dictGet() without loading dictionary. [#19805](https://github.com/ClickHouse/ClickHouse/pull/19805) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix server crash after query with `if` function with `Tuple` type of then/else branches result. `Tuple` type must contain `Array` or another complex type. Fixes [#18356](https://github.com/ClickHouse/ClickHouse/issues/18356). [#20133](https://github.com/ClickHouse/ClickHouse/pull/20133) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix replication for statements that update several tables. [#20066](https://github.com/ClickHouse/ClickHouse/pull/20066) ([Håvard Kvålen](https://github.com/havardk)). +* Prevent "Connection refused" in docker during initialization script execution. [#20012](https://github.com/ClickHouse/ClickHouse/pull/20012) ([filimonov](https://github.com/filimonov)). +* `EmbeddedRocksDB` is an experimental storage. Fix the issue with lack of proper type checking. Simplified code. This closes [#19967](https://github.com/ClickHouse/ClickHouse/issues/19967). [#19972](https://github.com/ClickHouse/ClickHouse/pull/19972) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix a segfault in function `fromModifiedJulianDay` when the argument type is `Nullable(T)` for any integral types other than Int32. [#19959](https://github.com/ClickHouse/ClickHouse/pull/19959) ([PHO](https://github.com/depressed-pho)). +* The function `greatCircleAngle` returned inaccurate results in previous versions. This closes [#19769](https://github.com/ClickHouse/ClickHouse/issues/19769). [#19789](https://github.com/ClickHouse/ClickHouse/pull/19789) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix rare bug when some replicated operations (like mutation) cannot process some parts after data corruption. Fixes [#19593](https://github.com/ClickHouse/ClickHouse/issues/19593). [#19702](https://github.com/ClickHouse/ClickHouse/pull/19702) ([alesapin](https://github.com/alesapin)). +* Background thread which executes `ON CLUSTER` queries might hang waiting for dropped replicated table to do something. It's fixed. [#19684](https://github.com/ClickHouse/ClickHouse/pull/19684) ([yiguolei](https://github.com/yiguolei)). +* Fix wrong deserialization of columns description. It makes INSERT into a table with a column named `\` impossible. [#19479](https://github.com/ClickHouse/ClickHouse/pull/19479) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Mark distributed batch as broken in case of empty data block in one of files. [#19449](https://github.com/ClickHouse/ClickHouse/pull/19449) ([Azat Khuzhin](https://github.com/azat)). +* Fixed very rare bug that might cause mutation to hang after `DROP/DETACH/REPLACE/MOVE PARTITION`. It was partially fixed by [#15537](https://github.com/ClickHouse/ClickHouse/issues/15537) for the most cases. [#19443](https://github.com/ClickHouse/ClickHouse/pull/19443) ([tavplubix](https://github.com/tavplubix)). +* Fix possible error `Extremes transform was already added to pipeline`. Fixes [#14100](https://github.com/ClickHouse/ClickHouse/issues/14100). [#19430](https://github.com/ClickHouse/ClickHouse/pull/19430) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix default value in join types with non-zero default (e.g. some Enums). Closes [#18197](https://github.com/ClickHouse/ClickHouse/issues/18197). [#19360](https://github.com/ClickHouse/ClickHouse/pull/19360) ([vdimir](https://github.com/vdimir)). +* Do not mark file for distributed send as broken on EOF. [#19290](https://github.com/ClickHouse/ClickHouse/pull/19290) ([Azat Khuzhin](https://github.com/azat)). +* Fix leaking of pipe fd for `async_socket_for_remote`. [#19153](https://github.com/ClickHouse/ClickHouse/pull/19153) ([Azat Khuzhin](https://github.com/azat)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix issue in merge tree data writer which can lead to marks with bigger size than fixed granularity size. Fixes [#18913](https://github.com/ClickHouse/ClickHouse/issues/18913). [#19123](https://github.com/ClickHouse/ClickHouse/pull/19123) ([alesapin](https://github.com/alesapin)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Simplify the implementation of `tupleHammingDistance`. Support for tuples of any equal length. Fixes [#19029](https://github.com/ClickHouse/ClickHouse/issues/19029). [#19084](https://github.com/ClickHouse/ClickHouse/pull/19084) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix minor issue in JOIN: Join tries to materialize const columns, but our code waits for them in other places. [#18982](https://github.com/ClickHouse/ClickHouse/pull/18982) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible exception `QueryPipeline stream: different number of columns` caused by merging of query plan's `Expression` steps. Fixes [#18190](https://github.com/ClickHouse/ClickHouse/issues/18190). [#18980](https://github.com/ClickHouse/ClickHouse/pull/18980) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fixed rare crashes when server run out of memory. [#18976](https://github.com/ClickHouse/ClickHouse/pull/18976) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect behavior when `ALTER TABLE ... DROP PART 'part_name'` query removes all deduplication blocks for the whole partition. Fixes [#18874](https://github.com/ClickHouse/ClickHouse/issues/18874). [#18969](https://github.com/ClickHouse/ClickHouse/pull/18969) ([alesapin](https://github.com/alesapin)). +* Fixed issue [#18894](https://github.com/ClickHouse/ClickHouse/issues/18894) Add a check to avoid exception when long column alias('table.column' style, usually auto-generated by BI tools like Looker) equals to long table name. [#18968](https://github.com/ClickHouse/ClickHouse/pull/18968) ([Daniel Qin](https://github.com/mathfool)). +* Fix error `Task was not found in task queue` (possible only for remote queries, with `async_socket_for_remote = 1`). [#18964](https://github.com/ClickHouse/ClickHouse/pull/18964) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when mutation with some escaped text (like `ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')` serialized incorrectly. Fixes [#18878](https://github.com/ClickHouse/ClickHouse/issues/18878). [#18944](https://github.com/ClickHouse/ClickHouse/pull/18944) ([alesapin](https://github.com/alesapin)). +* ATTACH PARTITION will reset mutations. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix issue with `bitmapOrCardinality` that may lead to nullptr dereference. This closes [#18911](https://github.com/ClickHouse/ClickHouse/issues/18911). [#18912](https://github.com/ClickHouse/ClickHouse/pull/18912) ([sundyli](https://github.com/sundy-li)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix data type convert issue for MySQL engine. [#18124](https://github.com/ClickHouse/ClickHouse/pull/18124) ([bo zeng](https://github.com/mis98zb)). +* Fix clickhouse-client abort exception while executing only `select`. [#19790](https://github.com/ClickHouse/ClickHouse/pull/19790) ([taiyang-li](https://github.com/taiyang-li)). + + +#### Build/Testing/Packaging Improvement + +* Run [SQLancer](https://twitter.com/RiggerManuel/status/1352345625480884228) (logical SQL fuzzer) in CI. [#19006](https://github.com/ClickHouse/ClickHouse/pull/19006) ([Ilya Yatsishin](https://github.com/qoega)). +* Query Fuzzer will fuzz newly added tests more extensively. This closes [#18916](https://github.com/ClickHouse/ClickHouse/issues/18916). [#19185](https://github.com/ClickHouse/ClickHouse/pull/19185) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Integrate with [Big List of Naughty Strings](https://github.com/minimaxir/big-list-of-naughty-strings/) for better fuzzing. [#19480](https://github.com/ClickHouse/ClickHouse/pull/19480) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add integration tests run with MSan. [#18974](https://github.com/ClickHouse/ClickHouse/pull/18974) ([alesapin](https://github.com/alesapin)). +* Fixed MemorySanitizer errors in cyrus-sasl and musl. [#19821](https://github.com/ClickHouse/ClickHouse/pull/19821) ([Ilya Yatsishin](https://github.com/qoega)). +* Insuffiient arguments check in `positionCaseInsensitiveUTF8` function triggered address sanitizer. [#19720](https://github.com/ClickHouse/ClickHouse/pull/19720) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove --project-directory for docker-compose in integration test. Fix logs formatting from docker container. [#19706](https://github.com/ClickHouse/ClickHouse/pull/19706) ([Ilya Yatsishin](https://github.com/qoega)). +* Made generation of macros.xml easier for integration tests. No more excessive logging from dicttoxml. dicttoxml project is not active for 5+ years. [#19697](https://github.com/ClickHouse/ClickHouse/pull/19697) ([Ilya Yatsishin](https://github.com/qoega)). +* Allow to explicitly enable or disable watchdog via environment variable `CLICKHOUSE_WATCHDOG_ENABLE`. By default it is enabled if server is not attached to terminal. [#19522](https://github.com/ClickHouse/ClickHouse/pull/19522) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow building ClickHouse with Kafka support on arm64. [#19369](https://github.com/ClickHouse/ClickHouse/pull/19369) ([filimonov](https://github.com/filimonov)). +* Allow building librdkafka without ssl. [#19337](https://github.com/ClickHouse/ClickHouse/pull/19337) ([filimonov](https://github.com/filimonov)). +* Restore Kafka input in FreeBSD builds. [#18924](https://github.com/ClickHouse/ClickHouse/pull/18924) ([Alexandre Snarskii](https://github.com/snar)). +* Fix potential nullptr dereference in table function `VALUES`. [#19357](https://github.com/ClickHouse/ClickHouse/pull/19357) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid UBSan reports in `arrayElement` function, `substring` and `arraySum`. Fixes [#19305](https://github.com/ClickHouse/ClickHouse/issues/19305). Fixes [#19287](https://github.com/ClickHouse/ClickHouse/issues/19287). This closes [#19336](https://github.com/ClickHouse/ClickHouse/issues/19336). [#19347](https://github.com/ClickHouse/ClickHouse/pull/19347) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +## ClickHouse release 21.1 + +### ClickHouse release v21.1.3.32-stable, 2021-02-03 + +#### Bug Fix + +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash when pushing down predicates to union distinct subquery. This fixes [#19855](https://github.com/ClickHouse/ClickHouse/issues/19855). [#19861](https://github.com/ClickHouse/ClickHouse/pull/19861) ([Amos Bird](https://github.com/amosbird)). +* Fix filtering by UInt8 greater than 127. [#19799](https://github.com/ClickHouse/ClickHouse/pull/19799) ([Anton Popov](https://github.com/CurtizJ)). +* In previous versions, unusual arguments for function arrayEnumerateUniq may cause crash or infinite loop. This closes [#19787](https://github.com/ClickHouse/ClickHouse/issues/19787). [#19788](https://github.com/ClickHouse/ClickHouse/pull/19788) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed stack overflow when using accurate comparison of arithmetic type with string type. [#19773](https://github.com/ClickHouse/ClickHouse/pull/19773) ([tavplubix](https://github.com/tavplubix)). +* Fix crash when nested column name was used in `WHERE` or `PREWHERE`. Fixes [#19755](https://github.com/ClickHouse/ClickHouse/issues/19755). [#19763](https://github.com/ClickHouse/ClickHouse/pull/19763) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault in `bitmapAndnot` function. Fixes [#19668](https://github.com/ClickHouse/ClickHouse/issues/19668). [#19713](https://github.com/ClickHouse/ClickHouse/pull/19713) ([Maksim Kita](https://github.com/kitaisreal)). +* Some functions with big integers may cause segfault. Big integers is experimental feature. This closes [#19667](https://github.com/ClickHouse/ClickHouse/issues/19667). [#19672](https://github.com/ClickHouse/ClickHouse/pull/19672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of function `neighbor` for `LowCardinality` argument. Fixes [#10333](https://github.com/ClickHouse/ClickHouse/issues/10333). [#19617](https://github.com/ClickHouse/ClickHouse/pull/19617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use-after-free of the CompressedWriteBuffer in Connection after disconnect. [#19599](https://github.com/ClickHouse/ClickHouse/pull/19599) ([Azat Khuzhin](https://github.com/azat)). +* `DROP/DETACH TABLE table ON CLUSTER cluster SYNC` query might hang, it's fixed. Fixes [#19568](https://github.com/ClickHouse/ClickHouse/issues/19568). [#19572](https://github.com/ClickHouse/ClickHouse/pull/19572) ([tavplubix](https://github.com/tavplubix)). +* Query CREATE DICTIONARY id expression fix. [#19571](https://github.com/ClickHouse/ClickHouse/pull/19571) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix SIGSEGV with merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX. [#19528](https://github.com/ClickHouse/ClickHouse/pull/19528) ([Azat Khuzhin](https://github.com/azat)). +* Buffer overflow (on memory read) was possible if `addMonth` function was called with specifically crafted arguments. This fixes [#19441](https://github.com/ClickHouse/ClickHouse/issues/19441). This fixes [#19413](https://github.com/ClickHouse/ClickHouse/issues/19413). [#19472](https://github.com/ClickHouse/ClickHouse/pull/19472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Uninitialized memory read was possible in encrypt/decrypt functions if empty string was passed as IV. This closes [#19391](https://github.com/ClickHouse/ClickHouse/issues/19391). [#19397](https://github.com/ClickHouse/ClickHouse/pull/19397) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible buffer overflow in Uber H3 library. See https://github.com/uber/h3/issues/392. This closes [#19219](https://github.com/ClickHouse/ClickHouse/issues/19219). [#19383](https://github.com/ClickHouse/ClickHouse/pull/19383) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix system.parts _state column (LOGICAL_ERROR when querying this column, due to incorrect order). [#19346](https://github.com/ClickHouse/ClickHouse/pull/19346) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible wrong result or segfault on aggregation when Materialized View and its target table have different structure. Fixes [#18063](https://github.com/ClickHouse/ClickHouse/issues/18063). [#19322](https://github.com/ClickHouse/ClickHouse/pull/19322) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot convert column now64() because it is constant but values of constants are different in source and result`. Continuation of [#7156](https://github.com/ClickHouse/ClickHouse/issues/7156). [#19316](https://github.com/ClickHouse/ClickHouse/pull/19316) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when concurrent `ALTER` and `DROP` queries may hang while processing ReplicatedMergeTree table. [#19237](https://github.com/ClickHouse/ClickHouse/pull/19237) ([alesapin](https://github.com/alesapin)). +* Fixed `There is no checkpoint` error when inserting data through http interface using `Template` or `CustomSeparated` format. Fixes [#19021](https://github.com/ClickHouse/ClickHouse/issues/19021). [#19072](https://github.com/ClickHouse/ClickHouse/pull/19072) ([tavplubix](https://github.com/tavplubix)). +* Disable constant folding for subqueries on the analysis stage, when the result cannot be calculated. [#18446](https://github.com/ClickHouse/ClickHouse/pull/18446) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). + + + +### ClickHouse release v21.1.2.15-stable 2021-01-18 + +#### Backward Incompatible Change + +* The setting `input_format_null_as_default` is enabled by default. [#17525](https://github.com/ClickHouse/ClickHouse/pull/17525) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check settings constraints for profile settings from config. Server will fail to start if users.xml contain settings that do not meet corresponding constraints. [#18486](https://github.com/ClickHouse/ClickHouse/pull/18486) ([tavplubix](https://github.com/tavplubix)). +* Restrict `ALTER MODIFY SETTING` from changing storage settings that affects data parts (`write_final_mark` and `enable_mixed_granularity_parts`). [#18306](https://github.com/ClickHouse/ClickHouse/pull/18306) ([Amos Bird](https://github.com/amosbird)). +* Set `insert_quorum_parallel` to 1 by default. It is significantly more convenient to use than "sequential" quorum inserts. But if you rely to sequential consistency, you should set the setting back to zero. [#17567](https://github.com/ClickHouse/ClickHouse/pull/17567) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `sumburConsistentHash` function. This closes [#18120](https://github.com/ClickHouse/ClickHouse/issues/18120). [#18656](https://github.com/ClickHouse/ClickHouse/pull/18656) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Removed aggregate functions `timeSeriesGroupSum`, `timeSeriesGroupRateSum` because a friend of mine said they never worked. This fixes [#16869](https://github.com/ClickHouse/ClickHouse/issues/16869). If you have luck using these functions, write a email to feedback@clickhouse.com. [#17423](https://github.com/ClickHouse/ClickHouse/pull/17423) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prohibit toUnixTimestamp(Date()) (before it just returns UInt16 representation of Date). [#17376](https://github.com/ClickHouse/ClickHouse/pull/17376) ([Azat Khuzhin](https://github.com/azat)). +* Allow using extended integer types (`Int128`, `Int256`, `UInt256`) in `avg` and `avgWeighted` functions. Also allow using different types (integer, decimal, floating point) for value and for weight in `avgWeighted` function. This is a backward-incompatible change: now the `avg` and `avgWeighted` functions always return `Float64` (as documented). Before this change the return type for `Decimal` arguments was also `Decimal`. [#15419](https://github.com/ClickHouse/ClickHouse/pull/15419) ([Mike](https://github.com/myrrc)). +* Expression `toUUID(N)` no longer works. Replace with `toUUID('00000000-0000-0000-0000-000000000000')`. This change is motivated by non-obvious results of `toUUID(N)` where N is non zero. +* SSL Certificates with incorrect "key usage" are rejected. In previous versions they are used to work. See [#19262](https://github.com/ClickHouse/ClickHouse/issues/19262). +* `incl` references to substitutions file (`/etc/metrika.xml`) were removed from the default config (``, ``, ``, ``, ``). If you were using substitutions file and were relying on those implicit references, you should put them back manually and explicitly by adding corresponding sections with `incl="..."` attributes before the update. See [#18740](https://github.com/ClickHouse/ClickHouse/pull/18740) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Implement gRPC protocol in ClickHouse. [#15111](https://github.com/ClickHouse/ClickHouse/pull/15111) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow to use multiple zookeeper clusters. [#17070](https://github.com/ClickHouse/ClickHouse/pull/17070) ([fastio](https://github.com/fastio)). +* Implemented `REPLACE TABLE` and `CREATE OR REPLACE TABLE` queries. [#18521](https://github.com/ClickHouse/ClickHouse/pull/18521) ([tavplubix](https://github.com/tavplubix)). +* Implement `UNION DISTINCT` and treat the plain `UNION` clause as `UNION DISTINCT` by default. Add a setting `union_default_mode` that allows to treat it as `UNION ALL` or require explicit mode specification. [#16338](https://github.com/ClickHouse/ClickHouse/pull/16338) ([flynn](https://github.com/ucasFL)). +* Added function `accurateCastOrNull`. This closes [#10290](https://github.com/ClickHouse/ClickHouse/issues/10290). Add type conversions in `x IN (subquery)` expressions. This closes [#10266](https://github.com/ClickHouse/ClickHouse/issues/10266). [#16724](https://github.com/ClickHouse/ClickHouse/pull/16724) ([Maksim Kita](https://github.com/kitaisreal)). +* IP Dictionary supports `IPv4` / `IPv6` types directly. [#17571](https://github.com/ClickHouse/ClickHouse/pull/17571) ([vdimir](https://github.com/vdimir)). +* IP Dictionary supports key fetching. Resolves [#18241](https://github.com/ClickHouse/ClickHouse/issues/18241). [#18480](https://github.com/ClickHouse/ClickHouse/pull/18480) ([vdimir](https://github.com/vdimir)). +* Add `*.zst` compression/decompression support for data import and export. It enables using `*.zst` in `file()` function and `Content-encoding: zstd` in HTTP client. This closes [#16791 ](https://github.com/ClickHouse/ClickHouse/issues/16791). [#17144](https://github.com/ClickHouse/ClickHouse/pull/17144) ([Abi Palagashvili](https://github.com/fibersel)). +* Added `mannWitneyUTest`, `studentTTest` and `welchTTest` aggregate functions. Refactored `rankCorr` a bit. [#16883](https://github.com/ClickHouse/ClickHouse/pull/16883) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add functions `countMatches`/`countMatchesCaseInsensitive`. [#17459](https://github.com/ClickHouse/ClickHouse/pull/17459) ([Azat Khuzhin](https://github.com/azat)). +* Implement `countSubstrings()`/`countSubstringsCaseInsensitive()`/`countSubstringsCaseInsensitiveUTF8()` (Count the number of substring occurrences). [#17347](https://github.com/ClickHouse/ClickHouse/pull/17347) ([Azat Khuzhin](https://github.com/azat)). +* Add information about used databases, tables and columns in system.query_log. Add `query_kind` and `normalized_query_hash` fields. [#17726](https://github.com/ClickHouse/ClickHouse/pull/17726) ([Amos Bird](https://github.com/amosbird)). +* Add a setting `optimize_on_insert`. When enabled, do the same transformation for INSERTed block of data as if merge was done on this block (e.g. Replacing, Collapsing, Aggregating...). This setting is enabled by default. This can influence Materialized View and MaterializeMySQL behaviour (see detailed description). This closes [#10683](https://github.com/ClickHouse/ClickHouse/issues/10683). [#16954](https://github.com/ClickHouse/ClickHouse/pull/16954) ([Kruglov Pavel](https://github.com/Avogar)). +* Kerberos Authenticaiton for HDFS. [#16621](https://github.com/ClickHouse/ClickHouse/pull/16621) ([Ilya Golshtein](https://github.com/ilejn)). +* Support `SHOW SETTINGS` statement to show parameters in system.settings. `SHOW CHANGED SETTINGS` and `LIKE/ILIKE` clause are also supported. [#18056](https://github.com/ClickHouse/ClickHouse/pull/18056) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Function `position` now supports `POSITION(needle IN haystack)` synax for SQL compatibility. This closes [#18701](https://github.com/ClickHouse/ClickHouse/issues/18701). ... [#18779](https://github.com/ClickHouse/ClickHouse/pull/18779) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Now we have a new storage setting `max_partitions_to_read` for tables in the MergeTree family. It limits the max number of partitions that can be accessed in one query. A user setting `force_max_partition_limit` is also added to enforce this constraint. [#18712](https://github.com/ClickHouse/ClickHouse/pull/18712) ([Amos Bird](https://github.com/amosbird)). +* Add `query_id` column to `system.part_log` for inserted parts. Closes [#10097](https://github.com/ClickHouse/ClickHouse/issues/10097). [#18644](https://github.com/ClickHouse/ClickHouse/pull/18644) ([flynn](https://github.com/ucasFL)). +* Allow create table as select with columns specification. Example `CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;`. [#18060](https://github.com/ClickHouse/ClickHouse/pull/18060) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `arrayMin`, `arrayMax`, `arrayAvg` aggregation functions. [#18032](https://github.com/ClickHouse/ClickHouse/pull/18032) ([Maksim Kita](https://github.com/kitaisreal)). +* Implemented `ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...` query. It creates new table with provided structure and attaches table data from provided directory in `user_files`. [#17903](https://github.com/ClickHouse/ClickHouse/pull/17903) ([tavplubix](https://github.com/tavplubix)). +* Add mutation support for StorageMemory. This closes [#9117](https://github.com/ClickHouse/ClickHouse/issues/9117). [#15127](https://github.com/ClickHouse/ClickHouse/pull/15127) ([flynn](https://github.com/ucasFL)). +* Support syntax `EXISTS DATABASE name`. [#18458](https://github.com/ClickHouse/ClickHouse/pull/18458) ([Du Chuan](https://github.com/spongedu)). +* Support builtin function `isIPv4String` && `isIPv6String` like [MySQL](https://github.com/ClickHouse/ClickHouse/compare/master...spongedu:support_is_ipv4?expand=1). [#18349](https://github.com/ClickHouse/ClickHouse/pull/18349) ([Du Chuan](https://github.com/spongedu)). +* Add a new setting `insert_distributed_one_random_shard = 1` to allow insertion into multi-sharded distributed table without any distributed key. [#18294](https://github.com/ClickHouse/ClickHouse/pull/18294) ([Amos Bird](https://github.com/amosbird)). +* Add settings `min_compress_block_size` and `max_compress_block_size` to MergeTreeSettings, which have higher priority than the global settings and take effect when they are set. close [13890](https://github.com/ClickHouse/ClickHouse/issues/13890). [#17867](https://github.com/ClickHouse/ClickHouse/pull/17867) ([flynn](https://github.com/ucasFL)). +* Add support for 64bit roaring bitmaps. [#17858](https://github.com/ClickHouse/ClickHouse/pull/17858) ([Andy Yang](https://github.com/andyyzh)). +* Extended `OPTIMIZE ... DEDUPLICATE` syntax to allow explicit (or implicit with asterisk/column transformers) list of columns to check for duplicates on. ... [#17846](https://github.com/ClickHouse/ClickHouse/pull/17846) ([Vasily Nemkov](https://github.com/Enmk)). +* Added functions `toModifiedJulianDay`, `fromModifiedJulianDay`, `toModifiedJulianDayOrNull`, and `fromModifiedJulianDayOrNull`. These functions convert between Proleptic Gregorian calendar date and Modified Julian Day number. [#17750](https://github.com/ClickHouse/ClickHouse/pull/17750) ([PHO](https://github.com/depressed-pho)). +* Add ability to use custom TLD list: added functions `firstSignificantSubdomainCustom`, `cutToFirstSignificantSubdomainCustom`. [#17748](https://github.com/ClickHouse/ClickHouse/pull/17748) ([Azat Khuzhin](https://github.com/azat)). +* Add support for `PROXYv1` protocol to wrap native TCP interface. Allow quotas to be keyed by proxy-forwarded IP address (applied for `PROXYv1` address and for `X-Forwarded-For` from HTTP interface). This is useful when you provide access to ClickHouse only via trusted proxy (e.g. CloudFlare) but want to account user resources by their original IP addresses. This fixes [#17268](https://github.com/ClickHouse/ClickHouse/issues/17268). [#17707](https://github.com/ClickHouse/ClickHouse/pull/17707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-client supports opening `EDITOR` to edit commands. `Alt-Shift-E`. [#17665](https://github.com/ClickHouse/ClickHouse/pull/17665) ([Amos Bird](https://github.com/amosbird)). +* Add function `encodeXMLComponent` to escape characters to place string into XML text node or attribute. [#17659](https://github.com/ClickHouse/ClickHouse/pull/17659) ([nauta](https://github.com/nautaa)). +* Introduce `DETACH TABLE/VIEW ... PERMANENTLY` syntax, so that after restarting the table does not reappear back automatically on restart (only by explicit request). The table can still be attached back using the short syntax ATTACH TABLE. Implements [#5555](https://github.com/ClickHouse/ClickHouse/issues/5555). Fixes [#13850](https://github.com/ClickHouse/ClickHouse/issues/13850). [#17642](https://github.com/ClickHouse/ClickHouse/pull/17642) ([filimonov](https://github.com/filimonov)). +* Add asynchronous metrics on total amount of rows, bytes and parts in MergeTree tables. This fix [#11714](https://github.com/ClickHouse/ClickHouse/issues/11714). [#17639](https://github.com/ClickHouse/ClickHouse/pull/17639) ([flynn](https://github.com/ucasFL)). +* Add settings `limit` and `offset` for out-of-SQL pagination: [#16176](https://github.com/ClickHouse/ClickHouse/issues/16176) They are useful for building APIs. These two settings will affect SELECT query as if it is added like `select * from (your_original_select_query) t limit xxx offset xxx;`. [#17633](https://github.com/ClickHouse/ClickHouse/pull/17633) ([hexiaoting](https://github.com/hexiaoting)). +* Provide a new aggregator combinator : `-SimpleState` to build `SimpleAggregateFunction` types via query. It's useful for defining MaterializedView of AggregatingMergeTree engine, and will benefit projections too. [#16853](https://github.com/ClickHouse/ClickHouse/pull/16853) ([Amos Bird](https://github.com/amosbird)). +* Added `queries-file` parameter for `clickhouse-client` and `clickhouse-local`. [#15930](https://github.com/ClickHouse/ClickHouse/pull/15930) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `query` parameter for `clickhouse-benchmark`. [#17832](https://github.com/ClickHouse/ClickHouse/pull/17832) ([Maksim Kita](https://github.com/kitaisreal)). +* `EXPLAIN AST` now support queries other then `SELECT`. [#18136](https://github.com/ClickHouse/ClickHouse/pull/18136) ([taiyang-li](https://github.com/taiyang-li)). + + +#### Experimental Feature + +* Added functions for calculation of minHash and simHash of text n-grams and shingles. They are intended for semi-duplicate search. Also functions `bitHammingDistance` and `tupleHammingDistance` are added. [#7649](https://github.com/ClickHouse/ClickHouse/pull/7649) ([flynn](https://github.com/ucasFL)). +* Add new data type `Map`. See [#1841](https://github.com/ClickHouse/ClickHouse/issues/1841). First version for Map only supports `String` type of key and value. [#15806](https://github.com/ClickHouse/ClickHouse/pull/15806) ([hexiaoting](https://github.com/hexiaoting)). +* Implement alternative SQL parser based on ANTLR4 runtime and generated from EBNF grammar. [#11298](https://github.com/ClickHouse/ClickHouse/pull/11298) ([Ivan](https://github.com/abyss7)). + + +#### Performance Improvement + +* New IP Dictionary implementation with lower memory consumption, improved performance for some cases, and fixed bugs. [#16804](https://github.com/ClickHouse/ClickHouse/pull/16804) ([vdimir](https://github.com/vdimir)). +* Parallel formatting for data export. [#11617](https://github.com/ClickHouse/ClickHouse/pull/11617) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* LDAP integration: Added `verification_cooldown` parameter in LDAP server connection configuration to allow caching of successful "bind" attempts for configurable period of time. [#15988](https://github.com/ClickHouse/ClickHouse/pull/15988) ([Denis Glazachev](https://github.com/traceon)). +* Add `--no-system-table` option for `clickhouse-local` to run without system tables. This avoids initialization of `DateLUT` that may take noticeable amount of time (tens of milliseconds) at startup. [#18899](https://github.com/ClickHouse/ClickHouse/pull/18899) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Replace `PODArray` with `PODArrayWithStackMemory` in `AggregateFunctionWindowFunnelData` to improve `windowFunnel` function performance. [#18817](https://github.com/ClickHouse/ClickHouse/pull/18817) ([flynn](https://github.com/ucasFL)). +* Don't send empty blocks to shards on synchronous INSERT into Distributed table. This closes [#14571](https://github.com/ClickHouse/ClickHouse/issues/14571). [#18775](https://github.com/ClickHouse/ClickHouse/pull/18775) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimized read for StorageMemory. [#18052](https://github.com/ClickHouse/ClickHouse/pull/18052) ([Maksim Kita](https://github.com/kitaisreal)). +* Using Dragonbox algorithm for float to string conversion instead of ryu. This improves performance of float to string conversion significantly. [#17831](https://github.com/ClickHouse/ClickHouse/pull/17831) ([Maksim Kita](https://github.com/kitaisreal)). +* Speedup `IPv6CIDRToRange` implementation. [#17569](https://github.com/ClickHouse/ClickHouse/pull/17569) ([vdimir](https://github.com/vdimir)). +* Add `remerge_sort_lowered_memory_bytes_ratio` setting (If memory usage after remerge does not reduced by this ratio, remerge will be disabled). [#17539](https://github.com/ClickHouse/ClickHouse/pull/17539) ([Azat Khuzhin](https://github.com/azat)). +* Improve performance of AggregatingMergeTree with SimpleAggregateFunction(String) in PK. [#17109](https://github.com/ClickHouse/ClickHouse/pull/17109) ([Azat Khuzhin](https://github.com/azat)). +* Now the `-If` combinator is devirtualized, and `count` is properly vectorized. It is for [this PR](https://github.com/ClickHouse/ClickHouse/pull/17041). [#17043](https://github.com/ClickHouse/ClickHouse/pull/17043) ([Amos Bird](https://github.com/amosbird)). +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). +* Improved performance of function `repeat`. [#16937](https://github.com/ClickHouse/ClickHouse/pull/16937) ([satanson](https://github.com/satanson)). +* Slightly improved performance of float parsing. [#16809](https://github.com/ClickHouse/ClickHouse/pull/16809) ([Maksim Kita](https://github.com/kitaisreal)). +* Add possibility to skip merged partitions for `OPTIMIZE TABLE ... FINAL`. [#15939](https://github.com/ClickHouse/ClickHouse/pull/15939) ([Kruglov Pavel](https://github.com/Avogar)). +* Integrate with [fast_float from Daniel Lemire](https://github.com/lemire/fast_float) to parse floating point numbers. [#16787](https://github.com/ClickHouse/ClickHouse/pull/16787) ([Maksim Kita](https://github.com/kitaisreal)). It is not enabled, because performance its performance is still lower than rough float parser in ClickHouse. +* Fix max_distributed_connections (affects `prefer_localhost_replica = 1` and `max_threads != max_distributed_connections`). [#17848](https://github.com/ClickHouse/ClickHouse/pull/17848) ([Azat Khuzhin](https://github.com/azat)). +* Adaptive choice of single/multi part upload when sending data to S3. Single part upload is controlled by a new setting `max_single_part_upload_size`. [#17934](https://github.com/ClickHouse/ClickHouse/pull/17934) ([Pavel Kovalenko](https://github.com/Jokser)). +* Support for async tasks in `PipelineExecutor`. Initial support of async sockets for remote queries. [#17868](https://github.com/ClickHouse/ClickHouse/pull/17868) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow to use `optimize_move_to_prewhere` optimization with compact parts, when sizes of columns are unknown. [#17330](https://github.com/ClickHouse/ClickHouse/pull/17330) ([Anton Popov](https://github.com/CurtizJ)). + + +#### Improvement + +* Avoid deadlock when executing INSERT SELECT into itself from a table with `TinyLog` or `Log` table engines. This closes [#6802](https://github.com/ClickHouse/ClickHouse/issues/6802). This closes [#18691](https://github.com/ClickHouse/ClickHouse/issues/18691). This closes [#16812](https://github.com/ClickHouse/ClickHouse/issues/16812). This closes [#14570](https://github.com/ClickHouse/ClickHouse/issues/14570). [#15260](https://github.com/ClickHouse/ClickHouse/pull/15260) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `SHOW CREATE VIEW name` syntax like [MySQL](https://dev.mysql.com/doc/refman/5.7/en/show-create-view.html). [#18095](https://github.com/ClickHouse/ClickHouse/pull/18095) ([Du Chuan](https://github.com/spongedu)). +* All queries of type `Decimal * Float` or vice versa are allowed, including aggregate ones (e.g. `SELECT sum(decimal_field * 1.1)` or `SELECT dec_col * float_col`), the result type is Float32 or Float64. [#18145](https://github.com/ClickHouse/ClickHouse/pull/18145) ([Mike](https://github.com/myrrc)). +* Improved minimal Web UI: add history; add sharing support; avoid race condition of different requests; add request in-flight and ready indicators; add favicon; detect Ctrl+Enter if textarea is not in focus. [#17293](https://github.com/ClickHouse/ClickHouse/pull/17293) [#17770](https://github.com/ClickHouse/ClickHouse/pull/17770) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* clickhouse-server didn't send `close` request to ZooKeeper server. [#16837](https://github.com/ClickHouse/ClickHouse/pull/16837) ([alesapin](https://github.com/alesapin)). +* Avoid server abnormal termination in case of too low memory limits (`max_memory_usage = 1` / `max_untracked_memory = 1`). [#17453](https://github.com/ClickHouse/ClickHouse/pull/17453) ([Azat Khuzhin](https://github.com/azat)). +* Fix non-deterministic result of `windowFunnel` function in case of same timestamp for different events. [#18884](https://github.com/ClickHouse/ClickHouse/pull/18884) ([Fuwang Hu](https://github.com/fuwhu)). +* Docker: Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server Docker images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). +* Asynchronous INSERTs to `Distributed` tables: Two new settings (by analogy with MergeTree family) has been added: - `fsync_after_insert` - Do fsync for every inserted. Will decreases performance of inserts. - `fsync_directories` - Do fsync for temporary directory (that is used for async INSERT only) after all operations (writes, renames, etc.). [#18864](https://github.com/ClickHouse/ClickHouse/pull/18864) ([Azat Khuzhin](https://github.com/azat)). +* `SYSTEM KILL` command started to work in Docker. This closes [#18847](https://github.com/ClickHouse/ClickHouse/issues/18847). [#18848](https://github.com/ClickHouse/ClickHouse/pull/18848) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Expand macros in the zk path when executing `FETCH PARTITION`. [#18839](https://github.com/ClickHouse/ClickHouse/pull/18839) ([fastio](https://github.com/fastio)). +* Apply `ALTER TABLE ON CLUSTER MODIFY SETTING ...` to all replicas. Because we don't replicate such alter commands. [#18789](https://github.com/ClickHouse/ClickHouse/pull/18789) ([Amos Bird](https://github.com/amosbird)). +* Allow column transformer `EXCEPT` to accept a string as regular expression matcher. This resolves [#18685](https://github.com/ClickHouse/ClickHouse/issues/18685) . [#18699](https://github.com/ClickHouse/ClickHouse/pull/18699) ([Amos Bird](https://github.com/amosbird)). +* Fix SimpleAggregateFunction in SummingMergeTree. Now it works like AggregateFunction. In previous versions values were summed together regardless to the aggregate function. This fixes [#18564](https://github.com/ClickHouse/ClickHouse/issues/18564) . [#8052](https://github.com/ClickHouse/ClickHouse/issues/8052). [#18637](https://github.com/ClickHouse/ClickHouse/pull/18637) ([Amos Bird](https://github.com/amosbird)). Another fix of using `SimpleAggregateFunction` in `SummingMergeTree`. This fixes [#18676](https://github.com/ClickHouse/ClickHouse/issues/18676) . [#18677](https://github.com/ClickHouse/ClickHouse/pull/18677) ([Amos Bird](https://github.com/amosbird)). +* Fixed assertion error inside allocator in case when last argument of function bar is NaN. Now simple ClickHouse's exception is being thrown. This fixes [#17876](https://github.com/ClickHouse/ClickHouse/issues/17876). [#18520](https://github.com/ClickHouse/ClickHouse/pull/18520) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix usability issue: no newline after exception message in some tools. [#18444](https://github.com/ClickHouse/ClickHouse/pull/18444) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to modify primary and partition key column type from `LowCardinality(Type)` to `Type` and vice versa. Also add an ability to modify primary key column type from `EnumX ` to `IntX` type. Fixes [#5604](https://github.com/ClickHouse/ClickHouse/issues/5604). [#18362](https://github.com/ClickHouse/ClickHouse/pull/18362) ([alesapin](https://github.com/alesapin)). +* Implement `untuple` field access. [#18133](https://github.com/ClickHouse/ClickHouse/issues/18133). [#18309](https://github.com/ClickHouse/ClickHouse/pull/18309) ([hexiaoting](https://github.com/hexiaoting)). +* Allow to parse Array fields from CSV if it is represented as a string containing array that was serialized as nested CSV. Example: `"[""Hello"", ""world"", ""42"""" TV""]"` will parse as `['Hello', 'world', '42" TV']`. Allow to parse array in CSV in a string without enclosing braces. Example: `"'Hello', 'world', '42"" TV'"` will parse as `['Hello', 'world', '42" TV']`. [#18271](https://github.com/ClickHouse/ClickHouse/pull/18271) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make better adaptive granularity calculation for merge tree wide parts. [#18223](https://github.com/ClickHouse/ClickHouse/pull/18223) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse install` could work on Mac. The problem was that there is no procfs on this platform. [#18201](https://github.com/ClickHouse/ClickHouse/pull/18201) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Better hints for `SHOW ...` query syntax. [#18183](https://github.com/ClickHouse/ClickHouse/pull/18183) ([Du Chuan](https://github.com/spongedu)). +* Array aggregation `arrayMin`, `arrayMax`, `arraySum`, `arrayAvg` support for `Int128`, `Int256`, `UInt256`. [#18147](https://github.com/ClickHouse/ClickHouse/pull/18147) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `disk` to Set and Join storage settings. [#18112](https://github.com/ClickHouse/ClickHouse/pull/18112) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Access control: Now table function `merge()` requires current user to have `SELECT` privilege on each table it receives data from. This PR fixes [#16964](https://github.com/ClickHouse/ClickHouse/issues/16964). [#18104](https://github.com/ClickHouse/ClickHouse/pull/18104) [#17983](https://github.com/ClickHouse/ClickHouse/pull/17983) ([Vitaly Baranov](https://github.com/vitlibar)). +* Temporary tables are visible in the system tables `system.tables` and `system.columns` now only in those session where they have been created. The internal database `_temporary_and_external_tables` is now hidden in those system tables; temporary tables are shown as tables with empty database with the `is_temporary` flag set instead. [#18014](https://github.com/ClickHouse/ClickHouse/pull/18014) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix clickhouse-client rendering issue when the size of terminal window changes. [#18009](https://github.com/ClickHouse/ClickHouse/pull/18009) ([Amos Bird](https://github.com/amosbird)). +* Decrease log verbosity of the events when the client drops the connection from Warning to Information. [#18005](https://github.com/ClickHouse/ClickHouse/pull/18005) ([filimonov](https://github.com/filimonov)). +* Forcibly removing empty or bad metadata files from filesystem for DiskS3. S3 is an experimental feature. [#17935](https://github.com/ClickHouse/ClickHouse/pull/17935) ([Pavel Kovalenko](https://github.com/Jokser)). +* Access control: `allow_introspection_functions=0` prohibits usage of introspection functions but doesn't prohibit giving grants for them anymore (the grantee will need to set `allow_introspection_functions=1` for himself to be able to use that grant). Similarly `allow_ddl=0` prohibits usage of DDL commands but doesn't prohibit giving grants for them anymore. [#17908](https://github.com/ClickHouse/ClickHouse/pull/17908) ([Vitaly Baranov](https://github.com/vitlibar)). +* Usability improvement: hints for column names. [#17112](https://github.com/ClickHouse/ClickHouse/issues/17112). [#17857](https://github.com/ClickHouse/ClickHouse/pull/17857) ([fastio](https://github.com/fastio)). +* Add diagnostic information when two merge tables try to read each other's data. [#17854](https://github.com/ClickHouse/ClickHouse/pull/17854) ([徐炘](https://github.com/weeds085490)). +* Let the possibility to override timeout value for running script using the ClickHouse docker image. [#17818](https://github.com/ClickHouse/ClickHouse/pull/17818) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Check system log tables' engine definition grammar to prevent some configuration errors. Notes that this grammar check is not semantical, that means such mistakes as non-existent columns / expression functions would be not found out util the table is created. [#17739](https://github.com/ClickHouse/ClickHouse/pull/17739) ([Du Chuan](https://github.com/spongedu)). +* Removed exception throwing at `RabbitMQ` table initialization if there was no connection (it will be reconnecting in the background). [#17709](https://github.com/ClickHouse/ClickHouse/pull/17709) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Do not ignore server memory limits during Buffer flush. [#17646](https://github.com/ClickHouse/ClickHouse/pull/17646) ([Azat Khuzhin](https://github.com/azat)). +* Switch to patched version of RocksDB (from ClickHouse-Extras) to fix use-after-free error. [#17643](https://github.com/ClickHouse/ClickHouse/pull/17643) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added an offset to exception message for parallel parsing. This fixes [#17457](https://github.com/ClickHouse/ClickHouse/issues/17457). [#17641](https://github.com/ClickHouse/ClickHouse/pull/17641) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't throw "Too many parts" error in the middle of INSERT query. [#17566](https://github.com/ClickHouse/ClickHouse/pull/17566) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow query parameters in UPDATE statement of ALTER query. Fixes [#10976](https://github.com/ClickHouse/ClickHouse/issues/10976). [#17563](https://github.com/ClickHouse/ClickHouse/pull/17563) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Query obfuscator: avoid usage of some SQL keywords for identifier names. [#17526](https://github.com/ClickHouse/ClickHouse/pull/17526) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Export current max ddl entry executed by DDLWorker via server metric. It's useful to check if DDLWorker hangs somewhere. [#17464](https://github.com/ClickHouse/ClickHouse/pull/17464) ([Amos Bird](https://github.com/amosbird)). +* Export asynchronous metrics of all servers current threads. It's useful to track down issues like [this](https://github.com/ClickHouse-Extras/poco/pull/28). [#17463](https://github.com/ClickHouse/ClickHouse/pull/17463) ([Amos Bird](https://github.com/amosbird)). +* Include dynamic columns like MATERIALIZED / ALIAS for wildcard query when settings `asterisk_include_materialized_columns` and `asterisk_include_alias_columns` are turned on. [#17462](https://github.com/ClickHouse/ClickHouse/pull/17462) ([Ken Chen](https://github.com/chenziliang)). +* Allow specifying [TTL](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree/#mergetree-table-ttl) to remove old entries from [system log tables](https://clickhouse.com/docs/ja/operations/system-tables/), using the `` attribute in `config.xml`. [#17438](https://github.com/ClickHouse/ClickHouse/pull/17438) ([Du Chuan](https://github.com/spongedu)). +* Now queries coming to the server via MySQL and PostgreSQL protocols have distinctive interface types (which can be seen in the `interface` column of the table`system.query_log`): `4` for MySQL, and `5` for PostgreSQL, instead of formerly used `1` which is now used for the native protocol only. [#17437](https://github.com/ClickHouse/ClickHouse/pull/17437) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix parsing of SETTINGS clause of the `INSERT ... SELECT ... SETTINGS` query. [#17414](https://github.com/ClickHouse/ClickHouse/pull/17414) ([Azat Khuzhin](https://github.com/azat)). +* Correctly account memory in RadixSort. [#17412](https://github.com/ClickHouse/ClickHouse/pull/17412) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add eof check in `receiveHello` in server to prevent getting `Attempt to read after eof` exception. [#17365](https://github.com/ClickHouse/ClickHouse/pull/17365) ([Kruglov Pavel](https://github.com/Avogar)). +* Avoid possible stack overflow in bigint conversion. Big integers are experimental. [#17269](https://github.com/ClickHouse/ClickHouse/pull/17269) ([flynn](https://github.com/ucasFL)). +* Now `set` indices will work with `GLOBAL IN`. This fixes [#17232](https://github.com/ClickHouse/ClickHouse/issues/17232) , [#5576](https://github.com/ClickHouse/ClickHouse/issues/5576) . [#17253](https://github.com/ClickHouse/ClickHouse/pull/17253) ([Amos Bird](https://github.com/amosbird)). +* Add limit for http redirects in request to S3 storage (`s3_max_redirects`). [#17220](https://github.com/ClickHouse/ClickHouse/pull/17220) ([ianton-ru](https://github.com/ianton-ru)). +* When `-OrNull` combinator combined `-If`, `-Merge`, `-MergeState`, `-State` combinators, we should put `-OrNull` in front. [#16935](https://github.com/ClickHouse/ClickHouse/pull/16935) ([flynn](https://github.com/ucasFL)). +* Support HTTP proxy and HTTPS S3 endpoint configuration. [#16861](https://github.com/ClickHouse/ClickHouse/pull/16861) ([Pavel Kovalenko](https://github.com/Jokser)). +* Added proper authentication using environment, `~/.aws` and `AssumeRole` for S3 client. [#16856](https://github.com/ClickHouse/ClickHouse/pull/16856) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add more OpenTelemetry spans. Add an example of how to export the span data to Zipkin. [#16535](https://github.com/ClickHouse/ClickHouse/pull/16535) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Cache dictionaries: Completely eliminate callbacks and locks for acquiring them. Keys are not divided into "not found" and "expired", but stored in the same map during query. [#14958](https://github.com/ClickHouse/ClickHouse/pull/14958) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix never worked `fsync_part_directory`/`fsync_after_insert`/`in_memory_parts_insert_sync` (experimental feature). [#18845](https://github.com/ClickHouse/ClickHouse/pull/18845) ([Azat Khuzhin](https://github.com/azat)). +* Allow using `Atomic` engine for nested database of `MaterializeMySQL` engine. [#14849](https://github.com/ClickHouse/ClickHouse/pull/14849) ([tavplubix](https://github.com/tavplubix)). + + +#### Bug Fix + +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) (Amos Bird, [alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible incomplete query result while reading from `MergeTree*` in case of read backoff (message ` MergeTreeReadPool: Will lower number of threads` in logs). Was introduced in [#16423](https://github.com/ClickHouse/ClickHouse/issues/16423). Fixes [#18137](https://github.com/ClickHouse/ClickHouse/issues/18137). [#18216](https://github.com/ClickHouse/ClickHouse/pull/18216) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use after free bug in `rocksdb` library. [#18862](https://github.com/ClickHouse/ClickHouse/pull/18862) ([sundyli](https://github.com/sundy-li)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug in merge tree data writer which can lead to marks with bigger size than fixed granularity size. Fixes [#18913](https://github.com/ClickHouse/ClickHouse/issues/18913). [#19123](https://github.com/ClickHouse/ClickHouse/pull/19123) ([alesapin](https://github.com/alesapin)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Join tries to materialize const columns, but our code wants them in other places. [#18982](https://github.com/ClickHouse/ClickHouse/pull/18982) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible exception `QueryPipeline stream: different number of columns` caused by merging of query plan's `Expression` steps. Fixes [#18190](https://github.com/ClickHouse/ClickHouse/issues/18190). [#18980](https://github.com/ClickHouse/ClickHouse/pull/18980) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect behavior when `ALTER TABLE ... DROP PART 'part_name'` query removes all deduplication blocks for the whole partition. Fixes [#18874](https://github.com/ClickHouse/ClickHouse/issues/18874). [#18969](https://github.com/ClickHouse/ClickHouse/pull/18969) ([alesapin](https://github.com/alesapin)). +* Attach partition should reset the mutation. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix issue with `bitmapOrCardinality` that may lead to nullptr dereference. This closes [#18911](https://github.com/ClickHouse/ClickHouse/issues/18911). [#18912](https://github.com/ClickHouse/ClickHouse/pull/18912) ([sundyli](https://github.com/sundy-li)). +* Fix possible hang at shutdown in `clickhouse-local`. This fixes [#18891](https://github.com/ClickHouse/ClickHouse/issues/18891). [#18893](https://github.com/ClickHouse/ClickHouse/pull/18893) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Queries for external databases (MySQL, ODBC, JDBC) were incorrectly rewritten if there was an expression in form of `x IN table`. This fixes [#9756](https://github.com/ClickHouse/ClickHouse/issues/9756). [#18876](https://github.com/ClickHouse/ClickHouse/pull/18876) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue that asynchronous distributed INSERTs can be rejected by the server if the setting `network_compression_method` is globally set to non-default value. This fixes [#18741](https://github.com/ClickHouse/ClickHouse/issues/18741). [#18776](https://github.com/ClickHouse/ClickHouse/pull/18776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix minor issue with logging. [#18717](https://github.com/ClickHouse/ClickHouse/pull/18717) ([sundyli](https://github.com/sundy-li)). +* Fix removing of empty parts in `ReplicatedMergeTree` tables, created with old syntax. Fixes [#18582](https://github.com/ClickHouse/ClickHouse/issues/18582). [#18614](https://github.com/ClickHouse/ClickHouse/pull/18614) ([Anton Popov](https://github.com/CurtizJ)). +* Fix previous bug when date overflow with different values. Strict Date value limit to "2106-02-07", cast date > "2106-02-07" to value 0. [#18565](https://github.com/ClickHouse/ClickHouse/pull/18565) ([hexiaoting](https://github.com/hexiaoting)). +* Add FixedString data type support for replication from MySQL. Replication from MySQL is an experimental feature. This patch fixes [#18450](https://github.com/ClickHouse/ClickHouse/issues/18450) Also fixes [#6556](https://github.com/ClickHouse/ClickHouse/issues/6556). [#18553](https://github.com/ClickHouse/ClickHouse/pull/18553) ([awesomeleo](https://github.com/awesomeleo)). +* Fix possible `Pipeline stuck` error while using `ORDER BY` after subquery with `RIGHT` or `FULL` join. [#18550](https://github.com/ClickHouse/ClickHouse/pull/18550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which may lead to `ALTER` queries hung after corresponding mutation kill. Found by thread fuzzer. [#18518](https://github.com/ClickHouse/ClickHouse/pull/18518) ([alesapin](https://github.com/alesapin)). +* Proper support for 12AM in `parseDateTimeBestEffort` function. This fixes [#18402](https://github.com/ClickHouse/ClickHouse/issues/18402). [#18449](https://github.com/ClickHouse/ClickHouse/pull/18449) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Fix the unexpected behaviour of `SHOW TABLES`. [#18431](https://github.com/ClickHouse/ClickHouse/pull/18431) ([fastio](https://github.com/fastio)). +* Fix -SimpleState combinator generates incompatible arugment type and return type. [#18404](https://github.com/ClickHouse/ClickHouse/pull/18404) ([Amos Bird](https://github.com/amosbird)). +* Fix possible race condition in concurrent usage of `Set` or `Join` tables and selects from `system.tables`. [#18385](https://github.com/ClickHouse/ClickHouse/pull/18385) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual IPv4/IPv6 stack; Fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes of the odbc-bridge process; Possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Access control: `SELECT count() FROM table` now can be executed if the user has access to at least single column from a table. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* Access control: `SELECT JOIN` now requires the `SELECT` privilege on each of the joined tables. This PR fixes [#17654](https://github.com/ClickHouse/ClickHouse/issues/17654). [#18232](https://github.com/ClickHouse/ClickHouse/pull/18232) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Replication from MySQL (experimental feature). Fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) Fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) Fix unique key convert issue in MaterializeMySQL database engine. [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistency for queries with both `WITH FILL` and `WITH TIES` [#17466](https://github.com/ClickHouse/ClickHouse/issues/17466). [#18188](https://github.com/ClickHouse/ClickHouse/pull/18188) ([hexiaoting](https://github.com/hexiaoting)). +* Fix inserting a row with default value in case of parsing error in the last column. Fixes [#17712](https://github.com/ClickHouse/ClickHouse/issues/17712). [#18182](https://github.com/ClickHouse/ClickHouse/pull/18182) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix `Unknown setting profile` error on attempt to set settings profile. [#18167](https://github.com/ClickHouse/ClickHouse/pull/18167) ([tavplubix](https://github.com/tavplubix)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` doesn't actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix comparison of `DateTime64` and `Date`. Fixes [#13804](https://github.com/ClickHouse/ClickHouse/issues/13804) and [#11222](https://github.com/ClickHouse/ClickHouse/issues/11222). ... [#18050](https://github.com/ClickHouse/ClickHouse/pull/18050) ([Vasily Nemkov](https://github.com/Enmk)). +* Replication from MySQL (experimental feature): Fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) Fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) support convert MySQL prefix index for MaterializeMySQL. [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* When server log rotation was configured using `logger.size` parameter with numeric value larger than 2^32, the logs were not rotated properly. This is fixed. [#17905](https://github.com/ClickHouse/ClickHouse/pull/17905) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Trivial query optimization was producing wrong result if query contains ARRAY JOIN (so query is actually non trivial). [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* WAL (experimental feature): Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Exception message about max table size to drop was displayed incorrectly. [#17764](https://github.com/ClickHouse/ClickHouse/pull/17764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Windows: Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* In might be determined incorrectly if cluster is circular- (cross-) replicated or not when executing `ON CLUSTER` query due to race condition when `pool_size` > 1. It's fixed. [#17640](https://github.com/ClickHouse/ClickHouse/pull/17640) ([tavplubix](https://github.com/tavplubix)). +* Fix empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Exception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix issue with memory accounting when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed high CPU usage in background tasks of *MergeTree tables. [#17416](https://github.com/ClickHouse/ClickHouse/pull/17416) ([tavplubix](https://github.com/tavplubix)). +* Fix possible crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Replication from MySQL (experimental feature): Fixes [#16835](https://github.com/ClickHouse/ClickHouse/issues/16835) try fix miss match header with MySQL SHOW statement. [#17366](https://github.com/ClickHouse/ClickHouse/pull/17366) ([Winter Zhang](https://github.com/zhang2014)). +* Fix nondeterministic functions with predicate optimizer. This fixes [#17244](https://github.com/ClickHouse/ClickHouse/issues/17244). [#17273](https://github.com/ClickHouse/ClickHouse/pull/17273) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible `Unexpected packet Data received from client` error for Distributed queries with `LIMIT`. [#17254](https://github.com/ClickHouse/ClickHouse/pull/17254) ([Azat Khuzhin](https://github.com/azat)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* clickhouse-copier: Fix for non-partitioned tables [#15235](https://github.com/ClickHouse/ClickHouse/issues/15235). [#17248](https://github.com/ClickHouse/ClickHouse/pull/17248) ([Qi Chen](https://github.com/kaka11chen)). +* Fixed possible not-working mutations for parts stored on S3 disk (experimental feature). [#17227](https://github.com/ClickHouse/ClickHouse/pull/17227) ([Pavel Kovalenko](https://github.com/Jokser)). +* Bug fix for funciton `fuzzBits`, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Fix `optimize_distributed_group_by_sharding_key` for query with OFFSET only. [#16996](https://github.com/ClickHouse/ClickHouse/pull/16996) ([Azat Khuzhin](https://github.com/azat)). +* Fix queries from `Merge` tables over `Distributed` tables with JOINs. [#16993](https://github.com/ClickHouse/ClickHouse/pull/16993) ([Azat Khuzhin](https://github.com/azat)). +* Fix order by optimization with monotonic functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix incorrect comparison of types `DateTime64` with different scales. Fixes [#16655](https://github.com/ClickHouse/ClickHouse/issues/16655) ... [#16952](https://github.com/ClickHouse/ClickHouse/pull/16952) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. Fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Minor fix in SHOW ACCESS query. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Fix the behaviour with enabled `optimize_trivial_count_query` setting with partition predicate. [#16767](https://github.com/ClickHouse/ClickHouse/pull/16767) ([Azat Khuzhin](https://github.com/azat)). +* Return number of affected rows for INSERT queries via MySQL wire protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). +* Throw error when `REPLACE` column transformer operates on non existing column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). +* Throw exception in case of not equi-join ON expression in RIGH|FULL JOIN. [#15162](https://github.com/ClickHouse/ClickHouse/pull/15162) ([Artem Zuikov](https://github.com/4ertus2)). + + +#### Build/Testing/Packaging Improvement + +* Add simple integrity check for ClickHouse binary. It allows to detect corruption due to faulty hardware (bit rot on storage media or bit flips in RAM). [#18811](https://github.com/ClickHouse/ClickHouse/pull/18811) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Change `OpenSSL` to `BoringSSL`. It allows to avoid issues with sanitizers. This fixes [#12490](https://github.com/ClickHouse/ClickHouse/issues/12490). This fixes [#17502](https://github.com/ClickHouse/ClickHouse/issues/17502). This fixes [#12952](https://github.com/ClickHouse/ClickHouse/issues/12952). [#18129](https://github.com/ClickHouse/ClickHouse/pull/18129) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify `Sys/V` init script. It was not working on Ubuntu 12.04 or older. [#17428](https://github.com/ClickHouse/ClickHouse/pull/17428) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Multiple improvements in `./clickhouse install` script. [#17421](https://github.com/ClickHouse/ClickHouse/pull/17421) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now ClickHouse can pretend to be a fake ZooKeeper. Currently, storage implementation is just stored in-memory hash-table, and server partially support ZooKeeper protocol. [#16877](https://github.com/ClickHouse/ClickHouse/pull/16877) ([alesapin](https://github.com/alesapin)). +* Fix dead list watches removal for TestKeeperStorage (a mock for ZooKeeper). [#18065](https://github.com/ClickHouse/ClickHouse/pull/18065) ([alesapin](https://github.com/alesapin)). +* Add `SYSTEM SUSPEND` command for fault injection. It can be used to faciliate failover tests. This closes [#15979](https://github.com/ClickHouse/ClickHouse/issues/15979). [#18850](https://github.com/ClickHouse/ClickHouse/pull/18850) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Generate build id when ClickHouse is linked with `lld`. It's appeared that `lld` does not generate it by default on my machine. Build id is used for crash reports and introspection. [#18808](https://github.com/ClickHouse/ClickHouse/pull/18808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix shellcheck errors in style check. [#18566](https://github.com/ClickHouse/ClickHouse/pull/18566) ([Ilya Yatsishin](https://github.com/qoega)). +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). +* Fix codespell warnings. Split style checks into separate parts. Update style checks docker image. [#18463](https://github.com/ClickHouse/ClickHouse/pull/18463) ([Ilya Yatsishin](https://github.com/qoega)). +* Automated check for leftovers of conflict markers in docs. [#18332](https://github.com/ClickHouse/ClickHouse/pull/18332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable Thread Fuzzer for stateless tests flaky check. [#18299](https://github.com/ClickHouse/ClickHouse/pull/18299) ([alesapin](https://github.com/alesapin)). +* Do not use non thread-safe function `strerror`. [#18204](https://github.com/ClickHouse/ClickHouse/pull/18204) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update `anchore/scan-action@main` workflow action (was moved from `master` to `main`). [#18192](https://github.com/ClickHouse/ClickHouse/pull/18192) ([Stig Bakken](https://github.com/stigsb)). +* Now `clickhouse-test` does DROP/CREATE databases with a timeout. [#18098](https://github.com/ClickHouse/ClickHouse/pull/18098) ([alesapin](https://github.com/alesapin)). +* Enable experimental support for Pytest framework for stateless tests. [#17902](https://github.com/ClickHouse/ClickHouse/pull/17902) ([Ivan](https://github.com/abyss7)). +* Now we use the fresh docker daemon version in integration tests. [#17671](https://github.com/ClickHouse/ClickHouse/pull/17671) ([alesapin](https://github.com/alesapin)). +* Send info about official build, memory, cpu and free disk space to Sentry if it is enabled. Sentry is opt-in feature to help ClickHouse developers. This closes [#17279](https://github.com/ClickHouse/ClickHouse/issues/17279). [#17543](https://github.com/ClickHouse/ClickHouse/pull/17543) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* There was an uninitialized variable in the code of clickhouse-copier. [#17363](https://github.com/ClickHouse/ClickHouse/pull/17363) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix [one MSan report](https://clickhouse-test-reports.s3.yandex.net/17309/065cd002578f2e8228f12a2744bd40c970065e0c/stress_test_(memory)/stderr.log) from [#17309](https://github.com/ClickHouse/ClickHouse/issues/17309). [#17344](https://github.com/ClickHouse/ClickHouse/pull/17344) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix for the issue with IPv6 in Arrow Flight library. See [the comments](https://github.com/ClickHouse/ClickHouse/pull/16243#issuecomment-720830294) for details. [#16664](https://github.com/ClickHouse/ClickHouse/pull/16664) ([Zhanna](https://github.com/FawnD2)). +* Add a library that replaces some `libc` functions to traps that will terminate the process. [#16366](https://github.com/ClickHouse/ClickHouse/pull/16366) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Provide diagnostics in server logs in case of stack overflow, send error message to clickhouse-client. This closes [#14840](https://github.com/ClickHouse/ClickHouse/issues/14840). [#16346](https://github.com/ClickHouse/ClickHouse/pull/16346) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we can run almost all stateless functional tests in parallel. [#15236](https://github.com/ClickHouse/ClickHouse/pull/15236) ([alesapin](https://github.com/alesapin)). +* Fix corruption in `librdkafka` snappy decompression (was a problem only for gcc10 builds, but official builds uses clang already, so at least recent official releases are not affected). [#18053](https://github.com/ClickHouse/ClickHouse/pull/18053) ([Azat Khuzhin](https://github.com/azat)). +* If server was terminated by OOM killer, print message in log. [#13516](https://github.com/ClickHouse/ClickHouse/pull/13516) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* PODArray: Avoid call to memcpy with (nullptr, 0) arguments (Fix UBSan report). This fixes [#18525](https://github.com/ClickHouse/ClickHouse/issues/18525). [#18526](https://github.com/ClickHouse/ClickHouse/pull/18526) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor improvement for path concatenation of zookeeper paths inside DDLWorker. [#17767](https://github.com/ClickHouse/ClickHouse/pull/17767) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow to reload symbols from debug file. This PR also fixes a build-id issue. [#17637](https://github.com/ClickHouse/ClickHouse/pull/17637) ([Amos Bird](https://github.com/amosbird)). + + +## [Changelog for 2020](./2020.md) diff --git a/docs/ja/whats-new/changelog/2022.md b/docs/ja/whats-new/changelog/2022.md new file mode 100644 index 00000000000..d152d23616b --- /dev/null +++ b/docs/ja/whats-new/changelog/2022.md @@ -0,0 +1,1837 @@ +--- +slug: /ja/whats-new/changelog/2022 +sidebar_position: 9 +sidebar_label: 2022 +title: 2022 Changelog +--- + +### ClickHouse release 22.12, 2022-12-15 + +:::warning + +This release contains a faulty systemd service comment that might break the ClickHouse installation on upgrade for some Linux distributions. The systemd service changes the directory owner permissions on `/run/systemd`, causing all subsequent systemd operations to fail. It is advised that you skip upgrading to this version and instead upgrade to a newer version of ClickHouse. + +Refer to this issue on GitHub for more details: https://github.com/ClickHouse/ClickHouse/issues/48285 + +::: + +#### Upgrade Notes +* Fixed backward incompatibility in (de)serialization of states of `min`, `max`, `any*`, `argMin`, `argMax` aggregate functions with `String` argument. The incompatibility affects 22.9, 22.10 and 22.11 branches (fixed since 22.9.6, 22.10.4 and 22.11.2 correspondingly). Some minor releases of 22.3, 22.7 and 22.8 branches are also affected: 22.3.13...22.3.14 (fixed since 22.3.15), 22.8.6...22.8.9 (fixed since 22.8.10), 22.7.6 and newer (will not be fixed in 22.7, we recommend upgrading from 22.7.* to 22.8.10 or newer). This release note does not concern users that have never used affected versions. Incompatible versions append an extra `'\0'` to strings when reading states of the aggregate functions mentioned above. For example, if an older version saved state of `anyState('foobar')` to `state_column` then the incompatible version will print `'foobar\0'` on `anyMerge(state_column)`. Also incompatible versions write states of the aggregate functions without trailing `'\0'`. Newer versions (that have the fix) can correctly read data written by all versions including incompatible versions, except one corner case. If an incompatible version saved a state with a string that actually ends with null character, then newer version will trim trailing `'\0'` when reading state of affected aggregate function. For example, if an incompatible version saved state of `anyState('abrac\0dabra\0')` to `state_column` then newer versions will print `'abrac\0dabra'` on `anyMerge(state_column)`. The issue also affects distributed queries when an incompatible version works in a cluster together with older or newer versions. [#43038](https://github.com/ClickHouse/ClickHouse/pull/43038) ([Alexander Tokmakov](https://github.com/tavplubix), [Raúl Marín](https://github.com/Algunenano)). Note: all the official ClickHouse builds already include the patches. This is not necessarily true for unofficial third-party builds that should be avoided. + +#### New Feature +* Add `BSONEachRow` input/output format. In this format, ClickHouse formats/parses each row as a separate BSON document and each column is formatted/parsed as a single BSON field with the column name as the key. [#42033](https://github.com/ClickHouse/ClickHouse/pull/42033) ([mark-polokhov](https://github.com/mark-polokhov)). +* Add `grace_hash` JOIN algorithm, it can be enabled with `SET join_algorithm = 'grace_hash'`. [#38191](https://github.com/ClickHouse/ClickHouse/pull/38191) ([BigRedEye](https://github.com/BigRedEye), [Vladimir C](https://github.com/vdimir)). +* Allow configuring password complexity rules and checks for creating and changing users. [#43719](https://github.com/ClickHouse/ClickHouse/pull/43719) ([Nikolay Degterinsky](https://github.com/evillique)). +* Mask sensitive information in logs; mask secret parts in the output of queries `SHOW CREATE TABLE` and `SELECT FROM system.tables`. Also resolves [#41418](https://github.com/ClickHouse/ClickHouse/issues/41418). [#43227](https://github.com/ClickHouse/ClickHouse/pull/43227) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `GROUP BY ALL` syntax: [#37631](https://github.com/ClickHouse/ClickHouse/issues/37631). [#42265](https://github.com/ClickHouse/ClickHouse/pull/42265) ([刘陶峰](https://github.com/taofengliu)). +* Add `FROM table SELECT column` syntax. [#41095](https://github.com/ClickHouse/ClickHouse/pull/41095) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added function `concatWithSeparator` and `concat_ws` as an alias for Spark SQL compatibility. A function `concatWithSeparatorAssumeInjective` added as a variant to enable GROUP BY optimization, similarly to `concatAssumeInjective`. [#43749](https://github.com/ClickHouse/ClickHouse/pull/43749) ([李扬](https://github.com/taiyang-li)). +* Added `multiplyDecimal` and `divideDecimal` functions for decimal operations with fixed precision. [#42438](https://github.com/ClickHouse/ClickHouse/pull/42438) ([Andrey Zvonov](https://github.com/zvonand)). +* Added `system.moves` table with list of currently moving parts. [#42660](https://github.com/ClickHouse/ClickHouse/pull/42660) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for embedded Prometheus endpoint for ClickHouse Keeper. [#43087](https://github.com/ClickHouse/ClickHouse/pull/43087) ([Antonio Andelic](https://github.com/antonio2368)). +* Support numeric literals with `_` as the separator, for example, `1_000_000`. [#43925](https://github.com/ClickHouse/ClickHouse/pull/43925) ([jh0x](https://github.com/jh0x)). +* Added possibility to use an array as a second parameter for `cutURLParameter` function. It will cut multiple parameters. Close [#6827](https://github.com/ClickHouse/ClickHouse/issues/6827). [#43788](https://github.com/ClickHouse/ClickHouse/pull/43788) ([Roman Vasin](https://github.com/rvasin)). +* Add a column with the expression of the index in the `system.data_skipping_indices` table. [#43308](https://github.com/ClickHouse/ClickHouse/pull/43308) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Add column `engine_full` to system table `databases` so that users can access the entire engine definition of a database via system tables. [#43468](https://github.com/ClickHouse/ClickHouse/pull/43468) ([凌涛](https://github.com/lingtaolf)). +* New hash function [xxh3](https://github.com/Cyan4973/xxHash) added. Also, the performance of `xxHash32` and `xxHash64` are improved on ARM thanks to a library update. [#43411](https://github.com/ClickHouse/ClickHouse/pull/43411) ([Nikita Taranov](https://github.com/nickitat)). +* Added support to define constraints for merge tree settings. For example you can forbid overriding the `storage_policy` by users. [#43903](https://github.com/ClickHouse/ClickHouse/pull/43903) ([Sergei Trifonov](https://github.com/serxa)). +* Add a new setting `input_format_json_read_objects_as_strings` that allows the parsing of nested JSON objects into Strings in all JSON input formats. This setting is disabled by default. [#44052](https://github.com/ClickHouse/ClickHouse/pull/44052) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Experimental Feature +* Support deduplication for asynchronous inserts. Before this change, async inserts did not support deduplication, because multiple small inserts coexisted in one inserted batch. Closes [#38075](https://github.com/ClickHouse/ClickHouse/issues/38075). [#43304](https://github.com/ClickHouse/ClickHouse/pull/43304) ([Han Fei](https://github.com/hanfei1991)). +* Add support for cosine distance for the experimental Annoy (vector similarity search) index. [#42778](https://github.com/ClickHouse/ClickHouse/pull/42778) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add `CREATE / ALTER / DROP NAMED COLLECTION` queries. [#43252](https://github.com/ClickHouse/ClickHouse/pull/43252) ([Kseniia Sumarokova](https://github.com/kssenii)). This feature is under development and the queries are not effective as of version 22.12. This changelog entry is added only to avoid confusion. Restrict default access to named collections to the user defined in config. This requires that `show_named_collections = 1` is set to be able to see them. [#43325](https://github.com/ClickHouse/ClickHouse/pull/43325) ([Kseniia Sumarokova](https://github.com/kssenii)). The `system.named_collections` table is introduced [#43147](https://github.com/ClickHouse/ClickHouse/pull/43147) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Performance Improvement +* Add settings `max_streams_for_merge_tree_reading` and `allow_asynchronous_read_from_io_pool_for_merge_tree`. Setting `max_streams_for_merge_tree_reading` limits the number of reading streams for MergeTree tables. Setting `allow_asynchronous_read_from_io_pool_for_merge_tree` enables a background I/O pool to read from `MergeTree` tables. This may increase performance for I/O bound queries if used together with `max_streams_to_max_threads_ratio` or `max_streams_for_merge_tree_reading`. [#43260](https://github.com/ClickHouse/ClickHouse/pull/43260) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). This improves performance up to 100 times in case of high latency storage, low number of CPU and high number of data parts. +* Settings `merge_tree_min_rows_for_concurrent_read_for_remote_filesystem/merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem` did not respect adaptive granularity. Fat rows did not decrease the number of read rows (as it was done for `merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read`, which could lead to high memory usage when using remote filesystems. [#43965](https://github.com/ClickHouse/ClickHouse/pull/43965) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Optimized the number of list requests to ZooKeeper or ClickHouse Keeper when selecting a part to merge. Previously it could produce thousands of requests in some cases. Fixes [#43647](https://github.com/ClickHouse/ClickHouse/issues/43647). [#43675](https://github.com/ClickHouse/ClickHouse/pull/43675) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Optimization is getting skipped now if `max_size_to_preallocate_for_aggregation` has too small a value. The default value of this setting increased to `10^8`. [#43945](https://github.com/ClickHouse/ClickHouse/pull/43945) ([Nikita Taranov](https://github.com/nickitat)). +* Speed-up server shutdown by avoiding cleaning up of old data parts. Because it is unnecessary after https://github.com/ClickHouse/ClickHouse/pull/41145. [#43760](https://github.com/ClickHouse/ClickHouse/pull/43760) ([Sema Checherinda](https://github.com/CheSema)). +* Merging on initiator now uses the same memory bound approach as merging of local aggregation results if `enable_memory_bound_merging_of_aggregation_results` is set. [#40879](https://github.com/ClickHouse/ClickHouse/pull/40879) ([Nikita Taranov](https://github.com/nickitat)). +* Keeper improvement: try syncing logs to disk in parallel with replication. [#43450](https://github.com/ClickHouse/ClickHouse/pull/43450) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper improvement: requests are batched more often. The batching can be controlled with the new setting `max_requests_quick_batch_size`. [#43686](https://github.com/ClickHouse/ClickHouse/pull/43686) ([Antonio Andelic](https://github.com/antonio2368)). + +#### Improvement +* Implement referential dependencies and use them to create tables in the correct order while restoring from a backup. [#43834](https://github.com/ClickHouse/ClickHouse/pull/43834) ([Vitaly Baranov](https://github.com/vitlibar)). +* Substitute UDFs in `CREATE` query to avoid failures during loading at startup. Additionally, UDFs can now be used as `DEFAULT` expressions for columns. [#43539](https://github.com/ClickHouse/ClickHouse/pull/43539) ([Antonio Andelic](https://github.com/antonio2368)). +* Change how the following queries delete parts: TRUNCATE TABLE, ALTER TABLE DROP PART, ALTER TABLE DROP PARTITION. Now, these queries make empty parts which cover the old parts. This makes the TRUNCATE query work without a followedexclusive lock which means concurrent reads aren't locked. Also achieved durability in all those queries. If the request succeeds, then no resurrected parts appear later. Note that atomicity is achieved only with transaction scope. [#41145](https://github.com/ClickHouse/ClickHouse/pull/41145) ([Sema Checherinda](https://github.com/CheSema)). +* `SET param_x` query no longer requires manual string serialization for the value of the parameter. For example, query `SET param_a = '[\'a\', \'b\']'` can now be written like `SET param_a = ['a', 'b']`. [#41874](https://github.com/ClickHouse/ClickHouse/pull/41874) ([Nikolay Degterinsky](https://github.com/evillique)). +* Show read rows in the progress indication while reading from STDIN from client. Closes [#43423](https://github.com/ClickHouse/ClickHouse/issues/43423). [#43442](https://github.com/ClickHouse/ClickHouse/pull/43442) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Show progress bar while reading from s3 table function / engine. [#43454](https://github.com/ClickHouse/ClickHouse/pull/43454) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Progress bar will show both read and written rows. [#43496](https://github.com/ClickHouse/ClickHouse/pull/43496) ([Ilya Yatsishin](https://github.com/qoega)). +* `filesystemAvailable` and related functions support one optional argument with disk name, and change `filesystemFree` to `filesystemUnreserved`. Closes [#35076](https://github.com/ClickHouse/ClickHouse/issues/35076). [#42064](https://github.com/ClickHouse/ClickHouse/pull/42064) ([flynn](https://github.com/ucasfl)). +* Integration with LDAP: increased the default value of search_limit to 256, and added LDAP server config option to change that to an arbitrary value. Closes: [#42276](https://github.com/ClickHouse/ClickHouse/issues/42276). [#42461](https://github.com/ClickHouse/ClickHouse/pull/42461) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow the removal of sensitive information (see the `query_masking_rules` in the configuration file) from the exception messages as well. Resolves [#41418](https://github.com/ClickHouse/ClickHouse/issues/41418). [#42940](https://github.com/ClickHouse/ClickHouse/pull/42940) ([filimonov](https://github.com/filimonov)). +* Support queries like `SHOW FULL TABLES ...` for MySQL compatibility. [#43910](https://github.com/ClickHouse/ClickHouse/pull/43910) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Keeper improvement: Add 4lw command `rqld` which can manually assign a node as leader. [#43026](https://github.com/ClickHouse/ClickHouse/pull/43026) ([JackyWoo](https://github.com/JackyWoo)). +* Apply connection timeout settings for Distributed async INSERT from the query. [#43156](https://github.com/ClickHouse/ClickHouse/pull/43156) ([Azat Khuzhin](https://github.com/azat)). +* The `unhex` function now supports `FixedString` arguments. [issue42369](https://github.com/ClickHouse/ClickHouse/issues/42369). [#43207](https://github.com/ClickHouse/ClickHouse/pull/43207) ([DR](https://github.com/freedomDR)). +* Priority is given to deleting completely expired parts according to the TTL rules, see [#42869](https://github.com/ClickHouse/ClickHouse/issues/42869). [#43222](https://github.com/ClickHouse/ClickHouse/pull/43222) ([zhongyuankai](https://github.com/zhongyuankai)). +* More precise and reactive CPU load indication in clickhouse-client. [#43307](https://github.com/ClickHouse/ClickHouse/pull/43307) ([Sergei Trifonov](https://github.com/serxa)). +* Support reading of subcolumns of nested types from storage `S3` and table function `s3` with formats `Parquet`, `Arrow` and `ORC`. [#43329](https://github.com/ClickHouse/ClickHouse/pull/43329) ([chen](https://github.com/xiedeyantu)). +* Add `table_uuid` column to the `system.parts` table. [#43404](https://github.com/ClickHouse/ClickHouse/pull/43404) ([Azat Khuzhin](https://github.com/azat)). +* Added client option to display the number of locally processed rows in non-interactive mode (`--print-num-processed-rows`). [#43407](https://github.com/ClickHouse/ClickHouse/pull/43407) ([jh0x](https://github.com/jh0x)). +* Implement `aggregation-in-order` optimization on top of a query plan. It is enabled by default (but works only together with `optimize_aggregation_in_order`, which is disabled by default). Set `query_plan_aggregation_in_order = 0` to use the previous AST-based version. [#43592](https://github.com/ClickHouse/ClickHouse/pull/43592) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow to collect profile events with `trace_type = 'ProfileEvent'` to `system.trace_log` on each increment with current stack, profile event name and value of the increment. It can be enabled by the setting `trace_profile_events` and used to investigate performance of queries. [#43639](https://github.com/ClickHouse/ClickHouse/pull/43639) ([Anton Popov](https://github.com/CurtizJ)). +* Add a new setting `input_format_max_binary_string_size` to limit string size in RowBinary format. [#43842](https://github.com/ClickHouse/ClickHouse/pull/43842) ([Kruglov Pavel](https://github.com/Avogar)). +* When ClickHouse requests a remote HTTP server, and it returns an error, the numeric HTTP code was not displayed correctly in the exception message. Closes [#43919](https://github.com/ClickHouse/ClickHouse/issues/43919). [#43920](https://github.com/ClickHouse/ClickHouse/pull/43920) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Correctly report errors in queries even when multiple JOINs optimization is taking place. [#43583](https://github.com/ClickHouse/ClickHouse/pull/43583) ([Salvatore](https://github.com/tbsal)). + +#### Build/Testing/Packaging Improvement + +* Systemd integration now correctly notifies systemd that the service is really started and is ready to serve requests. [#43400](https://github.com/ClickHouse/ClickHouse/pull/43400) ([Коренберг Марк](https://github.com/socketpair)). +* Added the option to build ClickHouse with OpenSSL using the [OpenSSL FIPS Module](https://www.openssl.org/docs/man3.0/man7/fips_module.html). This build type has not been tested to validate security and is not supported. [#43991](https://github.com/ClickHouse/ClickHouse/pull/43991) ([Boris Kuschel](https://github.com/bkuschel)). +* Upgrade to the new `DeflateQpl` compression codec which has been implemented in a previous PR (details: https://github.com/ClickHouse/ClickHouse/pull/39494). This patch improves codec on below aspects: 1. QPL v0.2.0 to QPL v0.3.0 [Intel® Query Processing Library (QPL)](https://github.com/intel/qpl) 2. Improve CMake file for fixing QPL build issues for QPL v0.3.0. 3. Link the QPL library with libaccel-config at build time instead of runtime loading on QPL v0.2.0 (dlopen) 4. Fixed log print issue in CompressionCodecDeflateQpl.cpp. [#44024](https://github.com/ClickHouse/ClickHouse/pull/44024) ([jasperzhu](https://github.com/jinjunzh)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Fixed bug which could lead to deadlock while using asynchronous inserts. [#43233](https://github.com/ClickHouse/ClickHouse/pull/43233) ([Anton Popov](https://github.com/CurtizJ)). +* Fix some incorrect logic in AST level optimization `optimize_normalize_count_variants`. [#43873](https://github.com/ClickHouse/ClickHouse/pull/43873) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a case when mutations are not making progress when checksums do not match between replicas (e.g. caused by a change in data format on an upgrade). [#36877](https://github.com/ClickHouse/ClickHouse/pull/36877) ([nvartolomei](https://github.com/nvartolomei)). +* Fix the `skip_unavailable_shards` optimization which did not work with the `hdfsCluster` table function. [#43236](https://github.com/ClickHouse/ClickHouse/pull/43236) ([chen](https://github.com/xiedeyantu)). +* Fix `s3` support for the `?` wildcard. Closes [#42731](https://github.com/ClickHouse/ClickHouse/issues/42731). [#43253](https://github.com/ClickHouse/ClickHouse/pull/43253) ([chen](https://github.com/xiedeyantu)). +* Fix functions `arrayFirstOrNull` and `arrayLastOrNull` or null when the array contains `Nullable` elements. [#43274](https://github.com/ClickHouse/ClickHouse/pull/43274) ([Duc Canh Le](https://github.com/canhld94)). +* Fix incorrect `UserTimeMicroseconds`/`SystemTimeMicroseconds` accounting related to Kafka tables. [#42791](https://github.com/ClickHouse/ClickHouse/pull/42791) ([Azat Khuzhin](https://github.com/azat)). +* Do not suppress exceptions in `web` disks. Fix retries for the `web` disk. [#42800](https://github.com/ClickHouse/ClickHouse/pull/42800) ([Azat Khuzhin](https://github.com/azat)). +* Fixed (logical) race condition between inserts and dropping materialized views. A race condition happened when a Materialized View was dropped at the same time as an INSERT, where the MVs were present as a dependency of the insert at the begining of the execution, but the table has been dropped by the time the insert chain tries to access it, producing either an `UNKNOWN_TABLE` or `TABLE_IS_DROPPED` exception, and stopping the insertion. After this change, we avoid these exceptions and just continue with the insert if the dependency is gone. [#43161](https://github.com/ClickHouse/ClickHouse/pull/43161) ([AlfVII](https://github.com/AlfVII)). +* Fix undefined behavior in the `quantiles` function, which might lead to uninitialized memory. Found by fuzzer. This closes [#44066](https://github.com/ClickHouse/ClickHouse/issues/44066). [#44067](https://github.com/ClickHouse/ClickHouse/pull/44067) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Additional check on zero uncompressed size is added to `CompressionCodecDelta`. [#43255](https://github.com/ClickHouse/ClickHouse/pull/43255) ([Nikita Taranov](https://github.com/nickitat)). +* Flatten arrays from Parquet to avoid an issue with inconsistent data in arrays. These incorrect files can be generated by Apache Iceberg. [#43297](https://github.com/ClickHouse/ClickHouse/pull/43297) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix bad cast from `LowCardinality` column when using short circuit function execution. [#43311](https://github.com/ClickHouse/ClickHouse/pull/43311) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed queries with `SAMPLE BY` with prewhere optimization on tables using `Merge` engine. [#43315](https://github.com/ClickHouse/ClickHouse/pull/43315) ([Antonio Andelic](https://github.com/antonio2368)). +* Check and compare the content of the `format_version` file in `MergeTreeData` so that tables can be loaded even if the storage policy was changed. [#43328](https://github.com/ClickHouse/ClickHouse/pull/43328) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible (very unlikely) "No column to rollback" logical error during INSERT into `Buffer` tables. [#43336](https://github.com/ClickHouse/ClickHouse/pull/43336) ([Azat Khuzhin](https://github.com/azat)). +* Fix a bug that allowed the parser to parse an unlimited amount of round brackets into one function if `allow_function_parameters` is set. [#43350](https://github.com/ClickHouse/ClickHouse/pull/43350) ([Nikolay Degterinsky](https://github.com/evillique)). +* `MaterializeMySQL` (experimental feature) support DDL: `drop table t1, t2` and compatible with most of MySQL DROP DDL. [#43366](https://github.com/ClickHouse/ClickHouse/pull/43366) ([zzsmdfj](https://github.com/zzsmdfj)). +* `session_log` (experimental feature): Fixed the inability to log in (because of failure to create the session_log entry) in a very rare case of messed up setting profiles. [#42641](https://github.com/ClickHouse/ClickHouse/pull/42641) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Cannot create non-empty column with type Nothing` in functions `if`/`multiIf`. Closes [#43356](https://github.com/ClickHouse/ClickHouse/issues/43356). [#43368](https://github.com/ClickHouse/ClickHouse/pull/43368) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a bug when a row level filter uses the default value of a column. [#43387](https://github.com/ClickHouse/ClickHouse/pull/43387) ([Alexander Gololobov](https://github.com/davenger)). +* Query with `DISTINCT` + `LIMIT BY` + `LIMIT` can return fewer rows than expected. Fixes [#43377](https://github.com/ClickHouse/ClickHouse/issues/43377). [#43410](https://github.com/ClickHouse/ClickHouse/pull/43410) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix `sumMap` for `Nullable(Decimal(...))`. [#43414](https://github.com/ClickHouse/ClickHouse/pull/43414) ([Azat Khuzhin](https://github.com/azat)). +* Fix `date_diff` for hour/minute on macOS. Close [#42742](https://github.com/ClickHouse/ClickHouse/issues/42742). [#43466](https://github.com/ClickHouse/ClickHouse/pull/43466) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix incorrect memory accounting because of merges/mutations. [#43516](https://github.com/ClickHouse/ClickHouse/pull/43516) ([Azat Khuzhin](https://github.com/azat)). +* Fixed primary key analysis with conditions involving `toString(enum)`. [#43596](https://github.com/ClickHouse/ClickHouse/pull/43596) ([Nikita Taranov](https://github.com/nickitat)). This error has been found by @tisonkun. +* Ensure consistency when `clickhouse-copier` updates status and `attach_is_done` in Keeper after partition attach is done. [#43602](https://github.com/ClickHouse/ClickHouse/pull/43602) ([lzydmxy](https://github.com/lzydmxy)). +* During the recovery of a lost replica of a `Replicated` database (experimental feature), there could a situation where we need to atomically swap two table names (use EXCHANGE). Previously we tried to use two RENAME queries, which was obviously failing and moreover, failed the whole recovery process of the database replica. [#43628](https://github.com/ClickHouse/ClickHouse/pull/43628) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix the case when the `s3Cluster` function throws `NOT_FOUND_COLUMN_IN_BLOCK` error. Closes [#43534](https://github.com/ClickHouse/ClickHouse/issues/43534). [#43629](https://github.com/ClickHouse/ClickHouse/pull/43629) ([chen](https://github.com/xiedeyantu)). +* Fix possible logical error `Array sizes mismatched` while parsing JSON object with arrays with same key names but with different nesting level. Closes [#43569](https://github.com/ClickHouse/ClickHouse/issues/43569). [#43693](https://github.com/ClickHouse/ClickHouse/pull/43693) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed possible exception in the case of distributed `GROUP BY` with an `ALIAS` column among aggregation keys. [#43709](https://github.com/ClickHouse/ClickHouse/pull/43709) ([Nikita Taranov](https://github.com/nickitat)). +* Fix bug which can lead to broken projections if zero-copy replication (experimental feature) is enabled and used. [#43764](https://github.com/ClickHouse/ClickHouse/pull/43764) ([alesapin](https://github.com/alesapin)). +* Fix using multipart upload for very large S3 objects in AWS S3. [#43824](https://github.com/ClickHouse/ClickHouse/pull/43824) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed `ALTER ... RESET SETTING` with `ON CLUSTER`. It could have been applied to one replica only. Fixes [#43843](https://github.com/ClickHouse/ClickHouse/issues/43843). [#43848](https://github.com/ClickHouse/ClickHouse/pull/43848) ([Elena Torró](https://github.com/elenatorro)). +* Fix a logical error in JOIN with `Join` table engine at right hand side, if `USING` is being used. [#43963](https://github.com/ClickHouse/ClickHouse/pull/43963) ([Vladimir C](https://github.com/vdimir)). Fix a bug with wrong order of keys in `Join` table engine. [#44012](https://github.com/ClickHouse/ClickHouse/pull/44012) ([Vladimir C](https://github.com/vdimir)). +* Keeper fix: throw if the interserver port for Raft is already in use. [#43984](https://github.com/ClickHouse/ClickHouse/pull/43984) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix ORDER BY positional argument (example: `ORDER BY 1, 2`) in case of unneeded columns pruning from subqueries. Closes [#43964](https://github.com/ClickHouse/ClickHouse/issues/43964). [#43987](https://github.com/ClickHouse/ClickHouse/pull/43987) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed exception when a subquery contains HAVING but doesn't contain an actual aggregation. [#44051](https://github.com/ClickHouse/ClickHouse/pull/44051) ([Nikita Taranov](https://github.com/nickitat)). +* Fix race in s3 multipart upload. This race could cause the error `Part number must be an integer between 1 and 10000, inclusive. (S3_ERROR)` while restoring from a backup. [#44065](https://github.com/ClickHouse/ClickHouse/pull/44065) ([Vitaly Baranov](https://github.com/vitlibar)). + +### ClickHouse release 22.11, 2022-11-17 + +#### Backward Incompatible Change +* `JSONExtract` family of functions will now attempt to coerce to the requested type. [#41502](https://github.com/ClickHouse/ClickHouse/pull/41502) ([Márcio Martins](https://github.com/marcioapm)). + +#### New Feature +* Adds support for retries during INSERTs into ReplicatedMergeTree when a session with ClickHouse Keeper is lost. Apart from fault tolerance, it aims to provide better user experience, - avoid returning a user an error during insert if keeper is restarted (for example, due to upgrade). [#42607](https://github.com/ClickHouse/ClickHouse/pull/42607) ([Igor Nikonov](https://github.com/devcrafter)). +* Add `Hudi` and `DeltaLake` table engines, read-only, only for tables on S3. [#41054](https://github.com/ClickHouse/ClickHouse/pull/41054) ([Daniil Rubin](https://github.com/rubin-do), [Kseniia Sumarokova](https://github.com/kssenii)). +* Add table function `hudi` and `deltaLake`. [#43080](https://github.com/ClickHouse/ClickHouse/pull/43080) ([flynn](https://github.com/ucasfl)). +* Support for composite time intervals. 1. Add, subtract and negate operations are now available on Intervals. In the case where the types of Intervals are different, they will be transformed into the Tuple of those types. 2. A tuple of intervals can be added to or subtracted from a Date/DateTime field. 3. Added parsing of Intervals with different types, for example: `INTERVAL '1 HOUR 1 MINUTE 1 SECOND'`. [#42195](https://github.com/ClickHouse/ClickHouse/pull/42195) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added `**` glob support for recursive directory traversal of the filesystem and S3. Resolves [#36316](https://github.com/ClickHouse/ClickHouse/issues/36316). [#42376](https://github.com/ClickHouse/ClickHouse/pull/42376) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Introduce `s3_plain` disk type for write-once-read-many operations. Implement `ATTACH` of `MergeTree` table for `s3_plain` disk. [#42628](https://github.com/ClickHouse/ClickHouse/pull/42628) ([Azat Khuzhin](https://github.com/azat)). +* Added applied row-level policies to `system.query_log`. [#39819](https://github.com/ClickHouse/ClickHouse/pull/39819) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Add four-letter command `csnp` for manually creating snapshots in ClickHouse Keeper. Additionally, `lgif` was added to get Raft information for a specific node (e.g. index of last created snapshot, last committed log index). [#41766](https://github.com/ClickHouse/ClickHouse/pull/41766) ([JackyWoo](https://github.com/JackyWoo)). +* Add function `ascii` like in Apache Spark: https://spark.apache.org/docs/latest/api/sql/#ascii. [#42670](https://github.com/ClickHouse/ClickHouse/pull/42670) ([李扬](https://github.com/taiyang-li)). +* Add function `pmod` which returns non-negative result based on modulo. [#42755](https://github.com/ClickHouse/ClickHouse/pull/42755) ([李扬](https://github.com/taiyang-li)). +* Add function `formatReadableDecimalSize`. [#42774](https://github.com/ClickHouse/ClickHouse/pull/42774) ([Alejandro](https://github.com/alexon1234)). +* Add function `randCanonical`, which is similar to the `rand` function in Apache Spark or Impala. The function generates pseudo random results with independent and identically distributed uniformly distributed values in [0, 1). [#43124](https://github.com/ClickHouse/ClickHouse/pull/43124) ([李扬](https://github.com/taiyang-li)). +* Add function `displayName`, closes [#36770](https://github.com/ClickHouse/ClickHouse/issues/36770). [#37681](https://github.com/ClickHouse/ClickHouse/pull/37681) ([hongbin](https://github.com/xlwh)). +* Add `min_age_to_force_merge_on_partition_only` setting to optimize old parts for the entire partition only. [#42659](https://github.com/ClickHouse/ClickHouse/pull/42659) ([Antonio Andelic](https://github.com/antonio2368)). +* Add generic implementation for arbitrary structured named collections, access type and `system.named_collections`. [#43147](https://github.com/ClickHouse/ClickHouse/pull/43147) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Performance Improvement +* `match` function can use the index if it's a condition on string prefix. This closes [#37333](https://github.com/ClickHouse/ClickHouse/issues/37333). [#42458](https://github.com/ClickHouse/ClickHouse/pull/42458) ([clarkcaoliu](https://github.com/Clark0)). +* Speed up AND and OR operators when they are sequenced. [#42214](https://github.com/ClickHouse/ClickHouse/pull/42214) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Support parallel parsing for `LineAsString` input format. This improves performance just slightly. This closes [#42502](https://github.com/ClickHouse/ClickHouse/issues/42502). [#42780](https://github.com/ClickHouse/ClickHouse/pull/42780) ([Kruglov Pavel](https://github.com/Avogar)). +* ClickHouse Keeper performance improvement: improve commit performance for cases when many different nodes have uncommitted states. This should help with cases when a follower node can't sync fast enough. [#42926](https://github.com/ClickHouse/ClickHouse/pull/42926) ([Antonio Andelic](https://github.com/antonio2368)). +* A condition like `NOT LIKE 'prefix%'` can use the primary index. [#42209](https://github.com/ClickHouse/ClickHouse/pull/42209) ([Duc Canh Le](https://github.com/canhld94)). + +#### Experimental Feature +* Support type `Object` inside other types, e.g. `Array(JSON)`. [#36969](https://github.com/ClickHouse/ClickHouse/pull/36969) ([Anton Popov](https://github.com/CurtizJ)). +* Ignore MySQL binlog SAVEPOINT event for MaterializedMySQL. [#42931](https://github.com/ClickHouse/ClickHouse/pull/42931) ([zzsmdfj](https://github.com/zzsmdfj)). Handle (ignore) SAVEPOINT queries in MaterializedMySQL. [#43086](https://github.com/ClickHouse/ClickHouse/pull/43086) ([Stig Bakken](https://github.com/stigsb)). + +#### Improvement +* Trivial queries with small LIMIT will properly determine the number of estimated rows to read, so that the threshold will be checked properly. Closes [#7071](https://github.com/ClickHouse/ClickHouse/issues/7071). [#42580](https://github.com/ClickHouse/ClickHouse/pull/42580) ([Han Fei](https://github.com/hanfei1991)). +* Add support for interactive parameters in INSERT VALUES queries. [#43077](https://github.com/ClickHouse/ClickHouse/pull/43077) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added new field `allow_readonly` in `system.table_functions` to allow using table functions in readonly mode. Resolves [#42414](https://github.com/ClickHouse/ClickHouse/issues/42414) Implementation: * Added a new field allow_readonly to table system.table_functions. * Updated to use new field allow_readonly to allow using table functions in readonly mode. Testing: * Added a test for filesystem tests/queries/0_stateless/02473_functions_in_readonly_mode.sh Documentation: * Updated the english documentation for Table Functions. [#42708](https://github.com/ClickHouse/ClickHouse/pull/42708) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* The `system.asynchronous_metrics` gets embedded documentation. This documentation is also exported to Prometheus. Fixed an error with the metrics about `cache` disks - they were calculated only for one arbitrary cache disk instead all of them. This closes [#7644](https://github.com/ClickHouse/ClickHouse/issues/7644). [#43194](https://github.com/ClickHouse/ClickHouse/pull/43194) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Throttling algorithm changed to token bucket. [#42665](https://github.com/ClickHouse/ClickHouse/pull/42665) ([Sergei Trifonov](https://github.com/serxa)). +* Mask passwords and secret keys both in `system.query_log` and `/var/log/clickhouse-server/*.log` and also in error messages. [#42484](https://github.com/ClickHouse/ClickHouse/pull/42484) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove covered parts for fetched part (to avoid possible replication delay grows). [#39737](https://github.com/ClickHouse/ClickHouse/pull/39737) ([Azat Khuzhin](https://github.com/azat)). +* If `/dev/tty` is available, the progress in clickhouse-client and clickhouse-local will be rendered directly to the terminal, without writing to STDERR. It allows getting progress even if STDERR is redirected to a file, and the file will not be polluted by terminal escape sequences. The progress can be disabled by `--progress false`. This closes [#32238](https://github.com/ClickHouse/ClickHouse/issues/32238). [#42003](https://github.com/ClickHouse/ClickHouse/pull/42003) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add support for `FixedString` input to base64 coding functions. [#42285](https://github.com/ClickHouse/ClickHouse/pull/42285) ([ltrk2](https://github.com/ltrk2)). +* Add columns `bytes_on_disk` and `path` to `system.detached_parts`. Closes [#42264](https://github.com/ClickHouse/ClickHouse/issues/42264). [#42303](https://github.com/ClickHouse/ClickHouse/pull/42303) ([chen](https://github.com/xiedeyantu)). +* Improve using structure from insertion table in table functions, now setting `use_structure_from_insertion_table_in_table_functions` has new possible value - `2` that means that ClickHouse will try to determine if we can use structure from insertion table or not automatically. Closes [#40028](https://github.com/ClickHouse/ClickHouse/issues/40028). [#42320](https://github.com/ClickHouse/ClickHouse/pull/42320) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix no progress indication on INSERT FROM INFILE. Closes [#42548](https://github.com/ClickHouse/ClickHouse/issues/42548). [#42634](https://github.com/ClickHouse/ClickHouse/pull/42634) ([chen](https://github.com/xiedeyantu)). +* Refactor function `tokens` to enable max tokens returned for related functions (disabled by default). [#42673](https://github.com/ClickHouse/ClickHouse/pull/42673) ([李扬](https://github.com/taiyang-li)). +* Allow to use `Date32` arguments for `formatDateTime` and `FROM_UNIXTIME` functions. [#42737](https://github.com/ClickHouse/ClickHouse/pull/42737) ([Roman Vasin](https://github.com/rvasin)). +* Update tzdata to 2022f. Mexico will no longer observe DST except near the US border: https://www.timeanddate.com/news/time/mexico-abolishes-dst-2022.html. Chihuahua moves to year-round UTC-6 on 2022-10-30. Fiji no longer observes DST. See https://github.com/google/cctz/pull/235 and https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1995209. [#42796](https://github.com/ClickHouse/ClickHouse/pull/42796) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `FailedAsyncInsertQuery` event metric for async inserts. [#42814](https://github.com/ClickHouse/ClickHouse/pull/42814) ([Krzysztof Góralski](https://github.com/kgoralski)). +* Implement `read-in-order` optimization on top of query plan. It is enabled by default. Set `query_plan_read_in_order = 0` to use previous AST-based version. [#42829](https://github.com/ClickHouse/ClickHouse/pull/42829) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Increase the size of upload part exponentially for backup to S3 to avoid errors about max 10 000 parts limit of the multipart upload to s3. [#42833](https://github.com/ClickHouse/ClickHouse/pull/42833) ([Vitaly Baranov](https://github.com/vitlibar)). +* When the merge task is continuously busy and the disk space is insufficient, the completely expired parts cannot be selected and dropped, resulting in insufficient disk space. My idea is that when the entire Part expires, there is no need for additional disk space to guarantee, ensure the normal execution of TTL. [#42869](https://github.com/ClickHouse/ClickHouse/pull/42869) ([zhongyuankai](https://github.com/zhongyuankai)). +* Add `oss` function and `OSS` table engine (this is convenient for users). oss is fully compatible with s3. [#43155](https://github.com/ClickHouse/ClickHouse/pull/43155) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve error reporting in the collection of OS-related info for the `system.asynchronous_metrics` table. [#43192](https://github.com/ClickHouse/ClickHouse/pull/43192) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Modify the `INFORMATION_SCHEMA` tables in a way so that ClickHouse can connect to itself using the MySQL compatibility protocol. Add columns instead of aliases (related to [#9769](https://github.com/ClickHouse/ClickHouse/issues/9769)). It will improve the compatibility with various MySQL clients. [#43198](https://github.com/ClickHouse/ClickHouse/pull/43198) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add some functions for compatibility with PowerBI, when it connects using MySQL protocol [#42612](https://github.com/ClickHouse/ClickHouse/pull/42612) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Better usability for Dashboard on changes [#42872](https://github.com/ClickHouse/ClickHouse/pull/42872) ([Vladimir C](https://github.com/vdimir)). + +#### Build/Testing/Packaging Improvement +* Run SQLancer for each pull request and commit to master. [SQLancer](https://github.com/sqlancer/sqlancer) is an OpenSource fuzzer that focuses on automatic detection of logical bugs. [#42397](https://github.com/ClickHouse/ClickHouse/pull/42397) ([Ilya Yatsishin](https://github.com/qoega)). +* Update to latest zlib-ng. [#42463](https://github.com/ClickHouse/ClickHouse/pull/42463) ([Boris Kuschel](https://github.com/bkuschel)). +* Add support for testing ClickHouse server with Jepsen. By the way, we already have support for testing ClickHouse Keeper with Jepsen. This pull request extends it to Replicated tables. [#42619](https://github.com/ClickHouse/ClickHouse/pull/42619) ([Antonio Andelic](https://github.com/antonio2368)). +* Use https://github.com/matus-chochlik/ctcache for clang-tidy results caching. [#42913](https://github.com/ClickHouse/ClickHouse/pull/42913) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Before the fix, the user-defined config was preserved by RPM in `$file.rpmsave`. The PR fixes it and won't replace the user's files from packages. [#42936](https://github.com/ClickHouse/ClickHouse/pull/42936) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove some libraries from Ubuntu Docker image. [#42622](https://github.com/ClickHouse/ClickHouse/pull/42622) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Updated normaliser to clone the alias ast. Resolves [#42452](https://github.com/ClickHouse/ClickHouse/issues/42452) Implementation: * Updated QueryNormalizer to clone alias ast, when its replaced. Previously just assigning the same leads to exception in LogicalExpressinsOptimizer as it would be the same parent being inserted again. * This bug is not seen with new analyser (allow_experimental_analyzer), so no changes for it. I added a test for the same. [#42827](https://github.com/ClickHouse/ClickHouse/pull/42827) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix race for backup of tables in `Lazy` databases. [#43104](https://github.com/ClickHouse/ClickHouse/pull/43104) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix for `skip_unavailable_shards`: it did not work with the `s3Cluster` table function. [#43131](https://github.com/ClickHouse/ClickHouse/pull/43131) ([chen](https://github.com/xiedeyantu)). +* Fix schema inference in `s3Cluster` and improvement in `hdfsCluster`. [#41979](https://github.com/ClickHouse/ClickHouse/pull/41979) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix retries while reading from URL table engines / table function. (retriable errors could be retries more times than needed, non-retriable errors resulted in failed assertion in code). [#42224](https://github.com/ClickHouse/ClickHouse/pull/42224) ([Kseniia Sumarokova](https://github.com/kssenii)). +* A segmentation fault related to DNS & c-ares has been reported and fixed. [#42234](https://github.com/ClickHouse/ClickHouse/pull/42234) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix `LOGICAL_ERROR` `Arguments of 'plus' have incorrect data types` which may happen in PK analysis (monotonicity check). Fix invalid PK analysis for monotonic binary functions with first constant argument. [#42410](https://github.com/ClickHouse/ClickHouse/pull/42410) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect key analysis when key types cannot be inside Nullable. This fixes [#42456](https://github.com/ClickHouse/ClickHouse/issues/42456). [#42469](https://github.com/ClickHouse/ClickHouse/pull/42469) ([Amos Bird](https://github.com/amosbird)). +* Fix typo in a setting name that led to bad usage of schema inference cache while using setting `input_format_csv_use_best_effort_in_schema_inference`. Closes [#41735](https://github.com/ClickHouse/ClickHouse/issues/41735). [#42536](https://github.com/ClickHouse/ClickHouse/pull/42536) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix creating a Set with wrong header when data type is LowCardinality. Closes [#42460](https://github.com/ClickHouse/ClickHouse/issues/42460). [#42579](https://github.com/ClickHouse/ClickHouse/pull/42579) ([flynn](https://github.com/ucasfl)). +* `(U)Int128` and `(U)Int256` values were correctly checked in `PREWHERE`. [#42605](https://github.com/ClickHouse/ClickHouse/pull/42605) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix a bug in functions parser that could have led to a segmentation fault. [#42724](https://github.com/ClickHouse/ClickHouse/pull/42724) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix the locking in `truncate table`. [#42728](https://github.com/ClickHouse/ClickHouse/pull/42728) ([flynn](https://github.com/ucasfl)). +* Fix possible crash in `web` disks when file does not exist (or `OPTIMIZE TABLE FINAL`, that also can got the same error eventually). [#42767](https://github.com/ClickHouse/ClickHouse/pull/42767) ([Azat Khuzhin](https://github.com/azat)). +* Fix `auth_type` mapping in `system.session_log`, by including `SSL_CERTIFICATE` for the enum values. [#42782](https://github.com/ClickHouse/ClickHouse/pull/42782) ([Miel Donkers](https://github.com/mdonkers)). +* Fix stack-use-after-return under ASAN build in the Create User query parser. [#42804](https://github.com/ClickHouse/ClickHouse/pull/42804) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix `lowerUTF8`/`upperUTF8` in case of symbol was in between 16-byte boundary (very frequent case of you have strings > 16 bytes long). [#42812](https://github.com/ClickHouse/ClickHouse/pull/42812) ([Azat Khuzhin](https://github.com/azat)). +* Additional bound check was added to LZ4 decompression routine to fix misbehaviour in case of malformed input. [#42868](https://github.com/ClickHouse/ClickHouse/pull/42868) ([Nikita Taranov](https://github.com/nickitat)). +* Fix rare possible hang on query cancellation. [#42874](https://github.com/ClickHouse/ClickHouse/pull/42874) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect behavior with multiple disjuncts in hash join, close [#42832](https://github.com/ClickHouse/ClickHouse/issues/42832). [#42876](https://github.com/ClickHouse/ClickHouse/pull/42876) ([Vladimir C](https://github.com/vdimir)). +* A null pointer will be generated when select if as from ‘three table join’ , For example, this SQL query: [#42883](https://github.com/ClickHouse/ClickHouse/pull/42883) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix memory sanitizer report in Cluster Discovery, close [#42763](https://github.com/ClickHouse/ClickHouse/issues/42763). [#42905](https://github.com/ClickHouse/ClickHouse/pull/42905) ([Vladimir C](https://github.com/vdimir)). +* Improve DateTime schema inference in case of empty string. [#42911](https://github.com/ClickHouse/ClickHouse/pull/42911) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare NOT_FOUND_COLUMN_IN_BLOCK error when projection is possible to use but there is no projection available. This fixes [#42771](https://github.com/ClickHouse/ClickHouse/issues/42771) . The bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/25563. [#42938](https://github.com/ClickHouse/ClickHouse/pull/42938) ([Amos Bird](https://github.com/amosbird)). +* Fix ATTACH TABLE in `PostgreSQL` database engine if the table contains DATETIME data type. Closes [#42817](https://github.com/ClickHouse/ClickHouse/issues/42817). [#42960](https://github.com/ClickHouse/ClickHouse/pull/42960) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix lambda parsing. Closes [#41848](https://github.com/ClickHouse/ClickHouse/issues/41848). [#42979](https://github.com/ClickHouse/ClickHouse/pull/42979) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix incorrect key analysis when nullable keys appear in the middle of a hyperrectangle. This fixes [#43111](https://github.com/ClickHouse/ClickHouse/issues/43111) . [#43133](https://github.com/ClickHouse/ClickHouse/pull/43133) ([Amos Bird](https://github.com/amosbird)). +* Fix several buffer over-reads in deserialization of carefully crafted aggregate function states. [#43159](https://github.com/ClickHouse/ClickHouse/pull/43159) ([Raúl Marín](https://github.com/Algunenano)). +* Fix function `if` in case of NULL and const Nullable arguments. Closes [#43069](https://github.com/ClickHouse/ClickHouse/issues/43069). [#43178](https://github.com/ClickHouse/ClickHouse/pull/43178) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix decimal math overflow in parsing DateTime with the 'best effort' algorithm. Closes [#43061](https://github.com/ClickHouse/ClickHouse/issues/43061). [#43180](https://github.com/ClickHouse/ClickHouse/pull/43180) ([Kruglov Pavel](https://github.com/Avogar)). +* The `indent` field produced by the `git-import` tool was miscalculated. See https://clickhouse.com/docs/ja/getting-started/example-datasets/github/. [#43191](https://github.com/ClickHouse/ClickHouse/pull/43191) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed unexpected behaviour of `Interval` types with subquery and casting. [#43193](https://github.com/ClickHouse/ClickHouse/pull/43193) ([jh0x](https://github.com/jh0x)). + +### ClickHouse release 22.10, 2022-10-25 + +#### Backward Incompatible Change +* Rename cache commands: `show caches` -> `show filesystem caches`, `describe cache` -> `describe filesystem cache`. [#41508](https://github.com/ClickHouse/ClickHouse/pull/41508) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove support for the `WITH TIMEOUT` section for `LIVE VIEW`. This closes [#40557](https://github.com/ClickHouse/ClickHouse/issues/40557). [#42173](https://github.com/ClickHouse/ClickHouse/pull/42173) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove support for the `{database}` macro from the client's prompt. It was displayed incorrectly if the database was unspecified and it was not updated on `USE` statements. This closes [#25891](https://github.com/ClickHouse/ClickHouse/issues/25891). [#42508](https://github.com/ClickHouse/ClickHouse/pull/42508) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Composable protocol configuration is added. Now different protocols can be set up with different listen hosts. Protocol wrappers such as PROXYv1 can be set up over any other protocols (TCP, TCP secure, MySQL, Postgres). [#41198](https://github.com/ClickHouse/ClickHouse/pull/41198) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add `S3` as a new type of the destination of backups. Support BACKUP to S3 with as-is path/data structure. [#42333](https://github.com/ClickHouse/ClickHouse/pull/42333) ([Vitaly Baranov](https://github.com/vitlibar)), [#42232](https://github.com/ClickHouse/ClickHouse/pull/42232) ([Azat Khuzhin](https://github.com/azat)). +* Added functions (`randUniform`, `randNormal`, `randLogNormal`, `randExponential`, `randChiSquared`, `randStudentT`, `randFisherF`, `randBernoulli`, `randBinomial`, `randNegativeBinomial`, `randPoisson`) to generate random values according to the specified distributions. This closes [#21834](https://github.com/ClickHouse/ClickHouse/issues/21834). [#42411](https://github.com/ClickHouse/ClickHouse/pull/42411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* An improvement for ClickHouse Keeper: add support for uploading snapshots to S3. S3 information can be defined inside `keeper_server.s3_snapshot`. [#41342](https://github.com/ClickHouse/ClickHouse/pull/41342) ([Antonio Andelic](https://github.com/antonio2368)). +* Added an aggregate function `analysisOfVariance` (`anova`) to perform a statistical test over several groups of normally distributed observations to find out whether all groups have the same mean or not. Original PR [#37872](https://github.com/ClickHouse/ClickHouse/issues/37872). [#42131](https://github.com/ClickHouse/ClickHouse/pull/42131) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support limiting of temporary data stored on disk using settings `max_temporary_data_on_disk_size_for_user`/`max_temporary_data_on_disk_size_for_query` . [#40893](https://github.com/ClickHouse/ClickHouse/pull/40893) ([Vladimir C](https://github.com/vdimir)). +* Add setting `format_json_object_each_row_column_for_object_name` to write/parse object name as column value in JSONObjectEachRow format. [#41703](https://github.com/ClickHouse/ClickHouse/pull/41703) ([Kruglov Pavel](https://github.com/Avogar)). +* Add BLAKE3 hash-function to SQL. [#33435](https://github.com/ClickHouse/ClickHouse/pull/33435) ([BoloniniD](https://github.com/BoloniniD)). +* The function `javaHash` has been extended to integers. [#41131](https://github.com/ClickHouse/ClickHouse/pull/41131) ([JackyWoo](https://github.com/JackyWoo)). +* Add OpenTelemetry support to ON CLUSTER DDL (require `distributed_ddl_entry_format_version` to be set to 4). [#41484](https://github.com/ClickHouse/ClickHouse/pull/41484) ([Frank Chen](https://github.com/FrankChen021)). +* Added system table `asynchronous_insert_log`. It contains information about asynchronous inserts (including results of queries in fire-and-forget mode (with `wait_for_async_insert=0`)) for better introspection. [#42040](https://github.com/ClickHouse/ClickHouse/pull/42040) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for methods `lz4`, `bz2`, `snappy` in HTTP's `Accept-Encoding` which is a non-standard extension to HTTP protocol. [#42071](https://github.com/ClickHouse/ClickHouse/pull/42071) ([Nikolay Degterinsky](https://github.com/evillique)). +* Adds Morton Coding (ZCurve) encode/decode functions. [#41753](https://github.com/ClickHouse/ClickHouse/pull/41753) ([Constantine Peresypkin](https://github.com/pkit)). +* Add support for `SET setting_name = DEFAULT`. [#42187](https://github.com/ClickHouse/ClickHouse/pull/42187) ([Filatenkov Artur](https://github.com/FArthur-cmd)). + +#### Experimental Feature +* Added new infrastructure for query analysis and planning under the `allow_experimental_analyzer` setting. [#31796](https://github.com/ClickHouse/ClickHouse/pull/31796) ([Maksim Kita](https://github.com/kitaisreal)). +* Initial implementation of Kusto Query Language. Please don't use it. [#37961](https://github.com/ClickHouse/ClickHouse/pull/37961) ([Yong Wang](https://github.com/kashwy)). + +#### Performance Improvement +* Relax the "Too many parts" threshold. This closes [#6551](https://github.com/ClickHouse/ClickHouse/issues/6551). Now ClickHouse will allow more parts in a partition if the average part size is large enough (at least 10 GiB). This allows to have up to petabytes of data in a single partition of a single table on a single server, which is possible using disk shelves or object storage. [#42002](https://github.com/ClickHouse/ClickHouse/pull/42002) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Implement operator precedence element parser to make the required stack size smaller. [#34892](https://github.com/ClickHouse/ClickHouse/pull/34892) ([Nikolay Degterinsky](https://github.com/evillique)). +* DISTINCT in order optimization leverage sorting properties of data streams. This improvement will enable reading in order for DISTINCT if applicable (before it was necessary to provide ORDER BY for columns in DISTINCT). [#41014](https://github.com/ClickHouse/ClickHouse/pull/41014) ([Igor Nikonov](https://github.com/devcrafter)). +* ColumnVector: optimize UInt8 index with AVX512VBMI. [#41247](https://github.com/ClickHouse/ClickHouse/pull/41247) ([Guo Wangyang](https://github.com/guowangy)). +* Optimize the lock contentions for `ThreadGroupStatus::mutex`. The performance experiments of **SSB** (Star Schema Benchmark) on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) shows that this change could bring a **2.95x** improvement of the geomean of all subcases' QPS. [#41675](https://github.com/ClickHouse/ClickHouse/pull/41675) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Add `ldapr` capabilities to AArch64 builds. This is supported from Graviton 2+, Azure and GCP instances. Only appeared in clang-15 [not so long ago](https://github.com/llvm/llvm-project/commit/9609b5daffe9fd28d83d83da895abc5113f76c24). [#41778](https://github.com/ClickHouse/ClickHouse/pull/41778) ([Daniel Kutenin](https://github.com/danlark1)). +* Improve performance when comparing strings and one argument is an empty constant string. [#41870](https://github.com/ClickHouse/ClickHouse/pull/41870) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize `insertFrom` of ColumnAggregateFunction to share Aggregate State in some cases. [#41960](https://github.com/ClickHouse/ClickHouse/pull/41960) ([flynn](https://github.com/ucasfl)). +* Make writing to `azure_blob_storage` disks faster (respect `max_single_part_upload_size` instead of writing a block per each buffer size). Inefficiency mentioned in [#41754](https://github.com/ClickHouse/ClickHouse/issues/41754). [#42041](https://github.com/ClickHouse/ClickHouse/pull/42041) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make thread ids in the process list and query_log unique to avoid waste. [#42180](https://github.com/ClickHouse/ClickHouse/pull/42180) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support skipping cache completely (both download to cache and reading cached data) in case the requested read range exceeds the threshold defined by cache setting `bypass_cache_threashold`, requires to be enabled with `enable_bypass_cache_with_threshold`). [#42418](https://github.com/ClickHouse/ClickHouse/pull/42418) ([Han Shukai](https://github.com/KinderRiven)). This helps on slow local disks. + +#### Improvement +* Add setting `allow_implicit_no_password`: in combination with `allow_no_password` it forbids creating a user with no password unless `IDENTIFIED WITH no_password` is explicitly specified. [#41341](https://github.com/ClickHouse/ClickHouse/pull/41341) ([Nikolay Degterinsky](https://github.com/evillique)). +* Embedded Keeper will always start in the background allowing ClickHouse to start without achieving quorum. [#40991](https://github.com/ClickHouse/ClickHouse/pull/40991) ([Antonio Andelic](https://github.com/antonio2368)). +* Made reestablishing a new connection to ZooKeeper more reactive in case of expiration of the previous one. Previously there was a task which spawns every minute by default and thus a table could be in readonly state for about this time. [#41092](https://github.com/ClickHouse/ClickHouse/pull/41092) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now projections can be used with zero copy replication (zero-copy replication is a non-production feature). [#41147](https://github.com/ClickHouse/ClickHouse/pull/41147) ([alesapin](https://github.com/alesapin)). +* Support expression `(EXPLAIN SELECT ...)` in a subquery. Queries like `SELECT * FROM (EXPLAIN PIPELINE SELECT col FROM TABLE ORDER BY col)` became valid. [#40630](https://github.com/ClickHouse/ClickHouse/pull/40630) ([Vladimir C](https://github.com/vdimir)). +* Allow changing `async_insert_max_data_size` or `async_insert_busy_timeout_ms` in scope of query. E.g. user wants to insert data rarely and she doesn't have access to the server config to tune default settings. [#40668](https://github.com/ClickHouse/ClickHouse/pull/40668) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Improvements for reading from remote filesystems, made threadpool size for reads/writes configurable. Closes [#41070](https://github.com/ClickHouse/ClickHouse/issues/41070). [#41011](https://github.com/ClickHouse/ClickHouse/pull/41011) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support all combinators combination in WindowTransform/arratReduce*/initializeAggregation/aggregate functions versioning. Previously combinators like `ForEach/Resample/Map` didn't work in these places, using them led to exception like`State function ... inserts results into non-state column`. [#41107](https://github.com/ClickHouse/ClickHouse/pull/41107) ([Kruglov Pavel](https://github.com/Avogar)). +* Add function `tryDecrypt` that returns NULL when decrypt fails (e.g. decrypt with incorrect key) instead of throwing an exception. [#41206](https://github.com/ClickHouse/ClickHouse/pull/41206) ([Duc Canh Le](https://github.com/canhld94)). +* Add the `unreserved_space` column to the `system.disks` table to check how much space is not taken by reservations per disk. [#41254](https://github.com/ClickHouse/ClickHouse/pull/41254) ([filimonov](https://github.com/filimonov)). +* Support s3 authorization headers in table function arguments. [#41261](https://github.com/ClickHouse/ClickHouse/pull/41261) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for MultiRead in Keeper and internal ZooKeeper client (this is an extension to ZooKeeper protocol, only available in ClickHouse Keeper). [#41410](https://github.com/ClickHouse/ClickHouse/pull/41410) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for decimal type comparing with floating point literal in IN operator. [#41544](https://github.com/ClickHouse/ClickHouse/pull/41544) ([liang.huang](https://github.com/lhuang09287750)). +* Allow readable size values (like `1TB`) in cache config. [#41688](https://github.com/ClickHouse/ClickHouse/pull/41688) ([Kseniia Sumarokova](https://github.com/kssenii)). +* ClickHouse could cache stale DNS entries for some period of time (15 seconds by default) until the cache won't be updated asynchronously. During these periods ClickHouse can nevertheless try to establish a connection and produce errors. This behavior is fixed. [#41707](https://github.com/ClickHouse/ClickHouse/pull/41707) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add interactive history search with fzf-like utility (fzf/sk) for `clickhouse-client`/`clickhouse-local` (note you can use `FZF_DEFAULT_OPTS`/`SKIM_DEFAULT_OPTIONS` to additionally configure the behavior). [#41730](https://github.com/ClickHouse/ClickHouse/pull/41730) ([Azat Khuzhin](https://github.com/azat)). +* Only allow clients connecting to a secure server with an invalid certificate only to proceed with the '--accept-certificate' flag. [#41743](https://github.com/ClickHouse/ClickHouse/pull/41743) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add function `tryBase58Decode`, similar to the existing function `tryBase64Decode`. [#41824](https://github.com/ClickHouse/ClickHouse/pull/41824) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve feedback when replacing partition with different primary key. Fixes [#34798](https://github.com/ClickHouse/ClickHouse/issues/34798). [#41838](https://github.com/ClickHouse/ClickHouse/pull/41838) ([Salvatore](https://github.com/tbsal)). +* Fix parallel parsing: segmentator now checks `max_block_size`. This fixed memory overallocation in case of parallel parsing and small LIMIT. [#41852](https://github.com/ClickHouse/ClickHouse/pull/41852) ([Vitaly Baranov](https://github.com/vitlibar)). +* Don't add "TABLE_IS_DROPPED" exception to `system.errors` if it's happened during SELECT from a system table and was ignored. [#41908](https://github.com/ClickHouse/ClickHouse/pull/41908) ([AlfVII](https://github.com/AlfVII)). +* Improve option `enable_extended_results_for_datetime_functions` to return results of type DateTime64 for functions `toStartOfDay`, `toStartOfHour`, `toStartOfFifteenMinutes`, `toStartOfTenMinutes`, `toStartOfFiveMinutes`, `toStartOfMinute` and `timeSlot`. [#41910](https://github.com/ClickHouse/ClickHouse/pull/41910) ([Roman Vasin](https://github.com/rvasin)). +* Improve `DateTime` type inference for text formats. Now it respects setting `date_time_input_format` and doesn't try to infer datetimes from numbers as timestamps. Closes [#41389](https://github.com/ClickHouse/ClickHouse/issues/41389) Closes [#42206](https://github.com/ClickHouse/ClickHouse/issues/42206). [#41912](https://github.com/ClickHouse/ClickHouse/pull/41912) ([Kruglov Pavel](https://github.com/Avogar)). +* Remove confusing warning when inserting with `perform_ttl_move_on_insert` = false. [#41980](https://github.com/ClickHouse/ClickHouse/pull/41980) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow user to write `countState(*)` similar to `count(*)`. This closes [#9338](https://github.com/ClickHouse/ClickHouse/issues/9338). [#41983](https://github.com/ClickHouse/ClickHouse/pull/41983) ([Amos Bird](https://github.com/amosbird)). +* Fix `rankCorr` size overflow. [#42020](https://github.com/ClickHouse/ClickHouse/pull/42020) ([Duc Canh Le](https://github.com/canhld94)). +* Added an option to specify an arbitrary string as an environment name in the Sentry's config for more handy reports. [#42037](https://github.com/ClickHouse/ClickHouse/pull/42037) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix parsing out-of-range Date from CSV. [#42044](https://github.com/ClickHouse/ClickHouse/pull/42044) ([Andrey Zvonov](https://github.com/zvonand)). +* `parseDataTimeBestEffort` now supports comma between date and time. Closes [#42038](https://github.com/ClickHouse/ClickHouse/issues/42038). [#42049](https://github.com/ClickHouse/ClickHouse/pull/42049) ([flynn](https://github.com/ucasfl)). +* Improved stale replica recovery process for `ReplicatedMergeTree`. If a lost replica has some parts which are absent from a healthy replica, but these parts should appear in the future according to the replication queue of the healthy replica, then the lost replica will keep such parts instead of detaching them. [#42134](https://github.com/ClickHouse/ClickHouse/pull/42134) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add a possibility to use `Date32` arguments for date_diff function. Fix issue in date_diff function when using DateTime64 arguments with a start date before Unix epoch and end date after Unix epoch. [#42308](https://github.com/ClickHouse/ClickHouse/pull/42308) ([Roman Vasin](https://github.com/rvasin)). +* When uploading big parts to Minio, 'Complete Multipart Upload' can take a long time. Minio sends heartbeats every 10 seconds (see https://github.com/minio/minio/pull/7198). But clickhouse times out earlier, because the default send/receive timeout is [set](https://github.com/ClickHouse/ClickHouse/blob/cc24fcd6d5dfb67f5f66f5483e986bd1010ad9cf/src/IO/S3/PocoHTTPClient.cpp#L123) to 5 seconds. [#42321](https://github.com/ClickHouse/ClickHouse/pull/42321) ([filimonov](https://github.com/filimonov)). +* Fix rarely invalid cast of aggregate state types with complex types such as Decimal. This fixes [#42408](https://github.com/ClickHouse/ClickHouse/issues/42408). [#42417](https://github.com/ClickHouse/ClickHouse/pull/42417) ([Amos Bird](https://github.com/amosbird)). +* Allow to use `Date32` arguments for `dateName` function. [#42554](https://github.com/ClickHouse/ClickHouse/pull/42554) ([Roman Vasin](https://github.com/rvasin)). +* Now filters with NULL literals will be used during index analysis. [#34063](https://github.com/ClickHouse/ClickHouse/issues/34063). [#41842](https://github.com/ClickHouse/ClickHouse/pull/41842) ([Amos Bird](https://github.com/amosbird)). +* Merge parts if every part in the range is older than a certain threshold. The threshold can be set by using `min_age_to_force_merge_seconds`. This closes [#35836](https://github.com/ClickHouse/ClickHouse/issues/35836). [#42423](https://github.com/ClickHouse/ClickHouse/pull/42423) ([Antonio Andelic](https://github.com/antonio2368)). This is continuation of [#39550i](https://github.com/ClickHouse/ClickHouse/pull/39550) by [@fastio](https://github.com/fastio) who implemented most of the logic. +* Added new infrastructure for query analysis and planning under `allow_experimental_analyzer` setting. [#31796](https://github.com/ClickHouse/ClickHouse/pull/31796) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve the time to recover lost keeper connections. [#42541](https://github.com/ClickHouse/ClickHouse/pull/42541) ([Raúl Marín](https://github.com/Algunenano)). + +#### Build/Testing/Packaging Improvement +* Add fuzzer for table definitions [#40096](https://github.com/ClickHouse/ClickHouse/pull/40096) ([Anton Popov](https://github.com/CurtizJ)). This represents the biggest advancement for ClickHouse testing in this year so far. +* Beta version of the ClickHouse Cloud service is released: [https://clickhouse.cloud/](https://clickhouse.cloud/). It provides the easiest way to use ClickHouse (even slightly easier than the single-command installation). +* Added support of WHERE clause generation to AST Fuzzer and possibility to add or remove ORDER BY and WHERE clause. [#38519](https://github.com/ClickHouse/ClickHouse/pull/38519) ([Ilya Yatsishin](https://github.com/qoega)). +* Aarch64 binaries now require at least ARMv8.2, released in 2016. Most notably, this enables use of ARM LSE, i.e. native atomic operations. Also, CMake build option "NO_ARMV81_OR_HIGHER" has been added to allow compilation of binaries for older ARMv8.0 hardware, e.g. Raspberry Pi 4. [#41610](https://github.com/ClickHouse/ClickHouse/pull/41610) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow building ClickHouse with Musl (small changes after it was already supported but broken). [#41987](https://github.com/ClickHouse/ClickHouse/pull/41987) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add the `$CLICKHOUSE_CRONFILE` file checking to avoid running the `sed` command to get the file not found error on install. [#42081](https://github.com/ClickHouse/ClickHouse/pull/42081) ([Chun-Sheng, Li](https://github.com/peter279k)). +* Update cctz to `2022e` to support the new timezone changes. Palestine transitions are now Saturdays at 02:00. Simplify three Ukraine zones into one. Jordan and Syria switch from +02/+03 with DST to year-round +03. (https://data.iana.org/time-zones/tzdb/NEWS). This closes [#42252](https://github.com/ClickHouse/ClickHouse/issues/42252). [#42327](https://github.com/ClickHouse/ClickHouse/pull/42327) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#42273](https://github.com/ClickHouse/ClickHouse/pull/42273) ([Dom Del Nano](https://github.com/ddelnano)). +* Add Rust code support into ClickHouse with BLAKE3 hash-function library as an example. [#33435](https://github.com/ClickHouse/ClickHouse/pull/33435) ([BoloniniD](https://github.com/BoloniniD)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Choose correct aggregation method for `LowCardinality` with big integer types. [#42342](https://github.com/ClickHouse/ClickHouse/pull/42342) ([Duc Canh Le](https://github.com/canhld94)). +* Several fixes for `web` disk. [#41652](https://github.com/ClickHouse/ClickHouse/pull/41652) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixes an issue that causes docker run to fail if `https_port` is not present in config. [#41693](https://github.com/ClickHouse/ClickHouse/pull/41693) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Mutations were not cancelled properly on server shutdown or `SYSTEM STOP MERGES` query and cancellation might take long time, it's fixed. [#41699](https://github.com/ClickHouse/ClickHouse/pull/41699) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix wrong result of queries with `ORDER BY` or `GROUP BY` by columns from prefix of sorting key, wrapped into monotonic functions, with enable "read in order" optimization (settings `optimize_read_in_order` and `optimize_aggregation_in_order`). [#41701](https://github.com/ClickHouse/ClickHouse/pull/41701) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible crash in `SELECT` from `Merge` table with enabled `optimize_monotonous_functions_in_order_by` setting. Fixes [#41269](https://github.com/ClickHouse/ClickHouse/issues/41269). [#41740](https://github.com/ClickHouse/ClickHouse/pull/41740) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed "Part ... intersects part ..." error that might happen in extremely rare cases if replica was restarted just after detaching some part as broken. [#41741](https://github.com/ClickHouse/ClickHouse/pull/41741) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Don't allow to create or alter merge tree tables with column name `_row_exists`, which is reserved for lightweight delete. Fixed [#41716](https://github.com/ClickHouse/ClickHouse/issues/41716). [#41763](https://github.com/ClickHouse/ClickHouse/pull/41763) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix a bug that CORS headers are missing in some HTTP responses. [#41792](https://github.com/ClickHouse/ClickHouse/pull/41792) ([Frank Chen](https://github.com/FrankChen021)). +* 22.9 might fail to startup `ReplicatedMergeTree` table if that table was created by 20.3 or older version and was never altered, it's fixed. Fixes [#41742](https://github.com/ClickHouse/ClickHouse/issues/41742). [#41796](https://github.com/ClickHouse/ClickHouse/pull/41796) ([Alexander Tokmakov](https://github.com/tavplubix)). +* When the batch sending fails for some reason, it cannot be automatically recovered, and if it is not processed in time, it will lead to accumulation, and the printed error message will become longer and longer, which will cause the http thread to block. [#41813](https://github.com/ClickHouse/ClickHouse/pull/41813) ([zhongyuankai](https://github.com/zhongyuankai)). +* Fix compact parts with compressed marks setting. Fixes [#41783](https://github.com/ClickHouse/ClickHouse/issues/41783) and [#41746](https://github.com/ClickHouse/ClickHouse/issues/41746). [#41823](https://github.com/ClickHouse/ClickHouse/pull/41823) ([alesapin](https://github.com/alesapin)). +* Old versions of Replicated database don't have a special marker in [Zoo]Keeper. We need to check only whether the node contains come obscure data instead of special mark. [#41875](https://github.com/ClickHouse/ClickHouse/pull/41875) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix possible exception in fs cache. [#41884](https://github.com/ClickHouse/ClickHouse/pull/41884) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `use_environment_credentials` for s3 table function. [#41970](https://github.com/ClickHouse/ClickHouse/pull/41970) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed "Directory already exists and is not empty" error on detaching broken part that might prevent `ReplicatedMergeTree` table from starting replication. Fixes [#40957](https://github.com/ClickHouse/ClickHouse/issues/40957). [#41981](https://github.com/ClickHouse/ClickHouse/pull/41981) ([Alexander Tokmakov](https://github.com/tavplubix)). +* `toDateTime64` now returns the same output with negative integer and float arguments. [#42025](https://github.com/ClickHouse/ClickHouse/pull/42025) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix write into `azure_blob_storage`. Partially closes [#41754](https://github.com/ClickHouse/ClickHouse/issues/41754). [#42034](https://github.com/ClickHouse/ClickHouse/pull/42034) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix the `bzip2` decoding issue for specific `bzip2` files. [#42046](https://github.com/ClickHouse/ClickHouse/pull/42046) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix SQL function `toLastDayOfMonth` with setting "enable_extended_results_for_datetime_functions = 1" at the beginning of the extended range (January 1900). - Fix SQL function "toRelativeWeekNum()" with setting "enable_extended_results_for_datetime_functions = 1" at the end of extended range (December 2299). - Improve the performance of for SQL functions "toISOYear()", "toFirstDayNumOfISOYearIndex()" and "toYearWeekOfNewyearMode()" by avoiding unnecessary index arithmetics. [#42084](https://github.com/ClickHouse/ClickHouse/pull/42084) ([Roman Vasin](https://github.com/rvasin)). +* The maximum size of fetches for each table accidentally was set to 8 while the pool size could be bigger. Now the maximum size of fetches for table is equal to the pool size. [#42090](https://github.com/ClickHouse/ClickHouse/pull/42090) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* A table might be shut down and a dictionary might be detached before checking if can be dropped without breaking dependencies between table, it's fixed. Fixes [#41982](https://github.com/ClickHouse/ClickHouse/issues/41982). [#42106](https://github.com/ClickHouse/ClickHouse/pull/42106) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix bad inefficiency of `remote_filesystem_read_method=read` with filesystem cache. Closes [#42125](https://github.com/ClickHouse/ClickHouse/issues/42125). [#42129](https://github.com/ClickHouse/ClickHouse/pull/42129) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible timeout exception for distributed queries with use_hedged_requests = 0. [#42130](https://github.com/ClickHouse/ClickHouse/pull/42130) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a minor bug inside function `runningDifference` in case of using it with `Date32` type. Previously `Date` was used and it may cause some logical errors like `Bad cast from type DB::ColumnVector to DB::ColumnVector'`. [#42143](https://github.com/ClickHouse/ClickHouse/pull/42143) ([Alfred Xu](https://github.com/sperlingxx)). +* Fix reusing of files > 4GB from base backup. [#42146](https://github.com/ClickHouse/ClickHouse/pull/42146) ([Azat Khuzhin](https://github.com/azat)). +* DISTINCT in order fails with LOGICAL_ERROR if first column in sorting key contains function. [#42186](https://github.com/ClickHouse/ClickHouse/pull/42186) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix a bug with projections and the `aggregate_functions_null_for_empty` setting. This bug is very rare and appears only if you enable the `aggregate_functions_null_for_empty` setting in the server's config. This closes [#41647](https://github.com/ClickHouse/ClickHouse/issues/41647). [#42198](https://github.com/ClickHouse/ClickHouse/pull/42198) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix read from `Buffer` tables with read in order desc. [#42236](https://github.com/ClickHouse/ClickHouse/pull/42236) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a bug which prevents ClickHouse to start when `background_pool_size setting` is set on default profile but `background_merges_mutations_concurrency_ratio` is not. [#42315](https://github.com/ClickHouse/ClickHouse/pull/42315) ([nvartolomei](https://github.com/nvartolomei)). +* `ALTER UPDATE` of attached part (with columns different from table schema) could create an invalid `columns.txt` metadata on disk. Reading from such part could fail with errors or return invalid data. Fixes [#42161](https://github.com/ClickHouse/ClickHouse/issues/42161). [#42319](https://github.com/ClickHouse/ClickHouse/pull/42319) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Setting `additional_table_filters` were not applied to `Distributed` storage. Fixes [#41692](https://github.com/ClickHouse/ClickHouse/issues/41692). [#42322](https://github.com/ClickHouse/ClickHouse/pull/42322) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a data race in query finish/cancel. This closes [#42346](https://github.com/ClickHouse/ClickHouse/issues/42346). [#42362](https://github.com/ClickHouse/ClickHouse/pull/42362) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* This reverts [#40217](https://github.com/ClickHouse/ClickHouse/issues/40217) which introduced a regression in date/time functions. [#42367](https://github.com/ClickHouse/ClickHouse/pull/42367) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix assert cast in join on falsy condition, Close [#42380](https://github.com/ClickHouse/ClickHouse/issues/42380). [#42407](https://github.com/ClickHouse/ClickHouse/pull/42407) ([Vladimir C](https://github.com/vdimir)). +* Fix buffer overflow in the processing of Decimal data types. This closes [#42451](https://github.com/ClickHouse/ClickHouse/issues/42451). [#42465](https://github.com/ClickHouse/ClickHouse/pull/42465) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `AggregateFunctionQuantile` now correctly works with UInt128 columns. Previously, the quantile state interpreted `UInt128` columns as `Int128` which could have led to incorrect results. [#42473](https://github.com/ClickHouse/ClickHouse/pull/42473) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix bad_cast assert during INSERT into `Annoy` indexes over non-Float32 columns. `Annoy` indices is an experimental feature. [#42485](https://github.com/ClickHouse/ClickHouse/pull/42485) ([Robert Schulze](https://github.com/rschu1ze)). +* Arithmetic operator with Date or DateTime and 128 or 256-bit integer was referencing uninitialized memory. [#42453](https://github.com/ClickHouse/ClickHouse/issues/42453). [#42573](https://github.com/ClickHouse/ClickHouse/pull/42573) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix unexpected table loading error when partition key contains alias function names during server upgrade. [#36379](https://github.com/ClickHouse/ClickHouse/pull/36379) ([Amos Bird](https://github.com/amosbird)). + +### ClickHouse release 22.9, 2022-09-22 + +#### Backward Incompatible Change +* Upgrade from 20.3 and older to 22.9 and newer should be done through an intermediate version if there are any `ReplicatedMergeTree` tables, otherwise server with the new version will not start. [#40641](https://github.com/ClickHouse/ClickHouse/pull/40641) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Remove the functions `accurate_Cast` and `accurate_CastOrNull` (they are different to `accurateCast` and `accurateCastOrNull` by underscore in the name and they are not affected by the value of `cast_keep_nullable` setting). These functions were undocumented, untested, unused, and unneeded. They appeared to be alive due to code generalization. [#40682](https://github.com/ClickHouse/ClickHouse/pull/40682) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new table function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/issues/40649). Rename table function `MeiliSearch` to `meilisearch`. [#40709](https://github.com/ClickHouse/ClickHouse/pull/40709) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649). The functions `lemmatize`, `synonyms`, `stem` were case-insensitive by mistake. Now they are case-sensitive. [#40711](https://github.com/ClickHouse/ClickHouse/pull/40711) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* For security and stability reasons, catboost models are no longer evaluated within the ClickHouse server. Instead, the evaluation is now + done in the clickhouse-library-bridge, a separate process that loads the catboost library and communicates with the server process via + HTTP. [#40897](https://github.com/ClickHouse/ClickHouse/pull/40897) ([Robert Schulze](https://github.com/rschu1ze)). +* Make interpretation of YAML configs to be more conventional. [#41044](https://github.com/ClickHouse/ClickHouse/pull/41044) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### New Feature +* Support `insert_quorum = 'auto'` to use majority number. [#39970](https://github.com/ClickHouse/ClickHouse/pull/39970) ([Sachin](https://github.com/SachinSetiya)). +* Add embedded dashboards to ClickHouse server. This is a demo project about how to achieve 90% results with 1% effort using ClickHouse features. [#40461](https://github.com/ClickHouse/ClickHouse/pull/40461) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added new settings constraint writability kind `changeable_in_readonly`. [#40631](https://github.com/ClickHouse/ClickHouse/pull/40631) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for `INTERSECT DISTINCT` and `EXCEPT DISTINCT`. [#40792](https://github.com/ClickHouse/ClickHouse/pull/40792) ([Duc Canh Le](https://github.com/canhld94)). +* Add new input/output format `JSONObjectEachRow` - Support import for formats `JSON/JSONCompact/JSONColumnsWithMetadata`. Add new setting `input_format_json_validate_types_from_metadata` that controls whether we should check if data types from metadata match data types from the header. - Add new setting `input_format_json_validate_utf8`, when it's enabled, all `JSON` formats will validate UTF-8 sequences. It will be disabled by default. Note that this setting doesn't influence output formats `JSON/JSONCompact/JSONColumnsWithMetadata`, they always validate utf8 sequences (this exception was made because of compatibility reasons). - Add new setting `input_format_json_read_numbers_as_strings ` that allows to parse numbers in String column, the setting is disabled by default. - Add new setting `output_format_json_quote_decimals` that allows to output decimals in double quotes, disabled by default. - Allow to parse decimals in double quotes during data import. [#40910](https://github.com/ClickHouse/ClickHouse/pull/40910) ([Kruglov Pavel](https://github.com/Avogar)). +* Query parameters supported in DESCRIBE TABLE query. [#40952](https://github.com/ClickHouse/ClickHouse/pull/40952) ([Nikita Taranov](https://github.com/nickitat)). +* Add support to Parquet Time32/64 by converting it into DateTime64. Parquet time32/64 represents time elapsed since midnight, while DateTime32/64 represents an actual unix timestamp. Conversion simply offsets from `0`. [#41333](https://github.com/ClickHouse/ClickHouse/pull/41333) ([Arthur Passos](https://github.com/arthurpassos)). +* Implement set operations on Apache Datasketches. [#39919](https://github.com/ClickHouse/ClickHouse/pull/39919) ([Fangyuan Deng](https://github.com/pzhdfy)). Note: there is no point of using Apache Datasketches, they are inferiour than ClickHouse and only make sense for integration with other systems. +* Allow recording errors to specified file while reading text formats (`CSV`, `TSV`). [#40516](https://github.com/ClickHouse/ClickHouse/pull/40516) ([zjial](https://github.com/zjial)). + +#### Experimental Feature + +* Add ANN (approximate nearest neighbor) index based on `Annoy`. [#40818](https://github.com/ClickHouse/ClickHouse/pull/40818) ([Filatenkov Artur](https://github.com/FArthur-cmd)). [#37215](https://github.com/ClickHouse/ClickHouse/pull/37215) ([VVMak](https://github.com/VVMak)). +* Add new storage engine `KeeperMap`, that uses ClickHouse Keeper or ZooKeeper as a key-value store. [#39976](https://github.com/ClickHouse/ClickHouse/pull/39976) ([Antonio Andelic](https://github.com/antonio2368)). This storage engine is intended to store a small amount of metadata. +* Improvement for in-memory data parts: remove completely processed WAL files. [#40592](https://github.com/ClickHouse/ClickHouse/pull/40592) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement +* Implement compression of marks and primary key. Close [#34437](https://github.com/ClickHouse/ClickHouse/issues/34437). [#37693](https://github.com/ClickHouse/ClickHouse/pull/37693) ([zhongyuankai](https://github.com/zhongyuankai)). +* Allow to load marks with threadpool in advance. Regulated by setting `load_marks_asynchronously` (default: 0). [#40821](https://github.com/ClickHouse/ClickHouse/pull/40821) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Virtual filesystem over s3 will use random object names split into multiple path prefixes for better performance on AWS. [#40968](https://github.com/ClickHouse/ClickHouse/pull/40968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Account `max_block_size` value while producing single-level aggregation results. Allows to execute following query plan steps using more threads. [#39138](https://github.com/ClickHouse/ClickHouse/pull/39138) ([Nikita Taranov](https://github.com/nickitat)). +* Software prefetching is used in aggregation to speed up operations with hash tables. Controlled by the setting `enable_software_prefetch_in_aggregation`, enabled by default. [#39304](https://github.com/ClickHouse/ClickHouse/pull/39304) ([Nikita Taranov](https://github.com/nickitat)). +* Better support of `optimize_read_in_order` in case when some of sorting key columns are always constant after applying `WHERE` clause. E.g. query like `SELECT ... FROM table WHERE a = 'x' ORDER BY a, b`, where `table` has storage definition: `MergeTree ORDER BY (a, b)`. [#38715](https://github.com/ClickHouse/ClickHouse/pull/38715) ([Anton Popov](https://github.com/CurtizJ)). +* Filter joined streams for `full_sorting_join` by each other before sorting. [#39418](https://github.com/ClickHouse/ClickHouse/pull/39418) ([Vladimir C](https://github.com/vdimir)). +* LZ4 decompression optimised by skipping empty literals processing. [#40142](https://github.com/ClickHouse/ClickHouse/pull/40142) ([Nikita Taranov](https://github.com/nickitat)). +* Speedup backup process using native `copy` when possible instead of copying through `clickhouse-server` memory. [#40395](https://github.com/ClickHouse/ClickHouse/pull/40395) ([alesapin](https://github.com/alesapin)). +* Do not obtain storage snapshot for each INSERT block (slightly improves performance). [#40638](https://github.com/ClickHouse/ClickHouse/pull/40638) ([Azat Khuzhin](https://github.com/azat)). +* Implement batch processing for aggregate functions with multiple nullable arguments. [#41058](https://github.com/ClickHouse/ClickHouse/pull/41058) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up reading UniquesHashSet (`uniqState` from disk for example). [#41089](https://github.com/ClickHouse/ClickHouse/pull/41089) ([Raúl Marín](https://github.com/Algunenano)). +* Fixed high memory usage while executing mutations of compact parts in tables with huge number of columns. [#41122](https://github.com/ClickHouse/ClickHouse/pull/41122) ([lthaooo](https://github.com/lthaooo)). +* Enable the vectorscan library on ARM, this speeds up regexp evaluation. [#41033](https://github.com/ClickHouse/ClickHouse/pull/41033) ([Robert Schulze](https://github.com/rschu1ze)). +* Upgrade vectorscan to 5.4.8 which has many performance optimizations to speed up regexp evaluation. [#41270](https://github.com/ClickHouse/ClickHouse/pull/41270) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix incorrect fallback to skip the local filesystem cache for VFS (like S3) which happened on very high concurrency level. [#40420](https://github.com/ClickHouse/ClickHouse/pull/40420) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If row policy filter is always false, return empty result immediately without reading any data. This closes [#24012](https://github.com/ClickHouse/ClickHouse/issues/24012). [#40740](https://github.com/ClickHouse/ClickHouse/pull/40740) ([Amos Bird](https://github.com/amosbird)). +* Parallel hash JOIN for Float data types might be suboptimal. Make it better. [#41183](https://github.com/ClickHouse/ClickHouse/pull/41183) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* During startup and ATTACH call, `ReplicatedMergeTree` tables will be readonly until the ZooKeeper connection is made and the setup is finished. [#40148](https://github.com/ClickHouse/ClickHouse/pull/40148) ([Antonio Andelic](https://github.com/antonio2368)). +* Add `enable_extended_results_for_datetime_functions` option to return results of type Date32 for functions toStartOfYear, toStartOfISOYear, toStartOfQuarter, toStartOfMonth, toStartOfWeek, toMonday and toLastDayOfMonth when argument is Date32 or DateTime64, otherwise results of Date type are returned. For compatibility reasons default value is ‘0’. [#41214](https://github.com/ClickHouse/ClickHouse/pull/41214) ([Roman Vasin](https://github.com/rvasin)). +* For security and stability reasons, CatBoost models are no longer evaluated within the ClickHouse server. Instead, the evaluation is now done in the clickhouse-library-bridge, a separate process that loads the catboost library and communicates with the server process via HTTP. Function `modelEvaluate()` was replaced by `catboostEvaluate()`. [#40897](https://github.com/ClickHouse/ClickHouse/pull/40897) ([Robert Schulze](https://github.com/rschu1ze)). [#39629](https://github.com/ClickHouse/ClickHouse/pull/39629) ([Robert Schulze](https://github.com/rschu1ze)). +* Add more metrics for on-disk temporary data, close [#40206](https://github.com/ClickHouse/ClickHouse/issues/40206). [#40239](https://github.com/ClickHouse/ClickHouse/pull/40239) ([Vladimir C](https://github.com/vdimir)). +* Add config option `warning_supress_regexp`, close [#40330](https://github.com/ClickHouse/ClickHouse/issues/40330). [#40548](https://github.com/ClickHouse/ClickHouse/pull/40548) ([Vladimir C](https://github.com/vdimir)). +* Add setting to disable limit on kafka_num_consumers. Closes [#40331](https://github.com/ClickHouse/ClickHouse/issues/40331). [#40670](https://github.com/ClickHouse/ClickHouse/pull/40670) ([Kruglov Pavel](https://github.com/Avogar)). +* Support `SETTINGS` in `DELETE ...` query. [#41533](https://github.com/ClickHouse/ClickHouse/pull/41533) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Detailed S3 profile events `DiskS3*` per S3 API call split for S3 ObjectStorage. [#41532](https://github.com/ClickHouse/ClickHouse/pull/41532) ([Sergei Trifonov](https://github.com/serxa)). +* Two new metrics in `system.asynchronous_metrics`. `NumberOfDetachedParts` and `NumberOfDetachedByUserParts`. [#40779](https://github.com/ClickHouse/ClickHouse/pull/40779) ([Sema Checherinda](https://github.com/CheSema)). +* Allow CONSTRAINTs for ODBC and JDBC tables. [#34551](https://github.com/ClickHouse/ClickHouse/pull/34551) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't print `SETTINGS` more than once during query formatting if it didn't appear multiple times in the original query. [#38900](https://github.com/ClickHouse/ClickHouse/pull/38900) ([Raúl Marín](https://github.com/Algunenano)). +* Improve the tracing (OpenTelemetry) context propagation across threads. [#39010](https://github.com/ClickHouse/ClickHouse/pull/39010) ([Frank Chen](https://github.com/FrankChen021)). +* ClickHouse Keeper: add listeners for `interserver_listen_host` only in Keeper if specified. [#39973](https://github.com/ClickHouse/ClickHouse/pull/39973) ([Antonio Andelic](https://github.com/antonio2368)). +* Improve recovery of Replicated user access storage after errors. [#39977](https://github.com/ClickHouse/ClickHouse/pull/39977) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for TTL in `EmbeddedRocksDB`. [#39986](https://github.com/ClickHouse/ClickHouse/pull/39986) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Add schema inference to `clickhouse-obfuscator`, so the `--structure` argument is no longer required. [#40120](https://github.com/ClickHouse/ClickHouse/pull/40120) ([Nikolay Degterinsky](https://github.com/evillique)). +* Improve and fix dictionaries in `Arrow` format. [#40173](https://github.com/ClickHouse/ClickHouse/pull/40173) ([Kruglov Pavel](https://github.com/Avogar)). +* More natural conversion of `Date32`, `DateTime64`, `Date` to narrower types: upper or lower normal value is considered when out of normal range. [#40217](https://github.com/ClickHouse/ClickHouse/pull/40217) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix the case when `Merge` table over `View` cannot use index. [#40233](https://github.com/ClickHouse/ClickHouse/pull/40233) ([Duc Canh Le](https://github.com/canhld94)). +* Custom key names for JSON server logs. [#40251](https://github.com/ClickHouse/ClickHouse/pull/40251) ([Mallik Hassan](https://github.com/SadiHassan)). +* It is now possible to set a custom error code for the exception thrown by function `throwIf`. [#40319](https://github.com/ClickHouse/ClickHouse/pull/40319) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve schema inference cache, respect format settings that can change the schema. [#40414](https://github.com/ClickHouse/ClickHouse/pull/40414) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow parsing `Date` as `DateTime` and `DateTime64`. This implements the enhancement proposed in [#36949](https://github.com/ClickHouse/ClickHouse/issues/36949). [#40474](https://github.com/ClickHouse/ClickHouse/pull/40474) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow conversion from `String` with `DateTime64` like `2022-08-22 01:02:03.456` to `Date` and `Date32`. Allow conversion from String with DateTime like `2022-08-22 01:02:03` to `Date32`. This closes [#39598](https://github.com/ClickHouse/ClickHouse/issues/39598). [#40475](https://github.com/ClickHouse/ClickHouse/pull/40475) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better support for nested data structures in Parquet format [#40485](https://github.com/ClickHouse/ClickHouse/pull/40485) ([Arthur Passos](https://github.com/arthurpassos)). +* Support reading Array(Record) into flatten nested table in Avro. [#40534](https://github.com/ClickHouse/ClickHouse/pull/40534) ([Kruglov Pavel](https://github.com/Avogar)). +* Add read-only support for `EmbeddedRocksDB`. [#40543](https://github.com/ClickHouse/ClickHouse/pull/40543) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Validate the compression method parameter of URL table engine. [#40600](https://github.com/ClickHouse/ClickHouse/pull/40600) ([Frank Chen](https://github.com/FrankChen021)). +* Better format detection for url table function/engine in presence of a query string after a file name. Closes [#40315](https://github.com/ClickHouse/ClickHouse/issues/40315). [#40636](https://github.com/ClickHouse/ClickHouse/pull/40636) ([Kruglov Pavel](https://github.com/Avogar)). +* Disable projection when grouping set is used. It generated wrong result. This fixes [#40635](https://github.com/ClickHouse/ClickHouse/issues/40635). [#40726](https://github.com/ClickHouse/ClickHouse/pull/40726) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect format of `APPLY` column transformer which can break metadata if used in table definition. This fixes [#37590](https://github.com/ClickHouse/ClickHouse/issues/37590). [#40727](https://github.com/ClickHouse/ClickHouse/pull/40727) ([Amos Bird](https://github.com/amosbird)). +* Support the `%z` descriptor for formatting the timezone offset in `formatDateTime`. [#40736](https://github.com/ClickHouse/ClickHouse/pull/40736) ([Cory Levy](https://github.com/LevyCory)). +* The interactive mode in `clickhouse-client` now interprets `.` and `/` as "run the last command". [#40750](https://github.com/ClickHouse/ClickHouse/pull/40750) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix issue with passing MySQL timeouts for MySQL database engine and MySQL table function. Closes [#34168](https://github.com/ClickHouse/ClickHouse/issues/34168). [#40751](https://github.com/ClickHouse/ClickHouse/pull/40751) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Create status file for filesystem cache directory to make sure that cache directories are not shared between different servers or caches. [#40820](https://github.com/ClickHouse/ClickHouse/pull/40820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for `DELETE` and `UPDATE` for `EmbeddedRocksDB` storage. [#40853](https://github.com/ClickHouse/ClickHouse/pull/40853) ([Antonio Andelic](https://github.com/antonio2368)). +* ClickHouse Keeper: fix shutdown during long commit and increase allowed request size. [#40941](https://github.com/ClickHouse/ClickHouse/pull/40941) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix race in WriteBufferFromS3, add TSA annotations. [#40950](https://github.com/ClickHouse/ClickHouse/pull/40950) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Grouping sets with group_by_use_nulls should only convert key columns to nullable. [#40997](https://github.com/ClickHouse/ClickHouse/pull/40997) ([Duc Canh Le](https://github.com/canhld94)). +* Improve the observability of INSERT on distributed table. [#41034](https://github.com/ClickHouse/ClickHouse/pull/41034) ([Frank Chen](https://github.com/FrankChen021)). +* More low-level metrics for S3 interaction. [#41039](https://github.com/ClickHouse/ClickHouse/pull/41039) ([mateng915](https://github.com/mateng0915)). +* Support relative path in Location header after HTTP redirect. Closes [#40985](https://github.com/ClickHouse/ClickHouse/issues/40985). [#41162](https://github.com/ClickHouse/ClickHouse/pull/41162) ([Kruglov Pavel](https://github.com/Avogar)). +* Apply changes to HTTP handlers on fly without server restart. [#41177](https://github.com/ClickHouse/ClickHouse/pull/41177) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse Keeper: properly close active sessions during shutdown. [#41215](https://github.com/ClickHouse/ClickHouse/pull/41215) ([Antonio Andelic](https://github.com/antonio2368)). This lowers the period of "table is read-only" errors. +* Add ability to automatically comment SQL queries in clickhouse-client/local (with `Alt-#`, like in readline). [#41224](https://github.com/ClickHouse/ClickHouse/pull/41224) ([Azat Khuzhin](https://github.com/azat)). +* Fix incompatibility of cache after switching setting `do_no_evict_index_and_mark_files` from 1 to 0, 0 to 1. [#41330](https://github.com/ClickHouse/ClickHouse/pull/41330) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a setting `allow_suspicious_fixed_string_types` to prevent users from creating columns of type FixedString with size > 256. [#41495](https://github.com/ClickHouse/ClickHouse/pull/41495) ([Duc Canh Le](https://github.com/canhld94)). +* Add `has_lightweight_delete` to system.parts. [#41564](https://github.com/ClickHouse/ClickHouse/pull/41564) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Enforce documentation for every setting. [#40644](https://github.com/ClickHouse/ClickHouse/pull/40644) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every current metric. [#40645](https://github.com/ClickHouse/ClickHouse/pull/40645) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every profile event counter. Write the documentation where it was missing. [#40646](https://github.com/ClickHouse/ClickHouse/pull/40646) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow minimal `clickhouse-local` build by correcting some dependencies. [#40460](https://github.com/ClickHouse/ClickHouse/pull/40460) ([Alexey Milovidov](https://github.com/alexey-milovidov)). It is less than 50 MiB. +* Calculate and report SQL function coverage in tests. [#40593](https://github.com/ClickHouse/ClickHouse/issues/40593). [#40647](https://github.com/ClickHouse/ClickHouse/pull/40647) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every MergeTree setting. [#40648](https://github.com/ClickHouse/ClickHouse/pull/40648) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A prototype of embedded reference documentation for high-level uniform server components. [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* We will check all queries from the changed perf tests to ensure that all changed queries were tested. [#40322](https://github.com/ClickHouse/ClickHouse/pull/40322) ([Nikita Taranov](https://github.com/nickitat)). +* Fix TGZ packages. [#40681](https://github.com/ClickHouse/ClickHouse/pull/40681) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix debug symbols. [#40873](https://github.com/ClickHouse/ClickHouse/pull/40873) ([Azat Khuzhin](https://github.com/azat)). +* Extended the CI configuration to create a x86 SSE2-only build. Useful for old or embedded hardware. [#40999](https://github.com/ClickHouse/ClickHouse/pull/40999) ([Robert Schulze](https://github.com/rschu1ze)). +* Switch to llvm/clang 15. [#41046](https://github.com/ClickHouse/ClickHouse/pull/41046) ([Azat Khuzhin](https://github.com/azat)). +* Continuation of [#40938](https://github.com/ClickHouse/ClickHouse/issues/40938). Fix ODR violation for `Loggers` class. Fixes [#40398](https://github.com/ClickHouse/ClickHouse/issues/40398), [#40937](https://github.com/ClickHouse/ClickHouse/issues/40937). [#41060](https://github.com/ClickHouse/ClickHouse/pull/41060) ([Dmitry Novik](https://github.com/novikd)). +* Add macOS binaries to GitHub release assets, it fixes [#37718](https://github.com/ClickHouse/ClickHouse/issues/37718). [#41088](https://github.com/ClickHouse/ClickHouse/pull/41088) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* The c-ares library is now bundled with ClickHouse's build system. [#41239](https://github.com/ClickHouse/ClickHouse/pull/41239) ([Robert Schulze](https://github.com/rschu1ze)). +* Get rid of `dlopen` from the main ClickHouse code. It remains in the library-bridge and odbc-bridge. [#41428](https://github.com/ClickHouse/ClickHouse/pull/41428) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't allow `dlopen` in the main ClickHouse binary, because it is harmful and insecure. We don't use it. But it can be used by some libraries for the implementation of "plugins". We absolutely discourage the ancient technique of loading 3rd-party uncontrolled dangerous libraries into the process address space, because it is insane. [#41429](https://github.com/ClickHouse/ClickHouse/pull/41429) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `source` field to deb packages, update `nfpm`. [#41531](https://github.com/ClickHouse/ClickHouse/pull/41531) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Support for DWARF-5 in the in-house DWARF parser. [#40710](https://github.com/ClickHouse/ClickHouse/pull/40710) ([Azat Khuzhin](https://github.com/azat)). +* Add fault injection in ZooKeeper client for testing [#30498](https://github.com/ClickHouse/ClickHouse/pull/30498) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add stateless tests with s3 storage with debug and tsan [#35262](https://github.com/ClickHouse/ClickHouse/pull/35262) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Trying stress on top of S3 [#36837](https://github.com/ClickHouse/ClickHouse/pull/36837) ([alesapin](https://github.com/alesapin)). +* Enable `concurrency-mt-unsafe` in `clang-tidy` [#40224](https://github.com/ClickHouse/ClickHouse/pull/40224) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix + +* Fix potential dataloss due to [a bug in AWS SDK](https://github.com/aws/aws-sdk-cpp/issues/658). Bug can be triggered only when clickhouse is used over S3. [#40506](https://github.com/ClickHouse/ClickHouse/pull/40506) ([alesapin](https://github.com/alesapin)). This bug has been open for 5 years in AWS SDK and is closed after our report. +* Malicious data in Native format might cause a crash. [#41441](https://github.com/ClickHouse/ClickHouse/pull/41441) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The aggregate function `categorialInformationValue` was having incorrectly defined properties, which might cause a null pointer dereferencing at runtime. This closes [#41443](https://github.com/ClickHouse/ClickHouse/issues/41443). [#41449](https://github.com/ClickHouse/ClickHouse/pull/41449) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Writing data in Apache `ORC` format might lead to a buffer overrun. [#41458](https://github.com/ClickHouse/ClickHouse/pull/41458) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix memory safety issues with functions `encrypt` and `contingency` if Array of Nullable is used as an argument. This fixes [#41004](https://github.com/ClickHouse/ClickHouse/issues/41004). [#40195](https://github.com/ClickHouse/ClickHouse/pull/40195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix bugs in MergeJoin when 'not_processed' is not null. [#40335](https://github.com/ClickHouse/ClickHouse/pull/40335) ([liql2007](https://github.com/liql2007)). +* Fix incorrect result in case of decimal precision loss in IN operator, ref [#41125](https://github.com/ClickHouse/ClickHouse/issues/41125). [#41130](https://github.com/ClickHouse/ClickHouse/pull/41130) ([Vladimir C](https://github.com/vdimir)). +* Fix filling of missed `Nested` columns with multiple levels. [#37152](https://github.com/ClickHouse/ClickHouse/pull/37152) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SYSTEM UNFREEZE query for Ordinary (deprecated) database. Fix for https://github.com/ClickHouse/ClickHouse/pull/36424. [#38262](https://github.com/ClickHouse/ClickHouse/pull/38262) ([Vadim Volodin](https://github.com/PolyProgrammist)). +* Fix unused unknown columns introduced by WITH statement. This fixes [#37812](https://github.com/ClickHouse/ClickHouse/issues/37812) . [#39131](https://github.com/ClickHouse/ClickHouse/pull/39131) ([Amos Bird](https://github.com/amosbird)). +* Fix query analysis for ORDER BY in presence of window functions. Fixes [#38741](https://github.com/ClickHouse/ClickHouse/issues/38741) Fixes [#24892](https://github.com/ClickHouse/ClickHouse/issues/24892). [#39354](https://github.com/ClickHouse/ClickHouse/pull/39354) ([Dmitry Novik](https://github.com/novikd)). +* Fixed `Unknown identifier (aggregate-function)` exception which appears when a user tries to calculate WINDOW ORDER BY/PARTITION BY expressions over aggregate functions. [#39762](https://github.com/ClickHouse/ClickHouse/pull/39762) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Limit number of analyze for one query with setting `max_analyze_depth`. It prevents exponential blow up of analysis time for queries with extraordinarily large number of subqueries. [#40334](https://github.com/ClickHouse/ClickHouse/pull/40334) ([Vladimir C](https://github.com/vdimir)). +* Fix rare bug with column TTL for MergeTree engines family: In case of repeated vertical merge the error `Cannot unlink file ColumnName.bin ... No such file or directory.` could happen. [#40346](https://github.com/ClickHouse/ClickHouse/pull/40346) ([alesapin](https://github.com/alesapin)). +* Use DNS entries for both IPv4 and IPv6 if present. [#40353](https://github.com/ClickHouse/ClickHouse/pull/40353) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to read snappy compressed files from Hadoop. [#40482](https://github.com/ClickHouse/ClickHouse/pull/40482) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash while parsing values of type `Object` (experimental feature) that contains arrays of variadic dimension. [#40483](https://github.com/ClickHouse/ClickHouse/pull/40483) ([Duc Canh Le](https://github.com/canhld94)). +* Fix settings `input_format_tsv_skip_first_lines`. [#40491](https://github.com/ClickHouse/ClickHouse/pull/40491) ([mini4](https://github.com/mini4)). +* Fix bug (race condition) when starting up MaterializedPostgreSQL database/table engine. [#40262](https://github.com/ClickHouse/ClickHouse/issues/40262). Fix error with reaching limit of relcache_callback_list slots. [#40511](https://github.com/ClickHouse/ClickHouse/pull/40511) ([Maksim Buren](https://github.com/maks-buren630501)). +* Fix possible error 'Decimal math overflow' while parsing DateTime64. [#40546](https://github.com/ClickHouse/ClickHouse/pull/40546) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix vertical merge of parts with lightweight deleted rows. [#40559](https://github.com/ClickHouse/ClickHouse/pull/40559) ([Alexander Gololobov](https://github.com/davenger)). +* Fix segment fault when writing data to URL table engine if it enables compression. [#40565](https://github.com/ClickHouse/ClickHouse/pull/40565) ([Frank Chen](https://github.com/FrankChen021)). +* Fix possible logical error `'Invalid Field get from type UInt64 to type String'` in arrayElement function with Map. [#40572](https://github.com/ClickHouse/ClickHouse/pull/40572) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible race in filesystem cache. [#40586](https://github.com/ClickHouse/ClickHouse/pull/40586) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Removed skipping of mutations in unaffected partitions of `MergeTree` tables, because this feature never worked correctly and might cause resurrection of finished mutations. [#40589](https://github.com/ClickHouse/ClickHouse/pull/40589) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The clickhouse server will crash if we add a grpc port which has been occupied to the configuration in runtime. [#40597](https://github.com/ClickHouse/ClickHouse/pull/40597) ([何李夫](https://github.com/helifu)). +* Fix `base58Encode / base58Decode` handling leading 0 / '1'. [#40620](https://github.com/ClickHouse/ClickHouse/pull/40620) ([Andrey Zvonov](https://github.com/zvonand)). +* keeper-fix: fix race in accessing logs while snapshot is being installed. [#40627](https://github.com/ClickHouse/ClickHouse/pull/40627) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix short circuit execution of toFixedString function. Solves (partially) [#40622](https://github.com/ClickHouse/ClickHouse/issues/40622). [#40628](https://github.com/ClickHouse/ClickHouse/pull/40628) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes SQLite int8 column conversion to int64 column in ClickHouse. Fixes [#40639](https://github.com/ClickHouse/ClickHouse/issues/40639). [#40642](https://github.com/ClickHouse/ClickHouse/pull/40642) ([Barum Rho](https://github.com/barumrho)). +* Fix stack overflow in recursive `Buffer` tables. This closes [#40637](https://github.com/ClickHouse/ClickHouse/issues/40637). [#40643](https://github.com/ClickHouse/ClickHouse/pull/40643) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* During insertion of a new query to the `ProcessList` allocations happen. If we reach the memory limit during these allocations we can not use `OvercommitTracker`, because `ProcessList::mutex` is already acquired. Fixes [#40611](https://github.com/ClickHouse/ClickHouse/issues/40611). [#40677](https://github.com/ClickHouse/ClickHouse/pull/40677) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR with max_read_buffer_size=0 during reading marks. [#40705](https://github.com/ClickHouse/ClickHouse/pull/40705) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak while pushing to MVs w/o query context (from Kafka/...). [#40732](https://github.com/ClickHouse/ClickHouse/pull/40732) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible error Attempt to read after eof in CSV schema inference. [#40746](https://github.com/ClickHouse/ClickHouse/pull/40746) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix logical error in write-through cache "File segment completion can be done only by downloader". Closes [#40748](https://github.com/ClickHouse/ClickHouse/issues/40748). [#40759](https://github.com/ClickHouse/ClickHouse/pull/40759) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make the result of GROUPING function the same as in SQL and other DBMS. [#40762](https://github.com/ClickHouse/ClickHouse/pull/40762) ([Dmitry Novik](https://github.com/novikd)). +* In [#40595](https://github.com/ClickHouse/ClickHouse/issues/40595) it was reported that the `host_regexp` functionality was not working properly with a name to address resolution in `/etc/hosts`. It's fixed. [#40769](https://github.com/ClickHouse/ClickHouse/pull/40769) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix incremental backups for Log family. [#40827](https://github.com/ClickHouse/ClickHouse/pull/40827) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix extremely rare bug which can lead to potential data loss in zero-copy replication. [#40844](https://github.com/ClickHouse/ClickHouse/pull/40844) ([alesapin](https://github.com/alesapin)). +* Fix key condition analyzing crashes when same set expression built from different column(s). [#40850](https://github.com/ClickHouse/ClickHouse/pull/40850) ([Duc Canh Le](https://github.com/canhld94)). +* Fix nested JSON Objects schema inference. [#40851](https://github.com/ClickHouse/ClickHouse/pull/40851) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix 3-digit prefix directory for filesystem cache files not being deleted if empty. Closes [#40797](https://github.com/ClickHouse/ClickHouse/issues/40797). [#40867](https://github.com/ClickHouse/ClickHouse/pull/40867) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix uncaught DNS_ERROR on failed connection to replicas. [#40881](https://github.com/ClickHouse/ClickHouse/pull/40881) ([Robert Coelho](https://github.com/coelho)). +* Fix bug when removing unneeded columns in subquery. [#40884](https://github.com/ClickHouse/ClickHouse/pull/40884) ([luocongkai](https://github.com/TKaxe)). +* Fix extra memory allocation for remote read buffers. [#40896](https://github.com/ClickHouse/ClickHouse/pull/40896) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed a behaviour when user with explicitly revoked grant for dropping databases can still drop it. [#40906](https://github.com/ClickHouse/ClickHouse/pull/40906) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* A fix for ClickHouse Keeper: correctly compare paths in write requests to Keeper internal system node paths. [#40918](https://github.com/ClickHouse/ClickHouse/pull/40918) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in WriteBufferFromS3. [#40943](https://github.com/ClickHouse/ClickHouse/pull/40943) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix access rights for `DESCRIBE TABLE url()` and some other `DESCRIBE TABLE ()`. [#40975](https://github.com/ClickHouse/ClickHouse/pull/40975) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove wrong parser logic for `WITH GROUPING SETS` which may lead to nullptr dereference. [#41049](https://github.com/ClickHouse/ClickHouse/pull/41049) ([Duc Canh Le](https://github.com/canhld94)). +* A fix for ClickHouse Keeper: fix possible segfault during Keeper shutdown. [#41075](https://github.com/ClickHouse/ClickHouse/pull/41075) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfaults, use-heap-after-free and memory leak in aggregate function combinators. Closes [#40848](https://github.com/ClickHouse/ClickHouse/issues/40848). [#41083](https://github.com/ClickHouse/ClickHouse/pull/41083) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix query_views_log with Window views. [#41132](https://github.com/ClickHouse/ClickHouse/pull/41132) ([Raúl Marín](https://github.com/Algunenano)). +* Disables optimize_monotonous_functions_in_order_by by default, mitigates: [#40094](https://github.com/ClickHouse/ClickHouse/issues/40094). [#41136](https://github.com/ClickHouse/ClickHouse/pull/41136) ([Denny Crane](https://github.com/den-crane)). +* Fixed "possible deadlock avoided" error on automatic conversion of database engine from Ordinary to Atomic. [#41146](https://github.com/ClickHouse/ClickHouse/pull/41146) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix SIGSEGV in SortedBlocksWriter in case of empty block (possible to get with `optimize_aggregation_in_order` and `join_algorithm=auto`). [#41154](https://github.com/ClickHouse/ClickHouse/pull/41154) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect query result when trivial count optimization is in effect with array join. This fixes [#39431](https://github.com/ClickHouse/ClickHouse/issues/39431). [#41158](https://github.com/ClickHouse/ClickHouse/pull/41158) ([Denny Crane](https://github.com/den-crane)). +* Fix stack-use-after-return in GetPriorityForLoadBalancing::getPriorityFunc(). [#41159](https://github.com/ClickHouse/ClickHouse/pull/41159) ([Azat Khuzhin](https://github.com/azat)). +* Fix positional arguments exception Positional argument out of bounds. Closes [#40634](https://github.com/ClickHouse/ClickHouse/issues/40634). [#41189](https://github.com/ClickHouse/ClickHouse/pull/41189) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix background clean up of broken detached parts. [#41190](https://github.com/ClickHouse/ClickHouse/pull/41190) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix exponential query rewrite in case of lots of cross joins with where, close [#21557](https://github.com/ClickHouse/ClickHouse/issues/21557). [#41223](https://github.com/ClickHouse/ClickHouse/pull/41223) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical error in write-through cache, which happened because not all types of exception were handled as needed. Closes [#41208](https://github.com/ClickHouse/ClickHouse/issues/41208). [#41232](https://github.com/ClickHouse/ClickHouse/pull/41232) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix String log entry in system.filesystem_cache_log. [#41233](https://github.com/ClickHouse/ClickHouse/pull/41233) ([jmimbrero](https://github.com/josemimbrero-tinybird)). +* Queries with `OFFSET` clause in subquery and `WHERE` clause in outer query might return incorrect result, it's fixed. Fixes [#40416](https://github.com/ClickHouse/ClickHouse/issues/40416). [#41280](https://github.com/ClickHouse/ClickHouse/pull/41280) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible wrong query result with `query_plan_optimize_primary_key` enabled. Fixes [#40599](https://github.com/ClickHouse/ClickHouse/issues/40599). [#41281](https://github.com/ClickHouse/ClickHouse/pull/41281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not allow invalid sequences influence other rows in lowerUTF8/upperUTF8. [#41286](https://github.com/ClickHouse/ClickHouse/pull/41286) ([Azat Khuzhin](https://github.com/azat)). +* Fix `ALTER
    ADD COLUMN` queries with columns of type `Object`. [#41290](https://github.com/ClickHouse/ClickHouse/pull/41290) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed "No node" error when selecting from `system.distributed_ddl_queue` when there's no `distributed_ddl.path` in config. Fixes [#41096](https://github.com/ClickHouse/ClickHouse/issues/41096). [#41296](https://github.com/ClickHouse/ClickHouse/pull/41296) ([young scott](https://github.com/young-scott)). +* Fix incorrect logical error `Expected relative path` in disk object storage. Related to [#41246](https://github.com/ClickHouse/ClickHouse/issues/41246). [#41297](https://github.com/ClickHouse/ClickHouse/pull/41297) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add column type check before UUID insertion in MsgPack format. [#41309](https://github.com/ClickHouse/ClickHouse/pull/41309) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible crash after inserting asynchronously (with enabled setting `async_insert`) malformed data to columns of type `Object`. It could happen, if JSONs in all batches of async inserts were invalid and could not be parsed. [#41336](https://github.com/ClickHouse/ClickHouse/pull/41336) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock with async_socket_for_remote/use_hedged_requests and parallel KILL. [#41343](https://github.com/ClickHouse/ClickHouse/pull/41343) ([Azat Khuzhin](https://github.com/azat)). +* Disables optimize_rewrite_sum_if_to_count_if by default, mitigates: [#38605](https://github.com/ClickHouse/ClickHouse/issues/38605) [#38683](https://github.com/ClickHouse/ClickHouse/issues/38683). [#41388](https://github.com/ClickHouse/ClickHouse/pull/41388) ([Denny Crane](https://github.com/den-crane)). +* Since 22.8 `ON CLUSTER` clause is ignored if database is `Replicated` and cluster name and database name are the same. Because of this `DROP PARTITION ON CLUSTER` worked unexpected way with `Replicated`. It's fixed, now `ON CLUSTER` clause is ignored only for queries that are replicated on database level. Fixes [#41299](https://github.com/ClickHouse/ClickHouse/issues/41299). [#41390](https://github.com/ClickHouse/ClickHouse/pull/41390) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible hung/deadlock on query cancellation (`KILL QUERY` or server shutdown). [#41467](https://github.com/ClickHouse/ClickHouse/pull/41467) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible server crash when using the JBOD feature. This fixes [#41365](https://github.com/ClickHouse/ClickHouse/issues/41365). [#41483](https://github.com/ClickHouse/ClickHouse/pull/41483) ([Amos Bird](https://github.com/amosbird)). +* Fix conversion from nullable fixed string to string. [#41541](https://github.com/ClickHouse/ClickHouse/pull/41541) ([Duc Canh Le](https://github.com/canhld94)). +* Prevent crash when passing wrong aggregation states to groupBitmap*. [#41563](https://github.com/ClickHouse/ClickHouse/pull/41563) ([Raúl Marín](https://github.com/Algunenano)). +* Queries with `ORDER BY` and `1500 <= LIMIT <= max_block_size` could return incorrect result with missing rows from top. Fixes [#41182](https://github.com/ClickHouse/ClickHouse/issues/41182). [#41576](https://github.com/ClickHouse/ClickHouse/pull/41576) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix read bytes/rows in X-ClickHouse-Summary with materialized views. [#41586](https://github.com/ClickHouse/ClickHouse/pull/41586) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible `pipeline stuck` exception for queries with `OFFSET`. The error was found with `enable_optimize_predicate_expression = 0` and always false condition in `WHERE`. Fixes [#41383](https://github.com/ClickHouse/ClickHouse/issues/41383). [#41588](https://github.com/ClickHouse/ClickHouse/pull/41588) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +### ClickHouse release 22.8, 2022-08-18 + +#### Backward Incompatible Change +* Extended range of `Date32` and `DateTime64` to support dates from the year 1900 to 2299. In previous versions, the supported interval was only from the year 1925 to 2283. The implementation is using the proleptic Gregorian calendar (which is conformant with [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601):2004 (clause 3.2.1 The Gregorian calendar)) instead of accounting for historical transitions from the Julian to the Gregorian calendar. This change affects implementation-specific behavior for out-of-range arguments. E.g. if in previous versions the value of `1899-01-01` was clamped to `1925-01-01`, in the new version it will be clamped to `1900-01-01`. It changes the behavior of rounding with `toStartOfInterval` if you pass `INTERVAL 3 QUARTER` up to one quarter because the intervals are counted from an implementation-specific point of time. Closes [#28216](https://github.com/ClickHouse/ClickHouse/issues/28216), improves [#38393](https://github.com/ClickHouse/ClickHouse/issues/38393). [#39425](https://github.com/ClickHouse/ClickHouse/pull/39425) ([Roman Vasin](https://github.com/rvasin)). +* Now, all relevant dictionary sources respect `remote_url_allow_hosts` setting. It was already done for HTTP, Cassandra, Redis. Added ClickHouse, MongoDB, MySQL, PostgreSQL. Host is checked only for dictionaries created from DDL. [#39184](https://github.com/ClickHouse/ClickHouse/pull/39184) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Prebuilt ClickHouse x86 binaries now require support for AVX instructions, i.e. a CPU not older than Intel Sandy Bridge / AMD Bulldozer, both released in 2011. [#39000](https://github.com/ClickHouse/ClickHouse/pull/39000) ([Robert Schulze](https://github.com/rschu1ze)). +* Make the remote filesystem cache composable, allow not to evict certain files (regarding idx, mrk, ..), delete old cache version. Now it is possible to configure cache over Azure blob storage disk, over Local disk, over StaticWeb disk, etc. This PR is marked backward incompatible because cache configuration changes and in order for cache to work need to update the config file. Old cache will still be used with new configuration. The server will startup fine with the old cache configuration. Closes https://github.com/ClickHouse/ClickHouse/issues/36140. Closes https://github.com/ClickHouse/ClickHouse/issues/37889. ([Kseniia Sumarokova](https://github.com/kssenii)). [#36171](https://github.com/ClickHouse/ClickHouse/pull/36171)) + +#### New Feature +* Support SQL standard DELETE FROM syntax on merge tree tables and lightweight delete implementation for merge tree families. [#37893](https://github.com/ClickHouse/ClickHouse/pull/37893) ([Jianmei Zhang](https://github.com/zhangjmruc)) ([Alexander Gololobov](https://github.com/davenger)). Note: this new feature does not make ClickHouse an HTAP DBMS. +* Query parameters can be set in interactive mode as `SET param_abc = 'def'` and transferred via the native protocol as settings. [#39906](https://github.com/ClickHouse/ClickHouse/pull/39906) ([Nikita Taranov](https://github.com/nickitat)). +* Quota key can be set in the native protocol ([Yakov Olkhovsky](https://github.com/ClickHouse/ClickHouse/pull/39874)). +* Added a setting `exact_rows_before_limit` (0/1). When enabled, ClickHouse will provide exact value for `rows_before_limit_at_least` statistic, but with the cost that the data before limit will have to be read completely. This closes [#6613](https://github.com/ClickHouse/ClickHouse/issues/6613). [#25333](https://github.com/ClickHouse/ClickHouse/pull/25333) ([kevin wan](https://github.com/MaxWk)). +* Added support for parallel distributed insert select with `s3Cluster` table function into tables with `Distributed` and `Replicated` engine [#34670](https://github.com/ClickHouse/ClickHouse/issues/34670). [#39107](https://github.com/ClickHouse/ClickHouse/pull/39107) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add new settings to control schema inference from text formats: - `input_format_try_infer_dates` - try infer dates from strings. - `input_format_try_infer_datetimes` - try infer datetimes from strings. - `input_format_try_infer_integers` - try infer `Int64` instead of `Float64`. - `input_format_json_try_infer_numbers_from_strings` - try infer numbers from json strings in JSON formats. [#39186](https://github.com/ClickHouse/ClickHouse/pull/39186) ([Kruglov Pavel](https://github.com/Avogar)). +* An option to provide JSON formatted log output. The purpose is to allow easier ingestion and query in log analysis tools. [#39277](https://github.com/ClickHouse/ClickHouse/pull/39277) ([Mallik Hassan](https://github.com/SadiHassan)). +* Add function `nowInBlock` which allows getting the current time during long-running and continuous queries. Closes [#39522](https://github.com/ClickHouse/ClickHouse/issues/39522). Notes: there are no functions `now64InBlock` neither `todayInBlock`. [#39533](https://github.com/ClickHouse/ClickHouse/pull/39533) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to specify settings for an `executable()` table function. [#39681](https://github.com/ClickHouse/ClickHouse/pull/39681) ([Constantine Peresypkin](https://github.com/pkit)). +* Implemented automatic conversion of database engine from `Ordinary` to `Atomic`. Create empty `convert_ordinary_to_atomic` file in `flags` directory and all `Ordinary` databases will be converted automatically on next server start. Resolves [#39546](https://github.com/ClickHouse/ClickHouse/issues/39546). [#39933](https://github.com/ClickHouse/ClickHouse/pull/39933) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Support `SELECT ... INTO OUTFILE '...' AND STDOUT`. [#37490](https://github.com/ClickHouse/ClickHouse/issues/37490). [#39054](https://github.com/ClickHouse/ClickHouse/pull/39054) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add formats `PrettyMonoBlock`, `PrettyNoEscapesMonoBlock`, `PrettyCompactNoEscapes`, `PrettyCompactNoEscapesMonoBlock`, `PrettySpaceNoEscapes`, `PrettySpaceMonoBlock`, `PrettySpaceNoEscapesMonoBlock`. [#39646](https://github.com/ClickHouse/ClickHouse/pull/39646) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Improved memory usage during memory efficient merging of aggregation results. [#39429](https://github.com/ClickHouse/ClickHouse/pull/39429) ([Nikita Taranov](https://github.com/nickitat)). +* Added concurrency control logic to limit total number of concurrent threads created by queries. [#37558](https://github.com/ClickHouse/ClickHouse/pull/37558) ([Sergei Trifonov](https://github.com/serxa)). Add `concurrent_threads_soft_limit parameter` to increase performance in case of high QPS by means of limiting total number of threads for all queries. [#37285](https://github.com/ClickHouse/ClickHouse/pull/37285) ([Roman Vasin](https://github.com/rvasin)). +* Add `SLRU` cache policy for uncompressed cache and marks cache. ([Kseniia Sumarokova](https://github.com/kssenii)). [#34651](https://github.com/ClickHouse/ClickHouse/pull/34651) ([alexX512](https://github.com/alexX512)). Decoupling local cache function and cache algorithm [#38048](https://github.com/ClickHouse/ClickHouse/pull/38048) ([Han Shukai](https://github.com/KinderRiven)). +* Intel® In-Memory Analytics Accelerator (Intel® IAA) is a hardware accelerator available in the upcoming generation of Intel® Xeon® Scalable processors ("Sapphire Rapids"). Its goal is to speed up common operations in analytics like data (de)compression and filtering. ClickHouse gained the new "DeflateQpl" compression codec which utilizes the Intel® IAA offloading technology to provide a high-performance DEFLATE implementation. The codec uses the [Intel® Query Processing Library (QPL)](https://github.com/intel/qpl) which abstracts access to the hardware accelerator, respectively to a software fallback in case the hardware accelerator is not available. DEFLATE provides in general higher compression rates than ClickHouse's LZ4 default codec, and as a result, offers less disk I/O and lower main memory consumption. [#36654](https://github.com/ClickHouse/ClickHouse/pull/36654) ([jasperzhu](https://github.com/jinjunzh)). [#39494](https://github.com/ClickHouse/ClickHouse/pull/39494) ([Robert Schulze](https://github.com/rschu1ze)). +* `DISTINCT` in order with `ORDER BY`: Deduce way to sort based on input stream sort description. Skip sorting if input stream is already sorted. [#38719](https://github.com/ClickHouse/ClickHouse/pull/38719) ([Igor Nikonov](https://github.com/devcrafter)). Improve memory usage (significantly) and query execution time + use `DistinctSortedChunkTransform` for final distinct when `DISTINCT` columns match `ORDER BY` columns, but rename to `DistinctSortedStreamTransform` in `EXPLAIN PIPELINE` → this improves memory usage significantly + remove unnecessary allocations in hot loop in `DistinctSortedChunkTransform`. [#39432](https://github.com/ClickHouse/ClickHouse/pull/39432) ([Igor Nikonov](https://github.com/devcrafter)). Use `DistinctSortedTransform` only when sort description is applicable to DISTINCT columns, otherwise fall back to ordinary DISTINCT implementation + it allows making less checks during `DistinctSortedTransform` execution. [#39528](https://github.com/ClickHouse/ClickHouse/pull/39528) ([Igor Nikonov](https://github.com/devcrafter)). Fix: `DistinctSortedTransform` didn't take advantage of sorting. It never cleared HashSet since clearing_columns were detected incorrectly (always empty). So, it basically worked as ordinary `DISTINCT` (`DistinctTransform`). The fix reduces memory usage significantly. [#39538](https://github.com/ClickHouse/ClickHouse/pull/39538) ([Igor Nikonov](https://github.com/devcrafter)). +* Use local node as first priority to get structure of remote table when executing `cluster` and similar table functions. [#39440](https://github.com/ClickHouse/ClickHouse/pull/39440) ([Mingliang Pan](https://github.com/liangliangpan)). +* Optimize filtering by numeric columns with AVX512VBMI2 compress store. [#39633](https://github.com/ClickHouse/ClickHouse/pull/39633) ([Guo Wangyang](https://github.com/guowangy)). For systems with AVX512 VBMI2, this PR improves performance by ca. 6% for SSB benchmark queries queries 3.1, 3.2 and 3.3 (SF=100). Tested on Intel Icelake Xeon 8380 * 2 socket. [#40033](https://github.com/ClickHouse/ClickHouse/pull/40033) ([Robert Schulze](https://github.com/rschu1ze)). +* Optimize index analysis with functional expressions in multi-thread scenario. [#39812](https://github.com/ClickHouse/ClickHouse/pull/39812) ([Guo Wangyang](https://github.com/guowangy)). +* Optimizations for complex queries: Don't visit the AST for UDFs if none are registered. [#40069](https://github.com/ClickHouse/ClickHouse/pull/40069) ([Raúl Marín](https://github.com/Algunenano)). Optimize CurrentMemoryTracker alloc and free. [#40078](https://github.com/ClickHouse/ClickHouse/pull/40078) ([Raúl Marín](https://github.com/Algunenano)). +* Improved Base58 encoding/decoding. [#39292](https://github.com/ClickHouse/ClickHouse/pull/39292) ([Andrey Zvonov](https://github.com/zvonand)). +* Improve bytes to bits mask transform for SSE/AVX/AVX512. [#39586](https://github.com/ClickHouse/ClickHouse/pull/39586) ([Guo Wangyang](https://github.com/guowangy)). + +#### Improvement +* Normalize `AggregateFunction` types and state representations because optimizations like [#35788](https://github.com/ClickHouse/ClickHouse/pull/35788) will treat `count(not null columns)` as `count()`, which might confuses distributed interpreters with the following error : `Conversion from AggregateFunction(count) to AggregateFunction(count, Int64) is not supported`. [#39420](https://github.com/ClickHouse/ClickHouse/pull/39420) ([Amos Bird](https://github.com/amosbird)). The functions with identical states can be used in materialized views interchangeably. +* Rework and simplify the `system.backups` table, remove the `internal` column, allow user to set the ID of operation, add columns `num_files`, `uncompressed_size`, `compressed_size`, `start_time`, `end_time`. [#39503](https://github.com/ClickHouse/ClickHouse/pull/39503) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improved structure of DDL query result table for `Replicated` database (separate columns with shard and replica name, more clear status) - `CREATE TABLE ... ON CLUSTER` queries can be normalized on initiator first if `distributed_ddl_entry_format_version` is set to 3 (default value). It means that `ON CLUSTER` queries may not work if initiator does not belong to the cluster that specified in query. Fixes [#37318](https://github.com/ClickHouse/ClickHouse/issues/37318), [#39500](https://github.com/ClickHouse/ClickHouse/issues/39500) - Ignore `ON CLUSTER` clause if database is `Replicated` and cluster name equals to database name. Related to [#35570](https://github.com/ClickHouse/ClickHouse/issues/35570) - Miscellaneous minor fixes for `Replicated` database engine - Check metadata consistency when starting up `Replicated` database, start replica recovery in case of mismatch of local metadata and metadata in Keeper. Resolves [#24880](https://github.com/ClickHouse/ClickHouse/issues/24880). [#37198](https://github.com/ClickHouse/ClickHouse/pull/37198) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add result_rows and result_bytes to progress reports (`X-ClickHouse-Summary`). [#39567](https://github.com/ClickHouse/ClickHouse/pull/39567) ([Raúl Marín](https://github.com/Algunenano)). +* Improve primary key analysis for MergeTree. [#25563](https://github.com/ClickHouse/ClickHouse/pull/25563) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `timeSlots` now works with DateTime64; subsecond duration and slot size available when working with DateTime64. [#37951](https://github.com/ClickHouse/ClickHouse/pull/37951) ([Andrey Zvonov](https://github.com/zvonand)). +* Added support of `LEFT SEMI` and `LEFT ANTI` direct join with `EmbeddedRocksDB` tables. [#38956](https://github.com/ClickHouse/ClickHouse/pull/38956) ([Vladimir C](https://github.com/vdimir)). +* Add profile events for fsync operations. [#39179](https://github.com/ClickHouse/ClickHouse/pull/39179) ([Azat Khuzhin](https://github.com/azat)). +* Add the second argument to the ordinary function `file(path[, default])`, which function returns in the case when a file does not exists. [#39218](https://github.com/ClickHouse/ClickHouse/pull/39218) ([Nikolay Degterinsky](https://github.com/evillique)). +* Some small fixes for reading via http, allow to retry partial content in case if 200 OK. [#39244](https://github.com/ClickHouse/ClickHouse/pull/39244) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support queries `CREATE TEMPORARY TABLE ... () AS ...`. [#39462](https://github.com/ClickHouse/ClickHouse/pull/39462) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support of `!`/`*` (exclamation/asterisk) in custom TLDs (`cutToFirstSignificantSubdomainCustom()`/`cutToFirstSignificantSubdomainCustomWithWWW()`/`firstSignificantSubdomainCustom()`). [#39496](https://github.com/ClickHouse/ClickHouse/pull/39496) ([Azat Khuzhin](https://github.com/azat)). +* Add support for TLS connections to NATS. Implements [#39525](https://github.com/ClickHouse/ClickHouse/issues/39525). [#39527](https://github.com/ClickHouse/ClickHouse/pull/39527) ([Constantine Peresypkin](https://github.com/pkit)). +* `clickhouse-obfuscator` (a tool for database obfuscation for testing and load generation) now has the new `--save` and `--load` parameters to work with pre-trained models. This closes [#39534](https://github.com/ClickHouse/ClickHouse/issues/39534). [#39541](https://github.com/ClickHouse/ClickHouse/pull/39541) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect behavior of log rotation during restart. [#39558](https://github.com/ClickHouse/ClickHouse/pull/39558) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix building aggregate projections when external aggregation is on. Mark as improvement because the case is rare and there exists easy workaround to fix it via changing settings. This fixes [#39667](https://github.com/ClickHouse/ClickHouse/issues/39667) . [#39671](https://github.com/ClickHouse/ClickHouse/pull/39671) ([Amos Bird](https://github.com/amosbird)). +* Allow to execute hash functions with arguments of type `Map`. [#39685](https://github.com/ClickHouse/ClickHouse/pull/39685) ([Anton Popov](https://github.com/CurtizJ)). +* Add a configuration parameter to hide addresses in stack traces. It may improve security a little but generally, it is harmful and should not be used. [#39690](https://github.com/ClickHouse/ClickHouse/pull/39690) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Change the prefix size of AggregateFunctionDistinct to make sure nested function data memory segment is aligned. [#39696](https://github.com/ClickHouse/ClickHouse/pull/39696) ([Pxl](https://github.com/BiteTheDDDDt)). +* Properly escape credentials passed to the `clickhouse-diagnostic` tool. [#39707](https://github.com/ClickHouse/ClickHouse/pull/39707) ([Dale McDiarmid](https://github.com/gingerwizard)). +* ClickHouse Keeper improvement: create a snapshot on exit. It can be controlled with the config `keeper_server.create_snapshot_on_exit`, `true` by default. [#39755](https://github.com/ClickHouse/ClickHouse/pull/39755) ([Antonio Andelic](https://github.com/antonio2368)). +* Support primary key analysis for `row_policy_filter` and `additional_filter`. It also helps fix issues like [#37454](https://github.com/ClickHouse/ClickHouse/issues/37454) . [#39826](https://github.com/ClickHouse/ClickHouse/pull/39826) ([Amos Bird](https://github.com/amosbird)). +* Fix two usability issues in Play UI: - it was non-pixel-perfect on iPad due to parasitic border radius and margins; - the progress indication did not display after the first query. This closes [#39957](https://github.com/ClickHouse/ClickHouse/issues/39957). This closes [#39960](https://github.com/ClickHouse/ClickHouse/issues/39960). [#39961](https://github.com/ClickHouse/ClickHouse/pull/39961) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: add row numbers; add cell selection on click; add hysteresis for table cells. [#39962](https://github.com/ClickHouse/ClickHouse/pull/39962) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: recognize tab key in textarea, but at the same time don't mess up with tab navigation. [#40053](https://github.com/ClickHouse/ClickHouse/pull/40053) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The client will show server-side elapsed time. This is important for the performance comparison of ClickHouse services in remote datacenters. This closes [#38070](https://github.com/ClickHouse/ClickHouse/issues/38070). See also [this](https://github.com/ClickHouse/ClickBench/blob/main/hardware/benchmark-cloud.sh#L37) for motivation. [#39968](https://github.com/ClickHouse/ClickHouse/pull/39968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Adds `parseDateTime64BestEffortUS`, `parseDateTime64BestEffortUSOrNull`, `parseDateTime64BestEffortUSOrZero` functions, closing [#37492](https://github.com/ClickHouse/ClickHouse/issues/37492). [#40015](https://github.com/ClickHouse/ClickHouse/pull/40015) ([Tanya Bragin](https://github.com/tbragin)). +* Extend the `system.processors_profile_log` with more information such as input rows. [#40121](https://github.com/ClickHouse/ClickHouse/pull/40121) ([Amos Bird](https://github.com/amosbird)). +* Display server-side time in `clickhouse-benchmark` by default if it is available (since ClickHouse version 22.8). This is needed to correctly compare the performance of clouds. This behavior can be changed with the new `--client-side-time` command line option. Change the `--randomize` command line option from `--randomize 1` to the form without argument. [#40193](https://github.com/ClickHouse/ClickHouse/pull/40193) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add counters (ProfileEvents) for cases when query complexity limitation has been set and has reached (a separate counter for `overflow_mode` = `break` and `throw`). For example, if you have set up `max_rows_to_read` with `read_overflow_mode = 'break'`, looking at the value of `OverflowBreak` counter will allow distinguishing incomplete results. [#40205](https://github.com/ClickHouse/ClickHouse/pull/40205) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix memory accounting in case of "Memory limit exceeded" errors (previously [peak] memory usage was takes failed allocations into account). [#40249](https://github.com/ClickHouse/ClickHouse/pull/40249) ([Azat Khuzhin](https://github.com/azat)). +* Add metrics for filesystem cache: `FilesystemCacheSize` and `FilesystemCacheElements`. [#40260](https://github.com/ClickHouse/ClickHouse/pull/40260) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support hadoop secure RPC transfer (hadoop.rpc.protection=privacy and hadoop.rpc.protection=integrity). [#39411](https://github.com/ClickHouse/ClickHouse/pull/39411) ([michael1589](https://github.com/michael1589)). +* Avoid continuously growing memory consumption of pattern cache when using functions multi(Fuzzy)Match(Any|AllIndices|AnyIndex)(). [#40264](https://github.com/ClickHouse/ClickHouse/pull/40264) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Build/Testing/Packaging Improvement +* [ClickFiddle](https://fiddle.clickhouse.com/): A new tool for testing ClickHouse versions in read/write mode (**Igor Baliuk**). +* ClickHouse binary is made self-extracting [#35775](https://github.com/ClickHouse/ClickHouse/pull/35775) ([Yakov Olkhovskiy, Arthur Filatenkov](https://github.com/yakov-olkhovskiy)). +* Update tzdata to 2022b to support the new timezone changes. See https://github.com/google/cctz/pull/226. Chile's 2022 DST start is delayed from September 4 to September 11. Iran plans to stop observing DST permanently, after it falls back on 2022-09-21. There are corrections of the historical time zone of Asia/Tehran in the year 1977: Iran adopted standard time in 1935, not 1946. In 1977 it observed DST from 03-21 23:00 to 10-20 24:00; its 1978 transitions were on 03-24 and 08-05, not 03-20 and 10-20; and its spring 1979 transition was on 05-27, not 03-21 (https://data.iana.org/time-zones/tzdb/NEWS). ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Former packages used to install systemd.service file to `/etc`. The files there are marked as `conf` and are not cleaned out, and not updated automatically. This PR cleans them out. [#39323](https://github.com/ClickHouse/ClickHouse/pull/39323) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Ensure LSan is effective. [#39430](https://github.com/ClickHouse/ClickHouse/pull/39430) ([Azat Khuzhin](https://github.com/azat)). +* TSAN has issues with clang-14 (https://github.com/google/sanitizers/issues/1552, https://github.com/google/sanitizers/issues/1540), so here we build the TSAN binaries with clang-15. [#39450](https://github.com/ClickHouse/ClickHouse/pull/39450) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove the option to build ClickHouse tools as separate executable programs. This fixes [#37847](https://github.com/ClickHouse/ClickHouse/issues/37847). [#39520](https://github.com/ClickHouse/ClickHouse/pull/39520) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Small preparations for build on s390x (which is big-endian). [#39627](https://github.com/ClickHouse/ClickHouse/pull/39627) ([Harry Lee](https://github.com/HarryLeeIBM)). [#39656](https://github.com/ClickHouse/ClickHouse/pull/39656) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issue in BitHelpers for s390x. [#39656](https://github.com/ClickHouse/ClickHouse/pull/39656) ([Harry Lee](https://github.com/HarryLeeIBM)). Implement a piece of code related to SipHash for s390x architecture (which is not supported by ClickHouse). [#39732](https://github.com/ClickHouse/ClickHouse/pull/39732) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed an Endian issue in Coordination snapshot code for s390x architecture (which is not supported by ClickHouse). [#39931](https://github.com/ClickHouse/ClickHouse/pull/39931) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issues in Codec code for s390x architecture (which is not supported by ClickHouse). [#40008](https://github.com/ClickHouse/ClickHouse/pull/40008) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issues in reading/writing BigEndian binary data in ReadHelpers and WriteHelpers code for s390x architecture (which is not supported by ClickHouse). [#40179](https://github.com/ClickHouse/ClickHouse/pull/40179) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Support build with `clang-16` (trunk). This closes [#39949](https://github.com/ClickHouse/ClickHouse/issues/39949). [#40181](https://github.com/ClickHouse/ClickHouse/pull/40181) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Prepare RISC-V 64 build to run in CI. This is for [#40141](https://github.com/ClickHouse/ClickHouse/issues/40141). [#40197](https://github.com/ClickHouse/ClickHouse/pull/40197) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Simplified function registration macro interface (`FUNCTION_REGISTER*`) to eliminate the step to add and call an extern function in the registerFunctions.cpp, it also makes incremental builds of a new function faster. [#38615](https://github.com/ClickHouse/ClickHouse/pull/38615) ([Li Yin](https://github.com/liyinsg)). +* Docker: Now entrypoint.sh in docker image creates and executes chown for all folders it found in config for multidisk setup [#17717](https://github.com/ClickHouse/ClickHouse/issues/17717). [#39121](https://github.com/ClickHouse/ClickHouse/pull/39121) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix +* Fix possible segfault in `CapnProto` input format. This bug was found and send through ClickHouse bug-bounty [program](https://github.com/ClickHouse/ClickHouse/issues/38986) by *kiojj*. [#40241](https://github.com/ClickHouse/ClickHouse/pull/40241) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a very rare case of incorrect behavior of array subscript operator. This closes [#28720](https://github.com/ClickHouse/ClickHouse/issues/28720). [#40185](https://github.com/ClickHouse/ClickHouse/pull/40185) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix insufficient argument check for encryption functions (found by query fuzzer). This closes [#39987](https://github.com/ClickHouse/ClickHouse/issues/39987). [#40194](https://github.com/ClickHouse/ClickHouse/pull/40194) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix the case when the order of columns can be incorrect if the `IN` operator is used with a table with `ENGINE = Set` containing multiple columns. This fixes [#13014](https://github.com/ClickHouse/ClickHouse/issues/13014). [#40225](https://github.com/ClickHouse/ClickHouse/pull/40225) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix seeking while reading from encrypted disk. This PR fixes [#38381](https://github.com/ClickHouse/ClickHouse/issues/38381). [#39687](https://github.com/ClickHouse/ClickHouse/pull/39687) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix duplicate columns in join plan. Finally, solve [#26809](https://github.com/ClickHouse/ClickHouse/issues/26809). [#40009](https://github.com/ClickHouse/ClickHouse/pull/40009) ([Vladimir C](https://github.com/vdimir)). +* Fixed query hanging for SELECT with ORDER BY WITH FILL with different date/time types. [#37849](https://github.com/ClickHouse/ClickHouse/pull/37849) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix ORDER BY that matches projections ORDER BY (before it simply returns unsorted result). [#38725](https://github.com/ClickHouse/ClickHouse/pull/38725) ([Azat Khuzhin](https://github.com/azat)). +* Do not optimise functions in GROUP BY statements if they shadow one of the table columns or expressions. Fixes [#37032](https://github.com/ClickHouse/ClickHouse/issues/37032). [#39103](https://github.com/ClickHouse/ClickHouse/pull/39103) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Fix wrong table name in logs after RENAME TABLE. This fixes [#38018](https://github.com/ClickHouse/ClickHouse/issues/38018). [#39227](https://github.com/ClickHouse/ClickHouse/pull/39227) ([Amos Bird](https://github.com/amosbird)). +* Fix positional arguments in case of columns pruning when optimising the query. Closes [#38433](https://github.com/ClickHouse/ClickHouse/issues/38433). [#39293](https://github.com/ClickHouse/ClickHouse/pull/39293) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in schema inference in case of empty messages in Protobuf/CapnProto formats that allowed to create column with empty `Tuple` type. Closes [#39051](https://github.com/ClickHouse/ClickHouse/issues/39051) Add 2 new settings `input_format_{protobuf/capnproto}_skip_fields_with_unsupported_types_in_schema_inference` that allow to skip fields with unsupported types while schema inference for Protobuf and CapnProto formats. [#39357](https://github.com/ClickHouse/ClickHouse/pull/39357) ([Kruglov Pavel](https://github.com/Avogar)). +* (Window View is an experimental feature) Fix segmentation fault on `CREATE WINDOW VIEW .. ON CLUSTER ... INNER`. Closes [#39363](https://github.com/ClickHouse/ClickHouse/issues/39363). [#39384](https://github.com/ClickHouse/ClickHouse/pull/39384) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix WriteBuffer finalize when cancelling insert into function (in previous versions it may leat to std::terminate). [#39458](https://github.com/ClickHouse/ClickHouse/pull/39458) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix storing of columns of type `Object` in sparse serialization. [#39464](https://github.com/ClickHouse/ClickHouse/pull/39464) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible "Not found column in block" exception when using projections. This closes [#39469](https://github.com/ClickHouse/ClickHouse/issues/39469). [#39470](https://github.com/ClickHouse/ClickHouse/pull/39470) ([小路](https://github.com/nicelulu)). +* Fix exception on race between DROP and INSERT with materialized views. [#39477](https://github.com/ClickHouse/ClickHouse/pull/39477) ([Azat Khuzhin](https://github.com/azat)). +* A bug in Apache Avro library: fix data race and possible heap-buffer-overflow in Avro format. Closes [#39094](https://github.com/ClickHouse/ClickHouse/issues/39094) Closes [#33652](https://github.com/ClickHouse/ClickHouse/issues/33652). [#39498](https://github.com/ClickHouse/ClickHouse/pull/39498) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare bug in asynchronous reading (with setting `local_filesystem_read_method='pread_threadpool'`) with enabled `O_DIRECT` (enabled by setting `min_bytes_to_use_direct_io`). [#39506](https://github.com/ClickHouse/ClickHouse/pull/39506) ([Anton Popov](https://github.com/CurtizJ)). +* (only on FreeBSD) Fixes "Code: 49. DB::Exception: FunctionFactory: the function name '' is not unique. (LOGICAL_ERROR)" observed on FreeBSD when starting clickhouse. [#39551](https://github.com/ClickHouse/ClickHouse/pull/39551) ([Alexander Gololobov](https://github.com/davenger)). +* Fix bug with the recently introduced "maxsplit" argument for `splitByChar`, which was not working correctly. [#39552](https://github.com/ClickHouse/ClickHouse/pull/39552) ([filimonov](https://github.com/filimonov)). +* Fix bug in ASOF JOIN with `enable_optimize_predicate_expression`, close [#37813](https://github.com/ClickHouse/ClickHouse/issues/37813). [#39556](https://github.com/ClickHouse/ClickHouse/pull/39556) ([Vladimir C](https://github.com/vdimir)). +* Fixed `CREATE/DROP INDEX` query with `ON CLUSTER` or `Replicated` database and `ReplicatedMergeTree`. It used to be executed on all replicas (causing error or DDL queue stuck). Fixes [#39511](https://github.com/ClickHouse/ClickHouse/issues/39511). [#39565](https://github.com/ClickHouse/ClickHouse/pull/39565) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix "column not found" error for push down with join, close [#39505](https://github.com/ClickHouse/ClickHouse/issues/39505). [#39575](https://github.com/ClickHouse/ClickHouse/pull/39575) ([Vladimir C](https://github.com/vdimir)). +* Fix the wrong `REGEXP_REPLACE` alias. This fixes https://github.com/ClickHouse/ClickBench/issues/9. [#39592](https://github.com/ClickHouse/ClickHouse/pull/39592) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed point of origin for exponential decay window functions to the last value in window. Previously, decay was calculated by formula `exp((t - curr_row_t) / decay_length)`, which is incorrect when right boundary of window is not `CURRENT ROW`. It was changed to: `exp((t - last_row_t) / decay_length)`. There is no change in results for windows with `ROWS BETWEEN (smth) AND CURRENT ROW`. [#39593](https://github.com/ClickHouse/ClickHouse/pull/39593) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Fix Decimal division overflow, which can be detected based on operands scale. [#39600](https://github.com/ClickHouse/ClickHouse/pull/39600) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix settings `output_format_arrow_string_as_string` and `output_format_arrow_low_cardinality_as_dictionary` work in combination. Closes [#39624](https://github.com/ClickHouse/ClickHouse/issues/39624). [#39647](https://github.com/ClickHouse/ClickHouse/pull/39647) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed a bug in default database resolution in distributed table reads. [#39674](https://github.com/ClickHouse/ClickHouse/pull/39674) ([Anton Kozlov](https://github.com/tonickkozlov)). +* (Only with the obsolete Ordinary databases) Select might read data of dropped table if cache for mmap IO is used and database engine is Ordinary and new tables was created with the same name as dropped one had. It's fixed. [#39708](https://github.com/ClickHouse/ClickHouse/pull/39708) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible error `Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality` Fixes [#38460](https://github.com/ClickHouse/ClickHouse/issues/38460). [#39716](https://github.com/ClickHouse/ClickHouse/pull/39716) ([Arthur Passos](https://github.com/arthurpassos)). +* Field names in the `meta` section of JSON format were erroneously double escaped. This closes [#39693](https://github.com/ClickHouse/ClickHouse/issues/39693). [#39747](https://github.com/ClickHouse/ClickHouse/pull/39747) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix wrong index analysis with tuples and operator `IN`, which could lead to wrong query result. [#39752](https://github.com/ClickHouse/ClickHouse/pull/39752) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `EmbeddedRocksDB` tables filtering by key using params. [#39757](https://github.com/ClickHouse/ClickHouse/pull/39757) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix error `Invalid number of columns in chunk pushed to OutputPort` which was caused by ARRAY JOIN optimization. Fixes [#39164](https://github.com/ClickHouse/ClickHouse/issues/39164). [#39799](https://github.com/ClickHouse/ClickHouse/pull/39799) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* A workaround for a bug in Linux kernel. Fix `CANNOT_READ_ALL_DATA` exception with `local_filesystem_read_method=pread_threadpool`. This bug affected only Linux kernel version 5.9 and 5.10 according to [man](https://manpages.debian.org/testing/manpages-dev/preadv2.2.en.html#BUGS). [#39800](https://github.com/ClickHouse/ClickHouse/pull/39800) ([Anton Popov](https://github.com/CurtizJ)). +* (Only on NFS) Fix broken NFS mkdir for root-squashed volumes. [#39898](https://github.com/ClickHouse/ClickHouse/pull/39898) ([Constantine Peresypkin](https://github.com/pkit)). +* Remove dictionaries from prometheus metrics on DETACH/DROP. [#39926](https://github.com/ClickHouse/ClickHouse/pull/39926) ([Azat Khuzhin](https://github.com/azat)). +* Fix read of StorageFile with virtual columns. Closes [#39907](https://github.com/ClickHouse/ClickHouse/issues/39907). [#39943](https://github.com/ClickHouse/ClickHouse/pull/39943) ([flynn](https://github.com/ucasfl)). +* Fix big memory usage during fetches. Fixes [#39915](https://github.com/ClickHouse/ClickHouse/issues/39915). [#39990](https://github.com/ClickHouse/ClickHouse/pull/39990) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* (experimental feature) Fix `hashId` crash and salt parameter not being used. [#40002](https://github.com/ClickHouse/ClickHouse/pull/40002) ([Raúl Marín](https://github.com/Algunenano)). +* `EXCEPT` and `INTERSECT` operators may lead to crash if a specific combination of constant and non-constant columns were used. [#40020](https://github.com/ClickHouse/ClickHouse/pull/40020) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed "Part directory doesn't exist" and "`tmp_` ... No such file or directory" errors during too slow INSERT or too long merge/mutation. Also fixed issue that may cause some replication queue entries to stuck without any errors or warnings in logs if previous attempt to fetch part failed, but `tmp-fetch_` directory was not cleaned up. [#40031](https://github.com/ClickHouse/ClickHouse/pull/40031) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix rare cases of parsing of arrays of tuples in format `Values`. [#40034](https://github.com/ClickHouse/ClickHouse/pull/40034) ([Anton Popov](https://github.com/CurtizJ)). +* Fixes ArrowColumn format Dictionary(X) & Dictionary(Nullable(X)) conversion to ClickHouse LowCardinality(X) & LowCardinality(Nullable(X)) respectively. [#40037](https://github.com/ClickHouse/ClickHouse/pull/40037) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix potential deadlock in writing to S3 during task scheduling failure. [#40070](https://github.com/ClickHouse/ClickHouse/pull/40070) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix bug in collectFilesToSkip() by adding correct file extension (.idx or idx2) for indexes to be recalculated, avoid wrong hard links. Fixed [#39896](https://github.com/ClickHouse/ClickHouse/issues/39896). [#40095](https://github.com/ClickHouse/ClickHouse/pull/40095) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* A fix for reverse DNS resolution. [#40134](https://github.com/ClickHouse/ClickHouse/pull/40134) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix unexpected result `arrayDifference` of `Array(UInt32). [#40211](https://github.com/ClickHouse/ClickHouse/pull/40211) ([Duc Canh Le](https://github.com/canhld94)). + + +### ClickHouse release 22.7, 2022-07-21 + +#### Upgrade Notes +* Enable setting `enable_positional_arguments` by default. It allows queries like `SELECT ... ORDER BY 1, 2` where 1, 2 are the references to the select clause. If you need to return the old behavior, disable this setting. [#38204](https://github.com/ClickHouse/ClickHouse/pull/38204) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable `format_csv_allow_single_quotes` by default. See [#37096](https://github.com/ClickHouse/ClickHouse/issues/37096). ([Kruglov Pavel](https://github.com/Avogar)). +* `Ordinary` database engine and old storage definition syntax for `*MergeTree` tables are deprecated. By default it's not possible to create new databases with `Ordinary` engine. If `system` database has `Ordinary` engine it will be automatically converted to `Atomic` on server startup. There are settings to keep old behavior (`allow_deprecated_database_ordinary` and `allow_deprecated_syntax_for_merge_tree`), but these settings may be removed in future releases. [#38335](https://github.com/ClickHouse/ClickHouse/pull/38335) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Force rewriting comma join to inner by default (set default value `cross_to_inner_join_rewrite = 2`). To have old behavior set `cross_to_inner_join_rewrite = 1`. [#39326](https://github.com/ClickHouse/ClickHouse/pull/39326) ([Vladimir C](https://github.com/vdimir)). If you will face any incompatibilities, you can turn this setting back. + +#### New Feature +* Support expressions with window functions. Closes [#19857](https://github.com/ClickHouse/ClickHouse/issues/19857). [#37848](https://github.com/ClickHouse/ClickHouse/pull/37848) ([Dmitry Novik](https://github.com/novikd)). +* Add new `direct` join algorithm for `EmbeddedRocksDB` tables, see [#33582](https://github.com/ClickHouse/ClickHouse/issues/33582). [#35363](https://github.com/ClickHouse/ClickHouse/pull/35363) ([Vladimir C](https://github.com/vdimir)). +* Added full sorting merge join algorithm. [#35796](https://github.com/ClickHouse/ClickHouse/pull/35796) ([Vladimir C](https://github.com/vdimir)). +* Implement NATS table engine, which allows to pub/sub to NATS. Closes [#32388](https://github.com/ClickHouse/ClickHouse/issues/32388). [#37171](https://github.com/ClickHouse/ClickHouse/pull/37171) ([tchepavel](https://github.com/tchepavel)). ([Kseniia Sumarokova](https://github.com/kssenii)) +* Implement table function `mongodb`. Allow writes into `MongoDB` storage / table function. [#37213](https://github.com/ClickHouse/ClickHouse/pull/37213) ([aaapetrenko](https://github.com/aaapetrenko)). ([Kseniia Sumarokova](https://github.com/kssenii)) +* Add `SQLInsert` output format. Closes [#38441](https://github.com/ClickHouse/ClickHouse/issues/38441). [#38477](https://github.com/ClickHouse/ClickHouse/pull/38477) ([Kruglov Pavel](https://github.com/Avogar)). +* Introduced settings `additional_table_filters`. Using this setting, you can specify additional filtering condition for a table which will be applied directly after reading. Example: `select number, x, y from (select number from system.numbers limit 5) f any left join (select x, y from table_1) s on f.number = s.x settings additional_table_filters={'system.numbers : 'number != 3', 'table_1' : 'x != 2'}`. Introduced setting `additional_result_filter` which specifies additional filtering condition for query result. Closes [#37918](https://github.com/ClickHouse/ClickHouse/issues/37918). [#38475](https://github.com/ClickHouse/ClickHouse/pull/38475) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add `compatibility` setting and `system.settings_changes` system table that contains information about changes in settings through ClickHouse versions. Closes [#35972](https://github.com/ClickHouse/ClickHouse/issues/35972). [#38957](https://github.com/ClickHouse/ClickHouse/pull/38957) ([Kruglov Pavel](https://github.com/Avogar)). +* Add functions `translate(string, from_string, to_string)` and `translateUTF8(string, from_string, to_string)`. It translates some characters to another. [#38935](https://github.com/ClickHouse/ClickHouse/pull/38935) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `parseTimeDelta` function. It can be used like ` ;-+,:` can be used as separators, eg. `1yr-2mo`, `2m:6s`: `SELECT parseTimeDelta('1yr-2mo-4w + 12 days, 3 hours : 1 minute ; 33 seconds')`. [#39071](https://github.com/ClickHouse/ClickHouse/pull/39071) ([jiahui-97](https://github.com/jiahui-97)). +* Added `CREATE TABLE ... EMPTY AS SELECT` query. It automatically deduces table structure from the SELECT query, but does not fill the table after creation. Resolves [#38049](https://github.com/ClickHouse/ClickHouse/issues/38049). [#38272](https://github.com/ClickHouse/ClickHouse/pull/38272) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Added options to limit IO operations with remote storage: `max_remote_read_network_bandwidth_for_server` and `max_remote_write_network_bandwidth_for_server`. [#39095](https://github.com/ClickHouse/ClickHouse/pull/39095) ([Sergei Trifonov](https://github.com/serxa)). +* Add `group_by_use_nulls` setting to make aggregation key columns nullable in the case of ROLLUP, CUBE and GROUPING SETS. Closes [#37359](https://github.com/ClickHouse/ClickHouse/issues/37359). [#38642](https://github.com/ClickHouse/ClickHouse/pull/38642) ([Dmitry Novik](https://github.com/novikd)). +* Add the ability to specify compression level during data export. [#38907](https://github.com/ClickHouse/ClickHouse/pull/38907) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add an option to require explicit grants to SELECT from the `system` database. Details: [#38970](https://github.com/ClickHouse/ClickHouse/pull/38970) ([Vitaly Baranov](https://github.com/vitlibar)). +* Functions `multiMatchAny`, `multiMatchAnyIndex`, `multiMatchAllIndices` and their fuzzy variants now accept non-const pattern array argument. [#38485](https://github.com/ClickHouse/ClickHouse/pull/38485) ([Robert Schulze](https://github.com/rschu1ze)). SQL function `multiSearchAllPositions` now accepts non-const needle arguments. [#39167](https://github.com/ClickHouse/ClickHouse/pull/39167) ([Robert Schulze](https://github.com/rschu1ze)). +* Add a setting `zstd_window_log_max` to configure max memory usage on zstd decoding when importing external files. Closes [#35693](https://github.com/ClickHouse/ClickHouse/issues/35693). [#37015](https://github.com/ClickHouse/ClickHouse/pull/37015) ([wuxiaobai24](https://github.com/wuxiaobai24)). +* Add `send_logs_source_regexp` setting. Send server text logs with specified regexp to match log source name. Empty means all sources. [#39161](https://github.com/ClickHouse/ClickHouse/pull/39161) ([Amos Bird](https://github.com/amosbird)). +* Support `ALTER` for `Hive` tables. [#38214](https://github.com/ClickHouse/ClickHouse/pull/38214) ([lgbo](https://github.com/lgbo-ustc)). +* Support `isNullable` function. This function checks whether it's argument is nullable and return 1 or 0. Closes [#38611](https://github.com/ClickHouse/ClickHouse/issues/38611). [#38841](https://github.com/ClickHouse/ClickHouse/pull/38841) ([lokax](https://github.com/lokax)). +* Added functions for base58 encoding/decoding. [#38159](https://github.com/ClickHouse/ClickHouse/pull/38159) ([Andrey Zvonov](https://github.com/zvonand)). +* Add chart visualization to Play UI. [#38197](https://github.com/ClickHouse/ClickHouse/pull/38197) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added L2 Squared distance and norm functions for both arrays and tuples. [#38545](https://github.com/ClickHouse/ClickHouse/pull/38545) ([Julian Gilyadov](https://github.com/israelg99)). +* Add ability to pass HTTP headers to the `url` table function / storage via SQL. Closes [#37897](https://github.com/ClickHouse/ClickHouse/issues/37897). [#38176](https://github.com/ClickHouse/ClickHouse/pull/38176) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `clickhouse-diagnostics` binary to the packages. [#38647](https://github.com/ClickHouse/ClickHouse/pull/38647) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Experimental Feature +* Adds new setting `implicit_transaction` to run standalone queries inside a transaction. It handles both creation and closing (via COMMIT if the query succeeded or ROLLBACK if it didn't) of the transaction automatically. [#38344](https://github.com/ClickHouse/ClickHouse/pull/38344) ([Raúl Marín](https://github.com/Algunenano)). + +#### Performance Improvement +* Distinct optimization for sorted columns. Use specialized distinct transformation in case input stream is sorted by column(s) in distinct. Optimization can be applied to pre-distinct, final distinct, or both. Initial implementation by @dimarub2000. [#37803](https://github.com/ClickHouse/ClickHouse/pull/37803) ([Igor Nikonov](https://github.com/devcrafter)). +* Improve performance of `ORDER BY`, `MergeTree` merges, window functions using batch version of `BinaryHeap`. [#38022](https://github.com/ClickHouse/ClickHouse/pull/38022) ([Maksim Kita](https://github.com/kitaisreal)). +* More parallel execution for queries with `FINAL` [#36396](https://github.com/ClickHouse/ClickHouse/pull/36396) ([Nikita Taranov](https://github.com/nickitat)). +* Fix significant join performance regression which was introduced in [#35616](https://github.com/ClickHouse/ClickHouse/pull/35616). It's interesting that common join queries such as ssb queries have been 10 times slower for almost 3 months while no one complains. [#38052](https://github.com/ClickHouse/ClickHouse/pull/38052) ([Amos Bird](https://github.com/amosbird)). +* Migrate from the Intel hyperscan library to vectorscan, this speeds up many string matching on non-x86 platforms. [#38171](https://github.com/ClickHouse/ClickHouse/pull/38171) ([Robert Schulze](https://github.com/rschu1ze)). +* Increased parallelism of query plan steps executed after aggregation. [#38295](https://github.com/ClickHouse/ClickHouse/pull/38295) ([Nikita Taranov](https://github.com/nickitat)). +* Improve performance of insertion to columns of type `JSON`. [#38320](https://github.com/ClickHouse/ClickHouse/pull/38320) ([Anton Popov](https://github.com/CurtizJ)). +* Optimized insertion and lookups in the HashTable. [#38413](https://github.com/ClickHouse/ClickHouse/pull/38413) ([Nikita Taranov](https://github.com/nickitat)). +* Fix performance degradation from [#32493](https://github.com/ClickHouse/ClickHouse/issues/32493). [#38417](https://github.com/ClickHouse/ClickHouse/pull/38417) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve performance of joining with numeric columns using SIMD instructions. [#37235](https://github.com/ClickHouse/ClickHouse/pull/37235) ([zzachimed](https://github.com/zzachimed)). [#38565](https://github.com/ClickHouse/ClickHouse/pull/38565) ([Maksim Kita](https://github.com/kitaisreal)). +* Norm and Distance functions for arrays speed up 1.2-2 times. [#38740](https://github.com/ClickHouse/ClickHouse/pull/38740) ([Alexander Gololobov](https://github.com/davenger)). +* Add AVX-512 VBMI optimized `copyOverlap32Shuffle` for LZ4 decompression. In other words, LZ4 decompression performance is improved. [#37891](https://github.com/ClickHouse/ClickHouse/pull/37891) ([Guo Wangyang](https://github.com/guowangy)). +* `ORDER BY (a, b)` will use all the same benefits as `ORDER BY a, b`. [#38873](https://github.com/ClickHouse/ClickHouse/pull/38873) ([Igor Nikonov](https://github.com/devcrafter)). +* Align branches within a 32B boundary to make benchmark more stable. [#38988](https://github.com/ClickHouse/ClickHouse/pull/38988) ([Guo Wangyang](https://github.com/guowangy)). It improves performance 1..2% on average for Intel. +* Executable UDF, executable dictionaries, and Executable tables will avoid wasting one second during wait for subprocess termination. [#38929](https://github.com/ClickHouse/ClickHouse/pull/38929) ([Constantine Peresypkin](https://github.com/pkit)). +* Optimize accesses to `system.stack_trace` table if not all columns are selected. [#39177](https://github.com/ClickHouse/ClickHouse/pull/39177) ([Azat Khuzhin](https://github.com/azat)). +* Improve isNullable/isConstant/isNull/isNotNull performance for LowCardinality argument. [#39192](https://github.com/ClickHouse/ClickHouse/pull/39192) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimized processing of ORDER BY in window functions. [#34632](https://github.com/ClickHouse/ClickHouse/pull/34632) ([Vladimir Chebotarev](https://github.com/excitoon)). +* The table `system.asynchronous_metric_log` is further optimized for storage space. This closes [#38134](https://github.com/ClickHouse/ClickHouse/issues/38134). See the [YouTube video](https://www.youtube.com/watch?v=0fSp9SF8N8A). [#38428](https://github.com/ClickHouse/ClickHouse/pull/38428) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* Support SQL standard CREATE INDEX and DROP INDEX syntax. [#35166](https://github.com/ClickHouse/ClickHouse/pull/35166) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Send profile events for INSERT queries (previously only SELECT was supported). [#37391](https://github.com/ClickHouse/ClickHouse/pull/37391) ([Azat Khuzhin](https://github.com/azat)). +* Implement in order aggregation (`optimize_aggregation_in_order`) for fully materialized projections. [#37469](https://github.com/ClickHouse/ClickHouse/pull/37469) ([Azat Khuzhin](https://github.com/azat)). +* Remove subprocess run for kerberos initialization. Added new integration test. Closes [#27651](https://github.com/ClickHouse/ClickHouse/issues/27651). [#38105](https://github.com/ClickHouse/ClickHouse/pull/38105) ([Roman Vasin](https://github.com/rvasin)). +* * Add setting `multiple_joins_try_to_keep_original_names` to not rewrite identifier name on multiple JOINs rewrite, close [#34697](https://github.com/ClickHouse/ClickHouse/issues/34697). [#38149](https://github.com/ClickHouse/ClickHouse/pull/38149) ([Vladimir C](https://github.com/vdimir)). +* Improved trace-visualizer UX. [#38169](https://github.com/ClickHouse/ClickHouse/pull/38169) ([Sergei Trifonov](https://github.com/serxa)). +* Enable stack trace collection and query profiler for AArch64. [#38181](https://github.com/ClickHouse/ClickHouse/pull/38181) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not skip symlinks in `user_defined` directory during SQL user defined functions loading. Closes [#38042](https://github.com/ClickHouse/ClickHouse/issues/38042). [#38184](https://github.com/ClickHouse/ClickHouse/pull/38184) ([Maksim Kita](https://github.com/kitaisreal)). +* Added background cleanup of subdirectories in `store/`. In some cases clickhouse-server might left garbage subdirectories in `store/` (for example, on unsuccessful table creation) and those dirs were never been removed. Fixes [#33710](https://github.com/ClickHouse/ClickHouse/issues/33710). [#38265](https://github.com/ClickHouse/ClickHouse/pull/38265) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add `DESCRIBE CACHE` query to show cache settings from config. Add `SHOW CACHES` query to show available filesystem caches list. [#38279](https://github.com/ClickHouse/ClickHouse/pull/38279) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add access check for `system drop filesystem cache`. Support ON CLUSTER. [#38319](https://github.com/ClickHouse/ClickHouse/pull/38319) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix PostgreSQL database engine incompatibility on upgrade from 21.3 to 22.3. Closes [#36659](https://github.com/ClickHouse/ClickHouse/issues/36659). [#38369](https://github.com/ClickHouse/ClickHouse/pull/38369) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `filesystemAvailable` and similar functions now work in `clickhouse-local`. This closes [#38423](https://github.com/ClickHouse/ClickHouse/issues/38423). [#38424](https://github.com/ClickHouse/ClickHouse/pull/38424) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `revision` function. [#38555](https://github.com/ClickHouse/ClickHouse/pull/38555) ([Azat Khuzhin](https://github.com/azat)). +* Fix GCS via proxy tunnel usage. [#38726](https://github.com/ClickHouse/ClickHouse/pull/38726) ([Azat Khuzhin](https://github.com/azat)). +* Support `\i file` in clickhouse client / local (similar to psql \i). [#38813](https://github.com/ClickHouse/ClickHouse/pull/38813) ([Kseniia Sumarokova](https://github.com/kssenii)). +* New option `optimize = 1` in `EXPLAIN AST`. If enabled, it shows AST after it's rewritten, otherwise AST of original query. Disabled by default. [#38910](https://github.com/ClickHouse/ClickHouse/pull/38910) ([Igor Nikonov](https://github.com/devcrafter)). +* Allow trailing comma in columns list. closes [#38425](https://github.com/ClickHouse/ClickHouse/issues/38425). [#38440](https://github.com/ClickHouse/ClickHouse/pull/38440) ([chen](https://github.com/xiedeyantu)). +* Bugfixes and performance improvements for `parallel_hash` JOIN method. [#37648](https://github.com/ClickHouse/ClickHouse/pull/37648) ([Vladimir C](https://github.com/vdimir)). +* Support hadoop secure RPC transfer (hadoop.rpc.protection=privacy and hadoop.rpc.protection=integrity). [#37852](https://github.com/ClickHouse/ClickHouse/pull/37852) ([Peng Liu](https://github.com/michael1589)). +* Add struct type support in `StorageHive`. [#38118](https://github.com/ClickHouse/ClickHouse/pull/38118) ([lgbo](https://github.com/lgbo-ustc)). +* S3 single objects are now removed with `RemoveObjectRequest`. Implement compatibility with GCP which did not allow to use `removeFileIfExists` effectively breaking approximately half of `remove` functionality. Automatic detection for `DeleteObjects` S3 API, that is not supported by GCS. This will allow to use GCS without explicit `support_batch_delete=0` in configuration. [#37882](https://github.com/ClickHouse/ClickHouse/pull/37882) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Expose basic ClickHouse Keeper related monitoring data (via ProfileEvents and CurrentMetrics). [#38072](https://github.com/ClickHouse/ClickHouse/pull/38072) ([lingpeng0314](https://github.com/lingpeng0314)). +* Support `auto_close` option for PostgreSQL engine connection. Closes [#31486](https://github.com/ClickHouse/ClickHouse/issues/31486). [#38363](https://github.com/ClickHouse/ClickHouse/pull/38363) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow `NULL` modifier in columns declaration for table functions. [#38816](https://github.com/ClickHouse/ClickHouse/pull/38816) ([Kruglov Pavel](https://github.com/Avogar)). +* Deactivate `mutations_finalizing_task` before shutdown to avoid benign `TABLE_IS_READ_ONLY` errors during shutdown. [#38851](https://github.com/ClickHouse/ClickHouse/pull/38851) ([Raúl Marín](https://github.com/Algunenano)). +* Eliminate unnecessary waiting of SELECT queries after ALTER queries in presence of INSERT queries if you use deprecated Ordinary databases. [#38864](https://github.com/ClickHouse/ClickHouse/pull/38864) ([Azat Khuzhin](https://github.com/azat)). +* New option `rewrite` in `EXPLAIN AST`. If enabled, it shows AST after it's rewritten, otherwise AST of original query. Disabled by default. [#38910](https://github.com/ClickHouse/ClickHouse/pull/38910) ([Igor Nikonov](https://github.com/devcrafter)). +* Stop reporting Zookeeper "Node exists" exceptions in system.errors when they are expected. [#38961](https://github.com/ClickHouse/ClickHouse/pull/38961) ([Raúl Marín](https://github.com/Algunenano)). +* `clickhouse-keeper`: add support for real-time digest calculation and verification. It is disabled by default. [#37555](https://github.com/ClickHouse/ClickHouse/pull/37555) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow to specify globs `* or {expr1, expr2, expr3}` inside a key for `clickhouse-extract-from-config` tool. [#38966](https://github.com/ClickHouse/ClickHouse/pull/38966) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* clearOldLogs: Don't report KEEPER_EXCEPTION on concurrent deletes. [#39016](https://github.com/ClickHouse/ClickHouse/pull/39016) ([Raúl Marín](https://github.com/Algunenano)). +* clickhouse-keeper improvement: persist meta-information about keeper servers to disk. [#39069](https://github.com/ClickHouse/ClickHouse/pull/39069) ([Antonio Andelic](https://github.com/antonio2368)). This will make it easier to operate if you shutdown or restart all keeper nodes at the same time. +* Continue without exception when running out of disk space when using filesystem cache. [#39106](https://github.com/ClickHouse/ClickHouse/pull/39106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Handling SIGTERM signals from k8s. [#39130](https://github.com/ClickHouse/ClickHouse/pull/39130) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Add `merge_algorithm` column (Undecided, Horizontal, Vertical) to system.part_log. [#39181](https://github.com/ClickHouse/ClickHouse/pull/39181) ([Azat Khuzhin](https://github.com/azat)). +* Don't increment a counter in `system.errors` when the disk is not rotational. [#39216](https://github.com/ClickHouse/ClickHouse/pull/39216) ([Raúl Marín](https://github.com/Algunenano)). +* The metric `result_bytes` for `INSERT` queries in `system.query_log` shows number of bytes inserted. Previously value was incorrect and stored the same value as `result_rows`. [#39225](https://github.com/ClickHouse/ClickHouse/pull/39225) ([Ilya Yatsishin](https://github.com/qoega)). +* The CPU usage metric in clickhouse-client will be displayed in a better way. Fixes [#38756](https://github.com/ClickHouse/ClickHouse/issues/38756). [#39280](https://github.com/ClickHouse/ClickHouse/pull/39280) ([Sergei Trifonov](https://github.com/serxa)). +* Rethrow exception on filesystem cache initialization on server startup, better error message. [#39386](https://github.com/ClickHouse/ClickHouse/pull/39386) ([Kseniia Sumarokova](https://github.com/kssenii)). +* OpenTelemetry now collects traces without Processors spans by default (there are too many). To enable Processors spans collection `opentelemetry_trace_processors` setting. [#39170](https://github.com/ClickHouse/ClickHouse/pull/39170) ([Ilya Yatsishin](https://github.com/qoega)). +* Functions `multiMatch[Fuzzy](AllIndices/Any/AnyIndex)` - don't throw a logical error if the needle argument is empty. [#39012](https://github.com/ClickHouse/ClickHouse/pull/39012) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow to declare `RabbitMQ` queue without default arguments `x-max-length` and `x-overflow`. [#39259](https://github.com/ClickHouse/ClickHouse/pull/39259) ([rnbondarenko](https://github.com/rnbondarenko)). + +#### Build/Testing/Packaging Improvement +* Apply Clang Thread Safety Analysis (TSA) annotations to ClickHouse. [#38068](https://github.com/ClickHouse/ClickHouse/pull/38068) ([Robert Schulze](https://github.com/rschu1ze)). +* Adapt universal installation script for FreeBSD. [#39302](https://github.com/ClickHouse/ClickHouse/pull/39302) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preparation for building on `s390x` platform. [#39193](https://github.com/ClickHouse/ClickHouse/pull/39193) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Fix a bug in `jemalloc` library [#38757](https://github.com/ClickHouse/ClickHouse/pull/38757) ([Azat Khuzhin](https://github.com/azat)). +* Hardware benchmark now has support for automatic results uploading. [#38427](https://github.com/ClickHouse/ClickHouse/pull/38427) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* System table "system.licenses" is now correctly populated on Mac (Darwin). [#38294](https://github.com/ClickHouse/ClickHouse/pull/38294) ([Robert Schulze](https://github.com/rschu1ze)). +* Change `all|noarch` packages to architecture-dependent - Fix some documentation for it - Push aarch64|arm64 packages to artifactory and release assets - Fixes [#36443](https://github.com/ClickHouse/ClickHouse/issues/36443). [#38580](https://github.com/ClickHouse/ClickHouse/pull/38580) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) +* Fix rounding for `Decimal128/Decimal256` with more than 19-digits long scale. [#38027](https://github.com/ClickHouse/ClickHouse/pull/38027) ([Igor Nikonov](https://github.com/devcrafter)). +* Fixed crash caused by data race in storage `Hive` (integration table engine). [#38887](https://github.com/ClickHouse/ClickHouse/pull/38887) ([lgbo](https://github.com/lgbo-ustc)). +* Fix crash when executing GRANT ALL ON *.* with ON CLUSTER. It was broken in https://github.com/ClickHouse/ClickHouse/pull/35767. This closes [#38618](https://github.com/ClickHouse/ClickHouse/issues/38618). [#38674](https://github.com/ClickHouse/ClickHouse/pull/38674) ([Vitaly Baranov](https://github.com/vitlibar)). +* Correct glob expansion in case of `{0..10}` forms. Fixes [#38498](https://github.com/ClickHouse/ClickHouse/issues/38498) Current Implementation is similar to what shell does mentiond by @rschu1ze [here](https://github.com/ClickHouse/ClickHouse/pull/38502#issuecomment-1169057723). [#38502](https://github.com/ClickHouse/ClickHouse/pull/38502) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Fix crash for `mapUpdate`, `mapFilter` functions when using with constant map argument. Closes [#38547](https://github.com/ClickHouse/ClickHouse/issues/38547). [#38553](https://github.com/ClickHouse/ClickHouse/pull/38553) ([hexiaoting](https://github.com/hexiaoting)). +* Fix `toHour` monotonicity information for query optimization which can lead to incorrect query result (incorrect index analysis). This fixes [#38333](https://github.com/ClickHouse/ClickHouse/issues/38333). [#38675](https://github.com/ClickHouse/ClickHouse/pull/38675) ([Amos Bird](https://github.com/amosbird)). +* Fix checking whether s3 storage support parallel writes. It resulted in s3 parallel writes not working. [#38792](https://github.com/ClickHouse/ClickHouse/pull/38792) ([chen](https://github.com/xiedeyantu)). +* Fix s3 seekable reads with parallel read buffer. (Affected memory usage during query). Closes [#38258](https://github.com/ClickHouse/ClickHouse/issues/38258). [#38802](https://github.com/ClickHouse/ClickHouse/pull/38802) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Update `simdjson`. This fixes [#38621](https://github.com/ClickHouse/ClickHouse/issues/38621) - a buffer overflow on machines with the latest Intel CPUs with AVX-512 VBMI. [#38838](https://github.com/ClickHouse/ClickHouse/pull/38838) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix possible logical error for Vertical merges. [#38859](https://github.com/ClickHouse/ClickHouse/pull/38859) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix settings profile with seconds unit. [#38896](https://github.com/ClickHouse/ClickHouse/pull/38896) ([Raúl Marín](https://github.com/Algunenano)). +* Fix incorrect partition pruning when there is a nullable partition key. Note: most likely you don't use nullable partition keys - this is an obscure feature you should not use. Nullable keys are a nonsense and this feature is only needed for some crazy use-cases. This fixes [#38941](https://github.com/ClickHouse/ClickHouse/issues/38941). [#38946](https://github.com/ClickHouse/ClickHouse/pull/38946) ([Amos Bird](https://github.com/amosbird)). +* Improve `fsync_part_directory` for fetches. [#38993](https://github.com/ClickHouse/ClickHouse/pull/38993) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible dealock inside `OvercommitTracker`. Fixes [#37794](https://github.com/ClickHouse/ClickHouse/issues/37794). [#39030](https://github.com/ClickHouse/ClickHouse/pull/39030) ([Dmitry Novik](https://github.com/novikd)). +* Fix bug in filesystem cache that could happen in some corner case which coincided with cache capacity hitting the limit. Closes [#39066](https://github.com/ClickHouse/ClickHouse/issues/39066). [#39070](https://github.com/ClickHouse/ClickHouse/pull/39070) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix some corner cases of interpretation of the arguments of window expressions. Fixes [#38538](https://github.com/ClickHouse/ClickHouse/issues/38538) Allow using of higher-order functions in window expressions. [#39112](https://github.com/ClickHouse/ClickHouse/pull/39112) ([Dmitry Novik](https://github.com/novikd)). +* Keep `LowCardinality` type in `tuple` function. Previously `LowCardinality` type was dropped and elements of created tuple had underlying type of `LowCardinality`. [#39113](https://github.com/ClickHouse/ClickHouse/pull/39113) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Block structure mismatch` which could happen for INSERT into table with attached MATERIALIZED VIEW and enabled setting `extremes = 1`. Closes [#29759](https://github.com/ClickHouse/ClickHouse/issues/29759) and [#38729](https://github.com/ClickHouse/ClickHouse/issues/38729). [#39125](https://github.com/ClickHouse/ClickHouse/pull/39125) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected query result when both `optimize_trivial_count_query` and `empty_result_for_aggregation_by_empty_set` are set to true. This fixes [#39140](https://github.com/ClickHouse/ClickHouse/issues/39140). [#39155](https://github.com/ClickHouse/ClickHouse/pull/39155) ([Amos Bird](https://github.com/amosbird)). +* Fixed error `Not found column Type in block` in selects with `PREWHERE` and read-in-order optimizations. [#39157](https://github.com/ClickHouse/ClickHouse/pull/39157) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix extremely rare race condition in during hardlinks for remote filesystem. The only way to reproduce it is concurrent run of backups. [#39190](https://github.com/ClickHouse/ClickHouse/pull/39190) ([alesapin](https://github.com/alesapin)). +* (zero-copy replication is an experimental feature that should not be used in production) Fix fetch of in-memory part with `allow_remote_fs_zero_copy_replication`. [#39214](https://github.com/ClickHouse/ClickHouse/pull/39214) ([Azat Khuzhin](https://github.com/azat)). +* (MaterializedPostgreSQL - experimental feature). Fix segmentation fault in MaterializedPostgreSQL database engine, which could happen if some exception occurred at replication initialisation. Closes [#36939](https://github.com/ClickHouse/ClickHouse/issues/36939). [#39272](https://github.com/ClickHouse/ClickHouse/pull/39272) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix incorrect fetch of table metadata from PostgreSQL database engine. Closes [#33502](https://github.com/ClickHouse/ClickHouse/issues/33502). [#39283](https://github.com/ClickHouse/ClickHouse/pull/39283) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix projection exception when aggregation keys are wrapped inside other functions. This fixes [#37151](https://github.com/ClickHouse/ClickHouse/issues/37151). [#37155](https://github.com/ClickHouse/ClickHouse/pull/37155) ([Amos Bird](https://github.com/amosbird)). +* Fix possible logical error `... with argument with type Nothing and default implementation for Nothing is expected to return result with type Nothing, got ...` in some functions. Closes: [#37610](https://github.com/ClickHouse/ClickHouse/issues/37610) Closes: [#37741](https://github.com/ClickHouse/ClickHouse/issues/37741). [#37759](https://github.com/ClickHouse/ClickHouse/pull/37759) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix incorrect columns order in subqueries of UNION (in case of duplicated columns in subselects may produce incorrect result). [#37887](https://github.com/ClickHouse/ClickHouse/pull/37887) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect work of MODIFY ALTER Column with column names that contain dots. Closes [#37907](https://github.com/ClickHouse/ClickHouse/issues/37907). [#37971](https://github.com/ClickHouse/ClickHouse/pull/37971) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of sparse columns from `MergeTree` tables that store their data in S3. [#37978](https://github.com/ClickHouse/ClickHouse/pull/37978) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible crash in `Distributed` async insert in case of removing a replica from config. [#38029](https://github.com/ClickHouse/ClickHouse/pull/38029) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix "Missing columns" for GLOBAL JOIN with CTE without alias. [#38056](https://github.com/ClickHouse/ClickHouse/pull/38056) ([Azat Khuzhin](https://github.com/azat)). +* Rewrite tuple functions as literals in backwards-compatibility mode. [#38096](https://github.com/ClickHouse/ClickHouse/pull/38096) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Fix redundant memory reservation for output block during `ORDER BY`. [#38127](https://github.com/ClickHouse/ClickHouse/pull/38127) ([iyupeng](https://github.com/iyupeng)). +* Fix possible logical error `Bad cast from type DB::IColumn* to DB::ColumnNullable*` in array mapped functions. Closes [#38006](https://github.com/ClickHouse/ClickHouse/issues/38006). [#38132](https://github.com/ClickHouse/ClickHouse/pull/38132) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix temporary name clash in partial merge join, close [#37928](https://github.com/ClickHouse/ClickHouse/issues/37928). [#38135](https://github.com/ClickHouse/ClickHouse/pull/38135) ([Vladimir C](https://github.com/vdimir)). +* Some minr issue with queries like `CREATE TABLE nested_name_tuples (`a` Tuple(x String, y Tuple(i Int32, j String))) ENGINE = Memory;` [#38136](https://github.com/ClickHouse/ClickHouse/pull/38136) ([lgbo](https://github.com/lgbo-ustc)). +* Fix bug with nested short-circuit functions that led to execution of arguments even if condition is false. Closes [#38040](https://github.com/ClickHouse/ClickHouse/issues/38040). [#38173](https://github.com/ClickHouse/ClickHouse/pull/38173) ([Kruglov Pavel](https://github.com/Avogar)). +* (Window View is a experimental feature) Fix LOGICAL_ERROR for WINDOW VIEW with incorrect structure. [#38205](https://github.com/ClickHouse/ClickHouse/pull/38205) ([Azat Khuzhin](https://github.com/azat)). +* Update librdkafka submodule to fix crash when an OAUTHBEARER refresh callback is set. [#38225](https://github.com/ClickHouse/ClickHouse/pull/38225) ([Rafael Acevedo](https://github.com/racevedoo)). +* Fix INSERT into Distributed hung due to ProfileEvents. [#38307](https://github.com/ClickHouse/ClickHouse/pull/38307) ([Azat Khuzhin](https://github.com/azat)). +* Fix retries in PostgreSQL engine. [#38310](https://github.com/ClickHouse/ClickHouse/pull/38310) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix optimization in PartialSortingTransform (SIGSEGV and possible incorrect result). [#38324](https://github.com/ClickHouse/ClickHouse/pull/38324) ([Azat Khuzhin](https://github.com/azat)). +* Fix RabbitMQ with formats based on PeekableReadBuffer. Closes [#38061](https://github.com/ClickHouse/ClickHouse/issues/38061). [#38356](https://github.com/ClickHouse/ClickHouse/pull/38356) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializedPostgreSQL - experimentail feature. Fix possible `Invalid number of rows in Chunk` in MaterializedPostgreSQL. Closes [#37323](https://github.com/ClickHouse/ClickHouse/issues/37323). [#38360](https://github.com/ClickHouse/ClickHouse/pull/38360) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix RabbitMQ configuration with connection string setting. Closes [#36531](https://github.com/ClickHouse/ClickHouse/issues/36531). [#38365](https://github.com/ClickHouse/ClickHouse/pull/38365) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix PostgreSQL engine not using PostgreSQL schema when retrieving array dimension size. Closes [#36755](https://github.com/ClickHouse/ClickHouse/issues/36755). Closes [#36772](https://github.com/ClickHouse/ClickHouse/issues/36772). [#38366](https://github.com/ClickHouse/ClickHouse/pull/38366) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possibly incorrect result of distributed queries with `DISTINCT` and `LIMIT`. Fixes [#38282](https://github.com/ClickHouse/ClickHouse/issues/38282). [#38371](https://github.com/ClickHouse/ClickHouse/pull/38371) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong results of countSubstrings() & position() on patterns with 0-bytes. [#38589](https://github.com/ClickHouse/ClickHouse/pull/38589) ([Robert Schulze](https://github.com/rschu1ze)). +* Now it's possible to start a clickhouse-server and attach/detach tables even for tables with the incorrect values of IPv4/IPv6 representation. Proper fix for issue [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#38590](https://github.com/ClickHouse/ClickHouse/pull/38590) ([alesapin](https://github.com/alesapin)). +* `rankCorr` function will work correctly if some arguments are NaNs. This closes [#38396](https://github.com/ClickHouse/ClickHouse/issues/38396). [#38722](https://github.com/ClickHouse/ClickHouse/pull/38722) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `parallel_view_processing=1` with `optimize_trivial_insert_select=1`. Fix `max_insert_threads` while pushing to views. [#38731](https://github.com/ClickHouse/ClickHouse/pull/38731) ([Azat Khuzhin](https://github.com/azat)). +* Fix use-after-free for aggregate functions with `Map` combinator that leads to incorrect result. [#38748](https://github.com/ClickHouse/ClickHouse/pull/38748) ([Azat Khuzhin](https://github.com/azat)). + +### ClickHouse release 22.6, 2022-06-16 + +#### Backward Incompatible Change +* Remove support for octal number literals in SQL. In previous versions they were parsed as Float64. [#37765](https://github.com/ClickHouse/ClickHouse/pull/37765) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Changes how settings using `seconds` as type are parsed to support floating point values (for example: `max_execution_time=0.5`). Infinity or NaN values will throw an exception. [#37187](https://github.com/ClickHouse/ClickHouse/pull/37187) ([Raúl Marín](https://github.com/Algunenano)). +* Changed format of binary serialization of columns of experimental type `Object`. New format is more convenient to implement by third-party clients. [#37482](https://github.com/ClickHouse/ClickHouse/pull/37482) ([Anton Popov](https://github.com/CurtizJ)). +* Turn on setting `output_format_json_named_tuples_as_objects` by default. It allows to serialize named tuples as JSON objects in JSON formats. [#37756](https://github.com/ClickHouse/ClickHouse/pull/37756) ([Anton Popov](https://github.com/CurtizJ)). +* LIKE patterns with trailing escape symbol ('\\') are now disallowed (as mandated by the SQL standard). [#37764](https://github.com/ClickHouse/ClickHouse/pull/37764) ([Robert Schulze](https://github.com/rschu1ze)). +* If you run different ClickHouse versions on a cluster with AArch64 CPU or mix AArch64 and amd64 on a cluster, and use distributed queries with GROUP BY multiple keys of fixed-size type that fit in 256 bits but don't fit in 64 bits, and the size of the result is huge, the data will not be fully aggregated in the result of these queries during upgrade. Workaround: upgrade with downtime instead of a rolling upgrade. + +#### New Feature +* Add `GROUPING` function. It allows to disambiguate the records in the queries with `ROLLUP`, `CUBE` or `GROUPING SETS`. Closes [#19426](https://github.com/ClickHouse/ClickHouse/issues/19426). [#37163](https://github.com/ClickHouse/ClickHouse/pull/37163) ([Dmitry Novik](https://github.com/novikd)). +* A new codec [FPC](https://userweb.cs.txstate.edu/~burtscher/papers/dcc07a.pdf) algorithm for floating point data compression. [#37553](https://github.com/ClickHouse/ClickHouse/pull/37553) ([Mikhail Guzov](https://github.com/koloshmet)). +* Add new columnar JSON formats: `JSONColumns`, `JSONCompactColumns`, `JSONColumnsWithMetadata`. Closes [#36338](https://github.com/ClickHouse/ClickHouse/issues/36338) Closes [#34509](https://github.com/ClickHouse/ClickHouse/issues/34509). [#36975](https://github.com/ClickHouse/ClickHouse/pull/36975) ([Kruglov Pavel](https://github.com/Avogar)). +* Added open telemetry traces visualizing tool based on d3js. [#37810](https://github.com/ClickHouse/ClickHouse/pull/37810) ([Sergei Trifonov](https://github.com/serxa)). +* Support INSERTs into `system.zookeeper` table. Closes [#22130](https://github.com/ClickHouse/ClickHouse/issues/22130). [#37596](https://github.com/ClickHouse/ClickHouse/pull/37596) ([Han Fei](https://github.com/hanfei1991)). +* Support non-constant pattern argument for `LIKE`, `ILIKE` and `match` functions. [#37251](https://github.com/ClickHouse/ClickHouse/pull/37251) ([Robert Schulze](https://github.com/rschu1ze)). +* Executable user defined functions now support parameters. Example: `SELECT test_function(parameters)(arguments)`. Closes [#37578](https://github.com/ClickHouse/ClickHouse/issues/37578). [#37720](https://github.com/ClickHouse/ClickHouse/pull/37720) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `merge_reason` column to system.part_log table. [#36912](https://github.com/ClickHouse/ClickHouse/pull/36912) ([Sema Checherinda](https://github.com/CheSema)). +* Add support for Maps and Records in Avro format. Add new setting `input_format_avro_null_as_default ` that allow to insert null as default in Avro format. Closes [#18925](https://github.com/ClickHouse/ClickHouse/issues/18925) Closes [#37378](https://github.com/ClickHouse/ClickHouse/issues/37378) Closes [#32899](https://github.com/ClickHouse/ClickHouse/issues/32899). [#37525](https://github.com/ClickHouse/ClickHouse/pull/37525) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `clickhouse-disks` tool to introspect and operate on virtual filesystems configured for ClickHouse. [#36060](https://github.com/ClickHouse/ClickHouse/pull/36060) ([Artyom Yurkov](https://github.com/Varinara)). +* Adds H3 unidirectional edge functions. [#36843](https://github.com/ClickHouse/ClickHouse/pull/36843) ([Bharat Nallan](https://github.com/bharatnc)). +* Add support for calculating [hashids](https://hashids.org/) from unsigned integers. [#37013](https://github.com/ClickHouse/ClickHouse/pull/37013) ([Michael Nutt](https://github.com/mnutt)). +* Explicit `SALT` specification is allowed for `CREATE USER IDENTIFIED WITH sha256_hash`. [#37377](https://github.com/ClickHouse/ClickHouse/pull/37377) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add two new settings `input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines` to allow skipping specified number of lines in the beginning of the file in CSV/TSV formats. [#37537](https://github.com/ClickHouse/ClickHouse/pull/37537) ([Kruglov Pavel](https://github.com/Avogar)). +* `showCertificate` function shows current server's SSL certificate. [#37540](https://github.com/ClickHouse/ClickHouse/pull/37540) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* HTTP source for Data Dictionaries in Named Collections is supported. [#37581](https://github.com/ClickHouse/ClickHouse/pull/37581) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Added a new window function `nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL x SECOND])`. [#37628](https://github.com/ClickHouse/ClickHouse/pull/37628) ([Andrey Zvonov](https://github.com/zvonand)). +* Implemented changing the comment for `ReplicatedMergeTree` tables. [#37416](https://github.com/ClickHouse/ClickHouse/pull/37416) ([Vasily Nemkov](https://github.com/Enmk)). +* Added `SYSTEM UNFREEZE` query that deletes the whole backup regardless if the corresponding table is deleted or not. [#36424](https://github.com/ClickHouse/ClickHouse/pull/36424) ([Vadim Volodin](https://github.com/PolyProgrammist)). + +#### Experimental Feature +* Enables `POPULATE` for `WINDOW VIEW`. [#36945](https://github.com/ClickHouse/ClickHouse/pull/36945) ([vxider](https://github.com/Vxider)). +* `ALTER TABLE ... MODIFY QUERY` support for `WINDOW VIEW`. [#37188](https://github.com/ClickHouse/ClickHouse/pull/37188) ([vxider](https://github.com/Vxider)). +* This PR changes the behavior of the `ENGINE` syntax in `WINDOW VIEW`, to make it like in `MATERIALIZED VIEW`. [#37214](https://github.com/ClickHouse/ClickHouse/pull/37214) ([vxider](https://github.com/Vxider)). + +#### Performance Improvement +* Added numerous optimizations for ARM NEON [#38093](https://github.com/ClickHouse/ClickHouse/pull/38093)([Daniel Kutenin](https://github.com/danlark1)), ([Alexandra Pilipyuk](https://github.com/chalice19)) Note: if you run different ClickHouse versions on a cluster with ARM CPU and use distributed queries with GROUP BY multiple keys of fixed-size type that fit in 256 bits but don't fit in 64 bits, the result of the aggregation query will be wrong during upgrade. Workaround: upgrade with downtime instead of a rolling upgrade. +* Improve performance and memory usage for select of subset of columns for formats Native, Protobuf, CapnProto, JSONEachRow, TSKV, all formats with suffixes WithNames/WithNamesAndTypes. Previously while selecting only subset of columns from files in these formats all columns were read and stored in memory. Now only required columns are read. This PR enables setting `input_format_skip_unknown_fields` by default, because otherwise in case of select of subset of columns exception will be thrown. [#37192](https://github.com/ClickHouse/ClickHouse/pull/37192) ([Kruglov Pavel](https://github.com/Avogar)). +* Now more filters can be pushed down for join. [#37472](https://github.com/ClickHouse/ClickHouse/pull/37472) ([Amos Bird](https://github.com/amosbird)). +* Load marks for only necessary columns when reading wide parts. [#36879](https://github.com/ClickHouse/ClickHouse/pull/36879) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improved performance of aggregation in case, when sparse columns (can be enabled by experimental setting `ratio_of_defaults_for_sparse_serialization` in `MergeTree` tables) are used as arguments in aggregate functions. [#37617](https://github.com/ClickHouse/ClickHouse/pull/37617) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize function `COALESCE` with two arguments. [#37666](https://github.com/ClickHouse/ClickHouse/pull/37666) ([Anton Popov](https://github.com/CurtizJ)). +* Replace `multiIf` to `if` in case when `multiIf` has only one condition, because function `if` is more performant. [#37695](https://github.com/ClickHouse/ClickHouse/pull/37695) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of `dictGetDescendants`, `dictGetChildren` functions, create temporary parent to children hierarchical index per query, not per function call during query. Allow to specify `BIDIRECTIONAL` for `HIERARHICAL` attributes, dictionary will maintain parent to children index in memory, that way functions `dictGetDescendants`, `dictGetChildren` will not create temporary index per query. Closes [#32481](https://github.com/ClickHouse/ClickHouse/issues/32481). [#37148](https://github.com/ClickHouse/ClickHouse/pull/37148) ([Maksim Kita](https://github.com/kitaisreal)). +* Aggregates state destruction now may be posted on a thread pool. For queries with LIMIT and big state it provides significant speedup, e.g. `select uniq(number) from numbers_mt(1e7) group by number limit 100` became around 2.5x faster. [#37855](https://github.com/ClickHouse/ClickHouse/pull/37855) ([Nikita Taranov](https://github.com/nickitat)). +* Improve sort performance by single column. [#37195](https://github.com/ClickHouse/ClickHouse/pull/37195) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of single column sorting using sorting queue specializations. [#37990](https://github.com/ClickHouse/ClickHouse/pull/37990) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved performance on array norm and distance functions 2x-4x times. [#37394](https://github.com/ClickHouse/ClickHouse/pull/37394) ([Alexander Gololobov](https://github.com/davenger)). +* Improve performance of number comparison functions using dynamic dispatch. [#37399](https://github.com/ClickHouse/ClickHouse/pull/37399) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of ORDER BY with LIMIT. [#37481](https://github.com/ClickHouse/ClickHouse/pull/37481) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `hasAll` function using dynamic dispatch infrastructure. [#37484](https://github.com/ClickHouse/ClickHouse/pull/37484) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `greatCircleAngle`, `greatCircleDistance`, `geoDistance` functions. [#37524](https://github.com/ClickHouse/ClickHouse/pull/37524) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of insert into MergeTree if there are multiple columns in ORDER BY. [#35762](https://github.com/ClickHouse/ClickHouse/pull/35762) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix excessive CPU usage in background when there are a lot of tables. [#38028](https://github.com/ClickHouse/ClickHouse/pull/38028) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `not` function using dynamic dispatch. [#38058](https://github.com/ClickHouse/ClickHouse/pull/38058) ([Maksim Kita](https://github.com/kitaisreal)). +* Optimized the internal caching of re2 patterns which occur e.g. in LIKE and MATCH functions. [#37544](https://github.com/ClickHouse/ClickHouse/pull/37544) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve filter bitmask generator function all in one with AVX-512 instructions. [#37588](https://github.com/ClickHouse/ClickHouse/pull/37588) ([yaqi-zhao](https://github.com/yaqi-zhao)). +* Apply read method `threadpool` for Hive integration engine. This will significantly speed up reading. [#36328](https://github.com/ClickHouse/ClickHouse/pull/36328) ([李扬](https://github.com/taiyang-li)). +* When all the columns to read are partition keys, construct columns by the file's row number without real reading the Hive file. [#37103](https://github.com/ClickHouse/ClickHouse/pull/37103) ([lgbo](https://github.com/lgbo-ustc)). +* Support multi disks for caching hive files. [#37279](https://github.com/ClickHouse/ClickHouse/pull/37279) ([lgbo](https://github.com/lgbo-ustc)). +* Limiting the maximum cache usage per query can effectively prevent cache pool contamination. [Related Issues](https://github.com/ClickHouse/ClickHouse/issues/28961). [#37859](https://github.com/ClickHouse/ClickHouse/pull/37859) ([Han Shukai](https://github.com/KinderRiven)). +* Currently clickhouse directly downloads all remote files to the local cache (even if they are only read once), which will frequently cause IO of the local hard disk. In some scenarios, these IOs may not be necessary and may easily cause negative optimization. As shown in the figure below, when we run SSB Q1-Q4, the performance of the cache has caused negative optimization. [#37516](https://github.com/ClickHouse/ClickHouse/pull/37516) ([Han Shukai](https://github.com/KinderRiven)). +* Allow to prune the list of files via virtual columns such as `_file` and `_path` when reading from S3. This is for [#37174](https://github.com/ClickHouse/ClickHouse/issues/37174) , [#23494](https://github.com/ClickHouse/ClickHouse/issues/23494). [#37356](https://github.com/ClickHouse/ClickHouse/pull/37356) ([Amos Bird](https://github.com/amosbird)). +* In function: CompressedWriteBuffer::nextImpl(), there is an unnecessary write-copy step that would happen frequently during inserting data. Below shows the differentiation with this patch: - Before: 1. Compress "working_buffer" into "compressed_buffer" 2. write-copy into "out" - After: Directly Compress "working_buffer" into "out". [#37242](https://github.com/ClickHouse/ClickHouse/pull/37242) ([jasperzhu](https://github.com/jinjunzh)). + +#### Improvement +* Support types with non-standard defaults in ROLLUP, CUBE, GROUPING SETS. Closes [#37360](https://github.com/ClickHouse/ClickHouse/issues/37360). [#37667](https://github.com/ClickHouse/ClickHouse/pull/37667) ([Dmitry Novik](https://github.com/novikd)). +* Fix stack traces collection on ARM. Closes [#37044](https://github.com/ClickHouse/ClickHouse/issues/37044). Closes [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638). [#37797](https://github.com/ClickHouse/ClickHouse/pull/37797) ([Maksim Kita](https://github.com/kitaisreal)). +* Client will try every IP address returned by DNS resolution until successful connection. [#37273](https://github.com/ClickHouse/ClickHouse/pull/37273) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Allow to use String type instead of Binary in Arrow/Parquet/ORC formats. This PR introduces 3 new settings for it: `output_format_arrow_string_as_string`, `output_format_parquet_string_as_string`, `output_format_orc_string_as_string`. Default value for all settings is `false`. [#37327](https://github.com/ClickHouse/ClickHouse/pull/37327) ([Kruglov Pavel](https://github.com/Avogar)). +* Apply setting `input_format_max_rows_to_read_for_schema_inference` for all read rows in total from all files in globs. Previously setting `input_format_max_rows_to_read_for_schema_inference` was applied for each file in glob separately and in case of huge number of nulls we could read first `input_format_max_rows_to_read_for_schema_inference` rows from each file and get nothing. Also increase default value for this setting to 25000. [#37332](https://github.com/ClickHouse/ClickHouse/pull/37332) ([Kruglov Pavel](https://github.com/Avogar)). +* Add separate `CLUSTER` grant (and `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive, for backward compatibility, default to `false`). [#35767](https://github.com/ClickHouse/ClickHouse/pull/35767) ([Azat Khuzhin](https://github.com/azat)). +* Added support for schema inference for `hdfsCluster`. [#35812](https://github.com/ClickHouse/ClickHouse/pull/35812) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implement `least_used` load balancing algorithm for disks inside volume (multi disk configuration). [#36686](https://github.com/ClickHouse/ClickHouse/pull/36686) ([Azat Khuzhin](https://github.com/azat)). +* Modify the HTTP Endpoint to return the full stats under the `X-ClickHouse-Summary` header when `send_progress_in_http_headers=0` (before it would return all zeros). - Modify the HTTP Endpoint to return `X-ClickHouse-Exception-Code` header when progress has been sent before (`send_progress_in_http_headers=1`) - Modify the HTTP Endpoint to return `HTTP_REQUEST_TIMEOUT` (408) instead of `HTTP_INTERNAL_SERVER_ERROR` (500) on `TIMEOUT_EXCEEDED` errors. [#36884](https://github.com/ClickHouse/ClickHouse/pull/36884) ([Raúl Marín](https://github.com/Algunenano)). +* Allow a user to inspect grants from granted roles. [#36941](https://github.com/ClickHouse/ClickHouse/pull/36941) ([nvartolomei](https://github.com/nvartolomei)). +* Do not calculate an integral numerically but use CDF functions instead. This will speed up execution and will increase the precision. This fixes [#36714](https://github.com/ClickHouse/ClickHouse/issues/36714). [#36953](https://github.com/ClickHouse/ClickHouse/pull/36953) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add default implementation for Nothing in functions. Now most of the functions will return column with type Nothing in case one of it's arguments is Nothing. It also solves problem with functions like arrayMap/arrayFilter and similar when they have empty array as an argument. Previously queries like `select arrayMap(x -> 2 * x, []);` failed because function inside lambda cannot work with type `Nothing`, now such queries return empty array with type `Array(Nothing)`. Also add support for arrays of nullable types in functions like arrayFilter/arrayFill. Previously, queries like `select arrayFilter(x -> x % 2, [1, NULL])` failed, now they work (if the result of lambda is NULL, then this value won't be included in the result). Closes [#37000](https://github.com/ClickHouse/ClickHouse/issues/37000). [#37048](https://github.com/ClickHouse/ClickHouse/pull/37048) ([Kruglov Pavel](https://github.com/Avogar)). +* Now if a shard has local replica we create a local plan and a plan to read from all remote replicas. They have shared initiator which coordinates reading. [#37204](https://github.com/ClickHouse/ClickHouse/pull/37204) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do no longer abort server startup if configuration option "mark_cache_size" is not explicitly set. [#37326](https://github.com/ClickHouse/ClickHouse/pull/37326) ([Robert Schulze](https://github.com/rschu1ze)). +* Allows providing `NULL`/`NOT NULL` right after type in column declaration. [#37337](https://github.com/ClickHouse/ClickHouse/pull/37337) ([Igor Nikonov](https://github.com/devcrafter)). +* optimize file segment PARTIALLY_DOWNLOADED get read buffer. [#37338](https://github.com/ClickHouse/ClickHouse/pull/37338) ([xiedeyantu](https://github.com/xiedeyantu)). +* Try to improve short circuit functions processing to fix problems with stress tests. [#37384](https://github.com/ClickHouse/ClickHouse/pull/37384) ([Kruglov Pavel](https://github.com/Avogar)). +* Closes [#37395](https://github.com/ClickHouse/ClickHouse/issues/37395). [#37415](https://github.com/ClickHouse/ClickHouse/pull/37415) ([Memo](https://github.com/Joeywzr)). +* Fix extremely rare deadlock during part fetch in zero-copy replication. Fixes [#37423](https://github.com/ClickHouse/ClickHouse/issues/37423). [#37424](https://github.com/ClickHouse/ClickHouse/pull/37424) ([metahys](https://github.com/metahys)). +* Don't allow to create storage with unknown data format. [#37450](https://github.com/ClickHouse/ClickHouse/pull/37450) ([Kruglov Pavel](https://github.com/Avogar)). +* Set `global_memory_usage_overcommit_max_wait_microseconds` default value to 5 seconds. Add info about `OvercommitTracker` to OOM exception message. Add `MemoryOvercommitWaitTimeMicroseconds` profile event. [#37460](https://github.com/ClickHouse/ClickHouse/pull/37460) ([Dmitry Novik](https://github.com/novikd)). +* Do not display `-0.0` CPU time in clickhouse-client. It can appear due to rounding errors. This closes [#38003](https://github.com/ClickHouse/ClickHouse/issues/38003). This closes [#38038](https://github.com/ClickHouse/ClickHouse/issues/38038). [#38064](https://github.com/ClickHouse/ClickHouse/pull/38064) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: Keep controls in place when the page is scrolled horizontally. This makes edits comfortable even if the table is wide and it was scrolled far to the right. The feature proposed by Maksym Tereshchenko from CaspianDB. [#37470](https://github.com/ClickHouse/ClickHouse/pull/37470) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Modify query div in play.html to be extendable beyond 20% height. In case of very long queries it is helpful to extend the textarea element, only today, since the div is fixed height, the extended textarea hides the data div underneath. With this fix, extending the textarea element will push the data div down/up such the extended textarea won't hide it. Also, keeps query box width 100% even when the user adjusting the size of the query textarea. [#37488](https://github.com/ClickHouse/ClickHouse/pull/37488) ([guyco87](https://github.com/guyco87)). +* Added `ProfileEvents` for introspection of type of written (inserted or merged) parts (`Inserted{Wide/Compact/InMemory}Parts`, `MergedInto{Wide/Compact/InMemory}Parts`. Added column `part_type` to `system.part_log`. Resolves [#37495](https://github.com/ClickHouse/ClickHouse/issues/37495). [#37536](https://github.com/ClickHouse/ClickHouse/pull/37536) ([Anton Popov](https://github.com/CurtizJ)). +* clickhouse-keeper improvement: move broken logs to a timestamped folder. [#37565](https://github.com/ClickHouse/ClickHouse/pull/37565) ([Antonio Andelic](https://github.com/antonio2368)). +* Do not write expired columns by TTL after subsequent merges (before only first merge/optimize of the part will not write expired by TTL columns, all other will do). [#37570](https://github.com/ClickHouse/ClickHouse/pull/37570) ([Azat Khuzhin](https://github.com/azat)). +* More precise result of the `dumpColumnStructure` miscellaneous function in presence of LowCardinality or Sparse columns. In previous versions, these functions were converting the argument to a full column before returning the result. This is needed to provide an answer in [#6935](https://github.com/ClickHouse/ClickHouse/issues/6935). [#37633](https://github.com/ClickHouse/ClickHouse/pull/37633) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* clickhouse-keeper: store only unique session IDs for watches. [#37641](https://github.com/ClickHouse/ClickHouse/pull/37641) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible "Cannot write to finalized buffer". [#37645](https://github.com/ClickHouse/ClickHouse/pull/37645) ([Azat Khuzhin](https://github.com/azat)). +* Add setting `support_batch_delete` for `DiskS3` to disable multiobject delete calls, which Google Cloud Storage doesn't support. [#37659](https://github.com/ClickHouse/ClickHouse/pull/37659) ([Fred Wulff](https://github.com/frew)). +* Add an option to disable connection pooling in ODBC bridge. [#37705](https://github.com/ClickHouse/ClickHouse/pull/37705) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Functions `dictGetHierarchy`, `dictIsIn`, `dictGetChildren`, `dictGetDescendants` added support nullable `HIERARCHICAL` attribute in dictionaries. Closes [#35521](https://github.com/ClickHouse/ClickHouse/issues/35521). [#37805](https://github.com/ClickHouse/ClickHouse/pull/37805) ([Maksim Kita](https://github.com/kitaisreal)). +* Expose BoringSSL version related info in the `system.build_options` table. [#37850](https://github.com/ClickHouse/ClickHouse/pull/37850) ([Bharat Nallan](https://github.com/bharatnc)). +* Now clickhouse-server removes `delete_tmp` directories on server start. Fixes [#26503](https://github.com/ClickHouse/ClickHouse/issues/26503). [#37906](https://github.com/ClickHouse/ClickHouse/pull/37906) ([alesapin](https://github.com/alesapin)). +* Clean up broken detached parts after timeout. Closes [#25195](https://github.com/ClickHouse/ClickHouse/issues/25195). [#37975](https://github.com/ClickHouse/ClickHouse/pull/37975) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now in MergeTree table engines family failed-to-move parts will be removed instantly. [#37994](https://github.com/ClickHouse/ClickHouse/pull/37994) ([alesapin](https://github.com/alesapin)). +* Now if setting `always_fetch_merged_part` is enabled for ReplicatedMergeTree merges will try to find parts on other replicas rarely with smaller load for [Zoo]Keeper. [#37995](https://github.com/ClickHouse/ClickHouse/pull/37995) ([alesapin](https://github.com/alesapin)). +* Add implicit grants with grant option too. For example `GRANT CREATE TABLE ON test.* TO A WITH GRANT OPTION` now allows `A` to execute `GRANT CREATE VIEW ON test.* TO B`. [#38017](https://github.com/ClickHouse/ClickHouse/pull/38017) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement +* Use `clang-14` and LLVM infrastructure version 14 for builds. This closes [#34681](https://github.com/ClickHouse/ClickHouse/issues/34681). [#34754](https://github.com/ClickHouse/ClickHouse/pull/34754) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Note: `clang-14` has [a bug](https://github.com/google/sanitizers/issues/1540) in ThreadSanitizer that makes our CI work worse. +* Allow to drop privileges at startup. This simplifies Docker images. Closes [#36293](https://github.com/ClickHouse/ClickHouse/issues/36293). [#36341](https://github.com/ClickHouse/ClickHouse/pull/36341) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add docs spellcheck to CI. [#37790](https://github.com/ClickHouse/ClickHouse/pull/37790) ([Vladimir C](https://github.com/vdimir)). +* Fix overly aggressive stripping which removed the embedded hash required for checking the consistency of the executable. [#37993](https://github.com/ClickHouse/ClickHouse/pull/37993) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Bug Fix + +* Fix `SELECT ... INTERSECT` and `EXCEPT SELECT` statements with constant string types. [#37738](https://github.com/ClickHouse/ClickHouse/pull/37738) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `GROUP BY` `AggregateFunction` (i.e. you `GROUP BY` by the column that has `AggregateFunction` type). [#37093](https://github.com/ClickHouse/ClickHouse/pull/37093) ([Azat Khuzhin](https://github.com/azat)). +* (experimental WINDOW VIEW) Fix `addDependency` in WindowView. This bug can be reproduced like [#37237](https://github.com/ClickHouse/ClickHouse/issues/37237). [#37224](https://github.com/ClickHouse/ClickHouse/pull/37224) ([vxider](https://github.com/Vxider)). +* Fix inconsistency in ORDER BY ... WITH FILL feature. Query, containing ORDER BY ... WITH FILL, can generate extra rows when multiple WITH FILL columns are present. [#38074](https://github.com/ClickHouse/ClickHouse/pull/38074) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* This PR moving `addDependency` from constructor to `startup()` to avoid adding dependency to a *dropped* table, fix [#37237](https://github.com/ClickHouse/ClickHouse/issues/37237). [#37243](https://github.com/ClickHouse/ClickHouse/pull/37243) ([vxider](https://github.com/Vxider)). +* Fix inserting defaults for missing values in columnar formats. Previously missing columns were filled with defaults for types, not for columns. [#37253](https://github.com/ClickHouse/ClickHouse/pull/37253) ([Kruglov Pavel](https://github.com/Avogar)). +* (experimental Object type) Fix some cases of insertion nested arrays to columns of type `Object`. [#37305](https://github.com/ClickHouse/ClickHouse/pull/37305) ([Anton Popov](https://github.com/CurtizJ)). +* Fix unexpected errors with a clash of constant strings in aggregate function, prewhere and join. Close [#36891](https://github.com/ClickHouse/ClickHouse/issues/36891). [#37336](https://github.com/ClickHouse/ClickHouse/pull/37336) ([Vladimir C](https://github.com/vdimir)). +* Fix projections with GROUP/ORDER BY in query and optimize_aggregation_in_order (before the result was incorrect since only finish sorting was performed). [#37342](https://github.com/ClickHouse/ClickHouse/pull/37342) ([Azat Khuzhin](https://github.com/azat)). +* Fixed error with symbols in key name in S3. Fixes [#33009](https://github.com/ClickHouse/ClickHouse/issues/33009). [#37344](https://github.com/ClickHouse/ClickHouse/pull/37344) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Throw an exception when GROUPING SETS used with ROLLUP or CUBE. [#37367](https://github.com/ClickHouse/ClickHouse/pull/37367) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR in getMaxSourcePartsSizeForMerge during merges (in case of non standard, greater, values of `background_pool_size`/`background_merges_mutations_concurrency_ratio` has been specified in `config.xml` (new way) not in `users.xml` (deprecated way)). [#37413](https://github.com/ClickHouse/ClickHouse/pull/37413) ([Azat Khuzhin](https://github.com/azat)). +* Stop removing UTF-8 BOM in RowBinary format. [#37428](https://github.com/ClickHouse/ClickHouse/pull/37428) ([Paul Loyd](https://github.com/loyd)). [#37428](https://github.com/ClickHouse/ClickHouse/pull/37428) ([Paul Loyd](https://github.com/loyd)). +* clickhouse-keeper bugfix: fix force recovery for single node cluster. [#37440](https://github.com/ClickHouse/ClickHouse/pull/37440) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix logical error in normalizeUTF8 functions. Closes [#37298](https://github.com/ClickHouse/ClickHouse/issues/37298). [#37443](https://github.com/ClickHouse/ClickHouse/pull/37443) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix cast lowcard of nullable in JoinSwitcher, close [#37385](https://github.com/ClickHouse/ClickHouse/issues/37385). [#37453](https://github.com/ClickHouse/ClickHouse/pull/37453) ([Vladimir C](https://github.com/vdimir)). +* Fix named tuples output in ORC/Arrow/Parquet formats. [#37458](https://github.com/ClickHouse/ClickHouse/pull/37458) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix optimization of monotonous functions in ORDER BY clause in presence of GROUPING SETS. Fixes [#37401](https://github.com/ClickHouse/ClickHouse/issues/37401). [#37493](https://github.com/ClickHouse/ClickHouse/pull/37493) ([Dmitry Novik](https://github.com/novikd)). +* Fix error on joining with dictionary on some conditions. Close [#37386](https://github.com/ClickHouse/ClickHouse/issues/37386). [#37530](https://github.com/ClickHouse/ClickHouse/pull/37530) ([Vladimir C](https://github.com/vdimir)). +* Prohibit `optimize_aggregation_in_order` with `GROUPING SETS` (fixes `LOGICAL_ERROR`). [#37542](https://github.com/ClickHouse/ClickHouse/pull/37542) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong dump information of ActionsDAG. [#37587](https://github.com/ClickHouse/ClickHouse/pull/37587) ([zhanglistar](https://github.com/zhanglistar)). +* Fix converting types for UNION queries (may produce LOGICAL_ERROR). [#37593](https://github.com/ClickHouse/ClickHouse/pull/37593) ([Azat Khuzhin](https://github.com/azat)). +* Fix `WITH FILL` modifier with negative intervals in `STEP` clause. Fixes [#37514](https://github.com/ClickHouse/ClickHouse/issues/37514). [#37600](https://github.com/ClickHouse/ClickHouse/pull/37600) ([Anton Popov](https://github.com/CurtizJ)). +* Fix illegal joinGet array usage when ` join_use_nulls = 1`. This fixes [#37562](https://github.com/ClickHouse/ClickHouse/issues/37562) . [#37650](https://github.com/ClickHouse/ClickHouse/pull/37650) ([Amos Bird](https://github.com/amosbird)). +* Fix columns number mismatch in cross join, close [#37561](https://github.com/ClickHouse/ClickHouse/issues/37561). [#37653](https://github.com/ClickHouse/ClickHouse/pull/37653) ([Vladimir C](https://github.com/vdimir)). +* Fix segmentation fault in `show create table` from mysql database when it is configured with named collections. Closes [#37683](https://github.com/ClickHouse/ClickHouse/issues/37683). [#37690](https://github.com/ClickHouse/ClickHouse/pull/37690) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix RabbitMQ Storage not being able to startup on server restart if storage was create without SETTINGS clause. Closes [#37463](https://github.com/ClickHouse/ClickHouse/issues/37463). [#37691](https://github.com/ClickHouse/ClickHouse/pull/37691) ([Kseniia Sumarokova](https://github.com/kssenii)). +* SQL user defined functions disable CREATE/DROP in readonly mode. Closes [#37280](https://github.com/ClickHouse/ClickHouse/issues/37280). [#37699](https://github.com/ClickHouse/ClickHouse/pull/37699) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix formatting of Nullable arguments for executable user defined functions. Closes [#35897](https://github.com/ClickHouse/ClickHouse/issues/35897). [#37711](https://github.com/ClickHouse/ClickHouse/pull/37711) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix optimization enabled by setting `optimize_monotonous_functions_in_order_by` in distributed queries. Fixes [#36037](https://github.com/ClickHouse/ClickHouse/issues/36037). [#37724](https://github.com/ClickHouse/ClickHouse/pull/37724) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible logical error: `Invalid Field get from type UInt64 to type Float64` in `values` table function. Closes [#37602](https://github.com/ClickHouse/ClickHouse/issues/37602). [#37754](https://github.com/ClickHouse/ClickHouse/pull/37754) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible segfault in schema inference in case of exception in SchemaReader constructor. Closes [#37680](https://github.com/ClickHouse/ClickHouse/issues/37680). [#37760](https://github.com/ClickHouse/ClickHouse/pull/37760) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix setting cast_ipv4_ipv6_default_on_conversion_error for internal cast function. Closes [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#37761](https://github.com/ClickHouse/ClickHouse/pull/37761) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix toString error on DatatypeDate32. [#37775](https://github.com/ClickHouse/ClickHouse/pull/37775) ([LiuNeng](https://github.com/liuneng1994)). +* The clickhouse-keeper setting `dead_session_check_period_ms` was transformed into microseconds (multiplied by 1000), which lead to dead sessions only being cleaned up after several minutes (instead of 500ms). [#37824](https://github.com/ClickHouse/ClickHouse/pull/37824) ([Michael Lex](https://github.com/mlex)). +* Fix possible "No more packets are available" for distributed queries (in case of `async_socket_for_remote`/`use_hedged_requests` is disabled). [#37826](https://github.com/ClickHouse/ClickHouse/pull/37826) ([Azat Khuzhin](https://github.com/azat)). +* (experimental WINDOW VIEW) Do not drop the inner target table when executing `ALTER TABLE … MODIFY QUERY` in WindowView. [#37879](https://github.com/ClickHouse/ClickHouse/pull/37879) ([vxider](https://github.com/Vxider)). +* Fix directory ownership of coordination dir in clickhouse-keeper Docker image. Fixes [#37914](https://github.com/ClickHouse/ClickHouse/issues/37914). [#37915](https://github.com/ClickHouse/ClickHouse/pull/37915) ([James Maidment](https://github.com/jamesmaidment)). +* Dictionaries fix custom query with update field and `{condition}`. Closes [#33746](https://github.com/ClickHouse/ClickHouse/issues/33746). [#37947](https://github.com/ClickHouse/ClickHouse/pull/37947) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible incorrect result of `SELECT ... WITH FILL` in the case when `ORDER BY` should be applied after `WITH FILL` result (e.g. for outer query). Incorrect result was caused by optimization for `ORDER BY` expressions ([#35623](https://github.com/ClickHouse/ClickHouse/issues/35623)). Closes [#37904](https://github.com/ClickHouse/ClickHouse/issues/37904). [#37959](https://github.com/ClickHouse/ClickHouse/pull/37959) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* (experimental WINDOW VIEW) Add missing default columns when pushing to the target table in WindowView, fix [#37815](https://github.com/ClickHouse/ClickHouse/issues/37815). [#37965](https://github.com/ClickHouse/ClickHouse/pull/37965) ([vxider](https://github.com/Vxider)). +* Fixed too large stack frame that would cause compilation to fail. [#37996](https://github.com/ClickHouse/ClickHouse/pull/37996) ([Han Shukai](https://github.com/KinderRiven)). +* When open enable_filesystem_query_cache_limit, throw Reserved cache size exceeds the remaining cache size. [#38004](https://github.com/ClickHouse/ClickHouse/pull/38004) ([xiedeyantu](https://github.com/xiedeyantu)). +* Fix converting types for UNION queries (may produce LOGICAL_ERROR). [#34775](https://github.com/ClickHouse/ClickHouse/pull/34775) ([Azat Khuzhin](https://github.com/azat)). +* TTL merge may not be scheduled again if BackgroundExecutor is busy. --merges_with_ttl_counter is increased in selectPartsToMerge() --merge task will be ignored if BackgroundExecutor is busy --merges_with_ttl_counter will not be decrease. [#36387](https://github.com/ClickHouse/ClickHouse/pull/36387) ([lthaooo](https://github.com/lthaooo)). +* Fix overridden settings value of `normalize_function_names`. [#36937](https://github.com/ClickHouse/ClickHouse/pull/36937) ([李扬](https://github.com/taiyang-li)). +* Fix for exponential time decaying window functions. Now respecting boundaries of the window. [#36944](https://github.com/ClickHouse/ClickHouse/pull/36944) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix possible heap-use-after-free error when reading system.projection_parts and system.projection_parts_columns . This fixes [#37184](https://github.com/ClickHouse/ClickHouse/issues/37184). [#37185](https://github.com/ClickHouse/ClickHouse/pull/37185) ([Amos Bird](https://github.com/amosbird)). +* Fixed `DateTime64` fractional seconds behavior prior to Unix epoch. [#37697](https://github.com/ClickHouse/ClickHouse/pull/37697) ([Andrey Zvonov](https://github.com/zvonand)). [#37039](https://github.com/ClickHouse/ClickHouse/pull/37039) ([李扬](https://github.com/taiyang-li)). + +### ClickHouse release 22.5, 2022-05-19 + +#### Upgrade Notes + +* Now, background merges, mutations and `OPTIMIZE` will not increment `SelectedRows` and `SelectedBytes` metrics. They (still) will increment `MergedRows` and `MergedUncompressedBytes` as it was before. This only affects the metric values, and makes them better. This change does not introduce any incompatibility, but you may wonder about the changes of metrics, so we put in this category. [#37040](https://github.com/ClickHouse/ClickHouse/pull/37040) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Updated the BoringSSL module to the official FIPS compliant version. This makes ClickHouse FIPS compliant. [#35914](https://github.com/ClickHouse/ClickHouse/pull/35914) ([Meena-Renganathan](https://github.com/Meena-Renganathan)). The ciphers `aes-192-cfb128` and `aes-256-cfb128` were removed, because they are not included in the FIPS certified version of BoringSSL. +* `max_memory_usage` setting is removed from the default user profile in `users.xml`. This enables flexible memory limits for queries instead of the old rigid limit of 10 GB. +* Disable `log_query_threads` setting by default. It controls the logging of statistics about every thread participating in query execution. After supporting asynchronous reads, the total number of distinct thread ids became too large, and logging into the `query_thread_log` has become too heavy. [#37077](https://github.com/ClickHouse/ClickHouse/pull/37077) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove function `groupArraySorted` which has a bug. [#36822](https://github.com/ClickHouse/ClickHouse/pull/36822) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Enable memory overcommit by default. [#35921](https://github.com/ClickHouse/ClickHouse/pull/35921) ([Dmitry Novik](https://github.com/novikd)). +* Add support of GROUPING SETS in GROUP BY clause. This implementation supports a parallel processing of grouping sets. [#33631](https://github.com/ClickHouse/ClickHouse/pull/33631) ([Dmitry Novik](https://github.com/novikd)). +* Added `system.certificates` table. [#37142](https://github.com/ClickHouse/ClickHouse/pull/37142) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Adds `h3Line`, `h3Distance` and `h3HexRing` functions. [#37030](https://github.com/ClickHouse/ClickHouse/pull/37030) ([Bharat Nallan](https://github.com/bharatnc)). +* New single binary based diagnostics tool (clickhouse-diagnostics). [#36705](https://github.com/ClickHouse/ClickHouse/pull/36705) ([Dale McDiarmid](https://github.com/gingerwizard)). +* Add output format `Prometheus` [#36051](https://github.com/ClickHouse/ClickHouse/issues/36051). [#36206](https://github.com/ClickHouse/ClickHouse/pull/36206) ([Vladimir C](https://github.com/vdimir)). +* Add `MySQLDump` input format. It reads all data from INSERT queries belonging to one table in dump. If there are more than one table, by default it reads data from the first one. [#36667](https://github.com/ClickHouse/ClickHouse/pull/36667) ([Kruglov Pavel](https://github.com/Avogar)). +* Show the `total_rows` and `total_bytes` fields in `system.tables` for temporary tables. [#36401](https://github.com/ClickHouse/ClickHouse/issues/36401). [#36439](https://github.com/ClickHouse/ClickHouse/pull/36439) ([xiedeyantu](https://github.com/xiedeyantu)). +* Allow to override `parts_to_delay_insert` and `parts_to_throw_insert` with query-level settings. If they are defined, they will override table-level settings. [#36371](https://github.com/ClickHouse/ClickHouse/pull/36371) ([Memo](https://github.com/Joeywzr)). + +#### Experimental Feature + +* Implemented L1, L2, Linf, Cosine distance functions for arrays and L1, L2, Linf norm functions for arrays. + [#37033](https://github.com/ClickHouse/ClickHouse/pull/37033) ([qieqieplus](https://github.com/qieqieplus)). Caveat: the functions will be renamed. +* Improve the `WATCH` query in WindowView: 1. Reduce the latency of providing query results by calling the `fire_condition` signal. 2. Makes the cancel query operation(ctrl-c) faster, by checking `isCancelled()` more frequently. [#37226](https://github.com/ClickHouse/ClickHouse/pull/37226) ([vxider](https://github.com/Vxider)). +* Introspection for remove filesystem cache. [#36802](https://github.com/ClickHouse/ClickHouse/pull/36802) ([Han Shukai](https://github.com/KinderRiven)). +* Added new hash function `wyHash64` for SQL. [#36467](https://github.com/ClickHouse/ClickHouse/pull/36467) ([olevino](https://github.com/olevino)). +* Improvement for replicated databases: Added `SYSTEM SYNC DATABASE REPLICA` query which allows to sync tables metadata inside Replicated database, because currently synchronisation is asynchronous. [#35944](https://github.com/ClickHouse/ClickHouse/pull/35944) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Improvement for remote filesystem cache: Better read from cache. [#37054](https://github.com/ClickHouse/ClickHouse/pull/37054) ([Kseniia Sumarokova](https://github.com/kssenii)). Improve `SYSTEM DROP FILESYSTEM CACHE` query: `` option and `FORCE` option. [#36639](https://github.com/ClickHouse/ClickHouse/pull/36639) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improvement for semistructured data: Allow to cast columns of type `Object(...)` to `Object(Nullable(...))`. [#36564](https://github.com/ClickHouse/ClickHouse/pull/36564) ([awakeljw](https://github.com/awakeljw)). +* Improvement for parallel replicas: We create a local interpreter if we want to execute query on localhost replica. But for when executing query on multiple replicas we rely on the fact that a connection exists so replicas can talk to coordinator. It is now improved and localhost replica can talk to coordinator directly in the same process. [#36281](https://github.com/ClickHouse/ClickHouse/pull/36281) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Performance Improvement + +* Improve performance of `avg`, `sum` aggregate functions if used without GROUP BY expression. [#37257](https://github.com/ClickHouse/ClickHouse/pull/37257) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of unary arithmetic functions (`bitCount`, `bitNot`, `abs`, `intExp2`, `intExp10`, `negate`, `roundAge`, `roundDuration`, `roundToExp2`, `sign`) using dynamic dispatch. [#37289](https://github.com/ClickHouse/ClickHouse/pull/37289) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of ORDER BY, MergeJoin, insertion into MergeTree using JIT compilation of sort columns comparator. [#34469](https://github.com/ClickHouse/ClickHouse/pull/34469) ([Maksim Kita](https://github.com/kitaisreal)). +* Change structure of `system.asynchronous_metric_log`. It will take about 10 times less space. This closes [#36357](https://github.com/ClickHouse/ClickHouse/issues/36357). The field `event_time_microseconds` was removed, because it is useless. [#36360](https://github.com/ClickHouse/ClickHouse/pull/36360) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Load marks for only necessary columns when reading wide parts. [#36879](https://github.com/ClickHouse/ClickHouse/pull/36879) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improves performance of file descriptor cache by narrowing mutex scopes. [#36682](https://github.com/ClickHouse/ClickHouse/pull/36682) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improve performance of reading from storage `File` and table functions `file` in case when path has globs and matched directory contains large number of files. [#36647](https://github.com/ClickHouse/ClickHouse/pull/36647) ([Anton Popov](https://github.com/CurtizJ)). +* Apply parallel parsing for input format `HiveText`, which can speed up HiveText parsing by 2x when reading local file. [#36650](https://github.com/ClickHouse/ClickHouse/pull/36650) ([李扬](https://github.com/taiyang-li)). +* The default `HashJoin` is not thread safe for inserting right table's rows and run it in a single thread. When the right table is large, the join process is too slow with low cpu utilization. [#36415](https://github.com/ClickHouse/ClickHouse/pull/36415) ([lgbo](https://github.com/lgbo-ustc)). +* Allow to rewrite `select countDistinct(a) from t` to `select count(1) from (select a from t groupBy a)`. [#35993](https://github.com/ClickHouse/ClickHouse/pull/35993) ([zhanglistar](https://github.com/zhanglistar)). +* Transform OR LIKE chain to multiMatchAny. Will enable once we have more confidence it works. [#34932](https://github.com/ClickHouse/ClickHouse/pull/34932) ([Daniel Kutenin](https://github.com/danlark1)). +* Improve performance of some functions with inlining. [#34544](https://github.com/ClickHouse/ClickHouse/pull/34544) ([Daniel Kutenin](https://github.com/danlark1)). +* Add a branch to avoid unnecessary memcpy in readBig. It improves performance somewhat. [#36095](https://github.com/ClickHouse/ClickHouse/pull/36095) ([jasperzhu](https://github.com/jinjunzh)). +* Implement partial GROUP BY key for optimize_aggregation_in_order. [#35111](https://github.com/ClickHouse/ClickHouse/pull/35111) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Show names of erroneous files in case of parsing errors while executing table functions `file`, `s3` and `url`. [#36314](https://github.com/ClickHouse/ClickHouse/pull/36314) ([Anton Popov](https://github.com/CurtizJ)). +* Allowed to increase the number of threads for executing background operations (merges, mutations, moves and fetches) at runtime if they are specified at top level config. [#36425](https://github.com/ClickHouse/ClickHouse/pull/36425) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now date time conversion functions that generates time before 1970-01-01 00:00:00 with partial hours/minutes timezones will be saturated to zero instead of overflow. This is the continuation of https://github.com/ClickHouse/ClickHouse/pull/29953 which addresses https://github.com/ClickHouse/ClickHouse/pull/29953#discussion_r800550280 . Mark as improvement because it's implementation defined behavior (and very rare case) and we are allowed to break it. [#36656](https://github.com/ClickHouse/ClickHouse/pull/36656) ([Amos Bird](https://github.com/amosbird)). +* Add a warning if someone running clickhouse-server with log level "test". The log level "test" was added recently and cannot be used in production due to inevitable, unavoidable, fatal and life-threatening performance degradation. [#36824](https://github.com/ClickHouse/ClickHouse/pull/36824) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Parse collations in CREATE TABLE, throw exception or ignore. closes [#35892](https://github.com/ClickHouse/ClickHouse/issues/35892). [#36271](https://github.com/ClickHouse/ClickHouse/pull/36271) ([yuuch](https://github.com/yuuch)). +* Option `compatibility_ignore_auto_increment_in_create_table` allows ignoring `AUTO_INCREMENT` keyword in a column declaration to simplify migration from MySQL. [#37178](https://github.com/ClickHouse/ClickHouse/pull/37178) ([Igor Nikonov](https://github.com/devcrafter)). +* Add aliases `JSONLines` and `NDJSON` for `JSONEachRow`. Closes [#36303](https://github.com/ClickHouse/ClickHouse/issues/36303). [#36327](https://github.com/ClickHouse/ClickHouse/pull/36327) ([flynn](https://github.com/ucasfl)). +* Limit the max partitions could be queried for each hive table. Avoid resource overruns. [#37281](https://github.com/ClickHouse/ClickHouse/pull/37281) ([lgbo](https://github.com/lgbo-ustc)). +* Added implicit cast for `h3kRing` function second argument to improve usability. Closes [#35432](https://github.com/ClickHouse/ClickHouse/issues/35432). [#37189](https://github.com/ClickHouse/ClickHouse/pull/37189) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix progress indication for `INSERT SELECT` in `clickhouse-local` for any query and for file progress in client, more correct file progress. [#37075](https://github.com/ClickHouse/ClickHouse/pull/37075) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug which can lead to forgotten outdated parts in MergeTree table engines family in case of filesystem failures during parts removal. Before fix they will be removed only after first server restart. [#37014](https://github.com/ClickHouse/ClickHouse/pull/37014) ([alesapin](https://github.com/alesapin)). +* Implemented a new mode of handling row policies which can be enabled in the main configuration which enables users without permissive row policies to read rows. [#36997](https://github.com/ClickHouse/ClickHouse/pull/36997) ([Vitaly Baranov](https://github.com/vitlibar)). +* Play UI: Nullable numbers will be aligned to the right in table cells. This closes [#36982](https://github.com/ClickHouse/ClickHouse/issues/36982). [#36988](https://github.com/ClickHouse/ClickHouse/pull/36988) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: If there is one row in result and more than a few columns, display the result vertically. Continuation of [#36811](https://github.com/ClickHouse/ClickHouse/issues/36811). [#36842](https://github.com/ClickHouse/ClickHouse/pull/36842) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Cleanup CSS in Play UI. The pixels are more evenly placed. Better usability for long content in table cells. [#36569](https://github.com/ClickHouse/ClickHouse/pull/36569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Finalize write buffers in case of exception to avoid doing it in destructors. Hope it fixes: [#36907](https://github.com/ClickHouse/ClickHouse/issues/36907). [#36979](https://github.com/ClickHouse/ClickHouse/pull/36979) ([Kruglov Pavel](https://github.com/Avogar)). +* After [#36425](https://github.com/ClickHouse/ClickHouse/issues/36425) settings like `background_fetches_pool_size` became obsolete and can appear in top level config, but clickhouse throws and exception like `Error updating configuration from '/etc/clickhouse-server/config.xml' config.: Code: 137. DB::Exception: A setting 'background_fetches_pool_size' appeared at top level in config /etc/clickhouse-server/config.xml.` This is fixed. [#36917](https://github.com/ClickHouse/ClickHouse/pull/36917) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add extra diagnostic info (if applicable) when sending exception to other server. [#36872](https://github.com/ClickHouse/ClickHouse/pull/36872) ([tavplubix](https://github.com/tavplubix)). +* Allow to execute hash functions with arguments of type `Array(Tuple(..))`. [#36812](https://github.com/ClickHouse/ClickHouse/pull/36812) ([Anton Popov](https://github.com/CurtizJ)). +* Added `user_defined_path` config setting. [#36753](https://github.com/ClickHouse/ClickHouse/pull/36753) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow cluster macro in `s3Cluster` table function. [#36726](https://github.com/ClickHouse/ClickHouse/pull/36726) ([Vadim Volodin](https://github.com/PolyProgrammist)). +* Properly cancel INSERT queries in `clickhouse-client`/`clickhouse-local`. [#36710](https://github.com/ClickHouse/ClickHouse/pull/36710) ([Azat Khuzhin](https://github.com/azat)). +* Allow to cancel a query while still keeping a decent query id in `MySQLHandler`. [#36699](https://github.com/ClickHouse/ClickHouse/pull/36699) ([Amos Bird](https://github.com/amosbird)). +* Add `is_all_data_sent` column into `system.processes`, and improve internal testing hardening check based on it. [#36649](https://github.com/ClickHouse/ClickHouse/pull/36649) ([Azat Khuzhin](https://github.com/azat)). +* The metrics about time spent reading from s3 now calculated correctly. Close [#35483](https://github.com/ClickHouse/ClickHouse/issues/35483). [#36572](https://github.com/ClickHouse/ClickHouse/pull/36572) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow file descriptors in table function file if it is run in clickhouse-local. [#36562](https://github.com/ClickHouse/ClickHouse/pull/36562) ([wuxiaobai24](https://github.com/wuxiaobai24)). +* Allow names of tuple elements that start from digits. [#36544](https://github.com/ClickHouse/ClickHouse/pull/36544) ([Anton Popov](https://github.com/CurtizJ)). +* Now clickhouse-benchmark can read authentication info from environment variables. [#36497](https://github.com/ClickHouse/ClickHouse/pull/36497) ([Anton Kozlov](https://github.com/tonickkozlov)). +* `clickhouse-keeper` improvement: add support for force recovery which allows you to reconfigure cluster without quorum. [#36258](https://github.com/ClickHouse/ClickHouse/pull/36258) ([Antonio Andelic](https://github.com/antonio2368)). +* Improve schema inference for JSON objects. [#36207](https://github.com/ClickHouse/ClickHouse/pull/36207) ([Kruglov Pavel](https://github.com/Avogar)). +* Refactor code around schema inference with globs. Try next file from glob only if it makes sense (previously we tried next file in case of any error). Also it fixes [#36317](https://github.com/ClickHouse/ClickHouse/issues/36317). [#36205](https://github.com/ClickHouse/ClickHouse/pull/36205) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a separate `CLUSTER` grant (and `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive, for backward compatibility, default to `false`). [#35767](https://github.com/ClickHouse/ClickHouse/pull/35767) ([Azat Khuzhin](https://github.com/azat)). +* If the required amount of memory is available before the selected query stopped, all waiting queries continue execution. Now we don't stop any query if memory is freed before the moment when the selected query knows about the cancellation. [#35637](https://github.com/ClickHouse/ClickHouse/pull/35637) ([Dmitry Novik](https://github.com/novikd)). +* Nullables detection in protobuf. In proto3, default values are not sent on the wire. This makes it non-trivial to distinguish between null and default values for Nullable columns. A standard way to deal with this problem is to use Google wrappers to nest the target value within an inner message (see https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto). In this case, a missing field is interpreted as null value, a field with missing value if interpreted as default value, and a field with regular value is interpreted as regular value. However, ClickHouse interprets Google wrappers as nested columns. We propose to introduce special behaviour to detect Google wrappers and interpret them like in the description above. For example, to serialize values for a Nullable column `test`, we would use `google.protobuf.StringValue test` in our .proto schema. Note that these types are so called "well-known types" in Protobuf, implemented in the library itself. [#35149](https://github.com/ClickHouse/ClickHouse/pull/35149) ([Jakub Kuklis](https://github.com/jkuklis)). +* Added support for specifying `content_type` in predefined and static HTTP handler config. [#34916](https://github.com/ClickHouse/ClickHouse/pull/34916) ([Roman Nikonov](https://github.com/nic11)). +* Warn properly if use clickhouse-client --file without preceeding --external. Close [#34747](https://github.com/ClickHouse/ClickHouse/issues/34747). [#34765](https://github.com/ClickHouse/ClickHouse/pull/34765) ([李扬](https://github.com/taiyang-li)). +* Improve MySQL database engine to compatible with binary(0) dataType. [#37232](https://github.com/ClickHouse/ClickHouse/pull/37232) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve JSON report of clickhouse-benchmark. [#36473](https://github.com/ClickHouse/ClickHouse/pull/36473) ([Tian Xinhui](https://github.com/xinhuitian)). +* Server might refuse to start if it cannot resolve hostname of external ClickHouse dictionary. It's fixed. Fixes [#36451](https://github.com/ClickHouse/ClickHouse/issues/36451). [#36463](https://github.com/ClickHouse/ClickHouse/pull/36463) ([tavplubix](https://github.com/tavplubix)). + +#### Build/Testing/Packaging Improvement + +* Now `clickhouse-keeper` for the `x86_64` architecture is statically linked with [musl](https://musl.libc.org/) and doesn't depend on any system libraries. [#31833](https://github.com/ClickHouse/ClickHouse/pull/31833) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse builds for `PowerPC64LE` architecture are now available in universal installation script `curl https://clickhouse.com/ | sh` and by direct link `https://builds.clickhouse.com/master/powerpc64le/clickhouse`. [#37095](https://github.com/ClickHouse/ClickHouse/pull/37095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Limit PowerPC code generation to Power8 for better compatibility. This closes [#36025](https://github.com/ClickHouse/ClickHouse/issues/36025). [#36529](https://github.com/ClickHouse/ClickHouse/pull/36529) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Simplify performance test. This will give a chance for us to use it. [#36769](https://github.com/ClickHouse/ClickHouse/pull/36769) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fail performance comparison on errors in the report. [#34797](https://github.com/ClickHouse/ClickHouse/pull/34797) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add ZSTD support for Arrow. This fixes [#35283](https://github.com/ClickHouse/ClickHouse/issues/35283). [#35486](https://github.com/ClickHouse/ClickHouse/pull/35486) ([Sean Lafferty](https://github.com/seanlaff)). + +#### Bug Fix + +* Extracts Version ID if present from the URI and adds a request to the AWS HTTP URI. Closes [#31221](https://github.com/ClickHouse/ClickHouse/issues/31221). - [x] Extract `Version ID` from URI if present and reassemble without it. - [x] Configure `AWS HTTP URI` object with request. - [x] Unit Tests: [`gtest_s3_uri`](https://github.com/ClickHouse/ClickHouse/blob/2340a6c6849ebc05a8efbf97ba8de3ff9dc0eff4/src/IO/tests/gtest_s3_uri.cpp) - [x] Drop instrumentation commit. [#34571](https://github.com/ClickHouse/ClickHouse/pull/34571) ([Saad Ur Rahman](https://github.com/surahman)). +* Fix system.opentelemetry_span_log attribute.values alias to values instead of keys. [#37275](https://github.com/ClickHouse/ClickHouse/pull/37275) ([Aleksandr Razumov](https://github.com/ernado)). +* Fix Nullable(String) to Nullable(Bool/IPv4/IPv6) conversion Closes [#37221](https://github.com/ClickHouse/ClickHouse/issues/37221). [#37270](https://github.com/ClickHouse/ClickHouse/pull/37270) ([Kruglov Pavel](https://github.com/Avogar)). +* Experimental feature: Fix execution of mutations in tables, in which there exist columns of type `Object`. Using subcolumns of type `Object` in `WHERE` expression of `UPDATE` or `DELETE` queries is now allowed yet, as well as manipulating (`DROP`, `MODIFY`) of separate subcolumns. Fixes [#37205](https://github.com/ClickHouse/ClickHouse/issues/37205). [#37266](https://github.com/ClickHouse/ClickHouse/pull/37266) ([Anton Popov](https://github.com/CurtizJ)). +* Kafka does not need `group.id` on producer stage. In console log you can find Warning that describe this issue: ``` 2022.05.15 17:59:13.270227 [ 137 ] {} StorageKafka (topic-name): [rdk:CONFWARN] [thrd:app]: Configuration property group.id is a consumer property and will be ignored by this producer instance ```. [#37228](https://github.com/ClickHouse/ClickHouse/pull/37228) ([Mark Andreev](https://github.com/mrk-andreev)). +* Experimental feature (WindowView): Update `max_fired_watermark ` after blocks actually fired, in case delete data that hasn't been fired yet. [#37225](https://github.com/ClickHouse/ClickHouse/pull/37225) ([vxider](https://github.com/Vxider)). +* Fix "Cannot create column of type Set" for distributed queries with LIMIT BY. [#37193](https://github.com/ClickHouse/ClickHouse/pull/37193) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: Now WindowView `WATCH EVENTS` query will not be terminated due to the nonempty Chunk created in `WindowViewSource.h:58`. [#37182](https://github.com/ClickHouse/ClickHouse/pull/37182) ([vxider](https://github.com/Vxider)). +* Enable `enable_global_with_statement` for subqueries, close [#37141](https://github.com/ClickHouse/ClickHouse/issues/37141). [#37166](https://github.com/ClickHouse/ClickHouse/pull/37166) ([Vladimir C](https://github.com/vdimir)). +* Fix implicit cast for optimize_skip_unused_shards_rewrite_in. [#37153](https://github.com/ClickHouse/ClickHouse/pull/37153) ([Azat Khuzhin](https://github.com/azat)). +* The ILIKE function on FixedString columns could have returned wrong results (i.e. match less than it should). [#37117](https://github.com/ClickHouse/ClickHouse/pull/37117) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix `GROUP BY` `AggregateFunction` (i.e. you `GROUP BY` by the column that has `AggregateFunction` type). [#37093](https://github.com/ClickHouse/ClickHouse/pull/37093) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: Fix optimize_aggregation_in_order with prefix GROUP BY and *Array aggregate functions. [#37050](https://github.com/ClickHouse/ClickHouse/pull/37050) ([Azat Khuzhin](https://github.com/azat)). +* Fixed performance degradation of some INSERT SELECT queries with implicit aggregation. Fixes [#36792](https://github.com/ClickHouse/ClickHouse/issues/36792). [#37047](https://github.com/ClickHouse/ClickHouse/pull/37047) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix in-order `GROUP BY` (`optimize_aggregation_in_order=1`) with `*Array` (`groupArrayArray`/...) aggregate functions. [#37046](https://github.com/ClickHouse/ClickHouse/pull/37046) ([Azat Khuzhin](https://github.com/azat)). +* Fix LowCardinality->ArrowDictionary invalid output when type of indexes is not UInt8. Closes [#36832](https://github.com/ClickHouse/ClickHouse/issues/36832). [#37043](https://github.com/ClickHouse/ClickHouse/pull/37043) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed problem with infs in `quantileTDigest`. Fixes [#32107](https://github.com/ClickHouse/ClickHouse/issues/32107). [#37021](https://github.com/ClickHouse/ClickHouse/pull/37021) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix sending external tables data in HedgedConnections with max_parallel_replicas != 1. [#36981](https://github.com/ClickHouse/ClickHouse/pull/36981) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed logical error on `TRUNCATE` query in `Replicated` database. Fixes [#33747](https://github.com/ClickHouse/ClickHouse/issues/33747). [#36976](https://github.com/ClickHouse/ClickHouse/pull/36976) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix stuck when dropping source table in WindowView. Closes [#35678](https://github.com/ClickHouse/ClickHouse/issues/35678). [#36967](https://github.com/ClickHouse/ClickHouse/pull/36967) ([vxider](https://github.com/Vxider)). +* Experimental feature (rocksdb cache): Fix issue: [#36671](https://github.com/ClickHouse/ClickHouse/issues/36671). [#36929](https://github.com/ClickHouse/ClickHouse/pull/36929) ([李扬](https://github.com/taiyang-li)). +* Experimental feature: Fix bugs when using multiple columns in WindowView by adding converting actions to make it possible to call`writeIntoWindowView` with a slightly different schema. [#36928](https://github.com/ClickHouse/ClickHouse/pull/36928) ([vxider](https://github.com/Vxider)). +* Fix bug in clickhouse-keeper which can lead to corrupted compressed log files in case of small load and restarts. [#36910](https://github.com/ClickHouse/ClickHouse/pull/36910) ([alesapin](https://github.com/alesapin)). +* Fix incorrect query result when doing constant aggregation. This fixes [#36728](https://github.com/ClickHouse/ClickHouse/issues/36728) . [#36888](https://github.com/ClickHouse/ClickHouse/pull/36888) ([Amos Bird](https://github.com/amosbird)). +* Experimental feature: Fix `current_size` count in cache. [#36887](https://github.com/ClickHouse/ClickHouse/pull/36887) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature: Fix fire in window view with hop window [#34044](https://github.com/ClickHouse/ClickHouse/issues/34044). [#36861](https://github.com/ClickHouse/ClickHouse/pull/36861) ([vxider](https://github.com/Vxider)). +* Experimental feature: Fix incorrect cast in cached buffer from remote fs. [#36809](https://github.com/ClickHouse/ClickHouse/pull/36809) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix creation of tables with `flatten_nested = 0`. Previously unflattened `Nested` columns could be flattened after server restart. [#36803](https://github.com/ClickHouse/ClickHouse/pull/36803) ([Anton Popov](https://github.com/CurtizJ)). +* Fix some issues with async reads from remote filesystem which happened when reading low cardinality. [#36763](https://github.com/ClickHouse/ClickHouse/pull/36763) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature: Fix insertion to columns of type `Object` from multiple files, e.g. via table function `file` with globs. [#36762](https://github.com/ClickHouse/ClickHouse/pull/36762) ([Anton Popov](https://github.com/CurtizJ)). +* Fix timeouts in Hedged requests. Connection hang right after sending remote query could lead to eternal waiting. [#36749](https://github.com/ClickHouse/ClickHouse/pull/36749) ([Kruglov Pavel](https://github.com/Avogar)). +* Experimental feature: Fix a bug of `groupBitmapAndState`/`groupBitmapOrState`/`groupBitmapXorState` on distributed table. [#36739](https://github.com/ClickHouse/ClickHouse/pull/36739) ([Zhang Yifan](https://github.com/zhangyifan27)). +* Experimental feature: During the [test](https://s3.amazonaws.com/clickhouse-test-reports/36376/1cb1c7275cb53769ab826772db9b71361bb3e413/stress_test__thread__actions_/clickhouse-server.clean.log) in [PR](https://github.com/ClickHouse/ClickHouse/pull/36376), I found that the one cache class was initialized twice, it throws a exception. Although the cause of this problem is not clear, there should be code logic of repeatedly loading disk in ClickHouse, so we need to make special judgment for this situation. [#36737](https://github.com/ClickHouse/ClickHouse/pull/36737) ([Han Shukai](https://github.com/KinderRiven)). +* Fix vertical merges in wide parts. Previously an exception `There is no column` can be thrown during merge. [#36707](https://github.com/ClickHouse/ClickHouse/pull/36707) ([Anton Popov](https://github.com/CurtizJ)). +* Fix server reload on port change (do not wait for current connections from query context). [#36700](https://github.com/ClickHouse/ClickHouse/pull/36700) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: In the previous [PR](https://github.com/ClickHouse/ClickHouse/pull/36376), I found that testing (stateless tests, flaky check (address, actions)) is timeout. Moreover, testing locally can also trigger unstable system deadlocks. This problem still exists when using the latest source code of master. [#36697](https://github.com/ClickHouse/ClickHouse/pull/36697) ([Han Shukai](https://github.com/KinderRiven)). +* Experimental feature: Fix server restart if cache configuration changed. [#36685](https://github.com/ClickHouse/ClickHouse/pull/36685) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible heap-use-after-free in schema inference. Closes [#36661](https://github.com/ClickHouse/ClickHouse/issues/36661). [#36679](https://github.com/ClickHouse/ClickHouse/pull/36679) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed parsing of query settings in `CREATE` query when engine is not specified. Fixes https://github.com/ClickHouse/ClickHouse/pull/34187#issuecomment-1103812419. [#36642](https://github.com/ClickHouse/ClickHouse/pull/36642) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix merges of wide parts with type `Object`. [#36637](https://github.com/ClickHouse/ClickHouse/pull/36637) ([Anton Popov](https://github.com/CurtizJ)). +* Fix format crash when default expression follow EPHEMERAL not literal. Closes [#36618](https://github.com/ClickHouse/ClickHouse/issues/36618). [#36633](https://github.com/ClickHouse/ClickHouse/pull/36633) ([flynn](https://github.com/ucasfl)). +* Fix `Missing column` exception which could happen while using `INTERPOLATE` with `ENGINE = MergeTree` table. [#36549](https://github.com/ClickHouse/ClickHouse/pull/36549) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix potential error with literals in `WHERE` for join queries. Close [#36279](https://github.com/ClickHouse/ClickHouse/issues/36279). [#36542](https://github.com/ClickHouse/ClickHouse/pull/36542) ([Vladimir C](https://github.com/vdimir)). +* Fix offset update ReadBufferFromEncryptedFile, which could cause undefined behaviour. [#36493](https://github.com/ClickHouse/ClickHouse/pull/36493) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix hostname sanity checks for Keeper cluster configuration. Add `keeper_server.host_checks_enabled` config to enable/disable those checks. [#36492](https://github.com/ClickHouse/ClickHouse/pull/36492) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix usage of executable user defined functions in GROUP BY. Before executable user defined functions cannot be used as expressions in GROUP BY. Closes [#36448](https://github.com/ClickHouse/ClickHouse/issues/36448). [#36486](https://github.com/ClickHouse/ClickHouse/pull/36486) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible exception with unknown packet from server in client. [#36481](https://github.com/ClickHouse/ClickHouse/pull/36481) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature (please never use `system.session_log`, it is going to be removed): Add missing enum values in system.session_log table. Closes [#36474](https://github.com/ClickHouse/ClickHouse/issues/36474). [#36480](https://github.com/ClickHouse/ClickHouse/pull/36480) ([Memo](https://github.com/Joeywzr)). +* Fix bug in s3Cluster schema inference that let to the fact that not all data was read in the select from s3Cluster. The bug appeared in https://github.com/ClickHouse/ClickHouse/pull/35544. [#36434](https://github.com/ClickHouse/ClickHouse/pull/36434) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix nullptr dereference in JOIN and COLUMNS matcher. This fixes [#36416](https://github.com/ClickHouse/ClickHouse/issues/36416). This is for https://github.com/ClickHouse/ClickHouse/pull/36417. [#36430](https://github.com/ClickHouse/ClickHouse/pull/36430) ([Amos Bird](https://github.com/amosbird)). +* Fix dictionary reload for `ClickHouseDictionarySource` if it contains scalar subqueries. [#36390](https://github.com/ClickHouse/ClickHouse/pull/36390) ([lthaooo](https://github.com/lthaooo)). +* Fix assertion in JOIN, close [#36199](https://github.com/ClickHouse/ClickHouse/issues/36199). [#36201](https://github.com/ClickHouse/ClickHouse/pull/36201) ([Vladimir C](https://github.com/vdimir)). +* Queries with aliases inside special operators returned parsing error (was broken in 22.1). Example: `SELECT substring('test' AS t, 1, 1)`. [#36167](https://github.com/ClickHouse/ClickHouse/pull/36167) ([Maksim Kita](https://github.com/kitaisreal)). +* Experimental feature: Fix insertion of complex JSONs with nested arrays to columns of type `Object`. [#36077](https://github.com/ClickHouse/ClickHouse/pull/36077) ([Anton Popov](https://github.com/CurtizJ)). +* Fix ALTER DROP COLUMN of nested column with compact parts (i.e. `ALTER TABLE x DROP COLUMN n`, when there is column `n.d`). [#35797](https://github.com/ClickHouse/ClickHouse/pull/35797) ([Azat Khuzhin](https://github.com/azat)). +* Fix substring function range error length when `offset` and `length` is negative constant and `s` is not constant. [#33861](https://github.com/ClickHouse/ClickHouse/pull/33861) ([RogerYK](https://github.com/RogerYK)). + + +### ClickHouse release 22.4, 2022-04-19 + +#### Backward Incompatible Change + +* Do not allow SETTINGS after FORMAT for INSERT queries (there is compatibility setting `allow_settings_after_format_in_insert` to accept such queries, but it is turned OFF by default). [#35883](https://github.com/ClickHouse/ClickHouse/pull/35883) ([Azat Khuzhin](https://github.com/azat)). +* Function `yandexConsistentHash` (consistent hashing algorithm by Konstantin "kostik" Oblakov) is renamed to `kostikConsistentHash`. The old name is left as an alias for compatibility. Although this change is backward compatible, we may remove the alias in subsequent releases, that's why it's recommended to update the usages of this function in your apps. [#35553](https://github.com/ClickHouse/ClickHouse/pull/35553) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Added INTERPOLATE extension to the ORDER BY ... WITH FILL. Closes [#34903](https://github.com/ClickHouse/ClickHouse/issues/34903). [#35349](https://github.com/ClickHouse/ClickHouse/pull/35349) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Profiling on Processors level (under `log_processors_profiles` setting, ClickHouse will write time that processor spent during execution/waiting for data to `system.processors_profile_log` table). [#34355](https://github.com/ClickHouse/ClickHouse/pull/34355) ([Azat Khuzhin](https://github.com/azat)). +* Added functions makeDate(year, month, day), makeDate32(year, month, day). [#35628](https://github.com/ClickHouse/ClickHouse/pull/35628) ([Alexander Gololobov](https://github.com/davenger)). Implementation of makeDateTime() and makeDateTIme64(). [#35934](https://github.com/ClickHouse/ClickHouse/pull/35934) ([Alexander Gololobov](https://github.com/davenger)). +* Support new type of quota `WRITTEN BYTES` to limit amount of written bytes during insert queries. [#35736](https://github.com/ClickHouse/ClickHouse/pull/35736) ([Anton Popov](https://github.com/CurtizJ)). +* Added function `flattenTuple`. It receives nested named `Tuple` as an argument and returns a flatten `Tuple` which elements are the paths from the original `Tuple`. E.g.: `Tuple(a Int, Tuple(b Int, c Int)) -> Tuple(a Int, b Int, c Int)`. `flattenTuple` can be used to select all paths from type `Object` as separate columns. [#35690](https://github.com/ClickHouse/ClickHouse/pull/35690) ([Anton Popov](https://github.com/CurtizJ)). +* Added functions `arrayFirstOrNull`, `arrayLastOrNull`. Closes [#35238](https://github.com/ClickHouse/ClickHouse/issues/35238). [#35414](https://github.com/ClickHouse/ClickHouse/pull/35414) ([Maksim Kita](https://github.com/kitaisreal)). +* Added functions `minSampleSizeContinous` and `minSampleSizeConversion`. Author [achimbab](https://github.com/achimbab). [#35360](https://github.com/ClickHouse/ClickHouse/pull/35360) ([Maksim Kita](https://github.com/kitaisreal)). +* New functions minSampleSizeContinous and minSampleSizeConversion. [#34354](https://github.com/ClickHouse/ClickHouse/pull/34354) ([achimbab](https://github.com/achimbab)). +* Introduce format `ProtobufList` (all records as repeated messages in out Protobuf). Closes [#16436](https://github.com/ClickHouse/ClickHouse/issues/16436). [#35152](https://github.com/ClickHouse/ClickHouse/pull/35152) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add `h3PointDistM`, `h3PointDistKm`, `h3PointDistRads`, `h3GetRes0Indexes`, `h3GetPentagonIndexes` functions. [#34568](https://github.com/ClickHouse/ClickHouse/pull/34568) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `toLastDayOfMonth` function which rounds up a date or date with time to the last day of the month. [#33501](https://github.com/ClickHouse/ClickHouse/issues/33501). [#34394](https://github.com/ClickHouse/ClickHouse/pull/34394) ([Habibullah Oladepo](https://github.com/holadepo)). +* Added load balancing setting for \[Zoo\]Keeper client. Closes [#29617](https://github.com/ClickHouse/ClickHouse/issues/29617). [#30325](https://github.com/ClickHouse/ClickHouse/pull/30325) ([小路](https://github.com/nicelulu)). +* Add a new kind of row policies named `simple`. Before this PR we had two kinds or row policies: `permissive` and `restrictive`. A `simple` row policy adds a new filter on a table without any side-effects like it was for permissive and restrictive policies. [#35345](https://github.com/ClickHouse/ClickHouse/pull/35345) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added an ability to specify cluster secret in replicated database. [#35333](https://github.com/ClickHouse/ClickHouse/pull/35333) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added sanity checks on server startup (available memory and disk space, max thread count, etc). [#34566](https://github.com/ClickHouse/ClickHouse/pull/34566) ([Sergei Trifonov](https://github.com/serxa)). +* INTERVAL improvement - can be used with `[MILLI|MICRO|NANO]SECOND`. Added `toStartOf[Milli|Micro|Nano]second()` functions. Added `[add|subtract][Milli|Micro|Nano]seconds()`. [#34353](https://github.com/ClickHouse/ClickHouse/pull/34353) ([Andrey Zvonov](https://github.com/zvonand)). + +#### Experimental Feature + +* Added support for transactions for simple `MergeTree` tables. This feature is highly experimental and not recommended for production. Part of [#22086](https://github.com/ClickHouse/ClickHouse/issues/22086). [#24258](https://github.com/ClickHouse/ClickHouse/pull/24258) ([tavplubix](https://github.com/tavplubix)). +* Support schema inference for type `Object` in format `JSONEachRow`. Allow to convert columns of type `Map` to columns of type `Object`. [#35629](https://github.com/ClickHouse/ClickHouse/pull/35629) ([Anton Popov](https://github.com/CurtizJ)). +* Allow to write remote FS cache on all write operations. Add `system.remote_filesystem_cache` table. Add `drop remote filesystem cache` query. Add introspection for s3 metadata with `system.remote_data_paths` table. Closes [#34021](https://github.com/ClickHouse/ClickHouse/issues/34021). Add cache option for merges by adding mode `read_from_filesystem_cache_if_exists_otherwise_bypass_cache` (turned on by default for merges and can also be turned on by query setting with the same name). Rename cache related settings (`remote_fs_enable_cache -> enable_filesystem_cache`, etc). [#35475](https://github.com/ClickHouse/ClickHouse/pull/35475) ([Kseniia Sumarokova](https://github.com/kssenii)). +* An option to store parts metadata in RocksDB. Speed up parts loading process of MergeTree to accelerate starting up of clickhouse-server. With this improvement, clickhouse-server was able to decrease starting up time from 75 minutes to 20 seconds, with 700k mergetree parts. [#32928](https://github.com/ClickHouse/ClickHouse/pull/32928) ([李扬](https://github.com/taiyang-li)). + +#### Performance Improvement + +* A new query plan optimization. Evaluate functions after `ORDER BY` when possible. As an example, for a query `SELECT sipHash64(number) FROM numbers(1e8) ORDER BY number LIMIT 5`, function `sipHash64` would be evaluated after `ORDER BY` and `LIMIT`, which gives ~20x speed up. [#35623](https://github.com/ClickHouse/ClickHouse/pull/35623) ([Nikita Taranov](https://github.com/nickitat)). +* Sizes of hash tables used during aggregation now collected and used in later queries to avoid hash tables resizes. [#33439](https://github.com/ClickHouse/ClickHouse/pull/33439) ([Nikita Taranov](https://github.com/nickitat)). +* Improvement for hasAll function using SIMD instructions (SSE and AVX2). [#27653](https://github.com/ClickHouse/ClickHouse/pull/27653) ([youennL-cs](https://github.com/youennL-cs)). [#35723](https://github.com/ClickHouse/ClickHouse/pull/35723) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple changes to improve ASOF JOIN performance (1.2 - 1.6x as fast). It also adds support to use big integers. [#34733](https://github.com/ClickHouse/ClickHouse/pull/34733) ([Raúl Marín](https://github.com/Algunenano)). +* Improve performance of ASOF JOIN if key is native integer. [#35525](https://github.com/ClickHouse/ClickHouse/pull/35525) ([Maksim Kita](https://github.com/kitaisreal)). +* Parallelization of multipart upload into S3 storage. [#35343](https://github.com/ClickHouse/ClickHouse/pull/35343) ([Sergei Trifonov](https://github.com/serxa)). +* URL storage engine now downloads multiple chunks in parallel if the endpoint supports HTTP Range. Two additional settings were added, `max_download_threads` and `max_download_buffer_size`, which control maximum number of threads a single query can use to download the file and the maximum number of bytes each thread can process. [#35150](https://github.com/ClickHouse/ClickHouse/pull/35150) ([Antonio Andelic](https://github.com/antonio2368)). +* Use multiple threads to download objects from S3. Downloading is controllable using `max_download_threads` and `max_download_buffer_size` settings. [#35571](https://github.com/ClickHouse/ClickHouse/pull/35571) ([Antonio Andelic](https://github.com/antonio2368)). +* Narrow mutex scope when interacting with HDFS. Related to [#35292](https://github.com/ClickHouse/ClickHouse/issues/35292). [#35646](https://github.com/ClickHouse/ClickHouse/pull/35646) ([shuchaome](https://github.com/shuchaome)). +* Require mutations for per-table TTL only when it had been changed. [#35953](https://github.com/ClickHouse/ClickHouse/pull/35953) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Multiple improvements for schema inference. Use some tweaks and heuristics to determine numbers, strings, arrays, tuples and maps in CSV, TSV and TSVRaw data formats. Add setting `input_format_csv_use_best_effort_in_schema_inference` for CSV format that enables/disables using these heuristics, if it's disabled, we treat everything as string. Add similar setting `input_format_tsv_use_best_effort_in_schema_inference` for TSV/TSVRaw format. These settings are enabled by default. - Add Maps support for schema inference in Values format. - Fix possible segfault in schema inference in Values format. - Allow to skip columns with unsupported types in Arrow/ORC/Parquet formats. Add corresponding settings for it: `input_format_{parquet|orc|arrow}_skip_columns_with_unsupported_types_in_schema_inference`. These settings are disabled by default. - Allow to convert a column with type Null to a Nullable column with all NULL values in Arrow/Parquet formats. - Allow to specify column names in schema inference via setting `column_names_for_schema_inference` for formats that don't contain column names (like CSV, TSV, JSONCompactEachRow, etc) - Fix schema inference in ORC/Arrow/Parquet formats in terms of working with Nullable columns. Previously all inferred types were not Nullable and it blocked reading Nullable columns from data, now it's fixed and all inferred types are always Nullable (because we cannot understand that column is Nullable or not by reading the schema). - Fix schema inference in Template format with CSV escaping rules. [#35582](https://github.com/ClickHouse/ClickHouse/pull/35582) ([Kruglov Pavel](https://github.com/Avogar)). +* Add parallel parsing and schema inference for format `JSONAsObject`. [#35592](https://github.com/ClickHouse/ClickHouse/pull/35592) ([Anton Popov](https://github.com/CurtizJ)). +* Added a support for automatic schema inference to `s3Cluster` table function. Synced the signatures of `s3 ` and `s3Cluster`. [#35544](https://github.com/ClickHouse/ClickHouse/pull/35544) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for schema inference for `hdfsCluster`. [#35602](https://github.com/ClickHouse/ClickHouse/pull/35602) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add new setting `input_format_json_read_bools_as_numbers` that allows to infer and parse bools as numbers in JSON input formats. It's enabled by default. Suggested by @alexey-milovidov. [#35735](https://github.com/ClickHouse/ClickHouse/pull/35735) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve columns ordering in schema inference for formats TSKV and JSONEachRow, closes [#35640](https://github.com/ClickHouse/ClickHouse/issues/35640). Don't stop schema inference when reading empty row in schema inference for formats TSKV and JSONEachRow. [#35724](https://github.com/ClickHouse/ClickHouse/pull/35724) ([Kruglov Pavel](https://github.com/Avogar)). +* Add settings `input_format_orc_case_insensitive_column_matching`, `input_format_arrow_case_insensitive_column_matching`, and `input_format_parquet_case_insensitive_column_matching` which allows ClickHouse to use case insensitive matching of columns while reading data from ORC, Arrow or Parquet files. [#35459](https://github.com/ClickHouse/ClickHouse/pull/35459) ([Antonio Andelic](https://github.com/antonio2368)). +* Added `is_secure` column to `system.query_log` which denotes if the client is using a secure connection over TCP or HTTP. [#35705](https://github.com/ClickHouse/ClickHouse/pull/35705) ([Antonio Andelic](https://github.com/antonio2368)). +* Now `kafka_num_consumers` can be bigger than amount of physical cores in case of low resource machine (less than 16 cores). [#35926](https://github.com/ClickHouse/ClickHouse/pull/35926) ([alesapin](https://github.com/alesapin)). +* Add some basic metrics to monitor engine=Kafka tables. [#35916](https://github.com/ClickHouse/ClickHouse/pull/35916) ([filimonov](https://github.com/filimonov)). +* Now it's not allowed to `ALTER TABLE ... RESET SETTING` for non-existing settings for MergeTree engines family. Fixes [#35816](https://github.com/ClickHouse/ClickHouse/issues/35816). [#35884](https://github.com/ClickHouse/ClickHouse/pull/35884) ([alesapin](https://github.com/alesapin)). +* Now some `ALTER MODIFY COLUMN` queries for `Arrays` and `Nullable` types can be done at metadata level without mutations. For example, alter from `Array(Enum8('Option1'=1))` to `Array(Enum8('Option1'=1, 'Option2'=2))`. [#35882](https://github.com/ClickHouse/ClickHouse/pull/35882) ([alesapin](https://github.com/alesapin)). +* Added an animation to the hourglass icon to indicate to the user that a query is running. [#35860](https://github.com/ClickHouse/ClickHouse/pull/35860) ([peledni](https://github.com/peledni)). +* support ALTER TABLE t DETACH PARTITION (ALL). [#35794](https://github.com/ClickHouse/ClickHouse/pull/35794) ([awakeljw](https://github.com/awakeljw)). +* Improve projection analysis to optimize trivial queries such as `count()`. [#35788](https://github.com/ClickHouse/ClickHouse/pull/35788) ([Amos Bird](https://github.com/amosbird)). +* Support schema inference for insert select with using `input` table function. Get schema from insertion table instead of inferring it from the data in case of insert select from table functions that support schema inference. Closes [#35639](https://github.com/ClickHouse/ClickHouse/issues/35639). [#35760](https://github.com/ClickHouse/ClickHouse/pull/35760) ([Kruglov Pavel](https://github.com/Avogar)). +* Respect `remote_url_allow_hosts` for Hive tables. [#35743](https://github.com/ClickHouse/ClickHouse/pull/35743) ([李扬](https://github.com/taiyang-li)). +* Implement `send_logs_level` for clickhouse-local. Closes [#35653](https://github.com/ClickHouse/ClickHouse/issues/35653). [#35716](https://github.com/ClickHouse/ClickHouse/pull/35716) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Closes [#35641](https://github.com/ClickHouse/ClickHouse/issues/35641) Allow `EPHEMERAL` columns without explicit default expression. [#35706](https://github.com/ClickHouse/ClickHouse/pull/35706) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add profile event counter `AsyncInsertBytes` about size of async INSERTs. [#35644](https://github.com/ClickHouse/ClickHouse/pull/35644) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the pipeline description for JOIN. [#35612](https://github.com/ClickHouse/ClickHouse/pull/35612) ([何李夫](https://github.com/helifu)). +* Deduce absolute hdfs config path. [#35572](https://github.com/ClickHouse/ClickHouse/pull/35572) ([李扬](https://github.com/taiyang-li)). +* Improve pasting performance and compatibility of clickhouse-client. This helps [#35501](https://github.com/ClickHouse/ClickHouse/issues/35501). [#35541](https://github.com/ClickHouse/ClickHouse/pull/35541) ([Amos Bird](https://github.com/amosbird)). +* It was possible to get stack overflow in distributed queries if one of the settings `async_socket_for_remote` and `use_hedged_requests` is enabled while parsing very deeply nested data type (at least in debug build). Closes [#35509](https://github.com/ClickHouse/ClickHouse/issues/35509). [#35524](https://github.com/ClickHouse/ClickHouse/pull/35524) ([Kruglov Pavel](https://github.com/Avogar)). +* Add sizes of subcolumns to `system.parts_columns` table. [#35488](https://github.com/ClickHouse/ClickHouse/pull/35488) ([Anton Popov](https://github.com/CurtizJ)). +* Add explicit table info to the scan node of query plan and pipeline. [#35460](https://github.com/ClickHouse/ClickHouse/pull/35460) ([何李夫](https://github.com/helifu)). +* Allow server to bind to low-numbered ports (e.g. 443). ClickHouse installation script will set `cap_net_bind_service` to the binary file. [#35451](https://github.com/ClickHouse/ClickHouse/pull/35451) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix INSERT INTO table FROM INFILE: it did not display the progress bar. [#35429](https://github.com/ClickHouse/ClickHouse/pull/35429) ([xiedeyantu](https://github.com/xiedeyantu)). +* Add arguments `--user`, `--password`, `--host`, `--port` for `clickhouse-diagnostics` tool. [#35422](https://github.com/ClickHouse/ClickHouse/pull/35422) ([李扬](https://github.com/taiyang-li)). +* Support uuid for Postgres engines. Closes [#35384](https://github.com/ClickHouse/ClickHouse/issues/35384). [#35403](https://github.com/ClickHouse/ClickHouse/pull/35403) ([Kseniia Sumarokova](https://github.com/kssenii)). +* For table function `s3cluster` or `HDFSCluster` or `hive`, we can't get right `AccessType` by `StorageFactory::instance().getSourceAccessType(getStorageTypeName())`. This pr fix it. [#35365](https://github.com/ClickHouse/ClickHouse/pull/35365) ([李扬](https://github.com/taiyang-li)). +* Remove `--testmode` option for clickhouse-client, enable it unconditionally. [#35354](https://github.com/ClickHouse/ClickHouse/pull/35354) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Don't allow `wchc` operation (four letter command) for clickhouse-keeper. [#35320](https://github.com/ClickHouse/ClickHouse/pull/35320) ([zhangyuli1](https://github.com/zhangyuli1)). +* Add function `getTypeSerializationStreams`. For a specified type (which is detected from column), it returns an array with all the serialization substream paths. This function is useful mainly for developers. [#35290](https://github.com/ClickHouse/ClickHouse/pull/35290) ([李扬](https://github.com/taiyang-li)). +* If `port` is not specified in cluster configuration, default server port will be used. This closes [#34769](https://github.com/ClickHouse/ClickHouse/issues/34769). [#34772](https://github.com/ClickHouse/ClickHouse/pull/34772) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use `minmax` index for orc/parquet file in Hive Engine. Related PR: https://github.com/ClickHouse/arrow/pull/10. [#34631](https://github.com/ClickHouse/ClickHouse/pull/34631) ([李扬](https://github.com/taiyang-li)). +* System log tables now allow to specify COMMENT in ENGINE declaration. Closes [#33768](https://github.com/ClickHouse/ClickHouse/issues/33768). [#34536](https://github.com/ClickHouse/ClickHouse/pull/34536) ([Maksim Kita](https://github.com/kitaisreal)). +* Proper support of setting `max_rows_to_read` in case of reading in order of sorting key and specified limit. Previously the exception `Limit for rows or bytes to read exceeded` could be thrown even if query actually requires to read less amount of rows. [#33230](https://github.com/ClickHouse/ClickHouse/pull/33230) ([Anton Popov](https://github.com/CurtizJ)). +* Respect only quota & period from cgroups, ignore shares (which are not really limit the number of the cores which can be used). [#35815](https://github.com/ClickHouse/ClickHouse/pull/35815) ([filimonov](https://github.com/filimonov)). + +#### Build/Testing/Packaging Improvement + +* Add next batch of randomization settings in functional tests. [#35047](https://github.com/ClickHouse/ClickHouse/pull/35047) ([Kruglov Pavel](https://github.com/Avogar)). +* Add backward compatibility check in stress test. Closes [#25088](https://github.com/ClickHouse/ClickHouse/issues/25088). [#27928](https://github.com/ClickHouse/ClickHouse/pull/27928) ([Kruglov Pavel](https://github.com/Avogar)). +* Migrate package building to `nfpm` - Deprecate `release` script in favor of `packages/build` - Build everything in clickhouse/binary-builder image (cleanup: clickhouse/deb-builder) - Add symbol stripping to cmake (todo: use $prefix/lib/$bin_dir/clickhouse/$binary.debug) - Fix issue with DWARF symbols - Add Alpine APK packages - Rename `alien` to `additional_pkgs`. [#33664](https://github.com/ClickHouse/ClickHouse/pull/33664) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add a night scan and upload for Coverity. [#34895](https://github.com/ClickHouse/ClickHouse/pull/34895) ([Boris Kuschel](https://github.com/bkuschel)). +* A dedicated small package for `clickhouse-keeper`. [#35308](https://github.com/ClickHouse/ClickHouse/pull/35308) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Running with podman was failing: it complains about specifying the same volume twice. [#35978](https://github.com/ClickHouse/ClickHouse/pull/35978) ([Roman Nikonov](https://github.com/nic11)). +* Minor improvement in contrib/krb5 build configuration. [#35832](https://github.com/ClickHouse/ClickHouse/pull/35832) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Add a label to recognize a building task for every image. [#35583](https://github.com/ClickHouse/ClickHouse/pull/35583) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Apply `black` formatter to python code and add a per-commit check. [#35466](https://github.com/ClickHouse/ClickHouse/pull/35466) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Redo alpine image to use clean Dockerfile. Create a script in tests/ci to build both ubuntu and alpine images. Add clickhouse-keeper image (cc @nikitamikhaylov). Add build check to PullRequestCI. Add a job to a ReleaseCI. Add a job to MasterCI to build and push `clickhouse/clickhouse-server:head` and `clickhouse/clickhouse-keeper:head` images for each merged PR. [#35211](https://github.com/ClickHouse/ClickHouse/pull/35211) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix stress-test report in CI, now we upload the runlog with information about started stress tests only once. [#35093](https://github.com/ClickHouse/ClickHouse/pull/35093) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Switch to libcxx / libcxxabi from LLVM 14. [#34906](https://github.com/ClickHouse/ClickHouse/pull/34906) ([Raúl Marín](https://github.com/Algunenano)). +* Update unixodbc to mitigate CVE-2018-7485. Note: this CVE is not relevant for ClickHouse as it implements its own isolation layer for ODBC. [#35943](https://github.com/ClickHouse/ClickHouse/pull/35943) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix + +* Added settings `input_format_ipv4_default_on_conversion_error`, `input_format_ipv6_default_on_conversion_error` to allow insert of invalid ip address values as default into tables. Closes [#35726](https://github.com/ClickHouse/ClickHouse/issues/35726). [#35733](https://github.com/ClickHouse/ClickHouse/pull/35733) ([Maksim Kita](https://github.com/kitaisreal)). +* Avoid erasing columns from a block if it doesn't exist while reading data from Hive. [#35393](https://github.com/ClickHouse/ClickHouse/pull/35393) ([lgbo](https://github.com/lgbo-ustc)). +* Add type checking when creating materialized view. Close: [#23684](https://github.com/ClickHouse/ClickHouse/issues/23684). [#24896](https://github.com/ClickHouse/ClickHouse/pull/24896) ([hexiaoting](https://github.com/hexiaoting)). +* Fix formatting of INSERT INFILE queries (missing quotes). [#35886](https://github.com/ClickHouse/ClickHouse/pull/35886) ([Azat Khuzhin](https://github.com/azat)). +* Disable `session_log` because memory safety issue has been found by fuzzing. See [#35714](https://github.com/ClickHouse/ClickHouse/issues/35714). [#35873](https://github.com/ClickHouse/ClickHouse/pull/35873) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid processing per-column TTL multiple times. [#35820](https://github.com/ClickHouse/ClickHouse/pull/35820) ([Azat Khuzhin](https://github.com/azat)). +* Fix inserts to columns of type `Object` in case when there is data related to several partitions in insert query. [#35806](https://github.com/ClickHouse/ClickHouse/pull/35806) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug in indexes of not presented columns in -WithNames formats that led to error `INCORRECT_NUMBER_OF_COLUMNS ` when the number of columns is more than 256. Closes [#35793](https://github.com/ClickHouse/ClickHouse/issues/35793). [#35803](https://github.com/ClickHouse/ClickHouse/pull/35803) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes [#35751](https://github.com/ClickHouse/ClickHouse/issues/35751). [#35799](https://github.com/ClickHouse/ClickHouse/pull/35799) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix for reading from HDFS in Snappy format. [#35771](https://github.com/ClickHouse/ClickHouse/pull/35771) ([shuchaome](https://github.com/shuchaome)). +* Fix bug in conversion from custom types to string that could lead to segfault or unexpected error messages. Closes [#35752](https://github.com/ClickHouse/ClickHouse/issues/35752). [#35755](https://github.com/ClickHouse/ClickHouse/pull/35755) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix any/all (subquery) implementation. Closes [#35489](https://github.com/ClickHouse/ClickHouse/issues/35489). [#35727](https://github.com/ClickHouse/ClickHouse/pull/35727) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix dropping non-empty database in clickhouse-local. Closes [#35692](https://github.com/ClickHouse/ClickHouse/issues/35692). [#35711](https://github.com/ClickHouse/ClickHouse/pull/35711) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in creating materialized view with subquery after server restart. Materialized view was not getting updated after inserts into underlying table after server restart. Closes [#35511](https://github.com/ClickHouse/ClickHouse/issues/35511). [#35691](https://github.com/ClickHouse/ClickHouse/pull/35691) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible `Can't adjust last granule` exception while reading subcolumns of experimental type `Object`. [#35687](https://github.com/ClickHouse/ClickHouse/pull/35687) ([Anton Popov](https://github.com/CurtizJ)). +* Enable build with JIT compilation by default. [#35683](https://github.com/ClickHouse/ClickHouse/pull/35683) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible loss of subcolumns in experimental type `Object`. [#35682](https://github.com/ClickHouse/ClickHouse/pull/35682) ([Anton Popov](https://github.com/CurtizJ)). +* Fix check ASOF JOIN key nullability, close [#35565](https://github.com/ClickHouse/ClickHouse/issues/35565). [#35674](https://github.com/ClickHouse/ClickHouse/pull/35674) ([Vladimir C](https://github.com/vdimir)). +* Fix part checking logic for parts with projections. Error happened when projection and main part had different types. This is similar to https://github.com/ClickHouse/ClickHouse/pull/33774 . The bug is addressed by @caoyang10. [#35667](https://github.com/ClickHouse/ClickHouse/pull/35667) ([Amos Bird](https://github.com/amosbird)). +* Fix server crash when large number of arguments are passed into `format` function. Please refer to the test file and see how to reproduce the crash. [#35651](https://github.com/ClickHouse/ClickHouse/pull/35651) ([Amos Bird](https://github.com/amosbird)). +* Fix usage of quotas with asynchronous inserts. [#35645](https://github.com/ClickHouse/ClickHouse/pull/35645) ([Anton Popov](https://github.com/CurtizJ)). +* Fix positional arguments with aliases. Closes [#35600](https://github.com/ClickHouse/ClickHouse/issues/35600). [#35620](https://github.com/ClickHouse/ClickHouse/pull/35620) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Check `remote_url_allow_hosts` before schema inference in URL engine Closes [#35064](https://github.com/ClickHouse/ClickHouse/issues/35064). [#35619](https://github.com/ClickHouse/ClickHouse/pull/35619) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `HashJoin` when columns with `LowCardinality` type are used. This closes [#35548](https://github.com/ClickHouse/ClickHouse/issues/35548). [#35616](https://github.com/ClickHouse/ClickHouse/pull/35616) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfault in MaterializedPostgreSQL which happened if exception occurred when data, collected in memory, was synced into underlying tables. Closes [#35611](https://github.com/ClickHouse/ClickHouse/issues/35611). [#35614](https://github.com/ClickHouse/ClickHouse/pull/35614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Setting `database_atomic_wait_for_drop_and_detach_synchronously` worked incorrectly for `ATTACH TABLE` query when previously detached table is still in use, It's fixed. [#35594](https://github.com/ClickHouse/ClickHouse/pull/35594) ([tavplubix](https://github.com/tavplubix)). +* Fix HTTP headers with named collections, add compression_method. Closes [#35273](https://github.com/ClickHouse/ClickHouse/issues/35273). Closes [#35269](https://github.com/ClickHouse/ClickHouse/issues/35269). [#35593](https://github.com/ClickHouse/ClickHouse/pull/35593) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix s3 engine getting virtual columns. Closes [#35411](https://github.com/ClickHouse/ClickHouse/issues/35411). [#35586](https://github.com/ClickHouse/ClickHouse/pull/35586) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed return type deduction for `caseWithExpression`. The type of the ELSE branch is now correctly taken into account. [#35576](https://github.com/ClickHouse/ClickHouse/pull/35576) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix parsing of IPv6 addresses longer than 39 characters. Closes [#34022](https://github.com/ClickHouse/ClickHouse/issues/34022). [#35539](https://github.com/ClickHouse/ClickHouse/pull/35539) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix cast into IPv4, IPv6 address in IN section. Fixes [#35528](https://github.com/ClickHouse/ClickHouse/issues/35528). [#35534](https://github.com/ClickHouse/ClickHouse/pull/35534) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash during short circuit function evaluation when one of arguments is nullable constant. Closes [#35497](https://github.com/ClickHouse/ClickHouse/issues/35497). Closes [#35496](https://github.com/ClickHouse/ClickHouse/issues/35496). [#35502](https://github.com/ClickHouse/ClickHouse/pull/35502) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash for function `throwIf` with constant arguments. [#35500](https://github.com/ClickHouse/ClickHouse/pull/35500) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix bug in Keeper which can lead to unstable client connections. Introduced in [#35031](https://github.com/ClickHouse/ClickHouse/issues/35031). [#35498](https://github.com/ClickHouse/ClickHouse/pull/35498) ([alesapin](https://github.com/alesapin)). +* Fix bug in function `if` when resulting column type differs with resulting data type that led to logical errors like `Logical error: 'Bad cast from type DB::ColumnVector to DB::ColumnVector'.`. Closes [#35367](https://github.com/ClickHouse/ClickHouse/issues/35367). [#35476](https://github.com/ClickHouse/ClickHouse/pull/35476) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix excessive logging when using S3 as backend for MergeTree or as separate table engine/function. Fixes [#30559](https://github.com/ClickHouse/ClickHouse/issues/30559). [#35434](https://github.com/ClickHouse/ClickHouse/pull/35434) ([alesapin](https://github.com/alesapin)). +* Now merges executed with zero copy replication (experimental) will not spam logs with message `Found parts with the same min block and with the same max block as the missing part _ on replica _. Hoping that it will eventually appear as a result of a merge.`. [#35430](https://github.com/ClickHouse/ClickHouse/pull/35430) ([alesapin](https://github.com/alesapin)). +* Skip possible exception if empty chunks appear in GroupingAggregatedTransform. [#35417](https://github.com/ClickHouse/ClickHouse/pull/35417) ([Nikita Taranov](https://github.com/nickitat)). +* Fix working with columns that are not needed in query in Arrow/Parquet/ORC formats, it prevents possible errors like `Unsupported type of an input column ` when file contains column with unsupported type and we don't use it in query. [#35406](https://github.com/ClickHouse/ClickHouse/pull/35406) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix for local cache for remote filesystem (experimental feature) for high concurrency on corner cases. [#35381](https://github.com/ClickHouse/ClickHouse/pull/35381) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix possible deadlock in cache. [#35378](https://github.com/ClickHouse/ClickHouse/pull/35378) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning in case of comparison with constant in `WHERE`. If column and constant had different types, overflow was possible. Query could return an incorrect empty result. This fixes [#35304](https://github.com/ClickHouse/ClickHouse/issues/35304). [#35334](https://github.com/ClickHouse/ClickHouse/pull/35334) ([Amos Bird](https://github.com/amosbird)). +* Fix schema inference for TSKV format while using small max_read_buffer_size. [#35332](https://github.com/ClickHouse/ClickHouse/pull/35332) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix mutations in tables with enabled sparse columns. [#35284](https://github.com/ClickHouse/ClickHouse/pull/35284) ([Anton Popov](https://github.com/CurtizJ)). +* Do not delay final part writing by default (fixes possible `Memory limit exceeded` during `INSERT` by adding `max_insert_delayed_streams_for_parallel_write` with default to 1000 for writes to s3 and disabled as before otherwise). [#34780](https://github.com/ClickHouse/ClickHouse/pull/34780) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v22.3-lts, 2022-03-17 + +#### Backward Incompatible Change + +* Make `arrayCompact` function behave as other higher-order functions: perform compaction not of lambda function results but on the original array. If you're using nontrivial lambda functions in arrayCompact you may restore old behaviour by wrapping `arrayCompact` arguments into `arrayMap`. Closes [#34010](https://github.com/ClickHouse/ClickHouse/issues/34010) [#18535](https://github.com/ClickHouse/ClickHouse/issues/18535) [#14778](https://github.com/ClickHouse/ClickHouse/issues/14778). [#34795](https://github.com/ClickHouse/ClickHouse/pull/34795) ([Alexandre Snarskii](https://github.com/snar)). +* Change implementation specific behavior on overflow of function `toDatetime`. It will be saturated to the nearest min/max supported instant of datetime instead of wraparound. This change is highlighted as "backward incompatible" because someone may unintentionally rely on the old behavior. [#32898](https://github.com/ClickHouse/ClickHouse/pull/32898) ([HaiBo Li](https://github.com/marising)). +* Make function `cast(value, 'IPv4')`, `cast(value, 'IPv6')` behave same as `toIPv4`, `toIPv6` functions. Changed behavior of incorrect IP address passed into functions `toIPv4`,` toIPv6`, now if invalid IP address passes into this functions exception will be raised, before this function return default value. Added functions `IPv4StringToNumOrDefault`, `IPv4StringToNumOrNull`, `IPv6StringToNumOrDefault`, `IPv6StringOrNull` `toIPv4OrDefault`, `toIPv4OrNull`, `toIPv6OrDefault`, `toIPv6OrNull`. Functions `IPv4StringToNumOrDefault `, `toIPv4OrDefault `, `toIPv6OrDefault ` should be used if previous logic relied on `IPv4StringToNum`, `toIPv4`, `toIPv6` returning default value for invalid address. Added setting `cast_ipv4_ipv6_default_on_conversion_error`, if this setting enabled, then IP address conversion functions will behave as before. Closes [#22825](https://github.com/ClickHouse/ClickHouse/issues/22825). Closes [#5799](https://github.com/ClickHouse/ClickHouse/issues/5799). Closes [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#35240](https://github.com/ClickHouse/ClickHouse/pull/35240) ([Maksim Kita](https://github.com/kitaisreal)). + +#### New Feature + +* Support for caching data locally for remote filesystems. It can be enabled for `s3` disks. Closes [#28961](https://github.com/ClickHouse/ClickHouse/issues/28961). [#33717](https://github.com/ClickHouse/ClickHouse/pull/33717) ([Kseniia Sumarokova](https://github.com/kssenii)). In the meantime, we enabled the test suite on s3 filesystem and no more known issues exist, so it is started to be production ready. +* Add new table function `hive`. It can be used as follows `hive('', '', '', '', '')` for example `SELECT * FROM hive('thrift://hivetest:9083', 'test', 'demo', 'id Nullable(String), score Nullable(Int32), day Nullable(String)', 'day')`. [#34946](https://github.com/ClickHouse/ClickHouse/pull/34946) ([lgbo](https://github.com/lgbo-ustc)). +* Support authentication of users connected via SSL by their X.509 certificate. [#31484](https://github.com/ClickHouse/ClickHouse/pull/31484) ([eungenue](https://github.com/eungenue)). +* Support schema inference for inserting into table functions `file`/`hdfs`/`s3`/`url`. [#34732](https://github.com/ClickHouse/ClickHouse/pull/34732) ([Kruglov Pavel](https://github.com/Avogar)). +* Now you can read `system.zookeeper` table without restrictions on path or using `like` expression. This reads can generate quite heavy load for zookeeper so to enable this ability you have to enable setting `allow_unrestricted_reads_from_keeper`. [#34609](https://github.com/ClickHouse/ClickHouse/pull/34609) ([Sergei Trifonov](https://github.com/serxa)). +* Display CPU and memory metrics in clickhouse-local. Close [#34545](https://github.com/ClickHouse/ClickHouse/issues/34545). [#34605](https://github.com/ClickHouse/ClickHouse/pull/34605) ([李扬](https://github.com/taiyang-li)). +* Implement `startsWith` and `endsWith` function for arrays, closes [#33982](https://github.com/ClickHouse/ClickHouse/issues/33982). [#34368](https://github.com/ClickHouse/ClickHouse/pull/34368) ([usurai](https://github.com/usurai)). +* Add three functions for Map data type: 1. `mapReplace(map1, map2)` - replaces values for keys in map1 with the values of the corresponding keys in map2; adds keys from map2 that don't exist in map1. 2. `mapFilter` 3. `mapMap`. mapFilter and mapMap are higher order functions, accepting two arguments, the first argument is a lambda function with k, v pair as arguments, the second argument is a column of type Map. [#33698](https://github.com/ClickHouse/ClickHouse/pull/33698) ([hexiaoting](https://github.com/hexiaoting)). +* Allow getting default user and password for clickhouse-client from the `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD` environment variables. Close [#34538](https://github.com/ClickHouse/ClickHouse/issues/34538). [#34947](https://github.com/ClickHouse/ClickHouse/pull/34947) ([DR](https://github.com/freedomDR)). + +#### Experimental Feature + +* New data type `Object()`, which supports storing of semi-structured data (for now JSON only). Data is written to such types as string. Then all paths are extracted according to format of semi-structured data and written as separate columns in most optimal types, that can store all their values. Those columns can be queried by names that match paths in source data. E.g `data.key1.key2` or with cast operator `data.key1.key2::Int64`. +* Add `database_replicated_allow_only_replicated_engine` setting. When enabled, it only allowed to only create `Replicated` tables or tables with stateless engines in `Replicated` databases. [#35214](https://github.com/ClickHouse/ClickHouse/pull/35214) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). Note that `Replicated` database is still an experimental feature. + +#### Performance Improvement + +* Improve performance of insertion into `MergeTree` tables by optimizing sorting. Up to 2x improvement is observed on realistic benchmarks. [#34750](https://github.com/ClickHouse/ClickHouse/pull/34750) ([Maksim Kita](https://github.com/kitaisreal)). +* Columns pruning when reading Parquet, ORC and Arrow files from URL and S3. Closes [#34163](https://github.com/ClickHouse/ClickHouse/issues/34163). [#34849](https://github.com/ClickHouse/ClickHouse/pull/34849) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Columns pruning when reading Parquet, ORC and Arrow files from Hive. [#34954](https://github.com/ClickHouse/ClickHouse/pull/34954) ([lgbo](https://github.com/lgbo-ustc)). +* A bunch of performance optimizations from a performance superhero. Improve performance of processing queries with large `IN` section. Improve performance of `direct` dictionary if its source is `ClickHouse`. Improve performance of `detectCharset `, `detectLanguageUnknown ` functions. [#34888](https://github.com/ClickHouse/ClickHouse/pull/34888) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `any` aggregate function by using more batching. [#34760](https://github.com/ClickHouse/ClickHouse/pull/34760) ([Raúl Marín](https://github.com/Algunenano)). +* Multiple improvements for performance of `clickhouse-keeper`: less locking [#35010](https://github.com/ClickHouse/ClickHouse/pull/35010) ([zhanglistar](https://github.com/zhanglistar)), lower memory usage by streaming reading and writing of snapshot instead of full copy. [#34584](https://github.com/ClickHouse/ClickHouse/pull/34584) ([zhanglistar](https://github.com/zhanglistar)), optimizing compaction of log store in the RAFT implementation. [#34534](https://github.com/ClickHouse/ClickHouse/pull/34534) ([zhanglistar](https://github.com/zhanglistar)), versioning of the internal data structure [#34486](https://github.com/ClickHouse/ClickHouse/pull/34486) ([zhanglistar](https://github.com/zhanglistar)). + +#### Improvement + +* Allow asynchronous inserts to table functions. Fixes [#34864](https://github.com/ClickHouse/ClickHouse/issues/34864). [#34866](https://github.com/ClickHouse/ClickHouse/pull/34866) ([Anton Popov](https://github.com/CurtizJ)). +* Implicit type casting of the key argument for functions `dictGetHierarchy`, `dictIsIn`, `dictGetChildren`, `dictGetDescendants`. Closes [#34970](https://github.com/ClickHouse/ClickHouse/issues/34970). [#35027](https://github.com/ClickHouse/ClickHouse/pull/35027) ([Maksim Kita](https://github.com/kitaisreal)). +* `EXPLAIN AST` query can output AST in form of a graph in Graphviz format: `EXPLAIN AST graph = 1 SELECT * FROM system.parts`. [#35173](https://github.com/ClickHouse/ClickHouse/pull/35173) ([李扬](https://github.com/taiyang-li)). +* When large files were written with `s3` table function or table engine, the content type on the files was mistakenly set to `application/xml` due to a bug in the AWS SDK. This closes [#33964](https://github.com/ClickHouse/ClickHouse/issues/33964). [#34433](https://github.com/ClickHouse/ClickHouse/pull/34433) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Change restrictive row policies a bit to make them an easier alternative to permissive policies in easy cases. If for a particular table only restrictive policies exist (without permissive policies) users will be able to see some rows. Also `SHOW CREATE ROW POLICY` will always show `AS permissive` or `AS restrictive` in row policy's definition. [#34596](https://github.com/ClickHouse/ClickHouse/pull/34596) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve schema inference with globs in File/S3/HDFS/URL engines. Try to use the next path for schema inference in case of error. [#34465](https://github.com/ClickHouse/ClickHouse/pull/34465) ([Kruglov Pavel](https://github.com/Avogar)). +* Play UI now correctly detects the preferred light/dark theme from the OS. [#35068](https://github.com/ClickHouse/ClickHouse/pull/35068) ([peledni](https://github.com/peledni)). +* Added `date_time_input_format = 'best_effort_us'`. Closes [#34799](https://github.com/ClickHouse/ClickHouse/issues/34799). [#34982](https://github.com/ClickHouse/ClickHouse/pull/34982) ([WenYao](https://github.com/Cai-Yao)). +* A new settings called `allow_plaintext_password` and `allow_no_password` are added in server configuration which turn on/off authentication types that can be potentially insecure in some environments. They are allowed by default. [#34738](https://github.com/ClickHouse/ClickHouse/pull/34738) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Support for `DateTime64` data type in `Arrow` format, closes [#8280](https://github.com/ClickHouse/ClickHouse/issues/8280) and closes [#28574](https://github.com/ClickHouse/ClickHouse/issues/28574). [#34561](https://github.com/ClickHouse/ClickHouse/pull/34561) ([李扬](https://github.com/taiyang-li)). +* Reload `remote_url_allow_hosts` (filtering of outgoing connections) on config update. [#35294](https://github.com/ClickHouse/ClickHouse/pull/35294) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support `--testmode` parameter for `clickhouse-local`. This parameter enables interpretation of test hints that we use in functional tests. [#35264](https://github.com/ClickHouse/ClickHouse/pull/35264) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `distributed_depth` to query log. It is like a more detailed variant of `is_initial_query` [#35207](https://github.com/ClickHouse/ClickHouse/pull/35207) ([李扬](https://github.com/taiyang-li)). +* Respect `remote_url_allow_hosts` for `MySQL` and `PostgreSQL` table functions. [#35191](https://github.com/ClickHouse/ClickHouse/pull/35191) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Added `disk_name` field to `system.part_log`. [#35178](https://github.com/ClickHouse/ClickHouse/pull/35178) ([Artyom Yurkov](https://github.com/Varinara)). +* Do not retry non-rertiable errors when querying remote URLs. Closes [#35161](https://github.com/ClickHouse/ClickHouse/issues/35161). [#35172](https://github.com/ClickHouse/ClickHouse/pull/35172) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support distributed INSERT SELECT queries (the setting `parallel_distributed_insert_select`) table function `view()`. [#35132](https://github.com/ClickHouse/ClickHouse/pull/35132) ([Azat Khuzhin](https://github.com/azat)). +* More precise memory tracking during `INSERT` into `Buffer` with `AggregateFunction`. [#35072](https://github.com/ClickHouse/ClickHouse/pull/35072) ([Azat Khuzhin](https://github.com/azat)). +* Avoid division by zero in Query Profiler if Linux kernel has a bug. Closes [#34787](https://github.com/ClickHouse/ClickHouse/issues/34787). [#35032](https://github.com/ClickHouse/ClickHouse/pull/35032) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add more sanity checks for keeper configuration: now mixing of localhost and non-local servers is not allowed, also add checks for same value of internal raft port and keeper client port. [#35004](https://github.com/ClickHouse/ClickHouse/pull/35004) ([alesapin](https://github.com/alesapin)). +* Currently, if the user changes the settings of the system tables there will be tons of logs and ClickHouse will rename the tables every minute. This fixes [#34929](https://github.com/ClickHouse/ClickHouse/issues/34929). [#34949](https://github.com/ClickHouse/ClickHouse/pull/34949) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Use connection pool for Hive metastore client. [#34940](https://github.com/ClickHouse/ClickHouse/pull/34940) ([lgbo](https://github.com/lgbo-ustc)). +* Ignore per-column `TTL` in `CREATE TABLE AS` if new table engine does not support it (i.e. if the engine is not of `MergeTree` family). [#34938](https://github.com/ClickHouse/ClickHouse/pull/34938) ([Azat Khuzhin](https://github.com/azat)). +* Allow `LowCardinality` strings for `ngrambf_v1`/`tokenbf_v1` indexes. Closes [#21865](https://github.com/ClickHouse/ClickHouse/issues/21865). [#34911](https://github.com/ClickHouse/ClickHouse/pull/34911) ([Lars Hiller Eidnes](https://github.com/larspars)). +* Allow opening empty sqlite db if the file doesn't exist. Closes [#33367](https://github.com/ClickHouse/ClickHouse/issues/33367). [#34907](https://github.com/ClickHouse/ClickHouse/pull/34907) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implement memory statistics for FreeBSD - this is required for `max_server_memory_usage` to work correctly. [#34902](https://github.com/ClickHouse/ClickHouse/pull/34902) ([Alexandre Snarskii](https://github.com/snar)). +* In previous versions the progress bar in clickhouse-client can jump forward near 50% for no reason. This closes [#34324](https://github.com/ClickHouse/ClickHouse/issues/34324). [#34801](https://github.com/ClickHouse/ClickHouse/pull/34801) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now `ALTER TABLE DROP COLUMN columnX` queries for `MergeTree` table engines will work instantly when `columnX` is an `ALIAS` column. Fixes [#34660](https://github.com/ClickHouse/ClickHouse/issues/34660). [#34786](https://github.com/ClickHouse/ClickHouse/pull/34786) ([alesapin](https://github.com/alesapin)). +* Show hints when user mistyped the name of a data skipping index. Closes [#29698](https://github.com/ClickHouse/ClickHouse/issues/29698). [#34764](https://github.com/ClickHouse/ClickHouse/pull/34764) ([flynn](https://github.com/ucasfl)). +* Support `remote()`/`cluster()` table functions for `parallel_distributed_insert_select`. [#34728](https://github.com/ClickHouse/ClickHouse/pull/34728) ([Azat Khuzhin](https://github.com/azat)). +* Do not reset logging that configured via `--log-file`/`--errorlog-file` command line options in case of empty configuration in the config file. [#34718](https://github.com/ClickHouse/ClickHouse/pull/34718) ([Amos Bird](https://github.com/amosbird)). +* Extract schema only once on table creation and prevent reading from local files/external sources to extract schema on each server startup. [#34684](https://github.com/ClickHouse/ClickHouse/pull/34684) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow specifying argument names for executable UDFs. This is necessary for formats where argument name is part of serialization, like `Native`, `JSONEachRow`. Closes [#34604](https://github.com/ClickHouse/ClickHouse/issues/34604). [#34653](https://github.com/ClickHouse/ClickHouse/pull/34653) ([Maksim Kita](https://github.com/kitaisreal)). +* `MaterializedMySQL` (experimental feature) now supports `materialized_mysql_tables_list` (a comma-separated list of MySQL database tables, which will be replicated by the MaterializedMySQL database engine. Default value: empty list — means all the tables will be replicated), mentioned at [#32977](https://github.com/ClickHouse/ClickHouse/issues/32977). [#34487](https://github.com/ClickHouse/ClickHouse/pull/34487) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve OpenTelemetry span logs for INSERT operation on distributed table. [#34480](https://github.com/ClickHouse/ClickHouse/pull/34480) ([Frank Chen](https://github.com/FrankChen021)). +* Make the znode `ctime` and `mtime` consistent between servers in ClickHouse Keeper. [#33441](https://github.com/ClickHouse/ClickHouse/pull/33441) ([小路](https://github.com/nicelulu)). + +#### Build/Testing/Packaging Improvement + +* Package repository is migrated to JFrog Artifactory (**Mikhail f. Shiryaev**). +* Randomize some settings in functional tests, so more possible combinations of settings will be tested. This is yet another fuzzing method to ensure better test coverage. This closes [#32268](https://github.com/ClickHouse/ClickHouse/issues/32268). [#34092](https://github.com/ClickHouse/ClickHouse/pull/34092) ([Kruglov Pavel](https://github.com/Avogar)). +* Drop PVS-Studio from our CI. [#34680](https://github.com/ClickHouse/ClickHouse/pull/34680) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add an ability to build stripped binaries with CMake. In previous versions it was performed by dh-tools. [#35196](https://github.com/ClickHouse/ClickHouse/pull/35196) ([alesapin](https://github.com/alesapin)). +* Smaller "fat-free" `clickhouse-keeper` build. [#35031](https://github.com/ClickHouse/ClickHouse/pull/35031) ([alesapin](https://github.com/alesapin)). +* Use @robot-clickhouse as an author and committer for PRs like https://github.com/ClickHouse/ClickHouse/pull/34685. [#34793](https://github.com/ClickHouse/ClickHouse/pull/34793) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Limit DWARF version for debug info by 4 max, because our internal stack symbolizer cannot parse DWARF version 5. This makes sense if you compile ClickHouse with clang-15. [#34777](https://github.com/ClickHouse/ClickHouse/pull/34777) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove `clickhouse-test` debian package as unneeded complication. CI use tests from repository and standalone testing via deb package is no longer supported. [#34606](https://github.com/ClickHouse/ClickHouse/pull/34606) ([Ilya Yatsishin](https://github.com/qoega)). + +#### Bug Fix (user-visible misbehaviour in official stable or prestable release) + +* A fix for HDFS integration: When the inner buffer size is too small, NEED_MORE_INPUT in `HadoopSnappyDecoder` will run multi times (>=3) for one compressed block. This makes the input data be copied into the wrong place in `HadoopSnappyDecoder::buffer`. [#35116](https://github.com/ClickHouse/ClickHouse/pull/35116) ([lgbo](https://github.com/lgbo-ustc)). +* Ignore obsolete grants in ATTACH GRANT statements. This PR fixes [#34815](https://github.com/ClickHouse/ClickHouse/issues/34815). [#34855](https://github.com/ClickHouse/ClickHouse/pull/34855) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix segfault in Postgres database when getting create table query if database was created using named collections. Closes [#35312](https://github.com/ClickHouse/ClickHouse/issues/35312). [#35313](https://github.com/ClickHouse/ClickHouse/pull/35313) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partial merge join duplicate rows bug, close [#31009](https://github.com/ClickHouse/ClickHouse/issues/31009). [#35311](https://github.com/ClickHouse/ClickHouse/pull/35311) ([Vladimir C](https://github.com/vdimir)). +* Fix possible `Assertion 'position() != working_buffer.end()' failed` while using bzip2 compression with small `max_read_buffer_size` setting value. The bug was found in https://github.com/ClickHouse/ClickHouse/pull/35047. [#35300](https://github.com/ClickHouse/ClickHouse/pull/35300) ([Kruglov Pavel](https://github.com/Avogar)). While using lz4 compression with a small max_read_buffer_size setting value. [#35296](https://github.com/ClickHouse/ClickHouse/pull/35296) ([Kruglov Pavel](https://github.com/Avogar)). While using lzma compression with small `max_read_buffer_size` setting value. [#35295](https://github.com/ClickHouse/ClickHouse/pull/35295) ([Kruglov Pavel](https://github.com/Avogar)). While using `brotli` compression with a small `max_read_buffer_size` setting value. The bug was found in https://github.com/ClickHouse/ClickHouse/pull/35047. [#35281](https://github.com/ClickHouse/ClickHouse/pull/35281) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible segfault in `JSONEachRow` schema inference. [#35291](https://github.com/ClickHouse/ClickHouse/pull/35291) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `CHECK TABLE` query in case when sparse columns are enabled in table. [#35274](https://github.com/ClickHouse/ClickHouse/pull/35274) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid std::terminate in case of exception in reading from remote VFS. [#35257](https://github.com/ClickHouse/ClickHouse/pull/35257) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading port from config, close [#34776](https://github.com/ClickHouse/ClickHouse/issues/34776). [#35193](https://github.com/ClickHouse/ClickHouse/pull/35193) ([Vladimir C](https://github.com/vdimir)). +* Fix error in query with `WITH TOTALS` in case if `HAVING` returned empty result. This fixes [#33711](https://github.com/ClickHouse/ClickHouse/issues/33711). [#35186](https://github.com/ClickHouse/ClickHouse/pull/35186) ([Amos Bird](https://github.com/amosbird)). +* Fix a corner case of `replaceRegexpAll`, close [#35117](https://github.com/ClickHouse/ClickHouse/issues/35117). [#35182](https://github.com/ClickHouse/ClickHouse/pull/35182) ([Vladimir C](https://github.com/vdimir)). +* Schema inference didn't work properly on case of `INSERT INTO FUNCTION s3(...) FROM ...`, it tried to read schema from s3 file instead of from select query. [#35176](https://github.com/ClickHouse/ClickHouse/pull/35176) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix MaterializedPostgreSQL (experimental feature) `table overrides` for partition by, etc. Closes [#35048](https://github.com/ClickHouse/ClickHouse/issues/35048). [#35162](https://github.com/ClickHouse/ClickHouse/pull/35162) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix MaterializedPostgreSQL (experimental feature) adding new table to replication (ATTACH TABLE) after manually removing (DETACH TABLE). Closes [#33800](https://github.com/ClickHouse/ClickHouse/issues/33800). Closes [#34922](https://github.com/ClickHouse/ClickHouse/issues/34922). Closes [#34315](https://github.com/ClickHouse/ClickHouse/issues/34315). [#35158](https://github.com/ClickHouse/ClickHouse/pull/35158) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning error when non-monotonic function is used with IN operator. This fixes [#35136](https://github.com/ClickHouse/ClickHouse/issues/35136). [#35146](https://github.com/ClickHouse/ClickHouse/pull/35146) ([Amos Bird](https://github.com/amosbird)). +* Fixed slightly incorrect translation of YAML configs to XML. [#35135](https://github.com/ClickHouse/ClickHouse/pull/35135) ([Miel Donkers](https://github.com/mdonkers)). +* Fix `optimize_skip_unused_shards_rewrite_in` for signed columns and negative values. [#35134](https://github.com/ClickHouse/ClickHouse/pull/35134) ([Azat Khuzhin](https://github.com/azat)). +* The `update_lag` external dictionary configuration option was unusable showing the error message ``Unexpected key `update_lag` in dictionary source configuration``. [#35089](https://github.com/ClickHouse/ClickHouse/pull/35089) ([Jason Chu](https://github.com/1lann)). +* Avoid possible deadlock on server shutdown. [#35081](https://github.com/ClickHouse/ClickHouse/pull/35081) ([Azat Khuzhin](https://github.com/azat)). +* Fix missing alias after function is optimized to a subcolumn when setting `optimize_functions_to_subcolumns` is enabled. Closes [#33798](https://github.com/ClickHouse/ClickHouse/issues/33798). [#35079](https://github.com/ClickHouse/ClickHouse/pull/35079) ([qieqieplus](https://github.com/qieqieplus)). +* Fix reading from `system.asynchronous_inserts` table if there exists asynchronous insert into table function. [#35050](https://github.com/ClickHouse/ClickHouse/pull/35050) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible exception `Reading for MergeTree family tables must be done with last position boundary` (relevant to operation on remote VFS). Closes [#34979](https://github.com/ClickHouse/ClickHouse/issues/34979). [#35001](https://github.com/ClickHouse/ClickHouse/pull/35001) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix unexpected result when use -State type aggregate function in window frame. [#34999](https://github.com/ClickHouse/ClickHouse/pull/34999) ([metahys](https://github.com/metahys)). +* Fix possible segfault in FileLog (experimental feature). Closes [#30749](https://github.com/ClickHouse/ClickHouse/issues/30749). [#34996](https://github.com/ClickHouse/ClickHouse/pull/34996) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible rare error `Cannot push block to port which already has data`. [#34993](https://github.com/ClickHouse/ClickHouse/pull/34993) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong schema inference for unquoted dates in CSV. Closes [#34768](https://github.com/ClickHouse/ClickHouse/issues/34768). [#34961](https://github.com/ClickHouse/ClickHouse/pull/34961) ([Kruglov Pavel](https://github.com/Avogar)). +* Integration with Hive: Fix unexpected result when use `in` in `where` in hive query. [#34945](https://github.com/ClickHouse/ClickHouse/pull/34945) ([lgbo](https://github.com/lgbo-ustc)). +* Avoid busy polling in ClickHouse Keeper while searching for changelog files to delete. [#34931](https://github.com/ClickHouse/ClickHouse/pull/34931) ([Azat Khuzhin](https://github.com/azat)). +* Fix DateTime64 conversion from PostgreSQL. Closes [#33364](https://github.com/ClickHouse/ClickHouse/issues/33364). [#34910](https://github.com/ClickHouse/ClickHouse/pull/34910) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible "Part directory doesn't exist" during `INSERT` into MergeTree table backed by VFS over s3. [#34876](https://github.com/ClickHouse/ClickHouse/pull/34876) ([Azat Khuzhin](https://github.com/azat)). +* Support DDLs like CREATE USER to be executed on cross replicated cluster. [#34860](https://github.com/ClickHouse/ClickHouse/pull/34860) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix bugs for multiple columns group by in `WindowView` (experimental feature). [#34859](https://github.com/ClickHouse/ClickHouse/pull/34859) ([vxider](https://github.com/Vxider)). +* Fix possible failures in S2 functions when queries contain const columns. [#34745](https://github.com/ClickHouse/ClickHouse/pull/34745) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix bug for H3 funcs containing const columns which cause queries to fail. [#34743](https://github.com/ClickHouse/ClickHouse/pull/34743) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix `No such file or directory` with enabled `fsync_part_directory` and vertical merge. [#34739](https://github.com/ClickHouse/ClickHouse/pull/34739) ([Azat Khuzhin](https://github.com/azat)). +* Fix serialization/printing for system queries `RELOAD MODEL`, `RELOAD FUNCTION`, `RESTART DISK` when used `ON CLUSTER`. Closes [#34514](https://github.com/ClickHouse/ClickHouse/issues/34514). [#34696](https://github.com/ClickHouse/ClickHouse/pull/34696) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `allow_experimental_projection_optimization` with `enable_global_with_statement` (before it may lead to `Stack size too large` error in case of multiple expressions in `WITH` clause, and also it executes scalar subqueries again and again, so not it will be more optimal). [#34650](https://github.com/ClickHouse/ClickHouse/pull/34650) ([Azat Khuzhin](https://github.com/azat)). +* Stop to select part for mutate when the other replica has already updated the transaction log for `ReplatedMergeTree` engine. [#34633](https://github.com/ClickHouse/ClickHouse/pull/34633) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix incorrect result of trivial count query when part movement feature is used [#34089](https://github.com/ClickHouse/ClickHouse/issues/34089). [#34385](https://github.com/ClickHouse/ClickHouse/pull/34385) ([nvartolomei](https://github.com/nvartolomei)). +* Fix inconsistency of `max_query_size` limitation in distributed subqueries. [#34078](https://github.com/ClickHouse/ClickHouse/pull/34078) ([Chao Ma](https://github.com/godliness)). + + +### ClickHouse release v22.2, 2022-02-17 + +#### Upgrade Notes + +* Applying data skipping indexes for queries with FINAL may produce incorrect result. In this release we disabled data skipping indexes by default for queries with FINAL (a new setting `use_skip_indexes_if_final` is introduced and disabled by default). [#34243](https://github.com/ClickHouse/ClickHouse/pull/34243) ([Azat Khuzhin](https://github.com/azat)). + +#### New Feature + +* Projections are production ready. Set `allow_experimental_projection_optimization` by default and deprecate this setting. [#34456](https://github.com/ClickHouse/ClickHouse/pull/34456) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* An option to create a new files on insert for `File`/`S3`/`HDFS` engines. Allow to overwrite a file in `HDFS`. Throw an exception in attempt to overwrite a file in `S3` by default. Throw an exception in attempt to append data to file in formats that have a suffix (and thus don't support appends, like `Parquet`, `ORC`). Closes [#31640](https://github.com/ClickHouse/ClickHouse/issues/31640) Closes [#31622](https://github.com/ClickHouse/ClickHouse/issues/31622) Closes [#23862](https://github.com/ClickHouse/ClickHouse/issues/23862) Closes [#15022](https://github.com/ClickHouse/ClickHouse/issues/15022) Closes [#16674](https://github.com/ClickHouse/ClickHouse/issues/16674). [#33302](https://github.com/ClickHouse/ClickHouse/pull/33302) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a setting that allows a user to provide own deduplication semantic in `MergeTree`/`ReplicatedMergeTree` If provided, it's used instead of data digest to generate block ID. So, for example, by providing a unique value for the setting in each INSERT statement, the user can avoid the same inserted data being deduplicated. This closes: [#7461](https://github.com/ClickHouse/ClickHouse/issues/7461). [#32304](https://github.com/ClickHouse/ClickHouse/pull/32304) ([Igor Nikonov](https://github.com/devcrafter)). +* Add support of `DEFAULT` keyword for INSERT statements. Closes [#6331](https://github.com/ClickHouse/ClickHouse/issues/6331). [#33141](https://github.com/ClickHouse/ClickHouse/pull/33141) ([Andrii Buriachevskyi](https://github.com/1over)). +* `EPHEMERAL` column specifier is added to `CREATE TABLE` query. Closes [#9436](https://github.com/ClickHouse/ClickHouse/issues/9436). [#34424](https://github.com/ClickHouse/ClickHouse/pull/34424) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Support `IF EXISTS` clause for `TTL expr TO [DISK|VOLUME] [IF EXISTS] 'xxx'` feature. Parts will be moved to disk or volume only if it exists on replica, so `MOVE TTL` rules will be able to behave differently on replicas according to the existing storage policies. Resolves [#34455](https://github.com/ClickHouse/ClickHouse/issues/34455). [#34504](https://github.com/ClickHouse/ClickHouse/pull/34504) ([Anton Popov](https://github.com/CurtizJ)). +* Allow set default table engine and to create tables without specifying ENGINE. [#34187](https://github.com/ClickHouse/ClickHouse/pull/34187) ([Ilya Yatsishin](https://github.com/qoega)). +* Add table function `format(format_name, data)`. [#34125](https://github.com/ClickHouse/ClickHouse/pull/34125) ([Kruglov Pavel](https://github.com/Avogar)). +* Detect format in `clickhouse-local` by file name even in the case when it is passed to stdin. [#33829](https://github.com/ClickHouse/ClickHouse/pull/33829) ([Kruglov Pavel](https://github.com/Avogar)). +* Add schema inference for `values` table function. Closes [#33811](https://github.com/ClickHouse/ClickHouse/issues/33811). [#34017](https://github.com/ClickHouse/ClickHouse/pull/34017) ([Kruglov Pavel](https://github.com/Avogar)). +* Dynamic reload of server TLS certificates on config reload. Closes [#15764](https://github.com/ClickHouse/ClickHouse/issues/15764). [#15765](https://github.com/ClickHouse/ClickHouse/pull/15765) ([johnskopis](https://github.com/johnskopis)). [#31257](https://github.com/ClickHouse/ClickHouse/pull/31257) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Now ReplicatedMergeTree can recover data when some of its disks are broken. [#13544](https://github.com/ClickHouse/ClickHouse/pull/13544) ([Amos Bird](https://github.com/amosbird)). +* Fault-tolerant connections in clickhouse-client: `clickhouse-client ... --host host1 --host host2 --port port2 --host host3 --port port --host host4`. [#34490](https://github.com/ClickHouse/ClickHouse/pull/34490) ([Kruglov Pavel](https://github.com/Avogar)). [#33824](https://github.com/ClickHouse/ClickHouse/pull/33824) ([Filippov Denis](https://github.com/DF5HSE)). +* Add `DEGREES` and `RADIANS` functions for MySQL compatibility. [#33769](https://github.com/ClickHouse/ClickHouse/pull/33769) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `h3ToCenterChild` function. [#33313](https://github.com/ClickHouse/ClickHouse/pull/33313) ([Bharat Nallan](https://github.com/bharatnc)). Add new h3 miscellaneous functions: `edgeLengthKm`,`exactEdgeLengthKm`,`exactEdgeLengthM`,`exactEdgeLengthRads`,`numHexagons`. [#33621](https://github.com/ClickHouse/ClickHouse/pull/33621) ([Bharat Nallan](https://github.com/bharatnc)). +* Add function `bitSlice` to extract bit subsequences from String/FixedString. [#33360](https://github.com/ClickHouse/ClickHouse/pull/33360) ([RogerYK](https://github.com/RogerYK)). +* Implemented `meanZTest` aggregate function. [#33354](https://github.com/ClickHouse/ClickHouse/pull/33354) ([achimbab](https://github.com/achimbab)). +* Add confidence intervals to T-tests aggregate functions. [#33260](https://github.com/ClickHouse/ClickHouse/pull/33260) ([achimbab](https://github.com/achimbab)). +* Add function `addressToLineWithInlines`. Close [#26211](https://github.com/ClickHouse/ClickHouse/issues/26211). [#33467](https://github.com/ClickHouse/ClickHouse/pull/33467) ([SuperDJY](https://github.com/cmsxbc)). +* Added `#!` and `# ` as a recognised start of a single line comment. Closes [#34138](https://github.com/ClickHouse/ClickHouse/issues/34138). [#34230](https://github.com/ClickHouse/ClickHouse/pull/34230) ([Aaron Katz](https://github.com/aaronstephenkatz)). + +#### Experimental Feature + +* Functions for text classification: language and charset detection. See [#23271](https://github.com/ClickHouse/ClickHouse/issues/23271). [#33314](https://github.com/ClickHouse/ClickHouse/pull/33314) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add memory overcommit to `MemoryTracker`. Added `guaranteed` settings for memory limits which represent soft memory limits. In case when hard memory limit is reached, `MemoryTracker` tries to cancel the most overcommited query. New setting `memory_usage_overcommit_max_wait_microseconds` specifies how long queries may wait another query to stop. Closes [#28375](https://github.com/ClickHouse/ClickHouse/issues/28375). [#31182](https://github.com/ClickHouse/ClickHouse/pull/31182) ([Dmitry Novik](https://github.com/novikd)). +* Enable stream to table join in WindowView. [#33729](https://github.com/ClickHouse/ClickHouse/pull/33729) ([vxider](https://github.com/Vxider)). +* Support `SET`, `YEAR`, `TIME` and `GEOMETRY` data types in `MaterializedMySQL` (experimental feature). Fixes [#18091](https://github.com/ClickHouse/ClickHouse/issues/18091), [#21536](https://github.com/ClickHouse/ClickHouse/issues/21536), [#26361](https://github.com/ClickHouse/ClickHouse/issues/26361). [#33429](https://github.com/ClickHouse/ClickHouse/pull/33429) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix various issues when projection is enabled by default. Each issue is described in separate commit. This is for [#33678](https://github.com/ClickHouse/ClickHouse/issues/33678) . This fixes [#34273](https://github.com/ClickHouse/ClickHouse/issues/34273). [#34305](https://github.com/ClickHouse/ClickHouse/pull/34305) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement + +* Support `optimize_read_in_order` if prefix of sorting key is already sorted. E.g. if we have sorting key `ORDER BY (a, b)` in table and query with `WHERE a = const ORDER BY b` clauses, now it will be applied reading in order of sorting key instead of full sort. [#32748](https://github.com/ClickHouse/ClickHouse/pull/32748) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of partitioned insert into table functions `URL`, `S3`, `File`, `HDFS`. Closes [#34348](https://github.com/ClickHouse/ClickHouse/issues/34348). [#34510](https://github.com/ClickHouse/ClickHouse/pull/34510) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple performance improvements of clickhouse-keeper. [#34484](https://github.com/ClickHouse/ClickHouse/pull/34484) [#34587](https://github.com/ClickHouse/ClickHouse/pull/34587) ([zhanglistar](https://github.com/zhanglistar)). +* `FlatDictionary` improve performance of dictionary data load. [#33871](https://github.com/ClickHouse/ClickHouse/pull/33871) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `mapPopulateSeries` function. Closes [#33944](https://github.com/ClickHouse/ClickHouse/issues/33944). [#34318](https://github.com/ClickHouse/ClickHouse/pull/34318) ([Maksim Kita](https://github.com/kitaisreal)). +* `_file` and `_path` virtual columns (in file-like table engines) are made `LowCardinality` - it will make queries for multiple files faster. Closes [#34300](https://github.com/ClickHouse/ClickHouse/issues/34300). [#34317](https://github.com/ClickHouse/ClickHouse/pull/34317) ([flynn](https://github.com/ucasfl)). +* Speed up loading of data parts. It was not parallelized before: the setting `part_loading_threads` did not have effect. See [#4699](https://github.com/ClickHouse/ClickHouse/issues/4699). [#34310](https://github.com/ClickHouse/ClickHouse/pull/34310) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of `LineAsString` format. This closes [#34303](https://github.com/ClickHouse/ClickHouse/issues/34303). [#34306](https://github.com/ClickHouse/ClickHouse/pull/34306) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize `quantilesExact{Low,High}` to use `nth_element` instead of `sort`. [#34287](https://github.com/ClickHouse/ClickHouse/pull/34287) ([Danila Kutenin](https://github.com/danlark1)). +* Slightly improve performance of `Regexp` format. [#34202](https://github.com/ClickHouse/ClickHouse/pull/34202) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor improvement for analysis of scalar subqueries. [#34128](https://github.com/ClickHouse/ClickHouse/pull/34128) ([Federico Rodriguez](https://github.com/fedrod)). +* Make ORDER BY tuple almost as fast as ORDER BY columns. We have special optimizations for multiple column ORDER BY: https://github.com/ClickHouse/ClickHouse/pull/10831 . It's beneficial to also apply to tuple columns. [#34060](https://github.com/ClickHouse/ClickHouse/pull/34060) ([Amos Bird](https://github.com/amosbird)). +* Rework and reintroduce the scalar subqueries cache to Materialized Views execution. [#33958](https://github.com/ClickHouse/ClickHouse/pull/33958) ([Raúl Marín](https://github.com/Algunenano)). +* Slightly improve performance of `ORDER BY` by adding x86-64 AVX-512 support for `memcmpSmall` functions to accelerate memory comparison. It works only if you compile ClickHouse by yourself. [#33706](https://github.com/ClickHouse/ClickHouse/pull/33706) ([hanqf-git](https://github.com/hanqf-git)). +* Improve `range_hashed` dictionary performance if for key there are a lot of intervals. Fixes [#23821](https://github.com/ClickHouse/ClickHouse/issues/23821). [#33516](https://github.com/ClickHouse/ClickHouse/pull/33516) ([Maksim Kita](https://github.com/kitaisreal)). +* For inserts and merges into S3, write files in parallel whenever possible (TODO: check if it's merged). [#33291](https://github.com/ClickHouse/ClickHouse/pull/33291) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve `clickhouse-keeper` performance and fix several memory leaks in NuRaft library. [#33329](https://github.com/ClickHouse/ClickHouse/pull/33329) ([alesapin](https://github.com/alesapin)). + +#### Improvement + +* Support asynchronous inserts in `clickhouse-client` for queries with inlined data. [#34267](https://github.com/ClickHouse/ClickHouse/pull/34267) ([Anton Popov](https://github.com/CurtizJ)). +* Functions `dictGet`, `dictHas` implicitly cast key argument to dictionary key structure, if they are different. [#33672](https://github.com/ClickHouse/ClickHouse/pull/33672) ([Maksim Kita](https://github.com/kitaisreal)). +* Improvements for `range_hashed` dictionaries. Improve performance of load time if there are multiple attributes. Allow to create a dictionary without attributes. Added option to specify strategy when intervals `start` and `end` have `Nullable` type `convert_null_range_bound_to_open` by default is `true`. Closes [#29791](https://github.com/ClickHouse/ClickHouse/issues/29791). Allow to specify `Float`, `Decimal`, `DateTime64`, `Int128`, `Int256`, `UInt128`, `UInt256` as range types. `RangeHashedDictionary` added support for range values that extend `Int64` type. Closes [#28322](https://github.com/ClickHouse/ClickHouse/issues/28322). Added option `range_lookup_strategy` to specify range lookup type `min`, `max` by default is `min` . Closes [#21647](https://github.com/ClickHouse/ClickHouse/issues/21647). Fixed allocated bytes calculations. Fixed type name in `system.dictionaries` in case of `ComplexKeyHashedDictionary`. [#33927](https://github.com/ClickHouse/ClickHouse/pull/33927) ([Maksim Kita](https://github.com/kitaisreal)). +* `flat`, `hashed`, `hashed_array` dictionaries now support creating with empty attributes, with support of reading the keys and using `dictHas`. Fixes [#33820](https://github.com/ClickHouse/ClickHouse/issues/33820). [#33918](https://github.com/ClickHouse/ClickHouse/pull/33918) ([Maksim Kita](https://github.com/kitaisreal)). +* Added support for `DateTime64` data type in dictionaries. [#33914](https://github.com/ClickHouse/ClickHouse/pull/33914) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to write `s3(url, access_key_id, secret_access_key)` (autodetect of data format and table structure, but with explicit credentials). [#34503](https://github.com/ClickHouse/ClickHouse/pull/34503) ([Kruglov Pavel](https://github.com/Avogar)). +* Added sending of the output format back to client like it's done in HTTP protocol as suggested in [#34362](https://github.com/ClickHouse/ClickHouse/issues/34362). Closes [#34362](https://github.com/ClickHouse/ClickHouse/issues/34362). [#34499](https://github.com/ClickHouse/ClickHouse/pull/34499) ([Vitaly Baranov](https://github.com/vitlibar)). +* Send ProfileEvents statistics in case of INSERT SELECT query (to display query metrics in `clickhouse-client` for this type of queries). [#34498](https://github.com/ClickHouse/ClickHouse/pull/34498) ([Dmitry Novik](https://github.com/novikd)). +* Recognize `.jsonl` extension for JSONEachRow format. [#34496](https://github.com/ClickHouse/ClickHouse/pull/34496) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve schema inference in clickhouse-local. Allow to write just `clickhouse-local -q "select * from table" < data.format`. [#34495](https://github.com/ClickHouse/ClickHouse/pull/34495) ([Kruglov Pavel](https://github.com/Avogar)). +* Privileges CREATE/ALTER/DROP ROW POLICY now can be granted on a table or on `database.*` as well as globally `*.*`. [#34489](https://github.com/ClickHouse/ClickHouse/pull/34489) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow to export arbitrary large files to `s3`. Add two new settings: `s3_upload_part_size_multiply_factor` and `s3_upload_part_size_multiply_parts_count_threshold`. Now each time `s3_upload_part_size_multiply_parts_count_threshold` uploaded to S3 from a single query `s3_min_upload_part_size` multiplied by `s3_upload_part_size_multiply_factor`. Fixes [#34244](https://github.com/ClickHouse/ClickHouse/issues/34244). [#34422](https://github.com/ClickHouse/ClickHouse/pull/34422) ([alesapin](https://github.com/alesapin)). +* Allow to skip not found (404) URLs for globs when using URL storage / table function. Also closes [#34359](https://github.com/ClickHouse/ClickHouse/issues/34359). [#34392](https://github.com/ClickHouse/ClickHouse/pull/34392) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Default input and output formats for `clickhouse-local` that can be overriden by --input-format and --output-format. Close [#30631](https://github.com/ClickHouse/ClickHouse/issues/30631). [#34352](https://github.com/ClickHouse/ClickHouse/pull/34352) ([李扬](https://github.com/taiyang-li)). +* Add options for `clickhouse-format`. Which close [#30528](https://github.com/ClickHouse/ClickHouse/issues/30528) - `max_query_size` - `max_parser_depth`. [#34349](https://github.com/ClickHouse/ClickHouse/pull/34349) ([李扬](https://github.com/taiyang-li)). +* Better handling of pre-inputs before client start. This is for [#34308](https://github.com/ClickHouse/ClickHouse/issues/34308). [#34336](https://github.com/ClickHouse/ClickHouse/pull/34336) ([Amos Bird](https://github.com/amosbird)). +* `REGEXP_MATCHES` and `REGEXP_REPLACE` function aliases for compatibility with PostgreSQL. Close [#30885](https://github.com/ClickHouse/ClickHouse/issues/30885). [#34334](https://github.com/ClickHouse/ClickHouse/pull/34334) ([李扬](https://github.com/taiyang-li)). +* Some servers expect a User-Agent header in their HTTP requests. A `User-Agent` header entry has been added to HTTP requests of the form: User-Agent: ClickHouse/VERSION_STRING. [#34330](https://github.com/ClickHouse/ClickHouse/pull/34330) ([Saad Ur Rahman](https://github.com/surahman)). +* Cancel merges before acquiring table lock for `TRUNCATE` query to avoid `DEADLOCK_AVOIDED` error in some cases. Fixes [#34302](https://github.com/ClickHouse/ClickHouse/issues/34302). [#34304](https://github.com/ClickHouse/ClickHouse/pull/34304) ([tavplubix](https://github.com/tavplubix)). +* Change severity of the "Cancelled merging parts" message in logs, because it's not an error. This closes [#34148](https://github.com/ClickHouse/ClickHouse/issues/34148). [#34232](https://github.com/ClickHouse/ClickHouse/pull/34232) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to compose PostgreSQL-style cast operator `::` with expressions using `[]` and `.` operators (array and tuple indexing). [#34229](https://github.com/ClickHouse/ClickHouse/pull/34229) ([Nikolay Degterinsky](https://github.com/evillique)). +* Recognize `YYYYMMDD-hhmmss` format in `parseDateTimeBestEffort` function. This closes [#34206](https://github.com/ClickHouse/ClickHouse/issues/34206). [#34208](https://github.com/ClickHouse/ClickHouse/pull/34208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow carriage return in the middle of the line while parsing by `Regexp` format. This closes [#34200](https://github.com/ClickHouse/ClickHouse/issues/34200). [#34205](https://github.com/ClickHouse/ClickHouse/pull/34205) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to parse dictionary's `PRIMARY KEY` as `PRIMARY KEY (id, value)`; previously supported only `PRIMARY KEY id, value`. Closes [#34135](https://github.com/ClickHouse/ClickHouse/issues/34135). [#34141](https://github.com/ClickHouse/ClickHouse/pull/34141) ([Maksim Kita](https://github.com/kitaisreal)). +* An optional argument for `splitByChar` to limit the number of resulting elements. close [#34081](https://github.com/ClickHouse/ClickHouse/issues/34081). [#34140](https://github.com/ClickHouse/ClickHouse/pull/34140) ([李扬](https://github.com/taiyang-li)). +* Improving the experience of multiple line editing for clickhouse-client. This is a follow-up of [#31123](https://github.com/ClickHouse/ClickHouse/pull/31123). [#34114](https://github.com/ClickHouse/ClickHouse/pull/34114) ([Amos Bird](https://github.com/amosbird)). +* Add `UUID` suport in `MsgPack` input/output format. [#34065](https://github.com/ClickHouse/ClickHouse/pull/34065) ([Kruglov Pavel](https://github.com/Avogar)). +* Tracing context (for OpenTelemetry) is now propagated from GRPC client metadata (this change is relevant for GRPC client-server protocol). [#34064](https://github.com/ClickHouse/ClickHouse/pull/34064) ([andremarianiello](https://github.com/andremarianiello)). +* Supports all types of `SYSTEM` queries with `ON CLUSTER` clause. [#34005](https://github.com/ClickHouse/ClickHouse/pull/34005) ([小路](https://github.com/nicelulu)). +* Improve memory accounting for queries that are using less than `max_untracker_memory`. [#34001](https://github.com/ClickHouse/ClickHouse/pull/34001) ([Azat Khuzhin](https://github.com/azat)). +* Fixed UTF-8 string case-insensitive search when lowercase and uppercase characters are represented by different number of bytes. Example is `ẞ` and `ß`. This closes [#7334](https://github.com/ClickHouse/ClickHouse/issues/7334). [#33992](https://github.com/ClickHouse/ClickHouse/pull/33992) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Detect format and schema from stdin in `clickhouse-local`. [#33960](https://github.com/ClickHouse/ClickHouse/pull/33960) ([Kruglov Pavel](https://github.com/Avogar)). +* Correctly handle the case of misconfiguration when multiple disks are using the same path on the filesystem. [#29072](https://github.com/ClickHouse/ClickHouse/issues/29072). [#33905](https://github.com/ClickHouse/ClickHouse/pull/33905) ([zhongyuankai](https://github.com/zhongyuankai)). +* Try every resolved IP address while getting S3 proxy. S3 proxies are rarely used, mostly in Yandex Cloud. [#33862](https://github.com/ClickHouse/ClickHouse/pull/33862) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support EXPLAIN AST CREATE FUNCTION query `EXPLAIN AST CREATE FUNCTION mycast AS (n) -> cast(n as String)` will return `EXPLAIN AST CREATE FUNCTION mycast AS n -> CAST(n, 'String')`. [#33819](https://github.com/ClickHouse/ClickHouse/pull/33819) ([李扬](https://github.com/taiyang-li)). +* Added support for cast from `Map(Key, Value)` to `Array(Tuple(Key, Value))`. [#33794](https://github.com/ClickHouse/ClickHouse/pull/33794) ([Maksim Kita](https://github.com/kitaisreal)). +* Add some improvements and fixes for `Bool` data type. Fixes [#33244](https://github.com/ClickHouse/ClickHouse/issues/33244). [#33737](https://github.com/ClickHouse/ClickHouse/pull/33737) ([Kruglov Pavel](https://github.com/Avogar)). +* Parse and store OpenTelemetry trace-id in big-endian order. [#33723](https://github.com/ClickHouse/ClickHouse/pull/33723) ([Frank Chen](https://github.com/FrankChen021)). +* Improvement for `fromUnixTimestamp64` family functions.. They now accept any integer value that can be converted to `Int64`. This closes: [#14648](https://github.com/ClickHouse/ClickHouse/issues/14648). [#33505](https://github.com/ClickHouse/ClickHouse/pull/33505) ([Andrey Zvonov](https://github.com/zvonand)). +* Reimplement `_shard_num` from constants (see [#7624](https://github.com/ClickHouse/ClickHouse/issues/7624)) with `shardNum()` function (seee [#27020](https://github.com/ClickHouse/ClickHouse/issues/27020)), to avoid possible issues (like those that had been found in [#16947](https://github.com/ClickHouse/ClickHouse/issues/16947)). [#33392](https://github.com/ClickHouse/ClickHouse/pull/33392) ([Azat Khuzhin](https://github.com/azat)). +* Enable binary arithmetic (plus, minus, multiply, division, least, greatest) between Decimal and Float. [#33355](https://github.com/ClickHouse/ClickHouse/pull/33355) ([flynn](https://github.com/ucasfl)). +* Respect cgroups limits in max_threads autodetection. [#33342](https://github.com/ClickHouse/ClickHouse/pull/33342) ([JaySon](https://github.com/JaySon-Huang)). +* Add new clickhouse-keeper setting `min_session_timeout_ms`. Now clickhouse-keeper will determine client session timeout according to `min_session_timeout_ms` and `session_timeout_ms` settings. [#33288](https://github.com/ClickHouse/ClickHouse/pull/33288) ([JackyWoo](https://github.com/JackyWoo)). +* Added `UUID` data type support for functions `hex` and `bin`. [#32170](https://github.com/ClickHouse/ClickHouse/pull/32170) ([Frank Chen](https://github.com/FrankChen021)). +* Fix reading of subcolumns with dots in their names. In particular fixed reading of `Nested` columns, if their element names contain dots (e.g ```Nested(`keys.name` String, `keys.id` UInt64, values UInt64)```). [#34228](https://github.com/ClickHouse/ClickHouse/pull/34228) ([Anton Popov](https://github.com/CurtizJ)). +* Fixes `parallel_view_processing = 0` not working when inserting into a table using `VALUES`. - Fixes `view_duration_ms` in the `query_views_log` not being set correctly for materialized views. [#34067](https://github.com/ClickHouse/ClickHouse/pull/34067) ([Raúl Marín](https://github.com/Algunenano)). +* Fix parsing tables structure from ZooKeeper: now metadata from ZooKeeper compared with local metadata in canonical form. It helps when canonical function names can change between ClickHouse versions. [#33933](https://github.com/ClickHouse/ClickHouse/pull/33933) ([sunny](https://github.com/sunny19930321)). +* Properly escape some characters for interaction with LDAP. [#33401](https://github.com/ClickHouse/ClickHouse/pull/33401) ([IlyaTsoi](https://github.com/IlyaTsoi)). + +#### Build/Testing/Packaging Improvement + +* Remove unbundled build support. [#33690](https://github.com/ClickHouse/ClickHouse/pull/33690) ([Azat Khuzhin](https://github.com/azat)). +* Ensure that tests don't depend on the result of non-stable sorting of equal elements. Added equal items ranges randomization in debug after sort to prevent issues when we rely on equal items sort order. [#34393](https://github.com/ClickHouse/ClickHouse/pull/34393) ([Maksim Kita](https://github.com/kitaisreal)). +* Add verbosity to a style check. [#34289](https://github.com/ClickHouse/ClickHouse/pull/34289) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove `clickhouse-test` debian package because it's obsolete. [#33948](https://github.com/ClickHouse/ClickHouse/pull/33948) ([Ilya Yatsishin](https://github.com/qoega)). +* Multiple improvements for build system to remove the possibility of occasionally using packages from the OS and to enforce hermetic builds. [#33695](https://github.com/ClickHouse/ClickHouse/pull/33695) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix (user-visible misbehaviour in official stable or prestable release) + +* Fixed the assertion in case of using `allow_experimental_parallel_reading_from_replicas` with `max_parallel_replicas` equals to 1. This fixes [#34525](https://github.com/ClickHouse/ClickHouse/issues/34525). [#34613](https://github.com/ClickHouse/ClickHouse/pull/34613) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix rare bug while reading of empty arrays, which could lead to `Data compressed with different methods` error. It can reproduce if you have mostly empty arrays, but not always. And reading is performed in backward direction with ORDER BY ... DESC. This error is extremely unlikely to happen. [#34327](https://github.com/ClickHouse/ClickHouse/pull/34327) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong result of `round`/`roundBankers` if integer values of small types are rounded. Closes [#33267](https://github.com/ClickHouse/ClickHouse/issues/33267). [#34562](https://github.com/ClickHouse/ClickHouse/pull/34562) ([李扬](https://github.com/taiyang-li)). +* Sometimes query cancellation did not work immediately when we were reading multiple files from s3 or HDFS. Fixes [#34301](https://github.com/ClickHouse/ClickHouse/issues/34301) Relates to [#34397](https://github.com/ClickHouse/ClickHouse/issues/34397). [#34539](https://github.com/ClickHouse/ClickHouse/pull/34539) ([Dmitry Novik](https://github.com/novikd)). +* Fix exception `Chunk should have AggregatedChunkInfo in MergingAggregatedTransform` (in case of `optimize_aggregation_in_order = 1` and `distributed_aggregation_memory_efficient = 0`). Fixes [#34526](https://github.com/ClickHouse/ClickHouse/issues/34526). [#34532](https://github.com/ClickHouse/ClickHouse/pull/34532) ([Anton Popov](https://github.com/CurtizJ)). +* Fix comparison between integers and floats in index analysis. Previously it could lead to skipping some granules for reading by mistake. Fixes [#34493](https://github.com/ClickHouse/ClickHouse/issues/34493). [#34528](https://github.com/ClickHouse/ClickHouse/pull/34528) ([Anton Popov](https://github.com/CurtizJ)). +* Fix compression support in URL engine. [#34524](https://github.com/ClickHouse/ClickHouse/pull/34524) ([Frank Chen](https://github.com/FrankChen021)). +* Fix possible error 'file_size: Operation not supported' in files' schema autodetection. [#34479](https://github.com/ClickHouse/ClickHouse/pull/34479) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes possible race with table deletion. [#34416](https://github.com/ClickHouse/ClickHouse/pull/34416) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible error `Cannot convert column Function to mask` in short circuit function evaluation. Closes [#34171](https://github.com/ClickHouse/ClickHouse/issues/34171). [#34415](https://github.com/ClickHouse/ClickHouse/pull/34415) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix potential crash when doing schema inference from url source. Closes [#34147](https://github.com/ClickHouse/ClickHouse/issues/34147). [#34405](https://github.com/ClickHouse/ClickHouse/pull/34405) ([Kruglov Pavel](https://github.com/Avogar)). +* For UDFs access permissions were checked for database level instead of global level as it should be. Closes [#34281](https://github.com/ClickHouse/ClickHouse/issues/34281). [#34404](https://github.com/ClickHouse/ClickHouse/pull/34404) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix wrong engine syntax in result of `SHOW CREATE DATABASE` query for databases with engine `Memory`. This closes [#34335](https://github.com/ClickHouse/ClickHouse/issues/34335). [#34345](https://github.com/ClickHouse/ClickHouse/pull/34345) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed a couple of extremely rare race conditions that might lead to broken state of replication queue and "intersecting parts" error. [#34297](https://github.com/ClickHouse/ClickHouse/pull/34297) ([tavplubix](https://github.com/tavplubix)). +* Fix progress bar width. It was incorrectly rounded to integer number of characters. [#34275](https://github.com/ClickHouse/ClickHouse/pull/34275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix current_user/current_address client information fields for inter-server communication (before this patch current_user/current_address will be preserved from the previous query). [#34263](https://github.com/ClickHouse/ClickHouse/pull/34263) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak in case of some Exception during query processing with `optimize_aggregation_in_order=1`. [#34234](https://github.com/ClickHouse/ClickHouse/pull/34234) ([Azat Khuzhin](https://github.com/azat)). +* Fix metric `Query`, which shows the number of executing queries. In last several releases it was always 0. [#34224](https://github.com/ClickHouse/ClickHouse/pull/34224) ([Anton Popov](https://github.com/CurtizJ)). +* Fix schema inference for table runction `s3`. [#34186](https://github.com/ClickHouse/ClickHouse/pull/34186) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare and benign race condition in `HDFS`, `S3` and `URL` storage engines which can lead to additional connections. [#34172](https://github.com/ClickHouse/ClickHouse/pull/34172) ([alesapin](https://github.com/alesapin)). +* Fix bug which can rarely lead to error "Cannot read all data" while reading LowCardinality columns of MergeTree table engines family which stores data on remote file system like S3 (virtual filesystem over s3 is an experimental feature that is not ready for production). [#34139](https://github.com/ClickHouse/ClickHouse/pull/34139) ([alesapin](https://github.com/alesapin)). +* Fix inserts to distributed tables in case of a change of native protocol. The last change was in the version 22.1, so there may be some failures of inserts to distributed tables after upgrade to that version. [#34132](https://github.com/ClickHouse/ClickHouse/pull/34132) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible data race in `File` table engine that was introduced in [#33960](https://github.com/ClickHouse/ClickHouse/pull/33960). Closes [#34111](https://github.com/ClickHouse/ClickHouse/issues/34111). [#34113](https://github.com/ClickHouse/ClickHouse/pull/34113) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed minor race condition that might cause "intersecting parts" error in extremely rare cases after ZooKeeper connection loss. [#34096](https://github.com/ClickHouse/ClickHouse/pull/34096) ([tavplubix](https://github.com/tavplubix)). +* Fix asynchronous inserts with `Native` format. [#34068](https://github.com/ClickHouse/ClickHouse/pull/34068) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug which lead to inability for server to start when both replicated access storage and keeper (embedded in clickhouse-server) are used. Introduced two settings for keeper socket timeout instead of settings from default user: `keeper_server.socket_receive_timeout_sec` and `keeper_server.socket_send_timeout_sec`. Fixes [#33973](https://github.com/ClickHouse/ClickHouse/issues/33973). [#33988](https://github.com/ClickHouse/ClickHouse/pull/33988) ([alesapin](https://github.com/alesapin)). +* Fix segfault while parsing ORC file with corrupted footer. Closes [#33797](https://github.com/ClickHouse/ClickHouse/issues/33797). [#33984](https://github.com/ClickHouse/ClickHouse/pull/33984) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix parsing IPv6 from query parameter (prepared statements) and fix IPv6 to string conversion. Closes [#33928](https://github.com/ClickHouse/ClickHouse/issues/33928). [#33971](https://github.com/ClickHouse/ClickHouse/pull/33971) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash while reading of nested tuples. Fixes [#33838](https://github.com/ClickHouse/ClickHouse/issues/33838). [#33956](https://github.com/ClickHouse/ClickHouse/pull/33956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix usage of functions `array` and `tuple` with literal arguments in distributed queries. Previously it could lead to `Not found columns` exception. [#33938](https://github.com/ClickHouse/ClickHouse/pull/33938) ([Anton Popov](https://github.com/CurtizJ)). +* Aggregate function combinator `-If` did not correctly process `Nullable` filter argument. This closes [#27073](https://github.com/ClickHouse/ClickHouse/issues/27073). [#33920](https://github.com/ClickHouse/ClickHouse/pull/33920) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential race condition when doing remote disk read (virtual filesystem over s3 is an experimental feature that is not ready for production). [#33912](https://github.com/ClickHouse/ClickHouse/pull/33912) ([Amos Bird](https://github.com/amosbird)). +* Fix crash if SQL UDF is created with lambda with non identifier arguments. Closes [#33866](https://github.com/ClickHouse/ClickHouse/issues/33866). [#33868](https://github.com/ClickHouse/ClickHouse/pull/33868) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix usage of sparse columns (which can be enabled by experimental setting `ratio_of_defaults_for_sparse_serialization`). [#33849](https://github.com/ClickHouse/ClickHouse/pull/33849) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `replica is not readonly` logical error on `SYSTEM RESTORE REPLICA` query when replica is actually readonly. Fixes [#33806](https://github.com/ClickHouse/ClickHouse/issues/33806). [#33847](https://github.com/ClickHouse/ClickHouse/pull/33847) ([tavplubix](https://github.com/tavplubix)). +* Fix memory leak in `clickhouse-keeper` in case of compression is used (default). [#33840](https://github.com/ClickHouse/ClickHouse/pull/33840) ([Azat Khuzhin](https://github.com/azat)). +* Fix index analysis with no common types available. [#33833](https://github.com/ClickHouse/ClickHouse/pull/33833) ([Amos Bird](https://github.com/amosbird)). +* Fix schema inference for `JSONEachRow` and `JSONCompactEachRow`. [#33830](https://github.com/ClickHouse/ClickHouse/pull/33830) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix usage of external dictionaries with `redis` source and large number of keys. [#33804](https://github.com/ClickHouse/ClickHouse/pull/33804) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug in client that led to 'Connection reset by peer' in server. Closes [#33309](https://github.com/ClickHouse/ClickHouse/issues/33309). [#33790](https://github.com/ClickHouse/ClickHouse/pull/33790) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix parsing query INSERT INTO ... VALUES SETTINGS ... (...), ... [#33776](https://github.com/ClickHouse/ClickHouse/pull/33776) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug of check table when creating data part with wide format and projection. [#33774](https://github.com/ClickHouse/ClickHouse/pull/33774) ([李扬](https://github.com/taiyang-li)). +* Fix tiny race between count() and INSERT/merges/... in MergeTree (it is possible to return incorrect number of rows for SELECT with optimize_trivial_count_query). [#33753](https://github.com/ClickHouse/ClickHouse/pull/33753) ([Azat Khuzhin](https://github.com/azat)). +* Throw exception when directory listing request has failed in storage HDFS. [#33724](https://github.com/ClickHouse/ClickHouse/pull/33724) ([LiuNeng](https://github.com/liuneng1994)). +* Fix mutation when table contains projections. This fixes [#33010](https://github.com/ClickHouse/ClickHouse/issues/33010). This fixes [#33275](https://github.com/ClickHouse/ClickHouse/issues/33275). [#33679](https://github.com/ClickHouse/ClickHouse/pull/33679) ([Amos Bird](https://github.com/amosbird)). +* Correctly determine current database if `CREATE TEMPORARY TABLE AS SELECT` is queried inside a named HTTP session. This is a very rare use case. This closes [#8340](https://github.com/ClickHouse/ClickHouse/issues/8340). [#33676](https://github.com/ClickHouse/ClickHouse/pull/33676) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow some queries with sorting, LIMIT BY, ARRAY JOIN and lambda functions. This closes [#7462](https://github.com/ClickHouse/ClickHouse/issues/7462). [#33675](https://github.com/ClickHouse/ClickHouse/pull/33675) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug in "zero copy replication" (a feature that is under development and should not be used in production) which lead to data duplication in case of TTL move. Fixes [#33643](https://github.com/ClickHouse/ClickHouse/issues/33643). [#33642](https://github.com/ClickHouse/ClickHouse/pull/33642) ([alesapin](https://github.com/alesapin)). +* Fix `Chunk should have AggregatedChunkInfo in GroupingAggregatedTransform` (in case of `optimize_aggregation_in_order = 1`). [#33637](https://github.com/ClickHouse/ClickHouse/pull/33637) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Bad cast from type ... to DB::DataTypeArray` which may happen when table has `Nested` column with dots in name, and default value is generated for it (e.g. during insert, when column is not listed). Continuation of [#28762](https://github.com/ClickHouse/ClickHouse/issues/28762). [#33588](https://github.com/ClickHouse/ClickHouse/pull/33588) ([Alexey Pavlenko](https://github.com/alexeypavlenko)). +* Export into `lz4` files has been fixed. Closes [#31421](https://github.com/ClickHouse/ClickHouse/issues/31421). [#31862](https://github.com/ClickHouse/ClickHouse/pull/31862) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix potential crash if `group_by_overflow_mode` was set to `any` (approximate GROUP BY) and aggregation was performed by single column of type `LowCardinality`. [#34506](https://github.com/ClickHouse/ClickHouse/pull/34506) ([DR](https://github.com/freedomDR)). +* Fix inserting to temporary tables via gRPC client-server protocol. Fixes [#34347](https://github.com/ClickHouse/ClickHouse/issues/34347), issue `#2`. [#34364](https://github.com/ClickHouse/ClickHouse/pull/34364) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix issue [#19429](https://github.com/ClickHouse/ClickHouse/issues/19429). [#34225](https://github.com/ClickHouse/ClickHouse/pull/34225) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix issue [#18206](https://github.com/ClickHouse/ClickHouse/issues/18206). [#33977](https://github.com/ClickHouse/ClickHouse/pull/33977) ([Vitaly Baranov](https://github.com/vitlibar)). +* This PR allows using multiple LDAP storages in the same list of user directories. It worked earlier but was broken because LDAP tests are disabled (they are part of the testflows tests). [#33574](https://github.com/ClickHouse/ClickHouse/pull/33574) ([Vitaly Baranov](https://github.com/vitlibar)). + + +### ClickHouse release v22.1, 2022-01-18 + +#### Upgrade Notes + +* The functions `left` and `right` were previously implemented in parser and now full-featured. Distributed queries with `left` or `right` functions without aliases may throw exception if cluster contains different versions of clickhouse-server. If you are upgrading your cluster and encounter this error, you should finish upgrading your cluster to ensure all nodes have the same version. Also you can add aliases (`AS something`) to the columns in your queries to avoid this issue. [#33407](https://github.com/ClickHouse/ClickHouse/pull/33407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Resource usage by scalar subqueries is fully accounted since this version. With this change, rows read in scalar subqueries are now reported in the query_log. If the scalar subquery is cached (repeated or called for several rows) the rows read are only counted once. This change allows KILLing queries and reporting progress while they are executing scalar subqueries. [#32271](https://github.com/ClickHouse/ClickHouse/pull/32271) ([Raúl Marín](https://github.com/Algunenano)). + +#### New Feature + +* Implement data schema inference for input formats. Allow to skip structure (or write just `auto`) in table functions `file`, `url`, `s3`, `hdfs` and in parameters of `clickhouse-local` . Allow to skip structure in create query for table engines `File`, `HDFS`, `S3`, `URL`, `Merge`, `Buffer`, `Distributed` and `ReplicatedMergeTree` (if we add new replicas). [#32455](https://github.com/ClickHouse/ClickHouse/pull/32455) ([Kruglov Pavel](https://github.com/Avogar)). +* Detect format by file extension in `file`/`hdfs`/`s3`/`url` table functions and `HDFS`/`S3`/`URL` table engines and also for `SELECT INTO OUTFILE` and `INSERT FROM INFILE` [#33565](https://github.com/ClickHouse/ClickHouse/pull/33565) ([Kruglov Pavel](https://github.com/Avogar)). Close [#30918](https://github.com/ClickHouse/ClickHouse/issues/30918). [#33443](https://github.com/ClickHouse/ClickHouse/pull/33443) ([OnePiece](https://github.com/zhongyuankai)). +* A tool for collecting diagnostics data if you need support. [#33175](https://github.com/ClickHouse/ClickHouse/pull/33175) ([Alexander Burmak](https://github.com/Alex-Burmak)). +* Automatic cluster discovery via Zoo/Keeper. It allows to add replicas to the cluster without changing configuration on every server. [#31442](https://github.com/ClickHouse/ClickHouse/pull/31442) ([vdimir](https://github.com/vdimir)). +* Implement hive table engine to access apache hive from clickhouse. This implements: [#29245](https://github.com/ClickHouse/ClickHouse/issues/29245). [#31104](https://github.com/ClickHouse/ClickHouse/pull/31104) ([taiyang-li](https://github.com/taiyang-li)). +* Add aggregate functions `cramersV`, `cramersVBiasCorrected`, `theilsU` and `contingency`. These functions calculate dependency (measure of association) between categorical values. All these functions are using cross-tab (histogram on pairs) for implementation. You can imagine it like a correlation coefficient but for any discrete values (not necessary numbers). [#33366](https://github.com/ClickHouse/ClickHouse/pull/33366) ([alexey-milovidov](https://github.com/alexey-milovidov)). Initial implementation by [Vanyok-All-is-OK](https://github.com/Vanyok-All-is-OK) and [antikvist](https://github.com/antikvist). +* Added table function `hdfsCluster` which allows processing files from HDFS in parallel from many nodes in a specified cluster, similarly to `s3Cluster`. [#32400](https://github.com/ClickHouse/ClickHouse/pull/32400) ([Zhichang Yu](https://github.com/yuzhichang)). +* Adding support for disks backed by Azure Blob Storage, in a similar way it has been done for disks backed by AWS S3. [#31505](https://github.com/ClickHouse/ClickHouse/pull/31505) ([Jakub Kuklis](https://github.com/jkuklis)). +* Allow `COMMENT` in `CREATE VIEW` (for all VIEW kinds). [#31062](https://github.com/ClickHouse/ClickHouse/pull/31062) ([Vasily Nemkov](https://github.com/Enmk)). +* Dynamically reinitialize listening ports and protocols when configuration changes. [#30549](https://github.com/ClickHouse/ClickHouse/pull/30549) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Added `left`, `right`, `leftUTF8`, `rightUTF8` functions. Fix error in implementation of `substringUTF8` function with negative offset (offset from the end of string). [#33407](https://github.com/ClickHouse/ClickHouse/pull/33407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new functions for `H3` coordinate system: `h3HexAreaKm2`, `h3CellAreaM2`, `h3CellAreaRads2`. [#33479](https://github.com/ClickHouse/ClickHouse/pull/33479) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `MONTHNAME` function. [#33436](https://github.com/ClickHouse/ClickHouse/pull/33436) ([usurai](https://github.com/usurai)). +* Added function `arrayLast`. Closes [#33390](https://github.com/ClickHouse/ClickHouse/issues/33390). [#33415](https://github.com/ClickHouse/ClickHouse/pull/33415) Added function `arrayLastIndex`. [#33465](https://github.com/ClickHouse/ClickHouse/pull/33465) ([Maksim Kita](https://github.com/kitaisreal)). +* Add function `decodeURLFormComponent` slightly different to `decodeURLComponent`. Close [#10298](https://github.com/ClickHouse/ClickHouse/issues/10298). [#33451](https://github.com/ClickHouse/ClickHouse/pull/33451) ([SuperDJY](https://github.com/cmsxbc)). +* Allow to split `GraphiteMergeTree` rollup rules for plain/tagged metrics (optional rule_type field). [#33494](https://github.com/ClickHouse/ClickHouse/pull/33494) ([Michail Safronov](https://github.com/msaf1980)). + + +#### Performance Improvement + +* Support moving conditions to `PREWHERE` (setting `optimize_move_to_prewhere`) for tables of `Merge` engine if its all underlying tables supports `PREWHERE`. [#33300](https://github.com/ClickHouse/ClickHouse/pull/33300) ([Anton Popov](https://github.com/CurtizJ)). +* More efficient handling of globs for URL storage. Now you can easily query million URLs in parallel with retries. Closes [#32866](https://github.com/ClickHouse/ClickHouse/issues/32866). [#32907](https://github.com/ClickHouse/ClickHouse/pull/32907) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid exponential backtracking in parser. This closes [#20158](https://github.com/ClickHouse/ClickHouse/issues/20158). [#33481](https://github.com/ClickHouse/ClickHouse/pull/33481) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Abuse of `untuple` function was leading to exponential complexity of query analysis (found by fuzzer). This closes [#33297](https://github.com/ClickHouse/ClickHouse/issues/33297). [#33445](https://github.com/ClickHouse/ClickHouse/pull/33445) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce allocated memory for dictionaries with string attributes. [#33466](https://github.com/ClickHouse/ClickHouse/pull/33466) ([Maksim Kita](https://github.com/kitaisreal)). +* Slight performance improvement of `reinterpret` function. [#32587](https://github.com/ClickHouse/ClickHouse/pull/32587) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Non significant change. In extremely rare cases when data part is lost on every replica, after merging of some data parts, the subsequent queries may skip less amount of partitions during partition pruning. This hardly affects anything. [#32220](https://github.com/ClickHouse/ClickHouse/pull/32220) ([Azat Khuzhin](https://github.com/azat)). +* Improve `clickhouse-keeper` writing performance by optimization the size calculation logic. [#32366](https://github.com/ClickHouse/ClickHouse/pull/32366) ([zhanglistar](https://github.com/zhanglistar)). +* Optimize single part projection materialization. This closes [#31669](https://github.com/ClickHouse/ClickHouse/issues/31669). [#31885](https://github.com/ClickHouse/ClickHouse/pull/31885) ([Amos Bird](https://github.com/amosbird)). +* Improve query performance of system tables. [#33312](https://github.com/ClickHouse/ClickHouse/pull/33312) ([OnePiece](https://github.com/zhongyuankai)). +* Optimize selecting of MergeTree parts that can be moved between volumes. [#33225](https://github.com/ClickHouse/ClickHouse/pull/33225) ([OnePiece](https://github.com/zhongyuankai)). +* Fix `sparse_hashed` dict performance with sequential keys (wrong hash function). [#32536](https://github.com/ClickHouse/ClickHouse/pull/32536) ([Azat Khuzhin](https://github.com/azat)). + + +#### Experimental Feature + +* Parallel reading from multiple replicas within a shard during distributed query without using sample key. To enable this, set `allow_experimental_parallel_reading_from_replicas = 1` and `max_parallel_replicas` to any number. This closes [#26748](https://github.com/ClickHouse/ClickHouse/issues/26748). [#29279](https://github.com/ClickHouse/ClickHouse/pull/29279) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implemented sparse serialization. It can reduce usage of disk space and improve performance of some queries for columns, which contain a lot of default (zero) values. It can be enabled by setting `ratio_for_sparse_serialization`. Sparse serialization will be chosen dynamically for column, if it has ratio of number of default values to number of all values above that threshold. Serialization (default or sparse) will be fixed for every column in part, but may varies between parts. [#22535](https://github.com/ClickHouse/ClickHouse/pull/22535) ([Anton Popov](https://github.com/CurtizJ)). +* Add "TABLE OVERRIDE" feature for customizing MaterializedMySQL table schemas. [#32325](https://github.com/ClickHouse/ClickHouse/pull/32325) ([Stig Bakken](https://github.com/stigsb)). +* Add `EXPLAIN TABLE OVERRIDE` query. [#32836](https://github.com/ClickHouse/ClickHouse/pull/32836) ([Stig Bakken](https://github.com/stigsb)). +* Support TABLE OVERRIDE clause for MaterializedPostgreSQL. RFC: [#31480](https://github.com/ClickHouse/ClickHouse/issues/31480). [#32749](https://github.com/ClickHouse/ClickHouse/pull/32749) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Change ZooKeeper path for zero-copy marks for shared data. Note that "zero-copy replication" is non-production feature (in early stages of development) that you shouldn't use anyway. But in case if you have used it, let you keep in mind this change. [#32061](https://github.com/ClickHouse/ClickHouse/pull/32061) ([ianton-ru](https://github.com/ianton-ru)). +* Events clause support for WINDOW VIEW watch query. [#32607](https://github.com/ClickHouse/ClickHouse/pull/32607) ([vxider](https://github.com/Vxider)). +* Fix ACL with explicit digit hash in `clickhouse-keeper`: now the behavior consistent with ZooKeeper and generated digest is always accepted. [#33249](https://github.com/ClickHouse/ClickHouse/pull/33249) ([小路](https://github.com/nicelulu)). [#33246](https://github.com/ClickHouse/ClickHouse/pull/33246). +* Fix unexpected projection removal when detaching parts. [#32067](https://github.com/ClickHouse/ClickHouse/pull/32067) ([Amos Bird](https://github.com/amosbird)). + + +#### Improvement + +* Now date time conversion functions that generates time before `1970-01-01 00:00:00` will be saturated to zero instead of overflow. [#29953](https://github.com/ClickHouse/ClickHouse/pull/29953) ([Amos Bird](https://github.com/amosbird)). It also fixes a bug in index analysis if date truncation function would yield result before the Unix epoch. +* Always display resource usage (total CPU usage, total RAM usage and max RAM usage per host) in client. [#33271](https://github.com/ClickHouse/ClickHouse/pull/33271) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `Bool` type serialization and deserialization, check the range of values. [#32984](https://github.com/ClickHouse/ClickHouse/pull/32984) ([Kruglov Pavel](https://github.com/Avogar)). +* If an invalid setting is defined using the `SET` query or using the query parameters in the HTTP request, error message will contain suggestions that are similar to the invalid setting string (if any exists). [#32946](https://github.com/ClickHouse/ClickHouse/pull/32946) ([Antonio Andelic](https://github.com/antonio2368)). +* Support hints for mistyped setting names for clickhouse-client and clickhouse-local. Closes [#32237](https://github.com/ClickHouse/ClickHouse/issues/32237). [#32841](https://github.com/ClickHouse/ClickHouse/pull/32841) ([凌涛](https://github.com/lingtaolf)). +* Allow to use virtual columns in Materialized Views. Close [#11210](https://github.com/ClickHouse/ClickHouse/issues/11210). [#33482](https://github.com/ClickHouse/ClickHouse/pull/33482) ([OnePiece](https://github.com/zhongyuankai)). +* Add config to disable IPv6 in clickhouse-keeper if needed. This close [#33381](https://github.com/ClickHouse/ClickHouse/issues/33381). [#33450](https://github.com/ClickHouse/ClickHouse/pull/33450) ([Wu Xueyang](https://github.com/wuxueyang96)). +* Add more info to `system.build_options` about current git revision. [#33431](https://github.com/ClickHouse/ClickHouse/pull/33431) ([taiyang-li](https://github.com/taiyang-li)). +* `clickhouse-local`: track memory under `--max_memory_usage_in_client` option. [#33341](https://github.com/ClickHouse/ClickHouse/pull/33341) ([Azat Khuzhin](https://github.com/azat)). +* Allow negative intervals in function `intervalLengthSum`. Their length will be added as well. This closes [#33323](https://github.com/ClickHouse/ClickHouse/issues/33323). [#33335](https://github.com/ClickHouse/ClickHouse/pull/33335) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `LineAsString` can be used as output format. This closes [#30919](https://github.com/ClickHouse/ClickHouse/issues/30919). [#33331](https://github.com/ClickHouse/ClickHouse/pull/33331) ([Sergei Trifonov](https://github.com/serxa)). +* Support `` in cluster configuration, as an alternative form of `1`. Close [#33270](https://github.com/ClickHouse/ClickHouse/issues/33270). [#33330](https://github.com/ClickHouse/ClickHouse/pull/33330) ([SuperDJY](https://github.com/cmsxbc)). +* Pressing Ctrl+C twice will terminate `clickhouse-benchmark` immediately without waiting for in-flight queries. This closes [#32586](https://github.com/ClickHouse/ClickHouse/issues/32586). [#33303](https://github.com/ClickHouse/ClickHouse/pull/33303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support Unix timestamp with milliseconds in `parseDateTimeBestEffort` function. [#33276](https://github.com/ClickHouse/ClickHouse/pull/33276) ([Ben](https://github.com/benbiti)). +* Allow to cancel query while reading data from external table in the formats: `Arrow` / `Parquet` / `ORC` - it failed to be cancelled it case of big files and setting input_format_allow_seeks as false. Closes [#29678](https://github.com/ClickHouse/ClickHouse/issues/29678). [#33238](https://github.com/ClickHouse/ClickHouse/pull/33238) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If table engine supports `SETTINGS` clause, allow to pass the settings as key-value or via config. Add this support for MySQL. [#33231](https://github.com/ClickHouse/ClickHouse/pull/33231) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly prevent Nullable primary keys if necessary. This is for [#32780](https://github.com/ClickHouse/ClickHouse/issues/32780). [#33218](https://github.com/ClickHouse/ClickHouse/pull/33218) ([Amos Bird](https://github.com/amosbird)). +* Add retry for `PostgreSQL` connections in case nothing has been fetched yet. Closes [#33199](https://github.com/ClickHouse/ClickHouse/issues/33199). [#33209](https://github.com/ClickHouse/ClickHouse/pull/33209) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Validate config keys for external dictionaries. [#33095](https://github.com/ClickHouse/ClickHouse/issues/33095#issuecomment-1000577517). [#33130](https://github.com/ClickHouse/ClickHouse/pull/33130) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Send profile info inside `clickhouse-local`. Closes [#33093](https://github.com/ClickHouse/ClickHouse/issues/33093). [#33097](https://github.com/ClickHouse/ClickHouse/pull/33097) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Short circuit evaluation: support for function `throwIf`. Closes [#32969](https://github.com/ClickHouse/ClickHouse/issues/32969). [#32973](https://github.com/ClickHouse/ClickHouse/pull/32973) ([Maksim Kita](https://github.com/kitaisreal)). +* (This only happens in unofficial builds). Fixed segfault when inserting data into compressed Decimal, String, FixedString and Array columns. This closes [#32939](https://github.com/ClickHouse/ClickHouse/issues/32939). [#32940](https://github.com/ClickHouse/ClickHouse/pull/32940) ([N. Kolotov](https://github.com/nkolotov)). +* Added support for specifying subquery as SQL user defined function. Example: `CREATE FUNCTION test AS () -> (SELECT 1)`. Closes [#30755](https://github.com/ClickHouse/ClickHouse/issues/30755). [#32758](https://github.com/ClickHouse/ClickHouse/pull/32758) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve gRPC compression support for [#28671](https://github.com/ClickHouse/ClickHouse/issues/28671). [#32747](https://github.com/ClickHouse/ClickHouse/pull/32747) ([Vitaly Baranov](https://github.com/vitlibar)). +* Flush all In-Memory data parts when WAL is not enabled while shutdown server or detaching table. [#32742](https://github.com/ClickHouse/ClickHouse/pull/32742) ([nauta](https://github.com/nautaa)). +* Allow to control connection timeouts for MySQL (previously was supported only for dictionary source). Closes [#16669](https://github.com/ClickHouse/ClickHouse/issues/16669). Previously default connect_timeout was rather small, now it is configurable. [#32734](https://github.com/ClickHouse/ClickHouse/pull/32734) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support `authSource` option for storage `MongoDB`. Closes [#32594](https://github.com/ClickHouse/ClickHouse/issues/32594). [#32702](https://github.com/ClickHouse/ClickHouse/pull/32702) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support `Date32` type in `genarateRandom` table function. [#32643](https://github.com/ClickHouse/ClickHouse/pull/32643) ([nauta](https://github.com/nautaa)). +* Add settings `max_concurrent_select_queries` and `max_concurrent_insert_queries` for control concurrent queries by query kind. Close [#3575](https://github.com/ClickHouse/ClickHouse/issues/3575). [#32609](https://github.com/ClickHouse/ClickHouse/pull/32609) ([SuperDJY](https://github.com/cmsxbc)). +* Improve handling nested structures with missing columns while reading data in `Protobuf` format. Follow-up to https://github.com/ClickHouse/ClickHouse/pull/31988. [#32531](https://github.com/ClickHouse/ClickHouse/pull/32531) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow empty credentials for `MongoDB` engine. Closes [#26267](https://github.com/ClickHouse/ClickHouse/issues/26267). [#32460](https://github.com/ClickHouse/ClickHouse/pull/32460) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable some optimizations for window functions that may lead to exceptions. Closes [#31535](https://github.com/ClickHouse/ClickHouse/issues/31535). Closes [#31620](https://github.com/ClickHouse/ClickHouse/issues/31620). [#32453](https://github.com/ClickHouse/ClickHouse/pull/32453) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allows to connect to MongoDB 5.0. Closes [#31483](https://github.com/ClickHouse/ClickHouse/issues/31483),. [#32416](https://github.com/ClickHouse/ClickHouse/pull/32416) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Enable comparison between `Decimal` and `Float`. Closes [#22626](https://github.com/ClickHouse/ClickHouse/issues/22626). [#31966](https://github.com/ClickHouse/ClickHouse/pull/31966) ([flynn](https://github.com/ucasFL)). +* Added settings `command_read_timeout`, `command_write_timeout` for `StorageExecutable`, `StorageExecutablePool`, `ExecutableDictionary`, `ExecutablePoolDictionary`, `ExecutableUserDefinedFunctions`. Setting `command_read_timeout` controls timeout for reading data from command stdout in milliseconds. Setting `command_write_timeout` timeout for writing data to command stdin in milliseconds. Added settings `command_termination_timeout` for `ExecutableUserDefinedFunction`, `ExecutableDictionary`, `StorageExecutable`. Added setting `execute_direct` for `ExecutableUserDefinedFunction`, by default true. Added setting `execute_direct` for `ExecutableDictionary`, `ExecutablePoolDictionary`, by default false. [#30957](https://github.com/ClickHouse/ClickHouse/pull/30957) ([Maksim Kita](https://github.com/kitaisreal)). +* Bitmap aggregate functions will give correct result for out of range argument instead of wraparound. [#33127](https://github.com/ClickHouse/ClickHouse/pull/33127) ([DR](https://github.com/freedomDR)). +* Fix parsing incorrect queries with `FROM INFILE` statement. [#33521](https://github.com/ClickHouse/ClickHouse/pull/33521) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't allow to write into `S3` if path contains globs. [#33142](https://github.com/ClickHouse/ClickHouse/pull/33142) ([Kruglov Pavel](https://github.com/Avogar)). +* `--echo` option was not used by `clickhouse-client` in batch mode with single query. [#32843](https://github.com/ClickHouse/ClickHouse/pull/32843) ([N. Kolotov](https://github.com/nkolotov)). +* Use `--database` option for clickhouse-local. [#32797](https://github.com/ClickHouse/ClickHouse/pull/32797) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix surprisingly bad code in SQL ordinary function `file`. Now it supports symlinks. [#32640](https://github.com/ClickHouse/ClickHouse/pull/32640) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Updating `modification_time` for data part in `system.parts` after part movement [#32964](https://github.com/ClickHouse/ClickHouse/issues/32964). [#32965](https://github.com/ClickHouse/ClickHouse/pull/32965) ([save-my-heart](https://github.com/save-my-heart)). +* Potential issue, cannot be exploited: integer overflow may happen in array resize. [#33024](https://github.com/ClickHouse/ClickHouse/pull/33024) ([varadarajkumar](https://github.com/varadarajkumar)). + + +#### Build/Testing/Packaging Improvement + +* Add packages, functional tests and Docker builds for AArch64 (ARM) version of ClickHouse. [#32911](https://github.com/ClickHouse/ClickHouse/pull/32911) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). [#32415](https://github.com/ClickHouse/ClickHouse/pull/32415) +* Prepare ClickHouse to be built with musl-libc. It is not enabled by default. [#33134](https://github.com/ClickHouse/ClickHouse/pull/33134) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make installation script working on FreeBSD. This closes [#33384](https://github.com/ClickHouse/ClickHouse/issues/33384). [#33418](https://github.com/ClickHouse/ClickHouse/pull/33418) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `actionlint` for GitHub Actions workflows and verify workflow files via `act --list` to check the correct workflow syntax. [#33612](https://github.com/ClickHouse/ClickHouse/pull/33612) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add more tests for the nullable primary key feature. Add more tests with different types and merge tree kinds, plus randomly generated data. [#33228](https://github.com/ClickHouse/ClickHouse/pull/33228) ([Amos Bird](https://github.com/amosbird)). +* Add a simple tool to visualize flaky tests in web browser. [#33185](https://github.com/ClickHouse/ClickHouse/pull/33185) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable hermetic build for shared builds. This is mainly for developers. [#32968](https://github.com/ClickHouse/ClickHouse/pull/32968) ([Amos Bird](https://github.com/amosbird)). +* Update `libc++` and `libc++abi` to the latest. [#32484](https://github.com/ClickHouse/ClickHouse/pull/32484) ([Raúl Marín](https://github.com/Algunenano)). +* Added integration test for external .NET client ([ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client)). [#23230](https://github.com/ClickHouse/ClickHouse/pull/23230) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)). +* Inject git information into clickhouse binary file. So we can get source code revision easily from clickhouse binary file. [#33124](https://github.com/ClickHouse/ClickHouse/pull/33124) ([taiyang-li](https://github.com/taiyang-li)). +* Remove obsolete code from ConfigProcessor. Yandex specific code is not used anymore. The code contained one minor defect. This defect was reported by [Mallik Hassan](https://github.com/SadiHassan) in [#33032](https://github.com/ClickHouse/ClickHouse/issues/33032). This closes [#33032](https://github.com/ClickHouse/ClickHouse/issues/33032). [#33026](https://github.com/ClickHouse/ClickHouse/pull/33026) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Several fixes for format parsing. This is relevant if `clickhouse-server` is open for write access to adversary. Specifically crafted input data for `Native` format may lead to reading uninitialized memory or crash. This is relevant if `clickhouse-server` is open for write access to adversary. [#33050](https://github.com/ClickHouse/ClickHouse/pull/33050) ([Heena Bansal](https://github.com/HeenaBansal2009)). Fixed Apache Avro Union type index out of boundary issue in Apache Avro binary format. [#33022](https://github.com/ClickHouse/ClickHouse/pull/33022) ([Harry Lee](https://github.com/HarryLeeIBM)). Fix null pointer dereference in `LowCardinality` data when deserializing `LowCardinality` data in the Native format. [#33021](https://github.com/ClickHouse/ClickHouse/pull/33021) ([Harry Lee](https://github.com/HarryLeeIBM)). +* ClickHouse Keeper handler will correctly remove operation when response sent. [#32988](https://github.com/ClickHouse/ClickHouse/pull/32988) ([JackyWoo](https://github.com/JackyWoo)). +* Potential off-by-one miscalculation of quotas: quota limit was not reached, but the limit was exceeded. This fixes [#31174](https://github.com/ClickHouse/ClickHouse/issues/31174). [#31656](https://github.com/ClickHouse/ClickHouse/pull/31656) ([sunny](https://github.com/sunny19930321)). +* Fixed CASTing from String to IPv4 or IPv6 and back. Fixed error message in case of failed conversion. [#29224](https://github.com/ClickHouse/ClickHouse/pull/29224) ([Dmitry Novik](https://github.com/novikd)) [#27914](https://github.com/ClickHouse/ClickHouse/pull/27914) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed an exception like `Unknown aggregate function nothing` during an execution on a remote server. This fixes [#16689](https://github.com/ClickHouse/ClickHouse/issues/16689). [#26074](https://github.com/ClickHouse/ClickHouse/pull/26074) ([hexiaoting](https://github.com/hexiaoting)). +* Fix wrong database for JOIN without explicit database in distributed queries (Fixes: [#10471](https://github.com/ClickHouse/ClickHouse/issues/10471)). [#33611](https://github.com/ClickHouse/ClickHouse/pull/33611) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in Apache `Avro` format that appears after the second insert into file. [#33566](https://github.com/ClickHouse/ClickHouse/pull/33566) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix segfault in Apache `Arrow` format if schema contains `Dictionary` type. Closes [#33507](https://github.com/ClickHouse/ClickHouse/issues/33507). [#33529](https://github.com/ClickHouse/ClickHouse/pull/33529) ([Kruglov Pavel](https://github.com/Avogar)). +* Out of band `offset` and `limit` settings may be applied incorrectly for views. Close [#33289](https://github.com/ClickHouse/ClickHouse/issues/33289) [#33518](https://github.com/ClickHouse/ClickHouse/pull/33518) ([hexiaoting](https://github.com/hexiaoting)). +* Fix an exception `Block structure mismatch` which may happen during insertion into table with default nested `LowCardinality` column. Fixes [#33028](https://github.com/ClickHouse/ClickHouse/issues/33028). [#33504](https://github.com/ClickHouse/ClickHouse/pull/33504) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix dictionary expressions for `range_hashed` range min and range max attributes when created using DDL. Closes [#30809](https://github.com/ClickHouse/ClickHouse/issues/30809). [#33478](https://github.com/ClickHouse/ClickHouse/pull/33478) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible use-after-free for INSERT into Materialized View with concurrent DROP ([Azat Khuzhin](https://github.com/azat)). +* Do not try to read pass EOF (to workaround for a bug in the Linux kernel), this bug can be reproduced on kernels (3.14..5.9), and requires `index_granularity_bytes=0` (i.e. turn off adaptive index granularity). [#33372](https://github.com/ClickHouse/ClickHouse/pull/33372) ([Azat Khuzhin](https://github.com/azat)). +* The commands `SYSTEM SUSPEND` and `SYSTEM ... THREAD FUZZER` missed access control. It is fixed. Author: Kevin Michel. [#33333](https://github.com/ClickHouse/ClickHouse/pull/33333) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix when `COMMENT` for dictionaries does not appear in `system.tables`, `system.dictionaries`. Allow to modify the comment for `Dictionary` engine. Closes [#33251](https://github.com/ClickHouse/ClickHouse/issues/33251). [#33261](https://github.com/ClickHouse/ClickHouse/pull/33261) ([Maksim Kita](https://github.com/kitaisreal)). +* Add asynchronous inserts (with enabled setting `async_insert`) to query log. Previously such queries didn't appear in the query log. [#33239](https://github.com/ClickHouse/ClickHouse/pull/33239) ([Anton Popov](https://github.com/CurtizJ)). +* Fix sending `WHERE 1 = 0` expressions for external databases query. Closes [#33152](https://github.com/ClickHouse/ClickHouse/issues/33152). [#33214](https://github.com/ClickHouse/ClickHouse/pull/33214) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix DDL validation for MaterializedPostgreSQL. Fix setting `materialized_postgresql_allow_automatic_update`. Closes [#29535](https://github.com/ClickHouse/ClickHouse/issues/29535). [#33200](https://github.com/ClickHouse/ClickHouse/pull/33200) ([Kseniia Sumarokova](https://github.com/kssenii)). Make sure unused replication slots are always removed. Found in [#26952](https://github.com/ClickHouse/ClickHouse/issues/26952). [#33187](https://github.com/ClickHouse/ClickHouse/pull/33187) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix MaterializedPostreSQL detach/attach (removing / adding to replication) tables with non-default schema. Found in [#29535](https://github.com/ClickHouse/ClickHouse/issues/29535). [#33179](https://github.com/ClickHouse/ClickHouse/pull/33179) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix DROP MaterializedPostgreSQL database. [#33468](https://github.com/ClickHouse/ClickHouse/pull/33468) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The metric `StorageBufferBytes` sometimes was miscalculated. [#33159](https://github.com/ClickHouse/ClickHouse/pull/33159) ([xuyatian](https://github.com/xuyatian)). +* Fix error `Invalid version for SerializationLowCardinality key column` in case of reading from `LowCardinality` column with `local_filesystem_read_prefetch` or `remote_filesystem_read_prefetch` enabled. [#33046](https://github.com/ClickHouse/ClickHouse/pull/33046) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `s3` table function reading empty file. Closes [#33008](https://github.com/ClickHouse/ClickHouse/issues/33008). [#33037](https://github.com/ClickHouse/ClickHouse/pull/33037) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix Context leak in case of cancel_http_readonly_queries_on_client_close (i.e. leaking of external tables that had been uploaded the the server and other resources). [#32982](https://github.com/ClickHouse/ClickHouse/pull/32982) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong tuple output in `CSV` format in case of custom csv delimiter. [#32981](https://github.com/ClickHouse/ClickHouse/pull/32981) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix HDFS URL check that didn't allow using HA namenode address. Bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/31042. [#32976](https://github.com/ClickHouse/ClickHouse/pull/32976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix throwing exception like positional argument out of bounds for non-positional arguments. Closes [#31173](https://github.com/ClickHouse/ClickHouse/issues/31173)#event-5789668239. [#32961](https://github.com/ClickHouse/ClickHouse/pull/32961) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix UB in case of unexpected EOF during filling a set from HTTP query (i.e. if the client interrupted in the middle, i.e. `timeout 0.15s curl -Ss -F 's=@t.csv;' 'http://127.0.0.1:8123/?s_structure=key+Int&query=SELECT+dummy+IN+s'` and with large enough `t.csv`). [#32955](https://github.com/ClickHouse/ClickHouse/pull/32955) ([Azat Khuzhin](https://github.com/azat)). +* Fix a regression in `replaceRegexpAll` function. The function worked incorrectly when matched substring was empty. This closes [#32777](https://github.com/ClickHouse/ClickHouse/issues/32777). This closes [#30245](https://github.com/ClickHouse/ClickHouse/issues/30245). [#32945](https://github.com/ClickHouse/ClickHouse/pull/32945) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ORC` format stripe reading. [#32929](https://github.com/ClickHouse/ClickHouse/pull/32929) ([kreuzerkrieg](https://github.com/kreuzerkrieg)). +* `topKWeightedState` failed for some input types. [#32487](https://github.com/ClickHouse/ClickHouse/issues/32487). [#32914](https://github.com/ClickHouse/ClickHouse/pull/32914) ([vdimir](https://github.com/vdimir)). +* Fix exception `Single chunk is expected from view inner query (LOGICAL_ERROR)` in materialized view. Fixes [#31419](https://github.com/ClickHouse/ClickHouse/issues/31419). [#32862](https://github.com/ClickHouse/ClickHouse/pull/32862) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix optimization with lazy seek for async reads from remote filesystems. Closes [#32803](https://github.com/ClickHouse/ClickHouse/issues/32803). [#32835](https://github.com/ClickHouse/ClickHouse/pull/32835) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `MergeTree` table engine might silently skip some mutations if there are too many running mutations or in case of high memory consumption, it's fixed. Fixes [#17882](https://github.com/ClickHouse/ClickHouse/issues/17882). [#32814](https://github.com/ClickHouse/ClickHouse/pull/32814) ([tavplubix](https://github.com/tavplubix)). +* Avoid reusing the scalar subquery cache when processing MV blocks. This fixes a bug when the scalar query reference the source table but it means that all subscalar queries in the MV definition will be calculated for each block. [#32811](https://github.com/ClickHouse/ClickHouse/pull/32811) ([Raúl Marín](https://github.com/Algunenano)). +* Server might fail to start if database with `MySQL` engine cannot connect to MySQL server, it's fixed. Fixes [#14441](https://github.com/ClickHouse/ClickHouse/issues/14441). [#32802](https://github.com/ClickHouse/ClickHouse/pull/32802) ([tavplubix](https://github.com/tavplubix)). +* Fix crash when used `fuzzBits` function, close [#32737](https://github.com/ClickHouse/ClickHouse/issues/32737). [#32755](https://github.com/ClickHouse/ClickHouse/pull/32755) ([SuperDJY](https://github.com/cmsxbc)). +* Fix error `Column is not under aggregate function` in case of MV with `GROUP BY (list of columns)` (which is pared as `GROUP BY tuple(...)`) over `Kafka`/`RabbitMQ`. Fixes [#32668](https://github.com/ClickHouse/ClickHouse/issues/32668) and [#32744](https://github.com/ClickHouse/ClickHouse/issues/32744). [#32751](https://github.com/ClickHouse/ClickHouse/pull/32751) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `ALTER TABLE ... MATERIALIZE TTL` query with `TTL ... DELETE WHERE ...` and `TTL ... GROUP BY ...` modes. [#32695](https://github.com/ClickHouse/ClickHouse/pull/32695) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `optimize_read_in_order` optimization in case when table engine is `Distributed` or `Merge` and its underlying `MergeTree` tables have monotonous function in prefix of sorting key. [#32670](https://github.com/ClickHouse/ClickHouse/pull/32670) ([Anton Popov](https://github.com/CurtizJ)). +* Fix LOGICAL_ERROR exception when the target of a materialized view is a JOIN or a SET table. [#32669](https://github.com/ClickHouse/ClickHouse/pull/32669) ([Raúl Marín](https://github.com/Algunenano)). +* Inserting into S3 with multipart upload to Google Cloud Storage may trigger abort. [#32504](https://github.com/ClickHouse/ClickHouse/issues/32504). [#32649](https://github.com/ClickHouse/ClickHouse/pull/32649) ([vdimir](https://github.com/vdimir)). +* Fix possible exception at `RabbitMQ` storage startup by delaying channel creation. [#32584](https://github.com/ClickHouse/ClickHouse/pull/32584) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix table lifetime (i.e. possible use-after-free) in case of parallel DROP TABLE and INSERT. [#32572](https://github.com/ClickHouse/ClickHouse/pull/32572) ([Azat Khuzhin](https://github.com/azat)). +* Fix async inserts with formats `CustomSeparated`, `Template`, `Regexp`, `MsgPack` and `JSONAsString`. Previousely the async inserts with these formats didn't read any data. [#32530](https://github.com/ClickHouse/ClickHouse/pull/32530) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `groupBitmapAnd` function on distributed table. [#32529](https://github.com/ClickHouse/ClickHouse/pull/32529) ([minhthucdao](https://github.com/dmthuc)). +* Fix crash in JOIN found by fuzzer, close [#32458](https://github.com/ClickHouse/ClickHouse/issues/32458). [#32508](https://github.com/ClickHouse/ClickHouse/pull/32508) ([vdimir](https://github.com/vdimir)). +* Proper handling of the case with Apache Arrow column duplication. [#32507](https://github.com/ClickHouse/ClickHouse/pull/32507) ([Dmitriy Mokhnatkin](https://github.com/DMokhnatkin)). +* Fix issue with ambiguous query formatting in distributed queries that led to errors when some table columns were named `ALL` or `DISTINCT`. This closes [#32391](https://github.com/ClickHouse/ClickHouse/issues/32391). [#32490](https://github.com/ClickHouse/ClickHouse/pull/32490) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix failures in queries that are trying to use skipping indices, which are not materialized yet. Fixes [#32292](https://github.com/ClickHouse/ClickHouse/issues/32292) and [#30343](https://github.com/ClickHouse/ClickHouse/issues/30343). [#32359](https://github.com/ClickHouse/ClickHouse/pull/32359) ([Anton Popov](https://github.com/CurtizJ)). +* Fix broken select query when there are more than 2 row policies on same column, begin at second queries on the same session. [#31606](https://github.com/ClickHouse/ClickHouse/issues/31606). [#32291](https://github.com/ClickHouse/ClickHouse/pull/32291) ([SuperDJY](https://github.com/cmsxbc)). +* Fix fractional unix timestamp conversion to `DateTime64`, fractional part was reversed for negative unix timestamps (before 1970-01-01). [#32240](https://github.com/ClickHouse/ClickHouse/pull/32240) ([Ben](https://github.com/benbiti)). +* Some entries of replication queue might hang for `temporary_directories_lifetime` (1 day by default) with `Directory tmp_merge_` or `Part ... (state Deleting) already exists, but it will be deleted soon` or similar error. It's fixed. Fixes [#29616](https://github.com/ClickHouse/ClickHouse/issues/29616). [#32201](https://github.com/ClickHouse/ClickHouse/pull/32201) ([tavplubix](https://github.com/tavplubix)). +* Fix parsing of `APPLY lambda` column transformer which could lead to client/server crash. [#32138](https://github.com/ClickHouse/ClickHouse/pull/32138) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `base64Encode` adding trailing bytes on small strings. [#31797](https://github.com/ClickHouse/ClickHouse/pull/31797) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Fix possible crash (or incorrect result) in case of `LowCardinality` arguments of window function. Fixes [#31114](https://github.com/ClickHouse/ClickHouse/issues/31114). [#31888](https://github.com/ClickHouse/ClickHouse/pull/31888) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix hang up with command `DROP TABLE system.query_log sync`. [#33293](https://github.com/ClickHouse/ClickHouse/pull/33293) ([zhanghuajie](https://github.com/zhanghuajieHIT)). + + +## [Changelog for 2021](./2021.md) diff --git a/docs/ja/whats-new/changelog/2023.md b/docs/ja/whats-new/changelog/2023.md new file mode 100644 index 00000000000..daa6c121dd9 --- /dev/null +++ b/docs/ja/whats-new/changelog/2023.md @@ -0,0 +1,2171 @@ +--- +slug: /ja/whats-new/changelog/2023 +sidebar_position: 8 +sidebar_label: 2023 +title: 2023 Changelog +--- + +### Table of Contents +**[ClickHouse release v23.12, 2023-12-28](#2312)**
    +**[ClickHouse release v23.11, 2023-12-06](#2311)**
    +**[ClickHouse release v23.10, 2023-11-02](#2310)**
    +**[ClickHouse release v23.9, 2023-09-28](#239)**
    +**[ClickHouse release v23.8 LTS, 2023-08-31](#238)**
    +**[ClickHouse release v23.7, 2023-07-27](#237)**
    +**[ClickHouse release v23.6, 2023-06-30](#236)**
    +**[ClickHouse release v23.5, 2023-06-08](#235)**
    +**[ClickHouse release v23.4, 2023-04-26](#234)**
    +**[ClickHouse release v23.3 LTS, 2023-03-30](#233)**
    +**[ClickHouse release v23.2, 2023-02-23](#232)**
    +**[ClickHouse release v23.1, 2023-01-25](#231)**
    +**[Changelog for 2022](https://clickhouse.com/docs/ja/whats-new/changelog/2022/)**
    + +# 2023 Changelog + +### ClickHouse release 23.12, 2023-12-28 {#2312} + +#### Backward Incompatible Change +* Fix check for non-deterministic functions in TTL expressions. Previously, you could create a TTL expression with non-deterministic functions in some cases, which could lead to undefined behavior later. This fixes [#37250](https://github.com/ClickHouse/ClickHouse/issues/37250). Disallow TTL expressions that don't depend on any columns of a table by default. It can be allowed back by `SET allow_suspicious_ttl_expressions = 1` or `SET compatibility = '23.11'`. Closes [#37286](https://github.com/ClickHouse/ClickHouse/issues/37286). [#51858](https://github.com/ClickHouse/ClickHouse/pull/51858) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The MergeTree setting `clean_deleted_rows` is deprecated, it has no effect anymore. The `CLEANUP` keyword for the `OPTIMIZE` is not allowed by default (it can be unlocked with the `allow_experimental_replacing_merge_with_cleanup` setting). [#58267](https://github.com/ClickHouse/ClickHouse/pull/58267) ([Alexander Tokmakov](https://github.com/tavplubix)). This fixes [#57930](https://github.com/ClickHouse/ClickHouse/issues/57930). This closes [#54988](https://github.com/ClickHouse/ClickHouse/issues/54988). This closes [#54570](https://github.com/ClickHouse/ClickHouse/issues/54570). This closes [#50346](https://github.com/ClickHouse/ClickHouse/issues/50346). This closes [#47579](https://github.com/ClickHouse/ClickHouse/issues/47579). The feature has to be removed because it is not good. We have to remove it as quickly as possible, because there is no other option. [#57932](https://github.com/ClickHouse/ClickHouse/pull/57932) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Implement Refreshable Materialized Views, requested in [#33919](https://github.com/ClickHouse/ClickHouse/issues/33919). [#56946](https://github.com/ClickHouse/ClickHouse/pull/56946) ([Michael Kolupaev](https://github.com/al13n321), [Michael Guzov](https://github.com/koloshmet)). +* Introduce `PASTE JOIN`, which allows users to join tables without `ON` clause simply by row numbers. Example: `SELECT * FROM (SELECT number AS a FROM numbers(2)) AS t1 PASTE JOIN (SELECT number AS a FROM numbers(2) ORDER BY a DESC) AS t2`. [#57995](https://github.com/ClickHouse/ClickHouse/pull/57995) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* The `ORDER BY` clause now supports specifying `ALL`, meaning that ClickHouse sorts by all columns in the `SELECT` clause. Example: `SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL`. [#57875](https://github.com/ClickHouse/ClickHouse/pull/57875) ([zhongyuankai](https://github.com/zhongyuankai)). +* Added a new mutation command `ALTER TABLE
    APPLY DELETED MASK`, which allows to enforce applying of mask written by lightweight delete and to remove rows marked as deleted from disk. [#57433](https://github.com/ClickHouse/ClickHouse/pull/57433) ([Anton Popov](https://github.com/CurtizJ)). +* A handler `/binary` opens a visual viewer of symbols inside the ClickHouse binary. [#58211](https://github.com/ClickHouse/ClickHouse/pull/58211) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added a new SQL function `sqid` to generate Sqids (https://sqids.org/), example: `SELECT sqid(125, 126)`. [#57512](https://github.com/ClickHouse/ClickHouse/pull/57512) ([Robert Schulze](https://github.com/rschu1ze)). +* Add a new function `seriesPeriodDetectFFT` to detect series period using FFT. [#57574](https://github.com/ClickHouse/ClickHouse/pull/57574) ([Bhavna Jindal](https://github.com/bhavnajindal)). +* Add an HTTP endpoint for checking if Keeper is ready to accept traffic. [#55876](https://github.com/ClickHouse/ClickHouse/pull/55876) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Add 'union' mode for schema inference. In this mode the resulting table schema is the union of all files schemas (so schema is inferred from each file). The mode of schema inference is controlled by a setting `schema_inference_mode` with two possible values - `default` and `union`. Closes [#55428](https://github.com/ClickHouse/ClickHouse/issues/55428). [#55892](https://github.com/ClickHouse/ClickHouse/pull/55892) ([Kruglov Pavel](https://github.com/Avogar)). +* Add new setting `input_format_csv_try_infer_numbers_from_strings` that allows to infer numbers from strings in CSV format. Closes [#56455](https://github.com/ClickHouse/ClickHouse/issues/56455). [#56859](https://github.com/ClickHouse/ClickHouse/pull/56859) ([Kruglov Pavel](https://github.com/Avogar)). +* When the number of databases or tables exceeds a configurable threshold, show a warning to the user. [#57375](https://github.com/ClickHouse/ClickHouse/pull/57375) ([凌涛](https://github.com/lingtaolf)). +* Dictionary with `HASHED_ARRAY` (and `COMPLEX_KEY_HASHED_ARRAY`) layout supports `SHARDS` similarly to `HASHED`. [#57544](https://github.com/ClickHouse/ClickHouse/pull/57544) ([vdimir](https://github.com/vdimir)). +* Add asynchronous metrics for total primary key bytes and total allocated primary key bytes in memory. [#57551](https://github.com/ClickHouse/ClickHouse/pull/57551) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `SHA512_256` function. [#57645](https://github.com/ClickHouse/ClickHouse/pull/57645) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `FORMAT_BYTES` as an alias for `formatReadableSize`. [#57592](https://github.com/ClickHouse/ClickHouse/pull/57592) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow passing optional session token to the `s3` table function. [#57850](https://github.com/ClickHouse/ClickHouse/pull/57850) ([Shani Elharrar](https://github.com/shanielh)). +* Introduce a new setting `http_make_head_request`. If it is turned off, the URL table engine will not do a HEAD request to determine the file size. This is needed to support inefficient, misconfigured, or not capable HTTP servers. [#54602](https://github.com/ClickHouse/ClickHouse/pull/54602) ([Fionera](https://github.com/fionera)). +* It is now possible to refer to ALIAS column in index (non-primary-key) definitions (issue [#55650](https://github.com/ClickHouse/ClickHouse/issues/55650)). Example: `CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;`. [#57546](https://github.com/ClickHouse/ClickHouse/pull/57546) ([Robert Schulze](https://github.com/rschu1ze)). +* Added a new setting `readonly` which can be used to specify an S3 disk is read only. It can be useful to create a table on a disk of `s3_plain` type, while having read only access to the underlying S3 bucket. [#57977](https://github.com/ClickHouse/ClickHouse/pull/57977) ([Pengyuan Bian](https://github.com/bianpengyuan)). +* The primary key analysis in MergeTree tables will now be applied to predicates that include the virtual column `_part_offset` (optionally with `_part`). This feature can serve as a special kind of a secondary index. [#58224](https://github.com/ClickHouse/ClickHouse/pull/58224) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement +* Extract non-intersecting parts ranges from MergeTree table during FINAL processing. That way we can avoid additional FINAL logic for this non-intersecting parts ranges. In case when amount of duplicate values with same primary key is low, performance will be almost the same as without FINAL. Improve reading performance for MergeTree FINAL when `do_not_merge_across_partitions_select_final` setting is set. [#58120](https://github.com/ClickHouse/ClickHouse/pull/58120) ([Maksim Kita](https://github.com/kitaisreal)). +* Made copy between s3 disks using a s3-server-side copy instead of copying through the buffer. Improves `BACKUP/RESTORE` operations and `clickhouse-disks copy` command. [#56744](https://github.com/ClickHouse/ClickHouse/pull/56744) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Hash JOIN respects setting `max_joined_block_size_rows` and do not produce large blocks for `ALL JOIN`. [#56996](https://github.com/ClickHouse/ClickHouse/pull/56996) ([vdimir](https://github.com/vdimir)). +* Release memory for aggregation earlier. This may avoid unnecessary external aggregation. [#57691](https://github.com/ClickHouse/ClickHouse/pull/57691) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve performance of string serialization. [#57717](https://github.com/ClickHouse/ClickHouse/pull/57717) ([Maksim Kita](https://github.com/kitaisreal)). +* Support trivial count optimization for `Merge`-engine tables. [#57867](https://github.com/ClickHouse/ClickHouse/pull/57867) ([skyoct](https://github.com/skyoct)). +* Optimized aggregation in some cases. [#57872](https://github.com/ClickHouse/ClickHouse/pull/57872) ([Anton Popov](https://github.com/CurtizJ)). +* The `hasAny` function can now take advantage of the full-text skipping indices. [#57878](https://github.com/ClickHouse/ClickHouse/pull/57878) ([Jpnock](https://github.com/Jpnock)). +* Function `if(cond, then, else)` (and its alias `cond ? then : else`) were optimized to use branch-free evaluation. [#57885](https://github.com/ClickHouse/ClickHouse/pull/57885) ([zhanglistar](https://github.com/zhanglistar)). +* MergeTree automatically derive `do_not_merge_across_partitions_select_final` setting if partition key expression contains only columns from primary key expression. [#58218](https://github.com/ClickHouse/ClickHouse/pull/58218) ([Maksim Kita](https://github.com/kitaisreal)). +* Speedup `MIN` and `MAX` for native types. [#58231](https://github.com/ClickHouse/ClickHouse/pull/58231) ([Raúl Marín](https://github.com/Algunenano)). +* Implement `SLRU` cache policy for filesystem cache. [#57076](https://github.com/ClickHouse/ClickHouse/pull/57076) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The limit for the number of connections per endpoint for background fetches was raised from `15` to the value of `background_fetches_pool_size` setting. - MergeTree-level setting `replicated_max_parallel_fetches_for_host` became obsolete - MergeTree-level settings `replicated_fetches_http_connection_timeout`, `replicated_fetches_http_send_timeout` and `replicated_fetches_http_receive_timeout` are moved to the Server-level. - Setting `keep_alive_timeout` is added to the list of Server-level settings. [#57523](https://github.com/ClickHouse/ClickHouse/pull/57523) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Make querying `system.filesystem_cache` not memory intensive. [#57687](https://github.com/ClickHouse/ClickHouse/pull/57687) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Reduce memory usage on strings deserialization. [#57787](https://github.com/ClickHouse/ClickHouse/pull/57787) ([Maksim Kita](https://github.com/kitaisreal)). +* More efficient constructor for Enum - it makes sense when Enum has a boatload of values. [#57887](https://github.com/ClickHouse/ClickHouse/pull/57887) ([Duc Canh Le](https://github.com/canhld94)). +* An improvement for reading from the filesystem cache: always use `pread` method. [#57970](https://github.com/ClickHouse/ClickHouse/pull/57970) ([Nikita Taranov](https://github.com/nickitat)). +* Add optimization for AND notEquals chain in logical expression optimizer. This optimization is only available with the experimental Analyzer enabled. [#58214](https://github.com/ClickHouse/ClickHouse/pull/58214) ([Kevin Mingtarja](https://github.com/kevinmingtarja)). + +#### Improvement +* Support for soft memory limit in Keeper. It will refuse requests if the memory usage is close to the maximum. [#57271](https://github.com/ClickHouse/ClickHouse/pull/57271) ([Han Fei](https://github.com/hanfei1991)). [#57699](https://github.com/ClickHouse/ClickHouse/pull/57699) ([Han Fei](https://github.com/hanfei1991)). +* Make inserts into distributed tables handle updated cluster configuration properly. When the list of cluster nodes is dynamically updated, the Directory Monitor of the distribution table will update it. [#42826](https://github.com/ClickHouse/ClickHouse/pull/42826) ([zhongyuankai](https://github.com/zhongyuankai)). +* Do not allow creating a replicated table with inconsistent merge parameters. [#56833](https://github.com/ClickHouse/ClickHouse/pull/56833) ([Duc Canh Le](https://github.com/canhld94)). +* Show uncompressed size in `system.tables`. [#56618](https://github.com/ClickHouse/ClickHouse/issues/56618). [#57186](https://github.com/ClickHouse/ClickHouse/pull/57186) ([Chen Lixiang](https://github.com/chenlx0)). +* Add `skip_unavailable_shards` as a setting for `Distributed` tables that is similar to the corresponding query-level setting. Closes [#43666](https://github.com/ClickHouse/ClickHouse/issues/43666). [#57218](https://github.com/ClickHouse/ClickHouse/pull/57218) ([Gagan Goel](https://github.com/tntnatbry)). +* The function `substring` (aliases: `substr`, `mid`) can now be used with `Enum` types. Previously, the first function argument had to be a value of type `String` or `FixedString`. This improves compatibility with 3rd party tools such as Tableau via MySQL interface. [#57277](https://github.com/ClickHouse/ClickHouse/pull/57277) ([Serge Klochkov](https://github.com/slvrtrn)). +* Function `format` now supports arbitrary argument types (instead of only `String` and `FixedString` arguments). This is important to calculate `SELECT format('The {0} to all questions is {1}', 'answer', 42)`. [#57549](https://github.com/ClickHouse/ClickHouse/pull/57549) ([Robert Schulze](https://github.com/rschu1ze)). +* Allows to use the `date_trunc` function with a case-insensitive first argument. Both cases are now supported: `SELECT date_trunc('day', now())` and `SELECT date_trunc('DAY', now())`. [#57624](https://github.com/ClickHouse/ClickHouse/pull/57624) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Better hints when a table doesn't exist. [#57342](https://github.com/ClickHouse/ClickHouse/pull/57342) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow to overwrite `max_partition_size_to_drop` and `max_table_size_to_drop` server settings in query time. [#57452](https://github.com/ClickHouse/ClickHouse/pull/57452) ([Jordi Villar](https://github.com/jrdi)). +* Slightly better inference of unnamed tupes in JSON formats. [#57751](https://github.com/ClickHouse/ClickHouse/pull/57751) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for read-only flag when connecting to Keeper (fixes [#53749](https://github.com/ClickHouse/ClickHouse/issues/53749)). [#57479](https://github.com/ClickHouse/ClickHouse/pull/57479) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Fix possible distributed sends stuck due to "No such file or directory" (during recovering a batch from disk). Fix possible issues with `error_count` from `system.distribution_queue` (in case of `distributed_directory_monitor_max_sleep_time_ms` >5min). Introduce profile event to track async INSERT failures - `DistributedAsyncInsertionFailures`. [#57480](https://github.com/ClickHouse/ClickHouse/pull/57480) ([Azat Khuzhin](https://github.com/azat)). +* Support PostgreSQL generated columns and default column values in `MaterializedPostgreSQL` (experimental feature). Closes [#40449](https://github.com/ClickHouse/ClickHouse/issues/40449). [#57568](https://github.com/ClickHouse/ClickHouse/pull/57568) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to apply some filesystem cache config settings changes without server restart. [#57578](https://github.com/ClickHouse/ClickHouse/pull/57578) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Properly handling PostgreSQL table structure with empty array. [#57618](https://github.com/ClickHouse/ClickHouse/pull/57618) ([Mike Kot](https://github.com/myrrc)). +* Expose the total number of errors occurred since last server restart as a `ClickHouseErrorMetric_ALL` metric. [#57627](https://github.com/ClickHouse/ClickHouse/pull/57627) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow nodes in the configuration file with `from_env`/`from_zk` reference and non empty element with replace=1. [#57628](https://github.com/ClickHouse/ClickHouse/pull/57628) ([Azat Khuzhin](https://github.com/azat)). +* A table function `fuzzJSON` which allows generating a lot of malformed JSON for fuzzing. [#57646](https://github.com/ClickHouse/ClickHouse/pull/57646) ([Julia Kartseva](https://github.com/jkartseva)). +* Allow IPv6 to UInt128 conversion and binary arithmetic. [#57707](https://github.com/ClickHouse/ClickHouse/pull/57707) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add a setting for `async inserts deduplication cache` - how long we wait for cache update. Deprecate setting `async_block_ids_cache_min_update_interval_ms`. Now cache is updated only in case of conflicts. [#57743](https://github.com/ClickHouse/ClickHouse/pull/57743) ([alesapin](https://github.com/alesapin)). +* `sleep()` function now can be cancelled with `KILL QUERY`. [#57746](https://github.com/ClickHouse/ClickHouse/pull/57746) ([Vitaly Baranov](https://github.com/vitlibar)). +* Forbid `CREATE TABLE ... AS SELECT` queries for `Replicated` table engines in the experimental `Replicated` database because they are not supported. Reference [#35408](https://github.com/ClickHouse/ClickHouse/issues/35408). [#57796](https://github.com/ClickHouse/ClickHouse/pull/57796) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix and improve transforming queries for external databases, to recursively obtain all compatible predicates. [#57888](https://github.com/ClickHouse/ClickHouse/pull/57888) ([flynn](https://github.com/ucasfl)). +* Support dynamic reloading of the filesystem cache size. Closes [#57866](https://github.com/ClickHouse/ClickHouse/issues/57866). [#57897](https://github.com/ClickHouse/ClickHouse/pull/57897) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly support `system.stack_trace` for threads with blocked SIGRTMIN (these threads can exist in low-quality external libraries such as Apache rdkafka). [#57907](https://github.com/ClickHouse/ClickHouse/pull/57907) ([Azat Khuzhin](https://github.com/azat)). Aand also send signal to the threads only if it is not blocked to avoid waiting `storage_system_stack_trace_pipe_read_timeout_ms` when it does not make any sense. [#58136](https://github.com/ClickHouse/ClickHouse/pull/58136) ([Azat Khuzhin](https://github.com/azat)). +* Tolerate keeper failures in the quorum inserts' check. [#57986](https://github.com/ClickHouse/ClickHouse/pull/57986) ([Raúl Marín](https://github.com/Algunenano)). +* Add max/peak RSS (`MemoryResidentMax`) into system.asynchronous_metrics. [#58095](https://github.com/ClickHouse/ClickHouse/pull/58095) ([Azat Khuzhin](https://github.com/azat)). +* This PR allows users to use s3-style links (`https://` and `s3://`) without mentioning region if it's not default. Also find the correct region if the user mentioned the wrong one. [#58148](https://github.com/ClickHouse/ClickHouse/pull/58148) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* `clickhouse-format --obfuscate` will know about Settings, MergeTreeSettings, and time zones and keep their names unchanged. [#58179](https://github.com/ClickHouse/ClickHouse/pull/58179) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added explicit `finalize()` function in `ZipArchiveWriter`. Simplify too complicated code in `ZipArchiveWriter`. This fixes [#58074](https://github.com/ClickHouse/ClickHouse/issues/58074). [#58202](https://github.com/ClickHouse/ClickHouse/pull/58202) ([Vitaly Baranov](https://github.com/vitlibar)). +* Make caches with the same path use the same cache objects. This behaviour existed before, but was broken in 23.4. If such caches with the same path have different set of cache settings, an exception will be thrown, that this is not allowed. [#58264](https://github.com/ClickHouse/ClickHouse/pull/58264) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Parallel replicas (experimental feature): friendly settings [#57542](https://github.com/ClickHouse/ClickHouse/pull/57542) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): announcement response handling improvement [#57749](https://github.com/ClickHouse/ClickHouse/pull/57749) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): give more respect to `min_number_of_marks` in `ParallelReplicasReadingCoordinator` [#57763](https://github.com/ClickHouse/ClickHouse/pull/57763) ([Nikita Taranov](https://github.com/nickitat)). +* Parallel replicas (experimental feature): disable parallel replicas with IN (subquery) [#58133](https://github.com/ClickHouse/ClickHouse/pull/58133) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): add profile event 'ParallelReplicasUsedCount' [#58173](https://github.com/ClickHouse/ClickHouse/pull/58173) ([Igor Nikonov](https://github.com/devcrafter)). +* Non POST requests such as HEAD will be readonly similar to GET. [#58060](https://github.com/ClickHouse/ClickHouse/pull/58060) ([San](https://github.com/santrancisco)). +* Add `bytes_uncompressed` column to `system.part_log` [#58167](https://github.com/ClickHouse/ClickHouse/pull/58167) ([Jordi Villar](https://github.com/jrdi)). +* Add base backup name to `system.backups` and `system.backup_log` tables [#58178](https://github.com/ClickHouse/ClickHouse/pull/58178) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Add support for specifying query parameters in the command line in clickhouse-local [#58210](https://github.com/ClickHouse/ClickHouse/pull/58210) ([Pradeep Chhetri](https://github.com/chhetripradeep)). + +#### Build/Testing/Packaging Improvement +* Randomize more settings [#39663](https://github.com/ClickHouse/ClickHouse/pull/39663) ([Anton Popov](https://github.com/CurtizJ)). +* Randomize disabled optimizations in CI [#57315](https://github.com/ClickHouse/ClickHouse/pull/57315) ([Raúl Marín](https://github.com/Algunenano)). +* Allow usage of Azure-related table engines/functions on macOS. [#51866](https://github.com/ClickHouse/ClickHouse/pull/51866) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse Fast Test now uses Musl instead of GLibc. [#57711](https://github.com/ClickHouse/ClickHouse/pull/57711) ([Alexey Milovidov](https://github.com/alexey-milovidov)). The fully-static Musl build is available to download from the CI. +* Run ClickBench for every commit. This closes [#57708](https://github.com/ClickHouse/ClickHouse/issues/57708). [#57712](https://github.com/ClickHouse/ClickHouse/pull/57712) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the usage of a harmful C/POSIX `select` function from external libraries. [#57467](https://github.com/ClickHouse/ClickHouse/pull/57467) ([Igor Nikonov](https://github.com/devcrafter)). +* Settings only available in ClickHouse Cloud will be also present in the open-source ClickHouse build for convenience. [#57638](https://github.com/ClickHouse/ClickHouse/pull/57638) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fixed a possibility of sorting order breakage in TTL GROUP BY [#49103](https://github.com/ClickHouse/ClickHouse/pull/49103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix: split `lttb` bucket strategy, first bucket and last bucket should only contain single point [#57003](https://github.com/ClickHouse/ClickHouse/pull/57003) ([FFish](https://github.com/wxybear)). +* Fix possible deadlock in the `Template` format during sync after error [#57004](https://github.com/ClickHouse/ClickHouse/pull/57004) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix early stop while parsing a file with skipping lots of errors [#57006](https://github.com/ClickHouse/ClickHouse/pull/57006) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent dictionary's ACL bypass via the `dictionary` table function [#57362](https://github.com/ClickHouse/ClickHouse/pull/57362) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix another case of a "non-ready set" error found by Fuzzer. [#57423](https://github.com/ClickHouse/ClickHouse/pull/57423) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix several issues regarding PostgreSQL `array_ndims` usage. [#57436](https://github.com/ClickHouse/ClickHouse/pull/57436) ([Ryan Jacobs](https://github.com/ryanmjacobs)). +* Fix RWLock inconsistency after write lock timeout [#57454](https://github.com/ClickHouse/ClickHouse/pull/57454) ([Vitaly Baranov](https://github.com/vitlibar)). Fix RWLock inconsistency after write lock timeout (again) [#57733](https://github.com/ClickHouse/ClickHouse/pull/57733) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix: don't exclude ephemeral column when building pushing to view chain [#57461](https://github.com/ClickHouse/ClickHouse/pull/57461) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* MaterializedPostgreSQL (experimental issue): fix issue [#41922](https://github.com/ClickHouse/ClickHouse/issues/41922), add test for [#41923](https://github.com/ClickHouse/ClickHouse/issues/41923) [#57515](https://github.com/ClickHouse/ClickHouse/pull/57515) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Ignore ON CLUSTER clause in grant/revoke queries for management of replicated access entities. [#57538](https://github.com/ClickHouse/ClickHouse/pull/57538) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix crash in clickhouse-local [#57553](https://github.com/ClickHouse/ClickHouse/pull/57553) ([Nikolay Degterinsky](https://github.com/evillique)). +* A fix for Hash JOIN. [#57564](https://github.com/ClickHouse/ClickHouse/pull/57564) ([vdimir](https://github.com/vdimir)). +* Fix possible error in PostgreSQL source [#57567](https://github.com/ClickHouse/ClickHouse/pull/57567) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix type correction in Hash JOIN for nested LowCardinality. [#57614](https://github.com/ClickHouse/ClickHouse/pull/57614) ([vdimir](https://github.com/vdimir)). +* Avoid hangs of `system.stack_trace` by correctly prohibiting parallel reading from it. [#57641](https://github.com/ClickHouse/ClickHouse/pull/57641) ([Azat Khuzhin](https://github.com/azat)). +* Fix an error for aggregation of sparse columns with `any(...) RESPECT NULL` [#57710](https://github.com/ClickHouse/ClickHouse/pull/57710) ([Azat Khuzhin](https://github.com/azat)). +* Fix unary operators parsing [#57713](https://github.com/ClickHouse/ClickHouse/pull/57713) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix dependency loading for the experimental table engine `MaterializedPostgreSQL`. [#57754](https://github.com/ClickHouse/ClickHouse/pull/57754) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix retries for disconnected nodes for BACKUP/RESTORE ON CLUSTER [#57764](https://github.com/ClickHouse/ClickHouse/pull/57764) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix result of external aggregation in case of partially materialized projection [#57790](https://github.com/ClickHouse/ClickHouse/pull/57790) ([Anton Popov](https://github.com/CurtizJ)). +* Fix merge in aggregation functions with `*Map` combinator [#57795](https://github.com/ClickHouse/ClickHouse/pull/57795) ([Anton Popov](https://github.com/CurtizJ)). +* Disable `system.kafka_consumers` because it has a bug. [#57822](https://github.com/ClickHouse/ClickHouse/pull/57822) ([Azat Khuzhin](https://github.com/azat)). +* Fix LowCardinality keys support in Merge JOIN. [#57827](https://github.com/ClickHouse/ClickHouse/pull/57827) ([vdimir](https://github.com/vdimir)). +* A fix for `InterpreterCreateQuery` related to the sample block. [#57855](https://github.com/ClickHouse/ClickHouse/pull/57855) ([Maksim Kita](https://github.com/kitaisreal)). +* `addresses_expr` were ignored for named collections from PostgreSQL. [#57874](https://github.com/ClickHouse/ClickHouse/pull/57874) ([joelynch](https://github.com/joelynch)). +* Fix invalid memory access in BLAKE3 (Rust) [#57876](https://github.com/ClickHouse/ClickHouse/pull/57876) ([Raúl Marín](https://github.com/Algunenano)). Then it was rewritten from Rust to C++ for better [memory-safety](https://www.memorysafety.org/). [#57994](https://github.com/ClickHouse/ClickHouse/pull/57994) ([Raúl Marín](https://github.com/Algunenano)). +* Normalize function names in `CREATE INDEX` [#57906](https://github.com/ClickHouse/ClickHouse/pull/57906) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix handling of unavailable replicas before first request happened [#57933](https://github.com/ClickHouse/ClickHouse/pull/57933) ([Nikita Taranov](https://github.com/nickitat)). +* Fix literal alias misclassification [#57988](https://github.com/ClickHouse/ClickHouse/pull/57988) ([Chen768959](https://github.com/Chen768959)). +* Fix invalid preprocessing on Keeper [#58069](https://github.com/ClickHouse/ClickHouse/pull/58069) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix integer overflow in the `Poco` library, related to `UTF32Encoding` [#58073](https://github.com/ClickHouse/ClickHouse/pull/58073) ([Andrey Fedotov](https://github.com/anfedotoff)). +* Fix parallel replicas (experimental feature) in presence of a scalar subquery with a big integer value [#58118](https://github.com/ClickHouse/ClickHouse/pull/58118) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `accurateCastOrNull` for out-of-range `DateTime` [#58139](https://github.com/ClickHouse/ClickHouse/pull/58139) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix possible `PARAMETER_OUT_OF_BOUND` error during subcolumns reading from a wide part in MergeTree [#58175](https://github.com/ClickHouse/ClickHouse/pull/58175) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a slow-down of CREATE VIEW with an enormous number of subqueries [#58220](https://github.com/ClickHouse/ClickHouse/pull/58220) ([Tao Wang](https://github.com/wangtZJU)). +* Fix parallel parsing for JSONCompactEachRow [#58181](https://github.com/ClickHouse/ClickHouse/pull/58181) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#58250](https://github.com/ClickHouse/ClickHouse/pull/58250) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release 23.11, 2023-12-06 {#2311} + +#### Backward Incompatible Change +* The default ClickHouse server configuration file has enabled `access_management` (user manipulation by SQL queries) and `named_collection_control` (manipulation of named collection by SQL queries) for the `default` user by default. This closes [#56482](https://github.com/ClickHouse/ClickHouse/issues/56482). [#56619](https://github.com/ClickHouse/ClickHouse/pull/56619) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Multiple improvements for `RESPECT NULLS`/`IGNORE NULLS` for window functions. If you use them as aggregate functions and store the states of aggregate functions with these modifiers, they might become incompatible. [#57189](https://github.com/ClickHouse/ClickHouse/pull/57189) ([Raúl Marín](https://github.com/Algunenano)). +* Remove optimization `optimize_move_functions_out_of_any`. [#57190](https://github.com/ClickHouse/ClickHouse/pull/57190) ([Raúl Marín](https://github.com/Algunenano)). +* Formatters `%l`/`%k`/`%c` in function `parseDateTime` are now able to parse hours/months without leading zeros, e.g. `select parseDateTime('2023-11-26 8:14', '%F %k:%i')` now works. Set `parsedatetime_parse_without_leading_zeros = 0` to restore the previous behavior which required two digits. Function `formatDateTime` is now also able to print hours/months without leading zeros. This is controlled by setting `formatdatetime_format_without_leading_zeros` but off by default to not break existing use cases. [#55872](https://github.com/ClickHouse/ClickHouse/pull/55872) ([Azat Khuzhin](https://github.com/azat)). +* You can no longer use the aggregate function `avgWeighted` with arguments of type `Decimal`. Workaround: convert arguments to `Float64`. This closes [#43928](https://github.com/ClickHouse/ClickHouse/issues/43928). This closes [#31768](https://github.com/ClickHouse/ClickHouse/issues/31768). This closes [#56435](https://github.com/ClickHouse/ClickHouse/issues/56435). If you have used this function inside materialized views or projections with `Decimal` arguments, contact support@clickhouse.com. Fixed error in aggregate function `sumMap` and made it slower around 1.5..2 times. It does not matter because the function is garbage anyway. This closes [#54955](https://github.com/ClickHouse/ClickHouse/issues/54955). This closes [#53134](https://github.com/ClickHouse/ClickHouse/issues/53134). This closes [#55148](https://github.com/ClickHouse/ClickHouse/issues/55148). Fix a bug in function `groupArraySample` - it used the same random seed in case more than one aggregate state is generated in a query. [#56350](https://github.com/ClickHouse/ClickHouse/pull/56350) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Added server setting `async_load_databases` for asynchronous loading of databases and tables. Speeds up the server start time. Applies to databases with `Ordinary`, `Atomic` and `Replicated` engines. Their tables load metadata asynchronously. Query to a table increases the priority of the load job and waits for it to be done. Added a new table `system.asynchronous_loader` for introspection. [#49351](https://github.com/ClickHouse/ClickHouse/pull/49351) ([Sergei Trifonov](https://github.com/serxa)). +* Add system table `blob_storage_log`. It allows auditing all the data written to S3 and other object storages. [#52918](https://github.com/ClickHouse/ClickHouse/pull/52918) ([vdimir](https://github.com/vdimir)). +* Use statistics to order prewhere conditions better. [#53240](https://github.com/ClickHouse/ClickHouse/pull/53240) ([Han Fei](https://github.com/hanfei1991)). +* Added support for compression in the Keeper's protocol. It can be enabled on the ClickHouse side by using this flag `use_compression` inside `zookeeper` section. Keep in mind that only ClickHouse Keeper supports compression, while Apache ZooKeeper does not. Resolves [#49507](https://github.com/ClickHouse/ClickHouse/issues/49507). [#54957](https://github.com/ClickHouse/ClickHouse/pull/54957) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Introduce the feature `storage_metadata_write_full_object_key`. If it is set as `true` then metadata files are written with the new format. With that format ClickHouse stores full remote object key in the metadata file which allows better flexibility and optimization. [#55566](https://github.com/ClickHouse/ClickHouse/pull/55566) ([Sema Checherinda](https://github.com/CheSema)). +* Add new settings and syntax to protect named collections' fields from being overridden. This is meant to prevent a malicious user from obtaining unauthorized access to secrets. [#55782](https://github.com/ClickHouse/ClickHouse/pull/55782) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Add `hostname` column to all system log tables - it is useful if you make the system tables replicated, shared, or distributed. [#55894](https://github.com/ClickHouse/ClickHouse/pull/55894) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `CHECK ALL TABLES` query. [#56022](https://github.com/ClickHouse/ClickHouse/pull/56022) ([vdimir](https://github.com/vdimir)). +* Added function `fromDaysSinceYearZero` which is similar to MySQL's `FROM_DAYS`. E.g. `SELECT fromDaysSinceYearZero(739136)` returns `2023-09-08`. [#56088](https://github.com/ClickHouse/ClickHouse/pull/56088) ([Joanna Hulboj](https://github.com/jh0x)). +* Add an external Python tool to view backups and to extract information from them without using ClickHouse. [#56268](https://github.com/ClickHouse/ClickHouse/pull/56268) ([Vitaly Baranov](https://github.com/vitlibar)). +* Implement a new setting called `preferred_optimize_projection_name`. If it is set to a non-empty string, the specified projection would be used if possible instead of choosing from all the candidates. [#56309](https://github.com/ClickHouse/ClickHouse/pull/56309) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add 4-letter command for yielding/resigning leadership (https://github.com/ClickHouse/ClickHouse/issues/56352). [#56354](https://github.com/ClickHouse/ClickHouse/pull/56354) ([Pradeep Chhetri](https://github.com/chhetripradeep)). [#56620](https://github.com/ClickHouse/ClickHouse/pull/56620) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Added a new SQL function, `arrayRandomSample(arr, k)` which returns a sample of k elements from the input array. Similar functionality could previously be achieved only with less convenient syntax, e.g. `SELECT arrayReduce('groupArraySample(3)', range(10))`. [#56416](https://github.com/ClickHouse/ClickHouse/pull/56416) ([Robert Schulze](https://github.com/rschu1ze)). +* Added support for `Float16` type data to use in `.npy` files. Closes [#56344](https://github.com/ClickHouse/ClickHouse/issues/56344). [#56424](https://github.com/ClickHouse/ClickHouse/pull/56424) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Added a system view `information_schema.statistics` for better compatibility with Tableau Online. [#56425](https://github.com/ClickHouse/ClickHouse/pull/56425) ([Serge Klochkov](https://github.com/slvrtrn)). +* Add `system.symbols` table useful for introspection of the binary. [#56548](https://github.com/ClickHouse/ClickHouse/pull/56548) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Configurable dashboards. Queries for charts are now loaded using a query, which by default uses a new `system.dashboards` table. [#56771](https://github.com/ClickHouse/ClickHouse/pull/56771) ([Sergei Trifonov](https://github.com/serxa)). +* Introduce `fileCluster` table function - it is useful if you mount a shared filesystem (NFS and similar) into the `user_files` directory. [#56868](https://github.com/ClickHouse/ClickHouse/pull/56868) ([Andrey Zvonov](https://github.com/zvonand)). +* Add `_size` virtual column with file size in bytes to `s3/file/hdfs/url/azureBlobStorage` engines. [#57126](https://github.com/ClickHouse/ClickHouse/pull/57126) ([Kruglov Pavel](https://github.com/Avogar)). +* Expose the number of errors for each error code occurred on a server since last restart from the Prometheus endpoint. [#57209](https://github.com/ClickHouse/ClickHouse/pull/57209) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* ClickHouse keeper reports its running availability zone at `/keeper/availability-zone` path. This can be configured via `us-west-1a`. [#56715](https://github.com/ClickHouse/ClickHouse/pull/56715) ([Jianfei Hu](https://github.com/incfly)). +* Make ALTER materialized_view MODIFY QUERY non experimental and deprecate `allow_experimental_alter_materialized_view_structure` setting. Fixes [#15206](https://github.com/ClickHouse/ClickHouse/issues/15206). [#57311](https://github.com/ClickHouse/ClickHouse/pull/57311) ([alesapin](https://github.com/alesapin)). +* Setting `join_algorithm` respects specified order [#51745](https://github.com/ClickHouse/ClickHouse/pull/51745) ([vdimir](https://github.com/vdimir)). +* Add support for the [well-known Protobuf types](https://protobuf.dev/reference/protobuf/google.protobuf/) in the Protobuf format. [#56741](https://github.com/ClickHouse/ClickHouse/pull/56741) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). + +#### Performance Improvement +* Adaptive timeouts for interacting with S3. The first attempt is made with low send and receive timeouts. [#56314](https://github.com/ClickHouse/ClickHouse/pull/56314) ([Sema Checherinda](https://github.com/CheSema)). +* Increase the default value of `max_concurrent_queries` from 100 to 1000. This makes sense when there is a large number of connecting clients, which are slowly sending or receiving data, so the server is not limited by CPU, or when the number of CPU cores is larger than 100. Also, enable the concurrency control by default, and set the desired number of query processing threads in total as twice the number of CPU cores. It improves performance in scenarios with a very large number of concurrent queries. [#46927](https://github.com/ClickHouse/ClickHouse/pull/46927) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support parallel evaluation of window functions. Fixes [#34688](https://github.com/ClickHouse/ClickHouse/issues/34688). [#39631](https://github.com/ClickHouse/ClickHouse/pull/39631) ([Dmitry Novik](https://github.com/novikd)). +* `Numbers` table engine (of the `system.numbers` table) now analyzes the condition to generate the needed subset of data, like table's index. [#50909](https://github.com/ClickHouse/ClickHouse/pull/50909) ([JackyWoo](https://github.com/JackyWoo)). +* Improved the performance of filtering by `IN (...)` condition for `Merge` table engine. [#54905](https://github.com/ClickHouse/ClickHouse/pull/54905) ([Nikita Taranov](https://github.com/nickitat)). +* An improvement which takes place when the filesystem cache is full and there are big reads. [#55158](https://github.com/ClickHouse/ClickHouse/pull/55158) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add ability to disable checksums for S3 to avoid excessive pass over the file (this is controlled by the setting `s3_disable_checksum`). [#55559](https://github.com/ClickHouse/ClickHouse/pull/55559) ([Azat Khuzhin](https://github.com/azat)). +* Now we read synchronously from remote tables when data is in page cache (like we do for local tables). It is faster, it doesn't require synchronisation inside the thread pool, and doesn't hesitate to do `seek`-s on local FS, and reduces CPU wait. [#55841](https://github.com/ClickHouse/ClickHouse/pull/55841) ([Nikita Taranov](https://github.com/nickitat)). +* Optimization for getting value from `map`, `arrayElement`. It will bring about 30% speedup. - reduce the reserved memory - reduce the `resize` call. [#55957](https://github.com/ClickHouse/ClickHouse/pull/55957) ([lgbo](https://github.com/lgbo-ustc)). +* Optimization of multi-stage filtering with AVX-512. The performance experiments of the OnTime dataset on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring the improvements of 7.4%, 5.9%, 4.7%, 3.0%, and 4.6% to the QPS of the query Q2, Q3, Q4, Q5 and Q6 respectively while having no impact on others. [#56079](https://github.com/ClickHouse/ClickHouse/pull/56079) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Limit the number of threads busy inside the query profiler. If there are more - they will skip profiling. [#56105](https://github.com/ClickHouse/ClickHouse/pull/56105) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Decrease the amount of virtual function calls in window functions. [#56120](https://github.com/ClickHouse/ClickHouse/pull/56120) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow recursive Tuple field pruning in ORC data format to speed up scaning. [#56122](https://github.com/ClickHouse/ClickHouse/pull/56122) ([李扬](https://github.com/taiyang-li)). +* Trivial count optimization for `Npy` data format: queries like `select count() from 'data.npy'` will work much more fast because of caching the results. [#56304](https://github.com/ClickHouse/ClickHouse/pull/56304) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Queries with aggregation and a large number of streams will use less amount of memory during the plan's construction. [#57074](https://github.com/ClickHouse/ClickHouse/pull/57074) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve performance of executing queries for use cases with many users and highly concurrent queries (>2000 QPS) by optimizing the access to ProcessList. [#57106](https://github.com/ClickHouse/ClickHouse/pull/57106) ([Andrej Hoos](https://github.com/adikus)). +* Trivial improvement on array join, reuse some intermediate results. [#57183](https://github.com/ClickHouse/ClickHouse/pull/57183) ([李扬](https://github.com/taiyang-li)). +* There are cases when stack unwinding was slow. Not anymore. [#57221](https://github.com/ClickHouse/ClickHouse/pull/57221) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now we use default read pool for reading from external storage when `max_streams = 1`. It is beneficial when read prefetches are enabled. [#57334](https://github.com/ClickHouse/ClickHouse/pull/57334) ([Nikita Taranov](https://github.com/nickitat)). +* Keeper improvement: improve memory-usage during startup by delaying log preprocessing. [#55660](https://github.com/ClickHouse/ClickHouse/pull/55660) ([Antonio Andelic](https://github.com/antonio2368)). +* Improved performance of glob matching for `File` and `HDFS` storages. [#56141](https://github.com/ClickHouse/ClickHouse/pull/56141) ([Andrey Zvonov](https://github.com/zvonand)). +* Posting lists in experimental full text indexes are now compressed which reduces their size by 10-30%. [#56226](https://github.com/ClickHouse/ClickHouse/pull/56226) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Parallelise `BackupEntriesCollector` in backups. [#56312](https://github.com/ClickHouse/ClickHouse/pull/56312) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement +* Add a new `MergeTree` setting `add_implicit_sign_column_constraint_for_collapsing_engine` (disabled by default). When enabled, it adds an implicit CHECK constraint for `CollapsingMergeTree` tables that restricts the value of the `Sign` column to be only -1 or 1. [#56701](https://github.com/ClickHouse/ClickHouse/issues/56701). [#56986](https://github.com/ClickHouse/ClickHouse/pull/56986) ([Kevin Mingtarja](https://github.com/kevinmingtarja)). +* Enable adding new disk to storage configuration without restart. [#56367](https://github.com/ClickHouse/ClickHouse/pull/56367) ([Duc Canh Le](https://github.com/canhld94)). +* Support creating and materializing index in the same alter query, also support "modify TTL" and "materialize TTL" in the same query. Closes [#55651](https://github.com/ClickHouse/ClickHouse/issues/55651). [#56331](https://github.com/ClickHouse/ClickHouse/pull/56331) ([flynn](https://github.com/ucasfl)). +* Add a new table function named `fuzzJSON` with rows containing perturbed versions of the source JSON string with random variations. [#56490](https://github.com/ClickHouse/ClickHouse/pull/56490) ([Julia Kartseva](https://github.com/jkartseva)). +* Engine `Merge` filters the records according to the row policies of the underlying tables, so you don't have to create another row policy on a `Merge` table. [#50209](https://github.com/ClickHouse/ClickHouse/pull/50209) ([Ilya Golshtein](https://github.com/ilejn)). +* Add a setting `max_execution_time_leaf` to limit the execution time on shard for distributed query, and `timeout_overflow_mode_leaf` to control the behaviour if timeout happens. [#51823](https://github.com/ClickHouse/ClickHouse/pull/51823) ([Duc Canh Le](https://github.com/canhld94)). +* Add ClickHouse setting to disable tunneling for HTTPS requests over HTTP proxy. [#55033](https://github.com/ClickHouse/ClickHouse/pull/55033) ([Arthur Passos](https://github.com/arthurpassos)). +* Set `background_fetches_pool_size` to 16, background_schedule_pool_size to 512 that is better for production usage with frequent small insertions. [#54327](https://github.com/ClickHouse/ClickHouse/pull/54327) ([Denny Crane](https://github.com/den-crane)). +* While read data from a csv format file, and at end of line is `\r` , which not followed by `\n`, then we will enconter the exception as follows `Cannot parse CSV format: found \r (CR) not followed by \n (LF). Line must end by \n (LF) or \r\n (CR LF) or \n\r.` In clickhouse, the csv end of line must be `\n` or `\r\n` or `\n\r`, so the `\r` must be followed by `\n`, but in some suitation, the csv input data is abnormal, like above, `\r` is at end of line. [#54340](https://github.com/ClickHouse/ClickHouse/pull/54340) ([KevinyhZou](https://github.com/KevinyhZou)). +* Update Arrow library to release-13.0.0 that supports new encodings. Closes [#44505](https://github.com/ClickHouse/ClickHouse/issues/44505). [#54800](https://github.com/ClickHouse/ClickHouse/pull/54800) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of ON CLUSTER queries by removing heavy system calls to get all network interfaces when looking for local ip address in the DDL entry hosts list. [#54909](https://github.com/ClickHouse/ClickHouse/pull/54909) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed accounting of memory allocated before attaching a thread to a query or a user. [#56089](https://github.com/ClickHouse/ClickHouse/pull/56089) ([Nikita Taranov](https://github.com/nickitat)). +* Add support for `LARGE_LIST` in Apache Arrow formats. [#56118](https://github.com/ClickHouse/ClickHouse/pull/56118) ([edef](https://github.com/edef1c)). +* Allow manual compaction of `EmbeddedRocksDB` via `OPTIMIZE` query. [#56225](https://github.com/ClickHouse/ClickHouse/pull/56225) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to specify BlockBasedTableOptions for `EmbeddedRocksDB` tables. [#56264](https://github.com/ClickHouse/ClickHouse/pull/56264) ([Azat Khuzhin](https://github.com/azat)). +* `SHOW COLUMNS` now displays MySQL's equivalent data type name when the connection was made through the MySQL protocol. Previously, this was the case when setting `use_mysql_types_in_show_columns = 1`. The setting is retained but made obsolete. [#56277](https://github.com/ClickHouse/ClickHouse/pull/56277) ([Robert Schulze](https://github.com/rschu1ze)). +* Fixed possible `The local set of parts of table doesn't look like the set of parts in ZooKeeper` error if server was restarted just after `TRUNCATE` or `DROP PARTITION`. [#56282](https://github.com/ClickHouse/ClickHouse/pull/56282) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fixed handling of non-const query strings in functions `formatQuery`/ `formatQuerySingleLine`. Also added `OrNull` variants of both functions that return a NULL when a query cannot be parsed instead of throwing an exception. [#56327](https://github.com/ClickHouse/ClickHouse/pull/56327) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow backup of materialized view with dropped inner table instead of failing the backup. [#56387](https://github.com/ClickHouse/ClickHouse/pull/56387) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Queries to `system.replicas` initiate requests to ZooKeeper when certain columns are queried. When there are thousands of tables these requests might produce a considerable load on ZooKeeper. If there are multiple simultaneous queries to `system.replicas` they do same requests multiple times. The change is to "deduplicate" requests from concurrent queries. [#56420](https://github.com/ClickHouse/ClickHouse/pull/56420) ([Alexander Gololobov](https://github.com/davenger)). +* Fix translation to MySQL compatible query for querying external databases. [#56456](https://github.com/ClickHouse/ClickHouse/pull/56456) ([flynn](https://github.com/ucasfl)). +* Add support for backing up and restoring tables using `KeeperMap` engine. [#56460](https://github.com/ClickHouse/ClickHouse/pull/56460) ([Antonio Andelic](https://github.com/antonio2368)). +* 404 response for CompleteMultipartUpload has to be rechecked. Operation could be done on server even if client got timeout or other network errors. The next retry of CompleteMultipartUpload receives 404 response. If the object key exists that operation is considered as successful. [#56475](https://github.com/ClickHouse/ClickHouse/pull/56475) ([Sema Checherinda](https://github.com/CheSema)). +* Enable the HTTP OPTIONS method by default - it simplifies requesting ClickHouse from a web browser. [#56483](https://github.com/ClickHouse/ClickHouse/pull/56483) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The value for `dns_max_consecutive_failures` was changed by mistake in [#46550](https://github.com/ClickHouse/ClickHouse/issues/46550) - this is reverted and adjusted to a better value. Also, increased the HTTP keep-alive timeout to a reasonable value from production. [#56485](https://github.com/ClickHouse/ClickHouse/pull/56485) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Load base backups lazily (a base backup won't be loaded until it's needed). Also add some log message and profile events for backups. [#56516](https://github.com/ClickHouse/ClickHouse/pull/56516) ([Vitaly Baranov](https://github.com/vitlibar)). +* Setting `query_cache_store_results_of_queries_with_nondeterministic_functions` (with values `false` or `true`) was marked obsolete. It was replaced by setting `query_cache_nondeterministic_function_handling`, a three-valued enum that controls how the query cache handles queries with non-deterministic functions: a) throw an exception (default behavior), b) save the non-deterministic query result regardless, or c) ignore, i.e. don't throw an exception and don't cache the result. [#56519](https://github.com/ClickHouse/ClickHouse/pull/56519) ([Robert Schulze](https://github.com/rschu1ze)). +* Rewrite equality with `is null` check in JOIN ON section. Experimental *Analyzer only*. [#56538](https://github.com/ClickHouse/ClickHouse/pull/56538) ([vdimir](https://github.com/vdimir)). +* Function`concat` now supports arbitrary argument types (instead of only String and FixedString arguments). This makes it behave more similar to MySQL `concat` implementation. For example, `SELECT concat('ab', 42)` now returns `ab42`. [#56540](https://github.com/ClickHouse/ClickHouse/pull/56540) ([Serge Klochkov](https://github.com/slvrtrn)). +* Allow getting cache configuration from 'named_collection' section in config or from SQL created named collections. [#56541](https://github.com/ClickHouse/ClickHouse/pull/56541) ([Kseniia Sumarokova](https://github.com/kssenii)). +* PostgreSQL database engine: Make the removal of outdated tables less aggressive with unsuccessful postgres connection. [#56609](https://github.com/ClickHouse/ClickHouse/pull/56609) ([jsc0218](https://github.com/jsc0218)). +* It took too much time to connnect to PG when URL is not right, so the relevant query stucks there and get cancelled. [#56648](https://github.com/ClickHouse/ClickHouse/pull/56648) ([jsc0218](https://github.com/jsc0218)). +* Keeper improvement: disable compressed logs by default in Keeper. [#56763](https://github.com/ClickHouse/ClickHouse/pull/56763) ([Antonio Andelic](https://github.com/antonio2368)). +* Add config setting `wait_dictionaries_load_at_startup`. [#56782](https://github.com/ClickHouse/ClickHouse/pull/56782) ([Vitaly Baranov](https://github.com/vitlibar)). +* There was a potential vulnerability in previous ClickHouse versions: if a user has connected and unsuccessfully tried to authenticate with the "interserver secret" method, the server didn't terminate the connection immediately but continued to receive and ignore the leftover packets from the client. While these packets are ignored, they are still parsed, and if they use a compression method with another known vulnerability, it will lead to exploitation of it without authentication. This issue was found with [ClickHouse Bug Bounty Program](https://github.com/ClickHouse/ClickHouse/issues/38986) by https://twitter.com/malacupa. [#56794](https://github.com/ClickHouse/ClickHouse/pull/56794) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fetching a part waits when that part is fully committed on remote replica. It is better not send part in PreActive state. In case of zero copy this is mandatory restriction. [#56808](https://github.com/ClickHouse/ClickHouse/pull/56808) ([Sema Checherinda](https://github.com/CheSema)). +* Fix possible postgresql logical replication conversion error when using experimental `MaterializedPostgreSQL`. [#53721](https://github.com/ClickHouse/ClickHouse/pull/53721) ([takakawa](https://github.com/takakawa)). +* Implement user-level setting `alter_move_to_space_execute_async` which allow to execute queries `ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME` asynchronously. The size of pool for background executions is controlled by `background_move_pool_size`. Default behavior is synchronous execution. Fixes [#47643](https://github.com/ClickHouse/ClickHouse/issues/47643). [#56809](https://github.com/ClickHouse/ClickHouse/pull/56809) ([alesapin](https://github.com/alesapin)). +* Able to filter by engine when scanning system.tables, avoid unnecessary (potentially time-consuming) connection. [#56813](https://github.com/ClickHouse/ClickHouse/pull/56813) ([jsc0218](https://github.com/jsc0218)). +* Show `total_bytes` and `total_rows` in system tables for RocksDB storage. [#56816](https://github.com/ClickHouse/ClickHouse/pull/56816) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Allow basic commands in ALTER for TEMPORARY tables. [#56892](https://github.com/ClickHouse/ClickHouse/pull/56892) ([Sergey](https://github.com/icuken)). +* LZ4 compression. Buffer compressed block in a rare case when out buffer capacity is not enough for writing compressed block directly to out's buffer. [#56938](https://github.com/ClickHouse/ClickHouse/pull/56938) ([Sema Checherinda](https://github.com/CheSema)). +* Add metrics for the number of queued jobs, which is useful for the IO thread pool. [#56958](https://github.com/ClickHouse/ClickHouse/pull/56958) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a setting for PostgreSQL table engine setting in the config file. Added a check for the setting Added documentation around the additional setting. [#56959](https://github.com/ClickHouse/ClickHouse/pull/56959) ([Peignon Melvyn](https://github.com/melvynator)). +* Function `concat` can now be called with a single argument, e.g., `SELECT concat('abc')`. This makes its behavior more consistent with MySQL's concat implementation. [#57000](https://github.com/ClickHouse/ClickHouse/pull/57000) ([Serge Klochkov](https://github.com/slvrtrn)). +* Signs all `x-amz-*` headers as required by AWS S3 docs. [#57001](https://github.com/ClickHouse/ClickHouse/pull/57001) ([Arthur Passos](https://github.com/arthurpassos)). +* Function `fromDaysSinceYearZero` (alias: `FROM_DAYS`) can now be used with unsigned and signed integer types (previously, it had to be an unsigned integer). This improve compatibility with 3rd party tools such as Tableau Online. [#57002](https://github.com/ClickHouse/ClickHouse/pull/57002) ([Serge Klochkov](https://github.com/slvrtrn)). +* Add `system.s3queue_log` to default config. [#57036](https://github.com/ClickHouse/ClickHouse/pull/57036) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Change the default for `wait_dictionaries_load_at_startup` to true, and use this setting only if `dictionaries_lazy_load` is false. [#57133](https://github.com/ClickHouse/ClickHouse/pull/57133) ([Vitaly Baranov](https://github.com/vitlibar)). +* Check dictionary source type on creation even if `dictionaries_lazy_load` is enabled. [#57134](https://github.com/ClickHouse/ClickHouse/pull/57134) ([Vitaly Baranov](https://github.com/vitlibar)). +* Plan-level optimizations can now be enabled/disabled individually. Previously, it was only possible to disable them all. The setting which previously did that (`query_plan_enable_optimizations`) is retained and can still be used to disable all optimizations. [#57152](https://github.com/ClickHouse/ClickHouse/pull/57152) ([Robert Schulze](https://github.com/rschu1ze)). +* The server's exit code will correspond to the exception code. For example, if the server cannot start due to memory limit, it will exit with the code 241 = MEMORY_LIMIT_EXCEEDED. In previous versions, the exit code for exceptions was always 70 = Poco::Util::ExitCode::EXIT_SOFTWARE. [#57153](https://github.com/ClickHouse/ClickHouse/pull/57153) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Do not demangle and symbolize stack frames from `functional` C++ header. [#57201](https://github.com/ClickHouse/ClickHouse/pull/57201) ([Mike Kot](https://github.com/myrrc)). +* HTTP server page `/dashboard` now supports charts with multiple lines. [#57236](https://github.com/ClickHouse/ClickHouse/pull/57236) ([Sergei Trifonov](https://github.com/serxa)). +* The `max_memory_usage_in_client` command line option supports a string value with a suffix (K, M, G, etc). Closes [#56879](https://github.com/ClickHouse/ClickHouse/issues/56879). [#57273](https://github.com/ClickHouse/ClickHouse/pull/57273) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Bumped Intel QPL (used by codec `DEFLATE_QPL`) from v1.2.0 to v1.3.1 . Also fixed a bug in case of BOF (Block On Fault) = 0, changed to handle page faults by falling back to SW path. [#57291](https://github.com/ClickHouse/ClickHouse/pull/57291) ([jasperzhu](https://github.com/jinjunzh)). +* Increase default `replicated_deduplication_window` of MergeTree settings from 100 to 1k. [#57335](https://github.com/ClickHouse/ClickHouse/pull/57335) ([sichenzhao](https://github.com/sichenzhao)). +* Stop using `INCONSISTENT_METADATA_FOR_BACKUP` that much. If possible prefer to continue scanning instead of stopping and starting the scanning for backup from the beginning. [#57385](https://github.com/ClickHouse/ClickHouse/pull/57385) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement +* Add SQLLogic test. [#56078](https://github.com/ClickHouse/ClickHouse/pull/56078) ([Han Fei](https://github.com/hanfei1991)). +* Make `clickhouse-local` and `clickhouse-client` available under short names (`ch`, `chl`, `chc`) for usability. [#56634](https://github.com/ClickHouse/ClickHouse/pull/56634) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimized build size further by removing unused code from external libraries. [#56786](https://github.com/ClickHouse/ClickHouse/pull/56786) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add automatic check that there are no large translation units. [#56559](https://github.com/ClickHouse/ClickHouse/pull/56559) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Lower the size of the single-binary distribution. This closes [#55181](https://github.com/ClickHouse/ClickHouse/issues/55181). [#56617](https://github.com/ClickHouse/ClickHouse/pull/56617) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Information about the sizes of every translation unit and binary file after each build will be sent to the CI database in ClickHouse Cloud. This closes [#56107](https://github.com/ClickHouse/ClickHouse/issues/56107). [#56636](https://github.com/ClickHouse/ClickHouse/pull/56636) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Certain files of "Apache Arrow" library (which we use only for non-essential things like parsing the arrow format) were rebuilt all the time regardless of the build cache. This is fixed. [#56657](https://github.com/ClickHouse/ClickHouse/pull/56657) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid recompiling translation units depending on the autogenerated source file about version. [#56660](https://github.com/ClickHouse/ClickHouse/pull/56660) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Tracing data of the linker invocations will be sent to the CI database in ClickHouse Cloud. [#56725](https://github.com/ClickHouse/ClickHouse/pull/56725) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use DWARF 5 debug symbols for the clickhouse binary (was DWARF 4 previously). [#56770](https://github.com/ClickHouse/ClickHouse/pull/56770) ([Michael Kolupaev](https://github.com/al13n321)). +* Add a new build option `SANITIZE_COVERAGE`. If it is enabled, the code is instrumented to track the coverage. The collected information is available inside ClickHouse with: (1) a new function `coverage` that returns an array of unique addresses in the code found after the previous coverage reset; (2) `SYSTEM RESET COVERAGE` query that resets the accumulated data. This allows us to compare the coverage of different tests, including differential code coverage. Continuation of [#20539](https://github.com/ClickHouse/ClickHouse/issues/20539). [#56102](https://github.com/ClickHouse/ClickHouse/pull/56102) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Some of the stack frames might not be resolved when collecting stacks. In such cases the raw address might be helpful. [#56267](https://github.com/ClickHouse/ClickHouse/pull/56267) ([Alexander Gololobov](https://github.com/davenger)). +* Add an option to disable `libssh`. [#56333](https://github.com/ClickHouse/ClickHouse/pull/56333) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable temporary_data_in_cache in S3 tests in CI. [#48425](https://github.com/ClickHouse/ClickHouse/pull/48425) ([vdimir](https://github.com/vdimir)). +* Set the max memory usage for clickhouse-client (`1G`) in the CI. [#56873](https://github.com/ClickHouse/ClickHouse/pull/56873) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix exerimental Analyzer - insertion from select with subquery referencing insertion table should process only insertion block. [#50857](https://github.com/ClickHouse/ClickHouse/pull/50857) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix a bug in `str_to_map` function. [#56423](https://github.com/ClickHouse/ClickHouse/pull/56423) ([Arthur Passos](https://github.com/arthurpassos)). +* Keeper `reconfig`: add timeout before yielding/taking leadership [#53481](https://github.com/ClickHouse/ClickHouse/pull/53481) ([Mike Kot](https://github.com/myrrc)). +* Fix incorrect header in grace hash join and filter pushdown [#53922](https://github.com/ClickHouse/ClickHouse/pull/53922) ([vdimir](https://github.com/vdimir)). +* Select from system tables when table based on table function. [#55540](https://github.com/ClickHouse/ClickHouse/pull/55540) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* RFC: Fix "Cannot find column X in source stream" for Distributed queries with LIMIT BY [#55836](https://github.com/ClickHouse/ClickHouse/pull/55836) ([Azat Khuzhin](https://github.com/azat)). +* Fix 'Cannot read from file:' while running client in a background [#55976](https://github.com/ClickHouse/ClickHouse/pull/55976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix clickhouse-local exit on bad send_logs_level setting [#55994](https://github.com/ClickHouse/ClickHouse/pull/55994) ([Kruglov Pavel](https://github.com/Avogar)). +* Bug fix explain ast with parameterized view [#56004](https://github.com/ClickHouse/ClickHouse/pull/56004) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix a crash during table loading on startup [#56232](https://github.com/ClickHouse/ClickHouse/pull/56232) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ClickHouse-sourced dictionaries with an explicit query [#56236](https://github.com/ClickHouse/ClickHouse/pull/56236) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix segfault in signal handler for Keeper [#56266](https://github.com/ClickHouse/ClickHouse/pull/56266) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix incomplete query result for UNION in view() function. [#56274](https://github.com/ClickHouse/ClickHouse/pull/56274) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inconsistency of "cast('0' as DateTime64(3))" and "cast('0' as Nullable(DateTime64(3)))" [#56286](https://github.com/ClickHouse/ClickHouse/pull/56286) ([李扬](https://github.com/taiyang-li)). +* Fix rare race condition related to Memory allocation failure [#56303](https://github.com/ClickHouse/ClickHouse/pull/56303) ([alesapin](https://github.com/alesapin)). +* Fix restore from backup with `flatten_nested` and `data_type_default_nullable` [#56306](https://github.com/ClickHouse/ClickHouse/pull/56306) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash in case of adding a column with type Object(JSON) [#56307](https://github.com/ClickHouse/ClickHouse/pull/56307) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix crash in filterPushDown [#56380](https://github.com/ClickHouse/ClickHouse/pull/56380) ([vdimir](https://github.com/vdimir)). +* Fix restore from backup with mat view and dropped source table [#56383](https://github.com/ClickHouse/ClickHouse/pull/56383) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix segfault during Kerberos initialization [#56401](https://github.com/ClickHouse/ClickHouse/pull/56401) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix buffer overflow in T64 [#56434](https://github.com/ClickHouse/ClickHouse/pull/56434) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix nullable primary key in final (2) [#56452](https://github.com/ClickHouse/ClickHouse/pull/56452) ([Amos Bird](https://github.com/amosbird)). +* Fix ON CLUSTER queries without database on initial node [#56484](https://github.com/ClickHouse/ClickHouse/pull/56484) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix startup failure due to TTL dependency [#56489](https://github.com/ClickHouse/ClickHouse/pull/56489) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ALTER COMMENT queries ON CLUSTER [#56491](https://github.com/ClickHouse/ClickHouse/pull/56491) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ALTER COLUMN with ALIAS [#56493](https://github.com/ClickHouse/ClickHouse/pull/56493) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix empty NAMED COLLECTIONs [#56494](https://github.com/ClickHouse/ClickHouse/pull/56494) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix two cases of projection analysis. [#56502](https://github.com/ClickHouse/ClickHouse/pull/56502) ([Amos Bird](https://github.com/amosbird)). +* Fix handling of aliases in query cache [#56545](https://github.com/ClickHouse/ClickHouse/pull/56545) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix conversion from `Nullable(Enum)` to `Nullable(String)` [#56644](https://github.com/ClickHouse/ClickHouse/pull/56644) ([Nikolay Degterinsky](https://github.com/evillique)). +* More reliable log handling in Keeper [#56670](https://github.com/ClickHouse/ClickHouse/pull/56670) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix configuration merge for nodes with substitution attributes [#56694](https://github.com/ClickHouse/ClickHouse/pull/56694) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix duplicate usage of table function input(). [#56695](https://github.com/ClickHouse/ClickHouse/pull/56695) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix: RabbitMQ OpenSSL dynamic loading issue [#56703](https://github.com/ClickHouse/ClickHouse/pull/56703) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix crash in GCD codec in case when zeros present in data [#56704](https://github.com/ClickHouse/ClickHouse/pull/56704) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix 'mutex lock failed: Invalid argument' in clickhouse-local during insert into function [#56710](https://github.com/ClickHouse/ClickHouse/pull/56710) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Date text parsing in optimistic path [#56765](https://github.com/ClickHouse/ClickHouse/pull/56765) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash in FPC codec [#56795](https://github.com/ClickHouse/ClickHouse/pull/56795) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* DatabaseReplicated: fix DDL query timeout after recovering a replica [#56796](https://github.com/ClickHouse/ClickHouse/pull/56796) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix incorrect nullable columns reporting in MySQL binary protocol [#56799](https://github.com/ClickHouse/ClickHouse/pull/56799) ([Serge Klochkov](https://github.com/slvrtrn)). +* Support Iceberg metadata files for metastore tables [#56810](https://github.com/ClickHouse/ClickHouse/pull/56810) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix TSAN report under transform [#56817](https://github.com/ClickHouse/ClickHouse/pull/56817) ([Raúl Marín](https://github.com/Algunenano)). +* Fix SET query and SETTINGS formatting [#56825](https://github.com/ClickHouse/ClickHouse/pull/56825) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix failure to start due to table dependency in joinGet [#56828](https://github.com/ClickHouse/ClickHouse/pull/56828) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix flattening existing Nested columns during ADD COLUMN [#56830](https://github.com/ClickHouse/ClickHouse/pull/56830) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix allow cr end of line for csv [#56901](https://github.com/ClickHouse/ClickHouse/pull/56901) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix `tryBase64Decode` with invalid input [#56913](https://github.com/ClickHouse/ClickHouse/pull/56913) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix generating deep nested columns in CapnProto/Protobuf schemas [#56941](https://github.com/ClickHouse/ClickHouse/pull/56941) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent incompatible ALTER of projection columns [#56948](https://github.com/ClickHouse/ClickHouse/pull/56948) ([Amos Bird](https://github.com/amosbird)). +* Fix sqlite file path validation [#56984](https://github.com/ClickHouse/ClickHouse/pull/56984) ([San](https://github.com/santrancisco)). +* S3Queue: fix metadata reference increment [#56990](https://github.com/ClickHouse/ClickHouse/pull/56990) ([Kseniia Sumarokova](https://github.com/kssenii)). +* S3Queue minor fix [#56999](https://github.com/ClickHouse/ClickHouse/pull/56999) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix file path validation for DatabaseFileSystem [#57029](https://github.com/ClickHouse/ClickHouse/pull/57029) ([San](https://github.com/santrancisco)). +* Fix `fuzzBits` with `ARRAY JOIN` [#57033](https://github.com/ClickHouse/ClickHouse/pull/57033) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix Nullptr dereference in partial merge join with joined_subquery_re… [#57048](https://github.com/ClickHouse/ClickHouse/pull/57048) ([vdimir](https://github.com/vdimir)). +* Fix race condition in RemoteSource [#57052](https://github.com/ClickHouse/ClickHouse/pull/57052) ([Raúl Marín](https://github.com/Algunenano)). +* Implement `bitHammingDistance` for big integers [#57073](https://github.com/ClickHouse/ClickHouse/pull/57073) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* S3-style links bug fix [#57075](https://github.com/ClickHouse/ClickHouse/pull/57075) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix JSON_QUERY function with multiple numeric paths [#57096](https://github.com/ClickHouse/ClickHouse/pull/57096) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix buffer overflow in Gorilla codec [#57107](https://github.com/ClickHouse/ClickHouse/pull/57107) ([Nikolay Degterinsky](https://github.com/evillique)). +* Close interserver connection on any exception before authentication [#57142](https://github.com/ClickHouse/ClickHouse/pull/57142) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix segfault after ALTER UPDATE with Nullable MATERIALIZED column [#57147](https://github.com/ClickHouse/ClickHouse/pull/57147) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix incorrect JOIN plan optimization with partially materialized normal projection [#57196](https://github.com/ClickHouse/ClickHouse/pull/57196) ([Amos Bird](https://github.com/amosbird)). +* Ignore comments when comparing column descriptions [#57259](https://github.com/ClickHouse/ClickHouse/pull/57259) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `ReadonlyReplica` metric for all cases [#57267](https://github.com/ClickHouse/ClickHouse/pull/57267) ([Antonio Andelic](https://github.com/antonio2368)). +* Background merges correctly use temporary data storage in the cache [#57275](https://github.com/ClickHouse/ClickHouse/pull/57275) ([vdimir](https://github.com/vdimir)). +* Keeper fix for changelog and snapshots [#57299](https://github.com/ClickHouse/ClickHouse/pull/57299) ([Antonio Andelic](https://github.com/antonio2368)). +* Ignore finished ON CLUSTER tasks if hostname changed [#57339](https://github.com/ClickHouse/ClickHouse/pull/57339) ([Alexander Tokmakov](https://github.com/tavplubix)). +* MergeTree mutations reuse source part index granularity [#57352](https://github.com/ClickHouse/ClickHouse/pull/57352) ([Maksim Kita](https://github.com/kitaisreal)). +* FS cache: add a limit for background download [#57424](https://github.com/ClickHouse/ClickHouse/pull/57424) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +### ClickHouse release 23.10, 2023-11-02 {#2310} + +#### Backward Incompatible Change +* There is no longer an option to automatically remove broken data parts. This closes [#55174](https://github.com/ClickHouse/ClickHouse/issues/55174). [#55184](https://github.com/ClickHouse/ClickHouse/pull/55184) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#55557](https://github.com/ClickHouse/ClickHouse/pull/55557) ([Jihyuk Bok](https://github.com/tomahawk28)). +* The obsolete in-memory data parts can no longer be read from the write-ahead log. If you have configured in-memory parts before, they have to be removed before the upgrade. [#55186](https://github.com/ClickHouse/ClickHouse/pull/55186) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the integration with Meilisearch. Reason: it was compatible only with the old version 0.18. The recent version of Meilisearch changed the protocol and does not work anymore. Note: we would appreciate it if you help to return it back. [#55189](https://github.com/ClickHouse/ClickHouse/pull/55189) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Rename directory monitor concept into background INSERT. All the settings `*directory_monitor*` had been renamed to `distributed_background_insert*`. *Backward compatibility should be preserved* (since old settings had been added as an alias). [#55978](https://github.com/ClickHouse/ClickHouse/pull/55978) ([Azat Khuzhin](https://github.com/azat)). +* Do not interpret the `send_timeout` set on the client side as the `receive_timeout` on the server side and vise-versa. [#56035](https://github.com/ClickHouse/ClickHouse/pull/56035) ([Azat Khuzhin](https://github.com/azat)). +* Comparison of time intervals with different units will throw an exception. This closes [#55942](https://github.com/ClickHouse/ClickHouse/issues/55942). You might have occasionally rely on the previous behavior when the underlying numeric values were compared regardless of the units. [#56090](https://github.com/ClickHouse/ClickHouse/pull/56090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Rewrited the experimental `S3Queue` table engine completely: changed the way we keep information in zookeeper which allows to make less zookeeper requests, added caching of zookeeper state in cases when we know the state will not change, improved the polling from s3 process to make it less aggressive, changed the way ttl and max set for trached files is maintained, now it is a background process. Added `system.s3queue` and `system.s3queue_log` tables. Closes [#54998](https://github.com/ClickHouse/ClickHouse/issues/54998). [#54422](https://github.com/ClickHouse/ClickHouse/pull/54422) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Arbitrary paths on HTTP endpoint are no longer interpreted as a request to the `/query` endpoint. [#55521](https://github.com/ClickHouse/ClickHouse/pull/55521) ([Konstantin Bogdanov](https://github.com/thevar1able)). + +#### New Feature +* Add function `arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn)` which applies a lambda function to multiple arrays of the same cardinality and collects the result in an accumulator. [#49794](https://github.com/ClickHouse/ClickHouse/pull/49794) ([Lirikl](https://github.com/Lirikl)). +* Support for `Npy` format. `SELECT * FROM file('example_array.npy', Npy)`. [#55982](https://github.com/ClickHouse/ClickHouse/pull/55982) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* If a table has a space-filling curve in its key, e.g., `ORDER BY mortonEncode(x, y)`, the conditions on its arguments, e.g., `x >= 10 AND x <= 20 AND y >= 20 AND y <= 30` can be used for indexing. A setting `analyze_index_with_space_filling_curves` is added to enable or disable this analysis. This closes [#41195](https://github.com/ClickHouse/ClickHouse/issue/41195). Continuation of [#4538](https://github.com/ClickHouse/ClickHouse/pull/4538). Continuation of [#6286](https://github.com/ClickHouse/ClickHouse/pull/6286). Continuation of [#28130](https://github.com/ClickHouse/ClickHouse/pull/28130). Continuation of [#41753](https://github.com/ClickHouse/ClickHouse/pull/#41753). [#55642](https://github.com/ClickHouse/ClickHouse/pull/55642) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A new setting called `force_optimize_projection_name`, it takes a name of projection as an argument. If it's value set to a non-empty string, ClickHouse checks that this projection is used in the query at least once. Closes [#55331](https://github.com/ClickHouse/ClickHouse/issues/55331). [#56134](https://github.com/ClickHouse/ClickHouse/pull/56134) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Support asynchronous inserts with external data via native protocol. Previously it worked only if data is inlined into query. [#54730](https://github.com/ClickHouse/ClickHouse/pull/54730) ([Anton Popov](https://github.com/CurtizJ)). +* Added aggregation function `lttb` which uses the [Largest-Triangle-Three-Buckets](https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf) algorithm for downsampling data for visualization. [#53145](https://github.com/ClickHouse/ClickHouse/pull/53145) ([Sinan](https://github.com/sinsinan)). +* Query`CHECK TABLE` has better performance and usability (sends progress updates, cancellable). Support checking particular part with `CHECK TABLE ... PART 'part_name'`. [#53404](https://github.com/ClickHouse/ClickHouse/pull/53404) ([vdimir](https://github.com/vdimir)). +* Added function `jsonMergePatch`. When working with JSON data as strings, it provides a way to merge these strings (of JSON objects) together to form a single string containing a single JSON object. [#54364](https://github.com/ClickHouse/ClickHouse/pull/54364) ([Memo](https://github.com/Joeywzr)). +* The second part of Kusto Query Language dialect support. [Phase 1 implementation ](https://github.com/ClickHouse/ClickHouse/pull/37961) has been merged. [#42510](https://github.com/ClickHouse/ClickHouse/pull/42510) ([larryluogit](https://github.com/larryluogit)). +* Added a new SQL function, `arrayRandomSample(arr, k)` which returns a sample of k elements from the input array. Similar functionality could previously be achieved only with less convenient syntax, e.g. "SELECT arrayReduce('groupArraySample(3)', range(10))". [#54391](https://github.com/ClickHouse/ClickHouse/pull/54391) ([itayisraelov](https://github.com/itayisraelov)). +* Introduce `-ArgMin`/`-ArgMax` aggregate combinators which allow to aggregate by min/max values only. One use case can be found in [#54818](https://github.com/ClickHouse/ClickHouse/issues/54818). This PR also reorganize combinators into dedicated folder. [#54947](https://github.com/ClickHouse/ClickHouse/pull/54947) ([Amos Bird](https://github.com/amosbird)). +* Allow to drop cache for Protobuf format with `SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]`. [#55064](https://github.com/ClickHouse/ClickHouse/pull/55064) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Add external HTTP Basic authenticator. [#55199](https://github.com/ClickHouse/ClickHouse/pull/55199) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Added function `byteSwap` which reverses the bytes of unsigned integers. This is particularly useful for reversing values of types which are represented as unsigned integers internally such as IPv4. [#55211](https://github.com/ClickHouse/ClickHouse/pull/55211) ([Priyansh Agrawal](https://github.com/Priyansh121096)). +* Added function `formatQuery` which returns a formatted version (possibly spanning multiple lines) of a SQL query string. Also added function `formatQuerySingleLine` which does the same but the returned string will not contain linebreaks. [#55239](https://github.com/ClickHouse/ClickHouse/pull/55239) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Added `DWARF` input format that reads debug symbols from an ELF executable/library/object file. [#55450](https://github.com/ClickHouse/ClickHouse/pull/55450) ([Michael Kolupaev](https://github.com/al13n321)). +* Allow to save unparsed records and errors in RabbitMQ, NATS and FileLog engines. Add virtual columns `_error` and `_raw_message`(for NATS and RabbitMQ), `_raw_record` (for FileLog) that are filled when ClickHouse fails to parse new record. The behaviour is controlled under storage settings `nats_handle_error_mode` for NATS, `rabbitmq_handle_error_mode` for RabbitMQ, `handle_error_mode` for FileLog similar to `kafka_handle_error_mode`. If it's set to `default`, en exception will be thrown when ClickHouse fails to parse a record, if it's set to `stream`, erorr and raw record will be saved into virtual columns. Closes [#36035](https://github.com/ClickHouse/ClickHouse/issues/36035). [#55477](https://github.com/ClickHouse/ClickHouse/pull/55477) ([Kruglov Pavel](https://github.com/Avogar)). +* Keeper client improvement: add `get_all_children_number command` that returns number of all children nodes under a specific path. [#55485](https://github.com/ClickHouse/ClickHouse/pull/55485) ([guoxiaolong](https://github.com/guoxiaolongzte)). +* Keeper client improvement: add `get_direct_children_number` command that returns number of direct children nodes under a path. [#55898](https://github.com/ClickHouse/ClickHouse/pull/55898) ([xuzifu666](https://github.com/xuzifu666)). +* Add statement `SHOW SETTING setting_name` which is a simpler version of existing statement `SHOW SETTINGS`. [#55979](https://github.com/ClickHouse/ClickHouse/pull/55979) ([Maksim Kita](https://github.com/kitaisreal)). +* Added fields `substreams` and `filenames` to the `system.parts_columns` table. [#55108](https://github.com/ClickHouse/ClickHouse/pull/55108) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for `SHOW MERGES` query. [#55815](https://github.com/ClickHouse/ClickHouse/pull/55815) ([megao](https://github.com/jetgm)). +* Introduce a setting `create_table_empty_primary_key_by_default` for default `ORDER BY ()`. [#55899](https://github.com/ClickHouse/ClickHouse/pull/55899) ([Srikanth Chekuri](https://github.com/srikanthccv)). + +#### Performance Improvement +* Add option `query_plan_preserve_num_streams_after_window_functions` to preserve the number of streams after evaluating window functions to allow parallel stream processing. [#50771](https://github.com/ClickHouse/ClickHouse/pull/50771) ([frinkr](https://github.com/frinkr)). +* Release more streams if data is small. [#53867](https://github.com/ClickHouse/ClickHouse/pull/53867) ([Jiebin Sun](https://github.com/jiebinn)). +* RoaringBitmaps being optimized before serialization. [#55044](https://github.com/ClickHouse/ClickHouse/pull/55044) ([UnamedRus](https://github.com/UnamedRus)). +* Posting lists in inverted indexes are now optimized to use the smallest possible representation for internal bitmaps. Depending on the repetitiveness of the data, this may significantly reduce the space consumption of inverted indexes. [#55069](https://github.com/ClickHouse/ClickHouse/pull/55069) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Fix contention on Context lock, this significantly improves performance for a lot of short-running concurrent queries. [#55121](https://github.com/ClickHouse/ClickHouse/pull/55121) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved the performance of inverted index creation by 30%. This was achieved by replacing `std::unordered_map` with `absl::flat_hash_map`. [#55210](https://github.com/ClickHouse/ClickHouse/pull/55210) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Support ORC filter push down (rowgroup level). [#55330](https://github.com/ClickHouse/ClickHouse/pull/55330) ([李扬](https://github.com/taiyang-li)). +* Improve performance of external aggregation with a lot of temporary files. [#55489](https://github.com/ClickHouse/ClickHouse/pull/55489) ([Maksim Kita](https://github.com/kitaisreal)). +* Set a reasonable size for the marks cache for secondary indices by default to avoid loading the marks over and over again. [#55654](https://github.com/ClickHouse/ClickHouse/pull/55654) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary reconstruction of index granules when reading skip indexes. This addresses [#55653](https://github.com/ClickHouse/ClickHouse/issues/55653#issuecomment-1763766009). [#55683](https://github.com/ClickHouse/ClickHouse/pull/55683) ([Amos Bird](https://github.com/amosbird)). +* Cache CAST function in set during execution to improve the performance of function `IN` when set element type doesn't exactly match column type. [#55712](https://github.com/ClickHouse/ClickHouse/pull/55712) ([Duc Canh Le](https://github.com/canhld94)). +* Performance improvement for `ColumnVector::insertMany` and `ColumnVector::insertManyFrom`. [#55714](https://github.com/ClickHouse/ClickHouse/pull/55714) ([frinkr](https://github.com/frinkr)). +* Optimized Map subscript operations by predicting the next row's key position and reduce the comparisons. [#55929](https://github.com/ClickHouse/ClickHouse/pull/55929) ([lgbo](https://github.com/lgbo-ustc)). +* Support struct fields pruning in Parquet (in previous versions it didn't work in some cases). [#56117](https://github.com/ClickHouse/ClickHouse/pull/56117) ([lgbo](https://github.com/lgbo-ustc)). +* Add the ability to tune the number of parallel replicas used in a query execution based on the estimation of rows to read. [#51692](https://github.com/ClickHouse/ClickHouse/pull/51692) ([Raúl Marín](https://github.com/Algunenano)). +* Optimized external aggregation memory consumption in case many temporary files were generated. [#54798](https://github.com/ClickHouse/ClickHouse/pull/54798) ([Nikita Taranov](https://github.com/nickitat)). +* Distributed queries executed in `async_socket_for_remote` mode (default) now respect `max_threads` limit. Previously, some queries could create excessive threads (up to `max_distributed_connections`), causing server performance issues. [#53504](https://github.com/ClickHouse/ClickHouse/pull/53504) ([filimonov](https://github.com/filimonov)). +* Caching skip-able entries while executing DDL from Zookeeper distributed DDL queue. [#54828](https://github.com/ClickHouse/ClickHouse/pull/54828) ([Duc Canh Le](https://github.com/canhld94)). +* Experimental inverted indexes do not store tokens with too many matches (i.e. row ids in the posting list). This saves space and avoids ineffective index lookups when sequential scans would be equally fast or faster. The previous heuristics (`density` parameter passed to the index definition) that controlled when tokens would not be stored was too confusing for users. A much simpler heuristics based on parameter `max_rows_per_postings_list` (default: 64k) is introduced which directly controls the maximum allowed number of row ids in a postings list. [#55616](https://github.com/ClickHouse/ClickHouse/pull/55616) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Improve write performance to `EmbeddedRocksDB` tables. [#55732](https://github.com/ClickHouse/ClickHouse/pull/55732) ([Duc Canh Le](https://github.com/canhld94)). +* Improved overall resilience for ClickHouse in case of many parts within partition (more than 1000). It might reduce the number of `TOO_MANY_PARTS` errors. [#55526](https://github.com/ClickHouse/ClickHouse/pull/55526) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Reduced memory consumption during loading of hierarchical dictionaries. [#55838](https://github.com/ClickHouse/ClickHouse/pull/55838) ([Nikita Taranov](https://github.com/nickitat)). +* All dictionaries support setting `dictionary_use_async_executor`. [#55839](https://github.com/ClickHouse/ClickHouse/pull/55839) ([vdimir](https://github.com/vdimir)). +* Prevent excesive memory usage when deserializing AggregateFunctionTopKGenericData. [#55947](https://github.com/ClickHouse/ClickHouse/pull/55947) ([Raúl Marín](https://github.com/Algunenano)). +* On a Keeper with lots of watches AsyncMetrics threads can consume 100% of CPU for noticable time in `DB::KeeperStorage::getSessionsWithWatchesCount`. The fix is to avoid traversing heavy `watches` and `list_watches` sets. [#56054](https://github.com/ClickHouse/ClickHouse/pull/56054) ([Alexander Gololobov](https://github.com/davenger)). +* Add setting `optimize_trivial_approximate_count_query` to use `count` approximation for storage EmbeddedRocksDB. Enable trivial count for StorageJoin. [#55806](https://github.com/ClickHouse/ClickHouse/pull/55806) ([Duc Canh Le](https://github.com/canhld94)). + +#### Improvement +* Functions `toDayOfWeek` (MySQL alias: `DAYOFWEEK`), `toYearWeek` (`YEARWEEK`) and `toWeek` (`WEEK`) now supports `String` arguments. This makes its behavior consistent with MySQL's behavior. [#55589](https://github.com/ClickHouse/ClickHouse/pull/55589) ([Robert Schulze](https://github.com/rschu1ze)). +* Introduced setting `date_time_overflow_behavior` with possible values `ignore`, `throw`, `saturate` that controls the overflow behavior when converting from Date, Date32, DateTime64, Integer or Float to Date, Date32, DateTime or DateTime64. [#55696](https://github.com/ClickHouse/ClickHouse/pull/55696) ([Andrey Zvonov](https://github.com/zvonand)). +* Implement query parameters support for `ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}`. Merges [#49516](https://github.com/ClickHouse/ClickHouse/issues/49516). Closes [#49449](https://github.com/ClickHouse/ClickHouse/issues/49449). [#55604](https://github.com/ClickHouse/ClickHouse/pull/55604) ([alesapin](https://github.com/alesapin)). +* Print processor ids in a prettier manner in EXPLAIN. [#48852](https://github.com/ClickHouse/ClickHouse/pull/48852) ([Vlad Seliverstov](https://github.com/behebot)). +* Creating a direct dictionary with a lifetime field will be rejected at create time (as the lifetime does not make sense for direct dictionaries). Fixes: [#27861](https://github.com/ClickHouse/ClickHouse/issues/27861). [#49043](https://github.com/ClickHouse/ClickHouse/pull/49043) ([Rory Crispin](https://github.com/RoryCrispin)). +* Allow parameters in queries with partitions like `ALTER TABLE t DROP PARTITION`. Closes [#49449](https://github.com/ClickHouse/ClickHouse/issues/49449). [#49516](https://github.com/ClickHouse/ClickHouse/pull/49516) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add a new column `xid` for `system.zookeeper_connection`. [#50702](https://github.com/ClickHouse/ClickHouse/pull/50702) ([helifu](https://github.com/helifu)). +* Display the correct server settings in `system.server_settings` after configuration reload. [#53774](https://github.com/ClickHouse/ClickHouse/pull/53774) ([helifu](https://github.com/helifu)). +* Add support for mathematical minus `−` character in queries, similar to `-`. [#54100](https://github.com/ClickHouse/ClickHouse/pull/54100) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add replica groups to the experimental `Replicated` database engine. Closes [#53620](https://github.com/ClickHouse/ClickHouse/issues/53620). [#54421](https://github.com/ClickHouse/ClickHouse/pull/54421) ([Nikolay Degterinsky](https://github.com/evillique)). +* It is better to retry retriable s3 errors than totally fail the query. Set bigger value to the s3_retry_attempts by default. [#54770](https://github.com/ClickHouse/ClickHouse/pull/54770) ([Sema Checherinda](https://github.com/CheSema)). +* Add load balancing mode `hostname_levenshtein_distance`. [#54826](https://github.com/ClickHouse/ClickHouse/pull/54826) ([JackyWoo](https://github.com/JackyWoo)). +* Improve hiding secrets in logs. [#55089](https://github.com/ClickHouse/ClickHouse/pull/55089) ([Vitaly Baranov](https://github.com/vitlibar)). +* For now the projection analysis will be performed only on top of query plan. The setting `query_plan_optimize_projection` became obsolete (it was enabled by default long time ago). [#55112](https://github.com/ClickHouse/ClickHouse/pull/55112) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* When function `untuple` is now called on a tuple with named elements and itself has an alias (e.g. `select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias`), then the result column name is now generated from the untuple alias and the tuple element alias (in the example: "untuple_alias.element_alias"). [#55123](https://github.com/ClickHouse/ClickHouse/pull/55123) ([garcher22](https://github.com/garcher22)). +* Added setting `describe_include_virtual_columns`, which allows to include virtual columns of table into result of `DESCRIBE` query. Added setting `describe_compact_output`. If it is set to `true`, `DESCRIBE` query returns only names and types of columns without extra information. [#55129](https://github.com/ClickHouse/ClickHouse/pull/55129) ([Anton Popov](https://github.com/CurtizJ)). +* Sometimes `OPTIMIZE` with `optimize_throw_if_noop=1` may fail with an error `unknown reason` while the real cause of it - different projections in different parts. This behavior is fixed. [#55130](https://github.com/ClickHouse/ClickHouse/pull/55130) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow to have several `MaterializedPostgreSQL` tables following the same Postgres table. By default this behaviour is not enabled (for compatibility, because it is a backward-incompatible change), but can be turned on with setting `materialized_postgresql_use_unique_replication_consumer_identifier`. Closes [#54918](https://github.com/ClickHouse/ClickHouse/issues/54918). [#55145](https://github.com/ClickHouse/ClickHouse/pull/55145) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to parse negative `DateTime64` and `DateTime` with fractional part from short strings. [#55146](https://github.com/ClickHouse/ClickHouse/pull/55146) ([Andrey Zvonov](https://github.com/zvonand)). +* To improve compatibility with MySQL, 1. `information_schema.tables` now includes the new field `table_rows`, and 2. `information_schema.columns` now includes the new field `extra`. [#55215](https://github.com/ClickHouse/ClickHouse/pull/55215) ([Robert Schulze](https://github.com/rschu1ze)). +* Clickhouse-client won't show "0 rows in set" if it is zero and if exception was thrown. [#55240](https://github.com/ClickHouse/ClickHouse/pull/55240) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Support rename table without keyword `TABLE` like `RENAME db.t1 to db.t2`. [#55373](https://github.com/ClickHouse/ClickHouse/pull/55373) ([凌涛](https://github.com/lingtaolf)). +* Add `internal_replication` to `system.clusters`. [#55377](https://github.com/ClickHouse/ClickHouse/pull/55377) ([Konstantin Morozov](https://github.com/k-morozov)). +* Select remote proxy resolver based on request protocol, add proxy feature docs and remove `DB::ProxyConfiguration::Protocol::ANY`. [#55430](https://github.com/ClickHouse/ClickHouse/pull/55430) ([Arthur Passos](https://github.com/arthurpassos)). +* Avoid retrying keeper operations on INSERT after table shutdown. [#55519](https://github.com/ClickHouse/ClickHouse/pull/55519) ([Azat Khuzhin](https://github.com/azat)). +* `SHOW COLUMNS` now correctly reports type `FixedString` as `BLOB` if setting `use_mysql_types_in_show_columns` is on. Also added two new settings, `mysql_map_string_to_text_in_show_columns` and `mysql_map_fixed_string_to_text_in_show_columns` to switch the output for types `String` and `FixedString` as `TEXT` or `BLOB`. [#55617](https://github.com/ClickHouse/ClickHouse/pull/55617) ([Serge Klochkov](https://github.com/slvrtrn)). +* During ReplicatedMergeTree tables startup clickhouse server checks set of parts for unexpected parts (exists locally, but not in zookeeper). All unexpected parts move to detached directory and instead of them server tries to restore some ancestor (covered) parts. Now server tries to restore closest ancestors instead of random covered parts. [#55645](https://github.com/ClickHouse/ClickHouse/pull/55645) ([alesapin](https://github.com/alesapin)). +* The advanced dashboard now supports draggable charts on touch devices. This closes [#54206](https://github.com/ClickHouse/ClickHouse/issues/54206). [#55649](https://github.com/ClickHouse/ClickHouse/pull/55649) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use the default query format if declared when outputting exception with `http_write_exception_in_output_format`. [#55739](https://github.com/ClickHouse/ClickHouse/pull/55739) ([Raúl Marín](https://github.com/Algunenano)). +* Provide a better message for common MATERIALIZED VIEW pitfalls. [#55826](https://github.com/ClickHouse/ClickHouse/pull/55826) ([Raúl Marín](https://github.com/Algunenano)). +* If you dropped the current database, you will still be able to run some queries in `clickhouse-local` and switch to another database. This makes the behavior consistent with `clickhouse-client`. This closes [#55834](https://github.com/ClickHouse/ClickHouse/issues/55834). [#55853](https://github.com/ClickHouse/ClickHouse/pull/55853) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Functions `(add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond)` now support string-encoded date arguments, e.g. `SELECT addDays('2023-10-22', 1)`. This increases compatibility with MySQL and is needed by Tableau Online. [#55869](https://github.com/ClickHouse/ClickHouse/pull/55869) ([Robert Schulze](https://github.com/rschu1ze)). +* The setting `apply_deleted_mask` when disabled allows to read rows that where marked as deleted by lightweight DELETE queries. This is useful for debugging. [#55952](https://github.com/ClickHouse/ClickHouse/pull/55952) ([Alexander Gololobov](https://github.com/davenger)). +* Allow skipping `null` values when serailizing Tuple to json objects, which makes it possible to keep compatiability with Spark's `to_json` function, which is also useful for gluten. [#55956](https://github.com/ClickHouse/ClickHouse/pull/55956) ([李扬](https://github.com/taiyang-li)). +* Functions `(add|sub)Date` now support string-encoded date arguments, e.g. `SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE)`. The same support for string-encoded date arguments is added to the plus and minus operators, e.g. `SELECT '2023-10-23' + INTERVAL 1 DAY`. This increases compatibility with MySQL and is needed by Tableau Online. [#55960](https://github.com/ClickHouse/ClickHouse/pull/55960) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow unquoted strings with CR (`\r`) in CSV format. Closes [#39930](https://github.com/ClickHouse/ClickHouse/issues/39930). [#56046](https://github.com/ClickHouse/ClickHouse/pull/56046) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to run `clickhouse-keeper` using embedded config. [#56086](https://github.com/ClickHouse/ClickHouse/pull/56086) ([Maksim Kita](https://github.com/kitaisreal)). +* Set limit of the maximum configuration value for `queued.min.messages` to avoid problem with start fetching data with Kafka. [#56121](https://github.com/ClickHouse/ClickHouse/pull/56121) ([Stas Morozov](https://github.com/r3b-fish)). +* Fixed a typo in SQL function `minSampleSizeContinous` (renamed `minSampleSizeContinuous`). Old name is preserved for backward compatibility. This closes: [#56139](https://github.com/ClickHouse/ClickHouse/issues/56139). [#56143](https://github.com/ClickHouse/ClickHouse/pull/56143) ([Dorota Szeremeta](https://github.com/orotaday)). +* Print path for broken parts on disk before shutting down the server. Before this change if a part is corrupted on disk and server cannot start, it was almost impossible to understand which part is broken. This is fixed. [#56181](https://github.com/ClickHouse/ClickHouse/pull/56181) ([Duc Canh Le](https://github.com/canhld94)). + +#### Build/Testing/Packaging Improvement +* If the database in Docker is already initialized, it doesn't need to be initialized again upon subsequent launches. This can potentially fix the issue of infinite container restarts when the database fails to load within 1000 attempts (relevant for very large databases and multi-node setups). [#50724](https://github.com/ClickHouse/ClickHouse/pull/50724) ([Alexander Nikolaev](https://github.com/AlexNik)). +* Resource with source code including submodules is built in Darwin special build task. It may be used to build ClickHouse without checking out the submodules. [#51435](https://github.com/ClickHouse/ClickHouse/pull/51435) ([Ilya Yatsishin](https://github.com/qoega)). +* An error was occuring when building ClickHouse with the AVX series of instructions enabled globally (which isn't recommended). The reason is that snappy does not enable `SNAPPY_HAVE_X86_CRC32`. [#55049](https://github.com/ClickHouse/ClickHouse/pull/55049) ([monchickey](https://github.com/monchickey)). +* Solve issue with launching standalone `clickhouse-keeper` from `clickhouse-server` package. [#55226](https://github.com/ClickHouse/ClickHouse/pull/55226) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* In the tests, RabbitMQ version is updated to 3.12.6. Improved logs collection for RabbitMQ tests. [#55424](https://github.com/ClickHouse/ClickHouse/pull/55424) ([Ilya Yatsishin](https://github.com/qoega)). +* Modified the error message difference between openssl and boringssl to fix the functional test. [#55975](https://github.com/ClickHouse/ClickHouse/pull/55975) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Use upstream repo for apache datasketches. [#55787](https://github.com/ClickHouse/ClickHouse/pull/55787) ([Nikita Taranov](https://github.com/nickitat)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Skip hardlinking inverted index files in mutation [#47663](https://github.com/ClickHouse/ClickHouse/pull/47663) ([cangyin](https://github.com/cangyin)). +* Fixed bug of `match` function (regex) with pattern containing alternation produces incorrect key condition. Closes #53222. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix 'Cannot find column' in read-in-order optimization with ARRAY JOIN [#51746](https://github.com/ClickHouse/ClickHouse/pull/51746) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support missed experimental `Object(Nullable(json))` subcolumns in query. [#54052](https://github.com/ClickHouse/ClickHouse/pull/54052) ([zps](https://github.com/VanDarkholme7)). +* Re-add fix for `accurateCastOrNull` [#54629](https://github.com/ClickHouse/ClickHouse/pull/54629) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix detecting `DEFAULT` for columns of a Distributed table created without AS [#55060](https://github.com/ClickHouse/ClickHouse/pull/55060) ([Vitaly Baranov](https://github.com/vitlibar)). +* Proper cleanup in case of exception in ctor of ShellCommandSource [#55103](https://github.com/ClickHouse/ClickHouse/pull/55103) ([Alexander Gololobov](https://github.com/davenger)). +* Fix deadlock in LDAP assigned role update [#55119](https://github.com/ClickHouse/ClickHouse/pull/55119) ([Julian Maicher](https://github.com/jmaicher)). +* Suppress error statistics update for internal exceptions [#55128](https://github.com/ClickHouse/ClickHouse/pull/55128) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix deadlock in backups [#55132](https://github.com/ClickHouse/ClickHouse/pull/55132) ([alesapin](https://github.com/alesapin)). +* Fix storage Iceberg files retrieval [#55144](https://github.com/ClickHouse/ClickHouse/pull/55144) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning of extra columns in set. [#55172](https://github.com/ClickHouse/ClickHouse/pull/55172) ([Amos Bird](https://github.com/amosbird)). +* Fix recalculation of skip indexes in ALTER UPDATE queries when table has adaptive granularity [#55202](https://github.com/ClickHouse/ClickHouse/pull/55202) ([Duc Canh Le](https://github.com/canhld94)). +* Fix for background download in fs cache [#55252](https://github.com/ClickHouse/ClickHouse/pull/55252) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid possible memory leaks in compressors in case of missing buffer finalization [#55262](https://github.com/ClickHouse/ClickHouse/pull/55262) ([Azat Khuzhin](https://github.com/azat)). +* Fix functions execution over sparse columns [#55275](https://github.com/ClickHouse/ClickHouse/pull/55275) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect merging of Nested for SELECT FINAL FROM SummingMergeTree [#55276](https://github.com/ClickHouse/ClickHouse/pull/55276) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug with inability to drop detached partition in replicated merge tree on top of S3 without zero copy [#55309](https://github.com/ClickHouse/ClickHouse/pull/55309) ([alesapin](https://github.com/alesapin)). +* Fix a crash in MergeSortingPartialResultTransform (due to zero chunks after `remerge`) [#55335](https://github.com/ClickHouse/ClickHouse/pull/55335) ([Azat Khuzhin](https://github.com/azat)). +* Fix data-race in CreatingSetsTransform (on errors) due to throwing shared exception [#55338](https://github.com/ClickHouse/ClickHouse/pull/55338) ([Azat Khuzhin](https://github.com/azat)). +* Fix trash optimization (up to a certain extent) [#55353](https://github.com/ClickHouse/ClickHouse/pull/55353) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix leak in StorageHDFS [#55370](https://github.com/ClickHouse/ClickHouse/pull/55370) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing of arrays in cast operator [#55417](https://github.com/ClickHouse/ClickHouse/pull/55417) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filtering by virtual columns with OR filter in query [#55418](https://github.com/ClickHouse/ClickHouse/pull/55418) ([Azat Khuzhin](https://github.com/azat)). +* Fix MongoDB connection issues [#55419](https://github.com/ClickHouse/ClickHouse/pull/55419) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix MySQL interface boolean representation [#55427](https://github.com/ClickHouse/ClickHouse/pull/55427) ([Serge Klochkov](https://github.com/slvrtrn)). +* Fix MySQL text protocol DateTime formatting and LowCardinality(Nullable(T)) types reporting [#55479](https://github.com/ClickHouse/ClickHouse/pull/55479) ([Serge Klochkov](https://github.com/slvrtrn)). +* Make `use_mysql_types_in_show_columns` affect only `SHOW COLUMNS` [#55481](https://github.com/ClickHouse/ClickHouse/pull/55481) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix stack symbolizer parsing `DW_FORM_ref_addr` incorrectly and sometimes crashing [#55483](https://github.com/ClickHouse/ClickHouse/pull/55483) ([Michael Kolupaev](https://github.com/al13n321)). +* Destroy fiber in case of exception in cancelBefore in AsyncTaskExecutor [#55516](https://github.com/ClickHouse/ClickHouse/pull/55516) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Query Parameters not working with custom HTTP handlers [#55521](https://github.com/ClickHouse/ClickHouse/pull/55521) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix checking of non handled data for Values format [#55527](https://github.com/ClickHouse/ClickHouse/pull/55527) ([Azat Khuzhin](https://github.com/azat)). +* Fix 'Invalid cursor state' in odbc interacting with MS SQL Server [#55558](https://github.com/ClickHouse/ClickHouse/pull/55558) ([vdimir](https://github.com/vdimir)). +* Fix max execution time and 'break' overflow mode [#55577](https://github.com/ClickHouse/ClickHouse/pull/55577) ([Alexander Gololobov](https://github.com/davenger)). +* Fix crash in QueryNormalizer with cyclic aliases [#55602](https://github.com/ClickHouse/ClickHouse/pull/55602) ([vdimir](https://github.com/vdimir)). +* Disable wrong optimization and add a test [#55609](https://github.com/ClickHouse/ClickHouse/pull/55609) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Merging [#52352](https://github.com/ClickHouse/ClickHouse/issues/52352) [#55621](https://github.com/ClickHouse/ClickHouse/pull/55621) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to avoid incorrect decimal sorting [#55662](https://github.com/ClickHouse/ClickHouse/pull/55662) ([Amos Bird](https://github.com/amosbird)). +* Fix progress bar for s3 and azure Cluster functions with url without globs [#55666](https://github.com/ClickHouse/ClickHouse/pull/55666) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix filtering by virtual columns with OR filter in query (resubmit) [#55678](https://github.com/ClickHouse/ClickHouse/pull/55678) ([Azat Khuzhin](https://github.com/azat)). +* Fixes and improvements for Iceberg storage [#55695](https://github.com/ClickHouse/ClickHouse/pull/55695) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix data race in CreatingSetsTransform (v2) [#55786](https://github.com/ClickHouse/ClickHouse/pull/55786) ([Azat Khuzhin](https://github.com/azat)). +* Throw exception when parsing illegal string as float if precise_float_parsing is true [#55861](https://github.com/ClickHouse/ClickHouse/pull/55861) ([李扬](https://github.com/taiyang-li)). +* Disable predicate pushdown if the CTE contains stateful functions [#55871](https://github.com/ClickHouse/ClickHouse/pull/55871) ([Raúl Marín](https://github.com/Algunenano)). +* Fix normalize ASTSelectWithUnionQuery, as it was stripping `FORMAT` from the query [#55887](https://github.com/ClickHouse/ClickHouse/pull/55887) ([flynn](https://github.com/ucasfl)). +* Try to fix possible segfault in Native ORC input format [#55891](https://github.com/ClickHouse/ClickHouse/pull/55891) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix window functions in case of sparse columns. [#55895](https://github.com/ClickHouse/ClickHouse/pull/55895) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* fix: StorageNull supports subcolumns [#55912](https://github.com/ClickHouse/ClickHouse/pull/55912) ([FFish](https://github.com/wxybear)). +* Do not write retriable errors for Replicated mutate/merge into error log [#55944](https://github.com/ClickHouse/ClickHouse/pull/55944) ([Azat Khuzhin](https://github.com/azat)). +* Fix `SHOW DATABASES LIMIT ` [#55962](https://github.com/ClickHouse/ClickHouse/pull/55962) ([Raúl Marín](https://github.com/Algunenano)). +* Fix autogenerated Protobuf schema with fields with underscore [#55974](https://github.com/ClickHouse/ClickHouse/pull/55974) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix dateTime64ToSnowflake64() with non-default scale [#55983](https://github.com/ClickHouse/ClickHouse/pull/55983) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix output/input of Arrow dictionary column [#55989](https://github.com/ClickHouse/ClickHouse/pull/55989) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix fetching schema from schema registry in AvroConfluent [#55991](https://github.com/ClickHouse/ClickHouse/pull/55991) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix 'Block structure mismatch' on concurrent ALTER and INSERTs in Buffer table [#55995](https://github.com/ClickHouse/ClickHouse/pull/55995) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix incorrect free space accounting for least_used JBOD policy [#56030](https://github.com/ClickHouse/ClickHouse/pull/56030) ([Azat Khuzhin](https://github.com/azat)). +* Fix missing scalar issue when evaluating subqueries inside table functions [#56057](https://github.com/ClickHouse/ClickHouse/pull/56057) ([Amos Bird](https://github.com/amosbird)). +* Fix wrong query result when http_write_exception_in_output_format=1 [#56135](https://github.com/ClickHouse/ClickHouse/pull/56135) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix schema cache for fallback JSON->JSONEachRow with changed settings [#56172](https://github.com/ClickHouse/ClickHouse/pull/56172) ([Kruglov Pavel](https://github.com/Avogar)). +* Add error handler to odbc-bridge [#56185](https://github.com/ClickHouse/ClickHouse/pull/56185) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). + + +### ClickHouse release 23.9, 2023-09-28 {#239} + +#### Backward Incompatible Change +* Remove the `status_info` configuration option and dictionaries status from the default Prometheus handler. [#54090](https://github.com/ClickHouse/ClickHouse/pull/54090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The experimental parts metadata cache is removed from the codebase. [#54215](https://github.com/ClickHouse/ClickHouse/pull/54215) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable setting `input_format_json_try_infer_numbers_from_strings` by default, so we don't try to infer numbers from strings in JSON formats by default to avoid possible parsing errors when sample data contains strings that looks like a number. [#55099](https://github.com/ClickHouse/ClickHouse/pull/55099) ([Kruglov Pavel](https://github.com/Avogar)). + +#### New Feature +* Improve schema inference from JSON formats: 1) Now it's possible to infer named Tuples from JSON objects without experimantal JSON type under a setting `input_format_json_try_infer_named_tuples_from_objects` in JSON formats. Previously without experimantal type JSON we could only infer JSON objects as Strings or Maps, now we can infer named Tuple. Resulting Tuple type will conain all keys of objects that were read in data sample during schema inference. It can be useful for reading structured JSON data without sparse objects. The setting is enabled by default. 2) Allow parsing JSON array into a column with type String under setting `input_format_json_read_arrays_as_strings`. It can help reading arrays with values with different types. 3) Allow to use type String for JSON keys with unkown types (`null`/`[]`/`{}`) in sample data under setting `input_format_json_infer_incomplete_types_as_strings`. Now in JSON formats we can read any value into String column and we can avoid getting error `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference by using type String for unknown types, so the data will be read successfully. [#54427](https://github.com/ClickHouse/ClickHouse/pull/54427) ([Kruglov Pavel](https://github.com/Avogar)). +* Added IO scheduling support for remote disks. Storage configuration for disk types `s3`, `s3_plain`, `hdfs` and `azure_blob_storage` can now contain `read_resource` and `write_resource` elements holding resource names. Scheduling policies for these resources can be configured in a separate server configuration section `resources`. Queries can be marked using setting `workload` and classified using server configuration section `workload_classifiers` to achieve diverse resource scheduling goals. More details in [the docs](https://clickhouse.com/docs/ja/operations/workload-scheduling). [#47009](https://github.com/ClickHouse/ClickHouse/pull/47009) ([Sergei Trifonov](https://github.com/serxa)). Added "bandwidth_limit" IO scheduling node type. It allows you to specify `max_speed` and `max_burst` constraints on traffic passing though this node. [#54618](https://github.com/ClickHouse/ClickHouse/pull/54618) ([Sergei Trifonov](https://github.com/serxa)). +* Added new type of authentication based on SSH keys. It works only for the native TCP protocol. [#41109](https://github.com/ClickHouse/ClickHouse/pull/41109) ([George Gamezardashvili](https://github.com/InfJoker)). +* Added a new column `_block_number` for MergeTree tables. [#44532](https://github.com/ClickHouse/ClickHouse/issues/44532). [#47532](https://github.com/ClickHouse/ClickHouse/pull/47532) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `IF EMPTY` clause for `DROP TABLE` queries. [#48915](https://github.com/ClickHouse/ClickHouse/pull/48915) ([Pavel Novitskiy](https://github.com/pnovitskiy)). +* SQL functions `toString(datetime, timezone)` and `formatDateTime(datetime, format, timezone)` now support non-constant timezone arguments. [#53680](https://github.com/ClickHouse/ClickHouse/pull/53680) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add support for `ALTER TABLE MODIFY COMMENT`. Note: something similar was added by an external contributor a long time ago, but the feature did not work at all and only confused users. This closes [#36377](https://github.com/ClickHouse/ClickHouse/issues/36377). [#51304](https://github.com/ClickHouse/ClickHouse/pull/51304) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Note: this command does not propagate between replicas, so the replicas of a table could have different comments. +* Added `GCD` a.k.a. "greatest common denominator" as a new data compression codec. The codec computes the GCD of all column values, and then divides each value by the GCD. The GCD codec is a data preparation codec (similar to Delta and DoubleDelta) and cannot be used stand-alone. It works with data integer, decimal and date/time type. A viable use case for the GCD codec are column values that change (increase/decrease) in multiples of the GCD, e.g. 24 - 28 - 16 - 24 - 8 - 24 (assuming GCD = 4). [#53149](https://github.com/ClickHouse/ClickHouse/pull/53149) ([Alexander Nam](https://github.com/seshWCS)). +* Two new type aliases `DECIMAL(P)` (as shortcut for `DECIMAL(P, 0)` and `DECIMAL` (as shortcut for `DECIMAL(10, 0)`) were added. This makes ClickHouse more compatible with MySQL's SQL dialect. [#53328](https://github.com/ClickHouse/ClickHouse/pull/53328) ([Val Doroshchuk](https://github.com/valbok)). +* Added a new system log table `backup_log` to track all `BACKUP` and `RESTORE` operations. [#53638](https://github.com/ClickHouse/ClickHouse/pull/53638) ([Victor Krasnov](https://github.com/sirvickr)). +* Added a format setting `output_format_markdown_escape_special_characters` (default: false). The setting controls whether special characters like `!`, `#`, `$` etc. are escaped (i.e. prefixed by a backslash) in the `Markdown` output format. [#53860](https://github.com/ClickHouse/ClickHouse/pull/53860) ([irenjj](https://github.com/irenjj)). +* Add function `decodeHTMLComponent`. [#54097](https://github.com/ClickHouse/ClickHouse/pull/54097) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `peak_threads_usage` to query_log table. [#54335](https://github.com/ClickHouse/ClickHouse/pull/54335) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add `SHOW FUNCTIONS` support to clickhouse-client. [#54337](https://github.com/ClickHouse/ClickHouse/pull/54337) ([Julia Kartseva](https://github.com/wat-ze-hex)). +* Added function `toDaysSinceYearZero` with alias `TO_DAYS` (for compatibility with MySQL) which returns the number of days passed since `0001-01-01` (in Proleptic Gregorian Calendar). [#54479](https://github.com/ClickHouse/ClickHouse/pull/54479) ([Robert Schulze](https://github.com/rschu1ze)). Function `toDaysSinceYearZero` now supports arguments of type `DateTime` and `DateTime64`. [#54856](https://github.com/ClickHouse/ClickHouse/pull/54856) ([Serge Klochkov](https://github.com/slvrtrn)). +* Added functions `YYYYMMDDtoDate`, `YYYYMMDDtoDate32`, `YYYYMMDDhhmmssToDateTime` and `YYYYMMDDhhmmssToDateTime64`. They convert a date or date with time encoded as integer (e.g. 20230911) into a native date or date with time. As such, they provide the opposite functionality of existing functions `YYYYMMDDToDate`, `YYYYMMDDToDateTime`, `YYYYMMDDhhmmddToDateTime`, `YYYYMMDDhhmmddToDateTime64`. [#54509](https://github.com/ClickHouse/ClickHouse/pull/54509) ([Quanfa Fu](https://github.com/dentiscalprum)) ([Robert Schulze](https://github.com/rschu1ze)). +* Add several string distance functions, including `byteHammingDistance`, `editDistance`. [#54935](https://github.com/ClickHouse/ClickHouse/pull/54935) ([flynn](https://github.com/ucasfl)). +* Allow specifying the expiration date and, optionally, the time for user credentials with `VALID UNTIL datetime` clause. [#51261](https://github.com/ClickHouse/ClickHouse/pull/51261) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow S3-style URLs for table functions `s3`, `gcs`, `oss`. URL is automatically converted to HTTP. Example: `'s3://clickhouse-public-datasets/hits.csv'` is converted to `'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'`. [#54931](https://github.com/ClickHouse/ClickHouse/pull/54931) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add new setting `print_pretty_type_names` to print pretty deep nested types like Tuple/Maps/Arrays. [#55095](https://github.com/ClickHouse/ClickHouse/pull/55095) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Speed up reading from S3 by enabling prefetches by default. [#53709](https://github.com/ClickHouse/ClickHouse/pull/53709) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Do not implicitly read PK and version columns in lonely parts if unnecessary for queries with FINAL. [#53919](https://github.com/ClickHouse/ClickHouse/pull/53919) ([Duc Canh Le](https://github.com/canhld94)). +* Optimize group by constant keys. Will optimize queries with group by `_file/_path` after https://github.com/ClickHouse/ClickHouse/pull/53529. [#53549](https://github.com/ClickHouse/ClickHouse/pull/53549) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of sorting for `Decimal` columns. Improve performance of insertion into `MergeTree` if ORDER BY contains a `Decimal` column. Improve performance of sorting when data is already sorted or almost sorted. [#35961](https://github.com/ClickHouse/ClickHouse/pull/35961) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance for huge query analysis. Fixes [#51224](https://github.com/ClickHouse/ClickHouse/issues/51224). [#51469](https://github.com/ClickHouse/ClickHouse/pull/51469) ([frinkr](https://github.com/frinkr)). +* An optimization to rewrite `COUNT(DISTINCT ...)` and various `uniq` variants to `count` if it is selected from a subquery with GROUP BY. [#52082](https://github.com/ClickHouse/ClickHouse/pull/52082) [#52645](https://github.com/ClickHouse/ClickHouse/pull/52645) ([JackyWoo](https://github.com/JackyWoo)). +* Remove manual calls to `mmap/mremap/munmap` and delegate all this work to `jemalloc` - and it slightly improves performance. [#52792](https://github.com/ClickHouse/ClickHouse/pull/52792) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed high in CPU consumption when working with NATS. [#54399](https://github.com/ClickHouse/ClickHouse/pull/54399) ([Vasilev Pyotr](https://github.com/vahpetr)). +* Since we use separate instructions for executing `toString` with datetime argument, it is possible to improve performance a bit for non-datetime arguments and have some parts of the code cleaner. Follows up [#53680](https://github.com/ClickHouse/ClickHouse/issues/53680). [#54443](https://github.com/ClickHouse/ClickHouse/pull/54443) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Instead of serializing json elements into a `std::stringstream`, this PR try to put the serialization result into `ColumnString` direclty. [#54613](https://github.com/ClickHouse/ClickHouse/pull/54613) ([lgbo](https://github.com/lgbo-ustc)). +* Enable ORDER BY optimization for reading data in corresponding order from a MergeTree table in case that the table is behind a view. [#54628](https://github.com/ClickHouse/ClickHouse/pull/54628) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve JSON SQL functions by reusing `GeneratorJSONPath` and removing several shared pointers. [#54735](https://github.com/ClickHouse/ClickHouse/pull/54735) ([lgbo](https://github.com/lgbo-ustc)). +* Keeper tries to batch flush requests for better performance. [#53049](https://github.com/ClickHouse/ClickHouse/pull/53049) ([Antonio Andelic](https://github.com/antonio2368)). +* Now `clickhouse-client` processes files in parallel in case of `INFILE 'glob_expression'`. Closes [#54218](https://github.com/ClickHouse/ClickHouse/issues/54218). [#54533](https://github.com/ClickHouse/ClickHouse/pull/54533) ([Max K.](https://github.com/mkaynov)). +* Allow to use primary key for IN function where primary key column types are different from `IN` function right side column types. Example: `SELECT id FROM test_table WHERE id IN (SELECT '5')`. Closes [#48936](https://github.com/ClickHouse/ClickHouse/issues/48936). [#54544](https://github.com/ClickHouse/ClickHouse/pull/54544) ([Maksim Kita](https://github.com/kitaisreal)). +* Hash JOIN tries to shrink internal buffers consuming half of maximal available memory (set by `max_bytes_in_join`). [#54584](https://github.com/ClickHouse/ClickHouse/pull/54584) ([vdimir](https://github.com/vdimir)). +* Respect `max_block_size` for array join to avoid possible OOM. Close [#54290](https://github.com/ClickHouse/ClickHouse/issues/54290). [#54664](https://github.com/ClickHouse/ClickHouse/pull/54664) ([李扬](https://github.com/taiyang-li)). +* Reuse HTTP connections in the `s3` table function. [#54812](https://github.com/ClickHouse/ClickHouse/pull/54812) ([Michael Kolupaev](https://github.com/al13n321)). +* Replace the linear search in `MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules` with a binary search. [#54869](https://github.com/ClickHouse/ClickHouse/pull/54869) ([usurai](https://github.com/usurai)). + +#### Experimental Feature +* The creation of `Annoy` indexes can now be parallelized using setting `max_threads_for_annoy_index_creation`. [#54047](https://github.com/ClickHouse/ClickHouse/pull/54047) ([Robert Schulze](https://github.com/rschu1ze)). +* Parallel replicas over distributed don't read from all replicas [#54199](https://github.com/ClickHouse/ClickHouse/pull/54199) ([Igor Nikonov](https://github.com/devcrafter)). + +#### Improvement +* Allow to replace long names of files of columns in `MergeTree` data parts to hashes of names. It helps to avoid `File name too long` error in some cases. [#50612](https://github.com/ClickHouse/ClickHouse/pull/50612) ([Anton Popov](https://github.com/CurtizJ)). +* Parse data in `JSON` format as `JSONEachRow` if failed to parse metadata. It will allow to read files with `.json` extension even if real format is JSONEachRow. Closes [#45740](https://github.com/ClickHouse/ClickHouse/issues/45740). [#54405](https://github.com/ClickHouse/ClickHouse/pull/54405) ([Kruglov Pavel](https://github.com/Avogar)). +* Output valid JSON/XML on excetpion during HTTP query execution. Add setting `http_write_exception_in_output_format` to enable/disable this behaviour (enabled by default). [#52853](https://github.com/ClickHouse/ClickHouse/pull/52853) ([Kruglov Pavel](https://github.com/Avogar)). +* View `information_schema.tables` now has a new field `data_length` which shows the approximate size of the data on disk. Required to run queries generated by Amazon QuickSight. [#55037](https://github.com/ClickHouse/ClickHouse/pull/55037) ([Robert Schulze](https://github.com/rschu1ze)). +* The MySQL interface gained a minimal implementation of prepared statements, just enough to allow a connection from Tableau Online to ClickHouse via the MySQL connector. [#54115](https://github.com/ClickHouse/ClickHouse/pull/54115) ([Serge Klochkov](https://github.com/slvrtrn)). Please note: the prepared statements implementation is pretty minimal, we do not support arguments binding yet, it is not required in this particular Tableau online use case. It will be implemented as a follow-up if necessary after extensive testing of Tableau Online in case we discover issues. +* Support case-insensitive and dot-all matching modes in `regexp_tree` dictionaries. [#50906](https://github.com/ClickHouse/ClickHouse/pull/50906) ([Johann Gan](https://github.com/johanngan)). +* Keeper improvement: Add a `createIfNotExists` Keeper command. [#48855](https://github.com/ClickHouse/ClickHouse/pull/48855) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* More precise integer type inference, fix [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003) ([Chen768959](https://github.com/Chen768959)). +* Introduced resolving of charsets in the string literals for MaterializedMySQL. [#53220](https://github.com/ClickHouse/ClickHouse/pull/53220) ([Val Doroshchuk](https://github.com/valbok)). +* Fix a subtle issue with a rarely used `EmbeddedRocksDB` table engine in an extremely rare scenario: sometimes the `EmbeddedRocksDB` table engine does not close files correctly in NFS after running `DROP TABLE`. [#53502](https://github.com/ClickHouse/ClickHouse/pull/53502) ([Mingliang Pan](https://github.com/liangliangpan)). +* `RESTORE TABLE ON CLUSTER` must create replicated tables with a matching UUID on hosts. Otherwise the macro `{uuid}` in ZooKeeper path can't work correctly after RESTORE. This PR implements that. [#53765](https://github.com/ClickHouse/ClickHouse/pull/53765) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added restore setting `restore_broken_parts_as_detached`: if it's true the RESTORE process won't stop on broken parts while restoring, instead all the broken parts will be copied to the `detached` folder with the prefix `broken-from-backup'. If it's false the RESTORE process will stop on the first broken part (if any). The default value is false. [#53877](https://github.com/ClickHouse/ClickHouse/pull/53877) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `elapsed_ns` field to HTTP headers X-ClickHouse-Progress and X-ClickHouse-Summary. [#54179](https://github.com/ClickHouse/ClickHouse/pull/54179) ([joelynch](https://github.com/joelynch)). +* Implementation of `reconfig` (https://github.com/ClickHouse/ClickHouse/pull/49450), `sync`, and `exists` commands for keeper-client. [#54201](https://github.com/ClickHouse/ClickHouse/pull/54201) ([pufit](https://github.com/pufit)). +* `clickhouse-local` and `clickhouse-client` now allow to specify the `--query` parameter multiple times, e.g. `./clickhouse-client --query "SELECT 1" --query "SELECT 2"`. This syntax is slightly more intuitive than `./clickhouse-client --multiquery "SELECT 1;S ELECT 2"`, a bit easier to script (e.g. `queries.push_back('--query "$q"')`) and more consistent with the behavior of existing parameter `--queries-file` (e.g. `./clickhouse client --queries-file queries1.sql --queries-file queries2.sql`). [#54249](https://github.com/ClickHouse/ClickHouse/pull/54249) ([Robert Schulze](https://github.com/rschu1ze)). +* Add sub-second precision to `formatReadableTimeDelta`. [#54250](https://github.com/ClickHouse/ClickHouse/pull/54250) ([Andrey Zvonov](https://github.com/zvonand)). +* Enable `allow_remove_stale_moving_parts` by default. [#54260](https://github.com/ClickHouse/ClickHouse/pull/54260) ([vdimir](https://github.com/vdimir)). +* Fix using count from cache and improve progress bar for reading from archives. [#54271](https://github.com/ClickHouse/ClickHouse/pull/54271) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for S3 credentials using SSO. To define a profile to be used with SSO, set `AWS_PROFILE` environment variable. [#54347](https://github.com/ClickHouse/ClickHouse/pull/54347) ([Antonio Andelic](https://github.com/antonio2368)). +* Support NULL as default for nested types Array/Tuple/Map for input formats. Closes [#51100](https://github.com/ClickHouse/ClickHouse/issues/51100). [#54351](https://github.com/ClickHouse/ClickHouse/pull/54351) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow reading some unusual configuration of chunks from Arrow/Parquet formats. [#54370](https://github.com/ClickHouse/ClickHouse/pull/54370) ([Arthur Passos](https://github.com/arthurpassos)). +* Add `STD` alias to `stddevPop` function for MySQL compatibility. Closes [#54274](https://github.com/ClickHouse/ClickHouse/issues/54274). [#54382](https://github.com/ClickHouse/ClickHouse/pull/54382) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `addDate` function for compatibility with MySQL and `subDate` for consistency. Reference [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54400](https://github.com/ClickHouse/ClickHouse/pull/54400) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `modification_time` into `system.detached_parts`. [#54506](https://github.com/ClickHouse/ClickHouse/pull/54506) ([Azat Khuzhin](https://github.com/azat)). +* Added a setting `splitby_max_substrings_includes_remaining_string` which controls if functions "splitBy*()" with argument "max_substring" > 0 include the remaining string (if any) in the result array (Python/Spark semantics) or not. The default behavior does not change. [#54518](https://github.com/ClickHouse/ClickHouse/pull/54518) ([Robert Schulze](https://github.com/rschu1ze)). +* Better integer types inference for `Int64`/`UInt64` fields. Continuation of [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003). Now it works also for nested types like Arrays of Arrays and for functions like `map/tuple`. Issue: [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#54553](https://github.com/ClickHouse/ClickHouse/pull/54553) ([Kruglov Pavel](https://github.com/Avogar)). +* Added array operations for multiplying, dividing and modulo on scalar. Works in each way, for example `5 * [5, 5]` and `[5, 5] * 5` - both cases are possible. [#54608](https://github.com/ClickHouse/ClickHouse/pull/54608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add optional `version` argument to `rm` command in `keeper-client` to support safer deletes. [#54708](https://github.com/ClickHouse/ClickHouse/pull/54708) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Disable killing the server by systemd (that may lead to data loss when using Buffer tables). [#54744](https://github.com/ClickHouse/ClickHouse/pull/54744) ([Azat Khuzhin](https://github.com/azat)). +* Added field `is_deterministic` to system table `system.functions` which indicates whether the result of a function is stable between two invocations (given exactly the same inputs) or not. [#54766](https://github.com/ClickHouse/ClickHouse/pull/54766) [#55035](https://github.com/ClickHouse/ClickHouse/pull/55035) ([Robert Schulze](https://github.com/rschu1ze)). +* Made the views in schema `information_schema` more compatible with the equivalent views in MySQL (i.e. modified and extended them) up to a point where Tableau Online is able to connect to ClickHouse. More specifically: 1. The type of field `information_schema.tables.table_type` changed from Enum8 to String. 2. Added fields `table_comment` and `table_collation` to view `information_schema.table`. 3. Added views `information_schema.key_column_usage` and `referential_constraints`. 4. Replaced uppercase aliases in `information_schema` views with concrete uppercase columns. [#54773](https://github.com/ClickHouse/ClickHouse/pull/54773) ([Serge Klochkov](https://github.com/slvrtrn)). +* The query cache now returns an error if the user tries to cache the result of a query with a non-deterministic function such as `now`, `randomString` and `dictGet`. Compared to the previous behavior (silently don't cache the result), this reduces confusion and surprise for users. [#54801](https://github.com/ClickHouse/ClickHouse/pull/54801) ([Robert Schulze](https://github.com/rschu1ze)). +* Forbid special columns like materialized/ephemeral/alias for `file`/`s3`/`url`/... storages, fix insert into ephemeral columns from files. Closes [#53477](https://github.com/ClickHouse/ClickHouse/issues/53477). [#54803](https://github.com/ClickHouse/ClickHouse/pull/54803) ([Kruglov Pavel](https://github.com/Avogar)). +* More configurable collecting metadata for backup. [#54804](https://github.com/ClickHouse/ClickHouse/pull/54804) ([Vitaly Baranov](https://github.com/vitlibar)). +* `clickhouse-local`'s log file (if enabled with --server_logs_file flag) will now prefix each line with timestamp, thread id, etc, just like `clickhouse-server`. [#54807](https://github.com/ClickHouse/ClickHouse/pull/54807) ([Michael Kolupaev](https://github.com/al13n321)). +* Field `is_obsolete` in the `system.merge_tree_settings` table - it is now 1 for obsolete merge tree settings. Previously, only the description indicated that the setting is obsolete. [#54837](https://github.com/ClickHouse/ClickHouse/pull/54837) ([Robert Schulze](https://github.com/rschu1ze)). +* Make it possible to use plural when using interval literals. `INTERVAL 2 HOURS` should be equivalent to `INTERVAL 2 HOUR`. [#54860](https://github.com/ClickHouse/ClickHouse/pull/54860) ([Jordi Villar](https://github.com/jrdi)). +* Always allow the creation of a projection with `Nullable` PK. This fixes [#54814](https://github.com/ClickHouse/ClickHouse/issues/54814). [#54895](https://github.com/ClickHouse/ClickHouse/pull/54895) ([Amos Bird](https://github.com/amosbird)). +* Retry backup's S3 operations after connection reset failure. [#54900](https://github.com/ClickHouse/ClickHouse/pull/54900) ([Vitaly Baranov](https://github.com/vitlibar)). +* Make the exception message exact in case of the maximum value of a settings is less than the minimum value. [#54925](https://github.com/ClickHouse/ClickHouse/pull/54925) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* `LIKE`, `match`, and other regular expressions matching functions now allow matching with patterns containing non-UTF-8 substrings by falling back to binary matching. Example: you can use `string LIKE '\xFE\xFF%'` to detect BOM. This closes [#54486](https://github.com/ClickHouse/ClickHouse/issues/54486). [#54942](https://github.com/ClickHouse/ClickHouse/pull/54942) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added `ContextLockWaitMicroseconds` profile event. [#55029](https://github.com/ClickHouse/ClickHouse/pull/55029) ([Maksim Kita](https://github.com/kitaisreal)). +* The Keeper dynamically adjusts log levels. [#50372](https://github.com/ClickHouse/ClickHouse/pull/50372) ([helifu](https://github.com/helifu)). +* Added function `timestamp` for compatibility with MySQL. Closes [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54639](https://github.com/ClickHouse/ClickHouse/pull/54639) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Build/Testing/Packaging Improvement +* Bumped the compiler of official and continuous integration builds of ClickHouse from Clang 16 to 17. [#53831](https://github.com/ClickHouse/ClickHouse/pull/53831) ([Robert Schulze](https://github.com/rschu1ze)). +* Regenerated tld data for lookups (`tldLookup.generated.cpp`). [#54269](https://github.com/ClickHouse/ClickHouse/pull/54269) ([Bharat Nallan](https://github.com/bharatnc)). +* Remove the redundant `clickhouse-keeper-client` symlink. [#54587](https://github.com/ClickHouse/ClickHouse/pull/54587) ([Tomas Barton](https://github.com/deric)). +* Use `/usr/bin/env` to resolve bash - now it supports Nix OS. [#54603](https://github.com/ClickHouse/ClickHouse/pull/54603) ([Fionera](https://github.com/fionera)). +* CMake added `PROFILE_CPU` option needed to perform `perf record` without using a DWARF call graph. [#54917](https://github.com/ClickHouse/ClickHouse/pull/54917) ([Maksim Kita](https://github.com/kitaisreal)). +* If the linker is different than LLD, stop with a fatal error. [#55036](https://github.com/ClickHouse/ClickHouse/pull/55036) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Replaced the library to handle (encode/decode) base64 values from Turbo-Base64 to aklomp-base64. Both are SIMD-accelerated on x86 and ARM but 1. the license of the latter (BSD-2) is more favorable for ClickHouse, Turbo64 switched in the meantime to GPL-3, 2. with more GitHub stars, aklomp-base64 seems more future-proof, 3. aklomp-base64 has a slightly nicer API (which is arguably subjective), and 4. aklomp-base64 does not require us to hack around bugs (like non-threadsafe initialization). Note: aklomp-base64 rejects unpadded base64 values whereas Turbo-Base64 decodes them on a best-effort basis. RFC-4648 leaves it open whether padding is mandatory or not, but depending on the context this may be a behavioral change to be aware of. [#54119](https://github.com/ClickHouse/ClickHouse/pull/54119) ([Mikhail Koviazin](https://github.com/mkmkme)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix REPLACE/MOVE PARTITION with zero-copy replication (note: "zero-copy replication" is an experimental feature) [#54193](https://github.com/ClickHouse/ClickHouse/pull/54193) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix zero copy locks with hardlinks (note: "zero-copy replication" is an experimental feature) [#54859](https://github.com/ClickHouse/ClickHouse/pull/54859) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix zero copy garbage (note: "zero-copy replication" is an experimental feature) [#54550](https://github.com/ClickHouse/ClickHouse/pull/54550) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Pass HTTP retry timeout as milliseconds (it was incorrect before). [#54438](https://github.com/ClickHouse/ClickHouse/pull/54438) ([Duc Canh Le](https://github.com/canhld94)). +* Fix misleading error message in OUTFILE with `CapnProto`/`Protobuf` [#52870](https://github.com/ClickHouse/ClickHouse/pull/52870) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix summary reporting with parallel replicas with LIMIT [#53050](https://github.com/ClickHouse/ClickHouse/pull/53050) ([Raúl Marín](https://github.com/Algunenano)). +* Fix throttling of BACKUPs from/to S3 (in case native copy was not used) and in some other places as well [#53336](https://github.com/ClickHouse/ClickHouse/pull/53336) ([Azat Khuzhin](https://github.com/azat)). +* Fix IO throttling during copying whole directories [#53338](https://github.com/ClickHouse/ClickHouse/pull/53338) ([Azat Khuzhin](https://github.com/azat)). +* Fix: moved to prewhere condition actions can lose column [#53492](https://github.com/ClickHouse/ClickHouse/pull/53492) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fixed internal error when replacing with byte-equal parts [#53735](https://github.com/ClickHouse/ClickHouse/pull/53735) ([Pedro Riera](https://github.com/priera)). +* Fix: require columns participating in interpolate expression [#53754](https://github.com/ClickHouse/ClickHouse/pull/53754) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix cluster discovery initialization + setting up fail points in config [#54113](https://github.com/ClickHouse/ClickHouse/pull/54113) ([vdimir](https://github.com/vdimir)). +* Fix issues in `accurateCastOrNull` [#54136](https://github.com/ClickHouse/ClickHouse/pull/54136) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix nullable primary key with the FINAL modifier [#54164](https://github.com/ClickHouse/ClickHouse/pull/54164) ([Amos Bird](https://github.com/amosbird)). +* Fixed error that prevented insertion in replicated materialized view of new data in presence of duplicated data. [#54184](https://github.com/ClickHouse/ClickHouse/pull/54184) ([Pedro Riera](https://github.com/priera)). +* Fix: allow `IPv6` for bloom filter [#54200](https://github.com/ClickHouse/ClickHouse/pull/54200) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* fix possible type mismatch with `IPv4` [#54212](https://github.com/ClickHouse/ClickHouse/pull/54212) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix `system.data_skipping_indices` for recreated indices [#54225](https://github.com/ClickHouse/ClickHouse/pull/54225) ([Artur Malchanau](https://github.com/Hexta)). +* fix name clash for multiple join rewriter v2 [#54240](https://github.com/ClickHouse/ClickHouse/pull/54240) ([Tao Wang](https://github.com/wangtZJU)). +* Fix unexpected errors in `system.errors` after join [#54306](https://github.com/ClickHouse/ClickHouse/pull/54306) ([vdimir](https://github.com/vdimir)). +* Fix `isZeroOrNull(NULL)` [#54316](https://github.com/ClickHouse/ClickHouse/pull/54316) ([flynn](https://github.com/ucasfl)). +* Fix: parallel replicas over distributed with `prefer_localhost_replica` = 1 [#54334](https://github.com/ClickHouse/ClickHouse/pull/54334) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix logical error in vertical merge + replacing merge tree + optimize cleanup [#54368](https://github.com/ClickHouse/ClickHouse/pull/54368) ([alesapin](https://github.com/alesapin)). +* Fix possible error `URI contains invalid characters` in the `s3` table function [#54373](https://github.com/ClickHouse/ClickHouse/pull/54373) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix segfault in AST optimization of `arrayExists` function [#54379](https://github.com/ClickHouse/ClickHouse/pull/54379) ([Nikolay Degterinsky](https://github.com/evillique)). +* Check for overflow before addition in `analysisOfVariance` function [#54385](https://github.com/ClickHouse/ClickHouse/pull/54385) ([Antonio Andelic](https://github.com/antonio2368)). +* Reproduce and fix the bug in removeSharedRecursive [#54430](https://github.com/ClickHouse/ClickHouse/pull/54430) ([Sema Checherinda](https://github.com/CheSema)). +* Fix possible incorrect result with SimpleAggregateFunction in PREWHERE and FINAL [#54436](https://github.com/ClickHouse/ClickHouse/pull/54436) ([Azat Khuzhin](https://github.com/azat)). +* Fix filtering parts with indexHint for non analyzer [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)). +* Fix aggregate projections with normalized states [#54480](https://github.com/ClickHouse/ClickHouse/pull/54480) ([Amos Bird](https://github.com/amosbird)). +* `clickhouse-local`: something for multiquery parameter [#54498](https://github.com/ClickHouse/ClickHouse/pull/54498) ([CuiShuoGuo](https://github.com/bakam412)). +* `clickhouse-local` supports `--database` command line argument [#54503](https://github.com/ClickHouse/ClickHouse/pull/54503) ([vdimir](https://github.com/vdimir)). +* Fix possible parsing error in `-WithNames` formats with disabled `input_format_with_names_use_header` [#54513](https://github.com/ClickHouse/ClickHouse/pull/54513) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare case of CHECKSUM_DOESNT_MATCH error [#54549](https://github.com/ClickHouse/ClickHouse/pull/54549) ([alesapin](https://github.com/alesapin)). +* Fix sorting of UNION ALL of already sorted results [#54564](https://github.com/ClickHouse/ClickHouse/pull/54564) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix snapshot install in Keeper [#54572](https://github.com/ClickHouse/ClickHouse/pull/54572) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix race in `ColumnUnique` [#54575](https://github.com/ClickHouse/ClickHouse/pull/54575) ([Nikita Taranov](https://github.com/nickitat)). +* Annoy/Usearch index: Fix LOGICAL_ERROR during build-up with default values [#54600](https://github.com/ClickHouse/ClickHouse/pull/54600) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix serialization of `ColumnDecimal` [#54601](https://github.com/ClickHouse/ClickHouse/pull/54601) ([Nikita Taranov](https://github.com/nickitat)). +* Fix schema inference for *Cluster functions for column names with spaces [#54635](https://github.com/ClickHouse/ClickHouse/pull/54635) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix using structure from insertion tables in case of defaults and explicit insert columns [#54655](https://github.com/ClickHouse/ClickHouse/pull/54655) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix: avoid using regex match, possibly containing alternation, as a key condition. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix ReplacingMergeTree with vertical merge and cleanup [#54706](https://github.com/ClickHouse/ClickHouse/pull/54706) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix virtual columns having incorrect values after ORDER BY [#54811](https://github.com/ClickHouse/ClickHouse/pull/54811) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix filtering parts with indexHint for non analyzer [#54825](https://github.com/ClickHouse/ClickHouse/pull/54825) [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)). +* Fix Keeper segfault during shutdown [#54841](https://github.com/ClickHouse/ClickHouse/pull/54841) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `Invalid number of rows in Chunk` in MaterializedPostgreSQL [#54844](https://github.com/ClickHouse/ClickHouse/pull/54844) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Move obsolete format settings to separate section [#54855](https://github.com/ClickHouse/ClickHouse/pull/54855) ([Kruglov Pavel](https://github.com/Avogar)). +* Rebuild `minmax_count_projection` when partition key gets modified [#54943](https://github.com/ClickHouse/ClickHouse/pull/54943) ([Amos Bird](https://github.com/amosbird)). +* Fix bad cast to `ColumnVector` in function `if` [#55019](https://github.com/ClickHouse/ClickHouse/pull/55019) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent attaching parts from tables with different projections or indices [#55062](https://github.com/ClickHouse/ClickHouse/pull/55062) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Store NULL in scalar result map for empty subquery result [#52240](https://github.com/ClickHouse/ClickHouse/pull/52240) ([vdimir](https://github.com/vdimir)). +* Fix `FINAL` produces invalid read ranges in a rare case [#54934](https://github.com/ClickHouse/ClickHouse/pull/54934) ([Nikita Taranov](https://github.com/nickitat)). +* Fix: insert quorum w/o keeper retries [#55026](https://github.com/ClickHouse/ClickHouse/pull/55026) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix simple state with nullable [#55030](https://github.com/ClickHouse/ClickHouse/pull/55030) ([Pedro Riera](https://github.com/priera)). + + +### ClickHouse release 23.8 LTS, 2023-08-31 {#238} + +#### Backward Incompatible Change +* If a dynamic disk contains a name, it should be specified as `disk = disk(name = 'disk_name'`, ...) in disk function arguments. In previous version it could be specified as `disk = disk_(...)`, which is no longer supported. [#52820](https://github.com/ClickHouse/ClickHouse/pull/52820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `clickhouse-benchmark` will establish connections in parallel when invoked with `--concurrency` more than one. Previously it was unusable if you ran it with 1000 concurrent connections from Europe to the US. Correct calculation of QPS for connections with high latency. Backward incompatible change: the option for JSON output of `clickhouse-benchmark` is removed. If you've used this option, you can also extract data from the `system.query_log` in JSON format as a workaround. [#53293](https://github.com/ClickHouse/ClickHouse/pull/53293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `microseconds` column is removed from the `system.text_log`, and the `milliseconds` column is removed from the `system.metric_log`, because they are redundant in the presence of the `event_time_microseconds` column. [#53601](https://github.com/ClickHouse/ClickHouse/pull/53601) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Deprecate the metadata cache feature. It is experimental and we have never used it. The feature is dangerous: [#51182](https://github.com/ClickHouse/ClickHouse/issues/51182). Remove the `system.merge_tree_metadata_cache` system table. The metadata cache is still available in this version but will be removed soon. This closes [#39197](https://github.com/ClickHouse/ClickHouse/issues/39197). [#51303](https://github.com/ClickHouse/ClickHouse/pull/51303) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable support for 3DES in TLS connections. [#52893](https://github.com/ClickHouse/ClickHouse/pull/52893) ([Kenji Noguchi](https://github.com/knoguchi)). + +#### New Feature +* Direct import from zip/7z/tar archives. Example: `file('*.zip :: *.csv')`. [#50321](https://github.com/ClickHouse/ClickHouse/pull/50321) ([nikitakeba](https://github.com/nikitakeba)). +* Add column `ptr` to `system.trace_log` for `trace_type = 'MemorySample'`. This column contains an address of allocation. Added function `flameGraph` which can build flamegraph containing allocated and not released memory. Reworking of [#38391](https://github.com/ClickHouse/ClickHouse/issues/38391). [#45322](https://github.com/ClickHouse/ClickHouse/pull/45322) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added table function `azureBlobStorageCluster`. The supported set of features is very similar to table function `s3Cluster`. [#50795](https://github.com/ClickHouse/ClickHouse/pull/50795) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Allow using `cluster`, `clusterAllReplicas`, `remote`, and `remoteSecure` without table name in issue [#50808](https://github.com/ClickHouse/ClickHouse/issues/50808). [#50848](https://github.com/ClickHouse/ClickHouse/pull/50848) ([Yangkuan Liu](https://github.com/LiuYangkuan)). +* A system table to monitor Kafka consumers. [#50999](https://github.com/ClickHouse/ClickHouse/pull/50999) ([Ilya Golshtein](https://github.com/ilejn)). +* Added `max_sessions_for_user` setting. [#51724](https://github.com/ClickHouse/ClickHouse/pull/51724) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* New functions `toUTCTimestamp/fromUTCTimestamp` to act same as spark's `to_utc_timestamp/from_utc_timestamp`. [#52117](https://github.com/ClickHouse/ClickHouse/pull/52117) ([KevinyhZou](https://github.com/KevinyhZou)). +* Add new functions `structureToCapnProtoSchema`/`structureToProtobufSchema` that convert ClickHouse table structure to CapnProto/Protobuf format schema. Allow to input/output data in CapnProto/Protobuf format without external format schema using autogenerated schema from table structure (controlled by settings `format_capn_proto_use_autogenerated_schema`/`format_protobuf_use_autogenerated_schema`). Allow to export autogenerated schema while input/output using setting `output_format_schema`. [#52278](https://github.com/ClickHouse/ClickHouse/pull/52278) ([Kruglov Pavel](https://github.com/Avogar)). +* A new field `query_cache_usage` in `system.query_log` now shows if and how the query cache was used. [#52384](https://github.com/ClickHouse/ClickHouse/pull/52384) ([Robert Schulze](https://github.com/rschu1ze)). +* Add new function `startsWithUTF8` and `endsWithUTF8`. [#52555](https://github.com/ClickHouse/ClickHouse/pull/52555) ([李扬](https://github.com/taiyang-li)). +* Allow variable number of columns in TSV/CustomSeparated/JSONCompactEachRow, make schema inference work with variable number of columns. Add settings `input_format_tsv_allow_variable_number_of_columns`, `input_format_custom_allow_variable_number_of_columns`, `input_format_json_compact_allow_variable_number_of_columns`. [#52692](https://github.com/ClickHouse/ClickHouse/pull/52692) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `SYSTEM STOP/START PULLING REPLICATION LOG` queries (for testing `ReplicatedMergeTree`). [#52881](https://github.com/ClickHouse/ClickHouse/pull/52881) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow to execute constant non-deterministic functions in mutations on initiator. [#53129](https://github.com/ClickHouse/ClickHouse/pull/53129) ([Anton Popov](https://github.com/CurtizJ)). +* Add input format `One` that doesn't read any data and always returns single row with column `dummy` with type `UInt8` and value `0` like `system.one`. It can be used together with `_file/_path` virtual columns to list files in file/s3/url/hdfs/etc table functions without reading any data. [#53209](https://github.com/ClickHouse/ClickHouse/pull/53209) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `tupleConcat` function. Closes [#52759](https://github.com/ClickHouse/ClickHouse/issues/52759). [#53239](https://github.com/ClickHouse/ClickHouse/pull/53239) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `TRUNCATE DATABASE` operation. [#53261](https://github.com/ClickHouse/ClickHouse/pull/53261) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `max_threads_for_indexes` setting to limit number of threads used for primary key processing. [#53313](https://github.com/ClickHouse/ClickHouse/pull/53313) ([jorisgio](https://github.com/jorisgio)). +* Re-add SipHash keyed functions. [#53525](https://github.com/ClickHouse/ClickHouse/pull/53525) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* ([#52755](https://github.com/ClickHouse/ClickHouse/issues/52755) , [#52895](https://github.com/ClickHouse/ClickHouse/issues/52895)) Added functions `arrayRotateLeft`, `arrayRotateRight`, `arrayShiftLeft`, `arrayShiftRight`. [#53557](https://github.com/ClickHouse/ClickHouse/pull/53557) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Add column `name` to `system.clusters` as an alias to cluster. [#53605](https://github.com/ClickHouse/ClickHouse/pull/53605) ([irenjj](https://github.com/irenjj)). +* The advanced dashboard now allows mass editing (save/load). [#53608](https://github.com/ClickHouse/ClickHouse/pull/53608) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The advanced dashboard now has an option to maximize charts and move them around. [#53622](https://github.com/ClickHouse/ClickHouse/pull/53622) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added support for adding and subtracting arrays: `[5,2] + [1,7]`. Division and multiplication were not implemented due to confusion between pointwise multiplication and the scalar product of arguments. Closes [#49939](https://github.com/ClickHouse/ClickHouse/issues/49939). [#52625](https://github.com/ClickHouse/ClickHouse/pull/52625) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add support for string literals as table names. Closes [#52178](https://github.com/ClickHouse/ClickHouse/issues/52178). [#52635](https://github.com/ClickHouse/ClickHouse/pull/52635) ([hendrik-m](https://github.com/hendrik-m)). + +#### Experimental Feature +* Add new table engine `S3Queue` for streaming data import from s3. Closes [#37012](https://github.com/ClickHouse/ClickHouse/issues/37012). [#49086](https://github.com/ClickHouse/ClickHouse/pull/49086) ([s-kat](https://github.com/s-kat)). It is not ready to use. Do not use it. +* Enable parallel reading from replicas over distributed table. Related to [#49708](https://github.com/ClickHouse/ClickHouse/issues/49708). [#53005](https://github.com/ClickHouse/ClickHouse/pull/53005) ([Igor Nikonov](https://github.com/devcrafter)). +* Add experimental support for HNSW as approximate neighbor search method. [#53447](https://github.com/ClickHouse/ClickHouse/pull/53447) ([Davit Vardanyan](https://github.com/davvard)). This is currently intended for those who continue working on the implementation. Do not use it. + +#### Performance Improvement +* Parquet filter pushdown. I.e. when reading Parquet files, row groups (chunks of the file) are skipped based on the WHERE condition and the min/max values in each column. In particular, if the file is roughly sorted by some column, queries that filter by a short range of that column will be much faster. [#52951](https://github.com/ClickHouse/ClickHouse/pull/52951) ([Michael Kolupaev](https://github.com/al13n321)). +* Optimize reading small row groups by batching them together in Parquet. Closes [#53069](https://github.com/ClickHouse/ClickHouse/issues/53069). [#53281](https://github.com/ClickHouse/ClickHouse/pull/53281) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimize count from files in most input formats. Closes [#44334](https://github.com/ClickHouse/ClickHouse/issues/44334). [#53637](https://github.com/ClickHouse/ClickHouse/pull/53637) ([Kruglov Pavel](https://github.com/Avogar)). +* Use filter by file/path before reading in `url`/`file`/`hdfs` table functions. [#53529](https://github.com/ClickHouse/ClickHouse/pull/53529) ([Kruglov Pavel](https://github.com/Avogar)). +* Enable JIT compilation for AArch64, PowerPC, SystemZ, RISC-V. [#38217](https://github.com/ClickHouse/ClickHouse/pull/38217) ([Maksim Kita](https://github.com/kitaisreal)). +* Add setting `rewrite_count_distinct_if_with_count_distinct_implementation` to rewrite `countDistinctIf` with `count_distinct_implementation`. Closes [#30642](https://github.com/ClickHouse/ClickHouse/issues/30642). [#46051](https://github.com/ClickHouse/ClickHouse/pull/46051) ([flynn](https://github.com/ucasfl)). +* Speed up merging of states of `uniq` and `uniqExact` aggregate functions by parallelizing conversion before merge. [#50748](https://github.com/ClickHouse/ClickHouse/pull/50748) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize aggregation performance of nullable string key when using a large number of variable length keys. [#51399](https://github.com/ClickHouse/ClickHouse/pull/51399) ([LiuNeng](https://github.com/liuneng1994)). +* Add a pass in Analyzer for time filter optimization with preimage. The performance experiments of SSB on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring an improvement of 8.5% to the geomean QPS when the experimental analyzer is enabled. [#52091](https://github.com/ClickHouse/ClickHouse/pull/52091) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Optimize the merge if all hash sets are single-level in the `uniqExact` (COUNT DISTINCT) function. [#52973](https://github.com/ClickHouse/ClickHouse/pull/52973) ([Jiebin Sun](https://github.com/jiebinn)). +* `Join` table engine: do not clone hash join data structure with all columns. [#53046](https://github.com/ClickHouse/ClickHouse/pull/53046) ([Duc Canh Le](https://github.com/canhld94)). +* Implement native `ORC` input format without the "apache arrow" library to improve performance. [#53324](https://github.com/ClickHouse/ClickHouse/pull/53324) ([李扬](https://github.com/taiyang-li)). +* The dashboard will tell the server to compress the data, which is useful for large time frames over slow internet connections. For example, one chart with 86400 points can be 1.5 MB uncompressed and 60 KB compressed with `br`. [#53569](https://github.com/ClickHouse/ClickHouse/pull/53569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better utilization of thread pool for BACKUPs and RESTOREs. [#53649](https://github.com/ClickHouse/ClickHouse/pull/53649) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Load filesystem cache metadata on startup in parallel. Configured by `load_metadata_threads` (default: 1) cache config setting. Related to [#52037](https://github.com/ClickHouse/ClickHouse/issues/52037). [#52943](https://github.com/ClickHouse/ClickHouse/pull/52943) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improve `move_primary_key_columns_to_end_of_prewhere`. [#53337](https://github.com/ClickHouse/ClickHouse/pull/53337) ([Han Fei](https://github.com/hanfei1991)). +* This optimizes the interaction with ClickHouse Keeper. Previously the caller could register the same watch callback multiple times. In that case each entry was consuming memory and the same callback was called multiple times which didn't make much sense. In order to avoid this the caller could have some logic to not add the same watch multiple times. With this change this deduplication is done internally if the watch callback is passed via shared_ptr. [#53452](https://github.com/ClickHouse/ClickHouse/pull/53452) ([Alexander Gololobov](https://github.com/davenger)). +* Cache number of rows in files for count in file/s3/url/hdfs/azure functions. The cache can be enabled/disabled by setting `use_cache_for_count_from_files` (enabled by default). Continuation of https://github.com/ClickHouse/ClickHouse/pull/53637. [#53692](https://github.com/ClickHouse/ClickHouse/pull/53692) ([Kruglov Pavel](https://github.com/Avogar)). +* More careful thread management will improve the speed of the S3 table function over a large number of files by more than ~25%. [#53668](https://github.com/ClickHouse/ClickHouse/pull/53668) ([pufit](https://github.com/pufit)). + +#### Improvement +* Add `stderr_reaction` configuration/setting to control the reaction (none, log or throw) when external command stderr has data. This helps make debugging external command easier. [#43210](https://github.com/ClickHouse/ClickHouse/pull/43210) ([Amos Bird](https://github.com/amosbird)). +* Add `partition` column to the `system part_log` and merge table. [#48990](https://github.com/ClickHouse/ClickHouse/pull/48990) ([Jianfei Hu](https://github.com/incfly)). +* The sizes of the (index) uncompressed/mark, mmap and query caches can now be configured dynamically at runtime (without server restart). [#51446](https://github.com/ClickHouse/ClickHouse/pull/51446) ([Robert Schulze](https://github.com/rschu1ze)). +* If a dictionary is created with a complex key, automatically choose the "complex key" layout variant. [#49587](https://github.com/ClickHouse/ClickHouse/pull/49587) ([xiebin](https://github.com/xbthink)). +* Add setting `use_concurrency_control` for better testing of the new concurrency control feature. [#49618](https://github.com/ClickHouse/ClickHouse/pull/49618) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added suggestions for mistyped names for databases and tables. [#49801](https://github.com/ClickHouse/ClickHouse/pull/49801) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* While read small files from HDFS by Gluten, we found that it will cost more times when compare to directly query by Spark. And we did something with that. [#50063](https://github.com/ClickHouse/ClickHouse/pull/50063) ([KevinyhZou](https://github.com/KevinyhZou)). +* There were too many worthless error logs after session expiration, which we didn't like. [#50171](https://github.com/ClickHouse/ClickHouse/pull/50171) ([helifu](https://github.com/helifu)). +* Introduce fallback ZooKeeper sessions which are time-bound. Fixed `index` column in system.zookeeper_connection for DNS addresses. [#50424](https://github.com/ClickHouse/ClickHouse/pull/50424) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Add ability to log when max_partitions_per_insert_block is reached. [#50948](https://github.com/ClickHouse/ClickHouse/pull/50948) ([Sean Haynes](https://github.com/seandhaynes)). +* Added a bunch of custom commands to clickhouse-keeper-client (mostly to make ClickHouse debugging easier). [#51117](https://github.com/ClickHouse/ClickHouse/pull/51117) ([pufit](https://github.com/pufit)). +* Updated check for connection string in `azureBlobStorage` table function as connection string with "sas" does not always begin with the default endpoint and updated connection URL to include "sas" token after adding Azure's container to URL. [#51141](https://github.com/ClickHouse/ClickHouse/pull/51141) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix description for filtering sets in the `full_sorting_merge` JOIN algorithm. [#51329](https://github.com/ClickHouse/ClickHouse/pull/51329) ([Tanay Tummalapalli](https://github.com/ttanay)). +* Fixed memory consumption in `Aggregator` when `max_block_size` is huge. [#51566](https://github.com/ClickHouse/ClickHouse/pull/51566) ([Nikita Taranov](https://github.com/nickitat)). +* Add `SYSTEM SYNC FILESYSTEM CACHE` command. It will compare in-memory state of filesystem cache with what it has on disk and fix in-memory state if needed. This is only needed if you are making manual interventions in on-disk data, which is highly discouraged. [#51622](https://github.com/ClickHouse/ClickHouse/pull/51622) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Attempt to create a generic proxy resolver for CH while keeping backwards compatibility with existing S3 storage conf proxy resolver. [#51749](https://github.com/ClickHouse/ClickHouse/pull/51749) ([Arthur Passos](https://github.com/arthurpassos)). +* Support reading tuple subcolumns from file/s3/hdfs/url/azureBlobStorage table functions. [#51806](https://github.com/ClickHouse/ClickHouse/pull/51806) ([Kruglov Pavel](https://github.com/Avogar)). +* Function `arrayIntersect` now returns the values in the order, corresponding to the first argument. Closes [#27622](https://github.com/ClickHouse/ClickHouse/issues/27622). [#51850](https://github.com/ClickHouse/ClickHouse/pull/51850) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add new queries, which allow to create/drop of access entities in specified access storage or move access entities from one access storage to another. [#51912](https://github.com/ClickHouse/ClickHouse/pull/51912) ([pufit](https://github.com/pufit)). +* Make `ALTER TABLE FREEZE` queries not replicated in the Replicated database engine. [#52064](https://github.com/ClickHouse/ClickHouse/pull/52064) ([Mike Kot](https://github.com/myrrc)). +* Added possibility to flush system tables on unexpected shutdown. [#52174](https://github.com/ClickHouse/ClickHouse/pull/52174) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix the case when `s3` table function refused to work with pre-signed URLs. close [#50846](https://github.com/ClickHouse/ClickHouse/issues/50846). [#52310](https://github.com/ClickHouse/ClickHouse/pull/52310) ([chen](https://github.com/xiedeyantu)). +* Add column `name` as an alias to `event` and `metric` in the `system.events` and `system.metrics` tables. Closes [#51257](https://github.com/ClickHouse/ClickHouse/issues/51257). [#52315](https://github.com/ClickHouse/ClickHouse/pull/52315) ([chen](https://github.com/xiedeyantu)). +* Added support of syntax `CREATE UNIQUE INDEX` in parser as a no-op for better SQL compatibility. `UNIQUE` index is not supported. Set `create_index_ignore_unique = 1` to ignore UNIQUE keyword in queries. [#52320](https://github.com/ClickHouse/ClickHouse/pull/52320) ([Ilya Yatsishin](https://github.com/qoega)). +* Add support of predefined macro (`{database}` and `{table}`) in some Kafka engine settings: topic, consumer, client_id, etc. [#52386](https://github.com/ClickHouse/ClickHouse/pull/52386) ([Yury Bogomolov](https://github.com/ybogo)). +* Disable updating the filesystem cache during backup/restore. Filesystem cache must not be updated during backup/restore, it seems it just slows down the process without any profit (because the BACKUP command can read a lot of data and it's no use to put all the data to the filesystem cache and immediately evict it). [#52402](https://github.com/ClickHouse/ClickHouse/pull/52402) ([Vitaly Baranov](https://github.com/vitlibar)). +* The configuration of S3 endpoint allow using it from the root, and append '/' automatically if needed. [#47809](https://github.com/ClickHouse/ClickHouse/issues/47809). [#52600](https://github.com/ClickHouse/ClickHouse/pull/52600) ([xiaolei565](https://github.com/xiaolei565)). +* For clickhouse-local allow positional options and populate global UDF settings (user_scripts_path and user_defined_executable_functions_config). [#52643](https://github.com/ClickHouse/ClickHouse/pull/52643) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* `system.asynchronous_metrics` now includes metrics "QueryCacheEntries" and "QueryCacheBytes" to inspect the query cache. [#52650](https://github.com/ClickHouse/ClickHouse/pull/52650) ([Robert Schulze](https://github.com/rschu1ze)). +* Added possibility to use `s3_storage_class` parameter in the `SETTINGS` clause of the `BACKUP` statement for backups to S3. [#52658](https://github.com/ClickHouse/ClickHouse/pull/52658) ([Roman Vasin](https://github.com/rvasin)). +* Add utility `print-backup-info.py` which parses a backup metadata file and prints information about the backup. [#52690](https://github.com/ClickHouse/ClickHouse/pull/52690) ([Vitaly Baranov](https://github.com/vitlibar)). +* Closes [#49510](https://github.com/ClickHouse/ClickHouse/issues/49510). Currently we have database and table names case-sensitive, but BI tools query `information_schema` sometimes in lowercase, sometimes in uppercase. For this reason we have `information_schema` database, containing lowercase tables, such as `information_schema.tables` and `INFORMATION_SCHEMA` database, containing uppercase tables, such as `INFORMATION_SCHEMA.TABLES`. But some tools are querying `INFORMATION_SCHEMA.tables` and `information_schema.TABLES`. The proposed solution is to duplicate both lowercase and uppercase tables in lowercase and uppercase `information_schema` database. [#52695](https://github.com/ClickHouse/ClickHouse/pull/52695) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Query`CHECK TABLE` has better performance and usability (sends progress updates, cancellable). [#52745](https://github.com/ClickHouse/ClickHouse/pull/52745) ([vdimir](https://github.com/vdimir)). +* Add support for `modulo`, `intDiv`, `intDivOrZero` for tuples by distributing them across tuple's elements. [#52758](https://github.com/ClickHouse/ClickHouse/pull/52758) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Search for default `yaml` and `yml` configs in clickhouse-client after `xml`. [#52767](https://github.com/ClickHouse/ClickHouse/pull/52767) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* When merging into non-'clickhouse' rooted configuration, configs with different root node name just bypassed without exception. [#52770](https://github.com/ClickHouse/ClickHouse/pull/52770) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Now it's possible to specify min (`memory_profiler_sample_min_allocation_size`) and max (`memory_profiler_sample_max_allocation_size`) size for allocations to be tracked with sampling memory profiler. [#52779](https://github.com/ClickHouse/ClickHouse/pull/52779) ([alesapin](https://github.com/alesapin)). +* Add `precise_float_parsing` setting to switch float parsing methods (fast/precise). [#52791](https://github.com/ClickHouse/ClickHouse/pull/52791) ([Andrey Zvonov](https://github.com/zvonand)). +* Use the same default paths for `clickhouse-keeper` (symlink) as for `clickhouse-keeper` (executable). [#52861](https://github.com/ClickHouse/ClickHouse/pull/52861) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve error message for table function `remote`. Closes [#40220](https://github.com/ClickHouse/ClickHouse/issues/40220). [#52959](https://github.com/ClickHouse/ClickHouse/pull/52959) ([jiyoungyoooo](https://github.com/jiyoungyoooo)). +* Added the possibility to specify custom storage policy in the `SETTINGS` clause of `RESTORE` queries. [#52970](https://github.com/ClickHouse/ClickHouse/pull/52970) ([Victor Krasnov](https://github.com/sirvickr)). +* Add the ability to throttle the S3 requests on backup operations (`BACKUP` and `RESTORE` commands now honor `s3_max_[get/put]_[rps/burst]`). [#52974](https://github.com/ClickHouse/ClickHouse/pull/52974) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* Add settings to ignore ON CLUSTER clause in queries for management of replicated user-defined functions or access control entities with replicated storage. [#52975](https://github.com/ClickHouse/ClickHouse/pull/52975) ([Aleksei Filatov](https://github.com/aalexfvk)). +* EXPLAIN actions for JOIN step. [#53006](https://github.com/ClickHouse/ClickHouse/pull/53006) ([Maksim Kita](https://github.com/kitaisreal)). +* Make `hasTokenOrNull` and `hasTokenCaseInsensitiveOrNull` return null for empty needles. [#53059](https://github.com/ClickHouse/ClickHouse/pull/53059) ([ltrk2](https://github.com/ltrk2)). +* Allow to restrict allowed paths for filesystem caches. Mainly useful for dynamic disks. If in server config `filesystem_caches_path` is specified, all filesystem caches' paths will be restricted to this directory. E.g. if the `path` in cache config is relative - it will be put in `filesystem_caches_path`; if `path` in cache config is absolute, it will be required to lie inside `filesystem_caches_path`. If `filesystem_caches_path` is not specified in config, then behaviour will be the same as in earlier versions. [#53124](https://github.com/ClickHouse/ClickHouse/pull/53124) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added a bunch of custom commands (mostly to make ClickHouse debugging easier). [#53127](https://github.com/ClickHouse/ClickHouse/pull/53127) ([pufit](https://github.com/pufit)). +* Add diagnostic info about file name during schema inference - it helps when you process multiple files with globs. [#53135](https://github.com/ClickHouse/ClickHouse/pull/53135) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Client will load suggestions using the main connection if the second connection is not allowed to create a session. [#53177](https://github.com/ClickHouse/ClickHouse/pull/53177) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add EXCEPT clause to `SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM]` query, for example `SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP`. [#53280](https://github.com/ClickHouse/ClickHouse/pull/53280) ([Nikolay Degterinsky](https://github.com/evillique)). +* Change the default of `max_concurrent_queries` from 100 to 1000. It's ok to have many concurrent queries if they are not heavy, and mostly waiting for the network. Note: don't confuse concurrent queries and QPS: for example, ClickHouse server can do tens of thousands of QPS with less than 100 concurrent queries. [#53285](https://github.com/ClickHouse/ClickHouse/pull/53285) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Limit number of concurrent background partition optimize merges. [#53405](https://github.com/ClickHouse/ClickHouse/pull/53405) ([Duc Canh Le](https://github.com/canhld94)). +* Added a setting `allow_moving_table_directory_to_trash` that allows to ignore `Directory for table data already exists` error when replicating/recovering a `Replicated` database. [#53425](https://github.com/ClickHouse/ClickHouse/pull/53425) ([Alexander Tokmakov](https://github.com/tavplubix)). +* If server settings `asynchronous_metrics_update_period_s` and `asynchronous_heavy_metrics_update_period_s` are misconfigured to 0, it will now fail gracefully instead of terminating the application. [#53428](https://github.com/ClickHouse/ClickHouse/pull/53428) ([Robert Schulze](https://github.com/rschu1ze)). +* The ClickHouse server now respects memory limits changed via cgroups when reloading its configuration. [#53455](https://github.com/ClickHouse/ClickHouse/pull/53455) ([Robert Schulze](https://github.com/rschu1ze)). +* Add ability to turn off flush of Distributed tables on `DETACH`, `DROP`, or server shutdown. [#53501](https://github.com/ClickHouse/ClickHouse/pull/53501) ([Azat Khuzhin](https://github.com/azat)). +* The `domainRFC` function now supports IPv6 in square brackets. [#53506](https://github.com/ClickHouse/ClickHouse/pull/53506) ([Chen768959](https://github.com/Chen768959)). +* Use longer timeout for S3 CopyObject requests, which are used in backups. [#53533](https://github.com/ClickHouse/ClickHouse/pull/53533) ([Michael Kolupaev](https://github.com/al13n321)). +* Added server setting `aggregate_function_group_array_max_element_size`. This setting is used to limit array size for `groupArray` function at serialization. The default value is `16777215`. [#53550](https://github.com/ClickHouse/ClickHouse/pull/53550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `SCHEMA` was added as alias for `DATABASE` to improve MySQL compatibility. [#53587](https://github.com/ClickHouse/ClickHouse/pull/53587) ([Daniël van Eeden](https://github.com/dveeden)). +* Add asynchronous metrics about tables in the system database. For example, `TotalBytesOfMergeTreeTablesSystem`. This closes [#53603](https://github.com/ClickHouse/ClickHouse/issues/53603). [#53604](https://github.com/ClickHouse/ClickHouse/pull/53604) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* SQL editor in the Play UI and Dashboard will not use Grammarly. [#53614](https://github.com/ClickHouse/ClickHouse/pull/53614) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* As expert-level settings, it is now possible to (1) configure the size_ratio (i.e. the relative size of the protected queue) of the [index] mark/uncompressed caches, (2) configure the cache policy of the index mark and index uncompressed caches. [#53657](https://github.com/ClickHouse/ClickHouse/pull/53657) ([Robert Schulze](https://github.com/rschu1ze)). +* Added client info validation to the query packet in TCPHandler. [#53673](https://github.com/ClickHouse/ClickHouse/pull/53673) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Retry loading parts in case of network errors while interaction with Microsoft Azure. [#53750](https://github.com/ClickHouse/ClickHouse/pull/53750) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Stacktrace for exceptions, Materailized view exceptions are propagated. [#53766](https://github.com/ClickHouse/ClickHouse/pull/53766) ([Ilya Golshtein](https://github.com/ilejn)). +* If no hostname or port were specified, keeper client will try to search for a connection string in the ClickHouse's config.xml. [#53769](https://github.com/ClickHouse/ClickHouse/pull/53769) ([pufit](https://github.com/pufit)). +* Add profile event `PartsLockMicroseconds` which shows the amount of microseconds we hold the data parts lock in MergeTree table engine family. [#53797](https://github.com/ClickHouse/ClickHouse/pull/53797) ([alesapin](https://github.com/alesapin)). +* Make reconnect limit in RAFT limits configurable for keeper. This configuration can help to make keeper to rebuild connection with peers quicker if the current connection is broken. [#53817](https://github.com/ClickHouse/ClickHouse/pull/53817) ([Pengyuan Bian](https://github.com/bianpengyuan)). +* Ignore foreign keys in tables definition to improve compatibility with MySQL, so a user wouldn't need to rewrite his SQL of the foreign key part, ref [#53380](https://github.com/ClickHouse/ClickHouse/issues/53380). [#53864](https://github.com/ClickHouse/ClickHouse/pull/53864) ([jsc0218](https://github.com/jsc0218)). + +#### Build/Testing/Packaging Improvement +* Don't expose symbols from ClickHouse binary to dynamic linker. It might fix [#43933](https://github.com/ClickHouse/ClickHouse/issues/43933). [#47475](https://github.com/ClickHouse/ClickHouse/pull/47475) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `clickhouse-keeper-client` symlink to the clickhouse-server package. [#51882](https://github.com/ClickHouse/ClickHouse/pull/51882) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add https://github.com/elliotchance/sqltest to CI to report the SQL 2016 conformance. [#52293](https://github.com/ClickHouse/ClickHouse/pull/52293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Upgrade PRQL to 0.9.3. [#53060](https://github.com/ClickHouse/ClickHouse/pull/53060) ([Maximilian Roos](https://github.com/max-sixty)). +* System tables from CI checks are exported to ClickHouse Cloud. [#53086](https://github.com/ClickHouse/ClickHouse/pull/53086) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The compiler's profile data (`-ftime-trace`) is uploaded to ClickHouse Cloud. [#53100](https://github.com/ClickHouse/ClickHouse/pull/53100) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Speed up Debug and Tidy builds. [#53178](https://github.com/ClickHouse/ClickHouse/pull/53178) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Speed up the build by removing tons and tonnes of garbage. One of the frequently included headers was poisoned by boost. [#53180](https://github.com/ClickHouse/ClickHouse/pull/53180) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove even more garbage. [#53182](https://github.com/ClickHouse/ClickHouse/pull/53182) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The function `arrayAUC` was using heavy C++ templates - ditched them. [#53183](https://github.com/ClickHouse/ClickHouse/pull/53183) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Some translation units were always rebuilt regardless of ccache. The culprit is found and fixed. [#53184](https://github.com/ClickHouse/ClickHouse/pull/53184) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The compiler's profile data (`-ftime-trace`) is uploaded to ClickHouse Cloud., the second attempt after [#53100](https://github.com/ClickHouse/ClickHouse/issues/53100). [#53213](https://github.com/ClickHouse/ClickHouse/pull/53213) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in stateful tests to ClickHouse Cloud. [#53351](https://github.com/ClickHouse/ClickHouse/pull/53351) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in stress tests. [#53353](https://github.com/ClickHouse/ClickHouse/pull/53353) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in fuzzer. [#53354](https://github.com/ClickHouse/ClickHouse/pull/53354) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preserve environment parameters in `clickhouse start` command. Fixes [#51962](https://github.com/ClickHouse/ClickHouse/issues/51962). [#53418](https://github.com/ClickHouse/ClickHouse/pull/53418) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Follow up for [#53418](https://github.com/ClickHouse/ClickHouse/issues/53418). Small improvements for install_check.py, adding tests for proper ENV parameters passing to the main process on `init.d start`. [#53457](https://github.com/ClickHouse/ClickHouse/pull/53457) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Reorganize file management in CMake to prevent potential duplications. For instance, `indexHint.cpp` is duplicated in both `dbms_sources` and `clickhouse_functions_sources`. [#53621](https://github.com/ClickHouse/ClickHouse/pull/53621) ([Amos Bird](https://github.com/amosbird)). +* Upgrade snappy to 1.1.10. [#53672](https://github.com/ClickHouse/ClickHouse/pull/53672) ([李扬](https://github.com/taiyang-li)). +* Slightly improve cmake build by sanitizing some dependencies and removing some duplicates. Each commit includes a short description of the changes made. [#53759](https://github.com/ClickHouse/ClickHouse/pull/53759) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Do not reset (experimental) Annoy index during build-up with more than one mark [#51325](https://github.com/ClickHouse/ClickHouse/pull/51325) ([Tian Xinhui](https://github.com/xinhuitian)). +* Fix usage of temporary directories during RESTORE [#51493](https://github.com/ClickHouse/ClickHouse/pull/51493) ([Azat Khuzhin](https://github.com/azat)). +* Fix binary arithmetic for Nullable(IPv4) [#51642](https://github.com/ClickHouse/ClickHouse/pull/51642) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Support IPv4 and IPv6 data types as dictionary attributes [#51756](https://github.com/ClickHouse/ClickHouse/pull/51756) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* A fix for checksum of compress marks [#51777](https://github.com/ClickHouse/ClickHouse/pull/51777) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix mistakenly comma parsing as part of datetime in CSV best effort parsing [#51950](https://github.com/ClickHouse/ClickHouse/pull/51950) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't throw exception when executable UDF has parameters [#51961](https://github.com/ClickHouse/ClickHouse/pull/51961) ([Nikita Taranov](https://github.com/nickitat)). +* Fix recalculation of skip indexes and projections in `ALTER DELETE` queries [#52530](https://github.com/ClickHouse/ClickHouse/pull/52530) ([Anton Popov](https://github.com/CurtizJ)). +* MaterializedMySQL: Fix the infinite loop in ReadBuffer::read [#52621](https://github.com/ClickHouse/ClickHouse/pull/52621) ([Val Doroshchuk](https://github.com/valbok)). +* Load suggestion only with `clickhouse` dialect [#52628](https://github.com/ClickHouse/ClickHouse/pull/52628) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Init and destroy ares channel on demand. [#52634](https://github.com/ClickHouse/ClickHouse/pull/52634) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix filtering by virtual columns with OR expression [#52653](https://github.com/ClickHouse/ClickHouse/pull/52653) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in function `tuple` with one sparse column argument [#52659](https://github.com/ClickHouse/ClickHouse/pull/52659) ([Anton Popov](https://github.com/CurtizJ)). +* Fix named collections on cluster [#52687](https://github.com/ClickHouse/ClickHouse/pull/52687) ([Al Korgun](https://github.com/alkorgun)). +* Fix reading of unnecessary column in case of multistage `PREWHERE` [#52689](https://github.com/ClickHouse/ClickHouse/pull/52689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix unexpected sort result on multi columns with nulls first direction [#52761](https://github.com/ClickHouse/ClickHouse/pull/52761) ([copperybean](https://github.com/copperybean)). +* Fix data race in Keeper reconfiguration [#52804](https://github.com/ClickHouse/ClickHouse/pull/52804) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix sorting of sparse columns with large limit [#52827](https://github.com/ClickHouse/ClickHouse/pull/52827) ([Anton Popov](https://github.com/CurtizJ)). +* clickhouse-keeper: fix implementation of server with poll. [#52833](https://github.com/ClickHouse/ClickHouse/pull/52833) ([Andy Fiddaman](https://github.com/citrus-it)). +* Make regexp analyzer recognize named capturing groups [#52840](https://github.com/ClickHouse/ClickHouse/pull/52840) ([Han Fei](https://github.com/hanfei1991)). +* Fix possible assert in `~PushingAsyncPipelineExecutor` in clickhouse-local [#52862](https://github.com/ClickHouse/ClickHouse/pull/52862) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of empty `Nested(Array(LowCardinality(...)))` [#52949](https://github.com/ClickHouse/ClickHouse/pull/52949) ([Anton Popov](https://github.com/CurtizJ)). +* Added new tests for session_log and fixed the inconsistency between login and logout. [#52958](https://github.com/ClickHouse/ClickHouse/pull/52958) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix password leak in show create mysql table [#52962](https://github.com/ClickHouse/ClickHouse/pull/52962) ([Duc Canh Le](https://github.com/canhld94)). +* Convert sparse column format to full in CreateSetAndFilterOnTheFlyStep [#53000](https://github.com/ClickHouse/ClickHouse/pull/53000) ([vdimir](https://github.com/vdimir)). +* Fix rare race condition with empty key prefix directory deletion in fs cache [#53055](https://github.com/ClickHouse/ClickHouse/pull/53055) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix ZstdDeflatingWriteBuffer truncating the output sometimes [#53064](https://github.com/ClickHouse/ClickHouse/pull/53064) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix query_id in part_log with async flush queries [#53103](https://github.com/ClickHouse/ClickHouse/pull/53103) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible error from cache "Read unexpected size" [#53121](https://github.com/ClickHouse/ClickHouse/pull/53121) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable the new parquet encoder [#53130](https://github.com/ClickHouse/ClickHouse/pull/53130) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix "Not-ready Set" exception [#53162](https://github.com/ClickHouse/ClickHouse/pull/53162) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix character escaping in the PostgreSQL engine [#53250](https://github.com/ClickHouse/ClickHouse/pull/53250) ([Nikolay Degterinsky](https://github.com/evillique)). +* Experimental session_log table: Added new tests for session_log and fixed the inconsistency between login and logout. [#53255](https://github.com/ClickHouse/ClickHouse/pull/53255) ([Alexey Gerasimchuck](https://github.com/Demilivor)). Fixed inconsistency between login success and logout [#53302](https://github.com/ClickHouse/ClickHouse/pull/53302) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix adding sub-second intervals to DateTime [#53309](https://github.com/ClickHouse/ClickHouse/pull/53309) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix "Context has expired" error in dictionaries [#53342](https://github.com/ClickHouse/ClickHouse/pull/53342) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect normal projection AST format [#53347](https://github.com/ClickHouse/ClickHouse/pull/53347) ([Amos Bird](https://github.com/amosbird)). +* Forbid use_structure_from_insertion_table_in_table_functions when execute Scalar [#53348](https://github.com/ClickHouse/ClickHouse/pull/53348) ([flynn](https://github.com/ucasfl)). +* Fix loading lazy database during system.table select query [#53372](https://github.com/ClickHouse/ClickHouse/pull/53372) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fixed system.data_skipping_indices for MaterializedMySQL [#53381](https://github.com/ClickHouse/ClickHouse/pull/53381) ([Filipp Ozinov](https://github.com/bakwc)). +* Fix processing single carriage return in TSV file segmentation engine [#53407](https://github.com/ClickHouse/ClickHouse/pull/53407) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `Context has expired` error properly [#53433](https://github.com/ClickHouse/ClickHouse/pull/53433) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix `timeout_overflow_mode` when having subquery in the rhs of IN [#53439](https://github.com/ClickHouse/ClickHouse/pull/53439) ([Duc Canh Le](https://github.com/canhld94)). +* Fix an unexpected behavior in [#53152](https://github.com/ClickHouse/ClickHouse/issues/53152) [#53440](https://github.com/ClickHouse/ClickHouse/pull/53440) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Fix JSON_QUERY Function parse error while path is all number [#53470](https://github.com/ClickHouse/ClickHouse/pull/53470) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix wrong columns order for queries with parallel FINAL. [#53489](https://github.com/ClickHouse/ClickHouse/pull/53489) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed SELECTing from ReplacingMergeTree with do_not_merge_across_partitions_select_final [#53511](https://github.com/ClickHouse/ClickHouse/pull/53511) ([Vasily Nemkov](https://github.com/Enmk)). +* Flush async insert queue first on shutdown [#53547](https://github.com/ClickHouse/ClickHouse/pull/53547) ([joelynch](https://github.com/joelynch)). +* Fix crash in join on sparse columna [#53548](https://github.com/ClickHouse/ClickHouse/pull/53548) ([vdimir](https://github.com/vdimir)). +* Fix possible UB in Set skipping index for functions with incorrect args [#53559](https://github.com/ClickHouse/ClickHouse/pull/53559) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible UB in inverted indexes (experimental feature) [#53560](https://github.com/ClickHouse/ClickHouse/pull/53560) ([Azat Khuzhin](https://github.com/azat)). +* Fix: interpolate expression takes source column instead of same name aliased from select expression. [#53572](https://github.com/ClickHouse/ClickHouse/pull/53572) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix number of dropped granules in EXPLAIN PLAN index=1 [#53616](https://github.com/ClickHouse/ClickHouse/pull/53616) ([wangxiaobo](https://github.com/wzb5212)). +* Correctly handle totals and extremes with `DelayedSource` [#53644](https://github.com/ClickHouse/ClickHouse/pull/53644) ([Antonio Andelic](https://github.com/antonio2368)). +* Prepared set cache in mutation pipeline stuck [#53645](https://github.com/ClickHouse/ClickHouse/pull/53645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug on mutations with subcolumns of type JSON in predicates of UPDATE and DELETE queries. [#53677](https://github.com/ClickHouse/ClickHouse/pull/53677) ([VanDarkholme7](https://github.com/VanDarkholme7)). +* Fix filter pushdown for full_sorting_merge join [#53699](https://github.com/ClickHouse/ClickHouse/pull/53699) ([vdimir](https://github.com/vdimir)). +* Try to fix bug with `NULL::LowCardinality(Nullable(...)) NOT IN` [#53706](https://github.com/ClickHouse/ClickHouse/pull/53706) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix: sorted distinct with sparse columns [#53711](https://github.com/ClickHouse/ClickHouse/pull/53711) ([Igor Nikonov](https://github.com/devcrafter)). +* `transform`: correctly handle default column with multiple rows [#53742](https://github.com/ClickHouse/ClickHouse/pull/53742) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix fuzzer crash in parseDateTime [#53764](https://github.com/ClickHouse/ClickHouse/pull/53764) ([Robert Schulze](https://github.com/rschu1ze)). +* MaterializedPostgreSQL: fix uncaught exception in getCreateTableQueryImpl [#53832](https://github.com/ClickHouse/ClickHouse/pull/53832) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible segfault while using PostgreSQL engine [#53847](https://github.com/ClickHouse/ClickHouse/pull/53847) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix named_collection_admin alias [#54066](https://github.com/ClickHouse/ClickHouse/pull/54066) ([Kseniia Sumarokova](https://github.com/kssenii)). + +### ClickHouse release 23.7, 2023-07-27 {#237} + +#### Backward Incompatible Change +* Add `NAMED COLLECTION` access type (aliases `USE NAMED COLLECTION`, `NAMED COLLECTION USAGE`). This PR is backward incompatible because this access type is disabled by default (because a parent access type `NAMED COLLECTION ADMIN` is disabled by default as well). Proposed in [#50277](https://github.com/ClickHouse/ClickHouse/issues/50277). To grant use `GRANT NAMED COLLECTION ON collection_name TO user` or `GRANT NAMED COLLECTION ON * TO user`, to be able to give these grants `named_collection_admin` is required in config (previously it was named `named_collection_control`, so will remain as an alias). [#50625](https://github.com/ClickHouse/ClickHouse/pull/50625) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixing a typo in the `system.parts` column name `last_removal_attemp_time`. Now it is named `last_removal_attempt_time`. [#52104](https://github.com/ClickHouse/ClickHouse/pull/52104) ([filimonov](https://github.com/filimonov)). +* Bump version of the distributed_ddl_entry_format_version to 5 by default (enables opentelemetry and initial_query_idd pass through). This will not allow to process existing entries for distributed DDL after *downgrade* (but note, that usually there should be no such unprocessed entries). [#52128](https://github.com/ClickHouse/ClickHouse/pull/52128) ([Azat Khuzhin](https://github.com/azat)). +* Check projection metadata the same way we check ordinary metadata. This change may prevent the server from starting in case there was a table with an invalid projection. An example is a projection that created positional columns in PK (e.g. `projection p (select * order by 1, 4)` which is not allowed in table PK and can cause a crash during insert/merge). Drop such projections before the update. Fixes [#52353](https://github.com/ClickHouse/ClickHouse/issues/52353). [#52361](https://github.com/ClickHouse/ClickHouse/pull/52361) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The experimental feature `hashid` is removed due to a bug. The quality of implementation was questionable at the start, and it didn't get through the experimental status. This closes [#52406](https://github.com/ClickHouse/ClickHouse/issues/52406). [#52449](https://github.com/ClickHouse/ClickHouse/pull/52449) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Added `Overlay` database engine to combine multiple databases into one. Added `Filesystem` database engine to represent a directory in the filesystem as a set of implicitly available tables with auto-detected formats and structures. A new `S3` database engine allows to read-only interact with s3 storage by representing a prefix as a set of tables. A new `HDFS` database engine allows to interact with HDFS storage in the same way. [#48821](https://github.com/ClickHouse/ClickHouse/pull/48821) ([alekseygolub](https://github.com/alekseygolub)). +* Add support for external disks in Keeper for storing snapshots and logs. [#50098](https://github.com/ClickHouse/ClickHouse/pull/50098) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for multi-directory selection (`{}`) globs. [#50559](https://github.com/ClickHouse/ClickHouse/pull/50559) ([Andrey Zvonov](https://github.com/zvonand)). +* Kafka connector can fetch Avro schema from schema registry with basic authentication using url-encoded credentials. [#49664](https://github.com/ClickHouse/ClickHouse/pull/49664) ([Ilya Golshtein](https://github.com/ilejn)). +* Add function `arrayJaccardIndex` which computes the Jaccard similarity between two arrays. [#50076](https://github.com/ClickHouse/ClickHouse/pull/50076) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Add a column `is_obsolete` to `system.settings` and similar tables. Closes [#50819](https://github.com/ClickHouse/ClickHouse/issues/50819). [#50826](https://github.com/ClickHouse/ClickHouse/pull/50826) ([flynn](https://github.com/ucasfl)). +* Implement support of encrypted elements in configuration file. Added possibility to use encrypted text in leaf elements of configuration file. The text is encrypted using encryption codecs from `` section. [#50986](https://github.com/ClickHouse/ClickHouse/pull/50986) ([Roman Vasin](https://github.com/rvasin)). +* Grace Hash Join algorithm is now applicable to FULL and RIGHT JOINs. [#49483](https://github.com/ClickHouse/ClickHouse/issues/49483). [#51013](https://github.com/ClickHouse/ClickHouse/pull/51013) ([lgbo](https://github.com/lgbo-ustc)). +* Add `SYSTEM STOP LISTEN` query for more graceful termination. Closes [#47972](https://github.com/ClickHouse/ClickHouse/issues/47972). [#51016](https://github.com/ClickHouse/ClickHouse/pull/51016) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `input_format_csv_allow_variable_number_of_columns` options. [#51273](https://github.com/ClickHouse/ClickHouse/pull/51273) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Another boring feature: add function `substring_index`, as in Spark or MySQL. [#51472](https://github.com/ClickHouse/ClickHouse/pull/51472) ([李扬](https://github.com/taiyang-li)). +* A system table `jemalloc_bins` to show stats for jemalloc bins. Example `SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10`. Enjoy. [#51674](https://github.com/ClickHouse/ClickHouse/pull/51674) ([Alexander Gololobov](https://github.com/davenger)). +* Add `RowBinaryWithDefaults` format with extra byte before each column as a flag for using the column's default value. Closes [#50854](https://github.com/ClickHouse/ClickHouse/issues/50854). [#51695](https://github.com/ClickHouse/ClickHouse/pull/51695) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `default_temporary_table_engine` setting. Same as `default_table_engine` but for temporary tables. [#51292](https://github.com/ClickHouse/ClickHouse/issues/51292). [#51708](https://github.com/ClickHouse/ClickHouse/pull/51708) ([velavokr](https://github.com/velavokr)). +* Added new `initcap` / `initcapUTF8` functions which convert the first letter of each word to upper case and the rest to lower case. [#51735](https://github.com/ClickHouse/ClickHouse/pull/51735) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Create table now supports `PRIMARY KEY` syntax in column definition. Columns are added to primary index in the same order columns are defined. [#51881](https://github.com/ClickHouse/ClickHouse/pull/51881) ([Ilya Yatsishin](https://github.com/qoega)). +* Added the possibility to use date and time format specifiers in log and error log file names, either in config files (`log` and `errorlog` tags) or command line arguments (`--log-file` and `--errorlog-file`). [#51945](https://github.com/ClickHouse/ClickHouse/pull/51945) ([Victor Krasnov](https://github.com/sirvickr)). +* Added Peak Memory Usage statistic to HTTP headers. [#51946](https://github.com/ClickHouse/ClickHouse/pull/51946) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Added new `hasSubsequence` (+`CaseInsensitive` and `UTF8` versions) functions to match subsequences in strings. [#52050](https://github.com/ClickHouse/ClickHouse/pull/52050) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Add `array_agg` as alias of `groupArray` for PostgreSQL compatibility. Closes [#52100](https://github.com/ClickHouse/ClickHouse/issues/52100). ### Documentation entry for user-facing changes. [#52135](https://github.com/ClickHouse/ClickHouse/pull/52135) ([flynn](https://github.com/ucasfl)). +* Add `any_value` as a compatibility alias for `any` aggregate function. Closes [#52140](https://github.com/ClickHouse/ClickHouse/issues/52140). [#52147](https://github.com/ClickHouse/ClickHouse/pull/52147) ([flynn](https://github.com/ucasfl)). +* Add aggregate function `array_concat_agg` for compatibility with BigQuery, it's alias of `groupArrayArray`. Closes [#52139](https://github.com/ClickHouse/ClickHouse/issues/52139). [#52149](https://github.com/ClickHouse/ClickHouse/pull/52149) ([flynn](https://github.com/ucasfl)). +* Add `OCTET_LENGTH` as an alias to `length`. Closes [#52153](https://github.com/ClickHouse/ClickHouse/issues/52153). [#52176](https://github.com/ClickHouse/ClickHouse/pull/52176) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Added `firstLine` function to extract the first line from the multi-line string. This closes [#51172](https://github.com/ClickHouse/ClickHouse/issues/51172). [#52209](https://github.com/ClickHouse/ClickHouse/pull/52209) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Implement KQL-style formatting for the `Interval` data type. This is only needed for compatibility with the `Kusto` query language. [#45671](https://github.com/ClickHouse/ClickHouse/pull/45671) ([ltrk2](https://github.com/ltrk2)). +* Added query `SYSTEM FLUSH ASYNC INSERT QUEUE` which flushes all pending asynchronous inserts to the destination tables. Added a server-side setting `async_insert_queue_flush_on_shutdown` (`true` by default) which determines whether to flush queue of asynchronous inserts on graceful shutdown. Setting `async_insert_threads` is now a server-side setting. [#49160](https://github.com/ClickHouse/ClickHouse/pull/49160) ([Anton Popov](https://github.com/CurtizJ)). +* Aliases `current_database` and a new function `current_schemas` for compatibility with PostgreSQL. [#51076](https://github.com/ClickHouse/ClickHouse/pull/51076) ([Pedro Riera](https://github.com/priera)). +* Add alias for functions `today` (now available under the `curdate`/`current_date` names) and `now` (`current_timestamp`). [#52106](https://github.com/ClickHouse/ClickHouse/pull/52106) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Support `async_deduplication_token` for async insert. [#52136](https://github.com/ClickHouse/ClickHouse/pull/52136) ([Han Fei](https://github.com/hanfei1991)). +* Add new setting `disable_url_encoding` that allows to disable decoding/encoding path in uri in URL engine. [#52337](https://github.com/ClickHouse/ClickHouse/pull/52337) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Enable automatic selection of the sparse serialization format by default. It improves performance. The format is supported since version 22.1. After this change, downgrading to versions older than 22.1 might not be possible. A downgrade may require to set `ratio_of_defaults_for_sparse_serialization=0.9375` [55153](https://github.com/ClickHouse/ClickHouse/issues/55153). You can turn off the usage of the sparse serialization format by providing the `ratio_of_defaults_for_sparse_serialization = 1` setting for your MergeTree tables. [#49631](https://github.com/ClickHouse/ClickHouse/pull/49631) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable `move_all_conditions_to_prewhere` and `enable_multiple_prewhere_read_steps` settings by default. [#46365](https://github.com/ClickHouse/ClickHouse/pull/46365) ([Alexander Gololobov](https://github.com/davenger)). +* Improves performance of some queries by tuning allocator. [#46416](https://github.com/ClickHouse/ClickHouse/pull/46416) ([Azat Khuzhin](https://github.com/azat)). +* Now we use fixed-size tasks in `MergeTreePrefetchedReadPool` as in `MergeTreeReadPool`. Also from now we use connection pool for S3 requests. [#49732](https://github.com/ClickHouse/ClickHouse/pull/49732) ([Nikita Taranov](https://github.com/nickitat)). +* More pushdown to the right side of join. [#50532](https://github.com/ClickHouse/ClickHouse/pull/50532) ([Nikita Taranov](https://github.com/nickitat)). +* Improve grace_hash join by reserving hash table's size (resubmit). [#50875](https://github.com/ClickHouse/ClickHouse/pull/50875) ([lgbo](https://github.com/lgbo-ustc)). +* Waiting on lock in `OpenedFileCache` could be noticeable sometimes. We sharded it into multiple sub-maps (each with its own lock) to avoid contention. [#51341](https://github.com/ClickHouse/ClickHouse/pull/51341) ([Nikita Taranov](https://github.com/nickitat)). +* Move conditions with primary key columns to the end of PREWHERE chain. The idea is that conditions with PK columns are likely to be used in PK analysis and will not contribute much more to PREWHERE filtering. [#51958](https://github.com/ClickHouse/ClickHouse/pull/51958) ([Alexander Gololobov](https://github.com/davenger)). +* Speed up `COUNT(DISTINCT)` for String types by inlining SipHash. The performance experiments of *OnTime* on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring an improvement of *11.6%* to the QPS of the query *Q8* while having no impact on others. [#52036](https://github.com/ClickHouse/ClickHouse/pull/52036) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Enable `allow_vertical_merges_from_compact_to_wide_parts` by default. It will save memory usage during merges. [#52295](https://github.com/ClickHouse/ClickHouse/pull/52295) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect projection analysis which invalidates primary keys. This issue only exists when `query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1`. This fixes [#48823](https://github.com/ClickHouse/ClickHouse/issues/48823). This fixes [#51173](https://github.com/ClickHouse/ClickHouse/issues/51173). [#52308](https://github.com/ClickHouse/ClickHouse/pull/52308) ([Amos Bird](https://github.com/amosbird)). +* Reduce the number of syscalls in `FileCache::loadMetadata` - this speeds up server startup if the filesystem cache is configured. [#52435](https://github.com/ClickHouse/ClickHouse/pull/52435) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to have strict lower boundary for file segment size by downloading remaining data in the background. Minimum size of file segment (if actual file size is bigger) is configured as cache configuration setting `boundary_alignment`, by default `4Mi`. Number of background threads are configured as cache configuration setting `background_download_threads`, by default `2`. Also `max_file_segment_size` was increased from `8Mi` to `32Mi` in this PR. [#51000](https://github.com/ClickHouse/ClickHouse/pull/51000) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Decreased default timeouts for S3 from 30 seconds to 3 seconds, and for other HTTP from 180 seconds to 30 seconds. [#51171](https://github.com/ClickHouse/ClickHouse/pull/51171) ([Michael Kolupaev](https://github.com/al13n321)). +* New setting `merge_tree_determine_task_size_by_prewhere_columns` added. If set to `true` only sizes of the columns from `PREWHERE` section will be considered to determine reading task size. Otherwise all the columns from query are considered. [#52606](https://github.com/ClickHouse/ClickHouse/pull/52606) ([Nikita Taranov](https://github.com/nickitat)). + +#### Improvement +* Use read_bytes/total_bytes_to_read for progress bar in s3/file/url/... table functions for better progress indication. [#51286](https://github.com/ClickHouse/ClickHouse/pull/51286) ([Kruglov Pavel](https://github.com/Avogar)). +* Introduce a table setting `wait_for_unique_parts_send_before_shutdown_ms` which specify the amount of time replica will wait before closing interserver handler for replicated sends. Also fix inconsistency with shutdown of tables and interserver handlers: now server shutdown tables first and only after it shut down interserver handlers. [#51851](https://github.com/ClickHouse/ClickHouse/pull/51851) ([alesapin](https://github.com/alesapin)). +* Allow SQL standard `FETCH` without `OFFSET`. See https://antonz.org/sql-fetch/. [#51293](https://github.com/ClickHouse/ClickHouse/pull/51293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow filtering HTTP headers for the URL/S3 table functions with the new `http_forbid_headers` section in config. Both exact matching and regexp filters are available. [#51038](https://github.com/ClickHouse/ClickHouse/pull/51038) ([Nikolay Degterinsky](https://github.com/evillique)). +* Don't show messages about `16 EiB` free space in logs, as they don't make sense. This closes [#49320](https://github.com/ClickHouse/ClickHouse/issues/49320). [#49342](https://github.com/ClickHouse/ClickHouse/pull/49342) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Properly check the limit for the `sleepEachRow` function. Add a setting `function_sleep_max_microseconds_per_block`. This is needed for generic query fuzzer. [#49343](https://github.com/ClickHouse/ClickHouse/pull/49343) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix two issues in `geoHash` functions. [#50066](https://github.com/ClickHouse/ClickHouse/pull/50066) ([李扬](https://github.com/taiyang-li)). +* Log async insert flush queries into `system.query_log`. [#51160](https://github.com/ClickHouse/ClickHouse/pull/51160) ([Raúl Marín](https://github.com/Algunenano)). +* Functions `date_diff` and `age` now support millisecond/microsecond unit and work with microsecond precision. [#51291](https://github.com/ClickHouse/ClickHouse/pull/51291) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Improve parsing of path in clickhouse-keeper-client. [#51359](https://github.com/ClickHouse/ClickHouse/pull/51359) ([Azat Khuzhin](https://github.com/azat)). +* A third-party product depending on ClickHouse (Gluten: a Plugin to Double SparkSQL's Performance) had a bug. This fix avoids heap overflow in that third-party product while reading from HDFS. [#51386](https://github.com/ClickHouse/ClickHouse/pull/51386) ([李扬](https://github.com/taiyang-li)). +* Add ability to disable native copy for S3 (setting for BACKUP/RESTORE `allow_s3_native_copy`, and `s3_allow_native_copy` for `s3`/`s3_plain` disks). [#51448](https://github.com/ClickHouse/ClickHouse/pull/51448) ([Azat Khuzhin](https://github.com/azat)). +* Add column `primary_key_size` to `system.parts` table to show compressed primary key size on disk. Closes [#51400](https://github.com/ClickHouse/ClickHouse/issues/51400). [#51496](https://github.com/ClickHouse/ClickHouse/pull/51496) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Allow running `clickhouse-local` without procfs, without home directory existing, and without name resolution plugins from glibc. [#51518](https://github.com/ClickHouse/ClickHouse/pull/51518) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add placeholder `%a` for rull filename in rename_files_after_processing setting. [#51603](https://github.com/ClickHouse/ClickHouse/pull/51603) ([Kruglov Pavel](https://github.com/Avogar)). +* Add column `modification_time` into `system.parts_columns`. [#51685](https://github.com/ClickHouse/ClickHouse/pull/51685) ([Azat Khuzhin](https://github.com/azat)). +* Add new setting `input_format_csv_use_default_on_bad_values` to CSV format that allows to insert default value when parsing of a single field failed. [#51716](https://github.com/ClickHouse/ClickHouse/pull/51716) ([KevinyhZou](https://github.com/KevinyhZou)). +* Added a crash log flush to the disk after the unexpected crash. [#51720](https://github.com/ClickHouse/ClickHouse/pull/51720) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix behavior in dashboard page where errors unrelated to authentication are not shown. Also fix 'overlapping' chart behavior. [#51744](https://github.com/ClickHouse/ClickHouse/pull/51744) ([Zach Naimon](https://github.com/ArctypeZach)). +* Allow UUID to UInt128 conversion. [#51765](https://github.com/ClickHouse/ClickHouse/pull/51765) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Added support for function `range` of Nullable arguments. [#51767](https://github.com/ClickHouse/ClickHouse/pull/51767) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Convert condition like `toyear(x) = c` to `c1 <= x < c2`. [#51795](https://github.com/ClickHouse/ClickHouse/pull/51795) ([Han Fei](https://github.com/hanfei1991)). +* Improve MySQL compatibility of the statement `SHOW INDEX`. [#51796](https://github.com/ClickHouse/ClickHouse/pull/51796) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix `use_structure_from_insertion_table_in_table_functions` does not work with `MATERIALIZED` and `ALIAS` columns. Closes [#51817](https://github.com/ClickHouse/ClickHouse/issues/51817). Closes [#51019](https://github.com/ClickHouse/ClickHouse/issues/51019). [#51825](https://github.com/ClickHouse/ClickHouse/pull/51825) ([flynn](https://github.com/ucasfl)). +* Cache dictionary now requests only unique keys from source. Closes [#51762](https://github.com/ClickHouse/ClickHouse/issues/51762). [#51853](https://github.com/ClickHouse/ClickHouse/pull/51853) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed the case when settings were not applied for EXPLAIN query when FORMAT was provided. [#51859](https://github.com/ClickHouse/ClickHouse/pull/51859) ([Nikita Taranov](https://github.com/nickitat)). +* Allow SETTINGS before FORMAT in DESCRIBE TABLE query for compatibility with SELECT query. Closes [#51544](https://github.com/ClickHouse/ClickHouse/issues/51544). [#51899](https://github.com/ClickHouse/ClickHouse/pull/51899) ([Nikolay Degterinsky](https://github.com/evillique)). +* Var-Int encoded integers (e.g. used by the native protocol) can now use the full 64-bit range. 3rd party clients are advised to update their var-int code accordingly. [#51905](https://github.com/ClickHouse/ClickHouse/pull/51905) ([Robert Schulze](https://github.com/rschu1ze)). +* Update certificates when they change without the need to manually SYSTEM RELOAD CONFIG. [#52030](https://github.com/ClickHouse/ClickHouse/pull/52030) ([Mike Kot](https://github.com/myrrc)). +* Added `allow_create_index_without_type` setting that allow to ignore `ADD INDEX` queries without specified `TYPE`. Standard SQL queries will just succeed without changing table schema. [#52056](https://github.com/ClickHouse/ClickHouse/pull/52056) ([Ilya Yatsishin](https://github.com/qoega)). +* Log messages are written to the `system.text_log` from the server startup. [#52113](https://github.com/ClickHouse/ClickHouse/pull/52113) ([Dmitry Kardymon](https://github.com/kardymonds)). +* In cases where the HTTP endpoint has multiple IP addresses and the first of them is unreachable, a timeout exception was thrown. Made session creation with handling all resolved endpoints. [#52116](https://github.com/ClickHouse/ClickHouse/pull/52116) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Avro input format now supports Union even if it contains only a single type. Closes [#52131](https://github.com/ClickHouse/ClickHouse/issues/52131). [#52137](https://github.com/ClickHouse/ClickHouse/pull/52137) ([flynn](https://github.com/ucasfl)). +* Add setting `optimize_use_implicit_projections` to disable implicit projections (currently only `min_max_count` projection). [#52152](https://github.com/ClickHouse/ClickHouse/pull/52152) ([Amos Bird](https://github.com/amosbird)). +* It was possible to use the function `hasToken` for infinite loop. Now this possibility is removed. This closes [#52156](https://github.com/ClickHouse/ClickHouse/issues/52156). [#52160](https://github.com/ClickHouse/ClickHouse/pull/52160) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Create ZK ancestors optimistically. [#52195](https://github.com/ClickHouse/ClickHouse/pull/52195) ([Raúl Marín](https://github.com/Algunenano)). +* Fix [#50582](https://github.com/ClickHouse/ClickHouse/issues/50582). Avoid the `Not found column ... in block` error in some cases of reading in-order and constants. [#52259](https://github.com/ClickHouse/ClickHouse/pull/52259) ([Chen768959](https://github.com/Chen768959)). +* Check whether S2 geo primitives are invalid as early as possible on ClickHouse side. This closes: [#27090](https://github.com/ClickHouse/ClickHouse/issues/27090). [#52260](https://github.com/ClickHouse/ClickHouse/pull/52260) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add back missing projection QueryAccessInfo when `query_plan_optimize_projection = 1`. This fixes [#50183](https://github.com/ClickHouse/ClickHouse/issues/50183) . This fixes [#50093](https://github.com/ClickHouse/ClickHouse/issues/50093). [#52327](https://github.com/ClickHouse/ClickHouse/pull/52327) ([Amos Bird](https://github.com/amosbird)). +* When `ZooKeeperRetriesControl` rethrows an error, it's more useful to see its original stack trace, not the one from `ZooKeeperRetriesControl` itself. [#52347](https://github.com/ClickHouse/ClickHouse/pull/52347) ([Vitaly Baranov](https://github.com/vitlibar)). +* Wait for zero copy replication lock even if some disks don't support it. [#52376](https://github.com/ClickHouse/ClickHouse/pull/52376) ([Raúl Marín](https://github.com/Algunenano)). +* Now interserver port will be closed only after tables are shut down. [#52498](https://github.com/ClickHouse/ClickHouse/pull/52498) ([alesapin](https://github.com/alesapin)). + +#### Experimental Feature +* Writing parquet files is 10x faster, it's multi-threaded now. Almost the same speed as reading. [#49367](https://github.com/ClickHouse/ClickHouse/pull/49367) ([Michael Kolupaev](https://github.com/al13n321)). This is controlled by the setting `output_format_parquet_use_custom_encoder` which is disabled by default, because the feature is non-ideal. +* Added support for [PRQL](https://prql-lang.org/) as a query language. [#50686](https://github.com/ClickHouse/ClickHouse/pull/50686) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Allow to add disk name for custom disks. Previously custom disks would use an internal generated disk name. Now it will be possible with `disk = disk_(...)` (e.g. disk will have name `name`) . [#51552](https://github.com/ClickHouse/ClickHouse/pull/51552) ([Kseniia Sumarokova](https://github.com/kssenii)). This syntax can be changed in this release. +* (experimental MaterializedMySQL) Fixed crash when `mysqlxx::Pool::Entry` is used after it was disconnected. [#52063](https://github.com/ClickHouse/ClickHouse/pull/52063) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) `CREATE TABLE ... AS SELECT` .. is now supported in MaterializedMySQL. [#52067](https://github.com/ClickHouse/ClickHouse/pull/52067) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Introduced automatic conversion of text types to utf8 for MaterializedMySQL. [#52084](https://github.com/ClickHouse/ClickHouse/pull/52084) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Now unquoted UTF-8 strings are supported in DDL for MaterializedMySQL. [#52318](https://github.com/ClickHouse/ClickHouse/pull/52318) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Now double quoted comments are supported in MaterializedMySQL. [#52355](https://github.com/ClickHouse/ClickHouse/pull/52355) ([Val Doroshchuk](https://github.com/valbok)). +* Upgrade Intel QPL from v1.1.0 to v1.2.0 2. Upgrade Intel accel-config from v3.5 to v4.0 3. Fixed issue that Device IOTLB miss has big perf. impact for IAA accelerators. [#52180](https://github.com/ClickHouse/ClickHouse/pull/52180) ([jasperzhu](https://github.com/jinjunzh)). +* The `session_timezone` setting (new in version 23.6) is demoted to experimental. [#52445](https://github.com/ClickHouse/ClickHouse/pull/52445) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support ZooKeeper `reconfig` command for ClickHouse Keeper with incremental reconfiguration which can be enabled via `keeper_server.enable_reconfiguration` setting. Support adding servers, removing servers, and changing server priorities. [#49450](https://github.com/ClickHouse/ClickHouse/pull/49450) ([Mike Kot](https://github.com/myrrc)). It is suspected that this feature is incomplete. + +#### Build/Testing/Packaging Improvement +* Add experimental ClickHouse builds for Linux RISC-V 64 to CI. [#31398](https://github.com/ClickHouse/ClickHouse/pull/31398) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add integration test check with the enabled Analyzer. [#50926](https://github.com/ClickHouse/ClickHouse/pull/50926) [#52210](https://github.com/ClickHouse/ClickHouse/pull/52210) ([Dmitry Novik](https://github.com/novikd)). +* Reproducible builds for Rust. [#52395](https://github.com/ClickHouse/ClickHouse/pull/52395) ([Azat Khuzhin](https://github.com/azat)). +* Update Cargo dependencies. [#51721](https://github.com/ClickHouse/ClickHouse/pull/51721) ([Raúl Marín](https://github.com/Algunenano)). +* Make the function `CHColumnToArrowColumn::fillArrowArrayWithArrayColumnData` to work with nullable arrays, which are not possible in ClickHouse, but needed for Gluten. [#52112](https://github.com/ClickHouse/ClickHouse/pull/52112) ([李扬](https://github.com/taiyang-li)). +* We've updated the CCTZ library to master, but there are no user-visible changes. [#52124](https://github.com/ClickHouse/ClickHouse/pull/52124) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `system.licenses` table now includes the hard-forked library Poco. This closes [#52066](https://github.com/ClickHouse/ClickHouse/issues/52066). [#52127](https://github.com/ClickHouse/ClickHouse/pull/52127) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check that there are no cases of bad punctuation: whitespace before a comma like `Hello ,world` instead of `Hello, world`. [#52549](https://github.com/ClickHouse/ClickHouse/pull/52549) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix MaterializedPostgreSQL syncTables [#49698](https://github.com/ClickHouse/ClickHouse/pull/49698) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix projection with optimize_aggregators_of_group_by_keys [#49709](https://github.com/ClickHouse/ClickHouse/pull/49709) ([Amos Bird](https://github.com/amosbird)). +* Fix optimize_skip_unused_shards with JOINs [#51037](https://github.com/ClickHouse/ClickHouse/pull/51037) ([Azat Khuzhin](https://github.com/azat)). +* Fix formatDateTime() with fractional negative datetime64 [#51290](https://github.com/ClickHouse/ClickHouse/pull/51290) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Functions `hasToken*` were totally wrong. Add a test for [#43358](https://github.com/ClickHouse/ClickHouse/issues/43358) [#51378](https://github.com/ClickHouse/ClickHouse/pull/51378) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix optimization to move functions before sorting. [#51481](https://github.com/ClickHouse/ClickHouse/pull/51481) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix Block structure mismatch in Pipe::unitePipes for FINAL [#51492](https://github.com/ClickHouse/ClickHouse/pull/51492) ([Nikita Taranov](https://github.com/nickitat)). +* Fix SIGSEGV for clusters with zero weight across all shards (fixes INSERT INTO FUNCTION clusterAllReplicas()) [#51545](https://github.com/ClickHouse/ClickHouse/pull/51545) ([Azat Khuzhin](https://github.com/azat)). +* Fix timeout for hedged requests [#51582](https://github.com/ClickHouse/ClickHouse/pull/51582) ([Azat Khuzhin](https://github.com/azat)). +* Fix logical error in ANTI join with NULL [#51601](https://github.com/ClickHouse/ClickHouse/pull/51601) ([vdimir](https://github.com/vdimir)). +* Fix for moving 'IN' conditions to PREWHERE [#51610](https://github.com/ClickHouse/ClickHouse/pull/51610) ([Alexander Gololobov](https://github.com/davenger)). +* Do not apply PredicateExpressionsOptimizer for ASOF/ANTI join [#51633](https://github.com/ClickHouse/ClickHouse/pull/51633) ([vdimir](https://github.com/vdimir)). +* Fix async insert with deduplication for ReplicatedMergeTree using merging algorithms [#51676](https://github.com/ClickHouse/ClickHouse/pull/51676) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix reading from empty column in `parseSipHashKey` [#51804](https://github.com/ClickHouse/ClickHouse/pull/51804) ([Nikita Taranov](https://github.com/nickitat)). +* Fix segfault when create invalid EmbeddedRocksdb table [#51847](https://github.com/ClickHouse/ClickHouse/pull/51847) ([Duc Canh Le](https://github.com/canhld94)). +* Fix inserts into MongoDB tables [#51876](https://github.com/ClickHouse/ClickHouse/pull/51876) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix deadlock on DatabaseCatalog shutdown [#51908](https://github.com/ClickHouse/ClickHouse/pull/51908) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix error in subquery operators [#51922](https://github.com/ClickHouse/ClickHouse/pull/51922) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix async connect to hosts with multiple ips [#51934](https://github.com/ClickHouse/ClickHouse/pull/51934) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not remove inputs after ActionsDAG::merge [#51947](https://github.com/ClickHouse/ClickHouse/pull/51947) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Check refcount in `RemoveManyObjectStorageOperation::finalize` instead of `execute` [#51954](https://github.com/ClickHouse/ClickHouse/pull/51954) ([vdimir](https://github.com/vdimir)). +* Allow parametric UDFs [#51964](https://github.com/ClickHouse/ClickHouse/pull/51964) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Small fix for toDateTime64() for dates after 2283-12-31 [#52130](https://github.com/ClickHouse/ClickHouse/pull/52130) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix ORDER BY tuple of WINDOW functions [#52145](https://github.com/ClickHouse/ClickHouse/pull/52145) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect projection analysis when aggregation expression contains monotonic functions [#52151](https://github.com/ClickHouse/ClickHouse/pull/52151) ([Amos Bird](https://github.com/amosbird)). +* Fix error in `groupArrayMoving` functions [#52161](https://github.com/ClickHouse/ClickHouse/pull/52161) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable direct join for range dictionary [#52187](https://github.com/ClickHouse/ClickHouse/pull/52187) ([Duc Canh Le](https://github.com/canhld94)). +* Fix sticky mutations test (and extremely rare race condition) [#52197](https://github.com/ClickHouse/ClickHouse/pull/52197) ([alesapin](https://github.com/alesapin)). +* Fix race in Web disk [#52211](https://github.com/ClickHouse/ClickHouse/pull/52211) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix data race in Connection::setAsyncCallback on unknown packet from server [#52219](https://github.com/ClickHouse/ClickHouse/pull/52219) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix temp data deletion on startup, add test [#52275](https://github.com/ClickHouse/ClickHouse/pull/52275) ([vdimir](https://github.com/vdimir)). +* Don't use minmax_count projections when counting nullable columns [#52297](https://github.com/ClickHouse/ClickHouse/pull/52297) ([Amos Bird](https://github.com/amosbird)). +* MergeTree/ReplicatedMergeTree should use server timezone for log entries [#52325](https://github.com/ClickHouse/ClickHouse/pull/52325) ([Azat Khuzhin](https://github.com/azat)). +* Fix parameterized view with cte and multiple usage [#52328](https://github.com/ClickHouse/ClickHouse/pull/52328) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Disable expression templates for time intervals [#52335](https://github.com/ClickHouse/ClickHouse/pull/52335) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix `apply_snapshot` in Keeper [#52358](https://github.com/ClickHouse/ClickHouse/pull/52358) ([Antonio Andelic](https://github.com/antonio2368)). +* Update build-osx.md [#52377](https://github.com/ClickHouse/ClickHouse/pull/52377) ([AlexBykovski](https://github.com/AlexBykovski)). +* Fix `countSubstrings` hang with empty needle and a column haystack [#52409](https://github.com/ClickHouse/ClickHouse/pull/52409) ([Sergei Trifonov](https://github.com/serxa)). +* Fix normal projection with merge table [#52432](https://github.com/ClickHouse/ClickHouse/pull/52432) ([Amos Bird](https://github.com/amosbird)). +* Fix possible double-free in Aggregator [#52439](https://github.com/ClickHouse/ClickHouse/pull/52439) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed inserting into Buffer engine [#52440](https://github.com/ClickHouse/ClickHouse/pull/52440) ([Vasily Nemkov](https://github.com/Enmk)). +* The implementation of AnyHash was non-conformant. [#52448](https://github.com/ClickHouse/ClickHouse/pull/52448) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check recursion depth in OptimizedRegularExpression [#52451](https://github.com/ClickHouse/ClickHouse/pull/52451) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix data-race DatabaseReplicated::startupTables()/canExecuteReplicatedMetadataAlter() [#52490](https://github.com/ClickHouse/ClickHouse/pull/52490) ([Azat Khuzhin](https://github.com/azat)). +* Fix abort in function `transform` [#52513](https://github.com/ClickHouse/ClickHouse/pull/52513) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix lightweight delete after drop of projection [#52517](https://github.com/ClickHouse/ClickHouse/pull/52517) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible error "Cannot drain connections: cancel first" [#52585](https://github.com/ClickHouse/ClickHouse/pull/52585) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release 23.6, 2023-06-29 {#236} + +#### Backward Incompatible Change +* Delete feature `do_not_evict_index_and_mark_files` in the fs cache. This feature was only making things worse. [#51253](https://github.com/ClickHouse/ClickHouse/pull/51253) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove ALTER support for experimental LIVE VIEW. [#51287](https://github.com/ClickHouse/ClickHouse/pull/51287) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Decrease the default values for `http_max_field_value_size` and `http_max_field_name_size` to 128 KiB. [#51163](https://github.com/ClickHouse/ClickHouse/pull/51163) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* CGroups metrics related to CPU are replaced with one metric, `CGroupMaxCPU` for better usability. The `Normalized` CPU usage metrics will be normalized to CGroups limits instead of the total number of CPUs when they are set. This closes [#50836](https://github.com/ClickHouse/ClickHouse/issues/50836). [#50835](https://github.com/ClickHouse/ClickHouse/pull/50835) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* The function `transform` as well as `CASE` with value matching started to support all data types. This closes [#29730](https://github.com/ClickHouse/ClickHouse/issues/29730). This closes [#32387](https://github.com/ClickHouse/ClickHouse/issues/32387). This closes [#50827](https://github.com/ClickHouse/ClickHouse/issues/50827). This closes [#31336](https://github.com/ClickHouse/ClickHouse/issues/31336). This closes [#40493](https://github.com/ClickHouse/ClickHouse/issues/40493). [#51351](https://github.com/ClickHouse/ClickHouse/pull/51351) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added option `--rename_files_after_processing `. This closes [#34207](https://github.com/ClickHouse/ClickHouse/issues/34207). [#49626](https://github.com/ClickHouse/ClickHouse/pull/49626) ([alekseygolub](https://github.com/alekseygolub)). +* Add support for `TRUNCATE` modifier in `INTO OUTFILE` clause. Suggest using `APPEND` or `TRUNCATE` for `INTO OUTFILE` when file exists. [#50950](https://github.com/ClickHouse/ClickHouse/pull/50950) ([alekar](https://github.com/alekar)). +* Add table engine `Redis` and table function `redis`. It allows querying external Redis servers. [#50150](https://github.com/ClickHouse/ClickHouse/pull/50150) ([JackyWoo](https://github.com/JackyWoo)). +* Allow to skip empty files in file/s3/url/hdfs table functions using settings `s3_skip_empty_files`, `hdfs_skip_empty_files`, `engine_file_skip_empty_files`, `engine_url_skip_empty_files`. [#50364](https://github.com/ClickHouse/ClickHouse/pull/50364) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new setting named `use_mysql_types_in_show_columns` to alter the `SHOW COLUMNS` SQL statement to display MySQL equivalent types when a client is connected via the MySQL compatibility port. [#49577](https://github.com/ClickHouse/ClickHouse/pull/49577) ([Thomas Panetti](https://github.com/tpanetti)). +* Clickhouse-client can now be called with a connection string instead of "--host", "--port", "--user" etc. [#50689](https://github.com/ClickHouse/ClickHouse/pull/50689) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add setting `session_timezone`; it is used as the default timezone for a session when not explicitly specified. [#44149](https://github.com/ClickHouse/ClickHouse/pull/44149) ([Andrey Zvonov](https://github.com/zvonand)). +* Codec DEFLATE_QPL is now controlled via server setting "enable_deflate_qpl_codec" (default: false) instead of setting "allow_experimental_codecs". This marks DEFLATE_QPL non-experimental. [#50775](https://github.com/ClickHouse/ClickHouse/pull/50775) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Improved scheduling of merge selecting and cleanup tasks in `ReplicatedMergeTree`. The tasks will not be executed too frequently when there's nothing to merge or cleanup. Added settings `max_merge_selecting_sleep_ms`, `merge_selecting_sleep_slowdown_factor`, `max_cleanup_delay_period` and `cleanup_thread_preferred_points_per_iteration`. It should close [#31919](https://github.com/ClickHouse/ClickHouse/issues/31919). [#50107](https://github.com/ClickHouse/ClickHouse/pull/50107) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Make filter push down through cross join. [#50605](https://github.com/ClickHouse/ClickHouse/pull/50605) ([Han Fei](https://github.com/hanfei1991)). +* Improve performance with enabled QueryProfiler using thread-local timer_id instead of global object. [#48778](https://github.com/ClickHouse/ClickHouse/pull/48778) ([Jiebin Sun](https://github.com/jiebinn)). +* Rewrite CapnProto input/output format to improve its performance. Map column names and CapnProto fields case insensitive, fix reading/writing of nested structure fields. [#49752](https://github.com/ClickHouse/ClickHouse/pull/49752) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimize parquet write performance for parallel threads. [#50102](https://github.com/ClickHouse/ClickHouse/pull/50102) ([Hongbin Ma](https://github.com/binmahone)). +* Disable `parallelize_output_from_storages` for processing MATERIALIZED VIEWs and storages with one block only. [#50214](https://github.com/ClickHouse/ClickHouse/pull/50214) ([Azat Khuzhin](https://github.com/azat)). +* Merge PR [#46558](https://github.com/ClickHouse/ClickHouse/pull/46558). Avoid block permutation during sort if the block is already sorted. [#50697](https://github.com/ClickHouse/ClickHouse/pull/50697) ([Alexey Milovidov](https://github.com/alexey-milovidov), [Maksim Kita](https://github.com/kitaisreal)). +* Make multiple list requests to ZooKeeper in parallel to speed up reading from system.zookeeper table. [#51042](https://github.com/ClickHouse/ClickHouse/pull/51042) ([Alexander Gololobov](https://github.com/davenger)). +* Speedup initialization of DateTime lookup tables for time zones. This should reduce startup/connect time of clickhouse-client especially in debug build as it is rather heavy. [#51347](https://github.com/ClickHouse/ClickHouse/pull/51347) ([Alexander Gololobov](https://github.com/davenger)). +* Fix data lakes slowness because of synchronous head requests. (Related to Iceberg/Deltalake/Hudi being slow with a lot of files). [#50976](https://github.com/ClickHouse/ClickHouse/pull/50976) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Do not read all the columns from right GLOBAL JOIN table. [#50721](https://github.com/ClickHouse/ClickHouse/pull/50721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Experimental Feature +* Support parallel replicas with the analyzer. [#50441](https://github.com/ClickHouse/ClickHouse/pull/50441) ([Raúl Marín](https://github.com/Algunenano)). +* Add random sleep before large merges/mutations execution to split load more evenly between replicas in case of zero-copy replication. [#51282](https://github.com/ClickHouse/ClickHouse/pull/51282) ([alesapin](https://github.com/alesapin)). +* Do not replicate `ALTER PARTITION` queries and mutations through `Replicated` database if it has only one shard and the underlying table is `ReplicatedMergeTree`. [#51049](https://github.com/ClickHouse/ClickHouse/pull/51049) ([Alexander Tokmakov](https://github.com/tavplubix)). + +#### Improvement +* Relax the thresholds for "too many parts" to be more modern. Return the backpressure during long-running insert queries. [#50856](https://github.com/ClickHouse/ClickHouse/pull/50856) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow to cast IPv6 to IPv4 address for CIDR ::ffff:0:0/96 (IPv4-mapped addresses). [#49759](https://github.com/ClickHouse/ClickHouse/pull/49759) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Update MongoDB protocol to support MongoDB 5.1 version and newer. Support for the versions with the old protocol (<3.6) is preserved. Closes [#45621](https://github.com/ClickHouse/ClickHouse/issues/45621), [#49879](https://github.com/ClickHouse/ClickHouse/issues/49879). [#50061](https://github.com/ClickHouse/ClickHouse/pull/50061) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add setting `input_format_max_bytes_to_read_for_schema_inference` to limit the number of bytes to read in schema inference. Closes [#50577](https://github.com/ClickHouse/ClickHouse/issues/50577). [#50592](https://github.com/ClickHouse/ClickHouse/pull/50592) ([Kruglov Pavel](https://github.com/Avogar)). +* Respect setting `input_format_null_as_default` in schema inference. [#50602](https://github.com/ClickHouse/ClickHouse/pull/50602) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to skip trailing empty lines in CSV/TSV/CustomSeparated formats via settings `input_format_csv_skip_trailing_empty_lines`, `input_format_tsv_skip_trailing_empty_lines` and `input_format_custom_skip_trailing_empty_lines` (disabled by default). Closes [#49315](https://github.com/ClickHouse/ClickHouse/issues/49315). [#50635](https://github.com/ClickHouse/ClickHouse/pull/50635) ([Kruglov Pavel](https://github.com/Avogar)). +* Functions "toDateOrDefault|OrNull" and "accuateCast[OrDefault|OrNull]" now correctly parse numeric arguments. [#50709](https://github.com/ClickHouse/ClickHouse/pull/50709) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Support CSV with whitespace or `\t` field delimiters, and these delimiters are supported in Spark. [#50712](https://github.com/ClickHouse/ClickHouse/pull/50712) ([KevinyhZou](https://github.com/KevinyhZou)). +* Settings `number_of_mutations_to_delay` and `number_of_mutations_to_throw` are enabled by default now with values 500 and 1000 respectively. [#50726](https://github.com/ClickHouse/ClickHouse/pull/50726) ([Anton Popov](https://github.com/CurtizJ)). +* The dashboard correctly shows missing values. This closes [#50831](https://github.com/ClickHouse/ClickHouse/issues/50831). [#50832](https://github.com/ClickHouse/ClickHouse/pull/50832) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added the possibility to use date and time arguments in the syslog timestamp format in functions `parseDateTimeBestEffort*` and `parseDateTime64BestEffort*`. [#50925](https://github.com/ClickHouse/ClickHouse/pull/50925) ([Victor Krasnov](https://github.com/sirvickr)). +* Command line parameter "--password" in clickhouse-client can now be specified only once. [#50966](https://github.com/ClickHouse/ClickHouse/pull/50966) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Use `hash_of_all_files` from `system.parts` to check identity of parts during on-cluster backups. [#50997](https://github.com/ClickHouse/ClickHouse/pull/50997) ([Vitaly Baranov](https://github.com/vitlibar)). +* The system table zookeeper_connection connected_time identifies the time when the connection is established (standard format), and session_uptime_elapsed_seconds is added, which labels the duration of the established connection session (in seconds). [#51026](https://github.com/ClickHouse/ClickHouse/pull/51026) ([郭小龙](https://github.com/guoxiaolongzte)). +* Improve the progress bar for file/s3/hdfs/url table functions by using chunk size from source data and using incremental total size counting in each thread. Fix the progress bar for *Cluster functions. This closes [#47250](https://github.com/ClickHouse/ClickHouse/issues/47250). [#51088](https://github.com/ClickHouse/ClickHouse/pull/51088) ([Kruglov Pavel](https://github.com/Avogar)). +* Add total_bytes_to_read to the Progress packet in TCP protocol for better Progress bar. [#51158](https://github.com/ClickHouse/ClickHouse/pull/51158) ([Kruglov Pavel](https://github.com/Avogar)). +* Better checking of data parts on disks with filesystem cache. [#51164](https://github.com/ClickHouse/ClickHouse/pull/51164) ([Anton Popov](https://github.com/CurtizJ)). +* Fix sometimes not correct current_elements_num in fs cache. [#51242](https://github.com/ClickHouse/ClickHouse/pull/51242) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Add embedded keeper-client to standalone keeper binary. [#50964](https://github.com/ClickHouse/ClickHouse/pull/50964) ([pufit](https://github.com/pufit)). +* Actual LZ4 version is used now. [#50621](https://github.com/ClickHouse/ClickHouse/pull/50621) ([Nikita Taranov](https://github.com/nickitat)). +* ClickHouse server will print the list of changed settings on fatal errors. This closes [#51137](https://github.com/ClickHouse/ClickHouse/issues/51137). [#51138](https://github.com/ClickHouse/ClickHouse/pull/51138) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow building ClickHouse with clang-17. [#51300](https://github.com/ClickHouse/ClickHouse/pull/51300) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* [SQLancer](https://github.com/sqlancer/sqlancer) check is considered stable as bugs that were triggered by it are fixed. Now failures of SQLancer check will be reported as failed check status. [#51340](https://github.com/ClickHouse/ClickHouse/pull/51340) ([Ilya Yatsishin](https://github.com/qoega)). +* Split huge `RUN` in Dockerfile into smaller conditional. Install the necessary tools on demand in the same `RUN` layer, and remove them after that. Upgrade the OS only once at the beginning. Use a modern way to check the signed repository. Downgrade the base repo to ubuntu:20.04 to address the issues on older docker versions. Upgrade golang version to address golang vulnerabilities. [#51504](https://github.com/ClickHouse/ClickHouse/pull/51504) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Report loading status for executable dictionaries correctly [#48775](https://github.com/ClickHouse/ClickHouse/pull/48775) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Proper mutation of skip indices and projections [#50104](https://github.com/ClickHouse/ClickHouse/pull/50104) ([Amos Bird](https://github.com/amosbird)). +* Cleanup moving parts [#50489](https://github.com/ClickHouse/ClickHouse/pull/50489) ([vdimir](https://github.com/vdimir)). +* Fix backward compatibility for IP types hashing in aggregate functions [#50551](https://github.com/ClickHouse/ClickHouse/pull/50551) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix Log family table return wrong rows count after truncate [#50585](https://github.com/ClickHouse/ClickHouse/pull/50585) ([flynn](https://github.com/ucasfl)). +* Fix bug in `uniqExact` parallel merging [#50590](https://github.com/ClickHouse/ClickHouse/pull/50590) ([Nikita Taranov](https://github.com/nickitat)). +* Revert recent grace hash join changes [#50699](https://github.com/ClickHouse/ClickHouse/pull/50699) ([vdimir](https://github.com/vdimir)). +* Query Cache: Try to fix bad cast from `ColumnConst` to `ColumnVector` [#50704](https://github.com/ClickHouse/ClickHouse/pull/50704) ([Robert Schulze](https://github.com/rschu1ze)). +* Avoid storing logs in Keeper containing unknown operation [#50751](https://github.com/ClickHouse/ClickHouse/pull/50751) ([Antonio Andelic](https://github.com/antonio2368)). +* SummingMergeTree support for DateTime64 [#50797](https://github.com/ClickHouse/ClickHouse/pull/50797) ([Jordi Villar](https://github.com/jrdi)). +* Add compatibility setting for non-const timezones [#50834](https://github.com/ClickHouse/ClickHouse/pull/50834) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix hashing of LDAP params in the cache entries [#50865](https://github.com/ClickHouse/ClickHouse/pull/50865) ([Julian Maicher](https://github.com/jmaicher)). +* Fallback to parsing big integer from String instead of exception in Parquet format [#50873](https://github.com/ClickHouse/ClickHouse/pull/50873) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix checking the lock file too often while writing a backup [#50889](https://github.com/ClickHouse/ClickHouse/pull/50889) ([Vitaly Baranov](https://github.com/vitlibar)). +* Do not apply projection if read-in-order was enabled. [#50923](https://github.com/ClickHouse/ClickHouse/pull/50923) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race in the Azure blob storage iterator [#50936](https://github.com/ClickHouse/ClickHouse/pull/50936) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix erroneous `sort_description` propagation in `CreatingSets` [#50955](https://github.com/ClickHouse/ClickHouse/pull/50955) ([Nikita Taranov](https://github.com/nickitat)). +* Fix Iceberg v2 optional metadata parsing [#50974](https://github.com/ClickHouse/ClickHouse/pull/50974) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializedMySQL: Keep parentheses for empty table overrides [#50977](https://github.com/ClickHouse/ClickHouse/pull/50977) ([Val Doroshchuk](https://github.com/valbok)). +* Fix crash in BackupCoordinationStageSync::setError() [#51012](https://github.com/ClickHouse/ClickHouse/pull/51012) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix subtly broken copy-on-write of ColumnLowCardinality dictionary [#51064](https://github.com/ClickHouse/ClickHouse/pull/51064) ([Michael Kolupaev](https://github.com/al13n321)). +* Generate safe IVs [#51086](https://github.com/ClickHouse/ClickHouse/pull/51086) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix ineffective query cache for SELECTs with subqueries [#51132](https://github.com/ClickHouse/ClickHouse/pull/51132) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix Set index with constant nullable comparison. [#51205](https://github.com/ClickHouse/ClickHouse/pull/51205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a crash in s3 and s3Cluster functions [#51209](https://github.com/ClickHouse/ClickHouse/pull/51209) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix a crash with compiled expressions [#51231](https://github.com/ClickHouse/ClickHouse/pull/51231) ([LiuNeng](https://github.com/liuneng1994)). +* Fix use-after-free in StorageURL when switching URLs [#51260](https://github.com/ClickHouse/ClickHouse/pull/51260) ([Michael Kolupaev](https://github.com/al13n321)). +* Updated check for parameterized view [#51272](https://github.com/ClickHouse/ClickHouse/pull/51272) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix multiple writing of same file to backup [#51299](https://github.com/ClickHouse/ClickHouse/pull/51299) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix fuzzer failure in ActionsDAG [#51301](https://github.com/ClickHouse/ClickHouse/pull/51301) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove garbage from function `transform` [#51350](https://github.com/ClickHouse/ClickHouse/pull/51350) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release 23.5, 2023-06-08 {#235} + +#### Upgrade Notes +* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `` section of the server configuration file. **Upgrade notes:** If you upgrade from versions prior to 22.9, you should either upgrade all replicas at once or disable the compression before upgrade, or upgrade through an intermediate version, where the compressed marks are supported but not enabled by default, such as 23.3. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make local object storage work consistently with s3 object storage, fix problem with append (closes [#48465](https://github.com/ClickHouse/ClickHouse/issues/48465)), make it configurable as independent storage. The change is backward incompatible because the cache on top of local object storage is not compatible to previous versions. [#48791](https://github.com/ClickHouse/ClickHouse/pull/48791) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The experimental feature "in-memory data parts" is removed. The data format is still supported, but the settings are no-op, and compact or wide parts will be used instead. This closes [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). [#49429](https://github.com/ClickHouse/ClickHouse/pull/49429) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Changed default values of settings `parallelize_output_from_storages` and `input_format_parquet_preserve_order`. This allows ClickHouse to reorder rows when reading from files (e.g. CSV or Parquet), greatly improving performance in many cases. To restore the old behavior of preserving order, use `parallelize_output_from_storages = 0`, `input_format_parquet_preserve_order = 1`. [#49479](https://github.com/ClickHouse/ClickHouse/pull/49479) ([Michael Kolupaev](https://github.com/al13n321)). +* Make projections production-ready. Add the `optimize_use_projections` setting to control whether the projections will be selected for SELECT queries. The setting `allow_experimental_projection_optimization` is obsolete and does nothing. [#49719](https://github.com/ClickHouse/ClickHouse/pull/49719) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Mark `joinGet` as non-deterministic (so as `dictGet`). It allows using them in mutations without an extra setting. [#49843](https://github.com/ClickHouse/ClickHouse/pull/49843) ([Azat Khuzhin](https://github.com/azat)). +* Revert the "`groupArray` returns cannot be nullable" change (due to binary compatibility breakage for `groupArray`/`groupArrayLast`/`groupArraySample` over `Nullable` types, which likely will lead to `TOO_LARGE_ARRAY_SIZE` or `CANNOT_READ_ALL_DATA`). [#49971](https://github.com/ClickHouse/ClickHouse/pull/49971) ([Azat Khuzhin](https://github.com/azat)). +* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. If you update from version prior to 22.12, we recommend to set this flag to `false` until update is finished. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)). + +#### New Feature +* Added storage engine AzureBlobStorage and azureBlobStorage table function. The supported set of features is very similar to storage/table function S3 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) ([alesapin](https://github.com/alesapin)) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni). +* Added native ClickHouse Keeper CLI Client, it is available as `clickhouse keeper-client` [#47414](https://github.com/ClickHouse/ClickHouse/pull/47414) ([pufit](https://github.com/pufit)). +* Add `urlCluster` table function. Refactor all *Cluster table functions to reduce code duplication. Make schema inference work for all possible *Cluster function signatures and for named collections. Closes [#38499](https://github.com/ClickHouse/ClickHouse/issues/38499). [#45427](https://github.com/ClickHouse/ClickHouse/pull/45427) ([attack204](https://github.com/attack204)), Pavel Kruglov. +* The query cache can now be used for production workloads. [#47977](https://github.com/ClickHouse/ClickHouse/pull/47977) ([Robert Schulze](https://github.com/rschu1ze)). The query cache can now support queries with totals and extremes modifier. [#48853](https://github.com/ClickHouse/ClickHouse/pull/48853) ([Robert Schulze](https://github.com/rschu1ze)). Make `allow_experimental_query_cache` setting as obsolete for backward-compatibility. It was removed in https://github.com/ClickHouse/ClickHouse/pull/47977. [#49934](https://github.com/ClickHouse/ClickHouse/pull/49934) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Geographical data types (`Point`, `Ring`, `Polygon`, and `MultiPolygon`) are production-ready. [#50022](https://github.com/ClickHouse/ClickHouse/pull/50022) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add schema inference to PostgreSQL, MySQL, MeiliSearch, and SQLite table engines. Closes [#49972](https://github.com/ClickHouse/ClickHouse/issues/49972). [#50000](https://github.com/ClickHouse/ClickHouse/pull/50000) ([Nikolay Degterinsky](https://github.com/evillique)). +* Password type in queries like `CREATE USER u IDENTIFIED BY 'p'` will be automatically set according to the setting `default_password_type` in the `config.xml` on the server. Closes [#42915](https://github.com/ClickHouse/ClickHouse/issues/42915). [#44674](https://github.com/ClickHouse/ClickHouse/pull/44674) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add bcrypt password authentication type. Closes [#34599](https://github.com/ClickHouse/ClickHouse/issues/34599). [#44905](https://github.com/ClickHouse/ClickHouse/pull/44905) ([Nikolay Degterinsky](https://github.com/evillique)). +* Introduces new keyword `INTO OUTFILE 'file.txt' APPEND`. [#48880](https://github.com/ClickHouse/ClickHouse/pull/48880) ([alekar](https://github.com/alekar)). +* Added `system.zookeeper_connection` table that shows information about Keeper connections. [#45245](https://github.com/ClickHouse/ClickHouse/pull/45245) ([mateng915](https://github.com/mateng0915)). +* Add new function `generateRandomStructure` that generates random table structure. It can be used in combination with table function `generateRandom`. [#47409](https://github.com/ClickHouse/ClickHouse/pull/47409) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow the use of `CASE` without an `ELSE` branch and extended `transform` to deal with more types. Also fix some issues that made transform() return incorrect results when decimal types were mixed with other numeric types. [#48300](https://github.com/ClickHouse/ClickHouse/pull/48300) ([Salvatore Mesoraca](https://github.com/aiven-sal)). This closes #2655. This closes #9596. This closes #38666. +* Added [server-side encryption using KMS keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) with S3 tables, and the `header` setting with S3 disks. Closes [#48723](https://github.com/ClickHouse/ClickHouse/issues/48723). [#48724](https://github.com/ClickHouse/ClickHouse/pull/48724) ([Johann Gan](https://github.com/johanngan)). +* Add MemoryTracker for the background tasks (merges and mutation). Introduces `merges_mutations_memory_usage_soft_limit` and `merges_mutations_memory_usage_to_ram_ratio` settings that represent the soft memory limit for merges and mutations. If this limit is reached ClickHouse won't schedule new merge or mutation tasks. Also `MergesMutationsMemoryTracking` metric is introduced to allow observing current memory usage of background tasks. Resubmit [#46089](https://github.com/ClickHouse/ClickHouse/issues/46089). Closes [#48774](https://github.com/ClickHouse/ClickHouse/issues/48774). [#48787](https://github.com/ClickHouse/ClickHouse/pull/48787) ([Dmitry Novik](https://github.com/novikd)). +* Function `dotProduct` work for array. [#49050](https://github.com/ClickHouse/ClickHouse/pull/49050) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Support statement `SHOW INDEX` to improve compatibility with MySQL. [#49158](https://github.com/ClickHouse/ClickHouse/pull/49158) ([Robert Schulze](https://github.com/rschu1ze)). +* Add virtual column `_file` and `_path` support to table function `url`. - Improve error message for table function `url`. - resolves [#49231](https://github.com/ClickHouse/ClickHouse/issues/49231) - resolves [#49232](https://github.com/ClickHouse/ClickHouse/issues/49232). [#49356](https://github.com/ClickHouse/ClickHouse/pull/49356) ([Ziyi Tan](https://github.com/Ziy1-Tan)). +* Adding the `grants` field in the users.xml file, which allows specifying grants for users. [#49381](https://github.com/ClickHouse/ClickHouse/pull/49381) ([pufit](https://github.com/pufit)). +* Support full/right join by using grace hash join algorithm. [#49483](https://github.com/ClickHouse/ClickHouse/pull/49483) ([lgbo](https://github.com/lgbo-ustc)). +* `WITH FILL` modifier groups filling by sorting prefix. Controlled by `use_with_fill_by_sorting_prefix` setting (enabled by default). Related to [#33203](https://github.com/ClickHouse/ClickHouse/issues/33203)#issuecomment-1418736794. [#49503](https://github.com/ClickHouse/ClickHouse/pull/49503) ([Igor Nikonov](https://github.com/devcrafter)). +* Clickhouse-client now accepts queries after "--multiquery" when "--query" (or "-q") is absent. example: clickhouse-client --multiquery "select 1; select 2;". [#49870](https://github.com/ClickHouse/ClickHouse/pull/49870) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Add separate `handshake_timeout` for receiving Hello packet from replica. Closes [#48854](https://github.com/ClickHouse/ClickHouse/issues/48854). [#49948](https://github.com/ClickHouse/ClickHouse/pull/49948) ([Kruglov Pavel](https://github.com/Avogar)). +* Added a function "space" which repeats a space as many times as specified. [#50103](https://github.com/ClickHouse/ClickHouse/pull/50103) ([Robert Schulze](https://github.com/rschu1ze)). +* Added --input_format_csv_trim_whitespaces option. [#50215](https://github.com/ClickHouse/ClickHouse/pull/50215) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Allow the `dictGetAll` function for regexp tree dictionaries to return values from multiple matches as arrays. Closes [#50254](https://github.com/ClickHouse/ClickHouse/issues/50254). [#50255](https://github.com/ClickHouse/ClickHouse/pull/50255) ([Johann Gan](https://github.com/johanngan)). +* Added `toLastDayOfWeek` function to round a date or a date with time up to the nearest Saturday or Sunday. [#50315](https://github.com/ClickHouse/ClickHouse/pull/50315) ([Victor Krasnov](https://github.com/sirvickr)). +* Ability to ignore a skip index by specifying `ignore_data_skipping_indices`. [#50329](https://github.com/ClickHouse/ClickHouse/pull/50329) ([Boris Kuschel](https://github.com/bkuschel)). +* Add `system.user_processes` table and `SHOW USER PROCESSES` query to show memory info and ProfileEvents on user level. [#50492](https://github.com/ClickHouse/ClickHouse/pull/50492) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Add server and format settings `display_secrets_in_show_and_select` for displaying secrets of tables, databases, table functions, and dictionaries. Add privilege `displaySecretsInShowAndSelect` controlling which users can view secrets. [#46528](https://github.com/ClickHouse/ClickHouse/pull/46528) ([Mike Kot](https://github.com/myrrc)). +* Allow to set up a ROW POLICY for all tables that belong to a DATABASE. [#47640](https://github.com/ClickHouse/ClickHouse/pull/47640) ([Ilya Golshtein](https://github.com/ilejn)). + +#### Performance Improvement +* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `` section of the server configuration file. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* New setting s3_max_inflight_parts_for_one_file sets the limit of concurrently loaded parts with multipart upload request in scope of one file. [#49961](https://github.com/ClickHouse/ClickHouse/pull/49961) ([Sema Checherinda](https://github.com/CheSema)). +* When reading from multiple files reduce parallel parsing threads for each file. Resolves [#42192](https://github.com/ClickHouse/ClickHouse/issues/42192). [#46661](https://github.com/ClickHouse/ClickHouse/pull/46661) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Use aggregate projection only if it reads fewer granules than normal reading. It should help in case if query hits the PK of the table, but not the projection. Fixes [#49150](https://github.com/ClickHouse/ClickHouse/issues/49150). [#49417](https://github.com/ClickHouse/ClickHouse/pull/49417) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not store blocks in `ANY` hash join if nothing is inserted. [#48633](https://github.com/ClickHouse/ClickHouse/pull/48633) ([vdimir](https://github.com/vdimir)). +* Fixes aggregate combinator `-If` when JIT compiled, and enable JIT compilation for aggregate functions. Closes [#48120](https://github.com/ClickHouse/ClickHouse/issues/48120). [#49083](https://github.com/ClickHouse/ClickHouse/pull/49083) ([Igor Nikonov](https://github.com/devcrafter)). +* For reading from remote tables we use smaller tasks (instead of reading the whole part) to make tasks stealing work * task size is determined by size of columns to read * always use 1mb buffers for reading from s3 * boundaries of cache segments aligned to 1mb so they have decent size even with small tasks. it also should prevent fragmentation. [#49287](https://github.com/ClickHouse/ClickHouse/pull/49287) ([Nikita Taranov](https://github.com/nickitat)). +* Introduced settings: - `merge_max_block_size_bytes` to limit the amount of memory used for background operations. - `vertical_merge_algorithm_min_bytes_to_activate` to add another condition to activate vertical merges. [#49313](https://github.com/ClickHouse/ClickHouse/pull/49313) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Default size of a read buffer for reading from local filesystem changed to a slightly better value. Also two new settings are introduced: `max_read_buffer_size_local_fs` and `max_read_buffer_size_remote_fs`. [#49321](https://github.com/ClickHouse/ClickHouse/pull/49321) ([Nikita Taranov](https://github.com/nickitat)). +* Improve memory usage and speed of `SPARSE_HASHED`/`HASHED` dictionaries (e.g. `SPARSE_HASHED` now eats 2.6x less memory, and is ~2x faster). [#49380](https://github.com/ClickHouse/ClickHouse/pull/49380) ([Azat Khuzhin](https://github.com/azat)). +* Optimize the `system.query_log` and `system.query_thread_log` tables by applying `LowCardinality` when appropriate. The queries over these tables will be faster. [#49530](https://github.com/ClickHouse/ClickHouse/pull/49530) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better performance when reading local `Parquet` files (through parallel reading). [#49539](https://github.com/ClickHouse/ClickHouse/pull/49539) ([Michael Kolupaev](https://github.com/al13n321)). +* Improve the performance of `RIGHT/FULL JOIN` by up to 2 times in certain scenarios, especially when joining a small left table with a large right table. [#49585](https://github.com/ClickHouse/ClickHouse/pull/49585) ([lgbo](https://github.com/lgbo-ustc)). +* Improve performance of BLAKE3 by 11% by enabling LTO for Rust. [#49600](https://github.com/ClickHouse/ClickHouse/pull/49600) ([Azat Khuzhin](https://github.com/azat)). Now it is on par with C++. +* Optimize the structure of the `system.opentelemetry_span_log`. Use `LowCardinality` where appropriate. Although this table is generally stupid (it is using the Map data type even for common attributes), it will be slightly better. [#49647](https://github.com/ClickHouse/ClickHouse/pull/49647) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Try to reserve hash table's size in `grace_hash` join. [#49816](https://github.com/ClickHouse/ClickHouse/pull/49816) ([lgbo](https://github.com/lgbo-ustc)). +* Parallel merge of `uniqExactIf` states. Closes [#49885](https://github.com/ClickHouse/ClickHouse/issues/49885). [#50285](https://github.com/ClickHouse/ClickHouse/pull/50285) ([flynn](https://github.com/ucasfl)). +* Keeper improvement: add `CheckNotExists` request to Keeper, which allows to improve the performance of Replicated tables. [#48897](https://github.com/ClickHouse/ClickHouse/pull/48897) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper performance improvements: avoid serializing same request twice while processing. Cache deserialization results of large requests. Controlled by new coordination setting `min_request_size_for_cache`. [#49004](https://github.com/ClickHouse/ClickHouse/pull/49004) ([Antonio Andelic](https://github.com/antonio2368)). +* Reduced number of `List` ZooKeeper requests when selecting parts to merge and a lot of partitions do not have anything to merge. [#49637](https://github.com/ClickHouse/ClickHouse/pull/49637) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Rework locking in the FS cache [#44985](https://github.com/ClickHouse/ClickHouse/pull/44985) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable pure parallel replicas if trivial count optimization is possible. [#50594](https://github.com/ClickHouse/ClickHouse/pull/50594) ([Raúl Marín](https://github.com/Algunenano)). +* Don't send head request for all keys in Iceberg schema inference, only for keys that are used for reaing data. [#50203](https://github.com/ClickHouse/ClickHouse/pull/50203) ([Kruglov Pavel](https://github.com/Avogar)). +* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)). + +#### Experimental Feature +* `DEFLATE_QPL` codec lower the minimum simd version to SSE 4.2. [doc change in qpl](https://github.com/intel/qpl/commit/3f8f5cea27739f5261e8fd577dc233ffe88bf679) - Intel® QPL relies on a run-time kernels dispatcher and cpuid check to choose the best available implementation(sse/avx2/avx512) - restructured cmakefile for qpl build in clickhouse to align with latest upstream qpl. [#49811](https://github.com/ClickHouse/ClickHouse/pull/49811) ([jasperzhu](https://github.com/jinjunzh)). +* Add initial support to do JOINs with pure parallel replicas. [#49544](https://github.com/ClickHouse/ClickHouse/pull/49544) ([Raúl Marín](https://github.com/Algunenano)). +* More parallelism on `Outdated` parts removal with "zero-copy replication". [#49630](https://github.com/ClickHouse/ClickHouse/pull/49630) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Parallel Replicas: 1) Fixed an error `NOT_FOUND_COLUMN_IN_BLOCK` in case of using parallel replicas with non-replicated storage with disabled setting `parallel_replicas_for_non_replicated_merge_tree` 2) Now `allow_experimental_parallel_reading_from_replicas` have 3 possible values - 0, 1 and 2. 0 - disabled, 1 - enabled, silently disable them in case of failure (in case of FINAL or JOIN), 2 - enabled, throw an exception in case of failure. 3) If FINAL modifier is used in SELECT query and parallel replicas are enabled, ClickHouse will try to disable them if `allow_experimental_parallel_reading_from_replicas` is set to 1 and throw an exception otherwise. [#50195](https://github.com/ClickHouse/ClickHouse/pull/50195) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* When parallel replicas are enabled they will always skip unavailable servers (the behavior is controlled by the setting `skip_unavailable_shards`, enabled by default and can be only disabled). This closes: [#48565](https://github.com/ClickHouse/ClickHouse/issues/48565). [#50293](https://github.com/ClickHouse/ClickHouse/pull/50293) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Improvement +* The `BACKUP` command will not decrypt data from encrypted disks while making a backup. Instead the data will be stored in a backup in encrypted form. Such backups can be restored only to an encrypted disk with the same (or extended) list of encryption keys. [#48896](https://github.com/ClickHouse/ClickHouse/pull/48896) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added possibility to use temporary tables in FROM part of ATTACH PARTITION FROM and REPLACE PARTITION FROM. [#49436](https://github.com/ClickHouse/ClickHouse/pull/49436) ([Roman Vasin](https://github.com/rvasin)). +* Added setting `async_insert` for `MergeTree` tables. It has the same meaning as query-level setting `async_insert` and enables asynchronous inserts for specific table. Note: it doesn't take effect for insert queries from `clickhouse-client`, use query-level setting in that case. [#49122](https://github.com/ClickHouse/ClickHouse/pull/49122) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for size suffixes in quota creation statement parameters. [#49087](https://github.com/ClickHouse/ClickHouse/pull/49087) ([Eridanus](https://github.com/Eridanus117)). +* Extend `first_value` and `last_value` to accept NULL. [#46467](https://github.com/ClickHouse/ClickHouse/pull/46467) ([lgbo](https://github.com/lgbo-ustc)). +* Add alias `str_to_map` and `mapFromString` for `extractKeyValuePairs`. closes https://github.com/clickhouse/clickhouse/issues/47185. [#49466](https://github.com/ClickHouse/ClickHouse/pull/49466) ([flynn](https://github.com/ucasfl)). +* Add support for CGroup version 2 for asynchronous metrics about the memory usage and availability. This closes [#37983](https://github.com/ClickHouse/ClickHouse/issues/37983). [#45999](https://github.com/ClickHouse/ClickHouse/pull/45999) ([sichenzhao](https://github.com/sichenzhao)). +* Cluster table functions should always skip unavailable shards. close [#46314](https://github.com/ClickHouse/ClickHouse/issues/46314). [#46765](https://github.com/ClickHouse/ClickHouse/pull/46765) ([zk_kiger](https://github.com/zk-kiger)). +* Allow CSV file to contain empty columns in its header. [#47496](https://github.com/ClickHouse/ClickHouse/pull/47496) ([你不要过来啊](https://github.com/iiiuwioajdks)). +* Add Google Cloud Storage S3 compatible table function `gcs`. Like the `oss` and `cosn` functions, it is just an alias over the `s3` table function, and it does not bring any new features. [#47815](https://github.com/ClickHouse/ClickHouse/pull/47815) ([Kuba Kaflik](https://github.com/jkaflik)). +* Add ability to use strict parts size for S3 (compatibility with CloudFlare R2 S3 Storage). [#48492](https://github.com/ClickHouse/ClickHouse/pull/48492) ([Azat Khuzhin](https://github.com/azat)). +* Added new columns with info about `Replicated` database replicas to `system.clusters`: `database_shard_name`, `database_replica_name`, `is_active`. Added an optional `FROM SHARD` clause to `SYSTEM DROP DATABASE REPLICA` query. [#48548](https://github.com/ClickHouse/ClickHouse/pull/48548) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add a new column `zookeeper_name` in system.replicas, to indicate on which (auxiliary) zookeeper cluster the replicated table's metadata is stored. [#48549](https://github.com/ClickHouse/ClickHouse/pull/48549) ([cangyin](https://github.com/cangyin)). +* `IN` operator support the comparison of `Date` and `Date32`. Closes [#48736](https://github.com/ClickHouse/ClickHouse/issues/48736). [#48806](https://github.com/ClickHouse/ClickHouse/pull/48806) ([flynn](https://github.com/ucasfl)). +* Support for erasure codes in `HDFS`, author: @M1eyu2018, @tomscut. [#48833](https://github.com/ClickHouse/ClickHouse/pull/48833) ([M1eyu](https://github.com/M1eyu2018)). +* Implement SYSTEM DROP REPLICA from auxiliary ZooKeeper clusters, may be close [#48931](https://github.com/ClickHouse/ClickHouse/issues/48931). [#48932](https://github.com/ClickHouse/ClickHouse/pull/48932) ([wangxiaobo](https://github.com/wzb5212)). +* Add Array data type to MongoDB. Closes [#48598](https://github.com/ClickHouse/ClickHouse/issues/48598). [#48983](https://github.com/ClickHouse/ClickHouse/pull/48983) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support storing `Interval` data types in tables. [#49085](https://github.com/ClickHouse/ClickHouse/pull/49085) ([larryluogit](https://github.com/larryluogit)). +* Allow using `ntile` window function without explicit window frame definition: `ntile(3) OVER (ORDER BY a)`, close [#46763](https://github.com/ClickHouse/ClickHouse/issues/46763). [#49093](https://github.com/ClickHouse/ClickHouse/pull/49093) ([vdimir](https://github.com/vdimir)). +* Added settings (`number_of_mutations_to_delay`, `number_of_mutations_to_throw`) to delay or throw `ALTER` queries that create mutations (`ALTER UPDATE`, `ALTER DELETE`, `ALTER MODIFY COLUMN`, ...) in case when table already has a lot of unfinished mutations. [#49117](https://github.com/ClickHouse/ClickHouse/pull/49117) ([Anton Popov](https://github.com/CurtizJ)). +* Catch exception from `create_directories` in filesystem cache. [#49203](https://github.com/ClickHouse/ClickHouse/pull/49203) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Copies embedded examples to a new field `example` in `system.functions` to supplement the field `description`. [#49222](https://github.com/ClickHouse/ClickHouse/pull/49222) ([Dan Roscigno](https://github.com/DanRoscigno)). +* Enable connection options for the MongoDB dictionary. Example: ``` xml localhost 27017 test dictionary_source ssl=true ``` ### Documentation entry for user-facing changes. [#49225](https://github.com/ClickHouse/ClickHouse/pull/49225) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Added an alias `asymptotic` for `asymp` computational method for `kolmogorovSmirnovTest`. Improved documentation. [#49286](https://github.com/ClickHouse/ClickHouse/pull/49286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Aggregation function groupBitAnd/Or/Xor now work on signed integer data. This makes them consistent with the behavior of scalar functions bitAnd/Or/Xor. [#49292](https://github.com/ClickHouse/ClickHouse/pull/49292) ([exmy](https://github.com/exmy)). +* Split function-documentation into more fine-granular fields. [#49300](https://github.com/ClickHouse/ClickHouse/pull/49300) ([Robert Schulze](https://github.com/rschu1ze)). +* Use multiple threads shared between all tables within a server to load outdated data parts. The the size of the pool and its queue is controlled by `max_outdated_parts_loading_thread_pool_size` and `outdated_part_loading_thread_pool_queue_size` settings. [#49317](https://github.com/ClickHouse/ClickHouse/pull/49317) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't overestimate the size of processed data for `LowCardinality` columns when they share dictionaries between blocks. This closes [#49322](https://github.com/ClickHouse/ClickHouse/issues/49322). See also [#48745](https://github.com/ClickHouse/ClickHouse/issues/48745). [#49323](https://github.com/ClickHouse/ClickHouse/pull/49323) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Parquet writer now uses reasonable row group size when invoked through `OUTFILE`. [#49325](https://github.com/ClickHouse/ClickHouse/pull/49325) ([Michael Kolupaev](https://github.com/al13n321)). +* Allow restricted keywords like `ARRAY` as an alias if the alias is quoted. Closes [#49324](https://github.com/ClickHouse/ClickHouse/issues/49324). [#49360](https://github.com/ClickHouse/ClickHouse/pull/49360) ([Nikolay Degterinsky](https://github.com/evillique)). +* Data parts loading and deletion jobs were moved to shared server-wide pools instead of per-table pools. Pools sizes are controlled via settings `max_active_parts_loading_thread_pool_size`, `max_outdated_parts_loading_thread_pool_size` and `max_parts_cleaning_thread_pool_size` in top-level config. Table-level settings `max_part_loading_threads` and `max_part_removal_threads` became obsolete. [#49474](https://github.com/ClickHouse/ClickHouse/pull/49474) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow `?password=pass` in URL of the Play UI. Password is replaced in browser history. [#49505](https://github.com/ClickHouse/ClickHouse/pull/49505) ([Mike Kot](https://github.com/myrrc)). +* Allow reading zero-size objects from remote filesystems. (because empty files are not backup'd, so we might end up with zero blobs in metadata file). Closes [#49480](https://github.com/ClickHouse/ClickHouse/issues/49480). [#49519](https://github.com/ClickHouse/ClickHouse/pull/49519) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Attach thread MemoryTracker to `total_memory_tracker` after `ThreadGroup` detached. [#49527](https://github.com/ClickHouse/ClickHouse/pull/49527) ([Dmitry Novik](https://github.com/novikd)). +* Fix parameterized views when a query parameter is used multiple times in the query. [#49556](https://github.com/ClickHouse/ClickHouse/pull/49556) ([Azat Khuzhin](https://github.com/azat)). +* Release memory allocated for the last sent ProfileEvents snapshot in the context of a query. Followup [#47564](https://github.com/ClickHouse/ClickHouse/issues/47564). [#49561](https://github.com/ClickHouse/ClickHouse/pull/49561) ([Dmitry Novik](https://github.com/novikd)). +* Function "makeDate" now provides a MySQL-compatible overload (year & day of the year argument). [#49603](https://github.com/ClickHouse/ClickHouse/pull/49603) ([Robert Schulze](https://github.com/rschu1ze)). +* Support `dictionary` table function for `RegExpTreeDictionary`. [#49666](https://github.com/ClickHouse/ClickHouse/pull/49666) ([Han Fei](https://github.com/hanfei1991)). +* Added weighted fair IO scheduling policy. Added dynamic resource manager, which allows IO scheduling hierarchy to be updated in runtime w/o server restarts. [#49671](https://github.com/ClickHouse/ClickHouse/pull/49671) ([Sergei Trifonov](https://github.com/serxa)). +* Add compose request after multipart upload to GCS. This enables the usage of copy operation on objects uploaded with the multipart upload. It's recommended to set `s3_strict_upload_part_size` to some value because compose request can fail on objects created with parts of different sizes. [#49693](https://github.com/ClickHouse/ClickHouse/pull/49693) ([Antonio Andelic](https://github.com/antonio2368)). +* For the `extractKeyValuePairs` function: improve the "best-effort" parsing logic to accept `key_value_delimiter` as a valid part of the value. This also simplifies branching and might even speed up things a bit. [#49760](https://github.com/ClickHouse/ClickHouse/pull/49760) ([Arthur Passos](https://github.com/arthurpassos)). +* Add `initial_query_id` field for system.processors_profile_log [#49777](https://github.com/ClickHouse/ClickHouse/pull/49777) ([helifu](https://github.com/helifu)). +* System log tables can now have custom sorting keys. [#49778](https://github.com/ClickHouse/ClickHouse/pull/49778) ([helifu](https://github.com/helifu)). +* A new field `partitions` to `system.query_log` is used to indicate which partitions are participating in the calculation. [#49779](https://github.com/ClickHouse/ClickHouse/pull/49779) ([helifu](https://github.com/helifu)). +* Added `enable_the_endpoint_id_with_zookeeper_name_prefix` setting for `ReplicatedMergeTree` (disabled by default). When enabled, it adds ZooKeeper cluster name to table's interserver communication endpoint. It avoids `Duplicate interserver IO endpoint` errors when having replicated tables with the same path, but different auxiliary ZooKeepers. [#49780](https://github.com/ClickHouse/ClickHouse/pull/49780) ([helifu](https://github.com/helifu)). +* Add query parameters to `clickhouse-local`. Closes [#46561](https://github.com/ClickHouse/ClickHouse/issues/46561). [#49785](https://github.com/ClickHouse/ClickHouse/pull/49785) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow loading dictionaries and functions from YAML by default. In previous versions, it required editing the `dictionaries_config` or `user_defined_executable_functions_config` in the configuration file, as they expected `*.xml` files. [#49812](https://github.com/ClickHouse/ClickHouse/pull/49812) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The Kafka table engine now allows to use alias columns. [#49824](https://github.com/ClickHouse/ClickHouse/pull/49824) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Add setting to limit the max number of pairs produced by `extractKeyValuePairs`, a safeguard to avoid using way too much memory. [#49836](https://github.com/ClickHouse/ClickHouse/pull/49836) ([Arthur Passos](https://github.com/arthurpassos)). +* Add support for (an unusual) case where the arguments in the `IN` operator are single-element tuples. [#49844](https://github.com/ClickHouse/ClickHouse/pull/49844) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* `bitHammingDistance` function support `String` and `FixedString` data type. Closes [#48827](https://github.com/ClickHouse/ClickHouse/issues/48827). [#49858](https://github.com/ClickHouse/ClickHouse/pull/49858) ([flynn](https://github.com/ucasfl)). +* Fix timeout resetting errors in the client on OS X. [#49863](https://github.com/ClickHouse/ClickHouse/pull/49863) ([alekar](https://github.com/alekar)). +* Add support for big integers, such as UInt128, Int128, UInt256, and Int256 in the function `bitCount`. This enables Hamming distance over large bit masks for AI applications. [#49867](https://github.com/ClickHouse/ClickHouse/pull/49867) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fingerprints to be used instead of key IDs in encrypted disks. This simplifies the configuration of encrypted disks. [#49882](https://github.com/ClickHouse/ClickHouse/pull/49882) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add UUID data type to PostgreSQL. Closes [#49739](https://github.com/ClickHouse/ClickHouse/issues/49739). [#49894](https://github.com/ClickHouse/ClickHouse/pull/49894) ([Nikolay Degterinsky](https://github.com/evillique)). +* Function `toUnixTimestamp` now accepts `Date` and `Date32` arguments. [#49989](https://github.com/ClickHouse/ClickHouse/pull/49989) ([Victor Krasnov](https://github.com/sirvickr)). +* Charge only server memory for dictionaries. [#49995](https://github.com/ClickHouse/ClickHouse/pull/49995) ([Azat Khuzhin](https://github.com/azat)). +* The server will allow using the `SQL_*` settings such as `SQL_AUTO_IS_NULL` as no-ops for MySQL compatibility. This closes [#49927](https://github.com/ClickHouse/ClickHouse/issues/49927). [#50013](https://github.com/ClickHouse/ClickHouse/pull/50013) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preserve initial_query_id for ON CLUSTER queries, which is useful for introspection (under `distributed_ddl_entry_format_version=5`). [#50015](https://github.com/ClickHouse/ClickHouse/pull/50015) ([Azat Khuzhin](https://github.com/azat)). +* Preserve backward incompatibility for renamed settings by using aliases (`allow_experimental_projection_optimization` for `optimize_use_projections`, `allow_experimental_lightweight_delete` for `enable_lightweight_delete`). [#50044](https://github.com/ClickHouse/ClickHouse/pull/50044) ([Azat Khuzhin](https://github.com/azat)). +* Support passing FQDN through setting my_hostname to register cluster node in keeper. Add setting of invisible to support multi compute groups. A compute group as a cluster, is invisible to other compute groups. [#50186](https://github.com/ClickHouse/ClickHouse/pull/50186) ([Yangkuan Liu](https://github.com/LiuYangkuan)). +* Fix PostgreSQL reading all the data even though `LIMIT n` could be specified. [#50187](https://github.com/ClickHouse/ClickHouse/pull/50187) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add new profile events for queries with subqueries (`QueriesWithSubqueries`/`SelectQueriesWithSubqueries`/`InsertQueriesWithSubqueries`). [#50204](https://github.com/ClickHouse/ClickHouse/pull/50204) ([Azat Khuzhin](https://github.com/azat)). +* Adding the roles field in the users.xml file, which allows specifying roles with grants via a config file. [#50278](https://github.com/ClickHouse/ClickHouse/pull/50278) ([pufit](https://github.com/pufit)). +* Report `CGroupCpuCfsPeriod` and `CGroupCpuCfsQuota` in AsynchronousMetrics. - Respect cgroup v2 memory limits during server startup. [#50379](https://github.com/ClickHouse/ClickHouse/pull/50379) ([alekar](https://github.com/alekar)). +* Add a signal handler for SIGQUIT to work the same way as SIGINT. Closes [#50298](https://github.com/ClickHouse/ClickHouse/issues/50298). [#50435](https://github.com/ClickHouse/ClickHouse/pull/50435) ([Nikolay Degterinsky](https://github.com/evillique)). +* In case JSON parse fails due to the large size of the object output the last position to allow debugging. [#50474](https://github.com/ClickHouse/ClickHouse/pull/50474) ([Valentin Alexeev](https://github.com/valentinalexeev)). +* Support decimals with not fixed size. Closes [#49130](https://github.com/ClickHouse/ClickHouse/issues/49130). [#50586](https://github.com/ClickHouse/ClickHouse/pull/50586) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Build/Testing/Packaging Improvement +* New and improved `keeper-bench`. Everything can be customized from YAML/XML file: - request generator - each type of request generator can have a specific set of fields - multi requests can be generated just by doing the same under `multi` key - for each request or subrequest in multi a `weight` field can be defined to control distribution - define trees that need to be setup for a test run - hosts can be defined with all timeouts customizable and it's possible to control how many sessions to generate for each host - integers defined with `min_value` and `max_value` fields are random number generators. [#48547](https://github.com/ClickHouse/ClickHouse/pull/48547) ([Antonio Andelic](https://github.com/antonio2368)). +* Io_uring is not supported on macos, don't choose it when running tests on local to avoid occasional failures. [#49250](https://github.com/ClickHouse/ClickHouse/pull/49250) ([Frank Chen](https://github.com/FrankChen021)). +* Support named fault injection for testing. [#49361](https://github.com/ClickHouse/ClickHouse/pull/49361) ([Han Fei](https://github.com/hanfei1991)). +* Allow running ClickHouse in the OS where the `prctl` (process control) syscall is not available, such as AWS Lambda. [#49538](https://github.com/ClickHouse/ClickHouse/pull/49538) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue of build conflict between contrib/isa-l and isa-l in qpl [49296](https://github.com/ClickHouse/ClickHouse/issues/49296). [#49584](https://github.com/ClickHouse/ClickHouse/pull/49584) ([jasperzhu](https://github.com/jinjunzh)). +* Utilities are now only build if explicitly requested ("-DENABLE_UTILS=1") instead of by default, this reduces link times in typical development builds. [#49620](https://github.com/ClickHouse/ClickHouse/pull/49620) ([Robert Schulze](https://github.com/rschu1ze)). +* Pull build description of idxd-config into a separate CMake file to avoid accidental removal in future. [#49651](https://github.com/ClickHouse/ClickHouse/pull/49651) ([jasperzhu](https://github.com/jinjunzh)). +* Add CI check with an enabled analyzer in the master. Follow-up [#49562](https://github.com/ClickHouse/ClickHouse/issues/49562). [#49668](https://github.com/ClickHouse/ClickHouse/pull/49668) ([Dmitry Novik](https://github.com/novikd)). +* Switch to LLVM/clang 16. [#49678](https://github.com/ClickHouse/ClickHouse/pull/49678) ([Azat Khuzhin](https://github.com/azat)). +* Allow building ClickHouse with clang-17. [#49851](https://github.com/ClickHouse/ClickHouse/pull/49851) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#50410](https://github.com/ClickHouse/ClickHouse/pull/50410) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse is now easier to be integrated into other cmake projects. [#49991](https://github.com/ClickHouse/ClickHouse/pull/49991) ([Amos Bird](https://github.com/amosbird)). (Which is strongly discouraged - Alexey Milovidov). +* Fix strange additional QEMU logging after [#47151](https://github.com/ClickHouse/ClickHouse/issues/47151), see https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html. [#50442](https://github.com/ClickHouse/ClickHouse/pull/50442) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* ClickHouse can work on Linux RISC-V 6.1.22. This closes [#50456](https://github.com/ClickHouse/ClickHouse/issues/50456). [#50457](https://github.com/ClickHouse/ClickHouse/pull/50457) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bump internal protobuf to v3.18 (fixes bogus CVE-2022-1941). [#50400](https://github.com/ClickHouse/ClickHouse/pull/50400) ([Robert Schulze](https://github.com/rschu1ze)). +* Bump internal libxml2 to v2.10.4 (fixes bogus CVE-2023-28484 and bogus CVE-2023-29469). [#50402](https://github.com/ClickHouse/ClickHouse/pull/50402) ([Robert Schulze](https://github.com/rschu1ze)). +* Bump c-ares to v1.19.1 (bogus CVE-2023-32067, bogus CVE-2023-31130, bogus CVE-2023-31147). [#50403](https://github.com/ClickHouse/ClickHouse/pull/50403) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix bogus CVE-2022-2469 in libgsasl. [#50404](https://github.com/ClickHouse/ClickHouse/pull/50404) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* ActionsDAG: fix wrong optimization [#47584](https://github.com/ClickHouse/ClickHouse/pull/47584) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Correctly handle concurrent snapshots in Keeper [#48466](https://github.com/ClickHouse/ClickHouse/pull/48466) ([Antonio Andelic](https://github.com/antonio2368)). +* MergeTreeMarksLoader holds DataPart instead of DataPartStorage [#48515](https://github.com/ClickHouse/ClickHouse/pull/48515) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Sequence state fix [#48603](https://github.com/ClickHouse/ClickHouse/pull/48603) ([Ilya Golshtein](https://github.com/ilejn)). +* Back/Restore concurrency check on previous fails [#48726](https://github.com/ClickHouse/ClickHouse/pull/48726) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix Attaching a table with non-existent ZK path does not increase the ReadonlyReplica metric [#48954](https://github.com/ClickHouse/ClickHouse/pull/48954) ([wangxiaobo](https://github.com/wzb5212)). +* Fix possible terminate called for uncaught exception in some places [#49112](https://github.com/ClickHouse/ClickHouse/pull/49112) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix key not found error for queries with multiple StorageJoin [#49137](https://github.com/ClickHouse/ClickHouse/pull/49137) ([vdimir](https://github.com/vdimir)). +* Fix wrong query result when using nullable primary key [#49172](https://github.com/ClickHouse/ClickHouse/pull/49172) ([Duc Canh Le](https://github.com/canhld94)). +* Fix reinterpretAs*() on big endian machines [#49198](https://github.com/ClickHouse/ClickHouse/pull/49198) ([Suzy Wang](https://github.com/SuzyWangIBMer)). +* (Experimental zero-copy replication) Lock zero copy parts more atomically [#49211](https://github.com/ClickHouse/ClickHouse/pull/49211) ([alesapin](https://github.com/alesapin)). +* Fix race on Outdated parts loading [#49223](https://github.com/ClickHouse/ClickHouse/pull/49223) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix all key value is null and group use rollup return wrong answer [#49282](https://github.com/ClickHouse/ClickHouse/pull/49282) ([Shuai li](https://github.com/loneylee)). +* Fix calculating load_factor for HASHED dictionaries with SHARDS [#49319](https://github.com/ClickHouse/ClickHouse/pull/49319) ([Azat Khuzhin](https://github.com/azat)). +* Disallow configuring compression CODECs for alias columns [#49363](https://github.com/ClickHouse/ClickHouse/pull/49363) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Fix bug in removal of existing part directory [#49365](https://github.com/ClickHouse/ClickHouse/pull/49365) ([alesapin](https://github.com/alesapin)). +* Properly fix GCS when HMAC is used [#49390](https://github.com/ClickHouse/ClickHouse/pull/49390) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix fuzz bug when subquery set is not built when reading from remote() [#49425](https://github.com/ClickHouse/ClickHouse/pull/49425) ([Alexander Gololobov](https://github.com/davenger)). +* Invert `shutdown_wait_unfinished_queries` [#49427](https://github.com/ClickHouse/ClickHouse/pull/49427) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* (Experimental zero-copy replication) Fix another zero copy bug [#49473](https://github.com/ClickHouse/ClickHouse/pull/49473) ([alesapin](https://github.com/alesapin)). +* Fix postgres database setting [#49481](https://github.com/ClickHouse/ClickHouse/pull/49481) ([Mal Curtis](https://github.com/snikch)). +* Correctly handle `s3Cluster` arguments [#49490](https://github.com/ClickHouse/ClickHouse/pull/49490) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix bug in TraceCollector destructor. [#49508](https://github.com/ClickHouse/ClickHouse/pull/49508) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix AsynchronousReadIndirectBufferFromRemoteFS breaking on short seeks [#49525](https://github.com/ClickHouse/ClickHouse/pull/49525) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix dictionaries loading order [#49560](https://github.com/ClickHouse/ClickHouse/pull/49560) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Forbid the change of data type of Object('json') column [#49563](https://github.com/ClickHouse/ClickHouse/pull/49563) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix stress test (Logical error: Expected 7134 >= 11030) [#49623](https://github.com/ClickHouse/ClickHouse/pull/49623) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in DISTINCT [#49628](https://github.com/ClickHouse/ClickHouse/pull/49628) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix: DISTINCT in order with zero values in non-sorted columns [#49636](https://github.com/ClickHouse/ClickHouse/pull/49636) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix one-off error in big integers found by UBSan with fuzzer [#49645](https://github.com/ClickHouse/ClickHouse/pull/49645) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix reading from sparse columns after restart [#49660](https://github.com/ClickHouse/ClickHouse/pull/49660) ([Anton Popov](https://github.com/CurtizJ)). +* Fix assert in SpanHolder::finish() with fibers [#49673](https://github.com/ClickHouse/ClickHouse/pull/49673) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix short circuit functions and mutations with sparse arguments [#49716](https://github.com/ClickHouse/ClickHouse/pull/49716) ([Anton Popov](https://github.com/CurtizJ)). +* Fix writing appended files to incremental backups [#49725](https://github.com/ClickHouse/ClickHouse/pull/49725) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix "There is no physical column _row_exists in table" error occurring during lightweight delete mutation on a table with Object column. [#49737](https://github.com/ClickHouse/ClickHouse/pull/49737) ([Alexander Gololobov](https://github.com/davenger)). +* Fix msan issue in randomStringUTF8(uneven number) [#49750](https://github.com/ClickHouse/ClickHouse/pull/49750) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix aggregate function kolmogorovSmirnovTest [#49768](https://github.com/ClickHouse/ClickHouse/pull/49768) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Fix settings aliases in native protocol [#49776](https://github.com/ClickHouse/ClickHouse/pull/49776) ([Azat Khuzhin](https://github.com/azat)). +* Fix `arrayMap` with array of tuples with single argument [#49789](https://github.com/ClickHouse/ClickHouse/pull/49789) ([Anton Popov](https://github.com/CurtizJ)). +* Fix per-query IO/BACKUPs throttling settings [#49797](https://github.com/ClickHouse/ClickHouse/pull/49797) ([Azat Khuzhin](https://github.com/azat)). +* Fix setting NULL in profile definition [#49831](https://github.com/ClickHouse/ClickHouse/pull/49831) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a bug with projections and the aggregate_functions_null_for_empty setting (for query_plan_optimize_projection) [#49873](https://github.com/ClickHouse/ClickHouse/pull/49873) ([Amos Bird](https://github.com/amosbird)). +* Fix processing pending batch for Distributed async INSERT after restart [#49884](https://github.com/ClickHouse/ClickHouse/pull/49884) ([Azat Khuzhin](https://github.com/azat)). +* Fix assertion in CacheMetadata::doCleanup [#49914](https://github.com/ClickHouse/ClickHouse/pull/49914) ([Kseniia Sumarokova](https://github.com/kssenii)). +* fix `is_prefix` in OptimizeRegularExpression [#49919](https://github.com/ClickHouse/ClickHouse/pull/49919) ([Han Fei](https://github.com/hanfei1991)). +* Fix metrics `WriteBufferFromS3Bytes`, `WriteBufferFromS3Microseconds` and `WriteBufferFromS3RequestsErrors` [#49930](https://github.com/ClickHouse/ClickHouse/pull/49930) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Fix IPv6 encoding in protobuf [#49933](https://github.com/ClickHouse/ClickHouse/pull/49933) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix possible Logical error on bad Nullable parsing for text formats [#49960](https://github.com/ClickHouse/ClickHouse/pull/49960) ([Kruglov Pavel](https://github.com/Avogar)). +* Add setting output_format_parquet_compliant_nested_types to produce more compatible Parquet files [#50001](https://github.com/ClickHouse/ClickHouse/pull/50001) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix logical error in stress test "Not enough space to add ..." [#50021](https://github.com/ClickHouse/ClickHouse/pull/50021) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid deadlock when starting table in attach thread of `ReplicatedMergeTree` [#50026](https://github.com/ClickHouse/ClickHouse/pull/50026) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix assert in SpanHolder::finish() with fibers attempt 2 [#50034](https://github.com/ClickHouse/ClickHouse/pull/50034) ([Kruglov Pavel](https://github.com/Avogar)). +* Add proper escaping for DDL OpenTelemetry context serialization [#50045](https://github.com/ClickHouse/ClickHouse/pull/50045) ([Azat Khuzhin](https://github.com/azat)). +* Fix reporting broken projection parts [#50052](https://github.com/ClickHouse/ClickHouse/pull/50052) ([Amos Bird](https://github.com/amosbird)). +* JIT compilation not equals NaN fix [#50056](https://github.com/ClickHouse/ClickHouse/pull/50056) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crashing in case of Replicated database without arguments [#50058](https://github.com/ClickHouse/ClickHouse/pull/50058) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash with `multiIf` and constant condition and nullable arguments [#50123](https://github.com/ClickHouse/ClickHouse/pull/50123) ([Anton Popov](https://github.com/CurtizJ)). +* Fix invalid index analysis for date related keys [#50153](https://github.com/ClickHouse/ClickHouse/pull/50153) ([Amos Bird](https://github.com/amosbird)). +* do not allow modify order by when there are no order by cols [#50154](https://github.com/ClickHouse/ClickHouse/pull/50154) ([Han Fei](https://github.com/hanfei1991)). +* Fix broken index analysis when binary operator contains a null constant argument [#50177](https://github.com/ClickHouse/ClickHouse/pull/50177) ([Amos Bird](https://github.com/amosbird)). +* clickhouse-client: disallow usage of `--query` and `--queries-file` at the same time [#50210](https://github.com/ClickHouse/ClickHouse/pull/50210) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Fix UB for INTO OUTFILE extensions (APPEND / AND STDOUT) and WATCH EVENTS [#50216](https://github.com/ClickHouse/ClickHouse/pull/50216) ([Azat Khuzhin](https://github.com/azat)). +* Fix skipping spaces at end of row in CustomSeparatedIgnoreSpaces format [#50224](https://github.com/ClickHouse/ClickHouse/pull/50224) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix iceberg metadata parsing [#50232](https://github.com/ClickHouse/ClickHouse/pull/50232) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix nested distributed SELECT in WITH clause [#50234](https://github.com/ClickHouse/ClickHouse/pull/50234) ([Azat Khuzhin](https://github.com/azat)). +* Fix msan issue in keyed siphash [#50245](https://github.com/ClickHouse/ClickHouse/pull/50245) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix bugs in Poco sockets in non-blocking mode, use true non-blocking sockets [#50252](https://github.com/ClickHouse/ClickHouse/pull/50252) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix checksum calculation for backup entries [#50264](https://github.com/ClickHouse/ClickHouse/pull/50264) ([Vitaly Baranov](https://github.com/vitlibar)). +* Comparison functions NaN fix [#50287](https://github.com/ClickHouse/ClickHouse/pull/50287) ([Maksim Kita](https://github.com/kitaisreal)). +* JIT aggregation nullable key fix [#50291](https://github.com/ClickHouse/ClickHouse/pull/50291) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix clickhouse-local crashing when writing empty Arrow or Parquet output [#50328](https://github.com/ClickHouse/ClickHouse/pull/50328) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix crash when Pool::Entry::disconnect() is called [#50334](https://github.com/ClickHouse/ClickHouse/pull/50334) ([Val Doroshchuk](https://github.com/valbok)). +* Improved fetch part by holding directory lock longer [#50339](https://github.com/ClickHouse/ClickHouse/pull/50339) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix bitShift* functions with both constant arguments [#50343](https://github.com/ClickHouse/ClickHouse/pull/50343) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Keeper deadlock on exception when preprocessing requests. [#50387](https://github.com/ClickHouse/ClickHouse/pull/50387) ([frinkr](https://github.com/frinkr)). +* Fix hashing of const integer values [#50421](https://github.com/ClickHouse/ClickHouse/pull/50421) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek for data skipping indexes [#50432](https://github.com/ClickHouse/ClickHouse/pull/50432) ([Azat Khuzhin](https://github.com/azat)). +* Limit the number of in-flight tasks for loading outdated parts [#50450](https://github.com/ClickHouse/ClickHouse/pull/50450) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Keeper fix: apply uncommitted state after snapshot install [#50483](https://github.com/ClickHouse/ClickHouse/pull/50483) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix incorrect constant folding [#50536](https://github.com/ClickHouse/ClickHouse/pull/50536) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix logical error in stress test (Not enough space to add ...) [#50583](https://github.com/ClickHouse/ClickHouse/pull/50583) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix converting Null to LowCardinality(Nullable) in values table function [#50637](https://github.com/ClickHouse/ClickHouse/pull/50637) ([Kruglov Pavel](https://github.com/Avogar)). +* Revert invalid RegExpTreeDictionary optimization [#50642](https://github.com/ClickHouse/ClickHouse/pull/50642) ([Johann Gan](https://github.com/johanngan)). + +### ClickHouse release 23.4, 2023-04-26 {#234} + +#### Backward Incompatible Change +* Formatter '%M' in function formatDateTime() now prints the month name instead of the minutes. This makes the behavior consistent with MySQL. The previous behavior can be restored using setting "formatdatetime_parsedatetime_m_is_month_name = 0". [#47246](https://github.com/ClickHouse/ClickHouse/pull/47246) ([Robert Schulze](https://github.com/rschu1ze)). +* This change makes sense only if you are using the virtual filesystem cache. If `path` in the virtual filesystem cache configuration is not empty and is not an absolute path, then it will be put in `/caches/`. [#48784](https://github.com/ClickHouse/ClickHouse/pull/48784) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Primary/secondary indices and sorting keys with identical expressions are now rejected. This behavior can be disabled using setting `allow_suspicious_indices`. [#48536](https://github.com/ClickHouse/ClickHouse/pull/48536) ([凌涛](https://github.com/lingtaolf)). + +#### New Feature +* Support new aggregate function `quantileGK`/`quantilesGK`, like [approx_percentile](https://spark.apache.org/docs/latest/api/sql/index.html#approx_percentile) in spark. Greenwald-Khanna algorithm refer to http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf. [#46428](https://github.com/ClickHouse/ClickHouse/pull/46428) ([李扬](https://github.com/taiyang-li)). +* Add a statement `SHOW COLUMNS` which shows distilled information from system.columns. [#48017](https://github.com/ClickHouse/ClickHouse/pull/48017) ([Robert Schulze](https://github.com/rschu1ze)). +* Added `LIGHTWEIGHT` and `PULL` modifiers for `SYSTEM SYNC REPLICA` query. `LIGHTWEIGHT` version waits for fetches and drop-ranges only (merges and mutations are ignored). `PULL` version pulls new entries from ZooKeeper and does not wait for them. Fixes [#47794](https://github.com/ClickHouse/ClickHouse/issues/47794). [#48085](https://github.com/ClickHouse/ClickHouse/pull/48085) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add `kafkaMurmurHash` function for compatibility with Kafka DefaultPartitioner. Closes [#47834](https://github.com/ClickHouse/ClickHouse/issues/47834). [#48185](https://github.com/ClickHouse/ClickHouse/pull/48185) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow to easily create a user with the same grants as the current user by using `GRANT CURRENT GRANTS`. [#48262](https://github.com/ClickHouse/ClickHouse/pull/48262) ([pufit](https://github.com/pufit)). +* Add statistical aggregate function `kolmogorovSmirnovTest`. Close [#48228](https://github.com/ClickHouse/ClickHouse/issues/48228). [#48325](https://github.com/ClickHouse/ClickHouse/pull/48325) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Added a `lost_part_count` column to the `system.replicas` table. The column value shows the total number of lost parts in the corresponding table. Value is stored in zookeeper and can be used instead of not persistent `ReplicatedDataLoss` profile event for monitoring. [#48526](https://github.com/ClickHouse/ClickHouse/pull/48526) ([Sergei Trifonov](https://github.com/serxa)). +* Add `soundex` function for compatibility. Closes [#39880](https://github.com/ClickHouse/ClickHouse/issues/39880). [#48567](https://github.com/ClickHouse/ClickHouse/pull/48567) ([FriendLey](https://github.com/FriendLey)). +* Support `Map` type for JSONExtract. [#48629](https://github.com/ClickHouse/ClickHouse/pull/48629) ([李扬](https://github.com/taiyang-li)). +* Add `PrettyJSONEachRow` format to output pretty JSON with new line delimiters and 4 space indents. [#48898](https://github.com/ClickHouse/ClickHouse/pull/48898) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `ParquetMetadata` input format to read Parquet file metadata. [#48911](https://github.com/ClickHouse/ClickHouse/pull/48911) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `extractKeyValuePairs` function to extract key value pairs from strings. Input strings might contain noise (i.e. log files / do not need to be 100% formatted in key-value-pair format), the algorithm will look for key value pairs matching the arguments passed to the function. As of now, function accepts the following arguments: `data_column` (mandatory), `key_value_pair_delimiter` (defaults to `:`), `pair_delimiters` (defaults to `\space \, \;`) and `quoting_character` (defaults to double quotes). [#43606](https://github.com/ClickHouse/ClickHouse/pull/43606) ([Arthur Passos](https://github.com/arthurpassos)). +* Functions replaceOne(), replaceAll(), replaceRegexpOne() and replaceRegexpAll() can now be called with non-const pattern and replacement arguments. [#46589](https://github.com/ClickHouse/ClickHouse/pull/46589) ([Robert Schulze](https://github.com/rschu1ze)). +* Added functions to work with columns of type `Map`: `mapConcat`, `mapSort`, `mapExists`. [#48071](https://github.com/ClickHouse/ClickHouse/pull/48071) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement +* Reading files in `Parquet` format is now much faster. IO and decoding are parallelized (controlled by `max_threads` setting), and only required data ranges are read. [#47964](https://github.com/ClickHouse/ClickHouse/pull/47964) ([Michael Kolupaev](https://github.com/al13n321)). +* If we run a mutation with IN (subquery) like this: `ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table)` and the table `t` has multiple parts than for each part a set for subquery `SELECT id FROM huge_table` is built in memory. And if there are many parts then this might consume a lot of memory (and lead to an OOM) and CPU. The solution is to introduce a short-lived cache of sets that are currently being built by mutation tasks. If another task of the same mutation is executed concurrently it can look up the set in the cache, wait for it to be built and reuse it. [#46835](https://github.com/ClickHouse/ClickHouse/pull/46835) ([Alexander Gololobov](https://github.com/davenger)). +* Only check dependencies if necessary when applying `ALTER TABLE` queries. [#48062](https://github.com/ClickHouse/ClickHouse/pull/48062) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize function `mapUpdate`. [#48118](https://github.com/ClickHouse/ClickHouse/pull/48118) ([Anton Popov](https://github.com/CurtizJ)). +* Now an internal query to local replica is sent explicitly and data from it received through loopback interface. Setting `prefer_localhost_replica` is not respected for parallel replicas. This is needed for better scheduling and makes the code cleaner: the initiator is only responsible for coordinating of the reading process and merging results, continuously answering for requests while all the secondary queries read the data. Note: Using loopback interface is not so performant, otherwise some replicas could starve for tasks which could lead to even slower query execution and not utilizing all possible resources. The initialization of the coordinator is now even more lazy. All incoming requests contain the information about the reading algorithm we initialize the coordinator with it when first request comes. If any replica decides to read with a different algorithm–an exception will be thrown and a query will be aborted. [#48246](https://github.com/ClickHouse/ClickHouse/pull/48246) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do not build set for the right side of `IN` clause with subquery when it is used only for analysis of skip indexes, and they are disabled by setting (`use_skip_indexes=0`). Previously it might affect the performance of queries. [#48299](https://github.com/ClickHouse/ClickHouse/pull/48299) ([Anton Popov](https://github.com/CurtizJ)). +* Query processing is parallelized right after reading `FROM file(...)`. Related to [#38755](https://github.com/ClickHouse/ClickHouse/issues/38755). [#48525](https://github.com/ClickHouse/ClickHouse/pull/48525) ([Igor Nikonov](https://github.com/devcrafter)). Query processing is parallelized right after reading from any data source. Affected data sources are mostly simple or external storages like table functions `url`, `file`. [#48727](https://github.com/ClickHouse/ClickHouse/pull/48727) ([Igor Nikonov](https://github.com/devcrafter)). This is controlled by the setting `parallelize_output_from_storages` which is not enabled by default. +* Lowered contention of ThreadPool mutex (may increase performance for a huge amount of small jobs). [#48750](https://github.com/ClickHouse/ClickHouse/pull/48750) ([Sergei Trifonov](https://github.com/serxa)). +* Reduce memory usage for multiple `ALTER DELETE` mutations. [#48522](https://github.com/ClickHouse/ClickHouse/pull/48522) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove the excessive connection attempts if the `skip_unavailable_shards` setting is enabled. [#48771](https://github.com/ClickHouse/ClickHouse/pull/48771) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature +* Entries in the query cache are now squashed to max_block_size and compressed. [#45912](https://github.com/ClickHouse/ClickHouse/pull/45912) ([Robert Schulze](https://github.com/rschu1ze)). +* It is now possible to define per-user quotas in the query cache. [#48284](https://github.com/ClickHouse/ClickHouse/pull/48284) ([Robert Schulze](https://github.com/rschu1ze)). +* Some fixes for parallel replicas [#48433](https://github.com/ClickHouse/ClickHouse/pull/48433) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implement zero-copy-replication (an experimental feature) on encrypted disks. [#48741](https://github.com/ClickHouse/ClickHouse/pull/48741) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement +* Increase default value for `connect_timeout_with_failover_ms` to 1000 ms (because of adding async connections in https://github.com/ClickHouse/ClickHouse/pull/47229) . Closes [#5188](https://github.com/ClickHouse/ClickHouse/issues/5188). [#49009](https://github.com/ClickHouse/ClickHouse/pull/49009) ([Kruglov Pavel](https://github.com/Avogar)). +* Several improvements around data lakes: - Make `Iceberg` work with non-partitioned data. - Support `Iceberg` format version v2 (previously only v1 was supported) - Support reading partitioned data for `DeltaLake`/`Hudi` - Faster reading of `DeltaLake` metadata by using Delta's checkpoint files - Fixed incorrect `Hudi` reads: previously it incorrectly chose which data to read and therefore was able to read correctly only small size tables - Made these engines to pickup updates of changed data (previously the state was set on table creation) - Make proper testing for `Iceberg`/`DeltaLake`/`Hudi` using spark. [#47307](https://github.com/ClickHouse/ClickHouse/pull/47307) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add async connection to socket and async writing to socket. Make creating connections and sending query/external tables async across shards. Refactor code with fibers. Closes [#46931](https://github.com/ClickHouse/ClickHouse/issues/46931). We will be able to increase `connect_timeout_with_failover_ms` by default after this PR (https://github.com/ClickHouse/ClickHouse/issues/5188). [#47229](https://github.com/ClickHouse/ClickHouse/pull/47229) ([Kruglov Pavel](https://github.com/Avogar)). +* Support config sections `keeper`/`keeper_server` as an alternative to `zookeeper`. Close [#34766](https://github.com/ClickHouse/ClickHouse/issues/34766) , [#34767](https://github.com/ClickHouse/ClickHouse/issues/34767). [#35113](https://github.com/ClickHouse/ClickHouse/pull/35113) ([李扬](https://github.com/taiyang-li)). +* It is possible to set _secure_ flag in named_collections for a dictionary with a ClickHouse table source. Addresses [#38450](https://github.com/ClickHouse/ClickHouse/issues/38450) . [#46323](https://github.com/ClickHouse/ClickHouse/pull/46323) ([Ilya Golshtein](https://github.com/ilejn)). +* `bitCount` function support `FixedString` and `String` data type. [#49044](https://github.com/ClickHouse/ClickHouse/pull/49044) ([flynn](https://github.com/ucasfl)). +* Added configurable retries for all operations with [Zoo]Keeper for Backup queries. [#47224](https://github.com/ClickHouse/ClickHouse/pull/47224) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Enable `use_environment_credentials` for S3 by default, so the entire provider chain is constructed by default. [#47397](https://github.com/ClickHouse/ClickHouse/pull/47397) ([Antonio Andelic](https://github.com/antonio2368)). +* Currently, the JSON_VALUE function is similar as spark's get_json_object function, which support to get value from JSON string by a path like '$.key'. But still has something different - 1. in spark's get_json_object will return null while the path is not exist, but in JSON_VALUE will return empty string; - 2. in spark's get_json_object will return a complex type value, such as a JSON object/array value, but in JSON_VALUE will return empty string. [#47494](https://github.com/ClickHouse/ClickHouse/pull/47494) ([KevinyhZou](https://github.com/KevinyhZou)). +* For `use_structure_from_insertion_table_in_table_functions` more flexible insert table structure propagation to table function. Fixed an issue with name mapping and using virtual columns. No more need for 'auto' setting. [#47962](https://github.com/ClickHouse/ClickHouse/pull/47962) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Do not continue retrying to connect to Keeper if the query is killed or over limits. [#47985](https://github.com/ClickHouse/ClickHouse/pull/47985) ([Raúl Marín](https://github.com/Algunenano)). +* Support Enum output/input in `BSONEachRow`, allow all map key types and avoid extra calculations on output. [#48122](https://github.com/ClickHouse/ClickHouse/pull/48122) ([Kruglov Pavel](https://github.com/Avogar)). +* Support more ClickHouse types in `ORC`/`Arrow`/`Parquet` formats: Enum(8|16), (U)Int(128|256), Decimal256 (for ORC), allow reading IPv4 from Int32 values (ORC outputs IPv4 as Int32, and we couldn't read it back), fix reading Nullable(IPv6) from binary data for `ORC`. [#48126](https://github.com/ClickHouse/ClickHouse/pull/48126) ([Kruglov Pavel](https://github.com/Avogar)). +* Add columns `perform_ttl_move_on_insert`, `load_balancing` for table `system.storage_policies`, modify column `volume_type` type to `Enum8`. [#48167](https://github.com/ClickHouse/ClickHouse/pull/48167) ([lizhuoyu5](https://github.com/lzydmxy)). +* Added support for `BACKUP ALL` command which backups all tables and databases, including temporary and system ones. [#48189](https://github.com/ClickHouse/ClickHouse/pull/48189) ([Vitaly Baranov](https://github.com/vitlibar)). +* Function mapFromArrays supports `Map` type as an input. [#48207](https://github.com/ClickHouse/ClickHouse/pull/48207) ([李扬](https://github.com/taiyang-li)). +* The output of some SHOW PROCESSLIST is now sorted. [#48241](https://github.com/ClickHouse/ClickHouse/pull/48241) ([Robert Schulze](https://github.com/rschu1ze)). +* Per-query/per-server throttling for remote IO/local IO/BACKUPs (server settings: `max_remote_read_network_bandwidth_for_server`, `max_remote_write_network_bandwidth_for_server`, `max_local_read_bandwidth_for_server`, `max_local_write_bandwidth_for_server`, `max_backup_bandwidth_for_server`, settings: `max_remote_read_network_bandwidth`, `max_remote_write_network_bandwidth`, `max_local_read_bandwidth`, `max_local_write_bandwidth`, `max_backup_bandwidth`). [#48242](https://github.com/ClickHouse/ClickHouse/pull/48242) ([Azat Khuzhin](https://github.com/azat)). +* Support more types in `CapnProto` format: Map, (U)Int(128|256), Decimal(128|256). Allow integer conversions during input/output. [#48257](https://github.com/ClickHouse/ClickHouse/pull/48257) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't throw CURRENT_WRITE_BUFFER_IS_EXHAUSTED for normal behaviour. [#48288](https://github.com/ClickHouse/ClickHouse/pull/48288) ([Raúl Marín](https://github.com/Algunenano)). +* Add new setting `keeper_map_strict_mode` which enforces extra guarantees on operations made on top of `KeeperMap` tables. [#48293](https://github.com/ClickHouse/ClickHouse/pull/48293) ([Antonio Andelic](https://github.com/antonio2368)). +* Check primary key type for simple dictionary is native unsigned integer type Add setting `check_dictionary_primary_key ` for compatibility(set `check_dictionary_primary_key =false` to disable checking). [#48335](https://github.com/ClickHouse/ClickHouse/pull/48335) ([lizhuoyu5](https://github.com/lzydmxy)). +* Don't replicate mutations for `KeeperMap` because it's unnecessary. [#48354](https://github.com/ClickHouse/ClickHouse/pull/48354) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow to write/read unnamed tuple as nested Message in Protobuf format. Tuple elements and Message fields are matched by position. [#48390](https://github.com/ClickHouse/ClickHouse/pull/48390) ([Kruglov Pavel](https://github.com/Avogar)). +* Support `additional_table_filters` and `additional_result_filter` settings in the new planner. Also, add a documentation entry for `additional_result_filter`. [#48405](https://github.com/ClickHouse/ClickHouse/pull/48405) ([Dmitry Novik](https://github.com/novikd)). +* `parseDateTime` now understands format string '%f' (fractional seconds). [#48420](https://github.com/ClickHouse/ClickHouse/pull/48420) ([Robert Schulze](https://github.com/rschu1ze)). +* Format string "%f" in formatDateTime() now prints "000000" if the formatted value has no fractional seconds, the previous behavior (single zero) can be restored using setting "formatdatetime_f_prints_single_zero = 1". [#48422](https://github.com/ClickHouse/ClickHouse/pull/48422) ([Robert Schulze](https://github.com/rschu1ze)). +* Don't replicate DELETE and TRUNCATE for KeeperMap. [#48434](https://github.com/ClickHouse/ClickHouse/pull/48434) ([Antonio Andelic](https://github.com/antonio2368)). +* Generate valid Decimals and Bools in generateRandom function. [#48436](https://github.com/ClickHouse/ClickHouse/pull/48436) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow trailing commas in expression list of SELECT query, for example `SELECT a, b, c, FROM table`. Closes [#37802](https://github.com/ClickHouse/ClickHouse/issues/37802). [#48438](https://github.com/ClickHouse/ClickHouse/pull/48438) ([Nikolay Degterinsky](https://github.com/evillique)). +* Override `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD` environment variables with `--user` and `--password` client parameters. Closes [#38909](https://github.com/ClickHouse/ClickHouse/issues/38909). [#48440](https://github.com/ClickHouse/ClickHouse/pull/48440) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added retries to loading of data parts in `MergeTree` tables in case of retryable errors. [#48442](https://github.com/ClickHouse/ClickHouse/pull/48442) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for `Date`, `Date32`, `DateTime`, `DateTime64` data types to `arrayMin`, `arrayMax`, `arrayDifference` functions. Closes [#21645](https://github.com/ClickHouse/ClickHouse/issues/21645). [#48445](https://github.com/ClickHouse/ClickHouse/pull/48445) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add support for `{server_uuid}` macro. It is useful for identifying replicas in autoscaled clusters when new replicas are constantly added and removed in runtime. This closes [#48554](https://github.com/ClickHouse/ClickHouse/issues/48554). [#48563](https://github.com/ClickHouse/ClickHouse/pull/48563) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The installation script will create a hard link instead of copying if it is possible. [#48578](https://github.com/ClickHouse/ClickHouse/pull/48578) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support `SHOW TABLE` syntax meaning the same as `SHOW CREATE TABLE`. Closes [#48580](https://github.com/ClickHouse/ClickHouse/issues/48580). [#48591](https://github.com/ClickHouse/ClickHouse/pull/48591) ([flynn](https://github.com/ucasfl)). +* HTTP temporary buffers now support working by evicting data from the virtual filesystem cache. [#48664](https://github.com/ClickHouse/ClickHouse/pull/48664) ([Vladimir C](https://github.com/vdimir)). +* Make Schema inference works for `CREATE AS SELECT`. Closes [#47599](https://github.com/ClickHouse/ClickHouse/issues/47599). [#48679](https://github.com/ClickHouse/ClickHouse/pull/48679) ([flynn](https://github.com/ucasfl)). +* Added a `replicated_max_mutations_in_one_entry` setting for `ReplicatedMergeTree` that allows limiting the number of mutation commands per one `MUTATE_PART` entry (default is 10000). [#48731](https://github.com/ClickHouse/ClickHouse/pull/48731) ([Alexander Tokmakov](https://github.com/tavplubix)). +* In AggregateFunction types, don't count unused arena bytes as `read_bytes`. [#48745](https://github.com/ClickHouse/ClickHouse/pull/48745) ([Raúl Marín](https://github.com/Algunenano)). +* Fix some MySQL-related settings not being handled with the MySQL dictionary source + named collection. Closes [#48402](https://github.com/ClickHouse/ClickHouse/issues/48402). [#48759](https://github.com/ClickHouse/ClickHouse/pull/48759) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If a user set `max_single_part_upload_size` to a very large value, it can lead to a crash due to a bug in the AWS S3 SDK. This fixes [#47679](https://github.com/ClickHouse/ClickHouse/issues/47679). [#48816](https://github.com/ClickHouse/ClickHouse/pull/48816) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix data race in `RabbitMQ` ([report](https://pastila.nl/?004f7100/de1505289ab5bb355e67ebe6c7cc8707)), refactor the code. [#48845](https://github.com/ClickHouse/ClickHouse/pull/48845) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add aliases `name` and `part_name` form `system.parts` and `system.part_log`. Closes [#48718](https://github.com/ClickHouse/ClickHouse/issues/48718). [#48850](https://github.com/ClickHouse/ClickHouse/pull/48850) ([sichenzhao](https://github.com/sichenzhao)). +* Functions "arrayDifferenceSupport()", "arrayCumSum()" and "arrayCumSumNonNegative()" now support input arrays of wide integer types (U)Int128/256. [#48866](https://github.com/ClickHouse/ClickHouse/pull/48866) ([cluster](https://github.com/infdahai)). +* Multi-line history in clickhouse-client is now no longer padded. This makes pasting more natural. [#48870](https://github.com/ClickHouse/ClickHouse/pull/48870) ([Joanna Hulboj](https://github.com/jh0x)). +* Implement a slight improvement for the rare case when ClickHouse is run inside LXC and LXCFS is used. The LXCFS has an issue: sometimes it returns an error "Transport endpoint is not connected" on reading from the file inside `/proc`. This error was correctly logged into ClickHouse's server log. We have additionally workaround this issue by reopening a file. This is a minuscule change. [#48922](https://github.com/ClickHouse/ClickHouse/pull/48922) ([Real](https://github.com/RunningXie)). +* Improve memory accounting for prefetches. Randomise prefetch settings In CI. [#48973](https://github.com/ClickHouse/ClickHouse/pull/48973) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly set headers for native copy operations on GCS. [#48981](https://github.com/ClickHouse/ClickHouse/pull/48981) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for specifying setting names in the command line with dashes instead of underscores, for example, `--max-threads` instead of `--max_threads`. Additionally, support Unicode dash characters like `—` instead of `--` - this is useful when you communicate with a team in another company, and a manager from that team copy-pasted code from MS Word. [#48985](https://github.com/ClickHouse/ClickHouse/pull/48985) ([alekseygolub](https://github.com/alekseygolub)). +* Add fallback to password authentication when authentication with SSL user certificate has failed. Closes [#48974](https://github.com/ClickHouse/ClickHouse/issues/48974). [#48989](https://github.com/ClickHouse/ClickHouse/pull/48989) ([Nikolay Degterinsky](https://github.com/evillique)). +* Improve the embedded dashboard. Close [#46671](https://github.com/ClickHouse/ClickHouse/issues/46671). [#49036](https://github.com/ClickHouse/ClickHouse/pull/49036) ([Kevin Zhang](https://github.com/Kinzeng)). +* Add profile events for log messages, so you can easily see the count of log messages by severity. [#49042](https://github.com/ClickHouse/ClickHouse/pull/49042) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* In previous versions, the `LineAsString` format worked inconsistently when the parallel parsing was enabled or not, in presence of DOS or macOS Classic line breaks. This closes [#49039](https://github.com/ClickHouse/ClickHouse/issues/49039). [#49052](https://github.com/ClickHouse/ClickHouse/pull/49052) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The exception message about the unparsed query parameter will also tell about the name of the parameter. Reimplement [#48878](https://github.com/ClickHouse/ClickHouse/issues/48878). Close [#48772](https://github.com/ClickHouse/ClickHouse/issues/48772). [#49061](https://github.com/ClickHouse/ClickHouse/pull/49061) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Build/Testing/Packaging Improvement +* Update time zones. The following were updated: Africa/Cairo, Africa/Casablanca, Africa/El_Aaiun, America/Bogota, America/Cambridge_Bay, America/Ciudad_Juarez, America/Godthab, America/Inuvik, America/Iqaluit, America/Nuuk, America/Ojinaga, America/Pangnirtung, America/Rankin_Inlet, America/Resolute, America/Whitehorse, America/Yellowknife, Asia/Gaza, Asia/Hebron, Asia/Kuala_Lumpur, Asia/Singapore, Canada/Yukon, Egypt, Europe/Kirov, Europe/Volgograd, Singapore. [#48572](https://github.com/ClickHouse/ClickHouse/pull/48572) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Reduce the number of dependencies in the header files to speed up the build. [#47984](https://github.com/ClickHouse/ClickHouse/pull/47984) ([Dmitry Novik](https://github.com/novikd)). +* Randomize compression of marks and indices in tests. [#48286](https://github.com/ClickHouse/ClickHouse/pull/48286) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bump internal ZSTD from 1.5.4 to 1.5.5. [#46797](https://github.com/ClickHouse/ClickHouse/pull/46797) ([Robert Schulze](https://github.com/rschu1ze)). +* Randomize vertical merges from compact to wide parts in tests. [#48287](https://github.com/ClickHouse/ClickHouse/pull/48287) ([Raúl Marín](https://github.com/Algunenano)). +* Support for CRC32 checksum in HDFS. Fix performance issues. [#48614](https://github.com/ClickHouse/ClickHouse/pull/48614) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove remainders of GCC support. [#48671](https://github.com/ClickHouse/ClickHouse/pull/48671) ([Robert Schulze](https://github.com/rschu1ze)). +* Add CI run with new analyzer infrastructure enabled. [#48719](https://github.com/ClickHouse/ClickHouse/pull/48719) ([Dmitry Novik](https://github.com/novikd)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Fix system.query_views_log for MVs that are pushed from background threads [#46668](https://github.com/ClickHouse/ClickHouse/pull/46668) ([Azat Khuzhin](https://github.com/azat)). +* Fix several `RENAME COLUMN` bugs [#46946](https://github.com/ClickHouse/ClickHouse/pull/46946) ([alesapin](https://github.com/alesapin)). +* Fix minor hiliting issues in clickhouse-format [#47610](https://github.com/ClickHouse/ClickHouse/pull/47610) ([Natasha Murashkina](https://github.com/murfel)). +* Fix a bug in LLVM's libc++ leading to a crash for uploading parts to S3 which size is greater than INT_MAX [#47693](https://github.com/ClickHouse/ClickHouse/pull/47693) ([Azat Khuzhin](https://github.com/azat)). +* Fix overflow in the `sparkbar` function [#48121](https://github.com/ClickHouse/ClickHouse/pull/48121) ([Vladimir C](https://github.com/vdimir)). +* Fix race in S3 [#48190](https://github.com/ClickHouse/ClickHouse/pull/48190) ([Anton Popov](https://github.com/CurtizJ)). +* Disable JIT for aggregate functions due to inconsistent behavior [#48195](https://github.com/ClickHouse/ClickHouse/pull/48195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix alter formatting (minor) [#48289](https://github.com/ClickHouse/ClickHouse/pull/48289) ([Natasha Murashkina](https://github.com/murfel)). +* Fix CPU usage in RabbitMQ (was worsened in 23.2 after [#44404](https://github.com/ClickHouse/ClickHouse/issues/44404)) [#48311](https://github.com/ClickHouse/ClickHouse/pull/48311) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash in EXPLAIN PIPELINE for Merge over Distributed [#48320](https://github.com/ClickHouse/ClickHouse/pull/48320) ([Azat Khuzhin](https://github.com/azat)). +* Fix serializing LowCardinality as Arrow dictionary [#48361](https://github.com/ClickHouse/ClickHouse/pull/48361) ([Kruglov Pavel](https://github.com/Avogar)). +* Reset downloader for cache file segment in TemporaryFileStream [#48386](https://github.com/ClickHouse/ClickHouse/pull/48386) ([Vladimir C](https://github.com/vdimir)). +* Fix possible SYSTEM SYNC REPLICA stuck in case of DROP/REPLACE PARTITION [#48391](https://github.com/ClickHouse/ClickHouse/pull/48391) ([Azat Khuzhin](https://github.com/azat)). +* Fix a startup error when loading a distributed table that depends on a dictionary [#48419](https://github.com/ClickHouse/ClickHouse/pull/48419) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Don't check dependencies when renaming system tables automatically [#48431](https://github.com/ClickHouse/ClickHouse/pull/48431) ([Raúl Marín](https://github.com/Algunenano)). +* Update only affected rows in KeeperMap storage [#48435](https://github.com/ClickHouse/ClickHouse/pull/48435) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfault in the VFS cache [#48469](https://github.com/ClickHouse/ClickHouse/pull/48469) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `toTimeZone` function throws an error when no constant string is provided [#48471](https://github.com/ClickHouse/ClickHouse/pull/48471) ([Jordi Villar](https://github.com/jrdi)). +* Fix logical error with IPv4 in Protobuf, add support for Date32 [#48486](https://github.com/ClickHouse/ClickHouse/pull/48486) ([Kruglov Pavel](https://github.com/Avogar)). +* "changed" flag in system.settings was calculated incorrectly for settings with multiple values [#48516](https://github.com/ClickHouse/ClickHouse/pull/48516) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix storage `Memory` with enabled compression [#48517](https://github.com/ClickHouse/ClickHouse/pull/48517) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bracketed-paste mode messing up password input in the event of client reconnection [#48528](https://github.com/ClickHouse/ClickHouse/pull/48528) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix nested map for keys of IP and UUID types [#48556](https://github.com/ClickHouse/ClickHouse/pull/48556) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix an uncaught exception in case of parallel loader for hashed dictionaries [#48571](https://github.com/ClickHouse/ClickHouse/pull/48571) ([Azat Khuzhin](https://github.com/azat)). +* The `groupArray` aggregate function correctly works for empty result over nullable types [#48593](https://github.com/ClickHouse/ClickHouse/pull/48593) ([lgbo](https://github.com/lgbo-ustc)). +* Fix bug in Keeper when a node is not created with scheme `auth` in ACL sometimes. [#48595](https://github.com/ClickHouse/ClickHouse/pull/48595) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Allow IPv4 comparison operators with UInt [#48611](https://github.com/ClickHouse/ClickHouse/pull/48611) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix possible error from cache [#48636](https://github.com/ClickHouse/ClickHouse/pull/48636) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Async inserts with empty data will no longer throw exception. [#48663](https://github.com/ClickHouse/ClickHouse/pull/48663) ([Anton Popov](https://github.com/CurtizJ)). +* Fix table dependencies in case of failed RENAME TABLE [#48683](https://github.com/ClickHouse/ClickHouse/pull/48683) ([Azat Khuzhin](https://github.com/azat)). +* If the primary key has duplicate columns (which is only possible for projections), in previous versions it might lead to a bug [#48838](https://github.com/ClickHouse/ClickHouse/pull/48838) ([Amos Bird](https://github.com/amosbird)). +* Fix for a race condition in ZooKeeper when joining send_thread/receive_thread [#48849](https://github.com/ClickHouse/ClickHouse/pull/48849) ([Alexander Gololobov](https://github.com/davenger)). +* Fix unexpected part name error when trying to drop a ignored detached part with zero copy replication [#48862](https://github.com/ClickHouse/ClickHouse/pull/48862) ([Michael Lex](https://github.com/mlex)). +* Fix reading `Date32` Parquet/Arrow column into not a `Date32` column [#48864](https://github.com/ClickHouse/ClickHouse/pull/48864) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `UNKNOWN_IDENTIFIER` error while selecting from table with row policy and column with dots [#48976](https://github.com/ClickHouse/ClickHouse/pull/48976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix aggregation by empty nullable strings [#48999](https://github.com/ClickHouse/ClickHouse/pull/48999) ([LiuNeng](https://github.com/liuneng1994)). + +### ClickHouse release 23.3 LTS, 2023-03-30 {#233} + +#### Upgrade Notes +* Lightweight DELETEs are production ready and enabled by default. The `DELETE` query for MergeTree tables is now available by default. +* The behavior of `*domain*RFC` and `netloc` functions is slightly changed: relaxed the set of symbols that are allowed in the URL authority for better conformance. [#46841](https://github.com/ClickHouse/ClickHouse/pull/46841) ([Azat Khuzhin](https://github.com/azat)). +* Prohibited creating tables based on KafkaEngine with DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED statements for columns. [#47138](https://github.com/ClickHouse/ClickHouse/pull/47138) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* An "asynchronous connection drain" feature is removed. Related settings and metrics are removed as well. It was an internal feature, so the removal should not affect users who had never heard about that feature. [#47486](https://github.com/ClickHouse/ClickHouse/pull/47486) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Support 256-bit Decimal data type (more than 38 digits) in `arraySum`/`Min`/`Max`/`Avg`/`Product`, `arrayCumSum`/`CumSumNonNegative`, `arrayDifference`, array construction, IN operator, query parameters, `groupArrayMovingSum`, statistical functions, `min`/`max`/`any`/`argMin`/`argMax`, PostgreSQL wire protocol, MySQL table engine and function, `sumMap`, `mapAdd`, `mapSubtract`, `arrayIntersect`. Add support for big integers in `arrayIntersect`. Statistical aggregate functions involving moments (such as `corr` or various `TTest`s) will use `Float64` as their internal representation (they were using `Decimal128` before this change, but it was pointless), and these functions can return `nan` instead of `inf` in case of infinite variance. Some functions were allowed on `Decimal256` data types but returned `Decimal128` in previous versions - now it is fixed. This closes [#47569](https://github.com/ClickHouse/ClickHouse/issues/47569). This closes [#44864](https://github.com/ClickHouse/ClickHouse/issues/44864). This closes [#28335](https://github.com/ClickHouse/ClickHouse/issues/28335). [#47594](https://github.com/ClickHouse/ClickHouse/pull/47594) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make backup_threads/restore_threads server settings (instead of user settings). [#47881](https://github.com/ClickHouse/ClickHouse/pull/47881) ([Azat Khuzhin](https://github.com/azat)). +* Do not allow const and non-deterministic secondary indices [#46839](https://github.com/ClickHouse/ClickHouse/pull/46839) ([Anton Popov](https://github.com/CurtizJ)). + +#### New Feature +* Add a new mode for splitting the work on replicas using settings `parallel_replicas_custom_key` and `parallel_replicas_custom_key_filter_type`. If the cluster consists of a single shard with multiple replicas, up to `max_parallel_replicas` will be randomly picked and turned into shards. For each shard, a corresponding filter is added to the query on the initiator before being sent to the shard. If the cluster consists of multiple shards, it will behave the same as `sample_key` but with the possibility to define an arbitrary key. [#45108](https://github.com/ClickHouse/ClickHouse/pull/45108) ([Antonio Andelic](https://github.com/antonio2368)). +* An option to display partial result on cancel: Added query setting `partial_result_on_first_cancel` allowing the canceled query (e.g. due to Ctrl-C) to return a partial result. [#45689](https://github.com/ClickHouse/ClickHouse/pull/45689) ([Alexey Perevyshin](https://github.com/alexX512)). +* Added support of arbitrary tables engines for temporary tables (except for Replicated and KeeperMap engines). Close [#31497](https://github.com/ClickHouse/ClickHouse/issues/31497). [#46071](https://github.com/ClickHouse/ClickHouse/pull/46071) ([Roman Vasin](https://github.com/rvasin)). +* Add support for replication of user-defined SQL functions using centralized storage in Keeper. [#46085](https://github.com/ClickHouse/ClickHouse/pull/46085) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Implement `system.server_settings` (similar to `system.settings`), which will contain server configurations. [#46550](https://github.com/ClickHouse/ClickHouse/pull/46550) ([pufit](https://github.com/pufit)). +* Support for `UNDROP TABLE` query. Closes [#46811](https://github.com/ClickHouse/ClickHouse/issues/46811). [#47241](https://github.com/ClickHouse/ClickHouse/pull/47241) ([chen](https://github.com/xiedeyantu)). +* Allow separate grants for named collections (e.g. to be able to give `SHOW/CREATE/ALTER/DROP named collection` access only to certain collections, instead of all at once). Closes [#40894](https://github.com/ClickHouse/ClickHouse/issues/40894). Add new access type `NAMED_COLLECTION_CONTROL` which is not given to user default unless explicitly added to the user config (is required to be able to do `GRANT ALL`), also `show_named_collections` is no longer obligatory to be manually specified for user default to be able to have full access rights as was in 23.2. [#46241](https://github.com/ClickHouse/ClickHouse/pull/46241) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow nested custom disks. Previously custom disks supported only flat disk structure. [#47106](https://github.com/ClickHouse/ClickHouse/pull/47106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Introduce a function `widthBucket` (with a `WIDTH_BUCKET` alias for compatibility). [#42974](https://github.com/ClickHouse/ClickHouse/issues/42974). [#46790](https://github.com/ClickHouse/ClickHouse/pull/46790) ([avoiderboi](https://github.com/avoiderboi)). +* Add new function `parseDateTime`/`parseDateTimeInJodaSyntax` according to the specified format string. parseDateTime parses String to DateTime in MySQL syntax, parseDateTimeInJodaSyntax parses in Joda syntax. [#46815](https://github.com/ClickHouse/ClickHouse/pull/46815) ([李扬](https://github.com/taiyang-li)). +* Use `dummy UInt8` for the default structure of table function `null`. Closes [#46930](https://github.com/ClickHouse/ClickHouse/issues/46930). [#47006](https://github.com/ClickHouse/ClickHouse/pull/47006) ([flynn](https://github.com/ucasfl)). +* Support for date format with a comma, like `Dec 15, 2021` in the `parseDateTimeBestEffort` function. Closes [#46816](https://github.com/ClickHouse/ClickHouse/issues/46816). [#47071](https://github.com/ClickHouse/ClickHouse/pull/47071) ([chen](https://github.com/xiedeyantu)). +* Add settings `http_wait_end_of_query` and `http_response_buffer_size` that corresponds to URL params `wait_end_of_query` and `buffer_size` for the HTTP interface. This allows changing these settings in the profiles. [#47108](https://github.com/ClickHouse/ClickHouse/pull/47108) ([Vladimir C](https://github.com/vdimir)). +* Add `system.dropped_tables` table that shows tables that were dropped from `Atomic` databases but were not completely removed yet. [#47364](https://github.com/ClickHouse/ClickHouse/pull/47364) ([chen](https://github.com/xiedeyantu)). +* Add `INSTR` as alias of `positionCaseInsensitive` for MySQL compatibility. Closes [#47529](https://github.com/ClickHouse/ClickHouse/issues/47529). [#47535](https://github.com/ClickHouse/ClickHouse/pull/47535) ([flynn](https://github.com/ucasfl)). +* Added `toDecimalString` function allowing to convert numbers to string with fixed precision. [#47838](https://github.com/ClickHouse/ClickHouse/pull/47838) ([Andrey Zvonov](https://github.com/zvonand)). +* Add a merge tree setting `max_number_of_mutations_for_replica`. It limits the number of part mutations per replica to the specified amount. Zero means no limit on the number of mutations per replica (the execution can still be constrained by other settings). [#48047](https://github.com/ClickHouse/ClickHouse/pull/48047) ([Vladimir C](https://github.com/vdimir)). +* Add the Map-related function `mapFromArrays`, which allows the creation of a map from a pair of arrays. [#31125](https://github.com/ClickHouse/ClickHouse/pull/31125) ([李扬](https://github.com/taiyang-li)). +* Allow control of compression in Parquet/ORC/Arrow output formats, adds support for more compression input formats. This closes [#13541](https://github.com/ClickHouse/ClickHouse/issues/13541). [#47114](https://github.com/ClickHouse/ClickHouse/pull/47114) ([Kruglov Pavel](https://github.com/Avogar)). +* Add SSL User Certificate authentication to the native protocol. Closes [#47077](https://github.com/ClickHouse/ClickHouse/issues/47077). [#47596](https://github.com/ClickHouse/ClickHouse/pull/47596) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add *OrNull() and *OrZero() variants for `parseDateTime`, add alias `str_to_date` for MySQL parity. [#48000](https://github.com/ClickHouse/ClickHouse/pull/48000) ([Robert Schulze](https://github.com/rschu1ze)). +* Added operator `REGEXP` (similar to operators "LIKE", "IN", "MOD" etc.) for better compatibility with MySQL [#47869](https://github.com/ClickHouse/ClickHouse/pull/47869) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Marks in memory are now compressed, using 3-6x less memory. [#47290](https://github.com/ClickHouse/ClickHouse/pull/47290) ([Michael Kolupaev](https://github.com/al13n321)). +* Backups for large numbers of files were unbelievably slow in previous versions. Not anymore. Now they are unbelievably fast. [#47251](https://github.com/ClickHouse/ClickHouse/pull/47251) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Introduced a separate thread pool for backup's IO operations. This will allow scaling it independently of other pools and increase performance. [#47174](https://github.com/ClickHouse/ClickHouse/pull/47174) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). Use MultiRead request and retries for collecting metadata at the final stage of backup processing. [#47243](https://github.com/ClickHouse/ClickHouse/pull/47243) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). If a backup and restoring data are both in S3 then server-side copy should be used from now on. [#47546](https://github.com/ClickHouse/ClickHouse/pull/47546) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed excessive reading in queries with `FINAL`. [#47801](https://github.com/ClickHouse/ClickHouse/pull/47801) ([Nikita Taranov](https://github.com/nickitat)). +* Setting `max_final_threads` would be set to the number of cores at server startup (by the same algorithm as used for `max_threads`). This improves the concurrency of `final` execution on servers with high number of CPUs. [#47915](https://github.com/ClickHouse/ClickHouse/pull/47915) ([Nikita Taranov](https://github.com/nickitat)). +* Allow executing reading pipeline for DIRECT dictionary with CLICKHOUSE source in multiple threads. To enable set `dictionary_use_async_executor=1` in `SETTINGS` section for source in `CREATE DICTIONARY` statement. [#47986](https://github.com/ClickHouse/ClickHouse/pull/47986) ([Vladimir C](https://github.com/vdimir)). +* Optimize one nullable key aggregate performance. [#45772](https://github.com/ClickHouse/ClickHouse/pull/45772) ([LiuNeng](https://github.com/liuneng1994)). +* Implemented lowercase `tokenbf_v1` index utilization for `hasTokenOrNull`, `hasTokenCaseInsensitive` and `hasTokenCaseInsensitiveOrNull`. [#46252](https://github.com/ClickHouse/ClickHouse/pull/46252) ([ltrk2](https://github.com/ltrk2)). +* Optimize functions `position` and `LIKE` by searching the first two chars using SIMD. [#46289](https://github.com/ClickHouse/ClickHouse/pull/46289) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize queries from the `system.detached_parts`, which could be significantly large. Added several sources with respect to the block size limitation; in each block, an IO thread pool is used to calculate the part size, i.e. to make syscalls in parallel. [#46624](https://github.com/ClickHouse/ClickHouse/pull/46624) ([Sema Checherinda](https://github.com/CheSema)). +* Increase the default value of `max_replicated_merges_in_queue` for ReplicatedMergeTree tables from 16 to 1000. It allows faster background merge operation on clusters with a very large number of replicas, such as clusters with shared storage in ClickHouse Cloud. [#47050](https://github.com/ClickHouse/ClickHouse/pull/47050) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Updated `clickhouse-copier` to use `GROUP BY` instead of `DISTINCT` to get the list of partitions. For large tables, this reduced the select time from over 500s to under 1s. [#47386](https://github.com/ClickHouse/ClickHouse/pull/47386) ([Clayton McClure](https://github.com/cmcclure-twilio)). +* Fix performance degradation in `ASOF JOIN`. [#47544](https://github.com/ClickHouse/ClickHouse/pull/47544) ([Ongkong](https://github.com/ongkong)). +* Even more batching in Keeper. Improve performance by avoiding breaking batches on read requests. [#47978](https://github.com/ClickHouse/ClickHouse/pull/47978) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow PREWHERE for Merge with different DEFAULT expressions for columns. [#46831](https://github.com/ClickHouse/ClickHouse/pull/46831) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature +* Parallel replicas: Improved the overall performance by better utilizing the local replica, and forbid the reading with parallel replicas from non-replicated MergeTree by default. [#47858](https://github.com/ClickHouse/ClickHouse/pull/47858) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support filter push down to left table for JOIN with `Join`, `Dictionary` and `EmbeddedRocksDB` tables if the experimental Analyzer is enabled. [#47280](https://github.com/ClickHouse/ClickHouse/pull/47280) ([Maksim Kita](https://github.com/kitaisreal)). +* Now ReplicatedMergeTree with zero copy replication has less load to Keeper. [#47676](https://github.com/ClickHouse/ClickHouse/pull/47676) ([alesapin](https://github.com/alesapin)). +* Fix create materialized view with MaterializedPostgreSQL [#40807](https://github.com/ClickHouse/ClickHouse/pull/40807) ([Maksim Buren](https://github.com/maks-buren630501)). + +#### Improvement +* Enable `input_format_json_ignore_unknown_keys_in_named_tuple` by default. [#46742](https://github.com/ClickHouse/ClickHouse/pull/46742) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow errors to be ignored while pushing to MATERIALIZED VIEW (add new setting `materialized_views_ignore_errors`, by default to `false`, but it is set to `true` for flushing logs to `system.*_log` tables unconditionally). [#46658](https://github.com/ClickHouse/ClickHouse/pull/46658) ([Azat Khuzhin](https://github.com/azat)). +* Track the file queue of distributed sends in memory. [#45491](https://github.com/ClickHouse/ClickHouse/pull/45491) ([Azat Khuzhin](https://github.com/azat)). +* Now `X-ClickHouse-Query-Id` and `X-ClickHouse-Timezone` headers are added to responses in all queries via HTTP protocol. Previously it was done only for `SELECT` queries. [#46364](https://github.com/ClickHouse/ClickHouse/pull/46364) ([Anton Popov](https://github.com/CurtizJ)). +* External tables from `MongoDB`: support for connection to a replica set via a URI with a host:port enum and support for the readPreference option in MongoDB dictionaries. Example URI: mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl&readPreference=primary. [#46524](https://github.com/ClickHouse/ClickHouse/pull/46524) ([artem-yadr](https://github.com/artem-yadr)). +* This improvement should be invisible for users. Re-implement projection analysis on top of query plan. Added setting `query_plan_optimize_projection=1` to switch between old and new version. Fixes [#44963](https://github.com/ClickHouse/ClickHouse/issues/44963). [#46537](https://github.com/ClickHouse/ClickHouse/pull/46537) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Use Parquet format v2 instead of v1 in output format by default. Add setting `output_format_parquet_version` to control parquet version, possible values `1.0`, `2.4`, `2.6`, `2.latest` (default). [#46617](https://github.com/ClickHouse/ClickHouse/pull/46617) ([Kruglov Pavel](https://github.com/Avogar)). +* It is now possible to use the new configuration syntax to configure Kafka topics with periods (`.`) in their name. [#46752](https://github.com/ClickHouse/ClickHouse/pull/46752) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix heuristics that check hyperscan patterns for problematic repeats. [#46819](https://github.com/ClickHouse/ClickHouse/pull/46819) ([Robert Schulze](https://github.com/rschu1ze)). +* Don't report ZK node exists to system.errors when a block was created concurrently by a different replica. [#46820](https://github.com/ClickHouse/ClickHouse/pull/46820) ([Raúl Marín](https://github.com/Algunenano)). +* Increase the limit for opened files in `clickhouse-local`. It will be able to read from `web` tables on servers with a huge number of CPU cores. Do not back off reading from the URL table engine in case of too many opened files. This closes [#46852](https://github.com/ClickHouse/ClickHouse/issues/46852). [#46853](https://github.com/ClickHouse/ClickHouse/pull/46853) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Exceptions thrown when numbers cannot be parsed now have an easier-to-read exception message. [#46917](https://github.com/ClickHouse/ClickHouse/pull/46917) ([Robert Schulze](https://github.com/rschu1ze)). +* Added update `system.backups` after every processed task to track the progress of backups. [#46989](https://github.com/ClickHouse/ClickHouse/pull/46989) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Allow types conversion in Native input format. Add settings `input_format_native_allow_types_conversion` that controls it (enabled by default). [#46990](https://github.com/ClickHouse/ClickHouse/pull/46990) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow IPv4 in the `range` function to generate IP ranges. [#46995](https://github.com/ClickHouse/ClickHouse/pull/46995) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Improve exception message when it's impossible to move a part from one volume/disk to another. [#47032](https://github.com/ClickHouse/ClickHouse/pull/47032) ([alesapin](https://github.com/alesapin)). +* Support `Bool` type in `JSONType` function. Previously `Null` type was mistakenly returned for bool values. [#47046](https://github.com/ClickHouse/ClickHouse/pull/47046) ([Anton Popov](https://github.com/CurtizJ)). +* Use `_request_body` parameter to configure predefined HTTP queries. [#47086](https://github.com/ClickHouse/ClickHouse/pull/47086) ([Constantine Peresypkin](https://github.com/pkit)). +* Automatic indentation in the built-in UI SQL editor when Enter is pressed. [#47113](https://github.com/ClickHouse/ClickHouse/pull/47113) ([Alexey Korepanov](https://github.com/alexkorep)). +* Self-extraction with 'sudo' will attempt to set uid and gid of extracted files to running user. [#47116](https://github.com/ClickHouse/ClickHouse/pull/47116) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Previously, the `repeat` function's second argument only accepted an unsigned integer type, which meant it could not accept values such as -1. This behavior differed from that of the Spark function. In this update, the repeat function has been modified to match the behavior of the Spark function. It now accepts the same types of inputs, including negative integers. Extensive testing has been performed to verify the correctness of the updated implementation. [#47134](https://github.com/ClickHouse/ClickHouse/pull/47134) ([KevinyhZou](https://github.com/KevinyhZou)). Note: the changelog entry was rewritten by ChatGPT. +* Remove `::__1` part from stacktraces. Display `std::basic_string ClickHouse release 23.2, 2023-02-23 {#232} + +#### Backward Incompatible Change +* Extend function "toDayOfWeek()" (alias: "DAYOFWEEK") with a mode argument that encodes whether the week starts on Monday or Sunday and whether counting starts at 0 or 1. For consistency with other date time functions, the mode argument was inserted between the time and the time zone arguments. This breaks existing usage of the (previously undocumented) 2-argument syntax "toDayOfWeek(time, time_zone)". A fix is to rewrite the function into "toDayOfWeek(time, 0, time_zone)". [#45233](https://github.com/ClickHouse/ClickHouse/pull/45233) ([Robert Schulze](https://github.com/rschu1ze)). +* Rename setting `max_query_cache_size` to `filesystem_cache_max_download_size`. [#45614](https://github.com/ClickHouse/ClickHouse/pull/45614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The `default` user will not have permissions for access type `SHOW NAMED COLLECTION` by default (e.g. `default` user will no longer be able to grant ALL to other users as it was before, therefore this PR is backward incompatible). [#46010](https://github.com/ClickHouse/ClickHouse/pull/46010) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If the SETTINGS clause is specified before the FORMAT clause, the settings will be applied to formatting as well. [#46003](https://github.com/ClickHouse/ClickHouse/pull/46003) ([Azat Khuzhin](https://github.com/azat)). +* Remove support for setting `materialized_postgresql_allow_automatic_update` (which was by default turned off). [#46106](https://github.com/ClickHouse/ClickHouse/pull/46106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Slightly improve performance of `countDigits` on realistic datasets. This closed [#44518](https://github.com/ClickHouse/ClickHouse/issues/44518). In previous versions, `countDigits(0)` returned `0`; now it returns `1`, which is more correct, and follows the existing documentation. [#46187](https://github.com/ClickHouse/ClickHouse/pull/46187) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disallow creation of new columns compressed by a combination of codecs "Delta" or "DoubleDelta" followed by codecs "Gorilla" or "FPC". This can be bypassed using setting "allow_suspicious_codecs = true". [#45652](https://github.com/ClickHouse/ClickHouse/pull/45652) ([Robert Schulze](https://github.com/rschu1ze)). + +#### New Feature +* Add `StorageIceberg` and table function `iceberg` to access iceberg table store on S3. [#45384](https://github.com/ClickHouse/ClickHouse/pull/45384) ([flynn](https://github.com/ucasfl)). +* Allow configuring storage as `SETTINGS disk = ''` (instead of `storage_policy`) and with explicit disk creation `SETTINGS disk = disk(type=s3, ...)`. [#41976](https://github.com/ClickHouse/ClickHouse/pull/41976) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Expose `ProfileEvents` counters in `system.part_log`. [#38614](https://github.com/ClickHouse/ClickHouse/pull/38614) ([Bharat Nallan](https://github.com/bharatnc)). +* Enrichment of the existing `ReplacingMergeTree` engine to allow duplicate the insertion. It leverages the power of both `ReplacingMergeTree` and `CollapsingMergeTree` in one MergeTree engine. Deleted data are not returned when queried, but not removed from disk neither. [#41005](https://github.com/ClickHouse/ClickHouse/pull/41005) ([youennL-cs](https://github.com/youennL-cs)). +* Add `generateULID` function. Closes [#36536](https://github.com/ClickHouse/ClickHouse/issues/36536). [#44662](https://github.com/ClickHouse/ClickHouse/pull/44662) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `corrMatrix` aggregate function, calculating each two columns. In addition, since Aggregatefunctions `covarSamp` and `covarPop` are similar to `corr`, I add `covarSampMatrix`, `covarPopMatrix` by the way. @alexey-milovidov closes [#44587](https://github.com/ClickHouse/ClickHouse/issues/44587). [#44680](https://github.com/ClickHouse/ClickHouse/pull/44680) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Introduce arrayShuffle function for random array permutations. [#45271](https://github.com/ClickHouse/ClickHouse/pull/45271) ([Joanna Hulboj](https://github.com/jh0x)). +* Support types `FIXED_SIZE_BINARY` type in Arrow, `FIXED_LENGTH_BYTE_ARRAY` in `Parquet` and match them to `FixedString`. Add settings `output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array` to control default output type for FixedString. Closes [#45326](https://github.com/ClickHouse/ClickHouse/issues/45326). [#45340](https://github.com/ClickHouse/ClickHouse/pull/45340) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new column `last_exception_time` to system.replication_queue. [#45457](https://github.com/ClickHouse/ClickHouse/pull/45457) ([Frank Chen](https://github.com/FrankChen021)). +* Add two new functions which allow for user-defined keys/seeds with SipHash{64,128}. [#45513](https://github.com/ClickHouse/ClickHouse/pull/45513) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Allow a three-argument version for table function `format`. close [#45808](https://github.com/ClickHouse/ClickHouse/issues/45808). [#45873](https://github.com/ClickHouse/ClickHouse/pull/45873) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Add `JodaTime` format support for 'x','w','S'. Refer to https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html. [#46073](https://github.com/ClickHouse/ClickHouse/pull/46073) ([zk_kiger](https://github.com/zk-kiger)). +* Support window function `ntile`. ([lgbo](https://github.com/lgbo-ustc)). +* Add setting `final` to implicitly apply the `FINAL` modifier to every table. [#40945](https://github.com/ClickHouse/ClickHouse/pull/40945) ([Arthur Passos](https://github.com/arthurpassos)). +* Added `arrayPartialSort` and `arrayPartialReverseSort` functions. [#46296](https://github.com/ClickHouse/ClickHouse/pull/46296) ([Joanna Hulboj](https://github.com/jh0x)). +* The new http parameter `client_protocol_version` allows setting a client protocol version for HTTP responses using the Native format. [#40397](https://github.com/ClickHouse/ClickHouse/issues/40397). [#46360](https://github.com/ClickHouse/ClickHouse/pull/46360) ([Geoff Genz](https://github.com/genzgd)). +* Add new function `regexpExtract`, like spark function `REGEXP_EXTRACT` for compatibility. It is similar to the existing function `extract`. [#46469](https://github.com/ClickHouse/ClickHouse/pull/46469) ([李扬](https://github.com/taiyang-li)). +* Add new function `JSONArrayLength`, which returns the number of elements in the outermost JSON array. The function returns NULL if the input JSON string is invalid. [#46631](https://github.com/ClickHouse/ClickHouse/pull/46631) ([李扬](https://github.com/taiyang-li)). + +#### Performance Improvement +* The introduced logic works if PREWHERE condition is a conjunction of multiple conditions (cond1 AND cond2 AND ... ). It groups those conditions that require reading the same columns into steps. After each step the corresponding part of the full condition is computed and the result rows might be filtered. This allows to read fewer rows in the next steps thus saving IO bandwidth and doing less computation. This logic is disabled by default for now. It will be enabled by default in one of the future releases once it is known to not have any regressions, so it is highly encouraged to be used for testing. It can be controlled by 2 settings: "enable_multiple_prewhere_read_steps" and "move_all_conditions_to_prewhere". [#46140](https://github.com/ClickHouse/ClickHouse/pull/46140) ([Alexander Gololobov](https://github.com/davenger)). +* An option added to aggregate partitions independently if table partition key and group by key are compatible. Controlled by the setting `allow_aggregate_partitions_independently`. Disabled by default because of limited applicability (please refer to the docs). [#45364](https://github.com/ClickHouse/ClickHouse/pull/45364) ([Nikita Taranov](https://github.com/nickitat)). +* Allow using Vertical merge algorithm with parts in Compact format. This will allow ClickHouse server to use much less memory for background operations. This closes [#46084](https://github.com/ClickHouse/ClickHouse/issues/46084). [#45681](https://github.com/ClickHouse/ClickHouse/pull/45681) [#46282](https://github.com/ClickHouse/ClickHouse/pull/46282) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize `Parquet` reader by using batch reader. [#45878](https://github.com/ClickHouse/ClickHouse/pull/45878) ([LiuNeng](https://github.com/liuneng1994)). +* Add new `local_filesystem_read_method` method `io_uring` based on the asynchronous Linux [io_uring](https://kernel.dk/io_uring.pdf) subsystem, improving read performance almost universally compared to the default `pread` method. [#38456](https://github.com/ClickHouse/ClickHouse/pull/38456) ([Saulius Valatka](https://github.com/sauliusvl)). +* Rewrite aggregate functions with `if` expression as argument when logically equivalent. For example, `avg(if(cond, col, null))` can be rewritten to avgIf(cond, col). It is helpful in performance. [#44730](https://github.com/ClickHouse/ClickHouse/pull/44730) ([李扬](https://github.com/taiyang-li)). +* Improve lower/upper function performance with avx512 instructions. [#37894](https://github.com/ClickHouse/ClickHouse/pull/37894) ([yaqi-zhao](https://github.com/yaqi-zhao)). +* Remove the limitation that on systems with >=32 cores and SMT disabled ClickHouse uses only half of the cores (the case when you disable Hyper Threading in BIOS). [#44973](https://github.com/ClickHouse/ClickHouse/pull/44973) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve performance of function `multiIf` by columnar executing, speed up by 2.3x. [#45296](https://github.com/ClickHouse/ClickHouse/pull/45296) ([李扬](https://github.com/taiyang-li)). +* Add fast path for function `position` when the needle is empty. [#45382](https://github.com/ClickHouse/ClickHouse/pull/45382) ([李扬](https://github.com/taiyang-li)). +* Enable `query_plan_remove_redundant_sorting` optimization by default. Optimization implemented in [#45420](https://github.com/ClickHouse/ClickHouse/issues/45420). [#45567](https://github.com/ClickHouse/ClickHouse/pull/45567) ([Igor Nikonov](https://github.com/devcrafter)). +* Increased HTTP Transfer Encoding chunk size to improve performance of large queries using the HTTP interface. [#45593](https://github.com/ClickHouse/ClickHouse/pull/45593) ([Geoff Genz](https://github.com/genzgd)). +* Fixed performance of short `SELECT` queries that read from tables with large number of `Array`/`Map`/`Nested` columns. [#45630](https://github.com/ClickHouse/ClickHouse/pull/45630) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of filtering for big integers and decimal types. [#45949](https://github.com/ClickHouse/ClickHouse/pull/45949) ([李扬](https://github.com/taiyang-li)). +* This change could effectively reduce the overhead of obtaining the filter from ColumnNullable(UInt8) and improve the overall query performance. To evaluate the impact of this change, we adopted TPC-H benchmark but revised the column types from non-nullable to nullable, and we measured the QPS of its queries as the performance indicator. [#45962](https://github.com/ClickHouse/ClickHouse/pull/45962) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Make the `_part` and `_partition_id` virtual column be `LowCardinality(String)` type. Closes [#45964](https://github.com/ClickHouse/ClickHouse/issues/45964). [#45975](https://github.com/ClickHouse/ClickHouse/pull/45975) ([flynn](https://github.com/ucasfl)). +* Improve the performance of Decimal conversion when the scale does not change. [#46095](https://github.com/ClickHouse/ClickHouse/pull/46095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow to increase prefetching for read data. [#46168](https://github.com/ClickHouse/ClickHouse/pull/46168) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Rewrite `arrayExists(x -> x = 1, arr)` -> `has(arr, 1)`, which improve performance by 1.34x. [#46188](https://github.com/ClickHouse/ClickHouse/pull/46188) ([李扬](https://github.com/taiyang-li)). +* Fix too big memory usage for vertical merges on non-remote disk. Respect `max_insert_delayed_streams_for_parallel_write` for the remote disk. [#46275](https://github.com/ClickHouse/ClickHouse/pull/46275) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update zstd to v1.5.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge/mutation is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. [#46280](https://github.com/ClickHouse/ClickHouse/pull/46280) ([Raúl Marín](https://github.com/Algunenano)). +* Fix performance degradation caused by [#39737](https://github.com/ClickHouse/ClickHouse/issues/39737). [#46309](https://github.com/ClickHouse/ClickHouse/pull/46309) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `replicas_status` handle will answer quickly even in case of a large replication queue. [#46310](https://github.com/ClickHouse/ClickHouse/pull/46310) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add avx512 support for aggregate function `sum`, function unary arithmetic, function comparison. [#37870](https://github.com/ClickHouse/ClickHouse/pull/37870) ([zhao zhou](https://github.com/zzachimed)). +* Rewrote the code around marks distribution and the overall coordination of the reading in order to achieve the maximum performance improvement. This closes [#34527](https://github.com/ClickHouse/ClickHouse/issues/34527). [#43772](https://github.com/ClickHouse/ClickHouse/pull/43772) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Remove redundant DISTINCT clauses in query (subqueries). Implemented on top of query plan. It does similar optimization as `optimize_duplicate_order_by_and_distinct` regarding DISTINCT clauses. Can be enabled via `query_plan_remove_redundant_distinct` setting. Related to [#42648](https://github.com/ClickHouse/ClickHouse/issues/42648). [#44176](https://github.com/ClickHouse/ClickHouse/pull/44176) ([Igor Nikonov](https://github.com/devcrafter)). +* A few query rewrite optimizations: `sumIf(123, cond) -> 123 * countIf(1, cond)`, `sum(if(cond, 123, 0)) -> 123 * countIf(cond)`, `sum(if(cond, 0, 123)) -> 123 * countIf(not(cond))` [#44728](https://github.com/ClickHouse/ClickHouse/pull/44728) ([李扬](https://github.com/taiyang-li)). +* Improved how memory bound merging and aggregation in order on top query plan interact. Previously we fell back to explicit sorting for AIO in some cases when it wasn't actually needed. [#45892](https://github.com/ClickHouse/ClickHouse/pull/45892) ([Nikita Taranov](https://github.com/nickitat)). +* Concurrent merges are scheduled using round-robin by default to ensure fair and starvation-free operation. Previously in heavily overloaded shards, big merges could possibly be starved by smaller merges due to the use of strict priority scheduling. Added `background_merges_mutations_scheduling_policy` server config option to select scheduling algorithm (`round_robin` or `shortest_task_first`). [#46247](https://github.com/ClickHouse/ClickHouse/pull/46247) ([Sergei Trifonov](https://github.com/serxa)). + +#### Improvement +* Enable retries for INSERT by default in case of ZooKeeper session loss. We already use it in production. [#46308](https://github.com/ClickHouse/ClickHouse/pull/46308) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to ignore unknown keys in JSON object for named tuples (`input_format_json_ignore_unknown_keys_in_named_tuple`). [#45678](https://github.com/ClickHouse/ClickHouse/pull/45678) ([Azat Khuzhin](https://github.com/azat)). +* Support optimizing the `where` clause with sorting key expression move to `prewhere` for query with `final`. [#38893](https://github.com/ClickHouse/ClickHouse/issues/38893). [#38950](https://github.com/ClickHouse/ClickHouse/pull/38950) ([hexiaoting](https://github.com/hexiaoting)). +* Add new metrics for backups: num_processed_files and processed_files_size described actual number of processed files. [#42244](https://github.com/ClickHouse/ClickHouse/pull/42244) ([Aleksandr](https://github.com/AVMusorin)). +* Added retries on interserver DNS errors. [#43179](https://github.com/ClickHouse/ClickHouse/pull/43179) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Keeper improvement: try preallocating space on the disk to avoid undefined out-of-space issues. Introduce setting `max_log_file_size` for the maximum size of Keeper's Raft log files. [#44370](https://github.com/ClickHouse/ClickHouse/pull/44370) ([Antonio Andelic](https://github.com/antonio2368)). +* Optimize behavior for a replica delay api logic in case the replica is read-only. [#45148](https://github.com/ClickHouse/ClickHouse/pull/45148) ([mateng915](https://github.com/mateng0915)). +* Ask for the password in clickhouse-client interactively in a case when the empty password is wrong. Closes [#46702](https://github.com/ClickHouse/ClickHouse/issues/46702). [#46730](https://github.com/ClickHouse/ClickHouse/pull/46730) ([Nikolay Degterinsky](https://github.com/evillique)). +* Mark `Gorilla` compression on columns of non-Float* type as suspicious. [#45376](https://github.com/ClickHouse/ClickHouse/pull/45376) ([Robert Schulze](https://github.com/rschu1ze)). +* Show replica name that is executing a merge in the `postpone_reason` column. [#45458](https://github.com/ClickHouse/ClickHouse/pull/45458) ([Frank Chen](https://github.com/FrankChen021)). +* Save exception stack trace in part_log. [#45459](https://github.com/ClickHouse/ClickHouse/pull/45459) ([Frank Chen](https://github.com/FrankChen021)). +* The `regexp_tree` dictionary is polished and now it is compatible with https://github.com/ua-parser/uap-core. [#45631](https://github.com/ClickHouse/ClickHouse/pull/45631) ([Han Fei](https://github.com/hanfei1991)). +* Updated checking of `SYSTEM SYNC REPLICA`, resolves [#45508](https://github.com/ClickHouse/ClickHouse/issues/45508) [#45648](https://github.com/ClickHouse/ClickHouse/pull/45648) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Rename setting `replication_alter_partitions_sync` to `alter_sync`. [#45659](https://github.com/ClickHouse/ClickHouse/pull/45659) ([Antonio Andelic](https://github.com/antonio2368)). +* The `generateRandom` table function and the engine now support `LowCardinality` data types. This is useful for testing, for example you can write `INSERT INTO table SELECT * FROM generateRandom() LIMIT 1000`. This is needed to debug [#45590](https://github.com/ClickHouse/ClickHouse/issues/45590). [#45661](https://github.com/ClickHouse/ClickHouse/pull/45661) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The experimental query result cache now provides more modular configuration settings. [#45679](https://github.com/ClickHouse/ClickHouse/pull/45679) ([Robert Schulze](https://github.com/rschu1ze)). +* Renamed "query result cache" to "query cache". [#45682](https://github.com/ClickHouse/ClickHouse/pull/45682) ([Robert Schulze](https://github.com/rschu1ze)). +* add `SYSTEM SYNC FILE CACHE` command. It will do the `sync` syscall. [#8921](https://github.com/ClickHouse/ClickHouse/issues/8921). [#45685](https://github.com/ClickHouse/ClickHouse/pull/45685) ([DR](https://github.com/freedomDR)). +* Add a new S3 setting `allow_head_object_request`. This PR makes usage of `GetObjectAttributes` request instead of `HeadObject` introduced in https://github.com/ClickHouse/ClickHouse/pull/45288 optional (and disabled by default). [#45701](https://github.com/ClickHouse/ClickHouse/pull/45701) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add ability to override connection settings based on connection names (that said that now you can forget about storing password for each connection, you can simply put everything into `~/.clickhouse-client/config.xml` and even use different history files for them, which can be also useful). [#45715](https://github.com/ClickHouse/ClickHouse/pull/45715) ([Azat Khuzhin](https://github.com/azat)). +* Arrow format: support the duration type. Closes [#45669](https://github.com/ClickHouse/ClickHouse/issues/45669). [#45750](https://github.com/ClickHouse/ClickHouse/pull/45750) ([flynn](https://github.com/ucasfl)). +* Extend the logging in the Query Cache to improve investigations of the caching behavior. [#45751](https://github.com/ClickHouse/ClickHouse/pull/45751) ([Robert Schulze](https://github.com/rschu1ze)). +* The query cache's server-level settings are now reconfigurable at runtime. [#45758](https://github.com/ClickHouse/ClickHouse/pull/45758) ([Robert Schulze](https://github.com/rschu1ze)). +* Hide password in logs when a table function's arguments are specified with a named collection. [#45774](https://github.com/ClickHouse/ClickHouse/pull/45774) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve internal S3 client to correctly deduce regions and redirections for different types of URLs. [#45783](https://github.com/ClickHouse/ClickHouse/pull/45783) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for Map, IPv4 and IPv6 types in generateRandom. Mostly useful for testing. [#45785](https://github.com/ClickHouse/ClickHouse/pull/45785) ([Raúl Marín](https://github.com/Algunenano)). +* Support empty/notEmpty for IP types. [#45799](https://github.com/ClickHouse/ClickHouse/pull/45799) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* The column `num_processed_files` was split into two columns: `num_files` (for BACKUP) and `files_read` (for RESTORE). The column `processed_files_size` was split into two columns: `total_size` (for BACKUP) and `bytes_read` (for RESTORE). [#45800](https://github.com/ClickHouse/ClickHouse/pull/45800) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for `SHOW ENGINES` query for MySQL compatibility. [#45859](https://github.com/ClickHouse/ClickHouse/pull/45859) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Improved how the obfuscator deals with queries. [#45867](https://github.com/ClickHouse/ClickHouse/pull/45867) ([Raúl Marín](https://github.com/Algunenano)). +* Improve behaviour of conversion into Date for boundary value 65535 (2149-06-06). [#46042](https://github.com/ClickHouse/ClickHouse/pull/46042) [#45914](https://github.com/ClickHouse/ClickHouse/pull/45914) ([Joanna Hulboj](https://github.com/jh0x)). +* Add setting `check_referential_table_dependencies` to check referential dependencies on `DROP TABLE`. This PR solves [#38326](https://github.com/ClickHouse/ClickHouse/issues/38326). [#45936](https://github.com/ClickHouse/ClickHouse/pull/45936) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `tupleElement` to return `Null` when having `Null` argument. Closes [#45894](https://github.com/ClickHouse/ClickHouse/issues/45894). [#45952](https://github.com/ClickHouse/ClickHouse/pull/45952) ([flynn](https://github.com/ucasfl)). +* Throw an error on no files satisfying the S3 wildcard. Closes [#45587](https://github.com/ClickHouse/ClickHouse/issues/45587). [#45957](https://github.com/ClickHouse/ClickHouse/pull/45957) ([chen](https://github.com/xiedeyantu)). +* Use cluster state data to check concurrent backup/restore. [#45982](https://github.com/ClickHouse/ClickHouse/pull/45982) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* ClickHouse Client: Use "exact" matching for fuzzy search, which has correct case ignorance and more appropriate algorithm for matching SQL queries. [#46000](https://github.com/ClickHouse/ClickHouse/pull/46000) ([Azat Khuzhin](https://github.com/azat)). +* Forbid wrong create View syntax `CREATE View X TO Y AS SELECT`. Closes [#4331](https://github.com/ClickHouse/ClickHouse/issues/4331). [#46043](https://github.com/ClickHouse/ClickHouse/pull/46043) ([flynn](https://github.com/ucasfl)). +* Storage `Log` family support setting the `storage_policy`. Closes [#43421](https://github.com/ClickHouse/ClickHouse/issues/43421). [#46044](https://github.com/ClickHouse/ClickHouse/pull/46044) ([flynn](https://github.com/ucasfl)). +* Improve `JSONColumns` format when the result is empty. Closes [#46024](https://github.com/ClickHouse/ClickHouse/issues/46024). [#46053](https://github.com/ClickHouse/ClickHouse/pull/46053) ([flynn](https://github.com/ucasfl)). +* Add reference implementation for SipHash128. [#46065](https://github.com/ClickHouse/ClickHouse/pull/46065) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Add a new metric to record allocations times and bytes using mmap. [#46068](https://github.com/ClickHouse/ClickHouse/pull/46068) ([李扬](https://github.com/taiyang-li)). +* Currently for functions like `leftPad`, `rightPad`, `leftPadUTF8`, `rightPadUTF8`, the second argument `length` must be UInt8|16|32|64|128|256. Which is too strict for clickhouse users, besides, it is not consistent with other similar functions like `arrayResize`, `substring` and so on. [#46103](https://github.com/ClickHouse/ClickHouse/pull/46103) ([李扬](https://github.com/taiyang-li)). +* Fix assertion in the `welchTTest` function in debug build when the resulting statistics is NaN. Unified the behavior with other similar functions. Change the behavior of `studentTTest` to return NaN instead of throwing an exception because the previous behavior was inconvenient. This closes [#41176](https://github.com/ClickHouse/ClickHouse/issues/41176) This closes [#42162](https://github.com/ClickHouse/ClickHouse/issues/42162). [#46141](https://github.com/ClickHouse/ClickHouse/pull/46141) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* More convenient usage of big integers and ORDER BY WITH FILL. Allow using plain integers for start and end points in WITH FILL when ORDER BY big (128-bit and 256-bit) integers. Fix the wrong result for big integers with negative start or end points. This closes [#16733](https://github.com/ClickHouse/ClickHouse/issues/16733). [#46152](https://github.com/ClickHouse/ClickHouse/pull/46152) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `parts`, `active_parts` and `total_marks` columns to `system.tables` on [issue](https://github.com/ClickHouse/ClickHouse/issues/44336). [#46161](https://github.com/ClickHouse/ClickHouse/pull/46161) ([attack204](https://github.com/attack204)). +* Functions "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" now reject regexes which will likely evaluate very slowly in vectorscan. [#46167](https://github.com/ClickHouse/ClickHouse/pull/46167) ([Robert Schulze](https://github.com/rschu1ze)). +* When `insert_null_as_default` is enabled and column doesn't have defined default value, the default of column type will be used. Also this PR fixes using default values on nulls in case of LowCardinality columns. [#46171](https://github.com/ClickHouse/ClickHouse/pull/46171) ([Kruglov Pavel](https://github.com/Avogar)). +* Prefer explicitly defined access keys for S3 clients. If `use_environment_credentials` is set to `true`, and the user has provided the access key through query or config, they will be used instead of the ones from the environment variable. [#46191](https://github.com/ClickHouse/ClickHouse/pull/46191) ([Antonio Andelic](https://github.com/antonio2368)). +* Add an alias "DATE_FORMAT()" for function "formatDateTime()" to improve compatibility with MySQL's SQL dialect, extend function `formatDateTime` with substitutions "a", "b", "c", "h", "i", "k", "l" "r", "s", "W". ### Documentation entry for user-facing changes User-readable short description: `DATE_FORMAT` is an alias of `formatDateTime`. Formats a Time according to the given Format string. Format is a constant expression, so you cannot have multiple formats for a single result column. (Provide link to [formatDateTime](https://clickhouse.com/docs/ja/sql-reference/functions/date-time-functions/#formatdatetime)). [#46302](https://github.com/ClickHouse/ClickHouse/pull/46302) ([Jake Bamrah](https://github.com/JakeBamrah)). +* Add `ProfileEvents` and `CurrentMetrics` about the callback tasks for parallel replicas (`s3Cluster` and `MergeTree` tables). [#46313](https://github.com/ClickHouse/ClickHouse/pull/46313) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add support for `DELETE` and `UPDATE` for tables using `KeeperMap` storage engine. [#46330](https://github.com/ClickHouse/ClickHouse/pull/46330) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow writing RENAME queries with query parameters. Resolves [#45778](https://github.com/ClickHouse/ClickHouse/issues/45778). [#46407](https://github.com/ClickHouse/ClickHouse/pull/46407) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix parameterized SELECT queries with REPLACE transformer. Resolves [#33002](https://github.com/ClickHouse/ClickHouse/issues/33002). [#46420](https://github.com/ClickHouse/ClickHouse/pull/46420) ([Nikolay Degterinsky](https://github.com/evillique)). +* Exclude the internal database used for temporary/external tables from the calculation of asynchronous metric "NumberOfDatabases". This makes the behavior consistent with system table "system.databases". [#46435](https://github.com/ClickHouse/ClickHouse/pull/46435) ([Robert Schulze](https://github.com/rschu1ze)). +* Added `last_exception_time` column into distribution_queue table. [#46564](https://github.com/ClickHouse/ClickHouse/pull/46564) ([Aleksandr](https://github.com/AVMusorin)). +* Support for IN clause with parameter in parameterized views. [#46583](https://github.com/ClickHouse/ClickHouse/pull/46583) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Do not load named collections on server startup (load them on first access instead). [#46607](https://github.com/ClickHouse/ClickHouse/pull/46607) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +#### Build/Testing/Packaging Improvement +* Introduce GWP-ASan implemented by the LLVM runtime. This closes [#27039](https://github.com/ClickHouse/ClickHouse/issues/27039). [#45226](https://github.com/ClickHouse/ClickHouse/pull/45226) ([Han Fei](https://github.com/hanfei1991)). +* We want to make our tests less stable and more flaky: add randomization for merge tree settings in tests. [#38983](https://github.com/ClickHouse/ClickHouse/pull/38983) ([Anton Popov](https://github.com/CurtizJ)). +* Enable the HDFS support in PowerPC and which helps to fixes the following functional tests 02113_hdfs_assert.sh, 02244_hdfs_cluster.sql and 02368_cancel_write_into_hdfs.sh. [#44949](https://github.com/ClickHouse/ClickHouse/pull/44949) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Add systemd.service file for clickhouse-keeper. Fixes [#44293](https://github.com/ClickHouse/ClickHouse/issues/44293). [#45568](https://github.com/ClickHouse/ClickHouse/pull/45568) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* ClickHouse's fork of poco was moved from "contrib/" to "base/poco/". [#46075](https://github.com/ClickHouse/ClickHouse/pull/46075) ([Robert Schulze](https://github.com/rschu1ze)). +* Add an option for `clickhouse-watchdog` to restart the child process. This does not make a lot of use. [#46312](https://github.com/ClickHouse/ClickHouse/pull/46312) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* If the environment variable `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` is set to 1, the Docker container will run `clickhouse-server` as a child instead of the first process, and restart it when it exited. [#46391](https://github.com/ClickHouse/ClickHouse/pull/46391) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix Systemd service file. [#46461](https://github.com/ClickHouse/ClickHouse/pull/46461) ([SuperDJY](https://github.com/cmsxbc)). +* Raised the minimum Clang version needed to build ClickHouse from 12 to 15. [#46710](https://github.com/ClickHouse/ClickHouse/pull/46710) ([Robert Schulze](https://github.com/rschu1ze)). +* Upgrade Intel QPL from v0.3.0 to v1.0.0 2. Build libaccel-config and link it statically to QPL library instead of dynamically. [#45809](https://github.com/ClickHouse/ClickHouse/pull/45809) ([jasperzhu](https://github.com/jinjunzh)). + + +#### Bug Fix (user-visible misbehavior in official stable release) + +* Flush data exactly by `rabbitmq_flush_interval_ms` or by `rabbitmq_max_block_size` in `StorageRabbitMQ`. Closes [#42389](https://github.com/ClickHouse/ClickHouse/issues/42389). Closes [#45160](https://github.com/ClickHouse/ClickHouse/issues/45160). [#44404](https://github.com/ClickHouse/ClickHouse/pull/44404) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Use PODArray to render in sparkBar function, so we can control the memory usage. Close [#44467](https://github.com/ClickHouse/ClickHouse/issues/44467). [#44489](https://github.com/ClickHouse/ClickHouse/pull/44489) ([Duc Canh Le](https://github.com/canhld94)). +* Fix functions (quantilesExactExclusive, quantilesExactInclusive) return unsorted array element. [#45379](https://github.com/ClickHouse/ClickHouse/pull/45379) ([wujunfu](https://github.com/wujunfu)). +* Fix uncaught exception in HTTPHandler when open telemetry is enabled. [#45456](https://github.com/ClickHouse/ClickHouse/pull/45456) ([Frank Chen](https://github.com/FrankChen021)). +* Don't infer Dates from 8 digit numbers. It could lead to wrong data to be read. [#45581](https://github.com/ClickHouse/ClickHouse/pull/45581) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes to correctly use `odbc_bridge_use_connection_pooling` setting. [#45591](https://github.com/ClickHouse/ClickHouse/pull/45591) ([Bharat Nallan](https://github.com/bharatnc)). +* When the callback in the cache is called, it is possible that this cache is destructed. To keep it safe, we capture members by value. It's also safe for task schedule because it will be deactivated before storage is destroyed. Resolve [#45548](https://github.com/ClickHouse/ClickHouse/issues/45548). [#45601](https://github.com/ClickHouse/ClickHouse/pull/45601) ([Han Fei](https://github.com/hanfei1991)). +* Fix data corruption when codecs Delta or DoubleDelta are combined with codec Gorilla. [#45615](https://github.com/ClickHouse/ClickHouse/pull/45615) ([Robert Schulze](https://github.com/rschu1ze)). +* Correctly check types when using N-gram bloom filter index to avoid invalid reads. [#45617](https://github.com/ClickHouse/ClickHouse/pull/45617) ([Antonio Andelic](https://github.com/antonio2368)). +* A couple of segfaults have been reported around `c-ares`. They were introduced in my previous pull requests. I have fixed them with the help of Alexander Tokmakov. [#45629](https://github.com/ClickHouse/ClickHouse/pull/45629) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix key description when encountering duplicate primary keys. This can happen in projections. See [#45590](https://github.com/ClickHouse/ClickHouse/issues/45590) for details. [#45686](https://github.com/ClickHouse/ClickHouse/pull/45686) ([Amos Bird](https://github.com/amosbird)). +* Set compression method and level for backup Closes [#45690](https://github.com/ClickHouse/ClickHouse/issues/45690). [#45737](https://github.com/ClickHouse/ClickHouse/pull/45737) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Should use `select_query_typed.limitByOffset` instead of `select_query_typed.limitOffset`. [#45817](https://github.com/ClickHouse/ClickHouse/pull/45817) ([刘陶峰](https://github.com/taofengliu)). +* When use experimental analyzer, queries like `SELECT number FROM numbers(100) LIMIT 10 OFFSET 10;` get wrong results (empty result for this sql). That is caused by an unnecessary offset step added by planner. [#45822](https://github.com/ClickHouse/ClickHouse/pull/45822) ([刘陶峰](https://github.com/taofengliu)). +* Backward compatibility - allow implicit narrowing conversion from UInt64 to IPv4 - required for "INSERT ... VALUES ..." expression. [#45865](https://github.com/ClickHouse/ClickHouse/pull/45865) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Bugfix IPv6 parser for mixed ip4 address with missed first octet (like `::.1.2.3`). [#45871](https://github.com/ClickHouse/ClickHouse/pull/45871) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add the `query_kind` column to the `system.processes` table and the `SHOW PROCESSLIST` query. Remove duplicate code. It fixes a bug: the global configuration parameter `max_concurrent_select_queries` was not respected to queries with `INTERSECT` or `EXCEPT` chains. [#45872](https://github.com/ClickHouse/ClickHouse/pull/45872) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix crash in a function `stochasticLinearRegression`. Found by WingFuzz. [#45985](https://github.com/ClickHouse/ClickHouse/pull/45985) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in `SELECT` queries with `INTERSECT` and `EXCEPT` modifiers that read data from tables with enabled sparse columns (controlled by setting `ratio_of_defaults_for_sparse_serialization`). [#45987](https://github.com/ClickHouse/ClickHouse/pull/45987) ([Anton Popov](https://github.com/CurtizJ)). +* Fix read in order optimization for DESC sorting with FINAL, close [#45815](https://github.com/ClickHouse/ClickHouse/issues/45815). [#46009](https://github.com/ClickHouse/ClickHouse/pull/46009) ([Vladimir C](https://github.com/vdimir)). +* Fix reading of non existing nested columns with multiple level in compact parts. [#46045](https://github.com/ClickHouse/ClickHouse/pull/46045) ([Azat Khuzhin](https://github.com/azat)). +* Fix elapsed column in system.processes (10x error). [#46047](https://github.com/ClickHouse/ClickHouse/pull/46047) ([Azat Khuzhin](https://github.com/azat)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native https://github.com/ClickHouse/ClickHouse/pull/43221. [#46087](https://github.com/ClickHouse/ClickHouse/pull/46087) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix environment variable substitution in the configuration when a parameter already has a value. This closes [#46131](https://github.com/ClickHouse/ClickHouse/issues/46131). This closes [#9547](https://github.com/ClickHouse/ClickHouse/issues/9547). [#46144](https://github.com/ClickHouse/ClickHouse/pull/46144) ([pufit](https://github.com/pufit)). +* Fix incorrect predicate push down with grouping sets. Closes [#45947](https://github.com/ClickHouse/ClickHouse/issues/45947). [#46151](https://github.com/ClickHouse/ClickHouse/pull/46151) ([flynn](https://github.com/ucasfl)). +* Fix possible pipeline stuck error on `fulls_sorting_join` with constant keys. [#46175](https://github.com/ClickHouse/ClickHouse/pull/46175) ([Vladimir C](https://github.com/vdimir)). +* Never rewrite tuple functions as literals during formatting to avoid incorrect results. [#46232](https://github.com/ClickHouse/ClickHouse/pull/46232) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix possible out of bounds error while reading LowCardinality(Nullable) in Arrow format. [#46270](https://github.com/ClickHouse/ClickHouse/pull/46270) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `SYSTEM UNFREEZE` queries failing with the exception `CANNOT_PARSE_INPUT_ASSERTION_FAILED`. [#46325](https://github.com/ClickHouse/ClickHouse/pull/46325) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix possible crash which can be caused by an integer overflow while deserializing aggregating state of a function that stores HashTable. [#46349](https://github.com/ClickHouse/ClickHouse/pull/46349) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible `LOGICAL_ERROR` in asynchronous inserts with invalid data sent in format `VALUES`. [#46350](https://github.com/ClickHouse/ClickHouse/pull/46350) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed a LOGICAL_ERROR on an attempt to execute `ALTER ... MOVE PART ... TO TABLE`. This type of query was never actually supported. [#46359](https://github.com/ClickHouse/ClickHouse/pull/46359) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix s3Cluster schema inference in parallel distributed insert select when `parallel_distributed_insert_select` is enabled. [#46381](https://github.com/ClickHouse/ClickHouse/pull/46381) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix queries like `ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ...`, where `arr1` and `arr2` are fields of the same `Nested` column. [#46387](https://github.com/ClickHouse/ClickHouse/pull/46387) ([Anton Popov](https://github.com/CurtizJ)). +* Scheduler may fail to schedule a task. If it happens, the whole MulityPartUpload should be aborted and `UploadHelper` must wait for already scheduled tasks. [#46451](https://github.com/ClickHouse/ClickHouse/pull/46451) ([Dmitry Novik](https://github.com/novikd)). +* Fix PREWHERE for Merge with different default types (fixes some `NOT_FOUND_COLUMN_IN_BLOCK` when the default type for the column differs, also allow `PREWHERE` when the type of column is the same across tables, and prohibit it, only if it differs). [#46454](https://github.com/ClickHouse/ClickHouse/pull/46454) ([Azat Khuzhin](https://github.com/azat)). +* Fix a crash that could happen when constant values are used in `ORDER BY`. Fixes [#46466](https://github.com/ClickHouse/ClickHouse/issues/46466). [#46493](https://github.com/ClickHouse/ClickHouse/pull/46493) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not throw exception if `disk` setting was specified on query level, but `storage_policy` was specified in config merge tree settings section. `disk` will override setting from config. [#46533](https://github.com/ClickHouse/ClickHouse/pull/46533) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix an invalid processing of constant `LowCardinality` argument in function `arrayMap`. This bug could lead to a segfault in release, and logical error `Bad cast` in debug build. [#46569](https://github.com/ClickHouse/ClickHouse/pull/46569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* fixes [#46557](https://github.com/ClickHouse/ClickHouse/issues/46557). [#46611](https://github.com/ClickHouse/ClickHouse/pull/46611) ([Alexander Gololobov](https://github.com/davenger)). +* Fix endless restarts of clickhouse-server systemd unit if server cannot start within 1m30sec (Disable timeout logic for starting clickhouse-server from systemd service). [#46613](https://github.com/ClickHouse/ClickHouse/pull/46613) ([Azat Khuzhin](https://github.com/azat)). +* Allocated during asynchronous inserts memory buffers were deallocated in the global context and MemoryTracker counters for corresponding user and query were not updated correctly. That led to false positive OOM exceptions. [#46622](https://github.com/ClickHouse/ClickHouse/pull/46622) ([Dmitry Novik](https://github.com/novikd)). +* Updated to not clear on_expression from table_join as its used by future analyze runs resolves [#45185](https://github.com/ClickHouse/ClickHouse/issues/45185). [#46487](https://github.com/ClickHouse/ClickHouse/pull/46487) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). + + +### ClickHouse release 23.1, 2023-01-26 {#231} + +### ClickHouse release 23.1 + +#### Upgrade Notes +* The `SYSTEM RESTART DISK` query becomes a no-op. [#44647](https://github.com/ClickHouse/ClickHouse/pull/44647) ([alesapin](https://github.com/alesapin)). +* The `PREALLOCATE` option for `HASHED`/`SPARSE_HASHED` dictionaries becomes a no-op. [#45388](https://github.com/ClickHouse/ClickHouse/pull/45388) ([Azat Khuzhin](https://github.com/azat)). It does not give significant advantages anymore. +* Disallow `Gorilla` codec on columns of non-Float32 or non-Float64 type. [#45252](https://github.com/ClickHouse/ClickHouse/pull/45252) ([Robert Schulze](https://github.com/rschu1ze)). It was pointless and led to inconsistencies. +* Parallel quorum inserts might work incorrectly with `*MergeTree` tables created with the deprecated syntax. Therefore, parallel quorum inserts support is completely disabled for such tables. It does not affect tables created with a new syntax. [#45430](https://github.com/ClickHouse/ClickHouse/pull/45430) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Use the `GetObjectAttributes` request instead of the `HeadObject` request to get the size of an object in AWS S3. This change fixes handling endpoints without explicit regions after updating the AWS SDK, for example. [#45288](https://github.com/ClickHouse/ClickHouse/pull/45288) ([Vitaly Baranov](https://github.com/vitlibar)). AWS S3 and Minio are tested, but keep in mind that various S3-compatible services (GCS, R2, B2) may have subtle incompatibilities. This change also may require you to adjust the ACL to allow the `GetObjectAttributes` request. +* Forbid paths in timezone names. For example, a timezone name like `/usr/share/zoneinfo/Asia/Aden` is not allowed; the IANA timezone database name like `Asia/Aden` should be used. [#44225](https://github.com/ClickHouse/ClickHouse/pull/44225) ([Kruglov Pavel](https://github.com/Avogar)). +* Queries combining equijoin and constant expressions (e.g., `JOIN ON t1.x = t2.x AND 1 = 1`) are forbidden due to incorrect results. [#44016](https://github.com/ClickHouse/ClickHouse/pull/44016) ([Vladimir C](https://github.com/vdimir)). + + +#### New Feature +* Dictionary source for extracting keys by traversing regular expressions tree. It can be used for User-Agent parsing. [#40878](https://github.com/ClickHouse/ClickHouse/pull/40878) ([Vage Ogannisian](https://github.com/nooblose)). [#43858](https://github.com/ClickHouse/ClickHouse/pull/43858) ([Han Fei](https://github.com/hanfei1991)). +* Added parametrized view functionality, now it's possible to specify query parameters for the View table engine. resolves [#40907](https://github.com/ClickHouse/ClickHouse/issues/40907). [#41687](https://github.com/ClickHouse/ClickHouse/pull/41687) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `quantileInterpolatedWeighted`/`quantilesInterpolatedWeighted` functions. [#38252](https://github.com/ClickHouse/ClickHouse/pull/38252) ([Bharat Nallan](https://github.com/bharatnc)). +* Array join support for the `Map` type, like the function "explode" in Spark. [#43239](https://github.com/ClickHouse/ClickHouse/pull/43239) ([李扬](https://github.com/taiyang-li)). +* Support SQL standard binary and hex string literals. [#43785](https://github.com/ClickHouse/ClickHouse/pull/43785) ([Mo Xuan](https://github.com/mo-avatar)). +* Allow formatting `DateTime` in Joda-Time style. Refer to [the Joda-Time docs](https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html). [#43818](https://github.com/ClickHouse/ClickHouse/pull/43818) ([李扬](https://github.com/taiyang-li)). +* Implemented a fractional second formatter (`%f`) for `formatDateTime`. [#44060](https://github.com/ClickHouse/ClickHouse/pull/44060) ([ltrk2](https://github.com/ltrk2)). [#44497](https://github.com/ClickHouse/ClickHouse/pull/44497) ([Alexander Gololobov](https://github.com/davenger)). +* Added `age` function to calculate the difference between two dates or dates with time values expressed as the number of full units. Closes [#41115](https://github.com/ClickHouse/ClickHouse/issues/41115). [#44421](https://github.com/ClickHouse/ClickHouse/pull/44421) ([Robert Schulze](https://github.com/rschu1ze)). +* Add `Null` source for dictionaries. Closes [#44240](https://github.com/ClickHouse/ClickHouse/issues/44240). [#44502](https://github.com/ClickHouse/ClickHouse/pull/44502) ([mayamika](https://github.com/mayamika)). +* Allow configuring the S3 storage class with the `s3_storage_class` configuration option. Such as `STANDARD/INTELLIGENT_TIERING` Closes [#44443](https://github.com/ClickHouse/ClickHouse/issues/44443). [#44707](https://github.com/ClickHouse/ClickHouse/pull/44707) ([chen](https://github.com/xiedeyantu)). +* Insert default values in case of missing elements in JSON object while parsing named tuple. Add setting `input_format_json_defaults_for_missing_elements_in_named_tuple` that controls this behaviour. Closes [#45142](https://github.com/ClickHouse/ClickHouse/issues/45142)#issuecomment-1380153217. [#45231](https://github.com/ClickHouse/ClickHouse/pull/45231) ([Kruglov Pavel](https://github.com/Avogar)). +* Record server startup time in ProfileEvents (`ServerStartupMilliseconds`). Resolves [#43188](https://github.com/ClickHouse/ClickHouse/issues/43188). [#45250](https://github.com/ClickHouse/ClickHouse/pull/45250) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Refactor and Improve streaming engines Kafka/RabbitMQ/NATS and add support for all formats, also refactor formats a bit: - Fix producing messages in row-based formats with suffixes/prefixes. Now every message is formatted completely with all delimiters and can be parsed back using input format. - Support block-based formats like Native, Parquet, ORC, etc. Every block is formatted as a separate message. The number of rows in one message depends on the block size, so you can control it via the setting `max_block_size`. - Add new engine settings `kafka_max_rows_per_message/rabbitmq_max_rows_per_message/nats_max_rows_per_message`. They control the number of rows formatted in one message in row-based formats. Default value: 1. - Fix high memory consumption in the NATS table engine. - Support arbitrary binary data in NATS producer (previously it worked only with strings contained \0 at the end) - Add missing Kafka/RabbitMQ/NATS engine settings in the documentation. - Refactor producing and consuming in Kafka/RabbitMQ/NATS, separate it from WriteBuffers/ReadBuffers semantic. - Refactor output formats: remove callbacks on each row used in Kafka/RabbitMQ/NATS (now we don't use callbacks there), allow to use IRowOutputFormat directly, clarify row end and row between delimiters, make it possible to reset output format to start formatting again - Add proper implementation in formatRow function (bonus after formats refactoring). [#42777](https://github.com/ClickHouse/ClickHouse/pull/42777) ([Kruglov Pavel](https://github.com/Avogar)). +* Support reading/writing `Nested` tables as `List` of `Struct` in `CapnProto` format. Read/write `Decimal32/64` as `Int32/64`. Closes [#43319](https://github.com/ClickHouse/ClickHouse/issues/43319). [#43379](https://github.com/ClickHouse/ClickHouse/pull/43379) ([Kruglov Pavel](https://github.com/Avogar)). +* Added a `message_format_string` column to `system.text_log`. The column contains a pattern that was used to format the message. [#44543](https://github.com/ClickHouse/ClickHouse/pull/44543) ([Alexander Tokmakov](https://github.com/tavplubix)). This allows various analytics over the ClickHouse logs. +* Try to autodetect headers with column names (and maybe types) for CSV/TSV/CustomSeparated input formats. +Add settings input_format_tsv/csv/custom_detect_header that enable this behaviour (enabled by default). Closes [#44640](https://github.com/ClickHouse/ClickHouse/issues/44640). [#44953](https://github.com/ClickHouse/ClickHouse/pull/44953) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Experimental Feature +* Add an experimental inverted index as a new secondary index type for efficient text search. [#38667](https://github.com/ClickHouse/ClickHouse/pull/38667) ([larryluogit](https://github.com/larryluogit)). +* Add experimental query result cache. [#43797](https://github.com/ClickHouse/ClickHouse/pull/43797) ([Robert Schulze](https://github.com/rschu1ze)). +* Added extendable and configurable scheduling subsystem for IO requests (not yet integrated with IO code itself). [#41840](https://github.com/ClickHouse/ClickHouse/pull/41840) ([Sergei Trifonov](https://github.com/serxa)). This feature does nothing at all, enjoy. +* Added `SYSTEM DROP DATABASE REPLICA` that removes metadata of a dead replica of a `Replicated` database. Resolves [#41794](https://github.com/ClickHouse/ClickHouse/issues/41794). [#42807](https://github.com/ClickHouse/ClickHouse/pull/42807) ([Alexander Tokmakov](https://github.com/tavplubix)). + +#### Performance Improvement +* Do not load inactive parts at startup of `MergeTree` tables. [#42181](https://github.com/ClickHouse/ClickHouse/pull/42181) ([Anton Popov](https://github.com/CurtizJ)). +* Improved latency of reading from storage `S3` and table function `s3` with large numbers of small files. Now settings `remote_filesystem_read_method` and `remote_filesystem_read_prefetch` take effect while reading from storage `S3`. [#43726](https://github.com/ClickHouse/ClickHouse/pull/43726) ([Anton Popov](https://github.com/CurtizJ)). +* Optimization for reading struct fields in Parquet/ORC files. Only the required fields are loaded. [#44484](https://github.com/ClickHouse/ClickHouse/pull/44484) ([lgbo](https://github.com/lgbo-ustc)). +* Two-level aggregation algorithm was mistakenly disabled for queries over the HTTP interface. It was enabled back, and it leads to a major performance improvement. [#45450](https://github.com/ClickHouse/ClickHouse/pull/45450) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added mmap support for StorageFile, which should improve the performance of clickhouse-local. [#43927](https://github.com/ClickHouse/ClickHouse/pull/43927) ([pufit](https://github.com/pufit)). +* Added sharding support in HashedDictionary to allow parallel load (almost linear scaling based on number of shards). [#40003](https://github.com/ClickHouse/ClickHouse/pull/40003) ([Azat Khuzhin](https://github.com/azat)). +* Speed up query parsing. [#42284](https://github.com/ClickHouse/ClickHouse/pull/42284) ([Raúl Marín](https://github.com/Algunenano)). +* Always replace OR chain `expr = x1 OR ... OR expr = xN` to `expr IN (x1, ..., xN)` in the case where `expr` is a `LowCardinality` column. Setting `optimize_min_equality_disjunction_chain_length` is ignored in this case. [#42889](https://github.com/ClickHouse/ClickHouse/pull/42889) ([Guo Wangyang](https://github.com/guowangy)). +* Slightly improve performance by optimizing the code around ThreadStatus. [#43586](https://github.com/ClickHouse/ClickHouse/pull/43586) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Optimize the column-wise ternary logic evaluation by achieving auto-vectorization. In the performance test of this [microbenchmark](https://github.com/ZhiguoZh/ClickHouse/blob/20221123-ternary-logic-opt-example/src/Functions/examples/associative_applier_perf.cpp), we've observed a peak **performance gain** of **21x** on the ICX device (Intel Xeon Platinum 8380 CPU). [#43669](https://github.com/ClickHouse/ClickHouse/pull/43669) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Avoid acquiring read locks in the `system.tables` table if possible. [#43840](https://github.com/ClickHouse/ClickHouse/pull/43840) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize ThreadPool. The performance experiments of SSB (Star Schema Benchmark) on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) shows that this change could effectively decrease the lock contention for ThreadPoolImpl::mutex by **75%**, increasing the CPU utilization and improving the overall performance by **2.4%**. [#44308](https://github.com/ClickHouse/ClickHouse/pull/44308) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Now the optimisation for predicting the hash table size is applied only if the cached hash table size is sufficiently large (thresholds were determined empirically and hardcoded). [#44455](https://github.com/ClickHouse/ClickHouse/pull/44455) ([Nikita Taranov](https://github.com/nickitat)). +* Small performance improvement for asynchronous reading from remote filesystems. [#44868](https://github.com/ClickHouse/ClickHouse/pull/44868) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add fast path for: - `col like '%%'`; - `col like '%'`; - `col not like '%'`; - `col not like '%'`; - `match(col, '.*')`. [#45244](https://github.com/ClickHouse/ClickHouse/pull/45244) ([李扬](https://github.com/taiyang-li)). +* Slightly improve happy path optimisation in filtering (WHERE clause). [#45289](https://github.com/ClickHouse/ClickHouse/pull/45289) ([Nikita Taranov](https://github.com/nickitat)). +* Provide monotonicity info for `toUnixTimestamp64*` to enable more algebraic optimizations for index analysis. [#44116](https://github.com/ClickHouse/ClickHouse/pull/44116) ([Nikita Taranov](https://github.com/nickitat)). +* Allow the configuration of temporary data for query processing (spilling to disk) to cooperate with the filesystem cache (taking up the space from the cache disk) [#43972](https://github.com/ClickHouse/ClickHouse/pull/43972) ([Vladimir C](https://github.com/vdimir)). This mainly improves [ClickHouse Cloud](https://clickhouse.cloud/), but can be used for self-managed setups as well, if you know what to do. +* Make `system.replicas` table do parallel fetches of replicas statuses. Closes [#43918](https://github.com/ClickHouse/ClickHouse/issues/43918). [#43998](https://github.com/ClickHouse/ClickHouse/pull/43998) ([Nikolay Degterinsky](https://github.com/evillique)). +* Optimize memory consumption during backup to S3: files to S3 now will be copied directly without using `WriteBufferFromS3` (which could use a lot of memory). [#45188](https://github.com/ClickHouse/ClickHouse/pull/45188) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add a cache for async block ids. This will reduce the number of requests of ZooKeeper when we enable async inserts deduplication. [#45106](https://github.com/ClickHouse/ClickHouse/pull/45106) ([Han Fei](https://github.com/hanfei1991)). + +#### Improvement + +* Use structure from insertion table in generateRandom without arguments. [#45239](https://github.com/ClickHouse/ClickHouse/pull/45239) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to implicitly convert floats stored in string fields of JSON to integers in `JSONExtract` functions. E.g. `JSONExtract('{"a": "1000.111"}', 'a', 'UInt64')` -> `1000`, previously it returned 0. [#45432](https://github.com/ClickHouse/ClickHouse/pull/45432) ([Anton Popov](https://github.com/CurtizJ)). +* Added fields `supports_parallel_parsing` and `supports_parallel_formatting` to table `system.formats` for better introspection. [#45499](https://github.com/ClickHouse/ClickHouse/pull/45499) ([Anton Popov](https://github.com/CurtizJ)). +* Improve reading CSV field in CustomSeparated/Template format. Closes [#42352](https://github.com/ClickHouse/ClickHouse/issues/42352) Closes [#39620](https://github.com/ClickHouse/ClickHouse/issues/39620). [#43332](https://github.com/ClickHouse/ClickHouse/pull/43332) ([Kruglov Pavel](https://github.com/Avogar)). +* Unify query elapsed time measurements. [#43455](https://github.com/ClickHouse/ClickHouse/pull/43455) ([Raúl Marín](https://github.com/Algunenano)). +* Improve automatic usage of structure from insertion table in table functions file/hdfs/s3 when virtual columns are present in a select query, it fixes the possible error `Block structure mismatch` or `number of columns mismatch`. [#43695](https://github.com/ClickHouse/ClickHouse/pull/43695) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for signed arguments in the function `range`. Fixes [#43333](https://github.com/ClickHouse/ClickHouse/issues/43333). [#43733](https://github.com/ClickHouse/ClickHouse/pull/43733) ([sanyu](https://github.com/wineternity)). +* Remove redundant sorting, for example, sorting related ORDER BY clauses in subqueries. Implemented on top of query plan. It does similar optimization as `optimize_duplicate_order_by_and_distinct` regarding `ORDER BY` clauses, but more generic, since it's applied to any redundant sorting steps (not only caused by ORDER BY clause) and applied to subqueries of any depth. Related to [#42648](https://github.com/ClickHouse/ClickHouse/issues/42648). [#43905](https://github.com/ClickHouse/ClickHouse/pull/43905) ([Igor Nikonov](https://github.com/devcrafter)). +* Add the ability to disable deduplication of files for BACKUP (for backups without deduplication ATTACH can be used instead of full RESTORE). For example `BACKUP foo TO S3(...) SETTINGS deduplicate_files=0` (default `deduplicate_files=1`). [#43947](https://github.com/ClickHouse/ClickHouse/pull/43947) ([Azat Khuzhin](https://github.com/azat)). +* Refactor and improve schema inference for text formats. Add new setting `schema_inference_make_columns_nullable` that controls making result types `Nullable` (enabled by default);. [#44019](https://github.com/ClickHouse/ClickHouse/pull/44019) ([Kruglov Pavel](https://github.com/Avogar)). +* Better support for `PROXYv1` protocol. [#44135](https://github.com/ClickHouse/ClickHouse/pull/44135) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add information about the latest part check by cleanup threads into `system.parts` table. [#44244](https://github.com/ClickHouse/ClickHouse/pull/44244) ([Dmitry Novik](https://github.com/novikd)). +* Disable table functions in readonly mode for inserts. [#44290](https://github.com/ClickHouse/ClickHouse/pull/44290) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add a setting `simultaneous_parts_removal_limit` to allow limiting the number of parts being processed by one iteration of CleanupThread. [#44461](https://github.com/ClickHouse/ClickHouse/pull/44461) ([Dmitry Novik](https://github.com/novikd)). +* Do not initialize ReadBufferFromS3 when only virtual columns are needed in a query. This may be helpful to [#44246](https://github.com/ClickHouse/ClickHouse/issues/44246). [#44493](https://github.com/ClickHouse/ClickHouse/pull/44493) ([chen](https://github.com/xiedeyantu)). +* Prevent duplicate column names hints. Closes [#44130](https://github.com/ClickHouse/ClickHouse/issues/44130). [#44519](https://github.com/ClickHouse/ClickHouse/pull/44519) ([Joanna Hulboj](https://github.com/jh0x)). +* Allow macro substitution in endpoint of disks. Resolve [#40951](https://github.com/ClickHouse/ClickHouse/issues/40951). [#44533](https://github.com/ClickHouse/ClickHouse/pull/44533) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Improve schema inference when `input_format_json_read_object_as_string` is enabled. [#44546](https://github.com/ClickHouse/ClickHouse/pull/44546) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a user-level setting `database_replicated_allow_replicated_engine_arguments` which allows banning the creation of `ReplicatedMergeTree` tables with arguments in `DatabaseReplicated`. [#44566](https://github.com/ClickHouse/ClickHouse/pull/44566) ([alesapin](https://github.com/alesapin)). +* Prevent users from mistakenly specifying zero (invalid) value for `index_granularity`. This closes [#44536](https://github.com/ClickHouse/ClickHouse/issues/44536). [#44578](https://github.com/ClickHouse/ClickHouse/pull/44578) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added possibility to set path to service keytab file in `keytab` parameter in `kerberos` section of config.xml. [#44594](https://github.com/ClickHouse/ClickHouse/pull/44594) ([Roman Vasin](https://github.com/rvasin)). +* Use already written part of the query for fuzzy search (pass to the `skim` library, which is written in Rust and linked statically to ClickHouse). [#44600](https://github.com/ClickHouse/ClickHouse/pull/44600) ([Azat Khuzhin](https://github.com/azat)). +* Enable `input_format_json_read_objects_as_strings` by default to be able to read nested JSON objects while JSON Object type is experimental. [#44657](https://github.com/ClickHouse/ClickHouse/pull/44657) ([Kruglov Pavel](https://github.com/Avogar)). +* Improvement for deduplication of async inserts: when users do duplicate async inserts, we should deduplicate inside the memory before we query Keeper. [#44682](https://github.com/ClickHouse/ClickHouse/pull/44682) ([Han Fei](https://github.com/hanfei1991)). +* Input/output `Avro` format will parse bool type as ClickHouse bool type. [#44684](https://github.com/ClickHouse/ClickHouse/pull/44684) ([Kruglov Pavel](https://github.com/Avogar)). +* Support Bool type in Arrow/Parquet/ORC. Closes [#43970](https://github.com/ClickHouse/ClickHouse/issues/43970). [#44698](https://github.com/ClickHouse/ClickHouse/pull/44698) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't greedily parse beyond the quotes when reading UUIDs - it may lead to mistakenly successful parsing of incorrect data. [#44686](https://github.com/ClickHouse/ClickHouse/pull/44686) ([Raúl Marín](https://github.com/Algunenano)). +* Infer UInt64 in case of Int64 overflow and fix some transforms in schema inference. [#44696](https://github.com/ClickHouse/ClickHouse/pull/44696) ([Kruglov Pavel](https://github.com/Avogar)). +* Previously dependency resolving inside `Replicated` database was done in a hacky way, and now it's done right using an explicit graph. [#44697](https://github.com/ClickHouse/ClickHouse/pull/44697) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `output_format_pretty_row_numbers` does not preserve the counter across the blocks. Closes [#44815](https://github.com/ClickHouse/ClickHouse/issues/44815). [#44832](https://github.com/ClickHouse/ClickHouse/pull/44832) ([flynn](https://github.com/ucasfl)). +* Don't report errors in `system.errors` due to parts being merged concurrently with the background cleanup process. [#44874](https://github.com/ClickHouse/ClickHouse/pull/44874) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize and fix metrics for Distributed async INSERT. [#44922](https://github.com/ClickHouse/ClickHouse/pull/44922) ([Azat Khuzhin](https://github.com/azat)). +* Added settings to disallow concurrent backups and restores resolves [#43891](https://github.com/ClickHouse/ClickHouse/issues/43891) Implementation: * Added server-level settings to disallow concurrent backups and restores, which are read and set when BackupWorker is created in Context. * Settings are set to true by default. * Before starting backup or restores, added a check to see if any other backups/restores are running. For internal requests, it checks if it is from the self node using backup_uuid. [#45072](https://github.com/ClickHouse/ClickHouse/pull/45072) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `` config parameter for system logs. [#45320](https://github.com/ClickHouse/ClickHouse/pull/45320) ([Stig Bakken](https://github.com/stigsb)). + +#### Build/Testing/Packaging Improvement +* Statically link with the `skim` library (it is written in Rust) for fuzzy search in clickhouse client/local history. [#44239](https://github.com/ClickHouse/ClickHouse/pull/44239) ([Azat Khuzhin](https://github.com/azat)). +* We removed support for shared linking because of Rust. Actually, Rust is only an excuse for this removal, and we wanted to remove it nevertheless. [#44828](https://github.com/ClickHouse/ClickHouse/pull/44828) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the dependency on the `adduser` tool from the packages, because we don't use it. This fixes [#44934](https://github.com/ClickHouse/ClickHouse/issues/44934). [#45011](https://github.com/ClickHouse/ClickHouse/pull/45011) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `SQLite` library is updated to the latest. It is used for the SQLite database and table integration engines. Also, fixed a false-positive TSan report. This closes [#45027](https://github.com/ClickHouse/ClickHouse/issues/45027). [#45031](https://github.com/ClickHouse/ClickHouse/pull/45031) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* CRC-32 changes to address the WeakHash collision issue in PowerPC. [#45144](https://github.com/ClickHouse/ClickHouse/pull/45144) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Update aws-c* submodules [#43020](https://github.com/ClickHouse/ClickHouse/pull/43020) ([Vitaly Baranov](https://github.com/vitlibar)). +* Automatically merge green backport PRs and green approved PRs [#41110](https://github.com/ClickHouse/ClickHouse/pull/41110) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Introduce a [website](https://aretestsgreenyet.com/) for the status of ClickHouse CI. [Source](https://github.com/ClickHouse/aretestsgreenyet). + +#### Bug Fix + +* Replace domain IP types (IPv4, IPv6) with native. [#43221](https://github.com/ClickHouse/ClickHouse/pull/43221) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). It automatically fixes some missing implementations in the code. +* Fix the backup process if mutations get killed during the backup process. [#45351](https://github.com/ClickHouse/ClickHouse/pull/45351) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix the `Invalid number of rows in Chunk` exception message. [#41404](https://github.com/ClickHouse/ClickHouse/issues/41404). [#42126](https://github.com/ClickHouse/ClickHouse/pull/42126) ([Alexander Gololobov](https://github.com/davenger)). +* Fix possible use of an uninitialized value after executing expressions after sorting. Closes [#43386](https://github.com/ClickHouse/ClickHouse/issues/43386) [#43635](https://github.com/ClickHouse/ClickHouse/pull/43635) ([Kruglov Pavel](https://github.com/Avogar)). +* Better handling of NULL in aggregate combinators, fix possible segfault/logical error while using an obscure optimization `optimize_rewrite_sum_if_to_count_if`. Closes [#43758](https://github.com/ClickHouse/ClickHouse/issues/43758). [#43813](https://github.com/ClickHouse/ClickHouse/pull/43813) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix CREATE USER/ROLE query settings constraints. [#43993](https://github.com/ClickHouse/ClickHouse/pull/43993) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fixed bug with non-parsable default value for `EPHEMERAL` column in table metadata. [#44026](https://github.com/ClickHouse/ClickHouse/pull/44026) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix parsing of bad version from compatibility setting. [#44224](https://github.com/ClickHouse/ClickHouse/pull/44224) ([Kruglov Pavel](https://github.com/Avogar)). +* Bring interval subtraction from datetime in line with addition. [#44241](https://github.com/ClickHouse/ClickHouse/pull/44241) ([ltrk2](https://github.com/ltrk2)). +* Remove limits on the maximum size of the result for view. [#44261](https://github.com/ClickHouse/ClickHouse/pull/44261) ([lizhuoyu5](https://github.com/lzydmxy)). +* Fix possible logical error in cache if `do_not_evict_index_and_mrk_files=1`. Closes [#42142](https://github.com/ClickHouse/ClickHouse/issues/42142). [#44268](https://github.com/ClickHouse/ClickHouse/pull/44268) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible too early cache write interruption in write-through cache (caching could be stopped due to false assumption when it shouldn't have). [#44289](https://github.com/ClickHouse/ClickHouse/pull/44289) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible crash in the case function `IN` with constant arguments was used as a constant argument together with `LowCardinality`. Fixes [#44221](https://github.com/ClickHouse/ClickHouse/issues/44221). [#44346](https://github.com/ClickHouse/ClickHouse/pull/44346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix support for complex parameters (like arrays) of parametric aggregate functions. This closes [#30975](https://github.com/ClickHouse/ClickHouse/issues/30975). The aggregate function `sumMapFiltered` was unusable in distributed queries before this change. [#44358](https://github.com/ClickHouse/ClickHouse/pull/44358) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix reading ObjectId in BSON schema inference. [#44382](https://github.com/ClickHouse/ClickHouse/pull/44382) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix race which can lead to premature temp parts removal before merge finishes in ReplicatedMergeTree. This issue could lead to errors like `No such file or directory: xxx`. Fixes [#43983](https://github.com/ClickHouse/ClickHouse/issues/43983). [#44383](https://github.com/ClickHouse/ClickHouse/pull/44383) ([alesapin](https://github.com/alesapin)). +* Some invalid `SYSTEM ... ON CLUSTER` queries worked in an unexpected way if a cluster name was not specified. It's fixed, now invalid queries throw `SYNTAX_ERROR` as they should. Fixes [#44264](https://github.com/ClickHouse/ClickHouse/issues/44264). [#44387](https://github.com/ClickHouse/ClickHouse/pull/44387) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix reading Map type in ORC format. [#44400](https://github.com/ClickHouse/ClickHouse/pull/44400) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading columns that are not presented in input data in Parquet/ORC formats. Previously it could lead to error `INCORRECT_NUMBER_OF_COLUMNS`. Closes [#44333](https://github.com/ClickHouse/ClickHouse/issues/44333). [#44405](https://github.com/ClickHouse/ClickHouse/pull/44405) ([Kruglov Pavel](https://github.com/Avogar)). +* Previously the `bar` function used the same '▋' (U+258B "Left five eighths block") character to display both 5/8 and 6/8 bars. This change corrects this behavior by using '▊' (U+258A "Left three quarters block") for displaying 6/8 bar. [#44410](https://github.com/ClickHouse/ClickHouse/pull/44410) ([Alexander Gololobov](https://github.com/davenger)). +* Placing profile settings after profile settings constraints in the configuration file made constraints ineffective. [#44411](https://github.com/ClickHouse/ClickHouse/pull/44411) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix `SYNTAX_ERROR` while running `EXPLAIN AST INSERT` queries with data. Closes [#44207](https://github.com/ClickHouse/ClickHouse/issues/44207). [#44413](https://github.com/ClickHouse/ClickHouse/pull/44413) ([save-my-heart](https://github.com/save-my-heart)). +* Fix reading bool value with CRLF in CSV format. Closes [#44401](https://github.com/ClickHouse/ClickHouse/issues/44401). [#44442](https://github.com/ClickHouse/ClickHouse/pull/44442) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't execute and/or/if/multiIf on a LowCardinality dictionary, so the result type cannot be LowCardinality. It could lead to the error `Illegal column ColumnLowCardinality` in some cases. Fixes [#43603](https://github.com/ClickHouse/ClickHouse/issues/43603). [#44469](https://github.com/ClickHouse/ClickHouse/pull/44469) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix mutations with the setting `max_streams_for_merge_tree_reading`. [#44472](https://github.com/ClickHouse/ClickHouse/pull/44472) ([Anton Popov](https://github.com/CurtizJ)). +* Fix potential null pointer dereference with GROUPING SETS in ASTSelectQuery::formatImpl ([#43049](https://github.com/ClickHouse/ClickHouse/issues/43049)). [#44479](https://github.com/ClickHouse/ClickHouse/pull/44479) ([Robert Schulze](https://github.com/rschu1ze)). +* Validate types in table function arguments, CAST function arguments, JSONAsObject schema inference according to settings. [#44501](https://github.com/ClickHouse/ClickHouse/pull/44501) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix IN function with LowCardinality and const column, close [#44503](https://github.com/ClickHouse/ClickHouse/issues/44503). [#44506](https://github.com/ClickHouse/ClickHouse/pull/44506) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed a bug in the normalization of a `DEFAULT` expression in `CREATE TABLE` statement. The second argument of the function `in` (or the right argument of operator `IN`) might be replaced with the result of its evaluation during CREATE query execution. Fixes [#44496](https://github.com/ClickHouse/ClickHouse/issues/44496). [#44547](https://github.com/ClickHouse/ClickHouse/pull/44547) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Projections do not work in presence of WITH ROLLUP, WITH CUBE and WITH TOTALS. In previous versions, a query produced an exception instead of skipping the usage of projections. This closes [#44614](https://github.com/ClickHouse/ClickHouse/issues/44614). This closes [#42772](https://github.com/ClickHouse/ClickHouse/issues/42772). [#44615](https://github.com/ClickHouse/ClickHouse/pull/44615) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Async blocks were not cleaned because the function `get all blocks sorted by time` didn't get async blocks. [#44651](https://github.com/ClickHouse/ClickHouse/pull/44651) ([Han Fei](https://github.com/hanfei1991)). +* Fix `LOGICAL_ERROR` `The top step of the right pipeline should be ExpressionStep` for JOIN with subquery, UNION, and TOTALS. Fixes [#43687](https://github.com/ClickHouse/ClickHouse/issues/43687). [#44673](https://github.com/ClickHouse/ClickHouse/pull/44673) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Avoid `std::out_of_range` exception in the Executable table engine. [#44681](https://github.com/ClickHouse/ClickHouse/pull/44681) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not apply `optimize_syntax_fuse_functions` to quantiles on AST, close [#44712](https://github.com/ClickHouse/ClickHouse/issues/44712). [#44713](https://github.com/ClickHouse/ClickHouse/pull/44713) ([Vladimir C](https://github.com/vdimir)). +* Fix bug with wrong type in Merge table and PREWHERE, close [#43324](https://github.com/ClickHouse/ClickHouse/issues/43324). [#44716](https://github.com/ClickHouse/ClickHouse/pull/44716) ([Vladimir C](https://github.com/vdimir)). +* Fix a possible crash during shutdown (while destroying TraceCollector). Fixes [#44757](https://github.com/ClickHouse/ClickHouse/issues/44757). [#44758](https://github.com/ClickHouse/ClickHouse/pull/44758) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a possible crash in distributed query processing. The crash could happen if a query with totals or extremes returned an empty result and there are mismatched types in the Distributed and the local tables. Fixes [#44738](https://github.com/ClickHouse/ClickHouse/issues/44738). [#44760](https://github.com/ClickHouse/ClickHouse/pull/44760) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix fsync for fetches (`min_compressed_bytes_to_fsync_after_fetch`)/small files (ttl.txt, columns.txt) in mutations (`min_rows_to_fsync_after_merge`/`min_compressed_bytes_to_fsync_after_merge`). [#44781](https://github.com/ClickHouse/ClickHouse/pull/44781) ([Azat Khuzhin](https://github.com/azat)). +* A rare race condition was possible when querying the `system.parts` or `system.parts_columns` tables in the presence of parts being moved between disks. Introduced in [#41145](https://github.com/ClickHouse/ClickHouse/issues/41145). [#44809](https://github.com/ClickHouse/ClickHouse/pull/44809) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix the error `Context has expired` which could appear with enabled projections optimization. Can be reproduced for queries with specific functions, like `dictHas/dictGet` which use context in runtime. Fixes [#44844](https://github.com/ClickHouse/ClickHouse/issues/44844). [#44850](https://github.com/ClickHouse/ClickHouse/pull/44850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* A fix for `Cannot read all data` error which could happen while reading `LowCardinality` dictionary from remote fs. Fixes [#44709](https://github.com/ClickHouse/ClickHouse/issues/44709). [#44875](https://github.com/ClickHouse/ClickHouse/pull/44875) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Ignore cases when hardware monitor sensors cannot be read instead of showing a full exception message in logs. [#44895](https://github.com/ClickHouse/ClickHouse/pull/44895) ([Raúl Marín](https://github.com/Algunenano)). +* Use `max_delay_to_insert` value in case the calculated time to delay INSERT exceeds the setting value. Related to [#44902](https://github.com/ClickHouse/ClickHouse/issues/44902). [#44916](https://github.com/ClickHouse/ClickHouse/pull/44916) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix error `Different order of columns in UNION subquery` for queries with `UNION`. Fixes [#44866](https://github.com/ClickHouse/ClickHouse/issues/44866). [#44920](https://github.com/ClickHouse/ClickHouse/pull/44920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Delay for INSERT can be calculated incorrectly, which can lead to always using `max_delay_to_insert` setting as delay instead of a correct value. Using simple formula `max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold)` i.e. delay grows proportionally to parts over threshold. Closes [#44902](https://github.com/ClickHouse/ClickHouse/issues/44902). [#44954](https://github.com/ClickHouse/ClickHouse/pull/44954) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix alter table TTL error when a wide part has the lightweight delete mask. [#44959](https://github.com/ClickHouse/ClickHouse/pull/44959) ([Mingliang Pan](https://github.com/liangliangpan)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native [#43221](https://github.com/ClickHouse/ClickHouse/issues/43221). [#45024](https://github.com/ClickHouse/ClickHouse/pull/45024) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native https://github.com/ClickHouse/ClickHouse/pull/43221. [#45043](https://github.com/ClickHouse/ClickHouse/pull/45043) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* A buffer overflow was possible in the parser. Found by fuzzer. [#45047](https://github.com/ClickHouse/ClickHouse/pull/45047) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix possible cannot-read-all-data error in storage FileLog. Closes [#45051](https://github.com/ClickHouse/ClickHouse/issues/45051), [#38257](https://github.com/ClickHouse/ClickHouse/issues/38257). [#45057](https://github.com/ClickHouse/ClickHouse/pull/45057) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Memory efficient aggregation (setting `distributed_aggregation_memory_efficient`) is disabled when grouping sets are present in the query. [#45058](https://github.com/ClickHouse/ClickHouse/pull/45058) ([Nikita Taranov](https://github.com/nickitat)). +* Fix `RANGE_HASHED` dictionary to count range columns as part of the primary key during updates when `update_field` is specified. Closes [#44588](https://github.com/ClickHouse/ClickHouse/issues/44588). [#45061](https://github.com/ClickHouse/ClickHouse/pull/45061) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix error `Cannot capture column` for `LowCardinality` captured argument of nested lambda. Fixes [#45028](https://github.com/ClickHouse/ClickHouse/issues/45028). [#45065](https://github.com/ClickHouse/ClickHouse/pull/45065) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix the wrong query result of `additional_table_filters` (additional filter was not applied) in case the minmax/count projection is used. [#45133](https://github.com/ClickHouse/ClickHouse/pull/45133) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug in `histogram` function accepting negative values. [#45147](https://github.com/ClickHouse/ClickHouse/pull/45147) ([simpleton](https://github.com/rgzntrade)). +* Fix wrong column nullability in StoreageJoin, close [#44940](https://github.com/ClickHouse/ClickHouse/issues/44940). [#45184](https://github.com/ClickHouse/ClickHouse/pull/45184) ([Vladimir C](https://github.com/vdimir)). +* Fix `background_fetches_pool_size` settings reload (increase at runtime). [#45189](https://github.com/ClickHouse/ClickHouse/pull/45189) ([Raúl Marín](https://github.com/Algunenano)). +* Correctly process `SELECT` queries on KV engines (e.g. KeeperMap, EmbeddedRocksDB) using `IN` on the key with subquery producing different type. [#45215](https://github.com/ClickHouse/ClickHouse/pull/45215) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix logical error in SEMI JOIN & join_use_nulls in some cases, close [#45163](https://github.com/ClickHouse/ClickHouse/issues/45163), close [#45209](https://github.com/ClickHouse/ClickHouse/issues/45209). [#45230](https://github.com/ClickHouse/ClickHouse/pull/45230) ([Vladimir C](https://github.com/vdimir)). +* Fix heap-use-after-free in reading from s3. [#45253](https://github.com/ClickHouse/ClickHouse/pull/45253) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug when the Avro Union type is ['null', Nested type], closes [#45275](https://github.com/ClickHouse/ClickHouse/issues/45275). Fix bug that incorrectly infers `bytes` type to `Float`. [#45276](https://github.com/ClickHouse/ClickHouse/pull/45276) ([flynn](https://github.com/ucasfl)). +* Throw a correct exception when explicit PREWHERE cannot be used with a table using the storage engine `Merge`. [#45319](https://github.com/ClickHouse/ClickHouse/pull/45319) ([Antonio Andelic](https://github.com/antonio2368)). +* Under WSL1 Ubuntu self-extracting ClickHouse fails to decompress due to inconsistency - /proc/self/maps reporting 32bit file's inode, while stat reporting 64bit inode. [#45339](https://github.com/ClickHouse/ClickHouse/pull/45339) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix race in Distributed table startup (that could lead to processing file of async INSERT multiple times). [#45360](https://github.com/ClickHouse/ClickHouse/pull/45360) ([Azat Khuzhin](https://github.com/azat)). +* Fix a possible crash while reading from storage `S3` and table function `s3` in the case when `ListObject` request has failed. [#45371](https://github.com/ClickHouse/ClickHouse/pull/45371) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `SELECT ... FROM system.dictionaries` exception when there is a dictionary with a bad structure (e.g. incorrect type in XML config). [#45399](https://github.com/ClickHouse/ClickHouse/pull/45399) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix s3Cluster schema inference when structure from insertion table is used in `INSERT INTO ... SELECT * FROM s3Cluster` queries. [#45422](https://github.com/ClickHouse/ClickHouse/pull/45422) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug in JSON/BSONEachRow parsing with HTTP that could lead to using default values for some columns instead of values from data. [#45424](https://github.com/ClickHouse/ClickHouse/pull/45424) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed bug (Code: 632. DB::Exception: Unexpected data ... after parsed IPv6 value ...) with typed parsing of IP types from text source. [#45425](https://github.com/ClickHouse/ClickHouse/pull/45425) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* close [#45297](https://github.com/ClickHouse/ClickHouse/issues/45297) Add check for empty regular expressions. [#45428](https://github.com/ClickHouse/ClickHouse/pull/45428) ([Han Fei](https://github.com/hanfei1991)). +* Fix possible (likely distributed) query hung. [#45448](https://github.com/ClickHouse/ClickHouse/pull/45448) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible deadlock with `allow_asynchronous_read_from_io_pool_for_merge_tree` enabled in case of exception from `ThreadPool::schedule`. [#45481](https://github.com/ClickHouse/ClickHouse/pull/45481) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible in-use table after DETACH. [#45493](https://github.com/ClickHouse/ClickHouse/pull/45493) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare abort in the case when a query is canceled and parallel parsing was used during its execution. [#45498](https://github.com/ClickHouse/ClickHouse/pull/45498) ([Anton Popov](https://github.com/CurtizJ)). +* Fix a race between Distributed table creation and INSERT into it (could lead to CANNOT_LINK during INSERT into the table). [#45502](https://github.com/ClickHouse/ClickHouse/pull/45502) ([Azat Khuzhin](https://github.com/azat)). +* Add proper default (SLRU) to cache policy getter. Closes [#45514](https://github.com/ClickHouse/ClickHouse/issues/45514). [#45524](https://github.com/ClickHouse/ClickHouse/pull/45524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disallow array join in mutations closes [#42637](https://github.com/ClickHouse/ClickHouse/issues/42637) [#44447](https://github.com/ClickHouse/ClickHouse/pull/44447) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix for qualified asterisks with alias table name and column transformer. Resolves [#44736](https://github.com/ClickHouse/ClickHouse/issues/44736). [#44755](https://github.com/ClickHouse/ClickHouse/pull/44755) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). + +## [Changelog for 2022](https://clickhouse.com/docs/ja/whats-new/changelog/2022) diff --git a/docs/ja/whats-new/changelog/_category_.yml b/docs/ja/whats-new/changelog/_category_.yml new file mode 100644 index 00000000000..133c43eeda3 --- /dev/null +++ b/docs/ja/whats-new/changelog/_category_.yml @@ -0,0 +1,7 @@ +position: 10 +label: 'Changelog' +collapsible: true +collapsed: true +link: + type: generated-index + title: Changelog diff --git a/docs/ja/whats-new/changelog/cloud.md b/docs/ja/whats-new/changelog/cloud.md new file mode 100644 index 00000000000..fd538cf56d5 --- /dev/null +++ b/docs/ja/whats-new/changelog/cloud.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 1 +sidebar_label: Cloud +--- +# Cloud Changelog + +import CloudChangelog from '@site/docs/ja/cloud/reference/changelog.md'; + + diff --git a/docs/ja/whats-new/changelog/index.md b/docs/ja/whats-new/changelog/index.md new file mode 100644 index 00000000000..67cd30a94a6 --- /dev/null +++ b/docs/ja/whats-new/changelog/index.md @@ -0,0 +1,184 @@ +--- +slug: /ja/whats-new/changelog/ +sidebar_position: 2 +sidebar_label: 2024 +title: 2024 Changelog +note: This file is autogenerated by the yarn new-build +--- + +### Table of Contents +**[ClickHouse release v24.1, 2024-01-30](#241)**
    +**[Changelog for 2023](https://clickhouse.com/docs/en/whats-new/changelog/2023/)**
    + +# 2024 Changelog + +### ClickHouse release 24.1, 2024-01-30 + +#### Backward Incompatible Change +* The setting `print_pretty_type_names` is turned on by default. You can turn it off to keep the old behavior or `SET compatibility = '23.12'`. [#57726](https://github.com/ClickHouse/ClickHouse/pull/57726) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The MergeTree setting `clean_deleted_rows` is deprecated, it has no effect anymore. The `CLEANUP` keyword for `OPTIMIZE` is not allowed by default (unless `allow_experimental_replacing_merge_with_cleanup` is enabled). [#58316](https://github.com/ClickHouse/ClickHouse/pull/58316) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The function `reverseDNSQuery` is no longer available. This closes [#58368](https://github.com/ClickHouse/ClickHouse/issues/58368). [#58369](https://github.com/ClickHouse/ClickHouse/pull/58369) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable various changes to improve the access control in the configuration file. These changes affect the behavior, and you check the `config.xml` in the `access_control_improvements` section. In case you are not confident, keep the values in the configuration file as they were in the previous version. [#58584](https://github.com/ClickHouse/ClickHouse/pull/58584) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the operation of `sumMapFiltered` with NaN values. NaN values are now placed at the end (instead of randomly) and considered different from any values. `-0` is now also treated as equal to `0`; since 0 values are discarded, `-0` values are discarded too. [#58959](https://github.com/ClickHouse/ClickHouse/pull/58959) ([Raúl Marín](https://github.com/Algunenano)). +* The function `visibleWidth` will behave according to the docs. In previous versions, it simply counted code points after string serialization, like the `lengthUTF8` function, but didn't consider zero-width and combining characters, full-width characters, tabs, and deletes. Now the behavior is changed accordingly. If you want to keep the old behavior, set `function_visible_width_behavior` to `0`, or set `compatibility` to `23.12` or lower. [#59022](https://github.com/ClickHouse/ClickHouse/pull/59022) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `Kusto` dialect is disabled until these two bugs will be fixed: [#59037](https://github.com/ClickHouse/ClickHouse/issues/59037) and [#59036](https://github.com/ClickHouse/ClickHouse/issues/59036). [#59305](https://github.com/ClickHouse/ClickHouse/pull/59305) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Any attempt to use `Kusto` will result in exception. +* More efficient implementation of the `FINAL` modifier no longer guarantees preserving the order even if `max_threads = 1`. If you counted on the previous behavior, set `enable_vertical_final` to 0 or `compatibility` to `23.12`. + +#### New Feature +* Implement Variant data type that represents a union of other data types. Type `Variant(T1, T2, ..., TN)` means that each row of this type has a value of either type `T1` or `T2` or ... or `TN` or none of them (`NULL` value). Variant type is available under a setting `allow_experimental_variant_type`. Reference: [#54864](https://github.com/ClickHouse/ClickHouse/issues/54864). [#58047](https://github.com/ClickHouse/ClickHouse/pull/58047) ([Kruglov Pavel](https://github.com/Avogar)). +* Certain settings (currently `min_compress_block_size` and `max_compress_block_size`) can now be specified at column-level where they take precedence over the corresponding table-level setting. Example: `CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();`. [#55201](https://github.com/ClickHouse/ClickHouse/pull/55201) ([Duc Canh Le](https://github.com/canhld94)). +* Add `quantileDD` aggregate function as well as the corresponding `quantilesDD` and `medianDD`. It is based on the DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf. ### Documentation entry for user-facing changes. [#56342](https://github.com/ClickHouse/ClickHouse/pull/56342) ([Srikanth Chekuri](https://github.com/srikanthccv)). +* Allow to configure any kind of object storage with any kind of metadata type. [#58357](https://github.com/ClickHouse/ClickHouse/pull/58357) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `null_status_on_timeout_only_active` and `throw_only_active` modes for `distributed_ddl_output_mode` that allow to avoid waiting for inactive replicas. [#58350](https://github.com/ClickHouse/ClickHouse/pull/58350) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow partitions from tables with different partition expressions to be attached when the destination table partition expression doesn't re-partition/split the part. [#39507](https://github.com/ClickHouse/ClickHouse/pull/39507) ([Arthur Passos](https://github.com/arthurpassos)). +* Add function `arrayShingles` to compute subarrays, e.g. `arrayShingles([1, 2, 3, 4, 5], 3)` returns `[[1,2,3],[2,3,4],[3,4,5]]`. [#58396](https://github.com/ClickHouse/ClickHouse/pull/58396) ([Zheng Miao](https://github.com/zenmiao7)). +* Added functions `punycodeEncode`, `punycodeDecode`, `idnaEncode` and `idnaDecode` which are useful for translating international domain names to an ASCII representation according to the IDNA standard. [#58454](https://github.com/ClickHouse/ClickHouse/pull/58454) ([Robert Schulze](https://github.com/rschu1ze)). +* Added string similarity functions `dramerauLevenshteinDistance`, `jaroSimilarity` and `jaroWinklerSimilarity`. [#58531](https://github.com/ClickHouse/ClickHouse/pull/58531) ([Robert Schulze](https://github.com/rschu1ze)). +* Add two settings `output_format_compression_level` to change output compression level and `output_format_compression_zstd_window_log` to explicitly set compression window size and enable long-range mode for zstd compression if output compression method is `zstd`. Applied for `INTO OUTFILE` and when writing to table functions `file`, `url`, `hdfs`, `s3`, and `azureBlobStorage`. [#58539](https://github.com/ClickHouse/ClickHouse/pull/58539) ([Duc Canh Le](https://github.com/canhld94)). +* Automatically disable ANSI escape sequences in Pretty formats if the output is not a terminal. Add new `auto` mode to setting `output_format_pretty_color`. [#58614](https://github.com/ClickHouse/ClickHouse/pull/58614) ([Shaun Struwig](https://github.com/Blargian)). +* Added function `sqidDecode` which decodes [Sqids](https://sqids.org/). [#58544](https://github.com/ClickHouse/ClickHouse/pull/58544) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow to read Bool values into String in JSON input formats. It's done under a setting `input_format_json_read_bools_as_strings` that is enabled by default. [#58561](https://github.com/ClickHouse/ClickHouse/pull/58561) ([Kruglov Pavel](https://github.com/Avogar)). +* Added function `seriesDecomposeSTL` which decomposes a time series into a season, a trend and a residual component. [#57078](https://github.com/ClickHouse/ClickHouse/pull/57078) ([Bhavna Jindal](https://github.com/bhavnajindal)). +* Introduced MySQL Binlog Client for MaterializedMySQL: One binlog connection for many databases. [#57323](https://github.com/ClickHouse/ClickHouse/pull/57323) ([Val Doroshchuk](https://github.com/valbok)). +* Intel QuickAssist Technology (QAT) provides hardware-accelerated compression and cryptograpy. ClickHouse got a new compression codec `ZSTD_QAT` which utilizes QAT for zstd compression. The codec uses [Intel's QATlib](https://github.com/intel/qatlib) and [Inte's QAT ZSTD Plugin](https://github.com/intel/QAT-ZSTD-Plugin). Right now, only compression can be accelerated in hardware (a software fallback kicks in in case QAT could not be initialized), decompression always runs in software. [#57509](https://github.com/ClickHouse/ClickHouse/pull/57509) ([jasperzhu](https://github.com/jinjunzh)). +* Implementing the new way how object storage keys are generated for s3 disks. Now the format could be defined in terms of `re2` regex syntax with `key_template` option in disc description. [#57663](https://github.com/ClickHouse/ClickHouse/pull/57663) ([Sema Checherinda](https://github.com/CheSema)). +* Table system.dropped_tables_parts contains parts of system.dropped_tables tables (dropped but not yet removed tables). [#58038](https://github.com/ClickHouse/ClickHouse/pull/58038) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add settings `max_materialized_views_size_for_table` to limit the number of materialized views attached to a table. [#58068](https://github.com/ClickHouse/ClickHouse/pull/58068) ([zhongyuankai](https://github.com/zhongyuankai)). +* `clickhouse-format` improvements: support INSERT queries with `VALUES`; support comments (use `--comments` to output them); support `--max_line_length` option to format only long queries in multiline. [#58246](https://github.com/ClickHouse/ClickHouse/pull/58246) ([vdimir](https://github.com/vdimir)). +* Attach all system tables in `clickhouse-local`, including `system.parts`. This closes [#58312](https://github.com/ClickHouse/ClickHouse/issues/58312). [#58359](https://github.com/ClickHouse/ClickHouse/pull/58359) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support for `Enum` data types in function `transform`. This closes [#58241](https://github.com/ClickHouse/ClickHouse/issues/58241). [#58360](https://github.com/ClickHouse/ClickHouse/pull/58360) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add table `system.database_engines`. [#58390](https://github.com/ClickHouse/ClickHouse/pull/58390) ([Bharat Nallan](https://github.com/bharatnc)). Allow registering database engines independently in the codebase. [#58365](https://github.com/ClickHouse/ClickHouse/pull/58365) ([Bharat Nallan](https://github.com/bharatnc)). Allow registering interpreters independently. [#58443](https://github.com/ClickHouse/ClickHouse/pull/58443) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `FROM ` modifier for `SYSTEM SYNC REPLICA LIGHTWEIGHT` query. With the `FROM` modifier ensures we wait for fetches and drop-ranges only for the specified source replicas, as well as any replica not in zookeeper or with an empty source_replica. [#58393](https://github.com/ClickHouse/ClickHouse/pull/58393) ([Jayme Bird](https://github.com/jaymebrd)). +* Added setting `update_insert_deduplication_token_in_dependent_materialized_views`. This setting allows to update insert deduplication token with table identifier during insert in dependent materialized views. Closes [#59165](https://github.com/ClickHouse/ClickHouse/issues/59165). [#59238](https://github.com/ClickHouse/ClickHouse/pull/59238) ([Maksim Kita](https://github.com/kitaisreal)). +* Added statement `SYSTEM RELOAD ASYNCHRONOUS METRICS` which updates the asynchronous metrics. Mostly useful for testing and development. [#53710](https://github.com/ClickHouse/ClickHouse/pull/53710) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Coordination for parallel replicas is rewritten for better parallelism and cache locality. It has been tested for linear scalability on hundreds of replicas. It also got support for reading in order. [#57968](https://github.com/ClickHouse/ClickHouse/pull/57968) ([Nikita Taranov](https://github.com/nickitat)). +* Replace HTTP outgoing buffering based with the native ClickHouse buffers. Add bytes counting metrics for interfaces. [#56064](https://github.com/ClickHouse/ClickHouse/pull/56064) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Large aggregation states of `uniqExact` will be merged in parallel in distrubuted queries. [#59009](https://github.com/ClickHouse/ClickHouse/pull/59009) ([Nikita Taranov](https://github.com/nickitat)). +* Lower memory usage after reading from `MergeTree` tables. [#59290](https://github.com/ClickHouse/ClickHouse/pull/59290) ([Anton Popov](https://github.com/CurtizJ)). +* Lower memory usage in vertical merges. [#59340](https://github.com/ClickHouse/ClickHouse/pull/59340) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid huge memory consumption during Keeper startup for more cases. [#58455](https://github.com/ClickHouse/ClickHouse/pull/58455) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper improvement: reduce Keeper's memory usage for stored nodes. [#59002](https://github.com/ClickHouse/ClickHouse/pull/59002) ([Antonio Andelic](https://github.com/antonio2368)). +* More cache-friendly final implementation. Note on the behaviour change: previously queries with `FINAL` modifier that read with a single stream (e.g. `max_threads = 1`) produced sorted output without explicitly provided `ORDER BY` clause. This is no longer guaranteed when `enable_vertical_final = true` (and it is so by default). [#54366](https://github.com/ClickHouse/ClickHouse/pull/54366) ([Duc Canh Le](https://github.com/canhld94)). +* Bypass extra copying in `ReadBufferFromIStream` which is used, e.g., for reading from S3. [#56961](https://github.com/ClickHouse/ClickHouse/pull/56961) ([Nikita Taranov](https://github.com/nickitat)). +* Optimize array element function when input is Array(Map)/Array(Array(Num)/Array(Array(String))/Array(BigInt)/Array(Decimal). The previous implementations did more allocations than needed. The optimization speed up is up to ~6x especially when input type is Array(Map). [#56403](https://github.com/ClickHouse/ClickHouse/pull/56403) ([李扬](https://github.com/taiyang-li)). +* Read column once while reading more than one subcolumn from it in compact parts. [#57631](https://github.com/ClickHouse/ClickHouse/pull/57631) ([Kruglov Pavel](https://github.com/Avogar)). +* Rewrite the AST of `sum(column + constant)` function. This is available as an optimization pass for Analyzer [#57853](https://github.com/ClickHouse/ClickHouse/pull/57853) ([Jiebin Sun](https://github.com/jiebinn)). +* The evaluation of function `match` now utilizes skipping indices `ngrambf_v1` and `tokenbf_v1`. [#57882](https://github.com/ClickHouse/ClickHouse/pull/57882) ([凌涛](https://github.com/lingtaolf)). +* The evaluation of function `match` now utilizes inverted indices. [#58284](https://github.com/ClickHouse/ClickHouse/pull/58284) ([凌涛](https://github.com/lingtaolf)). +* MergeTree `FINAL` does not compare rows from same non-L0 part. [#58142](https://github.com/ClickHouse/ClickHouse/pull/58142) ([Duc Canh Le](https://github.com/canhld94)). +* Speed up iota calls (filling array with consecutive numbers). [#58271](https://github.com/ClickHouse/ClickHouse/pull/58271) ([Raúl Marín](https://github.com/Algunenano)). +* Speedup MIN/MAX for non-numeric types. [#58334](https://github.com/ClickHouse/ClickHouse/pull/58334) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize the combination of filters (like in multi-stage PREWHERE) with BMI2/SSE intrinsics [#58800](https://github.com/ClickHouse/ClickHouse/pull/58800) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Use one thread less in `clickhouse-local`. [#58968](https://github.com/ClickHouse/ClickHouse/pull/58968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the `multiIf` function performance when the type is Nullable. [#57745](https://github.com/ClickHouse/ClickHouse/pull/57745) ([KevinyhZou](https://github.com/KevinyhZou)). +* Add `SYSTEM JEMALLOC PURGE` for purging unused jemalloc pages, `SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE` for controlling jemalloc profile if the profiler is enabled. Add jemalloc-related 4LW command in Keeper: `jmst` for dumping jemalloc stats, `jmfp`, `jmep`, `jmdp` for controlling jemalloc profile if the profiler is enabled. [#58665](https://github.com/ClickHouse/ClickHouse/pull/58665) ([Antonio Andelic](https://github.com/antonio2368)). +* Lower memory consumption in backups to S3. [#58962](https://github.com/ClickHouse/ClickHouse/pull/58962) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement +* Added comments (brief descriptions) to all columns of system tables. There are several reasons for this: - We use system tables a lot, and sometimes it could be very difficult for developer to understand the purpose and the meaning of a particular column. - We change (add new ones or modify existing) system tables a lot and the documentation for them is always outdated. For example take a look at the documentation page for [`system.parts`](https://clickhouse.com/docs/en/operations/system-tables/parts). It misses a lot of columns - We would like to eventually generate documentation directly from ClickHouse. [#58356](https://github.com/ClickHouse/ClickHouse/pull/58356) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow queries without aliases for subqueries for `PASTE JOIN`. [#58654](https://github.com/ClickHouse/ClickHouse/pull/58654) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Enable `MySQL`/`MariaDB` integration on macOS. This closes [#21191](https://github.com/ClickHouse/ClickHouse/issues/21191). [#46316](https://github.com/ClickHouse/ClickHouse/pull/46316) ([Alexey Milovidov](https://github.com/alexey-milovidov)) ([Robert Schulze](https://github.com/rschu1ze)). +* Disable `max_rows_in_set_to_optimize_join` by default. [#56396](https://github.com/ClickHouse/ClickHouse/pull/56396) ([vdimir](https://github.com/vdimir)). +* Add `` config parameter that allows avoiding resolving hostnames in ON CLUSTER DDL queries and Replicated database engines. This mitigates the possibility of the queue being stuck in case of a change in cluster definition. Closes [#57573](https://github.com/ClickHouse/ClickHouse/issues/57573). [#57603](https://github.com/ClickHouse/ClickHouse/pull/57603) ([Nikolay Degterinsky](https://github.com/evillique)). +* Increase `load_metadata_threads` to 16 for the filesystem cache. It will make the server start up faster. [#57732](https://github.com/ClickHouse/ClickHouse/pull/57732) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to throttle merges/mutations (`max_mutations_bandwidth_for_server`/`max_merges_bandwidth_for_server`). [#57877](https://github.com/ClickHouse/ClickHouse/pull/57877) ([Azat Khuzhin](https://github.com/azat)). +* Replaced undocumented (boolean) column `is_hot_reloadable` in system table `system.server_settings` by (Enum8) column `changeable_without_restart` with possible values `No`, `Yes`, `IncreaseOnly` and `DecreaseOnly`. Also documented the column. [#58029](https://github.com/ClickHouse/ClickHouse/pull/58029) ([skyoct](https://github.com/skyoct)). +* Cluster discovery supports setting username and password, close [#58063](https://github.com/ClickHouse/ClickHouse/issues/58063). [#58123](https://github.com/ClickHouse/ClickHouse/pull/58123) ([vdimir](https://github.com/vdimir)). +* Support query parameters in `ALTER TABLE ... PART`. [#58297](https://github.com/ClickHouse/ClickHouse/pull/58297) ([Azat Khuzhin](https://github.com/azat)). +* Create consumers for Kafka tables on the fly (but keep them for some period - `kafka_consumers_pool_ttl_ms`, since last used), this should fix problem with statistics for `system.kafka_consumers` (that does not consumed when nobody reads from Kafka table, which leads to live memory leak and slow table detach) and also this PR enables stats for `system.kafka_consumers` by default again. [#58310](https://github.com/ClickHouse/ClickHouse/pull/58310) ([Azat Khuzhin](https://github.com/azat)). +* `sparkBar` as an alias to `sparkbar`. [#58335](https://github.com/ClickHouse/ClickHouse/pull/58335) ([凌涛](https://github.com/lingtaolf)). +* Avoid sending `ComposeObject` requests after upload to `GCS`. [#58343](https://github.com/ClickHouse/ClickHouse/pull/58343) ([Azat Khuzhin](https://github.com/azat)). +* Correctly handle keys with dot in the name in configurations XMLs. [#58354](https://github.com/ClickHouse/ClickHouse/pull/58354) ([Azat Khuzhin](https://github.com/azat)). +* Make function `format` return constant on constant arguments. This closes [#58355](https://github.com/ClickHouse/ClickHouse/issues/58355). [#58358](https://github.com/ClickHouse/ClickHouse/pull/58358) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Adding a setting `max_estimated_execution_time` to separate `max_execution_time` and `max_estimated_execution_time`. [#58402](https://github.com/ClickHouse/ClickHouse/pull/58402) ([Zhang Yifan](https://github.com/zhangyifan27)). +* Provide a hint when an invalid database engine name is used. [#58444](https://github.com/ClickHouse/ClickHouse/pull/58444) ([Bharat Nallan](https://github.com/bharatnc)). +* Add settings for better control of indexes type in Arrow dictionary. Use signed integer type for indexes by default as Arrow recommends. Closes [#57401](https://github.com/ClickHouse/ClickHouse/issues/57401). [#58519](https://github.com/ClickHouse/ClickHouse/pull/58519) ([Kruglov Pavel](https://github.com/Avogar)). +* Implement [#58575](https://github.com/ClickHouse/ClickHouse/issues/58575) Support `CLICKHOUSE_PASSWORD_FILE ` environment variable when running the docker image. [#58583](https://github.com/ClickHouse/ClickHouse/pull/58583) ([Eyal Halpern Shalev](https://github.com/Eyal-Shalev)). +* When executing some queries, which require a lot of streams for reading data, the error `"Paste JOIN requires sorted tables only"` was previously thrown. Now the numbers of streams resize to 1 in that case. [#58608](https://github.com/ClickHouse/ClickHouse/pull/58608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Better message for INVALID_IDENTIFIER error. [#58703](https://github.com/ClickHouse/ClickHouse/pull/58703) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Improved handling of signed numeric literals in normalizeQuery. [#58710](https://github.com/ClickHouse/ClickHouse/pull/58710) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Support Point data type for MySQL. [#58721](https://github.com/ClickHouse/ClickHouse/pull/58721) ([Kseniia Sumarokova](https://github.com/kssenii)). +* When comparing a Float32 column and a const string, read the string as Float32 (instead of Float64). [#58724](https://github.com/ClickHouse/ClickHouse/pull/58724) ([Raúl Marín](https://github.com/Algunenano)). +* Improve S3 compatibility, add ECloud EOS storage support. [#58786](https://github.com/ClickHouse/ClickHouse/pull/58786) ([xleoken](https://github.com/xleoken)). +* Allow `KILL QUERY` to cancel backups / restores. This PR also makes running backups and restores visible in `system.processes`. Also, there is a new setting in the server configuration now - `shutdown_wait_backups_and_restores` (default=true) which makes the server either wait on shutdown for all running backups and restores to finish or just cancel them. [#58804](https://github.com/ClickHouse/ClickHouse/pull/58804) ([Vitaly Baranov](https://github.com/vitlibar)). +* Avro format to support ZSTD codec. Closes [#58735](https://github.com/ClickHouse/ClickHouse/issues/58735). [#58805](https://github.com/ClickHouse/ClickHouse/pull/58805) ([flynn](https://github.com/ucasfl)). +* MySQL interface gained support for `net_write_timeout` and `net_read_timeout` settings. `net_write_timeout` is translated into the native `send_timeout` ClickHouse setting and, similarly, `net_read_timeout` into `receive_timeout`. Fixed an issue where it was possible to set MySQL `sql_select_limit` setting only if the entire statement was in upper case. [#58835](https://github.com/ClickHouse/ClickHouse/pull/58835) ([Serge Klochkov](https://github.com/slvrtrn)). +* A better exception message while conflict of creating dictionary and table with the same name. [#58841](https://github.com/ClickHouse/ClickHouse/pull/58841) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Make sure that for custom (created from SQL) disks ether `filesystem_caches_path` (a common directory prefix for all filesystem caches) or `custom_cached_disks_base_directory` (a common directory prefix for only filesystem caches created from custom disks) is specified in server config. `custom_cached_disks_base_directory` has higher priority for custom disks over `filesystem_caches_path`, which is used if the former one is absent. Filesystem cache setting `path` must lie inside that directory, otherwise exception will be thrown preventing disk to be created. This will not affect disks created on an older version and server was upgraded - then the exception will not be thrown to allow the server to successfully start). `custom_cached_disks_base_directory` is added to default server config as `/var/lib/clickhouse/caches/`. Closes [#57825](https://github.com/ClickHouse/ClickHouse/issues/57825). [#58869](https://github.com/ClickHouse/ClickHouse/pull/58869) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MySQL interface gained compatibility with `SHOW WARNINGS`/`SHOW COUNT(*) WARNINGS` queries, though the returned result is always an empty set. [#58929](https://github.com/ClickHouse/ClickHouse/pull/58929) ([Serge Klochkov](https://github.com/slvrtrn)). +* Skip unavailable replicas when executing parallel distributed `INSERT SELECT`. [#58931](https://github.com/ClickHouse/ClickHouse/pull/58931) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Display word-descriptive log level while enabling structured log formatting in json. [#58936](https://github.com/ClickHouse/ClickHouse/pull/58936) ([Tim Liou](https://github.com/wheatdog)). +* MySQL interface gained support for `CAST(x AS SIGNED)` and `CAST(x AS UNSIGNED)` statements via data type aliases: `SIGNED` for Int64, and `UNSIGNED` for UInt64. This improves compatibility with BI tools such as Looker Studio. [#58954](https://github.com/ClickHouse/ClickHouse/pull/58954) ([Serge Klochkov](https://github.com/slvrtrn)). +* Change working directory to the data path in docker container. [#58975](https://github.com/ClickHouse/ClickHouse/pull/58975) ([cangyin](https://github.com/cangyin)). +* Added setting for Azure Blob Storage `azure_max_unexpected_write_error_retries` , can also be set from config under azure section. [#59001](https://github.com/ClickHouse/ClickHouse/pull/59001) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Allow server to start with broken data lake table. Closes [#58625](https://github.com/ClickHouse/ClickHouse/issues/58625). [#59080](https://github.com/ClickHouse/ClickHouse/pull/59080) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to ignore schema evolution in the `Iceberg` table engine and read all data using schema specified by the user on table creation or latest schema parsed from metadata on table creation. This is done under a setting `iceberg_engine_ignore_schema_evolution` that is disabled by default. Note that enabling this setting can lead to incorrect result as in case of evolved schema all data files will be read using the same schema. [#59133](https://github.com/ClickHouse/ClickHouse/pull/59133) ([Kruglov Pavel](https://github.com/Avogar)). +* Prohibit mutable operations (`INSERT`/`ALTER`/`OPTIMIZE`/...) on read-only/write-once storages with a proper `TABLE_IS_READ_ONLY` error (to avoid leftovers). Avoid leaving left-overs on write-once disks (`format_version.txt`) on `CREATE`/`ATTACH`. Ignore `DROP` for `ReplicatedMergeTree` (so as for `MergeTree`). Fix iterating over `s3_plain` (`MetadataStorageFromPlainObjectStorage::iterateDirectory`). Note read-only is `web` disk, and write-once is `s3_plain`. [#59170](https://github.com/ClickHouse/ClickHouse/pull/59170) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug in the experimental `_block_number` column which could lead to logical error during complex combination of `ALTER`s and `merge`s. Fixes [#56202](https://github.com/ClickHouse/ClickHouse/issues/56202). Replaces [#58601](https://github.com/ClickHouse/ClickHouse/issues/58601). [#59295](https://github.com/ClickHouse/ClickHouse/pull/59295) ([alesapin](https://github.com/alesapin)). +* Play UI understands when an exception is returned inside JSON. Adjustment for [#52853](https://github.com/ClickHouse/ClickHouse/issues/52853). [#59303](https://github.com/ClickHouse/ClickHouse/pull/59303) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `/binary` HTTP handler allows to specify user, host, and optionally, password in the query string. [#59311](https://github.com/ClickHouse/ClickHouse/pull/59311) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support backups for compressed in-memory tables. This closes [#57893](https://github.com/ClickHouse/ClickHouse/issues/57893). [#59315](https://github.com/ClickHouse/ClickHouse/pull/59315) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support the `FORMAT` clause in `BACKUP` and `RESTORE` queries. [#59338](https://github.com/ClickHouse/ClickHouse/pull/59338) ([Vitaly Baranov](https://github.com/vitlibar)). +* Function `concatWithSeparator` now supports arbitrary argument types (instead of only `String` and `FixedString` arguments). For example, `SELECT concatWithSeparator('.', 'number', 1)` now returns `number.1`. [#59341](https://github.com/ClickHouse/ClickHouse/pull/59341) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Build/Testing/Packaging Improvement +* Improve aliases for clickhouse binary (now `ch`/`clickhouse` is `clickhouse-local` or `clickhouse` depends on the arguments) and add bash completion for new aliases. [#58344](https://github.com/ClickHouse/ClickHouse/pull/58344) ([Azat Khuzhin](https://github.com/azat)). +* Add settings changes check to CI to check that all settings changes are reflected in settings changes history. [#58555](https://github.com/ClickHouse/ClickHouse/pull/58555) ([Kruglov Pavel](https://github.com/Avogar)). +* Use tables directly attached from S3 in stateful tests. [#58791](https://github.com/ClickHouse/ClickHouse/pull/58791) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Save the whole `fuzzer.log` as an archive instead of the last 100k lines. `tail -n 100000` often removes lines with table definitions. Example:. [#58821](https://github.com/ClickHouse/ClickHouse/pull/58821) ([Dmitry Novik](https://github.com/novikd)). +* Enable Rust on macOS with Aarch64 (this will add fuzzy search in client with skim and the PRQL language, though I don't think that are people who host ClickHouse on darwin, so it is mostly for fuzzy search in client I would say). [#59272](https://github.com/ClickHouse/ClickHouse/pull/59272) ([Azat Khuzhin](https://github.com/azat)). +* Fix aggregation issue in mixed x86_64 and ARM clusters [#59132](https://github.com/ClickHouse/ClickHouse/pull/59132) ([Harry Lee](https://github.com/HarryLeeIBM)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Add join keys conversion for nested LowCardinality [#51550](https://github.com/ClickHouse/ClickHouse/pull/51550) ([vdimir](https://github.com/vdimir)). +* Flatten only true Nested type if flatten_nested=1, not all Array(Tuple) [#56132](https://github.com/ClickHouse/ClickHouse/pull/56132) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a bug with projections and the `aggregate_functions_null_for_empty` setting during insertion. [#56944](https://github.com/ClickHouse/ClickHouse/pull/56944) ([Amos Bird](https://github.com/amosbird)). +* Fixed potential exception due to stale profile UUID [#57263](https://github.com/ClickHouse/ClickHouse/pull/57263) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix working with read buffers in StreamingFormatExecutor [#57438](https://github.com/ClickHouse/ClickHouse/pull/57438) ([Kruglov Pavel](https://github.com/Avogar)). +* Ignore MVs with dropped target table during pushing to views [#57520](https://github.com/ClickHouse/ClickHouse/pull/57520) ([Kruglov Pavel](https://github.com/Avogar)). +* Eliminate possible race between ALTER_METADATA and MERGE_PARTS [#57755](https://github.com/ClickHouse/ClickHouse/pull/57755) ([Azat Khuzhin](https://github.com/azat)). +* Fix the expressions order bug in group by with rollup [#57786](https://github.com/ClickHouse/ClickHouse/pull/57786) ([Chen768959](https://github.com/Chen768959)). +* A fix for the obsolete "zero-copy" replication feature: Fix lost blobs after dropping a replica with broken detached parts [#58333](https://github.com/ClickHouse/ClickHouse/pull/58333) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow users to work with symlinks in user_files_path [#58447](https://github.com/ClickHouse/ClickHouse/pull/58447) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a crash when graphite table does not have an agg function [#58453](https://github.com/ClickHouse/ClickHouse/pull/58453) ([Duc Canh Le](https://github.com/canhld94)). +* Delay reading from StorageKafka to allow multiple reads in materialized views [#58477](https://github.com/ClickHouse/ClickHouse/pull/58477) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Fix a stupid case of intersecting parts [#58482](https://github.com/ClickHouse/ClickHouse/pull/58482) ([Alexander Tokmakov](https://github.com/tavplubix)). +* MergeTreePrefetchedReadPool disable for LIMIT only queries [#58505](https://github.com/ClickHouse/ClickHouse/pull/58505) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable ordinary databases while restoration [#58520](https://github.com/ClickHouse/ClickHouse/pull/58520) ([Jihyuk Bok](https://github.com/tomahawk28)). +* Fix Apache Hive threadpool reading for ORC/Parquet/... [#58537](https://github.com/ClickHouse/ClickHouse/pull/58537) ([sunny](https://github.com/sunny19930321)). +* Hide credentials in `system.backup_log`'s `base_backup_name` column [#58550](https://github.com/ClickHouse/ClickHouse/pull/58550) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* `toStartOfInterval` for milli- microsencods values rounding [#58557](https://github.com/ClickHouse/ClickHouse/pull/58557) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Disable `max_joined_block_rows` in ConcurrentHashJoin [#58595](https://github.com/ClickHouse/ClickHouse/pull/58595) ([vdimir](https://github.com/vdimir)). +* Fix join using nullable in the old analyzer [#58596](https://github.com/ClickHouse/ClickHouse/pull/58596) ([vdimir](https://github.com/vdimir)). +* `makeDateTime64`: Allow non-const fraction argument [#58597](https://github.com/ClickHouse/ClickHouse/pull/58597) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix possible NULL dereference during symbolizing inline frames [#58607](https://github.com/ClickHouse/ClickHouse/pull/58607) ([Azat Khuzhin](https://github.com/azat)). +* Improve isolation of query cache entries under re-created users or role switches [#58611](https://github.com/ClickHouse/ClickHouse/pull/58611) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix broken partition key analysis when doing projection optimization [#58638](https://github.com/ClickHouse/ClickHouse/pull/58638) ([Amos Bird](https://github.com/amosbird)). +* Query cache: Fix per-user quota [#58731](https://github.com/ClickHouse/ClickHouse/pull/58731) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix stream partitioning in parallel window functions [#58739](https://github.com/ClickHouse/ClickHouse/pull/58739) ([Dmitry Novik](https://github.com/novikd)). +* Fix double destroy call on exception throw in addBatchLookupTable8 [#58745](https://github.com/ClickHouse/ClickHouse/pull/58745) ([Raúl Marín](https://github.com/Algunenano)). +* Don't process requests in Keeper during shutdown [#58765](https://github.com/ClickHouse/ClickHouse/pull/58765) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix a null pointer dereference in `SlabsPolygonIndex::find` [#58771](https://github.com/ClickHouse/ClickHouse/pull/58771) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix JSONExtract function for LowCardinality(Nullable) columns [#58808](https://github.com/ClickHouse/ClickHouse/pull/58808) ([vdimir](https://github.com/vdimir)). +* A fix for unexpected accumulation of memory usage while creating a huge number of tables by CREATE and DROP. [#58831](https://github.com/ClickHouse/ClickHouse/pull/58831) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple read file log storage in mv [#58877](https://github.com/ClickHouse/ClickHouse/pull/58877) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Restriction for the access key id for s3. [#58900](https://github.com/ClickHouse/ClickHouse/pull/58900) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix possible crash in clickhouse-local during loading suggestions [#58907](https://github.com/ClickHouse/ClickHouse/pull/58907) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash when `indexHint` is used [#58911](https://github.com/ClickHouse/ClickHouse/pull/58911) ([Dmitry Novik](https://github.com/novikd)). +* Fix StorageURL forgetting headers on server restart [#58933](https://github.com/ClickHouse/ClickHouse/pull/58933) ([Michael Kolupaev](https://github.com/al13n321)). +* Analyzer: fix storage replacement with insertion block [#58958](https://github.com/ClickHouse/ClickHouse/pull/58958) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix seek in ReadBufferFromZipArchive [#58966](https://github.com/ClickHouse/ClickHouse/pull/58966) ([Michael Kolupaev](https://github.com/al13n321)). +* A fix for experimental inverted indices (don't use in production): `DROP INDEX` of inverted index now removes all relevant files from persistence [#59040](https://github.com/ClickHouse/ClickHouse/pull/59040) ([mochi](https://github.com/MochiXu)). +* Fix data race on query_factories_info [#59049](https://github.com/ClickHouse/ClickHouse/pull/59049) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable "Too many redirects" error retry [#59099](https://github.com/ClickHouse/ClickHouse/pull/59099) ([skyoct](https://github.com/skyoct)). +* Fix not started database shutdown deadlock [#59137](https://github.com/ClickHouse/ClickHouse/pull/59137) ([Sergei Trifonov](https://github.com/serxa)). +* Fix: LIMIT BY and LIMIT in distributed query [#59153](https://github.com/ClickHouse/ClickHouse/pull/59153) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix crash with nullable timezone for `toString` [#59190](https://github.com/ClickHouse/ClickHouse/pull/59190) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix abort in iceberg metadata on bad file paths [#59275](https://github.com/ClickHouse/ClickHouse/pull/59275) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix architecture name in select of Rust target [#59307](https://github.com/ClickHouse/ClickHouse/pull/59307) ([p1rattttt](https://github.com/p1rattttt)). +* Fix a logical error about "not-ready set" for querying from `system.tables` with a subquery in the IN clause. [#59351](https://github.com/ClickHouse/ClickHouse/pull/59351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +## [Changelog for 2023](https://clickhouse.com/docs/en/whats-new/changelog/2023) diff --git a/docs/ja/whats-new/roadmap.md b/docs/ja/whats-new/roadmap.md new file mode 100644 index 00000000000..23864fa05f7 --- /dev/null +++ b/docs/ja/whats-new/roadmap.md @@ -0,0 +1,20 @@ +--- +title: "Roadmap" +slug: /ja/whats-new/roadmap +sidebar_position: 50 +--- + +## Current Roadmap + +The current roadmap is published for open discussion: + +- [2024](https://github.com/ClickHouse/ClickHouse/issues/58392) + +## Previous Roadmaps + +- [2023](https://github.com/ClickHouse/ClickHouse/issues/44767) +- [2022](https://github.com/ClickHouse/ClickHouse/issues/44767) +- [2021](https://github.com/ClickHouse/ClickHouse/issues/17623) +- [2020](https://github.com/ClickHouse/ClickHouse/blob/be29057de1835f6f4a17e03a422b45b81efe6833/docs/ru/whats-new/extended-roadmap.md) +- [2019](https://github.com/ClickHouse/ClickHouse/issues/4785) +- [2018](https://github.com/ClickHouse/clickhouse-presentations/tree/master/roadmap2018) diff --git a/docs/ja/whats-new/security-changelog.md b/docs/ja/whats-new/security-changelog.md new file mode 100644 index 00000000000..202c71ff304 --- /dev/null +++ b/docs/ja/whats-new/security-changelog.md @@ -0,0 +1,204 @@ +--- +slug: /ja/whats-new/security-changelog +sidebar_position: 20 +sidebar_label: Security Changelog +--- + +# Security Changelog + +## Fixed in ClickHouse v24.5, 2024-08-01 {#fixed-in-clickhouse-release-2024-08-01} + +### [CVE-2024-6873](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-432f-r822-j66f) {#CVE-2024-6873} + +It is possible to redirect the execution flow of the ClickHouse server process from an unauthenticated vector by sending a specially crafted request to the ClickHouse server native interface. This redirection is limited to what is available within a 256-byte range of memory at the time of execution. This vulnerability was identified through our Bugbounty program and no known Proof of Concept Remote Code Execution (RCE) code has been produced or exploited. + +Fix has been pushed to the following open-source versions: v23.8.15.35-lts, v24.3.4.147-lts, v24.4.2.141-stable, v24.5.1.1763, v24.6.1.4423-stable + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied to all instances running v24.2 onward. + +Credits: malacupa (Independent researcher) + +## Fixed in ClickHouse v24.1, 2024-01-30 {#fixed-in-clickhouse-release-24-01-30} + +### [CVE-2024-22412](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-45h5-f7g3-gr8r) {#CVE-2024-22412} + +When toggling between user roles while using ClickHouse with query cache enabled, there is a risk of obtaining inaccurate data. ClickHouse advises users with vulnerable versions of ClickHouse not to use the query cache when their application dynamically switches between various roles. + +Fix has been pushed to the following open-source versions: v24.1.1.2048, v24.1.8.22-stable, v23.12.6.19-stable, v23.8.12.13-lts, v23.3.22.3-lts + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v24.0.2.54535. + +Credits: Evan Johnson and Alan Braithwaite from Runreveal team - More information can be found on [their blog post](https://blog.runreveal.com/cve-2024-22412-behind-the-bug-a-classic-caching-problem-in-the-clickhouse-query-cache/). + +## Fixed in ClickHouse v23.10.5.20, 2023-11-26 {#fixed-in-clickhouse-release-23-10-5-20-2023-11-26} + +### [CVE-2023-47118](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-g22g-p6q2-x39v) {#CVE-2023-47118} + +A heap buffer overflow vulnerability affecting the native interface running by default on port 9000/tcp. An attacker, by triggering a bug in the T64 compression codec, can cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.2.13, v23.9.4.11, v23.8.6.16, v23.3.16.7 + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47475. + +Credits: malacupa (Independent researcher) + +### [CVE-2023-48298](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-qw9f-qv29-8938) {#CVE-2023-48298} + +An integer underflow vulnerability in the FPC compressions codec. An attacker can use it to cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.4.25, v23.9.5.29, v23.8.7.24, v23.3.17.13. + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47475. + +Credits: malacupa (Independent researcher) + +### [CVE-2023-48704](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-5rmf-5g48-xv63) {#CVE-2023-48704} + +A heap buffer overflow vulnerability affecting the native interface running by default on port 9000/tcp. An attacker, by triggering a bug in the Gorilla codec, can cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.5.20, v23.9.6.20, v23.8.8.20, v23.3.18.15. + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47551. + +Credits: malacupa (Independent researcher) + +## Fixed in ClickHouse 22.9.1.2603, 2022-09-22 {#fixed-in-clickhouse-release-22-9-1-2603-2022-9-22} + +### CVE-2022-44011 {#CVE-2022-44011} + +A heap buffer overflow issue was discovered in ClickHouse server. A malicious user with ability to load data into ClickHouse server could crash the ClickHouse server by inserting a malformed CapnProto object. + +Fix has been pushed to version 22.9.1.2603, 22.8.2.11, 22.7.4.16, 22.6.6.16, 22.3.12.19 + +Credits: Kiojj (independent researcher) + +### CVE-2022-44010 {#CVE-2022-44010} + +A heap buffer overflow issue was discovered in ClickHouse server. An attacker could send a specially crafted HTTP request to the HTTP Endpoint (listening on port 8123 by default), causing a heap-based buffer overflow that crashes the ClickHouse server process. This attack does not require authentication. + +Fix has been pushed to version 22.9.1.2603, 22.8.2.11, 22.7.4.16, 22.6.6.16, 22.3.12.19 + +Credits: Kiojj (independent researcher) + +## Fixed in ClickHouse 21.10.2.15, 2021-10-18 {#fixed-in-clickhouse-release-21-10-2-215-2021-10-18} + +### CVE-2021-43304 {#cve-2021-43304} + +Heap buffer overflow in ClickHouse's LZ4 compression codec when parsing a malicious query. There is no verification that the copy operations in the LZ4::decompressImpl loop and especially the arbitrary copy operation wildCopy(op, ip, copy_end), don’t exceed the destination buffer’s limits. + +Credits: JFrog Security Research Team + +### CVE-2021-43305 {#cve-2021-43305} + +Heap buffer overflow in ClickHouse's LZ4 compression codec when parsing a malicious query. There is no verification that the copy operations in the LZ4::decompressImpl loop and especially the arbitrary copy operation wildCopy(op, ip, copy_end), don’t exceed the destination buffer’s limits. This issue is very similar to CVE-2021-43304, but the vulnerable copy operation is in a different wildCopy call. + +Credits: JFrog Security Research Team + +### CVE-2021-42387 {#cve-2021-42387} + +Heap out-of-bounds read in ClickHouse's LZ4 compression codec when parsing a malicious query. As part of the LZ4::decompressImpl() loop, a 16-bit unsigned user-supplied value ('offset') is read from the compressed data. The offset is later used in the length of a copy operation, without checking the upper bounds of the source of the copy operation. + +Credits: JFrog Security Research Team + +### CVE-2021-42388 {#cve-2021-42388} + +Heap out-of-bounds read in ClickHouse's LZ4 compression codec when parsing a malicious query. As part of the LZ4::decompressImpl() loop, a 16-bit unsigned user-supplied value ('offset') is read from the compressed data. The offset is later used in the length of a copy operation, without checking the lower bounds of the source of the copy operation. + +Credits: JFrog Security Research Team + +### CVE-2021-42389 {#cve-2021-42389} + +Divide-by-zero in ClickHouse's Delta compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +### CVE-2021-42390 {#cve-2021-42390} + +Divide-by-zero in ClickHouse's DeltaDouble compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +### CVE-2021-42391 {#cve-2021-42391} + +Divide-by-zero in ClickHouse's Gorilla compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +## Fixed in ClickHouse 21.4.3.21, 2021-04-12 {#fixed-in-clickhouse-release-21-4-3-21-2021-04-12} + +### CVE-2021-25263 {#cve-2021-25263} + +An attacker that has CREATE DICTIONARY privilege, can read arbitary file outside permitted directory. + +Fix has been pushed to versions 20.8.18.32-lts, 21.1.9.41-stable, 21.2.9.41-stable, 21.3.6.55-lts, 21.4.3.21-stable and later. + +Credits: [Vyacheslav Egoshin](https://twitter.com/vegoshin) + +## Fixed in ClickHouse Release 19.14.3.3, 2019-09-10 {#fixed-in-clickhouse-release-19-14-3-3-2019-09-10} + +### CVE-2019-15024 {#cve-2019-15024} + +Аn attacker that has write access to ZooKeeper and who can run a custom server available from the network where ClickHouse runs, can create a custom-built malicious server that will act as a ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from the malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. + +Credits: Eldar Zaitov of Yandex Information Security Team + +### CVE-2019-16535 {#cve-2019-16535} + +Аn OOB read, OOB write and integer underflow in decompression algorithms can be used to achieve RCE or DoS via native protocol. + +Credits: Eldar Zaitov of Yandex Information Security Team + +### CVE-2019-16536 {#cve-2019-16536} + +Stack overflow leading to DoS can be triggered by a malicious authenticated client. + +Credits: Eldar Zaitov of Yandex Information Security Team + +## Fixed in ClickHouse Release 19.13.6.1, 2019-09-20 {#fixed-in-clickhouse-release-19-13-6-1-2019-09-20} + +### CVE-2019-18657 {#cve-2019-18657} + +Table function `url` had the vulnerability allowed the attacker to inject arbitrary HTTP headers in the request. + +Credits: [Nikita Tikhomirov](https://github.com/NSTikhomirov) + +## Fixed in ClickHouse Release 18.12.13, 2018-09-10 {#fixed-in-clickhouse-release-18-12-13-2018-09-10} + +### CVE-2018-14672 {#cve-2018-14672} + +Functions for loading CatBoost models allowed path traversal and reading arbitrary files through error messages. + +Credits: Andrey Krasichkov of Yandex Information Security Team + +## Fixed in ClickHouse Release 18.10.3, 2018-08-13 {#fixed-in-clickhouse-release-18-10-3-2018-08-13} + +### CVE-2018-14671 {#cve-2018-14671} + +unixODBC allowed loading arbitrary shared objects from the file system which led to a Remote Code Execution vulnerability. + +Credits: Andrey Krasichkov and Evgeny Sidorov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54388, 2018-06-28 {#fixed-in-clickhouse-release-1-1-54388-2018-06-28} + +### CVE-2018-14668 {#cve-2018-14668} + +“remote” table function allowed arbitrary symbols in “user”, “password” and “default_database” fields which led to Cross Protocol Request Forgery Attacks. + +Credits: Andrey Krasichkov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54390, 2018-07-06 {#fixed-in-clickhouse-release-1-1-54390-2018-07-06} + +### CVE-2018-14669 {#cve-2018-14669} + +ClickHouse MySQL client had “LOAD DATA LOCAL INFILE” functionality enabled that allowed a malicious MySQL database read arbitrary files from the connected ClickHouse server. + +Credits: Andrey Krasichkov and Evgeny Sidorov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54131, 2017-01-10 {#fixed-in-clickhouse-release-1-1-54131-2017-01-10} + +### CVE-2018-14670 {#cve-2018-14670} + +Incorrect configuration in deb package could lead to the unauthorized use of the database. + +Credits: the UK’s National Cyber Security Centre (NCSC) + diff --git a/docs/ru/faq/general/who-is-using-clickhouse.md b/docs/ru/faq/general/who-is-using-clickhouse.md index 1aa84906fe8..06ed53276ad 100644 --- a/docs/ru/faq/general/who-is-using-clickhouse.md +++ b/docs/ru/faq/general/who-is-using-clickhouse.md @@ -12,7 +12,7 @@ sidebar_position: 9 Итак, как же узнать, кто пользуется ClickHouse? -Один из способов — **поспрашивать в своем окружении**. В разговорах люди более охотно делятся тем, какие технологии внедрены в их компаниях, какие задачи решаются с их помощью, могут назвать характеристики аппаратного обеспечения, объемы данных и т.д. Мы регулярно разговариваем с пользователями во время [митапов ClickHouse](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists) по всему миру и слышали о более чем 1000 компаний, которые пользуются ClickHouse. К сожалению, мы не можем раскрывать подробности, потому что по умолчанию считаем такие истории защищенными NDA, чтобы избежать любых возможных проблем. Вы можете прийти на любой из наших будущих митапов и самостоятельно поговорить с другими пользователями. Мы анонсируем события по разным каналам, например, вы можете подписаться на [наш Twitter](http://twitter.com/ClickHouseDB/). +Один из способов — **поспрашивать в своем окружении**. В разговорах люди более охотно делятся тем, какие технологии внедрены в их компаниях, какие задачи решаются с их помощью, могут назвать характеристики аппаратного обеспечения, объемы данных и т.д. Мы регулярно разговариваем с пользователями во время [митапов ClickHouse](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists) по всему миру и слышали о более чем 1000 компаний, которые пользуются ClickHouse. К сожалению, мы не можем раскрывать подробности, потому что по умолчанию считаем такие истории защищенными NDA, чтобы избежать любых возможных проблем. Вы можете прийти на любой из наших будущих митапов и самостоятельно поговорить с другими пользователями. Мы анонсируем события по разным каналам, например, вы можете подписаться на [наш X](http://x.com/ClickHouseDB/) или [Bluesky](https://bsky.app/profile/clickhouse.com). Второй способ узнать — посмотреть, что компании **говорят публично** о том, как именно они пользуются ClickHouse. Это более существенная информация, потому что ее можно найти в публикациях в блогах, видеозаписях разговоров, презентациях и т.д. Мы собираем ссылки на такие материалы на своей странице **[Пользователи ClickHouse](https://clickhouse.com/docs/en/introduction/adopters/)**. Будем рады, если вы поделитесь историей вашей компании или ссылками по теме (но всегда помните о том, что не стоит нарушать NDA). diff --git a/docs/ru/operations/settings/settings.md b/docs/ru/operations/settings/settings.md index bbe1f071381..222acc7aa4c 100644 --- a/docs/ru/operations/settings/settings.md +++ b/docs/ru/operations/settings/settings.md @@ -4215,3 +4215,9 @@ SELECT toFloat64('1.7091'), toFloat64('1.5008753E7') SETTINGS precise_float_pars │ 1.7091 │ 15008753 │ └─────────────────────┴──────────────────────────┘ ``` + +## push_external_roles_in_interserver_queries + +Позволяет передавать роли пользователя от инициатора запроса другим нодам при выполнении запроса. + +Значение по умолчанию: `true`. diff --git a/docs/zh/faq/general/who-is-using-clickhouse.md b/docs/zh/faq/general/who-is-using-clickhouse.md index c5ea6a07307..35585bb7dab 100644 --- a/docs/zh/faq/general/who-is-using-clickhouse.md +++ b/docs/zh/faq/general/who-is-using-clickhouse.md @@ -13,8 +13,8 @@ sidebar_position: 9 那么,如何辨别谁在使用ClickHouse呢? -一种方法是询问周围的人。如果不是书面形式,人们更愿意分享他们公司使用的技术、用例、使用的硬件类型、数据量等。我们定期在[ClickHouse meetup](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists)上与世界各地的用户进行交流,并听到了大约1000多家使用ClickHouse的公司的故事。不幸的是,这是不可复制的,我们试图把这些故事当作是在保密协议下被告知的,以避免任何潜在的麻烦。但你可以参加我们未来的任何聚会,并与其他用户单独交谈。有多种方式宣布聚会,例如,你可以订阅[我们的Twitter](http://twitter.com/ClickHouseDB/)。 +一种方法是询问周围的人。如果不是书面形式,人们更愿意分享他们公司使用的技术、用例、使用的硬件类型、数据量等。我们定期在[ClickHouse meetup](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists)上与世界各地的用户进行交流,并听到了大约1000多家使用ClickHouse的公司的故事。不幸的是,这是不可复制的,我们试图把这些故事当作是在保密协议下被告知的,以避免任何潜在的麻烦。但你可以参加我们未来的任何聚会,并与其他用户单独交谈。有多种方式宣布聚会,例如,你可以订阅[我们的X](http://x.com/ClickHouseDB/)、[Bluesky](https://bsky.app/profile/clickhouse.com)。 第二种方法是寻找**公开表示**使用ClickHouse的公司。因为通常会有一些确凿的证据,如博客文章、谈话视频录音、幻灯片等。我们在我们的[**Adopters**](../../introduction/adopters.md)页面上收集指向此类证据的链接。你可以随意提供你雇主的故事,或者只是一些你偶然发现的链接(但尽量不要在这个过程中违反保密协议)。 -你可以在采用者名单中找到一些非常大的公司,比如彭博社、思科、中国电信、腾讯或优步,但通过第一种方法,我们发现还有更多。例如,如果你看看《福布斯》[(2020年)列出的最大IT公司名单](https://www.forbes.com/sites/hanktucker/2020/05/13/worlds-largest-technology-companies-2020-apple-stays-on-top-zoom-and-uber-debut/),超过一半的公司都在以某种方式使用ClickHouse。此外,不提[Yandex](../../introduction/history.md)是不公平的,该公司最初于2016年开放ClickHouse,碰巧是欧洲最大的it公司之一。 \ No newline at end of file +你可以在采用者名单中找到一些非常大的公司,比如彭博社、思科、中国电信、腾讯或优步,但通过第一种方法,我们发现还有更多。例如,如果你看看《福布斯》[(2020年)列出的最大IT公司名单](https://www.forbes.com/sites/hanktucker/2020/05/13/worlds-largest-technology-companies-2020-apple-stays-on-top-zoom-and-uber-debut/),超过一半的公司都在以某种方式使用ClickHouse。此外,不提[Yandex](../../introduction/history.md)是不公平的,该公司最初于2016年开放ClickHouse,碰巧是欧洲最大的it公司之一。 diff --git a/docs/zh/sql-reference/statements/check-grant.mdx b/docs/zh/sql-reference/statements/check-grant.mdx new file mode 100644 index 00000000000..60c95699a5e --- /dev/null +++ b/docs/zh/sql-reference/statements/check-grant.mdx @@ -0,0 +1,10 @@ +--- +slug: /zh/sql-reference/statements/check-grant +sidebar_position: 56 +sidebar_label: CHECK +title: "CHECK GRANT Statement" +--- + +import Content from '@site/docs/en/sql-reference/statements/check-grant.md'; + + diff --git a/programs/benchmark/Benchmark.cpp b/programs/benchmark/Benchmark.cpp index 86cc2ebe92f..19fd46b5f1a 100644 --- a/programs/benchmark/Benchmark.cpp +++ b/programs/benchmark/Benchmark.cpp @@ -36,6 +36,7 @@ #include #include #include +#include "IO/WriteBuffer.h" /** A tool for evaluating ClickHouse performance. @@ -223,7 +224,7 @@ private: ContextMutablePtr global_context; QueryProcessingStage::Enum query_processing_stage; - WriteBufferFromFileDescriptor log{STDERR_FILENO}; + AutoFinalizedWriteBuffer log{STDERR_FILENO}; std::atomic consecutive_errors{0}; diff --git a/programs/client/Client.cpp b/programs/client/Client.cpp index 05e1e61be7b..f78071b1278 100644 --- a/programs/client/Client.cpp +++ b/programs/client/Client.cpp @@ -220,7 +220,7 @@ std::vector Client::loadWarningMessages() "" /* query_id */, QueryProcessingStage::Complete, &client_context->getSettingsRef(), - &client_context->getClientInfo(), false, {}); + &client_context->getClientInfo(), false, {}, {}); while (true) { Packet packet = connection->receivePacket(); diff --git a/programs/compressor/Compressor.cpp b/programs/compressor/Compressor.cpp index e73f61dde83..27f0bd1614b 100644 --- a/programs/compressor/Compressor.cpp +++ b/programs/compressor/Compressor.cpp @@ -216,6 +216,8 @@ int mainEntryClickHouseCompressor(int argc, char ** argv) to.finalize(); } } + + wb->finalize(); } catch (...) { diff --git a/programs/git-import/git-import.cpp b/programs/git-import/git-import.cpp index 5430c4b0a42..0a1a2e99dbc 100644 --- a/programs/git-import/git-import.cpp +++ b/programs/git-import/git-import.cpp @@ -529,6 +529,13 @@ struct ResultWriter } } } + + void finalize() + { + commits.finalize(); + file_changes.finalize(); + line_changes.finalize(); + } }; @@ -1178,6 +1185,8 @@ void processLog(const Options & options) if (i + num_threads < num_commits) show_commands[i % num_threads] = gitShow(hashes[i + num_threads]); } + + result.finalize(); } diff --git a/programs/install/Install.cpp b/programs/install/Install.cpp index 4029d3203b0..281d0e45aa9 100644 --- a/programs/install/Install.cpp +++ b/programs/install/Install.cpp @@ -100,10 +100,14 @@ namespace fs = std::filesystem; static auto executeScript(const std::string & command, bool throw_on_error = false) { auto sh = ShellCommand::execute(command); + WriteBufferFromFileDescriptor wb_stdout(STDOUT_FILENO); - WriteBufferFromFileDescriptor wb_stderr(STDERR_FILENO); copyData(sh->out, wb_stdout); + wb_stdout.finalize(); + + WriteBufferFromFileDescriptor wb_stderr(STDERR_FILENO); copyData(sh->err, wb_stderr); + wb_stderr.finalize(); if (throw_on_error) { @@ -1125,6 +1129,7 @@ namespace WriteBufferFromFileDescriptor std_err(STDERR_FILENO); copyData(sh->err, std_err); + std_err.finalize(); sh->tryWait(); } diff --git a/programs/keeper-client/KeeperClient.cpp b/programs/keeper-client/KeeperClient.cpp index 4bdddaec59c..782ac816150 100644 --- a/programs/keeper-client/KeeperClient.cpp +++ b/programs/keeper-client/KeeperClient.cpp @@ -34,6 +34,7 @@ String KeeperClient::executeFourLetterCommand(const String & command) out.write(command.data(), command.size()); out.next(); + out.finalize(); String result; readStringUntilEOF(result, in); diff --git a/programs/library-bridge/LibraryBridgeHandlers.cpp b/programs/library-bridge/LibraryBridgeHandlers.cpp index 71fb45ec06b..8280a6d25ad 100644 --- a/programs/library-bridge/LibraryBridgeHandlers.cpp +++ b/programs/library-bridge/LibraryBridgeHandlers.cpp @@ -579,34 +579,13 @@ void CatBoostLibraryBridgeRequestHandler::handleRequest(HTTPServerRequest & requ processError(response, "Unknown library method '" + method + "'"); LOG_ERROR(log, "Unknown library method: '{}'", method); } - } - catch (...) - { - auto message = getCurrentExceptionMessage(true); - LOG_ERROR(log, "Failed to process request. Error: {}", message); - response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, message); // can't call process_error, because of too soon response sending - try - { - writeStringBinary(message, out); - out.finalize(); - } - catch (...) - { - tryLogCurrentException(log); - out.cancel(); - } - - return; - } - - try - { out.finalize(); } catch (...) { - tryLogCurrentException(log); + tryLogCurrentException(log, "Failed to process request"); + out.cancelWithException(request, getCurrentExceptionCode(), getCurrentExceptionMessage(true), nullptr); } } diff --git a/programs/obfuscator/Obfuscator.cpp b/programs/obfuscator/Obfuscator.cpp index 6bd3865b591..8aa91ebaae0 100644 --- a/programs/obfuscator/Obfuscator.cpp +++ b/programs/obfuscator/Obfuscator.cpp @@ -1474,6 +1474,8 @@ try rewind_needed = true; } + file_out.finalize(); + return 0; } catch (...) diff --git a/programs/odbc-bridge/ColumnInfoHandler.cpp b/programs/odbc-bridge/ColumnInfoHandler.cpp index 06dd25ce274..058c23dc2ee 100644 --- a/programs/odbc-bridge/ColumnInfoHandler.cpp +++ b/programs/odbc-bridge/ColumnInfoHandler.cpp @@ -207,15 +207,8 @@ void ODBCColumnsInfoHandler::handleRequest(HTTPServerRequest & request, HTTPServ throw Exception(ErrorCodes::UNKNOWN_TABLE, "Columns definition was not returned"); WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD); - try - { - writeStringBinary(columns.toString(), out); - out.finalize(); - } - catch (...) - { - out.finalize(); - } + writeStringBinary(columns.toString(), out); + out.finalize(); } catch (...) { diff --git a/programs/odbc-bridge/IdentifierQuoteHandler.cpp b/programs/odbc-bridge/IdentifierQuoteHandler.cpp index 7b5b69cff63..03d34175bbe 100644 --- a/programs/odbc-bridge/IdentifierQuoteHandler.cpp +++ b/programs/odbc-bridge/IdentifierQuoteHandler.cpp @@ -80,15 +80,8 @@ void IdentifierQuoteHandler::handleRequest(HTTPServerRequest & request, HTTPServ auto identifier = getIdentifierQuote(std::move(connection)); WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD); - try - { - writeStringBinary(identifier, out); - out.finalize(); - } - catch (...) - { - out.finalize(); - } + writeStringBinary(identifier, out); + out.finalize(); } catch (...) { diff --git a/programs/odbc-bridge/MainHandler.cpp b/programs/odbc-bridge/MainHandler.cpp index 82ebcc3340a..7ab5b9def6f 100644 --- a/programs/odbc-bridge/MainHandler.cpp +++ b/programs/odbc-bridge/MainHandler.cpp @@ -194,33 +194,13 @@ void ODBCHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse CompletedPipelineExecutor executor(pipeline); executor.execute(); } - } - catch (...) - { - auto message = getCurrentExceptionMessage(true); - response.setStatusAndReason( - Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); // can't call process_error, because of too soon response sending - try - { - writeStringBinary(message, out); - out.finalize(); - } - catch (...) - { - tryLogCurrentException(log); - } - - tryLogCurrentException(log); - } - - try - { out.finalize(); } catch (...) { tryLogCurrentException(log); + out.cancelWithException(request, getCurrentExceptionCode(), getCurrentExceptionMessage(true), nullptr); } } diff --git a/programs/odbc-bridge/SchemaAllowedHandler.cpp b/programs/odbc-bridge/SchemaAllowedHandler.cpp index c986e61e715..5c12bd95489 100644 --- a/programs/odbc-bridge/SchemaAllowedHandler.cpp +++ b/programs/odbc-bridge/SchemaAllowedHandler.cpp @@ -94,15 +94,8 @@ void SchemaAllowedHandler::handleRequest(HTTPServerRequest & request, HTTPServer bool result = isSchemaAllowed(std::move(connection)); WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD); - try - { - writeBoolText(result, out); - out.finalize(); - } - catch (...) - { - out.finalize(); - } + writeBoolText(result, out); + out.finalize(); } catch (...) { diff --git a/src/Access/ContextAccess.cpp b/src/Access/ContextAccess.cpp index 06e89d78339..fd7803f1d27 100644 --- a/src/Access/ContextAccess.cpp +++ b/src/Access/ContextAccess.cpp @@ -366,6 +366,13 @@ void ContextAccess::setUser(const UserPtr & user_) const current_roles_with_admin_option = user->granted_roles.findGrantedWithAdminOption(*params.current_roles); } + if (params.external_roles && !params.external_roles->empty()) + { + current_roles.insert(current_roles.end(), params.external_roles->begin(), params.external_roles->end()); + auto new_granted_with_admin_option = user->granted_roles.findGrantedWithAdminOption(*params.external_roles); + current_roles_with_admin_option.insert(current_roles_with_admin_option.end(), new_granted_with_admin_option.begin(), new_granted_with_admin_option.end()); + } + subscription_for_roles_changes.reset(); enabled_roles = access_control->getEnabledRoles(current_roles, current_roles_with_admin_option); subscription_for_roles_changes = enabled_roles->subscribeForChanges([weak_ptr = weak_from_this()](const std::shared_ptr & roles_info_) @@ -516,7 +523,6 @@ std::optional ContextAccess::getQuotaUsage() const return getQuota()->getUsage(); } - SettingsChanges ContextAccess::getDefaultSettings() const { std::lock_guard lock{mutex}; diff --git a/src/Access/ContextAccessParams.cpp b/src/Access/ContextAccessParams.cpp index f5a405c7bc1..4d86940b842 100644 --- a/src/Access/ContextAccessParams.cpp +++ b/src/Access/ContextAccessParams.cpp @@ -18,6 +18,7 @@ ContextAccessParams::ContextAccessParams( bool full_access_, bool use_default_roles_, const std::shared_ptr> & current_roles_, + const std::shared_ptr> & external_roles_, const Settings & settings_, const String & current_database_, const ClientInfo & client_info_) @@ -25,6 +26,7 @@ ContextAccessParams::ContextAccessParams( , full_access(full_access_) , use_default_roles(use_default_roles_) , current_roles(current_roles_) + , external_roles(external_roles_) , readonly(settings_[Setting::readonly]) , allow_ddl(settings_[Setting::allow_ddl]) , allow_introspection(settings_[Setting::allow_introspection_functions]) @@ -59,6 +61,17 @@ String ContextAccessParams::toString() const } out << "]"; } + if (external_roles && !external_roles->empty()) + { + out << separator() << "external_roles = ["; + for (size_t i = 0; i != external_roles->size(); ++i) + { + if (i) + out << ", "; + out << (*external_roles)[i]; + } + out << "]"; + } if (readonly) out << separator() << "readonly = " << readonly; if (allow_ddl) @@ -107,6 +120,7 @@ bool operator ==(const ContextAccessParams & left, const ContextAccessParams & r CONTEXT_ACCESS_PARAMS_EQUALS(full_access) CONTEXT_ACCESS_PARAMS_EQUALS(use_default_roles) CONTEXT_ACCESS_PARAMS_EQUALS(current_roles) + CONTEXT_ACCESS_PARAMS_EQUALS(external_roles) CONTEXT_ACCESS_PARAMS_EQUALS(readonly) CONTEXT_ACCESS_PARAMS_EQUALS(allow_ddl) CONTEXT_ACCESS_PARAMS_EQUALS(allow_introspection) @@ -157,6 +171,7 @@ bool operator <(const ContextAccessParams & left, const ContextAccessParams & ri CONTEXT_ACCESS_PARAMS_LESS(full_access) CONTEXT_ACCESS_PARAMS_LESS(use_default_roles) CONTEXT_ACCESS_PARAMS_LESS(current_roles) + CONTEXT_ACCESS_PARAMS_LESS(external_roles) CONTEXT_ACCESS_PARAMS_LESS(readonly) CONTEXT_ACCESS_PARAMS_LESS(allow_ddl) CONTEXT_ACCESS_PARAMS_LESS(allow_introspection) diff --git a/src/Access/ContextAccessParams.h b/src/Access/ContextAccessParams.h index 07503a3af6d..82592d630dd 100644 --- a/src/Access/ContextAccessParams.h +++ b/src/Access/ContextAccessParams.h @@ -19,6 +19,7 @@ public: bool full_access_, bool use_default_roles_, const std::shared_ptr> & current_roles_, + const std::shared_ptr> & external_roles_, const Settings & settings_, const String & current_database_, const ClientInfo & client_info_); @@ -31,6 +32,7 @@ public: const bool use_default_roles; const std::shared_ptr> current_roles; + const std::shared_ptr> external_roles; const UInt64 readonly; const bool allow_ddl; diff --git a/src/Access/LDAPAccessStorage.cpp b/src/Access/LDAPAccessStorage.cpp index 2636a3cffbb..97b7b1ac52e 100644 --- a/src/Access/LDAPAccessStorage.cpp +++ b/src/Access/LDAPAccessStorage.cpp @@ -26,7 +26,6 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } - LDAPAccessStorage::LDAPAccessStorage(const String & storage_name_, AccessControl & access_control_, const Poco::Util::AbstractConfiguration & config, const String & prefix) : IAccessStorage(storage_name_), access_control(access_control_), memory_storage(storage_name_, access_control.getChangesNotifier(), false) { @@ -320,6 +319,10 @@ std::set LDAPAccessStorage::mapExternalRolesNoLock(const LDAPClient::Sea { std::set role_names; + // If this node can't access LDAP server (or has not privileges to fetch roles) and gets empty list of external roles + if (external_roles.empty()) + return role_names; + if (external_roles.size() != role_search_params.size()) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unable to map external roles"); diff --git a/src/Analyzer/Passes/GroupingFunctionsResolvePass.cpp b/src/Analyzer/Passes/GroupingFunctionsResolvePass.cpp index dcf024bb46c..fc122730b37 100644 --- a/src/Analyzer/Passes/GroupingFunctionsResolvePass.cpp +++ b/src/Analyzer/Passes/GroupingFunctionsResolvePass.cpp @@ -12,9 +12,13 @@ #include #include #include +#include + +#include namespace DB { + namespace Setting { extern const SettingsBool force_grouping_standard_compatibility; @@ -27,6 +31,26 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } +struct GroupByKeyComparator +{ + GroupByKeyComparator(QueryTreeNodePtr node_) /// NOLINT + : node(std::move(node_)) + , hash(node->getTreeHash({.compare_aliases = false, .compare_types = true})) + {} + + bool operator==(const GroupByKeyComparator & other) const { return hash == other.hash && compareGroupByKeys(node, other.node); } + + bool operator!=(const GroupByKeyComparator & other) const { return !(*this == other); } + + struct Hasher { size_t operator()(const GroupByKeyComparator & key) const { return key.hash.low64; } }; + + QueryTreeNodePtr node = nullptr; + CityHash_v1_0_2::uint128 hash; +}; + +template +using AggredationKeyNodeMap = std::unordered_map; + namespace { @@ -42,7 +66,7 @@ class GroupingFunctionResolveVisitor : public InDepthQueryTreeVisitorWithContext { public: GroupingFunctionResolveVisitor(GroupByKind group_by_kind_, - QueryTreeNodePtrWithHashMap aggregation_key_to_index_, + AggredationKeyNodeMap aggregation_key_to_index_, ColumnNumbersList grouping_sets_keys_indices_, ContextPtr context_) : InDepthQueryTreeVisitorWithContext(std::move(context_)) @@ -67,9 +91,12 @@ public: { auto it = aggregation_key_to_index.find(argument); if (it == aggregation_key_to_index.end()) + { throw Exception(ErrorCodes::BAD_ARGUMENTS, - "Argument {} of GROUPING function is not a part of GROUP BY clause", - argument->formatASTForErrorMessage()); + "Argument {} of GROUPING function is not a part of GROUP BY clause [{}]", + argument->formatASTForErrorMessage(), + fmt::join(aggregation_key_to_index | std::views::transform([](const auto & e) { return e.first.node->formatASTForErrorMessage(); }), ", ")); + } arguments_indexes.push_back(it->second); } @@ -133,7 +160,7 @@ public: private: GroupByKind group_by_kind; - QueryTreeNodePtrWithHashMap aggregation_key_to_index; + AggredationKeyNodeMap aggregation_key_to_index; ColumnNumbersList grouping_sets_keys_indexes; }; @@ -142,7 +169,7 @@ void resolveGroupingFunctions(QueryTreeNodePtr & query_node, ContextPtr context) auto & query_node_typed = query_node->as(); size_t aggregation_node_index = 0; - QueryTreeNodePtrWithHashMap aggregation_key_to_index; + AggredationKeyNodeMap aggregation_key_to_index; std::vector grouping_sets_used_aggregation_keys_list; diff --git a/src/Analyzer/ValidationUtils.cpp b/src/Analyzer/ValidationUtils.cpp index d1ff3c916f8..d6afe8c59d5 100644 --- a/src/Analyzer/ValidationUtils.cpp +++ b/src/Analyzer/ValidationUtils.cpp @@ -80,6 +80,65 @@ void validateFilters(const QueryTreeNodePtr & query_node) validateFilter(query_node_typed.getQualify(), "QUALIFY", query_node); } +bool areColumnSourcesEqual(const QueryTreeNodePtr & lhs, const QueryTreeNodePtr & rhs) +{ + using NodePair = std::pair; + std::vector nodes_to_process; + nodes_to_process.emplace_back(lhs.get(), rhs.get()); + + while (!nodes_to_process.empty()) + { + const auto [lhs_node, rhs_node] = nodes_to_process.back(); + nodes_to_process.pop_back(); + + if (lhs_node->getNodeType() != rhs_node->getNodeType()) + return false; + + if (lhs_node->getNodeType() == QueryTreeNodeType::COLUMN) + { + const auto * lhs_column_node = lhs_node->as(); + const auto * rhs_column_node = rhs_node->as(); + if (!lhs_column_node->getColumnSource()->isEqual(*rhs_column_node->getColumnSource())) + return false; + } + + const auto & lhs_children = lhs_node->getChildren(); + const auto & rhs_children = rhs_node->getChildren(); + if (lhs_children.size() != rhs_children.size()) + return false; + + for (size_t i = 0; i < lhs_children.size(); ++i) + { + const auto & lhs_child = lhs_children[i]; + const auto & rhs_child = rhs_children[i]; + + if (!lhs_child && !rhs_child) + continue; + if (lhs_child && !rhs_child) + return false; + if (!lhs_child && rhs_child) + return false; + + nodes_to_process.emplace_back(lhs_child.get(), rhs_child.get()); + } + } + return true; +} + +bool compareGroupByKeys(const QueryTreeNodePtr & node, const QueryTreeNodePtr & group_by_key_node) +{ + if (node->isEqual(*group_by_key_node, {.compare_aliases = false})) + { + /** Column sources should be compared with aliases for correct GROUP BY keys validation, + * otherwise t2.x and t1.x will be considered as the same column: + * SELECT t2.x FROM t1 JOIN t1 as t2 ON t1.x = t2.x GROUP BY t1.x; + */ + if (areColumnSourcesEqual(node, group_by_key_node)) + return true; + } + return false; +} + namespace { @@ -154,51 +213,6 @@ public: private: - static bool areColumnSourcesEqual(const QueryTreeNodePtr & lhs, const QueryTreeNodePtr & rhs) - { - using NodePair = std::pair; - std::vector nodes_to_process; - nodes_to_process.emplace_back(lhs.get(), rhs.get()); - - while (!nodes_to_process.empty()) - { - const auto [lhs_node, rhs_node] = nodes_to_process.back(); - nodes_to_process.pop_back(); - - if (lhs_node->getNodeType() != rhs_node->getNodeType()) - return false; - - if (lhs_node->getNodeType() == QueryTreeNodeType::COLUMN) - { - const auto * lhs_column_node = lhs_node->as(); - const auto * rhs_column_node = rhs_node->as(); - if (!lhs_column_node->getColumnSource()->isEqual(*rhs_column_node->getColumnSource())) - return false; - } - - const auto & lhs_children = lhs_node->getChildren(); - const auto & rhs_children = rhs_node->getChildren(); - if (lhs_children.size() != rhs_children.size()) - return false; - - for (size_t i = 0; i < lhs_children.size(); ++i) - { - const auto & lhs_child = lhs_children[i]; - const auto & rhs_child = rhs_children[i]; - - if (!lhs_child && !rhs_child) - continue; - if (lhs_child && !rhs_child) - return false; - if (!lhs_child && rhs_child) - return false; - - nodes_to_process.emplace_back(lhs_child.get(), rhs_child.get()); - } - } - return true; - } - bool nodeIsAggregateFunctionOrInGroupByKeys(const QueryTreeNodePtr & node) const { if (auto * function_node = node->as()) @@ -207,15 +221,8 @@ private: for (const auto & group_by_key_node : group_by_keys_nodes) { - if (node->isEqual(*group_by_key_node, {.compare_aliases = false})) - { - /** Column sources should be compared with aliases for correct GROUP BY keys validation, - * otherwise t2.x and t1.x will be considered as the same column: - * SELECT t2.x FROM t1 JOIN t1 as t2 ON t1.x = t2.x GROUP BY t1.x; - */ - if (areColumnSourcesEqual(node, group_by_key_node)) - return true; - } + if (compareGroupByKeys(node, group_by_key_node)) + return true; } return false; diff --git a/src/Analyzer/ValidationUtils.h b/src/Analyzer/ValidationUtils.h index 3041447af17..df2cdb0d52f 100644 --- a/src/Analyzer/ValidationUtils.h +++ b/src/Analyzer/ValidationUtils.h @@ -41,4 +41,10 @@ void validateTreeSize(const QueryTreeNodePtr & node, size_t max_size, std::unordered_map & node_to_tree_size); + +/** Compare node with group by key node. + * Such comparison does not take into account aliases, but checks types and column sources. + */ +bool compareGroupByKeys(const QueryTreeNodePtr & node, const QueryTreeNodePtr & group_by_key_node); + } diff --git a/src/Backups/BackupImpl.cpp b/src/Backups/BackupImpl.cpp index af3fa5531b8..71db7a60744 100644 --- a/src/Backups/BackupImpl.cpp +++ b/src/Backups/BackupImpl.cpp @@ -232,8 +232,13 @@ void BackupImpl::openArchive() void BackupImpl::closeArchive(bool finalize) { - if (finalize && archive_writer) - archive_writer->finalize(); + if (archive_writer) + { + if (finalize) + archive_writer->finalize(); + else + archive_writer->cancel(); + } archive_reader.reset(); archive_writer.reset(); diff --git a/src/Backups/BackupsWorker.cpp b/src/Backups/BackupsWorker.cpp index 88ebf8eef32..226a90d1dbf 100644 --- a/src/Backups/BackupsWorker.cpp +++ b/src/Backups/BackupsWorker.cpp @@ -51,6 +51,7 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; extern const int LOGICAL_ERROR; extern const int QUERY_WAS_CANCELLED; + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; } using OperationID = BackupOperationID; @@ -90,14 +91,14 @@ namespace BackupStatus getBackupStatusFromCurrentException() { - if (getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED) + if (getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED || getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT) return BackupStatus::BACKUP_CANCELLED; return BackupStatus::BACKUP_FAILED; } BackupStatus getRestoreStatusFromCurrentException() { - if (getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED) + if (getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED || getCurrentExceptionCode() == ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT) return BackupStatus::RESTORE_CANCELLED; return BackupStatus::RESTORE_FAILED; } diff --git a/src/Client/ClientBase.cpp b/src/Client/ClientBase.cpp index 90120e009f0..c0f5744a4d5 100644 --- a/src/Client/ClientBase.cpp +++ b/src/Client/ClientBase.cpp @@ -293,17 +293,14 @@ ClientBase::ClientBase( , std_out(out_fd_) , progress_indication(output_stream_, in_fd_, err_fd_) , progress_table(output_stream_, in_fd_, err_fd_) - , in_fd(in_fd_) - , out_fd(out_fd_) - , err_fd(err_fd_) , input_stream(input_stream_) , output_stream(output_stream_) , error_stream(error_stream_) { - stdin_is_a_tty = isatty(in_fd); - stdout_is_a_tty = isatty(out_fd); - stderr_is_a_tty = isatty(err_fd); - terminal_width = getTerminalWidth(in_fd, err_fd); + stdin_is_a_tty = isatty(in_fd_); + stdout_is_a_tty = isatty(out_fd_); + stderr_is_a_tty = isatty(err_fd_); + terminal_width = getTerminalWidth(in_fd_, err_fd_); } ASTPtr ClientBase::parseQuery(const char *& pos, const char * end, const Settings & settings, bool allow_multi_statements) @@ -457,8 +454,17 @@ void ClientBase::onData(Block & block, ASTPtr parsed_query) output_format->write(materializeBlock(block)); written_first_block = true; } + catch (const NetException &) + { + throw; + } + catch (const ErrnoException &) + { + throw; + } catch (const Exception &) { + //this is a bad catch. It catches too much cases unrelated to LocalFormatError /// Catch client errors like NO_ROW_DELIMITER throw LocalFormatError(getCurrentExceptionMessageAndPattern(print_stack_trace), getCurrentExceptionCode()); } @@ -685,7 +691,7 @@ void ClientBase::initLogsOutputStream() if (server_logs_file.empty()) { /// Use stderr by default - out_logs_buf = std::make_unique(STDERR_FILENO); + out_logs_buf = std::make_unique>(STDERR_FILENO); wb = out_logs_buf.get(); color_logs = stderr_is_a_tty; } @@ -698,7 +704,7 @@ void ClientBase::initLogsOutputStream() else { out_logs_buf - = std::make_unique(server_logs_file, DBMS_DEFAULT_BUFFER_SIZE, O_WRONLY | O_APPEND | O_CREAT); + = std::make_unique>(server_logs_file, DBMS_DEFAULT_BUFFER_SIZE, O_WRONLY | O_APPEND | O_CREAT); wb = out_logs_buf.get(); } } @@ -862,7 +868,7 @@ void ClientBase::initTTYBuffer(ProgressOption progress_option, ProgressOption pr { try { - tty_buf = std::make_unique(tty_file_name, buf_size); + tty_buf = std::make_unique>(tty_file_name, buf_size); /// It is possible that the terminal file has writeable permissions /// but we cannot write anything there. Check it with invisible character. @@ -873,8 +879,7 @@ void ClientBase::initTTYBuffer(ProgressOption progress_option, ProgressOption pr } catch (const Exception & e) { - if (tty_buf) - tty_buf.reset(); + tty_buf.reset(); if (e.code() != ErrorCodes::CANNOT_OPEN_FILE) throw; @@ -887,7 +892,7 @@ void ClientBase::initTTYBuffer(ProgressOption progress_option, ProgressOption pr if (stderr_is_a_tty || progress == ProgressOption::ERR) { - tty_buf = std::make_unique(STDERR_FILENO, buf_size); + tty_buf = std::make_unique>(STDERR_FILENO, buf_size); } else { @@ -900,7 +905,7 @@ void ClientBase::initKeystrokeInterceptor() { if (is_interactive && need_render_progress_table && progress_table_toggle_enabled) { - keystroke_interceptor = std::make_unique(in_fd, error_stream); + keystroke_interceptor = std::make_unique(std_in.getFD(), error_stream); keystroke_interceptor->registerCallback(' ', [this]() { progress_table_toggle_on = !progress_table_toggle_on; }); } } @@ -1116,6 +1121,7 @@ void ClientBase::processOrdinaryQuery(const String & query_to_execute, ASTPtr pa &client_context->getSettingsRef(), &client_context->getClientInfo(), true, + {}, [&](const Progress & progress) { onProgress(progress); }); if (send_external_tables) @@ -1486,10 +1492,10 @@ void ClientBase::resetOutput() logs_out_stream.reset(); if (out_file_buf) - { out_file_buf->finalize(); - out_file_buf.reset(); - } + out_file_buf.reset(); + + out_logs_buf.reset(); if (pager_cmd) { @@ -1507,12 +1513,6 @@ void ClientBase::resetOutput() } pager_cmd = nullptr; - if (out_logs_buf) - { - out_logs_buf->finalize(); - out_logs_buf.reset(); - } - std_out.next(); } @@ -1625,6 +1625,7 @@ void ClientBase::processInsertQuery(const String & query_to_execute, ASTPtr pars &client_context->getSettingsRef(), &client_context->getClientInfo(), true, + {}, [&](const Progress & progress) { onProgress(progress); }); if (send_external_tables) @@ -2326,7 +2327,9 @@ bool ClientBase::executeMultiQuery(const String & all_queries_text) /// disable logs if expects errors TestHint test_hint(all_queries_text); if (test_hint.hasClientErrors() || test_hint.hasServerErrors()) + { processTextAsSingleQuery("SET send_logs_level = 'fatal'"); + } } /// Test tags are started with "--" so they are interpreted as comments anyway. @@ -2444,6 +2447,7 @@ bool ClientBase::executeMultiQuery(const String & all_queries_text) // (or their absence). bool error_matches_hint = true; bool need_retry = test_hint.needRetry(server_exception, &retries_count); + if (need_retry) { std::this_thread::sleep_for(std::chrono::seconds(1)); @@ -2723,9 +2727,7 @@ void ClientBase::runInteractive() catch (const ErrnoException & e) { if (e.getErrno() != EEXIST) - { error_stream << getCurrentExceptionMessage(false) << '\n'; - } } } diff --git a/src/Client/ClientBase.h b/src/Client/ClientBase.h index 7660efff582..5fa7006b313 100644 --- a/src/Client/ClientBase.h +++ b/src/Client/ClientBase.h @@ -3,6 +3,13 @@ #include #include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -11,12 +18,7 @@ #include #include #include -#include -#include -#include -#include -#include -#include + #include #include @@ -313,7 +315,7 @@ protected: /// Buffer that reads from stdin in batch mode. ReadBufferFromFileDescriptor std_in; /// Console output. - WriteBufferFromFileDescriptor std_out; + AutoCanceledWriteBuffer std_out; std::unique_ptr pager_cmd; /// The user can specify to redirect query output to a file. @@ -398,9 +400,6 @@ protected: std::atomic_bool cancelled_printed = false; /// Unpacked descriptors and streams for the ease of use. - int in_fd = STDIN_FILENO; - int out_fd = STDOUT_FILENO; - int err_fd = STDERR_FILENO; std::istream & input_stream; std::ostream & output_stream; std::ostream & error_stream; diff --git a/src/Client/Connection.cpp b/src/Client/Connection.cpp index 667db913630..ace3c2fe9af 100644 --- a/src/Client/Connection.cpp +++ b/src/Client/Connection.cpp @@ -14,6 +14,7 @@ #include #include #include +#include "Common/logger_useful.h" #include #include #include @@ -22,8 +23,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -78,14 +79,8 @@ namespace ErrorCodes Connection::~Connection() { - try{ - if (connected) - Connection::disconnect(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } + if (connected) + Connection::cancel(); } Connection::Connection(const String & host_, UInt16 port_, @@ -142,7 +137,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts) have_more_addresses_to_connect = it != std::prev(addresses.end()); if (connected) - disconnect(); + cancel(); if (static_cast(secure)) { @@ -293,7 +288,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts) } catch (DB::NetException & e) { - disconnect(); + cancel(); /// Remove this possible stale entry from cache DNSResolver::instance().removeHostFromCache(host); @@ -304,7 +299,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts) } catch (Poco::Net::NetException & e) { - disconnect(); + cancel(); /// Remove this possible stale entry from cache DNSResolver::instance().removeHostFromCache(host); @@ -314,7 +309,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts) } catch (Poco::TimeoutException & e) { - disconnect(); + cancel(); /// Remove this possible stale entry from cache DNSResolver::instance().removeHostFromCache(host); @@ -329,55 +324,45 @@ void Connection::connect(const ConnectionTimeouts & timeouts) getDescription(/*with_extra*/ true), connection_timeout.totalMilliseconds()); } + catch (...) + { + cancel(); + throw; + } +} + +void Connection::cancel() noexcept +{ + if (maybe_compressed_out) + maybe_compressed_out->cancel(); + + if (out) + out->cancel(); + + if (socket) + socket->close(); + + reset(); +} + +void Connection::reset() noexcept +{ + maybe_compressed_out.reset(); + out.reset(); + socket.reset(); + nonce.reset(); + + connected = false; } void Connection::disconnect() { - in = nullptr; + in.reset(); last_input_packet_type.reset(); - std::exception_ptr finalize_exception; - try - { - // finalize() can write and throw an exception. - if (maybe_compressed_out) - maybe_compressed_out->finalize(); - } - catch (...) - { - /// Don't throw an exception here, it will leave Connection in invalid state. - finalize_exception = std::current_exception(); - - if (out) - { - out->cancel(); - out = nullptr; - } - } - maybe_compressed_out = nullptr; - - try - { - if (out) - out->finalize(); - } - catch (...) - { - /// Don't throw an exception here, it will leave Connection in invalid state. - finalize_exception = std::current_exception(); - } - out = nullptr; - - if (socket) - socket->close(); - - socket = nullptr; - connected = false; - nonce.reset(); - - if (finalize_exception) - std::rethrow_exception(finalize_exception); + // no point to finalize tcp connections + cancel(); } @@ -768,6 +753,7 @@ void Connection::sendQuery( const Settings * settings, const ClientInfo * client_info, bool with_pending_data, + const std::vector & external_roles, std::function) { OpenTelemetry::SpanHolder span("Connection::sendQuery()", OpenTelemetry::SpanKind::CLIENT); @@ -840,6 +826,18 @@ void Connection::sendQuery( else writeStringBinary("" /* empty string is a marker of the end of settings */, *out); + String external_roles_str; + if (server_revision >= DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES) + { + WriteBufferFromString buffer(external_roles_str); + writeVectorBinary(external_roles, buffer); + buffer.finalize(); + + LOG_TRACE(log_wrapper.get(), "Sending external_roles with query: [{}] ({})", fmt::join(external_roles, ", "), external_roles.size()); + + writeStringBinary(external_roles_str, *out); + } + /// Interserver secret if (server_revision >= DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET) { @@ -860,6 +858,9 @@ void Connection::sendQuery( data += query; data += query_id; data += client_info->initial_user; + // Also for backwards compatibility + if (server_revision >= DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES) + data += external_roles_str; /// TODO: add source/target host/ip-address std::string hash = encodeSHA256(data); @@ -888,7 +889,7 @@ void Connection::sendQuery( maybe_compressed_in.reset(); if (maybe_compressed_out && maybe_compressed_out != out) - maybe_compressed_out->cancel(); + maybe_compressed_out->finalize(); maybe_compressed_out.reset(); block_in.reset(); block_logs_in.reset(); diff --git a/src/Client/Connection.h b/src/Client/Connection.h index e09d913f1ba..ad43a710575 100644 --- a/src/Client/Connection.h +++ b/src/Client/Connection.h @@ -108,6 +108,7 @@ public: const Settings * settings/* = nullptr */, const ClientInfo * client_info/* = nullptr */, bool with_pending_data/* = false */, + const std::vector & external_roles, std::function process_progress_callback) override; void sendCancel() override; @@ -134,7 +135,6 @@ public: void disconnect() override; - /// Send prepared block of data (serialized and, if need, compressed), that will be read from 'input'. /// You could pass size of serialized/compressed block. void sendPreparedData(ReadBuffer & input, size_t size, const String & name = ""); @@ -276,6 +276,9 @@ private: void connect(const ConnectionTimeouts & timeouts); void sendHello(); + void cancel() noexcept; + void reset() noexcept; + #if USE_SSH void performHandshakeForSSHAuth(); #endif diff --git a/src/Client/HedgedConnections.cpp b/src/Client/HedgedConnections.cpp index c30ca0eb9d4..6c2a1a88ee4 100644 --- a/src/Client/HedgedConnections.cpp +++ b/src/Client/HedgedConnections.cpp @@ -161,7 +161,8 @@ void HedgedConnections::sendQuery( const String & query_id, UInt64 stage, ClientInfo & client_info, - bool with_pending_data) + bool with_pending_data, + const std::vector & external_roles) { std::lock_guard lock(cancel_mutex); @@ -188,7 +189,7 @@ void HedgedConnections::sendQuery( hedged_connections_factory.skipReplicasWithTwoLevelAggregationIncompatibility(); } - auto send_query = [this, timeouts, query, query_id, stage, client_info, with_pending_data](ReplicaState & replica) + auto send_query = [this, timeouts, query, query_id, stage, client_info, with_pending_data, external_roles](ReplicaState & replica) { Settings modified_settings = settings; @@ -218,7 +219,8 @@ void HedgedConnections::sendQuery( modified_settings.set("allow_experimental_analyzer", static_cast(modified_settings[Setting::allow_experimental_analyzer])); replica.connection->sendQuery( - timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, {}); + timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, external_roles, {}); + replica.change_replica_timeout.setRelative(timeouts.receive_data_timeout); replica.packet_receiver->setTimeout(hedged_connections_factory.getConnectionTimeouts().receive_timeout); }; diff --git a/src/Client/HedgedConnections.h b/src/Client/HedgedConnections.h index 7f538804e5a..e64f17658d8 100644 --- a/src/Client/HedgedConnections.h +++ b/src/Client/HedgedConnections.h @@ -90,7 +90,8 @@ public: const String & query_id, UInt64 stage, ClientInfo & client_info, - bool with_pending_data) override; + bool with_pending_data, + const std::vector & external_roles) override; void sendReadTaskResponse(const String &) override { diff --git a/src/Client/IConnections.h b/src/Client/IConnections.h index 09211de53b0..a521fdd8b00 100644 --- a/src/Client/IConnections.h +++ b/src/Client/IConnections.h @@ -23,7 +23,8 @@ public: const String & query_id, UInt64 stage, ClientInfo & client_info, - bool with_pending_data) = 0; + bool with_pending_data, + const std::vector & external_roles) = 0; virtual void sendReadTaskResponse(const String &) = 0; virtual void sendMergeTreeReadTaskResponse(const ParallelReadResponse & response) = 0; diff --git a/src/Client/IServerConnection.h b/src/Client/IServerConnection.h index fe69be8788a..332481d2701 100644 --- a/src/Client/IServerConnection.h +++ b/src/Client/IServerConnection.h @@ -29,7 +29,7 @@ class ClientInfo; /// Packet that could be received from server. struct Packet { - UInt64 type; + UInt64 type = Protocol::Server::MAX; // default value has to be invalid Block block; std::unique_ptr exception; @@ -43,8 +43,6 @@ struct Packet std::optional request; std::string server_timezone; - - Packet() : type(Protocol::Server::Hello) {} }; @@ -102,6 +100,7 @@ public: const Settings * settings, const ClientInfo * client_info, bool with_pending_data, + const std::vector & external_roles, std::function process_progress_callback) = 0; virtual void sendCancel() = 0; diff --git a/src/Client/LocalConnection.cpp b/src/Client/LocalConnection.cpp index 4ca209c29c7..bb36d0bbf39 100644 --- a/src/Client/LocalConnection.cpp +++ b/src/Client/LocalConnection.cpp @@ -94,8 +94,7 @@ void LocalConnection::sendProfileEvents() Block profile_block; state->after_send_profile_events.restart(); next_packet_type = Protocol::Server::ProfileEvents; - ProfileEvents::getProfileEvents(server_display_name, state->profile_queue, profile_block, last_sent_snapshots); - state->block.emplace(std::move(profile_block)); + state->block.emplace(ProfileEvents::getProfileEvents(server_display_name, state->profile_queue, last_sent_snapshots)); } void LocalConnection::sendQuery( @@ -107,6 +106,7 @@ void LocalConnection::sendQuery( const Settings *, const ClientInfo * client_info, bool, + const std::vector & /*external_roles*/, std::function process_progress_callback) { /// Last query may not have been finished or cancelled due to exception on client side. diff --git a/src/Client/LocalConnection.h b/src/Client/LocalConnection.h index a70ed6ffa7e..c605b37b075 100644 --- a/src/Client/LocalConnection.h +++ b/src/Client/LocalConnection.h @@ -114,6 +114,7 @@ public: const Settings * settings/* = nullptr */, const ClientInfo * client_info/* = nullptr */, bool with_pending_data/* = false */, + const std::vector & external_roles, std::function process_progress_callback) override; void sendCancel() override; diff --git a/src/Client/MultiplexedConnections.cpp b/src/Client/MultiplexedConnections.cpp index 1cc6ec537c8..c17a31b2d1c 100644 --- a/src/Client/MultiplexedConnections.cpp +++ b/src/Client/MultiplexedConnections.cpp @@ -128,7 +128,8 @@ void MultiplexedConnections::sendQuery( const String & query_id, UInt64 stage, ClientInfo & client_info, - bool with_pending_data) + bool with_pending_data, + const std::vector & external_roles) { std::lock_guard lock(cancel_mutex); @@ -181,14 +182,14 @@ void MultiplexedConnections::sendQuery( modified_settings[Setting::parallel_replica_offset] = i; replica_states[i].connection->sendQuery( - timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, {}); + timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, external_roles, {}); } } else { /// Use single replica. replica_states[0].connection->sendQuery( - timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, {}); + timeouts, query, /* query_parameters */ {}, query_id, stage, &modified_settings, &client_info, with_pending_data, external_roles, {}); } sent_query = true; diff --git a/src/Client/MultiplexedConnections.h b/src/Client/MultiplexedConnections.h index dec32e52d4f..4b308dca02e 100644 --- a/src/Client/MultiplexedConnections.h +++ b/src/Client/MultiplexedConnections.h @@ -36,7 +36,8 @@ public: const String & query_id, UInt64 stage, ClientInfo & client_info, - bool with_pending_data) override; + bool with_pending_data, + const std::vector & external_roles) override; void sendReadTaskResponse(const String &) override; void sendMergeTreeReadTaskResponse(const ParallelReadResponse & response) override; diff --git a/src/Client/Suggest.cpp b/src/Client/Suggest.cpp index bda252b157b..e8f5409a009 100644 --- a/src/Client/Suggest.cpp +++ b/src/Client/Suggest.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include "Core/Protocol.h" @@ -122,7 +123,7 @@ void Suggest::load(ContextPtr context, const ConnectionParameters & connection_p /// suggestions using the main connection later. WriteBufferFromFileDescriptor out(STDERR_FILENO, 4096); out << "Cannot load data for command line suggestions: " << getCurrentExceptionMessage(false, true) << "\n"; - out.next(); + out.finalize(); } } catch (...) @@ -130,7 +131,7 @@ void Suggest::load(ContextPtr context, const ConnectionParameters & connection_p last_error = getCurrentExceptionCode(); WriteBufferFromFileDescriptor out(STDERR_FILENO, 4096); out << "Cannot load data for command line suggestions: " << getCurrentExceptionMessage(false, true) << "\n"; - out.next(); + out.finalize(); } break; @@ -162,7 +163,7 @@ void Suggest::load(IServerConnection & connection, void Suggest::fetch(IServerConnection & connection, const ConnectionTimeouts & timeouts, const std::string & query, const ClientInfo & client_info) { connection.sendQuery( - timeouts, query, {} /* query_parameters */, "" /* query_id */, QueryProcessingStage::Complete, nullptr, &client_info, false, {}); + timeouts, query, {} /* query_parameters */, "" /* query_id */, QueryProcessingStage::Complete, nullptr, &client_info, false, {} /* external_roles*/, {}); while (true) { diff --git a/src/Client/examples/test_connect.cpp b/src/Client/examples/test_connect.cpp index 1b98b936a52..60a10652398 100644 --- a/src/Client/examples/test_connect.cpp +++ b/src/Client/examples/test_connect.cpp @@ -39,8 +39,6 @@ try if (argc >= 5) port = parse(argv[4]); - WriteBufferFromFileDescriptor out(STDERR_FILENO); - std::atomic_bool cancel{false}; std::vector threads(num_threads); for (auto & thread : threads) diff --git a/src/Columns/ColumnAggregateFunction.cpp b/src/Columns/ColumnAggregateFunction.cpp index 69bea288779..2569d2235a3 100644 --- a/src/Columns/ColumnAggregateFunction.cpp +++ b/src/Columns/ColumnAggregateFunction.cpp @@ -406,9 +406,10 @@ WeakHash32 ColumnAggregateFunction::getWeakHash32() const std::vector v; for (size_t i = 0; i < s; ++i) { - WriteBufferFromVector> wbuf(v); - func->serialize(data[i], wbuf, version); - wbuf.finalize(); + { + WriteBufferFromVector> wbuf(v); + func->serialize(data[i], wbuf, version); + } hash_data[i] = ::updateWeakHash32(v.data(), v.size(), hash_data[i]); } diff --git a/src/Columns/ColumnDynamic.cpp b/src/Columns/ColumnDynamic.cpp index 6eb22a8bdf7..a4c932eafdd 100644 --- a/src/Columns/ColumnDynamic.cpp +++ b/src/Columns/ColumnDynamic.cpp @@ -260,10 +260,11 @@ void ColumnDynamic::insert(const Field & x) /// We store values in shared variant in binary form with binary encoded type. auto & shared_variant = getSharedVariant(); auto & chars = shared_variant.getChars(); - WriteBufferFromVector value_buf(chars, AppendModeTag()); - encodeDataType(field_data_type, value_buf); - getVariantSerialization(field_data_type, field_data_type_name)->serializeBinary(x, value_buf, getFormatSettings()); - value_buf.finalize(); + { + WriteBufferFromVector value_buf(chars, AppendModeTag()); + encodeDataType(field_data_type, value_buf); + getVariantSerialization(field_data_type, field_data_type_name)->serializeBinary(x, value_buf, getFormatSettings()); + } chars.push_back(0); shared_variant.getOffsets().push_back(chars.size()); variant_col.getLocalDiscriminators().push_back(variant_col.localDiscriminatorByGlobal(shared_variant_discr)); @@ -697,10 +698,11 @@ void ColumnDynamic::serializeValueIntoSharedVariant( size_t n) { auto & chars = shared_variant.getChars(); - WriteBufferFromVector value_buf(chars, AppendModeTag()); - encodeDataType(type, value_buf); - serialization->serializeBinary(src, n, value_buf, getFormatSettings()); - value_buf.finalize(); + { + WriteBufferFromVector value_buf(chars, AppendModeTag()); + encodeDataType(type, value_buf); + serialization->serializeBinary(src, n, value_buf, getFormatSettings()); + } chars.push_back(0); shared_variant.getOffsets().push_back(chars.size()); } diff --git a/src/Columns/ColumnObject.cpp b/src/Columns/ColumnObject.cpp index f4121435be9..e56b5d34ae0 100644 --- a/src/Columns/ColumnObject.cpp +++ b/src/Columns/ColumnObject.cpp @@ -380,9 +380,10 @@ void ColumnObject::insert(const Field & x) { shared_data_paths->insertData(path.data(), path.size()); auto & shared_data_values_chars = shared_data_values->getChars(); - WriteBufferFromVector value_buf(shared_data_values_chars, AppendModeTag()); - getDynamicSerialization()->serializeBinary(value_field, value_buf, getFormatSettings()); - value_buf.finalize(); + { + WriteBufferFromVector value_buf(shared_data_values_chars, AppendModeTag()); + getDynamicSerialization()->serializeBinary(value_field, value_buf, getFormatSettings()); + } shared_data_values_chars.push_back(0); shared_data_values->getOffsets().push_back(shared_data_values_chars.size()); } @@ -674,9 +675,10 @@ void ColumnObject::serializePathAndValueIntoSharedData(ColumnString * shared_dat shared_data_paths->insertData(path.data(), path.size()); auto & shared_data_values_chars = shared_data_values->getChars(); - WriteBufferFromVector value_buf(shared_data_values_chars, AppendModeTag()); - getDynamicSerialization()->serializeBinary(column, n, value_buf, getFormatSettings()); - value_buf.finalize(); + { + WriteBufferFromVector value_buf(shared_data_values_chars, AppendModeTag()); + getDynamicSerialization()->serializeBinary(column, n, value_buf, getFormatSettings()); + } shared_data_values_chars.push_back(0); shared_data_values->getOffsets().push_back(shared_data_values_chars.size()); } diff --git a/src/Columns/MaskOperations.cpp b/src/Columns/MaskOperations.cpp index eac42400517..14f3e781c47 100644 --- a/src/Columns/MaskOperations.cpp +++ b/src/Columns/MaskOperations.cpp @@ -24,7 +24,7 @@ void expandDataByMask(PaddedPODArray & data, const PaddedPODArray & ma ssize_t from = data.size() - 1; ssize_t index = mask.size() - 1; - data.resize(mask.size()); + data.resize_exact(mask.size()); while (index >= 0) { if (!!mask[index] ^ inverted) diff --git a/src/Common/CounterInFile.h b/src/Common/CounterInFile.h index 3e58b704170..509dad812b3 100644 --- a/src/Common/CounterInFile.h +++ b/src/Common/CounterInFile.h @@ -104,6 +104,7 @@ public: wb.truncate(0); DB::writeIntText(res, wb); DB::writeChar('\n', wb); + wb.finalize(); wb.sync(); } @@ -176,6 +177,7 @@ public: wb.truncate(0); DB::writeIntText(value, wb); DB::writeChar('\n', wb); + wb.finalize(); wb.sync(); } } diff --git a/src/Common/ErrorCodes.cpp b/src/Common/ErrorCodes.cpp index 3f4a75fae3c..376ccf6f297 100644 --- a/src/Common/ErrorCodes.cpp +++ b/src/Common/ErrorCodes.cpp @@ -611,6 +611,8 @@ M(730, REFRESH_FAILED) \ M(731, QUERY_CACHE_USED_WITH_NON_THROW_OVERFLOW_MODE) \ M(733, TABLE_IS_BEING_RESTARTED) \ + M(734, CANNOT_WRITE_AFTER_BUFFER_CANCELED) \ + M(735, QUERY_WAS_CANCELLED_BY_CLIENT) \ \ M(900, DISTRIBUTED_CACHE_ERROR) \ M(901, CANNOT_USE_DISTRIBUTED_CACHE) \ diff --git a/src/Common/FailPoint.cpp b/src/Common/FailPoint.cpp index fc6430c0d64..ef9e6bc96a9 100644 --- a/src/Common/FailPoint.cpp +++ b/src/Common/FailPoint.cpp @@ -75,6 +75,8 @@ static struct InitFiu PAUSEABLE(stop_moving_part_before_swap_with_active) \ REGULAR(slowdown_index_analysis) \ REGULAR(replicated_merge_tree_all_replicas_stale) \ + REGULAR(zero_copy_lock_zk_fail_before_op) \ + REGULAR(zero_copy_lock_zk_fail_after_op) \ namespace FailPoints diff --git a/src/Common/OpenTelemetryTraceContext.h b/src/Common/OpenTelemetryTraceContext.h index 137feee370c..07469345c2c 100644 --- a/src/Common/OpenTelemetryTraceContext.h +++ b/src/Common/OpenTelemetryTraceContext.h @@ -39,7 +39,7 @@ enum class SpanKind : uint8_t struct Span { - UUID trace_id; + UUID trace_id = {}; UInt64 span_id = 0; UInt64 parent_span_id = 0; String operation_name; diff --git a/src/Common/ProfileEvents.cpp b/src/Common/ProfileEvents.cpp index 7b9f670d340..1534aa9bd4e 100644 --- a/src/Common/ProfileEvents.cpp +++ b/src/Common/ProfileEvents.cpp @@ -61,6 +61,8 @@ M(ArenaAllocBytes, "Number of bytes allocated for memory Arena (used for GROUP BY and similar operations)", ValueType::Bytes) \ M(FunctionExecute, "Number of SQL ordinary function calls (SQL functions are called on per-block basis, so this number represents the number of blocks).", ValueType::Number) \ M(TableFunctionExecute, "Number of table function calls.", ValueType::Number) \ + M(DefaultImplementationForNullsRows, "Number of rows processed by default implementation for nulls in function execution", ValueType::Number) \ + M(DefaultImplementationForNullsRowsWithNulls, "Number of rows which contain null values processed by default implementation for nulls in function execution", ValueType::Number) \ M(MarkCacheHits, "Number of times an entry has been found in the mark cache, so we didn't have to load a mark file.", ValueType::Number) \ M(MarkCacheMisses, "Number of times an entry has not been found in the mark cache, so we had to load a mark file in memory, which is a costly operation, adding to query latency.", ValueType::Number) \ M(QueryCacheHits, "Number of times a query result has been found in the query cache (and query computation was avoided). Only updated for SELECT queries with SETTING use_query_cache = 1.", ValueType::Number) \ diff --git a/src/Common/RemoteProxyConfigurationResolver.cpp b/src/Common/RemoteProxyConfigurationResolver.cpp index 6fd18c2c971..d45a7a42c0b 100644 --- a/src/Common/RemoteProxyConfigurationResolver.cpp +++ b/src/Common/RemoteProxyConfigurationResolver.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -25,18 +26,18 @@ std::string RemoteProxyHostFetcherImpl::fetch(const Poco::URI & endpoint, const Poco::Net::HTTPResponse response; auto & response_body_stream = session->receiveResponse(response); + std::string body; + Poco::StreamCopier::copyToString(response_body_stream, body); + if (response.getStatus() != Poco::Net::HTTPResponse::HTTP_OK) throw HTTPException( ErrorCodes::RECEIVED_ERROR_FROM_REMOTE_IO_SERVER, endpoint.toString(), response.getStatus(), response.getReason(), - /* body_length = */ 0); + body); - std::string proxy_host; - Poco::StreamCopier::copyToString(response_body_stream, proxy_host); - - return proxy_host; + return body; } RemoteProxyConfigurationResolver::RemoteProxyConfigurationResolver( diff --git a/src/Common/SignalHandlers.cpp b/src/Common/SignalHandlers.cpp index 7ab001d6d34..08261fb1cc1 100644 --- a/src/Common/SignalHandlers.cpp +++ b/src/Common/SignalHandlers.cpp @@ -51,7 +51,7 @@ void writeSignalIDtoSignalPipe(int sig) auto & signal_pipe = HandledSignals::instance().signal_pipe; WriteBufferFromFileDescriptor out(signal_pipe.fds_rw[1], signal_pipe_buf_size, buf); writeBinary(sig, out); - out.next(); + out.finalize(); errno = saved_errno; } @@ -97,8 +97,7 @@ void signalHandler(int sig, siginfo_t * info, void * context) writeVectorBinary(Exception::enable_job_stack_trace ? Exception::getThreadFramePointers() : std::vector{}, out); writeBinary(static_cast(getThreadId()), out); writePODBinary(current_thread, out); - - out.next(); + out.finalize(); if (sig != SIGTSTP) /// This signal is used for debugging. { @@ -152,7 +151,7 @@ void signalHandler(int sig, siginfo_t * info, void * context) writeBinary(static_cast(SignalListener::StdTerminate), out); writeBinary(static_cast(getThreadId()), out); writeBinary(log_message, out); - out.next(); + out.finalize(); abort(); } @@ -193,8 +192,7 @@ static DISABLE_SANITIZER_INSTRUMENTATION void sanitizerDeathCallback() ValueHolder thread_id{static_cast(getThreadId())}; writeBinary(thread_id.value, out); writePODBinary(current_thread, out); - - out.next(); + out.finalize(); /// The time that is usually enough for separate thread to print info into log. sleepForSeconds(20); diff --git a/src/Common/StatusFile.cpp b/src/Common/StatusFile.cpp index f4149a055c0..59af8512278 100644 --- a/src/Common/StatusFile.cpp +++ b/src/Common/StatusFile.cpp @@ -51,7 +51,7 @@ StatusFile::StatusFile(std::string path_, FillFunction fill_) std::string contents; { ReadBufferFromFile in(path, 1024); - LimitReadBuffer limit_in(in, 1024, /* throw_exception */ false, /* exact_limit */ {}); + LimitReadBuffer limit_in(in, {.read_no_more = 1024}); readStringUntilEOF(contents, limit_in); } @@ -87,13 +87,11 @@ StatusFile::StatusFile(std::string path_, FillFunction fill_) try { fill(out); - /// Finalize here to avoid throwing exceptions in destructor. out.finalize(); } catch (...) { - /// Finalize in case of exception to avoid throwing exceptions in destructor - out.finalize(); + out.cancel(); throw; } } diff --git a/src/Common/TraceSender.cpp b/src/Common/TraceSender.cpp index f1adf7c516a..562ece2c433 100644 --- a/src/Common/TraceSender.cpp +++ b/src/Common/TraceSender.cpp @@ -92,6 +92,7 @@ void TraceSender::send(TraceType trace_type, const StackTrace & stack_trace, Ext writePODBinary(extras.increment, out); out.next(); + out.finalize(); inside_send = false; } diff --git a/src/Common/ZooKeeper/ZooKeeperImpl.cpp b/src/Common/ZooKeeper/ZooKeeperImpl.cpp index 7b027f48d4b..70f9b9f1c70 100644 --- a/src/Common/ZooKeeper/ZooKeeperImpl.cpp +++ b/src/Common/ZooKeeper/ZooKeeperImpl.cpp @@ -306,6 +306,14 @@ void ZooKeeper::flushWriteBuffer() out->next(); } +void ZooKeeper::cancelWriteBuffer() noexcept +{ + if (compressed_out) + compressed_out->cancel(); + if (out) + out->cancel(); +} + ReadBuffer & ZooKeeper::getReadBuffer() { if (compressed_in) @@ -548,6 +556,7 @@ void ZooKeeper::connect( catch (...) { fail_reasons << "\n" << getCurrentExceptionMessage(false) << ", " << node.address->toString(); + cancelWriteBuffer(); } } @@ -1087,6 +1096,8 @@ void ZooKeeper::finalize(bool error_send, bool error_receive, const String & rea /// Set expired flag after we sent close event expire_session_if_not_expired(); + cancelWriteBuffer(); + try { /// This will also wakeup the receiving thread. diff --git a/src/Common/ZooKeeper/ZooKeeperImpl.h b/src/Common/ZooKeeper/ZooKeeperImpl.h index 2426731cdeb..20926bbd5fd 100644 --- a/src/Common/ZooKeeper/ZooKeeperImpl.h +++ b/src/Common/ZooKeeper/ZooKeeperImpl.h @@ -338,6 +338,7 @@ private: WriteBuffer & getWriteBuffer(); void flushWriteBuffer(); + void cancelWriteBuffer() noexcept; ReadBuffer & getReadBuffer(); void logOperationIfNeeded(const ZooKeeperRequestPtr & request, const ZooKeeperResponsePtr & response = nullptr, bool finalize = false, UInt64 elapsed_microseconds = 0); diff --git a/src/Common/examples/executable_udf.cpp b/src/Common/examples/executable_udf.cpp index 8d2d9f7314e..ebdfb803788 100644 --- a/src/Common/examples/executable_udf.cpp +++ b/src/Common/examples/executable_udf.cpp @@ -42,5 +42,7 @@ int main(int argc, char **argv) write_buffer.next(); } + write_buffer.finalize(); + return 0; } diff --git a/src/Common/examples/shell_command_inout.cpp b/src/Common/examples/shell_command_inout.cpp index a646dfba311..64a3c48da6c 100644 --- a/src/Common/examples/shell_command_inout.cpp +++ b/src/Common/examples/shell_command_inout.cpp @@ -36,7 +36,10 @@ try }); copyData(command->out, out); + out.finalize(); + copyData(command->err, err); + err.finalize(); thread.join(); return 0; diff --git a/src/Common/tests/gtest_cgroups_reader.cpp b/src/Common/tests/gtest_cgroups_reader.cpp index e24b91a59b8..92563043736 100644 --- a/src/Common/tests/gtest_cgroups_reader.cpp +++ b/src/Common/tests/gtest_cgroups_reader.cpp @@ -136,12 +136,14 @@ class CgroupsMemoryUsageObserverFixture : public ::testing::TestWithParam" + std::to_string(i) + "\n", out); writeString("
    \n", out); + out.finalize(); } Poco::Timestamp load_start; diff --git a/src/Common/tests/gtest_fst.cpp b/src/Common/tests/gtest_fst.cpp index 1f4595cdea7..8ba21737aa8 100644 --- a/src/Common/tests/gtest_fst.cpp +++ b/src/Common/tests/gtest_fst.cpp @@ -28,13 +28,14 @@ TEST(FST, SimpleTest) }; std::vector buffer; - DB::WriteBufferFromVector> wbuf(buffer); - DB::FST::FstBuilder builder(wbuf); + { + DB::WriteBufferFromVector> wbuf(buffer); + DB::FST::FstBuilder builder(wbuf); - for (auto & [term, output] : indexed_data) - builder.add(term, output); - builder.build(); - wbuf.finalize(); + for (auto & [term, output] : indexed_data) + builder.add(term, output); + builder.build(); + } DB::FST::FiniteStateTransducer fst(buffer); for (auto & [term, output] : indexed_data) @@ -61,14 +62,15 @@ TEST(FST, TestForLongTerms) DB::FST::Output output2 = 200; std::vector buffer; - DB::WriteBufferFromVector> wbuf(buffer); - DB::FST::FstBuilder builder(wbuf); + { + DB::WriteBufferFromVector> wbuf(buffer); + DB::FST::FstBuilder builder(wbuf); - builder.add(term1, output1); - builder.add(term2, output2); + builder.add(term1, output1); + builder.add(term2, output2); - builder.build(); - wbuf.finalize(); + builder.build(); + } DB::FST::FiniteStateTransducer fst(buffer); diff --git a/src/Common/tests/gtest_helper_functions.h b/src/Common/tests/gtest_helper_functions.h index 90c5d4d2088..e7510cbd139 100644 --- a/src/Common/tests/gtest_helper_functions.h +++ b/src/Common/tests/gtest_helper_functions.h @@ -26,6 +26,7 @@ inline std::unique_ptr getFileWithContents(const char *fileName, con { WriteBufferFromFile out(config_file->path()); writeString(fileContents, out); + out.finalize(); } return config_file; diff --git a/src/Common/tests/gtest_merge_configs.cpp b/src/Common/tests/gtest_merge_configs.cpp index 2cc7f4a99af..604030c4cf8 100644 --- a/src/Common/tests/gtest_merge_configs.cpp +++ b/src/Common/tests/gtest_merge_configs.cpp @@ -32,6 +32,7 @@ clickhouse: field2: "2" )YAML"; writeString(data, out); + out.finalize(); } auto system_tables_file = std::make_unique(path / "config.d/system_tables.yaml"); @@ -49,6 +50,7 @@ clickhouse: level: debug )YAML"; writeString(data, out); + out.finalize(); } @@ -96,6 +98,7 @@ clickhouse: level: debug )YAML"; writeString(data, out); + out.finalize(); } auto system_tables_file = std::make_unique(path / "config.d/system_tables.yaml"); @@ -115,6 +118,7 @@ clickhouse: level: debug )YAML"; writeString(data, out); + out.finalize(); } diff --git a/src/Compression/CompressedWriteBuffer.cpp b/src/Compression/CompressedWriteBuffer.cpp index b6dab2a190e..cdc957c4a85 100644 --- a/src/Compression/CompressedWriteBuffer.cpp +++ b/src/Compression/CompressedWriteBuffer.cpp @@ -68,6 +68,7 @@ void CompressedWriteBuffer::finalizeImpl() /// Don't try to resize buffer in nextImpl. use_adaptive_buffer_size = false; next(); + BufferWithOwnMemory::finalizeImpl(); } CompressedWriteBuffer::CompressedWriteBuffer( @@ -80,11 +81,10 @@ CompressedWriteBuffer::CompressedWriteBuffer( { } -CompressedWriteBuffer::~CompressedWriteBuffer() +void CompressedWriteBuffer::cancelImpl() noexcept { - if (!canceled) - finalize(); + BufferWithOwnMemory::cancelImpl(); + out.cancel(); } - } diff --git a/src/Compression/CompressedWriteBuffer.h b/src/Compression/CompressedWriteBuffer.h index 41596703bfe..88402b7d2d0 100644 --- a/src/Compression/CompressedWriteBuffer.h +++ b/src/Compression/CompressedWriteBuffer.h @@ -13,7 +13,7 @@ namespace DB { -class CompressedWriteBuffer final : public BufferWithOwnMemory +class CompressedWriteBuffer : public BufferWithOwnMemory { public: explicit CompressedWriteBuffer( @@ -23,8 +23,6 @@ public: bool use_adaptive_buffer_size_ = false, size_t adaptive_buffer_initial_size = DBMS_DEFAULT_INITIAL_ADAPTIVE_BUFFER_SIZE); - ~CompressedWriteBuffer() override; - /// The amount of compressed data size_t getCompressedBytes() { @@ -47,7 +45,12 @@ public: private: void nextImpl() override; + /// finalize call does not affect the out buffer. + /// That is made in order to handle the use case when several CompressedWriteBuffers write to the one file. + /// Usually the CompressedWriteBuffer does not own the out buffer. void finalizeImpl() override; + /// cancel call cancels the out buffer. + void cancelImpl() noexcept override; WriteBuffer & out; CompressionCodecPtr codec; diff --git a/src/Coordination/Changelog.cpp b/src/Coordination/Changelog.cpp index ad8ff89678e..4f87f43a11f 100644 --- a/src/Coordination/Changelog.cpp +++ b/src/Coordination/Changelog.cpp @@ -163,14 +163,20 @@ public: // we have a file we need to finalize first if (tryGetFileBaseBuffer() && prealloc_done) { - finalizeCurrentFile(); - assert(current_file_description); // if we wrote at least 1 log in the log file we can rename the file to reflect correctly the // contained logs // file can be deleted from disk earlier by compaction - if (!current_file_description->deleted) + if (current_file_description->deleted) { + LOG_WARNING(log, "Log {} is already deleted", current_file_description->path); + prealloc_done = false; + cancelCurrentFile(); + } + else + { + finalizeCurrentFile(); + auto log_disk = current_file_description->disk; const auto & path = current_file_description->path; std::string new_path = path; @@ -204,6 +210,10 @@ public: } } } + else + { + cancelCurrentFile(); + } auto latest_log_disk = getLatestLogDisk(); chassert(file_description->disk == latest_log_disk); @@ -348,6 +358,8 @@ public: { if (isFileSet() && prealloc_done) finalizeCurrentFile(); + else + cancelCurrentFile(); } private: @@ -357,17 +369,16 @@ private: chassert(current_file_description); // compact can delete the file and we don't need to do anything - if (current_file_description->deleted) - { - LOG_WARNING(log, "Log {} is already deleted", current_file_description->path); - return; - } + chassert(!current_file_description->deleted); - if (log_file_settings.compress_logs) + if (compressed_buffer) compressed_buffer->finalize(); flush(); + if (file_buf) + file_buf->finalize(); + const auto * file_buffer = tryGetFileBuffer(); if (log_file_settings.max_size != 0 && file_buffer) @@ -382,16 +393,20 @@ private: LOG_WARNING(log, "Could not ftruncate file. Error: {}, errno: {}", errnoToString(), errno); } - if (log_file_settings.compress_logs) - { - compressed_buffer.reset(); - } - else - { - chassert(file_buf); - file_buf->finalize(); - file_buf.reset(); - } + compressed_buffer.reset(); + file_buf.reset(); + } + + void cancelCurrentFile() + { + if (compressed_buffer) + compressed_buffer->cancel(); + + if (file_buf) + file_buf->cancel(); + + compressed_buffer.reset(); + file_buf.reset(); } WriteBuffer & getBuffer() diff --git a/src/Coordination/CoordinationSettings.h b/src/Coordination/CoordinationSettings.h index 960f3bb10f6..46e9546b06d 100644 --- a/src/Coordination/CoordinationSettings.h +++ b/src/Coordination/CoordinationSettings.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace Poco { @@ -15,7 +16,6 @@ class AbstractConfiguration; namespace DB { struct CoordinationSettingsImpl; -class WriteBufferFromOwnString; /// List of available types supported in CoordinationSettings object #define COORDINATION_SETTINGS_SUPPORTED_TYPES(CLASS_NAME, M) \ diff --git a/src/Coordination/FourLetterCommand.cpp b/src/Coordination/FourLetterCommand.cpp index 1e9f2c96ea0..728dca75bad 100644 --- a/src/Coordination/FourLetterCommand.cpp +++ b/src/Coordination/FourLetterCommand.cpp @@ -14,6 +14,7 @@ #include "Coordination/KeeperFeatureFlags.h" #include #include +#include #include #include @@ -257,7 +258,9 @@ String RuokCommand::run() namespace { -void print(IFourLetterCommand::StringBuffer & buf, const String & key, const String & value) +using StringBuffer = DB::WriteBufferFromOwnString; + +void print(StringBuffer & buf, const String & key, const String & value) { writeText("zk_", buf); writeText(key, buf); @@ -266,7 +269,7 @@ void print(IFourLetterCommand::StringBuffer & buf, const String & key, const Str writeText('\n', buf); } -void print(IFourLetterCommand::StringBuffer & buf, const String & key, uint64_t value) +void print(StringBuffer & buf, const String & key, uint64_t value) { print(buf, key, toString(value)); } diff --git a/src/Coordination/FourLetterCommand.h b/src/Coordination/FourLetterCommand.h index e3289982b0d..32db8a724c6 100644 --- a/src/Coordination/FourLetterCommand.h +++ b/src/Coordination/FourLetterCommand.h @@ -12,7 +12,6 @@ namespace DB { -class WriteBufferFromOwnString; class KeeperDispatcher; using String = std::string; @@ -27,7 +26,6 @@ using FourLetterCommandPtr = std::shared_ptr; struct IFourLetterCommand { public: - using StringBuffer = DB::WriteBufferFromOwnString; explicit IFourLetterCommand(KeeperDispatcher & keeper_dispatcher_); virtual String name() = 0; diff --git a/src/Coordination/KeeperCommon.h b/src/Coordination/KeeperCommon.h index 02f71a04d06..97774c4d21b 100644 --- a/src/Coordination/KeeperCommon.h +++ b/src/Coordination/KeeperCommon.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Common/Logger.h" +#include namespace DB { diff --git a/src/Coordination/KeeperContext.h b/src/Coordination/KeeperContext.h index be09f9f0536..6bccfe89891 100644 --- a/src/Coordination/KeeperContext.h +++ b/src/Coordination/KeeperContext.h @@ -23,8 +23,6 @@ class DiskSelector; class IDisk; using DiskPtr = std::shared_ptr; -class WriteBufferFromOwnString; - class KeeperContext { public: diff --git a/src/Coordination/WriteBufferFromNuraftBuffer.cpp b/src/Coordination/WriteBufferFromNuraftBuffer.cpp index c955d3fdbbe..81d72ca7d14 100644 --- a/src/Coordination/WriteBufferFromNuraftBuffer.cpp +++ b/src/Coordination/WriteBufferFromNuraftBuffer.cpp @@ -43,6 +43,8 @@ void WriteBufferFromNuraftBuffer::finalizeImpl() /// Prevent further writes. set(nullptr, 0); + + WriteBuffer::finalizeImpl(); } nuraft::ptr WriteBufferFromNuraftBuffer::getBuffer() diff --git a/src/Coordination/tests/gtest_coordination.cpp b/src/Coordination/tests/gtest_coordination.cpp index c56e698766a..4cd0eaa8657 100644 --- a/src/Coordination/tests/gtest_coordination.cpp +++ b/src/Coordination/tests/gtest_coordination.cpp @@ -1062,6 +1062,7 @@ TYPED_TEST(CoordinationTest, ChangelogTestReadAfterBrokenTruncate) DB::WriteBufferFromFile plain_buf( "./logs/changelog_11_15.bin" + this->extension, DB::DBMS_DEFAULT_BUFFER_SIZE, O_APPEND | O_CREAT | O_WRONLY); plain_buf.truncate(0); + plain_buf.finalize(); DB::KeeperLogStore changelog_reader( DB::LogFileSettings{.force_sync = true, .compress_logs = this->enable_compression, .rotate_interval = 5}, @@ -1135,6 +1136,7 @@ TYPED_TEST(CoordinationTest, ChangelogTestReadAfterBrokenTruncate2) DB::WriteBufferFromFile plain_buf( "./logs/changelog_1_20.bin" + this->extension, DB::DBMS_DEFAULT_BUFFER_SIZE, O_APPEND | O_CREAT | O_WRONLY); plain_buf.truncate(30); + plain_buf.finalize(); DB::KeeperLogStore changelog_reader( DB::LogFileSettings{.force_sync = true, .compress_logs = this->enable_compression, .rotate_interval = 20}, @@ -1192,6 +1194,7 @@ TYPED_TEST(CoordinationTest, ChangelogTestReadAfterBrokenTruncate3) DB::WriteBufferFromFile plain_buf( "./logs/changelog_1_20.bin", DB::DBMS_DEFAULT_BUFFER_SIZE, O_APPEND | O_CREAT | O_WRONLY); plain_buf.truncate(plain_buf.size() - 30); + plain_buf.finalize(); DB::KeeperLogStore changelog_reader( DB::LogFileSettings{.force_sync = true, .compress_logs = false, .rotate_interval = 20}, @@ -1824,7 +1827,7 @@ TYPED_TEST(CoordinationTest, TestStorageSnapshotBroken) DB::WriteBufferFromFile plain_buf( "./snapshots/snapshot_50.bin" + this->extension, DB::DBMS_DEFAULT_BUFFER_SIZE, O_APPEND | O_CREAT | O_WRONLY); plain_buf.truncate(34); - plain_buf.sync(); + plain_buf.finalize(); EXPECT_THROW(manager.restoreFromLatestSnapshot(), DB::Exception); } diff --git a/src/Core/Block.cpp b/src/Core/Block.cpp index c7e0e9b7b37..02176a6b77a 100644 --- a/src/Core/Block.cpp +++ b/src/Core/Block.cpp @@ -769,18 +769,22 @@ void getBlocksDifference(const Block & lhs, const Block & rhs, std::string & out while (r > 0) right_columns.push_back(rhs.safeGetByPosition(--r)); - WriteBufferFromString lhs_diff_writer(out_lhs_diff); - WriteBufferFromString rhs_diff_writer(out_rhs_diff); - - for (auto it = left_columns.rbegin(); it != left_columns.rend(); ++it) { - lhs_diff_writer << it->dumpStructure(); - lhs_diff_writer << ", position: " << lhs.getPositionByName(it->name) << '\n'; + WriteBufferFromString lhs_diff_writer(out_lhs_diff); + for (auto it = left_columns.rbegin(); it != left_columns.rend(); ++it) + { + lhs_diff_writer << it->dumpStructure(); + lhs_diff_writer << ", position: " << lhs.getPositionByName(it->name) << '\n'; + } } - for (auto it = right_columns.rbegin(); it != right_columns.rend(); ++it) + { - rhs_diff_writer << it->dumpStructure(); - rhs_diff_writer << ", position: " << rhs.getPositionByName(it->name) << '\n'; + WriteBufferFromString rhs_diff_writer(out_rhs_diff); + for (auto it = right_columns.rbegin(); it != right_columns.rend(); ++it) + { + rhs_diff_writer << it->dumpStructure(); + rhs_diff_writer << ", position: " << rhs.getPositionByName(it->name) << '\n'; + } } } diff --git a/src/Core/ExternalTable.cpp b/src/Core/ExternalTable.cpp index 07250a83236..5df661e3212 100644 --- a/src/Core/ExternalTable.cpp +++ b/src/Core/ExternalTable.cpp @@ -189,11 +189,11 @@ void ExternalTablesHandler::handlePart(const Poco::Net::MessageHeader & header, if (settings[Setting::http_max_multipart_form_data_size]) read_buffer = std::make_unique( stream, - settings[Setting::http_max_multipart_form_data_size], - /* trow_exception */ true, - /* exact_limit */ std::optional(), - "the maximum size of multipart/form-data. " - "This limit can be tuned by 'http_max_multipart_form_data_size' setting"); + LimitReadBuffer::Settings{ + .read_no_more = settings[Setting::http_max_multipart_form_data_size], + .expect_eof = true, + .excetion_hint = "the maximum size of multipart/form-data. This limit can be tuned by 'http_max_multipart_form_data_size' setting", + }); else read_buffer = wrapReadBufferReference(stream); diff --git a/src/Core/MySQL/Authentication.cpp b/src/Core/MySQL/Authentication.cpp index 36f9d7ad0d4..37b229dfca9 100644 --- a/src/Core/MySQL/Authentication.cpp +++ b/src/Core/MySQL/Authentication.cpp @@ -86,7 +86,7 @@ void Native41::authenticate( { if (!auth_response) { - packet_endpoint->sendPacket(AuthSwitchRequest(getName(), scramble), true); + packet_endpoint->sendPacket(AuthSwitchRequest(getName(), scramble)); AuthSwitchResponse response; packet_endpoint->receivePacket(response); auth_response = response.value; @@ -123,7 +123,7 @@ void Sha256Password::authenticate( { if (!auth_response) { - packet_endpoint->sendPacket(AuthSwitchRequest(getName(), scramble), true); + packet_endpoint->sendPacket(AuthSwitchRequest(getName(), scramble)); if (packet_endpoint->in->eof()) throw Exception(ErrorCodes::MYSQL_CLIENT_INSUFFICIENT_CAPABILITIES, @@ -158,7 +158,7 @@ void Sha256Password::authenticate( LOG_TRACE(log, "Key: {}", pem); AuthMoreData data(pem); - packet_endpoint->sendPacket(data, true); + packet_endpoint->sendPacket(data); sent_public_key = true; AuthSwitchResponse response; diff --git a/src/Core/MySQL/IMySQLReadPacket.cpp b/src/Core/MySQL/IMySQLReadPacket.cpp index bb00444c6b3..af6448a662b 100644 --- a/src/Core/MySQL/IMySQLReadPacket.cpp +++ b/src/Core/MySQL/IMySQLReadPacket.cpp @@ -33,13 +33,13 @@ void IMySQLReadPacket::readPayloadWithUnpacked(ReadBuffer & in) void LimitedReadPacket::readPayload(ReadBuffer &in, uint8_t &sequence_id) { - LimitReadBuffer limited(in, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet."); + LimitReadBuffer limited(in, {.read_no_more = 10000, .expect_eof = true, .excetion_hint = "too long MySQL packet."}); IMySQLReadPacket::readPayload(limited, sequence_id); } void LimitedReadPacket::readPayloadWithUnpacked(ReadBuffer & in) { - LimitReadBuffer limited(in, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet."); + LimitReadBuffer limited(in,{.read_no_more = 10000, .expect_eof = true, .excetion_hint = "too long MySQL packet."}); IMySQLReadPacket::readPayloadWithUnpacked(limited); } diff --git a/src/Core/MySQL/MySQLClient.cpp b/src/Core/MySQL/MySQLClient.cpp index d5c7147b10a..87760cac45f 100644 --- a/src/Core/MySQL/MySQLClient.cpp +++ b/src/Core/MySQL/MySQLClient.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -55,7 +56,7 @@ void MySQLClient::connect() connected = true; in = std::make_shared(*socket); - out = std::make_shared(*socket); + out = std::make_shared>(*socket); packet_endpoint = std::make_shared(*in, *out, sequence_id); handshake(); @@ -88,7 +89,7 @@ void MySQLClient::handshake() HandshakeResponse handshake_response( client_capabilities, MAX_PACKET_LENGTH, charset_utf8, user, "", auth_plugin_data, mysql_native_password); - packet_endpoint->sendPacket(handshake_response, true); + packet_endpoint->sendPacket(handshake_response); ResponsePacket packet_response(client_capabilities, true); packet_endpoint->receivePacket(packet_response); @@ -103,7 +104,7 @@ void MySQLClient::handshake() void MySQLClient::writeCommand(char command, String query) { WriteCommand write_command(command, query); - packet_endpoint->sendPacket(write_command, true); + packet_endpoint->sendPacket(write_command); ResponsePacket packet_response(client_capabilities); packet_endpoint->receivePacket(packet_response); @@ -122,7 +123,7 @@ void MySQLClient::writeCommand(char command, String query) void MySQLClient::registerSlaveOnMaster(UInt32 slave_id) { RegisterSlave register_slave(slave_id); - packet_endpoint->sendPacket(register_slave, true); + packet_endpoint->sendPacket(register_slave); ResponsePacket packet_response(client_capabilities); packet_endpoint->receivePacket(packet_response); @@ -167,7 +168,7 @@ void MySQLClient::startBinlogDumpGTID(UInt32 slave_id, String replicate_db, std: replication.setReplicateTables(replicate_tables); BinlogDumpGTID binlog_dump(slave_id, gtid_sets.toPayload()); - packet_endpoint->sendPacket(binlog_dump, true); + packet_endpoint->sendPacket(binlog_dump); } BinlogEventPtr MySQLClient::readOneBinlogEvent(UInt64 milliseconds) diff --git a/src/Core/MySQL/PacketEndpoint.h b/src/Core/MySQL/PacketEndpoint.h index 5e1a6a31048..56e41b050d8 100644 --- a/src/Core/MySQL/PacketEndpoint.h +++ b/src/Core/MySQL/PacketEndpoint.h @@ -39,7 +39,7 @@ public: void resetSequenceId(); template - void sendPacket(const T & packet, bool flush = false) + void sendPacket(const T & packet, bool flush = true) { static_assert(std::is_base_of()); packet.writePayload(*out, sequence_id); diff --git a/src/Core/ProtocolDefines.h b/src/Core/ProtocolDefines.h index f8b0544a26b..a1538e4b4ef 100644 --- a/src/Core/ProtocolDefines.h +++ b/src/Core/ProtocolDefines.h @@ -90,7 +90,10 @@ static constexpr auto DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS = 54470; static constexpr auto DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL = 54471; -static constexpr auto DBMS_MIN_REVISION_WITH_V2_DYNAMIC_AND_JSON_SERIALIZATION = 54472; +/// Push externally granted roles to other nodes +static constexpr auto DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES = 54472; + +static constexpr auto DBMS_MIN_REVISION_WITH_V2_DYNAMIC_AND_JSON_SERIALIZATION = 54473; /// Version of ClickHouse TCP protocol. /// @@ -99,6 +102,6 @@ static constexpr auto DBMS_MIN_REVISION_WITH_V2_DYNAMIC_AND_JSON_SERIALIZATION = /// NOTE: DBMS_TCP_PROTOCOL_VERSION has nothing common with VERSION_REVISION, /// later is just a number for server version (one number instead of commit SHA) /// for simplicity (sometimes it may be more convenient in some use cases). -static constexpr auto DBMS_TCP_PROTOCOL_VERSION = 54472; +static constexpr auto DBMS_TCP_PROTOCOL_VERSION = 54473; } diff --git a/src/Core/ServerUUID.cpp b/src/Core/ServerUUID.cpp index 5b17017e7f4..ef73aece5ef 100644 --- a/src/Core/ServerUUID.cpp +++ b/src/Core/ServerUUID.cpp @@ -61,6 +61,10 @@ UUID loadServerUUID(const fs::path & server_uuid_file, Poco::Logger * log) out.finalize(); return new_uuid; } + catch (ErrnoException &) + { + throw; + } catch (...) { throw Exception(ErrorCodes::CANNOT_CREATE_FILE, "Caught Exception {} while writing the Server UUID file {}", diff --git a/src/Core/Settings.cpp b/src/Core/Settings.cpp index 08cdef25e52..45befffef96 100644 --- a/src/Core/Settings.cpp +++ b/src/Core/Settings.cpp @@ -4889,6 +4889,9 @@ Wait time to lock cache for space reservation in filesystem cache )", 0) \ DECLARE(Bool, filesystem_cache_prefer_bigger_buffer_size, true, R"( Prefer bigger buffer size if filesystem cache is enabled to avoid writing small file segments which deteriorate cache performance. On the other hand, enabling this setting might increase memory usage. +)", 0) \ + DECLARE(UInt64, filesystem_cache_boundary_alignment, 0, R"( +Filesystem cache boundary alignment. This setting is applied only for non-disk read (e.g. for cache of remote table engines / table functions, but not for storage configuration of MergeTree tables). Value 0 means no alignment. )", 0) \ DECLARE(UInt64, temporary_data_in_cache_reserve_space_wait_lock_timeout_milliseconds, (10 * 60 * 1000), R"( Wait time to lock cache for space reservation for temporary data in filesystem cache @@ -5520,6 +5523,13 @@ Only available in ClickHouse Cloud. Number of background threads for speculative )", 0) \ DECLARE(Int64, ignore_cold_parts_seconds, 0, R"( Only available in ClickHouse Cloud. Exclude new data parts from SELECT queries until they're either pre-warmed (see cache_populated_by_fetch) or this many seconds old. Only for Replicated-/SharedMergeTree. +)", 0) \ + DECLARE(Bool, short_circuit_function_evaluation_for_nulls, true, R"( +Allows to execute functions with Nullable arguments only on rows with non-NULL values in all arguments when ratio of NULL values in arguments exceeds short_circuit_function_evaluation_for_nulls_threshold. Applies only to functions that return NULL value for rows with at least one NULL value in arguments. +)", 0) \ + DECLARE(Double, short_circuit_function_evaluation_for_nulls_threshold, 1.0, R"( +Ratio threshold of NULL values to execute functions with Nullable arguments only on rows with non-NULL values in all arguments. Applies when setting short_circuit_function_evaluation_for_nulls is enabled. +When the ratio of rows containing NULL values to the total number of rows exceeds this threshold, these rows containing NULL values will not be evaluated. )", 0) \ DECLARE(Int64, prefer_warmed_unmerged_parts_seconds, 0, R"( Only available in ClickHouse Cloud. If a merged part is less than this many seconds old and is not pre-warmed (see cache_populated_by_fetch), but all its source parts are available and pre-warmed, SELECT queries will read from those parts instead. Only for ReplicatedMergeTree. Note that this only checks whether CacheWarmer processed the part; if the part was fetched into cache by something else, it'll still be considered cold until CacheWarmer gets to it; if it was warmed, then evicted from cache, it'll still be considered warm. @@ -5727,6 +5737,9 @@ If enabled, MongoDB tables will return an error when a MongoDB query cannot be b Allow writing simple SELECT queries without the leading SELECT keyword, which makes it simple for calculator-style usage, e.g. `1 + 2` becomes a valid query. In `clickhouse-local` it is enabled by default and can be explicitly disabled. +)", 0) \ + DECLARE(Bool, push_external_roles_in_interserver_queries, true, R"( +Enable pushing user roles from originator to other nodes while performing a query. )", 0) \ \ \ diff --git a/src/Core/SettingsChangesHistory.cpp b/src/Core/SettingsChangesHistory.cpp index 7ea64bb45a0..f76b1af465b 100644 --- a/src/Core/SettingsChangesHistory.cpp +++ b/src/Core/SettingsChangesHistory.cpp @@ -64,6 +64,8 @@ static std::initializer_listgetSettingsRef()[Setting::max_parser_backtracks], - context->getSettingsRef()[Setting::max_parser_depth]); + context->getSettingsRef()[Setting::max_parser_depth], + context->getSettingsRef()[Setting::max_parser_backtracks]); const auto & new_query = new_query_raw->as(); /// If there are no columns, then there is nothing much we can do if (!new_query.columns_list || !new_query.columns_list->columns) diff --git a/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp b/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp index 389d7a58b86..86605e1e7b1 100644 --- a/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp +++ b/src/Databases/MySQL/MaterializedMySQLSyncThread.cpp @@ -73,6 +73,7 @@ namespace ErrorCodes extern const int CANNOT_GET_CREATE_TABLE_QUERY; extern const int THERE_IS_NO_QUERY; extern const int QUERY_WAS_CANCELLED; + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; extern const int TABLE_ALREADY_EXISTS; extern const int DATABASE_ALREADY_EXISTS; extern const int DATABASE_NOT_EMPTY; @@ -1047,6 +1048,7 @@ void MaterializedMySQLSyncThread::executeDDLAtomic(const QueryEvent & query_even exception.code() != ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY && exception.code() != ErrorCodes::THERE_IS_NO_QUERY && exception.code() != ErrorCodes::QUERY_WAS_CANCELLED && + exception.code() != ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT && exception.code() != ErrorCodes::TABLE_ALREADY_EXISTS && exception.code() != ErrorCodes::UNKNOWN_DATABASE && exception.code() != ErrorCodes::DATABASE_ALREADY_EXISTS && diff --git a/src/Databases/MySQL/MySQLBinlog.cpp b/src/Databases/MySQL/MySQLBinlog.cpp index 63adf591c90..c05324db41b 100644 --- a/src/Databases/MySQL/MySQLBinlog.cpp +++ b/src/Databases/MySQL/MySQLBinlog.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -252,7 +253,7 @@ void BinlogFromSocket::connect(const String & host, UInt16 port, const String & connected = true; in = std::make_unique(*socket); - out = std::make_unique(*socket); + out = std::make_unique>(*socket); packet_endpoint = std::make_shared(*in, *out, sequence_id); handshake(user, password); @@ -294,7 +295,7 @@ void BinlogFromSocket::handshake(const String & user, const String & password) const UInt8 charset_utf8 = 33; HandshakeResponse handshake_response( client_capabilities, MAX_PACKET_LENGTH, charset_utf8, user, "", auth_plugin_data, mysql_native_password); - packet_endpoint->sendPacket(handshake_response, true); + packet_endpoint->sendPacket(handshake_response); ResponsePacket packet_response(client_capabilities, true); packet_endpoint->receivePacket(packet_response); @@ -309,7 +310,7 @@ void BinlogFromSocket::handshake(const String & user, const String & password) void BinlogFromSocket::writeCommand(char command, const String & query) { WriteCommand write_command(command, query); - packet_endpoint->sendPacket(write_command, true); + packet_endpoint->sendPacket(write_command); ResponsePacket packet_response(client_capabilities); packet_endpoint->receivePacket(packet_response); @@ -328,7 +329,7 @@ void BinlogFromSocket::writeCommand(char command, const String & query) void BinlogFromSocket::registerSlaveOnMaster(UInt32 slave_id) { RegisterSlave register_slave(slave_id); - packet_endpoint->sendPacket(register_slave, true); + packet_endpoint->sendPacket(register_slave); ResponsePacket packet_response(client_capabilities); packet_endpoint->receivePacket(packet_response); @@ -358,7 +359,7 @@ void BinlogFromSocket::start(UInt32 slave_id, const String & executed_gtid_set) position.gtid_sets.parse(executed_gtid_set); BinlogDumpGTID binlog_dump(slave_id, position.gtid_sets.toPayload()); - packet_endpoint->sendPacket(binlog_dump, true); + packet_endpoint->sendPacket(binlog_dump); } class ReadPacketFromSocket : public IMySQLReadPacket @@ -428,7 +429,7 @@ bool BinlogFromFile::tryReadEvent(BinlogEventPtr & to, UInt64 /*ms*/) EventHeader event_header; event_header.parse(*in); - LimitReadBuffer limit_read_buffer(*in, event_header.event_size - EVENT_HEADER_LENGTH, /* throw_exception */ false, /* exact_limit */ {}); + LimitReadBuffer limit_read_buffer(*in, {.read_no_more = event_header.event_size - EVENT_HEADER_LENGTH}); MySQLBinlogEventReadBuffer event_payload(limit_read_buffer, checksum_signature_length); parseEvent(event_header, event_payload); to = event; diff --git a/src/Databases/MySQL/MySQLBinlogClientFactory.cpp b/src/Databases/MySQL/MySQLBinlogClientFactory.cpp index 03a777ff352..8b3e77a7828 100644 --- a/src/Databases/MySQL/MySQLBinlogClientFactory.cpp +++ b/src/Databases/MySQL/MySQLBinlogClientFactory.cpp @@ -13,9 +13,10 @@ BinlogClientPtr BinlogClientFactory::getClient(const String & host, UInt16 port, { std::lock_guard lock(mutex); String binlog_client_name; - WriteBufferFromString stream(binlog_client_name); - stream << user << "@" << host << ":" << port; - stream.finalize(); + { + WriteBufferFromString stream(binlog_client_name); + stream << user << "@" << host << ":" << port; + } String binlog_client_key = binlog_client_name + ":" + password; auto it = clients.find(binlog_client_key); BinlogClientPtr ret = it != clients.end() ? it->second.lock() : nullptr; diff --git a/src/Disks/DiskLocal.cpp b/src/Disks/DiskLocal.cpp index 732d2552628..c8ba4b52a61 100644 --- a/src/Disks/DiskLocal.cpp +++ b/src/Disks/DiskLocal.cpp @@ -669,6 +669,7 @@ void DiskLocal::setup() { auto buf = writeFile(disk_checker_path, DBMS_DEFAULT_BUFFER_SIZE, WriteMode::Rewrite, {}); writeIntBinary(magic_number, *buf); + buf->finalize(); } disk_checker_magic_number = magic_number; } diff --git a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp index 1f806e9c1e5..99626ff347c 100644 --- a/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp +++ b/src/Disks/IO/CachedOnDiskReadBufferFromFile.cpp @@ -138,7 +138,7 @@ bool CachedOnDiskReadBufferFromFile::nextFileSegmentsBatch() CreateFileSegmentSettings create_settings(FileSegmentKind::Regular); file_segments = cache->getOrSet( cache_key, file_offset_of_buffer_end, size, file_size.value(), - create_settings, settings.filesystem_cache_segments_batch_size, user); + create_settings, settings.filesystem_cache_segments_batch_size, user, settings.filesystem_cache_boundary_alignment); } return !file_segments->empty(); diff --git a/src/Disks/ObjectStorages/MetadataStorageFromDiskTransactionOperations.cpp b/src/Disks/ObjectStorages/MetadataStorageFromDiskTransactionOperations.cpp index 83248004339..b9f1b04f36f 100644 --- a/src/Disks/ObjectStorages/MetadataStorageFromDiskTransactionOperations.cpp +++ b/src/Disks/ObjectStorages/MetadataStorageFromDiskTransactionOperations.cpp @@ -292,6 +292,7 @@ void WriteFileOperation::undo(std::unique_lock &) { auto buf = disk.writeFile(path); writeString(prev_data, *buf); + buf->finalize(); } } diff --git a/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp index 6fd7570c4eb..1b74084bf04 100644 --- a/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp +++ b/src/Disks/tests/gtest_cascade_and_memory_write_buffer.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -55,9 +56,8 @@ static void testCascadeBufferRedability( cascade.write(data.data(), data.size()); EXPECT_EQ(cascade.count(), data.size()); - std::vector write_buffers; ConcatReadBuffer concat; - cascade.getResultBuffers(write_buffers); + auto write_buffers = cascade.getResultBuffers(); for (WriteBufferPtr & wbuf : write_buffers) { @@ -222,7 +222,7 @@ TEST(MemoryWriteBuffer, WriteAndReread) if (s > 1) { MemoryWriteBuffer buf(s - 1); - EXPECT_THROW(buf.write(data.data(), data.size()), MemoryWriteBuffer::CurrentBufferExhausted); + EXPECT_THROW(buf.write(data.data(), data.size()), WriteBuffer::CurrentBufferExhausted); buf.finalize(); } } diff --git a/src/Disks/tests/gtest_disk.cpp b/src/Disks/tests/gtest_disk.cpp index aed8e193a9d..d46b6b2c2b2 100644 --- a/src/Disks/tests/gtest_disk.cpp +++ b/src/Disks/tests/gtest_disk.cpp @@ -45,6 +45,7 @@ TEST_F(DiskTest, writeFile) { std::unique_ptr out = disk->writeFile("test_file"); writeString("test data", *out); + out->finalize(); } String data; @@ -63,6 +64,7 @@ TEST_F(DiskTest, readFile) { std::unique_ptr out = disk->writeFile("test_file"); writeString("test data", *out); + out->finalize(); } auto read_settings = DB::getReadSettings(); diff --git a/src/Formats/JSONExtractTree.cpp b/src/Formats/JSONExtractTree.cpp index 62905a2e630..545204c61c5 100644 --- a/src/Formats/JSONExtractTree.cpp +++ b/src/Formats/JSONExtractTree.cpp @@ -362,9 +362,10 @@ public: auto & col_str = assert_cast(column); auto & chars = col_str.getChars(); - WriteBufferFromVector buf(chars, AppendModeTag()); - jsonElementToString(element, buf, format_settings); - buf.finalize(); + { + WriteBufferFromVector buf(chars, AppendModeTag()); + jsonElementToString(element, buf, format_settings); + } chars.push_back(0); col_str.getOffsets().push_back(chars.size()); } diff --git a/src/Formats/ProtobufSerializer.cpp b/src/Formats/ProtobufSerializer.cpp index bd8aeff5a5d..ca849136495 100644 --- a/src/Formats/ProtobufSerializer.cpp +++ b/src/Formats/ProtobufSerializer.cpp @@ -522,9 +522,10 @@ namespace { write_function = [this](NumberType value) { - WriteBufferFromString buf{text_buffer}; - writeText(value, buf); - buf.finalize(); + { + WriteBufferFromString buf{text_buffer}; + writeText(value, buf); + } writeStr(text_buffer); }; @@ -894,7 +895,7 @@ namespace template void toStringAppend(NumberType value, PaddedPODArray & str) { - WriteBufferFromVector buf{str, AppendModeTag{}}; + auto buf = WriteBufferFromVector>(str, AppendModeTag{}); writeText(value, buf); } diff --git a/src/Formats/TemporaryFileStreamLegacy.cpp b/src/Formats/TemporaryFileStreamLegacy.cpp index e6651f0e83b..72bda115cc3 100644 --- a/src/Formats/TemporaryFileStreamLegacy.cpp +++ b/src/Formats/TemporaryFileStreamLegacy.cpp @@ -39,6 +39,7 @@ TemporaryFileStreamLegacy::Stat TemporaryFileStreamLegacy::write(const std::stri output.write(block); compressed_buf.finalize(); + file_buf.finalize(); return Stat{compressed_buf.getCompressedBytes(), compressed_buf.getUncompressedBytes()}; } diff --git a/src/Functions/FunctionFile.cpp b/src/Functions/FunctionFile.cpp index 3072ddb6273..6eb287cfdf3 100644 --- a/src/Functions/FunctionFile.cpp +++ b/src/Functions/FunctionFile.cpp @@ -138,9 +138,8 @@ public: throw Exception(ErrorCodes::DATABASE_ACCESS_DENIED, "File is not inside {}", user_files_absolute_path.string()); ReadBufferFromFile in(file_path); - WriteBufferFromVector out(res_chars, AppendModeTag{}); + auto out = WriteBufferFromVector(res_chars, AppendModeTag{}); copyData(in, out); - out.finalize(); } catch (...) { diff --git a/src/Functions/FunctionGenerateRandomStructure.cpp b/src/Functions/FunctionGenerateRandomStructure.cpp index 66a91d76e17..0869426faf9 100644 --- a/src/Functions/FunctionGenerateRandomStructure.cpp +++ b/src/Functions/FunctionGenerateRandomStructure.cpp @@ -415,9 +415,10 @@ ColumnPtr FunctionGenerateRandomStructure::executeImpl(const ColumnsWithTypeAndN auto col_res = ColumnString::create(); auto & string_column = assert_cast(*col_res); auto & chars = string_column.getChars(); - WriteBufferFromVector buf(chars); - writeRandomStructure(rng, number_of_columns, buf, allow_suspicious_lc_types); - buf.finalize(); + { + auto buf = WriteBufferFromVector(chars); + writeRandomStructure(rng, number_of_columns, buf, allow_suspicious_lc_types); + } chars.push_back(0); string_column.getOffsets().push_back(chars.size()); return ColumnConst::create(std::move(col_res), input_rows_count); diff --git a/src/Functions/FunctionHelpers.cpp b/src/Functions/FunctionHelpers.cpp index 9f8fbd4cb52..d37adee3e94 100644 --- a/src/Functions/FunctionHelpers.cpp +++ b/src/Functions/FunctionHelpers.cpp @@ -1,10 +1,10 @@ +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include -#include #include @@ -13,11 +13,11 @@ namespace DB namespace ErrorCodes { - extern const int ILLEGAL_COLUMN; - extern const int LOGICAL_ERROR; - extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int SIZES_OF_ARRAYS_DONT_MATCH; - extern const int ILLEGAL_TYPE_OF_ARGUMENT; +extern const int ILLEGAL_COLUMN; +extern const int LOGICAL_ERROR; +extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +extern const int SIZES_OF_ARRAYS_DONT_MATCH; +extern const int ILLEGAL_TYPE_OF_ARGUMENT; } const ColumnConst * checkAndGetColumnConstStringOrFixedString(const IColumn * column) @@ -27,8 +27,7 @@ const ColumnConst * checkAndGetColumnConstStringOrFixedString(const IColumn * co const ColumnConst * res = assert_cast(column); - if (checkColumn(&res->getDataColumn()) - || checkColumn(&res->getDataColumn())) + if (checkColumn(&res->getDataColumn()) || checkColumn(&res->getDataColumn())) return res; return {}; @@ -101,18 +100,22 @@ String withOrdinalEnding(size_t i) { switch (i) { - case 0: return "1st"; - case 1: return "2nd"; - case 2: return "3rd"; - default: return std::to_string(i) + "th"; + case 0: + return "1st"; + case 1: + return "2nd"; + case 2: + return "3rd"; + default: + return std::to_string(i) + "th"; } - } -void validateArgumentsImpl(const IFunction & func, - const ColumnsWithTypeAndName & arguments, - size_t argument_offset, - const FunctionArgumentDescriptors & descriptors) +void validateArgumentsImpl( + const IFunction & func, + const ColumnsWithTypeAndName & arguments, + size_t argument_offset, + const FunctionArgumentDescriptors & descriptors) { for (size_t i = 0; i < descriptors.size(); ++i) { @@ -123,13 +126,14 @@ void validateArgumentsImpl(const IFunction & func, const auto & arg = arguments[i + argument_offset]; const auto & descriptor = descriptors[i]; if (int error_code = descriptor.isValid(arg.type, arg.column); error_code != 0) - throw Exception(error_code, - "A value of illegal type was provided as {} argument '{}' to function '{}'. Expected: {}, got: {}", - withOrdinalEnding(argument_offset + i), - descriptor.name, - func.getName(), - descriptor.type_name, - arg.type ? arg.type->getName() : ""); + throw Exception( + error_code, + "A value of illegal type was provided as {} argument '{}' to function '{}'. Expected: {}, got: {}", + withOrdinalEnding(argument_offset + i), + descriptor.name, + func.getName(), + descriptor.type_name, + arg.type ? arg.type->getName() : ""); } } @@ -149,26 +153,35 @@ int FunctionArgumentDescriptor::isValid(const DataTypePtr & data_type, const Col return 0; } -void validateFunctionArguments(const IFunction & func, - const ColumnsWithTypeAndName & arguments, - const FunctionArgumentDescriptors & mandatory_args, - const FunctionArgumentDescriptors & optional_args) +void validateFunctionArguments( + const IFunction & func, + const ColumnsWithTypeAndName & arguments, + const FunctionArgumentDescriptors & mandatory_args, + const FunctionArgumentDescriptors & optional_args) { if (arguments.size() < mandatory_args.size() || arguments.size() > mandatory_args.size() + optional_args.size()) { - auto argument_singular_or_plural = [](const auto & args) -> std::string_view { return args.size() == 1 ? "argument" : "arguments"; }; + auto argument_singular_or_plural + = [](const auto & args) -> std::string_view { return args.size() == 1 ? "argument" : "arguments"; }; String expected_args_string; if (!mandatory_args.empty() && !optional_args.empty()) - expected_args_string = fmt::format("{} mandatory {} and {} optional {}", mandatory_args.size(), argument_singular_or_plural(mandatory_args), optional_args.size(), argument_singular_or_plural(optional_args)); + expected_args_string = fmt::format( + "{} mandatory {} and {} optional {}", + mandatory_args.size(), + argument_singular_or_plural(mandatory_args), + optional_args.size(), + argument_singular_or_plural(optional_args)); else if (!mandatory_args.empty() && optional_args.empty()) - expected_args_string = fmt::format("{} {}", mandatory_args.size(), argument_singular_or_plural(mandatory_args)); /// intentionally not "_mandatory_ arguments" + expected_args_string = fmt::format( + "{} {}", mandatory_args.size(), argument_singular_or_plural(mandatory_args)); /// intentionally not "_mandatory_ arguments" else if (mandatory_args.empty() && !optional_args.empty()) expected_args_string = fmt::format("{} optional {}", optional_args.size(), argument_singular_or_plural(optional_args)); else expected_args_string = "0 arguments"; - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + throw Exception( + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "An incorrect number of arguments was specified for function '{}'. Expected {}, got {}", func.getName(), expected_args_string, @@ -204,7 +217,8 @@ checkAndGetNestedArrayOffset(const IColumn ** columns, size_t num_arguments) return {nested_columns, offsets->data()}; } -ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) +ColumnPtr +wrapInNullable(const ColumnPtr & src, const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count) { ColumnPtr result_null_map_column; @@ -262,6 +276,39 @@ ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnsWithTypeAndName & a return ColumnNullable::create(src_not_nullable->convertToFullColumnIfConst(), result_null_map_column); } +ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnPtr & null_map) +{ + if (src->onlyNull()) + return src; + + ColumnPtr result_null_map_column; + ColumnPtr src_not_nullable = src; + if (const auto * nullable = checkAndGetColumn(src.get())) + { + src_not_nullable = nullable->getNestedColumnPtr(); + result_null_map_column = nullable->getNullMapColumnPtr(); + + MutableColumnPtr mutable_result_null_map_column = IColumn::mutate(std::move(result_null_map_column)); + NullMap & result_null_map = assert_cast(*mutable_result_null_map_column).getData(); + const NullMap & null_map_data = assert_cast(*null_map).getData(); + for (size_t i = 0; i < result_null_map.size(); ++i) + result_null_map[i] |= null_map_data[i]; + + result_null_map_column = std::move(mutable_result_null_map_column); + return ColumnNullable::create(src_not_nullable->convertToFullColumnIfConst(), result_null_map_column); + } + else if (const auto * const_src = checkAndGetColumn(src.get())) + { + const NullMap & null_map_data = assert_cast(*null_map).getData(); + ColumnPtr result_null_map = ColumnUInt8::create(1, null_map_data[0] || const_src->isNullAt(0)); + const auto * nullable_data = checkAndGetColumn(&const_src->getDataColumn()); + auto data_not_nullable = nullable_data ? nullable_data->getNestedColumnPtr() : const_src->getDataColumnPtr(); + return ColumnConst::create(ColumnNullable::create(data_not_nullable, result_null_map), const_src->size()); + } + else + return ColumnNullable::create(src->convertToFullColumnIfConst(), null_map); +} + NullPresence getNullPresense(const ColumnsWithTypeAndName & args) { NullPresence res; diff --git a/src/Functions/FunctionHelpers.h b/src/Functions/FunctionHelpers.h index 4f93b236bcb..b8d81673cd5 100644 --- a/src/Functions/FunctionHelpers.h +++ b/src/Functions/FunctionHelpers.h @@ -169,6 +169,11 @@ checkAndGetNestedArrayOffset(const IColumn ** columns, size_t num_arguments); /// Or ColumnConst(ColumnNullable) if the result is always NULL or if the result is constant and always not NULL. ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count); +/** Return ColumnNullable of src, with input null map + * Or ColumnConst(ColumnNullable) if the result is always NULL or if the result is constant and always not NULL. + */ +ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnPtr & null_map); + struct NullPresence { bool has_nullable = false; diff --git a/src/Functions/FunctionsBitmap.h b/src/Functions/FunctionsBitmap.h index cb1a49fc1ca..1fe29087a6f 100644 --- a/src/Functions/FunctionsBitmap.h +++ b/src/Functions/FunctionsBitmap.h @@ -512,17 +512,25 @@ public: for (size_t i = 0; i < 2; ++i) { const auto * array_type = typeid_cast(arguments[i + 1].get()); - auto exception = Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "The second and third arguments for function {} " - "must be an one of [Array(UInt8), Array(UInt16), Array(UInt32), Array(UInt64)] " - "but one of them has type {}.", getName(), arguments[i + 1]->getName()); - if (!array_type) - throw exception; /// NOLINT + bool has_error = false; + if (array_type) + { + auto nested_type = array_type->getNestedType(); + WhichDataType which(nested_type); + if (!(which.isUInt8() || which.isUInt16() || which.isUInt32() || which.isUInt64())) + has_error = true; + } + else + { + has_error = true; + } - auto nested_type = array_type->getNestedType(); - WhichDataType which(nested_type); - if (!(which.isUInt8() || which.isUInt16() || which.isUInt32() || which.isUInt64())) - throw exception; /// NOLINT + if (has_error) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, + "The second and third arguments for function {} " + "must be an one of [Array(UInt8), Array(UInt16), Array(UInt32), Array(UInt64)] " + "but one of them has type {}.", getName(), arguments[i + 1]->getName()); } return arguments[0]; } diff --git a/src/Functions/FunctionsJSON.cpp b/src/Functions/FunctionsJSON.cpp index 4106ade6dee..52aaadf33af 100644 --- a/src/Functions/FunctionsJSON.cpp +++ b/src/Functions/FunctionsJSON.cpp @@ -953,9 +953,10 @@ public: { ColumnString & col_str = assert_cast(dest); auto & chars = col_str.getChars(); - WriteBufferFromVector buf(chars, AppendModeTag()); - jsonElementToString(element, buf, format_settings); - buf.finalize(); + { + WriteBufferFromVector buf(chars, AppendModeTag()); + jsonElementToString(element, buf, format_settings); + } chars.push_back(0); col_str.getOffsets().push_back(chars.size()); return true; diff --git a/src/Functions/IFunction.cpp b/src/Functions/IFunction.cpp index 68d4f25f08d..6a552bd1b01 100644 --- a/src/Functions/IFunction.cpp +++ b/src/Functions/IFunction.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include @@ -7,13 +7,18 @@ #include #include #include +#include +#include #include +#include #include #include #include #include #include #include +#include +#include #include #include #include @@ -27,15 +32,26 @@ # include #endif +namespace ProfileEvents +{ + extern const Event DefaultImplementationForNullsRows; + extern const Event DefaultImplementationForNullsRowsWithNulls; +} namespace DB { +namespace Setting +{ +extern const SettingsBool short_circuit_function_evaluation_for_nulls; +extern const SettingsDouble short_circuit_function_evaluation_for_nulls_threshold; +} + namespace ErrorCodes { - extern const int LOGICAL_ERROR; - extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; - extern const int ILLEGAL_COLUMN; +extern const int LOGICAL_ERROR; +extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +extern const int ILLEGAL_COLUMN; } namespace @@ -67,9 +83,7 @@ ColumnPtr replaceLowCardinalityColumnsByNestedAndGetDictionaryIndexes( const auto * low_cardinality_type = checkAndGetDataType(column.type.get()); if (!low_cardinality_type) - throw Exception(ErrorCodes::LOGICAL_ERROR, - "Incompatible type for LowCardinality column: {}", - column.type->getName()); + throw Exception(ErrorCodes::LOGICAL_ERROR, "Incompatible type for LowCardinality column: {}", column.type->getName()); if (can_be_executed_on_default_arguments) { @@ -122,10 +136,7 @@ ColumnPtr IExecutableFunction::defaultImplementationForConstantArguments( /// Check that these arguments are really constant. for (auto arg_num : arguments_to_remain_constants) if (arg_num < args.size() && !isColumnConst(*args[arg_num].column)) - throw Exception(ErrorCodes::ILLEGAL_COLUMN, - "Argument at index {} for function {} must be constant", - arg_num, - getName()); + throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Argument at index {} for function {} must be constant", arg_num, getName()); if (args.empty() || !useDefaultImplementationForConstants() || !allArgumentsAreConstants(args)) return nullptr; @@ -139,14 +150,16 @@ ColumnPtr IExecutableFunction::defaultImplementationForConstantArguments( { const ColumnWithTypeAndName & column = args[arg_num]; - if (arguments_to_remain_constants.end() != std::find(arguments_to_remain_constants.begin(), arguments_to_remain_constants.end(), arg_num)) + if (arguments_to_remain_constants.end() + != std::find(arguments_to_remain_constants.begin(), arguments_to_remain_constants.end(), arg_num)) { temporary_columns.emplace_back(ColumnWithTypeAndName{column.column->cloneResized(1), column.type, column.name}); } else { have_converted_columns = true; - temporary_columns.emplace_back(ColumnWithTypeAndName{ assert_cast(column.column.get())->getDataColumnPtr(), column.type, column.name }); + temporary_columns.emplace_back( + ColumnWithTypeAndName{assert_cast(column.column.get())->getDataColumnPtr(), column.type, column.name}); } } @@ -154,7 +167,8 @@ ColumnPtr IExecutableFunction::defaultImplementationForConstantArguments( * not in "arguments_to_remain_constants" set. Otherwise we get infinite recursion. */ if (!have_converted_columns) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + throw Exception( + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Number of arguments for function {} doesn't match: the function requires more arguments", getName()); @@ -177,7 +191,7 @@ ColumnPtr IExecutableFunction::defaultImplementationForNulls( NullPresence null_presence = getNullPresense(args); - if (null_presence.has_null_constant) + if (null_presence.has_null_constant || null_presence.has_nullable) { // Default implementation for nulls returns null result for null arguments, // so the result type must be nullable. @@ -188,17 +202,87 @@ ColumnPtr IExecutableFunction::defaultImplementationForNulls( "is expected to return Nullable result, got {}", getName(), result_type->getName()); + } + if (null_presence.has_null_constant) + { + /// If any of the input arguments is null literal, the result is null constant. return result_type->createColumnConstWithDefaultValue(input_rows_count); } if (null_presence.has_nullable) { + /// Usually happens during analyzing. We should return non-const column to avoid wrong constant folding. + if (input_rows_count == 0) + return result_type->createColumn(); + + auto result_null_map = ColumnUInt8::create(input_rows_count, 0); + auto & result_null_map_data = result_null_map->getData(); + bool all_columns_constant = true; + for (const auto & arg : args) + { + if (!isColumnConst(*arg.column)) + all_columns_constant = false; + + if (arg.type->isNullable()) + { + if (isColumnConst(*arg.column)) + { + if (arg.column->onlyNull()) + { + /// If any of input columns contains a null constant, the result is null constant. + return result_type->createColumnConstWithDefaultValue(input_rows_count); + } + } + else + { + const auto & null_map = assert_cast(*arg.column).getNullMapData(); + for (size_t i = 0; i < input_rows_count; ++i) + result_null_map_data[i] |= null_map[i]; + } + } + } + + size_t rows_with_nulls = countBytesInFilter(result_null_map_data.data(), 0, input_rows_count); + size_t rows_without_nulls = input_rows_count - rows_with_nulls; + ProfileEvents::increment(ProfileEvents::DefaultImplementationForNullsRows, input_rows_count); + ProfileEvents::increment(ProfileEvents::DefaultImplementationForNullsRowsWithNulls, rows_with_nulls); + + if (rows_without_nulls == 0 && !all_columns_constant) + { + /// Don't need to evaluate function if each row contains at least one null value and not all input columns are constant. + return result_type->createColumnConstWithDefaultValue(input_rows_count)->convertToFullColumnIfConst(); + } + + double null_ratio = rows_with_nulls / static_cast(result_null_map_data.size()); + bool should_short_circuit = short_circuit_function_evaluation_for_nulls && !all_columns_constant + && null_ratio >= short_circuit_function_evaluation_for_nulls_threshold; + ColumnsWithTypeAndName temporary_columns = createBlockWithNestedColumns(args); auto temporary_result_type = removeNullable(result_type); - auto res = executeWithoutLowCardinalityColumns(temporary_columns, temporary_result_type, input_rows_count, dry_run); - return wrapInNullable(res, args, result_type, input_rows_count); + if (!should_short_circuit) + { + /// Each row should be evaluated if there are no nulls or short circuiting is disabled. + auto res = executeWithoutLowCardinalityColumns(temporary_columns, temporary_result_type, input_rows_count, dry_run); + auto new_res = wrapInNullable(res, std::move(result_null_map)); + return new_res; + } + else + { + /// If short circuit is enabled, we only execute the function on rows with all arguments not null + + /// Filter every column by mask + for (auto & col : temporary_columns) + col.column = col.column->filter(result_null_map_data, rows_without_nulls); + + auto res = executeWithoutLowCardinalityColumns(temporary_columns, temporary_result_type, rows_without_nulls, dry_run); + auto mutable_res = IColumn::mutate(std::move(res)); + mutable_res->expand(result_null_map_data, false); + + auto new_res = wrapInNullable(std::move(mutable_res), std::move(result_null_map)); + return new_res; + } } return nullptr; @@ -260,7 +344,21 @@ static void convertSparseColumnsToFull(ColumnsWithTypeAndName & args) column.column = recursiveRemoveSparse(column.column); } -ColumnPtr IExecutableFunction::executeWithoutSparseColumns(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const +IExecutableFunction::IExecutableFunction() +{ + if (CurrentThread::isInitialized()) + { + auto query_context = CurrentThread::get().getQueryContext(); + if (query_context && query_context->getSettingsRef()[Setting::short_circuit_function_evaluation_for_nulls]) + { + short_circuit_function_evaluation_for_nulls = true; + short_circuit_function_evaluation_for_nulls_threshold = query_context->getSettingsRef()[Setting::short_circuit_function_evaluation_for_nulls_threshold]; + } + } +} + +ColumnPtr IExecutableFunction::executeWithoutSparseColumns( + const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const { ColumnPtr result; if (useDefaultImplementationForLowCardinalityColumns()) @@ -273,19 +371,16 @@ ColumnPtr IExecutableFunction::executeWithoutSparseColumns(const ColumnsWithType const auto & dictionary_type = res_low_cardinality_type->getDictionaryType(); ColumnPtr indexes = replaceLowCardinalityColumnsByNestedAndGetDictionaryIndexes( - columns_without_low_cardinality, can_be_executed_on_default_arguments, input_rows_count); + columns_without_low_cardinality, can_be_executed_on_default_arguments, input_rows_count); - size_t new_input_rows_count = columns_without_low_cardinality.empty() - ? input_rows_count - : columns_without_low_cardinality.front().column->size(); + size_t new_input_rows_count + = columns_without_low_cardinality.empty() ? input_rows_count : columns_without_low_cardinality.front().column->size(); checkFunctionArgumentSizes(columns_without_low_cardinality, new_input_rows_count); auto res = executeWithoutLowCardinalityColumns(columns_without_low_cardinality, dictionary_type, new_input_rows_count, dry_run); bool res_is_constant = isColumnConst(*res); - auto keys = res_is_constant - ? res->cloneResized(1)->convertToFullColumnIfConst() - : res; + auto keys = res_is_constant ? res->cloneResized(1)->convertToFullColumnIfConst() : res; auto res_mut_dictionary = DataTypeLowCardinality::createColumnUnique(*res_low_cardinality_type->getDictionaryType()); ColumnPtr res_indexes = res_mut_dictionary->uniqueInsertRangeFrom(*keys, 0, keys->size()); @@ -311,7 +406,8 @@ ColumnPtr IExecutableFunction::executeWithoutSparseColumns(const ColumnsWithType return result; } -ColumnPtr IExecutableFunction::execute(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const +ColumnPtr IExecutableFunction::execute( + const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const { checkFunctionArgumentSizes(arguments, input_rows_count); @@ -372,7 +468,7 @@ ColumnPtr IExecutableFunction::execute(const ColumnsWithTypeAndName & arguments, if (!result_type->canBeInsideSparseColumns() || !res->isDefaultAt(0) || res->getNumberOfDefaultRows() != 1) { const auto & offsets_data = assert_cast &>(*sparse_offsets).getData(); - return res->createWithOffsets(offsets_data, *createColumnConst(res, 0), input_rows_count, /*shift=*/ 1); + return res->createWithOffsets(offsets_data, *createColumnConst(res, 0), input_rows_count, /*shift=*/1); } return ColumnSparse::create(res, sparse_offsets, input_rows_count); @@ -398,7 +494,8 @@ void IFunctionOverloadResolver::checkNumberOfArguments(size_t number_of_argument size_t expected_number_of_arguments = getNumberOfArguments(); if (number_of_arguments != expected_number_of_arguments) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, + throw Exception( + ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Number of arguments for function {} doesn't match: passed {}, should be {}", getName(), number_of_arguments, @@ -437,9 +534,8 @@ DataTypePtr IFunctionOverloadResolver::getReturnType(const ColumnsWithTypeAndNam auto type_without_low_cardinality = getReturnTypeWithoutLowCardinality(args_without_low_cardinality); - if (canBeExecutedOnLowCardinalityDictionary() && has_low_cardinality - && num_full_low_cardinality_columns <= 1 && num_full_ordinary_columns == 0 - && type_without_low_cardinality->canBeInsideLowCardinality()) + if (canBeExecutedOnLowCardinalityDictionary() && has_low_cardinality && num_full_low_cardinality_columns <= 1 + && num_full_ordinary_columns == 0 && type_without_low_cardinality->canBeInsideLowCardinality()) return std::make_shared(type_without_low_cardinality); return type_without_low_cardinality; } @@ -561,7 +657,7 @@ llvm::Value * IFunction::compile(llvm::IRBuilderBase & builder, const ValuesWith ValuesWithType unwrapped_arguments; unwrapped_arguments.reserve(arguments.size()); - std::vector is_null_values; + std::vector is_null_values; for (size_t i = 0; i < arguments.size(); ++i) { diff --git a/src/Functions/IFunction.h b/src/Functions/IFunction.h index d0d6b02e69d..871af2b5503 100644 --- a/src/Functions/IFunction.h +++ b/src/Functions/IFunction.h @@ -45,6 +45,7 @@ using OptionalFieldInterval = std::optional; class IExecutableFunction { public: + IExecutableFunction(); virtual ~IExecutableFunction() = default; @@ -120,6 +121,9 @@ private: ColumnPtr executeWithoutSparseColumns( const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const; + + bool short_circuit_function_evaluation_for_nulls = false; + double short_circuit_function_evaluation_for_nulls_threshold = 0.0; }; using ExecutableFunctionPtr = std::shared_ptr; diff --git a/src/Functions/formatRow.cpp b/src/Functions/formatRow.cpp index d60e681888d..a86b4c6905b 100644 --- a/src/Functions/formatRow.cpp +++ b/src/Functions/formatRow.cpp @@ -59,7 +59,7 @@ public: { auto col_str = ColumnString::create(); ColumnString::Chars & vec = col_str->getChars(); - WriteBufferFromVector buffer(vec); + WriteBufferFromVector buffer(vec); ColumnString::Offsets & offsets = col_str->getOffsets(); offsets.resize(input_rows_count); diff --git a/src/Functions/structureToFormatSchema.cpp b/src/Functions/structureToFormatSchema.cpp index 4fc2bf707a4..2bc0973ca63 100644 --- a/src/Functions/structureToFormatSchema.cpp +++ b/src/Functions/structureToFormatSchema.cpp @@ -88,9 +88,10 @@ public: auto columns_list = parseColumnsListFromString(structure, context); auto col_res = ColumnString::create(); auto & data = assert_cast(*col_res).getChars(); - WriteBufferFromVector buf(data); - Impl::writeSchema(buf, message_name, columns_list.getAll()); - buf.finalize(); + { + auto buf = WriteBufferFromVector(data); + Impl::writeSchema(buf, message_name, columns_list.getAll()); + } auto & offsets = assert_cast(*col_res).getOffsets(); offsets.push_back(data.size()); return ColumnConst::create(std::move(col_res), input_rows_count); diff --git a/src/IO/Archives/IArchiveWriter.h b/src/IO/Archives/IArchiveWriter.h index a3b06e6c4be..f95309ca8c3 100644 --- a/src/IO/Archives/IArchiveWriter.h +++ b/src/IO/Archives/IArchiveWriter.h @@ -32,6 +32,8 @@ public: /// (Unless an error appeared and the archive is in fact no longer needed.) virtual void finalize() = 0; + virtual void cancel() noexcept = 0; + static constexpr const int kDefaultCompressionLevel = -1; /// Sets compression method and level. diff --git a/src/IO/Archives/LibArchiveWriter.cpp b/src/IO/Archives/LibArchiveWriter.cpp index 4bbbc90a4a3..ef93573777f 100644 --- a/src/IO/Archives/LibArchiveWriter.cpp +++ b/src/IO/Archives/LibArchiveWriter.cpp @@ -231,6 +231,20 @@ void LibArchiveWriter::finalize() finalized = true; } +void LibArchiveWriter::cancel() noexcept +{ + std::lock_guard lock{mutex}; + if (finalized) + return; + if (archive) + archive_write_close(archive); + if (stream_info) + { + stream_info->archive_write_buffer->cancel(); + stream_info.reset(); + } +} + void LibArchiveWriter::setPassword(const String & password_) { if (password_.empty()) diff --git a/src/IO/Archives/LibArchiveWriter.h b/src/IO/Archives/LibArchiveWriter.h index da566c82ff6..96738dcef9e 100644 --- a/src/IO/Archives/LibArchiveWriter.h +++ b/src/IO/Archives/LibArchiveWriter.h @@ -42,6 +42,8 @@ public: /// (Unless an error appeared and the archive is in fact no longer needed.) void finalize() override; + void cancel() noexcept override; + /// Sets compression method and level. /// Changing them will affect next file in the archive. //void setCompression(const String & compression_method_, int compression_level_) override; diff --git a/src/IO/Archives/ZipArchiveWriter.cpp b/src/IO/Archives/ZipArchiveWriter.cpp index 149b05dc201..eb489efe1c3 100644 --- a/src/IO/Archives/ZipArchiveWriter.cpp +++ b/src/IO/Archives/ZipArchiveWriter.cpp @@ -310,6 +310,25 @@ void ZipArchiveWriter::finalize() finalized = true; } +void ZipArchiveWriter::cancel() noexcept +{ + std::lock_guard lock{mutex}; + if (finalized) + return; + + if (zip_handle) + { + zipClose(zip_handle, /* global_comment= */ nullptr); + zip_handle = nullptr; + } + + if (stream_info) + { + stream_info->getWriteBuffer().cancel(); + stream_info.reset(); + } +} + void ZipArchiveWriter::setCompression(const String & compression_method_, int compression_level_) { std::lock_guard lock{mutex}; diff --git a/src/IO/Archives/ZipArchiveWriter.h b/src/IO/Archives/ZipArchiveWriter.h index f4303e21f34..38ec36b5a9b 100644 --- a/src/IO/Archives/ZipArchiveWriter.h +++ b/src/IO/Archives/ZipArchiveWriter.h @@ -43,6 +43,8 @@ public: /// (Unless an error appeared and the archive is in fact no longer needed.) void finalize() override; + void cancel() noexcept override; + /// Supported compression methods. static constexpr const char kStore[] = "store"; static constexpr const char kDeflate[] = "deflate"; diff --git a/src/IO/AzureBlobStorage/copyAzureBlobStorageFile.cpp b/src/IO/AzureBlobStorage/copyAzureBlobStorageFile.cpp index 93bff3b3dc2..e2653510d70 100644 --- a/src/IO/AzureBlobStorage/copyAzureBlobStorageFile.cpp +++ b/src/IO/AzureBlobStorage/copyAzureBlobStorageFile.cpp @@ -281,10 +281,12 @@ namespace size_t size_to_stage = task.part_size; PODArray memory; - memory.resize(size_to_stage); - WriteBufferFromVector> wb(memory); + { + memory.resize(size_to_stage); + WriteBufferFromVector> wb(memory); + copyData(*read_buffer, wb, size_to_stage); + } - copyData(*read_buffer, wb, size_to_stage); Azure::Core::IO::MemoryBodyStream stream(reinterpret_cast(memory.data()), size_to_stage); const auto & block_id = task.block_ids.emplace_back(getRandomASCIIString(64)); diff --git a/src/IO/CascadeWriteBuffer.cpp b/src/IO/CascadeWriteBuffer.cpp index 8b863cb253c..6cd2c540643 100644 --- a/src/IO/CascadeWriteBuffer.cpp +++ b/src/IO/CascadeWriteBuffer.cpp @@ -36,7 +36,7 @@ void CascadeWriteBuffer::nextImpl() curr_buffer->position() = position(); curr_buffer->next(); } - catch (const MemoryWriteBuffer::CurrentBufferExhausted &) + catch (const WriteBuffer::CurrentBufferExhausted &) { if (curr_buffer_num < num_sources) { @@ -54,46 +54,50 @@ void CascadeWriteBuffer::nextImpl() } -void CascadeWriteBuffer::getResultBuffers(WriteBufferPtrs & res) +CascadeWriteBuffer::WriteBufferPtrs CascadeWriteBuffer::getResultBuffers() { - finalize(); - /// Sync position with underlying buffer before invalidating curr_buffer->position() = position(); - res = std::move(prepared_sources); + auto result = std::move(prepared_sources); curr_buffer = nullptr; curr_buffer_num = num_sources = 0; prepared_sources.clear(); lazy_sources.clear(); + + // we do not need this object any more + cancel(); + + return result; } void CascadeWriteBuffer::finalizeImpl() { + WriteBuffer::finalizeImpl(); + if (curr_buffer) curr_buffer->position() = position(); for (auto & buf : prepared_sources) { if (buf) - { buf->finalize(); - } } + } void CascadeWriteBuffer::cancelImpl() noexcept { + WriteBuffer::cancelImpl(); + if (curr_buffer) curr_buffer->position() = position(); for (auto & buf : prepared_sources) { if (buf) - { buf->cancel(); - } } } @@ -103,7 +107,7 @@ WriteBuffer * CascadeWriteBuffer::setNextBuffer() { if (!prepared_sources[curr_buffer_num]) { - WriteBufferPtr prev_buf = (curr_buffer_num > 0) ? prepared_sources[curr_buffer_num - 1] : nullptr; + auto prev_buf = (curr_buffer_num > 0) ? prepared_sources[curr_buffer_num - 1] : nullptr; prepared_sources[curr_buffer_num] = lazy_sources[curr_buffer_num - first_lazy_source_num](prev_buf); } } @@ -121,13 +125,4 @@ WriteBuffer * CascadeWriteBuffer::setNextBuffer() return res; } - -CascadeWriteBuffer::~CascadeWriteBuffer() -{ - /// Sync position with underlying buffer before exit - if (curr_buffer) - curr_buffer->position() = position(); -} - - } diff --git a/src/IO/CascadeWriteBuffer.h b/src/IO/CascadeWriteBuffer.h index 7a8b11c6a87..3c624561424 100644 --- a/src/IO/CascadeWriteBuffer.h +++ b/src/IO/CascadeWriteBuffer.h @@ -1,4 +1,5 @@ #pragma once + #include #include @@ -27,24 +28,22 @@ class CascadeWriteBuffer : public WriteBuffer { public: - using WriteBufferPtrs = std::vector; using WriteBufferConstructor = std::function; using WriteBufferConstructors = std::vector; + using WriteBufferPtrs = std::vector; explicit CascadeWriteBuffer(WriteBufferPtrs && prepared_sources_, WriteBufferConstructors && lazy_sources_ = {}); void nextImpl() override; /// Should be called once - void getResultBuffers(WriteBufferPtrs & res); + WriteBufferPtrs getResultBuffers(); const WriteBuffer * getCurrentBuffer() const { return curr_buffer; } - ~CascadeWriteBuffer() override; - private: void finalizeImpl() override; diff --git a/src/IO/ForkWriteBuffer.cpp b/src/IO/ForkWriteBuffer.cpp index 8e11b9ff590..7172def6c3b 100644 --- a/src/IO/ForkWriteBuffer.cpp +++ b/src/IO/ForkWriteBuffer.cpp @@ -45,16 +45,20 @@ void ForkWriteBuffer::nextImpl() void ForkWriteBuffer::finalizeImpl() { + WriteBuffer::finalizeImpl(); for (const WriteBufferPtr & buffer : sources) { buffer->finalize(); } } -ForkWriteBuffer::~ForkWriteBuffer() +void ForkWriteBuffer::cancelImpl() noexcept { - finalize(); + WriteBuffer::cancelImpl(); + for (const WriteBufferPtr & buffer : sources) + { + buffer->cancel(); + } } - } diff --git a/src/IO/ForkWriteBuffer.h b/src/IO/ForkWriteBuffer.h index 17fc82028a9..248cd9bf91c 100644 --- a/src/IO/ForkWriteBuffer.h +++ b/src/IO/ForkWriteBuffer.h @@ -5,10 +5,6 @@ namespace DB { -namespace ErrorCodes -{ -} - /** ForkWriteBuffer takes a vector of WriteBuffer and writes data to all of them * If the vector of WriteBufferPts is empty, then it throws an error * It uses the buffer of the first element as its buffer and copies data from @@ -17,15 +13,13 @@ namespace ErrorCodes class ForkWriteBuffer : public WriteBuffer { public: - using WriteBufferPtrs = std::vector; - explicit ForkWriteBuffer(WriteBufferPtrs && sources_); - ~ForkWriteBuffer() override; protected: void nextImpl() override; void finalizeImpl() override; + void cancelImpl() noexcept override; private: WriteBufferPtrs sources; diff --git a/src/IO/HTTPCommon.cpp b/src/IO/HTTPCommon.cpp index b2cccfe92aa..55e7265cfb6 100644 --- a/src/IO/HTTPCommon.cpp +++ b/src/IO/HTTPCommon.cpp @@ -1,7 +1,9 @@ +#include #include #include #include +#include #include #include "config.h" @@ -84,9 +86,10 @@ void assertResponseIsOk(const String & uri, Poco::Net::HTTPResponse & response, ? ErrorCodes::RECEIVED_ERROR_TOO_MANY_REQUESTS : ErrorCodes::RECEIVED_ERROR_FROM_REMOTE_IO_SERVER; - istr.seekg(0, std::ios::end); - size_t body_length = istr.tellg(); - throw HTTPException(code, uri, status, response.getReason(), body_length); + std::string body; + Poco::StreamCopier::copyToString(istr, body); + + throw HTTPException(code, uri, status, response.getReason(), body); } } @@ -95,13 +98,13 @@ Exception HTTPException::makeExceptionMessage( const std::string & uri, Poco::Net::HTTPResponse::HTTPStatus http_status, const std::string & reason, - size_t body_length) + const std::string & body) { return Exception(code, "Received error from remote server {}. " "HTTP status code: {} '{}', " - "body length: {} bytes", - uri, static_cast(http_status), reason, body_length); + "body length: {} bytes, body: '{}'", + uri, static_cast(http_status), reason, body.length(), body); } } diff --git a/src/IO/HTTPCommon.h b/src/IO/HTTPCommon.h index 309aebd4b9f..4bfe3cf9e5f 100644 --- a/src/IO/HTTPCommon.h +++ b/src/IO/HTTPCommon.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -27,9 +28,9 @@ public: const std::string & uri, Poco::Net::HTTPResponse::HTTPStatus http_status_, const std::string & reason, - size_t body_length = 0 + const std::string & body ) - : Exception(makeExceptionMessage(code, uri, http_status_, reason, body_length)) + : Exception(makeExceptionMessage(code, uri, http_status_, reason, body)) , http_status(http_status_) {} @@ -46,7 +47,7 @@ private: const std::string & uri, Poco::Net::HTTPResponse::HTTPStatus http_status, const std::string & reason, - size_t body_length); + const std::string & body); const char * name() const noexcept override { return "DB::HTTPException"; } const char * className() const noexcept override { return "DB::HTTPException"; } diff --git a/src/IO/LimitReadBuffer.cpp b/src/IO/LimitReadBuffer.cpp index 84c7ac86227..6005817f10d 100644 --- a/src/IO/LimitReadBuffer.cpp +++ b/src/IO/LimitReadBuffer.cpp @@ -1,5 +1,8 @@ +#include #include #include +#include +#include namespace DB @@ -19,63 +22,50 @@ bool LimitReadBuffer::nextImpl() /// Let underlying buffer calculate read bytes in `next()` call. in->position() = position(); - if (bytes >= limit) + if (bytes >= settings.read_no_less) { - if (exact_limit && bytes == *exact_limit) + if (settings.expect_eof && bytes > settings.read_no_more) + throw Exception(ErrorCodes::LIMIT_EXCEEDED, "Limit for LimitReadBuffer exceeded: {}", settings.excetion_hint); + + if (bytes >= settings.read_no_more) return false; - if (exact_limit && bytes != *exact_limit) - throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Unexpected data, got {} bytes, expected {}", bytes, *exact_limit); - - if (throw_exception) - throw Exception(ErrorCodes::LIMIT_EXCEEDED, "Limit for LimitReadBuffer exceeded: {}", exception_message); - - return false; + //throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Unexpected data, got {} bytes, expected {}", bytes, settings.read_atmost); } if (!in->next()) { - if (exact_limit && bytes != *exact_limit) - throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Unexpected EOF, got {} of {} bytes", bytes, *exact_limit); + if (bytes < settings.read_no_less) + throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Unexpected EOF, got {} of {} bytes", bytes, settings.read_no_less); + /// Clearing the buffer with existing data. BufferBase::set(in->position(), 0, 0); return false; } - BufferBase::set(in->position(), std::min(in->available(), limit - bytes), 0); + BufferBase::set(in->position(), std::min(in->available(), getEffectiveBufferSize() - bytes), 0); return true; } -LimitReadBuffer::LimitReadBuffer(ReadBuffer * in_, bool owns, size_t limit_, bool throw_exception_, - std::optional exact_limit_, std::string exception_message_) - : ReadBuffer(in_ ? in_->position() : nullptr, 0) - , in(in_) - , owns_in(owns) - , limit(limit_) - , throw_exception(throw_exception_) - , exact_limit(exact_limit_) - , exception_message(std::move(exception_message_)) +LimitReadBuffer::LimitReadBuffer(ReadBuffer & in_, Settings settings_) + : ReadBuffer(in_.position(), 0) + , in(&in_) + , settings(std::move(settings_)) { chassert(in); + chassert(settings.read_no_less <= settings.read_no_more); - BufferBase::set(in->position(), std::min(in->available(), limit), 0); + BufferBase::set(in->position(), std::min(in->available(), getEffectiveBufferSize()), 0); } -LimitReadBuffer::LimitReadBuffer(ReadBuffer & in_, size_t limit_, bool throw_exception_, - std::optional exact_limit_, std::string exception_message_) - : LimitReadBuffer(&in_, false, limit_, throw_exception_, exact_limit_, exception_message_) -{ -} - - -LimitReadBuffer::LimitReadBuffer(std::unique_ptr in_, size_t limit_, bool throw_exception_, - std::optional exact_limit_, std::string exception_message_) - : LimitReadBuffer(in_.release(), true, limit_, throw_exception_, exact_limit_, exception_message_) +LimitReadBuffer::LimitReadBuffer(std::unique_ptr in_, Settings settings_) + : LimitReadBuffer(*in_, std::move(settings_)) { + holder = std::move(in_); } @@ -84,9 +74,12 @@ LimitReadBuffer::~LimitReadBuffer() /// Update underlying buffer's position in case when limit wasn't reached. if (!working_buffer.empty()) in->position() = position(); - - if (owns_in) - delete in; } +size_t LimitReadBuffer::getEffectiveBufferSize() const +{ + if (settings.read_no_less) + return settings.read_no_less; + return settings.read_no_more; +} } diff --git a/src/IO/LimitReadBuffer.h b/src/IO/LimitReadBuffer.h index b869f2935fb..e5b80bf6b4a 100644 --- a/src/IO/LimitReadBuffer.h +++ b/src/IO/LimitReadBuffer.h @@ -1,7 +1,10 @@ #pragma once +#include +#include #include #include +#include "Core/Settings.h" namespace DB @@ -13,26 +16,29 @@ namespace DB class LimitReadBuffer : public ReadBuffer { public: - LimitReadBuffer(ReadBuffer & in_, size_t limit_, bool throw_exception_, - std::optional exact_limit_, std::string exception_message_ = {}); - LimitReadBuffer(std::unique_ptr in_, size_t limit_, bool throw_exception_, std::optional exact_limit_, - std::string exception_message_ = {}); + struct Settings + { + size_t read_no_less = 0; + size_t read_no_more = std::numeric_limits::max(); + bool expect_eof = false; + std::string excetion_hint = {}; + }; + + LimitReadBuffer(ReadBuffer & in_, Settings settings); + LimitReadBuffer(std::unique_ptr in_, Settings settings); + ~LimitReadBuffer() override; private: ReadBuffer * in; - const bool owns_in; + std::unique_ptr holder; - const size_t limit; - const bool throw_exception; - const std::optional exact_limit; - const std::string exception_message; - - LoggerPtr log; + const Settings settings; LimitReadBuffer(ReadBuffer * in_, bool owns, size_t limit_, bool throw_exception_, std::optional exact_limit_, std::string exception_message_); bool nextImpl() override; + size_t getEffectiveBufferSize() const; }; } diff --git a/src/IO/MemoryReadWriteBuffer.cpp b/src/IO/MemoryReadWriteBuffer.cpp index 1f4d350f083..c79ee1d6f58 100644 --- a/src/IO/MemoryReadWriteBuffer.cpp +++ b/src/IO/MemoryReadWriteBuffer.cpp @@ -112,7 +112,7 @@ void MemoryWriteBuffer::addChunk() if (0 == next_chunk_size) { set(position(), 0); - throw MemoryWriteBuffer::CurrentBufferExhausted(); + throw WriteBuffer::CurrentBufferExhausted(); } } diff --git a/src/IO/MemoryReadWriteBuffer.h b/src/IO/MemoryReadWriteBuffer.h index a7d3e388cb3..feb1499d12f 100644 --- a/src/IO/MemoryReadWriteBuffer.h +++ b/src/IO/MemoryReadWriteBuffer.h @@ -16,13 +16,6 @@ namespace DB class MemoryWriteBuffer : public WriteBuffer, public IReadableWriteBuffer, boost::noncopyable, private Allocator { public: - /// Special exception to throw when the current MemoryWriteBuffer cannot receive data - class CurrentBufferExhausted : public std::exception - { - public: - const char * what() const noexcept override { return "WriteBuffer limit is exhausted"; } - }; - /// Use max_total_size_ = 0 for unlimited storage explicit MemoryWriteBuffer( size_t max_total_size_ = 0, diff --git a/src/IO/NullWriteBuffer.cpp b/src/IO/NullWriteBuffer.cpp index 295c53ef7c7..15d3d8d2efa 100644 --- a/src/IO/NullWriteBuffer.cpp +++ b/src/IO/NullWriteBuffer.cpp @@ -1,16 +1,21 @@ #include - namespace DB { NullWriteBuffer::NullWriteBuffer() - : WriteBuffer(data, sizeof(data)) + : WriteBufferFromPointer(data, sizeof(data)) { } +NullWriteBuffer::~NullWriteBuffer() +{ + cancel(); +} + void NullWriteBuffer::nextImpl() { + // no op } } diff --git a/src/IO/NullWriteBuffer.h b/src/IO/NullWriteBuffer.h index f14c74ff720..399cd6b2b04 100644 --- a/src/IO/NullWriteBuffer.h +++ b/src/IO/NullWriteBuffer.h @@ -1,17 +1,17 @@ #pragma once #include -#include -#include namespace DB { /// Simply do nothing, can be used to measure amount of written bytes. -class NullWriteBuffer : public WriteBuffer, boost::noncopyable +class NullWriteBuffer final : public WriteBufferFromPointer { public: NullWriteBuffer(); + ~NullWriteBuffer() override; + void nextImpl() override; private: diff --git a/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.cpp b/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.cpp index d1e02b436f3..64ee411e0ba 100644 --- a/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.cpp +++ b/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.cpp @@ -23,8 +23,6 @@ ProtobufZeroCopyOutputStreamFromWriteBuffer::ProtobufZeroCopyOutputStreamFromWri out_holder = std::move(out_); } -ProtobufZeroCopyOutputStreamFromWriteBuffer::~ProtobufZeroCopyOutputStreamFromWriteBuffer() = default; - bool ProtobufZeroCopyOutputStreamFromWriteBuffer::Next(void ** data, int * size) { *data = out->position(); diff --git a/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.h b/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.h index c47cef9ff4d..30d859d8d80 100644 --- a/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.h +++ b/src/IO/Protobuf/ProtobufZeroCopyOutputStreamFromWriteBuffer.h @@ -16,8 +16,6 @@ public: explicit ProtobufZeroCopyOutputStreamFromWriteBuffer(WriteBuffer & out_); explicit ProtobufZeroCopyOutputStreamFromWriteBuffer(std::unique_ptr out_); - ~ProtobufZeroCopyOutputStreamFromWriteBuffer() override; - // Obtains a buffer into which data can be written. bool Next(void ** data, int * size) override; diff --git a/src/IO/ReadSettings.h b/src/IO/ReadSettings.h index b66b9867e39..d46d40bcb15 100644 --- a/src/IO/ReadSettings.h +++ b/src/IO/ReadSettings.h @@ -62,6 +62,7 @@ struct ReadSettings bool filesystem_cache_allow_background_download_for_metadata_files_in_packed_storage = true; bool filesystem_cache_allow_background_download_during_fetch = true; bool filesystem_cache_prefer_bigger_buffer_size = true; + std::optional filesystem_cache_boundary_alignment; bool use_page_cache_for_disks_without_file_cache = false; bool read_from_page_cache_if_exists_otherwise_bypass_cache = false; diff --git a/src/IO/ReadWriteBufferFromHTTP.cpp b/src/IO/ReadWriteBufferFromHTTP.cpp index 3bad6a80786..d5c761b0255 100644 --- a/src/IO/ReadWriteBufferFromHTTP.cpp +++ b/src/IO/ReadWriteBufferFromHTTP.cpp @@ -1,4 +1,6 @@ #include "ReadWriteBufferFromHTTP.h" +#include +#include #include #include @@ -413,7 +415,7 @@ std::unique_ptr ReadWriteBufferFromHTTP::initialize() /// Retry 200OK if (response.getStatus() == Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK) { - String reason = fmt::format( + String explanation = fmt::format( "Cannot read with range: [{}, {}] (response status: {}, reason: {}), will retry", *read_range.begin, read_range.end ? toString(*read_range.end) : "-", toString(response.getStatus()), response.getReason()); @@ -423,7 +425,8 @@ std::unique_ptr ReadWriteBufferFromHTTP::initialize() ErrorCodes::HTTP_RANGE_NOT_SATISFIABLE, current_uri.toString(), Poco::Net::HTTPResponse::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE, - reason); + response.getReason(), + explanation); } throw Exception( ErrorCodes::HTTP_RANGE_NOT_SATISFIABLE, @@ -537,7 +540,7 @@ size_t ReadWriteBufferFromHTTP::readBigAt(char * to, size_t n, size_t offset, co if (response.getStatus() != Poco::Net::HTTPResponse::HTTPStatus::HTTP_PARTIAL_CONTENT && (offset != 0 || offset + n < *file_info->file_size)) { - String reason = fmt::format( + String explanation = fmt::format( "When reading with readBigAt {}." "Cannot read with range: [{}, {}] (response status: {}, reason: {}), will retry", initial_uri.toString(), @@ -548,7 +551,8 @@ size_t ReadWriteBufferFromHTTP::readBigAt(char * to, size_t n, size_t offset, co ErrorCodes::HTTP_RANGE_NOT_SATISFIABLE, current_uri.toString(), Poco::Net::HTTPResponse::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE, - reason); + response.getReason(), + explanation); } copyFromIStreamWithProgressCallback(*result.response_stream, to, n, progress_callback, &bytes_copied, &is_canceled); diff --git a/src/IO/SnappyReadBuffer.cpp b/src/IO/SnappyReadBuffer.cpp index c554b9991d9..70c97ae6a28 100644 --- a/src/IO/SnappyReadBuffer.cpp +++ b/src/IO/SnappyReadBuffer.cpp @@ -31,10 +31,12 @@ bool SnappyReadBuffer::nextImpl() { if (compress_buffer.empty() && uncompress_buffer.empty()) { - WriteBufferFromString wb(compress_buffer); - copyData(*in, wb); + { + WriteBufferFromString wb(compress_buffer); + copyData(*in, wb); + } - bool success = snappy::Uncompress(compress_buffer.data(), wb.count(), &uncompress_buffer); + bool success = snappy::Uncompress(compress_buffer.data(), compress_buffer.size(), &uncompress_buffer); if (!success) { throw Exception(ErrorCodes::SNAPPY_UNCOMPRESS_FAILED, "snappy uncomress failed: "); diff --git a/src/IO/SnappyWriteBuffer.cpp b/src/IO/SnappyWriteBuffer.cpp index 0e02b48e1e0..1eb10b080f7 100644 --- a/src/IO/SnappyWriteBuffer.cpp +++ b/src/IO/SnappyWriteBuffer.cpp @@ -26,11 +26,6 @@ SnappyWriteBuffer::SnappyWriteBuffer(WriteBuffer & out_, size_t buf_size, char * { } -SnappyWriteBuffer::~SnappyWriteBuffer() -{ - finish(); -} - void SnappyWriteBuffer::nextImpl() { if (!offset()) @@ -45,28 +40,12 @@ void SnappyWriteBuffer::nextImpl() void SnappyWriteBuffer::finish() { - if (finished) - return; - - try - { - finishImpl(); - out->finalize(); - finished = true; - } - catch (...) - { - /// Do not try to flush next time after exception. - out->position() = out->buffer().begin(); - finished = true; - throw; - } + finishImpl(); + out->finalize(); } void SnappyWriteBuffer::finishImpl() { - next(); - bool success = snappy::Compress(uncompress_buffer.data(), uncompress_buffer.size(), &compress_buffer); if (!success) { @@ -92,7 +71,18 @@ void SnappyWriteBuffer::finishImpl() } } +void SnappyWriteBuffer::cancelImpl() noexcept +{ + Base::cancelImpl(); + out->cancel(); +} + +void SnappyWriteBuffer::finalizeImpl() +{ + Base::finalizeImpl(); + finish(); +} + } #endif - diff --git a/src/IO/SnappyWriteBuffer.h b/src/IO/SnappyWriteBuffer.h index b7a084d0f80..b2848cb2c4c 100644 --- a/src/IO/SnappyWriteBuffer.h +++ b/src/IO/SnappyWriteBuffer.h @@ -11,6 +11,7 @@ namespace DB /// Performs compression using snappy library and write compressed data to the underlying buffer. class SnappyWriteBuffer : public BufferWithOwnMemory { + using Base = BufferWithOwnMemory; public: explicit SnappyWriteBuffer( std::unique_ptr out_, @@ -24,9 +25,7 @@ public: char * existing_memory = nullptr, size_t alignment = 0); - ~SnappyWriteBuffer() override; - - void finalizeImpl() override { finish(); } + void finalizeImpl() override; private: void nextImpl() override; @@ -34,11 +33,11 @@ private: void finishImpl(); void finish(); + void cancelImpl() noexcept override; + WriteBuffer * out; std::unique_ptr out_holder; - bool finished = false; - String uncompress_buffer; String compress_buffer; }; @@ -46,4 +45,3 @@ private: } #endif - diff --git a/src/IO/WriteBuffer.cpp b/src/IO/WriteBuffer.cpp index a86eb4ccea2..981f4ea39e3 100644 --- a/src/IO/WriteBuffer.cpp +++ b/src/IO/WriteBuffer.cpp @@ -1,32 +1,33 @@ #include "WriteBuffer.h" +#include #include namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + /// Calling finalize() in the destructor of derived classes is a bad practice. /// This causes objects to be left on the remote FS when a write operation is rolled back. /// Do call finalize() explicitly, before this call you have no guarantee that the file has been written WriteBuffer::~WriteBuffer() { // That destructor could be call with finalized=false in case of exceptions - if (count() > 0 && !finalized && !canceled) + if (!finalized && !canceled && !isStackUnwinding()) { - /// It is totally OK to destroy instance without finalization when an exception occurs - /// However it is suspicious to destroy instance without finalization at the green path - if (!std::uncaught_exceptions() && std::current_exception() == nullptr) - { - LoggerPtr log = getLogger("WriteBuffer"); - LOG_ERROR( - log, - "WriteBuffer is neither finalized nor canceled when destructor is called. " - "No exceptions in flight are detected. " - "The file might not be written at all or might be truncated. " - "Stack trace: {}", - StackTrace().toString()); - chassert(false && "WriteBuffer is not finalized in destructor."); - } + LoggerPtr log = getLogger("WriteBuffer"); + LOG_ERROR( + log, + "WriteBuffer is neither finalized nor canceled when destructor is called. " + "No exceptions in flight are detected. " + "The file might not be written at all or might be truncated." + "Stack trace: {}", + StackTrace().toString()); + chassert(false && "WriteBuffer is neither finalized nor canceled in destructor."); } } @@ -39,4 +40,28 @@ void WriteBuffer::cancel() noexcept cancelImpl(); canceled = true; } + +void WriteBuffer::finalize() +{ + if (finalized) + return; + + if (canceled) + throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot finalize buffer after cancellation."); + + LockMemoryExceptionInThread lock(VariableContext::Global); + try + { + finalizeImpl(); + finalized = true; + } + catch (...) + { + pos = working_buffer.begin(); + + cancel(); + + throw; + } +} } diff --git a/src/IO/WriteBuffer.h b/src/IO/WriteBuffer.h index 84b1079b824..5c1ef1e63e8 100644 --- a/src/IO/WriteBuffer.h +++ b/src/IO/WriteBuffer.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -16,6 +17,7 @@ namespace DB namespace ErrorCodes { extern const int CANNOT_WRITE_AFTER_END_OF_BUFFER; + extern const int CANNOT_WRITE_AFTER_BUFFER_CANCELED; extern const int LOGICAL_ERROR; } @@ -29,6 +31,13 @@ namespace ErrorCodes class WriteBuffer : public BufferBase { public: + /// Special exception to throw when the current MemoryWriteBuffer cannot receive data + class CurrentBufferExhausted : public std::exception + { + public: + const char * what() const noexcept override { return "WriteBuffer limit is exhausted"; } + }; + using BufferBase::set; using BufferBase::position; void set(Position ptr, size_t size) { BufferBase::set(ptr, size, 0); } @@ -43,6 +52,9 @@ public: */ void next() { + if (canceled) + return; + if (!offset()) return; @@ -52,6 +64,12 @@ public: { nextImpl(); } + catch (CurrentBufferExhausted &) + { + pos = working_buffer.begin(); + bytes += bytes_in_buffer; + throw; + } catch (...) { /** If the nextImpl() call was unsuccessful, move the cursor to the beginning, @@ -60,6 +78,8 @@ public: pos = working_buffer.begin(); bytes += bytes_in_buffer; + cancel(); + throw; } @@ -82,6 +102,9 @@ public: if (finalized) throw Exception{ErrorCodes::LOGICAL_ERROR, "Cannot write to finalized buffer"}; + if (canceled) + throw Exception{ErrorCodes::CANNOT_WRITE_AFTER_BUFFER_CANCELED, "Cannot write to canceled buffer"}; + size_t bytes_copied = 0; /// Produces endless loop @@ -102,6 +125,9 @@ public: if (finalized) throw Exception{ErrorCodes::LOGICAL_ERROR, "Cannot write to finalized buffer"}; + if (canceled) + throw Exception{ErrorCodes::LOGICAL_ERROR, "Cannot write to canceled buffer"}; + nextIfAtEnd(); *pos = x; ++pos; @@ -117,32 +143,12 @@ public: virtual void preFinalize() { next(); } /// Write the last data. - void finalize() - { - if (finalized) - return; - - if (canceled) - throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot finalize buffer after cancellation."); - - LockMemoryExceptionInThread lock(VariableContext::Global); - try - { - finalizeImpl(); - finalized = true; - } - catch (...) - { - pos = working_buffer.begin(); - - cancel(); - - throw; - } - } - + void finalize(); void cancel() noexcept; + bool isFinalized() const { return finalized; } + bool isCanceled() const { return canceled; } + /// Wait for data to be reliably written. Mainly, call fsync for fd. /// May be called after finalize() if needed. virtual void sync() @@ -150,17 +156,20 @@ public: next(); } + size_t rejectBufferedDataSave() + { + size_t before = count(); + bool data_has_been_sent = count() != offset(); + if (!data_has_been_sent) + position() -= offset(); + return before - count(); + } + protected: WriteBuffer(Position ptr, size_t size) : BufferBase(ptr, size, 0) {} - virtual void finalizeImpl() - { - next(); - } - - virtual void cancelImpl() noexcept - { - } + virtual void finalizeImpl() { next(); } + virtual void cancelImpl() noexcept { } bool finalized = false; bool canceled = false; @@ -178,6 +187,13 @@ private: { throw Exception(ErrorCodes::CANNOT_WRITE_AFTER_END_OF_BUFFER, "Cannot write after end of buffer."); } + + bool isStackUnwinding() const + { + return exception_level < std::uncaught_exceptions(); + } + + int exception_level = std::uncaught_exceptions(); }; @@ -201,4 +217,51 @@ private: } }; + +// AutoCanceledWriteBuffer cancel the buffer in d-tor when it has not been finalized before d-tor +// AutoCanceledWriteBuffer could not be inherited. +// Otherwise cancel method could not call proper cancelImpl ьуерщв because inheritor is destroyed already. +// But the ussage of final inheritance is avoided in favor to keep the possibility to use std::make_shared. +template +class AutoCanceledWriteBuffer final : public Base +{ + static_assert(std::derived_from); + +public: + using Base::Base; + + ~AutoCanceledWriteBuffer() override + { + if (!this->finalized && !this->canceled) + this->cancel(); + } +}; + + +/// That class is applied only in 2 folloving cases +// case 1 - HTTPServerResponse. The external interface HTTPResponse forces that. +// case 2 - WriteBufferFromVector, WriteBufferFromString. It is safe to make them autofinaliziable. +// AutoFinalizedWriteBuffer could not be inherited due to a restriction on polymorphics call in d-tor. +template +class AutoFinalizedWriteBuffer final : public Base +{ + static_assert(std::derived_from); + +public: + using Base::Base; + + ~AutoFinalizedWriteBuffer() override + { + try + { + if (!this->finalized && !this->canceled) + this->finalize(); + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } + } +}; + } diff --git a/src/IO/WriteBufferDecorator.h b/src/IO/WriteBufferDecorator.h index 109c2bd24e4..6bbb405e923 100644 --- a/src/IO/WriteBufferDecorator.h +++ b/src/IO/WriteBufferDecorator.h @@ -49,6 +49,7 @@ public: void cancelImpl() noexcept override { + Base::cancelImpl(); out->cancel(); } diff --git a/src/IO/WriteBufferFromFile.cpp b/src/IO/WriteBufferFromFile.cpp index 8739d99e8d5..be69782d9b9 100644 --- a/src/IO/WriteBufferFromFile.cpp +++ b/src/IO/WriteBufferFromFile.cpp @@ -81,17 +81,8 @@ WriteBufferFromFile::~WriteBufferFromFile() if (fd < 0) return; - try - { - if (!canceled) - finalize(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } + [[maybe_unused]] int err = ::close(fd); - [[maybe_unused]] int err = ::close(fd); /// Everything except for EBADF should be ignored in dtor, since all of /// others (EINTR/EIO/ENOSPC/EDQUOT) could be possible during writing to /// fd, and then write already failed and the error had been reported to @@ -106,7 +97,7 @@ void WriteBufferFromFile::finalizeImpl() if (fd < 0) return; - next(); + WriteBufferFromFileDescriptor::finalizeImpl(); } diff --git a/src/IO/WriteBufferFromFileDecorator.cpp b/src/IO/WriteBufferFromFileDecorator.cpp index b1e7d843d92..e9632436e91 100644 --- a/src/IO/WriteBufferFromFileDecorator.cpp +++ b/src/IO/WriteBufferFromFileDecorator.cpp @@ -22,6 +22,7 @@ void WriteBufferFromFileDecorator::finalizeImpl() if (!is_prefinalized) WriteBufferFromFileDecorator::preFinalize(); + WriteBufferFromFileBase::finalizeImpl(); { SwapHelper swap(*this, *impl); impl->finalize(); @@ -30,8 +31,12 @@ void WriteBufferFromFileDecorator::finalizeImpl() void WriteBufferFromFileDecorator::cancelImpl() noexcept { - SwapHelper swap(*this, *impl); - impl->cancel(); + WriteBufferFromFileBase::cancelImpl(); + + { + SwapHelper swap(*this, *impl); + impl->cancel(); + } } WriteBufferFromFileDecorator::~WriteBufferFromFileDecorator() diff --git a/src/IO/WriteBufferFromFileDescriptor.cpp b/src/IO/WriteBufferFromFileDescriptor.cpp index b60a792e11c..e067fa77aa1 100644 --- a/src/IO/WriteBufferFromFileDescriptor.cpp +++ b/src/IO/WriteBufferFromFileDescriptor.cpp @@ -113,30 +113,16 @@ WriteBufferFromFileDescriptor::WriteBufferFromFileDescriptor( { } - -WriteBufferFromFileDescriptor::~WriteBufferFromFileDescriptor() -{ - try - { - if (!canceled) - finalize(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } -} - void WriteBufferFromFileDescriptor::finalizeImpl() { if (fd < 0) { - assert(!offset() && "attempt to write after close"); + chassert(!offset(), "attempt to write after close"); return; } use_adaptive_buffer_size = false; - next(); + WriteBufferFromFileBase::finalizeImpl(); } void WriteBufferFromFileDescriptor::sync() diff --git a/src/IO/WriteBufferFromFileDescriptor.h b/src/IO/WriteBufferFromFileDescriptor.h index e893ecd80fb..01e22ab7320 100644 --- a/src/IO/WriteBufferFromFileDescriptor.h +++ b/src/IO/WriteBufferFromFileDescriptor.h @@ -30,8 +30,6 @@ public: fd = fd_; } - ~WriteBufferFromFileDescriptor() override; - int getFD() const { return fd; diff --git a/src/IO/WriteBufferFromHTTP.cpp b/src/IO/WriteBufferFromHTTP.cpp index 4505228eda6..cb2e8d778d2 100644 --- a/src/IO/WriteBufferFromHTTP.cpp +++ b/src/IO/WriteBufferFromHTTP.cpp @@ -47,6 +47,8 @@ void WriteBufferFromHTTP::finalizeImpl() receiveResponse(*session, request, response, false); /// TODO: Response body is ignored. + + WriteBufferFromOStream::finalizeImpl(); } } diff --git a/src/IO/WriteBufferFromPocoSocket.cpp b/src/IO/WriteBufferFromPocoSocket.cpp index 2bc07c5f104..9f4746fde70 100644 --- a/src/IO/WriteBufferFromPocoSocket.cpp +++ b/src/IO/WriteBufferFromPocoSocket.cpp @@ -196,17 +196,4 @@ WriteBufferFromPocoSocket::WriteBufferFromPocoSocket(Poco::Net::Socket & socket_ write_event = write_event_; } -WriteBufferFromPocoSocket::~WriteBufferFromPocoSocket() -{ - try - { - if (!canceled) - finalize(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } -} - } diff --git a/src/IO/WriteBufferFromPocoSocket.h b/src/IO/WriteBufferFromPocoSocket.h index 1f69dfc466c..4a3fb1792a3 100644 --- a/src/IO/WriteBufferFromPocoSocket.h +++ b/src/IO/WriteBufferFromPocoSocket.h @@ -19,8 +19,6 @@ public: explicit WriteBufferFromPocoSocket(Poco::Net::Socket & socket_, size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE); explicit WriteBufferFromPocoSocket(Poco::Net::Socket & socket_, const ProfileEvents::Event & write_event_, size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE); - ~WriteBufferFromPocoSocket() override; - void setAsyncCallback(AsyncCallback async_callback_) { async_callback = std::move(async_callback_); } using WriteBuffer::write; diff --git a/src/IO/WriteBufferFromPocoSocketChunked.cpp b/src/IO/WriteBufferFromPocoSocketChunked.cpp index 9da46ee2d10..89a6b13b382 100644 --- a/src/IO/WriteBufferFromPocoSocketChunked.cpp +++ b/src/IO/WriteBufferFromPocoSocketChunked.cpp @@ -26,7 +26,8 @@ WriteBufferFromPocoSocketChunked::WriteBufferFromPocoSocketChunked(Poco::Net::So socket_, write_event_, std::clamp(buf_size, sizeof(*chunk_size_ptr) + 1, static_cast(std::numeric_limits>::max()))), log(getLogger("Protocol")) -{} +{ +} void WriteBufferFromPocoSocketChunked::enableChunked() { @@ -108,18 +109,6 @@ void WriteBufferFromPocoSocketChunked::finishChunk() last_finish_chunk = chunk_size_ptr; } -WriteBufferFromPocoSocketChunked::~WriteBufferFromPocoSocketChunked() -{ - try - { - finalize(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } -} - void WriteBufferFromPocoSocketChunked::nextImpl() { if (!chunked) @@ -186,7 +175,7 @@ void WriteBufferFromPocoSocketChunked::nextImpl() LOG_TEST(log, "{} -> {} Chunk send started. Message {}, size {}", ourAddress().toString(), peerAddress().toString(), static_cast(*(reinterpret_cast(chunk_size_ptr) + sizeof(*chunk_size_ptr))), - *chunk_size_ptr); + *chunk_size_ptr); } else LOG_TEST(log, "{} -> {} Chunk send continued. Size {}", ourAddress().toString(), peerAddress().toString(), *chunk_size_ptr); diff --git a/src/IO/WriteBufferFromPocoSocketChunked.h b/src/IO/WriteBufferFromPocoSocketChunked.h index 13a277e3bfb..540f63f869b 100644 --- a/src/IO/WriteBufferFromPocoSocketChunked.h +++ b/src/IO/WriteBufferFromPocoSocketChunked.h @@ -16,7 +16,6 @@ public: void enableChunked(); void finishChunk(); - ~WriteBufferFromPocoSocketChunked() override; protected: void nextImpl() override; diff --git a/src/IO/WriteBufferFromS3.cpp b/src/IO/WriteBufferFromS3.cpp index ca3cc1a2dd2..1648888b08a 100644 --- a/src/IO/WriteBufferFromS3.cpp +++ b/src/IO/WriteBufferFromS3.cpp @@ -209,6 +209,8 @@ void WriteBufferFromS3::finalizeImpl() LOG_TRACE(limited_log, "finalizeImpl WriteBufferFromS3. {}.", getShortLogDetails()); + WriteBufferFromFileBase::finalizeImpl(); + if (!is_prefinalized) preFinalize(); @@ -240,6 +242,7 @@ void WriteBufferFromS3::finalizeImpl() void WriteBufferFromS3::cancelImpl() noexcept { + WriteBufferFromFileBase::cancelImpl(); tryToAbortMultipartUpload(); } @@ -274,7 +277,7 @@ void WriteBufferFromS3::tryToAbortMultipartUpload() noexcept } catch (...) { - LOG_ERROR(log, "Multipart upload hasn't aborted. {}", getVerboseLogDetails()); + LOG_ERROR(log, "Multipart upload hasn't been aborted. {}", getVerboseLogDetails()); tryLogCurrentException(__PRETTY_FUNCTION__); } } @@ -454,11 +457,11 @@ void WriteBufferFromS3::abortMultipartUpload() { if (multipart_upload_id.empty()) { - LOG_WARNING(log, "Nothing to abort. {}", getVerboseLogDetails()); + LOG_INFO(log, "Nothing to abort. {}", getVerboseLogDetails()); return; } - LOG_WARNING(log, "Abort multipart upload. {}", getVerboseLogDetails()); + LOG_INFO(log, "Abort multipart upload. {}", getVerboseLogDetails()); S3::AbortMultipartUploadRequest req; req.SetBucket(bucket); @@ -485,7 +488,7 @@ void WriteBufferFromS3::abortMultipartUpload() throw S3Exception(outcome.GetError().GetMessage(), outcome.GetError().GetErrorType()); } - LOG_WARNING(log, "Multipart upload has aborted successfully. {}", getVerboseLogDetails()); + LOG_INFO(log, "Multipart upload has been aborted successfully. {}", getVerboseLogDetails()); } S3::UploadPartRequest WriteBufferFromS3::getUploadRequest(size_t part_number, PartData & data) diff --git a/src/IO/WriteBufferFromString.h b/src/IO/WriteBufferFromString.h index 1f813b1070e..399f1356e49 100644 --- a/src/IO/WriteBufferFromString.h +++ b/src/IO/WriteBufferFromString.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -9,9 +10,9 @@ namespace DB { /** Writes the data to a string. - * Note: before using the resulting string, destroy this object. + * Note: before using the resulting string, destroy this object or call finalize. */ -using WriteBufferFromString = WriteBufferFromVector; +using WriteBufferFromString = AutoFinalizedWriteBuffer>; namespace detail @@ -25,12 +26,13 @@ namespace detail } /// Creates the string by itself and allows to get it. -class WriteBufferFromOwnString : public detail::StringHolder, public WriteBufferFromString +class WriteBufferFromOwnStringImpl : public detail::StringHolder, public WriteBufferFromVectorImpl { + using Base = WriteBufferFromVectorImpl; public: - WriteBufferFromOwnString() : WriteBufferFromString(value) {} + WriteBufferFromOwnStringImpl() : Base(value) {} - std::string_view stringView() const { return isFinished() ? std::string_view(value) : std::string_view(value.data(), pos - value.data()); } + std::string_view stringView() const { return isFinalized() ? std::string_view(value) : std::string_view(value.data(), pos - value.data()); } std::string & str() { @@ -39,4 +41,6 @@ public: } }; +using WriteBufferFromOwnString = AutoFinalizedWriteBuffer; + } diff --git a/src/IO/WriteBufferFromVector.h b/src/IO/WriteBufferFromVector.h index 17a329d401d..587f3856733 100644 --- a/src/IO/WriteBufferFromVector.h +++ b/src/IO/WriteBufferFromVector.h @@ -23,11 +23,11 @@ struct AppendModeTag {}; * The vector should live until this object is destroyed or until the 'finalizeImpl()' method is called. */ template -class WriteBufferFromVector : public WriteBuffer +class WriteBufferFromVectorImpl : public WriteBuffer { public: using ValueType = typename VectorType::value_type; - explicit WriteBufferFromVector(VectorType & vector_) + explicit WriteBufferFromVectorImpl(VectorType & vector_) : WriteBuffer(reinterpret_cast(vector_.data()), vector_.size()), vector(vector_) { if (vector.empty()) @@ -38,7 +38,7 @@ public: } /// Append to vector instead of rewrite. - WriteBufferFromVector(VectorType & vector_, AppendModeTag) + WriteBufferFromVectorImpl(VectorType & vector_, AppendModeTag) : WriteBuffer(nullptr, 0), vector(vector_) { size_t old_size = vector.size(); @@ -49,8 +49,6 @@ public: set(reinterpret_cast(vector.data() + old_size), (size - old_size) * sizeof(typename VectorType::value_type)); } - bool isFinished() const { return finalized; } - void restart(std::optional max_capacity = std::nullopt) { if (max_capacity && vector.capacity() > max_capacity) @@ -59,12 +57,7 @@ public: vector.resize(initial_size); set(reinterpret_cast(vector.data()), vector.size()); finalized = false; - } - - ~WriteBufferFromVector() override - { - if (!canceled) - finalize(); + canceled = false; } private: @@ -101,4 +94,7 @@ private: static constexpr size_t size_multiplier = 2; }; +template +using WriteBufferFromVector = AutoFinalizedWriteBuffer>; + } diff --git a/src/IO/WriteBufferValidUTF8.cpp b/src/IO/WriteBufferValidUTF8.cpp index 2a86f8c2801..f245f879767 100644 --- a/src/IO/WriteBufferValidUTF8.cpp +++ b/src/IO/WriteBufferValidUTF8.cpp @@ -141,7 +141,8 @@ void WriteBufferValidUTF8::nextImpl() WriteBufferValidUTF8::~WriteBufferValidUTF8() { - finalize(); + if (!canceled) + finalize(); } void WriteBufferValidUTF8::finalizeImpl() diff --git a/src/IO/ZstdDeflatingAppendableWriteBuffer.cpp b/src/IO/ZstdDeflatingAppendableWriteBuffer.cpp index 28486341540..cfbe33beb31 100644 --- a/src/IO/ZstdDeflatingAppendableWriteBuffer.cpp +++ b/src/IO/ZstdDeflatingAppendableWriteBuffer.cpp @@ -88,11 +88,6 @@ void ZstdDeflatingAppendableWriteBuffer::nextImpl() } -ZstdDeflatingAppendableWriteBuffer::~ZstdDeflatingAppendableWriteBuffer() -{ - finalize(); -} - void ZstdDeflatingAppendableWriteBuffer::finalizeImpl() { if (first_write) @@ -103,18 +98,9 @@ void ZstdDeflatingAppendableWriteBuffer::finalizeImpl() } else { - try - { - finalizeBefore(); - out->finalize(); - finalizeAfter(); - } - catch (...) - { - /// Do not try to flush next time after exception. - out->position() = out->buffer().begin(); - throw; - } + finalizeBefore(); + out->finalize(); + finalizeAfter(); } } @@ -165,6 +151,9 @@ void ZstdDeflatingAppendableWriteBuffer::finalizeAfter() void ZstdDeflatingAppendableWriteBuffer::finalizeZstd() { + if (!cctx) + return; + try { size_t err = ZSTD_freeCCtx(cctx); @@ -179,6 +168,8 @@ void ZstdDeflatingAppendableWriteBuffer::finalizeZstd() /// since all data already written to the stream. tryLogCurrentException(__PRETTY_FUNCTION__); } + + cctx = nullptr; } void ZstdDeflatingAppendableWriteBuffer::addEmptyBlock() @@ -221,4 +212,13 @@ bool ZstdDeflatingAppendableWriteBuffer::isNeedToAddEmptyBlock() return false; } +void ZstdDeflatingAppendableWriteBuffer::cancelImpl() noexcept +{ + BufferWithOwnMemory::cancelImpl(); + + out->cancel(); + + /// To free cctx + finalizeZstd(); +} } diff --git a/src/IO/ZstdDeflatingAppendableWriteBuffer.h b/src/IO/ZstdDeflatingAppendableWriteBuffer.h index 34cdf03df25..3cb262cd5c3 100644 --- a/src/IO/ZstdDeflatingAppendableWriteBuffer.h +++ b/src/IO/ZstdDeflatingAppendableWriteBuffer.h @@ -38,8 +38,6 @@ public: char * existing_memory = nullptr, size_t alignment = 0); - ~ZstdDeflatingAppendableWriteBuffer() override; - void sync() override { next(); @@ -63,6 +61,8 @@ private: void finalizeAfter(); void finalizeZstd(); + void cancelImpl() noexcept override; + /// Read three last bytes from non-empty compressed file and compares them with /// ZSTD_CORRECT_TERMINATION_LAST_BLOCK. bool isNeedToAddEmptyBlock(); diff --git a/src/IO/examples/io_operators.cpp b/src/IO/examples/io_operators.cpp index fd84f382c24..5993f8e3ac8 100644 --- a/src/IO/examples/io_operators.cpp +++ b/src/IO/examples/io_operators.cpp @@ -17,6 +17,7 @@ int main(int, char **) << LocalDate(time(nullptr)) << '\n' << 1234567890123456789UL << '\n' << DB::flush; + buf.finalize(); } { @@ -35,6 +36,7 @@ int main(int, char **) DB::WriteBufferFromFileDescriptor buf(STDOUT_FILENO); size_t x = 11; buf << "Column " << x << ", \n"; + buf.finalize(); } return 0; diff --git a/src/IO/examples/limit_read_buffer.cpp b/src/IO/examples/limit_read_buffer.cpp index 9c57c175620..d3884d90d60 100644 --- a/src/IO/examples/limit_read_buffer.cpp +++ b/src/IO/examples/limit_read_buffer.cpp @@ -24,18 +24,20 @@ int main(int argc, char ** argv) writeCString("--- first ---\n", out); { - LimitReadBuffer limit_in(in, limit, /* trow_exception */ false, /* exact_limit */ {}); + LimitReadBuffer limit_in(in, {.read_no_more=limit}); copyData(limit_in, out); } writeCString("\n--- second ---\n", out); { - LimitReadBuffer limit_in(in, limit, /* trow_exception */ false, /* exact_limit */ {}); + LimitReadBuffer limit_in(in,{.read_no_more=limit}); copyData(limit_in, out); } writeCString("\n--- the rest ---\n", out); copyData(in, out); + out.finalize(); + return 0; } diff --git a/src/IO/examples/limit_read_buffer2.cpp b/src/IO/examples/limit_read_buffer2.cpp index a0369047d3a..2bdf0b6e687 100644 --- a/src/IO/examples/limit_read_buffer2.cpp +++ b/src/IO/examples/limit_read_buffer2.cpp @@ -27,7 +27,7 @@ try ReadBuffer in(src.data(), src.size(), 0); - LimitReadBuffer limit_in(in, 1, /* trow_exception */ false, /* exact_limit */ {}); + auto limit_in = LimitReadBuffer(in, {.read_no_more = 1}); { WriteBufferFromString out(dst); @@ -55,7 +55,7 @@ try char x; readChar(x, in); - LimitReadBuffer limit_in(in, 1, /* trow_exception */ false, /* exact_limit */ {}); + auto limit_in = LimitReadBuffer(in, {.read_no_more = 1}); copyData(limit_in, out); @@ -85,7 +85,7 @@ try ReadBuffer in(src.data(), src.size(), 0); { - LimitReadBuffer limit_in(in, 1, /* trow_exception */ false, /* exact_limit */ {}); + auto limit_in = LimitReadBuffer(in, {.read_no_more = 1}); char x; readChar(x, limit_in); diff --git a/src/IO/examples/parse_date_time_best_effort.cpp b/src/IO/examples/parse_date_time_best_effort.cpp index fc5755f1f95..2c237b97089 100644 --- a/src/IO/examples/parse_date_time_best_effort.cpp +++ b/src/IO/examples/parse_date_time_best_effort.cpp @@ -23,6 +23,8 @@ try writeDateTimeText(res, out); writeChar('\n', out); + out.finalize(); + return 0; } catch (const Exception &) diff --git a/src/IO/examples/parse_int_perf.cpp b/src/IO/examples/parse_int_perf.cpp index a980cba8896..ac2bd9c4564 100644 --- a/src/IO/examples/parse_int_perf.cpp +++ b/src/IO/examples/parse_int_perf.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -62,8 +63,7 @@ int main(int argc, char ** argv) formatted.reserve(n * 21); { - DB::WriteBufferFromVector wb(formatted); - // DB::CompressedWriteBuffer wb2(wb1); + auto wb = DB::WriteBufferFromVector>(formatted); Stopwatch watch; UInt64 tsc = rdtsc(); @@ -92,7 +92,6 @@ int main(int argc, char ** argv) { DB::ReadBuffer rb(formatted.data(), formatted.size(), 0); - // DB::CompressedReadBuffer rb(rb_); Stopwatch watch; for (size_t i = 0; i < n; ++i) diff --git a/src/IO/examples/read_float_perf.cpp b/src/IO/examples/read_float_perf.cpp index 03e3810bdd0..22494c30f04 100644 --- a/src/IO/examples/read_float_perf.cpp +++ b/src/IO/examples/read_float_perf.cpp @@ -75,6 +75,8 @@ try if (method == 2) loop(in, out); if (method == 3) loop(in, out); + out.finalize(); + return 0; } catch (const Exception & e) diff --git a/src/IO/examples/write_int.cpp b/src/IO/examples/write_int.cpp index c1d02c93922..6ebb3014c4c 100644 --- a/src/IO/examples/write_int.cpp +++ b/src/IO/examples/write_int.cpp @@ -24,5 +24,7 @@ int main(int, char **) { WriteBufferFromFileDescriptor out(STDOUT_FILENO); write(out, 80); + out.finalize(); + return 0; } diff --git a/src/IO/tests/gtest_hadoop_snappy_decoder.cpp b/src/IO/tests/gtest_hadoop_snappy_decoder.cpp index 2847c730735..03ecbb7cf3b 100644 --- a/src/IO/tests/gtest_hadoop_snappy_decoder.cpp +++ b/src/IO/tests/gtest_hadoop_snappy_decoder.cpp @@ -58,9 +58,10 @@ TEST(HadoopSnappyDecoder, repeatNeedMoreInput) std::unique_ptr in = std::make_unique("./test.snappy", 128); HadoopSnappyReadBuffer read_buffer(std::move(in)); String output; - WriteBufferFromString out(output); - copyData(read_buffer, out); - out.finalize(); + { + WriteBufferFromString out(output); + copyData(read_buffer, out); + } UInt128 hashcode = sipHash128(output.c_str(), output.size()); String hashcode_str = getHexUIntLowercase(hashcode); ASSERT_EQ(hashcode_str, "673e5b065186cec146789451c2a8f703"); diff --git a/src/IO/tests/gtest_seek_backwards.cpp b/src/IO/tests/gtest_seek_backwards.cpp index 93aab68936f..4102920953f 100644 --- a/src/IO/tests/gtest_seek_backwards.cpp +++ b/src/IO/tests/gtest_seek_backwards.cpp @@ -18,6 +18,7 @@ TEST(ReadBufferFromFile, seekBackwards) WriteBufferFromFile out(tmp_file->path()); for (size_t i = 0; i < N; ++i) writeIntBinary(i, out); + out.finalize(); } ReadBufferFromFile in(tmp_file->path(), BUF_SIZE); diff --git a/src/Interpreters/Access/InterpreterCheckGrantQuery.cpp b/src/Interpreters/Access/InterpreterCheckGrantQuery.cpp new file mode 100644 index 00000000000..3410d201e17 --- /dev/null +++ b/src/Interpreters/Access/InterpreterCheckGrantQuery.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Storages/IStorage.h" + +namespace DB +{ + +BlockIO InterpreterCheckGrantQuery::execute() +{ + auto & query = query_ptr->as(); + query.access_rights_elements.eraseNonGrantable(); + + auto current_user_access = getContext()->getAccess(); + + /// Collect access rights elements which will be checked. + AccessRightsElements & elements_to_check_grant = query.access_rights_elements; + + /// Replacing empty database with the default. This step must be done before replication to avoid privilege escalation. + String current_database = getContext()->getCurrentDatabase(); + elements_to_check_grant.replaceEmptyDatabase(current_database); + query.access_rights_elements.replaceEmptyDatabase(current_database); + bool user_is_granted = current_user_access->isGranted(elements_to_check_grant); + BlockIO res; + res.pipeline = QueryPipeline( + std::make_shared(Block{{ColumnUInt8::create(1, user_is_granted), std::make_shared(), "result"}})); + return res; +} + +void registerInterpreterCheckGrantQuery(InterpreterFactory & factory) +{ + auto create_fn = [] (const InterpreterFactory::Arguments & args) + { + return std::make_unique(args.query, args.context); + }; + factory.registerInterpreter("InterpreterCheckGrantQuery", create_fn); +} + +} diff --git a/src/Interpreters/Access/InterpreterCheckGrantQuery.h b/src/Interpreters/Access/InterpreterCheckGrantQuery.h new file mode 100644 index 00000000000..e79d6925c93 --- /dev/null +++ b/src/Interpreters/Access/InterpreterCheckGrantQuery.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + + +namespace DB +{ + +class ASTCheckGrantQuery; +struct User; +struct Role; + +class InterpreterCheckGrantQuery : public IInterpreter, WithMutableContext +{ +public: + InterpreterCheckGrantQuery(const ASTPtr & query_ptr_, ContextMutablePtr context_) : WithMutableContext(context_), query_ptr(query_ptr_) {} + + BlockIO execute() override; + +private: + ASTPtr query_ptr; +}; + +} diff --git a/src/Interpreters/Aggregator.h b/src/Interpreters/Aggregator.h index eec64c171a6..6bf78ba7433 100644 --- a/src/Interpreters/Aggregator.h +++ b/src/Interpreters/Aggregator.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include diff --git a/src/Interpreters/AsynchronousInsertQueue.cpp b/src/Interpreters/AsynchronousInsertQueue.cpp index 1a2efa2461f..ceda7adbcd4 100644 --- a/src/Interpreters/AsynchronousInsertQueue.cpp +++ b/src/Interpreters/AsynchronousInsertQueue.cpp @@ -381,17 +381,15 @@ AsynchronousInsertQueue::pushQueryWithInlinedData(ASTPtr query, ContextPtr query LimitReadBuffer limit_buf( *read_buf, - query_context->getSettingsRef()[Setting::async_insert_max_data_size], - /*throw_exception=*/false, - /*exact_limit=*/{}); + {.read_no_more = query_context->getSettingsRef()[Setting::async_insert_max_data_size]}); - WriteBufferFromString write_buf(bytes); - copyData(limit_buf, write_buf); + { + WriteBufferFromString write_buf(bytes); + copyData(limit_buf, write_buf); + } if (!read_buf->eof()) { - write_buf.finalize(); - /// Concat read buffer with already extracted from insert /// query data and with the rest data from insert query. std::vector> buffers; diff --git a/src/Interpreters/Cache/FileCache.cpp b/src/Interpreters/Cache/FileCache.cpp index 8887165a75d..a8900d5eebb 100644 --- a/src/Interpreters/Cache/FileCache.cpp +++ b/src/Interpreters/Cache/FileCache.cpp @@ -584,7 +584,8 @@ FileCache::getOrSet( size_t file_size, const CreateFileSegmentSettings & create_settings, size_t file_segments_limit, - const UserInfo & user) + const UserInfo & user, + std::optional boundary_alignment_) { ProfileEventTimeIncrement watch(ProfileEvents::FilesystemCacheGetOrSetMicroseconds); @@ -596,8 +597,9 @@ FileCache::getOrSet( /// 2. max_file_segments_limit FileSegment::Range result_range = initial_range; - const auto aligned_offset = FileCacheUtils::roundDownToMultiple(initial_range.left, boundary_alignment); - auto aligned_end_offset = std::min(FileCacheUtils::roundUpToMultiple(initial_range.right + 1, boundary_alignment), file_size) - 1; + const size_t alignment = boundary_alignment_.value_or(boundary_alignment); + const auto aligned_offset = FileCacheUtils::roundDownToMultiple(initial_range.left, alignment); + auto aligned_end_offset = std::min(FileCacheUtils::roundUpToMultiple(initial_range.right + 1, alignment), file_size) - 1; chassert(aligned_offset <= initial_range.left); chassert(aligned_end_offset >= initial_range.right); diff --git a/src/Interpreters/Cache/FileCache.h b/src/Interpreters/Cache/FileCache.h index bbe8502fec9..bece146b158 100644 --- a/src/Interpreters/Cache/FileCache.h +++ b/src/Interpreters/Cache/FileCache.h @@ -113,7 +113,8 @@ public: size_t file_size, const CreateFileSegmentSettings & settings, size_t file_segments_limit, - const UserInfo & user); + const UserInfo & user, + std::optional boundary_alignment_ = std::nullopt); /** * Segments in returned list are ordered in ascending order and represent a full contiguous diff --git a/src/Interpreters/Cache/FileCacheUtils.h b/src/Interpreters/Cache/FileCacheUtils.h index b35ce867a79..5b0aa549b24 100644 --- a/src/Interpreters/Cache/FileCacheUtils.h +++ b/src/Interpreters/Cache/FileCacheUtils.h @@ -6,11 +6,15 @@ namespace FileCacheUtils static size_t roundDownToMultiple(size_t num, size_t multiple) { + if (!multiple) + return num; return (num / multiple) * multiple; } static size_t roundUpToMultiple(size_t num, size_t multiple) { + if (!multiple) + return num; return roundDownToMultiple(num + multiple - 1, multiple); } diff --git a/src/Interpreters/Cache/FileSegment.cpp b/src/Interpreters/Cache/FileSegment.cpp index 74148aa5461..05fe2713576 100644 --- a/src/Interpreters/Cache/FileSegment.cpp +++ b/src/Interpreters/Cache/FileSegment.cpp @@ -617,7 +617,7 @@ void FileSegment::setDownloadFailedUnlocked(const FileSegmentGuard::Lock & lock) if (cache_writer) { - cache_writer->finalize(); + cache_writer->cancel(); cache_writer.reset(); } @@ -1033,15 +1033,10 @@ void FileSegment::setDetachedState(const FileSegmentGuard::Lock & lock) setDownloadState(State::DETACHED, lock); key_metadata.reset(); queue_iterator = nullptr; - try - { - cache_writer.reset(); - remote_file_reader.reset(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } + if (cache_writer) + cache_writer->cancel(); + cache_writer.reset(); + remote_file_reader.reset(); } void FileSegment::detach(const FileSegmentGuard::Lock & lock, const LockedKey &) diff --git a/src/Interpreters/Context.cpp b/src/Interpreters/Context.cpp index 15b4ca29996..ce788842e3e 100644 --- a/src/Interpreters/Context.cpp +++ b/src/Interpreters/Context.cpp @@ -1493,7 +1493,7 @@ ConfigurationPtr Context::getUsersConfig() return shared->users_config; } -void Context::setUser(const UUID & user_id_) +void Context::setUser(const UUID & user_id_, const std::vector & external_roles_) { /// Prepare lists of user's profiles, constraints, settings, roles. /// NOTE: AccessControl::read() and other AccessControl's functions may require some IO work, @@ -1508,7 +1508,6 @@ void Context::setUser(const UUID & user_id_) const auto & database = user->default_database; /// Apply user's profiles, constraints, settings, roles. - std::lock_guard lock(mutex); setUserIDWithLock(user_id_, lock); @@ -1518,6 +1517,7 @@ void Context::setUser(const UUID & user_id_) setCurrentProfilesWithLock(*enabled_profiles, /* check_constraints= */ false, lock); setCurrentRolesWithLock(default_roles, lock); + setExternalRolesWithLock(external_roles_, lock); /// It's optional to specify the DEFAULT DATABASE in the user's definition. if (!database.empty()) @@ -1561,6 +1561,18 @@ void Context::setCurrentRolesWithLock(const std::vector & new_current_role need_recalculate_access = true; } +void Context::setExternalRolesWithLock(const std::vector & new_external_roles, const std::lock_guard &) +{ + if (!new_external_roles.empty()) + { + if (current_roles) + current_roles->insert(current_roles->end(), new_external_roles.begin(), new_external_roles.end()); + else + current_roles = std::make_shared>(new_external_roles); + need_recalculate_access = true; + } +} + void Context::setCurrentRolesImpl(const std::vector & new_current_roles, bool throw_if_not_granted, bool skip_if_not_granted, const std::shared_ptr & user) { if (skip_if_not_granted) @@ -1675,7 +1687,7 @@ std::shared_ptr Context::getAccess() const bool full_access = !user_id; return ContextAccessParams{ - user_id, full_access, /* use_default_roles= */ false, current_roles, *settings, current_database, client_info}; + user_id, full_access, /* use_default_roles= */ false, current_roles, external_roles, *settings, current_database, client_info}; }; /// Check if the current access rights are still valid, otherwise get parameters for recalculating access rights. diff --git a/src/Interpreters/Context.h b/src/Interpreters/Context.h index e8ccc31f597..327ac0af5fd 100644 --- a/src/Interpreters/Context.h +++ b/src/Interpreters/Context.h @@ -289,6 +289,7 @@ protected: std::optional user_id; std::shared_ptr> current_roles; + std::shared_ptr> external_roles; std::shared_ptr settings_constraints_and_current_profiles; mutable std::shared_ptr access; mutable bool need_recalculate_access = true; @@ -634,7 +635,7 @@ public: /// Sets the current user assuming that he/she is already authenticated. /// WARNING: This function doesn't check password! - void setUser(const UUID & user_id_); + void setUser(const UUID & user_id_, const std::vector & external_roles_ = {}); UserPtr getUser() const; std::optional getUserID() const; @@ -1398,6 +1399,8 @@ private: void setCurrentRolesWithLock(const std::vector & new_current_roles, const std::lock_guard & lock); + void setExternalRolesWithLock(const std::vector & new_external_roles, const std::lock_guard & lock); + void setSettingWithLock(std::string_view name, const String & value, const std::lock_guard & lock); void setSettingWithLock(std::string_view name, const Field & value, const std::lock_guard & lock); diff --git a/src/Interpreters/DDLWorker.cpp b/src/Interpreters/DDLWorker.cpp index eaba46f5d48..3079e9eaa8b 100644 --- a/src/Interpreters/DDLWorker.cpp +++ b/src/Interpreters/DDLWorker.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -484,8 +485,6 @@ bool DDLWorker::tryExecuteQuery(DDLTaskBase & task, const ZooKeeperPtr & zookeep String query_to_show_in_logs = query_prefix + task.query_for_logging; ReadBufferFromString istr(query_to_execute); - String dummy_string; - WriteBufferFromString ostr(dummy_string); std::optional query_scope; try @@ -505,7 +504,8 @@ bool DDLWorker::tryExecuteQuery(DDLTaskBase & task, const ZooKeeperPtr & zookeep if (!task.is_initial_query) query_scope.emplace(query_context); - executeQuery(istr, ostr, !task.is_initial_query, query_context, {}, QueryFlags{ .internal = false, .distributed_backup_restore = task.entry.is_backup_restore }); + NullWriteBuffer nullwb; + executeQuery(istr, nullwb, !task.is_initial_query, query_context, {}, QueryFlags{ .internal = false, .distributed_backup_restore = task.entry.is_backup_restore }); if (auto txn = query_context->getZooKeeperMetadataTransaction()) { diff --git a/src/Interpreters/InterpreterExplainQuery.cpp b/src/Interpreters/InterpreterExplainQuery.cpp index 2841d042cdc..763d8201dff 100644 --- a/src/Interpreters/InterpreterExplainQuery.cpp +++ b/src/Interpreters/InterpreterExplainQuery.cpp @@ -547,6 +547,8 @@ QueryPipeline InterpreterExplainQuery::executeImpl() /* async_isnert */ false); auto io = insert.execute(); printPipeline(io.pipeline.getProcessors(), buf); + // we do not need it anymore, it would be executed + io.pipeline.cancel(); } else throw Exception(ErrorCodes::INCORRECT_QUERY, "Only SELECT and INSERT is supported for EXPLAIN PIPELINE query"); @@ -617,6 +619,7 @@ QueryPipeline InterpreterExplainQuery::executeImpl() break; } } + buf.finalize(); if (insert_buf) { if (single_line) diff --git a/src/Interpreters/InterpreterFactory.cpp b/src/Interpreters/InterpreterFactory.cpp index 729a7b86312..98ba40770a6 100644 --- a/src/Interpreters/InterpreterFactory.cpp +++ b/src/Interpreters/InterpreterFactory.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -308,6 +309,10 @@ InterpreterFactory::InterpreterPtr InterpreterFactory::get(ASTPtr & query, Conte { interpreter_name = "InterpreterShowGrantsQuery"; } + else if (query->as()) + { + interpreter_name = "InterpreterCheckGrantQuery"; + } else if (query->as()) { interpreter_name = "InterpreterShowAccessEntitiesQuery"; diff --git a/src/Interpreters/ProcessList.h b/src/Interpreters/ProcessList.h index f171fe8f4d4..d721cc6a008 100644 --- a/src/Interpreters/ProcessList.h +++ b/src/Interpreters/ProcessList.h @@ -239,7 +239,6 @@ public: /// Returns an entry in the ProcessList associated with this QueryStatus. The function can return nullptr. std::shared_ptr getProcessListEntry() const; - bool isAllDataSent() const { return is_all_data_sent; } void setAllDataSent() { is_all_data_sent = true; } /// Adds a pipeline to the QueryStatus diff --git a/src/Interpreters/ProfileEventsExt.cpp b/src/Interpreters/ProfileEventsExt.cpp index dd8306066e7..9e47713125b 100644 --- a/src/Interpreters/ProfileEventsExt.cpp +++ b/src/Interpreters/ProfileEventsExt.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -98,11 +99,7 @@ static void dumpMemoryTracker(ProfileEventsSnapshot const & snapshot, DB::Mutabl columns[i]->insert(snapshot.peak_memory_usage); } -void getProfileEvents( - const String & host_name, - DB::InternalProfileEventsQueuePtr profile_queue, - DB::Block & block, - ThreadIdToCountersSnapshot & last_sent_snapshots) +DB::Block getSampleBlock() { using namespace DB; static const NamesAndTypesList column_names_and_types = { @@ -118,8 +115,16 @@ void getProfileEvents( for (auto const & name_and_type : column_names_and_types) temp_columns.emplace_back(name_and_type.type, name_and_type.name); - block = std::move(temp_columns); - MutableColumns columns = block.mutateColumns(); + return Block(std::move(temp_columns)); +} + +DB::Block getProfileEvents( + const String & host_name, + DB::InternalProfileEventsQueuePtr profile_queue, + ThreadIdToCountersSnapshot & last_sent_snapshots) +{ + using namespace DB; + auto thread_group = CurrentThread::getGroup(); ThreadIdToCountersSnapshot new_snapshots; @@ -139,6 +144,9 @@ void getProfileEvents( } last_sent_snapshots = std::move(new_snapshots); + auto block = getSampleBlock(); + MutableColumns columns = block.mutateColumns(); + dumpProfileEvents(group_snapshot, columns, host_name); dumpMemoryTracker(group_snapshot, columns, host_name); @@ -154,6 +162,8 @@ void getProfileEvents( bool empty = columns[0]->empty(); if (!empty) block.setColumns(std::move(columns)); + + return block; } } diff --git a/src/Interpreters/ProfileEventsExt.h b/src/Interpreters/ProfileEventsExt.h index 9099e6902ec..bdbd2cfe1e7 100644 --- a/src/Interpreters/ProfileEventsExt.h +++ b/src/Interpreters/ProfileEventsExt.h @@ -25,10 +25,11 @@ using ThreadIdToCountersSnapshot = std::unordered_mapschedule(); } @@ -229,15 +226,13 @@ void QueryMetricLogStatus::scheduleNext(String query_id) std::optional QueryMetricLogStatus::createLogMetricElement(const String & query_id, const QueryStatusInfo & query_info, TimePoint query_info_time, bool schedule_next) { - /// TODO: remove trace before 24.11 release after checking everything is fine on the CI - LOG_TRACE(logger, "Collecting query_metric_log for query {} and interval {} ms with QueryStatusInfo from {}. Next collection time: {}", + LOG_TEST(logger, "Collecting query_metric_log for query {} and interval {} ms with QueryStatusInfo from {}. Next collection time: {}", query_id, info.interval_milliseconds, timePointToString(query_info_time), schedule_next ? timePointToString(info.next_collect_time + std::chrono::milliseconds(info.interval_milliseconds)) : "finished"); if (query_info_time <= info.last_collect_time) { - /// TODO: remove trace before 24.11 release after checking everything is fine on the CI - LOG_TRACE(logger, "Query {} has a more recent metrics collected. Skipping this one", query_id); + LOG_TEST(logger, "Query {} has a more recent metrics collected. Skipping this one", query_id); return {}; } @@ -271,8 +266,7 @@ std::optional QueryMetricLogStatus::createLogMetricElemen } else { - /// TODO: remove trace before 24.11 release after checking everything is fine on the CI - LOG_DEBUG(logger, "Query {} has no profile counters", query_id); + LOG_TEST(logger, "Query {} has no profile counters", query_id); elem.profile_events = std::vector(ProfileEvents::end()); } diff --git a/src/Interpreters/Session.cpp b/src/Interpreters/Session.cpp index bc6555af595..60a5b0a850f 100644 --- a/src/Interpreters/Session.cpp +++ b/src/Interpreters/Session.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -25,12 +27,12 @@ #include #include - namespace DB { namespace Setting { extern const SettingsUInt64 max_sessions_for_user; + extern const SettingsBool push_external_roles_in_interserver_queries; } namespace ErrorCodes @@ -288,7 +290,7 @@ void Session::shutdownNamedSessions() Session::Session(const ContextPtr & global_context_, ClientInfo::Interface interface_, bool is_secure, const std::string & certificate) : auth_id(UUIDHelpers::generateV4()), global_context(global_context_), - log(getLogger(String{magic_enum::enum_name(interface_)} + "-Session")) + log(getLogger(String{magic_enum::enum_name(interface_)} + "-Session-" + toString(auth_id))) { prepared_client_info.emplace(); prepared_client_info->interface = interface_; @@ -342,12 +344,12 @@ std::unordered_set Session::getAuthenticationTypesOrLogInFai } } -void Session::authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address) +void Session::authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address, const Strings & external_roles_) { - authenticate(BasicCredentials{user_name, password}, address); + authenticate(BasicCredentials{user_name, password}, address, external_roles_); } -void Session::authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_) +void Session::authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_, const Strings & external_roles_) { if (session_context) throw Exception(ErrorCodes::LOGICAL_ERROR, "If there is a session context it must be created after authentication"); @@ -359,8 +361,8 @@ void Session::authenticate(const Credentials & credentials_, const Poco::Net::So if ((address == Poco::Net::SocketAddress{}) && (prepared_client_info->interface == ClientInfo::Interface::LOCAL)) address = Poco::Net::SocketAddress{"127.0.0.1", 0}; - LOG_DEBUG(log, "{} Authenticating user '{}' from {}", - toString(auth_id), credentials_.getUserName(), address.toString()); + LOG_DEBUG(log, "Authenticating user '{}' from {}", + credentials_.getUserName(), address.toString()); try { @@ -370,6 +372,14 @@ void Session::authenticate(const Credentials & credentials_, const Poco::Net::So settings_from_auth_server = auth_result.settings; LOG_DEBUG(log, "{} Authenticated with global context as user {}", toString(auth_id), toString(*user_id)); + + if (!external_roles_.empty() && global_context->getSettingsRef()[Setting::push_external_roles_in_interserver_queries]) + { + external_roles = global_context->getAccessControl().find(external_roles_); + + LOG_DEBUG(log, "User {} has external_roles applied: [{}] ({})", + toString(*user_id), fmt::join(external_roles_, ", "), external_roles_.size()); + } } catch (const Exception & e) { @@ -394,7 +404,7 @@ void Session::checkIfUserIsStillValid() void Session::onAuthenticationFailure(const std::optional & user_name, const Poco::Net::SocketAddress & address_, const Exception & e) { - LOG_DEBUG(log, "{} Authentication failed with error: {}", toString(auth_id), e.what()); + LOG_DEBUG(log, "Authentication failed with error: {}", e.what()); if (auto session_log = getSessionLog()) { /// Add source address to the log @@ -520,8 +530,8 @@ ContextMutablePtr Session::makeSessionContext() if (session_tracker_handle) throw Exception(ErrorCodes::LOGICAL_ERROR, "Session tracker handle was created before making session"); - LOG_DEBUG(log, "{} Creating session context with user_id: {}", - toString(auth_id), toString(*user_id)); + LOG_DEBUG(log, "Creating session context with user_id: {}", + toString(*user_id)); /// Make a new session context. ContextMutablePtr new_session_context; new_session_context = Context::createCopy(global_context); @@ -532,7 +542,7 @@ ContextMutablePtr Session::makeSessionContext() prepared_client_info.reset(); /// Set user information for the new context: current profiles, roles, access rights. - new_session_context->setUser(*user_id); + new_session_context->setUser(*user_id, external_roles); /// Session context is ready. session_context = new_session_context; @@ -563,8 +573,8 @@ ContextMutablePtr Session::makeSessionContext(const String & session_name_, std: if (session_tracker_handle) throw Exception(ErrorCodes::LOGICAL_ERROR, "Session tracker handle was created before making session"); - LOG_DEBUG(log, "{} Creating named session context with name: {}, user_id: {}", - toString(auth_id), session_name_, toString(*user_id)); + LOG_DEBUG(log, "Creating named session context with name: {}, user_id: {}", + session_name_, toString(*user_id)); /// Make a new session context OR /// if the `session_id` and `user_id` were used before then just get a previously created session context. @@ -587,7 +597,7 @@ ContextMutablePtr Session::makeSessionContext(const String & session_name_, std: /// Set user information for the new context: current profiles, roles, access rights. if (!access->tryGetUser()) { - new_session_context->setUser(*user_id); + new_session_context->setUser(*user_id, external_roles); max_sessions_for_user = new_session_context->getSettingsRef()[Setting::max_sessions_for_user]; } else @@ -639,7 +649,7 @@ ContextMutablePtr Session::makeQueryContextImpl(const ClientInfo * client_info_t throw Exception(ErrorCodes::LOGICAL_ERROR, "Query context must be created after authentication"); /// We can create a query context either from a session context or from a global context. - bool from_session_context = static_cast(session_context); + const bool from_session_context = static_cast(session_context); /// Create a new query context. ContextMutablePtr query_context = Context::createCopy(from_session_context ? session_context : global_context); @@ -679,7 +689,7 @@ ContextMutablePtr Session::makeQueryContextImpl(const ClientInfo * client_info_t /// Set user information for the new context: current profiles, roles, access rights. if (user_id && !query_context->getAccess()->tryGetUser()) - query_context->setUser(*user_id); + query_context->setUser(*user_id, external_roles); /// Query context is ready. query_context_created = true; diff --git a/src/Interpreters/Session.h b/src/Interpreters/Session.h index 0a20dd896a9..d2957964925 100644 --- a/src/Interpreters/Session.h +++ b/src/Interpreters/Session.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace Poco::Net { class SocketAddress; } @@ -50,8 +51,11 @@ public: /// Sets the current user, checks the credentials and that the specified address is allowed to connect from. /// The function throws an exception if there is no such user or password is wrong. - void authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address); - void authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_); + void authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address, const Strings & external_roles_ = {}); + + /// `external_roles_` names of the additional roles (over what is granted via local access control mechanisms) that would be granted to user during this session. + /// Role is not granted if it can't be found by name via AccessControl (i.e. doesn't exist on this instance). + void authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_, const Strings & external_roles_ = {}); // Verifies whether the user's validity extends beyond the current time. // Throws an exception if the user's validity has expired. @@ -112,6 +116,7 @@ private: mutable UserPtr user; std::optional user_id; + std::vector external_roles; AuthenticationData user_authenticated_with; ContextMutablePtr session_context; diff --git a/src/Interpreters/SystemLog.cpp b/src/Interpreters/SystemLog.cpp index aafe819967f..cf0de1aa744 100644 --- a/src/Interpreters/SystemLog.cpp +++ b/src/Interpreters/SystemLog.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include diff --git a/src/Interpreters/TemporaryDataOnDisk.cpp b/src/Interpreters/TemporaryDataOnDisk.cpp index ba7c4dc4b34..174be1b440a 100644 --- a/src/Interpreters/TemporaryDataOnDisk.cpp +++ b/src/Interpreters/TemporaryDataOnDisk.cpp @@ -241,13 +241,6 @@ String TemporaryDataBuffer::describeFilePath() const return file_holder->describeFilePath(); } -TemporaryDataBuffer::~TemporaryDataBuffer() -{ - if (out_compressed_buf) - // read() nor finishWriting() was called - cancel(); -} - void TemporaryDataBuffer::cancelImpl() noexcept { if (out_compressed_buf) @@ -255,7 +248,6 @@ void TemporaryDataBuffer::cancelImpl() noexcept /// CompressedWriteBuffer doesn't call cancel/finalize for wrapped buffer out_compressed_buf->cancel(); out_compressed_buf.getHolder()->cancel(); - out_compressed_buf.reset(); } } @@ -360,4 +352,9 @@ TemporaryBlockStreamReaderHolder TemporaryBlockStreamHolder::getReadStream() con return TemporaryBlockStreamReaderHolder(holder->read(), header, DBMS_TCP_PROTOCOL_VERSION); } +TemporaryDataBuffer::~TemporaryDataBuffer() +{ + if (!finalized) + cancel(); +} } diff --git a/src/Interpreters/TemporaryDataOnDisk.h b/src/Interpreters/TemporaryDataOnDisk.h index 7f023bae65b..2ea5feaffaa 100644 --- a/src/Interpreters/TemporaryDataOnDisk.h +++ b/src/Interpreters/TemporaryDataOnDisk.h @@ -129,7 +129,6 @@ public: const Impl & operator*() const { chassert(impl); chassert(holder); return *impl; } operator bool() const { return impl != nullptr; } /// NOLINT - const Holder * getHolder() const { return holder.get(); } Holder * getHolder() { return holder.get(); } void reset() @@ -185,6 +184,8 @@ public: }; explicit TemporaryDataBuffer(TemporaryDataOnDiskScope * parent_, size_t reserve_size = 0); + ~TemporaryDataBuffer() override; + void nextImpl() override; void finalizeImpl() override; void cancelImpl() noexcept override; @@ -194,8 +195,6 @@ public: String describeFilePath() const; - ~TemporaryDataBuffer() override; - private: void updateAllocAndCheck(); diff --git a/src/Interpreters/TraceCollector.cpp b/src/Interpreters/TraceCollector.cpp index 77f70d754c8..dafbf0ff31d 100644 --- a/src/Interpreters/TraceCollector.cpp +++ b/src/Interpreters/TraceCollector.cpp @@ -72,7 +72,7 @@ TraceCollector::~TraceCollector() */ WriteBufferFromFileDescriptor out(TraceSender::pipe.fds_rw[1]); writeChar(true, out); - out.next(); + out.finalize(); } catch (...) { diff --git a/src/Interpreters/TreeRewriter.cpp b/src/Interpreters/TreeRewriter.cpp index ea08fd92339..16b0e7ef199 100644 --- a/src/Interpreters/TreeRewriter.cpp +++ b/src/Interpreters/TreeRewriter.cpp @@ -1132,8 +1132,8 @@ bool TreeRewriterResult::collectUsedColumns(const ASTPtr & query, bool is_select auto partition_columns = partition_desc.expression->getRequiredColumns(); NameSet partition_columns_set(partition_columns.begin(), partition_columns.end()); - const auto & parititon_virtuals = MergeTreeData::virtuals_useful_for_filter; - partition_columns_set.insert(parititon_virtuals.begin(), parititon_virtuals.end()); + const auto & partition_virtuals = MergeTreeData::virtuals_useful_for_filter; + partition_columns_set.insert(partition_virtuals.begin(), partition_virtuals.end()); optimize_trivial_count = true; for (const auto & required_column : required) diff --git a/src/Interpreters/executeQuery.cpp b/src/Interpreters/executeQuery.cpp index 0bc1d4956a1..a94eca3d7b1 100644 --- a/src/Interpreters/executeQuery.cpp +++ b/src/Interpreters/executeQuery.cpp @@ -1,3 +1,6 @@ +#include +#include +#include #include #include #include @@ -172,6 +175,7 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; extern const int NOT_IMPLEMENTED; extern const int QUERY_WAS_CANCELLED; + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; extern const int SYNTAX_ERROR; extern const int SUPPORT_IS_DISABLED; extern const int INCORRECT_QUERY; @@ -721,7 +725,9 @@ void logExceptionBeforeStart( if (settings[Setting::calculate_text_stack_trace]) setExceptionStackTrace(elem); - logException(context, elem); + + bool log_error = elem.exception_code != ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT && elem.exception_code != ErrorCodes::QUERY_WAS_CANCELLED; + logException(context, elem, log_error); /// Update performance counters before logging to query_log CurrentThread::finalizePerformanceCounters(); @@ -868,56 +874,65 @@ static std::tuple executeQueryImpl( ast = parseQuery(parser, begin, end, "", max_query_size, settings[Setting::max_parser_depth], settings[Setting::max_parser_backtracks]); #ifndef NDEBUG - /// Verify that AST formatting is consistent: - /// If you format AST, parse it back, and format it again, you get the same string. - - String formatted1 = ast->formatWithPossiblyHidingSensitiveData( - /*max_length=*/0, - /*one_line=*/true, - /*show_secrets=*/true, - /*print_pretty_type_names=*/false, - /*identifier_quoting_rule=*/IdentifierQuotingRule::WhenNecessary, - /*identifier_quoting_style=*/IdentifierQuotingStyle::Backticks); - - /// The query can become more verbose after formatting, so: - size_t new_max_query_size = max_query_size > 0 ? (1000 + 2 * max_query_size) : 0; - - ASTPtr ast2; try { - ast2 = parseQuery( - parser, - formatted1.data(), - formatted1.data() + formatted1.size(), - "", - new_max_query_size, - settings[Setting::max_parser_depth], - settings[Setting::max_parser_backtracks]); - } - catch (const Exception & e) - { - if (e.code() == ErrorCodes::SYNTAX_ERROR) + /// Verify that AST formatting is consistent: + /// If you format AST, parse it back, and format it again, you get the same string. + + String formatted1 = ast->formatWithPossiblyHidingSensitiveData( + /*max_length=*/0, + /*one_line=*/true, + /*show_secrets=*/true, + /*print_pretty_type_names=*/false, + /*identifier_quoting_rule=*/IdentifierQuotingRule::WhenNecessary, + /*identifier_quoting_style=*/IdentifierQuotingStyle::Backticks); + + /// The query can become more verbose after formatting, so: + size_t new_max_query_size = max_query_size > 0 ? (1000 + 2 * max_query_size) : 0; + + ASTPtr ast2; + try + { + ast2 = parseQuery( + parser, + formatted1.data(), + formatted1.data() + formatted1.size(), + "", + new_max_query_size, + settings[Setting::max_parser_depth], + settings[Setting::max_parser_backtracks]); + } + catch (const Exception & e) + { + if (e.code() == ErrorCodes::SYNTAX_ERROR) + throw Exception(ErrorCodes::LOGICAL_ERROR, + "Inconsistent AST formatting: the query:\n{}\ncannot parse query back from {}", + formatted1, std::string_view(begin, end-begin)); + else + throw; + } + + chassert(ast2); + + String formatted2 = ast2->formatWithPossiblyHidingSensitiveData( + /*max_length=*/0, + /*one_line=*/true, + /*show_secrets=*/true, + /*print_pretty_type_names=*/false, + /*identifier_quoting_rule=*/IdentifierQuotingRule::WhenNecessary, + /*identifier_quoting_style=*/IdentifierQuotingStyle::Backticks); + + if (formatted1 != formatted2) throw Exception(ErrorCodes::LOGICAL_ERROR, - "Inconsistent AST formatting: the query:\n{}\ncannot parse query back from {}", - formatted1, std::string_view(begin, end-begin)); - - throw; + "Inconsistent AST formatting: the query:\n{}\nWas parsed and formatted back as:\n{}", + formatted1, formatted2); + } + catch (Exception & e) + { + /// Method formatImpl is not supported by MySQLParser::ASTCreateQuery. That code would fail inder debug build. + if (e.code() != ErrorCodes::NOT_IMPLEMENTED) + throw; } - - chassert(ast2); - - String formatted2 = ast2->formatWithPossiblyHidingSensitiveData( - /*max_length=*/0, - /*one_line=*/true, - /*show_secrets=*/true, - /*print_pretty_type_names=*/false, - /*identifier_quoting_rule=*/IdentifierQuotingRule::WhenNecessary, - /*identifier_quoting_style=*/IdentifierQuotingStyle::Backticks); - - if (formatted1 != formatted2) - throw Exception(ErrorCodes::LOGICAL_ERROR, - "Inconsistent AST formatting: the query:\n{}\nWas parsed and formatted back as:\n{}", - formatted1, formatted2); #endif } @@ -1570,7 +1585,7 @@ void executeQuery( /// If not - copy enough data into 'parse_buf'. WriteBufferFromVector> out(parse_buf); - LimitReadBuffer limit(istr, max_query_size + 1, /* trow_exception */ false, /* exact_limit */ {}); + LimitReadBuffer limit(istr, {.read_no_more = max_query_size + 1}); copyData(limit, out); out.finalize(); diff --git a/src/Interpreters/registerInterpreters.cpp b/src/Interpreters/registerInterpreters.cpp index 838b3a669da..31bb8fa8867 100644 --- a/src/Interpreters/registerInterpreters.cpp +++ b/src/Interpreters/registerInterpreters.cpp @@ -45,6 +45,7 @@ void registerInterpreterDropNamedCollectionQuery(InterpreterFactory & factory); void registerInterpreterGrantQuery(InterpreterFactory & factory); void registerInterpreterShowCreateAccessEntityQuery(InterpreterFactory & factory); void registerInterpreterShowGrantsQuery(InterpreterFactory & factory); +void registerInterpreterCheckGrantQuery(InterpreterFactory & factory); void registerInterpreterShowAccessEntitiesQuery(InterpreterFactory & factory); void registerInterpreterShowAccessQuery(InterpreterFactory & factory); void registerInterpreterShowPrivilegesQuery(InterpreterFactory & factory); @@ -108,6 +109,7 @@ void registerInterpreters() registerInterpreterGrantQuery(factory); registerInterpreterShowCreateAccessEntityQuery(factory); registerInterpreterShowGrantsQuery(factory); + registerInterpreterCheckGrantQuery(factory); registerInterpreterShowAccessEntitiesQuery(factory); registerInterpreterShowAccessQuery(factory); registerInterpreterShowPrivilegesQuery(factory); diff --git a/src/Parsers/ASTAlterQuery.cpp b/src/Parsers/ASTAlterQuery.cpp index 58eeb7c4cbf..8bcb6fdc2fc 100644 --- a/src/Parsers/ASTAlterQuery.cpp +++ b/src/Parsers/ASTAlterQuery.cpp @@ -70,8 +70,12 @@ ASTPtr ASTAlterCommand::clone() const void ASTAlterCommand::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const { + scope_guard closing_bracket_guard; if (format_alter_commands_with_parentheses) + { settings.ostr << "("; + closing_bracket_guard = make_scope_guard(std::function([&settings]() { settings.ostr << ")"; })); + } if (type == ASTAlterCommand::ADD_COLUMN) { @@ -498,9 +502,6 @@ void ASTAlterCommand::formatImpl(const FormatSettings & settings, FormatState & } else throw Exception(ErrorCodes::UNEXPECTED_AST_STRUCTURE, "Unexpected type of ALTER"); - - if (format_alter_commands_with_parentheses) - settings.ostr << ")"; } void ASTAlterCommand::forEachPointerToChild(std::function f) diff --git a/src/Parsers/Access/ASTCheckGrantQuery.cpp b/src/Parsers/Access/ASTCheckGrantQuery.cpp new file mode 100644 index 00000000000..5a549f3daec --- /dev/null +++ b/src/Parsers/Access/ASTCheckGrantQuery.cpp @@ -0,0 +1,126 @@ +#include +#include +#include +#include + + +namespace DB +{ + +namespace +{ + void formatColumnNames(const Strings & columns, const IAST::FormatSettings & settings) + { + settings.ostr << "("; + bool need_comma = false; + for (const auto & column : columns) + { + if (std::exchange(need_comma, true)) + settings.ostr << ", "; + settings.ostr << backQuoteIfNeed(column); + } + settings.ostr << ")"; + } + + + void formatONClause(const AccessRightsElement & element, const IAST::FormatSettings & settings) + { + settings.ostr << (settings.hilite ? IAST::hilite_keyword : "") << "ON " << (settings.hilite ? IAST::hilite_none : ""); + if (element.isGlobalWithParameter()) + { + if (element.anyParameter()) + settings.ostr << "*"; + else + settings.ostr << backQuoteIfNeed(element.parameter); + } + else if (element.anyDatabase()) + { + settings.ostr << "*.*"; + } + else + { + if (!element.database.empty()) + settings.ostr << backQuoteIfNeed(element.database) << "."; + if (element.anyDatabase()) + settings.ostr << "*"; + else + settings.ostr << backQuoteIfNeed(element.table); + } + } + + + void formatElementsWithoutOptions(const AccessRightsElements & elements, const IAST::FormatSettings & settings) + { + bool no_output = true; + for (size_t i = 0; i != elements.size(); ++i) + { + const auto & element = elements[i]; + auto keywords = element.access_flags.toKeywords(); + if (keywords.empty() || (!element.anyColumn() && element.columns.empty())) + continue; + + for (const auto & keyword : keywords) + { + if (!std::exchange(no_output, false)) + settings.ostr << ", "; + + settings.ostr << (settings.hilite ? IAST::hilite_keyword : "") << keyword << (settings.hilite ? IAST::hilite_none : ""); + if (!element.anyColumn()) + formatColumnNames(element.columns, settings); + } + + bool next_element_on_same_db_and_table = false; + if (i != elements.size() - 1) + { + const auto & next_element = elements[i + 1]; + if (element.sameDatabaseAndTableAndParameter(next_element)) + { + next_element_on_same_db_and_table = true; + } + } + + if (!next_element_on_same_db_and_table) + { + settings.ostr << " "; + formatONClause(element, settings); + } + } + + if (no_output) + settings.ostr << (settings.hilite ? IAST::hilite_keyword : "") << "USAGE ON " << (settings.hilite ? IAST::hilite_none : "") << "*.*"; + } + +} + + +String ASTCheckGrantQuery::getID(char) const +{ + return "CheckGrantQuery"; +} + + +ASTPtr ASTCheckGrantQuery::clone() const +{ + auto res = std::make_shared(*this); + + return res; +} + + +void ASTCheckGrantQuery::formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const +{ + settings.ostr << (settings.hilite ? IAST::hilite_keyword : "") << "CHECK GRANT" + << (settings.hilite ? IAST::hilite_none : ""); + + settings.ostr << " "; + + formatElementsWithoutOptions(access_rights_elements, settings); +} + + +void ASTCheckGrantQuery::replaceEmptyDatabase(const String & current_database) +{ + access_rights_elements.replaceEmptyDatabase(current_database); +} + +} diff --git a/src/Parsers/Access/ASTCheckGrantQuery.h b/src/Parsers/Access/ASTCheckGrantQuery.h new file mode 100644 index 00000000000..567ffdb289a --- /dev/null +++ b/src/Parsers/Access/ASTCheckGrantQuery.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include + + +namespace DB +{ +class ASTRolesOrUsersSet; + + +/** Parses queries like + * CHECK GRANT access_type[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} + */ +class ASTCheckGrantQuery : public IAST +{ +public: + AccessRightsElements access_rights_elements; + + String getID(char) const override; + ASTPtr clone() const override; + void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override; + void replaceEmptyDatabase(const String & current_database); + QueryKind getQueryKind() const override { return QueryKind::Check; } +}; +} diff --git a/src/Parsers/Access/ParserCheckGrantQuery.cpp b/src/Parsers/Access/ParserCheckGrantQuery.cpp new file mode 100644 index 00000000000..fe53377be59 --- /dev/null +++ b/src/Parsers/Access/ParserCheckGrantQuery.cpp @@ -0,0 +1,225 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int INVALID_GRANT; +} + +namespace +{ + bool parseAccessFlags(IParser::Pos & pos, Expected & expected, AccessFlags & access_flags) + { + static constexpr auto is_one_of_access_type_words = [](IParser::Pos & pos_) + { + if (pos_->type != TokenType::BareWord) + return false; + std::string_view word{pos_->begin, pos_->size()}; + return !(boost::iequals(word, toStringView(Keyword::ON)) || boost::iequals(word, toStringView(Keyword::TO)) || boost::iequals(word, toStringView(Keyword::FROM))); + }; + + expected.add(pos, "access type"); + + return IParserBase::wrapParseImpl(pos, [&] + { + if (!is_one_of_access_type_words(pos)) + return false; + + String str; + do + { + if (!str.empty()) + str += " "; + str += std::string_view(pos->begin, pos->size()); + ++pos; + } + while (is_one_of_access_type_words(pos)); + + try + { + access_flags = AccessFlags{str}; + } + catch (...) + { + return false; + } + + return true; + }); + } + + + bool parseColumnNames(IParser::Pos & pos, Expected & expected, Strings & columns) + { + return IParserBase::wrapParseImpl(pos, [&] + { + if (!ParserToken{TokenType::OpeningRoundBracket}.ignore(pos, expected)) + return false; + + ASTPtr ast; + if (!ParserList{std::make_unique(), std::make_unique(TokenType::Comma), false}.parse(pos, ast, expected)) + return false; + + Strings res_columns; + for (const auto & child : ast->children) + res_columns.emplace_back(getIdentifierName(child)); + + if (!ParserToken{TokenType::ClosingRoundBracket}.ignore(pos, expected)) + return false; + + columns = std::move(res_columns); + return true; + }); + } + + bool parseAccessFlagsWithColumns(IParser::Pos & pos, Expected & expected, + std::vector> & access_and_columns) + { + std::vector> res; + + auto parse_access_and_columns = [&] + { + AccessFlags access_flags; + if (!parseAccessFlags(pos, expected, access_flags)) + return false; + + Strings columns; + parseColumnNames(pos, expected, columns); + res.emplace_back(access_flags, std::move(columns)); + return true; + }; + + if (!ParserList::parseUtil(pos, expected, parse_access_and_columns, false)) + return false; + + access_and_columns = std::move(res); + return true; + } + + + bool parseElements(IParser::Pos & pos, Expected & expected, AccessRightsElements & elements) + { + return IParserBase::wrapParseImpl(pos, [&] + { + AccessRightsElements res_elements; + + auto parse_around_on = [&] + { + std::vector> access_and_columns; + if (!parseAccessFlagsWithColumns(pos, expected, access_and_columns)) + return false; + + String database_name, table_name, parameter; + + size_t is_global_with_parameter = 0; + for (const auto & elem : access_and_columns) + { + if (elem.first.isGlobalWithParameter()) + ++is_global_with_parameter; + } + + if (!ParserKeyword{Keyword::ON}.ignore(pos, expected)) + return false; + + bool wildcard = false; + bool default_database = false; + if (is_global_with_parameter && is_global_with_parameter == access_and_columns.size()) + { + ASTPtr parameter_ast; + if (!ParserToken{TokenType::Asterisk}.ignore(pos, expected)) + { + if (ParserIdentifier{}.parse(pos, parameter_ast, expected)) + parameter = getIdentifierName(parameter_ast); + else + return false; + } + + if (ParserToken{TokenType::Asterisk}.ignore(pos, expected)) + wildcard = true; + } + else if (!parseDatabaseAndTableNameOrAsterisks(pos, expected, database_name, table_name, wildcard, default_database)) + return false; + + for (auto & [access_flags, columns] : access_and_columns) + { + AccessRightsElement element; + element.access_flags = access_flags; + element.columns = std::move(columns); + element.database = database_name; + element.table = table_name; + element.parameter = parameter; + element.wildcard = wildcard; + element.default_database = default_database; + res_elements.emplace_back(std::move(element)); + } + + return true; + }; + + if (!ParserList::parseUtil(pos, expected, parse_around_on, false)) + return false; + + elements = std::move(res_elements); + return true; + }); + } + + void throwIfNotGrantable(AccessRightsElements & elements) + { + std::erase_if(elements, [](AccessRightsElement & element) + { + if (element.empty()) + return true; + auto old_flags = element.access_flags; + element.eraseNonGrantable(); + if (!element.empty()) + return false; + + if (!element.anyColumn()) + throw Exception(ErrorCodes::INVALID_GRANT, "{} cannot check grant on the column level", old_flags.toString()); + else if (!element.anyTable()) + throw Exception(ErrorCodes::INVALID_GRANT, "{} cannot check grant on the table level", old_flags.toString()); + else if (!element.anyDatabase()) + throw Exception(ErrorCodes::INVALID_GRANT, "{} cannot check grant on the database level", old_flags.toString()); + else if (!element.anyParameter()) + throw Exception(ErrorCodes::INVALID_GRANT, "{} cannot check grant on the global with parameter level", old_flags.toString()); + else + throw Exception(ErrorCodes::INVALID_GRANT, "{} cannot check grant", old_flags.toString()); + }); + } +} + + +bool ParserCheckGrantQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) +{ + if (!ParserKeyword{Keyword::CHECK_GRANT}.ignore(pos, expected)) + return false; + + + AccessRightsElements elements; + + if (!parseElements(pos, expected, elements)) + return false; + + throwIfNotGrantable(elements); + + auto query = std::make_shared(); + node = query; + + query->access_rights_elements = std::move(elements); + + return true; +} +} diff --git a/src/Parsers/Access/ParserCheckGrantQuery.h b/src/Parsers/Access/ParserCheckGrantQuery.h new file mode 100644 index 00000000000..d58ea6002a8 --- /dev/null +++ b/src/Parsers/Access/ParserCheckGrantQuery.h @@ -0,0 +1,17 @@ +#pragma once + +#include + + +namespace DB +{ +/** Parses queries like + * CHECK GRANT access_type[(column_name [,...])] [,...] ON {db.table|db.*|*.*|table|*} + */ +class ParserCheckGrantQuery : public IParserBase +{ +protected: + const char * getName() const override { return "CHECK GRANT"; } + bool parseImpl(Pos & pos, ASTPtr & node, Expected & expected) override; +}; +} diff --git a/src/Parsers/CommonParsers.h b/src/Parsers/CommonParsers.h index c02f8d06323..3927ac96b2f 100644 --- a/src/Parsers/CommonParsers.h +++ b/src/Parsers/CommonParsers.h @@ -79,6 +79,7 @@ namespace DB MR_MACROS(CHARACTER, "CHARACTER") \ MR_MACROS(CHECK_ALL_TABLES, "CHECK ALL TABLES") \ MR_MACROS(CHECK_TABLE, "CHECK TABLE") \ + MR_MACROS(CHECK_GRANT, "CHECK GRANT")\ MR_MACROS(CHECK, "CHECK") \ MR_MACROS(CLEANUP, "CLEANUP") \ MR_MACROS(CLEAR_COLUMN, "CLEAR COLUMN") \ diff --git a/src/Parsers/ExpressionElementParsers.cpp b/src/Parsers/ExpressionElementParsers.cpp index ad062d27a37..80eed615b1d 100644 --- a/src/Parsers/ExpressionElementParsers.cpp +++ b/src/Parsers/ExpressionElementParsers.cpp @@ -140,6 +140,9 @@ bool ParserSubquery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) const ASTPtr & explained_ast = explain_query.getExplainedQuery(); if (explained_ast) { + if (!explained_ast->as()) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "EXPLAIN inside subquery supports only SELECT queries"); + auto view_explain = makeASTFunction("viewExplain", std::make_shared(kind_str), std::make_shared(settings_str), @@ -1309,13 +1312,11 @@ bool ParserCollectionOfLiterals::parseImpl(Pos & pos, ASTPtr & node, { if (pos->type == closing_bracket) { - std::shared_ptr literal; - /// Parse one-element tuples (e.g. (1)) later as single values for backward compatibility. if (std::is_same_v && layers.back().arr.size() == 1) return false; - literal = std::make_shared(std::move(layers.back().arr)); + std::shared_ptr literal = std::make_shared(std::move(layers.back().arr)); literal->begin = layers.back().literal_begin; literal->end = ++pos; diff --git a/src/Parsers/IParser.cpp b/src/Parsers/IParser.cpp index 9d7a0a65b34..6c6928a8802 100644 --- a/src/Parsers/IParser.cpp +++ b/src/Parsers/IParser.cpp @@ -53,7 +53,12 @@ void Expected::highlight(HighlightedRange range) /// for each highlight x and the next one y: x.end <= y.begin, thus preventing any overlap. if (it != highlights.begin()) - it = std::prev(it); + { + auto prev_it = std::prev(it); + + if (range.begin < prev_it->end) + it = prev_it; + } while (it != highlights.end() && range.begin < it->end) { diff --git a/src/Parsers/ParserQuery.cpp b/src/Parsers/ParserQuery.cpp index 4ed6e4267f4..1afd8e0e81a 100644 --- a/src/Parsers/ParserQuery.cpp +++ b/src/Parsers/ParserQuery.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,7 @@ bool ParserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) ParserDropAccessEntityQuery drop_access_entity_p; ParserMoveAccessEntityQuery move_access_entity_p; ParserGrantQuery grant_p; + ParserCheckGrantQuery check_grant_p; ParserSetRoleQuery set_role_p; ParserExternalDDLQuery external_ddl_p; ParserTransactionControl transaction_control_p; @@ -102,6 +104,7 @@ bool ParserQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) || drop_access_entity_p.parse(pos, node, expected) || move_access_entity_p.parse(pos, node, expected) || grant_p.parse(pos, node, expected) + || check_grant_p.parse(pos, node, expected) || external_ddl_p.parse(pos, node, expected) || transaction_control_p.parse(pos, node, expected) || delete_p.parse(pos, node, expected) diff --git a/src/Parsers/examples/lexer.cpp b/src/Parsers/examples/lexer.cpp index 9de2ad2eb72..49362d8c68b 100644 --- a/src/Parsers/examples/lexer.cpp +++ b/src/Parsers/examples/lexer.cpp @@ -115,5 +115,7 @@ int main(int, char **) ++token; }*/ + out.finalize(); + return 0; } diff --git a/src/Processors/Executors/ExecutionThreadContext.cpp b/src/Processors/Executors/ExecutionThreadContext.cpp index b88a755b85a..a7f61a85957 100644 --- a/src/Processors/Executors/ExecutionThreadContext.cpp +++ b/src/Processors/Executors/ExecutionThreadContext.cpp @@ -11,6 +11,7 @@ namespace ErrorCodes extern const int TOO_MANY_ROWS_OR_BYTES; extern const int QUOTA_EXCEEDED; extern const int QUERY_WAS_CANCELLED; + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; } void ExecutionThreadContext::wait(std::atomic_bool & finished) @@ -37,7 +38,8 @@ static bool checkCanAddAdditionalInfoToException(const DB::Exception & exception /// Don't add additional info to limits and quota exceptions, and in case of kill query (to pass tests). return exception.code() != ErrorCodes::TOO_MANY_ROWS_OR_BYTES && exception.code() != ErrorCodes::QUOTA_EXCEEDED - && exception.code() != ErrorCodes::QUERY_WAS_CANCELLED; + && exception.code() != ErrorCodes::QUERY_WAS_CANCELLED + && exception.code() != ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT; } static void executeJob(ExecutingGraph::Node * node, ReadProgressCallback * read_progress_callback) diff --git a/src/Processors/Formats/IOutputFormat.cpp b/src/Processors/Formats/IOutputFormat.cpp index 97628778adb..9b99ecb2d7c 100644 --- a/src/Processors/Formats/IOutputFormat.cpp +++ b/src/Processors/Formats/IOutputFormat.cpp @@ -124,6 +124,7 @@ void IOutputFormat::finalize() { if (finalized) return; + writePrefixIfNeeded(); writeSuffixIfNeeded(); finalizeImpl(); diff --git a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp index eb21f8905c3..2178b8e0052 100644 --- a/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp +++ b/src/Processors/Formats/Impl/ArrowBufferedStreams.cpp @@ -354,9 +354,10 @@ std::shared_ptr asArrowFileLoadIntoMemory( if (bytes_read < magic_bytes.size() || file_data != magic_bytes) throw Exception(ErrorCodes::INCORRECT_DATA, "Not a {} file", format_name); - WriteBufferFromString file_buffer(file_data, AppendModeTag{}); - copyData(in, file_buffer, is_cancelled); - file_buffer.finalize(); + { + WriteBufferFromString file_buffer(file_data, AppendModeTag{}); + copyData(in, file_buffer, is_cancelled); + } return std::make_shared(arrow::Buffer::FromString(std::move(file_data))); } diff --git a/src/Processors/Formats/Impl/BSONEachRowRowOutputFormat.cpp b/src/Processors/Formats/Impl/BSONEachRowRowOutputFormat.cpp index b7f415ff449..4fb20025532 100644 --- a/src/Processors/Formats/Impl/BSONEachRowRowOutputFormat.cpp +++ b/src/Processors/Formats/Impl/BSONEachRowRowOutputFormat.cpp @@ -36,9 +36,10 @@ namespace ErrorCodes static String toValidUTF8String(const String & name, const FormatSettings & settings) { WriteBufferFromOwnString buf; - WriteBufferValidUTF8 validating_buf(buf); - writeJSONString(name, validating_buf, settings); - validating_buf.finalize(); + { + WriteBufferValidUTF8 validating_buf(buf); + writeJSONString(name, validating_buf, settings); + } /// Return value without quotes return buf.str().substr(1, buf.str().size() - 2); } diff --git a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp index 00a0d426dcf..6d097648df5 100644 --- a/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/DWARFBlockInputFormat.cpp @@ -186,9 +186,8 @@ void DWARFBlockInputFormat::initELF() /// If can't mmap, read the entire file into memory. /// We could read just the .debug_* sections, but typically they take up most of the binary anyway (60% for clickhouse debug build). { - WriteBufferFromVector buf(file_contents); + auto buf = WriteBufferFromVector>(file_contents); copyData(*in, buf, is_stopped); - buf.finalize(); } elf.emplace(file_contents.data(), file_contents.size(), ""); } diff --git a/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.cpp b/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.cpp index 72a009c20bf..9aa1b14d64a 100644 --- a/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.cpp +++ b/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.cpp @@ -16,6 +16,12 @@ JSONColumnsBlockOutputFormatBase::JSONColumnsBlockOutputFormatBase( ostr = OutputFormatWithUTF8ValidationAdaptor::getWriteBufferPtr(); } +void JSONColumnsBlockOutputFormatBase::resetFormatterImpl() +{ + OutputFormatWithUTF8ValidationAdaptor::resetFormatterImpl(); + ostr = OutputFormatWithUTF8ValidationAdaptor::getWriteBufferPtr(); +} + void JSONColumnsBlockOutputFormatBase::consume(Chunk chunk) { if (!mono_chunk) diff --git a/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.h b/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.h index d73ac53b97a..6fb8cabdb92 100644 --- a/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.h +++ b/src/Processors/Formats/Impl/JSONColumnsBlockOutputFormatBase.h @@ -23,6 +23,7 @@ public: protected: void consume(Chunk chunk) override; void writeSuffix() override; + void resetFormatterImpl() override; void writeChunk(Chunk & chunk); void writeColumn(const IColumn & column, const ISerialization & serialization); diff --git a/src/Processors/Formats/Impl/JSONEachRowWithProgressRowOutputFormat.cpp b/src/Processors/Formats/Impl/JSONEachRowWithProgressRowOutputFormat.cpp index 449ccb62562..c7942e93e67 100644 --- a/src/Processors/Formats/Impl/JSONEachRowWithProgressRowOutputFormat.cpp +++ b/src/Processors/Formats/Impl/JSONEachRowWithProgressRowOutputFormat.cpp @@ -24,11 +24,13 @@ void JSONEachRowWithProgressRowOutputFormat::onProgress(const Progress & value) { progress.incrementPiecewiseAtomically(value); String progress_line; - WriteBufferFromString buf(progress_line); - writeCString("{\"progress\":", buf); - progress.writeJSON(buf); - writeCString("}\n", buf); - buf.finalize(); + { + WriteBufferFromString buf(progress_line); + writeCString("{\"progress\":", buf); + progress.writeJSON(buf); + writeCString("}\n", buf); + } + std::lock_guard lock(progress_lines_mutex); progress_lines.emplace_back(std::move(progress_line)); has_progress = true; diff --git a/src/Processors/Formats/Impl/MySQLOutputFormat.cpp b/src/Processors/Formats/Impl/MySQLOutputFormat.cpp index 784aa5494ba..08a6d19a782 100644 --- a/src/Processors/Formats/Impl/MySQLOutputFormat.cpp +++ b/src/Processors/Formats/Impl/MySQLOutputFormat.cpp @@ -49,17 +49,17 @@ void MySQLOutputFormat::writePrefix() if (header.columns()) { - packet_endpoint->sendPacket(LengthEncodedNumber(header.columns())); + packet_endpoint->sendPacket(LengthEncodedNumber(header.columns()), false); for (size_t i = 0; i < header.columns(); ++i) { const auto & column_name = header.getColumnsWithTypeAndName()[i].name; - packet_endpoint->sendPacket(getColumnDefinition(column_name, data_types[i])); + packet_endpoint->sendPacket(getColumnDefinition(column_name, data_types[i]), false); } if (!(client_capabilities & Capability::CLIENT_DEPRECATE_EOF) && !use_binary_result_set) { - packet_endpoint->sendPacket(EOFPacket(0, 0)); + packet_endpoint->sendPacket(EOFPacket(0, 0), false); } } } @@ -71,7 +71,7 @@ void MySQLOutputFormat::consume(Chunk chunk) for (size_t row = 0; row < chunk.getNumRows(); ++row) { ProtocolText::ResultSetRow row_packet(serializations, data_types, chunk.getColumns(), row); - packet_endpoint->sendPacket(row_packet); + packet_endpoint->sendPacket(row_packet, false); } } else @@ -79,9 +79,11 @@ void MySQLOutputFormat::consume(Chunk chunk) for (size_t row = 0; row < chunk.getNumRows(); ++row) { ProtocolBinary::ResultSetRow row_packet(serializations, data_types, chunk.getColumns(), row); - packet_endpoint->sendPacket(row_packet); + packet_endpoint->sendPacket(row_packet, false); } } + + flush(); } void MySQLOutputFormat::finalizeImpl() @@ -107,11 +109,11 @@ void MySQLOutputFormat::finalizeImpl() const auto & header = getPort(PortKind::Main).getHeader(); if (header.columns() == 0) - packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); + packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, affected_rows, 0, 0, "", human_readable_info)); else if (client_capabilities & CLIENT_DEPRECATE_EOF) - packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, affected_rows, 0, 0, "", human_readable_info), true); + packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, affected_rows, 0, 0, "", human_readable_info)); else - packet_endpoint->sendPacket(EOFPacket(0, 0), true); + packet_endpoint->sendPacket(EOFPacket(0, 0)); } else { @@ -123,9 +125,9 @@ void MySQLOutputFormat::finalizeImpl() affected_rows = info.written_rows; } if (client_capabilities & CLIENT_DEPRECATE_EOF) - packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, affected_rows, 0, 0, "", ""), true); + packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, affected_rows, 0, 0, "", "")); else - packet_endpoint->sendPacket(EOFPacket(0, 0), true); + packet_endpoint->sendPacket(EOFPacket(0, 0)); } } diff --git a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp index 26aa3555c2b..93ed4402b4b 100644 --- a/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp +++ b/src/Processors/Formats/Impl/NativeORCBlockInputFormat.cpp @@ -119,9 +119,10 @@ std::unique_ptr asORCInputStreamLoadIntoMemory(ReadBuffer & in if (bytes_read < magic_size || file_data != ORC_MAGIC_BYTES) throw Exception(ErrorCodes::INCORRECT_DATA, "Not an ORC file"); - WriteBufferFromString file_buffer(file_data, AppendModeTag{}); - copyData(in, file_buffer, is_cancelled); - file_buffer.finalize(); + { + WriteBufferFromString file_buffer(file_data, AppendModeTag{}); + copyData(in, file_buffer, is_cancelled); + } size_t file_size = file_data.size(); return std::make_unique(std::move(file_data), file_size); diff --git a/src/Processors/Formats/Impl/NullFormat.cpp b/src/Processors/Formats/Impl/NullFormat.cpp index 4bd2249ac16..a48ab7aea3b 100644 --- a/src/Processors/Formats/Impl/NullFormat.cpp +++ b/src/Processors/Formats/Impl/NullFormat.cpp @@ -1,12 +1,12 @@ #include #include -#include +#include namespace DB { -WriteBufferFromPointer NullOutputFormat::empty_buffer(nullptr, 0); +NullWriteBuffer NullOutputFormat::empty_buffer; NullOutputFormat::NullOutputFormat(const Block & header) : IOutputFormat(header, empty_buffer) {} diff --git a/src/Processors/Formats/Impl/NullFormat.h b/src/Processors/Formats/Impl/NullFormat.h index 3362131c4d3..67d6a83e751 100644 --- a/src/Processors/Formats/Impl/NullFormat.h +++ b/src/Processors/Formats/Impl/NullFormat.h @@ -4,7 +4,7 @@ namespace DB { -class WriteBufferFromPointer; +class NullWriteBuffer; class NullOutputFormat final : public IOutputFormat { @@ -17,7 +17,7 @@ protected: void consume(Chunk) override {} private: - static WriteBufferFromPointer empty_buffer; + static NullWriteBuffer empty_buffer; }; } diff --git a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp index 5d404d493a6..86ebc522fa6 100644 --- a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.cpp @@ -36,6 +36,9 @@ namespace DB if (collected_prefix && collected_suffix && collected_finalize) return; + if (out.isCanceled()) + return; + auto formatter = internal_formatter_creator(out); formatter->setRowsReadBefore(rows_collected); formatter->setException(exception_message); diff --git a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h index cb6cf00e981..2b97d3467b9 100644 --- a/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h +++ b/src/Processors/Formats/Impl/ParallelFormattingOutputFormat.h @@ -144,13 +144,13 @@ public: String getContentType() const override { - WriteBufferFromOwnString buffer; + NullWriteBuffer buffer; return internal_formatter_creator(buffer)->getContentType(); } bool supportsWritingException() const override { - WriteBufferFromOwnString buffer; + NullWriteBuffer buffer; return internal_formatter_creator(buffer)->supportsWritingException(); } diff --git a/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp b/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp index d3553c04e9d..9d3ff5c3998 100644 --- a/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp +++ b/src/Processors/Formats/Impl/ParquetBlockOutputFormat.cpp @@ -569,7 +569,7 @@ void ParquetBlockOutputFormat::threadFunction() PODArray serialized; { - WriteBufferFromVector buf(serialized); + auto buf = WriteBufferFromVector>(serialized); writeColumnChunkBody(task.state, options, buf); } diff --git a/src/Processors/Formats/LazyOutputFormat.cpp b/src/Processors/Formats/LazyOutputFormat.cpp index dc099765870..e7a5c5e9e65 100644 --- a/src/Processors/Formats/LazyOutputFormat.cpp +++ b/src/Processors/Formats/LazyOutputFormat.cpp @@ -1,11 +1,17 @@ #include #include +#include namespace DB { -WriteBufferFromPointer LazyOutputFormat::out(nullptr, 0); +NullWriteBuffer LazyOutputFormat::out; + +LazyOutputFormat::LazyOutputFormat(const Block & header) +: IOutputFormat(header, out), queue(2) +{ +} Chunk LazyOutputFormat::getChunk(UInt64 milliseconds) { @@ -49,4 +55,5 @@ void LazyOutputFormat::setRowsBeforeAggregation(size_t rows_before_aggregation) { info.setRowsBeforeAggregation(rows_before_aggregation); } + } diff --git a/src/Processors/Formats/LazyOutputFormat.h b/src/Processors/Formats/LazyOutputFormat.h index 5acb6cf3bf3..54e6e564299 100644 --- a/src/Processors/Formats/LazyOutputFormat.h +++ b/src/Processors/Formats/LazyOutputFormat.h @@ -2,11 +2,12 @@ #include #include #include -#include namespace DB { +class NullWriteBuffer; + /// LazyOutputFormat is used to retrieve ready data from executing pipeline. /// You can periodically call `getChunk` from separate thread. /// Used in PullingAsyncPipelineExecutor. @@ -14,8 +15,7 @@ class LazyOutputFormat : public IOutputFormat { public: - explicit LazyOutputFormat(const Block & header) - : IOutputFormat(header, out), queue(2) {} + explicit LazyOutputFormat(const Block & header); String getName() const override { return "LazyOutputFormat"; } @@ -58,7 +58,7 @@ private: Chunk extremes; /// Is not used. - static WriteBufferFromPointer out; + static NullWriteBuffer out; ProfileInfo info; }; diff --git a/src/Processors/Formats/PullingOutputFormat.cpp b/src/Processors/Formats/PullingOutputFormat.cpp index 37050fb9675..4e353b3ad3a 100644 --- a/src/Processors/Formats/PullingOutputFormat.cpp +++ b/src/Processors/Formats/PullingOutputFormat.cpp @@ -1,5 +1,5 @@ #include -#include +#include namespace DB { @@ -9,7 +9,7 @@ namespace ErrorCodes extern const int LOGICAL_ERROR; } -WriteBufferFromPointer PullingOutputFormat::out(nullptr, 0); +NullWriteBuffer PullingOutputFormat::out; PullingOutputFormat::PullingOutputFormat(const Block & header, std::atomic_bool & consume_data_flag_) : IOutputFormat(header, out) diff --git a/src/Processors/Formats/PullingOutputFormat.h b/src/Processors/Formats/PullingOutputFormat.h index f2546cca180..cb130a04150 100644 --- a/src/Processors/Formats/PullingOutputFormat.h +++ b/src/Processors/Formats/PullingOutputFormat.h @@ -5,7 +5,7 @@ namespace DB { -class WriteBufferFromPointer; +class NullWriteBuffer; /// Output format which is used in PullingPipelineExecutor. class PullingOutputFormat : public IOutputFormat @@ -41,7 +41,7 @@ private: ProfileInfo info; /// Is not used. - static WriteBufferFromPointer out; + static NullWriteBuffer out; }; } diff --git a/src/Processors/Formats/RowOutputFormatWithExceptionHandlerAdaptor.h b/src/Processors/Formats/RowOutputFormatWithExceptionHandlerAdaptor.h index e1426bb9743..048bf18d4f9 100644 --- a/src/Processors/Formats/RowOutputFormatWithExceptionHandlerAdaptor.h +++ b/src/Processors/Formats/RowOutputFormatWithExceptionHandlerAdaptor.h @@ -18,7 +18,9 @@ public: : Base(header, out_, std::forward(args)...) { if (handle_exceptions) - peekable_out = std::make_unique(*Base::getWriteBufferPtr()); + { + peekable_out = std::make_unique>(*Base::getWriteBufferPtr()); + } } void consume(DB::Chunk chunk) override @@ -68,7 +70,7 @@ public: void finalizeBuffers() override { - if (peekable_out) + if (peekable_out && !peekable_out->isCanceled()) peekable_out->finalize(); Base::finalizeBuffers(); } @@ -101,4 +103,3 @@ private: }; } - diff --git a/src/Processors/Transforms/DeduplicationTokenTransforms.h b/src/Processors/Transforms/DeduplicationTokenTransforms.h index d6aff9e1370..7e5a6101734 100644 --- a/src/Processors/Transforms/DeduplicationTokenTransforms.h +++ b/src/Processors/Transforms/DeduplicationTokenTransforms.h @@ -4,7 +4,7 @@ #include #include -#include "Common/Logger.h" +#include namespace DB diff --git a/src/Processors/tests/gtest_write_parquet_page_index.cpp b/src/Processors/tests/gtest_write_parquet_page_index.cpp index da0eadda795..591b794a53f 100644 --- a/src/Processors/tests/gtest_write_parquet_page_index.cpp +++ b/src/Processors/tests/gtest_write_parquet_page_index.cpp @@ -152,11 +152,16 @@ void writeParquet(SourcePtr source, const FormatSettings & format_settings, Stri QueryPipelineBuilder pipeline_builder; pipeline_builder.init(Pipe(source)); auto pipeline = QueryPipelineBuilder::getPipeline(std::move(pipeline_builder)); + WriteBufferFromFile write_buffer(parquet_path); auto output = std::make_shared(write_buffer, pipeline.getHeader(), format_settings); + pipeline.complete(output); CompletedPipelineExecutor executor(pipeline); executor.execute(); + + output->finalize(); + write_buffer.finalize(); } TEST(Parquet, WriteParquetPageIndexParrelel) diff --git a/src/QueryPipeline/BlockIO.cpp b/src/QueryPipeline/BlockIO.cpp index 76da01bee0e..9281dffcc61 100644 --- a/src/QueryPipeline/BlockIO.cpp +++ b/src/QueryPipeline/BlockIO.cpp @@ -4,11 +4,6 @@ namespace DB { -namespace ErrorCodes -{ - extern const int QUERY_WAS_CANCELLED; -} - void BlockIO::reset() { /** process_list_entry should be destroyed after in, after out and after pipeline, @@ -59,33 +54,21 @@ void BlockIO::onFinish() pipeline.reset(); } -void BlockIO::onException() +void BlockIO::onException(bool log_as_error) { - if (exception_callback) - exception_callback(/* log_error */ true); + setAllDataSent(); + if (exception_callback) + exception_callback(log_as_error); + + pipeline.cancel(); pipeline.reset(); } void BlockIO::onCancelOrConnectionLoss() { - /// Query was not finished gracefully, so we should call exception_callback - /// But we don't have a real exception - try - { - throw Exception(ErrorCodes::QUERY_WAS_CANCELLED, "Query was cancelled or a client has unexpectedly dropped the connection"); - } - catch (...) - { - if (exception_callback) - { - exception_callback(/* log_error */ false); - } - - /// destroy pipeline and write buffers with an exception context - pipeline.reset(); - } - + pipeline.cancel(); + pipeline.reset(); } void BlockIO::setAllDataSent() const diff --git a/src/QueryPipeline/BlockIO.h b/src/QueryPipeline/BlockIO.h index ff85a0d6772..a84894255a1 100644 --- a/src/QueryPipeline/BlockIO.h +++ b/src/QueryPipeline/BlockIO.h @@ -32,7 +32,7 @@ struct BlockIO bool null_format = false; void onFinish(); - void onException(); + void onException(bool log_as_error=true); void onCancelOrConnectionLoss(); /// Set is_all_data_sent in system.processes for this query. diff --git a/src/QueryPipeline/QueryPipeline.cpp b/src/QueryPipeline/QueryPipeline.cpp index cab9e7a68fb..8e93cc70886 100644 --- a/src/QueryPipeline/QueryPipeline.cpp +++ b/src/QueryPipeline/QueryPipeline.cpp @@ -698,6 +698,16 @@ void QueryPipeline::reset() *this = QueryPipeline(); } +void QueryPipeline::cancel() noexcept +{ + if (processors) + { + for (auto & processor : *processors) + processor->cancel(); + } +} + + static void addExpression(OutputPort *& port, ExpressionActionsPtr actions, Processors & processors) { if (port) diff --git a/src/QueryPipeline/QueryPipeline.h b/src/QueryPipeline/QueryPipeline.h index 48dff7b85a6..2482d6458b3 100644 --- a/src/QueryPipeline/QueryPipeline.h +++ b/src/QueryPipeline/QueryPipeline.h @@ -139,6 +139,7 @@ public: void convertStructureTo(const ColumnsWithTypeAndName & columns); void reset(); + void cancel() noexcept; private: QueryPlanResourceHolder resources; diff --git a/src/QueryPipeline/RemoteInserter.cpp b/src/QueryPipeline/RemoteInserter.cpp index b958924f008..d0c42a068af 100644 --- a/src/QueryPipeline/RemoteInserter.cpp +++ b/src/QueryPipeline/RemoteInserter.cpp @@ -56,8 +56,9 @@ RemoteInserter::RemoteInserter( /** Send query and receive "header", that describes table structure. * Header is needed to know, what structure is required for blocks to be passed to 'write' method. */ + /// TODO (vnemkov): figure out should we pass additional roles in this case or not. connection.sendQuery( - timeouts, query, /* query_parameters */ {}, "", QueryProcessingStage::Complete, &settings, &modified_client_info, false, {}); + timeouts, query, /* query_parameters */ {}, "", QueryProcessingStage::Complete, &settings, &modified_client_info, false, /* external_roles */ {}, {}); while (true) { diff --git a/src/QueryPipeline/RemoteQueryExecutor.cpp b/src/QueryPipeline/RemoteQueryExecutor.cpp index 5faae03bc8f..41ab87e1a18 100644 --- a/src/QueryPipeline/RemoteQueryExecutor.cpp +++ b/src/QueryPipeline/RemoteQueryExecutor.cpp @@ -22,8 +22,12 @@ #include #include #include -#include #include +#include + +#include +#include +#include namespace ProfileEvents { @@ -43,6 +47,7 @@ namespace Setting extern const SettingsBool skip_unavailable_shards; extern const SettingsOverflowMode timeout_overflow_mode; extern const SettingsBool use_hedged_requests; + extern const SettingsBool push_external_roles_in_interserver_queries; } namespace ErrorCodes @@ -398,7 +403,25 @@ void RemoteQueryExecutor::sendQueryUnlocked(ClientInfo::QueryKind query_kind, As if (!duplicated_part_uuids.empty()) connections->sendIgnoredPartUUIDs(duplicated_part_uuids); - connections->sendQuery(timeouts, query, query_id, stage, modified_client_info, true); + // Collect all roles granted on this node and pass those to the remote node + std::vector local_granted_roles; + if (context->getSettingsRef()[Setting::push_external_roles_in_interserver_queries] && !modified_client_info.initial_user.empty()) + { + auto user = context->getAccessControl().read(modified_client_info.initial_user, true); + boost::container::flat_set granted_roles; + if (user) + { + const auto & access_control = context->getAccessControl(); + for (const auto & e : user->granted_roles.getElements()) + { + auto names = access_control.readNames(e.ids); + granted_roles.insert(names.begin(), names.end()); + } + } + local_granted_roles.insert(local_granted_roles.end(), granted_roles.begin(), granted_roles.end()); + } + + connections->sendQuery(timeouts, query, query_id, stage, modified_client_info, true, local_granted_roles); established = false; sent_query = true; diff --git a/src/Server/HTTP/HTTPServerConnection.cpp b/src/Server/HTTP/HTTPServerConnection.cpp index 39e066005b9..c2d883b7c11 100644 --- a/src/Server/HTTP/HTTPServerConnection.cpp +++ b/src/Server/HTTP/HTTPServerConnection.cpp @@ -112,7 +112,6 @@ void HTTPServerConnection::run() else throw; } - catch (const Poco::Exception &) { if (session.networkException()) diff --git a/src/Server/HTTP/HTTPServerRequest.cpp b/src/Server/HTTP/HTTPServerRequest.cpp index 3e82ec82550..65e4bdda382 100644 --- a/src/Server/HTTP/HTTPServerRequest.cpp +++ b/src/Server/HTTP/HTTPServerRequest.cpp @@ -60,8 +60,7 @@ HTTPServerRequest::HTTPServerRequest(HTTPContextPtr context, HTTPServerResponse else if (hasContentLength()) { size_t content_length = getContentLength(); - stream = std::make_unique(std::move(in), content_length, - /* trow_exception */ true, /* exact_limit */ content_length); + stream = std::make_unique(std::move(in), LimitReadBuffer::Settings{.read_no_less = content_length, .read_no_more = content_length, .expect_eof = true}); } else if (getMethod() != HTTPRequest::HTTP_GET && getMethod() != HTTPRequest::HTTP_HEAD && getMethod() != HTTPRequest::HTTP_DELETE) { diff --git a/src/Server/HTTP/HTTPServerResponse.cpp b/src/Server/HTTP/HTTPServerResponse.cpp index 3cc1e8b0a3b..f9c3f5ebc3d 100644 --- a/src/Server/HTTP/HTTPServerResponse.cpp +++ b/src/Server/HTTP/HTTPServerResponse.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -37,21 +38,21 @@ std::shared_ptr HTTPServerResponse::send() // Send header Poco::Net::HTTPHeaderOutputStream hs(session); write(hs); - stream = std::make_shared(session.socket(), write_event); + stream = std::make_shared>(session.socket(), write_event); } else if (getChunkedTransferEncoding()) { // Send header Poco::Net::HTTPHeaderOutputStream hs(session); write(hs); - stream = std::make_shared(session.socket(), write_event); + stream = std::make_shared>(session.socket(), write_event); } else if (hasContentLength()) { // Send header Poco::Net::HTTPHeaderOutputStream hs(session); write(hs); - stream = std::make_shared(session.socket(), getContentLength(), write_event); + stream = std::make_shared>(session.socket(), getContentLength(), write_event); } else { @@ -59,7 +60,7 @@ std::shared_ptr HTTPServerResponse::send() // Send header Poco::Net::HTTPHeaderOutputStream hs(session); write(hs); - stream = std::make_shared(session.socket(), write_event); + stream = std::make_shared>(session.socket(), write_event); } send_started = true; @@ -89,13 +90,13 @@ std::pair, std::shared_ptr(session.socket(), write_event, str.size()); + header_stream = std::make_shared>(session.socket(), write_event, str.size()); header_stream->write(str); if (getChunkedTransferEncoding()) - stream = std::make_shared(session.socket(), write_event); + stream = std::make_shared>(session.socket(), write_event); else - stream = std::make_shared(session.socket(), write_event); + stream = std::make_shared>(session.socket(), write_event); send_started = true; return std::make_pair(header_stream, stream); @@ -117,7 +118,11 @@ void HTTPServerResponse::sendBuffer(const void * buffer, std::size_t length) hs.flush(); if (request && request->getMethod() != HTTPRequest::HTTP_HEAD) - WriteBufferFromPocoSocket(session.socket(), write_event).write(static_cast(buffer), length); + { + auto wb = WriteBufferFromPocoSocket(session.socket(), write_event); + wb.write(static_cast(buffer), length); + wb.finalize(); + } } void HTTPServerResponse::requireAuthentication(const std::string & realm) diff --git a/src/Server/HTTP/HTTPServerResponse.h b/src/Server/HTTP/HTTPServerResponse.h index 51f5814556d..f7e1af0db8c 100644 --- a/src/Server/HTTP/HTTPServerResponse.h +++ b/src/Server/HTTP/HTTPServerResponse.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -14,6 +15,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + class HTTPWriteBufferChunked : public WriteBufferFromPocoSocket { @@ -86,6 +92,9 @@ public: void setChunked(size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE) { + if (count() > 0 && count() != offset()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "can't do setChunked on HTTPWriteBuffer, buffer is already in use"); + chunked = true; resizeIfNeeded(buf_size); } @@ -97,6 +106,9 @@ public: void setFixedLength(size_t length) { + if (count() > 0 && count() != offset()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "can't do setFixedLength on HTTPWriteBuffer, buffer is already in use"); + chunked = false; fixed_length = length; count_length = 0; @@ -108,8 +120,20 @@ public: return chunked ? 0 : fixed_length; } + size_t fixedLengthLeft() const + { + chassert(isFixedLength()); + + if (fixed_length <= count_length - offset()) + return 0; + return fixed_length - count_length - offset(); + } + void setPlain(size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE) { + if (count() > 0 && count() != offset()) + throw Exception(ErrorCodes::LOGICAL_ERROR, "can't do setPlain on HTTPWriteBuffer, buffer is already in use"); + chunked = false; fixed_length = 0; count_length = 0; @@ -125,10 +149,17 @@ protected: void finalizeImpl() override { WriteBufferFromPocoSocket::finalizeImpl(); + if (chunked) socketSendBytes("0\r\n\r\n", 5); } + void breakFixedLength() + { + if (fixed_length > 1) + fixed_length -= 1; + } + void nextImpl() override { if (chunked) @@ -141,6 +172,8 @@ protected: void nextImplFixedLength() { + /// Do we drop the data silently??? + if (count_length >= fixed_length || offset() == 0) return; @@ -176,6 +209,7 @@ protected: memory.resize(buf_size); set(memory.data(), memory.size(), data_size); } + private: bool chunked = false; size_t fixed_length = 0; diff --git a/src/Server/HTTP/WriteBufferFromHTTPServerResponse.cpp b/src/Server/HTTP/WriteBufferFromHTTPServerResponse.cpp index c0c285cf0f1..96d5ffe6175 100644 --- a/src/Server/HTTP/WriteBufferFromHTTPServerResponse.cpp +++ b/src/Server/HTTP/WriteBufferFromHTTPServerResponse.cpp @@ -1,15 +1,35 @@ #include +#include #include #include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include #include +#include namespace DB { +namespace ErrorCodes +{ + extern const int CANNOT_WRITE_AFTER_END_OF_BUFFER; + extern const int CANNOT_WRITE_TO_SOCKET; + extern const int REQUIRED_PASSWORD; + extern const int ABORTED; +} + void WriteBufferFromHTTPServerResponse::startSendHeaders() { @@ -43,8 +63,8 @@ void WriteBufferFromHTTPServerResponse::writeHeaderProgressImpl(const char * hea return; WriteBufferFromOwnString progress_string_writer; - accumulated_progress.writeJSON(progress_string_writer); + progress_string_writer.finalize(); socketSendBytes(header_name, strlen(header_name)); socketSendBytes(progress_string_writer.str().data(), progress_string_writer.str().size()); @@ -66,9 +86,11 @@ void WriteBufferFromHTTPServerResponse::writeExceptionCode() { if (headers_finished_sending || !exception_code) return; + if (headers_started_sending) { - socketSendBytes("X-ClickHouse-Exception-Code: ", sizeof("X-ClickHouse-Exception-Code: ") - 1); + static std::string_view header_key = "X-ClickHouse-Exception-Code: "; + socketSendBytes(header_key.data(), header_key.size()); auto str_code = std::to_string(exception_code); socketSendBytes(str_code.data(), str_code.size()); socketSendBytes("\r\n", 2); @@ -157,26 +179,19 @@ void WriteBufferFromHTTPServerResponse::onProgress(const Progress & progress) } } -void WriteBufferFromHTTPServerResponse::setExceptionCode(int exception_code_) +void WriteBufferFromHTTPServerResponse::setExceptionCode(int code) { std::lock_guard lock(mutex); - if (headers_started_sending) - exception_code = exception_code_; - else - response.set("X-ClickHouse-Exception-Code", toString(exception_code_)); -} -WriteBufferFromHTTPServerResponse::~WriteBufferFromHTTPServerResponse() -{ - try - { - if (!canceled) - finalize(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } + if (headers_started_sending) + exception_code = code; + else + response.set("X-ClickHouse-Exception-Code", toString(code)); + + if (code == ErrorCodes::REQUIRED_PASSWORD) + response.requireAuthentication("ClickHouse server HTTP API"); + else + response.setStatusAndReason(exceptionCodeToHTTPStatus(code)); } void WriteBufferFromHTTPServerResponse::finalizeImpl() @@ -198,8 +213,176 @@ void WriteBufferFromHTTPServerResponse::finalizeImpl() } if (!is_http_method_head) + { HTTPWriteBuffer::finalizeImpl(); + } } +void WriteBufferFromHTTPServerResponse::cancelImpl() noexcept +{ + // we have to close connection when it has been canceled + // client is waiting final empty chunk in the chunk encoding, chient has to receive EOF instead it ASAP + response.setKeepAlive(false); + HTTPWriteBuffer::cancelImpl(); +} + +bool WriteBufferFromHTTPServerResponse::isChunked() const +{ + chassert(response.sent()); + return HTTPWriteBuffer::isChunked(); +} + +bool WriteBufferFromHTTPServerResponse::isFixedLength() const +{ + chassert(response.sent()); + return HTTPWriteBuffer::isFixedLength(); +} + +bool WriteBufferFromHTTPServerResponse::cancelWithException(HTTPServerRequest & request, int exception_code_, const std::string & message, WriteBuffer * compression_buffer) noexcept +{ + bool use_compression_buffer = compression_buffer && !compression_buffer->isCanceled() && !compression_buffer->isFinalized(); + + try + { + if (isCanceled()) + throw Exception(ErrorCodes::ABORTED, "Write buffer has been canceled."); + + if (isFinalized()) + throw Exception(ErrorCodes::CANNOT_WRITE_AFTER_END_OF_BUFFER, "Write buffer has been finalized."); + + bool data_sent = false; + size_t compression_discarded_data = 0; + size_t discarded_data = 0; + if (use_compression_buffer) + { + data_sent |= (compression_buffer->count() != compression_buffer->offset()); + if (!data_sent) + compression_discarded_data = compression_buffer->rejectBufferedDataSave(); + } + data_sent |= (count() != offset()); + if (!data_sent) + discarded_data = rejectBufferedDataSave(); + + bool is_response_sent = response.sent(); + // proper senging bad http code + if (!is_response_sent) + { + drainRequestIfNeeded(request, response); + // We try to send the exception message when the transmission has not been started yet + // Set HTTP code and HTTP message. Add "X-ClickHouse-Exception-Code" header. + // If it is not HEAD request send the message in the body. + setExceptionCode(exception_code_); + + auto & out = use_compression_buffer ? *compression_buffer : *this; + writeString(message, out); + if (!message.ends_with('\n')) + writeChar('\n', out); + + if (use_compression_buffer) + compression_buffer->finalize(); + finalize(); + + LOG_DEBUG( + getLogger("WriteBufferFromHTTPServerResponse"), + "Write buffer has been canceled with an error." + " Proper HTTP error code and headers have been send to the client." + " HTTP code: {}, message: <{}>, error code: {}, message: <{}>," + " use compression: {}, data has been send through buffers: {}, compression discarded data: {}, discarded data: {}", + response.getStatus(), response.getReason(), exception_code_, message, + use_compression_buffer, + data_sent, compression_discarded_data, discarded_data); + } + else + { + // We try to send the exception message even when the transmission has been started already + // In case the chunk encoding: send new chunk which started with CHUNK_ENCODING_ERROR_HEADER and contains the error description + // it is important to avoid sending the last empty chunk in order to break the http protocol here. + // In case of fixed lengs we could send error but less that fixedLengthLeft bytes. + // In case of plain stream all ways are questionable, but lets send the error any way. + + // no point to drain request, transmission has been already started hence the request has been read + // but make sense to try to send proper `connnection: close` header if headers are not finished yet + response.setKeepAlive(false); + + // try to send proper header in case headers are not finished yet + setExceptionCode(exception_code_); + + // this starts new chunk in case of Transfer-Encoding: chunked + if (use_compression_buffer) + compression_buffer->next(); + next(); + + if (isFixedLength()) + { + if (fixedLengthLeft() > EXCEPTION_MARKER.size()) + { + // fixed length buffer drops all excess data + // make sure that we send less than content-lenght bytes at the end + // the aim is to break HTTP + breakFixedLength(); + } + else if (fixedLengthLeft() > 0) + { + breakFixedLength(); + throw Exception(ErrorCodes::CANNOT_WRITE_TO_SOCKET, + "There is no space left in the fixed length HTTP-write buffer to write the exception header." + "But the client should notice the broken HTTP protocol."); + } + else + { + throw Exception(ErrorCodes::CANNOT_WRITE_AFTER_END_OF_BUFFER, + "The response has been fully sent to the client already. That error not have affected the response."); + } + } + else + { + // Otherwise server is unable to broke HTTP protocol + chassert(isChunked()); + } + + auto & out = use_compression_buffer ? *compression_buffer : *this; + writeString(EXCEPTION_MARKER, out); + writeCString("\r\n", out); + writeString(message, out); + if (!message.ends_with('\n')) + writeChar('\n', out); + + + // this finish chunk with the error message in case of Transfer-Encoding: chunked + if (use_compression_buffer) + compression_buffer->next(); + next(); + + LOG_DEBUG( + getLogger("WriteBufferFromHTTPServerResponse"), + "Write buffer has been canceled with an error." + "Error has been sent at the end of the response. HTTP protocol has been broken by server." + " HTTP code: {}, message: <{}>, error code: {}, message: <{}>." + " use compression: {}, data has been send through buffers: {}, compression discarded data: {}, discarded data: {}", + response.getStatus(), response.getReason(), exception_code_, message, + use_compression_buffer, + data_sent, compression_discarded_data, discarded_data); + + // this prevent sending final empty chunk in case of Transfer-Encoding: chunked + // the aim is to break HTTP + if (use_compression_buffer) + compression_buffer->cancel(); + cancel(); + } + + return true; + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__, "Failed to send exception to the response write buffer."); + + if (use_compression_buffer) + compression_buffer->cancel(); + + cancel(); + + return false; + } +} } diff --git a/src/Server/HTTP/WriteBufferFromHTTPServerResponse.h b/src/Server/HTTP/WriteBufferFromHTTPServerResponse.h index f0c80f24582..facb0b020f3 100644 --- a/src/Server/HTTP/WriteBufferFromHTTPServerResponse.h +++ b/src/Server/HTTP/WriteBufferFromHTTPServerResponse.h @@ -11,7 +11,6 @@ #include #include -#include namespace DB @@ -26,13 +25,13 @@ namespace DB class WriteBufferFromHTTPServerResponse final : public HTTPWriteBuffer { public: + static constexpr std::string_view EXCEPTION_MARKER = "__exception__"; + WriteBufferFromHTTPServerResponse( HTTPServerResponse & response_, bool is_http_method_head_, const ProfileEvents::Event & write_event_ = ProfileEvents::end()); - ~WriteBufferFromHTTPServerResponse() override; - /// Writes progress in repeating HTTP headers. void onProgress(const Progress & progress); @@ -58,7 +57,13 @@ public: compression_method = compression_method_; } - void setExceptionCode(int exception_code_); + bool isChunked() const; + + bool isFixedLength() const; + + void setExceptionCode(int code); + + bool cancelWithException(HTTPServerRequest & request, int exception_code_, const std::string & message, WriteBuffer * compression_buffer) noexcept; private: /// Send at least HTTP headers if no data has been sent yet. @@ -67,6 +72,8 @@ private: /// This method is idempotent. void finalizeImpl() override; + void cancelImpl() noexcept override; + /// Must be called under locked mutex. /// This method send headers, if this was not done already, /// but not finish them with \r\n, allowing to send more headers subsequently. diff --git a/src/Server/HTTP/sendExceptionToHTTPClient.cpp b/src/Server/HTTP/sendExceptionToHTTPClient.cpp index 07a649dc396..f258cf1d0ab 100644 --- a/src/Server/HTTP/sendExceptionToHTTPClient.cpp +++ b/src/Server/HTTP/sendExceptionToHTTPClient.cpp @@ -1,64 +1,20 @@ #include -#include #include -#include -#include +#include namespace DB { -namespace ErrorCodes +void drainRequestIfNeeded(HTTPServerRequest & request, HTTPServerResponse & response) noexcept { - extern const int HTTP_LENGTH_REQUIRED; - extern const int REQUIRED_PASSWORD; -} - - -void sendExceptionToHTTPClient( - const String & exception_message, - int exception_code, - HTTPServerRequest & request, - HTTPServerResponse & response, - WriteBufferFromHTTPServerResponse * out, - LoggerPtr log) -{ - setHTTPResponseStatusAndHeadersForException(exception_code, request, response, out, log); - - if (!out) - { - /// If nothing was sent yet. - WriteBufferFromHTTPServerResponse out_for_message{response, request.getMethod() == HTTPRequest::HTTP_HEAD}; - - out_for_message.writeln(exception_message); - out_for_message.finalize(); - } - else - { - /// If buffer has data, and that data wasn't sent yet, then no need to send that data - bool data_sent = (out->count() != out->offset()); - - if (!data_sent) - out->position() = out->buffer().begin(); - - out->writeln(exception_message); - } -} - - -void setHTTPResponseStatusAndHeadersForException( - int exception_code, HTTPServerRequest & request, HTTPServerResponse & response, WriteBufferFromHTTPServerResponse * out, LoggerPtr log) -{ - if (out) - out->setExceptionCode(exception_code); - else - response.set("X-ClickHouse-Exception-Code", toString(exception_code)); - /// If HTTP method is POST and Keep-Alive is turned on, we should try to read the whole request body /// to avoid reading part of the current request body in the next request. - if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST && response.getKeepAlive() - && exception_code != ErrorCodes::HTTP_LENGTH_REQUIRED) + /// Or we have to close connection after this request. + if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST + && (request.getChunkedTransferEncoding() || request.hasContentLength()) + && response.getKeepAlive()) { try { @@ -67,14 +23,10 @@ void setHTTPResponseStatusAndHeadersForException( } catch (...) { - tryLogCurrentException(log, "Cannot read remaining request body during exception handling"); + tryLogCurrentException(__PRETTY_FUNCTION__, "Cannot read remaining request body during exception handling. Set keep alive to false on the response."); response.setKeepAlive(false); } } +} - if (exception_code == ErrorCodes::REQUIRED_PASSWORD) - response.requireAuthentication("ClickHouse server HTTP API"); - else - response.setStatusAndReason(exceptionCodeToHTTPStatus(exception_code)); -} } diff --git a/src/Server/HTTP/sendExceptionToHTTPClient.h b/src/Server/HTTP/sendExceptionToHTTPClient.h index 31fda88d900..ea61d0eb740 100644 --- a/src/Server/HTTP/sendExceptionToHTTPClient.h +++ b/src/Server/HTTP/sendExceptionToHTTPClient.h @@ -1,27 +1,10 @@ #pragma once -#include -#include - - namespace DB { class HTTPServerRequest; class HTTPServerResponse; -class WriteBufferFromHTTPServerResponse; -/// Sends an exception to HTTP client. This function doesn't handle its own exceptions so it needs to be wrapped in try-catch. -/// Argument `out` may be either created from `response` or be nullptr (if it wasn't created before the exception). -void sendExceptionToHTTPClient( - const String & exception_message, - int exception_code, - HTTPServerRequest & request, - HTTPServerResponse & response, - WriteBufferFromHTTPServerResponse * out, - LoggerPtr log); +void drainRequestIfNeeded(HTTPServerRequest & request, HTTPServerResponse & response) noexcept; -/// Sets "X-ClickHouse-Exception-Code" header and the correspondent HTTP status in the response for an exception. -/// This is a part of what sendExceptionToHTTPClient() does. -void setHTTPResponseStatusAndHeadersForException( - int exception_code, HTTPServerRequest & request, HTTPServerResponse & response, WriteBufferFromHTTPServerResponse * out, LoggerPtr log); } diff --git a/src/Server/HTTPHandler.cpp b/src/Server/HTTPHandler.cpp index a9a981258a1..74c060b8340 100644 --- a/src/Server/HTTPHandler.cpp +++ b/src/Server/HTTPHandler.cpp @@ -44,9 +44,11 @@ #include #include +#include #include #include #include +#include #include #include @@ -156,18 +158,17 @@ HTTPHandlerConnectionConfig::HTTPHandlerConnectionConfig(const Poco::Util::Abstr void HTTPHandler::pushDelayedResults(Output & used_output) { - std::vector write_buffers; - ConcatReadBuffer::Buffers read_buffers; - - auto * cascade_buffer = typeid_cast(used_output.out_maybe_delayed_and_compressed); + auto * cascade_buffer = typeid_cast(used_output.out_maybe_delayed_and_compressed.get()); if (!cascade_buffer) throw Exception(ErrorCodes::LOGICAL_ERROR, "Expected CascadeWriteBuffer"); - cascade_buffer->getResultBuffers(write_buffers); + cascade_buffer->finalize(); + auto write_buffers = cascade_buffer->getResultBuffers(); if (write_buffers.empty()) throw Exception(ErrorCodes::LOGICAL_ERROR, "At least one buffer is expected to overwrite result into HTTP response"); + ConcatReadBuffer::Buffers read_buffers; for (auto & write_buf : write_buffers) { if (auto * write_buf_concrete = dynamic_cast(write_buf.get())) @@ -294,14 +295,14 @@ void HTTPHandler::processQuery( response, request.getMethod() == HTTPRequest::HTTP_HEAD, write_event); - used_output.out = used_output.out_holder; used_output.out_maybe_compressed = used_output.out_holder; + used_output.out = used_output.out_holder; if (client_supports_http_compression && enable_http_compression) { used_output.out_holder->setCompressionMethodHeader(http_response_compression_method); used_output.wrap_compressed_holder = wrapWriteBufferWithCompressionMethod( - used_output.out_holder.get(), + used_output.out.get(), http_response_compression_method, static_cast(http_zlib_compression_level), 0, @@ -309,6 +310,7 @@ void HTTPHandler::processQuery( nullptr, 0, false); + used_output.out_maybe_compressed = used_output.wrap_compressed_holder; used_output.out = used_output.wrap_compressed_holder; } @@ -316,9 +318,8 @@ void HTTPHandler::processQuery( { used_output.out_compressed_holder = std::make_shared(*used_output.out); used_output.out_maybe_compressed = used_output.out_compressed_holder; + used_output.out = used_output.out_compressed_holder; } - else - used_output.out_maybe_compressed = used_output.out; if (buffer_size_memory > 0 || buffer_until_eof) { @@ -338,7 +339,7 @@ void HTTPHandler::processQuery( } else { - auto push_memory_buffer_and_continue = [next_buffer = used_output.out_maybe_compressed] (const WriteBufferPtr & prev_buf) + auto push_memory_buffer_and_continue = [next_buffer = used_output.out] (const WriteBufferPtr & prev_buf) { auto * prev_memory_buffer = typeid_cast(prev_buf.get()); if (!prev_memory_buffer) @@ -354,11 +355,11 @@ void HTTPHandler::processQuery( } used_output.out_delayed_and_compressed_holder = std::make_unique(std::move(cascade_buffers), std::move(cascade_buffers_lazy)); - used_output.out_maybe_delayed_and_compressed = used_output.out_delayed_and_compressed_holder.get(); + used_output.out_maybe_delayed_and_compressed = used_output.out_delayed_and_compressed_holder; } else { - used_output.out_maybe_delayed_and_compressed = used_output.out_maybe_compressed.get(); + used_output.out_maybe_delayed_and_compressed = used_output.out_maybe_compressed; } /// Request body can be compressed using algorithm specified in the Content-Encoding header. @@ -539,20 +540,26 @@ void HTTPHandler::processQuery( if (buffer_until_eof) { auto header = current_output_format.getPort(IOutputFormat::PortKind::Main).getHeader(); - used_output.exception_writer = [format_name, header, context_, format_settings](WriteBuffer & buf, const String & message) + used_output.exception_writer = [&, format_name, header, context_, format_settings](WriteBuffer & buf, int code, const String & message) { + drainRequestIfNeeded(request, response); + used_output.out_holder->setExceptionCode(code); auto output_format = FormatFactory::instance().getOutputFormat(format_name, buf, header, context_, format_settings); output_format->setException(message); output_format->finalize(); + used_output.finalize(); }; } else { bool with_stacktrace = (params.getParsed("stacktrace", false) && server.config().getBool("enable_http_stacktrace", true)); ExecutionStatus status = ExecutionStatus::fromCurrentException("", with_stacktrace); - setHTTPResponseStatusAndHeadersForException(status.code, request, response, used_output.out_holder.get(), log); + + drainRequestIfNeeded(request, response); + used_output.out_holder->setExceptionCode(status.code); current_output_format.setException(status.message); current_output_format.finalize(); + used_output.finalize(); used_output.exception_is_written = true; } } @@ -580,70 +587,63 @@ void HTTPHandler::processQuery( used_output.finalize(); } -void HTTPHandler::trySendExceptionToClient( - const std::string & s, int exception_code, HTTPServerRequest & request, HTTPServerResponse & response, Output & used_output) +bool HTTPHandler::trySendExceptionToClient( + int exception_code, const std::string & message, HTTPServerRequest & request, HTTPServerResponse & response, Output & used_output) try { - setHTTPResponseStatusAndHeadersForException(exception_code, request, response, used_output.out_holder.get(), log); - if (!used_output.out_holder && !used_output.exception_is_written) { /// If nothing was sent yet and we don't even know if we must compress the response. - WriteBufferFromHTTPServerResponse(response, request.getMethod() == HTTPRequest::HTTP_HEAD).writeln(s); + auto wb = WriteBufferFromHTTPServerResponse(response, request.getMethod() == HTTPRequest::HTTP_HEAD); + return wb.cancelWithException(request, exception_code, message, nullptr); } - else if (used_output.out_maybe_compressed) + + chassert(used_output.out_maybe_compressed); + + /// Destroy CascadeBuffer to actualize buffers' positions and reset extra references + if (used_output.hasDelayed()) { - /// Destroy CascadeBuffer to actualize buffers' positions and reset extra references - if (used_output.hasDelayed()) - { - /// do not call finalize here for CascadeWriteBuffer used_output.out_maybe_delayed_and_compressed, - /// exception is written into used_output.out_maybe_compressed later - /// HTTPHandler::trySendExceptionToClient is called with exception context, it is Ok to destroy buffers - used_output.out_delayed_and_compressed_holder.reset(); - used_output.out_maybe_delayed_and_compressed = nullptr; - } + /// do not call finalize here for CascadeWriteBuffer used_output.out_maybe_delayed_and_compressed, + /// exception is written into used_output.out_maybe_compressed later + auto write_buffers = used_output.out_delayed_and_compressed_holder->getResultBuffers(); + /// cancel the rest unused buffers + for (auto & wb : write_buffers) + if (wb.unique()) + wb->cancel(); - if (!used_output.exception_is_written) - { - /// Send the error message into already used (and possibly compressed) stream. - /// Note that the error message will possibly be sent after some data. - /// Also HTTP code 200 could have already been sent. - - /// If buffer has data, and that data wasn't sent yet, then no need to send that data - bool data_sent = used_output.out_holder->count() != used_output.out_holder->offset(); - - if (!data_sent) - { - used_output.out_maybe_compressed->position() = used_output.out_maybe_compressed->buffer().begin(); - used_output.out_holder->position() = used_output.out_holder->buffer().begin(); - } - - /// We might have special formatter for exception message. - if (used_output.exception_writer) - { - used_output.exception_writer(*used_output.out_maybe_compressed, s); - } - else - { - writeString(s, *used_output.out_maybe_compressed); - writeChar('\n', *used_output.out_maybe_compressed); - } - } - - used_output.out_maybe_compressed->next(); + used_output.out_maybe_delayed_and_compressed = used_output.out_maybe_compressed; + used_output.out_delayed_and_compressed_holder.reset(); } - else + + if (used_output.exception_is_written) { - UNREACHABLE(); + /// everything has been held by output format write + return true; } - used_output.finalize(); + /// We might have special formatter for exception message. + if (used_output.exception_writer) + { + used_output.exception_writer(*used_output.out_maybe_compressed, exception_code, message); + return true; + } + + /// This is the worst case scenario + /// There is no support from output_format. + /// output_format either did not faced the exception or did not support the exception writing + + /// Send the error message into already used (and possibly compressed) stream. + /// Note that the error message will possibly be sent after some data. + /// Also HTTP code 200 could have already been sent. + return used_output.out_holder->cancelWithException(request, exception_code, message, used_output.out_maybe_compressed.get()); } catch (...) { + /// The message could be not sent due to error on allocations + /// or due to exception in used_output.exception_writer + /// or because the socket is broken tryLogCurrentException(log, "Cannot send exception to client"); - - used_output.cancel(); + return false; } void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response, const ProfileEvents::Event & write_event) @@ -746,25 +746,18 @@ void HTTPHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse request_credentials.reset(); // ...so that the next requests on the connection have to always start afresh in case of exceptions. }); - /// Check if exception was thrown in used_output.finalize(). - /// In this case used_output can be in invalid state and we - /// cannot write in it anymore. So, just log this exception. - if (used_output.isFinalized() || used_output.isCanceled()) - { - if (thread_trace_context) - thread_trace_context->root_span.addAttribute("clickhouse.exception", "Cannot flush data to client"); - - tryLogCurrentException(log, "Cannot flush data to client"); - return; - } - tryLogCurrentException(log); /** If exception is received from remote server, then stack trace is embedded in message. * If exception is thrown on local server, then stack trace is in separate field. */ ExecutionStatus status = ExecutionStatus::fromCurrentException("", with_stacktrace); - trySendExceptionToClient(status.message, status.code, request, response, used_output); + auto error_sent = trySendExceptionToClient(status.code, status.message, request, response, used_output); + + used_output.cancel(); + + if (!error_sent && thread_trace_context) + thread_trace_context->root_span.addAttribute("clickhouse.exception", "Cannot flush data to client"); if (thread_trace_context) thread_trace_context->root_span.addAttribute(status); diff --git a/src/Server/HTTPHandler.h b/src/Server/HTTPHandler.h index 2296fa70aeb..39734e1f51a 100644 --- a/src/Server/HTTPHandler.h +++ b/src/Server/HTTPHandler.h @@ -85,19 +85,19 @@ private: std::shared_ptr out_maybe_compressed; /// If output should be delayed holds cascade buffer - std::unique_ptr out_delayed_and_compressed_holder; + std::shared_ptr out_delayed_and_compressed_holder; /// Points to out_maybe_compressed or to CascadeWriteBuffer. - WriteBuffer * out_maybe_delayed_and_compressed = nullptr; + std::shared_ptr out_maybe_delayed_and_compressed; bool finalized = false; bool canceled = false; bool exception_is_written = false; - std::function exception_writer; + std::function exception_writer; bool hasDelayed() const { - return out_maybe_delayed_and_compressed != out_maybe_compressed.get(); + return out_maybe_delayed_and_compressed && out_maybe_delayed_and_compressed != out_maybe_compressed; } void finalize() @@ -106,10 +106,14 @@ private: return; finalized = true; + if (out_delayed_and_compressed_holder) + out_delayed_and_compressed_holder->finalize(); if (out_compressed_holder) out_compressed_holder->finalize(); - if (out) - out->finalize(); + if (wrap_compressed_holder) + wrap_compressed_holder->finalize(); + if (out_holder) + out_holder->finalize(); } void cancel() @@ -118,10 +122,14 @@ private: return; canceled = true; + if (out_delayed_and_compressed_holder) + out_delayed_and_compressed_holder->cancel(); if (out_compressed_holder) out_compressed_holder->cancel(); - if (out) - out->cancel(); + if (wrap_compressed_holder) + wrap_compressed_holder->cancel(); + if (out_holder) + out_holder->cancel(); } @@ -169,9 +177,9 @@ private: std::optional & query_scope, const ProfileEvents::Event & write_event); - void trySendExceptionToClient( - const std::string & s, + bool trySendExceptionToClient( int exception_code, + const std::string & message, HTTPServerRequest & request, HTTPServerResponse & response, Output & used_output); diff --git a/src/Server/InterserverIOHTTPHandler.cpp b/src/Server/InterserverIOHTTPHandler.cpp index 5c6a8516d0f..e125738a18e 100644 --- a/src/Server/InterserverIOHTTPHandler.cpp +++ b/src/Server/InterserverIOHTTPHandler.cpp @@ -21,7 +21,7 @@ namespace DB namespace ErrorCodes { extern const int ABORTED; - extern const int TOO_MANY_SIMULTANEOUS_QUERIES; + extern const int REQUIRED_PASSWORD; } std::pair InterserverIOHTTPHandler::checkAuthentication(HTTPServerRequest & request) const @@ -49,7 +49,7 @@ std::pair InterserverIOHTTPHandler::checkAuthentication(HTTPServer return {"", true}; } -void InterserverIOHTTPHandler::processQuery(HTTPServerRequest & request, HTTPServerResponse & response, Output & used_output) +void InterserverIOHTTPHandler::processQuery(HTTPServerRequest & request, HTTPServerResponse & response, OutputPtr output) { HTMLForm params(server.context()->getSettingsRef(), request); @@ -68,12 +68,13 @@ void InterserverIOHTTPHandler::processQuery(HTTPServerRequest & request, HTTPSer if (compress) { - CompressedWriteBuffer compressed_out(*used_output.out); + CompressedWriteBuffer compressed_out(*output); endpoint->processQuery(params, body, compressed_out, response); + compressed_out.finalize(); } else { - endpoint->processQuery(params, body, *used_output.out, response); + endpoint->processQuery(params, body, *output, response); } } @@ -86,85 +87,42 @@ void InterserverIOHTTPHandler::handleRequest(HTTPServerRequest & request, HTTPSe if (request.getVersion() == HTTPServerRequest::HTTP_1_1) response.setChunkedTransferEncoding(true); - Output used_output; - used_output.out = std::make_shared( + auto output = std::make_shared( response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD, write_event); - auto finalize_output = [&] - { - try - { - used_output.out->finalize(); - } - catch (...) - { - tryLogCurrentException(log, "Failed to finalize response write buffer"); - } - }; - - auto write_response = [&](const std::string & message) - { - if (response.sent()) - { - finalize_output(); - return; - } - - try - { - writeString(message, *used_output.out); - finalize_output(); - } - catch (...) - { - tryLogCurrentException(log); - finalize_output(); - } - }; - try { - if (auto [message, success] = checkAuthentication(request); success) + auto [message, success] = checkAuthentication(request); + if (success) { - processQuery(request, response, used_output); - finalize_output(); + processQuery(request, response, output); + output->finalize(); LOG_DEBUG(log, "Done processing query"); } else { - response.setStatusAndReason(HTTPServerResponse::HTTP_UNAUTHORIZED); - write_response(message); LOG_WARNING(log, "Query processing failed request: '{}' authentication failed", request.getURI()); + output->cancelWithException(request, ErrorCodes::REQUIRED_PASSWORD, message, nullptr); } } catch (Exception & e) { - if (e.code() == ErrorCodes::TOO_MANY_SIMULTANEOUS_QUERIES) - { - used_output.out->finalize(); - return; - } - - response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); - /// Sending to remote server was cancelled due to server shutdown or drop table. bool is_real_error = e.code() != ErrorCodes::ABORTED; - - PreformattedMessage message = getCurrentExceptionMessageAndPattern(is_real_error); - write_response(message.text); - + PreformattedMessage message = getCurrentExceptionMessageAndPattern(/* with_stacktrace */ is_real_error); if (is_real_error) LOG_ERROR(log, message); else LOG_INFO(log, message); + + output->cancelWithException(request, getCurrentExceptionCode(), message.text, nullptr); } catch (...) { - response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); PreformattedMessage message = getCurrentExceptionMessageAndPattern(/* with_stacktrace */ false); - write_response(message.text); - LOG_ERROR(log, message); + + output->cancelWithException(request, getCurrentExceptionCode(), message.text, nullptr); } } diff --git a/src/Server/InterserverIOHTTPHandler.h b/src/Server/InterserverIOHTTPHandler.h index 226a06f5a45..a3db7275315 100644 --- a/src/Server/InterserverIOHTTPHandler.h +++ b/src/Server/InterserverIOHTTPHandler.h @@ -33,17 +33,14 @@ public: void handleRequest(HTTPServerRequest & request, HTTPServerResponse & response, const ProfileEvents::Event & write_event) override; private: - struct Output - { - std::shared_ptr out; - }; + using OutputPtr = std::shared_ptr; IServer & server; LoggerPtr log; CurrentMetrics::Increment metric_increment{CurrentMetrics::InterserverConnection}; - void processQuery(HTTPServerRequest & request, HTTPServerResponse & response, Output & used_output); + void processQuery(HTTPServerRequest & request, HTTPServerResponse & response, OutputPtr used_output); std::pair checkAuthentication(HTTPServerRequest & request) const; }; diff --git a/src/Server/KeeperTCPHandler.cpp b/src/Server/KeeperTCPHandler.cpp index 8b0887e69ba..68b1315f6e7 100644 --- a/src/Server/KeeperTCPHandler.cpp +++ b/src/Server/KeeperTCPHandler.cpp @@ -534,12 +534,14 @@ void KeeperTCPHandler::runImpl() break; } } + finalizeWriteBuffer(); } catch (const Exception & ex) { log_long_operation("Unknown operation"); LOG_TRACE(log, "Has {} responses in the queue", responses->size()); LOG_INFO(log, "Got exception processing session #{}: {}", session_id, getExceptionMessage(ex, true)); + cancelWriteBuffer(); keeper_dispatcher->finishSession(session_id); } } @@ -594,6 +596,20 @@ void KeeperTCPHandler::flushWriteBuffer() out->next(); } +void KeeperTCPHandler::finalizeWriteBuffer() +{ + if (compressed_out) + compressed_out->finalize(); + out->finalize(); +} + +void KeeperTCPHandler::cancelWriteBuffer() noexcept +{ + if (compressed_out) + compressed_out->cancel(); + out->cancel(); +} + ReadBuffer & KeeperTCPHandler::getReadBuffer() { if (compressed_in) @@ -739,6 +755,7 @@ void KeeperTCPHandler::resetStats() KeeperTCPHandler::~KeeperTCPHandler() { + cancelWriteBuffer(); KeeperTCPHandler::unregisterConnection(this); } diff --git a/src/Server/KeeperTCPHandler.h b/src/Server/KeeperTCPHandler.h index 5fe284ecfdd..5c92110f587 100644 --- a/src/Server/KeeperTCPHandler.h +++ b/src/Server/KeeperTCPHandler.h @@ -98,6 +98,8 @@ private: WriteBuffer & getWriteBuffer(); void flushWriteBuffer(); + void finalizeWriteBuffer(); + void cancelWriteBuffer() noexcept; ReadBuffer & getReadBuffer(); void sendHandshake(bool has_leader, bool & use_compression); diff --git a/src/Server/MySQLHandler.cpp b/src/Server/MySQLHandler.cpp index e0c684b493b..55cdceaebb6 100644 --- a/src/Server/MySQLHandler.cpp +++ b/src/Server/MySQLHandler.cpp @@ -1,6 +1,5 @@ #include "MySQLHandler.h" -#include #include #include #include @@ -15,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -216,14 +216,14 @@ void MySQLHandler::run() socket().setSendTimeout(settings[Setting::send_timeout]); in = std::make_shared(socket(), read_event); - out = std::make_shared(socket(), write_event); + out = std::make_shared>(socket(), write_event); packet_endpoint = std::make_shared(*in, *out, sequence_id); try { Handshake handshake(server_capabilities, connection_id, VERSION_STRING + String("-") + VERSION_NAME, auth_plugin->getName(), auth_plugin->getAuthPluginData(), CharacterSet::utf8_general_ci); - packet_endpoint->sendPacket(handshake, true); + packet_endpoint->sendPacket(handshake); LOG_TRACE(log, "Sent handshake"); @@ -257,11 +257,11 @@ void MySQLHandler::run() catch (const Exception & exc) { log->log(exc); - packet_endpoint->sendPacket(ERRPacket(exc.code(), "00000", exc.message()), true); + packet_endpoint->sendPacket(ERRPacket(exc.code(), "00000", exc.message())); } OKPacket ok_packet(0, handshake_response.capability_flags, 0, 0, 0); - packet_endpoint->sendPacket(ok_packet, true); + packet_endpoint->sendPacket(ok_packet); while (tcp_server.isOpen()) { @@ -275,7 +275,7 @@ void MySQLHandler::run() payload.readStrict(command); // For commands which are executed without MemoryTracker. - LimitReadBuffer limited_payload(payload, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet."); + LimitReadBuffer limited_payload(payload, {.read_no_more = 1000, .expect_eof = true, .excetion_hint = "too long MySQL packet."}); LOG_DEBUG(log, "Received command: {}. Connection id: {}.", static_cast(static_cast(command)), connection_id); @@ -321,7 +321,7 @@ void MySQLHandler::run() catch (...) { tryLogCurrentException(log, "MySQLHandler: Cannot read packet: "); - packet_endpoint->sendPacket(ERRPacket(getCurrentExceptionCode(), "00000", getCurrentExceptionMessage(false)), true); + packet_endpoint->sendPacket(ERRPacket(getCurrentExceptionCode(), "00000", getCurrentExceptionMessage(false))); } } } @@ -400,7 +400,7 @@ void MySQLHandler::authenticate(const String & user_name, const String & auth_pl catch (const Exception & exc) { LOG_ERROR(log, "Authentication for user {} failed.", user_name); - packet_endpoint->sendPacket(ERRPacket(exc.code(), "00000", exc.message()), true); + packet_endpoint->sendPacket(ERRPacket(exc.code(), "00000", exc.message())); throw; } LOG_DEBUG(log, "Authentication for user {} succeeded.", user_name); @@ -412,7 +412,7 @@ void MySQLHandler::comInitDB(ReadBuffer & payload) readStringUntilEOF(database, payload); LOG_DEBUG(log, "Setting current database to {}", database); session->sessionContext()->setCurrentDatabase(database); - packet_endpoint->sendPacket(OKPacket(0, client_capabilities, 0, 0, 1), true); + packet_endpoint->sendPacket(OKPacket(0, client_capabilities, 0, 0, 1)); } void MySQLHandler::comFieldList(ReadBuffer & payload) @@ -430,12 +430,12 @@ void MySQLHandler::comFieldList(ReadBuffer & payload) ); packet_endpoint->sendPacket(column_definition); } - packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, 0, 0, 0)); } void MySQLHandler::comPing() { - packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x0, client_capabilities, 0, 0, 0)); } void MySQLHandler::comQuery(ReadBuffer & payload, bool binary_protocol) @@ -446,7 +446,7 @@ void MySQLHandler::comQuery(ReadBuffer & payload, bool binary_protocol) // As Clickhouse doesn't support these statements, we just send OK packet in response. if (isFederatedServerSetupSetCommand(query)) { - packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, 0, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, 0, 0, 0)); } else { @@ -531,7 +531,7 @@ void MySQLHandler::comQuery(ReadBuffer & payload, bool binary_protocol) if (!with_output) - packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, affected_rows, 0, 0), true); + packet_endpoint->sendPacket(OKPacket(0x00, client_capabilities, affected_rows, 0, 0)); } } @@ -542,9 +542,9 @@ void MySQLHandler::comStmtPrepare(DB::ReadBuffer & payload) auto statement_id_opt = emplacePreparedStatement(std::move(statement)); if (statement_id_opt.has_value()) - packet_endpoint->sendPacket(PreparedStatementResponseOK(statement_id_opt.value(), 0, 0, 0), true); + packet_endpoint->sendPacket(PreparedStatementResponseOK(statement_id_opt.value(), 0, 0, 0)); else - packet_endpoint->sendPacket(ERRPacket(), true); + packet_endpoint->sendPacket(ERRPacket()); } void MySQLHandler::comStmtExecute(ReadBuffer & payload) @@ -556,7 +556,7 @@ void MySQLHandler::comStmtExecute(ReadBuffer & payload) if (statement_opt.has_value()) MySQLHandler::comQuery(statement_opt.value(), true); else - packet_endpoint->sendPacket(ERRPacket(), true); + packet_endpoint->sendPacket(ERRPacket()); }; void MySQLHandler::comStmtClose(ReadBuffer & payload) @@ -671,7 +671,7 @@ void MySQLHandlerSSL::finishHandshakeSSL( ss->setSendTimeout(socket().getSendTimeout()); in = std::make_shared(*ss); - out = std::make_shared(*ss); + out = std::make_shared>(*ss); sequence_id = 2; packet_endpoint = std::make_shared(*in, *out, sequence_id); packet_endpoint->receivePacket(packet); /// Reading HandshakeResponse from secure socket. diff --git a/src/Server/PostgreSQLHandler.cpp b/src/Server/PostgreSQLHandler.cpp index 6a06a413d62..5dad826cde4 100644 --- a/src/Server/PostgreSQLHandler.cpp +++ b/src/Server/PostgreSQLHandler.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -60,7 +61,7 @@ PostgreSQLHandler::PostgreSQLHandler( void PostgreSQLHandler::changeIO(Poco::Net::StreamSocket & socket) { in = std::make_shared(socket, read_event); - out = std::make_shared(socket, write_event); + out = std::make_shared>(socket, write_event); message_transport = std::make_shared(in.get(), out.get()); } @@ -94,6 +95,7 @@ void PostgreSQLHandler::run() { case PostgreSQLProtocol::Messaging::FrontMessageType::QUERY: processQuery(); + message_transport->flush(); break; case PostgreSQLProtocol::Messaging::FrontMessageType::TERMINATE: LOG_DEBUG(log, "Client closed the connection"); @@ -206,7 +208,7 @@ void PostgreSQLHandler::establishSecureConnection(Int32 & payload_size, Int32 & #if USE_SSL void PostgreSQLHandler::makeSecureConnectionSSL() { - message_transport->send('S'); + message_transport->send('S', true); ss = std::make_shared( Poco::Net::SecureStreamSocket::attach(socket(), Poco::Net::SSLManager::instance().defaultServerContext())); changeIO(*ss); diff --git a/src/Server/PrometheusRequestHandler.cpp b/src/Server/PrometheusRequestHandler.cpp index 9c521e06667..9bf25863f3f 100644 --- a/src/Server/PrometheusRequestHandler.cpp +++ b/src/Server/PrometheusRequestHandler.cpp @@ -34,7 +34,6 @@ namespace ErrorCodes { extern const int BAD_ARGUMENTS; extern const int SUPPORT_IS_DISABLED; - extern const int LOGICAL_ERROR; } /// Base implementation of a prometheus protocol. @@ -53,7 +52,7 @@ protected: const PrometheusRequestHandlerConfig & config() { return parent().config; } PrometheusMetricsWriter & metrics_writer() { return *parent().metrics_writer; } LoggerPtr log() { return parent().log; } - WriteBuffer & getOutputHeader(HTTPServerResponse & response) { return parent().getOutputHeader(response); } + WriteBuffer & getOutputStream(HTTPServerResponse & response) { return parent().getOutputStream(response); } private: PrometheusRequestHandler & parent_ref; @@ -75,7 +74,7 @@ public: void handleRequest(HTTPServerRequest & /* request */, HTTPServerResponse & response) override { response.setContentType("text/plain; version=0.0.4; charset=UTF-8"); - auto & out = getOutputHeader(response); + auto & out = getOutputStream(response); if (config().expose_events) metrics_writer().writeEvents(out); @@ -289,7 +288,7 @@ public: response.setContentType("application/x-protobuf"); response.set("Content-Encoding", "snappy"); - ProtobufZeroCopyOutputStreamFromWriteBuffer zero_copy_output_stream{std::make_unique(getOutputHeader(response))}; + ProtobufZeroCopyOutputStreamFromWriteBuffer zero_copy_output_stream{std::make_unique(getOutputStream(response))}; read_response.SerializeToZeroCopyStream(&zero_copy_output_stream); zero_copy_output_stream.finalize(); @@ -345,7 +344,6 @@ void PrometheusRequestHandler::handleRequest(HTTPServerRequest & request, HTTPSe try { - response_finalized = false; write_event = write_event_; http_method = request.getMethod(); chassert(!write_buffer_from_response); /// Nothing is written to the response yet. @@ -359,79 +357,30 @@ void PrometheusRequestHandler::handleRequest(HTTPServerRequest & request, HTTPSe impl->beforeHandlingRequest(request); impl->handleRequest(request, response); - finalizeResponse(response); + getOutputStream(response).finalize(); } catch (...) { tryLogCurrentException(log); ExecutionStatus status = ExecutionStatus::fromCurrentException("", send_stacktrace); - trySendExceptionToClient(status.message, status.code, request, response); - tryFinalizeResponse(response); + getOutputStream(response).cancelWithException(request, status.code, status.message, nullptr); tryCallOnException(); } } -WriteBufferFromHTTPServerResponse & PrometheusRequestHandler::getOutputHeader(HTTPServerResponse & response) +WriteBufferFromHTTPServerResponse & PrometheusRequestHandler::getOutputStream(HTTPServerResponse & response) { - if (response_finalized) - throw Exception(ErrorCodes::LOGICAL_ERROR, "PrometheusRequestHandler: Response already sent"); if (write_buffer_from_response) return *write_buffer_from_response; + write_buffer_from_response = std::make_unique( response, http_method == HTTPRequest::HTTP_HEAD, write_event); + return *write_buffer_from_response; } -void PrometheusRequestHandler::finalizeResponse(HTTPServerResponse & response) -{ - if (response_finalized) - { - /// Response is already finalized or at least tried to. We don't need the write buffer anymore in either case. - write_buffer_from_response = nullptr; - } - else - { - /// We set `response_finalized = true` before actually calling `write_buffer_from_response->finalize()` - /// because we shouldn't call finalize() again even if finalize() throws an exception. - response_finalized = true; - - if (write_buffer_from_response) - std::exchange(write_buffer_from_response, {})->finalize(); - else - WriteBufferFromHTTPServerResponse{response, http_method == HTTPRequest::HTTP_HEAD, write_event}.finalize(); - } - chassert(response_finalized && !write_buffer_from_response); -} - -void PrometheusRequestHandler::trySendExceptionToClient(const String & exception_message, int exception_code, HTTPServerRequest & request, HTTPServerResponse & response) -{ - if (response_finalized) - return; /// Response is already finalized (or tried to). We can't write the error message to the response in either case. - - try - { - sendExceptionToHTTPClient(exception_message, exception_code, request, response, &getOutputHeader(response), log); - } - catch (...) - { - tryLogCurrentException(log, "Couldn't send exception to client"); - } -} - -void PrometheusRequestHandler::tryFinalizeResponse(HTTPServerResponse & response) -{ - try - { - finalizeResponse(response); - } - catch (...) - { - tryLogCurrentException(log, "Cannot flush data to client (after sending exception)"); - } -} - void PrometheusRequestHandler::tryCallOnException() { try diff --git a/src/Server/PrometheusRequestHandler.h b/src/Server/PrometheusRequestHandler.h index b5a844f25f7..1b9bb92a335 100644 --- a/src/Server/PrometheusRequestHandler.h +++ b/src/Server/PrometheusRequestHandler.h @@ -29,14 +29,7 @@ private: void createImpl(); /// Returns the write buffer used for the current HTTP response. - WriteBufferFromHTTPServerResponse & getOutputHeader(HTTPServerResponse & response); - - /// Finalizes the output stream and sends the response to the client. - void finalizeResponse(HTTPServerResponse & response); - void tryFinalizeResponse(HTTPServerResponse & response); - - /// Writes the current exception to the response. - void trySendExceptionToClient(const String & exception_message, int exception_code, HTTPServerRequest & request, HTTPServerResponse & response); + WriteBufferFromHTTPServerResponse & getOutputStream(HTTPServerResponse & response); /// Calls onException() in a try-catch block. void tryCallOnException(); @@ -55,10 +48,9 @@ private: std::unique_ptr impl; String http_method; - bool send_stacktrace = false; std::unique_ptr write_buffer_from_response; - bool response_finalized = false; ProfileEvents::Event write_event; + bool send_stacktrace = false; }; } diff --git a/src/Server/StaticRequestHandler.cpp b/src/Server/StaticRequestHandler.cpp index e5cdde8a8cd..56800e950e0 100644 --- a/src/Server/StaticRequestHandler.cpp +++ b/src/Server/StaticRequestHandler.cpp @@ -1,8 +1,9 @@ -#include "StaticRequestHandler.h" -#include "IServer.h" +#include +#include -#include "HTTPHandlerFactory.h" -#include "HTTPResponseHeaderWriter.h" +#include +#include +#include #include #include @@ -16,6 +17,7 @@ #include +#include #include #include #include @@ -36,9 +38,34 @@ namespace ErrorCodes extern const int INVALID_CONFIG_PARAMETER; } -static inline std::unique_ptr responseWriteBuffer(HTTPServerRequest & request, HTTPServerResponse & response) +struct ResponseOutput { - auto buf = std::unique_ptr(new WriteBufferFromHTTPServerResponse(response, request.getMethod() == HTTPRequest::HTTP_HEAD)); + std::unique_ptr response_holder; + std::unique_ptr compression_holder; + + explicit ResponseOutput(std::unique_ptr && buf) + : response_holder(std::move(buf)) + { + } + + void setCompressedOut(std::unique_ptr && buf) + { + chassert(response_holder); + chassert(!compression_holder); + compression_holder = std::move(buf); + } + + WriteBuffer * get() const + { + if (compression_holder) + return compression_holder.get(); + return response_holder.get(); + } +}; + +static inline ResponseOutput responseWriteBuffer(HTTPServerRequest & request, HTTPServerResponse & response) +{ + auto result = ResponseOutput(std::make_unique(response, request.getMethod() == HTTPRequest::HTTP_HEAD)); /// The client can pass a HTTP header indicating supported compression method (gzip or deflate). String http_response_compression_methods = request.get("Accept-Encoding", ""); @@ -48,45 +75,12 @@ static inline std::unique_ptr responseWriteBuffer(HTTPServerRequest http_response_compression_method = chooseHTTPCompressionMethod(http_response_compression_methods); if (http_response_compression_method == CompressionMethod::None) - return buf; + return result; response.set("Content-Encoding", toContentEncodingName(http_response_compression_method)); - return wrapWriteBufferWithCompressionMethod(std::move(buf), http_response_compression_method, 1); -} + result.setCompressedOut(wrapWriteBufferWithCompressionMethod(result.get(), http_response_compression_method, 1, 0)); -static inline void trySendExceptionToClient( - const std::string & s, int exception_code, HTTPServerRequest & request, HTTPServerResponse & response, WriteBuffer & out) -{ - try - { - response.set("X-ClickHouse-Exception-Code", toString(exception_code)); - - /// If HTTP method is POST and Keep-Alive is turned on, we should read the whole request body - /// to avoid reading part of the current request body in the next request. - if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST - && response.getKeepAlive() && !request.getStream().eof() && exception_code != ErrorCodes::HTTP_LENGTH_REQUIRED) - request.getStream().ignore(std::numeric_limits::max()); - - response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); - - if (!response.sent()) - *response.send() << s << '\n'; - else - { - if (out.count() != out.offset()) - out.position() = out.buffer().begin(); - - writeString(s, out); - writeChar('\n', out); - - out.next(); - out.finalize(); - } - } - catch (...) - { - tryLogCurrentException("StaticRequestHandler", "Cannot send exception to client"); - } + return result; } void StaticRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response, const ProfileEvents::Event & /*write_event*/) @@ -96,7 +90,7 @@ void StaticRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServer if (request.getVersion() == Poco::Net::HTTPServerRequest::HTTP_1_1) response.setChunkedTransferEncoding(true); - auto out = responseWriteBuffer(request, response); + auto responseOutput = responseWriteBuffer(request, response); try { @@ -108,18 +102,15 @@ void StaticRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServer setResponseDefaultHeaders(response); response.setStatusAndReason(Poco::Net::HTTPResponse::HTTPStatus(status)); - writeResponse(*out); + writeResponse(*responseOutput.get()); + responseOutput.get()->finalize(); } catch (...) { tryLogCurrentException("StaticRequestHandler"); - - int exception_code = getCurrentExceptionCode(); - std::string exception_message = getCurrentExceptionMessage(false, true); - trySendExceptionToClient(exception_message, exception_code, request, response, *out); + responseOutput.response_holder->cancelWithException( + request, getCurrentExceptionCode(), getCurrentExceptionMessage(false, true), responseOutput.compression_holder.get()); } - - out->finalize(); } void StaticRequestHandler::writeResponse(WriteBuffer & out) diff --git a/src/Server/TCPHandler.cpp b/src/Server/TCPHandler.cpp index 4f54918445f..01f6af348c5 100644 --- a/src/Server/TCPHandler.cpp +++ b/src/Server/TCPHandler.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +47,8 @@ #include #include #include +#include +#include #include #include @@ -57,12 +63,17 @@ #include #include +#include + #include "TCPHandler.h" #include #include +#include +#include + using namespace std::literals; using namespace DB; @@ -128,23 +139,32 @@ namespace ProfileEvents namespace DB::ErrorCodes { - extern const int LOGICAL_ERROR; + extern const int ABORTED; extern const int ATTEMPT_TO_READ_AFTER_EOF; + extern const int AUTHENTICATION_FAILED; extern const int CLIENT_HAS_CONNECTED_TO_WRONG_PORT; + extern const int CLIENT_INFO_DOES_NOT_MATCH; + extern const int LOGICAL_ERROR; + extern const int NETWORK_ERROR; + extern const int SOCKET_TIMEOUT; + extern const int SUPPORT_IS_DISABLED; + extern const int TIMEOUT_EXCEEDED; + extern const int UNEXPECTED_PACKET_FROM_CLIENT; extern const int UNKNOWN_EXCEPTION; extern const int UNKNOWN_PACKET_FROM_CLIENT; - extern const int POCO_EXCEPTION; - extern const int SOCKET_TIMEOUT; - extern const int UNEXPECTED_PACKET_FROM_CLIENT; extern const int UNKNOWN_PROTOCOL; - extern const int AUTHENTICATION_FAILED; - extern const int QUERY_WAS_CANCELLED; - extern const int CLIENT_INFO_DOES_NOT_MATCH; - extern const int TIMEOUT_EXCEEDED; - extern const int SUPPORT_IS_DISABLED; extern const int UNSUPPORTED_METHOD; extern const int USER_EXPIRED; - extern const int NETWORK_ERROR; + + // We have to distinguish the case when query is killed by `KILL QUERY` statement + // and when it is killed by `Protocol::Client::Cancel` packet. + + // When query is killed by `KILL QUERY` statement we have to end the execution + // and send the exception to the actual client which initiated the TCP connection. + + // When query is killed by `Protocol::Client::Cancel` packet we just stop execution, + // there is no need to send the exception which has been caused by the cancel packet. + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; } namespace @@ -208,6 +228,26 @@ void validateClientInfo(const ClientInfo & session_client_info, const ClientInfo // os_user, quota_key, client_trace_context can be different. } } +struct TurnOffBoolSettingTemporary +{ + bool & setting; + bool prev_val; + + explicit TurnOffBoolSettingTemporary(bool & setting_) + : setting(setting_) + , prev_val(setting_) + { + if (prev_val) + setting = false; + } + + ~TurnOffBoolSettingTemporary() + { + if (prev_val) + setting = true; + } +}; + } namespace DB @@ -259,19 +299,9 @@ TCPHandler::TCPHandler( LOG_TRACE(log, "Forwarded client address: {}", forwarded_for); } -TCPHandler::~TCPHandler() -{ - try - { - state.reset(); - if (out) - out->next(); - } - catch (...) - { - tryLogCurrentException(__PRETTY_FUNCTION__); - } -} + +TCPHandler::~TCPHandler() = default; + void TCPHandler::runImpl() { @@ -284,7 +314,6 @@ void TCPHandler::runImpl() socket().setNoDelay(true); in = std::make_shared(socket(), read_event); - out = std::make_shared(socket(), write_event); /// Support for PROXY protocol if (parse_proxy_protocol && !receiveProxyHeader()) @@ -296,6 +325,8 @@ void TCPHandler::runImpl() return; } + out = std::make_shared>(socket(), write_event); + /// User will be authenticated here. It will also set settings from user profile into connection_context. try { @@ -309,6 +340,7 @@ void TCPHandler::runImpl() session->makeSessionContext(); sendHello(); + if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_ADDENDUM) receiveAddendum(); @@ -384,17 +416,25 @@ void TCPHandler::runImpl() /// We try to send error information to the client. sendException(e, send_exception_with_stack_trace); } - catch (...) {} // NOLINT(bugprone-empty-catch) + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } throw; } while (tcp_server.isOpen()) { + /// We don't really have session in interserver mode, new one is created for each query. It's better to reset it now. + if (is_interserver_mode) + session.reset(); + /// We are waiting for a packet from the client. Thus, every `poll_interval` seconds check whether we need to shut down. { Stopwatch idle_time; UInt64 timeout_ms = std::min(poll_interval, idle_connection_timeout) * 1000000; + while (tcp_server.isOpen() && !server.isCancelled() && !in->poll(timeout_ms)) { if (idle_time.elapsedSeconds() > idle_connection_timeout) @@ -403,291 +443,331 @@ void TCPHandler::runImpl() return; } } + + /// If we need to shut down, or client disconnects. + if (!tcp_server.isOpen() || server.isCancelled() || in->eof()) + { + LOG_TEST(log, "Closing connection (open: {}, cancelled: {}, eof: {})", tcp_server.isOpen(), server.isCancelled(), in->eof()); + return; + } } - /// If we need to shut down, or client disconnects. - if (!tcp_server.isOpen() || server.isCancelled() || in->eof()) - { - LOG_TEST(log, "Closing connection (open: {}, cancelled: {}, eof: {})", tcp_server.isOpen(), server.isCancelled(), in->eof()); - break; - } - - state.reset(); - - /// Initialized later. - std::optional query_scope; - OpenTelemetry::TracingContextHolderPtr thread_trace_context; - /** An exception during the execution of request (it must be sent over the network to the client). * The client will be able to accept it, if it did not happen while sending another packet and the client has not disconnected yet. */ std::unique_ptr exception; - bool network_error = false; - bool user_expired = false; - bool query_duration_already_logged = false; - auto log_query_duration = [this, &query_duration_already_logged]() - { - if (query_duration_already_logged) - return; - query_duration_already_logged = true; - auto elapsed_sec = state.watch.elapsedSeconds(); - /// We already logged more detailed info if we read some rows - if (elapsed_sec < 1.0 && state.progress.read_rows) - return; - LOG_DEBUG(log, "Processed in {} sec.", elapsed_sec); - }; + + SCOPE_EXIT({ + if (exception) + { + if (exception->code() == ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT) + LOG_INFO(log, getExceptionMessageAndPattern(*exception, send_exception_with_stack_trace)); + else + LOG_ERROR(log, getExceptionMessageAndPattern(*exception, send_exception_with_stack_trace)); + } + }); + + OpenTelemetry::TracingContextHolderPtr thread_trace_context; + /// Initialized later. It has to be destroyed after query_state is destroyed. + std::optional query_scope; + /// QueryState should be cleared before QueryScope, since otherwise + /// the MemoryTracker will be wrong for possible deallocations. + /// (i.e. deallocations from the Aggregator with two-level aggregation) + /// Also it resets socket's timeouts. + std::optional query_state; try { /** If Query - process it. If Ping or Cancel - go back to the beginning. - * There may come settings for a separate query that modify `query_context`. - * It's possible to receive part uuids packet before the query, so then receivePacket has to be called twice. - */ - if (!receivePacket()) + * There may come settings for a separate query that modify `query_context`. + * It's possible to receive part uuids packet before the query, so then receivePacket has to be called twice. + */ + if (!receivePacketsExpectQuery(query_state)) continue; /** If part_uuids got received in previous packet, trying to read again. - */ - if (state.empty() && state.part_uuids_to_ignore && !receivePacket()) + */ + if (part_uuids_to_ignore.has_value() && !receivePacketsExpectQuery(query_state)) continue; + chassert(query_state.has_value()); + /// Set up tracing context for this query on current thread thread_trace_context = std::make_unique("TCPHandler", - query_context->getClientInfo().client_trace_context, - query_context->getSettingsRef(), - query_context->getOpenTelemetrySpanLog()); + query_state->query_context->getClientInfo().client_trace_context, + query_state->query_context->getSettingsRef(), + query_state->query_context->getOpenTelemetrySpanLog()); thread_trace_context->root_span.kind = OpenTelemetry::SpanKind::SERVER; - query_scope.emplace(query_context, /* fatal_error_callback */ [this] + query_scope.emplace(query_state->query_context, /* fatal_error_callback */ [this, &query_state] { - std::lock_guard lock(out_mutex); - sendLogs(); + std::lock_guard lock(callback_mutex); + sendLogs(query_state.value()); }); /// If query received, then settings in query_context has been updated. /// So it's better to update the connection settings for flexibility. - extractConnectionSettingsFromContext(query_context); + extractConnectionSettingsFromContext(query_state->query_context); /// Sync timeouts on client and server during current query to avoid dangling queries on server. /// It should be reset at the end of query. - state.timeout_setter = std::make_unique(socket(), send_timeout, receive_timeout); + query_state->timeout_setter = std::make_unique(socket(), send_timeout, receive_timeout); + + SCOPE_EXIT(logQueryDuration(query_state.value())); /// Should we send internal logs to client? - const auto client_logs_level = query_context->getSettingsRef()[Setting::send_logs_level]; + const auto client_logs_level = query_state->query_context->getSettingsRef()[Setting::send_logs_level]; if (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_SERVER_LOGS && client_logs_level != LogsLevel::none) { - state.logs_queue = std::make_shared(); - state.logs_queue->max_priority = Poco::Logger::parseLevel(client_logs_level.toString()); - state.logs_queue->setSourceRegexp(query_context->getSettingsRef()[Setting::send_logs_source_regexp]); - CurrentThread::attachInternalTextLogsQueue(state.logs_queue, client_logs_level); + query_state->logs_queue = std::make_shared(); + query_state->logs_queue->max_priority = Poco::Logger::parseLevel(client_logs_level.toString()); + query_state->logs_queue->setSourceRegexp(query_state->query_context->getSettingsRef()[Setting::send_logs_source_regexp]); + CurrentThread::attachInternalTextLogsQueue(query_state->logs_queue, client_logs_level); } if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_INCREMENTAL_PROFILE_EVENTS) { - state.profile_queue = std::make_shared(std::numeric_limits::max()); - CurrentThread::attachInternalProfileEventsQueue(state.profile_queue); + query_state->profile_queue = std::make_shared(std::numeric_limits::max()); + CurrentThread::attachInternalProfileEventsQueue(query_state->profile_queue); } if (!is_interserver_mode) session->checkIfUserIsStillValid(); - query_context->setExternalTablesInitializer([this] (ContextPtr context) + query_state->query_context->setExternalTablesInitializer([this, &query_state] (ContextPtr context) { - if (context != query_context) + if (context != query_state->query_context) throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected context in external tables initializer"); + std::lock_guard lock(callback_mutex); + + checkIfQueryCanceled(query_state.value()); + /// Get blocks of temporary tables - readData(); + readData(query_state.value()); /// Reset the input stream, as we received an empty block while receiving external table data. /// So, the stream has been marked as cancelled and we can't read from it anymore. - state.block_in.reset(); - state.maybe_compressed_in.reset(); /// For more accurate accounting by MemoryTracker. + query_state->block_in.reset(); + query_state->maybe_compressed_in.reset(); /// For more accurate accounting by MemoryTracker. }); /// Send structure of columns to client for function input() - query_context->setInputInitializer([this] (ContextPtr context, const StoragePtr & input_storage) + query_state->query_context->setInputInitializer([this, &query_state] (ContextPtr context, const StoragePtr & input_storage) { - if (context != query_context) + + if (context != query_state->query_context) throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected context in Input initializer"); auto metadata_snapshot = input_storage->getInMemoryMetadataPtr(); - state.need_receive_data_for_input = true; + + std::lock_guard lock(callback_mutex); + + checkIfQueryCanceled(query_state.value()); + + query_state->need_receive_data_for_input = true; /// Send ColumnsDescription for input storage. if (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_COLUMN_DEFAULTS_METADATA - && query_context->getSettingsRef()[Setting::input_format_defaults_for_omitted_fields]) + && query_state->query_context->getSettingsRef()[Setting::input_format_defaults_for_omitted_fields]) { - sendTableColumns(metadata_snapshot->getColumns()); + sendTableColumns(query_state.value(), metadata_snapshot->getColumns()); } /// Send block to the client - input storage structure. - state.input_header = metadata_snapshot->getSampleBlock(); - sendData(state.input_header); - sendTimezone(); + query_state->input_header = metadata_snapshot->getSampleBlock(); + sendData(query_state.value(), query_state->input_header); + sendTimezone(query_state.value()); }); - query_context->setInputBlocksReaderCallback([this] (ContextPtr context) -> Block + query_state->query_context->setInputBlocksReaderCallback([this, &query_state] (ContextPtr context) -> Block { - if (context != query_context) + if (context != query_state->query_context) throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected context in InputBlocksReader"); - if (!readDataNext()) - { - state.block_in.reset(); - state.maybe_compressed_in.reset(); - return Block(); - } - return state.block_for_input; + std::lock_guard lock(callback_mutex); + + checkIfQueryCanceled(query_state.value()); + + if (receivePacketsExpectData(query_state.value())) + return query_state->block_for_input; + + query_state->read_all_data = true; + query_state->block_in.reset(); + query_state->maybe_compressed_in.reset(); + return {}; }); - customizeContext(query_context); + customizeContext(query_state->query_context); /// This callback is needed for requesting read tasks inside pipeline for distributed processing - query_context->setReadTaskCallback([this]() -> String + query_state->query_context->setReadTaskCallback([this, &query_state]() -> String { Stopwatch watch; CurrentMetrics::Increment callback_metric_increment(CurrentMetrics::ReadTaskRequestsSent); - std::scoped_lock lock(out_mutex, task_callback_mutex); + std::lock_guard lock(callback_mutex); - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - return {}; + checkIfQueryCanceled(query_state.value()); + + sendReadTaskRequest(); - sendReadTaskRequestAssumeLocked(); ProfileEvents::increment(ProfileEvents::ReadTaskRequestsSent); - auto res = receiveReadTaskResponseAssumeLocked(); + auto res = receiveReadTaskResponse(query_state.value()); ProfileEvents::increment(ProfileEvents::ReadTaskRequestsSentElapsedMicroseconds, watch.elapsedMicroseconds()); + return res; }); - query_context->setMergeTreeAllRangesCallback([this](InitialAllRangesAnnouncement announcement) + query_state->query_context->setMergeTreeAllRangesCallback([this, &query_state](InitialAllRangesAnnouncement announcement) { Stopwatch watch; CurrentMetrics::Increment callback_metric_increment(CurrentMetrics::MergeTreeAllRangesAnnouncementsSent); - std::scoped_lock lock(out_mutex, task_callback_mutex); - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - return; + std::lock_guard lock(callback_mutex); - sendMergeTreeAllRangesAnnouncementAssumeLocked(announcement); + checkIfQueryCanceled(query_state.value()); + + sendMergeTreeAllRangesAnnouncement(query_state.value(), announcement); ProfileEvents::increment(ProfileEvents::MergeTreeAllRangesAnnouncementsSent); ProfileEvents::increment(ProfileEvents::MergeTreeAllRangesAnnouncementsSentElapsedMicroseconds, watch.elapsedMicroseconds()); }); - query_context->setMergeTreeReadTaskCallback([this](ParallelReadRequest request) -> std::optional + query_state->query_context->setMergeTreeReadTaskCallback([this, &query_state](ParallelReadRequest request) -> std::optional { Stopwatch watch; CurrentMetrics::Increment callback_metric_increment(CurrentMetrics::MergeTreeReadTaskRequestsSent); - std::scoped_lock lock(out_mutex, task_callback_mutex); - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - return std::nullopt; + std::lock_guard lock(callback_mutex); + + checkIfQueryCanceled(*query_state); + + sendMergeTreeReadTaskRequest(std::move(request)); - sendMergeTreeReadTaskRequestAssumeLocked(std::move(request)); ProfileEvents::increment(ProfileEvents::MergeTreeReadTaskRequestsSent); - auto res = receivePartitionMergeTreeReadTaskResponseAssumeLocked(); + auto res = receivePartitionMergeTreeReadTaskResponse(query_state.value()); ProfileEvents::increment(ProfileEvents::MergeTreeReadTaskRequestsSentElapsedMicroseconds, watch.elapsedMicroseconds()); return res; }); /// Processing Query - std::tie(state.parsed_query, state.io) = executeQuery(state.query, query_context, QueryFlags{}, state.stage); + std::tie(query_state->parsed_query, query_state->io) = executeQuery(query_state->query, query_state->query_context, QueryFlags{}, query_state->stage); after_check_cancelled.restart(); after_send_progress.restart(); - auto finish_or_cancel = [this]() - { - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - state.io.onCancelOrConnectionLoss(); - else - state.io.onFinish(); - }; - - if (state.io.pipeline.pushing()) + if (query_state->io.pipeline.pushing()) { /// FIXME: check explicitly that insert query suggests to receive data via native protocol, - state.need_receive_data_for_insert = true; - processInsertQuery(); - finish_or_cancel(); + query_state->need_receive_data_for_insert = true; + processInsertQuery(query_state.value()); + query_state->io.onFinish(); } - else if (state.io.pipeline.pulling()) + else if (query_state->io.pipeline.pulling()) { - processOrdinaryQuery(); - finish_or_cancel(); + processOrdinaryQuery(query_state.value()); + query_state->io.onFinish(); } - else if (state.io.pipeline.completed()) + else if (query_state->io.pipeline.completed()) { { - CompletedPipelineExecutor executor(state.io.pipeline); + CompletedPipelineExecutor executor(query_state->io.pipeline); /// Should not check for cancel in case of input. - if (!state.need_receive_data_for_input) + if (!query_state->need_receive_data_for_input) { - auto callback = [this]() + auto callback = [this, &query_state]() { - std::scoped_lock lock(out_mutex, task_callback_mutex); + std::lock_guard lock(callback_mutex); - if (getQueryCancellationStatus() == CancellationStatus::FULLY_CANCELLED) - { + receivePacketsExpectCancel(query_state.value()); + + if (query_state->stop_read_return_partial_result) return true; - } - - sendProgress(); - sendSelectProfileEvents(); - sendLogs(); + sendProgress(query_state.value()); + sendSelectProfileEvents(query_state.value()); + sendLogs(query_state.value()); return false; }; - executor.setCancelCallback(callback, interactive_delay / 1000); + executor.setCancelCallback(std::move(callback), interactive_delay / 1000); } + executor.execute(); } - finish_or_cancel(); - - std::lock_guard lock(out_mutex); + query_state->io.onFinish(); /// Send final progress after calling onFinish(), since it will update the progress. /// /// NOTE: we cannot send Progress for regular INSERT (with VALUES) /// without breaking protocol compatibility, but it can be done /// by increasing revision. - sendProgress(); - sendSelectProfileEvents(); + sendProgress(query_state.value()); + sendSelectProfileEvents(query_state.value()); } else { - finish_or_cancel(); + query_state->io.onFinish(); } /// Do it before sending end of stream, to have a chance to show log message in client. query_scope->logPeakMemoryUsage(); - log_query_duration(); - if (state.is_connection_closed) - break; + sendLogs(query_state.value()); + sendEndOfStream(query_state.value()); - { - std::lock_guard lock(out_mutex); - sendLogs(); - sendEndOfStream(); - } - - /// QueryState should be cleared before QueryScope, since otherwise - /// the MemoryTracker will be wrong for possible deallocations. - /// (i.e. deallocations from the Aggregator with two-level aggregation) - /// Also it resets socket's timeouts. - state.reset(); - last_sent_snapshots = ProfileEvents::ThreadIdToCountersSnapshot{}; - query_scope.reset(); - thread_trace_context.reset(); + query_state->finalizeOut(out); } catch (const Exception & e) { - /// Authentication failure with interserver secret + exception.reset(e.clone()); + } + catch (const Poco::Exception & e) + { + exception = std::make_unique(Exception::CreateFromPocoTag{}, e); + } +// Server should die on std logic errors in debug, like with assert() +// or ErrorCodes::LOGICAL_ERROR. This helps catch these errors in tests. +#ifdef DEBUG_OR_SANITIZER_BUILD + catch (const std::logic_error & e) + { + if (query_state.has_value()) + query_state->io.onException(); + exception = std::make_unique(Exception::CreateFromSTDTag{}, e); + sendException(*exception, send_exception_with_stack_trace); + std::abort(); + } +#endif + catch (const std::exception & e) + { + exception = std::make_unique(Exception::CreateFromSTDTag{}, e); + } + catch (...) + { + exception = std::make_unique(Exception(ErrorCodes::UNKNOWN_EXCEPTION, "Unknown exception")); + } + + if (exception) + { + auto exception_code = exception->code(); + + if (!query_state.has_value()) + { + return; + } + + try + { + exception->rethrow(); + } + catch (...) + { + query_state->io.onException(exception_code != ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT); + } + + /// Authentication failure with interserver secret /// - early exit without trying to send the exception to the client. /// Because the server should not try to skip (parse, decompress) the remaining packets sent by the client, /// as it will lead to additional work and unneeded exposure to unauthenticated connections. @@ -699,150 +779,90 @@ void TCPHandler::runImpl() /// In this case, the user is already authenticated with this server, /// is_interserver_mode is false, and we can send the exception to the client normally. - if (is_interserver_mode && e.code() == ErrorCodes::AUTHENTICATION_FAILED) - throw; - - state.io.onException(); - exception.reset(e.clone()); - - /// In case of exception state was not reset, so socket's timouts must be reset explicitly - state.timeout_setter.reset(); - - if (e.code() == ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT) - throw; - - /// If there is UNEXPECTED_PACKET_FROM_CLIENT emulate network_error - /// to break the loop, but do not throw to send the exception to - /// the client. - if (e.code() == ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT) - network_error = true; - - /// If a timeout occurred, try to inform client about it and close the session - if (e.code() == ErrorCodes::SOCKET_TIMEOUT) - network_error = true; - - if (e.code() == ErrorCodes::USER_EXPIRED) - user_expired = true; - - if (network_error || user_expired) - LOG_TEST(log, "Going to close connection due to exception: {}", e.message()); - } - catch (const Poco::Net::NetException & e) - { - /** We can get here if there was an error during connection to the client, - * or in connection with a remote server that was used to process the request. - * It is not possible to distinguish between these two cases. - * Although in one of them, we have to send exception to the client, but in the other - we can not. - * We will try to send exception to the client in any case - see below. - */ - state.io.onException(); - exception = std::make_unique(Exception::CreateFromPocoTag{}, e); - } - catch (const Poco::Exception & e) - { - state.io.onException(); - exception = std::make_unique(Exception::CreateFromPocoTag{}, e); - } -// Server should die on std logic errors in debug, like with assert() -// or ErrorCodes::LOGICAL_ERROR. This helps catch these errors in -// tests. -#ifdef DEBUG_OR_SANITIZER_BUILD - catch (const std::logic_error & e) - { - state.io.onException(); - exception = std::make_unique(Exception::CreateFromSTDTag{}, e); - sendException(*exception, send_exception_with_stack_trace); - std::abort(); - } -#endif - catch (const std::exception & e) - { - state.io.onException(); - exception = std::make_unique(Exception::CreateFromSTDTag{}, e); - } - catch (...) - { - state.io.onException(); - exception = std::make_unique(Exception(ErrorCodes::UNKNOWN_EXCEPTION, "Unknown exception")); - } - - /// In case of exception state was not reset, so socket's timouts must be reset explicitly - state.timeout_setter.reset(); - - try - { - if (exception) + if (is_interserver_mode + && !is_interserver_authenticated) { - if (thread_trace_context) + /// Interserver authentication is done only after we read the query. + /// This fact can be abused by producing exception before or while we read the query. + /// To avoid any potential exploits, we simply close connection on any exceptions + /// that happen before the first query is authenticated with the cluster secret. + query_state->cancelOut(out); + return; + } + + if (exception_code == ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT) + { + query_state->cancelOut(out); + return; + } + + if (thread_trace_context) thread_trace_context->root_span.addAttribute(*exception); - try + if (!out || out->isCanceled()) + { + query_state->cancelOut(out); + return; + } + + try + { + std::lock_guard lock(callback_mutex); + + /// Try to send logs to client, but it could be risky too + /// Assume that we can't break output here + sendLogs(query_state.value()); + + /// A query packet is always followed by one or more data packets. + /// If some of those data packets are left, try to skip them. + if (!query_state->read_all_data) + skipData(query_state.value()); + + if (exception_code == ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT) { - /// Try to send logs to client, but it could be risky too - /// Assume that we can't break output here - sendLogs(); + sendEndOfStream(query_state.value()); } - catch (...) + else { - tryLogCurrentException(log, "Can't send logs to client"); + sendException(*exception, send_exception_with_stack_trace); } - const auto & e = *exception; - LOG_ERROR(log, getExceptionMessageAndPattern(e, send_exception_with_stack_trace)); - sendException(*exception, send_exception_with_stack_trace); + LOG_TEST(log, "Logs and exception has been sent. The connection is preserved."); + } + catch (...) + { + query_state->cancelOut(out); + tryLogCurrentException(log, "Can't send logs or exception to client. Close connection."); + return; + } + + if (exception->code() == ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT + || exception->code() == ErrorCodes::USER_EXPIRED) + { + LOG_DEBUG(log, "Going to close connection due to exception: {}", exception->message()); + query_state->finalizeOut(out); + return; } } - catch (...) - { - /** Could not send exception information to the client. */ - network_error = true; - LOG_WARNING(log, "Client has gone away."); - } - /// Interserver authentication is done only after we read the query. - /// This fact can be abused by producing exception before or while we read the query. - /// To avoid any potential exploits, we simply close connection on any exceptions - /// that happen before the first query is authenticated with the cluster secret. - if (is_interserver_mode && exception && !is_interserver_authenticated) - exception->rethrow(); - - try - { - /// A query packet is always followed by one or more data packets. - /// If some of those data packets are left, try to skip them. - if (exception && !state.empty() && !state.read_all_data) - skipData(); - } - catch (...) - { - network_error = true; - LOG_WARNING(log, "Can't skip data packets after query failure."); - } - - log_query_duration(); - - /// QueryState should be cleared before QueryScope, since otherwise - /// the MemoryTracker will be wrong for possible deallocations. - /// (i.e. deallocations from the Aggregator with two-level aggregation) - state.reset(); - query_scope.reset(); - thread_trace_context.reset(); - - /// It is important to destroy query context here. We do not want it to live arbitrarily longer than the query. - query_context.reset(); - - if (is_interserver_mode) - { - /// We don't really have session in interserver mode, new one is created for each query. It's better to reset it now. - session.reset(); - } - - if (network_error || user_expired) - break; + query_state->finalizeOut(out); } } +void TCPHandler::logQueryDuration(QueryState & state) +{ + if (state.query_duration_already_logged) + return; + state.query_duration_already_logged = true; + auto elapsed_sec = state.watch.elapsedSeconds(); + /// We already logged more detailed info if we read some rows + if (elapsed_sec < 1.0 && state.progress.read_rows) + return; + LOG_DEBUG(log, "Processed in {} sec.", elapsed_sec); +} + + void TCPHandler::extractConnectionSettingsFromContext(const ContextPtr & context) { const auto & settings = context->getSettingsRef(); @@ -858,119 +878,190 @@ void TCPHandler::extractConnectionSettingsFromContext(const ContextPtr & context } -bool TCPHandler::readDataNext() +bool TCPHandler::receivePacketsExpectQuery(std::optional & state) { - Stopwatch watch(CLOCK_MONOTONIC_COARSE); + UInt64 packet_type = 0; + readVarUInt(packet_type, *in); + switch (packet_type) + { + case Protocol::Client::Hello: + processUnexpectedHello(); + + case Protocol::Client::Data: + case Protocol::Client::Scalar: + processUnexpectedData(); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Data received from client"); + + case Protocol::Client::Ping: + writeVarUInt(Protocol::Server::Pong, *out); + out->finishChunk(); + out->next(); + return false; + + case Protocol::Client::Cancel: + return false; + + case Protocol::Client::TablesStatusRequest: + processTablesStatusRequest(); + return false; + + case Protocol::Client::IgnoredPartUUIDs: + /// Part uuids packet if any comes before query. + processIgnoredPartUUIDs(); + return true; + + case Protocol::Client::Query: + processQuery(state); + return true; + + default: + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, "Unknown packet {} from client", toString(packet_type)); + } + + chassert(server.isCancelled() || !tcp_server.isOpen()); + throw Exception(ErrorCodes::ABORTED, "Server shutdown is called"); +} + + +bool TCPHandler::receivePacketsExpectDataConcurrentWithExecutor(QueryState & state) +{ + std::lock_guard lock(callback_mutex); + return receivePacketsExpectData(state); +} + +bool TCPHandler::receivePacketsExpectData(QueryState & state) +{ /// Poll interval should not be greater than receive_timeout constexpr UInt64 min_timeout_us = 5000; // 5 ms - UInt64 timeout_us - = std::max(min_timeout_us, std::min(poll_interval * 1000000, static_cast(receive_timeout.totalMicroseconds()))); - bool read_ok = false; + UInt64 timeout_us = std::max( + min_timeout_us, + std::min( + poll_interval * 1000000, + static_cast(receive_timeout.totalMicroseconds()))); - /// We are waiting for a packet from the client. Thus, every `POLL_INTERVAL` seconds check whether we need to shut down. - while (true) + Stopwatch watch; + + while (!server.isCancelled() && tcp_server.isOpen()) { - if (in->poll(timeout_us)) + if (!in->poll(timeout_us)) { - /// If client disconnected. - if (in->eof()) + size_t elapsed = size_t(watch.elapsedSeconds()); + if (elapsed > size_t(receive_timeout.totalSeconds())) { - LOG_INFO(log, "Client has dropped the connection, cancel the query."); - state.is_connection_closed = true; - state.cancellation_status = CancellationStatus::FULLY_CANCELLED; - break; + throw NetException(ErrorCodes::SOCKET_TIMEOUT, + "Timeout exceeded while receiving data from client. Waited for {} seconds, timeout is {} seconds.", + elapsed, receive_timeout.totalSeconds()); } - - /// We accept and process data. - read_ok = receivePacket(); - /// Reset the timeout on Ping packet (NOTE: there is no Ping for INSERT queries yet). - watch.restart(); - break; } - /// Do we need to shut down? - if (server.isCancelled()) - break; + UInt64 packet_type = 0; + readVarUInt(packet_type, *in); - /** Have we waited for data for too long? - * If we periodically poll, the receive_timeout of the socket itself does not work. - * Therefore, an additional check is added. - */ - Float64 elapsed = watch.elapsedSeconds(); - if (elapsed > static_cast(receive_timeout.totalSeconds())) + switch (packet_type) { - throw Exception(ErrorCodes::SOCKET_TIMEOUT, - "Timeout exceeded while receiving data from client. Waited for {} seconds, timeout is {} seconds.", - static_cast(elapsed), receive_timeout.totalSeconds()); + case Protocol::Client::IgnoredPartUUIDs: + processUnexpectedIgnoredPartUUIDs(); + + case Protocol::Client::Query: + processUnexpectedQuery(); + + case Protocol::Client::Hello: + processUnexpectedHello(); + + case Protocol::Client::TablesStatusRequest: + processUnexpectedTablesStatusRequest(); + + case Protocol::Client::Data: + case Protocol::Client::Scalar: + if (state.skipping_data) + return processUnexpectedData(); + return processData(state, packet_type == Protocol::Client::Scalar); + + case Protocol::Client::Ping: + writeVarUInt(Protocol::Server::Pong, *out); + out->finishChunk(); + out->next(); + continue; + + case Protocol::Client::Cancel: + processCancel(state); + return false; // We return false from this function as if no more data received + + default: + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, "Unknown packet {} from client", toString(packet_type)); } } - if (read_ok) - { - sendLogs(); - sendInsertProfileEvents(); - } - else - state.read_all_data = true; - - return read_ok; + chassert(server.isCancelled() || !tcp_server.isOpen()); + throw Exception(ErrorCodes::ABORTED, "Server shutdown is called"); } -void TCPHandler::readData() +void TCPHandler::readData(QueryState & state) { - sendLogs(); + sendLogs(state); - while (readDataNext()) - ; + /// no sense in partial_result_on_first_cancel setting when temporary data is read. + auto off_setting_guard = TurnOffBoolSettingTemporary(state.allow_partial_result_on_first_cancel); - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - throw Exception(ErrorCodes::QUERY_WAS_CANCELLED, "Query was cancelled"); + while (receivePacketsExpectData(state)) + { + sendLogs(state); + sendInsertProfileEvents(state); + } + + state.read_all_data = true; } -void TCPHandler::skipData() +void TCPHandler::skipData(QueryState & state) { state.skipping_data = true; SCOPE_EXIT({ state.skipping_data = false; }); - while (readDataNext()) - ; + while (receivePacketsExpectData(state)) + { + /// no op + } - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - throw Exception(ErrorCodes::QUERY_WAS_CANCELLED, "Query was cancelled"); + state.read_all_data = true; } -void TCPHandler::startInsertQuery() + +void TCPHandler::startInsertQuery(QueryState & state) { + + std::lock_guard lock(callback_mutex); + /// Send ColumnsDescription for insertion table if (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_COLUMN_DEFAULTS_METADATA) { - const auto & table_id = query_context->getInsertionTable(); - if (query_context->getSettingsRef()[Setting::input_format_defaults_for_omitted_fields]) + const auto & table_id = state.query_context->getInsertionTable(); + if (state.query_context->getSettingsRef()[Setting::input_format_defaults_for_omitted_fields]) { if (!table_id.empty()) { - auto storage_ptr = DatabaseCatalog::instance().getTable(table_id, query_context); - sendTableColumns(storage_ptr->getInMemoryMetadataPtr()->getColumns()); + auto storage_ptr = DatabaseCatalog::instance().getTable(table_id, state.query_context); + sendTableColumns(state, storage_ptr->getInMemoryMetadataPtr()->getColumns()); } } } /// Send block to the client - table structure. - sendData(state.io.pipeline.getHeader()); - sendLogs(); + sendData(state, state.io.pipeline.getHeader()); + sendLogs(state); } -AsynchronousInsertQueue::PushResult TCPHandler::processAsyncInsertQuery(AsynchronousInsertQueue & insert_queue) + +AsynchronousInsertQueue::PushResult TCPHandler::processAsyncInsertQuery(QueryState & state, AsynchronousInsertQueue & insert_queue) { using PushResult = AsynchronousInsertQueue::PushResult; - startInsertQuery(); - Squashing squashing(state.input_header, 0, query_context->getSettingsRef()[Setting::async_insert_max_data_size]); + startInsertQuery(state); + Squashing squashing(state.input_header, 0, state.query_context->getSettingsRef()[Setting::async_insert_max_data_size]); - while (readDataNext()) + while (receivePacketsExpectDataConcurrentWithExecutor(state)) { squashing.setHeader(state.block_for_insert.cloneEmpty()); auto result_chunk = Squashing::squash(squashing.add({state.block_for_insert.getColumns(), state.block_for_insert.rows()})); @@ -985,50 +1076,60 @@ AsynchronousInsertQueue::PushResult TCPHandler::processAsyncInsertQuery(Asynchro } } + state.read_all_data = true; + Chunk result_chunk = Squashing::squash(squashing.flush()); if (!result_chunk) { - return insert_queue.pushQueryWithBlock(state.parsed_query, squashing.getHeader(), query_context); + return insert_queue.pushQueryWithBlock(state.parsed_query, squashing.getHeader(), state.query_context); } auto result = squashing.getHeader().cloneWithColumns(result_chunk.detachColumns()); - return insert_queue.pushQueryWithBlock(state.parsed_query, std::move(result), query_context); + return insert_queue.pushQueryWithBlock(state.parsed_query, std::move(result), state.query_context); } -void TCPHandler::processInsertQuery() + +void TCPHandler::processInsertQuery(QueryState & state) { size_t num_threads = state.io.pipeline.getNumThreads(); auto run_executor = [&](auto & executor, Block processed_data) { - /// Made above the rest of the lines, - /// so that in case of `start` function throws an exception, - /// client receive exception before sending data. - executor.start(); + try + { + /// Made above the rest of the lines, + /// so that in case of `start` function throws an exception, + /// client receive exception before sending data. + executor.start(); - if (processed_data) - executor.push(std::move(processed_data)); - else - startInsertQuery(); + if (processed_data) + executor.push(std::move(processed_data)); + else + startInsertQuery(state); - while (readDataNext()) - executor.push(std::move(state.block_for_insert)); + while (receivePacketsExpectDataConcurrentWithExecutor(state)) + executor.push(std::move(state.block_for_insert)); + + state.read_all_data = true; - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED) - executor.cancel(); - else executor.finish(); + } + catch (...) + { + executor.cancel(); + throw; + } }; Block processed_block; - const auto & settings = query_context->getSettingsRef(); + const auto & settings = state.query_context->getSettingsRef(); - auto * insert_queue = query_context->tryGetAsynchronousInsertQueue(); + auto * insert_queue = state.query_context->tryGetAsynchronousInsertQueue(); const auto & insert_query = assert_cast(*state.parsed_query); bool async_insert_enabled = settings[Setting::async_insert]; if (insert_query.table_id) - if (auto table = DatabaseCatalog::instance().tryGetTable(insert_query.table_id, query_context)) + if (auto table = DatabaseCatalog::instance().tryGetTable(insert_query.table_id, state.query_context)) async_insert_enabled |= table->areAsynchronousInsertsEnabled(); if (insert_queue && async_insert_enabled && !insert_query.select) @@ -1048,7 +1149,7 @@ void TCPHandler::processInsertQuery() "Deduplication in dependent materialized view cannot work together with async inserts. "\ "Please disable either `deduplicate_blocks_in_dependent_materialized_views` or `async_insert` setting."); - auto result = processAsyncInsertQuery(*insert_queue); + auto result = processAsyncInsertQuery(state, *insert_queue); if (result.status == AsynchronousInsertQueue::PushResult::OK) { /// Reset pipeline because it may hold write lock for some storages. @@ -1067,7 +1168,7 @@ void TCPHandler::processInsertQuery() result.future.get(); } - sendInsertProfileEvents(); + sendInsertProfileEvents(state); return; } if (result.status == AsynchronousInsertQueue::PushResult::TOO_MUCH_DATA) @@ -1088,18 +1189,17 @@ void TCPHandler::processInsertQuery() run_executor(executor, std::move(processed_block)); } - sendInsertProfileEvents(); + sendInsertProfileEvents(state); } -void TCPHandler::processOrdinaryQuery() +void TCPHandler::processOrdinaryQuery(QueryState & state) { auto & pipeline = state.io.pipeline; - if (query_context->getSettingsRef()[Setting::allow_experimental_query_deduplication]) + if (state.query_context->getSettingsRef()[Setting::allow_experimental_query_deduplication]) { - std::lock_guard lock(out_mutex); - sendPartUUIDs(); + sendPartUUIDs(state); } /// Send header-block, to allow client to prepare output format for data to send. @@ -1108,75 +1208,57 @@ void TCPHandler::processOrdinaryQuery() if (header) { - std::lock_guard lock(out_mutex); - sendData(header); + sendData(state, header); } } - /// Defer locking to cover a part of the scope below and everything after it - std::unique_lock out_lock(out_mutex, std::defer_lock); - { PullingAsyncPipelineExecutor executor(pipeline); - pipeline.setConcurrencyControl(query_context->getSettingsRef()[Setting::use_concurrency_control]); + pipeline.setConcurrencyControl(state.query_context->getSettingsRef()[Setting::use_concurrency_control]); CurrentMetrics::Increment query_thread_metric_increment{CurrentMetrics::QueryThread}; - /// The following may happen: - /// * current thread is holding the lock - /// * because of the exception we unwind the stack and call the destructor of `executor` - /// * the destructor calls cancel() and waits for all query threads to finish - /// * at the same time one of the query threads is trying to acquire the lock, e.g. inside `merge_tree_read_task_callback` - /// * deadlock - SCOPE_EXIT({ - if (out_lock.owns_lock()) - out_lock.unlock(); - }); - - Block block; - while (executor.pull(block, interactive_delay / 1000)) + try { - std::unique_lock lock(task_callback_mutex); - - auto cancellation_status = getQueryCancellationStatus(); - if (cancellation_status == CancellationStatus::FULLY_CANCELLED) + Block block; + while (executor.pull(block, interactive_delay / 1000)) { - /// Several callback like callback for parallel reading could be called from inside the pipeline - /// and we have to unlock the mutex from our side to prevent deadlock. - lock.unlock(); - /// A packet was received requesting to stop execution of the request. - executor.cancel(); - break; + + { + std::lock_guard lock(callback_mutex); + receivePacketsExpectCancel(state); + } + + if (state.stop_read_return_partial_result) + { + executor.cancelReading(); + } + + { + std::lock_guard lock(callback_mutex); + + if (after_send_progress.elapsed() / 1000 >= interactive_delay) + { + /// Some time passed and there is a progress. + after_send_progress.restart(); + sendProgress(state); + sendSelectProfileEvents(state); + } + + sendLogs(state); + + if (block) + { + if (!state.io.null_format) + sendData(state, block); + } + } } - if (cancellation_status == CancellationStatus::READ_CANCELLED) - { - executor.cancelReading(); - } - - lock.unlock(); - out_lock.lock(); - - if (after_send_progress.elapsed() / 1000 >= interactive_delay) - { - /// Some time passed and there is a progress. - after_send_progress.restart(); - sendProgress(); - sendSelectProfileEvents(); - } - - sendLogs(); - - if (block) - { - if (!state.io.null_format) - sendData(block); - } - - out_lock.unlock(); } - - /// This lock wasn't acquired before and we make .lock() call here - /// so everything under this line is covered. - out_lock.lock(); + catch (...) + { + executor.cancel(); + throw; + } /** If data has run out, we will send the profiling data and total values to * the last zero block to be able to use @@ -1185,25 +1267,23 @@ void TCPHandler::processOrdinaryQuery() * because we have not read all the data yet, * and there could be ongoing calculations in other threads at the same time. */ - if (getQueryCancellationStatus() != CancellationStatus::FULLY_CANCELLED) - { - sendTotals(executor.getTotalsBlock()); - sendExtremes(executor.getExtremesBlock()); - sendProfileInfo(executor.getProfileInfo()); - sendProgress(); - sendLogs(); - sendSelectProfileEvents(); - } - if (state.is_connection_closed) - return; - sendData({}); - last_sent_snapshots.clear(); + std::lock_guard lock(callback_mutex); + + receivePacketsExpectCancel(state); + + sendTotals(state, executor.getTotalsBlock()); + sendExtremes(state, executor.getExtremesBlock()); + sendProfileInfo(state, executor.getProfileInfo()); + sendProgress(state); + sendLogs(state); + sendSelectProfileEvents(state); + + sendData(state, {}); + + sendProgress(state); } - - out_lock.lock(); - sendProgress(); } @@ -1250,7 +1330,6 @@ void TCPHandler::processTablesStatusRequest() response.table_states_by_id.emplace(table_name, std::move(status)); } - writeVarUInt(Protocol::Server::TablesStatusResponse, *out); /// For testing hedged requests @@ -1264,34 +1343,34 @@ void TCPHandler::processTablesStatusRequest() response.write(*out, client_tcp_protocol_version); out->finishChunk(); + out->next(); } -void TCPHandler::receiveUnexpectedTablesStatusRequest() + +void TCPHandler::processUnexpectedTablesStatusRequest() { TablesStatusRequest skip_request; skip_request.read(*in, client_tcp_protocol_version); - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet TablesStatusRequest received from client"); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet TablesStatusRequest received from client"); } -void TCPHandler::sendPartUUIDs() + +void TCPHandler::sendPartUUIDs(QueryState & state) { - auto uuids = query_context->getPartUUIDs()->get(); - if (!uuids.empty()) - { - for (const auto & uuid : uuids) - LOG_TRACE(log, "Sending UUID: {}", toString(uuid)); + auto uuids = state.query_context->getPartUUIDs()->get(); + if (uuids.empty()) + return; - writeVarUInt(Protocol::Server::PartUUIDs, *out); - writeVectorBinary(uuids, *out); + writeVarUInt(Protocol::Server::PartUUIDs, *out); + writeVectorBinary(uuids, *out); - out->finishChunk(); - out->next(); - } + out->finishChunk(); + out->next(); } -void TCPHandler::sendReadTaskRequestAssumeLocked() +void TCPHandler::sendReadTaskRequest() { writeVarUInt(Protocol::Server::ReadTaskRequest, *out); @@ -1300,7 +1379,7 @@ void TCPHandler::sendReadTaskRequestAssumeLocked() } -void TCPHandler::sendMergeTreeAllRangesAnnouncementAssumeLocked(InitialAllRangesAnnouncement announcement) +void TCPHandler::sendMergeTreeAllRangesAnnouncement(QueryState &, InitialAllRangesAnnouncement announcement) { writeVarUInt(Protocol::Server::MergeTreeAllRangesAnnouncement, *out); announcement.serialize(*out, client_parallel_replicas_protocol_version); @@ -1310,7 +1389,7 @@ void TCPHandler::sendMergeTreeAllRangesAnnouncementAssumeLocked(InitialAllRanges } -void TCPHandler::sendMergeTreeReadTaskRequestAssumeLocked(ParallelReadRequest request) +void TCPHandler::sendMergeTreeReadTaskRequest(ParallelReadRequest request) { writeVarUInt(Protocol::Server::MergeTreeReadTaskRequest, *out); request.serialize(*out, client_parallel_replicas_protocol_version); @@ -1320,7 +1399,7 @@ void TCPHandler::sendMergeTreeReadTaskRequestAssumeLocked(ParallelReadRequest re } -void TCPHandler::sendProfileInfo(const ProfileInfo & info) +void TCPHandler::sendProfileInfo(QueryState &, const ProfileInfo & info) { writeVarUInt(Protocol::Server::ProfileInfo, *out); info.write(*out, client_tcp_protocol_version); @@ -1330,49 +1409,49 @@ void TCPHandler::sendProfileInfo(const ProfileInfo & info) } -void TCPHandler::sendTotals(const Block & totals) +void TCPHandler::sendTotals(QueryState & state, const Block & totals) { - if (totals) - { - initBlockOutput(totals); + if (!totals) + return; - writeVarUInt(Protocol::Server::Totals, *out); - writeStringBinary("", *out); + initBlockOutput(state, totals); - state.block_out->write(totals); - state.maybe_compressed_out->next(); + writeVarUInt(Protocol::Server::Totals, *out); + writeStringBinary("", *out); - out->finishChunk(); - out->next(); - } + state.block_out->write(totals); + state.maybe_compressed_out->next(); + + out->finishChunk(); + out->next(); } -void TCPHandler::sendExtremes(const Block & extremes) +void TCPHandler::sendExtremes(QueryState & state, const Block & extremes) { - if (extremes) - { - initBlockOutput(extremes); + if (!extremes) + return; - writeVarUInt(Protocol::Server::Extremes, *out); - writeStringBinary("", *out); + initBlockOutput(state, extremes); - state.block_out->write(extremes); - state.maybe_compressed_out->next(); + writeVarUInt(Protocol::Server::Extremes, *out); + writeStringBinary("", *out); - out->finishChunk(); - out->next(); - } + state.block_out->write(extremes); + state.maybe_compressed_out->next(); + + out->finishChunk(); + out->next(); } -void TCPHandler::sendProfileEvents() + +void TCPHandler::sendProfileEvents(QueryState & state) { Stopwatch stopwatch; - Block block; - ProfileEvents::getProfileEvents(host_name, state.profile_queue, block, last_sent_snapshots); + Block block = ProfileEvents::getProfileEvents(host_name, state.profile_queue, state.last_sent_snapshots); if (block.rows() != 0) { - initProfileEventsBlockOutput(block); + initProfileEventsBlockOutput(state, block); writeVarUInt(Protocol::Server::ProfileEvents, *out); writeStringBinary("", *out); @@ -1389,30 +1468,33 @@ void TCPHandler::sendProfileEvents() } } -void TCPHandler::sendSelectProfileEvents() + +void TCPHandler::sendSelectProfileEvents(QueryState & state) { if (client_tcp_protocol_version < DBMS_MIN_PROTOCOL_VERSION_WITH_INCREMENTAL_PROFILE_EVENTS) return; - sendProfileEvents(); + sendProfileEvents(state); } -void TCPHandler::sendInsertProfileEvents() + +void TCPHandler::sendInsertProfileEvents(QueryState & state) { if (client_tcp_protocol_version < DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT) return; if (query_kind != ClientInfo::QueryKind::INITIAL_QUERY) return; - sendProfileEvents(); + sendProfileEvents(state); } -void TCPHandler::sendTimezone() + +void TCPHandler::sendTimezone(QueryState & state) { if (client_tcp_protocol_version < DBMS_MIN_PROTOCOL_VERSION_WITH_TIMEZONE_UPDATES) return; - const String & tz = query_context->getSettingsRef()[Setting::session_timezone].value; + const String & tz = state.query_context->getSettingsRef()[Setting::session_timezone].value; LOG_DEBUG(log, "TCPHandler::sendTimezone(): {}", tz); writeVarUInt(Protocol::Server::TimezoneUpdate, *out); @@ -1436,7 +1518,7 @@ bool TCPHandler::receiveProxyHeader() /// Only PROXYv1 is supported. /// Validation of protocol is not fully performed. - LimitReadBuffer limit_in(*in, 107, /* trow_exception */ true, /* exact_limit */ {}); /// Maximum length from the specs. + LimitReadBuffer limit_in(*in, {.read_no_more=107, .expect_eof=true}); /// Maximum length from the specs. assertString("PROXY ", limit_in); @@ -1517,6 +1599,7 @@ std::string formatHTTPErrorResponseWhenUserIsConnectedToWrongPort(const Poco::Ut } + std::unique_ptr TCPHandler::makeSession() { auto interface = is_interserver_mode ? ClientInfo::Interface::TCP_INTERSERVER : ClientInfo::Interface::TCP; @@ -1532,6 +1615,7 @@ std::unique_ptr TCPHandler::makeSession() return res; } + void TCPHandler::receiveHello() { /// Receive `hello` packet. @@ -1550,10 +1634,12 @@ void TCPHandler::receiveHello() if (packet_type == 'G' || packet_type == 'P') { writeString(formatHTTPErrorResponseWhenUserIsConnectedToWrongPort(server.config()), *out); + out->next(); throw Exception(ErrorCodes::CLIENT_HAS_CONNECTED_TO_WRONG_PORT, "Client has connected to wrong port"); } - throw NetException( - ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet from client (expected Hello, got {})", packet_type); + else + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, + "Unexpected packet from client (expected Hello, got {})", packet_type); } readStringBinary(client_name, *in); @@ -1568,7 +1654,7 @@ void TCPHandler::receiveHello() readStringBinary(password, *in); if (user.empty()) - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet from client (no user in Hello package)"); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet from client (no user in Hello package)"); LOG_DEBUG(log, "Connected {} version {}.{}.{}, revision: {}{}{}.", client_name, @@ -1584,7 +1670,7 @@ void TCPHandler::receiveHello() if (client_tcp_protocol_version < DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2) LOG_WARNING(LogFrequencyLimiter(log, 10), "Using deprecated interserver protocol because the client is too old. Consider upgrading all nodes in cluster."); - receiveClusterNameAndSalt(); + processClusterNameAndSalt(); return; } @@ -1682,6 +1768,7 @@ void TCPHandler::receiveHello() session->authenticate(user, password, getClientAddress(client_info)); } + void TCPHandler::receiveAddendum() { if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY) @@ -1701,7 +1788,7 @@ void TCPHandler::receiveAddendum() } -void TCPHandler::receiveUnexpectedHello() +void TCPHandler::processUnexpectedHello() { UInt64 skip_uint_64; String skip_string; @@ -1714,7 +1801,7 @@ void TCPHandler::receiveUnexpectedHello() readStringBinary(skip_string, *in); readStringBinary(skip_string, *in); - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Hello received from client"); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Hello received from client"); } @@ -1760,137 +1847,93 @@ void TCPHandler::sendHello() } -bool TCPHandler::receivePacket() +void TCPHandler::processIgnoredPartUUIDs() +{ + readVectorBinary(part_uuids_to_ignore.emplace(), *in); +} + + +void TCPHandler::processUnexpectedIgnoredPartUUIDs() +{ + std::vector skip_part_uuids; + readVectorBinary(skip_part_uuids, *in); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet IgnoredPartUUIDs received from client"); +} + + +String TCPHandler::receiveReadTaskResponse(QueryState & state) { UInt64 packet_type = 0; readVarUInt(packet_type, *in); switch (packet_type) { - case Protocol::Client::IgnoredPartUUIDs: - /// Part uuids packet if any comes before query. - if (!state.empty() || state.part_uuids_to_ignore) - receiveUnexpectedIgnoredPartUUIDs(); - receiveIgnoredPartUUIDs(); - return true; - - case Protocol::Client::Query: - if (!state.empty()) - receiveUnexpectedQuery(); - receiveQuery(); - return true; - - case Protocol::Client::Data: - case Protocol::Client::Scalar: - if (state.skipping_data) - return receiveUnexpectedData(false); - if (state.empty()) - receiveUnexpectedData(true); - return receiveData(packet_type == Protocol::Client::Scalar); - - case Protocol::Client::Ping: - writeVarUInt(Protocol::Server::Pong, *out); - out->finishChunk(); - out->next(); - return false; - case Protocol::Client::Cancel: - decreaseCancellationStatus("Received 'Cancel' packet from the client, canceling the query."); - return false; + processCancel(state, /* throw_exception */ true); + return {}; - case Protocol::Client::Hello: - receiveUnexpectedHello(); - - case Protocol::Client::TablesStatusRequest: - if (!state.empty()) - receiveUnexpectedTablesStatusRequest(); - processTablesStatusRequest(); - out->next(); - return false; + case Protocol::Client::ReadTaskResponse: + { + UInt64 version = 0; + readVarUInt(version, *in); + if (version != DBMS_CLUSTER_PROCESSING_PROTOCOL_VERSION) + throw Exception(ErrorCodes::UNKNOWN_PROTOCOL, "Protocol version for distributed processing mismatched"); + String response; + readStringBinary(response, *in); + return response; + } default: - throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, "Unknown packet {} from client", toString(packet_type)); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Received {} packet after requesting read task", + Protocol::Client::toString(packet_type)); } } -void TCPHandler::receiveIgnoredPartUUIDs() -{ - readVectorBinary(state.part_uuids_to_ignore.emplace(), *in); -} - - -void TCPHandler::receiveUnexpectedIgnoredPartUUIDs() -{ - std::vector skip_part_uuids; - readVectorBinary(skip_part_uuids, *in); - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet IgnoredPartUUIDs received from client"); -} - - -String TCPHandler::receiveReadTaskResponseAssumeLocked() +std::optional TCPHandler::receivePartitionMergeTreeReadTaskResponse(QueryState & state) { UInt64 packet_type = 0; readVarUInt(packet_type, *in); - if (packet_type != Protocol::Client::ReadTaskResponse) + + switch (packet_type) { - if (packet_type == Protocol::Client::Cancel) - { - decreaseCancellationStatus("Received 'Cancel' packet from the client, canceling the read task."); + case Protocol::Client::Cancel: + processCancel(state, /* throw_exception */ true); return {}; - } - throw Exception( - ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, - "Received {} packet after requesting read task", - Protocol::Client::toString(packet_type)); - } - UInt64 version; - readVarUInt(version, *in); - if (version != DBMS_CLUSTER_PROCESSING_PROTOCOL_VERSION) - throw Exception(ErrorCodes::UNKNOWN_PROTOCOL, "Protocol version for distributed processing mismatched"); - String response; - readStringBinary(response, *in); - return response; -} - - -std::optional TCPHandler::receivePartitionMergeTreeReadTaskResponseAssumeLocked() -{ - UInt64 packet_type = 0; - readVarUInt(packet_type, *in); - if (packet_type != Protocol::Client::MergeTreeReadTaskResponse) - { - if (packet_type == Protocol::Client::Cancel) + case Protocol::Client::MergeTreeReadTaskResponse: { - decreaseCancellationStatus("Received 'Cancel' packet from the client, canceling the MergeTree read task."); - return std::nullopt; + ParallelReadResponse response; + response.deserialize(*in); + return response; } - throw Exception( - ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, - "Received {} packet after requesting read task", - Protocol::Client::toString(packet_type)); + default: + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, + "Received {} packet after requesting read task", + Protocol::Client::toString(packet_type)); } - ParallelReadResponse response; - response.deserialize(*in); - return response; } -void TCPHandler::receiveClusterNameAndSalt() +void TCPHandler::processClusterNameAndSalt() { readStringBinary(cluster, *in); readStringBinary(salt, *in, 32); } -void TCPHandler::receiveQuery() + +void TCPHandler::processQuery(std::optional & state) { UInt64 stage = 0; UInt64 compression = 0; - state.is_empty = false; - readStringBinary(state.query_id, *in); + state.emplace(); + + if (part_uuids_to_ignore.has_value()) + state->part_uuids_to_ignore = std::move(part_uuids_to_ignore); + + readStringBinary(state->query_id, *in); /// In interserver mode, /// initial_user can be empty in case of Distributed INSERT via Buffer/Kafka, @@ -1918,9 +1961,17 @@ void TCPHandler::receiveQuery() auto settings_format = (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS) ? SettingsWriteFormat::STRINGS_WITH_FLAGS : SettingsWriteFormat::BINARY; + Settings passed_settings; passed_settings.read(*in, settings_format); + std::string received_extra_roles; + // TODO: check if having `is_interserver_mode` doesn't break interoperability with the CH-client. + if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES) + { + readStringBinary(received_extra_roles, *in); + } + /// Interserver secret. std::string received_hash; if (client_tcp_protocol_version >= DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET) @@ -1929,13 +1980,13 @@ void TCPHandler::receiveQuery() } readVarUInt(stage, *in); - state.stage = QueryProcessingStage::Enum(stage); + state->stage = QueryProcessingStage::Enum(stage); readVarUInt(compression, *in); - state.compression = static_cast(compression); - last_block_in.compression = state.compression; + state->compression = static_cast(compression); + last_block_in.compression = state->compression; - readStringBinary(state.query, *in); + readStringBinary(state->query, *in); Settings passed_params; if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS) @@ -1977,9 +2028,10 @@ void TCPHandler::receiveQuery() if (nonce.has_value()) data += std::to_string(nonce.value()); data += cluster_secret; - data += state.query; - data += state.query_id; + data += state->query; + data += state->query_id; data += client_info.initial_user; + data += received_extra_roles; std::string calculated_hash = encodeSHA256(data); assert(calculated_hash.size() == 32); @@ -2000,13 +2052,25 @@ void TCPHandler::receiveQuery() } else { + // In a cluster, query originator may have an access to the external auth provider (like LDAP server), + // that grants specific roles to the user. We want these roles to be granted to the user on other nodes of cluster when + // query is executed. + Strings external_roles; + if (!received_extra_roles.empty()) + { + ReadBufferFromString buffer(received_extra_roles); + + readVectorBinary(external_roles, buffer); + LOG_DEBUG(log, "Parsed extra roles [{}]", fmt::join(external_roles, ", ")); + } + LOG_DEBUG(log, "User (initial, interserver mode): {} (client: {})", client_info.initial_user, getClientAddress(client_info).toString()); /// In case of inter-server mode authorization is done with the /// initial address of the client, not the real address from which /// the query was come, since the real address is the address of /// the initiator server, while we are interested in client's /// address. - session->authenticate(AlwaysAllowCredentials{client_info.initial_user}, client_info.initial_address); + session->authenticate(AlwaysAllowCredentials{client_info.initial_user}, client_info.initial_address, external_roles); } is_interserver_authenticated = true; @@ -2018,17 +2082,19 @@ void TCPHandler::receiveQuery() #endif } - query_context = session->makeQueryContext(client_info); + state->query_context = session->makeQueryContext(client_info); /// Sets the default database if it wasn't set earlier for the session context. if (is_interserver_mode && !default_database.empty()) - query_context->setCurrentDatabase(default_database); + state->query_context->setCurrentDatabase(default_database); - if (state.part_uuids_to_ignore) - query_context->getIgnoredPartUUIDs()->add(*state.part_uuids_to_ignore); + if (state->part_uuids_to_ignore) + state->query_context->getIgnoredPartUUIDs()->add(*state->part_uuids_to_ignore); - query_context->setProgressCallback([this] (const Progress & value) { this->updateProgress(value); }); - query_context->setFileProgressCallback([this](const FileProgress & value) { this->updateProgress(Progress(value)); }); + state->query_context->setProgressCallback( + [this, &state] (const Progress & value) { this->updateProgress(state.value(), value); }); + state->query_context->setFileProgressCallback( + [this, &state](const FileProgress & value) { this->updateProgress(state.value(), Progress(value)); }); /// /// Settings @@ -2043,18 +2109,18 @@ void TCPHandler::receiveQuery() passed_settings.set("allow_experimental_analyzer", false); auto settings_changes = passed_settings.changes(); - query_kind = query_context->getClientInfo().query_kind; + query_kind = state->query_context->getClientInfo().query_kind; if (query_kind == ClientInfo::QueryKind::INITIAL_QUERY) { /// Throw an exception if the passed settings violate the constraints. - query_context->checkSettingsConstraints(settings_changes, SettingSource::QUERY); + state->query_context->checkSettingsConstraints(settings_changes, SettingSource::QUERY); } else { /// Quietly clamp to the constraints if it's not an initial query. - query_context->clampToSettingsConstraints(settings_changes, SettingSource::QUERY); + state->query_context->clampToSettingsConstraints(settings_changes, SettingSource::QUERY); } - query_context->applySettingsChanges(settings_changes); + state->query_context->applySettingsChanges(settings_changes); /// Use the received query id, or generate a random default. It is convenient /// to also generate the default OpenTelemetry trace id at the same time, and @@ -2065,9 +2131,11 @@ void TCPHandler::receiveQuery() /// 2) There is the opentelemetry_start_trace_probability setting that /// controls when we start a new trace. It can be changed via Native protocol, /// so we have to apply the changes first. - query_context->setCurrentQueryId(state.query_id); + state->query_context->setCurrentQueryId(state->query_id); - query_context->addQueryParameters(passed_params.toNameToNameMap()); + state->query_context->addQueryParameters(passed_params.toNameToNameMap()); + + state->allow_partial_result_on_first_cancel = state->query_context->getSettingsRef()[Setting::partial_result_on_first_cancel]; /// For testing hedged requests if (unlikely(sleep_after_receiving_query.totalMilliseconds())) @@ -2075,9 +2143,11 @@ void TCPHandler::receiveQuery() std::chrono::milliseconds ms(sleep_after_receiving_query.totalMilliseconds()); std::this_thread::sleep_for(ms); } + + state->read_all_data = false; } -void TCPHandler::receiveUnexpectedQuery() +void TCPHandler::processUnexpectedQuery() { UInt64 skip_uint_64; String skip_string; @@ -2108,12 +2178,12 @@ void TCPHandler::receiveUnexpectedQuery() if (client_tcp_protocol_version >= DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS) skip_settings.read(*in, settings_format); - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Query received from client"); + throw Exception(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Query received from client"); } -bool TCPHandler::receiveData(bool scalar) +bool TCPHandler::processData(QueryState & state, bool scalar) { - initBlockInput(); + initBlockInput(state); /// The name of the temporary table for writing data, default to empty string auto temporary_id = StorageID::createEmpty(); @@ -2123,37 +2193,34 @@ bool TCPHandler::receiveData(bool scalar) Block block = state.block_in->read(); if (!block) - { - state.read_all_data = true; return false; - } if (scalar) { /// Scalar value - query_context->addScalar(temporary_id.table_name, block); + state.query_context->addScalar(temporary_id.table_name, block); } else if (!state.need_receive_data_for_insert && !state.need_receive_data_for_input) { /// Data for external tables - auto resolved = query_context->tryResolveStorageID(temporary_id, Context::ResolveExternal); + auto resolved = state.query_context->tryResolveStorageID(temporary_id, Context::ResolveExternal); StoragePtr storage; /// If such a table does not exist, create it. if (resolved) { - storage = DatabaseCatalog::instance().getTable(resolved, query_context); + storage = DatabaseCatalog::instance().getTable(resolved, state.query_context); } else { NamesAndTypesList columns = block.getNamesAndTypesList(); - auto temporary_table = TemporaryTableHolder(query_context, ColumnsDescription{columns}, {}); + auto temporary_table = TemporaryTableHolder(state.query_context, ColumnsDescription{columns}, {}); storage = temporary_table.getTable(); - query_context->addExternalTable(temporary_id.table_name, std::move(temporary_table)); + state.query_context->addExternalTable(temporary_id.table_name, std::move(temporary_table)); } auto metadata_snapshot = storage->getInMemoryMetadataPtr(); /// The data will be written directly to the table. - QueryPipeline temporary_table_out(storage->write(ASTPtr(), metadata_snapshot, query_context, /*async_insert=*/false)); + QueryPipeline temporary_table_out(storage->write(ASTPtr(), metadata_snapshot, state.query_context, /*async_insert=*/false)); PushingPipelineExecutor executor(temporary_table_out); executor.start(); executor.push(block); @@ -2169,11 +2236,12 @@ bool TCPHandler::receiveData(bool scalar) /// INSERT query. state.block_for_insert = block; } + return true; } -bool TCPHandler::receiveUnexpectedData(bool throw_exception) +bool TCPHandler::processUnexpectedData() { String skip_external_table_name; readStringBinary(skip_external_table_name, *in); @@ -2187,16 +2255,11 @@ bool TCPHandler::receiveUnexpectedData(bool throw_exception) auto skip_block_in = std::make_shared(*maybe_compressed_in, client_tcp_protocol_version); bool read_ok = !!skip_block_in->read(); - if (!read_ok) - state.read_all_data = true; - - if (throw_exception) - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Data received from client"); - return read_ok; } -void TCPHandler::initBlockInput() + +void TCPHandler::initBlockInput(QueryState & state) { if (!state.block_in) { @@ -2222,11 +2285,11 @@ void TCPHandler::initBlockInput() } -void TCPHandler::initBlockOutput(const Block & block) +void TCPHandler::initBlockOutput(QueryState & state, const Block & block) { if (!state.block_out) { - const Settings & query_settings = query_context->getSettingsRef(); + const Settings & query_settings = state.query_context->getSettingsRef(); if (!state.maybe_compressed_out) { std::string method = Poco::toUpper(query_settings[Setting::network_compression_method].toString()); @@ -2259,59 +2322,57 @@ void TCPHandler::initBlockOutput(const Block & block) } } -void TCPHandler::initLogsBlockOutput(const Block & block) + +void TCPHandler::initLogsBlockOutput(QueryState & state, const Block & block) { if (!state.logs_block_out) { /// Use uncompressed stream since log blocks usually contain only one row - const Settings & query_settings = query_context->getSettingsRef(); + const Settings & query_settings = state.query_context->getSettingsRef(); state.logs_block_out = std::make_unique( *out, client_tcp_protocol_version, block.cloneEmpty(), std::nullopt, !query_settings[Setting::low_cardinality_allow_in_native_format]); } } -void TCPHandler::initProfileEventsBlockOutput(const Block & block) +void TCPHandler::initProfileEventsBlockOutput(QueryState & state, const Block & block) { if (!state.profile_events_block_out) { - const Settings & query_settings = query_context->getSettingsRef(); + const Settings & query_settings = state.query_context->getSettingsRef(); state.profile_events_block_out = std::make_unique( *out, client_tcp_protocol_version, block.cloneEmpty(), std::nullopt, !query_settings[Setting::low_cardinality_allow_in_native_format]); } } -void TCPHandler::decreaseCancellationStatus(const std::string & log_message) +void TCPHandler::checkIfQueryCanceled(QueryState & state) { - auto prev_status = magic_enum::enum_name(state.cancellation_status); - - bool partial_result_on_first_cancel = false; - if (query_context) - { - const auto & settings = query_context->getSettingsRef(); - partial_result_on_first_cancel = settings[Setting::partial_result_on_first_cancel]; - } - - if (partial_result_on_first_cancel && state.cancellation_status == CancellationStatus::NOT_CANCELLED) - { - state.cancellation_status = CancellationStatus::READ_CANCELLED; - } - else - { - state.cancellation_status = CancellationStatus::FULLY_CANCELLED; - } - - auto current_status = magic_enum::enum_name(state.cancellation_status); - LOG_INFO(log, "Change cancellation status from {} to {}. Log message: {}", prev_status, current_status, log_message); + if (state.stop_query) + throw Exception(ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT, "Packet 'Cancel' has been received from the client, canceling the query."); } -QueryState::CancellationStatus TCPHandler::getQueryCancellationStatus() +void TCPHandler::processCancel(QueryState & state, bool throw_exception) { - if (state.cancellation_status == CancellationStatus::FULLY_CANCELLED || state.sent_all_data) - return CancellationStatus::FULLY_CANCELLED; + if (state.allow_partial_result_on_first_cancel && !state.stop_read_return_partial_result) + { + state.stop_read_return_partial_result = true; + LOG_INFO(log, "Received 'Cancel' packet from the client, returning partial result."); + return; + } + state.read_all_data = true; + state.stop_query = true; + + if (throw_exception) + throw Exception(ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT, "Received 'Cancel' packet from the client, canceling the query."); + else + LOG_INFO(log, "Received 'Cancel' packet from the client. Queries callbacks return nothing."); +} + +void TCPHandler::receivePacketsExpectCancel(QueryState & state) +{ if (after_check_cancelled.elapsed() / 1000 < interactive_delay) - return state.cancellation_status; + return; after_check_cancelled.restart(); @@ -2319,12 +2380,7 @@ QueryState::CancellationStatus TCPHandler::getQueryCancellationStatus() if (in->poll(0)) { if (in->eof()) - { - LOG_INFO(log, "Client has dropped the connection, cancel the query."); - state.cancellation_status = CancellationStatus::FULLY_CANCELLED; - state.is_connection_closed = true; - return CancellationStatus::FULLY_CANCELLED; - } + throw NetException(ErrorCodes::ABORTED, "Client has dropped the connection, cancel the query."); UInt64 packet_type = 0; readVarUInt(packet_type, *in); @@ -2332,25 +2388,19 @@ QueryState::CancellationStatus TCPHandler::getQueryCancellationStatus() switch (packet_type) { case Protocol::Client::Cancel: - if (state.empty()) - throw NetException(ErrorCodes::UNEXPECTED_PACKET_FROM_CLIENT, "Unexpected packet Cancel received from client"); - - decreaseCancellationStatus("Query was cancelled."); - - return state.cancellation_status; + processCancel(state); + break; default: throw NetException(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, "Unknown packet from client {}", toString(packet_type)); } } - - return state.cancellation_status; } -void TCPHandler::sendData(const Block & block) +void TCPHandler::sendData(QueryState & state, const Block & block) { - initBlockOutput(block); + initBlockOutput(state, block); size_t prev_bytes_written_out = out->count(); size_t prev_bytes_written_compressed_out = state.maybe_compressed_out->count(); @@ -2369,7 +2419,7 @@ void TCPHandler::sendData(const Block & block) writeVarUInt(Protocol::Server::Data, *out); /// For testing hedged requests - if (block.rows() > 0 && query_context->getSettingsRef()[Setting::sleep_in_send_data_ms].totalMilliseconds()) + if (block.rows() > 0 && state.query_context->getSettingsRef()[Setting::sleep_in_send_data_ms].totalMilliseconds()) { /// This strange sequence is needed in case of chunked protocol is enabled, in order for client not to /// hang on receiving of at least packet type - chunk will not be processed unless either chunk footer @@ -2379,7 +2429,7 @@ void TCPHandler::sendData(const Block & block) /// Send external table name (empty name is the main table) writeStringBinary("", *out); out->next(); - std::chrono::milliseconds ms(query_context->getSettingsRef()[Setting::sleep_in_send_data_ms].totalMilliseconds()); + std::chrono::milliseconds ms(state.query_context->getSettingsRef()[Setting::sleep_in_send_data_ms].totalMilliseconds()); std::this_thread::sleep_for(ms); } else @@ -2398,6 +2448,8 @@ void TCPHandler::sendData(const Block & block) } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__); + /// In case of unsuccessful write, if the buffer with written data was not flushed, /// we will rollback write to avoid breaking the protocol. /// (otherwise the client will not be able to receive exception after unfinished data @@ -2420,9 +2472,12 @@ void TCPHandler::sendData(const Block & block) } -void TCPHandler::sendLogData(const Block & block) +void TCPHandler::sendLogData(QueryState & state, const Block & block) { - initLogsBlockOutput(block); + initLogsBlockOutput(state, block); + + if (out->isCanceled()) + return; writeVarUInt(Protocol::Server::Log, *out); /// Send log tag (empty tag is the default tag) @@ -2434,7 +2489,8 @@ void TCPHandler::sendLogData(const Block & block) out->next(); } -void TCPHandler::sendTableColumns(const ColumnsDescription & columns) + +void TCPHandler::sendTableColumns(QueryState &, const ColumnsDescription & columns) { writeVarUInt(Protocol::Server::TableColumns, *out); @@ -2446,9 +2502,11 @@ void TCPHandler::sendTableColumns(const ColumnsDescription & columns) out->next(); } + void TCPHandler::sendException(const Exception & e, bool with_stack_trace) { - state.io.setAllDataSent(); + if (out->isCanceled()) + return; writeVarUInt(Protocol::Server::Exception, *out); writeException(e, *out, with_stack_trace); @@ -2458,7 +2516,7 @@ void TCPHandler::sendException(const Exception & e, bool with_stack_trace) } -void TCPHandler::sendEndOfStream() +void TCPHandler::sendEndOfStream(QueryState & state) { state.sent_all_data = true; state.io.setAllDataSent(); @@ -2470,13 +2528,13 @@ void TCPHandler::sendEndOfStream() } -void TCPHandler::updateProgress(const Progress & value) +void TCPHandler::updateProgress(QueryState & state, const Progress & value) { state.progress.incrementPiecewiseAtomically(value); } -void TCPHandler::sendProgress() +void TCPHandler::sendProgress(QueryState & state) { writeVarUInt(Protocol::Server::Progress, *out); auto increment = state.progress.fetchValuesAndResetPiecewiseAtomically(); @@ -2490,7 +2548,7 @@ void TCPHandler::sendProgress() } -void TCPHandler::sendLogs() +void TCPHandler::sendLogs(QueryState & state) { if (!state.logs_queue) return; @@ -2516,7 +2574,7 @@ void TCPHandler::sendLogs() { Block block = InternalTextLogsQueue::getSampleBlock(); block.setColumns(std::move(logs_columns)); - sendLogData(block); + sendLogData(state, block); } } @@ -2526,21 +2584,16 @@ void TCPHandler::run() try { runImpl(); - LOG_DEBUG(log, "Done processing connection."); } - catch (Poco::Exception & e) + catch (...) { - /// Timeout - not an error. - if (e.what() == "Timeout"sv) - { - LOG_DEBUG(log, "Poco::Exception. Code: {}, e.code() = {}, e.displayText() = {}, e.what() = {}", ErrorCodes::POCO_EXCEPTION, e.code(), e.displayText(), e.what()); - } - else - throw; + tryLogCurrentException(log, "TCPHandler"); + throw; } } + Poco::Net::SocketAddress TCPHandler::getClientAddress(const ClientInfo & client_info) { /// Extract the last entry from comma separated list of forwarded_for addresses. diff --git a/src/Server/TCPHandler.h b/src/Server/TCPHandler.h index 3b6e0059a30..7a5e18a1585 100644 --- a/src/Server/TCPHandler.h +++ b/src/Server/TCPHandler.h @@ -21,7 +21,7 @@ #include #include -#include "Core/Types.h" +#include #include "IServer.h" #include "Interpreters/AsynchronousInsertQueue.h" #include "Server/TCPProtocolStackData.h" @@ -53,6 +53,8 @@ struct QueryState /// Identifier of the query. String query_id; + ContextMutablePtr query_context; + QueryProcessingStage::Enum stage = QueryProcessingStage::Complete; Protocol::Compression compression = Protocol::Compression::Disable; @@ -81,24 +83,17 @@ struct QueryState /// Streams of blocks, that are processing the query. BlockIO io; - enum class CancellationStatus: UInt8 - { - FULLY_CANCELLED, - READ_CANCELLED, - NOT_CANCELLED - }; - /// Is request cancelled - CancellationStatus cancellation_status = CancellationStatus::NOT_CANCELLED; - bool is_connection_closed = false; - /// empty or not - bool is_empty = true; + bool allow_partial_result_on_first_cancel = false; + bool stop_read_return_partial_result = false; + bool stop_query = false; + /// Data was sent. bool sent_all_data = false; /// Request requires data from the client (INSERT, but not INSERT SELECT). bool need_receive_data_for_insert = false; /// Data was read. - bool read_all_data = false; + bool read_all_data = true; /// A state got uuids to exclude from a query std::optional> part_uuids_to_ignore; @@ -112,6 +107,9 @@ struct QueryState /// If true, the data packets will be skipped instead of reading. Used to recover after errors. bool skipping_data = false; + bool query_duration_already_logged = false; + + ProfileEvents::ThreadIdToCountersSnapshot last_sent_snapshots; /// To output progress, the difference after the previous sending of progress. Progress progress; @@ -121,15 +119,23 @@ struct QueryState /// Timeouts setter for current query std::unique_ptr timeout_setter; - void reset() + void finalizeOut(std::shared_ptr & raw_out) const { - *this = QueryState(); + if (maybe_compressed_out && maybe_compressed_out.get() != raw_out.get()) + maybe_compressed_out->finalize(); + if (raw_out) + raw_out->next(); } - bool empty() const + void cancelOut(std::shared_ptr & raw_out) const { - return is_empty; + if (maybe_compressed_out && maybe_compressed_out.get() != raw_out.get()) + maybe_compressed_out->cancel(); + if (raw_out) + raw_out->cancel(); } + + bool isEnanbledPartialResultOnFirstCancel() const; }; @@ -205,9 +211,11 @@ private: Poco::Timespan sleep_after_receiving_query; std::unique_ptr session; - ContextMutablePtr query_context; ClientInfo::QueryKind query_kind = ClientInfo::QueryKind::NO_QUERY; + /// A state got uuids to exclude from a query + std::optional> part_uuids_to_ignore; + /// Streams for reading/writing from/to client connection socket. std::shared_ptr in; std::shared_ptr out; @@ -231,24 +239,15 @@ private: std::optional nonce; String cluster; - /// `out_mutex` protects `out` (WriteBuffer). - /// So it is used for method sendData(), sendProgress(), sendLogs(), etc. - std::mutex out_mutex; - /// `task_callback_mutex` protects tasks callbacks. - /// Inside these callbacks we might also change cancellation status, - /// so it also protects cancellation status checks. - std::mutex task_callback_mutex; - - /// At the moment, only one ongoing query in the connection is supported at a time. - QueryState state; + /// `callback_mutex` protects using `out` (WriteBuffer), `in` (ReadBuffer) and other members concurrent inside callbacks. + /// All the methods which are run inside callbacks are marked with TSA_REQUIRES. + std::mutex callback_mutex; /// Last block input parameters are saved to be able to receive unexpected data packet sent after exception. LastBlockInputParameters last_block_in; CurrentMetrics::Increment metric_increment{CurrentMetrics::TCPConnection}; - ProfileEvents::ThreadIdToCountersSnapshot last_sent_snapshots; - /// It is the name of the server that will be sent to the client. String server_display_name; String host_name; @@ -259,69 +258,72 @@ private: std::unique_ptr makeSession(); + void checkIfQueryCanceled(QueryState & state) TSA_REQUIRES(callback_mutex); + bool receiveProxyHeader(); void receiveHello(); void receiveAddendum(); - bool receivePacket(); - void receiveQuery(); - void receiveIgnoredPartUUIDs(); - String receiveReadTaskResponseAssumeLocked(); - std::optional receivePartitionMergeTreeReadTaskResponseAssumeLocked(); - bool receiveData(bool scalar); - bool readDataNext(); - void readData(); - void skipData(); - void receiveClusterNameAndSalt(); + bool receivePacketsExpectQuery(std::optional & state); + bool receivePacketsExpectData(QueryState & state) TSA_REQUIRES(callback_mutex); + bool receivePacketsExpectDataConcurrentWithExecutor(QueryState & state); + void receivePacketsExpectCancel(QueryState & state) TSA_REQUIRES(callback_mutex); + String receiveReadTaskResponse(QueryState & state) TSA_REQUIRES(callback_mutex); + std::optional receivePartitionMergeTreeReadTaskResponse(QueryState & state) TSA_REQUIRES(callback_mutex); - bool receiveUnexpectedData(bool throw_exception = true); - [[noreturn]] void receiveUnexpectedQuery(); - [[noreturn]] void receiveUnexpectedIgnoredPartUUIDs(); - [[noreturn]] void receiveUnexpectedHello(); - [[noreturn]] void receiveUnexpectedTablesStatusRequest(); + void processCancel(QueryState & state, bool throw_exception = true) TSA_REQUIRES(callback_mutex); + void processQuery(std::optional & state); + void processIgnoredPartUUIDs(); + bool processData(QueryState & state, bool scalar) TSA_REQUIRES(callback_mutex); + void processClusterNameAndSalt(); + + void readData(QueryState & state) TSA_REQUIRES(callback_mutex); + void skipData(QueryState & state) TSA_REQUIRES(callback_mutex); + + bool processUnexpectedData(); + [[noreturn]] void processUnexpectedQuery(); + [[noreturn]] void processUnexpectedIgnoredPartUUIDs(); + [[noreturn]] void processUnexpectedHello(); + [[noreturn]] void processUnexpectedTablesStatusRequest(); /// Process INSERT query - void startInsertQuery(); - void processInsertQuery(); - AsynchronousInsertQueue::PushResult processAsyncInsertQuery(AsynchronousInsertQueue & insert_queue); + void startInsertQuery(QueryState & state); + void processInsertQuery(QueryState & state); + AsynchronousInsertQueue::PushResult processAsyncInsertQuery(QueryState & state, AsynchronousInsertQueue & insert_queue); /// Process a request that does not require the receiving of data blocks from the client - void processOrdinaryQuery(); + void processOrdinaryQuery(QueryState & state); void processTablesStatusRequest(); void sendHello(); - void sendData(const Block & block); /// Write a block to the network. - void sendLogData(const Block & block); - void sendTableColumns(const ColumnsDescription & columns); + void sendData(QueryState & state, const Block & block); /// Write a block to the network. + void sendLogData(QueryState & state, const Block & block); + void sendTableColumns(QueryState & state, const ColumnsDescription & columns); void sendException(const Exception & e, bool with_stack_trace); - void sendProgress(); - void sendLogs(); - void sendEndOfStream(); - void sendPartUUIDs(); - void sendReadTaskRequestAssumeLocked(); - void sendMergeTreeAllRangesAnnouncementAssumeLocked(InitialAllRangesAnnouncement announcement); - void sendMergeTreeReadTaskRequestAssumeLocked(ParallelReadRequest request); - void sendProfileInfo(const ProfileInfo & info); - void sendTotals(const Block & totals); - void sendExtremes(const Block & extremes); - void sendProfileEvents(); - void sendSelectProfileEvents(); - void sendInsertProfileEvents(); - void sendTimezone(); + void sendProgress(QueryState & state); + void sendLogs(QueryState & state); + void sendEndOfStream(QueryState & state); + void sendPartUUIDs(QueryState & state); + void sendReadTaskRequest() TSA_REQUIRES(callback_mutex); + void sendMergeTreeAllRangesAnnouncement(QueryState & state, InitialAllRangesAnnouncement announcement) TSA_REQUIRES(callback_mutex); + void sendMergeTreeReadTaskRequest(ParallelReadRequest request) TSA_REQUIRES(callback_mutex); + void sendProfileInfo(QueryState & state, const ProfileInfo & info); + void sendTotals(QueryState & state, const Block & totals); + void sendExtremes(QueryState & state, const Block & extremes); + void sendProfileEvents(QueryState & state); + void sendSelectProfileEvents(QueryState & state); + void sendInsertProfileEvents(QueryState & state); + void sendTimezone(QueryState & state); /// Creates state.block_in/block_out for blocks read/write, depending on whether compression is enabled. - void initBlockInput(); - void initBlockOutput(const Block & block); - void initLogsBlockOutput(const Block & block); - void initProfileEventsBlockOutput(const Block & block); - - using CancellationStatus = QueryState::CancellationStatus; - - void decreaseCancellationStatus(const std::string & log_message); - CancellationStatus getQueryCancellationStatus(); + void initBlockInput(QueryState & state); + void initBlockOutput(QueryState & state, const Block & block); + void initLogsBlockOutput(QueryState & state, const Block & block); + void initProfileEventsBlockOutput(QueryState & state, const Block & block); /// This function is called from different threads. - void updateProgress(const Progress & value); + void updateProgress(QueryState & state, const Progress & value); + void logQueryDuration(QueryState & state); Poco::Net::SocketAddress getClientAddress(const ClientInfo & client_info); }; diff --git a/src/Server/WebUIRequestHandler.cpp b/src/Server/WebUIRequestHandler.cpp index a217ec0ec35..5aa6fe66ef6 100644 --- a/src/Server/WebUIRequestHandler.cpp +++ b/src/Server/WebUIRequestHandler.cpp @@ -41,7 +41,9 @@ static void handle(HTTPServerRequest & request, HTTPServerResponse & response, s setResponseDefaultHeaders(response); response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK); - WriteBufferFromHTTPServerResponse(response, request.getMethod() == HTTPRequest::HTTP_HEAD).write(html.data(), html.size()); + auto wb = WriteBufferFromHTTPServerResponse(response, request.getMethod() == HTTPRequest::HTTP_HEAD); + wb.write(html.data(), html.size()); + wb.finalize(); } void PlayWebUIRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response, const ProfileEvents::Event &) diff --git a/src/Storages/ColumnsDescription.cpp b/src/Storages/ColumnsDescription.cpp index b96c620592d..18514f0b58a 100644 --- a/src/Storages/ColumnsDescription.cpp +++ b/src/Storages/ColumnsDescription.cpp @@ -157,18 +157,6 @@ void ColumnDescription::writeText(WriteBuffer & buf, IAST::FormatState & state, writeEscapedString(formatASTStateAware(*codec, state), buf); } - if (!settings.empty()) - { - writeChar('\t', buf); - DB::writeText("SETTINGS ", buf); - DB::writeText("(", buf); - ASTSetQuery ast; - ast.is_standalone = false; - ast.changes = settings; - writeEscapedString(formatASTStateAware(ast, state), buf); - DB::writeText(")", buf); - } - if (!statistics.empty()) { writeChar('\t', buf); @@ -182,6 +170,18 @@ void ColumnDescription::writeText(WriteBuffer & buf, IAST::FormatState & state, writeEscapedString(formatASTStateAware(*ttl, state), buf); } + if (!settings.empty()) + { + writeChar('\t', buf); + DB::writeText("SETTINGS ", buf); + DB::writeText("(", buf); + ASTSetQuery ast; + ast.is_standalone = false; + ast.changes = settings; + writeEscapedString(formatASTStateAware(ast, state), buf); + DB::writeText(")", buf); + } + writeChar('\n', buf); } diff --git a/src/Storages/FileLog/StorageFileLog.cpp b/src/Storages/FileLog/StorageFileLog.cpp index 873393cff69..d8cdcd2e2f9 100644 --- a/src/Storages/FileLog/StorageFileLog.cpp +++ b/src/Storages/FileLog/StorageFileLog.cpp @@ -357,6 +357,7 @@ void StorageFileLog::serialize(UInt64 inode, const FileMeta & file_meta) const writeIntText(inode, *out); writeChar('\n', *out); writeIntText(file_meta.last_writen_position, *out); + out->finalize(); } catch (...) { diff --git a/src/Storages/Hive/HiveCommon.cpp b/src/Storages/Hive/HiveCommon.cpp index d58e7b535cc..4ea2220b9ef 100644 --- a/src/Storages/Hive/HiveCommon.cpp +++ b/src/Storages/Hive/HiveCommon.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace DB diff --git a/src/Storages/Hive/StorageHive.cpp b/src/Storages/Hive/StorageHive.cpp index 902f7e05566..313ca3c5550 100644 --- a/src/Storages/Hive/StorageHive.cpp +++ b/src/Storages/Hive/StorageHive.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include diff --git a/src/Storages/IMessageProducer.h b/src/Storages/IMessageProducer.h index c769c325191..fb94d613659 100644 --- a/src/Storages/IMessageProducer.h +++ b/src/Storages/IMessageProducer.h @@ -27,6 +27,9 @@ public: /// Finalize producer. virtual void finish() = 0; + /// Cancel producer. + virtual void cancel() noexcept = 0; + virtual ~IMessageProducer() = default; protected: diff --git a/src/Storages/KVStorageUtils.cpp b/src/Storages/KVStorageUtils.cpp index 9731c28fd5a..151717371e2 100644 --- a/src/Storages/KVStorageUtils.cpp +++ b/src/Storages/KVStorageUtils.cpp @@ -268,7 +268,6 @@ std::vector serializeKeysToRawString( std::string & serialized_key = result.emplace_back(); WriteBufferFromString wb(serialized_key); key_column_type->getDefaultSerialization()->serializeBinary(*it, wb, {}); - wb.finalize(); ++it; ++rows_processed; @@ -293,7 +292,6 @@ std::vector serializeKeysToRawString(const ColumnWithTypeAndName & keys.column->get(i, field); /// TODO(@vdimir): use serializeBinaryBulk keys.type->getDefaultSerialization()->serializeBinary(field, wb, {}); - wb.finalize(); } return result; } diff --git a/src/Storages/Kafka/KafkaProducer.cpp b/src/Storages/Kafka/KafkaProducer.cpp index 8b7f03c52ed..f1a579b37ef 100644 --- a/src/Storages/Kafka/KafkaProducer.cpp +++ b/src/Storages/Kafka/KafkaProducer.cpp @@ -107,4 +107,9 @@ void KafkaProducer::finish() } } +void KafkaProducer::cancel() noexcept +{ + /* no op */ +} + } diff --git a/src/Storages/Kafka/KafkaProducer.h b/src/Storages/Kafka/KafkaProducer.h index 2e4bbaf7658..f319ebaf3ff 100644 --- a/src/Storages/Kafka/KafkaProducer.h +++ b/src/Storages/Kafka/KafkaProducer.h @@ -32,6 +32,7 @@ public: void start(const ContextPtr &) override {} void finish() override; + void cancel() noexcept override; private: CurrentMetrics::Increment metric_increment{CurrentMetrics::KafkaProducers}; diff --git a/src/Storages/MergeTree/DataPartsExchange.cpp b/src/Storages/MergeTree/DataPartsExchange.cpp index 1d79ae5aacb..a51a81bfae0 100644 --- a/src/Storages/MergeTree/DataPartsExchange.cpp +++ b/src/Storages/MergeTree/DataPartsExchange.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -53,7 +52,6 @@ namespace ErrorCodes extern const int NO_SUCH_DATA_PART; extern const int ABORTED; extern const int BAD_SIZE_OF_FILE_IN_DATA_PART; - extern const int CANNOT_WRITE_TO_OSTREAM; extern const int CHECKSUM_DOESNT_MATCH; extern const int INSECURE_PATH; extern const int LOGICAL_ERROR; @@ -226,21 +224,6 @@ void Service::processQuery(const HTMLForm & params, ReadBuffer & /*body*/, Write sendPartFromDisk(part, out, client_protocol_version, false, send_projections); data.addLastSentPart(part->info); } - catch (const NetException &) - { - /// Network error or error on remote side. No need to enqueue part for check. - throw; - } - catch (const Exception & e) - { - if (e.code() != ErrorCodes::CANNOT_WRITE_TO_OSTREAM - && !isRetryableException(std::current_exception())) - { - report_broken_part(); - } - - throw; - } catch (...) { if (!isRetryableException(std::current_exception())) @@ -677,17 +660,6 @@ std::pair Fetcher::fetchSelected LOG_WARNING(log, "Will retry fetching part without zero-copy: {}", e.message()); - /// It's important to release session from HTTP pool. Otherwise it's possible to get deadlock - /// on http pool. - try - { - in.reset(); - } - catch (...) - { - tryLogCurrentException(log); - } - temporary_directory_lock = {}; /// Try again but without zero-copy diff --git a/src/Storages/MergeTree/GinIndexStore.cpp b/src/Storages/MergeTree/GinIndexStore.cpp index 17ac503eff4..82b3175dc3f 100644 --- a/src/Storages/MergeTree/GinIndexStore.cpp +++ b/src/Storages/MergeTree/GinIndexStore.cpp @@ -274,6 +274,18 @@ void GinIndexStore::finalize() postings_file_stream->finalize(); } +void GinIndexStore::cancel() noexcept +{ + if (metadata_file_stream) + metadata_file_stream->cancel(); + + if (dict_file_stream) + dict_file_stream->cancel(); + + if (postings_file_stream) + postings_file_stream->cancel(); +} + void GinIndexStore::initFileStreams() { String metadata_file_name = getName() + GIN_SEGMENT_METADATA_FILE_TYPE; diff --git a/src/Storages/MergeTree/GinIndexStore.h b/src/Storages/MergeTree/GinIndexStore.h index 94c880211df..a3f1fd67295 100644 --- a/src/Storages/MergeTree/GinIndexStore.h +++ b/src/Storages/MergeTree/GinIndexStore.h @@ -161,6 +161,7 @@ public: /// Do last segment writing void finalize(); + void cancel() noexcept; /// Method for writing segment data to Gin index files void writeSegment(); diff --git a/src/Storages/MergeTree/IExecutableTask.h b/src/Storages/MergeTree/IExecutableTask.h index ee453e45071..9064759f7b7 100644 --- a/src/Storages/MergeTree/IExecutableTask.h +++ b/src/Storages/MergeTree/IExecutableTask.h @@ -41,6 +41,7 @@ public: virtual bool printExecutionException() const { return true; } virtual void onCompleted() = 0; + virtual void cancel() noexcept = 0; virtual StorageID getStorageID() const = 0; virtual String getQueryId() const = 0; virtual Priority getPriority() const = 0; @@ -72,6 +73,8 @@ public: return false; } + void cancel() noexcept override { /* no op */ } + void onCompleted() override { job_result_callback(!res); } StorageID getStorageID() const override { return id; } Priority getPriority() const override diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.cpp b/src/Storages/MergeTree/IMergeTreeDataPart.cpp index 24ffe20d039..390150e49e5 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.cpp +++ b/src/Storages/MergeTree/IMergeTreeDataPart.cpp @@ -545,7 +545,15 @@ SerializationPtr IMergeTreeDataPart::tryGetSerialization(const String & column_n return it == serializations.end() ? nullptr : it->second; } -void IMergeTreeDataPart::removeIfNeeded() +bool IMergeTreeDataPart::isMovingPart() const +{ + fs::path part_directory_path = getDataPartStorage().getRelativePath(); + if (part_directory_path.filename().empty()) + part_directory_path = part_directory_path.parent_path(); + return part_directory_path.parent_path().filename() == "moving"; +} + +void IMergeTreeDataPart::removeIfNeeded() noexcept { assert(assertHasValidVersionMetadata()); if (!is_temp && state != MergeTreeDataPartState::DeleteOnDestroy) @@ -569,10 +577,7 @@ void IMergeTreeDataPart::removeIfNeeded() throw Exception(ErrorCodes::LOGICAL_ERROR, "relative_path {} of part {} is invalid or not set", getDataPartStorage().getPartDirectory(), name); - fs::path part_directory_path = getDataPartStorage().getRelativePath(); - if (part_directory_path.filename().empty()) - part_directory_path = part_directory_path.parent_path(); - bool is_moving_part = part_directory_path.parent_path().filename() == "moving"; + bool is_moving_part = isMovingPart(); if (!startsWith(file_name, "tmp") && !endsWith(file_name, ".tmp_proj") && !is_moving_part) { LOG_ERROR( diff --git a/src/Storages/MergeTree/IMergeTreeDataPart.h b/src/Storages/MergeTree/IMergeTreeDataPart.h index 77af1e90c43..1623290ecfa 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPart.h +++ b/src/Storages/MergeTree/IMergeTreeDataPart.h @@ -434,6 +434,9 @@ public: bool isProjectionPart() const { return parent_part != nullptr; } + /// Check if the part is in the `/moving` directory + bool isMovingPart() const; + const IMergeTreeDataPart * getParentPart() const { return parent_part; } String getParentPartName() const { return parent_part_name; } @@ -629,7 +632,7 @@ protected: mutable PartMetadataManagerPtr metadata_manager; - void removeIfNeeded(); + void removeIfNeeded() noexcept; /// Fill each_columns_size and total_size with sizes from columns files on /// disk using columns and checksums. diff --git a/src/Storages/MergeTree/IMergeTreeDataPartWriter.h b/src/Storages/MergeTree/IMergeTreeDataPartWriter.h index 545ced98e6e..d6d8cbd115b 100644 --- a/src/Storages/MergeTree/IMergeTreeDataPartWriter.h +++ b/src/Storages/MergeTree/IMergeTreeDataPartWriter.h @@ -45,6 +45,7 @@ public: virtual void fillChecksums(MergeTreeDataPartChecksums & checksums, NameSet & checksums_to_remove) = 0; virtual void finish(bool sync) = 0; + virtual void cancel() noexcept = 0; virtual size_t getNumberOfOpenStreams() const = 0; diff --git a/src/Storages/MergeTree/IMergedBlockOutputStream.cpp b/src/Storages/MergeTree/IMergedBlockOutputStream.cpp index eb904a8e2ef..dd4b02de0a3 100644 --- a/src/Storages/MergeTree/IMergedBlockOutputStream.cpp +++ b/src/Storages/MergeTree/IMergedBlockOutputStream.cpp @@ -120,4 +120,10 @@ NameSet IMergedBlockOutputStream::removeEmptyColumnsFromPart( return remove_files; } +PlainMarksByName IMergedBlockOutputStream::releaseCachedMarks() +{ + if (!writer) + return {}; + return writer->releaseCachedMarks(); +} } diff --git a/src/Storages/MergeTree/IMergedBlockOutputStream.h b/src/Storages/MergeTree/IMergedBlockOutputStream.h index cdaf599b5ea..77f22711b8d 100644 --- a/src/Storages/MergeTree/IMergedBlockOutputStream.h +++ b/src/Storages/MergeTree/IMergedBlockOutputStream.h @@ -28,16 +28,14 @@ public: using WrittenOffsetColumns = std::set; virtual void write(const Block & block) = 0; + virtual void cancel() noexcept = 0; MergeTreeIndexGranularityPtr getIndexGranularity() const { return writer->getIndexGranularity(); } - PlainMarksByName releaseCachedMarks() - { - return writer->releaseCachedMarks(); - } + PlainMarksByName releaseCachedMarks(); size_t getNumberOfOpenStreams() const { diff --git a/src/Storages/MergeTree/KeyCondition.cpp b/src/Storages/MergeTree/KeyCondition.cpp index 9e19ffe1b04..b8c03ba2cd6 100644 --- a/src/Storages/MergeTree/KeyCondition.cpp +++ b/src/Storages/MergeTree/KeyCondition.cpp @@ -945,6 +945,8 @@ static FieldRef applyFunction(const FunctionBasePtr & func, const DataTypePtr & return {field.columns, field.row_idx, result_idx}; } +DataTypePtr getArgumentTypeOfMonotonicFunction(const IFunctionBase & func); + /// Sequentially applies functions to the column, returns `true` /// if all function arguments are compatible with functions /// signatures, and none of the functions produce `NULL` output. @@ -976,7 +978,7 @@ bool applyFunctionChainToColumn( } // And cast it to the argument type of the first function in the chain - auto in_argument_type = functions[0]->getArgumentTypes()[0]; + auto in_argument_type = getArgumentTypeOfMonotonicFunction(*functions[0]); if (canBeSafelyCasted(result_type, in_argument_type)) { result_column = castColumnAccurate({result_column, result_type, ""}, in_argument_type); @@ -1005,7 +1007,7 @@ bool applyFunctionChainToColumn( if (func->getArgumentTypes().empty()) return false; - auto argument_type = func->getArgumentTypes()[0]; + auto argument_type = getArgumentTypeOfMonotonicFunction(*func); if (!canBeSafelyCasted(result_type, argument_type)) return false; @@ -1489,6 +1491,18 @@ private: Kind kind = Kind::NO_CONST; }; +DataTypePtr getArgumentTypeOfMonotonicFunction(const IFunctionBase & func) +{ + const auto & arg_types = func.getArgumentTypes(); + if (const auto * func_ptr = typeid_cast(&func)) + { + if (func_ptr->getKind() == FunctionWithOptionalConstArg::Kind::LEFT_CONST) + return arg_types.at(1); + } + + return arg_types.at(0); +} + bool KeyCondition::isKeyPossiblyWrappedByMonotonicFunctions( const RPNBuilderTreeNode & node, diff --git a/src/Storages/MergeTree/MergeFromLogEntryTask.h b/src/Storages/MergeTree/MergeFromLogEntryTask.h index 16e69a568ba..1ceef7d5995 100644 --- a/src/Storages/MergeTree/MergeFromLogEntryTask.h +++ b/src/Storages/MergeTree/MergeFromLogEntryTask.h @@ -26,6 +26,12 @@ public: Priority getPriority() const override { return priority; } + void cancel() noexcept override + { + if (merge_task) + merge_task->cancel(); + } + protected: /// Both return false if we can't execute merge. ReplicatedMergeMutateTaskBase::PrepareResult prepare() override; diff --git a/src/Storages/MergeTree/MergePlainMergeTreeTask.cpp b/src/Storages/MergeTree/MergePlainMergeTreeTask.cpp index 6aca58faf47..5b3d410a493 100644 --- a/src/Storages/MergeTree/MergePlainMergeTreeTask.cpp +++ b/src/Storages/MergeTree/MergePlainMergeTreeTask.cpp @@ -62,6 +62,7 @@ bool MergePlainMergeTreeTask::executeStep() } catch (...) { + tryLogCurrentException(__PRETTY_FUNCTION__, "Exception is in merge_task."); write_part_log(ExecutionStatus::fromCurrentException("", true)); throw; } @@ -99,7 +100,6 @@ void MergePlainMergeTreeTask::prepare() write_part_log = [this] (const ExecutionStatus & execution_status) { auto profile_counters_snapshot = std::make_shared(profile_counters.getPartiallyAtomicSnapshot()); - merge_task.reset(); storage.writePartLog( PartLogElement::MERGE_PARTS, execution_status, @@ -159,6 +159,7 @@ void MergePlainMergeTreeTask::finish() } write_part_log({}); + StorageMergeTree::incrementMergedPartsProfileEvent(new_part->getType()); transfer_profile_counters_to_initial_query(); @@ -171,12 +172,18 @@ void MergePlainMergeTreeTask::finish() } } +void MergePlainMergeTreeTask::cancel() noexcept +{ + if (merge_task) + merge_task->cancel(); +} + ContextMutablePtr MergePlainMergeTreeTask::createTaskContext() const { auto context = Context::createCopy(storage.getContext()); context->makeQueryContextForMerge(*storage.getSettings()); - auto queryId = getQueryId(); - context->setCurrentQueryId(queryId); + auto query_id = getQueryId(); + context->setCurrentQueryId(query_id); context->setBackgroundOperationTypeForContext(ClientInfo::BackgroundOperationType::MERGE); return context; } diff --git a/src/Storages/MergeTree/MergePlainMergeTreeTask.h b/src/Storages/MergeTree/MergePlainMergeTreeTask.h index 013da902dea..dafa5fd1ec0 100644 --- a/src/Storages/MergeTree/MergePlainMergeTreeTask.h +++ b/src/Storages/MergeTree/MergePlainMergeTreeTask.h @@ -49,6 +49,8 @@ public: txn = std::move(txn_); } + void cancel() noexcept override; + private: void prepare(); void finish(); @@ -59,7 +61,7 @@ private: NEED_EXECUTE, NEED_FINISH, - SUCCESS + SUCCESS, }; State state{State::NEED_PREPARE}; diff --git a/src/Storages/MergeTree/MergeProjectionPartsTask.h b/src/Storages/MergeTree/MergeProjectionPartsTask.h index 47cafe01151..b881f368330 100644 --- a/src/Storages/MergeTree/MergeProjectionPartsTask.h +++ b/src/Storages/MergeTree/MergeProjectionPartsTask.h @@ -50,6 +50,7 @@ public: } void onCompleted() override { throw Exception(ErrorCodes::LOGICAL_ERROR, "Not implemented"); } + void cancel() noexcept override { chassert(false, "Not implemented"); } StorageID getStorageID() const override { throw Exception(ErrorCodes::LOGICAL_ERROR, "Not implemented"); } Priority getPriority() const override { throw Exception(ErrorCodes::LOGICAL_ERROR, "Not implemented"); } String getQueryId() const override { throw Exception(ErrorCodes::LOGICAL_ERROR, "Not implemented"); } diff --git a/src/Storages/MergeTree/MergeTask.cpp b/src/Storages/MergeTree/MergeTask.cpp index 9a594eef56b..b978beae14b 100644 --- a/src/Storages/MergeTree/MergeTask.cpp +++ b/src/Storages/MergeTree/MergeTask.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -677,6 +678,12 @@ bool MergeTask::ExecuteAndFinalizeHorizontalPart::execute() return subtasks_iterator != subtasks.end(); } +void MergeTask::ExecuteAndFinalizeHorizontalPart::cancel() noexcept +{ + if (ctx->merge_projection_parts_task_ptr) + ctx->merge_projection_parts_task_ptr->cancel(); +} + void MergeTask::ExecuteAndFinalizeHorizontalPart::prepareProjectionsToMergeAndRebuild() const { @@ -1347,9 +1354,26 @@ bool MergeTask::VerticalMergeStage::execute() /// Move to the next subtask in an array of subtasks ++subtasks_iterator; + return subtasks_iterator != subtasks.end(); } +void MergeTask::VerticalMergeStage::cancel() noexcept +{ + if (ctx->column_to) + ctx->column_to->cancel(); + + if (ctx->prepared_pipeline.has_value()) + ctx->prepared_pipeline->pipeline.cancel(); + + for (auto & stream : ctx->delayed_streams) + stream->cancel(); + + if (ctx->executor) + ctx->executor->cancel(); + +} + bool MergeTask::MergeProjectionsStage::execute() { chassert(subtasks_iterator != subtasks.end()); @@ -1366,6 +1390,12 @@ bool MergeTask::MergeProjectionsStage::execute() return subtasks_iterator != subtasks.end(); } +void MergeTask::MergeProjectionsStage::cancel() noexcept +{ + for (auto & prj_task: ctx->tasks_for_projections) + prj_task->cancel(); +} + bool MergeTask::VerticalMergeStage::executeVerticalMergeForAllColumns() const { @@ -1436,6 +1466,20 @@ bool MergeTask::execute() return true; } +void MergeTask::cancel() noexcept +{ + if (stages_iterator != stages.end()) + (*stages_iterator)->cancel(); + + if (global_ctx->merging_executor) + global_ctx->merging_executor->cancel(); + + global_ctx->merged_pipeline.cancel(); + + if (global_ctx->to) + global_ctx->to->cancel(); +} + /// Apply merge strategy (Ordinary, Collapsing, Aggregating, etc) to the stream class MergePartsStep : public ITransformingStep diff --git a/src/Storages/MergeTree/MergeTask.h b/src/Storages/MergeTree/MergeTask.h index cff4e5e763c..721a2a933e1 100644 --- a/src/Storages/MergeTree/MergeTask.h +++ b/src/Storages/MergeTree/MergeTask.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -142,6 +143,8 @@ public: bool execute(); + void cancel() noexcept; + private: struct IStage; using StagePtr = std::shared_ptr; @@ -155,6 +158,7 @@ private: virtual StageRuntimeContextPtr getContextForNextStage() = 0; virtual ProfileEvents::Event getTotalTimeProfileEvent() const = 0; virtual bool execute() = 0; + virtual void cancel() noexcept = 0; virtual ~IStage() = default; }; @@ -278,6 +282,7 @@ private: struct ExecuteAndFinalizeHorizontalPart : public IStage { bool execute() override; + void cancel() noexcept override; bool prepare() const; bool executeImpl() const; @@ -366,6 +371,8 @@ private: struct VerticalMergeStage : public IStage { bool execute() override; + void cancel() noexcept override; + void setRuntimeContext(StageRuntimeContextPtr local, StageRuntimeContextPtr global) override { ctx = static_pointer_cast(local); @@ -422,6 +429,8 @@ private: { bool execute() override; + void cancel() noexcept override; + void setRuntimeContext(StageRuntimeContextPtr local, StageRuntimeContextPtr global) override { ctx = static_pointer_cast(local); diff --git a/src/Storages/MergeTree/MergeTreeBackgroundExecutor.cpp b/src/Storages/MergeTree/MergeTreeBackgroundExecutor.cpp index 4a4deb07eee..f9a99402ed1 100644 --- a/src/Storages/MergeTree/MergeTreeBackgroundExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeBackgroundExecutor.cpp @@ -187,16 +187,7 @@ void MergeTreeBackgroundExecutor::removeTasksCorrespondingToStorage(Stora std::lock_guard lock(mutex); /// Erase storage related tasks from pending and select active tasks to wait for - try - { - /// An exception context is needed to proper delete write buffers without finalization - /// See WriteBuffer::~WriteBuffer for more context - throw std::runtime_error("Storage is about to be deleted. Done pending task as if it was aborted."); - } - catch (...) - { - pending.remove(id); - } + pending.cancelAndRemove(id); /// Copy items to wait for their completion std::copy_if(active.begin(), active.end(), std::back_inserter(tasks_to_wait), @@ -227,7 +218,7 @@ void MergeTreeBackgroundExecutor::routine(TaskRuntimeDataPtr item) active.erase(std::remove(active.begin(), active.end(), item_), active.end()); }; - auto on_task_done = [] (TaskRuntimeDataPtr && item_) TSA_REQUIRES(mutex) + auto release_task = [] (TaskRuntimeDataPtr && item_) TSA_REQUIRES(mutex) { /// We have to call reset() under a lock, otherwise a race is possible. /// Imagine, that task is finally completed (last execution returned false), @@ -242,8 +233,22 @@ void MergeTreeBackgroundExecutor::routine(TaskRuntimeDataPtr item) item_.reset(); }; - auto on_task_restart = [this](TaskRuntimeDataPtr && item_) TSA_REQUIRES(mutex) + auto restart_task = [this, &erase_from_active, &release_task] (TaskRuntimeDataPtr && item_) { + std::lock_guard guard(mutex); + erase_from_active(item_); + + if (item_->is_currently_deleting) + { + { + ALLOW_ALLOCATIONS_IN_SCOPE; + item_->task->cancel(); + } + + release_task(std::move(item_)); + return; + } + /// After the `guard` destruction `item` has to be in moved from state /// Not to own the object it points to. /// Otherwise the destruction of the task won't be ordered with the destruction of the @@ -254,7 +259,7 @@ void MergeTreeBackgroundExecutor::routine(TaskRuntimeDataPtr item) String query_id; - auto release_task = [this, &erase_from_active, &on_task_done, &query_id](TaskRuntimeDataPtr && item_) + auto complete_task = [this, &erase_from_active, &release_task, &query_id] (TaskRuntimeDataPtr && item_) { std::lock_guard guard(mutex); @@ -272,9 +277,26 @@ void MergeTreeBackgroundExecutor::routine(TaskRuntimeDataPtr item) catch (...) { printExceptionWithRespectToAbort(log, query_id); + ALLOW_ALLOCATIONS_IN_SCOPE; + item_->task->cancel(); } - on_task_done(std::move(item_)); + release_task(std::move(item_)); + }; + + auto cancel_task = [this, &erase_from_active, &release_task] (TaskRuntimeDataPtr && item_) + { + std::lock_guard guard(mutex); + + erase_from_active(item_); + has_tasks.notify_one(); + + { + ALLOW_ALLOCATIONS_IN_SCOPE; + item_->task->cancel(); + } + + release_task(std::move(item_)); }; bool need_execute_again = false; @@ -291,38 +313,17 @@ void MergeTreeBackgroundExecutor::routine(TaskRuntimeDataPtr item) printExceptionWithRespectToAbort(log, query_id); /// Release the task with exception context. /// An exception context is needed to proper delete write buffers without finalization - release_task(std::move(item)); + cancel_task(std::move(item)); return; } if (!need_execute_again) { - release_task(std::move(item)); + complete_task(std::move(item)); return; } - { - std::lock_guard guard(mutex); - erase_from_active(item); - - if (item->is_currently_deleting) - { - try - { - ALLOW_ALLOCATIONS_IN_SCOPE; - /// An exception context is needed to proper delete write buffers without finalization - throw Exception(ErrorCodes::ABORTED, "Storage is about to be deleted. Done active task as if it was aborted."); - } - catch (...) - { - printExceptionWithRespectToAbort(log, query_id); - on_task_done(std::move(item)); - return; - } - } - - on_task_restart(std::move(item)); - } + restart_task(std::move(item)); } diff --git a/src/Storages/MergeTree/MergeTreeBackgroundExecutor.h b/src/Storages/MergeTree/MergeTreeBackgroundExecutor.h index 0ed03293589..4f69581b703 100644 --- a/src/Storages/MergeTree/MergeTreeBackgroundExecutor.h +++ b/src/Storages/MergeTree/MergeTreeBackgroundExecutor.h @@ -88,8 +88,14 @@ public: queue.push_back(std::move(item)); } - void remove(StorageID id) + void cancelAndRemove(StorageID id) { + for (auto & item : queue) + { + if (item->task->getStorageID() == id) + item->task->cancel(); + } + auto it = std::remove_if(queue.begin(), queue.end(), [&] (auto && item) -> bool { return item->task->getStorageID() == id; }); queue.erase(it, queue.end()); @@ -128,8 +134,14 @@ public: std::push_heap(buffer.begin(), buffer.end(), TaskRuntimeData::comparePtrByPriority); } - void remove(StorageID id) + void cancelAndRemove(StorageID id) { + for (auto & item : buffer) + { + if (item->task->getStorageID() == id) + item->task->cancel(); + } + std::erase_if(buffer, [&] (auto && item) -> bool { return item->task->getStorageID() == id; }); std::make_heap(buffer.begin(), buffer.end(), TaskRuntimeData::comparePtrByPriority); } @@ -163,9 +175,9 @@ public: std::visit([&] (auto && queue) { queue.push(std::move(item)); }, impl); } - void remove(StorageID id) + void cancelAndRemove(StorageID id) { - std::visit([&] (auto && queue) { queue.remove(id); }, impl); + std::visit([&] (auto && queue) { queue.cancelAndRemove(id); }, impl); } void setCapacity(size_t count) diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index d745b428061..114d4ecb52a 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -8258,33 +8258,49 @@ MovePartsOutcome MergeTreeData::moveParts(const CurrentlyMovingPartsTaggerPtr & /// replica will actually move the part from disk to some /// zero-copy storage other replicas will just fetch /// metainformation. - if (auto lock = tryCreateZeroCopyExclusiveLock(moving_part.part->name, disk); lock) - { - if (lock->isLocked()) - { - cloned_part = parts_mover.clonePart(moving_part, read_settings, write_settings); - parts_mover.swapClonedPart(cloned_part); - break; - } - if (wait_for_move_if_zero_copy) - { - LOG_DEBUG(log, "Other replica is working on move of {}, will wait until lock disappear", moving_part.part->name); - /// Wait and checks not only for timeout but also for shutdown and so on. - while (!waitZeroCopyLockToDisappear(*lock, 3000)) - { - LOG_DEBUG(log, "Waiting until some replica will move {} and zero copy lock disappear", moving_part.part->name); - } - } - else - break; - } - else + auto lock = tryCreateZeroCopyExclusiveLock(moving_part.part->name, disk); + if (!lock) { /// Move will be retried but with backoff. - LOG_DEBUG(log, "Move of part {} postponed, because zero copy mode enabled and someone other moving this part right now", moving_part.part->name); + LOG_DEBUG( + log, + "Move of part {} postponed, because zero copy mode enabled and zero-copy lock was not acquired", + moving_part.part->name); result = MovePartsOutcome::MoveWasPostponedBecauseOfZeroCopy; break; } + + if (lock->isLocked()) + { + cloned_part = parts_mover.clonePart(moving_part, read_settings, write_settings); + /// Cloning part can take a long time. + /// Recheck if the lock (and keeper session expirity) is OK + if (lock->isLocked()) + { + parts_mover.swapClonedPart(cloned_part); + break; /// Successfully moved + } + else + { + LOG_DEBUG( + log, + "Move of part {} postponed, because zero copy mode enabled and zero-copy lock was lost during cloning the part", + moving_part.part->name); + result = MovePartsOutcome::MoveWasPostponedBecauseOfZeroCopy; + break; + } + } + if (wait_for_move_if_zero_copy) + { + LOG_DEBUG(log, "Other replica is working on move of {}, will wait until lock disappear", moving_part.part->name); + /// Wait and checks not only for timeout but also for shutdown and so on. + while (!waitZeroCopyLockToDisappear(*lock, 3000)) + { + LOG_DEBUG(log, "Waiting until some replica will move {} and zero copy lock disappear", moving_part.part->name); + } + } + else + break; } } else /// Ordinary move as it should be diff --git a/src/Storages/MergeTree/MergeTreeDataPartWide.cpp b/src/Storages/MergeTree/MergeTreeDataPartWide.cpp index 2448f52c679..f40b89898c8 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWide.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWide.cpp @@ -215,7 +215,10 @@ void MergeTreeDataPartWide::loadMarksToCache(const Names & column_names, MarkCac for (const auto & column_name : column_names) { - auto serialization = getSerialization(column_name); + auto serialization = tryGetSerialization(column_name); + if (!serialization) + continue; + serialization->enumerateStreams([&](const auto & subpath) { auto stream_name = getStreamNameForColumn(column_name, subpath, checksums); diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.cpp index 72976d182ed..6b7d5382f78 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.cpp @@ -471,4 +471,30 @@ void MergeTreeDataPartWriterCompact::finish(bool sync) finishStatisticsSerialization(sync); } +void MergeTreeDataPartWriterCompact::cancel() noexcept +{ + for (const auto & [_, stream] : streams_by_codec) + { + stream->hashing_buf.cancel(); + stream->compressed_buf.cancel(); + } + + plain_hashing.cancel(); + + plain_file->cancel(); + + if (marks_source_hashing) + marks_source_hashing->cancel(); + + if (marks_compressor) + marks_compressor->cancel(); + + marks_file_hashing->cancel(); + + marks_file->cancel(); + + Base::cancel(); +} + + } diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.h b/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.h index db2a362a1df..6c92fcf3ddd 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.h +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterCompact.h @@ -9,6 +9,8 @@ namespace DB /// Writes data part in compact format. class MergeTreeDataPartWriterCompact : public MergeTreeDataPartWriterOnDisk { + using Base = MergeTreeDataPartWriterOnDisk; + public: MergeTreeDataPartWriterCompact( const String & data_part_name_, @@ -31,6 +33,7 @@ public: void fillChecksums(MergeTreeDataPartChecksums & checksums, NameSet & checksums_to_remove) override; void finish(bool sync) override; + void cancel() noexcept override; size_t getNumberOfOpenStreams() const override { return 1; } diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp index 1f913623fc9..391b7be64e2 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.cpp @@ -32,19 +32,14 @@ void MergeTreeDataPartWriterOnDisk::Stream::preFinalize() /// Before that all hashing and compression buffers have to be finalized /// Otherwise some data might stuck in the buffers above plain_file and marks_file /// Also the order is important - compressed_hashing.finalize(); compressor.finalize(); plain_hashing.finalize(); if constexpr (!only_plain_file) { - if (compress_marks) - { - marks_compressed_hashing.finalize(); - marks_compressor.finalize(); - } - + marks_compressed_hashing.finalize(); + marks_compressor.finalize(); marks_hashing.finalize(); } @@ -62,10 +57,31 @@ void MergeTreeDataPartWriterOnDisk::Stream::finalize() preFinalize(); plain_file->finalize(); + if constexpr (!only_plain_file) marks_file->finalize(); } +template +void MergeTreeDataPartWriterOnDisk::Stream::cancel() noexcept +{ + + compressed_hashing.cancel(); + compressor.cancel(); + plain_hashing.cancel(); + + if constexpr (!only_plain_file) + { + marks_compressed_hashing.cancel(); + marks_compressor.cancel(); + marks_hashing.cancel(); + } + + plain_file->cancel(); + if constexpr (!only_plain_file) + marks_file->cancel(); +} + template void MergeTreeDataPartWriterOnDisk::Stream::sync() const { @@ -189,6 +205,27 @@ MergeTreeDataPartWriterOnDisk::MergeTreeDataPartWriterOnDisk( initStatistics(); } +void MergeTreeDataPartWriterOnDisk::cancel() noexcept +{ + if (index_file_stream) + index_file_stream->cancel(); + if (index_file_hashing_stream) + index_file_hashing_stream->cancel(); + if (index_compressor_stream) + index_compressor_stream->cancel(); + if (index_source_hashing_stream) + index_source_hashing_stream->cancel(); + + for (auto & stream : stats_streams) + stream->cancel(); + + for (auto & stream : skip_indices_streams) + stream->cancel(); + + for (auto & store: gin_index_stores) + store.second->cancel(); +} + size_t MergeTreeDataPartWriterOnDisk::computeIndexGranularity(const Block & block) const { return DB::computeIndexGranularity( @@ -249,6 +286,7 @@ void MergeTreeDataPartWriterOnDisk::initSkipIndices() for (const auto & skip_index : skip_indices) { String stream_name = skip_index->getFileName(); + skip_indices_streams.emplace_back( std::make_unique>( stream_name, @@ -412,8 +450,10 @@ void MergeTreeDataPartWriterOnDisk::fillPrimaryIndexChecksums(MergeTreeData::Dat checksums.files[index_name].uncompressed_size = index_source_hashing_stream->count(); checksums.files[index_name].uncompressed_hash = index_source_hashing_stream->getHash(); } + checksums.files[index_name].file_size = index_file_hashing_stream->count(); checksums.files[index_name].file_hash = index_file_hashing_stream->getHash(); + index_file_stream->preFinalize(); } } @@ -431,6 +471,7 @@ void MergeTreeDataPartWriterOnDisk::finishPrimaryIndexSerialization(bool sync) index_source_hashing_stream = nullptr; index_compressor_stream = nullptr; } + index_file_hashing_stream = nullptr; } } @@ -495,6 +536,7 @@ void MergeTreeDataPartWriterOnDisk::finishSkipIndicesSerialization(bool sync) if (sync) stream->sync(); } + for (auto & store: gin_index_stores) store.second->finalize(); diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.h b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.h index b937ab79ebc..5b869c252c3 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.h +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterOnDisk.h @@ -70,6 +70,12 @@ public: size_t max_compress_block_size_, const WriteSettings & query_write_settings); + ~Stream() + { + plain_file.reset(); + marks_file.reset(); + } + String escaped_column_name; std::string data_file_extension; std::string marks_file_extension; @@ -92,6 +98,7 @@ public: void preFinalize(); void finalize(); + void cancel() noexcept; void sync() const; @@ -123,6 +130,9 @@ public: written_offset_columns = written_offset_columns_; } + + void cancel() noexcept override; + Block getColumnsSample() const override { return block_sample; } protected: diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp index 539682a2f02..13cb42f46f4 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.cpp @@ -765,6 +765,17 @@ void MergeTreeDataPartWriterWide::finish(bool sync) finishStatisticsSerialization(sync); } +void MergeTreeDataPartWriterWide::cancel() noexcept +{ + for (auto & stream : column_streams) + stream.second->cancel(); + + column_streams.clear(); + serialization_states.clear(); + + Base::cancel(); +} + void MergeTreeDataPartWriterWide::writeFinalMark( const NameAndTypePair & name_and_type, WrittenOffsetColumns & offset_columns) diff --git a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.h b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.h index 409c7c7fb52..bb4121a670c 100644 --- a/src/Storages/MergeTree/MergeTreeDataPartWriterWide.h +++ b/src/Storages/MergeTree/MergeTreeDataPartWriterWide.h @@ -19,6 +19,8 @@ using ColumnNameToMark = std::unordered_map; /// Writes data part in wide format. class MergeTreeDataPartWriterWide : public MergeTreeDataPartWriterOnDisk { + using Base = MergeTreeDataPartWriterOnDisk; + public: MergeTreeDataPartWriterWide( const String & data_part_name_, @@ -42,6 +44,7 @@ public: void fillChecksums(MergeTreeDataPartChecksums & checksums, NameSet & checksums_to_remove) final; void finish(bool sync) final; + void cancel() noexcept override; size_t getNumberOfOpenStreams() const override { return column_streams.size(); } diff --git a/src/Storages/MergeTree/MergeTreeDataWriter.cpp b/src/Storages/MergeTree/MergeTreeDataWriter.cpp index cbec8862f94..5e78ab49010 100644 --- a/src/Storages/MergeTree/MergeTreeDataWriter.cpp +++ b/src/Storages/MergeTree/MergeTreeDataWriter.cpp @@ -14,6 +14,7 @@ #include #include #include +#include "Common/logger_useful.h" #include #include #include @@ -78,7 +79,6 @@ namespace MergeTreeSetting namespace ErrorCodes { - extern const int ABORTED; extern const int LOGICAL_ERROR; extern const int TOO_MANY_PARTS; extern const int NOT_ENOUGH_SPACE; @@ -206,15 +206,14 @@ void updateTTL( void MergeTreeDataWriter::TemporaryPart::cancel() { - try + for (auto & stream : streams) { - /// An exception context is needed to proper delete write buffers without finalization - throw Exception(ErrorCodes::ABORTED, "Cancel temporary part."); - } - catch (...) - { - *this = TemporaryPart{}; + stream.stream->cancel(); + stream.finalizer.cancel(); } + + /// The part is trying to delete leftovers here + part.reset(); } void MergeTreeDataWriter::TemporaryPart::finalize() diff --git a/src/Storages/MergeTree/MergeTreePartsMover.cpp b/src/Storages/MergeTree/MergeTreePartsMover.cpp index e9c9f2b4b06..82eafd47cb8 100644 --- a/src/Storages/MergeTree/MergeTreePartsMover.cpp +++ b/src/Storages/MergeTree/MergeTreePartsMover.cpp @@ -259,6 +259,7 @@ MergeTreePartsMover::TemporaryClonedPart MergeTreePartsMover::clonePart(const Me disk->createDirectories(path_to_clone); + /// TODO: Make it possible to fetch only zero-copy part without fallback to fetching a full-copy one auto zero_copy_part = data->tryToFetchIfShared(*part, disk, fs::path(path_to_clone) / part->name); if (zero_copy_part) @@ -301,6 +302,28 @@ MergeTreePartsMover::TemporaryClonedPart MergeTreePartsMover::clonePart(const Me return cloned_part; } +void MergeTreePartsMover::renameClonedPart(IMergeTreeDataPart & part) const +try +{ + part.is_temp = false; + /// Mark it DeleteOnDestroy to ensure deleting in destructor + /// if something goes wrong before swapping + part.setState(MergeTreeDataPartState::DeleteOnDestroy); + /// Don't remove new directory but throw an error because it may contain part which is currently in use. + part.renameTo(part.name, /* remove_new_dir_if_exists */ false); +} +catch (...) +{ + /// Check if part was renamed or not + /// `renameTo()` does not provide strong exception guarantee in case of an exception + if (part.isMovingPart()) + { + /// Restore its temporary state + part.is_temp = true; + part.setState(MergeTreeDataPartState::Temporary); + } + throw; +} void MergeTreePartsMover::swapClonedPart(TemporaryClonedPart & cloned_part) const { @@ -327,12 +350,23 @@ void MergeTreePartsMover::swapClonedPart(TemporaryClonedPart & cloned_part) cons return; } - cloned_part.part->is_temp = false; + /// It is safe to acquire zero-copy lock for the temporary part here + /// because no one can fetch it until it is *swapped*. + /// + /// Set ASK_KEEPER to try to unlock it in destructor if something goes wrong before *renaming* + /// If unlocking is failed we will not get a stuck part in moving directory + /// because it will be renamed to delete_tmp_ beforehand and cleaned up later. + /// Worst outcomes: trash in object storage and/or orphaned shared zero-copy lock. It is acceptable. + /// See DataPartStorageOnDiskBase::remove(). + cloned_part.part->remove_tmp_policy = IMergeTreeDataPart::BlobsRemovalPolicyForTemporaryParts::ASK_KEEPER; + data->lockSharedData(*cloned_part.part, /* replace_existing_lock = */ true); - /// Don't remove new directory but throw an error because it may contain part which is currently in use. - cloned_part.part->renameTo(active_part->name, false); + renameClonedPart(*cloned_part.part); - /// TODO what happen if server goes down here? + /// If server goes down here we will get two copy of the part with the same name on different disks. + /// And on the next ClickHouse startup during loading parts the first copy (in the order of defining disks + /// in the storage policy) will be loaded as Active, the second one will be loaded as Outdated and removed as duplicate. + /// See MergeTreeData::loadDataParts(). data->swapActivePart(cloned_part.part, part_lock); LOG_TRACE(log, "Part {} was moved to {}", cloned_part.part->name, cloned_part.part->getDataPartStorage().getFullPath()); diff --git a/src/Storages/MergeTree/MergeTreePartsMover.h b/src/Storages/MergeTree/MergeTreePartsMover.h index 3cf270946d8..7a6583008c0 100644 --- a/src/Storages/MergeTree/MergeTreePartsMover.h +++ b/src/Storages/MergeTree/MergeTreePartsMover.h @@ -75,6 +75,9 @@ public: /// merge or mutation. void swapClonedPart(TemporaryClonedPart & cloned_part) const; + /// Rename cloned part from `moving/` directory to the actual part storage + void renameClonedPart(IMergeTreeDataPart & part) const; + /// Can stop background moves and moves from queries ActionBlocker moves_blocker; diff --git a/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp b/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp index 426e95fd95d..14f877dfd56 100644 --- a/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp +++ b/src/Storages/MergeTree/MergeTreeSelectProcessor.cpp @@ -54,6 +54,7 @@ namespace DB namespace ErrorCodes { extern const int QUERY_WAS_CANCELLED; + extern const int QUERY_WAS_CANCELLED_BY_CLIENT; } ParallelReadingExtension::ParallelReadingExtension( @@ -180,7 +181,7 @@ ChunkAndProgress MergeTreeSelectProcessor::read() } catch (const Exception & e) { - if (e.code() == ErrorCodes::QUERY_WAS_CANCELLED) + if (e.code() == ErrorCodes::QUERY_WAS_CANCELLED || e.code() == ErrorCodes::QUERY_WAS_CANCELLED_BY_CLIENT) break; throw; } diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.cpp b/src/Storages/MergeTree/MergedBlockOutputStream.cpp index 9fa8b279e86..979b4698738 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.cpp +++ b/src/Storages/MergeTree/MergedBlockOutputStream.cpp @@ -81,6 +81,13 @@ void MergedBlockOutputStream::write(const Block & block) writeImpl(block, nullptr); } +void MergedBlockOutputStream::cancel() noexcept +{ + if (writer) + writer->cancel(); +} + + /** If the data is not sorted, but we pre-calculated the permutation, after which they will be sorted. * This method is used to save RAM, since you do not need to keep two blocks at once - the source and the sorted. */ @@ -106,6 +113,7 @@ struct MergedBlockOutputStream::Finalizer::Impl } void finish(); + void cancel(); }; void MergedBlockOutputStream::Finalizer::finish() @@ -116,6 +124,14 @@ void MergedBlockOutputStream::Finalizer::finish() to_finish->finish(); } +void MergedBlockOutputStream::Finalizer::cancel() +{ + std::unique_ptr to_cancel = std::move(impl); + impl.reset(); + if (to_cancel) + to_cancel->cancel(); +} + void MergedBlockOutputStream::Finalizer::Impl::finish() { writer.finish(sync); @@ -145,6 +161,16 @@ void MergedBlockOutputStream::Finalizer::Impl::finish() part->getDataPartStorage().removeFile(file_name); } +void MergedBlockOutputStream::Finalizer::Impl::cancel() +{ + writer.cancel(); + + for (auto & file : written_files) + { + file->cancel(); + } +} + MergedBlockOutputStream::Finalizer::Finalizer(Finalizer &&) noexcept = default; MergedBlockOutputStream::Finalizer & MergedBlockOutputStream::Finalizer::operator=(Finalizer &&) noexcept = default; MergedBlockOutputStream::Finalizer::Finalizer(std::unique_ptr impl_) : impl(std::move(impl_)) {} @@ -211,9 +237,9 @@ MergedBlockOutputStream::Finalizer MergedBlockOutputStream::finalizePartAsync( new_part->setColumns(part_columns, serialization_infos, metadata_snapshot->getMetadataVersion()); } - auto finalizer = std::make_unique(*writer, new_part, files_to_remove_after_sync, sync); + std::vector> written_files; if (new_part->isStoredOnDisk()) - finalizer->written_files = finalizePartOnDisk(new_part, checksums); + written_files = finalizePartOnDisk(new_part, checksums); new_part->rows_count = rows_count; new_part->modification_time = time(nullptr); @@ -238,6 +264,8 @@ MergedBlockOutputStream::Finalizer MergedBlockOutputStream::finalizePartAsync( if (default_codec != nullptr) new_part->default_codec = default_codec; + auto finalizer = std::make_unique(*writer, new_part, files_to_remove_after_sync, sync); + finalizer->written_files = std::move(written_files); return Finalizer(std::move(finalizer)); } diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.h b/src/Storages/MergeTree/MergedBlockOutputStream.h index 94bdb2c491b..afa2eaf18ec 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.h +++ b/src/Storages/MergeTree/MergedBlockOutputStream.h @@ -34,6 +34,8 @@ public: /// If the data is pre-sorted. void write(const Block & block) override; + void cancel() noexcept override; + /** If the data is not sorted, but we have previously calculated the permutation, that will sort it. * This method is used to save RAM, since you do not need to keep two blocks at once - the original one and the sorted one. */ @@ -53,6 +55,7 @@ public: ~Finalizer(); void finish(); + void cancel(); }; /// Finalize writing part and fill inner structures diff --git a/src/Storages/MergeTree/MergedColumnOnlyOutputStream.cpp b/src/Storages/MergeTree/MergedColumnOnlyOutputStream.cpp index 4163bceeab7..c6fd992bbf6 100644 --- a/src/Storages/MergeTree/MergedColumnOnlyOutputStream.cpp +++ b/src/Storages/MergeTree/MergedColumnOnlyOutputStream.cpp @@ -107,4 +107,9 @@ void MergedColumnOnlyOutputStream::finish(bool sync) writer->finish(sync); } +void MergedColumnOnlyOutputStream::cancel() noexcept +{ + writer->cancel(); +} + } diff --git a/src/Storages/MergeTree/MergedColumnOnlyOutputStream.h b/src/Storages/MergeTree/MergedColumnOnlyOutputStream.h index 0338273e96c..f2f2f10d6ff 100644 --- a/src/Storages/MergeTree/MergedColumnOnlyOutputStream.h +++ b/src/Storages/MergeTree/MergedColumnOnlyOutputStream.h @@ -31,6 +31,7 @@ public: fillChecksums(MergeTreeData::MutableDataPartPtr & new_part, MergeTreeData::DataPart::Checksums & all_checksums); void finish(bool sync); + void cancel() noexcept override; }; using MergedColumnOnlyOutputStreamPtr = std::shared_ptr; diff --git a/src/Storages/MergeTree/MutateFromLogEntryTask.h b/src/Storages/MergeTree/MutateFromLogEntryTask.h index 68c7f464214..218c7afc79b 100644 --- a/src/Storages/MergeTree/MutateFromLogEntryTask.h +++ b/src/Storages/MergeTree/MutateFromLogEntryTask.h @@ -33,6 +33,12 @@ public: Priority getPriority() const override { return priority; } + void cancel() noexcept override + { + if (mutate_task) + mutate_task->cancel(); + } + private: ReplicatedMergeMutateTaskBase::PrepareResult prepare() override; diff --git a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp index fbc20b282ca..18c7153610c 100644 --- a/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp +++ b/src/Storages/MergeTree/MutatePlainMergeTreeTask.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -48,7 +49,6 @@ void MutatePlainMergeTreeTask::prepare() write_part_log = [this] (const ExecutionStatus & execution_status) { auto profile_counters_snapshot = std::make_shared(profile_counters.getPartiallyAtomicSnapshot()); - mutate_task.reset(); storage.writePartLog( PartLogElement::MUTATE_PART, execution_status, @@ -112,6 +112,7 @@ bool MutatePlainMergeTreeTask::executeStep() storage.updateMutationEntriesErrors(future_part, true, ""); mutate_task->updateProfileEvents(); + write_part_log({}); state = State::NEED_FINISH; @@ -127,7 +128,7 @@ bool MutatePlainMergeTreeTask::executeStep() mutate_task->updateProfileEvents(); write_part_log(ExecutionStatus::fromCurrentException("", true)); tryLogCurrentException(__PRETTY_FUNCTION__); - return false; + throw; } } case State::NEED_FINISH: @@ -145,6 +146,13 @@ bool MutatePlainMergeTreeTask::executeStep() return false; } +void MutatePlainMergeTreeTask::cancel() noexcept +{ + if (mutate_task) + mutate_task->cancel(); +} + + ContextMutablePtr MutatePlainMergeTreeTask::createTaskContext() const { auto context = Context::createCopy(storage.getContext()); diff --git a/src/Storages/MergeTree/MutatePlainMergeTreeTask.h b/src/Storages/MergeTree/MutatePlainMergeTreeTask.h index a5de3cc9ded..e0bb47bca8c 100644 --- a/src/Storages/MergeTree/MutatePlainMergeTreeTask.h +++ b/src/Storages/MergeTree/MutatePlainMergeTreeTask.h @@ -40,6 +40,8 @@ public: } bool executeStep() override; + void cancel() noexcept override; + void onCompleted() override; StorageID getStorageID() const override; Priority getPriority() const override { return priority; } diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index 4d3910e2e94..0510f51b4ff 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1394,6 +1394,14 @@ public: return false; } + void cancel() noexcept override + { + if (ctx->out) + { + ctx->out->cancel(); + } + } + private: void prepare() @@ -1729,6 +1737,14 @@ public: return false; } + void cancel() noexcept override + { + if (ctx->out) + { + ctx->out->cancel(); + } + } + private: void prepare() @@ -1897,6 +1913,8 @@ private: ctx->new_data_part->checksums.add(std::move(changed_checksums)); static_pointer_cast(ctx->out)->finish(ctx->need_sync); + + ctx->out.reset(); } for (const auto & [rename_from, rename_to] : ctx->files_to_rename) @@ -1976,6 +1994,11 @@ public: return false; } + void cancel() noexcept override + { + executable_task->cancel(); + } + private: enum class State { @@ -2083,6 +2106,12 @@ bool MutateTask::execute() return false; } +void MutateTask::cancel() noexcept +{ + if (task) + task->cancel(); +} + void MutateTask::updateProfileEvents() const { UInt64 total_elapsed_ms = (*ctx->mutate_entry)->watch.elapsedMilliseconds(); diff --git a/src/Storages/MergeTree/MutateTask.h b/src/Storages/MergeTree/MutateTask.h index 0141f53d26d..7b5a2ba9e6e 100644 --- a/src/Storages/MergeTree/MutateTask.h +++ b/src/Storages/MergeTree/MutateTask.h @@ -40,6 +40,8 @@ public: bool need_prefix_); bool execute(); + void cancel() noexcept; + void updateProfileEvents() const; std::future getFuture() diff --git a/src/Storages/MergeTree/checkDataPart.cpp b/src/Storages/MergeTree/checkDataPart.cpp index 34e699bcef7..f807b71d209 100644 --- a/src/Storages/MergeTree/checkDataPart.cpp +++ b/src/Storages/MergeTree/checkDataPart.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ namespace ErrorCodes extern const int SOCKET_TIMEOUT; extern const int BROKEN_PROJECTION; extern const int ABORTED; + extern const int CANNOT_WRITE_TO_OSTREAM; } @@ -91,6 +93,10 @@ bool isRetryableException(std::exception_ptr exception_ptr) || e.code() == ErrorCodes::ABORTED; } + catch (const NetException &) + { + return true; + } catch (const Coordination::Exception & e) { return Coordination::isHardwareError(e.code); @@ -101,7 +107,8 @@ bool isRetryableException(std::exception_ptr exception_ptr) || e.code() == ErrorCodes::NETWORK_ERROR || e.code() == ErrorCodes::SOCKET_TIMEOUT || e.code() == ErrorCodes::CANNOT_SCHEDULE_TASK - || e.code() == ErrorCodes::ABORTED; + || e.code() == ErrorCodes::ABORTED + || e.code() == ErrorCodes::CANNOT_WRITE_TO_OSTREAM; } catch (const std::filesystem::filesystem_error & e) { diff --git a/src/Storages/MergeTree/tests/gtest_executor.cpp b/src/Storages/MergeTree/tests/gtest_executor.cpp index c7057ce87c6..57012b3501e 100644 --- a/src/Storages/MergeTree/tests/gtest_executor.cpp +++ b/src/Storages/MergeTree/tests/gtest_executor.cpp @@ -39,6 +39,8 @@ public: return false; } + void cancel() noexcept override { /* no op */ } + StorageID getStorageID() const override { return {"test", name}; @@ -80,6 +82,8 @@ public: return --step_count; } + void cancel() noexcept override { chassert(false, "Not implemented"); } + StorageID getStorageID() const override { return {"test", name}; diff --git a/src/Storages/MessageQueueSink.cpp b/src/Storages/MessageQueueSink.cpp index 8190a375b97..af326d6b276 100644 --- a/src/Storages/MessageQueueSink.cpp +++ b/src/Storages/MessageQueueSink.cpp @@ -18,6 +18,21 @@ MessageQueueSink::MessageQueueSink( { } +MessageQueueSink::~MessageQueueSink() +{ + if (isCancelled()) + { + if (format) + format->cancel(); + + if (buffer) + buffer->cancel(); + + if (producer) + producer->cancel(); + } +} + void MessageQueueSink::onStart() { LOG_TEST( @@ -38,12 +53,23 @@ void MessageQueueSink::onStart() void MessageQueueSink::onFinish() { - producer->finish(); + if (format) + format->finalize(); + if (buffer) + buffer->finalize(); + if (producer) + producer->finish(); +} + +void MessageQueueSink::onException(std::exception_ptr /* exception */) +{ + onFinish(); } void MessageQueueSink::consume(Chunk & chunk) { const auto & columns = chunk.getColumns(); + if (columns.empty()) return; @@ -63,6 +89,7 @@ void MessageQueueSink::consume(Chunk & chunk) row_format->writeRow(columns, row); } row_format->finalize(); + buffer->finalize(); producer->produce(buffer->str(), i, columns, row - 1); /// Reallocate buffer if it's capacity is large then DBMS_DEFAULT_BUFFER_SIZE, /// because most likely in this case we serialized abnormally large row @@ -75,22 +102,11 @@ void MessageQueueSink::consume(Chunk & chunk) { format->write(getHeader().cloneWithColumns(chunk.detachColumns())); format->finalize(); + buffer->finalize(); producer->produce(buffer->str(), chunk.getNumRows(), columns, chunk.getNumRows() - 1); buffer->restart(); format->resetFormatter(); } } -void MessageQueueSink::onCancel() noexcept -{ - try - { - onFinish(); - } - catch (...) - { - tryLogCurrentException(getLogger("MessageQueueSink"), "Error occurs on cancellation."); - } -} - } diff --git a/src/Storages/MessageQueueSink.h b/src/Storages/MessageQueueSink.h index cb6562185c0..a79b0b6ddd8 100644 --- a/src/Storages/MessageQueueSink.h +++ b/src/Storages/MessageQueueSink.h @@ -32,6 +32,7 @@ public: std::unique_ptr producer_, const String & storage_name_, const ContextPtr & context_); + ~MessageQueueSink() override; String getName() const override { return storage_name + "Sink"; } @@ -39,8 +40,7 @@ public: void onStart() override; void onFinish() override; - void onCancel() noexcept override; - void onException(std::exception_ptr /* exception */) override { onFinish(); } + void onException(std::exception_ptr /* exception */) override; protected: /// Do some specific initialization before consuming data. diff --git a/src/Storages/NATS/NATSProducer.cpp b/src/Storages/NATS/NATSProducer.cpp index fb8abb016f8..e1edc4a8114 100644 --- a/src/Storages/NATS/NATSProducer.cpp +++ b/src/Storages/NATS/NATSProducer.cpp @@ -1,9 +1,8 @@ #include #include -#include -#include #include +#include #include @@ -43,6 +42,17 @@ void NATSProducer::finishImpl() connection.disconnect(); } +void NATSProducer::cancel() noexcept +{ + try + { + finish(); + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } +} void NATSProducer::produce(const String & message, size_t, const Columns &, size_t) { diff --git a/src/Storages/NATS/NATSProducer.h b/src/Storages/NATS/NATSProducer.h index 6923553a551..5f1cca6421c 100644 --- a/src/Storages/NATS/NATSProducer.h +++ b/src/Storages/NATS/NATSProducer.h @@ -23,6 +23,7 @@ public: LoggerPtr log_); void produce(const String & message, size_t rows_in_message, const Columns & columns, size_t last_row) override; + void cancel() noexcept override; private: String getProducingTaskName() const override { return "NatsProducingTask"; } diff --git a/src/Storages/ObjectStorage/HDFS/Configuration.cpp b/src/Storages/ObjectStorage/HDFS/Configuration.cpp index 6bee4154b2f..18f71642dbd 100644 --- a/src/Storages/ObjectStorage/HDFS/Configuration.cpp +++ b/src/Storages/ObjectStorage/HDFS/Configuration.cpp @@ -2,6 +2,7 @@ #if USE_HDFS #include +#include #include #include #include diff --git a/src/Storages/ObjectStorage/StorageObjectStorage.cpp b/src/Storages/ObjectStorage/StorageObjectStorage.cpp index fd2fe0400bb..5e9ce8dce28 100644 --- a/src/Storages/ObjectStorage/StorageObjectStorage.cpp +++ b/src/Storages/ObjectStorage/StorageObjectStorage.cpp @@ -47,6 +47,7 @@ String StorageObjectStorage::getPathSample(StorageInMemoryMetadata metadata, Con auto query_settings = configuration->getQuerySettings(context); /// We don't want to throw an exception if there are no files with specified path. query_settings.throw_on_zero_files_match = false; + query_settings.ignore_non_existent_file = true; bool local_distributed_processing = distributed_processing; if (context->getSettingsRef()[Setting::use_hive_partitioning]) @@ -64,6 +65,9 @@ String StorageObjectStorage::getPathSample(StorageInMemoryMetadata metadata, Con {} // file_progress_callback ); + if (!configuration->isArchive() && !configuration->isPathWithGlobs() && !local_distributed_processing) + return configuration->getPath(); + if (auto file = file_iterator->next(0)) return file->getPath(); return ""; diff --git a/src/Storages/ObjectStorage/StorageObjectStorageSource.cpp b/src/Storages/ObjectStorage/StorageObjectStorageSource.cpp index 1ccf23ade90..74be640d83d 100644 --- a/src/Storages/ObjectStorage/StorageObjectStorageSource.cpp +++ b/src/Storages/ObjectStorage/StorageObjectStorageSource.cpp @@ -41,6 +41,7 @@ namespace Setting extern const SettingsMaxThreads max_threads; extern const SettingsBool use_cache_for_count_from_files; extern const SettingsString filesystem_cache_name; + extern const SettingsUInt64 filesystem_cache_boundary_alignment; } namespace ErrorCodes @@ -489,6 +490,8 @@ std::unique_ptr StorageObjectStorageSource::createReadBu return object_storage->readObject(StoredObject(path, "", object_size), modified_read_settings); }; + modified_read_settings.filesystem_cache_boundary_alignment = settings[Setting::filesystem_cache_boundary_alignment]; + impl = std::make_unique( object_info.getPath(), cache_key, diff --git a/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.cpp b/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.cpp index e702f07208a..eaedfdd4dfd 100644 --- a/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.cpp +++ b/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.cpp @@ -639,7 +639,7 @@ void ObjectStorageQueueSource::commit(bool success, const std::string & exceptio /* overwrite_status */true); } - appendLogElement(file_metadata->getPath(), *file_metadata->getFileStatus(), processed_rows_from_file, /* processed */success); + appendLogElement(file_metadata->getPath(), *file_metadata->getFileStatus(), /* processed */success); } for (const auto & file_metadata : failed_during_read_files) @@ -651,7 +651,7 @@ void ObjectStorageQueueSource::commit(bool success, const std::string & exceptio /* reduce_retry_count */true, /* overwrite_status */false); - appendLogElement(file_metadata->getPath(), *file_metadata->getFileStatus(), processed_rows_from_file, /* processed */false); + appendLogElement(file_metadata->getPath(), *file_metadata->getFileStatus(), /* processed */false); } } @@ -666,7 +666,6 @@ void ObjectStorageQueueSource::applyActionAfterProcessing(const String & path) void ObjectStorageQueueSource::appendLogElement( const std::string & filename, ObjectStorageQueueMetadata::FileStatus & file_status_, - size_t processed_rows, bool processed) { if (!system_queue_log) @@ -681,7 +680,7 @@ void ObjectStorageQueueSource::appendLogElement( .table = storage_id.table_name, .uuid = toString(storage_id.uuid), .file_name = filename, - .rows_processed = processed_rows, + .rows_processed = file_status_.processed_rows, .status = processed ? ObjectStorageQueueLogElement::ObjectStorageQueueStatus::Processed : ObjectStorageQueueLogElement::ObjectStorageQueueStatus::Failed, .processing_start_time = file_status_.processing_start_time, .processing_end_time = file_status_.processing_end_time, diff --git a/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.h b/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.h index 5d8bd5bda7c..8b7d5a7e65b 100644 --- a/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.h +++ b/src/Storages/ObjectStorageQueue/ObjectStorageQueueSource.h @@ -167,7 +167,6 @@ private: void appendLogElement( const std::string & filename, ObjectStorageQueueMetadata::FileStatus & file_status_, - size_t processed_rows, bool processed); }; diff --git a/src/Storages/RabbitMQ/RabbitMQProducer.cpp b/src/Storages/RabbitMQ/RabbitMQProducer.cpp index f0fbc8c5c06..1f8d87dabed 100644 --- a/src/Storages/RabbitMQ/RabbitMQProducer.cpp +++ b/src/Storages/RabbitMQ/RabbitMQProducer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -85,6 +86,18 @@ void RabbitMQProducer::produce(const String & message, size_t, const Columns &, throw Exception(ErrorCodes::LOGICAL_ERROR, "Could not push to payloads queue"); } +void RabbitMQProducer::cancel() noexcept +{ + try + { + finish(); + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } +} + void RabbitMQProducer::setupChannel() { producer_channel = connection.createChannel(); diff --git a/src/Storages/RabbitMQ/RabbitMQProducer.h b/src/Storages/RabbitMQ/RabbitMQProducer.h index e43518aec06..ab344bbdba9 100644 --- a/src/Storages/RabbitMQ/RabbitMQProducer.h +++ b/src/Storages/RabbitMQ/RabbitMQProducer.h @@ -27,6 +27,7 @@ public: LoggerPtr log_); void produce(const String & message, size_t rows_in_message, const Columns & columns, size_t last_row) override; + void cancel() noexcept override; private: String getProducingTaskName() const override { return "RabbitMQProducingTask"; } diff --git a/src/Storages/StorageDictionary.cpp b/src/Storages/StorageDictionary.cpp index e9f732466ff..80cb1cc285d 100644 --- a/src/Storages/StorageDictionary.cpp +++ b/src/Storages/StorageDictionary.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -179,7 +180,18 @@ Pipe StorageDictionary::read( { auto registered_dictionary_name = location == Location::SameDatabaseAndNameAsDictionary ? getStorageID().getInternalDictionaryName() : dictionary_name; auto dictionary = getContext()->getExternalDictionariesLoader().getDictionary(registered_dictionary_name, local_context); - local_context->checkAccess(AccessType::dictGet, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName()); + + /** + * For backward compatibility reasons we require either SELECT or dictGet permission to read directly from the dictionary. + * If none of these conditions are met - we ask to grant a dictGet. + */ + bool has_dict_get = local_context->getAccess()->isGranted( + AccessType::dictGet, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName()); + bool has_select = local_context->getAccess()->isGranted( + AccessType::SELECT, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName()); + if (!has_dict_get && !has_select) + local_context->checkAccess(AccessType::dictGet, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName()); + return dictionary->read(column_names, max_block_size, threads); } diff --git a/src/Storages/StorageFile.cpp b/src/Storages/StorageFile.cpp index eefd60128a6..a629812e114 100644 --- a/src/Storages/StorageFile.cpp +++ b/src/Storages/StorageFile.cpp @@ -1848,17 +1848,16 @@ private: try { - writer->finalize(); writer->flush(); + writer->finalize(); + write_buf->finalize(); } catch (...) { /// Stop ParallelFormattingOutputFormat correctly. - releaseBuffers(); + cancelBuffers(); throw; } - - write_buf->finalize(); } void releaseBuffers() diff --git a/src/Storages/StorageJoin.cpp b/src/Storages/StorageJoin.cpp index f1f183ed18b..0bab4861fa1 100644 --- a/src/Storages/StorageJoin.cpp +++ b/src/Storages/StorageJoin.cpp @@ -217,8 +217,7 @@ void StorageJoin::mutate(const MutationCommands & commands, ContextPtr context) if (persistent) { backup_stream.flush(); - compressed_backup_buf.next(); - backup_buf->next(); + compressed_backup_buf.finalize(); backup_buf->finalize(); std::vector files; diff --git a/src/Storages/StorageLog.cpp b/src/Storages/StorageLog.cpp index 08b4fd74899..36b6d5f6231 100644 --- a/src/Storages/StorageLog.cpp +++ b/src/Storages/StorageLog.cpp @@ -134,7 +134,7 @@ private: if (limited_by_file_size) { - limited.emplace(*plain, file_size - offset, /* trow_exception */ false, /* exact_limit */ std::optional()); + limited.emplace(*plain, LimitReadBuffer::Settings{.read_no_more = file_size - offset}); compressed.emplace(*limited); } else diff --git a/src/Storages/StorageReplicatedMergeTree.cpp b/src/Storages/StorageReplicatedMergeTree.cpp index 1a23d362dee..264644ffd28 100644 --- a/src/Storages/StorageReplicatedMergeTree.cpp +++ b/src/Storages/StorageReplicatedMergeTree.cpp @@ -216,6 +216,8 @@ namespace FailPoints extern const char replicated_queue_fail_next_entry[]; extern const char replicated_queue_unfail_entries[]; extern const char finish_set_quorum_failed_parts[]; + extern const char zero_copy_lock_zk_fail_before_op[]; + extern const char zero_copy_lock_zk_fail_after_op[]; } namespace ErrorCodes @@ -10480,6 +10482,10 @@ void StorageReplicatedMergeTree::createZeroCopyLockNode( Coordination::Requests ops; Coordination::Responses responses; getZeroCopyLockNodeCreateOps(zookeeper, zookeeper_node, ops, mode, replace_existing_lock, path_to_set_hardlinked_files, hardlinked_files); + + fiu_do_on(FailPoints::zero_copy_lock_zk_fail_before_op, { zookeeper->forceFailureBeforeOperation(); }); + fiu_do_on(FailPoints::zero_copy_lock_zk_fail_after_op, { zookeeper->forceFailureAfterOperation(); }); + auto error = zookeeper->tryMulti(ops, responses); if (error == Coordination::Error::ZOK) { diff --git a/src/Storages/StorageSet.cpp b/src/Storages/StorageSet.cpp index 61233782aef..36815231fa7 100644 --- a/src/Storages/StorageSet.cpp +++ b/src/Storages/StorageSet.cpp @@ -43,12 +43,15 @@ public: ContextPtr ctx, StorageSetOrJoinBase & table_, const StorageMetadataPtr & metadata_snapshot_, const String & backup_path_, const String & backup_tmp_path_, const String & backup_file_name_, bool persistent_); + ~SetOrJoinSink() override; String getName() const override { return "SetOrJoinSink"; } void consume(Chunk & chunk) override; void onFinish() override; private: + void cancelBuffers() noexcept; + StorageSetOrJoinBase & table; StorageMetadataPtr metadata_snapshot; String backup_path; @@ -83,6 +86,20 @@ SetOrJoinSink::SetOrJoinSink( { } +SetOrJoinSink::~SetOrJoinSink() +{ + if (isCancelled()) + cancelBuffers(); +} + +void SetOrJoinSink::cancelBuffers() noexcept +{ + compressed_backup_buf.cancel(); + if (backup_buf) + backup_buf->cancel(); +} + + void SetOrJoinSink::consume(Chunk & chunk) { Block block = getHeader().cloneWithColumns(chunk.getColumns()); @@ -103,6 +120,10 @@ void SetOrJoinSink::onFinish() table.disk->replaceFile(fs::path(backup_tmp_path) / backup_file_name, fs::path(backup_path) / backup_file_name); } + else + { + cancelBuffers(); + } } diff --git a/src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp b/src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp index e046a73b1f9..d9340e88774 100644 --- a/src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp +++ b/src/Storages/fuzzers/mergetree_checksum_fuzzer.cpp @@ -15,6 +15,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t size) if (!res.read(in)) return 0; res.write(out); + + out.finalize(); } catch (...) { diff --git a/tests/ci/ci_config.py b/tests/ci/ci_config.py index 67cdbbdcf6d..4bd240e241c 100644 --- a/tests/ci/ci_config.py +++ b/tests/ci/ci_config.py @@ -46,7 +46,13 @@ class CI: JobNames.JEPSEN_KEEPER, JobNames.JEPSEN_SERVER, ] - ) + ), + WorkFlowNames.NIGHTLY: LabelConfig( + run_jobs=[ + BuildNames.FUZZERS, + JobNames.LIBFUZZER_TEST, + ] + ), } # type: Dict[str, LabelConfig] TAG_CONFIGS = { diff --git a/tests/ci/ci_definitions.py b/tests/ci/ci_definitions.py index fb3e55fdbe3..d55e347c3ee 100644 --- a/tests/ci/ci_definitions.py +++ b/tests/ci/ci_definitions.py @@ -92,6 +92,7 @@ class WorkFlowNames(metaclass=WithIter): JEPSEN = "JepsenWorkflow" CreateRelease = "CreateRelease" + NIGHTLY = "NightlyBuilds" class BuildNames(metaclass=WithIter): @@ -570,6 +571,7 @@ class CommonJobConfigs: "tests/ci/docker_server.py", "tests/ci/docker_images_helper.py", "./docker/server", + "./docker/keeper", ] ), runner_type=Runners.STYLE_CHECKER, diff --git a/tests/clickhouse-test b/tests/clickhouse-test index df323daac16..907d24f6493 100755 --- a/tests/clickhouse-test +++ b/tests/clickhouse-test @@ -981,6 +981,7 @@ class MergeTreeSettingsRandomizer: "cache_populated_by_fetch": lambda: random.randint(0, 1), "concurrent_part_removal_threshold": threshold_generator(0.2, 0.3, 0, 100), "old_parts_lifetime": threshold_generator(0.2, 0.3, 10, 8 * 60), + "prewarm_mark_cache": lambda: random.randint(0, 1), "use_const_adaptive_granularity": lambda: random.randint(0, 1), "enable_index_granularity_compression": lambda: random.randint(0, 1), } diff --git a/tests/integration/test_checking_s3_blobs_paranoid/test.py b/tests/integration/test_checking_s3_blobs_paranoid/test.py index 92456f6c6d5..2cc70eba2ab 100644 --- a/tests/integration/test_checking_s3_blobs_paranoid/test.py +++ b/tests/integration/test_checking_s3_blobs_paranoid/test.py @@ -210,7 +210,10 @@ def test_upload_s3_fail_upload_part_when_multi_part_upload( ) assert create_multipart == 1 assert upload_parts >= 2 - assert s3_errors == 1 + # the first error is the injected error + # the second is `void DB::WriteBufferFromS3::tryToAbortMultipartUpload(): Code: 499. DB::Exception: The specified multipart upload does not exist.` + # due to `broken_s3.setup_fake_multpartuploads()` + assert s3_errors == 2 @pytest.mark.parametrize( diff --git a/tests/integration/test_consistent_parts_after_clone_replica/test.py b/tests/integration/test_consistent_parts_after_clone_replica/test.py index 2771a874d68..e18521dc5b5 100644 --- a/tests/integration/test_consistent_parts_after_clone_replica/test.py +++ b/tests/integration/test_consistent_parts_after_clone_replica/test.py @@ -12,7 +12,7 @@ def fill_nodes(nodes, shard): CREATE DATABASE test; CREATE TABLE test_table(date Date, id UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/test{shard}/replicated', '{replica}') - ORDER BY id PARTITION BY toYYYYMM(date) + ORDER BY id PARTITION BY toYYYYMM(date) SETTINGS min_replicated_logs_to_keep=3, max_replicated_logs_to_keep=5, cleanup_delay_period=0, cleanup_delay_period_random_add=0, cleanup_thread_preferred_points_per_iteration=0; """.format( @@ -82,7 +82,9 @@ def test_inconsistent_parts_if_drop_while_replica_not_active(start_cluster): retry_count=40, ) - node2.wait_for_log_line("Will mark replica node1 as lost") + node2.wait_for_log_line( + "Will mark replica node1 as lost", look_behind_lines=100000 + ) # the first replica will be cloned from the second pm.heal_all() diff --git a/tests/integration/test_disk_over_web_server/test.py b/tests/integration/test_disk_over_web_server/test.py index 1aa1ff08e0d..427bc98a28f 100644 --- a/tests/integration/test_disk_over_web_server/test.py +++ b/tests/integration/test_disk_over_web_server/test.py @@ -112,11 +112,12 @@ def test_usage(cluster, node_name): for i in range(3): node2.query( """ + DROP TABLE IF EXISTS test{}; CREATE TABLE test{} UUID '{}' (id Int32) ENGINE = MergeTree() ORDER BY id SETTINGS storage_policy = 'web'; """.format( - i, uuids[i] + i, i, uuids[i] ) ) diff --git a/tests/integration/test_ldap_external_user_directory/configs/remote_servers.xml b/tests/integration/test_ldap_external_user_directory/configs/remote_servers.xml new file mode 100644 index 00000000000..cf1bdf9dcb1 --- /dev/null +++ b/tests/integration/test_ldap_external_user_directory/configs/remote_servers.xml @@ -0,0 +1,18 @@ + + + + + + instance1 + 9000 + + + + + instance2 + 9000 + + + + + \ No newline at end of file diff --git a/tests/integration/test_ldap_external_user_directory/test.py b/tests/integration/test_ldap_external_user_directory/test.py index 6c25c0ac789..ce16d7ad286 100644 --- a/tests/integration/test_ldap_external_user_directory/test.py +++ b/tests/integration/test_ldap_external_user_directory/test.py @@ -9,8 +9,22 @@ LDAP_ADMIN_BIND_DN = "cn=admin,dc=example,dc=org" LDAP_ADMIN_PASSWORD = "clickhouse" cluster = ClickHouseCluster(__file__) -instance = cluster.add_instance( - "instance", main_configs=["configs/ldap_with_role_mapping.xml"], with_ldap=True + +instance1 = cluster.add_instance( + "instance1", + main_configs=["configs/ldap_with_role_mapping.xml", "configs/remote_servers.xml"], + macros={"shard": 1, "replica": "instance1"}, + stay_alive=True, + with_ldap=True, + with_zookeeper=True, +) + +instance2 = cluster.add_instance( + "instance2", + main_configs=["configs/remote_servers.xml"], + macros={"shard": 1, "replica": "instance2"}, + stay_alive=True, + with_zookeeper=True, ) @@ -74,59 +88,98 @@ def delete_ldap_group(ldap_cluster, group_cn): def test_authentication_pass(): - assert instance.query( + assert instance1.query( "SELECT currentUser()", user="janedoe", password="qwerty" ) == TSV([["janedoe"]]) def test_authentication_fail(): # User doesn't exist. - assert "doesnotexist: Authentication failed" in instance.query_and_get_error( + assert "doesnotexist: Authentication failed" in instance1.query_and_get_error( "SELECT currentUser()", user="doesnotexist" ) # Wrong password. - assert "janedoe: Authentication failed" in instance.query_and_get_error( + assert "janedoe: Authentication failed" in instance1.query_and_get_error( "SELECT currentUser()", user="janedoe", password="123" ) def test_role_mapping(ldap_cluster): - instance.query("DROP ROLE IF EXISTS role_1") - instance.query("DROP ROLE IF EXISTS role_2") - instance.query("DROP ROLE IF EXISTS role_3") - instance.query("CREATE ROLE role_1") - instance.query("CREATE ROLE role_2") + instance1.query("DROP ROLE IF EXISTS role_1") + instance1.query("DROP ROLE IF EXISTS role_2") + instance1.query("DROP ROLE IF EXISTS role_3") + instance1.query("CREATE ROLE role_1") + instance1.query("CREATE ROLE role_2") add_ldap_group(ldap_cluster, group_cn="clickhouse-role_1", member_cn="johndoe") add_ldap_group(ldap_cluster, group_cn="clickhouse-role_2", member_cn="johndoe") - assert instance.query( + assert instance1.query( "select currentUser()", user="johndoe", password="qwertz" ) == TSV([["johndoe"]]) - assert instance.query( + assert instance1.query( "select role_name from system.current_roles ORDER BY role_name", user="johndoe", password="qwertz", ) == TSV([["role_1"], ["role_2"]]) - instance.query("CREATE ROLE role_3") + instance1.query("CREATE ROLE role_3") add_ldap_group(ldap_cluster, group_cn="clickhouse-role_3", member_cn="johndoe") # Check that non-existing role in ClickHouse is ignored during role update # See https://github.com/ClickHouse/ClickHouse/issues/54318 add_ldap_group(ldap_cluster, group_cn="clickhouse-role_4", member_cn="johndoe") - assert instance.query( + assert instance1.query( "select role_name from system.current_roles ORDER BY role_name", user="johndoe", password="qwertz", ) == TSV([["role_1"], ["role_2"], ["role_3"]]) - instance.query("DROP ROLE role_1") - instance.query("DROP ROLE role_2") - instance.query("DROP ROLE role_3") + instance1.query("DROP ROLE role_1") + instance1.query("DROP ROLE role_2") + instance1.query("DROP ROLE role_3") delete_ldap_group(ldap_cluster, group_cn="clickhouse-role_1") delete_ldap_group(ldap_cluster, group_cn="clickhouse-role_2") delete_ldap_group(ldap_cluster, group_cn="clickhouse-role_3") delete_ldap_group(ldap_cluster, group_cn="clickhouse-role_4") + + +def test_push_role_to_other_nodes(ldap_cluster): + instance1.query("DROP TABLE IF EXISTS distributed_table SYNC") + instance1.query("DROP TABLE IF EXISTS local_table SYNC") + instance2.query("DROP TABLE IF EXISTS local_table SYNC") + instance1.query("DROP ROLE IF EXISTS role_read") + + instance1.query("CREATE ROLE role_read") + instance1.query("GRANT SELECT ON *.* TO role_read") + + add_ldap_group(ldap_cluster, group_cn="clickhouse-role_read", member_cn="johndoe") + + assert instance1.query( + "select currentUser()", user="johndoe", password="qwertz" + ) == TSV([["johndoe"]]) + + instance1.query( + "CREATE TABLE IF NOT EXISTS local_table (id UInt32) ENGINE = MergeTree() ORDER BY id" + ) + instance2.query( + "CREATE TABLE IF NOT EXISTS local_table (id UInt32) ENGINE = MergeTree() ORDER BY id" + ) + instance2.query("INSERT INTO local_table VALUES (1), (2), (3)") + instance1.query( + "CREATE TABLE IF NOT EXISTS distributed_table AS local_table ENGINE = Distributed(test_ldap_cluster, default, local_table)" + ) + + result = instance1.query( + "SELECT sum(id) FROM distributed_table", user="johndoe", password="qwertz" + ) + assert result.strip() == "6" + + instance1.query("DROP TABLE IF EXISTS distributed_table SYNC") + instance1.query("DROP TABLE IF EXISTS local_table SYNC") + instance2.query("DROP TABLE IF EXISTS local_table SYNC") + instance2.query("DROP ROLE IF EXISTS role_read") + + delete_ldap_group(ldap_cluster, group_cn="clickhouse-role_read") diff --git a/tests/integration/test_merge_tree_s3/test.py b/tests/integration/test_merge_tree_s3/test.py index baca7b2c186..f0b49b5600a 100644 --- a/tests/integration/test_merge_tree_s3/test.py +++ b/tests/integration/test_merge_tree_s3/test.py @@ -735,6 +735,15 @@ def test_s3_disk_apply_new_settings(cluster, node_name): check_no_objects_after_drop(cluster) + # Restore + replace_config( + config_path, + "0", + "33554432", + ) + + node.query("SYSTEM RELOAD CONFIG") + @pytest.mark.parametrize("node_name", ["node"]) def test_s3_no_delete_objects(cluster, node_name): @@ -954,10 +963,10 @@ def test_s3_engine_heavy_write_check_mem( ) broken_s3.setup_fake_multpartuploads() - slow_responces = 10 + slow_responses = 10 slow_timeout = 15 broken_s3.setup_slow_answers( - 10 * 1024 * 1024, timeout=slow_timeout, count=slow_responces + 10 * 1024 * 1024, timeout=slow_timeout, count=slow_responses ) query_id = f"INSERT_INTO_S3_ENGINE_QUERY_ID_{in_flight}" @@ -983,7 +992,7 @@ def test_s3_engine_heavy_write_check_mem( assert int(memory_usage) > 0.8 * memory # The more in_flight value is the less time CH waits. - assert int(wait_inflight) / 1000 / 1000 > slow_responces * slow_timeout / in_flight + assert int(wait_inflight) / 1000 / 1000 > slow_responses * slow_timeout / in_flight check_no_objects_after_drop(cluster, node_name=node_name) @@ -1004,12 +1013,15 @@ def test_s3_disk_heavy_write_check_mem(cluster, broken_s3, node_name): " SETTINGS" " storage_policy='broken_s3'", ) + + uuid = node.query("SELECT uuid FROM system.tables WHERE name='s3_test'") + node.query("SYSTEM STOP MERGES s3_test") broken_s3.setup_fake_multpartuploads() broken_s3.setup_slow_answers(10 * 1024 * 1024, timeout=10, count=50) - query_id = f"INSERT_INTO_S3_DISK_QUERY_ID" + query_id = f"INSERT_INTO_S3_DISK_QUERY_ID_{uuid}" node.query( "INSERT INTO s3_test SELECT number, toString(number) FROM numbers(50000000)" f" SETTINGS max_memory_usage={2*memory}" diff --git a/tests/integration/test_s3_zero_copy_replication/configs/config.d/s3.xml b/tests/integration/test_s3_zero_copy_replication/configs/config.d/s3.xml index 8df9e8e8c26..3a2bec7f314 100644 --- a/tests/integration/test_s3_zero_copy_replication/configs/config.d/s3.xml +++ b/tests/integration/test_s3_zero_copy_replication/configs/config.d/s3.xml @@ -7,21 +7,21 @@ http://minio1:9001/root/data/ minio minio123 - true + false s3 http://minio1:9001/root/data/ minio minio123 - true + false s3 http://minio1:9001/root/data2/ minio minio123 - true + false diff --git a/tests/integration/test_s3_zero_copy_replication/test.py b/tests/integration/test_s3_zero_copy_replication/test.py index e723a4ffc57..c7d03d4301d 100644 --- a/tests/integration/test_s3_zero_copy_replication/test.py +++ b/tests/integration/test_s3_zero_copy_replication/test.py @@ -1,10 +1,12 @@ import datetime import logging +import threading import time import pytest from helpers.cluster import ClickHouseCluster +from helpers.network import PartitionManager logging.getLogger().setLevel(logging.INFO) logging.getLogger().addHandler(logging.StreamHandler()) @@ -77,15 +79,19 @@ def wait_for_large_objects_count(cluster, expected, size=100, timeout=30): assert get_large_objects_count(cluster, size=size) == expected -def wait_for_active_parts(node, num_expected_parts, table_name, timeout=30): +def wait_for_active_parts( + node, num_expected_parts, table_name, timeout=30, disk_name=None +): deadline = time.monotonic() + timeout num_parts = 0 while time.monotonic() < deadline: - num_parts_str = node.query( - "select count() from system.parts where table = '{}' and active".format( - table_name - ) + query = ( + f"select count() from system.parts where table = '{table_name}' and active" ) + if disk_name: + query += f" and disk_name='{disk_name}'" + + num_parts_str = node.query(query) num_parts = int(num_parts_str.strip()) if num_parts == num_expected_parts: return @@ -95,6 +101,22 @@ def wait_for_active_parts(node, num_expected_parts, table_name, timeout=30): assert num_parts == num_expected_parts +@pytest.fixture(scope="function") +def test_name(request): + return request.node.name + + +@pytest.fixture(scope="function") +def test_table(test_name): + normalized = ( + test_name.replace("[", "_") + .replace("]", "_") + .replace(" ", "_") + .replace("-", "_") + ) + return "table_" + normalized + + # Result of `get_large_objects_count` can be changed in other tests, so run this case at the beginning @pytest.mark.order(0) @pytest.mark.parametrize("policy", ["s3"]) @@ -668,3 +690,111 @@ def test_s3_zero_copy_keeps_data_after_mutation(started_cluster): time.sleep(10) check_objects_not_exisis(cluster, objectsY) + + +@pytest.mark.parametrize( + "failpoint", ["zero_copy_lock_zk_fail_before_op", "zero_copy_lock_zk_fail_after_op"] +) +def test_move_shared_lock_fail_once(started_cluster, test_table, failpoint): + node1 = cluster.instances["node1"] + node2 = cluster.instances["node2"] + + node1.query( + f""" + CREATE TABLE {test_table} ON CLUSTER test_cluster (num UInt64, date DateTime) + ENGINE=ReplicatedMergeTree('/clickhouse/tables/{test_table}', '{{replica}}') + ORDER BY date PARTITION BY date + SETTINGS storage_policy='hybrid' + """ + ) + + date = "2024-10-23" + + node2.query(f"SYSTEM STOP FETCHES {test_table}") + node1.query(f"INSERT INTO {test_table} VALUES (1, '{date}')") + + # Try to move and get fail on acquring zero-copy shared lock + node1.query(f"SYSTEM ENABLE FAILPOINT {failpoint}") + node1.query_and_get_error( + f"ALTER TABLE {test_table} MOVE PARTITION '{date}' TO VOLUME 'external'" + ) + + # After fail the part must remain on the source disk + assert ( + node1.query( + f"SELECT disk_name FROM system.parts WHERE table='{test_table}' GROUP BY disk_name" + ) + == "default\n" + ) + + # Try another attempt after zk connection is restored + # It should not failed due to leftovers of previous attempt (temporary cloned files) + node1.query(f"SYSTEM DISABLE FAILPOINT {failpoint}") + node1.query( + f"ALTER TABLE {test_table} MOVE PARTITION '{date}' TO VOLUME 'external'" + ) + + assert ( + node1.query( + f"SELECT disk_name FROM system.parts WHERE table='{test_table}' GROUP BY disk_name" + ) + == "s31\n" + ) + + # Sanity check + node2.query(f"SYSTEM START FETCHES {test_table}") + wait_for_active_parts(node2, 1, test_table, disk_name="s31") + assert node2.query(f"SELECT sum(num) FROM {test_table}") == "1\n" + + node1.query(f"DROP TABLE IF EXISTS {test_table} SYNC") + node2.query(f"DROP TABLE IF EXISTS {test_table} SYNC") + + +def test_move_shared_lock_fail_keeper_unavailable(started_cluster, test_table): + node1 = cluster.instances["node1"] + node2 = cluster.instances["node2"] + + node1.query( + f""" + CREATE TABLE {test_table} ON CLUSTER test_cluster (num UInt64, date DateTime) + ENGINE=ReplicatedMergeTree('/clickhouse/tables/{test_table}', '{{replica}}') + ORDER BY date PARTITION BY date + SETTINGS storage_policy='hybrid' + """ + ) + + date = "2024-10-23" + node2.query(f"SYSTEM STOP FETCHES {test_table}") + + node1.query(f"INSERT INTO {test_table} VALUES (1, '{date}')") + # Pause moving after part cloning, but before swapping + node1.query("SYSTEM ENABLE FAILPOINT stop_moving_part_before_swap_with_active") + + def move(node): + node.query_and_get_error( + f"ALTER TABLE {test_table} MOVE PARTITION '{date}' TO VOLUME 'external'" + ) + + # Start moving + t1 = threading.Thread(target=move, args=[node1]) + t1.start() + + with PartitionManager() as pm: + pm.drop_instance_zk_connections(node1) + # Continue moving and try to swap + node1.query("SYSTEM DISABLE FAILPOINT stop_moving_part_before_swap_with_active") + t1.join() + + # Previous MOVE was failed, try another one after zk connection is restored + # It should not failed due to leftovers of previous attempt (temporary cloned files) + node1.query_with_retry( + f"ALTER TABLE {test_table} MOVE PARTITION '{date}' TO VOLUME 'external'" + ) + + # Sanity check + node2.query(f"SYSTEM START FETCHES {test_table}") + wait_for_active_parts(node2, 1, test_table, disk_name="s31") + assert node2.query(f"SELECT sum(num) FROM {test_table}") == "1\n" + + node1.query(f"DROP TABLE IF EXISTS {test_table} SYNC") + node2.query(f"DROP TABLE IF EXISTS {test_table} SYNC") diff --git a/tests/integration/test_storage_s3_queue/configs/s3queue_log.xml b/tests/integration/test_storage_s3_queue/configs/s3queue_log.xml index 93a04269fa7..6236603f18f 100644 --- a/tests/integration/test_storage_s3_queue/configs/s3queue_log.xml +++ b/tests/integration/test_storage_s3_queue/configs/s3queue_log.xml @@ -1,4 +1,8 @@ + + system +
    azure_queue_log
    + system s3queue_log
    diff --git a/tests/integration/test_storage_s3_queue/test.py b/tests/integration/test_storage_s3_queue/test.py index aecc1df491b..4f5cc8232e7 100644 --- a/tests/integration/test_storage_s3_queue/test.py +++ b/tests/integration/test_storage_s3_queue/test.py @@ -319,7 +319,9 @@ def generate_random_string(length=6): @pytest.mark.parametrize("engine_name", ["S3Queue", "AzureQueue"]) def test_delete_after_processing(started_cluster, mode, engine_name): node = started_cluster.instances["instance"] - table_name = f"delete_after_processing_{mode}_{engine_name}" + table_name = ( + f"delete_after_processing_{mode}_{engine_name}_{generate_random_string()}" + ) dst_table_name = f"{table_name}_dst" files_path = f"{table_name}_data" files_num = 5 @@ -362,6 +364,21 @@ def test_delete_after_processing(started_cluster, mode, engine_name): ).splitlines() ] == sorted(total_values, key=lambda x: (x[0], x[1], x[2])) + node.query("system flush logs") + + if engine_name == "S3Queue": + system_table_name = "s3queue_log" + else: + system_table_name = "azure_queue_log" + assert ( + int( + node.query( + f"SELECT sum(rows_processed) FROM system.{system_table_name} WHERE table = '{table_name}'" + ) + ) + == files_num * row_num + ) + if engine_name == "S3Queue": minio = started_cluster.minio_client objects = list(minio.list_objects(started_cluster.minio_bucket, recursive=True)) diff --git a/tests/integration/test_unambiguous_alter_commands/test.py b/tests/integration/test_unambiguous_alter_commands/test.py index 5bf9e32c589..a0449047de9 100644 --- a/tests/integration/test_unambiguous_alter_commands/test.py +++ b/tests/integration/test_unambiguous_alter_commands/test.py @@ -43,3 +43,10 @@ ALTER TABLE a\\n (DROP COLUMN b),\\n (DROP COLUMN c) """ result = node.query(INPUT) assert result == EXPECTED_OUTPUT + + +def test_move_partition_to_table_command(): + INPUT = "SELECT formatQuery('ALTER TABLE a MOVE PARTITION tuple() TO TABLE b')" + EXPECTED_OUTPUT = "ALTER TABLE a\\n (MOVE PARTITION tuple() TO TABLE b)\n" + result = node.query(INPUT) + assert result == EXPECTED_OUTPUT diff --git a/tests/queries/0_stateless/00385_storage_file_and_clickhouse-local_app_long.sh b/tests/queries/0_stateless/00385_storage_file_and_clickhouse-local_app_long.sh index b6cc270994f..e6d1ee8b0dc 100755 --- a/tests/queries/0_stateless/00385_storage_file_and_clickhouse-local_app_long.sh +++ b/tests/queries/0_stateless/00385_storage_file_and_clickhouse-local_app_long.sh @@ -63,4 +63,4 @@ ${CLICKHOUSE_LOCAL} -q "CREATE TABLE sophisticated_default SELECT count() FROM system.tables WHERE name='sophisticated_default' AND database = currentDatabase();" # Help is not skipped -[[ $(${CLICKHOUSE_LOCAL} --help | wc -l) -gt 100 ]] +[[ $(${CLICKHOUSE_LOCAL} --help | wc -l) -gt 50 ]] diff --git a/tests/queries/0_stateless/00429_long_http_bufferization.sh b/tests/queries/0_stateless/00429_long_http_bufferization.sh index 0b06ea660db..4ff8031bad5 100755 --- a/tests/queries/0_stateless/00429_long_http_bufferization.sh +++ b/tests/queries/0_stateless/00429_long_http_bufferization.sh @@ -9,7 +9,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) format="RowBinary" -function query { +function query() { # bash isn't able to store \0 bytes, so use [1; 255] random range echo "SELECT greatest(toUInt8(1), toUInt8(intHash64(number))) FROM system.numbers LIMIT $1 FORMAT $format" } @@ -20,16 +20,49 @@ function ch_url() { -d "$(query "$2")" } +function ch_url_safe() { + read -r retval stdout_tmp stderr_tmp <<< "$(run_with_error ch_url """$@""")" + + local out="" + out=$(cat "${stdout_tmp}") + rm -rf "${stdout_tmp}" + local err="" + err=$(cat "${stderr_tmp}") + rm -rf "${stderr_tmp}" + + # echo "ch_url_safe out <${out}>" 1>&2 + # echo "ch_url_safe err <${err}>" 1>&2 + + case "${retval}" in + "0") + echo -n "$out" + ;; + "18") + if [[ "${err}" = 'curl: (18) transfer closed with outstanding read data remaining' ]] + then + echo -n "$out" + else + echo -n "$err" + return 2 + fi + ;; + *) + echo -n "$err"; + return 1 + ;; + esac +} # Check correct exceptions handling exception_pattern="DB::Exception:[[:print:]]*" +exception_mark="__exception__" function check_only_exception() { local res - res=$(ch_url "$1" "$2") + res=$(ch_url_safe "$@") # echo "$res" - # echo "$res" | wc -l + # echo -n "wc -l:"; echo "$res" | wc -l # echo "$res" | grep -c "$exception_pattern" [[ $(echo "$res" | wc -l) -eq 1 ]] || echo FAIL 1 "$@" [[ $(echo "$res" | grep -c "$exception_pattern") -eq 1 ]] || echo FAIL 2 "$@" @@ -37,12 +70,17 @@ function check_only_exception() { function check_last_line_exception() { local res - res=$(ch_url "$1" "$2") - # echo "$res" > res - # echo "$res" | wc -c - # echo "$res" | tail -n -2 - [[ $(echo "$res" | tail -n -1 | grep -c "$exception_pattern") -eq 1 ]] || echo FAIL 3 "$@" - [[ $(echo "$res" | head -n -1 | grep -c "$exception_pattern") -eq 0 ]] || echo FAIL 4 "$@" + res=$(ch_url_safe "$@") + # echo "$res" + # echo -n "wc -c:"; echo "$res" | wc -c + # echo -n "tail -n 3:"; echo "$res" | tail -n 3 + if [[ $(echo "$res" | wc -l) -gt 1 ]] + then + [[ $(echo "$res" | head -n 1 | grep -c "$exception_mark") -eq 0 ]] || echo FAIL 3 "$@" "<${res}>" + [[ $(echo "$res" | tail -n 2 | head -n 1 | grep -c "$exception_mark") -eq 1 ]] || echo -n FAIL 4 "$@" "<${res}>" + fi + + [[ $(echo "$res" | tail -n 1 | grep -c "$exception_pattern") -eq 1 ]] || echo FAIL 5 "$@" "<${res}>" } function check_exception_handling() { @@ -51,6 +89,7 @@ function check_exception_handling() { "max_block_size=30000&max_result_rows=400000&buffer_size=1048577&wait_end_of_query=0" 111222333444 check_only_exception "max_result_bytes=1000" 1001 + check_only_exception "max_result_bytes=1000&wait_end_of_query=1" 1001 check_last_line_exception "max_result_bytes=1048576&buffer_size=1048576&wait_end_of_query=0" 1048577 diff --git a/tests/queries/0_stateless/01187_set_profile_as_setting.sh b/tests/queries/0_stateless/01187_set_profile_as_setting.sh index f6c6fd0be34..441ec0ab520 100755 --- a/tests/queries/0_stateless/01187_set_profile_as_setting.sh +++ b/tests/queries/0_stateless/01187_set_profile_as_setting.sh @@ -15,5 +15,5 @@ $CLICKHOUSE_CLIENT -m -q "set profile='readonly'; select value, changed from sys ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&query=select+value,changed+from+system.settings+where+name='readonly'" ${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&profile=default&query=select+value,changed+from+system.settings+where+name='readonly'" -${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&profile=readonly&query=select+value,changed+from+system.settings+where+name='readonly'" 2>&1| grep -Fa "Cannot modify 'readonly' setting in readonly mode" > /dev/null && echo "OK" +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&profile=readonly&query=select+value,changed+from+system.settings+where+name='readonly'" 2>&1 | grep -Fa "Cannot modify 'readonly' setting in readonly mode" > /dev/null && echo "OK" echo "select value, changed from system.settings where name='readonly';" | ${CLICKHOUSE_CURL} -sSg "${CLICKHOUSE_URL}&profile=readonly" -d @- diff --git a/tests/queries/0_stateless/01343_min_bytes_to_use_mmap_io.sql b/tests/queries/0_stateless/01343_min_bytes_to_use_mmap_io.sql index 15c9ec16700..bc5b78eef0f 100644 --- a/tests/queries/0_stateless/01343_min_bytes_to_use_mmap_io.sql +++ b/tests/queries/0_stateless/01343_min_bytes_to_use_mmap_io.sql @@ -1,6 +1,6 @@ -- Tags: no-object-storage DROP TABLE IF EXISTS test_01343; -CREATE TABLE test_01343 (x String) ENGINE = MergeTree ORDER BY tuple() SETTINGS min_bytes_for_wide_part = 0; +CREATE TABLE test_01343 (x String) ENGINE = MergeTree ORDER BY tuple() SETTINGS min_bytes_for_wide_part = 0, prewarm_mark_cache = 0; INSERT INTO test_01343 VALUES ('Hello, world'); SET local_filesystem_read_method = 'mmap', min_bytes_to_use_mmap_io = 1; diff --git a/tests/queries/0_stateless/01344_min_bytes_to_use_mmap_io_index.sql b/tests/queries/0_stateless/01344_min_bytes_to_use_mmap_io_index.sql index 76cb535dcb7..6db6c65cc0f 100644 --- a/tests/queries/0_stateless/01344_min_bytes_to_use_mmap_io_index.sql +++ b/tests/queries/0_stateless/01344_min_bytes_to_use_mmap_io_index.sql @@ -1,6 +1,6 @@ -- Tags: no-object-storage DROP TABLE IF EXISTS test_01344; -CREATE TABLE test_01344 (x String, INDEX idx (x) TYPE set(10) GRANULARITY 1) ENGINE = MergeTree ORDER BY tuple() SETTINGS min_bytes_for_wide_part = 0; +CREATE TABLE test_01344 (x String, INDEX idx (x) TYPE set(10) GRANULARITY 1) ENGINE = MergeTree ORDER BY tuple() SETTINGS min_bytes_for_wide_part = 0, prewarm_mark_cache = 0; INSERT INTO test_01344 VALUES ('Hello, world'); SET local_filesystem_read_method = 'mmap', min_bytes_to_use_mmap_io = 1; diff --git a/tests/queries/0_stateless/01472_obfuscator_uuid.sh b/tests/queries/0_stateless/01472_obfuscator_uuid.sh index eae9c1e3081..4067892aa37 100755 --- a/tests/queries/0_stateless/01472_obfuscator_uuid.sh +++ b/tests/queries/0_stateless/01472_obfuscator_uuid.sh @@ -9,8 +9,11 @@ $CLICKHOUSE_CLIENT --query="CREATE TABLE t_uuid(Id UUID) ENGINE=MergeTree ORDER $CLICKHOUSE_CLIENT --query="INSERT INTO t_uuid VALUES ('3f5ffba3-19ff-4f3d-8861-60ae6e1fc1aa'),('4bd62524-e33c-43e5-882d-f1d96cf5561e'),('7a8b45d2-c18b-4e8c-89eb-abf5bee88931'),('45bb7333-965b-4526-870e-4f941edb025b'),('a4e72d0e-f9fa-465e-8d9d-151b9ced94df'),('cb5818ab-83b5-48a8-94b0-5177e30176d9'),('701e8006-fc9f-4496-80ba-efa6817b917b'),('e0936acf-6e8f-42aa-8f56-d1363476eece'),('239bb790-5293-40df-92ae-472294b6e178'),('508d0e80-729f-4e3b-9336-4c5c8792f6be'),('94abef70-f2d6-4f7b-ad60-3889409f1dac'),('b6f1ec08-8473-4fa2-b134-73db040b0d82'),('7e54dcae-0bb4-4c4f-a636-54a705fb8b40'),('d1d258c2-a35f-4c00-abfa-8addbcbc5471'),('7c74fbd8-bf79-46ee-adfe-96271040a4f7'),('41e3a274-eea9-41d8-a128-de5a6658fcfd'),('a72dc048-f72f-470e-b0f9-60cfad6e1157'),('40634f4f-37bf-44e4-ac7c-6f024ad19990')" $CLICKHOUSE_CLIENT --query="SELECT Id FROM t_uuid ORDER BY (Id) FORMAT TSV" > "${CLICKHOUSE_TMP}"/data.tsv -echo FROM RAW DATA && cat "${CLICKHOUSE_TMP}"/data.tsv -echo TRANSFORMED TO && $CLICKHOUSE_OBFUSCATOR --structure "Id UUID" --input-format TSV --output-format TSV --seed dsrub < "${CLICKHOUSE_TMP}"/data.tsv 2>/dev/null +echo FROM RAW DATA +cat "${CLICKHOUSE_TMP}"/data.tsv + +echo TRANSFORMED TO +$CLICKHOUSE_OBFUSCATOR --silent 1 --structure "Id UUID" --input-format TSV --output-format TSV --seed dsrub < "${CLICKHOUSE_TMP}"/data.tsv $CLICKHOUSE_CLIENT --query="DROP TABLE t_uuid" rm "${CLICKHOUSE_TMP}"/data.tsv diff --git a/tests/queries/0_stateless/01606_git_import.sh b/tests/queries/0_stateless/01606_git_import.sh index 6986d6b14cf..d0ca3ecc1cb 100755 --- a/tests/queries/0_stateless/01606_git_import.sh +++ b/tests/queries/0_stateless/01606_git_import.sh @@ -17,7 +17,7 @@ for _ in {1..10}; do sleep 1 done -${CLICKHOUSE_GIT_IMPORT} 2>&1 | wc -l +${CLICKHOUSE_GIT_IMPORT} |& wc -l ${CLICKHOUSE_CLIENT} --multiline --query " diff --git a/tests/queries/0_stateless/01683_text_log_deadlock.sh b/tests/queries/0_stateless/01683_text_log_deadlock.sh index 6b3bcc58868..2d358a85684 100755 --- a/tests/queries/0_stateless/01683_text_log_deadlock.sh +++ b/tests/queries/0_stateless/01683_text_log_deadlock.sh @@ -5,4 +5,4 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CURDIR"/../shell_config.sh -$CLICKHOUSE_BENCHMARK --secure -i 5000 -c 32 --query 'SELECT 1' 2>&1 | grep -oF 'queries: 5000' +$CLICKHOUSE_BENCHMARK --secure -i 5000 -c 32 --query 'SELECT 1' |& grep -oF 'queries: 5000' diff --git a/tests/queries/0_stateless/02293_http_header_full_summary_without_progress.sh b/tests/queries/0_stateless/02293_http_header_full_summary_without_progress.sh index 0d8a568fef0..5faeb271bc8 100755 --- a/tests/queries/0_stateless/02293_http_header_full_summary_without_progress.sh +++ b/tests/queries/0_stateless/02293_http_header_full_summary_without_progress.sh @@ -16,7 +16,7 @@ for _ in {1..10}; do done CURL_OUTPUT=$(echo 'SELECT 1 + sleepEachRow(0.00002) FROM numbers(100000)' | \ - ${CLICKHOUSE_CURL_COMMAND} --max-time 3 -vsS "${CLICKHOUSE_URL}&wait_end_of_query=1&send_progress_in_http_headers=0&max_execution_time=1" --data-binary @- 2>&1) + ${CLICKHOUSE_CURL_COMMAND} --max-time 10 -vsS "${CLICKHOUSE_URL}&wait_end_of_query=1&send_progress_in_http_headers=0&max_execution_time=1" --data-binary @- 2>&1) READ_ROWS=$(echo "${CURL_OUTPUT}" | \ grep 'X-ClickHouse-Summary' | \ diff --git a/tests/queries/0_stateless/02340_parts_refcnt_mergetree.sh b/tests/queries/0_stateless/02340_parts_refcnt_mergetree.sh index f252b9304cd..ad25dacc1cf 100755 --- a/tests/queries/0_stateless/02340_parts_refcnt_mergetree.sh +++ b/tests/queries/0_stateless/02340_parts_refcnt_mergetree.sh @@ -60,7 +60,7 @@ function check_refcnt_for_table() # Kill the query gracefully. kill -INT $PID wait $PID - grep -F Exception "$log_file" | grep -v -F QUERY_WAS_CANCELLED + grep -F Exception "$log_file" | grep -v -F QUERY_WAS_CANCELLED_BY_CLIENT rm -f "${log_file:?}" } diff --git a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh index dcd83f9fec3..774a0bd5f4e 100755 --- a/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh +++ b/tests/queries/0_stateless/02700_s3_part_INT_MAX.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Tags: no-parallel, long +# Tags: no-parallel, long, no-fasttest CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh @@ -15,7 +15,8 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) $CLICKHOUSE_CLIENT --max_memory_usage 16G -m -q " INSERT INTO FUNCTION s3('http://localhost:11111/test/$CLICKHOUSE_DATABASE/test_INT_MAX.tsv', '', '', 'TSV') SELECT repeat('a', 1024) FROM numbers((pow(2, 30) * 2) / 1024) - SETTINGS s3_max_single_part_upload_size = '5Gi'; + SETTINGS s3_max_single_part_upload_size = '5Gi', s3_retry_attempts=5; - SELECT count() FROM s3('http://localhost:11111/test/$CLICKHOUSE_DATABASE/test_INT_MAX.tsv'); + SELECT count() FROM s3('http://localhost:11111/test/$CLICKHOUSE_DATABASE/test_INT_MAX.tsv') + SETTINGS s3_retry_attempts=5; " diff --git a/tests/queries/0_stateless/02725_url_support_virtual_column.sql b/tests/queries/0_stateless/02725_url_support_virtual_column.sql index 02a4dfc449b..5ba4e45dfa5 100644 --- a/tests/queries/0_stateless/02725_url_support_virtual_column.sql +++ b/tests/queries/0_stateless/02725_url_support_virtual_column.sql @@ -5,4 +5,3 @@ select _file from url('http://127.0.0.1:8123/?query=select+1&user=default', Line select _file, count() from url('http://127.0.0.1:8123/?query=select+1&user=default', LineAsString, 's String') group by _file; select _path, _file, s from url('http://127.0.0.1:8123/?query=select+1&user=default', LineAsString, 's String'); select _path, _file, s from url('http://127.0.0.1:8123/?query=select+1&user=default&password=wrong', LineAsString, 's String'); -- { serverError RECEIVED_ERROR_FROM_REMOTE_IO_SERVER } - diff --git a/tests/queries/0_stateless/02796_calculate_text_stack_trace.reference b/tests/queries/0_stateless/02796_calculate_text_stack_trace.reference index c800bbce32b..d9ff83f1949 100644 --- a/tests/queries/0_stateless/02796_calculate_text_stack_trace.reference +++ b/tests/queries/0_stateless/02796_calculate_text_stack_trace.reference @@ -1,6 +1,4 @@ 1 1 -1 -0 0 0 diff --git a/tests/queries/0_stateless/02809_storage_set_analysis_bug.sql b/tests/queries/0_stateless/02809_storage_set_analysis_bug.sql index 531946acda0..f71494673f2 100644 --- a/tests/queries/0_stateless/02809_storage_set_analysis_bug.sql +++ b/tests/queries/0_stateless/02809_storage_set_analysis_bug.sql @@ -4,7 +4,7 @@ DROP TABLE IF EXISTS null_in__fuzz_6; set allow_suspicious_low_cardinality_types = 1; CREATE TABLE null_in__fuzz_6 (`dt` LowCardinality(UInt16), `idx` Int32, `i` Nullable(Int256), `s` Int32) ENGINE = MergeTree PARTITION BY dt ORDER BY idx; -insert into null_in__fuzz_6 select * from generateRandom() limit 1; +insert into null_in__fuzz_6 select * from generateRandom() where i is not null limit 1; SET transform_null_in = 0; diff --git a/tests/queries/0_stateless/02841_valid_json_and_xml_on_http_exception.sh b/tests/queries/0_stateless/02841_valid_json_and_xml_on_http_exception.sh index 3dda63e1e49..8c7bc8d52d5 100755 --- a/tests/queries/0_stateless/02841_valid_json_and_xml_on_http_exception.sh +++ b/tests/queries/0_stateless/02841_valid_json_and_xml_on_http_exception.sh @@ -4,111 +4,113 @@ CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # shellcheck source=../shell_config.sh . "$CUR_DIR"/../shell_config.sh + CH_URL_BASE="$CLICKHOUSE_URL&http_write_exception_in_output_format=1&enable_analyzer=0" + for wait_end_of_query in 0 1 do -echo "wait_end_of_query=$wait_end_of_query" -CH_URL="$CH_URL_BASE&wait_end_of_query=$wait_end_of_query" + echo "wait_end_of_query=$wait_end_of_query" + CH_URL="$CH_URL_BASE&wait_end_of_query=$wait_end_of_query" -echo "One block" -for parallel in 0 1 -do - echo "Parallel formatting: $parallel" + echo "One block" + for parallel in 0 1 + do + echo "Parallel formatting: $parallel" + for format in JSON JSONEachRow JSONCompact JSONCompactEachRow JSONObjectEachRow XML + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from numbers(10) format $format settings output_format_parallel_formatting=$parallel" | sed "s/(version .*)//" | sed "s/DB::Exception//" + done + done + + echo "Several blocks" + echo "Without parallel formatting" for format in JSON JSONEachRow JSONCompact JSONCompactEachRow JSONObjectEachRow XML do echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from numbers(10) format $format settings output_format_parallel_formatting=$parallel" | sed "s/(version .*)//" | sed "s/DB::Exception//" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=0" | sed "s/(version .*)//" | sed "s/DB::Exception//" done -done -echo "Several blocks" -echo "Without parallel formatting" -for format in JSON JSONEachRow JSONCompact JSONCompactEachRow JSONObjectEachRow XML -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=0" | sed "s/(version .*)//" | sed "s/DB::Exception//" -done + echo "With parallel formatting" + for format in JSON JSONCompact JSONObjectEachRow + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + done -echo "With parallel formatting" -for format in JSON JSONCompact JSONObjectEachRow -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -done + for format in JSONEachRow JSONCompactEachRow + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=LineAsString -q "select min(isValidJSON(line)) from table" + done -for format in JSONEachRow JSONCompactEachRow -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select number, throwIf(number > 3) as res from system.numbers format $format settings max_block_size=1, output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=LineAsString -q "select min(isValidJSON(line)) from table" -done + echo "Formatting error" + $CLICKHOUSE_CLIENT -q "drop table if exists test_02841" + $CLICKHOUSE_CLIENT -q "create table test_02841 (x UInt32, s String, y Enum('a' = 1)) engine=MergeTree order by x" + $CLICKHOUSE_CLIENT -q "system stop merges test_02841" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str3', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (5, 'str5', 99)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (6, 'str6', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (7, 'str7', 1)" -echo "Formatting error" -$CLICKHOUSE_CLIENT -q "drop table if exists test_02841" -$CLICKHOUSE_CLIENT -q "create table test_02841 (x UInt32, s String, y Enum('a' = 1)) engine=MergeTree order by x" -$CLICKHOUSE_CLIENT -q "system stop merges test_02841" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str3', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (5, 'str5', 99)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (6, 'str6', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (7, 'str7', 1)" + echo "Without parallel formatting" + for format in JSON JSONEachRow JSONCompact JSONCompactEachRow JSONObjectEachRow XML + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 order by x format $format settings output_format_parallel_formatting=0" | sed "s/(version .*)//" | sed "s/DB::Exception//" + done -echo "Without parallel formatting" -for format in JSON JSONEachRow JSONCompact JSONCompactEachRow JSONObjectEachRow XML -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 order by x format $format settings output_format_parallel_formatting=0" | sed "s/(version .*)//" | sed "s/DB::Exception//" -done + echo "With parallel formatting" + for format in JSON JSONCompact JSONObjectEachRow + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format $format settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + done -echo "With parallel formatting" -for format in JSON JSONCompact JSONObjectEachRow -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format $format settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -done - -for format in JSONEachRow JSONCompactEachRow -do - echo $format - ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format $format settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=LineAsString -q "select min(isValidJSON(line)) from table" -done + for format in JSONEachRow JSONCompactEachRow + do + echo $format + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format $format settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=LineAsString -q "select min(isValidJSON(line)) from table" + done -echo "Test 1" -$CLICKHOUSE_CLIENT -q "truncate table test_02841" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select 1, repeat('aaaaa', 1000000), 1" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select 2, repeat('aaaaa', 1000000), 99" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select 3, repeat('aaaaa', 1000000), 1" + echo "Test 1" + $CLICKHOUSE_CLIENT -q "truncate table test_02841" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select 1, repeat('aaaaa', 1000000), 1" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select 2, repeat('aaaaa', 1000000), 99" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select 3, repeat('aaaaa', 1000000), 1" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -echo "Test 2" -$CLICKHOUSE_CLIENT -q "truncate table test_02841" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_1', 1 from numbers(10000)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str4', 99)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (4, 'str5', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_2', 1 from numbers(10000)" + echo "Test 2" + $CLICKHOUSE_CLIENT -q "truncate table test_02841" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_1', 1 from numbers(10000)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str4', 99)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (4, 'str5', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_2', 1 from numbers(10000)" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -echo "Test 3" -$CLICKHOUSE_CLIENT -q "truncate table test_02841" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_1', number > 9000 ? 99 : 1 from numbers(10000)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str4', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 values (4, 'str5', 1)" -$CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_2', 1 from numbers(10000)" + echo "Test 3" + $CLICKHOUSE_CLIENT -q "truncate table test_02841" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (1, 'str1', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (2, 'str2', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_1', number > 9000 ? 99 : 1 from numbers(10000)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (3, 'str4', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 values (4, 'str5', 1)" + $CLICKHOUSE_CLIENT -q "insert into test_02841 select number, 'str_numbers_2', 1 from numbers(10000)" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=0" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" + ${CLICKHOUSE_CURL} -sS "$CH_URL" -d "select * from test_02841 format JSON settings output_format_parallel_formatting=1" | $CLICKHOUSE_LOCAL --input-format=JSONAsString -q "select isValidJSON(json) from table" -$CLICKHOUSE_CLIENT -q "drop table test_02841" + $CLICKHOUSE_CLIENT -q "drop table test_02841" done diff --git a/tests/queries/0_stateless/02899_use_default_format_on_http_exception.sh b/tests/queries/0_stateless/02899_use_default_format_on_http_exception.sh index 5e91fa13e91..337f813570c 100755 --- a/tests/queries/0_stateless/02899_use_default_format_on_http_exception.sh +++ b/tests/queries/0_stateless/02899_use_default_format_on_http_exception.sh @@ -8,42 +8,42 @@ CH_URL="$CLICKHOUSE_URL&http_write_exception_in_output_format=1" echo "SELECT missing column WITH default_format=JSON" echo "SELECT x FROM system.numbers LIMIT 1;"\ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=JSON" -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=JSON" -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH default_format=JSON" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=JSON" -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=JSON" -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH default_format=XML" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=XML" -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=XML" -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH default_format=BADFORMAT" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=BADFORMAT" -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}&default_format=BADFORMAT" -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "SELECT missing column WITH X-ClickHouse-Format: JSON" echo "SELECT x FROM system.numbers LIMIT 1;"\ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: JSON' -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: JSON' -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH X-ClickHouse-Format: JSON" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: JSON' -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: JSON' -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH X-ClickHouse-Format: XML" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: XML' -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: XML' -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' echo "" echo "INSERT WITH X-ClickHouse-Format: BADFORMAT" echo "INSERT INTO system.numbers Select * from numbers(10);" \ - | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: BADFORMAT' -i --data-binary @- \ + | ${CLICKHOUSE_CURL} -sS "${CH_URL}" -H 'X-ClickHouse-Format: BADFORMAT' -i --data-binary @- 2>/dev/null \ | grep 'HTTP/1.1\|xception\|Content-Type' | sed 's/Exception/Ex---tion/;s/HTTP\/1.1//;s/\r//' | awk '{ print $1 $2 $3 }' diff --git a/tests/queries/0_stateless/03141_fetches_errors_stress.reference b/tests/queries/0_stateless/03141_fetches_errors_stress.reference index 1622c057f27..8c8ddca60f7 100644 --- a/tests/queries/0_stateless/03141_fetches_errors_stress.reference +++ b/tests/queries/0_stateless/03141_fetches_errors_stress.reference @@ -1,5 +1,11 @@ -- { echoOn } -select table, errorCodeToName(error), count() from system.part_log where database = currentDatabase() and error > 0 and errorCodeToName(error) not in ('FAULT_INJECTED', 'NO_REPLICA_HAS_PART', 'ATTEMPT_TO_READ_AFTER_EOF') group by 1, 2 order by 1, 2; +select table, errorCodeToName(error), count() from system.part_log where + database = currentDatabase() + and error > 0 + and errorCodeToName(error) not in ('FAULT_INJECTED', 'NO_REPLICA_HAS_PART', 'ATTEMPT_TO_READ_AFTER_EOF') + and (errorCodeToName(error) != 'POCO_EXCEPTION' or exception not like '%Malformed message: Unexpected EOF%') + group by 1, 2 + order by 1, 2; select count() from data_r1; 100000 select count() from data_r2; diff --git a/tests/queries/0_stateless/03141_fetches_errors_stress.sql b/tests/queries/0_stateless/03141_fetches_errors_stress.sql index 69829a44b58..0528ab5ba6a 100644 --- a/tests/queries/0_stateless/03141_fetches_errors_stress.sql +++ b/tests/queries/0_stateless/03141_fetches_errors_stress.sql @@ -15,6 +15,13 @@ SET max_rows_to_read = 0; -- system.text_log can be really big select event_time_microseconds, logger_name, message from system.text_log where level = 'Error' and message like '%Malformed chunked encoding%' order by 1 format LineAsString; -- { echoOn } -select table, errorCodeToName(error), count() from system.part_log where database = currentDatabase() and error > 0 and errorCodeToName(error) not in ('FAULT_INJECTED', 'NO_REPLICA_HAS_PART', 'ATTEMPT_TO_READ_AFTER_EOF') group by 1, 2 order by 1, 2; +select table, errorCodeToName(error), count() from system.part_log where + database = currentDatabase() + and error > 0 + and errorCodeToName(error) not in ('FAULT_INJECTED', 'NO_REPLICA_HAS_PART', 'ATTEMPT_TO_READ_AFTER_EOF') + and (errorCodeToName(error) != 'POCO_EXCEPTION' or exception not like '%Malformed message: Unexpected EOF%') + group by 1, 2 + order by 1, 2; + select count() from data_r1; select count() from data_r2; diff --git a/tests/queries/0_stateless/03203_system_query_metric_log.sh b/tests/queries/0_stateless/03203_system_query_metric_log.sh index abcd14c8e5d..d8ae078fd5e 100755 --- a/tests/queries/0_stateless/03203_system_query_metric_log.sh +++ b/tests/queries/0_stateless/03203_system_query_metric_log.sh @@ -32,23 +32,31 @@ function check_log() # We calculate the diff of each row with its previous row to check whether the intervals at # which data is collected is right. The first row is always skipped because the diff with the # preceding one (itself) is 0. The last row is also skipped, because it doesn't contain a full - # interval. + # interval. We leave at least 20% of margin for many rows and at most 40% for one single row. $CLICKHOUSE_CLIENT --max_threads=1 -m -q """ SELECT '--Interval $interval: check that the delta/diff between the events is correct'; - WITH diff AS ( - SELECT - row_number() OVER () AS row, - count() OVER () as total_rows, - event_time_microseconds, - first_value(event_time_microseconds) OVER (ORDER BY event_time_microseconds ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) as prev, - dateDiff('ms', prev, event_time_microseconds) AS diff - FROM system.query_metric_log - WHERE event_date >= yesterday() AND query_id = '${query_prefix}_${interval}' - ORDER BY event_time_microseconds - OFFSET 1 + WITH + (SELECT count() - 2 FROM system.query_metric_log WHERE event_date >= yesterday() AND query_id = '${query_prefix}_${interval}') as diff_rows, + (20 + 20 / diff_rows)/100 AS margin + SELECT + avg(diff) BETWEEN (1 - margin) * $interval AND (1 + margin) * $interval + FROM ( + WITH diff AS ( + SELECT + row_number() OVER () AS row, + count() OVER () as total_rows, + event_time_microseconds, + first_value(event_time_microseconds) OVER (ORDER BY event_time_microseconds ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING) as prev, + dateDiff('ms', prev, event_time_microseconds) AS diff + FROM system.query_metric_log + WHERE event_date >= yesterday() AND query_id = '${query_prefix}_${interval}' + ORDER BY event_time_microseconds + OFFSET 1 + ) + SELECT avg(diff) AS diff + FROM diff + WHERE row < total_rows ) - SELECT avg(diff) BETWEEN $interval * 0.8 AND $interval * 1.2 - FROM diff WHERE row < total_rows """ # Check that the first event contains information from the beginning of the query. diff --git a/tests/queries/0_stateless/03234_check_grant.reference b/tests/queries/0_stateless/03234_check_grant.reference new file mode 100644 index 00000000000..23dfd352361 --- /dev/null +++ b/tests/queries/0_stateless/03234_check_grant.reference @@ -0,0 +1,6 @@ +1 +1 +0 +1 +1 +1 diff --git a/tests/queries/0_stateless/03234_check_grant.sh b/tests/queries/0_stateless/03234_check_grant.sh new file mode 100755 index 00000000000..d697cdc7c90 --- /dev/null +++ b/tests/queries/0_stateless/03234_check_grant.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Tags: no-parallel +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh +db=${CLICKHOUSE_DATABASE} + +${CLICKHOUSE_CLIENT} --query "DROP USER IF EXISTS user_03234; DROP TABLE IF EXISTS ${db}.tb;CREATE USER user_03234; GRANT SELECT ON ${db}.tb TO user_03234;" + +# Has been granted but not table not exists +# expected to 1 +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tb" + +${CLICKHOUSE_CLIENT} --query "CREATE TABLE ${db}.tb (\`content\` UInt64) ENGINE = MergeTree ORDER BY content; INSERT INTO ${db}.tb VALUES (1);" +# Has been granted and table exists +# expected to 1 +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tb" + +${CLICKHOUSE_CLIENT} --query "REVOKE SELECT ON ${db}.tb FROM user_03234;" +# Has not been granted but table exists +# expected to 0 +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tb" + +# Role +# expected to 1 +${CLICKHOUSE_CLIENT} --query "DROP ROLE IF EXISTS role_03234;CREATE ROLE role_03234;GRANT SELECT ON ${db}.tb TO role_03234;GRANT role_03234 TO user_03234" +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "SET ROLE role_03234" +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tb" + +# wildcard +${CLICKHOUSE_CLIENT} --query "GRANT SELECT ON ${db}.tbb* TO user_03234;" +# expected to 1 +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tbb1" +# expected to 1 +${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=user_03234" --data-binary "CHECK GRANT SELECT ON ${db}.tbb2*" diff --git a/tests/queries/0_stateless/03259_grouping_sets_aliases.reference b/tests/queries/0_stateless/03259_grouping_sets_aliases.reference new file mode 100644 index 00000000000..80711029676 --- /dev/null +++ b/tests/queries/0_stateless/03259_grouping_sets_aliases.reference @@ -0,0 +1,2 @@ +LOW 2 0 +HIGH 1 0 diff --git a/tests/queries/0_stateless/03259_grouping_sets_aliases.sql b/tests/queries/0_stateless/03259_grouping_sets_aliases.sql new file mode 100644 index 00000000000..80ab800865f --- /dev/null +++ b/tests/queries/0_stateless/03259_grouping_sets_aliases.sql @@ -0,0 +1,9 @@ +DROP TABLE IF EXISTS users; +CREATE TABLE users (name String, score UInt8, user_level String ALIAS multiIf(score <= 3, 'LOW', score <= 6, 'MEDIUM', 'HIGH') ) ENGINE=MergeTree ORDER BY name; + +INSERT INTO users VALUES ('a',1),('b',2),('c', 50); + +SELECT user_level as level_alias, uniq(name) as name_alias, grouping(level_alias) as _totals +FROM remote('127.0.0.{1,2}', currentDatabase(), users) +GROUP BY GROUPING SETS ((level_alias)) +ORDER BY name_alias DESC; diff --git a/tests/queries/0_stateless/03270_fix_column_modifier_write_order.reference b/tests/queries/0_stateless/03270_fix_column_modifier_write_order.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/03270_fix_column_modifier_write_order.sql b/tests/queries/0_stateless/03270_fix_column_modifier_write_order.sql new file mode 100644 index 00000000000..cf3683df85d --- /dev/null +++ b/tests/queries/0_stateless/03270_fix_column_modifier_write_order.sql @@ -0,0 +1,5 @@ +drop table if exists t1; +SET allow_experimental_statistics = 1; +create table t1 (d Datetime, c0 Int TTL d + INTERVAL 1 MONTH SETTINGS (max_compress_block_size = 1), c2 Int STATISTICS(Uniq) SETTINGS (max_compress_block_size = 1)) Engine = MergeTree() ORDER BY (); +insert into t1 values ('2024-11-15 18:30:00', 25, 20); + diff --git a/tests/queries/0_stateless/03272_bitmapTransform_error_counter.reference b/tests/queries/0_stateless/03272_bitmapTransform_error_counter.reference new file mode 100644 index 00000000000..d00491fd7e5 --- /dev/null +++ b/tests/queries/0_stateless/03272_bitmapTransform_error_counter.reference @@ -0,0 +1 @@ +1 diff --git a/tests/queries/0_stateless/03272_bitmapTransform_error_counter.sql b/tests/queries/0_stateless/03272_bitmapTransform_error_counter.sql new file mode 100644 index 00000000000..843c837b451 --- /dev/null +++ b/tests/queries/0_stateless/03272_bitmapTransform_error_counter.sql @@ -0,0 +1,11 @@ +-- Tags: no-parallel + +CREATE TABLE counters (value UInt64) ENGINE = MergeTree() ORDER BY value; + +INSERT INTO counters SELECT sum(value) FROM system.errors WHERE name = 'ILLEGAL_TYPE_OF_ARGUMENT'; + +SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res FORMAT Null; + +INSERT INTO counters SELECT sum(value) FROM system.errors WHERE name = 'ILLEGAL_TYPE_OF_ARGUMENT'; + +SELECT (max(value) - min(value)) == 0 FROM counters; diff --git a/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.reference b/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.reference new file mode 100644 index 00000000000..cbb68477a29 --- /dev/null +++ b/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.reference @@ -0,0 +1,11 @@ +1 +2 +Expression + ReadFromMergeTree + Indexes: + PrimaryKey + Keys: + dateTrunc(\'hour\', ts) + Condition: and((dateTrunc(\'hour\', ts) in (-Inf, 1731592800]), (dateTrunc(\'hour\', ts) in [1731506400, +Inf))) + Parts: 1/1 + Granules: 1/1 diff --git a/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.sql b/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.sql new file mode 100644 index 00000000000..b69b7b8a754 --- /dev/null +++ b/tests/queries/0_stateless/03272_partition_pruning_monotonic_func_bug.sql @@ -0,0 +1,19 @@ +SET session_timezone = 'Etc/UTC'; + +DROP TABLE IF EXISTS tt; +CREATE TABLE tt +( + `id` Int64, + `ts` DateTime +) +ENGINE = MergeTree() +ORDER BY dateTrunc('hour', ts) +SETTINGS index_granularity = 8192; + +INSERT INTO tt VALUES (1, '2024-11-14 00:00:00'), (2, '2024-11-14 00:00:00'); + +SELECT id FROM tt PREWHERE ts BETWEEN toDateTime(1731506400) AND toDateTime(1731594420); + +explain indexes=1, description=0 SELECT id FROM tt PREWHERE ts BETWEEN toDateTime(1731506400) AND toDateTime(1731594420); + +DROP TABLE tt; diff --git a/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.reference b/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.reference new file mode 100644 index 00000000000..5c24192f597 --- /dev/null +++ b/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.reference @@ -0,0 +1,3 @@ +1 0 +2 2 +0 diff --git a/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.sql b/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.sql new file mode 100644 index 00000000000..84059c3e23c --- /dev/null +++ b/tests/queries/0_stateless/03272_prewarm_mark_cache_add_column.sql @@ -0,0 +1,25 @@ +DROP TABLE IF EXISTS t_prewarm_add_column; + +CREATE TABLE t_prewarm_add_column (a UInt64) +ENGINE = MergeTree ORDER BY a +SETTINGS prewarm_mark_cache = 1, min_bytes_for_wide_part = 0; + +SYSTEM STOP MERGES t_prewarm_add_column; + +INSERT INTO t_prewarm_add_column VALUES (1); + +ALTER TABLE t_prewarm_add_column ADD COLUMN b UInt64; + +INSERT INTO t_prewarm_add_column VALUES (2, 2); + +DETACH TABLE t_prewarm_add_column; +ATTACH TABLE t_prewarm_add_column; + +SELECT * FROM t_prewarm_add_column ORDER BY a; +SYSTEM FLUSH LOGS; + +SELECT ProfileEvents['LoadedMarksCount'] FROM system.query_log +WHERE current_database = currentDatabase() AND type = 'QueryFinish' AND query LIKE 'SELECT * FROM t_prewarm_add_column%' +ORDER BY event_time_microseconds; + +DROP TABLE t_prewarm_add_column; diff --git a/tests/queries/0_stateless/03199_dictionary_table_access.reference b/tests/queries/0_stateless/03273_dictionary_rbac.reference similarity index 50% rename from tests/queries/0_stateless/03199_dictionary_table_access.reference rename to tests/queries/0_stateless/03273_dictionary_rbac.reference index 4a703b3be84..f7ff98213ba 100644 --- a/tests/queries/0_stateless/03199_dictionary_table_access.reference +++ b/tests/queries/0_stateless/03273_dictionary_rbac.reference @@ -1,2 +1,4 @@ -ACCESS_DENIED +Ok. +Ok. +Ok. ACCESS_DENIED diff --git a/tests/queries/0_stateless/03199_dictionary_table_access.sh b/tests/queries/0_stateless/03273_dictionary_rbac.sh similarity index 53% rename from tests/queries/0_stateless/03199_dictionary_table_access.sh rename to tests/queries/0_stateless/03273_dictionary_rbac.sh index 14f017c7fbc..d74039b4d61 100755 --- a/tests/queries/0_stateless/03199_dictionary_table_access.sh +++ b/tests/queries/0_stateless/03273_dictionary_rbac.sh @@ -8,7 +8,8 @@ username="user_${CLICKHOUSE_TEST_UNIQUE_NAME}" dictname="dict_${CLICKHOUSE_TEST_UNIQUE_NAME}" dicttablename="dict_table_${CLICKHOUSE_TEST_UNIQUE_NAME}" -${CLICKHOUSE_CLIENT} -m --query " +# Create a dictionary and a table that points to the dictionary. +${CLICKHOUSE_CLIENT} -nm --query " CREATE DICTIONARY IF NOT EXISTS ${dictname} ( id UInt64, @@ -18,23 +19,37 @@ ${CLICKHOUSE_CLIENT} -m --query " SOURCE(NULL()) LAYOUT(FLAT()) LIFETIME(MIN 0 MAX 1000); - CREATE USER IF NOT EXISTS ${username} NOT IDENTIFIED; - GRANT SELECT, CREATE TEMPORARY TABLE ON *.* to ${username}; - SELECT * FROM ${dictname}; CREATE TABLE ${dicttablename} (id UInt64, value UInt64) ENGINE = Dictionary(${CLICKHOUSE_DATABASE}.${dictname}); - SELECT * FROM ${dicttablename}; " -$CLICKHOUSE_CLIENT -m --user="${username}" --query " +# Create a user, assign only a few permissions. +${CLICKHOUSE_CLIENT} -nm --query " + CREATE USER IF NOT EXISTS ${username} NOT IDENTIFIED; + GRANT SELECT, CREATE TEMPORARY TABLE ON *.* to ${username}; +" + +# Reading from dictionary via direct SELECT is Ok. +$CLICKHOUSE_CLIENT -nm --user="${username}" --query " SELECT * FROM ${dictname}; -" 2>&1 | grep -o ACCESS_DENIED | uniq +" >/dev/null 2>&1 && echo "Ok." -$CLICKHOUSE_CLIENT -m --user="${username}" --query " +# Reading from dictionary via dictionary storage is Ok. +$CLICKHOUSE_CLIENT -nm --user="${username}" --query " SELECT * FROM ${dicttablename}; +" >/dev/null 2>&1 && echo "Ok." + +# Reading from dictionary via dictionary table function is Ok. +$CLICKHOUSE_CLIENT -nm --user="${username}" --query " + SELECT * FROM dictionary(${dictname}); +" >/dev/null 2>&1 && echo "Ok." + +# Function dictGet requires a permission dictGet to use. +$CLICKHOUSE_CLIENT -nm --user="${username}" --query " + SELECT dictGet(${dictname}, 'value', 1); " 2>&1 | grep -o ACCESS_DENIED | uniq -${CLICKHOUSE_CLIENT} -m --query " +${CLICKHOUSE_CLIENT} -nm --query " DROP TABLE IF EXISTS ${dicttablename} SYNC; DROP DICTIONARY IF EXISTS ${dictname}; DROP USER IF EXISTS ${username}; diff --git a/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.reference b/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.reference new file mode 100644 index 00000000000..95dcf3f77b3 --- /dev/null +++ b/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.reference @@ -0,0 +1,2 @@ +Order: a ASC, b ASC +ReadType: InOrder diff --git a/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.sql b/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.sql new file mode 100644 index 00000000000..d4585ea548d --- /dev/null +++ b/tests/queries/0_stateless/03273_group_by_in_order_still_used_when_group_by_key_doesnt_match_order_by_key.sql @@ -0,0 +1,24 @@ +CREATE TABLE test +( + a UInt64, + b UInt64 +) +ENGINE = MergeTree +ORDER BY (a, b); + +INSERT INTO test SELECT number, number FROM numbers_mt(1e6); + +set enable_analyzer = 1; + +SELECT trimBoth(replaceRegexpAll(explain, '__table1.', '')) +FROM +( + EXPLAIN actions = 1 + SELECT count(*) + FROM test + GROUP BY + b, + a + SETTINGS optimize_aggregation_in_order = 1 +) +WHERE explain LIKE '%Order%'; diff --git a/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.reference b/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.reference new file mode 100644 index 00000000000..83830f7b448 --- /dev/null +++ b/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.reference @@ -0,0 +1,11 @@ +SelectWithUnionQuery (children 1) + ExpressionList (children 1) + SelectQuery (children 2) + ExpressionList (children 1) + Asterisk + TablesInSelectQuery (children 1) + TablesInSelectQueryElement (children 1) + TableExpression (children 1) + Function numbers (children 1) + ExpressionList (children 1) + Literal UInt64_10 diff --git a/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.sql b/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.sql new file mode 100644 index 00000000000..7298186414b --- /dev/null +++ b/tests/queries/0_stateless/03273_select_from_explain_ast_non_select.sql @@ -0,0 +1,5 @@ +SELECT * FROM ( EXPLAIN AST SELECT * FROM numbers(10) ); +SELECT * FROM ( EXPLAIN AST CREATE TABLE test ENGINE=Memory ); -- {clientError BAD_ARGUMENTS} +SELECT * FROM ( EXPLAIN AST CREATE MATERIALIZED VIEW mv (data String) AS SELECT data FROM table ); -- {clientError BAD_ARGUMENTS} +SELECT * FROM ( EXPLAIN AST INSERT INTO TABLE test VALUES); -- {clientError BAD_ARGUMENTS} +SELECT * FROM ( EXPLAIN AST ALTER TABLE test MODIFY COLUMN x UInt32 ); -- {clientError BAD_ARGUMENTS} diff --git a/tests/queries/shell_config.sh b/tests/queries/shell_config.sh index 9e5bf75d335..a4effe3e3e3 100644 --- a/tests/queries/shell_config.sh +++ b/tests/queries/shell_config.sh @@ -175,7 +175,7 @@ function random_str() tr -cd '[:lower:]' < /dev/urandom | head -c"$n" } -function query_with_retry +function query_with_retry() { local query="$1" && shift @@ -194,3 +194,20 @@ function query_with_retry done echo "Query '$query' failed with '$result'" } + +function run_with_error() +{ + local cmd="$1"; shift + + local stdout_tmp="" + stdout_tmp=$(mktemp -p ${CLICKHOUSE_TMP}) + local stderr_tmp="" + stderr_tmp=$(mktemp -p ${CLICKHOUSE_TMP}) + + local retval=0 + $cmd "$@" 1>${stdout_tmp} 2>${stderr_tmp} || retval="$?" + + echo "${retval}" "${stdout_tmp}" "${stderr_tmp}" + + return 0 +} diff --git a/utils/check-marks/main.cpp b/utils/check-marks/main.cpp index 8f05e98ebd5..28ce0121f79 100644 --- a/utils/check-marks/main.cpp +++ b/utils/check-marks/main.cpp @@ -48,6 +48,8 @@ static void checkByCompressedReadBuffer(const std::string & mrk_path, const std: out << ", decompressed size " << bin_in.available(); out << ".\n" << DB::flush; + + out.finalize(); } } diff --git a/utils/corrector_utf8/corrector_utf8.cpp b/utils/corrector_utf8/corrector_utf8.cpp index 078c4dca650..0bd4b66b560 100644 --- a/utils/corrector_utf8/corrector_utf8.cpp +++ b/utils/corrector_utf8/corrector_utf8.cpp @@ -10,7 +10,10 @@ int main(int, char **) using namespace DB; ReadBufferFromFileDescriptor rb(STDIN_FILENO); WriteBufferFromFileDescriptor wb(STDOUT_FILENO); - WriteBufferValidUTF8 utf8_b(wb); - copyData(rb, utf8_b); + { + WriteBufferValidUTF8 utf8_b(wb); + copyData(rb, utf8_b); + } + wb.finalize(); return 0; } diff --git a/utils/list-licenses/list-licenses.sh b/utils/list-licenses/list-licenses.sh index c06d61a9c43..101b7c9b18a 100755 --- a/utils/list-licenses/list-licenses.sh +++ b/utils/list-licenses/list-licenses.sh @@ -13,8 +13,8 @@ fi ROOT_PATH="$(git rev-parse --show-toplevel)" LIBS_PATH="${ROOT_PATH}/contrib" -mapfile -t libs < <(echo "${ROOT_PATH}/base/poco"; find "${LIBS_PATH}" -maxdepth 1 -type d -not -name '*-cmake' -not -name 'rust_vendor' | LC_ALL=C sort) -for LIB in "${libs[@]}" +libs=$(echo "${ROOT_PATH}/base/poco"; (find "${LIBS_PATH}" -maxdepth 1 -type d -not -name '*-cmake' -not -name 'rust_vendor' | LC_ALL=C sort) ) +for LIB in ${libs} do LIB_NAME=$(basename "$LIB") @@ -97,4 +97,4 @@ do done # Special care for Rust -find "${LIBS_PATH}/rust_vendor/" -name 'Cargo.toml' | xargs grep 'license = ' | (grep -v -P 'MIT|Apache|MPL' && echo "Fatal error: unrecognized licenses in the Rust code" >&2 && exit 1 || true) +find "${LIBS_PATH}/rust_vendor/" -name 'Cargo.toml' | xargs ${GREP_CMD} 'license = ' | (${GREP_CMD} -v -P 'MIT|Apache|MPL' && echo "Fatal error: unrecognized licenses in the Rust code" >&2 && exit 1 || true) diff --git a/utils/list-versions/version_date.tsv b/utils/list-versions/version_date.tsv index fab562a8cbb..f69c72163c2 100644 --- a/utils/list-versions/version_date.tsv +++ b/utils/list-versions/version_date.tsv @@ -1,6 +1,9 @@ +v24.10.2.80-stable 2024-11-18 v24.10.1.2812-stable 2024-11-01 +v24.9.3.128-stable 2024-11-18 v24.9.2.42-stable 2024-10-03 v24.9.1.3278-stable 2024-09-26 +v24.8.7.41-lts 2024-11-18 v24.8.6.70-lts 2024-11-04 v24.8.5.115-lts 2024-10-08 v24.8.4.13-lts 2024-09-06 @@ -31,6 +34,7 @@ v24.4.4.113-stable 2024-08-02 v24.4.3.25-stable 2024-06-14 v24.4.2.141-stable 2024-06-07 v24.4.1.2088-stable 2024-05-01 +v24.3.14.35-lts 2024-11-18 v24.3.13.40-lts 2024-11-07 v24.3.12.75-lts 2024-10-08 v24.3.11.7-lts 2024-09-06